diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/AUTHORS ns-3.44/AUTHORS
--- ns-3.43/AUTHORS	2024-10-09 16:41:09.752655300 -0700
+++ ns-3.44/AUTHORS	2025-03-09 16:55:49.223370600 -0700
@@ -25,6 +25,7 @@
 Mirko Banchi (mk.banchi@gmail.com)
 Peter D. Barnes, Jr. (barnes26@llnl.gov)
 Ramon Bauza (monbauza@gmail.com)
+Martin Belanger (martin.belanger@dell.com)
 Pedro Bellotti (pedro177@gmail.com)
 Mehdi Benamor (mehdi.benamor@telecom-bretagne.eu)
 Apoorva Bhargava (apoorvabhargava13@gmail.com)
@@ -48,6 +49,7 @@
 Junling Bu (linlinjavaer@gmail.com)
 Elena Buchatskaia (borovkovaes@iitp.ru)
 Alessio Bugetti (alessiobugetti98@gmail.com)
+Anna-Birgitta Burmeister (anna-birgitta.burmeister@student.hpi.de)
 Nuno Cardoso (nunopcardoso@gmail.com)
 Gustavo Carneiro (gjc@inescporto.pt, gjcarneiro@gmail.com)
 Scott Carpenter (scarpen@ncsu.edu)
@@ -71,6 +73,7 @@
 Luis Cortes (cortes@gatech.edu)
 Luca Costantino (luca.costantino@gmail.com)
 Matthieu Coudron (matthieu.coudron@lip6.fr)
+Michael R. Davis (mrdvt92@yahoo.com)
 Alexander D'souza (moijes12@gmail.com)
 Ankit Deepak (adadeepak8@gmail.com)
 Christophe Delahaye (christophe.delahaye@orange.com)
@@ -152,6 +155,7 @@
 Evgeny Kalishenko (ydginster@gmail.com)
 Raghuram Kannan (raghuramkannan40@gmail.com)
 Vignesh Kannan (vignesh2496@gmail.com)
+Nihar Kapasi (niharkkapasi@gmail.com)
 Ouassim Karrakchou (okarr102@uottawa.ca)
 Tanmay Kathpalia (tanmay.kathpalia@landisgyr.com)
 Konstantinos Katsaros (dinos.katsaros@gmail.com)
@@ -161,10 +165,12 @@
 Morteza Kheirkhah (m.kheirkhah@sussex.ac.uk)
 Jörg Christian Kirchhof (christian.kirchhof@rwth-aachen.de)
 Ohad Klausner
+Yohei Kojima (yk@y-koj.net)
 Wojtek Kosior (koszko@koszko.org)
 Katarina Koutlia (katerina.koutlia@cttc.es)
 Shravya Ks (shravya.ks0@gmail.com)
 Flavio Kubota (flaviokubota@gmail.com)
+Puneet Kumar (puneet23067@iiitd.ac.in)
 Manish Kumar B.(bmanish15597@gmail.com)
 Joe Kopena (tjkopena@cs.drexel.edu)
 Christopher Kosecki (christopher.l.kosecki.ctr@mail.mil)
@@ -300,6 +306,7 @@
 Surya Seetharaman (suryaseetharaman.9@gmail.com)
 Guillaume Seguin (guillaume.seguin@inria.fr)
 Ioannis Selinis (selinis.g@gmail.com)
+Yifan Fan Seu (yifan.fan.seu@gmail.com)
 Tomasz Seweryn (tomasz.seweryn7@gmail.com)
 Dmitrii Shakshin (d.shakshin@gmail.com)
 Kulin Shah (m.kulin@gmail.com)
@@ -369,3 +376,4 @@
 Parth Pratim (GCI 2018)
 ra1nst0rm3d (GCI 2019)
 SaiMyGuy (GCI 2019)
+Ryo Okuda (c611901200@tokushima-u.ac.jp)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/bindings/python/ns__init__.py ns-3.44/bindings/python/ns__init__.py
--- ns-3.43/bindings/python/ns__init__.py	2024-10-09 16:41:09.760655400 -0700
+++ ns-3.44/bindings/python/ns__init__.py	2025-03-09 16:55:49.231370400 -0700
@@ -115,7 +115,7 @@
             library_map[library_infix] = set()
 
         # Append the directory
-        library_map[library_infix].add(library)
+        library_map[library_infix].add(os.path.realpath(library))
 
     # Replace sets with lists
     for key, values in library_map.items():
@@ -251,10 +251,18 @@
             values["NS3_ENABLED_MODULES"] + values["NS3_ENABLED_CONTRIBUTED_MODULES"],
         )
     )
+
     prefix = values["out_dir"]
-    libraries = {
-        os.path.splitext(os.path.basename(x))[0]: x for x in os.listdir(os.path.join(prefix, "lib"))
-    }
+    path_to_lib = None
+    for variant in ["lib", "lib64"]:
+        path_candidate = os.path.join(prefix, variant)
+        if os.path.isdir(path_candidate):
+            path_to_lib = path_candidate
+            break
+    if path_to_lib is None:
+        raise Exception(f"Directory {prefix} does not contain subdirectory lib/ (nor lib64/).")
+    libraries = {os.path.splitext(os.path.basename(x))[0]: x for x in os.listdir(path_to_lib)}
+
     version = values["VERSION"]
 
     # Filter out test libraries and incorrect versions
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/build-support/3rd-party/colored-messages.cmake.license ns-3.44/build-support/3rd-party/colored-messages.cmake.license
--- ns-3.43/build-support/3rd-party/colored-messages.cmake.license	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/build-support/3rd-party/colored-messages.cmake.license	2025-03-09 16:55:49.231370400 -0700
@@ -0,0 +1,2 @@
+Copyright (c) 2013 Fraser Hutchison
+SPDX-License-Identifier: GPL-2.0-only
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/build-support/3rd-party/FindEigen3.cmake.license ns-3.44/build-support/3rd-party/FindEigen3.cmake.license
--- ns-3.43/build-support/3rd-party/FindEigen3.cmake.license	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/build-support/3rd-party/FindEigen3.cmake.license	2025-03-09 16:55:49.231370400 -0700
@@ -0,0 +1,4 @@
+Copyright (c) 2006, 2007 Montel Laurent, <montel@kde.org>
+Copyright (c) 2008, 2009 Gael Guennebaud, <g.gael@free.fr>
+Copyright (c) 2009 Benoit Jacob <jacob.benoit.1@gmail.com>
+SPDX-License-Identifier: BSD-2-Clause
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/build-support/3rd-party/FindGTK3.cmake.license ns-3.44/build-support/3rd-party/FindGTK3.cmake.license
--- ns-3.43/build-support/3rd-party/FindGTK3.cmake.license	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/build-support/3rd-party/FindGTK3.cmake.license	2025-03-09 16:55:49.231370400 -0700
@@ -0,0 +1,4 @@
+Copyright 2009 Kitware, Inc.
+Copyright 2008-2009 Philip Lowman <philip@yhbt.com>
+Copyright 2014-2018 Ettercap Development Team <info@ettercap-project.org>
+SPDX-License-Identifier: BSD-3-Clause
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/build-support/3rd-party/FindHarfBuzz.cmake.license ns-3.44/build-support/3rd-party/FindHarfBuzz.cmake.license
--- ns-3.43/build-support/3rd-party/FindHarfBuzz.cmake.license	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/build-support/3rd-party/FindHarfBuzz.cmake.license	2025-03-09 16:55:49.231370400 -0700
@@ -0,0 +1,3 @@
+Copyright (c) 2012, Intel Corporation
+Copyright (c) 2019 Sony Interactive
+SPDX-License-Identifier: BSD-3-Clause
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/build-support/3rd-party/find-program-hints.cmake ns-3.44/build-support/3rd-party/find-program-hints.cmake
--- ns-3.43/build-support/3rd-party/find-program-hints.cmake	2024-10-09 16:41:09.760655400 -0700
+++ ns-3.44/build-support/3rd-party/find-program-hints.cmake	2025-03-09 16:55:49.231370400 -0700
@@ -1,3 +1,9 @@
+# Copyright (c) 2022 Universidade de Brasília
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# Author: Gabriel Ferreira <gabrielcarvfer@gmail.com>
+
 disable_cmake_warnings()
 string(REPLACE ";" "/bin;" syspaths "${CMAKE_SYSTEM_PREFIX_PATH};")
 set(3RD_PARTY_FIND_PROGRAM_HINTS
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/build-support/3rd-party/FindSphinx.cmake.license ns-3.44/build-support/3rd-party/FindSphinx.cmake.license
--- ns-3.43/build-support/3rd-party/FindSphinx.cmake.license	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/build-support/3rd-party/FindSphinx.cmake.license	2025-03-09 16:55:49.231370400 -0700
@@ -0,0 +1,3 @@
+Copyright (c) 2014 University of Illinois at Urbana-Champaign
+SPDX-License-Identifier: NCSA
+From llvm.org llvm/cmake/modules/
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/build-support/3rd-party/netanim-cmakelists.cmake ns-3.44/build-support/3rd-party/netanim-cmakelists.cmake
--- ns-3.43/build-support/3rd-party/netanim-cmakelists.cmake	2024-10-09 16:41:09.760655400 -0700
+++ ns-3.44/build-support/3rd-party/netanim-cmakelists.cmake	1969-12-31 16:00:00.000000000 -0800
@@ -1,182 +0,0 @@
-# Copyright (c) 2017-2021 Universidade de Brasília
-#
-# SPDX-License-Identifier: GPL-2.0-only
-#
-# Author: Gabriel Ferreira <gabrielcarvfer@gmail.com>
-
-find_package(Qt4 COMPONENTS QtGui QUIET)
-find_package(Qt5 COMPONENTS Core Widgets PrintSupport Gui QUIET)
-
-add_definitions(-Wno-error=misleading-indentation)
-
-if((NOT ${Qt4_FOUND}) AND (NOT ${Qt5_FOUND}))
-  message(FATAL_ERROR "You need Qt installed to build NetAnim")
-endif()
-
-# Qt 4 requires these inclusions
-if(NOT ${Qt5_found})
-  include(${QT_USE_FILE})
-  add_definitions(${QT_DEFINITIONS})
-  include_directories(${QT_INCLUDES})
-endif()
-
-# Used by qt
-set(CMAKE_AUTOMOC ON)
-set(CMAKE_AUTORCC ON)
-set(CMAKE_AUTOUIC ON)
-
-set(source_files
-    animatormode.cpp
-    animatorscene.cpp
-    animatorview.cpp
-    animlink.cpp
-    animnode.cpp
-    animpacket.cpp
-    animpropertybrowser.cpp
-    animresource.cpp
-    animxmlparser.cpp
-    countertablesscene.cpp
-    flowmonstatsscene.cpp
-    flowmonxmlparser.cpp
-    graphpacket.cpp
-    interfacestatsscene.cpp
-    log.cpp
-    logqt.cpp
-    main.cpp
-    mode.cpp
-    netanim.cpp
-    packetsmode.cpp
-    packetsscene.cpp
-    packetsview.cpp
-    qcustomplot.cpp
-    qtpropertybrowser/src/fileedit.cpp
-    qtpropertybrowser/src/fileeditfactory.cpp
-    qtpropertybrowser/src/filepathmanager.cpp
-    qtpropertybrowser/src/qtbuttonpropertybrowser.cpp
-    qtpropertybrowser/src/qteditorfactory.cpp
-    qtpropertybrowser/src/qtgroupboxpropertybrowser.cpp
-    qtpropertybrowser/src/qtpropertybrowser.cpp
-    qtpropertybrowser/src/qtpropertybrowserutils.cpp
-    qtpropertybrowser/src/qtpropertymanager.cpp
-    qtpropertybrowser/src/qttreepropertybrowser.cpp
-    qtpropertybrowser/src/qtvariantproperty.cpp
-    resizeableitem.cpp
-    routingstatsscene.cpp
-    routingxmlparser.cpp
-    statsmode.cpp
-    statsview.cpp
-    table.cpp
-    textbubble.cpp
-)
-
-set(header_files
-    abort.h
-    animatorconstants.h
-    animatormode.h
-    animatorscene.h
-    animatorview.h
-    animevent.h
-    animlink.h
-    animnode.h
-    animpacket.h
-    animpropertybrowser.h
-    animresource.h
-    animxmlparser.h
-    common.h
-    countertablesscene.h
-    flowmonstatsscene.h
-    flowmonxmlparser.h
-    graphpacket.h
-    interfacestatsscene.h
-    logqt.h
-    mode.h
-    netanim.h
-    packetsmode.h
-    packetsscene.h
-    packetsview.h
-    qcustomplot.h
-    qtpropertybrowser/src/QtAbstractEditorFactoryBase
-    qtpropertybrowser/src/QtAbstractPropertyBrowser
-    qtpropertybrowser/src/QtAbstractPropertyManager
-    qtpropertybrowser/src/QtBoolPropertyManager
-    qtpropertybrowser/src/QtBrowserItem
-    qtpropertybrowser/src/QtButtonPropertyBrowser
-    qtpropertybrowser/src/QtCharEditorFactory
-    qtpropertybrowser/src/QtCharPropertyManager
-    qtpropertybrowser/src/QtCheckBoxFactory
-    qtpropertybrowser/src/QtColorEditorFactory
-    qtpropertybrowser/src/QtColorPropertyManager
-    qtpropertybrowser/src/QtCursorEditorFactory
-    qtpropertybrowser/src/QtCursorPropertyManager
-    qtpropertybrowser/src/QtDateEditFactory
-    qtpropertybrowser/src/QtDatePropertyManager
-    qtpropertybrowser/src/QtDateTimeEditFactory
-    qtpropertybrowser/src/QtDateTimePropertyManager
-    qtpropertybrowser/src/QtDoublePropertyManager
-    qtpropertybrowser/src/QtDoubleSpinBoxFactory
-    qtpropertybrowser/src/QtEnumEditorFactory
-    qtpropertybrowser/src/QtEnumPropertyManager
-    qtpropertybrowser/src/QtFlagPropertyManager
-    qtpropertybrowser/src/QtFontEditorFactory
-    qtpropertybrowser/src/QtFontPropertyManager
-    qtpropertybrowser/src/QtGroupBoxPropertyBrowser
-    qtpropertybrowser/src/QtGroupPropertyManager
-    qtpropertybrowser/src/QtIntPropertyManager
-    qtpropertybrowser/src/QtKeySequenceEditorFactory
-    qtpropertybrowser/src/QtKeySequencePropertyManager
-    qtpropertybrowser/src/QtLineEditFactory
-    qtpropertybrowser/src/QtLocalePropertyManager
-    qtpropertybrowser/src/QtPointFPropertyManager
-    qtpropertybrowser/src/QtPointPropertyManager
-    qtpropertybrowser/src/QtProperty
-    qtpropertybrowser/src/QtRectFPropertyManager
-    qtpropertybrowser/src/QtRectPropertyManager
-    qtpropertybrowser/src/QtScrollBarFactory
-    qtpropertybrowser/src/QtSizeFPropertyManager
-    qtpropertybrowser/src/QtSizePolicyPropertyManager
-    qtpropertybrowser/src/QtSizePropertyManager
-    qtpropertybrowser/src/QtSliderFactory
-    qtpropertybrowser/src/QtSpinBoxFactory
-    qtpropertybrowser/src/QtStringPropertyManager
-    qtpropertybrowser/src/QtTimeEditFactory
-    qtpropertybrowser/src/QtTimePropertyManager
-    qtpropertybrowser/src/QtTreePropertyBrowser
-    qtpropertybrowser/src/QtVariantEditorFactory
-    qtpropertybrowser/src/QtVariantProperty
-    qtpropertybrowser/src/QtVariantPropertyManager
-    qtpropertybrowser/src/fileedit.h
-    qtpropertybrowser/src/fileeditfactory.h
-    qtpropertybrowser/src/filepathmanager.h
-    qtpropertybrowser/src/qtbuttonpropertybrowser.h
-    qtpropertybrowser/src/qteditorfactory.h
-    qtpropertybrowser/src/qtgroupboxpropertybrowser.h
-    qtpropertybrowser/src/qtpropertybrowser.h
-    qtpropertybrowser/src/qtpropertybrowserutils_p.h
-    qtpropertybrowser/src/qtpropertymanager.h
-    qtpropertybrowser/src/qttreepropertybrowser.h
-    qtpropertybrowser/src/qtvariantproperty.h
-    resizeableitem.h
-    routingstatsscene.h
-    routingxmlparser.h
-    statisticsconstants.h
-    statsmode.h
-    statsview.h
-    table.h
-    textbubble.h
-    timevalue.h
-)
-
-set(resource_files resources.qrc qtpropertybrowser/src/qtpropertybrowser.qrc)
-
-add_executable(netanim ${source_files} ${resource_files})
-
-if(Qt4_FOUND)
-  target_link_libraries(netanim PUBLIC ${libcore} Qt4::QtGui)
-else()
-  target_link_libraries(
-    netanim PUBLIC ${libcore} Qt5::Widgets Qt5::Core Qt5::PrintSupport Qt5::Gui
-  )
-endif()
-
-target_include_directories(netanim PUBLIC qtpropertybrowser/src)
-set_runtime_outputdirectory(netanim ${CMAKE_OUTPUT_DIRECTORY}/bin/ "")
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/build-support/cmake-format-modules.yaml ns-3.44/build-support/cmake-format-modules.yaml
--- ns-3.43/build-support/cmake-format-modules.yaml	2024-10-09 16:41:09.760655400 -0700
+++ ns-3.44/build-support/cmake-format-modules.yaml	2025-03-09 16:55:49.231370400 -0700
@@ -12,7 +12,7 @@
             DEFINITIONS : '*'
 
     build_lib:
-        flags: [IGNORE_PCH]
+        flags: [IGNORE_PCH, GENERATE_EXPORT_HEADER]
         kwargs:
             LIBNAME : '1'
             SOURCE_FILES : '*'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/build-support/cmake-format.yaml ns-3.44/build-support/cmake-format.yaml
--- ns-3.43/build-support/cmake-format.yaml	2024-10-09 16:41:09.760655400 -0700
+++ ns-3.44/build-support/cmake-format.yaml	2025-03-09 16:55:49.231370400 -0700
@@ -12,7 +12,7 @@
             DEFINITIONS : '*'
 
     build_lib:
-        flags: [IGNORE_PCH]
+        flags: [IGNORE_PCH, GENERATE_EXPORT_HEADER]
         kwargs:
             LIBNAME : '1'
             SOURCE_FILES : '*'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/build-support/config-store-config-template.h ns-3.44/build-support/config-store-config-template.h
--- ns-3.43/build-support/config-store-config-template.h	2024-10-09 16:41:09.760655400 -0700
+++ ns-3.44/build-support/config-store-config-template.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,10 +0,0 @@
-#ifndef NS3_CONFIG_STORE_CONFIG_H
-#define NS3_CONFIG_STORE_CONFIG_H
-
-#cmakedefine PYTHONDIR "@PYTHONDIR@"
-#cmakedefine PYTHONARCHDIR "@PYTHONARCHDIR@"
-#cmakedefine HAVE_PYEMBED
-#cmakedefine HAVE_PYEXT
-#cmakedefine HAVE_PYTHON_H
-
-#endif // NS3_CONFIG_STORE_CONFIG_H
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/build-support/custom-modules/ns3-compiler-and-linker-support.cmake ns-3.44/build-support/custom-modules/ns3-compiler-and-linker-support.cmake
--- ns-3.43/build-support/custom-modules/ns3-compiler-and-linker-support.cmake	2024-10-09 16:41:09.760655400 -0700
+++ ns-3.44/build-support/custom-modules/ns3-compiler-and-linker-support.cmake	2025-03-09 16:55:49.231370400 -0700
@@ -33,6 +33,10 @@
   if(${NS3_COLORED_OUTPUT} OR "$ENV{CLICOLOR}")
     add_definitions(-fcolor-diagnostics) # colorize clang++ output
   endif()
+  if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch64")
+    # see https://gitlab.com/nsnam/ns-3-dev/-/issues/932
+    add_compile_definitions(NVALGRIND)
+  endif()
 endif()
 
 set(GCC FALSE)
@@ -105,7 +109,7 @@
   set(STATIC_LINK_FLAGS "")
 endif()
 
-if(${NS3_FAST_LINKERS})
+if(${NS3_FAST_LINKERS} AND (NOT ${MSVC}))
   # Search for faster linkers mold and lld, and use them if available
   mark_as_advanced(MOLD LLD)
   find_program(MOLD mold)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/build-support/custom-modules/ns3-contributions.cmake ns-3.44/build-support/custom-modules/ns3-contributions.cmake
--- ns-3.43/build-support/custom-modules/ns3-contributions.cmake	2024-10-09 16:41:09.760655400 -0700
+++ ns-3.44/build-support/custom-modules/ns3-contributions.cmake	2025-03-09 16:55:49.231370400 -0700
@@ -15,9 +15,15 @@
   # Add contribution folders to be built
   foreach(contribname ${contribution_list})
     set(folder "contrib/${contribname}")
+    set(external_folder "../ns-3-external-contrib/${contribname}")
     if(EXISTS ${PROJECT_SOURCE_DIR}/${folder}/CMakeLists.txt)
       message(STATUS "Processing ${folder}")
       add_subdirectory(${folder})
+    elseif(EXISTS ${PROJECT_SOURCE_DIR}/${external_folder}/CMakeLists.txt)
+      message(STATUS "Processing ${external_folder}")
+      add_subdirectory(
+        ${external_folder} ${PROJECT_BINARY_DIR}/contrib/${contribname}
+      )
     else()
       message(${HIGHLIGHTED_STATUS}
               "Skipping ${folder} : it does not contain a CMakeLists.txt file"
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/build-support/custom-modules/ns3-coverage.cmake ns-3.44/build-support/custom-modules/ns3-coverage.cmake
--- ns-3.43/build-support/custom-modules/ns3-coverage.cmake	2024-10-09 16:41:09.760655400 -0700
+++ ns-3.44/build-support/custom-modules/ns3-coverage.cmake	2025-03-09 16:55:49.231370400 -0700
@@ -27,7 +27,7 @@
   # cmake-cache or cmake-build-${build_suffix}
 
   # Create output directory for coverage info and html
-  file(MAKE_DIRECTORY ${CMAKE_OUTPUT_DIRECTORY}/coverage)
+  make_directory(${CMAKE_OUTPUT_DIRECTORY}/coverage)
 
   # Extract code coverage results and build html report
   add_custom_target(
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/build-support/custom-modules/ns3-executables.cmake ns-3.44/build-support/custom-modules/ns3-executables.cmake
--- ns-3.43/build-support/custom-modules/ns3-executables.cmake	2024-10-09 16:41:09.760655400 -0700
+++ ns-3.44/build-support/custom-modules/ns3-executables.cmake	2025-03-09 16:55:49.231370400 -0700
@@ -17,9 +17,9 @@
     PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${output_directory}
                RUNTIME_OUTPUT_NAME ${ns3-exec-outputname}
   )
-  if(${XCODE})
-    # Is that so hard not to break people's CI, AAPL?? Why would you output the
-    # targets to a Debug/Release subfolder? Why?
+  if(${MSVC} OR ${XCODE})
+    # Prevent multi-config generators from placing output files into per
+    # configuration directory
     foreach(OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES})
       string(TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG)
       set_target_properties(
@@ -137,6 +137,17 @@
     )
   endif()
 
+  # Handle ns-3-external-contrib/module (which will have output binaries mapped
+  # to contrib/module)
+  if(${BEXEC_EXECUTABLE_DIRECTORY_PATH} MATCHES "ns-3-external-contrib")
+    string(
+      REGEX
+      REPLACE ".*ns-3-external-contrib" "${PROJECT_SOURCE_DIR}/build/contrib"
+              BEXEC_EXECUTABLE_DIRECTORY_PATH
+              "${BEXEC_EXECUTABLE_DIRECTORY_PATH}"
+    )
+  endif()
+
   set_runtime_outputdirectory(
     "${BEXEC_EXECNAME}" "${BEXEC_EXECUTABLE_DIRECTORY_PATH}/"
     "${BEXEC_EXECNAME_PREFIX}"
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/build-support/custom-modules/ns3-lock.cmake ns-3.44/build-support/custom-modules/ns3-lock.cmake
--- ns-3.43/build-support/custom-modules/ns3-lock.cmake	2024-10-09 16:41:09.764655400 -0700
+++ ns-3.44/build-support/custom-modules/ns3-lock.cmake	2025-03-09 16:55:49.231370400 -0700
@@ -72,6 +72,7 @@
   cache_cmake_flag(NS3_BRITE "ENABLE_BRITE" lock_contents)
   cache_cmake_flag(NS3_ENABLE_SUDO "ENABLE_SUDO" lock_contents)
   cache_cmake_flag(NS3_PYTHON_BINDINGS "ENABLE_PYTHON_BINDINGS" lock_contents)
+  cache_cmake_flag(NS3_NETANIM "FETCH_NETANIM_VISUALIZER" lock_contents)
 
   string(APPEND lock_contents "EXAMPLE_DIRECTORIES = [")
   foreach(example_folder ${ns3-example-folders})
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/build-support/custom-modules/ns3-module-macros.cmake ns-3.44/build-support/custom-modules/ns3-module-macros.cmake
--- ns-3.43/build-support/custom-modules/ns3-module-macros.cmake	2024-10-09 16:41:09.764655400 -0700
+++ ns-3.44/build-support/custom-modules/ns3-module-macros.cmake	2025-03-09 16:55:49.231370400 -0700
@@ -17,7 +17,7 @@
 
     # If output directory does not exist, create it
     if(NOT (EXISTS ${outputdir}))
-      file(MAKE_DIRECTORY ${outputdir})
+      make_directory(${outputdir})
     endif()
 
     # If header already exists, skip symlinking/stub header creation
@@ -100,6 +100,11 @@
       continue()
     endif()
 
+    # Match external imported targets out
+    if(lib MATCHES "^(ns3::)?[^:]+::.+$")
+      continue()
+    endif()
+
     # check if the example depends on disabled modules
     remove_lib_prefix("${lib}" lib)
 
@@ -125,12 +130,13 @@
 #
 # DEPRECATED_HEADER_FILES = "list;of;deprecated;.h;files", copy won't get triggered if DEPRECATED_HEADER_FILES isn't set
 # IGNORE_PCH = TRUE or FALSE, prevents the PCH from including undesired system libraries (e.g. custom GLIBC for DCE)
+# GENERATE_EXPORT_HEADER = TRUE or FALSE, auto-generate a header file to set *_EXPORT symbols for Windows builds
 # MODULE_ENABLED_FEATURES = "list;of;enabled;features;for;this;module" (used by fd-net-device)
 # cmake-format: on
 
 function(build_lib)
   # Argument parsing
-  set(options IGNORE_PCH)
+  set(options IGNORE_PCH GENERATE_EXPORT_HEADER)
   set(oneValueArgs LIBNAME)
   set(multiValueArgs
       SOURCE_FILES
@@ -167,6 +173,35 @@
   # Set alias
   add_library(ns3::${BLIB_LIBNAME} ALIAS ${BLIB_LIBNAME})
 
+  set(export_file)
+  if(${BLIB_GENERATE_EXPORT_HEADER})
+    include(GenerateExportHeader)
+    string(TOUPPER "${BLIB_LIBNAME}" uppercase_libname)
+    string(
+      CONCAT force_undef_export
+             "\n// Undefine the *_EXPORT symbols for non-Windows based builds"
+             "\n#ifndef NS_MSVC"
+             "\n#undef ${uppercase_libname}_EXPORT"
+             "\n#define ${uppercase_libname}_EXPORT"
+             "\n#undef ${uppercase_libname}_NO_EXPORT"
+             "\n#define ${uppercase_libname}_NO_EXPORT"
+             "\n#endif"
+    )
+    set(export_file ${CMAKE_HEADER_OUTPUT_DIRECTORY}/${BLIB_LIBNAME}-export.h)
+
+    generate_export_header(
+      ${BLIB_LIBNAME} EXPORT_FILE_NAME ${export_file}
+      CUSTOM_CONTENT_FROM_VARIABLE force_undef_export
+    )
+
+    # In case building on Visual Studio
+    if(${MSVC})
+      target_compile_definitions(
+        ${BLIB_LIBNAME} PRIVATE ${BLIB_LIBNAME}_EXPORTS
+      )
+    endif()
+  endif()
+
   # Reuse PCH
   if(${PRECOMPILE_HEADERS_ENABLED} AND (NOT ${BLIB_IGNORE_PCH}))
     target_precompile_headers(${BLIB_LIBNAME} REUSE_FROM stdlib_pch)
@@ -177,11 +212,14 @@
     ${BLIB_LIBNAME}
     PROPERTIES
       PUBLIC_HEADER
-      "${BLIB_HEADER_FILES};${BLIB_DEPRECATED_HEADER_FILES};${CMAKE_HEADER_OUTPUT_DIRECTORY}/${BLIB_LIBNAME}-module.h"
+      "${BLIB_HEADER_FILES};${BLIB_DEPRECATED_HEADER_FILES};${CMAKE_HEADER_OUTPUT_DIRECTORY}/${BLIB_LIBNAME}-module.h;${export_file}"
       PRIVATE_HEADER "${BLIB_PRIVATE_HEADER_FILES}"
-      RUNTIME_OUTPUT_DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY} # set output
-                                                                 # directory for
-                                                                 # DLLs
+      # set output directory for DLLs
+      RUNTIME_OUTPUT_DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
+      RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
+      RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
+      RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
+      RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
   )
 
   if(${NS3_CLANG_TIMETRACE})
@@ -228,6 +266,10 @@
     "${BLIB_LIBNAME}" "${BLIB_IGNORE_PCH}" "${FOLDER}" "${BLIB_TEST_SOURCES}"
   )
 
+  if(${MSVC})
+    target_link_options(${lib${BLIB_LIBNAME}} PUBLIC "/OPT:NOREF")
+  endif()
+
   # Handle package export
   install(
     TARGETS ${BLIB_LIBNAME}
@@ -325,7 +367,7 @@
 
 function(build_lib_export_definitions_as_interface_definitions libname)
   get_target_property(target_definitions ${libname} COMPILE_DEFINITIONS)
-  if(${target_definitions} STREQUAL "target_definitions-NOTFOUND")
+  if("${target_definitions}" STREQUAL "target_definitions-NOTFOUND")
     set(target_definitions)
   endif()
   get_directory_property(dir_definitions COMPILE_DEFINITIONS)
@@ -410,7 +452,10 @@
 function(separate_ns3_from_non_ns3_libs libname libraries_to_link
          ns_libraries_to_link non_ns_libraries_to_link
 )
-  set(non_ns_libs ${CMAKE_THREAD_LIBS_INIT})
+  set(non_ns_libs)
+  if(DEFINED CMAKE_THREAD_LIBS_INIT)
+    list(APPEND non_ns_libs ${CMAKE_THREAD_LIBS_INIT})
+  endif()
   set(ns_libs)
   foreach(library ${libraries_to_link})
     remove_lib_prefix("${library}" module_name)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/build-support/custom-modules/ns3-output-directory.cmake ns-3.44/build-support/custom-modules/ns3-output-directory.cmake
--- ns-3.43/build-support/custom-modules/ns3-output-directory.cmake	2024-10-09 16:41:09.764655400 -0700
+++ ns-3.44/build-support/custom-modules/ns3-output-directory.cmake	2025-03-09 16:55:49.231370400 -0700
@@ -6,6 +6,40 @@
 
 # This is where we define where executables, libraries and headers will end up
 
+# Test if python is available
+execute_process(
+  COMMAND ${CMAKE_COMMAND} -E env python3 -c "exit(0)"
+  RESULT_VARIABLE PYTHON_AVAILABLE
+)
+
+function(make_directory directory_path)
+  if("${PYTHON_AVAILABLE}" EQUAL 0)
+    # In case python is available, check if we have write permissions on
+    # directory_path before trying to create it
+    get_filename_component(parent ${directory_path} DIRECTORY)
+    get_filename_component(grandparent ${parent} DIRECTORY)
+    execute_process(
+      COMMAND
+        ${CMAKE_COMMAND} -E env python3 -c
+        "import os; exit(0 if sum(map(lambda x: os.path.exists(x) and os.access(x, os.W_OK), ['${parent}', '${grandparent}'])) else 1)"
+      RESULT_VARIABLE RESULT
+    )
+    if(NOT (${RESULT} EQUAL 0))
+      message(
+        FATAL_ERROR
+          "Failed to create directory: ${directory_path}. Check for write permissions."
+      )
+    endif()
+  else()
+    # In case python is not available, warn users
+    message(
+      WARNING
+        "Python3 executable was not found and write permissions won't be checked. Build may break for file permission issues."
+    )
+  endif()
+  file(MAKE_DIRECTORY ${directory_path})
+endfunction()
+
 if("${NS3_OUTPUT_DIRECTORY}" STREQUAL "")
   message(STATUS "Using default output directory ${PROJECT_SOURCE_DIR}/build")
   set(CMAKE_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/build) # default output
@@ -25,34 +59,21 @@
                  "${absolute_ns3_output_directory}"
   )
 
-  if(NOT (EXISTS ${absolute_ns3_output_directory}))
-    message(
-      STATUS
-        "User-defined output directory \"${NS3_OUTPUT_DIRECTORY}\" doesn't exist. Trying to create it"
-    )
-    file(MAKE_DIRECTORY ${absolute_ns3_output_directory})
-    if(NOT (EXISTS ${absolute_ns3_output_directory}))
-      message(
-        FATAL_ERROR
-          "User-defined output directory \"${absolute_ns3_output_directory}\" could not be created. "
-          "Try changing the value of NS3_OUTPUT_DIRECTORY"
-      )
-    endif()
-
-    # If this directory is not inside the ns-3-dev folder, alert users tests may
-    # break
-    if(NOT ("${absolute_ns3_output_directory}" MATCHES "${PROJECT_SOURCE_DIR}"))
-      message(
-        WARNING
-          "User-defined output directory \"${absolute_ns3_output_directory}\" is outside "
-          " of the ns-3 directory ${PROJECT_SOURCE_DIR}, which will break some tests"
-      )
-    endif()
-  endif()
   message(
     STATUS
-      "User-defined output directory \"${absolute_ns3_output_directory}\" will be used"
+      "Creating user-defined output directory \"${NS3_OUTPUT_DIRECTORY}\". In case it fails, try changing the value of NS3_OUTPUT_DIRECTORY or check the directory permissions."
   )
+  make_directory(${absolute_ns3_output_directory})
+
+  # If this directory is not inside the ns-3-dev folder, alert users tests may
+  # break
+  if(NOT ("${absolute_ns3_output_directory}" MATCHES "${PROJECT_SOURCE_DIR}"))
+    message(
+      WARNING
+        "User-defined output directory \"${absolute_ns3_output_directory}\" is outside "
+        " of the ns-3 directory ${PROJECT_SOURCE_DIR}, which will break some tests"
+    )
+  endif()
   set(CMAKE_OUTPUT_DIRECTORY ${absolute_ns3_output_directory})
 endif()
 
@@ -68,4 +89,6 @@
 set(THIRD_PARTY_DIRECTORY ${PROJECT_SOURCE_DIR}/3rd-party)
 set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
 link_directories(${CMAKE_OUTPUT_DIRECTORY}/${libdir})
-file(MAKE_DIRECTORY ${CMAKE_OUTPUT_DIRECTORY})
+make_directory(${CMAKE_OUTPUT_DIRECTORY})
+make_directory(${CMAKE_LIBRARY_OUTPUT_DIRECTORY})
+make_directory(${CMAKE_HEADER_OUTPUT_DIRECTORY})
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/build-support/custom-modules/ns3-platform-support.cmake ns-3.44/build-support/custom-modules/ns3-platform-support.cmake
--- ns-3.43/build-support/custom-modules/ns3-platform-support.cmake	2024-10-09 16:41:09.764655400 -0700
+++ ns-3.44/build-support/custom-modules/ns3-platform-support.cmake	2025-03-09 16:55:49.231370400 -0700
@@ -50,6 +50,7 @@
   set(CMAKE_FIND_APPBUNDLE "LAST")
 endif()
 
+set(cat_command cat)
 if(WIN32)
   set(NS3_PRECOMPILE_HEADERS OFF
       CACHE BOOL "Precompile module headers to speed up compilation" FORCE
@@ -59,19 +60,30 @@
   # requires this definition
   # https://docs.microsoft.com/en-us/cpp/c-runtime-library/math-constants?view=vs-2019
   add_definitions(/D_USE_MATH_DEFINES)
+  set(cat_command type) # required until we move to CMake >= 3.18
 endif()
 
-set(cat_command cat)
-
 if(CMAKE_XCODE_BUILD_SYSTEM)
   set(XCODE True)
 else()
   set(XCODE False)
 endif()
 
-if(${XCODE})
+if("${CMAKE_CXX_COMPILER_ID}" MATCHES "MSVC" OR "${CMAKE_CXX_SIMULATE_ID}"
+                                                MATCHES "MSVC"
+)
+  set(MSVC True)
+  set(NS3_INT64X64 "CAIRO" CACHE STRING "Int64x64 implementation" FORCE)
+else()
+  set(MSVC False)
+endif()
+
+if(${MSVC} OR ${XCODE})
   # Prevent multi-config generators from placing output files into per
   # configuration directory
+  if(NOT (DEFINED CMAKE_CONFIGURATION_TYPES))
+    set(CMAKE_CONFIGURATION_TYPES DEBUG RELEASE RELWITHDEBINFO MINSIZEREL)
+  endif()
   foreach(OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES})
     string(TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG)
     set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG}
@@ -83,5 +95,23 @@
     set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG}
         ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}
     )
-  endforeach()
+  endforeach(OUTPUTCONFIG CMAKE_CONFIGURATION_TYPES)
+endif()
+
+if(${MSVC})
+  set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
+
+  # Enable exceptions
+  add_definitions(/EHs)
+
+  # Account for lack of valgrind and binary compatibility restrictions on
+  # Windows https://github.com/microsoft/STL/wiki/Changelog#vs-2022-1710
+  add_compile_definitions(
+    __WIN32__ NVALGRIND _DISABLE_CONSTEXPR_MUTEX_CONSTRUCTOR
+    _CRT_SECURE_NO_WARNINGS NS_MSVC NOMINMAX
+  )
+
+  # Allow unresolved symbols as in most cases they are simply in other ns-3
+  # libraries
+  add_link_options("/FORCE:UNRESOLVED")
 endif()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/build-support/custom-modules/ns3-vcpkg-hunter.cmake ns-3.44/build-support/custom-modules/ns3-vcpkg-hunter.cmake
--- ns-3.43/build-support/custom-modules/ns3-vcpkg-hunter.cmake	2024-10-09 16:41:09.764655400 -0700
+++ ns-3.44/build-support/custom-modules/ns3-vcpkg-hunter.cmake	2025-03-09 16:55:49.231370400 -0700
@@ -62,7 +62,7 @@
     )
   endif()
 
-  if(DEFINED MSVC)
+  if(${MSVC})
     message(FATAL_ERROR "vcpkg: Visual Studio is unsupported")
   else()
     # Check if required packages are installed (unzip curl tar)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/build-support/custom-modules/ns3-versioning.cmake ns-3.44/build-support/custom-modules/ns3-versioning.cmake
--- ns-3.43/build-support/custom-modules/ns3-versioning.cmake	2024-10-09 16:41:09.764655400 -0700
+++ ns-3.44/build-support/custom-modules/ns3-versioning.cmake	2025-03-09 16:55:49.231370400 -0700
@@ -6,7 +6,9 @@
 function(check_git_repo_has_ns3_tags HAS_TAGS GIT_VERSION_TAG)
   execute_process(
     COMMAND ${GIT} describe --tags --abbrev=0 --match ns-3.[0-9]*
-    OUTPUT_VARIABLE GIT_TAG_OUTPUT ERROR_QUIET
+    WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+    OUTPUT_VARIABLE GIT_TAG_OUTPUT
+    ERROR_QUIET
   )
 
   # Result will be empty in case of a shallow clone or no git repo
@@ -35,7 +37,7 @@
 )
   execute_process(
     COMMAND ${GIT} describe --tags --dirty --long
-    OUTPUT_VARIABLE GIT_TAG_OUTPUT
+    WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} OUTPUT_VARIABLE GIT_TAG_OUTPUT
   )
 
   string(REPLACE "\r" "" GIT_TAG_OUTPUT ${GIT_TAG_OUTPUT}) # remove CR (carriage
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/build-support/macros-and-definitions.cmake ns-3.44/build-support/macros-and-definitions.cmake
--- ns-3.43/build-support/macros-and-definitions.cmake	2024-10-09 16:41:09.764655400 -0700
+++ ns-3.44/build-support/macros-and-definitions.cmake	2025-03-09 16:55:49.231370400 -0700
@@ -212,7 +212,7 @@
 
   # Set warning level and warning as errors
   if(${NS3_WARNINGS})
-    if(DEFINED MSVC)
+    if(${MSVC})
       add_compile_options(/W3) # /W4 = -Wall + -Wextra
       if(${NS3_WARNINGS_AS_ERRORS})
         add_compile_options(/WX)
@@ -259,7 +259,8 @@
 
   if(${NS3_CLANG_TIDY})
     find_program(
-      CLANG_TIDY NAMES clang-tidy clang-tidy-14 clang-tidy-15 clang-tidy-16
+      CLANG_TIDY NAMES clang-tidy clang-tidy-15 clang-tidy-16 clang-tidy-17
+                       clang-tidy-18 clang-tidy-19
     )
     if("${CLANG_TIDY}" STREQUAL "CLANG_TIDY-NOTFOUND")
       message(FATAL_ERROR "Clang-tidy was not found")
@@ -540,7 +541,9 @@
     if(${SQLite3_FOUND})
       set(ENABLE_SQLITE True)
       add_definitions(-DHAVE_SQLITE3)
-      include_directories(${SQLite3_INCLUDE_DIRS})
+      if(NOT ${NS3_FORCE_LOCAL_DEPENDENCIES})
+        include_directories(${SQLite3_INCLUDE_DIRS})
+      endif()
     endif()
   endif()
 
@@ -554,7 +557,9 @@
       set(ENABLE_EIGEN True)
       add_definitions(-DHAVE_EIGEN3)
       add_definitions(-DEIGEN_MPL2_ONLY)
-      include_directories(${EIGEN3_INCLUDE_DIR})
+      if(NOT ${NS3_FORCE_LOCAL_DEPENDENCIES})
+        include_directories(${EIGEN3_INCLUDE_DIR})
+      endif()
     else()
       set(ENABLE_EIGEN_REASON "Eigen was not found")
     endif()
@@ -582,7 +587,9 @@
               "GTK3 found with incompatible version ${GTK3_VERSION}"
           )
         else()
-          include_directories(${GTK3_INCLUDE_DIRS} ${HarfBuzz_INCLUDE_DIRS})
+          if(NOT ${NS3_FORCE_LOCAL_DEPENDENCIES})
+            include_directories(${GTK3_INCLUDE_DIRS} ${HarfBuzz_INCLUDE_DIRS})
+          endif()
         endif()
       endif()
 
@@ -609,7 +616,9 @@
       set(LIBXML2_FOUND_REASON "LibXML2 was not found")
     else()
       add_definitions(-DHAVE_LIBXML2)
-      include_directories(${LIBXML2_INCLUDE_DIR})
+      if(NOT ${NS3_FORCE_LOCAL_DEPENDENCIES})
+        include_directories(${LIBXML2_INCLUDE_DIR})
+      endif()
     endif()
   endif()
 
@@ -656,7 +665,9 @@
           set(CMAKE_INSTALL_RPATH "${DEVELOPER_DIR}" CACHE STRING "")
         endif()
       endif()
-      include_directories(${Python3_INCLUDE_DIRS})
+      if(NOT ${NS3_FORCE_LOCAL_DEPENDENCIES})
+        include_directories(${Python3_INCLUDE_DIRS})
+      endif()
     else()
       message(${HIGHLIGHTED_STATUS}
               "Python: development libraries were not found"
@@ -691,6 +702,12 @@
         set(ENABLE_PYTHON_BINDINGS_REASON
             "missing dependency: ${missing_packages}"
         )
+      elseif(${NS3_MPI})
+        message(
+          ${HIGHLIGHTED_STATUS}
+          "Bindings: python bindings disabled due to an incompatibility with the MPI module"
+        )
+        set(ENABLE_PYTHON_BINDINGS_REASON "incompatible module enabled: mpi")
       else()
         set(ENABLE_PYTHON_BINDINGS ON)
       endif()
@@ -816,12 +833,6 @@
     endif()
   endif()
 
-  # Process config-store-config
-  configure_file(
-    build-support/config-store-config-template.h
-    ${CMAKE_HEADER_OUTPUT_DIRECTORY}/config-store-config.h
-  )
-
   set(ENABLE_MPI FALSE)
   if(${NS3_MPI})
     find_package(MPI QUIET)
@@ -829,16 +840,21 @@
       message(FATAL_ERROR "MPI was not found.")
     else()
       message(STATUS "MPI was found.")
-      add_definitions(-DNS3_MPI)
-      include_directories(${MPI_CXX_INCLUDE_DIRS})
+      target_compile_definitions(MPI::MPI_CXX INTERFACE NS3_MPI)
       set(ENABLE_MPI TRUE)
     endif()
   endif()
 
+  # Use upstream boost package config with CMake 3.30 and above
+  if(POLICY CMP0167)
+    cmake_policy(SET CMP0167 NEW)
+  endif()
   mark_as_advanced(Boost_INCLUDE_DIR)
   find_package(Boost)
   if(${Boost_FOUND})
-    include_directories(${Boost_INCLUDE_DIRS})
+    if(NOT ${NS3_FORCE_LOCAL_DEPENDENCIES})
+      include_directories(${Boost_INCLUDE_DIRS})
+    endif()
     set(CMAKE_REQUIRED_INCLUDES ${Boost_INCLUDE_DIRS})
   endif()
 
@@ -850,7 +866,9 @@
     else()
       message(STATUS "GSL was found.")
       add_definitions(-DHAVE_GSL)
-      include_directories(${GSL_INCLUDE_DIRS})
+      if(NOT ${NS3_FORCE_LOCAL_DEPENDENCIES})
+        include_directories(${GSL_INCLUDE_DIRS})
+      endif()
     endif()
   endif()
 
@@ -1119,7 +1137,7 @@
   check_function_exists("getenv" "HAVE_GETENV")
 
   configure_file(
-    build-support/core-config-template.h
+    ${PROJECT_SOURCE_DIR}/build-support/core-config-template.h
     ${CMAKE_HEADER_OUTPUT_DIRECTORY}/core-config.h
   )
 
@@ -1316,19 +1334,14 @@
 
   # Netanim depends on ns-3 core, so we built it later
   if(${NS3_NETANIM})
-    include(FetchContent)
-    FetchContent_Declare(
-      netanim GIT_REPOSITORY https://gitlab.com/nsnam/netanim.git
-      GIT_TAG netanim-3.109
-    )
-    FetchContent_Populate(netanim)
-    file(COPY build-support/3rd-party/netanim-cmakelists.cmake
-         DESTINATION ${netanim_SOURCE_DIR}
-    )
-    file(RENAME ${netanim_SOURCE_DIR}/netanim-cmakelists.cmake
-         ${netanim_SOURCE_DIR}/CMakeLists.txt
+    include(ExternalProject)
+    ExternalProject_Add(
+      netanim_visualizer
+      GIT_REPOSITORY https://gitlab.com/nsnam/netanim.git
+      GIT_TAG netanim-3.110
+      BUILD_IN_SOURCE TRUE
+      CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CMAKE_OUTPUT_DIRECTORY}
     )
-    add_subdirectory(${netanim_SOURCE_DIR} ${netanim_BINARY_DIR})
   endif()
 
   if(${NS3_FETCH_OPTIONAL_COMPONENTS})
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/build-support/test-files/test-contrib-dependency/contrib-source.cc ns-3.44/build-support/test-files/test-contrib-dependency/contrib-source.cc
--- ns-3.43/build-support/test-files/test-contrib-dependency/contrib-source.cc	2024-10-09 16:41:09.764655400 -0700
+++ ns-3.44/build-support/test-files/test-contrib-dependency/contrib-source.cc	2025-03-09 16:55:49.231370400 -0700
@@ -1,6 +1,6 @@
 #include "contrib-header.h"
 
-#include <ns3/simulator.h>
+#include "ns3/simulator.h"
 
 void
 testPrint()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/build-support/test-files/test-src-dependent-on-contrib/examples/source-example.cc ns-3.44/build-support/test-files/test-src-dependent-on-contrib/examples/source-example.cc
--- ns-3.43/build-support/test-files/test-src-dependent-on-contrib/examples/source-example.cc	2024-10-09 16:41:09.764655400 -0700
+++ ns-3.44/build-support/test-files/test-src-dependent-on-contrib/examples/source-example.cc	2025-03-09 16:55:49.235370600 -0700
@@ -1,4 +1,4 @@
-#include <ns3/src-header.h>
+#include "ns3/src-header.h"
 
 int
 main()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/build-support/test-files/test-src-dependent-on-contrib/src-source.cc ns-3.44/build-support/test-files/test-src-dependent-on-contrib/src-source.cc
--- ns-3.43/build-support/test-files/test-src-dependent-on-contrib/src-source.cc	2024-10-09 16:41:09.764655400 -0700
+++ ns-3.44/build-support/test-files/test-src-dependent-on-contrib/src-source.cc	2025-03-09 16:55:49.235370600 -0700
@@ -1,4 +1,4 @@
-#include <ns3/contrib-header.h>
+#include "ns3/contrib-header.h"
 
 void
 testPrint2()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/CHANGES.md ns-3.44/CHANGES.md
--- ns-3.43/CHANGES.md	2024-10-09 16:41:36.356755000 -0700
+++ ns-3.44/CHANGES.md	2025-03-09 16:56:09.311445500 -0700
@@ -1,5 +1,4 @@
-ns-3: API and model change history
-==================================
+# ns-3: API and model change history
 
 ns-3 is an evolving system and there will be API or behavioral changes from time to time. Users who try to use scripts or models across versions of ns-3 may encounter problems at compile time, run time, or may see the simulation output change.
 
@@ -13,18 +12,56 @@
 
 This file is a best-effort approach to solving this issue; we will do our best but can guarantee that there will be things that fall through the cracks, unfortunately. If you, as a user, can suggest improvements to this file based on your experience, please contribute a patch or drop us a note on ns-developers mailing list.
 
-Changes from ns-3.42 to ns-3.43
--------------------------------
+## Changes from ns-3.43 to ns-3.44
 
 ### New API
 
-* (applications) A new trace source `BulkSendApplication::TcpRetransmission` has been added for tracing TCP retranmissions.
+* (antenna) Add `SymmetricAdjacencyMatrix` utility class, used to track the necessity of channel update between every `PhasedArrayModel` pair.
+* (applications) Added two new base classes for source and sink applications, `SourceApplication` and `SinkApplication`, respectively.
+* (applications) Added an `OnOffState` trace source to `OnOffApplication`, to track whether the application is transmitting or not.
+* (wifi) Added a new **RobustAVStreamingSupported** attribute to `WifiMac` to enable 802.11aa features (GCR).
+* (wifi) Changes have been made to the `WifiRemoteStationManager` interface for what concerns the update of the frame retry count of the MPDUs and the decision of dropping MPDUs (possibly based on the max retry limit). The `NeedRetransmission` method has been replaced by the `GetMpdusToDropOnTxFailure` method and the `DoNeedRetransmission` method has been replaced by the `DoGetMpdusToDropOnTxFailure` method. Also, the `DoIncrementRetryCountOnTxFailure` method has been added to implement custom policies for the update of the frame retry count of MPDUs upon transmission failure.
+* (zigbee) Added Zigbee module support. The module includes a NWK layer with joining and routing capabilities. No APS layer included.
+
+### Changes to existing API
+
+* (applications) Deprecated attributes `RemoteAddress` and `RemotePort` in UdpClient, UdpTraceClient and UdpEchoClient. They have been combined into a single `Remote` attribute.
+* (applications) Deprecated attributes `ThreeGppHttpClient::RemoteServerAddress` and `ThreeGppHttpClient::RemoteServerPort`. They have been combined into a single `ThreeGppHttpClient::Remote` attribute.
+* (core) Deprecated `SUPPORTED`, `DEPRECATED` and `OBSOLETE` in `TypeId` class. They have been replaced by `SupportLevel::{SUPPORTED,DEPRECATED,OBSOLETE}`, respectively.
+* (lr-wpan) ``LrWpanMac`` is now also aggregated to ``LrWpanNetDevice``.
+* (stats) Deprecated ns3::NaN and ns3::isNaN to use std::nan and std::isnan in their place
+* (tap-bridge) Deprecated "Gateway" attribute.
+* (tap-bridge) Removed unused gateway option from tap-creator.
+* (wifi) Added a new **ProtectedIfResponded** attribute to `FrameExchangeManager` to disable RTS/CTS protection for stations that have already responded to a frame requiring acknowledgment in the same TXOP, even if such frame had not been protected by RTS/CTS. The default value is true, even though it represents a change with respect to the previous behavior, because it is likely a more realistic choice.
+* (wifi) Deprecated setters/getters of the {Ht,Vht,He}Configuration classes that trivially set/get member variables, which have been made public and hence accessible to users.
+* (wifi) Trace source `QosTxop::BaEstablished` is extended to support GCR block ack agreements.
+
+### Changes to build system
+
+* !2319 Add support for clang-tidy-19
+* !2251 Add msbuild and Visual Studio generator support to the ns3 script
+* !2251 Use ccache with ClangCL/MSVC
+* !2251 Provide option to generate export header from build_lib
+* !2260 Scan for modules in the external contrib directory ../ns-3-external-contrib
+* !2255 Exclude external imported targets from missing libraries check
+* !2238 Prevent Python bindings from being enabled along with MPI
+
+### Changed behavior
+
+* (lr-wpan) !2334 Association: Fix the handling of situations where the association response commands arrives before the data request command acknowledgment that is supposed to precede it.
+
+## Changes from ns-3.42 to ns-3.43
+
+### New API
+
+* (applications) A new trace source `BulkSendApplication::TcpRetransmission` has been added for tracing TCP retransmissions.
 * (core) Added `LaplacianRandomVariable` class implementing the Laplacian random variable, and `LargestExtremeValueRandomVariable` class implementing the Largest Extreme Value random variable.
 * (lr-wpan) Added a new test to `lr-wpan-cca-test.cc` suite. The added test demonstrates a known CCA vulnerability window.
 * (tcp) A new trace source `TcpSocketBase::LastRtt` has been added for tracing the last RTT sample observed. The existing trace source `TcpSocketBase::Rtt` is still providing the smoothed RTT, although it had been incorrectly documented as providing the last RTT.
 * (wifi) Added a new trace source to `WifiPhy`: **PhyRxMacHeaderEnd**, which is fired when the reception of the MAC header of an MPDU is completed and provides the MAC header and the remaining PSDU duration. The trace source is actually fired when the new **NotifyMacHdrRxEnd** attribute of `WifiPhy` is set to true (it is set to false by default).
 * (wifi) WifiHelper::SetStandard() method now accepts selected string values in addition to enum argument.
 * (wifi) Added a new method **SetPcapCaptureType** to `WifiPhyHelper` to control how PCAPs are generated for MLD devices.
+* (wifi) New trace helper `WifiTxStatsHelper` for providing Wi-Fi MAC-level transmission statistics.
 
 ### Changes to existing API
 
@@ -33,7 +70,7 @@
 * (energy) Energy module TypeId now uses the name that includes the namespace `ns3::energy`, the old name is now deprecated.
 * (energy) Documentation was extended and reformatted.
 * (lr-wpan) Lr-wpan module TypeId now uses the name that includes the namespace `ns3::lrwpan`, the old name is now deprecated.
-* (lr-wpan) Attribute `macBeaconPayload` in `MacPibAttributes` is now a std::vector<uint8_t> instead of a packet pointer.
+* (lr-wpan) Attribute `macBeaconPayload` in `MacPibAttributes` is now a `std::vector<uint8_t>` instead of a packet pointer.
 * (lr-wpan) Removes the word `address` from the MAC address prefix when `LOG_PREFIX_FUNC` is used.
 * (lr-wpan) Removes the word `address` from the CSMA-CA logs prefix when `LOG_PREFIX_FUNC` is used.
 * (lr-wpan) Added `AssignStreams` function to the MAC.
@@ -56,10 +93,10 @@
 * (lr-wpan) Upon a beacon request command, beacons are transmitted after a jitter to reduce the probability of collisions.
 * (tcp) TCP Proportional Rate Reduction (PRR) recovery has been aligned to the updates in draft-ietf-tcpm-prr-rfc6937bis
 
-Changes from ns-3.41 to ns-3.42
--------------------------------
+## Changes from ns-3.41 to ns-3.42
 
 ### New API
+
 * (antenna) Added `CircularApertureAntennaModel` class which characterizes the antenna gain pattern of the reflector antenna with circular aperture described in 3GPP TR 38.811 v15.4.0, Section 6.4.1
 * (core) Objects now can be aggregated to multiple objects though the `Object::UnidirectionalAggregateObject` function. Objects aggregated in such a way can not use `GetObject` to access the objects they are aggregated to.
 * (core) Added `TestVector` iterators and dot product operator for `Vector2D` and `Vector3D` types
@@ -100,8 +137,7 @@
 * (mobility) Fixed the corner rebound direction in `RandomWalk2d[Outdoor]MobilityModel` and the initial direction in case of node starting from a border or corner.
 * (tcp) TcpCubic and TcpLinuxReno will no longer grow their congestion window when application-limited, now matching Linux behavior
 
-Changes from ns-3.40 to ns-3.41
--------------------------------
+## Changes from ns-3.40 to ns-3.41
 
 ### New API
 
@@ -162,8 +198,7 @@
 * (tcp) TCP Cubic (the default congestion control in ns-3) now supports TCP-friendliness by default (see RFC 9438 Section 4.3), making the congestion window growth somewhat more aggressive.  This follows the default Linux behavior.
 * (wifi) Increase the duration of the timer started when waiting for an ADDBA_RESPONSE from 1ms to 5ms to better account for the time required by the recipient to access the medium and complete the frame exchange (which may involve protection with (MU-)RTS/CTS).
 
-Changes from ns-3.39 to ns-3.40
--------------------------------
+## Changes from ns-3.39 to ns-3.40
 
 ### New API
 
@@ -192,8 +227,7 @@
 * (wifi) Upon ML setup, a non-AP MLD updates the IDs of the setup links to match the IDs used by the AP MLD.
 * (wifi) Attribute **TrackSignalsFromInactiveInterfaces** in SpectrumWifiPhy has been defaulted to be enabled.
 
-Changes from ns-3.38 to ns-3.39
--------------------------------
+## Changes from ns-3.38 to ns-3.39
 
 ### New API
 
@@ -262,8 +296,7 @@
 * (wifi) Protection mechanisms (e.g., RTS/CTS) are not used if destinations have already received (MU-)RTS in the current TXOP
 * (wifi) Protection mechanisms can be used for management frames as well (if needed)
 
-Changes from ns-3.37 to ns-3.38
--------------------------------
+## Changes from ns-3.37 to ns-3.38
 
 ### New API
 
@@ -307,8 +340,7 @@
 * (wifi) Control frames (specifically, BlockAckRequest and MU-BAR Trigger Frames) are stored in the wifi MAC queue and no longer in a dedicated BlockAckManager queue
 * (wifi) BSSIDs are no longer hashed by the ApInfo comparator because it may lead to different results on different platforms
 
-Changes from ns-3.36 to ns-3.37
--------------------------------
+## Changes from ns-3.36 to ns-3.37
 
 ### New API
 
@@ -371,12 +403,11 @@
   * Handover joining timeout is now handled.
   * Handover leaving timeout is now handled.
   * Upon RACH failure during HO, the UE will perform cell selection again.
-* (network) Mac(8|16|48|64)Address address allocation pool is now reset between consecutive runs.
+* (network) `Mac(8|16|48|64)Address` address allocation pool is now reset between consecutive runs.
 * (propagation) The O2I Low/High Building Penetration Losses will add losses in the pathloss calculation when buildings are present and a UE results to be in O2I state. In order to not consider these losses, they can be disabled by setting BuildingPenetrationLossesEnabled to false.
 * (wifi) The **Channel** attribute of `WifiNetDevice` is deprecated because it became ambiguous with the introduction of multiple links per device. The **Channel** attribute of `WifiPhy` can be used instead.
 
-Changes from ns-3.36 to ns-3.36.1
----------------------------------
+## Changes from ns-3.36 to ns-3.36.1
 
 ### New API
 
@@ -399,8 +430,7 @@
 
 Apart from the bugs fixed (listed in the RELEASE_NOTES), the simulation model behavior should not have changed since ns-3.36.
 
-Changes from ns-3.35 to ns-3.36
--------------------------------
+## Changes from ns-3.35 to ns-3.36
 
 ### New API
 
@@ -438,8 +468,7 @@
 * NixVectorRouting: `NixVectorRouting` can now better cope with topology changes. In-flight packets are not anymore causing crashes, and the path is dynamically rebuilt by intermediate routers (this happens only to packets in-flight during the topology change).
 * Mesh (Wi-Fi) forwarding hops now have a configurable random variable-based forwarding delay model, with a default mean of 350 us.
 
-Changes from ns-3.34 to ns-3.35
--------------------------------
+## Changes from ns-3.34 to ns-3.35
 
 ### New API
 
@@ -470,8 +499,7 @@
 * 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.
 * 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.
 
-Changes from ns-3.33 to ns-3.34
--------------------------------
+## Changes from ns-3.33 to ns-3.34
 
 ### New features and API
 
@@ -511,8 +539,7 @@
 * The **LTE RLC Acknowledged Mode (AM) transmit buffer** is now limited by default to a size of (`1024 * 10`) bytes. Configuration of unlimited behavior can still be made by passing the value of zero to the new attribute `MaxTxBufferSize`.
 * A **non-AP MLD loses association** when receiving no beacon an any link link for an interval of duration equal to the maximum number of missed beacons times the interval between two consecutive Beacon frames.
 
-Changes from ns-3.32 to ns-3.33
--------------------------------
+## Changes from ns-3.32 to ns-3.33
 
 ### New API
 
@@ -547,8 +574,7 @@
 * TCP now implements the Linux-like **congestion window reduced (CWR)** state when explicit congestion notification (ECN) is enabled.
 * `TcpDctcp` now inherits from `TcpLinuxReno`, making its congestion avoidance track more closely to that of Linux.
 
-Changes from ns-3.31 to ns-3.32
--------------------------------
+## Changes from ns-3.31 to ns-3.32
 
 ### New API
 
@@ -587,8 +613,7 @@
 * WifiPhy forwards up MPDUs from an A-MPDU under reception as long as they arrive at the PHY, instead of forwarding up the whole A-MPDU once its reception is completed.
 * The ns-3 TCP model was changed to set the initial congestion window to 10 segments instead of 1 segment (to align with default Linux configuration).
 
-Changes from ns-3.30 to ns-3.31
--------------------------------
+## Changes from ns-3.30 to ns-3.31
 
 ### New API
 
@@ -642,8 +667,7 @@
 * The implementation of the **Wi-Fi channel access** functions has been improved to make them more conformant to the IEEE 802.11-2016 standard. Concerning the DCF, the backoff procedure is no longer invoked when a packet is queued for transmission and the medium has not been idle for a DIFS, but it is invoked if the medium is busy or does not remain idle for a DIFS after the packet has been queued. Concerning the EDCAF, transmissions are now correctly aligned at slot boundaries.
 * Various wifi physical layer behavior around channel occupancy calculation, phy state calculation, and handling different channel widths has been updated.
 
-Changes from ns-3.29 to ns-3.30
--------------------------------
+## Changes from ns-3.29 to ns-3.30
 
 ### New API
 
@@ -714,8 +738,7 @@
   * The RachConfigCommon structure in LteRrcSap API has been extended to include `TxFailParam`. This new field would enable an eNB to indicate how many times T300 timer can expire at the UE. Upon reaching this count, the UE aborts the connection establishment, and performs the cell selection again. See TS 36.331 5.3.3.6.
 * The timer T300 in LteUeRrc class is now bounded by the standard min and max values defined in 3GPP TS 36.331.
 
-Changes from ns-3.28 to ns-3.29
--------------------------------
+## Changes from ns-3.28 to ns-3.29
 
 ### New API
 
@@ -792,8 +815,7 @@
 * The maximum size UDP packet of the UdpClient application is no longer limited to 1500 bytes.
 * The default values of the `MaxSlrc` and `FragmentationThreshold` attributes in WifiRemoteStationManager were changed from 7 to 4 and from 2346 to 65535, respectively.
 
-Changes from ns-3.27 to ns-3.28
--------------------------------
+## Changes from ns-3.27 to ns-3.28
 
 ### New API
 
@@ -824,8 +846,7 @@
 * The CsmaNetDevice::PhyTxBeginTrace will trace all attempts to transmit, even those that result in drops. Previously, eventual channel drops were excluded from this trace.
 * The TCP congestion window trace now does not report on window inflation during fast recovery phase because it is no longer internally maintained as an inflated value (a separate trace called CongestionWindowInflated can be used to recover the old trace behavior).
 
-Changes from ns-3.26 to ns-3.27
--------------------------------
+## Changes from ns-3.26 to ns-3.27
 
 ### New API
 
@@ -901,8 +922,7 @@
 * The default value of the `EnableBeaconJitter` attribute in ApWifiMac was changed from false to true.
 * The NormalClose() callback of a TcpSocket object used to fire upon leaving `TIME_WAIT` state (`2*MSL` after FINs have been exchanged). It now fires upon entering `TIME_WAIT` state. Timing of the callback for the other path to state CLOSED (through `LAST_ACK`) has not been changed.
 
-Changes from ns-3.25 to ns-3.26
--------------------------------
+## Changes from ns-3.25 to ns-3.26
 
 ### New API
 
@@ -937,8 +957,7 @@
 * The relationship between Wi-Fi channel number, frequency, channel width, and Wi-Fi standard has been revised (see bug 2412). Previously, ChannelNumber and Frequency were attributes of class YansWifiPhy, and the frequency was defined as the start of the band. Now, Frequency has been redefined to be the center frequency of the channel, and the underlying device relies on the pair of frequency and channel width to control behavior; the channel number and Wi-Fi standard are used as attributes to configure frequency and channel width. The wifi module documentation discusses this change and the new behavior.
 * AODV now honors the TTL in RREQ/RREP and it uses a method compliant with [RFC 3561](http://www.ietf.org/rfc/rfc3561.txt). The node search radius is increased progressively. This could increase slightly the node search time, but it also decreases the network congestion.
 
-Changes from ns-3.24 to ns-3.25
--------------------------------
+## Changes from ns-3.24 to ns-3.25
 
 ### New API
 
@@ -988,8 +1007,7 @@
 * 802.11n/ac MPDU aggregation is now enabled by default for both `AC_BE` and `AC_VI`.
 * The introduction of the traffic control layer leads to some additional buffering by default in the stack; when a device queue fills up, additional packets become enqueued at the traffic control layer.
 
-Changes from ns-3.23 to ns-3.24
--------------------------------
+## Changes from ns-3.23 to ns-3.24
 
 ### New API
 
@@ -1021,8 +1039,7 @@
 
 This section is for behavioral changes to the models that were not due to a bug fix.
 
-Changes from ns-3.22 to ns-3.23
--------------------------------
+## Changes from ns-3.22 to ns-3.23
 
 ### New API
 
@@ -1046,8 +1063,7 @@
 * In Wi-Fi, HT stations (802.11n) now support two-level aggregation. The InterferenceHelper now distinguishes between the PLCP and regular payload reception, for higher fidelity modeling. ACKs are now sent using legacy rates and preambles. Access points now establish BSSBasicRateSet for control frame transmissions. PLCP header and PLCP payload reception have been decoupled to improve PHY layer modeling accuracy. RTS/CTS with A-MPDU is now fully supported.
 * The mesh module was made more compliant to the IEEE 802.11s-2012 standard and packet traces are now parseable by Wireshark.
 
-Changes from ns-3.21 to ns-3.22
--------------------------------
+## Changes from ns-3.21 to ns-3.22
 
 ### New API
 
@@ -1083,8 +1099,7 @@
 * The `LrWpanHelper` object was previously instantiating only a `LogDistancePropagationLossModel` on a `SingleModelSpectrumChannel`, but no `PropagationDelayModel`. The constructor now adds by default a `ConstantSpeedPropagationDelayModel`.
 * The Nix-vector routing implementation now uses a lazy flush mechanism, which dramatically speeds up the creation of large topologies.
 
-Changes from ns-3.20 to ns-3.21
--------------------------------
+## Changes from ns-3.20 to ns-3.21
 
 ### New API
 
@@ -1132,8 +1147,7 @@
 
 * Behavior will be changed due to the list of bugs fixed (listed in [RELEASE_NOTES.md](RELEASE_NOTES.md)); users are requested to review that list as well.
 
-Changes from ns-3.19 to ns-3.20
--------------------------------
+## Changes from ns-3.19 to ns-3.20
 
 ### New API
 
@@ -1163,8 +1177,7 @@
 * IPv4 identification field value is now dependent on the protocol field.
 * Point-to-point trace sources now contain PPP headers
 
-Changes from ns-3.18.1 to ns-3.19
----------------------------------
+## Changes from ns-3.18.1 to ns-3.19
 
 ### New API
 
@@ -1203,8 +1216,7 @@
 * IPv6 addresses and routing tables are printed like in Linux `route -A inet6` command.
 * A change in `Ipv[4,6]Interface` enforces the correct behaviour of IP when a device do not support the minimum MTU requirements. This is set to 68 and 1280 octets respectively. IP simulations that may have run over devices with smaller MTUs than 68 or 1280, respectively, will no longer be able to use such devices.
 
-Changes from ns-3.18 to ns-3.18.1
----------------------------------
+## Changes from ns-3.18 to ns-3.18.1
 
 ### New API
 
@@ -1226,8 +1238,7 @@
 
 * Wifi simulations have additional jitter on AP beaconing (see above) and some bug fixes have been applied to wifi module (see [RELEASE_NOTES.md](RELEASE_NOTES.md))
 
-Changes from ns-3.17 to ns-3.18
--------------------------------
+## Changes from ns-3.17 to ns-3.18
 
 ### New API
 
@@ -1285,8 +1296,7 @@
 * IPv4's ARP Request and IPv6's NS/RS are now transmitted with a random delay. The delay is, by default, a uniform random variable in time between 0 and 10ms. This is aimed at preventing reception errors due to collisions during wifi broadcasts when the sending behavior is synchronized (e.g. due to applications starting at the same time on several different nodes). This behaviour can be modified by using ArpL3Protocol's `RequestJitter` and Icmpv6L4Protocol's `SolicitationJitter` attributes or by using the new `InternetStackHelper` functions.
 * AODV Hellos are disabled by default. The performance with Hellos enabled and disabled are almost identical. With Hellos enabled, AODV will suppress hellos from transmission, if any recent broadcast such as RREQ was transmitted. The attribute n`s3::aodv::RoutingProtocol::EnableHello` can be used to enable/disable Hellos.
 
-Changes from ns-3.16 to ns-3.17
--------------------------------
+## Changes from ns-3.16 to ns-3.17
 
 ### New API
 
@@ -1376,8 +1386,7 @@
 
 * DSR link layer notification has changed. The model originally used `TxErrHeader` in Ptr to indicate the transmission error of a specific packet in link layer; however, it was not working correctly. The model now uses a different path to implement the link layer notification mechanism; specifically, looking into the trace file to find packet receive events. If the model finds one receive event for the data packet, it is used as the indicator for successful data delivery.
 
-Changes from ns-3.15 to ns-3.16
--------------------------------
+## Changes from ns-3.15 to ns-3.16
 
 ### New API
 
@@ -1404,8 +1413,7 @@
 * Sending a packet through Ipv4RawSocket now supports checksum in the Ipv4Header. It is still not possible to manually put in arbitrary checksum as the checksum is automatically calculated at Ipv4L3Protocol. The user has to enable checksum globally for this to work. Simply calling Ipv4Header::EnableChecksum() for a single Ipv4Header will not work.
 * Now MultiModelSpectrumChannel allows a SpectrumPhy instance to change SpectrumModel at runtime by issuing a call to MultiModelSpectrumChannel::AddRx (). Previously, MultiModelSpectrumChannel required each SpectrumPhy instance to stick with the same SpectrumModel for the whole simulation.
 
-Changes from ns-3.14 to ns-3.15
--------------------------------
+## Changes from ns-3.14 to ns-3.15
 
 ### New API
 
@@ -1424,8 +1432,7 @@
 
 * Programs using random variables or models that include random variables may exhibit changed output for a given run number or seed, due to a possible change in the order in which random variables are assigned to underlying pseudo-random sequences. Consult the manual for more information regarding this.
 
-Changes from ns-3.13 to ns-3.14
--------------------------------
+## Changes from ns-3.13 to ns-3.14
 
 ### New API
 
@@ -1492,8 +1499,7 @@
   [*] Added --useIpv6 flag to switch between IPv4 and IPv6
   ```
 
-Changes from ns-3.12 to ns-3.13
--------------------------------
+## Changes from ns-3.12 to ns-3.13
 
 ### Changes to build system
 
@@ -1550,8 +1556,7 @@
   * TcpNewReno supports limited transmit (RFC3042) if asserting boolean attribute `ns3::TcpNewReno::LimitedTransmit`
   * Nagle's algorithm supported. Default off, turn on by calling `TcpSocket::SetTcpNoDelay(true)`
 
-Changes from ns-3.11 to ns-3.12
--------------------------------
+## Changes from ns-3.11 to ns-3.12
 
 ### Changes to build system
 
@@ -1572,8 +1577,7 @@
 
 * IPv4 fragmentation is now supported.
 
-Changes from ns-3.10 to ns-3.11
--------------------------------
+## Changes from ns-3.10 to ns-3.11
 
 ### Changes to build system
 
@@ -1581,13 +1585,13 @@
 
   You can now make examples and tests be built in ns-3 in two ways.
 
-  1. Using `build.py` when ns-3 is built for the first time:
+  * Using `build.py` when ns-3 is built for the first time:
 
     ```shell
     ./build.py --enable-examples --enable-tests
     ```
 
-  2. Using `waf` once ns-3 has been built:
+  * Using `waf` once ns-3 has been built:
 
     ```shell
     ./waf configure --enable-examples --enable-tests
@@ -1650,8 +1654,7 @@
 * If the data inside the TCP buffer is less than the available window, TCP tries to ask for more data to the application, in the hope of filling the usable transmission window. In some cases, this change allows sending bigger packets than the previous versions, optimizing the transmission.
 * In TCP, the ACK is now processed before invoking any routine that deals with the segment sending, except in case of retransmissions.
 
-Changes from ns-3.9 to ns-3.10
-------------------------------
+## Changes from ns-3.9 to ns-3.10
 
 ### Changes to build system
 
@@ -1721,8 +1724,7 @@
 
   As part of the TCP socket refactoring, a new TCP implementation provides slightly different behavior than the previous TcpSocketImpl that provided only fast retransmit. The default behavior now is NewReno which provides fast retransmit and fast recovery with window inflation during recovery.
 
-Changes from ns-3.8 to ns-3.9
------------------------------
+## Changes from ns-3.8 to ns-3.9
 
 ### Changes to build system
 
@@ -1794,8 +1796,7 @@
 * **Drop trace logged for Ipv4/6 forwarding failure:** Fixed bug 861; this will add ascii traces (drops) in Ipv4 and Ipv6 traces for forwarding failures
 * **Changed default WiFi error rate model for OFDM modulation types:** Adopted more conservative ErrorRateModel for OFDM modulation types (a/g). This will require 4 to 5 more dB of received power to get similar results as before, so users may observe a reduced WiFi range when using the defaults. See tracker issue 944 for more details.
 
-Changes from ns-3.7 to ns-3.8
------------------------------
+## Changes from ns-3.7 to ns-3.8
 
 ### Changes to build system
 
@@ -1901,8 +1902,7 @@
 
 * None for this release.
 
-Changes from ns-3.6 to ns-3.7
------------------------------
+## Changes from ns-3.6 to ns-3.7
 
 ### Changes to build system
 
@@ -2036,8 +2036,7 @@
 * Default TTL of IPv4 broadcast datagrams changed from 1 to 64.
 * Changed DcfManager::UpdateBackoff (): using flooring instead of rounding in calculation of remaining slots. [See bug 695.](http://www.nsnam.org/bugzilla/show_bug.cgi?id=695)
 
-Changes from ns-3.5 to ns-3.6
------------------------------
+## Changes from ns-3.5 to ns-3.6
 
 ### Changes to build system
 
@@ -2127,8 +2126,7 @@
 
   Now each NetDevice subclasses have a `TracedCallback<>` object (list of callbacks) instead of `Callback<void>` ones.
 
-Changes from ns-3.4 to ns-3.5
------------------------------
+## Changes from ns-3.4 to ns-3.5
 
 ### Changes to build system
 
@@ -2386,8 +2384,7 @@
 
 * None for this release.
 
-Changes from ns-3.3 to ns-3.4
------------------------------
+## Changes from ns-3.3 to ns-3.4
 
 ### Changes to build system
 
@@ -2419,8 +2416,7 @@
 
 * The tracing system rework has introduced some significant changes in the behavior of some trace sources, specifically in the positioning of trace sources in the device code. For example, there were cases where the packet transmit trace source was hit before the packet was enqueued on the device transmit quueue. This now happens just before the packet is transmitted over the channel medium. The scope of the changes is too large to be included here. If you have concerns regarding trace semantics, please consult the net device documentation for details. As is usual, the ultimate source for documentation is the net device source code.
 
-Changes from ns-3.2 to ns-3.3
------------------------------
+## Changes from ns-3.2 to ns-3.3
 
 ### New API
 
@@ -2439,7 +2435,7 @@
   * return type of `SetDataSentCallback ()` changed from `bool` to `void`
   * `Socket::Listen()` no longer takes a queueLimit argument
 * As part of the Wifi Phy rework, there have been several API changes at the low level and helper API level.
-* At the helper API level, the `WifiHelper` was split to three classes: a `WifiHelper`, a YansWifiChan`nel helper, and a`YansWifiPhy` helper. Some functions like Ascii and Pcap tracing functions were moved from class `WifiHelper` to class `YansWifiPhyHelper`.
+* At the helper API level, the `WifiHelper` was split to three classes: a `WifiHelper`, a `YansWifiChannel` helper, and a `YansWifiPhy` helper. Some functions like Ascii and Pcap tracing functions were moved from class `WifiHelper` to class `YansWifiPhyHelper`.
 * At the low-level API, there have been a number of changes to make the Phy more modular:
 * `composite-propagation-loss-model.h` is removed
 * `DcfManager::NotifyCcaBusyStartNow()` has changed name
@@ -2460,8 +2456,7 @@
 * 17-11-2008; changeset [756887a9bbea](http://code.nsnam.org/ns-3-dev/rev/756887a9bbea)
 * Global routing supports bridge devices.
 
-Changes from ns-3.1 to ns-3.2
------------------------------
+## Changes from ns-3.1 to ns-3.2
 
 ### New API
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/.clang-format ns-3.44/.clang-format
--- ns-3.43/.clang-format	2024-10-09 16:41:09.752655300 -0700
+++ ns-3.44/.clang-format	2025-03-09 16:55:49.223370600 -0700
@@ -21,6 +21,7 @@
   - Regex: ".*"
     Priority: 1
     SortPriority: 0
+InsertBraces: true
 KeepEmptyLinesAtTheStartOfBlocks: false
 PackConstructorInitializers: Never
 PointerAlignment: Left
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/.clang-tidy ns-3.44/.clang-tidy
--- ns-3.43/.clang-tidy	2024-10-09 16:41:09.752655300 -0700
+++ ns-3.44/.clang-tidy	2025-03-09 16:55:49.223370600 -0700
@@ -34,7 +34,6 @@
   performance-inefficient-vector-operation,
   performance-trivially-destructible,
   performance-unnecessary-copy-initialization,
-  readability-braces-around-statements,
   readability-container-size-empty,
   readability-isolate-declaration,
   readability-make-member-function-const,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/CMakeLists.txt ns-3.44/CMakeLists.txt
--- ns-3.43/CMakeLists.txt	2024-10-09 16:41:09.756655500 -0700
+++ ns-3.44/CMakeLists.txt	2025-03-09 16:55:49.227370500 -0700
@@ -121,6 +121,18 @@
 # Scan contribution libraries
 subdirlist(contrib_libs_to_build ${CMAKE_CURRENT_SOURCE_DIR}/contrib)
 
+# Scan for additional contribution libraries OUTSIDE the ns-3 source directory,
+# in the ns-3-external-contrib directory
+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/../ns-3-external-contrib)
+  subdirlist(
+    external_contrib_libs_to_build
+    ${CMAKE_CURRENT_SOURCE_DIR}/../ns-3-external-contrib
+  )
+  set(contrib_libs_to_build ${contrib_libs_to_build}
+                            ${external_contrib_libs_to_build}
+  )
+endif()
+
 # Before filtering, we need to load settings from .ns3rc
 parse_ns3rc(
   ns3rc_enabled_modules ns3rc_disabled_modules ns3rc_examples_enabled
@@ -145,6 +157,18 @@
         ${CCACHE} --set-config
         sloppiness=pch_defines,time_macros,include_file_mtime,include_file_ctime
     )
+    if(DEFINED MSVC)
+      if(MSVC)
+        file(COPY_FILE ${CCACHE} ${CMAKE_BINARY_DIR}/clang-cl.exe
+             ONLY_IF_DIFFERENT
+        )
+        set(CMAKE_VS_GLOBALS
+            "CLToolExe=clang-cl.exe" "CLToolPath=${CMAKE_BINARY_DIR}"
+            "TrackFileAccess=false" "UseMultiToolTask=true"
+            "DebugInformationFormat=OldStyle"
+        )
+      endif()
+    endif()
   endif()
 endif()
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/CODE_OF_CONDUCT.md ns-3.44/CODE_OF_CONDUCT.md
--- ns-3.43/CODE_OF_CONDUCT.md	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/CODE_OF_CONDUCT.md	2025-03-09 16:55:49.227370500 -0700
@@ -0,0 +1,5 @@
+# ns-3 Code of Conduct
+
+The ns-3 code of conduct is available in the following website:
+
+<https://www.nsnam.org/about/governance/policies/>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/CONTRIBUTING.md ns-3.44/CONTRIBUTING.md
--- ns-3.43/CONTRIBUTING.md	2024-10-09 16:41:09.756655500 -0700
+++ ns-3.44/CONTRIBUTING.md	2025-03-09 16:55:49.227370500 -0700
@@ -29,12 +29,11 @@
 
 ## I do not want to read this whole thing, I just have a question
 
-> **Note:** Please don't file an issue to ask a question.
-            You'll get faster results by using the resources below.
+> **Note:** Please don't file an issue to ask a question. You'll get faster results by using the resources below.
 
 We have an official message board where the community chimes in with helpful advice if you have questions.
 
-* [ns-3-users, the official ns-3 message board](https://groups.google.com/forum/#!forum/ns-3-users)
+* [ns-3-users, the official ns-3 message board](https://groups.google.com/g/ns-3-users)
 * [ns-3 manual](https://www.nsnam.org/docs/manual/html/index.html)
 
 If chat is more your speed, you can join the ns-3 Zulip channel:
@@ -151,8 +150,9 @@
 
 Please follow these steps to have your contribution considered by the maintainers:
 
-1. Follow the [styleguides](#styleguides)
-2. After you submit your merge request, verify that all status checks are passing <details><summary>What if the status checks are failing?</summary>If a status check is failing, and you believe that the failure is unrelated to your change, please leave a comment on the merge request explaining why you believe the failure is unrelated. A maintainer will re-run the status check for you. If we conclude that the failure was a false positive, then we will open an issue to track that problem with our status check suite.</details>
+* Follow the [styleguides](#styleguides)
+* After you submit your merge request, verify that all status checks are passing.
+  * If a status check is failing, and you believe that the failure is unrelated to your change, please leave a comment on the merge request explaining why you believe the failure is unrelated. A maintainer will re-run the status check for you. If we conclude that the failure was a false positive, then we will open an issue to track that problem with our status check suite.
 
 While the prerequisites above must be satisfied prior to having your merge request reviewed, the reviewer(s) may ask you to complete additional design work, tests, or other changes before your merge request can be ultimately accepted.
 
@@ -216,7 +216,7 @@
 
 #### Merge Request Labels
 
-| Label name | Description
+| Label name | Description |
 | --- | --- |
 | `work-in-progress` | Merge requests which are still being worked on, more changes will follow. |
 | `needs-review` | Merge requests which need code review, and approval from maintainers or ns-3 core team. |
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/doc/contributing/Makefile ns-3.44/doc/contributing/Makefile
--- ns-3.43/doc/contributing/Makefile	2024-10-09 16:41:09.764655400 -0700
+++ ns-3.44/doc/contributing/Makefile	2025-03-09 16:55:49.235370600 -0700
@@ -1,5 +1,8 @@
 # Makefile for Sphinx documentation
 #
+EPSTOPDF = epstopdf
+DIA = dia
+CONVERT = convert -density 300
 
 # You can set these variables from the command line.
 SPHINXOPTS    = -W --keep-going
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/doc/contributing/source/coding-style.rst ns-3.44/doc/contributing/source/coding-style.rst
--- ns-3.43/doc/contributing/source/coding-style.rst	2024-10-09 16:41:09.764655400 -0700
+++ ns-3.44/doc/contributing/source/coding-style.rst	2025-03-09 16:55:49.235370600 -0700
@@ -46,7 +46,6 @@
 * clang-format-17
 * clang-format-16
 * clang-format-15
-* clang-format-14
 
 Integration with IDEs
 =====================
@@ -150,25 +149,48 @@
 We recommend running this script over your newly introduced C++ files prior to submission
 as a Merge Request.
 
-The script performs multiple style checks. By default, the script runs the following checks:
-
-* Check code formatting using clang-format. Respects clang-format guards.
-* Check if local ``#include`` headers do not use the "ns3/" prefix. Respects clang-format guards.
-* Check if there are no trailing whitespace. Always checked.
-* Check if there are no tabs. Respects clang-format guards.
-* Check if source code files use SPDX licenses rather than GPL license text. Respects clang-format guards.
-
-The process returns a zero exit code if all files adhere to these rules.
+The script performs multiple style checks. It returns a zero exit code if all files adhere to these rules.
 If there are files that do not comply with the rules, the process returns a non-zero
 exit code and lists the respective files. This mode is useful for developers editing
 their code and for the GitLab CI/CD pipeline to check if the codebase is well formatted.
-All checks are enabled by default. Users can disable specific checks using the corresponding
-flags:
 
-* ``--no-formatting``
-* ``--no-include-prefixes``
-* ``--no-whitespace``
-* ``--no-tabs``
+The script runs the checks explained in the following table.
+All checks are enabled by default.
+Users can disable specific checks using the corresponding flags.
+
+.. list-table::
+  :header-rows: 1
+
+  * - Check
+    - Description
+    - Flag to Disable Check
+  * - Formatting
+    - Check code formatting using clang-format. Respects clang-format guards.
+    - ``--no-formatting``
+  * - #include "ns3/" prefixes
+    - Check if local ``#include`` headers do not use the "ns3/" prefix. Respects clang-format guards.
+    - ``--no-include-prefixes``
+  * - #include quotes
+    - Check if ns-3 ``#include`` headers use quotes (``""``) instead of angle brackets (``<>``). Respects clang-format guards.
+    - ``--no-include-quotes``
+  * - Doxygen tags
+    - Check if Doxygen tags use ``@`` rather than ``\\``. Respects clang-format guards.
+    - ``--no-doxygen-tags``
+  * - SPDX Licenses
+    - Check if source code use SPDX licenses rather than GPL license text. Respects clang-format guards.
+    - ``--no-licenses``
+  * - Emacs comments
+    - Check if source code does not have emacs file style comments. Respects clang-format guards.
+    - ``--no-emacs``
+  * - Trailing whitespace
+    - Check if there are no trailing whitespace. Always checked.
+    - ``--no-whitespace``
+  * - Tabs
+    - Check if there are no tabs. Respects clang-format guards.
+    - ``--no-tabs``
+  * - File encoding
+    - Check if files have the correct encoding (UTF-8). Always checked.
+    - ``--no-encoding``
 
 Additional information about the formatting issues detected by the script can be enabled
 by adding the ``-v, --verbose`` flag.
@@ -231,9 +253,10 @@
 
 To ensure consistency among developers, |ns3| defines a minimum version of clang-tidy,
 whose warnings must not be ignored. Therefore, developers should, at least, scan their
-code with the minimum version of clang-tidy.
+code with the minimum version of clang-tidy. However, more recent versions can be used,
+which will produce better warnings.
 
-The minimum version is clang-tidy-14.
+The minimum version is clang-tidy-15.
 
 Integration with IDEs
 =====================
@@ -680,7 +703,7 @@
   {
 
   /**
-   * \brief short one-line description of the purpose of your class
+   * @brief short one-line description of the purpose of your class
    *
    * A longer description of the purpose of your class after a blank
    * empty line.
@@ -693,8 +716,8 @@
       /**
        * A detailed description of the purpose of the method.
        *
-       * \param firstParam a short description of the purpose of this parameter
-       * \return a short description of what is returned from this function.
+       * @param firstParam a short description of the purpose of this parameter
+       * @return a short description of what is returned from this function.
        */
       int DoSomething(int firstParam);
 
@@ -770,7 +793,7 @@
 
   .. sourcecode:: cpp
 
-    #include <ns3/header.h>
+    #include "ns3/header.h"
 
 - inside .cc files, use
 
@@ -782,7 +805,7 @@
 
   .. sourcecode:: cpp
 
-    #include <ns3/header.h>
+    #include "ns3/header.h"
 
 Variables and constants
 =======================
@@ -922,9 +945,10 @@
 For comments that are intended to not be exposed publicly in the Doxygen output,
 use the ``@internal`` and ``@endinternal`` tags.
 Please use the ``@see`` tag for cross-referencing.
-All parameters and return values should be documented. The |ns3| codebase uses
-both the ``@`` or ``\`` characters for tag identification; please make sure
-that usage is consistent within a file.
+All parameters and return values should be documented. The |ns3| codebase prefers
+the ``@`` character for tag identification. This character is recognized by clang-format
+as the start of Doxygen tags, which enables it to keep tags properly formatted;
+therefore please don't use ``\`` as the delimiter.
 
 .. sourcecode:: cpp
 
@@ -936,7 +960,7 @@
       /**
        * Constructor.
        *
-       * \param n Number of elements.
+       * @param n Number of elements.
        */
       MyClass(int n);
   };
@@ -951,11 +975,11 @@
 .. sourcecode:: cpp
 
   /**
-   * \defgroup mynewmodule This is a new module
+   * @defgroup mynewmodule This is a new module
    */
 
   /**
-   * \ingroup mynewmodule
+   * @ingroup mynewmodule
    *
    * MyClassOne description.
    */
@@ -964,7 +988,7 @@
   };
 
   /**
-   * \ingroup mynewmodule
+   * @ingroup mynewmodule
    *
    * MyClassTwo description.
    */
@@ -977,22 +1001,22 @@
 .. sourcecode:: cpp
 
   /**
-   * \defgroup mynewmodule-test Tests for new module
-   * \ingroup mynewmodule
-   * \ingroup tests
+   * @defgroup mynewmodule-test Tests for new module
+   * @ingroup mynewmodule
+   * @ingroup tests
    */
 
   /**
-   * \ingroup mynewmodule-tests
-   * \brief MyNewModule Test
+   * @ingroup mynewmodule-tests
+   * @brief MyNewModule Test
    */
   class MyNewModuleTest : public TestCase
   {
   };
 
   /**
-   * \ingroup mynewmodule-tests
-   * \brief MyNewModule TestSuite
+   * @ingroup mynewmodule-tests
+   * @brief MyNewModule TestSuite
    */
   class MyNewModuleTestSuite : public TestSuite
   {
@@ -1001,7 +1025,7 @@
   };
 
   /**
-   * \ingroup mynewmodule-tests
+   * @ingroup mynewmodule-tests
    * Static variable for test initialization
    */
   static MyNewModuleTestSuite g_myNewModuleTestSuite;
@@ -1129,8 +1153,8 @@
     /**
      * Receive packet from lower layer (passed to PHY as callback).
      *
-     * \param pkt Packet being received.
-     * \param txMode Mode of received packet.
+     * @param pkt Packet being received.
+     * @param txMode Mode of received packet.
      */
     void RxPacketGood(Ptr<Packet> pkt, double, UanTxMode txMode);
 
@@ -1817,3 +1841,77 @@
       "pyproject.toml",
     ],
   }
+
+Markdown Lint
+*************
+
+.. _Markdownlint: https://github.com/markdownlint/markdownlint
+.. _Markdownlint Rules: https://github.com/markdownlint/markdownlint/blob/main/docs/RULES.md
+.. _Markdownlint Configuration Style File: https://github.com/markdownlint/markdownlint/blob/main/docs/creating_styles.md
+.. _Markdownlint Docker Hub: https://hub.docker.com/r/markdownlint/markdownlint
+.. _Markdownlint Docker Instructions: https://github.com/markdownlint/markdownlint/tree/main/tools/docker
+.. _Markdownlint VS Code Extension: https://marketplace.visualstudio.com/items?itemName=DavidAnson.vscode-markdownlint
+
+|ns3| uses `Markdownlint`_ as a linter of Markdown files.
+This linter checks if Markdown files follow a set of defined rules, in order to encourage
+standardization and consistency of Markdown files across parsers.
+It also ensures that Markdown files are correctly interpreted and rendered.
+
+Markdownlint detects linting issues, but it can not fix them automatically.
+The issues must be fixed manually.
+
+Markdownlint configuration
+==========================
+
+Markdownlint's settings are saved in the file ``.mdl_style.rb``.
+This file is defined in `Markdownlint Configuration Style File`_, which explains how to
+customize the tool to enable / disable rules or customize its parameters.
+
+The list of Markdown rules supported by Markdownlint is available in `Markdownlint Rules`_.
+
+Install and Run Markdownlint
+============================
+
+Markdownlint is written in Ruby. To run Markdownlint, either use the official
+Markdownlint Docker image or install Ruby and Markdownlint.
+
+Run Markdownlint with Docker image
+##################################
+
+Markdownlint has an official Docker image in `Markdownlint Docker Hub`_ with the tool
+and all dependencies installed.
+The instructions to use the Docker image are available in `Markdownlint Docker Instructions`_.
+
+To run Markdownlint in a Docker container, use the following command:
+
+.. sourcecode:: console
+
+  docker run -v .:/data markdownlint/markdownlint -s .mdl_style.rb .
+
+Install and Run Markdownlint with Ruby
+######################################
+
+To install Markdownlint natively, you need to have Ruby installed in your system.
+Check the installation instructions in the Ruby's official documentation.
+
+After installing Ruby in your system, install Markdownlint using the following command:
+
+.. sourcecode:: console
+
+  gem install mdl
+
+To run Markdownlint and check Markdown files for linting issues, run Markdownlint
+using the following command:
+
+.. sourcecode:: console
+
+  mdl -s .mdl_style.rb .
+
+VS Code Extension
+=================
+
+For VS Code users, the `Markdownlint VS Code Extension`_ extension is available in the marketplace.
+This extension is inspired in `Markdownlint`_ and follows the same set of rules.
+
+The Markdownlint extension automatically analyzes files open in the editor and provides inline hints
+when issues are detected. It can automatically fix most issues related with formatting.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/doc/contributing/source/conf.py ns-3.44/doc/contributing/source/conf.py
--- ns-3.43/doc/contributing/source/conf.py	2024-10-09 16:41:36.356755000 -0700
+++ ns-3.44/doc/contributing/source/conf.py	2025-03-09 16:56:09.315445400 -0700
@@ -49,9 +49,9 @@
 # built documents.
 #
 # The short X.Y version.
-version = "ns-3.43"
+version = "ns-3.44"
 # The full version, including alpha/beta/rc tags.
-release = "ns-3.43"
+release = "ns-3.44"
 
 # 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.43/doc/doxygen.warnings.report.sh ns-3.44/doc/doxygen.warnings.report.sh
--- ns-3.43/doc/doxygen.warnings.report.sh	2024-10-09 16:41:09.768655500 -0700
+++ ns-3.44/doc/doxygen.warnings.report.sh	2025-03-09 16:55:49.235370600 -0700
@@ -251,7 +251,7 @@
 # REappend filter_blacklistRE "MakeCallback< ObjectBase \\* >(ObjectBase \\*"
 
 #   ATTRIBUTE_HELPER_CPP( and _HEADER(
-# REappend filter_blacklistRE "ATTRIBUTE_HELPER_\\(CPP\\|HEADER\\)"
+# REappend filter_blacklistRE "ATTRIBUTE_HELPER_\\(CPP\\|HEADER\\)"
 
 # Filter out regular expression for black list, -e, -t and -F
 filter_outRE=""
@@ -453,7 +453,7 @@
 # This is to catch LaTeX formula errors.
 # In this case the output is of the form:
 # "error: Problems running latex." followed by
-# "Check your installation or look for typos in _formulas.tex and check _formulas.log!"
+# "Check your installation or look for typos in _formulas.tex and check _formulas.log!"
 # and
 # "Check your installation or look for typos in _formulas_dark.tex and check _formulas_dark.log!"
 # Hence, the count can be two.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/doc/installation/Makefile ns-3.44/doc/installation/Makefile
--- ns-3.43/doc/installation/Makefile	2024-10-09 16:41:09.768655500 -0700
+++ ns-3.44/doc/installation/Makefile	2025-03-09 16:55:49.235370600 -0700
@@ -1,5 +1,8 @@
 # Makefile for Sphinx documentation
 #
+EPSTOPDF = epstopdf
+DIA = dia
+CONVERT = convert -density 300
 
 # You can set these variables from the command line.
 SPHINXOPTS    = -W --keep-going
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/doc/installation/source/conf.py ns-3.44/doc/installation/source/conf.py
--- ns-3.43/doc/installation/source/conf.py	2024-10-09 16:41:36.356755000 -0700
+++ ns-3.44/doc/installation/source/conf.py	2025-03-09 16:56:09.315445400 -0700
@@ -49,9 +49,9 @@
 # built documents.
 #
 # The short X.Y version.
-version = "ns-3.43"
+version = "ns-3.44"
 # The full version, including alpha/beta/rc tags.
-release = "ns-3.43"
+release = "ns-3.44"
 
 # 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.43/doc/installation/source/linux.rst ns-3.44/doc/installation/source/linux.rst
--- ns-3.43/doc/installation/source/linux.rst	2024-10-09 16:41:09.768655500 -0700
+++ ns-3.44/doc/installation/source/linux.rst	2025-03-09 16:55:49.235370600 -0700
@@ -91,8 +91,8 @@
   +-----------------------------+------------------------------------------------------------+
   | GTK-based config store      | ``libgtk-3-dev``                                           |
   +-----------------------------+------------------------------------------------------------+
-  | Emulation with virtual      | ``lxc-utils lxc-templates``                                |
-  | machines and tap bridge     | ``vtun uml-utilities ebtables bridge-utils``               |
+  | Emulation with virtual      |                                                            |
+  | machines and tap bridge     | ``lxc-utils lxc-templates iproute2 iptables``              |
   +-----------------------------+------------------------------------------------------------+
   | Support for openflow        | ``libxml2 libxml2-dev libboost-all-dev``                   |
   +-----------------------------+------------------------------------------------------------+
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/doc/installation/source/macos.rst ns-3.44/doc/installation/source/macos.rst
--- ns-3.43/doc/installation/source/macos.rst	2024-10-09 16:41:09.768655500 -0700
+++ ns-3.44/doc/installation/source/macos.rst	2025-03-09 16:55:49.235370600 -0700
@@ -43,11 +43,15 @@
 Requirements
 ************
 
-macOS uses the Clang/LLVM compiler toolchain.  It is possible to install gcc/g++ from
-Homebrew and MacPorts, but macOS will not provide it due to licensing issues.  |ns3|
+Installing ns-3 on macOS requires two fundamental things:  1) C++/Python development tools, and 2) CMake build system with at least one underlying build tool.  These can either be installed via binary package installation from the macOS App Store (Xcode development tools) or the web (`CMake binary package <https://cmake.org/download/>`_), or from Homebrew or MacPorts.
+
+macOS Xcode uses the Clang/LLVM compiler toolchain.  It is possible to install the GNU compiler gcc/g++ from
+Homebrew and MacPorts, but macOS will not provide it due to licensing issues.  If you do not install Xcode you will have to install build tools via Homebrew or MacPorts.  |ns3|
 works on recent versions of both ``clang++`` and ``g++``, so for macOS, there is no need
 to install ``g++``.
 
+The following table provides package names for installing CMake and Ninja build system from Homebrew or MacPorts.
+
   +--------------------+-------------------------------+-------------------------------------+
   | **ns-3 Version**   | **Homebrew packages**         | **MacPorts packages**               |
   +====================+===============================+=====================================+
@@ -56,6 +60,18 @@
   | 3.35 and earlier   | None                          | None                                |
   +--------------------+-------------------------------+-------------------------------------+
 
+You will know you are done when you can successfully type `clang++ -v` at the command line, and when you type `cmake --help` and it identifies that you have at least one installed generator (in the below example, Unix Makefiles):
+
+::
+
+  Generators
+  The following generators are available on this platform (* marks default):
+  * Unix Makefiles               = Generates standard UNIX makefiles.
+    Ninja                        = Generates build.ninja files.
+    Ninja Multi-Config           = Generates build-<Config>.ninja files.
+    Watcom WMake                 = Generates Watcom WMake makefiles.
+    Xcode                        = Generate Xcode project files.
+
 Recommended
 ***********
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/doc/installation/source/quick-start.rst ns-3.44/doc/installation/source/quick-start.rst
--- ns-3.43/doc/installation/source/quick-start.rst	2024-10-09 16:41:09.768655500 -0700
+++ ns-3.44/doc/installation/source/quick-start.rst	2025-03-09 16:55:49.235370600 -0700
@@ -80,13 +80,13 @@
 
 There are two main options:
 
-1. Download a release tarball.  This will unpack to a directory such as ``ns-allinone-3.43``
+1. Download a release tarball.  This will unpack to a directory such as ``ns-allinone-3.44``
 containing |ns3| and some other programs.  Below is a command-line download using ``wget``,
 but a browser download will also work::
 
-  $ wget https://www.nsnam.org/releases/ns-allinone-3.43.tar.bz2
-  $ tar xfj ns-allinone-3.43.tar.bz2
-  $ cd ns-allinone-3.43/ns-3.43
+  $ wget https://www.nsnam.org/releases/ns-allinone-3.44.tar.bz2
+  $ tar xfj ns-allinone-3.44.tar.bz2
+  $ cd ns-allinone-3.44/ns-3.44
 
 2. Clone |ns3| from the Git repository.  The ``ns-3-allinone`` can be cloned, as well as
 ``ns-3-dev`` by itself.  Below, we illustrate the latter::
@@ -99,7 +99,7 @@
 the |ns3| ``master`` branch, which is a development branch.  All |ns3| releases are tagged
 in Git, so if you would then like to check out a past release, you can do so as follows::
 
-  $ git checkout -b ns-3.43-release ns-3.43
+  $ git checkout -b ns-3.44-release ns-3.44
 
 In this quick-start, we are omitting download and build instructions for optional |ns3| modules,
 the ``NetAnim`` animator, Python bindings, and ``NetSimulyzer``.  The
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/doc/installation/source/system.rst ns-3.44/doc/installation/source/system.rst
--- ns-3.43/doc/installation/source/system.rst	2024-10-09 16:41:09.768655500 -0700
+++ ns-3.44/doc/installation/source/system.rst	2025-03-09 16:55:49.235370600 -0700
@@ -160,8 +160,7 @@
 NetAnim animator
 ================
 
-The `Qt <https://www.qt.io>`_ qt5 development tools are needed for NetAnim animator;
-qt4 will also work but we have migrated to qt5. qt6 compatibility is not tested.
+The `Qt5 or Qt6 <https://www.qt.io>`_ development tools are needed for NetAnim animator.
 
 PyViz visualizer
 ================
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/doc/installation/source/windows.rst ns-3.44/doc/installation/source/windows.rst
--- ns-3.43/doc/installation/source/windows.rst	2024-10-09 16:41:09.768655500 -0700
+++ ns-3.44/doc/installation/source/windows.rst	2025-03-09 16:55:49.235370600 -0700
@@ -113,7 +113,7 @@
 Netanim animator
 ++++++++++++++++
 
-Qt5 development tools are needed for Netanim animator. Qt4 will also work but we have migrated to qt5.
+Qt5 or Qt6 development tools are needed for Netanim animator.
 
 .. sourcecode:: console
 
@@ -267,7 +267,6 @@
                        mingw-w64-x86_64-qt5 \
                        git \
                        mingw-w64-x86_64-msmpi \
-                       mingw-w64-x86_64-uncrustify \
                        mingw-w64-x86_64-imagemagick \
                        mingw-w64-x86_64-doxygen \
                        mingw-w64-x86_64-graphviz \
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/doc/main.h ns-3.44/doc/main.h
--- ns-3.43/doc/main.h	2024-10-09 16:41:09.768655500 -0700
+++ ns-3.44/doc/main.h	2025-03-09 16:55:49.235370600 -0700
@@ -1,12 +1,12 @@
 /**
- * \file
+ * @file
  * Main page of the Doxygen-generated documentation.
  */
 
 /**
- * \mainpage ns-3 Documentation
+ * @mainpage ns-3 Documentation
  *
- * \section intro-sec Introduction
+ * @section intro-sec Introduction
  * <a href="http://www.nsnam.org/">ns-3</a> documentation is maintained using
  * <a href="http://www.doxygen.org">Doxygen</a>.
  * Doxygen is typically used for
@@ -16,10 +16,9 @@
  * can be found at the
  * <a href="http://www.nsnam.org/documentation/latest">project web site</a>.
  *
- * \section install-sec Building the Documentation
+ * @section install-sec Building the Documentation
  *
- * Building ns-3 Doxygen requires Doxygen version 1.8 at a minimum, but version 1.9 is recommended
- * to minimize warnings.
+ * Building ns-3 Doxygen requires Doxygen version 1.11
  *
  * Type "./ns3 docs doxygen" or "./ns3 docs doxygen-no-build" to build the
  *  documentation.  The doc/ directory contains
@@ -27,59 +26,21 @@
  * build process puts html files into the doc/html/ directory, and latex
  * filex into the doc/latex/ directory.
  *
- * \section module-sec Module overview
- *
- * The ns-3 library is split across many modules organized under the
- * <b><a href="modules.html">Modules</a></b> tab.
- *     - aodv
- *     - applications
- *     - bridge
- *     - click
- *     - config-store
- *     - core
- *     - csma
- *     - csma-layout
- *     - dsdv
- *     - emu
- *     - energy
- *     - flow-monitor
- *     - internet
- *     - lte
- *     - mesh
- *     - mobility
- *     - mpi
- *     - netanim
- *     - network
- *     - nix-vector-routing
- *     - ns3tcp
- *     - ns3wifi
- *     - olsr
- *     - openflow
- *     - point-to-point
- *     - point-to-point-layout
- *     - propagation
- *     - spectrum
- *     - stats
- *     - tap-bridge
- *     - traffic-control
- *     - test
- *     - topology-read
- *     - uan
- *     - virtual-net-device
- *     - visualizer
- *     - wifi
- *     - wimax
+ * @section topics-sec Doxygen groups
  *
+ * The ns-3 library is split across many modules, and the Doxygen for these modules is typically
+ * added to <a href ="https://www.doxygen.nl/manual/grouping.html">Doxygen groups</a>.
+ * These groupings can be browsed under the <b><a href="topics.html">Topics</a></b> tab.
  */
 
 /**
- * \namespace ns3
- * \brief Every class exported by the ns3 library is enclosed in the
+ * @namespace ns3
+ * @brief Every class exported by the ns3 library is enclosed in the
  * ns3 namespace.
  */
 
 /**
- * \name Macros defined by the build system.
+ * @name Macros defined by the build system.
  *
  * These have to be visible for doxygen to document them,
  * so we put them here in a file only seen by doxygen, not the compiler.
@@ -87,9 +48,9 @@
  * @{
  */
 /**
- * \ingroup assert
+ * @ingroup assert
  *
- * \def NS3_ASSERT_ENABLE
+ * @def NS3_ASSERT_ENABLE
  *
  * Enable asserts at compile time.
  *
@@ -98,9 +59,9 @@
 #define NS3_ASSERT_ENABLE
 
 /**
- * \ingroup logging
+ * @ingroup logging
  *
- * \def NS3_LOG_ENABLE
+ * @def NS3_LOG_ENABLE
  *
  * Enable logging at compile time.
  *
@@ -111,10 +72,10 @@
 /**@}*/
 
 /**
- * \page EnvironVar All Environment Variables
+ * @page EnvironVar All Environment Variables
  *
  * All environment variables used by ns-3 are documented by module.
  *
- * \section environcore Core Environment Variables
+ * @section environcore Core Environment Variables
  * See \ref core-environ
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/doc/manual/Makefile ns-3.44/doc/manual/Makefile
--- ns-3.43/doc/manual/Makefile	2024-10-09 16:41:09.768655500 -0700
+++ ns-3.44/doc/manual/Makefile	2025-03-09 16:55:49.235370600 -0700
@@ -1,6 +1,6 @@
 EPSTOPDF = epstopdf
 DIA = dia
-CONVERT = convert
+CONVERT = convert -density 300
 
 SRC = ../../src
 # Temporary source directory, for build
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/doc/manual/source/attributes.rst ns-3.44/doc/manual/source/attributes.rst
--- ns-3.43/doc/manual/source/attributes.rst	2024-10-09 16:41:09.800655600 -0700
+++ ns-3.44/doc/manual/source/attributes.rst	2025-03-09 16:55:49.267370700 -0700
@@ -893,7 +893,7 @@
         .AddAttribute("Time",
                       "Change current direction and speed after moving for this delay.",
                       // etc (more parameters).
-                      TimeValue(Seconds(1.0)),
+                      TimeValue(Seconds(1)),
                       MakeTimeAccessor(&MyMobility::m_modeTime),
                       MakeTimeChecker())
         ;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/doc/manual/source/conf.py ns-3.44/doc/manual/source/conf.py
--- ns-3.43/doc/manual/source/conf.py	2024-10-09 16:41:36.356755000 -0700
+++ ns-3.44/doc/manual/source/conf.py	2025-03-09 16:56:09.315445400 -0700
@@ -74,9 +74,9 @@
 # built documents.
 #
 # The short X.Y version.
-version = "ns-3.43"
+version = "ns-3.44"
 # The full version, including alpha/beta/rc tags.
-release = "ns-3.43"
+release = "ns-3.44"
 
 # 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.43/doc/manual/source/documentation.rst ns-3.44/doc/manual/source/documentation.rst
--- ns-3.43/doc/manual/source/documentation.rst	2024-10-09 16:41:09.800655600 -0700
+++ ns-3.44/doc/manual/source/documentation.rst	2025-03-09 16:55:49.271370600 -0700
@@ -299,17 +299,17 @@
    *  Explain what the class or method does, using what algorithm.
    *  Explain the units of arguments and return values.
    *
-   *  \note Note any limitations or gotchas.
+   *  @note Note any limitations or gotchas.
    *
    *  (For functions with arguments or return valued:)
-   *  \param [in] foo Brief noun phrase describing this argument. Note
+   *  @param [in] foo Brief noun phrase describing this argument. Note
    *                  that we indicate if the argument is input,
    *                  output, or both.
-   *  \param [in,out] bar Note Sentence case, and terminating period.
-   *  \param [in] baz Indicate boolean values with \c true or \c false.
-   *  \return Brief noun phrase describing the value.
+   *  @param [in,out] bar Note Sentence case, and terminating period.
+   *  @param [in] baz Indicate boolean values with \c true or \c false.
+   *  @return Brief noun phrase describing the value.
    *
-   *  \internal
+   *  @internal
    *
    *  You can also discuss internal implementation details.
    *  Understanding this material shouldn't be necessary to using
@@ -335,7 +335,7 @@
 
 * Use sentence case, including the initial capital.
 * Use punctuation, especially \`.'s at the end of sentences or phrases.
-* The ``\brief`` tag is not needed; the first sentence will be
+* The ``@brief`` tag is not needed; the first sentence will be
     used as the brief description.
 
 Every class, method, typedef, member variable, function argument
@@ -522,10 +522,10 @@
 
 * Use Doxygen ``Modules`` to group related items.
 
-  In the main header for a module, create a Doxgyen group::
+  In the main header for a module, create a Doxygen group::
 
     /**
-     *  \defgroup foo Foo protocol.
+     *  @defgroup foo Foo protocol.
      *  Implementation of the Foo protocol.
      */
 
@@ -536,23 +536,23 @@
 * Document each file, assigning it to the relevant group.  In a header file::
 
     /**
-     *  \file
-     *  \ingroup foo
+     *  @file
+     *  @ingroup foo
      *  Class Foo declaration.
      */
 
   or in the corresponding ``.cc`` file::
 
     /**
-     *  \file
-     *  \ingroup foo
+     *  @file
+     *  @ingroup foo
      *  Class FooBar implementation.
      */
 
 * Mark each associated class as belonging to the group::
 
     /**
-     *  \ingroup foo
+     *  @ingroup foo
      *
      *  FooBar packet type.
      */
@@ -564,27 +564,27 @@
     /**
      *  Bar callback function signature.
      *
-     *  \param ale The size of a pint of ale, in Imperial ounces.
+     *  @param ale The size of a pint of ale, in Imperial ounces.
      */
     typedef void (* BarCallback)(const int ale);
 
 * Copy the ``Attribute`` help strings from the ``GetTypeId`` method to use
   as the brief descriptions of associated members.
 
-* ``\bugid{298}`` will create a link to bug 298 in our Bugzilla.
+* ``@bugid{298}`` will create a link to bug 298 in our Bugzilla.
 
-* ``\p foo`` in a description will format ``foo``
-  the same as the ``\param foo`` parameter, making it clear that you
+* ``@p foo`` in a description will format ``foo``
+  the same as the ``@param foo`` parameter, making it clear that you
   are referring to an actual argument.
 
-* ``\RFC{301}`` will create a link to RFC 301.
+* ``@RFC{301}`` will create a link to RFC 301.
 
-* Document the direction of function arguments with ``\param [in]``, *etc*.
+* Document the direction of function arguments with ``@param [in]``, *etc*.
   The allowed values of the direction token are ``[in]``, ``[out]``, and
   ``[in,out]`` (note the explicit square brackets), as discussed in the
-  Doxygen docs for ``\param``.
+  Doxygen docs for ``@param``.
 
-* Document template arguments with ``\tparam``, just as you use ``\param``
+* Document template arguments with ``@tparam``, just as you use ``@param``
   for function arguments.
 
 * For template arguments, indicate if they will be deduced or must be given
@@ -598,15 +598,15 @@
      */
     template <typename T, typename U> T Function(U a);
 
-  * Use ``\tparam U \deduced`` because the type ``U`` can be deduced at
+  * Use ``@tparam U @deduced`` because the type ``U`` can be deduced at
     the site where the template is invoked.  Basically deduction can only
     be done for function arguments.
 
-  * Use ``\tparam T \explicit`` because the type ``T`` can't be deduced;
+  * Use ``@tparam T @explicit`` because the type ``T`` can't be deduced;
     it must be given explicitly at the invocation site, as in
     ``Create<MyObject>(...)``
 
-* ``\internal`` should be used only to set off a discussion of implementation
+* ``@internal`` should be used only to set off a discussion of implementation
   details, not to mark ``private`` functions (they are already marked,
   as ``private``!)
 
@@ -636,6 +636,6 @@
 
     /**
      *  Register this type.
-     *  \return The object TypeId.
+     *  @return The object TypeId.
      */
     static TypeId GetTypeId();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/doc/manual/source/logging-asserts.rst ns-3.44/doc/manual/source/logging-asserts.rst
--- ns-3.43/doc/manual/source/logging-asserts.rst	2024-10-09 16:41:09.804655600 -0700
+++ ns-3.44/doc/manual/source/logging-asserts.rst	2025-03-09 16:55:49.271370600 -0700
@@ -448,8 +448,41 @@
 that logging is only enabled in ``debug``, ``default`` and ``relwithdebinfo``
 builds, so this macro will only produce output in the same builds.
 
-The |ns3| model libraries do not typically use the ``NS_LOG_UNCOND(...)`` macro;
-it is provided for users for assistance with debugging.
+The |ns3| model libraries do not use the ``NS_LOG_UNCOND(...)`` macro;
+it is provided for users for assistance with debugging.  The most common
+use case is if a user is debugging some code and doesn't want to enable
+all log macros in a file because it would produce too much output. Instead,
+selected log statements can temporarily be changed from, e.g., ``NS_LOG_DEBUG(...)`` to ``NS_LOG_UNCOND(...)`` for the duration of the debugging session.
+Don't forget to undo such a change before committing a bug fix.
+
+Logging Blocks of Code
+======================
+
+Sometimes the calculations of variables to be included in a log statement is
+involved and may not easily fit into a single ``NS_LOG`` statement.
+The variables can raise compilation warnings when the logging is disabled, and
+in any case, any unnecessary operations should be avoided.  For this situation,
+authors can include a block of code in logging using the
+`#ifdef NS3_LOG_ENABLE`` macro, as demonstrated in the sample below.
+
+::
+
+  #ifdef NS3_LOG_ENABLE
+  {
+      // Expensive calculation that is only used for logging
+      int total = 0;
+      for (const auto& v : myVector)
+      {
+          total += complexCalculation(v);
+      }
+
+      NS_LOG_DEBUG("Total: " << total);
+  }
+  #endif // NS3_LOG_ENABLE
+
+Please remember to check that any such complicated logging statements have no
+side effects that would cause different simulation execution in optimized
+builds.
 
 Guidelines
 ==========
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/doc/manual/source/python.rst ns-3.44/doc/manual/source/python.rst
--- ns-3.43/doc/manual/source/python.rst	2024-10-09 16:41:09.804655600 -0700
+++ ns-3.44/doc/manual/source/python.rst	2025-03-09 16:55:49.271370600 -0700
@@ -38,11 +38,87 @@
 are only built on-demand by Cppyy, and only if the user enables them in the
 configuration of |ns3|.
 
-Due to an `upstream limitation with Cppyy <https://github.com/wlav/cppyy/issues/150>`_, Python bindings do not work on macOS machines with Apple silicon (M1 and M2 processors).
-
 Prior to ns-3.37, the previous Python bindings framework was based on
 `Pybindgen <https://github.com/gjcarneiro/pybindgen>`_.
 
+Python virtual environment
+**************************
+
+According to `PEP 668 <https://peps.python.org/pep-0668/>`_ it is a best practice
+to create a virtual environment for each new Python project. This isolates and
+simplifies dependency management. This is done via Python virtual environments (VENV).
+
+Trying to pip install cppyy, required for ns-3 python bindings, system-wide will
+likely result in the following error message:
+
+.. sourcecode:: console
+
+  ~$ pip install cppyy
+  error: externally-managed-environment
+
+  x This environment is externally managed
+  └─> To install Python packages system-wide, try apt install
+      python3-xyz, where xyz is the package you are trying to
+      install.
+
+      If you wish to install a non-Debian-packaged Python package,
+      create a virtual environment using python3 -m venv path/to/venv.
+      Then use path/to/venv/bin/python and path/to/venv/bin/pip. Make
+      sure you have python3-full installed.
+
+      If you wish to install a non-Debian packaged Python application,
+      it may be easiest to use pipx install xyz, which will manage a
+      virtual environment for you. Make sure you have pipx installed.
+
+      See /usr/share/doc/python3.12/README.venv for more information.
+
+  note: If you believe this is a mistake, please contact your Python
+        installation or OS distribution provider. You can override this,
+        at the risk of breaking your Python installation or OS, by
+        passing --break-system-packages.
+  hint: See PEP 668 for the detailed specification.
+
+While it is possible to ignore it via the ``--break-system-packages``
+that can cause packages required by **your operating system to fail**.
+You can check this is actually the case by running pip freeze, which
+will list multiple pip packages installed along the OS.
+
+.. sourcecode:: console
+
+   ~$ pip freeze
+   ...
+   ubuntu-pro-client==8001
+   ...
+
+Therefore, it is recommended you create a virtual environment and use it.
+This can be done with the following command:
+
+.. sourcecode:: console
+
+   ~$ python3 -m venv myEnv
+
+Note: if you don't have it installed, you will need to install it either
+either via the system package manager, or via pip itself.
+
+After creating the venv, it is necessary to activate it, to properly
+set environment variables that will treat it as the active python installation.
+
+.. sourcecode:: console
+
+   ~$ source ~/myEnv/bin/activate
+   (myEnv) ~$ whereis python
+   python: ~/myEnv/bin/python
+   (myEnv) ~$ pip freeze
+   (myEnv) ~$
+
+From this point onwards, it is assumed all python commands are executed
+from within a virtual environment (venv).
+
+Note: When configuring ns-3 python bindings from source, make sure to
+activate the venv before configuring. The appropriate Python venv will be
+passed to CMake for proper configuration and used by the ns-3 script to
+execute scripts. This includes python scripts called by C++ programs.
+
 An Example Python Script that Runs |ns3|
 ****************************************
 
@@ -76,18 +152,18 @@
   echoServer = ns.UdpEchoServerHelper(9)
 
   serverApps = echoServer.Install(nodes.Get(1))
-  serverApps.Start(ns.Seconds(1.0))
-  serverApps.Stop(ns.Seconds(10.0))
+  serverApps.Start(ns.Seconds(1))
+  serverApps.Stop(ns.Seconds(10))
 
   address = interfaces.GetAddress(1).ConvertTo()
   echoClient = ns.UdpEchoClientHelper(address, 9)
   echoClient.SetAttribute("MaxPackets", ns.UintegerValue(1))
-  echoClient.SetAttribute("Interval", ns.TimeValue(ns.Seconds(1.0)))
+  echoClient.SetAttribute("Interval", ns.TimeValue(ns.Seconds(1)))
   echoClient.SetAttribute("PacketSize", ns.UintegerValue(1024))
 
   clientApps = echoClient.Install(nodes.Get(0))
-  clientApps.Start(ns.Seconds(2.0))
-  clientApps.Stop(ns.Seconds(10.0))
+  clientApps.Start(ns.Seconds(2))
+  clientApps.Stop(ns.Seconds(10))
 
   ns.Simulator.Run()
   ns.Simulator.Destroy()
@@ -179,6 +255,26 @@
   $ python3 /path/to/your/example/my-script.py
 
 
+Debugging bindings build from source in IDEs
+############################################
+
+In many cases, you may want to debug your python script using an IDE.
+To properly configure ns-3 python bindings from source, you will need to do one of two:
+
+1. Setup ``PATH`` and ``PYTHONPATH`` environment variables to point to
+   ``ns-3-dev/build/lib`` and ``ns-3-dev/build/bindings/python`` respectively.
+2. Add the following Python code snipped before importing the ns-3 bindings
+
+.. sourcecode:: python
+
+  import sys
+  # paths assume the current python script (__file__)
+  # is executed from outside the ns-3-dev directory
+  sys.path.append("./ns-3-dev/build/bindings/python")
+  sys.path.append("./ns-3-dev/build/lib")
+  from ns import ns
+
+
 Using the pip wheel
 ===================
 
@@ -266,17 +362,17 @@
   echoServer = ns.UdpEchoServerHelper(9)
 
   serverApps = echoServer.Install(csmaNodes.Get(0))
-  serverApps.Start(ns.Seconds(1.0))
-  serverApps.Stop(ns.Seconds(10.0))
+  serverApps.Start(ns.Seconds(1))
+  serverApps.Stop(ns.Seconds(10))
 
   echoClient = ns.UdpEchoClientHelper(csmaInterfaces.GetAddress(0).ConvertTo(), 9)
   echoClient.SetAttribute("MaxPackets", ns.UintegerValue(10))
-  echoClient.SetAttribute("Interval", ns.TimeValue(ns.Seconds(1.0)))
+  echoClient.SetAttribute("Interval", ns.TimeValue(ns.Seconds(1)))
   echoClient.SetAttribute("PacketSize", ns.UintegerValue(1024))
 
   clientApps = echoClient.Install(csmaNodes.Get(1))
-  clientApps.Start(ns.Seconds(2.0))
-  clientApps.Stop(ns.Seconds(10.0))
+  clientApps.Start(ns.Seconds(2))
+  clientApps.Stop(ns.Seconds(10))
 
   # Populate routing tables
   ns.Ipv4GlobalRoutingHelper.PopulateRoutingTables()
@@ -388,7 +484,7 @@
 
   cmd = ns.CommandLine(__file__)
   # in the real implementation, the buffer size of 21+1 bytes containing SHORT_STRING_CONTENTS\0 is passed
-  # we use the entire size of the memory contents for demonstration purposses
+  # we use the entire size of the memory contents for demonstration purposes
   cmd.AddValue("shortString", "", shortStringBuffer, 75)
 
   print("Memory contents before the memory corruption")
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/doc/manual/source/working-with-cmake.rst ns-3.44/doc/manual/source/working-with-cmake.rst
--- ns-3.43/doc/manual/source/working-with-cmake.rst	2024-10-09 16:41:09.804655600 -0700
+++ ns-3.44/doc/manual/source/working-with-cmake.rst	2025-03-09 16:55:49.271370600 -0700
@@ -415,6 +415,68 @@
 
 More information on how to create a new module are provided in :ref:`Adding a New Module to ns3`.
 
+Note: Advanced users who wish to organize their custom contrib modules outside the
+`ns-3-dev/contrib` directory can take advantage of a feature introduced in ns-3.44.
+The build system now also scans for contrib modules in a dedicated ns-3-external-contrib folder.
+This approach simplifies managing a top-level project that handles multiple repositories
+without requiring explicit dependencies between them.
+
+You should have a source tree like the following:
+
+.. sourcecode:: console
+
+   $ tree -d -L 3
+   .
+   ├── ns-3-dev
+   │   ├── LICENSES
+   │   ├── bindings
+   │   │   └── python
+   │   ├── build-support
+   │   │   ├── 3rd-party
+   │   │   ├── custom-modules
+   │   │   ├── pip-wheel
+   │   │   └── test-files
+   │   ├── contrib
+   │   ├── doc
+   │   │   ├── contributing
+   │   │   ├── ...
+   │   │   └── tutorial
+   │   ├── examples
+   │   │   ├── channel-models
+   │   │   ├── ...
+   │   │   └── wireless
+   │   ├── scratch
+   │   │   ├── nested-subdir
+   │   │   ├── ...
+   │   │   └── subdir2
+   │   ├── src
+   │   │   ├── antenna
+   │   │   ├── ...
+   │   │   ├── wifi
+   │   │   └── wimax
+   │   ├── third-party
+   │   └── utils
+   │       ├── perf
+   │       └── tests
+   └── ns-3-external-contrib
+       └── nr
+           ├── LICENSES
+           ├── doc
+           ├── examples
+           ├── helper
+           ├── model
+           ├── test
+           ├── tools
+           ├── tutorial
+           └── utils
+
+The module will be automatically mapped to `ns-3-dev/contrib`, as if it was part
+of the typical contrib module location. No copying or symlink required.
+
+Note: For that to always work, you may need to adjust paths dependent on
+CMAKE_CURRENT_SOURCE_DIR, if using custom CMake constructs instead of the
+ns-3 macros.
+
 Migrating a Waf module to CMake
 *******************************
 
@@ -2855,7 +2917,7 @@
     else()
       # If it is false, we add necessary C++ definitions (e.g. NS3_MPI)
       message(STATUS "MPI was found.")
-      add_definitions(-DNS3_MPI)
+      target_compile_definitions(MPI::MPI_CXX INTERFACE NS3_MPI)
 
       # Then set ENABLE_MPI to TRUE, which can be used to check
       # if NS3_MPI is enabled AND MPI was found
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/doc/models/Makefile ns-3.44/doc/models/Makefile
--- ns-3.43/doc/models/Makefile	2024-10-09 16:41:09.804655600 -0700
+++ ns-3.44/doc/models/Makefile	2025-03-09 16:55:49.275370600 -0700
@@ -1,6 +1,6 @@
 EPSTOPDF = epstopdf
 DIA = dia
-CONVERT = convert
+CONVERT = convert -density 300
 
 SRC = ../../src
 # Temporary source directory, for build
@@ -100,6 +100,7 @@
 	$(SRC)/flow-monitor/doc/flow-monitor.rst \
 	$(SRC)/sixlowpan/doc/sixlowpan.rst \
 	$(SRC)/lr-wpan/doc/lr-wpan.rst \
+	$(SRC)/zigbee/doc/zigbee.rst \
 
 # list all model library figure files that need to be copied to
 # $SOURCETEMP/figures.  For each figure to be included in all
@@ -148,6 +149,7 @@
 	$(SRC)/wifi/doc/source/figures/ack-su-format.png \
 	$(SRC)/wifi/doc/source/figures/assoc-manager.eps \
 	$(SRC)/wifi/doc/source/figures/emlsr-dl-txop.eps \
+	$(SRC)/wifi/doc/source/figures/emlsr-txop-ended-trace.eps \
 	$(SRC)/wifi/doc/source/figures/emlsr-ul-txop.eps \
 	$(SRC)/wifi/doc/source/figures/mu-bar.pdf \
 	$(SRC)/wifi/doc/source/figures/mu-bar.png \
@@ -370,7 +372,10 @@
 	$(SRC)/energy/doc/figures/leadacid.png \
 	$(SRC)/energy/doc/figures/liion.png \
 	$(SRC)/energy/doc/figures/nicd.png \
-	$(SRC)/energy/doc/figures/nimh.png
+	$(SRC)/energy/doc/figures/nimh.png \
+	$(SRC)/zigbee/doc/figures/zigbeeStackArch.dia \
+	$(SRC)/zigbee/doc/figures/manyToOne.dia \
+	$(SRC)/zigbee/doc/figures/mesh.dia
 
 # specify figures from which .png and .pdf figures need to be
 # generated (all dia and eps figures)
@@ -472,6 +477,7 @@
 	$(FIGURES)/clear-channel.eps \
 	$(FIGURES)/assoc-manager.eps \
 	$(FIGURES)/emlsr-dl-txop.eps \
+	$(FIGURES)/emlsr-txop-ended-trace.eps \
 	$(FIGURES)/emlsr-ul-txop.eps \
 	$(FIGURES)/nist-frame-success-rate.eps \
 	$(FIGURES)/nist-frame-success-rate-n.eps \
@@ -492,6 +498,9 @@
 	$(FIGURES)/lte-test-rlf-two-enb.eps \
 	$(FIGURES)/lena-radio-link-failure-one-enb.eps \
 	$(FIGURES)/lena-radio-link-failure-two-enb.eps \
+	$(FIGURES)/zigbeeStackArch.eps \
+	$(FIGURES)/manyToOne.eps \
+	$(FIGURES)/mesh.eps
 
 # rescale pdf figures as necessary
 $(FIGURES)/testbed.pdf_width = 5in
@@ -553,7 +562,11 @@
 $(FIGURES)/nist-frame-success-rate-ax.pdf_width = 12cm
 $(FIGURES)/assoc-manager.pdf_width = 12cm
 $(FIGURES)/emlsr-dl-txop.pdf_width = 12cm
+$(FIGURES)/emlsr-txop-ended-trace.pdf_width = 8cm
 $(FIGURES)/emlsr-ul-txop.pdf_width = 12cm
+$(FIGURES)/zigbeeStackArch.pdf_width = 6cm
+$(FIGURES)/manyToOne.pdf_width = 6cm
+$(FIGURES)/mesh.pdf_width = 6cm
 
 IMAGES_PNG = ${IMAGES_EPS:.eps=.png}
 IMAGES_PDF = ${IMAGES_EPS:.eps=.pdf}
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/doc/models/source/conf.py ns-3.44/doc/models/source/conf.py
--- ns-3.43/doc/models/source/conf.py	2024-10-09 16:41:36.356755000 -0700
+++ ns-3.44/doc/models/source/conf.py	2025-03-09 16:56:09.315445400 -0700
@@ -74,9 +74,9 @@
 # built documents.
 #
 # The short X.Y version.
-version = "ns-3.43"
+version = "ns-3.44"
 # The full version, including alpha/beta/rc tags.
-release = "ns-3.43"
+release = "ns-3.44"
 
 # 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.43/doc/models/source/index.rst ns-3.44/doc/models/source/index.rst
--- ns-3.43/doc/models/source/index.rst	2024-10-09 16:41:09.804655600 -0700
+++ ns-3.44/doc/models/source/index.rst	2025-03-09 16:55:49.275370600 -0700
@@ -62,3 +62,4 @@
    uan
    wifi
    wimax
+   zigbee
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/doc/ns3_html_theme/layout.html.license ns-3.44/doc/ns3_html_theme/layout.html.license
--- ns-3.43/doc/ns3_html_theme/layout.html.license	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/doc/ns3_html_theme/layout.html.license	2025-03-09 16:55:49.275370600 -0700
@@ -0,0 +1,2 @@
+Copyright 2012 by ns-3
+SPDX-License-Identifier: GPL-2.0-only
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/doc/ns3_html_theme/static/default.css_t.license ns-3.44/doc/ns3_html_theme/static/default.css_t.license
--- ns-3.43/doc/ns3_html_theme/static/default.css_t.license	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/doc/ns3_html_theme/static/default.css_t.license	2025-03-09 16:55:49.275370600 -0700
@@ -0,0 +1,2 @@
+Copyright 2007-2011 by the Sphinx team
+SPDX-License-Identifier: BSD-2-Clause
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/doc/ns3_html_theme/static/drop-down-menu.js.license ns-3.44/doc/ns3_html_theme/static/drop-down-menu.js.license
--- ns-3.43/doc/ns3_html_theme/static/drop-down-menu.js.license	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/doc/ns3_html_theme/static/drop-down-menu.js.license	2025-03-09 16:55:49.275370600 -0700
@@ -0,0 +1,2 @@
+Copyright 2006-2007 javascript-array.com
+SPDX-License-Identifier: BSD-3-Clause
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/doc/ns3_html_theme/static/sidebar.js.license ns-3.44/doc/ns3_html_theme/static/sidebar.js.license
--- ns-3.43/doc/ns3_html_theme/static/sidebar.js.license	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/doc/ns3_html_theme/static/sidebar.js.license	2025-03-09 16:55:49.275370600 -0700
@@ -0,0 +1,2 @@
+Copyright 2007-2011 by the Sphinx team
+SPDX-License-Identifier: BSD-2-Clause
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/doc/tutorial/Makefile ns-3.44/doc/tutorial/Makefile
--- ns-3.43/doc/tutorial/Makefile	2024-10-09 16:41:09.808655500 -0700
+++ ns-3.44/doc/tutorial/Makefile	2025-03-09 16:55:49.275370600 -0700
@@ -1,5 +1,8 @@
 # Makefile for Sphinx documentation
 #
+EPSTOPDF = epstopdf
+DIA = dia
+CONVERT = convert -density 300
 
 # You can set these variables from the command line.
 SPHINXOPTS    = -W --keep-going
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/doc/tutorial/source/building-topologies.rst ns-3.44/doc/tutorial/source/building-topologies.rst
--- ns-3.43/doc/tutorial/source/building-topologies.rst	2024-10-09 16:41:09.836655600 -0700
+++ ns-3.44/doc/tutorial/source/building-topologies.rst	2025-03-09 16:55:49.327371000 -0700
@@ -245,8 +245,8 @@
   UdpEchoServerHelper echoServer(9);
 
   ApplicationContainer serverApps = echoServer.Install(csmaNodes.Get(nCsma));
-  serverApps.Start(Seconds(1.0));
-  serverApps.Stop(Seconds(10.0));
+  serverApps.Start(Seconds(1));
+  serverApps.Stop(Seconds(10));
 
 Recall that the ``csmaNodes NodeContainer`` contains one of the
 nodes created for the point-to-point network and ``nCsma`` "extra" nodes.
@@ -269,12 +269,12 @@
 
   UdpEchoClientHelper echoClient(csmaInterfaces.GetAddress(nCsma), 9);
   echoClient.SetAttribute("MaxPackets", UintegerValue(1));
-  echoClient.SetAttribute("Interval", TimeValue(Seconds(1.0)));
+  echoClient.SetAttribute("Interval", TimeValue(Seconds(1)));
   echoClient.SetAttribute("PacketSize", UintegerValue(1024));
 
   ApplicationContainer clientApps = echoClient.Install(p2pNodes.Get(0));
-  clientApps.Start(Seconds(2.0));
-  clientApps.Stop(Seconds(10.0));
+  clientApps.Start(Seconds(2));
+  clientApps.Stop(Seconds(10));
 
 Since we have actually built an internetwork here, we need some form of
 internetwork routing.  |ns3| provides what we call global routing to
@@ -1150,8 +1150,8 @@
   UdpEchoServerHelper echoServer(9);
 
   ApplicationContainer serverApps = echoServer.Install(csmaNodes.Get(nCsma));
-  serverApps.Start(Seconds(1.0));
-  serverApps.Stop(Seconds(10.0));
+  serverApps.Start(Seconds(1));
+  serverApps.Stop(Seconds(10));
 
 And we put the echo client on the last STA node we created, pointing it to
 the server on the CSMA network.  We have also seen similar operations before.
@@ -1160,13 +1160,13 @@
 
   UdpEchoClientHelper echoClient(csmaInterfaces.GetAddress(nCsma), 9);
   echoClient.SetAttribute("MaxPackets", UintegerValue(1));
-  echoClient.SetAttribute("Interval", TimeValue(Seconds(1.0)));
+  echoClient.SetAttribute("Interval", TimeValue(Seconds(1)));
   echoClient.SetAttribute("PacketSize", UintegerValue(1024));
 
   ApplicationContainer clientApps =
       echoClient.Install(wifiStaNodes.Get(nWifi - 1));
-  clientApps.Start(Seconds(2.0));
-  clientApps.Stop(Seconds(10.0));
+  clientApps.Start(Seconds(2));
+  clientApps.Stop(Seconds(10));
 
 Since we have built an internetwork here, we need to enable internetwork routing
 just as we did in the ``second.cc`` example script.
@@ -1186,7 +1186,7 @@
 
 ::
 
-  Simulator::Stop(Seconds(10.0));
+  Simulator::Stop(Seconds(10));
 
 We create just enough tracing to cover all three networks:
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/doc/tutorial/source/conceptual-overview.rst ns-3.44/doc/tutorial/source/conceptual-overview.rst
--- ns-3.43/doc/tutorial/source/conceptual-overview.rst	2024-10-09 16:41:09.836655600 -0700
+++ ns-3.44/doc/tutorial/source/conceptual-overview.rst	2025-03-09 16:55:49.327371000 -0700
@@ -554,8 +554,8 @@
     UdpEchoServerHelper echoServer(9);
 
     ApplicationContainer serverApps = echoServer.Install(nodes.Get(1));
-    serverApps.Start(Seconds(1.0));
-    serverApps.Stop(Seconds(10.0));
+    serverApps.Start(Seconds(1));
+    serverApps.Stop(Seconds(10));
 
 The first line of code in the above snippet declares the
 ``UdpEchoServerHelper``.  As usual, this isn't the application itself, it
@@ -600,8 +600,8 @@
 
 ::
 
-    serverApps.Start(Seconds(1.0));
-    serverApps.Stop(Seconds(10.0));
+    serverApps.Start(Seconds(1));
+    serverApps.Stop(Seconds(10));
 
 will cause the echo server application to ``Start`` (enable itself) at one
 second into the simulation and to ``Stop`` (disable itself) at ten seconds
@@ -620,12 +620,12 @@
 
     UdpEchoClientHelper echoClient(interfaces.GetAddress(1), 9);
     echoClient.SetAttribute("MaxPackets", UintegerValue(1));
-    echoClient.SetAttribute("Interval", TimeValue(Seconds(1.0)));
+    echoClient.SetAttribute("Interval", TimeValue(Seconds(1)));
     echoClient.SetAttribute("PacketSize", UintegerValue(1024));
 
     ApplicationContainer clientApps = echoClient.Install(nodes.Get(0));
-    clientApps.Start(Seconds(2.0));
-    clientApps.Stop(Seconds(10.0));
+    clientApps.Start(Seconds(2));
+    clientApps.Stop(Seconds(10));
 
 For the echo client, however, we need to set five different ``Attributes``.
 The first two ``Attributes`` are set during construction of the
@@ -668,11 +668,11 @@
 
 ::
 
-    serverApps.Start(Seconds(1.0));
-    serverApps.Stop(Seconds(10.0));
+    serverApps.Start(Seconds(1));
+    serverApps.Stop(Seconds(10));
     ...
-    clientApps.Start(Seconds(2.0));
-    clientApps.Stop(Seconds(10.0));
+    clientApps.Start(Seconds(2));
+    clientApps.Stop(Seconds(10));
 
 we actually scheduled events in the simulator at 1.0 seconds, 2.0 seconds and
 two events at 10.0 seconds.  When ``Simulator::Run`` is called, the system
@@ -758,7 +758,7 @@
 
 ::
 
-  +  Simulator::Stop(Seconds(11.0));
+  +  Simulator::Stop(Seconds(11));
      Simulator::Run();
      Simulator::Destroy();
      return 0;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/doc/tutorial/source/conf.py ns-3.44/doc/tutorial/source/conf.py
--- ns-3.43/doc/tutorial/source/conf.py	2024-10-09 16:41:36.356755000 -0700
+++ ns-3.44/doc/tutorial/source/conf.py	2025-03-09 16:56:09.315445400 -0700
@@ -71,9 +71,9 @@
 # built documents.
 #
 # The short X.Y version.
-version = "ns-3.43"
+version = "ns-3.44"
 # The full version, including alpha/beta/rc tags.
-release = "ns-3.43"
+release = "ns-3.44"
 
 # 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.43/doc/tutorial/source/getting-started.rst ns-3.44/doc/tutorial/source/getting-started.rst
--- ns-3.43/doc/tutorial/source/getting-started.rst	2024-10-09 16:41:09.836655600 -0700
+++ ns-3.44/doc/tutorial/source/getting-started.rst	2025-03-09 16:55:49.327371000 -0700
@@ -61,7 +61,7 @@
 for various systems, available at
 https://www.nsnam.org/docs/installation/html/index.html.
 
-As of the most recent |ns3| release (ns-3.43), the following tools
+As of the most recent |ns3| release (ns-3.44), the following tools
 are needed to get started with |ns3|:
 
 ============  ===========================================================
@@ -116,21 +116,21 @@
   $ cd
   $ mkdir workspace
   $ cd workspace
-  $ wget https://www.nsnam.org/release/ns-allinone-3.43.tar.bz2
-  $ tar xjf ns-allinone-3.43.tar.bz2
+  $ wget https://www.nsnam.org/release/ns-allinone-3.44.tar.bz2
+  $ tar xjf ns-allinone-3.44.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.43``, you should see a number of files and directories
+``ns-allinone-3.44``, you should see a number of files and directories
 
 .. sourcecode:: text
 
-  $ cd ns-allinone-3.43
+  $ cd ns-allinone-3.44
   $ ls
-  bake  build.py  constants.py  netanim-3.109 ns-3.43  README.md  util.py
+  bake  build.py  constants.py  netanim-3.109 ns-3.44  README.md  util.py
 
 You are now ready to build the base |ns3| distribution and may skip ahead
 to the section on building |ns3|.
@@ -180,7 +180,7 @@
 
 .. sourcecode:: console
 
-  $ python3 download.py -n ns-3.43
+  $ python3 download.py -n ns-3.44
 
 After this step, the additional repositories of |ns3|, bake, pybindgen,
 and netanim will be downloaded to the ``ns-3-allinone`` directory.
@@ -249,9 +249,9 @@
 
 There are a few configuration targets available:
 
-1.  ``ns-3.43``:  the code corresponding to the release
+1.  ``ns-3.44``:  the code corresponding to the release
 2.  ``ns-3-dev``:  a similar module but using the development code tree
-3.  ``ns-allinone-3.43``:  the module that includes other optional features
+3.  ``ns-allinone-3.44``:  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.
@@ -268,7 +268,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.43``.
+this tutorial example with ``ns-3.44``.
 
 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.
@@ -297,7 +297,7 @@
 
 .. sourcecode:: console
 
-  $ ./bake.py configure -e ns-allinone-3.43
+  $ ./bake.py configure -e ns-allinone-3.44
 
 Next, we'll ask bake to check whether we have enough tools to download
 various components.  Type:
@@ -347,7 +347,7 @@
   >> Downloading click-ns-3.37 - OK
   >> Downloading BRITE - OK
   >> Downloading openflow-dev - OK
-  >> Downloading ns-3.43 (target directory:ns-3.43) - OK
+  >> Downloading ns-3.44 (target directory:ns-3.44) - OK
 
 The above suggests that three sources have been downloaded.  Check the
 ``source`` directory now and type ``ls``; one should see:
@@ -356,7 +356,7 @@
 
   $ cd source
   $ ls
-  BRITE  click-ns-3.37  netanim-3.109  ns-3.43  openflow-dev
+  BRITE  click-ns-3.37  netanim-3.109  ns-3.44  openflow-dev
 
 You are now ready to build the |ns3| distribution.
 
@@ -386,7 +386,7 @@
 
 If you downloaded
 using a tarball you should have a directory called something like
-``ns-allinone-3.43`` under your ``~/workspace`` directory.
+``ns-allinone-3.44`` under your ``~/workspace`` directory.
 Type the following:
 
 .. sourcecode:: console
@@ -419,7 +419,7 @@
 .. sourcecode:: text
 
   >> Building netanim-3.109 - OK
-  >> Building ns-3.43 - OK
+  >> Building ns-3.44 - OK
 
 There may be failures to build all components, but the build will proceed
 anyway if the component is optional.
@@ -728,7 +728,7 @@
 a new major version of gcc (gcc-8).  Building ns-3.28 or older releases
 on Fedora 28, when GTK+2 is installed, will result in an error such as::
 
-  /usr/include/gtk-2.0/gtk/gtkfilechooserbutton.h:59:8: error: unnecessary parentheses in declaration of ‘__gtk_reserved1’ [-Werror=parentheses]
+  /usr/include/gtk-2.0/gtk/gtkfilechooserbutton.h:59:8: error: unnecessary parentheses in declaration of '__gtk_reserved1' [-Werror=parentheses]
    void (*__gtk_reserved1);
 
 In releases starting with ns-3.28.1, an option is available in CMake to work
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/doc/tutorial/source/quick-start.rst ns-3.44/doc/tutorial/source/quick-start.rst
--- ns-3.43/doc/tutorial/source/quick-start.rst	2024-10-09 16:41:09.836655600 -0700
+++ ns-3.44/doc/tutorial/source/quick-start.rst	2025-03-09 16:55:49.327371000 -0700
@@ -64,13 +64,13 @@
 
    ::
 
-    $ tar xjf ns-allinone-3.43.tar.bz2
+    $ tar xjf ns-allinone-3.44.tar.bz2
 
 3) Change into the |ns3| directory directly; e.g.
 
    ::
 
-    $ cd ns-allinone-3.43/ns-3.43
+    $ cd ns-allinone-3.44/ns-3.44
 
 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.
@@ -92,12 +92,12 @@
 
   $ cd ns-3-dev
 
-If instead you want to try the most recent release (version 3.43 as of this
+If instead you want to try the most recent release (version 3.44 as of this
 writing), you can checkout a branch corresponding to that git tag:
 
 ::
 
-  $ git checkout -b ns-3.43-branch ns-3.43
+  $ git checkout -b ns-3.44-branch ns-3.44
 
 Building and testing ns-3
 *************************
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/doc/tutorial/source/tracing.rst ns-3.44/doc/tutorial/source/tracing.rst
--- ns-3.43/doc/tutorial/source/tracing.rst	2024-10-09 16:41:09.836655600 -0700
+++ ns-3.44/doc/tutorial/source/tracing.rst	2025-03-09 16:55:49.327371000 -0700
@@ -1518,8 +1518,8 @@
 (hopefully) familiar lines of an |ns3| script::
 
   ApplicationContainer apps = ...
-  apps.Start(Seconds(1.0));
-  apps.Stop(Seconds(10.0));
+  apps.Start(Seconds(1));
+  apps.Stop(Seconds(10));
 
 The application container code (see
 ``src/network/helper/application-container.h`` if you are interested)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/channel-models/three-gpp-v2v-channel-example.cc ns-3.44/examples/channel-models/three-gpp-v2v-channel-example.cc
--- ns-3.43/examples/channel-models/three-gpp-v2v-channel-example.cc	2024-10-09 16:41:09.836655600 -0700
+++ ns-3.44/examples/channel-models/three-gpp-v2v-channel-example.cc	2025-03-09 16:55:49.331370800 -0700
@@ -47,7 +47,7 @@
 static Ptr<ChannelConditionModel> m_condModel; //!< the ChannelConditionModel object
 
 /*
- * \brief A structure that holds the parameters for the ComputeSnr
+ * @brief A structure that holds the parameters for the ComputeSnr
  * function. In this way the problem with the limited
  * number of parameters of method Schedule is avoided.
  */
@@ -63,9 +63,9 @@
 
 /**
  * Perform the beamforming using the DFT beamforming method
- * \param thisDevice the device performing the beamforming
- * \param thisAntenna the antenna object associated to thisDevice
- * \param otherDevice the device towards which point the beam
+ * @param thisDevice the device performing the beamforming
+ * @param thisAntenna the antenna object associated to thisDevice
+ * @param otherDevice the device towards which point the beam
  */
 static void
 DoBeamforming(Ptr<NetDevice> thisDevice,
@@ -87,7 +87,7 @@
 
 /**
  * Compute the average SNR
- * \param params A structure that holds a bunch of parameters needed by ComputSnr function to
+ * @param params A structure that holds a bunch of parameters needed by ComputSnr function to
  * calculate the average SNR
  */
 static void
@@ -138,7 +138,7 @@
 /**
  * Generates a GNU-plottable file representing the buildings deployed in the
  * scenario
- * \param filename the name of the output file
+ * @param filename the name of the output file
  */
 void
 PrintGnuplottableBuildingListToFile(std::string filename)
@@ -254,7 +254,7 @@
         double vRx = vScatt / 2;
         txMob = CreateObject<WaypointMobilityModel>();
         rxMob = CreateObject<WaypointMobilityModel>();
-        Time nextWaypoint = Seconds(0.0);
+        Time nextWaypoint;
         txMob->GetObject<WaypointMobilityModel>()->AddWaypoint(
             Waypoint(nextWaypoint, Vector(maxAxisX / 2 - streetWidth / 2, 1.0, 1.5)));
         nextWaypoint += Seconds((maxAxisY - streetWidth) / 2 / vTx);
@@ -264,7 +264,7 @@
         nextWaypoint += Seconds((maxAxisX - streetWidth) / 2 / vTx);
         txMob->GetObject<WaypointMobilityModel>()->AddWaypoint(
             Waypoint(nextWaypoint, Vector(0.0, maxAxisY / 2 - streetWidth / 2, 1.5)));
-        nextWaypoint = Seconds(0.0);
+        nextWaypoint = Seconds(0);
         rxMob->GetObject<WaypointMobilityModel>()->AddWaypoint(
             Waypoint(nextWaypoint, Vector(maxAxisX / 2 - streetWidth / 2, 0.0, 1.5)));
         nextWaypoint += Seconds(maxAxisY / vRx);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/energy/energy-model-example.cc ns-3.44/examples/energy/energy-model-example.cc
--- ns-3.43/examples/energy/energy-model-example.cc	2024-10-09 16:41:09.836655600 -0700
+++ ns-3.44/examples/energy/energy-model-example.cc	2025-03-09 16:55:49.331370800 -0700
@@ -27,8 +27,8 @@
 /**
  * Print a received packet
  *
- * \param from sender address
- * \return a string with the details of the packet: dst {IP, port}, time.
+ * @param from sender address
+ * @return a string with the details of the packet: dst {IP, port}, time.
  */
 static inline std::string
 PrintReceivedPacket(Address& from)
@@ -43,7 +43,7 @@
 }
 
 /**
- * \param socket Pointer to socket.
+ * @param socket Pointer to socket.
  *
  * Packet receiving sink.
  */
@@ -62,11 +62,11 @@
 }
 
 /**
- * \param socket Pointer to socket.
- * \param pktSize Packet size.
- * \param n Pointer to node.
- * \param pktCount Number of packets to generate.
- * \param pktInterval Packet sending interval.
+ * @param socket Pointer to socket.
+ * @param pktSize Packet size.
+ * @param n Pointer to node.
+ * @param pktCount Number of packets to generate.
+ * @param pktInterval Packet sending interval.
  *
  * Traffic generator.
  */
@@ -97,8 +97,8 @@
 /**
  * Trace function for remaining energy at node.
  *
- * \param oldValue Old value
- * \param remainingEnergy New value
+ * @param oldValue Old value
+ * @param remainingEnergy New value
  */
 void
 RemainingEnergy(double oldValue, double remainingEnergy)
@@ -108,10 +108,10 @@
 }
 
 /**
- * \brief Trace function for total energy consumption at node.
+ * @brief Trace function for total energy consumption at node.
  *
- * \param oldValue Old value
- * \param totalEnergy New value
+ * @param oldValue Old value
+ * @param totalEnergy New value
  */
 void
 TotalEnergy(double oldValue, double totalEnergy)
@@ -275,7 +275,7 @@
                         numPackets,
                         interPacketInterval);
 
-    Simulator::Stop(Seconds(10.0));
+    Simulator::Stop(Seconds(10));
     Simulator::Run();
 
     for (auto iter = deviceModels.Begin(); iter != deviceModels.End(); iter++)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/energy/energy-model-with-harvesting-example.cc ns-3.44/examples/energy/energy-model-with-harvesting-example.cc
--- ns-3.43/examples/energy/energy-model-with-harvesting-example.cc	2024-10-09 16:41:09.836655600 -0700
+++ ns-3.44/examples/energy/energy-model-with-harvesting-example.cc	2025-03-09 16:55:49.331370800 -0700
@@ -56,8 +56,8 @@
 /**
  * Print a received packet
  *
- * \param from sender address
- * \return a string with the details of the packet: dst {IP, port}, time.
+ * @param from sender address
+ * @return a string with the details of the packet: dst {IP, port}, time.
  */
 static inline std::string
 PrintReceivedPacket(Address& from)
@@ -72,7 +72,7 @@
 }
 
 /**
- * \param socket Pointer to socket.
+ * @param socket Pointer to socket.
  *
  * Packet receiving sink.
  */
@@ -91,11 +91,11 @@
 }
 
 /**
- * \param socket Pointer to socket.
- * \param pktSize Packet size.
- * \param n Pointer to node.
- * \param pktCount Number of packets to generate.
- * \param pktInterval Packet sending interval.
+ * @param socket Pointer to socket.
+ * @param pktSize Packet size.
+ * @param n Pointer to node.
+ * @param pktCount Number of packets to generate.
+ * @param pktInterval Packet sending interval.
  *
  * Traffic generator.
  */
@@ -126,8 +126,8 @@
 /**
  * Trace function for remaining energy at node.
  *
- * \param oldValue Old value
- * \param remainingEnergy New value
+ * @param oldValue Old value
+ * @param remainingEnergy New value
  */
 void
 RemainingEnergy(double oldValue, double remainingEnergy)
@@ -139,8 +139,8 @@
 /**
  * Trace function for total energy consumption at node.
  *
- * \param oldValue Old value
- * \param totalEnergy New value
+ * @param oldValue Old value
+ * @param totalEnergy New value
  */
 void
 TotalEnergy(double oldValue, double totalEnergy)
@@ -152,8 +152,8 @@
 /**
  * Trace function for the power harvested by the energy harvester.
  *
- * \param oldValue Old value
- * \param harvestedPower New value
+ * @param oldValue Old value
+ * @param harvestedPower New value
  */
 void
 HarvestedPower(double oldValue, double harvestedPower)
@@ -165,8 +165,8 @@
 /**
  * Trace function for the total energy harvested by the node.
  *
- * \param oldValue Old value
- * \param totalEnergyHarvested New value
+ * @param oldValue Old value
+ * @param totalEnergyHarvested New value
  */
 void
 TotalEnergyHarvested(double oldValue, double totalEnergyHarvested)
@@ -340,7 +340,7 @@
                         numPackets,
                         interPacketInterval);
 
-    Simulator::Stop(Seconds(10.0));
+    Simulator::Stop(Seconds(10));
     Simulator::Run();
 
     for (auto iter = deviceModels.Begin(); iter != deviceModels.End(); iter++)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/error-model/simple-error-model.cc ns-3.44/examples/error-model/simple-error-model.cc
--- ns-3.43/examples/error-model/simple-error-model.cc	2024-10-09 16:41:09.836655600 -0700
+++ ns-3.44/examples/error-model/simple-error-model.cc	2025-03-09 16:55:49.331370800 -0700
@@ -112,27 +112,27 @@
                       Address(InetSocketAddress(i3i2.GetAddress(1), port)));
     onoff.SetConstantRate(DataRate("448kb/s"));
     ApplicationContainer apps = onoff.Install(c.Get(0));
-    apps.Start(Seconds(1.0));
-    apps.Stop(Seconds(10.0));
+    apps.Start(Seconds(1));
+    apps.Stop(Seconds(10));
 
     // Create an optional packet sink to receive these packets
     PacketSinkHelper sink("ns3::UdpSocketFactory",
                           Address(InetSocketAddress(Ipv4Address::GetAny(), port)));
     apps = sink.Install(c.Get(2));
-    apps.Start(Seconds(1.0));
-    apps.Stop(Seconds(10.0));
+    apps.Start(Seconds(1));
+    apps.Stop(Seconds(10));
 
     // Create a similar flow from n3 to n1, starting at time 1.1 seconds
     onoff.SetAttribute("Remote", AddressValue(InetSocketAddress(i1i2.GetAddress(0), port)));
     apps = onoff.Install(c.Get(3));
     apps.Start(Seconds(1.1));
-    apps.Stop(Seconds(10.0));
+    apps.Stop(Seconds(10));
 
     // Create a packet sink to receive these packets
     sink.SetAttribute("Local", AddressValue(InetSocketAddress(Ipv4Address::GetAny(), port)));
     apps = sink.Install(c.Get(1));
     apps.Start(Seconds(1.1));
-    apps.Stop(Seconds(10.0));
+    apps.Stop(Seconds(10));
 
     //
     // Error model
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/ipv6/fragmentation-ipv6.cc ns-3.44/examples/ipv6/fragmentation-ipv6.cc
--- ns-3.43/examples/ipv6/fragmentation-ipv6.cc	2024-10-09 16:41:09.836655600 -0700
+++ ns-3.44/examples/ipv6/fragmentation-ipv6.cc	2025-03-09 16:55:49.331370800 -0700
@@ -91,13 +91,13 @@
     echoClient.SetAttribute("PacketSize", UintegerValue(packetSize));
     echoClient.SetAttribute("MaxPackets", UintegerValue(maxPacketCount));
     ApplicationContainer clientApps = echoClient.Install(net1.Get(0));
-    clientApps.Start(Seconds(2.0));
-    clientApps.Stop(Seconds(20.0));
+    clientApps.Start(Seconds(2));
+    clientApps.Stop(Seconds(20));
 
     UdpEchoServerHelper echoServer(42);
     ApplicationContainer serverApps = echoServer.Install(net2.Get(1));
-    serverApps.Start(Seconds(0.0));
-    serverApps.Stop(Seconds(30.0));
+    serverApps.Start(Seconds(0));
+    serverApps.Stop(Seconds(30));
 
     AsciiTraceHelper ascii;
     csma.EnableAsciiAll(ascii.CreateFileStream("fragmentation-ipv6.tr"));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/ipv6/fragmentation-ipv6-PMTU.cc ns-3.44/examples/ipv6/fragmentation-ipv6-PMTU.cc
--- ns-3.43/examples/ipv6/fragmentation-ipv6-PMTU.cc	2024-10-09 16:41:09.836655600 -0700
+++ ns-3.44/examples/ipv6/fragmentation-ipv6-PMTU.cc	2025-03-09 16:55:49.331370800 -0700
@@ -114,8 +114,8 @@
     // Create an UDP Echo server on n2
     UdpEchoServerHelper echoServer(42);
     ApplicationContainer serverApps = echoServer.Install(n2);
-    serverApps.Start(Seconds(0.0));
-    serverApps.Stop(Seconds(30.0));
+    serverApps.Start(Seconds(0));
+    serverApps.Stop(Seconds(30));
 
     uint32_t maxPacketCount = 5;
 
@@ -125,16 +125,16 @@
     echoClient.SetAttribute("PacketSize", UintegerValue(packetSizeN1));
     echoClient.SetAttribute("MaxPackets", UintegerValue(maxPacketCount));
     ApplicationContainer clientAppsN1 = echoClient.Install(n1);
-    clientAppsN1.Start(Seconds(2.0));
-    clientAppsN1.Stop(Seconds(10.0));
+    clientAppsN1.Start(Seconds(2));
+    clientAppsN1.Stop(Seconds(10));
 
     // Create an UDP Echo client on n0 to send UDP packets to n2 via r0 and r1
     uint32_t packetSizeN2 = 4000; // Packet should fragment as intermediate link MTU is 1500
     echoClient.SetAttribute("PacketSize", UintegerValue(packetSizeN2));
     echoClient.SetAttribute("MaxPackets", UintegerValue(maxPacketCount));
     ApplicationContainer clientAppsN2 = echoClient.Install(n1);
-    clientAppsN2.Start(Seconds(11.0));
-    clientAppsN2.Stop(Seconds(20.0));
+    clientAppsN2.Start(Seconds(11));
+    clientAppsN2.Stop(Seconds(20));
 
     AsciiTraceHelper ascii;
     csma.EnableAsciiAll(ascii.CreateFileStream("fragmentation-ipv6-PMTU.tr"));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/ipv6/fragmentation-ipv6-two-MTU.cc ns-3.44/examples/ipv6/fragmentation-ipv6-two-MTU.cc
--- ns-3.43/examples/ipv6/fragmentation-ipv6-two-MTU.cc	2024-10-09 16:41:09.836655600 -0700
+++ ns-3.44/examples/ipv6/fragmentation-ipv6-two-MTU.cc	2025-03-09 16:55:49.331370800 -0700
@@ -94,13 +94,13 @@
     echoClient.SetAttribute("PacketSize", UintegerValue(packetSize));
     echoClient.SetAttribute("MaxPackets", UintegerValue(maxPacketCount));
     ApplicationContainer clientApps = echoClient.Install(net1.Get(0));
-    clientApps.Start(Seconds(2.0));
-    clientApps.Stop(Seconds(20.0));
+    clientApps.Start(Seconds(2));
+    clientApps.Stop(Seconds(20));
 
     UdpEchoServerHelper echoServer(42);
     ApplicationContainer serverApps = echoServer.Install(net2.Get(1));
-    serverApps.Start(Seconds(0.0));
-    serverApps.Stop(Seconds(30.0));
+    serverApps.Start(Seconds(0));
+    serverApps.Stop(Seconds(30));
 
     AsciiTraceHelper ascii;
     csma.EnableAsciiAll(ascii.CreateFileStream("fragmentation-ipv6-two-mtu.tr"));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/ipv6/icmpv6-redirect.cc ns-3.44/examples/ipv6/icmpv6-redirect.cc
--- ns-3.43/examples/ipv6/icmpv6-redirect.cc	2024-10-09 16:41:09.836655600 -0700
+++ ns-3.44/examples/ipv6/icmpv6-redirect.cc	2025-03-09 16:55:49.331370800 -0700
@@ -103,8 +103,8 @@
                             iic1.GetInterfaceIndex(1));
 
     Ptr<OutputStreamWrapper> routingStream = Create<OutputStreamWrapper>(&std::cout);
-    Ipv6RoutingHelper::PrintRoutingTableAt(Seconds(0.0), r1, routingStream);
-    Ipv6RoutingHelper::PrintRoutingTableAt(Seconds(3.0), sta1, routingStream);
+    Ipv6RoutingHelper::PrintRoutingTableAt(Seconds(0), r1, routingStream);
+    Ipv6RoutingHelper::PrintRoutingTableAt(Seconds(3), sta1, routingStream);
 
     NS_LOG_INFO("Create Applications.");
     uint32_t packetSize = 1024;
@@ -114,8 +114,8 @@
     ping.SetAttribute("Count", UintegerValue(maxPacketCount));
     ping.SetAttribute("Size", UintegerValue(packetSize));
     ApplicationContainer apps = ping.Install(sta1);
-    apps.Start(Seconds(2.0));
-    apps.Stop(Seconds(10.0));
+    apps.Start(Seconds(2));
+    apps.Stop(Seconds(10));
 
     AsciiTraceHelper ascii;
     csma.EnableAsciiAll(ascii.CreateFileStream("icmpv6-redirect.tr"));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/ipv6/loose-routing-ipv6.cc ns-3.44/examples/ipv6/loose-routing-ipv6.cc
--- ns-3.43/examples/ipv6/loose-routing-ipv6.cc	2024-10-09 16:41:09.836655600 -0700
+++ ns-3.44/examples/ipv6/loose-routing-ipv6.cc	2025-03-09 16:55:49.331370800 -0700
@@ -146,7 +146,7 @@
      */
     uint32_t packetSize = 1024;
     uint32_t maxPacketCount = 1;
-    Time interPacketInterval = Seconds(1.0);
+    Time interPacketInterval = Seconds(1);
 
     std::vector<Ipv6Address> routersAddress;
     routersAddress.push_back(i3.GetAddress(1, 1));
@@ -163,8 +163,8 @@
     ApplicationContainer apps = client.Install(h0);
     DynamicCast<Ping>(apps.Get(0))->SetRouters(routersAddress);
 
-    apps.Start(Seconds(1.0));
-    apps.Stop(Seconds(20.0));
+    apps.Start(Seconds(1));
+    apps.Stop(Seconds(20));
 
     AsciiTraceHelper ascii;
     csma.EnableAsciiAll(ascii.CreateFileStream("loose-routing-ipv6.tr"));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/ipv6/ping6-example.cc ns-3.44/examples/ipv6/ping6-example.cc
--- ns-3.43/examples/ipv6/ping6-example.cc	2024-10-09 16:41:09.836655600 -0700
+++ ns-3.44/examples/ipv6/ping6-example.cc	2025-03-09 16:55:49.331370800 -0700
@@ -85,8 +85,8 @@
     ping.SetAttribute("InterfaceAddress", AddressValue(i.GetAddress(0, 0)));
 
     ApplicationContainer apps = ping.Install(n.Get(0));
-    apps.Start(Seconds(2.0));
-    apps.Stop(Seconds(10.0));
+    apps.Start(Seconds(2));
+    apps.Stop(Seconds(10));
 
     AsciiTraceHelper ascii;
     csma.EnableAsciiAll(ascii.CreateFileStream("ping6.tr"));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/ipv6/radvd-one-prefix.cc ns-3.44/examples/ipv6/radvd-one-prefix.cc
--- ns-3.43/examples/ipv6/radvd-one-prefix.cc	2024-10-09 16:41:09.836655600 -0700
+++ ns-3.44/examples/ipv6/radvd-one-prefix.cc	2025-03-09 16:55:49.331370800 -0700
@@ -114,8 +114,8 @@
     radvdHelper.GetRadvdInterface(iic2.GetInterfaceIndex(1))->SetSendAdvert(false);
 
     ApplicationContainer radvdApps = radvdHelper.Install(r);
-    radvdApps.Start(Seconds(1.0));
-    radvdApps.Stop(Seconds(10.0));
+    radvdApps.Start(Seconds(1));
+    radvdApps.Stop(Seconds(10));
 
     /* Create a Ping application to send ICMPv6 echo request from n0 to n1 via R */
     uint32_t packetSize = 1024;
@@ -126,8 +126,8 @@
     ping.SetAttribute("Count", UintegerValue(maxPacketCount));
     ping.SetAttribute("Size", UintegerValue(packetSize));
     ApplicationContainer apps = ping.Install(net1.Get(0));
-    apps.Start(Seconds(2.0));
-    apps.Stop(Seconds(7.0));
+    apps.Start(Seconds(2));
+    apps.Stop(Seconds(7));
 
     AsciiTraceHelper ascii;
     csma.EnableAsciiAll(ascii.CreateFileStream("radvd.tr"));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/ipv6/radvd-two-prefix.cc ns-3.44/examples/ipv6/radvd-two-prefix.cc
--- ns-3.43/examples/ipv6/radvd-two-prefix.cc	2024-10-09 16:41:09.836655600 -0700
+++ ns-3.44/examples/ipv6/radvd-two-prefix.cc	2025-03-09 16:55:49.331370800 -0700
@@ -37,15 +37,15 @@
 NS_LOG_COMPONENT_DEFINE("RadvdTwoPrefixExample");
 
 /**
- * \class IpAddressHelper
- * \brief Helper to print a node's IP addresses.
+ * @class IpAddressHelper
+ * @brief Helper to print a node's IP addresses.
  */
 class IpAddressHelper
 {
   public:
     /**
-     * \brief Print the node's IP addresses.
-     * \param n the node
+     * @brief Print the node's IP addresses.
+     * @param n the node
      */
     inline void PrintIpAddresses(Ptr<Node>& n)
     {
@@ -174,8 +174,8 @@
     }
 
     ApplicationContainer radvdApps = radvdHelper.Install(r);
-    radvdApps.Start(Seconds(1.0));
-    radvdApps.Stop(Seconds(2.0));
+    radvdApps.Start(Seconds(1));
+    radvdApps.Stop(Seconds(2));
 
     /* Create a Ping application to send ICMPv6 echo request from n0 to n1 via R */
     uint32_t packetSize = 1024;
@@ -187,18 +187,18 @@
     ping.SetAttribute("Count", UintegerValue(maxPacketCount));
     ping.SetAttribute("Size", UintegerValue(packetSize));
     ApplicationContainer apps = ping.Install(net1.Get(0));
-    apps.Start(Seconds(2.0));
-    apps.Stop(Seconds(5.0));
+    apps.Start(Seconds(2));
+    apps.Stop(Seconds(5));
 
     Ptr<OutputStreamWrapper> routingStream = Create<OutputStreamWrapper>(&std::cout);
-    Ipv6RoutingHelper::PrintRoutingTableAt(Seconds(2.0), n0, routingStream);
-    Ipv6RoutingHelper::PrintRoutingTableAt(Seconds(10.0), n0, routingStream);
+    Ipv6RoutingHelper::PrintRoutingTableAt(Seconds(2), n0, routingStream);
+    Ipv6RoutingHelper::PrintRoutingTableAt(Seconds(10), n0, routingStream);
 
     IpAddressHelper ipAddressHelper;
     /* RA should be received, two prefixes + routes + default route should be present */
-    Simulator::Schedule(Seconds(2.0), &IpAddressHelper::PrintIpAddresses, &ipAddressHelper, n0);
+    Simulator::Schedule(Seconds(2), &IpAddressHelper::PrintIpAddresses, &ipAddressHelper, n0);
     /* at the end, RA addresses and routes should be cleared */
-    Simulator::Schedule(Seconds(10.0), &IpAddressHelper::PrintIpAddresses, &ipAddressHelper, n0);
+    Simulator::Schedule(Seconds(10), &IpAddressHelper::PrintIpAddresses, &ipAddressHelper, n0);
 
     AsciiTraceHelper ascii;
     csma.EnableAsciiAll(ascii.CreateFileStream("radvd-two-prefix.tr"));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/ipv6/wsn-ping6.cc ns-3.44/examples/ipv6/wsn-ping6.cc
--- ns-3.43/examples/ipv6/wsn-ping6.cc	2024-10-09 16:41:09.836655600 -0700
+++ ns-3.44/examples/ipv6/wsn-ping6.cc	2025-03-09 16:55:49.331370800 -0700
@@ -114,8 +114,8 @@
     ping.SetAttribute("Interval", TimeValue(interPacketInterval));
     ping.SetAttribute("Size", UintegerValue(packetSize));
     ApplicationContainer apps = ping.Install(nodes.Get(0));
-    apps.Start(Seconds(2.0));
-    apps.Stop(Seconds(10.0));
+    apps.Start(Seconds(2));
+    apps.Stop(Seconds(10));
 
     AsciiTraceHelper ascii;
     lrWpanHelper.EnableAsciiAll(ascii.CreateFileStream("ping6wsn.tr"));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/naming/object-names.cc ns-3.44/examples/naming/object-names.cc
--- ns-3.43/examples/naming/object-names.cc	2024-10-09 16:41:09.836655600 -0700
+++ ns-3.44/examples/naming/object-names.cc	2025-03-09 16:55:49.331370800 -0700
@@ -27,8 +27,8 @@
 /**
  * Function called when a packet is received.
  *
- * \param context The context.
- * \param packet The received packet.
+ * @param context The context.
+ * @param packet The received packet.
  */
 void
 RxEvent(std::string context, Ptr<const Packet> packet)
@@ -142,8 +142,8 @@
     // directly.
     //
     ApplicationContainer apps = server.Install("/Names/server");
-    apps.Start(Seconds(1.0));
-    apps.Stop(Seconds(10.0));
+    apps.Start(Seconds(1));
+    apps.Stop(Seconds(10));
 
     uint32_t packetSize = 1024;
     uint32_t maxPacketCount = 1;
@@ -157,8 +157,8 @@
     // directly.
     //
     apps = client.Install("/Names/client");
-    apps.Start(Seconds(2.0));
-    apps.Stop(Seconds(10.0));
+    apps.Start(Seconds(2));
+    apps.Stop(Seconds(10));
 
     //
     // Use the Config system to connect a trace source using the object name
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/realtime/realtime-udp-echo.cc ns-3.44/examples/realtime/realtime-udp-echo.cc
--- ns-3.43/examples/realtime/realtime-udp-echo.cc	2024-10-09 16:41:09.836655600 -0700
+++ ns-3.44/examples/realtime/realtime-udp-echo.cc	2025-03-09 16:55:49.331370800 -0700
@@ -76,8 +76,8 @@
     uint16_t port = 9; // well-known echo port number
     UdpEchoServerHelper server(port);
     ApplicationContainer apps = server.Install(n.Get(1));
-    apps.Start(Seconds(1.0));
-    apps.Stop(Seconds(10.0));
+    apps.Start(Seconds(1));
+    apps.Stop(Seconds(10));
 
     //
     // Create a UdpEchoClient application to send UDP datagrams from node zero to
@@ -91,8 +91,8 @@
     client.SetAttribute("Interval", TimeValue(interPacketInterval));
     client.SetAttribute("PacketSize", UintegerValue(packetSize));
     apps = client.Install(n.Get(0));
-    apps.Start(Seconds(2.0));
-    apps.Stop(Seconds(10.0));
+    apps.Start(Seconds(2));
+    apps.Stop(Seconds(10));
 
     AsciiTraceHelper ascii;
     csma.EnableAsciiAll(ascii.CreateFileStream("realtime-udp-echo.tr"));
@@ -101,7 +101,7 @@
     //
     // Now, do the actual simulation.
     //
-    Simulator::Stop(Seconds(11.0));
+    Simulator::Stop(Seconds(11));
     NS_LOG_INFO("Run Simulation.");
     Simulator::Run();
     Simulator::Destroy();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/realtime/realtime-udp-echo.py ns-3.44/examples/realtime/realtime-udp-echo.py
--- ns-3.43/examples/realtime/realtime-udp-echo.py	2024-10-09 16:41:09.836655600 -0700
+++ ns-3.44/examples/realtime/realtime-udp-echo.py	2025-03-09 16:55:49.331370800 -0700
@@ -72,8 +72,8 @@
     port = 9  # well-known echo port number
     server = ns.UdpEchoServerHelper(port)
     apps = server.Install(n.Get(1))
-    apps.Start(ns.Seconds(1.0))
-    apps.Stop(ns.Seconds(10.0))
+    apps.Start(ns.Seconds(1))
+    apps.Stop(ns.Seconds(10))
 
     #
     # Create a UdpEchoClient application to send UDP datagrams from node zero to
@@ -87,8 +87,8 @@
     client.SetAttribute("Interval", ns.TimeValue(interPacketInterval))
     client.SetAttribute("PacketSize", ns.UintegerValue(packetSize))
     apps = client.Install(n.Get(0))
-    apps.Start(ns.Seconds(2.0))
-    apps.Stop(ns.Seconds(10.0))
+    apps.Start(ns.Seconds(2))
+    apps.Stop(ns.Seconds(10))
 
     ascii = ns.AsciiTraceHelper()
     csma.EnableAsciiAll(ascii.CreateFileStream("realtime-udp-echo.tr"))
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/routing/dynamic-global-routing.cc ns-3.44/examples/routing/dynamic-global-routing.cc
--- ns-3.43/examples/routing/dynamic-global-routing.cc	2024-10-09 16:41:09.836655600 -0700
+++ ns-3.44/examples/routing/dynamic-global-routing.cc	2025-03-09 16:55:49.331370800 -0700
@@ -141,8 +141,8 @@
     onoff.SetAttribute("PacketSize", UintegerValue(50));
 
     ApplicationContainer apps = onoff.Install(c.Get(1));
-    apps.Start(Seconds(1.0));
-    apps.Stop(Seconds(10.0));
+    apps.Start(Seconds(1));
+    apps.Stop(Seconds(10));
 
     // Create a second OnOff application to send UDP datagrams of size
     // 210 bytes at a rate of 448 Kb/s
@@ -153,21 +153,21 @@
     onoff2.SetAttribute("PacketSize", UintegerValue(50));
 
     ApplicationContainer apps2 = onoff2.Install(c.Get(1));
-    apps2.Start(Seconds(11.0));
-    apps2.Stop(Seconds(16.0));
+    apps2.Start(Seconds(11));
+    apps2.Stop(Seconds(16));
 
     // Create an optional packet sink to receive these packets
     PacketSinkHelper sink("ns3::UdpSocketFactory",
                           Address(InetSocketAddress(Ipv4Address::GetAny(), port)));
     apps = sink.Install(c.Get(6));
-    apps.Start(Seconds(1.0));
-    apps.Stop(Seconds(10.0));
+    apps.Start(Seconds(1));
+    apps.Stop(Seconds(10));
 
     PacketSinkHelper sink2("ns3::UdpSocketFactory",
                            Address(InetSocketAddress(Ipv4Address::GetAny(), port)));
     apps2 = sink2.Install(c.Get(6));
-    apps2.Start(Seconds(11.0));
-    apps2.Stop(Seconds(16.0));
+    apps2.Start(Seconds(11));
+    apps2.Stop(Seconds(16));
 
     AsciiTraceHelper ascii;
     Ptr<OutputStreamWrapper> stream = ascii.CreateFileStream("dynamic-global-routing.tr");
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/routing/global-injection-slash32.cc ns-3.44/examples/routing/global-injection-slash32.cc
--- ns-3.43/examples/routing/global-injection-slash32.cc	2024-10-09 16:41:09.836655600 -0700
+++ ns-3.44/examples/routing/global-injection-slash32.cc	2025-03-09 16:55:49.331370800 -0700
@@ -129,15 +129,15 @@
                       Address(InetSocketAddress(ifInAddrC.GetLocal(), port)));
     onoff.SetConstantRate(DataRate(6000));
     ApplicationContainer apps = onoff.Install(nA);
-    apps.Start(Seconds(1.0));
-    apps.Stop(Seconds(10.0));
+    apps.Start(Seconds(1));
+    apps.Stop(Seconds(10));
 
     // Create a packet sink to receive these packets
     PacketSinkHelper sink("ns3::UdpSocketFactory",
                           Address(InetSocketAddress(Ipv4Address::GetAny(), port)));
     apps = sink.Install(nC);
-    apps.Start(Seconds(1.0));
-    apps.Stop(Seconds(10.0));
+    apps.Start(Seconds(1));
+    apps.Stop(Seconds(10));
 
     AsciiTraceHelper ascii;
     p2p.EnableAsciiAll(ascii.CreateFileStream("global-routing-injection32.tr"));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/routing/global-routing-slash32.cc ns-3.44/examples/routing/global-routing-slash32.cc
--- ns-3.43/examples/routing/global-routing-slash32.cc	2024-10-09 16:41:09.836655600 -0700
+++ ns-3.44/examples/routing/global-routing-slash32.cc	2025-03-09 16:55:49.331370800 -0700
@@ -100,15 +100,15 @@
                       Address(InetSocketAddress(ifInAddrC.GetLocal(), port)));
     onoff.SetConstantRate(DataRate(6000));
     ApplicationContainer apps = onoff.Install(nA);
-    apps.Start(Seconds(1.0));
-    apps.Stop(Seconds(10.0));
+    apps.Start(Seconds(1));
+    apps.Stop(Seconds(10));
 
     // Create a packet sink to receive these packets
     PacketSinkHelper sink("ns3::UdpSocketFactory",
                           Address(InetSocketAddress(Ipv4Address::GetAny(), port)));
     apps = sink.Install(nC);
-    apps.Start(Seconds(1.0));
-    apps.Stop(Seconds(10.0));
+    apps.Start(Seconds(1));
+    apps.Stop(Seconds(10));
 
     AsciiTraceHelper ascii;
     p2p.EnableAsciiAll(ascii.CreateFileStream("global-routing-slash32.tr"));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/routing/manet-routing-compare.cc ns-3.44/examples/routing/manet-routing-compare.cc
--- ns-3.43/examples/routing/manet-routing-compare.cc	2024-10-09 16:41:09.836655600 -0700
+++ ns-3.44/examples/routing/manet-routing-compare.cc	2025-03-09 16:55:49.331370800 -0700
@@ -89,22 +89,22 @@
 
     /**
      * Handles the command-line parameters.
-     * \param argc The argument count.
-     * \param argv The argument vector.
+     * @param argc The argument count.
+     * @param argv The argument vector.
      */
     void CommandSetup(int argc, char** argv);
 
   private:
     /**
      * Setup the receiving socket in a Sink Node.
-     * \param addr The address of the node.
-     * \param node The node pointer.
-     * \return the socket.
+     * @param addr The address of the node.
+     * @param node The node pointer.
+     * @return the socket.
      */
     Ptr<Socket> SetupPacketReceive(Ipv4Address addr, Ptr<Node> node);
     /**
      * Receive a packet.
-     * \param socket The receiving socket.
+     * @param socket The receiving socket.
      */
     void ReceivePacket(Ptr<Socket> socket);
     /**
@@ -173,7 +173,7 @@
 
     out.close();
     packetsReceived = 0;
-    Simulator::Schedule(Seconds(1.0), &RoutingExperiment::CheckThroughput, this);
+    Simulator::Schedule(Seconds(1), &RoutingExperiment::CheckThroughput, this);
 }
 
 Ptr<Socket>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/routing/mixed-global-routing.cc ns-3.44/examples/routing/mixed-global-routing.cc
--- ns-3.43/examples/routing/mixed-global-routing.cc	2024-10-09 16:41:09.836655600 -0700
+++ ns-3.44/examples/routing/mixed-global-routing.cc	2025-03-09 16:55:49.331370800 -0700
@@ -104,8 +104,8 @@
     onoff.SetAttribute("PacketSize", UintegerValue(50));
 
     ApplicationContainer apps = onoff.Install(c.Get(0));
-    apps.Start(Seconds(1.0));
-    apps.Stop(Seconds(10.0));
+    apps.Start(Seconds(1));
+    apps.Stop(Seconds(10));
 
     AsciiTraceHelper ascii;
     Ptr<OutputStreamWrapper> stream = ascii.CreateFileStream("mixed-global-routing.tr");
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/routing/ripng-simple-network.cc ns-3.44/examples/routing/ripng-simple-network.cc
--- ns-3.43/examples/routing/ripng-simple-network.cc	2024-10-09 16:41:09.836655600 -0700
+++ ns-3.44/examples/routing/ripng-simple-network.cc	2025-03-09 16:55:49.331370800 -0700
@@ -209,25 +209,25 @@
     {
         Ptr<OutputStreamWrapper> routingStream = Create<OutputStreamWrapper>(&std::cout);
 
-        Ipv6RoutingHelper::PrintRoutingTableAt(Seconds(30.0), a, routingStream);
-        Ipv6RoutingHelper::PrintRoutingTableAt(Seconds(30.0), b, routingStream);
-        Ipv6RoutingHelper::PrintRoutingTableAt(Seconds(30.0), c, routingStream);
-        Ipv6RoutingHelper::PrintRoutingTableAt(Seconds(30.0), d, routingStream);
-
-        Ipv6RoutingHelper::PrintRoutingTableAt(Seconds(60.0), a, routingStream);
-        Ipv6RoutingHelper::PrintRoutingTableAt(Seconds(60.0), b, routingStream);
-        Ipv6RoutingHelper::PrintRoutingTableAt(Seconds(60.0), c, routingStream);
-        Ipv6RoutingHelper::PrintRoutingTableAt(Seconds(60.0), d, routingStream);
-
-        Ipv6RoutingHelper::PrintRoutingTableAt(Seconds(90.0), a, routingStream);
-        Ipv6RoutingHelper::PrintRoutingTableAt(Seconds(90.0), b, routingStream);
-        Ipv6RoutingHelper::PrintRoutingTableAt(Seconds(90.0), c, routingStream);
-        Ipv6RoutingHelper::PrintRoutingTableAt(Seconds(90.0), d, routingStream);
+        Ipv6RoutingHelper::PrintRoutingTableAt(Seconds(30), a, routingStream);
+        Ipv6RoutingHelper::PrintRoutingTableAt(Seconds(30), b, routingStream);
+        Ipv6RoutingHelper::PrintRoutingTableAt(Seconds(30), c, routingStream);
+        Ipv6RoutingHelper::PrintRoutingTableAt(Seconds(30), d, routingStream);
+
+        Ipv6RoutingHelper::PrintRoutingTableAt(Seconds(60), a, routingStream);
+        Ipv6RoutingHelper::PrintRoutingTableAt(Seconds(60), b, routingStream);
+        Ipv6RoutingHelper::PrintRoutingTableAt(Seconds(60), c, routingStream);
+        Ipv6RoutingHelper::PrintRoutingTableAt(Seconds(60), d, routingStream);
+
+        Ipv6RoutingHelper::PrintRoutingTableAt(Seconds(90), a, routingStream);
+        Ipv6RoutingHelper::PrintRoutingTableAt(Seconds(90), b, routingStream);
+        Ipv6RoutingHelper::PrintRoutingTableAt(Seconds(90), c, routingStream);
+        Ipv6RoutingHelper::PrintRoutingTableAt(Seconds(90), d, routingStream);
     }
 
     NS_LOG_INFO("Create Applications.");
     uint32_t packetSize = 1024;
-    Time interPacketInterval = Seconds(1.0);
+    Time interPacketInterval = Seconds(1);
     PingHelper ping(iic7.GetAddress(1, 1));
 
     ping.SetAttribute("Interval", TimeValue(interPacketInterval));
@@ -237,8 +237,8 @@
         ping.SetAttribute("VerboseMode", EnumValue(Ping::VerboseMode::VERBOSE));
     }
     ApplicationContainer apps = ping.Install(src);
-    apps.Start(Seconds(1.0));
-    apps.Stop(Seconds(110.0));
+    apps.Start(Seconds(1));
+    apps.Stop(Seconds(110));
 
     AsciiTraceHelper ascii;
     csma.EnableAsciiAll(ascii.CreateFileStream("ripng-simple-routing.tr"));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/routing/rip-simple-network.cc ns-3.44/examples/routing/rip-simple-network.cc
--- ns-3.43/examples/routing/rip-simple-network.cc	2024-10-09 16:41:09.836655600 -0700
+++ ns-3.44/examples/routing/rip-simple-network.cc	2025-03-09 16:55:49.331370800 -0700
@@ -204,25 +204,25 @@
     {
         Ptr<OutputStreamWrapper> routingStream = Create<OutputStreamWrapper>(&std::cout);
 
-        Ipv4RoutingHelper::PrintRoutingTableAt(Seconds(30.0), a, routingStream);
-        Ipv4RoutingHelper::PrintRoutingTableAt(Seconds(30.0), b, routingStream);
-        Ipv4RoutingHelper::PrintRoutingTableAt(Seconds(30.0), c, routingStream);
-        Ipv4RoutingHelper::PrintRoutingTableAt(Seconds(30.0), d, routingStream);
-
-        Ipv4RoutingHelper::PrintRoutingTableAt(Seconds(60.0), a, routingStream);
-        Ipv4RoutingHelper::PrintRoutingTableAt(Seconds(60.0), b, routingStream);
-        Ipv4RoutingHelper::PrintRoutingTableAt(Seconds(60.0), c, routingStream);
-        Ipv4RoutingHelper::PrintRoutingTableAt(Seconds(60.0), d, routingStream);
-
-        Ipv4RoutingHelper::PrintRoutingTableAt(Seconds(90.0), a, routingStream);
-        Ipv4RoutingHelper::PrintRoutingTableAt(Seconds(90.0), b, routingStream);
-        Ipv4RoutingHelper::PrintRoutingTableAt(Seconds(90.0), c, routingStream);
-        Ipv4RoutingHelper::PrintRoutingTableAt(Seconds(90.0), d, routingStream);
+        Ipv4RoutingHelper::PrintRoutingTableAt(Seconds(30), a, routingStream);
+        Ipv4RoutingHelper::PrintRoutingTableAt(Seconds(30), b, routingStream);
+        Ipv4RoutingHelper::PrintRoutingTableAt(Seconds(30), c, routingStream);
+        Ipv4RoutingHelper::PrintRoutingTableAt(Seconds(30), d, routingStream);
+
+        Ipv4RoutingHelper::PrintRoutingTableAt(Seconds(60), a, routingStream);
+        Ipv4RoutingHelper::PrintRoutingTableAt(Seconds(60), b, routingStream);
+        Ipv4RoutingHelper::PrintRoutingTableAt(Seconds(60), c, routingStream);
+        Ipv4RoutingHelper::PrintRoutingTableAt(Seconds(60), d, routingStream);
+
+        Ipv4RoutingHelper::PrintRoutingTableAt(Seconds(90), a, routingStream);
+        Ipv4RoutingHelper::PrintRoutingTableAt(Seconds(90), b, routingStream);
+        Ipv4RoutingHelper::PrintRoutingTableAt(Seconds(90), c, routingStream);
+        Ipv4RoutingHelper::PrintRoutingTableAt(Seconds(90), d, routingStream);
     }
 
     NS_LOG_INFO("Create Applications.");
     uint32_t packetSize = 1024;
-    Time interPacketInterval = Seconds(1.0);
+    Time interPacketInterval = Seconds(1);
     PingHelper ping(Ipv4Address("10.0.6.2"));
 
     ping.SetAttribute("Interval", TimeValue(interPacketInterval));
@@ -232,8 +232,8 @@
         ping.SetAttribute("VerboseMode", EnumValue(Ping::VerboseMode::VERBOSE));
     }
     ApplicationContainer apps = ping.Install(src);
-    apps.Start(Seconds(1.0));
-    apps.Stop(Seconds(110.0));
+    apps.Start(Seconds(1));
+    apps.Stop(Seconds(110));
 
     AsciiTraceHelper ascii;
     csma.EnableAsciiAll(ascii.CreateFileStream("rip-simple-routing.tr"));
@@ -243,7 +243,7 @@
 
     /* Now, do the actual simulation. */
     NS_LOG_INFO("Run Simulation.");
-    Simulator::Stop(Seconds(131.0));
+    Simulator::Stop(Seconds(131));
     Simulator::Run();
     Simulator::Destroy();
     NS_LOG_INFO("Done.");
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/routing/simple-alternate-routing.cc ns-3.44/examples/routing/simple-alternate-routing.cc
--- ns-3.43/examples/routing/simple-alternate-routing.cc	2024-10-09 16:41:09.836655600 -0700
+++ ns-3.44/examples/routing/simple-alternate-routing.cc	2025-03-09 16:55:49.331370800 -0700
@@ -131,14 +131,14 @@
 
     ApplicationContainer apps = onoff.Install(c.Get(3));
     apps.Start(Seconds(1.1));
-    apps.Stop(Seconds(10.0));
+    apps.Stop(Seconds(10));
 
     // Create a packet sink to receive these packets
     PacketSinkHelper sink("ns3::UdpSocketFactory",
                           Address(InetSocketAddress(Ipv4Address::GetAny(), port)));
     apps = sink.Install(c.Get(1));
     apps.Start(Seconds(1.1));
-    apps.Stop(Seconds(10.0));
+    apps.Stop(Seconds(10));
 
     AsciiTraceHelper ascii;
     p2p.EnableAsciiAll(ascii.CreateFileStream("simple-alternate-routing.tr"));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/routing/simple-global-routing.cc ns-3.44/examples/routing/simple-global-routing.cc
--- ns-3.43/examples/routing/simple-global-routing.cc	2024-10-09 16:41:09.836655600 -0700
+++ ns-3.44/examples/routing/simple-global-routing.cc	2025-03-09 16:55:49.331370800 -0700
@@ -110,26 +110,26 @@
                       Address(InetSocketAddress(i3i2.GetAddress(0), port)));
     onoff.SetConstantRate(DataRate("448kb/s"));
     ApplicationContainer apps = onoff.Install(c.Get(0));
-    apps.Start(Seconds(1.0));
-    apps.Stop(Seconds(10.0));
+    apps.Start(Seconds(1));
+    apps.Stop(Seconds(10));
 
     // Create a packet sink to receive these packets
     PacketSinkHelper sink("ns3::UdpSocketFactory",
                           Address(InetSocketAddress(Ipv4Address::GetAny(), port)));
     apps = sink.Install(c.Get(3));
-    apps.Start(Seconds(1.0));
-    apps.Stop(Seconds(10.0));
+    apps.Start(Seconds(1));
+    apps.Stop(Seconds(10));
 
     // Create a similar flow from n3 to n1, starting at time 1.1 seconds
     onoff.SetAttribute("Remote", AddressValue(InetSocketAddress(i1i2.GetAddress(0), port)));
     apps = onoff.Install(c.Get(3));
     apps.Start(Seconds(1.1));
-    apps.Stop(Seconds(10.0));
+    apps.Stop(Seconds(10));
 
     // Create a packet sink to receive these packets
     apps = sink.Install(c.Get(1));
     apps.Start(Seconds(1.1));
-    apps.Stop(Seconds(10.0));
+    apps.Stop(Seconds(10));
 
     AsciiTraceHelper ascii;
     p2p.EnableAsciiAll(ascii.CreateFileStream("simple-global-routing.tr"));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/routing/simple-routing-ping6.cc ns-3.44/examples/routing/simple-routing-ping6.cc
--- ns-3.43/examples/routing/simple-routing-ping6.cc	2024-10-09 16:41:09.836655600 -0700
+++ ns-3.44/examples/routing/simple-routing-ping6.cc	2025-03-09 16:55:49.331370800 -0700
@@ -30,17 +30,17 @@
 NS_LOG_COMPONENT_DEFINE("SimpleRoutingPing6Example");
 
 /**
- * \class StackHelper
- * \brief Helper to set or get some IPv6 information about nodes.
+ * @class StackHelper
+ * @brief Helper to set or get some IPv6 information about nodes.
  */
 class StackHelper
 {
   public:
     /**
-     * \brief Add an address to a IPv6 node.
-     * \param n node
-     * \param interface interface index
-     * \param address IPv6 address to add
+     * @brief Add an address to a IPv6 node.
+     * @param n node
+     * @param interface interface index
+     * @param address IPv6 address to add
      */
     inline void AddAddress(Ptr<Node>& n, uint32_t interface, Ipv6Address address)
     {
@@ -49,8 +49,8 @@
     }
 
     /**
-     * \brief Print the routing table.
-     * \param n the node
+     * @brief Print the routing table.
+     * @param n the node
      */
     inline void PrintRoutingTable(Ptr<Node>& n)
     {
@@ -136,8 +136,8 @@
     ping.SetAttribute("Count", UintegerValue(maxPacketCount));
     ping.SetAttribute("Size", UintegerValue(packetSize));
     ApplicationContainer apps = ping.Install(net1.Get(0));
-    apps.Start(Seconds(2.0));
-    apps.Stop(Seconds(20.0));
+    apps.Start(Seconds(2));
+    apps.Stop(Seconds(20));
 
     AsciiTraceHelper ascii;
     csma.EnableAsciiAll(ascii.CreateFileStream("simple-routing-ping6.tr"));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/routing/simple-routing-ping6.py ns-3.44/examples/routing/simple-routing-ping6.py
--- ns-3.43/examples/routing/simple-routing-ping6.py	2024-10-09 16:41:09.836655600 -0700
+++ ns-3.44/examples/routing/simple-routing-ping6.py	2025-03-09 16:55:49.331370800 -0700
@@ -69,7 +69,7 @@
     print("Application")
     packetSize = 1024
     maxPacketCount = 5
-    interPacketInterval = ns.Seconds(1.0)
+    interPacketInterval = ns.Seconds(1)
     # ping = ns.PingHelper(i2.GetAddress(1, 1).ConvertTo())
     ping = ns.PingHelper(i2.GetAddress(1, 1).ConvertTo())
 
@@ -81,8 +81,8 @@
     ping.SetAttribute("Size", ns.UintegerValue(packetSize))
 
     apps = ping.Install(ns.NodeContainer(net1.Get(0)))
-    apps.Start(ns.Seconds(2.0))
-    apps.Stop(ns.Seconds(20.0))
+    apps.Start(ns.Seconds(2))
+    apps.Stop(ns.Seconds(20))
 
     print("Tracing")
     ascii = ns.AsciiTraceHelper()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/routing/static-routing-slash32.cc ns-3.44/examples/routing/static-routing-slash32.cc
--- ns-3.43/examples/routing/static-routing-slash32.cc	2024-10-09 16:41:09.836655600 -0700
+++ ns-3.44/examples/routing/static-routing-slash32.cc	2025-03-09 16:55:49.331370800 -0700
@@ -106,15 +106,15 @@
                       Address(InetSocketAddress(ifInAddrC.GetLocal(), port)));
     onoff.SetConstantRate(DataRate(6000));
     ApplicationContainer apps = onoff.Install(nA);
-    apps.Start(Seconds(1.0));
-    apps.Stop(Seconds(10.0));
+    apps.Start(Seconds(1));
+    apps.Stop(Seconds(10));
 
     // Create a packet sink to receive these packets
     PacketSinkHelper sink("ns3::UdpSocketFactory",
                           Address(InetSocketAddress(Ipv4Address::GetAny(), port)));
     apps = sink.Install(nC);
-    apps.Start(Seconds(1.0));
-    apps.Stop(Seconds(10.0));
+    apps.Start(Seconds(1));
+    apps.Stop(Seconds(10));
 
     AsciiTraceHelper ascii;
     p2p.EnableAsciiAll(ascii.CreateFileStream("static-routing-slash32.tr"));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/socket/socket-bound-static-routing.cc ns-3.44/examples/socket/socket-bound-static-routing.cc
--- ns-3.43/examples/socket/socket-bound-static-routing.cc	2024-10-09 16:41:09.836655600 -0700
+++ ns-3.44/examples/socket/socket-bound-static-routing.cc	2025-03-09 16:55:49.331370800 -0700
@@ -144,17 +144,17 @@
     // First packet as normal (goes via Rtr1)
     Simulator::Schedule(Seconds(0.1), &SendStuff, srcSocket, dstaddr, dstport);
     // Second via Rtr1 explicitly
-    Simulator::Schedule(Seconds(1.0), &BindSock, srcSocket, SrcToRtr1);
+    Simulator::Schedule(Seconds(1), &BindSock, srcSocket, SrcToRtr1);
     Simulator::Schedule(Seconds(1.1), &SendStuff, srcSocket, dstaddr, dstport);
     // Third via Rtr2 explicitly
-    Simulator::Schedule(Seconds(2.0), &BindSock, srcSocket, SrcToRtr2);
+    Simulator::Schedule(Seconds(2), &BindSock, srcSocket, SrcToRtr2);
     Simulator::Schedule(Seconds(2.1), &SendStuff, srcSocket, dstaddr, dstport);
     // Fourth again as normal (goes via Rtr1)
-    Simulator::Schedule(Seconds(3.0), &BindSock, srcSocket, Ptr<NetDevice>(nullptr));
+    Simulator::Schedule(Seconds(3), &BindSock, srcSocket, Ptr<NetDevice>(nullptr));
     Simulator::Schedule(Seconds(3.1), &SendStuff, srcSocket, dstaddr, dstport);
     // If you uncomment what's below, it results in ASSERT failing since you can't
     // bind to a socket not existing on a node
-    // Simulator::Schedule(Seconds(4.0),&BindSock, srcSocket, dDstRtrdDst.Get(0));
+    // Simulator::Schedule(Seconds(4),&BindSock, srcSocket, dDstRtrdDst.Get(0));
     Simulator::Run();
     Simulator::Destroy();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/socket/socket-bound-tcp-static-routing.cc ns-3.44/examples/socket/socket-bound-tcp-static-routing.cc
--- ns-3.43/examples/socket/socket-bound-tcp-static-routing.cc	2024-10-09 16:41:09.836655600 -0700
+++ ns-3.44/examples/socket/socket-bound-tcp-static-routing.cc	2025-03-09 16:55:49.331370800 -0700
@@ -149,8 +149,8 @@
     PacketSinkHelper sink("ns3::TcpSocketFactory",
                           InetSocketAddress(Ipv4Address::GetAny(), dstport));
     ApplicationContainer apps = sink.Install(nDst);
-    apps.Start(Seconds(0.0));
-    apps.Stop(Seconds(10.0));
+    apps.Start(Seconds(0));
+    apps.Stop(Seconds(10));
 
     AsciiTraceHelper ascii;
     p2p.EnableAsciiAll(ascii.CreateFileStream("socket-bound-tcp-static-routing.tr"));
@@ -162,17 +162,17 @@
     // First packet as normal (goes via Rtr1)
     Simulator::Schedule(Seconds(0.1), &StartFlow, srcSocket1, dstaddr, dstport);
     // Second via Rtr1 explicitly
-    Simulator::Schedule(Seconds(1.0), &BindSock, srcSocket2, SrcToRtr1);
+    Simulator::Schedule(Seconds(1), &BindSock, srcSocket2, SrcToRtr1);
     Simulator::Schedule(Seconds(1.1), &StartFlow, srcSocket2, dstaddr, dstport);
     // Third via Rtr2 explicitly
-    Simulator::Schedule(Seconds(2.0), &BindSock, srcSocket3, SrcToRtr2);
+    Simulator::Schedule(Seconds(2), &BindSock, srcSocket3, SrcToRtr2);
     Simulator::Schedule(Seconds(2.1), &StartFlow, srcSocket3, dstaddr, dstport);
     // Fourth again as normal (goes via Rtr1)
-    Simulator::Schedule(Seconds(3.0), &BindSock, srcSocket4, Ptr<NetDevice>(nullptr));
+    Simulator::Schedule(Seconds(3), &BindSock, srcSocket4, Ptr<NetDevice>(nullptr));
     Simulator::Schedule(Seconds(3.1), &StartFlow, srcSocket4, dstaddr, dstport);
     // If you uncomment what's below, it results in ASSERT failing since you can't
     // bind to a socket not existing on a node
-    // Simulator::Schedule(Seconds(4.0),&BindSock, srcSocket, dDstRtrdDst.Get(0));
+    // Simulator::Schedule(Seconds(4),&BindSock, srcSocket, dDstRtrdDst.Get(0));
     Simulator::Run();
     Simulator::Destroy();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/socket/socket-options-ipv4.cc ns-3.44/examples/socket/socket-options-ipv4.cc
--- ns-3.43/examples/socket/socket-options-ipv4.cc	2024-10-09 16:41:09.836655600 -0700
+++ ns-3.44/examples/socket/socket-options-ipv4.cc	2025-03-09 16:55:49.331370800 -0700
@@ -136,7 +136,7 @@
     // Schedule SendPacket
     Time interPacketInterval = Seconds(packetInterval);
     Simulator::ScheduleWithContext(source->GetNode()->GetId(),
-                                   Seconds(1.0),
+                                   Seconds(1),
                                    &SendPacket,
                                    source,
                                    packetSize,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/socket/socket-options-ipv6.cc ns-3.44/examples/socket/socket-options-ipv6.cc
--- ns-3.43/examples/socket/socket-options-ipv6.cc	2024-10-09 16:41:09.836655600 -0700
+++ ns-3.44/examples/socket/socket-options-ipv6.cc	2025-03-09 16:55:49.331370800 -0700
@@ -135,7 +135,7 @@
     // Schedule SendPacket
     Time interPacketInterval = Seconds(packetInterval);
     Simulator::ScheduleWithContext(source->GetNode()->GetId(),
-                                   Seconds(1.0),
+                                   Seconds(1),
                                    &SendPacket,
                                    source,
                                    packetSize,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/stats/wifi-example-apps.h ns-3.44/examples/stats/wifi-example-apps.h
--- ns-3.43/examples/stats/wifi-example-apps.h	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/stats/wifi-example-apps.h	2025-03-09 16:55:49.335371000 -0700
@@ -31,8 +31,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
@@ -76,8 +76,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
@@ -86,13 +86,13 @@
 
     /**
      * Set the counter calculator for received packets.
-     * \param calc The CounterCalculator.
+     * @param calc The CounterCalculator.
      */
     void SetCounter(Ptr<CounterCalculator<>> calc);
 
     /**
      * Set the delay tracker for received packets.
-     * \param delay The Delay calculator.
+     * @param delay The Delay calculator.
      */
     void SetDelayTracker(Ptr<TimeMinMaxAvgTotalCalculator> delay);
 
@@ -105,7 +105,7 @@
 
     /**
      * Receive a packet.
-     * \param socket The receiving socket.
+     * @param socket The receiving socket.
      */
     void Receive(Ptr<Socket> socket);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/stats/wifi-example-sim.cc ns-3.44/examples/stats/wifi-example-sim.cc
--- ns-3.43/examples/stats/wifi-example-sim.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/stats/wifi-example-sim.cc	2025-03-09 16:55:49.335371000 -0700
@@ -37,9 +37,9 @@
 /**
  * Function called when a packet is transmitted.
  *
- * \param datac The counter of the number of transmitted packets.
- * \param path The callback context.
- * \param packet The transmitted packet.
+ * @param datac The counter of the number of transmitted packets.
+ * @param path The callback context.
+ * @param packet The transmitted packet.
  */
 void
 TxCallback(Ptr<CounterCalculator<uint32_t>> datac, std::string path, Ptr<const Packet> packet)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/tcp/dctcp-example.cc ns-3.44/examples/tcp/dctcp-example.cc
--- ns-3.43/examples/tcp/dctcp-example.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/tcp/dctcp-example.cc	2025-03-09 16:55:49.335371000 -0700
@@ -287,7 +287,7 @@
 
     Config::SetDefault("ns3::TcpL4Protocol::SocketType", StringValue("ns3::" + tcpTypeId));
 
-    Time startTime = Seconds(0);
+    Time startTime{0};
     Time stopTime = flowStartupWindow + convergenceTime + measurementWindow;
 
     rxS1R1Bytes.reserve(10);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/tcp/star.cc ns-3.44/examples/tcp/star.cc
--- ns-3.43/examples/tcp/star.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/tcp/star.cc	2025-03-09 16:55:49.335371000 -0700
@@ -67,8 +67,8 @@
     Address hubLocalAddress(InetSocketAddress(Ipv4Address::GetAny(), port));
     PacketSinkHelper packetSinkHelper("ns3::TcpSocketFactory", hubLocalAddress);
     ApplicationContainer hubApp = packetSinkHelper.Install(star.GetHub());
-    hubApp.Start(Seconds(1.0));
-    hubApp.Stop(Seconds(10.0));
+    hubApp.Start(Seconds(1));
+    hubApp.Stop(Seconds(10));
 
     //
     // Create OnOff applications to send TCP to the hub, one on each spoke node.
@@ -85,8 +85,8 @@
         onOffHelper.SetAttribute("Remote", remoteAddress);
         spokeApps.Add(onOffHelper.Install(star.GetSpokeNode(i)));
     }
-    spokeApps.Start(Seconds(1.0));
-    spokeApps.Stop(Seconds(10.0));
+    spokeApps.Start(Seconds(1));
+    spokeApps.Stop(Seconds(10));
 
     NS_LOG_INFO("Enable static global routing.");
     //
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/tcp/tcp-bbr-example.cc ns-3.44/examples/tcp/tcp-bbr-example.cc
--- ns-3.43/examples/tcp/tcp-bbr-example.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/tcp/tcp-bbr-example.cc	2025-03-09 16:55:49.335371000 -0700
@@ -59,7 +59,7 @@
 std::ofstream queueSize;
 
 uint32_t prev = 0;
-Time prevTime = Seconds(0);
+Time prevTime;
 
 // Calculate throughput
 static void
@@ -221,7 +221,7 @@
     // Install application on the receiver
     PacketSinkHelper sink("ns3::TcpSocketFactory", InetSocketAddress(Ipv4Address::GetAny(), port));
     ApplicationContainer sinkApps = sink.Install(receiver.Get(0));
-    sinkApps.Start(Seconds(0.0));
+    sinkApps.Start(Seconds(0));
     sinkApps.Stop(stopTime);
 
     // Create a new directory to store the output of the program
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/tcp/tcp-bulk-send.cc ns-3.44/examples/tcp/tcp-bulk-send.cc
--- ns-3.43/examples/tcp/tcp-bulk-send.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/tcp/tcp-bulk-send.cc	2025-03-09 16:55:49.335371000 -0700
@@ -85,16 +85,16 @@
     // Set the amount of data to send in bytes.  Zero is unlimited.
     source.SetAttribute("MaxBytes", UintegerValue(maxBytes));
     ApplicationContainer sourceApps = source.Install(nodes.Get(0));
-    sourceApps.Start(Seconds(0.0));
-    sourceApps.Stop(Seconds(10.0));
+    sourceApps.Start(Seconds(0));
+    sourceApps.Stop(Seconds(10));
 
     //
     // Create a PacketSinkApplication and install it on node 1
     //
     PacketSinkHelper sink("ns3::TcpSocketFactory", InetSocketAddress(Ipv4Address::GetAny(), port));
     ApplicationContainer sinkApps = sink.Install(nodes.Get(1));
-    sinkApps.Start(Seconds(0.0));
-    sinkApps.Stop(Seconds(10.0));
+    sinkApps.Start(Seconds(0));
+    sinkApps.Stop(Seconds(10));
 
     //
     // Set up tracing if enabled
@@ -110,7 +110,7 @@
     // Now, do the actual simulation.
     //
     NS_LOG_INFO("Run Simulation.");
-    Simulator::Stop(Seconds(10.0));
+    Simulator::Stop(Seconds(10));
     Simulator::Run();
     Simulator::Destroy();
     NS_LOG_INFO("Done.");
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/tcp/tcp-large-transfer.cc ns-3.44/examples/tcp/tcp-large-transfer.cc
--- ns-3.43/examples/tcp/tcp-large-transfer.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/tcp/tcp-large-transfer.cc	2025-03-09 16:55:49.335371000 -0700
@@ -52,25 +52,25 @@
 /**
  * Start a flow.
  *
- * \param localSocket The local (sending) socket.
- * \param servAddress The server address.
- * \param servPort The server port.
+ * @param localSocket The local (sending) socket.
+ * @param servAddress The server address.
+ * @param servPort The server port.
  */
 void StartFlow(Ptr<Socket> localSocket, Ipv4Address servAddress, uint16_t servPort);
 
 /**
  * Write to the buffer, filling it.
  *
- * \param localSocket The socket.
- * \param txSpace The number of bytes to write.
+ * @param localSocket The socket.
+ * @param txSpace The number of bytes to write.
  */
 void WriteUntilBufferFull(Ptr<Socket> localSocket, uint32_t txSpace);
 
 /**
  * Congestion window tracker function.
  *
- * \param oldval Old value.
- * \param newval New value.
+ * @param oldval Old value.
+ * @param newval New value.
  */
 static void
 CwndTracer(uint32_t oldval, uint32_t newval)
@@ -151,8 +151,8 @@
                           InetSocketAddress(Ipv4Address::GetAny(), servPort));
 
     ApplicationContainer apps = sink.Install(n1n2.Get(1));
-    apps.Start(Seconds(0.0));
-    apps.Stop(Seconds(3.0));
+    apps.Start(Seconds(0));
+    apps.Stop(Seconds(3));
 
     // Create a source to send packets from n0.  Instead of a full Application
     // and the helper APIs you might see in other example files, this example
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/tcp/tcp-linux-reno.cc ns-3.44/examples/tcp/tcp-linux-reno.cc
--- ns-3.43/examples/tcp/tcp-linux-reno.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/tcp/tcp-linux-reno.cc	2025-03-09 16:55:49.335371000 -0700
@@ -92,8 +92,8 @@
     BulkSendHelper source(socketFactory, InetSocketAddress(address, port));
     source.SetAttribute("MaxBytes", UintegerValue(0));
     ApplicationContainer sourceApps = source.Install(node);
-    sourceApps.Start(Seconds(10.0));
-    Simulator::Schedule(Seconds(10.0) + Seconds(0.001), &TraceCwnd, nodeId, cwndWindow, CwndTrace);
+    sourceApps.Start(Seconds(10));
+    Simulator::Schedule(Seconds(10) + Seconds(0.001), &TraceCwnd, nodeId, cwndWindow, CwndTrace);
     sourceApps.Stop(stopTime);
 }
 
@@ -103,7 +103,7 @@
 {
     PacketSinkHelper sink(socketFactory, InetSocketAddress(Ipv4Address::GetAny(), port));
     ApplicationContainer sinkApps = sink.Install(node);
-    sinkApps.Start(Seconds(10.0));
+    sinkApps.Start(Seconds(10));
     sinkApps.Stop(stopTime);
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/tcp/tcp-pcap-nanosec-example.cc ns-3.44/examples/tcp/tcp-pcap-nanosec-example.cc
--- ns-3.43/examples/tcp/tcp-pcap-nanosec-example.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/tcp/tcp-pcap-nanosec-example.cc	2025-03-09 16:55:49.335371000 -0700
@@ -108,16 +108,16 @@
     // Set the amount of data to send in bytes.  Zero is unlimited.
     source.SetAttribute("MaxBytes", UintegerValue(maxBytes));
     ApplicationContainer sourceApps = source.Install(nodes.Get(0));
-    sourceApps.Start(Seconds(0.0));
-    sourceApps.Stop(Seconds(10.0));
+    sourceApps.Start(Seconds(0));
+    sourceApps.Stop(Seconds(10));
 
     //
     // Create a PacketSinkApplication and install it on node 1
     //
     PacketSinkHelper sink("ns3::TcpSocketFactory", InetSocketAddress(Ipv4Address::GetAny(), port));
     ApplicationContainer sinkApps = sink.Install(nodes.Get(1));
-    sinkApps.Start(Seconds(0.0));
-    sinkApps.Stop(Seconds(10.0));
+    sinkApps.Start(Seconds(0));
+    sinkApps.Stop(Seconds(10));
 
     //
     // Set up tracing if enabled
@@ -132,7 +132,7 @@
     // Now, do the actual simulation.
     //
     NS_LOG_INFO("Run Simulation.");
-    Simulator::Stop(Seconds(10.0));
+    Simulator::Stop(Seconds(10));
     Simulator::Run();
     Simulator::Destroy();
     NS_LOG_INFO("Done.");
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/tcp/tcp-star-server.cc ns-3.44/examples/tcp/tcp-star-server.cc
--- ns-3.43/examples/tcp/tcp-star-server.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/tcp/tcp-star-server.cc	2025-03-09 16:55:49.335371000 -0700
@@ -115,8 +115,8 @@
     Address sinkLocalAddress(InetSocketAddress(Ipv4Address::GetAny(), port));
     PacketSinkHelper sinkHelper("ns3::TcpSocketFactory", sinkLocalAddress);
     ApplicationContainer sinkApp = sinkHelper.Install(serverNode);
-    sinkApp.Start(Seconds(1.0));
-    sinkApp.Stop(Seconds(10.0));
+    sinkApp.Start(Seconds(1));
+    sinkApp.Stop(Seconds(10));
 
     // Create the OnOff applications to send TCP to the server
     OnOffHelper clientHelper("ns3::TcpSocketFactory", Address());
@@ -133,8 +133,8 @@
         clientHelper.SetAttribute("Remote", remoteAddress);
         clientApps.Add(clientHelper.Install(clientNodes.Get(i)));
     }
-    clientApps.Start(Seconds(1.0));
-    clientApps.Stop(Seconds(10.0));
+    clientApps.Start(Seconds(1));
+    clientApps.Stop(Seconds(10));
 
     // configure tracing
     AsciiTraceHelper ascii;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/tcp/tcp-validation.cc ns-3.44/examples/tcp/tcp-validation.cc
--- ns-3.43/examples/tcp/tcp-validation.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/tcp/tcp-validation.cc	2025-03-09 16:55:49.335371000 -0700
@@ -145,9 +145,9 @@
 /**
  * Trace first congestion window.
  *
- * \param ofStream Output filestream.
- * \param oldCwnd Old value.
- * \param newCwnd new value.
+ * @param ofStream Output filestream.
+ * @param oldCwnd Old value.
+ * @param newCwnd new value.
  */
 void
 TraceFirstCwnd(std::ofstream* ofStream, uint32_t oldCwnd, uint32_t newCwnd)
@@ -190,10 +190,10 @@
 /**
  * Trace first TcpDctcp.
  *
- * \param ofStream Output filestream.
- * \param bytesMarked Bytes marked.
- * \param bytesAcked Bytes ACKed.
- * \param alpha Alpha.
+ * @param ofStream Output filestream.
+ * @param bytesMarked Bytes marked.
+ * @param bytesAcked Bytes ACKed.
+ * @param alpha Alpha.
  */
 void
 TraceFirstDctcp(std::ofstream* ofStream, uint32_t bytesMarked, uint32_t bytesAcked, double alpha)
@@ -243,9 +243,9 @@
 /**
  * Trace first RTT.
  *
- * \param ofStream Output filestream.
- * \param oldRtt Old value.
- * \param newRtt New value.
+ * @param ofStream Output filestream.
+ * @param oldRtt Old value.
+ * @param newRtt New value.
  */
 void
 TraceFirstRtt(std::ofstream* ofStream, Time oldRtt, Time newRtt)
@@ -260,9 +260,9 @@
 /**
  * Trace second congestion window.
  *
- * \param ofStream Output filestream.
- * \param oldCwnd Old value.
- * \param newCwnd new value.
+ * @param ofStream Output filestream.
+ * @param oldCwnd Old value.
+ * @param newCwnd new value.
  */
 void
 TraceSecondCwnd(std::ofstream* ofStream, uint32_t oldCwnd, uint32_t newCwnd)
@@ -279,9 +279,9 @@
 /**
  * Trace second RTT.
  *
- * \param ofStream Output filestream.
- * \param oldRtt Old value.
- * \param newRtt New value.
+ * @param ofStream Output filestream.
+ * @param oldRtt Old value.
+ * @param newRtt New value.
  */
 void
 TraceSecondRtt(std::ofstream* ofStream, Time oldRtt, Time newRtt)
@@ -296,10 +296,10 @@
 /**
  * Trace second TcpDctcp.
  *
- * \param ofStream Output filestream.
- * \param bytesMarked Bytes marked.
- * \param bytesAcked Bytes ACKed.
- * \param alpha Alpha.
+ * @param ofStream Output filestream.
+ * @param bytesMarked Bytes marked.
+ * @param bytesAcked Bytes ACKed.
+ * @param alpha Alpha.
  */
 void
 TraceSecondDctcp(std::ofstream* ofStream, uint32_t bytesMarked, uint32_t bytesAcked, double alpha)
@@ -313,8 +313,8 @@
 /**
  * Trace ping RTT.
  *
- * \param ofStream Output filestream.
- * \param rtt RTT value.
+ * @param ofStream Output filestream.
+ * @param rtt RTT value.
  */
 void
 TracePingRtt(std::ofstream* ofStream, uint16_t, Time rtt)
@@ -328,8 +328,8 @@
 /**
  * Trace first Rx.
  *
- * \param packet The packet.
- * \param address The sender address.
+ * @param packet The packet.
+ * @param address The sender address.
  */
 void
 TraceFirstRx(Ptr<const Packet> packet, const Address& address)
@@ -340,8 +340,8 @@
 /**
  * Trace second Rx.
  *
- * \param packet The packet.
- * \param address The sender address.
+ * @param packet The packet.
+ * @param address The sender address.
  */
 void
 TraceSecondRx(Ptr<const Packet> packet, const Address& address)
@@ -352,8 +352,8 @@
 /**
  * Trace queue drop.
  *
- * \param ofStream Output filestream.
- * \param item The dropped QueueDiscItem.
+ * @param ofStream Output filestream.
+ * @param item The dropped QueueDiscItem.
  */
 void
 TraceQueueDrop(std::ofstream* ofStream, Ptr<const QueueDiscItem> item)
@@ -368,9 +368,9 @@
 /**
  * Trace queue marks.
  *
- * \param ofStream Output filestream.
- * \param item The marked QueueDiscItem.
- * \param reason The reason.
+ * @param ofStream Output filestream.
+ * @param item The marked QueueDiscItem.
+ * @param reason The reason.
  */
 void
 TraceQueueMark(std::ofstream* ofStream, Ptr<const QueueDiscItem> item, const char* reason)
@@ -385,10 +385,10 @@
 /**
  * Trace queue length.
  *
- * \param ofStream Output filestream.
- * \param queueLinkRate Queue link rate.
- * \param oldVal Old value.
- * \param newVal New value.
+ * @param ofStream Output filestream.
+ * @param queueLinkRate Queue link rate.
+ * @param oldVal Old value.
+ * @param newVal New value.
  */
 void
 TraceQueueLength(std::ofstream* ofStream, DataRate queueLinkRate, uint32_t oldVal, uint32_t newVal)
@@ -405,8 +405,8 @@
 /**
  * Trace marks frequency.
  *
- * \param ofStream Output filestream.
- * \param marksSamplingInterval The mark sampling interval.
+ * @param ofStream Output filestream.
+ * @param marksSamplingInterval The mark sampling interval.
  */
 void
 TraceMarksFrequency(std::ofstream* ofStream, Time marksSamplingInterval)
@@ -425,8 +425,8 @@
 /**
  * Trace the first throughput.
  *
- * \param ofStream Output filestream.
- * \param throughputInterval The throughput interval.
+ * @param ofStream Output filestream.
+ * @param throughputInterval The throughput interval.
  */
 void
 TraceFirstThroughput(std::ofstream* ofStream, Time throughputInterval)
@@ -475,8 +475,8 @@
 /**
  * Trace the second throughput.
  *
- * \param ofStream Output filestream.
- * \param throughputInterval The throughput interval.
+ * @param ofStream Output filestream.
+ * @param throughputInterval The throughput interval.
  */
 void
 TraceSecondThroughput(std::ofstream* ofStream, Time throughputInterval)
@@ -493,7 +493,7 @@
 /**
  * Schedule trace connection.
  *
- * \param ofStream Output filestream.
+ * @param ofStream Output filestream.
  */
 void
 ScheduleFirstTcpCwndTraceConnection(std::ofstream* ofStream)
@@ -506,7 +506,7 @@
 /**
  * Schedule trace connection.
  *
- * \param ofStream Output filestream.
+ * @param ofStream Output filestream.
  */
 void
 ScheduleFirstTcpRttTraceConnection(std::ofstream* ofStream)
@@ -518,7 +518,7 @@
 /**
  * Schedule trace connection.
  *
- * \param ofStream Output filestream.
+ * @param ofStream Output filestream.
  */
 void
 ScheduleFirstDctcpTraceConnection(std::ofstream* ofStream)
@@ -531,7 +531,7 @@
 /**
  * Schedule trace connection.
  *
- * \param ofStream Output filestream.
+ * @param ofStream Output filestream.
  */
 void
 ScheduleSecondDctcpTraceConnection(std::ofstream* ofStream)
@@ -554,7 +554,7 @@
 /**
  * Schedule trace connection.
  *
- * \param ofStream Output filestream.
+ * @param ofStream Output filestream.
  */
 void
 ScheduleSecondTcpCwndTraceConnection(std::ofstream* ofStream)
@@ -566,7 +566,7 @@
 /**
  * Schedule trace connection.
  *
- * \param ofStream Output filestream.
+ * @param ofStream Output filestream.
  */
 void
 ScheduleSecondTcpRttTraceConnection(std::ofstream* ofStream)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/tcp/tcp-variants-comparison.cc ns-3.44/examples/tcp/tcp-variants-comparison.cc
--- ns-3.43/examples/tcp/tcp-variants-comparison.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/tcp/tcp-variants-comparison.cc	2025-03-09 16:55:49.335371000 -0700
@@ -62,8 +62,8 @@
 /**
  * Get the Node Id From Context.
  *
- * \param context The context.
- * \return the node ID.
+ * @param context The context.
+ * @return the node ID.
  */
 static uint32_t
 GetNodeIdFromContext(std::string context)
@@ -76,9 +76,9 @@
 /**
  * Congestion window tracer.
  *
- * \param context The context.
- * \param oldval Old value.
- * \param newval New value.
+ * @param context The context.
+ * @param oldval Old value.
+ * @param newval New value.
  */
 static void
 CwndTracer(std::string context, uint32_t oldval, uint32_t newval)
@@ -103,9 +103,9 @@
 /**
  * Slow start threshold tracer.
  *
- * \param context The context.
- * \param oldval Old value.
- * \param newval New value.
+ * @param context The context.
+ * @param oldval Old value.
+ * @param newval New value.
  */
 static void
 SsThreshTracer(std::string context, uint32_t oldval, uint32_t newval)
@@ -131,9 +131,9 @@
 /**
  * RTT tracer.
  *
- * \param context The context.
- * \param oldval Old value.
- * \param newval New value.
+ * @param context The context.
+ * @param oldval Old value.
+ * @param newval New value.
  */
 static void
 RttTracer(std::string context, Time oldval, Time newval)
@@ -152,9 +152,9 @@
 /**
  * RTO tracer.
  *
- * \param context The context.
- * \param oldval Old value.
- * \param newval New value.
+ * @param context The context.
+ * @param oldval Old value.
+ * @param newval New value.
  */
 static void
 RtoTracer(std::string context, Time oldval, Time newval)
@@ -173,9 +173,9 @@
 /**
  * Next TX tracer.
  *
- * \param context The context.
- * \param old Old sequence number.
- * \param nextTx Next sequence number.
+ * @param context The context.
+ * @param old Old sequence number.
+ * @param nextTx Next sequence number.
  */
 static void
 NextTxTracer(std::string context, SequenceNumber32 old [[maybe_unused]], SequenceNumber32 nextTx)
@@ -189,9 +189,9 @@
 /**
  * In-flight tracer.
  *
- * \param context The context.
- * \param old Old value.
- * \param inFlight In flight value.
+ * @param context The context.
+ * @param old Old value.
+ * @param inFlight In flight value.
  */
 static void
 InFlightTracer(std::string context, uint32_t old [[maybe_unused]], uint32_t inFlight)
@@ -205,9 +205,9 @@
 /**
  * Next RX tracer.
  *
- * \param context The context.
- * \param old Old sequence number.
- * \param nextRx Next sequence number.
+ * @param context The context.
+ * @param old Old sequence number.
+ * @param nextRx Next sequence number.
  */
 static void
 NextRxTracer(std::string context, SequenceNumber32 old [[maybe_unused]], SequenceNumber32 nextRx)
@@ -221,8 +221,8 @@
 /**
  * Congestion window trace connection.
  *
- * \param cwnd_tr_file_name Congestion window trace file name.
- * \param nodeId Node ID.
+ * @param cwnd_tr_file_name Congestion window trace file name.
+ * @param nodeId Node ID.
  */
 static void
 TraceCwnd(std::string cwnd_tr_file_name, uint32_t nodeId)
@@ -237,8 +237,8 @@
 /**
  * Slow start threshold trace connection.
  *
- * \param ssthresh_tr_file_name Slow start threshold trace file name.
- * \param nodeId Node ID.
+ * @param ssthresh_tr_file_name Slow start threshold trace file name.
+ * @param nodeId Node ID.
  */
 static void
 TraceSsThresh(std::string ssthresh_tr_file_name, uint32_t nodeId)
@@ -253,8 +253,8 @@
 /**
  * RTT trace connection.
  *
- * \param rtt_tr_file_name RTT trace file name.
- * \param nodeId Node ID.
+ * @param rtt_tr_file_name RTT trace file name.
+ * @param nodeId Node ID.
  */
 static void
 TraceRtt(std::string rtt_tr_file_name, uint32_t nodeId)
@@ -268,8 +268,8 @@
 /**
  * RTO trace connection.
  *
- * \param rto_tr_file_name RTO trace file name.
- * \param nodeId Node ID.
+ * @param rto_tr_file_name RTO trace file name.
+ * @param nodeId Node ID.
  */
 static void
 TraceRto(std::string rto_tr_file_name, uint32_t nodeId)
@@ -283,8 +283,8 @@
 /**
  * Next TX trace connection.
  *
- * \param next_tx_seq_file_name Next TX trace file name.
- * \param nodeId Node ID.
+ * @param next_tx_seq_file_name Next TX trace file name.
+ * @param nodeId Node ID.
  */
 static void
 TraceNextTx(std::string& next_tx_seq_file_name, uint32_t nodeId)
@@ -299,8 +299,8 @@
 /**
  * In flight trace connection.
  *
- * \param in_flight_file_name In flight trace file name.
- * \param nodeId Node ID.
+ * @param in_flight_file_name In flight trace file name.
+ * @param nodeId Node ID.
  */
 static void
 TraceInFlight(std::string& in_flight_file_name, uint32_t nodeId)
@@ -315,8 +315,8 @@
 /**
  * Next RX trace connection.
  *
- * \param next_rx_seq_file_name Next RX trace file name.
- * \param nodeId Node ID.
+ * @param next_rx_seq_file_name Next RX trace file name.
+ * @param nodeId Node ID.
  */
 static void
 TraceNextRx(std::string& next_rx_seq_file_name, uint32_t nodeId)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/traffic-control/queue-discs-benchmark.cc ns-3.44/examples/traffic-control/queue-discs-benchmark.cc
--- ns-3.43/examples/traffic-control/queue-discs-benchmark.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/traffic-control/queue-discs-benchmark.cc	2025-03-09 16:55:49.335371000 -0700
@@ -58,9 +58,9 @@
 /**
  * Print the queue limits.
  *
- * \param stream The output stream.
- * \param oldVal Old value.
- * \param newVal New value.
+ * @param stream The output stream.
+ * @param oldVal Old value.
+ * @param newVal New value.
  */
 void
 LimitsTrace(Ptr<OutputStreamWrapper> stream, uint32_t oldVal, uint32_t newVal)
@@ -71,9 +71,9 @@
 /**
  * Print the bytes in the queue.
  *
- * \param stream The output stream.
- * \param oldVal Old value.
- * \param newVal New value.
+ * @param stream The output stream.
+ * @param oldVal Old value.
+ * @param newVal New value.
  */
 void
 BytesInQueueTrace(Ptr<OutputStreamWrapper> stream, uint32_t oldVal, uint32_t newVal)
@@ -84,9 +84,9 @@
 /**
  * Sample and print the queue goodput.
  *
- * \param app The Tx app.
- * \param stream The output stream.
- * \param period The sampling period.
+ * @param app The Tx app.
+ * @param stream The output stream.
+ * @param period The sampling period.
  */
 static void
 GoodputSampling(ApplicationContainer app, Ptr<OutputStreamWrapper> stream, float period)
@@ -101,8 +101,8 @@
 /**
  * Print the ping RTT.
  *
- * \param context The context.
- * \param rtt The RTT.
+ * @param context The context.
+ * @param rtt The RTT.
  */
 static void
 PingRtt(std::string context, uint16_t, Time rtt)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/traffic-control/red-vs-fengadaptive.cc ns-3.44/examples/traffic-control/red-vs-fengadaptive.cc
--- ns-3.43/examples/traffic-control/red-vs-fengadaptive.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/traffic-control/red-vs-fengadaptive.cc	2025-03-09 16:55:49.335371000 -0700
@@ -139,8 +139,8 @@
     {
         sinkApps.Add(packetSinkHelper.Install(d.GetLeft(i)));
     }
-    sinkApps.Start(Seconds(0.0));
-    sinkApps.Stop(Seconds(30.0));
+    sinkApps.Start(Seconds(0));
+    sinkApps.Stop(Seconds(30));
 
     ApplicationContainer clientApps;
     for (uint32_t i = 0; i < d.RightCount(); ++i)
@@ -150,8 +150,8 @@
         clientHelper.SetAttribute("Remote", remoteAddress);
         clientApps.Add(clientHelper.Install(d.GetRight(i)));
     }
-    clientApps.Start(Seconds(1.0)); // Start 1 second after sink
-    clientApps.Stop(Seconds(15.0)); // Stop before the sink
+    clientApps.Start(Seconds(1)); // Start 1 second after sink
+    clientApps.Stop(Seconds(15)); // Stop before the sink
 
     Ipv4GlobalRoutingHelper::PopulateRoutingTables();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/traffic-control/red-vs-nlred.cc ns-3.44/examples/traffic-control/red-vs-nlred.cc
--- ns-3.43/examples/traffic-control/red-vs-nlred.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/traffic-control/red-vs-nlred.cc	2025-03-09 16:55:49.335371000 -0700
@@ -140,8 +140,8 @@
     {
         sinkApps.Add(packetSinkHelper.Install(d.GetLeft(i)));
     }
-    sinkApps.Start(Seconds(0.0));
-    sinkApps.Stop(Seconds(30.0));
+    sinkApps.Start(Seconds(0));
+    sinkApps.Stop(Seconds(30));
 
     ApplicationContainer clientApps;
     for (uint32_t i = 0; i < d.RightCount(); ++i)
@@ -151,8 +151,8 @@
         clientHelper.SetAttribute("Remote", remoteAddress);
         clientApps.Add(clientHelper.Install(d.GetRight(i)));
     }
-    clientApps.Start(Seconds(1.0)); // Start 1 second after sink
-    clientApps.Stop(Seconds(15.0)); // Stop before the sink
+    clientApps.Start(Seconds(1)); // Start 1 second after sink
+    clientApps.Stop(Seconds(15)); // Stop before the sink
 
     Ipv4GlobalRoutingHelper::PopulateRoutingTables();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/traffic-control/tbf-example.cc ns-3.44/examples/traffic-control/tbf-example.cc
--- ns-3.43/examples/traffic-control/tbf-example.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/traffic-control/tbf-example.cc	2025-03-09 16:55:49.335371000 -0700
@@ -108,7 +108,7 @@
     PacketSinkHelper packetSinkHelper("ns3::TcpSocketFactory", localAddress);
     ApplicationContainer sinkApp = packetSinkHelper.Install(nodes.Get(0));
 
-    sinkApp.Start(Seconds(0.0));
+    sinkApp.Start(Seconds(0));
     sinkApp.Stop(Seconds(simulationTime + 0.1));
 
     uint32_t payloadSize = 1448;
@@ -126,7 +126,7 @@
     onoff.SetAttribute("Tos", UintegerValue(0xb8));
 
     apps.Add(onoff.Install(nodes.Get(1)));
-    apps.Start(Seconds(1.0));
+    apps.Start(Seconds(1));
     apps.Stop(Seconds(simulationTime + 0.1));
 
     Simulator::Stop(Seconds(simulationTime + 5));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/traffic-control/traffic-control-example.cc ns-3.44/examples/traffic-control/traffic-control-example.cc
--- ns-3.43/examples/traffic-control/traffic-control-example.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/traffic-control/traffic-control-example.cc	2025-03-09 16:55:49.335371000 -0700
@@ -57,8 +57,8 @@
 /**
  * Number of packets in TX queue trace.
  *
- * \param oldValue Old velue.
- * \param newValue New value.
+ * @param oldValue Old velue.
+ * @param newValue New value.
  */
 void
 TcPacketsInQueueTrace(uint32_t oldValue, uint32_t newValue)
@@ -69,8 +69,8 @@
 /**
  * Packets in the device queue trace.
  *
- * \param oldValue Old velue.
- * \param newValue New value.
+ * @param oldValue Old velue.
+ * @param newValue New value.
  */
 void
 DevicePacketsInQueueTrace(uint32_t oldValue, uint32_t newValue)
@@ -81,7 +81,7 @@
 /**
  * TC Soujoun time trace.
  *
- * \param sojournTime The soujourn time.
+ * @param sojournTime The soujourn time.
  */
 void
 SojournTimeTrace(Time sojournTime)
@@ -149,7 +149,7 @@
     PacketSinkHelper packetSinkHelper(socketType, localAddress);
     ApplicationContainer sinkApp = packetSinkHelper.Install(nodes.Get(0));
 
-    sinkApp.Start(Seconds(0.0));
+    sinkApp.Start(Seconds(0));
     sinkApp.Stop(Seconds(simulationTime + 0.1));
 
     uint32_t payloadSize = 1448;
@@ -166,7 +166,7 @@
     onoff.SetAttribute("Remote", AddressValue(rmt));
     onoff.SetAttribute("Tos", UintegerValue(0xb8));
     apps.Add(onoff.Install(nodes.Get(1)));
-    apps.Start(Seconds(1.0));
+    apps.Start(Seconds(1));
     apps.Stop(Seconds(simulationTime + 0.1));
 
     FlowMonitorHelper flowmon;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/tutorial/fifth.cc ns-3.44/examples/tutorial/fifth.cc
--- ns-3.43/examples/tutorial/fifth.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/tutorial/fifth.cc	2025-03-09 16:55:49.335371000 -0700
@@ -54,8 +54,8 @@
 /**
  * Congestion window change callback
  *
- * \param oldCwnd Old congestion window.
- * \param newCwnd New congestion window.
+ * @param oldCwnd Old congestion window.
+ * @param newCwnd New congestion window.
  */
 static void
 CwndChange(uint32_t oldCwnd, uint32_t newCwnd)
@@ -66,7 +66,7 @@
 /**
  * Rx drop callback
  *
- * \param p The dropped packet.
+ * @param p The dropped packet.
  */
 static void
 RxDrop(Ptr<const Packet> p)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/tutorial/first.cc ns-3.44/examples/tutorial/first.cc
--- ns-3.43/examples/tutorial/first.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/tutorial/first.cc	2025-03-09 16:55:49.335371000 -0700
@@ -50,17 +50,17 @@
     UdpEchoServerHelper echoServer(9);
 
     ApplicationContainer serverApps = echoServer.Install(nodes.Get(1));
-    serverApps.Start(Seconds(1.0));
-    serverApps.Stop(Seconds(10.0));
+    serverApps.Start(Seconds(1));
+    serverApps.Stop(Seconds(10));
 
     UdpEchoClientHelper echoClient(interfaces.GetAddress(1), 9);
     echoClient.SetAttribute("MaxPackets", UintegerValue(1));
-    echoClient.SetAttribute("Interval", TimeValue(Seconds(1.0)));
+    echoClient.SetAttribute("Interval", TimeValue(Seconds(1)));
     echoClient.SetAttribute("PacketSize", UintegerValue(1024));
 
     ApplicationContainer clientApps = echoClient.Install(nodes.Get(0));
-    clientApps.Start(Seconds(2.0));
-    clientApps.Stop(Seconds(10.0));
+    clientApps.Start(Seconds(2));
+    clientApps.Stop(Seconds(10));
 
     Simulator::Run();
     Simulator::Destroy();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/tutorial/first.py ns-3.44/examples/tutorial/first.py
--- ns-3.43/examples/tutorial/first.py	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/tutorial/first.py	2025-03-09 16:55:49.335371000 -0700
@@ -41,18 +41,18 @@
 echoServer = ns.UdpEchoServerHelper(9)
 
 serverApps = echoServer.Install(nodes.Get(1))
-serverApps.Start(ns.Seconds(1.0))
-serverApps.Stop(ns.Seconds(10.0))
+serverApps.Start(ns.Seconds(1))
+serverApps.Stop(ns.Seconds(10))
 
 address = interfaces.GetAddress(1).ConvertTo()
 echoClient = ns.UdpEchoClientHelper(address, 9)
 echoClient.SetAttribute("MaxPackets", ns.UintegerValue(1))
-echoClient.SetAttribute("Interval", ns.TimeValue(ns.Seconds(1.0)))
+echoClient.SetAttribute("Interval", ns.TimeValue(ns.Seconds(1)))
 echoClient.SetAttribute("PacketSize", ns.UintegerValue(1024))
 
 clientApps = echoClient.Install(nodes.Get(0))
-clientApps.Start(ns.Seconds(2.0))
-clientApps.Stop(ns.Seconds(10.0))
+clientApps.Start(ns.Seconds(2))
+clientApps.Stop(ns.Seconds(10))
 
 ns.Simulator.Run()
 ns.Simulator.Destroy()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/tutorial/fourth.cc ns-3.44/examples/tutorial/fourth.cc
--- ns-3.43/examples/tutorial/fourth.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/tutorial/fourth.cc	2025-03-09 16:55:49.335371000 -0700
@@ -20,7 +20,7 @@
   public:
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId()
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/tutorial/second.cc ns-3.44/examples/tutorial/second.cc
--- ns-3.43/examples/tutorial/second.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/tutorial/second.cc	2025-03-09 16:55:49.335371000 -0700
@@ -79,17 +79,17 @@
     UdpEchoServerHelper echoServer(9);
 
     ApplicationContainer serverApps = echoServer.Install(csmaNodes.Get(nCsma));
-    serverApps.Start(Seconds(1.0));
-    serverApps.Stop(Seconds(10.0));
+    serverApps.Start(Seconds(1));
+    serverApps.Stop(Seconds(10));
 
     UdpEchoClientHelper echoClient(csmaInterfaces.GetAddress(nCsma), 9);
     echoClient.SetAttribute("MaxPackets", UintegerValue(1));
-    echoClient.SetAttribute("Interval", TimeValue(Seconds(1.0)));
+    echoClient.SetAttribute("Interval", TimeValue(Seconds(1)));
     echoClient.SetAttribute("PacketSize", UintegerValue(1024));
 
     ApplicationContainer clientApps = echoClient.Install(p2pNodes.Get(0));
-    clientApps.Start(Seconds(2.0));
-    clientApps.Stop(Seconds(10.0));
+    clientApps.Start(Seconds(2));
+    clientApps.Stop(Seconds(10));
 
     Ipv4GlobalRoutingHelper::PopulateRoutingTables();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/tutorial/second.py ns-3.44/examples/tutorial/second.py
--- ns-3.43/examples/tutorial/second.py	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/tutorial/second.py	2025-03-09 16:55:49.335371000 -0700
@@ -69,17 +69,17 @@
 echoServer = ns.UdpEchoServerHelper(9)
 
 serverApps = echoServer.Install(csmaNodes.Get(nCsma.value))
-serverApps.Start(ns.Seconds(1.0))
-serverApps.Stop(ns.Seconds(10.0))
+serverApps.Start(ns.Seconds(1))
+serverApps.Stop(ns.Seconds(10))
 
 echoClient = ns.UdpEchoClientHelper(csmaInterfaces.GetAddress(nCsma.value).ConvertTo(), 9)
 echoClient.SetAttribute("MaxPackets", ns.UintegerValue(1))
-echoClient.SetAttribute("Interval", ns.TimeValue(ns.Seconds(1.0)))
+echoClient.SetAttribute("Interval", ns.TimeValue(ns.Seconds(1)))
 echoClient.SetAttribute("PacketSize", ns.UintegerValue(1024))
 
 clientApps = echoClient.Install(p2pNodes.Get(0))
-clientApps.Start(ns.Seconds(2.0))
-clientApps.Stop(ns.Seconds(10.0))
+clientApps.Start(ns.Seconds(2))
+clientApps.Stop(ns.Seconds(10))
 
 ns.Ipv4GlobalRoutingHelper.PopulateRoutingTables()
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/tutorial/seventh.cc ns-3.44/examples/tutorial/seventh.cc
--- ns-3.43/examples/tutorial/seventh.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/tutorial/seventh.cc	2025-03-09 16:55:49.335371000 -0700
@@ -58,9 +58,9 @@
 /**
  * Congestion window change callback
  *
- * \param stream The output stream file.
- * \param oldCwnd Old congestion window.
- * \param newCwnd New congestion window.
+ * @param stream The output stream file.
+ * @param oldCwnd Old congestion window.
+ * @param newCwnd New congestion window.
  */
 static void
 CwndChange(Ptr<OutputStreamWrapper> stream, uint32_t oldCwnd, uint32_t newCwnd)
@@ -73,8 +73,8 @@
 /**
  * Rx drop callback
  *
- * \param file The output PCAP file.
- * \param p The dropped packet.
+ * @param file The output PCAP file.
+ * @param p The dropped packet.
  */
 static void
 RxDrop(Ptr<PcapFileWrapper> file, Ptr<const Packet> p)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/tutorial/sixth.cc ns-3.44/examples/tutorial/sixth.cc
--- ns-3.43/examples/tutorial/sixth.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/tutorial/sixth.cc	2025-03-09 16:55:49.335371000 -0700
@@ -54,9 +54,9 @@
 /**
  * Congestion window change callback
  *
- * \param stream The output stream file.
- * \param oldCwnd Old congestion window.
- * \param newCwnd New congestion window.
+ * @param stream The output stream file.
+ * @param oldCwnd Old congestion window.
+ * @param newCwnd New congestion window.
  */
 static void
 CwndChange(Ptr<OutputStreamWrapper> stream, uint32_t oldCwnd, uint32_t newCwnd)
@@ -69,8 +69,8 @@
 /**
  * Rx drop callback
  *
- * \param file The output PCAP file.
- * \param p The dropped packet.
+ * @param file The output PCAP file.
+ * @param p The dropped packet.
  */
 static void
 RxDrop(Ptr<PcapFileWrapper> file, Ptr<const Packet> p)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/tutorial/third.cc ns-3.44/examples/tutorial/third.cc
--- ns-3.43/examples/tutorial/third.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/tutorial/third.cc	2025-03-09 16:55:49.335371000 -0700
@@ -147,21 +147,21 @@
     UdpEchoServerHelper echoServer(9);
 
     ApplicationContainer serverApps = echoServer.Install(csmaNodes.Get(nCsma));
-    serverApps.Start(Seconds(1.0));
-    serverApps.Stop(Seconds(10.0));
+    serverApps.Start(Seconds(1));
+    serverApps.Stop(Seconds(10));
 
     UdpEchoClientHelper echoClient(csmaInterfaces.GetAddress(nCsma), 9);
     echoClient.SetAttribute("MaxPackets", UintegerValue(1));
-    echoClient.SetAttribute("Interval", TimeValue(Seconds(1.0)));
+    echoClient.SetAttribute("Interval", TimeValue(Seconds(1)));
     echoClient.SetAttribute("PacketSize", UintegerValue(1024));
 
     ApplicationContainer clientApps = echoClient.Install(wifiStaNodes.Get(nWifi - 1));
-    clientApps.Start(Seconds(2.0));
-    clientApps.Stop(Seconds(10.0));
+    clientApps.Start(Seconds(2));
+    clientApps.Stop(Seconds(10));
 
     Ipv4GlobalRoutingHelper::PopulateRoutingTables();
 
-    Simulator::Stop(Seconds(10.0));
+    Simulator::Stop(Seconds(10));
 
     if (tracing)
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/tutorial/third.py ns-3.44/examples/tutorial/third.py
--- ns-3.43/examples/tutorial/third.py	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/tutorial/third.py	2025-03-09 16:55:49.335371000 -0700
@@ -135,21 +135,21 @@
 echoServer = ns.UdpEchoServerHelper(9)
 
 serverApps = echoServer.Install(csmaNodes.Get(nCsma.value))
-serverApps.Start(ns.Seconds(1.0))
-serverApps.Stop(ns.Seconds(10.0))
+serverApps.Start(ns.Seconds(1))
+serverApps.Stop(ns.Seconds(10))
 
 echoClient = ns.UdpEchoClientHelper(csmaInterfaces.GetAddress(nCsma.value).ConvertTo(), 9)
 echoClient.SetAttribute("MaxPackets", ns.UintegerValue(1))
-echoClient.SetAttribute("Interval", ns.TimeValue(ns.Seconds(1.0)))
+echoClient.SetAttribute("Interval", ns.TimeValue(ns.Seconds(1)))
 echoClient.SetAttribute("PacketSize", ns.UintegerValue(1024))
 
 clientApps = echoClient.Install(wifiStaNodes.Get(nWifi.value - 1))
-clientApps.Start(ns.Seconds(2.0))
-clientApps.Stop(ns.Seconds(10.0))
+clientApps.Start(ns.Seconds(2))
+clientApps.Stop(ns.Seconds(10))
 
 ns.Ipv4GlobalRoutingHelper.PopulateRoutingTables()
 
-ns.Simulator.Stop(ns.Seconds(10.0))
+ns.Simulator.Stop(ns.Seconds(10))
 
 if tracing.value:
     phy.SetPcapDataLinkType(phy.DLT_IEEE802_11_RADIO)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/tutorial/tutorial-app.h ns-3.44/examples/tutorial/tutorial-app.h
--- ns-3.43/examples/tutorial/tutorial-app.h	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/tutorial/tutorial-app.h	2025-03-09 16:55:49.335371000 -0700
@@ -25,17 +25,17 @@
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
     /**
      * Setup the socket.
-     * \param socket The socket.
-     * \param address The destination address.
-     * \param packetSize The packet size to transmit.
-     * \param nPackets The number of packets to transmit.
-     * \param dataRate the data rate to use.
+     * @param socket The socket.
+     * @param address The destination address.
+     * @param packetSize The packet size to transmit.
+     * @param nPackets The number of packets to transmit.
+     * @param dataRate the data rate to use.
      */
     void Setup(Ptr<Socket> socket,
                Address address,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/udp/udp-echo.cc ns-3.44/examples/udp/udp-echo.cc
--- ns-3.43/examples/udp/udp-echo.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/udp/udp-echo.cc	2025-03-09 16:55:49.335371000 -0700
@@ -92,8 +92,8 @@
     uint16_t port = 9; // well-known echo port number
     UdpEchoServerHelper server(port);
     ApplicationContainer apps = server.Install(n.Get(1));
-    apps.Start(Seconds(1.0));
-    apps.Stop(Seconds(10.0));
+    apps.Start(Seconds(1));
+    apps.Stop(Seconds(10));
 
     //
     // Create a UdpEchoClient application to send UDP datagrams from node zero to
@@ -107,8 +107,8 @@
     client.SetAttribute("Interval", TimeValue(interPacketInterval));
     client.SetAttribute("PacketSize", UintegerValue(packetSize));
     apps = client.Install(n.Get(0));
-    apps.Start(Seconds(2.0));
-    apps.Stop(Seconds(10.0));
+    apps.Start(Seconds(2));
+    apps.Stop(Seconds(10));
 
 #if 0
 //
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/udp-client-server/udp-client-server.cc ns-3.44/examples/udp-client-server/udp-client-server.cc
--- ns-3.43/examples/udp-client-server/udp-client-server.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/udp-client-server/udp-client-server.cc	2025-03-09 16:55:49.335371000 -0700
@@ -82,8 +82,8 @@
     uint16_t port = 4000;
     UdpServerHelper server(port);
     ApplicationContainer apps = server.Install(n.Get(1));
-    apps.Start(Seconds(1.0));
-    apps.Stop(Seconds(10.0));
+    apps.Start(Seconds(1));
+    apps.Stop(Seconds(10));
 
     NS_LOG_INFO("Create UdpClient application on node 0 to send to node 1.");
     uint32_t MaxPacketSize = 1024;
@@ -94,8 +94,8 @@
     client.SetAttribute("Interval", TimeValue(interPacketInterval));
     client.SetAttribute("PacketSize", UintegerValue(MaxPacketSize));
     apps = client.Install(n.Get(0));
-    apps.Start(Seconds(2.0));
-    apps.Stop(Seconds(10.0));
+    apps.Start(Seconds(2));
+    apps.Stop(Seconds(10));
 
     NS_LOG_INFO("Run Simulation.");
     Simulator::Run();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/udp-client-server/udp-trace-client-server.cc ns-3.44/examples/udp-client-server/udp-trace-client-server.cc
--- ns-3.43/examples/udp-client-server/udp-trace-client-server.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/udp-client-server/udp-trace-client-server.cc	2025-03-09 16:55:49.335371000 -0700
@@ -34,6 +34,7 @@
     // Declare variables used in command-line arguments
     bool useV6 = false;
     bool logging = true;
+    uint16_t port = 4000;
     Address serverAddress;
 
     CommandLine cmd(__FILE__);
@@ -67,30 +68,29 @@
         Ipv4AddressHelper ipv4;
         ipv4.SetBase("10.1.1.0", "255.255.255.0");
         Ipv4InterfaceContainer i = ipv4.Assign(d);
-        serverAddress = Address(i.GetAddress(1));
+        serverAddress = InetSocketAddress(i.GetAddress(1), port);
     }
     else
     {
         Ipv6AddressHelper ipv6;
         ipv6.SetBase("2001:0000:f00d:cafe::", Ipv6Prefix(64));
         Ipv6InterfaceContainer i6 = ipv6.Assign(d);
-        serverAddress = Address(i6.GetAddress(1, 1));
+        serverAddress = Inet6SocketAddress(i6.GetAddress(1, 1), port);
     }
 
     NS_LOG_INFO("Create UdpServer application on node 1.");
-    uint16_t port = 4000;
     UdpServerHelper server(port);
     ApplicationContainer apps = server.Install(n.Get(1));
-    apps.Start(Seconds(1.0));
-    apps.Stop(Seconds(10.0));
+    apps.Start(Seconds(1));
+    apps.Stop(Seconds(10));
 
     NS_LOG_INFO("Create UdpClient application on node 0 to send to node 1.");
     uint32_t MaxPacketSize = 1472; // Back off 20 (IP) + 8 (UDP) bytes from MTU
-    UdpTraceClientHelper client(serverAddress, port, "");
+    UdpTraceClientHelper client(serverAddress);
     client.SetAttribute("MaxPacketSize", UintegerValue(MaxPacketSize));
     apps = client.Install(n.Get(0));
-    apps.Start(Seconds(2.0));
-    apps.Stop(Seconds(10.0));
+    apps.Start(Seconds(2));
+    apps.Stop(Seconds(10));
 
     NS_LOG_INFO("Run Simulation.");
     Simulator::Run();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/wireless/CMakeLists.txt ns-3.44/examples/wireless/CMakeLists.txt
--- ns-3.43/examples/wireless/CMakeLists.txt	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/wireless/CMakeLists.txt	2025-03-09 16:55:49.335371000 -0700
@@ -298,3 +298,14 @@
   LIBRARIES_TO_LINK ${libwifi}
                     ${libapplications}
 )
+
+build_example(
+  NAME wifi-multicast
+  SOURCE_FILES wifi-multicast.cc
+  LIBRARIES_TO_LINK
+    ${libwifi}
+    ${libcore}
+    ${libnetwork}
+    ${libapplications}
+    ${libinternet}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/wireless/examples-to-run.py ns-3.44/examples/wireless/examples-to-run.py
--- ns-3.43/examples/wireless/examples-to-run.py	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/wireless/examples-to-run.py	2025-03-09 16:55:49.335371000 -0700
@@ -180,7 +180,7 @@
         "True",
     ),
     (
-        "wifi-eht-network --simulationTime=0.23s --udp=0 --downlink=1 --useRts=0 --nStations=4 --dlAckType=ACK-SU-FORMAT --enableUlOfdma=1 --enableBsrp=0 --mcs=6 --frequency2=6  --minExpectedThroughput=60 --maxExpectedThroughput=430",
+        "wifi-eht-network --simulationTime=0.23s --udp=0 --downlink=1 --useRts=0 --nStations=4 --dlAckType=ACK-SU-FORMAT --enableUlOfdma=1 --enableBsrp=0 --mcs=6 --frequency2=6 --minExpectedThroughput=35 --maxExpectedThroughput=404",
         "True",
         "True",
     ),
@@ -195,7 +195,37 @@
         "True",
     ),
     (
-        "wifi-eht-network --simulationTime=0.25s --udp=0 --downlink=0 --useRts=0 --nStations=4 --dlAckType=AGGR-MU-BAR --enableUlOfdma=1 --enableBsrp=1 --mpduBufferSize=1024 --mcs=8 --muSchedAccessReqInterval=45ms --frequency2=6 --minExpectedThroughput=50 --maxExpectedThroughput=550",
+        "wifi-eht-network --simulationTime=0.25s --udp=0 --downlink=0 --useRts=0 --nStations=4 --dlAckType=AGGR-MU-BAR --enableUlOfdma=1 --enableBsrp=1 --mpduBufferSize=1024 --mcs=8 --muSchedAccessReqInterval=45ms --frequency2=6 --minExpectedThroughput=50 --maxExpectedThroughput=550 --RngRun=7",
+        "True",
+        "True",
+    ),
+    (
+        "wifi-eht-network --simulationTime=0.2s --frequency=2.4 --frequency2=5 --guardInterval=1600 --udp=0 --downlink=1 --useRts=0 --mpduBufferSize=512 --emlsrLinks=0,1 --emlsrPaddingDelay=32 --emlsrTransitionDelay=32 --channelSwitchDelay=32us --emlsrAuxSwitch=True --emlsrAuxTxCapable=True --minExpectedThroughput=5 --maxExpectedThroughput=200",
+        "True",
+        "True",
+    ),
+    (
+        "wifi-eht-network --simulationTime=0.2s --frequency=2.4 --frequency2=5 --guardInterval=1600 --udp=0 --downlink=1 --useRts=1 --mpduBufferSize=512 --emlsrLinks=0,1 --emlsrPaddingDelay=64 --emlsrTransitionDelay=64 --channelSwitchDelay=64us --emlsrMgrTypeId=ns3::AdvancedEmlsrManager --emlsrAuxSwitch=False --emlsrAuxTxCapable=True --minExpectedThroughput=5 --maxExpectedThroughput=190",
+        "True",
+        "True",
+    ),
+    (
+        "wifi-eht-network --simulationTime=0.2s --frequency=2.4 --frequency2=5 --guardInterval=1600 --udp=0 --downlink=0 --useRts=0 --mpduBufferSize=512 --emlsrLinks=0,1 --emlsrPaddingDelay=0 --emlsrTransitionDelay=0 --channelSwitchDelay=1ns --emlsrMgrTypeId=ns3::AdvancedEmlsrManager --emlsrAuxSwitch=False --emlsrAuxTxCapable=False --minExpectedThroughput=5 --maxExpectedThroughput=40 --RngRun=7",
+        "True",
+        "True",
+    ),
+    (
+        "wifi-eht-network --simulationTime=0.3s --frequency=2.4 --frequency2=5 --frequency3=6 --guardInterval=1600 --udp=0 --downlink=1 --useRts=0 --mpduBufferSize=512 --emlsrLinks=0,1,2 --emlsrPaddingDelay=32 --emlsrTransitionDelay=32 --channelSwitchDelay=32us --emlsrAuxSwitch=True --emlsrAuxTxCapable=True --nStations=4 --dlAckType=AGGR-MU-BAR --enableUlOfdma=1 --enableBsrp=0 --mcs=0,3,5,9,10 --minExpectedThroughput=8 --maxExpectedThroughput=300 --RngRun=6",
+        "True",
+        "True",
+    ),
+    (
+        "wifi-eht-network --simulationTime=0.3s --frequency=2.4 --frequency2=5 --frequency3=6 --guardInterval=1600 --udp=0 --downlink=0 --useRts=1 --mpduBufferSize=512 --emlsrLinks=0,1,2 --emlsrPaddingDelay=64 --emlsrTransitionDelay=64 --channelSwitchDelay=64us --emlsrAuxSwitch=False --emlsrAuxTxCapable=True --nStations=4 --dlAckType=MU-BAR --enableUlOfdma=1 --enableBsrp=1 --mcs=1,4,8,11,13 --minExpectedThroughput=10 --maxExpectedThroughput=260 --RngRun=4",
+        "True",
+        "True",
+    ),
+    (
+        "wifi-eht-network --simulationTime=0.3s --frequency=2.4 --frequency2=5 --frequency3=6 --guardInterval=1600 --udp=0 --downlink=0 --useRts=1 --mpduBufferSize=512 --emlsrLinks=0,1,2 --emlsrPaddingDelay=0 --emlsrTransitionDelay=0 --channelSwitchDelay=1ns --emlsrMgrTypeId=ns3::AdvancedEmlsrManager --emlsrAuxSwitch=False --emlsrAuxTxCapable=False --nStations=4 --dlAckType=ACK-SU-FORMAT --enableUlOfdma=1 --enableBsrp=1 --mcs=1,5,8,11 --minExpectedThroughput=8 --maxExpectedThroughput=288 --RngRun=5",
         "True",
         "True",
     ),
@@ -264,6 +294,51 @@
         "True",
         "False",
     ),
+    (
+        "wifi-multicast --minExpectedPackets=10",
+        "True",
+        "True",
+    ),
+    (
+        "wifi-multicast --gcrRetransmissionPolicy=GcrUr --minExpectedPackets=10",
+        "True",
+        "True",
+    ),
+    (
+        "wifi-multicast --gcrRetransmissionPolicy=GcrUr --multicastFrameErrorRate=0.2 --minExpectedPackets=10",
+        "True",
+        "True",
+    ),
+    (
+        "wifi-multicast --gcrRetransmissionPolicy=GcrUr --maxAmpduLength=65535 --maxPackets=0 --nStations=4 --dataRate=50Mbps --gcrProtection=Rts-Cts --rtsThreshold=0 --simulationTime=1 --minExpectedThroughput=35 --maxExpectedThroughput=40",
+        "True",
+        "True",
+    ),
+    (
+        "wifi-multicast --gcrRetransmissionPolicy=GcrUr --maxAmpduLength=65535 --maxPackets=0 --nStations=4 --dataRate=50Mbps --gcrProtection=Cts-To-Self --simulationTime=1 --minExpectedThroughput=40 --maxExpectedThroughput=45",
+        "True",
+        "True",
+    ),
+    (
+        "wifi-multicast --gcrRetransmissionPolicy=GcrBlockAck --minExpectedPackets=10",
+        "True",
+        "True",
+    ),
+    (
+        "wifi-multicast --gcrRetransmissionPolicy=GcrBlockAck --multicastFrameErrorRate=0.2 --minExpectedPackets=10",
+        "True",
+        "True",
+    ),
+    (
+        "wifi-multicast --gcrRetransmissionPolicy=GcrBlockAck --maxAmpduLength=65535 --maxPackets=0 --nStations=4 --dataRate=100Mbps --gcrProtection=Rts-Cts --rtsThreshold=0 --simulationTime=1s --minExpectedThroughput=100 --maxExpectedThroughput=100",
+        "True",
+        "True",
+    ),
+    (
+        "wifi-multicast --gcrRetransmissionPolicy=GcrBlockAck --maxAmpduLength=65535 --maxPackets=0 --nStations=4 --dataRate=100Mbps --gcrProtection=Cts-To-Self --simulationTime=1s --minExpectedThroughput=100 --maxExpectedThroughput=100",
+        "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.43/examples/wireless/mixed-wired-wireless.cc ns-3.44/examples/wireless/mixed-wired-wireless.cc
--- ns-3.43/examples/wireless/mixed-wired-wireless.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/wireless/mixed-wired-wireless.cc	2025-03-09 16:55:49.335371000 -0700
@@ -72,8 +72,8 @@
  * This function will be used below as a trace sink, if the command-line
  * argument or default value "useCourseChangeCallback" is set to true
  *
- * \param path The callback path.
- * \param model The mobility model.
+ * @param path The callback path.
+ * @param model The mobility model.
  */
 static void
 CourseChangeCallback(std::string path, Ptr<const MobilityModel> model)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/wireless/wifi-80211e-txop.cc ns-3.44/examples/wireless/wifi-80211e-txop.cc
--- ns-3.43/examples/wireless/wifi-80211e-txop.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/wireless/wifi-80211e-txop.cc	2025-03-09 16:55:49.335371000 -0700
@@ -63,12 +63,12 @@
     /**
      * Callback connected to TXOP duration trace source.
      *
-     * \param startTime TXOP start time
-     * \param duration TXOP duration
-     * \param linkId the ID of the link
+     * @param startTime TXOP start time
+     * @param duration TXOP duration
+     * @param linkId the ID of the link
      */
     void Trace(Time startTime, Time duration, uint8_t linkId);
-    Time m_max{Seconds(0)}; //!< maximum TXOP duration
+    Time m_max; //!< maximum TXOP duration
 };
 
 void
@@ -284,8 +284,8 @@
     uint16_t port = 5001;
     UdpServerHelper serverA(port);
     ApplicationContainer serverAppA = serverA.Install(wifiApNodes.Get(0));
-    serverAppA.Start(Seconds(0.0));
-    serverAppA.Stop(simulationTime + Seconds(1.0));
+    serverAppA.Start(Seconds(0));
+    serverAppA.Stop(simulationTime + Seconds(1));
 
     InetSocketAddress destA(ApInterfaceA.GetAddress(0), port);
 
@@ -297,13 +297,13 @@
     clientA.SetAttribute("Tos", UintegerValue(0x70)); // AC_BE
 
     ApplicationContainer clientAppA = clientA.Install(wifiStaNodes.Get(0));
-    clientAppA.Start(Seconds(1.0));
-    clientAppA.Stop(simulationTime + Seconds(1.0));
+    clientAppA.Start(Seconds(1));
+    clientAppA.Stop(simulationTime + Seconds(1));
 
     UdpServerHelper serverB(port);
     ApplicationContainer serverAppB = serverB.Install(wifiApNodes.Get(1));
-    serverAppB.Start(Seconds(0.0));
-    serverAppB.Stop(simulationTime + Seconds(1.0));
+    serverAppB.Start(Seconds(0));
+    serverAppB.Stop(simulationTime + Seconds(1));
 
     InetSocketAddress destB(ApInterfaceB.GetAddress(0), port);
 
@@ -315,13 +315,13 @@
     clientB.SetAttribute("Tos", UintegerValue(0x70)); // AC_BE
 
     ApplicationContainer clientAppB = clientB.Install(wifiStaNodes.Get(1));
-    clientAppB.Start(Seconds(1.0));
-    clientAppB.Stop(simulationTime + Seconds(1.0));
+    clientAppB.Start(Seconds(1));
+    clientAppB.Stop(simulationTime + Seconds(1));
 
     UdpServerHelper serverC(port);
     ApplicationContainer serverAppC = serverC.Install(wifiApNodes.Get(2));
-    serverAppC.Start(Seconds(0.0));
-    serverAppC.Stop(simulationTime + Seconds(1.0));
+    serverAppC.Start(Seconds(0));
+    serverAppC.Stop(simulationTime + Seconds(1));
 
     InetSocketAddress destC(ApInterfaceC.GetAddress(0), port);
 
@@ -333,13 +333,13 @@
     clientC.SetAttribute("Tos", UintegerValue(0xb8)); // AC_VI
 
     ApplicationContainer clientAppC = clientC.Install(wifiStaNodes.Get(2));
-    clientAppC.Start(Seconds(1.0));
-    clientAppC.Stop(simulationTime + Seconds(1.0));
+    clientAppC.Start(Seconds(1));
+    clientAppC.Stop(simulationTime + Seconds(1));
 
     UdpServerHelper serverD(port);
     ApplicationContainer serverAppD = serverD.Install(wifiApNodes.Get(3));
-    serverAppD.Start(Seconds(0.0));
-    serverAppD.Stop(simulationTime + Seconds(1.0));
+    serverAppD.Start(Seconds(0));
+    serverAppD.Stop(simulationTime + Seconds(1));
 
     InetSocketAddress destD(ApInterfaceD.GetAddress(0), port);
 
@@ -351,8 +351,8 @@
     clientD.SetAttribute("Tos", UintegerValue(0xb8)); // AC_VI
 
     ApplicationContainer clientAppD = clientD.Install(wifiStaNodes.Get(3));
-    clientAppD.Start(Seconds(1.0));
-    clientAppD.Stop(simulationTime + Seconds(1.0));
+    clientAppD.Start(Seconds(1));
+    clientAppD.Stop(simulationTime + Seconds(1));
 
     if (enablePcap)
     {
@@ -366,7 +366,7 @@
         phy.EnablePcap("STA_D", staDeviceD.Get(0));
     }
 
-    Simulator::Stop(simulationTime + Seconds(1.0));
+    Simulator::Stop(simulationTime + Seconds(1));
     Simulator::Run();
 
     /* Show results */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/wireless/wifi-80211n-mimo.cc ns-3.44/examples/wireless/wifi-80211n-mimo.cc
--- ns-3.43/examples/wireless/wifi-80211n-mimo.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/wireless/wifi-80211n-mimo.cc	2025-03-09 16:55:49.335371000 -0700
@@ -204,7 +204,7 @@
 
             /* Setting applications */
             const auto maxLoad = HtPhy::GetDataRate(i,
-                                                    channelBonding ? 40 : 20,
+                                                    channelBonding ? MHz_u{40} : MHz_u{20},
                                                     NanoSeconds(shortGuardInterval ? 400 : 800),
                                                     nStreams);
             ApplicationContainer serverApp;
@@ -214,8 +214,8 @@
                 uint16_t port = 9;
                 UdpServerHelper server(port);
                 serverApp = server.Install(wifiStaNode.Get(0));
-                serverApp.Start(Seconds(0.0));
-                serverApp.Stop(simulationTime + Seconds(1.0));
+                serverApp.Start(Seconds(0));
+                serverApp.Stop(simulationTime + Seconds(1));
                 const auto packetInterval = payloadSize * 8.0 / maxLoad;
 
                 UdpClientHelper client(staNodeInterface.GetAddress(0), port);
@@ -223,8 +223,8 @@
                 client.SetAttribute("Interval", TimeValue(Seconds(packetInterval)));
                 client.SetAttribute("PacketSize", UintegerValue(payloadSize));
                 ApplicationContainer clientApp = client.Install(wifiApNode.Get(0));
-                clientApp.Start(Seconds(1.0));
-                clientApp.Stop(simulationTime + Seconds(1.0));
+                clientApp.Start(Seconds(1));
+                clientApp.Stop(simulationTime + Seconds(1));
             }
             else
             {
@@ -233,8 +233,8 @@
                 Address localAddress(InetSocketAddress(Ipv4Address::GetAny(), port));
                 PacketSinkHelper packetSinkHelper("ns3::TcpSocketFactory", localAddress);
                 serverApp = packetSinkHelper.Install(wifiStaNode.Get(0));
-                serverApp.Start(Seconds(0.0));
-                serverApp.Stop(simulationTime + Seconds(1.0));
+                serverApp.Start(Seconds(0));
+                serverApp.Stop(simulationTime + Seconds(1));
 
                 OnOffHelper onoff("ns3::TcpSocketFactory", Ipv4Address::GetAny());
                 onoff.SetAttribute("OnTime",
@@ -246,13 +246,13 @@
                 AddressValue remoteAddress(InetSocketAddress(staNodeInterface.GetAddress(0), port));
                 onoff.SetAttribute("Remote", remoteAddress);
                 ApplicationContainer clientApp = onoff.Install(wifiApNode.Get(0));
-                clientApp.Start(Seconds(1.0));
-                clientApp.Stop(simulationTime + Seconds(1.0));
+                clientApp.Start(Seconds(1));
+                clientApp.Stop(simulationTime + Seconds(1));
             }
 
             Ipv4GlobalRoutingHelper::PopulateRoutingTables();
 
-            Simulator::Stop(simulationTime + Seconds(1.0));
+            Simulator::Stop(simulationTime + Seconds(1));
             Simulator::Run();
 
             double throughput = 0;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/wireless/wifi-adhoc.cc ns-3.44/examples/wireless/wifi-adhoc.cc
--- ns-3.43/examples/wireless/wifi-adhoc.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/wireless/wifi-adhoc.cc	2025-03-09 16:55:49.335371000 -0700
@@ -36,17 +36,17 @@
     Experiment();
     /**
      * Constructor.
-     * \param name The name of the experiment.
+     * @param name The name of the experiment.
      */
     Experiment(std::string name);
 
     /**
      * Run an experiment.
-     * \param wifi      //!< The WifiHelper class.
-     * \param wifiPhy   //!< The YansWifiPhyHelper class.
-     * \param wifiMac   //!< The WifiMacHelper class.
-     * \param wifiChannel //!< The YansWifiChannelHelper class.
-     * \return a 2D dataset of the experiment data.
+     * @param wifi      //!< The WifiHelper class.
+     * @param wifiPhy   //!< The YansWifiPhyHelper class.
+     * @param wifiMac   //!< The WifiMacHelper class.
+     * @param wifiChannel //!< The YansWifiChannelHelper class.
+     * @return a 2D dataset of the experiment data.
      */
     Gnuplot2dDataset Run(const WifiHelper& wifi,
                          const YansWifiPhyHelper& wifiPhy,
@@ -56,30 +56,30 @@
   private:
     /**
      * Receive a packet.
-     * \param socket The receiving socket.
+     * @param socket The receiving socket.
      */
     void ReceivePacket(Ptr<Socket> socket);
     /**
      * Set the position of a node.
-     * \param node The node.
-     * \param position The position of the node.
+     * @param node The node.
+     * @param position The position of the node.
      */
     void SetPosition(Ptr<Node> node, Vector position);
     /**
      * Get the position of a node.
-     * \param node The node.
-     * \return the position of the node.
+     * @param node The node.
+     * @return the position of the node.
      */
     Vector GetPosition(Ptr<Node> node);
     /**
      * Move a node by 1m on the x axis, stops at 210m.
-     * \param node The node.
+     * @param node The node.
      */
     void AdvancePosition(Ptr<Node> node);
     /**
      * Setup the receiving socket.
-     * \param node The receiving node.
-     * \return the socket.
+     * @param node The receiving node.
+     * @return the socket.
      */
     Ptr<Socket> SetupPacketReceive(Ptr<Node> node);
 
@@ -124,7 +124,7 @@
         return;
     }
     SetPosition(node, pos);
-    Simulator::Schedule(Seconds(1.0), &Experiment::AdvancePosition, this, node);
+    Simulator::Schedule(Seconds(1), &Experiment::AdvancePosition, this, node);
 }
 
 void
@@ -186,7 +186,7 @@
 
     ApplicationContainer apps = onoff.Install(c.Get(0));
     apps.Start(Seconds(0.5));
-    apps.Stop(Seconds(250.0));
+    apps.Stop(Seconds(250));
 
     Simulator::Schedule(Seconds(1.5), &Experiment::AdvancePosition, this, c.Get(1));
     Ptr<Socket> recvSink = SetupPacketReceive(c.Get(1));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/wireless/wifi-aggregation.cc ns-3.44/examples/wireless/wifi-aggregation.cc
--- ns-3.43/examples/wireless/wifi-aggregation.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/wireless/wifi-aggregation.cc	2025-03-09 16:55:49.335371000 -0700
@@ -270,8 +270,8 @@
     uint16_t port = 9;
     UdpServerHelper serverA(port);
     ApplicationContainer serverAppA = serverA.Install(wifiStaNodes.Get(0));
-    serverAppA.Start(Seconds(0.0));
-    serverAppA.Stop(simulationTime + Seconds(1.0));
+    serverAppA.Start(Seconds(0));
+    serverAppA.Stop(simulationTime + Seconds(1));
 
     UdpClientHelper clientA(StaInterfaceA.GetAddress(0), port);
     clientA.SetAttribute("MaxPackets", UintegerValue(4294967295U));
@@ -279,13 +279,13 @@
     clientA.SetAttribute("PacketSize", UintegerValue(payloadSize));
 
     ApplicationContainer clientAppA = clientA.Install(wifiApNodes.Get(0));
-    clientAppA.Start(Seconds(1.0));
-    clientAppA.Stop(simulationTime + Seconds(1.0));
+    clientAppA.Start(Seconds(1));
+    clientAppA.Stop(simulationTime + Seconds(1));
 
     UdpServerHelper serverB(port);
     ApplicationContainer serverAppB = serverB.Install(wifiStaNodes.Get(1));
-    serverAppB.Start(Seconds(0.0));
-    serverAppB.Stop(simulationTime + Seconds(1.0));
+    serverAppB.Start(Seconds(0));
+    serverAppB.Stop(simulationTime + Seconds(1));
 
     UdpClientHelper clientB(StaInterfaceB.GetAddress(0), port);
     clientB.SetAttribute("MaxPackets", UintegerValue(4294967295U));
@@ -293,13 +293,13 @@
     clientB.SetAttribute("PacketSize", UintegerValue(payloadSize));
 
     ApplicationContainer clientAppB = clientB.Install(wifiApNodes.Get(1));
-    clientAppB.Start(Seconds(1.0));
-    clientAppB.Stop(simulationTime + Seconds(1.0));
+    clientAppB.Start(Seconds(1));
+    clientAppB.Stop(simulationTime + Seconds(1));
 
     UdpServerHelper serverC(port);
     ApplicationContainer serverAppC = serverC.Install(wifiStaNodes.Get(2));
-    serverAppC.Start(Seconds(0.0));
-    serverAppC.Stop(simulationTime + Seconds(1.0));
+    serverAppC.Start(Seconds(0));
+    serverAppC.Stop(simulationTime + Seconds(1));
 
     UdpClientHelper clientC(StaInterfaceC.GetAddress(0), port);
     clientC.SetAttribute("MaxPackets", UintegerValue(4294967295U));
@@ -307,13 +307,13 @@
     clientC.SetAttribute("PacketSize", UintegerValue(payloadSize));
 
     ApplicationContainer clientAppC = clientC.Install(wifiApNodes.Get(2));
-    clientAppC.Start(Seconds(1.0));
-    clientAppC.Stop(simulationTime + Seconds(1.0));
+    clientAppC.Start(Seconds(1));
+    clientAppC.Stop(simulationTime + Seconds(1));
 
     UdpServerHelper serverD(port);
     ApplicationContainer serverAppD = serverD.Install(wifiStaNodes.Get(3));
-    serverAppD.Start(Seconds(0.0));
-    serverAppD.Stop(simulationTime + Seconds(1.0));
+    serverAppD.Start(Seconds(0));
+    serverAppD.Stop(simulationTime + Seconds(1));
 
     UdpClientHelper clientD(StaInterfaceD.GetAddress(0), port);
     clientD.SetAttribute("MaxPackets", UintegerValue(4294967295U));
@@ -321,8 +321,8 @@
     clientD.SetAttribute("PacketSize", UintegerValue(payloadSize));
 
     ApplicationContainer clientAppD = clientD.Install(wifiApNodes.Get(3));
-    clientAppD.Start(Seconds(1.0));
-    clientAppD.Stop(simulationTime + Seconds(1.0));
+    clientAppD.Start(Seconds(1));
+    clientAppD.Stop(simulationTime + Seconds(1));
 
     if (enablePcap)
     {
@@ -336,7 +336,7 @@
         phy.EnablePcap("STA_D", staDeviceD.Get(0));
     }
 
-    Simulator::Stop(simulationTime + Seconds(1.0));
+    Simulator::Stop(simulationTime + Seconds(1));
     Simulator::Run();
 
     // Show results
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/wireless/wifi-ap.cc ns-3.44/examples/wireless/wifi-ap.cc
--- ns-3.43/examples/wireless/wifi-ap.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/wireless/wifi-ap.cc	2025-03-09 16:55:49.339371000 -0700
@@ -28,8 +28,8 @@
 /**
  * MAC-level TX trace.
  *
- * \param context The context.
- * \param p The packet.
+ * @param context The context.
+ * @param p The packet.
  */
 void
 DevTxTrace(std::string context, Ptr<const Packet> p)
@@ -43,8 +43,8 @@
 /**
  * MAC-level RX trace.
  *
- * \param context The context.
- * \param p The packet.
+ * @param context The context.
+ * @param p The packet.
  */
 void
 DevRxTrace(std::string context, Ptr<const Packet> p)
@@ -58,11 +58,11 @@
 /**
  * PHY-level RX OK trace
  *
- * \param context The context.
- * \param packet The packet.
- * \param snr The SNR.
- * \param mode The wifi mode.
- * \param preamble The preamble.
+ * @param context The context.
+ * @param packet The packet.
+ * @param snr The SNR.
+ * @param mode The wifi mode.
+ * @param preamble The preamble.
  */
 void
 PhyRxOkTrace(std::string context,
@@ -80,9 +80,9 @@
 /**
  * PHY-level RX error trace
  *
- * \param context The context.
- * \param packet The packet.
- * \param snr The SNR.
+ * @param context The context.
+ * @param packet The packet.
+ * @param snr The SNR.
  */
 void
 PhyRxErrorTrace(std::string context, Ptr<const Packet> packet, double snr)
@@ -96,11 +96,11 @@
 /**
  * PHY-level TX trace.
  *
- * \param context The context.
- * \param packet The packet.
- * \param mode The wifi mode.
- * \param preamble The preamble.
- * \param txPower The TX power.
+ * @param context The context.
+ * @param packet The packet.
+ * @param mode The wifi mode.
+ * @param preamble The preamble.
+ * @param txPower The TX power.
  */
 void
 PhyTxTrace(std::string context,
@@ -118,10 +118,10 @@
 /**
  * PHY state trace.
  *
- * \param context The context.
- * \param start Start time of the state.
- * \param duration Duration of the state.
- * \param state The state.
+ * @param context The context.
+ * @param start Start time of the state.
+ * @param duration Duration of the state.
+ * @param state The state.
  */
 void
 PhyStateTrace(std::string context, Time start, Time duration, WifiPhyState state)
@@ -136,7 +136,7 @@
 /**
  * Move a node position by 5m on the x axis every second, up to 210m.
  *
- * \param node The node.
+ * @param node The node.
  */
 static void
 AdvancePosition(Ptr<Node> node)
@@ -150,7 +150,7 @@
     }
     mobility->SetPosition(pos);
 
-    Simulator::Schedule(Seconds(1.0), &AdvancePosition, node);
+    Simulator::Schedule(Seconds(1), &AdvancePosition, node);
 }
 
 int
@@ -196,7 +196,7 @@
     mobility.Install(stas);
     mobility.Install(ap);
 
-    Simulator::Schedule(Seconds(1.0), &AdvancePosition, ap.Get(0));
+    Simulator::Schedule(Seconds(1), &AdvancePosition, ap.Get(0));
 
     PacketSocketAddress socket;
     socket.SetSingleDevice(staDevs.Get(0)->GetIfIndex());
@@ -208,9 +208,9 @@
 
     ApplicationContainer apps = onoff.Install(stas.Get(0));
     apps.Start(Seconds(0.5));
-    apps.Stop(Seconds(43.0));
+    apps.Stop(Seconds(43));
 
-    Simulator::Stop(Seconds(44.0));
+    Simulator::Stop(Seconds(44));
 
     Config::Connect("/NodeList/*/DeviceList/*/Mac/MacTx", MakeCallback(&DevTxTrace));
     Config::Connect("/NodeList/*/DeviceList/*/Mac/MacRx", MakeCallback(&DevRxTrace));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/wireless/wifi-ap.py ns-3.44/examples/wireless/wifi-ap.py
--- ns-3.43/examples/wireless/wifi-ap.py	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/wireless/wifi-ap.py	2025-03-09 16:55:49.339371000 -0700
@@ -76,7 +76,7 @@
         if (pos.x >= 210.0)
             return;
         mob->SetPosition(pos);
-        Simulator::Schedule(Seconds(1.0), AdvancePosition, node);
+        Simulator::Schedule(Seconds(1), AdvancePosition, node);
     }"""
 )
 
@@ -124,7 +124,7 @@
     mobility.Install(stas)
     mobility.Install(ap)
 
-    ns.Simulator.Schedule(ns.Seconds(1.0), ns.cppyy.gbl.AdvancePosition, ap.Get(0))
+    ns.Simulator.Schedule(ns.Seconds(1), ns.cppyy.gbl.AdvancePosition, ap.Get(0))
 
     socket = ns.PacketSocketAddress()
     socket.SetSingleDevice(staDevs.Get(0).GetIfIndex())
@@ -136,9 +136,9 @@
 
     apps = onoff.Install(ns.NodeContainer(stas.Get(0)))
     apps.Start(ns.Seconds(0.5))
-    apps.Stop(ns.Seconds(43.0))
+    apps.Stop(ns.Seconds(43))
 
-    ns.Simulator.Stop(ns.Seconds(44.0))
+    ns.Simulator.Stop(ns.Seconds(44))
 
     #   Config::Connect("/NodeList/*/DeviceList/*/Tx", MakeCallback(&DevTxTrace));
     #   Config::Connect("/NodeList/*/DeviceList/*/Rx", MakeCallback(&DevRxTrace));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/wireless/wifi-backward-compatibility.cc ns-3.44/examples/wireless/wifi-backward-compatibility.cc
--- ns-3.43/examples/wireless/wifi-backward-compatibility.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/wireless/wifi-backward-compatibility.cc	2025-03-09 16:55:49.339371000 -0700
@@ -44,8 +44,8 @@
 /**
  * Convert a string (e.g., "80211a") to a pair {WifiStandard, WifiPhyBand}
  *
- * \param version The WiFi standard version.
- * \return a pair of WifiStandard, WifiPhyBand
+ * @param version The WiFi standard version.
+ * @return a pair of WifiStandard, WifiPhyBand
  */
 std::pair<WifiStandard, WifiPhyBand>
 ConvertStringToStandardAndBand(std::string version)
@@ -196,13 +196,13 @@
 
     UdpServerHelper apServer(9);
     ApplicationContainer apServerApp = apServer.Install(wifiApNode.Get(0));
-    apServerApp.Start(Seconds(0.0));
-    apServerApp.Stop(simulationTime + Seconds(1.0));
+    apServerApp.Start(Seconds(0));
+    apServerApp.Stop(simulationTime + Seconds(1));
 
     UdpServerHelper staServer(5001);
     ApplicationContainer staServerApp = staServer.Install(wifiStaNode.Get(0));
-    staServerApp.Start(Seconds(0.0));
-    staServerApp.Stop(simulationTime + Seconds(1.0));
+    staServerApp.Start(Seconds(0));
+    staServerApp.Stop(simulationTime + Seconds(1));
 
     if (apHasTraffic)
     {
@@ -211,8 +211,8 @@
         apClient.SetAttribute("Interval", TimeValue(Time("0.00001")));   // packets/s
         apClient.SetAttribute("PacketSize", UintegerValue(payloadSize)); // bytes
         ApplicationContainer apClientApp = apClient.Install(wifiApNode.Get(0));
-        apClientApp.Start(Seconds(1.0));
-        apClientApp.Stop(simulationTime + Seconds(1.0));
+        apClientApp.Start(Seconds(1));
+        apClientApp.Stop(simulationTime + Seconds(1));
     }
 
     if (staHasTraffic)
@@ -222,13 +222,13 @@
         staClient.SetAttribute("Interval", TimeValue(Time("0.00001")));   // packets/s
         staClient.SetAttribute("PacketSize", UintegerValue(payloadSize)); // bytes
         ApplicationContainer staClientApp = staClient.Install(wifiStaNode.Get(0));
-        staClientApp.Start(Seconds(1.0));
-        staClientApp.Stop(simulationTime + Seconds(1.0));
+        staClientApp.Start(Seconds(1));
+        staClientApp.Stop(simulationTime + Seconds(1));
     }
 
     Ipv4GlobalRoutingHelper::PopulateRoutingTables();
 
-    Simulator::Stop(simulationTime + Seconds(1.0));
+    Simulator::Stop(simulationTime + Seconds(1));
     Simulator::Run();
 
     double rxBytes;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/wireless/wifi-blockack.cc ns-3.44/examples/wireless/wifi-blockack.cc
--- ns-3.43/examples/wireless/wifi-blockack.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/wireless/wifi-blockack.cc	2025-03-09 16:55:49.339371000 -0700
@@ -150,12 +150,12 @@
 
     ApplicationContainer staApps = onOff.Install(sta);
 
-    staApps.Start(Seconds(1.0));
-    staApps.Stop(Seconds(10.0));
+    staApps.Start(Seconds(1));
+    staApps.Stop(Seconds(10));
 
     Ipv4GlobalRoutingHelper::PopulateRoutingTables();
 
-    Simulator::Stop(Seconds(10.0));
+    Simulator::Stop(Seconds(10));
 
     phy.EnablePcap("test-blockack", ap->GetId(), 0);
     Simulator::Run();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/wireless/wifi-clear-channel-cmu.cc ns-3.44/examples/wireless/wifi-clear-channel-cmu.cc
--- ns-3.43/examples/wireless/wifi-clear-channel-cmu.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/wireless/wifi-clear-channel-cmu.cc	2025-03-09 16:55:49.339371000 -0700
@@ -34,16 +34,16 @@
     Experiment();
     /**
      * Constructor.
-     * \param name The name of the experiment.
+     * @param name The name of the experiment.
      */
     Experiment(std::string name);
     /**
      * Run an experiment.
-     * \param wifi      //!< The WifiHelper class.
-     * \param wifiPhy   //!< The YansWifiPhyHelper class.
-     * \param wifiMac   //!< The WifiMacHelper class.
-     * \param wifiChannel //!< The YansWifiChannelHelper class.
-     * \return the number of received packets.
+     * @param wifi      //!< The WifiHelper class.
+     * @param wifiPhy   //!< The YansWifiPhyHelper class.
+     * @param wifiMac   //!< The WifiMacHelper class.
+     * @param wifiChannel //!< The YansWifiChannelHelper class.
+     * @return the number of received packets.
      */
     uint32_t Run(const WifiHelper& wifi,
                  const YansWifiPhyHelper& wifiPhy,
@@ -53,33 +53,33 @@
   private:
     /**
      * Receive a packet.
-     * \param socket The receiving socket.
+     * @param socket The receiving socket.
      */
     void ReceivePacket(Ptr<Socket> socket);
     /**
      * Set the position of a node.
-     * \param node The node.
-     * \param position The position of the node.
+     * @param node The node.
+     * @param position The position of the node.
      */
     void SetPosition(Ptr<Node> node, Vector position);
     /**
      * Get the position of a node.
-     * \param node The node.
-     * \return the position of the node.
+     * @param node The node.
+     * @return the position of the node.
      */
     Vector GetPosition(Ptr<Node> node);
     /**
      * Setup the receiving socket.
-     * \param node The receiving node.
-     * \return the socket.
+     * @param node The receiving node.
+     * @return the socket.
      */
     Ptr<Socket> SetupPacketReceive(Ptr<Node> node);
     /**
      * Generate the traffic.
-     * \param socket The sending socket.
-     * \param pktSize The packet size.
-     * \param pktCount The number of packets to send.
-     * \param pktInterval The time between packets.
+     * @param socket The sending socket.
+     * @param pktSize The packet size.
+     * @param pktCount The number of packets to send.
+     * @param pktInterval The time between packets.
      */
     void GenerateTraffic(Ptr<Socket> socket, uint32_t pktSize, uint32_t pktCount, Time pktInterval);
 
@@ -197,7 +197,7 @@
     uint32_t packetSize = 1014;
     uint32_t maxPacketCount = 200;
     Time interPacketInterval = Seconds(1.);
-    Simulator::Schedule(Seconds(1.0),
+    Simulator::Schedule(Seconds(1),
                         &Experiment::GenerateTraffic,
                         this,
                         source,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/wireless/wifi-eht-network.cc ns-3.44/examples/wireless/wifi-eht-network.cc
--- ns-3.43/examples/wireless/wifi-eht-network.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/wireless/wifi-eht-network.cc	2025-03-09 16:55:49.339371000 -0700
@@ -6,6 +6,7 @@
  * Author: Sebastien Deronne <sebastien.deronne@gmail.com>
  */
 
+#include "ns3/attribute-container.h"
 #include "ns3/boolean.h"
 #include "ns3/command-line.h"
 #include "ns3/config.h"
@@ -30,6 +31,7 @@
 #include "ns3/yans-wifi-channel.h"
 #include "ns3/yans-wifi-helper.h"
 
+#include <algorithm>
 #include <array>
 #include <functional>
 #include <numeric>
@@ -57,10 +59,10 @@
 NS_LOG_COMPONENT_DEFINE("eht-wifi-network");
 
 /**
- * \param udp true if UDP is used, false if TCP is used
- * \param serverApp a container of server applications
- * \param payloadSize the size in bytes of the packets
- * \return the bytes received by each server application
+ * @param udp true if UDP is used, false if TCP is used
+ * @param serverApp a container of server applications
+ * @param payloadSize the size in bytes of the packets
+ * @return the bytes received by each server application
  */
 std::vector<uint64_t>
 GetRxBytes(bool udp, const ApplicationContainer& serverApp, uint32_t payloadSize)
@@ -85,12 +87,12 @@
 
 /**
  * Print average throughput over an intermediate time interval.
- * \param rxBytes a vector of the amount of bytes received by each server application
- * \param udp true if UDP is used, false if TCP is used
- * \param serverApp a container of server applications
- * \param payloadSize the size in bytes of the packets
- * \param tputInterval the duration of an intermediate time interval
- * \param simulationTime the simulation time in seconds
+ * @param rxBytes a vector of the amount of bytes received by each server application
+ * @param udp true if UDP is used, false if TCP is used
+ * @param serverApp a container of server applications
+ * @param payloadSize the size in bytes of the packets
+ * @param tputInterval the duration of an intermediate time interval
+ * @param simulationTime the simulation time in seconds
  */
 void
 PrintIntermediateTput(std::vector<uint64_t>& rxBytes,
@@ -136,10 +138,11 @@
     bool useRts{false};
     bool use80Plus80{false};
     uint16_t mpduBufferSize{512};
+    std::string emlsrMgrTypeId{"ns3::DefaultEmlsrManager"};
     std::string emlsrLinks;
     uint16_t paddingDelayUsec{32};
     uint16_t transitionDelayUsec{128};
-    uint16_t channelSwitchDelayUsec{100};
+    Time channelSwitchDelay{"100us"};
     bool switchAuxPhy{true};
     uint16_t auxPhyChWidth{20};
     bool auxPhyTxCapable{true};
@@ -154,12 +157,15 @@
     std::string dlAckSeqType{"NO-OFDMA"};
     bool enableUlOfdma{false};
     bool enableBsrp{false};
-    int mcs{-1}; // -1 indicates an unset value
+    std::string mcsStr;
+    std::vector<uint64_t> mcsValues;
+    int channelWidth{-1};  // in MHz, -1 indicates an unset value
+    int guardInterval{-1}; // in nanoseconds, -1 indicates an unset value
     uint32_t payloadSize =
         700; // must fit in the max TX duration when transmitting at MCS 0 over an RU of 26 tones
     Time tputInterval{0}; // interval for detailed throughput measurement
-    double minExpectedThroughput{0};
-    double maxExpectedThroughput{0};
+    double minExpectedThroughput{0.0};
+    double maxExpectedThroughput{0.0};
     Time accessReqInterval{0};
 
     CommandLine cmd(__FILE__);
@@ -177,6 +183,7 @@
         "Whether the third link operates in the 2.4, 5 or 6 GHz band (0 means the device has up to "
         "two links, otherwise the band must be different than first link and second link)",
         frequency3);
+    cmd.AddValue("emlsrMgrTypeId", "The ns-3 TypeId of the EMLSR manager to use", emlsrMgrTypeId);
     cmd.AddValue("emlsrLinks",
                  "The comma separated list of IDs of EMLSR links (for MLDs only)",
                  emlsrLinks);
@@ -196,9 +203,7 @@
     cmd.AddValue("emlsrAuxTxCapable",
                  "Whether Aux PHYs are capable of transmitting.",
                  auxPhyTxCapable);
-    cmd.AddValue("channelSwitchDelay",
-                 "The PHY channel switch delay in microseconds",
-                 channelSwitchDelayUsec);
+    cmd.AddValue("channelSwitchDelay", "The PHY channel switch delay", channelSwitchDelay);
     cmd.AddValue("distance",
                  "Distance in meters between the station and the access point",
                  distance);
@@ -226,7 +231,18 @@
         "muSchedAccessReqInterval",
         "Duration of the interval between two requests for channel access made by the MU scheduler",
         accessReqInterval);
-    cmd.AddValue("mcs", "if set, limit testing to a specific MCS (0-11)", mcs);
+    cmd.AddValue(
+        "mcs",
+        "list of comma separated MCS values to test; if unset, all MCS values (0-13) are tested",
+        mcsStr);
+    cmd.AddValue("channelWidth",
+                 "if set, limit testing to a specific channel width expressed in MHz (20, 40, 80 "
+                 "or 160 MHz)",
+                 channelWidth);
+    cmd.AddValue("guardInterval",
+                 "if set, limit testing to a specific guard interval duration expressed in "
+                 "nanoseconds (800, 1600 or 3200 ns)",
+                 guardInterval);
     cmd.AddValue("payloadSize", "The application payload size in bytes", payloadSize);
     cmd.AddValue("tputInterval", "duration of intervals for throughput measurement", tputInterval);
     cmd.AddValue("minExpectedThroughput",
@@ -273,26 +289,51 @@
               << "GI"
               << "\t\t\t"
               << "Throughput" << '\n';
-    int minMcs = 0;
-    int maxMcs = 13;
-    if (mcs >= 0 && mcs <= 13)
+    uint8_t minMcs = 0;
+    uint8_t maxMcs = 13;
+
+    if (mcsStr.empty())
+    {
+        for (uint8_t mcs = minMcs; mcs <= maxMcs; ++mcs)
+        {
+            mcsValues.push_back(mcs);
+        }
+    }
+    else
     {
-        minMcs = mcs;
-        maxMcs = mcs;
+        AttributeContainerValue<UintegerValue, ',', std::vector> attr;
+        auto checker = DynamicCast<AttributeContainerChecker>(MakeAttributeContainerChecker(attr));
+        checker->SetItemChecker(MakeUintegerChecker<uint8_t>());
+        attr.DeserializeFromString(mcsStr, checker);
+        mcsValues = attr.Get();
+        std::sort(mcsValues.begin(), mcsValues.end());
     }
-    for (int mcs = minMcs; mcs <= maxMcs; mcs++)
+
+    int minChannelWidth = 20;
+    int maxChannelWidth = (frequency != 2.4 && frequency2 != 2.4 && frequency3 != 2.4) ? 160 : 40;
+    if (channelWidth >= minChannelWidth && channelWidth <= maxChannelWidth)
+    {
+        minChannelWidth = channelWidth;
+        maxChannelWidth = channelWidth;
+    }
+    int minGi = enableUlOfdma ? 1600 : 800;
+    int maxGi = 3200;
+    if (guardInterval >= minGi && guardInterval <= maxGi)
+    {
+        minGi = guardInterval;
+        maxGi = guardInterval;
+    }
+
+    for (const auto mcs : mcsValues)
     {
         uint8_t index = 0;
         double previous = 0;
-        uint16_t maxChannelWidth =
-            (frequency != 2.4 && frequency2 != 2.4 && frequency3 != 2.4) ? 160 : 40;
-        int minGi = enableUlOfdma ? 1600 : 800;
-        for (int channelWidth = 20; channelWidth <= maxChannelWidth;) // MHz
+        for (int width = minChannelWidth; width <= maxChannelWidth; width *= 2) // MHz
         {
-            const auto is80Plus80 = (use80Plus80 && (channelWidth == 160));
-            const std::string widthStr = is80Plus80 ? "80+80" : std::to_string(channelWidth);
+            const auto is80Plus80 = (use80Plus80 && (width == 160));
+            const std::string widthStr = is80Plus80 ? "80+80" : std::to_string(width);
             const auto segmentWidthStr = is80Plus80 ? "80" : widthStr;
-            for (int gi = 3200; gi >= minGi;) // Nanoseconds
+            for (int gi = maxGi; gi >= minGi; gi /= 2) // Nanoseconds
             {
                 if (!udp)
                 {
@@ -391,10 +432,10 @@
 
                 SpectrumWifiPhyHelper phy(nLinks);
                 phy.SetPcapDataLinkType(WifiPhyHelper::DLT_IEEE802_11_RADIO);
-                phy.Set("ChannelSwitchDelay", TimeValue(MicroSeconds(channelSwitchDelayUsec)));
+                phy.Set("ChannelSwitchDelay", TimeValue(channelSwitchDelay));
 
                 mac.SetType("ns3::StaWifiMac", "Ssid", SsidValue(ssid));
-                mac.SetEmlsrManager("ns3::DefaultEmlsrManager",
+                mac.SetEmlsrManager(emlsrMgrTypeId,
                                     "EmlsrLinkSet",
                                     StringValue(emlsrLinks),
                                     "EmlsrPaddingDelay",
@@ -486,8 +527,12 @@
                     clientNodes.Add(downlink ? wifiApNode.Get(0) : wifiStaNodes.Get(i));
                 }
 
-                const auto maxLoad =
-                    nLinks * EhtPhy::GetDataRate(mcs, channelWidth, NanoSeconds(gi), 1) / nStations;
+                const auto maxLoad = nLinks *
+                                     EhtPhy::GetDataRate(mcs,
+                                                         MHz_u{static_cast<double>(width)},
+                                                         NanoSeconds(gi),
+                                                         1) /
+                                     nStations;
                 if (udp)
                 {
                     // UDP flow
@@ -496,8 +541,8 @@
                     serverApp = server.Install(serverNodes.get());
                     streamNumber += server.AssignStreams(serverNodes.get(), streamNumber);
 
-                    serverApp.Start(Seconds(0.0));
-                    serverApp.Stop(simulationTime + Seconds(1.0));
+                    serverApp.Start(Seconds(0));
+                    serverApp.Stop(simulationTime + Seconds(1));
                     const auto packetInterval = payloadSize * 8.0 / maxLoad;
 
                     for (std::size_t i = 0; i < nStations; i++)
@@ -509,8 +554,8 @@
                         ApplicationContainer clientApp = client.Install(clientNodes.Get(i));
                         streamNumber += client.AssignStreams(clientNodes.Get(i), streamNumber);
 
-                        clientApp.Start(Seconds(1.0));
-                        clientApp.Stop(simulationTime + Seconds(1.0));
+                        clientApp.Start(Seconds(1));
+                        clientApp.Stop(simulationTime + Seconds(1));
                     }
                 }
                 else
@@ -522,8 +567,8 @@
                     serverApp = packetSinkHelper.Install(serverNodes.get());
                     streamNumber += packetSinkHelper.AssignStreams(serverNodes.get(), streamNumber);
 
-                    serverApp.Start(Seconds(0.0));
-                    serverApp.Stop(simulationTime + Seconds(1.0));
+                    serverApp.Start(Seconds(0));
+                    serverApp.Stop(simulationTime + Seconds(1));
 
                     for (std::size_t i = 0; i < nStations; i++)
                     {
@@ -540,8 +585,8 @@
                         ApplicationContainer clientApp = onoff.Install(clientNodes.Get(i));
                         streamNumber += onoff.AssignStreams(clientNodes.Get(i), streamNumber);
 
-                        clientApp.Start(Seconds(1.0));
-                        clientApp.Stop(simulationTime + Seconds(1.0));
+                        clientApp.Start(Seconds(1));
+                        clientApp.Stop(simulationTime + Seconds(1));
                     }
                 }
 
@@ -557,10 +602,10 @@
                                         serverApp,
                                         payloadSize,
                                         tputInterval,
-                                        simulationTime + Seconds(1.0));
+                                        simulationTime + Seconds(1));
                 }
 
-                Simulator::Stop(simulationTime + Seconds(1.0));
+                Simulator::Stop(simulationTime + Seconds(1));
                 Simulator::Run();
 
                 // When multiple stations are used, there are chances that association requests
@@ -579,7 +624,7 @@
                           << " Mbit/s" << std::endl;
 
                 // test first element
-                if (mcs == minMcs && channelWidth == 20 && gi == 3200)
+                if (mcs == minMcs && width == 20 && gi == 3200)
                 {
                     if (throughput * (1 + tolerance) < minExpectedThroughput)
                     {
@@ -588,7 +633,7 @@
                     }
                 }
                 // test last element
-                if (mcs == maxMcs && channelWidth == maxChannelWidth && gi == 800)
+                if (mcs == maxMcs && width == maxChannelWidth && gi == 800)
                 {
                     if (maxExpectedThroughput > 0 &&
                         throughput > maxExpectedThroughput * (1 + tolerance))
@@ -618,9 +663,7 @@
                     exit(1);
                 }
                 index++;
-                gi /= 2;
             }
-            channelWidth *= 2;
         }
     }
     return 0;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/wireless/wifi-he-network.cc ns-3.44/examples/wireless/wifi-he-network.cc
--- ns-3.43/examples/wireless/wifi-he-network.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/wireless/wifi-he-network.cc	2025-03-09 16:55:49.339371000 -0700
@@ -6,6 +6,7 @@
  * Author: Sebastien Deronne <sebastien.deronne@gmail.com>
  */
 
+#include "ns3/attribute-container.h"
 #include "ns3/boolean.h"
 #include "ns3/command-line.h"
 #include "ns3/config.h"
@@ -31,6 +32,7 @@
 #include "ns3/yans-wifi-channel.h"
 #include "ns3/yans-wifi-helper.h"
 
+#include <algorithm>
 #include <functional>
 
 // This is a simple example in order to show how to configure an IEEE 802.11ax Wi-Fi network.
@@ -70,12 +72,15 @@
     std::string dlAckSeqType{"NO-OFDMA"};
     bool enableUlOfdma{false};
     bool enableBsrp{false};
-    int mcs{-1}; // -1 indicates an unset value
+    std::string mcsStr;
+    std::vector<uint64_t> mcsValues;
+    int channelWidth{-1};  // in MHz, -1 indicates an unset value
+    int guardInterval{-1}; // in nanoseconds, -1 indicates an unset value
     uint32_t payloadSize =
         700; // must fit in the max TX duration when transmitting at MCS 0 over an RU of 26 tones
     std::string phyModel{"Yans"};
-    double minExpectedThroughput{0};
-    double maxExpectedThroughput{0};
+    double minExpectedThroughput{0.0};
+    double maxExpectedThroughput{0.0};
     Time accessReqInterval{0};
 
     CommandLine cmd(__FILE__);
@@ -107,7 +112,18 @@
         "muSchedAccessReqInterval",
         "Duration of the interval between two requests for channel access made by the MU scheduler",
         accessReqInterval);
-    cmd.AddValue("mcs", "if set, limit testing to a specific MCS (0-11)", mcs);
+    cmd.AddValue(
+        "mcs",
+        "list of comma separated MCS values to test; if unset, all MCS values (0-11) are tested",
+        mcsStr);
+    cmd.AddValue("channelWidth",
+                 "if set, limit testing to a specific channel width expressed in MHz (20, 40, 80 "
+                 "or 160 MHz)",
+                 channelWidth);
+    cmd.AddValue("guardInterval",
+                 "if set, limit testing to a specific guard interval duration expressed in "
+                 "nanoseconds (800, 1600 or 3200 ns)",
+                 guardInterval);
     cmd.AddValue("payloadSize", "The application payload size in bytes", payloadSize);
     cmd.AddValue("phyModel",
                  "PHY model to use when OFDMA is disabled (Yans or Spectrum). If 80+80 MHz or "
@@ -168,25 +184,51 @@
               << "GI"
               << "\t\t\t"
               << "Throughput" << '\n';
-    int minMcs = 0;
-    int maxMcs = 11;
-    if (mcs >= 0 && mcs <= 11)
+    uint8_t minMcs = 0;
+    uint8_t maxMcs = 11;
+
+    if (mcsStr.empty())
+    {
+        for (uint8_t mcs = minMcs; mcs <= maxMcs; ++mcs)
+        {
+            mcsValues.push_back(mcs);
+        }
+    }
+    else
     {
-        minMcs = mcs;
-        maxMcs = mcs;
+        AttributeContainerValue<UintegerValue, ',', std::vector> attr;
+        auto checker = DynamicCast<AttributeContainerChecker>(MakeAttributeContainerChecker(attr));
+        checker->SetItemChecker(MakeUintegerChecker<uint8_t>());
+        attr.DeserializeFromString(mcsStr, checker);
+        mcsValues = attr.Get();
+        std::sort(mcsValues.begin(), mcsValues.end());
     }
-    for (int mcs = minMcs; mcs <= maxMcs; mcs++)
+
+    int minChannelWidth = 20;
+    int maxChannelWidth = frequency == 2.4 ? 40 : 160;
+    if (channelWidth >= minChannelWidth && channelWidth <= maxChannelWidth)
+    {
+        minChannelWidth = channelWidth;
+        maxChannelWidth = channelWidth;
+    }
+    int minGi = enableUlOfdma ? 1600 : 800;
+    int maxGi = 3200;
+    if (guardInterval >= minGi && guardInterval <= maxGi)
+    {
+        minGi = guardInterval;
+        maxGi = guardInterval;
+    }
+
+    for (const auto mcs : mcsValues)
     {
         uint8_t index = 0;
         double previous = 0;
-        uint8_t maxChannelWidth = frequency == 2.4 ? 40 : 160;
-        int minGi = enableUlOfdma ? 1600 : 800;
-        for (int channelWidth = 20; channelWidth <= maxChannelWidth;) // MHz
+        for (int width = minChannelWidth; width <= maxChannelWidth; width *= 2) // MHz
         {
-            const auto is80Plus80 = (use80Plus80 && (channelWidth == 160));
-            const std::string widthStr = is80Plus80 ? "80+80" : std::to_string(channelWidth);
+            const auto is80Plus80 = (use80Plus80 && (width == 160));
+            const std::string widthStr = is80Plus80 ? "80+80" : std::to_string(width);
             const auto segmentWidthStr = is80Plus80 ? "80" : widthStr;
-            for (int gi = 3200; gi >= minGi;) // Nanoseconds
+            for (int gi = maxGi; gi >= minGi; gi /= 2) // Nanoseconds
             {
                 if (!udp)
                 {
@@ -357,7 +399,8 @@
                 }
 
                 const auto maxLoad =
-                    HePhy::GetDataRate(mcs, channelWidth, NanoSeconds(gi), 1) / nStations;
+                    HePhy::GetDataRate(mcs, MHz_u{static_cast<double>(width)}, NanoSeconds(gi), 1) /
+                    nStations;
                 if (udp)
                 {
                     // UDP flow
@@ -366,8 +409,8 @@
                     serverApp = server.Install(serverNodes.get());
                     streamNumber += server.AssignStreams(serverNodes.get(), streamNumber);
 
-                    serverApp.Start(Seconds(0.0));
-                    serverApp.Stop(simulationTime + Seconds(1.0));
+                    serverApp.Start(Seconds(0));
+                    serverApp.Stop(simulationTime + Seconds(1));
                     const auto packetInterval = payloadSize * 8.0 / maxLoad;
 
                     for (std::size_t i = 0; i < nStations; i++)
@@ -379,8 +422,8 @@
                         ApplicationContainer clientApp = client.Install(clientNodes.Get(i));
                         streamNumber += client.AssignStreams(clientNodes.Get(i), streamNumber);
 
-                        clientApp.Start(Seconds(1.0));
-                        clientApp.Stop(simulationTime + Seconds(1.0));
+                        clientApp.Start(Seconds(1));
+                        clientApp.Stop(simulationTime + Seconds(1));
                     }
                 }
                 else
@@ -392,8 +435,8 @@
                     serverApp = packetSinkHelper.Install(serverNodes.get());
                     streamNumber += packetSinkHelper.AssignStreams(serverNodes.get(), streamNumber);
 
-                    serverApp.Start(Seconds(0.0));
-                    serverApp.Stop(simulationTime + Seconds(1.0));
+                    serverApp.Start(Seconds(0));
+                    serverApp.Stop(simulationTime + Seconds(1));
 
                     for (std::size_t i = 0; i < nStations; i++)
                     {
@@ -410,14 +453,14 @@
                         ApplicationContainer clientApp = onoff.Install(clientNodes.Get(i));
                         streamNumber += onoff.AssignStreams(clientNodes.Get(i), streamNumber);
 
-                        clientApp.Start(Seconds(1.0));
-                        clientApp.Stop(simulationTime + Seconds(1.0));
+                        clientApp.Start(Seconds(1));
+                        clientApp.Stop(simulationTime + Seconds(1));
                     }
                 }
 
                 Simulator::Schedule(Seconds(0), &Ipv4GlobalRoutingHelper::PopulateRoutingTables);
 
-                Simulator::Stop(simulationTime + Seconds(1.0));
+                Simulator::Stop(simulationTime + Seconds(1));
                 Simulator::Run();
 
                 // When multiple stations are used, there are chances that association requests
@@ -450,7 +493,7 @@
                           << " Mbit/s" << std::endl;
 
                 // test first element
-                if (mcs == minMcs && channelWidth == 20 && gi == 3200)
+                if (mcs == minMcs && width == 20 && gi == 3200)
                 {
                     if (throughput * (1 + tolerance) < minExpectedThroughput)
                     {
@@ -459,7 +502,7 @@
                     }
                 }
                 // test last element
-                if (mcs == maxMcs && channelWidth == maxChannelWidth && gi == 800)
+                if (mcs == maxMcs && width == maxChannelWidth && gi == 800)
                 {
                     if (maxExpectedThroughput > 0 &&
                         throughput > maxExpectedThroughput * (1 + tolerance))
@@ -495,9 +538,7 @@
                     }
                 }
                 index++;
-                gi /= 2;
             }
-            channelWidth *= 2;
         }
     }
     return 0;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/wireless/wifi-hidden-terminal.cc ns-3.44/examples/wireless/wifi-hidden-terminal.cc
--- ns-3.43/examples/wireless/wifi-hidden-terminal.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/wireless/wifi-hidden-terminal.cc	2025-03-09 16:55:49.339371000 -0700
@@ -38,8 +38,8 @@
 /**
  * Run single 10 seconds experiment
  *
- * \param enableCtsRts if true, enable RTS/CTS for packets larger than 100 bytes.
- * \param wifiManager WiFi manager to use.
+ * @param enableCtsRts if true, enable RTS/CTS for packets larger than 100 bytes.
+ * @param wifiManager WiFi manager to use.
  */
 void
 experiment(bool enableCtsRts, std::string wifiManager)
@@ -115,7 +115,7 @@
 
     // flow 2:  node 2 -> node 1
     /**
-     * \internal
+     * @internal
      * The slightly different start times and data rates are a workaround
      * for \bugid{388} and \bugid{912}
      */
@@ -124,13 +124,13 @@
     cbrApps.Add(onOffHelper.Install(nodes.Get(2)));
 
     /**
-     * \internal
+     * @internal
      * We also use separate UDP applications that will send a single
      * packet before the CBR flows start.
      * This is a workaround for the lack of perfect ARP, see \bugid{187}
      */
     uint16_t echoPort = 9;
-    UdpEchoClientHelper echoClientHelper(Ipv4Address("10.0.0.2"), echoPort);
+    UdpEchoClientHelper echoClientHelper(InetSocketAddress(Ipv4Address("10.0.0.2"), echoPort));
     echoClientHelper.SetAttribute("MaxPackets", UintegerValue(1));
     echoClientHelper.SetAttribute("Interval", TimeValue(Seconds(0.1)));
     echoClientHelper.SetAttribute("PacketSize", UintegerValue(10));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/wireless/wifi-ht-network.cc ns-3.44/examples/wireless/wifi-ht-network.cc
--- ns-3.43/examples/wireless/wifi-ht-network.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/wireless/wifi-ht-network.cc	2025-03-09 16:55:49.339371000 -0700
@@ -31,6 +31,9 @@
 #include "ns3/yans-wifi-channel.h"
 #include "ns3/yans-wifi-helper.h"
 
+#include <algorithm>
+#include <vector>
+
 // This is a simple example in order to show how to configure an IEEE 802.11n Wi-Fi network.
 //
 // It outputs the UDP or TCP goodput for every HT MCS value, which depends on the MCS value (0 to
@@ -59,7 +62,10 @@
     Time simulationTime{"10s"};
     meter_u distance{1.0};
     double frequency{5}; // whether 2.4 or 5 GHz
-    int mcs{-1};         // -1 indicates an unset value
+    std::string mcsStr;
+    std::vector<uint64_t> mcsValues;
+    int channelWidth{-1};  // in MHz, -1 indicates an unset value
+    int guardInterval{-1}; // in nanoseconds, -1 indicates an unset value
     double minExpectedThroughput{0.0};
     double maxExpectedThroughput{0.0};
 
@@ -73,7 +79,18 @@
     cmd.AddValue("simulationTime", "Simulation time", simulationTime);
     cmd.AddValue("udp", "UDP if set to 1, TCP otherwise", udp);
     cmd.AddValue("useRts", "Enable/disable RTS/CTS", useRts);
-    cmd.AddValue("mcs", "if set, limit testing to a specific MCS (0-7)", mcs);
+    cmd.AddValue(
+        "mcs",
+        "list of comma separated MCS values to test; if unset, all MCS values (0-7) are tested",
+        mcsStr);
+    cmd.AddValue(
+        "channelWidth",
+        "if set, limit testing to a specific channel width expressed in MHz (20 or 40 MHz)",
+        channelWidth);
+    cmd.AddValue("guardInterval",
+                 "if set, limit testing to a specific guard interval duration expressed in "
+                 "nanoseconds (800 or 400 ns)",
+                 guardInterval);
     cmd.AddValue("minExpectedThroughput",
                  "if set, simulation fails if the lowest throughput is below this value",
                  minExpectedThroughput);
@@ -96,21 +113,50 @@
               << "short GI"
               << "\t\t"
               << "Throughput" << '\n';
-    int minMcs = 0;
-    int maxMcs = 7;
-    if (mcs >= 0 && mcs <= 7)
+    uint8_t minMcs = 0;
+    uint8_t maxMcs = 7;
+
+    if (mcsStr.empty())
+    {
+        for (uint8_t mcs = minMcs; mcs <= maxMcs; ++mcs)
+        {
+            mcsValues.push_back(mcs);
+        }
+    }
+    else
     {
-        minMcs = mcs;
-        maxMcs = mcs;
+        AttributeContainerValue<UintegerValue, ',', std::vector> attr;
+        auto checker = DynamicCast<AttributeContainerChecker>(MakeAttributeContainerChecker(attr));
+        checker->SetItemChecker(MakeUintegerChecker<uint8_t>());
+        attr.DeserializeFromString(mcsStr, checker);
+        mcsValues = attr.Get();
+        std::sort(mcsValues.begin(), mcsValues.end());
     }
-    for (int mcs = minMcs; mcs <= maxMcs; mcs++)
+
+    int minChannelWidth = 20;
+    int maxChannelWidth = 40;
+    if (channelWidth >= minChannelWidth && channelWidth <= maxChannelWidth)
+    {
+        minChannelWidth = channelWidth;
+        maxChannelWidth = channelWidth;
+    }
+    int minGi = 400;
+    int maxGi = 800;
+    if (guardInterval >= minGi && guardInterval <= maxGi)
+    {
+        minGi = guardInterval;
+        maxGi = guardInterval;
+    }
+
+    for (const auto mcs : mcsValues)
     {
         uint8_t index = 0;
         double previous = 0;
-        for (int channelWidth = 20; channelWidth <= 40;)
+        for (int width = minChannelWidth; width <= maxChannelWidth; width *= 2) // MHz
         {
-            for (auto sgi : {false, true})
+            for (int gi = maxGi; gi >= minGi; gi /= 2) // Nanoseconds
             {
+                const auto sgi = (gi == 400);
                 uint32_t payloadSize; // 1500 byte IP packet
                 if (udp)
                 {
@@ -171,7 +217,7 @@
                     ';'>
                     channelValue;
                 WifiPhyBand band = (frequency == 5.0 ? WIFI_PHY_BAND_5GHZ : WIFI_PHY_BAND_2_4GHZ);
-                channelValue.Set(WifiPhy::ChannelSegments{{0, channelWidth, band, 0}});
+                channelValue.Set(WifiPhy::ChannelSegments{{0, width, band, 0}});
 
                 mac.SetType("ns3::StaWifiMac", "Ssid", SsidValue(ssid));
                 phy.Set("ChannelSettings", channelValue);
@@ -221,8 +267,10 @@
                 apNodeInterface = address.Assign(apDevice);
 
                 /* Setting applications */
-                const auto maxLoad =
-                    HtPhy::GetDataRate(mcs, channelWidth, NanoSeconds(sgi ? 400 : 800), 1);
+                const auto maxLoad = HtPhy::GetDataRate(mcs,
+                                                        MHz_u{static_cast<double>(width)},
+                                                        NanoSeconds(sgi ? 400 : 800),
+                                                        1);
                 ApplicationContainer serverApp;
                 if (udp)
                 {
@@ -232,8 +280,8 @@
                     serverApp = server.Install(wifiStaNode.Get(0));
                     streamNumber += server.AssignStreams(wifiStaNode.Get(0), streamNumber);
 
-                    serverApp.Start(Seconds(0.0));
-                    serverApp.Stop(simulationTime + Seconds(1.0));
+                    serverApp.Start(Seconds(0));
+                    serverApp.Stop(simulationTime + Seconds(1));
                     const auto packetInterval = payloadSize * 8.0 / maxLoad;
 
                     UdpClientHelper client(staNodeInterface.GetAddress(0), port);
@@ -243,8 +291,8 @@
                     ApplicationContainer clientApp = client.Install(wifiApNode.Get(0));
                     streamNumber += client.AssignStreams(wifiApNode.Get(0), streamNumber);
 
-                    clientApp.Start(Seconds(1.0));
-                    clientApp.Stop(simulationTime + Seconds(1.0));
+                    clientApp.Start(Seconds(1));
+                    clientApp.Stop(simulationTime + Seconds(1));
                 }
                 else
                 {
@@ -256,8 +304,8 @@
                     streamNumber +=
                         packetSinkHelper.AssignStreams(wifiStaNode.Get(0), streamNumber);
 
-                    serverApp.Start(Seconds(0.0));
-                    serverApp.Stop(simulationTime + Seconds(1.0));
+                    serverApp.Start(Seconds(0));
+                    serverApp.Stop(simulationTime + Seconds(1));
 
                     OnOffHelper onoff("ns3::TcpSocketFactory", Ipv4Address::GetAny());
                     onoff.SetAttribute("OnTime",
@@ -272,13 +320,13 @@
                     ApplicationContainer clientApp = onoff.Install(wifiApNode.Get(0));
                     streamNumber += onoff.AssignStreams(wifiApNode.Get(0), streamNumber);
 
-                    clientApp.Start(Seconds(1.0));
-                    clientApp.Stop(simulationTime + Seconds(1.0));
+                    clientApp.Start(Seconds(1));
+                    clientApp.Stop(simulationTime + Seconds(1));
                 }
 
                 Ipv4GlobalRoutingHelper::PopulateRoutingTables();
 
-                Simulator::Stop(simulationTime + Seconds(1.0));
+                Simulator::Stop(simulationTime + Seconds(1));
                 Simulator::Run();
 
                 auto rxBytes = 0.0;
@@ -294,11 +342,11 @@
 
                 Simulator::Destroy();
 
-                std::cout << mcs << "\t\t\t" << channelWidth << " MHz\t\t\t" << std::boolalpha
-                          << sgi << "\t\t\t" << throughput << " Mbit/s" << std::endl;
+                std::cout << mcs << "\t\t\t" << width << " MHz\t\t\t" << std::boolalpha << sgi
+                          << "\t\t\t" << throughput << " Mbit/s" << std::endl;
 
                 // test first element
-                if (mcs == minMcs && channelWidth == 20 && !sgi)
+                if (mcs == minMcs && width == 20 && !sgi)
                 {
                     if (throughput < minExpectedThroughput)
                     {
@@ -306,7 +354,7 @@
                     }
                 }
                 // test last element
-                if (mcs == maxMcs && channelWidth == 40 && sgi)
+                if (mcs == maxMcs && width == 40 && sgi)
                 {
                     if (maxExpectedThroughput > 0 && throughput > maxExpectedThroughput)
                     {
@@ -333,7 +381,6 @@
                 }
                 index++;
             }
-            channelWidth *= 2;
         }
     }
     return 0;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/wireless/wifi-mixed-network.cc ns-3.44/examples/wireless/wifi-mixed-network.cc
--- ns-3.43/examples/wireless/wifi-mixed-network.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/wireless/wifi-mixed-network.cc	2025-03-09 16:55:49.339371000 -0700
@@ -79,8 +79,8 @@
     Experiment();
     /**
      * Run an experiment with the given parameters
-     * \param params the given parameters
-     * \return the throughput
+     * @param params the given parameters
+     * @return the throughput
      */
     double Run(Parameters params);
 };
@@ -265,8 +265,8 @@
         uint16_t port = 9;
         UdpServerHelper server(port);
         ApplicationContainer serverApp = server.Install(wifiApNode);
-        serverApp.Start(Seconds(0.0));
-        serverApp.Stop(simulationTime + Seconds(1.0));
+        serverApp.Start(Seconds(0));
+        serverApp.Stop(simulationTime + Seconds(1));
 
         UdpClientHelper client(ApInterface.GetAddress(0), port);
         client.SetAttribute("MaxPackets", UintegerValue(4294967295U));
@@ -286,10 +286,10 @@
         {
             clientApps.Add(client.Install(wifiNStaNodes));
         }
-        clientApps.Start(Seconds(1.0));
-        clientApps.Stop(simulationTime + Seconds(1.0));
+        clientApps.Start(Seconds(1));
+        clientApps.Stop(simulationTime + Seconds(1));
 
-        Simulator::Stop(simulationTime + Seconds(1.0));
+        Simulator::Stop(simulationTime + Seconds(1));
         Simulator::Run();
 
         double totalPacketsThrough = DynamicCast<UdpServer>(serverApp.Get(0))->GetReceived();
@@ -302,8 +302,8 @@
         PacketSinkHelper packetSinkHelper("ns3::TcpSocketFactory", localAddress);
 
         ApplicationContainer serverApp = packetSinkHelper.Install(wifiApNode.Get(0));
-        serverApp.Start(Seconds(0.0));
-        serverApp.Stop(simulationTime + Seconds(1.0));
+        serverApp.Start(Seconds(0));
+        serverApp.Stop(simulationTime + Seconds(1));
 
         OnOffHelper onoff("ns3::TcpSocketFactory", Ipv4Address::GetAny());
         onoff.SetAttribute("OnTime", StringValue("ns3::ConstantRandomVariable[Constant=1]"));
@@ -327,10 +327,10 @@
         {
             clientApps.Add(onoff.Install(wifiNStaNodes));
         }
-        clientApps.Start(Seconds(1.0));
-        clientApps.Stop(simulationTime + Seconds(1.0));
+        clientApps.Start(Seconds(1));
+        clientApps.Stop(simulationTime + Seconds(1));
 
-        Simulator::Stop(simulationTime + Seconds(1.0));
+        Simulator::Stop(simulationTime + Seconds(1));
         Simulator::Run();
 
         double totalPacketsThrough = DynamicCast<PacketSink>(serverApp.Get(0))->GetTotalRx();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/wireless/wifi-multicast.cc ns-3.44/examples/wireless/wifi-multicast.cc
--- ns-3.43/examples/wireless/wifi-multicast.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/examples/wireless/wifi-multicast.cc	2025-03-09 16:55:49.339371000 -0700
@@ -0,0 +1,538 @@
+/*
+ * Copyright (c) 2023 DERONNE SOFTWARE ENGINEERING
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+#include "ns3/boolean.h"
+#include "ns3/command-line.h"
+#include "ns3/config.h"
+#include "ns3/data-rate.h"
+#include "ns3/double.h"
+#include "ns3/enum.h"
+#include "ns3/error-model.h"
+#include "ns3/inet-socket-address.h"
+#include "ns3/internet-stack-helper.h"
+#include "ns3/ipv4-address-helper.h"
+#include "ns3/ipv4-l3-protocol.h"
+#include "ns3/ipv4-list-routing-helper.h"
+#include "ns3/ipv4-static-routing-helper.h"
+#include "ns3/ipv4-static-routing.h"
+#include "ns3/log.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/mobility-model.h"
+#include "ns3/names.h"
+#include "ns3/node.h"
+#include "ns3/on-off-helper.h"
+#include "ns3/packet-sink-helper.h"
+#include "ns3/packet-sink.h"
+#include "ns3/simulator.h"
+#include "ns3/socket.h"
+#include "ns3/ssid.h"
+#include "ns3/string.h"
+#include "ns3/test.h"
+#include "ns3/trace-helper.h"
+#include "ns3/udp-socket-factory.h"
+#include "ns3/udp-socket.h"
+#include "ns3/uinteger.h"
+#include "ns3/wifi-mac.h"
+#include "ns3/wifi-net-device.h"
+#include "ns3/wifi-psdu.h"
+#include "ns3/yans-wifi-channel.h"
+#include "ns3/yans-wifi-helper.h"
+
+#include <limits>
+#include <sstream>
+#include <string>
+
+// This is an example to verify performance of 802.11aa groupcast with retries (GCR) in comparison
+// with the usual NoAck/NoRetry retransmission policy. In the latter, a groupcast frame is
+// transmitted only once, whereas GCR allows to retransmit groupcast frames to improve reliability.
+//
+// The simulation considers a single 802.11ax AP and a configurable number of GCR-capable STAs in an
+// infrastructure network. Multicast traffic is generated from the AP to all the non-AP STAs and
+// artificial errors can be introduced to mimic interference on the wireless channel.
+//
+// There are a number of command-line options available to control the scenario under test. The list
+// of available command-line options can be listed with the following command:
+// ./ns3 run "wifi-multicast --help"
+//
+// The main command-line options are:
+//    --gcrRetransmissionPolicy: control the retransmission policy by selecting "NoAckNoRetry" for
+//    no retransmission, "GcrUr" for GCR with unsolicited retries or "GcrBlockAck" for GCR Block Ack
+//    --nStations: control the number of GCR-capable STAs associated to the AP
+//    --accessCategory: control the access category to use for the multicast traffic
+//    --multicastFrameErrorRate: set the artificial frame error rate for the groupcast traffic
+//    --nRetriesGcrUr: if GCR-UR is selected, this parameter controls the maximum number of retries
+//    --gcrProtection: select the protection mechanism for groupcast frames if GCR-UR or GCR-BA is
+//    used, either "Rts-Cts" or "Cts-To-Self" can be selected
+//
+// Example usage for NoAckNoRetry and a frame error rate of 20%:
+// ./ns3 run "wifi-multicast --gcrRetransmissionPolicy=NoAckNoRetry --multicastFrameErrorRate=0.2"
+// which outputs:
+// Node         TX packets  TX bytes    RX packets  RX bytes    Throughput (Mbit/s)
+// AP           10          10000       0           0           11.1111
+// STA1         0           0           10          10000       10.992
+//
+// Example usage for GCR-UR with up to 2 retries and the same frame error rate:
+// ./ns3 run "wifi-multicast --gcrRetransmissionPolicy=GcrUr --nRetriesGcrUr=2
+// --multicastFrameErrorRate=0.2"
+// which outputs:
+// Node         TX packets  TX bytes    RX packets  RX bytes    Throughput (Mbit/s)
+// AP           10          10000       0           0           11.1111
+// STA1         0           0           10          10000       10.992
+//
+// Example usage for GCR-BA with 4 STAs and the same frame error rate:
+// ./ns3 run "wifi-multicast --gcrRetransmissionPolicy=GcrBlockAck --nStations=4"
+// which outputs:
+// Node         TX packets  TX bytes    RX packets  RX bytes    Throughput (Mbit/s)
+// AP           10          10000       0           0           11.1111
+// STA1         0           0           10          10000       8.26959
+// STA2         0           0           10          10000       8.26959
+// STA3         0           0           10          10000       8.26959
+// STA4         0           0           10          10000       8.26959
+
+using namespace ns3;
+
+NS_LOG_COMPONENT_DEFINE("WifiMulticast");
+
+uint64_t g_txBytes; //!< Number of generated bytes
+Time g_firstTx;     //!< Time at which first TX packet is generated
+Time g_lastTx;      //!< Time at which last TX packet is generated
+Time g_lastRx;      //!< Time at which last RX packet is received
+
+/**
+ * Parse context strings of the form "/NodeList/x/DeviceList/x/..." to extract the NodeId integer
+ *
+ * @param context The context to parse.
+ * @return the NodeId
+ */
+uint32_t
+ContextToNodeId(const std::string& context)
+{
+    std::string sub = context.substr(10);
+    uint32_t pos = sub.find("/Device");
+    return std::stoi(sub.substr(0, pos));
+}
+
+/**
+ * Socket sent packet.
+ *
+ * @param context The context.
+ * @param p The packet.
+ */
+void
+SocketTxPacket(std::string context, Ptr<const Packet> p)
+{
+    if (g_txBytes == 0)
+    {
+        g_firstTx = Simulator::Now();
+    }
+    g_txBytes += p->GetSize();
+    g_lastTx = Simulator::Now();
+}
+
+/**
+ *
+ * @param context The context.
+ * @param p The packet.
+ * @param from sender address.
+ */
+void
+SocketRxPacket(std::string context, Ptr<const Packet> p, const Address& from)
+{
+    g_lastRx = Simulator::Now();
+}
+
+/**
+ * Callback when a frame is transmitted.
+ * @param rxErrorModel the post reception error model on the receiver
+ * @param ranVar the random variable to determine whether the packet shall be corrupted
+ * @param errorRate the configured corruption error rate for multicast frames
+ * @param context the context
+ * @param psduMap the PSDU map
+ * @param txVector the TX vector
+ * @param txPowerW the tx power in Watts
+ */
+void
+TxCallback(Ptr<ListErrorModel> rxErrorModel,
+           Ptr<RandomVariableStream> ranVar,
+           double errorRate,
+           std::string context,
+           WifiConstPsduMap psduMap,
+           WifiTxVector txVector,
+           double txPowerW)
+{
+    auto psdu = psduMap.begin()->second;
+    if (psdu->GetHeader(0).GetAddr1().IsGroup() && !psdu->GetHeader(0).GetAddr1().IsBroadcast() &&
+        psdu->GetHeader(0).IsQosData())
+    {
+        NS_LOG_INFO("AP tx multicast: PSDU=" << *psdu << " TXVECTOR=" << txVector);
+        if (ranVar->GetValue() < errorRate)
+        {
+            auto uid = psdu->GetPayload(0)->GetUid();
+            NS_LOG_INFO("Corrupt multicast frame with UID=" << uid);
+            rxErrorModel->SetList({uid});
+        }
+        else
+        {
+            rxErrorModel->SetList({});
+        }
+    }
+}
+
+/**
+ * Callback when a frame is successfully received.
+ *
+ * @param context the context
+ * @param p the packet
+ * @param snr the SNR (in linear scale)
+ * @param mode the mode used to transmit the packet
+ * @param preamble the preamble
+ */
+void
+RxCallback(std::string context,
+           Ptr<const Packet> p,
+           double snr,
+           WifiMode mode,
+           WifiPreamble preamble)
+{
+    Ptr<Packet> packet = p->Copy();
+    WifiMacHeader hdr;
+    packet->RemoveHeader(hdr);
+    if (hdr.GetAddr1().IsGroup() && !hdr.GetAddr1().IsBroadcast() && hdr.IsQosData())
+    {
+        std::stringstream ss;
+        hdr.Print(ss);
+        NS_LOG_INFO("STA" << ContextToNodeId(context) << " rx multicast: " << ss.str());
+    }
+}
+
+int
+main(int argc, char* argv[])
+{
+    bool logging{false};
+    bool verbose{false};
+    bool pcap{false};
+    std::size_t nStations{1};
+    Time simulationTime{"10s"};
+    uint32_t payloadSize{1000}; // bytes
+    DataRate dataRate{"10Mb/s"};
+    uint32_t maxPackets{10};
+    uint32_t rtsThreshold{std::numeric_limits<uint16_t>::max()};
+    std::string targetAddr{"239.192.100.1"};
+    std::string accessCategory{"AC_BE"};
+    std::string gcrRetransmissionPolicy{"NoAckNoRetry"};
+    std::string rateManager{"Constant"};
+    uint16_t constantRateMcs{11};
+    uint16_t nRetriesGcrUr{7};
+    std::string gcrProtection{"Rts-Cts"};
+    double multicastFrameErrorRate{0.0};
+    uint16_t maxAmpduLength{0};
+    double minExpectedPackets{0};
+    double maxExpectedPackets{0};
+    double minExpectedThroughput{0};
+    double maxExpectedThroughput{0};
+    double tolerance{0.01};
+
+    CommandLine cmd(__FILE__);
+    cmd.AddValue("logging", "turn on example log components", logging);
+    cmd.AddValue("verbose", "turn on all wifi log components", verbose);
+    cmd.AddValue("pcap", "turn on pcap file output", pcap);
+    cmd.AddValue("nStations", "number of non-AP stations", nStations);
+    cmd.AddValue("simulationTime", "Simulation time", simulationTime);
+    cmd.AddValue("payloadSize", "The application payload size in bytes", payloadSize);
+    cmd.AddValue(
+        "maxPackets",
+        "The maximum number of packets to be generated by the application (0 for no limit)",
+        maxPackets);
+    cmd.AddValue("dataRate", "The application data rate", dataRate);
+    cmd.AddValue("rtsThreshold", "RTS threshold", rtsThreshold);
+    cmd.AddValue("rateManager",
+                 "The rate adaptation manager to use (Constant, Ideal, MinstrelHt)",
+                 rateManager);
+    cmd.AddValue("mcs",
+                 "The MCS to use if Constant rate adaptation manager is used",
+                 constantRateMcs);
+    cmd.AddValue("targetAddress", "multicast target address", targetAddr);
+    cmd.AddValue("accessCategory",
+                 "select the multicast traffic access category (AC_BE, AC_BK, AC_VI, AC_VO)",
+                 accessCategory);
+    cmd.AddValue(
+        "gcrRetransmissionPolicy",
+        "GCR retransmission policy for groupcast frames (NoAckNoRetry, GcrUr, GcrBlockAck)",
+        gcrRetransmissionPolicy);
+    cmd.AddValue("nRetriesGcrUr",
+                 "number of retries per groupcast frame when GCR-UR retransmission policy is used",
+                 nRetriesGcrUr);
+    cmd.AddValue("gcrProtection",
+                 "protection to use for GCR (Rts-Cts or Cts-To-Self)",
+                 gcrProtection);
+    cmd.AddValue("multicastFrameErrorRate",
+                 "artificial error rate for multicast frame",
+                 multicastFrameErrorRate);
+    cmd.AddValue("maxAmpduLength", "maximum length in bytes of an A-MPDU", maxAmpduLength);
+    cmd.AddValue("minExpectedPackets",
+                 "if set, simulation fails if the lowest amount of received packets is below this "
+                 "value (in Mbit/s)",
+                 minExpectedPackets);
+    cmd.AddValue("maxExpectedPackets",
+                 "if set, simulation fails if the highest amount of received packets is above this "
+                 "value (in Mbit/s)",
+                 maxExpectedPackets);
+    cmd.AddValue("minExpectedThroughput",
+                 "if set, simulation fails if the throughput is below this value",
+                 minExpectedThroughput);
+    cmd.AddValue("maxExpectedThroughput",
+                 "if set, simulation fails if the throughput is above this value",
+                 maxExpectedThroughput);
+    cmd.Parse(argc, argv);
+
+    Config::SetDefault("ns3::WifiMac::RobustAVStreamingSupported", BooleanValue(true));
+
+    // create nodes
+    NodeContainer wifiApNode;
+    wifiApNode.Create(1);
+    NodeContainer wifiStaNodes;
+    wifiStaNodes.Create(nStations);
+
+    // configure PHY and MAC
+    WifiHelper wifi;
+    if (verbose)
+    {
+        WifiHelper::EnableLogComponents();
+    }
+    if (logging)
+    {
+        LogComponentEnable("WifiMulticast", LOG_LEVEL_ALL);
+    }
+    wifi.SetStandard(WIFI_STANDARD_80211ax);
+
+    YansWifiPhyHelper wifiPhy;
+    wifiPhy.SetPcapDataLinkType(WifiPhyHelper::DLT_IEEE802_11_RADIO);
+
+    auto wifiChannel = YansWifiChannelHelper::Default();
+    wifiChannel.SetPropagationDelay("ns3::ConstantSpeedPropagationDelayModel");
+    wifiPhy.SetChannel(wifiChannel.Create());
+
+    WifiMacHelper wifiMac;
+    if (rateManager == "Constant")
+    {
+        wifi.SetRemoteStationManager("ns3::ConstantRateWifiManager",
+                                     "DataMode",
+                                     StringValue("HeMcs" + std::to_string(constantRateMcs)),
+                                     "RtsCtsThreshold",
+                                     UintegerValue(rtsThreshold));
+    }
+    else
+    {
+        wifi.SetRemoteStationManager("ns3::" + rateManager + "RateWifiManager",
+                                     "RtsCtsThreshold",
+                                     UintegerValue(rtsThreshold));
+    }
+
+    if (gcrRetransmissionPolicy != "NoAckNoRetry")
+    {
+        std::string retransmissionPolicyStr;
+        if (gcrRetransmissionPolicy == "GcrUr")
+        {
+            retransmissionPolicyStr = "GCR_UR";
+        }
+        else if (gcrRetransmissionPolicy == "GcrBlockAck")
+        {
+            retransmissionPolicyStr = "GCR_BA";
+        }
+        else
+        {
+            std::cout << "Wrong retransmission policy!" << std::endl;
+            return 0;
+        }
+        wifiMac.SetGcrManager("ns3::WifiDefaultGcrManager",
+                              "RetransmissionPolicy",
+                              StringValue(retransmissionPolicyStr),
+                              "UnsolicitedRetryLimit",
+                              UintegerValue(nRetriesGcrUr),
+                              "GcrProtectionMode",
+                              StringValue(gcrProtection));
+    }
+
+    Ssid ssid = Ssid("wifi-multicast");
+
+    // setup AP
+    wifiMac.SetType("ns3::ApWifiMac", "Ssid", SsidValue(ssid));
+    auto apDevice = wifi.Install(wifiPhy, wifiMac, wifiApNode);
+
+    // setup STAs
+    wifiMac.SetType("ns3::StaWifiMac", "Ssid", SsidValue(ssid));
+    auto staDevices = wifi.Install(wifiPhy, wifiMac, wifiStaNodes);
+
+    auto rxErrorModel = CreateObject<ListErrorModel>();
+    auto ranVar = CreateObject<UniformRandomVariable>();
+    ranVar->SetStream(1);
+    Config::Connect("/NodeList/0/DeviceList/*/$ns3::WifiNetDevice/Phys/0/PhyTxPsduBegin",
+                    MakeCallback(TxCallback).Bind(rxErrorModel, ranVar, multicastFrameErrorRate));
+    for (std::size_t i = 0; i < nStations; ++i)
+    {
+        auto wifiMac = DynamicCast<WifiNetDevice>(staDevices.Get(i))->GetMac();
+        wifiMac->GetWifiPhy(0)->SetPostReceptionErrorModel(rxErrorModel);
+    }
+    Config::Connect("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::WifiPhy/State/RxOk",
+                    MakeCallback(RxCallback));
+
+    // mobility
+    MobilityHelper mobility;
+    Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator>();
+    positionAlloc->Add(Vector(0.0, 0.0, 0.0));
+    for (std::size_t i = 0; i < nStations; ++i)
+    {
+        positionAlloc->Add(Vector(i, 0.0, 0.0));
+    }
+    mobility.SetPositionAllocator(positionAlloc);
+    mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
+    mobility.Install(wifiApNode);
+    mobility.Install(wifiStaNodes);
+
+    // setup static routes to facilitate multicast flood
+    Ipv4ListRoutingHelper listRouting;
+    Ipv4StaticRoutingHelper staticRouting;
+    listRouting.Add(staticRouting, 0);
+
+    // configure IP stack
+    InternetStackHelper internet;
+    internet.SetIpv6StackInstall(false);
+    internet.SetIpv4ArpJitter(true);
+    internet.SetRoutingHelper(listRouting);
+    internet.Install(wifiApNode);
+    internet.Install(wifiStaNodes);
+
+    Ipv4AddressHelper ipv4address;
+    ipv4address.SetBase("10.0.0.0", "255.255.255.0");
+    auto apNodeInterface = ipv4address.Assign(apDevice);
+    auto staNodeInterfaces = ipv4address.Assign(staDevices);
+
+    // add static route in AP
+    auto ipv4 = wifiApNode.Get(0)->GetObject<Ipv4>();
+    auto routing = staticRouting.GetStaticRouting(ipv4);
+    routing->AddHostRouteTo(targetAddr.c_str(),
+                            ipv4->GetInterfaceForDevice(wifiApNode.Get(0)->GetDevice(0)),
+                            0);
+
+    uint8_t tosValue;
+    std::string maxAmpduSizeAttribute;
+    if (accessCategory == "AC_BE")
+    {
+        tosValue = 0x70;
+        maxAmpduSizeAttribute = "BE_MaxAmpduSize";
+    }
+    else if (accessCategory == "AC_BK")
+    {
+        tosValue = 0x28;
+        maxAmpduSizeAttribute = "BK_MaxAmpduSize";
+    }
+    else if (accessCategory == "AC_VI")
+    {
+        tosValue = 0xb8;
+        maxAmpduSizeAttribute = "VI_MaxAmpduSize";
+    }
+    else if (accessCategory == "AC_VO")
+    {
+        tosValue = 0xc0;
+        maxAmpduSizeAttribute = "VO_MaxAmpduSize";
+    }
+    else
+    {
+        NS_ABORT_MSG("Invalid access category");
+    }
+    auto apWifiMac = DynamicCast<WifiNetDevice>(apDevice.Get(0))->GetMac();
+    apWifiMac->SetAttribute(maxAmpduSizeAttribute, UintegerValue(maxAmpduLength));
+
+    // sinks
+    InetSocketAddress sinkSocket(Ipv4Address::GetAny(), 90);
+    PacketSinkHelper sinkHelper("ns3::UdpSocketFactory", sinkSocket);
+    auto sinks = sinkHelper.Install(wifiStaNodes);
+    sinks.Start(Seconds(0));
+    sinks.Stop(simulationTime + Seconds(2.0));
+
+    // source
+    InetSocketAddress sourceSocket(targetAddr.c_str(), 90);
+    OnOffHelper onoffHelper("ns3::UdpSocketFactory", sourceSocket);
+    onoffHelper.SetAttribute("DataRate", DataRateValue(dataRate));
+    onoffHelper.SetAttribute("PacketSize", UintegerValue(payloadSize));
+    onoffHelper.SetAttribute("MaxBytes", UintegerValue(maxPackets * payloadSize));
+    onoffHelper.SetAttribute("Tos", UintegerValue(tosValue));
+    onoffHelper.SetAttribute("OnTime", StringValue("ns3::ConstantRandomVariable[Constant=1]"));
+    onoffHelper.SetAttribute("OffTime", StringValue("ns3::ConstantRandomVariable[Constant=0]"));
+    auto source = onoffHelper.Install(wifiApNode);
+    source.Start(Seconds(1));
+    source.Stop(simulationTime + Seconds(1.0));
+
+    // pcap
+    if (pcap)
+    {
+        wifiPhy.EnablePcap("wifi-multicast-AP", apDevice.Get(0));
+        for (std::size_t i = 0; i < nStations; ++i)
+        {
+            wifiPhy.EnablePcap("wifi-multicast-STA" + std::to_string(i + 1), staDevices.Get(i));
+        }
+    }
+
+    g_txBytes = 0;
+
+    Config::Connect("/NodeList/*/$ns3::Node/ApplicationList/*/$ns3::OnOffApplication/Tx",
+                    MakeCallback(&SocketTxPacket));
+
+    Config::Connect("/NodeList/*/ApplicationList/*/$ns3::PacketSink/Rx",
+                    MakeCallback(&SocketRxPacket));
+
+    // run simulation
+    Simulator::Stop(simulationTime + Seconds(2.0));
+    Simulator::Run();
+
+    // check results
+    std::cout << "Node\t\t\tTX packets\t\tTX bytes\t\tRX packets\t\tRX bytes\t\tThroughput (Mbit/s)"
+              << std::endl;
+    const auto txRate =
+        (g_lastTx - g_firstTx).IsStrictlyPositive()
+            ? static_cast<double>(g_txBytes * 8) / ((g_lastTx - g_firstTx).GetMicroSeconds())
+            : 0.0; // Mbit/s
+    const auto txPackets = g_txBytes / payloadSize;
+    std::cout << "AP"
+              << "\t\t\t" << txPackets << "\t\t\t" << g_txBytes << "\t\t\t0\t\t\t0\t\t\t" << txRate
+              << "" << std::endl;
+    for (std::size_t i = 0; i < nStations; ++i)
+    {
+        const auto rxBytes = sinks.Get(0)->GetObject<PacketSink>()->GetTotalRx();
+        const auto rxPackets = rxBytes / payloadSize;
+        const auto throughput =
+            (g_lastRx - g_firstTx).IsStrictlyPositive()
+                ? static_cast<double>(rxBytes * 8) / ((g_lastRx - g_firstTx).GetMicroSeconds())
+                : 0.0; // Mbit/s
+        std::cout << "STA" << i + 1 << "\t\t\t0\t\t\t0\t\t\t" << rxPackets << "\t\t\t" << rxBytes
+                  << "\t\t\t" << throughput << "" << std::endl;
+        if (rxPackets < minExpectedPackets)
+        {
+            NS_LOG_ERROR("Obtained RX packets " << rxPackets << " is not expected!");
+            exit(1);
+        }
+        if (maxExpectedPackets > 0 && rxPackets > maxExpectedPackets)
+        {
+            NS_LOG_ERROR("Obtained RX packets " << rxPackets << " is not expected!");
+            exit(1);
+        }
+        if ((throughput * (1 + tolerance)) < minExpectedThroughput)
+        {
+            NS_LOG_ERROR("Obtained throughput " << throughput << " is not expected!");
+            exit(1);
+        }
+        if (maxExpectedThroughput > 0 && (throughput > (maxExpectedThroughput * (1 + tolerance))))
+        {
+            NS_LOG_ERROR("Obtained throughput " << throughput << " is not expected!");
+            exit(1);
+        }
+    }
+
+    Simulator::Destroy();
+    return 0;
+}
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/wireless/wifi-multirate.cc ns-3.44/examples/wireless/wifi-multirate.cc
--- ns-3.43/examples/wireless/wifi-multirate.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/wireless/wifi-multirate.cc	2025-03-09 16:55:49.339371000 -0700
@@ -69,19 +69,19 @@
   public:
     Experiment();
     /**
-     * \brief Construct a new Experiment object
+     * @brief Construct a new Experiment object
      *
-     * \param name The name of the experiment.
+     * @param name The name of the experiment.
      */
     Experiment(std::string name);
     /**
      * Run an experiment.
-     * \param wifi The WifiHelper class.
-     * \param wifiPhy The YansWifiPhyHelper class.
-     * \param wifiMac The WifiMacHelper class.
-     * \param wifiChannel The YansWifiChannelHelper class.
-     * \param mobility The MobilityHelper class.
-     * \return a 2D dataset of the experiment data.
+     * @param wifi The WifiHelper class.
+     * @param wifiPhy The YansWifiPhyHelper class.
+     * @param wifiMac The WifiMacHelper class.
+     * @param wifiChannel The YansWifiChannelHelper class.
+     * @param mobility The MobilityHelper class.
+     * @return a 2D dataset of the experiment data.
      */
     Gnuplot2dDataset Run(const WifiHelper& wifi,
                          const YansWifiPhyHelper& wifiPhy,
@@ -90,18 +90,18 @@
                          const MobilityHelper& mobility);
 
     /**
-     * \brief Setup the experiment from the command line arguments.
+     * @brief Setup the experiment from the command line arguments.
      *
-     * \param argc The argument count.
-     * \param argv The argument vector.
-     * \return true
+     * @param argc The argument count.
+     * @param argv The argument vector.
+     * @return true
      */
     bool CommandSetup(int argc, char** argv);
 
     /**
-     * \brief Check if routing is enabled.
+     * @brief Check if routing is enabled.
      *
-     * \return true if routing is enabled.
+     * @return true if routing is enabled.
      */
     bool IsRouting() const
     {
@@ -109,9 +109,9 @@
     }
 
     /**
-     * \brief Check if mobility is enabled.
+     * @brief Check if mobility is enabled.
      *
-     * \return true if mobility is enabled.
+     * @return true if mobility is enabled.
      */
     bool IsMobility() const
     {
@@ -119,9 +119,9 @@
     }
 
     /**
-     * \brief Get the Scenario number.
+     * @brief Get the Scenario number.
      *
-     * \return the scenario number.
+     * @return the scenario number.
      */
     uint32_t GetScenario() const
     {
@@ -129,9 +129,9 @@
     }
 
     /**
-     * \brief Get the RTS Threshold.
+     * @brief Get the RTS Threshold.
      *
-     * \return the RTS Threshold.
+     * @return the RTS Threshold.
      */
     std::string GetRtsThreshold() const
     {
@@ -139,9 +139,9 @@
     }
 
     /**
-     * \brief Get the Output File Name.
+     * @brief Get the Output File Name.
      *
-     * \return the Output File Name.
+     * @return the Output File Name.
      */
     std::string GetOutputFileName() const
     {
@@ -149,9 +149,9 @@
     }
 
     /**
-     * \brief Get the Rate Manager.
+     * @brief Get the Rate Manager.
      *
-     * \return the Rate Manager.
+     * @return the Rate Manager.
      */
     std::string GetRateManager() const
     {
@@ -160,34 +160,34 @@
 
   private:
     /**
-     * \brief Setup the receiving socket.
+     * @brief Setup the receiving socket.
      *
-     * \param node The receiving node.
-     * \return the Rx socket.
+     * @param node The receiving node.
+     * @return the Rx socket.
      */
     Ptr<Socket> SetupPacketReceive(Ptr<Node> node);
     /**
      * Generate 1-hop and 2-hop neighbors of a node in grid topology
-     * \param c The node container.
-     * \param senderId The sender ID.
-     * \return the neighbor nodes.
+     * @param c The node container.
+     * @param senderId The sender ID.
+     * @return the neighbor nodes.
      */
     NodeContainer GenerateNeighbors(NodeContainer c, uint32_t senderId);
 
     /**
-     * \brief Setup the application in the nodes.
+     * @brief Setup the application in the nodes.
      *
-     * \param client Client node.
-     * \param server Server node.
-     * \param start Start time.
-     * \param stop Stop time.
+     * @param client Client node.
+     * @param server Server node.
+     * @param start Start time.
+     * @param stop Stop time.
      */
     void ApplicationSetup(Ptr<Node> client, Ptr<Node> server, double start, double stop);
     /**
      * Take the grid map, divide it into 4 quadrants
      * Assign all nodes from each quadrant to a specific container
      *
-     * \param c The node container.
+     * @param c The node container.
      */
     void AssignNeighbors(NodeContainer c);
     /**
@@ -195,25 +195,25 @@
      * may be the source for multiple destinations and a node maybe a destination
      * for multiple sources.
      *
-     * \param c The node container.
+     * @param c The node container.
      */
     void SelectSrcDest(NodeContainer c);
     /**
-     * \brief Receive a packet.
+     * @brief Receive a packet.
      *
-     * \param socket The receiving socket.
+     * @param socket The receiving socket.
      */
     void ReceivePacket(Ptr<Socket> socket);
     /**
-     * \brief Calculate the throughput.
+     * @brief Calculate the throughput.
      */
     void CheckThroughput();
     /**
      * A sender node will  set up a flow to each of the its neighbors
      * in its quadrant randomly.  All the flows are exponentially distributed.
      *
-     * \param sender The sender node.
-     * \param c The node neighbors.
+     * @param sender The sender node.
+     * @param c The node neighbors.
      */
     void SendMultiDestinations(Ptr<Node> sender, NodeContainer c);
 
@@ -425,9 +425,9 @@
 /**
  * Print the position of two nodes.
  *
- * \param client Client node.
- * \param server Server node.
- * \return a string with the nodes data and positions
+ * @param client Client node.
+ * @param server Server node.
+ * @return a string with the nodes data and positions
  */
 static inline std::string
 PrintPosition(Ptr<Node> client, Ptr<Node> server)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/wireless/wifi-multi-tos.cc ns-3.44/examples/wireless/wifi-multi-tos.cc
--- ns-3.43/examples/wireless/wifi-multi-tos.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/wireless/wifi-multi-tos.cc	2025-03-09 16:55:49.339371000 -0700
@@ -154,14 +154,14 @@
         }
     }
 
-    sinkApplications.Start(Seconds(0.0));
-    sinkApplications.Stop(simulationTime + Seconds(1.0));
-    sourceApplications.Start(Seconds(1.0));
-    sourceApplications.Stop(simulationTime + Seconds(1.0));
+    sinkApplications.Start(Seconds(0));
+    sinkApplications.Stop(simulationTime + Seconds(1));
+    sourceApplications.Start(Seconds(1));
+    sourceApplications.Stop(simulationTime + Seconds(1));
 
     Ipv4GlobalRoutingHelper::PopulateRoutingTables();
 
-    Simulator::Stop(simulationTime + Seconds(1.0));
+    Simulator::Stop(simulationTime + Seconds(1));
     Simulator::Run();
 
     double throughput = 0;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/wireless/wifi-power-adaptation-distance.cc ns-3.44/examples/wireless/wifi-power-adaptation-distance.cc
--- ns-3.43/examples/wireless/wifi-power-adaptation-distance.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/wireless/wifi-power-adaptation-distance.cc	2025-03-09 16:55:49.339371000 -0700
@@ -17,12 +17,12 @@
  * into an eps file, by running:
  * \code{.sh}
  *   gnuplot throughput-parf.plt
- * \endcode
+ * @endcode
  * Also, to enable logging of rate and power changes to the terminal, set this
  * environment variable:
  * \code{.sh}
  *   export NS_LOG=PowerAdaptationDistance=level_info
- * \endcode
+ * @endcode
  *
  * This simulation consist of 2 nodes, one AP and one STA.
  * The AP generates UDP traffic with a CBR of 54 Mbps to the STA.
@@ -55,7 +55,7 @@
  * To display all the possible arguments and their defaults:
  * \code{.sh}
  *   ./ns3 run "wifi-power-adaptation-distance --help"
- * \endcode
+ * @endcode
  *
  * Example usage (selecting Aparf rather than Parf):
  * \code{.sh}
@@ -70,7 +70,7 @@
  * To enable the log of rate and power changes:
  * \code{.sh}
  *   export NS_LOG=PowerAdaptationDistance=level_info
- * \endcode
+ * @endcode
  */
 
 #include "ns3/command-line.h"
@@ -100,85 +100,85 @@
 static const uint32_t packetSize = 1420;
 
 /**
- * \brief Class to collect node statistics.
+ * @brief Class to collect node statistics.
  */
 class NodeStatistics
 {
   public:
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      *
-     * \param aps Access points
-     * \param stas WiFi Stations.
+     * @param aps Access points
+     * @param stas WiFi Stations.
      */
     NodeStatistics(NetDeviceContainer aps, NetDeviceContainer stas);
 
     /**
-     * \brief Callback called by WifiNetDevice/Phy/PhyTxBegin.
+     * @brief Callback called by WifiNetDevice/Phy/PhyTxBegin.
      *
-     * \param path The trace path.
-     * \param packet The sent packet.
-     * \param powerW The Tx power.
+     * @param path The trace path.
+     * @param packet The sent packet.
+     * @param powerW The Tx power.
      */
     void PhyCallback(std::string path, Ptr<const Packet> packet, double powerW);
     /**
-     * \brief Callback called by PacketSink/Rx.
+     * @brief Callback called by PacketSink/Rx.
      *
-     * \param path The trace path.
-     * \param packet The received packet.
-     * \param from The sender address.
+     * @param path The trace path.
+     * @param packet The received packet.
+     * @param from The sender address.
      */
     void RxCallback(std::string path, Ptr<const Packet> packet, const Address& from);
     /**
-     * \brief Callback called by WifiNetDevice/RemoteStationManager/x/PowerChange.
+     * @brief Callback called by WifiNetDevice/RemoteStationManager/x/PowerChange.
      *
-     * \param path The trace path.
-     * \param oldPower Old Tx power.
-     * \param newPower Actual Tx power.
-     * \param dest Destination of the transmission.
+     * @param path The trace path.
+     * @param oldPower Old Tx power.
+     * @param newPower Actual Tx power.
+     * @param dest Destination of the transmission.
      */
     void PowerCallback(std::string path, double oldPower, double newPower, Mac48Address dest);
     /**
-     * \brief Callback called by WifiNetDevice/RemoteStationManager/x/RateChange.
+     * @brief Callback called by WifiNetDevice/RemoteStationManager/x/RateChange.
      *
-     * \param path The trace path.
-     * \param oldRate Old rate.
-     * \param newRate Actual rate.
-     * \param dest Destination of the transmission.
+     * @param path The trace path.
+     * @param oldRate Old rate.
+     * @param newRate Actual rate.
+     * @param dest Destination of the transmission.
      */
     void RateCallback(std::string path, DataRate oldRate, DataRate newRate, Mac48Address dest);
     /**
-     * \brief Set the Position of a node.
+     * @brief Set the Position of a node.
      *
-     * \param node The node.
-     * \param position The position.
+     * @param node The node.
+     * @param position The position.
      */
     void SetPosition(Ptr<Node> node, Vector position);
     /**
      * Move a node.
-     * \param node The node.
-     * \param stepsSize The step size.
-     * \param stepsTime Time on each step.
+     * @param node The node.
+     * @param stepsSize The step size.
+     * @param stepsTime Time on each step.
      */
     void AdvancePosition(Ptr<Node> node, int stepsSize, Time stepsTime);
     /**
-     * \brief Get the Position of a node.
+     * @brief Get the Position of a node.
      *
-     * \param node The node.
-     * \return the position of the node.
+     * @param node The node.
+     * @return the position of the node.
      */
     Vector GetPosition(Ptr<Node> node);
 
     /**
-     * \brief Get the Throughput output data
+     * @brief Get the Throughput output data
      *
-     * \return the Throughput output data.
+     * @return the Throughput output data.
      */
     Gnuplot2dDataset GetDatafile();
     /**
-     * \brief Get the Power output data.
+     * @brief Get the Power output data.
      *
-     * \return the Power output data.
+     * @return the Power output data.
      */
     Gnuplot2dDataset GetPowerDatafile();
 
@@ -186,16 +186,16 @@
     /// Time, DataRate pair vector.
     typedef std::vector<std::pair<Time, DataRate>> TxTime;
     /**
-     * \brief Setup the WifiPhy object.
+     * @brief Setup the WifiPhy object.
      *
-     * \param phy The WifiPhy to setup.
+     * @param phy The WifiPhy to setup.
      */
     void SetupPhy(Ptr<WifiPhy> phy);
     /**
-     * \brief Get the time at which a given datarate has been recorded.
+     * @brief Get the time at which a given datarate has been recorded.
      *
-     * \param rate The datarate to search.
-     * \return the time.
+     * @param rate The datarate to search.
+     * @return the time.
      */
     Time GetCalcTxTime(DataRate rate);
 
@@ -243,7 +243,7 @@
         txVector.SetPreambleType(WIFI_PREAMBLE_LONG);
         txVector.SetChannelWidth(phy->GetChannelWidth());
         DataRate dataRate(mode.GetDataRate(phy->GetChannelWidth()));
-        Time time = phy->CalculateTxDuration(packetSize, txVector, phy->GetPhyBand());
+        Time time = WifiPhy::CalculateTxDuration(packetSize, txVector, phy->GetPhyBand());
         NS_LOG_DEBUG(mode.GetUniqueName() << " " << time.GetSeconds() << " " << dataRate);
         m_timeTable.emplace_back(time, dataRate);
     }
@@ -260,7 +260,7 @@
         }
     }
     NS_ASSERT(false);
-    return Seconds(0);
+    return Time(0);
 }
 
 void
@@ -272,16 +272,16 @@
 
     if (head.GetType() == WIFI_MAC_DATA)
     {
-        m_totalEnergy += pow(10.0, m_currentPower[dest] / 10.0) *
-                         GetCalcTxTime(m_currentRate[dest]).GetSeconds();
-        m_totalTime += GetCalcTxTime(m_currentRate[dest]).GetSeconds();
+        const auto txTimeSeconds = GetCalcTxTime(m_currentRate[dest]).GetSeconds();
+        m_totalEnergy += DbmToW(m_currentPower[dest]) * txTimeSeconds;
+        m_totalTime += txTimeSeconds;
     }
 }
 
 void
 NodeStatistics::PowerCallback(std::string path, double oldPower, double newPower, Mac48Address dest)
 {
-    m_currentPower[dest] = newPower;
+    m_currentPower[dest] = dBm_u{newPower};
 }
 
 void
@@ -351,10 +351,10 @@
 /**
  * Callback called by WifiNetDevice/RemoteStationManager/x/PowerChange.
  *
- * \param path The trace path.
- * \param oldPower Old Tx power.
- * \param newPower Actual Tx power.
- * \param dest Destination of the transmission.
+ * @param path The trace path.
+ * @param oldPower Old Tx power.
+ * @param newPower Actual Tx power.
+ * @param dest Destination of the transmission.
  */
 void
 PowerCallback(std::string path, double oldPower, double newPower, Mac48Address dest)
@@ -364,12 +364,12 @@
 }
 
 /**
- * \brief Callback called by WifiNetDevice/RemoteStationManager/x/RateChange.
+ * @brief Callback called by WifiNetDevice/RemoteStationManager/x/RateChange.
  *
- * \param path The trace path.
- * \param oldRate Old rate.
- * \param newRate Actual rate.
- * \param dest Destination of the transmission.
+ * @param path The trace path.
+ * @param oldRate Old rate.
+ * @param newRate Actual rate.
+ * @param dest Destination of the transmission.
  */
 void
 RateCallback(std::string path, DataRate oldRate, DataRate newRate, Mac48Address dest)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/wireless/wifi-power-adaptation-interference.cc ns-3.44/examples/wireless/wifi-power-adaptation-interference.cc
--- ns-3.43/examples/wireless/wifi-power-adaptation-interference.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/wireless/wifi-power-adaptation-interference.cc	2025-03-09 16:55:49.339371000 -0700
@@ -41,7 +41,7 @@
  * To enable the log of rate and power changes:
  * \code{.sh}
  *   export NS_LOG=PowerAdaptationInterference=level_info
- * \endcode
+ * @endcode
  */
 
 #include "ns3/command-line.h"
@@ -72,111 +72,111 @@
 static const uint32_t packetSize = 1420;
 
 /**
- * \brief Class to collect node statistics.
+ * @brief Class to collect node statistics.
  */
 class NodeStatistics
 {
   public:
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      *
-     * \param aps Access points
-     * \param stas WiFi Stations.
+     * @param aps Access points
+     * @param stas WiFi Stations.
      */
     NodeStatistics(NetDeviceContainer aps, NetDeviceContainer stas);
 
     /**
-     * \brief Collects the statistics at a given time.
+     * @brief Collects the statistics at a given time.
      *
-     * \param time Time at which the statistics are collected.
+     * @param time Time at which the statistics are collected.
      */
     void CheckStatistics(double time);
 
     /**
-     * \brief Callback called by WifiNetDevice/Phy/PhyTxBegin.
+     * @brief Callback called by WifiNetDevice/Phy/PhyTxBegin.
      *
-     * \param path The trace path.
-     * \param packet The sent packet.
-     * \param powerW The Tx power.
+     * @param path The trace path.
+     * @param packet The sent packet.
+     * @param powerW The Tx power.
      */
     void PhyCallback(std::string path, Ptr<const Packet> packet, double powerW);
     /**
-     * \brief Callback called by PacketSink/Rx.
+     * @brief Callback called by PacketSink/Rx.
      *
-     * \param path The trace path.
-     * \param packet The received packet.
-     * \param from The sender address.
+     * @param path The trace path.
+     * @param packet The received packet.
+     * @param from The sender address.
      */
     void RxCallback(std::string path, Ptr<const Packet> packet, const Address& from);
     /**
-     * \brief Callback called by WifiNetDevice/RemoteStationManager/x/PowerChange.
+     * @brief Callback called by WifiNetDevice/RemoteStationManager/x/PowerChange.
      *
-     * \param path The trace path.
-     * \param oldPower Old Tx power.
-     * \param newPower Actual Tx power.
-     * \param dest Destination of the transmission.
+     * @param path The trace path.
+     * @param oldPower Old Tx power.
+     * @param newPower Actual Tx power.
+     * @param dest Destination of the transmission.
      */
     void PowerCallback(std::string path, double oldPower, double newPower, Mac48Address dest);
     /**
-     * \brief Callback called by WifiNetDevice/RemoteStationManager/x/RateChange.
+     * @brief Callback called by WifiNetDevice/RemoteStationManager/x/RateChange.
      *
-     * \param path The trace path.
-     * \param oldRate Old rate.
-     * \param newRate Actual rate.
-     * \param dest Destination of the transmission.
+     * @param path The trace path.
+     * @param oldRate Old rate.
+     * @param newRate Actual rate.
+     * @param dest Destination of the transmission.
      */
     void RateCallback(std::string path, DataRate oldRate, DataRate newRate, Mac48Address dest);
     /**
-     * \brief Callback called by YansWifiPhy/State/State.
+     * @brief Callback called by YansWifiPhy/State/State.
      *
-     * \param path The trace path.
-     * \param init Time when the state started.
-     * \param duration Amount of time we've been in (or will be in) the state.
-     * \param state The state.
+     * @param path The trace path.
+     * @param init Time when the state started.
+     * @param duration Amount of time we've been in (or will be in) the state.
+     * @param state The state.
      */
     void StateCallback(std::string path, Time init, Time duration, WifiPhyState state);
 
     /**
-     * \brief Get the Throughput output data
+     * @brief Get the Throughput output data
      *
-     * \return the Throughput output data.
+     * @return the Throughput output data.
      */
     Gnuplot2dDataset GetDatafile();
     /**
-     * \brief Get the Power output data.
+     * @brief Get the Power output data.
      *
-     * \return the Power output data.
+     * @return the Power output data.
      */
     Gnuplot2dDataset GetPowerDatafile();
     /**
-     * \brief Get the IDLE state output data.
+     * @brief Get the IDLE state output data.
      *
-     * \return the IDLE state output data.
+     * @return the IDLE state output data.
      */
     Gnuplot2dDataset GetIdleDatafile();
     /**
-     * \brief Get the BUSY state output data.
+     * @brief Get the BUSY state output data.
      *
-     * \return the BUSY state output data.
+     * @return the BUSY state output data.
      */
     Gnuplot2dDataset GetBusyDatafile();
     /**
-     * \brief Get the TX state output data.
+     * @brief Get the TX state output data.
      *
-     * \return the TX state output data.
+     * @return the TX state output data.
      */
     Gnuplot2dDataset GetTxDatafile();
     /**
-     * \brief Get the RX state output data.
+     * @brief Get the RX state output data.
      *
-     * \return the RX state output data.
+     * @return the RX state output data.
      */
     Gnuplot2dDataset GetRxDatafile();
 
     /**
-     * \brief Get the Busy time.
+     * @brief Get the Busy time.
      *
-     * \return the busy time.
+     * @return the busy time.
      */
     double GetBusyTime() const;
 
@@ -184,16 +184,16 @@
     /// Time, DataRate pair vector.
     typedef std::vector<std::pair<Time, DataRate>> TxTime;
     /**
-     * \brief Setup the WifiPhy object.
+     * @brief Setup the WifiPhy object.
      *
-     * \param phy The WifiPhy to setup.
+     * @param phy The WifiPhy to setup.
      */
     void SetupPhy(Ptr<WifiPhy> phy);
     /**
-     * \brief Get the time at which a given datarate has been recorded.
+     * @brief Get the time at which a given datarate has been recorded.
      *
-     * \param rate The datarate to search.
-     * \return the time.
+     * @param rate The datarate to search.
+     * @return the time.
      */
     Time GetCalcTxTime(DataRate rate);
 
@@ -264,7 +264,7 @@
         txVector.SetPreambleType(WIFI_PREAMBLE_LONG);
         txVector.SetChannelWidth(phy->GetChannelWidth());
         DataRate dataRate(mode.GetDataRate(phy->GetChannelWidth()));
-        Time time = phy->CalculateTxDuration(packetSize, txVector, phy->GetPhyBand());
+        Time time = WifiPhy::CalculateTxDuration(packetSize, txVector, phy->GetPhyBand());
         NS_LOG_DEBUG(mode.GetUniqueName() << " " << time.GetSeconds() << " " << dataRate);
         m_timeTable.emplace_back(time, dataRate);
     }
@@ -281,7 +281,7 @@
         }
     }
     NS_ASSERT(false);
-    return Seconds(0);
+    return Time(0);
 }
 
 void
@@ -293,16 +293,16 @@
 
     if (head.GetType() == WIFI_MAC_DATA)
     {
-        m_totalEnergy += pow(10.0, m_currentPower[dest] / 10.0) *
-                         GetCalcTxTime(m_currentRate[dest]).GetSeconds();
-        m_totalTime += GetCalcTxTime(m_currentRate[dest]).GetSeconds();
+        const auto txTimeSeconds = GetCalcTxTime(m_currentRate[dest]).GetSeconds();
+        m_totalEnergy += DbmToW(m_currentPower[dest]) * txTimeSeconds;
+        m_totalTime += txTimeSeconds;
     }
 }
 
 void
 NodeStatistics::PowerCallback(std::string path, double oldPower, double newPower, Mac48Address dest)
 {
-    m_currentPower[dest] = newPower;
+    m_currentPower[dest] = dBm_u{newPower};
 }
 
 void
@@ -413,10 +413,10 @@
 /**
  * Callback called by WifiNetDevice/RemoteStationManager/x/PowerChange.
  *
- * \param path The trace path.
- * \param oldPower Old Tx power.
- * \param newPower Actual Tx power.
- * \param dest Destination of the transmission.
+ * @param path The trace path.
+ * @param oldPower Old Tx power.
+ * @param newPower Actual Tx power.
+ * @param dest Destination of the transmission.
  */
 void
 PowerCallback(std::string path, double oldPower, double newPower, Mac48Address dest)
@@ -426,12 +426,12 @@
 }
 
 /**
- * \brief Callback called by WifiNetDevice/RemoteStationManager/x/RateChange.
+ * @brief Callback called by WifiNetDevice/RemoteStationManager/x/RateChange.
  *
- * \param path The trace path.
- * \param oldRate Old rate.
- * \param newRate Actual rate.
- * \param dest Destination of the transmission.
+ * @param path The trace path.
+ * @param oldRate Old rate.
+ * @param newRate Actual rate.
+ * @param dest Destination of the transmission.
  */
 void
 RateCallback(std::string path, DataRate oldRate, DataRate newRate, Mac48Address dest)
@@ -578,8 +578,8 @@
 
     OnOffHelper onoff("ns3::UdpSocketFactory", InetSocketAddress(sinkAddress, port));
     onoff.SetConstantRate(DataRate("54Mb/s"), packetSize);
-    onoff.SetAttribute("StartTime", TimeValue(Seconds(0.0)));
-    onoff.SetAttribute("StopTime", TimeValue(Seconds(100.0)));
+    onoff.SetAttribute("StartTime", TimeValue(Seconds(0)));
+    onoff.SetAttribute("StopTime", TimeValue(Seconds(100)));
     ApplicationContainer apps_source = onoff.Install(wifiApNodes.Get(0));
 
     PacketSinkHelper sink1("ns3::UdpSocketFactory", InetSocketAddress(sinkAddress1, port));
@@ -587,8 +587,8 @@
 
     OnOffHelper onoff1("ns3::UdpSocketFactory", InetSocketAddress(sinkAddress1, port));
     onoff1.SetConstantRate(DataRate("54Mb/s"), packetSize);
-    onoff1.SetAttribute("StartTime", TimeValue(Seconds(0.0)));
-    onoff1.SetAttribute("StopTime", TimeValue(Seconds(100.0)));
+    onoff1.SetAttribute("StartTime", TimeValue(Seconds(0)));
+    onoff1.SetAttribute("StopTime", TimeValue(Seconds(100)));
     apps_source.Add(onoff1.Install(wifiApNodes.Get(1)));
 
     apps_sink.Start(Seconds(0.5));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/wireless/wifi-rate-adaptation-distance.cc ns-3.44/examples/wireless/wifi-rate-adaptation-distance.cc
--- ns-3.43/examples/wireless/wifi-rate-adaptation-distance.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/wireless/wifi-rate-adaptation-distance.cc	2025-03-09 16:55:49.339371000 -0700
@@ -70,39 +70,39 @@
   public:
     /**
      * Constructor
-     * \param aps AP devices
-     * \param stas STA devices
+     * @param aps AP devices
+     * @param stas STA devices
      */
     NodeStatistics(NetDeviceContainer aps, NetDeviceContainer stas);
 
     /**
      * RX callback
-     * \param path path
-     * \param packet received packet
-     * \param from sender
+     * @param path path
+     * @param packet received packet
+     * @param from sender
      */
     void RxCallback(std::string path, Ptr<const Packet> packet, const Address& from);
     /**
      * Set node position
-     * \param node the node
-     * \param position the position
+     * @param node the node
+     * @param position the position
      */
     void SetPosition(Ptr<Node> node, Vector position);
     /**
      * Advance node position
-     * \param node the node
-     * \param stepsSize the size of a step
-     * \param stepsTime the time interval between steps
+     * @param node the node
+     * @param stepsSize the size of a step
+     * @param stepsTime the time interval between steps
      */
     void AdvancePosition(Ptr<Node> node, int stepsSize, int stepsTime);
     /**
      * Get node position
-     * \param node the node
-     * \return the position
+     * @param node the node
+     * @return the position
      */
     Vector GetPosition(Ptr<Node> node);
     /**
-     * \return the gnuplot 2d dataset
+     * @return the gnuplot 2d dataset
      */
     Gnuplot2dDataset GetDatafile();
 
@@ -162,8 +162,8 @@
 /**
  * Callback for 'Rate' trace source
  *
- * \param oldRate old MCS rate (bits/sec)
- * \param newRate new MCS rate (bits/sec)
+ * @param oldRate old MCS rate (bits/sec)
+ * @param newRate new MCS rate (bits/sec)
  */
 void
 RateCallback(uint64_t oldRate, uint64_t newRate)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/wireless/wifi-simple-adhoc.cc ns-3.44/examples/wireless/wifi-simple-adhoc.cc
--- ns-3.43/examples/wireless/wifi-simple-adhoc.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/wireless/wifi-simple-adhoc.cc	2025-03-09 16:55:49.339371000 -0700
@@ -57,7 +57,7 @@
 /**
  * Function called when a packet is received.
  *
- * \param socket The receiving socket.
+ * @param socket The receiving socket.
  */
 void
 ReceivePacket(Ptr<Socket> socket)
@@ -71,10 +71,10 @@
 /**
  * Generate traffic.
  *
- * \param socket The sending socket.
- * \param pktSize The packet size.
- * \param pktCount The packet count.
- * \param pktInterval The interval between two packets.
+ * @param socket The sending socket.
+ * @param pktSize The packet size.
+ * @param pktCount The packet count.
+ * @param pktInterval The interval between two packets.
  */
 static void
 GenerateTraffic(Ptr<Socket> socket, uint32_t pktSize, uint32_t pktCount, Time pktInterval)
@@ -189,7 +189,7 @@
     NS_LOG_UNCOND("Testing " << numPackets << " packets sent with receiver rss " << rss);
 
     Simulator::ScheduleWithContext(source->GetNode()->GetId(),
-                                   Seconds(1.0),
+                                   Seconds(1),
                                    &GenerateTraffic,
                                    source,
                                    packetSize,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/wireless/wifi-simple-adhoc-grid.cc ns-3.44/examples/wireless/wifi-simple-adhoc-grid.cc
--- ns-3.43/examples/wireless/wifi-simple-adhoc-grid.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/wireless/wifi-simple-adhoc-grid.cc	2025-03-09 16:55:49.339371000 -0700
@@ -97,7 +97,7 @@
 /**
  * Function called when a packet is received.
  *
- * \param socket The receiving socket.
+ * @param socket The receiving socket.
  */
 void
 ReceivePacket(Ptr<Socket> socket)
@@ -111,10 +111,10 @@
 /**
  * Generate traffic.
  *
- * \param socket The sending socket.
- * \param pktSize The packet size.
- * \param pktCount The packet count.
- * \param pktInterval The interval between two packets.
+ * @param socket The sending socket.
+ * @param pktSize The packet size.
+ * @param pktCount The packet count.
+ * @param pktInterval The interval between two packets.
  */
 static void
 GenerateTraffic(Ptr<Socket> socket, uint32_t pktSize, uint32_t pktCount, Time pktInterval)
@@ -259,7 +259,7 @@
     }
 
     // Give OLSR time to converge-- 30 seconds perhaps
-    Simulator::Schedule(Seconds(30.0),
+    Simulator::Schedule(Seconds(30),
                         &GenerateTraffic,
                         source,
                         packetSize,
@@ -270,7 +270,7 @@
     NS_LOG_UNCOND("Testing from node " << sourceNode << " to " << sinkNode << " with grid distance "
                                        << distance);
 
-    Simulator::Stop(Seconds(33.0));
+    Simulator::Stop(Seconds(33));
     Simulator::Run();
     Simulator::Destroy();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/wireless/wifi-simple-ht-hidden-stations.cc ns-3.44/examples/wireless/wifi-simple-ht-hidden-stations.cc
--- ns-3.43/examples/wireless/wifi-simple-ht-hidden-stations.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/wireless/wifi-simple-ht-hidden-stations.cc	2025-03-09 16:55:49.339371000 -0700
@@ -166,8 +166,8 @@
     uint16_t port = 9;
     UdpServerHelper server(port);
     ApplicationContainer serverApp = server.Install(wifiApNode);
-    serverApp.Start(Seconds(0.0));
-    serverApp.Stop(simulationTime + Seconds(1.0));
+    serverApp.Start(Seconds(0));
+    serverApp.Stop(simulationTime + Seconds(1));
     streamNumber += server.AssignStreams(wifiApNode, streamNumber);
 
     UdpClientHelper client(ApInterface.GetAddress(0), port);
@@ -177,8 +177,8 @@
 
     // Saturated UDP traffic from stations to AP
     ApplicationContainer clientApp1 = client.Install(wifiStaNodes);
-    clientApp1.Start(Seconds(1.0));
-    clientApp1.Stop(simulationTime + Seconds(1.0));
+    clientApp1.Start(Seconds(1));
+    clientApp1.Stop(simulationTime + Seconds(1));
     streamNumber += client.AssignStreams(wifiStaNodes, streamNumber);
 
     phy.EnablePcap("SimpleHtHiddenStations_Ap", apDevice.Get(0));
@@ -188,7 +188,7 @@
     AsciiTraceHelper ascii;
     phy.EnableAsciiAll(ascii.CreateFileStream("SimpleHtHiddenStations.tr"));
 
-    Simulator::Stop(simulationTime + Seconds(1.0));
+    Simulator::Stop(simulationTime + Seconds(1));
 
     Simulator::Run();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/wireless/wifi-simple-infra.cc ns-3.44/examples/wireless/wifi-simple-infra.cc
--- ns-3.43/examples/wireless/wifi-simple-infra.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/wireless/wifi-simple-infra.cc	2025-03-09 16:55:49.339371000 -0700
@@ -89,7 +89,7 @@
 /**
  * Function called when a packet is received.
  *
- * \param socket The receiving socket.
+ * @param socket The receiving socket.
  */
 void
 ReceivePacket(Ptr<Socket> socket)
@@ -103,10 +103,10 @@
 /**
  * Generate traffic.
  *
- * \param socket The sending socket.
- * \param pktSize The packet size.
- * \param pktCount The packet count.
- * \param pktInterval The interval between two packets.
+ * @param socket The sending socket.
+ * @param pktSize The packet size.
+ * @param pktCount The packet count.
+ * @param pktInterval The interval between two packets.
  */
 static void
 GenerateTraffic(Ptr<Socket> socket, uint32_t pktSize, uint32_t pktCount, Time pktInterval)
@@ -229,14 +229,14 @@
     std::cout << "Testing " << numPackets << " packets sent with receiver rss " << rss << std::endl;
 
     Simulator::ScheduleWithContext(source->GetNode()->GetId(),
-                                   Seconds(1.0),
+                                   Seconds(1),
                                    &GenerateTraffic,
                                    source,
                                    packetSize,
                                    numPackets,
                                    interval);
 
-    Simulator::Stop(Seconds(30.0));
+    Simulator::Stop(Seconds(30));
     Simulator::Run();
     Simulator::Destroy();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/wireless/wifi-simple-interference.cc ns-3.44/examples/wireless/wifi-simple-interference.cc
--- ns-3.43/examples/wireless/wifi-simple-interference.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/wireless/wifi-simple-interference.cc	2025-03-09 16:55:49.339371000 -0700
@@ -87,8 +87,8 @@
 /**
  * Print a packer that has been received.
  *
- * \param socket The receiving socket.
- * \return a string with the packet details.
+ * @param socket The receiving socket.
+ * @return a string with the packet details.
  */
 static inline std::string
 PrintReceivedPacket(Ptr<Socket> socket)
@@ -111,7 +111,7 @@
 /**
  * Function called when a packet is received.
  *
- * \param socket The receiving socket.
+ * @param socket The receiving socket.
  */
 static void
 ReceivePacket(Ptr<Socket> socket)
@@ -122,10 +122,10 @@
 /**
  * Generate traffic
  *
- * \param socket The seding socket.
- * \param pktSize The packet size.
- * \param pktCount The packet counter.
- * \param pktInterval The interval between two packets.
+ * @param socket The sending socket.
+ * @param pktSize The packet size.
+ * @param pktCount The packet counter.
+ * @param pktInterval The interval between two packets.
  */
 static void
 GenerateTraffic(Ptr<Socket> socket, uint32_t pktSize, uint32_t pktCount, Time pktInterval)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/wireless/wifi-sleep.cc ns-3.44/examples/wireless/wifi-sleep.cc
--- ns-3.43/examples/wireless/wifi-sleep.cc	2024-10-09 16:41:09.840655800 -0700
+++ ns-3.44/examples/wireless/wifi-sleep.cc	2025-03-09 16:55:49.339371000 -0700
@@ -58,9 +58,9 @@
 /**
  * Remaining energy trace sink
  *
- * \tparam node The node ID this trace belongs to.
- * \param oldValue Old value.
- * \param newValue New value.
+ * @tparam node The node ID this trace belongs to.
+ * @param oldValue Old value.
+ * @param newValue New value.
  */
 template <int node>
 void
@@ -77,11 +77,11 @@
 /**
  * PHY state trace sink
  *
- * \tparam node The node ID this trace belongs to.
- * \param context The context
- * \param start Start time for the current state
- * \param duration Duratio of the current state
- * \param state State
+ * @tparam node The node ID this trace belongs to.
+ * @param context The context
+ * @param start Start time for the current state
+ * @param duration Duratio of the current state
+ * @param state State
  */
 template <int node>
 void
@@ -245,7 +245,7 @@
     Config::Connect("/NodeList/0/DeviceList/*/Phy/State/State", MakeCallback(&PhyStateTrace<0>));
     Config::Connect("/NodeList/1/DeviceList/*/Phy/State/State", MakeCallback(&PhyStateTrace<1>));
 
-    Simulator::Stop(duration + Seconds(1.0));
+    Simulator::Stop(duration + Seconds(1));
 
     Simulator::Run();
     Simulator::Destroy();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/wireless/wifi-spectrum-per-example.cc ns-3.44/examples/wireless/wifi-spectrum-per-example.cc
--- ns-3.43/examples/wireless/wifi-spectrum-per-example.cc	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/examples/wireless/wifi-spectrum-per-example.cc	2025-03-09 16:55:49.339371000 -0700
@@ -91,12 +91,12 @@
 /**
  * Monitor sniffer Rx trace
  *
- * \param packet The sensed packet.
- * \param channelFreqMhz The channel frequency [MHz].
- * \param txVector The Tx vector.
- * \param aMpdu The aMPDU.
- * \param signalNoise The signal and noise dBm.
- * \param staId The STA ID.
+ * @param packet The sensed packet.
+ * @param channelFreqMhz The channel frequency [MHz].
+ * @param txVector The Tx vector.
+ * @param aMpdu The aMPDU.
+ * @param signalNoise The signal and noise dBm.
+ * @param staId The STA ID.
  */
 void
 MonitorSniffRx(Ptr<const Packet> packet,
@@ -443,8 +443,8 @@
             uint16_t port = 9;
             UdpServerHelper server(port);
             serverApp = server.Install(wifiStaNode.Get(0));
-            serverApp.Start(Seconds(0.0));
-            serverApp.Stop(simulationTime + Seconds(1.0));
+            serverApp.Start(Seconds(0));
+            serverApp.Stop(simulationTime + Seconds(1));
             const auto packetInterval = payloadSize * 8.0 / (datarate * 1e6);
 
             UdpClientHelper client(staNodeInterface.GetAddress(0), port);
@@ -452,8 +452,8 @@
             client.SetAttribute("Interval", TimeValue(Seconds(packetInterval)));
             client.SetAttribute("PacketSize", UintegerValue(payloadSize));
             ApplicationContainer clientApp = client.Install(wifiApNode.Get(0));
-            clientApp.Start(Seconds(1.0));
-            clientApp.Stop(simulationTime + Seconds(1.0));
+            clientApp.Start(Seconds(1));
+            clientApp.Stop(simulationTime + Seconds(1));
         }
         else
         {
@@ -462,8 +462,8 @@
             Address localAddress(InetSocketAddress(Ipv4Address::GetAny(), port));
             PacketSinkHelper packetSinkHelper("ns3::TcpSocketFactory", localAddress);
             serverApp = packetSinkHelper.Install(wifiStaNode.Get(0));
-            serverApp.Start(Seconds(0.0));
-            serverApp.Stop(simulationTime + Seconds(1.0));
+            serverApp.Start(Seconds(0));
+            serverApp.Stop(simulationTime + Seconds(1));
 
             OnOffHelper onoff("ns3::TcpSocketFactory", Ipv4Address::GetAny());
             onoff.SetAttribute("OnTime", StringValue("ns3::ConstantRandomVariable[Constant=1]"));
@@ -473,8 +473,8 @@
             AddressValue remoteAddress(InetSocketAddress(staNodeInterface.GetAddress(0), port));
             onoff.SetAttribute("Remote", remoteAddress);
             ApplicationContainer clientApp = onoff.Install(wifiApNode.Get(0));
-            clientApp.Start(Seconds(1.0));
-            clientApp.Stop(simulationTime + Seconds(1.0));
+            clientApp.Start(Seconds(1));
+            clientApp.Stop(simulationTime + Seconds(1));
         }
 
         Config::ConnectWithoutContext("/NodeList/0/DeviceList/*/Phy/MonitorSnifferRx",
@@ -495,7 +495,7 @@
         g_noiseDbmAvg = 0;
         g_samples = 0;
 
-        Simulator::Stop(simulationTime + Seconds(1.0));
+        Simulator::Stop(simulationTime + Seconds(1));
         Simulator::Run();
 
         auto throughput = 0.0;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/wireless/wifi-spectrum-per-interference.cc ns-3.44/examples/wireless/wifi-spectrum-per-interference.cc
--- ns-3.43/examples/wireless/wifi-spectrum-per-interference.cc	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/examples/wireless/wifi-spectrum-per-interference.cc	2025-03-09 16:55:49.339371000 -0700
@@ -97,12 +97,12 @@
 /**
  * Monitor sniffer Rx trace
  *
- * \param packet The sensed packet.
- * \param channelFreqMhz The channel frequency [MHz].
- * \param txVector The Tx vector.
- * \param aMpdu The aMPDU.
- * \param signalNoise The signal and noise dBm.
- * \param staId The STA ID.
+ * @param packet The sensed packet.
+ * @param channelFreqMhz The channel frequency [MHz].
+ * @param txVector The Tx vector.
+ * @param aMpdu The aMPDU.
+ * @param signalNoise The signal and noise dBm.
+ * @param staId The STA ID.
  */
 void
 MonitorSniffRx(Ptr<const Packet> packet,
@@ -498,8 +498,8 @@
             uint16_t port = 9;
             UdpServerHelper server(port);
             serverApp = server.Install(wifiStaNode.Get(0));
-            serverApp.Start(Seconds(0.0));
-            serverApp.Stop(simulationTime + Seconds(1.0));
+            serverApp.Start(Seconds(0));
+            serverApp.Stop(simulationTime + Seconds(1));
             const auto packetInterval = payloadSize * 8.0 / (datarate * 1e6);
 
             UdpClientHelper client(staNodeInterface.GetAddress(0), port);
@@ -507,8 +507,8 @@
             client.SetAttribute("Interval", TimeValue(Seconds(packetInterval)));
             client.SetAttribute("PacketSize", UintegerValue(payloadSize));
             ApplicationContainer clientApp = client.Install(wifiApNode.Get(0));
-            clientApp.Start(Seconds(1.0));
-            clientApp.Stop(simulationTime + Seconds(1.0));
+            clientApp.Start(Seconds(1));
+            clientApp.Stop(simulationTime + Seconds(1));
         }
         else
         {
@@ -517,8 +517,8 @@
             Address localAddress(InetSocketAddress(Ipv4Address::GetAny(), port));
             PacketSinkHelper packetSinkHelper("ns3::TcpSocketFactory", localAddress);
             serverApp = packetSinkHelper.Install(wifiStaNode.Get(0));
-            serverApp.Start(Seconds(0.0));
-            serverApp.Stop(simulationTime + Seconds(1.0));
+            serverApp.Start(Seconds(0));
+            serverApp.Stop(simulationTime + Seconds(1));
 
             OnOffHelper onoff("ns3::TcpSocketFactory", Ipv4Address::GetAny());
             onoff.SetAttribute("OnTime", StringValue("ns3::ConstantRandomVariable[Constant=1]"));
@@ -528,8 +528,8 @@
             AddressValue remoteAddress(InetSocketAddress(staNodeInterface.GetAddress(0), port));
             onoff.SetAttribute("Remote", remoteAddress);
             ApplicationContainer clientApp = onoff.Install(wifiApNode.Get(0));
-            clientApp.Start(Seconds(1.0));
-            clientApp.Stop(simulationTime + Seconds(1.0));
+            clientApp.Start(Seconds(1));
+            clientApp.Stop(simulationTime + Seconds(1));
         }
 
         // Configure waveform generator
@@ -578,22 +578,22 @@
         Ptr<WifiPhy> wifiPhyPtr = staDevicePtr->GetObject<WifiNetDevice>()->GetPhy();
         if (i <= 15)
         {
-            NS_ABORT_MSG_IF(wifiPhyPtr->GetChannelWidth() != 20,
+            NS_ABORT_MSG_IF(wifiPhyPtr->GetChannelWidth() != MHz_u{20},
                             "Error: Channel width must be 20 MHz if MCS index <= 15");
             NS_ABORT_MSG_IF(
-                wifiPhyPtr->GetFrequency() != 5180,
+                wifiPhyPtr->GetFrequency() != MHz_u{5180},
                 "Error:  Wi-Fi nodes must be tuned to 5180 MHz to match the waveform generator");
         }
         else
         {
-            NS_ABORT_MSG_IF(wifiPhyPtr->GetChannelWidth() != 40,
+            NS_ABORT_MSG_IF(wifiPhyPtr->GetChannelWidth() != MHz_u{40},
                             "Error: Channel width must be 40 MHz if MCS index > 15");
             NS_ABORT_MSG_IF(
-                wifiPhyPtr->GetFrequency() != 5190,
+                wifiPhyPtr->GetFrequency() != MHz_u{5190},
                 "Error:  Wi-Fi nodes must be tuned to 5190 MHz to match the waveform generator");
         }
 
-        Simulator::Stop(simulationTime + Seconds(1.0));
+        Simulator::Stop(simulationTime + Seconds(1));
         Simulator::Run();
 
         auto throughput = 0.0;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/wireless/wifi-spectrum-saturation-example.cc ns-3.44/examples/wireless/wifi-spectrum-saturation-example.cc
--- ns-3.43/examples/wireless/wifi-spectrum-saturation-example.cc	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/examples/wireless/wifi-spectrum-saturation-example.cc	2025-03-09 16:55:49.339371000 -0700
@@ -577,8 +577,8 @@
         uint16_t port = 9;
         UdpServerHelper server(port);
         ApplicationContainer serverApp = server.Install(wifiStaNode.Get(0));
-        serverApp.Start(Seconds(0.0));
-        serverApp.Stop(simulationTime + Seconds(1.0));
+        serverApp.Start(Seconds(0));
+        serverApp.Stop(simulationTime + Seconds(1));
         const auto packetInterval = payloadSize * 8.0 / (datarate * 1e6);
 
         UdpClientHelper client(staNodeInterface.GetAddress(0), port);
@@ -586,8 +586,8 @@
         client.SetAttribute("Interval", TimeValue(Seconds(packetInterval)));
         client.SetAttribute("PacketSize", UintegerValue(payloadSize));
         ApplicationContainer clientApp = client.Install(wifiApNode.Get(0));
-        clientApp.Start(Seconds(1.0));
-        clientApp.Stop(simulationTime + Seconds(1.0));
+        clientApp.Start(Seconds(1));
+        clientApp.Stop(simulationTime + Seconds(1));
 
         if (enablePcap)
         {
@@ -600,7 +600,7 @@
             phy.EnablePcap(ss.str(), apDevice);
         }
 
-        Simulator::Stop(simulationTime + Seconds(1.0));
+        Simulator::Stop(simulationTime + Seconds(1));
         Simulator::Run();
 
         double totalPacketsThrough = DynamicCast<UdpServer>(serverApp.Get(0))->GetReceived();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/wireless/wifi-tcp.cc ns-3.44/examples/wireless/wifi-tcp.cc
--- ns-3.43/examples/wireless/wifi-tcp.cc	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/examples/wireless/wifi-tcp.cc	2025-03-09 16:55:49.339371000 -0700
@@ -170,8 +170,8 @@
     ApplicationContainer serverApp = server.Install(staWifiNode);
 
     /* Start Applications */
-    sinkApp.Start(Seconds(0.0));
-    serverApp.Start(Seconds(1.0));
+    sinkApp.Start(Seconds(0));
+    serverApp.Start(Seconds(1));
     Simulator::Schedule(Seconds(1.1), &CalculateThroughput);
 
     /* Enable Traces */
@@ -183,7 +183,7 @@
     }
 
     /* Start Simulation */
-    Simulator::Stop(simulationTime + Seconds(1.0));
+    Simulator::Stop(simulationTime + Seconds(1));
     Simulator::Run();
 
     auto averageThroughput =
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/wireless/wifi-timing-attributes.cc ns-3.44/examples/wireless/wifi-timing-attributes.cc
--- ns-3.43/examples/wireless/wifi-timing-attributes.cc	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/examples/wireless/wifi-timing-attributes.cc	2025-03-09 16:55:49.339371000 -0700
@@ -131,8 +131,8 @@
     uint16_t port = 9;
     UdpServerHelper server(port);
     ApplicationContainer serverApp = server.Install(wifiStaNode.Get(0));
-    serverApp.Start(Seconds(0.0));
-    serverApp.Stop(simulationTime + Seconds(1.0));
+    serverApp.Start(Seconds(0));
+    serverApp.Stop(simulationTime + Seconds(1));
 
     UdpClientHelper client(staNodeInterface.GetAddress(0), port);
     client.SetAttribute("MaxPackets", UintegerValue(4294967295U));
@@ -140,14 +140,14 @@
     client.SetAttribute("PacketSize", UintegerValue(1472));     // bytes
 
     ApplicationContainer clientApp = client.Install(wifiApNode.Get(0));
-    clientApp.Start(Seconds(1.0));
-    clientApp.Stop(simulationTime + Seconds(1.0));
+    clientApp.Start(Seconds(1));
+    clientApp.Stop(simulationTime + Seconds(1));
 
     // Populate routing table
     Ipv4GlobalRoutingHelper::PopulateRoutingTables();
 
     // Set simulation time and launch simulation
-    Simulator::Stop(simulationTime + Seconds(1.0));
+    Simulator::Stop(simulationTime + Seconds(1));
     Simulator::Run();
 
     // Get and print results
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/wireless/wifi-txop-aggregation.cc ns-3.44/examples/wireless/wifi-txop-aggregation.cc
--- ns-3.43/examples/wireless/wifi-txop-aggregation.cc	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/examples/wireless/wifi-txop-aggregation.cc	2025-03-09 16:55:49.339371000 -0700
@@ -77,12 +77,12 @@
     /**
      * Callback connected to TXOP duration trace source.
      *
-     * \param startTime TXOP start time
-     * \param duration TXOP duration
-     * \param linkId the ID of the link
+     * @param startTime TXOP start time
+     * @param duration TXOP duration
+     * @param linkId the ID of the link
      */
     void Trace(Time startTime, Time duration, uint8_t linkId);
-    Time m_max{Seconds(0)}; //!< maximum TXOP duration
+    Time m_max; //!< maximum TXOP duration
 };
 
 void
@@ -339,8 +339,8 @@
     uint16_t port = 9;
     UdpServerHelper serverA(port);
     ApplicationContainer serverAppA = serverA.Install(wifiStaNodes.Get(0));
-    serverAppA.Start(Seconds(0.0));
-    serverAppA.Stop(simulationTime + Seconds(1.0));
+    serverAppA.Start(Seconds(0));
+    serverAppA.Stop(simulationTime + Seconds(1));
 
     UdpClientHelper clientA(StaInterfaceA.GetAddress(0), port);
     clientA.SetAttribute("MaxPackets", UintegerValue(4294967295U));
@@ -348,13 +348,13 @@
     clientA.SetAttribute("PacketSize", UintegerValue(payloadSize));
 
     ApplicationContainer clientAppA = clientA.Install(wifiApNodes.Get(0));
-    clientAppA.Start(Seconds(1.0));
-    clientAppA.Stop(simulationTime + Seconds(1.0));
+    clientAppA.Start(Seconds(1));
+    clientAppA.Stop(simulationTime + Seconds(1));
 
     UdpServerHelper serverB(port);
     ApplicationContainer serverAppB = serverB.Install(wifiStaNodes.Get(1));
-    serverAppB.Start(Seconds(0.0));
-    serverAppB.Stop(simulationTime + Seconds(1.0));
+    serverAppB.Start(Seconds(0));
+    serverAppB.Stop(simulationTime + Seconds(1));
 
     UdpClientHelper clientB(StaInterfaceB.GetAddress(0), port);
     clientB.SetAttribute("MaxPackets", UintegerValue(4294967295U));
@@ -362,13 +362,13 @@
     clientB.SetAttribute("PacketSize", UintegerValue(payloadSize));
 
     ApplicationContainer clientAppB = clientB.Install(wifiApNodes.Get(1));
-    clientAppB.Start(Seconds(1.0));
-    clientAppB.Stop(simulationTime + Seconds(1.0));
+    clientAppB.Start(Seconds(1));
+    clientAppB.Stop(simulationTime + Seconds(1));
 
     UdpServerHelper serverC(port);
     ApplicationContainer serverAppC = serverC.Install(wifiStaNodes.Get(2));
-    serverAppC.Start(Seconds(0.0));
-    serverAppC.Stop(simulationTime + Seconds(1.0));
+    serverAppC.Start(Seconds(0));
+    serverAppC.Stop(simulationTime + Seconds(1));
 
     UdpClientHelper clientC(StaInterfaceC.GetAddress(0), port);
     clientC.SetAttribute("MaxPackets", UintegerValue(4294967295U));
@@ -376,13 +376,13 @@
     clientC.SetAttribute("PacketSize", UintegerValue(payloadSize));
 
     ApplicationContainer clientAppC = clientC.Install(wifiApNodes.Get(2));
-    clientAppC.Start(Seconds(1.0));
-    clientAppC.Stop(simulationTime + Seconds(1.0));
+    clientAppC.Start(Seconds(1));
+    clientAppC.Stop(simulationTime + Seconds(1));
 
     UdpServerHelper serverD(port);
     ApplicationContainer serverAppD = serverD.Install(wifiStaNodes.Get(3));
-    serverAppD.Start(Seconds(0.0));
-    serverAppD.Stop(simulationTime + Seconds(1.0));
+    serverAppD.Start(Seconds(0));
+    serverAppD.Stop(simulationTime + Seconds(1));
 
     UdpClientHelper clientD(StaInterfaceD.GetAddress(0), port);
     clientD.SetAttribute("MaxPackets", UintegerValue(4294967295U));
@@ -390,8 +390,8 @@
     clientD.SetAttribute("PacketSize", UintegerValue(payloadSize));
 
     ApplicationContainer clientAppD = clientD.Install(wifiApNodes.Get(3));
-    clientAppD.Start(Seconds(1.0));
-    clientAppD.Stop(simulationTime + Seconds(1.0));
+    clientAppD.Start(Seconds(1));
+    clientAppD.Stop(simulationTime + Seconds(1));
 
     if (enablePcap)
     {
@@ -405,7 +405,7 @@
         phy.EnablePcap("STA_D", staDeviceD.Get(0));
     }
 
-    Simulator::Stop(simulationTime + Seconds(1.0));
+    Simulator::Stop(simulationTime + Seconds(1));
     Simulator::Run();
 
     // Show results
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/wireless/wifi-vht-network.cc ns-3.44/examples/wireless/wifi-vht-network.cc
--- ns-3.43/examples/wireless/wifi-vht-network.cc	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/examples/wireless/wifi-vht-network.cc	2025-03-09 16:55:49.339371000 -0700
@@ -6,6 +6,7 @@
  * Author: Sebastien Deronne <sebastien.deronne@gmail.com>
  */
 
+#include "ns3/attribute-container.h"
 #include "ns3/boolean.h"
 #include "ns3/command-line.h"
 #include "ns3/config.h"
@@ -29,6 +30,9 @@
 #include "ns3/yans-wifi-channel.h"
 #include "ns3/yans-wifi-helper.h"
 
+#include <algorithm>
+#include <vector>
+
 // This is a simple example in order to show how to configure an IEEE 802.11ac Wi-Fi network.
 //
 // It outputs the UDP or TCP goodput for every VHT MCS value, which depends on the MCS value (0 to
@@ -58,8 +62,11 @@
     bool use80Plus80{false};
     Time simulationTime{"10s"};
     meter_u distance{1.0};
-    int mcs{-1}; // -1 indicates an unset value
+    std::string mcsStr;
+    std::vector<uint64_t> mcsValues;
     std::string phyModel{"Yans"};
+    int channelWidth{-1};  // in MHz, -1 indicates an unset value
+    int guardInterval{-1}; // in nanoseconds, -1 indicates an unset value
     double minExpectedThroughput{0.0};
     double maxExpectedThroughput{0.0};
 
@@ -71,11 +78,22 @@
     cmd.AddValue("udp", "UDP if set to 1, TCP otherwise", udp);
     cmd.AddValue("useRts", "Enable/disable RTS/CTS", useRts);
     cmd.AddValue("use80Plus80", "Enable/disable use of 80+80 MHz", use80Plus80);
-    cmd.AddValue("mcs", "if set, limit testing to a specific MCS (0-9)", mcs);
+    cmd.AddValue(
+        "mcs",
+        "list of comma separated MCS values to test; if unset, all MCS values (0-9) are tested",
+        mcsStr);
     cmd.AddValue("phyModel",
                  "PHY model to use (Yans or Spectrum). If 80+80 MHz is enabled, then Spectrum is "
                  "automatically selected",
                  phyModel);
+    cmd.AddValue("channelWidth",
+                 "if set, limit testing to a specific channel width expressed in MHz (20, 40, 80 "
+                 "or 160 MHz)",
+                 channelWidth);
+    cmd.AddValue("guardInterval",
+                 "if set, limit testing to a specific guard interval duration expressed in "
+                 "nanoseconds (800 or 400 ns)",
+                 guardInterval);
     cmd.AddValue("minExpectedThroughput",
                  "if set, simulation fails if the lowest throughput is below this value",
                  minExpectedThroughput);
@@ -108,29 +126,57 @@
               << "short GI"
               << "\t\t"
               << "Throughput" << '\n';
-    int minMcs = 0;
-    int maxMcs = 9;
-    if (mcs >= 0 && mcs <= 9)
+    uint8_t minMcs = 0;
+    uint8_t maxMcs = 9;
+
+    if (mcsStr.empty())
+    {
+        for (uint8_t mcs = minMcs; mcs <= maxMcs; ++mcs)
+        {
+            mcsValues.push_back(mcs);
+        }
+    }
+    else
     {
-        minMcs = mcs;
-        maxMcs = mcs;
+        AttributeContainerValue<UintegerValue, ',', std::vector> attr;
+        auto checker = DynamicCast<AttributeContainerChecker>(MakeAttributeContainerChecker(attr));
+        checker->SetItemChecker(MakeUintegerChecker<uint8_t>());
+        attr.DeserializeFromString(mcsStr, checker);
+        mcsValues = attr.Get();
+        std::sort(mcsValues.begin(), mcsValues.end());
     }
-    for (int mcs = minMcs; mcs <= maxMcs; mcs++)
+
+    int minChannelWidth = 20;
+    int maxChannelWidth = 160;
+    if (channelWidth >= minChannelWidth && channelWidth <= maxChannelWidth)
+    {
+        minChannelWidth = channelWidth;
+        maxChannelWidth = channelWidth;
+    }
+    int minGi = 400;
+    int maxGi = 800;
+    if (guardInterval >= minGi && guardInterval <= maxGi)
+    {
+        minGi = guardInterval;
+        maxGi = guardInterval;
+    }
+
+    for (const auto mcs : mcsValues)
     {
         uint8_t index = 0;
         double previous = 0;
-        for (int channelWidth = 20; channelWidth <= 160;)
+        for (int width = minChannelWidth; width <= maxChannelWidth; width *= 2) // MHz
         {
-            if (mcs == 9 && channelWidth == 20)
+            if (mcs == 9 && width == 20)
             {
-                channelWidth *= 2;
                 continue;
             }
-            const auto is80Plus80 = (use80Plus80 && (channelWidth == 160));
-            const std::string widthStr = is80Plus80 ? "80+80" : std::to_string(channelWidth);
+            const auto is80Plus80 = (use80Plus80 && (width == 160));
+            const std::string widthStr = is80Plus80 ? "80+80" : std::to_string(width);
             const auto segmentWidthStr = is80Plus80 ? "80" : widthStr;
-            for (auto sgi : {false, true})
+            for (int gi = maxGi; gi >= minGi; gi /= 2) // Nanoseconds
             {
+                const auto sgi = (gi == 400);
                 uint32_t payloadSize; // 1500 byte IP packet
                 if (udp)
                 {
@@ -188,7 +234,7 @@
                     phy.SetChannel(spectrumChannel);
 
                     phy.Set("ChannelSettings",
-                            StringValue("{0, " + std::to_string(channelWidth) + ", BAND_5GHZ, 0}"));
+                            StringValue("{0, " + std::to_string(width) + ", BAND_5GHZ, 0}"));
 
                     mac.SetType("ns3::StaWifiMac", "Ssid", SsidValue(ssid));
                     staDevice = wifi.Install(phy, mac, wifiStaNode);
@@ -208,7 +254,7 @@
                     phy.SetChannel(channel.Create());
 
                     phy.Set("ChannelSettings",
-                            StringValue("{0, " + std::to_string(channelWidth) + ", BAND_5GHZ, 0}"));
+                            StringValue("{0, " + std::to_string(width) + ", BAND_5GHZ, 0}"));
 
                     mac.SetType("ns3::StaWifiMac", "Ssid", SsidValue(ssid));
                     staDevice = wifi.Install(phy, mac, wifiStaNode);
@@ -254,8 +300,10 @@
                 apNodeInterface = address.Assign(apDevice);
 
                 /* Setting applications */
-                const auto maxLoad =
-                    VhtPhy::GetDataRate(mcs, channelWidth, NanoSeconds(sgi ? 400 : 800), 1);
+                const auto maxLoad = VhtPhy::GetDataRate(mcs,
+                                                         MHz_u{static_cast<double>(width)},
+                                                         NanoSeconds(sgi ? 400 : 800),
+                                                         1);
                 ApplicationContainer serverApp;
                 if (udp)
                 {
@@ -265,8 +313,8 @@
                     serverApp = server.Install(wifiStaNode.Get(0));
                     streamNumber += server.AssignStreams(wifiStaNode.Get(0), streamNumber);
 
-                    serverApp.Start(Seconds(0.0));
-                    serverApp.Stop(simulationTime + Seconds(1.0));
+                    serverApp.Start(Seconds(0));
+                    serverApp.Stop(simulationTime + Seconds(1));
                     const auto packetInterval = payloadSize * 8.0 / maxLoad;
 
                     UdpClientHelper client(staNodeInterface.GetAddress(0), port);
@@ -276,8 +324,8 @@
                     ApplicationContainer clientApp = client.Install(wifiApNode.Get(0));
                     streamNumber += client.AssignStreams(wifiApNode.Get(0), streamNumber);
 
-                    clientApp.Start(Seconds(1.0));
-                    clientApp.Stop(simulationTime + Seconds(1.0));
+                    clientApp.Start(Seconds(1));
+                    clientApp.Stop(simulationTime + Seconds(1));
                 }
                 else
                 {
@@ -289,8 +337,8 @@
                     streamNumber +=
                         packetSinkHelper.AssignStreams(wifiStaNode.Get(0), streamNumber);
 
-                    serverApp.Start(Seconds(0.0));
-                    serverApp.Stop(simulationTime + Seconds(1.0));
+                    serverApp.Start(Seconds(0));
+                    serverApp.Stop(simulationTime + Seconds(1));
 
                     OnOffHelper onoff("ns3::TcpSocketFactory", Ipv4Address::GetAny());
                     onoff.SetAttribute("OnTime",
@@ -305,13 +353,13 @@
                     ApplicationContainer clientApp = onoff.Install(wifiApNode.Get(0));
                     streamNumber += onoff.AssignStreams(wifiApNode.Get(0), streamNumber);
 
-                    clientApp.Start(Seconds(1.0));
-                    clientApp.Stop(simulationTime + Seconds(1.0));
+                    clientApp.Start(Seconds(1));
+                    clientApp.Stop(simulationTime + Seconds(1));
                 }
 
                 Ipv4GlobalRoutingHelper::PopulateRoutingTables();
 
-                Simulator::Stop(simulationTime + Seconds(1.0));
+                Simulator::Stop(simulationTime + Seconds(1));
                 Simulator::Run();
 
                 auto rxBytes = 0.0;
@@ -332,7 +380,7 @@
                           << "\t\t\t" << throughput << " Mbit/s" << std::endl;
 
                 // test first element
-                if (mcs == minMcs && channelWidth == 20 && !sgi)
+                if (mcs == minMcs && width == 20 && !sgi)
                 {
                     if (throughput < minExpectedThroughput)
                     {
@@ -341,7 +389,7 @@
                     }
                 }
                 // test last element
-                if (mcs == maxMcs && channelWidth == 160 && sgi)
+                if (mcs == maxMcs && width == 160 && sgi)
                 {
                     if (maxExpectedThroughput > 0 && throughput > maxExpectedThroughput)
                     {
@@ -371,7 +419,6 @@
                 }
                 index++;
             }
-            channelWidth *= 2;
         }
     }
     return 0;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/examples/wireless/wifi-wired-bridging.cc ns-3.44/examples/wireless/wifi-wired-bridging.cc
--- ns-3.43/examples/wireless/wifi-wired-bridging.cc	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/examples/wireless/wifi-wired-bridging.cc	2025-03-09 16:55:49.339371000 -0700
@@ -181,7 +181,7 @@
     onoff.SetConstantRate(DataRate("500kb/s"));
     ApplicationContainer apps = onoff.Install(staNodes[0].Get(0));
     apps.Start(Seconds(0.5));
-    apps.Stop(Seconds(3.0));
+    apps.Stop(Seconds(3));
 
     wifiPhy.EnablePcap("wifi-wired-bridging", apDevices[0]);
     wifiPhy.EnablePcap("wifi-wired-bridging", apDevices[1]);
@@ -192,7 +192,7 @@
         MobilityHelper::EnableAsciiAll(ascii.CreateFileStream("wifi-wired-bridging.mob"));
     }
 
-    Simulator::Stop(Seconds(5.0));
+    Simulator::Stop(Seconds(5));
     Simulator::Run();
     Simulator::Destroy();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/LICENSES/BSD-2-Clause.txt ns-3.44/LICENSES/BSD-2-Clause.txt
--- ns-3.43/LICENSES/BSD-2-Clause.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/LICENSES/BSD-2-Clause.txt	2025-03-09 16:55:49.227370500 -0700
@@ -0,0 +1,9 @@
+Copyright (c) <year> <owner>
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/LICENSES/NCSA.txt ns-3.44/LICENSES/NCSA.txt
--- ns-3.43/LICENSES/NCSA.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/LICENSES/NCSA.txt	2025-03-09 16:55:49.227370500 -0700
@@ -0,0 +1,15 @@
+University of Illinois/NCSA Open Source License
+
+Copyright (c) <Year> <Owner Organization Name>. All rights reserved.
+
+Developed by: <Name of Development Group> <Name of Institution> <URL for Development Group/Institution>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal with the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+     * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimers.
+
+     * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimers in the documentation and/or other materials provided with the distribution.
+
+     * Neither the names of <Name of Development Group, Name of Institution>, nor the names of its contributors may be used to endorse or promote products derived from this Software without specific prior written permission.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE SOFTWARE.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/ns3 ns-3.44/ns3
--- ns-3.43/ns3	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/ns3	2025-03-09 16:55:49.339371000 -0700
@@ -9,6 +9,7 @@
 import shutil
 import subprocess
 import sys
+import textwrap
 
 ns3_path = os.path.dirname(os.path.realpath(os.path.abspath(__file__)))
 append_to_ns3_path = functools.partial(os.path.join, ns3_path)
@@ -89,8 +90,11 @@
 
 
 def parse_args(argv):
+    py39args = {"exit_on_error": False}
+    if sys.version_info < (3, 9):
+        py39args = {}
     parser = argparse.ArgumentParser(
-        description="ns-3 wrapper for the CMake build system", add_help=False
+        description="ns-3 wrapper for the CMake build system", add_help=False, **py39args
     )
 
     sub_parser = parser.add_subparsers()
@@ -434,18 +438,28 @@
     parser_show = sub_parser.add_parser(
         "show", help='Try "./ns3 show --help" for more show options'
     )
-    parser_show.add_argument(
-        "show",
-        help=(
-            "Print the current ns-3 build profile type, configuration or version, "
-            "or a list of buildable/runnable targets"
-        ),
-        choices=["profile", "version", "config", "targets", "all"],
-        action="store",
-        type=str,
-        nargs="?",
-        default="all",
-    )
+    parser_show_sub = parser_show.add_subparsers(dest="show")
+
+    # Add subcommands for the "docs" command
+    # Since 'typeid' has a required arg, need to handle these
+    # with subparsers not simple "choices=[...]"
+    show_choices = ["profile", "version", "config", "targets", "typeid", "all"]
+
+    for choice in show_choices:
+        if choice == "typeid":
+            parser_typeid = parser_show_sub.add_parser(
+                "typeid",
+                help="Show the introspected documentation for a TypeId",
+            )
+            parser_typeid.add_argument(
+                "tid",
+                help='Show the introspected documentation for TypeId "tid"',
+                type=str,
+            )
+        else:
+            parser_show_sub.add_parser(choice)
+
+    parser_show.set_defaults(show="all")
 
     add_argument_to_subparsers(
         [
@@ -497,7 +511,17 @@
         runnable_args = []
 
     # Parse known arguments and separate from unknown arguments
-    args, unknown_args = parser.parse_known_args(ns3_args)
+    try:
+        args, unknown_args = parser.parse_known_args(ns3_args)
+    except argparse.ArgumentError as e:
+        error_message = e.message
+        custom_exits = ["invalid choice:"]
+        for custom_exit in custom_exits:
+            if custom_exit in e.message:
+                error_message = f"Exiting due to {e.message[e.message.index(custom_exit):]}"
+        # Format error message to better fit the terminal width
+        print("\n".join(textwrap.wrap(error_message, width=os.get_terminal_size().columns)))
+        exit(1)
 
     # If run doesn't have a target, print the help message of the run parser
     if "run" in args and args.run == "":
@@ -601,6 +625,7 @@
         "ENABLE_SUDO": False,
         "ENABLE_TESTS": False,
         "BUILD_VERSION_STRING": None,
+        "FETCH_NETANIM_VISUALIZER": False,
     }
     if output_directory and os.path.exists(lock_file):
         exec(open(lock_file).read(), globals(), build_info)
@@ -746,7 +771,12 @@
 
     if not current_cmake_generator:
         # Search for available generators
-        cmake_generator_map = {"ninja": "Ninja", "make": "Unix Makefiles", "xcodebuild": "Xcode"}
+        cmake_generator_map = {
+            "msbuild": "Visual Studio 17 2022",
+            "ninja": "Ninja",
+            "make": "Unix Makefiles",
+            "xcodebuild": "Xcode",
+        }
         available_generators = []
         for generator in cmake_generator_map.keys():
             if shutil.which(generator):
@@ -924,6 +954,8 @@
     # Try to set specified generator (will probably fail if there is an old cache)
     if args.G:
         cmake_args.extend(["-G", args.G])
+        if "Visual Studio" in args.G:
+            cmake_args.extend(["-A", "x64", "-T", "ClangCL"])
 
     if args.trace_cmake_perf:
         cmake_performance_trace = os.path.join(
@@ -976,6 +1008,9 @@
     ns3_program_map = {}
     longest_shortcut_map = {}
 
+    if programs_dict["FETCH_NETANIM_VISUALIZER"]:
+        ns3_program_map["netanim"] = [programs_dict["out_dir"] + "/bin/netanim"]
+
     for program in programs_dict["ns3_runnable_programs"]:
         if "pch_exec" in program:
             continue
@@ -1057,6 +1092,7 @@
 
 
 def parse_version(version_str):
+    version_str = version_str.split("-")[0]
     version = version_str.split(".")
     version = tuple(map(int, version))
     return version
@@ -1220,11 +1256,21 @@
     build_profile_suffix = "" if build_profile in ["release"] else "-" + build_profile
     program_name = ""
 
+    special_run_to_build_targets = {
+        "netanim": "netanim_visualizer",
+    }
+
     try:
         program_name = "".join(
             *re.findall("(.*)ns%s-(.*)%s" % (ns3_version, build_profile_suffix), program_path)
         )
     except TypeError:
+        # This is not your typical ns-3 executable.
+        # Maybe some imported target that had a conflicting name, like netanim
+        program_name = os.path.basename(program_path)
+        if program_name in special_run_to_build_targets:
+            return special_run_to_build_targets[program_name]
+        # Or maybe it is an error indeed
         print("Target to build does not exist: %s" % program_path)
         exit(1)
 
@@ -1755,6 +1801,16 @@
     if args.show == "version":
         show_build_version(build_version_string)
 
+    if args.show == "typeid":
+        sys.argv = [
+            "ns3",
+            "run",
+            "print-introspected-doxygen",
+            "--",
+            f"--TypeId={args.tid}",
+        ]
+        args = parse_args(sys.argv[1:])
+
     # Check if running something or reconfiguring ns-3
     run_only = False
     build_and_run = False
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/README.md ns-3.44/README.md
--- ns-3.43/README.md	2024-10-09 16:41:09.756655500 -0700
+++ ns-3.44/README.md	2025-03-09 16:55:49.227370500 -0700
@@ -21,6 +21,7 @@
 * [Working with the Development Version of ns-3](#working-with-the-development-version-of-ns-3)
 * [Contributing to ns-3](#contributing-to-ns-3)
 * [Reporting Issues](#reporting-issues)
+* [Asking Questions](#asking-questions)
 * [ns-3 App Store](#ns-3-app-store)
 
 > **NOTE**: Much more substantial information about ns-3 can be found at
@@ -215,6 +216,15 @@
 Before creating a new issue, please check if the problem that you are facing
 was already reported and contribute to the discussion, if necessary.
 
+## Asking Questions
+
+ns-3 has an official [ns-3-users message board](https://groups.google.com/g/ns-3-users)
+where the community asks questions and share helpful advice.
+Additionally, ns-3 has the [ns-3 Zulip chat](https://ns-3.zulipchat.com/), used to discuss
+development issues and questions among maintainers and the community.
+
+Please use the above resources to ask questions about ns-3, rather than creating issues.
+
 ## ns-3 App Store
 
 The official [ns-3 App Store](https://apps.nsnam.org/) is a centralized directory
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/RELEASE_NOTES.md ns-3.44/RELEASE_NOTES.md
--- ns-3.43/RELEASE_NOTES.md	2024-10-09 16:41:36.356755000 -0700
+++ ns-3.44/RELEASE_NOTES.md	2025-03-09 16:56:09.315445400 -0700
@@ -1,5 +1,4 @@
-ns-3 RELEASE NOTES
-==================
+# ns-3 Release Notes
 
 This file contains ns-3 release notes (most recent releases first).
 
@@ -13,8 +12,77 @@
 and references prefixed by '!' refer to a
 [GitLab.com merge request](https://gitlab.com/nsnam/ns-3-dev/-/merge_requests) number.
 
-Release 3.43
-------------
+## Release 3.44
+
+This release adds the zigbee module and otherwise contains maintenance and small feature updates
+to the existing models and build system.
+
+### Availability
+
+This release is available from:
+<https://www.nsnam.org/release/ns-allinone-3.44.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++-10.1 or later, or LLVM/clang++-11 or later
+- Python 3.8 or later
+- CMake 3.13 or later
+- (macOS only) Xcode 13.1.6 or later
+- (Windows only) Msys2/MinGW64 and Msys2/UCRT64 toolchains or WSL2
+
+Python API requires [Cppyy](https://cppyy.readthedocs.io/en/latest/installation.html) and has only
+been tested on Linux. As of this release, the latest known version to work with ns-3 is cppyy==3.1.2.
+
+The required Doxygen version for documentation generation is now version 1.11.
+
+Doxygen tags are now required to use the '@' rather than the '\' character.
+
+The minimum clang-format version is version 15.
+
+### New user-visible features
+
+- (applications) - Attributes `RemoteAddress` and `RemotePort` in UdpClient, UdpTraceClient and UdpEchoClient have been combined into a single `Remote` attribute. Similarly, the `ThreeGppHttpClient::RemoteServerAddress` and `ThreeGppHttpClient::RemoteServerPort` attributes have been combined into a single `ThreeGppHttpClient::Remote` attribute. The constructors of corresponding helper classes have been changed to make use of these new attributes.
+- (applications) - The `ThreeGppHttpServer::LocalAddress` and `ThreeGppHttpServer::LocalPort` attributes have been renamed to `ThreeGppHttpServer::Remote` and `ThreeGppHttpServer::Port`, respectively.
+- (applications) - It is now possible to specify the address on which to bind the listening socket for UdpServer via the `Local` attribute.
+- (applications) - It is now possible to specify a port only for PacketSink to listen to any address (both IPv4 and IPv6).
+- (build) Scan for contrib modules in `ns-3-external-contrib` directory, at the same level of the ns-3 directory (e.g. `./ns-3-dev/../ns-3-external-contrib/`).
+- (energy) Added new information and reformatted energy module documentation.
+- (wifi) - Added a `WifiDefaultProtectionManager::SkipMuRtsBeforeBsrp` attribute to avoid using MU-RTS to protect the transmission of a BSRP Trigger Frame. If this attribute is set to true (which is the default value), BSRP Trigger Frames can be used as Initial Control Frames for EMLSR clients
+- (wifi) Each MSDU, A-MSDU or management MPDU now has its individual frame retry count and each Txop/QosTxop has its own SRC (Station Retry Count) to match the standard specifications.
+- (wifi) The `MaxSsrc` and `MaxSlrc` attributes of the `WifiRemoteStationManager` have been obsoleted and replaced by the `FrameRetryLimit` attribute of the `WifiMac`.
+- (wifi) Added the `IncrementRetryCountUnderBa` attribute to the  `WifiRemoteStationManager` to choose whether or not to increase the retry count of frames that are part of a block ack agreement; this attribute defaults to false to match the standard specifications.
+- (wifi) Added a new `BaEstablished` trace source to `QosTxop` to notify that a block ack agreement has been established with a given recipient for a given TID.
+- (wifi) Added a new `MainPhySwitch` trace source to EmlsrManager, which is fired when the main PHY switches channel to operate on another link and provides information about the reason for starting the switch.
+- (wifi) Add support for exchanging 802.11be Multi-Link Probe Request frames. Currently, the default association manager does not instruct the MAC to transmit a Multi-Link Probe Request frame, though.
+- (wifi) 2004! - Add Wi-Fi channel occupancy statistics helper
+- (wifi) 2009! - Added WifiTxStatsHelper for Wi-Fi MAC-level tracing.
+- (wifi) - Added support for 802.11aa groupcast with retries (GCR). Both unsolicited retries (GCR-UR) and Block Ack (GCR-BA) mechanisms are implemented.
+- (zigbee) Added a new Zigbee module.
+
+### Bugs fixed
+
+- (core) - Fix the command-line handling of default values containing a space
+- (examples) - Fix incorrect energy calculation in wifi power adaptation examples
+- (internet) #1109 - Add support for multiple hardware types in ArpHeader
+- (internet) #1177 - check for 0-TTL before trying to decrement
+- (lr-wpan) !2334 - Fix the MAC reaction to an association issue in which association response commands might be received before data request command acks.
+- (propagation) Scale the NTN LOS probabilities from percentages [0, 100] to probabilities [0, 1]
+- (propagation) !2352 - Fix Okumura Hata propagation loss model for open areas environment
+- (spectrum) Calculate PSD by combining received power on ports, even when no precoding matrix is set
+- (spectrum) Scale the CDS parameter of V2V models to nanoseconds
+- (spectrum) Add missing K-factor fields (uk, sigK) for NTN NLOS 3GPP channel model
+- (spectrum) Trigger 3GPP channel updates after changes to antenna attributes
+- (wifi) Retransmit procedures have been aligned with the standard specifications.
+- (wifi) Clear PSDU map if no immediate response expected with BAR-BA ack sequence
+- (wifi) Fix S-MPDU TX duration computation with BlockAck ack policy
+- (wifi) Fix missing DSSS Param Set in Probe Request sent over 2.4 GHz links
+- (wifi) #1104 - Fix wrong calculation of start sequence number
+- (wifi) Ensure AckedMpdu trace is fired before the MPDU is dequeued
+
+## Release 3.43
 
 This release is mainly a maintenance release and the API is generally
 consistent with the previous ns-3.42 release.  See the file CHANGES.md
@@ -54,11 +122,9 @@
 - (lr-wpan) !2163 - Lr-wpan module now uses the `ns3::lrwpan` namespace in its TypeId.
 - (tcp) !2027 - TcpSocketBase: Added TCP retransmission trace
 - (tcp) !2059 - Aligns PRR implementation with RFC 6937 bis-08. Added a new param `isDupAck` to `DoRecovery` method, removed `ReductionBound` attribute from `TcpPrrRecovery`.
-- (wifi) !2068 - Introduce use of weak type aliases for quantities representing SI units,
-in preparation for future conversion to strongly typed units and quantities
+- (wifi) !2068 - Introduce use of weak type aliases for quantities representing SI units, in preparation for future conversion to strongly typed units and quantities
 - (wifi) - Added support for 80+80 MHz channel configuration
-- (wifi) - It is now possible to control how PCAPs are generated for MLD: either a single PCAP
-per device, or a PCAP file per PHY, or a PCAP file per link. By default, a single PCAP is generated per PHY for MLD. The configuration of this parameter has no impact for SLD.
+- (wifi) - It is now possible to control how PCAPs are generated for MLD: either a single PCAP per device, or a PCAP file per PHY, or a PCAP file per link. By default, a single PCAP is generated per PHY for MLD. The configuration of this parameter has no impact for SLD.
 
 ### Bugs fixed
 
@@ -94,8 +160,7 @@
 - (wifi) Fix incorrect configuration of wifi-spectrum-saturation-example.cc
 - (wifi) Fix output formatting for wifi-spectrum-per-example.cc
 
-Release 3.42
-------------
+## Release 3.42
 
 In this release, we have introduced pedantic compiler warnings to enhance C++ standard conformance and improve portability.  Also, model library code in the lr-wpan and energy modules has been moved into a nested C++ namespace.
 
@@ -155,8 +220,7 @@
 - (wifi) - Fix operation in 6 GHz band (added support for FILS Discovery frames and HE 6GHz Band Capabilities information element, fixed HE Operation information element, fixed NSS selection, fixed HT and VHT not supported on 6GHz links).
 - (wifi, spectrum) - Fix negative power when channel is switched during the propagation delay period (after TX started but before the signal reached RX).
 
-Release 3.41
-------------
+## Release 3.41
 
 ### Availability
 
@@ -209,8 +273,7 @@
 - (wifi) - ReportAmpduTxStatus called twice when sending explicit BAR upon missed BlockAck
 - (wifi) - Fix regression causing BlockAckReq frames to be sent with data rates instead of control rates
 
-Release 3.40
-------------
+## Release 3.40
 
 ### Availability
 
@@ -258,8 +321,7 @@
 - (wifi) #942 - Trace expired MPDUs before removing them from the queue to avoid blocking the recipient buffer
 - (wifi) - Fix wrong condition preventing PHY from aborting RX when starting TX
 
-Release 3.39
-------------
+## Release 3.39
 
 ### Availability
 
@@ -318,8 +380,7 @@
 - (wifi) #917 - Add missing STA-ID in GetMode() call from YansErrorRateModel
 - (wifi) - Fix wifi-rate-adaptation-distance.cc example issues with CCA threshold
 
-Release 3.38
-------------
+## Release 3.38
 
 ### Availability
 
@@ -356,7 +417,6 @@
 - (network) !1163 - Initializing an Ipv[4,6]Address from an invalid string do not raise an exception anymore. Instead the address is marked as not initialized.
 - (spectrum) !1046 - Added the TwoRaySpectrumPropagationLossModel fast-fading class, as the outcome of the related GSoC 2022 project titled "A simplified channel and beamforming model for ns-3"
 - (spectrum) !1119 - Added a capability to filter signals (with a new SpectrumTransmitFilter) sent on the SpectrumChannel before they are forwarded to receivers on the channel.  This is motivated by scalability (reducing inconsequential simulation events).
-the TwoRaySpectrumPropagationLossModel fast-fading class, as the outcome of the related GSoC 2022 project titled "A simplified channel and beamforming model for ns-3"
 - (wifi) Added support for 802.11be Multi-Link Operations (MLO), STR mode only
 - (wifi) Added more fields to the EHT Capabilities information element
 - (wifi) Added an initial 802.11be-based example program
@@ -384,8 +444,7 @@
 - (wifi) Prevent extraction of in-flight MPDUs due to lifetime expired
 - (wifi) Fixed getting the primary 80 MHz channel number in the 6 GHz band
 
-Release 3.37
-------------
+## Release 3.37
 
 ### Availability
 
@@ -457,8 +516,7 @@
 - (wifi) Fix acknowledgment in SU format for DL MU PPDUs including PSDUs of different TIDs
 - (wifi) Fix the TID of QoS Null frames in response to BSRP TF
 
-Release 3.36.1
---------------
+## Release 3.36.1
 
 ### Availability
 
@@ -497,8 +555,7 @@
 - (wifi) - Do not change protection when aggregating MSDU to DL MU PPDU
 - (wifi) - IdealWifiManager was not using the appropriate default mode
 
-Release 3.36
-------------
+## Release 3.36
 
 ### Availability
 
@@ -587,8 +644,7 @@
 - (wifi) #609 - STA checks that a Multi-STA BA is sent by the AP it is associated with
 - (lr-wpan) #742 - Add default values to non-initialized structs with primitive variables in ``LrWpanPhy``
 
-Release 3.35
-------------
+## Release 3.35
 
 ### Availability
 
@@ -659,8 +715,7 @@
 - (traffic-control) !706 - Fix FqPIE qdisc not using attributes
 - (wifi) - Always track interference when not locking on PPDU
 
-Release 3.34
--------------
+## Release 3.34
 
 ### Availability
 
@@ -741,8 +796,7 @@
 - (wifi) #418 - Fix HE A-MPDU Max Size Upper Bound
 - (wifi) - Compare received power per MHz to normalized RX sensitivity
 
-Release 3.33
-------------
+## Release 3.33
 
 ### Availability
 
@@ -809,8 +863,7 @@
 - (wifi) Report reception of BAR to WifiRemoteStationManager
 - (wifi) TXOP durations were not always being traced
 
-Release 3.32
-------------
+## Release 3.32
 
 ### Availability
 
@@ -887,8 +940,7 @@
 - (wifi) - Do not send VHT capabilities when operating in 2.4 GHz band
 - (wifi) #252 - Correctly handle multicast frames
 
-Release 3.31
-------------
+## Release 3.31
 
 ### Availability
 
@@ -991,8 +1043,7 @@
 In general, known issues are tracked on the project tracker available
 at <https://gitlab.com/nsnam/ns-3-dev/issues>
 
-Release 3.30.1
---------------
+## Release 3.30.1
 
 Release 3.30.1 is a maintenance release that fixes the following issues from
 the ns-3.30 release:
@@ -1027,8 +1078,7 @@
 - Example program tap-wifi-virtual-machine.py had a syntax error
 - Issue #80 - Indoor/outdoor status is not updated when the node moves
 
-Release 3.30
-------------
+## Release 3.30
 
 ### Availability
 
@@ -1153,8 +1203,7 @@
 In general, known issues are tracked on the project tracker available
 at <https://gitlab.com/nsnam/ns-3-dev/issues>
 
-Release 3.29
-------------
+## Release 3.29
 
 This release is dedicated to the memory of project co-founder George Riley.
 
@@ -1239,8 +1288,7 @@
 In general, known issues are tracked on the project tracker available
 at <http://www.nsnam.org/bugzilla/>
 
-Release 3.28
-------------
+## Release 3.28
 
 ### Availability
 
@@ -1255,6 +1303,7 @@
 - g++-4.9 or later
 - Apple LLVM version 7.0.2 or later
 - clang-3.3 or later
+
 In addition, a Python 2.7 (Python 2 series) or Python 3.4 (Python 3 series)
 or later is required.
 
@@ -1341,8 +1390,7 @@
 In general, known issues are tracked on the project tracker available
 at <http://www.nsnam.org/bugzilla/>
 
-Release 3.27
-------------
+## Release 3.27
 
 ### Availability
 
@@ -1522,8 +1570,7 @@
 In general, known issues are tracked on the project tracker available
 at <http://www.nsnam.org/bugzilla/>
 
-Release 3.26
-------------
+## Release 3.26
 
 ### Availability
 
@@ -1659,8 +1706,7 @@
 In general, known issues are tracked on the project tracker available
 at <http://www.nsnam.org/bugzilla/>
 
-Release 3.25
-------------
+## Release 3.25
 
 ### Availability
 
@@ -1849,8 +1895,7 @@
 In general, known issues are tracked on the project tracker available
 at <http://www.nsnam.org/bugzilla/>
 
-Release 3.24.1
---------------
+## Release 3.24.1
 
 Release 3.24.1 is a maintenance release that fixes three issues:
 
@@ -1891,8 +1936,7 @@
 - Bug 2182 - pybindgen required version is now a string literal
 - Bug 2184 - integer overflow in MacLow
 
-Release 3.24
-------------
+## Release 3.24
 
 ### Availability
 
@@ -1970,8 +2014,7 @@
 In general, known issues are tracked on the project tracker available
 at <http://www.nsnam.org/bugzilla/>
 
-Release 3.23
-------------
+## Release 3.23
 
 ### Availability
 
@@ -2037,8 +2080,7 @@
 In general, known issues are tracked on the project tracker available
 at <http://www.nsnam.org/bugzilla/>
 
-Release 3.22
-------------
+## Release 3.22
 
 ### Availability
 
@@ -2146,8 +2188,7 @@
 In general, known issues are tracked on the project tracker available
 at <http://www.nsnam.org/bugzilla/>
 
-Release 3.21
-------------
+## Release 3.21
 
 ### Availability
 
@@ -2229,11 +2270,10 @@
 ### Known issues
 
 - Bug 1770 - The mesh module will crash if used for g++ version >= 4.8.1
-in optimized mode, on a 32-bit Linux machine.  Lowering the optimization
-level to -O1 in this case can be used as a workaround.
+  in optimized mode, on a 32-bit Linux machine.  Lowering the optimization
+  level to -O1 in this case can be used as a workaround.
 
-Release 3.20
-------------
+## Release 3.20
 
 ### Availability
 
@@ -2303,7 +2343,7 @@
 - Bug 1853 - NS_LOG_FUNCTION broken on OSX 10.9
 - Bug 1855 - SixLowPanNetDevice is not correctly indexed
 - Bug 1857 - Detect location of installed boost libraries
-- Bug 1862 - NS_LOG="Time=*|prefix_time" causes stack overflow
+- Bug 1862 - `NS_LOG="Time=*|prefix_time"` causes stack overflow
 - Bug 1868 - Optimized builds are sensitive to -fstrict-overflow
 - Bug 1870 - Remove unnecessary AsInt functions
 - Bug 1872 - Inside RREQ processing, in case of IP duplication, packet dropped instead of being forwarded
@@ -2337,11 +2377,10 @@
 ### Known issues
 
 - Bug 1770 - The mesh module will crash if used for g++ version >= 4.8.1
-in optimized mode, on a 32-bit Linux machine.  Lowering the optimization
-level to -O1 in this case can be used as a workaround.
+  in optimized mode, on a 32-bit Linux machine.  Lowering the optimization
+  level to -O1 in this case can be used as a workaround.
 
-Release 3.19
-------------
+## Release 3.19
 
 ### Availability
 
@@ -2449,15 +2488,13 @@
 - Bug 1816 - IPv4 fragmentation loses Packet tags
 - Bug 1877 - constructor missing for `<something>PropagationLossModels`
 
-Release 3.18.2
---------------
+## Release 3.18.2
 
 ns-allinone-3.18.2 was released to include a bake configuration file update
 for Direct Code Execution.  The ns-3 code in this release was unchanged
 from that of ns-3.18.1.
 
-Release 3.18.1
---------------
+## Release 3.18.1
 
 This release is mainly to provide updated compiler support (clang/LLVM)
 and fix the Python API scanning facility.  A few additional bug fixes
@@ -2509,8 +2546,7 @@
 - Fix compilation with Clang 3.2 and newer versions, including Apple Xcode 5
 - Miscellaneous NetAnim fixes
 
-Release 3.18
-------------
+## Release 3.18
 
 ### Availability
 
@@ -2603,8 +2639,7 @@
 In general, known issues are tracked on the project tracker available
 at <http://www.nsnam.org/bugzilla/>
 
-Release 3.17
-------------
+## Release 3.17
 
 ### Availability
 
@@ -2704,8 +2739,7 @@
 In general, known issues are tracked on the project tracker available
 at <http://www.nsnam.org/bugzilla/>
 
-Release 3.16
-------------
+## Release 3.16
 
 ### Availability
 
@@ -2776,8 +2810,7 @@
 In general, known issues are tracked on the project tracker available
 at <http://www.nsnam.org/bugzilla/>
 
-Release 3.15
-------------
+## Release 3.15
 
 ### Availability
 
@@ -2834,8 +2867,7 @@
 In general, known issues are tracked on the project tracker available
 at <http://www.nsnam.org/bugzilla/>
 
-Release 3.14.1
---------------
+## Release 3.14.1
 
 ### Availability
 
@@ -2848,8 +2880,7 @@
 easier to add PyViz support to examples; otherwise it is the same as the
 ns-3.14 release.
 
-Release 3.14
-------------
+## Release 3.14
 
 ### Availability
 
@@ -2956,8 +2987,7 @@
 In general, known issues are tracked on the project tracker available
 at <http://www.nsnam.org/bugzilla/>
 
-Release 3.13
-------------
+## Release 3.13
 
 ### Availability
 
@@ -3031,8 +3061,7 @@
 In general, known issues are tracked on the project tracker available
 at <http://www.nsnam.org/bugzilla/>
 
-Release 3.12.1
---------------
+## Release 3.12.1
 
 ### Availability
 
@@ -3044,8 +3073,7 @@
 This release fixes PyViz visualizer's python bindings; otherwise, it
 is the same as the ns-3.12 release.
 
-Release 3.12
-------------
+## Release 3.12
 
 ### Availability
 
@@ -3128,8 +3156,7 @@
 In general, known issues are tracked on the project tracker available
 at <http://www.nsnam.org/bugzilla/>
 
-Release 3.11
-------------
+## Release 3.11
 
 ### Availability
 
@@ -3268,8 +3295,7 @@
 In general, known issues are tracked on the project tracker available
 at <http://www.nsnam.org/bugzilla/>
 
-Release 3.10
-------------
+## Release 3.10
 
 ### Availability
 
@@ -3432,8 +3458,7 @@
 Windows XP 32 bit Cygwin 1.7.7 does not seem to work because of a
 problem (reported elsewhere) in linking large libraries.
 
-Release 3.9
------------
+## Release 3.9
 
 ### Availability
 
@@ -3591,8 +3616,7 @@
 
 ### Known issues
 
-Release 3.8
------------
+## Release 3.8
 
 ### Availability
 
@@ -3732,8 +3756,7 @@
 - optimized builds on gcc 3.4.4 and 3.4.5
 - optimized builds on linux x86 gcc 4.0.x
 
-Release 3.7
------------
+## Release 3.7
 
 ### Availability
 
@@ -3844,8 +3867,7 @@
 - optimized builds on gcc 3.4.4 and 3.4.5
 - optimized builds on linux x86 gcc 4.0.x
 
-Release 3.6
------------
+## Release 3.6
 
 ### Availability
 
@@ -3921,8 +3943,7 @@
 - optimized builds on gcc 3.4.4 and 3.4.5
 - optimized builds on linux x86 gcc 4.0.x
 
-Release 3.5
------------
+## Release 3.5
 
 ### Availability
 
@@ -3981,8 +4002,7 @@
 fuller IPv6 support, some smaller features such as a new Global ARP
 package, and possibly a new Testing and Validation suite.
 
-Release 3.4
------------
+## Release 3.4
 
 ### Availability
 
@@ -4042,8 +4062,7 @@
 features such as a new Global ARP package and possibly a new Testing and Validation
 suite,
 
-Release 3.3
------------
+## Release 3.3
 
 ### Availability
 
@@ -4105,8 +4124,7 @@
 fuller IPv6 support, and IPv4 and routing protocol refactoring, and some smaller
 features such as an object naming facility and a new Global ARP package.
 
-Release 3.2
------------
+## Release 3.2
 
 ### Availability
 
@@ -4177,8 +4195,7 @@
 feature the merging of some of our projects currently in development: IPv6,
 emulation, and synchronous posix sockets.
 
-Release 3.1 (2008/06/30)
-------------------------
+## Release 3.1 (2008/06/30)
 
 ### The first ns-3 stable release
 
@@ -4188,7 +4205,7 @@
 We dedicate this initial ns-3 release to our late contributor and friend,
 Federico Maguolo.
 
-### What is ns-3 ?
+### What is ns-3?
 
 ns-3 is a new discrete-event network simulator designed for supporting network
 research and education. ns-3 features a solid, well documented C++ core and
@@ -4235,8 +4252,7 @@
 scripting, IPv6, emulation, a statistics framework and synchronous posix
 sockets.
 
-Release 3.0.13 (2008/06/02)
----------------------------
+## Release 3.0.13 (2008/06/02)
 
 - point to point links generate ppp pcap traces
 - point to point links support asymmetrical data rates.
@@ -4256,8 +4272,7 @@
 called Simulator::Stop (time), and takes a relative time, instead of
 absolute.
 
-Release 3.0.12 (2008/04/07)
----------------------------
+## Release 3.0.12 (2008/04/07)
 
 - Add Attribute support to the TypeId metadata system and add
   attribute support to all in-tree models
@@ -4270,8 +4285,7 @@
 - regression test framework added
 - TCP delayed acknowledgements and multitasking server
 
-Release 3.0.11 (2008/02/15)
----------------------------
+## Release 3.0.11 (2008/02/15)
 
 - Initial port of GTNetS TCP implementation (initial version
   that does not support multitasking or delayed acknowledgments yet,
@@ -4281,15 +4295,13 @@
 - lots of bug fixes throughout the system
 - tutorial updates
 
-Release 3.0.10 (2008/01/15)
----------------------------
+## Release 3.0.10 (2008/01/15)
 
 - Add tutorial document content;
 - Valgrind option for "waf" tool;
 - Doxygen organization changes.
 
-Release 3.0.9 (2007/12/15)
---------------------------
+## Release 3.0.9 (2007/12/15)
 
 - A 802.11 model ported from Yans. This model supports:
   - a rather extensive PHY model
@@ -4303,30 +4315,26 @@
 - Tracing support for Applications
 - many bugs fixed
 
-Release 3.0.8 (2007/11/15)
---------------------------
+## Release 3.0.8 (2007/11/15)
 
 - A simple error model
 - Source files for ns-3 tutorial
 
-Release 3.0.7 (2007/10/15)
---------------------------
+## Release 3.0.7 (2007/10/15)
 
 - OLSR routing protocol
 - A timer class
 - Additional mobility models (random waypoint, random 2D walk)
 - A mobility visualization tool
 
-Release 3.0.6 (2007/09/15)
---------------------------
+## Release 3.0.6 (2007/09/15)
 
 - Static multicast IPv4 routing
 - Logging overhaul (NS_LOG macros)
 - Refactoring of tracing subsystem
 - Tutorial document started
 
-Release 3.0.5 (2007/08/15)
---------------------------
+## Release 3.0.5 (2007/08/15)
 
 - Refactoring to support win32-based unix environments (Cygwin, mingw)
 - "Packet socket" for allowing applications to access NetDevices directly
@@ -4336,16 +4344,14 @@
 - Add mobility framework and basic mobility models
 - Global unicast centralized routing
 
-Release 3.0.4 (2007/07/15)
---------------------------
+## Release 3.0.4 (2007/07/15)
 
 - Enable waf as the default build system.
 - Per-packet metadata:  a system to track which headers and trailers
   are added to a packet
 - Simplifications to point-to-point devices and channel
 
-Release 3.0.3 (2007/06/15)
---------------------------
+## Release 3.0.3 (2007/06/15)
 
 - Enable Waf for release tarballs: users can now build ns-3
   with the "waf" tool. See doc/build-waf.txt.
@@ -4357,8 +4363,7 @@
   manager
 - Many small API cleanups
 
-Release 3.0.2 (2007/05/18)
---------------------------
+## Release 3.0.2 (2007/05/18)
 
 - Implement a new memory management infrastructure based
   on reference counting and smart pointers (the latter being
@@ -4367,8 +4372,7 @@
   to provide object extensibility
 - Add support for a BSD-style socket API for user applications
 
-Release 3.0.1 (2007/03/31)
---------------------------
+## Release 3.0.1 (2007/03/31)
 
 - First public release; not yet pre-alpha.
 - Simple UDP-based simulation script (examples/simple-p2p.cc)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/scratch/nested-subdir/lib/scratch-nested-subdir-library-header.h ns-3.44/scratch/nested-subdir/lib/scratch-nested-subdir-library-header.h
--- ns-3.43/scratch/nested-subdir/lib/scratch-nested-subdir-library-header.h	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/scratch/nested-subdir/lib/scratch-nested-subdir-library-header.h	2025-03-09 16:55:49.339371000 -0700
@@ -14,7 +14,7 @@
 /**
  * Get a message from the subdir.
  *
- * \return The message from the subdir
+ * @return The message from the subdir
  */
 std::string ScratchNestedSubdirGetMessage();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/scratch/subdir/scratch-subdir-additional-header.h ns-3.44/scratch/subdir/scratch-subdir-additional-header.h
--- ns-3.43/scratch/subdir/scratch-subdir-additional-header.h	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/scratch/subdir/scratch-subdir-additional-header.h	2025-03-09 16:55:49.339371000 -0700
@@ -14,7 +14,7 @@
 /**
  * Get a message from the subdir.
  *
- * \return The message from the subdir
+ * @return The message from the subdir
  */
 std::string ScratchSubdirGetMessage();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/antenna/CMakeLists.txt ns-3.44/src/antenna/CMakeLists.txt
--- ns-3.43/src/antenna/CMakeLists.txt	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/src/antenna/CMakeLists.txt	2025-03-09 16:55:49.339371000 -0700
@@ -74,6 +74,7 @@
     model/phased-array-model.h
     model/three-gpp-antenna-model.h
     model/uniform-planar-array.h
+    utils/symmetric-adjacency-matrix.h
   LIBRARIES_TO_LINK ${libcore}
   TEST_SOURCES
     ${circular_aperture_antenna_test_sources}
@@ -83,4 +84,5 @@
     test/test-isotropic-antenna.cc
     test/test-parabolic-antenna.cc
     test/test-uniform-planar-array.cc
+    test/test-adjacency-matrix.cc
 )
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/antenna/doc/Makefile ns-3.44/src/antenna/doc/Makefile
--- ns-3.43/src/antenna/doc/Makefile	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/src/antenna/doc/Makefile	2025-03-09 16:55:49.339371000 -0700
@@ -1,6 +1,6 @@
 EPSTOPDF = epstopdf
 DIA = dia
-CONVERT = convert
+CONVERT = convert -density 300
 
 SOURCE = source
 FIGURES = $(SOURCE)/figures
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/antenna/examples/adjacency-matrix-example.cc ns-3.44/src/antenna/examples/adjacency-matrix-example.cc
--- ns-3.43/src/antenna/examples/adjacency-matrix-example.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/antenna/examples/adjacency-matrix-example.cc	2025-03-09 16:55:49.343371000 -0700
@@ -0,0 +1,159 @@
+/*
+ * Copyright (c) 2025 CTTC
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Author: Gabriel Ferreira <gabrielcarvfer@gmail.com>
+ */
+
+/**
+ * @file
+ * @ingroup antenna-examples
+ * Example program illustrating one application of symmetric adjacency matrices for routing
+ */
+
+#include "ns3/command-line.h"
+#include "ns3/symmetric-adjacency-matrix.h"
+
+#include <algorithm>
+#include <iostream>
+#include <limits>
+#include <map>
+
+int
+main(int argc, char** argv)
+{
+    char srcNodeOpt = 'A'; // 0
+    char dstNodeOpt = 'I'; // 8
+    ns3::CommandLine cmd(__FILE__);
+    cmd.AddValue("srcNode", "Source node [0-9]", srcNodeOpt);
+    cmd.AddValue("dstNode", "Destination node [0-9]", dstNodeOpt);
+    cmd.Parse(argc, argv);
+
+    NS_ABORT_MSG_IF(srcNodeOpt < 'A' || srcNodeOpt > 'J', "Invalid source node");
+    NS_ABORT_MSG_IF(dstNodeOpt < 'A' || dstNodeOpt > 'J', "Invalid destination node");
+
+    // -A(65) remove the skew from 0
+    srcNodeOpt -= 'A';
+    dstNodeOpt -= 'A';
+
+    constexpr float maxFloat = std::numeric_limits<float>::max();
+    // Create routing weight matrix for 10 nodes and initialize weights to infinity (disconnected)
+    ns3::SymmetricAdjacencyMatrix<float> routeWeights(10, maxFloat);
+
+    /* Let's add the entries of this network topology to the matrix
+     *
+     * Node | Corresponding matrix row
+     *  A   | 0
+     *  B   | 1
+     *  C   | 2
+     *  D   | 3
+     *  E   | 4
+     *  F   | 5
+     *  G   | 6
+     *  H   | 7
+     *  I   | 8
+     *  J   | 9
+     *
+     * A------5-------B-------------14-------C
+     * \               \                   /1|
+     *  \               3                 J  |
+     *   \               \               /1  | 7
+     *    4           E-2-F--4---G--3--H     |
+     *     \       8 /                  \    |
+     *      D--------                    10--I
+     */
+
+    // Distance from nodes to other nodes
+    routeWeights.SetValue(0, 1, 5);  // A-B=5
+    routeWeights.SetValue(1, 2, 14); // B-C=14
+    routeWeights.SetValue(0, 3, 4);  // A-D=4
+    routeWeights.SetValue(1, 5, 3);  // B-F=3
+    routeWeights.SetValue(2, 9, 1);  // C-J=1
+    routeWeights.SetValue(9, 7, 1);  // J-H=1
+    routeWeights.SetValue(2, 8, 7);  // C-I=7
+    routeWeights.SetValue(3, 4, 8);  // D-E=8
+    routeWeights.SetValue(4, 5, 2);  // E-F=2
+    routeWeights.SetValue(5, 6, 4);  // F-G=4
+    routeWeights.SetValue(6, 7, 3);  // G-H=3
+    routeWeights.SetValue(7, 8, 10); // H-I=10
+
+    // Distance from nodes to themselves is zero
+    for (size_t i = 0; i < routeWeights.GetRows(); i++)
+    {
+        routeWeights.SetValue(i, i, 0);
+    }
+
+    std::map<std::pair<int, int>, std::vector<int>> routeMap;
+    // Initialize routes
+    for (size_t i = 0; i < routeWeights.GetRows(); i++)
+    {
+        for (size_t j = 0; j < routeWeights.GetRows(); j++)
+        {
+            if (routeWeights.GetValue(i, j) != maxFloat)
+            {
+                if (i != j)
+                {
+                    routeMap[{i, j}] = {(int)i, (int)j};
+                }
+                else
+                {
+                    routeMap[{i, j}] = {(int)i};
+                }
+            }
+        }
+    }
+    // Compute every single shortest route between the nodes of the graph (represented by the
+    // adjacency matrix) We do this in multiple iterations, until we fill the entire matrix
+    for (size_t bridgeNode = 0; bridgeNode < routeWeights.GetRows(); bridgeNode++)
+    {
+        for (size_t srcNode = 0; srcNode < routeWeights.GetRows(); srcNode++)
+        {
+            for (size_t dstNode = 0; dstNode < routeWeights.GetRows(); dstNode++)
+            {
+                auto weightA = routeWeights.GetValue(srcNode, bridgeNode);
+                auto weightB = routeWeights.GetValue(bridgeNode, dstNode);
+                // If there is a path between A and bridge, plus bridge and B
+                if (std::max(weightA, weightB) == maxFloat)
+                {
+                    continue;
+                }
+                // Check if sum of weights is lower than existing path
+                auto weightAB = routeWeights.GetValue(srcNode, dstNode);
+                if (weightA + weightB < weightAB)
+                {
+                    // If it is, update adjacency matrix with the new weight of the shortest
+                    // path
+                    routeWeights.SetValue(srcNode, dstNode, weightA + weightB);
+
+                    // Retrieve the partial routes A->bridge and bridge->C,
+                    // and assemble the new route A->bridge->C
+                    const auto srcToBridgeRoute = routeMap.at({srcNode, bridgeNode});
+                    const auto bridgeToDstRoute = routeMap.at({bridgeNode, dstNode});
+                    std::vector<int> dst;
+                    dst.insert(dst.end(), srcToBridgeRoute.begin(), srcToBridgeRoute.end());
+                    dst.insert(dst.end(), bridgeToDstRoute.begin() + 1, bridgeToDstRoute.end());
+                    routeMap[{srcNode, dstNode}] = dst;
+
+                    // We also include the reverse path, since the graph is bidirectional
+                    std::vector<int> invDst(dst.rbegin(), dst.rend());
+                    routeMap[{dstNode, srcNode}] = invDst;
+                }
+            }
+        }
+    }
+
+    // Now we can print the shortest route between srcNode and dstNode
+    std::cout << "shortest route between " << (char)(srcNodeOpt + 'A') << " and "
+              << (char)(dstNodeOpt + 'A') << " (length "
+              << routeWeights.GetValue(srcNodeOpt, dstNodeOpt) << "):";
+    auto lastNodeNumber = srcNodeOpt;
+    for (auto nodeNumber : routeMap.at({srcNodeOpt, dstNodeOpt}))
+    {
+        std::cout << "--" << routeWeights.GetValue(lastNodeNumber, nodeNumber) << "-->"
+                  << (char)('A' + nodeNumber);
+        lastNodeNumber = nodeNumber;
+    }
+    std::cout << std::endl;
+    return 0;
+}
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/antenna/examples/CMakeLists.txt ns-3.44/src/antenna/examples/CMakeLists.txt
--- ns-3.43/src/antenna/examples/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/antenna/examples/CMakeLists.txt	2025-03-09 16:55:49.343371000 -0700
@@ -0,0 +1,5 @@
+build_lib_example(
+  NAME adjacency-matrix-example
+  SOURCE_FILES adjacency-matrix-example.cc
+  LIBRARIES_TO_LINK ${libantenna}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/antenna/model/angles.cc ns-3.44/src/antenna/model/angles.cc
--- ns-3.43/src/antenna/model/angles.cc	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/src/antenna/model/angles.cc	2025-03-09 16:55:49.343371000 -0700
@@ -8,7 +8,7 @@
 
 #include "angles.h"
 
-#include <ns3/log.h>
+#include "ns3/log.h"
 
 #include <cmath>
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/antenna/model/angles.h ns-3.44/src/antenna/model/angles.h
--- ns-3.43/src/antenna/model/angles.h	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/src/antenna/model/angles.h	2025-03-09 16:55:49.343371000 -0700
@@ -9,7 +9,7 @@
 #ifndef ANGLES_H
 #define ANGLES_H
 
-#include <ns3/vector.h>
+#include "ns3/vector.h"
 
 #include <vector>
 
@@ -17,66 +17,66 @@
 {
 
 /**
- * \brief converts degrees to radians
+ * @brief converts degrees to radians
  *
- * \param degrees the angle in degrees
- * \return the angle in radians
+ * @param degrees the angle in degrees
+ * @return the angle in radians
  */
 double DegreesToRadians(double degrees);
 
 /**
- * \brief converts degrees to radians
+ * @brief converts degrees to radians
  *
- * \param degrees the angles in degrees
- * \return the angles in radians
+ * @param degrees the angles in degrees
+ * @return the angles in radians
  */
 std::vector<double> DegreesToRadians(const std::vector<double>& degrees);
 
 /**
- * \brief converts radians to degrees
+ * @brief converts radians to degrees
  *
- * \param radians the angle in radians
- * \return the angle in degrees
+ * @param radians the angle in radians
+ * @return the angle in degrees
  */
 double RadiansToDegrees(double radians);
 
 /**
- * \brief converts radians to degrees
+ * @brief converts radians to degrees
  *
- * \param radians the angles in radians
- * \return the angles in degrees
+ * @param radians the angles in radians
+ * @return the angles in degrees
  */
 std::vector<double> RadiansToDegrees(const std::vector<double>& radians);
 
 /**
- * \brief Wrap angle in [0, 360)
+ * @brief Wrap angle in [0, 360)
  *
- * \param a the angle in degrees
- * \return the wrapped angle in degrees
+ * @param a the angle in degrees
+ * @return the wrapped angle in degrees
  */
 double WrapTo360(double a);
 
 /**
- * \brief Wrap angle in [-180, 180)
+ * @brief Wrap angle in [-180, 180)
  *
- * \param a the angle in degrees
- * \return the wrapped angle in degrees
+ * @param a the angle in degrees
+ * @return the wrapped angle in degrees
  */
 double WrapTo180(double a);
 
 /**
- * \brief Wrap angle in [0, 2*M_PI)
+ * @brief Wrap angle in [0, 2*M_PI)
  *
- * \param a the angle in radians
- * \return the wrapped angle in radians
+ * @param a the angle in radians
+ * @return the wrapped angle in radians
  */
 double WrapTo2Pi(double a);
 
 /**
- * \brief Wrap angle in [-M_PI, M_PI)
+ * @brief Wrap angle in [-M_PI, M_PI)
  *
- * \param a the angle in radians
- * \return the wrapped angle in radians
+ * @param a the angle in radians
+ * @return the wrapped angle in radians
  */
 double WrapToPi(double a);
 
@@ -111,8 +111,8 @@
      * Inclination must be in [0, M_PI], while azimuth is
      * automatically normalized in [-M_PI, M_PI)
      *
-     * \param azimuth the azimuth angle in radians
-     * \param inclination the inclination angle in radians
+     * @param azimuth the azimuth angle in radians
+     * @param inclination the inclination angle in radians
      */
     Angles(double azimuth, double inclination);
 
@@ -122,7 +122,7 @@
      * Note: azimuth and inclination angles for a zero-length vector are not defined
      * and are thus initialized to NAN
      *
-     * \param v the 3D vector in cartesian coordinates
+     * @param v the 3D vector in cartesian coordinates
      *
      */
     Angles(Vector v);
@@ -131,8 +131,8 @@
      * This constructor initializes an Angles instance with the angles
      * of the spherical coordinates of point v respect to point o
      *
-     * \param v the point (in cartesian coordinates) for which the angles are determined
-     * \param o the origin (in cartesian coordinates) of the spherical coordinate system
+     * @param v the point (in cartesian coordinates) for which the angles are determined
+     * @param o the origin (in cartesian coordinates) of the spherical coordinate system
      *
      */
     Angles(Vector v, Vector o);
@@ -140,46 +140,46 @@
     /**
      * Setter for azimuth angle
      *
-     * \param azimuth angle in radians
+     * @param azimuth angle in radians
      */
     void SetAzimuth(double azimuth);
 
     /**
      * Setter for inclination angle
      *
-     * \param inclination angle in radians. Must be in [0, M_PI]
+     * @param inclination angle in radians. Must be in [0, M_PI]
      */
     void SetInclination(double inclination);
 
     /**
      * Getter for azimuth angle
      *
-     * \return azimuth angle in radians
+     * @return azimuth angle in radians
      */
     double GetAzimuth() const;
 
     /**
      * Getter for inclination angle
      *
-     * \return inclination angle in radians
+     * @return inclination angle in radians
      */
     double GetInclination() const;
 
     // friend methods
     /**
-     * \brief Stream insertion operator.
+     * @brief Stream insertion operator.
      *
-     * \param [in] os The reference to the output stream.
-     * \param [in] a The angle.
-     * \returns The reference to the output stream.
+     * @param [in] os The reference to the output stream.
+     * @param [in] a The angle.
+     * @returns The reference to the output stream.
      */
     friend std::ostream& operator<<(std::ostream& os, const Angles& a);
     /**
-     * \brief Stream extraction operator.
+     * @brief Stream extraction operator.
      *
-     * \param [in] is The reference to the input stream.
-     * \param [out] a The angle.
-     * \returns The reference to the input stream.
+     * @param [in] is The reference to the input stream.
+     * @param [out] a The angle.
+     * @returns The reference to the input stream.
      */
     friend std::istream& operator>>(std::istream& is, Angles& a);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/antenna/model/antenna-model.cc ns-3.44/src/antenna/model/antenna-model.cc
--- ns-3.43/src/antenna/model/antenna-model.cc	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/src/antenna/model/antenna-model.cc	2025-03-09 16:55:49.343371000 -0700
@@ -8,7 +8,7 @@
 
 #include "antenna-model.h"
 
-#include <ns3/log.h>
+#include "ns3/log.h"
 
 #include <cmath>
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/antenna/model/antenna-model.h ns-3.44/src/antenna/model/antenna-model.h
--- ns-3.43/src/antenna/model/antenna-model.h	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/src/antenna/model/antenna-model.h	2025-03-09 16:55:49.343371000 -0700
@@ -11,27 +11,27 @@
 
 #include "angles.h"
 
-#include <ns3/object.h>
+#include "ns3/object.h"
 
 namespace ns3
 {
 
 /**
- * \defgroup antenna Antenna module
- * \brief This module contains several antenna
+ * @defgroup antenna Antenna module
+ * @brief This module contains several antenna
  * radiation pattern models.
  */
 
 /**
- * \ingroup antenna
- * \ingroup tests
- * \defgroup antenna-tests Antenna module tests
+ * @ingroup antenna
+ * @ingroup tests
+ * @defgroup antenna-tests Antenna module tests
  */
 
 /**
- * \ingroup antenna
+ * @ingroup antenna
  *
- * \brief interface for antenna radiation pattern models
+ * @brief interface for antenna radiation pattern models
  *
  * This class provides an interface for the definition of antenna
  * radiation pattern models. This interface is based on the use of
@@ -47,18 +47,18 @@
     ~AntennaModel() override;
 
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
     /**
      * this method is expected to be re-implemented by each antenna model
      *
-     * \param a the spherical angles at which the radiation pattern should
+     * @param a the spherical angles at which the radiation pattern should
      * be evaluated
      *
-     * \return the power gain in dBi of the antenna radiation pattern at
+     * @return the power gain in dBi of the antenna radiation pattern at
      * the specified angles; dBi means dB with respect to the gain of an
      * isotropic radiator. Since a power gain is used, the efficiency of
      * the antenna is expected to be included in the gain value.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/antenna/model/circular-aperture-antenna-model.cc ns-3.44/src/antenna/model/circular-aperture-antenna-model.cc
--- ns-3.43/src/antenna/model/circular-aperture-antenna-model.cc	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/src/antenna/model/circular-aperture-antenna-model.cc	2025-03-09 16:55:49.343371000 -0700
@@ -16,14 +16,15 @@
 
 #include "antenna-model.h"
 
-#include <ns3/double.h>
-#include <ns3/log.h>
+#include "ns3/boolean.h"
+#include "ns3/double.h"
+#include "ns3/log.h"
 
 #include <math.h>
 
 /**
- * \file
- * \ingroup antenna
+ * @file
+ * @ingroup antenna
  * Class CircularApertureAntennaModel implementation.
  */
 
@@ -65,7 +66,12 @@
                           "The maximum gain value in dB of the antenna",
                           DoubleValue(1),
                           MakeDoubleAccessor(&CircularApertureAntennaModel::SetMaxGain),
-                          MakeDoubleChecker<double>(0.0));
+                          MakeDoubleChecker<double>(0.0))
+            .AddAttribute("ForceGainBounds",
+                          "Force GetGainDb to [AntennaMinGainDb, AntennaMaxGainDb] range",
+                          BooleanValue(true),
+                          MakeBooleanAccessor(&CircularApertureAntennaModel::m_forceGainBounds),
+                          MakeBooleanChecker());
     return tid;
 }
 
@@ -174,6 +180,10 @@
         gain = std::cyl_bessel_j(1, kasintheta) / kasintheta;
 #endif
         gain = 10 * log10(4 * gain * gain) + m_maxGain;
+        if (m_forceGainBounds)
+        {
+            gain = std::min(std::max(gain, m_minGain), m_maxGain);
+        }
     }
 
     return gain;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/antenna/model/circular-aperture-antenna-model.h ns-3.44/src/antenna/model/circular-aperture-antenna-model.h
--- ns-3.43/src/antenna/model/circular-aperture-antenna-model.h	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/src/antenna/model/circular-aperture-antenna-model.h	2025-03-09 16:55:49.343371000 -0700
@@ -11,18 +11,18 @@
 
 #include "antenna-model.h"
 
-#include <ns3/object.h>
+#include "ns3/object.h"
 
 /**
- * \file
- * \ingroup antenna
+ * @file
+ * @ingroup antenna
  * Class CircularApertureAntennaModel declaration
  */
 
 namespace ns3
 {
 /**
- * \brief Circular Aperture Antenna Model
+ * @brief Circular Aperture Antenna Model
  *
  * This class implements the circular aperture antenna as described in 3GPP 38.811 6.4.1
  * https://www.3gpp.org/ftp/Specs/archive/38_series/38.811 without the cosine approximation, thanks
@@ -41,79 +41,79 @@
 
     /**
      * Register this type.
-     * \return The object TypeId.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Set the antenna aperture radius
+     * @brief Set the antenna aperture radius
      *
      * Sets the antenna operating frequency, asserting that
      * the provided value is within the acceptable range [0, +inf[.
      *
-     * \param aMeter the strictly positive antenna radius in meters
+     * @param aMeter the strictly positive antenna radius in meters
      */
     void SetApertureRadius(double aMeter);
 
     /**
-     * \brief Return the antenna aperture radius
+     * @brief Return the antenna aperture radius
      *
-     * \return the antenna radius in meters
+     * @return the antenna radius in meters
      */
     double GetApertureRadius() const;
 
     /**
-     * \brief Set the antenna operating frequency.
+     * @brief Set the antenna operating frequency.
      *
      * Sets the antenna operating frequency, asserting that
      * the provided value is within the acceptable range [0, +inf[.
      *
-     * \param freqHz the strictly positive antenna operating frequency, in Hz
+     * @param freqHz the strictly positive antenna operating frequency, in Hz
      */
     void SetOperatingFrequency(double freqHz);
 
     /**
-     * \brief Return the antenna operating frequency
+     * @brief Return the antenna operating frequency
      *
-     * \return the antenna operating frequency, in Hz
+     * @return the antenna operating frequency, in Hz
      */
     double GetOperatingFrequency() const;
 
     /**
-     * \brief Set the antenna max gain
+     * @brief Set the antenna max gain
      *
-     * \param gainDb the antenna max gain in dB
+     * @param gainDb the antenna max gain in dB
      */
     void SetMaxGain(double gainDb);
 
     /**
-     * \brief Return the antenna max gain
+     * @brief Return the antenna max gain
      *
-     * \return the antenna max gain in dB
+     * @return the antenna max gain in dB
      */
     double GetMaxGain() const;
 
     /**
-     * \brief Set the antenna min gain
+     * @brief Set the antenna min gain
      *
-     * \param gainDb the antenna min gain in dB
+     * @param gainDb the antenna min gain in dB
      */
     void SetMinGain(double gainDb);
 
     /**
-     * \brief Return the antenna min gain
+     * @brief Return the antenna min gain
      *
-     * \return the antenna min gain in dB
+     * @return the antenna min gain in dB
      */
     double GetMinGain() const;
 
     /**
-     * \brief Get the gain in dB, using Bessel equation of first kind and first order.
+     * @brief Get the gain in dB, using Bessel equation of first kind and first order.
      *
-     * \param a the angle at which the gain need to be calculated with respect to the antenna
+     * @param a the angle at which the gain need to be calculated with respect to the antenna
      * bore sight
      *
-     * \return the antenna gain at the specified Angles a
+     * @return the antenna gain at the specified Angles a
      */
     double GetGainDb(Angles a) override;
 
@@ -122,6 +122,7 @@
     double m_operatingFrequencyHz; //!< antenna operating frequency in Hz
     double m_maxGain;              //!< antenna gain in dB towards the main orientation
     double m_minGain;              //!< antenna min gain in dB
+    bool m_forceGainBounds;        //!< enforce maximum and minimum gains (disabled for testing)
 };
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/antenna/model/cosine-antenna-model.cc ns-3.44/src/antenna/model/cosine-antenna-model.cc
--- ns-3.43/src/antenna/model/cosine-antenna-model.cc	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/src/antenna/model/cosine-antenna-model.cc	2025-03-09 16:55:49.343371000 -0700
@@ -10,8 +10,8 @@
 
 #include "antenna-model.h"
 
-#include <ns3/double.h>
-#include <ns3/log.h>
+#include "ns3/double.h"
+#include "ns3/log.h"
 
 #include <cmath>
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/antenna/model/cosine-antenna-model.h ns-3.44/src/antenna/model/cosine-antenna-model.h
--- ns-3.43/src/antenna/model/cosine-antenna-model.h	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/src/antenna/model/cosine-antenna-model.h	2025-03-09 16:55:49.343371000 -0700
@@ -11,15 +11,15 @@
 
 #include "antenna-model.h"
 
-#include <ns3/object.h>
+#include "ns3/object.h"
 
 namespace ns3
 {
 
 /**
- * \ingroup antenna
+ * @ingroup antenna
  *
- * \brief Cosine Antenna Model
+ * @brief Cosine Antenna Model
  *
  * This class implements the cosine model, similarly to what is described in:
  * Cosine Antenna Element, Mathworks, Phased Array System Toolbox (Sep. 2020)
@@ -40,8 +40,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
@@ -50,52 +50,52 @@
 
     /**
      * Get the vertical 3 dB beamwidth of the cosine antenna model.
-     * \return the vertical beamwidth in degrees
+     * @return the vertical beamwidth in degrees
      */
     double GetVerticalBeamwidth() const;
 
     /**
      * Get the horizontal 3 dB beamwidth of the cosine antenna model.
-     * \return the horizontal beamwidth in degrees
+     * @return the horizontal beamwidth in degrees
      */
     double GetHorizontalBeamwidth() const;
 
     /**
      * Get the horizontal orientation of the antenna element.
-     * \return the horizontal orientation in degrees
+     * @return the horizontal orientation in degrees
      */
     double GetOrientation() const;
 
   private:
     /**
      * Set the vertical 3 dB beamwidth (bilateral) of the cosine antenna model.
-     * \param verticalBeamwidthDegrees the vertical beamwidth in degrees
+     * @param verticalBeamwidthDegrees the vertical beamwidth in degrees
      */
     void SetVerticalBeamwidth(double verticalBeamwidthDegrees);
 
     /**
      * Set the horizontal 3 dB beamwidth (bilateral) of the cosine antenna model.
-     * \param horizontalBeamwidthDegrees the horizontal beamwidth in degrees
+     * @param horizontalBeamwidthDegrees the horizontal beamwidth in degrees
      */
     void SetHorizontalBeamwidth(double horizontalBeamwidthDegrees);
 
     /**
      * Set the horizontal orientation of the antenna element.
-     * \param orientationDegrees the horizontal orientation in degrees
+     * @param orientationDegrees the horizontal orientation in degrees
      */
     void SetOrientation(double orientationDegrees);
 
     /**
      * Compute the exponent of the cosine antenna model from the beamwidth
-     * \param beamwidthDegrees the beamwidth in degrees
-     * \return the exponent
+     * @param beamwidthDegrees the beamwidth in degrees
+     * @return the exponent
      */
     static double GetExponentFromBeamwidth(double beamwidthDegrees);
 
     /**
      * Compute the beamwidth of the cosine antenna model from the exponent
-     * \param exponent the exponent
-     * \return beamwidth in degrees
+     * @param exponent the exponent
+     * @return beamwidth in degrees
      */
     static double GetBeamwidthFromExponent(double exponent);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/antenna/model/isotropic-antenna-model.cc ns-3.44/src/antenna/model/isotropic-antenna-model.cc
--- ns-3.43/src/antenna/model/isotropic-antenna-model.cc	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/src/antenna/model/isotropic-antenna-model.cc	2025-03-09 16:55:49.343371000 -0700
@@ -10,8 +10,8 @@
 
 #include "antenna-model.h"
 
-#include <ns3/double.h>
-#include <ns3/log.h>
+#include "ns3/double.h"
+#include "ns3/log.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/antenna/model/isotropic-antenna-model.h ns-3.44/src/antenna/model/isotropic-antenna-model.h
--- ns-3.43/src/antenna/model/isotropic-antenna-model.h	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/src/antenna/model/isotropic-antenna-model.h	2025-03-09 16:55:49.343371000 -0700
@@ -11,15 +11,15 @@
 
 #include "antenna-model.h"
 
-#include <ns3/object.h>
+#include "ns3/object.h"
 
 namespace ns3
 {
 
 /**
- * \ingroup antenna
+ * @ingroup antenna
  *
- * \brief Isotropic antenna model
+ * @brief Isotropic antenna model
  *
  * This is the simplest antenna model. The gain of this antenna is the same in all directions.
  */
@@ -29,8 +29,8 @@
     IsotropicAntennaModel();
 
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/antenna/model/parabolic-antenna-model.cc ns-3.44/src/antenna/model/parabolic-antenna-model.cc
--- ns-3.43/src/antenna/model/parabolic-antenna-model.cc	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/src/antenna/model/parabolic-antenna-model.cc	2025-03-09 16:55:49.343371000 -0700
@@ -10,8 +10,8 @@
 
 #include "antenna-model.h"
 
-#include <ns3/double.h>
-#include <ns3/log.h>
+#include "ns3/double.h"
+#include "ns3/log.h"
 
 #include <cmath>
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/antenna/model/parabolic-antenna-model.h ns-3.44/src/antenna/model/parabolic-antenna-model.h
--- ns-3.43/src/antenna/model/parabolic-antenna-model.h	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/src/antenna/model/parabolic-antenna-model.h	2025-03-09 16:55:49.343371000 -0700
@@ -11,15 +11,15 @@
 
 #include "antenna-model.h"
 
-#include <ns3/object.h>
+#include "ns3/object.h"
 
 namespace ns3
 {
 
 /**
- * \ingroup antenna
+ * @ingroup antenna
  *
- * \brief  Antenna model based on a parabolic approximation of the main lobe radiation pattern.
+ * @brief  Antenna model based on a parabolic approximation of the main lobe radiation pattern.
  *
  * This class implements the parabolic model as described in some 3GPP document, e.g., R4-092042
  *
@@ -36,8 +36,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
@@ -47,22 +47,22 @@
     // attribute getters/setters
     /**
      * Set the Beam width
-     * \param beamwidthDegrees Beam width in degrees
+     * @param beamwidthDegrees Beam width in degrees
      */
     void SetBeamwidth(double beamwidthDegrees);
     /**
      * Get the Beam width
-     * \return beam width in degrees
+     * @return beam width in degrees
      */
     double GetBeamwidth() const;
     /**
      * Set the antenna orientation
-     * \param orientationDegrees antenna orientation in degrees
+     * @param orientationDegrees antenna orientation in degrees
      */
     void SetOrientation(double orientationDegrees);
     /**
      * Get the antenna orientation
-     * \return antenna orientation in degrees
+     * @return antenna orientation in degrees
      */
     double GetOrientation() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/antenna/model/phased-array-model.cc ns-3.44/src/antenna/model/phased-array-model.cc
--- ns-3.43/src/antenna/model/phased-array-model.cc	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/src/antenna/model/phased-array-model.cc	2025-03-09 16:55:49.343371000 -0700
@@ -8,16 +8,17 @@
 
 #include "isotropic-antenna-model.h"
 
-#include <ns3/boolean.h>
-#include <ns3/double.h>
-#include <ns3/log.h>
-#include <ns3/pointer.h>
-#include <ns3/uinteger.h>
+#include "ns3/boolean.h"
+#include "ns3/double.h"
+#include "ns3/log.h"
+#include "ns3/pointer.h"
+#include "ns3/uinteger.h"
 
 namespace ns3
 {
 
 uint32_t PhasedArrayModel::m_idCounter = 0;
+SymmetricAdjacencyMatrix<bool> PhasedArrayModel::m_outOfDateAntennaPairChannel;
 
 NS_LOG_COMPONENT_DEFINE("PhasedArrayModel");
 
@@ -27,6 +28,8 @@
     : m_isBfVectorValid{false}
 {
     m_id = m_idCounter++;
+    m_outOfDateAntennaPairChannel.AddRow();
+    m_outOfDateAntennaPairChannel.SetValueAdjacent(m_id, true);
 }
 
 PhasedArrayModel::~PhasedArrayModel()
@@ -137,4 +140,21 @@
     return m_id;
 }
 
+bool
+PhasedArrayModel::IsChannelOutOfDate(Ptr<const PhasedArrayModel> antennaB) const
+{
+    // Check that channel needs update
+    bool needsUpdate = m_outOfDateAntennaPairChannel.GetValue(m_id, antennaB->m_id);
+
+    // Assume the channel will be updated (needsUpdate == true), reset these
+    m_outOfDateAntennaPairChannel.SetValue(m_id, antennaB->m_id, false);
+    return needsUpdate;
+}
+
+void
+PhasedArrayModel::InvalidateChannels() const
+{
+    m_outOfDateAntennaPairChannel.SetValueAdjacent(m_id, true);
+}
+
 } /* namespace ns3 */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/antenna/model/phased-array-model.h ns-3.44/src/antenna/model/phased-array-model.h
--- ns-3.43/src/antenna/model/phased-array-model.h	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/src/antenna/model/phased-array-model.h	2025-03-09 16:55:49.343371000 -0700
@@ -10,8 +10,9 @@
 #include "angles.h"
 #include "antenna-model.h"
 
-#include <ns3/matrix-array.h>
-#include <ns3/object.h>
+#include "ns3/matrix-array.h"
+#include "ns3/object.h"
+#include "ns3/symmetric-adjacency-matrix.h"
 
 #include <complex>
 
@@ -19,9 +20,9 @@
 {
 
 /**
- * \ingroup antenna
+ * @ingroup antenna
  *
- * \brief Class implementing the phased array model virtual base class.
+ * @brief Class implementing the phased array model virtual base class.
  */
 class PhasedArrayModel : public Object
 {
@@ -37,8 +38,8 @@
     ~PhasedArrayModel() override;
 
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
@@ -46,10 +47,10 @@
     using ComplexVector = ComplexMatrixArray; //!< the underlying Valarray
 
     /**
-     * \brief Computes the Frobenius norm of the complex vector
+     * @brief Computes the Frobenius norm of the complex vector
      *
-     * \param complexVector on which to calculate Frobenius norm
-     * \return the Frobenius norm of the complex vector
+     * @param complexVector on which to calculate Frobenius norm
+     * @return the Frobenius norm of the complex vector
      */
     double norm(const ComplexVector& complexVector) const
     {
@@ -62,194 +63,211 @@
     }
 
     /**
-     * \brief Returns the location of the antenna element with the specified
+     * @brief Returns the location of the antenna element with the specified
      * index, normalized with respect to the wavelength.
-     * \param index the index of the antenna element
-     * \return the 3D vector that represents the position of the element
+     * @param index the index of the antenna element
+     * @return the 3D vector that represents the position of the element
      */
     virtual Vector GetElementLocation(uint64_t index) const = 0;
 
     /**
-     * \brief Returns the number of antenna elements
-     * \return the number of antenna elements
+     * @brief Returns the number of antenna elements
+     * @return the number of antenna elements
      */
     virtual size_t GetNumElems() const = 0;
 
     /**
-     * \brief Returns the horizontal and vertical components of the antenna element field
+     * @brief Returns the horizontal and vertical components of the antenna element field
      * pattern at the specified direction. Single polarization is considered.
-     * \param a the angle indicating the interested direction
-     * \param polIndex the index of the polarization for which will be retrieved the field
+     * @param a the angle indicating the interested direction
+     * @param polIndex the index of the polarization for which will be retrieved the field
      * pattern
-     * \return a pair in which the first element is the horizontal component of the field
+     * @return a pair in which the first element is the horizontal component of the field
      * pattern and the second element is the vertical component of the field pattern
      */
     virtual std::pair<double, double> GetElementFieldPattern(Angles a,
                                                              uint8_t polIndex = 0) const = 0;
 
     /**
-     * \brief Set the vertical number of ports
-     * \param nPorts the vertical number of ports
+     * @brief Set the vertical number of ports
+     * @param nPorts the vertical number of ports
      */
     virtual void SetNumVerticalPorts(uint16_t nPorts) = 0;
 
     /**
-     * \brief Set the horizontal number of ports
-     * \param nPorts the horizontal number of ports
+     * @brief Set the horizontal number of ports
+     * @param nPorts the horizontal number of ports
      */
     virtual void SetNumHorizontalPorts(uint16_t nPorts) = 0;
 
     /**
-     * \brief Get the vertical number of ports
-     * \return the vertical number of ports
+     * @brief Get the vertical number of ports
+     * @return the vertical number of ports
      */
     virtual uint16_t GetNumVerticalPorts() const = 0;
 
     /**
-     * \brief Get the horizontal number of ports
-     * \return the horizontal number of ports
+     * @brief Get the horizontal number of ports
+     * @return the horizontal number of ports
      */
     virtual uint16_t GetNumHorizontalPorts() const = 0;
 
     /**
-     * \brief Get the number of ports
-     * \return the number of ports
+     * @brief Get the number of ports
+     * @return the number of ports
      */
     virtual uint16_t GetNumPorts() const = 0;
 
     /**
-     * \brief Get the number of polarizations
-     * \return the number of polarizations
+     * @brief Get the number of polarizations
+     * @return the number of polarizations
      */
     virtual uint8_t GetNumPols() const = 0;
 
     /**
-     * \brief Get the vertical number of antenna elements per port
-     * \return the vertical number of antenna elements per port
+     * @brief Get the vertical number of antenna elements per port
+     * @return the vertical number of antenna elements per port
      */
     virtual size_t GetVElemsPerPort() const = 0;
     /**
-     * \brief Get the horizontal number of antenna elements per port
-     * \return the horizontal number of antenna elements per port
+     * @brief Get the horizontal number of antenna elements per port
+     * @return the horizontal number of antenna elements per port
      */
     virtual size_t GetHElemsPerPort() const = 0;
 
     /**
-     * \brief Get the number of elements per port
-     * \return the number of elements per port
+     * @brief Get the number of elements per port
+     * @return the number of elements per port
      */
     virtual size_t GetNumElemsPerPort() const = 0;
 
     /**
-     * \brief Set the number of columns
-     * \param nColumns the number of columns to be set
+     * @brief Set the number of columns
+     * @param nColumns the number of columns to be set
      */
     virtual void SetNumColumns(uint32_t nColumns) = 0;
 
     /**
-     * \brief Set the number of rows
-     * \param nRows the number of rows to be set
+     * @brief Set the number of rows
+     * @param nRows the number of rows to be set
      */
     virtual void SetNumRows(uint32_t nRows) = 0;
 
     /**
-     * \brief Get the number of columns
-     * \return the number of columns in the antenna array
+     * @brief Get the number of columns
+     * @return the number of columns in the antenna array
      */
     virtual uint32_t GetNumColumns() const = 0;
 
     /**
-     * \brief Get the number of rows
-     * \return the number of rows in the antenna array
+     * @brief Get the number of rows
+     * @return the number of rows in the antenna array
      */
     virtual uint32_t GetNumRows() const = 0;
 
     /**
-     * \brief Get the polarization slant angle
-     * \return the polarization slant angle
+     * @brief Get the polarization slant angle
+     * @return the polarization slant angle
      */
     virtual double GetPolSlant() const = 0;
 
     /**
-     * \brief Get the indication whether the antenna array is dual polarized
-     * \return Returns true if the antenna array is dual polarized
+     * @brief Get the indication whether the antenna array is dual polarized
+     * @return Returns true if the antenna array is dual polarized
      */
     virtual bool IsDualPol() const = 0;
 
     /**
-     * \brief Calculate the index in the antenna array from the port index and the element in the
+     * @brief Calculate the index in the antenna array from the port index and the element in the
      * port
-     * \param portIndex the port index
-     * \param subElementIndex the element index in the port
-     * \return the antenna element index in the antenna array
+     * @param portIndex the port index
+     * @param subElementIndex the element index in the port
+     * @return the antenna element index in the antenna array
      */
     virtual uint16_t ArrayIndexFromPortIndex(uint16_t portIndex,
                                              uint16_t subElementIndex) const = 0;
 
     /**
      * Returns the index of the polarization to which belongs that antenna element
-     * \param elementIndex the antenna element for which will be returned the polarization index
-     * \return the polarization index
+     * @param elementIndex the antenna element for which will be returned the polarization index
+     * @return the polarization index
      */
     virtual uint8_t GetElemPol(size_t elementIndex) const = 0;
 
     /**
      * Sets the beamforming vector to be used
-     * \param beamformingVector the beamforming vector
+     * @param beamformingVector the beamforming vector
      */
     void SetBeamformingVector(const ComplexVector& beamformingVector);
 
     /**
      * Returns the beamforming vector that is currently being used
-     * \return the current beamforming vector
+     * @return the current beamforming vector
      */
     ComplexVector GetBeamformingVector() const;
 
     /**
      * Returns the const reference of the beamforming vector that is currently being used
-     * \return the const reference of the current beamforming vector
+     * @return the const reference of the current beamforming vector
      */
     const PhasedArrayModel::ComplexVector& GetBeamformingVectorRef() const;
 
     /**
      * Returns the beamforming vector that points towards the specified position
-     * \param a the beamforming angle
-     * \return the beamforming vector
+     * @param a the beamforming angle
+     * @return the beamforming vector
      */
     ComplexVector GetBeamformingVector(Angles a) const;
 
     /**
      * Returns the steering vector that points toward the specified position
-     * \param a the steering angle
-     * \return the steering vector
+     * @param a the steering angle
+     * @return the steering vector
      */
     ComplexVector GetSteeringVector(Angles a) const;
 
     /**
      * Sets the antenna model to be used
-     * \param antennaElement the antenna model
+     * @param antennaElement the antenna model
      */
     void SetAntennaElement(Ptr<AntennaModel> antennaElement);
 
     /**
      * Returns a pointer to the AntennaModel instance used to model the elements of the array
-     * \return pointer to the AntennaModel instance
+     * @return pointer to the AntennaModel instance
      */
     Ptr<const AntennaModel> GetAntennaElement() const;
 
     /**
      * Returns the ID of this antenna array instance
-     * \return the ID value
+     * @return the ID value
      */
     uint32_t GetId() const;
 
+    /**
+     * Returns whether the channel needs to be updated due to antenna setting changes.
+     * @param antennaB the second antenna of the pair for the channel we want to check
+     * @return whether a channel update is needed due to antenna settings changes
+     */
+    bool IsChannelOutOfDate(Ptr<const PhasedArrayModel> antennaB) const;
+
   protected:
+    /**
+     * After changing the antenna settings, InvalidateChannels() should be called to mark
+     * up-to-date channels as out-of-date
+     */
+    void InvalidateChannels() const;
+
     ComplexVector m_beamformingVector;  //!< the beamforming vector in use
     Ptr<AntennaModel> m_antennaElement; //!< the model of the antenna element in use
     bool m_isBfVectorValid;             //!< ensures the validity of the beamforming vector
     static uint32_t
         m_idCounter;  //!< the ID counter that is used to determine the unique antenna array ID
     uint32_t m_id{0}; //!< the ID of this antenna array instance
+    static SymmetricAdjacencyMatrix<bool>
+        m_outOfDateAntennaPairChannel; //!< matrix indicating whether a channel matrix between a
+                                       //!< pair of antennas needs to be updated after a change in
+                                       //!< one of the antennas configurations
 };
 
 } /* namespace ns3 */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/antenna/model/three-gpp-antenna-model.cc ns-3.44/src/antenna/model/three-gpp-antenna-model.cc
--- ns-3.43/src/antenna/model/three-gpp-antenna-model.cc	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/src/antenna/model/three-gpp-antenna-model.cc	2025-03-09 16:55:49.343371000 -0700
@@ -8,8 +8,9 @@
 
 #include "antenna-model.h"
 
-#include <ns3/double.h>
-#include <ns3/log.h>
+#include "ns3/double.h"
+#include "ns3/enum.h"
+#include "ns3/log.h"
 
 #include <cmath>
 
@@ -23,20 +24,34 @@
 TypeId
 ThreeGppAntennaModel::GetTypeId()
 {
-    static TypeId tid = TypeId("ns3::ThreeGppAntennaModel")
-                            .SetParent<AntennaModel>()
-                            .SetGroupName("Antenna")
-                            .AddConstructor<ThreeGppAntennaModel>();
+    static TypeId tid =
+        TypeId("ns3::ThreeGppAntennaModel")
+            .SetParent<AntennaModel>()
+            .SetGroupName("Antenna")
+            .AddConstructor<ThreeGppAntennaModel>()
+            .AddAttribute(
+                "RadiationPattern",
+                "Radiation pattern of 3GPP antenna model",
+                EnumValue<RadiationPattern>(RadiationPattern::OUTDOOR),
+                MakeEnumAccessor<RadiationPattern>(&ThreeGppAntennaModel::SetRadiationPattern,
+                                                   &ThreeGppAntennaModel::GetRadiationPattern),
+                MakeEnumChecker<RadiationPattern>(RadiationPattern::OUTDOOR,
+                                                  "Outdoor",
+                                                  RadiationPattern::INDOOR,
+                                                  "Indoor"));
     return tid;
 }
 
 ThreeGppAntennaModel::ThreeGppAntennaModel()
-    : m_verticalBeamwidthDegrees{65},
-      m_horizontalBeamwidthDegrees{65},
-      m_aMax{30},
-      m_slaV{30},
-      m_geMax{8.0}
 {
+    SetRadiationPattern(RadiationPattern::OUTDOOR);
+}
+
+void
+ThreeGppAntennaModel::DoInitialize()
+{
+    NS_LOG_FUNCTION(this);
+    SetRadiationPattern(m_radiationPattern);
 }
 
 ThreeGppAntennaModel::~ThreeGppAntennaModel()
@@ -55,6 +70,49 @@
     return m_horizontalBeamwidthDegrees;
 }
 
+void
+ThreeGppAntennaModel::SetRadiationPattern(RadiationPattern pattern)
+{
+    m_radiationPattern = pattern;
+    switch (pattern)
+    {
+    case RadiationPattern::OUTDOOR:
+        SetOutdoorAntennaPattern();
+        break;
+    case RadiationPattern::INDOOR:
+        SetIndoorAntennaPattern();
+        break;
+    default:
+        NS_ABORT_MSG("Unknown radiation pattern");
+    }
+}
+
+ThreeGppAntennaModel::RadiationPattern
+ThreeGppAntennaModel::GetRadiationPattern() const
+{
+    return m_radiationPattern;
+}
+
+void
+ThreeGppAntennaModel::SetOutdoorAntennaPattern()
+{
+    m_verticalBeamwidthDegrees = 65;
+    m_horizontalBeamwidthDegrees = 65;
+    m_aMax = 30;
+    m_slaV = 30;
+    m_geMax = 8;
+}
+
+void
+ThreeGppAntennaModel::SetIndoorAntennaPattern()
+{
+    m_verticalBeamwidthDegrees = 90;
+    m_horizontalBeamwidthDegrees = 90;
+    m_aMax = 25;
+    m_slaV = 25;
+    m_geMax = 5;
+}
+
 double
 ThreeGppAntennaModel::GetSlaV() const
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/antenna/model/three-gpp-antenna-model.h ns-3.44/src/antenna/model/three-gpp-antenna-model.h
--- ns-3.43/src/antenna/model/three-gpp-antenna-model.h	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/src/antenna/model/three-gpp-antenna-model.h	2025-03-09 16:55:49.343371000 -0700
@@ -9,25 +9,34 @@
 
 #include "antenna-model.h"
 
-#include <ns3/object.h>
+#include "ns3/object.h"
 
 namespace ns3
 {
 
 /**
- * \brief  Antenna model based on a parabolic approximation of the main lobe radiation pattern.
+ * @brief  Antenna model based on a parabolic approximation of the main lobe radiation pattern.
  *
  * This class implements the parabolic model as described in 3GPP TR 38.901 v15.0.0
  */
 class ThreeGppAntennaModel : public AntennaModel
 {
   public:
+    /**
+     * The different antenna radiation patterns defined in ITU-R M.2412.
+     */
+    enum class RadiationPattern
+    {
+        OUTDOOR,
+        INDOOR
+    };
+
     ThreeGppAntennaModel();
     ~ThreeGppAntennaModel() override;
 
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
@@ -36,35 +45,62 @@
 
     /**
      * Get the vertical beamwidth of the antenna element.
-     * \return the vertical beamwidth in degrees
+     * @return the vertical beamwidth in degrees
      */
     double GetVerticalBeamwidth() const;
 
     /**
      * Get the horizontal beamwidth of the antenna element.
-     * \return the horizontal beamwidth in degrees
+     * @return the horizontal beamwidth in degrees
      */
     double GetHorizontalBeamwidth() const;
 
     /**
+     * Set the antenna radiation pattern
+     * @param pattern the antenna radiation pattern to used
+     */
+    void SetRadiationPattern(RadiationPattern pattern);
+
+    /**
+     * Get the antenna radiation pattern
+     * @return the radiation pattern of the antenna
+     */
+    RadiationPattern GetRadiationPattern() const;
+
+    /**
      * Get the side-lobe attenuation in the vertical direction of the antenna element.
-     * \return side-lobe attenuation in the vertical direction in dB
+     * @return side-lobe attenuation in the vertical direction in dB
      */
     double GetSlaV() const;
 
     /**
      * Get the maximum attenuation of the antenna element.
-     * \return the maximum attenuation in dB
+     * @return the maximum attenuation in dB
      */
     double GetMaxAttenuation() const;
 
     /**
      * Get the maximum directional gain of the antenna element.
-     * \return the maximum directional gain in dBi
+     * @return the maximum directional gain in dBi
      */
     double GetAntennaElementGain() const;
 
   private:
+    // Inherited from Object.
+    // Waits for the attribute values to be set before setting the radiation pattern values
+    void DoInitialize() override;
+
+    /**
+     * Set the radiation pattern Dense Urban – eMBB, Rural – eMBB, Urban Macro – mMTC, and Urban
+     * Macro - URLLC, Table 8-6 in Report ITU-R M.2412
+     */
+    void SetOutdoorAntennaPattern();
+
+    /**
+     * Set the radiation pattern for Indoor Hotspot - eMBB,  Table 8-7 in Report ITU-R M.2412
+     */
+    void SetIndoorAntennaPattern();
+
     double m_verticalBeamwidthDegrees; //!< beamwidth in the vertical direction \f$(\theta_{3dB})\f$
                                        //!< [deg]
     double m_horizontalBeamwidthDegrees; //!< beamwidth in the horizontal direction
@@ -72,6 +108,7 @@
     double m_aMax;                       //!< maximum attenuation (A_{max}) [dB]
     double m_slaV;  //!< side-lobe attenuation in the vertical direction (SLA_V) [dB]
     double m_geMax; //!< maximum directional gain of the antenna element (G_{E,max}) [dBi]
+    RadiationPattern m_radiationPattern; //!< current antenna radiation pattern
 };
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/antenna/model/uniform-planar-array.cc ns-3.44/src/antenna/model/uniform-planar-array.cc
--- ns-3.43/src/antenna/model/uniform-planar-array.cc	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/src/antenna/model/uniform-planar-array.cc	2025-03-09 16:55:49.343371000 -0700
@@ -6,10 +6,10 @@
 
 #include "uniform-planar-array.h"
 
-#include <ns3/boolean.h>
-#include <ns3/double.h>
-#include <ns3/log.h>
-#include <ns3/uinteger.h>
+#include "ns3/boolean.h"
+#include "ns3/double.h"
+#include "ns3/log.h"
+#include "ns3/uinteger.h"
 
 namespace ns3
 {
@@ -60,16 +60,18 @@
                           MakeUintegerAccessor(&UniformPlanarArray::SetNumRows,
                                                &UniformPlanarArray::GetNumRows),
                           MakeUintegerChecker<uint32_t>(1))
-            .AddAttribute("BearingAngle",
-                          "The bearing angle in radians",
-                          DoubleValue(0.0),
-                          MakeDoubleAccessor(&UniformPlanarArray::SetAlpha),
-                          MakeDoubleChecker<double>(-M_PI, M_PI))
-            .AddAttribute("DowntiltAngle",
-                          "The downtilt angle in radians",
-                          DoubleValue(0.0),
-                          MakeDoubleAccessor(&UniformPlanarArray::SetBeta),
-                          MakeDoubleChecker<double>(-M_PI, M_PI))
+            .AddAttribute(
+                "BearingAngle",
+                "The bearing angle in radians",
+                DoubleValue(0.0),
+                MakeDoubleAccessor(&UniformPlanarArray::SetAlpha, &UniformPlanarArray::GetAlpha),
+                MakeDoubleChecker<double>(-M_PI, M_PI))
+            .AddAttribute(
+                "DowntiltAngle",
+                "The downtilt angle in radians",
+                DoubleValue(0.0),
+                MakeDoubleAccessor(&UniformPlanarArray::SetBeta, &UniformPlanarArray::GetBeta),
+                MakeDoubleChecker<double>(-M_PI, M_PI))
             .AddAttribute("PolSlantAngle",
                           "The polarization slant angle in radians",
                           DoubleValue(0.0),
@@ -104,6 +106,7 @@
     if (n != m_numColumns)
     {
         m_isBfVectorValid = false;
+        InvalidateChannels();
     }
     m_numColumns = n;
 }
@@ -121,6 +124,7 @@
     if (n != m_numRows)
     {
         m_isBfVectorValid = false;
+        InvalidateChannels();
     }
     m_numRows = n;
 }
@@ -137,6 +141,7 @@
     m_alpha = alpha;
     m_cosAlpha = cos(m_alpha);
     m_sinAlpha = sin(m_alpha);
+    InvalidateChannels();
 }
 
 void
@@ -145,6 +150,7 @@
     m_beta = beta;
     m_cosBeta = cos(m_beta);
     m_sinBeta = sin(m_beta);
+    InvalidateChannels();
 }
 
 void
@@ -153,6 +159,7 @@
     m_polSlant = polSlant;
     m_cosPolSlant[0] = cos(m_polSlant);
     m_sinPolSlant[0] = sin(m_polSlant);
+    InvalidateChannels();
 }
 
 void
@@ -164,6 +171,7 @@
     if (s != m_disH)
     {
         m_isBfVectorValid = false;
+        InvalidateChannels();
     }
     m_disH = s;
 }
@@ -183,6 +191,7 @@
     if (s != m_disV)
     {
         m_isBfVectorValid = false;
+        InvalidateChannels();
     }
     m_disV = s;
 }
@@ -290,6 +299,7 @@
     NS_ASSERT_MSG(((m_numRows % nPorts) == 0),
                   "The number of vertical ports must divide number of rows");
     m_numVPorts = nPorts;
+    InvalidateChannels();
 }
 
 void
@@ -299,6 +309,7 @@
     NS_ASSERT_MSG(((m_numColumns % nPorts) == 0),
                   "The number of horizontal ports must divide number of columns");
     m_numHPorts = nPorts;
+    InvalidateChannels();
 }
 
 uint16_t
@@ -378,6 +389,19 @@
         m_cosPolSlant[1] = cos(m_polSlant - M_PI / 2);
         m_sinPolSlant[1] = sin(m_polSlant - M_PI / 2);
     }
+    InvalidateChannels();
+}
+
+double
+UniformPlanarArray::GetAlpha() const
+{
+    return m_alpha;
+}
+
+double
+UniformPlanarArray::GetBeta() const
+{
+    return m_beta;
 }
 
 double
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/antenna/model/uniform-planar-array.h ns-3.44/src/antenna/model/uniform-planar-array.h
--- ns-3.43/src/antenna/model/uniform-planar-array.h	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/src/antenna/model/uniform-planar-array.h	2025-03-09 16:55:49.343371000 -0700
@@ -9,17 +9,17 @@
 
 #include "phased-array-model.h"
 
-#include <ns3/object.h>
+#include "ns3/object.h"
 
 namespace ns3
 {
 
 /**
- * \ingroup antenna
+ * @ingroup antenna
  *
- * \brief Class implementing Uniform Planar Array (UPA) model.
+ * @brief Class implementing Uniform Planar Array (UPA) model.
  *
- * \note the current implementation supports the modeling of antenna arrays
+ * @note the current implementation supports the modeling of antenna arrays
  * composed of a single panel and with single or dual polarization.
  */
 class UniformPlanarArray : public PhasedArrayModel
@@ -36,18 +36,18 @@
     ~UniformPlanarArray() override;
 
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
     /**
      * Returns the horizontal and vertical components of the antenna element field
      * pattern at the specified direction and for the specified polarization.
-     * \param a the angle indicating the interested direction
-     * \param polIndex the index of the polarization for which will be retrieved the field
+     * @param a the angle indicating the interested direction
+     * @param polIndex the index of the polarization for which will be retrieved the field
      * pattern
-     * \return a pair in which the first element is the horizontal component
+     * @return a pair in which the first element is the horizontal component
      *         of the field pattern and the second element is the vertical
      *         component of the field pattern
      */
@@ -66,8 +66,8 @@
      * In case of dual-polarized antennas, the antennas of the first and the second polarization
      * are overlapped in space.
      *
-     * \param index index of the antenna element
-     * \return the 3D vector that
+     * @param index index of the antenna element
+     * @return the 3D vector that
      * represents the position of the element
      */
     Vector GetElementLocation(uint64_t index) const override;
@@ -75,27 +75,39 @@
     /**
      *  Check if an antenna array contains dual-polarized elements
      *
-     * \return true if antenna has two polarization otherwise false
+     * @return true if antenna has two polarization otherwise false
      */
     bool IsDualPol() const override;
 
     /**
+     *  Returns bearing angle of first polarization
+     *  @return bearing angle in radians
+     */
+    double GetAlpha() const;
+
+    /**
+     *  Returns downtilt angle of first polarization
+     *  @return downtilt angle in radians
+     */
+    double GetBeta() const;
+
+    /**
      *  Returns polarization angle of first polarization
-     *  \return polarization angle in radians
+     *  @return polarization angle in radians
      */
     double GetPolSlant() const override;
 
     /**
      * Returns the number of polarizations, 2 in the case that
      * the antenna is dual-polarized, otherwise 1
-     * \return
+     * @return
      */
     uint8_t GetNumPols() const override;
 
     /**
      * Returns the number of total antenna elements. Note that if the antenna
      * is dual-polarized the number of total antenna elements is doubled.
-     * \return the number of antenna elements
+     * @return the number of antenna elements
      */
     size_t GetNumElems() const override;
 
@@ -103,13 +115,13 @@
      * Set the number of columns of the phased array
      * This method resets the stored beamforming vector to a ComplexVector
      * of the correct size, but zero-filled
-     * \param n the number of columns
+     * @param n the number of columns
      */
     void SetNumColumns(uint32_t n) override;
 
     /**
      * Get the number of columns of the phased array
-     * \return the number of columns
+     * @return the number of columns
      */
     uint32_t GetNumColumns() const override;
 
@@ -117,93 +129,93 @@
      * Set the number of rows of the phased array
      * This method resets the stored beamforming vector to a ComplexVector
      * of the correct size, but zero-filled
-     * \param n the number of rows
+     * @param n the number of rows
      */
     void SetNumRows(uint32_t n) override;
 
     /**
      * Get the number of rows of the phased array
-     * \return the number of rows
+     * @return the number of rows
      */
     uint32_t GetNumRows() const override;
 
     /**
      * Set the number of vertical antenna ports
-     * \param nPorts The number of vertical ports to be configured
+     * @param nPorts The number of vertical ports to be configured
      */
     void SetNumVerticalPorts(uint16_t nPorts) override;
 
     /**
      * Set the number of horizontal antenna ports
-     * \param nPorts
+     * @param nPorts
      */
     void SetNumHorizontalPorts(uint16_t nPorts) override;
 
     /**
      * Get the number of vertical antenna ports
-     * \return the number of vertical antenna ports
+     * @return the number of vertical antenna ports
      */
     uint16_t GetNumVerticalPorts() const override;
 
     /**
      * Get the number of horizontal antenna ports
-     * \return the number of horizontal antenna ports
+     * @return the number of horizontal antenna ports
      */
     uint16_t GetNumHorizontalPorts() const override;
 
     /**
      * Get the total number of antenna ports
-     * \return the number of antenna ports
+     * @return the number of antenna ports
      */
     uint16_t GetNumPorts() const override;
 
     /**
      * Get the number of vertical elements belonging to each port
-     * \return the number of vertical elements belonging of each port
+     * @return the number of vertical elements belonging of each port
      */
     size_t GetVElemsPerPort() const override;
 
     /**
      * Get the number of horizontal elements belonging to each port
-     * \return the number of horizontal elements belonging to each port
+     * @return the number of horizontal elements belonging to each port
      */
     size_t GetHElemsPerPort() const override;
 
     /**
      * Get the total number of elements belonging to each port
-     * \return the number of elements per port
+     * @return the number of elements per port
      */
     size_t GetNumElemsPerPort() const override;
 
     /**
      * Maps element within a port to an index of element within the antenna array
-     * \param portIndex the port index
-     * \param subElementIndex the element index within the port
-     * \return the element index in the antenna array
+     * @param portIndex the port index
+     * @param subElementIndex the element index within the port
+     * @return the element index in the antenna array
      */
     uint16_t ArrayIndexFromPortIndex(uint16_t portIndex, uint16_t subElementIndex) const override;
 
     /**
-     * \brief Set the bearing angle
+     * @brief Set the bearing angle
      * This method sets the bearing angle and
      * computes its cosine and sine
-     * \param alpha the bearing angle in radians
+     * @param alpha the bearing angle in radians
      */
     void SetAlpha(double alpha);
 
     /**
-     * \brief Set the downtilt angle
+     * @brief Set the downtilt angle
      * This method sets the downtilt angle and
      * computes its cosine and sine
-     * \param beta the downtilt angle in radians
+     * @param beta the downtilt angle in radians
      */
     void SetBeta(double beta);
 
     /**
-     * \brief Set the polarization slant angle
+     * @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
+     * @param polSlant the polarization slant angle in radians
      */
     void SetPolSlant(double polSlant);
 
@@ -211,13 +223,13 @@
      * Set the horizontal spacing for the antenna elements of the phased array
      * This method resets the stored beamforming vector to a ComplexVector
      * of the correct size, but zero-filled
-     * \param s the horizontal spacing in multiples of wavelength
+     * @param s the horizontal spacing in multiples of wavelength
      */
     void SetAntennaHorizontalSpacing(double s);
 
     /**
      * Get the horizontal spacing for the antenna elements of the phased array
-     * \return the horizontal spacing in multiples of wavelength
+     * @return the horizontal spacing in multiples of wavelength
      */
     double GetAntennaHorizontalSpacing() const;
 
@@ -225,27 +237,27 @@
      * Set the vertical spacing for the antenna elements of the phased array
      * This method resets the stored beamforming vector to a ComplexVector
      * of the correct size, but zero-filled
-     * \param s the vertical spacing in multiples of wavelength
+     * @param s the vertical spacing in multiples of wavelength
      */
     void SetAntennaVerticalSpacing(double s);
 
     /**
      * Get the vertical spacing for the antenna elements of the phased array
-     * \return the vertical spacing in multiples of wavelength
+     * @return the vertical spacing in multiples of wavelength
      */
     double GetAntennaVerticalSpacing() const;
 
     /**
      * Set the polarization
-     * \param isDualPol whether to set the antenna array to be dual-polarized,
+     * @param isDualPol whether to set the antenna array to be dual-polarized,
      * if true, antenna will be dual-polarized
      */
     void SetDualPol(bool isDualPol);
 
     /**
      * Returns the index of polarization to which belongs the antenna element with a specific index
-     * \param elemIndex the antenna element index
-     * \return the polarization index
+     * @param elemIndex the antenna element index
+     * @return the polarization index
      */
     uint8_t GetElemPol(size_t elemIndex) const override;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/antenna/test/test-adjacency-matrix.cc ns-3.44/src/antenna/test/test-adjacency-matrix.cc
--- ns-3.43/src/antenna/test/test-adjacency-matrix.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/antenna/test/test-adjacency-matrix.cc	2025-03-09 16:55:49.343371000 -0700
@@ -0,0 +1,130 @@
+/*
+ * Copyright (c) 2025 CTTC
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Author: Gabriel Ferreira <gabrielcarvfer@gmail.com>
+ */
+
+#include "ns3/symmetric-adjacency-matrix.h"
+#include "ns3/test.h"
+
+using namespace ns3;
+
+/**
+ * @ingroup antenna-tests
+ *
+ * @brief SymmetricAdjacencyMatrix Test Case
+ */
+class SymmetricAdjacencyMatrixTestCase : public TestCase
+{
+  public:
+    /**
+     * The constructor of the test case
+     */
+    SymmetricAdjacencyMatrixTestCase()
+        : TestCase("SymmetricAdjacencyMatrix test case"){};
+
+  private:
+    /**
+     * Run the test
+     */
+    void DoRun() override;
+};
+
+void
+SymmetricAdjacencyMatrixTestCase::DoRun()
+{
+    SymmetricAdjacencyMatrix<bool> boolAdj;
+    NS_TEST_EXPECT_MSG_EQ(boolAdj.GetRows(),
+                          0,
+                          "Should have 0 rows, but have " << boolAdj.GetRows());
+    boolAdj.AddRow();
+    NS_TEST_EXPECT_MSG_EQ(boolAdj.GetRows(),
+                          1,
+                          "Should have 1 rows, but have " << boolAdj.GetRows());
+    boolAdj.AddRow();
+    NS_TEST_EXPECT_MSG_EQ(boolAdj.GetRows(),
+                          2,
+                          "Should have 2 rows, but have " << boolAdj.GetRows());
+    boolAdj.AddRow();
+    NS_TEST_EXPECT_MSG_EQ(boolAdj.GetRows(),
+                          3,
+                          "Should have 3 rows, but have " << boolAdj.GetRows());
+    NS_TEST_EXPECT_MSG_EQ(boolAdj.GetValue(0, 0), false, "Should be set to false");
+    NS_TEST_EXPECT_MSG_EQ(boolAdj.GetValue(1, 0), false, "Should be set to false");
+    NS_TEST_EXPECT_MSG_EQ(boolAdj.GetValue(1, 1), false, "Should be set to false");
+    NS_TEST_EXPECT_MSG_EQ(boolAdj.GetValue(2, 0), false, "Should be set to false");
+    NS_TEST_EXPECT_MSG_EQ(boolAdj.GetValue(2, 1), false, "Should be set to false");
+    NS_TEST_EXPECT_MSG_EQ(boolAdj.GetValue(2, 2), false, "Should be set to false");
+
+    // Test constructor with arguments
+    boolAdj = SymmetricAdjacencyMatrix<bool>(3, true);
+    NS_TEST_EXPECT_MSG_EQ(boolAdj.GetValue(0, 0), true, "Should be set to false");
+    NS_TEST_EXPECT_MSG_EQ(boolAdj.GetValue(1, 0), true, "Should be set to false");
+    NS_TEST_EXPECT_MSG_EQ(boolAdj.GetValue(1, 1), true, "Should be set to false");
+    NS_TEST_EXPECT_MSG_EQ(boolAdj.GetValue(2, 0), true, "Should be set to false");
+    NS_TEST_EXPECT_MSG_EQ(boolAdj.GetValue(2, 1), true, "Should be set to false");
+    NS_TEST_EXPECT_MSG_EQ(boolAdj.GetValue(2, 2), true, "Should be set to false");
+
+    // Set value setting
+    boolAdj = SymmetricAdjacencyMatrix<bool>(4, false);
+    NS_TEST_EXPECT_MSG_EQ(boolAdj.GetRows(),
+                          4,
+                          "Should have 4 rows, but have " << boolAdj.GetRows());
+    for (int i = 0; i < 4; i++)
+    {
+        // Mark all adjacent values to row i to true
+        boolAdj.SetValueAdjacent(i, true);
+        for (int j = 0; j < 4; j++)
+        {
+            for (int k = 0; k < 4; k++)
+            {
+                // Check if adjacent values to i were marked as true
+                if (i == j || i == k)
+                {
+                    NS_TEST_EXPECT_MSG_EQ(boolAdj.GetValue(j, k), true, "Should be set to true");
+                    NS_TEST_EXPECT_MSG_EQ(boolAdj.GetValue(k, j), true, "Should be set to true");
+                }
+                else
+                {
+                    // Check if all other values are marked as false
+                    NS_TEST_EXPECT_MSG_EQ(boolAdj.GetValue(j, k), false, "Should be set to false");
+                    NS_TEST_EXPECT_MSG_EQ(boolAdj.GetValue(k, j), false, "Should be set to false");
+                }
+            }
+        }
+        // Reset values
+        for (int j = 0; j < 4; j++)
+        {
+            for (int k = 0; k < 4; k++)
+            {
+                if (i == j || i == k)
+                {
+                    boolAdj.SetValue(j, k, false);
+                    NS_TEST_EXPECT_MSG_EQ(boolAdj.GetValue(j, k), false, "Should be set to false");
+                    NS_TEST_EXPECT_MSG_EQ(boolAdj.GetValue(k, j), false, "Should be set to false");
+                }
+            }
+        }
+    }
+}
+
+/**
+ * @ingroup core-tests
+ *
+ * @brief AdjacencyMatrix Test Suite
+ */
+class AdjacencyMatrixTestSuite : public TestSuite
+{
+  public:
+    AdjacencyMatrixTestSuite();
+};
+
+AdjacencyMatrixTestSuite::AdjacencyMatrixTestSuite()
+    : TestSuite("adjacency-matrix-test", Type::UNIT)
+{
+    AddTestCase(new SymmetricAdjacencyMatrixTestCase(), TestCase::Duration::QUICK);
+}
+
+static AdjacencyMatrixTestSuite adjacencyMatrixTestSuiteInstance;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/antenna/test/test-angles.cc ns-3.44/src/antenna/test/test-angles.cc
--- ns-3.43/src/antenna/test/test-angles.cc	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/src/antenna/test/test-angles.cc	2025-03-09 16:55:49.343371000 -0700
@@ -6,9 +6,9 @@
  * Author: Nicola Baldo <nbaldo@cttc.es>
  */
 
-#include <ns3/antenna-model.h>
-#include <ns3/log.h>
-#include <ns3/test.h>
+#include "ns3/antenna-model.h"
+#include "ns3/log.h"
+#include "ns3/test.h"
 
 #include <cmath>
 #include <iostream>
@@ -18,23 +18,23 @@
 using namespace ns3;
 
 /**
- * \ingroup tests
+ * @ingroup tests
  *
- * \brief Angles Test using one vector for initialization
+ * @brief Angles Test using one vector for initialization
  */
 class OneVectorConstructorTestCase : public TestCase
 {
   public:
     /**
      * Build the test name
-     * \param v test parameter
-     * \return the test name
+     * @param v test parameter
+     * @return the test name
      */
     static std::string BuildNameString(Vector v);
     /**
      * Constructor
-     * \param v vector
-     * \param a expected angle
+     * @param v vector
+     * @param a expected angle
      */
     OneVectorConstructorTestCase(Vector v, Angles a);
 
@@ -69,25 +69,25 @@
 }
 
 /**
- * \ingroup tests
+ * @ingroup tests
  *
- * \brief Angles Test using two vectors for initialization
+ * @brief Angles Test using two vectors for initialization
  */
 class TwoVectorsConstructorTestCase : public TestCase
 {
   public:
     /**
      * Build the test name
-     * \param v test parameter
-     * \param o test parameter
-     * \return the test name
+     * @param v test parameter
+     * @param o test parameter
+     * @return the test name
      */
     static std::string BuildNameString(Vector v, Vector o);
     /**
      * Constructor
-     * \param v point
-     * \param o origin
-     * \param a expected angle
+     * @param v point
+     * @param o origin
+     * @param a expected angle
      */
     TwoVectorsConstructorTestCase(Vector v, Vector o, Angles a);
 
@@ -126,9 +126,9 @@
 using WrapToRangeFunction = std::function<double(double)>;
 
 /**
- * \ingroup tests
+ * @ingroup tests
  *
- * \brief  Test bounds for various WrapTo... methods (WrapTo180, WrapTo360, WrapToPi, and WrapTo2Pi)
+ * @brief  Test bounds for various WrapTo... methods (WrapTo180, WrapTo360, WrapToPi, and WrapTo2Pi)
  * by using a std::function wrapper
  */
 class WrapToRangeTestCase : public TestCase
@@ -136,23 +136,23 @@
   public:
     /**
      * Build the test name
-     * \param lowerBound the lower bound of the WrapTo... function
-     * \param upperBound the upper bound of the WrapTo... function
-     * \return the test name
+     * @param lowerBound the lower bound of the WrapTo... function
+     * @param upperBound the upper bound of the WrapTo... function
+     * @return the test name
      */
     static std::string BuildNameString(double lowerBound, double upperBound);
     /**
      * Constructor
-     * \param wrapper for one of WrapTo180, WrapTo360, WrapToPi, and WrapTo2Pi
-     * \param lowerBound the corresponding lower bound
-     * \param upperBound the corresponding upper bound
+     * @param wrapper for one of WrapTo180, WrapTo360, WrapToPi, and WrapTo2Pi
+     * @param lowerBound the corresponding lower bound
+     * @param upperBound the corresponding upper bound
      */
     WrapToRangeTestCase(WrapToRangeFunction wrapper, double lowerBound, double upperBound);
 
   protected:
     /**
      * The given wrapper shall wrap an angle into the expected range
-     * \param wrapPoint an angle
+     * @param wrapPoint an angle
      */
     void CheckWrappingPoint(double wrapPoint);
 
@@ -215,25 +215,25 @@
 }
 
 /**
- * \ingroup tests
+ * @ingroup tests
  *
- * \brief Test the output for WrapToRangeFunction
+ * @brief Test the output for WrapToRangeFunction
  */
 class WrapToRangeFunctionalTestCase : public TestCase
 {
   public:
     /**
      * Build the test name
-     * \param angle the angle
-     * \param wrappedAngle the expected result
-     * \return the test name
+     * @param angle the angle
+     * @param wrappedAngle the expected result
+     * @return the test name
      */
     static std::string BuildNameString(double angle, double wrappedAngle);
     /**
      * Constructor
-     * \param wrapper one WrapToRangeFunction
-     * \param angle the angle
-     * \param wrappedAngle the expected result
+     * @param wrapper one WrapToRangeFunction
+     * @param angle the angle
+     * @param wrappedAngle the expected result
      */
     WrapToRangeFunctionalTestCase(WrapToRangeFunction wrapper, double angle, double wrappedAngle);
 
@@ -274,9 +274,9 @@
 }
 
 /**
- * \ingroup tests
+ * @ingroup tests
  *
- * \brief Angles TestSuite
+ * @brief Angles TestSuite
  */
 class AnglesTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/antenna/test/test-circular-aperture-antenna.cc ns-3.44/src/antenna/test/test-circular-aperture-antenna.cc
--- ns-3.43/src/antenna/test/test-circular-aperture-antenna.cc	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/src/antenna/test/test-circular-aperture-antenna.cc	2025-03-09 16:55:49.343371000 -0700
@@ -4,6 +4,7 @@
  *   SPDX-License-Identifier: GPL-2.0-only
  */
 
+#include "ns3/boolean.h"
 #include "ns3/circular-aperture-antenna-model.h"
 #include "ns3/double.h"
 #include "ns3/log.h"
@@ -23,9 +24,9 @@
 NS_LOG_COMPONENT_DEFINE("TestCircularApertureAntennaModel");
 
 /**
- * \ingroup antenna-tests
+ * @ingroup antenna-tests
  *
- * \brief CircularApertureAntennaModel Test Case
+ * @brief CircularApertureAntennaModel Test Case
  *
  * Note: Since Clang libc++ does not support the Mathematical special functions (P0226R1) yet, this
  * class falls back to Boost's implementation of cyl_bessel_j whenever the above standard library is
@@ -37,7 +38,7 @@
     CircularApertureAntennaModelTestCase();
 
     /**
-     * \brief Description of a single test point
+     * @brief Description of a single test point
      *
      * Description of a test point, which is characterized
      * by the CircularApertureAntennaModel parameters,
@@ -56,6 +57,7 @@
          * @param testAzimuth test azimuth [rad]
          * @param testInclination test inclination [rad]
          * @param expectedGain the expected gain value [dB]
+         * @param forceGainBounds restrict or not gain range to [antennaMinGainDb, antennaMaxGainDb]
          */
         TestPoint(double antennaMaxGainDb,
                   double antennaMinGainDb,
@@ -63,14 +65,16 @@
                   double operatingFrequency,
                   double testAzimuth,
                   double testInclination,
-                  double expectedGain)
+                  double expectedGain,
+                  bool forceGainBounds)
             : m_antennaMaxGainDb(antennaMaxGainDb),
               m_antennaMinGainDb(antennaMinGainDb),
               m_antennaCircularApertureRadius(antennaCircularApertureRadius),
               m_operatingFrequency(operatingFrequency),
               m_testAzimuth(DegreesToRadians(testAzimuth)),
               m_testInclination(DegreesToRadians(testInclination)),
-              m_expectedGain(expectedGain)
+              m_expectedGain(expectedGain),
+              m_forceGainBounds(forceGainBounds)
         {
         }
 
@@ -81,12 +85,13 @@
         double m_testAzimuth;                   ///< test azimuth [rad]
         double m_testInclination;               ///< test inclination [rad]
         double m_expectedGain;                  ///< the expected gain value [dB]
+        bool m_forceGainBounds;                 ///< enable bounds checking for GetGainDb
     };
 
     /**
      * Generate a string containing all relevant parameters
-     * \param testPoint the parameter configuration to be tested
-     * \return the string containing all relevant parameters
+     * @param testPoint the parameter configuration to be tested
+     * @return the string containing all relevant parameters
      */
     static std::string BuildNameString(TestPoint testPoint);
 
@@ -95,7 +100,7 @@
      * by comparing the antenna gain obtained using CircularApertureAntennaModel::GetGainDb
      * and the one obtained using MATLAB.
      *
-     * \param testPoint the parameter configuration to be tested
+     * @param testPoint the parameter configuration to be tested
      */
     void TestAntennaGain(TestPoint testPoint);
 
@@ -136,7 +141,9 @@
             "AntennaCircularApertureRadius",
             DoubleValue(testPoint.m_antennaCircularApertureRadius),
             "OperatingFrequency",
-            DoubleValue(testPoint.m_operatingFrequency));
+            DoubleValue(testPoint.m_operatingFrequency),
+            "ForceGainBounds",
+            BooleanValue(testPoint.m_forceGainBounds));
 
     Ptr<UniformPlanarArray> upa =
         CreateObjectWithAttributes<UniformPlanarArray>("AntennaElement",
@@ -164,45 +171,50 @@
         // MaxGainDb  MinGainDb  Radius (m)  Freq (Hz)   Azimuth (deg)  Incl (deg)  ExpGain (dB)
         // Test invariant: gain always equal to max gain at boresight (inclination 90, azimuth = 0)
         // for different frequency
-        {30, -30, 0.5, 2e9, 0, 90, 30},
-        {30, -30, 2, 20e9, 0, 90, 30},
+        {30, -30, 0.5, 2e9, 0, 90, 30, false},
+        {30, -30, 2, 20e9, 0, 90, 30, false},
         // Test invariant: gain always equal to max gain at boresight (inclination 90, azimuth = 0)
         // for different max gain
-        {20, -30, 0.5, 2e9, 0, 90, 20},
-        {10, -30, 2, 20e9, 0, 90, 10},
+        {20, -30, 0.5, 2e9, 0, 90, 20, false},
+        {10, -30, 2, 20e9, 0, 90, 10, false},
         // Test invariant: gain always equal to min gain outside of |theta| < 90 deg
         // for different frequency
-        {30, -100, 0.5, 2e9, 0, 0, -100},
-        {30, -100, 2, 20e9, 0, 0, -100},
+        {30, -100, 0.5, 2e9, 0, 0, -100, false},
+        {30, -100, 2, 20e9, 0, 0, -100, false},
         // Test invariant: gain always equal to min gain outside of |theta| < 90 deg
         // for different orientations
-        {30, -100, 0.5, 2e9, 180, 90, -100},
-        {30, -100, 2, 20e9, -180, 90, -100},
+        {30, -100, 0.5, 2e9, 180, 90, -100, false},
+        {30, -100, 2, 20e9, -180, 90, -100, false},
         // Fixed elevation to boresight (90deg) and azimuth varying in [-90, 0] deg with steps of 10
         // degrees
-        {0, -50, 0.10707, 28000000000, -90, 90, -50},
-        {0, -50, 0.10707, 28000000000, -80, 90, -49.8022},
-        {0, -50, 0.10707, 28000000000, -70, 90, -49.1656},
-        {0, -50, 0.10707, 28000000000, -60, 90, -60.9132},
-        {0, -50, 0.10707, 28000000000, -50, 90, -59.2368},
-        {0, -50, 0.10707, 28000000000, -40, 90, -44.6437},
-        {0, -50, 0.10707, 28000000000, -30, 90, -43.9686},
-        {0, -50, 0.10707, 28000000000, -20, 90, -36.3048},
-        {0, -50, 0.10707, 28000000000, -10, 90, -30.5363},
-        {0, -50, 0.10707, 28000000000, 0, 90, 0},
+        {0, -50, 0.10707, 28000000000, -90, 90, -50, false},
+        {0, -50, 0.10707, 28000000000, -80, 90, -49.8022, false},
+        {0, -50, 0.10707, 28000000000, -70, 90, -49.1656, false},
+        {0, -50, 0.10707, 28000000000, -60, 90, -60.9132, false},
+        {0, -50, 0.10707, 28000000000, -60, 90, -50, true},
+        {0, -50, 0.10707, 28000000000, -50, 90, -59.2368, false},
+        {0, -50, 0.10707, 28000000000, -50, 90, -50, true},
+        {0, -50, 0.10707, 28000000000, -40, 90, -44.6437, false},
+        {0, -50, 0.10707, 28000000000, -30, 90, -43.9686, false},
+        {0, -50, 0.10707, 28000000000, -20, 90, -36.3048, false},
+        {0, -50, 0.10707, 28000000000, -10, 90, -30.5363, false},
+        {0, -50, 0.10707, 28000000000, 0, 90, 0, false},
         // Fixed azimuth to boresight (0 deg) and azimuth varying in [0, 90] deg with steps of 9
         // degrees
-        {0, -50, 0.10707, 28e9, 0, 0, -50},
-        {0, -50, 0.10707, 28e9, 0, 9, -49.7256},
-        {0, -50, 0.10707, 28e9, 0, 18, -52.9214},
-        {0, -50, 0.10707, 28e9, 0, 27, -48.6077},
-        {0, -50, 0.10707, 28e9, 0, 36, -60.684},
-        {0, -50, 0.10707, 28e9, 0, 45, -55.1468},
-        {0, -50, 0.10707, 28e9, 0, 54, -42.9648},
-        {0, -50, 0.10707, 28e9, 0, 63, -45.6472},
-        {0, -50, 0.10707, 28e9, 0, 72, -48.6378},
-        {0, -50, 0.10707, 28e9, 0, 81, -35.1613},
-        {0, -50, 0.10707, 28e9, 0, 90, 0}};
+        {0, -50, 0.10707, 28e9, 0, 0, -50, false},
+        {0, -50, 0.10707, 28e9, 0, 9, -49.7256, false},
+        {0, -50, 0.10707, 28e9, 0, 18, -52.9214, false},
+        {0, -50, 0.10707, 28e9, 0, 18, -50, true},
+        {0, -50, 0.10707, 28e9, 0, 27, -48.6077, false},
+        {0, -50, 0.10707, 28e9, 0, 36, -60.684, false},
+        {0, -50, 0.10707, 28e9, 0, 36, -50, true},
+        {0, -50, 0.10707, 28e9, 0, 45, -55.1468, false},
+        {0, -50, 0.10707, 28e9, 0, 45, -50, true},
+        {0, -50, 0.10707, 28e9, 0, 54, -42.9648, false},
+        {0, -50, 0.10707, 28e9, 0, 63, -45.6472, false},
+        {0, -50, 0.10707, 28e9, 0, 72, -48.6378, false},
+        {0, -50, 0.10707, 28e9, 0, 81, -35.1613, false},
+        {0, -50, 0.10707, 28e9, 0, 90, 0, false}};
 
     // Call TestAntennaGain on each test point
     for (auto& point : testPoints)
@@ -212,9 +224,9 @@
 }
 
 /**
- * \ingroup antenna-tests
+ * @ingroup antenna-tests
  *
- * \brief UniformPlanarArray Test Suite
+ * @brief UniformPlanarArray Test Suite
  */
 class CircularApertureAntennaModelTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/antenna/test/test-cosine-antenna.cc ns-3.44/src/antenna/test/test-cosine-antenna.cc
--- ns-3.43/src/antenna/test/test-cosine-antenna.cc	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/src/antenna/test/test-cosine-antenna.cc	2025-03-09 16:55:49.343371000 -0700
@@ -6,11 +6,11 @@
  * Author: Nicola Baldo <nbaldo@cttc.es>
  */
 
-#include <ns3/cosine-antenna-model.h>
-#include <ns3/double.h>
-#include <ns3/log.h>
-#include <ns3/simulator.h>
-#include <ns3/test.h>
+#include "ns3/cosine-antenna-model.h"
+#include "ns3/double.h"
+#include "ns3/log.h"
+#include "ns3/simulator.h"
+#include "ns3/test.h"
 
 #include <cmath>
 #include <iostream>
@@ -22,9 +22,9 @@
 NS_LOG_COMPONENT_DEFINE("TestCosineAntennaModel");
 
 /**
- * \ingroup antenna-tests
+ * @ingroup antenna-tests
  *
- * \brief Test condition (equal to or less than)
+ * @brief Test condition (equal to or less than)
  */
 enum CosineAntennaModelGainTestCondition
 {
@@ -33,30 +33,30 @@
 };
 
 /**
- * \ingroup antenna-tests
+ * @ingroup antenna-tests
  *
- * \brief CosineAntennaModel Test
+ * @brief CosineAntennaModel Test
  */
 class CosineAntennaModelTestCase : public TestCase
 {
   public:
     /**
      * Build the test name
-     * \param a Antenna angle
-     * \param b Horizontal and Vertical Beamwidth
-     * \param o Orientation
-     * \param g MaxGain
-     * \return the test name
+     * @param a Antenna angle
+     * @param b Horizontal and Vertical Beamwidth
+     * @param o Orientation
+     * @param g MaxGain
+     * @return the test name
      */
     static std::string BuildNameString(Angles a, double b, double o, double g);
     /**
      * Constructor
-     * \param a Antenna angle
-     * \param b Horizontal and Vertical Beamwidth
-     * \param o Orientation
-     * \param g MaxGain
-     * \param expectedGainDb Expected antenna gain
-     * \param cond Test condition
+     * @param a Antenna angle
+     * @param b Horizontal and Vertical Beamwidth
+     * @param o Orientation
+     * @param g MaxGain
+     * @param expectedGainDb Expected antenna gain
+     * @param cond Test condition
      */
     CosineAntennaModelTestCase(Angles a,
                                double b,
@@ -129,9 +129,9 @@
 }
 
 /**
- * \ingroup antenna-tests
+ * @ingroup antenna-tests
  *
- * \brief CosineAntennaModel TestSuite
+ * @brief CosineAntennaModel TestSuite
  */
 class CosineAntennaModelTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/antenna/test/test-degrees-radians.cc ns-3.44/src/antenna/test/test-degrees-radians.cc
--- ns-3.43/src/antenna/test/test-degrees-radians.cc	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/src/antenna/test/test-degrees-radians.cc	2025-03-09 16:55:49.343371000 -0700
@@ -6,9 +6,9 @@
  * Author: Nicola Baldo <nbaldo@cttc.es>
  */
 
-#include <ns3/antenna-model.h>
-#include <ns3/log.h>
-#include <ns3/test.h>
+#include "ns3/antenna-model.h"
+#include "ns3/log.h"
+#include "ns3/test.h"
 
 #include <cmath>
 #include <iostream>
@@ -18,23 +18,23 @@
 using namespace ns3;
 
 /**
- * \ingroup tests
+ * @ingroup tests
  *
- * \brief Test degree to radians conversion
+ * @brief Test degree to radians conversion
  */
 class DegreesToRadiansTestCase : public TestCase
 {
   public:
     /**
      * Build the test name
-     * \param a test param
-     * \return the test name
+     * @param a test param
+     * @return the test name
      */
     static std::string BuildNameString(double a);
     /**
      * Constructor
-     * \param a angle in degrees
-     * \param b expected angle in radians
+     * @param a angle in degrees
+     * @param b expected angle in radians
      */
     DegreesToRadiansTestCase(double a, double b);
 
@@ -67,23 +67,23 @@
 }
 
 /**
- * \ingroup tests
+ * @ingroup tests
  *
- * \brief Test radians to degree conversion
+ * @brief Test radians to degree conversion
  */
 class RadiansToDegreesTestCase : public TestCase
 {
   public:
     /**
      * Build the test name
-     * \param a test param
-     * \return the test name
+     * @param a test param
+     * @return the test name
      */
     static std::string BuildNameString(double a);
     /**
      * Constructor
-     * \param a angle in radians
-     * \param b expected angle in degrees
+     * @param a angle in radians
+     * @param b expected angle in degrees
      */
     RadiansToDegreesTestCase(double a, double b);
 
@@ -116,9 +116,9 @@
 }
 
 /**
- * \ingroup tests
+ * @ingroup tests
  *
- * \brief TestSuite: degree to radians (and vice-versa) conversions
+ * @brief TestSuite: degree to radians (and vice-versa) conversions
  */
 class DegreesRadiansTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/antenna/test/test-isotropic-antenna.cc ns-3.44/src/antenna/test/test-isotropic-antenna.cc
--- ns-3.43/src/antenna/test/test-isotropic-antenna.cc	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/src/antenna/test/test-isotropic-antenna.cc	2025-03-09 16:55:49.343371000 -0700
@@ -6,9 +6,9 @@
  * Author: Nicola Baldo <nbaldo@cttc.es>
  */
 
-#include <ns3/isotropic-antenna-model.h>
-#include <ns3/log.h>
-#include <ns3/test.h>
+#include "ns3/isotropic-antenna-model.h"
+#include "ns3/log.h"
+#include "ns3/test.h"
 
 #include <cmath>
 #include <iostream>
@@ -18,23 +18,23 @@
 using namespace ns3;
 
 /**
- * \ingroup antenna-tests
+ * @ingroup antenna-tests
  *
- * \brief IsotropicAntennaModel Test
+ * @brief IsotropicAntennaModel Test
  */
 class IsotropicAntennaModelTestCase : public TestCase
 {
   public:
     /**
      * Build the test name
-     * \param a Antenna angle
-     * \return the test name
+     * @param a Antenna angle
+     * @return the test name
      */
     static std::string BuildNameString(Angles a);
     /**
      * Constructor
-     * \param a Antenna angle
-     * \param expectedGainDb Expected antenna gain
+     * @param a Antenna angle
+     * @param expectedGainDb Expected antenna gain
      */
     IsotropicAntennaModelTestCase(Angles a, double expectedGainDb);
 
@@ -72,9 +72,9 @@
 }
 
 /**
- * \ingroup antenna-tests
+ * @ingroup antenna-tests
  *
- * \brief IsotropicAntennaModel TestSuite
+ * @brief IsotropicAntennaModel TestSuite
  */
 class IsotropicAntennaModelTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/antenna/test/test-parabolic-antenna.cc ns-3.44/src/antenna/test/test-parabolic-antenna.cc
--- ns-3.43/src/antenna/test/test-parabolic-antenna.cc	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/src/antenna/test/test-parabolic-antenna.cc	2025-03-09 16:55:49.343371000 -0700
@@ -6,11 +6,11 @@
  * Author: Nicola Baldo <nbaldo@cttc.es>
  */
 
-#include <ns3/double.h>
-#include <ns3/log.h>
-#include <ns3/parabolic-antenna-model.h>
-#include <ns3/simulator.h>
-#include <ns3/test.h>
+#include "ns3/double.h"
+#include "ns3/log.h"
+#include "ns3/parabolic-antenna-model.h"
+#include "ns3/simulator.h"
+#include "ns3/test.h"
 
 #include <cmath>
 #include <iostream>
@@ -22,9 +22,9 @@
 NS_LOG_COMPONENT_DEFINE("TestParabolicAntennaModel");
 
 /**
- * \ingroup antenna-tests
+ * @ingroup antenna-tests
  *
- * \brief Test condition (equal to or less than)
+ * @brief Test condition (equal to or less than)
  */
 enum ParabolicAntennaModelGainTestCondition
 {
@@ -33,30 +33,30 @@
 };
 
 /**
- * \ingroup antenna-tests
+ * @ingroup antenna-tests
  *
- * \brief ParabolicAntennaModel Test
+ * @brief ParabolicAntennaModel Test
  */
 class ParabolicAntennaModelTestCase : public TestCase
 {
   public:
     /**
      * Build the test name
-     * \param a Antenna angle
-     * \param b Beamwidth
-     * \param o Orientation
-     * \param g MaxGain
-     * \return the test name
+     * @param a Antenna angle
+     * @param b Beamwidth
+     * @param o Orientation
+     * @param g MaxGain
+     * @return the test name
      */
     static std::string BuildNameString(Angles a, double b, double o, double g);
     /**
      * Constructor
-     * \param a Antenna angle
-     * \param b Beamwidth
-     * \param o Orientation
-     * \param g MaxGain
-     * \param expectedGainDb Expected antenna gain
-     * \param cond Test condition
+     * @param a Antenna angle
+     * @param b Beamwidth
+     * @param o Orientation
+     * @param g MaxGain
+     * @param expectedGainDb Expected antenna gain
+     * @param cond Test condition
      */
     ParabolicAntennaModelTestCase(Angles a,
                                   double b,
@@ -130,9 +130,9 @@
 }
 
 /**
- * \ingroup antenna-tests
+ * @ingroup antenna-tests
  *
- * \brief ParabolicAntennaModel TestSuite
+ * @brief ParabolicAntennaModel TestSuite
  */
 class ParabolicAntennaModelTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/antenna/test/test-uniform-planar-array.cc ns-3.44/src/antenna/test/test-uniform-planar-array.cc
--- ns-3.43/src/antenna/test/test-uniform-planar-array.cc	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/src/antenna/test/test-uniform-planar-array.cc	2025-03-09 16:55:49.343371000 -0700
@@ -24,24 +24,24 @@
 NS_LOG_COMPONENT_DEFINE("TestUniformPlanarArray");
 
 /**
- * \ingroup antenna-tests
+ * @ingroup antenna-tests
  *
- * \brief UniformPlanarArray Test Case
+ * @brief UniformPlanarArray Test Case
  */
 class UniformPlanarArrayTestCase : public TestCase
 {
   public:
     /**
      * Generate a string containing all relevant parameters
-     * \param element the antenna element
-     * \param rows the number of rows
-     * \param cols the number of columns
-     * \param rowSpace the row spacing
-     * \param colSpace the column spacing
-     * \param alpha the bearing angle
-     * \param beta the tilting angle
-     * \param direction the direction
-     * \return the string containing all relevant parameters
+     * @param element the antenna element
+     * @param rows the number of rows
+     * @param cols the number of columns
+     * @param rowSpace the row spacing
+     * @param colSpace the column spacing
+     * @param alpha the bearing angle
+     * @param beta the tilting angle
+     * @param direction the direction
+     * @return the string containing all relevant parameters
      */
     static std::string BuildNameString(Ptr<AntennaModel> element,
                                        uint32_t rows,
@@ -53,15 +53,15 @@
                                        Angles direction);
     /**
      * The constructor of the test case
-     * \param element the antenna element
-     * \param rows the number of rows
-     * \param cols the number of columns
-     * \param rowSpace the row spacing
-     * \param colSpace the column spacing
-     * \param alpha the bearing angle
-     * \param beta the tilting angle
-     * \param direction the direction
-     * \param expectedGainDb the expected antenna gain [dB]
+     * @param element the antenna element
+     * @param rows the number of rows
+     * @param cols the number of columns
+     * @param rowSpace the row spacing
+     * @param colSpace the column spacing
+     * @param alpha the bearing angle
+     * @param beta the tilting angle
+     * @param direction the direction
+     * @param expectedGainDb the expected antenna gain [dB]
      */
     UniformPlanarArrayTestCase(Ptr<AntennaModel> element,
                                uint32_t rows,
@@ -80,8 +80,8 @@
     void DoRun() override;
     /**
      * Compute the gain of the antenna array
-     * \param a the antenna array
-     * \return the gain of the antenna array [dB]
+     * @param a the antenna array
+     * @return the gain of the antenna array [dB]
      */
     double ComputeGain(Ptr<UniformPlanarArray> a);
 
@@ -193,9 +193,79 @@
 }
 
 /**
- * \ingroup antenna-tests
+ * @ingroup antenna-tests
  *
- * \brief UniformPlanarArray Test Suite
+ * @brief UpdateOnChange Test Case
+ */
+class UpdateOnChangeTestCase : public TestCase
+{
+  public:
+    /**
+     * The constructor of the test case
+     * @param element the antenna element
+     * @param name the test case name
+     */
+    UpdateOnChangeTestCase(Ptr<AntennaModel> element, std::string name)
+        : TestCase(name),
+          m_element(element){};
+
+  private:
+    /**
+     * Run the test
+     */
+    void DoRun() override;
+    Ptr<AntennaModel> m_element; //!< the antenna element
+};
+
+void
+UpdateOnChangeTestCase::DoRun()
+{
+    Ptr<UniformPlanarArray> ant = CreateObject<UniformPlanarArray>();
+    ant->SetAttribute("AntennaElement", PointerValue(m_element));
+    ant->SetAttribute("NumRows", UintegerValue(10));
+    ant->SetAttribute("NumColumns", UintegerValue(10));
+    ant->SetAttribute("AntennaVerticalSpacing", DoubleValue(0.5));
+    ant->SetAttribute("AntennaHorizontalSpacing", DoubleValue(0.5));
+    ant->SetAttribute("BearingAngle", DoubleValue(DegreesToRadians(0)));
+    ant->SetAttribute("DowntiltAngle", DoubleValue(DegreesToRadians(45)));
+
+    Ptr<UniformPlanarArray> ant2 = CreateObject<UniformPlanarArray>();
+    ant2->SetAttribute("AntennaElement", PointerValue(m_element));
+    ant2->SetAttribute("NumRows", UintegerValue(10));
+    ant2->SetAttribute("NumColumns", UintegerValue(10));
+    ant2->SetAttribute("AntennaVerticalSpacing", DoubleValue(0.5));
+    ant2->SetAttribute("AntennaHorizontalSpacing", DoubleValue(0.5));
+    ant2->SetAttribute("BearingAngle", DoubleValue(DegreesToRadians(0)));
+    ant2->SetAttribute("DowntiltAngle", DoubleValue(DegreesToRadians(45)));
+
+    NS_TEST_ASSERT_MSG_EQ(ant.operator bool(), true, "AntennaModel is not a PhasedArrayModel");
+
+    // Initial state of array requires a channel update
+    NS_TEST_ASSERT_MSG_EQ(ant->IsChannelOutOfDate(ant2),
+                          true,
+                          "Expecting update, since the pair was never setup");
+    NS_TEST_ASSERT_MSG_EQ(
+        ant2->IsChannelOutOfDate(ant),
+        false,
+        "Not expecting update, since the pair was just updated and no settings changed");
+    ant->SetAlpha(DegreesToRadians(90));
+    NS_TEST_ASSERT_MSG_EQ(ant2->IsChannelOutOfDate(ant),
+                          true,
+                          "Expecting update, antenna parameter changed");
+    NS_TEST_ASSERT_MSG_EQ(
+        ant->IsChannelOutOfDate(ant2),
+        false,
+        "Not expecting update, since the pair was just updated and no settings changed");
+    ant->SetAlpha(DegreesToRadians(90));
+    NS_TEST_ASSERT_MSG_EQ(ant->IsChannelOutOfDate(ant2),
+                          true,
+                          "Expecting update, antenna parameter changed");
+}
+
+/**
+ * @ingroup antenna-tests
+ *
+ * @brief UniformPlanarArray Test Suite
  */
 class UniformPlanarArrayTestSuite : public TestSuite
 {
@@ -377,6 +447,10 @@
                                                Angles(DegreesToRadians(0), DegreesToRadians(135)),
                                                28.0),
                 TestCase::Duration::QUICK);
+    AddTestCase(new UpdateOnChangeTestCase(tgpp,
+                                           "Test IsChannelOutOfDate() and InvalidateChannels() for "
+                                           "UniformPlanarArray with 3GPP antenna element"),
+                TestCase::Duration::QUICK);
 }
 
 static UniformPlanarArrayTestSuite staticUniformPlanarArrayTestSuiteInstance;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/antenna/utils/symmetric-adjacency-matrix.h ns-3.44/src/antenna/utils/symmetric-adjacency-matrix.h
--- ns-3.43/src/antenna/utils/symmetric-adjacency-matrix.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/antenna/utils/symmetric-adjacency-matrix.h	2025-03-09 16:55:49.343371000 -0700
@@ -0,0 +1,331 @@
+/* Copyright (c) 2025 CTTC
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Author: Gabriel Ferreira <gabrielcarvfer@gmail.com>
+ */
+
+#ifndef NS3_SYMMETRIC_ADJACENCY_MATRIX_H
+#define NS3_SYMMETRIC_ADJACENCY_MATRIX_H
+
+#include <vector>
+
+namespace ns3
+{
+
+/**
+ * @brief A class representing a symmetric adjacency matrix.
+ *
+ * Since the matrix is symmetric, we save up on memory by
+ * storing only the lower left triangle, including the main
+ * diagonal.
+ *
+ * In pseudocode, the matrix is stored as a vector m_matrix, where
+ * each new row is accessed via an offset precomputed in m_rowOffsets.
+ * We also keep track of the number of rows in m_rows.
+ *
+ * A 4x4 matrix would be represented as follows:
+ *
+ * @code
+ * m_matrix= [
+ * 0
+ * 1 2
+ * 3 4 5
+ * 6 7 8 9
+ * ];
+ * m_rowOffsets = [0, 1, 3, 6];
+ * m_rows = 4;
+ * @endcode
+ *
+ * To add a new row (`AddRow()`) in the adjacency matrix (equivalent to an additional node in a
+ bidirected graph),
+ * we need to first add a new offset, then increment the number of rows and finally resize the
+ vector.
+ *
+ * @code
+ * m_rowOffsets.push_back(m_matrix.size());
+ * m_rows++;
+ * m_matrix.resize(m_matrix.size()+m_rows);
+ * @endcode
+ *
+ * The resulting state would be:
+ *
+ * @code
+ * m_rowOffsets = [0, 1, 3, 6, 10];
+ * m_rows = 5;
+ * m_matrix= [
+ *  0
+ *  1  2
+ *  3  4  5
+ *  6  7  8  9
+ * 10 11 12 13 14
+ * ];
+ * @endcode
+ *
+ * In this previous example, the elements of the matrix are
+ * the offset of the values from the beginning of the vector.
+ *
+ * In practice, this matrix could store the state between a given
+ * pair of a link between two nodes. The state could be a boolean
+ * value, in case just tracking valid/invalid,
+ * connected/disconnected link, or numerical types to store
+ * weights, which can be used for routing algorithms.
+ *
+ * The `adjacency-matrix-example` illustrates the usage of the adjacency matrix
+ * in a routing example.
+ *
+ * First we set up the matrix with capacity for 10 nodes.
+ * All values are initialized to maximum, to indicate a disconnected node.
+ *
+ * @code
+ *  constexpr float maxFloat = std::numeric_limits<float>::max();
+ *  // Create routing weight matrix for 10 nodes and initialize weights to infinity (disconnected)
+ *  ns3::SymmetricAdjacencyMatrix<float> routeWeights(10, maxFloat);
+ * @endcode
+ *
+ * We can then map graph nodes into the table rows
+ * @code
+ *   // Node | Corresponding matrix row
+ *   //  A   | 0
+ *   //  B   | 1
+ *   //  C   | 2
+ *   //  D   | 3
+ *   //  E   | 4
+ *   //  F   | 5
+ *   //  G   | 6
+ *   //  H   | 7
+ *   //  I   | 8
+ *   //  J   | 9
+ * @endcode
+ *
+ * Then proceed to populate the matrix to reflect the graph
+ *
+ * @code
+ *   // A------5-------B-------------14-------C
+ *   // \               \                   /1|
+ *   //  \               3                 J  |
+ *   //   \               \               /1  | 7
+ *   //    4           E-2-F--4---G--3--H     |
+ *   //     \       8 /                  \    |
+ *   //      D--------                    10--I
+ *
+ *  // Distance from nodes to other nodes
+ *  routeWeights.SetValue(0, 1, 5);  // A-B=5
+ *  routeWeights.SetValue(1, 2, 14); // B-C=14
+ *  routeWeights.SetValue(0, 3, 4);  // A-D=4
+ *  routeWeights.SetValue(1, 5, 3);  // B-F=3
+ *  routeWeights.SetValue(2, 9, 1);  // C-J=1
+ *  routeWeights.SetValue(9, 7, 1);  // J-H=1
+ *  routeWeights.SetValue(2, 8, 7);  // C-I=7
+ *  routeWeights.SetValue(3, 4, 8);  // D-E=8
+ *  routeWeights.SetValue(4, 5, 2);  // E-F=2
+ *  routeWeights.SetValue(5, 6, 4);  // F-G=4
+ *  routeWeights.SetValue(6, 7, 3);  // G-H=3
+ *  routeWeights.SetValue(7, 8, 10); // H-I=10
+ * @endcode
+ *
+ * Then we set the weights from the nodes to themselves as 0
+ * @code
+ * for (size_t i=0; i < routeWeights.GetRows(); i++)
+ * {
+ *     routeWeights.SetValue(i, i, 0);
+ * }
+ * @endcode
+ *
+ * Create the known shortest paths
+ * @code
+ *  std::map<std::pair<int, int>, std::vector<int>> routeMap;
+ *  for (size_t i = 0; i < routeWeights.GetRows(); i++)
+ *  {
+ *      for (size_t j = 0; j < routeWeights.GetRows(); j++)
+ *      {
+ *          if (routeWeights.GetValue(i, j) != maxFloat)
+ *          {
+ *              if (i != j)
+ *              {
+ *                  routeMap[{i, j}] = {(int)i, (int)j};
+ *              }
+ *              else
+ *              {
+ *                  routeMap[{i, j}] = {(int)i};
+ *              }
+ *          }
+ *      }
+ *  }
+ *  @endcode
+ *
+ * And we finally can proceed to assemble paths between nodes
+ * and store them in a routing table. In this case, by brute-force
+ *
+ * @code
+ * for (size_t bridgeNode = 0; bridgeNode < routeWeights.GetRows(); bridgeNode++)
+ *  {
+ *      for (size_t srcNode = 0; srcNode < routeWeights.GetRows(); srcNode++)
+ *      {
+ *          for (size_t dstNode = 0; dstNode < routeWeights.GetRows(); dstNode++)
+ *          {
+ *              auto weightA = routeWeights.GetValue(srcNode, bridgeNode);
+ *              auto weightB = routeWeights.GetValue(bridgeNode, dstNode);
+ *              // If there is a path between A and bridge, plus bridge and B
+ *              if (std::max(weightA, weightB) == maxFloat)
+ *              {
+ *                  continue;
+ *              }
+ *              // Check if sum of weights is lower than existing path
+ *              auto weightAB = routeWeights.GetValue(srcNode, dstNode);
+ *              if (weightA + weightB < weightAB)
+ *              {
+ *                  // If it is, update adjacency matrix with the new weight of the shortest
+ *                  // path
+ *                  routeWeights.SetValue(srcNode, dstNode, weightA + weightB);
+ *
+ *                  // Retrieve the partial routes A->bridge and bridge->C,
+ *                  // and assemble the new route A->bridge->C
+ *                  const auto srcToBridgeRoute = routeMap.at({srcNode, bridgeNode});
+ *                  const auto bridgeToDstRoute = routeMap.at({bridgeNode, dstNode});
+ *                  std::vector<int> dst;
+ *                  dst.insert(dst.end(), srcToBridgeRoute.begin(), srcToBridgeRoute.end());
+ *                  dst.insert(dst.end(), bridgeToDstRoute.begin() + 1, bridgeToDstRoute.end());
+ *                  routeMap[{srcNode, dstNode}] = dst;
+ *
+ *                  // We also include the reverse path, since the graph is bidirectional
+ *                  std::vector<int> invDst(dst.rbegin(), dst.rend());
+ *                  routeMap[{dstNode, srcNode}] = invDst;
+ *              }
+ *          }
+ *      }
+ *  }
+ * @endcode
+ *
+ * After this, we have both the complete route, weight of the route, and the weights for each hop in
+ * the route.
+ *
+ * We can print all this information for a given route between nodes srcNodeOpt and
+ * dstNodeOpt with
+ *
+ * @code
+ * std::cout << "route between " << (char)(srcNodeOpt + 'A') << " and "
+ *            << (char)(dstNodeOpt + 'A') << " (length "
+ *            << routeWeights.GetValue(srcNodeOpt, dstNodeOpt) << "):";
+ *  auto lastNodeNumber = srcNodeOpt;
+ *  for (auto nodeNumber : routeMap.at({srcNodeOpt, dstNodeOpt}))
+ *  {
+ *      std::cout << "--" << routeWeights.GetValue(lastNodeNumber, nodeNumber) << "-->"
+ *                << (char)('A' + nodeNumber);
+ *      lastNodeNumber = nodeNumber;
+ *  }
+ * @endcode
+ *
+ * Which, for example, between nodes A and I, would print
+ *
+ * @verbatim
+   route between A and I (length 24):--0-->A--5-->B--3-->F--4-->G--3-->H--1-->J--1-->C--7-->I
+   @endverbatim
+ *
+ * In case one of the links is disconnected, the weights of the adjacency matrix can be reset
+ * with SetValueAdjacent(disconnectedNode, maxFloat).
+ *
+ * Note that, in this implementation, all the routes containing the node need to be removed from
+ * routeMap, and the search needs to be re-executed.
+ */
+template <typename T>
+class SymmetricAdjacencyMatrix
+{
+  public:
+    /**
+     * Default constructor
+     * @param [in] numRows The number of rows in the matrix
+     * @param [in] value The default initialization value of matrix
+     */
+    SymmetricAdjacencyMatrix(size_t numRows = 0, T value = {})
+    {
+        m_rows = numRows;
+        m_matrix.resize(m_rows * (m_rows + 1) / 2);
+        std::fill(m_matrix.begin(), m_matrix.end(), value);
+        for (size_t i = 0; i < numRows; i++)
+        {
+            m_rowOffsets.push_back(i * (i + 1) / 2);
+        }
+    };
+
+    /**
+     * @brief Retrieve the value of matrix (row, column) node
+     * @param [in] row The row of the matrix to retrieve the value
+     * @param [in] column  The column of the matrix to retrieve the value
+     * @return value retrieved from matrix (row, column) or matrix (column, row)
+     */
+    T GetValue(size_t row, size_t column)
+    {
+        // Highest id should be always row, since we have only half matrix
+        const auto maxIndex = std::max(row, column);
+        const auto minIndex = std::min(row, column);
+        return m_matrix.at(m_rowOffsets.at(maxIndex) + minIndex);
+    }
+
+    /**
+     * @brief Set the value of matrix (row, column) node
+     * @param [in] row The row of the matrix to set the value
+     * @param [in] column The column of the matrix to set the value
+     * @param [in] value value to be assigned to matrix (row, column) or matrix (column, row)
+     */
+    void SetValue(size_t row, size_t column, T value)
+    {
+        // Highest id should be always row, since we have only half matrix
+        const auto maxIndex = std::max(row, column);
+        const auto minIndex = std::min(row, column);
+        m_matrix.at(m_rowOffsets.at(maxIndex) + minIndex) = value;
+    }
+
+    /**
+     * @brief Set the value of adjacent nodes of a given node (all columns of a given row, and its
+     * reflection)
+     * @param [in] row The row of the matrix to set the value
+     * @param [in] value Value to be assigned to matrix (row, column) or matrix (column, row)
+     */
+    void SetValueAdjacent(size_t row, T value)
+    {
+        // Since we only store the lower-left half of the adjacency matrix,
+        // we need to set the adjacent values in both rows and columns involving this row id
+
+        // First set the columns of row m_id
+        for (size_t i = 0; i < row; i++)
+        {
+            m_matrix.at(m_rowOffsets.at(row) + i) = value;
+        }
+        // Then set the column m_id of rows >= m_id
+        for (size_t i = row; i < m_rows; i++)
+        {
+            m_matrix.at(m_rowOffsets.at(i) + row) = value;
+        }
+    }
+
+    /**
+     * @brief Add new row to the adjacency matrix
+     */
+    void AddRow()
+    {
+        m_rowOffsets.push_back(m_matrix.size());
+        m_rows++;
+        m_matrix.resize(m_matrix.size() + m_rows);
+    };
+
+    /**
+     * @brief Retrieve number of rows in the adjacency matrix
+     * @return the number of rows
+     */
+    size_t GetRows()
+    {
+        return m_rows;
+    }
+
+  private:
+    size_t m_rows; //!< Number of rows in matrix
+    std::vector<T>
+        m_matrix; //!< The adjacency matrix. For efficiency purposes, we store only lower
+                  //!< left half, including the main diagonal. It also is stored as a vector
+                  //!< not to introduce gaps between different rows or items (in case T = bool)
+    std::vector<size_t> m_rowOffsets; //!< Precomputed row starting offsets of m_matrix
+};
+
+} // namespace ns3
+#endif // NS3_SYMMETRIC_ADJACENCY_MATRIX_H
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/aodv/doc/aodv.h ns-3.44/src/aodv/doc/aodv.h
--- ns-3.43/src/aodv/doc/aodv.h	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/src/aodv/doc/aodv.h	2025-03-09 16:55:49.343371000 -0700
@@ -18,7 +18,7 @@
 #define AODV_H
 
 /**
- * \defgroup aodv AODV Routing
+ * @defgroup aodv AODV Routing
  *
  * This section documents the API of the ns-3 AODV module. For a generic functional description,
  * please refer to the ns-3 manual.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/aodv/examples/aodv-example.cc ns-3.44/src/aodv/examples/aodv-example.cc
--- ns-3.43/src/aodv/examples/aodv-example.cc	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/src/aodv/examples/aodv-example.cc	2025-03-09 16:55:49.343371000 -0700
@@ -23,15 +23,15 @@
 using namespace ns3;
 
 /**
- * \defgroup aodv-examples AODV Examples
- * \ingroup aodv
- * \ingroup examples
+ * @defgroup aodv-examples AODV Examples
+ * @ingroup aodv
+ * @ingroup examples
  */
 
 /**
- * \ingroup aodv-examples
- * \ingroup examples
- * \brief Test script.
+ * @ingroup aodv-examples
+ * @ingroup examples
+ * @brief Test script.
  *
  * This script creates 1-dimensional grid topology and then ping last node from the first one:
  *
@@ -49,17 +49,17 @@
   public:
     AodvExample();
     /**
-     * \brief Configure script parameters
-     * \param argc is the command line argument count
-     * \param argv is the command line arguments
-     * \return true on successful configuration
+     * @brief Configure script parameters
+     * @param argc is the command line argument count
+     * @param argv is the command line arguments
+     * @return true on successful configuration
      */
     bool Configure(int argc, char** argv);
     /// Run simulation
     void Run();
     /**
      * Report results
-     * \param os the output stream
+     * @param os the output stream
      */
     void Report(std::ostream& os);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/aodv/helper/aodv-helper.h ns-3.44/src/aodv/helper/aodv-helper.h
--- ns-3.43/src/aodv/helper/aodv-helper.h	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/src/aodv/helper/aodv-helper.h	2025-03-09 16:55:49.343371000 -0700
@@ -18,8 +18,8 @@
 namespace ns3
 {
 /**
- * \ingroup aodv
- * \brief Helper class that adds AODV routing to nodes.
+ * @ingroup aodv
+ * @brief Helper class that adds AODV routing to nodes.
  */
 class AodvHelper : public Ipv4RoutingHelper
 {
@@ -27,26 +27,26 @@
     AodvHelper();
 
     /**
-     * \returns pointer to clone of this AodvHelper
+     * @returns pointer to clone of this AodvHelper
      *
-     * \internal
+     * @internal
      * This method is mainly for internal use by the other helpers;
      * clients are expected to free the dynamic memory allocated by this method
      */
     AodvHelper* Copy() const override;
 
     /**
-     * \param node the node on which the routing protocol will run
-     * \returns a newly-created routing protocol
+     * @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
      *
-     * \todo support installing AODV on the subset of all available IP interfaces
+     * @todo support installing AODV on the subset of all available IP interfaces
      */
     Ptr<Ipv4RoutingProtocol> Create(Ptr<Node> node) const override;
     /**
-     * \param name the name of the attribute to set
-     * \param value the value of the attribute to set.
+     * @param name the name of the attribute to set
+     * @param value the value of the attribute to set.
      *
      * This method controls the attributes of ns3::aodv::RoutingProtocol
      */
@@ -57,10 +57,10 @@
      * have been assigned.  The Install() method of the InternetStackHelper
      * should have previously been called by the user.
      *
-     * \param stream first stream index to use
-     * \param c NodeContainer of the set of nodes for which AODV
+     * @param stream first stream index to use
+     * @param c NodeContainer of the set of nodes for which AODV
      *          should be modified to use a fixed stream
-     * \return the number of stream indices assigned by this helper
+     * @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.43/src/aodv/model/aodv-dpd.h ns-3.44/src/aodv/model/aodv-dpd.h
--- ns-3.43/src/aodv/model/aodv-dpd.h	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/src/aodv/model/aodv-dpd.h	2025-03-09 16:55:49.343371000 -0700
@@ -22,9 +22,9 @@
 namespace aodv
 {
 /**
- * \ingroup aodv
+ * @ingroup aodv
  *
- * \brief Helper class used to remember already seen packets and detect duplicates.
+ * @brief Helper class used to remember already seen packets and detect duplicates.
  *
  * Currently duplicate detection is based on unique packet ID given by Packet::GetUid ()
  * This approach is known to be weak (ns3::Packet UID is an internal identifier and not intended for
@@ -35,7 +35,7 @@
   public:
     /**
      * Constructor
-     * \param lifetime the lifetime for added entries
+     * @param lifetime the lifetime for added entries
      */
     DuplicatePacketDetection(Time lifetime)
         : m_idCache(lifetime)
@@ -44,19 +44,19 @@
 
     /**
      * Check if the packet is a duplicate. If not, save information about this packet.
-     * \param p the packet to check
-     * \param header the IP header to check
-     * \returns true if duplicate
+     * @param p the packet to check
+     * @param header the IP header to check
+     * @returns true if duplicate
      */
     bool IsDuplicate(Ptr<const Packet> p, const Ipv4Header& header);
     /**
      * Set duplicate record lifetime
-     * \param lifetime the lifetime for duplicate records
+     * @param lifetime the lifetime for duplicate records
      */
     void SetLifetime(Time lifetime);
     /**
      * Get duplicate record lifetime
-     * \returns the duplicate record lifetime
+     * @returns the duplicate record lifetime
      */
     Time GetLifetime() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/aodv/model/aodv-id-cache.h ns-3.44/src/aodv/model/aodv-id-cache.h
--- ns-3.43/src/aodv/model/aodv-id-cache.h	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/src/aodv/model/aodv-id-cache.h	2025-03-09 16:55:49.343371000 -0700
@@ -27,16 +27,16 @@
 namespace aodv
 {
 /**
- * \ingroup aodv
+ * @ingroup aodv
  *
- * \brief Unique packets identification cache used for simple duplicate detection.
+ * @brief Unique packets identification cache used for simple duplicate detection.
  */
 class IdCache
 {
   public:
     /**
      * constructor
-     * \param lifetime the lifetime for added entries
+     * @param lifetime the lifetime for added entries
      */
     IdCache(Time lifetime)
         : m_lifetime(lifetime)
@@ -45,21 +45,21 @@
 
     /**
      * Check that entry (addr, id) exists in cache. Add entry, if it doesn't exist.
-     * \param addr the IP address
-     * \param id the cache entry ID
-     * \returns true if the pair exists
+     * @param addr the IP address
+     * @param id the cache entry ID
+     * @returns true if the pair exists
      */
     bool IsDuplicate(Ipv4Address addr, uint32_t id);
     /// Remove all expired entries
     void Purge();
     /**
-     * \returns number of entries in cache
+     * @returns number of entries in cache
      */
     uint32_t GetSize();
 
     /**
      * Set lifetime for future added entries.
-     * \param lifetime the lifetime for entries
+     * @param lifetime the lifetime for entries
      */
     void SetLifetime(Time lifetime)
     {
@@ -68,7 +68,7 @@
 
     /**
      * Return lifetime for existing entries in cache
-     * \returns the lifetime
+     * @returns the lifetime
      */
     Time GetLifeTime() const
     {
@@ -88,15 +88,15 @@
     };
 
     /**
-     * \brief IsExpired structure
+     * @brief IsExpired structure
      */
     struct IsExpired
     {
         /**
-         * \brief Check if the entry is expired
+         * @brief Check if the entry is expired
          *
-         * \param u UniqueId entry
-         * \return true if expired, false otherwise
+         * @param u UniqueId entry
+         * @return true if expired, false otherwise
          */
         bool operator()(const UniqueId& u) const
         {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/aodv/model/aodv-neighbor.cc ns-3.44/src/aodv/model/aodv-neighbor.cc
--- ns-3.43/src/aodv/model/aodv-neighbor.cc	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/src/aodv/model/aodv-neighbor.cc	2025-03-09 16:55:49.343371000 -0700
@@ -61,7 +61,7 @@
             return (i->m_expireTime - Simulator::Now());
         }
     }
-    return Seconds(0);
+    return Time(0);
 }
 
 void
@@ -87,15 +87,15 @@
 }
 
 /**
- * \brief CloseNeighbor structure
+ * @brief CloseNeighbor structure
  */
 struct CloseNeighbor
 {
     /**
      * Check if the entry is expired
      *
-     * \param nb Neighbors::Neighbor entry
-     * \return true if expired, false otherwise
+     * @param nb Neighbors::Neighbor entry
+     * @return true if expired, false otherwise
      */
     bool operator()(const Neighbors::Neighbor& nb) const
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/aodv/model/aodv-neighbor.h ns-3.44/src/aodv/model/aodv-neighbor.h
--- ns-3.43/src/aodv/model/aodv-neighbor.h	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/src/aodv/model/aodv-neighbor.h	2025-03-09 16:55:49.343371000 -0700
@@ -36,15 +36,15 @@
 class RoutingProtocol;
 
 /**
- * \ingroup aodv
- * \brief maintain list of active neighbors
+ * @ingroup aodv
+ * @brief maintain list of active neighbors
  */
 class Neighbors
 {
   public:
     /**
      * constructor
-     * \param delay the delay time for purging the list of neighbors
+     * @param delay the delay time for purging the list of neighbors
      */
     Neighbors(Time delay);
 
@@ -61,11 +61,11 @@
         bool close;
 
         /**
-         * \brief Neighbor structure constructor
+         * @brief Neighbor structure constructor
          *
-         * \param ip Ipv4Address entry
-         * \param mac Mac48Address entry
-         * \param t Time expire time
+         * @param ip Ipv4Address entry
+         * @param mac Mac48Address entry
+         * @param t Time expire time
          */
         Neighbor(Ipv4Address ip, Mac48Address mac, Time t)
             : m_neighborAddress(ip),
@@ -78,20 +78,20 @@
 
     /**
      * Return expire time for neighbor node with address addr, if exists, else return 0.
-     * \param addr the IP address of the neighbor node
-     * \returns the expire time for the neighbor node
+     * @param addr the IP address of the neighbor node
+     * @returns the expire time for the neighbor node
      */
     Time GetExpireTime(Ipv4Address addr);
     /**
      * Check that node with address addr is neighbor
-     * \param addr the IP address to check
-     * \returns true if the node with IP address is a neighbor
+     * @param addr the IP address to check
+     * @returns true if the node with IP address is a neighbor
      */
     bool IsNeighbor(Ipv4Address addr);
     /**
      * Update expire time for entry with address addr, if it exists, else add new entry
-     * \param addr the IP address to check
-     * \param expire the expire time for the address
+     * @param addr the IP address to check
+     * @param expire the expire time for the address
      */
     void Update(Ipv4Address addr, Time expire);
     /// Remove all expired entries
@@ -107,18 +107,18 @@
 
     /**
      * Add ARP cache to be used to allow layer 2 notifications processing
-     * \param a pointer to the ARP cache to add
+     * @param a pointer to the ARP cache to add
      */
     void AddArpCache(Ptr<ArpCache> a);
     /**
      * Don't use given ARP cache any more (interface is down)
-     * \param a pointer to the ARP cache to delete
+     * @param a pointer to the ARP cache to delete
      */
     void DelArpCache(Ptr<ArpCache> a);
 
     /**
      * Get callback to ProcessTxError
-     * \returns the callback function
+     * @returns the callback function
      */
     Callback<void, const WifiMacHeader&> GetTxErrorCallback() const
     {
@@ -127,7 +127,7 @@
 
     /**
      * Set link failure callback
-     * \param cb the callback function
+     * @param cb the callback function
      */
     void SetCallback(Callback<void, Ipv4Address> cb)
     {
@@ -136,7 +136,7 @@
 
     /**
      * Get link failure callback
-     * \returns the link failure callback
+     * @returns the link failure callback
      */
     Callback<void, Ipv4Address> GetCallback() const
     {
@@ -158,13 +158,13 @@
     /**
      * Find MAC address by IP using list of ARP caches
      *
-     * \param addr the IP address to lookup
-     * \returns the MAC address for the IP address
+     * @param addr the IP address to lookup
+     * @returns the MAC address for the IP address
      */
     Mac48Address LookupMacAddress(Ipv4Address addr);
     /**
      * Process layer 2 TX error notification
-     * \param hdr header of the packet
+     * @param hdr header of the packet
      */
     void ProcessTxError(const WifiMacHeader& hdr);
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/aodv/model/aodv-packet.h ns-3.44/src/aodv/model/aodv-packet.h
--- ns-3.43/src/aodv/model/aodv-packet.h	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/src/aodv/model/aodv-packet.h	2025-03-09 16:55:49.343371000 -0700
@@ -30,8 +30,8 @@
 {
 
 /**
- * \ingroup aodv
- * \brief MessageType enumeration
+ * @ingroup aodv
+ * @brief MessageType enumeration
  */
 enum MessageType
 {
@@ -42,21 +42,21 @@
 };
 
 /**
- * \ingroup aodv
- * \brief AODV types
+ * @ingroup aodv
+ * @brief AODV types
  */
 class TypeHeader : public Header
 {
   public:
     /**
      * constructor
-     * \param t the AODV RREQ type
+     * @param t the AODV RREQ type
      */
     TypeHeader(MessageType t = AODVTYPE_RREQ);
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -66,7 +66,7 @@
     void Print(std::ostream& os) const override;
 
     /**
-     * \returns the type
+     * @returns the type
      */
     MessageType Get() const
     {
@@ -75,7 +75,7 @@
 
     /**
      * Check that type if valid
-     * \returns true if the type is valid
+     * @returns true if the type is valid
      */
     bool IsValid() const
     {
@@ -83,9 +83,9 @@
     }
 
     /**
-     * \brief Comparison operator
-     * \param o header to compare
-     * \return true if the headers are equal
+     * @brief Comparison operator
+     * @param o header to compare
+     * @return true if the headers are equal
      */
     bool operator==(const TypeHeader& o) const;
 
@@ -95,16 +95,16 @@
 };
 
 /**
- * \brief Stream output operator
- * \param os output stream
- * \param h the TypeHeader
- * \return updated stream
+ * @brief Stream output operator
+ * @param os output stream
+ * @param h the TypeHeader
+ * @return updated stream
  */
 std::ostream& operator<<(std::ostream& os, const TypeHeader& h);
 
 /**
-* \ingroup aodv
-* \brief   Route Request (RREQ) Message Format
+* @ingroup aodv
+* @brief   Route Request (RREQ) Message Format
   \verbatim
   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
@@ -129,14 +129,14 @@
     /**
      * constructor
      *
-     * \param flags the message flags (0)
-     * \param reserved the reserved bits (0)
-     * \param hopCount the hop count
-     * \param requestID the request ID
-     * \param dst the destination IP address
-     * \param dstSeqNo the destination sequence number
-     * \param origin the origin IP address
-     * \param originSeqNo the origin sequence number
+     * @param flags the message flags (0)
+     * @param reserved the reserved bits (0)
+     * @param hopCount the hop count
+     * @param requestID the request ID
+     * @param dst the destination IP address
+     * @param dstSeqNo the destination sequence number
+     * @param origin the origin IP address
+     * @param originSeqNo the origin sequence number
      */
     RreqHeader(uint8_t flags = 0,
                uint8_t reserved = 0,
@@ -148,8 +148,8 @@
                uint32_t originSeqNo = 0);
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -160,8 +160,8 @@
 
     // Fields
     /**
-     * \brief Set the hop count
-     * \param count the hop count
+     * @brief Set the hop count
+     * @param count the hop count
      */
     void SetHopCount(uint8_t count)
     {
@@ -169,8 +169,8 @@
     }
 
     /**
-     * \brief Get the hop count
-     * \return the hop count
+     * @brief Get the hop count
+     * @return the hop count
      */
     uint8_t GetHopCount() const
     {
@@ -178,8 +178,8 @@
     }
 
     /**
-     * \brief Set the request ID
-     * \param id the request ID
+     * @brief Set the request ID
+     * @param id the request ID
      */
     void SetId(uint32_t id)
     {
@@ -187,8 +187,8 @@
     }
 
     /**
-     * \brief Get the request ID
-     * \return the request ID
+     * @brief Get the request ID
+     * @return the request ID
      */
     uint32_t GetId() const
     {
@@ -196,8 +196,8 @@
     }
 
     /**
-     * \brief Set the destination address
-     * \param a the destination address
+     * @brief Set the destination address
+     * @param a the destination address
      */
     void SetDst(Ipv4Address a)
     {
@@ -205,8 +205,8 @@
     }
 
     /**
-     * \brief Get the destination address
-     * \return the destination address
+     * @brief Get the destination address
+     * @return the destination address
      */
     Ipv4Address GetDst() const
     {
@@ -214,8 +214,8 @@
     }
 
     /**
-     * \brief Set the destination sequence number
-     * \param s the destination sequence number
+     * @brief Set the destination sequence number
+     * @param s the destination sequence number
      */
     void SetDstSeqno(uint32_t s)
     {
@@ -223,8 +223,8 @@
     }
 
     /**
-     * \brief Get the destination sequence number
-     * \return the destination sequence number
+     * @brief Get the destination sequence number
+     * @return the destination sequence number
      */
     uint32_t GetDstSeqno() const
     {
@@ -232,8 +232,8 @@
     }
 
     /**
-     * \brief Set the origin address
-     * \param a the origin address
+     * @brief Set the origin address
+     * @param a the origin address
      */
     void SetOrigin(Ipv4Address a)
     {
@@ -241,8 +241,8 @@
     }
 
     /**
-     * \brief Get the origin address
-     * \return the origin address
+     * @brief Get the origin address
+     * @return the origin address
      */
     Ipv4Address GetOrigin() const
     {
@@ -250,8 +250,8 @@
     }
 
     /**
-     * \brief Set the origin sequence number
-     * \param s the origin sequence number
+     * @brief Set the origin sequence number
+     * @param s the origin sequence number
      */
     void SetOriginSeqno(uint32_t s)
     {
@@ -259,8 +259,8 @@
     }
 
     /**
-     * \brief Get the origin sequence number
-     * \return the origin sequence number
+     * @brief Get the origin sequence number
+     * @return the origin sequence number
      */
     uint32_t GetOriginSeqno() const
     {
@@ -269,40 +269,40 @@
 
     // Flags
     /**
-     * \brief Set the gratuitous RREP flag
-     * \param f the gratuitous RREP flag
+     * @brief Set the gratuitous RREP flag
+     * @param f the gratuitous RREP flag
      */
     void SetGratuitousRrep(bool f);
     /**
-     * \brief Get the gratuitous RREP flag
-     * \return the gratuitous RREP flag
+     * @brief Get the gratuitous RREP flag
+     * @return the gratuitous RREP flag
      */
     bool GetGratuitousRrep() const;
     /**
-     * \brief Set the Destination only flag
-     * \param f the Destination only flag
+     * @brief Set the Destination only flag
+     * @param f the Destination only flag
      */
     void SetDestinationOnly(bool f);
     /**
-     * \brief Get the Destination only flag
-     * \return the Destination only flag
+     * @brief Get the Destination only flag
+     * @return the Destination only flag
      */
     bool GetDestinationOnly() const;
     /**
-     * \brief Set the unknown sequence number flag
-     * \param f the unknown sequence number flag
+     * @brief Set the unknown sequence number flag
+     * @param f the unknown sequence number flag
      */
     void SetUnknownSeqno(bool f);
     /**
-     * \brief Get the unknown sequence number flag
-     * \return the unknown sequence number flag
+     * @brief Get the unknown sequence number flag
+     * @return the unknown sequence number flag
      */
     bool GetUnknownSeqno() const;
 
     /**
-     * \brief Comparison operator
-     * \param o RREQ header to compare
-     * \return true if the RREQ headers are equal
+     * @brief Comparison operator
+     * @param o RREQ header to compare
+     * @return true if the RREQ headers are equal
      */
     bool operator==(const RreqHeader& o) const;
 
@@ -318,15 +318,15 @@
 };
 
 /**
- * \brief Stream output operator
- * \param os output stream
- * \return updated stream
+ * @brief Stream output operator
+ * @param os output stream
+ * @return updated stream
  */
 std::ostream& operator<<(std::ostream& os, const RreqHeader&);
 
 /**
-* \ingroup aodv
-* \brief Route Reply (RREP) Message Format
+* @ingroup aodv
+* @brief Route Reply (RREP) Message Format
   \verbatim
   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
@@ -349,12 +349,12 @@
     /**
      * constructor
      *
-     * \param prefixSize the prefix size (0)
-     * \param hopCount the hop count (0)
-     * \param dst the destination IP address
-     * \param dstSeqNo the destination sequence number
-     * \param origin the origin IP address
-     * \param lifetime the lifetime
+     * @param prefixSize the prefix size (0)
+     * @param hopCount the hop count (0)
+     * @param dst the destination IP address
+     * @param dstSeqNo the destination sequence number
+     * @param origin the origin IP address
+     * @param lifetime the lifetime
      */
     RrepHeader(uint8_t prefixSize = 0,
                uint8_t hopCount = 0,
@@ -363,8 +363,8 @@
                Ipv4Address origin = Ipv4Address(),
                Time lifetime = MilliSeconds(0));
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -375,8 +375,8 @@
 
     // Fields
     /**
-     * \brief Set the hop count
-     * \param count the hop count
+     * @brief Set the hop count
+     * @param count the hop count
      */
     void SetHopCount(uint8_t count)
     {
@@ -384,8 +384,8 @@
     }
 
     /**
-     * \brief Get the hop count
-     * \return the hop count
+     * @brief Get the hop count
+     * @return the hop count
      */
     uint8_t GetHopCount() const
     {
@@ -393,8 +393,8 @@
     }
 
     /**
-     * \brief Set the destination address
-     * \param a the destination address
+     * @brief Set the destination address
+     * @param a the destination address
      */
     void SetDst(Ipv4Address a)
     {
@@ -402,8 +402,8 @@
     }
 
     /**
-     * \brief Get the destination address
-     * \return the destination address
+     * @brief Get the destination address
+     * @return the destination address
      */
     Ipv4Address GetDst() const
     {
@@ -411,8 +411,8 @@
     }
 
     /**
-     * \brief Set the destination sequence number
-     * \param s the destination sequence number
+     * @brief Set the destination sequence number
+     * @param s the destination sequence number
      */
     void SetDstSeqno(uint32_t s)
     {
@@ -420,8 +420,8 @@
     }
 
     /**
-     * \brief Get the destination sequence number
-     * \return the destination sequence number
+     * @brief Get the destination sequence number
+     * @return the destination sequence number
      */
     uint32_t GetDstSeqno() const
     {
@@ -429,8 +429,8 @@
     }
 
     /**
-     * \brief Set the origin address
-     * \param a the origin address
+     * @brief Set the origin address
+     * @param a the origin address
      */
     void SetOrigin(Ipv4Address a)
     {
@@ -438,8 +438,8 @@
     }
 
     /**
-     * \brief Get the origin address
-     * \return the origin address
+     * @brief Get the origin address
+     * @return the origin address
      */
     Ipv4Address GetOrigin() const
     {
@@ -447,51 +447,51 @@
     }
 
     /**
-     * \brief Set the lifetime
-     * \param t the lifetime
+     * @brief Set the lifetime
+     * @param t the lifetime
      */
     void SetLifeTime(Time t);
     /**
-     * \brief Get the lifetime
-     * \return the lifetime
+     * @brief Get the lifetime
+     * @return the lifetime
      */
     Time GetLifeTime() const;
 
     // Flags
     /**
-     * \brief Set the ack required flag
-     * \param f the ack required flag
+     * @brief Set the ack required flag
+     * @param f the ack required flag
      */
     void SetAckRequired(bool f);
     /**
-     * \brief get the ack required flag
-     * \return the ack required flag
+     * @brief get the ack required flag
+     * @return the ack required flag
      */
     bool GetAckRequired() const;
     /**
-     * \brief Set the prefix size
-     * \param sz the prefix size
+     * @brief Set the prefix size
+     * @param sz the prefix size
      */
     void SetPrefixSize(uint8_t sz);
     /**
-     * \brief Set the prefix size
-     * \return the prefix size
+     * @brief Set the prefix size
+     * @return the prefix size
      */
     uint8_t GetPrefixSize() const;
 
     /**
      * Configure RREP to be a Hello message
      *
-     * \param src the source IP address
-     * \param srcSeqNo the source sequence number
-     * \param lifetime the lifetime of the message
+     * @param src the source IP address
+     * @param srcSeqNo the source sequence number
+     * @param lifetime the lifetime of the message
      */
     void SetHello(Ipv4Address src, uint32_t srcSeqNo, Time lifetime);
 
     /**
-     * \brief Comparison operator
-     * \param o RREP header to compare
-     * \return true if the RREP headers are equal
+     * @brief Comparison operator
+     * @param o RREP header to compare
+     * @return true if the RREP headers are equal
      */
     bool operator==(const RrepHeader& o) const;
 
@@ -506,15 +506,15 @@
 };
 
 /**
- * \brief Stream output operator
- * \param os output stream
- * \return updated stream
+ * @brief Stream output operator
+ * @param os output stream
+ * @return updated stream
  */
 std::ostream& operator<<(std::ostream& os, const RrepHeader&);
 
 /**
-* \ingroup aodv
-* \brief Route Reply Acknowledgment (RREP-ACK) Message Format
+* @ingroup aodv
+* @brief Route Reply Acknowledgment (RREP-ACK) Message Format
   \verbatim
   0                   1
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
@@ -530,8 +530,8 @@
     RrepAckHeader();
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -541,9 +541,9 @@
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Comparison operator
-     * \param o RREP header to compare
-     * \return true if the RREQ headers are equal
+     * @brief Comparison operator
+     * @param o RREP header to compare
+     * @return true if the RREQ headers are equal
      */
     bool operator==(const RrepAckHeader& o) const;
 
@@ -552,15 +552,15 @@
 };
 
 /**
- * \brief Stream output operator
- * \param os output stream
- * \return updated stream
+ * @brief Stream output operator
+ * @param os output stream
+ * @return updated stream
  */
 std::ostream& operator<<(std::ostream& os, const RrepAckHeader&);
 
 /**
-* \ingroup aodv
-* \brief Route Error (RERR) Message Format
+* @ingroup aodv
+* @brief Route Error (RERR) Message Format
   \verbatim
   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
@@ -584,8 +584,8 @@
     RerrHeader();
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -596,35 +596,35 @@
 
     // No delete flag
     /**
-     * \brief Set the no delete flag
-     * \param f the no delete flag
+     * @brief Set the no delete flag
+     * @param f the no delete flag
      */
     void SetNoDelete(bool f);
     /**
-     * \brief Get the no delete flag
-     * \return the no delete flag
+     * @brief Get the no delete flag
+     * @return the no delete flag
      */
     bool GetNoDelete() const;
 
     /**
-     * \brief Add unreachable node address and its sequence number in RERR header
-     * \param dst unreachable IPv4 address
-     * \param seqNo unreachable sequence number
-     * \return false if we already added maximum possible number of unreachable destinations
+     * @brief Add unreachable node address and its sequence number in RERR header
+     * @param dst unreachable IPv4 address
+     * @param seqNo unreachable sequence number
+     * @return false if we already added maximum possible number of unreachable destinations
      */
     bool AddUnDestination(Ipv4Address dst, uint32_t seqNo);
     /**
-     * \brief Delete pair (address + sequence number) from REER header, if the number of unreachable
+     * @brief Delete pair (address + sequence number) from REER header, if the number of unreachable
      * destinations > 0
-     * \param un unreachable pair (address + sequence number)
-     * \return true on success
+     * @param un unreachable pair (address + sequence number)
+     * @return true on success
      */
     bool RemoveUnDestination(std::pair<Ipv4Address, uint32_t>& un);
     /// Clear header
     void Clear();
 
     /**
-     * \returns number of unreachable destinations in RERR message
+     * @returns number of unreachable destinations in RERR message
      */
     uint8_t GetDestCount() const
     {
@@ -632,9 +632,9 @@
     }
 
     /**
-     * \brief Comparison operator
-     * \param o RERR header to compare
-     * \return true if the RERR headers are equal
+     * @brief Comparison operator
+     * @param o RERR header to compare
+     * @return true if the RERR headers are equal
      */
     bool operator==(const RerrHeader& o) const;
 
@@ -647,9 +647,9 @@
 };
 
 /**
- * \brief Stream output operator
- * \param os output stream
- * \return updated stream
+ * @brief Stream output operator
+ * @param os output stream
+ * @return updated stream
  */
 std::ostream& operator<<(std::ostream& os, const RerrHeader&);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/aodv/model/aodv-routing-protocol.cc ns-3.44/src/aodv/model/aodv-routing-protocol.cc
--- ns-3.43/src/aodv/model/aodv-routing-protocol.cc	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/src/aodv/model/aodv-routing-protocol.cc	2025-03-09 16:55:49.343371000 -0700
@@ -51,15 +51,15 @@
 const uint32_t RoutingProtocol::AODV_PORT = 654;
 
 /**
- * \ingroup aodv
- * \brief Tag used by AODV implementation
+ * @ingroup aodv
+ * @brief Tag used by AODV implementation
  */
 class DeferredRouteOutputTag : public Tag
 {
   public:
     /**
-     * \brief Constructor
-     * \param o the output interface
+     * @brief Constructor
+     * @param o the output interface
      */
     DeferredRouteOutputTag(int32_t o = -1)
         : Tag(),
@@ -68,8 +68,8 @@
     }
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId()
     {
@@ -86,8 +86,8 @@
     }
 
     /**
-     * \brief Get the output interface
-     * \return the output interface
+     * @brief Get the output interface
+     * @return the output interface
      */
     int32_t GetInterface() const
     {
@@ -95,8 +95,8 @@
     }
 
     /**
-     * \brief Set the output interface
-     * \param oif the output interface
+     * @brief Set the output interface
+     * @param oif the output interface
      */
     void SetInterface(int32_t oif)
     {
@@ -167,7 +167,7 @@
       m_htimer(Timer::CANCEL_ON_DESTROY),
       m_rreqRateLimitTimer(Timer::CANCEL_ON_DESTROY),
       m_rerrRateLimitTimer(Timer::CANCEL_ON_DESTROY),
-      m_lastBcastTime(Seconds(0))
+      m_lastBcastTime()
 {
     m_nb.SetCallback(MakeCallback(&RoutingProtocol::SendRerrWhenBreaksLinkToNextHop, this));
 }
@@ -1145,7 +1145,7 @@
         }
         NS_LOG_DEBUG("Send RREQ with id " << rreqHeader.GetId() << " to socket");
         m_lastBcastTime = Simulator::Now();
-        Simulator::Schedule(Time(MilliSeconds(m_uniformRandomVariable->GetInteger(0, 10))),
+        Simulator::Schedule(MilliSeconds(m_uniformRandomVariable->GetInteger(0, 10)),
                             &RoutingProtocol::SendTo,
                             this,
                             socket,
@@ -1507,7 +1507,7 @@
             destination = iface.GetBroadcast();
         }
         m_lastBcastTime = Simulator::Now();
-        Simulator::Schedule(Time(MilliSeconds(m_uniformRandomVariable->GetInteger(0, 10))),
+        Simulator::Schedule(MilliSeconds(m_uniformRandomVariable->GetInteger(0, 10)),
                             &RoutingProtocol::SendTo,
                             this,
                             socket,
@@ -1930,8 +1930,8 @@
 RoutingProtocol::HelloTimerExpire()
 {
     NS_LOG_FUNCTION(this);
-    Time offset = Time(Seconds(0));
-    if (m_lastBcastTime > Time(Seconds(0)))
+    Time offset;
+    if (m_lastBcastTime.IsStrictlyPositive())
     {
         offset = Simulator::Now() - m_lastBcastTime;
         NS_LOG_DEBUG("Hello deferred due to last bcast at:" << m_lastBcastTime);
@@ -1942,8 +1942,8 @@
     }
     m_htimer.Cancel();
     Time diff = m_helloInterval - offset;
-    m_htimer.Schedule(std::max(Time(Seconds(0)), diff));
-    m_lastBcastTime = Time(Seconds(0));
+    m_htimer.Schedule(std::max(Seconds(0), diff));
+    m_lastBcastTime = Seconds(0);
 }
 
 void
@@ -2006,7 +2006,7 @@
         {
             destination = iface.GetBroadcast();
         }
-        Time jitter = Time(MilliSeconds(m_uniformRandomVariable->GetInteger(0, 10)));
+        Time jitter = MilliSeconds(m_uniformRandomVariable->GetInteger(0, 10));
         Simulator::Schedule(jitter, &RoutingProtocol::SendTo, this, socket, packet, destination);
     }
 }
@@ -2177,7 +2177,7 @@
             NS_LOG_LOGIC("one precursor => unicast RERR to "
                          << toPrecursor.GetDestination() << " from "
                          << toPrecursor.GetInterface().GetLocal());
-            Simulator::Schedule(Time(MilliSeconds(m_uniformRandomVariable->GetInteger(0, 10))),
+            Simulator::Schedule(MilliSeconds(m_uniformRandomVariable->GetInteger(0, 10)),
                                 &RoutingProtocol::SendTo,
                                 this,
                                 socket,
@@ -2218,7 +2218,7 @@
         {
             destination = i->GetBroadcast();
         }
-        Simulator::Schedule(Time(MilliSeconds(m_uniformRandomVariable->GetInteger(0, 10))),
+        Simulator::Schedule(MilliSeconds(m_uniformRandomVariable->GetInteger(0, 10)),
                             &RoutingProtocol::SendTo,
                             this,
                             socket,
@@ -2267,11 +2267,16 @@
 RoutingProtocol::DoInitialize()
 {
     NS_LOG_FUNCTION(this);
-    uint32_t startTime;
+
+    NS_ABORT_MSG_IF(m_ttlStart > m_netDiameter,
+                    "AODV: configuration error, TtlStart ("
+                        << m_ttlStart << ") must be less than or equal to NetDiameter ("
+                        << m_netDiameter << ").");
+
     if (m_enableHello)
     {
         m_htimer.SetFunction(&RoutingProtocol::HelloTimerExpire, this);
-        startTime = m_uniformRandomVariable->GetInteger(0, 100);
+        uint32_t startTime = m_uniformRandomVariable->GetInteger(0, 100);
         NS_LOG_DEBUG("Starting at time " << startTime << "ms");
         m_htimer.Schedule(MilliSeconds(startTime));
     }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/aodv/model/aodv-routing-protocol.h ns-3.44/src/aodv/model/aodv-routing-protocol.h
--- ns-3.43/src/aodv/model/aodv-routing-protocol.h	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/src/aodv/model/aodv-routing-protocol.h	2025-03-09 16:55:49.343371000 -0700
@@ -40,16 +40,16 @@
 namespace aodv
 {
 /**
- * \ingroup aodv
+ * @ingroup aodv
  *
- * \brief AODV routing protocol
+ * @brief AODV routing protocol
  */
 class RoutingProtocol : public Ipv4RoutingProtocol
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     static const uint32_t AODV_PORT;
@@ -82,7 +82,7 @@
     // Handle protocol parameters
     /**
      * Get maximum queue time
-     * \returns the maximum queue time
+     * @returns the maximum queue time
      */
     Time GetMaxQueueTime() const
     {
@@ -91,13 +91,13 @@
 
     /**
      * Set the maximum queue time
-     * \param t the maximum queue time
+     * @param t the maximum queue time
      */
     void SetMaxQueueTime(Time t);
 
     /**
      * Get the maximum queue length
-     * \returns the maximum queue length
+     * @returns the maximum queue length
      */
     uint32_t GetMaxQueueLen() const
     {
@@ -106,13 +106,13 @@
 
     /**
      * Set the maximum queue length
-     * \param len the maximum queue length
+     * @param len the maximum queue length
      */
     void SetMaxQueueLen(uint32_t len);
 
     /**
      * Get destination only flag
-     * \returns the destination only flag
+     * @returns the destination only flag
      */
     bool GetDestinationOnlyFlag() const
     {
@@ -121,7 +121,7 @@
 
     /**
      * Set destination only flag
-     * \param f the destination only flag
+     * @param f the destination only flag
      */
     void SetDestinationOnlyFlag(bool f)
     {
@@ -130,7 +130,7 @@
 
     /**
      * Get gratuitous reply flag
-     * \returns the gratuitous reply flag
+     * @returns the gratuitous reply flag
      */
     bool GetGratuitousReplyFlag() const
     {
@@ -139,7 +139,7 @@
 
     /**
      * Set gratuitous reply flag
-     * \param f the gratuitous reply flag
+     * @param f the gratuitous reply flag
      */
     void SetGratuitousReplyFlag(bool f)
     {
@@ -148,7 +148,7 @@
 
     /**
      * Set hello enable
-     * \param f the hello enable flag
+     * @param f the hello enable flag
      */
     void SetHelloEnable(bool f)
     {
@@ -157,7 +157,7 @@
 
     /**
      * Get hello enable flag
-     * \returns the enable hello flag
+     * @returns the enable hello flag
      */
     bool GetHelloEnable() const
     {
@@ -166,7 +166,7 @@
 
     /**
      * Set broadcast enable flag
-     * \param f enable broadcast flag
+     * @param f enable broadcast flag
      */
     void SetBroadcastEnable(bool f)
     {
@@ -175,7 +175,7 @@
 
     /**
      * Get broadcast enable flag
-     * \returns the broadcast enable flag
+     * @returns the broadcast enable flag
      */
     bool GetBroadcastEnable() const
     {
@@ -187,8 +187,8 @@
      * used by this model.  Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream);
 
@@ -199,8 +199,8 @@
     /**
      * Notify that an MPDU was dropped.
      *
-     * \param reason the reason why the MPDU was dropped
-     * \param mpdu the dropped MPDU
+     * @param reason the reason why the MPDU was dropped
+     * @param mpdu the dropped MPDU
      */
     void NotifyTxError(WifiMacDropReason reason, Ptr<const WifiMpdu> mpdu);
 
@@ -286,10 +286,10 @@
     /**
      * Queue packet and send route request
      *
-     * \param p the packet to route
-     * \param header the IP header
-     * \param ucb the UnicastForwardCallback function
-     * \param ecb the ErrorCallback function
+     * @param p the packet to route
+     * @param header the IP header
+     * @param ucb the UnicastForwardCallback function
+     * @param ecb the ErrorCallback function
      */
     void DeferredRouteOutput(Ptr<const Packet> p,
                              const Ipv4Header& header,
@@ -298,11 +298,11 @@
     /**
      * If route exists and is valid, forward packet.
      *
-     * \param p the packet to route
-     * \param header the IP header
-     * \param ucb the UnicastForwardCallback function
-     * \param ecb the ErrorCallback function
-     * \returns true if forwarded
+     * @param p the packet to route
+     * @param header the IP header
+     * @param ucb the UnicastForwardCallback function
+     * @param ecb the ErrorCallback function
+     * @returns true if forwarded
      */
     bool Forwarding(Ptr<const Packet> p,
                     const Ipv4Header& header,
@@ -311,153 +311,153 @@
     /**
      * Repeated attempts by a source node at route discovery for a single destination
      * use the expanding ring search technique.
-     * \param dst the destination IP address
+     * @param dst the destination IP address
      */
     void ScheduleRreqRetry(Ipv4Address dst);
     /**
      * Set lifetime field in routing table entry to the maximum of existing lifetime and lt, if the
      * entry exists
-     * \param addr destination address
-     * \param lt proposed time for lifetime field in routing table entry for destination with
+     * @param addr destination address
+     * @param lt proposed time for lifetime field in routing table entry for destination with
      * address addr.
-     * \return true if route to destination address addr exist
+     * @return true if route to destination address addr exist
      */
     bool UpdateRouteLifeTime(Ipv4Address addr, Time lt);
     /**
      * Update neighbor record.
-     * \param receiver is supposed to be my interface
-     * \param sender is supposed to be IP address of my neighbor.
+     * @param receiver is supposed to be my interface
+     * @param sender is supposed to be IP address of my neighbor.
      */
     void UpdateRouteToNeighbor(Ipv4Address sender, Ipv4Address receiver);
     /**
      * Test whether the provided address is assigned to an interface on this node
-     * \param src the source IP address
-     * \returns true if the IP address is the node's IP address
+     * @param src the source IP address
+     * @returns true if the IP address is the node's IP address
      */
     bool IsMyOwnAddress(Ipv4Address src);
     /**
      * Find unicast socket with local interface address iface
      *
-     * \param iface the interface
-     * \returns the socket associated with the interface
+     * @param iface the interface
+     * @returns the socket associated with the interface
      */
     Ptr<Socket> FindSocketWithInterfaceAddress(Ipv4InterfaceAddress iface) const;
     /**
      * Find subnet directed broadcast socket with local interface address iface
      *
-     * \param iface the interface
-     * \returns the socket associated with the interface
+     * @param iface the interface
+     * @returns the socket associated with the interface
      */
     Ptr<Socket> FindSubnetBroadcastSocketWithInterfaceAddress(Ipv4InterfaceAddress iface) const;
     /**
      * Process hello message
      *
-     * \param rrepHeader RREP message header
-     * \param receiverIfaceAddr receiver interface IP address
+     * @param rrepHeader RREP message header
+     * @param receiverIfaceAddr receiver interface IP address
      */
     void ProcessHello(const RrepHeader& rrepHeader, Ipv4Address receiverIfaceAddr);
     /**
      * Create loopback route for given header
      *
-     * \param header the IP header
-     * \param oif the output interface net device
-     * \returns the route
+     * @param header the IP header
+     * @param oif the output interface net device
+     * @returns the route
      */
     Ptr<Ipv4Route> LoopbackRoute(const Ipv4Header& header, Ptr<NetDevice> oif) const;
 
     /**
-     * \name Receive control packets
+     * @name Receive control packets
      * @{
      */
     /**
      * Receive and process control packet
-     * \param socket input socket
+     * @param socket input socket
      */
     void RecvAodv(Ptr<Socket> socket);
     /**
      * Receive RREQ
-     * \param p packet
-     * \param receiver receiver address
-     * \param src sender address
+     * @param p packet
+     * @param receiver receiver address
+     * @param src sender address
      */
     void RecvRequest(Ptr<Packet> p, Ipv4Address receiver, Ipv4Address src);
     /**
      * Receive RREP
-     * \param p packet
-     * \param my destination address
-     * \param src sender address
+     * @param p packet
+     * @param my destination address
+     * @param src sender address
      */
     void RecvReply(Ptr<Packet> p, Ipv4Address my, Ipv4Address src);
     /**
      * Receive RREP_ACK
-     * \param neighbor neighbor address
+     * @param neighbor neighbor address
      */
     void RecvReplyAck(Ipv4Address neighbor);
     /**
      * Receive RERR
-     * \param p packet
-     * \param src sender address
+     * @param p packet
+     * @param src sender address
      */
     /// Receive  from node with address src
     void RecvError(Ptr<Packet> p, Ipv4Address src);
     /** @} */
 
     /**
-     * \name Send
+     * @name Send
      * @{
      */
     /** Forward packet from route request queue
-     * \param dst destination address
-     * \param route route to use
+     * @param dst destination address
+     * @param route route to use
      */
     void SendPacketFromQueue(Ipv4Address dst, Ptr<Ipv4Route> route);
     /// Send hello
     void SendHello();
     /** Send RREQ
-     * \param dst destination address
+     * @param dst destination address
      */
     void SendRequest(Ipv4Address dst);
     /** Send RREP
-     * \param rreqHeader route request header
-     * \param toOrigin routing table entry to originator
+     * @param rreqHeader route request header
+     * @param toOrigin routing table entry to originator
      */
     void SendReply(const RreqHeader& rreqHeader, const RoutingTableEntry& toOrigin);
     /** Send RREP by intermediate node
-     * \param toDst routing table entry to destination
-     * \param toOrigin routing table entry to originator
-     * \param gratRep indicates whether a gratuitous RREP should be unicast to destination
+     * @param toDst routing table entry to destination
+     * @param toOrigin routing table entry to originator
+     * @param gratRep indicates whether a gratuitous RREP should be unicast to destination
      */
     void SendReplyByIntermediateNode(RoutingTableEntry& toDst,
                                      RoutingTableEntry& toOrigin,
                                      bool gratRep);
     /** Send RREP_ACK
-     * \param neighbor neighbor address
+     * @param neighbor neighbor address
      */
     void SendReplyAck(Ipv4Address neighbor);
     /** Initiate RERR
-     * \param nextHop next hop address
+     * @param nextHop next hop address
      */
     void SendRerrWhenBreaksLinkToNextHop(Ipv4Address nextHop);
     /** Forward RERR
-     * \param packet packet
-     * \param precursors list of addresses of the visited nodes
+     * @param packet packet
+     * @param precursors list of addresses of the visited nodes
      */
     void SendRerrMessage(Ptr<Packet> packet, std::vector<Ipv4Address> precursors);
     /**
      * Send RERR message when no route to forward input packet. Unicast if there is reverse route to
      * originating node, broadcast otherwise.
-     * \param dst destination node IP address
-     * \param dstSeqNo destination node sequence number
-     * \param origin originating node IP address
+     * @param dst destination node IP address
+     * @param dstSeqNo destination node sequence number
+     * @param origin originating node IP address
      */
     void SendRerrWhenNoRouteToForward(Ipv4Address dst, uint32_t dstSeqNo, Ipv4Address origin);
     /** @} */
 
     /**
      * Send packet to destination socket
-     * \param socket destination node socket
-     * \param packet packet to send
-     * \param destination destination node IP address
+     * @param socket destination node socket
+     * @param packet packet to send
+     * @param destination destination node IP address
      */
     void SendTo(Ptr<Socket> socket, Ptr<Packet> packet, Ipv4Address destination);
 
@@ -477,14 +477,14 @@
     std::map<Ipv4Address, Timer> m_addressReqTimer;
     /**
      * Handle route discovery process
-     * \param dst the destination IP address
+     * @param dst the destination IP address
      */
     void RouteRequestTimerExpire(Ipv4Address dst);
     /**
      * Mark link to neighbor node as unidirectional for blacklistTimeout
      *
-     * \param neighbor the IP address of the neighbor node
-     * \param blacklistTimeout the black list timeout time
+     * @param neighbor the IP address of the neighbor node
+     * @param blacklistTimeout the black list timeout time
      */
     void AckTimerExpire(Ipv4Address neighbor, Time blacklistTimeout);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/aodv/model/aodv-rqueue.cc ns-3.44/src/aodv/model/aodv-rqueue.cc
--- ns-3.43/src/aodv/model/aodv-rqueue.cc	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/src/aodv/model/aodv-rqueue.cc	2025-03-09 16:55:49.343371000 -0700
@@ -106,19 +106,19 @@
 }
 
 /**
- * \brief IsExpired structure
+ * @brief IsExpired structure
  */
 struct IsExpired
 {
     /**
      * Check if the entry is expired
      *
-     * \param e QueueEntry entry
-     * \return true if expired, false otherwise
+     * @param e QueueEntry entry
+     * @return true if expired, false otherwise
      */
     bool operator()(const QueueEntry& e) const
     {
-        return (e.GetExpireTime() < Seconds(0));
+        return (e.GetExpireTime().IsStrictlyNegative());
     }
 };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/aodv/model/aodv-rqueue.h ns-3.44/src/aodv/model/aodv-rqueue.h
--- ns-3.43/src/aodv/model/aodv-rqueue.h	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/src/aodv/model/aodv-rqueue.h	2025-03-09 16:55:49.343371000 -0700
@@ -27,8 +27,8 @@
 {
 
 /**
- * \ingroup aodv
- * \brief AODV Queue Entry
+ * @ingroup aodv
+ * @brief AODV Queue Entry
  */
 class QueueEntry
 {
@@ -41,11 +41,11 @@
     /**
      * constructor
      *
-     * \param pa the packet to add to the queue
-     * \param h the Ipv4Header
-     * \param ucb the UnicastForwardCallback function
-     * \param ecb the ErrorCallback function
-     * \param exp the expiration time
+     * @param pa the packet to add to the queue
+     * @param h the Ipv4Header
+     * @param ucb the UnicastForwardCallback function
+     * @param ecb the ErrorCallback function
+     * @param exp the expiration time
      */
     QueueEntry(Ptr<const Packet> pa = nullptr,
                const Ipv4Header& h = Ipv4Header(),
@@ -61,9 +61,9 @@
     }
 
     /**
-     * \brief Compare queue entries
-     * \param o QueueEntry to compare
-     * \return true if equal
+     * @brief Compare queue entries
+     * @param o QueueEntry to compare
+     * @return true if equal
      */
     bool operator==(const QueueEntry& o) const
     {
@@ -75,7 +75,7 @@
     // Fields
     /**
      * Get unicast forward callback
-     * \returns unicast callback
+     * @returns unicast callback
      */
     UnicastForwardCallback GetUnicastForwardCallback() const
     {
@@ -84,7 +84,7 @@
 
     /**
      * Set unicast forward callback
-     * \param ucb The unicast callback
+     * @param ucb The unicast callback
      */
     void SetUnicastForwardCallback(UnicastForwardCallback ucb)
     {
@@ -93,7 +93,7 @@
 
     /**
      * Get error callback
-     * \returns the error callback
+     * @returns the error callback
      */
     ErrorCallback GetErrorCallback() const
     {
@@ -102,7 +102,7 @@
 
     /**
      * Set error callback
-     * \param ecb The error callback
+     * @param ecb The error callback
      */
     void SetErrorCallback(ErrorCallback ecb)
     {
@@ -111,7 +111,7 @@
 
     /**
      * Get packet from entry
-     * \returns the packet
+     * @returns the packet
      */
     Ptr<const Packet> GetPacket() const
     {
@@ -120,7 +120,7 @@
 
     /**
      * Set packet in entry
-     * \param p The packet
+     * @param p The packet
      */
     void SetPacket(Ptr<const Packet> p)
     {
@@ -129,7 +129,7 @@
 
     /**
      * Get IPv4 header
-     * \returns the IPv4 header
+     * @returns the IPv4 header
      */
     Ipv4Header GetIpv4Header() const
     {
@@ -138,7 +138,7 @@
 
     /**
      * Set IPv4 header
-     * \param h the IPv4 header
+     * @param h the IPv4 header
      */
     void SetIpv4Header(Ipv4Header h)
     {
@@ -147,7 +147,7 @@
 
     /**
      * Set expire time
-     * \param exp The expiration time
+     * @param exp The expiration time
      */
     void SetExpireTime(Time exp)
     {
@@ -156,7 +156,7 @@
 
     /**
      * Get expire time
-     * \returns the expiration time
+     * @returns the expiration time
      */
     Time GetExpireTime() const
     {
@@ -177,8 +177,8 @@
 };
 
 /**
- * \ingroup aodv
- * \brief AODV route request queue
+ * @ingroup aodv
+ * @brief AODV route request queue
  *
  * Since AODV is an on demand routing we queue requests while looking for route.
  */
@@ -188,8 +188,8 @@
     /**
      * constructor
      *
-     * \param maxLen the maximum length
-     * \param routeToQueueTimeout the route to queue timeout
+     * @param maxLen the maximum length
+     * @param routeToQueueTimeout the route to queue timeout
      */
     RequestQueue(uint32_t maxLen, Time routeToQueueTimeout)
         : m_maxLen(maxLen),
@@ -200,39 +200,39 @@
     /**
      * Push entry in queue, if there is no entry with the same packet and destination address in
      * queue.
-     * \param entry the queue entry
-     * \returns true if the entry is queued
+     * @param entry the queue entry
+     * @returns true if the entry is queued
      */
     bool Enqueue(QueueEntry& entry);
     /**
      * Return first found (the earliest) entry for given destination
      *
-     * \param dst the destination IP address
-     * \param entry the queue entry
-     * \returns true if the entry is dequeued
+     * @param dst the destination IP address
+     * @param entry the queue entry
+     * @returns true if the entry is dequeued
      */
     bool Dequeue(Ipv4Address dst, QueueEntry& entry);
     /**
      * Remove all packets with destination IP address dst
-     * \param dst the destination IP address
+     * @param dst the destination IP address
      */
     void DropPacketWithDst(Ipv4Address dst);
     /**
      * Finds whether a packet with destination dst exists in the queue
      *
-     * \param dst the destination IP address
-     * \returns true if an entry with the IP address is found
+     * @param dst the destination IP address
+     * @returns true if an entry with the IP address is found
      */
     bool Find(Ipv4Address dst);
     /**
-     * \returns the number of entries
+     * @returns the number of entries
      */
     uint32_t GetSize();
 
     // Fields
     /**
      * Get maximum queue length
-     * \returns the maximum queue length
+     * @returns the maximum queue length
      */
     uint32_t GetMaxQueueLen() const
     {
@@ -241,7 +241,7 @@
 
     /**
      * Set maximum queue length
-     * \param len The maximum queue length
+     * @param len The maximum queue length
      */
     void SetMaxQueueLen(uint32_t len)
     {
@@ -250,7 +250,7 @@
 
     /**
      * Get queue timeout
-     * \returns the queue timeout
+     * @returns the queue timeout
      */
     Time GetQueueTimeout() const
     {
@@ -259,7 +259,7 @@
 
     /**
      * Set queue timeout
-     * \param t The queue timeout
+     * @param t The queue timeout
      */
     void SetQueueTimeout(Time t)
     {
@@ -273,8 +273,8 @@
     void Purge();
     /**
      * Notify that packet is dropped from queue by timeout
-     * \param en the queue entry to drop
-     * \param reason the reason to drop the entry
+     * @param en the queue entry to drop
+     * @param reason the reason to drop the entry
      */
     void Drop(QueueEntry en, std::string reason);
     /// The maximum number of packets that we allow a routing protocol to buffer.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/aodv/model/aodv-rtable.cc ns-3.44/src/aodv/model/aodv-rtable.cc
--- ns-3.43/src/aodv/model/aodv-rtable.cc	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/src/aodv/model/aodv-rtable.cc	2025-03-09 16:55:49.343371000 -0700
@@ -383,7 +383,7 @@
     }
     for (auto i = m_ipv4AddressEntry.begin(); i != m_ipv4AddressEntry.end();)
     {
-        if (i->second.GetLifeTime() < Seconds(0))
+        if (i->second.GetLifeTime().IsStrictlyNegative())
         {
             if (i->second.GetFlag() == INVALID)
             {
@@ -419,7 +419,7 @@
     }
     for (auto i = table.begin(); i != table.end();)
     {
-        if (i->second.GetLifeTime() < Seconds(0))
+        if (i->second.GetLifeTime().IsStrictlyNegative())
         {
             if (i->second.GetFlag() == INVALID)
             {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/aodv/model/aodv-rtable.h ns-3.44/src/aodv/model/aodv-rtable.h
--- ns-3.43/src/aodv/model/aodv-rtable.h	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/src/aodv/model/aodv-rtable.h	2025-03-09 16:55:49.343371000 -0700
@@ -33,8 +33,8 @@
 {
 
 /**
- * \ingroup aodv
- * \brief Route record states
+ * @ingroup aodv
+ * @brief Route record states
  */
 enum RouteFlags
 {
@@ -44,8 +44,8 @@
 };
 
 /**
- * \ingroup aodv
- * \brief Routing table entry
+ * @ingroup aodv
+ * @brief Routing table entry
  */
 class RoutingTableEntry
 {
@@ -53,14 +53,14 @@
     /**
      * constructor
      *
-     * \param dev the device
-     * \param dst the destination IP address
-     * \param vSeqNo verify sequence number flag
-     * \param seqNo the sequence number
-     * \param iface the interface
-     * \param hops the number of hops
-     * \param nextHop the IP address of the next hop
-     * \param lifetime the lifetime of the entry
+     * @param dev the device
+     * @param dst the destination IP address
+     * @param vSeqNo verify sequence number flag
+     * @param seqNo the sequence number
+     * @param iface the interface
+     * @param hops the number of hops
+     * @param nextHop the IP address of the next hop
+     * @param lifetime the lifetime of the entry
      */
     RoutingTableEntry(Ptr<NetDevice> dev = nullptr,
                       Ipv4Address dst = Ipv4Address(),
@@ -73,50 +73,50 @@
 
     ~RoutingTableEntry();
 
-    /// \name Precursors management
+    /// @name Precursors management
     //\{
     /**
      * Insert precursor in precursor list if it doesn't yet exist in the list
-     * \param id precursor address
-     * \return true on success
+     * @param id precursor address
+     * @return true on success
      */
     bool InsertPrecursor(Ipv4Address id);
     /**
      * Lookup precursor by address
-     * \param id precursor address
-     * \return true on success
+     * @param id precursor address
+     * @return true on success
      */
     bool LookupPrecursor(Ipv4Address id);
     /**
-     * \brief Delete precursor
-     * \param id precursor address
-     * \return true on success
+     * @brief Delete precursor
+     * @param id precursor address
+     * @return true on success
      */
     bool DeletePrecursor(Ipv4Address id);
     /// Delete all precursors
     void DeleteAllPrecursors();
     /**
      * Check that precursor list is empty
-     * \return true if precursor list is empty
+     * @return true if precursor list is empty
      */
     bool IsPrecursorListEmpty() const;
     /**
      * Inserts precursors in output parameter prec if they do not yet exist in vector
-     * \param prec vector of precursor addresses
+     * @param prec vector of precursor addresses
      */
     void GetPrecursors(std::vector<Ipv4Address>& prec) const;
     //\}
 
     /**
      * Mark entry as "down" (i.e. disable it)
-     * \param badLinkLifetime duration to keep entry marked as invalid
+     * @param badLinkLifetime duration to keep entry marked as invalid
      */
     void Invalidate(Time badLinkLifetime);
 
     // Fields
     /**
      * Get destination address function
-     * \returns the IPv4 destination address
+     * @returns the IPv4 destination address
      */
     Ipv4Address GetDestination() const
     {
@@ -125,7 +125,7 @@
 
     /**
      * Get route function
-     * \returns The IPv4 route
+     * @returns The IPv4 route
      */
     Ptr<Ipv4Route> GetRoute() const
     {
@@ -134,7 +134,7 @@
 
     /**
      * Set route function
-     * \param r the IPv4 route
+     * @param r the IPv4 route
      */
     void SetRoute(Ptr<Ipv4Route> r)
     {
@@ -143,7 +143,7 @@
 
     /**
      * Set next hop address
-     * \param nextHop the next hop IPv4 address
+     * @param nextHop the next hop IPv4 address
      */
     void SetNextHop(Ipv4Address nextHop)
     {
@@ -152,7 +152,7 @@
 
     /**
      * Get next hop address
-     * \returns the next hop address
+     * @returns the next hop address
      */
     Ipv4Address GetNextHop() const
     {
@@ -161,7 +161,7 @@
 
     /**
      * Set output device
-     * \param dev The output device
+     * @param dev The output device
      */
     void SetOutputDevice(Ptr<NetDevice> dev)
     {
@@ -170,7 +170,7 @@
 
     /**
      * Get output device
-     * \returns the output device
+     * @returns the output device
      */
     Ptr<NetDevice> GetOutputDevice() const
     {
@@ -179,7 +179,7 @@
 
     /**
      * Get the Ipv4InterfaceAddress
-     * \returns the Ipv4InterfaceAddress
+     * @returns the Ipv4InterfaceAddress
      */
     Ipv4InterfaceAddress GetInterface() const
     {
@@ -188,7 +188,7 @@
 
     /**
      * Set the Ipv4InterfaceAddress
-     * \param iface The Ipv4InterfaceAddress
+     * @param iface The Ipv4InterfaceAddress
      */
     void SetInterface(Ipv4InterfaceAddress iface)
     {
@@ -197,7 +197,7 @@
 
     /**
      * Set the valid sequence number
-     * \param s the sequence number
+     * @param s the sequence number
      */
     void SetValidSeqNo(bool s)
     {
@@ -206,7 +206,7 @@
 
     /**
      * Get the valid sequence number
-     * \returns the valid sequence number
+     * @returns the valid sequence number
      */
     bool GetValidSeqNo() const
     {
@@ -215,7 +215,7 @@
 
     /**
      * Set the sequence number
-     * \param sn the sequence number
+     * @param sn the sequence number
      */
     void SetSeqNo(uint32_t sn)
     {
@@ -224,7 +224,7 @@
 
     /**
      * Get the sequence number
-     * \returns the sequence number
+     * @returns the sequence number
      */
     uint32_t GetSeqNo() const
     {
@@ -233,7 +233,7 @@
 
     /**
      * Set the number of hops
-     * \param hop the number of hops
+     * @param hop the number of hops
      */
     void SetHop(uint16_t hop)
     {
@@ -242,7 +242,7 @@
 
     /**
      * Get the number of hops
-     * \returns the number of hops
+     * @returns the number of hops
      */
     uint16_t GetHop() const
     {
@@ -251,7 +251,7 @@
 
     /**
      * Set the lifetime
-     * \param lt The lifetime
+     * @param lt The lifetime
      */
     void SetLifeTime(Time lt)
     {
@@ -260,7 +260,7 @@
 
     /**
      * Get the lifetime
-     * \returns the lifetime
+     * @returns the lifetime
      */
     Time GetLifeTime() const
     {
@@ -269,7 +269,7 @@
 
     /**
      * Set the route flags
-     * \param flag the route flags
+     * @param flag the route flags
      */
     void SetFlag(RouteFlags flag)
     {
@@ -278,7 +278,7 @@
 
     /**
      * Get the route flags
-     * \returns the route flags
+     * @returns the route flags
      */
     RouteFlags GetFlag() const
     {
@@ -287,7 +287,7 @@
 
     /**
      * Set the RREQ count
-     * \param n the RREQ count
+     * @param n the RREQ count
      */
     void SetRreqCnt(uint8_t n)
     {
@@ -296,7 +296,7 @@
 
     /**
      * Get the RREQ count
-     * \returns the RREQ count
+     * @returns the RREQ count
      */
     uint8_t GetRreqCnt() const
     {
@@ -313,7 +313,7 @@
 
     /**
      * Set the unidirectional flag
-     * \param u the uni directional flag
+     * @param u the uni directional flag
      */
     void SetUnidirectional(bool u)
     {
@@ -322,7 +322,7 @@
 
     /**
      * Get the unidirectional flag
-     * \returns the unidirectional flag
+     * @returns the unidirectional flag
      */
     bool IsUnidirectional() const
     {
@@ -331,7 +331,7 @@
 
     /**
      * Set the blacklist timeout
-     * \param t the blacklist timeout value
+     * @param t the blacklist timeout value
      */
     void SetBlacklistTimeout(Time t)
     {
@@ -340,7 +340,7 @@
 
     /**
      * Get the blacklist timeout value
-     * \returns the blacklist timeout value
+     * @returns the blacklist timeout value
      */
     Time GetBlacklistTimeout() const
     {
@@ -351,9 +351,9 @@
     Timer m_ackTimer;
 
     /**
-     * \brief Compare destination address
-     * \param dst IP address to compare
-     * \return true if equal
+     * @brief Compare destination address
+     * @param dst IP address to compare
+     * @return true if equal
      */
     bool operator==(const Ipv4Address dst) const
     {
@@ -362,8 +362,8 @@
 
     /**
      * Print packet to trace file
-     * \param stream The output stream
-     * \param unit The time unit to use (default Time::S)
+     * @param stream The output stream
+     * @param unit The time unit to use (default Time::S)
      */
     void Print(Ptr<OutputStreamWrapper> stream, Time::Unit unit = Time::S) const;
 
@@ -375,7 +375,7 @@
     /// Hop Count (number of hops needed to reach destination)
     uint16_t m_hops;
     /**
-     * \brief Expiration or deletion time of the route
+     * @brief Expiration or deletion time of the route
      * Lifetime field in the routing table plays dual role:
      * for an active route it is the expiration time, and for an invalid route
      * it is the deletion time.
@@ -406,24 +406,24 @@
 };
 
 /**
- * \ingroup aodv
- * \brief The Routing table used by AODV protocol
+ * @ingroup aodv
+ * @brief The Routing table used by AODV protocol
  */
 class RoutingTable
 {
   public:
     /**
      * constructor
-     * \param t the routing table entry lifetime
+     * @param t the routing table entry lifetime
      */
     RoutingTable(Time t);
 
-    /// \name Handle lifetime of invalid route
+    /// @name Handle lifetime of invalid route
     //\{
     /**
      * Get the lifetime of a bad link
      *
-     * \return the lifetime of a bad link
+     * @return the lifetime of a bad link
      */
     Time GetBadLinkLifetime() const
     {
@@ -433,7 +433,7 @@
     /**
      * Set the lifetime of a bad link
      *
-     * \param t the lifetime of a bad link
+     * @param t the lifetime of a bad link
      */
     void SetBadLinkLifetime(Time t)
     {
@@ -443,48 +443,48 @@
     //\}
     /**
      * Add routing table entry if it doesn't yet exist in routing table
-     * \param r routing table entry
-     * \return true in success
+     * @param r routing table entry
+     * @return true in success
      */
     bool AddRoute(RoutingTableEntry& r);
     /**
      * Delete routing table entry with destination address dst, if it exists.
-     * \param dst destination address
-     * \return true on success
+     * @param dst destination address
+     * @return true on success
      */
     bool DeleteRoute(Ipv4Address dst);
     /**
      * Lookup routing table entry with destination address dst
-     * \param dst destination address
-     * \param rt entry with destination address dst, if exists
-     * \return true on success
+     * @param dst destination address
+     * @param rt entry with destination address dst, if exists
+     * @return true on success
      */
     bool LookupRoute(Ipv4Address dst, RoutingTableEntry& rt);
     /**
      * Lookup route in VALID state
-     * \param dst destination address
-     * \param rt entry with destination address dst, if exists
-     * \return true on success
+     * @param dst destination address
+     * @param rt entry with destination address dst, if exists
+     * @return true on success
      */
     bool LookupValidRoute(Ipv4Address dst, RoutingTableEntry& rt);
     /**
      * Update routing table
-     * \param rt entry with destination address dst, if exists
-     * \return true on success
+     * @param rt entry with destination address dst, if exists
+     * @return true on success
      */
     bool Update(RoutingTableEntry& rt);
     /**
      * Set routing table entry flags
-     * \param dst destination address
-     * \param state the routing flags
-     * \return true on success
+     * @param dst destination address
+     * @param state the routing flags
+     * @return true on success
      */
     bool SetEntryState(Ipv4Address dst, RouteFlags state);
     /**
      * Lookup routing entries with next hop Address dst and not empty list of precursors.
      *
-     * \param nextHop the next hop IP address
-     * \param unreachable
+     * @param nextHop the next hop IP address
+     * @param unreachable
      */
     void GetListOfDestinationWithNextHop(Ipv4Address nextHop,
                                          std::map<Ipv4Address, uint32_t>& unreachable);
@@ -494,12 +494,12 @@
      *    exists and is valid, is incremented.
      * 2. The entry is invalidated by marking the route entry as invalid
      * 3. The Lifetime field is updated to current time plus DELETE_PERIOD.
-     * \param unreachable routes to invalidate
+     * @param unreachable routes to invalidate
      */
     void InvalidateRoutesWithDst(const std::map<Ipv4Address, uint32_t>& unreachable);
     /**
      * Delete all route from interface with address iface
-     * \param iface the interface IP address
+     * @param iface the interface IP address
      */
     void DeleteAllRoutesFromInterface(Ipv4InterfaceAddress iface);
 
@@ -513,15 +513,15 @@
     void Purge();
     /** Mark entry as unidirectional (e.g. add this neighbor to "blacklist" for blacklistTimeout
      * period)
-     * \param neighbor neighbor address link to which assumed to be unidirectional
-     * \param blacklistTimeout time for which the neighboring node is put into the blacklist
-     * \return true on success
+     * @param neighbor neighbor address link to which assumed to be unidirectional
+     * @param blacklistTimeout time for which the neighboring node is put into the blacklist
+     * @return true on success
      */
     bool MarkLinkAsUnidirectional(Ipv4Address neighbor, Time blacklistTimeout);
     /**
      * Print routing table
-     * \param stream the output stream
-     * \param unit The time unit to use (default Time::S)
+     * @param stream the output stream
+     * @param unit The time unit to use (default Time::S)
      */
     void Print(Ptr<OutputStreamWrapper> stream, Time::Unit unit = Time::S) const;
 
@@ -532,7 +532,7 @@
     Time m_badLinkLifetime;
     /**
      * const version of Purge, for use by Print() method
-     * \param table the routing table entry to purge
+     * @param table the routing table entry to purge
      */
     void Purge(std::map<Ipv4Address, RoutingTableEntry>& table) const;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/aodv/test/aodv-id-cache-test-suite.cc ns-3.44/src/aodv/test/aodv-id-cache-test-suite.cc
--- ns-3.43/src/aodv/test/aodv-id-cache-test-suite.cc	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/src/aodv/test/aodv-id-cache-test-suite.cc	2025-03-09 16:55:49.343371000 -0700
@@ -22,15 +22,15 @@
 {
 
 /**
- * \defgroup aodv-test AODV module tests
- * \ingroup aodv
- * \ingroup tests
+ * @defgroup aodv-test AODV module tests
+ * @ingroup aodv
+ * @ingroup tests
  */
 
 /**
- * \ingroup aodv-test
+ * @ingroup aodv-test
  *
- * \brief Unit test for id cache
+ * @brief Unit test for id cache
  */
 class IdCacheTest : public TestCase
 {
@@ -99,9 +99,9 @@
 }
 
 /**
- * \ingroup aodv-test
+ * @ingroup aodv-test
  *
- * \brief Id Cache Test Suite
+ * @brief Id Cache Test Suite
  */
 class IdCacheTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/aodv/test/aodv-regression.cc ns-3.44/src/aodv/test/aodv-regression.cc
--- ns-3.43/src/aodv/test/aodv-regression.cc	2024-10-09 16:41:09.844655800 -0700
+++ ns-3.44/src/aodv/test/aodv-regression.cc	2025-03-09 16:55:49.343371000 -0700
@@ -33,9 +33,9 @@
 using namespace ns3;
 
 /**
- * \ingroup aodv-test
+ * @ingroup aodv-test
  *
- * \brief AODV regression test suite
+ * @brief AODV regression test suite
  */
 class AodvRegressionTestSuite : public TestSuite
 {
@@ -57,9 +57,9 @@
 } g_aodvRegressionTestSuite; ///< the test suite
 
 /**
- * \ingroup aodv-test
+ * @ingroup aodv-test
  *
- * \brief Chain Regression Test
+ * @brief Chain Regression Test
  */
 ChainRegressionTest::ChainRegressionTest(const char* const prefix,
                                          Time t,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/aodv/test/aodv-regression.h ns-3.44/src/aodv/test/aodv-regression.h
--- ns-3.43/src/aodv/test/aodv-regression.h	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/aodv/test/aodv-regression.h	2025-03-09 16:55:49.343371000 -0700
@@ -17,9 +17,9 @@
 using namespace ns3;
 
 /**
- * \ingroup aodv
+ * @ingroup aodv
  *
- * \brief AODV chain regression test
+ * @brief AODV chain regression test
  *
  * This script creates 1-dimensional grid topology and then ping last node from the first one:
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/aodv/test/aodv-test-suite.cc ns-3.44/src/aodv/test/aodv-test-suite.cc
--- ns-3.43/src/aodv/test/aodv-test-suite.cc	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/aodv/test/aodv-test-suite.cc	2025-03-09 16:55:49.343371000 -0700
@@ -18,9 +18,9 @@
 {
 
 /**
- * \ingroup aodv-test
+ * @ingroup aodv-test
  *
- * \brief Unit test for neighbors
+ * @brief Unit test for neighbors
  */
 struct NeighborTest : public TestCase
 {
@@ -33,7 +33,7 @@
     void DoRun() override;
     /**
      * Handler test function
-     * \param addr the IPv4 address of the neighbor
+     * @param addr the IPv4 address of the neighbor
      */
     void Handler(Ipv4Address addr);
     /// Check timeout function 1
@@ -123,9 +123,9 @@
 }
 
 /**
- * \ingroup aodv-test
+ * @ingroup aodv-test
  *
- * \brief Type header test case
+ * @brief Type header test case
  */
 struct TypeHeaderTest : public TestCase
 {
@@ -150,9 +150,9 @@
 };
 
 /**
- * \ingroup aodv-test
+ * @ingroup aodv-test
  *
- * \brief Unit test for RREQ
+ * @brief Unit test for RREQ
  */
 struct RreqHeaderTest : public TestCase
 {
@@ -209,9 +209,9 @@
 };
 
 /**
- * \ingroup aodv-test
+ * @ingroup aodv-test
  *
- * \brief Unit test for RREP
+ * @brief Unit test for RREP
  */
 struct RrepHeaderTest : public TestCase
 {
@@ -266,9 +266,9 @@
 };
 
 /**
- * \ingroup aodv-test
+ * @ingroup aodv-test
  *
- * \brief Unit test for RREP-ACK
+ * @brief Unit test for RREP-ACK
  */
 struct RrepAckHeaderTest : public TestCase
 {
@@ -290,9 +290,9 @@
 };
 
 /**
- * \ingroup aodv-test
+ * @ingroup aodv-test
  *
- * \brief Unit test for RERR
+ * @brief Unit test for RERR
  */
 struct RerrHeaderTest : public TestCase
 {
@@ -324,9 +324,9 @@
 };
 
 /**
- * \ingroup aodv-test
+ * @ingroup aodv-test
  *
- * \brief Unit test for AODV routing table entry
+ * @brief Unit test for AODV routing table entry
  */
 struct QueueEntryTest : public TestCase
 {
@@ -337,9 +337,9 @@
 
     /**
      * Unicast test function
-     * \param route the IPv4 route
-     * \param packet the packet
-     * \param header the IPv4 header
+     * @param route the IPv4 route
+     * @param packet the packet
+     * @param header the IPv4 header
      */
     void Unicast(Ptr<Ipv4Route> route, Ptr<const Packet> packet, const Ipv4Header& header)
     {
@@ -347,9 +347,9 @@
 
     /**
      * Error test function
-     * \param p The packet
-     * \param h The header
-     * \param e the socket error
+     * @param p The packet
+     * @param h The header
+     * @param e the socket error
      */
     void Error(Ptr<const Packet> p, const Ipv4Header& h, Socket::SocketErrno e)
     {
@@ -357,9 +357,9 @@
 
     /**
      * Unicast 2 testfunction
-     * \param route The IPv4 route
-     * \param packet The packet
-     * \param header The header
+     * @param route The IPv4 route
+     * @param packet The packet
+     * @param header The header
      */
     void Unicast2(Ptr<Ipv4Route> route, Ptr<const Packet> packet, const Ipv4Header& header)
     {
@@ -367,9 +367,9 @@
 
     /**
      * Error2 test function
-     * \param p The packet
-     * \param h The header
-     * \param e the socket error
+     * @param p The packet
+     * @param h The header
+     * @param e the socket error
      */
     void Error2(Ptr<const Packet> p, const Ipv4Header& h, Socket::SocketErrno e)
     {
@@ -425,9 +425,9 @@
 
     /**
      * Unicast test function
-     * \param route the IPv4 route
-     * \param packet the packet
-     * \param header the IPv4 header
+     * @param route the IPv4 route
+     * @param packet the packet
+     * @param header the IPv4 header
      */
     void Unicast(Ptr<Ipv4Route> route, Ptr<const Packet> packet, const Ipv4Header& header)
     {
@@ -435,9 +435,9 @@
 
     /**
      * Error test function
-     * \param p The packet
-     * \param h The header
-     * \param e the socket error
+     * @param p The packet
+     * @param h The header
+     * @param e the socket error
      */
     void Error(Ptr<const Packet> p, const Ipv4Header& h, Socket::SocketErrno e)
     {
@@ -540,9 +540,9 @@
 }
 
 /**
- * \ingroup aodv-test
+ * @ingroup aodv-test
  *
- * \brief Unit test for AODV routing table entry
+ * @brief Unit test for AODV routing table entry
  */
 struct AodvRtableEntryTest : public TestCase
 {
@@ -633,9 +633,9 @@
 };
 
 /**
- * \ingroup aodv-test
+ * @ingroup aodv-test
  *
- * \brief Unit test for AODV routing table
+ * @brief Unit test for AODV routing table
  */
 struct AodvRtableTest : public TestCase
 {
@@ -720,9 +720,9 @@
 };
 
 /**
- * \ingroup aodv-test
+ * @ingroup aodv-test
  *
- * \brief AODV test suite
+ * @brief AODV test suite
  */
 class AodvTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/aodv/test/bug-772.cc ns-3.44/src/aodv/test/bug-772.cc
--- ns-3.43/src/aodv/test/bug-772.cc	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/aodv/test/bug-772.cc	2025-03-09 16:55:49.343371000 -0700
@@ -146,9 +146,7 @@
                                  "DataMode",
                                  StringValue("OfdmRate6Mbps"),
                                  "RtsCtsThreshold",
-                                 StringValue("2200"),
-                                 "MaxSlrc",
-                                 UintegerValue(7));
+                                 StringValue("2200"));
     NetDeviceContainer devices = wifi.Install(wifiPhy, wifiMac, *m_nodes);
 
     // Assign fixed stream numbers to wifi and channel random variables
@@ -184,7 +182,7 @@
     m_sendSocket->Connect(InetSocketAddress(interfaces.GetAddress(m_size - 1), m_port));
     m_sendSocket->SetAllowBroadcast(true);
     Simulator::ScheduleWithContext(m_sendSocket->GetNode()->GetId(),
-                                   Seconds(1.0),
+                                   Seconds(1),
                                    &Bug772ChainTest::SendData,
                                    this,
                                    m_sendSocket);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/aodv/test/bug-772.h ns-3.44/src/aodv/test/bug-772.h
--- ns-3.43/src/aodv/test/bug-772.h	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/aodv/test/bug-772.h	2025-03-09 16:55:49.343371000 -0700
@@ -17,9 +17,9 @@
 using namespace ns3;
 
 /**
- * \ingroup aodv
+ * @ingroup aodv
  *
- * \brief AODV deferred route lookup test case (see \bugid{772})
+ * @brief AODV deferred route lookup test case (see \bugid{772})
  *
  * UDP packet transfers are delayed while a route is found and then while
  * ARP completes.  Eight packets should be sent, queued until the path
@@ -31,16 +31,16 @@
     /**
      * Create test case
      *
-     * \param prefix              Unique file names prefix
-     * \param proto               ns3::UdpSocketFactory or ns3::TcpSocketFactory
-     * \param size                Number of nodes in the chain
-     * \param time                Simulation time
+     * @param prefix              Unique file names prefix
+     * @param proto               ns3::UdpSocketFactory or ns3::TcpSocketFactory
+     * @param size                Number of nodes in the chain
+     * @param time                Simulation time
      */
     Bug772ChainTest(const char* const prefix, const char* const proto, Time time, uint32_t size);
     ~Bug772ChainTest() override;
 
   private:
-    /// \internal It is important to have pointers here
+    /// @internal It is important to have pointers here
     NodeContainer* m_nodes;
 
     /// PCAP file names prefix
@@ -66,7 +66,7 @@
     void DoRun() override;
     /**
      * Receive data function
-     * \param socket the socket to receive from
+     * @param socket the socket to receive from
      */
     void HandleRead(Ptr<Socket> socket);
 
@@ -80,7 +80,7 @@
 
     /**
      * Send data
-     * \param socket the sending socket
+     * @param socket the sending socket
      */
     void SendData(Ptr<Socket> socket);
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/aodv/test/loopback.cc ns-3.44/src/aodv/test/loopback.cc
--- ns-3.43/src/aodv/test/loopback.cc	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/aodv/test/loopback.cc	2025-03-09 16:55:49.343371000 -0700
@@ -35,9 +35,9 @@
 {
 
 /**
- * \ingroup aodv
+ * @ingroup aodv
  *
- * \brief AODV loopback UDP echo test case
+ * @brief AODV loopback UDP echo test case
  */
 class LoopbackTestCase : public TestCase
 {
@@ -50,17 +50,17 @@
 
     /**
      * Send data function
-     * \param socket The socket to send data
+     * @param socket The socket to send data
      */
     void SendData(Ptr<Socket> socket);
     /**
      * Receive packet function
-     * \param socket The socket to receive data
+     * @param socket The socket to receive data
      */
     void ReceivePkt(Ptr<Socket> socket);
     /**
      * Echo data function
-     * \param socket The socket to echo data
+     * @param socket The socket to echo data
      */
     void EchoData(Ptr<Socket> socket) const;
 
@@ -107,7 +107,7 @@
     socket->SendTo(Create<Packet>(123), 0, realTo);
 
     Simulator::ScheduleWithContext(socket->GetNode()->GetId(),
-                                   Seconds(1.0),
+                                   Seconds(1),
                                    &LoopbackTestCase::SendData,
                                    this,
                                    socket);
@@ -158,7 +158,7 @@
     m_txSocket = socketFactory->CreateSocket();
 
     Simulator::ScheduleWithContext(m_txSocket->GetNode()->GetId(),
-                                   Seconds(1.0),
+                                   Seconds(1),
                                    &LoopbackTestCase::SendData,
                                    this,
                                    m_txSocket);
@@ -178,9 +178,9 @@
 }
 
 /**
- * \ingroup aodv-test
+ * @ingroup aodv-test
  *
- * \brief AODV Loopback test suite
+ * @brief AODV Loopback test suite
  */
 class AodvLoopbackTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/CMakeLists.txt ns-3.44/src/applications/CMakeLists.txt
--- ns-3.43/src/applications/CMakeLists.txt	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/applications/CMakeLists.txt	2025-03-09 16:55:49.343371000 -0700
@@ -15,6 +15,8 @@
     model/seq-ts-echo-header.cc
     model/seq-ts-header.cc
     model/seq-ts-size-header.cc
+    model/sink-application.cc
+    model/source-application.cc
     model/three-gpp-http-client.cc
     model/three-gpp-http-header.cc
     model/three-gpp-http-server.cc
@@ -39,6 +41,8 @@
     model/seq-ts-echo-header.h
     model/seq-ts-header.h
     model/seq-ts-size-header.h
+    model/sink-application.h
+    model/source-application.h
     model/three-gpp-http-client.h
     model/three-gpp-http-header.h
     model/three-gpp-http-server.h
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/doc/applications.h ns-3.44/src/applications/doc/applications.h
--- ns-3.43/src/applications/doc/applications.h	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/applications/doc/applications.h	2025-03-09 16:55:49.343371000 -0700
@@ -7,7 +7,7 @@
 #define APPLICATIONS_H
 
 /**
- * \defgroup applications Applications
+ * @defgroup applications Applications
  *
  * This section documents the API of the ns-3 applications module. For a generic functional
  * description, please refer to the ns-3 manual.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/helper/bulk-send-helper.cc ns-3.44/src/applications/helper/bulk-send-helper.cc
--- ns-3.43/src/applications/helper/bulk-send-helper.cc	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/applications/helper/bulk-send-helper.cc	2025-03-09 16:55:49.347370900 -0700
@@ -10,7 +10,7 @@
 
 #include "bulk-send-helper.h"
 
-#include <ns3/string.h>
+#include "ns3/string.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/helper/bulk-send-helper.h ns-3.44/src/applications/helper/bulk-send-helper.h
--- ns-3.43/src/applications/helper/bulk-send-helper.h	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/applications/helper/bulk-send-helper.h	2025-03-09 16:55:49.347370900 -0700
@@ -11,14 +11,14 @@
 #ifndef BULK_SEND_HELPER_H
 #define BULK_SEND_HELPER_H
 
-#include <ns3/application-helper.h>
+#include "ns3/application-helper.h"
 
 namespace ns3
 {
 
 /**
- * \ingroup bulksend
- * \brief A helper to make it easier to instantiate an ns3::BulkSendApplication
+ * @ingroup bulksend
+ * @brief A helper to make it easier to instantiate an ns3::BulkSendApplication
  * on a set of nodes.
  */
 class BulkSendHelper : public ApplicationHelper
@@ -27,11 +27,11 @@
     /**
      * Create an BulkSendHelper to make it easier to work with BulkSendApplications
      *
-     * \param protocol the name of the protocol to use to send traffic
+     * @param protocol the name of the protocol to use to send traffic
      *        by the applications. This string identifies the socket
      *        factory type used to create sockets for the applications.
      *        A typical value would be ns3::TcpSocketFactory.
-     * \param address the address of the remote node to send traffic
+     * @param address the address of the remote node to send traffic
      *        to.
      */
     BulkSendHelper(const std::string& protocol, const Address& address);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/helper/on-off-helper.cc ns-3.44/src/applications/helper/on-off-helper.cc
--- ns-3.43/src/applications/helper/on-off-helper.cc	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/applications/helper/on-off-helper.cc	2025-03-09 16:55:49.347370900 -0700
@@ -8,9 +8,9 @@
 
 #include "on-off-helper.h"
 
-#include <ns3/onoff-application.h>
-#include <ns3/string.h>
-#include <ns3/uinteger.h>
+#include "ns3/onoff-application.h"
+#include "ns3/string.h"
+#include "ns3/uinteger.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/helper/on-off-helper.h ns-3.44/src/applications/helper/on-off-helper.h
--- ns-3.43/src/applications/helper/on-off-helper.h	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/applications/helper/on-off-helper.h	2025-03-09 16:55:49.347370900 -0700
@@ -9,8 +9,8 @@
 #ifndef ON_OFF_HELPER_H
 #define ON_OFF_HELPER_H
 
-#include <ns3/application-helper.h>
-#include <ns3/data-rate.h>
+#include "ns3/application-helper.h"
+#include "ns3/data-rate.h"
 
 #include <stdint.h>
 
@@ -18,8 +18,8 @@
 {
 
 /**
- * \ingroup onoff
- * \brief A helper to make it easier to instantiate an ns3::OnOffApplication
+ * @ingroup onoff
+ * @brief A helper to make it easier to instantiate an ns3::OnOffApplication
  * on a set of nodes.
  */
 class OnOffHelper : public ApplicationHelper
@@ -28,11 +28,11 @@
     /**
      * Create an OnOffHelper to make it easier to work with OnOffApplications
      *
-     * \param protocol the name of the protocol to use to send traffic
+     * @param protocol the name of the protocol to use to send traffic
      *        by the applications. This string identifies the socket
      *        factory type used to create sockets for the applications.
      *        A typical value would be ns3::UdpSocketFactory.
-     * \param address the address of the remote node to send traffic
+     * @param address the address of the remote node to send traffic
      *        to.
      */
     OnOffHelper(const std::string& protocol, const Address& address);
@@ -42,8 +42,8 @@
      * setting the attributes OnTime to constant 1000 seconds, OffTime to
      * constant 0 seconds, and the DataRate and PacketSize set accordingly
      *
-     * \param dataRate DataRate object for the sending rate
-     * \param packetSize size in bytes of the packet payloads generated
+     * @param dataRate DataRate object for the sending rate
+     * @param packetSize size in bytes of the packet payloads generated
      */
     void SetConstantRate(DataRate dataRate, uint32_t packetSize = 512);
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/helper/packet-sink-helper.cc ns-3.44/src/applications/helper/packet-sink-helper.cc
--- ns-3.43/src/applications/helper/packet-sink-helper.cc	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/applications/helper/packet-sink-helper.cc	2025-03-09 16:55:49.347370900 -0700
@@ -8,7 +8,7 @@
 
 #include "packet-sink-helper.h"
 
-#include <ns3/string.h>
+#include "ns3/string.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/helper/packet-sink-helper.h ns-3.44/src/applications/helper/packet-sink-helper.h
--- ns-3.43/src/applications/helper/packet-sink-helper.h	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/applications/helper/packet-sink-helper.h	2025-03-09 16:55:49.347370900 -0700
@@ -9,14 +9,14 @@
 #ifndef PACKET_SINK_HELPER_H
 #define PACKET_SINK_HELPER_H
 
-#include <ns3/application-helper.h>
+#include "ns3/application-helper.h"
 
 namespace ns3
 {
 
 /**
- * \ingroup packetsink
- * \brief A helper to make it easier to instantiate an ns3::PacketSinkApplication
+ * @ingroup packetsink
+ * @brief A helper to make it easier to instantiate an ns3::PacketSinkApplication
  * on a set of nodes.
  */
 class PacketSinkHelper : public ApplicationHelper
@@ -25,11 +25,11 @@
     /**
      * Create a PacketSinkHelper to make it easier to work with PacketSinkApplications
      *
-     * \param protocol the name of the protocol to use to receive traffic
+     * @param protocol the name of the protocol to use to receive traffic
      *        This string identifies the socket factory type used to create
      *        sockets for the applications.  A typical value would be
      *        ns3::TcpSocketFactory.
-     * \param address the address of the sink,
+     * @param address the address of the sink,
      *
      */
     PacketSinkHelper(const std::string& protocol, const Address& address);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/helper/three-gpp-http-helper.cc ns-3.44/src/applications/helper/three-gpp-http-helper.cc
--- ns-3.43/src/applications/helper/three-gpp-http-helper.cc	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/applications/helper/three-gpp-http-helper.cc	2025-03-09 16:55:49.347370900 -0700
@@ -22,7 +22,7 @@
 ThreeGppHttpClientHelper::ThreeGppHttpClientHelper(const Address& address)
     : ApplicationHelper("ns3::ThreeGppHttpClient")
 {
-    m_factory.Set("RemoteServerAddress", AddressValue(address));
+    m_factory.Set("Remote", AddressValue(address));
 }
 
 // HTTP SERVER HELPER /////////////////////////////////////////////////////////
@@ -30,7 +30,7 @@
 ThreeGppHttpServerHelper::ThreeGppHttpServerHelper(const Address& address)
     : ApplicationHelper("ns3::ThreeGppHttpServer")
 {
-    m_factory.Set("LocalAddress", AddressValue(address));
+    m_factory.Set("Local", AddressValue(address));
 }
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/helper/three-gpp-http-helper.h ns-3.44/src/applications/helper/three-gpp-http-helper.h
--- ns-3.43/src/applications/helper/three-gpp-http-helper.h	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/applications/helper/three-gpp-http-helper.h	2025-03-09 16:55:49.347370900 -0700
@@ -15,13 +15,13 @@
 #ifndef THREE_GPP_HTTP_HELPER_H
 #define THREE_GPP_HTTP_HELPER_H
 
-#include <ns3/application-helper.h>
+#include "ns3/application-helper.h"
 
 namespace ns3
 {
 
 /**
- * \ingroup applications
+ * @ingroup applications
  * Helper to make it easier to instantiate an ThreeGppHttpClient on a set of nodes.
  */
 class ThreeGppHttpClientHelper : public ApplicationHelper
@@ -30,13 +30,13 @@
     /**
      * Create a ThreeGppHttpClientHelper to make it easier to work with ThreeGppHttpClient
      * applications.
-     * \param address The address of the remote server node to send traffic to.
+     * @param address The address of the remote server node to send traffic to.
      */
     ThreeGppHttpClientHelper(const Address& address);
 }; // end of `class ThreeGppHttpClientHelper`
 
 /**
- * \ingroup http
+ * @ingroup http
  * Helper to make it easier to instantiate an ThreeGppHttpServer on a set of nodes.
  */
 class ThreeGppHttpServerHelper : public ApplicationHelper
@@ -45,7 +45,7 @@
     /**
      * Create a ThreeGppHttpServerHelper to make it easier to work with
      * ThreeGppHttpServer applications.
-     * \param address The address of the server.
+     * @param address The address of the server.
      */
     ThreeGppHttpServerHelper(const Address& address);
 }; // end of `class ThreeGppHttpServerHelper`
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/helper/udp-client-server-helper.cc ns-3.44/src/applications/helper/udp-client-server-helper.cc
--- ns-3.43/src/applications/helper/udp-client-server-helper.cc	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/applications/helper/udp-client-server-helper.cc	2025-03-09 16:55:49.347370900 -0700
@@ -8,8 +8,9 @@
 
 #include "udp-client-server-helper.h"
 
-#include <ns3/string.h>
-#include <ns3/uinteger.h>
+#include "ns3/address-utils.h"
+#include "ns3/string.h"
+#include "ns3/uinteger.h"
 
 namespace ns3
 {
@@ -25,6 +26,12 @@
     SetAttribute("Port", UintegerValue(port));
 }
 
+UdpServerHelper::UdpServerHelper(const Address& address)
+    : UdpServerHelper()
+{
+    SetAttribute("Local", AddressValue(address));
+}
+
 UdpClientHelper::UdpClientHelper()
     : ApplicationHelper(UdpClient::GetTypeId())
 {
@@ -33,13 +40,12 @@
 UdpClientHelper::UdpClientHelper(const Address& address)
     : UdpClientHelper()
 {
-    SetAttribute("RemoteAddress", AddressValue(address));
+    SetAttribute("Remote", AddressValue(address));
 }
 
 UdpClientHelper::UdpClientHelper(const Address& address, uint16_t port)
-    : UdpClientHelper(address)
+    : UdpClientHelper(addressUtils::ConvertToSocketAddress(address, port))
 {
-    SetAttribute("RemotePort", UintegerValue(port));
 }
 
 UdpTraceClientHelper::UdpTraceClientHelper()
@@ -50,16 +56,15 @@
 UdpTraceClientHelper::UdpTraceClientHelper(const Address& address, const std::string& filename)
     : UdpTraceClientHelper()
 {
-    SetAttribute("RemoteAddress", AddressValue(address));
+    SetAttribute("Remote", AddressValue(address));
     SetAttribute("TraceFilename", StringValue(filename));
 }
 
 UdpTraceClientHelper::UdpTraceClientHelper(const Address& address,
                                            uint16_t port,
                                            const std::string& filename)
-    : UdpTraceClientHelper(address, filename)
+    : UdpTraceClientHelper(addressUtils::ConvertToSocketAddress(address, port), filename)
 {
-    SetAttribute("RemotePort", UintegerValue(port));
 }
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/helper/udp-client-server-helper.h ns-3.44/src/applications/helper/udp-client-server-helper.h
--- ns-3.43/src/applications/helper/udp-client-server-helper.h	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/applications/helper/udp-client-server-helper.h	2025-03-09 16:55:49.347370900 -0700
@@ -9,18 +9,18 @@
 #ifndef UDP_CLIENT_SERVER_HELPER_H
 #define UDP_CLIENT_SERVER_HELPER_H
 
-#include <ns3/application-helper.h>
-#include <ns3/udp-client.h>
-#include <ns3/udp-server.h>
-#include <ns3/udp-trace-client.h>
+#include "ns3/application-helper.h"
+#include "ns3/udp-client.h"
+#include "ns3/udp-server.h"
+#include "ns3/udp-trace-client.h"
 
 #include <stdint.h>
 
 namespace ns3
 {
 /**
- * \ingroup udpclientserver
- * \brief Create a server application which waits for input UDP packets
+ * @ingroup udpclientserver
+ * @brief Create a server application which waits for input UDP packets
  *        and uses the information carried into their payload to compute
  *        delay and to determine if some packets are lost.
  */
@@ -38,14 +38,22 @@
      * Create UdpServerHelper which will make life easier for people trying
      * to set up simulations with udp-client-server application.
      *
-     * \param port The port the server will wait on for incoming packets
+     * @param port The port the server will wait on for incoming packets
      */
     UdpServerHelper(uint16_t port);
+
+    /**
+     * Create UdpServerHelper which will make life easier for people trying
+     * to set up simulations with udp-client-server application.
+     *
+     * @param address The address the server will bind to
+     */
+    UdpServerHelper(const Address& address);
 };
 
 /**
- * \ingroup udpclientserver
- * \brief Create a client application which sends UDP packets carrying
+ * @ingroup udpclientserver
+ * @brief Create a client application which sends UDP packets carrying
  *  a 32bit sequence number and a 64 bit time stamp.
  *
  */
@@ -65,8 +73,8 @@
      * addresses that do not include a port value (e.g., Ipv4Address and
      * Ipv6Address).
      *
-     * \param ip The IP address of the remote UDP server
-     * \param port The port number of the remote UDP server
+     * @param ip The IP address of the remote UDP server
+     * @param port The port number of the remote UDP server
      */
 
     UdpClientHelper(const Address& ip, uint16_t port);
@@ -76,14 +84,14 @@
      * addresses that do include a port value (e.g., InetSocketAddress and
      * Inet6SocketAddress).
      *
-     * \param addr The address of the remote UDP server
+     * @param addr The address of the remote UDP server
      */
 
     UdpClientHelper(const Address& addr);
 };
 
 /**
- * \ingroup udpclientserver
+ * @ingroup udpclientserver
  * Create UdpTraceClient application which sends UDP packets based on a trace
  * file of an MPEG4 stream. Trace files could be downloaded form :
  * https://web.archive.org/web/20190907061916/http://www2.tkn.tu-berlin.de/research/trace/ltvt.html
@@ -110,9 +118,9 @@
      * addresses that do not include a port value (e.g., Ipv4Address and
      * Ipv6Address).
      *
-     * \param ip The IP address of the remote UDP server
-     * \param port The port number of the remote UDP server
-     * \param filename the file from which packet traces will be loaded
+     * @param ip The IP address of the remote UDP server
+     * @param port The port number of the remote UDP server
+     * @param filename the file from which packet traces will be loaded
      */
     UdpTraceClientHelper(const Address& ip, uint16_t port, const std::string& filename = "");
 
@@ -122,8 +130,8 @@
      * addresses that do include a port value (e.g., InetSocketAddress and
      * Inet6SocketAddress).
      *
-     * \param addr The address of the remote UDP server
-     * \param filename the file from which packet traces will be loaded
+     * @param addr The address of the remote UDP server
+     * @param filename the file from which packet traces will be loaded
      */
     UdpTraceClientHelper(const Address& addr, const std::string& filename = "");
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/helper/udp-echo-helper.cc ns-3.44/src/applications/helper/udp-echo-helper.cc
--- ns-3.43/src/applications/helper/udp-echo-helper.cc	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/applications/helper/udp-echo-helper.cc	2025-03-09 16:55:49.347370900 -0700
@@ -8,6 +8,7 @@
 
 #include "udp-echo-helper.h"
 
+#include "ns3/address-utils.h"
 #include "ns3/udp-echo-client.h"
 #include "ns3/udp-echo-server.h"
 #include "ns3/uinteger.h"
@@ -21,17 +22,21 @@
     SetAttribute("Port", UintegerValue(port));
 }
 
+UdpEchoServerHelper::UdpEchoServerHelper(const Address& address)
+    : ApplicationHelper(UdpEchoServer::GetTypeId())
+{
+    SetAttribute("Local", AddressValue(address));
+}
+
 UdpEchoClientHelper::UdpEchoClientHelper(const Address& address, uint16_t port)
-    : ApplicationHelper(UdpEchoClient::GetTypeId())
+    : UdpEchoClientHelper(addressUtils::ConvertToSocketAddress(address, port))
 {
-    SetAttribute("RemoteAddress", AddressValue(address));
-    SetAttribute("RemotePort", UintegerValue(port));
 }
 
 UdpEchoClientHelper::UdpEchoClientHelper(const Address& address)
     : ApplicationHelper(UdpEchoClient::GetTypeId())
 {
-    SetAttribute("RemoteAddress", AddressValue(address));
+    SetAttribute("Remote", AddressValue(address));
 }
 
 void
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/helper/udp-echo-helper.h ns-3.44/src/applications/helper/udp-echo-helper.h
--- ns-3.43/src/applications/helper/udp-echo-helper.h	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/applications/helper/udp-echo-helper.h	2025-03-09 16:55:49.347370900 -0700
@@ -9,7 +9,7 @@
 #ifndef UDP_ECHO_HELPER_H
 #define UDP_ECHO_HELPER_H
 
-#include <ns3/application-helper.h>
+#include "ns3/application-helper.h"
 
 #include <stdint.h>
 
@@ -17,8 +17,8 @@
 {
 
 /**
- * \ingroup udpecho
- * \brief Create a server application which waits for input UDP packets
+ * @ingroup udpecho
+ * @brief Create a server application which waits for input UDP packets
  *        and sends them back to the original sender.
  */
 class UdpEchoServerHelper : public ApplicationHelper
@@ -28,14 +28,22 @@
      * Create UdpEchoServerHelper which will make life easier for people trying
      * to set up simulations with echos.
      *
-     * \param port The port the server will wait on for incoming packets
+     * @param port The port the server will wait on for incoming packets
      */
     UdpEchoServerHelper(uint16_t port);
+
+    /**
+     * Create UdpEchoServerHelper which will make life easier for people trying
+     * to set up simulations with echos.
+     *
+     * @param address The address the server will bind to
+     */
+    UdpEchoServerHelper(const Address& address);
 };
 
 /**
- * \ingroup udpecho
- * \brief Create an application which sends a UDP packet and waits for an echo of this packet
+ * @ingroup udpecho
+ * @brief Create an application which sends a UDP packet and waits for an echo of this packet
  */
 class UdpEchoClientHelper : public ApplicationHelper
 {
@@ -45,16 +53,17 @@
      * to set up simulations with echos. Use this variant with addresses that do
      * not include a port value (e.g., Ipv4Address and Ipv6Address).
      *
-     * \param ip The IP address of the remote udp echo server
-     * \param port The port number of the remote udp echo server
+     * @param ip The IP address of the remote udp echo server
+     * @param port The port number of the remote udp echo server
      */
     UdpEchoClientHelper(const Address& ip, uint16_t port);
+
     /**
      * Create UdpEchoClientHelper which will make life easier for people trying
      * to set up simulations with echos. Use this variant with addresses that do
      * include a port value (e.g., InetSocketAddress and Inet6SocketAddress).
      *
-     * \param addr The address of the remote udp echo server
+     * @param addr The address of the remote udp echo server
      */
     UdpEchoClientHelper(const Address& addr);
 
@@ -63,12 +72,12 @@
      * packet (what is sent as data to the server) to the contents of the fill
      * string (including the trailing zero terminator).
      *
-     * \warning The size of resulting echo packets will be automatically adjusted
+     * @warning The size of resulting echo packets will be automatically adjusted
      * to reflect the size of the fill string -- this means that the PacketSize
      * attribute may be changed as a result of this call.
      *
-     * \param app Smart pointer to the application (real type must be UdpEchoClient).
-     * \param fill The string to use as the actual echo data bytes.
+     * @param app Smart pointer to the application (real type must be UdpEchoClient).
+     * @param fill The string to use as the actual echo data bytes.
      */
     void SetFill(Ptr<Application> app, const std::string& fill);
 
@@ -79,13 +88,13 @@
      *
      * The fill byte will be used to initialize the contents of the data packet.
      *
-     * \warning The size of resulting echo packets will be automatically adjusted
+     * @warning The size of resulting echo packets will be automatically adjusted
      * to reflect the dataLength parameter -- this means that the PacketSize
      * attribute may be changed as a result of this call.
      *
-     * \param app Smart pointer to the application (real type must be UdpEchoClient).
-     * \param fill The byte to be repeated in constructing the packet data..
-     * \param dataLength The desired length of the resulting echo packet data.
+     * @param app Smart pointer to the application (real type must be UdpEchoClient).
+     * @param fill The byte to be repeated in constructing the packet data..
+     * @param dataLength The desired length of the resulting echo packet data.
      */
     void SetFill(Ptr<Application> app, uint8_t fill, uint32_t dataLength);
 
@@ -98,14 +107,14 @@
      * by providing a complete buffer with fillLength set to your desired
      * dataLength
      *
-     * \warning The size of resulting echo packets will be automatically adjusted
+     * @warning The size of resulting echo packets will be automatically adjusted
      * to reflect the dataLength parameter -- this means that the PacketSize
      * attribute of the Application may be changed as a result of this call.
      *
-     * \param app Smart pointer to the application (real type must be UdpEchoClient).
-     * \param fill The fill pattern to use when constructing packets.
-     * \param fillLength The number of bytes in the provided fill pattern.
-     * \param dataLength The desired length of the final echo data.
+     * @param app Smart pointer to the application (real type must be UdpEchoClient).
+     * @param fill The fill pattern to use when constructing packets.
+     * @param fillLength The number of bytes in the provided fill pattern.
+     * @param dataLength The desired length of the final echo data.
      */
     void SetFill(Ptr<Application> app, uint8_t* fill, uint32_t fillLength, uint32_t dataLength);
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/model/application-packet-probe.h ns-3.44/src/applications/model/application-packet-probe.h
--- ns-3.43/src/applications/model/application-packet-probe.h	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/applications/model/application-packet-probe.h	2025-03-09 16:55:49.347370900 -0700
@@ -26,7 +26,7 @@
 {
 
 /**
- * \brief Probe to translate from a TraceSource to two more easily parsed TraceSources.
+ * @brief Probe to translate from a TraceSource to two more easily parsed TraceSources.
  *
  * This class is designed to probe an underlying ns3 TraceSource
  * exporting a packet and a socket address.  This probe exports a
@@ -41,43 +41,43 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     ApplicationPacketProbe();
     ~ApplicationPacketProbe() override;
 
     /**
-     * \brief Set a probe value
+     * @brief Set a probe value
      *
-     * \param packet set the traced packet equal to this
-     * \param address set the socket address for the traced packet equal to this
+     * @param packet set the traced packet equal to this
+     * @param address set the socket address for the traced packet equal to this
      */
     void SetValue(Ptr<const Packet> packet, const Address& address);
 
     /**
-     * \brief Set a probe value by its name in the Config system
+     * @brief Set a probe value by its name in the Config system
      *
-     * \param path config path to access the probe
-     * \param packet set the traced packet equal to this
-     * \param address set the socket address for the traced packet equal to this
+     * @param path config path to access the probe
+     * @param packet set the traced packet equal to this
+     * @param address set the socket address for the traced packet equal to this
      */
     static void SetValueByPath(std::string path, Ptr<const Packet> packet, const Address& address);
 
     /**
-     * \brief connect to a trace source attribute provided by a given object
+     * @brief connect to a trace source attribute provided by a given object
      *
-     * \param traceSource the name of the attribute TraceSource to connect to
-     * \param obj ns3::Object to connect to
-     * \return true if the trace source was successfully connected
+     * @param traceSource the name of the attribute TraceSource to connect to
+     * @param obj ns3::Object to connect to
+     * @return true if the trace source was successfully connected
      */
     bool ConnectByObject(std::string traceSource, Ptr<Object> obj) override;
 
     /**
-     * \brief connect to a trace source provided by a config path
+     * @brief connect to a trace source provided by a config path
      *
-     * \param path Config path to bind to
+     * @param path Config path to bind to
      *
      * Note, if an invalid path is provided, the probe will not be connected
      * to anything.
@@ -86,11 +86,11 @@
 
   private:
     /**
-     * \brief Method to connect to an underlying ns3::TraceSource with
+     * @brief Method to connect to an underlying ns3::TraceSource with
      * arguments of type Ptr<const Packet> and const Address&
      *
-     * \param packet the traced packet
-     * \param address the socket address for the traced packet
+     * @param packet the traced packet
+     * @param address the socket address for the traced packet
      *
      */
     void TraceSink(Ptr<const Packet> packet, const Address& address);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/model/bulk-send-application.cc ns-3.44/src/applications/model/bulk-send-application.cc
--- ns-3.43/src/applications/model/bulk-send-application.cc	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/applications/model/bulk-send-application.cc	2025-03-09 16:55:49.347370900 -0700
@@ -8,7 +8,6 @@
 
 #include "bulk-send-application.h"
 
-#include "ns3/address.h"
 #include "ns3/boolean.h"
 #include "ns3/log.h"
 #include "ns3/node.h"
@@ -34,7 +33,7 @@
 {
     static TypeId tid =
         TypeId("ns3::BulkSendApplication")
-            .SetParent<Application>()
+            .SetParent<SourceApplication>()
             .SetGroupName("Applications")
             .AddConstructor<BulkSendApplication>()
             .AddAttribute("SendSize",
@@ -42,23 +41,6 @@
                           UintegerValue(512),
                           MakeUintegerAccessor(&BulkSendApplication::m_sendSize),
                           MakeUintegerChecker<uint32_t>(1))
-            .AddAttribute("Remote",
-                          "The address of the destination",
-                          AddressValue(),
-                          MakeAddressAccessor(&BulkSendApplication::m_peer),
-                          MakeAddressChecker())
-            .AddAttribute("Local",
-                          "The Address on which to bind the socket. If not set, it is generated "
-                          "automatically.",
-                          AddressValue(),
-                          MakeAddressAccessor(&BulkSendApplication::m_local),
-                          MakeAddressChecker())
-            .AddAttribute("Tos",
-                          "The Type of Service used to send IPv4 packets. "
-                          "All 8 bits of the TOS byte are set (including ECN bits).",
-                          UintegerValue(0),
-                          MakeUintegerAccessor(&BulkSendApplication::m_tos),
-                          MakeUintegerChecker<uint8_t>())
             .AddAttribute("MaxBytes",
                           "The total number of bytes to send. "
                           "Once these bytes are sent, "
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/model/bulk-send-application.h ns-3.44/src/applications/model/bulk-send-application.h
--- ns-3.43/src/applications/model/bulk-send-application.h	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/applications/model/bulk-send-application.h	2025-03-09 16:55:49.347370900 -0700
@@ -10,9 +10,8 @@
 #define BULK_SEND_APPLICATION_H
 
 #include "seq-ts-size-header.h"
+#include "source-application.h"
 
-#include "ns3/address.h"
-#include "ns3/application.h"
 #include "ns3/event-id.h"
 #include "ns3/ptr.h"
 #include "ns3/traced-callback.h"
@@ -20,14 +19,13 @@
 namespace ns3
 {
 
-class Address;
 class Socket;
 class TcpHeader;
 class TcpSocketBase;
 
 /**
- * \ingroup applications
- * \defgroup bulksend BulkSendApplication
+ * @ingroup applications
+ * @defgroup bulksend BulkSendApplication
  *
  * This traffic generator simply sends data
  * as fast as possible up to MaxBytes or until
@@ -42,9 +40,9 @@
  */
 
 /**
- * \ingroup bulksend
+ * @ingroup bulksend
  *
- * \brief Send as much traffic as possible, trying to fill the bandwidth.
+ * @brief Send as much traffic as possible, trying to fill the bandwidth.
  *
  * This traffic generator simply sends data
  * as fast as possible up to MaxBytes or until
@@ -64,21 +62,20 @@
  * (enable its "EnableSeqTsSizeHeader" attribute), or users may extract
  * the header via trace sources.
  */
-class BulkSendApplication : public Application
+class BulkSendApplication : public SourceApplication
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     BulkSendApplication();
-
     ~BulkSendApplication() override;
 
     /**
-     * \brief Set the upper bound for the total number of bytes to send.
+     * @brief Set the upper bound for the total number of bytes to send.
      *
      * Once this bound is reached, no more application bytes are sent. If the
      * application is stopped during the simulation and restarted, the
@@ -88,13 +85,13 @@
      * there is no upper bound; i.e. data is sent until the application
      * or simulation is stopped.
      *
-     * \param maxBytes the upper bound of bytes to send
+     * @param maxBytes the upper bound of bytes to send
      */
     void SetMaxBytes(uint64_t maxBytes);
 
     /**
-     * \brief Get the socket this application is attached to.
-     * \return pointer to associated socket
+     * @brief Get the socket this application is attached to.
+     * @return pointer to associated socket
      */
     Ptr<Socket> GetSocket() const;
 
@@ -106,17 +103,14 @@
     void StopApplication() override;
 
     /**
-     * \brief Send data until the L4 transmission buffer is full.
-     * \param from From address
-     * \param to To address
+     * @brief Send data until the L4 transmission buffer is full.
+     * @param from From address
+     * @param to To address
      */
     void SendData(const Address& from, const Address& to);
 
     Ptr<Socket> m_socket;                //!< Associated socket
-    Address m_peer;                      //!< Peer address
-    Address m_local;                     //!< Local address to bind to
     bool m_connected;                    //!< True if connected
-    uint8_t m_tos;                       //!< The packets Type of Service
     uint32_t m_sendSize;                 //!< Size of data to send each time
     uint64_t m_maxBytes;                 //!< Limit total number of bytes sent
     uint64_t m_totBytes;                 //!< Total bytes sent so far
@@ -143,32 +137,32 @@
 
   private:
     /**
-     * \brief Connection Succeeded (called by Socket through a callback)
-     * \param socket the connected socket
+     * @brief Connection Succeeded (called by Socket through a callback)
+     * @param socket the connected socket
      */
     void ConnectionSucceeded(Ptr<Socket> socket);
     /**
-     * \brief Connection Failed (called by Socket through a callback)
-     * \param socket the connected socket
+     * @brief Connection Failed (called by Socket through a callback)
+     * @param socket the connected socket
      */
     void ConnectionFailed(Ptr<Socket> socket);
     /**
-     * \brief Send more data as soon as some has been transmitted.
+     * @brief Send more data as soon as some has been transmitted.
      *
      * Used in socket's SetSendCallback - params are forced by it.
      *
-     * \param socket socket to use
-     * \param unused actually unused
+     * @param socket socket to use
+     * @param unused actually unused
      */
     void DataSend(Ptr<Socket> socket, uint32_t unused);
 
     /**
-     *  \brief Packet retransmitted (called by TcpSocketBase sockets via callback)
-     *  \param p the retransmitted packet
-     *  \param header the TCP header
-     *  \param localAddr the local address
-     *  \param peerAddr the peer address
-     *  \param socket the socket that retransmitted the packet
+     *  @brief Packet retransmitted (called by TcpSocketBase sockets via callback)
+     *  @param p the retransmitted packet
+     *  @param header the TCP header
+     *  @param localAddr the local address
+     *  @param peerAddr the peer address
+     *  @param socket the socket that retransmitted the packet
      */
     void PacketRetransmitted(Ptr<const Packet> p,
                              const TcpHeader& header,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/model/onoff-application.cc ns-3.44/src/applications/model/onoff-application.cc
--- ns-3.43/src/applications/model/onoff-application.cc	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/applications/model/onoff-application.cc	2025-03-09 16:55:49.347370900 -0700
@@ -12,7 +12,6 @@
 
 #include "onoff-application.h"
 
-#include "ns3/address.h"
 #include "ns3/boolean.h"
 #include "ns3/data-rate.h"
 #include "ns3/inet-socket-address.h"
@@ -44,7 +43,7 @@
 {
     static TypeId tid =
         TypeId("ns3::OnOffApplication")
-            .SetParent<Application>()
+            .SetParent<SourceApplication>()
             .SetGroupName("Applications")
             .AddConstructor<OnOffApplication>()
             .AddAttribute("DataRate",
@@ -57,23 +56,6 @@
                           UintegerValue(512),
                           MakeUintegerAccessor(&OnOffApplication::m_pktSize),
                           MakeUintegerChecker<uint32_t>(1))
-            .AddAttribute("Remote",
-                          "The address of the destination",
-                          AddressValue(),
-                          MakeAddressAccessor(&OnOffApplication::m_peer),
-                          MakeAddressChecker())
-            .AddAttribute("Local",
-                          "The Address on which to bind the socket. If not set, it is generated "
-                          "automatically.",
-                          AddressValue(),
-                          MakeAddressAccessor(&OnOffApplication::m_local),
-                          MakeAddressChecker())
-            .AddAttribute("Tos",
-                          "The Type of Service used to send IPv4 packets. "
-                          "All 8 bits of the TOS byte are set (including ECN bits).",
-                          UintegerValue(0),
-                          MakeUintegerAccessor(&OnOffApplication::m_tos),
-                          MakeUintegerChecker<uint8_t>())
             .AddAttribute("OnTime",
                           "A RandomVariableStream used to pick the duration of the 'On' state.",
                           StringValue("ns3::ConstantRandomVariable[Constant=1.0]"),
@@ -114,7 +96,11 @@
             .AddTraceSource("TxWithSeqTsSize",
                             "A new packet is created with SeqTsSizeHeader",
                             MakeTraceSourceAccessor(&OnOffApplication::m_txTraceWithSeqTsSize),
-                            "ns3::PacketSink::SeqTsSizeCallback");
+                            "ns3::PacketSink::SeqTsSizeCallback")
+            .AddTraceSource("OnOffState",
+                            "Application state (0-OFF, 1-ON)",
+                            MakeTraceSourceAccessor(&OnOffApplication::m_state),
+                            "ns3::TracedValueCallback::Bool");
     return tid;
 }
 
@@ -122,7 +108,7 @@
     : m_socket(nullptr),
       m_connected(false),
       m_residualBits(0),
-      m_lastStartTime(Seconds(0)),
+      m_lastStartTime(),
       m_totBytes(0),
       m_unsentPacket(nullptr)
 {
@@ -152,9 +138,11 @@
 OnOffApplication::AssignStreams(int64_t stream)
 {
     NS_LOG_FUNCTION(this << stream);
-    m_onTime->SetStream(stream);
-    m_offTime->SetStream(stream + 1);
-    return 2;
+    auto currentStream = stream;
+    m_onTime->SetStream(currentStream++);
+    m_offTime->SetStream(currentStream++);
+    currentStream += Application::AssignStreams(currentStream);
+    return (currentStream - stream);
 }
 
 void
@@ -284,6 +272,7 @@
     m_lastStartTime = Simulator::Now();
     ScheduleNextTx(); // Schedule the send packet event
     ScheduleStopEvent();
+    m_state = true;
 }
 
 void
@@ -291,8 +280,8 @@
 {
     NS_LOG_FUNCTION(this);
     CancelEvents();
-
     ScheduleStartEvent();
+    m_state = false;
 }
 
 // Private helpers
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/model/onoff-application.h ns-3.44/src/applications/model/onoff-application.h
--- ns-3.43/src/applications/model/onoff-application.h	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/applications/model/onoff-application.h	2025-03-09 16:55:49.347370900 -0700
@@ -14,24 +14,23 @@
 #define ONOFF_APPLICATION_H
 
 #include "seq-ts-size-header.h"
+#include "source-application.h"
 
-#include "ns3/address.h"
-#include "ns3/application.h"
 #include "ns3/data-rate.h"
 #include "ns3/event-id.h"
 #include "ns3/ptr.h"
 #include "ns3/traced-callback.h"
+#include "ns3/traced-value.h"
 
 namespace ns3
 {
 
-class Address;
 class RandomVariableStream;
 class Socket;
 
 /**
- * \ingroup applications
- * \defgroup onoff OnOffApplication
+ * @ingroup applications
+ * @defgroup onoff OnOffApplication
  *
  * This traffic generator follows an On/Off pattern: after
  * Application::StartApplication
@@ -42,9 +41,9 @@
  * characterized by the specified "data rate" and "packet size".
  */
 /**
- * \ingroup onoff
+ * @ingroup onoff
  *
- * \brief Generate traffic to a single destination according to an
+ * @brief Generate traffic to a single destination according to an
  *        OnOff pattern.
  *
  * This traffic generator follows an On/Off pattern: after
@@ -82,32 +81,31 @@
  * the header via trace sources.  Note that the continuity of the sequence
  * number may be disrupted across On/Off cycles.
  */
-class OnOffApplication : public Application
+class OnOffApplication : public SourceApplication
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     OnOffApplication();
-
     ~OnOffApplication() override;
 
     /**
-     * \brief Set the total number of bytes to send.
+     * @brief Set the total number of bytes to send.
      *
      * Once these bytes are sent, no packet is sent again, even in on state.
      * The value zero means that there is no limit.
      *
-     * \param maxBytes the total number of bytes to send
+     * @param maxBytes the total number of bytes to send
      */
     void SetMaxBytes(uint64_t maxBytes);
 
     /**
-     * \brief Return a pointer to associated socket.
-     * \return pointer to associated socket
+     * @brief Return a pointer to associated socket.
+     * @return pointer to associated socket
      */
     Ptr<Socket> GetSocket() const;
 
@@ -122,29 +120,26 @@
 
     // helpers
     /**
-     * \brief Cancel all pending events.
+     * @brief Cancel all pending events.
      */
     void CancelEvents();
 
     // Event handlers
     /**
-     * \brief Start an On period
+     * @brief Start an On period
      */
     void StartSending();
     /**
-     * \brief Start an Off period
+     * @brief Start an Off period
      */
     void StopSending();
     /**
-     * \brief Send a packet
+     * @brief Send a packet
      */
     void SendPacket();
 
     Ptr<Socket> m_socket;                //!< Associated socket
-    Address m_peer;                      //!< Peer address
-    Address m_local;                     //!< Local address to bind to
     bool m_connected;                    //!< True if connected
-    uint8_t m_tos;                       //!< The packets Type of Service
     Ptr<RandomVariableStream> m_onTime;  //!< rng for On Time
     Ptr<RandomVariableStream> m_offTime; //!< rng for Off Time
     DataRate m_cbrRate;                  //!< Rate that data is generated
@@ -174,27 +169,29 @@
 
   private:
     /**
-     * \brief Schedule the next packet transmission
+     * @brief Schedule the next packet transmission
      */
     void ScheduleNextTx();
     /**
-     * \brief Schedule the next On period start
+     * @brief Schedule the next On period start
      */
     void ScheduleStartEvent();
     /**
-     * \brief Schedule the next Off period start
+     * @brief Schedule the next Off period start
      */
     void ScheduleStopEvent();
     /**
-     * \brief Handle a Connection Succeed event
-     * \param socket the connected socket
+     * @brief Handle a Connection Succeed event
+     * @param socket the connected socket
      */
     void ConnectionSucceeded(Ptr<Socket> socket);
     /**
-     * \brief Handle a Connection Failed event
-     * \param socket the not connected socket
+     * @brief Handle a Connection Failed event
+     * @param socket the not connected socket
      */
     void ConnectionFailed(Ptr<Socket> socket);
+
+    TracedValue<bool> m_state; //!< State of application (0-OFF, 1-ON)
 };
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/model/packet-loss-counter.h ns-3.44/src/applications/model/packet-loss-counter.h
--- ns-3.43/src/applications/model/packet-loss-counter.h	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/applications/model/packet-loss-counter.h	2025-03-09 16:55:49.347370900 -0700
@@ -23,9 +23,9 @@
 class Packet;
 
 /**
- * \ingroup udpclientserver
+ * @ingroup udpclientserver
  *
- * \brief A class to count the number of lost packets.
+ * @brief A class to count the number of lost packets.
  *
  * This class records the packet lost in a client/server transmission
  * leveraging a sequence number. All the packets outside a given window
@@ -35,44 +35,44 @@
 {
   public:
     /**
-     * \brief Constructor
-     * \param bitmapSize The window size. Must be a multiple of 8.
+     * @brief Constructor
+     * @param bitmapSize The window size. Must be a multiple of 8.
      */
     PacketLossCounter(uint8_t bitmapSize);
     ~PacketLossCounter();
     /**
-     * \brief Record a successfully received packet
-     * \param seq the packet sequence number
+     * @brief Record a successfully received packet
+     * @param seq the packet sequence number
      */
     void NotifyReceived(uint32_t seq);
     /**
-     * \brief Get the number of lost packets.
-     * \returns the number of lost packets.
+     * @brief Get the number of lost packets.
+     * @returns the number of lost packets.
      */
     uint32_t GetLost() const;
     /**
-     * \brief Return the size of the window used to compute the packet loss.
-     * \return the window size.
+     * @brief Return the size of the window used to compute the packet loss.
+     * @return the window size.
      */
     uint16_t GetBitMapSize() const;
     /**
-     * \brief Set the size of the window used to compute the packet loss.
+     * @brief Set the size of the window used to compute the packet loss.
      *
-     * \param size The window size. Must be a multiple of 8.
+     * @param size The window size. Must be a multiple of 8.
      */
     void SetBitMapSize(uint16_t size);
 
   private:
     /**
-     * \brief Check if a sequence number in the window has been received.
-     * \param seqNum the sequence number.
-     * \returns false if the packet has not been received.
+     * @brief Check if a sequence number in the window has been received.
+     * @param seqNum the sequence number.
+     * @returns false if the packet has not been received.
      */
     bool GetBit(uint32_t seqNum);
     /**
-     * \brief Set a sequence number to a given state.
-     * \param seqNum the sequence number.
-     * \param val false if the packet has not been received.
+     * @brief Set a sequence number to a given state.
+     * @param seqNum the sequence number.
+     * @param val false if the packet has not been received.
      */
     void SetBit(uint32_t seqNum, bool val);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/model/packet-sink.cc ns-3.44/src/applications/model/packet-sink.cc
--- ns-3.43/src/applications/model/packet-sink.cc	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/applications/model/packet-sink.cc	2025-03-09 16:55:49.347370900 -0700
@@ -5,10 +5,10 @@
  *
  * Author:  Tom Henderson (tomhend@u.washington.edu)
  */
+
 #include "packet-sink.h"
 
 #include "ns3/address-utils.h"
-#include "ns3/address.h"
 #include "ns3/boolean.h"
 #include "ns3/inet-socket-address.h"
 #include "ns3/inet6-socket-address.h"
@@ -36,14 +36,9 @@
 {
     static TypeId tid =
         TypeId("ns3::PacketSink")
-            .SetParent<Application>()
+            .SetParent<SinkApplication>()
             .SetGroupName("Applications")
             .AddConstructor<PacketSink>()
-            .AddAttribute("Local",
-                          "The Address on which to Bind the rx socket.",
-                          AddressValue(),
-                          MakeAddressAccessor(&PacketSink::m_local),
-                          MakeAddressChecker())
             .AddAttribute("Protocol",
                           "The type id of the protocol to use for the rx socket.",
                           TypeIdValue(UdpSocketFactory::GetTypeId()),
@@ -70,10 +65,14 @@
 }
 
 PacketSink::PacketSink()
+    : m_buffer{},
+      m_socket{nullptr},
+      m_socket6{nullptr},
+      m_socketList{},
+      m_totalRx{0},
+      m_enableSeqTsSizeHeader{false}
 {
     NS_LOG_FUNCTION(this);
-    m_socket = nullptr;
-    m_totalRx = 0;
 }
 
 PacketSink::~PacketSink()
@@ -118,50 +117,88 @@
 PacketSink::StartApplication() // Called at time specified by Start
 {
     NS_LOG_FUNCTION(this);
+
     // Create the socket if not already
     if (!m_socket)
     {
         m_socket = Socket::CreateSocket(GetNode(), m_tid);
-        NS_ABORT_MSG_IF(m_local.IsInvalid(), "'Local' attribute not properly set");
-        if (m_socket->Bind(m_local) == -1)
+        auto local = m_local;
+        if (local.IsInvalid())
+        {
+            local = InetSocketAddress(Ipv4Address::GetAny(), m_port);
+            NS_LOG_INFO(this << " Binding on port " << m_port << " / " << local << ".");
+        }
+        else if (InetSocketAddress::IsMatchingType(local))
+        {
+            m_port = InetSocketAddress::ConvertFrom(local).GetPort();
+            const auto ipv4 = InetSocketAddress::ConvertFrom(local).GetIpv4();
+            NS_LOG_INFO(this << " Binding on " << ipv4 << " port " << m_port << " / " << local
+                             << ".");
+        }
+        else if (Inet6SocketAddress::IsMatchingType(local))
+        {
+            m_port = Inet6SocketAddress::ConvertFrom(local).GetPort();
+            const auto ipv6 = Inet6SocketAddress::ConvertFrom(local).GetIpv6();
+            NS_LOG_INFO(this << " Binding on " << ipv6 << " port " << m_port << " / " << local
+                             << ".");
+        }
+        if (m_socket->Bind(local) == -1)
         {
             NS_FATAL_ERROR("Failed to bind socket");
         }
         m_socket->Listen();
         m_socket->ShutdownSend();
-        if (addressUtils::IsMulticast(m_local))
+        if (addressUtils::IsMulticast(local))
         {
-            Ptr<UdpSocket> udpSocket = DynamicCast<UdpSocket>(m_socket);
-            if (udpSocket)
+            if (auto udpSocket = DynamicCast<UdpSocket>(m_socket))
             {
                 // equivalent to setsockopt (MCAST_JOIN_GROUP)
-                udpSocket->MulticastJoinGroup(0, m_local);
+                udpSocket->MulticastJoinGroup(0, local);
             }
             else
             {
                 NS_FATAL_ERROR("Error: joining multicast on a non-UDP socket");
             }
         }
+        m_socket->SetRecvCallback(MakeCallback(&PacketSink::HandleRead, this));
+        m_socket->SetRecvPktInfo(true);
+        m_socket->SetAcceptCallback(MakeNullCallback<bool, Ptr<Socket>, const Address&>(),
+                                    MakeCallback(&PacketSink::HandleAccept, this));
+        m_socket->SetCloseCallbacks(MakeCallback(&PacketSink::HandlePeerClose, this),
+                                    MakeCallback(&PacketSink::HandlePeerError, this));
     }
 
-    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
+    if (m_local.IsInvalid() && !m_socket6)
     {
-        m_localPort = 0;
+        // local address is not specified, so create another socket to also listen to all IPv6
+        // addresses
+        m_socket6 = Socket::CreateSocket(GetNode(), m_tid);
+        auto local = Inet6SocketAddress(Ipv6Address::GetAny(), m_port);
+        if (m_socket6->Bind(local) == -1)
+        {
+            NS_FATAL_ERROR("Failed to bind socket");
+        }
+        m_socket6->Listen();
+        m_socket6->ShutdownSend();
+        if (addressUtils::IsMulticast(local))
+        {
+            if (auto udpSocket = DynamicCast<UdpSocket>(m_socket6))
+            {
+                // equivalent to setsockopt (MCAST_JOIN_GROUP)
+                udpSocket->MulticastJoinGroup(0, local);
+            }
+            else
+            {
+                NS_FATAL_ERROR("Error: joining multicast on a non-UDP socket");
+            }
+        }
+        m_socket6->SetRecvCallback(MakeCallback(&PacketSink::HandleRead, this));
+        m_socket6->SetRecvPktInfo(true);
+        m_socket6->SetAcceptCallback(MakeNullCallback<bool, Ptr<Socket>, const Address&>(),
+                                     MakeCallback(&PacketSink::HandleAccept, this));
+        m_socket6->SetCloseCallbacks(MakeCallback(&PacketSink::HandlePeerClose, this),
+                                     MakeCallback(&PacketSink::HandlePeerError, this));
     }
-    m_socket->SetRecvCallback(MakeCallback(&PacketSink::HandleRead, this));
-    m_socket->SetRecvPktInfo(true);
-    m_socket->SetAcceptCallback(MakeNullCallback<bool, Ptr<Socket>, const Address&>(),
-                                MakeCallback(&PacketSink::HandleAccept, this));
-    m_socket->SetCloseCallbacks(MakeCallback(&PacketSink::HandlePeerClose, this),
-                                MakeCallback(&PacketSink::HandlePeerError, this));
 }
 
 void
@@ -170,7 +207,7 @@
     NS_LOG_FUNCTION(this);
     while (!m_socketList.empty()) // these are accepted sockets, close them
     {
-        Ptr<Socket> acceptedSocket = m_socketList.front();
+        auto acceptedSocket = m_socketList.front();
         m_socketList.pop_front();
         acceptedSocket->Close();
     }
@@ -179,16 +216,19 @@
         m_socket->Close();
         m_socket->SetRecvCallback(MakeNullCallback<void, Ptr<Socket>>());
     }
+    if (m_socket6)
+    {
+        m_socket6->Close();
+        m_socket6->SetRecvCallback(MakeNullCallback<void, Ptr<Socket>>());
+    }
 }
 
 void
 PacketSink::HandleRead(Ptr<Socket> socket)
 {
     NS_LOG_FUNCTION(this << socket);
-    Ptr<Packet> packet;
     Address from;
-    Address localAddress;
-    while ((packet = socket->RecvFrom(from)))
+    while (auto packet = socket->RecvFrom(from))
     {
         if (packet->GetSize() == 0)
         { // EOF
@@ -215,15 +255,16 @@
         if (!m_rxTrace.IsEmpty() || !m_rxTraceWithAddresses.IsEmpty() ||
             (!m_rxTraceWithSeqTsSize.IsEmpty() && m_enableSeqTsSizeHeader))
         {
+            Address localAddress;
             Ipv4PacketInfoTag interfaceInfo;
             Ipv6PacketInfoTag interface6Info;
             if (packet->RemovePacketTag(interfaceInfo))
             {
-                localAddress = InetSocketAddress(interfaceInfo.GetAddress(), m_localPort);
+                localAddress = InetSocketAddress(interfaceInfo.GetAddress(), m_port);
             }
             else if (packet->RemovePacketTag(interface6Info))
             {
-                localAddress = Inet6SocketAddress(interface6Info.GetAddress(), m_localPort);
+                localAddress = Inet6SocketAddress(interface6Info.GetAddress(), m_port);
             }
             else
             {
@@ -243,17 +284,16 @@
 void
 PacketSink::PacketReceived(const Ptr<Packet>& p, const Address& from, const Address& localAddress)
 {
-    SeqTsSizeHeader header;
-    Ptr<Packet> buffer;
-
     auto itBuffer = m_buffer.find(from);
     if (itBuffer == m_buffer.end())
     {
-        itBuffer = m_buffer.insert(std::make_pair(from, Create<Packet>(0))).first;
+        itBuffer = m_buffer.emplace(from, Create<Packet>(0)).first;
     }
 
-    buffer = itBuffer->second;
+    auto buffer = itBuffer->second;
     buffer->AddAtEnd(p);
+
+    SeqTsSizeHeader header;
     buffer->PeekHeader(header);
 
     NS_ABORT_IF(header.GetSize() == 0);
@@ -262,7 +302,7 @@
     {
         NS_LOG_DEBUG("Removing packet of size " << header.GetSize() << " from buffer of size "
                                                 << buffer->GetSize());
-        Ptr<Packet> complete = buffer->CreateFragment(0, static_cast<uint32_t>(header.GetSize()));
+        auto complete = buffer->CreateFragment(0, static_cast<uint32_t>(header.GetSize()));
         buffer->RemoveAtStart(static_cast<uint32_t>(header.GetSize()));
 
         complete->RemoveHeader(header);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/model/packet-sink.h ns-3.44/src/applications/model/packet-sink.h
--- ns-3.43/src/applications/model/packet-sink.h	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/applications/model/packet-sink.h	2025-03-09 16:55:49.347370900 -0700
@@ -10,9 +10,8 @@
 #define PACKET_SINK_H
 
 #include "seq-ts-size-header.h"
+#include "sink-application.h"
 
-#include "ns3/address.h"
-#include "ns3/application.h"
 #include "ns3/event-id.h"
 #include "ns3/inet-socket-address.h"
 #include "ns3/inet6-socket-address.h"
@@ -24,13 +23,12 @@
 namespace ns3
 {
 
-class Address;
 class Socket;
 class Packet;
 
 /**
- * \ingroup applications
- * \defgroup packetsink PacketSink
+ * @ingroup applications
+ * @defgroup packetsink PacketSink
  *
  * This application was written to complement OnOffApplication, but it
  * is more general so a PacketSink name was selected.  Functionally it is
@@ -42,9 +40,9 @@
  */
 
 /**
- * \ingroup packetsink
+ * @ingroup packetsink
  *
- * \brief Receive and consume traffic generated to an IP address and port
+ * @brief Receive and consume traffic generated to an IP address and port
  *
  * This application was written to complement OnOffApplication, but it
  * is more general so a PacketSink name was selected.  Functionally it is
@@ -60,40 +58,40 @@
  * enabled, it prints out the size of packets and their address.
  * A tracing source to Receive() is also available.
  */
-class PacketSink : public Application
+class PacketSink : public SinkApplication
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
-    PacketSink();
 
+    PacketSink();
     ~PacketSink() override;
 
     /**
-     * \return the total bytes received in this sink app
+     * @return the total bytes received in this sink app
      */
     uint64_t GetTotalRx() const;
 
     /**
-     * \return pointer to listening socket
+     * @return pointer to listening socket
      */
     Ptr<Socket> GetListeningSocket() const;
 
     /**
-     * \return list of pointers to accepted sockets
+     * @return list of pointers to accepted sockets
      */
     std::list<Ptr<Socket>> GetAcceptedSockets() const;
 
     /**
      * TracedCallback signature for a reception with addresses and SeqTsSizeHeader
      *
-     * \param p The packet received (without the SeqTsSize header)
-     * \param from From address
-     * \param to Local address
-     * \param header The SeqTsSize header
+     * @param p The packet received (without the SeqTsSize header)
+     * @param from From address
+     * @param to Local address
+     * @param header The SeqTsSize header
      */
     typedef void (*SeqTsSizeCallback)(Ptr<const Packet> p,
                                       const Address& from,
@@ -108,32 +106,32 @@
     void StopApplication() override;
 
     /**
-     * \brief Handle a packet received by the application
-     * \param socket the receiving socket
+     * @brief Handle a packet received by the application
+     * @param socket the receiving socket
      */
     void HandleRead(Ptr<Socket> socket);
     /**
-     * \brief Handle an incoming connection
-     * \param socket the incoming connection socket
-     * \param from the address the connection is from
+     * @brief Handle an incoming connection
+     * @param socket the incoming connection socket
+     * @param from the address the connection is from
      */
     void HandleAccept(Ptr<Socket> socket, const Address& from);
     /**
-     * \brief Handle an connection close
-     * \param socket the connected socket
+     * @brief Handle an connection close
+     * @param socket the connected socket
      */
     void HandlePeerClose(Ptr<Socket> socket);
     /**
-     * \brief Handle an connection error
-     * \param socket the connected socket
+     * @brief Handle an connection error
+     * @param socket the connected socket
      */
     void HandlePeerError(Ptr<Socket> socket);
 
     /**
-     * \brief Packet received: assemble byte stream to extract SeqTsSizeHeader
-     * \param p received packet
-     * \param from from address
-     * \param localAddress local address
+     * @brief Packet received: assemble byte stream to extract SeqTsSizeHeader
+     * @param p received packet
+     * @param from from address
+     * @param localAddress local address
      *
      * The method assembles a received byte stream and extracts SeqTsSizeHeader
      * instances from the stream to export in a trace source.
@@ -141,14 +139,14 @@
     void PacketReceived(const Ptr<Packet>& p, const Address& from, const Address& localAddress);
 
     /**
-     * \brief Hashing for the Address class
+     * @brief Hashing for the Address class
      */
     struct AddressHash
     {
         /**
-         * \brief operator ()
-         * \param x the address of which calculate the hash
-         * \return the hash of x
+         * @brief operator ()
+         * @param x the address of which calculate the hash
+         * @return the hash of x
          *
          * Should this method go in address.h?
          *
@@ -176,17 +174,17 @@
 
     std::unordered_map<Address, Ptr<Packet>, AddressHash> m_buffer; //!< Buffer for received packets
 
+    Ptr<Socket> m_socket;  //!< Socket
+    Ptr<Socket> m_socket6; //!< IPv6 Socket (used if only port is specified)
+
     // In the case of TCP, each socket accept returns a new socket, so the
     // listening socket is stored separately from the accepted sockets
-    Ptr<Socket> m_socket;                //!< Listening socket
     std::list<Ptr<Socket>> m_socketList; //!< the accepted sockets
 
-    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
+    uint64_t m_totalRx; //!< Total bytes received
+    TypeId m_tid;       //!< Protocol TypeId
 
-    bool m_enableSeqTsSizeHeader{false}; //!< Enable or disable the export of SeqTsSize header
+    bool m_enableSeqTsSizeHeader; //!< Enable or disable the export of SeqTsSize header
 
     /// Traced Callback: received packets, source address.
     TracedCallback<Ptr<const Packet>, const Address&> m_rxTrace;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/model/seq-ts-echo-header.cc ns-3.44/src/applications/model/seq-ts-echo-header.cc
--- ns-3.43/src/applications/model/seq-ts-echo-header.cc	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/applications/model/seq-ts-echo-header.cc	2025-03-09 16:55:49.347370900 -0700
@@ -24,7 +24,7 @@
 SeqTsEchoHeader::SeqTsEchoHeader()
     : m_seq(0),
       m_tsValue(Simulator::Now()),
-      m_tsEchoReply(Seconds(0))
+      m_tsEchoReply()
 {
     NS_LOG_FUNCTION(this);
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/model/seq-ts-echo-header.h ns-3.44/src/applications/model/seq-ts-echo-header.h
--- ns-3.43/src/applications/model/seq-ts-echo-header.h	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/applications/model/seq-ts-echo-header.h	2025-03-09 16:55:49.347370900 -0700
@@ -16,9 +16,9 @@
 namespace ns3
 {
 /**
- * \ingroup applications
- * \class SeqTsEchoHeader
- * \brief Packet header to carry sequence number and two timestamps
+ * @ingroup applications
+ * @class SeqTsEchoHeader
+ * @brief Packet header to carry sequence number and two timestamps
  *
  * The header is made of a 32bits sequence number followed by
  * two 64bits time stamps (Transmit and Receive).
@@ -27,46 +27,46 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief constructor
+     * @brief constructor
      */
     SeqTsEchoHeader();
 
     /**
-     * \param seq the sequence number
+     * @param seq the sequence number
      */
     void SetSeq(uint32_t seq);
 
     /**
-     * \return the sequence number
+     * @return the sequence number
      */
     uint32_t GetSeq() const;
 
     /**
-     * \return A time value set by the sender
+     * @return A time value set by the sender
      */
     Time GetTsValue() const;
 
     /**
-     * \return A time value echoing the received timestamp
+     * @return A time value echoing the received timestamp
      */
     Time GetTsEchoReply() const;
 
     /**
-     * \brief Set the sender's time value
-     * \param ts Time value to set
+     * @brief Set the sender's time value
+     * @param ts Time value to set
      */
     void SetTsValue(Time ts);
 
     /**
-     * \brief Upon SeqTsEchoHeader reception, the host answers via echoing
+     * @brief Upon SeqTsEchoHeader reception, the host answers via echoing
      * back the received timestamp
-     * \param ts received timestamp. If not called, will contain 0
+     * @param ts received timestamp. If not called, will contain 0
      */
     void SetTsEchoReply(Time ts);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/model/seq-ts-header.h ns-3.44/src/applications/model/seq-ts-header.h
--- ns-3.43/src/applications/model/seq-ts-header.h	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/applications/model/seq-ts-header.h	2025-03-09 16:55:49.347370900 -0700
@@ -15,9 +15,9 @@
 namespace ns3
 {
 /**
- * \ingroup applications
+ * @ingroup applications
  *
- * \brief Packet header to carry sequence number and timestamp
+ * @brief Packet header to carry sequence number and timestamp
  *
  * The header is used as a payload in applications (typically UDP) to convey
  * a 32 bit sequence number followed by a 64 bit timestamp (12 bytes total).
@@ -36,21 +36,21 @@
     SeqTsHeader();
 
     /**
-     * \param seq the sequence number
+     * @param seq the sequence number
      */
     void SetSeq(uint32_t seq);
     /**
-     * \return the sequence number
+     * @return the sequence number
      */
     uint32_t GetSeq() const;
     /**
-     * \return the time stamp
+     * @return the time stamp
      */
     Time GetTs() const;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/model/seq-ts-size-header.h ns-3.44/src/applications/model/seq-ts-size-header.h
--- ns-3.43/src/applications/model/seq-ts-size-header.h	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/applications/model/seq-ts-size-header.h	2025-03-09 16:55:49.347370900 -0700
@@ -14,8 +14,8 @@
 namespace ns3
 {
 /**
- * \ingroup applications
- * \brief Header with a sequence, a timestamp, and a "size" attribute
+ * @ingroup applications
+ * @brief Header with a sequence, a timestamp, and a "size" attribute
  *
  * This header adds a size attribute to the sequence number and timestamp
  * of class \c SeqTsHeader.  The size attribute can be used to track
@@ -27,25 +27,25 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief constructor
+     * @brief constructor
      */
     SeqTsSizeHeader();
 
     /**
-     * \brief Set the size information that the header will carry
-     * \param size the size
+     * @brief Set the size information that the header will carry
+     * @param size the size
      */
     void SetSize(uint64_t size);
 
     /**
-     * \brief Get the size information that the header is carrying
-     * \return the size
+     * @brief Get the size information that the header is carrying
+     * @return the size
      */
     uint64_t GetSize() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/model/sink-application.cc ns-3.44/src/applications/model/sink-application.cc
--- ns-3.43/src/applications/model/sink-application.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/applications/model/sink-application.cc	2025-03-09 16:55:49.347370900 -0700
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2024 DERONNE SOFTWARE ENGINEERING
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+#include "sink-application.h"
+
+#include "ns3/log.h"
+#include "ns3/uinteger.h"
+
+namespace ns3
+{
+
+NS_LOG_COMPONENT_DEFINE("SinkApplication");
+
+NS_OBJECT_ENSURE_REGISTERED(SinkApplication);
+
+TypeId
+SinkApplication::GetTypeId()
+{
+    static TypeId tid =
+        TypeId("ns3::SinkApplication")
+            .SetParent<Application>()
+            .SetGroupName("Applications")
+            .AddAttribute(
+                "Local",
+                "The Address on which to Bind the rx socket. "
+                "If it is not specified, it will listen to any address.",
+                AddressValue(),
+                MakeAddressAccessor(&SinkApplication::SetLocal, &SinkApplication::GetLocal),
+                MakeAddressChecker())
+            .AddAttribute(
+                "Port",
+                "Port on which the application listens for incoming packets.",
+                UintegerValue(INVALID_PORT),
+                MakeUintegerAccessor(&SinkApplication::SetPort, &SinkApplication::GetPort),
+                MakeUintegerChecker<uint32_t>());
+    return tid;
+}
+
+SinkApplication::SinkApplication(uint16_t defaultPort)
+    : m_port{defaultPort}
+{
+    NS_LOG_FUNCTION(this << defaultPort);
+}
+
+SinkApplication::~SinkApplication()
+{
+    NS_LOG_FUNCTION(this);
+}
+
+void
+SinkApplication::SetLocal(const Address& addr)
+{
+    NS_LOG_FUNCTION(this << addr);
+    m_local = addr;
+}
+
+Address
+SinkApplication::GetLocal() const
+{
+    return m_local;
+}
+
+void
+SinkApplication::SetPort(uint32_t port)
+{
+    NS_LOG_FUNCTION(this << port);
+    if (port == INVALID_PORT)
+    {
+        return;
+    }
+    m_port = port;
+}
+
+uint32_t
+SinkApplication::GetPort() const
+{
+    return m_port;
+}
+
+} // Namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/model/sink-application.h ns-3.44/src/applications/model/sink-application.h
--- ns-3.43/src/applications/model/sink-application.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/applications/model/sink-application.h	2025-03-09 16:55:49.347370900 -0700
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2024 DERONNE SOFTWARE ENGINEERING
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+#ifndef SINK_APPLICATION_H
+#define SINK_APPLICATION_H
+
+#include "ns3/address.h"
+#include "ns3/application.h"
+
+#include <limits>
+
+namespace ns3
+{
+
+/**
+ * @ingroup applications
+ * @brief Base class for sink applications.
+ *
+ * This class can be used as a base class for sink applications.
+ * A sink application is an application that is primarily used to only receive or echo packets.
+ *
+ * The main purpose of this base class application public API is to hold attributes for the local
+ * (IPv4 or IPv6) address and port to bind to.
+ *
+ * There are three ways that the port value can be configured. First, and most typically, through
+ * the use of a socket address (InetSocketAddress or Inet6SocketAddress) that is configured as the
+ * Local address to bind to. Second, through direct configuration of the Port attribute. Third,
+ * through the use of an optional constructor argument. If multiple of these port configuration
+ * methods are used, it is up to subclass definition which one takes precedence; in the existing
+ * subclasses in this directory, the port value configured in the Local socket address (if a socket
+ * address is configured there) will take precedence.
+ */
+class SinkApplication : public Application
+{
+  public:
+    /**
+     * @brief Get the type ID.
+     * @return the object TypeId
+     */
+    static TypeId GetTypeId();
+
+    /**
+     * Constructor
+     *
+     * @param defaultPort the default port number
+     */
+    SinkApplication(uint16_t defaultPort = 0);
+    ~SinkApplication() override;
+
+    static constexpr uint32_t INVALID_PORT{std::numeric_limits<uint32_t>::max()}; //!< invalid port
+
+  protected:
+    Address m_local; //!< Local address to bind to (address and port)
+    uint32_t m_port; //!< Local port to bind to
+
+  private:
+    /**
+     * @brief set the local address
+     * @param addr local address
+     */
+    virtual void SetLocal(const Address& addr);
+
+    /**
+     * @brief get the local address
+     * @return the local address
+     */
+    Address GetLocal() const;
+
+    /**
+     * @brief set the server port
+     * @param port server port
+     */
+    virtual void SetPort(uint32_t port);
+
+    /**
+     * @brief get the server port
+     * @return the server port
+     */
+    uint32_t GetPort() const;
+};
+
+} // namespace ns3
+
+#endif /* SINK_APPLICATION_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/model/source-application.cc ns-3.44/src/applications/model/source-application.cc
--- ns-3.43/src/applications/model/source-application.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/applications/model/source-application.cc	2025-03-09 16:55:49.347370900 -0700
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2024 DERONNE SOFTWARE ENGINEERING
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+#include "source-application.h"
+
+#include "ns3/log.h"
+#include "ns3/uinteger.h"
+
+namespace ns3
+{
+
+NS_LOG_COMPONENT_DEFINE("SourceApplication");
+
+NS_OBJECT_ENSURE_REGISTERED(SourceApplication);
+
+TypeId
+SourceApplication::GetTypeId()
+{
+    static TypeId tid =
+        TypeId("ns3::SourceApplication")
+            .SetParent<Application>()
+            .SetGroupName("Applications")
+            .AddAttribute(
+                "Remote",
+                "The address of the destination, made of the remote IP address and the "
+                "destination port",
+                AddressValue(),
+                MakeAddressAccessor(&SourceApplication::SetRemote, &SourceApplication::GetRemote),
+                MakeAddressChecker())
+            .AddAttribute("Local",
+                          "The Address on which to bind the socket. If not set, it is generated "
+                          "automatically when needed by the application.",
+                          AddressValue(),
+                          MakeAddressAccessor(&SourceApplication::m_local),
+                          MakeAddressChecker())
+            .AddAttribute("Tos",
+                          "The Type of Service used to send IPv4 packets. "
+                          "All 8 bits of the TOS byte are set (including ECN bits).",
+                          UintegerValue(0),
+                          MakeUintegerAccessor(&SourceApplication::m_tos),
+                          MakeUintegerChecker<uint8_t>());
+    return tid;
+}
+
+SourceApplication::SourceApplication()
+    : m_peer{}
+{
+    NS_LOG_FUNCTION(this);
+}
+
+SourceApplication::~SourceApplication()
+{
+    NS_LOG_FUNCTION(this);
+}
+
+void
+SourceApplication::SetRemote(const Address& addr)
+{
+    NS_LOG_FUNCTION(this << addr);
+    if (!addr.IsInvalid())
+    {
+        m_peer = addr;
+    }
+}
+
+Address
+SourceApplication::GetRemote() const
+{
+    return m_peer;
+}
+
+} // Namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/model/source-application.h ns-3.44/src/applications/model/source-application.h
--- ns-3.43/src/applications/model/source-application.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/applications/model/source-application.h	2025-03-09 16:55:49.347370900 -0700
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2024 DERONNE SOFTWARE ENGINEERING
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+#ifndef SOURCE_APPLICATION_H
+#define SOURCE_APPLICATION_H
+
+#include "ns3/address.h"
+#include "ns3/application.h"
+
+namespace ns3
+{
+
+/**
+ * @ingroup applications
+ * @brief Base class for source applications.
+ *
+ * This class can be used as a base class for source applications.
+ * A source application is one that primarily sources new data towards a single remote client
+ * address and port, and may also receive data (such as an HTTP server).
+ *
+ * The main purpose of this base class application public API is to provide a uniform way to
+ * configure remote and local addresses.
+ *
+ * Unlike the SinkApplication, the SourceApplication does not expose an individual Port attribute.
+ * Instead, the port values are embedded in the Local and Remote address attributes, which should be
+ * configured to an InetSocketAddress or Inet6SocketAddress value that contains the desired port
+ * number.
+ */
+class SourceApplication : public Application
+{
+  public:
+    /**
+     * @brief Get the type ID.
+     * @return the object TypeId
+     */
+    static TypeId GetTypeId();
+
+    SourceApplication();
+    ~SourceApplication() override;
+
+    /**
+     * @brief set the remote address
+     * @param addr remote address
+     */
+    virtual void SetRemote(const Address& addr);
+
+    /**
+     * @brief get the remote address
+     * @return the remote address
+     */
+    Address GetRemote() const;
+
+  protected:
+    Address m_peer;  //!< Peer address
+    Address m_local; //!< Local address to bind to
+    uint8_t m_tos;   //!< The packets Type of Service
+};
+
+} // namespace ns3
+
+#endif /* SOURCE_APPLICATION_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/model/three-gpp-http-client.cc ns-3.44/src/applications/model/three-gpp-http-client.cc
--- ns-3.43/src/applications/model/three-gpp-http-client.cc	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/applications/model/three-gpp-http-client.cc	2025-03-09 16:55:49.347370900 -0700
@@ -11,17 +11,16 @@
 
 #include "three-gpp-http-variables.h"
 
-#include <ns3/callback.h>
-#include <ns3/double.h>
-#include <ns3/inet-socket-address.h>
-#include <ns3/inet6-socket-address.h>
-#include <ns3/log.h>
-#include <ns3/packet.h>
-#include <ns3/pointer.h>
-#include <ns3/simulator.h>
-#include <ns3/socket.h>
-#include <ns3/tcp-socket-factory.h>
-#include <ns3/uinteger.h>
+#include "ns3/address-utils.h"
+#include "ns3/callback.h"
+#include "ns3/double.h"
+#include "ns3/log.h"
+#include "ns3/packet.h"
+#include "ns3/pointer.h"
+#include "ns3/simulator.h"
+#include "ns3/socket.h"
+#include "ns3/tcp-socket-factory.h"
+#include "ns3/uinteger.h"
 
 NS_LOG_COMPONENT_DEFINE("ThreeGppHttpClient");
 
@@ -31,16 +30,17 @@
 NS_OBJECT_ENSURE_REGISTERED(ThreeGppHttpClient);
 
 ThreeGppHttpClient::ThreeGppHttpClient()
-    : m_state(NOT_STARTED),
-      m_socket(nullptr),
-      m_objectBytesToBeReceived(0),
-      m_objectClientTs(MilliSeconds(0)),
-      m_objectServerTs(MilliSeconds(0)),
-      m_embeddedObjectsToBeRequested(0),
-      m_pageLoadStartTs(MilliSeconds(0)),
-      m_numberEmbeddedObjectsRequested(0),
-      m_numberBytesPage(0),
-      m_httpVariables(CreateObject<ThreeGppHttpVariables>())
+    : m_state{NOT_STARTED},
+      m_socket{nullptr},
+      m_objectBytesToBeReceived{0},
+      m_objectClientTs{},
+      m_objectServerTs{},
+      m_embeddedObjectsToBeRequested{0},
+      m_pageLoadStartTs{},
+      m_numberEmbeddedObjectsRequested{0},
+      m_numberBytesPage{0},
+      m_httpVariables{CreateObject<ThreeGppHttpVariables>()},
+      m_peerPort{}
 {
     NS_LOG_FUNCTION(this);
 }
@@ -51,7 +51,7 @@
 {
     static TypeId tid =
         TypeId("ns3::ThreeGppHttpClient")
-            .SetParent<Application>()
+            .SetParent<SourceApplication>()
             .AddConstructor<ThreeGppHttpClient>()
             .AddAttribute(
                 "Variables",
@@ -62,19 +62,17 @@
             .AddAttribute("RemoteServerAddress",
                           "The address of the destination server.",
                           AddressValue(),
-                          MakeAddressAccessor(&ThreeGppHttpClient::m_remoteServerAddress),
-                          MakeAddressChecker())
+                          MakeAddressAccessor(&ThreeGppHttpClient::SetRemote),
+                          MakeAddressChecker(),
+                          TypeId::SupportLevel::DEPRECATED,
+                          "Replaced by Remote in ns-3.44.")
             .AddAttribute("RemoteServerPort",
                           "The destination port of the outbound packets.",
                           UintegerValue(80), // the default HTTP port
-                          MakeUintegerAccessor(&ThreeGppHttpClient::m_remoteServerPort),
-                          MakeUintegerChecker<uint16_t>())
-            .AddAttribute("Tos",
-                          "The Type of Service used to send packets. "
-                          "All 8 bits of the TOS byte are set (including ECN bits).",
-                          UintegerValue(0),
-                          MakeUintegerAccessor(&ThreeGppHttpClient::m_tos),
-                          MakeUintegerChecker<uint8_t>())
+                          MakeUintegerAccessor(&ThreeGppHttpClient::SetPort),
+                          MakeUintegerChecker<uint16_t>(),
+                          TypeId::SupportLevel::DEPRECATED,
+                          "Replaced by Remote in ns-3.44.")
             .AddTraceSource("RxPage",
                             "A page has been received.",
                             MakeTraceSourceAccessor(&ThreeGppHttpClient::m_rxPageTrace),
@@ -139,6 +137,36 @@
     return tid;
 }
 
+void
+ThreeGppHttpClient::SetRemote(const Address& addr)
+{
+    NS_LOG_FUNCTION(this << addr);
+    if (!addr.IsInvalid())
+    {
+        m_peer = addr;
+        if (m_peerPort)
+        {
+            SetPort(*m_peerPort);
+        }
+    }
+}
+
+void
+ThreeGppHttpClient::SetPort(uint16_t port)
+{
+    NS_LOG_FUNCTION(this << port);
+    if (m_peer.IsInvalid())
+    {
+        // save for later
+        m_peerPort = port;
+        return;
+    }
+    if (Ipv4Address::IsMatchingType(m_peer) || Ipv6Address::IsMatchingType(m_peer))
+    {
+        m_peer = addressUtils::ConvertToSocketAddress(m_peer, port);
+    }
+}
+
 Ptr<Socket>
 ThreeGppHttpClient::GetSocket() const
 {
@@ -230,19 +258,16 @@
 {
     NS_LOG_FUNCTION(this << socket);
 
-    if (m_state == CONNECTING)
-    {
-        NS_ASSERT_MSG(m_socket == socket, "Invalid socket.");
-        m_connectionEstablishedTrace(this);
-        socket->SetRecvCallback(MakeCallback(&ThreeGppHttpClient::ReceivedDataCallback, this));
-        NS_ASSERT(m_embeddedObjectsToBeRequested == 0);
-        m_eventRequestMainObject =
-            Simulator::ScheduleNow(&ThreeGppHttpClient::RequestMainObject, this);
-    }
-    else
+    if (m_state != CONNECTING)
     {
         NS_FATAL_ERROR("Invalid state " << GetStateString() << " for ConnectionSucceeded().");
     }
+
+    NS_ASSERT_MSG(m_socket == socket, "Invalid socket.");
+    m_connectionEstablishedTrace(this);
+    socket->SetRecvCallback(MakeCallback(&ThreeGppHttpClient::ReceivedDataCallback, this));
+    NS_ASSERT(m_embeddedObjectsToBeRequested == 0);
+    m_eventRequestMainObject = Simulator::ScheduleNow(&ThreeGppHttpClient::RequestMainObject, this);
 }
 
 void
@@ -252,9 +277,7 @@
 
     if (m_state == CONNECTING)
     {
-        NS_LOG_ERROR("Client failed to connect"
-                     << " to remote address " << m_remoteServerAddress << " port "
-                     << m_remoteServerPort << ".");
+        NS_LOG_ERROR("Client failed to connect to remote address " << m_peer);
     }
     else
     {
@@ -301,10 +324,8 @@
 {
     NS_LOG_FUNCTION(this << socket);
 
-    Ptr<Packet> packet;
     Address from;
-
-    while ((packet = socket->RecvFrom(from)))
+    while (auto packet = socket->RecvFrom(from))
     {
         if (packet->GetSize() == 0)
         {
@@ -353,65 +374,67 @@
 {
     NS_LOG_FUNCTION(this);
 
-    if (m_state == NOT_STARTED || m_state == EXPECTING_EMBEDDED_OBJECT ||
-        m_state == PARSING_MAIN_OBJECT || m_state == READING)
+    if (m_state != NOT_STARTED && m_state != EXPECTING_EMBEDDED_OBJECT &&
+        m_state != PARSING_MAIN_OBJECT && m_state != READING)
     {
-        m_socket = Socket::CreateSocket(GetNode(), TcpSocketFactory::GetTypeId());
-        NS_ABORT_MSG_IF(m_remoteServerAddress.IsInvalid(),
-                        "'RemoteServerAddress' attribute not properly set");
-        if (Ipv4Address::IsMatchingType(m_remoteServerAddress))
-        {
-            int ret [[maybe_unused]];
-
-            ret = m_socket->Bind();
-            NS_LOG_DEBUG(this << " Bind() return value= " << ret
-                              << " GetErrNo= " << m_socket->GetErrno() << ".");
-
-            Ipv4Address ipv4 = Ipv4Address::ConvertFrom(m_remoteServerAddress);
-            InetSocketAddress inetSocket = InetSocketAddress(ipv4, m_remoteServerPort);
-            NS_LOG_INFO(this << " Connecting to " << ipv4 << " port " << m_remoteServerPort << " / "
-                             << inetSocket << ".");
-            m_socket->SetIpTos(m_tos);
-            ret = m_socket->Connect(inetSocket);
-            NS_LOG_DEBUG(this << " Connect() return value= " << ret
-                              << " GetErrNo= " << m_socket->GetErrno() << ".");
-        }
-        else if (Ipv6Address::IsMatchingType(m_remoteServerAddress))
-        {
-            int ret [[maybe_unused]];
-
-            ret = m_socket->Bind6();
-            NS_LOG_DEBUG(this << " Bind6() return value= " << ret
-                              << " GetErrNo= " << m_socket->GetErrno() << ".");
-
-            Ipv6Address ipv6 = Ipv6Address::ConvertFrom(m_remoteServerAddress);
-            Inet6SocketAddress inet6Socket = Inet6SocketAddress(ipv6, m_remoteServerPort);
-            NS_LOG_INFO(this << " connecting to " << ipv6 << " port " << m_remoteServerPort << " / "
-                             << inet6Socket << ".");
-            ret = m_socket->Connect(inet6Socket);
-            NS_LOG_DEBUG(this << " Connect() return value= " << ret
-                              << " GetErrNo= " << m_socket->GetErrno() << ".");
-        }
-
-        NS_ASSERT_MSG(m_socket, "Failed creating socket.");
-
-        SwitchToState(CONNECTING);
-
-        m_socket->SetConnectCallback(
-            MakeCallback(&ThreeGppHttpClient::ConnectionSucceededCallback, this),
-            MakeCallback(&ThreeGppHttpClient::ConnectionFailedCallback, this));
-        m_socket->SetCloseCallbacks(MakeCallback(&ThreeGppHttpClient::NormalCloseCallback, this),
-                                    MakeCallback(&ThreeGppHttpClient::ErrorCloseCallback, this));
-        m_socket->SetRecvCallback(MakeCallback(&ThreeGppHttpClient::ReceivedDataCallback, this));
-        m_socket->SetAttribute("MaxSegLifetime", DoubleValue(0.02)); // 20 ms.
+        NS_FATAL_ERROR("Invalid state " << GetStateString() << " for OpenConnection().");
+    }
 
-    } // end of `if (m_state == {NOT_STARTED, EXPECTING_EMBEDDED_OBJECT, PARSING_MAIN_OBJECT,
-      // READING})`
+    m_socket = Socket::CreateSocket(GetNode(), TcpSocketFactory::GetTypeId());
+    NS_ABORT_MSG_IF(m_peer.IsInvalid(), "Remote address not properly set");
+    if (!m_local.IsInvalid())
+    {
+        NS_ABORT_MSG_IF((Inet6SocketAddress::IsMatchingType(m_peer) &&
+                         InetSocketAddress::IsMatchingType(m_local)) ||
+                            (InetSocketAddress::IsMatchingType(m_peer) &&
+                             Inet6SocketAddress::IsMatchingType(m_local)),
+                        "Incompatible peer and local address IP version");
+    }
+    if (InetSocketAddress::IsMatchingType(m_peer))
+    {
+        const auto ret [[maybe_unused]] =
+            m_local.IsInvalid() ? m_socket->Bind() : m_socket->Bind(m_local);
+        NS_LOG_DEBUG(this << " Bind() return value= " << ret
+                          << " GetErrNo= " << m_socket->GetErrno() << ".");
+
+        const auto ipv4 = InetSocketAddress::ConvertFrom(m_peer).GetIpv4();
+        const auto port = InetSocketAddress::ConvertFrom(m_peer).GetPort();
+        NS_LOG_INFO(this << " Connecting to " << ipv4 << " port " << port << " / " << m_peer
+                         << ".");
+        m_socket->SetIpTos(m_tos);
+    }
+    else if (Inet6SocketAddress::IsMatchingType(m_peer))
+    {
+        const auto ret [[maybe_unused]] =
+            m_local.IsInvalid() ? m_socket->Bind6() : m_socket->Bind(m_local);
+        NS_LOG_DEBUG(this << " Bind6() return value= " << ret
+                          << " GetErrNo= " << m_socket->GetErrno() << ".");
+
+        const auto ipv6 = Inet6SocketAddress::ConvertFrom(m_peer).GetIpv6();
+        const auto port = Inet6SocketAddress::ConvertFrom(m_peer).GetPort();
+        NS_LOG_INFO(this << " Connecting to " << ipv6 << " port " << port << " / " << m_peer
+                         << ".");
+    }
     else
     {
-        NS_FATAL_ERROR("Invalid state " << GetStateString() << " for OpenConnection().");
+        NS_ASSERT_MSG(false, "Incompatible address type: " << m_peer);
     }
 
+    const auto ret [[maybe_unused]] = m_socket->Connect(m_peer);
+    NS_LOG_DEBUG(this << " Connect() return value= " << ret << " GetErrNo= " << m_socket->GetErrno()
+                      << ".");
+
+    NS_ASSERT_MSG(m_socket, "Failed creating socket.");
+
+    SwitchToState(CONNECTING);
+
+    m_socket->SetConnectCallback(
+        MakeCallback(&ThreeGppHttpClient::ConnectionSucceededCallback, this),
+        MakeCallback(&ThreeGppHttpClient::ConnectionFailedCallback, this));
+    m_socket->SetCloseCallbacks(MakeCallback(&ThreeGppHttpClient::NormalCloseCallback, this),
+                                MakeCallback(&ThreeGppHttpClient::ErrorCloseCallback, this));
+    m_socket->SetRecvCallback(MakeCallback(&ThreeGppHttpClient::ReceivedDataCallback, this));
+    m_socket->SetAttribute("MaxSegLifetime", DoubleValue(0.02)); // 20 ms.
 } // end of `void OpenConnection ()`
 
 void
@@ -419,37 +442,35 @@
 {
     NS_LOG_FUNCTION(this);
 
-    if (m_state == CONNECTING || m_state == READING)
+    if (m_state != CONNECTING && m_state != READING)
     {
-        ThreeGppHttpHeader header;
-        header.SetContentLength(0); // Request does not need any content length.
-        header.SetContentType(ThreeGppHttpHeader::MAIN_OBJECT);
-        header.SetClientTs(Simulator::Now());
-
-        const uint32_t requestSize = m_httpVariables->GetRequestSize();
-        Ptr<Packet> packet = Create<Packet>(requestSize);
-        packet->AddHeader(header);
-        const uint32_t packetSize = packet->GetSize();
-        m_txMainObjectRequestTrace(packet);
-        m_txTrace(packet);
-        const int actualBytes = m_socket->Send(packet);
-        NS_LOG_DEBUG(this << " Send() packet " << packet << " of " << packet->GetSize() << " bytes,"
-                          << " return value= " << actualBytes << ".");
-        if (actualBytes != static_cast<int>(packetSize))
-        {
-            NS_LOG_ERROR(this << " Failed to send request for embedded object,"
-                              << " GetErrNo= " << m_socket->GetErrno() << ","
-                              << " waiting for another Tx opportunity.");
-        }
-        else
-        {
-            SwitchToState(EXPECTING_MAIN_OBJECT);
-            m_pageLoadStartTs = Simulator::Now(); // start counting page loading time
-        }
+        NS_FATAL_ERROR("Invalid state " << GetStateString() << " for RequestMainObject().");
+    }
+
+    ThreeGppHttpHeader header;
+    header.SetContentLength(0); // Request does not need any content length.
+    header.SetContentType(ThreeGppHttpHeader::MAIN_OBJECT);
+    header.SetClientTs(Simulator::Now());
+
+    const auto requestSize = m_httpVariables->GetRequestSize();
+    auto packet = Create<Packet>(requestSize);
+    packet->AddHeader(header);
+    const auto packetSize = packet->GetSize();
+    m_txMainObjectRequestTrace(packet);
+    m_txTrace(packet);
+    const auto actualBytes = m_socket->Send(packet);
+    NS_LOG_DEBUG(this << " Send() packet " << packet << " of " << packet->GetSize() << " bytes,"
+                      << " return value= " << actualBytes << ".");
+    if (actualBytes != static_cast<int>(packetSize))
+    {
+        NS_LOG_ERROR(this << " Failed to send request for embedded object,"
+                          << " GetErrNo= " << m_socket->GetErrno() << ","
+                          << " waiting for another Tx opportunity.");
     }
     else
     {
-        NS_FATAL_ERROR("Invalid state " << GetStateString() << " for RequestMainObject().");
+        SwitchToState(EXPECTING_MAIN_OBJECT);
+        m_pageLoadStartTs = Simulator::Now(); // start counting page loading time
     }
 
 } // end of `void RequestMainObject ()`
@@ -459,47 +480,43 @@
 {
     NS_LOG_FUNCTION(this);
 
-    if (m_state == CONNECTING || m_state == PARSING_MAIN_OBJECT ||
-        m_state == EXPECTING_EMBEDDED_OBJECT)
+    if (m_state != CONNECTING && m_state != PARSING_MAIN_OBJECT &&
+        m_state != EXPECTING_EMBEDDED_OBJECT)
     {
-        if (m_embeddedObjectsToBeRequested > 0)
-        {
-            ThreeGppHttpHeader header;
-            header.SetContentLength(0); // Request does not need any content length.
-            header.SetContentType(ThreeGppHttpHeader::EMBEDDED_OBJECT);
-            header.SetClientTs(Simulator::Now());
-
-            const uint32_t requestSize = m_httpVariables->GetRequestSize();
-            Ptr<Packet> packet = Create<Packet>(requestSize);
-            packet->AddHeader(header);
-            const uint32_t packetSize = packet->GetSize();
-            m_txEmbeddedObjectRequestTrace(packet);
-            m_txTrace(packet);
-            const int actualBytes = m_socket->Send(packet);
-            NS_LOG_DEBUG(this << " Send() packet " << packet << " of " << packet->GetSize()
-                              << " bytes,"
-                              << " return value= " << actualBytes << ".");
-
-            if (actualBytes != static_cast<int>(packetSize))
-            {
-                NS_LOG_ERROR(this << " Failed to send request for embedded object,"
-                                  << " GetErrNo= " << m_socket->GetErrno() << ","
-                                  << " waiting for another Tx opportunity.");
-            }
-            else
-            {
-                m_embeddedObjectsToBeRequested--;
-                SwitchToState(EXPECTING_EMBEDDED_OBJECT);
-            }
-        }
-        else
-        {
-            NS_LOG_WARN(this << " No embedded object to be requested.");
-        }
+        NS_FATAL_ERROR("Invalid state " << GetStateString() << " for RequestEmbeddedObject().");
+    }
+
+    if (m_embeddedObjectsToBeRequested == 0)
+    {
+        NS_LOG_WARN(this << " No embedded object to be requested.");
+        return;
+    }
+
+    ThreeGppHttpHeader header;
+    header.SetContentLength(0); // Request does not need any content length.
+    header.SetContentType(ThreeGppHttpHeader::EMBEDDED_OBJECT);
+    header.SetClientTs(Simulator::Now());
+
+    const auto requestSize = m_httpVariables->GetRequestSize();
+    auto packet = Create<Packet>(requestSize);
+    packet->AddHeader(header);
+    const auto packetSize = packet->GetSize();
+    m_txEmbeddedObjectRequestTrace(packet);
+    m_txTrace(packet);
+    const auto actualBytes = m_socket->Send(packet);
+    NS_LOG_DEBUG(this << " Send() packet " << packet << " of " << packet->GetSize() << " bytes,"
+                      << " return value= " << actualBytes << ".");
+
+    if (actualBytes != static_cast<int>(packetSize))
+    {
+        NS_LOG_ERROR(this << " Failed to send request for embedded object,"
+                          << " GetErrNo= " << m_socket->GetErrno() << ","
+                          << " waiting for another Tx opportunity.");
     }
     else
     {
-        NS_FATAL_ERROR("Invalid state " << GetStateString() << " for RequestEmbeddedObject().");
+        m_embeddedObjectsToBeRequested--;
+        SwitchToState(EXPECTING_EMBEDDED_OBJECT);
     }
 
 } // end of `void RequestEmbeddedObject ()`
@@ -509,59 +526,53 @@
 {
     NS_LOG_FUNCTION(this << packet << from);
 
-    if (m_state == EXPECTING_MAIN_OBJECT)
+    if (m_state != EXPECTING_MAIN_OBJECT)
+    {
+        NS_FATAL_ERROR("Invalid state " << GetStateString() << " for ReceiveMainObject().");
+    }
+
+    /*
+     * In the following call to Receive(), #m_objectBytesToBeReceived *will*
+     * be updated. #m_objectClientTs and #m_objectServerTs *may* be updated.
+     * ThreeGppHttpHeader will be removed from the packet, if it is the first
+     * packet of the object to be received; the header will be available in
+     * #m_constructedPacketHeader.
+     * #m_constructedPacket will also be updated.
+     */
+    Receive(packet);
+    m_rxMainObjectPacketTrace(packet);
+
+    if (m_objectBytesToBeReceived > 0)
     {
         /*
-         * In the following call to Receive(), #m_objectBytesToBeReceived *will*
-         * be updated. #m_objectClientTs and #m_objectServerTs *may* be updated.
-         * ThreeGppHttpHeader will be removed from the packet, if it is the first
-         * packet of the object to be received; the header will be available in
-         * #m_constructedPacketHeader.
-         * #m_constructedPacket will also be updated.
+         * There are more packets of this main object, so just stay still
+         * and wait until they arrive.
          */
-        Receive(packet);
-        m_rxMainObjectPacketTrace(packet);
-
-        if (m_objectBytesToBeReceived > 0)
-        {
-            /*
-             * There are more packets of this main object, so just stay still
-             * and wait until they arrive.
-             */
-            NS_LOG_INFO(this << " " << m_objectBytesToBeReceived << " byte(s)"
-                             << " remains from this chunk of main object.");
-        }
-        else
-        {
-            /*
-             * This is the last packet of this main object. Acknowledge the
-             * reception of a whole main object
-             */
-            NS_LOG_INFO(this << " Finished receiving a main object.");
-            m_rxMainObjectTrace(this, m_constructedPacket);
-
-            if (!m_objectServerTs.IsZero())
-            {
-                m_rxDelayTrace(Simulator::Now() - m_objectServerTs, from);
-                m_objectServerTs = MilliSeconds(0); // Reset back to zero.
-            }
-
-            if (!m_objectClientTs.IsZero())
-            {
-                m_rxRttTrace(Simulator::Now() - m_objectClientTs, from);
-                m_objectClientTs = MilliSeconds(0); // Reset back to zero.
-            }
+        NS_LOG_INFO(this << " " << m_objectBytesToBeReceived << " byte(s)"
+                         << " remains from this chunk of main object.");
+        return;
+    }
 
-            EnterParsingTime();
+    /*
+     * This is the last packet of this main object. Acknowledge the
+     * reception of a whole main object
+     */
+    NS_LOG_INFO(this << " Finished receiving a main object.");
+    m_rxMainObjectTrace(this, m_constructedPacket);
 
-        } // end of else of `if (m_objectBytesToBeReceived > 0)`
+    if (!m_objectServerTs.IsZero())
+    {
+        m_rxDelayTrace(Simulator::Now() - m_objectServerTs, from);
+        m_objectServerTs = MilliSeconds(0); // Reset back to zero.
+    }
 
-    } // end of `if (m_state == EXPECTING_MAIN_OBJECT)`
-    else
+    if (!m_objectClientTs.IsZero())
     {
-        NS_FATAL_ERROR("Invalid state " << GetStateString() << " for ReceiveMainObject().");
+        m_rxRttTrace(Simulator::Now() - m_objectClientTs, from);
+        m_objectClientTs = MilliSeconds(0); // Reset back to zero.
     }
 
+    EnterParsingTime();
 } // end of `void ReceiveMainObject (Ptr<Packet> packet)`
 
 void
@@ -569,75 +580,69 @@
 {
     NS_LOG_FUNCTION(this << packet << from);
 
-    if (m_state == EXPECTING_EMBEDDED_OBJECT)
+    if (m_state != EXPECTING_EMBEDDED_OBJECT)
+    {
+        NS_FATAL_ERROR("Invalid state " << GetStateString() << " for ReceiveEmbeddedObject().");
+    }
+
+    /*
+     * In the following call to Receive(), #m_objectBytesToBeReceived *will*
+     * be updated. #m_objectClientTs and #m_objectServerTs *may* be updated.
+     * ThreeGppHttpHeader will be removed from the packet, if it is the first
+     * packet of the object to be received; the header will be available in
+     * #m_constructedPacket, which will also be updated.
+     */
+    Receive(packet);
+    m_rxEmbeddedObjectPacketTrace(packet);
+
+    if (m_objectBytesToBeReceived > 0)
     {
         /*
-         * In the following call to Receive(), #m_objectBytesToBeReceived *will*
-         * be updated. #m_objectClientTs and #m_objectServerTs *may* be updated.
-         * ThreeGppHttpHeader will be removed from the packet, if it is the first
-         * packet of the object to be received; the header will be available in
-         * #m_constructedPacket, which will also be updated.
+         * There are more packets of this embedded object, so just stay
+         * still and wait until they arrive.
          */
-        Receive(packet);
-        m_rxEmbeddedObjectPacketTrace(packet);
+        NS_LOG_INFO(this << " " << m_objectBytesToBeReceived << " byte(s)"
+                         << " remains from this chunk of embedded object");
+        return;
+    }
 
-        if (m_objectBytesToBeReceived > 0)
-        {
-            /*
-             * There are more packets of this embedded object, so just stay
-             * still and wait until they arrive.
-             */
-            NS_LOG_INFO(this << " " << m_objectBytesToBeReceived << " byte(s)"
-                             << " remains from this chunk of embedded object");
-        }
-        else
-        {
-            /*
-             * This is the last packet of this embedded object. Acknowledge
-             * the reception of a whole embedded object
-             */
-            NS_LOG_INFO(this << " Finished receiving an embedded object.");
-            m_rxEmbeddedObjectTrace(this, m_constructedPacket);
-
-            if (!m_objectServerTs.IsZero())
-            {
-                m_rxDelayTrace(Simulator::Now() - m_objectServerTs, from);
-                m_objectServerTs = MilliSeconds(0); // Reset back to zero.
-            }
-
-            if (!m_objectClientTs.IsZero())
-            {
-                m_rxRttTrace(Simulator::Now() - m_objectClientTs, from);
-                m_objectClientTs = MilliSeconds(0); // Reset back to zero.
-            }
-
-            if (m_embeddedObjectsToBeRequested > 0)
-            {
-                NS_LOG_INFO(this << " " << m_embeddedObjectsToBeRequested
-                                 << " more embedded object(s) to be requested.");
-                // Immediately request another using the existing connection.
-                m_eventRequestEmbeddedObject =
-                    Simulator::ScheduleNow(&ThreeGppHttpClient::RequestEmbeddedObject, this);
-            }
-            else
-            {
-                /*
-                 * There is no more embedded object, the web page has been
-                 * downloaded completely. Now is the time to read it.
-                 */
-                NS_LOG_INFO(this << " Finished receiving a web page.");
-                FinishReceivingPage(); // trigger callback for page loading time
-                EnterReadingTime();
-            }
+    /*
+     * This is the last packet of this embedded object. Acknowledge
+     * the reception of a whole embedded object
+     */
+    NS_LOG_INFO(this << " Finished receiving an embedded object.");
+    m_rxEmbeddedObjectTrace(this, m_constructedPacket);
 
-        } // end of else of `if (m_objectBytesToBeReceived > 0)`
+    if (!m_objectServerTs.IsZero())
+    {
+        m_rxDelayTrace(Simulator::Now() - m_objectServerTs, from);
+        m_objectServerTs = MilliSeconds(0); // Reset back to zero.
+    }
 
-    } // end of `if (m_state == EXPECTING_EMBEDDED_OBJECT)`
-    else
+    if (!m_objectClientTs.IsZero())
     {
-        NS_FATAL_ERROR("Invalid state " << GetStateString() << " for ReceiveEmbeddedObject().");
+        m_rxRttTrace(Simulator::Now() - m_objectClientTs, from);
+        m_objectClientTs = MilliSeconds(0); // Reset back to zero.
     }
 
+    if (m_embeddedObjectsToBeRequested > 0)
+    {
+        NS_LOG_INFO(this << " " << m_embeddedObjectsToBeRequested
+                         << " more embedded object(s) to be requested.");
+        // Immediately request another using the existing connection.
+        m_eventRequestEmbeddedObject =
+            Simulator::ScheduleNow(&ThreeGppHttpClient::RequestEmbeddedObject, this);
+    }
+    else
+    {
+        /*
+         * There is no more embedded object, the web page has been
+         * downloaded completely. Now is the time to read it.
+         */
+        NS_LOG_INFO(this << " Finished receiving a web page.");
+        FinishReceivingPage(); // trigger callback for page loading time
+        EnterReadingTime();
+    }
 } // end of `void ReceiveEmbeddedObject (Ptr<Packet> packet)`
 
 void
@@ -667,7 +672,7 @@
         m_constructedPacket = packet->Copy();
         m_constructedPacket->AddHeader(httpHeader);
     }
-    uint32_t contentSize = packet->GetSize();
+    auto contentSize = packet->GetSize();
     m_numberBytesPage += contentSize; // increment counter of page size
 
     /* Note that the packet does not contain header at this point.
@@ -689,7 +694,7 @@
         m_objectBytesToBeReceived -= contentSize;
         if (!firstPacket)
         {
-            Ptr<Packet> packetCopy = packet->Copy();
+            auto packetCopy = packet->Copy();
             m_constructedPacket->AddAtEnd(packetCopy);
         }
     }
@@ -701,19 +706,17 @@
 {
     NS_LOG_FUNCTION(this);
 
-    if (m_state == EXPECTING_MAIN_OBJECT)
-    {
-        const Time parsingTime = m_httpVariables->GetParsingTime();
-        NS_LOG_INFO(this << " The parsing of this main object"
-                         << " will complete in " << parsingTime.As(Time::S) << ".");
-        m_eventParseMainObject =
-            Simulator::Schedule(parsingTime, &ThreeGppHttpClient::ParseMainObject, this);
-        SwitchToState(PARSING_MAIN_OBJECT);
-    }
-    else
+    if (m_state != EXPECTING_MAIN_OBJECT)
     {
         NS_FATAL_ERROR("Invalid state " << GetStateString() << " for EnterParsingTime().");
     }
+
+    const auto parsingTime = m_httpVariables->GetParsingTime();
+    NS_LOG_INFO(this << " The parsing of this main object will complete in "
+                     << parsingTime.As(Time::S) << ".");
+    m_eventParseMainObject =
+        Simulator::Schedule(parsingTime, &ThreeGppHttpClient::ParseMainObject, this);
+    SwitchToState(PARSING_MAIN_OBJECT);
 }
 
 void
@@ -721,37 +724,35 @@
 {
     NS_LOG_FUNCTION(this);
 
-    if (m_state == PARSING_MAIN_OBJECT)
+    if (m_state != PARSING_MAIN_OBJECT)
     {
-        m_embeddedObjectsToBeRequested = m_httpVariables->GetNumOfEmbeddedObjects();
-        // saving total number of embedded objects
-        m_numberEmbeddedObjectsRequested = m_embeddedObjectsToBeRequested;
-        NS_LOG_INFO(this << " Parsing has determined " << m_embeddedObjectsToBeRequested
-                         << " embedded object(s) in the main object.");
+        NS_FATAL_ERROR("Invalid state " << GetStateString() << " for ParseMainObject().");
+    }
 
-        if (m_embeddedObjectsToBeRequested > 0)
-        {
-            /*
-             * Immediately request the first embedded object using the
-             * existing connection.
-             */
-            m_eventRequestEmbeddedObject =
-                Simulator::ScheduleNow(&ThreeGppHttpClient::RequestEmbeddedObject, this);
-        }
-        else
-        {
-            /*
-             * There is no embedded object in the main object. So sit back and
-             * enjoy the plain web page.
-             */
-            NS_LOG_INFO(this << " Finished receiving a web page.");
-            FinishReceivingPage(); // trigger callback for page loading time
-            EnterReadingTime();
-        }
+    m_embeddedObjectsToBeRequested = m_httpVariables->GetNumOfEmbeddedObjects();
+    // saving total number of embedded objects
+    m_numberEmbeddedObjectsRequested = m_embeddedObjectsToBeRequested;
+    NS_LOG_INFO(this << " Parsing has determined " << m_embeddedObjectsToBeRequested
+                     << " embedded object(s) in the main object.");
+
+    if (m_embeddedObjectsToBeRequested > 0)
+    {
+        /*
+         * Immediately request the first embedded object using the
+         * existing connection.
+         */
+        m_eventRequestEmbeddedObject =
+            Simulator::ScheduleNow(&ThreeGppHttpClient::RequestEmbeddedObject, this);
     }
     else
     {
-        NS_FATAL_ERROR("Invalid state " << GetStateString() << " for ParseMainObject().");
+        /*
+         * There is no embedded object in the main object. So sit back and
+         * enjoy the plain web page.
+         */
+        NS_LOG_INFO(this << " Finished receiving a web page.");
+        FinishReceivingPage(); // trigger callback for page loading time
+        EnterReadingTime();
     }
 
 } // end of `void ParseMainObject ()`
@@ -761,21 +762,19 @@
 {
     NS_LOG_FUNCTION(this);
 
-    if (m_state == EXPECTING_EMBEDDED_OBJECT || m_state == PARSING_MAIN_OBJECT)
-    {
-        const Time readingTime = m_httpVariables->GetReadingTime();
-        NS_LOG_INFO(this << " Client will finish reading this web page in "
-                         << readingTime.As(Time::S) << ".");
-
-        // Schedule a request of another main object once the reading time expires.
-        m_eventRequestMainObject =
-            Simulator::Schedule(readingTime, &ThreeGppHttpClient::RequestMainObject, this);
-        SwitchToState(READING);
-    }
-    else
+    if (m_state != EXPECTING_EMBEDDED_OBJECT && m_state != PARSING_MAIN_OBJECT)
     {
         NS_FATAL_ERROR("Invalid state " << GetStateString() << " for EnterReadingTime().");
     }
+
+    const auto readingTime = m_httpVariables->GetReadingTime();
+    NS_LOG_INFO(this << " Client will finish reading this web page in " << readingTime.As(Time::S)
+                     << ".");
+
+    // Schedule a request of another main object once the reading time expires.
+    m_eventRequestMainObject =
+        Simulator::Schedule(readingTime, &ThreeGppHttpClient::RequestMainObject, this);
+    SwitchToState(READING);
 }
 
 void
@@ -809,8 +808,8 @@
 void
 ThreeGppHttpClient::SwitchToState(ThreeGppHttpClient::State_t state)
 {
-    const std::string oldState = GetStateString();
-    const std::string newState = GetStateString(state);
+    const auto oldState = GetStateString();
+    const auto newState = GetStateString(state);
     NS_LOG_FUNCTION(this << oldState << newState);
 
     if ((state == EXPECTING_MAIN_OBJECT) || (state == EXPECTING_EMBEDDED_OBJECT))
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/model/three-gpp-http-client.h ns-3.44/src/applications/model/three-gpp-http-client.h
--- ns-3.43/src/applications/model/three-gpp-http-client.h	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/applications/model/three-gpp-http-client.h	2025-03-09 16:55:49.347370900 -0700
@@ -10,11 +10,13 @@
 #ifndef THREE_GPP_HTTP_CLIENT_H
 #define THREE_GPP_HTTP_CLIENT_H
 
+#include "source-application.h"
 #include "three-gpp-http-header.h"
 
-#include <ns3/address.h>
-#include <ns3/application.h>
-#include <ns3/traced-callback.h>
+#include "ns3/address.h"
+#include "ns3/traced-callback.h"
+
+#include <optional>
 
 namespace ns3
 {
@@ -24,8 +26,8 @@
 class ThreeGppHttpVariables;
 
 /**
- * \ingroup applications
- * \defgroup http ThreeGppHttpClientServer
+ * @ingroup applications
+ * @defgroup http ThreeGppHttpClientServer
  *
  * This traffic generator simulates web browsing traffic using the Hypertext
  * Transfer Protocol (HTTP). It consists of one or more ThreeGppHttpClient
@@ -58,7 +60,7 @@
  */
 
 /**
- * \ingroup http
+ * @ingroup http
  * Model application which simulates the traffic of a web browser. This
  * application works in conjunction with an ThreeGppHttpServer application.
  *
@@ -92,7 +94,7 @@
  * and the timestamp when the packet is transmitted (which will be used to
  * compute the delay and RTT of the packet).
  */
-class ThreeGppHttpClient : public Application
+class ThreeGppHttpClient : public SourceApplication
 {
   public:
     /**
@@ -103,16 +105,17 @@
      * ThreeGppHttpClientHelper.
      */
     ThreeGppHttpClient();
+    void SetRemote(const Address& addr) override;
 
     /**
      * Returns the object TypeId.
-     * \return The object TypeId.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
     /**
      * Returns a pointer to the associated socket.
-     * \return Pointer to the associated socket.
+     * @return Pointer to the associated socket.
      */
     Ptr<Socket> GetSocket() const;
 
@@ -137,39 +140,39 @@
 
     /**
      * Returns the current state of the application.
-     * \return The current state of the application.
+     * @return The current state of the application.
      */
     State_t GetState() const;
 
     /**
      * Returns the current state of the application in string format.
-     * \return The current state of the application in string format.
+     * @return The current state of the application in string format.
      */
     std::string GetStateString() const;
 
     /**
      * Returns the given state in string format.
-     * \param state An arbitrary state of an application.
-     * \return The given state equivalently expressed in string format.
+     * @param state An arbitrary state of an application.
+     * @return The given state equivalently expressed in string format.
      */
     static std::string GetStateString(State_t state);
 
     /**
      * Common callback signature for `ConnectionEstablished`, `RxMainObject`, and
      * `RxEmbeddedObject` trace sources.
-     * \param httpClient Pointer to this instance of ThreeGppHttpClient,
+     * @param httpClient Pointer to this instance of ThreeGppHttpClient,
      *                               which is where the trace originated.
      */
     typedef void (*TracedCallback)(Ptr<const ThreeGppHttpClient> httpClient);
 
     /**
      * Callback signature for `RxPage` trace sources.
-     * \param httpClient Pointer to this instance of ThreeGppHttpClient,
+     * @param httpClient Pointer to this instance of ThreeGppHttpClient,
      *                               which is where the trace originated.
-     * \param time Elapsed time from the start to the end of the request.
-     * \param numObjects Number of objects downloaded, including main and
+     * @param time Elapsed time from the start to the end of the request.
+     * @param numObjects Number of objects downloaded, including main and
      *                                                  embedded objects.
-     * \param numBytes Total number of bytes included in the page.
+     * @param numBytes Total number of bytes included in the page.
      */
     typedef void (*RxPageTracedCallback)(Ptr<const ThreeGppHttpClient> httpClient,
                                          const Time& time,
@@ -183,36 +186,42 @@
     void StartApplication() override;
     void StopApplication() override;
 
+    /**
+     * @brief set the remote port (temporary function until deprecated attributes are removed)
+     * @param port remote port
+     */
+    void SetPort(uint16_t port);
+
     // SOCKET CALLBACK METHODS
 
     /**
      * Invoked when a connection is established successfully on #m_socket. This
      * triggers a request for a main object.
-     * \param socket Pointer to the socket where the event originates from.
+     * @param socket Pointer to the socket where the event originates from.
      */
     void ConnectionSucceededCallback(Ptr<Socket> socket);
     /**
      * Invoked when #m_socket cannot establish a connection with the web server.
      * Simulation will stop and error will be raised.
-     * \param socket Pointer to the socket where the event originates from.
+     * @param socket Pointer to the socket where the event originates from.
      */
     void ConnectionFailedCallback(Ptr<Socket> socket);
     /**
      * Invoked when connection between #m_socket and the web sever is terminated.
      * Error will be logged, but simulation continues.
-     * \param socket Pointer to the socket where the event originates from.
+     * @param socket Pointer to the socket where the event originates from.
      */
     void NormalCloseCallback(Ptr<Socket> socket);
     /**
      * Invoked when connection between #m_socket and the web sever is terminated.
      * Error will be logged, but simulation continues.
-     * \param socket Pointer to the socket where the event originates from.
+     * @param socket Pointer to the socket where the event originates from.
      */
     void ErrorCloseCallback(Ptr<Socket> socket);
     /**
      * Invoked when #m_socket receives some packet data. Fires the `Rx` trace
      * source and triggers ReceiveMainObject() or ReceiveEmbeddedObject().
-     * \param socket Pointer to the socket where the event originates from.
+     * @param socket Pointer to the socket where the event originates from.
      */
     void ReceivedDataCallback(Ptr<Socket> socket);
 
@@ -220,7 +229,7 @@
 
     /**
      * Initialize #m_socket to connect to the destination web server at
-     * #m_remoteServerAddress and #m_remoteServerPort and set up callbacks to
+     * #m_peer and #m_peerPort and set up callbacks to
      * listen to its event. Invoked upon the start of the application.
      */
     void OpenConnection();
@@ -264,8 +273,8 @@
      * fires the `RxMainObject`, `RxDelay`, and `RxRtt` trace sources. The client
      * then triggers EnterParsingTime().
      *
-     * \param packet The received packet.
-     * \param from Address of the sender.
+     * @param packet The received packet.
+     * @param from Address of the sender.
      */
     void ReceiveMainObject(Ptr<Packet> packet, const Address& from);
     /**
@@ -287,8 +296,8 @@
      * (#m_embeddedObjectsToBeRequested) the client can either trigger
      * RequestEmbeddedObject() or EnterReadingTime().
      *
-     * \param packet The received packet.
-     * \param from Address of the sender.
+     * @param packet The received packet.
+     * @param from Address of the sender.
      */
     void ReceiveEmbeddedObject(Ptr<Packet> packet, const Address& from);
     /**
@@ -300,7 +309,7 @@
      * This method is invoked as a sub-procedure of ReceiveMainObject() and
      * ReceiveEmbeddedObject().
      *
-     * \param packet The received packet. If it is the first packet of the object,
+     * @param packet The received packet. If it is the first packet of the object,
      *               then it must have a ThreeGppHttpHeader attached to it.
      */
     void Receive(Ptr<Packet> packet);
@@ -341,7 +350,7 @@
 
     /**
      * Change the state of the client. Fires the `StateTransition` trace source.
-     * \param state The new state.
+     * @param state The new state.
      */
     void SwitchToState(State_t state);
 
@@ -376,12 +385,8 @@
 
     /// The `Variables` attribute.
     Ptr<ThreeGppHttpVariables> m_httpVariables;
-    /// The `RemoteServerAddress` attribute. The address of the web server.
-    Address m_remoteServerAddress;
     /// The `RemoteServerPort` attribute.
-    uint16_t m_remoteServerPort;
-    /// The `Tos` attribute.
-    uint8_t m_tos;
+    std::optional<uint16_t> m_peerPort;
 
     // TRACE SOURCES
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/model/three-gpp-http-header.cc ns-3.44/src/applications/model/three-gpp-http-header.cc
--- ns-3.43/src/applications/model/three-gpp-http-header.cc	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/applications/model/three-gpp-http-header.cc	2025-03-09 16:55:49.347370900 -0700
@@ -9,8 +9,8 @@
 
 #include "three-gpp-http-header.h"
 
-#include <ns3/log.h>
-#include <ns3/packet.h>
+#include "ns3/log.h"
+#include "ns3/packet.h"
 
 #include <sstream>
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/model/three-gpp-http-header.h ns-3.44/src/applications/model/three-gpp-http-header.h
--- ns-3.43/src/applications/model/three-gpp-http-header.h	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/applications/model/three-gpp-http-header.h	2025-03-09 16:55:49.347370900 -0700
@@ -10,8 +10,8 @@
 #ifndef THREE_GPP_HTTP_HEADER_H
 #define THREE_GPP_HTTP_HEADER_H
 
-#include <ns3/header.h>
-#include <ns3/nstime.h>
+#include "ns3/header.h"
+#include "ns3/nstime.h"
 
 namespace ns3
 {
@@ -19,8 +19,8 @@
 class Packet;
 
 /**
- * \ingroup http
- * \brief Header used by web browsing applications to transmit information about
+ * @ingroup http
+ * @brief Header used by web browsing applications to transmit information about
  *        content type, content length and timestamps for delay statistics.
  *
  * The header contains the following fields (and their respective size when
@@ -48,7 +48,7 @@
 
     /**
      * Returns the object TypeId.
-     * \return The object TypeId.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
@@ -62,7 +62,7 @@
     void Print(std::ostream& os) const override;
 
     /**
-     * \return The string representation of the header.
+     * @return The string representation of the header.
      */
     std::string ToString() const;
 
@@ -75,42 +75,42 @@
     };
 
     /**
-     * \param contentType The content type.
+     * @param contentType The content type.
      */
     void SetContentType(ContentType_t contentType);
 
     /**
-     * \return The content type.
+     * @return The content type.
      */
     ContentType_t GetContentType() const;
 
     /**
-     * \param contentLength The content length (in bytes).
+     * @param contentLength The content length (in bytes).
      */
     void SetContentLength(uint32_t contentLength);
 
     /**
-     * \return The content length (in bytes).
+     * @return The content length (in bytes).
      */
     uint32_t GetContentLength() const;
 
     /**
-     * \param clientTs The client time stamp.
+     * @param clientTs The client time stamp.
      */
     void SetClientTs(Time clientTs);
 
     /**
-     * \return The client time stamp.
+     * @return The client time stamp.
      */
     Time GetClientTs() const;
 
     /**
-     * \param serverTs The server time stamp.
+     * @param serverTs The server time stamp.
      */
     void SetServerTs(Time serverTs);
 
     /**
-     * \return The server time stamp.
+     * @return The server time stamp.
      */
     Time GetServerTs() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/model/three-gpp-http-server.cc ns-3.44/src/applications/model/three-gpp-http-server.cc
--- ns-3.43/src/applications/model/three-gpp-http-server.cc	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/applications/model/three-gpp-http-server.cc	2025-03-09 16:55:49.347370900 -0700
@@ -11,18 +11,17 @@
 
 #include "three-gpp-http-variables.h"
 
-#include <ns3/callback.h>
-#include <ns3/config.h>
-#include <ns3/inet-socket-address.h>
-#include <ns3/inet6-socket-address.h>
-#include <ns3/log.h>
-#include <ns3/packet.h>
-#include <ns3/pointer.h>
-#include <ns3/simulator.h>
-#include <ns3/socket.h>
-#include <ns3/tcp-socket-factory.h>
-#include <ns3/tcp-socket.h>
-#include <ns3/uinteger.h>
+#include "ns3/address-utils.h"
+#include "ns3/callback.h"
+#include "ns3/config.h"
+#include "ns3/log.h"
+#include "ns3/packet.h"
+#include "ns3/pointer.h"
+#include "ns3/simulator.h"
+#include "ns3/socket.h"
+#include "ns3/tcp-socket-factory.h"
+#include "ns3/tcp-socket.h"
+#include "ns3/uinteger.h"
 
 NS_LOG_COMPONENT_DEFINE("ThreeGppHttpServer");
 
@@ -34,14 +33,15 @@
 NS_OBJECT_ENSURE_REGISTERED(ThreeGppHttpServer);
 
 ThreeGppHttpServer::ThreeGppHttpServer()
-    : m_state(NOT_STARTED),
-      m_initialSocket(nullptr),
-      m_txBuffer(Create<ThreeGppHttpServerTxBuffer>()),
-      m_httpVariables(CreateObject<ThreeGppHttpVariables>())
+    : SinkApplication(HTTP_DEFAULT_PORT),
+      m_state{NOT_STARTED},
+      m_initialSocket{nullptr},
+      m_txBuffer{Create<ThreeGppHttpServerTxBuffer>()},
+      m_httpVariables{CreateObject<ThreeGppHttpVariables>()},
+      m_optPort{},
+      m_mtuSize{m_httpVariables->GetMtuSize()}
 {
     NS_LOG_FUNCTION(this);
-
-    m_mtuSize = m_httpVariables->GetMtuSize();
     NS_LOG_INFO(this << " MTU size for this server application is " << m_mtuSize << " bytes.");
 }
 
@@ -51,7 +51,7 @@
 {
     static TypeId tid =
         TypeId("ns3::ThreeGppHttpServer")
-            .SetParent<Application>()
+            .SetParent<SinkApplication>()
             .AddConstructor<ThreeGppHttpServer>()
             .AddAttribute("Variables",
                           "Variable collection, which is used to control e.g. processing and "
@@ -63,13 +63,17 @@
                           "The local address of the server, "
                           "i.e., the address on which to bind the Rx socket.",
                           AddressValue(),
-                          MakeAddressAccessor(&ThreeGppHttpServer::m_localAddress),
-                          MakeAddressChecker())
+                          MakeAddressAccessor(&ThreeGppHttpServer::SetLocal),
+                          MakeAddressChecker(),
+                          TypeId::SupportLevel::DEPRECATED,
+                          "Replaced by Local in ns-3.44.")
             .AddAttribute("LocalPort",
                           "Port on which the application listen for incoming packets.",
                           UintegerValue(80), // the default HTTP port
-                          MakeUintegerAccessor(&ThreeGppHttpServer::m_localPort),
-                          MakeUintegerChecker<uint16_t>())
+                          MakeUintegerAccessor(&ThreeGppHttpServer::SetPort),
+                          MakeUintegerChecker<uint16_t>(),
+                          TypeId::SupportLevel::DEPRECATED,
+                          "Replaced by Port in ns-3.44.")
             .AddAttribute("Tos",
                           "The Type of Service used to send packets. "
                           "All 8 bits of the TOS byte are set (including ECN bits).",
@@ -106,7 +110,11 @@
             .AddTraceSource("Rx",
                             "A packet has been received.",
                             MakeTraceSourceAccessor(&ThreeGppHttpServer::m_rxTrace),
-                            "ns3::Packet::PacketAddressTracedCallback")
+                            "ns3::Packet::AddressTracedCallback")
+            .AddTraceSource("RxWithAddresses",
+                            "A packet has been received.",
+                            MakeTraceSourceAccessor(&ThreeGppHttpServer::m_rxTraceWithAddresses),
+                            "ns3::Packet::TwoAddressTracedCallback")
             .AddTraceSource("RxDelay",
                             "A packet has been received with delay information.",
                             MakeTraceSourceAccessor(&ThreeGppHttpServer::m_rxDelayTrace),
@@ -119,6 +127,40 @@
 }
 
 void
+ThreeGppHttpServer::SetLocal(const Address& addr)
+{
+    NS_LOG_FUNCTION(this << addr);
+    if (!addr.IsInvalid())
+    {
+        m_local = addr;
+        if (m_optPort)
+        {
+            SetPort(*m_optPort);
+        }
+    }
+}
+
+void
+ThreeGppHttpServer::SetPort(uint32_t port)
+{
+    NS_LOG_FUNCTION(this << port);
+    if (port != INVALID_PORT)
+    {
+        m_port = port;
+    }
+    if (m_local.IsInvalid())
+    {
+        // save for later
+        m_optPort = m_port;
+        return;
+    }
+    if (Ipv4Address::IsMatchingType(m_local) || Ipv6Address::IsMatchingType(m_local))
+    {
+        m_local = addressUtils::ConvertToSocketAddress(m_local, m_port);
+    }
+}
+
+void
 ThreeGppHttpServer::SetMtuSize(uint32_t mtuSize)
 {
     NS_LOG_FUNCTION(this << mtuSize);
@@ -179,62 +221,56 @@
 {
     NS_LOG_FUNCTION(this);
 
-    if (m_state == NOT_STARTED)
+    if (m_state != NOT_STARTED)
     {
-        m_httpVariables->Initialize();
-        if (!m_initialSocket)
+        NS_FATAL_ERROR("Invalid state " << GetStateString() << " for StartApplication().");
+    }
+
+    m_httpVariables->Initialize();
+    if (!m_initialSocket)
+    {
+        // Find the current default MTU value of TCP sockets.
+        Ptr<const ns3::AttributeValue> previousSocketMtu;
+        const TypeId tcpSocketTid = TcpSocket::GetTypeId();
+        for (uint32_t i = 0; i < tcpSocketTid.GetAttributeN(); i++)
         {
-            // Find the current default MTU value of TCP sockets.
-            Ptr<const ns3::AttributeValue> previousSocketMtu;
-            const TypeId tcpSocketTid = TcpSocket::GetTypeId();
-            for (uint32_t i = 0; i < tcpSocketTid.GetAttributeN(); i++)
+            TypeId::AttributeInformation attrInfo = tcpSocketTid.GetAttribute(i);
+            if (attrInfo.name == "SegmentSize")
             {
-                TypeId::AttributeInformation attrInfo = tcpSocketTid.GetAttribute(i);
-                if (attrInfo.name == "SegmentSize")
-                {
-                    previousSocketMtu = attrInfo.initialValue;
-                }
+                previousSocketMtu = attrInfo.initialValue;
             }
+        }
 
-            // Creating a TCP socket to connect to the server.
-            m_initialSocket = Socket::CreateSocket(GetNode(), TcpSocketFactory::GetTypeId());
-            m_initialSocket->SetAttribute("SegmentSize", UintegerValue(m_mtuSize));
-
-            NS_ABORT_MSG_IF(m_localAddress.IsInvalid(),
-                            "'LocalAddress' attribute not properly set");
-
-            if (Ipv4Address::IsMatchingType(m_localAddress))
-            {
-                const Ipv4Address ipv4 = Ipv4Address::ConvertFrom(m_localAddress);
-                const InetSocketAddress inetSocket = InetSocketAddress(ipv4, m_localPort);
-                NS_LOG_INFO(this << " Binding on " << ipv4 << " port " << m_localPort << " / "
-                                 << inetSocket << ".");
-                int ret [[maybe_unused]] = m_initialSocket->Bind(inetSocket);
-                NS_LOG_DEBUG(this << " Bind() return value= " << ret
-                                  << " GetErrNo= " << m_initialSocket->GetErrno() << ".");
-
-                m_initialSocket->SetIpTos(m_tos); // Affects only IPv4 sockets.
-            }
-            else if (Ipv6Address::IsMatchingType(m_localAddress))
-            {
-                const Ipv6Address ipv6 = Ipv6Address::ConvertFrom(m_localAddress);
-                const Inet6SocketAddress inet6Socket = Inet6SocketAddress(ipv6, m_localPort);
-                NS_LOG_INFO(this << " Binding on " << ipv6 << " port " << m_localPort << " / "
-                                 << inet6Socket << ".");
-                int ret [[maybe_unused]] = m_initialSocket->Bind(inet6Socket);
-                NS_LOG_DEBUG(this << " Bind() return value= " << ret
-                                  << " GetErrNo= " << m_initialSocket->GetErrno() << ".");
-            }
-            else
-            {
-                NS_ABORT_MSG("Incompatible local address");
-            }
+        // Creating a TCP socket to connect to the server.
+        m_initialSocket = Socket::CreateSocket(GetNode(), TcpSocketFactory::GetTypeId());
+        m_initialSocket->SetAttribute("SegmentSize", UintegerValue(m_mtuSize));
+
+        NS_ABORT_MSG_IF(m_local.IsInvalid(), "Local address not properly set");
+        if (InetSocketAddress::IsMatchingType(m_local))
+        {
+            const auto ipv4 [[maybe_unused]] = InetSocketAddress::ConvertFrom(m_local).GetIpv4();
+            m_initialSocket->SetIpTos(m_tos); // Affects only IPv4 sockets.
+            NS_LOG_INFO(this << " Binding on " << ipv4 << " port " << m_port << " / " << m_local
+                             << ".");
+        }
+        else if (Inet6SocketAddress::IsMatchingType(m_local))
+        {
+            const auto ipv6 [[maybe_unused]] = Inet6SocketAddress::ConvertFrom(m_local).GetIpv6();
+            NS_LOG_INFO(this << " Binding on " << ipv6 << " port " << m_port << " / " << m_local
+                             << ".");
+        }
+        else
+        {
+            NS_ABORT_MSG("Incompatible local address");
+        }
 
-            int ret [[maybe_unused]] = m_initialSocket->Listen();
-            NS_LOG_DEBUG(this << " Listen () return value= " << ret
-                              << " GetErrNo= " << m_initialSocket->GetErrno() << ".");
+        auto ret [[maybe_unused]] = m_initialSocket->Bind(m_local);
+        NS_LOG_DEBUG(this << " Bind() return value= " << ret
+                          << " GetErrNo= " << m_initialSocket->GetErrno() << ".");
 
-        } // end of `if (m_initialSocket == 0)`
+        ret = m_initialSocket->Listen();
+        NS_LOG_DEBUG(this << " Listen () return value= " << ret
+                          << " GetErrNo= " << m_initialSocket->GetErrno() << ".");
 
         NS_ASSERT_MSG(m_initialSocket, "Failed creating socket.");
         m_initialSocket->SetAcceptCallback(
@@ -246,14 +282,9 @@
         m_initialSocket->SetRecvCallback(
             MakeCallback(&ThreeGppHttpServer::ReceivedDataCallback, this));
         m_initialSocket->SetSendCallback(MakeCallback(&ThreeGppHttpServer::SendCallback, this));
-        SwitchToState(STARTED);
-
-    } // end of `if (m_state == NOT_STARTED)`
-    else
-    {
-        NS_FATAL_ERROR("Invalid state " << GetStateString() << " for StartApplication().");
-    }
+    } // end of `if (m_initialSocket == 0)`
 
+    SwitchToState(STARTED);
 } // end of `void StartApplication ()`
 
 void
@@ -372,10 +403,8 @@
 {
     NS_LOG_FUNCTION(this << socket);
 
-    Ptr<Packet> packet;
     Address from;
-
-    while ((packet = socket->RecvFrom(from)))
+    while (auto packet = socket->RecvFrom(from))
     {
         if (packet->GetSize() == 0)
         {
@@ -406,13 +435,13 @@
 
         // Fire trace sources.
         m_rxTrace(packet, from);
+        m_rxTraceWithAddresses(packet, from, m_local);
         m_rxDelayTrace(Simulator::Now() - httpHeader.GetClientTs(), from);
 
-        Time processingDelay;
         switch (httpHeader.GetContentType())
         {
-        case ThreeGppHttpHeader::MAIN_OBJECT:
-            processingDelay = m_httpVariables->GetMainObjectGenerationDelay();
+        case ThreeGppHttpHeader::MAIN_OBJECT: {
+            const auto processingDelay = m_httpVariables->GetMainObjectGenerationDelay();
             NS_LOG_INFO(this << " Will finish generating a main object"
                              << " in " << processingDelay.As(Time::S) << ".");
             m_txBuffer->RecordNextServe(socket,
@@ -422,9 +451,9 @@
                                                             socket),
                                         httpHeader.GetClientTs());
             break;
-
-        case ThreeGppHttpHeader::EMBEDDED_OBJECT:
-            processingDelay = m_httpVariables->GetEmbeddedObjectGenerationDelay();
+        }
+        case ThreeGppHttpHeader::EMBEDDED_OBJECT: {
+            const auto processingDelay = m_httpVariables->GetEmbeddedObjectGenerationDelay();
             NS_LOG_INFO(this << " Will finish generating an embedded object"
                              << " in " << processingDelay.As(Time::S) << ".");
             m_txBuffer->RecordNextServe(
@@ -435,7 +464,7 @@
                                     socket),
                 httpHeader.GetClientTs());
             break;
-
+        }
         default:
             NS_FATAL_ERROR("Invalid packet.");
             break;
@@ -450,49 +479,50 @@
 {
     NS_LOG_FUNCTION(this << socket << availableBufferSize);
 
-    if (!m_txBuffer->IsBufferEmpty(socket))
+    if (m_txBuffer->IsBufferEmpty(socket))
     {
-        const uint32_t txBufferSize [[maybe_unused]] = m_txBuffer->GetBufferSize(socket);
-        const uint32_t actualSent [[maybe_unused]] = ServeFromTxBuffer(socket);
+        return;
+    }
+
+    const auto txBufferSize [[maybe_unused]] = m_txBuffer->GetBufferSize(socket);
+    const auto actualSent [[maybe_unused]] = ServeFromTxBuffer(socket);
 
 #ifdef NS3_LOG_ENABLE
-        // Some log messages.
-        if (actualSent < txBufferSize)
+    // Some log messages.
+    if (actualSent < txBufferSize)
+    {
+        switch (m_txBuffer->GetBufferContentType(socket))
         {
-            switch (m_txBuffer->GetBufferContentType(socket))
-            {
-            case ThreeGppHttpHeader::MAIN_OBJECT:
-                NS_LOG_INFO(this << " Transmission of main object is suspended"
-                                 << " after " << actualSent << " bytes.");
-                break;
-            case ThreeGppHttpHeader::EMBEDDED_OBJECT:
-                NS_LOG_INFO(this << " Transmission of embedded object is suspended"
-                                 << " after " << actualSent << " bytes.");
-                break;
-            default:
-                NS_FATAL_ERROR("Invalid Tx buffer content type.");
-                break;
-            }
+        case ThreeGppHttpHeader::MAIN_OBJECT:
+            NS_LOG_INFO(this << " Transmission of main object is suspended"
+                             << " after " << actualSent << " bytes.");
+            break;
+        case ThreeGppHttpHeader::EMBEDDED_OBJECT:
+            NS_LOG_INFO(this << " Transmission of embedded object is suspended"
+                             << " after " << actualSent << " bytes.");
+            break;
+        default:
+            NS_FATAL_ERROR("Invalid Tx buffer content type.");
+            break;
         }
-        else
+    }
+    else
+    {
+        switch (m_txBuffer->GetBufferContentType(socket))
         {
-            switch (m_txBuffer->GetBufferContentType(socket))
-            {
-            case ThreeGppHttpHeader::MAIN_OBJECT:
-                NS_LOG_INFO(this << " Finished sending a whole main object.");
-                break;
-            case ThreeGppHttpHeader::EMBEDDED_OBJECT:
-                NS_LOG_INFO(this << " Finished sending a whole embedded object.");
-                break;
-            default:
-                NS_FATAL_ERROR("Invalid Tx buffer content type.");
-                break;
-            }
+        case ThreeGppHttpHeader::MAIN_OBJECT:
+            NS_LOG_INFO(this << " Finished sending a whole main object.");
+            break;
+        case ThreeGppHttpHeader::EMBEDDED_OBJECT:
+            NS_LOG_INFO(this << " Finished sending a whole embedded object.");
+            break;
+        default:
+            NS_FATAL_ERROR("Invalid Tx buffer content type.");
+            break;
         }
+    }
 #endif /* NS3_LOG_ENABLE */
 
-    } // end of `if (m_txBuffer->IsBufferEmpty (socket))`
-
 } // end of `void SendCallback (Ptr<Socket> socket, uint32_t availableBufferSize)`
 
 void
@@ -500,11 +530,11 @@
 {
     NS_LOG_FUNCTION(this << socket);
 
-    const uint32_t objectSize = m_httpVariables->GetMainObjectSize();
+    const auto objectSize = m_httpVariables->GetMainObjectSize();
     NS_LOG_INFO(this << " Main object to be served is " << objectSize << " bytes.");
     m_mainObjectTrace(objectSize);
     m_txBuffer->WriteNewObject(socket, ThreeGppHttpHeader::MAIN_OBJECT, objectSize);
-    const uint32_t actualSent = ServeFromTxBuffer(socket);
+    const auto actualSent = ServeFromTxBuffer(socket);
 
     if (actualSent < objectSize)
     {
@@ -522,11 +552,11 @@
 {
     NS_LOG_FUNCTION(this << socket);
 
-    const uint32_t objectSize = m_httpVariables->GetEmbeddedObjectSize();
+    const auto objectSize = m_httpVariables->GetEmbeddedObjectSize();
     NS_LOG_INFO(this << " Embedded object to be served is " << objectSize << " bytes.");
     m_embeddedObjectTrace(objectSize);
     m_txBuffer->WriteNewObject(socket, ThreeGppHttpHeader::EMBEDDED_OBJECT, objectSize);
-    const uint32_t actualSent = ServeFromTxBuffer(socket);
+    const auto actualSent = ServeFromTxBuffer(socket);
 
     if (actualSent < objectSize)
     {
@@ -549,19 +579,18 @@
         NS_LOG_LOGIC(this << " Tx buffer is empty. Not sending anything.");
         return 0;
     }
-    bool firstPartOfObject = !m_txBuffer->HasTxedPartOfObject(socket);
 
-    const uint32_t socketSize = socket->GetTxAvailable();
+    const auto socketSize = socket->GetTxAvailable();
     NS_LOG_DEBUG(this << " Socket has " << socketSize << " bytes available for Tx.");
 
     // Get the number of bytes remaining to be sent.
-    const uint32_t txBufferSize = m_txBuffer->GetBufferSize(socket);
+    const auto txBufferSize = m_txBuffer->GetBufferSize(socket);
 
     // Compute the size of actual content to be sent; has to fit into the socket.
     // Note that header size is NOT counted as TxBuffer content. Header size is overhead.
-    uint32_t contentSize = std::min(txBufferSize, socketSize - 22);
-    Ptr<Packet> packet = Create<Packet>(contentSize);
-    uint32_t packetSize = contentSize;
+    const auto contentSize = std::min(txBufferSize, socketSize - 22);
+    auto packet = Create<Packet>(contentSize);
+    auto packetSize = contentSize;
     if (packetSize == 0)
     {
         NS_LOG_LOGIC(this << " Socket size leads to packet size of zero; not sending anything.");
@@ -569,7 +598,7 @@
     }
 
     // If this is the first packet of an object, attach a header.
-    if (firstPartOfObject)
+    if (!m_txBuffer->HasTxedPartOfObject(socket))
     {
         // Create header.
         ThreeGppHttpHeader httpHeader;
@@ -592,7 +621,7 @@
     }
 
     // Send.
-    const int actualBytes = socket->Send(packet);
+    const auto actualBytes = socket->Send(packet);
     NS_LOG_DEBUG(this << " Send() packet " << packet << " of " << packetSize << " bytes,"
                       << " return value= " << actualBytes << ".");
     m_txTrace(packet);
@@ -619,8 +648,8 @@
 void
 ThreeGppHttpServer::SwitchToState(ThreeGppHttpServer::State_t state)
 {
-    const std::string oldState = GetStateString();
-    const std::string newState = GetStateString(state);
+    const auto oldState = GetStateString();
+    const auto newState = GetStateString(state);
     NS_LOG_FUNCTION(this << oldState << newState);
     m_state = state;
     NS_LOG_INFO(this << " ThreeGppHttpServer " << oldState << " --> " << newState << ".");
@@ -717,20 +746,20 @@
 {
     NS_LOG_FUNCTION(this);
 
-    for (auto it = m_txBuffer.begin(); it != m_txBuffer.end(); ++it)
+    for (auto& [socket, buffer] : m_txBuffer)
     {
-        if (!Simulator::IsExpired(it->second.nextServe))
+        if (!Simulator::IsExpired(buffer.nextServe))
         {
             NS_LOG_INFO(this << " Canceling a serving event which is due in "
-                             << Simulator::GetDelayLeft(it->second.nextServe).As(Time::S) << ".");
-            Simulator::Cancel(it->second.nextServe);
+                             << Simulator::GetDelayLeft(buffer.nextServe).As(Time::S) << ".");
+            Simulator::Cancel(buffer.nextServe);
         }
 
-        it->first->Close();
-        it->first->SetCloseCallbacks(MakeNullCallback<void, Ptr<Socket>>(),
-                                     MakeNullCallback<void, Ptr<Socket>>());
-        it->first->SetRecvCallback(MakeNullCallback<void, Ptr<Socket>>());
-        it->first->SetSendCallback(MakeNullCallback<void, Ptr<Socket>, uint32_t>());
+        socket->Close();
+        socket->SetCloseCallbacks(MakeNullCallback<void, Ptr<Socket>>(),
+                                  MakeNullCallback<void, Ptr<Socket>>());
+        socket->SetRecvCallback(MakeNullCallback<void, Ptr<Socket>>());
+        socket->SetSendCallback(MakeNullCallback<void, Ptr<Socket>, uint32_t>());
     }
 
     m_txBuffer.clear();
@@ -739,40 +768,40 @@
 bool
 ThreeGppHttpServerTxBuffer::IsBufferEmpty(Ptr<Socket> socket) const
 {
-    auto it = m_txBuffer.find(socket);
-    NS_ASSERT_MSG(it != m_txBuffer.end(), "Socket " << socket << " cannot be found.");
+    const auto it = m_txBuffer.find(socket);
+    NS_ASSERT_MSG(it != m_txBuffer.cend(), "Socket " << socket << " cannot be found.");
     return (it->second.txBufferSize == 0);
 }
 
 Time
 ThreeGppHttpServerTxBuffer::GetClientTs(Ptr<Socket> socket) const
 {
-    auto it = m_txBuffer.find(socket);
-    NS_ASSERT_MSG(it != m_txBuffer.end(), "Socket " << socket << " cannot be found.");
+    const auto it = m_txBuffer.find(socket);
+    NS_ASSERT_MSG(it != m_txBuffer.cend(), "Socket " << socket << " cannot be found.");
     return it->second.clientTs;
 }
 
 ThreeGppHttpHeader::ContentType_t
 ThreeGppHttpServerTxBuffer::GetBufferContentType(Ptr<Socket> socket) const
 {
-    auto it = m_txBuffer.find(socket);
-    NS_ASSERT_MSG(it != m_txBuffer.end(), "Socket " << socket << " cannot be found.");
+    const auto it = m_txBuffer.find(socket);
+    NS_ASSERT_MSG(it != m_txBuffer.cend(), "Socket " << socket << " cannot be found.");
     return it->second.txBufferContentType;
 }
 
 uint32_t
 ThreeGppHttpServerTxBuffer::GetBufferSize(Ptr<Socket> socket) const
 {
-    auto it = m_txBuffer.find(socket);
-    NS_ASSERT_MSG(it != m_txBuffer.end(), "Socket " << socket << " cannot be found.");
+    const auto it = m_txBuffer.find(socket);
+    NS_ASSERT_MSG(it != m_txBuffer.cend(), "Socket " << socket << " cannot be found.");
     return it->second.txBufferSize;
 }
 
 bool
 ThreeGppHttpServerTxBuffer::HasTxedPartOfObject(Ptr<Socket> socket) const
 {
-    auto it = m_txBuffer.find(socket);
-    NS_ASSERT_MSG(it != m_txBuffer.end(), "Socket " << socket << " cannot be found");
+    const auto it = m_txBuffer.find(socket);
+    NS_ASSERT_MSG(it != m_txBuffer.cend(), "Socket " << socket << " cannot be found");
     return it->second.hasTxedPartOfObject;
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/model/three-gpp-http-server.h ns-3.44/src/applications/model/three-gpp-http-server.h
--- ns-3.43/src/applications/model/three-gpp-http-server.h	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/applications/model/three-gpp-http-server.h	2025-03-09 16:55:49.347370900 -0700
@@ -10,17 +10,18 @@
 #ifndef THREE_GPP_HTTP_SERVER_H
 #define THREE_GPP_HTTP_SERVER_H
 
+#include "sink-application.h"
 #include "three-gpp-http-header.h"
 
-#include <ns3/address.h>
-#include <ns3/application.h>
-#include <ns3/event-id.h>
-#include <ns3/nstime.h>
-#include <ns3/ptr.h>
-#include <ns3/simple-ref-count.h>
-#include <ns3/traced-callback.h>
+#include "ns3/address.h"
+#include "ns3/event-id.h"
+#include "ns3/nstime.h"
+#include "ns3/ptr.h"
+#include "ns3/simple-ref-count.h"
+#include "ns3/traced-callback.h"
 
 #include <map>
+#include <optional>
 #include <ostream>
 
 namespace ns3
@@ -32,7 +33,7 @@
 class ThreeGppHttpServerTxBuffer;
 
 /**
- * \ingroup http
+ * @ingroup http
  * Model application which simulates the traffic of a web server. This
  * application works in conjunction with ThreeGppHttpClient applications.
  *
@@ -54,9 +55,11 @@
  * The application accepts connection request from clients. Every connection is
  * kept open until the client disconnects.
  */
-class ThreeGppHttpServer : public Application
+class ThreeGppHttpServer : public SinkApplication
 {
   public:
+    static constexpr uint16_t HTTP_DEFAULT_PORT{80}; //!< default HTTP port
+
     /**
      * Creates a new instance of HTTP server application.
      *
@@ -72,7 +75,7 @@
 
     /**
      * Returns the object TypeId.
-     * \return The object TypeId.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
@@ -83,13 +86,13 @@
      * application is created. Values other than the standard 536 and 1460 bytes
      * can be set using this method.
      *
-     * \param mtuSize MTU size in bytes.
+     * @param mtuSize MTU size in bytes.
      */
     void SetMtuSize(uint32_t mtuSize);
 
     /**
      * Returns a pointer to the listening socket.
-     * \return Pointer to the listening socket
+     * @return Pointer to the listening socket
      */
     Ptr<Socket> GetSocket() const;
 
@@ -103,35 +106,35 @@
 
     /**
      * Returns the current state of the application.
-     * \return The current state of the application.
+     * @return The current state of the application.
      */
     State_t GetState() const;
 
     /**
      * Returns the current state of the application in string format.
-     * \return The current state of the application in string format.
+     * @return The current state of the application in string format.
      */
     std::string GetStateString() const;
 
     /**
      * Returns the given state in string format.
-     * \param state An arbitrary state of an application.
-     * \return The given state equivalently expressed in string format.
+     * @param state An arbitrary state of an application.
+     * @return The given state equivalently expressed in string format.
      */
     static std::string GetStateString(State_t state);
 
     /**
      * Common callback signature for `MainObject` and `EmbeddedObject` trace
      * sources.
-     * \param size Size of the generated object in bytes.
+     * @param size Size of the generated object in bytes.
      */
     typedef void (*ThreeGppHttpObjectCallback)(uint32_t size);
 
     /**
      * Callback signature for `ConnectionEstablished` trace source.
-     * \param httpServer Pointer to this instance of ThreeGppHttpServer, which is where
+     * @param httpServer Pointer to this instance of ThreeGppHttpServer, which is where
      *                   the trace originated.
-     * \param socket Pointer to the socket where the connection is established.
+     * @param socket Pointer to the socket where the connection is established.
      */
     typedef void (*ConnectionEstablishedCallback)(Ptr<const ThreeGppHttpServer> httpServer,
                                                   Ptr<Socket> socket);
@@ -142,35 +145,37 @@
   private:
     void StartApplication() override;
     void StopApplication() override;
+    void SetLocal(const Address& addr) override;
+    void SetPort(uint32_t port) override;
 
     // SOCKET CALLBACK METHODS
 
     /**
      * Invoked when #m_initialSocket receives a connection request.
-     * \param socket Pointer to the socket where the event originates from.
-     * \param address The address of the remote client where the connection
+     * @param socket Pointer to the socket where the event originates from.
+     * @param address The address of the remote client where the connection
      *                request comes from.
-     * \return Always true, to indicate to the other end that the connection
+     * @return Always true, to indicate to the other end that the connection
      *         request is accepted.
      */
     bool ConnectionRequestCallback(Ptr<Socket> socket, const Address& address);
     /**
      * Invoked when a new connection has been established.
-     * \param socket Pointer to the socket that maintains the connection to the
+     * @param socket Pointer to the socket that maintains the connection to the
      *               remote client. This socket will be saved to the Tx buffer.
-     * \param address The address the connection is incoming from.
+     * @param address The address the connection is incoming from.
      */
     void NewConnectionCreatedCallback(Ptr<Socket> socket, const Address& address);
     /**
      * Invoked when a connection with a web client is terminated. The
      * corresponding socket will be removed from Tx buffer.
-     * \param socket Pointer to the socket where the event originates from.
+     * @param socket Pointer to the socket where the event originates from.
      */
     void NormalCloseCallback(Ptr<Socket> socket);
     /**
      * Invoked when a connection with a web client is terminated. The
      * corresponding socket will be removed from Tx buffer.
-     * \param socket Pointer to the socket where the event originates from.
+     * @param socket Pointer to the socket where the event originates from.
      */
     void ErrorCloseCallback(Ptr<Socket> socket);
     /**
@@ -180,15 +185,15 @@
      * Depending on the type of object requested, the method will trigger
      * ServeMainObject() or ServeEmbeddedObject() after some delays.
      *
-     * \param socket Pointer to the socket where the event originates from.
+     * @param socket Pointer to the socket where the event originates from.
      */
     void ReceivedDataCallback(Ptr<Socket> socket);
     /**
      * Invoked when more buffer space for transmission is added to a socket. The
      * method will invoke ServeFromTxBuffer() to start some transmission using
      * the socket.
-     * \param socket Pointer to the socket where the event originates from.
-     * \param availableBufferSize The number of bytes available in the socket's
+     * @param socket Pointer to the socket where the event originates from.
+     * @param availableBufferSize The number of bytes available in the socket's
      *                            transmission buffer.
      */
     void SendCallback(Ptr<Socket> socket, uint32_t availableBufferSize);
@@ -202,7 +207,7 @@
      * Fires the `MainObject` trace source. It then immediately triggers
      * ServeFromTxBuffer() to send the object.
      *
-     * \param socket Pointer to the socket which is associated with the
+     * @param socket Pointer to the socket which is associated with the
      *               destination client.
      */
     void ServeNewMainObject(Ptr<Socket> socket);
@@ -213,7 +218,7 @@
      * Fires the `EmbeddedObject` trace source. It then immediately triggers
      * ServeFromTxBuffer() to send the object.
      *
-     * \param socket Pointer to the socket which is associated with the
+     * @param socket Pointer to the socket which is associated with the
      *               destination client.
      */
     void ServeNewEmbeddedObject(Ptr<Socket> socket);
@@ -232,15 +237,15 @@
      * the socket informs (through SendCallback()) that more buffer space for
      * transmission has become available.
      *
-     * \param socket Pointer to the socket which is associated with the
+     * @param socket Pointer to the socket which is associated with the
      *               destination client.
-     * \return Size of the packet sent (in bytes).
+     * @return Size of the packet sent (in bytes).
      */
     uint32_t ServeFromTxBuffer(Ptr<Socket> socket);
 
     /**
      * Change the state of the server. Fires the `StateTransition` trace source.
-     * \param state The new state.
+     * @param state The new state.
      */
     void SwitchToState(State_t state);
 
@@ -255,10 +260,11 @@
 
     /// The `Variables` attribute.
     Ptr<ThreeGppHttpVariables> m_httpVariables;
-    /// The `LocalAddress` attribute.
-    Address m_localAddress;
     /// The `LocalPort` attribute.
-    uint16_t m_localPort;
+    /// Note: this is a trick needed because we have 2 ports attributes, Port and LocalPort, where
+    /// the latter is deprecated and hence this will actually go away once we can remove deprecated
+    /// attributes and code.
+    std::optional<uint16_t> m_optPort;
     /// The `Tos` attribute.
     uint8_t m_tos;
     /// The `Mtu` attribute.
@@ -276,6 +282,8 @@
     TracedCallback<Ptr<const Packet>> m_txTrace;
     /// The `Rx` trace source.
     TracedCallback<Ptr<const Packet>, const Address&> m_rxTrace;
+    /// The `Rx` trace source with the local address.
+    TracedCallback<Ptr<const Packet>, const Address&, const Address&> m_rxTraceWithAddresses;
     /// The `RxDelay` trace source.
     TracedCallback<const Time&, const Address&> m_rxDelayTrace;
     /// The `StateTransition` trace source.
@@ -284,8 +292,8 @@
 }; // end of `class ThreeGppHttpServer`
 
 /**
- * \internal
- * \ingroup http
+ * @internal
+ * @ingroup http
  * Transmission buffer used by an HTTP server instance.
  *
  * The class handles the sockets which face the connected HTTP clients. An
@@ -312,8 +320,8 @@
      * buffers. On the other hand, all the other methods that accept a pointer to
      * a socket as an argument require the existence of a buffer allocated to the
      * given socket.
-     * \param socket Pointer to the socket to be found.
-     * \return True if the given socket is found within the buffer.
+     * @param socket Pointer to the socket to be found.
+     * @return True if the given socket is found within the buffer.
      */
     bool IsSocketAvailable(Ptr<Socket> socket) const;
 
@@ -321,9 +329,9 @@
      * Add a new socket and create an empty transmission buffer for it. After the
      * method is completed, IsSocketAvailable() for the same pointer of socket
      * shall return true.
-     * \param socket Pointer to the new socket to be added (must not exist in the
+     * @param socket Pointer to the new socket to be added (must not exist in the
      *               buffer).
-     * \warning Must be called only when IsSocketAvailable() for the given socket
+     * @warning Must be called only when IsSocketAvailable() for the given socket
      *          is false.
      */
     void AddSocket(Ptr<Socket> socket);
@@ -340,8 +348,8 @@
      * After the method is completed, IsSocketAvailable() for the same pointer of
      * socket shall return false.
      *
-     * \param socket Pointer to the socket to be removed.
-     * \warning Must be called only when IsSocketAvailable() for the given socket
+     * @param socket Pointer to the socket to be removed.
+     * @warning Must be called only when IsSocketAvailable() for the given socket
      *          is true.
      */
     void RemoveSocket(Ptr<Socket> socket);
@@ -357,8 +365,8 @@
      * After the method is completed, IsSocketAvailable() for the same pointer of
      * socket shall return false.
      *
-     * \param socket Pointer to the socket to be closed and removed.
-     * \warning Must be called only when IsSocketAvailable() for the given socket
+     * @param socket Pointer to the socket to be closed and removed.
+     * @warning Must be called only when IsSocketAvailable() for the given socket
      *          is true.
      */
     void CloseSocket(Ptr<Socket> socket);
@@ -371,19 +379,19 @@
     // BUFFER MANAGEMENT
 
     /**
-     * \param socket Pointer to the socket which is associated with the
+     * @param socket Pointer to the socket which is associated with the
      *               transmission buffer of interest.
-     * \return True if the current length of the transmission buffer is zero,
+     * @return True if the current length of the transmission buffer is zero,
      *         i.e., no pending packet.
-     * \warning Must be called only when IsSocketAvailable() for the given socket
+     * @warning Must be called only when IsSocketAvailable() for the given socket
      *          is true.
      */
     bool IsBufferEmpty(Ptr<Socket> socket) const;
 
     /**
-     * \param socket Pointer to the socket which is associated with the
+     * @param socket Pointer to the socket which is associated with the
      *               transmission buffer of interest
-     * \return The client time stamp that comes from the last request packet
+     * @return The client time stamp that comes from the last request packet
      *         received by the given socket. It indicates the time the request
      *         packet was transmitted by the client.
      */
@@ -393,31 +401,31 @@
      * Returns ThreeGppHttpHeader::NOT_SET when the buffer is new and never been filled
      * with any data before. Otherwise, returns either ThreeGppHttpHeader::MAIN_OBJECT
      * or ThreeGppHttpHeader::EMBEDDED_OBJECT.
-     * \param socket Pointer to the socket which is associated with the
+     * @param socket Pointer to the socket which is associated with the
      *               transmission buffer of interest
-     * \return The content type of the current data inside the transmission
+     * @return The content type of the current data inside the transmission
      *         buffer.
-     * \warning Must be called only when IsSocketAvailable() for the given socket
+     * @warning Must be called only when IsSocketAvailable() for the given socket
      *          is true.
      */
     ThreeGppHttpHeader::ContentType_t GetBufferContentType(Ptr<Socket> socket) const;
 
     /**
-     * \param socket Pointer to the socket which is associated with the
+     * @param socket Pointer to the socket which is associated with the
      *               transmission buffer of interest
-     * \return The length (in bytes) of the current data inside the transmission
+     * @return The length (in bytes) of the current data inside the transmission
      *         buffer.
-     * \warning Must be called only when IsSocketAvailable() for the given socket
+     * @warning Must be called only when IsSocketAvailable() for the given socket
      *          is true.
      */
     uint32_t GetBufferSize(Ptr<Socket> socket) const;
 
     /**
-     * \param socket pointer to the socket which is associated with the
+     * @param socket pointer to the socket which is associated with the
      *               transmission buffer of interest
-     * \return true if the buffer content has been read since it is written
+     * @return true if the buffer content has been read since it is written
      *
-     * \warning Must be called only when IsSocketAvailable() for the given socket
+     * @warning Must be called only when IsSocketAvailable() for the given socket
      *          is true.
      *
      * This method returns true after WriteNewObject() method is called. It
@@ -432,13 +440,13 @@
      * The stored data can be later consumed wholly of partially by
      * DepleteBufferSize() method.
      *
-     * \param socket Pointer to the socket which is associated with the
+     * @param socket Pointer to the socket which is associated with the
      *               transmission buffer of interest.
-     * \param contentType The content-type of the data to be written (must not
+     * @param contentType The content-type of the data to be written (must not
      *                    equal to ThreeGppHttpHeader:NOT_SET).
-     * \param objectSize The length (in bytes) of the new object to be created
+     * @param objectSize The length (in bytes) of the new object to be created
      *                   (must be greater than zero).
-     * \warning Must be called only when both IsSocketAvailable() and
+     * @warning Must be called only when both IsSocketAvailable() and
      *          IsBufferEmpty() for the given socket are true.
      */
     void WriteNewObject(Ptr<Socket> socket,
@@ -452,13 +460,13 @@
      * The method also indicates the time stamp given by the client. The time
      * stamp will be included in every packet sent.
      *
-     * \param socket pointer to the socket which is associated with the
+     * @param socket pointer to the socket which is associated with the
      *               transmission buffer of interest
-     * \param eventId the event to be recorded, e.g., the return value of
+     * @param eventId the event to be recorded, e.g., the return value of
      *                Simulator::Schedule function
-     * \param clientTs client time stamp
+     * @param clientTs client time stamp
      *
-     * \warning Must be called only when IsSocketAvailable() for the given socket
+     * @warning Must be called only when IsSocketAvailable() for the given socket
      *          is true.
      */
     void RecordNextServe(Ptr<Socket> socket, const EventId& eventId, const Time& clientTs);
@@ -472,12 +480,12 @@
      * If the method has consumed all the remaining bytes within the buffer,
      * IsBufferEmpty() for the buffer shall return true.
      *
-     * \param socket Pointer to the socket which is associated with the
+     * @param socket Pointer to the socket which is associated with the
      *               transmission buffer of interest.
-     * \param amount The length (in bytes) to be consumed (must be greater than
+     * @param amount The length (in bytes) to be consumed (must be greater than
      *               zero).
      *
-     * \warning Must be called only when IsSocketAvailable() for the given socket
+     * @warning Must be called only when IsSocketAvailable() for the given socket
      *          is true. In addition, the requested amount must be larger than
      *          the current buffer size, which can be checked by calling the
      *          GetBufferSize() method.
@@ -487,9 +495,9 @@
     /**
      * Tell the buffer to close the associated socket once the buffer becomes
      * empty.
-     * \param socket Pointer to the socket which is associated with the
+     * @param socket Pointer to the socket which is associated with the
      *               transmission buffer of interest.
-     * \warning Must be called only when IsSocketAvailable() for the given socket
+     * @warning Must be called only when IsSocketAvailable() for the given socket
      *          is true.
      */
     void PrepareClose(Ptr<Socket> socket);
@@ -529,7 +537,7 @@
          */
         bool isClosing;
         /**
-         * \brief True if the buffer content has been read since it is written.
+         * @brief True if the buffer content has been read since it is written.
          *        Accessible using the HasTxedPartOfObject() method.
          */
         bool hasTxedPartOfObject;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/model/three-gpp-http-variables.cc ns-3.44/src/applications/model/three-gpp-http-variables.cc
--- ns-3.43/src/applications/model/three-gpp-http-variables.cc	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/applications/model/three-gpp-http-variables.cc	2025-03-09 16:55:49.347370900 -0700
@@ -9,9 +9,9 @@
 
 #include "three-gpp-http-variables.h"
 
-#include <ns3/double.h>
-#include <ns3/log.h>
-#include <ns3/uinteger.h>
+#include "ns3/double.h"
+#include "ns3/log.h"
+#include "ns3/uinteger.h"
 
 #include <math.h>
 
@@ -298,18 +298,17 @@
 ThreeGppHttpVariables::AssignStreams(int64_t stream)
 {
     NS_LOG_FUNCTION(this << stream);
-
-    m_mtuSizeRng->SetStream(stream);
-    m_requestSizeRng->SetStream(stream + 1);
-    m_mainObjectGenerationDelayRng->SetStream(stream + 2);
-    m_mainObjectSizeRng->SetStream(stream + 3);
-    m_embeddedObjectGenerationDelayRng->SetStream(stream + 4);
-    m_embeddedObjectSizeRng->SetStream(stream + 5);
-    m_numOfEmbeddedObjectsRng->SetStream(stream + 6);
-    m_readingTimeRng->SetStream(stream + 7);
-    m_parsingTimeRng->SetStream(stream + 8);
-
-    return 9;
+    auto currentStream = stream;
+    m_mtuSizeRng->SetStream(currentStream++);
+    m_requestSizeRng->SetStream(currentStream++);
+    m_mainObjectGenerationDelayRng->SetStream(currentStream++);
+    m_mainObjectSizeRng->SetStream(currentStream++);
+    m_embeddedObjectGenerationDelayRng->SetStream(currentStream++);
+    m_embeddedObjectSizeRng->SetStream(currentStream++);
+    m_numOfEmbeddedObjectsRng->SetStream(currentStream++);
+    m_readingTimeRng->SetStream(currentStream++);
+    m_parsingTimeRng->SetStream(currentStream++);
+    return (currentStream - stream);
 }
 
 void
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/model/three-gpp-http-variables.h ns-3.44/src/applications/model/three-gpp-http-variables.h
--- ns-3.43/src/applications/model/three-gpp-http-variables.h	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/applications/model/three-gpp-http-variables.h	2025-03-09 16:55:49.347370900 -0700
@@ -10,15 +10,15 @@
 #ifndef THREE_GPP_HTTP_VARIABLES_H
 #define THREE_GPP_HTTP_VARIABLES_H
 
-#include <ns3/nstime.h>
-#include <ns3/object.h>
-#include <ns3/random-variable-stream.h>
+#include "ns3/nstime.h"
+#include "ns3/object.h"
+#include "ns3/random-variable-stream.h"
 
 namespace ns3
 {
 
 /**
- * \ingroup http
+ * @ingroup http
  * Container of various random variables to assist in generating web browsing
  * traffic pattern.
  *
@@ -28,20 +28,20 @@
  *   - delay in generating a main object --- 0 second;
  *   - main object size --- truncated LogNormal distribution with a mean of
  *     10710 bytes;
- *     \image html http-main-object-size.png
+ *     @image html http-main-object-size.png
  *   - delay in generating an embedded object --- 0 second;
  *   - embedded object size (in bytes) --- truncated LogNormal distribution
  *     with a mean of 7758 bytes;
- *     \image html http-embedded-object-size.png
+ *     @image html http-embedded-object-size.png
  *   - number of embedded object per web page --- truncated Pareto distribution
  *     with a mean of approximately 3.95 (after truncation);
- *     \image html http-num-of-embedded-objects.png
+ *     @image html http-num-of-embedded-objects.png
  *   - length of reading time (in seconds) --- unbounded exponential
  *     distribution with a mean of 30 seconds; and
- *     \image html http-reading-time.png
+ *     @image html http-reading-time.png
  *   - length of parsing time (in seconds) --- unbounded exponential
  *     distribution with a mean of 0.13 seconds.
- *     \image html http-parsing-time.png
+ *     @image html http-parsing-time.png
  *
  * Most parameters of the random distributions are configurable via attributes
  * and methods of this class. The default values are according to the following
@@ -62,7 +62,7 @@
 
     /**
      * Returns the object TypeId.
-     * \return The object TypeId.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
@@ -74,7 +74,7 @@
      * of HTTP servers to send the response packets (both main objects and
      * embedded objects) to the requesting HTTP clients.
      *
-     * \return MTU size in bytes.
+     * @return MTU size in bytes.
      */
     uint32_t GetMtuSize();
 
@@ -86,7 +86,7 @@
      * method. This value applies to requests by HTTP client for main objects
      * and embedded objects alike.
      *
-     * \return Request size in bytes.
+     * @return Request size in bytes.
      */
     uint32_t GetRequestSize();
 
@@ -98,7 +98,7 @@
      * can be modified by setting the `MainObjectGenerationDelay` attribute or by
      * calling the SetMainObjectGenerationDelay() method.
      *
-     * \return The delay for generating a main object.
+     * @return The delay for generating a main object.
      */
     Time GetMainObjectGenerationDelay();
 
@@ -111,7 +111,7 @@
      * then truncated to fit between 100 bytes and 2 MB. These default settings
      * can be modified via attributes or class methods.
      *
-     * \return Main object size in bytes.
+     * @return Main object size in bytes.
      */
     uint32_t GetMainObjectSize();
 
@@ -123,7 +123,7 @@
      * This can be modified by setting the `EmbeddedObjectGenerationDelay`
      * attribute or by calling the SetEmbeddedObjectGenerationDelay() method.
      *
-     * \return The delay for generating an embedded object.
+     * @return The delay for generating an embedded object.
      */
     Time GetEmbeddedObjectGenerationDelay();
 
@@ -137,7 +137,7 @@
      * bytes, and then truncated to fit between 50 bytes and 2 MB. These default
      * settings can be modified via attributes or class methods.
      *
-     * \return Embedded object size in bytes.
+     * @return Embedded object size in bytes.
      */
     uint32_t GetEmbeddedObjectSize();
 
@@ -151,7 +151,7 @@
      * settings produces (after truncation) random integers within [0, 53)
      * interval, with an actual mean of approximately 3.95.
      *
-     * \return The number of embedded objects.
+     * @return The number of embedded objects.
      */
     uint32_t GetNumOfEmbeddedObjects();
 
@@ -164,7 +164,7 @@
      * without any maximum bound. The mean can be modified by setting the
      * `ReadingTimeMean` attribute or by calling the SetReadingTimeMean() method.
      *
-     * \return Time interval for reading a web page.
+     * @return Time interval for reading a web page.
      */
     Time GetReadingTime();
 
@@ -178,7 +178,7 @@
      * any maximum bound. The mean can be modified by setting the
      * `ParsingTimeMean` attribute or by calling the SetParsingTimeMean() method.
      *
-     * \return time interval for parsing a main object
+     * @return time interval for parsing a main object
      */
     Time GetParsingTime();
 
@@ -192,75 +192,75 @@
      * which use the same stream number should produce identical results (the
      * repeatability property of ns-3 simulation).
      *
-     * \param stream The first stream index to use.
-     * \return The number of stream indices assigned by this model.
+     * @param stream The first stream index to use.
+     * @return The number of stream indices assigned by this model.
      */
     int64_t AssignStreams(int64_t stream);
 
     // SETTER METHODS
 
     /**
-     * \param constant Request size in bytes.
+     * @param constant Request size in bytes.
      */
     void SetRequestSize(uint32_t constant);
     /**
-     * \param constant The delay for generating a main object.
+     * @param constant The delay for generating a main object.
      */
     void SetMainObjectGenerationDelay(Time constant);
     /**
-     * \param mean The mean of main object sizes in bytes. Must be greater than
+     * @param mean The mean of main object sizes in bytes. Must be greater than
      *             zero.
      */
     void SetMainObjectSizeMean(uint32_t mean);
     /**
-     * \param stdDev The standard deviation of main object sizes in bytes.
+     * @param stdDev The standard deviation of main object sizes in bytes.
      */
     void SetMainObjectSizeStdDev(uint32_t stdDev);
     /**
-     * \param constant The delay for generating an embedded object.
+     * @param constant The delay for generating an embedded object.
      */
     void SetEmbeddedObjectGenerationDelay(Time constant);
     /**
-     * \param mean The mean of embedded object sizes in bytes. Must be greater
+     * @param mean The mean of embedded object sizes in bytes. Must be greater
      *             than zero.
      */
     void SetEmbeddedObjectSizeMean(uint32_t mean);
     /**
-     * \param stdDev The standard deviation of embedded object sizes in bytes.
+     * @param stdDev The standard deviation of embedded object sizes in bytes.
      */
     void SetEmbeddedObjectSizeStdDev(uint32_t stdDev);
     /**
-     * \param max The upper bound parameter of the Pareto distribution for
+     * @param max The upper bound parameter of the Pareto distribution for
      *            determining the number of embedded objects per web page.
      */
     void SetNumOfEmbeddedObjectsMax(uint32_t max);
     /**
-     * \param shape The shape parameter of the Pareto distribution for
+     * @param shape The shape parameter of the Pareto distribution for
      *              determining the number of embedded objects per web page.
      */
     void SetNumOfEmbeddedObjectsShape(double shape);
     /**
-     * \param scale The scale parameter of the Pareto distribution for
+     * @param scale The scale parameter of the Pareto distribution for
      *              determining the number of embedded objects per web page.
      */
     void SetNumOfEmbeddedObjectsScale(uint32_t scale);
     /**
-     * \param mean The mean length of time needed for reading a web page.
+     * @param mean The mean length of time needed for reading a web page.
      */
     void SetReadingTimeMean(Time mean);
     /**
-     * \param mean The mean length of time needed for parsing a main object.
+     * @param mean The mean length of time needed for parsing a main object.
      */
     void SetParsingTimeMean(Time mean);
 
   private:
     /**
-     * \brief Upon and after object initialization, update random variable
+     * @brief Upon and after object initialization, update random variable
      * Mu and Sigma based on changes to attribute values.
      */
     void UpdateMainObjectMuAndSigma();
     /**
-     * \brief Upon and after object initialization, update random variable
+     * @brief Upon and after object initialization, update random variable
      * Mu and Sigma based on changes to attribute values.
      */
     void UpdateEmbeddedObjectMuAndSigma();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/model/udp-client.cc ns-3.44/src/applications/model/udp-client.cc
--- ns-3.43/src/applications/model/udp-client.cc	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/applications/model/udp-client.cc	2025-03-09 16:55:49.347370900 -0700
@@ -6,13 +6,12 @@
  * Author: Amine Ismail <amine.ismail@sophia.inria.fr>
  *                      <amine.ismail@udcast.com>
  */
+
 #include "udp-client.h"
 
 #include "seq-ts-header.h"
 
-#include "ns3/inet-socket-address.h"
-#include "ns3/inet6-socket-address.h"
-#include "ns3/ipv4-address.h"
+#include "ns3/address-utils.h"
 #include "ns3/log.h"
 #include "ns3/nstime.h"
 #include "ns3/packet.h"
@@ -36,7 +35,7 @@
 {
     static TypeId tid =
         TypeId("ns3::UdpClient")
-            .SetParent<Application>()
+            .SetParent<SourceApplication>()
             .SetGroupName("Applications")
             .AddConstructor<UdpClient>()
             .AddAttribute(
@@ -47,25 +46,27 @@
                 MakeUintegerChecker<uint32_t>())
             .AddAttribute("Interval",
                           "The time to wait between packets",
-                          TimeValue(Seconds(1.0)),
+                          TimeValue(Seconds(1)),
                           MakeTimeAccessor(&UdpClient::m_interval),
                           MakeTimeChecker())
             .AddAttribute("RemoteAddress",
                           "The destination Address of the outbound packets",
                           AddressValue(),
-                          MakeAddressAccessor(&UdpClient::m_peerAddress),
-                          MakeAddressChecker())
+                          MakeAddressAccessor(
+                              (void(UdpClient::*)(const Address&)) &
+                                  UdpClient::SetRemote, // this is needed to indicate which version
+                                                        // of the function overload to use
+                              &UdpClient::GetRemote),
+                          MakeAddressChecker(),
+                          TypeId::SupportLevel::DEPRECATED,
+                          "Replaced by Remote in ns-3.44.")
             .AddAttribute("RemotePort",
                           "The destination port of the outbound packets",
-                          UintegerValue(100),
-                          MakeUintegerAccessor(&UdpClient::m_peerPort),
-                          MakeUintegerChecker<uint16_t>())
-            .AddAttribute("Tos",
-                          "The Type of Service used to send IPv4 packets. "
-                          "All 8 bits of the TOS byte are set (including ECN bits).",
-                          UintegerValue(0),
-                          MakeUintegerAccessor(&UdpClient::m_tos),
-                          MakeUintegerChecker<uint8_t>())
+                          UintegerValue(UdpClient::DEFAULT_PORT),
+                          MakeUintegerAccessor(&UdpClient::SetPort, &UdpClient::GetPort),
+                          MakeUintegerChecker<uint16_t>(),
+                          TypeId::SupportLevel::DEPRECATED,
+                          "Replaced by Remote in ns-3.44.")
             .AddAttribute("PacketSize",
                           "Size of packets generated. The minimum packet size is 12 bytes which is "
                           "the size of the header carrying the sequence number and the time stamp.",
@@ -84,12 +85,13 @@
 }
 
 UdpClient::UdpClient()
+    : m_sent{0},
+      m_totalTx{0},
+      m_socket{nullptr},
+      m_peerPort{},
+      m_sendEvent{}
 {
     NS_LOG_FUNCTION(this);
-    m_sent = 0;
-    m_totalTx = 0;
-    m_socket = nullptr;
-    m_sendEvent = EventId();
 }
 
 UdpClient::~UdpClient()
@@ -98,18 +100,65 @@
 }
 
 void
-UdpClient::SetRemote(Address ip, uint16_t port)
+UdpClient::SetRemote(const Address& ip, uint16_t port)
 {
     NS_LOG_FUNCTION(this << ip << port);
-    m_peerAddress = ip;
-    m_peerPort = port;
+    SetRemote(ip);
+    SetPort(port);
 }
 
 void
-UdpClient::SetRemote(Address addr)
+UdpClient::SetRemote(const Address& addr)
 {
     NS_LOG_FUNCTION(this << addr);
-    m_peerAddress = addr;
+    if (!addr.IsInvalid())
+    {
+        m_peer = addr;
+        if (m_peerPort)
+        {
+            SetPort(*m_peerPort);
+        }
+    }
+}
+
+Address
+UdpClient::GetRemote() const
+{
+    return m_peer;
+}
+
+void
+UdpClient::SetPort(uint16_t port)
+{
+    NS_LOG_FUNCTION(this << port);
+    if (m_peer.IsInvalid())
+    {
+        // save for later
+        m_peerPort = port;
+        return;
+    }
+    if (Ipv4Address::IsMatchingType(m_peer) || Ipv6Address::IsMatchingType(m_peer))
+    {
+        m_peer = addressUtils::ConvertToSocketAddress(m_peer, port);
+    }
+}
+
+uint16_t
+UdpClient::GetPort() const
+{
+    if (m_peer.IsInvalid())
+    {
+        return m_peerPort.value_or(UdpClient::DEFAULT_PORT);
+    }
+    if (InetSocketAddress::IsMatchingType(m_peer))
+    {
+        return InetSocketAddress::ConvertFrom(m_peer).GetPort();
+    }
+    else if (Inet6SocketAddress::IsMatchingType(m_peer))
+    {
+        return Inet6SocketAddress::ConvertFrom(m_peer).GetPort();
+    }
+    return UdpClient::DEFAULT_PORT;
 }
 
 void
@@ -119,74 +168,65 @@
 
     if (!m_socket)
     {
-        TypeId tid = TypeId::LookupByName("ns3::UdpSocketFactory");
+        auto tid = TypeId::LookupByName("ns3::UdpSocketFactory");
         m_socket = Socket::CreateSocket(GetNode(), tid);
-        if (Ipv4Address::IsMatchingType(m_peerAddress))
+        NS_ABORT_MSG_IF(m_peer.IsInvalid(), "Remote address not properly set");
+        if (!m_local.IsInvalid())
         {
-            if (m_socket->Bind() == -1)
+            NS_ABORT_MSG_IF((Inet6SocketAddress::IsMatchingType(m_peer) &&
+                             InetSocketAddress::IsMatchingType(m_local)) ||
+                                (InetSocketAddress::IsMatchingType(m_peer) &&
+                                 Inet6SocketAddress::IsMatchingType(m_local)),
+                            "Incompatible peer and local address IP version");
+            if (m_socket->Bind(m_local) == -1)
             {
                 NS_FATAL_ERROR("Failed to bind socket");
             }
-            m_socket->SetIpTos(m_tos); // Affects only IPv4 sockets.
-            m_socket->Connect(
-                InetSocketAddress(Ipv4Address::ConvertFrom(m_peerAddress), m_peerPort));
         }
-        else if (Ipv6Address::IsMatchingType(m_peerAddress))
+        else
         {
-            if (m_socket->Bind6() == -1)
+            if (InetSocketAddress::IsMatchingType(m_peer))
             {
-                NS_FATAL_ERROR("Failed to bind socket");
+                if (m_socket->Bind() == -1)
+                {
+                    NS_FATAL_ERROR("Failed to bind socket");
+                }
             }
-            m_socket->Connect(
-                Inet6SocketAddress(Ipv6Address::ConvertFrom(m_peerAddress), m_peerPort));
-        }
-        else if (InetSocketAddress::IsMatchingType(m_peerAddress))
-        {
-            if (m_socket->Bind() == -1)
+            else if (Inet6SocketAddress::IsMatchingType(m_peer))
             {
-                NS_FATAL_ERROR("Failed to bind socket");
+                if (m_socket->Bind6() == -1)
+                {
+                    NS_FATAL_ERROR("Failed to bind socket");
+                }
             }
-            m_socket->SetIpTos(m_tos); // Affects only IPv4 sockets.
-            m_socket->Connect(m_peerAddress);
-        }
-        else if (Inet6SocketAddress::IsMatchingType(m_peerAddress))
-        {
-            if (m_socket->Bind6() == -1)
+            else
             {
-                NS_FATAL_ERROR("Failed to bind socket");
+                NS_ASSERT_MSG(false, "Incompatible address type: " << m_peer);
             }
-            m_socket->Connect(m_peerAddress);
-        }
-        else
-        {
-            NS_ASSERT_MSG(false, "Incompatible address type: " << m_peerAddress);
         }
+        m_socket->SetIpTos(m_tos); // Affects only IPv4 sockets.
+        m_socket->Connect(m_peer);
+        m_socket->SetRecvCallback(MakeNullCallback<void, Ptr<Socket>>());
+        m_socket->SetAllowBroadcast(true);
     }
 
 #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))
+    if (InetSocketAddress::IsMatchingType(m_peer))
     {
-        peerAddressStringStream << InetSocketAddress::ConvertFrom(m_peerAddress).GetIpv4();
+        peerAddressStringStream << InetSocketAddress::ConvertFrom(m_peer).GetIpv4() << ":"
+                                << InetSocketAddress::ConvertFrom(m_peer).GetPort();
+        ;
     }
-    else if (Inet6SocketAddress::IsMatchingType(m_peerAddress))
+    else if (Inet6SocketAddress::IsMatchingType(m_peer))
     {
-        peerAddressStringStream << Inet6SocketAddress::ConvertFrom(m_peerAddress).GetIpv6();
+        peerAddressStringStream << Inet6SocketAddress::ConvertFrom(m_peer).GetIpv6() << ":"
+                                << Inet6SocketAddress::ConvertFrom(m_peer).GetPort();
     }
-    m_peerAddressString = peerAddressStringStream.str();
+    m_peerString = 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);
+    m_sendEvent = Simulator::Schedule(Seconds(0), &UdpClient::Send, this);
 }
 
 void
@@ -209,7 +249,7 @@
     SeqTsHeader seqTs;
     seqTs.SetSeq(m_sent);
     NS_ABORT_IF(m_size < seqTs.GetSerializedSize());
-    Ptr<Packet> p = Create<Packet>(m_size - seqTs.GetSerializedSize());
+    auto p = Create<Packet>(m_size - seqTs.GetSerializedSize());
 
     // Trace before adding header, for consistency with PacketSink
     m_txTrace(p);
@@ -222,14 +262,14 @@
         ++m_sent;
         m_totalTx += p->GetSize();
 #ifdef NS3_LOG_ENABLE
-        NS_LOG_INFO("TraceDelay TX " << m_size << " bytes to " << m_peerAddressString << " Uid: "
+        NS_LOG_INFO("TraceDelay TX " << m_size << " bytes to " << m_peerString << " 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 " << m_peerAddressString);
+        NS_LOG_INFO("Error while sending " << m_size << " bytes to " << m_peerString);
     }
 #endif // NS3_LOG_ENABLE
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/model/udp-client.h ns-3.44/src/applications/model/udp-client.h
--- ns-3.43/src/applications/model/udp-client.h	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/applications/model/udp-client.h	2025-03-09 16:55:49.347370900 -0700
@@ -11,11 +11,15 @@
 #ifndef UDP_CLIENT_H
 #define UDP_CLIENT_H
 
-#include "ns3/application.h"
+#include "source-application.h"
+
+#include "ns3/deprecated.h"
 #include "ns3/event-id.h"
 #include "ns3/ipv4-address.h"
 #include "ns3/ptr.h"
-#include <ns3/traced-callback.h>
+#include "ns3/traced-callback.h"
+
+#include <optional>
 
 namespace ns3
 {
@@ -24,39 +28,37 @@
 class Packet;
 
 /**
- * \ingroup udpclientserver
+ * @ingroup udpclientserver
  *
- * \brief A Udp client. Sends UDP packet carrying sequence number and time stamp
+ * @brief A Udp client. Sends UDP packet carrying sequence number and time stamp
  *  in their payloads
  *
  */
-class UdpClient : public Application
+class UdpClient : public SourceApplication
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     UdpClient();
-
     ~UdpClient() override;
 
+    static constexpr uint16_t DEFAULT_PORT{100}; //!< default port
+
     /**
-     * \brief set the remote address and port
-     * \param ip remote IP address
-     * \param port remote port
-     */
-    void SetRemote(Address ip, uint16_t port);
-    /**
-     * \brief set the remote address
-     * \param addr remote address
+     * @brief set the remote address and port
+     * @param ip remote IP address
+     * @param port remote port
      */
-    void SetRemote(Address addr);
+    NS_DEPRECATED_3_44("Use SetRemote without port parameter instead")
+    void SetRemote(const Address& ip, uint16_t port);
+    void SetRemote(const Address& addr) override;
 
     /**
-     * \return the total bytes sent by this app
+     * @return the total bytes sent by this app
      */
     uint64_t GetTotalTx() const;
 
@@ -65,10 +67,28 @@
     void StopApplication() override;
 
     /**
-     * \brief Send a packet
+     * @brief Send a packet
      */
     void Send();
 
+    /**
+     * @brief Set the remote port (temporary function until deprecated attributes are removed)
+     * @param port remote port
+     */
+    void SetPort(uint16_t port);
+
+    /**
+     * @brief Get the remote port (temporary function until deprecated attributes are removed)
+     * @return the remote port
+     */
+    uint16_t GetPort() const;
+
+    /**
+     * @brief Get the remote address (temporary function until deprecated attributes are removed)
+     * @return the remote address
+     */
+    Address GetRemote() const;
+
     /// Traced Callback: transmitted packets.
     TracedCallback<Ptr<const Packet>> m_txTrace;
 
@@ -79,17 +99,15 @@
     Time m_interval;  //!< Packet inter-send time
     uint32_t m_size;  //!< Size of the sent packet (including the SeqTsHeader)
 
-    uint32_t m_sent;       //!< Counter for sent packets
-    uint64_t m_totalTx;    //!< Total bytes sent
-    Ptr<Socket> m_socket;  //!< Socket
-    Address m_peerAddress; //!< Remote peer address
-    uint16_t m_peerPort;   //!< Remote peer port
-    uint8_t m_tos;         //!< The packets Type of Service
-    EventId m_sendEvent;   //!< Event to send the next packet
+    uint32_t m_sent;                    //!< Counter for sent packets
+    uint64_t m_totalTx;                 //!< Total bytes sent
+    Ptr<Socket> m_socket;               //!< Socket
+    std::optional<uint16_t> m_peerPort; //!< Remote peer port (deprecated) // NS_DEPRECATED_3_44
+    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
+    std::string m_peerString; //!< Remote peer address string
+#endif                        // NS3_LOG_ENABLE
 };
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/model/udp-echo-client.cc ns-3.44/src/applications/model/udp-echo-client.cc
--- ns-3.43/src/applications/model/udp-echo-client.cc	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/applications/model/udp-echo-client.cc	2025-03-09 16:55:49.347370900 -0700
@@ -5,10 +5,7 @@
  */
 #include "udp-echo-client.h"
 
-#include "ns3/inet-socket-address.h"
-#include "ns3/inet6-socket-address.h"
-#include "ns3/ipv4-address.h"
-#include "ns3/ipv6-address.h"
+#include "ns3/address-utils.h"
 #include "ns3/log.h"
 #include "ns3/nstime.h"
 #include "ns3/packet.h"
@@ -30,7 +27,7 @@
 {
     static TypeId tid =
         TypeId("ns3::UdpEchoClient")
-            .SetParent<Application>()
+            .SetParent<SourceApplication>()
             .SetGroupName("Applications")
             .AddConstructor<UdpEchoClient>()
             .AddAttribute(
@@ -41,25 +38,28 @@
                 MakeUintegerChecker<uint32_t>())
             .AddAttribute("Interval",
                           "The time to wait between packets",
-                          TimeValue(Seconds(1.0)),
+                          TimeValue(Seconds(1)),
                           MakeTimeAccessor(&UdpEchoClient::m_interval),
                           MakeTimeChecker())
-            .AddAttribute("RemoteAddress",
-                          "The destination Address of the outbound packets",
-                          AddressValue(),
-                          MakeAddressAccessor(&UdpEchoClient::m_peerAddress),
-                          MakeAddressChecker())
+            .AddAttribute(
+                "RemoteAddress",
+                "The destination Address of the outbound packets",
+                AddressValue(),
+                MakeAddressAccessor(
+                    (void(UdpEchoClient::*)(const Address&)) &
+                        UdpEchoClient::SetRemote, // this is needed to indicate which version of the
+                                                  // function overload to use
+                    &UdpEchoClient::GetRemote),
+                MakeAddressChecker(),
+                TypeId::SupportLevel::DEPRECATED,
+                "Replaced by Remote in ns-3.44.")
             .AddAttribute("RemotePort",
                           "The destination port of the outbound packets",
-                          UintegerValue(0),
-                          MakeUintegerAccessor(&UdpEchoClient::m_peerPort),
-                          MakeUintegerChecker<uint16_t>())
-            .AddAttribute("Tos",
-                          "The Type of Service used to send IPv4 packets. "
-                          "All 8 bits of the TOS byte are set (including ECN bits).",
-                          UintegerValue(0),
-                          MakeUintegerAccessor(&UdpEchoClient::m_tos),
-                          MakeUintegerChecker<uint8_t>())
+                          UintegerValue(UdpEchoClient::DEFAULT_PORT),
+                          MakeUintegerAccessor(&UdpEchoClient::SetPort, &UdpEchoClient::GetPort),
+                          MakeUintegerChecker<uint16_t>(),
+                          TypeId::SupportLevel::DEPRECATED,
+                          "Replaced by Remote in ns-3.44.")
             .AddAttribute(
                 "PacketSize",
                 "Size of echo data in outbound packets",
@@ -86,13 +86,14 @@
 }
 
 UdpEchoClient::UdpEchoClient()
+    : m_dataSize{0},
+      m_data{nullptr},
+      m_sent{0},
+      m_socket{nullptr},
+      m_peerPort{},
+      m_sendEvent{}
 {
     NS_LOG_FUNCTION(this);
-    m_sent = 0;
-    m_socket = nullptr;
-    m_sendEvent = EventId();
-    m_data = nullptr;
-    m_dataSize = 0;
 }
 
 UdpEchoClient::~UdpEchoClient()
@@ -106,18 +107,65 @@
 }
 
 void
-UdpEchoClient::SetRemote(Address ip, uint16_t port)
+UdpEchoClient::SetRemote(const Address& ip, uint16_t port)
 {
     NS_LOG_FUNCTION(this << ip << port);
-    m_peerAddress = ip;
-    m_peerPort = port;
+    SetRemote(ip);
+    SetPort(port);
 }
 
 void
-UdpEchoClient::SetRemote(Address addr)
+UdpEchoClient::SetRemote(const Address& addr)
 {
     NS_LOG_FUNCTION(this << addr);
-    m_peerAddress = addr;
+    if (!addr.IsInvalid())
+    {
+        m_peer = addr;
+        if (m_peerPort)
+        {
+            SetPort(*m_peerPort);
+        }
+    }
+}
+
+Address
+UdpEchoClient::GetRemote() const
+{
+    return m_peer;
+}
+
+void
+UdpEchoClient::SetPort(uint16_t port)
+{
+    NS_LOG_FUNCTION(this << port);
+    if (m_peer.IsInvalid())
+    {
+        // save for later
+        m_peerPort = port;
+        return;
+    }
+    if (Ipv4Address::IsMatchingType(m_peer) || Ipv6Address::IsMatchingType(m_peer))
+    {
+        m_peer = addressUtils::ConvertToSocketAddress(m_peer, port);
+    }
+}
+
+uint16_t
+UdpEchoClient::GetPort() const
+{
+    if (m_peer.IsInvalid())
+    {
+        return m_peerPort.value_or(UdpEchoClient::DEFAULT_PORT);
+    }
+    if (InetSocketAddress::IsMatchingType(m_peer))
+    {
+        return InetSocketAddress::ConvertFrom(m_peer).GetPort();
+    }
+    else if (Inet6SocketAddress::IsMatchingType(m_peer))
+    {
+        return Inet6SocketAddress::ConvertFrom(m_peer).GetPort();
+    }
+    return UdpEchoClient::DEFAULT_PORT;
 }
 
 void
@@ -127,53 +175,48 @@
 
     if (!m_socket)
     {
-        TypeId tid = TypeId::LookupByName("ns3::UdpSocketFactory");
+        auto tid = TypeId::LookupByName("ns3::UdpSocketFactory");
         m_socket = Socket::CreateSocket(GetNode(), tid);
-        NS_ABORT_MSG_IF(m_peerAddress.IsInvalid(), "'RemoteAddress' attribute not properly set");
-        if (Ipv4Address::IsMatchingType(m_peerAddress))
+        NS_ABORT_MSG_IF(m_peer.IsInvalid(), "Remote address not properly set");
+        if (!m_local.IsInvalid())
         {
-            if (m_socket->Bind() == -1)
+            NS_ABORT_MSG_IF((Inet6SocketAddress::IsMatchingType(m_peer) &&
+                             InetSocketAddress::IsMatchingType(m_local)) ||
+                                (InetSocketAddress::IsMatchingType(m_peer) &&
+                                 Inet6SocketAddress::IsMatchingType(m_local)),
+                            "Incompatible peer and local address IP version");
+            if (m_socket->Bind(m_local) == -1)
             {
                 NS_FATAL_ERROR("Failed to bind socket");
             }
-            m_socket->SetIpTos(m_tos); // Affects only IPv4 sockets.
-            m_socket->Connect(
-                InetSocketAddress(Ipv4Address::ConvertFrom(m_peerAddress), m_peerPort));
         }
-        else if (Ipv6Address::IsMatchingType(m_peerAddress))
+        else
         {
-            if (m_socket->Bind6() == -1)
+            if (InetSocketAddress::IsMatchingType(m_peer))
             {
-                NS_FATAL_ERROR("Failed to bind socket");
+                if (m_socket->Bind() == -1)
+                {
+                    NS_FATAL_ERROR("Failed to bind socket");
+                }
             }
-            m_socket->Connect(
-                Inet6SocketAddress(Ipv6Address::ConvertFrom(m_peerAddress), m_peerPort));
-        }
-        else if (InetSocketAddress::IsMatchingType(m_peerAddress))
-        {
-            if (m_socket->Bind() == -1)
+            else if (Inet6SocketAddress::IsMatchingType(m_peer))
             {
-                NS_FATAL_ERROR("Failed to bind socket");
+                if (m_socket->Bind6() == -1)
+                {
+                    NS_FATAL_ERROR("Failed to bind socket");
+                }
             }
-            m_socket->SetIpTos(m_tos); // Affects only IPv4 sockets.
-            m_socket->Connect(m_peerAddress);
-        }
-        else if (Inet6SocketAddress::IsMatchingType(m_peerAddress))
-        {
-            if (m_socket->Bind6() == -1)
+            else
             {
-                NS_FATAL_ERROR("Failed to bind socket");
+                NS_ASSERT_MSG(false, "Incompatible address type: " << m_peer);
             }
-            m_socket->Connect(m_peerAddress);
-        }
-        else
-        {
-            NS_ASSERT_MSG(false, "Incompatible address type: " << m_peerAddress);
         }
+        m_socket->SetIpTos(m_tos); // Affects only IPv4 sockets.
+        m_socket->Connect(m_peer);
+        m_socket->SetRecvCallback(MakeCallback(&UdpEchoClient::HandleRead, this));
+        m_socket->SetAllowBroadcast(true);
     }
 
-    m_socket->SetRecvCallback(MakeCallback(&UdpEchoClient::HandleRead, this));
-    m_socket->SetAllowBroadcast(true);
     ScheduleTransmit(Seconds(0.));
 }
 
@@ -339,48 +382,21 @@
     // call to the trace sinks before the packet is actually sent,
     // so that tags added to the packet can be sent as well
     m_txTrace(p);
-    if (Ipv4Address::IsMatchingType(m_peerAddress))
-    {
-        m_txTraceWithAddresses(
-            p,
-            localAddress,
-            InetSocketAddress(Ipv4Address::ConvertFrom(m_peerAddress), m_peerPort));
-    }
-    else if (Ipv6Address::IsMatchingType(m_peerAddress))
-    {
-        m_txTraceWithAddresses(
-            p,
-            localAddress,
-            Inet6SocketAddress(Ipv6Address::ConvertFrom(m_peerAddress), m_peerPort));
-    }
+    m_txTraceWithAddresses(p, localAddress, m_peer);
     m_socket->Send(p);
     ++m_sent;
 
-    if (Ipv4Address::IsMatchingType(m_peerAddress))
+    if (InetSocketAddress::IsMatchingType(m_peer))
     {
         NS_LOG_INFO("At time " << Simulator::Now().As(Time::S) << " client sent " << m_size
-                               << " bytes to " << Ipv4Address::ConvertFrom(m_peerAddress)
-                               << " port " << m_peerPort);
+                               << " bytes to " << InetSocketAddress::ConvertFrom(m_peer).GetIpv4()
+                               << " port " << InetSocketAddress::ConvertFrom(m_peer).GetPort());
     }
-    else if (Ipv6Address::IsMatchingType(m_peerAddress))
+    else if (Inet6SocketAddress::IsMatchingType(m_peer))
     {
         NS_LOG_INFO("At time " << Simulator::Now().As(Time::S) << " client sent " << m_size
-                               << " bytes to " << Ipv6Address::ConvertFrom(m_peerAddress)
-                               << " port " << m_peerPort);
-    }
-    else if (InetSocketAddress::IsMatchingType(m_peerAddress))
-    {
-        NS_LOG_INFO(
-            "At time " << Simulator::Now().As(Time::S) << " client sent " << m_size << " bytes to "
-                       << InetSocketAddress::ConvertFrom(m_peerAddress).GetIpv4() << " port "
-                       << InetSocketAddress::ConvertFrom(m_peerAddress).GetPort());
-    }
-    else if (Inet6SocketAddress::IsMatchingType(m_peerAddress))
-    {
-        NS_LOG_INFO(
-            "At time " << Simulator::Now().As(Time::S) << " client sent " << m_size << " bytes to "
-                       << Inet6SocketAddress::ConvertFrom(m_peerAddress).GetIpv6() << " port "
-                       << Inet6SocketAddress::ConvertFrom(m_peerAddress).GetPort());
+                               << " bytes to " << Inet6SocketAddress::ConvertFrom(m_peer).GetIpv6()
+                               << " port " << Inet6SocketAddress::ConvertFrom(m_peer).GetPort());
     }
 
     if (m_sent < m_count || m_count == 0)
@@ -393,10 +409,8 @@
 UdpEchoClient::HandleRead(Ptr<Socket> socket)
 {
     NS_LOG_FUNCTION(this << socket);
-    Ptr<Packet> packet;
     Address from;
-    Address localAddress;
-    while ((packet = socket->RecvFrom(from)))
+    while (auto packet = socket->RecvFrom(from))
     {
         if (InetSocketAddress::IsMatchingType(from))
         {
@@ -412,6 +426,7 @@
                                    << Inet6SocketAddress::ConvertFrom(from).GetIpv6() << " port "
                                    << Inet6SocketAddress::ConvertFrom(from).GetPort());
         }
+        Address localAddress;
         socket->GetSockName(localAddress);
         m_rxTrace(packet);
         m_rxTraceWithAddresses(packet, from, localAddress);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/model/udp-echo-client.h ns-3.44/src/applications/model/udp-echo-client.h
--- ns-3.43/src/applications/model/udp-echo-client.h	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/applications/model/udp-echo-client.h	2025-03-09 16:55:49.347370900 -0700
@@ -7,12 +7,16 @@
 #ifndef UDP_ECHO_CLIENT_H
 #define UDP_ECHO_CLIENT_H
 
-#include "ns3/application.h"
+#include "source-application.h"
+
+#include "ns3/deprecated.h"
 #include "ns3/event-id.h"
 #include "ns3/ipv4-address.h"
 #include "ns3/ptr.h"
 #include "ns3/traced-callback.h"
 
+#include <optional>
+
 namespace ns3
 {
 
@@ -20,58 +24,56 @@
 class Packet;
 
 /**
- * \ingroup udpecho
- * \brief A Udp Echo client
+ * @ingroup udpecho
+ * @brief A Udp Echo client
  *
  * Every packet sent should be returned by the server and received here.
  */
-class UdpEchoClient : public Application
+class UdpEchoClient : public SourceApplication
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     UdpEchoClient();
-
     ~UdpEchoClient() override;
 
+    static constexpr uint16_t DEFAULT_PORT{0}; //!< default port
+
     /**
-     * \brief set the remote address and port
-     * \param ip remote IP address
-     * \param port remote port
-     */
-    void SetRemote(Address ip, uint16_t port);
-    /**
-     * \brief set the remote address
-     * \param addr remote address
+     * @brief set the remote address and port
+     * @param ip remote IP address
+     * @param port remote port
      */
-    void SetRemote(Address addr);
+    NS_DEPRECATED_3_44("Use SetRemote without port parameter instead")
+    void SetRemote(const Address& ip, uint16_t port);
+    void SetRemote(const Address& addr) override;
 
     /**
      * Set the data size of the packet (the number of bytes that are sent as data
      * to the server).  The contents of the data are set to unspecified (don't
      * care) by this call.
      *
-     * \warning If you have set the fill data for the echo client using one of the
+     * @warning If you have set the fill data for the echo client using one of the
      * SetFill calls, this will undo those effects.
      *
-     * \param dataSize The size of the echo data you want to sent.
+     * @param dataSize The size of the echo data you want to sent.
      */
     void SetDataSize(uint32_t dataSize);
 
     /**
      * Get the number of data bytes that will be sent to the server.
      *
-     * \warning The number of bytes may be modified by calling any one of the
+     * @warning The number of bytes may be modified by calling any one of the
      * SetFill methods.  If you have called SetFill, then the number of
      * data bytes will correspond to the size of an initialized data buffer.
      * If you have not called a SetFill method, the number of data bytes will
      * correspond to the number of don't care bytes that will be sent.
      *
-     * \returns The number of data bytes.
+     * @returns The number of data bytes.
      */
     uint32_t GetDataSize() const;
 
@@ -79,11 +81,11 @@
      * Set the data fill of the packet (what is sent as data to the server) to
      * the zero-terminated contents of the fill string string.
      *
-     * \warning The size of resulting echo packets will be automatically adjusted
+     * @warning The size of resulting echo packets will be automatically adjusted
      * to reflect the size of the fill string -- this means that the PacketSize
      * attribute may be changed as a result of this call.
      *
-     * \param fill The string to use as the actual echo data bytes.
+     * @param fill The string to use as the actual echo data bytes.
      */
     void SetFill(std::string fill);
 
@@ -92,12 +94,12 @@
      * the repeated contents of the fill byte.  i.e., the fill byte will be
      * used to initialize the contents of the data packet.
      *
-     * \warning The size of resulting echo packets will be automatically adjusted
+     * @warning The size of resulting echo packets will be automatically adjusted
      * to reflect the dataSize parameter -- this means that the PacketSize
      * attribute may be changed as a result of this call.
      *
-     * \param fill The byte to be repeated in constructing the packet data..
-     * \param dataSize The desired size of the resulting echo packet data.
+     * @param fill The byte to be repeated in constructing the packet data..
+     * @param dataSize The desired size of the resulting echo packet data.
      */
     void SetFill(uint8_t fill, uint32_t dataSize);
 
@@ -109,13 +111,13 @@
      * accomplished by setting the fillSize set to your desired dataSize
      * (and providing an appropriate buffer).
      *
-     * \warning The size of resulting echo packets will be automatically adjusted
+     * @warning The size of resulting echo packets will be automatically adjusted
      * to reflect the dataSize parameter -- this means that the PacketSize
      * attribute of the Application may be changed as a result of this call.
      *
-     * \param fill The fill pattern to use when constructing packets.
-     * \param fillSize The number of bytes in the provided fill pattern.
-     * \param dataSize The desired size of the final echo data.
+     * @param fill The fill pattern to use when constructing packets.
+     * @param fillSize The number of bytes in the provided fill pattern.
+     * @param dataSize The desired size of the final echo data.
      */
     void SetFill(uint8_t* fill, uint32_t fillSize, uint32_t dataSize);
 
@@ -124,21 +126,39 @@
     void StopApplication() override;
 
     /**
-     * \brief Schedule the next packet transmission
-     * \param dt time interval between packets.
+     * @brief Set the remote port (temporary function until deprecated attributes are removed)
+     * @param port remote port
+     */
+    void SetPort(uint16_t port);
+
+    /**
+     * @brief Get the remote port (temporary function until deprecated attributes are removed)
+     * @return the remote port
+     */
+    uint16_t GetPort() const;
+
+    /**
+     * @brief Get the remote address (temporary function until deprecated attributes are removed)
+     * @return the remote address
+     */
+    Address GetRemote() const;
+
+    /**
+     * @brief Schedule the next packet transmission
+     * @param dt time interval between packets.
      */
     void ScheduleTransmit(Time dt);
     /**
-     * \brief Send a packet
+     * @brief Send a packet
      */
     void Send();
 
     /**
-     * \brief Handle a packet reception.
+     * @brief Handle a packet reception.
      *
      * This function is called by lower layers.
      *
-     * \param socket the socket the packet was received to.
+     * @param socket the socket the packet was received to.
      */
     void HandleRead(Ptr<Socket> socket);
 
@@ -149,12 +169,10 @@
     uint32_t m_dataSize; //!< packet payload size (must be equal to m_size)
     uint8_t* m_data;     //!< packet payload data
 
-    uint32_t m_sent;       //!< Counter for sent packets
-    Ptr<Socket> m_socket;  //!< Socket
-    Address m_peerAddress; //!< Remote peer address
-    uint16_t m_peerPort;   //!< Remote peer port
-    uint8_t m_tos;         //!< The packets Type of Service
-    EventId m_sendEvent;   //!< Event to send the next packet
+    uint32_t m_sent;                    //!< Counter for sent packets
+    Ptr<Socket> m_socket;               //!< Socket
+    std::optional<uint16_t> m_peerPort; //!< Remote peer port (deprecated) // NS_DEPRECATED_3_44
+    EventId m_sendEvent;                //!< Event to send the next packet
 
     /// Callbacks for tracing the packet Tx events
     TracedCallback<Ptr<const Packet>> m_txTrace;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/model/udp-echo-server.cc ns-3.44/src/applications/model/udp-echo-server.cc
--- ns-3.43/src/applications/model/udp-echo-server.cc	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/applications/model/udp-echo-server.cc	2025-03-09 16:55:49.347370900 -0700
@@ -32,14 +32,9 @@
 {
     static TypeId tid =
         TypeId("ns3::UdpEchoServer")
-            .SetParent<Application>()
+            .SetParent<SinkApplication>()
             .SetGroupName("Applications")
             .AddConstructor<UdpEchoServer>()
-            .AddAttribute("Port",
-                          "Port on which we listen for incoming packets.",
-                          UintegerValue(9),
-                          MakeUintegerAccessor(&UdpEchoServer::m_port),
-                          MakeUintegerChecker<uint16_t>())
             .AddAttribute("Tos",
                           "The Type of Service used to send IPv4 packets. "
                           "All 8 bits of the TOS byte are set (including ECN bits).",
@@ -58,6 +53,9 @@
 }
 
 UdpEchoServer::UdpEchoServer()
+    : SinkApplication(DEFAULT_PORT),
+      m_socket{nullptr},
+      m_socket6{nullptr}
 {
     NS_LOG_FUNCTION(this);
 }
@@ -76,9 +74,13 @@
 
     if (!m_socket)
     {
-        TypeId tid = TypeId::LookupByName("ns3::UdpSocketFactory");
+        auto tid = TypeId::LookupByName("ns3::UdpSocketFactory");
         m_socket = Socket::CreateSocket(GetNode(), tid);
-        InetSocketAddress local = InetSocketAddress(Ipv4Address::GetAny(), m_port);
+        auto local = m_local;
+        if (local.IsInvalid())
+        {
+            local = InetSocketAddress(Ipv4Address::GetAny(), m_port);
+        }
         if (m_socket->Bind(local) == -1)
         {
             NS_FATAL_ERROR("Failed to bind socket");
@@ -96,35 +98,36 @@
                 NS_FATAL_ERROR("Error: Failed to join multicast group");
             }
         }
+        m_socket->SetIpTos(m_tos); // Affects only IPv4 sockets.
+        m_socket->SetRecvCallback(MakeCallback(&UdpEchoServer::HandleRead, this));
     }
 
-    if (!m_socket6)
+    if (m_local.IsInvalid() && !m_socket6)
     {
-        TypeId tid = TypeId::LookupByName("ns3::UdpSocketFactory");
+        // local address is not specified, so create another socket to also listen to all IPv6
+        // addresses
+        auto tid = TypeId::LookupByName("ns3::UdpSocketFactory");
         m_socket6 = Socket::CreateSocket(GetNode(), tid);
-        Inet6SocketAddress local6 = Inet6SocketAddress(Ipv6Address::GetAny(), m_port);
-        if (m_socket6->Bind(local6) == -1)
+        auto local = Inet6SocketAddress(Ipv6Address::GetAny(), m_port);
+        if (m_socket6->Bind(local) == -1)
         {
             NS_FATAL_ERROR("Failed to bind socket");
         }
-        if (addressUtils::IsMulticast(local6))
+        if (addressUtils::IsMulticast(local))
         {
             Ptr<UdpSocket> udpSocket = DynamicCast<UdpSocket>(m_socket6);
             if (udpSocket)
             {
                 // equivalent to setsockopt (MCAST_JOIN_GROUP)
-                udpSocket->MulticastJoinGroup(0, local6);
+                udpSocket->MulticastJoinGroup(0, local);
             }
             else
             {
                 NS_FATAL_ERROR("Error: Failed to join multicast group");
             }
         }
+        m_socket6->SetRecvCallback(MakeCallback(&UdpEchoServer::HandleRead, this));
     }
-
-    m_socket->SetIpTos(m_tos); // Affects only IPv4 sockets.
-    m_socket->SetRecvCallback(MakeCallback(&UdpEchoServer::HandleRead, this));
-    m_socket6->SetRecvCallback(MakeCallback(&UdpEchoServer::HandleRead, this));
 }
 
 void
@@ -149,11 +152,10 @@
 {
     NS_LOG_FUNCTION(this << socket);
 
-    Ptr<Packet> packet;
     Address from;
-    Address localAddress;
-    while ((packet = socket->RecvFrom(from)))
+    while (auto packet = socket->RecvFrom(from))
     {
+        Address localAddress;
         socket->GetSockName(localAddress);
         m_rxTrace(packet);
         m_rxTraceWithAddresses(packet, from, localAddress);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/model/udp-echo-server.h ns-3.44/src/applications/model/udp-echo-server.h
--- ns-3.43/src/applications/model/udp-echo-server.h	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/applications/model/udp-echo-server.h	2025-03-09 16:55:49.347370900 -0700
@@ -7,8 +7,8 @@
 #ifndef UDP_ECHO_SERVER_H
 #define UDP_ECHO_SERVER_H
 
-#include "ns3/address.h"
-#include "ns3/application.h"
+#include "sink-application.h"
+
 #include "ns3/event-id.h"
 #include "ns3/ptr.h"
 #include "ns3/traced-callback.h"
@@ -20,24 +20,27 @@
 class Packet;
 
 /**
- * \ingroup applications
- * \defgroup udpecho UdpEcho
+ * @ingroup applications
+ * @defgroup udpecho UdpEcho
  */
 
 /**
- * \ingroup udpecho
- * \brief A Udp Echo server
+ * @ingroup udpecho
+ * @brief A Udp Echo server
  *
  * Every packet received is sent back.
  */
-class UdpEchoServer : public Application
+class UdpEchoServer : public SinkApplication
 {
   public:
+    static constexpr uint16_t DEFAULT_PORT{9}; //!< default port
+
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
+
     UdpEchoServer();
     ~UdpEchoServer() override;
 
@@ -46,19 +49,17 @@
     void StopApplication() override;
 
     /**
-     * \brief Handle a packet reception.
+     * @brief Handle a packet reception.
      *
      * This function is called by lower layers.
      *
-     * \param socket the socket the packet was received to.
+     * @param socket the socket the packet was received to.
      */
     void HandleRead(Ptr<Socket> socket);
 
-    uint16_t m_port;       //!< Port on which we listen for incoming packets.
     uint8_t m_tos;         //!< The packets Type of Service
-    Ptr<Socket> m_socket;  //!< IPv4 Socket
-    Ptr<Socket> m_socket6; //!< IPv6 Socket
-    Address m_local;       //!< local multicast address
+    Ptr<Socket> m_socket;  //!< Socket
+    Ptr<Socket> m_socket6; //!< IPv6 Socket (used if only port is specified)
 
     /// Callbacks for tracing the packet Rx events
     TracedCallback<Ptr<const Packet>> m_rxTrace;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/model/udp-server.cc ns-3.44/src/applications/model/udp-server.cc
--- ns-3.43/src/applications/model/udp-server.cc	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/applications/model/udp-server.cc	2025-03-09 16:55:49.347370900 -0700
@@ -35,20 +35,9 @@
 {
     static TypeId tid =
         TypeId("ns3::UdpServer")
-            .SetParent<Application>()
+            .SetParent<SinkApplication>()
             .SetGroupName("Applications")
             .AddConstructor<UdpServer>()
-            .AddAttribute("Port",
-                          "Port on which we listen for incoming packets.",
-                          UintegerValue(100),
-                          MakeUintegerAccessor(&UdpServer::m_port),
-                          MakeUintegerChecker<uint16_t>())
-            .AddAttribute("Tos",
-                          "The Type of Service used to send IPv4 packets. "
-                          "All 8 bits of the TOS byte are set (including ECN bits).",
-                          UintegerValue(0),
-                          MakeUintegerAccessor(&UdpServer::m_tos),
-                          MakeUintegerChecker<uint8_t>())
             .AddAttribute("PacketWindowSize",
                           "The size of the window used to compute the packet loss. This value "
                           "should be a multiple of 8.",
@@ -68,8 +57,11 @@
 }
 
 UdpServer::UdpServer()
-    : m_received(0),
-      m_lossCounter(0)
+    : SinkApplication(DEFAULT_PORT),
+      m_socket{nullptr},
+      m_socket6{nullptr},
+      m_received{0},
+      m_lossCounter{0}
 {
     NS_LOG_FUNCTION(this);
 }
@@ -114,30 +106,49 @@
 
     if (!m_socket)
     {
-        TypeId tid = TypeId::LookupByName("ns3::UdpSocketFactory");
+        auto tid = TypeId::LookupByName("ns3::UdpSocketFactory");
         m_socket = Socket::CreateSocket(GetNode(), tid);
-        InetSocketAddress local = InetSocketAddress(Ipv4Address::GetAny(), m_port);
+        auto local = m_local;
+        if (local.IsInvalid())
+        {
+            local = InetSocketAddress(Ipv4Address::GetAny(), m_port);
+            NS_LOG_INFO(this << " Binding on port " << m_port << " / " << local << ".");
+        }
+        else
+        {
+            if (InetSocketAddress::IsMatchingType(m_local))
+            {
+                const auto ipv4 = InetSocketAddress::ConvertFrom(m_local).GetIpv4();
+                NS_LOG_INFO(this << " Binding on " << ipv4 << " port " << m_port << " / " << m_local
+                                 << ".");
+            }
+            else if (Ipv6Address::IsMatchingType(m_local))
+            {
+                const auto ipv6 = Inet6SocketAddress::ConvertFrom(m_local).GetIpv6();
+                NS_LOG_INFO(this << " Binding on " << ipv6 << " port " << m_port << " / " << m_local
+                                 << ".");
+            }
+        }
         if (m_socket->Bind(local) == -1)
         {
             NS_FATAL_ERROR("Failed to bind socket");
         }
+        m_socket->SetRecvCallback(MakeCallback(&UdpServer::HandleRead, this));
     }
 
-    m_socket->SetIpTos(m_tos); // Affects only IPv4 sockets.
-    m_socket->SetRecvCallback(MakeCallback(&UdpServer::HandleRead, this));
-
-    if (!m_socket6)
+    if (m_local.IsInvalid() && !m_socket6)
     {
-        TypeId tid = TypeId::LookupByName("ns3::UdpSocketFactory");
+        // local address is not specified, so create another socket to also listen to all IPv6
+        // addresses
+        auto tid = TypeId::LookupByName("ns3::UdpSocketFactory");
         m_socket6 = Socket::CreateSocket(GetNode(), tid);
-        Inet6SocketAddress local = Inet6SocketAddress(Ipv6Address::GetAny(), m_port);
+        auto local = Inet6SocketAddress(Ipv6Address::GetAny(), m_port);
         if (m_socket6->Bind(local) == -1)
         {
             NS_FATAL_ERROR("Failed to bind socket");
         }
+        m_socket6->SetRecvCallback(MakeCallback(&UdpServer::HandleRead, this));
     }
-
-    m_socket6->SetRecvCallback(MakeCallback(&UdpServer::HandleRead, this));
 }
 
 void
@@ -149,26 +160,29 @@
     {
         m_socket->SetRecvCallback(MakeNullCallback<void, Ptr<Socket>>());
     }
+    if (m_socket6)
+    {
+        m_socket6->SetRecvCallback(MakeNullCallback<void, Ptr<Socket>>());
+    }
 }
 
 void
 UdpServer::HandleRead(Ptr<Socket> socket)
 {
     NS_LOG_FUNCTION(this << socket);
-    Ptr<Packet> packet;
     Address from;
-    Address localAddress;
-    while ((packet = socket->RecvFrom(from)))
+    while (auto packet = socket->RecvFrom(from))
     {
+        Address localAddress;
         socket->GetSockName(localAddress);
         m_rxTrace(packet);
         m_rxTraceWithAddresses(packet, from, localAddress);
         if (packet->GetSize() > 0)
         {
-            uint32_t receivedSize = packet->GetSize();
+            const auto receivedSize = packet->GetSize();
             SeqTsHeader seqTs;
             packet->RemoveHeader(seqTs);
-            uint32_t currentSequenceNumber = seqTs.GetSeq();
+            const auto currentSequenceNumber = seqTs.GetSeq();
             if (InetSocketAddress::IsMatchingType(from))
             {
                 NS_LOG_INFO("TraceDelay: RX " << receivedSize << " bytes from "
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/model/udp-server.h ns-3.44/src/applications/model/udp-server.h
--- ns-3.43/src/applications/model/udp-server.h	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/applications/model/udp-server.h	2025-03-09 16:55:49.347370900 -0700
@@ -12,9 +12,8 @@
 #define UDP_SERVER_H
 
 #include "packet-loss-counter.h"
+#include "sink-application.h"
 
-#include "ns3/address.h"
-#include "ns3/application.h"
 #include "ns3/event-id.h"
 #include "ns3/ptr.h"
 #include "ns3/traced-callback.h"
@@ -22,51 +21,55 @@
 namespace ns3
 {
 /**
- * \ingroup applications
- * \defgroup udpclientserver UdpClientServer
+ * @ingroup applications
+ * @defgroup udpclientserver UdpClientServer
  */
 
 /**
- * \ingroup udpclientserver
+ * @ingroup udpclientserver
  *
- * \brief A UDP server, receives UDP packets from a remote host.
+ * @brief A UDP server, receives UDP packets from a remote host.
  *
  * UDP packets carry a 32bits sequence number followed by a 64bits time
  * stamp in their payloads. The application uses the sequence number
  * to determine if a packet is lost, and the time stamp to compute the delay.
  */
-class UdpServer : public Application
+class UdpServer : public SinkApplication
 {
   public:
+    static constexpr uint16_t DEFAULT_PORT{100}; //!< default port
+
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
+
     UdpServer();
     ~UdpServer() override;
+
     /**
-     * \brief Returns the number of lost packets
-     * \return the number of lost packets
+     * @brief Returns the number of lost packets
+     * @return the number of lost packets
      */
     uint32_t GetLost() const;
 
     /**
-     * \brief Returns the number of received packets
-     * \return the number of received packets
+     * @brief Returns the number of received packets
+     * @return the number of received packets
      */
     uint64_t GetReceived() const;
 
     /**
-     * \brief Returns the size of the window used for checking loss.
-     * \return the size of the window used for checking loss.
+     * @brief Returns the size of the window used for checking loss.
+     * @return the size of the window used for checking loss.
      */
     uint16_t GetPacketWindowSize() const;
 
     /**
-     * \brief Set the size of the window used for checking loss. This value should
+     * @brief Set the size of the window used for checking loss. This value should
      *  be a multiple of 8
-     * \param size the size of the window used for checking loss. This value should
+     * @param size the size of the window used for checking loss. This value should
      *  be a multiple of 8
      */
     void SetPacketWindowSize(uint16_t size);
@@ -76,18 +79,16 @@
     void StopApplication() override;
 
     /**
-     * \brief Handle a packet reception.
+     * @brief Handle a packet reception.
      *
      * This function is called by lower layers.
      *
-     * \param socket the socket the packet was received to.
+     * @param socket the socket the packet was received to.
      */
     void HandleRead(Ptr<Socket> socket);
 
-    uint16_t m_port;                 //!< Port on which we listen for incoming packets.
-    uint8_t m_tos;                   //!< The packets Type of Service
-    Ptr<Socket> m_socket;            //!< IPv4 Socket
-    Ptr<Socket> m_socket6;           //!< IPv6 Socket
+    Ptr<Socket> m_socket;            //!< Socket
+    Ptr<Socket> m_socket6;           //!< IPv6 Socket (used if only port is specified)
     uint64_t m_received;             //!< Number of received packets
     PacketLossCounter m_lossCounter; //!< Lost packet counter
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/model/udp-trace-client.cc ns-3.44/src/applications/model/udp-trace-client.cc
--- ns-3.43/src/applications/model/udp-trace-client.cc	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/applications/model/udp-trace-client.cc	2025-03-09 16:55:49.347370900 -0700
@@ -10,10 +10,8 @@
 
 #include "seq-ts-header.h"
 
+#include "ns3/address-utils.h"
 #include "ns3/boolean.h"
-#include "ns3/inet-socket-address.h"
-#include "ns3/inet6-socket-address.h"
-#include "ns3/ipv4-address.h"
 #include "ns3/log.h"
 #include "ns3/nstime.h"
 #include "ns3/packet.h"
@@ -35,7 +33,7 @@
 NS_OBJECT_ENSURE_REGISTERED(UdpTraceClient);
 
 /**
- * \brief Default trace to send
+ * @brief Default trace to send
  */
 UdpTraceClient::TraceEntry UdpTraceClient::g_defaultEntries[] = {
     {0, 534, 'I'},
@@ -55,25 +53,31 @@
 {
     static TypeId tid =
         TypeId("ns3::UdpTraceClient")
-            .SetParent<Application>()
+            .SetParent<SourceApplication>()
             .SetGroupName("Applications")
             .AddConstructor<UdpTraceClient>()
             .AddAttribute("RemoteAddress",
                           "The destination Address of the outbound packets",
                           AddressValue(),
-                          MakeAddressAccessor(&UdpTraceClient::m_peerAddress),
-                          MakeAddressChecker())
-            .AddAttribute("RemotePort",
-                          "The destination port of the outbound packets",
-                          UintegerValue(100),
-                          MakeUintegerAccessor(&UdpTraceClient::m_peerPort),
-                          MakeUintegerChecker<uint16_t>())
-            .AddAttribute("Tos",
-                          "The Type of Service used to send IPv4 packets. "
-                          "All 8 bits of the TOS byte are set (including ECN bits).",
-                          UintegerValue(0),
-                          MakeUintegerAccessor(&UdpTraceClient::m_tos),
-                          MakeUintegerChecker<uint8_t>())
+                          MakeAddressAccessor(
+                              (void(UdpTraceClient::*)(const Address&)) &
+                              UdpTraceClient::SetRemote), // this is needed to indicate which
+                                                          // version of the function overload to use
+                          MakeAddressChecker(),
+                          TypeId::SupportLevel::DEPRECATED,
+                          "Replaced by Remote in ns-3.44.")
+            .AddAttribute(
+                "RemotePort",
+                "The destination port of the outbound packets",
+                UintegerValue(UdpTraceClient::DEFAULT_PORT),
+                MakeAddressAccessor(
+                    (void(UdpTraceClient::*)(const Address&)) &
+                        UdpTraceClient::SetRemote, // this is needed to indicate which version of
+                                                   // the function overload to use
+                    &UdpTraceClient::GetRemote),
+                MakeUintegerChecker<uint16_t>(),
+                TypeId::SupportLevel::DEPRECATED,
+                "Replaced by Remote in ns-3.44.")
             .AddAttribute("MaxPacketSize",
                           "The maximum size of a packet (including the SeqTsHeader, 12 bytes).",
                           UintegerValue(1024),
@@ -95,67 +99,91 @@
 }
 
 UdpTraceClient::UdpTraceClient()
+    : m_sent{0},
+      m_socket{nullptr},
+      m_peerPort{},
+      m_sendEvent{},
+      m_currentEntry{0}
 {
     NS_LOG_FUNCTION(this);
-    m_sent = 0;
-    m_socket = nullptr;
-    m_sendEvent = EventId();
-    m_maxPacketSize = 1400;
-}
-
-UdpTraceClient::UdpTraceClient(Ipv4Address ip, uint16_t port, char* traceFile)
-{
-    NS_LOG_FUNCTION(this);
-    m_sent = 0;
-    m_socket = nullptr;
-    m_sendEvent = EventId();
-    m_peerAddress = ip;
-    m_peerPort = port;
-    m_currentEntry = 0;
-    m_maxPacketSize = 1400;
-    if (traceFile != nullptr)
-    {
-        SetTraceFile(traceFile);
-    }
 }
 
 UdpTraceClient::~UdpTraceClient()
 {
     NS_LOG_FUNCTION(this);
-    m_entries.clear();
 }
 
 void
-UdpTraceClient::SetRemote(Address ip, uint16_t port)
+UdpTraceClient::SetRemote(const Address& ip, uint16_t port)
 {
     NS_LOG_FUNCTION(this << ip << port);
-    m_entries.clear();
-    m_peerAddress = ip;
-    m_peerPort = port;
+    SetRemote(ip);
+    SetPort(port);
 }
 
 void
-UdpTraceClient::SetRemote(Address addr)
+UdpTraceClient::SetRemote(const Address& addr)
 {
     NS_LOG_FUNCTION(this << addr);
-    m_entries.clear();
-    m_peerAddress = addr;
+    if (!addr.IsInvalid())
+    {
+        m_peer = addr;
+        if (m_peerPort)
+        {
+            SetPort(*m_peerPort);
+        }
+        LoadTrace();
+    }
+}
+
+Address
+UdpTraceClient::GetRemote() const
+{
+    return m_peer;
 }
 
 void
-UdpTraceClient::SetTraceFile(std::string traceFile)
+UdpTraceClient::SetPort(uint16_t port)
 {
-    NS_LOG_FUNCTION(this << traceFile);
-    if (traceFile.empty())
+    NS_LOG_FUNCTION(this << port);
+    if (m_peer.IsInvalid())
     {
-        LoadDefaultTrace();
+        // save for later
+        m_peerPort = port;
+        return;
     }
-    else
+    if (Ipv4Address::IsMatchingType(m_peer) || Ipv6Address::IsMatchingType(m_peer))
     {
-        LoadTrace(traceFile);
+        m_peer = addressUtils::ConvertToSocketAddress(m_peer, port);
     }
 }
 
+uint16_t
+UdpTraceClient::GetPort() const
+{
+    if (m_peer.IsInvalid())
+    {
+        return m_peerPort.value_or(UdpTraceClient::DEFAULT_PORT);
+    }
+    if (InetSocketAddress::IsMatchingType(m_peer))
+    {
+        return InetSocketAddress::ConvertFrom(m_peer).GetPort();
+    }
+    else if (Inet6SocketAddress::IsMatchingType(m_peer))
+    {
+        return Inet6SocketAddress::ConvertFrom(m_peer).GetPort();
+    }
+    return UdpTraceClient::DEFAULT_PORT;
+}
+
+void
+UdpTraceClient::SetTraceFile(const std::string& traceFile)
+{
+    NS_LOG_FUNCTION(this << traceFile);
+    m_traceFile = traceFile;
+    LoadTrace();
+}
+
 void
 UdpTraceClient::SetMaxPacketSize(uint16_t maxPacketSize)
 {
@@ -171,30 +199,42 @@
 }
 
 void
-UdpTraceClient::LoadTrace(std::string filename)
+UdpTraceClient::LoadTrace()
 {
-    NS_LOG_FUNCTION(this << filename);
-    uint32_t time = 0;
-    uint32_t index = 0;
-    uint32_t oldIndex = 0;
-    uint32_t size = 0;
-    uint32_t prevTime = 0;
-    char frameType;
-    TraceEntry entry;
-    std::ifstream ifTraceFile;
-    ifTraceFile.open(filename, std::ifstream::in);
+    NS_LOG_FUNCTION(this);
     m_entries.clear();
+    m_currentEntry = 0;
+
+    if (m_traceFile.empty())
+    {
+        LoadDefaultTrace();
+        return;
+    }
+
+    std::ifstream ifTraceFile;
+    ifTraceFile.open(m_traceFile, std::ifstream::in);
     if (!ifTraceFile.good())
     {
         LoadDefaultTrace();
+        return;
     }
+
+    uint32_t oldIndex = 0;
+    uint32_t prevTime = 0;
     while (ifTraceFile.good())
     {
+        uint32_t index = 0;
+        char frameType;
+        uint32_t time = 0;
+        uint32_t size = 0;
         ifTraceFile >> index >> frameType >> time >> size;
+
         if (index == oldIndex)
         {
             continue;
         }
+
+        TraceEntry entry{};
         if (frameType == 'B')
         {
             entry.timeToSend = 0;
@@ -209,9 +249,9 @@
         m_entries.push_back(entry);
         oldIndex = index;
     }
+
     ifTraceFile.close();
     NS_ASSERT_MSG(prevTime != 0, "A trace file can not contain B frames only.");
-    m_currentEntry = 0;
 }
 
 void
@@ -234,7 +274,6 @@
         }
         m_entries.push_back(entry);
     }
-    m_currentEntry = 0;
 }
 
 void
@@ -244,53 +283,48 @@
 
     if (!m_socket)
     {
-        TypeId tid = TypeId::LookupByName("ns3::UdpSocketFactory");
+        auto tid = TypeId::LookupByName("ns3::UdpSocketFactory");
         m_socket = Socket::CreateSocket(GetNode(), tid);
-        NS_ABORT_MSG_IF(m_peerAddress.IsInvalid(), "'RemoteAddress' attribute not properly set");
-        if (Ipv4Address::IsMatchingType(m_peerAddress))
+        NS_ABORT_MSG_IF(m_peer.IsInvalid(), "Remote address not properly set");
+        if (!m_local.IsInvalid())
         {
-            if (m_socket->Bind() == -1)
+            NS_ABORT_MSG_IF((Inet6SocketAddress::IsMatchingType(m_peer) &&
+                             InetSocketAddress::IsMatchingType(m_local)) ||
+                                (InetSocketAddress::IsMatchingType(m_peer) &&
+                                 Inet6SocketAddress::IsMatchingType(m_local)),
+                            "Incompatible peer and local address IP version");
+            if (m_socket->Bind(m_local) == -1)
             {
                 NS_FATAL_ERROR("Failed to bind socket");
             }
-            m_socket->SetIpTos(m_tos); // Affects only IPv4 sockets.
-            m_socket->Connect(
-                InetSocketAddress(Ipv4Address::ConvertFrom(m_peerAddress), m_peerPort));
         }
-        else if (Ipv6Address::IsMatchingType(m_peerAddress))
+        else
         {
-            if (m_socket->Bind6() == -1)
+            if (InetSocketAddress::IsMatchingType(m_peer))
             {
-                NS_FATAL_ERROR("Failed to bind socket");
+                if (m_socket->Bind() == -1)
+                {
+                    NS_FATAL_ERROR("Failed to bind socket");
+                }
             }
-            m_socket->Connect(
-                Inet6SocketAddress(Ipv6Address::ConvertFrom(m_peerAddress), m_peerPort));
-        }
-        else if (InetSocketAddress::IsMatchingType(m_peerAddress))
-        {
-            if (m_socket->Bind() == -1)
+            else if (Inet6SocketAddress::IsMatchingType(m_peer))
             {
-                NS_FATAL_ERROR("Failed to bind socket");
+                if (m_socket->Bind6() == -1)
+                {
+                    NS_FATAL_ERROR("Failed to bind socket");
+                }
             }
-            m_socket->SetIpTos(m_tos); // Affects only IPv4 sockets.
-            m_socket->Connect(m_peerAddress);
-        }
-        else if (Inet6SocketAddress::IsMatchingType(m_peerAddress))
-        {
-            if (m_socket->Bind6() == -1)
+            else
             {
-                NS_FATAL_ERROR("Failed to bind socket");
+                NS_ASSERT_MSG(false, "Incompatible address type: " << m_peer);
             }
-            m_socket->Connect(m_peerAddress);
-        }
-        else
-        {
-            NS_ASSERT_MSG(false, "Incompatible address type: " << m_peerAddress);
         }
+        m_socket->SetIpTos(m_tos); // Affects only IPv4 sockets.
+        m_socket->Connect(m_peer);
+        m_socket->SetRecvCallback(MakeNullCallback<void, Ptr<Socket>>());
+        m_socket->SetAllowBroadcast(true);
     }
-    m_socket->SetRecvCallback(MakeNullCallback<void, Ptr<Socket>>());
-    m_socket->SetAllowBroadcast(true);
-    m_sendEvent = Simulator::Schedule(Seconds(0.0), &UdpTraceClient::Send, this);
+    m_sendEvent = Simulator::ScheduleNow(&UdpTraceClient::Send, this);
 }
 
 void
@@ -304,7 +338,6 @@
 UdpTraceClient::SendPacket(uint32_t size)
 {
     NS_LOG_FUNCTION(this << size);
-    Ptr<Packet> p;
     uint32_t packetSize;
     if (size > 12)
     {
@@ -314,24 +347,24 @@
     {
         packetSize = 0;
     }
-    p = Create<Packet>(packetSize);
+    auto p = Create<Packet>(packetSize);
     SeqTsHeader seqTs;
     seqTs.SetSeq(m_sent);
     p->AddHeader(seqTs);
 
-    std::stringstream addressString;
-    if (Ipv4Address::IsMatchingType(m_peerAddress))
-    {
-        addressString << Ipv4Address::ConvertFrom(m_peerAddress);
-    }
-    else if (Ipv6Address::IsMatchingType(m_peerAddress))
+    std::stringstream addressString{};
+#ifdef NS3_LOG_ENABLE
+    if (InetSocketAddress::IsMatchingType(m_peer))
     {
-        addressString << Ipv6Address::ConvertFrom(m_peerAddress);
+        addressString << InetSocketAddress::ConvertFrom(m_peer).GetIpv4() << ":"
+                      << InetSocketAddress::ConvertFrom(m_peer).GetPort();
     }
-    else
+    else if (Inet6SocketAddress::IsMatchingType(m_peer))
     {
-        addressString << m_peerAddress;
+        addressString << Inet6SocketAddress::ConvertFrom(m_peer).GetIpv6() << ":"
+                      << Inet6SocketAddress::ConvertFrom(m_peer).GetPort();
     }
+#endif
 
     if ((m_socket->Send(p)) >= 0)
     {
@@ -361,7 +394,7 @@
             SendPacket(m_maxPacketSize);
         }
 
-        uint16_t sizetosend = entry->packetSize % m_maxPacketSize;
+        auto sizetosend = entry->packetSize % m_maxPacketSize;
         SendPacket(sizetosend);
 
         m_currentEntry++;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/model/udp-trace-client.h ns-3.44/src/applications/model/udp-trace-client.h
--- ns-3.43/src/applications/model/udp-trace-client.h	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/applications/model/udp-trace-client.h	2025-03-09 16:55:49.347370900 -0700
@@ -10,11 +10,13 @@
 #ifndef UDP_TRACE_CLIENT_H
 #define UDP_TRACE_CLIENT_H
 
-#include "ns3/application.h"
+#include "source-application.h"
+
 #include "ns3/event-id.h"
 #include "ns3/ipv4-address.h"
 #include "ns3/ptr.h"
 
+#include <optional>
 #include <vector>
 
 namespace ns3
@@ -24,9 +26,9 @@
 class Packet;
 
 /**
- * \ingroup udpclientserver
+ * @ingroup udpclientserver
  *
- * \brief A trace based streamer
+ * @brief A trace based streamer
  *
  * Sends UDP packets based on a trace file of a MPEG4 stream.
  * Trace files can be downloaded from:
@@ -49,67 +51,53 @@
  *
  * The latter behavior can be changed through the "TraceLoop" attribute.
  */
-class UdpTraceClient : public Application
+class UdpTraceClient : public SourceApplication
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     UdpTraceClient();
-
-    /**
-     * \brief Creates a traceBasedStreamer application
-     * \param ip the destination ip address to which the stream will be sent
-     * \param port the destination udp port to which the stream will be sent
-     * \param traceFile a path to an MPEG4 trace file formatted as follows:
-     *  FrameNo Frametype   Time[ms]    Length [byte]
-     *  FrameNo Frametype   Time[ms]    Length [byte]
-     *  ...
-     *
-     *
-     */
-    UdpTraceClient(Ipv4Address ip, uint16_t port, char* traceFile);
     ~UdpTraceClient() override;
 
+    static constexpr uint16_t DEFAULT_PORT{100}; //!< default port
+
     /**
-     * \brief set the remote address and port
-     * \param ip remote IP address
-     * \param port remote port
-     */
-    void SetRemote(Address ip, uint16_t port);
-    /**
-     * \brief set the remote address
-     * \param addr remote address
+     * @brief set the remote address and port
+     * @param ip remote IP address
+     * @param port remote port
      */
-    void SetRemote(Address addr);
+    NS_DEPRECATED_3_44("Use SetRemote without port parameter instead")
+    void SetRemote(const Address& ip, uint16_t port);
+    void SetRemote(const Address& addr) override;
 
     /**
-     * \brief Set the trace file to be used by the application
-     * \param filename a path to an MPEG4 trace file formatted as follows:
+     * @brief Set the trace file to be used by the application
+     * @param filename a path to an MPEG4 trace file formatted as follows:
      *  Frame No Frametype   Time[ms]    Length [byte]
      *  Frame No Frametype   Time[ms]    Length [byte]
      *  ...
      */
-    void SetTraceFile(std::string filename);
+    void SetTraceFile(const std::string& filename);
 
     /**
-     * \brief Return the maximum packet size
-     * \return the maximum packet size
+     * @brief Return the maximum packet size
+     * @return the maximum packet size
      */
     uint16_t GetMaxPacketSize();
 
     /**
-     * \brief Set the maximum packet size
-     * \param maxPacketSize The maximum packet size
+     * @brief Set the maximum packet size
+     * @param maxPacketSize The maximum packet size
      */
     void SetMaxPacketSize(uint16_t maxPacketSize);
 
     /**
-     * \brief Set the trace loop flag
-     * \param traceLoop true if the trace should be re-used
+     * @brief Set the trace loop flag
+     * @param traceLoop true if the trace should be re-used
      */
     void SetTraceLoop(bool traceLoop);
 
@@ -118,27 +106,46 @@
     void StopApplication() override;
 
     /**
-     * \brief Load a trace file
-     * \param filename the trace file path
+     * @brief Set the remote port (temporary function until deprecated attributes are removed)
+     * @param port remote port
      */
-    void LoadTrace(std::string filename);
+    void SetPort(uint16_t port);
+
     /**
-     * \brief Load the default trace
+     * @brief Get the remote port (temporary function until deprecated attributes are removed)
+     * @return the remote port
+     */
+    uint16_t GetPort() const;
+
+    /**
+     * @brief Get the remote address (temporary function until deprecated attributes are removed)
+     * @return the remote address
+     */
+    Address GetRemote() const;
+
+    /**
+     * @brief Load current trace file
+     */
+    void LoadTrace();
+
+    /**
+     * @brief Load the default trace
      */
     void LoadDefaultTrace();
 
     /**
-     * \brief Send a packet
+     * @brief Send a packet
      */
     void Send();
+
     /**
-     * \brief Send a packet of a given size
-     * \param size the packet size
+     * @brief Send a packet of a given size
+     * @param size the packet size
      */
     void SendPacket(uint32_t size);
 
     /**
-     * \brief Entry to send.
+     * @brief Entry to send.
      *
      * Each entry represents an MPEG frame
      */
@@ -149,18 +156,17 @@
         char frameType;      //!< Frame type (I, P or B)
     };
 
-    uint32_t m_sent;       //!< Counter for sent packets
-    Ptr<Socket> m_socket;  //!< Socket
-    Address m_peerAddress; //!< Remote peer address
-    uint16_t m_peerPort;   //!< Remote peer port
-    uint8_t m_tos;         //!< The packets Type of Service
-    EventId m_sendEvent;   //!< Event to send the next packet
+    uint32_t m_sent;                    //!< Counter for sent packets
+    Ptr<Socket> m_socket;               //!< Socket
+    std::optional<uint16_t> m_peerPort; //!< Remote peer port (deprecated) // NS_DEPRECATED_3_44
+    EventId m_sendEvent;                //!< Event to send the next packet
 
     std::vector<TraceEntry> m_entries;    //!< Entries in the trace to send
     uint32_t m_currentEntry;              //!< Current entry index
     static TraceEntry g_defaultEntries[]; //!< Default trace to send
     uint16_t m_maxPacketSize; //!< Maximum packet size to send (including the SeqTsHeader)
     bool m_traceLoop;         //!< Loop through the trace file
+    std::string m_traceFile;  //!< The location of the trace file
 };
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/test/bulk-send-application-test-suite.cc ns-3.44/src/applications/test/bulk-send-application-test-suite.cc
--- ns-3.43/src/applications/test/bulk-send-application-test-suite.cc	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/applications/test/bulk-send-application-test-suite.cc	2025-03-09 16:55:49.347370900 -0700
@@ -28,8 +28,8 @@
 using namespace ns3;
 
 /**
- * \ingroup applications-test
- * \ingroup tests
+ * @ingroup applications-test
+ * @ingroup tests
  *
  * Basic test, checks that the right quantity of packets are sent and received.
  */
@@ -43,13 +43,13 @@
     void DoRun() override;
     /**
      * Record a packet successfully sent
-     * \param p the packet
+     * @param p the packet
      */
     void SendTx(Ptr<const Packet> p);
     /**
      * Record a packet successfully received
-     * \param p the packet
-     * \param addr the sender's address
+     * @param p the packet
+     * @param addr the sender's address
      */
     void ReceiveRx(Ptr<const Packet> p, const Address& addr);
     uint64_t m_sent{0};     //!< number of bytes sent
@@ -99,13 +99,13 @@
     BulkSendHelper sourceHelper("ns3::TcpSocketFactory", InetSocketAddress(i.GetAddress(1), port));
     sourceHelper.SetAttribute("MaxBytes", UintegerValue(300000));
     ApplicationContainer sourceApp = sourceHelper.Install(nodes.Get(0));
-    sourceApp.Start(Seconds(0.0));
-    sourceApp.Stop(Seconds(10.0));
+    sourceApp.Start(Seconds(0));
+    sourceApp.Stop(Seconds(10));
     PacketSinkHelper sinkHelper("ns3::TcpSocketFactory",
                                 InetSocketAddress(Ipv4Address::GetAny(), port));
     ApplicationContainer sinkApp = sinkHelper.Install(nodes.Get(1));
-    sinkApp.Start(Seconds(0.0));
-    sinkApp.Stop(Seconds(10.0));
+    sinkApp.Start(Seconds(0));
+    sinkApp.Stop(Seconds(10));
 
     Ptr<BulkSendApplication> source = DynamicCast<BulkSendApplication>(sourceApp.Get(0));
     Ptr<PacketSink> sink = DynamicCast<PacketSink>(sinkApp.Get(0));
@@ -121,8 +121,8 @@
 }
 
 /**
- * \ingroup applications-test
- * \ingroup tests
+ * @ingroup applications-test
+ * @ingroup tests
  *
  * This test checks that the sequence number is sent and received in sequence
  * despite the sending application having to pause and restart its sending
@@ -138,10 +138,10 @@
     void DoRun() override;
     /**
      * Record a packet successfully sent
-     * \param p the packet
-     * \param from source address
-     * \param to destination address
-     * \param header the SeqTsSizeHeader
+     * @param p the packet
+     * @param from source address
+     * @param to destination address
+     * @param header the SeqTsSizeHeader
      */
     void SendTx(Ptr<const Packet> p,
                 const Address& from,
@@ -149,10 +149,10 @@
                 const SeqTsSizeHeader& header);
     /**
      * Record a packet successfully received
-     * \param p the packet
-     * \param from source address
-     * \param to destination address
-     * \param header the SeqTsSizeHeader
+     * @param p the packet
+     * @param from source address
+     * @param to destination address
+     * @param header the SeqTsSizeHeader
      */
     void ReceiveRx(Ptr<const Packet> p,
                    const Address& from,
@@ -226,14 +226,14 @@
     sourceHelper.SetAttribute("MaxBytes", UintegerValue(300000));
     sourceHelper.SetAttribute("EnableSeqTsSizeHeader", BooleanValue(true));
     ApplicationContainer sourceApp = sourceHelper.Install(nodes.Get(0));
-    sourceApp.Start(Seconds(0.0));
-    sourceApp.Stop(Seconds(10.0));
+    sourceApp.Start(Seconds(0));
+    sourceApp.Stop(Seconds(10));
     PacketSinkHelper sinkHelper("ns3::TcpSocketFactory",
                                 InetSocketAddress(Ipv4Address::GetAny(), port));
     sinkHelper.SetAttribute("EnableSeqTsSizeHeader", BooleanValue(true));
     ApplicationContainer sinkApp = sinkHelper.Install(nodes.Get(1));
-    sinkApp.Start(Seconds(0.0));
-    sinkApp.Stop(Seconds(10.0));
+    sinkApp.Start(Seconds(0));
+    sinkApp.Stop(Seconds(10));
 
     Ptr<BulkSendApplication> source = DynamicCast<BulkSendApplication>(sourceApp.Get(0));
     Ptr<PacketSink> sink = DynamicCast<PacketSink>(sinkApp.Get(0));
@@ -251,10 +251,10 @@
 }
 
 /**
- * \ingroup applications-test
- * \ingroup tests
+ * @ingroup applications-test
+ * @ingroup tests
  *
- * \brief BulkSend TestSuite
+ * @brief BulkSend TestSuite
  */
 class BulkSendTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/test/three-gpp-http-client-server-test.cc ns-3.44/src/applications/test/three-gpp-http-client-server-test.cc
--- ns-3.43/src/applications/test/three-gpp-http-client-server-test.cc	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/applications/test/three-gpp-http-client-server-test.cc	2025-03-09 16:55:49.347370900 -0700
@@ -7,30 +7,31 @@
  *
  */
 
-#include <ns3/basic-data-calculators.h>
-#include <ns3/config.h>
-#include <ns3/error-model.h>
-#include <ns3/integer.h>
-#include <ns3/internet-stack-helper.h>
-#include <ns3/ipv4-address-helper.h>
-#include <ns3/ipv6-address-helper.h>
-#include <ns3/log.h>
-#include <ns3/mac48-address.h>
-#include <ns3/node.h>
-#include <ns3/nstime.h>
-#include <ns3/packet.h>
-#include <ns3/ptr.h>
-#include <ns3/simple-channel.h>
-#include <ns3/simple-net-device.h>
-#include <ns3/tcp-congestion-ops.h>
-#include <ns3/tcp-l4-protocol.h>
-#include <ns3/test.h>
-#include <ns3/three-gpp-http-client.h>
-#include <ns3/three-gpp-http-header.h>
-#include <ns3/three-gpp-http-helper.h>
-#include <ns3/three-gpp-http-server.h>
+#include "ns3/basic-data-calculators.h"
+#include "ns3/config.h"
+#include "ns3/error-model.h"
+#include "ns3/integer.h"
+#include "ns3/internet-stack-helper.h"
+#include "ns3/ipv4-address-helper.h"
+#include "ns3/ipv6-address-helper.h"
+#include "ns3/log.h"
+#include "ns3/mac48-address.h"
+#include "ns3/node.h"
+#include "ns3/nstime.h"
+#include "ns3/packet.h"
+#include "ns3/ptr.h"
+#include "ns3/simple-channel.h"
+#include "ns3/simple-net-device.h"
+#include "ns3/tcp-congestion-ops.h"
+#include "ns3/tcp-l4-protocol.h"
+#include "ns3/test.h"
+#include "ns3/three-gpp-http-client.h"
+#include "ns3/three-gpp-http-header.h"
+#include "ns3/three-gpp-http-helper.h"
+#include "ns3/three-gpp-http-server.h"
 
 #include <list>
+#include <optional>
 #include <sstream>
 
 NS_LOG_COMPONENT_DEFINE("ThreeGppHttpClientServerTest");
@@ -40,9 +41,9 @@
 // HTTP OBJECT TEST CASE //////////////////////////////////////////////////////
 
 /**
- * \ingroup http
- * \ingroup applications-test
- * \ingroup tests
+ * @ingroup http
+ * @ingroup applications-test
+ * @ingroup tests
  * A test class which verifies that each HTTP object sent is also received the
  * same size.
  *
@@ -57,21 +58,22 @@
 {
   public:
     /**
-     * \param name A textual label to briefly describe the test.
-     * \param rngRun Run index to be used, intended to affect the values produced
+     * @param name A textual label to briefly describe the test.
+     * @param rngRun Run index to be used, intended to affect the values produced
      *               by random number generators throughout the test.
-     * \param tcpType Type of TCP algorithm to be used by the connection between
+     * @param tcpType Type of TCP algorithm to be used by the connection between
      *                the client and the server. Must be a child type of
      *                ns3::TcpSocketFactory.
-     * \param channelDelay Transmission delay between the client and the server
+     * @param channelDelay Transmission delay between the client and the server
      *                     (and vice versa) which is due to the channel.
-     * \param bitErrorRate The probability of transmission error between the
+     * @param bitErrorRate The probability of transmission error between the
      *                     client and the server (and vice versa) in the unit of
      *                     bits.
-     * \param mtuSize Maximum transmission unit (in bytes) to be used by the
+     * @param mtuSize Maximum transmission unit (in bytes) to be used by the
      *                server model.
-     * \param useIpv6 If true, IPv6 will be used to address both client and
+     * @param useIpv6 If true, IPv6 will be used to address both client and
      *                server. Otherwise, IPv4 will be used.
+     * @param port The port to use if provided, otherwise the default port is used.
      */
     ThreeGppHttpObjectTestCase(const std::string& name,
                                uint32_t rngRun,
@@ -79,27 +81,54 @@
                                const Time& channelDelay,
                                double bitErrorRate,
                                uint32_t mtuSize,
-                               bool useIpv6);
+                               bool useIpv6,
+                               std::optional<uint16_t> port);
 
   private:
     /**
-     * Creates a Node, complete with a TCP/IP stack and address assignment.
+     * Creates a Node, complete with a TCP/IP stack.
      * #m_tcpType determines the TCP algorithm installed at the TCP stack.
-     * #m_useIpv6 determines whether to use IPv4 addressing or IPv6 addressing.
      *
      * \param[in] channel Pointer to a channel which the node's device will be
      *                    attached to.
-     * \param[out] assignedAddress The resulting address of the node.
-     * \return Pointer to the newly created node.
+     * @return Pointer to the newly created node.
+     */
+    Ptr<Node> CreateSimpleInternetNode(Ptr<SimpleChannel> channel);
+
+    /**
+     * Assign a socket address for a device.
+     * #m_useIpv6 determines whether to use IPv4 addressing or IPv6 addressing.
+     *
+     * \param[in] dev Pointer to the device.
+     * \param[in] port the port to use for the socket address.
+     * @return The resulting socket address.
+     */
+    Address AssignSocketAddress(Ptr<NetDevice> dev, uint16_t port);
+
+    /**
+     * Assign an IPv4 address to a device.
+     *
+     * \param[in] dev Pointer to the device to assign an address to.
+     * \param[in] logging flag to indicate whether to log the assigned address.
+     * @return The resulting IPv4 address of the device.
      */
-    Ptr<Node> CreateSimpleInternetNode(Ptr<SimpleChannel> channel, Address& assignedAddress);
+    Ipv4Address AssignIpv4Address(Ptr<NetDevice> dev, bool logging = true);
+
+    /**
+     * Assign an IPv6 address to a device.
+     *
+     * \param[in] dev Pointer to the device to assign an address to.
+     * \param[in] logging flag to indicate whether to log the assigned address.
+     * @return The resulting IPv6 address of the device.
+     */
+    Ipv6Address AssignIpv6Address(Ptr<NetDevice> dev, bool logging = true);
 
     // Inherited from TestCase base class.
     void DoRun() override;
     void DoTeardown() override;
 
     /**
-     * \internal
+     * @internal
      * Internal class used by ThreeGppHttpObjectTestCase. Keep track of the number
      * of object and bytes that have been sent and received in the simulation by
      * listening to the relevant trace sources.
@@ -111,12 +140,12 @@
         ThreeGppHttpObjectTracker();
         /**
          * Shall be invoked when a whole object has been transmitted.
-         * \param size Size of the whole object (in bytes).
+         * @param size Size of the whole object (in bytes).
          */
         void ObjectSent(uint32_t size);
         /**
          * Shall be invoked when an object part has been received.
-         * \param size Size of the object part (in bytes). This amount will be
+         * @param size Size of the object part (in bytes). This amount will be
          *             accumulated until ObjectReceived() is invoked.
          */
         void PartReceived(uint32_t size);
@@ -126,15 +155,15 @@
          * \param[out] txSize Size of the whole object (in bytes) when it was
          *                    transmitted.
          * \param[out] rxSize Size of the whole object (in bytes) received.
-         * \return True if this receive operation has a matching transmission
+         * @return True if this receive operation has a matching transmission
          *         operation (ObjectSent()), otherwise false. Both arguments are
          *         guaranteed to be replaced with initialized values if the return
          *         value is true.
          */
         bool ObjectReceived(uint32_t& txSize, uint32_t& rxSize);
-        /// \return True if zero object is currently tracked.
+        /// @return True if zero object is currently tracked.
         bool IsEmpty() const;
-        /// \return Number of whole objects that have been received so far.
+        /// @return Number of whole objects that have been received so far.
         uint16_t GetNumOfObjectsReceived() const;
 
       private:
@@ -161,88 +190,89 @@
     /**
      * Connected with `TxMainObjectRequest` trace source of the client.
      * Updates #m_requestObjectTracker.
-     * \param packet The packet of main object sent.
+     * @param packet The packet of main object sent.
      */
     void ClientTxMainObjectRequestCallback(Ptr<const Packet> packet);
     /**
      * Connected with `TxEmbeddedObjectRequest` trace source of the client.
      * Updates #m_requestObjectTracker.
-     * \param packet The packet of embedded object sent.
+     * @param packet The packet of embedded object sent.
      */
     void ClientTxEmbeddedObjectRequestCallback(Ptr<const Packet> packet);
     /**
      * Connected with `Rx` trace source of the server.
      * Updates #m_requestObjectTracker and perform some tests on the packet and
      * the size of the object.
-     * \param packet The packet received.
-     * \param from The address where the packet originates from.
+     * @param packet The packet received.
+     * @param from The address where the packet originates from.
+     * @param to The local address on which the server binds to.
      */
-    void ServerRxCallback(Ptr<const Packet> packet, const Address& from);
+    void ServerRxCallback(Ptr<const Packet> packet, const Address& from, const Address& to);
     /**
      * Connected with `MainObject` trace source of the server.
      * Updates #m_mainObjectTracker.
-     * \param size Size of the generated main object (in bytes).
+     * @param size Size of the generated main object (in bytes).
      */
     void ServerMainObjectCallback(uint32_t size);
     /**
      * Connected with `RxMainObjectPacket` trace source of the client.
      * Updates #m_mainObjectTracker and perform some tests on the packet.
-     * \param packet The packet received.
+     * @param packet The packet received.
      */
     void ClientRxMainObjectPacketCallback(Ptr<const Packet> packet);
     /**
      * Connected with `RxMainObject` trace source of the client. Updates
      * #m_mainObjectTracker and perform some tests on the size of the object.
-     * \param httpClient Pointer to the application.
-     * \param packet Full packet received by application.
+     * @param httpClient Pointer to the application.
+     * @param packet Full packet received by application.
      */
     void ClientRxMainObjectCallback(Ptr<const ThreeGppHttpClient> httpClient,
                                     Ptr<const Packet> packet);
     /**
      * Connected with `EmbeddedObject` trace source of the server.
      * Updates #m_embeddedObjectTracker.
-     * \param size Size of the generated embedded object (in bytes).
+     * @param size Size of the generated embedded object (in bytes).
      */
     void ServerEmbeddedObjectCallback(uint32_t size);
     /**
      * Connected with `RxEmbeddedObjectPacket` trace source of the client.
      * Updates #m_embeddedObjectTracker and perform some tests on the packet.
-     * \param packet The packet received.
+     * @param packet The packet received.
      */
     void ClientRxEmbeddedObjectPacketCallback(Ptr<const Packet> packet);
     /**
      * Connected with `RxEmbeddedObject` trace source of the client. Updates
      * #m_embeddedObjectTracker and perform some tests on the size of the object.
-     * \param httpClient Pointer to the application.
-     * \param packet Full packet received by application.
+     * @param httpClient Pointer to the application.
+     * @param packet Full packet received by application.
      */
     void ClientRxEmbeddedObjectCallback(Ptr<const ThreeGppHttpClient> httpClient,
                                         Ptr<const Packet> packet);
     /**
      * Connected with `StateTransition` trace source of the client.
      * Increments #m_numOfPagesReceived when the client enters READING state.
-     * \param oldState The name of the previous state.
-     * \param newState The name of the current state.
+     * @param oldState The name of the previous state.
+     * @param newState The name of the current state.
      */
     void ClientStateTransitionCallback(const std::string& oldState, const std::string& newState);
     /**
      * Connected with `RxDelay` trace source of the client.
      * Updates the statistics in #m_delayCalculator.
-     * \param delay The packet one-trip delay time.
-     * \param from The address of the device where the packet originates from.
+     * @param delay The packet one-trip delay time.
+     * @param from The address of the device where the packet originates from.
      */
     void ClientRxDelayCallback(const Time& delay, const Address& from);
     /**
      * Connected with `RxRtt` trace source of the client.
      * Updates the statistics in #m_rttCalculator.
-     * \param rtt The packet round trip delay time.
-     * \param from The address of the device where the packet originates from.
+     * @param rtt The packet round trip delay time.
+     * @param from The address of the device where the packet originates from.
      */
     void ClientRxRttCallback(const Time& rtt, const Address& from);
     /**
      * Connected with `PhyRxDrop` trace source of both the client's and server's
      * devices. Increments #m_numOfPacketDrops.
-     * \param packet Pointer to the packet being dropped.
+     * @param packet Pointer to the packet being dropped.
      */
     void DeviceDropCallback(Ptr<const Packet> packet);
     /**
@@ -252,11 +282,12 @@
 
     // THE PARAMETERS OF THE TEST CASE.
 
-    uint32_t m_rngRun;   ///< Determines the set of random values generated.
-    TypeId m_tcpType;    ///< TCP algorithm used.
-    Time m_channelDelay; ///< %Time needed by a packet to propagate.
-    uint32_t m_mtuSize;  ///< Maximum transmission unit (in bytes).
-    bool m_useIpv6;      ///< Whether to use IPv6 or IPv4.
+    uint32_t m_rngRun;              ///< Determines the set of random values generated.
+    TypeId m_tcpType;               ///< TCP algorithm used.
+    Time m_channelDelay;            ///< %Time needed by a packet to propagate.
+    uint32_t m_mtuSize;             ///< Maximum transmission unit (in bytes).
+    bool m_useIpv6;                 ///< Whether to use IPv6 or IPv4.
+    std::optional<uint16_t> m_port; ///< port to use if provided, otherwise the default port is used
 
     // OTHER MEMBER VARIABLES.
 
@@ -285,15 +316,17 @@
                                                        const Time& channelDelay,
                                                        double bitErrorRate,
                                                        uint32_t mtuSize,
-                                                       bool useIpv6)
+                                                       bool useIpv6,
+                                                       std::optional<uint16_t> port)
     : TestCase(name),
-      m_rngRun(rngRun),
-      m_tcpType(tcpType),
-      m_channelDelay(channelDelay),
-      m_mtuSize(mtuSize),
-      m_useIpv6(useIpv6),
-      m_numOfPagesReceived(0),
-      m_numOfPacketDrops(0)
+      m_rngRun{rngRun},
+      m_tcpType{tcpType},
+      m_channelDelay{channelDelay},
+      m_mtuSize{mtuSize},
+      m_useIpv6{useIpv6},
+      m_port{port},
+      m_numOfPagesReceived{0},
+      m_numOfPacketDrops{0}
 {
     NS_LOG_FUNCTION(this << GetName());
 
@@ -314,8 +347,7 @@
 }
 
 Ptr<Node>
-ThreeGppHttpObjectTestCase::CreateSimpleInternetNode(Ptr<SimpleChannel> channel,
-                                                     Address& assignedAddress)
+ThreeGppHttpObjectTestCase::CreateSimpleInternetNode(Ptr<SimpleChannel> channel)
 {
     NS_LOG_FUNCTION(this << channel);
 
@@ -328,22 +360,6 @@
     node->AddDevice(dev);
     m_internetStackHelper.Install(node);
 
-    // Assign IP address according to the selected Ip version.
-    if (m_useIpv6)
-    {
-        Ipv6InterfaceContainer ipv6Ifs = m_ipv6AddressHelper.Assign(NetDeviceContainer(dev));
-        NS_ASSERT(ipv6Ifs.GetN() == 1);
-        assignedAddress = ipv6Ifs.GetAddress(0, 0);
-    }
-    else
-    {
-        Ipv4InterfaceContainer ipv4Ifs = m_ipv4AddressHelper.Assign(NetDeviceContainer(dev));
-        NS_ASSERT(ipv4Ifs.GetN() == 1);
-        assignedAddress = ipv4Ifs.GetAddress(0, 0);
-    }
-
-    NS_LOG_DEBUG(this << " node is assigned to " << assignedAddress << ".");
-
     // Set the TCP algorithm.
     Ptr<TcpL4Protocol> tcp = node->GetObject<TcpL4Protocol>();
     tcp->SetAttribute("SocketType", TypeIdValue(m_tcpType));
@@ -356,6 +372,55 @@
     return node;
 }
 
+Ipv4Address
+ThreeGppHttpObjectTestCase::AssignIpv4Address(Ptr<NetDevice> dev, bool logging)
+{
+    NS_LOG_FUNCTION(this);
+    Ipv4InterfaceContainer ipv4Ifs = m_ipv4AddressHelper.Assign(NetDeviceContainer(dev));
+    NS_ASSERT(ipv4Ifs.GetN() == 1);
+    const auto assignedAddress = ipv4Ifs.GetAddress(0, 0);
+    if (logging)
+    {
+        NS_LOG_DEBUG(this << " node is assigned to " << assignedAddress << ".");
+    }
+    return assignedAddress;
+}
+
+Ipv6Address
+ThreeGppHttpObjectTestCase::AssignIpv6Address(Ptr<NetDevice> dev, bool logging)
+{
+    NS_LOG_FUNCTION(this);
+    Ipv6InterfaceContainer ipv6Ifs = m_ipv6AddressHelper.Assign(NetDeviceContainer(dev));
+    NS_ASSERT(ipv6Ifs.GetN() == 1);
+    const auto assignedAddress = ipv6Ifs.GetAddress(0, 0);
+    if (logging)
+    {
+        NS_LOG_DEBUG(this << " node is assigned to " << assignedAddress << ".");
+    }
+    return assignedAddress;
+}
+
+Address
+ThreeGppHttpObjectTestCase::AssignSocketAddress(Ptr<NetDevice> dev, uint16_t port)
+{
+    NS_LOG_FUNCTION(this);
+    Address assignedAddress;
+
+    // Assign IP address according to the selected Ip version.
+    if (m_useIpv6)
+    {
+        assignedAddress = Inet6SocketAddress(AssignIpv6Address(dev, false), port);
+    }
+    else
+    {
+        assignedAddress = InetSocketAddress(AssignIpv4Address(dev, false), port);
+    }
+
+    NS_LOG_DEBUG(this << " node is assigned to " << assignedAddress << ".");
+
+    return assignedAddress;
+}
+
 void
 ThreeGppHttpObjectTestCase::DoRun()
 {
@@ -384,32 +449,58 @@
      */
 
     // Channel.
-    Ptr<SimpleChannel> channel = CreateObject<SimpleChannel>();
+    auto channel = CreateObject<SimpleChannel>();
     channel->SetAttribute("Delay", TimeValue(m_channelDelay));
 
-    // Server node.
-    Address serverAddress;
-    Ptr<Node> serverNode = CreateSimpleInternetNode(channel, serverAddress);
-    ThreeGppHttpServerHelper serverHelper(serverAddress);
-    ApplicationContainer serverApplications = serverHelper.Install(serverNode);
+    // Server and client nodes.
+    ApplicationContainer serverApplications{};
+    ApplicationContainer clientApplications{};
+    auto serverNode = CreateSimpleInternetNode(channel);
+    auto clientNode = CreateSimpleInternetNode(channel);
+
+    // applications.
+    if (m_port)
+    {
+        const auto serverAddress = AssignSocketAddress(serverNode->GetDevice(0), *m_port);
+        ThreeGppHttpServerHelper serverHelper(serverAddress);
+        serverApplications = serverHelper.Install(serverNode);
+        AssignSocketAddress(clientNode->GetDevice(0), *m_port);
+        ThreeGppHttpClientHelper clientHelper(serverAddress);
+        clientApplications = clientHelper.Install(clientNode);
+    }
+    else
+    {
+        if (m_useIpv6)
+        {
+            const auto serverAddress = AssignIpv6Address(serverNode->GetDevice(0));
+            ThreeGppHttpServerHelper serverHelper(serverAddress);
+            serverApplications = serverHelper.Install(serverNode);
+            AssignIpv6Address(clientNode->GetDevice(0));
+            ThreeGppHttpClientHelper clientHelper(serverAddress);
+            clientApplications = clientHelper.Install(clientNode);
+        }
+        else
+        {
+            const auto serverAddress = AssignIpv4Address(serverNode->GetDevice(0));
+            ThreeGppHttpServerHelper serverHelper(serverAddress);
+            serverApplications = serverHelper.Install(serverNode);
+            AssignIpv4Address(clientNode->GetDevice(0));
+            ThreeGppHttpClientHelper clientHelper(serverAddress);
+            clientApplications = clientHelper.Install(clientNode);
+        }
+    }
     NS_TEST_ASSERT_MSG_EQ(serverApplications.GetN(),
                           1,
                           "Invalid number of HTTP servers has been installed");
-    Ptr<ThreeGppHttpServer> httpServer = serverApplications.Get(0)->GetObject<ThreeGppHttpServer>();
+    auto httpServer = serverApplications.Get(0)->GetObject<ThreeGppHttpServer>();
     NS_TEST_ASSERT_MSG_NE(httpServer,
                           nullptr,
                           "HTTP server installation fails to produce a proper type");
     httpServer->SetMtuSize(m_mtuSize);
-
-    // Client node.
-    Address clientAddress;
-    Ptr<Node> clientNode = CreateSimpleInternetNode(channel, clientAddress);
-    ThreeGppHttpClientHelper clientHelper(serverAddress);
-    ApplicationContainer clientApplications = clientHelper.Install(clientNode);
     NS_TEST_ASSERT_MSG_EQ(clientApplications.GetN(),
                           1,
                           "Invalid number of HTTP clients has been installed");
-    Ptr<ThreeGppHttpClient> httpClient = clientApplications.Get(0)->GetObject<ThreeGppHttpClient>();
+    auto httpClient = clientApplications.Get(0)->GetObject<ThreeGppHttpClient>();
     NS_TEST_ASSERT_MSG_NE(httpClient,
                           nullptr,
                           "HTTP client installation fails to produce a proper type");
@@ -424,7 +515,7 @@
         MakeCallback(&ThreeGppHttpObjectTestCase::ClientTxEmbeddedObjectRequestCallback, this));
     NS_ASSERT(traceSourceConnected);
     traceSourceConnected = httpServer->TraceConnectWithoutContext(
-        "Rx",
+        "RxWithAddresses",
         MakeCallback(&ThreeGppHttpObjectTestCase::ServerRxCallback, this));
     NS_ASSERT(traceSourceConnected);
 
@@ -472,7 +563,7 @@
         MakeCallback(&ThreeGppHttpObjectTestCase::ClientRxRttCallback, this));
     NS_ASSERT(traceSourceConnected);
 
-    Simulator::Schedule(Seconds(1.0), &ThreeGppHttpObjectTestCase::ProgressCallback, this);
+    Simulator::Schedule(Seconds(1), &ThreeGppHttpObjectTestCase::ProgressCallback, this);
 
     /*
      * Here we don't set the simulation stop time. During the run, the simulation
@@ -590,9 +681,24 @@
 }
 
 void
-ThreeGppHttpObjectTestCase::ServerRxCallback(Ptr<const Packet> packet, const Address& from)
+ThreeGppHttpObjectTestCase::ServerRxCallback(Ptr<const Packet> packet,
+                                             const Address& from,
+                                             const Address& to)
 {
-    NS_LOG_FUNCTION(this << packet << packet->GetSize() << from);
+    NS_LOG_INFO(this << packet << packet->GetSize() << from << to);
+
+    uint16_t port{};
+    if (InetSocketAddress::IsMatchingType(to))
+    {
+        port = InetSocketAddress::ConvertFrom(to).GetPort();
+    }
+    else if (Inet6SocketAddress::IsMatchingType(to))
+    {
+        port = Inet6SocketAddress::ConvertFrom(to).GetPort();
+    }
+    NS_TEST_ASSERT_MSG_EQ(port,
+                          m_port.value_or(ThreeGppHttpServer::HTTP_DEFAULT_PORT),
+                          "Incorrect port");
 
     // Check the header in packet
     Ptr<Packet> copy = packet->Copy();
@@ -601,7 +707,7 @@
                           22,
                           "Error finding ThreeGppHttpHeader in a packet received by the server");
     NS_TEST_ASSERT_MSG_GT(httpHeader.GetClientTs(),
-                          Seconds(0.0),
+                          Seconds(0),
                           "Request object's client TS is unexpectedly non-positive");
 
     m_requestObjectTracker.PartReceived(packet->GetSize());
@@ -649,10 +755,10 @@
                           ThreeGppHttpHeader::MAIN_OBJECT,
                           "Invalid content type in the received packet");
     NS_TEST_ASSERT_MSG_GT(httpHeader.GetClientTs(),
-                          Seconds(0.0),
+                          Seconds(0),
                           "Main object's client TS is unexpectedly non-positive");
     NS_TEST_ASSERT_MSG_GT(httpHeader.GetServerTs(),
-                          Seconds(0.0),
+                          Seconds(0),
                           "Main object's server TS is unexpectedly non-positive");
 
     uint32_t txSize = 0;
@@ -697,10 +803,10 @@
                           ThreeGppHttpHeader::EMBEDDED_OBJECT,
                           "Invalid content type in the received packet");
     NS_TEST_ASSERT_MSG_GT(httpHeader.GetClientTs(),
-                          Seconds(0.0),
+                          Seconds(0),
                           "Embedded object's client TS is unexpectedly non-positive");
     NS_TEST_ASSERT_MSG_GT(httpHeader.GetServerTs(),
-                          Seconds(0.0),
+                          Seconds(0),
                           "Embedded object's server TS is unexpectedly non-positive");
 
     uint32_t txSize = 0;
@@ -738,8 +844,8 @@
 void
 ThreeGppHttpObjectTestCase::ProgressCallback()
 {
-    NS_LOG_INFO("Simulator time now: " << Simulator::Now().As(Time::S) << ".");
-    Simulator::Schedule(Seconds(1.0), &ThreeGppHttpObjectTestCase::ProgressCallback, this);
+    NS_LOG_DEBUG("Simulator time now: " << Simulator::Now().As(Time::S) << ".");
+    Simulator::Schedule(Seconds(1), &ThreeGppHttpObjectTestCase::ProgressCallback, this);
 }
 
 void
@@ -766,9 +872,9 @@
 // TEST SUITE /////////////////////////////////////////////////////////////////
 
 /**
- * \ingroup http
- * \ingroup applications-test
- * \ingroup tests
+ * @ingroup http
+ * @ingroup applications-test
+ * @ingroup tests
  * A test class for running several system tests which validate the web
  * browsing traffic model.
  *
@@ -817,6 +923,12 @@
                                               channelDelay[i1],
                                               bitErrorRate[i2],
                                               mtuSize[i3],
+                                              false,
+                                              8080);
+                        AddHttpObjectTestCase(run++,
+                                              channelDelay[i1],
+                                              bitErrorRate[i2],
+                                              mtuSize[i3],
                                               true);
                     }
                 }
@@ -828,23 +940,25 @@
     /**
      * Creates a test case with the given parameters.
      *
-     * \param rngRun Run index to be used, intended to affect the values produced
+     * @param rngRun Run index to be used, intended to affect the values produced
      *               by random number generators throughout the test.
-     * \param channelDelay Transmission delay between the client and the server
+     * @param channelDelay Transmission delay between the client and the server
      *                     (and vice versa) which is due to the channel.
-     * \param bitErrorRate The probability of transmission error between the
+     * @param bitErrorRate The probability of transmission error between the
      *                     client and the server (and vice versa) in the unit of
      *                     bits.
-     * \param mtuSize Maximum transmission unit (in bytes) to be used by the
+     * @param mtuSize Maximum transmission unit (in bytes) to be used by the
      *                server model.
-     * \param useIpv6 If true, IPv6 will be used to address both client and
+     * @param useIpv6 If true, IPv6 will be used to address both client and
      *                server. Otherwise, IPv4 will be used.
+     * @param port The port to use if provided, otherwise the default port is used.
      */
     void AddHttpObjectTestCase(uint32_t rngRun,
                                const Time& channelDelay,
                                double bitErrorRate,
                                uint32_t mtuSize,
-                               bool useIpv6)
+                               bool useIpv6,
+                               std::optional<uint16_t> port = std::nullopt)
     {
         std::ostringstream name;
         name << "Run #" << rngRun;
@@ -860,6 +974,10 @@
         {
             name << " IPv4";
         }
+        if (port)
+        {
+            name << "(" << *port << ")";
+        }
 
         // Assign higher fullness for tests with higher RngRun.
         TestCase::Duration testDuration = TestCase::Duration::QUICK;
@@ -878,7 +996,8 @@
                                                    channelDelay,
                                                    bitErrorRate,
                                                    mtuSize,
-                                                   useIpv6),
+                                                   useIpv6,
+                                                   port),
                     testDuration);
     }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/applications/test/udp-client-server-test.cc ns-3.44/src/applications/test/udp-client-server-test.cc
--- ns-3.43/src/applications/test/udp-client-server-test.cc	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/applications/test/udp-client-server-test.cc	2025-03-09 16:55:49.347370900 -0700
@@ -28,13 +28,13 @@
 using namespace ns3;
 
 /**
- * \ingroup applications
- * \defgroup applications-test applications module tests
+ * @ingroup applications
+ * @defgroup applications-test applications module tests
  */
 
 /**
- * \ingroup applications-test
- * \ingroup tests
+ * @ingroup applications-test
+ * @ingroup tests
  *
  * Test that all the UDP packets generated by an UdpClient application are
  * correctly received by an UdpServer application
@@ -88,19 +88,20 @@
     uint16_t port = 4000;
     UdpServerHelper serverHelper(port);
     auto serverApp = serverHelper.Install(n.Get(1));
-    serverApp.Start(Seconds(1.0));
-    serverApp.Stop(Seconds(10.0));
+    serverApp.Start(Seconds(1));
+    serverApp.Stop(Seconds(10));
 
     uint32_t MaxPacketSize = 1024;
     Time interPacketInterval = Seconds(1.);
     uint32_t maxPacketCount = 10;
-    UdpClientHelper clientHelper(i.GetAddress(1), port);
+    // This voluntarily invokes the c'tor not doing conversion
+    UdpClientHelper clientHelper(InetSocketAddress(i.GetAddress(1), port));
     clientHelper.SetAttribute("MaxPackets", UintegerValue(maxPacketCount));
     clientHelper.SetAttribute("Interval", TimeValue(interPacketInterval));
     clientHelper.SetAttribute("PacketSize", UintegerValue(MaxPacketSize));
     auto clientApp = clientHelper.Install(n.Get(0));
-    clientApp.Start(Seconds(2.0));
-    clientApp.Stop(Seconds(10.0));
+    clientApp.Start(Seconds(2));
+    clientApp.Stop(Seconds(10));
 
     Simulator::Run();
     Simulator::Destroy();
@@ -161,17 +162,17 @@
     Ipv4InterfaceContainer i = ipv4.Assign(d);
 
     uint16_t port = 4000;
-    UdpServerHelper serverHelper(port);
+    UdpServerHelper serverHelper(InetSocketAddress(Ipv4Address::GetAny(), port));
     auto serverApp = serverHelper.Install(n.Get(1));
-    serverApp.Start(Seconds(1.0));
-    serverApp.Stop(Seconds(10.0));
+    serverApp.Start(Seconds(1));
+    serverApp.Stop(Seconds(10));
 
     uint32_t MaxPacketSize = 1400 - 28; // ip/udp header
-    UdpTraceClientHelper clientHelper(i.GetAddress(1), port);
+    UdpTraceClientHelper clientHelper(InetSocketAddress(i.GetAddress(1), port));
     clientHelper.SetAttribute("MaxPacketSize", UintegerValue(MaxPacketSize));
     auto clientApp = clientHelper.Install(n.Get(0));
-    clientApp.Start(Seconds(2.0));
-    clientApp.Stop(Seconds(10.0));
+    clientApp.Start(Seconds(2));
+    clientApp.Stop(Seconds(10));
 
     Simulator::Run();
     Simulator::Destroy();
@@ -309,13 +310,13 @@
     Ipv4InterfaceContainer interfaces = ipv4.Assign(d);
 
     uint16_t port = 5000;
-    UdpEchoServerHelper echoServer(port);
+    UdpEchoServerHelper echoServer(InetSocketAddress(Ipv4Address::GetAny(), port));
     ApplicationContainer serverApps = echoServer.Install(nodes.Get(1));
-    serverApps.Start(Seconds(1.0));
-    serverApps.Stop(Seconds(10.0));
-    UdpEchoClientHelper echoClient(interfaces.GetAddress(1), port);
+    serverApps.Start(Seconds(1));
+    serverApps.Stop(Seconds(10));
+    UdpEchoClientHelper echoClient(InetSocketAddress(interfaces.GetAddress(1), port));
     echoClient.SetAttribute("MaxPackets", UintegerValue(1));
-    echoClient.SetAttribute("Interval", TimeValue(Seconds(1.0)));
+    echoClient.SetAttribute("Interval", TimeValue(Seconds(1)));
     echoClient.SetAttribute("PacketSize", UintegerValue(1024));
 
     ApplicationContainer clientApps = echoClient.Install(nodes.Get(0));
@@ -328,18 +329,18 @@
     }
     echoClient.SetFill(clientApps.Get(0), &(array[0]), (uint32_t)64, (uint32_t)64);
 
-    clientApps.Start(Seconds(2.0));
-    clientApps.Stop(Seconds(10.0));
+    clientApps.Start(Seconds(2));
+    clientApps.Stop(Seconds(10));
 
     Simulator::Run();
     Simulator::Destroy();
 }
 
 /**
- * \ingroup applications-test
- * \ingroup tests
+ * @ingroup applications-test
+ * @ingroup tests
  *
- * \brief UDP client and server TestSuite
+ * @brief UDP client and server TestSuite
  */
 class UdpClientServerTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/bridge/examples/csma-bridge.cc ns-3.44/src/bridge/examples/csma-bridge.cc
--- ns-3.43/src/bridge/examples/csma-bridge.cc	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/bridge/examples/csma-bridge.cc	2025-03-09 16:55:49.347370900 -0700
@@ -28,8 +28,8 @@
 #include <iostream>
 
 /**
- * \file
- * \ingroup bridge
+ * @file
+ * @ingroup bridge
  * Bridge example connecting four nodes,
  * with the bridge acting as a simple switch.
  */
@@ -111,14 +111,14 @@
 
     ApplicationContainer app = onoff.Install(terminals.Get(0));
     // Start the application
-    app.Start(Seconds(1.0));
-    app.Stop(Seconds(10.0));
+    app.Start(Seconds(1));
+    app.Stop(Seconds(10));
 
     // Create an optional packet sink to receive these packets
     PacketSinkHelper sink("ns3::UdpSocketFactory",
                           Address(InetSocketAddress(Ipv4Address::GetAny(), port)));
     app = sink.Install(terminals.Get(1));
-    app.Start(Seconds(0.0));
+    app.Start(Seconds(0));
 
     //
     // Create a similar flow from n3 to n0, starting at time 1.1 seconds
@@ -126,10 +126,10 @@
     onoff.SetAttribute("Remote", AddressValue(InetSocketAddress(Ipv4Address("10.1.1.1"), port)));
     app = onoff.Install(terminals.Get(3));
     app.Start(Seconds(1.1));
-    app.Stop(Seconds(10.0));
+    app.Stop(Seconds(10));
 
     app = sink.Install(terminals.Get(0));
-    app.Start(Seconds(0.0));
+    app.Start(Seconds(0));
 
     NS_LOG_INFO("Configure Tracing.");
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/bridge/examples/csma-bridge-one-hop.cc ns-3.44/src/bridge/examples/csma-bridge-one-hop.cc
--- ns-3.43/src/bridge/examples/csma-bridge-one-hop.cc	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/bridge/examples/csma-bridge-one-hop.cc	2025-03-09 16:55:49.347370900 -0700
@@ -65,8 +65,8 @@
 #include <iostream>
 
 /**
- * \file
- * \ingroup bridge
+ * @file
+ * @ingroup bridge
  * Bridge example connecting two broadcast domains.
  */
 
@@ -180,15 +180,15 @@
 
     ApplicationContainer app = onoff.Install(n0);
     // Start the application
-    app.Start(Seconds(1.0));
-    app.Stop(Seconds(10.0));
+    app.Start(Seconds(1));
+    app.Stop(Seconds(10));
 
     // Create an optional packet sink to receive these packets
     PacketSinkHelper sink("ns3::UdpSocketFactory",
                           Address(InetSocketAddress(Ipv4Address::GetAny(), port)));
     ApplicationContainer sink1 = sink.Install(n1);
-    sink1.Start(Seconds(1.0));
-    sink1.Stop(Seconds(10.0));
+    sink1.Start(Seconds(1));
+    sink1.Stop(Seconds(10));
 
     //
     // Create a similar flow from n3 to n0, starting at time 1.1 seconds
@@ -196,11 +196,11 @@
     onoff.SetAttribute("Remote", AddressValue(InetSocketAddress(Ipv4Address("10.1.1.2"), port)));
     ApplicationContainer app2 = onoff.Install(n3);
     app2.Start(Seconds(1.1));
-    app2.Stop(Seconds(10.0));
+    app2.Stop(Seconds(10));
 
     ApplicationContainer sink2 = sink.Install(n0);
     sink2.Start(Seconds(1.1));
-    sink2.Stop(Seconds(10.0));
+    sink2.Stop(Seconds(10));
 
     NS_LOG_INFO("Configure Tracing.");
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/bridge/examples/csma-bridge.py ns-3.44/src/bridge/examples/csma-bridge.py
--- ns-3.43/src/bridge/examples/csma-bridge.py	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/bridge/examples/csma-bridge.py	2025-03-09 16:55:49.347370900 -0700
@@ -96,14 +96,14 @@
 
     app = onoff.Install(ns.NodeContainer(terminals.Get(0)))
     # Start the application
-    app.Start(ns.Seconds(1.0))
-    app.Stop(ns.Seconds(10.0))
+    app.Start(ns.Seconds(1))
+    app.Stop(ns.Seconds(10))
 
     # Create an optional packet sink to receive these packets
     inet_address = ns.InetSocketAddress(ns.Ipv4Address.GetAny(), port)
     sink = ns.PacketSinkHelper("ns3::UdpSocketFactory", inet_address.ConvertTo())
     app = sink.Install(ns.NodeContainer(terminals.Get(1)))
-    app.Start(ns.Seconds(0.0))
+    app.Start(ns.Seconds(0))
 
     #
     # Create a similar flow from n3 to n0, starting at time 1.1 seconds
@@ -112,10 +112,10 @@
     onoff.SetAttribute("Remote", ns.AddressValue(inet_address.ConvertTo()))
     app = onoff.Install(ns.NodeContainer(terminals.Get(3)))
     app.Start(ns.Seconds(1.1))
-    app.Stop(ns.Seconds(10.0))
+    app.Stop(ns.Seconds(10))
 
     app = sink.Install(ns.NodeContainer(terminals.Get(0)))
-    app.Start(ns.Seconds(0.0))
+    app.Start(ns.Seconds(0))
 
     #
     # Configure tracing of all enqueue, dequeue, and NetDevice receive events.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/bridge/helper/bridge-helper.cc ns-3.44/src/bridge/helper/bridge-helper.cc
--- ns-3.43/src/bridge/helper/bridge-helper.cc	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/bridge/helper/bridge-helper.cc	2025-03-09 16:55:49.347370900 -0700
@@ -12,8 +12,8 @@
 #include "ns3/node.h"
 
 /**
- * \file
- * \ingroup bridge
+ * @file
+ * @ingroup bridge
  * ns3::BridgeHelper implementation.
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/bridge/helper/bridge-helper.h ns-3.44/src/bridge/helper/bridge-helper.h
--- ns-3.43/src/bridge/helper/bridge-helper.h	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/bridge/helper/bridge-helper.h	2025-03-09 16:55:49.347370900 -0700
@@ -15,8 +15,8 @@
 #include <string>
 
 /**
- * \file
- * \ingroup bridge
+ * @file
+ * @ingroup bridge
  * ns3::BridgeHelper declaration.
  */
 
@@ -27,8 +27,8 @@
 class AttributeValue;
 
 /**
- * \ingroup bridge
- * \brief Add capability to bridge multiple LAN segments (IEEE 802.1D bridging)
+ * @ingroup bridge
+ * @brief Add capability to bridge multiple LAN segments (IEEE 802.1D bridging)
  */
 class BridgeHelper
 {
@@ -41,8 +41,8 @@
      * Set an attribute on each ns3::BridgeNetDevice created by
      * BridgeHelper::Install
      *
-     * \param n1 the name of the attribute to set
-     * \param v1 the value of the attribute to set
+     * @param n1 the name of the attribute to set
+     * @param v1 the value of the attribute to set
      */
     void SetDeviceAttribute(std::string n1, const AttributeValue& v1);
     /**
@@ -51,9 +51,9 @@
      * to the node, and attaches the given NetDevices as ports of the
      * bridge.
      *
-     * \param node The node to install the device in
-     * \param c Container of NetDevices to add as bridge ports
-     * \returns A container holding the added net device.
+     * @param node The node to install the device in
+     * @param c Container of NetDevices to add as bridge ports
+     * @returns A container holding the added net device.
      */
     NetDeviceContainer Install(Ptr<Node> node, NetDeviceContainer c);
     /**
@@ -62,9 +62,9 @@
      * to the node, and attaches the given NetDevices as ports of the
      * bridge.
      *
-     * \param nodeName The name of the node to install the device in
-     * \param c Container of NetDevices to add as bridge ports
-     * \returns A container holding the added net device.
+     * @param nodeName The name of the node to install the device in
+     * @param c Container of NetDevices to add as bridge ports
+     * @returns A container holding the added net device.
      */
     NetDeviceContainer Install(std::string nodeName, NetDeviceContainer c);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/bridge/model/bridge-channel.cc ns-3.44/src/bridge/model/bridge-channel.cc
--- ns-3.43/src/bridge/model/bridge-channel.cc	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/bridge/model/bridge-channel.cc	2025-03-09 16:55:49.347370900 -0700
@@ -9,8 +9,8 @@
 #include "ns3/log.h"
 
 /**
- * \file
- * \ingroup bridge
+ * @file
+ * @ingroup bridge
  * ns3::BridgeChannel implementation.
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/bridge/model/bridge-channel.h ns-3.44/src/bridge/model/bridge-channel.h
--- ns-3.43/src/bridge/model/bridge-channel.h	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/bridge/model/bridge-channel.h	2025-03-09 16:55:49.347370900 -0700
@@ -12,8 +12,8 @@
 #include <vector>
 
 /**
- * \file
- * \ingroup bridge
+ * @file
+ * @ingroup bridge
  * ns3::BridgeChannel declaration.
  */
 
@@ -21,9 +21,9 @@
 {
 
 /**
- * \ingroup bridge
+ * @ingroup bridge
  *
- * \brief Virtual channel implementation for bridges (BridgeNetDevice).
+ * @brief Virtual channel implementation for bridges (BridgeNetDevice).
  *
  * Just like BridgeNetDevice aggregates multiple NetDevices,
  * BridgeChannel aggregates multiple channels and make them appear as
@@ -33,8 +33,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     BridgeChannel();
@@ -46,7 +46,7 @@
 
     /**
      * Adds a channel to the bridged pool
-     * \param bridgedChannel  the channel to add to the pool
+     * @param bridgedChannel  the channel to add to the pool
      */
     void AddChannel(Ptr<Channel> bridgedChannel);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/bridge/model/bridge-net-device.cc ns-3.44/src/bridge/model/bridge-net-device.cc
--- ns-3.43/src/bridge/model/bridge-net-device.cc	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/bridge/model/bridge-net-device.cc	2025-03-09 16:55:49.347370900 -0700
@@ -14,8 +14,8 @@
 #include "ns3/uinteger.h"
 
 /**
- * \file
- * \ingroup bridge
+ * @file
+ * @ingroup bridge
  * ns3::BridgeNetDevice implementation.
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/bridge/model/bridge-net-device.h ns-3.44/src/bridge/model/bridge-net-device.h
--- ns-3.43/src/bridge/model/bridge-net-device.h	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/bridge/model/bridge-net-device.h	2025-03-09 16:55:49.347370900 -0700
@@ -17,8 +17,8 @@
 #include <string>
 
 /**
- * \file
- * \ingroup bridge
+ * @file
+ * @ingroup bridge
  * ns3::BridgeNetDevice declaration.
  */
 
@@ -28,9 +28,9 @@
 class Node;
 
 /**
- * \defgroup bridge Bridge Network Device
+ * @defgroup bridge Bridge Network Device
  *
- * \brief a virtual net device that bridges multiple LAN segments
+ * @brief a virtual net device that bridges multiple LAN segments
  *
  * The BridgeNetDevice object is a "virtual" netdevice that aggregates
  * multiple "real" netdevices and implements the data plane forwarding
@@ -42,29 +42,29 @@
  * may occasionally be forwarded throughout all other ports, but
  * usually they are forwarded only to a single correct output port.
  *
- * \attention The Spanning Tree Protocol part of 802.1D is not
+ * @attention The Spanning Tree Protocol part of 802.1D is not
  * implemented.  Therefore, you have to be careful not to create
  * bridging loops, or else the network will collapse.
  *
- * \attention Bridging is designed to work only with NetDevices
+ * @attention Bridging is designed to work only with NetDevices
  * modelling IEEE 802-style technologies, such as CsmaNetDevice and
  * WifiNetDevice.
  *
- * \attention If including a WifiNetDevice in a bridge, the wifi
+ * @attention If including a WifiNetDevice in a bridge, the wifi
  * device must be in Access Point mode.  Adhoc mode is not supported
  * with bridging.
  */
 
 /**
- * \ingroup bridge
- * \brief a virtual net device that bridges multiple LAN segments
+ * @ingroup bridge
+ * @brief a virtual net device that bridges multiple LAN segments
  */
 class BridgeNetDevice : public NetDevice
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     BridgeNetDevice();
@@ -75,14 +75,14 @@
     BridgeNetDevice& operator=(const BridgeNetDevice&) = delete;
 
     /**
-     * \brief Add a 'port' to a bridge device
-     * \param bridgePort the NetDevice to add
+     * @brief Add a 'port' to a bridge device
+     * @param bridgePort the NetDevice to add
      *
      * This method adds a new bridge port to a BridgeNetDevice, so that
      * the new bridge port NetDevice becomes part of the bridge and L2
      * frames start being forwarded to/from this NetDevice.
      *
-     * \attention The netdevice that is being added as bridge port must
+     * @attention The netdevice that is being added as bridge port must
      * _not_ have an IP address.  In order to add IP connectivity to a
      * bridging node you must enable IP on the BridgeNetDevice itself,
      * never on its port netdevices.
@@ -90,16 +90,16 @@
     void AddBridgePort(Ptr<NetDevice> bridgePort);
 
     /**
-     * \brief Gets the number of bridged 'ports', i.e., the NetDevices currently bridged.
+     * @brief Gets the number of bridged 'ports', i.e., the NetDevices currently bridged.
      *
-     * \return the number of bridged ports.
+     * @return the number of bridged ports.
      */
     uint32_t GetNBridgePorts() const;
 
     /**
-     * \brief Gets the n-th bridged port.
-     * \param n the port index
-     * \return the n-th bridged NetDevice
+     * @brief Gets the n-th bridged port.
+     * @param n the port index
+     * @return the n-th bridged NetDevice
      */
     Ptr<NetDevice> GetBridgePort(uint32_t n) const;
 
@@ -136,13 +136,13 @@
     void DoDispose() override;
 
     /**
-     * \brief Receives a packet from one bridged port.
-     * \param device the originating port
-     * \param packet the received packet
-     * \param protocol the packet protocol (e.g., Ethertype)
-     * \param source the packet source
-     * \param destination the packet destination
-     * \param packetType the packet type (e.g., host, broadcast, etc.)
+     * @brief Receives a packet from one bridged port.
+     * @param device the originating port
+     * @param packet the received packet
+     * @param protocol the packet protocol (e.g., Ethertype)
+     * @param source the packet source
+     * @param destination the packet destination
+     * @param packetType the packet type (e.g., host, broadcast, etc.)
      */
     void ReceiveFromDevice(Ptr<NetDevice> device,
                            Ptr<const Packet> packet,
@@ -152,12 +152,12 @@
                            PacketType packetType);
 
     /**
-     * \brief Forwards a unicast packet
-     * \param incomingPort the packet incoming port
-     * \param packet the packet
-     * \param protocol the packet protocol (e.g., Ethertype)
-     * \param src the packet source
-     * \param dst the packet destination
+     * @brief Forwards a unicast packet
+     * @param incomingPort the packet incoming port
+     * @param packet the packet
+     * @param protocol the packet protocol (e.g., Ethertype)
+     * @param src the packet source
+     * @param dst the packet destination
      */
     void ForwardUnicast(Ptr<NetDevice> incomingPort,
                         Ptr<const Packet> packet,
@@ -166,12 +166,12 @@
                         Mac48Address dst);
 
     /**
-     * \brief Forwards a broadcast or a multicast packet
-     * \param incomingPort the packet incoming port
-     * \param packet the packet
-     * \param protocol the packet protocol (e.g., Ethertype)
-     * \param src the packet source
-     * \param dst the packet destination
+     * @brief Forwards a broadcast or a multicast packet
+     * @param incomingPort the packet incoming port
+     * @param packet the packet
+     * @param protocol the packet protocol (e.g., Ethertype)
+     * @param src the packet source
+     * @param dst the packet destination
      */
     void ForwardBroadcast(Ptr<NetDevice> incomingPort,
                           Ptr<const Packet> packet,
@@ -180,16 +180,16 @@
                           Mac48Address dst);
 
     /**
-     * \brief Learns the port a MAC address is sending from
-     * \param source source address
-     * \param port the port the source is sending from
+     * @brief Learns the port a MAC address is sending from
+     * @param source source address
+     * @param port the port the source is sending from
      */
     void Learn(Mac48Address source, Ptr<NetDevice> port);
 
     /**
-     * \brief Gets the port associated to a source address
-     * \param source the source address
-     * \returns the port the source is associated to, or NULL if no association is known.
+     * @brief Gets the port associated to a source address
+     * @param source the source address
+     * @returns the port the source is associated to, or NULL if no association is known.
      */
     Ptr<NetDevice> GetLearnedState(Mac48Address source);
 
@@ -201,7 +201,7 @@
     Time m_expirationTime;  //!< time it takes for learned MAC state to expire
 
     /**
-     * \ingroup bridge
+     * @ingroup bridge
      * Structure holding the status of an address
      */
     struct LearnedState
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/brite/examples/brite-generic-example.cc ns-3.44/src/brite/examples/brite-generic-example.cc
--- ns-3.43/src/brite/examples/brite-generic-example.cc	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/brite/examples/brite-generic-example.cc	2025-03-09 16:55:49.347370900 -0700
@@ -114,8 +114,8 @@
 
     UdpEchoServerHelper echoServer(9);
     ApplicationContainer serverApps = echoServer.Install(server.Get(0));
-    serverApps.Start(Seconds(1.0));
-    serverApps.Stop(Seconds(5.0));
+    serverApps.Start(Seconds(1));
+    serverApps.Stop(Seconds(5));
 
     UdpEchoClientHelper echoClient(serverInterfaces.GetAddress(0), 9);
     echoClient.SetAttribute("MaxPackets", UintegerValue(1));
@@ -123,8 +123,8 @@
     echoClient.SetAttribute("PacketSize", UintegerValue(1024));
 
     ApplicationContainer clientApps = echoClient.Install(client.Get(0));
-    clientApps.Start(Seconds(2.0));
-    clientApps.Stop(Seconds(5.0));
+    clientApps.Start(Seconds(2));
+    clientApps.Stop(Seconds(5));
 
     if (!nix)
     {
@@ -137,7 +137,7 @@
         p2p.EnableAsciiAll(ascii.CreateFileStream("briteLeaves.tr"));
     }
     // Run the simulator
-    Simulator::Stop(Seconds(6.0));
+    Simulator::Stop(Seconds(6));
     Simulator::Run();
     Simulator::Destroy();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/brite/examples/brite-generic-example.py ns-3.44/src/brite/examples/brite-generic-example.py
--- ns-3.43/src/brite/examples/brite-generic-example.py	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/brite/examples/brite-generic-example.py	2025-03-09 16:55:49.347370900 -0700
@@ -79,22 +79,22 @@
 
 echoServer = ns.UdpEchoServerHelper(9)
 serverApps = echoServer.Install(server.Get(0))
-serverApps.Start(ns.Seconds(1.0))
-serverApps.Stop(ns.Seconds(5.0))
+serverApps.Start(ns.Seconds(1))
+serverApps.Stop(ns.Seconds(5))
 
 echoClient = ns.UdpEchoClientHelper(serverInterfaces.GetAddress(0).ConvertTo(), 9)
 echoClient.SetAttribute("MaxPackets", ns.UintegerValue(1))
-echoClient.SetAttribute("Interval", ns.TimeValue(ns.Seconds(1.0)))
+echoClient.SetAttribute("Interval", ns.TimeValue(ns.Seconds(1)))
 echoClient.SetAttribute("PacketSize", ns.UintegerValue(1024))
 
 clientApps = echoClient.Install(client.Get(0))
-clientApps.Start(ns.Seconds(2.0))
-clientApps.Stop(ns.Seconds(5.0))
+clientApps.Start(ns.Seconds(2))
+clientApps.Stop(ns.Seconds(5))
 
 asciiTrace = ns.AsciiTraceHelper()
 p2p.EnableAsciiAll(asciiTrace.CreateFileStream("briteLeaves.tr"))
 
 # Run the simulator
-ns.Simulator.Stop(ns.Seconds(6.0))
+ns.Simulator.Stop(ns.Seconds(6))
 ns.Simulator.Run()
 ns.Simulator.Destroy()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/brite/examples/brite-MPI-example.cc ns-3.44/src/brite/examples/brite-MPI-example.cc
--- ns-3.43/src/brite/examples/brite-MPI-example.cc	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/brite/examples/brite-MPI-example.cc	2025-03-09 16:55:49.347370900 -0700
@@ -143,8 +143,8 @@
         Address sinkLocalAddress(InetSocketAddress(Ipv4Address::GetAny(), port));
         PacketSinkHelper packetSinkHelper("ns3::TcpSocketFactory", sinkLocalAddress);
         sinkApps.Add(packetSinkHelper.Install(server.Get(0)));
-        sinkApps.Start(Seconds(0.0));
-        sinkApps.Stop(Seconds(10.0));
+        sinkApps.Start(Seconds(0));
+        sinkApps.Stop(Seconds(10));
     }
 
     if (systemId == 0)
@@ -158,8 +158,8 @@
         AddressValue remoteAddress(InetSocketAddress(serverInterfaces.GetAddress(0), port));
         clientHelper.SetAttribute("Remote", remoteAddress);
         clientApps.Add(clientHelper.Install(client.Get(0)));
-        clientApps.Start(Seconds(1.0)); // Start 1 second after sink
-        clientApps.Stop(Seconds(9.0));  // Stop before the sink
+        clientApps.Start(Seconds(1)); // Start 1 second after sink
+        clientApps.Stop(Seconds(9));  // Stop before the sink
     }
 
     if (!nix)
@@ -174,7 +174,7 @@
     }
 
     // Run the simulator
-    Simulator::Stop(Seconds(200.0));
+    Simulator::Stop(Seconds(200));
     Simulator::Run();
     Simulator::Destroy();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/brite/examples/CMakeLists.txt ns-3.44/src/brite/examples/CMakeLists.txt
--- ns-3.43/src/brite/examples/CMakeLists.txt	2024-10-09 16:41:09.848655700 -0700
+++ ns-3.44/src/brite/examples/CMakeLists.txt	2025-03-09 16:55:49.347370900 -0700
@@ -20,6 +20,6 @@
       ${libnix-vector-routing}
       ${libapplications}
       ${libmpi}
-      ${MPI_CXX_LIBRARIES}
+      MPI::MPI_CXX
   )
 endif()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/brite/helper/brite-topology-helper.h ns-3.44/src/brite/helper/brite-topology-helper.h
--- ns-3.43/src/brite/helper/brite-topology-helper.h	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/brite/helper/brite-topology-helper.h	2025-03-09 16:55:49.347370900 -0700
@@ -31,20 +31,20 @@
 class Ipv4AddressHelper;
 
 /**
- * \defgroup brite BRITE Topology Generator
+ * @defgroup brite BRITE Topology Generator
  *
  * Create topologies with BRITE.
  */
 
 /**
- * \ingroup brite
- * \ingroup tests
- * \defgroup brite-tests BRITE module tests
+ * @ingroup brite
+ * @ingroup tests
+ * @defgroup brite-tests BRITE module tests
  */
 
 /**
- * \ingroup brite
- * \brief Interface with BRITE, the Boston university Representative Internet
+ * @ingroup brite
+ * @brief Interface with BRITE, the Boston university Representative Internet
  *        Topology gEnerator
  *
  * This helper class creates an interface with BRITE and allows the user to
@@ -62,16 +62,16 @@
     /**
      * Construct a BriteTopologyHelper
      *
-     * \param confFile a BRITE configuration file
-     * \param seedFile a BRITE seed file
-     * \param newseedFile a BRITE seed file with newly generated values
+     * @param confFile a BRITE configuration file
+     * @param seedFile a BRITE seed file
+     * @param newseedFile a BRITE seed file with newly generated values
      */
     BriteTopologyHelper(std::string confFile, std::string seedFile, std::string newseedFile);
 
     /**
      * Construct a BriteTopologyHelper using NS3 to generate seed values
      * need by BRITE
-     * \param confFile a BRITE configuration file
+     * @param confFile a BRITE configuration file
      */
     BriteTopologyHelper(std::string confFile);
 
@@ -81,14 +81,14 @@
      * Assigns stream number to UniformRandomVariable used to
      * generate brite seed file
      *
-     * \param streamNumber the stream number to assign
+     * @param streamNumber the stream number to assign
      */
     void AssignStreams(int64_t streamNumber);
 
     /**
      * Create NS3 topology using information generated from BRITE.
      *
-     * \param stack Internet stack to assign to nodes in topology
+     * @param stack Internet stack to assign to nodes in topology
      */
     void BuildBriteTopology(InternetStackHelper& stack);
 
@@ -96,49 +96,49 @@
      * Create NS3 topology using information generated from BRITE and configure topology for MPI
      * use.
      *
-     * \param stack Internet stack to assign to nodes in topology.
-     * \param systemCount The number of MPI instances to be used in the simulation.
+     * @param stack Internet stack to assign to nodes in topology.
+     * @param systemCount The number of MPI instances to be used in the simulation.
      */
     void BuildBriteTopology(InternetStackHelper& stack, const uint32_t systemCount);
 
     /**
      * Returns the number of router leaf nodes for a given AS
      *
-     * \param asNum the AS number
-     * \returns the number of leaf nodes in the specified AS
+     * @param asNum the AS number
+     * @returns the number of leaf nodes in the specified AS
      */
     uint32_t GetNLeafNodesForAs(uint32_t asNum);
 
     /**
      * Returns a given router leaf node from a given AS
      *
-     * \param asNum the AS number
-     * \param leafNum the leaf number
-     * \returns the specified node
+     * @param asNum the AS number
+     * @param leafNum the leaf number
+     * @returns the specified node
      */
     Ptr<Node> GetLeafNodeForAs(uint32_t asNum, uint32_t leafNum);
 
     /**
      * Returns the total number of nodes for a given AS
      *
-     * \param asNum the AS number
-     * \returns the total number of nodes in the given AS
+     * @param asNum the AS number
+     * @returns the total number of nodes in the given AS
      */
     uint32_t GetNNodesForAs(uint32_t asNum);
 
     /**
      * Returns a given router node for a given AS
      *
-     * \param asNum the AS number
-     * \param nodeNum the Node number
-     * \return the specified node
+     * @param asNum the AS number
+     * @param nodeNum the Node number
+     * @return the specified node
      */
     Ptr<Node> GetNodeForAs(uint32_t asNum, uint32_t nodeNum);
 
     /**
      * Returns the number of AS created in the topology
      *
-     * \returns the number of AS created in the topology
+     * @returns the number of AS created in the topology
      */
     uint32_t GetNAs() const;
 
@@ -146,16 +146,16 @@
      * Returns the system number for the MPI instance that this AS is assigned to.  Will always
      * return 0 if MPI not used
      *
-     * \returns The system number that the specified AS number belongs to
+     * @returns The system number that the specified AS number belongs to
      *
-     * \param asNum The AS Number
+     * @param asNum The AS Number
      */
     uint32_t GetSystemNumberForAs(uint32_t asNum) const;
 
     /**
      * Assign IPv4 addresses.
      *
-     * \param address an Ipv4AddressHelper which is used to install
+     * @param address an Ipv4AddressHelper which is used to install
      *                IPv4 addresses on all the node interfaces in
      *                the topology
      */
@@ -164,7 +164,7 @@
     /**
      * Assign IPv6 addresses.
      *
-     * \param address an Ipv6AddressHelper which is used to install
+     * @param address an Ipv6AddressHelper which is used to install
      *                IPv6 addresses on all the node interfaces in
      *                the topology
      */
@@ -174,7 +174,7 @@
      * Returns the number of nodes created within
      * the topology
      *
-     * \returns the total number of nodes within the brite topology
+     * @returns the total number of nodes within the brite topology
      */
     uint32_t GetNNodesTopology() const;
 
@@ -182,7 +182,7 @@
      * Returns the number of edges created within
      * the topology
      *
-     * \returns the total number of edges within the brite topology
+     * @returns the total number of edges within the brite topology
      */
     uint32_t GetNEdgesTopology() const;
 
@@ -194,7 +194,7 @@
     static const int mbpsToBps = 1000000;
 
     /**
-     * \brief Node information from BRITE
+     * @brief Node information from BRITE
      *
      * The BRITE code generates a graph and returns
      * information on the nodes generated. This is
@@ -212,7 +212,7 @@
     };
 
     /**
-     * \brief Edge information from BRITE
+     * @brief Edge information from BRITE
      *
      * The BRITE code generates a graph and returns
      * information on the edges generated. This is
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/brite/test/brite-test-topology.cc ns-3.44/src/brite/test/brite-test-topology.cc
--- ns-3.43/src/brite/test/brite-test-topology.cc	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/brite/test/brite-test-topology.cc	2025-03-09 16:55:49.347370900 -0700
@@ -21,9 +21,9 @@
 using namespace ns3;
 
 /**
- * \ingroup brite-tests
+ * @ingroup brite-tests
  *
- * \brief BRITE topology structure Test
+ * @brief BRITE topology structure Test
  *
  * Test that two brite topologies created with same seed value
  * produce same graph (not an exact test)
@@ -90,9 +90,9 @@
 }
 
 /**
- * \ingroup brite-tests
+ * @ingroup brite-tests
  *
- * \brief BRITE topology function Test
+ * @brief BRITE topology function Test
  *
  * Test that packets can be send across a BRITE topology using UDP
  */
@@ -174,19 +174,19 @@
 
     ApplicationContainer apps = onOff.Install(source.Get(0));
 
-    apps.Start(Seconds(1.0));
-    apps.Stop(Seconds(10.0));
+    apps.Start(Seconds(1));
+    apps.Stop(Seconds(10));
 
     PacketSinkHelper sinkHelper("ns3::UdpSocketFactory",
                                 Address(InetSocketAddress(Ipv4Address::GetAny(), port)));
     apps = sinkHelper.Install(sink.Get(0));
 
-    apps.Start(Seconds(1.0));
-    apps.Stop(Seconds(10.0));
+    apps.Start(Seconds(1));
+    apps.Stop(Seconds(10));
 
     Ipv4GlobalRoutingHelper::PopulateRoutingTables();
 
-    Simulator::Stop(Seconds(10.0));
+    Simulator::Stop(Seconds(10));
     Simulator::Run();
 
     Ptr<PacketSink> sink1 = DynamicCast<PacketSink>(apps.Get(0));
@@ -196,9 +196,9 @@
 }
 
 /**
- * \ingroup brite-tests
+ * @ingroup brite-tests
  *
- * \brief BRITE TestSuite
+ * @brief BRITE TestSuite
  */
 class BriteTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/buildings/doc/Makefile ns-3.44/src/buildings/doc/Makefile
--- ns-3.43/src/buildings/doc/Makefile	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/buildings/doc/Makefile	2025-03-09 16:55:49.347370900 -0700
@@ -1,6 +1,6 @@
 EPSTOPDF = epstopdf
 DIA = dia
-CONVERT = convert
+CONVERT = convert -density 300
 
 SOURCE = source
 FIGURES = $(SOURCE)/figures
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/buildings/examples/buildings-pathloss-profiler.cc ns-3.44/src/buildings/examples/buildings-pathloss-profiler.cc
--- ns-3.43/src/buildings/examples/buildings-pathloss-profiler.cc	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/buildings/examples/buildings-pathloss-profiler.cc	2025-03-09 16:55:49.351371000 -0700
@@ -6,13 +6,13 @@
  * Author: Marco Miozzo <marco.miozzo@cttc.es>
  */
 
+#include "ns3/buildings-helper.h"
 #include "ns3/config-store.h"
+#include "ns3/constant-position-mobility-model.h"
 #include "ns3/core-module.h"
+#include "ns3/hybrid-buildings-propagation-loss-model.h"
 #include "ns3/mobility-module.h"
 #include "ns3/network-module.h"
-#include <ns3/buildings-helper.h>
-#include <ns3/constant-position-mobility-model.h>
-#include <ns3/hybrid-buildings-propagation-loss-model.h>
 
 #include <iomanip>
 #include <string>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/buildings/examples/outdoor-group-mobility-example.cc ns-3.44/src/buildings/examples/outdoor-group-mobility-example.cc
--- ns-3.43/src/buildings/examples/outdoor-group-mobility-example.cc	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/buildings/examples/outdoor-group-mobility-example.cc	2025-03-09 16:55:49.351371000 -0700
@@ -50,8 +50,8 @@
 
 #include "ns3/buildings-module.h"
 #include "ns3/core-module.h"
+#include "ns3/mobility-module.h"
 #include "ns3/network-module.h"
-#include <ns3/mobility-module.h>
 
 #include <iostream>
 
@@ -65,7 +65,7 @@
 /**
  * Print the node position to the time series file.
  *
- * \param node The node.
+ * @param node The node.
  */
 void
 PrintPosition(Ptr<Node> node)
@@ -87,7 +87,7 @@
 /**
  * Print the buildings list in a format that can be used by Gnuplot to draw them.
  *
- * \param filename The output filename.
+ * @param filename The output filename.
  */
 void
 PrintGnuplottableBuildingListToFile(std::string filename)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/buildings/examples/outdoor-random-walk-example.cc ns-3.44/src/buildings/examples/outdoor-random-walk-example.cc
--- ns-3.43/src/buildings/examples/outdoor-random-walk-example.cc	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/buildings/examples/outdoor-random-walk-example.cc	2025-03-09 16:55:49.351371000 -0700
@@ -20,7 +20,7 @@
 /**
  * Print the buildings list in a format that can be used by Gnuplot to draw them.
  *
- * \param filename The output filename.
+ * @param filename The output filename.
  */
 void
 PrintGnuplottableBuildingListToFile(std::string filename)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/buildings/helper/building-allocator.h ns-3.44/src/buildings/helper/building-allocator.h
--- ns-3.43/src/buildings/helper/building-allocator.h	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/buildings/helper/building-allocator.h	2025-03-09 16:55:49.351371000 -0700
@@ -24,8 +24,8 @@
 class Building;
 
 /**
- * \ingroup buildings
- * \brief Allocate buildings on a rectangular 2d grid.
+ * @ingroup buildings
+ * @brief Allocate buildings on a rectangular 2d grid.
  *
  * This class allows to create a set of buildings positioned on a
  * rectangular 2D grid. Under the hood, this class uses two instances
@@ -38,25 +38,25 @@
     ~GridBuildingAllocator() override;
 
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
     /**
      * Set an attribute to be used for each new building to be created
      *
-     * \param n attribute name
-     * \param v attribute value
+     * @param n attribute name
+     * @param v attribute value
      */
     void SetBuildingAttribute(std::string n, const AttributeValue& v);
 
     /**
      * Create a set of buildings allocated on a grid
      *
-     * \param n the number of buildings to create
+     * @param n the number of buildings to create
      *
-     * \return the BuildingContainer that contains the newly created buildings
+     * @return the BuildingContainer that contains the newly created buildings
      */
     BuildingContainer Create(uint32_t n) const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/buildings/helper/building-container.h ns-3.44/src/buildings/helper/building-container.h
--- ns-3.43/src/buildings/helper/building-container.h	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/buildings/helper/building-container.h	2025-03-09 16:55:49.351371000 -0700
@@ -10,7 +10,7 @@
 #ifndef BUILDING_CONTAINER_H
 #define BUILDING_CONTAINER_H
 
-#include <ns3/building.h>
+#include "ns3/building.h"
 
 #include <stdint.h>
 #include <vector>
@@ -19,9 +19,9 @@
 {
 
 /**
- * \ingroup buildings
+ * @ingroup buildings
  *
- * \brief keep track of a set of building pointers.
+ * @brief keep track of a set of building pointers.
  *
  * Some ns-3 helpers operate on more than one building at a time.  For example
  * a PositionAllocator may want to position nodes on a set of buildings.
@@ -44,7 +44,7 @@
      * Create a BuildingContainer with exactly one building which has been previously
      * instantiated.  The single Building is specified by a smart pointer.
      *
-     * \param building The Ptr<Building> to add to the container.
+     * @param building The Ptr<Building> to add to the container.
      */
     BuildingContainer(Ptr<Building> building);
 
@@ -53,12 +53,12 @@
      * instantiated and assigned a name using the Object Name Service.  This
      * Building is then specified by its assigned name.
      *
-     * \param buildingName The name of the Building Object to add to the container.
+     * @param buildingName The name of the Building Object to add to the container.
      */
     BuildingContainer(std::string buildingName);
 
     /**
-     * \brief Get an iterator which refers to the first Building in the
+     * @brief Get an iterator which refers to the first Building in the
      * container.
      *
      * Buildings can be retrieved from the container in two ways.  First,
@@ -66,20 +66,20 @@
      * This method is used in the iterator method and is typically used in a
      * for-loop to run through the Buildings
      *
-     * \code
+     * @code
      *   BuildingContainer::Iterator i;
      *   for (i = container.Begin (); i != container.End (); ++i)
      *     {
      *       (*i)->method ();  // some Building method
      *     }
-     * \endcode
+     * @endcode
      *
-     * \returns an iterator which refers to the first Building in the container.
+     * @returns an iterator which refers to the first Building in the container.
      */
     Iterator Begin() const;
 
     /**
-     * \brief Get an iterator which indicates past-the-last Building in the
+     * @brief Get an iterator which indicates past-the-last Building in the
      * container.
      *
      * Buildings can be retrieved from the container in two ways.  First,
@@ -87,20 +87,20 @@
      * This method is used in the iterator method and is typically used in a
      * for-loop to run through the Buildings
      *
-     * \code
+     * @code
      *   BuildingContainer::Iterator i;
      *   for (i = container.Begin (); i != container.End (); ++i)
      *     {
      *       (*i)->method ();  // some Building method
      *     }
-     * \endcode
+     * @endcode
      *
-     * \returns an iterator which indicates an ending condition for a loop.
+     * @returns an iterator which indicates an ending condition for a loop.
      */
     Iterator End() const;
 
     /**
-     * \brief Get the number of Ptr<Building> stored in this container.
+     * @brief Get the number of Ptr<Building> stored in this container.
      *
      * Buildings can be retrieved from the container in two ways.  First,
      * directly by an index into the container, and second, using an iterator.
@@ -108,21 +108,21 @@
      * define an ending condition in a for-loop that runs through the stored
      * Buildings
      *
-     * \code
+     * @code
      *   uint32_t nBuildings = container.GetN ();
      *   for (uint32_t i = 0 i < nBuildings; ++i)
      *     {
      *       Ptr<Building> p = container.Get (i)
      *       i->method ();  // some Building method
      *     }
-     * \endcode
+     * @endcode
      *
-     * \returns the number of Ptr<Building> stored in this container.
+     * @returns the number of Ptr<Building> stored in this container.
      */
     uint32_t GetN() const;
 
     /**
-     * \brief Get the Ptr<Building> stored in this container at a given
+     * @brief Get the Ptr<Building> stored in this container at a given
      * index.
      *
      * Buildings can be retrieved from the container in two ways.  First,
@@ -130,57 +130,57 @@
      * This method is used in the direct method and is used to retrieve the
      * indexed Ptr<Application>.
      *
-     * \code
+     * @code
      *   uint32_t nBuildings = container.GetN ();
      *   for (uint32_t i = 0 i < nBuildings; ++i)
      *     {
      *       Ptr<Building> p = container.Get (i)
      *       i->method ();  // some Building method
      *     }
-     * \endcode
+     * @endcode
      *
-     * \param i the index of the requested building pointer.
-     * \returns the requested building pointer.
+     * @param i the index of the requested building pointer.
+     * @returns the requested building pointer.
      */
     Ptr<Building> Get(uint32_t i) const;
 
     /**
-     * \brief Create n buildings and append pointers to them to the end of this
+     * @brief Create n buildings and append pointers to them to the end of this
      * BuildingContainer.
      *
      * Buildings are at the heart of any ns-3 simulation.  One of the first tasks that
      * any simulation needs to do is to create a number of buildings.  This method
      * automates that task.
      *
-     * \param n The number of Buildings to create
+     * @param n The number of Buildings to create
      */
     void Create(uint32_t n);
 
     /**
-     * \brief Append the contents of another BuildingContainer to the end of
+     * @brief Append the contents of another BuildingContainer to the end of
      * this container.
      *
-     * \param other The BuildingContainer to append.
+     * @param other The BuildingContainer to append.
      */
     void Add(BuildingContainer other);
 
     /**
-     * \brief Append a single Ptr<Building> to this container.
+     * @brief Append a single Ptr<Building> to this container.
      *
-     * \param building The Ptr<Building> to append.
+     * @param building The Ptr<Building> to append.
      */
     void Add(Ptr<Building> building);
 
     /**
-     * \brief Append to this container the single Ptr<Building> referred to
+     * @brief Append to this container the single Ptr<Building> referred to
      * via its object name service registered name.
      *
-     * \param buildingName The name of the Building Object to add to the container.
+     * @param buildingName The name of the Building Object to add to the container.
      */
     void Add(std::string buildingName);
 
     /**
-     * \brief Create a BuildingContainer that contains a list of _all_ buildings
+     * @brief Create a BuildingContainer that contains a list of _all_ buildings
      * stored in the ns3::BuildingList.
      *
      * Whenever a Building is created, a Ptr<Building> is added to a global list of all
@@ -188,7 +188,7 @@
      * buildings in one place.  This method creates a BuildingContainer that is
      * initialized to contain all of the simulation buildings,
      *
-     * \returns a BuildingContainer which contains a list of all Buildings.
+     * @returns a BuildingContainer which contains a list of all Buildings.
      */
     static BuildingContainer GetGlobal();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/buildings/helper/building-position-allocator.cc ns-3.44/src/buildings/helper/building-position-allocator.cc
--- ns-3.43/src/buildings/helper/building-position-allocator.cc	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/buildings/helper/building-position-allocator.cc	2025-03-09 16:55:49.351371000 -0700
@@ -17,12 +17,12 @@
 #include "ns3/double.h"
 #include "ns3/enum.h"
 #include "ns3/log.h"
+#include "ns3/mobility-building-info.h"
 #include "ns3/mobility-model.h"
 #include "ns3/pointer.h"
 #include "ns3/random-variable-stream.h"
 #include "ns3/string.h"
 #include "ns3/uinteger.h"
-#include <ns3/mobility-building-info.h>
 
 #include <cmath>
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/buildings/helper/building-position-allocator.h ns-3.44/src/buildings/helper/building-position-allocator.h
--- ns-3.43/src/buildings/helper/building-position-allocator.h	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/buildings/helper/building-position-allocator.h	2025-03-09 16:55:49.351371000 -0700
@@ -9,10 +9,10 @@
 #ifndef BUILDING_POSITION_ALLOCATOR_H
 #define BUILDING_POSITION_ALLOCATOR_H
 
+#include "ns3/node-container.h"
+#include "ns3/position-allocator.h"
+#include "ns3/ptr.h"
 #include "ns3/random-variable-stream.h"
-#include <ns3/node-container.h>
-#include <ns3/position-allocator.h>
-#include <ns3/ptr.h>
 
 namespace ns3
 {
@@ -21,7 +21,7 @@
 class UniformRandomVariable;
 
 /**
- * \ingroup buildings
+ * @ingroup buildings
  *
  * Allocate each position by randomly choosing a building from the list
  * of all buildings, and then randomly choosing a position inside the building.
@@ -32,8 +32,8 @@
     RandomBuildingPositionAllocator();
 
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
@@ -45,8 +45,8 @@
      * used by this model.  Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream) override;
 
@@ -60,8 +60,8 @@
 };
 
 /**
- * \ingroup buildings
- * \brief allocate outdoor positions
+ * @ingroup buildings
+ * @brief allocate outdoor positions
  *
  * Allocate positions outside of existing buildings using rejection sampling.
  * This class extracts a random position in a box defined by the three
@@ -79,8 +79,8 @@
     OutdoorPositionAllocator();
 
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
@@ -88,18 +88,18 @@
     Vector GetNext() const override;
 
     /**
-     * \brief Set the random variable stream object that generates x-positions
-     * \param x pointer to a RandomVariableStream object
+     * @brief Set the random variable stream object that generates x-positions
+     * @param x pointer to a RandomVariableStream object
      */
     void SetX(Ptr<RandomVariableStream> x);
     /**
-     * \brief Set the random variable stream object that generates y-positions
-     * \param y pointer to a RandomVariableStream object
+     * @brief Set the random variable stream object that generates y-positions
+     * @param y pointer to a RandomVariableStream object
      */
     void SetY(Ptr<RandomVariableStream> y);
     /**
-     * \brief Set the random variable stream object that generates z-positions
-     * \param z pointer to a RandomVariableStream object
+     * @brief Set the random variable stream object that generates z-positions
+     * @param z pointer to a RandomVariableStream object
      */
     void SetZ(Ptr<RandomVariableStream> z);
 
@@ -108,8 +108,8 @@
      * used by this model.  Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream) override;
 
@@ -133,8 +133,8 @@
     RandomRoomPositionAllocator();
 
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
@@ -146,8 +146,8 @@
      * used by this model.  Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream) override;
 
@@ -181,13 +181,13 @@
 
     /**
      * Constructor
-     * \param c Node container
+     * @param c Node container
      */
     SameRoomPositionAllocator(NodeContainer c);
 
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
@@ -199,8 +199,8 @@
      * used by this model.  Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t) override;
 
@@ -222,16 +222,16 @@
     /**
      *
      *
-     * \param x index of the room on the x-axis
-     * \param y index of the room on the y-axis
-     * \param z index of the room on the z-axis (i.e., floor number)
-     * \param b pointer to the chosen building
+     * @param x index of the room on the x-axis
+     * @param y index of the room on the y-axis
+     * @param z index of the room on the z-axis (i.e., floor number)
+     * @param b pointer to the chosen building
      *
      */
     FixedRoomPositionAllocator(uint32_t x, uint32_t y, uint32_t z, Ptr<Building> b);
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
     // inherited from PositionAllocator
@@ -242,8 +242,8 @@
      * used by this model.  Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t) override;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/buildings/helper/buildings-helper.cc ns-3.44/src/buildings/helper/buildings-helper.cc
--- ns-3.43/src/buildings/helper/buildings-helper.cc	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/buildings/helper/buildings-helper.cc	2025-03-09 16:55:49.351371000 -0700
@@ -8,13 +8,13 @@
 
 #include "buildings-helper.h"
 
-#include <ns3/abort.h>
-#include <ns3/building-list.h>
-#include <ns3/building.h>
-#include <ns3/log.h>
-#include <ns3/mobility-building-info.h>
-#include <ns3/mobility-model.h>
-#include <ns3/node-list.h>
+#include "ns3/abort.h"
+#include "ns3/building-list.h"
+#include "ns3/building.h"
+#include "ns3/log.h"
+#include "ns3/mobility-building-info.h"
+#include "ns3/mobility-model.h"
+#include "ns3/node-list.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/buildings/helper/buildings-helper.h ns-3.44/src/buildings/helper/buildings-helper.h
--- ns-3.43/src/buildings/helper/buildings-helper.h	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/buildings/helper/buildings-helper.h	2025-03-09 16:55:49.351371000 -0700
@@ -9,10 +9,10 @@
 #ifndef BUILDINGS_HELPER_H
 #define BUILDINGS_HELPER_H
 
-#include <ns3/attribute.h>
-#include <ns3/node-container.h>
-#include <ns3/object-factory.h>
-#include <ns3/ptr.h>
+#include "ns3/attribute.h"
+#include "ns3/node-container.h"
+#include "ns3/object-factory.h"
+#include "ns3/ptr.h"
 
 #include <string>
 
@@ -23,7 +23,7 @@
 class Building;
 
 /**
- * \ingroup buildings
+ * @ingroup buildings
  *
  * Helper used to install a MobilityBuildingInfo into a set of nodes.
  */
@@ -33,13 +33,13 @@
     /**
      * Install the MobilityBuildingInfo to a node
      *
-     * \param node the mobility model of the node to be updated
+     * @param node the mobility model of the node to be updated
      */
     static void Install(Ptr<Node> node); // for any nodes
     /**
      * Install the MobilityBuildingInfo to the set of nodes in a NodeContainer
      *
-     * \param c the NodeContainer including the nodes to be updated
+     * @param c the NodeContainer including the nodes to be updated
      */
     static void Install(NodeContainer c); // for any nodes
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/buildings/model/building.cc ns-3.44/src/buildings/model/building.cc
--- ns-3.43/src/buildings/model/building.cc	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/buildings/model/building.cc	2025-03-09 16:55:49.351371000 -0700
@@ -12,10 +12,10 @@
 
 #include "building-list.h"
 
-#include <ns3/assert.h>
-#include <ns3/enum.h>
-#include <ns3/log.h>
-#include <ns3/uinteger.h>
+#include "ns3/assert.h"
+#include "ns3/enum.h"
+#include "ns3/log.h"
+#include "ns3/uinteger.h"
 
 #include <cmath>
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/buildings/model/building.h ns-3.44/src/buildings/model/building.h
--- ns-3.43/src/buildings/model/building.h	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/buildings/model/building.h	2025-03-09 16:55:49.351371000 -0700
@@ -9,32 +9,32 @@
 #ifndef BUILDING_H
 #define BUILDING_H
 
-#include <ns3/attribute-helper.h>
-#include <ns3/attribute.h>
-#include <ns3/box.h>
-#include <ns3/object.h>
-#include <ns3/simple-ref-count.h>
-#include <ns3/vector.h>
+#include "ns3/attribute-helper.h"
+#include "ns3/attribute.h"
+#include "ns3/box.h"
+#include "ns3/object.h"
+#include "ns3/simple-ref-count.h"
+#include "ns3/vector.h"
 
 namespace ns3
 {
 
 /**
- * \defgroup buildings Buildings
+ * @defgroup buildings Buildings
  *
  * The models to define 3d buildings, associated channel models, and mobility.
  */
 
 /**
- * \ingroup buildings
- * \brief a 3d building block
+ * @ingroup buildings
+ * @brief a 3d building block
  */
 class Building : public Object
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
     void DoDispose() override;
@@ -63,12 +63,12 @@
     /**
      * Construct a simple building with 1 room and 1 floor
      *
-     * \param xMin x coordinates of left boundary.
-     * \param xMax x coordinates of right boundary.
-     * \param yMin y coordinates of bottom boundary.
-     * \param yMax y coordinates of top boundary.
-     * \param zMin z coordinates of down boundary.
-     * \param zMax z coordinates of up boundary.
+     * @param xMin x coordinates of left boundary.
+     * @param xMax x coordinates of right boundary.
+     * @param yMin y coordinates of bottom boundary.
+     * @param yMax y coordinates of top boundary.
+     * @param zMin z coordinates of down boundary.
+     * @param zMax z coordinates of up boundary.
      *
      */
     Building(double xMin, double xMax, double yMin, double yMax, double zMin, double zMax);
@@ -86,7 +86,7 @@
     ~Building() override;
 
     /**
-     * \return the unique id of this Building. This unique id happens to
+     * @return the unique id of this Building. This unique id happens to
      * be also the index of the Building into the BuildingList.
      */
     uint32_t GetId() const;
@@ -94,19 +94,19 @@
     /**
      * Set the boundaries of the building
      *
-     * \param box the Box defining the boundaries of the building
+     * @param box the Box defining the boundaries of the building
      */
     void SetBoundaries(Box box);
 
     /**
-     * \param t the type of building (i.e., Residential, Office, Commercial)
+     * @param t the type of building (i.e., Residential, Office, Commercial)
      *
      * This method allows to set building type (default is Residential)
      */
     void SetBuildingType(Building::BuildingType_t t);
 
     /**
-     * \param t the type of external walls (i.e., Wood, ConcreteWithWindows,
+     * @param t the type of external walls (i.e., Wood, ConcreteWithWindows,
      * ConcreteWithoutWindows and StoneBlocks), used for evaluating the loss
      * due to the penetration of external walls in outdoor <-> indoor comm.
      *
@@ -115,7 +115,7 @@
     void SetExtWallsType(Building::ExtWallsType_t t);
 
     /**
-     * \param nfloors the number of floors in the building
+     * @param nfloors the number of floors in the building
      *
      * This method allows to set the number of floors in the building
      * (default is 1)
@@ -123,14 +123,14 @@
     void SetNFloors(uint16_t nfloors);
 
     /**
-     * \param nroomx the number of rooms along the x axis
+     * @param nroomx the number of rooms along the x axis
      *
      * This method allows to set the number of rooms along the x-axis
      */
     void SetNRoomsX(uint16_t nroomx);
 
     /**
-     * \param nroomy the number of floors in the building
+     * @param nroomy the number of floors in the building
      *
      * This method allows to set the number of rooms along the y-axis
      */
@@ -138,50 +138,50 @@
 
     /**
      *
-     * \return the boundaries of the building
+     * @return the boundaries of the building
      */
     Box GetBoundaries() const;
 
     /**
-     * \return the type of building
+     * @return the type of building
      */
     BuildingType_t GetBuildingType() const;
 
     /**
-     * \return the type of external walls of the building
+     * @return the type of external walls of the building
      */
     ExtWallsType_t GetExtWallsType() const;
 
     /**
-     * \return the number of floors of the building
+     * @return the number of floors of the building
      */
     uint16_t GetNFloors() const;
 
     /**
-     * \return the number of rooms along the x-axis of the building
+     * @return the number of rooms along the x-axis of the building
      */
     uint16_t GetNRoomsX() const;
 
     /**
-     * \return the number of rooms along the y-axis
+     * @return the number of rooms along the y-axis
      */
     uint16_t GetNRoomsY() const;
 
     /**
      *
      *
-     * \param position some position
+     * @param position some position
      *
-     * \return true if the position fall inside the building, false otherwise
+     * @return true if the position fall inside the building, false otherwise
      */
     bool IsInside(Vector position) const;
 
     /**
      *
      *
-     * \param position a position inside the building
+     * @param position a position inside the building
      *
-     * \return the number of the room along the X axis where the
+     * @return the number of the room along the X axis where the
      * position falls
      */
     uint16_t GetRoomX(Vector position) const;
@@ -189,27 +189,27 @@
     /**
      *
      *
-     * \param position a position inside the building
+     * @param position a position inside the building
      *
-     * \return  the number of the room along the Y axis where the
+     * @return  the number of the room along the Y axis where the
      * position falls
      */
     uint16_t GetRoomY(Vector position) const;
 
     /**
      *
-     * \param position a position inside the building
+     * @param position a position inside the building
      *
-     * \return  the floor where the position falls
+     * @return  the floor where the position falls
      */
     uint16_t GetFloor(Vector position) const;
     /**
-     * \brief Checks if a line-segment between position l1 and position l2
+     * @brief Checks if a line-segment between position l1 and position l2
      *        intersects a building.
      *
-     * \param l1 position
-     * \param l2 position
-     * \return true if there is a intersection, false otherwise
+     * @param l1 position
+     * @param l2 position
+     * @return true if there is a intersection, false otherwise
      */
     bool IsIntersect(const Vector& l1, const Vector& l2) const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/buildings/model/building-list.cc ns-3.44/src/buildings/model/building-list.cc
--- ns-3.43/src/buildings/model/building-list.cc	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/buildings/model/building-list.cc	2025-03-09 16:55:49.351371000 -0700
@@ -23,14 +23,14 @@
 NS_LOG_COMPONENT_DEFINE("BuildingList");
 
 /**
- * \brief private implementation detail of the BuildingList API.
+ * @brief private implementation detail of the BuildingList API.
  */
 class BuildingListPriv : public Object
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
     BuildingListPriv();
@@ -39,37 +39,37 @@
     /**
      * Add a Building to the list.
      *
-     * \param building building to add
-     * \returns index of building in list.
+     * @param building building to add
+     * @returns index of building in list.
      */
     uint32_t Add(Ptr<Building> building);
     /**
      * Returns an iterator to the start of the list.
      *
-     * \returns iterator to the begin of the container.
+     * @returns iterator to the begin of the container.
      */
     BuildingList::Iterator Begin() const;
     /**
      * Returns an iterator to the end of the list.
      *
-     * \returns iterator to the end of the container.
+     * @returns iterator to the end of the container.
      */
     BuildingList::Iterator End() const;
     /**
      * Gets the n-th Building in the container
-     * \param n Building position
-     * \returns a pointer to the Building
+     * @param n Building position
+     * @returns a pointer to the Building
      */
     Ptr<Building> GetBuilding(uint32_t n);
     /**
      * Gets the number of Building in the container
-     * \returns the container size
+     * @returns the container size
      */
     uint32_t GetNBuildings();
 
     /**
      * Get the Singleton instance of BuildingListPriv (or create one)
-     * \return the BuildingListPriv instance
+     * @return the BuildingListPriv instance
      */
     static Ptr<BuildingListPriv> Get();
 
@@ -77,7 +77,7 @@
     void DoDispose() override;
     /**
      * Get the Singleton instance of BuildingListPriv (or create one)
-     * \return the BuildingListPriv instance
+     * @return the BuildingListPriv instance
      */
     static Ptr<BuildingListPriv>* DoGet();
     /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/buildings/model/building-list.h ns-3.44/src/buildings/model/building-list.h
--- ns-3.43/src/buildings/model/building-list.h	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/buildings/model/building-list.h	2025-03-09 16:55:49.351371000 -0700
@@ -21,7 +21,7 @@
 class Building;
 
 /**
- * \ingroup buildings
+ * @ingroup buildings
  *
  * Container for Building class
  */
@@ -32,30 +32,30 @@
     typedef std::vector<Ptr<Building>>::const_iterator Iterator;
 
     /**
-     * \param building building to add
-     * \returns index of building in list.
+     * @param building building to add
+     * @returns index of building in list.
      *
      * This method is called automatically from Building::Building so
      * the user has little reason to call it himself.
      */
     static uint32_t Add(Ptr<Building> building);
     /**
-     * \returns a C++ iterator located at the beginning of this
+     * @returns a C++ iterator located at the beginning of this
      *          list.
      */
     static Iterator Begin();
     /**
-     * \returns a C++ iterator located at the end of this
+     * @returns a C++ iterator located at the end of this
      *          list.
      */
     static Iterator End();
     /**
-     * \param n index of requested building.
-     * \returns the Building associated to index n.
+     * @param n index of requested building.
+     * @returns the Building associated to index n.
      */
     static Ptr<Building> GetBuilding(uint32_t n);
     /**
-     * \returns the number of buildings currently in the list.
+     * @returns the number of buildings currently in the list.
      */
     static uint32_t GetNBuildings();
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/buildings/model/buildings-channel-condition-model.h ns-3.44/src/buildings/model/buildings-channel-condition-model.h
--- ns-3.43/src/buildings/model/buildings-channel-condition-model.h	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/buildings/model/buildings-channel-condition-model.h	2025-03-09 16:55:49.351371000 -0700
@@ -18,10 +18,10 @@
 class MobilityModel;
 
 /**
- * \ingroup buildings
- * \ingroup propagation
+ * @ingroup buildings
+ * @ingroup propagation
  *
- * \brief Determines the channel condition based on the buildings deployed in the
+ * @brief Determines the channel condition based on the buildings deployed in the
  * scenario
  *
  * Code adapted from MmWave3gppBuildingsPropagationLossModel
@@ -31,8 +31,8 @@
   public:
     /**
      * Get the type ID.
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -49,9 +49,9 @@
     /**
      * Computes the condition of the channel between a and b.
      *
-     * \param a mobility model
-     * \param b mobility model
-     * \return the condition of the channel between a and b
+     * @param a mobility model
+     * @param b mobility model
+     * @return the condition of the channel between a and b
      */
     Ptr<ChannelCondition> GetChannelCondition(Ptr<const MobilityModel> a,
                                               Ptr<const MobilityModel> b) const override;
@@ -62,19 +62,19 @@
      * 'stream'. Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream
-     * \return the number of stream indices assigned by this model
+     * @param stream
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream) override;
 
   private:
     /**
-     * \brief Checks if the line of sight between position l1 and position l2 is
+     * @brief Checks if the line of sight between position l1 and position l2 is
      *        blocked by a building.
      *
-     * \param l1 position
-     * \param l2 position
-     * \return true if the line of sight is blocked, false otherwise
+     * @param l1 position
+     * @param l2 position
+     * @return true if the line of sight is blocked, false otherwise
      */
     bool IsLineOfSightBlocked(const Vector& l1, const Vector& l2) const;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/buildings/model/buildings-propagation-loss-model.h ns-3.44/src/buildings/model/buildings-propagation-loss-model.h
--- ns-3.43/src/buildings/model/buildings-propagation-loss-model.h	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/buildings/model/buildings-propagation-loss-model.h	2025-03-09 16:55:49.351371000 -0700
@@ -25,8 +25,8 @@
 class JakesFadingLossModel;
 
 /**
- * \ingroup buildings
- * \ingroup propagation
+ * @ingroup buildings
+ * @ingroup propagation
  *
  *  This model provides means for simulating the following propagation
  *  phenomena in the presence of buildings:
@@ -38,7 +38,7 @@
  *  The distance-dependent component of propagation loss is deferred
  *  to derived classes which are expected to implement the GetLoss method.
  *
- *  \warning This model works only when MobilityBuildingInfo is aggreegated
+ *  @warning This model works only when MobilityBuildingInfo is aggreegated
  *  to the mobility model
  *
  */
@@ -47,16 +47,16 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
     BuildingsPropagationLossModel();
     /**
-     * \param a the mobility model of the source
-     * \param b the mobility model of the destination
-     * \returns the propagation loss (in dBm)
+     * @param a the mobility model of the source
+     * @param b the mobility model of the destination
+     * @returns the propagation loss (in dBm)
      */
     virtual double GetLoss(Ptr<MobilityModel> a, Ptr<MobilityModel> b) const = 0;
 
@@ -68,36 +68,36 @@
   protected:
     /**
      * Calculate the external wall loss
-     * \param a Building data
-     * \returns the propagation loss (in dBm)
+     * @param a Building data
+     * @returns the propagation loss (in dBm)
      */
     double ExternalWallLoss(Ptr<MobilityBuildingInfo> a) const;
     /**
      * Calculate the height loss
-     * \param n Building data
-     * \returns the propagation loss (in dBm)
+     * @param n Building data
+     * @returns the propagation loss (in dBm)
      */
     double HeightLoss(Ptr<MobilityBuildingInfo> n) const;
     /**
      * Calculate the internal wall loss
-     * \param a Room A data
-     * \param b Room B data
-     * \returns the propagation loss (in dBm)
+     * @param a Room A data
+     * @param b Room B data
+     * @returns the propagation loss (in dBm)
      */
     double InternalWallsLoss(Ptr<MobilityBuildingInfo> a, Ptr<MobilityBuildingInfo> b) const;
 
     /**
      * Calculate the shadowing loss
-     * \param a Room A data
-     * \param b Room B data
-     * \returns the propagation loss (in dBm)
+     * @param a Room A data
+     * @param b Room B data
+     * @returns the propagation loss (in dBm)
      */
     double GetShadowing(Ptr<MobilityModel> a, Ptr<MobilityModel> b) const;
 
     double m_lossInternalWall; //!< loss from internal walls (in dBm)
 
     /**
-     * \ingroup propagation
+     * @ingroup propagation
      *
      * This model allows the computation of shadowing loss
      */
@@ -107,16 +107,16 @@
         ShadowingLoss();
         /**
          * Constructor
-         * \param shadowingValue Value for shadowing
-         * \param receiver Receiver position
+         * @param shadowingValue Value for shadowing
+         * @param receiver Receiver position
          */
         ShadowingLoss(double shadowingValue, Ptr<MobilityModel> receiver);
         /**
-         * \returns the loss (in dBm)
+         * @returns the loss (in dBm)
          */
         double GetLoss() const;
         /**
-         * \returns the receiver mobility model
+         * @returns the receiver mobility model
          */
         Ptr<MobilityModel> GetReceiver() const;
 
@@ -130,9 +130,9 @@
         m_shadowingLossMap;
     /**
      * Calculate the Standard deviation of the normal distribution used to calculate the shadowing
-     * \param a Room A data
-     * \param b Room B data
-     * \return the Standard deviation of the normal distribution
+     * @param a Room A data
+     * @param b Room B data
+     * @return the Standard deviation of the normal distribution
      */
     double EvaluateSigma(Ptr<MobilityBuildingInfo> a, Ptr<MobilityBuildingInfo> b) const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/buildings/model/hybrid-buildings-propagation-loss-model.h ns-3.44/src/buildings/model/hybrid-buildings-propagation-loss-model.h
--- ns-3.43/src/buildings/model/hybrid-buildings-propagation-loss-model.h	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/buildings/model/hybrid-buildings-propagation-loss-model.h	2025-03-09 16:55:49.351371000 -0700
@@ -13,7 +13,7 @@
 
 #include "buildings-propagation-loss-model.h"
 
-#include <ns3/propagation-environment.h>
+#include "ns3/propagation-environment.h"
 
 namespace ns3
 {
@@ -25,10 +25,10 @@
 class Kun2600MhzPropagationLossModel;
 
 /**
- * \ingroup buildings
- * \ingroup propagation
+ * @ingroup buildings
+ * @ingroup propagation
  *
- * \brief The HybridBuildingsPropagationModel is a compound of different models able to evaluate
+ * @brief The HybridBuildingsPropagationModel is a compound of different models able to evaluate
  * the pathloss from 200 to 2600 MHz, in different environments and with buildings (i.e., indoor and
  * outdoor communications).
  *
@@ -42,7 +42,7 @@
  *  - Building penetretation loss
  *  - floors, etc...
  *
- *  \warning This model works only with MobilityBuildingInfo
+ *  @warning This model works only with MobilityBuildingInfo
  *
  */
 
@@ -50,8 +50,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
     HybridBuildingsPropagationLossModel();
@@ -60,38 +60,38 @@
     /**
      * set the environment type
      *
-     * \param env
+     * @param env
      */
     void SetEnvironment(EnvironmentType env);
 
     /**
      * set the size of the city
      *
-     * \param size
+     * @param size
      */
     void SetCitySize(CitySize size);
 
     /**
      * set the propagation frequency
      *
-     * \param freq
+     * @param freq
      */
     void SetFrequency(double freq);
 
     /**
      * set the rooftop height
      *
-     * \param rooftopHeight
+     * @param rooftopHeight
      */
     void SetRooftopHeight(double rooftopHeight);
 
     /**
-     * \brief Compute the path loss according to the nodes position
+     * @brief Compute the path loss according to the nodes position
      * using the appropriate model.
      *
-     * \param a the mobility model of the source
-     * \param b the mobility model of the destination
-     * \returns the propagation loss (in dBm)
+     * @param a the mobility model of the source
+     * @param b the mobility model of the destination
+     * @returns the propagation loss (in dBm)
      */
     double GetLoss(Ptr<MobilityModel> a, Ptr<MobilityModel> b) const override;
 
@@ -100,26 +100,26 @@
      * Compute the path loss using either OkumuraHataPropagationLossModel
      * or Kun2600MhzPropagationLossModel.
      *
-     * \param a The mobility model of the source.
-     * \param b The mobility model of the destination.
-     * \returns the propagation loss (in dBm).
+     * @param a The mobility model of the source.
+     * @param b The mobility model of the destination.
+     * @returns the propagation loss (in dBm).
      */
     double OkumuraHata(Ptr<MobilityModel> a, Ptr<MobilityModel> b) const;
     /**
      * Compute the path loss using either ItuR1411LosPropagationLossModel or
      * ItuR1411NlosOverRooftopPropagationLossModel.
      *
-     * \param a The mobility model of the source.
-     * \param b The mobility model of the destination.
-     * \returns the propagation loss (in dBm).
+     * @param a The mobility model of the source.
+     * @param b The mobility model of the destination.
+     * @returns the propagation loss (in dBm).
      */
     double ItuR1411(Ptr<MobilityModel> a, Ptr<MobilityModel> b) const;
     /**
      * Compute the path loss using ItuR1238PropagationLossModel.
      *
-     * \param a The mobility model of the source.
-     * \param b The mobility model of the destination.
-     * \returns the propagation loss (in dBm).
+     * @param a The mobility model of the source.
+     * @param b The mobility model of the destination.
+     * @returns the propagation loss (in dBm).
      */
     double ItuR1238(Ptr<MobilityModel> a, Ptr<MobilityModel> b) const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/buildings/model/itu-r-1238-propagation-loss-model.h ns-3.44/src/buildings/model/itu-r-1238-propagation-loss-model.h
--- ns-3.43/src/buildings/model/itu-r-1238-propagation-loss-model.h	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/buildings/model/itu-r-1238-propagation-loss-model.h	2025-03-09 16:55:49.351371000 -0700
@@ -11,15 +11,15 @@
 #ifndef ITU_R_1238_PROPAGATION_LOSS_MODEL_H
 #define ITU_R_1238_PROPAGATION_LOSS_MODEL_H
 
-#include <ns3/propagation-environment.h>
-#include <ns3/propagation-loss-model.h>
+#include "ns3/propagation-environment.h"
+#include "ns3/propagation-loss-model.h"
 
 namespace ns3
 {
 
 /**
- * \ingroup buildings
- * \ingroup propagation
+ * @ingroup buildings
+ * @ingroup propagation
  *
  * This class implements the ITU-R 1238 propagation loss model.
  *
@@ -28,18 +28,18 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
     /**
      *
      *
-     * \param a the first mobility model
-     * \param b the second mobility model
+     * @param a the first mobility model
+     * @param b the second mobility model
      *
-     * \return the loss in dBm for the propagation between
+     * @return the loss in dBm for the propagation between
      * the two given mobility models
      */
     double GetLoss(Ptr<MobilityModel> a, Ptr<MobilityModel> b) const;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/buildings/model/mobility-building-info.cc ns-3.44/src/buildings/model/mobility-building-info.cc
--- ns-3.43/src/buildings/model/mobility-building-info.cc	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/buildings/model/mobility-building-info.cc	2025-03-09 16:55:49.351371000 -0700
@@ -11,11 +11,11 @@
 
 #include "building-list.h"
 
-#include <ns3/assert.h>
-#include <ns3/log.h>
-#include <ns3/pointer.h>
-#include <ns3/position-allocator.h>
-#include <ns3/simulator.h>
+#include "ns3/assert.h"
+#include "ns3/log.h"
+#include "ns3/pointer.h"
+#include "ns3/position-allocator.h"
+#include "ns3/simulator.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/buildings/model/mobility-building-info.h ns-3.44/src/buildings/model/mobility-building-info.h
--- ns-3.43/src/buildings/model/mobility-building-info.h	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/buildings/model/mobility-building-info.h	2025-03-09 16:55:49.351371000 -0700
@@ -11,12 +11,12 @@
 
 #include "building.h"
 
-#include <ns3/box.h>
-#include <ns3/constant-velocity-helper.h>
-#include <ns3/mobility-model.h>
-#include <ns3/object.h>
-#include <ns3/ptr.h>
-#include <ns3/simple-ref-count.h>
+#include "ns3/box.h"
+#include "ns3/constant-velocity-helper.h"
+#include "ns3/mobility-model.h"
+#include "ns3/object.h"
+#include "ns3/ptr.h"
+#include "ns3/simple-ref-count.h"
 
 #include <map>
 
@@ -24,10 +24,10 @@
 {
 
 /**
- * \ingroup buildings
- * \ingroup mobility
+ * @ingroup buildings
+ * @ingroup mobility
 
- * \brief mobility buildings information (to be used by mobility models)
+ * @brief mobility buildings information (to be used by mobility models)
  *
  * This model implements the management of scenarios where users might be
  * either indoor (e.g., houses, offices, etc.) and outdoor.
@@ -37,91 +37,91 @@
 {
   public:
     /**
-     * \brief Get the type ID.
+     * @brief Get the type ID.
      *
-     * \return the object TypeId
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     MobilityBuildingInfo();
 
     /**
-     * \brief Parameterized constructor
+     * @brief Parameterized constructor
      *
-     * \param building The building in which the MobilityBuildingInfo instance would be placed
+     * @param building The building in which the MobilityBuildingInfo instance would be placed
      */
     MobilityBuildingInfo(Ptr<Building> building);
 
     /**
-     * \brief Is indoor method.
+     * @brief Is indoor method.
      *
-     * \return true if the MobilityBuildingInfo instance is indoor, false otherwise
+     * @return true if the MobilityBuildingInfo instance is indoor, false otherwise
      */
     bool IsIndoor();
 
     /**
-     * \brief Mark this MobilityBuildingInfo instance as indoor
+     * @brief Mark this MobilityBuildingInfo instance as indoor
      *
-     * \param building the building into which the MobilityBuildingInfo instance is located
-     * \param nfloor the floor number 1...nFloors at which the MobilityBuildingInfo instance
+     * @param building the building into which the MobilityBuildingInfo instance is located
+     * @param nfloor the floor number 1...nFloors at which the MobilityBuildingInfo instance
      * is located
-     * \param nroomx the X room number 1...nRoomsX at which the MobilityBuildingInfo instance
+     * @param nroomx the X room number 1...nRoomsX at which the MobilityBuildingInfo instance
      * is located
-     * \param nroomy the Y room number 1...nRoomsY at which the MobilityBuildingInfo instance
+     * @param nroomy the Y room number 1...nRoomsY at which the MobilityBuildingInfo instance
      * is located
      */
     void SetIndoor(Ptr<Building> building, uint8_t nfloor, uint8_t nroomx, uint8_t nroomy);
 
     /**
-     * \brief Mark this MobilityBuildingInfo instance as indoor
+     * @brief Mark this MobilityBuildingInfo instance as indoor
      *
-     * \param nfloor the floor number 1...nFloors at which the MobilityBuildingInfo instance
+     * @param nfloor the floor number 1...nFloors at which the MobilityBuildingInfo instance
      * is located
-     * \param nroomx the X room number 1...nRoomsX at which the MobilityBuildingInfo instance
+     * @param nroomx the X room number 1...nRoomsX at which the MobilityBuildingInfo instance
      * is located
-     * \param nroomy the Y room number 1...nRoomsY at which the MobilityBuildingInfo instance
+     * @param nroomy the Y room number 1...nRoomsY at which the MobilityBuildingInfo instance
      * is located
      */
 
     void SetIndoor(uint8_t nfloor, uint8_t nroomx, uint8_t nroomy);
 
     /**
-     * \brief Mark this MobilityBuildingInfo instance as outdoor
+     * @brief Mark this MobilityBuildingInfo instance as outdoor
      */
     void SetOutdoor();
 
     /**
-     * \brief Get the floor number at which the MobilityBuildingInfo instance is located
+     * @brief Get the floor number at which the MobilityBuildingInfo instance is located
      *
-     * \return The floor number
+     * @return The floor number
      */
     uint8_t GetFloorNumber();
 
     /**
-     * \brief Get the room number along x-axis at which the MobilityBuildingInfo instance is located
+     * @brief Get the room number along x-axis at which the MobilityBuildingInfo instance is located
      *
-     * \return The room number
+     * @return The room number
      */
     uint8_t GetRoomNumberX();
 
     /**
-     * \brief Get the room number along y-axis at which the MobilityBuildingInfo instance is located
+     * @brief Get the room number along y-axis at which the MobilityBuildingInfo instance is located
      *
-     * \return The room number
+     * @return The room number
      */
     uint8_t GetRoomNumberY();
 
     /**
-     * \brief Get the building in which the MobilityBuildingInfo instance is located
+     * @brief Get the building in which the MobilityBuildingInfo instance is located
      *
-     * \return The building in which the MobilityBuildingInfo instance is located
+     * @return The building in which the MobilityBuildingInfo instance is located
      */
     Ptr<Building> GetBuilding();
     /**
-     * \brief Make the given mobility model consistent, by determining whether
+     * @brief Make the given mobility model consistent, by determining whether
      * its position falls inside any of the building in BuildingList, and
      * updating accordingly the BuildingInfo aggregated with the MobilityModel.
      *
-     * \param mm the mobility model to be made consistent
+     * @param mm the mobility model to be made consistent
      */
     void MakeConsistent(Ptr<MobilityModel> mm);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/buildings/model/oh-buildings-propagation-loss-model.h ns-3.44/src/buildings/model/oh-buildings-propagation-loss-model.h
--- ns-3.43/src/buildings/model/oh-buildings-propagation-loss-model.h	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/buildings/model/oh-buildings-propagation-loss-model.h	2025-03-09 16:55:49.351371000 -0700
@@ -18,29 +18,29 @@
 class OkumuraHataPropagationLossModel;
 
 /**
- * \ingroup buildings
- * \ingroup propagation
+ * @ingroup buildings
+ * @ingroup propagation
  *
  *  this model combines the OkumuraHata model with the BuildingsPropagationLossModel
  *
- *  \warning This model works with MobilityBuildingInfo only
+ *  @warning This model works with MobilityBuildingInfo only
  *
  */
 class OhBuildingsPropagationLossModel : public BuildingsPropagationLossModel
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
     OhBuildingsPropagationLossModel();
     ~OhBuildingsPropagationLossModel() override;
 
     /**
-     * \param a the mobility model of the source
-     * \param b the mobility model of the destination
-     * \returns the propagation loss (in dBm)
+     * @param a the mobility model of the source
+     * @param b the mobility model of the destination
+     * @returns the propagation loss (in dBm)
      */
     double GetLoss(Ptr<MobilityModel> a, Ptr<MobilityModel> b) const override;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/buildings/model/random-walk-2d-outdoor-mobility-model.cc ns-3.44/src/buildings/model/random-walk-2d-outdoor-mobility-model.cc
--- ns-3.43/src/buildings/model/random-walk-2d-outdoor-mobility-model.cc	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/buildings/model/random-walk-2d-outdoor-mobility-model.cc	2025-03-09 16:55:49.351371000 -0700
@@ -45,7 +45,7 @@
                           MakeRectangleChecker())
             .AddAttribute("Time",
                           "Change current direction and speed after moving for this delay.",
-                          TimeValue(Seconds(20.0)),
+                          TimeValue(Seconds(20)),
                           MakeTimeAccessor(&RandomWalk2dOutdoorMobilityModel::m_modeTime),
                           MakeTimeChecker())
             .AddAttribute("Distance",
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/buildings/model/random-walk-2d-outdoor-mobility-model.h ns-3.44/src/buildings/model/random-walk-2d-outdoor-mobility-model.h
--- ns-3.43/src/buildings/model/random-walk-2d-outdoor-mobility-model.h	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/buildings/model/random-walk-2d-outdoor-mobility-model.h	2025-03-09 16:55:49.351371000 -0700
@@ -25,10 +25,10 @@
 {
 
 /**
- * \ingroup buildings
- * \ingroup mobility
+ * @ingroup buildings
+ * @ingroup mobility
  *
- * \brief 2D random walk mobility model which avoids buildings.
+ * @brief 2D random walk mobility model which avoids buildings.
  *
  * This class reuses most of the code of RandomWalk2dMobilityModel,
  * but adds the awareness of buildings objects which are avoided
@@ -50,7 +50,7 @@
   public:
     /**
      * Register this type with the TypeId system.
-     * \return the object TypeId
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -63,20 +63,20 @@
 
   private:
     /**
-     * \brief Performs the rebound of the node if it reaches a boundary
-     * \param timeLeft The remaining time of the walk
+     * @brief Performs the rebound of the node if it reaches a boundary
+     * @param timeLeft The remaining time of the walk
      */
     void Rebound(Time timeLeft);
     /**
-     * \brief Avoid a building
-     * \param delayLeft The remaining time of the walk
-     * \param intersectPosition The position at which the building is intersected
+     * @brief Avoid a building
+     * @param delayLeft The remaining time of the walk
+     * @param intersectPosition The position at which the building is intersected
      */
     void AvoidBuilding(Time delayLeft, Vector intersectPosition);
     /**
      * Walk according to position and velocity, until distance is reached,
      * time is reached, or intersection with the bounding box, or building
-     * \param delayLeft The remaining time of the walk
+     * @param delayLeft The remaining time of the walk
      */
     void DoWalk(Time delayLeft);
     /**
@@ -87,9 +87,9 @@
      * Check if there is a building between two positions (or if the nextPosition is inside a
      * building). The code is taken from MmWave3gppBuildingsPropagationLossModel from the NYU/UNIPD
      * ns-3 mmWave module
-     * \param currentPosition The current position of the node
-     * \param nextPosition The position to check
-     * \return a pair with a boolean (true if the line between the two position does not intersect
+     * @param currentPosition The current position of the node
+     * @param nextPosition The position to check
+     * @return a pair with a boolean (true if the line between the two position does not intersect
      * building), and a pointer which is 0 if the boolean is true, or it points to the building
      * which is intersected
      */
@@ -98,10 +98,10 @@
     /**
      * Compute the intersecting point of the box represented by boundaries and the line between
      * current and next. Notice that we only consider a 2d plane.
-     * \param current The current position
-     * \param next The next position
-     * \param boundaries The boundaries of the building we will intersect
-     * \return a vector with the position of the intersection
+     * @param current The current position
+     * @param next The next position
+     * @param boundaries The boundaries of the building we will intersect
+     * @return a vector with the position of the intersection
      */
     Vector CalculateIntersectionFromOutside(const Vector& current,
                                             const Vector& next,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/buildings/model/three-gpp-v2v-channel-condition-model.h ns-3.44/src/buildings/model/three-gpp-v2v-channel-condition-model.h
--- ns-3.43/src/buildings/model/three-gpp-v2v-channel-condition-model.h	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/buildings/model/three-gpp-v2v-channel-condition-model.h	2025-03-09 16:55:49.351371000 -0700
@@ -21,10 +21,10 @@
 class MobilityModel;
 
 /**
- * \ingroup buildings
- * \ingroup propagation
+ * @ingroup buildings
+ * @ingroup propagation
  *
- * \brief Computes the channel condition for the V2V Urban scenario
+ * @brief Computes the channel condition for the V2V Urban scenario
  *
  * Computes the channel condition following the specifications for the
  * V2V Urban scenario reported in Table 6.2-1 of 3GPP TR 37.885.
@@ -43,8 +43,8 @@
   public:
     /**
      * Get the type ID.
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -63,9 +63,9 @@
      * Compute the LOS probability as specified in Table Table 6.2-1 of 3GPP TR 37.885
      * for the V2V Urban scenario.
      *
-     * \param a tx mobility model
-     * \param b rx mobility model
-     * \return the LOS probability
+     * @param a tx mobility model
+     * @param b rx mobility model
+     * @return the LOS probability
      */
     double ComputePlos(Ptr<const MobilityModel> a, Ptr<const MobilityModel> b) const override;
 
@@ -74,9 +74,9 @@
      * between the tx and the rx based on the buildings deployed in the scenario.
      * It returns 1 if the LOS path is obstructed, 0 otherwise.
      *
-     * \param a tx mobility model
-     * \param b rx mobility model
-     * \return the NLOS probability
+     * @param a tx mobility model
+     * @param b rx mobility model
+     * @return the NLOS probability
      */
     double ComputePnlos(Ptr<const MobilityModel> a, Ptr<const MobilityModel> b) const override;
 
@@ -85,9 +85,9 @@
 };
 
 /**
- * \ingroup buildings
+ * @ingroup buildings
  *
- * \brief Computes the channel condition for the V2V Highway scenario
+ * @brief Computes the channel condition for the V2V Highway scenario
  *
  * Computes the channel condition following the specifications for the
  * V2V Highway scenario reported in Table 6.2-1 of 3GPP TR 37.885.
@@ -106,8 +106,8 @@
   public:
     /**
      * Get the type ID.
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -126,9 +126,9 @@
      * Compute the LOS probability as specified in Table Table 6.2-1 of 3GPP TR 37.885
      * for the V2V Highway scenario.
      *
-     * \param a tx mobility model
-     * \param b rx mobility model
-     * \return the LOS probability
+     * @param a tx mobility model
+     * @param b rx mobility model
+     * @return the LOS probability
      */
     double ComputePlos(Ptr<const MobilityModel> a, Ptr<const MobilityModel> b) const override;
 
@@ -137,22 +137,22 @@
      * between the tx and the rx based on the buildings deployed in the scenario.
      * It returns 1 if the LOS path is obstructed, 0 otherwise.
      *
-     * \param a tx mobility model
-     * \param b rx mobility model
-     * \return the NLOS probability
+     * @param a tx mobility model
+     * @param b rx mobility model
+     * @return the NLOS probability
      */
     double ComputePnlos(Ptr<const MobilityModel> a, Ptr<const MobilityModel> b) const override;
 
     /**
-     * \brief The callback which is hooked to a method to compute channel condition.
+     * @brief The callback which is hooked to a method to compute channel condition.
      *
      * This callback is implemented to make this model robust against the
      * presence and absence of buildings in a highway scenario. If there are
      * buildings in a scenario, this model will use
-     * \link BuildingsChannelConditionModel \endlink, which requires
-     * \link MobilityBuildingInfo \endlink aggregated to the nodes to compute
+     * @link BuildingsChannelConditionModel \endlink, which requires
+     * @link MobilityBuildingInfo \endlink aggregated to the nodes to compute
      * LOS and NLOS. Otherwise, the callback is hooked to a local method
-     * \link GetChCondWithNoBuildings \endlink
+     * @link GetChCondWithNoBuildings \endlink
      * , which construct the ChannelCondtion object and set the condition to
      * outdoor to outdoor with LOS.
      */
@@ -160,39 +160,39 @@
         ComputeChCond;
 
     /**
-     * \brief Get the channel condition and redirect the callback
-     * \link ComputeChCond \endlink to \link GetChCondWithBuildings \endlink
+     * @brief Get the channel condition and redirect the callback
+     * @link ComputeChCond \endlink to @link GetChCondWithBuildings \endlink
      * or to \link GetChCondWithNoBuildings \endlink depending on if there are
      * buildings in the scenario or not.
      *
-     * \param a tx mobility model
-     * \param b rx mobility model
-     * \return the the condition of the channel between \p a and \p b
+     * @param a tx mobility model
+     * @param b rx mobility model
+     * @return the the condition of the channel between \p a and \p b
      */
     Ptr<ChannelCondition> GetChCondAndFixCallback(Ptr<const MobilityModel> a,
                                                   Ptr<const MobilityModel> b);
 
     /**
-     * \brief Get the channel condition between \p a and \p b
+     * @brief Get the channel condition between \p a and \p b
      *        using BuildingsChannelConditionModel.
      *
      * This method will be called for the scenarios with buildings
      *
-     * \param a tx mobility model
-     * \param b rx mobility model
-     * \return the condition of the channel between \p a and \p b
+     * @param a tx mobility model
+     * @param b rx mobility model
+     * @return the condition of the channel between \p a and \p b
      */
     Ptr<ChannelCondition> GetChCondWithBuildings(Ptr<const MobilityModel> a,
                                                  Ptr<const MobilityModel> b) const;
 
     /**
-     * \brief Get the channel condition between \p a and \p b
+     * @brief Get the channel condition between \p a and \p b
      *
      * This method will be called for the scenarios without buildings
      *
-     * \param a tx mobility model
-     * \param b rx mobility model
-     * \return the condition of the channel between \p a and \p b
+     * @param a tx mobility model
+     * @param b rx mobility model
+     * @return the condition of the channel between \p a and \p b
      */
     Ptr<ChannelCondition> GetChCondWithNoBuildings(Ptr<const MobilityModel> a,
                                                    Ptr<const MobilityModel> b) const;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/buildings/test/building-position-allocator-test.cc ns-3.44/src/buildings/test/building-position-allocator-test.cc
--- ns-3.43/src/buildings/test/building-position-allocator-test.cc	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/buildings/test/building-position-allocator-test.cc	2025-03-09 16:55:49.351371000 -0700
@@ -6,16 +6,16 @@
  * Author: Nicola Baldo <nbaldo@cttc.es>
  */
 
+#include "ns3/building-position-allocator.h"
+#include "ns3/building.h"
+#include "ns3/buildings-helper.h"
+#include "ns3/constant-position-mobility-model.h"
 #include "ns3/log.h"
+#include "ns3/mobility-building-info.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/mobility-model.h"
+#include "ns3/simulator.h"
 #include "ns3/test.h"
-#include <ns3/building-position-allocator.h>
-#include <ns3/building.h>
-#include <ns3/buildings-helper.h>
-#include <ns3/constant-position-mobility-model.h>
-#include <ns3/mobility-building-info.h>
-#include <ns3/mobility-helper.h>
-#include <ns3/mobility-model.h>
-#include <ns3/simulator.h>
 
 #include <map>
 
@@ -24,13 +24,13 @@
 NS_LOG_COMPONENT_DEFINE("BuildingPositionAllocatorTest");
 
 /**
- * \ingroup buildings
- * \ingroup tests
- * \defgroup building-test Buildings module tests
+ * @ingroup buildings
+ * @ingroup tests
+ * @defgroup building-test Buildings module tests
  */
 
 /**
- * \ingroup building-test
+ * @ingroup building-test
  *
  * Room coordinates
  */
@@ -38,9 +38,9 @@
 {
     /**
      * Constructor
-     * \param xx X coord
-     * \param yy Y coord
-     * \param zz Z coord
+     * @param xx X coord
+     * @param yy Y coord
+     * @param zz Z coord
      */
     Room(uint32_t xx, uint32_t yy, uint32_t zz);
     uint32_t x; //!< X coord
@@ -63,7 +63,7 @@
 }
 
 /**
- * \ingroup building-test
+ * @ingroup building-test
  *
  * RandomRoomPositionAllocator test
  */
@@ -140,7 +140,7 @@
 }
 
 /**
- * \ingroup building-test
+ * @ingroup building-test
  *
  * SameRoomPositionAllocator test
  */
@@ -213,9 +213,9 @@
 }
 
 /**
- * \ingroup building-test
+ * @ingroup building-test
  *
- * \brief RandomRoomPositionAllocator TestSuite
+ * @brief RandomRoomPositionAllocator TestSuite
  */
 class BuildingPositionAllocatorTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/buildings/test/buildings-channel-condition-model-test.cc ns-3.44/src/buildings/test/buildings-channel-condition-model-test.cc
--- ns-3.43/src/buildings/test/buildings-channel-condition-model-test.cc	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/buildings/test/buildings-channel-condition-model-test.cc	2025-03-09 16:55:49.351371000 -0700
@@ -19,7 +19,7 @@
 NS_LOG_COMPONENT_DEFINE("BuildingsChannelConditionModelsTest");
 
 /**
- * \ingroup building-test
+ * @ingroup building-test
  *
  * Test case for the class BuildingsChannelConditionModel. It checks if the
  * channel condition is correctly determined when a building is deployed in the
@@ -135,7 +135,7 @@
 }
 
 /**
- * \ingroup building-test
+ * @ingroup building-test
  * Test suite for the buildings channel condition model
  */
 class BuildingsChannelConditionModelsTestSuite : public TestSuite
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/buildings/test/buildings-helper-test.cc ns-3.44/src/buildings/test/buildings-helper-test.cc
--- ns-3.43/src/buildings/test/buildings-helper-test.cc	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/buildings/test/buildings-helper-test.cc	2025-03-09 16:55:49.351371000 -0700
@@ -6,23 +6,23 @@
  * Author: Nicola Baldo <nbaldo@cttc.es>
  */
 
+#include "ns3/building.h"
+#include "ns3/buildings-helper.h"
+#include "ns3/constant-position-mobility-model.h"
 #include "ns3/log.h"
+#include "ns3/mobility-building-info.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/simulator.h"
 #include "ns3/test.h"
-#include <ns3/building.h>
-#include <ns3/buildings-helper.h>
-#include <ns3/constant-position-mobility-model.h>
-#include <ns3/mobility-building-info.h>
-#include <ns3/mobility-helper.h>
-#include <ns3/simulator.h>
 
 using namespace ns3;
 
 NS_LOG_COMPONENT_DEFINE("BuildingsHelperTest");
 
 /**
- * \ingroup building-test
+ * @ingroup building-test
  *
- * \brief Struct representing a position in a building
+ * @brief Struct representing a position in a building
  */
 struct PositionInBuilding
 {
@@ -46,7 +46,7 @@
 }
 
 /**
- * \ingroup building-test
+ * @ingroup building-test
 
  * Data to construct a Building object. We don't want to pass Building
  * objects to the TestCase constructor because otherwise BuildingList
@@ -82,25 +82,25 @@
 }
 
 /**
- * \ingroup building-test
+ * @ingroup building-test
  *
- * \brief BuildingsHelper test
+ * @brief BuildingsHelper test
  */
 class BuildingsHelperOneTestCase : public TestCase
 {
   public:
     /**
      * Build the testcase name
-     * \param pib Position in building
-     * \param bd Building data
-     * \return the TestCase name
+     * @param pib Position in building
+     * @param bd Building data
+     * @return the TestCase name
      */
     static std::string BuildNameString(PositionInBuilding pib, BuildingData bd);
 
     /**
      * Constructor
-     * \param pib Position in building
-     * \param bd Building data
+     * @param pib Position in building
+     * @param bd Building data
      */
     BuildingsHelperOneTestCase(PositionInBuilding pib, BuildingData bd);
 
@@ -182,9 +182,9 @@
 }
 
 /**
- * \ingroup building-test
+ * @ingroup building-test
  *
- * \brief BuildingsHelper TestSuite
+ * @brief BuildingsHelper TestSuite
  */
 class BuildingsHelperTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/buildings/test/buildings-pathloss-test.cc ns-3.44/src/buildings/test/buildings-pathloss-test.cc
--- ns-3.43/src/buildings/test/buildings-pathloss-test.cc	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/buildings/test/buildings-pathloss-test.cc	2025-03-09 16:55:49.351371000 -0700
@@ -9,15 +9,15 @@
 
 #include "buildings-pathloss-test.h"
 
-#include <ns3/building.h>
-#include <ns3/buildings-helper.h>
-#include <ns3/constant-position-mobility-model.h>
-#include <ns3/double.h>
-#include <ns3/enum.h>
-#include <ns3/log.h>
-#include <ns3/mobility-building-info.h>
-#include <ns3/simulator.h>
-#include <ns3/string.h>
+#include "ns3/building.h"
+#include "ns3/buildings-helper.h"
+#include "ns3/constant-position-mobility-model.h"
+#include "ns3/double.h"
+#include "ns3/enum.h"
+#include "ns3/log.h"
+#include "ns3/mobility-building-info.h"
+#include "ns3/simulator.h"
+#include "ns3/string.h"
 
 using namespace ns3;
 
@@ -68,7 +68,7 @@
                                               2,
                                               OpenAreasEnvironment,
                                               LargeCity,
-                                              110.21,
+                                              109.66,
                                               "loss OH OpenAreas"),
                 TestCase::Duration::QUICK);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/buildings/test/buildings-pathloss-test.h ns-3.44/src/buildings/test/buildings-pathloss-test.h
--- ns-3.43/src/buildings/test/buildings-pathloss-test.h	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/buildings/test/buildings-pathloss-test.h	2025-03-09 16:55:49.351371000 -0700
@@ -9,13 +9,13 @@
 #ifndef BUILDINGS_PATHLOSS_TEST_H
 #define BUILDINGS_PATHLOSS_TEST_H
 
-#include <ns3/hybrid-buildings-propagation-loss-model.h>
-#include <ns3/test.h>
+#include "ns3/hybrid-buildings-propagation-loss-model.h"
+#include "ns3/test.h"
 
 using namespace ns3;
 
 /**
- * \ingroup building-test
+ * @ingroup building-test
  *
  * Test 1.1 BuildingsPathlossModel Pathloss compound test
  *
@@ -29,7 +29,7 @@
 };
 
 /**
- * \ingroup building-test
+ * @ingroup building-test
  *
  * Test 1.1 BuildingsPathlossModel Pathloss test
  *
@@ -39,13 +39,13 @@
   public:
     /**
      * Constructor
-     * \param freq Communication frequency
-     * \param m1 First MobilityModel Index
-     * \param m2 Second MobilityModel Index
-     * \param env Environment type
-     * \param city City size
-     * \param refValue Theoretical loss
-     * \param name Test name
+     * @param freq Communication frequency
+     * @param m1 First MobilityModel Index
+     * @param m2 Second MobilityModel Index
+     * @param env Environment type
+     * @param city City size
+     * @param refValue Theoretical loss
+     * @param name Test name
      */
     BuildingsPathlossTestCase(double freq,
                               uint16_t m1,
@@ -60,8 +60,8 @@
     void DoRun() override;
     /**
      * Create a mobility model based on its index
-     * \param index MobilityModel index
-     * \return The MobilityModel
+     * @param index MobilityModel index
+     * @return The MobilityModel
      */
     Ptr<MobilityModel> CreateMobilityModel(uint16_t index);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/buildings/test/buildings-penetration-loss-pathloss-test.cc ns-3.44/src/buildings/test/buildings-penetration-loss-pathloss-test.cc
--- ns-3.43/src/buildings/test/buildings-penetration-loss-pathloss-test.cc	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/buildings/test/buildings-penetration-loss-pathloss-test.cc	2025-03-09 16:55:49.351371000 -0700
@@ -25,7 +25,7 @@
 NS_LOG_COMPONENT_DEFINE("BuildingsPenetrationLossesTest");
 
 /**
- * \ingroup propagation-tests
+ * @ingroup propagation-tests
  *
  * Test case for the 3GPP channel O2I building penetration losses.
  * It considers pre-determined scenarios and based on the outdoor/indoor
@@ -248,7 +248,7 @@
 }
 
 /**
- * \ingroup propagation-tests
+ * @ingroup propagation-tests
  *
  * Test suite for the buildings penetration losses
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/buildings/test/buildings-shadowing-test.cc ns-3.44/src/buildings/test/buildings-shadowing-test.cc
--- ns-3.43/src/buildings/test/buildings-shadowing-test.cc	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/buildings/test/buildings-shadowing-test.cc	2025-03-09 16:55:49.351371000 -0700
@@ -9,18 +9,18 @@
 
 #include "buildings-shadowing-test.h"
 
-#include <ns3/building.h>
-#include <ns3/buildings-helper.h>
-#include <ns3/constant-position-mobility-model.h>
-#include <ns3/double.h>
-#include <ns3/enum.h>
-#include <ns3/hybrid-buildings-propagation-loss-model.h>
-#include <ns3/log.h>
-#include <ns3/mobility-building-info.h>
-#include <ns3/mobility-model.h>
-#include <ns3/ptr.h>
-#include <ns3/simulator.h>
-#include <ns3/string.h>
+#include "ns3/building.h"
+#include "ns3/buildings-helper.h"
+#include "ns3/constant-position-mobility-model.h"
+#include "ns3/double.h"
+#include "ns3/enum.h"
+#include "ns3/hybrid-buildings-propagation-loss-model.h"
+#include "ns3/log.h"
+#include "ns3/mobility-building-info.h"
+#include "ns3/mobility-model.h"
+#include "ns3/ptr.h"
+#include "ns3/simulator.h"
+#include "ns3/string.h"
 
 using namespace ns3;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/buildings/test/buildings-shadowing-test.h ns-3.44/src/buildings/test/buildings-shadowing-test.h
--- ns-3.43/src/buildings/test/buildings-shadowing-test.h	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/buildings/test/buildings-shadowing-test.h	2025-03-09 16:55:49.351371000 -0700
@@ -20,7 +20,7 @@
 using namespace ns3;
 
 /**
- * \ingroup building-test
+ * @ingroup building-test
  *
  * Shadowing compound test
  *
@@ -34,7 +34,7 @@
 };
 
 /**
- * \ingroup building-test
+ * @ingroup building-test
  *
  * Shadowing test
  */
@@ -43,11 +43,11 @@
   public:
     /**
      * Constructor
-     * \param m1 First MobilityModel Index
-     * \param m2 Second MobilityModel Index
-     * \param refValue Theoretical loss
-     * \param sigmaRef Theoretical loss standard deviation
-     * \param name Test name
+     * @param m1 First MobilityModel Index
+     * @param m2 Second MobilityModel Index
+     * @param refValue Theoretical loss
+     * @param sigmaRef Theoretical loss standard deviation
+     * @param name Test name
      */
     BuildingsShadowingTestCase(uint16_t m1,
                                uint16_t m2,
@@ -60,8 +60,8 @@
     void DoRun() override;
     /**
      * Create a mobility model based on its index
-     * \param index MobilityModel index
-     * \return The MobilityModel
+     * @param index MobilityModel index
+     * @return The MobilityModel
      */
     Ptr<MobilityModel> CreateMobilityModel(uint16_t index);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/buildings/test/outdoor-random-walk-test.cc ns-3.44/src/buildings/test/outdoor-random-walk-test.cc
--- ns-3.43/src/buildings/test/outdoor-random-walk-test.cc	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/buildings/test/outdoor-random-walk-test.cc	2025-03-09 16:55:49.351371000 -0700
@@ -23,7 +23,7 @@
 NS_LOG_COMPONENT_DEFINE("OutdoorRandomWalkTest");
 
 /**
- * \ingroup building-test
+ * @ingroup building-test
  *
  * Test case for the class OutdoorRandomWalkTestCase. It checks if the
  * positions visited by the user are outside buildings
@@ -39,7 +39,7 @@
 
     /**
      * Check that the position is the expected one
-     * \param model Mobility model
+     * @param model Mobility model
      */
     void CheckPositionOutdoor(Ptr<RandomWalk2dOutdoorMobilityModel> model);
 
@@ -151,7 +151,7 @@
 }
 
 /**
- * \ingroup building-test
+ * @ingroup building-test
  *
  * Test suite for the buildings channel condition model
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/buildings/test/three-gpp-v2v-channel-condition-model-test.cc ns-3.44/src/buildings/test/three-gpp-v2v-channel-condition-model-test.cc
--- ns-3.43/src/buildings/test/three-gpp-v2v-channel-condition-model-test.cc	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/buildings/test/three-gpp-v2v-channel-condition-model-test.cc	2025-03-09 16:55:49.351371000 -0700
@@ -26,7 +26,7 @@
 NS_LOG_COMPONENT_DEFINE("ThreeGppV2vChannelConditionModelsTest");
 
 /**
- * \ingroup building-test
+ * @ingroup building-test
  *
  * Test case for the classes ThreeGppV2vUrbanChannelConditionModel,
  * and ThreeGppV2vHighwayChannelConditionModel to test their code to
@@ -201,8 +201,8 @@
      * Evaluates the channel condition between two nodes by calling the method
      * GetChannelCondition on m_condModel. If the channel condition is LOS it
      * increments m_numLos
-     * \param a the mobility model of the first node
-     * \param b the mobility model of the second node
+     * @param a the mobility model of the first node
+     * @param b the mobility model of the second node
      */
     void EvaluateChannelCondition(Ptr<MobilityModel> a, Ptr<MobilityModel> b);
 
@@ -366,8 +366,8 @@
      * Evaluates the channel condition between two nodes by calling the method
      * GetChannelCondition on m_condModel. If the channel condition is LOS it
      * increments m_numLos
-     * \param a the mobility model of the first node
-     * \param b the mobility model of the second node
+     * @param a the mobility model of the first node
+     * @param b the mobility model of the second node
      */
     void EvaluateChannelCondition(Ptr<MobilityModel> a, Ptr<MobilityModel> b);
 
@@ -498,7 +498,7 @@
 }
 
 /**
- * \ingroup building-test
+ * @ingroup building-test
  *
  * Test suite for the 3GPP V2V channel condition model
  *
@@ -511,7 +511,7 @@
  * The test ThreeGppV2vBuildingsChCondModelTestCase checks the
  * 1st step of the procedure, the deterministic one, using buildings for
  * both \link ns3::ThreeGppV2vUrbanChannelConditionModel \endlink and
- * \link ns3::ThreeGppV2vHighwayChannelConditionModel \endlink .
+ * @link ns3::ThreeGppV2vHighwayChannelConditionModel \endlink .
  *
  * The tests ThreeGppV2vUrbanLosNlosvChCondModelTestCase and
  * ThreeGppV2vHighwayLosNlosvChCondModelTestCase check the
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/click/examples/nsclick-defines.cc ns-3.44/src/click/examples/nsclick-defines.cc
--- ns-3.43/src/click/examples/nsclick-defines.cc	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/click/examples/nsclick-defines.cc	2025-03-09 16:55:49.351371000 -0700
@@ -50,7 +50,7 @@
     // Now, do the actual simulation.
     //
     NS_LOG_INFO("Run Simulation.");
-    Simulator::Stop(Seconds(20.0));
+    Simulator::Stop(Seconds(20));
     Simulator::Run();
     Simulator::Destroy();
     NS_LOG_INFO("Done.");
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/click/examples/nsclick-raw-wlan.cc ns-3.44/src/click/examples/nsclick-raw-wlan.cc
--- ns-3.43/src/click/examples/nsclick-raw-wlan.cc	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/click/examples/nsclick-raw-wlan.cc	2025-03-09 16:55:49.351371000 -0700
@@ -115,8 +115,8 @@
     Address LocalAddress(InetSocketAddress(Ipv4Address::GetAny(), 50000));
     PacketSinkHelper packetSinkHelper("ns3::TcpSocketFactory", LocalAddress);
     ApplicationContainer recvapp = packetSinkHelper.Install(wifiNodes.Get(1));
-    recvapp.Start(Seconds(5.0));
-    recvapp.Stop(Seconds(10.0));
+    recvapp.Start(Seconds(5));
+    recvapp.Stop(Seconds(10));
 
     OnOffHelper onOffHelper("ns3::TcpSocketFactory", Address());
     onOffHelper.SetAttribute("OnTime", StringValue("ns3::ConstantRandomVariable[Constant=1]"));
@@ -128,13 +128,13 @@
     onOffHelper.SetAttribute("Remote", remoteAddress);
     appcont.Add(onOffHelper.Install(wifiNodes.Get(0)));
 
-    appcont.Start(Seconds(5.0));
-    appcont.Stop(Seconds(10.0));
+    appcont.Start(Seconds(5));
+    appcont.Stop(Seconds(10));
 
     // For tracing
     wifiPhy.EnablePcap("nsclick-raw-wlan", wifiDevices);
 
-    Simulator::Stop(Seconds(20.0));
+    Simulator::Stop(Seconds(20));
     Simulator::Run();
 
     Simulator::Destroy();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/click/examples/nsclick-routing.cc ns-3.44/src/click/examples/nsclick-routing.cc
--- ns-3.43/src/click/examples/nsclick-routing.cc	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/click/examples/nsclick-routing.cc	2025-03-09 16:55:49.351371000 -0700
@@ -90,8 +90,8 @@
     uint16_t port = 4000;
     UdpServerHelper server(port);
     ApplicationContainer apps = server.Install(n.Get(2));
-    apps.Start(Seconds(1.0));
-    apps.Stop(Seconds(10.0));
+    apps.Start(Seconds(1));
+    apps.Stop(Seconds(10));
 
     //
     // Create one UdpClient application to send UDP datagrams from node zero to
@@ -105,8 +105,8 @@
     client.SetAttribute("Interval", TimeValue(interPacketInterval));
     client.SetAttribute("PacketSize", UintegerValue(MaxPacketSize));
     apps = client.Install(NodeContainer(n.Get(0)));
-    apps.Start(Seconds(2.0));
-    apps.Stop(Seconds(10.0));
+    apps.Start(Seconds(2));
+    apps.Stop(Seconds(10));
 
     csma.EnablePcap("nsclick-routing", d01, false);
     csma.EnablePcap("nsclick-routing", d12, false);
@@ -115,7 +115,7 @@
     // Now, do the actual simulation.
     //
     NS_LOG_INFO("Run Simulation.");
-    Simulator::Stop(Seconds(20.0));
+    Simulator::Stop(Seconds(20));
     Simulator::Run();
     Simulator::Destroy();
     NS_LOG_INFO("Done.");
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/click/examples/nsclick-simple-lan.cc ns-3.44/src/click/examples/nsclick-simple-lan.cc
--- ns-3.43/src/click/examples/nsclick-simple-lan.cc	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/click/examples/nsclick-simple-lan.cc	2025-03-09 16:55:49.351371000 -0700
@@ -69,8 +69,8 @@
     Address LocalAddress(InetSocketAddress(Ipv4Address::GetAny(), 50000));
     PacketSinkHelper packetSinkHelper("ns3::TcpSocketFactory", LocalAddress);
     ApplicationContainer recvapp = packetSinkHelper.Install(csmaNodes.Get(1));
-    recvapp.Start(Seconds(5.0));
-    recvapp.Stop(Seconds(10.0));
+    recvapp.Start(Seconds(5));
+    recvapp.Stop(Seconds(10));
 
     OnOffHelper onOffHelper("ns3::TcpSocketFactory", Address());
     onOffHelper.SetAttribute("OnTime", StringValue("ns3::ConstantRandomVariable[Constant=1]"));
@@ -82,13 +82,13 @@
     onOffHelper.SetAttribute("Remote", remoteAddress);
     appcont.Add(onOffHelper.Install(csmaNodes.Get(0)));
 
-    appcont.Start(Seconds(5.0));
-    appcont.Stop(Seconds(10.0));
+    appcont.Start(Seconds(5));
+    appcont.Stop(Seconds(10));
 
     // For tracing
     csma.EnablePcap("nsclick-simple-lan", csmaDevices, false);
 
-    Simulator::Stop(Seconds(20.0));
+    Simulator::Stop(Seconds(20));
     Simulator::Run();
 
     Simulator::Destroy();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/click/examples/nsclick-simple-lan.py ns-3.44/src/click/examples/nsclick-simple-lan.py
--- ns-3.43/src/click/examples/nsclick-simple-lan.py	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/click/examples/nsclick-simple-lan.py	2025-03-09 16:55:49.351371000 -0700
@@ -51,8 +51,8 @@
 LocalAddress = ns.InetSocketAddress(ns.Ipv4Address.GetAny(), 50000).ConvertTo()
 packetSinkHelper = ns.PacketSinkHelper("ns3::TcpSocketFactory", LocalAddress)
 recvapp = packetSinkHelper.Install(csmaNodes.Get(1))
-recvapp.Start(ns.Seconds(5.0))
-recvapp.Stop(ns.Seconds(10.0))
+recvapp.Start(ns.Seconds(5))
+recvapp.Stop(ns.Seconds(10))
 
 onOffHelper = ns.OnOffHelper("ns3::TcpSocketFactory", ns.Address())
 onOffHelper.SetAttribute("OnTime", ns.StringValue("ns3::ConstantRandomVariable[Constant=1]"))
@@ -64,13 +64,13 @@
 onOffHelper.SetAttribute("Remote", ns.AddressValue(remoteAddress))
 appcont.Add(onOffHelper.Install(csmaNodes.Get(0)))
 
-appcont.Start(ns.Seconds(5.0))
-appcont.Stop(ns.Seconds(10.0))
+appcont.Start(ns.Seconds(5))
+appcont.Stop(ns.Seconds(10))
 
 # For tracing
 csma.EnablePcap("nsclick-simple-lan", csmaDevices, False)
 
-ns.Simulator.Stop(ns.Seconds(20.0))
+ns.Simulator.Stop(ns.Seconds(20))
 ns.Simulator.Run()
 
 ns.Simulator.Destroy()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/click/examples/nsclick-udp-client-server-csma.cc ns-3.44/src/click/examples/nsclick-udp-client-server-csma.cc
--- ns-3.43/src/click/examples/nsclick-udp-client-server-csma.cc	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/click/examples/nsclick-udp-client-server-csma.cc	2025-03-09 16:55:49.351371000 -0700
@@ -90,8 +90,8 @@
     uint16_t port = 4000;
     UdpServerHelper server(port);
     ApplicationContainer apps = server.Install(n.Get(1));
-    apps.Start(Seconds(1.0));
-    apps.Stop(Seconds(10.0));
+    apps.Start(Seconds(1));
+    apps.Stop(Seconds(10));
 
     //
     // Create one UdpClient application to send UDP datagrams from node zero to
@@ -105,8 +105,8 @@
     client.SetAttribute("Interval", TimeValue(interPacketInterval));
     client.SetAttribute("PacketSize", UintegerValue(MaxPacketSize));
     apps = client.Install(NodeContainer(n.Get(0), n.Get(2)));
-    apps.Start(Seconds(2.0));
-    apps.Stop(Seconds(10.0));
+    apps.Start(Seconds(2));
+    apps.Stop(Seconds(10));
 
     csma.EnablePcap("nsclick-udp-client-server-csma", d, false);
 
@@ -114,7 +114,7 @@
     // Now, do the actual simulation.
     //
     NS_LOG_INFO("Run Simulation.");
-    Simulator::Stop(Seconds(20.0));
+    Simulator::Stop(Seconds(20));
     Simulator::Run();
     Simulator::Destroy();
     NS_LOG_INFO("Done.");
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/click/examples/nsclick-udp-client-server-wifi.cc ns-3.44/src/click/examples/nsclick-udp-client-server-wifi.cc
--- ns-3.43/src/click/examples/nsclick-udp-client-server-wifi.cc	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/click/examples/nsclick-udp-client-server-wifi.cc	2025-03-09 16:55:49.351371000 -0700
@@ -163,8 +163,8 @@
     uint16_t port = 4000;
     UdpServerHelper server(port);
     ApplicationContainer apps = server.Install(n.Get(1));
-    apps.Start(Seconds(1.0));
-    apps.Stop(Seconds(10.0));
+    apps.Start(Seconds(1));
+    apps.Stop(Seconds(10));
 
     //
     // Create one UdpClient application to send UDP datagrams from node zero to
@@ -178,8 +178,8 @@
     client.SetAttribute("Interval", TimeValue(interPacketInterval));
     client.SetAttribute("PacketSize", UintegerValue(MaxPacketSize));
     apps = client.Install(NodeContainer(n.Get(0), n.Get(2)));
-    apps.Start(Seconds(2.0));
-    apps.Stop(Seconds(10.0));
+    apps.Start(Seconds(2));
+    apps.Stop(Seconds(10));
 
     wifiPhy.EnablePcap("nsclick-udp-client-server-wifi", d);
 
@@ -198,7 +198,7 @@
     // Now, do the actual simulation.
     //
     NS_LOG_INFO("Run Simulation.");
-    Simulator::Stop(Seconds(20.0));
+    Simulator::Stop(Seconds(20));
     Simulator::Run();
     Simulator::Destroy();
     NS_LOG_INFO("Done.");
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/click/helper/click-internet-stack-helper.cc ns-3.44/src/click/helper/click-internet-stack-helper.cc
--- ns-3.43/src/click/helper/click-internet-stack-helper.cc	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/click/helper/click-internet-stack-helper.cc	2025-03-09 16:55:49.351371000 -0700
@@ -50,9 +50,9 @@
 /**
  * IPv4 Rx / Tx packet callback.
  *
- * \param p Packet.
- * \param ipv4 IPv4 stack.
- * \param interface Interface number.
+ * @param p Packet.
+ * @param ipv4 IPv4 stack.
+ * @param interface Interface number.
  */
 static void
 Ipv4L3ProtocolRxTxSink(Ptr<const Packet> p, Ptr<Ipv4> ipv4, uint32_t interface)
@@ -79,12 +79,12 @@
 /**
  * Packet dropped callback without context.
  *
- * \param stream Output stream.
- * \param header IPv4 header.
- * \param packet Packet.
- * \param reason Packet drop reason.
- * \param ipv4 IPv4 stack.
- * \param interface Interface number.
+ * @param stream Output stream.
+ * @param header IPv4 header.
+ * @param packet Packet.
+ * @param reason Packet drop reason.
+ * @param ipv4 IPv4 stack.
+ * @param interface Interface number.
  */
 static void
 Ipv4L3ProtocolDropSinkWithoutContext(Ptr<OutputStreamWrapper> stream,
@@ -115,13 +115,13 @@
 /**
  * Packet dropped callback with context.
  *
- * \param stream Output stream.
- * \param context Context.
- * \param header IPv4 header.
- * \param packet Packet.
- * \param reason Packet drop reason.
- * \param ipv4 IPv4 stack.
- * \param interface Interface number.
+ * @param stream Output stream.
+ * @param context Context.
+ * @param header IPv4 header.
+ * @param packet Packet.
+ * @param reason Packet drop reason.
+ * @param ipv4 IPv4 stack.
+ * @param interface Interface number.
  */
 static void
 Ipv4L3ProtocolDropSinkWithContext(Ptr<OutputStreamWrapper> stream,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/click/helper/click-internet-stack-helper.h ns-3.44/src/click/helper/click-internet-stack-helper.h
--- ns-3.43/src/click/helper/click-internet-stack-helper.h	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/click/helper/click-internet-stack-helper.h	2025-03-09 16:55:49.351371000 -0700
@@ -28,7 +28,7 @@
 class Ipv4RoutingHelper;
 
 /**
- * \brief aggregate Click/IP/TCP/UDP functionality to existing Nodes.
+ * @brief aggregate Click/IP/TCP/UDP functionality to existing Nodes.
  *
  * This helper has been adapted from the InternetStackHelper class and
  * nodes will not be able to use Ipv6 functionalities.
@@ -50,15 +50,15 @@
     /**
      * Copy constructor.
      *
-     * \param o Object to copy from.
+     * @param o Object to copy from.
      */
     ClickInternetStackHelper(const ClickInternetStackHelper& o);
 
     /**
      * Assignment operator.
      *
-     * \param o Object to copy from.
-     * \return Reference to updated object.
+     * @param o Object to copy from.
+     * @return Reference to updated object.
      */
     ClickInternetStackHelper& operator=(const ClickInternetStackHelper& o);
 
@@ -72,7 +72,7 @@
      * ns3::Udp, and ns3::Tcp classes onto the provided node.  This method will
      * assert if called on a node that already has an Ipv4 object aggregated to it.
      *
-     * \param nodeName The name of the node on which to install the stack.
+     * @param nodeName The name of the node on which to install the stack.
      */
     void Install(std::string nodeName) const;
 
@@ -81,7 +81,7 @@
      * ns3::Udp, and ns3::Tcp classes onto the provided node.  This method will
      * assert if called on a node that already has an Ipv4 object aggregated to it.
      *
-     * \param node The node on which to install the stack.
+     * @param node The node on which to install the stack.
      */
     void Install(Ptr<Node> node) const;
 
@@ -91,7 +91,7 @@
      * The program will assert if this method is called on a container with a
      * node that already has an Ipv4 object aggregated to it.
      *
-     * \param c NodeContainer that holds the set of nodes on which to install the
+     * @param c NodeContainer that holds the set of nodes on which to install the
      * new stacks.
      */
     void Install(NodeContainer c) const;
@@ -102,55 +102,55 @@
     void InstallAll() const;
 
     /**
-     * \brief Set a Click file to be used for a group of nodes.
-     * \param c NodeContainer of nodes
-     * \param clickfile Click file to be used
+     * @brief Set a Click file to be used for a group of nodes.
+     * @param c NodeContainer of nodes
+     * @param clickfile Click file to be used
      */
     void SetClickFile(NodeContainer c, std::string clickfile);
 
     /**
-     * \brief Set a Click file to be used for a node.
-     * \param node Node for which Click file is to be set
-     * \param clickfile Click file to be used
+     * @brief Set a Click file to be used for a node.
+     * @param node Node for which Click file is to be set
+     * @param clickfile Click file to be used
      */
     void SetClickFile(Ptr<Node> node, std::string clickfile);
 
     /**
-     * \brief Set defines to be used for a group of nodes.
-     * \param c NodeContainer of nodes
-     * \param defines Defines mapping to be used
+     * @brief Set defines to be used for a group of nodes.
+     * @param c NodeContainer of nodes
+     * @param defines Defines mapping to be used
      */
     void SetDefines(NodeContainer c, std::map<std::string, std::string> defines);
 
     /**
-     * \brief Set defines to be used for a node.
-     * \param node Node for which the defines are to be set
-     * \param defines Defines mapping to be used
+     * @brief Set defines to be used for a node.
+     * @param node Node for which the defines are to be set
+     * @param defines Defines mapping to be used
      */
     void SetDefines(Ptr<Node> node, std::map<std::string, std::string> defines);
 
     /**
-     * \brief Set a Click routing table element for a group of nodes.
-     * \param c NodeContainer of nodes
-     * \param rt Click Routing Table element name
+     * @brief Set a Click routing table element for a group of nodes.
+     * @param c NodeContainer of nodes
+     * @param rt Click Routing Table element name
      */
     void SetRoutingTableElement(NodeContainer c, std::string rt);
 
     /**
-     * \brief Set a Click routing table element for a node.
-     * \param node Node for which Click file is to be set
-     * \param rt Click Routing Table element name
+     * @brief Set a Click routing table element for a node.
+     * @param node Node for which Click file is to be set
+     * @param rt Click Routing Table element name
      */
     void SetRoutingTableElement(Ptr<Node> node, std::string rt);
 
   private:
     /**
-     * \brief Enable pcap output the indicated Ipv4 and interface pair.
+     * @brief Enable pcap output the indicated Ipv4 and interface pair.
      *
-     * \param prefix Filename prefix to use for pcap files.
-     * \param ipv4 Ptr to the Ipv4 interface on which you want to enable tracing.
-     * \param interface Interface ID on the Ipv4 on which you want to enable tracing.
-     * \param explicitFilename Whether the filename is explicit or not.
+     * @param prefix Filename prefix to use for pcap files.
+     * @param ipv4 Ptr to the Ipv4 interface on which you want to enable tracing.
+     * @param interface Interface ID on the Ipv4 on which you want to enable tracing.
+     * @param explicitFilename Whether the filename is explicit or not.
      */
     void EnablePcapIpv4Internal(std::string prefix,
                                 Ptr<Ipv4> ipv4,
@@ -158,14 +158,14 @@
                                 bool explicitFilename) override;
 
     /**
-     * \brief Enable ascii trace output on the indicated Ipv4 and interface pair.
+     * @brief Enable ascii trace output on the indicated Ipv4 and interface pair.
      *
-     * \param stream An OutputStreamWrapper representing an existing file to use
+     * @param stream An OutputStreamWrapper representing an existing file to use
      *               when writing trace data.
-     * \param prefix Filename prefix to use for ascii trace files.
-     * \param ipv4 Ptr to the Ipv4 interface on which you want to enable tracing.
-     * \param interface Interface ID on the Ipv4 on which you want to enable tracing.
-     * \param explicitFilename Whether the filename is explicit or not.
+     * @param prefix Filename prefix to use for ascii trace files.
+     * @param ipv4 Ptr to the Ipv4 interface on which you want to enable tracing.
+     * @param interface Interface ID on the Ipv4 on which you want to enable tracing.
+     * @param explicitFilename Whether the filename is explicit or not.
      */
     void EnableAsciiIpv4Internal(Ptr<OutputStreamWrapper> stream,
                                  std::string prefix,
@@ -182,44 +182,44 @@
     /**
      * Create and aggregate object from type ID.
      *
-     * \param node Node.
-     * \param typeId Type ID.
+     * @param node Node.
+     * @param typeId Type ID.
      */
     static void CreateAndAggregateObjectFromTypeId(Ptr<Node> node, const std::string typeId);
 
     /**
      * Check if PCAP is hooked.
      *
-     * \param ipv4 IPv4 stack.
-     * \return True if PCAP is hooked.
+     * @param ipv4 IPv4 stack.
+     * @return True if PCAP is hooked.
      */
     bool PcapHooked(Ptr<Ipv4> ipv4);
 
     /**
      * Check if ASCII is hooked.
      *
-     * \param ipv4 IPv4 stack.
-     * \return True if ASCII is hooked.
+     * @param ipv4 IPv4 stack.
+     * @return True if ASCII is hooked.
      */
     bool AsciiHooked(Ptr<Ipv4> ipv4);
 
     /**
-     * \brief IPv4 install state (enabled/disabled) ?
+     * @brief IPv4 install state (enabled/disabled) ?
      */
     bool m_ipv4Enabled;
 
     /**
-     * \brief Node to Click file mapping
+     * @brief Node to Click file mapping
      */
     std::map<Ptr<Node>, std::string> m_nodeToClickFileMap;
 
     /**
-     * \brief Node to Click defines mapping
+     * @brief Node to Click defines mapping
      */
     std::map<Ptr<Node>, std::map<std::string, std::string>> m_nodeToDefinesMap;
 
     /**
-     * \brief Node to Routing Table Element mapping
+     * @brief Node to Routing Table Element mapping
      */
     std::map<Ptr<Node>, std::string> m_nodeToRoutingTableElementMap;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/click/model/ipv4-click-routing.cc ns-3.44/src/click/model/ipv4-click-routing.cc
--- ns-3.43/src/click/model/ipv4-click-routing.cc	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/click/model/ipv4-click-routing.cc	2025-03-09 16:55:49.351371000 -0700
@@ -518,7 +518,7 @@
         }
         else
         {
-            /** \todo Implement IP aliasing and Click */
+            /** @todo Implement IP aliasing and Click */
             NS_FATAL_ERROR("XXX Not implemented yet:  IP aliasing and Click");
         }
         rtentry->SetSource(ifAddr.GetLocal());
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/click/model/ipv4-click-routing.h ns-3.44/src/click/model/ipv4-click-routing.h
--- ns-3.43/src/click/model/ipv4-click-routing.h	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/click/model/ipv4-click-routing.h	2025-03-09 16:55:49.351371000 -0700
@@ -32,7 +32,7 @@
 {
 
 /**
- * \defgroup click Click Routing
+ * @defgroup click Click Routing
  * This section documents the API of the ns-3 click module. For a generic functional description,
  * please refer to the ns-3 manual.
  */
@@ -40,8 +40,8 @@
 class UniformRandomVariable;
 
 /**
- * \ingroup click
- * \brief Class to allow a node to use Click for external routing
+ * @ingroup click
+ * @brief Class to allow a node to use Click for external routing
  */
 class Ipv4ClickRouting : public Ipv4RoutingProtocol
 {
@@ -54,7 +54,7 @@
     /**
      * Get type ID.
      *
-     * \return TypeId.
+     * @return TypeId.
      */
     static TypeId GetTypeId();
 
@@ -65,7 +65,7 @@
     /**
      * Get the uniform random variable.
      *
-     * \return Uniform random variable.
+     * @return Uniform random variable.
      */
     Ptr<UniformRandomVariable> GetRandomVariable();
 
@@ -76,51 +76,51 @@
     void DoDispose() override;
 
     /**
-     * \brief Click configuration file to be used by the node's Click Instance.
-     * \param clickfile name of .click configuration file
+     * @brief Click configuration file to be used by the node's Click Instance.
+     * @param clickfile name of .click configuration file
      */
     void SetClickFile(std::string clickfile);
 
     /**
-     * \brief Click defines to be used by the node's Click Instance.
-     * \param defines mapping of defines for .click configuration file parsing
+     * @brief Click defines to be used by the node's Click Instance.
+     * @param defines mapping of defines for .click configuration file parsing
      */
     void SetDefines(std::map<std::string, std::string> defines);
 
     /**
-     * \brief Name of the node as to be used by Click. Required for Click Dumps.
-     * \param name Name to be assigned to the node.
+     * @brief Name of the node as to be used by Click. Required for Click Dumps.
+     * @param name Name to be assigned to the node.
      */
     void SetNodeName(std::string name);
 
     /**
-     * \brief Name of the routing table element being used by Click. Required for RouteOutput ()
-     * \param name Name of the routing table element.
+     * @brief Name of the routing table element being used by Click. Required for RouteOutput ()
+     * @param name Name of the routing table element.
      */
     void SetClickRoutingTableElement(std::string name);
 
     /**
-     * \brief Read Handler interface for a node's Click Elements.
+     * @brief Read Handler interface for a node's Click Elements.
      *        Allows a user to read state information of a Click element.
-     * \param elementName name of the Click element.
-     * \param handlerName name of the handler to be read.
-     * \return String read.
+     * @param elementName name of the Click element.
+     * @param handlerName name of the handler to be read.
+     * @return String read.
      */
     std::string ReadHandler(std::string elementName, std::string handlerName);
 
     /**
-     * \brief Write Handler interface for a node's Click Elements.
+     * @brief Write Handler interface for a node's Click Elements.
      *        Allows a user to modify state information of a Click element.
-     * \param elementName name of the Click element.
-     * \param handlerName name of the handler to be read.
-     * \param writeString string to be written using the write handler.
-     * \return Write operation status.
+     * @param elementName name of the Click element.
+     * @param handlerName name of the handler to be read.
+     * @param writeString string to be written using the write handler.
+     * @return Write operation status.
      */
     int WriteHandler(std::string elementName, std::string handlerName, std::string writeString);
 
     /**
-     * \brief Sets an interface to run on promiscuous mode.
-     * \param ifid Interface ID.
+     * @brief Sets an interface to run on promiscuous mode.
+     * @param ifid Interface ID.
      */
     void SetPromisc(int ifid);
 
@@ -129,131 +129,131 @@
     simclick_node_t* m_simNode;
 
     /**
-     * \brief Provide a mapping between the node reference used by Click and the corresponding
+     * @brief Provide a mapping between the node reference used by Click and the corresponding
      * Ipv4ClickRouting instance.
      */
     static std::map<simclick_node_t*, Ptr<Ipv4ClickRouting>> m_clickInstanceFromSimNode;
 
   public:
     /**
-     * \brief Allows the Click service methods, which reside outside Ipv4ClickRouting, to get the
+     * @brief Allows the Click service methods, which reside outside Ipv4ClickRouting, to get the
      * required Ipv4ClickRouting instances.
-     * \param simnode The Click simclick_node_t instance for which the Ipv4ClickRouting instance is
+     * @param simnode The Click simclick_node_t instance for which the Ipv4ClickRouting instance is
      * required
-     * \return A Ptr to the required Ipv4ClickRouting instance
+     * @return A Ptr to the required Ipv4ClickRouting instance
      */
     static Ptr<Ipv4ClickRouting> GetClickInstanceFromSimNode(simclick_node_t* simnode);
 
   public:
     /**
-     * \brief Provides for SIMCLICK_GET_DEFINES
-     * \return The defines mapping for .click configuration file parsing
+     * @brief Provides for SIMCLICK_GET_DEFINES
+     * @return The defines mapping for .click configuration file parsing
      */
     std::map<std::string, std::string> GetDefines();
 
     /**
-     * \brief Provides for SIMCLICK_IFID_FROM_NAME
-     * \param ifname The name of the interface
-     * \return The interface ID which corresponds to ifname
+     * @brief Provides for SIMCLICK_IFID_FROM_NAME
+     * @param ifname The name of the interface
+     * @return The interface ID which corresponds to ifname
      */
     int GetInterfaceId(const char* ifname);
 
     /**
-     * \brief Provides for SIMCLICK_IPADDR_FROM_NAME
-     * \param ifid The interface ID for which the IP Address is required
-     * \return The IP Address of the interface in string format
+     * @brief Provides for SIMCLICK_IPADDR_FROM_NAME
+     * @param ifid The interface ID for which the IP Address is required
+     * @return The IP Address of the interface in string format
      */
     std::string GetIpAddressFromInterfaceId(int ifid);
 
     /**
-     * \brief Provides for SIMCLICK_IPPREFIX_FROM_NAME
-     * \param ifid The interface ID for which the IP Prefix is required
-     * \return The IP Prefix of the interface in string format
+     * @brief Provides for SIMCLICK_IPPREFIX_FROM_NAME
+     * @param ifid The interface ID for which the IP Prefix is required
+     * @return The IP Prefix of the interface in string format
      */
     std::string GetIpPrefixFromInterfaceId(int ifid);
 
     /**
-     * \brief Provides for SIMCLICK_MACADDR_FROM_NAME
-     * \param ifid The interface ID for which the MAC Address is required
-     * \return The MAC Address of the interface in string format
+     * @brief Provides for SIMCLICK_MACADDR_FROM_NAME
+     * @param ifid The interface ID for which the MAC Address is required
+     * @return The MAC Address of the interface in string format
      */
     std::string GetMacAddressFromInterfaceId(int ifid);
 
     /**
-     * \brief Provides for SIMCLICK_GET_NODE_NAME
-     * \return The Node name
+     * @brief Provides for SIMCLICK_GET_NODE_NAME
+     * @return The Node name
      */
     std::string GetNodeName();
 
     /**
-     * \brief Provides for SIMCLICK_IF_READY
-     * \param ifid Interface ID
-     * \return Returns 1, if the interface is ready, -1 if ifid is invalid
+     * @brief Provides for SIMCLICK_IF_READY
+     * @param ifid Interface ID
+     * @return Returns 1, if the interface is ready, -1 if ifid is invalid
      */
     bool IsInterfaceReady(int ifid);
 
     /**
-     * \brief Set the Ipv4 instance to be used
-     * \param ipv4 The Ipv4 instance
+     * @brief Set the Ipv4 instance to be used
+     * @param ipv4 The Ipv4 instance
      */
     void SetIpv4(Ptr<Ipv4> ipv4) override;
 
   private:
     /**
-     * \brief Used internally in DoInitialize () to Add a mapping to m_clickInstanceFromSimNode
+     * @brief Used internally in DoInitialize () to Add a mapping to m_clickInstanceFromSimNode
      * mapping
      */
     void AddSimNodeToClickMapping();
 
     /**
-     * \brief Get current simulation time as a timeval.
-     * \return Current simulation time as a timeval.
+     * @brief Get current simulation time as a timeval.
+     * @return Current simulation time as a timeval.
      */
     struct timeval GetTimevalFromNow() const;
 
     /**
-     * \brief This method has to be scheduled every time Click calls SIMCLICK_SCHEDULE
+     * @brief This method has to be scheduled every time Click calls SIMCLICK_SCHEDULE
      */
     void RunClickEvent();
 
   public:
     /**
-     * \brief Schedules simclick_click_run to run at the given time
-     * \param when Time at which the simclick_click_run instance should be run
+     * @brief Schedules simclick_click_run to run at the given time
+     * @param when Time at which the simclick_click_run instance should be run
      */
     void HandleScheduleFromClick(const struct timeval* when);
 
     /**
-     * \brief Receives a packet from Click
-     * \param ifid The interface ID from which the packet is arriving
-     * \param type The type of packet as defined in click/simclick.h
-     * \param data The contents of the packet
-     * \param len The length of the packet
+     * @brief Receives a packet from Click
+     * @param ifid The interface ID from which the packet is arriving
+     * @param type The type of packet as defined in click/simclick.h
+     * @param data The contents of the packet
+     * @param len The length of the packet
      */
     void HandlePacketFromClick(int ifid, int type, const unsigned char* data, int len);
 
     /**
-     * \brief Sends a packet to Click
-     * \param ifid The interface ID from which the packet is arriving
-     * \param type The type of packet as defined in click/simclick.h
-     * \param data The contents of the packet
-     * \param len The length of the packet
+     * @brief Sends a packet to Click
+     * @param ifid The interface ID from which the packet is arriving
+     * @param type The type of packet as defined in click/simclick.h
+     * @param data The contents of the packet
+     * @param len The length of the packet
      */
     void SendPacketToClick(int ifid, int type, const unsigned char* data, int len);
 
     /**
-     * \brief Allow a higher layer to send data through Click. (From Ipv4ExtRouting)
-     * \param p The packet to be sent
-     * \param src The source IP Address
-     * \param dest The destination IP Address
+     * @brief Allow a higher layer to send data through Click. (From Ipv4ExtRouting)
+     * @param p The packet to be sent
+     * @param src The source IP Address
+     * @param dest The destination IP Address
      */
     void Send(Ptr<Packet> p, Ipv4Address src, Ipv4Address dest);
 
     /**
-     * \brief Allow a lower layer to send data to Click. (From Ipv4ExtRouting)
-     * \param p The packet to be sent
-     * \param receiverAddr Receiving interface's address
-     * \param dest The Destination MAC address
+     * @brief Allow a lower layer to send data to Click. (From Ipv4ExtRouting)
+     * @param p The packet to be sent
+     * @param receiverAddr Receiving interface's address
+     * @param dest The Destination MAC address
      */
     void Receive(Ptr<Packet> p, Mac48Address receiverAddr, Mac48Address dest);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/click/model/ipv4-l3-click-protocol.cc ns-3.44/src/click/model/ipv4-l3-click-protocol.cc
--- ns-3.43/src/click/model/ipv4-l3-click-protocol.cc	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/click/model/ipv4-l3-click-protocol.cc	2025-03-09 16:55:49.351371000 -0700
@@ -656,7 +656,7 @@
     return index;
 }
 
-/// \todo when should we set ip_id?   check whether we are incrementing
+/// @todo when should we set ip_id?   check whether we are incrementing
 /// m_identification on packets that may later be dropped in this stack
 /// and whether that deviates from Linux
 Ipv4Header
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/click/model/ipv4-l3-click-protocol.h ns-3.44/src/click/model/ipv4-l3-click-protocol.h
--- ns-3.43/src/click/model/ipv4-l3-click-protocol.h	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/click/model/ipv4-l3-click-protocol.h	2025-03-09 16:55:49.355371000 -0700
@@ -36,9 +36,9 @@
 class Icmpv4L4Protocol;
 
 /**
- * \brief Implement the Ipv4 layer specifically for Click nodes
+ * @brief Implement the Ipv4 layer specifically for Click nodes
  * to allow a clean integration of Click.
- * \ingroup click
+ * @ingroup click
  *
  * This is code is mostly repeated from the Ipv4L3Protocol implementation.
  * Changes include:
@@ -54,7 +54,7 @@
     /**
      * Get Type ID.
      *
-     * \return The type ID.
+     * @return The type ID.
      */
     static TypeId GetTypeId();
 
@@ -78,7 +78,7 @@
     Ipv4Address SourceAddressSelection(uint32_t interface, Ipv4Address dest) override;
 
     /**
-     * \param ttl default ttl to use
+     * @param ttl default ttl to use
      *
      * When we need to send an ipv4 packet, we use this default
      * ttl value.
@@ -86,11 +86,11 @@
     void SetDefaultTtl(uint8_t ttl);
 
     /**
-     * \param packet packet to send
-     * \param source source address of packet
-     * \param destination address of packet
-     * \param protocol number of packet
-     * \param route route entry
+     * @param packet packet to send
+     * @param source source address of packet
+     * @param destination address of packet
+     * @param protocol number of packet
+     * @param route route entry
      *
      * Higher-level layers call this method to send a packet
      * to Click
@@ -102,9 +102,9 @@
               Ptr<Ipv4Route> route) override;
 
     /**
-     * \param packet packet to send
-     * \param ipHeader IP Header
-     * \param route route entry
+     * @param packet packet to send
+     * @param ipHeader IP Header
+     * @param route route entry
      *
      * Higher-level layers call this method to send a packet with IPv4 Header
      * (Intend to be used with IpHeaderInclude attribute.)
@@ -112,8 +112,8 @@
     void SendWithHeader(Ptr<Packet> packet, Ipv4Header ipHeader, Ptr<Ipv4Route> route) override;
 
     /**
-     * \param packet packet to send down the stack
-     * \param ifid interface to be used for sending down packet
+     * @param packet packet to send down the stack
+     * @param ifid interface to be used for sending down packet
      *
      * Ipv4ClickRouting calls this method to send a packet further
      * down the stack
@@ -122,12 +122,12 @@
 
     /**
      * Lower layer calls this method to send a packet to Click
-     * \param device network device
-     * \param p the packet
-     * \param protocol protocol value
-     * \param from address of the correspondent
-     * \param to address of the destination
-     * \param packetType type of the packet
+     * @param device network device
+     * @param p the packet
+     * @param protocol protocol value
+     * @param from address of the correspondent
+     * @param to address of the destination
+     * @param packetType type of the packet
      */
     void Receive(Ptr<NetDevice> device,
                  Ptr<const Packet> p,
@@ -138,35 +138,35 @@
 
     /**
      * Ipv4ClickRouting calls this to locally deliver a packet
-     * \param p the packet
-     * \param ip The Ipv4Header of the packet
-     * \param iif The interface on which the packet was received
+     * @param p the packet
+     * @param ip The Ipv4Header of the packet
+     * @param iif The interface on which the packet was received
      */
     void LocalDeliver(Ptr<const Packet> p, const Ipv4Header& ip, uint32_t iif);
 
     /**
      * Get a pointer to the i'th Ipv4Interface
-     * \param i index of interface, pointer to which is to be returned
-     * \returns Pointer to the i'th Ipv4Interface if any.
+     * @param i index of interface, pointer to which is to be returned
+     * @returns Pointer to the i'th Ipv4Interface if any.
      */
     Ptr<Ipv4Interface> GetInterface(uint32_t i) const;
 
     /**
      * Adds an Ipv4Interface to the interfaces list
-     * \param interface Pointer to the Ipv4Interface to be added
-     * \returns Index of the device which was added
+     * @param interface Pointer to the Ipv4Interface to be added
+     * @returns Index of the device which was added
      */
     uint32_t AddIpv4Interface(Ptr<Ipv4Interface> interface);
 
     /**
      * Calls m_node = node and sets up Loopback if needed
-     * \param node Pointer to the node
+     * @param node Pointer to the node
      */
     void SetNode(Ptr<Node> node);
 
     /**
      * Returns the Icmpv4L4Protocol for the node
-     * \returns Icmpv4L4Protocol instance of the node
+     * @returns Icmpv4L4Protocol instance of the node
      */
     Ptr<Icmpv4L4Protocol> GetIcmp() const;
 
@@ -177,13 +177,13 @@
 
     /**
      * Creates a raw-socket
-     * \returns Pointer to the created socket
+     * @returns Pointer to the created socket
      */
     Ptr<Socket> CreateRawSocket() override;
 
     /**
      * Deletes a particular raw socket
-     * \param socket Pointer of socket to be deleted
+     * @param socket Pointer of socket to be deleted
      */
     void DeleteRawSocket(Ptr<Socket> socket) override;
 
@@ -222,7 +222,7 @@
     /**
      * Sets an interface to run on promiscuous mode.
      *
-     * \param i Interface ID.
+     * @param i Interface ID.
      */
     void SetPromisc(uint32_t i);
 
@@ -239,13 +239,13 @@
     /**
      * Build IPv4 header.
      *
-     * \param source IPv4 source address.
-     * \param destination IPv4 destination address.
-     * \param protocol Protocol.
-     * \param payloadSize Payload size.
-     * \param ttl Time To Live (TTL).
-     * \param mayFragment Whether the packet can be fragmented or not.
-     * \return The IPv4 header.
+     * @param source IPv4 source address.
+     * @param destination IPv4 destination address.
+     * @param protocol Protocol.
+     * @param payloadSize Payload size.
+     * @param ttl Time To Live (TTL).
+     * @param mayFragment Whether the packet can be fragmented or not.
+     * @return The IPv4 header.
      */
     Ipv4Header BuildHeader(Ipv4Address source,
                            Ipv4Address destination,
@@ -257,10 +257,10 @@
     void SetIpForward(bool forward) override;
     bool GetIpForward() const override;
 
-    /** \copydoc Ipv4::SetWeakEsModel */
+    /** @copydoc Ipv4::SetWeakEsModel */
     NS_DEPRECATED_3_41("Use SetStrongEndSystemModel instead")
     void SetWeakEsModel(bool model) override;
-    /** \copydoc Ipv4::GetWeakEsModel */
+    /** @copydoc Ipv4::GetWeakEsModel */
     NS_DEPRECATED_3_41("Use GetStrongEndSystemModel instead")
     bool GetWeakEsModel() const override;
 
@@ -268,27 +268,27 @@
     bool GetStrongEndSystemModel() const override;
 
     /**
-     * \brief List of IPv4 interfaces.
+     * @brief List of IPv4 interfaces.
      */
     typedef std::vector<Ptr<Ipv4Interface>> Ipv4InterfaceList;
 
     /**
-     * \brief Container of NetDevices registered to IPv4 and their interface indexes.
+     * @brief Container of NetDevices registered to IPv4 and their interface indexes.
      */
     typedef std::map<Ptr<const NetDevice>, uint32_t> Ipv4InterfaceReverseContainer;
 
     /**
-     * \brief List of sockets.
+     * @brief List of sockets.
      */
     typedef std::list<Ptr<Ipv4RawSocketImpl>> SocketList;
 
     /**
-     * \brief Container of the IPv4 L4 keys: protocol number, interface index
+     * @brief Container of the IPv4 L4 keys: protocol number, interface index
      */
     typedef std::pair<int, int32_t> L4ListKey_t;
 
     /**
-     * \brief Container of the IPv4 L4 instances.
+     * @brief Container of the IPv4 L4 instances.
      */
     typedef std::map<L4ListKey_t, Ptr<IpL4Protocol>> L4List_t;
 
@@ -304,11 +304,11 @@
 
     Ptr<Node> m_node; //!< Node
 
-    /** \todo Remove; this TracedCallback is never invoked. */
+    /** @todo Remove; this TracedCallback is never invoked. */
     TracedCallback<const Ipv4Header&, Ptr<const Packet>, uint32_t> m_sendOutgoingTrace;
-    /** \todo Remove: this TracedCallback is never invoked. */
+    /** @todo Remove: this TracedCallback is never invoked. */
     TracedCallback<const Ipv4Header&, Ptr<const Packet>, uint32_t> m_unicastForwardTrace;
-    /** \todo This TracedCallback is invoked but not accessible. */
+    /** @todo This TracedCallback is invoked but not accessible. */
     TracedCallback<const Ipv4Header&, Ptr<const Packet>, uint32_t> m_localDeliverTrace;
 
     SocketList m_sockets; //!< List of sockets
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/click/test/ipv4-click-routing-test.cc ns-3.44/src/click/test/ipv4-click-routing-test.cc
--- ns-3.43/src/click/test/ipv4-click-routing-test.cc	2024-10-09 16:41:09.852655600 -0700
+++ ns-3.44/src/click/test/ipv4-click-routing-test.cc	2025-03-09 16:55:49.355371000 -0700
@@ -20,21 +20,21 @@
 using namespace ns3;
 
 /**
- * \ingroup click
- * \defgroup click-tests click module tests
+ * @ingroup click
+ * @defgroup click-tests click module tests
  */
 
 /**
- * \file
- * \ingroup click-tests
+ * @file
+ * @ingroup click-tests
  * Click test suite.
  */
 
 /**
- * \ingroup click-tests
+ * @ingroup click-tests
  * Add Click Internet stack.
  *
- * \param node Node.
+ * @param node Node.
  */
 static void
 AddClickInternetStack(Ptr<Node> node)
@@ -45,13 +45,13 @@
 }
 
 /**
- * \ingroup click-tests
+ * @ingroup click-tests
  * Add network device.
  *
- * \param node Node.
- * \param macaddr MAC address.
- * \param ipv4addr IPv4 address.
- * \param ipv4mask IPv4 mask.
+ * @param node Node.
+ * @param macaddr MAC address.
+ * @param ipv4addr IPv4 address.
+ * @param ipv4mask IPv4 mask.
  */
 static void
 AddNetworkDevice(Ptr<Node> node, Mac48Address macaddr, Ipv4Address ipv4addr, Ipv4Mask ipv4mask)
@@ -70,7 +70,7 @@
 }
 
 /**
- * \ingroup click-tests
+ * @ingroup click-tests
  * Click interface ID from name test.
  */
 class ClickIfidFromNameTest : public TestCase
@@ -120,7 +120,7 @@
 }
 
 /**
- * \ingroup click-tests
+ * @ingroup click-tests
  * Click IP MAC address from name test.
  */
 class ClickIpMacAddressFromNameTest : public TestCase
@@ -184,7 +184,7 @@
 }
 
 /**
- * \ingroup click-tests
+ * @ingroup click-tests
  * Click trivial test.
  */
 class ClickTrivialTest : public TestCase
@@ -232,7 +232,7 @@
 }
 
 /**
- * \ingroup click-tests
+ * @ingroup click-tests
  * Click interface ID from name test.
  */
 class ClickIfidFromNameTestSuite : public TestSuite
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/config-store/examples/config-store-save.cc ns-3.44/src/config-store/examples/config-store-save.cc
--- ns-3.43/src/config-store/examples/config-store-save.cc	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/config-store/examples/config-store-save.cc	2025-03-09 16:55:49.355371000 -0700
@@ -6,22 +6,22 @@
 using namespace ns3;
 
 /**
- * \defgroup configstore-examples Config Store examples
- * \ingroup configstore
- * \ingroup examples
+ * @defgroup configstore-examples Config Store examples
+ * @ingroup configstore
+ * @ingroup examples
  */
 
 /**
- * \ingroup configstore-examples
+ * @ingroup configstore-examples
  *
- * \brief Example class to demonstrate use of the ns-3 Config Store
+ * @brief Example class to demonstrate use of the ns-3 Config Store
  */
 class ConfigExample : public Object
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId()
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/config-store/model/attribute-default-iterator.h ns-3.44/src/config-store/model/attribute-default-iterator.h
--- ns-3.43/src/config-store/model/attribute-default-iterator.h	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/config-store/model/attribute-default-iterator.h	2025-03-09 16:55:49.355371000 -0700
@@ -16,16 +16,16 @@
 {
 
 /**
- * \ingroup configstore
+ * @ingroup configstore
  *
- * \brief Iterator to iterate on the default values of attributes of an ns3::Object
+ * @brief Iterator to iterate on the default values of attributes of an ns3::Object
  */
 class AttributeDefaultIterator
 {
   public:
     virtual ~AttributeDefaultIterator() = 0;
     /**
-     * \brief This function will go through all the TypeIds and get only the attributes which are
+     * @brief This function will go through all the TypeIds and get only the attributes which are
      * explicit values (not vectors or pointer or arrays) and apply StartVisitTypeId
      * and VisitAttribute on the attributes in one TypeId. At the end of each TypeId
      * EndVisitTypeId is called.
@@ -34,29 +34,29 @@
 
   private:
     /**
-     * \brief Begin the analysis of a TypeId
-     * \param name TypeId name
+     * @brief Begin the analysis of a TypeId
+     * @param name TypeId name
      */
     virtual void StartVisitTypeId(std::string name);
     /**
-     * \brief End the analysis of a TypeId
+     * @brief End the analysis of a TypeId
      */
     virtual void EndVisitTypeId();
     /**
-     * \brief Visit an Attribute
-     * \param tid the TypeId the attribute belongs to
-     * \param name the Attribute name
-     * \param defaultValue the attribute default value
-     * \param index the index of the Attribute
+     * @brief Visit an Attribute
+     * @param tid the TypeId the attribute belongs to
+     * @param name the Attribute name
+     * @param defaultValue the attribute default value
+     * @param index the index of the Attribute
      */
     virtual void VisitAttribute(TypeId tid,
                                 std::string name,
                                 std::string defaultValue,
                                 uint32_t index);
     /**
-     * \brief Visit an Attribute
-     * \param name the Attribute name
-     * \param defaultValue the attribute default value
+     * @brief Visit an Attribute
+     * @param name the Attribute name
+     * @param defaultValue the attribute default value
      */
     virtual void DoVisitAttribute(std::string name, std::string defaultValue);
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/config-store/model/attribute-iterator.cc ns-3.44/src/config-store/model/attribute-iterator.cc
--- ns-3.43/src/config-store/model/attribute-iterator.cc	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/config-store/model/attribute-iterator.cc	2025-03-09 16:55:49.355371000 -0700
@@ -220,8 +220,8 @@
             if (ptrChecker != nullptr)
             {
                 NS_LOG_DEBUG("pointer attribute " << info.name);
-                if (info.supportLevel == TypeId::DEPRECATED ||
-                    info.supportLevel == TypeId::OBSOLETE)
+                if (info.supportLevel == TypeId::SupportLevel::DEPRECATED ||
+                    info.supportLevel == TypeId::SupportLevel::OBSOLETE)
                 {
                     continue;
                 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/config-store/model/attribute-iterator.h ns-3.44/src/config-store/model/attribute-iterator.h
--- ns-3.43/src/config-store/model/attribute-iterator.h	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/config-store/model/attribute-iterator.h	2025-03-09 16:55:49.355371000 -0700
@@ -17,10 +17,10 @@
 {
 
 /**
- * \ingroup configstore
+ * @ingroup configstore
  *
- * \brief Iterator to iterate on the values of attributes of an ns3::Object
- * \note This class is used internally by ConfigStore and GtkConfigStore.
+ * @brief Iterator to iterate on the values of attributes of an ns3::Object
+ * @note This class is used internally by ConfigStore and GtkConfigStore.
  */
 class AttributeIterator
 {
@@ -36,7 +36,7 @@
   protected:
     /**
      * Get the current attribute path
-     * \returns the current path string
+     * @returns the current path string
      */
     std::string GetCurrentPath() const;
 
@@ -46,13 +46,13 @@
      * to a text file) on the attribute values corresponding to the input
      * object pointer and attribute name.
      *
-     * \param object the object visited
-     * \param name the attribute name
+     * @param object the object visited
+     * @param name the attribute name
      */
     virtual void DoVisitAttribute(Ptr<Object> object, std::string name) = 0;
     /**
      * This method is called to start the process of visiting the input object
-     * \param object the object visited
+     * @param object the object visited
      */
     virtual void DoStartVisitObject(Ptr<Object> object);
     /**
@@ -64,9 +64,9 @@
      * Visit the attribute of type ns3::PointerValue, with the provided name,
      * found on the object pointed to by the first argument.
      *
-     * \param object the object on which the attribute of type PointerValue resides
-     * \param name the attribute name provided
-     * \param [in] value Ptr to the ns3::Object pointed to by the attribute
+     * @param object the object on which the attribute of type PointerValue resides
+     * @param name the attribute name provided
+     * @param [in] value Ptr to the ns3::Object pointed to by the attribute
      */
     virtual void DoStartVisitPointerAttribute(Ptr<Object> object,
                                               std::string name,
@@ -79,11 +79,11 @@
      * Visit the attribute of type ns3::ObjectVectorValue, with the
      * provided name, found on the object pointed to by the first argument.
      *
-     * \note type name ObjectVectorValue is an alias for ObjectPtrContainerValue
+     * @note type name ObjectVectorValue is an alias for ObjectPtrContainerValue
      *
-     * \param object the object on which the attribute of type ObjectVectorValue resides
-     * \param name the attribute name provided
-     * \param [in] vector the ObjectPtrContainerValue corresponding to the named attribute
+     * @param object the object on which the attribute of type ObjectVectorValue resides
+     * @param name the attribute name provided
+     * @param [in] vector the ObjectPtrContainerValue corresponding to the named attribute
      */
     virtual void DoStartVisitArrayAttribute(Ptr<Object> object,
                                             std::string name,
@@ -94,9 +94,9 @@
     virtual void DoEndVisitArrayAttribute();
     /**
      * Start to visit the object found in the input array at the provided index
-     * \param vector the array
-     * \param index the index into the array
-     * \param [in] item the array item to visit
+     * @param vector the array
+     * @param index the index into the array
+     * @param [in] item the array item to visit
      */
     virtual void DoStartVisitArrayItem(const ObjectPtrContainerValue& vector,
                                        uint32_t index,
@@ -108,31 +108,31 @@
 
     /**
      * Perform the iteration
-     * \param object the object visited
+     * @param object the object visited
      */
     void DoIterate(Ptr<Object> object);
     /**
      * Check if this object has already been examined
-     * \param object the object to check
-     * \returns true if object has been examined
+     * @param object the object to check
+     * @returns true if object has been examined
      */
     bool IsExamined(Ptr<const Object> object);
     /**
      * Get current attribute path
-     * \param attr the current attribute string
-     * \returns the current path string
+     * @param attr the current attribute string
+     * @returns the current path string
      */
     std::string GetCurrentPath(std::string attr) const;
 
     /**
      * Visit attribute to perform a config store operation on it
-     * \param object the current object
-     * \param name the attribute name
+     * @param object the current object
+     * @param name the attribute name
      */
     void VisitAttribute(Ptr<Object> object, std::string name);
     /**
      * Start to visit an object to visit its attributes
-     * \param object the current object
+     * @param object the current object
      */
     void StartVisitObject(Ptr<Object> object);
     /**
@@ -143,9 +143,9 @@
      * Visit the attribute of type ns3::PointerValue, with the provided name,
      * found on the object pointed to by the first argument.
      *
-     * \param object the object on which the attribute of type PointerValue resides
-     * \param name the attribute name provided
-     * \param [in] value Ptr to the ns3::Object pointed to by the attribute
+     * @param object the object on which the attribute of type PointerValue resides
+     * @param name the attribute name provided
+     * @param [in] value Ptr to the ns3::Object pointed to by the attribute
      */
     void StartVisitPointerAttribute(Ptr<Object> object, std::string name, Ptr<Object> value);
     /**
@@ -156,11 +156,11 @@
      * Visit the attribute of type ns3::ObjectVectorValue, with the
      * provided name, found on the object pointed to by the first argument.
      *
-     * \note type name ObjectVectorValue is an alias for ObjectPtrContainerValue
+     * @note type name ObjectVectorValue is an alias for ObjectPtrContainerValue
      *
-     * \param object the object on which the attribute of type ObjectVectorValue resides
-     * \param name the attribute name provided
-     * \param [in] vector the ObjectPtrContainerValue corresponding to the named attribute
+     * @param object the object on which the attribute of type ObjectVectorValue resides
+     * @param name the attribute name provided
+     * @param [in] vector the ObjectPtrContainerValue corresponding to the named attribute
      */
     void StartVisitArrayAttribute(Ptr<Object> object,
                                   std::string name,
@@ -171,9 +171,9 @@
     void EndVisitArrayAttribute();
     /**
      * Start to visit the object found in the input array at the provided index
-     * \param vector the array
-     * \param index the index into the array
-     * \param [in] item the array item to visit
+     * @param vector the array
+     * @param index the index into the array
+     * @param [in] item the array item to visit
      */
     void StartVisitArrayItem(const ObjectPtrContainerValue& vector,
                              uint32_t index,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/config-store/model/config-store.cc ns-3.44/src/config-store/model/config-store.cc
--- ns-3.43/src/config-store/model/config-store.cc	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/config-store/model/config-store.cc	2025-03-09 16:55:49.355371000 -0700
@@ -13,7 +13,6 @@
 #include "ns3/abort.h"
 #include "ns3/attribute-construction-list.h"
 #include "ns3/boolean.h"
-#include "ns3/config-store-config.h"
 #include "ns3/enum.h"
 #include "ns3/log.h"
 #include "ns3/simulator.h"
@@ -26,7 +25,6 @@
 #include <fstream>
 #include <iostream>
 #include <string>
-#include <unistd.h>
 
 namespace ns3
 {
@@ -69,7 +67,7 @@
                 BooleanValue(true),
                 MakeBooleanAccessor(&ConfigStore::SetSaveDeprecated),
                 MakeBooleanChecker(),
-                TypeId::OBSOLETE,
+                TypeId::SupportLevel::OBSOLETE,
                 "OBSOLETE since ns-3.43 as it is no longer needed; deprecated attributes are saved "
                 "only if their value differs from their respective original initial value");
     return tid;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/config-store/model/config-store.h ns-3.44/src/config-store/model/config-store.h
--- ns-3.43/src/config-store/model/config-store.h	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/config-store/model/config-store.h	2025-03-09 16:55:49.355371000 -0700
@@ -17,9 +17,9 @@
 {
 
 /**
- * \defgroup configstore Configuration Store/Load
+ * @defgroup configstore Configuration Store/Load
  *
- * \brief Store and load simulation attribute configuration
+ * @brief Store and load simulation attribute configuration
  *
  * ns-3 Objects and their attribute values (default, and per-instance values)
  * are stored in a specialized internal database.  The config-store module
@@ -43,15 +43,15 @@
  */
 
 /**
- * \ingroup configstore
+ * @ingroup configstore
  *
  */
 class ConfigStore : public ObjectBase
 {
   public:
     /**
-     * \enum Mode for ConfigStore operation
-     * \brief store / load mode
+     * @enum Mode for ConfigStore operation
+     * @brief store / load mode
      */
     enum Mode
     {
@@ -61,8 +61,8 @@
     };
 
     /**
-     * \enum FileFormat for ConfigStore operation
-     * \brief file format
+     * @enum FileFormat for ConfigStore operation
+     * @brief file format
      */
     /// store format
     enum FileFormat
@@ -72,8 +72,8 @@
     };
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -83,22 +83,22 @@
 
     /**
      * Set the mode of operation
-     * \param mode mode of operation
+     * @param mode mode of operation
      */
     void SetMode(Mode mode);
     /**
      * Set the file format
-     * \param format the file format
+     * @param format the file format
      */
     void SetFileFormat(FileFormat format);
     /**
      * Set the filename
-     * \param filename the file name
+     * @param filename the file name
      */
     void SetFilename(std::string filename);
     /**
      * Set if to save deprecated attributes
-     * \param saveDeprecated the deprecated attributes save policy
+     * @param saveDeprecated the deprecated attributes save policy
      */
     void SetSaveDeprecated(bool saveDeprecated);
 
@@ -120,19 +120,19 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param [in] os The reference to the output stream.
- * \param [in] mode The configStore mode.
- * \returns The reference to the output stream.
+ * @param [in] os The reference to the output stream.
+ * @param [in] mode The configStore mode.
+ * @returns The reference to the output stream.
  */
 std::ostream& operator<<(std::ostream& os, ConfigStore::Mode& mode);
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param [in] os The reference to the output stream.
- * \param [in] format The configStore file format.
- * \returns The reference to the output stream.
+ * @param [in] os The reference to the output stream.
+ * @param [in] format The configStore file format.
+ * @returns The reference to the output stream.
  */
 std::ostream& operator<<(std::ostream& os, ConfigStore::FileFormat& format);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/config-store/model/display-functions.cc ns-3.44/src/config-store/model/display-functions.cc
--- ns-3.43/src/config-store/model/display-functions.cc	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/config-store/model/display-functions.cc	2025-03-09 16:55:49.355371000 -0700
@@ -420,13 +420,13 @@
  * an attribute value and the type of the object for an attribute object or a
  * typeID object
  *
- * \param widget is the display object
- * \param x is the x position
- * \param y is the y position
- * \param keyboard_tip
- * \param tooltip is the tooltip information to be displayed
- * \param user_data
- * \return false if the tooltip is not displayed
+ * @param widget is the display object
+ * @param x is the x position
+ * @param y is the y position
+ * @param keyboard_tip
+ * @param tooltip is the tooltip information to be displayed
+ * @param user_data
+ * @return false if the tooltip is not displayed
  */
 gboolean
 cell_tooltip_callback_config_default(GtkWidget* widget,
@@ -507,8 +507,8 @@
  * This is the action done when the user presses on the save button.
  * It will save the config to a file.
  *
- * \param button (unused)
- * \param user_data
+ * @param button (unused)
+ * @param user_data
  */
 void
 save_clicked_default(GtkButton* button, gpointer user_data)
@@ -545,8 +545,8 @@
 /*
  * If the user presses the button load, it will load the config file into memory.
  *
- * \param button (unused)
- * \param user_data
+ * @param button (unused)
+ * @param user_data
  */
 void
 load_clicked_default(GtkButton* button, gpointer user_data)
@@ -577,8 +577,8 @@
  * This is the action done when the user presses on the save button.
  * It will save the config to a file.
  *
- * \param button (unused)
- * \param user_data
+ * @param button (unused)
+ * @param user_data
  */
 void
 save_clicked_attribute(GtkButton* button, gpointer user_data)
@@ -615,8 +615,8 @@
 /*
  * If the user presses the button load, it will load the config file into memory.
  *
- * \param button (unused)
- * \param user_data
+ * @param button (unused)
+ * @param user_data
  */
 void
 load_clicked_attribute(GtkButton* button, gpointer user_data)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/config-store/model/display-functions.h ns-3.44/src/config-store/model/display-functions.h
--- ns-3.43/src/config-store/model/display-functions.h	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/config-store/model/display-functions.h	2025-03-09 16:55:49.355371000 -0700
@@ -18,11 +18,11 @@
  * This function includes the name of the attribute or the editable value
  * in the second column
  *
- * \param col Pointer to the GtkTreeViewColumn
- * \param renderer Pointer to the GtkCellRenderer
- * \param model Pointer to the GtkTreeModel
- * \param iter  Pointer to the GtkTreeIter
- * \param user_data Pointer to the data to be displayed (or modified)
+ * @param col Pointer to the GtkTreeViewColumn
+ * @param renderer Pointer to the GtkCellRenderer
+ * @param model Pointer to the GtkTreeModel
+ * @param iter  Pointer to the GtkTreeIter
+ * @param user_data Pointer to the data to be displayed (or modified)
  */
 void cell_data_function_col_1(GtkTreeViewColumn* col,
                               GtkCellRenderer* renderer,
@@ -32,11 +32,11 @@
 /**
  * This function includes the name of the object, pointer, vector or vector item
  * in the first column
- * \param col Pointer to the GtkTreeViewColumn
- * \param renderer Pointer to the GtkCellRenderer
- * \param model Pointer to the GtkTreeModel
- * \param iter  Pointer to the GtkTreeIter
- * \param user_data Pointer to the data to be displayed (or modified)
+ * @param col Pointer to the GtkTreeViewColumn
+ * @param renderer Pointer to the GtkCellRenderer
+ * @param model Pointer to the GtkTreeModel
+ * @param iter  Pointer to the GtkTreeIter
+ * @param user_data Pointer to the data to be displayed (or modified)
  */
 void cell_data_function_col_0(GtkTreeViewColumn* col,
                               GtkCellRenderer* renderer,
@@ -46,10 +46,10 @@
 /**
  * This is the callback called when the value of an attribute is changed
  *
- * \param cell the changed cell
- * \param path_string the path
- * \param new_text the updated text in the cell
- * \param user_data user data
+ * @param cell the changed cell
+ * @param path_string the path
+ * @param new_text the updated text in the cell
+ * @param user_data user data
  */
 void cell_edited_callback(GtkCellRendererText* cell,
                           gchar* path_string,
@@ -58,21 +58,21 @@
 /**
  * This function gets the column number 0 or 1 from the mouse
  * click
- * \param col the column being clicked
- * \returns the column index
+ * @param col the column being clicked
+ * @returns the column index
  */
 int get_col_number_from_tree_view_column(GtkTreeViewColumn* col);
 /**
  * This function displays the tooltip for an object, pointer, vector
  * item or an attribute
  *
- * \param widget is the display object
- * \param x is the x position
- * \param y is the y position
- * \param keyboard_tip
- * \param tooltip is the tooltip information to be displayed
- * \param user_data
- * \return false if the tooltip is not displayed
+ * @param widget is the display object
+ * @param x is the x position
+ * @param y is the y position
+ * @param keyboard_tip
+ * @param tooltip is the tooltip information to be displayed
+ * @param user_data
+ * @return false if the tooltip is not displayed
  */
 gboolean cell_tooltip_callback(GtkWidget* widget,
                                gint x,
@@ -83,31 +83,31 @@
 /**
  * This is the main view opening the widget, getting tooltips and drawing the
  * tree of attributes...
- * \param model the GtkTreeStore model
- * \returns a GtkWidget on success
+ * @param model the GtkTreeStore model
+ * @returns a GtkWidget on success
  */
 GtkWidget* create_view(GtkTreeStore* model);
 /**
  * Exit the window when exit button is pressed
- * \param button the pressed button
- * \param user_data
+ * @param button the pressed button
+ * @param user_data
  */
 void exit_clicked_callback(GtkButton* button, gpointer user_data);
 /**
  * Exit the application
- * \param widget a pointer to the widget
- * \param event the event responsible for the application exit
- * \param user_data user data
- * \returns true on clean exit
+ * @param widget a pointer to the widget
+ * @param event the event responsible for the application exit
+ * @param user_data user data
+ * @returns true on clean exit
  */
 gboolean delete_event_callback(GtkWidget* widget, GdkEvent* event, gpointer user_data);
 /**
  * Delete the tree model contents
- * \param model the GtkTreeModel
- * \param path the GtkTreePath
- * \param iter a GtkTreeIter
- * \param data user data
- * \return true if an error occurred.
+ * @param model the GtkTreeModel
+ * @param path the GtkTreePath
+ * @param iter a GtkTreeIter
+ * @param data user data
+ * @return true if an error occurred.
  */
 gboolean clean_model_callback(GtkTreeModel* model,
                               GtkTreePath* path,
@@ -120,11 +120,11 @@
  * This function writes data in the second column, this data is going to be editable
  * if it is a NODE_ATTRIBUTE
  *
- * \param col Pointer to the GtkTreeViewColumn
- * \param renderer Pointer to the GtkCellRenderer
- * \param model Pointer to the GtkTreeModel
- * \param iter  Pointer to the GtkTreeIter
- * \param user_data Pointer to the data to be displayed (or modified)
+ * @param col Pointer to the GtkTreeViewColumn
+ * @param renderer Pointer to the GtkCellRenderer
+ * @param model Pointer to the GtkTreeModel
+ * @param iter  Pointer to the GtkTreeIter
+ * @param user_data Pointer to the data to be displayed (or modified)
  */
 void cell_data_function_col_1_config_default(GtkTreeViewColumn* col,
                                              GtkCellRenderer* renderer,
@@ -133,11 +133,11 @@
                                              gpointer user_data);
 /**
  * This function writes the attribute or typeid name in the column 0
- * \param col Pointer to the GtkTreeViewColumn
- * \param renderer Pointer to the GtkCellRenderer
- * \param model Pointer to the GtkTreeModel
- * \param iter  Pointer to the GtkTreeIter
- * \param user_data Pointer to the data to be displayed (or modified)
+ * @param col Pointer to the GtkTreeViewColumn
+ * @param renderer Pointer to the GtkCellRenderer
+ * @param model Pointer to the GtkTreeModel
+ * @param iter  Pointer to the GtkTreeIter
+ * @param user_data Pointer to the data to be displayed (or modified)
  */
 void cell_data_function_col_0_config_default(GtkTreeViewColumn* col,
                                              GtkCellRenderer* renderer,
@@ -148,31 +148,31 @@
  * This is the action done when the user presses on the save button for the Default attributes.
  * It will save the config to a file.
  *
- * \param button (unused)
- * \param user_data
+ * @param button (unused)
+ * @param user_data
  */
 void save_clicked_default(GtkButton* button, gpointer user_data);
 /**
  * If the user presses the button load, it will load the config file into memory for the Default
  * attributes.
  *
- * \param button (unused)
- * \param user_data
+ * @param button (unused)
+ * @param user_data
  */
 void load_clicked_default(GtkButton* button, gpointer user_data);
 /**
  * This is the action done when the user presses on the save button for the Attributes.
  * It will save the config to a file.
  *
- * \param button (unused)
- * \param user_data
+ * @param button (unused)
+ * @param user_data
  */
 void save_clicked_attribute(GtkButton* button, gpointer user_data);
 /**
  * If the user presses the button load, it will load the config file into memory for the Attributes.
  *
- * \param button (unused)
- * \param user_data
+ * @param button (unused)
+ * @param user_data
  */
 void load_clicked_attribute(GtkButton* button, gpointer user_data);
 /**
@@ -180,10 +180,10 @@
  * If the input value is ok, it will be updated in the default value and in the
  * GUI, otherwise, it won't be updated in both.
  *
- * \param cell the changed cell
- * \param path_string the path
- * \param new_text the updated text in the cell
- * \param user_data user data
+ * @param cell the changed cell
+ * @param path_string the path
+ * @param new_text the updated text in the cell
+ * @param user_data user data
  */
 void cell_edited_callback_config_default(GtkCellRendererText* cell,
                                          gchar* path_string,
@@ -195,13 +195,13 @@
  * an attribute value and the type of the object for an attribute object or a
  * typeID object
  *
- * \param widget is the display object
- * \param x is the x position
- * \param y is the y position
- * \param keyboard_tip
- * \param tooltip is the tooltip information to be displayed
- * \param user_data
- * \return false if the tooltip is not displayed
+ * @param widget is the display object
+ * @param x is the x position
+ * @param y is the y position
+ * @param keyboard_tip
+ * @param tooltip is the tooltip information to be displayed
+ * @param user_data
+ * @return false if the tooltip is not displayed
  */
 gboolean cell_tooltip_callback_config_default(GtkWidget* widget,
                                               gint x,
@@ -212,17 +212,17 @@
 /**
  * This is the main view opening the widget, getting tooltips and drawing the
  * tree of attributes
- * \param model the GtkTreeStore model
- * \returns a GtkWidget on success
+ * @param model the GtkTreeStore model
+ * @returns a GtkWidget on success
  */
 GtkWidget* create_view_config_default(GtkTreeStore* model);
 /**
  * Delete the tree model contents
- * \param model the GtkTreeModel
- * \param path the GtkTreePath
- * \param iter a GtkTreeIter
- * \param data user data
- * \return true if an error occurred.
+ * @param model the GtkTreeModel
+ * @param path the GtkTreePath
+ * @param iter a GtkTreeIter
+ * @param data user data
+ * @return true if an error occurred.
  */
 gboolean clean_model_callback_config_default(GtkTreeModel* model,
                                              GtkTreePath* path,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/config-store/model/file-config.h ns-3.44/src/config-store/model/file-config.h
--- ns-3.43/src/config-store/model/file-config.h	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/config-store/model/file-config.h	2025-03-09 16:55:49.355371000 -0700
@@ -15,8 +15,8 @@
 {
 
 /**
- * \ingroup configstore
- * \brief base class for ConfigStore classes using files
+ * @ingroup configstore
+ * @brief base class for ConfigStore classes using files
  *
  */
 class FileConfig
@@ -25,7 +25,7 @@
     virtual ~FileConfig();
     /**
      * Set the file name
-     * \param filename the filename
+     * @param filename the filename
      */
     virtual void SetFilename(std::string filename) = 0;
     /**
@@ -43,8 +43,8 @@
 };
 
 /**
- * \ingroup configstore
- * \brief A dummy class (does nothing)
+ * @ingroup configstore
+ * @brief A dummy class (does nothing)
  */
 class NoneFileConfig : public FileConfig
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/config-store/model/gtk-config-store.h ns-3.44/src/config-store/model/gtk-config-store.h
--- ns-3.43/src/config-store/model/gtk-config-store.h	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/config-store/model/gtk-config-store.h	2025-03-09 16:55:49.355371000 -0700
@@ -12,8 +12,8 @@
 {
 
 /**
- * \ingroup configstore
- * \brief A class that provides a GTK-based front end to ns3::ConfigStore
+ * @ingroup configstore
+ * @brief A class that provides a GTK-based front end to ns3::ConfigStore
  *
  */
 class GtkConfigStore
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/config-store/model/model-node-creator.h ns-3.44/src/config-store/model/model-node-creator.h
--- ns-3.43/src/config-store/model/model-node-creator.h	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/config-store/model/model-node-creator.h	2025-03-09 16:55:49.355371000 -0700
@@ -19,13 +19,13 @@
 };
 
 /**
- * \ingroup configstore
- * \brief A class used in the implementation of the GtkConfigStore
+ * @ingroup configstore
+ * @brief A class used in the implementation of the GtkConfigStore
  */
 struct ModelNode
 {
     /**
-     * \brief node type structure
+     * @brief node type structure
      */
     enum
     {
@@ -47,8 +47,8 @@
 };
 
 /**
- * \ingroup configstore
- * \brief ModelCreator class
+ * @ingroup configstore
+ * @brief ModelCreator class
  *
  */
 class ModelCreator : public AttributeIterator
@@ -58,7 +58,7 @@
 
     /**
      * Allocate attribute tree
-     * \param treestore GtkTreeStore *
+     * @param treestore GtkTreeStore *
      */
     void Build(GtkTreeStore* treestore);
 
@@ -80,7 +80,7 @@
     void DoEndVisitArrayItem() override;
     /**
      * Add item to attribute tree
-     * \param node The model node
+     * @param node The model node
      */
     void Add(ModelNode* node);
     /// Remove current tree item
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/config-store/model/model-typeid-creator.h ns-3.44/src/config-store/model/model-typeid-creator.h
--- ns-3.43/src/config-store/model/model-typeid-creator.h	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/config-store/model/model-typeid-creator.h	2025-03-09 16:55:49.355371000 -0700
@@ -21,13 +21,13 @@
 };
 
 /**
- * \ingroup configstore
- * \brief A class used in the implementation of the GtkConfigStore
+ * @ingroup configstore
+ * @brief A class used in the implementation of the GtkConfigStore
  */
 struct ModelTypeid
 {
     /**
-     * \brief Whether the node represents an attribute or TypeId
+     * @brief Whether the node represents an attribute or TypeId
      */
     enum
     {
@@ -48,45 +48,45 @@
 };
 
 /**
- * \ingroup configstore
- * \brief ModelTypeIdCreator class
+ * @ingroup configstore
+ * @brief ModelTypeIdCreator class
  */
 class ModelTypeidCreator : public AttributeDefaultIterator
 {
   public:
     ModelTypeidCreator();
     /**
-     * \brief This method will iterate on typeIds having default attributes and create a model
+     * @brief This method will iterate on typeIds having default attributes and create a model
      * for them, this model will be used by the view.
      *
-     * \param treestore the GtkTreeStore.
+     * @param treestore the GtkTreeStore.
      */
     void Build(GtkTreeStore* treestore);
 
   private:
     /**
-     * \brief This method will add a ModelTypeid to the GtkTreeIterator
-     * \param tid TypeId
-     * \param name attribute name
-     * \param defaultValue default value
-     * \param index index of the attribute in the specified Typeid
+     * @brief This method will add a ModelTypeid to the GtkTreeIterator
+     * @param tid TypeId
+     * @param name attribute name
+     * @param defaultValue default value
+     * @param index index of the attribute in the specified Typeid
      */
     void VisitAttribute(TypeId tid,
                         std::string name,
                         std::string defaultValue,
                         uint32_t index) override;
     /**
-     * \brief Add a node for the new TypeId object
-     * \param name TypeId name
+     * @brief Add a node for the new TypeId object
+     * @param name TypeId name
      */
     void StartVisitTypeId(std::string name) override;
     /**
-     * \brief Remove the last gtk tree iterator
+     * @brief Remove the last gtk tree iterator
      */
     void EndVisitTypeId() override;
     /**
-     * \brief Adds a treestore iterator to m_treestore model
-     * \param node the node to be added
+     * @brief Adds a treestore iterator to m_treestore model
+     * @param node the node to be added
      */
     void Add(ModelTypeid* node);
     /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/config-store/model/raw-text-config.h ns-3.44/src/config-store/model/raw-text-config.h
--- ns-3.43/src/config-store/model/raw-text-config.h	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/config-store/model/raw-text-config.h	2025-03-09 16:55:49.355371000 -0700
@@ -18,8 +18,8 @@
 {
 
 /**
- * \ingroup configstore
- * \brief A class to enable saving of configuration store in a raw text file
+ * @ingroup configstore
+ * @brief A class to enable saving of configuration store in a raw text file
  *
  */
 class RawTextConfigSave : public FileConfig
@@ -39,8 +39,8 @@
 };
 
 /**
- * \ingroup configstore
- * \brief A class to enable loading of configuration store from a raw text file
+ * @ingroup configstore
+ * @brief A class to enable loading of configuration store from a raw text file
  *
  */
 class RawTextConfigLoad : public FileConfig
@@ -60,11 +60,11 @@
      * This will return \c false for blank lines, comments (lines beginning with '#'),
      * and incomplete entries. An entry is considered complete when a type and name
      * have been found and the value contains two delimiting quotation marks '"'.
-     * \param line the config file line
-     * \param type the config type {default, global, value}
-     * \param name the config attribute name
-     * \param value the value to set
-     * \returns true if all of type, name, and value parsed; false otherwise
+     * @param line the config file line
+     * @param type the config type {default, global, value}
+     * @param name the config attribute name
+     * @param value the value to set
+     * @returns true if all of type, name, and value parsed; false otherwise
      *
      */
     virtual bool ParseLine(const std::string& line,
@@ -74,8 +74,8 @@
 
     /**
      * Strip out attribute value
-     * \param value the input string
-     * \returns the updated string
+     * @param value the input string
+     * @returns the updated string
      */
     std::string Strip(std::string value);
     /// Config store input stream
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/config-store/model/xml-config.h ns-3.44/src/config-store/model/xml-config.h
--- ns-3.43/src/config-store/model/xml-config.h	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/config-store/model/xml-config.h	2025-03-09 16:55:49.355371000 -0700
@@ -22,8 +22,8 @@
 {
 
 /**
- * \ingroup configstore
- * \brief A class to enable saving of configuration store in an XML file
+ * @ingroup configstore
+ * @brief A class to enable saving of configuration store in an XML file
  *
  */
 class XmlConfigSave : public FileConfig
@@ -42,8 +42,8 @@
 };
 
 /**
- * \ingroup configstore
- * \brief A class to enable loading of configuration store from an XML file
+ * @ingroup configstore
+ * @brief A class to enable loading of configuration store from an XML file
  */
 class XmlConfigLoad : public FileConfig
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/CMakeLists.txt ns-3.44/src/core/CMakeLists.txt
--- ns-3.43/src/core/CMakeLists.txt	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/CMakeLists.txt	2025-03-09 16:55:49.355371000 -0700
@@ -2,7 +2,6 @@
 set(libraries_to_link)
 
 set(config_headers
-    ${CMAKE_HEADER_OUTPUT_DIRECTORY}/config-store-config.h
     ${CMAKE_HEADER_OUTPUT_DIRECTORY}/core-config.h
 )
 if(${ENABLE_BUILD_VERSION})
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/doc/core.h ns-3.44/src/core/doc/core.h
--- ns-3.43/src/core/doc/core.h	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/doc/core.h	2025-03-09 16:55:49.355371000 -0700
@@ -11,14 +11,14 @@
  */
 
 /**
- * \file
- * \ingroup core
+ * @file
+ * @ingroup core
  * This file provides some doxygen documentation for the core module.
  */
 
 /**
- * \defgroup core Core
- * \brief The "core" module contains:
+ * @defgroup core Core
+ * @brief The "core" module contains:
  *    - a time management class to hold a time and convert between various
  *      time units: ns3::Time
  *    - a scheduler base class used to implement new simulation event
@@ -42,38 +42,38 @@
  *    - a configuration class used to set and control all attributes and
  *      trace sources in a simulation: ns3::Config.
  *
- * \todo Move all Private and Impl classes to namespace ns3::impl?
+ * @todo Move all Private and Impl classes to namespace ns3::impl?
  */
 
 /**
- * \ingroup core
- * \defgroup debugging Debugging tools
+ * @ingroup core
+ * @defgroup debugging Debugging tools
  *
  * Assertions, breakpoints, logging, and abnormal program termination
  */
 
 /**
- * \ingroup core
- * \defgroup core-examples Core module examples
+ * @ingroup core
+ * @defgroup core-examples Core module examples
  *  Programs which illustrate use of core module functionality.
  */
 
 /**
- * \ingroup core
- * \defgroup core-helpers Core module helper classes
+ * @ingroup core
+ * @defgroup core-helpers Core module helper classes
  * Helper classes for the Core module
  */
 
 /**
- * \ingroup tests
- * \ingroup core
- * \defgroup core-tests Core module tests
+ * @ingroup tests
+ * @ingroup core
+ * @defgroup core-tests Core module tests
  * TestSuites for the Core module
  */
 
 /**
- * \ingroup core
- * \defgroup system System Services
+ * @ingroup core
+ * @defgroup system System Services
  *
  * System-independent interfaces to operating system services:
  * environment variables, files system, threading, wall clock time.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/doc/environment-variables.h ns-3.44/src/core/doc/environment-variables.h
--- ns-3.43/src/core/doc/environment-variables.h	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/doc/environment-variables.h	2025-03-09 16:55:49.355371000 -0700
@@ -10,13 +10,13 @@
 // It should *NOT* be included in the build.
 
 /**
- * \ingroup system
- * \defgroup core-environ Environment Variables
+ * @ingroup system
+ * @defgroup core-environ Environment Variables
  */
 
 /**
- * \ingroup core-environ
- * \brief Initialize an ns3::Attribute
+ * @ingroup core-environ
+ * @brief Initialize an ns3::Attribute
  *
  * Sets a new default \pname{value} for an Attribute.
  * This is invoked if the ns3::Object being constructed has an Attribute
@@ -53,8 +53,8 @@
 const char* NS_ATTRIBUTE_DEFAULT = "name=value[;...]";
 
 /**
- * \ingroup core-environ
- * \brief Write the ns3::CommandLine::Usage message, in Doxygen format,
+ * @ingroup core-environ
+ * @brief Write the ns3::CommandLine::Usage message, in Doxygen format,
  * to the referenced location.
  *
  * Set the directory where ns3::CommandLine instances should write their Usage
@@ -81,8 +81,8 @@
 const char* NS_COMMANDLINE_INTROSPECTION = "path";
 
 /**
- * \ingroup core-environ
- * \brief Initialize a ns3::GlobalValue.
+ * @ingroup core-environ
+ * @brief Initialize a ns3::GlobalValue.
  *
  * Initialize the ns3::GlobalValue \pname{name} from \pname{value}.
  *
@@ -114,8 +114,8 @@
 const char* NS_GLOBAL_VALUE = "name=value[;...]";
 
 /**
- * \ingroup core-environ
- * \brief Control which logging components are enabled.
+ * @ingroup core-environ
+ * @brief Control which logging components are enabled.
  *
  * Enable logging from specific \pname{component}s, with specified \pname{option}s.
  * See the \ref logging module, or the Logging chapter
@@ -148,8 +148,8 @@
 const char* NS_LOG = "component=option[|option...][:...]";
 
 /**
- * \ingroup core-environ
- * \brief Where to make temporary directories.
+ * @ingroup core-environ
+ * @brief Where to make temporary directories.
  *
  * The absolute path where ns-3 should make temporary directories.
  *
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/examples/assert-example.cc ns-3.44/src/core/examples/assert-example.cc
--- ns-3.43/src/core/examples/assert-example.cc	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/examples/assert-example.cc	2025-03-09 16:55:49.355371000 -0700
@@ -7,9 +7,9 @@
  */
 
 /**
- * \file
- * \ingroup core-examples
- * \ingroup assert
+ * @file
+ * @ingroup core-examples
+ * @ingroup assert
  * Example program illustrating the use of NS_ASSERT_MSG()
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/examples/build-version-example.cc ns-3.44/src/core/examples/build-version-example.cc
--- ns-3.43/src/core/examples/build-version-example.cc	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/examples/build-version-example.cc	2025-03-09 16:55:49.355371000 -0700
@@ -14,8 +14,8 @@
 #include <string>
 
 /**
- * \file
- * \ingroup core-examples
+ * @file
+ * @ingroup core-examples
  * Example program illustrating use of ns3::Version.
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/examples/CMakeLists.txt ns-3.44/src/core/examples/CMakeLists.txt
--- ns-3.43/src/core/examples/CMakeLists.txt	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/examples/CMakeLists.txt	2025-03-09 16:55:49.355371000 -0700
@@ -53,7 +53,7 @@
   NAME empirical-random-variable-example
   SOURCE_FILES empirical-random-variable-example.cc
   LIBRARIES_TO_LINK ${libcore}
-                    ${libflow-monitor}
+                    ${libstats}
 )
 
 build_lib_example(
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/examples/command-line-example.cc ns-3.44/src/core/examples/command-line-example.cc
--- ns-3.43/src/core/examples/command-line-example.cc	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/examples/command-line-example.cc	2025-03-09 16:55:49.355371000 -0700
@@ -13,9 +13,9 @@
 #include <string>
 
 /**
- * \file
- * \ingroup core-examples
- * \ingroup commandline
+ * @file
+ * @ingroup core-examples
+ * @ingroup commandline
  * Example program illustrating use of ns3::CommandLine.
  */
 
@@ -34,8 +34,8 @@
  * Function to illustrate command line arguments handled by a
  * Callback function.
  *
- * \param [in] val New value for \pname{g_cbArg}.
- * \returns \c true.
+ * @param [in] val New value for \pname{g_cbArg}.
+ * @returns \c true.
  */
 bool
 SetCbArg(const std::string& val)
@@ -50,9 +50,9 @@
  * Print a row containing the name, the default
  * and the final values of an argument.
  *
- * \param [in] label The argument label.
- * \param [in] defaultValue The default value of the argument.
- * \param [in] finalValue The final value of the argument.
+ * @param [in] label The argument label.
+ * @param [in] defaultValue The default value of the argument.
+ * @param [in] finalValue The final value of the argument.
  *
  */
 #define DefaultFinal(label, defaultValue, finalValue)                                              \
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/examples/empirical-random-variable-example.cc ns-3.44/src/core/examples/empirical-random-variable-example.cc
--- ns-3.43/src/core/examples/empirical-random-variable-example.cc	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/examples/empirical-random-variable-example.cc	2025-03-09 16:55:49.355371000 -0700
@@ -18,13 +18,13 @@
 #include <map>
 
 /**
- * \defgroup empirical-rng-example Core example: Empirical random variables use.
- * \ingroup core-examples randomvariable
+ * @defgroup empirical-rng-example Core example: Empirical random variables use.
+ * @ingroup core-examples randomvariable
  */
 
 /**
- * \file
- * \ingroup empirical-rng-example
+ * @file
+ * @ingroup empirical-rng-example
  *
  * Example program illustrating use of ns3::EmpiricalRandomVariable
  *
@@ -43,11 +43,11 @@
 using namespace ns3;
 
 /**
- * \ingroup empirical-rng-example
+ * @ingroup empirical-rng-example
  *
- * \brief Sample the random variable only once.
- * \param mode Rng mode (Normal or Antithetic).
- * \param erv The empirical random variable.
+ * @brief Sample the random variable only once.
+ * @param mode Rng mode (Normal or Antithetic).
+ * @param erv The empirical random variable.
  */
 void
 RunSingleSample(std::string mode, Ptr<EmpiricalRandomVariable> erv)
@@ -69,13 +69,13 @@
 }
 
 /**
- * \ingroup empirical-rng-example
+ * @ingroup empirical-rng-example
  *
- * \brief Prints a stat line.
- * \param value The value to print.
- * \param count The number of times that value has been sampled.
- * \param n The total number of random values sampled.
- * \param sum The sum of the counts seen up to \p value, used to show
+ * @brief Prints a stat line.
+ * @param value The value to print.
+ * @param count The number of times that value has been sampled.
+ * @param n The total number of random values sampled.
+ * @param sum The sum of the counts seen up to \p value, used to show
  *            the CDF for \p value.
  */
 void
@@ -88,13 +88,13 @@
 }
 
 /**
- * \ingroup empirical-rng-example
+ * @ingroup empirical-rng-example
  *
- * \brief Prints the summary.
- * \param sum The number of sampled values.
- * \param n The total number of random values to be drawn.
- * \param weighted The average of the sample.
- * \param expected The expected average of the sample.
+ * @brief Prints the summary.
+ * @param sum The number of sampled values.
+ * @param n The total number of random values to be drawn.
+ * @param weighted The average of the sample.
+ * @param expected The expected average of the sample.
  */
 void
 PrintSummary(long sum, long n, double weighted, double expected)
@@ -111,12 +111,12 @@
 }
 
 /**
- * \ingroup empirical-rng-example
+ * @ingroup empirical-rng-example
  *
- * \brief Sample the random variable.
- * \param mode Rng mode (Normal or Antithetic).
- * \param erv The empirical random variable.
- * \param n Number of samples to draw.
+ * @brief Sample the random variable.
+ * @param mode Rng mode (Normal or Antithetic).
+ * @param erv The empirical random variable.
+ * @param n Number of samples to draw.
  */
 void
 RunBothModes(std::string mode, Ptr<EmpiricalRandomVariable> erv, long n)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/examples/fatal-example.cc ns-3.44/src/core/examples/fatal-example.cc
--- ns-3.43/src/core/examples/fatal-example.cc	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/examples/fatal-example.cc	2025-03-09 16:55:49.355371000 -0700
@@ -13,10 +13,10 @@
 #include <iostream>
 
 /**
- * \file
- * \defgroup fatal-example Core example: NS_FATAL error handlers
- * \ingroup core-examples
- * \ingroup fatal
+ * @file
+ * @defgroup fatal-example Core example: NS_FATAL error handlers
+ * @ingroup core-examples
+ * @ingroup fatal
  *
  * Example program illustrating use of the NS_FATAL error handlers.
  */
@@ -24,8 +24,8 @@
 using namespace ns3;
 
 /**
- * \ingroup fatal-example
- * \brief Triggers a fatal error without message, deferring termination.
+ * @ingroup fatal-example
+ * @brief Triggers a fatal error without message, deferring termination.
  */
 void
 FatalNoMsg()
@@ -35,8 +35,8 @@
 }
 
 /**
- * \ingroup fatal-example
- * \brief Triggers a fatal error with an error message, deferring termination.
+ * @ingroup fatal-example
+ * @brief Triggers a fatal error with an error message, deferring termination.
  */
 void
 FatalCont()
@@ -46,8 +46,8 @@
 }
 
 /**
- * \ingroup fatal-example
- * \brief Triggers a fatal error with message, and terminating.
+ * @ingroup fatal-example
+ * @brief Triggers a fatal error with message, and terminating.
  */
 void
 Fatal()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/examples/hash-example.cc ns-3.44/src/core/examples/hash-example.cc
--- ns-3.43/src/core/examples/hash-example.cc	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/examples/hash-example.cc	2025-03-09 16:55:49.355371000 -0700
@@ -14,9 +14,9 @@
 #include <vector>
 
 /**
- * \file
- * \ingroup core-examples
- * \ingroup hash
+ * @file
+ * @ingroup core-examples
+ * @ingroup hash
  * Example usage of ns3::Hash.
  *
  * This example reads words from a list of files, creates a dictionary
@@ -26,7 +26,7 @@
  * See \ref hash
  *
  *  Example Output:
- *  \verbatim
+ *  @verbatim
 
 ./ns3 run "hasher-example --time \
   --dict=/usr/share/dict/web2 \
@@ -97,7 +97,7 @@
 {
 
 /**
- * \ingroup hash
+ * @ingroup hash
  *  Namespace for hasher-example.
  */
 namespace Example
@@ -122,9 +122,9 @@
     /**
      * Constructor.
      *
-     * \param [in] name Hash function name.
-     * \param [in] hash Hash function.
-     * \param [in] bits Which hash length to use.
+     * @param [in] name Hash function name.
+     * @param [in] hash Hash function.
+     * @param [in] bits Which hash length to use.
      */
     Collider(const std::string name, Hasher hash, const Bits bits)
         : m_name(name),
@@ -136,8 +136,8 @@
     /**
      * Add a string to the Collider.
      *
-     * \param [in] phrase The string to add.
-     * \return \c true If this was a new string.
+     * @param [in] phrase The string to add.
+     * @return \c true If this was a new string.
      */
     bool Add(const std::string phrase)
     {
@@ -174,7 +174,7 @@
     } // Add ()
 
     /**
-     * \return The hash name, including the length.
+     * @return The hash name, including the length.
      */
     std::string GetName() const
     {
@@ -214,8 +214,8 @@
     /**
      * Get the appropriate hash value.
      *
-     * \param [in] phrase The string to hash.
-     * \return The hash value, using the number of bits set in the constructor.
+     * @param [in] phrase The string to hash.
+     * @return The hash value, using the number of bits set in the constructor.
      */
     uint64_t GetHash(const std::string phrase)
     {
@@ -266,7 +266,7 @@
     /**
      * Add a Collider containing a hash function.
      *
-     * \param [in] c The Collider to add.
+     * @param [in] c The Collider to add.
      */
     void Add(Collider c)
     {
@@ -276,7 +276,7 @@
     /**
      * Add a string to the dictionary.
      *
-     * \param [in] phrase The string to add.
+     * @param [in] phrase The string to add.
      */
     void Add(const std::string phrase)
     {
@@ -368,7 +368,7 @@
     /**
      * Time and report the execution of one hash across the entire Dictionary.
      *
-     * \param [in] collider The hash Collider to use.
+     * @param [in] collider The hash Collider to use.
      */
     void TimeOne(const Collider& collider)
     {
@@ -423,8 +423,8 @@
     /**
      * CommandLine callback function to add a file argument to the list.
      *
-     * \param [in] file The word file to add.
-     * \return \c true If the file is new to the list.
+     * @param [in] file The word file to add.
+     * @return \c true If the file is new to the list.
      */
     bool Add(const std::string& file)
     {
@@ -436,7 +436,7 @@
         return true;
     }
 
-    /** \return The default dictionary path. */
+    /** @return The default dictionary path. */
     static std::string GetDefault()
     {
         return "/usr/share/dict/words";
@@ -445,7 +445,7 @@
     /**
      * Add phrases from the files into the dict.
      *
-     * \param [in,out] dict The Dictionary to add words to.
+     * @param [in,out] dict The Dictionary to add words to.
      */
     void ReadInto(Dictionary& dict)
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/examples/length-example.cc ns-3.44/src/core/examples/length-example.cc
--- ns-3.43/src/core/examples/length-example.cc	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/examples/length-example.cc	2025-03-09 16:55:49.355371000 -0700
@@ -12,22 +12,22 @@
 #include <iostream>
 
 /**
- * \defgroup length-examples Demonstrates usage of the ns3::Length class
- * \ingroup core-examples
- * \ingroup length
+ * @defgroup length-examples Demonstrates usage of the ns3::Length class
+ * @ingroup core-examples
+ * @ingroup length
  */
 
 /**
- * \file
- * \ingroup length-examples
+ * @file
+ * @ingroup length-examples
  * Demonstrates usage of the ns3::Length class
  */
 
 using namespace ns3;
 
 /**
- * \ingroup length-examples
- * \brief Demonstrates the use of ns3::Length constructors.
+ * @ingroup length-examples
+ * @brief Demonstrates the use of ns3::Length constructors.
  */
 void
 Constructors()
@@ -48,8 +48,8 @@
 }
 
 /**
- * \ingroup length-examples
- * \brief Demonstrates the use of ns3::Length conversions.
+ * @ingroup length-examples
+ * @brief Demonstrates the use of ns3::Length conversions.
  */
 void
 Conversions()
@@ -67,8 +67,8 @@
 }
 
 /**
- * \ingroup length-examples
- * \brief Demonstrates the use of ns3::Length arithmetic operators.
+ * @ingroup length-examples
+ * @brief Demonstrates the use of ns3::Length arithmetic operators.
  */
 void
 ArithmeticOperators()
@@ -94,8 +94,8 @@
 }
 
 /**
- * \ingroup length-examples
- * \brief Demonstrates the use of ns3::Length equality operators.
+ * @ingroup length-examples
+ * @brief Demonstrates the use of ns3::Length equality operators.
  */
 void
 EqualityOperators()
@@ -131,8 +131,8 @@
 }
 
 /**
- * \ingroup length-examples
- * \brief Demonstrates the use of ns3::Length multiplications and divisions.
+ * @ingroup length-examples
+ * @brief Demonstrates the use of ns3::Length multiplications and divisions.
  */
 void
 DivAndMod()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/examples/log-example.cc ns-3.44/src/core/examples/log-example.cc
--- ns-3.43/src/core/examples/log-example.cc	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/examples/log-example.cc	2025-03-09 16:55:49.355371000 -0700
@@ -7,9 +7,9 @@
  */
 
 /**
- * \file
- * \ingroup core-examples
- * \ingroup logging
+ * @file
+ * @ingroup core-examples
+ * @ingroup logging
  * Example program illustrating the various logging functions.
  */
 
@@ -53,8 +53,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId()
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/examples/main-callback.cc ns-3.44/src/core/examples/main-callback.cc
--- ns-3.43/src/core/examples/main-callback.cc	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/examples/main-callback.cc	2025-03-09 16:55:49.355371000 -0700
@@ -12,9 +12,9 @@
 #include <iostream>
 
 /**
- * \file
- * \ingroup core-examples
- * \ingroup callback
+ * @file
+ * @ingroup core-examples
+ * @ingroup callback
  * Example program illustrating use of callback functions and methods.
  *
  * See \ref callback
@@ -28,9 +28,9 @@
 /**
  * Example Callback function.
  *
- * \param [in] a The first argument.
- * \param [in] b The second argument.
- * \returns The first argument.
+ * @param [in] a The first argument.
+ * @param [in] b The second argument.
+ * @returns The first argument.
  */
 double
 CbOne(double a, double b)
@@ -46,8 +46,8 @@
     /**
      * Example Callback class method.
      *
-     * \param [in] a The argument.
-     * \returns -5
+     * @param [in] a The argument.
+     * @returns -5
      */
     int CbTwo(double a)
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/examples/main-ptr.cc ns-3.44/src/core/examples/main-ptr.cc
--- ns-3.43/src/core/examples/main-ptr.cc	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/examples/main-ptr.cc	2025-03-09 16:55:49.355371000 -0700
@@ -12,9 +12,9 @@
 #include <iostream>
 
 /**
- * \file
- * \ingroup core-examples
- * \ingroup ptr
+ * @file
+ * @ingroup core-examples
+ * @ingroup ptr
  * Example program illustrating use of the ns3::Ptr smart pointer.
  */
 
@@ -60,8 +60,8 @@
  *
  * This function stores it's argument in the global variable \c g_ptr
  * and returns the old value of \c g_ptr.
- * \param [in] p A Ptr.
- * \returns The prior value of \c g_ptr.
+ * @param [in] p A Ptr.
+ * @returns The prior value of \c g_ptr.
  */
 static Ptr<PtrExample>
 StorePtr(Ptr<PtrExample> p)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/examples/main-random-variable-stream.cc ns-3.44/src/core/examples/main-random-variable-stream.cc
--- ns-3.43/src/core/examples/main-random-variable-stream.cc	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/examples/main-random-variable-stream.cc	2025-03-09 16:55:49.355371000 -0700
@@ -19,9 +19,9 @@
 #include <map>
 
 /**
- * \file
- * \ingroup core-examples
- * \ingroup randomvariable
+ * @file
+ * @ingroup core-examples
+ * @ingroup randomvariable
  * Example program illustrating use of RandomVariableStream
  */
 
@@ -34,9 +34,9 @@
  * Round a double number to the given precision.
  * For example, `dround(0.234, 0.1) = 0.2`
  * and `dround(0.257, 0.1) = 0.3`
- * \param [in] number The number to round.
- * \param [in] precision The least significant digit to keep in the rounding.
- * \returns \pname{number} rounded to \pname{precision}.
+ * @param [in] number The number to round.
+ * @param [in] precision The least significant digit to keep in the rounding.
+ * @returns \pname{number} rounded to \pname{precision}.
  */
 double
 dround(double number, double precision)
@@ -56,12 +56,12 @@
 
 /**
  * Generate a histogram from a RandomVariableStream.
- * \param [in] rndvar The RandomVariableStream to sample.
- * \param [in] probes The number of samples.
- * \param [in] precision The precision to round samples to.
- * \param [in] title The title for the histogram.
- * \param [in] impulses Set the plot style to IMPULSES.
- * \return The histogram as a GnuPlot data set.
+ * @param [in] rndvar The RandomVariableStream to sample.
+ * @param [in] probes The number of samples.
+ * @param [in] precision The precision to round samples to.
+ * @param [in] title The title for the histogram.
+ * @param [in] impulses Set the plot style to IMPULSES.
+ * @return The histogram as a GnuPlot data set.
  */
 GnuplotDataset
 Histogram(Ptr<RandomVariableStream> rndvar,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/examples/main-test-sync.cc ns-3.44/src/core/examples/main-test-sync.cc
--- ns-3.43/src/core/examples/main-test-sync.cc	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/examples/main-test-sync.cc	2025-03-09 16:55:49.355371000 -0700
@@ -18,9 +18,9 @@
 #include <thread> // sleep_for
 
 /**
- * \file
- * \ingroup core-examples
- * \ingroup scheduler
+ * @file
+ * @ingroup core-examples
+ * @ingroup scheduler
  * An example of scheduling events in a background thread.
  *
  * See \ref ns3::SimulatorImpl::ScheduleWithContext
@@ -87,7 +87,7 @@
         // Exercise the realtime relative now path
         //
         Simulator::ScheduleWithContext(Simulator::NO_CONTEXT,
-                                       Seconds(0.0),
+                                       Seconds(0),
                                        MakeEvent(&inserted_function));
         std::this_thread::sleep_for(std::chrono::milliseconds(1));
     }
@@ -112,7 +112,7 @@
     //
     // Make sure ScheduleNow works when the system isn't running
     //
-    Simulator::ScheduleWithContext(0xffffffff, Seconds(0.0), MakeEvent(&first_function));
+    Simulator::ScheduleWithContext(0xffffffff, Seconds(0), MakeEvent(&first_function));
 
     //
     // drive the progression of m_currentTs at a ten millisecond rate from the main thread
@@ -124,7 +124,7 @@
 
     std::thread st3 = std::thread(&FakeNetDevice::Doit3, &fnd);
 
-    Simulator::Stop(Seconds(15.0));
+    Simulator::Stop(Seconds(15));
     Simulator::Run();
 
     if (st3.joinable())
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/examples/sample-log-time-format.cc ns-3.44/src/core/examples/sample-log-time-format.cc
--- ns-3.43/src/core/examples/sample-log-time-format.cc	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/examples/sample-log-time-format.cc	2025-03-09 16:55:49.355371000 -0700
@@ -3,9 +3,9 @@
  */
 
 /**
- * \file
- * \ingroup core-examples
- * \ingroup logging
+ * @file
+ * @ingroup core-examples
+ * @ingroup logging
  * Example program that demonstrates how to replace the time printer.
  */
 
@@ -15,7 +15,7 @@
  * This program creates a sample object and schedules some methods to
  * occur at future times.  When run with no arguments, it prints out
  * something like this:
- * \code
+ * @code
  * $ ./ns3 run sample-log-time-format
  * RandomVariableStream:RandomVariableStream(0x184e3a0)
  * RandomVariableStream:UniformRandomVariable(0x184e3a0)
@@ -26,15 +26,15 @@
  * +0.000123456s RandomVariableStream:SetAntithetic(0x184e3a0, 0)
  * +0.123456789s RandomVariableStream:SetAntithetic(0x184e3a0, 0)
  * RandomVariableStream:~RandomVariableStream(0x184e3a0)
- * \endcode
+ * @endcode
  *
  * These statements are printed out because of these two program
  * statements:
  *
- * \code
+ * @code
  * LogComponentEnable ("RandomVariableStream", LOG_LEVEL_ALL);
  * LogComponentEnableAll (LOG_PREFIX_TIME);
- * \endcode
+ * @endcode
  *
  * The first statement enables logging on the methods found in
  * random-variable-stream.cc.  The second prepends a time prefix
@@ -47,7 +47,7 @@
  * To change the format, one can schedule (at simulation time 0) a
  * replacement function for printing time.  This can be demonstrated
  * by setting the 'replace-time-printer' parameter to true:
- * \code
+ * @code
  * ./ns3 run 'sample-log-time-format --replaceTimePrinter=1'
  * RandomVariableStream:RandomVariableStream(0x15fb080)
  * RandomVariableStream:UniformRandomVariable(0x15fb080)
@@ -59,7 +59,7 @@
  * 0.000123456s RandomVariableStream:SetAntithetic(0x15fb080, 0)
  * 0.123457s RandomVariableStream:SetAntithetic(0x15fb080, 0)
  * RandomVariableStream:~RandomVariableStream(0x15fb080)
- * \endcode
+ * @endcode
  *
  * In the above, the default C++ iostream precision is instead used
  * (which was the default for ns-3 versions 3.26 and earlier).
@@ -91,7 +91,7 @@
  * Prior to ns-3.26, the time printer used default C++ iostream precision
  * This function sets it back to the format used before ns-3.26
  *
- * \param [in] os The stream to print on.
+ * @param [in] os The stream to print on.
  */
 void
 ReplacementTimePrinter(std::ostream& os)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/examples/sample-random-variable.cc ns-3.44/src/core/examples/sample-random-variable.cc
--- ns-3.43/src/core/examples/sample-random-variable.cc	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/examples/sample-random-variable.cc	2025-03-09 16:55:49.355371000 -0700
@@ -9,9 +9,9 @@
 #include <iostream>
 
 /**
- * \file
- * \ingroup core-examples
- * \ingroup randomvariable
+ * @file
+ * @ingroup core-examples
+ * @ingroup randomvariable
  * Example program illustrating use of ns3::RandomVariable
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/examples/sample-random-variable-stream.cc ns-3.44/src/core/examples/sample-random-variable-stream.cc
--- ns-3.43/src/core/examples/sample-random-variable-stream.cc	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/examples/sample-random-variable-stream.cc	2025-03-09 16:55:49.355371000 -0700
@@ -11,9 +11,9 @@
 #include <iostream>
 
 /**
- * \file
- * \ingroup core-examples
- * \ingroup randomvariable
+ * @file
+ * @ingroup core-examples
+ * @ingroup randomvariable
  * Example program illustrating use of ns3::RandomVariableStream
  *
  * This program can be run from ns3 such as
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/examples/sample-show-progress.cc ns-3.44/src/core/examples/sample-show-progress.cc
--- ns-3.43/src/core/examples/sample-show-progress.cc	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/examples/sample-show-progress.cc	2025-03-09 16:55:49.355371000 -0700
@@ -8,9 +8,9 @@
  */
 
 /**
- * \file
- * \ingroup core-examples
- * \ingroup logging
+ * @file
+ * @ingroup core-examples
+ * @ingroup logging
  * Example program that demonstrates ShowProgress.
  */
 
@@ -45,8 +45,8 @@
     /**
      * Create a Hold with mean inter-event time \pname{wait},
      * changing workload every \pname{interval}.
-     * \param wait The mean inter-event time.
-     * \param interval How often to change work load.  This
+     * @param wait The mean inter-event time.
+     * @param interval How often to change work load.  This
      *                 should be an order of magnitude larger than \pname{wait}.
      */
     Hold(Time wait, Time interval)
@@ -61,7 +61,7 @@
     /**
      * Create a hold with a specified random number generator for the
      * \pname{wait} time.  The RNG value will be interpreted as seconds.
-     * \param rng The random variable generator to use for the inter-event time.
+     * @param rng The random variable generator to use for the inter-event time.
      */
     Hold(Ptr<RandomVariableStream> rng)
         : m_rng(rng)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/examples/sample-simulator.cc ns-3.44/src/core/examples/sample-simulator.cc
--- ns-3.43/src/core/examples/sample-simulator.cc	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/examples/sample-simulator.cc	2025-03-09 16:55:49.355371000 -0700
@@ -15,9 +15,9 @@
 #include <iostream>
 
 /**
- * \file
- * \ingroup core-examples
- * \ingroup simulator
+ * @file
+ * @ingroup core-examples
+ * @ingroup simulator
  * Example program demonstrating use of various Schedule functions.
  */
 
@@ -37,7 +37,7 @@
     /**
      *  Simple event handler.
      *
-     * \param [in] eventValue Event argument.
+     * @param [in] eventValue Event argument.
      */
     void HandleEvent(double eventValue);
 };
@@ -45,7 +45,7 @@
 void
 MyModel::Start()
 {
-    Simulator::Schedule(Seconds(10.0), &MyModel::HandleEvent, this, Simulator::Now().GetSeconds());
+    Simulator::Schedule(Seconds(10), &MyModel::HandleEvent, this, Simulator::Now().GetSeconds());
 }
 
 void
@@ -58,7 +58,7 @@
 /**
  * Simple function event handler which Starts a MyModel object.
  *
- * \param [in] model The MyModel object to start.
+ * @param [in] model The MyModel object to start.
  */
 void
 ExampleFunction(MyModel* model)
@@ -98,14 +98,14 @@
     v->SetAttribute("Min", DoubleValue(10));
     v->SetAttribute("Max", DoubleValue(20));
 
-    Simulator::Schedule(Seconds(10.0), &ExampleFunction, &model);
+    Simulator::Schedule(Seconds(10), &ExampleFunction, &model);
 
     Simulator::Schedule(Seconds(v->GetValue()), &RandomFunction);
 
-    EventId id = Simulator::Schedule(Seconds(30.0), &CancelledEvent);
+    EventId id = Simulator::Schedule(Seconds(30), &CancelledEvent);
     Simulator::Cancel(id);
 
-    Simulator::Schedule(Seconds(25.0), []() {
+    Simulator::Schedule(Seconds(25), []() {
         std::cout << "Code within a lambda expression at time " << Simulator::Now().As(Time::S)
                   << std::endl;
     });
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/examples/sample-simulator.py ns-3.44/src/core/examples/sample-simulator.py
--- ns-3.43/src/core/examples/sample-simulator.py	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/examples/sample-simulator.py	2025-03-09 16:55:49.355371000 -0700
@@ -113,13 +113,13 @@
     v.SetAttribute("Max", ns.DoubleValue(20))
 
     ev = ns.cppyy.gbl.ExampleFunctionEvent(model)
-    ns.Simulator.Schedule(ns.Seconds(10.0), ev)
+    ns.Simulator.Schedule(ns.Seconds(10), ev)
 
     ev2 = ns.cppyy.gbl.RandomFunctionEvent(model)
     ns.Simulator.Schedule(ns.Seconds(v.GetValue()), ev2)
 
     ev3 = ns.cppyy.gbl.CancelledFunctionEvent()
-    id = ns.Simulator.Schedule(ns.Seconds(30.0), ev3)
+    id = ns.Simulator.Schedule(ns.Seconds(30), ev3)
     ns.Simulator.Cancel(id)
 
     ns.Simulator.Run()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/examples/system-path-examples.cc ns-3.44/src/core/examples/system-path-examples.cc
--- ns-3.43/src/core/examples/system-path-examples.cc	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/examples/system-path-examples.cc	2025-03-09 16:55:49.355371000 -0700
@@ -13,9 +13,9 @@
 #include <string>
 
 /**
- * \file
- * \ingroup core-examples
- * \ingroup systempath
+ * @file
+ * @ingroup core-examples
+ * @ingroup systempath
  * Example program illustrating use of ns3::SystemPath
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/examples/test-string-value-formatting.cc ns-3.44/src/core/examples/test-string-value-formatting.cc
--- ns-3.43/src/core/examples/test-string-value-formatting.cc	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/examples/test-string-value-formatting.cc	2025-03-09 16:55:49.355371000 -0700
@@ -7,16 +7,16 @@
 #include "ns3/core-module.h"
 
 /**
- * \defgroup string-value-formatting StringValue parsing tests
+ * @defgroup string-value-formatting StringValue parsing tests
  * Check that StringValue parses complex values correctly.
  */
 
 /**
- * \file
- * \ingroup core-examples
- * \ingroup string-value-formatting
+ * @file
+ * @ingroup core-examples
+ * @ingroup string-value-formatting
  * Check that StringValue parses complex values correctly.
- * \todo This should really be turned into a TestSuite
+ * @todo This should really be turned into a TestSuite
  */
 
 using namespace ns3;
@@ -27,7 +27,7 @@
 {
 
 /**
- * \ingroup string-value-formatting
+ * @ingroup string-value-formatting
  *
  * StringValue formatting example test object.
  *
@@ -38,15 +38,15 @@
 {
   public:
     /**
-     * \brief Register this type and get the TypeId.
-     * \return the object TypeId
+     * @brief Register this type and get the TypeId.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     /** Default constructor */
     FormattingTestObject();
     /**
      * Get the test variable
-     * \returns the test variable
+     * @returns the test variable
      */
     Ptr<RandomVariableStream> GetTestVariable() const;
 
@@ -82,7 +82,7 @@
 }
 
 /**
- * \ingroup string-value-formatting
+ * @ingroup string-value-formatting
  *
  * StringValue formatting example test helper class.
  */
@@ -93,13 +93,13 @@
     FormattingTestObjectHelper();
     /**
      * Set an attribute by name
-     * \param name the attribute
-     * \param value the attribute value
+     * @param name the attribute
+     * @param value the attribute value
      */
     void SetAttribute(std::string name, const AttributeValue& value);
     /**
      * Create an Object as configured by SetAttribute
-     * \returns the newly created Object
+     * @returns the newly created Object
      */
     Ptr<Object> CreateFromFactory();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/helper/csv-reader.cc ns-3.44/src/core/helper/csv-reader.cc
--- ns-3.43/src/core/helper/csv-reader.cc	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/helper/csv-reader.cc	2025-03-09 16:55:49.355371000 -0700
@@ -19,8 +19,8 @@
 #include <vector>
 
 /**
- * \file
- * \ingroup csvreader
+ * @file
+ * @ingroup csvreader
  *
  * ns3::CsvReader implementation
  */
@@ -36,11 +36,11 @@
  * Uses a stringstream to deserialize the value stored in \p input
  * to a value of type T and writes the deserialized value to \p output.
  *
- * \tparam T Data type of output.
- * \param input String containing serialized data.
- * \param output Place to store deserialized value.
+ * @tparam T Data type of output.
+ * @param input String containing serialized data.
+ * @param output Place to store deserialized value.
  *
- * \return \c true if deserialization was successful, \c false otherwise.
+ * @return \c true if deserialization was successful, \c false otherwise.
  */
 template <typename T>
 bool
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/helper/csv-reader.h ns-3.44/src/core/helper/csv-reader.h
--- ns-3.43/src/core/helper/csv-reader.h	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/helper/csv-reader.h	2025-03-09 16:55:49.355371000 -0700
@@ -17,8 +17,8 @@
 #include <vector>
 
 /**
- * \file
- * \ingroup csvreader
+ * @file
+ * @ingroup csvreader
  *
  * ns3::CsvReader declaration
  *
@@ -27,14 +27,14 @@
 {
 
 /**
- * \ingroup core
- * \defgroup csvreader CSV File Reader
+ * @ingroup core
+ * @defgroup csvreader CSV File Reader
  *
  * A way to extract data from simple csv files.
  */
 
 /**
- * \ingroup csvreader
+ * @ingroup csvreader
  *
  * Provides functions for parsing and extracting data from
  * Comma Separated Value (CSV) formatted text files.
@@ -43,7 +43,7 @@
  * In particular it is possible to set the delimiting character at construction,
  * enabling parsing of tab-delimited streams or other formats with delimiters.
  *
- * \note Excel may generate "CSV" files with either ',' or ';' delimiter
+ * @note Excel may generate "CSV" files with either ',' or ';' delimiter
  * depending on the locale: if ',' is the decimal mark then ';' is the list
  * separator and used to read/write "CSV" files.
  *
@@ -52,7 +52,7 @@
  * to extract specific values from the row.
  *
  * For example:
- * \code
+ * @code
  *   CsvReader csv (filePath);
  *   while (csv.FetchNextRow ())
  *     {
@@ -76,11 +76,11 @@
  *       // Do something with values
  *
  *     }  // while FetchNextRow
- * \endcode
+ * @endcode
  *
  * As another example, supposing we need a vector from each row,
  * the middle of the previous example would become:
- * \code
+ * @code
  *       std::vector<double> v (n);
  *       bool ok = true;
  *       for (std::size_t i = 0; i < v.size (); ++i)
@@ -88,7 +88,7 @@
  *           ok |= csv.GetValue (i, v[i]);
  *         }
  *       if (!ok) ...
- * \endcode
+ * @endcode
  *
  *
  * File Format
@@ -170,52 +170,52 @@
  *
  * Examples
  * --------
- * \par Example 1: Basic
- * \code
+ * @par Example 1: Basic
+ * @code
  *     # Column 1: Product
  *     # Column 2: Price
  *     widget, 12.5
- * \endcode
+ * @endcode
  *
- * \par Example 2: Comment at end of line
- * \code
+ * @par Example 2: Comment at end of line
+ * @code
  *     # Column 1: Product
  *     # Column 2: Price
  *     broken widget, 12.5 # this widget is broken
- * \endcode
+ * @endcode
  *
- * \par Example 3: Delimiter in double quotes
- * \code
+ * @par Example 3: Delimiter in double quotes
+ * @code
  *     # Column 1: Product
  *     # Column 2: Price
  *     # Column 3: Count
  *     # Column 4: Date
  *     widget, 12.5, 100, "November 6, 2018"
- * \endcode
+ * @endcode
  *
- * \par # Example 4: Hash character in double quotes
- * \code
+ * @par # Example 4: Hash character in double quotes
+ * @code
  *     # Column 1: Key
  *     # Column 2: Value
  *     # Column 3: Description
  *     count, 5, "# of widgets currently in stock"
- * \endcode
+ * @endcode
  *
- * \par Example 5: Extra whitespace
- * \code
+ * @par Example 5: Extra whitespace
+ * @code
  *     # Column 1: Key
  *     # Column 2: Value
  *     # Column 3: Description
  *     count     ,     5    ,"# of widgets in stock"
- * \endcode
+ * @endcode
  *
- * \par Example 6: Escaped quotes
- * \code
+ * @par Example 6: Escaped quotes
+ * @code
  *     # Column 1: Key
  *     # Column 2: Description
  *     # The value returned for Column 2 will be: String with "embedded" quotes
  *     foo, "String with ""embedded"" quotes"
- * \endcode
+ * @endcode
  */
 class CsvReader
 {
@@ -226,8 +226,8 @@
      * Opens the file specified in the filepath argument and
      * reads data from it.
      *
-     * \param filepath Path to a file containing CSV data.
-     * \param delimiter Character used to separate fields in the data file.
+     * @param filepath Path to a file containing CSV data.
+     * @param delimiter Character used to separate fields in the data file.
      */
     CsvReader(const std::string& filepath, char delimiter = ',');
 
@@ -236,8 +236,8 @@
      *
      * Reads csv data from the supplied input stream.
      *
-     * \param stream Input stream containing csv data.
-     * \param delimiter Character used to separate fields in the data stream.
+     * @param stream Input stream containing csv data.
+     * @param delimiter Character used to separate fields in the data stream.
      */
     CsvReader(std::istream& stream, char delimiter = ',');
 
@@ -249,21 +249,21 @@
     /**
      * Returns the number of columns in the csv data.
      *
-     * \return Number of columns
+     * @return Number of columns
      */
     std::size_t ColumnCount() const;
 
     /**
      * The number of lines that have been read.
      *
-     * \return The number of lines that have been read.
+     * @return The number of lines that have been read.
      */
     std::size_t RowNumber() const;
 
     /**
      * Returns the delimiter character specified during object construction.
      *
-     * \return Character used as the column separator.
+     * @return Character used as the column separator.
      */
     char Delimiter() const;
 
@@ -272,7 +272,7 @@
      * The read data is stored in a cache which is accessed by the
      * GetValue functions to extract fields from the data.
      *
-     * \return \c true if a line was read successfully or \c false if the
+     * @return \c true if a line was read successfully or \c false if the
      * read failed or reached the end of the file.
      */
     bool FetchNextRow();
@@ -281,12 +281,12 @@
      * Attempt to convert from the string data in the specified column
      * to the specified data type.
      *
-     * \tparam T The data type of the output variable.
+     * @tparam T The data type of the output variable.
      *
-     * \param [in] columnIndex Index of the column to fetch.
-     * \param [out] value Location where the converted data will be stored.
+     * @param [in] columnIndex Index of the column to fetch.
+     * @param [out] value Location where the converted data will be stored.
      *
-     * \return \c true if the specified column has data and the data
+     * @return \c true if the specified column has data and the data
      * was converted to the specified data type.
      */
     template <class T>
@@ -300,7 +300,7 @@
      * - Comment
      * - Quoted empty string `""`
      *
-     * \returns \c true if the input row is a blank line.
+     * @returns \c true if the input row is a blank line.
      */
     bool IsBlankRow() const;
 
@@ -309,10 +309,10 @@
      * Attempt to convert from the string data stored at the specified column
      * index into the specified type.
      *
-     * \param input [in] String value to be converted.
-     * \param value [out] Location where the converted value will be stored.
+     * @param input [in] String value to be converted.
+     * @param value [out] Location where the converted value will be stored.
      *
-     * \return \c true if the column exists and the conversion succeeded,
+     * @return \c true if the column exists and the conversion succeeded,
      * \c false otherwise.
      */
     /** @{ */
@@ -346,8 +346,8 @@
     /**
      * Returns \c true if the supplied character matches the delimiter.
      *
-     * \param c Character to check.
-     * \return \c true if \pname{c} is the delimiter character,
+     * @param c Character to check.
+     * @return \c true if \pname{c} is the delimiter character,
      * \c false otherwise.
      */
     bool IsDelimiter(char c) const;
@@ -355,16 +355,16 @@
     /**
      * Scans the string and splits it into individual columns based on the delimiter.
      *
-     * \param [in] line String containing delimiter separated data.
+     * @param [in] line String containing delimiter separated data.
      */
     void ParseLine(const std::string& line);
 
     /**
      * Extracts the data for one column in a csv row.
      *
-     * \param begin Iterator to the first character in the row.
-     * \param end Iterator to the last character in the row.
-     * \return A tuple containing the content of the column and an iterator
+     * @param begin Iterator to the first character in the row.
+     * @param end Iterator to the last character in the row.
+     * @return A tuple containing the content of the column and an iterator
      * pointing to the position in the row where the column ended.
      */
     std::tuple<std::string, std::string::const_iterator> ParseColumn(
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/helper/event-garbage-collector.cc ns-3.44/src/core/helper/event-garbage-collector.cc
--- ns-3.43/src/core/helper/event-garbage-collector.cc	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/helper/event-garbage-collector.cc	2025-03-09 16:55:49.355371000 -0700
@@ -8,9 +8,9 @@
 #include "event-garbage-collector.h"
 
 /**
- * \file
- * \ingroup core-helpers
- * \ingroup events
+ * @file
+ * @ingroup core-helpers
+ * @ingroup events
  * ns3::EventGarbageCollector implementation.
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/helper/event-garbage-collector.h ns-3.44/src/core/helper/event-garbage-collector.h
--- ns-3.43/src/core/helper/event-garbage-collector.h	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/helper/event-garbage-collector.h	2025-03-09 16:55:49.355371000 -0700
@@ -14,9 +14,9 @@
 #include <set>
 
 /**
- * \file
- * \ingroup events
- * \ingroup core-helpers
+ * @file
+ * @ingroup events
+ * @ingroup core-helpers
  * ns3::EventGarbageCollector declaration.
  */
 
@@ -24,10 +24,10 @@
 {
 
 /**
- * \ingroup events
- * \ingroup core-helpers
+ * @ingroup events
+ * @ingroup core-helpers
  *
- * \brief An object that tracks scheduled events and automatically
+ * @brief An object that tracks scheduled events and automatically
  * cancels them when it is destroyed.  It is useful in situations
  * where multiple instances of the same type of event can
  * simultaneously be scheduled, and when the events should be limited
@@ -39,8 +39,8 @@
     EventGarbageCollector();
 
     /**
-     * \brief Tracks a new event
-     * \param [in] event the Event to track
+     * @brief Tracks a new event
+     * @param [in] event the Event to track
      */
     void Track(EventId event);
 
@@ -62,19 +62,19 @@
     EventList m_events;                     //!< The tracked event list
 
     /**
-     * \brief Called when a new event was added and the cleanup limit was
+     * @brief Called when a new event was added and the cleanup limit was
      * exceeded in consequence.
      */
     void Cleanup();
     /**
-     * \brief Grow the cleanup limit.
+     * @brief Grow the cleanup limit.
      * Increase the cleanup size by the smaller of
      * the current cleanup size (exponential growth),
      * or the CHUNK_MAX_SIZE (linear growth).
      */
     void Grow();
     /**
-     * \brief Shrink the cleanup limit
+     * @brief Shrink the cleanup limit
      * Reduce the cleanup size by factors of two until less than the
      * current event list, then Grow one step.
      */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/helper/random-variable-stream-helper.cc ns-3.44/src/core/helper/random-variable-stream-helper.cc
--- ns-3.43/src/core/helper/random-variable-stream-helper.cc	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/helper/random-variable-stream-helper.cc	2025-03-09 16:55:49.355371000 -0700
@@ -13,9 +13,9 @@
 #include "ns3/random-variable-stream.h"
 
 /**
- * \file
- * \ingroup core-helpers
- * \ingroup randomvariable
+ * @file
+ * @ingroup core-helpers
+ * @ingroup randomvariable
  * ns3::RandomVariableStreamHelper implementation.
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/helper/random-variable-stream-helper.h ns-3.44/src/core/helper/random-variable-stream-helper.h
--- ns-3.43/src/core/helper/random-variable-stream-helper.h	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/helper/random-variable-stream-helper.h	2025-03-09 16:55:49.355371000 -0700
@@ -11,9 +11,9 @@
 #include <string>
 
 /**
- * \file
- * \ingroup core-helpers
- * \ingroup randomvariable
+ * @file
+ * @ingroup core-helpers
+ * @ingroup randomvariable
  * ns3::RandomVariableStreamHelper declaration.
  */
 
@@ -21,7 +21,7 @@
 {
 
 /**
- * \brief Helper class for static methods involving RandomVariableStream
+ * @brief Helper class for static methods involving RandomVariableStream
  */
 class RandomVariableStreamHelper
 {
@@ -35,25 +35,25 @@
      * The objects to match are of type PointerValue where the underlying
      * type is of type Ptr<RandomVariableStream>.
      *
-     * \code
+     * @code
      *    .AddAttribute ("Speed",
      *                "A random variable used to pick the speed of a random waypoint model.",
      *                StringValue("ns3::UniformRandomVariable[Min=0.3|Max=0.7]"),
      *                MakePointerAccessor (&RandomWaypointMobilityModel::m_speed),
      *                MakePointerChecker<RandomVariableStream> ())
      *
-     * \endcode
+     * @endcode
      *
      * Usage would look (for node 3) like this:
-     * \code
+     * @code
      * std::string path
      * ("/$ns3::NodeListPriv/NodeList/3/$ns3::Node/$ns3::RandomWaypointMobilityModel/Speed/$ns3::UniformRandomVariable");
      * int64_t retVal = RandomVariableStreamHelper::AssignStreams (path, 0);
-     * \endcode
+     * @endcode
      *
-     * \return The number of streams set
-     * \param path (possibly wildcarded) path to a RandomVariableStream PointerValue
-     * \param stream stream number to set; must be non-negative
+     * @return The number of streams set
+     * @param path (possibly wildcarded) path to a RandomVariableStream PointerValue
+     * @param stream stream number to set; must be non-negative
      */
     static int64_t AssignStreams(std::string path, int64_t stream);
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/abort.h ns-3.44/src/core/model/abort.h
--- ns-3.43/src/core/model/abort.h	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/abort.h	2025-03-09 16:55:49.355371000 -0700
@@ -12,17 +12,17 @@
 #include "fatal-error.h"
 
 /**
- * \file
- * \ingroup fatal
- * \brief \c NS_ABORT_x macro definitions.
+ * @file
+ * @ingroup fatal
+ * @brief \c NS_ABORT_x macro definitions.
  */
 
 /**
- * \ingroup fatal
+ * @ingroup fatal
  *
- * \brief Unconditional abnormal program termination with a message.
+ * @brief Unconditional abnormal program termination with a message.
  *
- * \param [in] msg The message to output when this macro is hit.
+ * @param [in] msg The message to output when this macro is hit.
  *
  * This macro is essentially equivalent to NS_FATAL_ERROR,
  * except it prepends the error message with the string
@@ -33,7 +33,7 @@
  * This macro is enabled unconditionally in all builds,
  * including debug and optimized builds.
  *
- * \see NS_FATAL_ERROR
+ * @see NS_FATAL_ERROR
  */
 #define NS_ABORT_MSG(msg)                                                                          \
     do                                                                                             \
@@ -43,11 +43,11 @@
     } while (false)
 
 /**
- * \ingroup fatal
+ * @ingroup fatal
  *
- * \brief Abnormal program termination if a condition is \c true.
+ * @brief Abnormal program termination if a condition is \c true.
  *
- * \param [in] cond The condition to be evaluated.
+ * @param [in] cond The condition to be evaluated.
  *
  * This is similar to \c NS_ASSERT(!(cond)), except this check
  * is enabled in all builds. If \c cond is evaluated to \c true,
@@ -73,13 +73,13 @@
     } while (false)
 
 /**
- * \ingroup fatal
+ * @ingroup fatal
  *
- * \brief Abnormal program termination if a condition is \c true,
+ * @brief Abnormal program termination if a condition is \c true,
  * with a message.
  *
- * \param [in] cond The condition to be evaluated.
- * \param [in] msg The message to output when cond is \c true.
+ * @param [in] cond The condition to be evaluated.
+ * @param [in] msg The message to output when cond is \c true.
  *
  * This is similar to NS_ASSERT_MSG(!(cond)), except this
  * check is enabled in all builds. If \c cond is evaluated to
@@ -105,30 +105,30 @@
     } while (false)
 
 /**
- * \ingroup fatal
+ * @ingroup fatal
  *
- * \brief Abnormal program termination if a condition is \c false.
+ * @brief Abnormal program termination if a condition is \c false.
  *
- * \param [in] cond The condition to be evaluated.
+ * @param [in] cond The condition to be evaluated.
  *
  * This is an alias for NS_ABORT_IF(!(cond))
  *
- * \see NS_ABORT_IF
+ * @see NS_ABORT_IF
  */
 #define NS_ABORT_UNLESS(cond) NS_ABORT_IF(!(cond))
 
 /**
- * \ingroup fatal
+ * @ingroup fatal
  *
- * \brief Abnormal program termination if a condition is \c false,
+ * @brief Abnormal program termination if a condition is \c false,
  * with a message.
  *
- * \param [in] cond The condition to be evaluated.
- * \param [in] msg The message to output if cond is false.
+ * @param [in] cond The condition to be evaluated.
+ * @param [in] msg The message to output if cond is false.
  *
  * This is an alias for NS_ABORT_MSG_IF(!(cond))
  *
- * \see NS_ABORT_MSG_IF
+ * @see NS_ABORT_MSG_IF
  */
 #define NS_ABORT_MSG_UNLESS(cond, msg) NS_ABORT_MSG_IF(!(cond), msg)
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/ascii-file.h ns-3.44/src/core/model/ascii-file.h
--- ns-3.43/src/core/model/ascii-file.h	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/ascii-file.h	2025-03-09 16:55:49.355371000 -0700
@@ -19,7 +19,7 @@
 {
 
 /**
- * \brief A class representing an ascii file.
+ * @brief A class representing an ascii file.
  *
  * This class represents an ascii file
  */
@@ -30,19 +30,19 @@
     ~AsciiFile();
 
     /**
-     * \return true if the 'fail' bit is set in the underlying iostream, false otherwise.
+     * @return true if the 'fail' bit is set in the underlying iostream, false otherwise.
      */
     bool Fail() const;
     /**
-     * \return true if the 'eof' bit is set in the underlying iostream, false otherwise.
+     * @return true if the 'eof' bit is set in the underlying iostream, false otherwise.
      */
     bool Eof() const;
 
     /**
      * Create a new ascii file or open an existing ascii file.
      *
-     * \param filename String containing the name of the file.
-     * \param mode the access mode for the file.
+     * @param filename String containing the name of the file.
+     * @param mode the access mode for the file.
      */
     void Open(const std::string& filename, std::ios::openmode mode);
 
@@ -52,21 +52,21 @@
     void Close();
 
     /**
-     * \brief Read next line from file
+     * @brief Read next line from file
      *
-     * \param line    [out] line from file
+     * @param line    [out] line from file
      *
      */
     void Read(std::string& line);
 
     /**
-     * \brief Compare two ASCII files line-by-line
+     * @brief Compare two ASCII files line-by-line
      *
-     * \return true if files are different, false otherwise
+     * @return true if files are different, false otherwise
      *
-     * \param  f1         First ASCII file name
-     * \param  f2         Second ASCII file name
-     * \param  lineNumber   [out] Line number of first different line.
+     * @param  f1         First ASCII file name
+     * @param  f2         Second ASCII file name
+     * @param  lineNumber   [out] Line number of first different line.
      */
     static bool Diff(const std::string& f1, const std::string& f2, uint64_t& lineNumber);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/ascii-test.h ns-3.44/src/core/model/ascii-test.h
--- ns-3.43/src/core/model/ascii-test.h	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/ascii-test.h	2025-03-09 16:55:49.355371000 -0700
@@ -17,11 +17,11 @@
 #include <stdint.h>
 
 /**
- * \brief Test that a pair of new/reference ascii files are equal
+ * @brief Test that a pair of new/reference ascii files are equal
  *
- * \param gotFilename The name of the new file to read in including
+ * @param gotFilename The name of the new file to read in including
  * its path
- * \param expectedFilename The name of the reference file to read in
+ * @param expectedFilename The name of the reference file to read in
  * including its path
  */
 #define NS_ASCII_TEST_EXPECT_EQ(gotFilename, expectedFilename)                                     \
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/assert.h ns-3.44/src/core/model/assert.h
--- ns-3.43/src/core/model/assert.h	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/assert.h	2025-03-09 16:55:49.355371000 -0700
@@ -10,16 +10,16 @@
 #define NS_ASSERT_H
 
 /**
- * \file
- * \ingroup assert
+ * @file
+ * @ingroup assert
  * NS_ASSERT() and NS_ASSERT_MSG() macro definitions
  */
 
 /**
- * \ingroup debugging
- * \defgroup assert Assertions
+ * @ingroup debugging
+ * @defgroup assert Assertions
  *
- * \brief Assert functions and macros
+ * @brief Assert functions and macros
  *
  * The assert macros are used to verify
  * at runtime that a certain condition is true. If it is
@@ -44,13 +44,13 @@
 #include <iostream>
 
 /**
- * \ingroup assert
+ * @ingroup assert
  *
  * At runtime, in debugging builds, if this condition is not
  * true, the program prints the source file, line number and
  * unverified condition and halts by calling std::terminate
  *
- * \param [in] condition Condition to verify.
+ * @param [in] condition Condition to verify.
  */
 #define NS_ASSERT(condition)                                                                       \
     do                                                                                             \
@@ -63,14 +63,14 @@
     } while (false)
 
 /**
- * \ingroup assert
+ * @ingroup assert
  *
  * At runtime, in debugging builds, if this condition is not
  * true, the program prints the message to output and
  * halts by calling std::terminate.
  *
- * \param [in] condition Condition to verify.
- * \param [in] message Message to output
+ * @param [in] condition Condition to verify.
+ * @param [in] message Message to output
  */
 #define NS_ASSERT_MSG(condition, message)                                                          \
     do                                                                                             \
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/attribute-accessor-helper.h ns-3.44/src/core/model/attribute-accessor-helper.h
--- ns-3.43/src/core/model/attribute-accessor-helper.h	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/attribute-accessor-helper.h	2025-03-09 16:55:49.355371000 -0700
@@ -11,8 +11,8 @@
 #include "attribute.h"
 
 /**
- * \file
- * \ingroup attributeimpl
+ * @file
+ * @ingroup attributeimpl
  * ns3::MakeAccessorHelper declarations and template implementations.
  */
 
@@ -20,23 +20,23 @@
 {
 
 /**
- * \ingroup attributeimpl
+ * @ingroup attributeimpl
  *
  * Create an AttributeAccessor for a class data member,
  * or a lone class get functor or set method.
  *
  * The get functor method should have a signature like
- * \code
+ * @code
  *   typedef U (T::*getter)() const
- * \endcode
+ * @endcode
  * where \pname{T} is the class and \pname{U} is the type of
  * the return value.
  *
  * The set method should have one of these signatures:
- * \code
+ * @code
  *   typedef void (T::*setter)(U)
  *   typedef bool (T::*setter)(U)
- * \endcode
+ * @endcode
  * where \pname{T} is the class and \pname{U} is the type of the value to set
  * the attribute to, which should be compatible with the
  * specific AttributeValue type \pname{V} which holds the value
@@ -44,37 +44,37 @@
  * In the case of a \pname{setter} returning \pname{bool,} the return value
  * should be \c true if the value could be set successfully.
  *
- * \tparam V  \explicit (If present) The specific AttributeValue type
+ * @tparam V  \explicit (If present) The specific AttributeValue type
  *            to use to represent the Attribute.  (If not present,
  *            the type \pname{V} is implicit in the name of this function,
  *            as "Make<V>Accessor"
- * \tparam T1 \deduced The type of the class data member,
+ * @tparam T1 \deduced The type of the class data member,
  *            or the type of the class get functor or set method.
- * \param [in] a1 The address of the data member,
+ * @param [in] a1 The address of the data member,
  *            or the get or set method.
- * \returns   The AttributeAccessor
+ * @returns   The AttributeAccessor
  */
 template <typename V, typename T1>
 inline Ptr<const AttributeAccessor> MakeAccessorHelper(T1 a1);
 
 /**
- * \ingroup attributeimpl
+ * @ingroup attributeimpl
  *
  * Create an AttributeAccessor using a pair of get functor
  * and set methods from a class.
  *
  * The get functor method should have a signature like
- * \code
+ * @code
  *   typedef U (T::*getter)() const
- * \endcode
+ * @endcode
  * where \pname{T} is the class and \pname{U} is the type of
  * the return value.
  *
  * The set method should have one of these signatures:
- * \code
+ * @code
  *   typedef void (T::*setter)(U)
  *   typedef bool (T::*setter)(U)
- * \endcode
+ * @endcode
  * where \pname{T} is the class and \pname{U} is the type of the value to set
  * the attribute to, which should be compatible with the
  * specific AttributeValue type \pname{V} which holds the value
@@ -85,17 +85,17 @@
  * In practice the setter and getter arguments can appear in either order,
  * but setter first is preferred.
  *
- * \tparam V  \explicit (If present) The specific AttributeValue type to use to represent
+ * @tparam V  \explicit (If present) The specific AttributeValue type to use to represent
  *            the Attribute.  (If not present, the type \pname{V} is implicit
  *            in the name of this function as "Make<V>Accessor"
- * \tparam T1 \deduced The type of the class data member,
+ * @tparam T1 \deduced The type of the class data member,
  *            or the type of the class get functor or set method.
  *
- * \tparam T2 \deduced The type of the getter class functor method.
- * \param [in] a2 The address of the class method to set the attribute.
- * \param [in] a1 The address of the data member,
+ * @tparam T2 \deduced The type of the getter class functor method.
+ * @param [in] a2 The address of the class method to set the attribute.
+ * @param [in] a1 The address of the data member,
  *            or the get or set method.
- * \returns   The AttributeAccessor
+ * @returns   The AttributeAccessor
  */
 template <typename V, typename T1, typename T2>
 inline Ptr<const AttributeAccessor> MakeAccessorHelper(T1 a1, T2 a2);
@@ -112,11 +112,11 @@
 {
 
 /**
- * \ingroup attributeimpl
+ * @ingroup attributeimpl
  *
  * The non-const and non-reference type equivalent to \pname{T}.
  *
- * \tparam T \explicit The original (possibly qualified) type.
+ * @tparam T \explicit The original (possibly qualified) type.
  */
 template <typename T>
 struct AccessorTrait
@@ -126,13 +126,13 @@
 };
 
 /**
- * \ingroup attributeimpl
+ * @ingroup attributeimpl
  *
  * Basic functionality for accessing class attributes via
  * class data members, or get functor/set methods.
  *
- * \tparam T \explicit Class of object holding the attribute.
- * \tparam U \explicit AttributeValue type for the underlying class member
+ * @tparam T \explicit Class of object holding the attribute.
+ * @tparam U \explicit AttributeValue type for the underlying class member
  *           which is an attribute.
  */
 template <typename T, typename U>
@@ -152,9 +152,9 @@
      *
      * Forwards to DoSet method.
      *
-     * \param [in] object Generic object pointer, to upcast to \pname{T}.
-     * \param [in] val Generic AttributeValue, to upcast to \pname{U}.
-     * \returns true if the member was set successfully.
+     * @param [in] object Generic object pointer, to upcast to \pname{T}.
+     * @param [in] val Generic AttributeValue, to upcast to \pname{U}.
+     * @returns true if the member was set successfully.
      */
     bool Set(ObjectBase* object, const AttributeValue& val) const override
     {
@@ -179,9 +179,9 @@
      *
      * Forwards to DoGet method.
      *
-     * \param [out] object Generic object pointer, to upcast to \pname{T}.
-     * \param [out] val Generic AttributeValue, to upcast to \pname{U}.
-     * \returns true if the member value could be retrieved successfully
+     * @param [out] object Generic object pointer, to upcast to \pname{T}.
+     * @param [out] val Generic AttributeValue, to upcast to \pname{U}.
+     * @returns true if the member value could be retrieved successfully
      */
     bool Get(const ObjectBase* object, AttributeValue& val) const override
     {
@@ -202,35 +202,35 @@
     /**
      * Setter implementation.
      *
-     * \see Set()
-     * \param [in] object The parent object holding the attribute.
-     * \param [in] v The specific AttributeValue to set.
-     * \returns true if the member was set successfully.
+     * @see Set()
+     * @param [in] object The parent object holding the attribute.
+     * @param [in] v The specific AttributeValue to set.
+     * @returns true if the member was set successfully.
      */
     virtual bool DoSet(T* object, const U* v) const = 0;
     /**
      * Getter implementation.
      *
-     * \see Get()
-     * \param [out] object The parent object holding the attribute.
-     * \param [out] v The specific AttributeValue to set.
-     * \returns true if the member value could be retrieved successfully
+     * @see Get()
+     * @param [out] object The parent object holding the attribute.
+     * @param [out] v The specific AttributeValue to set.
+     * @returns true if the member value could be retrieved successfully
      */
     virtual bool DoGet(const T* object, U* v) const = 0;
 
 }; // class AccessorHelper
 
 /**
- * \ingroup attributeimpl
+ * @ingroup attributeimpl
  *
  * MakeAccessorHelper implementation for a class data member.
  *
- * \tparam V  \explicit The specific AttributeValue type to use to represent
+ * @tparam V  \explicit The specific AttributeValue type to use to represent
  *            the Attribute.
- * \tparam T  \deduced The class holding the data member.
- * \tparam U  \deduced The type of the data member.
- * \param [in]  memberVariable  The address of the data member.
- * \returns The AttributeAccessor.
+ * @tparam T  \deduced The class holding the data member.
+ * @tparam U  \deduced The type of the data member.
+ * @param [in]  memberVariable  The address of the data member.
+ * @returns The AttributeAccessor.
  */
 template <typename V, typename T, typename U>
 inline Ptr<const AttributeAccessor>
@@ -242,7 +242,7 @@
       public:
         /*
          * Construct from a class data member address.
-         * \param [in] memberVariable The class data member address.
+         * @param [in] memberVariable The class data member address.
          */
         MemberVariable(U T::*memberVariable)
             : AccessorHelper<T, V>(),
@@ -286,16 +286,16 @@
 }
 
 /**
- * \ingroup attributeimpl
+ * @ingroup attributeimpl
  *
  * MakeAccessorHelper implementation for a class get functor method.
  *
- * \tparam V  \explicit The specific AttributeValue type to use to represent
+ * @tparam V  \explicit The specific AttributeValue type to use to represent
  *            the Attribute.
- * \tparam T  \deduced The class holding the get functor method.
- * \tparam U  \deduced The return type of the get functor method.
- * \param [in] getter  The address of the class get functor method.
- * \returns The AttributeAccessor.
+ * @tparam T  \deduced The class holding the get functor method.
+ * @tparam U  \deduced The return type of the get functor method.
+ * @param [in] getter  The address of the class get functor method.
+ * @returns The AttributeAccessor.
  */
 template <typename V, typename T, typename U>
 inline Ptr<const AttributeAccessor>
@@ -307,7 +307,7 @@
       public:
         /*
          * Construct from a class get functor method.
-         * \param [in] getter The class get functor method pointer.
+         * @param [in] getter The class get functor method pointer.
          */
         MemberMethod(U (T::*getter)() const)
             : AccessorHelper<T, V>(),
@@ -344,17 +344,17 @@
 }
 
 /**
- * \ingroup attributeimpl
+ * @ingroup attributeimpl
  *
  * MakeAccessorHelper implementation for a class set method
  * returning void.
  *
- * \tparam V  \explicit The specific AttributeValue type to use to represent
+ * @tparam V  \explicit The specific AttributeValue type to use to represent
  *            the Attribute.
- * \tparam T  \deduced The class holding the set method.
- * \tparam U  \deduced The argument type of the set method.
- * \param [in] setter  The address of the class set method, returning void.
- * \returns The AttributeAccessor.
+ * @tparam T  \deduced The class holding the set method.
+ * @tparam U  \deduced The argument type of the set method.
+ * @param [in] setter  The address of the class set method, returning void.
+ * @returns The AttributeAccessor.
  */
 template <typename V, typename T, typename U>
 inline Ptr<const AttributeAccessor>
@@ -366,7 +366,7 @@
       public:
         /*
          * Construct from a class set method.
-         * \param [in] setter The class set method pointer.
+         * @param [in] setter The class set method pointer.
          */
         MemberMethod(void (T::*setter)(U))
             : AccessorHelper<T, V>(),
@@ -409,21 +409,21 @@
 }
 
 /**
- * \ingroup attributeimpl
+ * @ingroup attributeimpl
  *
  * MakeAccessorHelper implementation with a class get functor method
  * and a class set method returning \pname{void}.
  *
  * The two versions of this function differ only in argument order.
  *
- * \tparam W  \explicit The specific AttributeValue type to use to represent
+ * @tparam W  \explicit The specific AttributeValue type to use to represent
  *            the Attribute.
- * \tparam T  \deduced The class holding the functor methods.
- * \tparam U  \deduced The argument type of the set method.
- * \tparam V  \deduced The return type of the get functor method.
- * \param [in] setter The address of the class set method, returning void.
- * \param [in] getter The address of the class get functor method.
- * \returns The AttributeAccessor.
+ * @tparam T  \deduced The class holding the functor methods.
+ * @tparam U  \deduced The argument type of the set method.
+ * @tparam V  \deduced The return type of the get functor method.
+ * @param [in] setter The address of the class set method, returning void.
+ * @param [in] getter The address of the class get functor method.
+ * @returns The AttributeAccessor.
  */
 template <typename W, typename T, typename U, typename V>
 inline Ptr<const AttributeAccessor>
@@ -438,8 +438,8 @@
       public:
         /*
          * Construct from class get functor and set methods.
-         * \param [in] setter The class set method pointer, returning void.
-         * \param [in] getter The class get functor method pointer.
+         * @param [in] setter The class set method pointer, returning void.
+         * @param [in] getter The class get functor method pointer.
          */
         MemberMethod(void (T::*setter)(U), V (T::*getter)() const)
             : AccessorHelper<T, W>(),
@@ -485,8 +485,8 @@
 }
 
 /**
- * \ingroup attributeimpl
- * \copydoc DoMakeAccessorHelperTwo(void(T::*)(U),V(T::*)()const)
+ * @ingroup attributeimpl
+ * @copydoc DoMakeAccessorHelperTwo(void(T::*)(U),V(T::*)()const)
  */
 template <typename W, typename T, typename U, typename V>
 inline Ptr<const AttributeAccessor>
@@ -496,21 +496,21 @@
 }
 
 /**
- * \ingroup attributeimpl
+ * @ingroup attributeimpl
  *
  * MakeAccessorHelper implementation with a class get functor method
  * and a class set method returning \pname{bool}.
  *
  * The two versions of this function differ only in argument order.
  *
- * \tparam W  \explicit The specific AttributeValue type to use to represent
+ * @tparam W  \explicit The specific AttributeValue type to use to represent
  *            the Attribute.
- * \tparam T  \deduced The class holding the functor methods.
- * \tparam U  \deduced The argument type of the set method.
- * \tparam V  \deduced The return type of the get functor method.
- * \param [in] setter The address of the class set method, returning bool.
- * \param [in] getter The address of the class get functor method.
- * \returns The AttributeAccessor.
+ * @tparam T  \deduced The class holding the functor methods.
+ * @tparam U  \deduced The argument type of the set method.
+ * @tparam V  \deduced The return type of the get functor method.
+ * @param [in] setter The address of the class set method, returning bool.
+ * @param [in] getter The address of the class get functor method.
+ * @returns The AttributeAccessor.
  */
 template <typename W, typename T, typename U, typename V>
 inline Ptr<const AttributeAccessor>
@@ -525,8 +525,8 @@
       public:
         /*
          * Construct from class get functor and set method, returning bool.
-         * \param [in] setter The class set method pointer, returning bool.
-         * \param [in] getter The class get functor method pointer.
+         * @param [in] setter The class set method pointer, returning bool.
+         * @param [in] getter The class get functor method pointer.
          */
         MemberMethod(bool (T::*setter)(U), V (T::*getter)() const)
             : AccessorHelper<T, W>(),
@@ -572,8 +572,8 @@
 }
 
 /**
- * \ingroup attributeimpl
- * \copydoc ns3::DoMakeAccessorHelperTwo(bool(T::*)(U),V(T::*)()const)
+ * @ingroup attributeimpl
+ * @copydoc ns3::DoMakeAccessorHelperTwo(bool(T::*)(U),V(T::*)()const)
  */
 template <typename W, typename T, typename U, typename V>
 inline Ptr<const AttributeAccessor>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/attribute.cc ns-3.44/src/core/model/attribute.cc
--- ns-3.43/src/core/model/attribute.cc	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/attribute.cc	2025-03-09 16:55:49.355371000 -0700
@@ -14,8 +14,8 @@
 #include <sstream>
 
 /**
- * \file
- * \ingroup attributes
+ * @file
+ * @ingroup attributes
  * ns3::AttributeValue, ns3::AttributeAccessor and
  * ns3::AttributeChecker implementations.
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/attribute-construction-list.cc ns-3.44/src/core/model/attribute-construction-list.cc
--- ns-3.43/src/core/model/attribute-construction-list.cc	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/attribute-construction-list.cc	2025-03-09 16:55:49.355371000 -0700
@@ -10,8 +10,8 @@
 #include "log.h"
 
 /**
- * \file
- * \ingroup object
+ * @file
+ * @ingroup object
  * ns3::AttributeConstructionList implementation.
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/attribute-construction-list.h ns-3.44/src/core/model/attribute-construction-list.h
--- ns-3.43/src/core/model/attribute-construction-list.h	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/attribute-construction-list.h	2025-03-09 16:55:49.355371000 -0700
@@ -13,8 +13,8 @@
 #include <list>
 
 /**
- * \file
- * \ingroup object
+ * @file
+ * @ingroup object
  * ns3::AttributeConstructionList declaration.
  */
 
@@ -22,7 +22,7 @@
 {
 
 /**
- * \ingroup object
+ * @ingroup object
  * List of Attribute name, value and checker triples used
  * to construct Objects.
  */
@@ -49,24 +49,24 @@
     /**
      * Add an Attribute to the list.
      *
-     * \param [in] name The Attribute name.
-     * \param [in] checker The checker to use for this Attribute.
-     * \param [in] value The AttributeValue to add.
+     * @param [in] name The Attribute name.
+     * @param [in] checker The checker to use for this Attribute.
+     * @param [in] value The AttributeValue to add.
      */
     void Add(std::string name, Ptr<const AttributeChecker> checker, Ptr<AttributeValue> value);
 
     /**
      * Find an Attribute in the list from its AttributeChecker.
      *
-     * \param [in] checker The AttributeChecker to find.  Typically this is the
+     * @param [in] checker The AttributeChecker to find.  Typically this is the
      *             AttributeChecker from TypeId::AttributeInformation.
-     * \returns The AttributeValue.
+     * @returns The AttributeValue.
      */
     Ptr<AttributeValue> Find(Ptr<const AttributeChecker> checker) const;
 
-    /** \returns The first item in the list */
+    /** @returns The first item in the list */
     CIterator Begin() const;
-    /** \returns The end of the list (iterator to one past the last). */
+    /** @returns The end of the list (iterator to one past the last). */
     CIterator End() const;
 
   private:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/attribute-container.h ns-3.44/src/core/model/attribute-container.h
--- ns-3.43/src/core/model/attribute-container.h	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/attribute-container.h	2025-03-09 16:55:49.355371000 -0700
@@ -24,8 +24,8 @@
 {
 
 /*!
- * \ingroup attributes
- * \addtogroup attribute_AttributeContainer AttributeContainer Attribute
+ * @ingroup attributes
+ * @addtogroup attribute_AttributeContainer AttributeContainer Attribute
  * AttributeValue implementation for AttributeContainer
  */
 
@@ -33,7 +33,7 @@
 
 // A = attribute value type, C = container type to return
 /**
- * \ingroup attribute_AttributeContainer
+ * @ingroup attribute_AttributeContainer
  *
  * A container for one type of attribute.
  *
@@ -78,7 +78,7 @@
     /**
      * Construct from another container.
      * @tparam CONTAINER \deduced type of container passed for initialization.
-     * \param c Instance of CONTAINER with which to initialize AttributeContainerValue.
+     * @param c Instance of CONTAINER with which to initialize AttributeContainerValue.
      */
     template <class CONTAINER>
     AttributeContainerValue(const CONTAINER& c);
@@ -103,7 +103,7 @@
     // defacto pure virtuals to integrate with built-in accessor code
     /**
      * Return a container of items.
-     * \return Container of items.
+     * @return Container of items.
      */
     result_type Get() const;
     /**
@@ -112,17 +112,17 @@
      * This method assumes \p c has stl-style begin and end methods.
      * The AttributeContainerValue value is cleared before copying from \p c.
      * @tparam T type of container.
-     * \param c Container from which to copy items.
+     * @param c Container from which to copy items.
      */
     template <class T>
     void Set(const T& c);
     /**
      * Set the given variable to the values stored by this TupleValue object.
      *
-     * \tparam T \deduced the type of the given variable (normally, the argument type
+     * @tparam T \deduced the type of the given variable (normally, the argument type
      *           of a set method or the type of a data member)
-     * \param value the given variable
-     * \return true if the given variable was set
+     * @param value the given variable
+     * @return true if the given variable was set
      */
     template <typename T>
     bool GetAccessor(T& value) const;
@@ -130,44 +130,44 @@
     // NS3 interface
     /**
      * NS3-style Number of items.
-     * \return Number of items in container.
+     * @return Number of items in container.
      */
     size_type GetN() const;
     /**
      * NS3-style beginning of container.
-     * \return Iterator pointing to first time in container.
+     * @return Iterator pointing to first time in container.
      */
     Iterator Begin();
     /**
      * NS3-style ending of container.
-     * \return Iterator pointing one past last item of container.
+     * @return Iterator pointing one past last item of container.
      */
     Iterator End();
 
     // STL-interface
     /**
      * STL-style number of items in container
-     * \return number of items in container.
+     * @return number of items in container.
      */
     size_type size() const;
     /**
      * STL-style beginning of container.
-     * \return Iterator pointing to first item in container.
+     * @return Iterator pointing to first item in container.
      */
     iterator begin();
     /**
      * STL-style end of container.
-     * \return Iterator pointing to one past last item in container.
+     * @return Iterator pointing to one past last item in container.
      */
     iterator end();
     /**
      * STL-style const beginning of container.
-     * \return Const iterator pointing to first item in container.
+     * @return Const iterator pointing to first item in container.
      */
     const_iterator begin() const;
     /**
      * STL-style const end of container.
-     * \return Const iterator pointing to one past last item in container.
+     * @return Const iterator pointing to one past last item in container.
      */
     const_iterator end() const;
 
@@ -180,7 +180,7 @@
      * @tparam ITER \deduced iterator type
      * \param[in] begin Points to first item to copy
      * \param[in] end Points to one after last item to copy
-     * \return This object with items copied.
+     * @return This object with items copied.
      */
     template <class ITER>
     inline Ptr<AttributeContainerValue<A, Sep, C>> CopyFrom(const ITER begin, const ITER end);
@@ -189,97 +189,97 @@
 };
 
 /*!
- * \ingroup attribute_AttributeContainer
+ * @ingroup attribute_AttributeContainer
  *
- * \class  ns3::AttributeContainerChecker "attribute-container.h"
+ * @class  ns3::AttributeContainerChecker "attribute-container.h"
  * AttributeChecker implementation for AttributeContainerValue.
- * \see AttributeChecker
+ * @see AttributeChecker
  */
 class AttributeContainerChecker : public AttributeChecker
 {
   public:
     /**
      * Set the item checker
-     * \param itemchecker The item checker
+     * @param itemchecker The item checker
      */
     virtual void SetItemChecker(Ptr<const AttributeChecker> itemchecker) = 0;
     /**
      * Get the item checker
-     * \return The item checker
+     * @return The item checker
      */
     virtual Ptr<const AttributeChecker> GetItemChecker() const = 0;
 };
 
 /**
- * \ingroup attribute_AttributeContainer
+ * @ingroup attribute_AttributeContainer
  *
  * Make AttributeContainerChecker from AttributeContainerValue.
  * @tparam A \deduced AttributeValue type in container.
  * @tparam Sep \deduced Character separator between elements for parsing.
  * @tparam C \deduced Container type returned by Get.
  * \param[in] value AttributeContainerValue from which to deduce types.
- * \return AttributeContainerChecker for value.
+ * @return AttributeContainerChecker for value.
  */
 template <class A, char Sep, template <class...> class C>
 Ptr<AttributeChecker> MakeAttributeContainerChecker(
     const AttributeContainerValue<A, Sep, C>& value);
 
 /**
- * \ingroup attribute_AttributeContainer
+ * @ingroup attribute_AttributeContainer
  *
  * Make AttributeContainerChecker using explicit types, initialize item checker.
  * @tparam A AttributeValue type in container.
  * @tparam Sep Character separator between elements for parsing.
  * @tparam C Container type returned by Get.
  * \param[in] itemchecker AttributeChecker used for each item in the container.
- * \return AttributeContainerChecker.
+ * @return AttributeContainerChecker.
  */
 template <class A, char Sep = ',', template <class...> class C = std::list>
 Ptr<const AttributeChecker> MakeAttributeContainerChecker(Ptr<const AttributeChecker> itemchecker);
 
 /**
- * \ingroup attribute_AttributeContainer
+ * @ingroup attribute_AttributeContainer
  *
  * Make uninitialized AttributeContainerChecker using explicit types.
  * @tparam A AttributeValue type in container.
  * @tparam Sep Character separator between elements for parsing.
  * @tparam C Container type returned by Get.
- * \return AttributeContainerChecker.
+ * @return AttributeContainerChecker.
  */
 template <class A, char Sep = ',', template <class...> class C = std::list>
 Ptr<AttributeChecker> MakeAttributeContainerChecker();
 
 /**
- * \ingroup attribute_AttributeContainer
+ * @ingroup attribute_AttributeContainer
  *
  * Make AttributeContainerAccessor  using explicit types.
  * @tparam A AttributeValue type in container.
  * @tparam Sep Character separator between elements for parsing.
  * @tparam C Container type returned by Get.
- * \tparam T1 \deduced The type of the class data member,
+ * @tparam T1 \deduced The type of the class data member,
  *            or the type of the class get functor or set method.
- * \param [in] a1 The address of the data member,
+ * @param [in] a1 The address of the data member,
  *            or the get or set method.
- * \return AttributeContainerAccessor.
+ * @return AttributeContainerAccessor.
  */
 template <typename A, char Sep = ',', template <typename...> class C = std::list, typename T1>
 Ptr<const AttributeAccessor> MakeAttributeContainerAccessor(T1 a1);
 
 /**
- * \ingroup attribute_AttributeContainer
+ * @ingroup attribute_AttributeContainer
  *
  * Make AttributeContainerAccessor  using explicit types.
  * @tparam A AttributeValue type in container.
  * @tparam Sep Character separator between elements for parsing.
  * @tparam C Container type returned by Get.
- * \tparam T1 \deduced The type of the class data member,
+ * @tparam T1 \deduced The type of the class data member,
  *            or the type of the class get functor or set method.
  *
- * \tparam T2 \deduced The type of the getter class functor method.
- * \param [in] a2 The address of the class method to set the attribute.
- * \param [in] a1 The address of the data member,
+ * @tparam T2 \deduced The type of the getter class functor method.
+ * @param [in] a2 The address of the class method to set the attribute.
+ * @param [in] a1 The address of the data member,
  *            or the get or set method.
- * \return AttributeContainerAccessor.
+ * @return AttributeContainerAccessor.
  */
 template <typename A,
           char Sep = ',',
@@ -301,9 +301,9 @@
 {
 
 /**
- * \ingroup attribute_AttributeContainer
+ * @ingroup attribute_AttributeContainer
  *
- * \internal
+ * @internal
  *
  * Templated AttributeContainerChecker class that is instantiated
  * in MakeAttributeContainerChecker. The non-templated base ns3::AttributeContainerChecker
@@ -316,7 +316,7 @@
     AttributeContainerChecker();
     /**
      * Explicit constructor
-     * \param itemchecker The AttributeChecker.
+     * @param itemchecker The AttributeChecker.
      */
     explicit AttributeContainerChecker(Ptr<const AttributeChecker> itemchecker);
     void SetItemChecker(Ptr<const AttributeChecker> itemchecker) override;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/attribute.h ns-3.44/src/core/model/attribute.h
--- ns-3.43/src/core/model/attribute.h	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/attribute.h	2025-03-09 16:55:49.355371000 -0700
@@ -15,8 +15,8 @@
 #include <string>
 
 /**
- * \file
- * \ingroup attributes
+ * @file
+ * @ingroup attributes
  * ns3::AttributeValue, ns3::AttributeAccessor and
  * ns3::AttributeChecker declarations.
  */
@@ -31,8 +31,8 @@
 
 /**
  *
- * \ingroup core
- * \defgroup attributes Attributes
+ * @ingroup core
+ * @defgroup attributes Attributes
  *
  * The \c ns-3 attribute system is the mechanism used in \c ns-3 to
  * organize, document, and modify the *values* used by the various
@@ -47,9 +47,9 @@
 
 /**
  *
- * \ingroup attributes
+ * @ingroup attributes
  *
- * \brief Hold a value for an Attribute.
+ * @brief Hold a value for an Attribute.
  *
  * Instances of this class should always be wrapped into an Attribute object.
  * Most subclasses of this base class are implemented by the
@@ -62,12 +62,12 @@
     virtual ~AttributeValue();
 
     /**
-     * \returns a deep copy of this class, wrapped into an Attribute object.
+     * @returns a deep copy of this class, wrapped into an Attribute object.
      */
     virtual Ptr<AttributeValue> Copy() const = 0;
     /**
-     * \param [in] checker The checker associated to the attribute
-     * \returns A string representation of this value.
+     * @param [in] checker The checker associated to the attribute
+     * @returns A string representation of this value.
      *
      * In most cases, this method will not make any use of the checker argument.
      * However, in a very limited set of cases, the checker argument is needed to
@@ -76,9 +76,9 @@
      */
     virtual std::string SerializeToString(Ptr<const AttributeChecker> checker) const = 0;
     /**
-     * \param [in] value A string representation of the value
-     * \param [in] checker A pointer to the checker associated to the attribute.
-     * \returns true if the input string was correctly-formatted and could be
+     * @param [in] value A string representation of the value
+     * @param [in] checker A pointer to the checker associated to the attribute.
+     * @returns true if the input string was correctly-formatted and could be
      *          successfully deserialized, false otherwise.
      *
      * Upon return of this function, this AttributeValue instance contains
@@ -92,9 +92,9 @@
 };
 
 /**
- * \brief allow setting and getting the value of an attribute.
+ * @brief allow setting and getting the value of an attribute.
  *
- * \ingroup attributes
+ * @ingroup attributes
  *
  * The goal of this class is to hide from the user how an attribute
  * is actually set or get to or from a class instance. Implementations
@@ -108,18 +108,18 @@
     virtual ~AttributeAccessor();
 
     /**
-     * \param [in,out] object The object instance to set the value in
-     * \param [in] value The value to set
-     * \returns true if the value could be set successfully, false otherwise.
+     * @param [in,out] object The object instance to set the value in
+     * @param [in] value The value to set
+     * @returns true if the value could be set successfully, false otherwise.
      *
      * This method expects that the caller has checked that the input value is
      * valid with AttributeChecker::Check.
      */
     virtual bool Set(ObjectBase* object, const AttributeValue& value) const = 0;
     /**
-     * \param [in,out] object The object instance to get the value from
-     * \param [out] attribute A pointer to where the value should be set.
-     * \returns true if the value could be read successfully, and
+     * @param [in,out] object The object instance to get the value from
+     * @param [out] attribute A pointer to where the value should be set.
+     * @returns true if the value could be read successfully, and
      *          stored in the input value, false otherwise.
      *
      * This method expects that the caller has checked that the input value is
@@ -128,21 +128,21 @@
     virtual bool Get(const ObjectBase* object, AttributeValue& attribute) const = 0;
 
     /**
-     * \return true if this accessor supports the Get operation, false
+     * @return true if this accessor supports the Get operation, false
      *         otherwise.
      */
     virtual bool HasGetter() const = 0;
     /**
-     * \return true if this accessor supports the Set operation, false
+     * @return true if this accessor supports the Set operation, false
      *         otherwise.
      */
     virtual bool HasSetter() const = 0;
 };
 
 /**
- * \brief Represent the type of an attribute
+ * @brief Represent the type of an attribute
  *
- * \ingroup attributes
+ * @ingroup attributes
  *
  * Each type of attribute has an associated unique AttributeChecker
  * subclass. The type of the subclass can be safely used by users
@@ -163,19 +163,19 @@
      * Create a valid value from the argument value,
      * or reinterpret the argument as a string.
      *
-     * \param [in] value The AttributeValue to check
-     * \return Ptr to a valid value
+     * @param [in] value The AttributeValue to check
+     * @return Ptr to a valid value
      */
     Ptr<AttributeValue> CreateValidValue(const AttributeValue& value) const;
     /**
-     * \param [in] value A pointer to the value to check
-     * \returns true if the input value is both of the right type
+     * @param [in] value A pointer to the value to check
+     * @returns true if the input value is both of the right type
      *          and if its value is within the requested range. Returns
      *          false otherwise.
      */
     virtual bool Check(const AttributeValue& value) const = 0;
     /**
-     * \returns the c++ fully-qualified typename of the subclass
+     * @returns the c++ fully-qualified typename of the subclass
      *          of the ns3::AttributeValue base class which is associated
      *          to this checker.
      *
@@ -184,7 +184,7 @@
      */
     virtual std::string GetValueTypeName() const = 0;
     /**
-     * \returns true if this checker has information about the underlying
+     * @returns true if this checker has information about the underlying
      *          C++ type, false otherwise.
      *
      * If this method returns false, the return value of the GetUnderlyingTypeInformation
@@ -192,12 +192,12 @@
      */
     virtual bool HasUnderlyingTypeInformation() const = 0;
     /**
-     * \returns a human-readable representation of information about
+     * @returns a human-readable representation of information about
      *          the underlying C++ type.
      */
     virtual std::string GetUnderlyingTypeInformation() const = 0;
     /**
-     * \returns a new instance of an AttributeValue (wrapper in an Attribute
+     * @returns a new instance of an AttributeValue (wrapper in an Attribute
      *          instance) which matches the type of the underlying attribute.
      *
      * This method is typically used to create a temporary variable prior
@@ -207,25 +207,25 @@
     /**
      * Copy the source to the destination
 
-     * \param [in] source Source AttributeValue
-     * \param [out] destination Destination AttributeValue
-     * \return true if copy was successful
+     * @param [in] source Source AttributeValue
+     * @param [out] destination Destination AttributeValue
+     * @return true if copy was successful
      */
     virtual bool Copy(const AttributeValue& source, AttributeValue& destination) const = 0;
 };
 
 /**
- * \ingroup attributes
- * \defgroup attribute_EmptyAttribute EmptyAttribute Attribute
+ * @ingroup attributes
+ * @defgroup attribute_EmptyAttribute EmptyAttribute Attribute
  * AttributeValue implementation for EmptyAttribute
  */
 
 /**
- * \brief A class for an empty attribute value.
+ * @brief A class for an empty attribute value.
  *
- * \ingroup attribute_EmptyAttribute
+ * @ingroup attribute_EmptyAttribute
  *
- * \see AttributeValue
+ * @see AttributeValue
  */
 class EmptyAttributeValue : public AttributeValue
 {
@@ -235,20 +235,20 @@
 
   private:
     /**
-     * \returns a deep copy of this class, wrapped into an Attribute object.
+     * @returns a deep copy of this class, wrapped into an Attribute object.
      */
     Ptr<AttributeValue> Copy() const override;
     /**
-     * \param [in] checker The checker associated to the attribute
-     * \returns a string representation of this value.
+     * @param [in] checker The checker associated to the attribute
+     * @returns a string representation of this value.
      *
      * In the EmptyAttributeValue case, the string returned will be simply ""
      */
     std::string SerializeToString(Ptr<const AttributeChecker> checker) const override;
     /**
-     * \param [in] value A string representation of the value
-     * \param [in] checker A pointer to the checker associated to the attribute.
-     * \returns true if the input string was correctly-formatted and could be
+     * @param [in] value A string representation of the value
+     * @param [in] checker A pointer to the checker associated to the attribute.
+     * @returns true if the input string was correctly-formatted and could be
      *          successfully deserialized, false otherwise.
      *
      * In the trivial case of EmptyAttributeValue, this should always return true
@@ -257,9 +257,9 @@
 };
 
 /**
- * \brief An accessor for EmptyAttributeValue
+ * @brief An accessor for EmptyAttributeValue
  *
- * \ingroup attribute_EmptyAttribute
+ * @ingroup attribute_EmptyAttribute
  *
  * Does nothing, since every EmptyAttributeValue is the same.
  */
@@ -275,11 +275,11 @@
 };
 
 /**
- * \ingroup attribute_EmptyAttribute
+ * @ingroup attribute_EmptyAttribute
  *
- * \brief Create an empty AttributeAccessor.
+ * @brief Create an empty AttributeAccessor.
  *
- * \returns The empty AttributeAccessor (runtime exception if used)
+ * @returns The empty AttributeAccessor (runtime exception if used)
  */
 static inline Ptr<const AttributeAccessor>
 MakeEmptyAttributeAccessor()
@@ -288,9 +288,9 @@
 }
 
 /**
- * \brief A checker for EmptyAttributeValue
+ * @brief A checker for EmptyAttributeValue
  *
- * \ingroup attribute_EmptyAttribute
+ * @ingroup attribute_EmptyAttribute
  *
  * Does nothing, since every EmptyAttributeValue does not contain anything and
  * is, of course, valid.
@@ -309,11 +309,11 @@
 };
 
 /**
- * \ingroup attribute_EmptyAttribute
+ * @ingroup attribute_EmptyAttribute
  *
- * \brief Create an empty AttributeChecker.
+ * @brief Create an empty AttributeChecker.
  *
- * \returns The empty AttributeChecker (runtime exception if used)
+ * @returns The empty AttributeChecker (runtime exception if used)
  */
 static inline Ptr<AttributeChecker>
 MakeEmptyAttributeChecker()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/attribute-helper.h ns-3.44/src/core/model/attribute-helper.h
--- ns-3.43/src/core/model/attribute-helper.h	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/attribute-helper.h	2025-03-09 16:55:49.355371000 -0700
@@ -15,8 +15,8 @@
 #include <sstream>
 
 /**
- * \file
- * \ingroup attributehelper
+ * @file
+ * @ingroup attributehelper
  * Attribute helper (\c ATTRIBUTE_ )macros definition.
  */
 
@@ -24,8 +24,8 @@
 {
 
 /**
- * \ingroup attributes
- * \defgroup attributehelper Attribute Helper
+ * @ingroup attributes
+ * @defgroup attributehelper Attribute Helper
  *
  * All these macros can be used to generate automatically the code
  * for subclasses of AttributeValue, AttributeAccessor, and, AttributeChecker,
@@ -41,7 +41,7 @@
  * The simple macros are implemented in terms of the complex
  * macros and should generally be preferred over the complex macros.
  *
- * \note
+ * @note
  * Because these macros generate class and function definitions, it's
  * difficult to document the results directly.  Instead, we use a
  * set of functions in print-introspected-doxygen.cc to generate
@@ -51,8 +51,8 @@
  */
 
 /**
- * \ingroup attributehelper
- * \defgroup attributeimpl Attribute Implementation
+ * @ingroup attributehelper
+ * @defgroup attributeimpl Attribute Implementation
  *
  * These are the internal implementation functions for the Attribute
  * system.
@@ -71,17 +71,17 @@
  */
 
 /**
- * \ingroup attributeimpl
+ * @ingroup attributeimpl
  *
  * A simple string-based attribute checker
  *
- * \tparam T    \explicit The specific AttributeValue type used to represent
+ * @tparam T    \explicit The specific AttributeValue type used to represent
  *              the Attribute.
- * \tparam BASE \explicit The AttributeChecker type corresponding to \pname{T}.
- * \param [in] name  The name of the AttributeValue type, essentially the
+ * @tparam BASE \explicit The AttributeChecker type corresponding to \pname{T}.
+ * @param [in] name  The name of the AttributeValue type, essentially the
  *              string form of \pname{T}.
- * \param [in] underlying Underlying type name.
- * \return Ptr to AttributeChecker.
+ * @param [in] underlying Underlying type name.
+ * @return Ptr to AttributeChecker.
  */
 template <typename T, typename BASE>
 Ptr<AttributeChecker>
@@ -89,7 +89,7 @@
 {
     /**
      * String-based AttributeChecker implementation.
-     * \extends AttributeChecker
+     * @extends AttributeChecker
      */
     struct SimpleAttributeChecker : public BASE
     {
@@ -147,12 +147,12 @@
 } // namespace ns3
 
 /**
- * \ingroup attributehelper
+ * @ingroup attributehelper
  *
  * Define the attribute accessor functions \c MakeTypeAccessor
  * for class \pname{type}.
  *
- * \param [in] type The name of the class
+ * @param [in] type The name of the class
  *
  * This macro defines and generates the code for the implementation
  * of the \c MakeTypeAccessor template functions. This macro is typically
@@ -173,13 +173,13 @@
     }
 
 /**
- * \ingroup attributehelper
+ * @ingroup attributehelper
  *
  * Declare the attribute value class \pname{nameValue}
  * for underlying class \pname{type}.
  *
- * \param [in] type The underlying type name token
- * \param [in] name The token to use in defining the accessor name.
+ * @param [in] type The underlying type name token
+ * @param [in] name The token to use in defining the accessor name.
  *
  * This macro declares the class \c typeValue associated with class \c type.
  * This macro is typically invoked in the class header file.
@@ -213,12 +213,12 @@
     }
 
 /**
- * \ingroup attributehelper
+ * @ingroup attributehelper
  *
  * Declare the attribute value class \pname{nameValue}
  * for the class \pname{name}
  *
- * \param [in] name The name of the class.
+ * @param [in] name The name of the class.
  *
  * This macro declares the class \c nameValue associated to class \c name.
  * This macro is typically invoked in the class header file.
@@ -226,29 +226,29 @@
 #define ATTRIBUTE_VALUE_DEFINE(name) ATTRIBUTE_VALUE_DEFINE_WITH_NAME(name, name)
 
 /**
- * \ingroup attributehelper
+ * @ingroup attributehelper
  *
  * Define the conversion operators class \pname{type} and
  * Attribute instances.
  *
- * \param [in] type The name of the class
+ * @param [in] type The name of the class
  *
  * This macro defines the conversion operators for class \c type to and
  * from instances of \c typeAttribute.
  * Typically invoked in the class header file.
  *
- * \internal
+ * @internal
  * This appears to be unused in the current code base.
  */
 #define ATTRIBUTE_CONVERTER_DEFINE(type)
 
 /**
- * \ingroup attributehelper
+ * @ingroup attributehelper
  *
  * Declare the AttributeChecker class \pname{typeChecker}
  * and the \c MaketypeChecker function for class \pname{type}.
  *
- * \param [in] type The name of the class
+ * @param [in] type The name of the class
  *
  * This macro declares the \pname{typeChecker} class and the associated
  * \c MaketypeChecker function.
@@ -265,14 +265,14 @@
     Ptr<const AttributeChecker> Make##type##Checker()
 
 /**
- * \ingroup attributehelper
+ * @ingroup attributehelper
  *
  * Define the class methods belonging to
  * the attribute value class \pname{nameValue}
  * of the underlying class \pname{type}.
  *
- * \param [in] type The underlying type name
- * \param [in] name The token to use in defining the accessor name.
+ * @param [in] type The underlying type name
+ * @param [in] name The token to use in defining the accessor name.
  *
  * This macro implements the \pname{typeValue} class methods
  * (including the \pname{typeValue}%::%SerializeToString
@@ -322,12 +322,12 @@
     }
 
 /**
- * \ingroup attributehelper
+ * @ingroup attributehelper
  *
  * Define the class methods belonging to
  * attribute value class \pname{typeValue} for class \pname{type}.
  *
- * \param [in] type The name of the class.
+ * @param [in] type The name of the class.
  *
  * This macro implements the \pname{typeValue} class methods
  * (including the \pname{typeValue}%::%SerializeToString
@@ -338,11 +338,11 @@
 #define ATTRIBUTE_VALUE_IMPLEMENT(type) ATTRIBUTE_VALUE_IMPLEMENT_WITH_NAME(type, type)
 
 /**
- * \ingroup attributehelper
+ * @ingroup attributehelper
  *
  * Define the \c MaketypeChecker function for class \pname{type}.
  *
- * \param [in] type The name of the class
+ * @param [in] type The name of the class
  *
  * This macro implements the \c MaketypeChecker function.
  *
@@ -355,12 +355,12 @@
     }
 
 /**
- * \ingroup attributehelper
+ * @ingroup attributehelper
  *
  * Define the \c MaketypeChecker function for class \pname{type}.
  *
- * \param [in] type The name of the class.
- * \param [in] name The string name of the underlying type.
+ * @param [in] type The name of the class.
+ * @param [in] name The string name of the underlying type.
  *
  * This macro implements the \c MaketypeChecker function
  * for class \pname{type}.
@@ -374,11 +374,11 @@
     }
 
 /**
- * \ingroup attributehelper
+ * @ingroup attributehelper
  *
  * Declare the attribute value, accessor and checkers for class \pname{type}
  *
- * \param [in] type The name of the class
+ * @param [in] type The name of the class
  *
  * This macro declares:
  *
@@ -400,11 +400,11 @@
     ATTRIBUTE_CHECKER_DEFINE(type)
 
 /**
- * \ingroup attributehelper
+ * @ingroup attributehelper
  *
  * Define the attribute value, accessor and checkers for class \pname{type}
  *
- * \param [in] type The name of the class
+ * @param [in] type The name of the class
  *
  * This macro implements
  *
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/boolean.cc ns-3.44/src/core/model/boolean.cc
--- ns-3.43/src/core/model/boolean.cc	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/boolean.cc	2025-03-09 16:55:49.355371000 -0700
@@ -11,8 +11,8 @@
 #include "log.h"
 
 /**
- * \file
- * \ingroup attribute_Boolean
+ * @file
+ * @ingroup attribute_Boolean
  * ns3::BooleanValue attribute value implementation.
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/boolean.h ns-3.44/src/core/model/boolean.h
--- ns-3.43/src/core/model/boolean.h	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/boolean.h	2025-03-09 16:55:49.355371000 -0700
@@ -12,8 +12,8 @@
 #include "attribute.h"
 
 /**
- * \file
- * \ingroup attribute_Boolean
+ * @file
+ * @ingroup attribute_Boolean
  * ns3::BooleanValue attribute value declarations.
  */
 
@@ -34,7 +34,7 @@
 
     /**
      * Functor returning the value.
-     * \returns The value.
+     * @returns The value.
      */
     operator bool() const;
 
@@ -55,14 +55,14 @@
 }
 
 /**
- * \ingroup attribute_Boolean
+ * @ingroup attribute_Boolean
  * Output streamer.
  *
  * The value is printed as "true" or "false".
  *
- * \param [in,out] os The stream.
- * \param [in] value The BooleanValue to print.
- * \returns The stream.
+ * @param [in,out] os The stream.
+ * @param [in] value The BooleanValue to print.
+ * @returns The stream.
  */
 std::ostream& operator<<(std::ostream& os, const BooleanValue& value);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/breakpoint.cc ns-3.44/src/core/model/breakpoint.cc
--- ns-3.43/src/core/model/breakpoint.cc	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/breakpoint.cc	2025-03-09 16:55:49.355371000 -0700
@@ -20,8 +20,8 @@
 {
 
 /**
- * \file
- * \ingroup breakpoint
+ * @file
+ * @ingroup breakpoint
  * ns3::BreakpointFallback function implementation.
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/breakpoint.h ns-3.44/src/core/model/breakpoint.h
--- ns-3.43/src/core/model/breakpoint.h	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/breakpoint.h	2025-03-09 16:55:49.355371000 -0700
@@ -10,8 +10,8 @@
 #define BREAKPOINT_H
 
 /**
- * \file
- * \ingroup breakpoint
+ * @file
+ * @ingroup breakpoint
  * NS_BREAKPOINT() macro definition and ns3::BreakpointFallback
  * function declaration.
  */
@@ -31,14 +31,14 @@
  */
 
 /**
- * \ingroup debugging
- * \defgroup breakpoint Breakpoints
+ * @ingroup debugging
+ * @defgroup breakpoint Breakpoints
  *
- * \brief Trigger a debugger breakpoint.
+ * @brief Trigger a debugger breakpoint.
  */
 
 /**
- * \ingroup breakpoint
+ * @ingroup breakpoint
  *
  * Inserts a breakpoint instruction (or equivalent system call) into
  * the code for selected machines.  When an NS_ASSERT cannot verify
@@ -70,9 +70,9 @@
 #endif
 
 /**
- * \ingroup breakpoint
+ * @ingroup breakpoint
  *
- * \brief fallback breakpoint function
+ * @brief fallback breakpoint function
  *
  * This function is used by the NS_BREAKPOINT() macro as a fallback
  * for when breakpoint assembly instructions are not available.  It
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/build-profile.h ns-3.44/src/core/model/build-profile.h
--- ns-3.43/src/core/model/build-profile.h	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/build-profile.h	2025-03-09 16:55:49.355371000 -0700
@@ -10,16 +10,16 @@
 #define NS3_BUILD_PROFILE_H
 
 /**
- * \file
- * \ingroup debugging
+ * @file
+ * @ingroup debugging
  * NS_BUILD_DEBUG, NS_BUILD_RELEASE, and NS_BUILD_OPTIMIZED
  * macro definitions.
  */
 
 /**
- * \ingroup debugging
+ * @ingroup debugging
  * Build profile no-op macro.
- * \param [in] code The code to skip.
+ * @param [in] code The code to skip.
  */
 #define NS_BUILD_PROFILE_NOOP(code)                                                                \
     do                                                                                             \
@@ -30,9 +30,9 @@
     while (false)
 
 /**
- * \ingroup debugging
+ * @ingroup debugging
  * Build profile macro to execute a code snippet.
- * \param [in] code The code to execute.
+ * @param [in] code The code to execute.
  */
 #define NS_BUILD_PROFILE_OP(code)                                                                  \
     do                                                                                             \
@@ -42,9 +42,9 @@
 
 #ifdef NS3_BUILD_PROFILE_DEBUG
 /**
- * \ingroup debugging
+ * @ingroup debugging
  * Execute a code snippet in debug builds.
- * \param [in] code The code to execute.
+ * @param [in] code The code to execute.
  */
 #define NS_BUILD_DEBUG(code) NS_BUILD_PROFILE_OP(code)
 #else
@@ -53,9 +53,9 @@
 
 #ifdef NS3_BUILD_PROFILE_RELEASE
 /**
- * \ingroup debugging
+ * @ingroup debugging
  * Execute a code snippet in release builds.
- * \param [in] code The code to execute.
+ * @param [in] code The code to execute.
  */
 #define NS_BUILD_RELEASE(code) NS_BUILD_PROFILE_OP(code)
 #else
@@ -64,9 +64,9 @@
 
 #ifdef NS3_BUILD_PROFILE_OPTIMIZED
 /**
- * \ingroup debugging
+ * @ingroup debugging
  * Execute a code snippet in optimized builds.
- * \param [in] code The code to execute.
+ * @param [in] code The code to execute.
  */
 #define NS_BUILD_OPTIMIZED(code) NS_BUILD_PROFILE_OP(code)
 #else
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/cairo-wideint.c.license ns-3.44/src/core/model/cairo-wideint.c.license
--- ns-3.43/src/core/model/cairo-wideint.c.license	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/core/model/cairo-wideint.c.license	2025-03-09 16:55:49.355371000 -0700
@@ -0,0 +1,2 @@
+Copyright © 2004 Keith Packard
+SPDX-License-Identifier: GPL-2.0-only
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/cairo-wideint-private.h.license ns-3.44/src/core/model/cairo-wideint-private.h.license
--- ns-3.43/src/core/model/cairo-wideint-private.h.license	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/core/model/cairo-wideint-private.h.license	2025-03-09 16:55:49.355371000 -0700
@@ -0,0 +1,2 @@
+Copyright © 2004 Keith Packard
+SPDX-License-Identifier: GPL-2.0-only
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/calendar-scheduler.cc ns-3.44/src/core/model/calendar-scheduler.cc
--- ns-3.43/src/core/model/calendar-scheduler.cc	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/calendar-scheduler.cc	2025-03-09 16:55:49.355371000 -0700
@@ -20,8 +20,8 @@
 #include <utility>
 
 /**
- * \file
- * \ingroup scheduler
+ * @file
+ * @ingroup scheduler
  * ns3::CalendarScheduler class implementation.
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/calendar-scheduler.h ns-3.44/src/core/model/calendar-scheduler.h
--- ns-3.43/src/core/model/calendar-scheduler.h	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/calendar-scheduler.h	2025-03-09 16:55:49.355371000 -0700
@@ -16,8 +16,8 @@
 #include <stdint.h>
 
 /**
- * \file
- * \ingroup scheduler
+ * @file
+ * @ingroup scheduler
  * ns3::CalendarScheduler class declaration.
  */
 
@@ -27,8 +27,8 @@
 class EventImpl;
 
 /**
- * \ingroup scheduler
- * \brief a calendar queue event scheduler
+ * @ingroup scheduler
+ * @brief a calendar queue event scheduler
  *
  * This event scheduler is a direct implementation of the algorithm
  * known as a calendar queue, first published in 1988 in
@@ -46,7 +46,7 @@
  * Buckets themselves are implemented as a `std::list<>`, and events are
  * kept sorted within the buckets.
  *
- * \par Time Complexity
+ * @par Time Complexity
  *
  * Operation    | Amortized %Time | Reason
  * :----------- | :-------------- | :-----
@@ -56,21 +56,21 @@
  * Remove()     | ~Constant       | Search within bucket; possible resize
  * RemoveNext() | ~Constant       | Search buckets; possible resize
  *
- * \par Memory Complexity
+ * @par Memory Complexity
  *
  * Category  | Memory                           | Reason
  * :-------- | :------------------------------- | :-----
  * Overhead  | 2 x `sizeof (*)` + `size_t`<br/>(24 bytes) | `std::list`
  * Per Event | 2 x `sizeof (*)`                 | `std::list`
  *
- * \note
+ * @note
  * This queue is much slower than I expected (much slower than the
  * std::map queue) and this seems to be because the original resizing policy
  * is horribly bad.  This is most likely the reason why there have been
  * so many variations published which all slightly tweak the resizing
  * heuristics to obtain a better distribution of events across buckets.
  *
- * \note While inserion sort is not discussed in the original article, its
+ * @note While inserion sort is not discussed in the original article, its
  * implementation appears to dramatically affect performance.
  * The default implementation sorts buckets in increasing (chronological)
  * order.  The alternative, sorting buckets in decreasing order,
@@ -84,7 +84,7 @@
   public:
     /**
      *  Register this type.
-     *  \return The object TypeId.
+     *  @return The object TypeId.
      */
     static TypeId GetTypeId();
 
@@ -108,28 +108,28 @@
     /**
      * Resize to a new number of buckets, with automatically computed width.
      *
-     * \param [in] newSize The new number of buckets.
+     * @param [in] newSize The new number of buckets.
      */
     void Resize(uint32_t newSize);
     /**
      * Compute the new bucket size, based on up to the first 25 entries.
      *
-     * \returns The new width.
+     * @returns The new width.
      */
     uint64_t CalculateNewWidth();
     /**
      * Initialize the calendar queue.
      *
-     * \param [in] nBuckets The number of buckets.
-     * \param [in] width The bucket size, in dimensionless time units.
-     * \param [in] startPrio The starting time.
+     * @param [in] nBuckets The number of buckets.
+     * @param [in] width The bucket size, in dimensionless time units.
+     * @param [in] startPrio The starting time.
      */
     void Init(uint32_t nBuckets, uint64_t width, uint64_t startPrio);
     /**
      * Hash the dimensionless time to a bucket.
      *
-     * \param [in] key The dimensionless time.
-     * \returns The bucket index.
+     * @param [in] key The dimensionless time.
+     * @returns The bucket index.
      */
     inline uint32_t Hash(uint64_t key) const;
     /** Print the configuration and bucket size distribution. */
@@ -137,20 +137,20 @@
     /**
      * Resize the number of buckets and width.
      *
-     * \param [in] newSize The number of buckets.
-     * \param [in] newWidth The size of the new buckets.
+     * @param [in] newSize The number of buckets.
+     * @param [in] newWidth The size of the new buckets.
      */
     void DoResize(uint32_t newSize, uint64_t newWidth);
     /**
      * Remove the earliest event.
      *
-     * \returns The earliest event.
+     * @returns The earliest event.
      */
     Scheduler::Event DoRemoveNext();
     /**
      * Insert a new event in to the correct bucket.
      *
-     * \param [in] ev The new Event.
+     * @param [in] ev The new Event.
      */
     void DoInsert(const Scheduler::Event& ev);
 
@@ -178,26 +178,26 @@
      * This can only be used at construction, as invoked by the
      * Attribute Reverse.
      *
-     * \param [in] reverse If \c true, store events in *decreasing*
+     * @param [in] reverse If \c true, store events in *decreasing*
      * time stamp order.
      */
     void SetReverse(bool reverse);
     /**
      * Get the next event from the bucket, according to \c m_reverse.
-     * \param [in] bucket The bucket to draw from.
-     * \return The next event from the \c bucket.
+     * @param [in] bucket The bucket to draw from.
+     * @return The next event from the \c bucket.
      */
     Scheduler::Event& (*NextEvent)(Bucket& bucket);
     /**
      * Ordering function to identify the insertion point, according to \c m_reverse.
-     * \param [in] newEvent The new event being inserted.
-     * \param [in] it The current position in the bucket being examined.
-     * \return \c true if the \c newEvent belongs before \c it.
+     * @param [in] newEvent The new event being inserted.
+     * @param [in] it The current position in the bucket being examined.
+     * @return \c true if the \c newEvent belongs before \c it.
      */
     bool (*Order)(const EventKey& newEvent, const EventKey& it);
     /**
      * Pop the next event from the bucket, according to \c m_reverse.
-     * \param [in] bucket The bucket to pop from.
+     * @param [in] bucket The bucket to pop from.
      */
     void (*Pop)(Bucket&);
     /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/callback.cc ns-3.44/src/core/model/callback.cc
--- ns-3.43/src/core/model/callback.cc	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/callback.cc	2025-03-09 16:55:49.355371000 -0700
@@ -11,8 +11,8 @@
 #include "log.h"
 
 /**
- * \file
- * \ingroup callback
+ * @file
+ * @ingroup callback
  * ns3::CallbackValue implementation.
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/callback.h ns-3.44/src/core/model/callback.h
--- ns-3.43/src/core/model/callback.h	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/callback.h	2025-03-09 16:55:49.355371000 -0700
@@ -24,8 +24,8 @@
 #include <vector>
 
 /**
- * \file
- * \ingroup callback
+ * @file
+ * @ingroup callback
  * Declaration of the various callback functions.
  */
 
@@ -36,26 +36,26 @@
 // since the implementations are interleaved.
 
 /**
- * \ingroup core
- * \defgroup callback Callbacks
- * \brief Wrap functions, objects, and arguments into self contained callbacks.
+ * @ingroup core
+ * @defgroup callback Callbacks
+ * @brief Wrap functions, objects, and arguments into self contained callbacks.
  *
  * Wrapped callbacks are at the heart of scheduling events in the
  * simulator.
  */
 /**
- * \ingroup callback
- * \defgroup callbackimpl Callback Implementation
+ * @ingroup callback
+ * @defgroup callbackimpl Callback Implementation
  * Callback implementation classes
  */
 /**
- * \ingroup callbackimpl
- * \defgroup makeboundcallback MakeBoundCallback from functions bound with up to three arguments.
+ * @ingroup callbackimpl
+ * @defgroup makeboundcallback MakeBoundCallback from functions bound with up to three arguments.
  *
  * Build bound Callbacks which take varying numbers of arguments,
  * and potentially returning a value.
  *
- * \internal
+ * @internal
  *
  * The following is experimental code. It works but we have
  * not yet determined whether or not it is really useful and whether
@@ -63,7 +63,7 @@
  */
 
 /**
- * \ingroup callbackimpl
+ * @ingroup callbackimpl
  * Abstract base class for CallbackImpl
  * Provides reference counting and equality test.
  */
@@ -78,13 +78,13 @@
     /**
      * Equality test
      *
-     * \param [in] other Callback Ptr
-     * \return \c true if we are equal
+     * @param [in] other Callback Ptr
+     * @return \c true if we are equal
      */
     virtual bool IsEqual(Ptr<const CallbackImplBase> other) const = 0;
     /**
      * Get the name of this object type.
-     * \return The object type as a string.
+     * @return The object type as a string.
      */
     virtual std::string GetTypeid() const = 0;
 
@@ -92,8 +92,8 @@
     /**
      * Helper to get the C++ typeid as a string.
      *
-     * \tparam T \explicit The type of the argument.
-     * \returns The result of applying typeid to the template type \pname{T}.
+     * @tparam T \explicit The type of the argument.
+     * @returns The result of applying typeid to the template type \pname{T}.
      */
     template <typename T>
     static std::string GetCppTypeid()
@@ -113,7 +113,7 @@
 };
 
 /**
- * \ingroup callbackimpl
+ * @ingroup callbackimpl
  * Abstract base class for CallbackComponent.
  * Provides equality test.
  */
@@ -128,20 +128,20 @@
     /**
      * Equality test
      *
-     * \param [in] other CallbackComponent Ptr
-     * \return \c true if we are equal
+     * @param [in] other CallbackComponent Ptr
+     * @return \c true if we are equal
      */
     virtual bool IsEqual(std::shared_ptr<const CallbackComponentBase> other) const = 0;
 };
 
 /**
- * \ingroup callbackimpl
+ * @ingroup callbackimpl
  * Stores a component of a callback, i.e., the callable object
  * or a bound argument. The purpose of this class is to test
  * the equality of the components of two callbacks.
  *
- * \tparam T The type of the callback component.
- * \tparam isComparable whether this callback component can be compared to others of the same type
+ * @tparam T The type of the callback component.
+ * @tparam isComparable whether this callback component can be compared to others of the same type
  */
 template <typename T, bool isComparable = true>
 class CallbackComponent : public CallbackComponentBase
@@ -150,7 +150,7 @@
     /**
      * Constructor
      *
-     * \param [in] t The value of the callback component
+     * @param [in] t The value of the callback component
      */
     CallbackComponent(const T& t)
         : m_comp(t)
@@ -160,8 +160,8 @@
     /**
      * Equality test between the values of two components
      *
-     * \param [in] other CallbackComponentBase Ptr
-     * \return \c true if we are equal
+     * @param [in] other CallbackComponentBase Ptr
+     * @return \c true if we are equal
      */
     bool IsEqual(std::shared_ptr<const CallbackComponentBase> other) const override
     {
@@ -176,7 +176,7 @@
 };
 
 /**
- * \ingroup callbackimpl
+ * @ingroup callbackimpl
  * Partial specialization of class CallbackComponent with isComparable equal
  * to false. This is required to handle callable objects (such as lambdas and
  * objects returned by std::function and std::bind) that do not provide the
@@ -184,7 +184,7 @@
  * purpose of the class CallbackComponent is to compare values, no object is
  * stored in this specialized class.
  *
- * \tparam T The type of the callback component.
+ * @tparam T The type of the callback component.
  */
 template <typename T>
 class CallbackComponent<T, false> : public CallbackComponentBase
@@ -193,7 +193,7 @@
     /**
      * Constructor
      *
-     * \param [in] t The value of the callback component
+     * @param [in] t The value of the callback component
      */
     CallbackComponent(const T& t)
     {
@@ -202,8 +202,8 @@
     /**
      * Equality test between functions
      *
-     * \param [in] other CallbackParam Ptr
-     * \return \c true if we are equal
+     * @param [in] other CallbackParam Ptr
+     * @return \c true if we are equal
      */
     bool IsEqual(std::shared_ptr<const CallbackComponentBase> other) const override
     {
@@ -215,11 +215,11 @@
 typedef std::vector<std::shared_ptr<CallbackComponentBase>> CallbackComponentVector;
 
 /**
- * \ingroup callbackimpl
+ * @ingroup callbackimpl
  * CallbackImpl class with varying numbers of argument types
  *
- * \tparam R \explicit The return type of the Callback.
- * \tparam UArgs \explicit The types of any arguments to the Callback.
+ * @tparam R \explicit The return type of the Callback.
+ * @tparam UArgs \explicit The types of any arguments to the Callback.
  */
 template <typename R, typename... UArgs>
 class CallbackImpl : public CallbackImplBase
@@ -228,8 +228,8 @@
     /**
      * Constructor.
      *
-     * \param func the callable object
-     * \param components the callback components (callable object and bound arguments)
+     * @param func the callable object
+     * @param components the callback components (callable object and bound arguments)
      */
     CallbackImpl(std::function<R(UArgs...)> func, const CallbackComponentVector& components)
         : m_func(func),
@@ -239,7 +239,7 @@
 
     /**
      * Get the stored function.
-     * \return A const reference to the stored function.
+     * @return A const reference to the stored function.
      */
     const std::function<R(UArgs...)>& GetFunction() const
     {
@@ -248,7 +248,7 @@
 
     /**
      * Get the vector of callback components.
-     * \return A const reference to the vector of callback components.
+     * @return A const reference to the vector of callback components.
      */
     const CallbackComponentVector& GetComponents() const
     {
@@ -258,8 +258,8 @@
     /**
      * Function call operator.
      *
-     * \param uargs The arguments to the Callback.
-     * \return Callback value
+     * @param uargs The arguments to the Callback.
+     * @return Callback value
      */
     R operator()(UArgs... uargs) const
     {
@@ -308,7 +308,7 @@
         return DoGetTypeid();
     }
 
-    /** \copydoc GetTypeid() */
+    /** @copydoc GetTypeid() */
     static std::string DoGetTypeid()
     {
         static std::vector<std::string> vec = {GetCppTypeid<R>(), GetCppTypeid<UArgs>()...};
@@ -336,7 +336,7 @@
 };
 
 /**
- * \ingroup callbackimpl
+ * @ingroup callbackimpl
  * Base class for Callback class.
  * Provides pimpl abstraction.
  */
@@ -348,7 +348,7 @@
     {
     }
 
-    /** \return The impl pointer */
+    /** @return The impl pointer */
     Ptr<CallbackImplBase> GetImpl() const
     {
         return m_impl;
@@ -357,7 +357,7 @@
   protected:
     /**
      * Construct from a pimpl
-     * \param [in] impl The CallbackImplBase Ptr
+     * @param [in] impl The CallbackImplBase Ptr
      */
     CallbackBase(Ptr<CallbackImplBase> impl)
         : m_impl(impl)
@@ -368,8 +368,8 @@
 };
 
 /**
- * \ingroup callback
- * \brief Callback template class
+ * @ingroup callback
+ * @brief Callback template class
  *
  * This class template implements the Functor Design Pattern.
  * It is used to declare the type of a Callback:
@@ -386,9 +386,9 @@
  *
  * Sample code which shows how to use this class template
  * as well as the function templates \ref MakeCallback :
- * \include src/core/examples/main-callback.cc
+ * @include src/core/examples/main-callback.cc
  *
- * \internal
+ * @internal
  * This code was originally written based on the techniques
  * described in http://www.codeproject.com/cpp/TTLFunction.asp
  * It was subsequently rewritten to follow the architecture
@@ -412,10 +412,10 @@
  * and relies on a reference list rather than autoPtr to hold
  * the pointer.
  *
- * \see attribute_Callback
+ * @see attribute_Callback
  *
- * \tparam R \explicit The return type of the Callback.
- * \tparam UArgs \explicit The types of any arguments to the Callback.
+ * @tparam R \explicit The return type of the Callback.
+ * @tparam UArgs \explicit The types of any arguments to the Callback.
  */
 template <typename R, typename... UArgs>
 class Callback : public CallbackBase
@@ -431,7 +431,7 @@
     /**
      * Construct from a CallbackImpl pointer
      *
-     * \param [in] impl The CallbackImpl Ptr
+     * @param [in] impl The CallbackImpl Ptr
      */
     Callback(const Ptr<CallbackImpl<R, UArgs...>>& impl)
         : CallbackBase(impl)
@@ -441,9 +441,9 @@
     /**
      * Construct from another callback and bind some arguments (if any)
      *
-     * \tparam BArgs \deduced The types of the bound arguments
-     * \param [in] cb The existing callback
-     * \param [in] bargs The values of the bound arguments
+     * @tparam BArgs \deduced The types of the bound arguments
+     * @param [in] cb The existing callback
+     * @param [in] bargs The values of the bound arguments
      */
     template <typename... BArgs>
     Callback(const Callback<R, BArgs..., UArgs...>& cb, BArgs... bargs)
@@ -464,12 +464,12 @@
     /**
      * Construct from a function and bind some arguments (if any)
      *
-     * \tparam T \deduced The type of the function
-     * \tparam BArgs \deduced The types of the bound arguments
-     * \param [in] func The function
-     * \param [in] bargs The values of the bound arguments
+     * @tparam T \deduced The type of the function
+     * @tparam BArgs \deduced The types of the bound arguments
+     * @param [in] func The function
+     * @param [in] bargs The values of the bound arguments
      *
-     * \internal
+     * @internal
      * We leverage SFINAE to have the compiler discard this constructor when the type
      * of the first argument is a class derived from CallbackBase (i.e., a Callback).
      */
@@ -503,12 +503,12 @@
     /**
      * Implementation of the Bind method
      *
-     * \tparam BoundArgs The types of the arguments to bind
-     * \param [in] seq A compile-time integer sequence
-     * \param [in] bargs The values of the arguments to bind
-     * \return The bound callback
+     * @tparam BoundArgs The types of the arguments to bind
+     * @param [in] seq A compile-time integer sequence
+     * @param [in] bargs The values of the arguments to bind
+     * @return The bound callback
      *
-     * \internal
+     * @internal
      * The integer sequence is 0..N-1, where N is the number of arguments left unbound.
      */
     template <std::size_t... INDEX, typename... BoundArgs>
@@ -535,9 +535,9 @@
     /**
      * Bind a variable number of arguments
      *
-     * \tparam BoundArgs \deduced The types of the arguments to bind
-     * \param [in] bargs The values of the arguments to bind
-     * \return The bound callback
+     * @tparam BoundArgs \deduced The types of the arguments to bind
+     * @param [in] bargs The values of the arguments to bind
+     * @return The bound callback
      */
     template <typename... BoundArgs>
     auto Bind(BoundArgs&&... bargs)
@@ -550,7 +550,7 @@
     /**
      * Check for null implementation
      *
-     * \return \c true if I don't have an implementation
+     * @return \c true if I don't have an implementation
      */
     bool IsNull() const
     {
@@ -566,8 +566,8 @@
     /**
      * Functor with varying numbers of arguments
      *
-     * \param uargs The arguments to the callback
-     * \return Callback value
+     * @param uargs The arguments to the callback
+     * @return Callback value
      */
     R operator()(UArgs... uargs) const
     {
@@ -577,8 +577,8 @@
     /**
      * Equality test.
      *
-     * \param [in] other Callback
-     * \return \c true if we are equal
+     * @param [in] other Callback
+     * @return \c true if we are equal
      */
     bool IsEqual(const CallbackBase& other) const
     {
@@ -588,8 +588,8 @@
     /**
      * Check for compatible types
      *
-     * \param [in] other Callback Ptr
-     * \return \c true if other can be dynamic_cast to my type
+     * @param [in] other Callback Ptr
+     * @return \c true if other can be dynamic_cast to my type
      */
     bool CheckType(const CallbackBase& other) const
     {
@@ -599,8 +599,8 @@
     /**
      * Adopt the other's implementation, if type compatible
      *
-     * \param [in] other Callback
-     * \returns \c true if \pname{other} was type-compatible and could be adopted.
+     * @param [in] other Callback
+     * @returns \c true if \pname{other} was type-compatible and could be adopted.
      */
     bool Assign(const CallbackBase& other)
     {
@@ -620,7 +620,7 @@
     }
 
   private:
-    /** \return The pimpl pointer */
+    /** @return The pimpl pointer */
     CallbackImpl<R, UArgs...>* DoPeekImpl() const
     {
         return static_cast<CallbackImpl<R, UArgs...>*>(PeekPointer(m_impl));
@@ -629,8 +629,8 @@
     /**
      * Check for compatible types
      *
-     * \param [in] other Callback Ptr
-     * \return \c true if other can be dynamic_cast to my type
+     * @param [in] other Callback Ptr
+     * @return \c true if other can be dynamic_cast to my type
      */
     bool DoCheckType(Ptr<const CallbackImplBase> other) const
     {
@@ -646,12 +646,12 @@
 /**
  * Inequality test.
  *
- * \tparam R \explicit The return type of the Callbacks
- * \tparam UArgs \explicit The types of any arguments to the Callbacks
- * \param [in] a Callback
- * \param [in] b Callback
+ * @tparam R \explicit The return type of the Callbacks
+ * @tparam UArgs \explicit The types of any arguments to the Callbacks
+ * @param [in] a Callback
+ * @param [in] b Callback
  *
- * \return \c true if the Callbacks are not equal
+ * @return \c true if the Callbacks are not equal
  */
 template <typename R, typename... Args>
 bool
@@ -667,14 +667,14 @@
  * Build Callbacks for class method members which take varying numbers
  * of arguments and potentially returning a value.
  *
- * \tparam T   \deduced Type of the class having the member function.
- * \tparam OBJ \deduced Type of the class instance.
- * \tparam R   \deduced Return type of the callback.
- * \tparam Args \deduced Type list of any arguments to the member function.
- *
- * \param [in] memPtr Class method member pointer
- * \param [in] objPtr Class instance
- * \return A wrapper Callback
+ * @tparam T   \deduced Type of the class having the member function.
+ * @tparam OBJ \deduced Type of the class instance.
+ * @tparam R   \deduced Return type of the callback.
+ * @tparam Args \deduced Type list of any arguments to the member function.
+ *
+ * @param [in] memPtr Class method member pointer
+ * @param [in] objPtr Class instance
+ * @return A wrapper Callback
  *
  * Build Callbacks for class method members which take varying numbers of arguments
  * and potentially returning a value.
@@ -696,11 +696,11 @@
 /**@}*/
 
 /**
- * \ingroup callback
- * \tparam R   \deduced Return type of the callback function..
- * \tparam Args  \deduced Type list of any arguments to the member function.
- * \param [in] fnPtr Function pointer
- * \return A wrapper Callback
+ * @ingroup callback
+ * @tparam R   \deduced Return type of the callback function..
+ * @tparam Args  \deduced Type list of any arguments to the member function.
+ * @param [in] fnPtr Function pointer
+ * @return A wrapper Callback
  *
  * Build Callbacks for functions which take varying numbers of arguments
  * and potentially returning a value.
@@ -713,10 +713,10 @@
 }
 
 /**
- * \ingroup callback
- * \tparam R   \deduced Return type of the callback function..
- * \tparam Args  \deduced Type list of any arguments to the member function.
- * \return A wrapper Callback
+ * @ingroup callback
+ * @tparam R   \deduced Return type of the callback function..
+ * @tparam Args  \deduced Type list of any arguments to the member function.
+ * @return A wrapper Callback
  *
  * Build null Callbacks which take no arguments,
  * for varying number of template arguments,
@@ -730,15 +730,15 @@
 }
 
 /**
- * \ingroup makeboundcallback
+ * @ingroup makeboundcallback
  * @{
  * Make Callbacks with varying number of bound arguments.
- * \tparam R   \deduced Return type of the callback function..
- * \tparam Args \deduced Type list of any arguments to the member function.
- * \tparam BArgs \deduced Type list of bound arguments.
- * \param [in] fnPtr Function pointer
- * \param [in] bargs Bound arguments
- * \return A bound Callback
+ * @tparam R   \deduced Return type of the callback function..
+ * @tparam Args \deduced Type list of any arguments to the member function.
+ * @tparam BArgs \deduced Type list of bound arguments.
+ * @param [in] fnPtr Function pointer
+ * @param [in] bargs Bound arguments
+ * @return A bound Callback
  */
 template <typename R, typename... Args, typename... BArgs>
 auto
@@ -748,15 +748,15 @@
 }
 
 /**
- * \tparam T   \deduced Type of the class having the member function.
- * \tparam OBJ \deduced Type of the class instance.
- * \tparam R   \deduced Return type of the callback.
- * \tparam Args \deduced Type list of any arguments to the member function.
- * \tparam BArgs \deduced Type list of bound arguments.
- * \param [in] memPtr Class method member pointer
- * \param [in] objPtr Class instance
- * \param [in] bargs Bound arguments
- * \return A wrapper Callback
+ * @tparam T   \deduced Type of the class having the member function.
+ * @tparam OBJ \deduced Type of the class instance.
+ * @tparam R   \deduced Return type of the callback.
+ * @tparam Args \deduced Type list of any arguments to the member function.
+ * @tparam BArgs \deduced Type list of bound arguments.
+ * @param [in] memPtr Class method member pointer
+ * @param [in] objPtr Class instance
+ * @param [in] bargs Bound arguments
+ * @return A wrapper Callback
  *
  * Build Callbacks for class method members which take varying numbers of arguments
  * and potentially returning a value.
@@ -793,20 +793,20 @@
     CallbackBase Get();
     template <typename T>
     bool GetAccessor(T& value) const;
-    /** \return A copy of this CallBack */
+    /** @return A copy of this CallBack */
     Ptr<AttributeValue> Copy() const override;
     /**
      * Serialize to string
-     * \param [in] checker The checker to validate with
-     * \return Serialized form of this Callback.
+     * @param [in] checker The checker to validate with
+     * @return Serialized form of this Callback.
      */
     std::string SerializeToString(Ptr<const AttributeChecker> checker) const override;
     /**
      * Deserialize from string (not implemented)
      *
-     * \param [in] value Source string
-     * \param [in] checker Checker to validate with
-     * \return \c true if successful
+     * @param [in] value Source string
+     * @param [in] checker Checker to validate with
+     * @return \c true if successful
      */
     bool DeserializeFromString(std::string value, Ptr<const AttributeChecker> checker) override;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/command-line.cc ns-3.44/src/core/model/command-line.cc
--- ns-3.43/src/core/model/command-line.cc	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/command-line.cc	2025-03-09 16:55:49.355371000 -0700
@@ -30,8 +30,8 @@
 #include <sstream>
 
 /**
- * \file
- * \ingroup commandline
+ * @file
+ * @ingroup commandline
  * ns3::CommandLine implementation.
  */
 
@@ -43,8 +43,8 @@
  * Usage and help strings, which are intended for text-only display,
  * can contain illegal characters for HTML.  This function
  * encodes '&', '\"', '\'',  and '<'.
- * \param [in] source The original string.
- * \returns The HTML-encoded version.
+ * @param [in] source The original string.
+ * @returns The HTML-encoded version.
  */
 std::string
 Encode(const std::string& source)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/command-line.h ns-3.44/src/core/model/command-line.h
--- ns-3.43/src/core/model/command-line.h	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/command-line.h	2025-03-09 16:55:49.355371000 -0700
@@ -19,8 +19,8 @@
 #include <vector>
 
 /**
- * \file
- * \ingroup commandline
+ * @file
+ * @ingroup commandline
  * ns3::CommandLine declaration.
  */
 
@@ -28,8 +28,8 @@
 {
 
 /**
- * \ingroup core
- * \defgroup commandline Command Line Parsing
+ * @ingroup core
+ * @defgroup commandline Command Line Parsing
  *
  * A uniform way to specify program documentation,
  * allowed command line arguments and help strings,
@@ -40,8 +40,8 @@
  */
 
 /**
- * \ingroup commandline
- * \brief Parse command-line arguments
+ * @ingroup commandline
+ * @brief Parse command-line arguments
  *
  * Instances of this class can be used to parse command-line
  * arguments.  Programs can register a general usage message with
@@ -51,7 +51,7 @@
  * can be accomplished by providing a Callback.
  *
  * CommandLine also provides handlers for these standard arguments:
- * \verbatim
+ * @verbatim
    --PrintGlobals:              Print the list of globals.
    --PrintGroups:               Print the list of groups.
    --PrintGroup=[group]:        Print all TypeIds of group.
@@ -76,12 +76,12 @@
  * argument name.
  *
  * In use, arguments are given in the form
- * \verbatim
+ * @verbatim
    --arg=value --toggle first-non-option\endverbatim
  * Most arguments expect a value, as in the first form, \c \--arg=value.
  * Toggles, corresponding to boolean arguments, can be given in any of
  * the forms
- * \verbatim
+ * @verbatim
    --toggle1 --toggle2=1 --toggle3=t --toggle4=true \endverbatim
  * The first form changes the state of toggle1 from its default;
  * all the rest set the corresponding boolean variable to true.
@@ -92,7 +92,7 @@
  *
  * Option arguments can be repeated on the command line; the last value given
  * will be the final value used.  For example,
- * \verbatim
+ * @verbatim
    --arg=one --toggle=f --arg=another --toggle \endverbatim
  * The variable set by \c \--arg will end up with the value \c "another";
  * the boolean set by \c \--toggle will end up as \c true.
@@ -105,19 +105,19 @@
  *
  * CommandLine can set the initial value of every attribute in the system
  * with the \c \--TypeIdName::AttributeName=value syntax, for example
- * \verbatim
+ * @verbatim
    --Application::StartTime=3s \endverbatim
  * In some cases you may want to highlight the use of a particular
  * attribute for a simulation script.  For example, you might want
  * to make it easy to set the \c Application::StartTime using
  * the argument \c \--start, and have its help string show as part
  * of the help message.  This can be done using the
- * \link AddValue(const std::string&, const std::string&) AddValue (name, attributePath) \endlink
+ * @link AddValue(const std::string&, const std::string&) AddValue (name, attributePath) \endlink
  * method.
  *
  * CommandLine can also set the value of every GlobalValue
  * in the system with the \c \--GlobalValueName=value syntax, for example
- * \verbatim
+ * @verbatim
    --SchedulerType=HeapScheduler \endverbatim
  *
  * A simple example of CommandLine is in `src/core/example/``command-line-example.cc`
@@ -125,7 +125,7 @@
  *
  * The heart of that example is this code:
  *
- * \code
+ * @code
  *    int         intArg  = 1;
  *    bool        boolArg = false;
  *    std::string strArg  = "strArg default";
@@ -140,13 +140,13 @@
  *    cmd.AddValue ("anti",    "ns3::RandomVariableStream::Antithetic");
  *    cmd.AddValue ("cbArg",   "a string via callback", MakeCallback (SetCbArg));
  *    cmd.Parse (argc, argv);
- * \endcode
+ * @endcode
  * after which it prints the values of each variable.  (The \c SetCbArg function
  * is not shown here; see `src/core/example/``command-line-example.cc`)
  *
  * Here is the output from a few runs of that program:
  *
- * \verbatim
+ * @verbatim
    $ ./ns3 run "command-line-example"
    intArg:   1
    boolArg:  false
@@ -189,7 +189,7 @@
  * incompatible.  Suggested best practice is to supply an error message
  * and the complete usage message.  For example,
  *
- * \code
+ * @code
  *   int value1;
  *   int value2;
  *
@@ -206,14 +206,14 @@
  *       std::cerr << cmd;
  *       exit (-1);
  *     }
- * \endcode
+ * @endcode
  *
  * Finally, note that for examples which will be run by \c test.py
  * the preferred declaration of a CommandLine instance is
  *
- * \code
+ * @code
  *     CommandLine cmd (__FILE__);
- * \endcode
+ * @endcode
  * This will ensure that the program usage and arguments can be added to
  * the Doxygen documentation automatically.
  */
@@ -230,20 +230,20 @@
      * This form is required to generate Doxygen documentation of the
      * arguments and options.
      *
-     * \param [in] filename The source file name.
+     * @param [in] filename The source file name.
      */
     CommandLine(const std::string& filename);
     /**
      * Copy constructor
      *
-     * \param [in] cmd The CommandLine to copy from
+     * @param [in] cmd The CommandLine to copy from
      */
     CommandLine(const CommandLine& cmd);
     /**
      * Assignment
      *
-     * \param [in] cmd The CommandLine to assign from
-     * \return The CommandLine
+     * @param [in] cmd The CommandLine to assign from
+     * @return The CommandLine
      */
     CommandLine& operator=(const CommandLine& cmd);
     /** Destructor */
@@ -252,16 +252,16 @@
     /**
      * Supply the program usage and documentation.
      *
-     * \param [in] usage Program usage message to write with \c \--help.
+     * @param [in] usage Program usage message to write with \c \--help.
      */
     void Usage(const std::string& usage);
 
     /**
      * Add a program argument, assigning to POD
      *
-     * \param [in] name The name of the program-supplied argument
-     * \param [in] help The help text used by \c \--PrintHelp
-     * \param [out] value A reference to the variable where the
+     * @param [in] name The name of the program-supplied argument
+     * @param [in] help The help text used by \c \--PrintHelp
+     * @param [out] value A reference to the variable where the
      *        value parsed will be stored (if no value
      *        is parsed, this variable is not modified).
      */
@@ -278,14 +278,14 @@
      * and have a maximum length of \c (num - 1).
      * The result will be truncated to fit, if necessary.
      *
-     * \param [in] name The name of the program-supplied argument
-     * \param [in] help The help text used by \c \--PrintHelp
-     * \param [out] value A pointer pointing to the beginning
+     * @param [in] name The name of the program-supplied argument
+     * @param [in] help The help text used by \c \--PrintHelp
+     * @param [out] value A pointer pointing to the beginning
      *        of a null-terminated C string buffer provided by
      *        the caller. The parsed value will be stored in
      *        that buffer (if no value is parsed, this
      *        variable is not modified).
-     * \param num The size of the buffer pointed to by \c value,
+     * @param num The size of the buffer pointed to by \c value,
      *        including any terminating null.
      */
     void AddValue(const std::string& name, const std::string& help, char* value, std::size_t num);
@@ -293,18 +293,18 @@
      * Callback function signature for
      * AddValue(const std::string&,const std::string&,Callback<bool,const std::string>).
      *
-     * \param [in] value The argument value.
+     * @param [in] value The argument value.
      */
     typedef bool (*Callback)(const std::string& value);
 
     /**
      * Add a program argument, using a Callback to parse the value
      *
-     * \param [in] name The name of the program-supplied argument
-     * \param [in] help The help text used by \c \--help
-     * \param [in] callback A Callback function that will be invoked to parse and
+     * @param [in] name The name of the program-supplied argument
+     * @param [in] help The help text used by \c \--help
+     * @param [in] callback A Callback function that will be invoked to parse and
      *   store the value.
-     * \param [in] defaultValue Optional default value for argument.
+     * @param [in] defaultValue Optional default value for argument.
      *
      * The callback should have the signature
      * CommandLine::Callback
@@ -317,17 +317,17 @@
     /**
      * Add a program argument as a shorthand for an Attribute.
      *
-     * \param [in] name The name of the program-supplied argument.
-     * \param [out] attributePath The fully-qualified name of the Attribute
+     * @param [in] name The name of the program-supplied argument.
+     * @param [out] attributePath The fully-qualified name of the Attribute
      */
     void AddValue(const std::string& name, const std::string& attributePath);
 
     /**
      * Add a non-option argument, assigning to POD
      *
-     * \param [in] name The name of the program-supplied argument
-     * \param [in] help The help text used by \c \--PrintHelp
-     * \param [out] value A reference to the variable where the
+     * @param [in] name The name of the program-supplied argument
+     * @param [in] help The help text used by \c \--PrintHelp
+     * @param [out] value A reference to the variable where the
      *        value parsed will be stored (if no value
      *        is parsed, this variable is not modified).
      */
@@ -341,8 +341,8 @@
      *
      * This is only valid after calling Parse().
      *
-     * \param [in] i The index of the non-option argument to return.
-     * \return The i'th non-option argument, as a string.
+     * @param [in] i The index of the non-option argument to return.
+     * @return The i'th non-option argument, as a string.
      */
     std::string GetExtraNonOption(std::size_t i) const;
 
@@ -353,16 +353,16 @@
      *
      * This is only valid after calling Parse().
      *
-     * \returns the number of non-option arguments found.
+     * @returns the number of non-option arguments found.
      */
     std::size_t GetNExtraNonOptions() const;
 
     /**
      * Parse the program arguments
      *
-     * \param [in] argc The 'argc' variable: number of arguments (including the
+     * @param [in] argc The 'argc' variable: number of arguments (including the
      *        main program name as first element).
-     * \param [in] argv The 'argv' variable: a null-terminated array of strings,
+     * @param [in] argv The 'argv' variable: a null-terminated array of strings,
      *        each of which identifies a command-line argument.
      *
      * Obviously, this method will parse the input command-line arguments and
@@ -380,39 +380,39 @@
      * programmatically.  Other than the type of argument this behaves
      * identically to Parse(int, char *)
      *
-     * \param [in] args The vector of arguments.
+     * @param [in] args The vector of arguments.
      */
     void Parse(std::vector<std::string> args);
 
     /**
      * Get the program name
      *
-     * \return The program name.  Only valid after calling Parse()
+     * @return The program name.  Only valid after calling Parse()
      */
     std::string GetName() const;
 
     /**
-     * \brief Print program usage to the desired output stream
+     * @brief Print program usage to the desired output stream
      *
      * Handler for \c \--PrintHelp and \c \--help:  print Usage(), argument names, and help strings
      *
      * Alternatively, an overloaded operator << can be used:
-     * \code
+     * @code
      *       CommandLine cmd (__FILE__);
      *       cmd.Parse (argc, argv);
      *     ...
      *
      *       std::cerr << cmd;
-     * \endcode
+     * @endcode
      *
-     * \param [in,out] os The output stream to print on.
+     * @param [in,out] os The output stream to print on.
      */
     void PrintHelp(std::ostream& os) const;
 
     /**
      * Get the program version.
      *
-     * \return The program version
+     * @return The program version
      */
     std::string GetVersion() const;
 
@@ -421,14 +421,14 @@
      *
      * Handler for \c \--PrintVersion and \c \--version.
      *
-     * \param [in,out] os The output stream to print on.
+     * @param [in,out] os The output stream to print on.
      */
     void PrintVersion(std::ostream& os) const;
 
   private:
     /**
-     * \ingroup commandline
-     * \brief The argument abstract base class
+     * @ingroup commandline
+     * @brief The argument abstract base class
      */
     class Item
     {
@@ -439,23 +439,23 @@
         /**
          * Parse from a string.
          *
-         * \param [in] value The string representation
-         * \return \c true if parsing the value succeeded
+         * @param [in] value The string representation
+         * @return \c true if parsing the value succeeded
          */
         virtual bool Parse(const std::string& value) const = 0;
         /**
-         * \return \c true if this item has a default value.
+         * @return \c true if this item has a default value.
          */
         virtual bool HasDefault() const;
         /**
-         * \return The default value
+         * @return The default value
          */
         virtual std::string GetDefault() const = 0;
     }; // class Item
 
     /**
-     * \ingroup commandline
-     * \brief An argument Item assigning to POD
+     * @ingroup commandline
+     * @brief An argument Item assigning to POD
      */
     template <typename T>
     class UserItem : public Item
@@ -471,8 +471,8 @@
     };                         // class UserItem
 
     /**
-     * \ingroup commandline
-     * \brief Extension of Item for extra non-options, stored as strings.
+     * @ingroup commandline
+     * @brief Extension of Item for extra non-options, stored as strings.
      */
     class StringItem : public Item
     {
@@ -484,15 +484,15 @@
 
         /**
          * The argument value.
-         * \internal This has to be \c mutable because the Parse()
+         * @internal This has to be \c mutable because the Parse()
          * function is \c const in the base class Item.
          */
         mutable std::string m_value;
     }; // class StringItem
 
     /**
-     * \ingroup commandline
-     * \brief Extension of Item for \c char*.
+     * @ingroup commandline
+     * @brief Extension of Item for \c char*.
      */
     class CharStarItem : public Item
     {
@@ -511,8 +511,8 @@
     }; // class CharStarItem
 
     /**
-     * \ingroup commandline
-     * \brief An argument Item using a Callback to parse the input
+     * @ingroup commandline
+     * @brief An argument Item using a Callback to parse the input
      */
     class CallbackItem : public Item
     {
@@ -540,8 +540,8 @@
     /**
      * Strip leading `--` or `-` from options.
      *
-     * \param [in] param Option name to search
-     * \returns \c false if none found, indicating this is a non-option.
+     * @param [in] param Option name to search
+     * @returns \c false if none found, indicating this is a non-option.
      */
     HasOptionName GetOptionName(const std::string& param) const;
     /**
@@ -549,23 +549,23 @@
      *
      * \note: if any hard-coded options are found this function exits.
      *
-     * \param [in] args Vector of hard-coded options to handle.
+     * @param [in] args Vector of hard-coded options to handle.
      */
     void HandleHardOptions(const std::vector<std::string>& args) const;
 
     /**
      * Handle an option in the form \c param=value.
      *
-     * \param [in] param The option string.
-     * \returns \c true if this was really an option.
+     * @param [in] param The option string.
+     * @returns \c true if this was really an option.
      */
     bool HandleOption(const std::string& param) const;
 
     /**
      * Handle a non-option
      *
-     * \param [in] value The command line non-option value.
-     * \return \c true if \c value could be parsed correctly.
+     * @param [in] value The command line non-option value.
+     * @return \c true if \c value could be parsed correctly.
      */
     bool HandleNonOption(const std::string& value);
 
@@ -573,64 +573,64 @@
      * Match name against the program or general arguments,
      * and dispatch to the appropriate handler.
      *
-     * \param [in] name The argument name
-     * \param [in] value The command line value
-     * \returns \c true if the argument was handled successfully
+     * @param [in] name The argument name
+     * @param [in] value The command line value
+     * @returns \c true if the argument was handled successfully
      */
     bool HandleArgument(const std::string& name, const std::string& value) const;
     /**
      * Callback function to handle attributes.
      *
-     * \param [in] name The full name of the Attribute.
-     * \param [in] value The value to assign to \pname{name}.
-     * \return \c true if the value was set successfully, false otherwise.
+     * @param [in] name The full name of the Attribute.
+     * @param [in] value The value to assign to \pname{name}.
+     * @return \c true if the value was set successfully, false otherwise.
      */
     static bool HandleAttribute(const std::string& name, const std::string& value);
 
     /**
      * Handler for \c \--PrintGlobals:  print all global variables and values
-     * \param [in,out] os The output stream to print on.
+     * @param [in,out] os The output stream to print on.
      */
     void PrintGlobals(std::ostream& os) const;
     /**
      * Handler for \c \--PrintAttributes:  print the attributes for a given type
      * as well as its parents.
      *
-     * \param [in,out] os the output stream.
-     * \param [in] type The type name whose Attributes should be displayed,
+     * @param [in,out] os the output stream.
+     * @param [in] type The type name whose Attributes should be displayed,
      */
     void PrintAttributes(std::ostream& os, const std::string& type) const;
     /**
      * Print the Attributes for a single type.
      *
-     * \param [in,out] os the output stream.
-     * \param [in] tid The TypeId whose Attributes should be displayed,
-     * \param [in] header A header line to print if \c tid has Attributes
+     * @param [in,out] os the output stream.
+     * @param [in] tid The TypeId whose Attributes should be displayed,
+     * @param [in] header A header line to print if \c tid has Attributes
      */
     void PrintAttributeList(std::ostream& os, const TypeId tid, std::stringstream& header) const;
     /**
      * Handler for \c \--PrintGroup:  print all types belonging to a given group.
      *
-     * \param [in,out] os The output stream.
-     * \param [in] group The name of the TypeId group to display
+     * @param [in,out] os The output stream.
+     * @param [in] group The name of the TypeId group to display
      */
     void PrintGroup(std::ostream& os, const std::string& group) const;
     /**
      * Handler for \c \--PrintTypeIds:  print all TypeId names.
      *
-     * \param [in,out] os The output stream.
+     * @param [in,out] os The output stream.
      */
     void PrintTypeIds(std::ostream& os) const;
     /**
      * Handler for \c \--PrintGroups:  print all TypeId group names
      *
-     * \param [in,out] os The output stream.
+     * @param [in,out] os The output stream.
      */
     void PrintGroups(std::ostream& os) const;
     /**
      * Copy constructor implementation
      *
-     * \param [in] cmd CommandLine to copy
+     * @param [in] cmd CommandLine to copy
      */
     void Copy(const CommandLine& cmd);
     /** Remove all arguments, Usage(), name */
@@ -662,54 +662,54 @@
 }; // class CommandLine
 
 /**
- * \ingroup commandline
- * \defgroup commandlinehelper Helpers to specialize UserItem
+ * @ingroup commandline
+ * @defgroup commandlinehelper Helpers to specialize UserItem
  */
 /**
- * \ingroup commandlinehelper
- * \brief Helpers for CommandLine to specialize UserItem
+ * @ingroup commandlinehelper
+ * @brief Helpers for CommandLine to specialize UserItem
  */
 namespace CommandLineHelper
 {
 
 /**
- * \ingroup commandlinehelper
- * \brief Helpers to specialize CommandLine::UserItem::Parse()
+ * @ingroup commandlinehelper
+ * @brief Helpers to specialize CommandLine::UserItem::Parse()
  *
- * \param [in] value The argument name
- * \param [out] dest The argument location
- * \tparam T \deduced The type being specialized
- * \return \c true if parsing was successful
+ * @param [in] value The argument name
+ * @param [out] dest The argument location
+ * @tparam T \deduced The type being specialized
+ * @return \c true if parsing was successful
  */
 template <typename T>
 bool UserItemParse(const std::string& value, T& dest);
 /**
- * \brief Specialization of CommandLine::UserItem::Parse() to \c bool
+ * @brief Specialization of CommandLine::UserItem::Parse() to \c bool
  *
- * \param [in] value The argument name
- * \param [out] dest The boolean variable to set
- * \return \c true if parsing was successful
+ * @param [in] value The argument name
+ * @param [out] dest The boolean variable to set
+ * @return \c true if parsing was successful
  */
 template <>
 bool UserItemParse<bool>(const std::string& value, bool& dest);
 /**
- * \brief Specialization of CommandLine::UserItem::Parse() to \c uint8_t
+ * @brief Specialization of CommandLine::UserItem::Parse() to \c uint8_t
  * to distinguish from \c char
  *
- * \param [in] value The argument name
- * \param [out] dest The \c uint8_t variable to set
- * \return \c true if parsing was successful
+ * @param [in] value The argument name
+ * @param [out] dest The \c uint8_t variable to set
+ * @return \c true if parsing was successful
  */
 template <>
 bool UserItemParse<uint8_t>(const std::string& value, uint8_t& dest);
 
 /**
- * \ingroup commandlinehelper
- * \brief Helper to specialize CommandLine::UserItem::GetDefault() on types
+ * @ingroup commandlinehelper
+ * @brief Helper to specialize CommandLine::UserItem::GetDefault() on types
  * needing special handling.
  *
- * \param [in] defaultValue The default value from the UserItem.
- * \return The string representation of value.
+ * @param [in] defaultValue The default value from the UserItem.
+ * @return The string representation of value.
  * @{
  */
 template <typename T>
@@ -742,7 +742,7 @@
 
     std::stringstream ss;
     ss << value;
-    ss >> item->m_default;
+    item->m_default = ss.str(); // Including white spaces
 
     m_options.push_back(item);
 }
@@ -805,20 +805,20 @@
  * Overloaded operator << to print program usage
  * (shortcut for CommandLine::PrintHelper)
  *
- * \see CommandLine::PrintHelper
+ * @see CommandLine::PrintHelper
  *
  * Example usage:
- * \code
+ * @code
  *    CommandLine cmd (__FILE__);
  *    cmd.Parse (argc, argv);
  *    ...
  *
  *    std::cerr << cmd;
- * \endcode
+ * @endcode
  *
- * \param [in,out] os The stream to print on.
- * \param [in] cmd The CommandLine describing the program.
- * \returns The stream.
+ * @param [in,out] os The stream to print on.
+ * @param [in] cmd The CommandLine describing the program.
+ * @returns The stream.
  */
 std::ostream& operator<<(std::ostream& os, const CommandLine& cmd);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/config.cc ns-3.44/src/core/model/config.cc
--- ns-3.43/src/core/model/config.cc	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/config.cc	2025-03-09 16:55:49.355371000 -0700
@@ -18,14 +18,14 @@
 #include <sstream>
 
 /**
- * \file
- * \ingroup config-impl
+ * @file
+ * @ingroup config-impl
  * ns3::Config implementations.
  */
 
 /**
- * \defgroup config-impl Config implementations
- * \ingroup config
+ * @defgroup config-impl Config implementations
+ * @ingroup config
  */
 namespace ns3
 {
@@ -188,7 +188,7 @@
 }
 
 /**
- * \ingroup config-impl
+ * @ingroup config-impl
  * Helper to test if an array entry matches a config path specification.
  */
 class ArrayMatcher
@@ -197,14 +197,14 @@
     /**
      * Construct from a Config path specification.
      *
-     * \param [in] element The Config path specification.
+     * @param [in] element The Config path specification.
      */
     ArrayMatcher(std::string element);
     /**
      * Test if a specific index matches the Config Path.
      *
-     * \param [in] i The index.
-     * \returns \c true if the index matches the Config Path.
+     * @param [in] i The index.
+     * @returns \c true if the index matches the Config Path.
      */
     bool Matches(std::size_t i) const;
 
@@ -212,9 +212,9 @@
     /**
      * Convert a string to an \c uint32_t.
      *
-     * \param [in] str The string.
-     * \param [in] value The location to store the \c uint32_t.
-     * \returns \c true if the string could be converted.
+     * @param [in] str The string.
+     * @param [in] value The location to store the \c uint32_t.
+     * @returns \c true if the string could be converted.
      */
     bool StringToUint32(std::string str, uint32_t* value) const;
     /** The Config path element. */
@@ -301,7 +301,7 @@
 }
 
 /**
- * \ingroup config-impl
+ * @ingroup config-impl
  * Abstract class to parse Config paths into object references.
  */
 class Resolver
@@ -310,7 +310,7 @@
     /**
      * Construct from a base Config path.
      *
-     * \param [in] path The Config path.
+     * @param [in] path The Config path.
      */
     Resolver(std::string path);
     /** Destructor. */
@@ -320,7 +320,7 @@
      * Parse the stored Config path into an object reference,
      * beginning at the indicated root object.
      *
-     * \param [in] root The object corresponding to the current position in
+     * @param [in] root The object corresponding to the current position in
      *                  in the Config path.
      */
     void Resolve(Ptr<Object> root);
@@ -331,35 +331,35 @@
     /**
      * Parse the next element in the Config path.
      *
-     * \param [in] path The remaining portion of the Config path.
-     * \param [in] root The object corresponding to the current position
+     * @param [in] path The remaining portion of the Config path.
+     * @param [in] root The object corresponding to the current position
      *                  in the Config path.
      */
     void DoResolve(std::string path, Ptr<Object> root);
     /**
      * Parse an index on the Config path.
      *
-     * \param [in] path The remaining Config path.
-     * \param [in,out] vector The resulting list of matching objects.
+     * @param [in] path The remaining Config path.
+     * @param [in,out] vector The resulting list of matching objects.
      */
     void DoArrayResolve(std::string path, const ObjectPtrContainerValue& vector);
     /**
      * Handle one object found on the path.
      *
-     * \param [in] object The current object on the Config path.
+     * @param [in] object The current object on the Config path.
      */
     void DoResolveOne(Ptr<Object> object);
     /**
      * Get the current Config path.
      *
-     * \returns The current Config path.
+     * @returns The current Config path.
      */
     std::string GetResolvedPath() const;
     /**
      * Handle one found object.
      *
-     * \param [in] object The found object.
-     * \param [in] path The matching Config path context.
+     * @param [in] object The found object.
+     * @param [in] path The matching Config path context.
      */
     virtual void DoOne(Ptr<Object> object, std::string path) = 0;
 
@@ -623,7 +623,7 @@
 }
 
 /**
- * \ingroup config-impl
+ * @ingroup config-impl
  * Config system implementation class.
  */
 class ConfigImpl : public Singleton<ConfigImpl>
@@ -631,38 +631,38 @@
   public:
     // Keep Set and SetFailSafe since their errors are triggered
     // by the underlying ObjectBase functions.
-    /** \copydoc ns3::Config::Set() */
+    /** @copydoc ns3::Config::Set() */
     void Set(std::string path, const AttributeValue& value);
-    /** \copydoc ns3::Config::SetFailSafe() */
+    /** @copydoc ns3::Config::SetFailSafe() */
     bool SetFailSafe(std::string path, const AttributeValue& value);
-    /** \copydoc ns3::Config::ConnectWithoutContextFailSafe() */
+    /** @copydoc ns3::Config::ConnectWithoutContextFailSafe() */
     bool ConnectWithoutContextFailSafe(std::string path, const CallbackBase& cb);
-    /** \copydoc ns3::Config::ConnectFailSafe() */
+    /** @copydoc ns3::Config::ConnectFailSafe() */
     bool ConnectFailSafe(std::string path, const CallbackBase& cb);
-    /** \copydoc ns3::Config::DisconnectWithoutContext() */
+    /** @copydoc ns3::Config::DisconnectWithoutContext() */
     void DisconnectWithoutContext(std::string path, const CallbackBase& cb);
-    /** \copydoc ns3::Config::Disconnect() */
+    /** @copydoc ns3::Config::Disconnect() */
     void Disconnect(std::string path, const CallbackBase& cb);
-    /** \copydoc ns3::Config::LookupMatches() */
+    /** @copydoc ns3::Config::LookupMatches() */
     MatchContainer LookupMatches(std::string path);
 
-    /** \copydoc ns3::Config::RegisterRootNamespaceObject() */
+    /** @copydoc ns3::Config::RegisterRootNamespaceObject() */
     void RegisterRootNamespaceObject(Ptr<Object> obj);
-    /** \copydoc ns3::Config::UnregisterRootNamespaceObject() */
+    /** @copydoc ns3::Config::UnregisterRootNamespaceObject() */
     void UnregisterRootNamespaceObject(Ptr<Object> obj);
 
-    /** \copydoc ns3::Config::GetRootNamespaceObjectN() */
+    /** @copydoc ns3::Config::GetRootNamespaceObjectN() */
     std::size_t GetRootNamespaceObjectN() const;
-    /** \copydoc ns3::Config::GetRootNamespaceObject() */
+    /** @copydoc ns3::Config::GetRootNamespaceObject() */
     Ptr<Object> GetRootNamespaceObject(std::size_t i) const;
 
   private:
     /**
      * Break a Config path into the leading path and the last leaf token.
-     * \param [in] path The Config path.
-     * \param [in,out] root The leading part of the \pname{path},
+     * @param [in] path The Config path.
+     * @param [in,out] root The leading part of the \pname{path},
      *   up to the final slash.
-     * \param [in,out] leaf The trailing part of the \pname{path}.
+     * @param [in,out] leaf The trailing part of the \pname{path}.
      */
     void ParsePath(std::string path, std::string* root, std::string* leaf) const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/config.h ns-3.44/src/core/model/config.h
--- ns-3.43/src/core/model/config.h	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/config.h	2025-03-09 16:55:49.355371000 -0700
@@ -14,8 +14,8 @@
 #include <vector>
 
 /**
- * \file
- * \ingroup config
+ * @file
+ * @ingroup config
  * Declaration of the various ns3::Config functions and classes.
  */
 
@@ -27,29 +27,29 @@
 class CallbackBase;
 
 /**
- * \ingroup core
- * \defgroup config Configuration
- * \brief Configuration of simulation parameters and tracing.
+ * @ingroup core
+ * @defgroup config Configuration
+ * @brief Configuration of simulation parameters and tracing.
  */
 
 /**
- * \ingroup config
+ * @ingroup config
  * Namespace for the various functions implementing the Config system.
  */
 namespace Config
 {
 
 /**
- * \ingroup config
+ * @ingroup config
  * Reset the initial value of every attribute as well as the value of every
  * global to what they were before any call to SetDefault and SetGlobal.
  */
 void Reset();
 
 /**
- * \ingroup config
- * \param [in] path A path to match attributes.
- * \param [in] value The value to set in all matching attributes.
+ * @ingroup config
+ * @param [in] path A path to match attributes.
+ * @param [in] value The value to set in all matching attributes.
  *
  * This function will attempt to find attributes which
  * match the input path and will then set their value to the input
@@ -58,20 +58,20 @@
  */
 void Set(std::string path, const AttributeValue& value);
 /**
- * \ingroup config
- * \param [in] path A path to match attributes.
- * \param [in] value The value to set in all matching attributes.
+ * @ingroup config
+ * @param [in] path A path to match attributes.
+ * @param [in] value The value to set in all matching attributes.
  *
  * This function will attempt to find attributes which
  * match the input path and will then set their value to the input
  * value, and will return true if at least one such attribute is found.
- * \return \c true if any matching attributes could be set.
+ * @return \c true if any matching attributes could be set.
  */
 bool SetFailSafe(std::string path, const AttributeValue& value);
 /**
- * \ingroup config
- * \param [in] name The full name of the attribute
- * \param [in] value The value to set.
+ * @ingroup config
+ * @param [in] name The full name of the attribute
+ * @param [in] value The value to set.
  *
  * This method overrides the initial value of the
  * matching attribute. This method cannot fail: it will
@@ -79,36 +79,36 @@
  */
 void SetDefault(std::string name, const AttributeValue& value);
 /**
- * \ingroup config
- * \param [in] name The full name of the attribute
- * \param [in] value The value to set.
- * \returns \c true if the value was set successfully, false otherwise.
+ * @ingroup config
+ * @param [in] name The full name of the attribute
+ * @param [in] value The value to set.
+ * @returns \c true if the value was set successfully, false otherwise.
  *
  * This method overrides the initial value of the
  * matching attribute.
  */
 bool SetDefaultFailSafe(std::string name, const AttributeValue& value);
 /**
- * \ingroup config
- * \param [in] name The name of the requested GlobalValue.
- * \param [in] value The value to set
+ * @ingroup config
+ * @param [in] name The name of the requested GlobalValue.
+ * @param [in] value The value to set
  *
  * This method is equivalent to GlobalValue::Bind
  */
 void SetGlobal(std::string name, const AttributeValue& value);
 /**
- * \ingroup config
- * \param [in] name The name of the requested GlobalValue.
- * \param [in] value The value to set
- * \return \c true if the GlobalValue could be set.
+ * @ingroup config
+ * @param [in] name The name of the requested GlobalValue.
+ * @param [in] value The value to set
+ * @return \c true if the GlobalValue could be set.
  *
  * This method is equivalent to GlobalValue::BindFailSafe
  */
 bool SetGlobalFailSafe(std::string name, const AttributeValue& value);
 /**
- * \ingroup config
- * \param [in] path A path to match trace sources.
- * \param [in] cb The callback to connect to the matching trace sources.
+ * @ingroup config
+ * @param [in] path A path to match trace sources.
+ * @param [in] cb The callback to connect to the matching trace sources.
  *
  * This function will attempt to find all trace sources which
  * match the input path and will then connect the input callback
@@ -118,29 +118,29 @@
  */
 void ConnectWithoutContext(std::string path, const CallbackBase& cb);
 /**
- * \ingroup config
- * \param [in] path A path to match trace sources.
- * \param [in] cb The callback to connect to the matching trace sources.
+ * @ingroup config
+ * @param [in] path A path to match trace sources.
+ * @param [in] cb The callback to connect to the matching trace sources.
  *
  * This function will attempt to find all trace sources which
  * match the input path and will then connect the input callback
  * to them.  If no matching trace sources are found, this method will
  * return false; otherwise true.
- * \returns \c true if any trace sources could be connected.
+ * @returns \c true if any trace sources could be connected.
  */
 bool ConnectWithoutContextFailSafe(std::string path, const CallbackBase& cb);
 /**
- * \ingroup config
- * \param [in] path A path to match trace sources.
- * \param [in] cb The callback to disconnect to the matching trace sources.
+ * @ingroup config
+ * @param [in] path A path to match trace sources.
+ * @param [in] cb The callback to disconnect to the matching trace sources.
  *
  * This function undoes the work of Config::Connect.
  */
 void DisconnectWithoutContext(std::string path, const CallbackBase& cb);
 /**
- * \ingroup config
- * \param [in] path A path to match trace sources.
- * \param [in] cb The callback to connect to the matching trace sources.
+ * @ingroup config
+ * @param [in] path A path to match trace sources.
+ * @param [in] cb The callback to connect to the matching trace sources.
  *
  * This function will attempt to find all trace sources which
  * match the input path and will then connect the input callback
@@ -152,29 +152,29 @@
  */
 void Connect(std::string path, const CallbackBase& cb);
 /**
- * \ingroup config
- * \param [in] path A path to match trace sources.
- * \param [in] cb The callback to connect to the matching trace sources.
+ * @ingroup config
+ * @param [in] path A path to match trace sources.
+ * @param [in] cb The callback to connect to the matching trace sources.
  *
  * This function will attempt to find all trace sources which
  * match the input path and will then connect the input callback
  * to them in such a way that the callback will receive an extra
  * context string upon trace event notification.
- * \returns \c true if any trace sources could be connected.
+ * @returns \c true if any trace sources could be connected.
  */
 bool ConnectFailSafe(std::string path, const CallbackBase& cb);
 /**
- * \ingroup config
- * \param [in] path A path to match trace sources.
- * \param [in] cb The callback to connect to the matching trace sources.
+ * @ingroup config
+ * @param [in] path A path to match trace sources.
+ * @param [in] cb The callback to connect to the matching trace sources.
  *
  * This function undoes the work of Config::ConnectWithContext.
  */
 void Disconnect(std::string path, const CallbackBase& cb);
 
 /**
- * \ingroup config
- * \brief hold a set of objects which match a specific search string.
+ * @ingroup config
+ * @brief hold a set of objects which match a specific search string.
  *
  * This class also allows you to perform a set of configuration operations
  * on the set of matching objects stored in the container. Specifically,
@@ -189,16 +189,16 @@
     /**
      * Constructor used only by implementation.
      *
-     * \param [in] objects The vector of objects to store in this container.
-     * \param [in] contexts The corresponding contexts.
-     * \param [in] path The path used for object matching.
+     * @param [in] objects The vector of objects to store in this container.
+     * @param [in] contexts The corresponding contexts.
+     * @param [in] path The path used for object matching.
      */
     MatchContainer(const std::vector<Ptr<Object>>& objects,
                    const std::vector<std::string>& contexts,
                    std::string path);
 
     /**
-     * \returns An iterator which points to the first item in the container
+     * @returns An iterator which points to the first item in the container
      * @{
      */
     MatchContainer::Iterator Begin() const;
@@ -210,7 +210,7 @@
 
     /** @} */
     /**
-     * \returns An iterator which points to the last item in the container
+     * @returns An iterator which points to the last item in the container
      * @{
      */
     MatchContainer::Iterator End() const;
@@ -222,7 +222,7 @@
 
     /** @} */
     /**
-     * \returns The number of items in the container
+     * @returns The number of items in the container
      * @{
      */
     std::size_t GetN() const;
@@ -234,26 +234,26 @@
 
     /** @} */
     /**
-     * \param [in] i Index of item to lookup ([0,n[)
-     * \returns The item requested.
+     * @param [in] i Index of item to lookup ([0,n[)
+     * @returns The item requested.
      */
     Ptr<Object> Get(std::size_t i) const;
     /**
-     * \param [in] i Index of item to lookup ([0,n[)
-     * \returns The fully-qualified matching path associated
+     * @param [in] i Index of item to lookup ([0,n[)
+     * @returns The fully-qualified matching path associated
      *          to the requested item.
      *
      * The matching patch uniquely identifies the requested object.
      */
     std::string GetMatchedPath(uint32_t i) const;
     /**
-     * \returns The path used to perform the object matching.
+     * @returns The path used to perform the object matching.
      */
     std::string GetPath() const;
 
     /**
-     * \param [in] name Name of attribute to set
-     * \param [in] value Value to set to the attribute
+     * @param [in] name Name of attribute to set
+     * @param [in] value Value to set to the attribute
      *
      * Set the specified attribute value to all the objects stored in this
      * container.  This method will raise a fatal error if no such attribute
@@ -263,18 +263,18 @@
      */
     void Set(std::string name, const AttributeValue& value);
     /**
-     * \param [in] name Name of attribute to set
-     * \param [in] value Value to set to the attribute
+     * @param [in] name Name of attribute to set
+     * @param [in] value Value to set to the attribute
      *
      * Set the specified attribute value to all the objects stored in this
      * container.  This method will return true if any attributes could be
      * set, and false otherwise.
-     * \returns \c true if any attributes could be set.
+     * @returns \c true if any attributes could be set.
      */
     bool SetFailSafe(std::string name, const AttributeValue& value);
     /**
-     * \param [in] name The name of the trace source to connect to
-     * \param [in] cb The sink to connect to the trace source
+     * @param [in] name The name of the trace source to connect to
+     * @param [in] cb The sink to connect to the trace source
      *
      * Connect the specified sink to all the objects stored in this
      * container.  This method will raise a fatal error if no objects could
@@ -284,18 +284,18 @@
      */
     void Connect(std::string name, const CallbackBase& cb);
     /**
-     * \param [in] name The name of the trace source to connect to
-     * \param [in] cb The sink to connect to the trace source
+     * @param [in] name The name of the trace source to connect to
+     * @param [in] cb The sink to connect to the trace source
      *
      * Connect the specified sink to all the objects stored in this
      * container.  This method will return true if any trace sources could be
      * connected, and false otherwise.
-     * \returns \c true if any trace sources could be connected.
+     * @returns \c true if any trace sources could be connected.
      */
     bool ConnectFailSafe(std::string name, const CallbackBase& cb);
     /**
-     * \param [in] name The name of the trace source to connect to
-     * \param [in] cb The sink to connect to the trace source
+     * @param [in] name The name of the trace source to connect to
+     * @param [in] cb The sink to connect to the trace source
      *
      * Connect the specified sink to all the objects stored in this
      * container.  This method will raise a fatal error if no objects could
@@ -305,18 +305,18 @@
      */
     void ConnectWithoutContext(std::string name, const CallbackBase& cb);
     /**
-     * \param [in] name The name of the trace source to connect to
-     * \param [in] cb The sink to connect to the trace source
+     * @param [in] name The name of the trace source to connect to
+     * @param [in] cb The sink to connect to the trace source
      *
      * Connect the specified sink to all the objects stored in this
      * container.  This method will return true if any trace sources could be
      * connected, and false otherwise.
-     * \returns \c true if any trace sources could be connected.
+     * @returns \c true if any trace sources could be connected.
      */
     bool ConnectWithoutContextFailSafe(std::string name, const CallbackBase& cb);
     /**
-     * \param [in] name The name of the trace source to disconnect from
-     * \param [in] cb The sink to disconnect from the trace source
+     * @param [in] name The name of the trace source to disconnect from
+     * @param [in] cb The sink to disconnect from the trace source
      *
      * Disconnect the specified sink from all the objects stored in this
      * container.
@@ -324,8 +324,8 @@
      */
     void Disconnect(std::string name, const CallbackBase& cb);
     /**
-     * \param [in] name The name of the trace source to disconnect from
-     * \param [in] cb The sink to disconnect from the trace source
+     * @param [in] name The name of the trace source to disconnect from
+     * @param [in] cb The sink to disconnect from the trace source
      *
      * Disconnect the specified sink from all the objects stored in this
      * container.
@@ -343,39 +343,39 @@
 };
 
 /**
- * \ingroup config
- * \param [in] path The path to perform a match against
- * \returns A container which contains all the objects which match the input
+ * @ingroup config
+ * @param [in] path The path to perform a match against
+ * @returns A container which contains all the objects which match the input
  *          path.
  */
 MatchContainer LookupMatches(std::string path);
 
 /**
- * \ingroup config
- * \param [in] obj A new root object
+ * @ingroup config
+ * @param [in] obj A new root object
  *
  * Each root object is used during path matching as
  * the root of the path by Config::Connect, and Config::Set.
  */
 void RegisterRootNamespaceObject(Ptr<Object> obj);
 /**
- * \ingroup config
- * \param [in] obj A new root object
+ * @ingroup config
+ * @param [in] obj A new root object
  *
  * This function undoes the work of Config::RegisterRootNamespaceObject.
  */
 void UnregisterRootNamespaceObject(Ptr<Object> obj);
 
 /**
- * \ingroup config
- * \returns The number of registered root namespace objects.
+ * @ingroup config
+ * @returns The number of registered root namespace objects.
  */
 std::size_t GetRootNamespaceObjectN();
 
 /**
- * \ingroup config
- * \param [in] i The index of the requested object.
- * \returns The requested root namespace object
+ * @ingroup config
+ * @param [in] i The index of the requested object.
+ * @returns The requested root namespace object
  */
 Ptr<Object> GetRootNamespaceObject(uint32_t i);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/default-deleter.h ns-3.44/src/core/model/default-deleter.h
--- ns-3.43/src/core/model/default-deleter.h	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/default-deleter.h	2025-03-09 16:55:49.355371000 -0700
@@ -9,8 +9,8 @@
 #define DEFAULT_DELETER_H
 
 /**
- * \file
- * \ingroup ptr
+ * @file
+ * @ingroup ptr
  * ns3::DefaultDeleter declaration and template implementation,
  * for reference-counted smart pointers.
  */
@@ -19,13 +19,13 @@
 {
 
 /**
- * \ingroup ptr
- * \brief A template used to delete objects
+ * @ingroup ptr
+ * @brief A template used to delete objects
  *        by the ns3::SimpleRefCount templates when the
  *        last reference to an object they manage
  *        disappears.
  *
- * \tparam T \deduced The object type being deleted.
+ * @tparam T \deduced The object type being deleted.
  * \sa ns3::SimpleRefCount
  */
 template <typename T>
@@ -33,11 +33,11 @@
 {
     /**
      * The default deleter implementation, which just does a normal
-     * \code
+     * @code
      *   delete object;
-     * \endcode
-     * \tparam T \deduced The object type being deleted.
-     * \param [in] object The object to delete.
+     * @endcode
+     * @tparam T \deduced The object type being deleted.
+     * @param [in] object The object to delete.
      */
     inline static void Delete(T* object)
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/default-simulator-impl.cc ns-3.44/src/core/model/default-simulator-impl.cc
--- ns-3.43/src/core/model/default-simulator-impl.cc	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/default-simulator-impl.cc	2025-03-09 16:55:49.359371000 -0700
@@ -16,8 +16,8 @@
 #include <cmath>
 
 /**
- * \file
- * \ingroup simulator
+ * @file
+ * @ingroup simulator
  * ns3::DefaultSimulatorImpl implementation.
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/default-simulator-impl.h ns-3.44/src/core/model/default-simulator-impl.h
--- ns-3.43/src/core/model/default-simulator-impl.h	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/default-simulator-impl.h	2025-03-09 16:55:49.359371000 -0700
@@ -16,8 +16,8 @@
 #include <thread>
 
 /**
- * \file
- * \ingroup simulator
+ * @file
+ * @ingroup simulator
  * ns3::DefaultSimulatorImpl declaration.
  */
 
@@ -28,7 +28,7 @@
 class Scheduler;
 
 /**
- * \ingroup simulator
+ * @ingroup simulator
  *
  * The default single process simulator implementation.
  */
@@ -37,7 +37,7 @@
   public:
     /**
      *  Register this type.
-     *  \return The object TypeId.
+     *  @return The object TypeId.
      */
     static TypeId GetTypeId();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/demangle.h ns-3.44/src/core/model/demangle.h
--- ns-3.43/src/core/model/demangle.h	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/demangle.h	2025-03-09 16:55:49.359371000 -0700
@@ -16,8 +16,8 @@
 namespace ns3
 {
 /**
- * \param [in] mangled The mangled string
- * \return The demangled form of mangled
+ * @param [in] mangled The mangled string
+ * @return The demangled form of mangled
  */
 std::string Demangle(const std::string& mangled);
 }; // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/deprecated.h ns-3.44/src/core/model/deprecated.h
--- ns-3.43/src/core/model/deprecated.h	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/deprecated.h	2025-03-09 16:55:49.359371000 -0700
@@ -10,19 +10,19 @@
 #define NS3_DEPRECATED_H
 
 /**
- * \file
- * \ingroup deprecation
+ * @file
+ * @ingroup deprecation
  * NS_DEPRECATED macro definition.
  */
 
 /**
- * \defgroup deprecation Deprecation
- * \ingroup core
+ * @defgroup deprecation Deprecation
+ * @ingroup core
  */
 
 /**
- * \ingroup deprecation
- * \def NS_DEPRECATED
+ * @ingroup deprecation
+ * @def NS_DEPRECATED
  * Mark a function as deprecated.
  *
  * Users should expect deprecated features to be removed eventually.
@@ -35,7 +35,7 @@
  * Note: in the following snippet, the Doxygen blocks are not following the ns-3 style.
  * This allows the code to be safely embedded in the documentation.
  *
- * \code
+ * @code
  * /// Do something useful.
  * ///
  * /// \deprecated This method will go away in future versions of ns-3.
@@ -45,7 +45,7 @@
  *
  * /// Do something more useful.
  * void TheNewWay();
- * \endcode
+ * @endcode
  *
  * Please follow these two guidelines to ease future maintenance
  * (primarily the eventual removal of the deprecated code):
@@ -55,58 +55,65 @@
  *
  * 2.  Typically only the declaration needs to be deprecated,
  *
- *     \code
+ *     @code
  *     NS_DEPRECATED_3_XX("see TheNewWay")
  *     void SomethingUseful();
- *     \endcode
+ *     @endcode
  *
  *     but it's helpful to put the same macro as a comment
  *     at the site of the definition, to make it easier to find
  *     all the bits which eventually have to be removed:
  *
- *     \code
+ *     @code
  *     // NS_DEPRECATED_3_XX("see TheNewWay")
  *     void SomethingUseful() { ... }
- *     \endcode
+ *     @endcode
  *
- * \note Sometimes it is necessary to silence a deprecation warning.
+ * @note Sometimes it is necessary to silence a deprecation warning.
  * Even though this is highly discouraged, if necessary it is possible to use:
- * \code
+ * @code
  *   NS_WARNING_PUSH_DEPRECATED;
  *   // call to a function or class that has been deprecated.
  *   NS_WARNING_POP;
- * \endcode
+ * @endcode
  * These macros are defined in warnings.h
  *
- * \param msg Optional message to add to the compiler warning.
+ * @param msg Optional message to add to the compiler warning.
  *
  */
 #define NS_DEPRECATED(msg) /** \deprecated msg */ [[deprecated(msg)]]
 
 /**
- * \ingroup deprecation
- * \def NS_DEPRECATED_3_43
+ * @ingroup deprecation
+ * @def NS_DEPRECATED_3_44
+ * Tag for things deprecated in version ns-3.44.
+ */
+#define NS_DEPRECATED_3_44(msg) NS_DEPRECATED("Deprecated in ns-3.44: " msg)
+
+/**
+ * @ingroup deprecation
+ * @def NS_DEPRECATED_3_43
  * Tag for things deprecated in version ns-3.43.
  */
 #define NS_DEPRECATED_3_43(msg) NS_DEPRECATED("Deprecated in ns-3.43: " msg)
 
 /**
- * \ingroup deprecation
- * \def NS_DEPRECATED_3_42
+ * @ingroup deprecation
+ * @def NS_DEPRECATED_3_42
  * Tag for things deprecated in version ns-3.42.
  */
 #define NS_DEPRECATED_3_42(msg) NS_DEPRECATED("Deprecated in ns-3.42: " msg)
 
 /**
- * \ingroup deprecation
- * \def NS_DEPRECATED_3_41
+ * @ingroup deprecation
+ * @def NS_DEPRECATED_3_41
  * Tag for things deprecated in version ns-3.41.
  */
 #define NS_DEPRECATED_3_41(msg) NS_DEPRECATED("Deprecated in ns-3.41: " msg)
 
 /**
- * \ingroup deprecation
- * \def NS_DEPRECATED_3_40
+ * @ingroup deprecation
+ * @def NS_DEPRECATED_3_40
  * Tag for things deprecated in version ns-3.40.
  */
 #define NS_DEPRECATED_3_40(msg) NS_DEPRECATED("Deprecated in ns-3.40: " msg)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/des-metrics.cc ns-3.44/src/core/model/des-metrics.cc
--- ns-3.43/src/core/model/des-metrics.cc	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/des-metrics.cc	2025-03-09 16:55:49.359371000 -0700
@@ -41,7 +41,7 @@
     std::string model_name("desTraceFile");
     if (!args.empty())
     {
-        std::string arg0 = args[0];
+        const std::string& arg0 = args[0];
         model_name = SystemPath::Split(arg0).back();
     }
     std::string jsonFile = model_name + ".json";
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/des-metrics.h ns-3.44/src/core/model/des-metrics.h
--- ns-3.43/src/core/model/des-metrics.h	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/des-metrics.h	2025-03-09 16:55:49.359371000 -0700
@@ -54,7 +54,7 @@
  * To keep the output of examples, use the \c --retain argument to \c test.py.
  *
  * The output file has the following form:
- * \verbatim
+ * @verbatim
 {
  "simulator_name" : "ns-3",
  "model_name" : "ipv4-raw",
@@ -77,7 +77,7 @@
  * <b> Enabling DES Metrics </b>
  *
  * Enable DES Metrics at configure time with
- * \verbatim
+ * @verbatim
    $ ns3 configure ... --enable-des-metrics \endverbatim
  *
  * <b> Working with DES Metrics </b>
@@ -85,14 +85,14 @@
  * Some useful shell pipelines:
  *
  * \li Run everything, retaining the results directory: <br/>
- *   \code  ./test.py --nobuild --retain \endcode
+ *   @code  ./test.py --nobuild --retain \endcode
  * \li Example traces end up in \c testpy-output/, so move there: <br/>
- *   \code cd testpy-output/$(date +"%F")*_/  \endcode
+ *   @code cd testpy-output/$(date +"%F")*_/  \endcode
  *   (Remove the `_', which is to work around a Doxygen limitation.)
  * \li Remove the traces with less than 10 events: <br/>
- *   \code wc -l *.json | sort -nr | grep "^ *[789] " | cut -d ' ' -f 9 | xargs rm -f \endcode
+ *   @code wc -l *.json | sort -nr | grep "^ *[789] " | cut -d ' ' -f 9 | xargs rm -f \endcode
  * \li Show the largest file, and total number of trace files: <br/>
- *   \code wc -l *.json | sort -n | tail -2 \endcode
+ *   @code wc -l *.json | sort -n | tail -2 \endcode
  *
  */
 class DesMetrics : public Singleton<DesMetrics>
@@ -104,25 +104,25 @@
      * The trace file will have the same base name as the main program,
      * '.json' as the extension.
      *
-     * \param args [in] Command line arguments.
-     * \param outDir [in] Directory where the trace file should be written.
+     * @param args [in] Command line arguments.
+     * @param outDir [in] Directory where the trace file should be written.
      */
     void Initialize(std::vector<std::string> args, std::string outDir = "");
 
     /**
      * Trace an event to self at the time it is scheduled.
      *
-     * \param now [in] The local simulation time.
-     * \param delay [in] The delay to the event.
+     * @param now [in] The local simulation time.
+     * @param delay [in] The delay to the event.
      */
     void Trace(const Time& now, const Time& delay);
 
     /**
      * Trace an event (with context) at the time it is scheduled.
      *
-     * \param context [in] The context (NodeId) which will receive the event.
-     * \param now [in] The local simulation time.
-     * \param delay [in] The delay to the event.
+     * @param context [in] The context (NodeId) which will receive the event.
+     * @param now [in] The local simulation time.
+     * @param delay [in] The delay to the event.
      */
     void TraceWithContext(uint32_t context, const Time& now, const Time& delay);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/double.cc ns-3.44/src/core/model/double.cc
--- ns-3.43/src/core/model/double.cc	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/double.cc	2025-03-09 16:55:49.359371000 -0700
@@ -13,8 +13,8 @@
 #include <sstream>
 
 /**
- * \file
- * \ingroup attribute_Double
+ * @file
+ * @ingroup attribute_Double
  * ns3::DoubleValue attribute value implementation.
  */
 
@@ -30,13 +30,13 @@
 {
 
 /**
- * \ingroup attribute_Double
+ * @ingroup attribute_Double
  * Make a Double attribute checker with embedded numeric type name.
  *
- * \param [in] min The minimum allowed value.
- * \param [in] max The maximum allowed value.
- * \param [in] name The original type name ("float", "double").
- * \returns The AttributeChecker.
+ * @param [in] min The minimum allowed value.
+ * @param [in] max The maximum allowed value.
+ * @param [in] name The original type name ("float", "double").
+ * @returns The AttributeChecker.
  */
 Ptr<const AttributeChecker>
 MakeDoubleChecker(double min, double max, std::string name)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/double.h ns-3.44/src/core/model/double.h
--- ns-3.43/src/core/model/double.h	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/double.h	2025-03-09 16:55:49.359371000 -0700
@@ -15,8 +15,8 @@
 #include <stdint.h>
 
 /**
- * \file
- * \ingroup attribute_Double
+ * @file
+ * @ingroup attribute_Double
  * ns3::DoubleValue attribute value declarations and template implementations.
  */
 
@@ -39,9 +39,9 @@
  *
  * The minimum value is included in the allowed range.
  *
- * \param [in] min The minimum value.
- * \returns The AttributeChecker.
- * \see AttributeChecker
+ * @param [in] min The minimum value.
+ * @returns The AttributeChecker.
+ * @see AttributeChecker
  */
 template <typename T>
 Ptr<const AttributeChecker> MakeDoubleChecker(double min);
@@ -51,10 +51,10 @@
  *
  * The minimum and maximum values are included in the allowed range.
  *
- * \param [in] min The minimum value.
- * \param [in] max The maximum value.
- * \returns The AttributeChecker.
- * \see AttributeChecker
+ * @param [in] min The minimum value.
+ * @param [in] max The maximum value.
+ * @returns The AttributeChecker.
+ * @see AttributeChecker
  */
 template <typename T>
 Ptr<const AttributeChecker> MakeDoubleChecker(double min, double max);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/enum.h ns-3.44/src/core/model/enum.h
--- ns-3.43/src/core/model/enum.h	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/enum.h	2025-03-09 16:55:49.359371000 -0700
@@ -20,8 +20,8 @@
 #include <typeinfo>
 
 /**
- * \file
- * \ingroup attribute_Enum
+ * @file
+ * @ingroup attribute_Enum
  * ns3::EnumValue attribute value declarations.
  */
 
@@ -38,14 +38,14 @@
  * This is often used with ObjectFactory and Config to bind
  * the value of a particular enum to an Attribute or Config name.
  * For example,
- * \code
+ * @code
  *   Ptr<RateErrorModel> model = CreateObjectWithAttributes<RateErrorModel> (
  *     "ErrorRate", DoubleValue (0.05),
  *     "ErrorUnit", EnumValue (RateErrorModel::ERROR_UNIT_PACKET));
  *
  *   Config::SetDefault ("ns3::RipNg::SplitHorizon",
  *                       EnumValue (RipNg::NO_SPLIT_HORIZON));
- * \endcode
+ * @endcode
  */
 template <typename T>
 class EnumValue : public AttributeValue
@@ -112,28 +112,28 @@
 
     /**
      * Add a default value.
-     * \param [in] value The value.
-     * \param [in] name Then enum symbol name.
+     * @param [in] value The value.
+     * @param [in] name Then enum symbol name.
      */
     void AddDefault(T value, std::string name);
     /**
      * Add a new value.
-     * \param [in] value The value.
-     * \param [in] name The enum symbol name.
+     * @param [in] value The value.
+     * @param [in] name The enum symbol name.
      */
     void Add(T value, std::string name);
 
     /**
      * Get the enum symbol name by value.
-     * \param [in] value The value.
-     * \return The enum symbol name.
+     * @param [in] value The value.
+     * @return The enum symbol name.
      */
     std::string GetName(T value) const;
 
     /**
      * Get the enum value by name.
-     * \param [in] name Then enum symbol name.
-     * \returns The enum value.
+     * @param [in] name Then enum symbol name.
+     * @returns The enum value.
      */
     T GetValue(const std::string name) const;
 
@@ -165,14 +165,14 @@
  * As many additional enum value, name pairs as desired can be passed
  * as arguments.
  *
- * \see AttributeChecker
+ * @see AttributeChecker
  *
- * \tparam Ts The type list of additional parameters. Additional parameters
+ * @tparam Ts The type list of additional parameters. Additional parameters
  *            should be T, string pairs.
- * \returns The AttributeChecker
- * \param [in] v  The default enum value.
- * \param [in] n  The corresponding name.
- * \param [in] args Any additional arguments.
+ * @returns The AttributeChecker
+ * @param [in] v  The default enum value.
+ * @param [in] n  The corresponding name.
+ * @param [in] args Any additional arguments.
  */
 template <typename T, typename... Ts>
 Ptr<const AttributeChecker>
@@ -186,13 +186,13 @@
 /**
  * Handler for enum value, name pairs other than the default.
  *
- * \tparam Ts The type list of additional parameters. Additional parameters
+ * @tparam Ts The type list of additional parameters. Additional parameters
  *            should be T, string pairs.
- * \returns The AttributeChecker
- * \param [in] checker The AttributeChecker.
- * \param [in] v  The next enum value.
- * \param [in] n  The corresponding name.
- * \param [in] args Any additional arguments.
+ * @returns The AttributeChecker
+ * @param [in] checker The AttributeChecker.
+ * @param [in] v  The next enum value.
+ * @param [in] n  The corresponding name.
+ * @param [in] args Any additional arguments.
  */
 template <typename T, typename... Ts>
 Ptr<const AttributeChecker>
@@ -205,8 +205,8 @@
 /**
  * Terminate the recursion of variadic arguments.
  *
- * \returns The \p checker
- * \param [in] checker The AttributeChecker.
+ * @returns The \p checker
+ * @param [in] checker The AttributeChecker.
  */
 // inline to allow tail call optimization
 template <typename T>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/environment-variable.cc ns-3.44/src/core/model/environment-variable.cc
--- ns-3.43/src/core/model/environment-variable.cc	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/environment-variable.cc	2025-03-09 16:55:49.359371000 -0700
@@ -16,8 +16,8 @@
 #include <stdlib.h> // Global functions setenv, unsetenv
 
 /**
- * \file
- * \ingroup core-environ
+ * @file
+ * @ingroup core-environ
  * Class EnvironmentVariable implementation.
  */
 
@@ -27,12 +27,12 @@
 /**
  * Windows implementation of the POSIX function `setenv()`
  *
- * \param [in] var_name The environment variable to set.
+ * @param [in] var_name The environment variable to set.
  *             Must not be a null-pointer, and must not contain `=`.
- * \param [in] new_value The new value to set \p var_name to.
+ * @param [in] new_value The new value to set \p var_name to.
  *             Must not by a null pointer or empty.
- * \param [in] change_flag Must be non-zero to actually change the environment.
- * \returns 0 if successful, -1 if failed.
+ * @param [in] change_flag Must be non-zero to actually change the environment.
+ * @returns 0 if successful, -1 if failed.
  */
 int
 setenv(const char* var_name, const char* new_value, int change_flag)
@@ -71,8 +71,8 @@
 
 /**
  * Windows implementation of the POSIX function `unsetenv()`
- * \param [in] var_name The environment variable to unset and remove from the environment.
- * \returns 0 if successful, -1 if failed.
+ * @param [in] var_name The environment variable to unset and remove from the environment.
+ * @returns 0 if successful, -1 if failed.
  */
 int
 unsetenv(const char* var_name)
@@ -86,20 +86,20 @@
 {
 
 /**
- * \ingroup core-environ
+ * @ingroup core-environ
  *
- * \def NS_LOCAL_LOG(msg)
+ * @def NS_LOCAL_LOG(msg)
  * File-local logging macro for environment-variable.cc
  * Our usual Logging doesn't work here because these functions
  * get called during static initialization of Logging itself.
- * \param msg The message stream to log
+ * @param msg The message stream to log
  *
- * \def NS_LOCAL_ASSERT(cond, msg)
+ * @def NS_LOCAL_ASSERT(cond, msg)
  * File-local assert macro for environment-variable.cc
  * Our usual assert doesn't work here because these functions
  * get called during static initialization of Logging itself.
- * \param cond The condition which is asserted to be \c true
- * \param msg The message stream to log
+ * @param cond The condition which is asserted to be \c true
+ * @param msg The message stream to log
  */
 #if 0
 #define NS_LOCAL_LOG(msg)                                                                          \
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/environment-variable.h ns-3.44/src/core/model/environment-variable.h
--- ns-3.43/src/core/model/environment-variable.h	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/environment-variable.h	2025-03-09 16:55:49.359371000 -0700
@@ -10,8 +10,8 @@
 #define ENVIRONMENT_VARIABLE_H
 
 /**
- * \file
- * \ingroup core-environ
+ * @file
+ * @ingroup core-environ
  * Class Environment declaration.
  */
 
@@ -23,7 +23,7 @@
 namespace ns3
 {
 
-/// \todo Reconsider the name?
+/// @todo Reconsider the name?
 /// Rename to just EnvironmentVariableDictionary?
 /// System::EnvironmentVariable?
 
@@ -34,7 +34,7 @@
 }
 
 /**
- * \ingroup core-environ
+ * @ingroup core-environ
  * Hold key,value dictionaries for environment variables.
  *
  * The environment variable can have multiple key,value pairs
@@ -85,10 +85,10 @@
      *   (not empty) key exists with no value, or the key was empty and the
      *   environment variable itself is empty.
      *
-     * \param [in] envvar The environment variable.
-     * \param [in] key The key to extract from the environment variable.
-     * \param [in] delim The delimiter between key,value pairs.
-     * \returns Whether the key was found, and its value, as explained above.
+     * @param [in] envvar The environment variable.
+     * @param [in] key The key to extract from the environment variable.
+     * @param [in] delim The delimiter between key,value pairs.
+     * @returns Whether the key was found, and its value, as explained above.
      */
     static KeyFoundType Get(const std::string& envvar,
                             const std::string& key = "",
@@ -103,9 +103,9 @@
      * This should be used when one needs to process all key,value
      * pairs, perhaps without knowing the set of possible keys.
      *
-     * \param [in] envvar The environment variable.
-     * \param [in] delim The delimiter between key,value pairs.
-     * \returns The Dictionary.
+     * @param [in] envvar The environment variable.
+     * @param [in] delim The delimiter between key,value pairs.
+     * @returns The Dictionary.
      */
     static std::shared_ptr<Dictionary> GetDictionary(const std::string& envvar,
                                                      const std::string& delim = ";");
@@ -125,16 +125,16 @@
          * delimiter will be taken as the value.  If no `=`
          * is given the enpty string will be stored as the value.
          *
-         * \param [in] envvar The environment variable.
-         * \param [in] delim The delimiter between key,value pairs.
+         * @param [in] envvar The environment variable.
+         * @param [in] delim The delimiter between key,value pairs.
          */
         Dictionary(const std::string& envvar, const std::string& delim = ";");
 
         /**
          * Get the value corresponding to a key from this dictionary.
          * If the \p key is empty return the full environment variable value.
-         * \param [in] key The key to extract from the environment variable.
-         * \returns \c true if the key was found, and the associated value.
+         * @param [in] key The key to extract from the environment variable.
+         * @returns \c true if the key was found, and the associated value.
          */
         KeyFoundType Get(const std::string& key = "") const;
 
@@ -142,7 +142,7 @@
         using KeyValueStore = std::unordered_map<std::string, std::string>;
 
         /** Get the underlying store, for iterating.
-         * \returns The key, value store.
+         * @returns The key, value store.
          */
         KeyValueStore GetStore() const;
 
@@ -162,7 +162,7 @@
      * To set a variable to the empty string use `Set(variable, "")`.
      * Note: empty environment variables are not portable (unsupported on Windows).
      *
-     * \param [in] variable The environment variable to set.  Note this may not contain the `=`
+     * @param [in] variable The environment variable to set.  Note this may not contain the `=`
      * character. \param [in] value The value to set.  Note this must not be an empty string on
      * Windows. \returns \c true if the variable was set successfully
      */
@@ -173,13 +173,13 @@
      * This removes the variable from the environment.
      * To set a variable to the empty string use `Set(variable, "")`.
      *
-     * \param [in] variable The environment variable to unset.  Note this may not contain the `=`
+     * @param [in] variable The environment variable to unset.  Note this may not contain the `=`
      * character. \returns \c true if the variable was unset successfully.
      */
     static bool Unset(const std::string& variable);
 
     /**
-     * \name Singleton
+     * @name Singleton
      *
      * This class is a singleton, accessed by static member functions,
      * so the Rule of Five functions are all deleted.
@@ -204,7 +204,7 @@
 
     /**
      * Access the DictionaryStore instance.
-     * \returns the DictionaryStore.
+     * @returns the DictionaryStore.
      */
     static DictionaryList& Instance();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/event-id.cc ns-3.44/src/core/model/event-id.cc
--- ns-3.43/src/core/model/event-id.cc	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/event-id.cc	2025-03-09 16:55:49.359371000 -0700
@@ -12,8 +12,8 @@
 #include "simulator.h"
 
 /**
- * \file
- * \ingroup events
+ * @file
+ * @ingroup events
  * ns3::EventId implementation.
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/event-id.h ns-3.44/src/core/model/event-id.h
--- ns-3.43/src/core/model/event-id.h	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/event-id.h	2025-03-09 16:55:49.359371000 -0700
@@ -15,8 +15,8 @@
 #include <stdint.h>
 
 /**
- * \file
- * \ingroup events
+ * @file
+ * @ingroup events
  * ns3::EventId declarations.
  */
 
@@ -26,8 +26,8 @@
 class EventImpl;
 
 /**
- * \ingroup events
- * \brief An identifier for simulation events.
+ * @ingroup events
+ * @brief An identifier for simulation events.
  *
  * Each EventId identifies a unique event scheduled with one
  * of the many Simulator::Schedule() methods. This EventId can
@@ -64,10 +64,10 @@
     /**
      * Construct a real event.
      *
-     * \param [in] impl The implementation of this event.
-     * \param [in] ts The virtual time stamp this event should occur.
-     * \param [in] context The execution context for this event.
-     * \param [in] uid The unique id for this EventId.
+     * @param [in] impl The implementation of this event.
+     * @param [in] ts The virtual time stamp this event should occur.
+     * @param [in] context The execution context for this event.
+     * @param [in] uid The unique id for this EventId.
      */
     EventId(const Ptr<EventImpl>& impl, uint64_t ts, uint32_t context, uint32_t uid);
     /**
@@ -83,60 +83,60 @@
     /**
      * This method is syntactic sugar for the ns3::Simulator::IsExpired
      * method.
-     * \returns \c true if the event has expired, \c false otherwise.
+     * @returns \c true if the event has expired, \c false otherwise.
      */
     bool IsExpired() const;
     /**
      * This method is syntactic sugar for !IsExpired().
      *
-     * \returns \c true if the event has not expired, \c false otherwise.
+     * @returns \c true if the event has not expired, \c false otherwise.
      */
     bool IsPending() const;
 
     /**
      * This method is syntactic sugar for !IsExpired().
      *
-     * \returns \c true if the event has not expired, \c false otherwise.
+     * @returns \c true if the event has not expired, \c false otherwise.
      */
     NS_DEPRECATED_3_42("Use IsPending instead")
     bool IsRunning() const;
 
   public:
     /**
-     * \name Scheduler Helpers.
-     * \brief These methods are normally invoked only by
+     * @name Scheduler Helpers.
+     * @brief These methods are normally invoked only by
      * subclasses of the Scheduler base class.
      */
     /**@{*/
-    /** \return The underlying EventImpl pointer. */
+    /** @return The underlying EventImpl pointer. */
     EventImpl* PeekEventImpl() const;
-    /** \return The virtual time stamp. */
+    /** @return The virtual time stamp. */
     uint64_t GetTs() const;
-    /** \return The event context. */
+    /** @return The event context. */
     uint32_t GetContext() const;
-    /** \return The unique id. */
+    /** @return The unique id. */
     uint32_t GetUid() const;
     /**@}*/
 
     /**
      * Test if two EventId's are equal.
-     * \param [in] a The first EventId.
-     * \param [in] b The second EventId.
-     * \return \c true if the \pname{a} and \pname{b} represent the same event.
+     * @param [in] a The first EventId.
+     * @param [in] b The second EventId.
+     * @return \c true if the \pname{a} and \pname{b} represent the same event.
      */
     friend bool operator==(const EventId& a, const EventId& b);
     /**
      * Test if two EventId's are not equal.
-     * \param [in] a The first EventId.
-     * \param [in] b The second EventId.
-     * \return \c true if the \pname{a} and \pname{b} are not the same event.
+     * @param [in] a The first EventId.
+     * @param [in] b The second EventId.
+     * @return \c true if the \pname{a} and \pname{b} are not the same event.
      */
     friend bool operator!=(const EventId& a, const EventId& b);
     /**
      * Less than operator for two EventId's, based on time stamps.
-     * \param [in] a The first EventId.
-     * \param [in] b The second EventId.
-     * \return \c true if \pname{a} occurs before \pname{b}.
+     * @param [in] a The first EventId.
+     * @param [in] b The second EventId.
+     * @return \c true if \pname{a} occurs before \pname{b}.
      */
     friend bool operator<(const EventId& a, const EventId& b);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/event-impl.cc ns-3.44/src/core/model/event-impl.cc
--- ns-3.43/src/core/model/event-impl.cc	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/event-impl.cc	2025-03-09 16:55:49.359371000 -0700
@@ -11,8 +11,8 @@
 #include "log.h"
 
 /**
- * \file
- * \ingroup events
+ * @file
+ * @ingroup events
  * ns3::EventImpl definitions.
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/event-impl.h ns-3.44/src/core/model/event-impl.h
--- ns-3.43/src/core/model/event-impl.h	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/event-impl.h	2025-03-09 16:55:49.359371000 -0700
@@ -13,8 +13,8 @@
 #include <stdint.h>
 
 /**
- * \file
- * \ingroup events
+ * @file
+ * @ingroup events
  * ns3::EventImpl declarations.
  */
 
@@ -22,8 +22,8 @@
 {
 
 /**
- * \ingroup events
- * \brief A simulation event.
+ * @ingroup events
+ * @brief A simulation event.
  *
  * Each subclass of this base class represents a simulation event. The
  * Invoke() method will be called by the simulation engine
@@ -50,7 +50,7 @@
      */
     void Cancel();
     /**
-     * \returns true if the event has been canceled.
+     * @returns true if the event has been canceled.
      *
      * Checked by the simulation engine before calling Invoke().
      */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/example-as-test.cc ns-3.44/src/core/model/example-as-test.cc
--- ns-3.43/src/core/model/example-as-test.cc	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/example-as-test.cc	2025-03-09 16:55:49.359371000 -0700
@@ -20,8 +20,8 @@
 #include <string>
 
 /**
- * \file
- * \ingroup testing
+ * @file
+ * @ingroup testing
  * Implementation of classes ns3::ExampleAsTestSuite and ns3::ExampleTestCase.
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/example-as-test.h ns-3.44/src/core/model/example-as-test.h
--- ns-3.43/src/core/model/example-as-test.h	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/example-as-test.h	2025-03-09 16:55:49.359371000 -0700
@@ -14,8 +14,8 @@
 #include <string>
 
 /**
- * \file
- * \ingroup testing
+ * @file
+ * @ingroup testing
  * Enable examples to be run as meaningful tests.
  * Declaration of classes ns3::ExampleAsTestSuite and ns3::ExampleAsTestCase.
  */
@@ -24,7 +24,7 @@
 {
 
 /**
- * \ingroup testing
+ * @ingroup testing
  * Execute an example program as a test, by comparing the output
  * to a reference file.
  *
@@ -32,17 +32,17 @@
  * GetPostProcessingCommand() methods if more complex
  * example invocation patterns are required.
  *
- * \see examples-as-tests-test-suite.cc
+ * @see examples-as-tests-test-suite.cc
  */
 class ExampleAsTestCase : public TestCase
 {
   public:
     /**
      * Constructor.
-     * \param [in] name The test case name, typically the program name
+     * @param [in] name The test case name, typically the program name
      *                  and summary of the arguments, such as `my-example-foo`
-     * \param [in] program The actual example program names, such as `my-example`
-     * \param [in] dataDir The location of the reference file.
+     * @param [in] program The actual example program names, such as `my-example`
+     * @param [in] dataDir The location of the reference file.
      *                  This is normally provided by the symbol
      *                  `NS_TEST_SOURCEDIR` in the `module-examples-test-suite.cc`
      *                  file.
@@ -52,8 +52,8 @@
      *                  the `--update` argument to `test.py` or
      *                  `test-runner` the reference file will be created
      *                  with the correct name.
-     * \param [in] args Any additional arguments to the program.
-     * \param [in] shouldNotErr Whether an error return status should be
+     * @param [in] args Any additional arguments to the program.
+     * @param [in] shouldNotErr Whether an error return status should be
      *             considered a test failure. This is useful when testing
      *             error detection which might return a non-zero status.
      *             The output (on `std::cout` and `std::cerr`) will
@@ -72,7 +72,7 @@
      * Customization point for more complicated patterns
      * to invoke the example program.
      *
-     * \returns The string to be given to the `ns3 --command-template=` argument.
+     * @returns The string to be given to the `ns3 --command-template=` argument.
      */
     virtual std::string GetCommandTemplate() const;
 
@@ -89,7 +89,7 @@
      *
      * Default is `""`, no additional processing.
      *
-     * \returns The string of post-processing commands
+     * @returns The string of post-processing commands
      */
     virtual std::string GetPostProcessingCommand() const;
 
@@ -105,7 +105,7 @@
 }; // class ExampleAsTestCase
 
 /**
- * \ingroup testing
+ * @ingroup testing
  * Execute an example program as a test suite.
  *
  * You can use this TestSuite to add an example to the test suite with
@@ -117,14 +117,14 @@
  * (non-zero indicates failure).  ExampleAsTestSuite adds checking of
  * output against a specified known "good" reference file.
  *
- * \warning If you are thinking about using this class, strongly
+ * @warning If you are thinking about using this class, strongly
  * consider using a standard test instead.  The TestSuite class has
  * better checking using the NS_TEST_* macros and in almost all cases
  * is the better approach.  If your test can be done with a TestSuite
  * class you will be asked by the reviewers to rewrite the test when
  * you do a pull request.
  *
- * \par Test Addition
+ * @par Test Addition
  *
  * To use an example program as a test you need to create a test suite
  * file and add it to the appropriate list in your module CMakeLists.txt
@@ -156,7 +156,7 @@
  * \code{.py}
  * if (bld.env['ENABLE_EXAMPLES']):
  *    module.source.append('model/mymodule-examples-test-suite.cc')
- * \endcode
+ * @endcode
  *
  * Since you modified a CMakeLists.txt file you need to reconfigure and
  * rebuild everything.
@@ -173,7 +173,7 @@
  * it is valid.  The reference files should be committed with the new
  * test.
  *
- * \par Test Verification
+ * @par Test Verification
  *
  * You can run the test with the standard `test.py` script.  For
  * example to run the suites you just added:
@@ -183,7 +183,7 @@
  * This will run all `mymodule-example-...` tests and report whether they
  * produce output matching the reference files.
  *
- * \par Writing good examples for testing
+ * @par Writing good examples for testing
  *
  * When setting up an example for use by this class you should be very
  * careful about what output the example generates.  For example,
@@ -199,8 +199,8 @@
 {
   public:
     /**
-     * \copydoc ExampleAsTestCase::ExampleAsTestCase
-     * \param [in] duration Amount of time this test takes to execute
+     * @copydoc ExampleAsTestCase::ExampleAsTestCase
+     * @param [in] duration Amount of time this test takes to execute
      *             (defaults to QUICK).
      */
     ExampleAsTestSuite(const std::string name,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/fatal-error.h ns-3.44/src/core/model/fatal-error.h
--- ns-3.43/src/core/model/fatal-error.h	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/fatal-error.h	2025-03-09 16:55:49.359371000 -0700
@@ -18,16 +18,16 @@
 #include <string_view>
 
 /**
- * \file
- * \ingroup fatal
- * \brief \c NS_FATAL_x macro definitions.
+ * @file
+ * @ingroup fatal
+ * @brief \c NS_FATAL_x macro definitions.
  */
 
 /**
- * \ingroup core
- * \defgroup fatal Fatal Error Handlers
+ * @ingroup core
+ * @defgroup fatal Fatal Error Handlers
  *
- * \brief Functions to help clean up when a fatal error
+ * @brief Functions to help clean up when a fatal error
  * is encountered.
  *
  * The functions in this group are used to perform
@@ -46,9 +46,9 @@
 {
 
 /**
- * \ingroup fatal
+ * @ingroup fatal
  *
- * \brief Output string marking imminent invocation of std::terminate.
+ * @brief Output string marking imminent invocation of std::terminate.
  *
  * This is useful to know when capturing output and you want to strip
  * system and compiler-dependent messages generated by std::terminate.
@@ -58,9 +58,9 @@
 } // namespace ns3
 
 /**
- * \ingroup fatal
+ * @ingroup fatal
  *
- * \brief Fatal error reporting with no message, implementation.
+ * @brief Fatal error reporting with no message, implementation.
  *
  * When this macro is hit at runtime the error details will
  * printed to \c stderr, including the file name and line number.
@@ -69,7 +69,7 @@
  * the invoking function should return an error code to its caller,
  * which is expected to call NS_FATAL_ERROR to cause termination.
  *
- * \param [in] fatal Call \c std::terminate() if true.
+ * @param [in] fatal Call \c std::terminate() if true.
  *
  * This macro is enabled unconditionally in all builds,
  * including debug and optimized builds.
@@ -89,9 +89,9 @@
     } while (false)
 
 /**
- * \ingroup fatal
+ * @ingroup fatal
  *
- * \brief Fatal error reporting with a message, implementation.
+ * @brief Fatal error reporting with a message, implementation.
  *
  * When this macro is hit at runtime the error details will
  * printed to \c stderr, including the message, file name and line number.
@@ -100,8 +100,8 @@
  * the invoking function should return an error code to its caller,
  * which is expected to call NS_FATAL_ERROR to cause termination.
  *
- * \param [in] msg The error message to print, if not empty.
- * \param [in] fatal Call \c std::terminate() if true.
+ * @param [in] msg The error message to print, if not empty.
+ * @param [in] fatal Call \c std::terminate() if true.
  *
  * This macro is enabled unconditionally in all builds,
  * including debug and optimized builds.
@@ -114,9 +114,9 @@
     } while (false)
 
 /**
- * \ingroup fatal
+ * @ingroup fatal
  *
- * \brief Report a fatal error and terminate.
+ * @brief Report a fatal error and terminate.
  *
  * When this macro is hit at runtime, details of filename
  * and line number are printed to \c stderr, and the program
@@ -131,9 +131,9 @@
 #define NS_FATAL_ERROR_NO_MSG() NS_FATAL_ERROR_IMPL_NO_MSG(true)
 
 /**
- * \ingroup fatal
+ * @ingroup fatal
  *
- * \brief Report a fatal error, deferring termination.
+ * @brief Report a fatal error, deferring termination.
  *
  * When this macro is hit at runtime, details of filename
  * and line number are printed to \c stderr, however the program
@@ -147,11 +147,11 @@
 #define NS_FATAL_ERROR_NO_MSG_CONT() NS_FATAL_ERROR_IMPL_NO_MSG(false)
 
 /**
- * \ingroup fatal
+ * @ingroup fatal
  *
- * \brief Report a fatal error with a message and terminate.
+ * @brief Report a fatal error with a message and terminate.
  *
- * \param [in] msg message to output when this macro is hit.
+ * @param [in] msg message to output when this macro is hit.
  *
  * When this macro is hit at runtime, the user-specified
  * error message are printed to \c stderr, followed by a call
@@ -168,9 +168,9 @@
 #define NS_FATAL_ERROR(msg) NS_FATAL_ERROR_IMPL(msg, true)
 
 /**
- * \ingroup fatal
+ * @ingroup fatal
  *
- * \brief Report a fatal error with a message, deferring termination.
+ * @brief Report a fatal error with a message, deferring termination.
  *
  * When this macro is hit at runtime, details of filename
  * and line number are printed to \c stderr, however the program
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/fatal-impl.cc ns-3.44/src/core/model/fatal-impl.cc
--- ns-3.43/src/core/model/fatal-impl.cc	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/fatal-impl.cc	2025-03-09 16:55:49.359371000 -0700
@@ -49,13 +49,13 @@
 #endif
 
 /**
- * \file
- * \ingroup fatalimpl
- * \brief ns3::FatalImpl::RegisterStream(), ns3::FatalImpl::UnregisterStream(),
+ * @file
+ * @ingroup fatalimpl
+ * @brief ns3::FatalImpl::RegisterStream(), ns3::FatalImpl::UnregisterStream(),
  * and ns3::FatalImpl::FlushStreams() implementations;
  * see Implementation note!
  *
- * \note Implementation.
+ * @note Implementation.
  *
  * The singleton pattern we use here is tricky because we have to ensure:
  *
@@ -79,7 +79,7 @@
 {
 
 /**
- * \ingroup fatalimpl
+ * @ingroup fatalimpl
  * Unnamed namespace for fatal streams memory implementation
  * and signal handler.
  */
@@ -87,11 +87,11 @@
 {
 
 /**
- * \ingroup fatalimpl
- * \brief Static variable pointing to the list of output streams
+ * @ingroup fatalimpl
+ * @brief Static variable pointing to the list of output streams
  * to be flushed on fatal errors.
  *
- * \returns The address of the static pointer.
+ * @returns The address of the static pointer.
  */
 std::list<std::ostream*>**
 PeekStreamList()
@@ -102,10 +102,10 @@
 }
 
 /**
- * \ingroup fatalimpl
- * \brief Get the stream list, initializing it if necessary.
+ * @ingroup fatalimpl
+ * @brief Get the stream list, initializing it if necessary.
  *
- * \returns The stream list.
+ * @returns The stream list.
  */
 std::list<std::ostream*>*
 GetStreamList()
@@ -146,7 +146,7 @@
 }
 
 /**
- * \ingroup fatalimpl
+ * @ingroup fatalimpl
  * Unnamed namespace for fatal streams signal handler.
  *
  * This is private to the fatal implementation.
@@ -155,13 +155,13 @@
 {
 
 /**
- * \ingroup fatalimpl
- * \brief Overrides normal SIGSEGV handler once the HandleTerminate
+ * @ingroup fatalimpl
+ * @brief Overrides normal SIGSEGV handler once the HandleTerminate
  * function is run.
  *
  * This is private to the fatal implementation.
  *
- * \param [in] sig The signal condition.
+ * @param [in] sig The signal condition.
  */
 void
 sigHandler(int sig)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/fatal-impl.h ns-3.44/src/core/model/fatal-impl.h
--- ns-3.43/src/core/model/fatal-impl.h	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/fatal-impl.h	2025-03-09 16:55:49.359371000 -0700
@@ -12,31 +12,31 @@
 #include <ostream>
 
 /**
- * \file
- * \ingroup fatalimpl
+ * @file
+ * @ingroup fatalimpl
  * ns3::FatalImpl::RegisterStream(), ns3::FatalImpl::UnregisterStream(),
  * and ns3::FatalImpl::FlushStreams() declarations.
  */
 
 /**
- * \ingroup fatal
- * \defgroup fatalimpl Fatal Implementation.
+ * @ingroup fatal
+ * @defgroup fatalimpl Fatal Implementation.
  */
 
 namespace ns3
 {
 
 /**
- * \ingroup fatalimpl
- * \brief Implementation namespace for fatal error handlers.
+ * @ingroup fatalimpl
+ * @brief Implementation namespace for fatal error handlers.
  */
 namespace FatalImpl
 {
 
 /**
- * \ingroup fatalimpl
+ * @ingroup fatalimpl
  *
- * \brief Register a stream to be flushed on abnormal exit.
+ * @brief Register a stream to be flushed on abnormal exit.
  *
  * If a \c std::terminate() call is encountered after the
  * stream had been registered and before it has been
@@ -44,14 +44,14 @@
  * this function should ensure the stream remains valid until
  * it had been unregistered.
  *
- * \param [in] stream The stream to be flushed on abnormal exit.
+ * @param [in] stream The stream to be flushed on abnormal exit.
  */
 void RegisterStream(std::ostream* stream);
 
 /**
- * \ingroup fatalimpl
+ * @ingroup fatalimpl
  *
- * \brief Unregister a stream for flushing on abnormal exit.
+ * @brief Unregister a stream for flushing on abnormal exit.
  *
  * After a stream had been unregistered, \c stream->flush()
  * will no longer be called should abnormal termination be
@@ -59,14 +59,14 @@
  *
  * If the stream is not registered, nothing will happen.
  *
- * \param [in] stream The stream to be unregistered.
+ * @param [in] stream The stream to be unregistered.
  */
 void UnregisterStream(std::ostream* stream);
 
 /**
- * \ingroup fatalimpl
+ * @ingroup fatalimpl
  *
- * \brief Flush all currently registered streams.
+ * @brief Flush all currently registered streams.
  *
  * This function iterates through each registered stream and
  * unregisters them. The default \c SIGSEGV handler is overridden
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/fd-reader.h ns-3.44/src/core/model/fd-reader.h
--- ns-3.43/src/core/model/fd-reader.h	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/fd-reader.h	2025-03-09 16:55:49.359371000 -0700
@@ -25,8 +25,8 @@
 #endif
 
 /**
- * \file
- * \ingroup system
+ * @file
+ * @ingroup system
  * ns3::FdReader declaration.
  */
 
@@ -34,8 +34,8 @@
 {
 
 /**
- * \ingroup system
- * \brief A class that asynchronously reads from a file descriptor.
+ * @ingroup system
+ * @brief A class that asynchronously reads from a file descriptor.
  *
  * This class can be used to start a system thread that reads from a
  * given file descriptor and invokes a given callback when data is
@@ -53,9 +53,9 @@
     /**
      * Start a new read thread.
      *
-     * \param [in] fd A valid file descriptor open for reading.
+     * @param [in] fd A valid file descriptor open for reading.
      *
-     * \param [in] readCallback A callback to invoke when new data is
+     * @param [in] readCallback A callback to invoke when new data is
      * available.
      */
     void Start(int fd, Callback<void, uint8_t*, ssize_t> readCallback);
@@ -74,7 +74,7 @@
 #endif
   protected:
     /**
-     * \brief A structure representing data read.
+     * @brief A structure representing data read.
      */
     struct Data
     {
@@ -88,8 +88,8 @@
         /**
          * Construct from a buffer of a given length.
          *
-         * \param [in] buf The buffer.
-         * \param [in] len The size of the buffer, in bytes.
+         * @param [in] buf The buffer.
+         * @param [in] len The size of the buffer, in bytes.
          */
         Data(uint8_t* buf, ssize_t len)
             : m_buf(buf),
@@ -104,7 +104,7 @@
     };
 
     /**
-     * \brief The read implementation.
+     * @brief The read implementation.
      *
      * The value of \pname{m_len} returned controls further processing.  The
      * callback function is only invoked when \pname{m_len} is positive; any
@@ -114,12 +114,12 @@
      * The management of memory associated with \pname{m_buf} must be
      * compatible with the read callback.
      *
-     * \return A structure representing what was read.
+     * @return A structure representing what was read.
      */
     virtual FdReader::Data DoRead() = 0;
 
     /**
-     * \brief The file descriptor to read from.
+     * @brief The file descriptor to read from.
      */
     int m_fd;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/global-value.cc ns-3.44/src/core/model/global-value.cc
--- ns-3.43/src/core/model/global-value.cc	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/global-value.cc	2025-03-09 16:55:49.359371000 -0700
@@ -17,8 +17,8 @@
 #include "ns3/core-config.h"
 
 /**
- * \file
- * \ingroup core
+ * @file
+ * @ingroup core
  * ns3::GlobalValue implementation.
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/global-value.h ns-3.44/src/core/model/global-value.h
--- ns-3.43/src/core/model/global-value.h	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/global-value.h	2025-03-09 16:55:49.359371000 -0700
@@ -15,8 +15,8 @@
 #include <vector>
 
 /**
- * \file
- * \ingroup core
+ * @file
+ * @ingroup core
  * ns3::GlobalValue declaration.
  */
 
@@ -30,9 +30,9 @@
 }
 
 /**
- * \ingroup core
+ * @ingroup core
  *
- * \brief Hold a so-called 'global value'.
+ * @brief Hold a so-called 'global value'.
  *
  * A GlobalValue will get its value from (in order):
  *   - The initial value configured where it is defined,
@@ -43,13 +43,13 @@
  * Instances of this class are expected to be allocated as static
  * global variables and should be used to store configurable global state.
  * For example:
- * \code
+ * @code
  *   // source.cc:
  *   static GlobalValue g_myGlobal =
  *     GlobalValue ("myGlobal", "My global value for ...",
  *                  IntegerValue (12),
  *                  MakeIntegerChecker ());
- * \endcode
+ * @endcode
  *
  * GlobalValues can be set directly by calling GlobalValue::SetValue()
  * but they can also be set through the \c NS_GLOBAL_VALUE environment variable.
@@ -72,12 +72,12 @@
 
     /**
      * Constructor.
-     * \param [in] name the name of this global value.
-     * \param [in] help some help text which describes the purpose of this
+     * @param [in] name the name of this global value.
+     * @param [in] help some help text which describes the purpose of this
      *        global value.
-     * \param [in] initialValue the value to assign to this global value
+     * @param [in] initialValue the value to assign to this global value
      *        during construction.
-     * \param [in] checker a pointer to an AttributeChecker which can verify
+     * @param [in] checker a pointer to an AttributeChecker which can verify
      *        that any user-supplied value to override the initial
      *        value matches the requested type constraints.
      */
@@ -88,29 +88,29 @@
 
     /**
      * Get the name.
-     * \returns The name of this GlobalValue.
+     * @returns The name of this GlobalValue.
      */
     std::string GetName() const;
     /**
      * Get the help string.
-     * \returns The help text of this GlobalValue.
+     * @returns The help text of this GlobalValue.
      */
     std::string GetHelp() const;
     /**
      * Get the value.
-     * \param [out] value The AttributeValue to set to the value
+     * @param [out] value The AttributeValue to set to the value
      *                    of this GlobalValue
      */
     void GetValue(AttributeValue& value) const;
     /**
      * Get the AttributeChecker.
-     * \returns The checker associated to this GlobalValue.
+     * @returns The checker associated to this GlobalValue.
      */
     Ptr<const AttributeChecker> GetChecker() const;
     /**
      * Set the value of this GlobalValue.
-     * \param [in] value the new value to set in this GlobalValue.
-     * \returns \c true if the Global Value was set successfully.
+     * @param [in] value the new value to set in this GlobalValue.
+     * @returns \c true if the Global Value was set successfully.
      */
     bool SetValue(const AttributeValue& value);
 
@@ -121,8 +121,8 @@
      * Iterate over the set of GlobalValues until a matching name is found
      * and then set its value with GlobalValue::SetValue.
      *
-     * \param [in] name the name of the global value
-     * \param [in] value the value to set in the requested global value.
+     * @param [in] name the name of the global value
+     * @param [in] value the value to set in the requested global value.
      *
      * This method cannot fail. It will crash if the input is not valid.
      */
@@ -132,31 +132,31 @@
      * Iterate over the set of GlobalValues until a matching name is found
      * and then set its value with GlobalValue::SetValue.
      *
-     * \param [in] name the name of the global value
-     * \param [in] value the value to set in the requested global value.
-     * \returns \c true if the value could be set successfully,
+     * @param [in] name the name of the global value
+     * @param [in] value the value to set in the requested global value.
+     * @returns \c true if the value could be set successfully,
      *          \c false otherwise.
      */
     static bool BindFailSafe(std::string name, const AttributeValue& value);
 
     /**
      * The Begin iterator.
-     * \returns An iterator which represents a pointer to the first GlobalValue registered.
+     * @returns An iterator which represents a pointer to the first GlobalValue registered.
      */
     static Iterator Begin();
     /**
      * The End iterator.
-     * \returns An iterator which represents a pointer to the last GlobalValue registered.
+     * @returns An iterator which represents a pointer to the last GlobalValue registered.
      */
     static Iterator End();
 
     /**
      * Finds the GlobalValue with the given name and returns its value
      *
-     * \param [in] name the name of the GlobalValue to be found
-     * \param [out] value where to store the value of the found GlobalValue
+     * @param [in] name the name of the GlobalValue to be found
+     * @param [out] value where to store the value of the found GlobalValue
      *
-     * \return \c true if the GlobalValue was found, \c false otherwise
+     * @return \c true if the GlobalValue was found, \c false otherwise
      */
     static bool GetValueByNameFailSafe(std::string name, AttributeValue& value);
 
@@ -167,8 +167,8 @@
      * This method cannot fail, i.e., it will trigger a
      * NS_FATAL_ERROR if the requested GlobalValue is not found.
      *
-     * \param [in] name the name of the GlobalValue to be found
-     * \param [out] value where to store the value of the found GlobalValue
+     * @param [in] name the name of the GlobalValue to be found
+     * @param [out] value where to store the value of the found GlobalValue
      */
     static void GetValueByName(std::string name, AttributeValue& value);
 
@@ -179,7 +179,7 @@
     /**
      * Get the static vector of all GlobalValues.
      *
-     * \returns The vector.
+     * @returns The vector.
      */
     static Vector* GetVector();
     /** Initialize from the \c NS_GLOBAL_VALUE environment variable. */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/hash.cc ns-3.44/src/core/model/hash.cc
--- ns-3.43/src/core/model/hash.cc	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/hash.cc	2025-03-09 16:55:49.359371000 -0700
@@ -11,9 +11,9 @@
 #include "log.h"
 
 /**
- * \file
- * \ingroup hash
- * \brief ns3::Hasher implementation.
+ * @file
+ * @ingroup hash
+ * @brief ns3::Hasher implementation.
  */
 
 namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/hash-fnv.cc ns-3.44/src/core/model/hash-fnv.cc
--- ns-3.43/src/core/model/hash-fnv.cc	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/hash-fnv.cc	2025-03-09 16:55:49.359371000 -0700
@@ -26,9 +26,9 @@
 #include <sys/types.h>
 
 /**
- * \file
- * \ingroup hash
- * \brief ns3::Hash::Function::Fnv1a implementation.
+ * @file
+ * @ingroup hash
+ * @brief ns3::Hash::Function::Fnv1a implementation.
  */
 
 namespace ns3
@@ -51,8 +51,8 @@
  ************************************************/
 
 /**
- * \ingroup hash
- * \defgroup hash_fnv FNV Hash Implementation
+ * @ingroup hash
+ * @defgroup hash_fnv FNV Hash Implementation
  */
 /**@{*/
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/hash-fnv.h ns-3.44/src/core/model/hash-fnv.h
--- ns-3.43/src/core/model/hash-fnv.h	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/hash-fnv.h	2025-03-09 16:55:49.359371000 -0700
@@ -12,9 +12,9 @@
 #include "hash-function.h"
 
 /**
- * \file
- * \ingroup hash
- * \brief ns3::Hash::Function::Fnv1a declaration.
+ * @file
+ * @ingroup hash
+ * @brief ns3::Hash::Function::Fnv1a declaration.
  */
 
 namespace ns3
@@ -27,9 +27,9 @@
 {
 
 /**
- *  \ingroup hash
+ *  @ingroup hash
  *
- *  \brief Fnv1a hash function implementation
+ *  @brief Fnv1a hash function implementation
  *
  *  This is the venerable Fowler-Noll-Vo hash, version 1A.  (See the
  *  <a href="http://isthe.com/chongo/tech/comp/fnv/">FNV page</a>.)
@@ -58,9 +58,9 @@
      * you can hash successive buffers.  The final return value
      * will be the cumulative hash across all calls.
      *
-     * \param [in] buffer pointer to the beginning of the buffer
-     * \param [in] size length of the buffer, in bytes
-     * \return 32-bit hash of the buffer
+     * @param [in] buffer pointer to the beginning of the buffer
+     * @param [in] size length of the buffer, in bytes
+     * @return 32-bit hash of the buffer
      */
     uint32_t GetHash32(const char* buffer, const size_t size) override;
     /**
@@ -73,9 +73,9 @@
      * you can hash successive buffers.  The final return value
      * will be the cumulative hash across all calls.
      *
-     * \param [in] buffer pointer to the beginning of the buffer
-     * \param [in] size length of the buffer, in bytes
-     * \return 64-bit hash of the buffer
+     * @param [in] buffer pointer to the beginning of the buffer
+     * @param [in] size length of the buffer, in bytes
+     * @return 64-bit hash of the buffer
      */
     uint64_t GetHash64(const char* buffer, const size_t size) override;
     /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/hash-function.cc ns-3.44/src/core/model/hash-function.cc
--- ns-3.43/src/core/model/hash-function.cc	2024-10-09 16:41:09.856655800 -0700
+++ ns-3.44/src/core/model/hash-function.cc	2025-03-09 16:55:49.359371000 -0700
@@ -11,9 +11,9 @@
 #include "log.h"
 
 /**
- * \file
- * \ingroup hash
- * \brief ns3::Hash::Implementation::GetHash64 default implementation.
+ * @file
+ * @ingroup hash
+ * @brief ns3::Hash::Implementation::GetHash64 default implementation.
  */
 
 namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/hash-function.h ns-3.44/src/core/model/hash-function.h
--- ns-3.43/src/core/model/hash-function.h	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/hash-function.h	2025-03-09 16:55:49.359371000 -0700
@@ -14,9 +14,9 @@
 #include <cstring> // memcpy
 
 /**
- * \file
- * \ingroup hash
- * \brief ns3::Hash::Implementation, ns3::Hash::Function::Hash32 and
+ * @file
+ * @ingroup hash
+ * @brief ns3::Hash::Implementation, ns3::Hash::Function::Hash32 and
  * ns3::Hash::Function::Hash64 declarations.
  */
 
@@ -24,16 +24,16 @@
 {
 
 /**
- * \ingroup hash
+ * @ingroup hash
  * Hash function implementations
  */
 namespace Hash
 {
 
 /**
- * \ingroup hash
+ * @ingroup hash
  *
- * \brief Hash function implementation base class.
+ * @brief Hash function implementation base class.
  */
 class Implementation : public SimpleRefCount<Implementation>
 {
@@ -48,9 +48,9 @@
      * you can hash successive buffers.  The final return value
      * will be the cumulative hash across all calls.
      *
-     * \param [in] buffer Pointer to the beginning of the buffer.
-     * \param [in] size Length of the buffer, in bytes.
-     * \return 32-bit hash of the buffer.
+     * @param [in] buffer Pointer to the beginning of the buffer.
+     * @param [in] size Length of the buffer, in bytes.
+     * @return 32-bit hash of the buffer.
      */
     virtual uint32_t GetHash32(const char* buffer, const std::size_t size) = 0;
     /**
@@ -65,9 +65,9 @@
      * you can hash successive buffers.  The final return value
      * will be the cumulative hash across all calls.
      *
-     * \param [in] buffer Pointer to the beginning of the buffer.
-     * \param [in] size Length of the buffer, in bytes.
-     * \return 64-bit hash of the buffer.
+     * @param [in] buffer Pointer to the beginning of the buffer.
+     * @param [in] size Length of the buffer, in bytes.
+     * @return 64-bit hash of the buffer.
      */
     virtual uint64_t GetHash64(const char* buffer, const std::size_t size);
     /**
@@ -97,9 +97,9 @@
 
 /**
  *
- * \ingroup hash
+ * @ingroup hash
  *
- * \brief Function pointer signatures for basic hash functions.
+ * @brief Function pointer signatures for basic hash functions.
  *
  * See Hash::Function::Hash32 or Hash::Function::Hash64
  * @{
@@ -110,16 +110,16 @@
 /**@}*/
 
 /**
- * \ingroup hash
+ * @ingroup hash
  * Hash functions.
  */
 namespace Function
 {
 
 /**
- * \ingroup hash
+ * @ingroup hash
  *
- * \brief Template for creating a Hash::Implementation from
+ * @brief Template for creating a Hash::Implementation from
  * a 32-bit hash function.
  */
 class Hash32 : public Implementation
@@ -128,7 +128,7 @@
     /**
      * Constructor from a 32-bit hash function pointer.
      *
-     * \param [in] hp Function pointer to a 32-bit hash function.
+     * @param [in] hp Function pointer to a 32-bit hash function.
      */
     Hash32(Hash32Function_ptr hp)
         : m_fp(hp)
@@ -149,9 +149,9 @@
 };                           // Hash32
 
 /**
- * \ingroup hash
+ * @ingroup hash
  *
- * \brief Template for creating a Hash::Implementation from
+ * @brief Template for creating a Hash::Implementation from
  * a 64-bit hash function.
  */
 class Hash64 : public Implementation
@@ -160,7 +160,7 @@
     /**
      * Constructor from a 64-bit hash function pointer.
      *
-     * \param [in] hp Function pointer to a 64-bit hash function.
+     * @param [in] hp Function pointer to a 64-bit hash function.
      */
     Hash64(Hash64Function_ptr hp)
         : m_fp(hp)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/hash.h ns-3.44/src/core/model/hash.h
--- ns-3.43/src/core/model/hash.h	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/hash.h	2025-03-09 16:55:49.359371000 -0700
@@ -18,27 +18,27 @@
 #include <string>
 
 /**
- * \file
- * \ingroup hash
- * \brief ns3::Hasher, ns3::Hash32() and ns3::Hash64() function declarations.
+ * @file
+ * @ingroup hash
+ * @brief ns3::Hasher, ns3::Hash32() and ns3::Hash64() function declarations.
  */
 
 namespace ns3
 {
 
 /**
- * \ingroup core
- * \defgroup hash Hash Functions
+ * @ingroup core
+ * @defgroup hash Hash Functions
  *
- * \brief Generic Hash function interface.
+ * @brief Generic Hash function interface.
  *
  * See \ref Hasher for main entry point.
  * See \ref hash-example.cc for example usage.
  */
 /**
- *  \ingroup hash
+ *  @ingroup hash
  *
- *  \brief Generic Hash function interface.
+ *  @brief Generic Hash function interface.
  *
  *  This class provides a generic interface for computing hashes
  *  of buffers.  Various getters return hashes of different lengths.
@@ -51,10 +51,10 @@
  *  will be the cumulative hash across all calls.
  *
  *  The choice of hash function can be made at construction by
- *    \code
+ *    @code
  *    Hasher hasher = Hasher ( Create<Hash::Function::Fnv1a> () );
  *    uint32_t hash = Hasher.GetHash32 (data);
- *    \endcode
+ *    @endcode
  *
  *  The available implementations are documented in \ref hash.
  *  The default implementation is Murmur3.  FNV1a is also available.
@@ -62,7 +62,7 @@
  *  In addition to this class interface, global functions are
  *  defined which use the default hash implementation.
  *
- * \internal
+ * @internal
  *
  *  Would be nice to offer longer hashes.  \c uint128_t looks doable,
  *  except that our fallback \c int64x64_t implementation doesn't
@@ -82,7 +82,7 @@
     /**
      * Constructor using the supplied implementation.
      *
-     * \param [in] hp Ptr<Hash::Implementation> to the desired implementation.
+     * @param [in] hp Ptr<Hash::Implementation> to the desired implementation.
      */
     Hasher(Ptr<Hash::Implementation> hp);
     /**
@@ -95,9 +95,9 @@
      * you can hash successive buffers.  The final return value
      * will be the cumulative hash across all calls.
      *
-     * \param [in] buffer Pointer to the beginning of the buffer.
-     * \param [in] size Length of the buffer, in bytes.
-     * \return 32-bit hash of the buffer..
+     * @param [in] buffer Pointer to the beginning of the buffer.
+     * @param [in] size Length of the buffer, in bytes.
+     * @return 32-bit hash of the buffer..
      */
     uint32_t GetHash32(const char* buffer, const std::size_t size);
     /**
@@ -110,9 +110,9 @@
      * you can hash successive buffers.  The final return value
      * will be the cumulative hash across all calls.
      *
-     * \param [in] buffer Pointer to the beginning of the buffer.
-     * \param [in] size Length of the buffer, in bytes.
-     * \return 64-bit hash of the buffer.
+     * @param [in] buffer Pointer to the beginning of the buffer.
+     * @param [in] size Length of the buffer, in bytes.
+     * @return 64-bit hash of the buffer.
      */
     uint64_t GetHash64(const char* buffer, const std::size_t size);
 
@@ -126,8 +126,8 @@
      * you can hash successive strings.  The final return value
      * will be the cumulative hash across all calls.
      *
-     * \param [in] s String to hash.
-     * \return 32-bit hash of the string.
+     * @param [in] s String to hash.
+     * @return 32-bit hash of the string.
      */
     uint32_t GetHash32(const std::string s);
     /**
@@ -140,8 +140,8 @@
      * you can hash successive strings.  The final return value
      * will be the cumulative hash across all calls.
      *
-     * \param [in] s String to hash.
-     * \return 64-bit hash of the string.
+     * @param [in] s String to hash.
+     * @return 64-bit hash of the string.
      */
     uint64_t GetHash64(const std::string s);
     /**
@@ -149,14 +149,14 @@
      *
      * Returning this Hasher allows code like this:
      *
-     * \code
+     * @code
      *   Hasher h;
      *   h.GetHash32 (...);
      *   ...
      *   h.clear ().GetHash64 (...);
-     * \endcode
+     * @endcode
      *
-     * \return This hasher.
+     * @return This hasher.
      */
     Hasher& clear();
 
@@ -169,42 +169,42 @@
  ************************************************/
 
 /**
- * \ingroup hash
+ * @ingroup hash
  *
  * Compute 32-bit hash of a byte buffer, using the default hash function.
  *
- * \param [in] buffer Pointer to the beginning of the buffer.
- * \param [in] size Length of the buffer, in bytes.
- * \return 32-bit hash of the buffer.
+ * @param [in] buffer Pointer to the beginning of the buffer.
+ * @param [in] size Length of the buffer, in bytes.
+ * @return 32-bit hash of the buffer.
  */
 uint32_t Hash32(const char* buffer, const std::size_t size);
 /**
- * \ingroup hash
+ * @ingroup hash
  *
  * Compute 64-bit hash of a byte buffer, using the default hash function.
  *
- * \param [in] buffer Pointer to the beginning of the buffer.
- * \param [in] size Length of the buffer, in bytes.
- * \return 64-bit hash of the buffer.
+ * @param [in] buffer Pointer to the beginning of the buffer.
+ * @param [in] size Length of the buffer, in bytes.
+ * @return 64-bit hash of the buffer.
  */
 uint64_t Hash64(const char* buffer, const std::size_t size);
 
 /**
- * \ingroup hash
+ * @ingroup hash
  *
  * Compute 32-bit hash of a string, using the default hash function.
  *
- * \param [in] s String to hash.
- * \return 32-bit hash of the string.
+ * @param [in] s String to hash.
+ * @return 32-bit hash of the string.
  */
 uint32_t Hash32(const std::string s);
 /**
- * \ingroup hash
+ * @ingroup hash
  *
  * Compute 64-bit hash of a string, using the default hash function.
  *
- * \param [in] s String to hash.
- * \return 64-bit hash of the string.
+ * @param [in] s String to hash.
+ * @return 64-bit hash of the string.
  */
 uint64_t Hash64(const std::string s);
 
@@ -254,8 +254,8 @@
 */
 
 /**
- * \brief Get a reference to the static global hasher at g_hasher
- * \return Reference to the static Hasher instance.
+ * @brief Get a reference to the static global hasher at g_hasher
+ * @return Reference to the static Hasher instance.
  */
 Hasher& GetStaticHash();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/hash-murmur3.cc ns-3.44/src/core/model/hash-murmur3.cc
--- ns-3.43/src/core/model/hash-murmur3.cc	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/hash-murmur3.cc	2025-03-09 16:55:49.359371000 -0700
@@ -29,9 +29,9 @@
 #include <iomanip>
 
 /**
- * \file
- * \ingroup hash
- * \brief ns3::Hash::Function::Murmur3 implementation.
+ * @file
+ * @ingroup hash
+ * @brief ns3::Hash::Function::Murmur3 implementation.
  */
 
 namespace ns3
@@ -50,8 +50,8 @@
 {
 
 /**
- * \ingroup hash
- * \defgroup hash_murmur3 Murmur3 Hash Implementation
+ * @ingroup hash
+ * @defgroup hash_murmur3 Murmur3 Hash Implementation
  */
 /**@{*/
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/hash-murmur3.h ns-3.44/src/core/model/hash-murmur3.h
--- ns-3.43/src/core/model/hash-murmur3.h	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/hash-murmur3.h	2025-03-09 16:55:49.359371000 -0700
@@ -12,9 +12,9 @@
 #include "hash-function.h"
 
 /**
- * \file
- * \ingroup hash
- * \brief ns3::Hash::Function::Murmur3 declaration.
+ * @file
+ * @ingroup hash
+ * @brief ns3::Hash::Function::Murmur3 declaration.
  */
 
 namespace ns3
@@ -27,9 +27,9 @@
 {
 
 /**
- *  \ingroup hash
+ *  @ingroup hash
  *
- *  \brief Murmur3 hash function implementation
+ *  @brief Murmur3 hash function implementation
  *
  *  Adapted from http://code.google.com/p/smhasher/
  *
@@ -58,9 +58,9 @@
      * you can hash successive buffers.  The final return value
      * will be the cumulative hash across all calls.
      *
-     * \param [in] buffer pointer to the beginning of the buffer
-     * \param [in] size length of the buffer, in bytes
-     * \return 32-bit hash of the buffer
+     * @param [in] buffer pointer to the beginning of the buffer
+     * @param [in] size length of the buffer, in bytes
+     * @return 32-bit hash of the buffer
      */
     uint32_t GetHash32(const char* buffer, const std::size_t size) override;
     /**
@@ -73,9 +73,9 @@
      * you can hash successive buffers.  The final return value
      * will be the cumulative hash across all calls.
      *
-     * \param [in] buffer pointer to the beginning of the buffer
-     * \param [in] size length of the buffer, in bytes
-     * \return 64-bit hash of the buffer
+     * @param [in] buffer pointer to the beginning of the buffer
+     * @param [in] size length of the buffer, in bytes
+     * @return 64-bit hash of the buffer
      */
     uint64_t GetHash64(const char* buffer, const std::size_t size) override;
     /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/heap-scheduler.cc ns-3.44/src/core/model/heap-scheduler.cc
--- ns-3.43/src/core/model/heap-scheduler.cc	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/heap-scheduler.cc	2025-03-09 16:55:49.359371000 -0700
@@ -15,8 +15,8 @@
 #include "log.h"
 
 /**
- * \file
- * \ingroup scheduler
+ * @file
+ * @ingroup scheduler
  * Implementation of ns3::HeapScheduler class.
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/heap-scheduler.h ns-3.44/src/core/model/heap-scheduler.h
--- ns-3.43/src/core/model/heap-scheduler.h	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/heap-scheduler.h	2025-03-09 16:55:49.359371000 -0700
@@ -15,8 +15,8 @@
 #include <vector>
 
 /**
- * \file
- * \ingroup scheduler
+ * @file
+ * @ingroup scheduler
  * ns3::HeapScheduler declaration.
  */
 
@@ -24,8 +24,8 @@
 {
 
 /**
- * \ingroup scheduler
- * \brief a binary heap event scheduler
+ * @ingroup scheduler
+ * @brief a binary heap event scheduler
  *
  * This code started as a c++ translation of a Java-based code written in 2005
  * to implement a heap sort. So, this binary heap is really a pretty
@@ -42,7 +42,7 @@
  *  - It uses a slightly non-standard while loop for top-down heapify
  *    to move one if statement out of the loop.
  *
- * \par Time Complexity
+ * @par Time Complexity
  *
  * Operation    | Amortized %Time | Reason
  * :----------- | :-------------- | :-----
@@ -52,7 +52,7 @@
  * Remove()     | Logarithmic     | Search, heapify
  * RemoveNext() | Logarithmic     | Heapify
  *
- * \par Memory Complexity
+ * @par Memory Complexity
  *
  * Category  | Memory                           | Reason
  * :-------- | :------------------------------- | :-----
@@ -64,7 +64,7 @@
   public:
     /**
      *  Register this type.
-     *  \return The object TypeId.
+     *  @return The object TypeId.
      */
     static TypeId GetTypeId();
 
@@ -87,77 +87,77 @@
     /**
      * Get the parent index of a given entry.
      *
-     * \param [in] id The child index.
-     * \return The index of the parent of \pname{id}.
+     * @param [in] id The child index.
+     * @return The index of the parent of \pname{id}.
      */
     inline std::size_t Parent(std::size_t id) const;
     /**
      * Get the next sibling of a given entry.
      *
-     * \param [in] id The starting index.
-     * \returns The next sibling of \pname{id}.
+     * @param [in] id The starting index.
+     * @returns The next sibling of \pname{id}.
      */
     std::size_t Sibling(std::size_t id) const;
     /**
      * Get the left child of a given entry.
      *
-     * \param [in] id The parent index.
-     * \returns The index of the left (first) child.
+     * @param [in] id The parent index.
+     * @returns The index of the left (first) child.
      */
     inline std::size_t LeftChild(std::size_t id) const;
     /**
      * Get the right child index of a given entry.
      *
-     * \param [in] id The parent index.
-     * \returns The index of the right (second) child.
+     * @param [in] id The parent index.
+     * @returns The index of the right (second) child.
      */
     inline std::size_t RightChild(std::size_t id) const;
     /**
      * Get the root index of the heap.
      *
-     * \returns The root index.
+     * @returns The root index.
      */
     inline std::size_t Root() const;
     /**
      * Return the index of the last element.
-     * \returns The last index.
+     * @returns The last index.
      */
     std::size_t Last() const;
     /**
      * Test if an index is the root.
      *
-     * \param [in] id The index to test.
-     * \returns \c true if the \pname{id} is the root.
+     * @param [in] id The index to test.
+     * @returns \c true if the \pname{id} is the root.
      */
     inline bool IsRoot(std::size_t id) const;
     /**
      * Test if an index is at the bottom of the heap.
      *
-     * \param [in] id The index to test.
-     * \returns \c true if the index is at the bottom.
+     * @param [in] id The index to test.
+     * @returns \c true if the index is at the bottom.
      */
     inline bool IsBottom(std::size_t id) const;
     /**
      * Compare (less than) two items.
      *
-     * \param [in] a The first item.
-     * \param [in] b The second item.
-     * \returns \c true if \c a < \c b
+     * @param [in] a The first item.
+     * @param [in] b The second item.
+     * @returns \c true if \c a < \c b
      */
     inline bool IsLessStrictly(std::size_t a, std::size_t b) const;
     /**
      * Minimum of two items.
      *
-     * \param [in] a The first item.
-     * \param [in] b The second item.
-     * \returns The smaller of the two items.
+     * @param [in] a The first item.
+     * @param [in] b The second item.
+     * @returns The smaller of the two items.
      */
     inline std::size_t Smallest(std::size_t a, std::size_t b) const;
     /**
      * Swap two items.
      *
-     * \param [in] a The first item.
-     * \param [in] b The second item.
+     * @param [in] a The first item.
+     * @param [in] b The second item.
      */
     inline void Exch(std::size_t a, std::size_t b);
     /** Percolate a newly inserted Last item to its proper position. */
@@ -165,7 +165,7 @@
     /**
      * Percolate a deletion bubble down the heap.
      *
-     * \param [in] start Starting entry.
+     * @param [in] start Starting entry.
      */
     void TopDown(std::size_t start);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/int64x64-128.cc ns-3.44/src/core/model/int64x64-128.cc
--- ns-3.43/src/core/model/int64x64-128.cc	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/int64x64-128.cc	2025-03-09 16:55:49.359371000 -0700
@@ -13,8 +13,8 @@
 #if defined(INT64X64_USE_128) && !defined(PYTHON_SCAN)
 
 /**
- * \file
- * \ingroup highprec
+ * @file
+ * @ingroup highprec
  * Implementation of the ns3::int64x64_t type using a native int128_t type.
  */
 
@@ -27,15 +27,15 @@
 NS_LOG_COMPONENT_DEFINE("int64x64-128");
 
 /**
- * \ingroup highprec
+ * @ingroup highprec
  * Compute the sign of the result of multiplying or dividing
  * Q64.64 fixed precision operands.
  *
- * \param [in]  sa The signed value of the first operand.
- * \param [in]  sb The signed value of the second operand.
- * \param [out] ua The unsigned magnitude of the first operand.
- * \param [out] ub The unsigned magnitude of the second operand.
- * \returns \c true if the result will be negative.
+ * @param [in]  sa The signed value of the first operand.
+ * @param [in]  sb The signed value of the second operand.
+ * @param [out] ua The unsigned magnitude of the first operand.
+ * @param [out] ub The unsigned magnitude of the second operand.
+ * @returns \c true if the result will be negative.
  */
 static inline bool
 output_sign(const int128_t sa, const int128_t sb, uint128_t& ua, uint128_t& ub)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/int64x64-128.h ns-3.44/src/core/model/int64x64-128.h
--- ns-3.43/src/core/model/int64x64-128.h	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/int64x64-128.h	2025-03-09 16:55:49.359371000 -0700
@@ -10,7 +10,7 @@
 #include "ns3/core-config.h"
 
 /**
- * \ingroup highprec
+ * @ingroup highprec
  * Use uint128_t for int64x64_t implementation
  */
 #if defined(INT64X64_USE_128) && !defined(PYTHON_SCAN)
@@ -20,7 +20,7 @@
 
 #if defined(HAVE___UINT128_T) && !defined(HAVE_UINT128_T)
 /**
- * \ingroup highprec
+ * @ingroup highprec
  * Some compilers do not have this defined, so we define it.
  * @{
  */
@@ -30,8 +30,8 @@
 #endif
 
 /**
- * \file
- * \ingroup highprec
+ * @file
+ * @ingroup highprec
  * Declaration of the ns3::int64x64_t type using a native int128_t type.
  */
 
@@ -39,7 +39,7 @@
 {
 
 /**
- * \internal
+ * @internal
  * The implementation documented here is based on native 128-bit integers.
  */
 class int64x64_t
@@ -77,13 +77,13 @@
     }
 
     /**
-     * \name Construct from a floating point value.
+     * @name Construct from a floating point value.
      */
     /**
      * @{
      * Constructor from a floating point.
      *
-     * \param [in] value Floating value to represent.
+     * @param [in] value Floating value to represent.
      */
     inline int64x64_t(const double value)
     {
@@ -123,13 +123,13 @@
     /**@}*/
 
     /**
-     * \name Construct from an integral type.
+     * @name Construct from an integral type.
      */
     /**@{*/
     /**
      * Construct from an integral type.
      *
-     * \param [in] v Integer value to represent.
+     * @param [in] v Integer value to represent.
      */
     inline int64x64_t(const int v)
         : _v(v)
@@ -172,8 +172,8 @@
     /**
      * Construct from explicit high and low values.
      *
-     * \param [in] hi Integer portion.
-     * \param [in] lo Fractional portion, already scaled to HP_MAX_64.
+     * @param [in] hi Integer portion.
+     * @param [in] lo Fractional portion, already scaled to HP_MAX_64.
      */
     explicit inline int64x64_t(const int64_t hi, const uint64_t lo)
     {
@@ -184,7 +184,7 @@
     /**
      * Copy constructor.
      *
-     * \param [in] o Value to copy.
+     * @param [in] o Value to copy.
      */
     inline int64x64_t(const int64x64_t& o)
         : _v(o._v)
@@ -194,8 +194,8 @@
     /**
      * Assignment.
      *
-     * \param [in] o Value to assign to this int64x64_t.
-     * \returns This int64x64_t.
+     * @param [in] o Value to assign to this int64x64_t.
+     * @returns This int64x64_t.
      */
     inline int64x64_t& operator=(const int64x64_t& o)
     {
@@ -212,7 +212,7 @@
     /**
      * Get this value as a double.
      *
-     * \return This value in floating form.
+     * @return This value in floating form.
      */
     inline double GetDouble() const
     {
@@ -230,7 +230,7 @@
     /**
      * Get the integer portion.
      *
-     * \return The integer portion of this value.
+     * @return The integer portion of this value.
      */
     inline int64_t GetHigh() const
     {
@@ -241,7 +241,7 @@
     /**
      * Get the fractional portion of this value, unscaled.
      *
-     * \return The fractional portion, unscaled, as an integer.
+     * @return The fractional portion, unscaled, as an integer.
      */
     inline uint64_t GetLow() const
     {
@@ -252,7 +252,7 @@
     /**
      * Truncate to an integer.
      * Truncation is always toward zero,
-     * \return The value truncated toward zero.
+     * @return The value truncated toward zero.
      */
     int64_t GetInt() const
     {
@@ -267,7 +267,7 @@
      * Round to the nearest int.
      * Similar to std::round this rounds halfway cases away from zero,
      * regardless of the current (floating) rounding mode.
-     * \return The value rounded to the nearest int.
+     * @return The value rounded to the nearest int.
      */
     int64_t Round() const
     {
@@ -284,9 +284,9 @@
      * Multiply this value by a Q0.128 value, presumably representing an inverse,
      * completing a division operation.
      *
-     * \param [in] o The inverse operand.
+     * @param [in] o The inverse operand.
      *
-     * \see Invert()
+     * @see Invert()
      */
     void MulByInvert(const int64x64_t& o);
 
@@ -300,22 +300,22 @@
      *
      * (Really this should be a separate type representing Q0.128.)
      *
-     * \param [in] v The value to compute the inverse of.
-     * \return A Q0.128 representation of the inverse.
+     * @param [in] v The value to compute the inverse of.
+     * @return A Q0.128 representation of the inverse.
      */
     static int64x64_t Invert(const uint64_t v);
 
   private:
     /**
-     * \name Arithmetic Operators
+     * @name Arithmetic Operators
      * Arithmetic operators for int64x64_t.
      */
     /**
      * @{
      * Arithmetic operator.
-     * \param [in] lhs Left hand argument
-     * \param [in] rhs Right hand argument
-     * \return The result of the operator.
+     * @param [in] lhs Left hand argument
+     * @param [in] rhs Right hand argument
+     * @return The result of the operator.
      */
 
     friend inline bool operator==(const int64x64_t& lhs, const int64x64_t& rhs)
@@ -360,14 +360,14 @@
     /**@}*/
 
     /**
-     * \name Unary Operators
+     * @name Unary Operators
      * Unary operators for int64x64_t.
      */
     /**
      * @{
      * Unary operator.
-     * \param [in] lhs Left hand argument
-     * \return The result of the operator.
+     * @param [in] lhs Left hand argument
+     * @return The result of the operator.
      */
     friend inline int64x64_t operator+(const int64x64_t& lhs)
     {
@@ -392,13 +392,13 @@
      * Implement `*=`.
      * We assert if the product cannot be encoded in int64x64_t.
      *
-     * \param [in] o The other factor.
+     * @param [in] o The other factor.
      */
     void Mul(const int64x64_t& o);
     /**
      * Implement `/=`.
      *
-     * \param [in] o The divisor.
+     * @param [in] o The divisor.
      */
     void Div(const int64x64_t& o);
     /**
@@ -408,11 +408,11 @@
      * we keep the central 128 bits, representing the Q64.64 result.
      * We might assert if the result, in uint128_t format, exceeds 2^127.
      *
-     * \param [in] a First factor.
-     * \param [in] b Second factor.
-     * \return The Q64.64 product.
+     * @param [in] a First factor.
+     * @param [in] b Second factor.
+     * @return The Q64.64 product.
      *
-     * \internal
+     * @internal
      *
      * It might be tempting to just use \pname{a} `*` \pname{b}
      * and be done with it, but it's not that simple.  With \pname{a}
@@ -429,19 +429,19 @@
     /**
      * Unsigned division of Q64.64 values.
      *
-     * \param [in] a Numerator.
-     * \param [in] b Denominator.
-     * \return The Q64.64 representation of `a / b`.
+     * @param [in] a Numerator.
+     * @param [in] b Denominator.
+     * @return The Q64.64 representation of `a / b`.
      */
     static uint128_t Udiv(const uint128_t a, const uint128_t b);
     /**
      * Unsigned multiplication of Q64.64 and Q0.128 values.
      *
-     * \param [in] a The numerator, a Q64.64 value.
-     * \param [in] b The inverse of the denominator, a Q0.128 value
-     * \return The product `a * b`, representing the ration `a / b^-1`.
+     * @param [in] a The numerator, a Q64.64 value.
+     * @param [in] b The inverse of the denominator, a Q0.128 value
+     * @return The product `a * b`, representing the ration `a / b^-1`.
      *
-     * \see Invert()
+     * @see Invert()
      */
     static uint128_t UmulByInvert(const uint128_t a, const uint128_t b);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/int64x64-cairo.cc ns-3.44/src/core/model/int64x64-cairo.cc
--- ns-3.43/src/core/model/int64x64-cairo.cc	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/int64x64-cairo.cc	2025-03-09 16:55:49.359371000 -0700
@@ -24,8 +24,8 @@
 }
 
 /**
- * \file
- * \ingroup highprec
+ * @file
+ * @ingroup highprec
  * Implementation of the ns3::int64x64_t type using the Cairo implementation.
  */
 
@@ -38,15 +38,15 @@
 NS_LOG_COMPONENT_DEFINE("int64x64-cairo");
 
 /**
- * \ingroup highprec
+ * @ingroup highprec
  * Compute the sign of the result of multiplying or dividing
  * Q64.64 fixed precision operands.
  *
- * \param [in]  sa The signed value of the first operand.
- * \param [in]  sb The signed value of the second operand.
- * \param [out] ua The unsigned magnitude of the first operand.
- * \param [out] ub The unsigned magnitude of the second operand.
- * \returns True if the result will be negative.
+ * @param [in]  sa The signed value of the first operand.
+ * @param [in]  sb The signed value of the second operand.
+ * @param [out] ua The unsigned magnitude of the first operand.
+ * @param [out] ub The unsigned magnitude of the second operand.
+ * @returns True if the result will be negative.
  */
 static inline bool
 output_sign(const cairo_int128_t sa,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/int64x64-cairo.h ns-3.44/src/core/model/int64x64-cairo.h
--- ns-3.43/src/core/model/int64x64-cairo.h	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/int64x64-cairo.h	2025-03-09 16:55:49.359371000 -0700
@@ -17,8 +17,8 @@
 #include <cmath> // pow
 
 /**
- * \file
- * \ingroup highprec
+ * @file
+ * @ingroup highprec
  * Declaration of the ns3::int64x64_t type using the Cairo implementation.
  */
 
@@ -26,7 +26,7 @@
 {
 
 /**
- * \internal
+ * @internal
  * The implementation documented here uses cairo 128-bit integers.
  */
 class int64x64_t
@@ -65,13 +65,13 @@
     }
 
     /**
-     * \name Construct from a floating point value.
+     * @name Construct from a floating point value.
      */
     /**
      * @{
      * Constructor from a floating point.
      *
-     * \param [in] value Floating value to represent.
+     * @param [in] value Floating value to represent.
      */
     inline int64x64_t(const double value)
     {
@@ -111,13 +111,13 @@
     /**@}*/
 
     /**
-     * \name Construct from an integral type.
+     * @name Construct from an integral type.
      */
     /**@{*/
     /**
      * Construct from an integral type.
      *
-     * \param [in] v Integer value to represent
+     * @param [in] v Integer value to represent
      */
     inline int64x64_t(const int v)
     {
@@ -159,8 +159,8 @@
     /**
      * Construct from explicit high and low values.
      *
-     * \param [in] hi Integer portion.
-     * \param [in] lo Fractional portion, already scaled to HP_MAX_64.
+     * @param [in] hi Integer portion.
+     * @param [in] lo Fractional portion, already scaled to HP_MAX_64.
      */
     explicit inline int64x64_t(const int64_t hi, const uint64_t lo)
     {
@@ -171,7 +171,7 @@
     /**
      * Copy constructor.
      *
-     * \param [in] o Value to copy.
+     * @param [in] o Value to copy.
      */
     inline int64x64_t(const int64x64_t& o)
         : _v(o._v)
@@ -181,8 +181,8 @@
     /**
      * Assignment.
      *
-     * \param [in] o Value to assign to this int64x64_t.
-     * \returns a copy of \pname{o}
+     * @param [in] o Value to assign to this int64x64_t.
+     * @returns a copy of \pname{o}
      */
     inline int64x64_t& operator=(const int64x64_t& o)
     {
@@ -199,7 +199,7 @@
     /**
      * Get this value as a double.
      *
-     * \return This value in floating form.
+     * @return This value in floating form.
      */
     inline double GetDouble() const
     {
@@ -216,7 +216,7 @@
     /**
      * Get the integer portion.
      *
-     * \return The integer portion of this value.
+     * @return The integer portion of this value.
      */
     inline int64_t GetHigh() const
     {
@@ -226,7 +226,7 @@
     /**
      * Get the fractional portion of this value, unscaled.
      *
-     * \return The fractional portion, unscaled, as an integer.
+     * @return The fractional portion, unscaled, as an integer.
      */
     inline uint64_t GetLow() const
     {
@@ -236,7 +236,7 @@
     /**
      * Truncate to an integer.
      * Truncation is always toward zero,
-     * \return The value truncated toward zero.
+     * @return The value truncated toward zero.
      */
     int64_t GetInt() const
     {
@@ -251,7 +251,7 @@
      * Round to the nearest int.
      * Similar to std::round this rounds halfway cases away from zero,
      * regardless of the current (floating) rounding mode.
-     * \return The value rounded to the nearest int.
+     * @return The value rounded to the nearest int.
      */
     int64_t Round() const
     {
@@ -268,9 +268,9 @@
      * Multiply this value by a Q0.128 value, presumably representing an inverse,
      * completing a division operation.
      *
-     * \param [in] o The inverse operand.
+     * @param [in] o The inverse operand.
      *
-     * \see Invert
+     * @see Invert
      */
     void MulByInvert(const int64x64_t& o);
 
@@ -284,22 +284,22 @@
      *
      * (Really this should be a separate type representing Q0.128.)
      *
-     * \param [in] v The value to compute the inverse of.
-     * \return A Q0.128 representation of the inverse.
+     * @param [in] v The value to compute the inverse of.
+     * @return A Q0.128 representation of the inverse.
      */
     static int64x64_t Invert(const uint64_t v);
 
   private:
     /**
-     * \name Arithmetic Operators
+     * @name Arithmetic Operators
      * Arithmetic operators for int64x64_t.
      */
     /**
      * @{
      * Arithmetic operator.
-     * \param [in] lhs Left hand argument
-     * \param [in] rhs Right hand argument
-     * \return The result of the operator.
+     * @param [in] lhs Left hand argument
+     * @param [in] rhs Right hand argument
+     * @return The result of the operator.
      */
 
     friend inline bool operator==(const int64x64_t& lhs, const int64x64_t& rhs)
@@ -344,14 +344,14 @@
     /** @} */
 
     /**
-     * \name Unary Operators
+     * @name Unary Operators
      * Unary operators for int64x64_t.
      */
     /**
      * @{
      * Unary operator.
-     * \param [in] lhs Left hand argument
-     * \return The result of the operator.
+     * @param [in] lhs Left hand argument
+     * @return The result of the operator.
      */
     friend inline int64x64_t operator+(const int64x64_t& lhs)
     {
@@ -375,13 +375,13 @@
     /**
      * Implement `*=`.
      *
-     * \param [in] o The other factor.
+     * @param [in] o The other factor.
      */
     void Mul(const int64x64_t& o);
     /**
      * Implement `/=`.
      *
-     * \param [in] o The divisor.
+     * @param [in] o The divisor.
      */
     void Div(const int64x64_t& o);
     /**
@@ -391,11 +391,11 @@
      * we keep the central 128 bits, representing the Q64.64 result.
      * We assert on integer overflow beyond the 64-bit integer portion.
      *
-     * \param [in] a First factor.
-     * \param [in] b Second factor.
-     * \return The Q64.64 product.
+     * @param [in] a First factor.
+     * @param [in] b Second factor.
+     * @return The Q64.64 product.
      *
-     * \internal
+     * @internal
      *
      * It might be tempting to just use \pname{a} `*` \pname{b}
      * and be done with it, but it's not that simple.  With \pname{a}
@@ -412,19 +412,19 @@
     /**
      * Unsigned division of Q64.64 values.
      *
-     * \param [in] a Numerator.
-     * \param [in] b Denominator.
-     * \return The Q64.64 representation of `a / b`
+     * @param [in] a Numerator.
+     * @param [in] b Denominator.
+     * @return The Q64.64 representation of `a / b`
      */
     static cairo_uint128_t Udiv(const cairo_uint128_t a, const cairo_uint128_t b);
     /**
      * Unsigned multiplication of Q64.64 and Q0.128 values.
      *
-     * \param [in] a The numerator, a Q64.64 value.
-     * \param [in] b The inverse of the denominator, a Q0.128 value
-     * \return The product `a * b`, representing the ration `a / b^-1`
+     * @param [in] a The numerator, a Q64.64 value.
+     * @param [in] b The inverse of the denominator, a Q0.128 value
+     * @return The product `a * b`, representing the ration `a / b^-1`
      *
-     * \see Invert
+     * @see Invert
      */
     static cairo_uint128_t UmulByInvert(const cairo_uint128_t a, const cairo_uint128_t b);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/int64x64.cc ns-3.44/src/core/model/int64x64.cc
--- ns-3.43/src/core/model/int64x64.cc	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/int64x64.cc	2025-03-09 16:55:49.359371000 -0700
@@ -16,8 +16,8 @@
 #include <stdint.h>
 
 /**
- * \file
- * \ingroup highprec
+ * @file
+ * @ingroup highprec
  * Implementation of the streaming input and output operators for
  * the ns3::int64x64_t type.
  */
@@ -31,18 +31,18 @@
 NS_LOG_COMPONENT_DEFINE_MASK("int64x64", LOG_PREFIX_TIME);
 
 /**
- * \ingroup highprec
+ * @ingroup highprec
  * Print the high and low words of an int64x64 in hex, for debugging.
  *
- * \param [in] hi The high (integer) word.
- * \param [in] lo The low (fractional) work.
+ * @param [in] hi The high (integer) word.
+ * @param [in] lo The low (fractional) work.
  */
 #define HEXHILOW(hi, lo)                                                                           \
     std::hex << std::setfill('0') << std::right << " (0x" << std::setw(16) << hi << " "            \
              << std::setw(16) << lo << std::dec << std::setfill(' ') << std::left << ")"
 
 /**
- * \internal
+ * @internal
  * This algorithm is exact to the precision requested, up to the full
  * 64 decimal digits required to exactly represent a 64-bit fraction.
  *
@@ -158,13 +158,13 @@
 }
 
 /**
- * \ingroup highprec
+ * @ingroup highprec
  * Read the integer portion of a number from a string containing
  * just the integral digits (no decimal point or fractional part).
  *
- * \param [in] str The string representation of the integral part
+ * @param [in] str The string representation of the integral part
  *             of a number, with no fractional part or decimal point.
- * \returns    The integer.
+ * @returns    The integer.
  */
 static uint64_t
 ReadHiDigits(std::string str)
@@ -181,14 +181,14 @@
 }
 
 /**
- * \ingroup highprec
+ * @ingroup highprec
  * Read the fractional part of a number from a string containing
  * just the decimal digits of the fractional part (no integral part
  * or decimal point).
  *
- * \param [in] str The string representation of the fractional part
+ * @param [in] str The string representation of the fractional part
  *             of a number, without integral part or decimal point.
- * \returns    The decimal portion of the input number.
+ * @returns    The decimal portion of the input number.
  */
 static uint64_t
 ReadLoDigits(std::string str)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/int64x64-double.h ns-3.44/src/core/model/int64x64-double.h
--- ns-3.43/src/core/model/int64x64-double.h	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/int64x64-double.h	2025-03-09 16:55:49.359371000 -0700
@@ -17,8 +17,8 @@
 #include <utility> // pair
 
 /**
- * \file
- * \ingroup highprec
+ * @file
+ * @ingroup highprec
  * Declaration and implementation of the ns3::int64x64_t type
  * using the double type.
  */
@@ -27,7 +27,7 @@
 {
 
 /**
- * \internal
+ * @internal
  * The implementation documented here uses native long double.
  */
 class int64x64_t
@@ -63,13 +63,13 @@
     }
 
     /**
-     * \name Construct from a floating point value.
+     * @name Construct from a floating point value.
      */
     /**
      * @{
      * Constructor from a floating point.
      *
-     * \param [in] value Floating value to represent.
+     * @param [in] value Floating value to represent.
      */
     inline int64x64_t(double value)
         : _v(value)
@@ -84,13 +84,13 @@
     /**@}*/
 
     /**
-     * \name Construct from an integral type.
+     * @name Construct from an integral type.
      */
     /**@{*/
     /**
      * Construct from an integral type.
      *
-     * \param [in] v Integer value to represent
+     * @param [in] v Integer value to represent
      */
     inline int64x64_t(int v)
         : _v(v)
@@ -126,8 +126,8 @@
     /**
      * Construct from explicit high and low values.
      *
-     * \param [in] hi Integer portion.
-     * \param [in] lo Fractional portion, already scaled to HP_MAX_64.
+     * @param [in] hi Integer portion.
+     * @param [in] lo Fractional portion, already scaled to HP_MAX_64.
      */
     explicit inline int64x64_t(int64_t hi, uint64_t lo)
     {
@@ -143,7 +143,7 @@
     /**
      * Copy constructor.
      *
-     * \param [in] o Value to copy.
+     * @param [in] o Value to copy.
      */
     inline int64x64_t(const int64x64_t& o)
         : _v(o._v)
@@ -153,8 +153,8 @@
     /**
      * Assignment.
      *
-     * \param [in] o Value to assign to this int64x64_t.
-     * \returns a copy of \pname{o}
+     * @param [in] o Value to assign to this int64x64_t.
+     * @returns a copy of \pname{o}
      */
     inline int64x64_t& operator=(const int64x64_t& o)
     {
@@ -171,7 +171,7 @@
     /**
      * Get this value as a double.
      *
-     * \return This value in floating form.
+     * @return This value in floating form.
      */
     inline double GetDouble() const
     {
@@ -182,7 +182,7 @@
     /**
      * Get the high and low portions of this value.
      *
-     * \return A pair of the high and low words
+     * @return A pair of the high and low words
      */
     std::pair<int64_t, uint64_t> GetHighLow() const
     {
@@ -224,7 +224,7 @@
     /**
      * Get the integer portion.
      *
-     * \return The integer portion of this value.
+     * @return The integer portion of this value.
      */
     inline int64_t GetHigh() const
     {
@@ -234,7 +234,7 @@
     /**
      * Get the fractional portion of this value, unscaled.
      *
-     * \return The fractional portion, unscaled, as an integer.
+     * @return The fractional portion, unscaled, as an integer.
      */
     inline uint64_t GetLow() const
     {
@@ -244,7 +244,7 @@
     /**
      * Truncate to an integer.
      * Truncation is always toward zero,
-     * \return The value truncated toward zero.
+     * @return The value truncated toward zero.
      */
     int64_t GetInt() const
     {
@@ -256,7 +256,7 @@
      * Round to the nearest int.
      * Similar to std::round this rounds halfway cases away from zero,
      * regardless of the current (floating) rounding mode.
-     * \return The value rounded to the nearest int.
+     * @return The value rounded to the nearest int.
      */
     int64_t Round() const
     {
@@ -268,9 +268,9 @@
      * Multiply this value by a Q0.128 value, presumably representing an inverse,
      * completing a division operation.
      *
-     * \param [in] o The inverse operand.
+     * @param [in] o The inverse operand.
      *
-     * \note There is no difference between Q64.64 and Q0.128 in this implementation,
+     * @note There is no difference between Q64.64 and Q0.128 in this implementation,
      * so this function is a simple multiply.
      */
     inline void MulByInvert(const int64x64_t& o)
@@ -281,8 +281,8 @@
     /**
      * Compute the inverse of an integer value.
      *
-     * \param [in] v The value to compute the inverse of.
-     * \return The inverse.
+     * @param [in] v The value to compute the inverse of.
+     * @return The inverse.
      */
     static inline int64x64_t Invert(uint64_t v)
     {
@@ -292,15 +292,15 @@
 
   private:
     /**
-     * \name Arithmetic Operators
+     * @name Arithmetic Operators
      * Arithmetic operators for int64x64_t.
      */
     /**
      * @{
      * Arithmetic operator.
-     * \param [in] lhs Left hand argument
-     * \param [in] rhs Right hand argument
-     * \return The result of the operator.
+     * @param [in] lhs Left hand argument
+     * @param [in] rhs Right hand argument
+     * @return The result of the operator.
      */
 
     friend inline bool operator==(const int64x64_t& lhs, const int64x64_t& rhs)
@@ -345,14 +345,14 @@
     /**@}*/
 
     /**
-     * \name Unary Operators
+     * @name Unary Operators
      * Unary operators for int64x64_t.
      */
     /**
      * @{
      * Unary operator.
-     * \param [in] lhs Left hand argument
-     * \return The result of the operator.
+     * @param [in] lhs Left hand argument
+     * @return The result of the operator.
      */
     friend inline int64x64_t operator+(const int64x64_t& lhs)
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/int64x64.h ns-3.44/src/core/model/int64x64.h
--- ns-3.43/src/core/model/int64x64.h	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/int64x64.h	2025-03-09 16:55:49.359371000 -0700
@@ -24,8 +24,8 @@
 #include <iostream>
 
 /**
- * \file
- * \ingroup highprec
+ * @file
+ * @ingroup highprec
  * Declaration of the ns3::int64x64_t type and associated operators.
  */
 
@@ -33,8 +33,8 @@
 {
 
 /**
- * \ingroup core
- * \defgroup highprec High Precision Q64.64
+ * @ingroup core
+ * @defgroup highprec High Precision Q64.64
  *
  * Functions and class for high precision Q64.64 fixed point arithmetic.
  *
@@ -59,18 +59,18 @@
  */
 
 /**
- * \ingroup highprec
- * \class int64x64_t
+ * @ingroup highprec
+ * @class int64x64_t
  *
  * High precision numerical type, implementing Q64.64 fixed precision.
  */
 
 /**
- * \ingroup highprec
+ * @ingroup highprec
  * Addition operator.
- * \param [in] lhs Left hand argument
- * \param [in] rhs Right hand argument
- * \return The result of the operator.
+ * @param [in] lhs Left hand argument
+ * @param [in] rhs Right hand argument
+ * @return The result of the operator.
  */
 inline int64x64_t
 operator+(const int64x64_t& lhs, const int64x64_t& rhs)
@@ -81,11 +81,11 @@
 }
 
 /**
- * \ingroup highprec
+ * @ingroup highprec
  * Subtraction operator.
- * \param [in] lhs Left hand argument
- * \param [in] rhs Right hand argument
- * \return The result of the operator.
+ * @param [in] lhs Left hand argument
+ * @param [in] rhs Right hand argument
+ * @return The result of the operator.
  */
 inline int64x64_t
 operator-(const int64x64_t& lhs, const int64x64_t& rhs)
@@ -96,11 +96,11 @@
 }
 
 /**
- * \ingroup highprec
+ * @ingroup highprec
  * Multiplication operator.
- * \param [in] lhs Left hand argument
- * \param [in] rhs Right hand argument
- * \return The result of the operator.
+ * @param [in] lhs Left hand argument
+ * @param [in] rhs Right hand argument
+ * @return The result of the operator.
  */
 inline int64x64_t
 operator*(const int64x64_t& lhs, const int64x64_t& rhs)
@@ -111,11 +111,11 @@
 }
 
 /**
- * \ingroup highprec
+ * @ingroup highprec
  * Division operator.
- * \param [in] lhs Left hand argument
- * \param [in] rhs Right hand argument
- * \return The result of the operator.
+ * @param [in] lhs Left hand argument
+ * @param [in] rhs Right hand argument
+ * @return The result of the operator.
  */
 inline int64x64_t
 operator/(const int64x64_t& lhs, const int64x64_t& rhs)
@@ -126,11 +126,11 @@
 }
 
 /**
- * \ingroup highprec
+ * @ingroup highprec
  * Inequality operator
- * \param [in] lhs Left hand argument
- * \param [in] rhs Right hand argument
- * \return The result of the operator.
+ * @param [in] lhs Left hand argument
+ * @param [in] rhs Right hand argument
+ * @return The result of the operator.
  */
 inline bool
 operator!=(const int64x64_t& lhs, const int64x64_t& rhs)
@@ -139,11 +139,11 @@
 }
 
 /**
- * \ingroup highprec
+ * @ingroup highprec
  * Less or equal operator.
- * \param [in] lhs Left hand argument
- * \param [in] rhs Right hand argument
- * \return The result of the operator.
+ * @param [in] lhs Left hand argument
+ * @param [in] rhs Right hand argument
+ * @return The result of the operator.
  */
 inline bool
 operator<=(const int64x64_t& lhs, const int64x64_t& rhs)
@@ -152,11 +152,11 @@
 }
 
 /**
- * \ingroup highprec
+ * @ingroup highprec
  * Greater or equal operator.
- * \param [in] lhs Left hand argument
- * \param [in] rhs Right hand argument
- * \return The result of the operator.
+ * @param [in] lhs Left hand argument
+ * @param [in] rhs Right hand argument
+ * @return The result of the operator.
  */
 inline bool
 operator>=(const int64x64_t& lhs, const int64x64_t& rhs)
@@ -165,7 +165,7 @@
 }
 
 /**
- * \ingroup highprec
+ * @ingroup highprec
  * Output streamer for int64x64_t.
  *
  * Values are printed with the following format flags
@@ -178,26 +178,26 @@
  * all digits of the fractional part are printed, up to the
  * representation limit of 20 digits; trailing zeros are omitted.
  *
- * \param [in,out] os The output stream.
- * \param [in] value The numerical value to print.
- * \returns The stream.
+ * @param [in,out] os The output stream.
+ * @param [in] value The numerical value to print.
+ * @returns The stream.
  */
 std::ostream& operator<<(std::ostream& os, const int64x64_t& value);
 /**
- * \ingroup highprec
+ * @ingroup highprec
  * Input streamer for int64x64_t.
  *
- * \param [in,out] is The input stream.
- * \param [out] value The numerical value to set.
- * \returns The stream.
+ * @param [in,out] is The input stream.
+ * @param [out] value The numerical value to set.
+ * @returns The stream.
  */
 std::istream& operator>>(std::istream& is, int64x64_t& value);
 
 /**
- * \ingroup highprec
+ * @ingroup highprec
  * Absolute value.
- * \param [in] value The value to operate on.
- * \return The absolute value of \pname{value}.
+ * @param [in] value The value to operate on.
+ * @return The absolute value of \pname{value}.
  */
 inline int64x64_t
 Abs(const int64x64_t& value)
@@ -206,12 +206,12 @@
 }
 
 /**
- * \ingroup highprec
+ * @ingroup highprec
  * Minimum.
  *
- * \param [in] a The first value.
- * \param [in] b The second value.
- * \return The smaller of the arguments.
+ * @param [in] a The first value.
+ * @param [in] b The second value.
+ * @return The smaller of the arguments.
  */
 inline int64x64_t
 Min(const int64x64_t& a, const int64x64_t& b)
@@ -220,12 +220,12 @@
 }
 
 /**
- * \ingroup highprec
+ * @ingroup highprec
  * Maximum.
  *
- * \param [in] a The first value.
- * \param [in] b The second value.
- * \return The larger of the arguments.
+ * @param [in] a The first value.
+ * @param [in] b The second value.
+ * @return The larger of the arguments.
  */
 inline int64x64_t
 Max(const int64x64_t& a, const int64x64_t& b)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/integer.cc ns-3.44/src/core/model/integer.cc
--- ns-3.43/src/core/model/integer.cc	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/integer.cc	2025-03-09 16:55:49.359371000 -0700
@@ -13,8 +13,8 @@
 #include <sstream>
 
 /**
- * \file
- * \ingroup attribute_Integer
+ * @file
+ * @ingroup attribute_Integer
  * ns3::MakeIntegerChecker implementation.
  */
 
@@ -29,13 +29,13 @@
 {
 
 /**
- * \ingroup attribute_Integer
+ * @ingroup attribute_Integer
  * Make an Integer attribute checker with embedded numeric type name.
  *
- * \param [in] min The minimum allowed value.
- * \param [in] max The maximum allowed value.
- * \param [in] name The original type name ("int8_t", "int16_t", _etc_.).
- * \returns The AttributeChecker.
+ * @param [in] min The minimum allowed value.
+ * @param [in] max The maximum allowed value.
+ * @param [in] name The original type name ("int8_t", "int16_t", _etc_.).
+ * @returns The AttributeChecker.
  */
 Ptr<const AttributeChecker>
 MakeIntegerChecker(int64_t min, int64_t max, std::string name)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/integer.h ns-3.44/src/core/model/integer.h
--- ns-3.43/src/core/model/integer.h	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/integer.h	2025-03-09 16:55:49.359371000 -0700
@@ -15,8 +15,8 @@
 #include <stdint.h>
 
 /**
- * \file
- * \ingroup attribute_Integer
+ * @file
+ * @ingroup attribute_Integer
  * ns3::IntegerValue attribute value declarations and template implementations.
  */
 
@@ -42,9 +42,9 @@
  *
  * The minimum value is included in the allowed range.
  *
- * \param [in] min The minimum value.
- * \returns The AttributeChecker.
- * \see AttributeChecker
+ * @param [in] min The minimum value.
+ * @returns The AttributeChecker.
+ * @see AttributeChecker
  */
 template <typename T>
 Ptr<const AttributeChecker> MakeIntegerChecker(int64_t min);
@@ -54,10 +54,10 @@
  *
  * The minimum and maximum values are included in the allowed range.
  *
- * \param [in] min The minimum value.
- * \param [in] max The maximum value.
- * \returns The AttributeChecker.
- * \see AttributeChecker
+ * @param [in] min The minimum value.
+ * @param [in] max The maximum value.
+ * @returns The AttributeChecker.
+ * @see AttributeChecker
  */
 template <typename T>
 Ptr<const AttributeChecker> MakeIntegerChecker(int64_t min, int64_t max);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/length.cc ns-3.44/src/core/model/length.cc
--- ns-3.43/src/core/model/length.cc	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/length.cc	2025-03-09 16:55:49.359371000 -0700
@@ -25,13 +25,13 @@
 #include <vector>
 
 /**
- * \file
- * \ingroup length
+ * @file
+ * @ingroup length
  * ns3::Length implementation
  */
 
 /**
- * \ingroup length
+ * @ingroup length
  * Unnamed namespace
  */
 namespace
@@ -39,11 +39,11 @@
 /**
  * Helper function to scale an input value by a given ratio
  *
- * \tparam R a std::ratio
+ * @tparam R a std::ratio
  *
- * \param value Input value to scale by R
+ * @param value Input value to scale by R
  *
- * \return The result of value * R::num / R::den
+ * @return The result of value * R::num / R::den
  */
 template <class R>
 double
@@ -55,9 +55,9 @@
 /**
  * Convert a value in feet to the equivalent value in meters
  *
- * \param value Input value in feet
+ * @param value Input value in feet
  *
- * \return Equivalent value in meters
+ * @return Equivalent value in meters
  */
 double
 FootToMeter(double value)
@@ -68,9 +68,9 @@
 /**
  * Convert a value in meters to the equivalent value in feet
  *
- * \param value Input value in meters
+ * @param value Input value in meters
  *
- * \return Equivalent value in feet
+ * @return Equivalent value in feet
  */
 double
 MeterToFoot(double value)
@@ -83,11 +83,11 @@
  *
  * Value is scaled to feet then converted to meters
  *
- * \tparam R std::ratio needed to convert value to feet
+ * @tparam R std::ratio needed to convert value to feet
  *
- * \param value Input value in some US Customary unit
+ * @param value Input value in some US Customary unit
  *
- * \return Equivalent value in meters
+ * @return Equivalent value in meters
  */
 template <class R>
 double
@@ -101,11 +101,11 @@
  *
  * Value is converted to feet then scaled to the desired US Customary unit
  *
- * \tparam R std::ratio needed to convert feet to desired US customary unit
+ * @tparam R std::ratio needed to convert feet to desired US customary unit
  *
- * \param value Input value in meters
+ * @param value Input value in meters
  *
- * \return Equivalent value in a US customary unit
+ * @return Equivalent value in a US customary unit
  */
 template <class R>
 double
@@ -117,11 +117,11 @@
 /**
  * Convert a value in one unit to the equivalent value in another unit
  *
- * \param value Length value in \p fromUnit units
- * \param fromUnit Unit of \p value
- * \param toUnit Target unit
+ * @param value Length value in \p fromUnit units
+ * @param fromUnit Unit of \p value
+ * @param toUnit Target unit
  *
- * \return Result of converting value from \p fromUnit to \p toUnit
+ * @return Result of converting value from \p fromUnit to \p toUnit
  */
 double
 Convert(double value, ns3::Length::Unit fromUnit, ns3::Length::Unit toUnit)
@@ -186,10 +186,10 @@
 /**
  * Convert a Length::Quantity to the equivalent value in another unit
  *
- * \param from Quantity with the current value and unit
- * \param toUnit Target unit
+ * @param from Quantity with the current value and unit
+ * @param toUnit Target unit
  *
- * \return Result of converting the quantity value to the requested units
+ * @return Result of converting the quantity value to the requested units
  */
 double
 Convert(const ns3::Length::Quantity& from, ns3::Length::Unit toUnit)
@@ -209,9 +209,9 @@
     /**
      * Produce a hash value for a Length::Unit
      *
-     * \param u Length::Unit to hash
+     * @param u Length::Unit to hash
      *
-     * \return Hash value for the Length::Unit
+     * @return Hash value for the Length::Unit
      */
     std::size_t operator()(ns3::Length::Unit u) const noexcept
     {
@@ -681,8 +681,8 @@
  * The input string can either contain a double (for example, "5.5") or
  * a double and a string with no space between them (for example, "5.5m")
  *
- * \param input The input string
- * \return A three element tuple containing the result of parsing the string.
+ * @param input The input string
+ * @return A three element tuple containing the result of parsing the string.
  * The first tuple element is a boolean indicating whether the parsing succeeded
  * or failed.  The second element contains the value of the double that was
  * extracted from the string.  The third element was the unit symbol that was
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/length.h ns-3.44/src/core/model/length.h
--- ns-3.43/src/core/model/length.h	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/length.h	2025-03-09 16:55:49.359371000 -0700
@@ -24,8 +24,8 @@
 #include <string>
 
 /**
- * \file
- * \ingroup length
+ * @file
+ * @ingroup length
  * Declaration of ns3::Length class
  */
 
@@ -36,15 +36,15 @@
 {
 
 /**
- * \ingroup core
- * \defgroup length Length
+ * @ingroup core
+ * @defgroup length Length
  *
  * Management of lengths in real world units.
  *
  */
 
 /**
- * \ingroup length
+ * @ingroup length
  *
  * Represents a length in meters
  *
@@ -89,7 +89,7 @@
  * \<unit\> can be the full name of the unit (nanometer, kilometer, foot, etc.) or the
  * abbreviated name (nm, km, ft, etc.).
  *
- * \code
+ * @code
  *   //construct lengths from strings
  *   Length foot ("1foot");
  *   Length cm ("1cm");
@@ -99,7 +99,7 @@
  *   //nautical mile is special because it is two words
  *   Length nautmile ("1 nautical mile");
  *   Length nmi ("1 nmi");
- * \endcode
+ * @endcode
  *
  * ### Quantity Constructor ###
  *
@@ -108,11 +108,11 @@
  * The Length constructor takes the quantity instance and converts it to the
  * equivalent value in meters.
  *
- * \code
+ * @code
  *   //construct a Length representing 2 kilometers
  *   Length::Quantity q (2, Length::Unit::Kilometer);
  *   Length km(q);
- * \endcode
+ * @endcode
  *
  * ### Value/Unit Constructor
  *
@@ -122,11 +122,11 @@
  * An assertion is triggered if the string does not map to a valid
  * Length::Unit
  *
- * \code
+ * @code
  *   //These two constructors are equivalent
  *   Length l1 (1, "cm");
  *   Length l2 (1, Length::Unit::Centimeter);
- * \endcode
+ * @endcode
  *
  * ### boost::units
  *
@@ -134,12 +134,12 @@
  * additional constructor is enabled which allows constructing Length objects
  * from boost::unit quantities.
  *
- * \code
+ * @code
  *   //construct length from a boost::units quantity
  *   boost::units::quantity<boost::units::si::length> q
  *       = 5 * boost::units::si::meter;
  *   Length meters (q);
- * \endcode
+ * @endcode
  *
  * ## Arithmetic Operations ##
  *
@@ -149,29 +149,29 @@
  *
  *   Addition is between two Length instances
  *
- * \code
+ * @code
  *   std::cout << Length(1, Length::Unit::Meter) + Length (2, Length::Unit::Meter);
  *   // output: "3 m"
- * \endcode
+ * @endcode
  *
  * ### Subtraction ###
  *
  *   Subtraction is between two Length instances
  *
- * \code
+ * @code
  *   std::cout << Length(3, Length::Unit::Meter) - Length (2, Length::Unit::Meter);
  *   // output: "1 m"
- * \endcode
+ * @endcode
  *
  * ### Multiplication ###
  *
  *   Multiplication is only supported between a Length and a unitless scalar value
  *
- * \code
+ * @code
  *   std::cout << Length(1, Length::Unit::Meter) * 5;  // output: "5 m"
  *
  *   std::cout << 5 * Length (1, Length::Unit::Meter);  // output: "5 m"
- * \endcode
+ * @endcode
  *
  *
  * ### Division ###
@@ -182,12 +182,12 @@
  *
  *   Division between two Length objects returns a unitless value.
  *
- * \code
+ * @code
  *   std::cout << Length(5, Length::Unit::Meter) / 5;  // output: "1 m"
  *
  *   std::cout << Length (5, Length::Unit::Meter) / Length (5, Length::Unit::Meter);
  *   // output: 1
- * \endcode
+ * @endcode
  *
  * ## Comparison Operations ##
  *
@@ -199,7 +199,7 @@
  * additional tolerance value to control how much the underlying double values
  * must match when performing the comparison.
  *
- * \code
+ * @code
  *   //check for exact match
  *   Length l (5, Length::Unit::Meter);
  *
@@ -212,7 +212,7 @@
  *
  *   double tolerance = 0.01;
  *   bool mostly_match = v1.IsEqual (v2, tolerance);  // mostly_match is true
- * \endcode
+ * @endcode
  *
  * ## Serialization ##
  *
@@ -220,14 +220,14 @@
  * By default the output serialization is in meters. Use Length::As to output
  * the Length value in a different unit.
  *
- * \code
+ * @code
  *   Length m(5, Length::Unit::Meter);
  *
  *   std::cout << m << ", "
  *             << m.As(Length::Unit::Kilometer) << ", "
  *             << m.As(Length::Unit::Foot);
  *   //output: 5 m, 0.005 km, 16.4042 ft
- * \endcode
+ * @endcode
  */
 class Length
 {
@@ -263,8 +263,8 @@
         /**
          * Constructor
          *
-         * \param value Length value
-         * \param unit Length unit of the value
+         * @param value Length value
+         * @param unit Length unit of the value
          */
         Quantity(double value, Length::Unit unit)
             : m_value(value),
@@ -289,22 +289,22 @@
 
         /**
          * Copy Assignment Operator
-         * \param [in] other The source to copy from.
-         * \returns this.
+         * @param [in] other The source to copy from.
+         * @returns this.
          */
         Quantity& operator=(const Quantity& other) = default;
 
         /**
          * Move Assignment Operator
-         * \param [in] other The source to move from.
-         * \returns this.
+         * @param [in] other The source to move from.
+         * @returns this.
          */
         Quantity& operator=(Quantity&& other) = default;
 
         /**
          * The value of the quantity
          *
-         * \return The value of this quantity
+         * @return The value of this quantity
          */
         double Value() const
         {
@@ -314,7 +314,7 @@
         /**
          * The unit of the quantity
          *
-         * \return The unit of this quantity
+         * @return The unit of this quantity
          */
         Length::Unit Unit() const
         {
@@ -343,10 +343,10 @@
      *
      * This function will return false if \p unit does not map to a known type.
      *
-     * \param value Numeric value of the new length
-     * \param unit Unit that the value represents
+     * @param value Numeric value of the new length
+     * @param unit Unit that the value represents
      *
-     * \return A std::optional object containing the Length object constructed from
+     * @return A std::optional object containing the Length object constructed from
      * the given value and unit, if the attempt to construct the Length object was
      * successful.
      */
@@ -366,7 +366,7 @@
      *
      * The expected format of \p text is \<number\> \<unit\> or \<number\>\<unit\>
      *
-     * \param text Serialized length value
+     * @param text Serialized length value
      */
     Length(const std::string& text);
 
@@ -376,29 +376,29 @@
      * \p unit can either be the full name of the unit (meter, kilometer, mile, etc.)
      * or the symbol of the unit (m, km, mi, etc.)
      *
-     * \warning NS_FATAL_ERROR is called if \p unit is not a valid unit string.
-     * \warning Use Length::TryParse to parse potentially bad values without terminating.
+     * @warning NS_FATAL_ERROR is called if \p unit is not a valid unit string.
+     * @warning Use Length::TryParse to parse potentially bad values without terminating.
      *
-     * \param value Numeric value of the new length
-     * \param unit Unit that the value represents
+     * @param value Numeric value of the new length
+     * @param unit Unit that the value represents
      */
     Length(double value, const std::string& unit);
 
     /**
      * Construct a Length object from a value and a unit
      *
-     * \warning NS_FATAL_ERROR is called if \p unit is not valid.
-     * \warning Use Length::TryParse to parse potentially bad values without terminating.
+     * @warning NS_FATAL_ERROR is called if \p unit is not valid.
+     * @warning Use Length::TryParse to parse potentially bad values without terminating.
      *
-     * \param value Numeric value of the new length
-     * \param unit Length unit of the value
+     * @param value Numeric value of the new length
+     * @param unit Length unit of the value
      */
     Length(double value, Length::Unit unit);
 
     /**
      * Construct a Length object from a Quantity
      *
-     * \param quantity Quantity representing a length value and unit
+     * @param quantity Quantity representing a length value and unit
      */
     Length(Quantity quantity);
 
@@ -406,14 +406,14 @@
     /**
      * Construct a Length object from a boost::units::quantity
      *
-     * \note The boost::units:quantity must contain a unit that derives from
+     * @note The boost::units:quantity must contain a unit that derives from
      * the length dimension.  Passing a quantity with a Unit that is not a length
      * unit will result in a compile time error
      *
-     * \tparam U A boost::units length unit
-     * \tparam T Numeric data type of the quantity value
+     * @tparam U A boost::units length unit
+     * @tparam T Numeric data type of the quantity value
      *
-     * \param quantity A boost::units length quantity
+     * @param quantity A boost::units length quantity
      */
     template <class U, class T>
     explicit Length(boost::units::quantity<U, T> quantity);
@@ -424,7 +424,7 @@
      *
      * Initialize an object with the value from \p other.
      *
-     * \param other Length object to copy
+     * @param other Length object to copy
      */
     Length(const Length& other) = default;
 
@@ -436,7 +436,7 @@
      * After the move completes, \p other is left in an undefined but
      * usable state.
      *
-     * \param other Length object to move
+     * @param other Length object to move
      */
     Length(Length&& other) = default;
 
@@ -450,9 +450,9 @@
      *
      * Replace the current value with the value from \p other
      *
-     * \param other Length object to copy
+     * @param other Length object to copy
      *
-     * \return Reference to the updated object
+     * @return Reference to the updated object
      */
     Length& operator=(const Length& other) = default;
 
@@ -462,9 +462,9 @@
      * Replace the current value with the value from \p other
      * After the move, \p other is left in an undefined but valid state
      *
-     * \param other Length object to move
+     * @param other Length object to move
      *
-     * \return Reference to the updated object
+     * @return Reference to the updated object
      */
     Length& operator=(Length&& other) = default;
 
@@ -473,20 +473,20 @@
      *
      * Replace the current value with the value from \p q
      *
-     * \param q Quantity holding the value to assign
+     * @param q Quantity holding the value to assign
      *
-     * \return Reference to the updated object
+     * @return Reference to the updated object
      */
     Length& operator=(const Length::Quantity& q);
 
     /**
      * Check if \p other is equal in value to this instance.
      *
-     * \param other Value to compare against
-     * \param tolerance Smallest difference allowed between the two
+     * @param other Value to compare against
+     * @param tolerance Smallest difference allowed between the two
      * values to still be considered equal
      *
-     * \return true if the absolute difference between lengths
+     * @return true if the absolute difference between lengths
      * is less than or equal to \p tolerance
      */
     bool IsEqual(const Length& other, double tolerance = DEFAULT_TOLERANCE) const;
@@ -494,11 +494,11 @@
     /**
      * Check if \p other is not equal in value to this instance.
      *
-     * \param other Value to compare against
-     * \param tolerance Smallest difference allowed between the two
+     * @param other Value to compare against
+     * @param tolerance Smallest difference allowed between the two
      * values to still be considered equal
      *
-     * \return true if the absolute difference between lengths
+     * @return true if the absolute difference between lengths
      * is greater than \p tolerance
      */
     bool IsNotEqual(const Length& other, double tolerance = DEFAULT_TOLERANCE) const;
@@ -506,11 +506,11 @@
     /**
      * Check if \p other is greater in value than this instance.
      *
-     * \param other Value to compare against
-     * \param tolerance Smallest difference allowed between the two
+     * @param other Value to compare against
+     * @param tolerance Smallest difference allowed between the two
      * values to still be considered equal
      *
-     * \return true if the values are not equal and \p other is
+     * @return true if the values are not equal and \p other is
      * greater in value
      */
     bool IsLess(const Length& other, double tolerance = DEFAULT_TOLERANCE) const;
@@ -518,16 +518,16 @@
     /**
      * Check if \p other is greater or equal in value than this instance.
      *
-     * \param other Value to compare against
-     * \param tolerance Smallest difference allowed between the two
+     * @param other Value to compare against
+     * @param tolerance Smallest difference allowed between the two
      * values to still be considered equal
      *
      * Equivalent to:
-     * \code
+     * @code
      *   IsEqual(other, tolerance) || IsLess(other, tolerance)
-     * \endcode
+     * @endcode
      *
-     * \return true if the values are equal or \p other is
+     * @return true if the values are equal or \p other is
      * greater in value
      */
     bool IsLessOrEqual(const Length& other, double tolerance = DEFAULT_TOLERANCE) const;
@@ -535,16 +535,16 @@
     /**
      * Check if \p other is less in value than this instance.
      *
-     * \param other Value to compare against
-     * \param tolerance Smallest difference allowed between the two
+     * @param other Value to compare against
+     * @param tolerance Smallest difference allowed between the two
      * values to still be considered equal
      *
      * Equivalent to:
-     * \code
+     * @code
      *   !(IsLessOrEqual(other, tolerance))
-     * \endcode
+     * @endcode
      *
-     * \return true if the values are not equal and \p other is
+     * @return true if the values are not equal and \p other is
      * less in value
      */
     bool IsGreater(const Length& other, double tolerance = DEFAULT_TOLERANCE) const;
@@ -552,16 +552,16 @@
     /**
      * Check if \p other is equal or less in value than this instance.
      *
-     * \param other Value to compare against
-     * \param tolerance Smallest difference allowed between the two
+     * @param other Value to compare against
+     * @param tolerance Smallest difference allowed between the two
      * values to still be considered equal
      *
      * Equivalent to:
-     * \code
+     * @code
      *   !IsLess(other, tolerance)
-     * \endcode
+     * @endcode
      *
-     * \return true if the values are equal or \p other is
+     * @return true if the values are equal or \p other is
      * less in value
      */
     bool IsGreaterOrEqual(const Length& other, double tolerance = DEFAULT_TOLERANCE) const;
@@ -572,13 +572,13 @@
      * Swap the current value with the value in \p other.
      *
      * Equivalent to:
-     * \code
+     * @code
      *   Length temp(*this);
      *   *this = other;
      *   other = temp;
-     * \endcode
+     * @endcode
      *
-     * \param other Length object to swap
+     * @param other Length object to swap
      */
     void swap(Length& other);
 
@@ -586,10 +586,10 @@
      * Current length value
      *
      * Equivalent to:
-     * \code
+     * @code
      *   As (Length::Unit::Meter).Value ()
-     * \endcode
-     * \return The current value, in meters
+     * @endcode
+     * @return The current value, in meters
      */
     double GetDouble() const;
 
@@ -599,9 +599,9 @@
      * Converts the current length value to the equivalent value specified by
      * \p unit and returns a Quantity object with the converted value and unit
      *
-     * \param unit The desired unit of the returned Quantity
+     * @param unit The desired unit of the returned Quantity
      *
-     * \return A quantity representing the length in the requested unit
+     * @return A quantity representing the length in the requested unit
      */
     Quantity As(Unit unit) const;
 
@@ -612,21 +612,21 @@
 ATTRIBUTE_HELPER_HEADER(Length);
 
 /**
- * \ingroup length
- * \brief Return the symbol of the supplied unit
+ * @ingroup length
+ * @brief Return the symbol of the supplied unit
  *
  * The symbol of the unit is the shortened form of the unit name and is usually
  * two or three characters long
  *
- * \param unit The unit to symbolize
+ * @param unit The unit to symbolize
  *
- * \return String containing the symbol of \p unit
+ * @return String containing the symbol of \p unit
  */
 std::string ToSymbol(Length::Unit unit);
 
 /**
- * \ingroup length
- * \brief Return the name of the supplied unit
+ * @ingroup length
+ * @brief Return the name of the supplied unit
  *
  * The value returned by this function is the common name of \p unit. The output
  * is always lowercase.
@@ -634,17 +634,17 @@
  * If \p plural is true, then the plural form of the common name is returned
  * instead.
  *
- * \param unit The unit to name
- * \param plural Boolean indicating if the returned string should contain the
+ * @param unit The unit to name
+ * @param plural Boolean indicating if the returned string should contain the
  * plural form of the name
  *
- * \return String containing the full name of \p unit
+ * @return String containing the full name of \p unit
  */
 std::string ToName(Length::Unit unit, bool plural = false);
 
 /**
- * \ingroup length
- * \brief Find the equivalent Length::Unit for a unit string
+ * @ingroup length
+ * @brief Find the equivalent Length::Unit for a unit string
  *
  * The string value can be a symbol or name (plural or singular).
  *
@@ -654,241 +654,241 @@
  * Leading and trailing whitespace are trimmed from the string before searching
  * for a match.
  *
- * \param unitString String containing the symbol or name of a length unit
+ * @param unitString String containing the symbol or name of a length unit
  *
- * \return A std::optional object containing a Length::Unit if a match for the
+ * @return A std::optional object containing a Length::Unit if a match for the
  * string could be found
  */
 std::optional<Length::Unit> FromString(std::string unitString);
 
 /**
- * \ingroup length
- * \brief Write a length value to an output stream.
+ * @ingroup length
+ * @brief Write a length value to an output stream.
  *
  * The output of the length is in meters.
  *
  * Equivalent to:
- * \code
+ * @code
  *   stream << l.As (Meter);
- * \endcode
+ * @endcode
  *
- * \param stream Output stream
- * \param l Length value to write to the stream
+ * @param stream Output stream
+ * @param l Length value to write to the stream
  *
- * \return Reference to the output stream
+ * @return Reference to the output stream
  */
 std::ostream& operator<<(std::ostream& stream, const Length& l);
 
 /**
- * \ingroup length
- * \brief Write a Quantity to an output stream.
+ * @ingroup length
+ * @brief Write a Quantity to an output stream.
  *
  * The data written to the output stream will have the format \<value\> \<symbol\>
  *
  * Equivalent to:
- * \code
+ * @code
  *   stream << q.Value () << ' ' << ToSymbol (q.Unit());
- * \endcode
+ * @endcode
  *
- * \param stream Output stream
- * \param q Quantity to write to the output stream
+ * @param stream Output stream
+ * @param q Quantity to write to the output stream
  *
- * \return Reference to the output stream
+ * @return Reference to the output stream
  */
 std::ostream& operator<<(std::ostream& stream, const Length::Quantity& q);
 
 /**
- * \ingroup length
- * \brief Write a Length::Unit to an output stream.
+ * @ingroup length
+ * @brief Write a Length::Unit to an output stream.
  *
  * Writes the name of \p unit to the output stream
  *
  * Equivalent to:
- * \code
+ * @code
  *   stream << ToName (unit);
- * \endcode
+ * @endcode
  *
- * \param stream Output stream
- * \param unit Length unit to output
+ * @param stream Output stream
+ * @param unit Length unit to output
  *
- * \return Reference to the output stream
+ * @return Reference to the output stream
  */
 std::ostream& operator<<(std::ostream& stream, Length::Unit unit);
 
 /**
- * \ingroup length
- * \brief Read a length value from an input stream.
+ * @ingroup length
+ * @brief Read a length value from an input stream.
  *
  * The expected format of the input is \<number\> \<unit\>
  * or \<number\>\<unit\>
  * This function calls NS_ABORT if the input stream does not contain
  * a valid length string
  *
- * \param stream Input stream
- * \param l Object where the deserialized value will be stored
+ * @param stream Input stream
+ * @param l Object where the deserialized value will be stored
  *
- * \return Reference to the input stream
+ * @return Reference to the input stream
  */
 std::istream& operator>>(std::istream& stream, Length& l);
 
 /**
- * \ingroup length
- * \brief Compare two length objects for equality.
+ * @ingroup length
+ * @brief Compare two length objects for equality.
  *
  * Equivalent to:
- * \code
+ * @code
  *   left.IsEqual(right, 0);
- * \endcode
+ * @endcode
  *
- * \param left Left length object
- * \param right Right length object
+ * @param left Left length object
+ * @param right Right length object
  *
- * \return true if \p left and \p right have the same value
+ * @return true if \p left and \p right have the same value
  */
 bool operator==(const Length& left, const Length& right);
 
 /**
- * \ingroup length
- * \brief Compare two length objects for inequality.
+ * @ingroup length
+ * @brief Compare two length objects for inequality.
  *
  * Equivalent to:
- * \code
+ * @code
  *   left.IsNotEqual(right, 0);
- * \endcode
+ * @endcode
  *
- * \param left Left length object
- * \param right Right length object
+ * @param left Left length object
+ * @param right Right length object
  *
- * \return true if \p left and \p right do not have the same value
+ * @return true if \p left and \p right do not have the same value
  */
 bool operator!=(const Length& left, const Length& right);
 
 /**
- * \ingroup length
- * \brief Check if \p left has a value less than \p right
+ * @ingroup length
+ * @brief Check if \p left has a value less than \p right
  *
  * Equivalent to:
- * \code
+ * @code
  *   left.IsLess(right, 0);
- * \endcode
+ * @endcode
  *
- * \param left Left length object
- * \param right Right length object
+ * @param left Left length object
+ * @param right Right length object
  *
- * \return true if \p left is less than \p right
+ * @return true if \p left is less than \p right
  */
 bool operator<(const Length& left, const Length& right);
 
 /**
- * \ingroup length
- * \brief Check if \p left has a value less than or equal to \p right
+ * @ingroup length
+ * @brief Check if \p left has a value less than or equal to \p right
  *
  * Equivalent to:
- * \code
+ * @code
  *   left.IsLessOrEqual(right, 0);
- * \endcode
+ * @endcode
  *
- * \param left Left length object
- * \param right Right length object
+ * @param left Left length object
+ * @param right Right length object
  *
- * \return true if \p left is less than or equal to \p right
+ * @return true if \p left is less than or equal to \p right
  */
 bool operator<=(const Length& left, const Length& right);
 
 /**
- * \ingroup length
- * \brief Check if \p left has a value greater than \p right
+ * @ingroup length
+ * @brief Check if \p left has a value greater than \p right
  *
  * Equivalent to:
- * \code
+ * @code
  *   left.IsGreater(right, 0);
- * \endcode
+ * @endcode
  *
- * \param left Left length object
- * \param right Right length object
+ * @param left Left length object
+ * @param right Right length object
  *
- * \return true if \p left is greater than \p right
+ * @return true if \p left is greater than \p right
  */
 bool operator>(const Length& left, const Length& right);
 
 /**
- * \ingroup length
- * \brief Check if \p left has a value greater than or equal to \p right
+ * @ingroup length
+ * @brief Check if \p left has a value greater than or equal to \p right
  *
  * Equivalent to:
- * \code
+ * @code
  *   left.IsGreaterOrEqual(right, 0);
- * \endcode
+ * @endcode
  *
- * \param left Left length object
- * \param right Right length object
+ * @param left Left length object
+ * @param right Right length object
  *
- * \return true if \p left is greater than or equal to \p right
+ * @return true if \p left is greater than or equal to \p right
  */
 bool operator>=(const Length& left, const Length& right);
 
 /**
- * \ingroup length
- * \brief Add two length values together.
+ * @ingroup length
+ * @brief Add two length values together.
  *
  * Adds the values of \p left to \p right and returns a new
  * Length object containing the result.
  *
- * \param left A Length object
- * \param right A Length object
+ * @param left A Length object
+ * @param right A Length object
  *
- * \return A newly constructed Length object containing the
+ * @return A newly constructed Length object containing the
  * result of `left + right`.
  */
 Length operator+(const Length& left, const Length& right);
 
 /**
- * \ingroup length
- * \brief Subtract two length values.
+ * @ingroup length
+ * @brief Subtract two length values.
  *
  * Subtracts the value of \p right from \p left and returns a
  * new Length object containing the result.
  *
- * \param left A Length object
- * \param right A Length object
+ * @param left A Length object
+ * @param right A Length object
  *
- * \return A newly constructed Length object containing the
+ * @return A newly constructed Length object containing the
  * result of `left - right`.
  */
 Length operator-(const Length& left, const Length& right);
 
 /**
- * \ingroup length
- * \brief Multiply a length value by a scalar
+ * @ingroup length
+ * @brief Multiply a length value by a scalar
  *
  * Multiplies the value \p l by \p scalar and returns a new
  * Length object containing the result.
  *
- * \param l The Length object
- * \param scalar Multiplication factor
+ * @param l The Length object
+ * @param scalar Multiplication factor
  *
- * \return A newly constructed Length object containing the result
+ * @return A newly constructed Length object containing the result
  * of `l * scalar`.
  */
 Length operator*(double scalar, const Length& l);
 /**
- * \ingroup length
- * \brief Multiply a length value by a scalar
+ * @ingroup length
+ * @brief Multiply a length value by a scalar
  *
  * Multiplies the value \p l by \p scalar and returns a new
  * Length object containing the result.
  *
- * \param l The Length object
- * \param scalar Multiplication factor
+ * @param l The Length object
+ * @param scalar Multiplication factor
  *
- * \return A newly constructed Length object containing the result
+ * @return A newly constructed Length object containing the result
  * of `l * scalar`.
  */
 Length operator*(const Length& l, double scalar);
 
 /**
- * \ingroup length
- * \brief Divide a length value by a scalar
+ * @ingroup length
+ * @brief Divide a length value by a scalar
  *
  * Divides the value \p left by \p scalar and returns a new
  * Length object containing the result.
@@ -896,34 +896,34 @@
  * \p scalar must contain a non zero value.
  * NS_FATAL_ERROR is called if \p scalar is zero
  *
- * \param left Length value
- * \param scalar Multiplication factor
+ * @param left Length value
+ * @param scalar Multiplication factor
  *
- * \return A newly constructed Length object containing the result
+ * @return A newly constructed Length object containing the result
  * of `left / scalar`.
  */
 Length operator/(const Length& left, double scalar);
 
 /**
- * \ingroup length
- * \brief Divide a length value by another length value
+ * @ingroup length
+ * @brief Divide a length value by another length value
  *
  * Divides the value \p numerator by the value \p denominator and
  * returns a scalar value containing the result.
  *
  * The return value will be NaN if \p denominator is 0.
  *
- * \param numerator The top value of the division
- * \param denominator The bottom value of the division
+ * @param numerator The top value of the division
+ * @param denominator The bottom value of the division
  *
- * \return A scalar value that is the result of `numerator / denominator` or
+ * @return A scalar value that is the result of `numerator / denominator` or
  * NaN if \p denominator is 0.
  */
 double operator/(const Length& numerator, const Length& denominator);
 
 /**
- * \ingroup length
- * \brief Calculate how many times \p numerator can be split into \p denominator
+ * @ingroup length
+ * @brief Calculate how many times \p numerator can be split into \p denominator
  * sized pieces.
  *
  * If the result of `numerator / denominator` is not a whole number, the
@@ -934,28 +934,28 @@
  *
  * NS_FATAL_ERROR is called if \p denominator is 0.
  *
- * \param numerator The value to split
- * \param denominator The length of each split
- * \param remainder Location to store the remainder
+ * @param numerator The value to split
+ * @param denominator The length of each split
+ * @param remainder Location to store the remainder
  *
- * \return The number of times \p numerator can be split into \p denominator
+ * @return The number of times \p numerator can be split into \p denominator
  * sized pieces, rounded down to the nearest whole number
  */
 int64_t Div(const Length& numerator, const Length& denominator, Length* remainder = nullptr);
 
 /**
- * \ingroup length
- * \brief Calculate the amount remaining after dividing two lengths
+ * @ingroup length
+ * @brief Calculate the amount remaining after dividing two lengths
  *
  * The returned value will be less than \p denominator and have the same sign as
  * \p numerator.
  *
  * NS_FATAL_ERROR is called if \p denominator is 0.
  *
- * \param numerator The value to split
- * \param denominator The length of each split
+ * @param numerator The value to split
+ * @param denominator The length of each split
  *
- * \return The amount remaining after splitting \p numerator into \p denominator
+ * @return The amount remaining after splitting \p numerator into \p denominator
  * sized pieces.
  */
 Length Mod(const Length& numerator, const Length& denominator);
@@ -963,9 +963,9 @@
 /**
  * Construct a length from a value in the indicated unit.
  * @{
- * \ingroup length
- * \param value The numerical value.
- * \returns Length object.
+ * @ingroup length
+ * @param value The numerical value.
+ * @returns Length object.
  */
 Length NanoMeters(double value);
 Length MicroMeters(double value);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/list-scheduler.cc ns-3.44/src/core/model/list-scheduler.cc
--- ns-3.43/src/core/model/list-scheduler.cc	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/list-scheduler.cc	2025-03-09 16:55:49.359371000 -0700
@@ -16,8 +16,8 @@
 #include <utility>
 
 /**
- * \file
- * \ingroup scheduler
+ * @file
+ * @ingroup scheduler
  * ns3::ListScheduler implementation.
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/list-scheduler.h ns-3.44/src/core/model/list-scheduler.h
--- ns-3.43/src/core/model/list-scheduler.h	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/list-scheduler.h	2025-03-09 16:55:49.359371000 -0700
@@ -16,8 +16,8 @@
 #include <utility>
 
 /**
- * \file
- * \ingroup scheduler
+ * @file
+ * @ingroup scheduler
  * ns3::ListScheduler declaration.
  */
 
@@ -27,13 +27,13 @@
 class EventImpl;
 
 /**
- * \ingroup scheduler
- * \brief a std::list event scheduler
+ * @ingroup scheduler
+ * @brief a std::list event scheduler
  *
  * This class implements an event scheduler using an std::list
  * data structure, that is, a double linked-list.
  *
- * \par Time Complexity
+ * @par Time Complexity
  *
  * Operation    | Amortized %Time | Reason
  * :----------- | :-------------- | :-----
@@ -43,7 +43,7 @@
  * Remove()     | Linear          | Linear search in `std::list`
  * RemoveNext() | Constant        | `std::list::pop_front()`
  *
- * \par Memory Complexity
+ * @par Memory Complexity
  *
  * Category  | Memory                           | Reason
  * :-------- | :------------------------------- | :-----
@@ -56,7 +56,7 @@
   public:
     /**
      *  Register this type.
-     *  \return The object TypeId.
+     *  @return The object TypeId.
      */
     static TypeId GetTypeId();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/log.cc ns-3.44/src/core/model/log.cc
--- ns-3.43/src/core/model/log.cc	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/log.cc	2025-03-09 16:55:49.359371000 -0700
@@ -25,13 +25,13 @@
 #include <utility>
 
 /**
- * \file
- * \ingroup logging
+ * @file
+ * @ingroup logging
  * ns3::LogComponent and related implementations.
  */
 
 /**
- * \ingroup logging
+ * @ingroup logging
  * Unnamed namespace for log.cc
  */
 namespace
@@ -93,19 +93,19 @@
 {
 
 /**
- * \ingroup logging
+ * @ingroup logging
  * The Log TimePrinter.
  * This is private to the logging implementation.
  */
 static TimePrinter g_logTimePrinter = nullptr;
 /**
- * \ingroup logging
+ * @ingroup logging
  * The Log NodePrinter.
  */
 static NodePrinter g_logNodePrinter = nullptr;
 
 /**
- * \ingroup logging
+ * @ingroup logging
  * Handler for the undocumented \c print-list token in NS_LOG
  * which triggers printing of the list of log components, then exits.
  *
@@ -416,12 +416,12 @@
 }
 
 /**
- * \ingroup logging
+ * @ingroup logging
  * Check if a log component exists.
  * This is private to the logging implementation.
  *
- * \param [in] componentName The putative log component name.
- * \returns \c true if \c componentName exists.
+ * @param [in] componentName The putative log component name.
+ * @returns \c true if \c componentName exists.
  */
 static bool
 ComponentExists(std::string componentName)
@@ -432,7 +432,7 @@
 }
 
 /**
- * \ingroup logging
+ * @ingroup logging
  * Parse the \c NS_LOG environment variable.
  * This is private to the logging implementation.
  */
@@ -453,28 +453,30 @@
                 << "\" in env variable NS_LOG, see above for a list of valid components");
         }
 
-        // We have a valid component or wildcard, check the flags
-        if (!value.empty())
+        // No valid component or wildcard
+        if (value.empty())
         {
-            // Check the flags present in value
-            StringVector flags = SplitString(value, "|");
-            for (const auto& flag : flags)
-            {
-                // Handle wild cards
-                if (flag == "*" || flag == "**")
-                {
-                    continue;
-                }
-                bool ok = LOG_LABEL_LEVELS.find(flag) != LOG_LABEL_LEVELS.end();
-                if (!ok)
-                {
-                    NS_FATAL_ERROR("Invalid log level \""
-                                   << flag << "\" in env variable NS_LOG for component name "
-                                   << component);
-                }
-            } // for flag
-        }     // !value.empty
-    }         // for component
+            continue;
+        }
+
+        // We have a valid component or wildcard, check the flags present in value
+        StringVector flags = SplitString(value, "|");
+        for (const auto& flag : flags)
+        {
+            // Handle wild cards
+            if (flag == "*" || flag == "**")
+            {
+                continue;
+            }
+            bool ok = LOG_LABEL_LEVELS.find(flag) != LOG_LABEL_LEVELS.end();
+            if (!ok)
+            {
+                NS_FATAL_ERROR("Invalid log level \""
+                               << flag << "\" in env variable NS_LOG for component name "
+                               << component);
+            }
+        } // for flag
+    }     // for component
 }
 
 void
@@ -482,7 +484,7 @@
 {
     g_logTimePrinter = printer;
     /**
-     * \internal
+     * @internal
      * This is the only place where we are more or less sure that all log variables
      * are registered. See \bugid{1082} for details.
      */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/log.h ns-3.44/src/core/model/log.h
--- ns-3.43/src/core/model/log.h	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/log.h	2025-03-09 16:55:49.359371000 -0700
@@ -22,16 +22,16 @@
 #include <vector>
 
 /**
- * \file
- * \ingroup logging
+ * @file
+ * @ingroup logging
  * Debug message logging
  */
 
 /**
- * \ingroup debugging
- * \defgroup logging Logging
+ * @ingroup debugging
+ * @defgroup logging Logging
  *
- * \brief Logging functions and macros
+ * @brief Logging functions and macros
  *
  * LOG functionality: macros which allow developers to
  * send information to the \c std::clog output stream.
@@ -42,21 +42,21 @@
  *
  * Use the environment variable NS_LOG to define a ':'-separated list of
  * logging components to enable. For example (using bash syntax),
- * \code
+ * @code
  *   $ NS_LOG="OlsrAgent" ./ns3 run ...
- * \endcode
+ * @endcode
  * would enable one component at all log levels.
- * \code
+ * @code
  *   $NS_LOG="OlsrAgent:Ipv4L3Protocol" ./ns3 run ...
- * \endcode
+ * @endcode
  * would enable two components, at all log levels, etc.
  * \c NS_LOG="*" will enable all available log components at all levels.
  *
  * To control more selectively the log levels for each component, use
  * this syntax:
- * \code
+ * @code
  *   $ NS_LOG='Component1=func|warn:Component2=error|debug'
- * \endcode
+ * @endcode
  * This example would enable the \c func, and \c warn log
  * levels for 'Component1' and the \c error and \c debug log levels
  * for 'Component2'.  The wildcard '*' can be used here as well.  For example
@@ -66,9 +66,9 @@
  * A note on NS_LOG_FUNCTION() and NS_LOG_FUNCTION_NOARGS():
  * generally, use of (at least) NS_LOG_FUNCTION(this) is preferred,
  * with the any function parameters added:
- * \code
+ * @code
  *   NS_LOG_FUNCTION (this << arg1 << args);
- * \endcode
+ * @endcode
  * Use NS_LOG_FUNCTION_NOARGS() only in static functions with no arguments.
  */
 /** @{ */
@@ -120,8 +120,8 @@
  * Same as running your program with the NS_LOG environment
  * variable set as NS_LOG='name=level'.
  *
- * \param [in] name The log component name.
- * \param [in] level The logging level.
+ * @param [in] name The log component name.
+ * @param [in] level The logging level.
  */
 void LogComponentEnable(const std::string& name, LogLevel level);
 
@@ -131,7 +131,7 @@
  * Same as running your program with the NS_LOG environment
  * variable set as NS_LOG='*=level'
  *
- * \param [in] level The logging level.
+ * @param [in] level The logging level.
  */
 void LogComponentEnableAll(LogLevel level);
 
@@ -141,15 +141,15 @@
  * The logging output can be later re-enabled with a call
  * to LogComponentEnable.
  *
- * \param [in] name The log component name.
- * \param [in] level The logging level.
+ * @param [in] name The log component name.
+ * @param [in] level The logging level.
  */
 void LogComponentDisable(const std::string& name, LogLevel level);
 
 /**
  * Disable all logging for all components.
  *
- * \param [in] level The logging level.
+ * @param [in] level The logging level.
  */
 void LogComponentDisableAll(LogLevel level);
 
@@ -173,7 +173,7 @@
  * solution is to add the following 'using' directive at file scope,
  * outside of namespace ns3, and after the inclusion of
  * NS_LOG_COMPONENT_DEFINE, such as follows:
- * \code
+ * @code
  *   namespace ns3 {
  *     NS_LOG_COMPONENT_DEFINE ("...");
  *
@@ -184,9 +184,9 @@
  *   using ns3::g_log;
  *
  *   // Further definitions outside of the ns3 namespace
- * \endcode
+ * @endcode
  *
- * \param [in] name The log component name.
+ * @param [in] name The log component name.
  */
 #define NS_LOG_COMPONENT_DEFINE(name)                                                              \
     static ns3::LogComponent g_log = ns3::LogComponent(name, __FILE__)
@@ -196,8 +196,8 @@
  *
  * See LogComponent().
  *
- * \param [in] name The log component name.
- * \param [in] mask The default mask.
+ * @param [in] name The log component name.
+ * @param [in] mask The default mask.
  */
 #define NS_LOG_COMPONENT_DEFINE_MASK(name, mask)                                                   \
     static ns3::LogComponent g_log = ns3::LogComponent(name, __FILE__, mask)
@@ -220,7 +220,7 @@
  * to allow their methods (defined in an header file) to make use of
  * the NS_LOG_* macros.
  *
- * \param [in] name The log component name.
+ * @param [in] name The log component name.
  */
 #define NS_LOG_TEMPLATE_DEFINE(name) g_log(GetLogComponent(name))
 
@@ -230,7 +230,7 @@
  * This macro should be used in static template methods to allow their
  * methods (defined in an header file) to make use of the NS_LOG_* macros.
  *
- * \param [in] name The log component name.
+ * @param [in] name The log component name.
  */
 #define NS_LOG_STATIC_TEMPLATE_DEFINE(name)                                                        \
     static LogComponent& g_log [[maybe_unused]] = GetLogComponent(name)
@@ -238,35 +238,35 @@
 /**
  * Use \ref NS_LOG to output a message of level LOG_ERROR.
  *
- * \param [in] msg The message to log.
+ * @param [in] msg The message to log.
  */
 #define NS_LOG_ERROR(msg) NS_LOG(ns3::LOG_ERROR, msg)
 
 /**
  * Use \ref NS_LOG to output a message of level LOG_WARN.
  *
- * \param [in] msg The message to log.
+ * @param [in] msg The message to log.
  */
 #define NS_LOG_WARN(msg) NS_LOG(ns3::LOG_WARN, msg)
 
 /**
  * Use \ref NS_LOG to output a message of level LOG_DEBUG.
  *
- * \param [in] msg The message to log.
+ * @param [in] msg The message to log.
  */
 #define NS_LOG_DEBUG(msg) NS_LOG(ns3::LOG_DEBUG, msg)
 
 /**
  * Use \ref NS_LOG to output a message of level LOG_INFO.
  *
- * \param [in] msg The message to log.
+ * @param [in] msg The message to log.
  */
 #define NS_LOG_INFO(msg) NS_LOG(ns3::LOG_INFO, msg)
 
 /**
  * Use \ref NS_LOG to output a message of level LOG_LOGIC
  *
- * \param [in] msg The message to log.
+ * @param [in] msg The message to log.
  */
 #define NS_LOG_LOGIC(msg) NS_LOG(ns3::LOG_LOGIC, msg)
 
@@ -286,12 +286,12 @@
  *
  * The default is DefaultTimePrinter().
  *
- * \param [in] lp The TimePrinter function.
+ * @param [in] lp The TimePrinter function.
  */
 void LogSetTimePrinter(TimePrinter lp);
 /**
  * Get the LogTimePrinter function currently in use.
- * \returns The current LogTimePrinter function.
+ * @returns The current LogTimePrinter function.
  */
 TimePrinter LogGetTimePrinter();
 
@@ -301,12 +301,12 @@
  *
  * The default is DefaultNodePrinter().
  *
- * \param [in] np The LogNodePrinter function.
+ * @param [in] np The LogNodePrinter function.
  */
 void LogSetNodePrinter(NodePrinter np);
 /**
  * Get the LogNodePrinter function currently in use.
- * \returns The current LogNodePrinter function.
+ * @returns The current LogNodePrinter function.
  */
 NodePrinter LogGetNodePrinter();
 
@@ -319,9 +319,9 @@
     /**
      * Constructor.
      *
-     * \param [in] name The user-visible name for this component.
-     * \param [in] file The source code file which defined this LogComponent.
-     * \param [in] mask LogLevels blocked for this LogComponent.  Blocking
+     * @param [in] name The user-visible name for this component.
+     * @param [in] file The source code file which defined this LogComponent.
+     * @param [in] mask LogLevels blocked for this LogComponent.  Blocking
      *                  a log level helps prevent recursion by logging in
      *                  functions which help implement the logging facility.
      */
@@ -329,57 +329,57 @@
     /**
      * Check if this LogComponent is enabled for \c level
      *
-     * \param [in] level The level to check for.
-     * \return \c true if we are enabled at \c level.
+     * @param [in] level The level to check for.
+     * @return \c true if we are enabled at \c level.
      */
     bool IsEnabled(const LogLevel level) const;
     /**
      * Check if all levels are disabled.
      *
-     * \return \c true if all levels are disabled.
+     * @return \c true if all levels are disabled.
      */
     bool IsNoneEnabled() const;
     /**
      * Enable this LogComponent at \c level
      *
-     * \param [in] level The LogLevel to enable.
+     * @param [in] level The LogLevel to enable.
      */
     void Enable(const LogLevel level);
     /**
      * Disable logging at \c level for this LogComponent.
      *
-     * \param [in] level The LogLevel to disable.
+     * @param [in] level The LogLevel to disable.
      */
     void Disable(const LogLevel level);
     /**
      * Get the name of this LogComponent.
      *
-     * \return The name of this LogComponent.
+     * @return The name of this LogComponent.
      */
     std::string Name() const;
     /**
      * Get the compilation unit defining this LogComponent.
-     * \returns The file name.
+     * @returns The file name.
      */
     std::string File() const;
     /**
      * Get the string label for the given LogLevel.
      *
-     * \param [in] level The LogLevel to get the label for.
-     * \return The string label for \c level.
+     * @param [in] level The LogLevel to get the label for.
+     * @return The string label for \c level.
      */
     static std::string GetLevelLabel(const LogLevel level);
     /**
      * Prevent the enabling of a specific LogLevel.
      *
-     * \param [in] level The LogLevel to block.
+     * @param [in] level The LogLevel to block.
      */
     void SetMask(const LogLevel level);
 
     /**
      * LogComponent name map.
      *
-     * \internal
+     * @internal
      * This should really be considered an internal API.
      * It is exposed here to allow print-introspected-doxygen.cc
      * to generate a list of all LogComponents.
@@ -389,12 +389,12 @@
     /**
      * Get the list of LogComponents.
      *
-     * \internal
+     * @internal
      * This should really be considered an internal API.
      * It is exposed here to allow print-introspected-doxygen.cc
      * to generate a list of all LogComponents.
      *
-     * \returns The list of LogComponents.
+     * @returns The list of LogComponents.
      */
     static ComponentList* GetComponentList();
 
@@ -415,8 +415,8 @@
 /**
  * Get the LogComponent registered with the given name.
  *
- * \param [in] name The name of the LogComponent.
- * \return a reference to the requested LogComponent
+ * @param [in] name The name of the LogComponent.
+ * @return a reference to the requested LogComponent
  */
 LogComponent& GetLogComponent(const std::string name);
 
@@ -429,7 +429,7 @@
     /**
      * Constructor.
      *
-     * \param [in] os Underlying output stream.
+     * @param [in] os Underlying output stream.
      */
     ParameterLogger(std::ostream& os);
 
@@ -437,8 +437,8 @@
      * Write a function parameter on the output stream,
      * separating parameters after the first by `,` strings.
      *
-     * \param [in] param The function parameter.
-     * \return This ParameterLogger, so it's chainable.
+     * @param [in] param The function parameter.
+     * @return This ParameterLogger, so it's chainable.
      */
     template <typename T>
     ParameterLogger& operator<<(const T& param);
@@ -446,8 +446,8 @@
     /**
      * Overload for vectors, to print each element.
      *
-     * \param [in] vector The vector of parameters
-     * \return This ParameterLogger, so it's chainable.
+     * @param [in] vector The vector of parameters
+     * @return This ParameterLogger, so it's chainable.
      */
     template <typename T>
     ParameterLogger& operator<<(const std::vector<T>& vector);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/log-macros-disabled.h ns-3.44/src/core/model/log-macros-disabled.h
--- ns-3.43/src/core/model/log-macros-disabled.h	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/log-macros-disabled.h	2025-03-09 16:55:49.359371000 -0700
@@ -7,8 +7,8 @@
  */
 
 /**
- * \file
- * \ingroup logging
+ * @file
+ * @ingroup logging
  * Definition of empty logging macros and the NS_LOG_NOOP_INTERNAL macro.
  */
 
@@ -46,7 +46,7 @@
 */
 
 /**
- * \ingroup logging
+ * @ingroup logging
  * Empty logging macro implementation, used when logging is disabled.
  */
 #define NS_LOG_NOOP_INTERNAL(msg)                                                                  \
@@ -62,7 +62,7 @@
 #define NS_LOG_FUNCTION_NOARGS()
 
 /**
- * \ingroup logging
+ * @ingroup logging
  * Empty logging macro implementation, used when logging is disabled.
  */
 #define NS_LOG_NOOP_FUNC_INTERNAL(msg)                                                             \
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/log-macros-enabled.h ns-3.44/src/core/model/log-macros-enabled.h
--- ns-3.43/src/core/model/log-macros-enabled.h	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/log-macros-enabled.h	2025-03-09 16:55:49.359371000 -0700
@@ -10,8 +10,8 @@
 #define NS3_LOG_MACROS_ENABLED_H
 
 /**
- * \file
- * \ingroup logging
+ * @file
+ * @ingroup logging
  * NS_LOG and related logging macro definitions.
  */
 
@@ -22,9 +22,9 @@
 // for use by NS_FATAL_...
 
 /**
- * \ingroup logging
+ * @ingroup logging
  * Implementation details for NS_LOG_APPEND_TIME_PREFIX.
- * \internal
+ * @internal
  * Logging implementation macro; should not be called directly.
  * We define this separately so we can reuse the definition
  * in NS_FATAL.
@@ -41,9 +41,9 @@
     } while (false)
 
 /**
- * \ingroup logging
+ * @ingroup logging
  * Implementation details for NS_LOG_APPEND_NODE_PREFIX.
- * \internal
+ * @internal
  * Logging implementation macro; should not be called directly.
  * We define this separately so we can reuse the definition
  * in NS_FATAL.
@@ -62,9 +62,9 @@
 #ifdef NS3_LOG_ENABLE
 
 /**
- * \ingroup logging
+ * @ingroup logging
  * Append the simulation time to a log message.
- * \internal
+ * @internal
  * Logging implementation macro; should not be called directly.
  */
 #define NS_LOG_APPEND_TIME_PREFIX                                                                  \
@@ -74,9 +74,9 @@
     }
 
 /**
- * \ingroup logging
+ * @ingroup logging
  * Append the simulation node id to a log message.
- * \internal
+ * @internal
  * Logging implementation macro; should not be called directly.
  */
 #define NS_LOG_APPEND_NODE_PREFIX                                                                  \
@@ -86,9 +86,9 @@
     }
 
 /**
- * \ingroup logging
+ * @ingroup logging
  * Append the function name to a log message.
- * \internal
+ * @internal
  * Logging implementation macro; should not be called directly.
  */
 #define NS_LOG_APPEND_FUNC_PREFIX                                                                  \
@@ -98,9 +98,9 @@
     }
 
 /**
- * \ingroup logging
+ * @ingroup logging
  * Append the log severity level to a log message.
- * \internal
+ * @internal
  * Logging implementation macro; should not be called directly.
  */
 #define NS_LOG_APPEND_LEVEL_PREFIX(level)                                                          \
@@ -111,7 +111,7 @@
 
 #ifndef NS_LOG_APPEND_CONTEXT
 /**
- * \ingroup logging
+ * @ingroup logging
  * Append the node id (or other file-local programmatic context, such as
  * MPI rank) to a log message.
  *
@@ -120,19 +120,19 @@
  *
  * Preferred format is something like (assuming the node id is
  * accessible from `var`:
- * \code
+ * @code
  *   if (var)
  *     {
  *       std::clog << "[node " << var->GetObject<Node> ()->GetId () << "] ";
  *     }
- * \endcode
+ * @endcode
  */
 #define NS_LOG_APPEND_CONTEXT
 #endif /* NS_LOG_APPEND_CONTEXT */
 
 #ifndef NS_LOG_CONDITION
 /**
- * \ingroup logging
+ * @ingroup logging
  * Limit logging output based on some file-local condition,
  * such as MPI rank.
  *
@@ -141,15 +141,15 @@
  *
  * Since this appears immediately before the `do { ... } while false`
  * construct of \c NS_LOG(level, msg), it must have the form
- * \code
+ * @code
  *   #define NS_LOG_CONDITION    if (condition)
- * \endcode
+ * @endcode
  */
 #define NS_LOG_CONDITION
 #endif
 
 /**
- * \ingroup logging
+ * @ingroup logging
  *
  * This macro allows you to log an arbitrary message at a specific
  * log level.
@@ -158,13 +158,13 @@
  * message such as "my string" << aNumber << "my oth stream".
  *
  * Typical usage looks like:
- * \code
+ * @code
  * NS_LOG (LOG_DEBUG, "a number="<<aNumber<<", anotherNumber="<<anotherNumber);
- * \endcode
+ * @endcode
  *
- * \param [in] level The log level
- * \param [in] msg The message to log
- * \internal
+ * @param [in] level The log level
+ * @param [in] msg The message to log
+ * @internal
  * Logging implementation macro; should not be called directly.
  */
 #define NS_LOG(level, msg)                                                                         \
@@ -185,7 +185,7 @@
     } while (false)
 
 /**
- * \ingroup logging
+ * @ingroup logging
  *
  * Output the name of the function.
  *
@@ -206,25 +206,25 @@
     } while (false)
 
 /**
- * \ingroup logging
+ * @ingroup logging
  *
  * If log level LOG_FUNCTION is enabled, this macro will output
  * all input parameters separated by ", ".
  *
  * Typical usage looks like:
- * \code
+ * @code
  * NS_LOG_FUNCTION (aNumber<<anotherNumber);
- * \endcode
+ * @endcode
  * And the output will look like:
- * \code
+ * @code
  * Component:Function (aNumber, anotherNumber)
- * \endcode
+ * @endcode
  *
  * To facilitate function tracing, most functions should begin with
  * (at least) NS_LOG_FUNCTION(this).  Static functions should use
  * NS_LOG_FUNCTION_NOARGS() instead.
  *
- * \param [in] parameters The parameters to output.
+ * @param [in] parameters The parameters to output.
  */
 #define NS_LOG_FUNCTION(parameters)                                                                \
     NS_LOG_CONDITION                                                                               \
@@ -244,11 +244,11 @@
     } while (false)
 
 /**
- * \ingroup logging
+ * @ingroup logging
  *
  * Output the requested message unconditionally.
  *
- * \param [in] msg The message to log
+ * @param [in] msg The message to log
  */
 #define NS_LOG_UNCOND(msg)                                                                         \
     NS_LOG_CONDITION                                                                               \
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/make-event.h ns-3.44/src/core/model/make-event.h
--- ns-3.43/src/core/model/make-event.h	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/make-event.h	2025-03-09 16:55:49.359371000 -0700
@@ -15,8 +15,8 @@
 #include <type_traits>
 
 /**
- * \file
- * \ingroup events
+ * @file
+ * @ingroup events
  * ns3::MakeEvent function declarations and template implementation.
  */
 
@@ -26,17 +26,17 @@
 class EventImpl;
 
 /**
- * \ingroup events
+ * @ingroup events
  * Make an EventImpl from class method members which take
  * varying numbers of arguments.
  *
- * \tparam MEM \deduced The class method function signature.
- * \tparam OBJ \deduced The class type holding the method.
- * \tparam Ts \deduced Type template parameter pack.
- * \param [in] mem_ptr Class method member function pointer
- * \param [in] obj Class instance.
- * \param [in] args Arguments to be bound to the underlying function.
- * \returns The constructed EventImpl.
+ * @tparam MEM \deduced The class method function signature.
+ * @tparam OBJ \deduced The class type holding the method.
+ * @tparam Ts \deduced Type template parameter pack.
+ * @param [in] mem_ptr Class method member function pointer
+ * @param [in] obj Class instance.
+ * @param [in] args Arguments to be bound to the underlying function.
+ * @returns The constructed EventImpl.
  */
 template <typename MEM, typename OBJ, typename... Ts>
 std::enable_if_t<std::is_member_pointer_v<MEM>, EventImpl*> MakeEvent(MEM mem_ptr,
@@ -44,8 +44,8 @@
                                                                       Ts... args);
 
 /**
- * \ingroup events
- * \defgroup makeeventfnptr MakeEvent from Function Pointers and Lambdas.
+ * @ingroup events
+ * @defgroup makeeventfnptr MakeEvent from Function Pointers and Lambdas.
  *
  * Create EventImpl instances from function pointers or lambdas which take
  * varying numbers of arguments.
@@ -56,11 +56,11 @@
  * Make an EventImpl from a function pointer taking varying numbers
  * of arguments.
  *
- * \tparam Us \deduced Formal types of the arguments to the function.
- * \tparam Ts \deduced Actual types of the arguments to the function.
- * \param [in] f The function pointer.
- * \param [in] args Arguments to be bound to the function.
- * \returns The constructed EventImpl.
+ * @tparam Us \deduced Formal types of the arguments to the function.
+ * @tparam Ts \deduced Actual types of the arguments to the function.
+ * @param [in] f The function pointer.
+ * @param [in] args Arguments to be bound to the function.
+ * @returns The constructed EventImpl.
  */
 template <typename... Us, typename... Ts>
 EventImpl* MakeEvent(void (*f)(Us...), Ts... args);
@@ -68,8 +68,8 @@
 /**
  * Make an EventImpl from a lambda.
  *
- * \param [in] function The lambda
- * \returns The constructed EventImpl.
+ * @param [in] function The lambda
+ * @returns The constructed EventImpl.
  */
 template <typename T>
 EventImpl* MakeEvent(T function);
@@ -91,34 +91,34 @@
 {
 
 /**
- * \ingroup events
+ * @ingroup events
  * Helper for the MakeEvent functions which take a class method.
  *
  * This helper converts a pointer to a reference.
  *
  * This is the generic template declaration (with empty body).
  *
- * \tparam T \explicit The class type.
+ * @tparam T \explicit The class type.
  */
 template <typename T>
 struct EventMemberImplObjTraits;
 
 /**
- * \ingroup events
+ * @ingroup events
  * Helper for the MakeEvent functions which take a class method.
  *
  * This helper converts a pointer to a reference.
  *
  * This is the specialization for pointer types.
  *
- * \tparam T \explicit The class type.
+ * @tparam T \explicit The class type.
  */
 template <typename T>
 struct EventMemberImplObjTraits<T*>
 {
     /**
-     * \param [in] p Object pointer.
-     * \return A reference to the object pointed to by p.
+     * @param [in] p Object pointer.
+     * @return A reference to the object pointed to by p.
      */
     static T& GetReference(T* p)
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/map-scheduler.cc ns-3.44/src/core/model/map-scheduler.cc
--- ns-3.43/src/core/model/map-scheduler.cc	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/map-scheduler.cc	2025-03-09 16:55:49.359371000 -0700
@@ -16,8 +16,8 @@
 #include <string>
 
 /**
- * \file
- * \ingroup scheduler
+ * @file
+ * @ingroup scheduler
  * ns3::MapScheduler implementation.
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/map-scheduler.h ns-3.44/src/core/model/map-scheduler.h
--- ns-3.43/src/core/model/map-scheduler.h	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/map-scheduler.h	2025-03-09 16:55:49.359371000 -0700
@@ -16,8 +16,8 @@
 #include <utility>
 
 /**
- * \file
- * \ingroup scheduler
+ * @file
+ * @ingroup scheduler
  * ns3::MapScheduler declaration.
  */
 
@@ -25,13 +25,13 @@
 {
 
 /**
- * \ingroup scheduler
- * \brief a std::map event scheduler
+ * @ingroup scheduler
+ * @brief a std::map event scheduler
  *
  * This class implements the an event scheduler using an std::map
  * data structure.
  *
- * \par Time Complexity
+ * @par Time Complexity
  *
  * Operation    | Amortized %Time | Reason
  * :----------- | :-------------- | :-----
@@ -41,7 +41,7 @@
  * Remove()     | Logarithmic     | `std::map::find()`
  * RemoveNext() | Constant        | `std::map::begin()`
  *
- * \par Memory Complexity
+ * @par Memory Complexity
  *
  * Category  | Memory                           | Reason
  * :-------- | :------------------------------- | :-----
@@ -54,7 +54,7 @@
   public:
     /**
      *  Register this type.
-     *  \return The object TypeId.
+     *  @return The object TypeId.
      */
     static TypeId GetTypeId();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/math.h ns-3.44/src/core/model/math.h
--- ns-3.43/src/core/model/math.h	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/math.h	2025-03-09 16:55:49.359371000 -0700
@@ -13,8 +13,8 @@
 #define MATH_H
 
 /**
- * \file
- * \ingroup core
+ * @file
+ * @ingroup core
  * log2() macro definition; to deal with \bugid{1467}.
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/matrix-array.cc ns-3.44/src/core/model/matrix-array.cc
--- ns-3.43/src/core/model/matrix-array.cc	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/matrix-array.cc	2025-03-09 16:55:49.359371000 -0700
@@ -9,7 +9,17 @@
 #include "matrix-array.h"
 
 #ifdef HAVE_EIGEN3
+
+#if defined(__GNUC__) && !defined(__clang__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wclass-memaccess"
+#endif
+
 #include <Eigen/Dense>
+
+#if defined(__GNUC__) && !defined(__clang__)
+#pragma GCC diagnostic pop
+#endif
 #endif
 
 namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/matrix-array.h ns-3.44/src/core/model/matrix-array.h
--- ns-3.43/src/core/model/matrix-array.h	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/matrix-array.h	2025-03-09 16:55:49.359371000 -0700
@@ -17,9 +17,9 @@
 {
 
 /**
- * \ingroup Matrices
+ * @ingroup Matrices
  *
- * \brief MatrixArray class inherits ValArray class and provides additional
+ * @brief MatrixArray class inherits ValArray class and provides additional
  * interfaces to ValArray which enable page-wise linear algebra operations for
  * arrays of matrices. While ValArray class is focused on efficient storage,
  * access and basic algebra element-wise operations on 3D numerical arrays,
@@ -74,122 +74,122 @@
     // instruct the compiler to generate the default constructor
     MatrixArray() = default;
     /**
-     * \brief Constructor "pages" number of matrices that are of size "numRows"x"numCols",
+     * @brief Constructor "pages" number of matrices that are of size "numRows"x"numCols",
      * and are initialized with all-zero elements.
      * If only 1 parameter, numRows, is provided then a single 1D array is being created.
-     * \param numRows the number of rows
-     * \param numCols the number of columns
-     * \param numPages the number of pages
+     * @param numRows the number of rows
+     * @param numCols the number of columns
+     * @param numPages the number of pages
      */
     MatrixArray(size_t numRows, size_t numCols = 1, size_t numPages = 1);
     /**
-     * \brief Constructor creates a single array of values.size () elements and 1 column,
+     * @brief Constructor creates a single array of values.size () elements and 1 column,
      * and uses std::valarray<T> values to initialize the elements.
-     * \param values std::valarray<T> that will be used to initialize elements of 1D array
+     * @param values std::valarray<T> that will be used to initialize elements of 1D array
      */
     explicit MatrixArray(const std::valarray<T>& values);
     /**
-     * \brief Constructor creates a single array of values.size () elements and 1 column,
+     * @brief Constructor creates a single array of values.size () elements and 1 column,
      * and moves std::valarray<T> values to initialize the elements.
-     * \param values std::valarray<T> that will be moved to initialize elements of 1D array
+     * @param values std::valarray<T> that will be moved to initialize elements of 1D array
      */
     MatrixArray(std::valarray<T>&& values);
     /**
-     * \brief Constructor creates a single array of values.size () elements and 1 column,
+     * @brief Constructor creates a single array of values.size () elements and 1 column,
      * and uses std::vector<T> values to initialize the elements.
-     * \param values std::vector<T> that will be used to initialize elements of 1D array
+     * @param values std::vector<T> that will be used to initialize elements of 1D array
      */
     explicit MatrixArray(const std::vector<T>& values);
     /**
-     * \brief Constructor creates a single matrix of numRows and numCols, and uses
+     * @brief Constructor creates a single matrix of numRows and numCols, and uses
      * std::valarray<T> values to initialize the elements.
-     * \param numRows the number of rows
-     * \param numCols the number of columns
-     * \param values std::valarray<T> that will be used to initialize elements of 3D array
+     * @param numRows the number of rows
+     * @param numCols the number of columns
+     * @param values std::valarray<T> that will be used to initialize elements of 3D array
      */
     MatrixArray(size_t numRows, size_t numCols, const std::valarray<T>& values);
     /**
-     * \brief Constructor creates a single matrix of numRows and numCols, and moves
+     * @brief Constructor creates a single matrix of numRows and numCols, and moves
      * std::valarray<T> values to initialize the elements.
-     * \param numRows the number of rows
-     * \param numCols the number of columns
-     * \param values std::valarray<T> that will be moved to initialize elements of 3D array
+     * @param numRows the number of rows
+     * @param numCols the number of columns
+     * @param values std::valarray<T> that will be moved to initialize elements of 3D array
      */
     MatrixArray(size_t numRows, size_t numCols, std::valarray<T>&& values);
     /**
-     * \brief Constructor creates the array of numPages matrices of numRows x numCols dimensions,
+     * @brief Constructor creates the array of numPages matrices of numRows x numCols dimensions,
      * and uses std::valarray<T> values to initialize all the elements.
-     * \param numRows the number of rows
-     * \param numCols the number of columns
-     * \param numPages the number of pages
-     * \param values std::valarray<T> that will be used to initialize elements of 3D array
+     * @param numRows the number of rows
+     * @param numCols the number of columns
+     * @param numPages the number of pages
+     * @param values std::valarray<T> that will be used to initialize elements of 3D array
      */
     MatrixArray(size_t numRows, size_t numCols, size_t numPages, const std::valarray<T>& values);
     /**
-     * \brief Constructor creates the array of numPages matrices of numRows x numCols dimensions,
+     * @brief Constructor creates the array of numPages matrices of numRows x numCols dimensions,
      * and moves std::valarray<T> values to initialize all the elements.
-     * \param numRows the number of rows
-     * \param numCols the number of columns
-     * \param numPages the number of pages
-     * \param values std::valarray<T> that will be used to initialize elements of 3D array
+     * @param numRows the number of rows
+     * @param numCols the number of columns
+     * @param numPages the number of pages
+     * @param values std::valarray<T> that will be used to initialize elements of 3D array
      */
     MatrixArray(size_t numRows, size_t numCols, size_t numPages, std::valarray<T>&& values);
 
     /**
-     * \brief Element-wise multiplication with a scalar value.
-     * \param rhs is a scalar value of type T
-     * \returns The matrix in which each element has been multiplied by the given
+     * @brief Element-wise multiplication with a scalar value.
+     * @param rhs is a scalar value of type T
+     * @returns The matrix in which each element has been multiplied by the given
      * scalar value.
      */
     MatrixArray operator*(const T& rhs) const;
     /**
-     * \brief operator+ definition for MatrixArray<T>.
-     * \param rhs The rhs MatrixArray object
-     * \returns The result of operator+ of this MatrixArray and rhs MatrixArray
+     * @brief operator+ definition for MatrixArray<T>.
+     * @param rhs The rhs MatrixArray object
+     * @returns The result of operator+ of this MatrixArray and rhs MatrixArray
      */
     MatrixArray operator+(const MatrixArray<T>& rhs) const;
     /**
-     * \brief binary operator- definition for MatrixArray<T>.
-     * \param rhs The rhs MatrixArray object
-     * \returns The result of operator- of this MatrixArray and rhs MatrixArray
+     * @brief binary operator- definition for MatrixArray<T>.
+     * @param rhs The rhs MatrixArray object
+     * @returns The result of operator- of this MatrixArray and rhs MatrixArray
      */
     MatrixArray operator-(const MatrixArray<T>& rhs) const;
     /**
-     * \brief unary operator- definition for MatrixArray<T>.
-     * \return the result of the operator-
+     * @brief unary operator- definition for MatrixArray<T>.
+     * @return the result of the operator-
      */
     MatrixArray operator-() const;
     /**
-     * \brief Page-wise matrix multiplication.
+     * @brief Page-wise matrix multiplication.
      * This operator interprets the 3D array as an array of matrices,
      * and performs a linear algebra operation on each of the matrices (pages),
      * i.e., matrices from this MatrixArray and rhs with the same page indices are
      * multiplied.
      * The number of columns of this MatrixArray must be equal to the number of
      * rows in rhs, and rhs must have the same number of pages as this MatrixArray.
-     * \param rhs is another MatrixArray instance
-     * \returns The array of results of matrix multiplications.
+     * @param rhs is another MatrixArray instance
+     * @returns The array of results of matrix multiplications.
      */
     MatrixArray operator*(const MatrixArray<T>& rhs) const;
     /**
-     * \brief This operator interprets the 3D array as an array of matrices,
+     * @brief This operator interprets the 3D array as an array of matrices,
      * and performs a linear algebra operation on each of the matrices (pages),
      * i.e., transposes the matrix or array of matrices definition for MatrixArray<T>.
-     * \return The resulting MatrixArray composed of the array of transposed matrices.
+     * @return The resulting MatrixArray composed of the array of transposed matrices.
      */
     MatrixArray Transpose() const;
     /**
-     * \brief This operator calculates a vector o determinants, one for each page
-     * \return The resulting MatrixArray with the determinants for each page.
+     * @brief This operator calculates a vector o determinants, one for each page
+     * @return The resulting MatrixArray with the determinants for each page.
      */
     MatrixArray Determinant() const;
     /**
-     * \brief This operator calculates a vector of Frobenius norm, one for each page
-     * \return The resulting MatrixArray with the Frobenius norm for each page.
+     * @brief This operator calculates a vector of Frobenius norm, one for each page
+     * @return The resulting MatrixArray with the Frobenius norm for each page.
      */
     MatrixArray FrobeniusNorm() const;
     /**
-     * \brief Multiply each matrix in the array by the left and the right matrix.
+     * @brief Multiply each matrix in the array by the left and the right matrix.
      * For each page of this MatrixArray the operation performed is
      * lMatrix * matrix(pageIndex) * rMatrix, and the resulting MatrixArray<T>
      * contains the array of the results per page. If "this" has dimensions
@@ -205,9 +205,9 @@
      * This operation is not possible when using the multiplication operator because
      * the number of pages does not match.
      *
-     * \param lMatrix the left matrix in the multiplication
-     * \param rMatrix the right matrix in the multiplication
-     * \returns Returns the result of the multiplication which is a 3D MatrixArray
+     * @param lMatrix the left matrix in the multiplication
+     * @param rMatrix the right matrix in the multiplication
+     * @returns Returns the result of the multiplication which is a 3D MatrixArray
      * with dimensions J x K x P as explained previously.
      */
     MatrixArray MultiplyByLeftAndRightMatrix(const MatrixArray<T>& lMatrix,
@@ -218,47 +218,47 @@
     using ValArray<T>::AssertEqualDims;
 
     /**
-     * \brief Function that performs the Hermitian transpose of this MatrixArray
+     * @brief Function that performs the Hermitian transpose of this MatrixArray
      * and returns a new matrix that is the result of the operation.
      * This function assumes that the matrix contains complex numbers, because of that
      * it is only available for the <std::complex<double>> specialization of MatrixArray.
-     * \return Returns a new matrix that is the result of the Hermitian transpose
+     * @return Returns a new matrix that is the result of the Hermitian transpose
      */
     template <bool EnableBool = true,
               typename = std::enable_if_t<(std::is_same_v<T, std::complex<double>> && EnableBool)>>
     MatrixArray<T> HermitianTranspose() const;
 
     /**
-     * \brief Function that copies the current 1-page matrix into a new matrix with n copies of the
+     * @brief Function that copies the current 1-page matrix into a new matrix with n copies of the
      * original matrix
-     * \param nCopies Number of copies to make of the input 1-page MatrixArray
-     * \return Returns a new matrix with n page copies
+     * @param nCopies Number of copies to make of the input 1-page MatrixArray
+     * @return Returns a new matrix with n page copies
      */
     MatrixArray<T> MakeNCopies(size_t nCopies) const;
     /**
-     * \brief Function extracts a page from a MatrixArray
-     * \param page Index of the page to be extracted from the n-page MatrixArray
-     * \return Returns an extracted page of the original MatrixArray
+     * @brief Function extracts a page from a MatrixArray
+     * @param page Index of the page to be extracted from the n-page MatrixArray
+     * @return Returns an extracted page of the original MatrixArray
      */
     MatrixArray<T> ExtractPage(size_t page) const;
     /**
-     * \brief Function joins multiple pages into a single MatrixArray
-     * \param pages Vector containing n 1-page MatrixArrays to be merged into a n-page MatrixArray
-     * \return Returns a joint MatrixArray
+     * @brief Function joins multiple pages into a single MatrixArray
+     * @param pages Vector containing n 1-page MatrixArrays to be merged into a n-page MatrixArray
+     * @return Returns a joint MatrixArray
      */
     static MatrixArray<T> JoinPages(const std::vector<MatrixArray<T>>& pages);
     /**
-     * \brief Function produces an identity MatrixArray with the specified size
-     * \param size Size of the output identity matrix
-     * \param pages Number of copies of the identity matrix
-     * \return Returns an identity MatrixArray
+     * @brief Function produces an identity MatrixArray with the specified size
+     * @param size Size of the output identity matrix
+     * @param pages Number of copies of the identity matrix
+     * @return Returns an identity MatrixArray
      */
     static MatrixArray<T> IdentityMatrix(const size_t size, const size_t pages = 1);
     /**
-     * \brief Function produces an identity MatrixArray with the same size
+     * @brief Function produces an identity MatrixArray with the same size
      * as the input MatrixArray
-     * \param likeme Input matrix used to determine the size of the identity matrix
-     * \return Returns an identity MatrixArray
+     * @param likeme Input matrix used to determine the size of the identity matrix
+     * @return Returns an identity MatrixArray
      */
     static MatrixArray<T> IdentityMatrix(const MatrixArray& likeme);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/names.cc ns-3.44/src/core/model/names.cc
--- ns-3.43/src/core/model/names.cc	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/names.cc	2025-03-09 16:55:49.359371000 -0700
@@ -15,8 +15,8 @@
 #include <map>
 
 /**
- * \file
- * \ingroup config
+ * @file
+ * @ingroup config
  * ns3::Names, ns3::NamesNode and ns3::NamePriv implementations.
  */
 
@@ -26,7 +26,7 @@
 NS_LOG_COMPONENT_DEFINE("Names");
 
 /**
- * \ingroup config
+ * @ingroup config
  *  Node in the naming tree.
  */
 class NameNode
@@ -37,22 +37,22 @@
     /**
      * Copy constructor.
      *
-     * \param [in] nameNode The NameNode to copy from.
+     * @param [in] nameNode The NameNode to copy from.
      */
     NameNode(const NameNode& nameNode);
     /**
      * Constructor.
      *
-     * \param [in] parent The parent NameNode.
-     * \param [in] name The name of this NameNode
-     * \param [in] object The object corresponding to this NameNode.
+     * @param [in] parent The parent NameNode.
+     * @param [in] name The name of this NameNode
+     * @param [in] object The object corresponding to this NameNode.
      */
     NameNode(NameNode* parent, std::string name, Ptr<Object> object);
     /**
      * Assignment operator.
      *
-     * \param [in] rhs The NameNode to copy from.
-     * \returns The lhs NameNode.
+     * @param [in] rhs The NameNode to copy from.
+     * @returns The lhs NameNode.
      */
     NameNode& operator=(const NameNode& rhs);
 
@@ -109,7 +109,7 @@
 }
 
 /**
- * \ingroup config
+ * @ingroup config
  * The singleton root Names object.
  */
 class NamesPriv : public Singleton<NamesPriv>
@@ -125,85 +125,85 @@
     /**
      * Internal implementation for Names::Add(std::string,Ptr<Object>)
      *
-     * \param [in] name The name of the object you want to associate;
+     * @param [in] name The name of the object you want to associate;
      *             which may be prepended with a path to that object.
-     * \param [in] object A smart pointer to the object itself.
-     * \return \c true if the object was named successfully.
+     * @param [in] object A smart pointer to the object itself.
+     * @return \c true if the object was named successfully.
      */
     bool Add(std::string name, Ptr<Object> object);
     /**
      * Internal implementation for Names::Add(std::string,std::string,Ptr<Object>)
      *
-     * \param [in] path A path name describing a previously named object
+     * @param [in] path A path name describing a previously named object
      *             under which you want this new name to be defined.
-     * \param [in] name The name of the object you want to associate.
-     * \param [in] object A smart pointer to the object itself.
-     * \return \c true if the object was named successfully.
+     * @param [in] name The name of the object you want to associate.
+     * @param [in] object A smart pointer to the object itself.
+     * @return \c true if the object was named successfully.
      */
     bool Add(std::string path, std::string name, Ptr<Object> object);
     /**
      * Internal implementation for Names::Add(Ptr<Object>,std::string,Ptr<Object>)
      *
-     * \param [in] context A smart pointer to an object that is used
+     * @param [in] context A smart pointer to an object that is used
      *             in place of the path under which you want this new
      *             name to be defined.
-     * \param [in] name The name of the object you want to associate.
-     * \param [in] object A smart pointer to the object itself.
-     * \return \c true if the object was named successfully.
+     * @param [in] name The name of the object you want to associate.
+     * @param [in] object A smart pointer to the object itself.
+     * @return \c true if the object was named successfully.
      */
     bool Add(Ptr<Object> context, std::string name, Ptr<Object> object);
 
     /**
      * Internal implementation for Names::Rename(std::string,std::string)
      *
-     * \param [in] oldpath The current path name to the object you want
+     * @param [in] oldpath The current path name to the object you want
      *             to change.
-     * \param [in] newname The new name of the object you want to change.
-     * \return \c true if the object was renamed successfully.
+     * @param [in] newname The new name of the object you want to change.
+     * @return \c true if the object was renamed successfully.
      */
     bool Rename(std::string oldpath, std::string newname);
     /**
      * Internal implementation for
      * Names::Rename(std::string,std::string,std::string)
      *
-     * \param [in] path A path name describing a previously named object
+     * @param [in] path A path name describing a previously named object
      *             under which you want this name change to occur
      *             (cf. directory).
-     * \param [in] oldname The currently defined name of the object.
-     * \param [in] newname The new name you want the object to have.
-     * \return \c true if the object was renamed successfully.
+     * @param [in] oldname The currently defined name of the object.
+     * @param [in] newname The new name you want the object to have.
+     * @return \c true if the object was renamed successfully.
      */
     bool Rename(std::string path, std::string oldname, std::string newname);
     /**
      * Internal implementation for
      * Names::Rename(Ptr<Object>,std::string,std::string)
      *
-     * \param [in] context A smart pointer to an object that is used
+     * @param [in] context A smart pointer to an object that is used
      *             in place of the path under which you want this
      *             new name to be defined.
-     * \param [in] oldname The current shortname of the object you want
+     * @param [in] oldname The current shortname of the object you want
      *             to change.
-     * \param [in] newname The new shortname of the object you want
+     * @param [in] newname The new shortname of the object you want
      *             to change.
-     * \return \c true if the object was renamed successfully.
+     * @return \c true if the object was renamed successfully.
      */
     bool Rename(Ptr<Object> context, std::string oldname, std::string newname);
 
     /**
      * Internal implementation for Names::FindName()
      *
-     * \param [in] object A smart pointer to an object for which you want
+     * @param [in] object A smart pointer to an object for which you want
      *             to find its name.
-     * \returns A string containing the name of the object if found,
+     * @returns A string containing the name of the object if found,
      *          otherwise the empty string.
      */
     std::string FindName(Ptr<Object> object);
     /**
      * Internal implementation of Names::FindPath()
      *
-     * \param [in] object A smart pointer to an object for which you
+     * @param [in] object A smart pointer to an object for which you
      *             want to find its fullname.
-     * \returns A string containing the name path of the object,
+     * @returns A string containing the name path of the object,
      *          otherwise the empty string.
      */
     std::string FindPath(Ptr<Object> object);
@@ -216,30 +216,30 @@
     /**
      * Internal implementation for ns3::Names::Find(std::string)
      *
-     * \param [in] path A string containing a name space path used
+     * @param [in] path A string containing a name space path used
      *             to locate the object.
-     * \returns A smart pointer to the named object converted to
+     * @returns A smart pointer to the named object converted to
      *          the requested type.
      */
     Ptr<Object> Find(std::string path);
     /**
      * Internal implementation for ns3::Names::Find(std::string,std::string)
      *
-     * \param [in] path A path name describing a previously named object
+     * @param [in] path A path name describing a previously named object
      *             under which you want to look for the specified name.
-     * \param [in] name A string containing a name to search for.
-     * \returns A smart pointer to the named object converted to
+     * @param [in] name A string containing a name to search for.
+     * @returns A smart pointer to the named object converted to
      *          the requested type.
      */
     Ptr<Object> Find(std::string path, std::string name);
     /**
      * Internal implementation for ns3::Names::Find(Ptr<Object>,std::string)
      *
-     * \param [in] context A smart pointer to an object that is used
+     * @param [in] context A smart pointer to an object that is used
      *             in place of the path under which you want this
      *             new name to be defined.
-     * \param [in] name A string containing a name to search for.
-     * \returns A smart pointer to the named object converted to
+     * @param [in] name A string containing a name to search for.
+     * @returns A smart pointer to the named object converted to
      *          the requested type.
      */
     Ptr<Object> Find(Ptr<Object> context, std::string name);
@@ -248,16 +248,16 @@
     /**
      * Check if an object has a name.
      *
-     * \param [in] object The object to check.
-     * \returns The corresponding NameNode, if it exists.
+     * @param [in] object The object to check.
+     * @returns The corresponding NameNode, if it exists.
      */
     NameNode* IsNamed(Ptr<Object> object);
     /**
      * Check if a name already exists as a child of a NameNode.
      *
-     * \param [in] node The node to search.
-     * \param [in] name The name to search for.
-     * \returns \c true if \c name already exists as a child of \c node.
+     * @param [in] node The node to search.
+     * @param [in] name The name to search for.
+     * @returns \c true if \c name already exists as a child of \c node.
      */
     bool IsDuplicateName(NameNode* node, std::string name);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/names.h ns-3.44/src/core/model/names.h
--- ns-3.43/src/core/model/names.h	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/names.h	2025-03-09 16:55:49.359371000 -0700
@@ -11,8 +11,8 @@
 #include "ptr.h"
 
 /**
- * \file
- * \ingroup config
+ * @file
+ * @ingroup config
  * Declaration of class ns3::Names.
  */
 
@@ -20,15 +20,15 @@
 {
 
 /**
- * \ingroup config
- * \brief A directory of name and Ptr<Object> associations that allows
+ * @ingroup config
+ * @brief A directory of name and Ptr<Object> associations that allows
  * us to give any ns3 Object a name.
  */
 class Names
 {
   public:
     /**
-     * \brief Add the association between the string "name" and the
+     * @brief Add the association between the string "name" and the
      * Ptr<Object> obj.
      *
      * The name may begin either with "/Names" to explicitly call out
@@ -60,14 +60,14 @@
      * time just as you might have different files of the same name
      * under different directories.
      *
-     * \param [in] name The name of the object you want to associate; which may be
+     * @param [in] name The name of the object you want to associate; which may be
      *             prepended with a path to that object.
-     * \param [in] object A smart pointer to the object itself.
+     * @param [in] object A smart pointer to the object itself.
      */
     static void Add(std::string name, Ptr<Object> object);
 
     /**
-     * \brief An intermediate form of Names::Add allowing you to provide
+     * @brief An intermediate form of Names::Add allowing you to provide
      * a path to the parent object (under which you want this name to be
      * defined) in the form of a name path string.
      *
@@ -94,17 +94,17 @@
      * time just as you might have different files of the same name
      * under different directories.
      *
-     * \param [in] path A path name describing a previously named object
+     * @param [in] path A path name describing a previously named object
      *             under which you want this new name to be defined.
-     * \param [in] name The name of the object you want to associate.
-     * \param [in] object A smart pointer to the object itself.
+     * @param [in] name The name of the object you want to associate.
+     * @param [in] object A smart pointer to the object itself.
      *
-     * \see Names::Add (Ptr<Object>,std::string,Ptr<Object>);
+     * @see Names::Add (Ptr<Object>,std::string,Ptr<Object>);
      */
     static void Add(std::string path, std::string name, Ptr<Object> object);
 
     /**
-     * \brief A low-level form of Names::Add allowing you to specify the
+     * @brief A low-level form of Names::Add allowing you to specify the
      * path to the parent object (under which you want this name to be
      * defined) in the form of a previously named object.
      *
@@ -151,16 +151,16 @@
      * have different files of the same name under different
      * directories.
      *
-     * \param [in] context A smart pointer to an object that is used
+     * @param [in] context A smart pointer to an object that is used
      *             in place of the path under which you want this new
      *             name to be defined.
-     * \param [in] name The name of the object you want to associate.
-     * \param [in] object A smart pointer to the object itself.
+     * @param [in] name The name of the object you want to associate.
+     * @param [in] object A smart pointer to the object itself.
      */
     static void Add(Ptr<Object> context, std::string name, Ptr<Object> object);
 
     /**
-     * \brief Rename a previously associated name.
+     * @brief Rename a previously associated name.
      *
      * The name may begin either with "/Names" to explicitly call out
      * the fact that the name provided is installed under the root of
@@ -183,16 +183,16 @@
      * the path "/Names/server/eth0".  Note that Names::Rename
      * ("server/csma", "eth0") would accomplish exactly the same thing.
      *
-     * \param [in] oldpath The current path name to the object you want
+     * @param [in] oldpath The current path name to the object you want
      *             to change.
-     * \param [in] newname The new name of the object you want to change.
+     * @param [in] newname The new name of the object you want to change.
      *
-     * \see Names::Add (std::string name, Ptr<Object> obj)
+     * @see Names::Add (std::string name, Ptr<Object> obj)
      */
     static void Rename(std::string oldpath, std::string newname);
 
     /**
-     * \brief An intermediate form of Names::Rename allowing you to
+     * @brief An intermediate form of Names::Rename allowing you to
      * provide a path to the parent object (under which you want this
      * name to be changed) in the form of a name path string.
      *
@@ -208,16 +208,16 @@
      * "eth0") or, using the split path and name approach, Names::Rename
      * ("/Names/server", "csma", "eth0").
      *
-     * \param [in] path A path name describing a previously named object
+     * @param [in] path A path name describing a previously named object
      *             under which you want this name change to occur
      *             (cf. directory).
-     * \param [in] oldname The currently defined name of the object.
-     * \param [in] newname The new name you want the object to have.
+     * @param [in] oldname The currently defined name of the object.
+     * @param [in] newname The new name you want the object to have.
      */
     static void Rename(std::string path, std::string oldname, std::string newname);
 
     /**
-     * \brief A low-level form of Names::Rename allowing you to specify
+     * @brief A low-level form of Names::Rename allowing you to specify
      * the path to the parent object (under which you want this name to
      * be changed) in the form of a previously named object.
      *
@@ -252,18 +252,18 @@
      * could also accomplish this by Names::Rename (node, "csma",
      * "eth0").
      *
-     * \param [in] context A smart pointer to an object that is used
+     * @param [in] context A smart pointer to an object that is used
      *             in place of the path under which you want this
      *             new name to be defined.
-     * \param [in] oldname The current shortname of the object you want
+     * @param [in] oldname The current shortname of the object you want
      *             to change.
-     * \param [in] newname The new shortname of the object you want
+     * @param [in] newname The new shortname of the object you want
      *             to change.
      */
     static void Rename(Ptr<Object> context, std::string oldname, std::string newname);
 
     /**
-     * \brief Given a pointer to an object, look to see if that object
+     * @brief Given a pointer to an object, look to see if that object
      * has a name associated with it and, if so, return the name of the
      * object otherwise return an empty string.
      *
@@ -274,16 +274,16 @@
      *
      * This method returns the name of the object, e.g., "eth0".
      *
-     * \param [in] object A smart pointer to an object for which you want
+     * @param [in] object A smart pointer to an object for which you want
      *             to find its name.
      *
-     * \returns A string containing the name of the object if found,
+     * @returns A string containing the name of the object if found,
      *          otherwise the empty string.
      */
     static std::string FindName(Ptr<Object> object);
 
     /**
-     * \brief Given a pointer to an object, look to see if that object
+     * @brief Given a pointer to an object, look to see if that object
      * has a name associated with it and return the fully qualified name
      * path of the object otherwise return an empty string.
      *
@@ -295,22 +295,22 @@
      * This method returns the name path of the object, e.g.,
      * "Names/client/eth0".
      *
-     * \param [in] object A smart pointer to an object for which you
+     * @param [in] object A smart pointer to an object for which you
      *             want to find its fullname.
      *
-     * \returns A string containing the name path of the object,
+     * @returns A string containing the name path of the object,
      *          otherwise the empty string.
      */
     static std::string FindPath(Ptr<Object> object);
 
     /**
-     * \brief Clear the list of objects associated with names.
+     * @brief Clear the list of objects associated with names.
      */
 
     static void Clear();
 
     /**
-     * \brief Given a name path string, look to see if there's an object
+     * @brief Given a name path string, look to see if there's an object
      * in the system with that associated to it.  If there is, do a
      * GetObject on the resulting object to convert it to the requested
      * typename and return it.
@@ -323,17 +323,17 @@
      * This method requires that the name path of the object be
      * provided, e.g., "Names/client/eth0".
      *
-     * \param [in] path A string containing a name space path used
+     * @param [in] path A string containing a name space path used
      *             to locate the object.
      *
-     * \returns A smart pointer to the named object converted to
+     * @returns A smart pointer to the named object converted to
      *          the requested type.
      */
     template <typename T>
     static Ptr<T> Find(std::string path);
 
     /**
-     * \brief Given a path to an object and an object name, look through
+     * @brief Given a path to an object and an object name, look through
      * the names defined under the path to see if there's an object
      * there with the given name.
      *
@@ -349,18 +349,18 @@
      * ("/Names/server/eth0") or, using the split path and name
      * approach, Names::Find ("/Names/server", "eth0").
      *
-     * \param [in] path A path name describing a previously named object
+     * @param [in] path A path name describing a previously named object
      *             under which you want to look for the specified name.
-     * \param [in] name A string containing a name to search for.
+     * @param [in] name A string containing a name to search for.
      *
-     * \returns A smart pointer to the named object converted to
+     * @returns A smart pointer to the named object converted to
      *          the requested type.
      */
     template <typename T>
     static Ptr<T> Find(std::string path, std::string name);
 
     /**
-     * \brief Given a path to an object and an object name, look through
+     * @brief Given a path to an object and an object name, look through
      * the names defined under the path to see if there's an object
      * there with the given name.
      *
@@ -391,12 +391,12 @@
      * up an internal name service entry which contains the names
      * defined for that context.
      *
-     * \param [in] context A smart pointer to an object that is used
+     * @param [in] context A smart pointer to an object that is used
      *             in place of the path under which you want this
      *             new name to be defined.
-     * \param [in] name A string containing a name to search for.
+     * @param [in] name A string containing a name to search for.
      *
-     * \returns A smart pointer to the named object converted to
+     * @returns A smart pointer to the named object converted to
      *          the requested type.
      */
     template <typename T>
@@ -404,35 +404,35 @@
 
   private:
     /**
-     * \brief Non-templated internal version of Names::Find
+     * @brief Non-templated internal version of Names::Find
      *
-     * \param [in] path A string containing the path of the object
+     * @param [in] path A string containing the path of the object
      *             to look for.
      *
-     * \returns A smart pointer to the named object.
+     * @returns A smart pointer to the named object.
      */
     static Ptr<Object> FindInternal(std::string path);
 
     /**
-     * \brief Non-templated internal version of Names::Find
+     * @brief Non-templated internal version of Names::Find
      *
-     * \param [in] path A string containing the path to search
+     * @param [in] path A string containing the path to search
      *             for the object in.
-     * \param [in] name A string containing the name of the object
+     * @param [in] name A string containing the name of the object
      *             to look for.
      *
-     * \returns A smart pointer to the named object.
+     * @returns A smart pointer to the named object.
      */
     static Ptr<Object> FindInternal(std::string path, std::string name);
 
     /**
-     * \brief Non-templated internal version of Names::Find
+     * @brief Non-templated internal version of Names::Find
      *
-     * \param [in] context A smart pointer to an object under which
+     * @param [in] context A smart pointer to an object under which
      *             you want to look for the provided name.
-     * \param [in] name A string containing the name to look for.
+     * @param [in] name A string containing the name to look for.
      *
-     * \returns A smart pointer to the named object.
+     * @returns A smart pointer to the named object.
      */
     static Ptr<Object> FindInternal(Ptr<Object> context, std::string name);
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/node-printer.cc ns-3.44/src/core/model/node-printer.cc
--- ns-3.43/src/core/model/node-printer.cc	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/node-printer.cc	2025-03-09 16:55:49.359371000 -0700
@@ -14,8 +14,8 @@
 #include <iomanip>
 
 /**
- * \file
- * \ingroup simulator
+ * @file
+ * @ingroup simulator
  * ns3::DefaultNodePrinter implementation.
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/node-printer.h ns-3.44/src/core/model/node-printer.h
--- ns-3.43/src/core/model/node-printer.h	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/node-printer.h	2025-03-09 16:55:49.359371000 -0700
@@ -11,8 +11,8 @@
 #include <ostream>
 
 /**
- * \file
- * \ingroup logging
+ * @file
+ * @ingroup logging
  * Declaration of ns3::NodePrinter function pointer type
  * and ns3::DefaultNodePrinter function.
  */
@@ -24,15 +24,15 @@
  * Function signature for prepending the node id
  * to a log message.
  *
- * \param [in,out] os The output stream to print on.
+ * @param [in,out] os The output stream to print on.
  */
 typedef void (*NodePrinter)(std::ostream& os);
 
 /**
- * \ingroup logging
+ * @ingroup logging
  * Default node id printer implementation.
  *
- * \param [in,out] os The output stream to print the node id on.
+ * @param [in,out] os The output stream to print the node id on.
  */
 void DefaultNodePrinter(std::ostream& os);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/nstime.h ns-3.44/src/core/model/nstime.h
--- ns-3.43/src/core/model/nstime.h	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/nstime.h	2025-03-09 16:55:49.359371000 -0700
@@ -22,8 +22,8 @@
 #include <stdint.h>
 
 /**
- * \file
- * \ingroup time
+ * @file
+ * @ingroup time
  * Declaration of classes ns3::Time and ns3::TimeWithUnit,
  * and the TimeValue implementation classes.
  */
@@ -34,8 +34,8 @@
 class TimeWithUnit;
 
 /**
- * \ingroup core
- * \defgroup time Virtual Time
+ * @ingroup core
+ * @defgroup time Virtual Time
  *  Management of virtual time in real world units.
  *
  * The underlying simulator is unit agnostic, just dealing with
@@ -50,7 +50,7 @@
  * base resolution, before Simulator::Run().
  */
 /**
- * \ingroup time
+ * @ingroup time
  * Simulation virtual time values and global simulation resolution.
  *
  * This class defines all the classic C++ addition/subtraction
@@ -59,12 +59,12 @@
  * compare Time objects.
  *
  * For example:
- * \code
+ * @code
  * Time t1 = Seconds (10.0);
  * Time t2 = Seconds (10.0);
  * Time t3 = t1;
  * t3 += t2;
- * \endcode
+ * @endcode
  *
  * You can also use the following non-member functions to manipulate
  * any of these ns3::Time object:
@@ -114,8 +114,8 @@
 
     /**
      *  Assignment operator
-     * \param [in] o Time to assign.
-     * \return The Time.
+     * @param [in] o Time to assign.
+     * @return The Time.
      */
     inline Time& operator=(const Time& o)
     {
@@ -136,7 +136,7 @@
     /**
      *  Copy constructor
      *
-     * \param [in] o Time to copy
+     * @param [in] o Time to copy
      */
     inline Time(const Time& o)
         : m_data(o.m_data)
@@ -150,7 +150,7 @@
     /**
      * Move constructor
      *
-     * \param [in] o Time from which take the data
+     * @param [in] o Time from which take the data
      */
     Time(Time&& o)
         : m_data(o.m_data)
@@ -162,14 +162,14 @@
     }
 
     /**
-     * \name Numeric constructors
+     * @name Numeric constructors
      * Construct from a numeric value.
      * @{
      */
     /**
      * Construct from a numeric value.
      * The current time resolution will be assumed as the unit.
-     * \param [in] v The value.
+     * @param [in] v The value.
      */
     explicit inline Time(double v)
         : m_data(llround(v))
@@ -264,14 +264,14 @@
      * and the unit. If the string only contains a number, it is treated as seconds.
      * Any otherwise malformed string causes a fatal error to occur.
      *
-     * \param [in] s The string to parse into a Time
+     * @param [in] s The string to parse into a Time
      */
     explicit Time(const std::string& s);
 
     /**
      * Minimum representable Time
      * Not to be confused with Min(Time,Time).
-     * \returns the minimum representable Time.
+     * @returns the minimum representable Time.
      */
     static Time Min()
     {
@@ -281,7 +281,7 @@
     /**
      * Maximum representable Time
      * Not to be confused with Max(Time,Time).
-     * \returns the maximum representable Time.
+     * @returns the maximum representable Time.
      */
     static Time Max()
     {
@@ -299,7 +299,7 @@
 
     /**
      * Exactly equivalent to `t == 0`.
-     * \return \c true if the time is zero, \c false otherwise.
+     * @return \c true if the time is zero, \c false otherwise.
      */
     inline bool IsZero() const
     {
@@ -308,7 +308,7 @@
 
     /**
      * Exactly equivalent to `t <= 0`.
-     * \return \c true if the time is negative or zero, \c false otherwise.
+     * @return \c true if the time is negative or zero, \c false otherwise.
      */
     inline bool IsNegative() const
     {
@@ -317,7 +317,7 @@
 
     /**
      * Exactly equivalent to `t >= 0`.
-     * \return \c true if the time is positive or zero, \c false otherwise.
+     * @return \c true if the time is positive or zero, \c false otherwise.
      */
     inline bool IsPositive() const
     {
@@ -326,7 +326,7 @@
 
     /**
      * Exactly equivalent to `t < 0`.
-     * \return \c true if the time is strictly negative, \c false otherwise.
+     * @return \c true if the time is strictly negative, \c false otherwise.
      */
     inline bool IsStrictlyNegative() const
     {
@@ -335,7 +335,7 @@
 
     /**
      * Exactly equivalent to `t > 0`.
-     * \return \c true if the time is strictly positive, \c false otherwise.
+     * @return \c true if the time is strictly positive, \c false otherwise.
      */
     inline bool IsStrictlyPositive() const
     {
@@ -345,8 +345,8 @@
     /**
      *  Compare \pname{this} to another Time
      *
-     * \param [in] o The other Time
-     * \return -1,0,+1 if `this < o`, `this == o`, or `this > o`
+     * @param [in] o The other Time
+     * @return -1,0,+1 if `this < o`, `this == o`, or `this > o`
      */
     inline int Compare(const Time& o) const
     {
@@ -354,7 +354,7 @@
     }
 
     /**
-     * \name Convert to Number in a Unit
+     * @name Convert to Number in a Unit
      * Convert a Time to number, in indicated units.
      *
      * Conversions to seconds and larger will return doubles, with
@@ -367,7 +367,7 @@
      * Get an approximation of the time stored in this instance
      * in the indicated unit.
      *
-     * \return An approximate value in the indicated unit.
+     * @return An approximate value in the indicated unit.
      */
     inline double GetYears() const
     {
@@ -422,14 +422,14 @@
     /**@}*/ // Convert to Number in a Unit.
 
     /**
-     * \name Convert to Raw Value
+     * @name Convert to Raw Value
      * Convert a Time to a number in the current resolution units.
      *
      * @{
      */
     /**
      * Get the raw time value, in the current resolution unit.
-     * \returns The raw time value
+     * @returns The raw time value
      */
     inline int64_t GetTimeStep() const
     {
@@ -449,7 +449,7 @@
     /**@}*/ // Convert to Raw Value
 
     /**
-     * \param [in] resolution The new resolution to use
+     * @param [in] resolution The new resolution to use
      *
      * Change the global resolution used to convert all
      * user-provided time values in Time objects and Time objects
@@ -457,15 +457,15 @@
      */
     static void SetResolution(Unit resolution);
     /**
-     * \returns The current global resolution.
+     * @returns The current global resolution.
      */
     static Unit GetResolution();
 
     /**
      * Create a Time in the current unit.
      *
-     * \param [in] value The value of the new Time.
-     * \return A Time with \pname{value} in the current time unit.
+     * @param [in] value The value of the new Time.
+     * @return A Time with \pname{value} in the current time unit.
      */
     inline static Time From(const int64x64_t& value)
     {
@@ -473,7 +473,7 @@
     }
 
     /**
-     * \name Create Times from Values and Units
+     * @name Create Times from Values and Units
      * Create Times from values given in the indicated units.
      *
      * @{
@@ -481,12 +481,18 @@
     /**
      * Create a Time equal to \pname{value}  in unit \c unit
      *
-     * \param [in] value The new Time value, expressed in \c unit
-     * \param [in] unit The unit of \pname{value}
-     * \return The Time representing \pname{value} in \c unit
+     * @param [in] value The new Time value, expressed in \c unit
+     * @param [in] unit The unit of \pname{value}
+     * @return The Time representing \pname{value} in \c unit
      */
     inline static Time FromInteger(uint64_t value, Unit unit)
     {
+        // Optimization: if value is 0, don't process the unit
+        if (value == 0)
+        {
+            return Time();
+        }
+
         Information* info = PeekInformation(unit);
 
         NS_ASSERT_MSG(info->isValid, "Attempted a conversion from an unavailable unit.");
@@ -504,11 +510,23 @@
 
     inline static Time FromDouble(double value, Unit unit)
     {
+        // Optimization: if value is 0, don't process the unit nor cast to int64x64_t
+        if (value == 0)
+        {
+            return Time();
+        }
+
         return From(int64x64_t(value), unit);
     }
 
     inline static Time From(const int64x64_t& value, Unit unit)
     {
+        // Optimization: if value is 0, don't process the unit
+        if (value == 0)
+        {
+            return Time();
+        }
+
         Information* info = PeekInformation(unit);
 
         NS_ASSERT_MSG(info->isValid, "Attempted a conversion from an unavailable unit.");
@@ -530,7 +548,7 @@
     /**@}*/ // Create Times from Values and Units
 
     /**
-     * \name Get Times as Numbers in Specified Units
+     * @name Get Times as Numbers in Specified Units
      * Get the Time as integers or doubles in the indicated unit.
      *
      * @{
@@ -538,11 +556,17 @@
     /**
      * Get the Time value expressed in a particular unit.
      *
-     * \param [in] unit The desired unit
-     * \return The Time expressed in \pname{unit}
+     * @param [in] unit The desired unit
+     * @return The Time expressed in \pname{unit}
      */
     inline int64_t ToInteger(Unit unit) const
     {
+        // Optimization: if value is 0, don't process the unit
+        if (m_data == 0)
+        {
+            return 0;
+        }
+
         Information* info = PeekInformation(unit);
 
         NS_ASSERT_MSG(info->isValid, "Attempted a conversion to an unavailable unit.");
@@ -561,11 +585,23 @@
 
     inline double ToDouble(Unit unit) const
     {
+        // Optimization: if value is 0, don't process the unit nor cast from int64x64_t
+        if (m_data == 0)
+        {
+            return 0;
+        }
+
         return To(unit).GetDouble();
     }
 
     inline int64x64_t To(Unit unit) const
     {
+        // Optimization: if value is 0, don't process the unit
+        if (m_data == 0)
+        {
+            return 0;
+        }
+
         Information* info = PeekInformation(unit);
 
         NS_ASSERT_MSG(info->isValid, "Attempted a conversion to an unavailable unit.");
@@ -587,8 +623,8 @@
     /**
      * Round a Time to a specific unit.
      * Rounding is to nearest integer.
-     * \param [in] unit The unit to round to.
-     * \return The Time rounded to the specific unit.
+     * @param [in] unit The unit to round to.
+     * @return The Time rounded to the specific unit.
      */
     Time RoundTo(Unit unit) const
     {
@@ -599,21 +635,21 @@
      * Attach a unit to a Time, to facilitate output in a specific unit.
      *
      * For example,
-     * \code
+     * @code
      *   Time t (3.14e9);  // Pi seconds
      *   std::cout << t.As (Time::MS) << std::endl;
-     * \endcode
+     * @endcode
      * will print ``+3140.0ms``
      *
-     * \param [in] unit The unit to use.
-     * \return The Time with embedded unit.
+     * @param [in] unit The unit to use.
+     * @return The Time with embedded unit.
      */
     TimeWithUnit As(const Unit unit = Time::AUTO) const;
 
     /**
      * TracedCallback signature for Time
      *
-     * \param [in] value Current value of Time
+     * @param [in] value Current value of Time
      */
     typedef void (*TracedCallback)(Time value);
 
@@ -639,7 +675,7 @@
     /**
      *  Get the current Resolution
      *
-     *  \return A pointer to the current Resolution
+     *  @return A pointer to the current Resolution
      */
     static inline Resolution* PeekResolution()
     {
@@ -650,8 +686,8 @@
     /**
      *  Get the Information record for \pname{timeUnit} for the current Resolution
      *
-     *  \param [in] timeUnit The Unit to get Information for
-     *  \return The Information for \pname{timeUnit}
+     *  @param [in] timeUnit The Unit to get Information for
+     *  @return The Information for \pname{timeUnit}
      */
     static inline Information* PeekInformation(Unit timeUnit)
     {
@@ -661,15 +697,15 @@
     /**
      *  Set the default resolution
      *
-     *  \return The Resolution object for the default resolution.
+     *  @return The Resolution object for the default resolution.
      */
     static Resolution& SetDefaultNsResolution();
     /**
      *  Set the current Resolution.
      *
-     *  \param [in] unit The unit to use as the new resolution.
-     *  \param [in,out] resolution The Resolution record to update.
-     *  \param [in] convert Whether to convert existing Time objects to the new resolution.
+     *  @param [in] unit The unit to use as the new resolution.
+     *  @param [in,out] resolution The Resolution record to update.
+     *  @param [in] convert Whether to convert existing Time objects to the new resolution.
      */
     static void SetResolution(Unit unit, Resolution* resolution, const bool convert = true);
 
@@ -677,7 +713,7 @@
      *  Record all instances of Time, so we can rescale them when
      *  the resolution changes.
      *
-     *  \internal
+     *  @internal
      *
      *  We use a std::set so we can remove the record easily when
      *  ~Time() is called.
@@ -698,7 +734,7 @@
      *  Record of outstanding Time objects which will need conversion
      *  when the resolution is set.
      *
-     *  \internal
+     *  @internal
      *
      *  Use a classic static variable so we can check in Time ctors
      *  without a function call.
@@ -714,48 +750,48 @@
     /**
      *  Function to force static initialization of Time.
      *
-     * \return \c true on the first call
+     * @return \c true on the first call
      */
     static bool StaticInit();
 
   private:
     /**
-     * \cond HIDE_FROM_DOXYGEN
+     * @cond HIDE_FROM_DOXYGEN
      * Doxygen bug throws a warning here, so hide from Doxygen.
      *
      * Friend the Simulator class so it can call the private function
      * ClearMarkedTimes ()
      */
     friend class Simulator;
-    /** \endcond */
+    /** @endcond */
 
     /**
      *  Remove all MarkedTimes.
      *
-     *  \internal
+     *  @internal
      *  Has to be visible to the Simulator class, hence the friending.
      */
     static void ClearMarkedTimes();
     /**
      *  Record a Time instance with the MarkedTimes.
-     *  \param [in] time The Time instance to record.
+     *  @param [in] time The Time instance to record.
      */
     static void Mark(Time* const time);
     /**
      *  Remove a Time instance from the MarkedTimes, called by ~Time().
-     *  \param [in] time The Time instance to remove.
+     *  @param [in] time The Time instance to remove.
      */
     static void Clear(Time* const time);
     /**
      *  Convert existing Times to the new unit.
-     *  \param [in] unit The Unit to convert existing Times to.
+     *  @param [in] unit The Unit to convert existing Times to.
      */
     static void ConvertTimes(const Unit unit);
 
     // Operator and related functions which need access
 
     /**
-     * \name Comparison operators
+     * @name Comparison operators
      * @{
      */
     friend bool operator==(const Time& lhs, const Time& rhs);
@@ -768,7 +804,7 @@
     /**@}*/ // Comparison operators
 
     /**
-     * \name Arithmetic operators
+     * @name Arithmetic operators
      * @{
      */
     friend Time operator+(const Time& lhs, const Time& rhs);
@@ -805,7 +841,7 @@
     friend std::enable_if_t<std::is_floating_point_v<T>, Time> operator/(const Time& lhs, T rhs);
 
     /**
-     * \name Compound assignment operators
+     * @name Compound assignment operators
      * @{
      */
     friend Time& operator+=(Time& lhs, const Time& rhs);
@@ -822,8 +858,8 @@
 /**
  * TracedValue callback signature for Time
  *
- * \param [in] oldValue Original value of the traced variable
- * \param [in] newValue New value of the traced variable
+ * @param [in] oldValue Original value of the traced variable
+ * @param [in] newValue New value of the traced variable
  */
 typedef void (*Time)(Time oldValue, Time newValue);
 
@@ -831,9 +867,9 @@
 
 /**
  * Equality operator for Time.
- * \param [in] lhs The first value
- * \param [in] rhs The second value
- * \returns \c true if the two input values are equal.
+ * @param [in] lhs The first value
+ * @param [in] rhs The second value
+ * @returns \c true if the two input values are equal.
  */
 inline bool
 operator==(const Time& lhs, const Time& rhs)
@@ -843,9 +879,9 @@
 
 /**
  * Inequality operator for Time.
- * \param [in] lhs The first value
- * \param [in] rhs The second value
- * \returns \c true if the two input values not are equal.
+ * @param [in] lhs The first value
+ * @param [in] rhs The second value
+ * @returns \c true if the two input values not are equal.
  */
 inline bool
 operator!=(const Time& lhs, const Time& rhs)
@@ -855,9 +891,9 @@
 
 /**
  * Less than or equal operator for Time.
- * \param [in] lhs The first value
- * \param [in] rhs The second value
- * \returns \c true if the first input value is less than or equal to the second input value.
+ * @param [in] lhs The first value
+ * @param [in] rhs The second value
+ * @returns \c true if the first input value is less than or equal to the second input value.
  */
 inline bool
 operator<=(const Time& lhs, const Time& rhs)
@@ -867,9 +903,9 @@
 
 /**
  * Greater than or equal operator for Time.
- * \param [in] lhs The first value
- * \param [in] rhs The second value
- * \returns \c true if the first input value is greater than or equal to the second input value.
+ * @param [in] lhs The first value
+ * @param [in] rhs The second value
+ * @returns \c true if the first input value is greater than or equal to the second input value.
  */
 inline bool
 operator>=(const Time& lhs, const Time& rhs)
@@ -879,9 +915,9 @@
 
 /**
  * Less than operator for Time.
- * \param [in] lhs The first value
- * \param [in] rhs The second value
- * \returns \c true if the first input value is less than the second input value.
+ * @param [in] lhs The first value
+ * @param [in] rhs The second value
+ * @returns \c true if the first input value is less than the second input value.
  */
 inline bool
 operator<(const Time& lhs, const Time& rhs)
@@ -891,9 +927,9 @@
 
 /**
  * Greater than operator for Time.
- * \param [in] lhs The first value
- * \param [in] rhs The second value
- * \returns \c true if the first input value is greater than the second input value.
+ * @param [in] lhs The first value
+ * @param [in] rhs The second value
+ * @returns \c true if the first input value is greater than the second input value.
  */
 inline bool
 operator>(const Time& lhs, const Time& rhs)
@@ -913,9 +949,9 @@
  *
  *     if (when < m_event) ...
  *
- * \param [in] time The Time operand.
- * \param [in] event The EventId
- * \returns \c true if \p time is before (less than) the
+ * @param [in] time The Time operand.
+ * @param [in] event The EventId
+ * @returns \c true if \p time is before (less than) the
  *          time stamp of the EventId.
  */
 inline bool
@@ -932,9 +968,9 @@
 
 /**
  * Addition operator for Time.
- * \param [in] lhs The first value
- * \param [in] rhs The second value
- * \returns The sum of the two input values.
+ * @param [in] lhs The first value
+ * @param [in] rhs The second value
+ * @returns The sum of the two input values.
  */
 inline Time
 operator+(const Time& lhs, const Time& rhs)
@@ -944,9 +980,9 @@
 
 /**
  * Subtraction operator for Time.
- * \param [in] lhs The first value
- * \param [in] rhs The second value
- * \returns The difference of the two input values.
+ * @param [in] lhs The first value
+ * @param [in] rhs The second value
+ * @returns The difference of the two input values.
  */
 inline Time
 operator-(const Time& lhs, const Time& rhs)
@@ -956,9 +992,9 @@
 
 /**
  * Scale a Time by a numeric value.
- * \param [in] lhs The first value
- * \param [in] rhs The second value
- * \returns The Time scaled by the other operand.
+ * @param [in] lhs The first value
+ * @param [in] rhs The second value
+ * @returns The Time scaled by the other operand.
  */
 inline Time
 operator*(const Time& lhs, const int64x64_t& rhs)
@@ -970,9 +1006,9 @@
 
 /**
  * Scale a Time by a numeric value.
- * \param [in] lhs The first value
- * \param [in] rhs The second value
- * \returns The Time scaled by the other operand.
+ * @param [in] lhs The first value
+ * @param [in] rhs The second value
+ * @returns The Time scaled by the other operand.
  */
 inline Time
 operator*(const int64x64_t& lhs, const Time& rhs)
@@ -983,11 +1019,11 @@
 /**
  * Scale a Time by an integer value.
  *
- * \tparam T Integer data type (int, long, etc.)
+ * @tparam T Integer data type (int, long, etc.)
  *
- * \param [in] lhs The Time instance to scale
- * \param [in] rhs The scale value
- * \returns A new Time instance containing the scaled value
+ * @param [in] lhs The Time instance to scale
+ * @param [in] rhs The scale value
+ * @returns A new Time instance containing the scaled value
  */
 template <class T>
 std::enable_if_t<std::is_integral_v<T>, Time>
@@ -1013,11 +1049,11 @@
  * value.  It swaps the arguments so that the Time argument comes first
  * and calls the appropriate overload of operator*
  *
- * \tparam T Arithmetic data type (int, long, float, etc.)
+ * @tparam T Arithmetic data type (int, long, float, etc.)
  *
- * \param [in] lhs The scale value
- * \param [in] rhs The Time instance to scale
- * \returns A new Time instance containing the scaled value
+ * @param [in] lhs The scale value
+ * @param [in] rhs The Time instance to scale
+ * @returns A new Time instance containing the scaled value
  */
 template <class T>
 std::enable_if_t<std::is_arithmetic_v<T>, Time>
@@ -1032,17 +1068,17 @@
  * This can be truncated to integer, or converted to double
  * (with loss of precision).  Assuming `ta` and `tb` are Times:
  *
- * \code
+ * @code
  *     int64x64_t ratio = ta / tb;
  *
  *     int64_t i = ratio.GetHigh ();      // Get just the integer part, resulting in truncation
  *
  *     double ratioD = double (ratio);    // Convert to double, with loss of precision
- * \endcode
+ * @endcode
  *
- * \param [in] lhs The first value
- * \param [in] rhs The second value
- * \returns The exact ratio of the two operands.
+ * @param [in] lhs The first value
+ * @param [in] rhs The second value
+ * @returns The exact ratio of the two operands.
  */
 inline int64x64_t
 operator/(const Time& lhs, const Time& rhs)
@@ -1054,9 +1090,9 @@
 
 /**
  * Scale a Time by a numeric value.
- * \param [in] lhs The first value
- * \param [in] rhs The second value
- * \returns The Time divided by the scalar operand.
+ * @param [in] lhs The first value
+ * @param [in] rhs The second value
+ * @returns The Time divided by the scalar operand.
  */
 inline Time
 operator/(const Time& lhs, const int64x64_t& rhs)
@@ -1069,11 +1105,11 @@
 /**
  * Divide a Time by an integer value.
  *
- * \tparam T Integer data type (int, long, etc.)
+ * @tparam T Integer data type (int, long, etc.)
  *
- * \param [in] lhs The Time instance to scale
- * \param [in] rhs The scale value
- * \returns A new Time instance containing the scaled value
+ * @param [in] lhs The Time instance to scale
+ * @param [in] rhs The scale value
+ * @returns A new Time instance containing the scaled value
  */
 template <class T>
 std::enable_if_t<std::is_integral_v<T>, Time>
@@ -1099,10 +1135,10 @@
  *
  *     Rem (ta, tb)  ==  ta % tb;
  *
- * \see Div()
- * \param [in] lhs The first time value
- * \param [in] rhs The second time value
- * \returns The remainder of `lhs / rhs`.
+ * @see Div()
+ * @param [in] lhs The first time value
+ * @param [in] rhs The second time value
+ * @returns The remainder of `lhs / rhs`.
  * @{
  */
 inline Time
@@ -1127,17 +1163,17 @@
  *
  * As usual, if `ta`, and `tb` are both Times
  *
- * \code
+ * @code
  *     ta  ==  tb * Div (ta, tb) + Rem (ta, tb);
  *
  *     ta  ==  tb * (ta / tb).GetHigh()  + ta % tb;
- * \endcode
+ * @endcode
  *
- * \param [in] lhs The first value
- * \param [in] rhs The second value
- * \returns The integer portion of `lhs / rhs`.
+ * @param [in] lhs The first value
+ * @param [in] rhs The second value
+ * @returns The integer portion of `lhs / rhs`.
  *
- * \see Rem()
+ * @see Rem()
  */
 inline int64_t
 Div(const Time& lhs, const Time& rhs)
@@ -1147,9 +1183,9 @@
 
 /**
  * Compound addition assignment for Time.
- * \param [in] lhs The first value
- * \param [in] rhs The second value
- * \returns The sum of the two inputs.
+ * @param [in] lhs The first value
+ * @param [in] rhs The second value
+ * @returns The sum of the two inputs.
  */
 inline Time&
 operator+=(Time& lhs, const Time& rhs)
@@ -1160,9 +1196,9 @@
 
 /**
  * Compound subtraction assignment for Time.
- * \param [in] lhs The first value
- * \param [in] rhs The second value
- * \returns The difference of the two operands.
+ * @param [in] lhs The first value
+ * @param [in] rhs The second value
+ * @returns The difference of the two operands.
  */
 inline Time&
 operator-=(Time& lhs, const Time& rhs)
@@ -1173,8 +1209,8 @@
 
 /**
  * Absolute value for Time.
- * \param [in] time The Time value
- * \returns The absolute value of the input.
+ * @param [in] time The Time value
+ * @returns The absolute value of the input.
  */
 inline Time
 Abs(const Time& time)
@@ -1184,9 +1220,9 @@
 
 /**
  * Maximum of two Times.
- * \param [in] timeA The first value
- * \param [in] timeB The second value
- * \returns The larger of the two operands.
+ * @param [in] timeA The first value
+ * @param [in] timeB The second value
+ * @returns The larger of the two operands.
  */
 inline Time
 Max(const Time& timeA, const Time& timeB)
@@ -1196,9 +1232,9 @@
 
 /**
  * Minimum of two Times.
- * \param [in] timeA The first value
- * \param [in] timeB The second value
- * \returns The smaller of the two operands.
+ * @param [in] timeA The first value
+ * @param [in] timeB The second value
+ * @returns The smaller of the two operands.
  */
 inline Time
 Min(const Time& timeA, const Time& timeB)
@@ -1220,11 +1256,11 @@
  * The stream `width` and `precision` are ignored; Time output always
  * includes ".0".
  *
- * \see As() for more flexible output formatting.
+ * @see As() for more flexible output formatting.
  *
- * \param [in,out] os The output stream.
- * \param [in] time The Time to put on the stream.
- * \return The stream.
+ * @param [in,out] os The output stream.
+ * @param [in] time The Time to put on the stream.
+ * @return The stream.
  */
 std::ostream& operator<<(std::ostream& os, const Time& time);
 /**
@@ -1232,28 +1268,28 @@
  *
  * Uses the Time(const std::string &) constructor
  *
- * \param [in,out] is The input stream.
- * \param [out] time The Time variable to set from the stream data.
- * \return The stream.
+ * @param [in,out] is The input stream.
+ * @param [out] time The Time variable to set from the stream data.
+ * @return The stream.
  */
 std::istream& operator>>(std::istream& is, Time& time);
 
 /**
- * \ingroup time
- * \defgroup timecivil Standard Time Units.
+ * @ingroup time
+ * @defgroup timecivil Standard Time Units.
  * Convenience constructors in standard units.
  *
  * For example:
- * \code
+ * @code
  *   Time t = Seconds (2.0);
  *   Simulator::Schedule (Seconds (5.0), ...);
- * \endcode
+ * @endcode
  */
 /**
- * \ingroup timecivil
+ * @ingroup timecivil
  * Construct a Time in the indicated unit.
- * \param [in] value The value
- * \return The Time
+ * @param [in] value The value
+ * @return The Time
  * @{
  */
 inline Time
@@ -1381,10 +1417,10 @@
 /**
  * Scheduler interface.
  *
- * \note This is internal to the Time implementation.
- * \param [in] ts The time value, in the current unit.
- * \return A Time.
- * \relates Time
+ * @note This is internal to the Time implementation.
+ * @param [in] ts The time value, in the current unit.
+ * @return A Time.
+ * @relates Time
  */
 inline Time
 TimeStep(uint64_t ts)
@@ -1396,21 +1432,21 @@
 ATTRIBUTE_ACCESSOR_DEFINE(Time);
 
 /**
- * \ingroup attribute_Time
+ * @ingroup attribute_Time
  * Helper to make a Time checker with bounded range.
  * Both limits are inclusive
  *
- * \param [in] min Minimum allowed value.
- * \param [in] max Maximum allowed value.
- * \return The AttributeChecker
+ * @param [in] min Minimum allowed value.
+ * @param [in] max Maximum allowed value.
+ * @return The AttributeChecker
  */
 Ptr<const AttributeChecker> MakeTimeChecker(const Time min, const Time max);
 
 /**
- * \ingroup attribute_Time
+ * @ingroup attribute_Time
  * Helper to make an unbounded Time checker.
  *
- * \return The AttributeChecker
+ * @return The AttributeChecker
  */
 inline Ptr<const AttributeChecker>
 MakeTimeChecker()
@@ -1419,11 +1455,11 @@
 }
 
 /**
- * \ingroup attribute_Time
+ * @ingroup attribute_Time
  * Helper to make a Time checker with a lower bound.
  *
- * \param [in] min Minimum allowed value.
- * \return The AttributeChecker
+ * @param [in] min Minimum allowed value.
+ * @return The AttributeChecker
  */
 inline Ptr<const AttributeChecker>
 MakeTimeChecker(const Time min)
@@ -1432,7 +1468,7 @@
 }
 
 /**
- * \ingroup time
+ * @ingroup time
  * A Time with attached unit, to facilitate output in that unit.
  */
 class TimeWithUnit
@@ -1441,8 +1477,8 @@
     /**
      * Attach a unit to a Time
      *
-     * \param [in] time The time.
-     * \param [in] unit The unit to use for output
+     * @param [in] time The time.
+     * @param [in] unit The unit to use for output
      */
     TimeWithUnit(const Time time, const Time::Unit unit)
         : m_time(time),
@@ -1456,30 +1492,30 @@
 
     /**
      * Output streamer
-     * \param [in,out] os The stream.
-     * \param [in] timeU The Time with desired unit
-     * \returns The stream.
+     * @param [in,out] os The stream.
+     * @param [in] timeU The Time with desired unit
+     * @returns The stream.
      */
     friend std::ostream& operator<<(std::ostream& os, const TimeWithUnit& timeU);
 
 }; // class TimeWithUnit
 
 /**
- * \ingroup time
+ * @ingroup time
  *
  * ns3::TypeNameGet<Time>() specialization.
- * \returns The type name as a string.
+ * @returns The type name as a string.
  */
 TYPENAMEGET_DEFINE(Time);
 
 /**
- * \ingroup time
+ * @ingroup time
  *
- * \brief Helper class to force static initialization
+ * @brief Helper class to force static initialization
  * of Time in each compilation unit, ensuring it is
  * initialized before usage.
  * This is internal to the Time implementation.
- * \relates Time
+ * @relates Time
  */
 class TimeInitializationHelper
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/object-base.cc ns-3.44/src/core/model/object-base.cc
--- ns-3.43/src/core/model/object-base.cc	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/object-base.cc	2025-03-09 16:55:49.359371000 -0700
@@ -17,8 +17,8 @@
 #include "ns3/core-config.h"
 
 /**
- * \file
- * \ingroup object
+ * @file
+ * @ingroup object
  * ns3::ObjectBase class implementation.
  */
 
@@ -27,9 +27,9 @@
 // Explicit instantiation declaration
 
 /**
- * \ingroup callback
+ * @ingroup callback
  * Explicit instantiation for ObjectBase
- * \return A wrapper Callback
+ * @return A wrapper Callback
  * \sa ns3::MakeCallback
  */
 template Callback<ObjectBase*> MakeCallback<ObjectBase*>(ObjectBase* (*)());
@@ -44,9 +44,9 @@
  * Ensure the TypeId for ObjectBase gets fully configured
  * to anchor the inheritance tree properly.
  *
- * \relates ns3::ObjectBase
+ * @relates ns3::ObjectBase
  *
- * \return The TypeId for ObjectBase.
+ * @return The TypeId for ObjectBase.
  */
 static TypeId
 GetObjectIid()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/object-base.h ns-3.44/src/core/model/object-base.h
--- ns-3.43/src/core/model/object-base.h	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/object-base.h	2025-03-09 16:55:49.359371000 -0700
@@ -16,15 +16,15 @@
 #include <string>
 
 /**
- * \file
- * \ingroup object
+ * @file
+ * @ingroup object
  * ns3::ObjectBase declaration and
  * NS_OBJECT_ENSURE_REGISTERED() macro definition.
  */
 
 /**
- * \ingroup object
- * \brief Register an Object subclass with the TypeId system.
+ * @ingroup object
+ * @brief Register an Object subclass with the TypeId system.
  *
  * This macro should be invoked once for every class which
  * defines a new GetTypeId method.
@@ -46,8 +46,8 @@
     } Object##type##RegistrationVariable
 
 /**
- * \ingroup object
- * \brief Explicitly instantiate a template class with one template parameter
+ * @ingroup object
+ * @brief Explicitly instantiate a template class with one template parameter
  *        and register the resulting instance with the TypeId system.
  *
  * This macro should be invoked once for every required instance of a template
@@ -57,12 +57,12 @@
  * If the template class is in a namespace, then the macro call should also be
  * in the namespace.
  *
- * \note The type names used as arguments for this macro, being used to form a
+ * @note The type names used as arguments for this macro, being used to form a
  * class name and a variable name, CANNOT contain the scope resolution
  * operator (::)
  *
- * \tparam type the template class
- * \tparam param the first template parameter
+ * @tparam type the template class
+ * @tparam param the first template parameter
  */
 #define NS_OBJECT_TEMPLATE_CLASS_DEFINE(type, param)                                               \
     template class type<param>;                                                                    \
@@ -83,8 +83,8 @@
     } Object##type##param##RegistrationVariable
 
 /**
- * \ingroup object
- * \brief Explicitly instantiate a template class with two template parameters
+ * @ingroup object
+ * @brief Explicitly instantiate a template class with two template parameters
  *        and register the resulting instance with the TypeId system.
  *
  * This macro should be invoked once for every required instance of a template
@@ -94,13 +94,13 @@
  * If the template class is in a namespace, then the macro call should also be
  * in the namespace.
  *
- * \note The type names used as arguments for this macro, being used to form a
+ * @note The type names used as arguments for this macro, being used to form a
  * class name and a variable name, CANNOT contain the scope resolution
  * operator (::)
  *
- * \tparam type the template class
- * \tparam param1 the first template parameter
- * \tparam param2 the second template parameter
+ * @tparam type the template class
+ * @tparam param1 the first template parameter
+ * @tparam param2 the second template parameter
  */
 #define NS_OBJECT_TEMPLATE_CLASS_TWO_DEFINE(type, param1, param2)                                  \
     template class type<param1, param2>;                                                           \
@@ -124,9 +124,9 @@
 {
 
 /**
- * \brief Helper function to get the name (as a string) of the type
+ * @brief Helper function to get the name (as a string) of the type
  *        of a template class
- * \return the name of the type of a template class as a string
+ * @return the name of the type of a template class as a string
  *
  * A specialization of this function is defined by the
  * NS_OBJECT_TEMPLATE_CLASS_DEFINE macro.
@@ -135,9 +135,9 @@
 std::string DoGetTemplateClassName();
 
 /**
- * \brief Helper function to get the name (as a string) of the type
+ * @brief Helper function to get the name (as a string) of the type
  *        of a template class
- * \return the name of the type of a template class as a string
+ * @return the name of the type of a template class as a string
  */
 template <typename T>
 std::string
@@ -149,9 +149,9 @@
 class AttributeConstructionList;
 
 /**
- * \ingroup object
+ * @ingroup object
  *
- * \brief Anchor the ns-3 type and attribute system.
+ * @brief Anchor the ns-3 type and attribute system.
  *
  * Every class which wants to integrate in the ns-3 type and attribute
  * system should derive from this base class. This base class provides:
@@ -163,7 +163,7 @@
   public:
     /**
      * Get the type ID.
-     * \return The object TypeId.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
@@ -179,7 +179,7 @@
      * but some classes which derive from ns3::ObjectBase directly
      * have to implement it themselves.
      *
-     * \return The TypeId associated to the most-derived type
+     * @return The TypeId associated to the most-derived type
      *          of this instance.
      */
     virtual TypeId GetInstanceTypeId() const = 0;
@@ -195,8 +195,8 @@
      *   - The attribute can't be set (no Setter).
      *   - The attribute couldn't be deserialized from the AttributeValue.
      *
-     * \param [in] name The name of the attribute to set.
-     * \param [in] value The name of the attribute to set.
+     * @param [in] name The name of the attribute to set.
+     * @param [in] value The name of the attribute to set.
      */
     void SetAttribute(std::string name, const AttributeValue& value);
     /**
@@ -205,9 +205,9 @@
      * If the attribute could not be set this will return \c false,
      * but not raise any errors.
      *
-     * \param [in] name The name of the attribute to set.
-     * \param [in] value The value to set it to.
-     * \return \c true if the requested attribute exists and could be set,
+     * @param [in] name The name of the attribute to set.
+     * @param [in] value The value to set it to.
+     * @return \c true if the requested attribute exists and could be set,
      *         \c false otherwise.
      */
     bool SetAttributeFailSafe(std::string name, const AttributeValue& value);
@@ -222,9 +222,9 @@
      *   - The attribute doesn't support string formatting.
      *   - The attribute couldn't be serialized into the AttributeValue.
      *
-     * \param [in]  name The name of the attribute to read.
-     * \param [out] value Where the result should be stored.
-     * \param [in] permissive If false (by default), will generate warnings and errors for
+     * @param [in]  name The name of the attribute to read.
+     * @param [out] value Where the result should be stored.
+     * @param [in] permissive If false (by default), will generate warnings and errors for
      * deprecated and obsolete attributes, respectively. If set to true, warnings for deprecated
      * attributes will be suppressed.
      */
@@ -235,9 +235,9 @@
      * If the attribute could not be read this will return \c false,
      * but not raise any errors.
      *
-     * \param [in]  name The name of the attribute to read.
-     * \param [out] value Where the result value should be stored.
-     * \return \c true if the requested attribute was found, \c false otherwise.
+     * @param [in]  name The name of the attribute to read.
+     * @param [out] value Where the result value should be stored.
+     * @return \c true if the requested attribute was found, \c false otherwise.
      */
     bool GetAttributeFailSafe(std::string name, AttributeValue& value) const;
 
@@ -246,10 +246,10 @@
      *
      * The target trace source should be registered with TypeId::AddTraceSource.
      *
-     * \param [in] name The name of the target trace source.
-     * \param [in] context The trace context associated to the callback.
-     * \param [in] cb The callback to connect to the trace source.
-     * \returns \c true on success, \c false if TraceSource was not found.
+     * @param [in] name The name of the target trace source.
+     * @param [in] context The trace context associated to the callback.
+     * @param [in] cb The callback to connect to the trace source.
+     * @returns \c true on success, \c false if TraceSource was not found.
      */
     bool TraceConnect(std::string name, std::string context, const CallbackBase& cb);
     /**
@@ -257,9 +257,9 @@
      *
      * The target trace source should be registered with TypeId::AddTraceSource.
      *
-     * \param [in] name The name of the target trace source.
-     * \param [in] cb The callback to connect to the trace source.
-     * \returns \c true on success, \c false if TraceSource was not found.
+     * @param [in] name The name of the target trace source.
+     * @param [in] cb The callback to connect to the trace source.
+     * @returns \c true on success, \c false if TraceSource was not found.
      */
     bool TraceConnectWithoutContext(std::string name, const CallbackBase& cb);
     /**
@@ -268,10 +268,10 @@
      *
      * The target trace source should be registered with TypeId::AddTraceSource.
      *
-     * \param [in] name The name of the target trace source.
-     * \param [in] context The trace context associated to the callback.
-     * \param [in] cb The callback to disconnect from the trace source.
-     * \returns \c true on success, \c false if TraceSource was not found.
+     * @param [in] name The name of the target trace source.
+     * @param [in] context The trace context associated to the callback.
+     * @param [in] cb The callback to disconnect from the trace source.
+     * @returns \c true on success, \c false if TraceSource was not found.
      */
     bool TraceDisconnect(std::string name, std::string context, const CallbackBase& cb);
     /**
@@ -280,9 +280,9 @@
      *
      * The target trace source should be registered with TypeId::AddTraceSource.
      *
-     * \param [in] name The name of the target trace source.
-     * \param [in] cb The callback to disconnect from the trace source.
-     * \returns \c true on success, \c false if TraceSource was not found.
+     * @param [in] name The name of the target trace source.
+     * @param [in] cb The callback to disconnect from the trace source.
+     * @returns \c true on success, \c false if TraceSource was not found.
      */
     bool TraceDisconnectWithoutContext(std::string name, const CallbackBase& cb);
 
@@ -306,7 +306,7 @@
      * you should make sure that you invoke this method from
      * your most-derived constructor.
      *
-     * \param [in] attributes The attribute values used to initialize
+     * @param [in] attributes The attribute values used to initialize
      *        the member variables of this object's instance.
      */
     void ConstructSelf(const AttributeConstructionList& attributes);
@@ -316,10 +316,10 @@
      * Attempt to set the value referenced by the accessor \pname{spec}
      * to a valid value according to the \c checker, based on \pname{value}.
      *
-     * \param [in] spec The accessor for the storage location.
-     * \param [in] checker The checker to use in validating the value.
-     * \param [in] value The value to attempt to store.
-     * \returns \c true if the \c value could be validated by the \pname{checker}
+     * @param [in] spec The accessor for the storage location.
+     * @param [in] checker The checker to use in validating the value.
+     * @param [in] value The value to attempt to store.
+     * @returns \c true if the \c value could be validated by the \pname{checker}
      *          and written to the storage location.
      */
     bool DoSet(Ptr<const AttributeAccessor> spec,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/object.cc ns-3.44/src/core/model/object.cc
--- ns-3.43/src/core/model/object.cc	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/object.cc	2025-03-09 16:55:49.359371000 -0700
@@ -21,8 +21,8 @@
 #include <vector>
 
 /**
- * \file
- * \ingroup object
+ * @file
+ * @ingroup object
  * ns3::Object class implementation.
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/object-factory.cc ns-3.44/src/core/model/object-factory.cc
--- ns-3.43/src/core/model/object-factory.cc	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/object-factory.cc	2025-03-09 16:55:49.359371000 -0700
@@ -12,8 +12,8 @@
 #include <sstream>
 
 /**
- * \file
- * \ingroup object
+ * @file
+ * @ingroup object
  * ns3::ObjectFactory class implementation.
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/object-factory.h ns-3.44/src/core/model/object-factory.h
--- ns-3.43/src/core/model/object-factory.h	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/object-factory.h	2025-03-09 16:55:49.359371000 -0700
@@ -13,8 +13,8 @@
 #include "type-id.h"
 
 /**
- * \file
- * \ingroup object
+ * @file
+ * @ingroup object
  * ns3::ObjectFactory class declaration.
  */
 
@@ -24,14 +24,14 @@
 class AttributeValue;
 
 /**
- * \ingroup object
+ * @ingroup object
  *
- * \brief Instantiate subclasses of ns3::Object.
+ * @brief Instantiate subclasses of ns3::Object.
  *
  * This class can also hold a set of attributes to set
  * automatically during the object construction.
  *
- * \see attribute_ObjectFactory
+ * @see attribute_ObjectFactory
  */
 class ObjectFactory
 {
@@ -46,9 +46,9 @@
     /**
      * Construct a factory for a specific TypeId by name.
      *
-     * \tparam Args \deduced Template type parameter pack for the sequence of name-value pairs
-     * \param [in] typeId The name of the TypeId this factory should create.
-     * \param [in] args A sequence of name-value pairs of additional attributes to set.
+     * @tparam Args \deduced Template type parameter pack for the sequence of name-value pairs
+     * @param [in] typeId The name of the TypeId this factory should create.
+     * @param [in] args A sequence of name-value pairs of additional attributes to set.
      *
      * The args sequence can be made of any number of pairs, each consisting of a
      * name (of std::string type) followed by a value (of const AttributeValue & type).
@@ -60,7 +60,7 @@
     /**
      * Set the TypeId of the Objects to be created by this factory.
      *
-     * \param [in] tid The TypeId of the object to instantiate.
+     * @param [in] tid The TypeId of the object to instantiate.
      */
     void SetTypeId(TypeId tid);
     void SetTypeId(std::string tid);
@@ -69,17 +69,17 @@
     /**
      * Check if the ObjectFactory has been configured with a TypeId
      *
-     * \return true if a TypeId has been configured to the ObjectFactory
+     * @return true if a TypeId has been configured to the ObjectFactory
      */
     bool IsTypeIdSet() const;
 
     /**
      * Set an attribute to be set during construction.
      *
-     * \tparam Args \deduced Template type parameter pack for the sequence of name-value pairs
-     * \param [in] name The name of the attribute to set.
-     * \param [in] value The value of the attribute to set.
-     * \param [in] args A sequence of name-value pairs of additional attributes to set.
+     * @tparam Args \deduced Template type parameter pack for the sequence of name-value pairs
+     * @param [in] name The name of the attribute to set.
+     * @param [in] value The value of the attribute to set.
+     * @param [in] args A sequence of name-value pairs of additional attributes to set.
      *
      * The args sequence can be made of any number of pairs, each consisting of a
      * name (of std::string type) followed by a value (of const AttributeValue & type).
@@ -97,14 +97,14 @@
 
     /**
      * Get the TypeId which will be created by this ObjectFactory.
-     * \returns The currently-selected TypeId.
+     * @returns The currently-selected TypeId.
      */
     TypeId GetTypeId() const;
 
     /**
      * Create an Object instance of the configured TypeId.
      *
-     * \returns A new object instance.
+     * @returns A new object instance.
      */
     Ptr<Object> Create() const;
     /**
@@ -114,8 +114,8 @@
      * returning a pointer of the requested type to the user. This method
      * is really syntactical sugar.
      *
-     * \tparam T \explicit The requested Object type.
-     * \returns A new object instance.
+     * @tparam T \explicit The requested Object type.
+     * @returns A new object instance.
      */
     template <typename T>
     Ptr<T> Create() const;
@@ -124,8 +124,8 @@
     /**
      * Set an attribute to be set during construction.
      *
-     * \param [in] name The name of the attribute to set.
-     * \param [in] value The value of the attribute to set.
+     * @param [in] name The name of the attribute to set.
+     * @param [in] value The value of the attribute to set.
      */
     void DoSet(const std::string& name, const AttributeValue& value);
     /**
@@ -134,9 +134,9 @@
      * The configuration will be printed as a string with the form
      * "<TypeId-name>[<attribute-name>=<attribute-value>|...]"
      *
-     * \param [in,out] os The stream.
-     * \param [in] factory The ObjectFactory.
-     * \returns The stream.
+     * @param [in,out] os The stream.
+     * @param [in] factory The ObjectFactory.
+     * @returns The stream.
      */
     friend std::ostream& operator<<(std::ostream& os, const ObjectFactory& factory);
     /**
@@ -145,9 +145,9 @@
      * The configuration should be in the form
      * "<TypeId-name>[<attribute-name>=<attribute-value>|...]"
      *
-     * \param [in,out] is The input stream.
-     * \param [out] factory The factory to configure as described by the stream.
-     * \return The stream.
+     * @param [in,out] is The input stream.
+     * @param [out] factory The factory to configure as described by the stream.
+     * @return The stream.
      */
     friend std::istream& operator>>(std::istream& is, ObjectFactory& factory);
 
@@ -164,13 +164,13 @@
 std::istream& operator>>(std::istream& is, ObjectFactory& factory);
 
 /**
- * \ingroup object
+ * @ingroup object
  * Allocate an Object on the heap and initialize with a set of attributes.
  *
- * \tparam T \explicit The requested Object type.
- * \tparam Args \deduced The type of the sequence of name-value pairs.
- * \param [in] args A sequence of name-value pairs of the attributes to set.
- * \returns A pointer to a newly allocated object.
+ * @tparam T \explicit The requested Object type.
+ * @tparam Args \deduced The type of the sequence of name-value pairs.
+ * @param [in] args A sequence of name-value pairs of the attributes to set.
+ * @returns A pointer to a newly allocated object.
  *
  * The args sequence can be made of any number of pairs, each consisting of a
  * name (of std::string type) followed by a value (of const AttributeValue & type).
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/object.h ns-3.44/src/core/model/object.h
--- ns-3.43/src/core/model/object.h	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/object.h	2025-03-09 16:55:49.359371000 -0700
@@ -20,8 +20,8 @@
 #include <vector>
 
 /**
- * \file
- * \ingroup object
+ * @file
+ * @ingroup object
  * ns3::Object class declaration, which is the root of the Object hierarchy
  * and Aggregation.
  */
@@ -35,14 +35,14 @@
 class TraceSourceAccessor;
 
 /**
- * \ingroup core
- * \defgroup object Object
- * \brief Base classes which provide memory management and object aggregation.
+ * @ingroup core
+ * @defgroup object Object
+ * @brief Base classes which provide memory management and object aggregation.
  */
 
 /**
- * \ingroup object
- * \ingroup ptr
+ * @ingroup object
+ * @ingroup ptr
  * Standard Object deleter, used by SimpleRefCount
  * to delete an Object when the reference count drops to zero.
  */
@@ -54,14 +54,14 @@
      * Delete implementation, forwards to the Object::DoDelete()
      * method.
      *
-     * \param [in] object The Object to delete.
+     * @param [in] object The Object to delete.
      */
     inline static void Delete(Object* object);
 };
 
 /**
- * \ingroup object
- * \brief A base class which provides memory management and object aggregation
+ * @ingroup object
+ * @brief A base class which provides memory management and object aggregation
  *
  * The memory management scheme is based on reference-counting with
  * dispose-like functionality to break the reference cycles.
@@ -78,18 +78,18 @@
 {
   public:
     /**
-     * \brief Register this type.
-     * \return The Object TypeId.
+     * @brief Register this type.
+     * @return The Object TypeId.
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Iterate over the Objects aggregated to an ns3::Object.
+     * @brief Iterate over the Objects aggregated to an ns3::Object.
      *
      * This iterator does not allow you to iterate over the parent
      * Object used to call Object::GetAggregateIterator.
      *
-     * \note This is a java-style iterator.
+     * @note This is a java-style iterator.
      */
     class AggregateIterator
     {
@@ -100,7 +100,7 @@
         /**
          * Check if there are more Aggregates to iterate over.
          *
-         * \returns \c true if Next() can be called and return a non-null
+         * @returns \c true if Next() can be called and return a non-null
          *          pointer, \c false otherwise.
          */
         bool HasNext() const;
@@ -108,7 +108,7 @@
         /**
          * Get the next Aggregated Object.
          *
-         * \returns The next aggregated Object.
+         * @returns The next aggregated Object.
          */
         Ptr<const Object> Next();
 
@@ -121,7 +121,7 @@
          * This is private, with Object as friend, so only Objects can create
          * useful AggregateIterators.
          *
-         * \param [in] object The Object whose Aggregates should be iterated over.
+         * @param [in] object The Object whose Aggregates should be iterated over.
          */
         AggregateIterator(Ptr<const Object> object);
         Ptr<const Object> m_object; //!< Parent Object.
@@ -141,8 +141,8 @@
      * Get a pointer to the requested aggregated Object.  If the type of object
      * requested is ns3::Object, a Ptr to the calling object is returned.
      *
-     * \tparam T \explicit The type of the aggregated Object to retrieve.
-     * \returns A pointer to the requested Object, or zero
+     * @tparam T \explicit The type of the aggregated Object to retrieve.
+     * @returns A pointer to the requested Object, or zero
      *          if it could not be found.
      */
     template <typename T>
@@ -151,9 +151,9 @@
      * Get a pointer to the requested aggregated Object by TypeId.  If the
      * TypeId argument is ns3::Object, a Ptr to the calling object is returned.
      *
-     * \tparam T \explicit The type of the aggregated Object to retrieve.
-     * \param [in] tid The TypeId of the requested Object.
-     * \returns A pointer to the requested Object with the specified TypeId,
+     * @tparam T \explicit The type of the aggregated Object to retrieve.
+     * @param [in] tid The TypeId of the requested Object.
+     * @returns A pointer to the requested Object with the specified TypeId,
      *          or zero if it could not be found.
      */
     template <typename T>
@@ -166,7 +166,7 @@
      * After calling this method, this Object is expected to be
      * totally unusable except for the Ref() and Unref() methods.
      *
-     * \note You can call Dispose() many times on the same Object or
+     * @note You can call Dispose() many times on the same Object or
      * different Objects aggregated together, and DoDispose() will be
      * called only once for each aggregated Object.
      *
@@ -176,7 +176,7 @@
     /**
      * Aggregate two Objects together.
      *
-     * \param [in] other The other Object pointer
+     * @param [in] other The other Object pointer
      *
      * This method aggregates the two Objects together: after this
      * method returns, it becomes possible to call GetObject()
@@ -193,7 +193,7 @@
     /**
      * Aggregate an Object to another Object.
      *
-     * \param [in] other The other Object pointer
+     * @param [in] other The other Object pointer
      *
      * This method aggregates the an object to another Object:
      * after this method returns, it becomes possible to call GetObject()
@@ -231,7 +231,7 @@
     /**
      * Get an iterator to the Objects aggregated to this one.
      *
-     * \returns An iterator to the first Object aggregated to this
+     * @returns An iterator to the first Object aggregated to this
      *          Object.
      *
      * If no Objects are aggregated to this Object, then, the returned
@@ -255,8 +255,8 @@
     /**
      * Check if the object has been initialized.
      *
-     * \brief Check if the object has been initialized.
-     * \returns \c true if the object has been initialized.
+     * @brief Check if the object has been initialized.
+     * @returns \c true if the object has been initialized.
      */
     bool IsInitialized() const;
 
@@ -306,7 +306,7 @@
     /**
      * Copy an Object.
      *
-     * \param [in] o the Object to copy.
+     * @param [in] o the Object to copy.
      *
      * Allow subclasses to implement a copy constructor.
      *
@@ -329,9 +329,9 @@
     /**
      * Copy an Object.
      *
-     * \tparam T \deduced The type of the Object being copied.
-     * \param [in] object A pointer to the object to copy.
-     * \returns A copy of the input object.
+     * @tparam T \deduced The type of the Object being copied.
+     * @param [in] object A pointer to the object to copy.
+     * @returns A copy of the input object.
      *
      * This method invoke the copy constructor of the input object
      * and returns the new instance.
@@ -346,9 +346,9 @@
     /**
      * Set the TypeId and construct all Attributes of an Object.
      *
-     * \tparam T \deduced The type of the Object to complete.
-     * \param [in] object The uninitialized object pointer.
-     * \return The derived object.
+     * @tparam T \deduced The type of the Object to complete.
+     * @param [in] object The uninitialized object pointer.
+     * @return The derived object.
      */
     template <typename T>
     friend Ptr<T> CompleteConstruct(T* object);
@@ -383,19 +383,19 @@
     /**
      * Find an Object of TypeId tid in the aggregates of this Object.
      *
-     * \param [in] tid The TypeId we're looking for
-     * \return The matching Object, if it is found
+     * @param [in] tid The TypeId we're looking for
+     * @return The matching Object, if it is found
      */
     Ptr<Object> DoGetObject(TypeId tid) const;
     /**
      * Verify that this Object is still live, by checking it's reference count.
-     * \return \c true if the reference count is non zero.
+     * @return \c true if the reference count is non zero.
      */
     bool Check() const;
     /**
      * Check if any aggregated Objects have non-zero reference counts.
      *
-     * \return \c true if any of our aggregates have non zero reference count.
+     * @return \c true if any of our aggregates have non zero reference count.
      *
      * In some cases, when an event is scheduled against a subclass of
      * Object, and if no one owns a reference directly to this Object, the
@@ -408,7 +408,7 @@
     /**
      * Set the TypeId of this Object.
 
-     * \param [in] tid The TypeId value to set.
+     * @param [in] tid The TypeId value to set.
      *
      * Invoked from ns3::CreateObject only.
      * Initialize the \c m_tid member variable to
@@ -418,7 +418,7 @@
     /**
      * Initialize all member variables registered as Attributes of this TypeId.
      *
-     * \param [in] attributes The attribute values used to initialize
+     * @param [in] attributes The attribute values used to initialize
      *        the member variables of this Object's instance.
      *
      * Invoked from ns3::ObjectFactory::Create and ns3::CreateObject only.
@@ -430,8 +430,8 @@
     /**
      * Keep the list of aggregates in most-recently-used order
      *
-     * \param [in,out] aggregates The list of aggregated Objects.
-     * \param [in] i The most recently used entry in the list.
+     * @param [in,out] aggregates The list of aggregated Objects.
+     * @param [in] i The most recently used entry in the list.
      */
     void UpdateSortedArray(Aggregates* aggregates, uint32_t i) const;
     /**
@@ -530,7 +530,7 @@
  * Specialization of \link Object::GetObject () \endlink for
  * objects of type ns3::Object.
  *
- * \returns A Ptr to the calling object.
+ * @returns A Ptr to the calling object.
  */
 template <>
 inline Ptr<Object>
@@ -555,8 +555,8 @@
  * Specialization of \link Object::GetObject (TypeId tid) \endlink for
  * objects of type ns3::Object.
  *
- * \param [in] tid The TypeId of the requested Object.
- * \returns A Ptr to the calling object.
+ * @param [in] tid The TypeId of the requested Object.
+ * @returns A Ptr to the calling object.
  */
 template <>
 inline Ptr<Object>
@@ -604,15 +604,15 @@
 }
 
 /**
- * \ingroup object
+ * @ingroup object
  * @{
  */
 /**
  * Create an object by type, with varying number of constructor parameters.
  *
- * \tparam T \explicit The type of the derived object to construct.
- * \param [in] args Arguments to pass to the constructor.
- * \return The derived object.
+ * @tparam T \explicit The type of the derived object to construct.
+ * @param [in] args Arguments to pass to the constructor.
+ * @return The derived object.
  */
 template <typename T, typename... Args>
 Ptr<T>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/object-map.h ns-3.44/src/core/model/object-map.h
--- ns-3.43/src/core/model/object-map.h	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/object-map.h	2025-03-09 16:55:49.359371000 -0700
@@ -14,8 +14,8 @@
 #include "ptr.h"
 
 /**
- * \file
- * \ingroup attribute_ObjectMap
+ * @file
+ * @ingroup attribute_ObjectMap
  * ns3::ObjectMap attribute value declarations and template implementations.
  */
 
@@ -23,15 +23,15 @@
 {
 
 /**
- * \ingroup attribute_ObjectMap
+ * @ingroup attribute_ObjectMap
  * ObjectMapValue is an alias for ObjectPtrContainerValue
  */
 typedef ObjectPtrContainerValue ObjectMapValue;
 
 /**
- * \ingroup attribute_ObjectMap
+ * @ingroup attribute_ObjectMap
  * MakeAccessorHelper implementation for ObjectVector.
- * \copydetails ns3::DoMakeAccessorHelperOne(U T::*)
+ * @copydetails ns3::DoMakeAccessorHelperOne(U T::*)
  */
 template <typename T, typename U>
 Ptr<const AttributeAccessor> MakeObjectMapAccessor(U T::*memberVariable);
@@ -41,16 +41,16 @@
 Ptr<const AttributeChecker> MakeObjectMapChecker();
 
 /**
- * \ingroup attribute_ObjectMap
- * \copydoc ns3::MakeObjectPtrContainerAccessor()
+ * @ingroup attribute_ObjectMap
+ * @copydoc ns3::MakeObjectPtrContainerAccessor()
  */
 template <typename T, typename U, typename INDEX>
 Ptr<const AttributeAccessor> MakeObjectMapAccessor(Ptr<U> (T::*get)(INDEX) const,
                                                    INDEX (T::*getN)() const);
 
 /**
- * \ingroup attribute_ObjectMap
- * \copydoc ns3::MakeObjectPtrContainerAccessor()
+ * @ingroup attribute_ObjectMap
+ * @copydoc ns3::MakeObjectPtrContainerAccessor()
  */
 template <typename T, typename U, typename INDEX>
 Ptr<const AttributeAccessor> MakeObjectMapAccessor(INDEX (T::*getN)() const,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/object-ptr-container.cc ns-3.44/src/core/model/object-ptr-container.cc
--- ns-3.43/src/core/model/object-ptr-container.cc	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/object-ptr-container.cc	2025-03-09 16:55:49.359371000 -0700
@@ -10,8 +10,8 @@
 #include "log.h"
 
 /**
- * \file
- * \ingroup attribute_ObjectPtrContainer
+ * @file
+ * @ingroup attribute_ObjectPtrContainer
  * ns3::ObjectPtrContainerValue attribute value implementations.
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/object-ptr-container.h ns-3.44/src/core/model/object-ptr-container.h
--- ns-3.43/src/core/model/object-ptr-container.h	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/object-ptr-container.h	2025-03-09 16:55:49.359371000 -0700
@@ -15,32 +15,32 @@
 #include <map>
 
 /**
- * \file
- * \ingroup attribute_ObjectPtrContainer
+ * @file
+ * @ingroup attribute_ObjectPtrContainer
  * ns3::ObjectPtrContainerValue attribute value declarations and template implementations.
  */
 
 /**
- * \ingroup attributes
- * \defgroup attribute_ObjectPtrContainer ObjectPtrContainer Attribute
+ * @ingroup attributes
+ * @defgroup attribute_ObjectPtrContainer ObjectPtrContainer Attribute
  * AttributeValue implementation for ObjectPtrContainer
  */
 namespace ns3
 {
 
 /**
- * \ingroup attribute_ObjectPtrContainer
+ * @ingroup attribute_ObjectPtrContainer
  *
- * \brief Container for a set of ns3::Object pointers.
+ * @brief Container for a set of ns3::Object pointers.
  *
  * This class it used to get attribute access to an array of
  * ns3::Object pointers.
  *
- * \see AttributeValue
+ * @see AttributeValue
  *
  * Call graph was not generated because of its size.
- * \hidecallergraph
- * \hidecallgraph
+ * @hidecallergraph
+ * @hidecallgraph
  */
 class ObjectPtrContainerValue : public AttributeValue
 {
@@ -54,33 +54,33 @@
     /**
      * Get an iterator to the first Object.
      *
-     * \returns An iterator to the first Object.
+     * @returns An iterator to the first Object.
      */
     Iterator Begin() const;
     /**
      * Get an iterator to the _past-the-end_ Object.
      *
-     * \returns An iterator to the _past-the-end_ Object.
+     * @returns An iterator to the _past-the-end_ Object.
      */
     Iterator End() const;
     /**
      * Get the number of Objects.
      *
-     * \returns The number of objects.
+     * @returns The number of objects.
      */
     std::size_t GetN() const;
     /**
      * Get a specific Object.
      *
-     * \param [in] i The index of the requested object.
-     * \returns The requested object
+     * @param [in] i The index of the requested object.
+     * @returns The requested object
      */
     Ptr<Object> Get(std::size_t i) const;
 
     /**
      * Get a copy of this container.
      *
-     * \returns A copy of this container.
+     * @returns A copy of this container.
      */
     Ptr<AttributeValue> Copy() const override;
     /**
@@ -88,16 +88,16 @@
      *
      * Note this serializes the Ptr values, not the Objects themselves.
      *
-     * \param [in] checker The checker to use (currently not used.)
-     * \returns The string form of the Objects.
+     * @param [in] checker The checker to use (currently not used.)
+     * @returns The string form of the Objects.
      */
     std::string SerializeToString(Ptr<const AttributeChecker> checker) const override;
     /**
      * Deserialize from a string. (Not implemented; raises a fatal error.)
      *
-     * \param [in] value The serialized string form.
-     * \param [in] checker The checker to use.
-     * \returns \c true.
+     * @param [in] value The serialized string form.
+     * @param [in] checker The checker to use.
+     * @returns \c true.
      */
     bool DeserializeFromString(std::string value, Ptr<const AttributeChecker> checker) override;
 
@@ -109,63 +109,63 @@
 };
 
 /**
- * \ingroup attribute_ObjectPtrContainer
+ * @ingroup attribute_ObjectPtrContainer
  * Create an AttributeAccessor using a container class indexed get method.
  *
  * The two versions of this function differ only in argument order.
  *
- * \tparam T \deduced The container class type.
- * \tparam U \deduced The type of object the get method returns.
- * \tparam INDEX \deduced The type of the index variable.
- * \param [in] get The class method to get a specific instance
+ * @tparam T \deduced The container class type.
+ * @tparam U \deduced The type of object the get method returns.
+ * @tparam INDEX \deduced The type of the index variable.
+ * @param [in] get The class method to get a specific instance
  *             from the container.
- * \param [in] getN The class method to return the number of objects
+ * @param [in] getN The class method to return the number of objects
  *             in the container.
- * \return The AttributeAccessor.
+ * @return The AttributeAccessor.
  */
 template <typename T, typename U, typename INDEX>
 Ptr<const AttributeAccessor> MakeObjectPtrContainerAccessor(Ptr<U> (T::*get)(INDEX) const,
                                                             INDEX (T::*getN)() const);
 
 /**
- * \ingroup attribute_ObjectPtrContainer
+ * @ingroup attribute_ObjectPtrContainer
  * Create an AttributeAccessor using a container class indexed get method.
  *
  * The two versions of this function differ only in argument order.
  *
- * \tparam T \deduced The container class type.
- * \tparam U \deduced The type of object the get method returns.
- * \tparam INDEX \deduced The type of the index variable.
- * \param [in] get The class method to get a specific instance
+ * @tparam T \deduced The container class type.
+ * @tparam U \deduced The type of object the get method returns.
+ * @tparam INDEX \deduced The type of the index variable.
+ * @param [in] get The class method to get a specific instance
  *             from the container.
- * \param [in] getN The class method to return the number of objects
+ * @param [in] getN The class method to return the number of objects
  *             in the container.
- * \return The AttributeAccessor.
+ * @return The AttributeAccessor.
  */
 template <typename T, typename U, typename INDEX>
 Ptr<const AttributeAccessor> MakeObjectPtrContainerAccessor(INDEX (T::*getN)() const,
                                                             Ptr<U> (T::*get)(INDEX) const);
 
 /**
- * \ingroup attribute_ObjectPtrContainer
+ * @ingroup attribute_ObjectPtrContainer
  *
  * AttributeChecker implementation for ObjectPtrContainerValue.
- * \see AttributeChecker
+ * @see AttributeChecker
  */
 class ObjectPtrContainerChecker : public AttributeChecker
 {
   public:
     /**
      * Get the TypeId of the container class type.
-     * \returns The class TypeId.
+     * @returns The class TypeId.
      */
     virtual TypeId GetItemTypeId() const = 0;
 };
 
 /**
- * \ingroup attribute_ObjectPtrContainer
- * \returns The AttributeChecker.
- * \see AttributeChecker
+ * @ingroup attribute_ObjectPtrContainer
+ * @returns The AttributeChecker.
+ * @see AttributeChecker
  */
 template <typename T>
 Ptr<const AttributeChecker> MakeObjectPtrContainerChecker();
@@ -234,7 +234,7 @@
 } // namespace internal
 
 /**
- * \ingroup attribute_ObjectPtrContainer
+ * @ingroup attribute_ObjectPtrContainer
  * AttributeAccessor implementation for ObjectPtrContainerValue.
  */
 class ObjectPtrContainerAccessor : public AttributeAccessor
@@ -249,18 +249,18 @@
     /**
      * Get the number of instances in the container.
      *
-     * \param [in] object The container object.
-     * \param [out] n The number of instances in the container.
-     * \returns true if the value could be obtained successfully.
+     * @param [in] object The container object.
+     * @param [out] n The number of instances in the container.
+     * @returns true if the value could be obtained successfully.
      */
     virtual bool DoGetN(const ObjectBase* object, std::size_t* n) const = 0;
     /**
      * Get an instance from the container, identified by index.
      *
-     * \param [in] object The container object.
-     * \param [in] i The desired instance index.
-     * \param [out] index The index retrieved.
-     * \returns The index requested.
+     * @param [in] object The container object.
+     * @param [in] i The desired instance index.
+     * @param [out] index The index retrieved.
+     * @returns The index requested.
      */
     virtual Ptr<Object> DoGet(const ObjectBase* object,
                               std::size_t i,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/object-vector.h ns-3.44/src/core/model/object-vector.h
--- ns-3.43/src/core/model/object-vector.h	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/object-vector.h	2025-03-09 16:55:49.359371000 -0700
@@ -14,8 +14,8 @@
 #include "ptr.h"
 
 /**
- * \file
- * \ingroup attribute_ObjectVector
+ * @file
+ * @ingroup attribute_ObjectVector
  * ns3::ObjectVectorValue attribute value declarations and template implementations.
  */
 
@@ -23,15 +23,15 @@
 {
 
 /**
- * \ingroup attribute_ObjectVector
+ * @ingroup attribute_ObjectVector
  * ObjectVectorValue is an alias for ObjectPtrContainerValue
  */
 typedef ObjectPtrContainerValue ObjectVectorValue;
 
 /**
- * \ingroup attribute_ObjectVector
+ * @ingroup attribute_ObjectVector
  * MakeAccessorHelper implementation for ObjectVector.
- * \copydetails ns3::DoMakeAccessorHelperOne(U T::*)
+ * @copydetails ns3::DoMakeAccessorHelperOne(U T::*)
  */
 template <typename T, typename U>
 Ptr<const AttributeAccessor> MakeObjectVectorAccessor(U T::*memberVariable);
@@ -41,16 +41,16 @@
 Ptr<const AttributeChecker> MakeObjectVectorChecker();
 
 /**
- * \ingroup attribute_ObjectVector
- * \copydoc ns3::MakeObjectPtrContainerAccessor()
+ * @ingroup attribute_ObjectVector
+ * @copydoc ns3::MakeObjectPtrContainerAccessor()
  */
 template <typename T, typename U, typename INDEX>
 Ptr<const AttributeAccessor> MakeObjectVectorAccessor(Ptr<U> (T::*get)(INDEX) const,
                                                       INDEX (T::*getN)() const);
 
 /**
- * \ingroup attribute_ObjectVector
- * \copydoc ns3::MakeObjectPtrContainerAccessor()
+ * @ingroup attribute_ObjectVector
+ * @copydoc ns3::MakeObjectPtrContainerAccessor()
  */
 template <typename T, typename U, typename INDEX>
 Ptr<const AttributeAccessor> MakeObjectVectorAccessor(INDEX (T::*getN)() const,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/pair.h ns-3.44/src/core/model/pair.h
--- ns-3.43/src/core/model/pair.h	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/pair.h	2025-03-09 16:55:49.359371000 -0700
@@ -22,11 +22,11 @@
 
 /**
  * Output streamer for a std::pair.
- * \tparam A \deduced Type of the `pair.first`.
- * \tparam B \deduced Type of the `pair.second`.
- * \param [in,out] os The output stream.
- * \param [in] p The pair.
- * \returns The output stream.
+ * @tparam A \deduced Type of the `pair.first`.
+ * @tparam B \deduced Type of the `pair.second`.
+ * @param [in,out] os The output stream.
+ * @param [in] p The pair.
+ * @returns The output stream.
  */
 template <class A, class B>
 std::ostream&
@@ -37,17 +37,17 @@
 }
 
 /**
- * \ingroup attributes
- * \defgroup attribute_Pair Pair Attribute
+ * @ingroup attributes
+ * @defgroup attribute_Pair Pair Attribute
  * AttributeValue implementation for Pair
  */
 
 /**
- * \ingroup attribute_Pair
+ * @ingroup attribute_Pair
  * AttributeValue implementation for Pair.
  * Hold objects of type std::pair<A, B>.
  *
- * \see AttributeValue
+ * @see AttributeValue
  */
 template <class A, class B>
 class PairValue : public AttributeValue
@@ -63,17 +63,19 @@
     typedef typename std::pair<first_type, second_type> result_type;
 
     PairValue()
-        : m_value(std::make_pair(Create<A>(), Create<B>())){};
+        : m_value(std::make_pair(Create<A>(), Create<B>()))
+    {
+    }
 
     /**
      * Construct this PairValue from a std::pair
      *
-     * \param [in] value Value with which to construct.
+     * @param [in] value Value with which to construct.
      */
     PairValue(const result_type& value)
     {
         Set(value);
-    }; // "import" constructor
+    } // "import" constructor
 
     // Inherited
     Ptr<AttributeValue> Copy() const override;
@@ -85,20 +87,20 @@
      *
      * This differs from the actual value stored in the object which is
      * a pair of Ptr<AV> where AV is a class derived from AttributeValue.
-     * \return stored value as std::pair<A, B>.
+     * @return stored value as std::pair<A, B>.
      */
     result_type Get() const;
     /**
      * Set the value.
-     * \param [in] value The value to adopt.
+     * @param [in] value The value to adopt.
      */
     void Set(const result_type& value);
 
     /**
      * Access the Pair value as type \p T.
-     * \tparam T \explicit The type to cast to.
-     * \param [out] value The Pair value, as type \p T.
-     * \returns true.
+     * @tparam T \explicit The type to cast to.
+     * @param [out] value The Pair value, as type \p T.
+     * @returns true.
      */
     template <typename T>
     bool GetAccessor(T& value) const;
@@ -108,9 +110,9 @@
 };
 
 /**
- * \ingroup attribute_Pair
+ * @ingroup attribute_Pair
  * AttributeChecker implementation for PairValue.
- * \see AttributeChecker
+ * @see AttributeChecker
  */
 class PairChecker : public AttributeChecker
 {
@@ -130,26 +132,26 @@
     /**
      * Get the pair of checkers for each pair entry.
      *
-     * \return std::pair with AttributeChecker for each of abscissa and ordinate.
+     * @return std::pair with AttributeChecker for each of abscissa and ordinate.
      */
     virtual checker_pair_type GetCheckers() const = 0;
 };
 
 /**
- * \ingroup attribute_Pair
+ * @ingroup attribute_Pair
  *
  * Make a PairChecker from a PairValue.
  *
  * This function returns a Pointer to a non-const instance to
  * allow subsequent setting of the underlying AttributeCheckers.
  * \param[in] value PairValue from which to derive abscissa and ordinate types.
- * \return Pointer to PairChecker instance.
+ * @return Pointer to PairChecker instance.
  */
 template <class A, class B>
 Ptr<AttributeChecker> MakePairChecker(const PairValue<A, B>& value);
 
 /**
- * \ingroup attribute_Pair
+ * @ingroup attribute_Pair
  *
  * Make a PairChecker from abscissa and ordinate AttributeCheckers.
  *
@@ -158,31 +160,31 @@
  *
  * \param[in] firstchecker AttributeChecker for abscissa.
  * \param[in] secondchecker AttributeChecker for ordinate.
- * \return Pointer to PairChecker instance.
+ * @return Pointer to PairChecker instance.
  */
 template <class A, class B>
 Ptr<const AttributeChecker> MakePairChecker(Ptr<const AttributeChecker> firstchecker,
                                             Ptr<const AttributeChecker> secondchecker);
 
 /**
- * \ingroup attribute_Pair
+ * @ingroup attribute_Pair
  *
  * Make a PairChecker without abscissa and ordinate AttributeCheckers.
  *
- * \return Pointer to PairChecker instance.
+ * @return Pointer to PairChecker instance.
  */
 template <class A, class B>
 Ptr<AttributeChecker> MakePairChecker();
 
 /**
- * \ingroup attribute_Pair
+ * @ingroup attribute_Pair
  *
  * Create an AttributeAccessor for std::pair<>.
- * \tparam A \explicit The type of pair.first.
- * \tparam B \explicit The type of pair.second.
- * \tparam T1 \deduced The argument pair type.
- * \param [in] a1 The std::pair to be accessed.
- * \returns The AttributeAccessor.
+ * @tparam A \explicit The type of pair.first.
+ * @tparam B \explicit The type of pair.second.
+ * @tparam T1 \deduced The argument pair type.
+ * @param [in] a1 The std::pair to be accessed.
+ * @returns The AttributeAccessor.
  */
 template <typename A, typename B, typename T1>
 Ptr<const AttributeAccessor> MakePairAccessor(T1 a1);
@@ -203,7 +205,7 @@
 {
 
 /**
- * \ingroup attribute_Pair
+ * @ingroup attribute_Pair
  *
  * Internal checker class templated to each AttributeChecker
  * for each entry in the pair.
@@ -216,8 +218,8 @@
     PairChecker();
     /**
      * Construct from a pair of AttributeChecker's.
-     * \param firstchecker The AttributeChecker for first.
-     * \param secondchecker The AttributeChecker for second.
+     * @param firstchecker The AttributeChecker for first.
+     * @param secondchecker The AttributeChecker for second.
      */
     PairChecker(Ptr<const AttributeChecker> firstchecker,
                 Ptr<const AttributeChecker> secondchecker);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/pointer.cc ns-3.44/src/core/model/pointer.cc
--- ns-3.43/src/core/model/pointer.cc	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/pointer.cc	2025-03-09 16:55:49.359371000 -0700
@@ -13,8 +13,8 @@
 #include <sstream>
 
 /**
- * \file
- * \ingroup attribute_Pointer
+ * @file
+ * @ingroup attribute_Pointer
  * ns3::PointerValue attribute value implementations.
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/pointer.h ns-3.44/src/core/model/pointer.h
--- ns-3.43/src/core/model/pointer.h	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/pointer.h	2025-03-09 16:55:49.359371000 -0700
@@ -12,8 +12,8 @@
 #include "object.h"
 
 /**
- * \file
- * \ingroup attribute_Pointer
+ * @file
+ * @ingroup attribute_Pointer
  * ns3::PointerValue attribute value declarations and template implementations.
  */
 
@@ -21,17 +21,17 @@
 {
 
 /**
- * \ingroup attributes
- * \defgroup attribute_Pointer Pointer Attribute
+ * @ingroup attributes
+ * @defgroup attribute_Pointer Pointer Attribute
  * AttributeValue implementation for Pointer.
  * Hold objects of type Ptr<T>.
  */
 
 /**
- * \ingroup attribute_Pointer
- * \class  ns3::PointerValue "pointer.h"
+ * @ingroup attribute_Pointer
+ * @class  ns3::PointerValue "pointer.h"
  * AttributeValue implementation for Pointer. Hold objects of type Ptr<T>.
- * \see AttributeValue
+ * @see AttributeValue
  */
 class PointerValue : public AttributeValue
 {
@@ -41,58 +41,58 @@
     /**
      * Construct this PointerValue by referencing an explicit Object.
      *
-     * \param [in] object The object to begin with.
+     * @param [in] object The object to begin with.
      */
     PointerValue(const Ptr<Object>& object);
 
     /**
      * Set the value from by reference an Object.
      *
-     * \param [in] object The object to reference.
+     * @param [in] object The object to reference.
      */
     void SetObject(Ptr<Object> object);
 
     /**
      * Get the Object referenced by the PointerValue.
-     * \returns The Object.
+     * @returns The Object.
      */
     Ptr<Object> GetObject() const;
 
     /**
      * Construct this PointerValue by referencing an explicit Object.
      *
-     * \tparam T \deduced The type of the object.
-     * \param [in] object The object to begin with.
+     * @tparam T \deduced The type of the object.
+     * @param [in] object The object to begin with.
      */
     template <typename T>
     PointerValue(const Ptr<T>& object);
 
     /**
      * Cast to an Object of type \c T.
-     * \tparam T \explicit The type to cast to.
+     * @tparam T \explicit The type to cast to.
      */
     template <typename T>
     operator Ptr<T>() const;
 
     /**
      * Set the value.
-     * \param [in] value The value to adopt.
+     * @param [in] value The value to adopt.
      */
     template <typename T>
     void Set(const Ptr<T>& value);
 
     /**
-     * \returns The Pointer value.
-     * \tparam T \explicit The type to cast to.
+     * @returns The Pointer value.
+     * @tparam T \explicit The type to cast to.
      */
     template <typename T>
     Ptr<T> Get() const;
 
     /**
      * Access the Pointer value as type \p T.
-     * \tparam T \explicit The type to cast to.
-     * \param [out] value The Pointer value, as type \p T.
-     * \returns true.
+     * @tparam T \explicit The type to cast to.
+     * @param [out] value The Pointer value, as type \p T.
+     * @returns true.
      */
     template <typename T>
     bool GetAccessor(Ptr<T>& value) const;
@@ -106,25 +106,25 @@
 };
 
 /**
- * \ingroup attribute_Pointer
+ * @ingroup attribute_Pointer
  * AttributeChecker implementation for PointerValue.
- * \see AttributeChecker
+ * @see AttributeChecker
  */
 class PointerChecker : public AttributeChecker
 {
   public:
     /**
      * Get the TypeId of the base type.
-     * \returns The base TypeId.
+     * @returns The base TypeId.
      */
     virtual TypeId GetPointeeTypeId() const = 0;
 };
 
 /**
- * \ingroup attribute_Pointer
+ * @ingroup attribute_Pointer
  * Create a PointerChecker for a type.
- * \tparam T \explicit The underlying type.
- * \returns The PointerChecker.
+ * @tparam T \explicit The underlying type.
+ * @returns The PointerChecker.
  */
 template <typename T>
 Ptr<AttributeChecker> MakePointerChecker();
@@ -142,7 +142,7 @@
 {
 
 /**
- * \ingroup attribute_Pointer
+ * @ingroup attribute_Pointer
  *  PointerChecker implementation.
  */
 template <typename T>
@@ -252,16 +252,16 @@
 // Pointer has custom functions.
 
 /**
- * \ingroup attribute_Pointer
+ * @ingroup attribute_Pointer
  * \fn ns3::Ptr<const ns3::AttributeAccessor> ns3::MakePointerAccessor (T1 a1)
- * \copydoc ns3::MakeAccessorHelper(T1)
- * \see AttributeAccessor
+ * @copydoc ns3::MakeAccessorHelper(T1)
+ * @see AttributeAccessor
  */
 /**
- * \ingroup attribute_Pointer
+ * @ingroup attribute_Pointer
  * \fn ns3::Ptr<const ns3::AttributeAccessor> ns3::MakePointerAccessor (T1 a1, T2 a2)
- * \copydoc ns3::MakeAccessorHelper(T1,T2)
- * \see AttributeAccessor
+ * @copydoc ns3::MakeAccessorHelper(T1,T2)
+ * @see AttributeAccessor
  */
 
 template <typename T>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/priority-queue-scheduler.cc ns-3.44/src/core/model/priority-queue-scheduler.cc
--- ns-3.43/src/core/model/priority-queue-scheduler.cc	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/priority-queue-scheduler.cc	2025-03-09 16:55:49.359371000 -0700
@@ -17,8 +17,8 @@
 #include <string>
 
 /**
- * \file
- * \ingroup scheduler
+ * @file
+ * @ingroup scheduler
  * Implementation of ns3::PriorityQueueScheduler class.
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/priority-queue-scheduler.h ns-3.44/src/core/model/priority-queue-scheduler.h
--- ns-3.43/src/core/model/priority-queue-scheduler.h	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/priority-queue-scheduler.h	2025-03-09 16:55:49.359371000 -0700
@@ -18,8 +18,8 @@
 #include <utility>
 
 /**
- * \file
- * \ingroup scheduler
+ * @file
+ * @ingroup scheduler
  * Declaration of ns3::PriorityQueueScheduler class.
  */
 
@@ -27,13 +27,13 @@
 {
 
 /**
- * \ingroup scheduler
- * \brief a std::priority_queue event scheduler
+ * @ingroup scheduler
+ * @brief a std::priority_queue event scheduler
  *
  * This class implements an event scheduler using
  * `std::priority_queue` on a `std::vector`.
  *
- * \par Time Complexity
+ * @par Time Complexity
  *
  * Operation    | Amortized %Time  | Reason
  * :----------- | :--------------- | :-----
@@ -43,7 +43,7 @@
  * Remove()     | Linear           | `std::find()` and `std::make_heap()`
  * RemoveNext() | Logarithmic      | `std::pop_heap()`
  *
- * \par Memory Complexity
+ * @par Memory Complexity
  *
  * Category  | Memory                           | Reason
  * :-------- | :------------------------------- | :-----
@@ -56,7 +56,7 @@
   public:
     /**
      *  Register this type.
-     *  \return The object TypeId.
+     *  @return The object TypeId.
      */
     static TypeId GetTypeId();
 
@@ -83,8 +83,8 @@
     {
       public:
         /**
-         * \copydoc PriorityQueueScheduler::Remove()
-         * \returns \c true if the event was found, false otherwise.
+         * @copydoc PriorityQueueScheduler::Remove()
+         * @returns \c true if the event was found, false otherwise.
          */
         bool remove(const Scheduler::Event& ev);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/ptr.h ns-3.44/src/core/model/ptr.h
--- ns-3.43/src/core/model/ptr.h	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/ptr.h	2025-03-09 16:55:49.363371100 -0700
@@ -15,8 +15,8 @@
 #include <stdint.h>
 
 /**
- * \file
- * \ingroup ptr
+ * @file
+ * @ingroup ptr
  * ns3::Ptr smart pointer declaration and implementation.
  */
 
@@ -24,18 +24,18 @@
 {
 
 /**
- * \ingroup core
- * \defgroup ptr Smart Pointer
- * \brief Heap memory management.
+ * @ingroup core
+ * @defgroup ptr Smart Pointer
+ * @brief Heap memory management.
  *
  * See \ref ns3::Ptr for implementation details.
  *
  * See \ref main-ptr.cc for example usage.
  */
 /**
- * \ingroup ptr
+ * @ingroup ptr
  *
- * \brief Smart pointer class similar to \c boost::intrusive_ptr.
+ * @brief Smart pointer class similar to \c boost::intrusive_ptr.
  *
  * This smart-pointer class assumes that the underlying
  * type provides a pair of \c Ref() and \c Unref() methods which are
@@ -59,7 +59,7 @@
  * bit of typing.  If the Object does not inherit from Object
  * (or ObjectBase) there is also a convenience wrapper Create<>()
  *
- * \tparam T \explicit The type of the underlying object.
+ * @tparam T \explicit The type of the underlying object.
  */
 template <typename T>
 class Ptr
@@ -78,9 +78,9 @@
      * to returning to the caller so the caller is
      * responsible for calling Unref himself.
      *
-     * \tparam U \deduced The actual type of the argument and return pointer.
-     * \param [in] p Smart pointer
-     * \return The pointer managed by this smart pointer.
+     * @tparam U \deduced The actual type of the argument and return pointer.
+     * @param [in] p Smart pointer
+     * @return The pointer managed by this smart pointer.
      */
     template <typename U>
     friend U* GetPointer(const Ptr<U>& p);
@@ -91,9 +91,9 @@
      * to returning to the caller so the caller is not
      * responsible for calling Unref himself.
      *
-     * \tparam U \deduced The actual type of the argument and return pointer.
-     * \param [in] p Smart pointer
-     * \return The pointer managed by this smart pointer.
+     * @tparam U \deduced The actual type of the argument and return pointer.
+     * @param [in] p Smart pointer
+     * @return The pointer managed by this smart pointer.
      */
     template <typename U>
     friend U* PeekPointer(const Ptr<U>& p);
@@ -112,29 +112,29 @@
      * same, so that object is deleted if no more references to it
      * remain.
      *
-     * \param [in] ptr Raw pointer to manage
+     * @param [in] ptr Raw pointer to manage
      */
     Ptr(T* ptr);
     /**
      * Create a smart pointer which points to the object pointed to by
      * the input raw pointer ptr.
      *
-     * \param [in] ptr Raw pointer to manage
-     * \param [in] ref if set to true, this method calls Ref, otherwise,
+     * @param [in] ptr Raw pointer to manage
+     * @param [in] ref if set to true, this method calls Ref, otherwise,
      *        it does not call Ref.
      */
     Ptr(T* ptr, bool ref);
     /**
      * Copy by referencing the same underlying object.
      *
-     * \param [in] o The other Ptr instance.
+     * @param [in] o The other Ptr instance.
      */
     Ptr(const Ptr& o);
     /**
      * Copy, removing \c const qualifier.
      *
-     * \tparam U \deduced The type underlying the Ptr being copied.
-     * \param [in] o The Ptr to copy.
+     * @tparam U \deduced The type underlying the Ptr being copied.
+     * @param [in] o The Ptr to copy.
      */
     template <typename U>
     Ptr(const Ptr<U>& o);
@@ -143,28 +143,28 @@
     /**
      * Assignment operator by referencing the same underlying object.
      *
-     * \param [in] o The other Ptr instance.
-     * \return A reference to self.
+     * @param [in] o The other Ptr instance.
+     * @return A reference to self.
      */
     Ptr<T>& operator=(const Ptr& o);
     /**
      * An rvalue member access.
-     * \returns A pointer to the underlying object.
+     * @returns A pointer to the underlying object.
      */
     T* operator->() const;
     /**
      * An lvalue member access.
-     * \returns A pointer to the underlying object.
+     * @returns A pointer to the underlying object.
      */
     T* operator->();
     /**
      * A \c const dereference.
-     * \returns A pointer to the underlying object.
+     * @returns A pointer to the underlying object.
      */
     T& operator*() const;
     /**
      * A  dereference.
-     * \returns A pointer to the underlying object.
+     * @returns A pointer to the underlying object.
      */
     T& operator*();
 
@@ -172,17 +172,17 @@
      * Test for non-NULL pointer.
      *
      * This enables simple pointer checks like
-     * \code
+     * @code
      *   Ptr<...> p = ...;
      *   if (p) ...
      *   if (!p) ...
-     * \endcode
+     * @endcode
      *
      * The same construct works in the NS_ASSERT... and NS_ABORT... macros.
      *
-     * \note Explicit tests against `0`, `NULL` or `nullptr` are not supported.
+     * @note Explicit tests against `0`, `NULL` or `nullptr` are not supported.
      * All these cases will fail to compile:
-     * \code
+     * @code
      *   if (p != nullptr {...}    // Should be `if (p)`
      *   if (p != NULL)   {...}
      *   if (p != 0)      {...}
@@ -190,48 +190,48 @@
      *   if (p == nullptr {...}    // Should be `if (!p)`
      *   if (p == NULL)   {...}
      *   if (p == 0)      {...}
-     * \endcode
+     * @endcode
      * Just use `if (p)` or `if (!p)` as indicated.
      *
-     * \note NS_TEST... invocations should be written as follows:
-     * \code
+     * @note NS_TEST... invocations should be written as follows:
+     * @code
      * // p should be non-NULL
      * NS_TEST...NE... (p, nullptr, ...);
      * // p should be NULL
      * NS_TEST...EQ... (p, nullptr, ...);
-     * \endcode
+     * @endcode
      *
-     * \note Unfortunately return values are not
+     * @note Unfortunately return values are not
      * "contextual conversion expression" contexts,
      * so you need to explicitly cast return values to bool:
-     * \code
+     * @code
      * bool f (...)
      * {
      *   Ptr<...> p = ...;
      *   return (bool)(p);
      * }
-     * \endcode
+     * @endcode
      *
-     * \returns \c true if the underlying pointer is non-NULL.
+     * @returns \c true if the underlying pointer is non-NULL.
      */
     explicit operator bool() const;
 };
 
 /**
- * \ingroup ptr
+ * @ingroup ptr
  * Create class instances by constructors with varying numbers
  * of arguments and return them by Ptr.
  *
  * This template work for any class \c T derived from ns3::SimpleRefCount
  *
- * \see CreateObject for methods to create derivatives of ns3::Object
+ * @see CreateObject for methods to create derivatives of ns3::Object
  */
 /** @{ */
 /**
- * \tparam T  \explicit The type of class object to create.
- * \tparam Ts \deduced Types of the constructor arguments.
- * \param  [in] args Constructor arguments.
- * \return A Ptr to the newly created \c T.
+ * @tparam T  \explicit The type of class object to create.
+ * @tparam Ts \deduced Types of the constructor arguments.
+ * @param  [in] args Constructor arguments.
+ * @return A Ptr to the newly created \c T.
  */
 template <typename T, typename... Ts>
 Ptr<T> Create(Ts&&... args);
@@ -239,35 +239,35 @@
 /** @}*/
 
 /**
- * \ingroup ptr
+ * @ingroup ptr
  * Output streamer.
- * \tparam T \deduced The type of the underlying Object.
- * \param [in,out] os The output stream.
- * \param [in] p The Ptr.
- * \returns The stream.
+ * @tparam T \deduced The type of the underlying Object.
+ * @param [in,out] os The output stream.
+ * @param [in] p The Ptr.
+ * @returns The stream.
  */
 template <typename T>
 std::ostream& operator<<(std::ostream& os, const Ptr<T>& p);
 
 /**
- * \ingroup ptr
+ * @ingroup ptr
  * Equality operator.
  *
  * This enables code such as
- * \code
+ * @code
  *   Ptr<...> p = ...;
  *   Ptr<...> q = ...;
  *   if (p == q) ...
- * \endcode
+ * @endcode
  *
  * Note that either \c p or \c q could also be ordinary pointers
  * to the underlying object.
  *
- * \tparam T1 \deduced Type of the object on the lhs.
- * \tparam T2 \deduced Type of the object on the rhs.
- * \param [in] lhs The left operand.
- * \param [in] rhs The right operand.
- * \return \c true if the operands point to the same underlying object.
+ * @tparam T1 \deduced Type of the object on the lhs.
+ * @tparam T2 \deduced Type of the object on the rhs.
+ * @param [in] lhs The left operand.
+ * @param [in] rhs The right operand.
+ * @return \c true if the operands point to the same underlying object.
  */
 /** @{ */
 template <typename T1, typename T2>
@@ -281,32 +281,32 @@
 /**@}*/
 
 /**
- * \ingroup ptr
+ * @ingroup ptr
  *  Specialization for comparison to \c nullptr
- * \copydoc operator==(Ptr<T1>const&,Ptr<T2>const&)
+ * @copydoc operator==(Ptr<T1>const&,Ptr<T2>const&)
  */
 template <typename T1, typename T2>
 std::enable_if_t<std::is_same_v<T2, std::nullptr_t>, bool> operator==(const Ptr<T1>& lhs, T2 rhs);
 
 /**
- * \ingroup ptr
+ * @ingroup ptr
  * Inequality operator.
  *
  * This enables code such as
- * \code
+ * @code
  *   Ptr<...> p = ...;
  *   Ptr<...> q = ...;
  *   if (p != q) ...
- * \endcode
+ * @endcode
  *
  * Note that either \c p or \c q could also be ordinary pointers
  * to the underlying object.
  *
- * \tparam T1 \deduced Type of the object on the lhs.
- * \tparam T2 \deduced Type of the object on the rhs.
- * \param [in] lhs The left operand.
- * \param [in] rhs The right operand.
- * \return \c true if the operands point to the same underlying object.
+ * @tparam T1 \deduced Type of the object on the lhs.
+ * @tparam T2 \deduced Type of the object on the rhs.
+ * @param [in] lhs The left operand.
+ * @param [in] rhs The right operand.
+ * @return \c true if the operands point to the same underlying object.
  */
 /** @{ */
 template <typename T1, typename T2>
@@ -320,21 +320,21 @@
 /**@}*/
 
 /**
- * \ingroup ptr
+ * @ingroup ptr
  * Specialization for comparison to \c nullptr
- * \copydoc operator==(Ptr<T1>const&,Ptr<T2>const&)
+ * @copydoc operator==(Ptr<T1>const&,Ptr<T2>const&)
  */
 template <typename T1, typename T2>
 std::enable_if_t<std::is_same_v<T2, std::nullptr_t>, bool> operator!=(const Ptr<T1>& lhs, T2 rhs);
 
 /**
- * \ingroup ptr
+ * @ingroup ptr
  * Comparison operator applied to the underlying pointers.
  *
- * \tparam T \deduced The type of the operands.
- * \param [in] lhs The left operand.
- * \param [in] rhs The right operand.
- * \return The comparison on the underlying pointers.
+ * @tparam T \deduced The type of the operands.
+ * @param [in] lhs The left operand.
+ * @param [in] rhs The right operand.
+ * @return The comparison on the underlying pointers.
  */
 /** @{ */
 template <typename T>
@@ -355,10 +355,10 @@
  * Return a copy of \c p with its stored pointer const casted from
  * \c T2 to \c T1.
  *
- * \tparam T1 \deduced The type to return in a Ptr.
- * \tparam T2 \deduced The type of the underlying object.
- * \param [in] p The original \c const Ptr.
- * \return A non-const Ptr.
+ * @tparam T1 \deduced The type to return in a Ptr.
+ * @tparam T2 \deduced The type of the underlying object.
+ * @param [in] p The original \c const Ptr.
+ * @return A non-const Ptr.
  */
 template <typename T1, typename T2>
 Ptr<T1> const_pointer_cast(const Ptr<T2>& p);
@@ -368,21 +368,21 @@
 struct CallbackTraits;
 
 /**
- * \ingroup callbackimpl
+ * @ingroup callbackimpl
  *
  * Trait class to convert a pointer into a reference,
  * used by MemPtrCallBackImpl.
  *
  * This is the specialization for Ptr types.
  *
- * \tparam T \deduced The type of the underlying object.
+ * @tparam T \deduced The type of the underlying object.
  */
 template <typename T>
 struct CallbackTraits<Ptr<T>>
 {
     /**
-     * \param [in] p Object pointer
-     * \return A reference to the object pointed to by p
+     * @param [in] p Object pointer
+     * @return A reference to the object pointed to by p
      */
     static T& GetReference(const Ptr<T> p)
     {
@@ -400,19 +400,19 @@
 struct EventMemberImplObjTraits;
 
 /**
- * \ingroup makeeventmemptr
+ * @ingroup makeeventmemptr
  * Helper for the MakeEvent functions which take a class method.
  *
  * This is the specialization for Ptr types.
  *
- * \tparam T \deduced The type of the underlying object.
+ * @tparam T \deduced The type of the underlying object.
  */
 template <typename T>
 struct EventMemberImplObjTraits<Ptr<T>>
 {
     /**
-     * \param [in] p Object pointer
-     * \return A reference to the object pointed to by p
+     * @param [in] p Object pointer
+     * @return A reference to the object pointed to by p
      */
     static T& GetReference(Ptr<T> p)
     {
@@ -562,10 +562,10 @@
 /**
  * Cast a Ptr.
  *
- * \tparam T1 \deduced The desired type to cast to.
- * \tparam T2 \deduced The type of the original Ptr.
- * \param [in] p The original Ptr.
- * \return The result of the cast.
+ * @tparam T1 \deduced The desired type to cast to.
+ * @tparam T2 \deduced The type of the original Ptr.
+ * @param [in] p The original Ptr.
+ * @return The result of the cast.
  */
 /** @{ */
 template <typename T1, typename T2>
@@ -594,9 +594,9 @@
 /**
  * Return a deep copy of a Ptr.
  *
- * \tparam T \deduced The type of the underlying object.
- * \param [in] object The object Ptr to copy.
- * \returns The copy.
+ * @tparam T \deduced The type of the underlying object.
+ * @param [in] object The object Ptr to copy.
+ * @returns The copy.
  */
 /** @{ */
 template <typename T>
@@ -745,25 +745,25 @@
  ***************************************************/
 
 /**
- * \ingroup ptr
+ * @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
+ * @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`
+ * @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
+     * @param p The `Ptr` value to hash.
+     * @return the hash
      */
     std::size_t operator()(ns3::Ptr<T> p) const
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/random-variable-stream.cc ns-3.44/src/core/model/random-variable-stream.cc
--- ns-3.43/src/core/model/random-variable-stream.cc	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/random-variable-stream.cc	2025-03-09 16:55:49.363371100 -0700
@@ -30,8 +30,8 @@
 #include <numbers>
 
 /**
- * \file
- * \ingroup randomvariable
+ * @file
+ * @ingroup randomvariable
  * ns3::RandomVariableStream and related implementations
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/random-variable-stream.h ns-3.44/src/core/model/random-variable-stream.h
--- ns-3.43/src/core/model/random-variable-stream.h	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/random-variable-stream.h	2025-03-09 16:55:49.363371100 -0700
@@ -23,8 +23,8 @@
 #include <stdint.h>
 
 /**
- * \file
- * \ingroup randomvariable
+ * @file
+ * @ingroup randomvariable
  * ns3::RandomVariableStream declaration, and related classes.
  */
 
@@ -32,10 +32,10 @@
 {
 
 /**
- * \ingroup core
- * \defgroup randomvariable Random Variables
+ * @ingroup core
+ * @defgroup randomvariable Random Variables
  *
- * \brief ns-3 random numbers are provided via instances of
+ * @brief ns-3 random numbers are provided via instances of
  * ns3::RandomVariableStream.
  *
  * - By default, ns-3 simulations use a fixed seed; if there is any
@@ -64,10 +64,10 @@
 class RngStream;
 
 /**
- * \ingroup randomvariable
- * \brief The basic uniform Random Number Generator (RNG).
+ * @ingroup randomvariable
+ * @brief The basic uniform Random Number Generator (RNG).
  *
- * \note The underlying random number generation method used
+ * @note The underlying random number generation method used
  * by ns-3 is the RngStream code by Pierre L'Ecuyer at
  * the University of Montreal.
  *
@@ -78,7 +78,7 @@
  *
  * By default, the underlying generator is seeded all the time with
  * the same seed value and run number coming from the ns3::GlobalValue
- * \ref GlobalValueRngSeed "RngSeed" and \ref GlobalValueRngRun
+ * @ref GlobalValueRngSeed "RngSeed" and @ref GlobalValueRngRun
  * "RngRun".  Also by default, the stream number value for the
  * underlying RngStream is automatically allocated.
  *
@@ -90,16 +90,16 @@
 {
   public:
     /**
-     * \brief Register this type.
-     * \return The object TypeId.
+     * @brief Register this type.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
     /**
-     * \brief Default constructor.
+     * @brief Default constructor.
      */
     RandomVariableStream();
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~RandomVariableStream() override;
 
@@ -108,45 +108,45 @@
     RandomVariableStream& operator=(const RandomVariableStream&) = delete;
 
     /**
-     * \brief Specifies the stream number for the RngStream.
-     * \param [in] stream The stream number for the RngStream.
+     * @brief Specifies the stream number for the RngStream.
+     * @param [in] stream The stream number for the RngStream.
      * -1 means "allocate a stream number automatically".
      */
     void SetStream(int64_t stream);
 
     /**
-     * \brief Returns the stream number for the RngStream.
-     * \return The stream number for the RngStream.
+     * @brief Returns the stream number for the RngStream.
+     * @return The stream number for the RngStream.
      * -1 means this stream was allocated automatically.
      */
     int64_t GetStream() const;
 
     /**
-     * \brief Specify whether antithetic values should be generated.
-     * \param [in] isAntithetic If \c true antithetic value will be generated.
+     * @brief Specify whether antithetic values should be generated.
+     * @param [in] isAntithetic If \c true antithetic value will be generated.
      */
     void SetAntithetic(bool isAntithetic);
 
     /**
-     * \brief Check if antithetic values will be generated.
-     * \return \c true if antithetic values will be generated.
+     * @brief Check if antithetic values will be generated.
+     * @return \c true if antithetic values will be generated.
      */
     bool IsAntithetic() const;
 
     /**
-     * \brief Get the next random value drawn from the distribution.
-     * \return A random value.
+     * @brief Get the next random value drawn from the distribution.
+     * @return A random value.
      */
     virtual double GetValue() = 0;
 
-    /** \copydoc GetValue() */
+    /** @copydoc GetValue() */
     // The base implementation returns `(uint32_t)GetValue()`
     virtual uint32_t GetInteger();
 
   protected:
     /**
-     * \brief Get the pointer to the underlying RngStream.
-     * \return The underlying RngStream
+     * @brief Get the pointer to the underlying RngStream.
+     * @return The underlying RngStream
      */
     RngStream* Peek() const;
 
@@ -163,8 +163,8 @@
 }; // class RandomVariableStream
 
 /**
- * \ingroup randomvariable
- * \brief The uniform distribution Random Number Generator (RNG).
+ * @ingroup randomvariable
+ * @brief The uniform distribution Random Number Generator (RNG).
  *
  * This class supports the creation of objects that return random numbers
  * from a fixed uniform distribution.  It also supports the generation of
@@ -194,7 +194,7 @@
  *
  * where \f$u\f$ is a uniform random variable on [0,1).
  *
- * \par Example
+ * @par Example
  *
  * Here is an example of how to use this class:
  * \code{.cc}
@@ -206,9 +206,9 @@
  *   x->SetAttribute ("Max", DoubleValue (max));
  *
  *   double value = x->GetValue ();
- * \endcode
+ * @endcode
  *
- * \par Antithetic Values.
+ * @par Antithetic Values.
  *
  * Normally this RNG returns values \f$x\f$ for floating point values
  * (or \f$k\f$ for integer values) uniformly in the interval [\c Min, \c Max)
@@ -224,52 +224,52 @@
 {
   public:
     /**
-     * \brief Register this type.
-     * \return The object TypeId.
+     * @brief Register this type.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Creates a uniform distribution RNG with the default range.
+     * @brief Creates a uniform distribution RNG with the default range.
      */
     UniformRandomVariable();
 
     /**
-     * \brief Get the lower bound on randoms returned by GetValue().
-     * \return The lower bound on values from GetValue().
+     * @brief Get the lower bound on randoms returned by GetValue().
+     * @return The lower bound on values from GetValue().
      */
     double GetMin() const;
 
     /**
-     * \brief Get the upper bound on values returned by GetValue().
-     * \return The upper bound on values from GetValue().
+     * @brief Get the upper bound on values returned by GetValue().
+     * @return The upper bound on values from GetValue().
      */
     double GetMax() const;
 
     /**
-     * \copydoc GetValue()
+     * @copydoc GetValue()
      *
-     * \param [in] min Low end of the range (included).
-     * \param [in] max High end of the range (excluded).
+     * @param [in] min Low end of the range (included).
+     * @param [in] max High end of the range (excluded).
      */
     double GetValue(double min, double max);
 
     /**
-     * \copydoc GetValue(double,double)
-     * \note The upper limit is included in the output range, unlike GetValue(double,double).
+     * @copydoc GetValue(double,double)
+     * @note The upper limit is included in the output range, unlike GetValue(double,double).
      */
     uint32_t GetInteger(uint32_t min, uint32_t max);
 
     // Inherited
     /**
-     * \copydoc RandomVariableStream::GetValue()
-     * \note The upper limit is excluded from the output range, unlike GetInteger().
+     * @copydoc RandomVariableStream::GetValue()
+     * @note The upper limit is excluded from the output range, unlike GetInteger().
      */
     double GetValue() override;
 
     /**
-     * \copydoc RandomVariableStream::GetInteger()
-     * \note The upper limit is included in the output range, unlike GetValue().
+     * @copydoc RandomVariableStream::GetInteger()
+     * @note The upper limit is included in the output range, unlike GetValue().
      */
     uint32_t GetInteger() override;
 
@@ -283,14 +283,14 @@
 }; // class UniformRandomVariable
 
 /**
- * \ingroup randomvariable
- * \brief The Random Number Generator (RNG) that returns a constant.
+ * @ingroup randomvariable
+ * @brief The Random Number Generator (RNG) that returns a constant.
  *
  * This RNG returns the same \c Constant value for every sample.
  *
  * This distribution has mean equal to the \c Constant and zero variance.
  *
- * \par Antithetic Values.
+ * @par Antithetic Values.
  *
  * This RNG ignores the antithetic setting.
  */
@@ -298,34 +298,34 @@
 {
   public:
     /**
-     * \brief Register this type.
-     * \return The object TypeId.
+     * @brief Register this type.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Creates a constant RNG with the default constant value.
+     * @brief Creates a constant RNG with the default constant value.
      */
     ConstantRandomVariable();
 
     /**
-     * \brief Get the constant value returned by this RNG stream.
-     * \return The constant value.
+     * @brief Get the constant value returned by this RNG stream.
+     * @return The constant value.
      */
     double GetConstant() const;
 
     /**
-     * \copydoc GetValue()
-     * \param [in] constant The value to return.
+     * @copydoc GetValue()
+     * @param [in] constant The value to return.
      */
     double GetValue(double constant);
-    /** \copydoc GetValue(double) */
+    /** @copydoc GetValue(double) */
     uint32_t GetInteger(uint32_t constant);
 
     // Inherited
     /*
-     * \copydoc RandomVariableStream::GetValue()
-     * \note This RNG always returns the same value.
+     * @copydoc RandomVariableStream::GetValue()
+     * @note This RNG always returns the same value.
      */
     double GetValue() override;
     /* \note This RNG always returns the same value. */
@@ -338,8 +338,8 @@
 }; // class ConstantRandomVariable
 
 /**
- * \ingroup randomvariable
- * \brief The Random Number Generator (RNG) that returns a pattern of
+ * @ingroup randomvariable
+ * @brief The Random Number Generator (RNG) that returns a pattern of
  * sequential values.
  *
  * This RNG has four configuration attributes:
@@ -361,7 +361,7 @@
  *     {
  *         m_current = m_min + (m_current - m_max);
  *     }
- * \endcode
+ * @endcode
  *
  * This RNG returns values in the range \f$ x \in [\text{Min}, \text{Max}) \f$.
  * See the Example, below, for how this executes in practice.
@@ -369,7 +369,7 @@
  * Note the \c Increment attribute is itself a RandomVariableStream,
  * which enables more varied patterns than in the example given here.
  *
- * \par Example
+ * @par Example
  *
  * For example, if an instance is configured with:
  *
@@ -394,7 +394,7 @@
  * The last value (3) is the result of the update rule in the code snippet
  * above, `2 + (14 - 13)`.
  *
- * \par Antithetic Values.
+ * @par Antithetic Values.
  *
  * This RNG ignores the antithetic setting.
  */
@@ -402,40 +402,40 @@
 {
   public:
     /**
-     * \brief Register this type.
-     * \return The object TypeId.
+     * @brief Register this type.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Creates a sequential RNG with the default values
+     * @brief Creates a sequential RNG with the default values
      * for the sequence parameters.
      */
     SequentialRandomVariable();
 
     /**
-     * \brief Get the first value of the sequence.
-     * \return The first value of the sequence.
+     * @brief Get the first value of the sequence.
+     * @return The first value of the sequence.
      */
     double GetMin() const;
 
     /**
-     * \brief Get the limit of the sequence, which is (at least)
+     * @brief Get the limit of the sequence, which is (at least)
      * one more than the last value of the sequence.
-     * \return The limit of the sequence.
+     * @return The limit of the sequence.
      */
     double GetMax() const;
 
     /**
-     * \brief Get the increment for the sequence.
-     * \return The increment between distinct values for the sequence.
+     * @brief Get the increment for the sequence.
+     * @return The increment between distinct values for the sequence.
      */
     Ptr<RandomVariableStream> GetIncrement() const;
 
     /**
-     * \brief Get the number of times each distinct value of the sequence
+     * @brief Get the number of times each distinct value of the sequence
      * is repeated before incrementing to the next value.
-     * \return The number of times each value is repeated.
+     * @return The number of times each value is repeated.
      */
     uint32_t GetConsecutive() const;
 
@@ -468,8 +468,8 @@
 }; // class SequentialRandomVariable
 
 /**
- * \ingroup randomvariable
- * \brief The exponential distribution Random Number Generator (RNG).
+ * @ingroup randomvariable
+ * @brief The exponential distribution Random Number Generator (RNG).
  *
  * This class supports the creation of objects that return random numbers
  * from a fixed exponential distribution.  It also supports the generation of
@@ -495,7 +495,7 @@
  *
  * where \f$u\f$ is a uniform random variable on [0,1).
  *
- * \par Bounded Distribution
+ * @par Bounded Distribution
  *
  * Since the exponential distributions can theoretically return unbounded
  * values, it is sometimes useful to specify a fixed upper \c Bound.  The
@@ -514,7 +514,7 @@
  *          \left(\frac{1}{\alpha} + b\right)\exp^{-\alpha b}
  *   \f]
  *
- * \par Example
+ * @par Example
  *
  * Here is an example of how to use this class:
  * \code{.cc}
@@ -526,9 +526,9 @@
  *   x->SetAttribute ("Bound", DoubleValue (bound));
  *
  *   double value = x->GetValue ();
- * \endcode
+ * @endcode
  *
- * \par Antithetic Values.
+ * @par Antithetic Values.
  *
  * If an instance of this RNG is configured to return antithetic values,
  * the actual value returned, \f$x'\f$, is generated as follows:
@@ -543,40 +543,40 @@
 {
   public:
     /**
-     * \brief Register this type.
-     * \return The object TypeId.
+     * @brief Register this type.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Creates an exponential distribution RNG with the default
+     * @brief Creates an exponential distribution RNG with the default
      * values for the mean and upper bound.
      */
     ExponentialRandomVariable();
 
     /**
-     * \brief Get the configured mean value of this RNG.
+     * @brief Get the configured mean value of this RNG.
      *
-     * \note This will not be the actual mean if the distribution is
+     * @note This will not be the actual mean if the distribution is
      * truncated by a bound.
-     * \return The configured mean value.
+     * @return The configured mean value.
      */
     double GetMean() const;
 
     /**
-     * \brief Get the configured upper bound of this RNG.
-     * \return The upper bound.
+     * @brief Get the configured upper bound of this RNG.
+     * @return The upper bound.
      */
     double GetBound() const;
 
     /**
-     * \copydoc GetValue()
-     * \param [in] mean Mean value of the unbounded exponential distribution.
-     * \param [in] bound Upper bound on values returned.
+     * @copydoc GetValue()
+     * @param [in] mean Mean value of the unbounded exponential distribution.
+     * @param [in] bound Upper bound on values returned.
      */
     double GetValue(double mean, double bound);
 
-    /** \copydoc GetValue(double,double) */
+    /** @copydoc GetValue(double,double) */
     uint32_t GetInteger(uint32_t mean, uint32_t bound);
 
     // Inherited
@@ -593,8 +593,8 @@
 }; // class ExponentialRandomVariable
 
 /**
- * \ingroup randomvariable
- * \brief The Pareto distribution Random Number Generator (RNG).
+ * @ingroup randomvariable
+ * @brief The Pareto distribution Random Number Generator (RNG).
  *
  * This class supports the creation of objects that return random numbers
  * from a fixed Pareto distribution.  It also supports the generation of
@@ -637,7 +637,7 @@
  *
  * where \f$u\f$ is a uniform random variable on [0,1).
  *
- * \par Bounded Distribution
+ * @par Bounded Distribution
  *
  * Since Pareto distributions can theoretically return unbounded
  * values, it is sometimes useful to specify a fixed upper \c Bound.  The
@@ -646,7 +646,7 @@
  * of the resulting distribution is slightly smaller than the mean value
  * in the unbounded case.
  *
- * \par Example
+ * @par Example
  *
  * Here is an example of how to use this class:
  * \code{.cc}
@@ -658,9 +658,9 @@
  *   x->SetAttribute ("Shape", DoubleValue (shape));
  *
  *   double value = x->GetValue ();
- * \endcode
+ * @endcode
  *
- * \par Antithetic Values.
+ * @par Antithetic Values.
  *
  * If an instance of this RNG is configured to return antithetic values,
  * the actual value returned, \f$x'\f$, is generated as follows:
@@ -675,44 +675,44 @@
 {
   public:
     /**
-     * \brief Register this type.
-     * \return The object TypeId.
+     * @brief Register this type.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Creates a Pareto distribution RNG with the default
+     * @brief Creates a Pareto distribution RNG with the default
      * values for the mean, the shape, and upper bound.
      */
     ParetoRandomVariable();
 
     /**
-     * \brief Returns the scale parameter for the Pareto distribution returned by this RNG stream.
-     * \return The scale parameter for the Pareto distribution returned by this RNG stream.
+     * @brief Returns the scale parameter for the Pareto distribution returned by this RNG stream.
+     * @return The scale parameter for the Pareto distribution returned by this RNG stream.
      */
     double GetScale() const;
 
     /**
-     * \brief Returns the shape parameter for the Pareto distribution returned by this RNG stream.
-     * \return The shape parameter for the Pareto distribution returned by this RNG stream.
+     * @brief Returns the shape parameter for the Pareto distribution returned by this RNG stream.
+     * @return The shape parameter for the Pareto distribution returned by this RNG stream.
      */
     double GetShape() const;
 
     /**
-     * \brief Returns the upper bound on values that can be returned by this RNG stream.
-     * \return The upper bound on values that can be returned by this RNG stream.
+     * @brief Returns the upper bound on values that can be returned by this RNG stream.
+     * @return The upper bound on values that can be returned by this RNG stream.
      */
     double GetBound() const;
 
     /**
-     * \copydoc GetValue()
-     * \param [in] scale Mean parameter for the Pareto distribution.
-     * \param [in] shape Shape parameter for the Pareto distribution.
-     * \param [in] bound Upper bound on values returned.
+     * @copydoc GetValue()
+     * @param [in] scale Mean parameter for the Pareto distribution.
+     * @param [in] shape Shape parameter for the Pareto distribution.
+     * @param [in] bound Upper bound on values returned.
      */
     double GetValue(double scale, double shape, double bound);
 
-    /** \copydoc GetValue(double,double,double) */
+    /** @copydoc GetValue(double,double,double) */
     uint32_t GetInteger(uint32_t scale, uint32_t shape, uint32_t bound);
 
     // Inherited
@@ -732,8 +732,8 @@
 }; // class ParetoRandomVariable
 
 /**
- * \ingroup randomvariable
- * \brief The Weibull distribution Random Number Generator (RNG)
+ * @ingroup randomvariable
+ * @brief The Weibull distribution Random Number Generator (RNG)
  * which allows stream numbers to be set deterministically.
  *
  * This class supports the creation of objects that return random numbers
@@ -784,7 +784,7 @@
  *
  * where \f$u\f$ is a uniform random variable on [0,1).
  *
- * \par Bounded Distribution
+ * @par Bounded Distribution
  *
  * Since Weibull distributions can theoretically return unbounded values,
  * it is sometimes useful to specify a fixed upper limit.    The
@@ -793,7 +793,7 @@
  * resulting distribution is slightly smaller than the mean value
  * in the unbounded case.
  *
- * \par Example
+ * @par Example
  *
  * Here is an example of how to use this class:
  * \code{.cc}
@@ -805,9 +805,9 @@
  *   x->SetAttribute ("Shape", DoubleValue (shape));
  *
  *   double value = x->GetValue ();
- * \endcode
+ * @endcode
  *
- * \par Antithetic Values.
+ * @par Antithetic Values.
  *
  * If an instance of this RNG is configured to return antithetic values,
  * the actual value returned, \f$x'\f$, is generated as follows:
@@ -822,57 +822,57 @@
 {
   public:
     /**
-     * \brief Register this type.
-     * \return The object TypeId.
+     * @brief Register this type.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Creates a Weibull distribution RNG with the default
+     * @brief Creates a Weibull distribution RNG with the default
      * values for the scale, shape, and upper bound.
      */
     WeibullRandomVariable();
 
     /**
-     * \brief Returns the scale parameter for the Weibull distribution returned by this RNG stream.
-     * \return The scale parameter for the Weibull distribution returned by this RNG stream.
+     * @brief Returns the scale parameter for the Weibull distribution returned by this RNG stream.
+     * @return The scale parameter for the Weibull distribution returned by this RNG stream.
      */
     double GetScale() const;
 
     /**
-     * \brief Returns the shape parameter for the Weibull distribution returned by this RNG stream.
-     * \return The shape parameter for the Weibull distribution returned by this RNG stream.
+     * @brief Returns the shape parameter for the Weibull distribution returned by this RNG stream.
+     * @return The shape parameter for the Weibull distribution returned by this RNG stream.
      */
     double GetShape() const;
 
     /**
-     * \brief Returns the upper bound on values that can be returned by this RNG stream.
-     * \return The upper bound on values that can be returned by this RNG stream.
+     * @brief Returns the upper bound on values that can be returned by this RNG stream.
+     * @return The upper bound on values that can be returned by this RNG stream.
      */
     double GetBound() const;
 
     /**
-     * \brief Returns the mean value for the Weibull distribution returned by this RNG stream.
-     * \return The mean value for the Weibull distribution returned by this RNG stream.
+     * @brief Returns the mean value for the Weibull distribution returned by this RNG stream.
+     * @return The mean value for the Weibull distribution returned by this RNG stream.
      */
     double GetMean() const;
 
     /**
-     * \copydoc GetMean()
-     * \param [in] scale Scale parameter for the Weibull distribution.
-     * \param [in] shape Shape parameter for the Weibull distribution.
+     * @copydoc GetMean()
+     * @param [in] scale Scale parameter for the Weibull distribution.
+     * @param [in] shape Shape parameter for the Weibull distribution.
      */
     static double GetMean(double scale, double shape);
 
     /**
-     * \copydoc GetValue()
-     * \param [in] scale Scale parameter for the Weibull distribution.
-     * \param [in] shape Shape parameter for the Weibull distribution.
-     * \param [in] bound Upper bound on values returned.
+     * @copydoc GetValue()
+     * @param [in] scale Scale parameter for the Weibull distribution.
+     * @param [in] shape Shape parameter for the Weibull distribution.
+     * @param [in] bound Upper bound on values returned.
      */
     double GetValue(double scale, double shape, double bound);
 
-    /** \copydoc GetValue(double,double,double) */
+    /** @copydoc GetValue(double,double,double) */
     uint32_t GetInteger(uint32_t scale, uint32_t shape, uint32_t bound);
 
     // Inherited
@@ -892,8 +892,8 @@
 }; // class WeibullRandomVariable
 
 /**
- * \ingroup randomvariable
- * \brief The normal (Gaussian) distribution Random Number Generator
+ * @ingroup randomvariable
+ * @brief The normal (Gaussian) distribution Random Number Generator
  * (RNG) that allows stream numbers to be set deterministically.
  *
  * This class supports the creation of objects that return random numbers
@@ -927,7 +927,7 @@
  * two normally distributed values.  The implementation used here
  * caches \f$y\f$ and \f$v_2\f$ to generate \f$x_2\f$ on the next call.
  *
- * \par Bounded Distribution
+ * @par Bounded Distribution
  *
  * Since normal distributions can theoretically return unbounded
  * values, it is sometimes useful to specify a fixed bound.  The
@@ -935,7 +935,7 @@
  * the \c Bound parameter, \f$b\f$, _i.e._ its values are confined to the interval
  * \f$[\mu - b, \mu + b]\f$.  This preserves the mean but decreases the variance.
  *
- * \par Example
+ * @par Example
  *
  * Here is an example of how to use this class:
  * \code{.cc}
@@ -949,9 +949,9 @@
  *   // The expected value for the mean of the values returned by a
  *   // normally distributed random variable is equal to mean.
  *   double value = x->GetValue ();
- * \endcode
+ * @endcode
  *
- * \par Antithetic Values.
+ * @par Antithetic Values.
  *
  * If an instance of this RNG is configured to return antithetic values,
  * the actual values returned, \f$x_1^{\prime}\f$ and \f$x_2^{\prime}\f$,
@@ -975,46 +975,46 @@
     static const double INFINITE_VALUE;
 
     /**
-     * \brief Register this type.
-     * \return The object TypeId.
+     * @brief Register this type.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Creates a normal distribution RNG with the default
+     * @brief Creates a normal distribution RNG with the default
      * values for the mean, variance, and bound.
      */
     NormalRandomVariable();
 
     /**
-     * \brief Returns the mean value for the normal distribution returned by this RNG stream.
-     * \return The mean value for the normal distribution returned by this RNG stream.
+     * @brief Returns the mean value for the normal distribution returned by this RNG stream.
+     * @return The mean value for the normal distribution returned by this RNG stream.
      */
     double GetMean() const;
 
     /**
-     * \brief Returns the variance value for the normal distribution returned by this RNG stream.
-     * \return The variance value for the normal distribution returned by this RNG stream.
+     * @brief Returns the variance value for the normal distribution returned by this RNG stream.
+     * @return The variance value for the normal distribution returned by this RNG stream.
      */
     double GetVariance() const;
 
     /**
-     * \brief Returns the bound on values that can be returned by this RNG stream.
-     * \return The bound on values that can be returned by this RNG stream.
+     * @brief Returns the bound on values that can be returned by this RNG stream.
+     * @return The bound on values that can be returned by this RNG stream.
      */
     double GetBound() const;
 
     /**
-     * \copydoc GetValue()
-     * \param [in] mean Mean value for the normal distribution.
-     * \param [in] variance Variance value for the normal distribution.
-     * \param [in] bound Bound on values returned.
+     * @copydoc GetValue()
+     * @param [in] mean Mean value for the normal distribution.
+     * @param [in] variance Variance value for the normal distribution.
+     * @param [in] bound Bound on values returned.
      */
     double GetValue(double mean,
                     double variance,
                     double bound = NormalRandomVariable::INFINITE_VALUE);
 
-    /** \copydoc GetValue(double,double,double) */
+    /** @copydoc GetValue(double,double,double) */
     uint32_t GetInteger(uint32_t mean, uint32_t variance, uint32_t bound);
 
     // Inherited
@@ -1042,8 +1042,8 @@
 }; // class NormalRandomVariable
 
 /**
- * \ingroup randomvariable
- * \brief The log-normal distribution Random Number Generator
+ * @ingroup randomvariable
+ * @brief The log-normal distribution Random Number Generator
  * (RNG) that allows stream numbers to be set deterministically.
  *
  * This class supports the creation of objects that return random
@@ -1102,7 +1102,7 @@
  *      x   & = &  \exp\left(\mu + v_1 y \sigma\right)  .
  *   \f}
  *
- * \par Example
+ * @par Example
  *
  * Here is an example of how to use this class:
  * \code{.cc}
@@ -1114,9 +1114,9 @@
  *   x->SetAttribute ("Sigma", DoubleValue (sigma));
  *
  *   double value = x->GetValue ();
- * \endcode
+ * @endcode
  *
- * \par Antithetic Values.
+ * @par Antithetic Values.
  *
  * If an instance of this RNG is configured to return antithetic values,
  * the actual value returned, \f$x'\f$, is generated as follows:
@@ -1135,37 +1135,37 @@
 {
   public:
     /**
-     * \brief Register this type.
-     * \return The object TypeId.
+     * @brief Register this type.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Creates a log-normal distribution RNG with the default
+     * @brief Creates a log-normal distribution RNG with the default
      * values for mu and sigma.
      */
     LogNormalRandomVariable();
 
     /**
-     * \brief Returns the mu value for the log-normal distribution returned by this RNG stream.
-     * \return The mu value for the log-normal distribution returned by this RNG stream.
+     * @brief Returns the mu value for the log-normal distribution returned by this RNG stream.
+     * @return The mu value for the log-normal distribution returned by this RNG stream.
      */
     double GetMu() const;
 
     /**
-     * \brief Returns the sigma value for the log-normal distribution returned by this RNG stream.
-     * \return The sigma value for the log-normal distribution returned by this RNG stream.
+     * @brief Returns the sigma value for the log-normal distribution returned by this RNG stream.
+     * @return The sigma value for the log-normal distribution returned by this RNG stream.
      */
     double GetSigma() const;
 
     /**
-     * \copydoc GetValue()
-     * \param [in] mu Mu value for the log-normal distribution.
-     * \param [in] sigma Sigma value for the log-normal distribution.
+     * @copydoc GetValue()
+     * @param [in] mu Mu value for the log-normal distribution.
+     * @param [in] sigma Sigma value for the log-normal distribution.
      */
     double GetValue(double mu, double sigma);
 
-    /** \copydoc GetValue(double,double) */
+    /** @copydoc GetValue(double,double) */
     uint32_t GetInteger(uint32_t mu, uint32_t sigma);
 
     // Inherited
@@ -1191,8 +1191,8 @@
 }; // class LogNormalRandomVariable
 
 /**
- * \ingroup randomvariable
- * \brief The gamma distribution Random Number Generator (RNG) that
+ * @ingroup randomvariable
+ * @brief The gamma distribution Random Number Generator (RNG) that
  * allows stream numbers to be set deterministically.
  *
  * This class supports the creation of objects that return random numbers
@@ -1224,7 +1224,7 @@
  * [A simple method for generating Gamma variables](https://dl.acm.org/doi/10.1145/358407.358414),
  * ACM Transactions on Mathematical Software, Vol. 26, No. 3, Sept. 2000.
  *
- * \par Example
+ * @par Example
  *
  * Here is an example of how to use this class:
  * \code{.cc}
@@ -1236,9 +1236,9 @@
  *   x->SetAttribute ("Beta", DoubleValue (beta));
  *
  *   double value = x->GetValue ();
- * \endcode
+ * @endcode
  *
- * \par Antithetic Values.
+ * @par Antithetic Values.
  *
  * If an instance of this RNG is configured to return antithetic values,
  * the actual value returned, \f$x'\f$, is generated using the prescription
@@ -1248,37 +1248,37 @@
 {
   public:
     /**
-     * \brief Register this type.
-     * \return The object TypeId.
+     * @brief Register this type.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Creates a gamma distribution RNG with the default values
+     * @brief Creates a gamma distribution RNG with the default values
      * for alpha and beta.
      */
     GammaRandomVariable();
 
     /**
-     * \brief Returns the alpha value for the gamma distribution returned by this RNG stream.
-     * \return The alpha value for the gamma distribution returned by this RNG stream.
+     * @brief Returns the alpha value for the gamma distribution returned by this RNG stream.
+     * @return The alpha value for the gamma distribution returned by this RNG stream.
      */
     double GetAlpha() const;
 
     /**
-     * \brief Returns the beta value for the gamma distribution returned by this RNG stream.
-     * \return The beta value for the gamma distribution returned by this RNG stream.
+     * @brief Returns the beta value for the gamma distribution returned by this RNG stream.
+     * @return The beta value for the gamma distribution returned by this RNG stream.
      */
     double GetBeta() const;
 
     /**
-     * \copydoc GetValue()
-     * \param [in] alpha Alpha value for the gamma distribution.
-     * \param [in] beta Beta value for the gamma distribution.
+     * @copydoc GetValue()
+     * @param [in] alpha Alpha value for the gamma distribution.
+     * @param [in] beta Beta value for the gamma distribution.
      */
     double GetValue(double alpha, double beta);
 
-    /** \copydoc GetValue(double,double) */
+    /** @copydoc GetValue(double,double) */
     uint32_t GetInteger(uint32_t alpha, uint32_t beta);
 
     // Inherited
@@ -1287,12 +1287,12 @@
 
   private:
     /**
-     * \brief Returns a random double from a normal distribution with the specified mean, variance,
+     * @brief Returns a random double from a normal distribution with the specified mean, variance,
      * and bound.
-     * \param [in] mean Mean value for the normal distribution.
-     * \param [in] variance Variance value for the normal distribution.
-     * \param [in] bound Bound on values returned.
-     * \return A floating point random value.
+     * @param [in] mean Mean value for the normal distribution.
+     * @param [in] variance Variance value for the normal distribution.
+     * @param [in] bound Bound on values returned.
+     * @return A floating point random value.
      */
     double GetNormalValue(double mean, double variance, double bound);
 
@@ -1313,8 +1313,8 @@
 }; // class GammaRandomVariable
 
 /**
- * \ingroup randomvariable
- * \brief The Erlang distribution Random Number Generator (RNG) that
+ * @ingroup randomvariable
+ * @brief The Erlang distribution Random Number Generator (RNG) that
  * allows stream numbers to be set deterministically.
  *
  * This class supports the creation of objects that return random numbers
@@ -1353,7 +1353,7 @@
  *
  * where the \f$u_i\f$ are \f$k\f$ uniform random variables on [0,1).
  *
- * \par Example
+ * @par Example
  *
  * Here is an example of how to use this class:
  * \code{.cc}
@@ -1365,9 +1365,9 @@
  *   x->SetAttribute ("Lambda", DoubleValue (lambda));
  *
  *   double value = x->GetValue ();
- * \endcode
+ * @endcode
  *
- * \par Antithetic Values.
+ * @par Antithetic Values.
  *
  * If an instance of this RNG is configured to return antithetic values,
  * the actual value returned, \f$x'\f$, is generated as follows:
@@ -1382,37 +1382,37 @@
 {
   public:
     /**
-     * \brief Register this type.
-     * \return The object TypeId.
+     * @brief Register this type.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Creates an Erlang distribution RNG with the default values
+     * @brief Creates an Erlang distribution RNG with the default values
      * for k and lambda.
      */
     ErlangRandomVariable();
 
     /**
-     * \brief Returns the k value for the Erlang distribution returned by this RNG stream.
-     * \return The k value for the Erlang distribution returned by this RNG stream.
+     * @brief Returns the k value for the Erlang distribution returned by this RNG stream.
+     * @return The k value for the Erlang distribution returned by this RNG stream.
      */
     uint32_t GetK() const;
 
     /**
-     * \brief Returns the lambda value for the Erlang distribution returned by this RNG stream.
-     * \return The lambda value for the Erlang distribution returned by this RNG stream.
+     * @brief Returns the lambda value for the Erlang distribution returned by this RNG stream.
+     * @return The lambda value for the Erlang distribution returned by this RNG stream.
      */
     double GetLambda() const;
 
     /**
-     * \copydoc GetValue()
-     * \param [in] k K value for the Erlang distribution.
-     * \param [in] lambda Lambda value for the Erlang distribution.
+     * @copydoc GetValue()
+     * @param [in] k K value for the Erlang distribution.
+     * @param [in] lambda Lambda value for the Erlang distribution.
      */
     double GetValue(uint32_t k, double lambda);
 
-    /** \copydoc GetValue(uint32_t,double) */
+    /** @copydoc GetValue(uint32_t,double) */
     uint32_t GetInteger(uint32_t k, uint32_t lambda);
 
     // Inherited
@@ -1421,11 +1421,11 @@
 
   private:
     /**
-     * \brief Returns a random double from an exponential distribution with the specified mean and
+     * @brief Returns a random double from an exponential distribution with the specified mean and
      * upper bound.
-     * \param [in] mean Mean value of the random variables.
-     * \param [in] bound Upper bound on values returned.
-     * \return A floating point random value.
+     * @param [in] mean Mean value of the random variables.
+     * @param [in] bound Upper bound on values returned.
+     * @return A floating point random value.
      */
     double GetExponentialValue(double mean, double bound);
 
@@ -1438,8 +1438,8 @@
 }; // class ErlangRandomVariable
 
 /**
- * \ingroup randomvariable
- * \brief The triangular distribution Random Number Generator (RNG) that
+ * @ingroup randomvariable
+ * @brief The triangular distribution Random Number Generator (RNG) that
  * allows stream numbers to be set deterministically.
  *
  * This class supports the creation of objects that return random numbers
@@ -1477,7 +1477,7 @@
  *
  * where \f$u\f$ is a uniform random variable on [0,1).
  *
- * \par Example
+ * @par Example
  *
  * Here is an example of how to use this class:
  * \code{.cc}
@@ -1491,9 +1491,9 @@
  *   x->SetAttribute ("Max", DoubleValue (max));
  *
  *   double value = x->GetValue ();
- * \endcode
+ * @endcode
  *
- * \par Antithetic Values.
+ * @par Antithetic Values.
  *
  * If an instance of this RNG is configured to return antithetic values,
  * the actual value returned, \f$x'\f$, is generated as follows:
@@ -1512,44 +1512,44 @@
 {
   public:
     /**
-     * \brief Register this type.
-     * \return The object TypeId.
+     * @brief Register this type.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Creates a triangular distribution RNG with the default
+     * @brief Creates a triangular distribution RNG with the default
      * values for the mean, lower bound, and upper bound.
      */
     TriangularRandomVariable();
 
     /**
-     * \brief Returns the mean value for the triangular distribution returned by this RNG stream.
-     * \return The mean value for the triangular distribution returned by this RNG stream.
+     * @brief Returns the mean value for the triangular distribution returned by this RNG stream.
+     * @return The mean value for the triangular distribution returned by this RNG stream.
      */
     double GetMean() const;
 
     /**
-     * \brief Returns the lower bound for the triangular distribution returned by this RNG stream.
-     * \return The lower bound for the triangular distribution returned by this RNG stream.
+     * @brief Returns the lower bound for the triangular distribution returned by this RNG stream.
+     * @return The lower bound for the triangular distribution returned by this RNG stream.
      */
     double GetMin() const;
 
     /**
-     * \brief Returns the upper bound on values that can be returned by this RNG stream.
-     * \return The upper bound on values that can be returned by this RNG stream.
+     * @brief Returns the upper bound on values that can be returned by this RNG stream.
+     * @return The upper bound on values that can be returned by this RNG stream.
      */
     double GetMax() const;
 
     /**
-     * \copydoc GetValue()
-     * \param [in] mean Mean value for the triangular distribution.
-     * \param [in] min Low end of the range.
-     * \param [in] max High end of the range.
+     * @copydoc GetValue()
+     * @param [in] mean Mean value for the triangular distribution.
+     * @param [in] min Low end of the range.
+     * @param [in] max High end of the range.
      */
     double GetValue(double mean, double min, double max);
 
-    /** \copydoc GetValue(double,double,double) */
+    /** @copydoc GetValue(double,double,double) */
     uint32_t GetInteger(uint32_t mean, uint32_t min, uint32_t max);
 
     // Inherited
@@ -1569,8 +1569,8 @@
 }; // class TriangularRandomVariable
 
 /**
- * \ingroup randomvariable
- * \brief The Zipf distribution Random Number Generator (RNG) that
+ * @ingroup randomvariable
+ * @brief The Zipf distribution Random Number Generator (RNG) that
  * allows stream numbers to be set deterministically.
  *
  * This class supports the creation of objects that return random numbers
@@ -1617,7 +1617,7 @@
  *
  * where \f$u\f$ is a uniform random variable on [0,1).
  *
- * \par Example
+ * @par Example
  *
  * Here is an example of how to use this class:
  * \code{.cc}
@@ -1629,9 +1629,9 @@
  *   x->SetAttribute ("Alpha", DoubleValue (alpha));
  *
  *   double value = x->GetValue ();
- * \endcode
+ * @endcode
  *
- * \par Antithetic Values.
+ * @par Antithetic Values.
  *
  * If an instance of this RNG is configured to return antithetic values,
  * the actual value returned, \f$k'\f$, is the value such that
@@ -1645,38 +1645,38 @@
 {
   public:
     /**
-     * \brief Register this type.
-     * \return The object TypeId.
+     * @brief Register this type.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Creates a Zipf distribution RNG with the default values
+     * @brief Creates a Zipf distribution RNG with the default values
      * for n and alpha.
      */
     ZipfRandomVariable();
 
     /**
-     * \brief Returns the n value for the Zipf distribution returned by this RNG stream.
-     * \return The n value for the Zipf distribution returned by this RNG stream.
+     * @brief Returns the n value for the Zipf distribution returned by this RNG stream.
+     * @return The n value for the Zipf distribution returned by this RNG stream.
      */
     uint32_t GetN() const;
 
     /**
-     * \brief Returns the alpha value for the Zipf distribution returned by this RNG stream.
-     * \return The alpha value for the Zipf distribution returned by this RNG stream.
+     * @brief Returns the alpha value for the Zipf distribution returned by this RNG stream.
+     * @return The alpha value for the Zipf distribution returned by this RNG stream.
      */
     double GetAlpha() const;
 
     /**
-     * \copydoc GetValue()
-     * \param [in] n N value for the Zipf distribution.
-     * \param [in] alpha Alpha value for the Zipf distribution.
-     * \return A floating point random value.
+     * @copydoc GetValue()
+     * @param [in] n N value for the Zipf distribution.
+     * @param [in] alpha Alpha value for the Zipf distribution.
+     * @return A floating point random value.
      */
     double GetValue(uint32_t n, double alpha);
 
-    /** \copydoc GetValue(uint32_t,double) */
+    /** @copydoc GetValue(uint32_t,double) */
     uint32_t GetInteger(uint32_t n, uint32_t alpha);
 
     // Inherited
@@ -1696,8 +1696,8 @@
 }; // class ZipfRandomVariable
 
 /**
- * \ingroup randomvariable
- * \brief The zeta distribution Random Number Generator (RNG) that
+ * @ingroup randomvariable
+ * @brief The zeta distribution Random Number Generator (RNG) that
  * allows stream numbers to be set deterministically.
  *
  * This class supports the creation of objects that return random numbers
@@ -1736,7 +1736,7 @@
  * The Zeta RNG \f$x\f$ is generated by an accept-reject algorithm;
  * see the implementation of GetValue(double).
  *
- * \par Example
+ * @par Example
  *
  * Here is an example of how to use this class:
  * \code{.cc}
@@ -1746,9 +1746,9 @@
  *   x->SetAttribute ("Alpha", DoubleValue (alpha));
  *
  *   double value = x->GetValue ();
- * \endcode
+ * @endcode
  *
- * \par Antithetic Values.
+ * @par Antithetic Values.
  *
  * If an instance of this RNG is configured to return antithetic values,
  * the actual value returned, \f$x'\f$, is generated by using
@@ -1758,30 +1758,30 @@
 {
   public:
     /**
-     * \brief Register this type.
-     * \return The object TypeId.
+     * @brief Register this type.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Creates a zeta distribution RNG with the default value for
+     * @brief Creates a zeta distribution RNG with the default value for
      * alpha.
      */
     ZetaRandomVariable();
 
     /**
-     * \brief Returns the alpha value for the zeta distribution returned by this RNG stream.
-     * \return The alpha value for the zeta distribution returned by this RNG stream.
+     * @brief Returns the alpha value for the zeta distribution returned by this RNG stream.
+     * @return The alpha value for the zeta distribution returned by this RNG stream.
      */
     double GetAlpha() const;
 
     /**
-     * \copydoc GetValue()
-     * \param [in] alpha Alpha value for the zeta distribution.
+     * @copydoc GetValue()
+     * @param [in] alpha Alpha value for the zeta distribution.
      */
     double GetValue(double alpha);
 
-    /** \copydoc GetValue(double) */
+    /** @copydoc GetValue(double) */
     uint32_t GetInteger(uint32_t alpha);
 
     // Inherited
@@ -1798,8 +1798,8 @@
 }; // class ZetaRandomVariable
 
 /**
- * \ingroup randomvariable
- * \brief The Random Number Generator (RNG) that returns a predetermined sequence.
+ * @ingroup randomvariable
+ * @brief The Random Number Generator (RNG) that returns a predetermined sequence.
  *
  * Defines a random variable that has a specified, predetermined
  * sequence.  This would be useful when trying to force the RNG to
@@ -1812,7 +1812,7 @@
  * (deep-copy).  Also note that the sequence repeats if more values
  * are requested than are present in the array.
  *
- * \par Example
+ * @par Example
  *
  * Here is an example of how to use this class:
  * \code{.cc}
@@ -1822,7 +1822,7 @@
  *   s->SetValueArray (array);
  *
  *   double value = x->GetValue ();
- * \endcode
+ * @endcode
  *
  * This will return values in the repeating sequence
  *
@@ -1830,7 +1830,7 @@
  *      x \in 4, 4, 7, 7, 10, 10, 4, \dots
  *   \f]
  *
- * \par Antithetic Values.
+ * @par Antithetic Values.
  *
  * This RNG ignores the antithetic setting.
  */
@@ -1838,33 +1838,33 @@
 {
   public:
     /**
-     * \brief Register this type.
-     * \return The object TypeId.
+     * @brief Register this type.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Creates a deterministic RNG that will have a predetermined
+     * @brief Creates a deterministic RNG that will have a predetermined
      * sequence of values.
      */
     DeterministicRandomVariable();
     ~DeterministicRandomVariable() override;
 
     /**
-     * \brief Sets the array of values that holds the predetermined sequence.
+     * @brief Sets the array of values that holds the predetermined sequence.
      *
      * Note that the values in the array are copied and stored
      * (deep-copy).
-     * \param [in] values Array of random values to return in sequence.
+     * @param [in] values Array of random values to return in sequence.
      */
     void SetValueArray(const std::vector<double>& values);
     /**
-     * \brief Sets the array of values that holds the predetermined sequence.
+     * @brief Sets the array of values that holds the predetermined sequence.
      *
      * Note that the values in the array are copied and stored
      * (deep-copy).
-     * \param [in] values Array of random values to return in sequence.
-     * \param [in] length Number of values in the array.
+     * @param [in] values Array of random values to return in sequence.
+     * @param [in] length Number of values in the array.
      */
     void SetValueArray(const double* values, std::size_t length);
 
@@ -1885,8 +1885,8 @@
 }; // class DeterministicRandomVariable
 
 /**
- * \ingroup randomvariable
- * \brief The Random Number Generator (RNG) that has a specified
+ * @ingroup randomvariable
+ * @brief The Random Number Generator (RNG) that has a specified
  * empirical distribution.
  *
  * Defines a random variable that has a specified, empirical
@@ -1929,7 +1929,7 @@
  * beyond the first/last to work with), but simply return the extremal CDF
  * value, as in sampling.
  *
- * \par Example
+ * @par Example
  *
  * Here is an example of how to use this class:
  * \code{.cc}
@@ -1942,7 +1942,7 @@
  *    x->CDF (10.0,  1.0);
  *
  *    double value = x->GetValue ();
- * \endcode
+ * @endcode
  *
  * The expected values and probabilities returned by GetValue() are
  *
@@ -1964,7 +1964,7 @@
  *
  * See empirical-random-variable-example.cc for an example.
  *
- * \par Antithetic Values.
+ * @par Antithetic Values.
  *
  * If an instance of this RNG is configured to return antithetic values,
  * the actual value returned, \f$x'\f$, is generated by using
@@ -1974,22 +1974,22 @@
 {
   public:
     /**
-     * \brief Register this type.
-     * \return The object TypeId.
+     * @brief Register this type.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Creates an empirical RNG that has a specified, empirical
+     * @brief Creates an empirical RNG that has a specified, empirical
      * distribution, and configured for interpolating mode.
      */
     EmpiricalRandomVariable();
 
     /**
-     * \brief Specifies a point in the empirical distribution
+     * @brief Specifies a point in the empirical distribution
      *
-     * \param [in] v The function value for this point
-     * \param [in] c Probability that the function is less than or equal to \p v
+     * @param [in] v The function value for this point
+     * @param [in] c Probability that the function is less than or equal to \p v
      *               In other words this is cumulative distribution function
      *               at \p v.
      */
@@ -1997,32 +1997,32 @@
 
     // Inherited
     /**
-     * \copydoc RandomVariableStream::GetValue()
-     * \note This does not interpolate the CDF, but treats it as a
+     * @copydoc RandomVariableStream::GetValue()
+     * @note This does not interpolate the CDF, but treats it as a
      * stepwise continuous function.
      */
     double GetValue() override;
     using RandomVariableStream::GetInteger;
 
     /**
-     * \brief Returns the next value in the empirical distribution using
+     * @brief Returns the next value in the empirical distribution using
      * linear interpolation.
-     * \return The floating point next value in the empirical distribution
+     * @return The floating point next value in the empirical distribution
      * using linear interpolation.
      */
     virtual double Interpolate();
 
     /**
-     * \brief Switch the mode between sampling the CDF and interpolating.
+     * @brief Switch the mode between sampling the CDF and interpolating.
      * The default mode is sampling.
-     * \param [in] interpolate If \c true set to interpolation, otherwise sampling.
-     * \returns The previous interpolate flag value.
+     * @param [in] interpolate If \c true set to interpolation, otherwise sampling.
+     * @returns The previous interpolate flag value.
      */
     bool SetInterpolate(bool interpolate);
 
   private:
     /**
-     * \brief Check that the CDF is valid.
+     * @brief Check that the CDF is valid.
      *
      * A valid CDF has
      *
@@ -2033,7 +2033,7 @@
      */
     void Validate();
     /**
-     * \brief Do the initial rng draw and check against the extrema.
+     * @brief Do the initial rng draw and check against the extrema.
      *
      * If the extrema apply, \c value will have the extremal value
      * and the return will be \c true.
@@ -2041,23 +2041,23 @@
      * If the extrema do not apply \c value will have the URNG value
      * and the return will be \c false.
      *
-     * \param [out] value The extremal value, or the URNG.
-     * \returns \c true if \p value is the extremal result,
+     * @param [out] value The extremal value, or the URNG.
+     * @returns \c true if \p value is the extremal result,
      *          or \c false if \p value is the URNG value.
      */
     bool PreSample(double& value);
     /**
-     * \brief Sample the CDF as a histogram (without interpolation).
-     * \param [in] r The CDF value at which to sample the CDF.
-     * \return The bin value corresponding to \c r.
+     * @brief Sample the CDF as a histogram (without interpolation).
+     * @param [in] r The CDF value at which to sample the CDF.
+     * @return The bin value corresponding to \c r.
      */
     double DoSampleCDF(double r);
     /**
-     * \brief Linear interpolation between two points on the CDF to estimate
+     * @brief Linear interpolation between two points on the CDF to estimate
      * the value at \p r.
      *
-     * \param [in] r  The argument value to interpolate to.
-     * \returns The interpolated CDF at \pname{r}
+     * @param [in] r  The argument value to interpolate to.
+     * @returns The interpolated CDF at \pname{r}
      */
     double DoInterpolate(double r);
 
@@ -2078,8 +2078,8 @@
 }; // class EmpiricalRandomVariable
 
 /**
- * \ingroup randomvariable
- * \brief The binomial distribution Random Number Generator (RNG).
+ * @ingroup randomvariable
+ * @brief The binomial distribution Random Number Generator (RNG).
  *
  * This class supports the creation of objects that return random numbers
  * from a fixed binomial distribution. It also supports the generation of
@@ -2109,7 +2109,7 @@
  * The sum of these indicator functions over all trials gives the total
  * number of successes, which is the value of the binomial random variable.
  *
- * \par Example
+ * @par Example
  *
  * Here is an example of how to use this class:
  * \code{.cc}
@@ -2121,9 +2121,9 @@
  *   x->SetAttribute ("Probability", DoubleValue (probability));
  *
  *   double successes = x->GetValue ();
- * \endcode
+ * @endcode
  *
- * \par Antithetic Values.
+ * @par Antithetic Values.
  *
  * If an instance of this RNG is configured to return antithetic values,
  * the actual value returned, \f$n'\f$, for the Binomial process is determined by:
@@ -2145,24 +2145,24 @@
 {
   public:
     /**
-     * \brief Register this type.
-     * \return The object TypeId.
+     * @brief Register this type.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
     BinomialRandomVariable();
 
     /**
-     * \copydoc GetValue()
-     * \param [in] trials Number of trials.
-     * \param [in] probability Probability of success in each trial.
-     * \return Returns a number within the range [0, trials] indicating the number of successful
+     * @copydoc GetValue()
+     * @param [in] trials Number of trials.
+     * @param [in] probability Probability of success in each trial.
+     * @return Returns a number within the range [0, trials] indicating the number of successful
      * trials.
      */
     double GetValue(uint32_t trials, double probability);
 
     /**
-     * \copydoc GetValue(uint32_t,double)
+     * @copydoc GetValue(uint32_t,double)
      * This function is similar to GetValue(), but it returns a uint32_t instead of a double.
      */
     uint32_t GetInteger(uint32_t trials, uint32_t probability);
@@ -2181,8 +2181,8 @@
 }; // class BinomialRandomVariable
 
 /**
- * \ingroup randomvariable
- * \brief The Bernoulli distribution Random Number Generator (RNG).
+ * @ingroup randomvariable
+ * @brief The Bernoulli distribution Random Number Generator (RNG).
  *
  * This class supports the creation of objects that return random numbers
  * from a fixed Bernoulli distribution. It also supports the generation of
@@ -2212,7 +2212,7 @@
  *
  * where \f$u\f$ is a uniform random variable on [0,1) and \f$p\f$ is the probability of success.
  *
- * \par Example
+ * @par Example
  *
  * Here is an example of how to use this class:
  * \code{.cc}
@@ -2222,9 +2222,9 @@
  *   x->SetAttribute ("Probability", DoubleValue (probability));
  *
  *   double success = x->GetValue ();
- * \endcode
+ * @endcode
  *
- * \par Antithetic Values.
+ * @par Antithetic Values.
  *
  * If an instance of this RNG is configured to return antithetic values,
  * the actual value returned, \f$x'\f$, is determined by:
@@ -2243,22 +2243,22 @@
 {
   public:
     /**
-     * \brief Register this type.
-     * \return The object TypeId.
+     * @brief Register this type.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
     BernoulliRandomVariable();
 
     /**
-     * \copydoc GetValue()
-     * \param [in] probability Probability of success.
-     * \return Returns 1 if the trial is successful, or 0 if it is not.
+     * @copydoc GetValue()
+     * @param [in] probability Probability of success.
+     * @return Returns 1 if the trial is successful, or 0 if it is not.
      */
     double GetValue(double probability);
 
     /**
-     * \copydoc GetValue(double)
+     * @copydoc GetValue(double)
      * This function is similar to GetValue(), but it returns a uint32_t instead of a double.
      */
     uint32_t GetInteger(uint32_t probability);
@@ -2274,8 +2274,8 @@
 }; // class BernoulliRandomVariable
 
 /**
- * \ingroup randomvariable
- * \brief The laplacian distribution Random Number Generator (RNG).
+ * @ingroup randomvariable
+ * @brief The laplacian distribution Random Number Generator (RNG).
  *
  * This class supports the creation of objects that return random numbers
  * from a fixed laplacian distribution.
@@ -2299,7 +2299,7 @@
  *
  * where \f$u\f$ is a uniform random variable on [-0.5,0.5).
  *
- * \par Bounded Distribution
+ * @par Bounded Distribution
  *
  * The Laplacian distribution can be bounded symmetrically about the mean by
  * the \c Bound parameter, \f$b\f$, _i.e._ its values are confined to the interval
@@ -2309,46 +2309,46 @@
 {
   public:
     /**
-     * \brief Register this type.
-     * \return The object TypeId.
+     * @brief Register this type.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Creates an unbounded laplacian distribution RNG with the default
+     * @brief Creates an unbounded laplacian distribution RNG with the default
      * values for the location and the scale.
      */
     LaplacianRandomVariable();
 
     /**
-     * \brief Get the configured location value of this RNG.
+     * @brief Get the configured location value of this RNG.
      *
-     * \return The configured location value.
+     * @return The configured location value.
      */
     double GetLocation() const;
 
     /**
-     * \brief Get the configured scale value of this RNG.
+     * @brief Get the configured scale value of this RNG.
      *
-     * \return The configured scale value.
+     * @return The configured scale value.
      */
     double GetScale() const;
 
     /**
-     * \brief Get the configured bound of this RNG.
-     * \return The bound.
+     * @brief Get the configured bound of this RNG.
+     * @return The bound.
      */
     double GetBound() const;
 
     /**
-     * \copydoc GetValue()
-     * \param [in] location location value of the laplacian distribution.
-     * \param [in] scale scale value of the laplacian distribution.
-     * \param [in] bound bound on values returned.
+     * @copydoc GetValue()
+     * @param [in] location location value of the laplacian distribution.
+     * @param [in] scale scale value of the laplacian distribution.
+     * @param [in] bound bound on values returned.
      */
     double GetValue(double location, double scale, double bound);
 
-    /** \copydoc GetValue(double,double,double) */
+    /** @copydoc GetValue(double,double,double) */
     uint32_t GetInteger(uint32_t location, uint32_t scale, uint32_t bound);
 
     // Inherited
@@ -2356,14 +2356,14 @@
     using RandomVariableStream::GetInteger;
 
     /**
-     * \brief Returns the variance value for the laplacian distribution returned by this RNG stream.
-     * \return The variance value for the laplacian distribution returned by this RNG stream.
+     * @brief Returns the variance value for the laplacian distribution returned by this RNG stream.
+     * @return The variance value for the laplacian distribution returned by this RNG stream.
      */
     double GetVariance() const;
 
     /**
-     * \copydoc GetVariance()
-     * \param [in] scale scale value of the laplacian distribution.
+     * @copydoc GetVariance()
+     * @param [in] scale scale value of the laplacian distribution.
      */
     static double GetVariance(double scale);
 
@@ -2380,8 +2380,8 @@
 }; // class LaplacianRandomVariable
 
 /**
- * \ingroup randomvariable
- * \brief The Largest Extreme Value distribution Random Number Generator (RNG).
+ * @ingroup randomvariable
+ * @brief The Largest Extreme Value distribution Random Number Generator (RNG).
  *
  * This class supports the creation of objects that return random numbers from a fixed Largest
  * Extreme Value distribution. This corresponds to the type-I Generalized Extreme Value
@@ -2424,39 +2424,39 @@
 {
   public:
     /**
-     * \brief Register this type.
-     * \return The object TypeId.
+     * @brief Register this type.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Creates a Largest Extreme Value distribution RNG with the default
+     * @brief Creates a Largest Extreme Value distribution RNG with the default
      * values for the location and the scale.
      */
     LargestExtremeValueRandomVariable();
 
     /**
-     * \brief Get the configured location value of this RNG.
+     * @brief Get the configured location value of this RNG.
      *
-     * \return The configured location value.
+     * @return The configured location value.
      */
     double GetLocation() const;
 
     /**
-     * \brief Get the configured scale value of this RNG.
+     * @brief Get the configured scale value of this RNG.
      *
-     * \return The configured scale value.
+     * @return The configured scale value.
      */
     double GetScale() const;
 
     /**
-     * \copydoc GetValue()
-     * \param [in] location location value of the Largest Extreme Value distribution.
-     * \param [in] scale scale value of the Largest Extreme Value distribution.
+     * @copydoc GetValue()
+     * @param [in] location location value of the Largest Extreme Value distribution.
+     * @param [in] scale scale value of the Largest Extreme Value distribution.
      */
     double GetValue(double location, double scale);
 
-    /** \copydoc GetValue(double,double) */
+    /** @copydoc GetValue(double,double) */
     uint32_t GetInteger(uint32_t location, uint32_t scale);
 
     // Inherited
@@ -2464,31 +2464,31 @@
     using RandomVariableStream::GetInteger;
 
     /**
-     * \brief Returns the mean value for the Largest Extreme Value distribution returned by this RNG
+     * @brief Returns the mean value for the Largest Extreme Value distribution returned by this RNG
      * stream.
-     * \return The mean value for the Largest Extreme Value distribution returned by this
+     * @return The mean value for the Largest Extreme Value distribution returned by this
      * RNG stream.
      */
     double GetMean() const;
 
     /**
-     * \copydoc GetMean()
-     * \param [in] location location value of the Largest Extreme Value distribution.
-     * \param [in] scale scale value of the Largest Extreme Value distribution.
+     * @copydoc GetMean()
+     * @param [in] location location value of the Largest Extreme Value distribution.
+     * @param [in] scale scale value of the Largest Extreme Value distribution.
      */
     static double GetMean(double location, double scale);
 
     /**
-     * \brief Returns the variance value for the Largest Extreme Value distribution returned by this
+     * @brief Returns the variance value for the Largest Extreme Value distribution returned by this
      * RNG stream.
-     * \return The variance value for the Largest Extreme Value distribution returned by
+     * @return The variance value for the Largest Extreme Value distribution returned by
      * this RNG stream.
      */
     double GetVariance() const;
 
     /**
-     * \copydoc GetVariance()
-     * \param [in] scale scale value of the Largest Extreme Value distribution.
+     * @copydoc GetVariance()
+     * @param [in] scale scale value of the Largest Extreme Value distribution.
      */
     static double GetVariance(double scale);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/realtime-simulator-impl.cc ns-3.44/src/core/model/realtime-simulator-impl.cc
--- ns-3.43/src/core/model/realtime-simulator-impl.cc	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/realtime-simulator-impl.cc	2025-03-09 16:55:49.363371100 -0700
@@ -24,8 +24,8 @@
 #include <thread>
 
 /**
- * \file
- * \ingroup realtime
+ * @file
+ * @ingroup realtime
  * ns3::RealTimeSimulatorImpl implementation.
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/realtime-simulator-impl.h ns-3.44/src/core/model/realtime-simulator-impl.h
--- ns-3.43/src/core/model/realtime-simulator-impl.h	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/realtime-simulator-impl.h	2025-03-09 16:55:49.363371100 -0700
@@ -20,8 +20,8 @@
 #include <thread>
 
 /**
- * \file
- * \ingroup realtime
+ * @file
+ * @ingroup realtime
  * ns3::RealtimeSimulatorImpl declaration.
  */
 
@@ -29,14 +29,14 @@
 {
 
 /**
- * \ingroup simulator
- * \defgroup realtime Realtime Simulator
+ * @ingroup simulator
+ * @defgroup realtime Realtime Simulator
  *
  * Realtime simulator implementation.
  */
 
 /**
- * \ingroup realtime
+ * @ingroup realtime
  *
  * Realtime version of SimulatorImpl.
  */
@@ -45,7 +45,7 @@
   public:
     /**
      * Get the registered TypeId for this class.
-     * \returns The TypeId.
+     * @returns The TypeId.
      */
     static TypeId GetTypeId();
 
@@ -66,7 +66,7 @@
          *
          * Falling behind by more than the hard limit tolerance triggers
          * a fatal error.
-         * \see SetHardLimit
+         * @see SetHardLimit
          */
         SYNC_HARD_LIMIT,
     };
@@ -97,7 +97,7 @@
     uint32_t GetContext() const override;
     uint64_t GetEventCount() const override;
 
-    /** \copydoc ScheduleWithContext(uint32_t,const Time&,EventImpl*) */
+    /** @copydoc ScheduleWithContext(uint32_t,const Time&,EventImpl*) */
     void ScheduleRealtimeWithContext(uint32_t context, const Time& delay, EventImpl* event);
     /**
      * Schedule a future event execution (in the same context).
@@ -109,8 +109,8 @@
     /**
      * Schedule an event to run at the current virtual time.
      *
-     * \param [in] context Event context.
-     * \param [in] event The event to schedule.
+     * @param [in] context Event context.
+     * @param [in] event The event to schedule.
      */
     void ScheduleRealtimeNowWithContext(uint32_t context, EventImpl* event);
     /**
@@ -121,26 +121,26 @@
     void ScheduleRealtimeNow(EventImpl* event);
     /**
      * Get the current real time from the synchronizer.
-     * \returns The current real time.
+     * @returns The current real time.
      */
     Time RealtimeNow() const;
 
     /**
      * Set the SynchronizationMode.
      *
-     * \param [in] mode The new SynchronizationMode.
+     * @param [in] mode The new SynchronizationMode.
      */
     void SetSynchronizationMode(RealtimeSimulatorImpl::SynchronizationMode mode);
     /**
      * Get the SynchronizationMode.
-     * \returns The current SynchronizationMode.
+     * @returns The current SynchronizationMode.
      */
     RealtimeSimulatorImpl::SynchronizationMode GetSynchronizationMode() const;
 
     /**
      * Set the fatal error threshold for SynchronizationMode SYNC_HARD_LIMIT.
      *
-     * \param [in] limit The maximum amount of real time we are allowed to fall
+     * @param [in] limit The maximum amount of real time we are allowed to fall
      *     behind before we trigger a fatal error.
      */
     void SetHardLimit(Time limit);
@@ -148,24 +148,24 @@
      * Get the current fatal error threshold for SynchronizationMode
      * SYNC_HARD_LIMIT.
      *
-     * \returns The hard limit threshold.
+     * @returns The hard limit threshold.
      */
     Time GetHardLimit() const;
 
   private:
     /**
      * Is the simulator running?
-     * \returns \c true if we are running.
+     * @returns \c true if we are running.
      */
     bool Running() const;
     /**
      * Check that the Synchronizer is locked to the real time clock.
-     * \return \c true if the Synchronizer is locked.
+     * @return \c true if the Synchronizer is locked.
      */
     bool Realtime() const;
     /**
      * Get the timestep of the next event.
-     * \returns The timestep of the next event.
+     * @returns The timestep of the next event.
      */
     uint64_t NextTs() const;
     /** Process the next event. */
@@ -183,7 +183,7 @@
     bool m_running;
 
     /**
-     * \name Mutex-protected variables.
+     * @name Mutex-protected variables.
      *
      * These variables are protected by #m_mutex.
      */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/rng-seed-manager.cc ns-3.44/src/core/model/rng-seed-manager.cc
--- ns-3.43/src/core/model/rng-seed-manager.cc	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/rng-seed-manager.cc	2025-03-09 16:55:49.363371100 -0700
@@ -14,8 +14,8 @@
 #include "uinteger.h"
 
 /**
- * \file
- * \ingroup randomvariable
+ * @file
+ * @ingroup randomvariable
  * ns3::RngSeedManager implementation.
  */
 
@@ -25,14 +25,14 @@
 NS_LOG_COMPONENT_DEFINE("RngSeedManager");
 
 /**
- * \relates RngSeedManager
+ * @relates RngSeedManager
  * The next random number generator stream number to use
  * for automatic assignment.
  */
 static uint64_t g_nextStreamIndex = 0;
 /**
- * \relates RngSeedManager
- * \anchor GlobalValueRngSeed
+ * @relates RngSeedManager
+ * @anchor GlobalValueRngSeed
  * The random number generator seed number global value.  This is used to
  * generate an new master PRNG sequence.  It is typically not modified
  * by user programs; the variable RngRun is preferred for independent
@@ -45,8 +45,8 @@
                                   ns3::UintegerValue(1),
                                   ns3::MakeUintegerChecker<uint32_t>());
 /**
- * \relates RngSeedManager
- * \anchor GlobalValueRngRun
+ * @relates RngSeedManager
+ * @anchor GlobalValueRngRun
  * The random number generator substream index.  This is used to generate
  * new PRNG sequences for all streams (random variables) in such a manner
  * that the streams remain uncorrelated.  Incrementing this variable can
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/rng-seed-manager.h ns-3.44/src/core/model/rng-seed-manager.h
--- ns-3.43/src/core/model/rng-seed-manager.h	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/rng-seed-manager.h	2025-03-09 16:55:49.363371100 -0700
@@ -11,8 +11,8 @@
 #include <stdint.h>
 
 /**
- * \file
- * \ingroup randomvariable
+ * @file
+ * @ingroup randomvariable
  * ns3::RngSeedManager declaration.
  */
 
@@ -20,7 +20,7 @@
 {
 
 /**
- * \ingroup randomvariable
+ * @ingroup randomvariable
  *
  * Manage the seed number and run number of the underlying
  * random number generator, and automatic assignment of stream numbers.
@@ -29,68 +29,68 @@
 {
   public:
     /**
-     * \brief Set the seed.
+     * @brief Set the seed.
      *
      * This sets the global initial seed which will be used all
      * subsequently instantiated RandomVariableStream objects.
      *
-     * \code
+     * @code
      *   RngSeedManager::SetSeed(15);
      *   UniformVariable x(2,3);     // These will give the same output every time
      *   ExponentialVariable y(120); // as long as the seed stays the same.
-     * \endcode
-     * \param [in] seed The seed value to use.
+     * @endcode
+     * @param [in] seed The seed value to use.
      *
-     * \note While the underlying RNG takes six integer values as a seed;
+     * @note While the underlying RNG takes six integer values as a seed;
      * it is sufficient to set these all to the same integer, so we provide
      * a simpler interface here that just takes one integer.
      */
     static void SetSeed(uint32_t seed);
 
     /**
-     * \brief Get the current seed value which will be used by all
+     * @brief Get the current seed value which will be used by all
      * subsequently instantiated RandomVariableStream objects.
      *
-     * \return The seed value.
+     * @return The seed value.
      *
      * This returns the current seed value.
      */
     static uint32_t GetSeed();
 
     /**
-     * \brief Set the run number of simulation.
+     * @brief Set the run number of simulation.
      *
-     * \code
+     * @code
      *   RngSeedManager::SetSeed(12);
      *   int N = atol(argv[1]);      // Read in run number from command line.
      *   RngSeedManager::SetRun(N);
      *   UniformVariable x(0,10);
      *   ExponentialVariable y(2902);
-     * \endcode
+     * @endcode
      * In this example, \c N could successively be equal to 1,2,3, _etc._
      * and the user would continue to get independent runs out of the
      * single simulation.  For this simple example, the following might work:
-     * \code
+     * @code
      *   ./simulation 0
      *   ...Results for run 0:...
      *
      *   ./simulation 1
      *   ...Results for run 1:...
-     * \endcode
+     * @endcode
      *
-     * \param [in] run The run number.
+     * @param [in] run The run number.
      */
     static void SetRun(uint64_t run);
     /**
-     * \brief Get the current run number.
-     * \returns The current run number
-     * \see SetRun
+     * @brief Get the current run number.
+     * @returns The current run number
+     * @see SetRun
      */
     static uint64_t GetRun();
 
     /**
      * Get the next automatically assigned stream index.
-     * \returns The next stream index.
+     * @returns The next stream index.
      */
     static uint64_t GetNextStreamIndex();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/rng-stream.cc ns-3.44/src/core/model/rng-stream.cc
--- ns-3.43/src/core/model/rng-stream.cc	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/rng-stream.cc	2025-03-09 16:55:49.363371100 -0700
@@ -17,8 +17,8 @@
 #include <iostream>
 
 /**
- * \file
- * \ingroup rngimpl
+ * @file
+ * @ingroup rngimpl
  * ns3::RngStream and MRG32k3a implementations.
  */
 
@@ -33,7 +33,7 @@
 } // namespace ns3
 
 /**
- * \ingroup rngimpl
+ * @ingroup rngimpl
  * @{
  */
 /** Namespace for MRG32k3a implementation details. */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/rng-stream.h ns-3.44/src/core/model/rng-stream.h
--- ns-3.43/src/core/model/rng-stream.h	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/rng-stream.h	2025-03-09 16:55:49.363371100 -0700
@@ -11,8 +11,8 @@
 #include <string>
 
 /**
- * \file
- * \ingroup rngimpl
+ * @file
+ * @ingroup rngimpl
  * ns3::RngStream declaration.
  */
 
@@ -20,14 +20,14 @@
 {
 
 /**
- * \ingroup randomvariable
- * \defgroup rngimpl RNG Implementation
+ * @ingroup randomvariable
+ * @defgroup rngimpl RNG Implementation
  */
 
 /**
- * \ingroup rngimpl
+ * @ingroup rngimpl
  *
- * \brief Combined Multiple-Recursive Generator MRG32k3a
+ * @brief Combined Multiple-Recursive Generator MRG32k3a
  *
  * This class is the combined multiple-recursive random number
  * generator called MRG32k3a.  The ns3::RandomVariableBase class
@@ -41,22 +41,22 @@
     /**
      * Construct from explicit seed, stream and substream values.
      *
-     * \param [in] seed The starting seed.
-     * \param [in] stream The stream number.
-     * \param [in] substream The sub-stream number.
+     * @param [in] seed The starting seed.
+     * @param [in] stream The stream number.
+     * @param [in] substream The sub-stream number.
      */
     RngStream(uint32_t seed, uint64_t stream, uint64_t substream);
     /**
      * Copy constructor.
      *
-     * \param [in] r The RngStream to copy.
+     * @param [in] r The RngStream to copy.
      */
     RngStream(const RngStream& r);
     /**
      * Generate the next random number for this stream.
      * Uniformly distributed between 0 and 1.
      *
-     * \returns The next random.
+     * @returns The next random.
      */
     double RandU01();
 
@@ -64,9 +64,9 @@
     /**
      * Advance \pname{state} of the RNG by leaps and bounds.
      *
-     * \param [in] nth The stream or substream index.
-     * \param [in] by The log2 base of \pname{nth}.
-     * \param [in] state The state vector to advance.
+     * @param [in] nth The stream or substream index.
+     * @param [in] by The log2 base of \pname{nth}.
+     * @param [in] state The state vector to advance.
      */
     void AdvanceNthBy(uint64_t nth, int by, double state[6]);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/scheduler.cc ns-3.44/src/core/model/scheduler.cc
--- ns-3.43/src/core/model/scheduler.cc	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/scheduler.cc	2025-03-09 16:55:49.363371100 -0700
@@ -12,8 +12,8 @@
 #include "log.h"
 
 /**
- * \file
- * \ingroup scheduler
+ * @file
+ * @ingroup scheduler
  * ns3::Scheduler implementation.
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/scheduler.h ns-3.44/src/core/model/scheduler.h
--- ns-3.43/src/core/model/scheduler.h	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/scheduler.h	2025-03-09 16:55:49.363371100 -0700
@@ -14,9 +14,9 @@
 #include <stdint.h>
 
 /**
- * \file
- * \ingroup scheduler
- * \ingroup events
+ * @file
+ * @ingroup scheduler
+ * @ingroup events
  * ns3::Scheduler abstract base class, ns3::Scheduler::Event and
  * ns3::Scheduler::EventKey declarations.
  */
@@ -27,17 +27,17 @@
 class EventImpl;
 
 /**
- * \ingroup core
- * \defgroup scheduler Scheduler and Events
- * \brief Manage the event list by creating and scheduling events.
+ * @ingroup core
+ * @defgroup scheduler Scheduler and Events
+ * @brief Manage the event list by creating and scheduling events.
  */
 /**
- * \ingroup scheduler
- * \defgroup events Events
+ * @ingroup scheduler
+ * @defgroup events Events
  */
 /**
- * \ingroup scheduler
- * \brief Maintain the event list
+ * @ingroup scheduler
+ * @brief Maintain the event list
  *
  *
  * In ns-3 the Scheduler manages the future event list.  There are several
@@ -147,12 +147,12 @@
   public:
     /**
      * Register this type.
-     * \return The object TypeId.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
     /**
-     * \ingroup events
+     * @ingroup events
      * Structure for sorting and comparing Events.
      */
     struct EventKey
@@ -163,7 +163,7 @@
     };
 
     /**
-     * \ingroup events
+     * @ingroup events
      * Scheduler event.
      *
      * An Event consists of an EventKey, used for maintaining the schedule,
@@ -181,13 +181,13 @@
     /**
      * Insert a new Event in the schedule.
      *
-     * \param [in] ev Event to store in the event list
+     * @param [in] ev Event to store in the event list
      */
     virtual void Insert(const Event& ev) = 0;
     /**
      * Test if the schedule is empty.
      *
-     * \returns \c true if the event list is empty and \c false otherwise.
+     * @returns \c true if the event list is empty and \c false otherwise.
      */
     virtual bool IsEmpty() const = 0;
     /**
@@ -195,7 +195,7 @@
      *
      * This method cannot be invoked if the list is empty.
      *
-     * \returns A pointer to the next earliest event. The caller
+     * @returns A pointer to the next earliest event. The caller
      *      takes ownership of the returned pointer.
      */
     virtual Event PeekNext() const = 0;
@@ -204,7 +204,7 @@
      *
      * This method cannot be invoked if the list is empty.
      *
-     * \return The Event.
+     * @return The Event.
      */
     virtual Event RemoveNext() = 0;
     /**
@@ -212,18 +212,18 @@
      *
      * This method cannot be invoked if the list is empty.
      *
-     * \param [in] ev The event to remove
+     * @param [in] ev The event to remove
      */
     virtual void Remove(const Event& ev) = 0;
 };
 
 /**
- * \ingroup events
+ * @ingroup events
  * Compare (equal) two events by EventKey.
  *
- * \param [in] a The first event.
- * \param [in] b The second event.
- * \returns \c true if \c a != \c b
+ * @param [in] a The first event.
+ * @param [in] b The second event.
+ * @returns \c true if \c a != \c b
  */
 inline bool
 operator==(const Scheduler::EventKey& a, const Scheduler::EventKey& b)
@@ -232,12 +232,12 @@
 }
 
 /**
- * \ingroup events
+ * @ingroup events
  * Compare (not equal) two events by EventKey.
  *
- * \param [in] a The first event.
- * \param [in] b The second event.
- * \returns \c true if \c a != \c b
+ * @param [in] a The first event.
+ * @param [in] b The second event.
+ * @returns \c true if \c a != \c b
  */
 inline bool
 operator!=(const Scheduler::EventKey& a, const Scheduler::EventKey& b)
@@ -246,7 +246,7 @@
 }
 
 /**
- * \ingroup events
+ * @ingroup events
  * Compare (less than) two events by EventKey.
  *
  * Note the invariants which this function must provide:
@@ -254,9 +254,9 @@
  * - antisymmetry: f(x,y) = !f(y,x)
  * - transitivity: f(x,y) and f(y,z) => f(x,z)
  *
- * \param [in] a The first event.
- * \param [in] b The second event.
- * \returns \c true if \c a < \c b
+ * @param [in] a The first event.
+ * @param [in] b The second event.
+ * @returns \c true if \c a < \c b
  */
 inline bool
 operator<(const Scheduler::EventKey& a, const Scheduler::EventKey& b)
@@ -267,9 +267,9 @@
 /**
  * Compare (greater than) two events by EventKey.
  *
- * \param [in] a The first event.
- * \param [in] b The second event.
- * \returns \c true if \c a > \c b
+ * @param [in] a The first event.
+ * @param [in] b The second event.
+ * @returns \c true if \c a > \c b
  */
 inline bool
 operator>(const Scheduler::EventKey& a, const Scheduler::EventKey& b)
@@ -280,9 +280,9 @@
 /**
  * Compare (equal) two events by Event.
  *
- * \param [in] a The first event.
- * \param [in] b The second event.
- * \returns \c true if \c a == \c b
+ * @param [in] a The first event.
+ * @param [in] b The second event.
+ * @returns \c true if \c a == \c b
  */
 inline bool
 operator==(const Scheduler::Event& a, const Scheduler::Event& b)
@@ -293,9 +293,9 @@
 /**
  * Compare (not equal) two events by Event.
  *
- * \param [in] a The first event.
- * \param [in] b The second event.
- * \returns \c true if \c a != \c b
+ * @param [in] a The first event.
+ * @param [in] b The second event.
+ * @returns \c true if \c a != \c b
  */
 inline bool
 operator!=(const Scheduler::Event& a, const Scheduler::Event& b)
@@ -306,9 +306,9 @@
 /**
  * Compare (less than) two events by Event.
  *
- * \param [in] a The first event.
- * \param [in] b The second event.
- * \returns \c true if \c a < \c b
+ * @param [in] a The first event.
+ * @param [in] b The second event.
+ * @returns \c true if \c a < \c b
  */
 inline bool
 operator<(const Scheduler::Event& a, const Scheduler::Event& b)
@@ -319,9 +319,9 @@
 /**
  * Compare (greater than) two events by Event.
  *
- * \param [in] a The first event.
- * \param [in] b The second event.
- * \returns \c true if \c a > \c b
+ * @param [in] a The first event.
+ * @param [in] b The second event.
+ * @returns \c true if \c a > \c b
  */
 inline bool
 operator>(const Scheduler::Event& a, const Scheduler::Event& b)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/show-progress.cc ns-3.44/src/core/model/show-progress.cc
--- ns-3.43/src/core/model/show-progress.cc	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/show-progress.cc	2025-03-09 16:55:49.363371100 -0700
@@ -8,8 +8,8 @@
  */
 
 /**
- * \file
- * \ingroup core
+ * @file
+ * @ingroup core
  * ns3::ShowProgress implementation.
  */
 
@@ -142,7 +142,7 @@
     NS_LOG_FUNCTION(this << m_elapsed);
 
     // Don't do anything unless the elapsed time is positive.
-    if (m_elapsed <= Time(0))
+    if (m_elapsed.IsNegative())
     {
         m_vtime = m_vtime * MAXGAIN;
         ++m_repCount;
@@ -161,7 +161,7 @@
     uint64_t events = Simulator::GetEventCount();
     uint64_t nEvents = events - m_eventCount;
     /**
-     * \internal Update algorithm
+     * @internal Update algorithm
      *
      * We steer \c m_vtime to obtain updates approximately every
      * \c m_interval in wall clock time.  To smooth things out a little
@@ -176,7 +176,7 @@
      *
      * Graphically, the windows in ratio value and the corresponding
      * updates to \c m_vtime are sketched in this figure:
-     * \verbatim
+     * @verbatim
                         ^
                         |
                 ratio   |   vtime update
@@ -215,7 +215,7 @@
      * half the ratio.  This reduces "hunting" for a stable update
      * period.
      *
-     * \todo Evaluate if simple exponential averaging would be
+     * @todo Evaluate if simple exponential averaging would be
      * more effective, simpler.
      */
     if (ratio > HYSTERESIS)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/show-progress.h ns-3.44/src/core/model/show-progress.h
--- ns-3.43/src/core/model/show-progress.h	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/show-progress.h	2025-03-09 16:55:49.363371100 -0700
@@ -11,8 +11,8 @@
 #define SHOW_PROGRESS_H
 
 /**
- * \file
- * \ingroup core
+ * @file
+ * @ingroup core
  * ns3::ShowProgress declaration.
  */
 
@@ -28,8 +28,8 @@
 {
 
 /**
- * \ingroup core
- * \ingroup debugging
+ * @ingroup core
+ * @ingroup debugging
  *
  * Periodically print a status message indicating simulator progress.
  *
@@ -46,7 +46,7 @@
  *
  * Example usage:
  *
- * \code
+ * @code
  *     int main (int arg, char ** argv)
  *     {
  *       // Create your model
@@ -55,11 +55,11 @@
  *       Simulator::Run ();
  *       Simulator::Destroy ();
  *     }
- * \endcode
+ * @endcode
  *
  * This generates output similar to the following:
  *
- * \code
+ * @code
  *     Start wall clock: Tue May 19 10:24:07 2020
  *     +17.179869183s (   4.937x real time) 29559 events processed
  *     +25.769803775s (   4.965x real time) 45179 events processed
@@ -70,7 +70,7 @@
  *     +194.339562435s (  12.776x real time) 30957 events processed
  *     End wall clock:  Tue May 19 10:24:23 2020
  *     Elapsed wall clock: 16s
- * \endcode
+ * @endcode
  *
  * A more extensive example of use is provided in sample-show-progress.cc.
  *
@@ -84,17 +84,17 @@
   public:
     /**
      * Constructor.
-     * \param [in] interval The target wallclock interval to show progress.
-     * \param [in] os The stream to print on.
+     * @param [in] interval The target wallclock interval to show progress.
+     * @param [in] os The stream to print on.
      */
-    ShowProgress(const Time interval = Seconds(1.0), std::ostream& os = std::cout);
+    ShowProgress(const Time interval = Seconds(1), std::ostream& os = std::cout);
 
     /** Destructor. */
     ~ShowProgress();
 
     /**
      * Set the target update interval, in wallclock time.
-     * \param [in] interval The target wallclock interval to show progress.
+     * @param [in] interval The target wallclock interval to show progress.
      */
     void SetInterval(const Time interval);
 
@@ -104,20 +104,20 @@
      *
      * The default is DefaultTimePrinter().
      *
-     * \param [in] lp The TimePrinter function.
+     * @param [in] lp The TimePrinter function.
      */
     void SetTimePrinter(TimePrinter lp);
 
     /**
      * Set the output stream to show progress on.
-     * \param [in] os The output stream; defaults to std::cerr.
+     * @param [in] os The output stream; defaults to std::cerr.
      */
     void SetStream(std::ostream& os);
 
     /**
      * Set verbose mode to print real and virtual time intervals.
      *
-     * \param [in] verbose \c true to turn on verbose mode
+     * @param [in] verbose \c true to turn on verbose mode
      */
     void SetVerbose(bool verbose);
 
@@ -150,22 +150,22 @@
     /**
      * Show execution progress.
      * This function actually generates output, when directed by CheckProgress().
-     * \param [in] nEvents The actual number of events processed since the last
+     * @param [in] nEvents The actual number of events processed since the last
      *             progress output.
-     * \param [in] ratio The current ratio of elapsed wall clock time to the
+     * @param [in] ratio The current ratio of elapsed wall clock time to the
      *             target update interval.
-     * \param [in] speed The execution speed relative to wall clock time.
+     * @param [in] speed The execution speed relative to wall clock time.
      */
     void GiveFeedback(uint64_t nEvents, int64x64_t ratio, int64x64_t speed);
 
     /**
      * Hysteresis factor.
-     * \see Feedback()
+     * @see Feedback()
      */
     static const int64x64_t HYSTERESIS;
     /**
      * Maximum growth factor.
-     * \see Feedback()
+     * @see Feedback()
      */
     static const int64x64_t MAXGAIN;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/shuffle.h ns-3.44/src/core/model/shuffle.h
--- ns-3.43/src/core/model/shuffle.h	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/shuffle.h	2025-03-09 16:55:49.363371100 -0700
@@ -10,8 +10,8 @@
 #define SHUFFLE_H
 
 /**
- * \file
- * \ingroup randomvariable
+ * @file
+ * @ingroup randomvariable
  * Function to shuffle elements in a given range.
  */
 
@@ -38,10 +38,10 @@
  * we can still achieve a linear complexity by copying the elements in a vector and shuffling the
  * elements of the vector.
  *
- * \tparam RND_ACCESS_ITER \deduced the iterator type (must be a random access iterator)
- * \param first an iterator pointing to the first element in the range to shuffle
- * \param last an iterator pointing to past-the-last element in the range to shuffle
- * \param rv pointer to a uniform random variable
+ * @tparam RND_ACCESS_ITER \deduced the iterator type (must be a random access iterator)
+ * @param first an iterator pointing to the first element in the range to shuffle
+ * @param last an iterator pointing to past-the-last element in the range to shuffle
+ * @param rv pointer to a uniform random variable
  */
 template <typename RND_ACCESS_ITER>
 void
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/simple-ref-count.h ns-3.44/src/core/model/simple-ref-count.h
--- ns-3.43/src/core/model/simple-ref-count.h	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/simple-ref-count.h	2025-03-09 16:55:49.363371100 -0700
@@ -17,8 +17,8 @@
 #include <stdint.h>
 
 /**
- * \file
- * \ingroup ptr
+ * @file
+ * @ingroup ptr
  * ns3::SimpleRefCount declaration and template implementation.
  */
 
@@ -26,22 +26,22 @@
 {
 
 /**
- * \ingroup ptr
- * \brief Empty class, used as a default parent class for SimpleRefCount
+ * @ingroup ptr
+ * @brief Empty class, used as a default parent class for SimpleRefCount
  */
 class Empty
 {
 };
 
 /**
- * \ingroup ptr
- * \brief A template-based reference counting class
+ * @ingroup ptr
+ * @brief A template-based reference counting class
  *
  * This template can be used to give reference-counting powers
  * to a class. This template does not require this class to
  * have a virtual destructor or a specific (or any) parent class.
  *
- * \note If you are moving to this template from the RefCountBase class,
+ * @note If you are moving to this template from the RefCountBase class,
  * you need to be careful to mark appropriately your destructor virtual
  * if needed. i.e., if your class has subclasses, _do_ mark your destructor
  * virtual.
@@ -50,15 +50,15 @@
  * This template takes 3 arguments but only the first argument is
  * mandatory:
  *
- * \tparam T \explicit The typename of the subclass which derives
+ * @tparam T \explicit The typename of the subclass which derives
  *      from this template class. Yes, this is weird but it's a
  *      common C++ template pattern whose name is CRTP (Curiously
  *      Recursive Template Pattern)
- * \tparam PARENT \explicit The typename of the parent of this template.
+ * @tparam PARENT \explicit The typename of the parent of this template.
  *      By default, this typename is "'ns3::Empty'" which is an empty
  *      class: compilers which implement the EBCO optimization (empty
  *      base class optimization) will make this a no-op
- * \tparam DELETER \explicit The typename of a class which implements
+ * @tparam DELETER \explicit The typename of a class which implements
  *      a public static method named 'Delete'. This method will be called
  *      whenever the SimpleRefCount template detects that no references
  *      to the object it manages exist anymore.
@@ -77,7 +77,7 @@
 
     /**
      * Copy constructor
-     * \param [in] o The object to copy into this one.
+     * @param [in] o The object to copy into this one.
      */
     SimpleRefCount(const SimpleRefCount& o [[maybe_unused]])
         : m_count(1)
@@ -86,8 +86,8 @@
 
     /**
      * Assignment operator
-     * \param [in] o The object to copy
-     * \returns The copy of \pname{o}
+     * @param [in] o The object to copy
+     * @returns The copy of \pname{o}
      */
     SimpleRefCount& operator=(const SimpleRefCount& o [[maybe_unused]])
     {
@@ -125,7 +125,7 @@
      * Get the reference count of the object.
      * Normally not needed; for language bindings.
      *
-     * \return The reference count.
+     * @return The reference count.
      */
     inline uint32_t GetReferenceCount() const
     {
@@ -136,7 +136,7 @@
     /**
      * The reference count.
      *
-     * \internal
+     * @internal
      * Note we make this mutable so that the const methods can still
      * change it.
      */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/simulation-singleton.h ns-3.44/src/core/model/simulation-singleton.h
--- ns-3.43/src/core/model/simulation-singleton.h	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/simulation-singleton.h	2025-03-09 16:55:49.363371100 -0700
@@ -9,8 +9,8 @@
 #define SIMULATION_SINGLETON_H
 
 /**
- * \file
- * \ingroup singleton
+ * @file
+ * @ingroup singleton
  * ns3::SimulationSingleton declaration and template implementation.
  */
 
@@ -18,7 +18,7 @@
 {
 
 /**
- * \ingroup singleton
+ * @ingroup singleton
  * This singleton class template ensures that the type
  * for which we want a singleton has a lifetime bounded
  * by the simulation run lifetime. That it, the underlying
@@ -43,7 +43,7 @@
      * This instance will be automatically deleted when the
      * simulation is destroyed by a call to Simulator::Destroy.
      *
-     * \returns A pointer to the singleton instance.
+     * @returns A pointer to the singleton instance.
      */
     static T* Get();
 
@@ -51,11 +51,11 @@
     /**
      * Get the singleton object, creating a new one if it doesn't exist yet.
      *
-     * \internal
+     * @internal
      * When a new object is created, this method schedules it's own
      * destruction using Simulator::ScheduleDestroy().
      *
-     * \returns The address of the pointer holding the static instance.
+     * @returns The address of the pointer holding the static instance.
      */
     static T** GetObject();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/simulator.cc ns-3.44/src/core/model/simulator.cc
--- ns-3.43/src/core/model/simulator.cc	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/simulator.cc	2025-03-09 16:55:49.363371100 -0700
@@ -29,8 +29,8 @@
 #include <vector>
 
 /**
- * \file
- * \ingroup simulator
+ * @file
+ * @ingroup simulator
  * ns3::Simulator implementation, as well as implementation pointer,
  * global scheduler implementation.
  */
@@ -46,8 +46,8 @@
 EventId Simulator::m_stopEvent;
 
 /**
- * \ingroup simulator
- * \anchor GlobalValueSimulatorImplementationType
+ * @ingroup simulator
+ * @anchor GlobalValueSimulatorImplementationType
  * The specific simulator implementation to use.
  *
  * Must be derived from SimulatorImpl.
@@ -59,8 +59,8 @@
                 MakeStringChecker());
 
 /**
- * \ingroup scheduler
- * \anchor GlobalValueSchedulerType
+ * @ingroup scheduler
+ * @anchor GlobalValueSchedulerType
  * The specific event scheduler implementation to use.
  *
  * Must be derived from Scheduler.
@@ -72,9 +72,9 @@
                 MakeTypeIdChecker());
 
 /**
- * \ingroup simulator
- * \brief Get the static SimulatorImpl instance.
- * \return The SimulatorImpl instance pointer.
+ * @ingroup simulator
+ * @brief Get the static SimulatorImpl instance.
+ * @return The SimulatorImpl instance pointer.
  */
 static SimulatorImpl**
 PeekImpl()
@@ -84,10 +84,10 @@
 }
 
 /**
- * \ingroup simulator
- * \brief Get the SimulatorImpl singleton.
- * \return The singleton pointer.
- * \see Simulator::GetImplementation()
+ * @ingroup simulator
+ * @brief Get the SimulatorImpl singleton.
+ * @return The singleton pointer.
+ * @see Simulator::GetImplementation()
  */
 static SimulatorImpl*
 GetImpl()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/simulator.h ns-3.44/src/core/model/simulator.h
--- ns-3.43/src/core/model/simulator.h	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/simulator.h	2025-03-09 16:55:49.363371100 -0700
@@ -187,7 +187,7 @@
     /**
      * Context enum values.
      *
-     * \internal
+     * @internal
      * This enum type is fixed to match the representation size
      * of simulation context.
      */
@@ -201,7 +201,7 @@
 
     /**
      * Get the number of events executed.
-     * \returns The total number of events executed.
+     * @returns The total number of events executed.
      */
     static uint64_t GetEventCount();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/simulator-impl.cc ns-3.44/src/core/model/simulator-impl.cc
--- ns-3.43/src/core/model/simulator-impl.cc	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/simulator-impl.cc	2025-03-09 16:55:49.363371100 -0700
@@ -10,8 +10,8 @@
 #include "log.h"
 
 /**
- * \file
- * \ingroup simulator
+ * @file
+ * @ingroup simulator
  * ns3::SimulatorImpl implementation.
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/simulator-impl.h ns-3.44/src/core/model/simulator-impl.h
--- ns-3.43/src/core/model/simulator-impl.h	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/simulator-impl.h	2025-03-09 16:55:49.363371100 -0700
@@ -17,8 +17,8 @@
 #include "ptr.h"
 
 /**
- * \file
- * \ingroup simulator
+ * @file
+ * @ingroup simulator
  * ns3::SimulatorImpl declaration.
  */
 
@@ -28,74 +28,76 @@
 class Scheduler;
 
 /**
- * \ingroup simulator
+ * @ingroup simulator
  *
  * The SimulatorImpl base class.
  *
- * \todo Define what the simulation or event context means.
+ * @todo Define what the simulation or event context means.
  */
 class SimulatorImpl : public Object
 {
   public:
     /**
      * Get the registered TypeId for this class.
-     * \return The object TypeId.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
-    /** \copydoc Simulator::Destroy */
+    /** @copydoc Simulator::Destroy */
     virtual void Destroy() = 0;
-    /** \copydoc Simulator::IsFinished */
+    /** @copydoc Simulator::IsFinished */
     virtual bool IsFinished() const = 0;
-    /** \copydoc Simulator::Stop() */
+    /** @copydoc Simulator::Stop() */
     virtual void Stop() = 0;
-    /** \copydoc Simulator::Stop(const Time&) */
+    /** @copydoc Simulator::Stop(const Time&) */
     virtual EventId Stop(const Time& delay) = 0;
-    /** \copydoc Simulator::Schedule(const Time&,const Ptr<EventImpl>&) */
+    /** @copydoc Simulator::Schedule(const Time&,const Ptr<EventImpl>&) */
     virtual EventId Schedule(const Time& delay, EventImpl* event) = 0;
-    /** \copydoc Simulator::ScheduleWithContext(uint32_t,const Time&,EventImpl*) */
+    /** @copydoc Simulator::ScheduleWithContext(uint32_t,const Time&,EventImpl*) */
     virtual void ScheduleWithContext(uint32_t context, const Time& delay, EventImpl* event) = 0;
-    /** \copydoc Simulator::ScheduleNow(const Ptr<EventImpl>&) */
+    /** @copydoc Simulator::ScheduleNow(const Ptr<EventImpl>&) */
     virtual EventId ScheduleNow(EventImpl* event) = 0;
-    /** \copydoc Simulator::ScheduleDestroy(const Ptr<EventImpl>&) */
+    /** @copydoc Simulator::ScheduleDestroy(const Ptr<EventImpl>&) */
     virtual EventId ScheduleDestroy(EventImpl* event) = 0;
-    /** \copydoc Simulator::Remove */
+    /** @copydoc Simulator::Remove */
     virtual void Remove(const EventId& id) = 0;
-    /** \copydoc Simulator::Cancel */
+    /** @copydoc Simulator::Cancel */
     virtual void Cancel(const EventId& id) = 0;
-    /** \copydoc Simulator::IsExpired */
+    /** @copydoc Simulator::IsExpired */
     virtual bool IsExpired(const EventId& id) const = 0;
-    /** \copydoc Simulator::Run */
+    /** @copydoc Simulator::Run */
     virtual void Run() = 0;
-    /** \copydoc Simulator::Now */
+    /** @copydoc Simulator::Now */
     virtual Time Now() const = 0;
-    /** \copydoc Simulator::GetDelayLeft */
+    /** @copydoc Simulator::GetDelayLeft */
     virtual Time GetDelayLeft(const EventId& id) const = 0;
-    /** \copydoc Simulator::GetMaximumSimulationTime */
+    /** @copydoc Simulator::GetMaximumSimulationTime */
     virtual Time GetMaximumSimulationTime() const = 0;
     /**
      * Set the Scheduler to be used to manage the event list.
      *
-     * \param [in] schedulerFactory A new event scheduler factory.
+     * @param [in] schedulerFactory A new event scheduler factory.
      *
      * The event scheduler can be set at any time: the events scheduled
      * in the previous scheduler will be transferred to the new scheduler
      * before we start to use it.
      */
     virtual void SetScheduler(ObjectFactory schedulerFactory) = 0;
-    /** \copydoc Simulator::GetSystemId */
+    /** @copydoc Simulator::GetSystemId */
     virtual uint32_t GetSystemId() const = 0;
-    /** \copydoc Simulator::GetContext */
+    /** @copydoc Simulator::GetContext */
     virtual uint32_t GetContext() const = 0;
-    /** \copydoc Simulator::GetEventCount */
+    /** @copydoc Simulator::GetEventCount */
     virtual uint64_t GetEventCount() const = 0;
 
     /**
      * Hook called before processing each event.
      *
-     * \param [in] id The event about to be processed.
+     * @param [in] id The event about to be processed.
      */
-    virtual void PreEventHook(const EventId& id){};
+    virtual void PreEventHook(const EventId& id)
+    {
+    }
 };
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/singleton.h ns-3.44/src/core/model/singleton.h
--- ns-3.43/src/core/model/singleton.h	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/singleton.h	2025-03-09 16:55:49.363371100 -0700
@@ -9,8 +9,8 @@
 #define SINGLETON_H
 
 /**
- * \file
- * \ingroup singleton
+ * @file
+ * @ingroup singleton
  * ns3::Singleton declaration and template implementation.
  */
 
@@ -18,15 +18,15 @@
 {
 
 /**
- * \ingroup core
- * \defgroup singleton Singleton
+ * @ingroup core
+ * @defgroup singleton Singleton
  *
  * Template class implementing the Singleton design pattern.
  */
 
 /**
- * \ingroup singleton
- * \brief A template singleton
+ * @ingroup singleton
+ * @brief A template singleton
  *
  * This template class can be used to implement the singleton pattern.
  * The underlying object will be destroyed automatically when the process
@@ -36,16 +36,16 @@
  * not the process, see SimulationSingleton.
  *
  * To force your `class ExampleS` to be a singleton, inherit from Singleton:
- * \code
+ * @code
  *   class ExampleS : public Singleton<ExampleS> { ... };
- * \endcode
+ * @endcode
  *
  * Then, to reach the singleton instance, just do
- * \code
+ * @code
  *   ExampleS::Get ()->...;
- * \endcode
+ * @endcode
  *
- * \note
+ * @note
  * If you call Get() again after the object has
  * been destroyed, the object will be re-created which will result in a
  * memory leak as reported by most memory leak checkers. It is up to the
@@ -66,7 +66,7 @@
      * The instance will be automatically deleted when
      * the process exits.
      *
-     * \return A pointer to the singleton instance.
+     * @return A pointer to the singleton instance.
      */
     static T* Get();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/string.cc ns-3.44/src/core/model/string.cc
--- ns-3.43/src/core/model/string.cc	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/string.cc	2025-03-09 16:55:49.363371100 -0700
@@ -8,8 +8,8 @@
 #include "string.h"
 
 /**
- * \file
- * \ingroup attribute_String
+ * @file
+ * @ingroup attribute_String
  * ns3::StringValue attribute value implementation.
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/string.h ns-3.44/src/core/model/string.h
--- ns-3.43/src/core/model/string.h	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/string.h	2025-03-09 16:55:49.363371100 -0700
@@ -14,8 +14,8 @@
 #include <vector>
 
 /**
- * \file
- * \ingroup attribute_String
+ * @file
+ * @ingroup attribute_String
  * ns3::StringValue attribute value declarations.
  */
 
@@ -28,9 +28,9 @@
 /**
  * Split a string on a delimiter.
  * The input string is ummodified.
- * \param [in] str The string.
- * \param [in] delim The delimiter.
- * \returns A vector of the components of \p str which were separated
+ * @param [in] str The string.
+ * @param [in] delim The delimiter.
+ * @returns A vector of the components of \p str which were separated
  * by \p delim.
  */
 StringVector SplitString(const std::string& str, const std::string& delim);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/synchronizer.cc ns-3.44/src/core/model/synchronizer.cc
--- ns-3.43/src/core/model/synchronizer.cc	2024-10-09 16:41:09.860655800 -0700
+++ ns-3.44/src/core/model/synchronizer.cc	2025-03-09 16:55:49.363371100 -0700
@@ -9,8 +9,8 @@
 #include "log.h"
 
 /**
- * \file
- * \ingroup realtime
+ * @file
+ * @ingroup realtime
  * ns3::Synchronizer implementation.
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/system-path.cc ns-3.44/src/core/model/system-path.cc
--- ns-3.43/src/core/model/system-path.cc	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/model/system-path.cc	2025-03-09 16:55:49.363371100 -0700
@@ -50,8 +50,8 @@
 #endif
 
 /**
- * \file
- * \ingroup systempath
+ * @file
+ * @ingroup systempath
  * ns3::SystemPath implementation.
  */
 
@@ -64,11 +64,11 @@
 namespace
 {
 /**
- * \ingroup systempath
+ * @ingroup systempath
  * Get the list of files located in a file system directory with error.
  *
- * \param [in] path A path which identifies a directory
- * \return Tuple with a list of the filenames which are located in the input directory or error flag
+ * @param [in] path A path which identifies a directory
+ * @return Tuple with a list of the filenames which are located in the input directory or error flag
  * \c true if directory doesn't exist.
  */
 std::tuple<std::list<std::string>, bool>
@@ -96,14 +96,14 @@
 {
 
 /**
- * \ingroup systempath
- * \brief Get the directory path for a file.
+ * @ingroup systempath
+ * @brief Get the directory path for a file.
  *
  * This is an internal function (by virtue of not being
  * declared in a \c .h file); the public API is FindSelfDirectory().
  *
- * \param [in] path The full path to a file.
- * \returns The full path to the containing directory.
+ * @param [in] path The full path to a file.
+ * @returns The full path to the containing directory.
  */
 std::string
 Dirname(std::string path)
@@ -351,7 +351,7 @@
 
     // Check if the file itself exists
     auto tokens = Split(path);
-    std::string file = tokens.back();
+    const std::string& file = tokens.back();
 
     if (file.empty())
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/system-path.h ns-3.44/src/core/model/system-path.h
--- ns-3.43/src/core/model/system-path.h	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/model/system-path.h	2025-03-09 16:55:49.363371100 -0700
@@ -12,8 +12,8 @@
 #include <string>
 
 /**
- * \file
- * \ingroup systempath
+ * @file
+ * @ingroup systempath
  * ns3::SystemPath declarations.
  */
 
@@ -21,9 +21,9 @@
 {
 
 /**
- * \ingroup system
- * \defgroup systempath Host Filesystem
- * \brief Encapsulate OS-specific functions to manipulate file
+ * @ingroup system
+ * @defgroup systempath Host Filesystem
+ * @brief Encapsulate OS-specific functions to manipulate file
  * and directory paths.
  *
  * The functions provided here are used mostly to implement
@@ -31,42 +31,42 @@
  */
 
 /**
- * \ingroup systempath
- * \brief Namespace for various file and directory path functions.
+ * @ingroup systempath
+ * @brief Namespace for various file and directory path functions.
  */
 namespace SystemPath
 {
 
 /**
- * \ingroup systempath
+ * @ingroup systempath
  * Get the file system path to the current executable.
  *
  * This path is only equivalent to the current working directory when
  * the executable is executed in its parent directory.
  *
- * \return The directory in which the currently-executing binary is located
+ * @return The directory in which the currently-executing binary is located
  */
 std::string FindSelfDirectory();
 
 /**
- * \ingroup systempath
+ * @ingroup systempath
  * Join two file system path elements.
  *
- * \param [in] left A path element
- * \param [in] right A path element
- * \return A concatenation of the two input paths
+ * @param [in] left A path element
+ * @param [in] right A path element
+ * @return A concatenation of the two input paths
  */
 std::string Append(std::string left, std::string right);
 
 /**
- * \ingroup systempath
+ * @ingroup systempath
  * Split a file system path into directories according to
  * the local path separator.
  *
  * This is the inverse of Join.
  *
- * \param [in] path A path
- * \return A list of path elements that can be joined together again with
+ * @param [in] path A path
+ * @return A list of path elements that can be joined together again with
  *         the Join function.
  * \sa ns3::SystemPath::Join
  */
@@ -78,25 +78,25 @@
  *
  * This is the inverse of Split.
  *
- * \ingroup systempath
- * \param [in] begin Iterator to first element to join
- * \param [in] end Iterator to one past the last element to join
- * \return A path that is a concatenation of all the input elements.
+ * @ingroup systempath
+ * @param [in] begin Iterator to first element to join
+ * @param [in] end Iterator to one past the last element to join
+ * @return A path that is a concatenation of all the input elements.
  */
 std::string Join(std::list<std::string>::const_iterator begin,
                  std::list<std::string>::const_iterator end);
 
 /**
- * \ingroup systempath
+ * @ingroup systempath
  * Get the list of files located in a file system directory.
  *
- * \param [in] path A path which identifies a directory
- * \return A list of the filenames which are located in the input directory
+ * @param [in] path A path which identifies a directory
+ * @return A list of the filenames which are located in the input directory
  */
 std::list<std::string> ReadFiles(std::string path);
 
 /**
- * \ingroup systempath
+ * @ingroup systempath
  * Get the name of a temporary directory.
  *
  * The returned path identifies a directory which does not exist yet.
@@ -119,34 +119,34 @@
  *
  * The final number is randomly generated, to avoid name collisions.
  *
- * \return A path which identifies a temporary directory.
+ * @return A path which identifies a temporary directory.
  */
 std::string MakeTemporaryDirectoryName();
 
 /**
- * \ingroup systempath
+ * @ingroup systempath
  * Create all the directories leading to path.
  *
- * \param [in] path A path to a directory
+ * @param [in] path A path to a directory
  */
 void MakeDirectories(std::string path);
 
 /**
- * \ingroup systempath
+ * @ingroup systempath
  * Check if a path exists.
  * Path can be a file or directory.
- * \param [in] path The path to check.
- * \returns \c true if the \pname{path} exists.
+ * @param [in] path The path to check.
+ * @returns \c true if the \pname{path} exists.
  */
 bool Exists(const std::string path);
 
 /**
- * \ingroup systempath
+ * @ingroup systempath
  * Replace incompatible characters in a path,
  * to get a path compatible with different
  * file systems.
- * \param [in] path The path to check.
- * \returns A compatible path.
+ * @param [in] path The path to check.
+ * @returns A compatible path.
  */
 std::string CreateValidSystemPath(const std::string path);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/system-wall-clock-ms.cc ns-3.44/src/core/model/system-wall-clock-ms.cc
--- ns-3.43/src/core/model/system-wall-clock-ms.cc	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/model/system-wall-clock-ms.cc	2025-03-09 16:55:49.363371100 -0700
@@ -13,8 +13,8 @@
 #include <chrono>
 
 /**
- * \file
- * \ingroup system
+ * @file
+ * @ingroup system
  * ns3::SystemWallClockMs and ns3::SystemWallClockMsPrivate implementation.
  */
 
@@ -24,21 +24,21 @@
 NS_LOG_COMPONENT_DEFINE("SystemWallClockMs");
 
 /**
- * \ingroup system
- * \brief System-dependent implementation for SystemWallClockMs
+ * @ingroup system
+ * @brief System-dependent implementation for SystemWallClockMs
  */
 class SystemWallClockMsPrivate
 {
   public:
-    /** \copydoc SystemWallClockMs::Start() */
+    /** @copydoc SystemWallClockMs::Start() */
     void Start();
-    /** \copydoc SystemWallClockMs::End() */
+    /** @copydoc SystemWallClockMs::End() */
     int64_t End();
-    /** \copydoc SystemWallClockMs::GetElapsedReal() */
+    /** @copydoc SystemWallClockMs::GetElapsedReal() */
     int64_t GetElapsedReal() const;
-    /** \copydoc SystemWallClockMs::GetElapsedUser() */
+    /** @copydoc SystemWallClockMs::GetElapsedUser() */
     int64_t GetElapsedUser() const;
-    /** \copydoc SystemWallClockMs::GetElapsedSystem() */
+    /** @copydoc SystemWallClockMs::GetElapsedSystem() */
     int64_t GetElapsedSystem() const;
 
   private:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/system-wall-clock-ms.h ns-3.44/src/core/model/system-wall-clock-ms.h
--- ns-3.43/src/core/model/system-wall-clock-ms.h	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/model/system-wall-clock-ms.h	2025-03-09 16:55:49.363371100 -0700
@@ -12,8 +12,8 @@
 #include <stdint.h>
 
 /**
- * \file
- * \ingroup system
+ * @file
+ * @ingroup system
  * ns3::SystemWallClockMs declaration.
  */
 
@@ -21,8 +21,8 @@
 {
 
 /**
- * \ingroup system
- * \brief Measure elapsed wall clock time in milliseconds.
+ * @ingroup system
+ * @brief Measure elapsed wall clock time in milliseconds.
  */
 class SystemWallClockMs
 {
@@ -35,8 +35,8 @@
      */
     void Start();
     /**
-     * \brief Stop measuring the time since Start() was called.
-     * \returns the measured elapsed wall clock time (in milliseconds) since
+     * @brief Stop measuring the time since Start() was called.
+     * @returns the measured elapsed wall clock time (in milliseconds) since
      *          Start() was invoked.
      *
      * It is possible to start a new measurement with Start() after
@@ -47,21 +47,21 @@
     int64_t End();
 
     /**
-     * \returns the measured elapsed wall clock time (in milliseconds) since
+     * @returns the measured elapsed wall clock time (in milliseconds) since
      *          Start() was invoked.
      *
      * Returns \c int64_t to avoid dependency on \c clock_t in ns-3 code.
      */
     int64_t GetElapsedReal() const;
     /**
-     * \returns the measured elapsed 'user' wall clock time (in milliseconds)
+     * @returns the measured elapsed 'user' wall clock time (in milliseconds)
      *          since Start() was invoked.
      *
      * Returns \c int64_t to avoid dependency on \c clock_t in ns-3 code.
      */
     int64_t GetElapsedUser() const;
     /**
-     * \returns the measured elapsed 'system' wall clock time (in milliseconds)
+     * @returns the measured elapsed 'system' wall clock time (in milliseconds)
      *          since Start() was invoked.
      *
      * Returns \c int64_t to avoid dependency on \c clock_t in ns-3 code.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/system-wall-clock-timestamp.cc ns-3.44/src/core/model/system-wall-clock-timestamp.cc
--- ns-3.43/src/core/model/system-wall-clock-timestamp.cc	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/model/system-wall-clock-timestamp.cc	2025-03-09 16:55:49.363371100 -0700
@@ -9,8 +9,8 @@
 #include "system-wall-clock-timestamp.h"
 
 /**
- * \file
- * \ingroup system
+ * @file
+ * @ingroup system
  * ns3::SystemWallClockTimestamp implementation.
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/system-wall-clock-timestamp.h ns-3.44/src/core/model/system-wall-clock-timestamp.h
--- ns-3.43/src/core/model/system-wall-clock-timestamp.h	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/model/system-wall-clock-timestamp.h	2025-03-09 16:55:49.363371100 -0700
@@ -10,8 +10,8 @@
 #define SYSTEM_WALL_CLOCK_TIMESTAMP_H
 
 /**
- * \file
- * \ingroup system
+ * @file
+ * @ingroup system
  * ns3::SystemWallClockTimestamp declaration.
  */
 
@@ -35,19 +35,19 @@
 
     /**
      * Get the last time stamp as a string.
-     * \return The last time stamp.
+     * @return The last time stamp.
      */
     std::string ToString() const;
 
     /**
      * Get the last recorded raw value.
-     * \returns The last time stamp recorded.
+     * @returns The last time stamp recorded.
      */
     std::time_t GetLast() const;
 
     /**
      * Get the last recorded interval.
-     * \returns The interval between the last two time stamps.
+     * @returns The interval between the last two time stamps.
      */
     std::time_t GetInterval() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/test.cc ns-3.44/src/core/model/test.cc
--- ns-3.43/src/core/model/test.cc	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/model/test.cc	2025-03-09 16:55:49.363371100 -0700
@@ -22,9 +22,9 @@
 #include <vector>
 
 /**
- * \file
- * \ingroup testing
- * \brief ns3::TestCase, ns3::TestSuite, ns3::TestRunner implementations,
+ * @file
+ * @ingroup testing
+ * @brief ns3::TestCase, ns3::TestSuite, ns3::TestRunner implementations,
  */
 
 namespace ns3
@@ -58,7 +58,7 @@
 }
 
 /**
- * \ingroup testingimpl
+ * @ingroup testingimpl
  * Container for details of a test failure.
  */
 struct TestCaseFailure
@@ -66,12 +66,12 @@
     /**
      * Constructor.
      *
-     * \param [in] _cond    The name of the condition being tested.
-     * \param [in] _actual  The actual value returned by the test.
-     * \param [in] _limit   The expected value.
-     * \param [in] _message The associated message.
-     * \param [in] _file    The source file.
-     * \param [in] _line    The source line.
+     * @param [in] _cond    The name of the condition being tested.
+     * @param [in] _actual  The actual value returned by the test.
+     * @param [in] _limit   The expected value.
+     * @param [in] _message The associated message.
+     * @param [in] _file    The source file.
+     * @param [in] _line    The source line.
      */
     TestCaseFailure(std::string _cond,
                     std::string _actual,
@@ -90,9 +90,9 @@
 /**
  * Output streamer for TestCaseFailure.
  *
- * \param [in,out] os The output stream.
- * \param [in] failure The TestCaseFailure to print.
- * \returns The stream.
+ * @param [in,out] os The output stream.
+ * @param [in] failure The TestCaseFailure to print.
+ * @returns The stream.
  */
 std::ostream&
 operator<<(std::ostream& os, const TestCaseFailure& failure)
@@ -105,7 +105,7 @@
 }
 
 /**
- * \ingroup testingimpl
+ * @ingroup testingimpl
  * Container for results from a TestCase.
  */
 struct TestCase::Result
@@ -122,9 +122,9 @@
 };
 
 /**
- * \ingroup testingimpl
+ * @ingroup testingimpl
  * Container for all tests.
- * \todo Move TestRunnerImpl to separate file.
+ * @todo Move TestRunnerImpl to separate file.
  */
 class TestRunnerImpl : public Singleton<TestRunnerImpl>
 {
@@ -134,16 +134,16 @@
 
     /**
      * Add a new top-level TestSuite.
-     * \param [in] testSuite The new TestSuite.
+     * @param [in] testSuite The new TestSuite.
      */
     void AddTestSuite(TestSuite* testSuite);
-    /** \copydoc TestCase::MustAssertOnFailure() */
+    /** @copydoc TestCase::MustAssertOnFailure() */
     bool MustAssertOnFailure() const;
-    /** \copydoc TestCase::MustContinueOnFailure() */
+    /** @copydoc TestCase::MustContinueOnFailure() */
     bool MustContinueOnFailure() const;
     /**
      * Check if this run should update the reference data.
-     * \return \c true if we should update the reference data.
+     * @return \c true if we should update the reference data.
      */
     bool MustUpdateData() const;
     /**
@@ -152,22 +152,22 @@
      * The root directory is defined by the presence of two files:
      * "VERSION" and "LICENSE".
      *
-     * \returns The path to the root.
+     * @returns The path to the root.
      */
     std::string GetTopLevelSourceDir() const;
     /**
      * Get the path to temporary directory.
-     * \return The temporary directory path.
+     * @return The temporary directory path.
      */
     std::string GetTempDir() const;
-    /** \copydoc TestRunner::Run() */
+    /** @copydoc TestRunner::Run() */
     int Run(int argc, char* argv[]);
 
   private:
     /**
      * Check if this is the root of the source tree.
-     * \param [in] path The path to test.
-     * \returns \c true if \pname{path} is the root.
+     * @param [in] path The path to test.
+     * @returns \c true if \pname{path} is the root.
      */
     bool IsTopLevelSourceDir(std::string path) const;
     /**
@@ -186,25 +186,25 @@
      *    '"'        | "&39;"
      *    '\'        | "&quot;"
      *
-     * \param [in] xml The raw string.
-     * \returns The sanitized string.
+     * @param [in] xml The raw string.
+     * @returns The sanitized string.
      */
     std::string ReplaceXmlSpecialCharacters(std::string xml) const;
     /**
      * Print the test report.
      *
-     * \param [in] test The TestCase to print.
-     * \param [in,out] os The output stream.
-     * \param [in] xml Generate XML output if \c true.
-     * \param [in] level Indentation level.
+     * @param [in] test The TestCase to print.
+     * @param [in,out] os The output stream.
+     * @param [in] xml Generate XML output if \c true.
+     * @param [in] level Indentation level.
      */
     void PrintReport(TestCase* test, std::ostream* os, bool xml, int level);
     /**
      * Print the list of all requested test suites.
      *
-     * \param [in] begin Iterator to the first TestCase to print.
-     * \param [in] end Iterator to the end of the list.
-     * \param [in] printTestType Prepend the test type label if \c true.
+     * @param [in] begin Iterator to the first TestCase to print.
+     * @param [in] end Iterator to the end of the list.
+     * @param [in] printTestType Prepend the test type label if \c true.
      */
     void PrintTestNameList(std::list<TestCase*>::const_iterator begin,
                            std::list<TestCase*>::const_iterator end,
@@ -213,7 +213,7 @@
     void PrintTestTypeList() const;
     /**
      * Print the help text.
-     * \param [in] programName The name of the invoking program.
+     * @param [in] programName The name of the invoking program.
      */
     void PrintHelp(const char* programName) const;
     /**
@@ -222,10 +222,10 @@
      * Test name and type constraints are or'ed.  The duration constraint
      * is and'ed.
      *
-     * \param [in] testName Include a specific test by name.
-     * \param [in] testType Include all tests of give type.
-     * \param [in] maximumTestDuration Restrict to tests shorter than this.
-     * \returns The list of tests matching the filter constraints.
+     * @param [in] testName Include a specific test by name.
+     * @param [in] testType Include all tests of give type.
+     * @param [in] maximumTestDuration Restrict to tests shorter than this.
+     * @returns The list of tests matching the filter constraints.
      */
     std::list<TestCase*> FilterTests(std::string testName,
                                      TestSuite::Type testType,
@@ -642,7 +642,7 @@
 {
     /**
      * Constructor.
-     * \param [in] level The number of steps.  A step is "  ".
+     * @param [in] level The number of steps.  A step is "  ".
      */
     Indent(int level);
     /** The number of steps. */
@@ -657,9 +657,9 @@
 
 /**
  * Output streamer for Indent.
- * \param [in,out] os The output stream.
- * \param [in] val The Indent object.
- * \returns The stream.
+ * @param [in,out] os The output stream.
+ * @param [in] val The Indent object.
+ * @returns The stream.
  */
 std::ostream&
 operator<<(std::ostream& os, const Indent& val)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/test.h ns-3.44/src/core/model/test.h
--- ns-3.43/src/core/model/test.h	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/model/test.h	2025-03-09 16:55:49.363371100 -0700
@@ -20,25 +20,25 @@
 #include <vector>
 
 /**
- * \file
- * \ingroup testing
- * \brief ns3::TestCase, ns3::TestSuite, ns3::TestRunner declarations,
+ * @file
+ * @ingroup testing
+ * @brief ns3::TestCase, ns3::TestSuite, ns3::TestRunner declarations,
  * and \c NS_TEST_ASSERT macro definitions.
  */
 
 /**
- * \ingroup core
- * \defgroup testing Testing
- * \brief Tools to define and execute unit tests.
+ * @ingroup core
+ * @defgroup testing Testing
+ * @brief Tools to define and execute unit tests.
  *
  * This module lists the normal Testing API.  Most of these
  * macros forward to the implementation macros in testingimpl.
  * You should generally use these macros only.
  */
 /**
- * \ingroup testing
- * \defgroup testingimpl Testing Implementation
- * \brief Internal implementation of the Testing system.
+ * @ingroup testing
+ * @defgroup testingimpl Testing Implementation
+ * @brief Internal implementation of the Testing system.
  */
 
 namespace ns3
@@ -60,8 +60,8 @@
 //
 
 /**
- * \ingroup testing
- * \brief Check if we should assert on errors, and do so
+ * @ingroup testing
+ * @brief Check if we should assert on errors, and do so
  */
 #define ASSERT_ON_FAILURE                                                                          \
     do                                                                                             \
@@ -73,8 +73,8 @@
     } while (false)
 
 /**
- * \ingroup testing
- * \brief If we shouldn't continue on errors, return
+ * @ingroup testing
+ * @brief If we shouldn't continue on errors, return
  */
 #define CONTINUE_ON_FAILURE                                                                        \
     do                                                                                             \
@@ -86,8 +86,8 @@
     } while (false)
 
 /**
- * \ingroup testing
- * \brief If we shouldn't continue on errors, return test status
+ * @ingroup testing
+ * @brief If we shouldn't continue on errors, return test status
  */
 #define CONTINUE_ON_FAILURE_RETURNS_BOOL                                                           \
     do                                                                                             \
@@ -103,9 +103,9 @@
 // ===========================================================================
 
 /**
- * \ingroup testing
+ * @ingroup testing
  *
- * \brief Test that an actual and expected (limit) value are equal and
+ * @brief Test that an actual and expected (limit) value are equal and
  * report and abort if not.
  *
  * Check to see if the expected (limit) value is equal to the actual
@@ -116,18 +116,18 @@
  *
  * The message is interpreted as a stream, for example:
  *
- * \code
+ * @code
  * NS_TEST_ASSERT_MSG_EQ (result, true,
  *      "cannot open file " << filename << " in test");
- * \endcode
+ * @endcode
  *
  * is legal.
  *
- * \param [in] actual Expression for the actual value found during the test.
- * \param [in] limit Expression for the expected value of the test.
- * \param [in] msg Message that is output if the test does not pass.
+ * @param [in] actual Expression for the actual value found during the test.
+ * @param [in] limit Expression for the expected value of the test.
+ * @param [in] msg Message that is output if the test does not pass.
  *
- * \warning Do not use this macro if you are comparing floating point
+ * @warning Do not use this macro if you are comparing floating point
  * numbers (float or double) as it is unlikely to do what you expect.
  * Use NS_TEST_ASSERT_MSG_EQ_TOL instead.
  */
@@ -155,9 +155,9 @@
     } while (false)
 
 /**
- * \ingroup testing
+ * @ingroup testing
  *
- * \brief Test that an actual and expected (limit) value are equal and
+ * @brief Test that an actual and expected (limit) value are equal and
  * report and abort if not.
  *
  * Check to see if the expected (limit) value is equal to the actual
@@ -168,18 +168,18 @@
  *
  * The message is interpreted as a stream, for example:
  *
- * \code
+ * @code
  * NS_TEST_ASSERT_MSG_EQ_RETURNS_BOOL (result, true,
  *      "cannot open file " << filename << " in test");
- * \endcode
+ * @endcode
  *
  * is legal.
  *
- * \param [in] actual Expression for the actual value found during the test.
- * \param [in] limit Expression for the expected value of the test.
- * \param [in] msg Message that is output if the test does not pass.
+ * @param [in] actual Expression for the actual value found during the test.
+ * @param [in] limit Expression for the expected value of the test.
+ * @param [in] msg Message that is output if the test does not pass.
  *
- * \warning Do not use this macro if you are comparing floating point
+ * @warning Do not use this macro if you are comparing floating point
  * numbers (float or double) as it is unlikely to do what you expect.
  * Use NS_TEST_ASSERT_MSG_EQ_RETURNS_BOOL_TOL instead.
  *
@@ -210,9 +210,9 @@
     } while (false)
 
 /**
- * \ingroup testing
+ * @ingroup testing
  *
- * \brief Test that an actual and expected (limit) value are equal and
+ * @brief Test that an actual and expected (limit) value are equal and
  * report if not.
  *
  * Check to see if the expected (limit) value is equal to the actual
@@ -223,18 +223,18 @@
  *
  * The message is interpreted as a stream, for example:
  *
- * \code
+ * @code
  * NS_TEST_EXPECT_MSG_EQUAL (result, true,
  *      "cannot open file " << filename << " in test");
- * \endcode
+ * @endcode
  *
  * is legal.
  *
- * \param [in] actual Expression for the actual value found during the test.
- * \param [in] limit Expression for the expected value of the test.
- * \param [in] msg Message that is output if the test does not pass.
+ * @param [in] actual Expression for the actual value found during the test.
+ * @param [in] limit Expression for the expected value of the test.
+ * @param [in] msg Message that is output if the test does not pass.
  *
- * \warning Do not use this macro if you are comparing floating point
+ * @warning Do not use this macro if you are comparing floating point
  * numbers (float or double) as it is unlikely to do what you expect.
  * Use NS_TEST_EXPECT_MSG_EQ_TOL instead.
  */
@@ -266,9 +266,9 @@
 // ===========================================================================
 
 /**
- * \ingroup testing
+ * @ingroup testing
  *
- * \brief Test that actual and expected (limit) values are equal to
+ * @brief Test that actual and expected (limit) values are equal to
  * plus or minus some tolerance and report and abort if not.
  *
  * Check to see if the expected (limit) value is equal to the actual
@@ -307,22 +307,22 @@
  * numeric_limits<double>::epsilon () range, consider using
  * ns3::TestDoubleIsEqual().
  *
- * \note Mixing signed and unsigned types can lead to misleading
+ * @note Mixing signed and unsigned types can lead to misleading
  * results.
  *
  * The message is interpreted as a stream, for example:
  *
- * \code
+ * @code
  *   NS_TEST_ASSERT_MSG_EQ_TOL (snr, 1128.93, 0.005,
  *                              "wrong snr (" << snr << ") in test");
- * \endcode
+ * @endcode
  *
  * is legal.
  *
- * \param [in] actual Expression for the actual value found during the test.
- * \param [in] limit Expression for the expected value of the test.
- * \param [in] tol Tolerance of the test.
- * \param [in] msg Message that is output if the test does not pass.
+ * @param [in] actual Expression for the actual value found during the test.
+ * @param [in] limit Expression for the expected value of the test.
+ * @param [in] tol Tolerance of the test.
+ * @param [in] msg Message that is output if the test does not pass.
  */
 #define NS_TEST_ASSERT_MSG_EQ_TOL(actual, limit, tol, msg)                                         \
     do                                                                                             \
@@ -351,9 +351,9 @@
     } while (false)
 
 /**
- * \ingroup testing
+ * @ingroup testing
  *
- * \brief Test that actual and expected (limit) values are equal to
+ * @brief Test that actual and expected (limit) values are equal to
  * plus or minus some tolerance and report and abort if not.
  *
  * Check to see if the expected (limit) value is equal to the actual
@@ -392,22 +392,22 @@
  * numeric_limits<double>::epsilon () range, consider using
  * ns3::TestDoubleIsEqual().
  *
- * \note Mixing signed and unsigned types can lead to misleading
+ * @note Mixing signed and unsigned types can lead to misleading
  * results.
  *
  * The message is interpreted as a stream, for example:
  *
- * \code
+ * @code
  *   NS_TEST_ASSERT_MSG_EQ_TOL_RETURNS_BOOL (snr, 1128.93, 0.005,
  *                                           "wrong snr (" << snr << ") in test");
- * \endcode
+ * @endcode
  *
  * is legal.
  *
- * \param [in] actual Expression for the actual value found during the test.
- * \param [in] limit Expression for the expected value of the test.
- * \param [in] tol Tolerance of the test.
- * \param [in] msg Message that is output if the test does not pass.
+ * @param [in] actual Expression for the actual value found during the test.
+ * @param [in] limit Expression for the expected value of the test.
+ * @param [in] tol Tolerance of the test.
+ * @param [in] msg Message that is output if the test does not pass.
  *
  * This function returns a Boolean value.
  *
@@ -439,9 +439,9 @@
     } while (false)
 
 /**
- * \ingroup testing
+ * @ingroup testing
  *
- * \brief Test that actual and expected (limit) values are equal to
+ * @brief Test that actual and expected (limit) values are equal to
  * plus or minus some tolerance and report if not.
  *
  * Check to see if the expected (limit) value is equal to the actual
@@ -480,22 +480,22 @@
  * numeric_limits<double>::epsilon () range, consider using
  * ns3::TestDoubleIsEqual().
  *
- * \note Mixing signed and unsigned types can lead to misleading
+ * @note Mixing signed and unsigned types can lead to misleading
  * results.
  *
  * The message is interpreted as a stream, for example:
  *
- * \code
+ * @code
  *   NS_TEST_EXPECT_MSG_EQ_TOL (snr, 1128.93, 0.005,
  *                              "wrong snr (" << snr << ") in test");
- * \endcode
+ * @endcode
  *
  * is legal.
  *
- * \param [in] actual Expression for the actual value found during the test.
- * \param [in] limit Expression for the expected value of the test.
- * \param [in] tol Tolerance of the test.
- * \param [in] msg Message that is output if the test does not pass.
+ * @param [in] actual Expression for the actual value found during the test.
+ * @param [in] limit Expression for the expected value of the test.
+ * @param [in] tol Tolerance of the test.
+ * @param [in] msg Message that is output if the test does not pass.
  */
 #define NS_TEST_EXPECT_MSG_EQ_TOL(actual, limit, tol, msg)                                         \
     do                                                                                             \
@@ -527,9 +527,9 @@
 // ===========================================================================
 
 /**
- * \ingroup testing
+ * @ingroup testing
  *
- * \brief Test that an actual and expected (limit) value are not equal
+ * @brief Test that an actual and expected (limit) value are not equal
  * and report and abort if not.
  *
  * Check to see if the expected (limit) value is not equal to the
@@ -540,16 +540,16 @@
  *
  * The message is interpreted as a stream, for example:
  *
- * \code
+ * @code
  * NS_TEST_ASSERT_MSG_NE (result, false,
  *      "cannot open file " << filename << " in test");
- * \endcode
+ * @endcode
  *
  * is legal.
  *
- * \param [in] actual Expression for the actual value found during the test.
- * \param [in] limit Expression for the value that actual is tested against.
- * \param [in] msg Message that is output if the test does not pass.
+ * @param [in] actual Expression for the actual value found during the test.
+ * @param [in] limit Expression for the value that actual is tested against.
+ * @param [in] msg Message that is output if the test does not pass.
  */
 #define NS_TEST_ASSERT_MSG_NE(actual, limit, msg)                                                  \
     do                                                                                             \
@@ -575,9 +575,9 @@
     } while (false)
 
 /**
- * \ingroup testing
+ * @ingroup testing
  *
- * \brief Test that an actual and expected (limit) value are not equal
+ * @brief Test that an actual and expected (limit) value are not equal
  * and report and abort if not.
  *
  * Check to see if the expected (limit) value is not equal to the
@@ -588,16 +588,16 @@
  *
  * The message is interpreted as a stream, for example:
  *
- * \code
+ * @code
  * NS_TEST_ASSERT_MSG_NE_RETURNS_BOOL (result, false,
  *      "cannot open file " << filename << " in test");
- * \endcode
+ * @endcode
  *
  * is legal.
  *
- * \param [in] actual Expression for the actual value found during the test.
- * \param [in] limit Expression for the expected value of the test.
- * \param [in] msg Message that is output if the test does not pass.
+ * @param [in] actual Expression for the actual value found during the test.
+ * @param [in] limit Expression for the expected value of the test.
+ * @param [in] msg Message that is output if the test does not pass.
  *
  * This function returns a Boolean value.
  *
@@ -626,9 +626,9 @@
     } while (false)
 
 /**
- * \ingroup testing
+ * @ingroup testing
  *
- * \brief Test that an actual and expected (limit) value are not equal
+ * @brief Test that an actual and expected (limit) value are not equal
  * and report if not.
  *
  * Check to see if the expected (limit) value is not equal to the
@@ -639,18 +639,18 @@
  *
  * The message is interpreted as a stream, for example:
  *
- * \code
+ * @code
  * NS_TEST_EXPECT_MSG_NE (result, false,
  *      "cannot open file " << filename << " in test");
- * \endcode
+ * @endcode
  *
  * is legal.
  *
- * \param [in] actual Expression for the actual value found during the test.
- * \param [in] limit Expression for the value that actual is tested against.
- * \param [in] msg Message that is output if the test does not pass.
+ * @param [in] actual Expression for the actual value found during the test.
+ * @param [in] limit Expression for the value that actual is tested against.
+ * @param [in] msg Message that is output if the test does not pass.
  *
- * \warning Do not use this macro if you are comparing floating point
+ * @warning Do not use this macro if you are comparing floating point
  * numbers (float or double).  Use NS_TEST_EXPECT_MSG_FLNE instead.
  */
 #define NS_TEST_EXPECT_MSG_NE(actual, limit, msg)                                                  \
@@ -680,9 +680,9 @@
 // ===========================================================================
 
 /**
- * \ingroup testing
+ * @ingroup testing
  *
- * \brief Test that an actual value is less than a limit and report
+ * @brief Test that an actual value is less than a limit and report
  * and abort if not.
  *
  * Check to see if the actual value found in a test case is less than
@@ -692,9 +692,9 @@
  *
  * The message is interpreted as a stream.
  *
- * \param [in] actual Expression for the actual value found during the test.
- * \param [in] limit Expression for the limit value of the test.
- * \param [in] msg Message that is output if the test does not pass.
+ * @param [in] actual Expression for the actual value found during the test.
+ * @param [in] limit Expression for the limit value of the test.
+ * @param [in] msg Message that is output if the test does not pass.
  */
 #define NS_TEST_ASSERT_MSG_LT(actual, limit, msg)                                                  \
     do                                                                                             \
@@ -720,9 +720,9 @@
     } while (false)
 
 /**
- * \ingroup testing
+ * @ingroup testing
  *
- * \brief Test that an actual value is less than or equal to a limit
+ * @brief Test that an actual value is less than or equal to a limit
  * and report and abort if not.
  *
  * Check to see if the actual value found in a test case is less than
@@ -733,9 +733,9 @@
  *
  * The message is interpreted as a stream.
  *
- * \param [in] actual Expression for the actual value found during the test.
- * \param [in] limit Expression for the limit value of the test.
- * \param [in] msg Message that is output if the test does not pass.
+ * @param [in] actual Expression for the actual value found during the test.
+ * @param [in] limit Expression for the limit value of the test.
+ * @param [in] msg Message that is output if the test does not pass.
  */
 #define NS_TEST_ASSERT_MSG_LT_OR_EQ(actual, limit, msg)                                            \
     do                                                                                             \
@@ -761,9 +761,9 @@
     } while (false)
 
 /**
- * \ingroup testing
+ * @ingroup testing
  *
- * \brief Test that an actual value is less than a limit and report if
+ * @brief Test that an actual value is less than a limit and report if
  * not.
  *
  * Check to see if the actual value found in a test case is less than
@@ -773,9 +773,9 @@
  *
  * The message is interpreted as a stream.
  *
- * \param [in] actual Expression for the actual value found during the test.
- * \param [in] limit Expression for the limit value of the test.
- * \param [in] msg Message that is output if the test does not pass.
+ * @param [in] actual Expression for the actual value found during the test.
+ * @param [in] limit Expression for the limit value of the test.
+ * @param [in] msg Message that is output if the test does not pass.
  */
 #define NS_TEST_EXPECT_MSG_LT(actual, limit, msg)                                                  \
     do                                                                                             \
@@ -800,9 +800,9 @@
     } while (false)
 
 /**
- * \ingroup testing
+ * @ingroup testing
  *
- * \brief Test that an actual value is less than or equal to a limit
+ * @brief Test that an actual value is less than or equal to a limit
  * and report if not.
  *
  * Check to see if the actual value found in a test case is less than
@@ -813,9 +813,9 @@
  *
  * The message is interpreted as a stream.
  *
- * \param [in] actual Expression for the actual value found during the test.
- * \param [in] limit Expression for the limit value of the test.
- * \param [in] msg Message that is output if the test does not pass.
+ * @param [in] actual Expression for the actual value found during the test.
+ * @param [in] limit Expression for the limit value of the test.
+ * @param [in] msg Message that is output if the test does not pass.
  */
 #define NS_TEST_EXPECT_MSG_LT_OR_EQ(actual, limit, msg)                                            \
     do                                                                                             \
@@ -844,9 +844,9 @@
 // ===========================================================================
 
 /**
- * \ingroup testing
+ * @ingroup testing
  *
- * \brief Test that an actual value is greater than a limit and report
+ * @brief Test that an actual value is greater than a limit and report
  * and abort if not.
  *
  * Check to see if the actual value found in a test case is greater
@@ -857,9 +857,9 @@
  *
  * The message is interpreted as a stream.
  *
- * \param [in] actual Expression for the actual value found during the test.
- * \param [in] limit Expression for the limit value of the test.
- * \param [in] msg Message that is output if the test does not pass.
+ * @param [in] actual Expression for the actual value found during the test.
+ * @param [in] limit Expression for the limit value of the test.
+ * @param [in] msg Message that is output if the test does not pass.
  */
 #define NS_TEST_ASSERT_MSG_GT(actual, limit, msg)                                                  \
     do                                                                                             \
@@ -885,9 +885,9 @@
     } while (false)
 
 /**
- * \ingroup testing
+ * @ingroup testing
  *
- * \brief Test that an actual value is greater than or equal to a
+ * @brief Test that an actual value is greater than or equal to a
  * limit and report and abort if not.
  *
  * Check to see if the actual value found in a test case is greater
@@ -898,9 +898,9 @@
  *
  * The message is interpreted as a stream.
  *
- * \param [in] actual Expression for the actual value found during the test.
- * \param [in] limit Expression for the limit value of the test.
- * \param [in] msg Message that is output if the test does not pass.
+ * @param [in] actual Expression for the actual value found during the test.
+ * @param [in] limit Expression for the limit value of the test.
+ * @param [in] msg Message that is output if the test does not pass.
  */
 #define NS_TEST_ASSERT_MSG_GT_OR_EQ(actual, limit, msg)                                            \
     do                                                                                             \
@@ -926,9 +926,9 @@
     } while (false)
 
 /**
- * \ingroup testing
+ * @ingroup testing
  *
- * \brief Test that an actual value is greater than a limit and report
+ * @brief Test that an actual value is greater than a limit and report
  * if not.
  *
  * Check to see if the actual value found in a test case is greater
@@ -939,9 +939,9 @@
  *
  * The message is interpreted as a stream.
  *
- * \param [in] actual Expression for the actual value found during the test.
- * \param [in] limit Expression for the limit value of the test.
- * \param [in] msg Message that is output if the test does not pass.
+ * @param [in] actual Expression for the actual value found during the test.
+ * @param [in] limit Expression for the limit value of the test.
+ * @param [in] msg Message that is output if the test does not pass.
  */
 #define NS_TEST_EXPECT_MSG_GT(actual, limit, msg)                                                  \
     do                                                                                             \
@@ -966,9 +966,9 @@
     } while (false)
 
 /**
- * \ingroup testing
+ * @ingroup testing
  *
- * \brief Test that an actual value is greater than or equal to limit
+ * @brief Test that an actual value is greater than or equal to limit
  * and report if not.
  *
  * Check to see if the actual value found in a test case is greater
@@ -979,9 +979,9 @@
  *
  * The message is interpreted as a stream.
  *
- * \param [in] actual Expression for the actual value found during the test.
- * \param [in] limit Expression for the limit value of the test.
- * \param [in] msg Message that is output if the test does not pass.
+ * @param [in] actual Expression for the actual value found during the test.
+ * @param [in] limit Expression for the limit value of the test.
+ * @param [in] msg Message that is output if the test does not pass.
  */
 #define NS_TEST_EXPECT_MSG_GT_OR_EQ(actual, limit, msg)                                            \
     do                                                                                             \
@@ -1006,8 +1006,8 @@
     } while (false)
 
 /**
- * \ingroup testing
- * \brief Compare two double precision floating point numbers and
+ * @ingroup testing
+ * @brief Compare two double precision floating point numbers and
  * declare them equal if they are within some epsilon of each other.
  *
  * Approximate comparison of floating point numbers near equality is
@@ -1021,12 +1021,12 @@
  * This routine is based on the GNU Scientific Library function
  * gsl_fcmp.
  *
- * \param [in] a The first of double precision floating point
+ * @param [in] a The first of double precision floating point
  *               numbers to compare
- * \param [in] b The second of double precision floating point
+ * @param [in] b The second of double precision floating point
  *               numbers to compare
- * \param [in] epsilon The tolerance to use in the comparison.
- * \returns Returns \c true if the doubles are equal to a precision
+ * @param [in] epsilon The tolerance to use in the comparison.
+ * @returns Returns \c true if the doubles are equal to a precision
  *          defined by epsilon
  */
 bool TestDoubleIsEqual(const double a,
@@ -1036,20 +1036,20 @@
 class TestRunnerImpl;
 
 /**
- * \ingroup testing
+ * @ingroup testing
  *
- * \brief encapsulates test code
+ * @brief encapsulates test code
  *
  * To allow a new test to be run within the ns-3 test framework, users
  * need to create subclasses of this base class, override the DoRun
  * method, and use the NS_TEST_* macros within DoRun.
  *
- * \see sample-test-suite.cc
+ * @see sample-test-suite.cc
  */
 class TestCase
 {
   public:
-    /** \brief How long the test takes to execute. */
+    /** @brief How long the test takes to execute. */
     enum class Duration
     {
         QUICK = 1,        //!< Fast test.
@@ -1083,32 +1083,32 @@
     TestCase& operator=(const TestCase&) = delete;
 
     /**
-     * \return The name of this test
+     * @return The name of this test
      */
     std::string GetName() const;
 
   protected:
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      *
-     * \param [in] name The name of the new TestCase created
+     * @param [in] name The name of the new TestCase created
      */
     TestCase(std::string name);
 
     /**
-     * \brief Add an individual child TestCase to this test suite.
+     * @brief Add an individual child TestCase to this test suite.
      *
-     * \param [in] testCase Pointer to the TestCase object to be added.
-     * \param [in] duration Amount of time this test takes to execute
+     * @param [in] testCase Pointer to the TestCase object to be added.
+     * @param [in] duration Amount of time this test takes to execute
      *             (defaults to QUICK).
      */
     void AddTestCase(TestCase* testCase, Duration duration = Duration::QUICK);
 
     /**
-     * \brief Set the data directory where reference trace files can be
+     * @brief Set the data directory where reference trace files can be
      * found.
      *
-     * \param [in] directory The directory where the test data is
+     * @param [in] directory The directory where the test data is
      * located
      *
      * In general, this method is invoked as SetDataDir
@@ -1123,40 +1123,40 @@
     void SetDataDir(std::string directory);
 
     /**
-     * \brief Check if any tests failed.
+     * @brief Check if any tests failed.
      *
-     * \return \c true if any of the tests have failed, \c false otherwise.
+     * @return \c true if any of the tests have failed, \c false otherwise.
      */
     bool IsStatusFailure() const;
     /**
-     * \brief Check if all tests passed.
+     * @brief Check if all tests passed.
      *
-     * \return \c true if the tests have succeeded, \c false otherwise.
+     * @return \c true if the tests have succeeded, \c false otherwise.
      */
     bool IsStatusSuccess() const;
 
     /**
-     * \brief Get the parent of this TestCase.
+     * @brief Get the parent of this TestCase.
      *
-     * \return A pointer to the parent of this test.
+     * @return A pointer to the parent of this test.
      */
     TestCase* GetParent() const;
 
     /**
-     * \name Internal Interface
+     * @name Internal Interface
      * These methods are the interface used by test macros and should not
      * be used directly by normal test code.
      * @{
      */
     /**
-     * \brief Log the failure of this TestCase.
+     * @brief Log the failure of this TestCase.
      *
-     * \param [in] cond The test condition.
-     * \param [in] actual Actual value of the test.
-     * \param [in] limit Expected value of the test.
-     * \param [in] message Message indicating the type of failure.
-     * \param [in] file The file where the test failed.
-     * \param [in] line The line number in \pname{file} where the test failed.
+     * @param [in] cond The test condition.
+     * @param [in] actual Actual value of the test.
+     * @param [in] limit Expected value of the test.
+     * @param [in] message Message indicating the type of failure.
+     * @param [in] file The file where the test failed.
+     * @param [in] line The line number in \pname{file} where the test failed.
      */
     void ReportTestFailure(std::string cond,
                            std::string actual,
@@ -1165,34 +1165,34 @@
                            std::string file,
                            int32_t line);
     /**
-     * \brief Check if this run should assert on failure.
+     * @brief Check if this run should assert on failure.
      *
-     * \return \c true if we should assert on failure.
+     * @return \c true if we should assert on failure.
      */
     bool MustAssertOnFailure() const;
     /**
-     * \brief Check if this run should continue on failure.
+     * @brief Check if this run should continue on failure.
      *
-     * \return \c true if we should continue on failure.
+     * @return \c true if we should continue on failure.
      */
     bool MustContinueOnFailure() const;
     /**
-     * \brief Construct the full path to a file in the data directory.
+     * @brief Construct the full path to a file in the data directory.
      *
      * The data directory is configured by SetDataDirectory().
      *
-     * \param [in] filename The bare (no path) file name
-     * \return The full path to \pname{filename} in the data directory
+     * @param [in] filename The bare (no path) file name
+     * @return The full path to \pname{filename} in the data directory
      */
     std::string CreateDataDirFilename(std::string filename);
     /**
-     * \brief Construct the full path to a file in a temporary directory.
+     * @brief Construct the full path to a file in a temporary directory.
      *
      *  If the TestRunner is invoked with "--update-data", this will be
      *  the data directory instead.
      *
-     * \param [in] filename The bare (no path) file name
-     * \return The full path to \pname{filename} in the temporary directory.
+     * @param [in] filename The bare (no path) file name
+     * @return The full path to \pname{filename} in the temporary directory.
      */
     std::string CreateTempDirFilename(std::string filename);
     /**@}*/
@@ -1202,7 +1202,7 @@
     friend class TestRunnerImpl;
 
     /**
-     * \brief Implementation to do any local setup required for this
+     * @brief Implementation to do any local setup required for this
      * TestCase.
      *
      * Subclasses should override this method to perform any costly
@@ -1211,14 +1211,14 @@
     virtual void DoSetup();
 
     /**
-     * \brief Implementation to actually run this TestCase.
+     * @brief Implementation to actually run this TestCase.
      *
      * Subclasses should override this method to conduct their tests.
      */
     virtual void DoRun() = 0;
 
     /**
-     * \brief Implementation to do any local setup required for this
+     * @brief Implementation to do any local setup required for this
      * TestCase.
      *
      * Subclasses should override this method to perform any costly
@@ -1228,22 +1228,22 @@
 
     // methods called by TestRunnerImpl
     /**
-     * \brief Executes DoSetup(), DoRun(), and DoTeardown() for the TestCase
+     * @brief Executes DoSetup(), DoRun(), and DoTeardown() for the TestCase
      *
      * Config::Reset() is called at both the beginning and end of this method
      * so that any changes to attribute default values (Config::SetDefault(...))
      * or global values (e.g., RngRun) that are made within the test case's
      * DoRun() method do not propagate beyond the scope of running the TestCase.
      *
-     * \param [in] runner The test runner implementation.
+     * @param [in] runner The test runner implementation.
      */
     void Run(TestRunnerImpl* runner);
-    /** \copydoc IsStatusFailure() */
+    /** @copydoc IsStatusFailure() */
     bool IsFailed() const;
 
     /**
-     * \ingroup testingimpl
-     * \brief Container for results from a TestCase.
+     * @ingroup testingimpl
+     * @brief Container for results from a TestCase.
      */
     struct Result;
 
@@ -1257,18 +1257,18 @@
 };
 
 /**
- * \ingroup testing
+ * @ingroup testing
  *
- * \brief A suite of tests to run.
+ * @brief A suite of tests to run.
  *
- * \see sample-test-suite.cc
+ * @see sample-test-suite.cc
  */
 class TestSuite : public TestCase
 {
   public:
     /**
-     * \enum Type
-     * \brief Type of test.
+     * @enum Type
+     * @brief Type of test.
      */
     enum class Type
     {
@@ -1298,17 +1298,17 @@
     /**@}*/
 
     /**
-     * \brief Construct a new test suite.
+     * @brief Construct a new test suite.
      *
-     * \param [in] name The name of the test suite.
-     * \param [in] type The TestType of the test suite (defaults to UNIT test).
+     * @param [in] name The name of the test suite.
+     * @param [in] type The TestType of the test suite (defaults to UNIT test).
      */
     TestSuite(std::string name, Type type = Type::UNIT);
 
     /**
-     * \brief get the kind of test this test suite implements
+     * @brief get the kind of test this test suite implements
      *
-     * \returns The Type of the suite.
+     * @returns The Type of the suite.
      */
     TestSuite::Type GetTestType();
 
@@ -1320,9 +1320,9 @@
 };
 
 /**
- * \ingroup testingimpl
+ * @ingroup testingimpl
  *
- * \brief A runner to execute tests.
+ * @brief A runner to execute tests.
  */
 class TestRunner
 {
@@ -1331,17 +1331,17 @@
      * Run the requested suite of tests,
      * according to the given command line arguments.
      *
-     * \param [in] argc The number of elements in \pname{argv}
-     * \param [in] argv The vector of command line arguments
-     * \returns Success status
+     * @param [in] argc The number of elements in \pname{argv}
+     * @param [in] argv The vector of command line arguments
+     * @returns Success status
      */
     static int Run(int argc, char* argv[]);
 };
 
 /**
- * \ingroup testing
+ * @ingroup testing
  *
- * \brief A simple way to store test vectors (for stimulus or from responses)
+ * @brief A simple way to store test vectors (for stimulus or from responses)
  */
 template <typename T>
 class TestVectors
@@ -1361,33 +1361,33 @@
     TestVectors& operator=(const TestVectors&) = delete;
 
     /**
-     * \brief Set the expected length of this vector.
+     * @brief Set the expected length of this vector.
      *
-     * \param [in] reserve The number of entries to reserve
+     * @param [in] reserve The number of entries to reserve
      */
     void Reserve(uint32_t reserve);
 
     /**
-     * \param [in] vector The test vector to add
+     * @param [in] vector The test vector to add
      *
-     * \returns The new test vector index
+     * @returns The new test vector index
      */
     std::size_t Add(T vector);
 
     /**
-     * \brief Get the total number of test vectors.
-     * \return The number of test vectors
+     * @brief Get the total number of test vectors.
+     * @return The number of test vectors
      */
     std::size_t GetN() const;
     /**
-     * \brief Get the i'th test vector
-     * \param [in] i The requested vector index
-     * \return The requested vector
+     * @brief Get the i'th test vector
+     * @param [in] i The requested vector index
+     * @return The requested vector
      */
     T Get(std::size_t i) const;
 
     /**
-     * \return The underlying data structure begin iterator
+     * @return The underlying data structure begin iterator
      */
     typename std::vector<T>::iterator begin()
     {
@@ -1395,7 +1395,7 @@
     }
 
     /**
-     * \return The underlying data structure end iterator
+     * @return The underlying data structure end iterator
      */
     typename std::vector<T>::iterator end()
     {
@@ -1403,7 +1403,7 @@
     }
 
     /**
-     * \return The underlying data structure const begin iterator
+     * @return The underlying data structure const begin iterator
      */
     typename std::vector<T>::const_iterator begin() const
     {
@@ -1411,7 +1411,7 @@
     }
 
     /**
-     * \return The underlying data structure const end iterator
+     * @return The underlying data structure const end iterator
      */
     typename std::vector<T>::const_iterator end() const
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/time.cc ns-3.44/src/core/model/time.cc
--- ns-3.43/src/core/model/time.cc	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/model/time.cc	2025-03-09 16:55:49.363371100 -0700
@@ -17,8 +17,8 @@
 #include <sstream>
 
 /**
- * \file
- * \ingroup time
+ * @file
+ * @ingroup time
  * ns3::Time, ns3::TimeWithUnit
  * and ns3::TimeValue attribute value implementations.
  */
@@ -42,8 +42,8 @@
 
 /**
  * Scale a unit to the smallest unit.
- * \param u The unit to scale
- * \returns The value of \pname{u} in terms of the smallest defined unit.
+ * @param u The unit to scale
+ * @returns The value of \pname{u} in terms of the smallest defined unit.
  */
 long double
 Scale(Time::Unit u)
@@ -53,7 +53,7 @@
 
 /**
  * Initializer for \c UNIT_VALUE
- * \returns The array of scale factors between units.
+ * @returns The array of scale factors between units.
  */
 long double*
 InitUnitValue()
@@ -285,7 +285,7 @@
 Time::ClearMarkedTimes()
 {
     /**
-     * \internal
+     * @internal
      *
      * We're called by Simulator::Run, which knows nothing about the mutex,
      * so we need a critical section here.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/time-printer.cc ns-3.44/src/core/model/time-printer.cc
--- ns-3.43/src/core/model/time-printer.cc	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/model/time-printer.cc	2025-03-09 16:55:49.363371100 -0700
@@ -15,8 +15,8 @@
 #include <iomanip>
 
 /**
- * \file
- * \ingroup time
+ * @file
+ * @ingroup time
  * ns3::DefaultTimePrinter implementation.
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/time-printer.h ns-3.44/src/core/model/time-printer.h
--- ns-3.43/src/core/model/time-printer.h	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/model/time-printer.h	2025-03-09 16:55:49.363371100 -0700
@@ -11,8 +11,8 @@
 #include <ostream>
 
 /**
- * \file
- * \ingroup time
+ * @file
+ * @ingroup time
  * Declaration of ns3::TimePrinter function pointer type
  * and ns3::DefaultTimePrinter function.
  */
@@ -27,14 +27,14 @@
  * A TimePrinter should write the current simulation time
  * (Simulator::Now()) on the designated output stream.
  *
- * \param [in,out] os The output stream to print on.
+ * @param [in,out] os The output stream to print on.
  */
 typedef void (*TimePrinter)(std::ostream& os);
 
 /**
  * Default Time printer.
  *
- * \param [in,out] os The output stream to print on.
+ * @param [in,out] os The output stream to print on.
  */
 void DefaultTimePrinter(std::ostream& os);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/timer.cc ns-3.44/src/core/model/timer.cc
--- ns-3.43/src/core/model/timer.cc	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/model/timer.cc	2025-03-09 16:55:49.363371100 -0700
@@ -12,8 +12,8 @@
 #include "simulator.h"
 
 /**
- * \file
- * \ingroup timer
+ * @file
+ * @ingroup timer
  * ns3::Timer implementation.
  */
 
@@ -24,7 +24,7 @@
 
 Timer::Timer()
     : m_flags(CHECK_ON_DESTROY),
-      m_delay(FemtoSeconds(0)),
+      m_delay(),
       m_event(),
       m_impl(nullptr)
 {
@@ -33,7 +33,7 @@
 
 Timer::Timer(DestroyPolicy destroyPolicy)
     : m_flags(destroyPolicy),
-      m_delay(FemtoSeconds(0)),
+      m_delay(),
       m_event(),
       m_impl(nullptr)
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/timer.h ns-3.44/src/core/model/timer.h
--- ns-3.43/src/core/model/timer.h	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/model/timer.h	2025-03-09 16:55:49.363371100 -0700
@@ -13,8 +13,8 @@
 #include "nstime.h"
 
 /**
- * \file
- * \ingroup timer
+ * @file
+ * @ingroup timer
  * ns3::Timer class declaration.
  */
 
@@ -22,8 +22,8 @@
 {
 
 /**
- * \ingroup core
- * \defgroup timer Virtual Time Timer and Watchdog
+ * @ingroup core
+ * @defgroup timer Virtual Time Timer and Watchdog
  *
  * The Timer and Watchdog objects both facilitate scheduling functions
  * to execute a specified virtual time in the future.
@@ -46,8 +46,8 @@
 } // namespace internal
 
 /**
- * \ingroup timer
- * \brief A simple virtual Timer class
+ * @ingroup timer
+ * @brief A simple virtual Timer class
  *
  * A (virtual time) timer is used to hold together a delay, a function to invoke
  * when the delay expires, and a set of arguments to pass to the function
@@ -61,7 +61,7 @@
  * management policies. These policies are specified at construction time
  * and cannot be changed after.
  *
- * \see Watchdog for a simpler interface for a watchdog timer.
+ * @see Watchdog for a simpler interface for a watchdog timer.
  */
 class Timer
 {
@@ -111,15 +111,15 @@
      */
     Timer();
     /**
-     * \param [in] destroyPolicy the event lifetime management policies
+     * @param [in] destroyPolicy the event lifetime management policies
      * to use for destroy events
      */
     Timer(DestroyPolicy destroyPolicy);
     ~Timer();
 
     /**
-     * \tparam FN \deduced The type of the function.
-     * \param [in] fn the function
+     * @tparam FN \deduced The type of the function.
+     * @param [in] fn the function
      *
      * Store this function in this Timer for later use by Timer::Schedule.
      */
@@ -127,10 +127,10 @@
     void SetFunction(FN fn);
 
     /**
-     * \tparam MEM_PTR \deduced The type of the class member function.
-     * \tparam OBJ_PTR \deduced The type of the class instance pointer.
-     * \param [in] memPtr the member function pointer
-     * \param [in] objPtr the pointer to object
+     * @tparam MEM_PTR \deduced The type of the class member function.
+     * @tparam OBJ_PTR \deduced The type of the class instance pointer.
+     * @param [in] memPtr the member function pointer
+     * @param [in] objPtr the pointer to object
      *
      * Store this function and object in this Timer for later use by
      * Timer::Schedule.
@@ -139,8 +139,8 @@
     void SetFunction(MEM_PTR memPtr, OBJ_PTR objPtr);
 
     /**
-     * \tparam Ts \deduced Argument types
-     * \param [in] args arguments
+     * @tparam Ts \deduced Argument types
+     * @param [in] args arguments
      *
      * Store these arguments in this Timer for later use by Timer::Schedule.
      */
@@ -148,17 +148,17 @@
     void SetArguments(Ts... args);
 
     /**
-     * \param [in] delay The delay
+     * @param [in] delay The delay
      *
      * The next call to Schedule will schedule the timer with this delay.
      */
     void SetDelay(const Time& delay);
     /**
-     * \returns The currently-configured delay for the next Schedule.
+     * @returns The currently-configured delay for the next Schedule.
      */
     Time GetDelay() const;
     /**
-     * \returns The amount of time left until this timer expires.
+     * @returns The amount of time left until this timer expires.
      *
      * This method returns zero if the timer is in EXPIRED state.
      */
@@ -174,22 +174,22 @@
      */
     void Remove();
     /**
-     * \return \c true if there is no currently-running event,
+     * @return \c true if there is no currently-running event,
      * \c false otherwise.
      */
     bool IsExpired() const;
     /**
-     * \return \c true if there is a currently-running event,
+     * @return \c true if there is a currently-running event,
      * \c false otherwise.
      */
     bool IsRunning() const;
     /**
-     * \returns \c true if this timer was suspended and not yet resumed,
+     * @returns \c true if this timer was suspended and not yet resumed,
      * \c false otherwise.
      */
     bool IsSuspended() const;
     /**
-     * \returns The current state of the timer.
+     * @returns The current state of the timer.
      */
     Timer::State GetState() const;
     /**
@@ -198,7 +198,7 @@
      */
     void Schedule();
     /**
-     * \param [in] delay the delay to use
+     * @param [in] delay the delay to use
      *
      * Schedule a new event using the specified delay (ignore the delay set by
      * Timer::SetDelay), function, and arguments.
@@ -232,7 +232,7 @@
     /**
      * Bitfield for Timer State, DestroyPolicy and InternalSuspended.
      *
-     * \internal
+     * @internal
      * The DestroyPolicy, State and InternalSuspended state are stored
      * in this single bitfield.  The State uses the low-order bits,
      * so the other users of the bitfield have to be careful in defining
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/timer-impl.h ns-3.44/src/core/model/timer-impl.h
--- ns-3.43/src/core/model/timer-impl.h	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/model/timer-impl.h	2025-03-09 16:55:49.363371100 -0700
@@ -15,9 +15,9 @@
 #include <type_traits>
 
 /**
- * \file
- * \ingroup timer
- * \ingroup timerimpl
+ * @file
+ * @ingroup timer
+ * @ingroup timerimpl
  * ns3::TimerImpl declaration and implementation.
  */
 
@@ -28,7 +28,7 @@
 {
 
 /**
- * \ingroup timer
+ * @ingroup timer
  * The timer implementation underlying Timer and Watchdog.
  */
 class TimerImpl
@@ -42,8 +42,8 @@
     /**
      * Set the arguments to be used when invoking the expire function.
      *
-     * \tparam Args \deduced Type template parameter pack
-     * \param [in] args The arguments to pass to the invoked method
+     * @tparam Args \deduced Type template parameter pack
+     * @param [in] args The arguments to pass to the invoked method
      */
     template <typename... Args>
     void SetArgs(Args... args);
@@ -51,8 +51,8 @@
     /**
      * Schedule the callback for a future time.
      *
-     * \param [in] delay The amount of time until the timer expires.
-     * \returns The scheduled EventId.
+     * @param [in] delay The amount of time until the timer expires.
+     * @returns The scheduled EventId.
      */
     virtual EventId Schedule(const Time& delay) = 0;
     /** Invoke the expire function. */
@@ -64,8 +64,8 @@
  ********************************************************************/
 
 /**
- * \ingroup timer
- * \defgroup timerimpl TimerImpl Implementation
+ * @ingroup timer
+ * @defgroup timerimpl TimerImpl Implementation
  * @{
  */
 /** TimerImpl specialization class for varying numbers of arguments. */
@@ -75,7 +75,7 @@
     /**
      * Bind the arguments to be used when the callback function is invoked.
      *
-     * \param [in] args The arguments to pass to the invoked method.
+     * @param [in] args The arguments to pass to the invoked method.
      */
     virtual void SetArguments(Args... args) = 0;
 };
@@ -83,9 +83,9 @@
 /**
  * Make a TimerImpl from a function pointer taking varying numbers of arguments.
  *
- * \tparam U \deduced Return type of the callback function.
- * \tparam Ts \deduced Argument types of the callback function.
- * \returns The TimerImpl.
+ * @tparam U \deduced Return type of the callback function.
+ * @tparam Ts \deduced Argument types of the callback function.
+ * @returns The TimerImpl.
  */
 template <typename U, typename... Ts>
 TimerImpl*
@@ -126,13 +126,13 @@
  * Make a TimerImpl from a class method pointer taking
  * a varying number of arguments.
  *
- * \tparam OBJ_PTR \deduced Class type.
- * \tparam U \deduced Class method function return type.
- * \tparam V \deduced Class method function class type.
- * \tparam Ts \deduced Class method function argument types.
- * \param [in] memPtr Class method to invoke when the timer expires.
- * \param [in] objPtr Object instance pointer.
- * \returns The TimerImpl.
+ * @tparam OBJ_PTR \deduced Class type.
+ * @tparam U \deduced Class method function return type.
+ * @tparam V \deduced Class method function class type.
+ * @tparam Ts \deduced Class method function argument types.
+ * @param [in] memPtr Class method to invoke when the timer expires.
+ * @param [in] objPtr Object instance pointer.
+ * @returns The TimerImpl.
  */
 template <typename OBJ_PTR, typename U, typename V, typename... Ts>
 TimerImpl*
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/traced-callback.h ns-3.44/src/core/model/traced-callback.h
--- ns-3.43/src/core/model/traced-callback.h	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/model/traced-callback.h	2025-03-09 16:55:49.363371100 -0700
@@ -14,8 +14,8 @@
 #include <list>
 
 /**
- * \file
- * \ingroup tracing
+ * @file
+ * @ingroup tracing
  * ns3::TracedCallback declaration and template implementation.
  */
 
@@ -23,8 +23,8 @@
 {
 
 /**
- * \ingroup tracing
- * \brief Forward calls to a chain of Callback
+ * @ingroup tracing
+ * @brief Forward calls to a chain of Callback
  *
  * A TracedCallback has almost exactly the same API as a normal
  * Callback but instead of forwarding calls to a single function
@@ -36,7 +36,7 @@
  * calling the \c operator() form with the appropriate
  * number of arguments.
  *
- * \tparam Ts \explicit Types of the functor arguments.
+ * @tparam Ts \explicit Types of the functor arguments.
  */
 template <typename... Ts>
 class TracedCallback
@@ -47,7 +47,7 @@
     /**
      * Append a Callback to the chain (without a context).
      *
-     * \param [in] callback Callback to add to chain.
+     * @param [in] callback Callback to add to chain.
      */
     void ConnectWithoutContext(const CallbackBase& callback);
     /**
@@ -56,39 +56,39 @@
      * The context string will be provided as the first argument
      * to the Callback.
      *
-     * \param [in] callback Callback to add to chain.
-     * \param [in] path Context string to provide when invoking the Callback.
+     * @param [in] callback Callback to add to chain.
+     * @param [in] path Context string to provide when invoking the Callback.
      */
     void Connect(const CallbackBase& callback, std::string path);
     /**
      * Remove from the chain a Callback which was connected without a context.
      *
-     * \param [in] callback Callback to remove from the chain.
+     * @param [in] callback Callback to remove from the chain.
      */
     void DisconnectWithoutContext(const CallbackBase& callback);
     /**
      * Remove from the chain a Callback which was connected with a context.
      *
-     * \param [in] callback Callback to remove from the chain.
-     * \param [in] path Context path which was used to connect the Callback.
+     * @param [in] callback Callback to remove from the chain.
+     * @param [in] path Context path which was used to connect the Callback.
      */
     void Disconnect(const CallbackBase& callback, std::string path);
     /**
-     * \brief Functor which invokes the chain of Callbacks.
-     * \tparam Ts \deduced Types of the functor arguments.
-     * \param [in] args The arguments to the functor
+     * @brief Functor which invokes the chain of Callbacks.
+     * @tparam Ts \deduced Types of the functor arguments.
+     * @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.
+     * @brief Checks if the Callbacks list is empty.
+     * @return true if the Callbacks list is empty.
      */
     bool IsEmpty() const;
 
     /**
      *  TracedCallback signature for POD.
      *
-     * \param [in] value Value of the traced variable.
+     * @param [in] value Value of the traced variable.
      * @{
      */
     // Uint32Callback appears to be the only one used at the moment.
@@ -100,7 +100,7 @@
     /**
      * Container type for holding the chain of Callbacks.
      *
-     * \tparam Ts \deduced Types of the functor arguments.
+     * @tparam Ts \deduced Types of the functor arguments.
      */
     typedef std::list<Callback<void, Ts...>> CallbackList;
     /** The chain of Callbacks. */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/traced-value.h ns-3.44/src/core/model/traced-value.h
--- ns-3.43/src/core/model/traced-value.h	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/model/traced-value.h	2025-03-09 16:55:49.363371100 -0700
@@ -16,8 +16,8 @@
 #include "uinteger.h"
 
 /**
- * \file
- * \ingroup tracing
+ * @file
+ * @ingroup tracing
  * ns3::TracedValue declaration and template implementation.
  */
 
@@ -25,12 +25,12 @@
  * Logging macro for TracedValue.
  *
  * No NS_LOG_... here.  When logging is needed use something like
- * \code
+ * @code
  *   #define TRACED_VALUE_DEBUG(x)                  \
  *     std::cout << __FILE__ << ":" << __FUNCTION__    \
  *               << "(" << __LINE__ << ") "           \
  *               << x << std::endl
- * \endcode
+ * @endcode
  */
 #define TRACED_VALUE_DEBUG(x)
 
@@ -38,9 +38,9 @@
 {
 
 /**
- * \ingroup core
- * \defgroup tracing Tracing
- * \brief Publish/subscribe tools to collect and report changes to any
+ * @ingroup core
+ * @defgroup tracing Tracing
+ * @brief Publish/subscribe tools to collect and report changes to any
  *        values used by the various model components.
  *
  * Additional callback function signatures defined elsewhere:
@@ -51,22 +51,22 @@
  */
 
 /**
- * \ingroup tracing
+ * @ingroup tracing
  *
- * \brief TracedValue Callback function types.
+ * @brief TracedValue Callback function types.
  */
 namespace TracedValueCallback
 {
 
 /**
- * \name TracedValueCallback Signatures for POD.
+ * @name TracedValueCallback Signatures for POD.
  * @{
  */
 /**
  *  TracedValue Callback signature for POD.
  * @{
- * \param [in] oldValue original value of the traced variable
- * \param [in] newValue new value of the traced variable
+ * @param [in] oldValue original value of the traced variable
+ * @param [in] newValue new value of the traced variable
  */
 typedef void (*Bool)(bool oldValue, bool newValue);
 typedef void (*Int8)(int8_t oldValue, int8_t newValue);
@@ -86,9 +86,9 @@
 } // namespace TracedValueCallback
 
 /**
- * \ingroup tracing
+ * @ingroup tracing
  *
- * \brief Trace classes with value semantics
+ * @brief Trace classes with value semantics
  *
  * If you want to trace the change of value of a class or
  * primitive type which have value semantics (they _must_
@@ -98,7 +98,7 @@
  * and will define Connect/DisconnectWithoutContext methods to work
  * with MakeTraceSourceAccessor.
  *
- * \tparam T \explicit The type of the underlying value being traced.
+ * @tparam T \explicit The type of the underlying value being traced.
  */
 template <typename T>
 class TracedValue
@@ -112,7 +112,7 @@
 
     /**
      * Copy constructor.
-     * \param [in] o The value to copy.
+     * @param [in] o The value to copy.
      */
     TracedValue(const TracedValue& o)
         : m_v(o.m_v)
@@ -121,7 +121,7 @@
 
     /**
      * Construct from an explicit variable.
-     * \param [in] v The variable to trace.
+     * @param [in] v The variable to trace.
      */
     TracedValue(const T& v)
         : m_v(v)
@@ -130,7 +130,7 @@
 
     /**
      * Cast to the underlying type.
-     * \returns The underlying value.
+     * @returns The underlying value.
      */
     operator T() const
     {
@@ -139,8 +139,8 @@
 
     /**
      * Assignment.
-     * \param [in] o The value to assign to this instance.
-     * \return This TracedValue.
+     * @param [in] o The value to assign to this instance.
+     * @return This TracedValue.
      */
     TracedValue& operator=(const TracedValue& o)
     {
@@ -151,8 +151,8 @@
 
     /**
      * Copy from a TracedValue of a compatible type.
-     * \tparam U \deduced The underlying type of the other TracedValue.
-     * \param [in] other The other TracedValuet to copy.
+     * @tparam U \deduced The underlying type of the other TracedValue.
+     * @param [in] other The other TracedValuet to copy.
      */
     template <typename U>
     TracedValue(const TracedValue<U>& other)
@@ -162,8 +162,8 @@
 
     /**
      * Copy from a variable type compatible with this underlying type.
-     * \tparam U \deduced Type of the other variable.
-     * \param [in] other The other variable to copy.
+     * @tparam U \deduced Type of the other variable.
+     * @param [in] other The other variable to copy.
      */
     template <typename U>
     TracedValue(const U& other)
@@ -174,7 +174,7 @@
     /**
      * Connect a Callback (without context.)
      *
-     * \param [in] cb The callback to connect.
+     * @param [in] cb The callback to connect.
      */
     void ConnectWithoutContext(const CallbackBase& cb)
     {
@@ -187,8 +187,8 @@
      * The context string will be provided as the first argument to the
      * Callback function.
      *
-     * \param [in] cb The Callback to connect to the target trace source.
-     * \param [in] path The context to bind to the user callback.
+     * @param [in] cb The Callback to connect to the target trace source.
+     * @param [in] path The context to bind to the user callback.
      */
     void Connect(const CallbackBase& cb, std::string path)
     {
@@ -198,7 +198,7 @@
     /**
      * Disconnect a Callback which was connected without context.
      *
-     * \param [in] cb The Callback to disconnect.
+     * @param [in] cb The Callback to disconnect.
      */
     void DisconnectWithoutContext(const CallbackBase& cb)
     {
@@ -208,8 +208,8 @@
     /**
      * Disconnect a Callback which was connected with context.
      *
-     * \param [in] cb The Callback to disconnect.
-     * \param [in] path The context to bind to the user callback.
+     * @param [in] cb The Callback to disconnect.
+     * @param [in] path The context to bind to the user callback.
      */
     void Disconnect(const CallbackBase& cb, std::string path)
     {
@@ -220,7 +220,7 @@
      * Set the value of the underlying variable.
      *
      * If the new value differs from the old, the Callback will be invoked.
-     * \param [in] v The new value.
+     * @param [in] v The new value.
      */
     void Set(const T& v)
     {
@@ -233,7 +233,7 @@
 
     /**
      * Get the underlying value.
-     * \returns The value.
+     * @returns The value.
      */
     T Get() const
     {
@@ -244,7 +244,7 @@
      * Pre/post- increment/decrement operator.
      *
      * This invokes the Callback.
-     * \returns This TracedValue.
+     * @returns This TracedValue.
      */
     /**@{*/
     TracedValue& operator++()
@@ -299,7 +299,7 @@
  ********************************************************************/
 
 /**
- * \ingroup tracing
+ * @ingroup tracing
  */
 /**@{*/
 /**
@@ -307,10 +307,10 @@
  *
  * The underlying value will be written to the stream.
  *
- * \tparam T \deduced The underlying type of the TracedValue.
- * \param [in,out] os The output stream.
- * \param [in] rhs The TracedValue to stream.
- * \returns The stream.
+ * @tparam T \deduced The underlying type of the TracedValue.
+ * @param [in,out] os The output stream.
+ * @param [in] rhs The TracedValue to stream.
+ * @returns The stream.
  */
 template <typename T>
 std::ostream&
@@ -321,11 +321,11 @@
 
 /**
  * Boolean operator for TracedValue.
- * \tparam T \deduced The underlying type held by the left-hand argument.
- * \tparam U \deduced The underlying type held by the right-hand argument.
- * \param [in] lhs The left-hand argument.
- * \param [in] rhs The right-hand argument.
- * \returns The Boolean result of comparing the underlying values.
+ * @tparam T \deduced The underlying type held by the left-hand argument.
+ * @tparam U \deduced The underlying type held by the right-hand argument.
+ * @param [in] lhs The left-hand argument.
+ * @param [in] rhs The right-hand argument.
+ * @returns The Boolean result of comparing the underlying values.
  */
 template <typename T, typename U>
 bool
@@ -335,7 +335,7 @@
     return lhs.Get() == rhs.Get();
 }
 
-/** \copydoc operator==(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
+/** @copydoc operator==(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
 template <typename T, typename U>
 bool
 operator==(const TracedValue<T>& lhs, const U& rhs)
@@ -344,7 +344,7 @@
     return lhs.Get() == rhs;
 }
 
-/** \copydoc operator==(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
+/** @copydoc operator==(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
 template <typename T, typename U>
 bool
 operator==(const U& lhs, const TracedValue<T>& rhs)
@@ -353,7 +353,7 @@
     return lhs == rhs.Get();
 }
 
-/** \copydoc operator==(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
+/** @copydoc operator==(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
 template <typename T, typename U>
 bool
 operator!=(const TracedValue<T>& lhs, const TracedValue<U>& rhs)
@@ -362,7 +362,7 @@
     return lhs.Get() != rhs.Get();
 }
 
-/** \copydoc operator==(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
+/** @copydoc operator==(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
 template <typename T, typename U>
 bool
 operator!=(const TracedValue<T>& lhs, const U& rhs)
@@ -371,7 +371,7 @@
     return lhs.Get() != rhs;
 }
 
-/** \copydoc operator==(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
+/** @copydoc operator==(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
 template <typename T, typename U>
 bool
 operator!=(const U& lhs, const TracedValue<T>& rhs)
@@ -380,7 +380,7 @@
     return lhs != rhs.Get();
 }
 
-/** \copydoc operator==(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
+/** @copydoc operator==(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
 template <typename T, typename U>
 bool
 operator<=(const TracedValue<T>& lhs, const TracedValue<U>& rhs)
@@ -389,7 +389,7 @@
     return lhs.Get() <= rhs.Get();
 }
 
-/** \copydoc operator==(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
+/** @copydoc operator==(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
 template <typename T, typename U>
 bool
 operator<=(const TracedValue<T>& lhs, const U& rhs)
@@ -398,7 +398,7 @@
     return lhs.Get() <= rhs;
 }
 
-/** \copydoc operator==(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
+/** @copydoc operator==(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
 template <typename T, typename U>
 bool
 operator<=(const U& lhs, const TracedValue<T>& rhs)
@@ -407,7 +407,7 @@
     return lhs <= rhs.Get();
 }
 
-/** \copydoc operator==(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
+/** @copydoc operator==(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
 template <typename T, typename U>
 bool
 operator>=(const TracedValue<T>& lhs, const TracedValue<U>& rhs)
@@ -416,7 +416,7 @@
     return lhs.Get() >= rhs.Get();
 }
 
-/** \copydoc operator==(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
+/** @copydoc operator==(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
 template <typename T, typename U>
 bool
 operator>=(const TracedValue<T>& lhs, const U& rhs)
@@ -425,7 +425,7 @@
     return lhs.Get() >= rhs;
 }
 
-/** \copydoc operator==(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
+/** @copydoc operator==(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
 template <typename T, typename U>
 bool
 operator>=(const U& lhs, const TracedValue<T>& rhs)
@@ -434,7 +434,7 @@
     return lhs >= rhs.Get();
 }
 
-/** \copydoc operator==(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
+/** @copydoc operator==(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
 template <typename T, typename U>
 bool
 operator<(const TracedValue<T>& lhs, const TracedValue<U>& rhs)
@@ -443,7 +443,7 @@
     return lhs.Get() < rhs.Get();
 }
 
-/** \copydoc operator==(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
+/** @copydoc operator==(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
 template <typename T, typename U>
 bool
 operator<(const TracedValue<T>& lhs, const U& rhs)
@@ -452,7 +452,7 @@
     return lhs.Get() < rhs;
 }
 
-/** \copydoc operator==(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
+/** @copydoc operator==(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
 template <typename T, typename U>
 bool
 operator<(const U& lhs, const TracedValue<T>& rhs)
@@ -461,7 +461,7 @@
     return lhs < rhs.Get();
 }
 
-/** \copydoc operator==(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
+/** @copydoc operator==(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
 template <typename T, typename U>
 bool
 operator>(const TracedValue<T>& lhs, const TracedValue<U>& rhs)
@@ -470,7 +470,7 @@
     return lhs.Get() > rhs.Get();
 }
 
-/** \copydoc operator==(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
+/** @copydoc operator==(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
 template <typename T, typename U>
 bool
 operator>(const TracedValue<T>& lhs, const U& rhs)
@@ -479,7 +479,7 @@
     return lhs.Get() > rhs;
 }
 
-/** \copydoc operator==(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
+/** @copydoc operator==(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
 template <typename T, typename U>
 bool
 operator>(const U& lhs, const TracedValue<T>& rhs)
@@ -494,11 +494,11 @@
  * This returns the arithmetic result in a new TracedValue,
  * which has no Callback connected.
  *
- * \tparam T \deduced The underlying type held by the left-hand argument.
- * \tparam U \deduced The underlying type held by the right-hand argument.
- * \param [in] lhs The left-hand argument.
- * \param [in] rhs The right-hand argument.
- * \returns The result of doing the operator on
+ * @tparam T \deduced The underlying type held by the left-hand argument.
+ * @tparam U \deduced The underlying type held by the right-hand argument.
+ * @param [in] lhs The left-hand argument.
+ * @param [in] rhs The right-hand argument.
+ * @returns The result of doing the operator on
  *     the underlying values.
  */
 template <typename T, typename U>
@@ -510,7 +510,7 @@
     return TracedValue<decltype(lhs.Get() + rhs.Get())>(lhs.Get() + rhs.Get());
 }
 
-/** \copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
+/** @copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
 template <typename T, typename U>
 auto
 operator+(const TracedValue<T>& lhs, const U& rhs) -> TracedValue<decltype(lhs.Get() + rhs)>
@@ -519,7 +519,7 @@
     return TracedValue<decltype(lhs.Get() + rhs)>(lhs.Get() + rhs);
 }
 
-/** \copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
+/** @copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
 template <typename T, typename U>
 auto
 operator+(const U& lhs, const TracedValue<T>& rhs) -> TracedValue<decltype(lhs + rhs.Get())>
@@ -528,7 +528,7 @@
     return TracedValue<decltype(lhs + rhs.Get())>(lhs + rhs.Get());
 }
 
-/** \copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
+/** @copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
 template <typename T, typename U>
 auto
 operator-(const TracedValue<T>& lhs, const TracedValue<U>& rhs)
@@ -538,7 +538,7 @@
     return TracedValue<decltype(lhs.Get() - rhs.Get())>(lhs.Get() - rhs.Get());
 }
 
-/** \copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
+/** @copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
 template <typename T, typename U>
 auto
 operator-(const TracedValue<T>& lhs, const U& rhs) -> TracedValue<decltype(lhs.Get() - rhs)>
@@ -547,7 +547,7 @@
     return TracedValue<decltype(lhs.Get() - rhs)>(lhs.Get() - rhs);
 }
 
-/** \copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
+/** @copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
 template <typename T, typename U>
 auto
 operator-(const U& lhs, const TracedValue<T>& rhs) -> TracedValue<decltype(lhs - rhs.Get())>
@@ -556,7 +556,7 @@
     return TracedValue<decltype(lhs - rhs.Get())>(lhs - rhs.Get());
 }
 
-/** \copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
+/** @copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
 template <typename T, typename U>
 auto
 operator*(const TracedValue<T>& lhs, const TracedValue<U>& rhs)
@@ -566,7 +566,7 @@
     return TracedValue<decltype(lhs.Get() * rhs.Get())>(lhs.Get() * rhs.Get());
 }
 
-/** \copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
+/** @copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
 template <typename T, typename U>
 auto
 operator*(const TracedValue<T>& lhs, const U& rhs) -> TracedValue<decltype(lhs.Get() * rhs)>
@@ -575,7 +575,7 @@
     return TracedValue<decltype(lhs.Get() * rhs)>(lhs.Get() * rhs);
 }
 
-/** \copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
+/** @copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
 template <typename T, typename U>
 auto
 operator*(const U& lhs, const TracedValue<T>& rhs) -> TracedValue<decltype(lhs + rhs.Get())>
@@ -584,7 +584,7 @@
     return TracedValue<decltype(lhs + rhs.Get())>(lhs * rhs.Get());
 }
 
-/** \copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
+/** @copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
 template <typename T, typename U>
 auto
 operator/(const TracedValue<T>& lhs, const TracedValue<U>& rhs)
@@ -594,7 +594,7 @@
     return TracedValue<decltype(lhs.Get() / rhs.Get())>(lhs.Get() / rhs.Get());
 }
 
-/** \copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
+/** @copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
 template <typename T, typename U>
 auto
 operator/(const TracedValue<T>& lhs, const U& rhs) -> TracedValue<decltype(lhs.Get() / rhs)>
@@ -603,7 +603,7 @@
     return TracedValue<decltype(lhs.Get() / rhs)>(lhs.Get() / rhs);
 }
 
-/** \copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
+/** @copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
 template <typename T, typename U>
 auto
 operator/(const U& lhs, const TracedValue<T>& rhs) -> TracedValue<decltype(lhs / rhs.Get())>
@@ -612,7 +612,7 @@
     return TracedValue<decltype(lhs / rhs.Get())>(lhs / rhs.Get());
 }
 
-/** \copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
+/** @copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
 template <typename T, typename U>
 auto
 operator%(const TracedValue<T>& lhs, const TracedValue<U>& rhs)
@@ -622,7 +622,7 @@
     return TracedValue<decltype(lhs.Get() % rhs.Get())>(lhs.Get() % rhs.Get());
 }
 
-/** \copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
+/** @copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
 template <typename T, typename U>
 auto
 operator%(const TracedValue<T>& lhs, const U& rhs) -> TracedValue<decltype(lhs.Get() % rhs)>
@@ -631,7 +631,7 @@
     return TracedValue<decltype(lhs.Get() % rhs)>(lhs.Get() % rhs);
 }
 
-/** \copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
+/** @copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
 template <typename T, typename U>
 auto
 operator%(const U& lhs, const TracedValue<T>& rhs) -> TracedValue<decltype(lhs % rhs.Get())>
@@ -640,7 +640,7 @@
     return TracedValue<decltype(lhs % rhs.Get())>(lhs % rhs.Get());
 }
 
-/** \copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
+/** @copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
 template <typename T, typename U>
 auto
 operator^(const TracedValue<T>& lhs, const TracedValue<U>& rhs)
@@ -650,7 +650,7 @@
     return TracedValue<decltype(lhs.Get() ^ rhs.Get())>(lhs.Get() ^ rhs.Get());
 }
 
-/** \copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
+/** @copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
 template <typename T, typename U>
 auto
 operator^(const TracedValue<T>& lhs, const U& rhs) -> TracedValue<decltype(lhs.Get() ^ rhs)>
@@ -659,7 +659,7 @@
     return TracedValue<decltype(lhs.Get() ^ rhs)>(lhs.Get() ^ rhs);
 }
 
-/** \copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
+/** @copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
 template <typename T, typename U>
 auto
 operator^(const U& lhs, const TracedValue<T>& rhs) -> TracedValue<decltype(lhs ^ rhs.Get())>
@@ -668,7 +668,7 @@
     return TracedValue<decltype(lhs ^ rhs.Get())>(lhs ^ rhs.Get());
 }
 
-/** \copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
+/** @copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
 template <typename T, typename U>
 auto
 operator|(const TracedValue<T>& lhs, const TracedValue<U>& rhs)
@@ -678,7 +678,7 @@
     return TracedValue<decltype(lhs.Get() | rhs.Get())>(lhs.Get() | rhs.Get());
 }
 
-/** \copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
+/** @copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
 template <typename T, typename U>
 auto
 operator|(const TracedValue<T>& lhs, const U& rhs) -> TracedValue<decltype(lhs.Get() | rhs)>
@@ -687,7 +687,7 @@
     return TracedValue<decltype(lhs.Get() | rhs)>(lhs.Get() | rhs);
 }
 
-/** \copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
+/** @copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
 template <typename T, typename U>
 auto
 operator|(const U& lhs, const TracedValue<T>& rhs) -> TracedValue<decltype(lhs | rhs.Get())>
@@ -696,7 +696,7 @@
     return TracedValue<decltype(lhs | rhs.Get())>(lhs | rhs.Get());
 }
 
-/** \copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
+/** @copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
 template <typename T, typename U>
 auto
 operator&(const TracedValue<T>& lhs, const TracedValue<U>& rhs)
@@ -706,7 +706,7 @@
     return TracedValue<decltype(lhs.Get() & rhs.Get())>(lhs.Get() & rhs.Get());
 }
 
-/** \copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
+/** @copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
 template <typename T, typename U>
 auto
 operator&(const TracedValue<T>& lhs, const U& rhs) -> TracedValue<decltype(lhs.Get() & rhs)>
@@ -715,7 +715,7 @@
     return TracedValue<decltype(lhs.Get() & rhs)>(lhs.Get() & rhs);
 }
 
-/** \copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
+/** @copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
 template <typename T, typename U>
 auto
 operator&(const U& lhs, const TracedValue<T>& rhs) -> TracedValue<decltype(lhs & rhs.Get())>
@@ -724,7 +724,7 @@
     return TracedValue<decltype(lhs & rhs.Get())>(lhs & rhs.Get());
 }
 
-/** \copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
+/** @copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
 template <typename T, typename U>
 auto
 operator<<(const TracedValue<T>& lhs, const TracedValue<U>& rhs)
@@ -734,7 +734,7 @@
     return TracedValue<decltype(lhs.Get() << rhs.Get())>(lhs.Get() << rhs.Get());
 }
 
-/** \copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
+/** @copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
 template <typename T, typename U>
 auto
 operator<<(const TracedValue<T>& lhs, const U& rhs) -> TracedValue<decltype(lhs.Get() << rhs)>
@@ -743,7 +743,7 @@
     return TracedValue<decltype(lhs.Get() << rhs)>(lhs.Get() << rhs);
 }
 
-/** \copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
+/** @copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
 template <typename T, typename U>
 auto
 operator<<(const U& lhs, const TracedValue<T>& rhs) -> TracedValue<decltype(lhs << rhs.Get())>
@@ -752,7 +752,7 @@
     return TracedValue<decltype(lhs << rhs.Get())>(lhs << rhs.Get());
 }
 
-/** \copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
+/** @copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
 template <typename T, typename U>
 auto
 operator>>(const TracedValue<T>& lhs, const TracedValue<U>& rhs)
@@ -762,7 +762,7 @@
     return TracedValue<decltype(lhs.Get() >> rhs.Get())>(lhs.Get() >> rhs.Get());
 }
 
-/** \copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
+/** @copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
 template <typename T, typename U>
 auto
 operator>>(const TracedValue<T>& lhs, const U& rhs) -> TracedValue<decltype(lhs.Get() >> rhs)>
@@ -771,7 +771,7 @@
     return TracedValue<decltype(lhs.Get() >> rhs)>(lhs.Get() >> rhs);
 }
 
-/** \copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
+/** @copydoc operator+(const TracedValue<T>&lhs,const TracedValue<U>&rhs) */
 template <typename T, typename U>
 auto
 operator>>(const U& lhs, const TracedValue<T>& rhs) -> TracedValue<decltype(lhs >> rhs.Get())>
@@ -787,11 +787,11 @@
  * is assigned to the \c lhs TracedValue.  If the new value
  * is different, the Callback will be invoked.
  *
- * \tparam T \deduced The underlying type held by the left-hand argument.
- * \tparam U \deduced The underlying type held by the right-hand argument.
- * \param [in] lhs The left-hand argument.
- * \param [in] rhs The right-hand argument.
- * \returns The result of doing the operator on
+ * @tparam T \deduced The underlying type held by the left-hand argument.
+ * @tparam U \deduced The underlying type held by the right-hand argument.
+ * @param [in] lhs The left-hand argument.
+ * @param [in] rhs The right-hand argument.
+ * @returns The result of doing the operator on
  *     the underlying values.
  */
 template <typename T, typename U>
@@ -805,7 +805,7 @@
     return lhs;
 }
 
-/** \copydoc operator+=(TracedValue<T>&lhs,const U&rhs) */
+/** @copydoc operator+=(TracedValue<T>&lhs,const U&rhs) */
 template <typename T, typename U>
 TracedValue<T>&
 operator-=(TracedValue<T>& lhs, const U& rhs)
@@ -817,7 +817,7 @@
     return lhs;
 }
 
-/** \copydoc operator+=(TracedValue<T>&lhs,const U&rhs) */
+/** @copydoc operator+=(TracedValue<T>&lhs,const U&rhs) */
 template <typename T, typename U>
 TracedValue<T>&
 operator*=(TracedValue<T>& lhs, const U& rhs)
@@ -829,7 +829,7 @@
     return lhs;
 }
 
-/** \copydoc operator+=(TracedValue<T>&lhs,const U&rhs) */
+/** @copydoc operator+=(TracedValue<T>&lhs,const U&rhs) */
 template <typename T, typename U>
 TracedValue<T>&
 operator/=(TracedValue<T>& lhs, const U& rhs)
@@ -841,7 +841,7 @@
     return lhs;
 }
 
-/** \copydoc operator+=(TracedValue<T>&lhs,const U&rhs) */
+/** @copydoc operator+=(TracedValue<T>&lhs,const U&rhs) */
 template <typename T, typename U>
 TracedValue<T>&
 operator%=(TracedValue<T>& lhs, const U& rhs)
@@ -853,7 +853,7 @@
     return lhs;
 }
 
-/** \copydoc operator+=(TracedValue<T>&lhs,const U&rhs) */
+/** @copydoc operator+=(TracedValue<T>&lhs,const U&rhs) */
 template <typename T, typename U>
 TracedValue<T>&
 operator<<=(TracedValue<T>& lhs, const U& rhs)
@@ -865,7 +865,7 @@
     return lhs;
 }
 
-/** \copydoc operator+=(TracedValue<T>&lhs,const U&rhs) */
+/** @copydoc operator+=(TracedValue<T>&lhs,const U&rhs) */
 template <typename T, typename U>
 TracedValue<T>&
 operator>>=(TracedValue<T>& lhs, const U& rhs)
@@ -877,7 +877,7 @@
     return lhs;
 }
 
-/** \copydoc operator+=(TracedValue<T>&lhs,const U&rhs) */
+/** @copydoc operator+=(TracedValue<T>&lhs,const U&rhs) */
 template <typename T, typename U>
 TracedValue<T>&
 operator&=(TracedValue<T>& lhs, const U& rhs)
@@ -889,7 +889,7 @@
     return lhs;
 }
 
-/** \copydoc operator+=(TracedValue<T>&lhs,const U&rhs) */
+/** @copydoc operator+=(TracedValue<T>&lhs,const U&rhs) */
 template <typename T, typename U>
 TracedValue<T>&
 operator|=(TracedValue<T>& lhs, const U& rhs)
@@ -901,7 +901,7 @@
     return lhs;
 }
 
-/** \copydoc operator+=(TracedValue<T>&lhs,const U&rhs) */
+/** @copydoc operator+=(TracedValue<T>&lhs,const U&rhs) */
 template <typename T, typename U>
 TracedValue<T>&
 operator^=(TracedValue<T>& lhs, const U& rhs)
@@ -916,9 +916,9 @@
 /**
  * Unary arithmetic operator for TracedValue.
  *
- * \tparam T \deduced The underlying type held by the TracedValue.
- * \param [in] lhs The TracedValue.
- * \returns The result of doing the operator on
+ * @tparam T \deduced The underlying type held by the TracedValue.
+ * @param [in] lhs The TracedValue.
+ * @returns The result of doing the operator on
  *     the underlying values.
  */
 template <typename T>
@@ -929,7 +929,7 @@
     return TracedValue<T>(+lhs.Get());
 }
 
-/** \copydoc operator+(const TracedValue<T>&lhs) */
+/** @copydoc operator+(const TracedValue<T>&lhs) */
 template <typename T>
 TracedValue<T>
 operator-(const TracedValue<T>& lhs)
@@ -938,7 +938,7 @@
     return TracedValue<T>(-lhs.Get());
 }
 
-/** \copydoc operator+(const TracedValue<T>&lhs) */
+/** @copydoc operator+(const TracedValue<T>&lhs) */
 template <typename T>
 TracedValue<T>
 operator~(const TracedValue<T>& lhs)
@@ -947,7 +947,7 @@
     return TracedValue<T>(~lhs.Get());
 }
 
-/** \copydoc operator+(const TracedValue<T>&lhs) */
+/** @copydoc operator+(const TracedValue<T>&lhs) */
 template <typename T>
 TracedValue<T>
 operator!(const TracedValue<T>& lhs)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/trace-source-accessor.cc ns-3.44/src/core/model/trace-source-accessor.cc
--- ns-3.43/src/core/model/trace-source-accessor.cc	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/model/trace-source-accessor.cc	2025-03-09 16:55:49.363371100 -0700
@@ -10,8 +10,8 @@
 #include "log.h"
 
 /**
- * \file
- * \ingroup tracing
+ * @file
+ * @ingroup tracing
  * ns3::TraceSourceAccessor implementation (constructor and destructor).
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/trace-source-accessor.h ns-3.44/src/core/model/trace-source-accessor.h
--- ns-3.43/src/core/model/trace-source-accessor.h	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/model/trace-source-accessor.h	2025-03-09 16:55:49.363371100 -0700
@@ -15,8 +15,8 @@
 #include <stdint.h>
 
 /**
- * \file
- * \ingroup tracing
+ * @file
+ * @ingroup tracing
  * ns3::TraceSourceAccessor and ns3::MakeTraceSourceAccessor declarations.
  */
 
@@ -26,9 +26,9 @@
 class ObjectBase;
 
 /**
- * \ingroup tracing
+ * @ingroup tracing
  *
- * \brief Control access to objects' trace sources.
+ * @brief Control access to objects' trace sources.
  *
  * This class abstracts the kind of trace source to which we want to connect
  * and provides services to Connect and Disconnect a sink to a trace source.
@@ -44,9 +44,9 @@
     /**
      * Connect a Callback to a TraceSource (without context.)
      *
-     * \param [in] obj The object instance which contains the target trace source.
-     * \param [in] cb The callback to connect to the target trace source.
-     * \return \c true unless the connection could not be made, typically because
+     * @param [in] obj The object instance which contains the target trace source.
+     * @param [in] cb The callback to connect to the target trace source.
+     * @return \c true unless the connection could not be made, typically because
      *         the \c obj couldn't be cast to the correct type.
      */
     virtual bool ConnectWithoutContext(ObjectBase* obj, const CallbackBase& cb) const = 0;
@@ -56,19 +56,19 @@
      * The context string will be provided as the first argument to the
      * Callback function.
      *
-     * \param [in] obj The object instance which contains the target trace source.
-     * \param [in] context The context to bind to the user callback.
-     * \param [in] cb The callback to connect to the target trace source.
-     * \return \c true unless the connection could not be made, typically because
+     * @param [in] obj The object instance which contains the target trace source.
+     * @param [in] context The context to bind to the user callback.
+     * @param [in] cb The callback to connect to the target trace source.
+     * @return \c true unless the connection could not be made, typically because
      *         the \c obj couldn't be cast to the correct type.
      */
     virtual bool Connect(ObjectBase* obj, std::string context, const CallbackBase& cb) const = 0;
     /**
      * Disconnect a Callback from a TraceSource (without context).
      *
-     * \param [in] obj The object instance which contains the target trace source.
-     * \param [in] cb The callback to disconnect from the target trace source.
-     * \return \c true unless the connection could not be made, typically because
+     * @param [in] obj The object instance which contains the target trace source.
+     * @param [in] cb The callback to disconnect from the target trace source.
+     * @return \c true unless the connection could not be made, typically because
      *         the \c obj couldn't be cast to the correct type.
      */
     virtual bool DisconnectWithoutContext(ObjectBase* obj, const CallbackBase& cb) const = 0;
@@ -78,17 +78,17 @@
      * The context string will be provided as the first argument to the
      * Callback function.
      *
-     * \param [in] obj the object instance which contains the target trace source.
-     * \param [in] context the context which was bound to the user callback.
-     * \param [in] cb the callback to disconnect from the target trace source.
-     * \return \c true unless the connection could not be made, typically because
+     * @param [in] obj the object instance which contains the target trace source.
+     * @param [in] context the context which was bound to the user callback.
+     * @param [in] cb the callback to disconnect from the target trace source.
+     * @return \c true unless the connection could not be made, typically because
      *         the \c obj couldn't be cast to the correct type.
      */
     virtual bool Disconnect(ObjectBase* obj, std::string context, const CallbackBase& cb) const = 0;
 };
 
 /**
- * \ingroup tracing
+ * @ingroup tracing
  *
  * Create a TraceSourceAccessor which will control access to the underlying
  * trace source.
@@ -99,18 +99,18 @@
  * static-polymorphic class.  This functionality is typically provided
  * by wrapping an object data member in a TracedCallback or TracedValue.
  *
- * \param [in] a The trace source
- * \returns The TraceSourceAccessor
+ * @param [in] a The trace source
+ * @returns The TraceSourceAccessor
  */
 template <typename T>
 Ptr<const TraceSourceAccessor> MakeTraceSourceAccessor(T a);
 
 /**
- * \ingroup tracing
+ * @ingroup tracing
  *
  * Create an empty TraceSourceAccessor.
  *
- * \returns The empty TraceSourceAccessor (runtime exception if used)
+ * @returns The empty TraceSourceAccessor (runtime exception if used)
  */
 static inline Ptr<const TraceSourceAccessor>
 MakeEmptyTraceSourceAccessor()
@@ -128,13 +128,13 @@
 {
 
 /**
- * \ingroup tracing
+ * @ingroup tracing
  * MakeTraceSourceAccessor() implementation.
  *
- * \tparam T \deduced Class type of the TracedCallback
- * \tparam SOURCE \deduced Type of the underlying value.
- * \param [in] a The underlying data value.
- * \returns The TraceSourceAccessor
+ * @tparam T \deduced Class type of the TracedCallback
+ * @tparam SOURCE \deduced Type of the underlying value.
+ * @param [in] a The underlying data value.
+ * @returns The TraceSourceAccessor
  */
 template <typename T, typename SOURCE>
 Ptr<const TraceSourceAccessor>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/trickle-timer.cc ns-3.44/src/core/model/trickle-timer.cc
--- ns-3.43/src/core/model/trickle-timer.cc	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/model/trickle-timer.cc	2025-03-09 16:55:49.363371100 -0700
@@ -150,7 +150,7 @@
     uint64_t randomInt;
     double random;
 
-    NS_ASSERT_MSG(m_minInterval != Time(0), "Timer not initialized");
+    NS_ASSERT_MSG(!m_minInterval.IsZero(), "Timer not initialized");
 
     randomInt = m_uniRand->GetInteger(1, m_ticks);
     random = randomInt;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/trickle-timer.h ns-3.44/src/core/model/trickle-timer.h
--- ns-3.43/src/core/model/trickle-timer.h	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/model/trickle-timer.h	2025-03-09 16:55:49.363371100 -0700
@@ -14,8 +14,8 @@
 #include "random-variable-stream.h"
 
 /**
- * \file
- * \ingroup timer
+ * @file
+ * @ingroup timer
  * ns3::TrickleTimer timer class declaration.
  */
 
@@ -30,8 +30,8 @@
 } // namespace internal
 
 /**
- * \ingroup timer
- * \brief A Trickle Timer following \RFC{6206}.
+ * @ingroup timer
+ * @brief A Trickle Timer following \RFC{6206}.
  *
  * A Trickle Timer is a timer that varies its frequency between a minimum
  * and a maximum, depending on events. It is typically used to exchange
@@ -75,9 +75,9 @@
      *
      * The maximum interval is set to std::exp2 (doublings) * minInterval.
      *
-     * \param minInterval Minimum interval.
-     * \param doublings Number of doublings to reach the maximum interval.
-     * \param redundancy Redundancy constant.
+     * @param minInterval Minimum interval.
+     * @param doublings Number of doublings to reach the maximum interval.
+     * @param redundancy Redundancy constant.
      *
      * A zero value in the redundancy constant means that the suppression
      * algorithm is disabled.
@@ -91,19 +91,19 @@
     /**
      * Assigns the stream number for the uniform random number generator to use
      *
-     * \param streamNum first stream index to use
-     * \return the number of stream indices assigned by this helper
+     * @param streamNum first stream index to use
+     * @return the number of stream indices assigned by this helper
      */
     int64_t AssignStreams(int64_t streamNum);
 
     /**
-     * \brief Set the timer parameters.
+     * @brief Set the timer parameters.
      *
      * The maximum interval is set to std::exp2 (doublings) * minInterval.
      *
-     * \param minInterval Minimum interval.
-     * \param doublings Number of doublings to reach the maximum interval.
-     * \param redundancy Redundancy constant.
+     * @param minInterval Minimum interval.
+     * @param doublings Number of doublings to reach the maximum interval.
+     * @param redundancy Redundancy constant.
      *
      * A zero value in the redundancy constant means that the suppression
      * algorithm is disabled.
@@ -112,67 +112,67 @@
     void SetParameters(Time minInterval, uint8_t doublings, uint16_t redundancy);
 
     /**
-     * \brief Get the MinInterval of the timer.
-     * \return The MinInterval
+     * @brief Get the MinInterval of the timer.
+     * @return The MinInterval
      */
     Time GetMinInterval() const;
 
     /**
-     * \brief Get the MaxInterval of the timer.
+     * @brief Get the MaxInterval of the timer.
      *
      * The timer MaxInterval is always std::exp2 (doublings) * minInterval
-     * \return The MaxInterval
+     * @return The MaxInterval
      */
     Time GetMaxInterval() const;
 
     /**
-     * \brief Get the doublings of the timer.
-     * \return The doublings
+     * @brief Get the doublings of the timer.
+     * @return The doublings
      */
     uint8_t GetDoublings() const;
 
     /**
-     * \brief Get the Redundancy constant of the timer.
-     * \return The Redundancy
+     * @brief Get the Redundancy constant of the timer.
+     * @return The Redundancy
      */
     uint16_t GetRedundancy() const;
 
     /**
-     * \returns The amount of time left until this timer expires.
+     * @returns The amount of time left until this timer expires.
      *
      * This method returns zero if the timer has never been started.
      */
     Time GetDelayLeft() const;
 
     /**
-     * \returns The amount of time left until this timer interval expires.
+     * @returns The amount of time left until this timer interval expires.
      *
      * This method returns zero if the timer has never been started.
      */
     Time GetIntervalLeft() const;
 
     /**
-     * \brief Enable the timer.
+     * @brief Enable the timer.
      */
     void Enable();
 
     /**
-     * \brief Records a consistent event.
+     * @brief Records a consistent event.
      */
     void ConsistentEvent();
 
     /**
-     * \brief Records an inconsistent event.
+     * @brief Records an inconsistent event.
      */
     void InconsistentEvent();
 
     /**
-     * \brief Reset the timer.
+     * @brief Reset the timer.
      */
     void Reset();
 
     /**
-     * \brief Stop the timer.
+     * @brief Stop the timer.
      *
      * This will reset the timer and cancel all the pending events.
      */
@@ -181,8 +181,8 @@
     /**
      * Set the function to execute when the timer expires.
      *
-     * \tparam FN \deduced The type of the function.
-     * \param [in] fn The function
+     * @tparam FN \deduced The type of the function.
+     * @param [in] fn The function
      *
      * Store this function in this Timer for later use by Timer::Schedule.
      */
@@ -192,10 +192,10 @@
     /**
      * Set the function to execute when the timer expires.
      *
-     * \tparam MEM_PTR \deduced Class method function type.
-     * \tparam OBJ_PTR \deduced Class type containing the function.
-     * \param [in] memPtr The member function pointer
-     * \param [in] objPtr The pointer to object
+     * @tparam MEM_PTR \deduced Class method function type.
+     * @tparam OBJ_PTR \deduced Class type containing the function.
+     * @param [in] memPtr The member function pointer
+     * @param [in] objPtr The pointer to object
      *
      * Store this function and object in this Timer for later use by Timer::Schedule.
      */
@@ -207,8 +207,8 @@
      */
     /**@{*/
     /**
-     * \tparam Ts \deduced Argument types.
-     * \param [in] args arguments
+     * @tparam Ts \deduced Argument types.
+     * @param [in] args arguments
      */
     template <typename... Ts>
     void SetArguments(Ts&&... args);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/tuple.h ns-3.44/src/core/model/tuple.h
--- ns-3.43/src/core/model/tuple.h	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/model/tuple.h	2025-03-09 16:55:49.363371100 -0700
@@ -22,16 +22,16 @@
 {
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  * See https://en.cppreference.com/w/cpp/utility/apply
  *
  * Prints tuple values separated by a comma. E.g., if the tuple contains
  * v1, v2 and v3, then "v1, v2, v3" will be added to the stream.
  *
- * \tparam Args \deduced Tuple arguments
- * \param os the output stream
- * \param t the tuple
- * \returns a reference to the stream
+ * @tparam Args \deduced Tuple arguments
+ * @param os the output stream
+ * @param t the tuple
+ * @returns a reference to the stream
  */
 template <class... Args>
 std::ostream&
@@ -47,20 +47,20 @@
 }
 
 /**
- * \ingroup attributes
- * \defgroup attribute_Tuple Tuple Attribute
+ * @ingroup attributes
+ * @defgroup attribute_Tuple Tuple Attribute
  * AttributeValue implementation for Tuple
  */
 
 /**
- * \ingroup attribute_Tuple
+ * @ingroup attribute_Tuple
  *
  * AttributeValue implementation for Tuple.
  *
  * Hold objects of type std::tuple<Args...>.
- * \tparam Args \explicit The list of AttributeValues to be held by this TupleValue
+ * @tparam Args \explicit The list of AttributeValues to be held by this TupleValue
  *
- * \see AttributeValue
+ * @see AttributeValue
  */
 template <class... Args>
 class TupleValue : public AttributeValue
@@ -76,7 +76,7 @@
     /**
      * Construct this TupleValue from a std::tuple
      *
-     * \param [in] value Value with which to construct.
+     * @param [in] value Value with which to construct.
      */
     TupleValue(const result_type& value);
 
@@ -89,29 +89,29 @@
      *
      * This differs from the actual value stored in the object which is
      * a tuple of Ptr<AV> where AV is a class derived from AttributeValue.
-     * \return stored values as a std::tuple
+     * @return stored values as a std::tuple
      */
     result_type Get() const;
     /**
      * Set the stored values.
      *
-     * \param value The stored value
+     * @param value The stored value
      */
     void Set(const result_type& value);
 
     /**
      * Get the attribute values as a tuple.
-     * \return the attribute values as a tuple
+     * @return the attribute values as a tuple
      */
     value_type GetValue() const;
 
     /**
      * Set the given variable to the values stored by this TupleValue object.
      *
-     * \tparam T \deduced the type of the given variable (normally, the argument type
+     * @tparam T \deduced the type of the given variable (normally, the argument type
      *           of a set method or the type of a data member)
-     * \param [out] value The stored value
-     * \return true if the given variable was set
+     * @param [out] value The stored value
+     * @return true if the given variable was set
      */
     template <typename T>
     bool GetAccessor(T& value) const;
@@ -121,9 +121,9 @@
      * Set the attribute values starting from the given values.
      * Used by DeserializeFromString method.
      *
-     * \tparam Is \deduced index sequence
-     * \param values the given attribute values
-     * \return true if the attribute values of this object were set
+     * @tparam Is \deduced index sequence
+     * @param values the given attribute values
+     * @return true if the attribute values of this object were set
      */
     template <std::size_t... Is>
     bool SetValueImpl(std::index_sequence<Is...>, const std::vector<Ptr<AttributeValue>>& values);
@@ -132,27 +132,27 @@
 };
 
 /**
- * \ingroup attribute_Tuple
+ * @ingroup attribute_Tuple
  *
  * Create a TupleValue object. Enable to write code like this snippet:
  *
- * \code
+ * @code
  * typedef std::tuple<uint16_t, double> Tuple;
  * typedef std::tuple<UintegerValue, DoubleValue> Pack;
  *
  * TupleValue<UintegerValue, DoubleValue> t = MakeTupleValue<Pack> (Tuple {10, 1.5});
- * \endcode
+ * @endcode
  *
- * \tparam T1 \explicit A std::tuple of the AttributeValue types included in TupleValue
- * \tparam T2 \deduced A std::tuple of the type of elements stored by TupleValue
- * \param t the tuple of elements stored by TupleValue
- * \return a TupleValue object
+ * @tparam T1 \explicit A std::tuple of the AttributeValue types included in TupleValue
+ * @tparam T2 \deduced A std::tuple of the type of elements stored by TupleValue
+ * @param t the tuple of elements stored by TupleValue
+ * @return a TupleValue object
  */
 template <class T1, class T2>
 auto MakeTupleValue(T2 t);
 
 /**
- * \ingroup attribute_Tuple
+ * @ingroup attribute_Tuple
  *
  * Checker for attribute values storing tuples.
  */
@@ -162,53 +162,53 @@
     /**
      * Get the checkers for all tuple elements.
      *
-     * \return the checkers for all tuple elements
+     * @return the checkers for all tuple elements
      */
     virtual const std::vector<Ptr<const AttributeChecker>>& GetCheckers() const = 0;
 };
 
 /**
- * \ingroup attribute_Tuple
+ * @ingroup attribute_Tuple
  *
  * Create a TupleChecker from AttributeCheckers associated with TupleValue elements.
  *
- * \tparam Args \explicit Attribute value types
- * \tparam Ts \deduced Attribute checker types
- * \param checkers attribute checkers
- * \return Pointer to TupleChecker instance.
+ * @tparam Args \explicit Attribute value types
+ * @tparam Ts \deduced Attribute checker types
+ * @param checkers attribute checkers
+ * @return Pointer to TupleChecker instance.
  */
 template <class... Args, class... Ts>
 Ptr<const AttributeChecker> MakeTupleChecker(Ts... checkers);
 
 /**
- * \ingroup attribute_Tuple
+ * @ingroup attribute_Tuple
  *
  * Create an AttributeAccessor for a class data member of type tuple,
  * or a lone class get functor or set method.
  *
- * \tparam Args \explicit Attribute value types
- * \tparam T1 \deduced The type of the class data member,
+ * @tparam Args \explicit Attribute value types
+ * @tparam T1 \deduced The type of the class data member,
  *            or the type of the class get functor or set method.
- * \param a1 The address of the data member,
+ * @param a1 The address of the data member,
  *           or the get or set method.
- * \return the AttributeAccessor
+ * @return the AttributeAccessor
  */
 template <class... Args, class T1>
 Ptr<const AttributeAccessor> MakeTupleAccessor(T1 a1);
 
 /**
- * \ingroup attribute_Tuple
+ * @ingroup attribute_Tuple
  *
  * Create an AttributeAccessor using a pair of get functor
  * and set methods from a class.
  *
- * \tparam Args \explicit Attribute value types
- * \tparam T1 \deduced The type of the class data member,
+ * @tparam Args \explicit Attribute value types
+ * @tparam T1 \deduced The type of the class data member,
  *            or the type of the class get functor or set method.
- * \tparam T2 \deduced The type of the getter class functor method.
- * \param a2 The address of the class method to set the attribute.
- * \param a1 The address of the data member, or the get or set method.
- * \return the AttributeAccessor
+ * @tparam T2 \deduced The type of the getter class functor method.
+ * @param a2 The address of the class method to set the attribute.
+ * @param a1 The address of the data member, or the get or set method.
+ * @return the AttributeAccessor
  */
 template <class... Args, class T1, class T2>
 Ptr<const AttributeAccessor> MakeTupleAccessor(T1 a1, T2 a2);
@@ -281,14 +281,17 @@
 
     value.erase(value.begin());
     value.pop_back();
-    std::replace(value.data(), value.data() + value.size(), ',', ' ');
 
     std::istringstream iss(value);
     std::vector<Ptr<AttributeValue>> values;
     std::size_t i = 0;
 
-    while (iss >> value)
+    for (std::string elem; std::getline(iss, elem, ',');)
     {
+        // remove leading whitespaces
+        std::istringstream tmp{elem};
+        std::getline(tmp >> std::ws, value);
+
         if (i >= count)
         {
             return false;
@@ -354,7 +357,7 @@
 {
 
 /**
- * \ingroup attribute_Tuple
+ * @ingroup attribute_Tuple
  *
  * Internal checker class templated to each AttributeChecker
  * for each entry in the tuple.
@@ -365,8 +368,8 @@
   public:
     /**
      * Constructor.
-     * \tparam Ts \deduced the type of the attribute checkers
-     * \param checkers the attribute checkers for individual elements of the tuple
+     * @tparam Ts \deduced the type of the attribute checkers
+     * @param checkers the attribute checkers for individual elements of the tuple
      */
     template <class... Ts>
     TupleChecker(Ts... checkers)
@@ -431,7 +434,7 @@
 };
 
 /**
- * \ingroup attribute_Tuple
+ * @ingroup attribute_Tuple
  *
  * Helper class defining static methods for MakeTupleChecker and MakeTupleAccessor
  * that are called when user specifies the list of AttributeValue types included
@@ -441,7 +444,7 @@
 struct TupleHelper
 {
     /**
-     * \copydoc ns3::MakeTupleChecker
+     * @copydoc ns3::MakeTupleChecker
      */
     template <class... Ts>
     static Ptr<const AttributeChecker> MakeTupleChecker(Ts... checkers)
@@ -450,7 +453,7 @@
     }
 
     /**
-     * \copydoc ns3::MakeTupleAccessor(T1)
+     * @copydoc ns3::MakeTupleAccessor(T1)
      */
     template <class T1>
     static Ptr<const AttributeAccessor> MakeTupleAccessor(T1 a1)
@@ -459,7 +462,7 @@
     }
 
     /**
-     * \copydoc ns3::MakeTupleAccessor(T1,T2)
+     * @copydoc ns3::MakeTupleAccessor(T1,T2)
      */
     template <class T1, class T2>
     static Ptr<const AttributeAccessor> MakeTupleAccessor(T1 a1, T2 a2)
@@ -469,7 +472,7 @@
 };
 
 /**
- * \ingroup attribute_Tuple
+ * @ingroup attribute_Tuple
  *
  * Helper class defining static methods for MakeTupleValue, MakeTupleChecker and
  * MakeTupleAccessor that are called when user provides a std::tuple of the
@@ -480,7 +483,7 @@
 struct TupleHelper<std::tuple<Args...>>
 {
     /**
-     * \copydoc ns3::MakeTupleValue
+     * @copydoc ns3::MakeTupleValue
      */
     static TupleValue<Args...> MakeTupleValue(const typename TupleValue<Args...>::result_type& t)
     {
@@ -488,7 +491,7 @@
     }
 
     /**
-     * \copydoc ns3::MakeTupleChecker
+     * @copydoc ns3::MakeTupleChecker
      */
     template <class... Ts>
     static Ptr<const AttributeChecker> MakeTupleChecker(Ts... checkers)
@@ -497,7 +500,7 @@
     }
 
     /**
-     * \copydoc ns3::MakeTupleAccessor(T1)
+     * @copydoc ns3::MakeTupleAccessor(T1)
      */
     template <class T1>
     static Ptr<const AttributeAccessor> MakeTupleAccessor(T1 a1)
@@ -506,7 +509,7 @@
     }
 
     /**
-     * \copydoc ns3::MakeTupleAccessor(T1,T2)
+     * @copydoc ns3::MakeTupleAccessor(T1,T2)
      */
     template <class T1, class T2>
     static Ptr<const AttributeAccessor> MakeTupleAccessor(T1 a1, T2 a2)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/type-id.cc ns-3.44/src/core/model/type-id.cc
--- ns-3.43/src/core/model/type-id.cc	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/model/type-id.cc	2025-03-09 16:55:49.363371100 -0700
@@ -18,8 +18,8 @@
 #include <vector>
 
 /**
- * \file
- * \ingroup object
+ * @file
+ * @ingroup object
  * ns3::TypeId and ns3::IidManager implementations.
  */
 
@@ -36,13 +36,13 @@
 // to find g_log
 
 /**
- * \ingroup object
- * \brief TypeId information manager
+ * @ingroup object
+ * @brief TypeId information manager
  *
  * Information records are stored in a vector.  Name and hash lookup
  * are performed by maps to the vector index.
  *
- * \internal
+ * @internal
  * <b>Hash Chaining</b>
  *
  * We require all types to produce distinct hashes. What if we encounter
@@ -69,109 +69,109 @@
   public:
     /**
      * Create a new unique type id.
-     * \param [in] name The name of this type id.
-     * \returns The id.
+     * @param [in] name The name of this type id.
+     * @returns The id.
      */
     uint16_t AllocateUid(std::string name);
     /**
      * Add a deprecated name for the type id.  Use of this name raises
      * a runtime warning, and only one deprecated name is supported.
-     * \param [in] uid The id.
-     * \param [in] name The deprecated name.
+     * @param [in] uid The id.
+     * @param [in] name The deprecated name.
      */
     void AddDeprecatedName(uint16_t uid, const std::string& name);
     /**
      * Set the parent of a type id.
-     * \param [in] uid The id.
-     * \param [in] parent The id of the parent.
+     * @param [in] uid The id.
+     * @param [in] parent The id of the parent.
      */
     void SetParent(uint16_t uid, uint16_t parent);
     /**
      * Set the group name of a type id.
-     * \param [in] uid The id.
-     * \param [in] groupName The group name.
+     * @param [in] uid The id.
+     * @param [in] groupName The group name.
      */
     void SetGroupName(uint16_t uid, std::string groupName);
     /**
      * Set the size of the object class referred to by this id.
-     * \param [in] uid The id.
-     * \param [in] size The object size.
+     * @param [in] uid The id.
+     * @param [in] size The object size.
      */
     void SetSize(uint16_t uid, std::size_t size);
     /**
      * Add a constructor Callback to this type id.
-     * \param [in] uid The id.
-     * \param [in] callback The Callback for the constructor.
+     * @param [in] uid The id.
+     * @param [in] callback The Callback for the constructor.
      */
     void AddConstructor(uint16_t uid, Callback<ObjectBase*> callback);
     /**
      * Mark this type id to be excluded from documentation.
-     * \param [in] uid The id.
+     * @param [in] uid The id.
      */
     void HideFromDocumentation(uint16_t uid);
     /**
      * Get a type id by name.
-     * \param [in] name The type id to find.
-     * \returns The type id.  A type id of 0 means \pname{name} wasn't found.
+     * @param [in] name The type id to find.
+     * @returns The type id.  A type id of 0 means \pname{name} wasn't found.
      */
     uint16_t GetUid(std::string name) const;
     /**
      * Get a type id by hash value.
-     * \param [in] hash The type id to find.
-     * \returns The type id.  A type id of 0 means \pname{hash} wasn't found.
+     * @param [in] hash The type id to find.
+     * @returns The type id.  A type id of 0 means \pname{hash} wasn't found.
      */
     uint16_t GetUid(TypeId::hash_t hash) const;
     /**
      * Get the name of a type id.
-     * \param [in] uid The id.
-     * \returns The name of the type id.
+     * @param [in] uid The id.
+     * @returns The name of the type id.
      */
     std::string GetName(uint16_t uid) const;
     /**
      * Get the deprecated name of a type id.
-     * \param [in] uid The id.
-     * \returns The name of the type id.
+     * @param [in] uid The id.
+     * @returns The name of the type id.
      */
     std::string GetDeprecatedName(uint16_t uid) const;
     /**
      * Get the hash of a type id.
-     * \param [in] uid The id.
-     * \returns The hash of the type id.
+     * @param [in] uid The id.
+     * @returns The hash of the type id.
      */
     TypeId::hash_t GetHash(uint16_t uid) const;
     /**
      * Get the parent of a type id.
-     * \param [in] uid The id.
-     * \returns The parent type id of the type id.
+     * @param [in] uid The id.
+     * @returns The parent type id of the type id.
      */
     uint16_t GetParent(uint16_t uid) const;
     /**
      * Get the group name of a type id.
-     * \param [in] uid The id.
-     * \returns The group name of the type id.
+     * @param [in] uid The id.
+     * @returns The group name of the type id.
      */
     std::string GetGroupName(uint16_t uid) const;
     /**
      * Get the size of a type id.
-     * \param [in] uid The id.
-     * \returns The size of the type id.
+     * @param [in] uid The id.
+     * @returns The size of the type id.
      */
     std::size_t GetSize(uint16_t uid) const;
     /**
      * Get the constructor Callback of a type id.
-     * \param [in] uid The id.
-     * \returns The constructor Callback of the type id.
+     * @param [in] uid The id.
+     * @returns The constructor Callback of the type id.
      */
     Callback<ObjectBase*> GetConstructor(uint16_t uid) const;
     /**
      * Check if a type id has a constructor Callback.
-     * \param [in] uid The id.
-     * \returns \c true if the type id has a constructor Callback.
+     * @param [in] uid The id.
+     * @returns \c true if the type id has a constructor Callback.
      */
     bool HasConstructor(uint16_t uid) const;
     /**
      * Get the total number of type ids.
-     * \returns The total number.
+     * @returns The total number.
      */
     uint16_t GetRegisteredN() const;
     /**
@@ -180,25 +180,25 @@
      * The type id value 0 indicates not registered, so there is an offset
      * of 1 between the index and the type id value.  This function converts
      * from an index to the type id value.
-     * \param [in] i The index.
-     * \returns The type id.
+     * @param [in] i The index.
+     * @returns The type id.
      */
     uint16_t GetRegistered(uint16_t i) const;
     /**
      * Record a new attribute in a type id.
-     * \param [in] uid The id.
-     * \param [in] name The name of the new attribute
-     * \param [in] help Some help text which describes the purpose of this
+     * @param [in] uid The id.
+     * @param [in] name The name of the new attribute
+     * @param [in] help Some help text which describes the purpose of this
      *             attribute.
-     * \param [in] flags Flags which describe how this attribute can be
+     * @param [in] flags Flags which describe how this attribute can be
      *             read and/or written.
-     * \param [in] initialValue The initial value for this attribute.
-     * \param [in] accessor An instance of the associated AttributeAccessor
+     * @param [in] initialValue The initial value for this attribute.
+     * @param [in] accessor An instance of the associated AttributeAccessor
      *             subclass.
-     * \param [in] checker An instance of the associated AttributeChecker
+     * @param [in] checker An instance of the associated AttributeChecker
      *             subclass.
-     * \param [in] supportLevel The support/deprecation status for this attribute.
-     * \param [in] supportMsg Upgrade hint if this attribute is no longer supported.
+     * @param [in] supportLevel The support/deprecation status for this attribute.
+     * @param [in] supportMsg Upgrade hint if this attribute is no longer supported.
      */
     void AddAttribute(uint16_t uid,
                       std::string name,
@@ -207,90 +207,90 @@
                       Ptr<const AttributeValue> initialValue,
                       Ptr<const AttributeAccessor> accessor,
                       Ptr<const AttributeChecker> checker,
-                      TypeId::SupportLevel supportLevel = TypeId::SUPPORTED,
+                      TypeId::SupportLevel supportLevel = TypeId::SupportLevel::SUPPORTED,
                       const std::string& supportMsg = "");
     /**
      * Set the initial value of an Attribute.
-     * \param [in] uid The id.
-     * \param [in] i The attribute to manipulate
-     * \param [in] initialValue The new initial value to use for this attribute.
+     * @param [in] uid The id.
+     * @param [in] i The attribute to manipulate
+     * @param [in] initialValue The new initial value to use for this attribute.
      */
     void SetAttributeInitialValue(uint16_t uid,
                                   std::size_t i,
                                   Ptr<const AttributeValue> initialValue);
     /**
      * Get the number of attributes.
-     * \param [in] uid The id.
-     * \returns The number of attributes associated to this TypeId
+     * @param [in] uid The id.
+     * @returns The number of attributes associated to this TypeId
      */
     std::size_t GetAttributeN(uint16_t uid) const;
     /**
      * Get Attribute information by index.
-     * \param [in] uid The id.
-     * \param [in] i Index into attribute array
-     * \returns The information associated to attribute whose index is \pname{i}.
+     * @param [in] uid The id.
+     * @param [in] i Index into attribute array
+     * @returns The information associated to attribute whose index is \pname{i}.
      */
     TypeId::AttributeInformation GetAttribute(uint16_t uid, std::size_t i) const;
     /**
      * Record a new TraceSource.
-     * \param [in] uid The id.
-     * \param [in] name The name of the new trace source
-     * \param [in] help Some help text which describes the purpose of this
+     * @param [in] uid The id.
+     * @param [in] name The name of the new trace source
+     * @param [in] help Some help text which describes the purpose of this
      *             trace source.
-     * \param [in] accessor A pointer to a TraceSourceAccessor which can be
+     * @param [in] accessor A pointer to a TraceSourceAccessor which can be
      *             used to connect/disconnect sinks to this trace source.
-     * \param [in] callback Fully qualified typedef name for the callback
+     * @param [in] callback Fully qualified typedef name for the callback
      *             signature.  Generally this should begin with the
      *             "ns3::" namespace qualifier.
-     * \param [in] supportLevel The support/deprecation status for this attribute.
-     * \param [in] supportMsg Upgrade hint if this attribute is no longer supported.
+     * @param [in] supportLevel The support/deprecation status for this attribute.
+     * @param [in] supportMsg Upgrade hint if this attribute is no longer supported.
      */
     void AddTraceSource(uint16_t uid,
                         std::string name,
                         std::string help,
                         Ptr<const TraceSourceAccessor> accessor,
                         std::string callback,
-                        TypeId::SupportLevel supportLevel = TypeId::SUPPORTED,
+                        TypeId::SupportLevel supportLevel = TypeId::SupportLevel::SUPPORTED,
                         const std::string& supportMsg = "");
     /**
      * Get the number of Trace sources.
-     * \param [in] uid The id.
-     * \returns The number of trace sources defined in this TypeId.
+     * @param [in] uid The id.
+     * @returns The number of trace sources defined in this TypeId.
      */
     std::size_t GetTraceSourceN(uint16_t uid) const;
     /**
      * Get the trace source by index.
-     * \param [in] uid The id.
-     * \param [in] i Index into trace source array.
-     * \returns Detailed information about the requested trace source.
+     * @param [in] uid The id.
+     * @param [in] i Index into trace source array.
+     * @returns Detailed information about the requested trace source.
      */
     TypeId::TraceSourceInformation GetTraceSource(uint16_t uid, std::size_t i) const;
     /**
      * Check if this TypeId should not be listed in documentation.
-     * \param [in] uid The id.
-     * \returns \c true if this TypeId should be hidden from the user.
+     * @param [in] uid The id.
+     * @returns \c true if this TypeId should be hidden from the user.
      */
     bool MustHideFromDocumentation(uint16_t uid) const;
 
   private:
     /**
      * Check if a type id has a given TraceSource.
-     * \param [in] uid The id.
-     * \param [in] name The TraceSource name.
-     * \returns \c true if \pname{uid} has the TraceSource \pname{name}.
+     * @param [in] uid The id.
+     * @param [in] name The TraceSource name.
+     * @returns \c true if \pname{uid} has the TraceSource \pname{name}.
      */
     bool HasTraceSource(uint16_t uid, std::string name);
     /**
      * Check if a type id has a given Attribute.
-     * \param [in] uid The id.
-     * \param [in] name The Attribute name.
-     * \returns \c true if \pname{uid} has the Attribute \pname{name}.
+     * @param [in] uid The id.
+     * @param [in] name The Attribute name.
+     * @returns \c true if \pname{uid} has the Attribute \pname{name}.
      */
     bool HasAttribute(uint16_t uid, std::string name);
     /**
      * Hashing function.
-     * \param [in] name The type id name.
-     * \returns The hashed value of \pname{name}.
+     * @param [in] name The type id name.
+     * @returns The hashed value of \pname{name}.
      */
     static TypeId::hash_t Hasher(const std::string name);
 
@@ -330,8 +330,8 @@
 
     /**
      * Retrieve the information record for a type.
-     * \param [in] uid The id.
-     * \returns The information record.
+     * @param [in] uid The id.
+     * @returns The information record.
      */
     IidManager::IidInformation* LookupInformation(uint16_t uid) const;
 
@@ -370,14 +370,14 @@
 }
 
 /**
- * \ingroup object
- * \internal
+ * @ingroup object
+ * @internal
  * IidManager shorthand for use in NS_LOG
  */
 #define IID "IidManager"
 /**
- * \ingroup object
- * \internal
+ * @ingroup object
+ * @internal
  * IidManager shorthand for use in NS_LOG
  */
 #define IIDL IID << ": "
@@ -444,7 +444,7 @@
     information.size = (std::size_t)(-1);
     information.hasConstructor = false;
     information.mustHideFromDocumentation = false;
-    information.supportLevel = TypeId::SUPPORTED;
+    information.supportLevel = TypeId::SupportLevel::SUPPORTED;
     m_information.push_back(information);
     std::size_t tuid = m_information.size();
     NS_ASSERT(tuid <= 0xffff);
@@ -973,12 +973,12 @@
     auto [found, tid, attribute] = FindAttribute(*this, name);
     if (found)
     {
-        if (attribute.supportLevel == TypeId::SUPPORTED)
+        if (attribute.supportLevel == SupportLevel::SUPPORTED)
         {
             *info = attribute;
             return true;
         }
-        else if (attribute.supportLevel == TypeId::DEPRECATED)
+        else if (attribute.supportLevel == SupportLevel::DEPRECATED)
         {
             if (!permissive)
             {
@@ -988,7 +988,7 @@
             *info = attribute;
             return true;
         }
-        else if (attribute.supportLevel == TypeId::OBSOLETE)
+        else if (attribute.supportLevel == SupportLevel::OBSOLETE)
         {
             NS_FATAL_ERROR("Attribute '"
                            << name << "' is obsolete, with no fallback: " << attribute.supportMsg);
@@ -1240,19 +1240,19 @@
             tmp = tid.GetTraceSource(i);
             if (tmp.name == name)
             {
-                if (tmp.supportLevel == TypeId::SUPPORTED)
+                if (tmp.supportLevel == SupportLevel::SUPPORTED)
                 {
                     *info = tmp;
                     return tmp.accessor;
                 }
-                else if (tmp.supportLevel == TypeId::DEPRECATED)
+                else if (tmp.supportLevel == SupportLevel::DEPRECATED)
                 {
                     std::cerr << "TraceSource '" << name << "' is deprecated: " << tmp.supportMsg
                               << std::endl;
                     *info = tmp;
                     return tmp.accessor;
                 }
-                else if (tmp.supportLevel == TypeId::OBSOLETE)
+                else if (tmp.supportLevel == SupportLevel::OBSOLETE)
                 {
                     NS_FATAL_ERROR("TraceSource '" << name << "' is obsolete, with no fallback: "
                                                    << tmp.supportMsg);
@@ -1286,10 +1286,10 @@
 }
 
 /**
- * \brief Insertion operator for TypeId
- * \param [in] os the output stream
- * \param [in] tid the TypeId
- * \returns the updated output stream.
+ * @brief Insertion operator for TypeId
+ * @param [in] os the output stream
+ * @param [in] tid the TypeId
+ * @returns the updated output stream.
  */
 std::ostream&
 operator<<(std::ostream& os, TypeId tid)
@@ -1299,10 +1299,10 @@
 }
 
 /**
- * \brief Extraction operator for TypeId
- * \param [in] is the input stream
- * \param [out] tid the TypeId value
- * \returns the updated input stream.
+ * @brief Extraction operator for TypeId
+ * @param [in] is the input stream
+ * @param [out] tid the TypeId value
+ * @returns the updated input stream.
  */
 std::istream&
 operator>>(std::istream& is, TypeId& tid)
@@ -1317,6 +1317,21 @@
     return is;
 }
 
+std::ostream&
+operator<<(std::ostream& os, TypeId::SupportLevel level)
+{
+    switch (level)
+    {
+    case TypeId::SupportLevel::SUPPORTED:
+        return os << "SUPPORTED";
+    case TypeId::SupportLevel::DEPRECATED:
+        return os << "DEPRECATED";
+    case TypeId::SupportLevel::OBSOLETE:
+        return os << "OBSOLETE";
+    };
+    return os << "UNKNOWN(" << static_cast<uint32_t>(level) << ")";
+}
+
 ATTRIBUTE_HELPER_CPP(TypeId);
 
 bool
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/type-id.h ns-3.44/src/core/model/type-id.h
--- ns-3.43/src/core/model/type-id.h	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/model/type-id.h	2025-03-09 16:55:49.363371100 -0700
@@ -12,6 +12,7 @@
 #include "attribute-helper.h"
 #include "attribute.h"
 #include "callback.h"
+#include "deprecated.h"
 #include "hash.h"
 #include "trace-source-accessor.h"
 
@@ -19,8 +20,8 @@
 #include <string>
 
 /**
- * \file
- * \ingroup object
+ * @file
+ * @ingroup object
  * ns3::TypeId declaration; inline and template implementations.
  */
 
@@ -30,8 +31,8 @@
 class ObjectBase;
 
 /**
- * \ingroup object
- * \brief a unique identifier for an interface.
+ * @ingroup object
+ * @brief a unique identifier for an interface.
  *
  * This class records a lot of meta-information about a
  * subclass of the Object base class:
@@ -39,9 +40,9 @@
  *  - the set of accessible constructors in the subclass
  *  - the set of 'attributes' accessible in the subclass
  *
- * \see attribute_TypeId
+ * @see attribute_TypeId
  *
- * \internal
+ * @internal
  *  See the discussion in IidManager about hash chaining of TypeId's.
  */
 class TypeId
@@ -58,13 +59,28 @@
     };
 
     /** The level of support or deprecation for attributes or trace sources. */
-    enum SupportLevel
+    enum class SupportLevel
     {
         SUPPORTED,  /**< Attribute or trace source is currently used. */
         DEPRECATED, /**< Attribute or trace source is deprecated; user is warned. */
         OBSOLETE    /**< Attribute or trace source is not used anymore; simulation fails. */
     };
 
+    /**
+     * Deprecated support level simple enums.
+     *
+     * Use the `TypeId::SupportLevel` enum class symbols instead.
+     * @{
+     */
+    NS_DEPRECATED_3_44("Use SupportLevel::SUPPORTED instead")
+    static constexpr auto SUPPORTED = SupportLevel::SUPPORTED;
+    NS_DEPRECATED_3_44("Use SupportLevel::DEPRECATED instead")
+    static constexpr auto DEPRECATED = SupportLevel::DEPRECATED;
+    NS_DEPRECATED_3_44("Use SupportLevel::OBSOLETE instead")
+    static constexpr auto OBSOLETE = SupportLevel::OBSOLETE;
+
+    /**@}*/
+
     /** Attribute implementation. */
     struct AttributeInformation
     {
@@ -111,8 +127,8 @@
     /**
      * Get a TypeId by name.
      *
-     * \param [in] name The name of the requested TypeId
-     * \returns The unique id associated with the requested name.
+     * @param [in] name The name of the requested TypeId
+     * @returns The unique id associated with the requested name.
      *
      * This method cannot fail: it will crash if the input
      * name is not a valid TypeId name.
@@ -121,17 +137,17 @@
     /**
      * Get a TypeId by name.
      *
-     * \param [in]  name The name of the requested TypeId
-     * \param [out] tid A pointer to the TypeId instance where the
+     * @param [in]  name The name of the requested TypeId
+     * @param [out] tid A pointer to the TypeId instance where the
      *              result of this function should be stored.
-     * \returns \c true if the requested name was found.
+     * @returns \c true if the requested name was found.
      */
     static bool LookupByNameFailSafe(std::string name, TypeId* tid);
     /**
      * Get a TypeId by hash.
      *
-     * \param [in] hash The hash to lookup
-     * \returns The unique id associated with the requested hash.
+     * @param [in] hash The hash to lookup
+     * @returns The unique id associated with the requested hash.
      *
      * This method cannot fail: it will crash if the input
      * hash does not match an existing TypeId.
@@ -140,31 +156,31 @@
     /**
      * Get a TypeId by hash.
      *
-     * \param [in]  hash The hash of the requested TypeId
-     * \param [out] tid A pointer to the TypeId instance where the
+     * @param [in]  hash The hash of the requested TypeId
+     * @param [out] tid A pointer to the TypeId instance where the
      *              result of this function should be stored.
-     * \returns \c true if the requested hash was found.
+     * @returns \c true if the requested hash was found.
      */
     static bool LookupByHashFailSafe(hash_t hash, TypeId* tid);
 
     /**
      * Get the number of registered TypeIds.
      *
-     * \returns The number of TypeId instances registered.
+     * @returns The number of TypeId instances registered.
      */
     static uint16_t GetRegisteredN();
     /**
      * Get a TypeId by index.
      *
-     * \param [in] i Index of the TypeId.
-     * \returns The TypeId instance whose index is \c i.
+     * @param [in] i Index of the TypeId.
+     * @returns The TypeId instance whose index is \c i.
      */
     static TypeId GetRegistered(uint16_t i);
 
     /**
      * Constructor.
      *
-     * \param [in] name The name of the interface to construct.
+     * @param [in] name The name of the interface to construct.
      *
      * No two instances can share the same name. The name is expected to be
      * the full c++ typename of associated c++ object.
@@ -174,8 +190,8 @@
     /**
      * Add an deprecated name for a TypeId.
      *
-     * \param [in] name The deprecated name.
-     * \return This TypeId instance.
+     * @param [in] name The deprecated name.
+     * @return This TypeId instance.
      *
      * To allow for deprecations (such as moving a TypeId into a namespace
      * but wishing to preserve the original string from namespace ns3),
@@ -188,7 +204,7 @@
     /**
      * Get the parent of this TypeId.
      *
-     * \returns The parent of this TypeId
+     * @returns The parent of this TypeId
      *
      * This method cannot fail. It will return itself
      * if this TypeId has no parent. i.e., it is at the top
@@ -201,15 +217,15 @@
     /**
      * Check if this TypeId has a parent.
      *
-     * \return \c true if this TypeId has a parent.
+     * @return \c true if this TypeId has a parent.
      */
     bool HasParent() const;
 
     /**
      * Check if this TypeId is a child of another.
      *
-     * \param [in] other A parent TypeId
-     * \returns \c true if the input TypeId is really a parent of this TypeId.
+     * @param [in] other A parent TypeId
+     * @returns \c true if the input TypeId is really a parent of this TypeId.
      *
      * Calling this method is roughly similar to calling dynamic_cast
      * except that you do not need object instances: you can do the check
@@ -220,63 +236,63 @@
     /**
      * Get the group name.
      *
-     * \returns The name of the group associated to this TypeId.
+     * @returns The name of the group associated to this TypeId.
      */
     std::string GetGroupName() const;
 
     /**
      * Get the name.
      *
-     * \returns The name of this interface.
+     * @returns The name of this interface.
      */
     std::string GetName() const;
 
     /**
      * Get the hash.
      *
-     * \returns The hash of this interface.
+     * @returns The hash of this interface.
      */
     hash_t GetHash() const;
 
     /**
      * Get the size of this object.
      *
-     * \returns The size of this interface.
+     * @returns The size of this interface.
      */
     std::size_t GetSize() const;
 
     /**
      * Check if this TypeId has a constructor.
      *
-     * \returns \c true if this TypeId has a constructor
+     * @returns \c true if this TypeId has a constructor
      */
     bool HasConstructor() const;
 
     /**
      * Get the number of attributes.
      *
-     * \returns The number of attributes associated to this TypeId
+     * @returns The number of attributes associated to this TypeId
      */
     std::size_t GetAttributeN() const;
     /**
      * Get Attribute information by index.
      *
-     * \param [in] i Index into attribute array
-     * \returns The information associated to attribute whose index is \pname{i}.
+     * @param [in] i Index into attribute array
+     * @returns The information associated to attribute whose index is \pname{i}.
      */
     TypeId::AttributeInformation GetAttribute(std::size_t i) const;
     /**
      * Get the Attribute name by index.
      *
-     * \param [in] i Index into attribute array
-     * \returns The full name associated to the attribute whose index is \pname{i}.
+     * @param [in] i Index into attribute array
+     * @returns The full name associated to the attribute whose index is \pname{i}.
      */
     std::string GetAttributeFullName(std::size_t i) const;
 
     /**
      * Get the constructor callback.
      *
-     * \returns A callback which can be used to instantiate an object
+     * @returns A callback which can be used to instantiate an object
      *          of this type.
      */
     Callback<ObjectBase*> GetConstructor() const;
@@ -284,29 +300,29 @@
     /**
      * Check if this TypeId should not be listed in documentation.
      *
-     * \returns \c true if this TypeId should be hidden from the user.
+     * @returns \c true if this TypeId should be hidden from the user.
      */
     bool MustHideFromDocumentation() const;
 
     /**
      * Get the number of Trace sources.
      *
-     * \returns The number of trace sources defined in this TypeId.
+     * @returns The number of trace sources defined in this TypeId.
      */
     std::size_t GetTraceSourceN() const;
     /**
      * Get the trace source by index.
      *
-     * \param [in] i Index into trace source array.
-     * \returns Detailed information about the requested trace source.
+     * @param [in] i Index into trace source array.
+     * @returns Detailed information about the requested trace source.
      */
     TypeId::TraceSourceInformation GetTraceSource(std::size_t i) const;
 
     /**
      * Set the parent TypeId.
      *
-     * \param [in] tid The TypeId of the base class.
-     * \return This TypeId instance.
+     * @param [in] tid The TypeId of the base class.
+     * @return This TypeId instance.
      *
      * Record in this TypeId which TypeId is the TypeId
      * of the base class of the subclass.
@@ -315,8 +331,8 @@
     /**
      * Set the parent TypeId.
      *
-     * \tparam T \explicit The parent TypeID type.
-     * \return This TypeId instance.
+     * @tparam T \explicit The parent TypeID type.
+     * @return This TypeId instance.
      *
      * Record in this TypeId which TypeId is the TypeId
      * of the base class of the subclass.
@@ -327,8 +343,8 @@
     /**
      * Set the group name.
      *
-     * \param [in] groupName The name of the group this TypeId belongs to.
-     * \returns This TypeId instance.
+     * @param [in] groupName The name of the group this TypeId belongs to.
+     * @returns This TypeId instance.
      *
      * The group name is purely an advisory information used to
      * group together types according to a user-specific grouping
@@ -340,15 +356,15 @@
      * Set the size of this type.
      *
      * Call this way:
-     * \code
+     * @code
      *   SetSize (sizeof (<typename>));
-     * \endcode
+     * @endcode
      * This is done automatically by NS_LOG_ENSURE_REGISTERED()
      * A ridiculously large reported size is a symptom that the
      * type hasn't been registered.
      *
-     * \param [in] size The size of the object, in bytes.
-     * \returns This TypeId instance.
+     * @param [in] size The size of the object, in bytes.
+     * @returns This TypeId instance.
      */
     TypeId SetSize(std::size_t size);
 
@@ -356,8 +372,8 @@
      * Record in this TypeId the fact that the default constructor
      * is accessible.
      *
-     * \tparam T \explicit The class name represented by this TypeId.
-     * \returns This TypeId instance
+     * @tparam T \explicit The class name represented by this TypeId.
+     * @returns This TypeId instance
      */
     template <typename T>
     TypeId AddConstructor();
@@ -365,16 +381,16 @@
     /**
      * Record in this TypeId the fact that a new attribute exists.
      *
-     * \param [in] name The name of the new attribute
-     * \param [in] help Some help text which describes the purpose of this
+     * @param [in] name The name of the new attribute
+     * @param [in] help Some help text which describes the purpose of this
      *             attribute.
-     * \param [in] initialValue The initial value for this attribute.
-     * \param [in] accessor An instance of the associated AttributeAccessor
+     * @param [in] initialValue The initial value for this attribute.
+     * @param [in] accessor An instance of the associated AttributeAccessor
      *             subclass.
-     * \param [in] checker An instance of the associated AttributeChecker
+     * @param [in] checker An instance of the associated AttributeChecker
      *             subclass.
-     * \param [in] supportLevel Support/deprecation status of the attribute.
-     * \param [in] supportMsg Upgrade hint if this attribute is no longer
+     * @param [in] supportLevel Support/deprecation status of the attribute.
+     * @param [in] supportMsg Upgrade hint if this attribute is no longer
      *             supported.  If the attribute is \c DEPRECATED the attribute
      *             behavior still exists, but user code should be updated
      *             following guidance in the hint.
@@ -382,46 +398,46 @@
      *             which class the attribute functional has been moved to,
      *             or that the functionality is no longer supported.
      *             See test file type-id-test-suite.cc for examples.
-     * \returns This TypeId instance
+     * @returns This TypeId instance
      */
     TypeId AddAttribute(std::string name,
                         std::string help,
                         const AttributeValue& initialValue,
                         Ptr<const AttributeAccessor> accessor,
                         Ptr<const AttributeChecker> checker,
-                        SupportLevel supportLevel = SUPPORTED,
+                        SupportLevel supportLevel = SupportLevel::SUPPORTED,
                         const std::string& supportMsg = "");
 
     /**
      * Set the initial value of an Attribute.
      *
-     * \param [in] i The attribute to manipulate
-     * \param [in] initialValue The new initial value to use for this attribute.
-     * \returns \c true if the call was successfully.
+     * @param [in] i The attribute to manipulate
+     * @param [in] initialValue The new initial value to use for this attribute.
+     * @returns \c true if the call was successfully.
      */
     bool SetAttributeInitialValue(std::size_t i, Ptr<const AttributeValue> initialValue);
 
     /**
      * Record in this TypeId the fact that a new attribute exists.
      *
-     * \param [in] name The name of the new attribute
-     * \param [in] help Some help text which describes the purpose of this
+     * @param [in] name The name of the new attribute
+     * @param [in] help Some help text which describes the purpose of this
      *        attribute
-     * \param [in] flags Flags which describe how this attribute can be read and/or written.
-     * \param [in] initialValue The initial value for this attribute.
-     * \param [in] accessor An instance of the associated AttributeAccessor
+     * @param [in] flags Flags which describe how this attribute can be read and/or written.
+     * @param [in] initialValue The initial value for this attribute.
+     * @param [in] accessor An instance of the associated AttributeAccessor
      *             subclass.
-     * \param [in] checker An instance of the associated AttributeChecker
+     * @param [in] checker An instance of the associated AttributeChecker
      *             subclass.
-     * \param [in] supportLevel Support/deprecation status of the attribute.
-     * \param [in] supportMsg Upgrade hint if this attribute is no longer
+     * @param [in] supportLevel Support/deprecation status of the attribute.
+     * @param [in] supportMsg Upgrade hint if this attribute is no longer
      *             supported.  If the attribute is \c DEPRECATED the attribute
      *             behavior still exists, but user code should be updated
      *             following guidance in the hint..
      *             If the attribute is \c OBSOLETE, the hint should indicate
      *             which class the attribute functional has been moved to,
      *             or that the functionality is no longer supported.
-     * \returns This TypeId instance
+     * @returns This TypeId instance
      */
     TypeId AddAttribute(std::string name,
                         std::string help,
@@ -429,22 +445,22 @@
                         const AttributeValue& initialValue,
                         Ptr<const AttributeAccessor> accessor,
                         Ptr<const AttributeChecker> checker,
-                        SupportLevel supportLevel = SUPPORTED,
+                        SupportLevel supportLevel = SupportLevel::SUPPORTED,
                         const std::string& supportMsg = "");
 
     /**
      * Record a new TraceSource.
      *
-     * \param [in] name The name of the new trace source
-     * \param [in] help Some help text which describes the purpose of this
+     * @param [in] name The name of the new trace source
+     * @param [in] help Some help text which describes the purpose of this
      *             trace source.
-     * \param [in] accessor A pointer to a TraceSourceAccessor which can be
+     * @param [in] accessor A pointer to a TraceSourceAccessor which can be
      *             used to connect/disconnect sinks to this trace source.
-     * \param [in] callback Fully qualified typedef name for the callback
+     * @param [in] callback Fully qualified typedef name for the callback
      *             signature.  Generally this should begin with the
      *             "ns3::" namespace qualifier.
-     * \param [in] supportLevel Support/deprecation status of the attribute.
-     * \param [in] supportMsg Upgrade hint if this attribute is no longer
+     * @param [in] supportLevel Support/deprecation status of the attribute.
+     * @param [in] supportMsg Upgrade hint if this attribute is no longer
      *             supported.  If the attribute is \c DEPRECATED the attribute
      *             behavior still exists, but user code should be updated
      *             following guidance in the hint..
@@ -452,27 +468,27 @@
      *             which class the attribute functional has been moved to,
      *             or that the functionality is no longer supported.
      *             See test file type-id-test-suite.cc for examples.
-     * \returns This TypeId instance.
+     * @returns This TypeId instance.
      */
     TypeId AddTraceSource(std::string name,
                           std::string help,
                           Ptr<const TraceSourceAccessor> accessor,
                           std::string callback,
-                          SupportLevel supportLevel = SUPPORTED,
+                          SupportLevel supportLevel = SupportLevel::SUPPORTED,
                           const std::string& supportMsg = "");
 
     /**
      * Hide this TypeId from documentation.
-     * \returns This TypeId instance.
+     * @returns This TypeId instance.
      */
     TypeId HideFromDocumentation();
 
     /**
      * Find an attribute by name in the inheritance tree for a given TypeId.
      *
-     * \param [in] tid The TypeId to start the search from.
-     * \param [in] name The name of the attribute to search for.
-     * \return A tuple containing a boolean that indicates whether the attribute was found, the
+     * @param [in] tid The TypeId to start the search from.
+     * @param [in] name The name of the attribute to search for.
+     * @return A tuple containing a boolean that indicates whether the attribute was found, the
      * TypeId where the attribute was found, and the AttributeInformation of the found attribute.
      */
     static std::tuple<bool, TypeId, AttributeInformation> FindAttribute(const TypeId& tid,
@@ -481,14 +497,14 @@
     /**
      * Find an Attribute by name, retrieving the associated AttributeInformation.
      *
-     * \param [in]  name The name of the requested attribute
-     * \param [in,out] info A pointer to the TypeId::AttributeInformation
+     * @param [in]  name The name of the requested attribute
+     * @param [in,out] info A pointer to the TypeId::AttributeInformation
      *              data structure where the result value of this method
      *              will be stored.
-     * \param [in] permissive If false (by default), will generate warnings and errors for
+     * @param [in] permissive If false (by default), will generate warnings and errors for
      * deprecated and obsolete attributes, respectively. If set to true, warnings for deprecated
      * attributes will be suppressed.
-     * \returns \c true if the requested attribute could be found.
+     * @returns \c true if the requested attribute could be found.
      */
     bool LookupAttributeByName(std::string name,
                                AttributeInformation* info,
@@ -498,8 +514,8 @@
      *
      * If no matching trace source is found, this method returns zero.
      *
-     * \param [in] name The name of the requested trace source
-     * \return The trace source accessor which can be used to connect
+     * @param [in] name The name of the requested trace source
+     * @return The trace source accessor which can be used to connect
      *  and disconnect trace sinks with the requested trace source on
      *  an object instance.
      */
@@ -507,11 +523,11 @@
     /**
      * Find a TraceSource by name, retrieving the associated TraceSourceInformation.
      *
-     * \param [in]  name The name of the requested trace source.
-     * \param [out] info A pointer to the TypeId::TraceSourceInformation
+     * @param [in]  name The name of the requested trace source.
+     * @param [out] info A pointer to the TypeId::TraceSourceInformation
      *              data structure where the result value of this method
      *              will be stored.
-     * \return The trace source accessor which can be used to connect
+     * @return The trace source accessor which can be used to connect
      *  and disconnect trace sinks with the requested trace source on
      *  an object instance.
      */
@@ -521,7 +537,7 @@
     /**
      * Get the internal id of this TypeId.
      *
-     * \returns The internal integer which uniquely identifies this TypeId.
+     * @returns The internal integer which uniquely identifies this TypeId.
      *
      * This is really an internal method which users are not expected
      * to use.
@@ -530,7 +546,7 @@
     /**
      * Set the internal id of this TypeId.
      *
-     * \param [in] uid The internal integer which uniquely identifies
+     * @param [in] uid The internal integer which uniquely identifies
      *            this TypeId.  This TypeId should already have been registered.
      *
      * Typically this is used in serialization/deserialization.
@@ -545,13 +561,13 @@
     inline TypeId();
     /**
      * Copy constructor.
-     * \param [in] o The other TypeId.
+     * @param [in] o The other TypeId.
      */
     inline TypeId(const TypeId& o);
     /**
      * Assignment.
-     * \param [in] o The other TypeId.
-     * \returns The copied TypeId.
+     * @param [in] o The other TypeId.
+     * @returns The copied TypeId.
      */
     inline TypeId& operator=(const TypeId& o);
     /** Destructor. */
@@ -559,7 +575,7 @@
 
   private:
     /**
-     * \name Comparison operators.
+     * @name Comparison operators.
      * Standard comparison operators.
      * @{
      */
@@ -570,13 +586,13 @@
 
     /**
      * Construct from an integer value.
-     * \param [in] tid The TypeId value as an integer.
+     * @param [in] tid The TypeId value as an integer.
      */
     explicit TypeId(uint16_t tid);
     /**
      * Implementation for AddConstructor().
      *
-     * \param [in] callback Callback which constructs an instance of this TypeId.
+     * @param [in] callback Callback which constructs an instance of this TypeId.
      */
     void DoAddConstructor(Callback<ObjectBase*> callback);
 
@@ -585,28 +601,36 @@
 };
 
 /**
- * \relates TypeId
+ * @relates TypeId
  * Output streamer.
  *
- * \param [in,out] os The output stream.
- * \param [in] tid The TypeId.
- * \returns The output stream.
+ * @param [in,out] os The output stream.
+ * @param [in] tid The TypeId.
+ * @returns The output stream.
  */
 std::ostream& operator<<(std::ostream& os, TypeId tid);
 /**
- * \relates TypeId
+ * @relates TypeId
  * Input Streamer.
- * \param [in,out] is The input stream.
- * \param [out] tid The TypeId to set from the stream.
- * \returns The input stream.
+ * @param [in,out] is The input stream.
+ * @param [out] tid The TypeId to set from the stream.
+ * @returns The input stream.
  */
 std::istream& operator>>(std::istream& is, TypeId& tid);
 
 /**
+ * @brief Stream insertion operator.
+ * @param [in] os The reference to the output stream.
+ * @param [in] level The TypeId::SupportLevel.
+ * @return The reference to the output stream.
+ */
+std::ostream& operator<<(std::ostream& os, TypeId::SupportLevel level);
+
+/**
  * Comparison operator.
- * \param [in] a One value.
- * \param [in] b The other value.
- * \returns The result of the comparison.
+ * @param [in] a One value.
+ * @param [in] b The other value.
+ * @returns The result of the comparison.
  * @{
  */
 inline bool operator==(TypeId a, TypeId b);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/type-name.h ns-3.44/src/core/model/type-name.h
--- ns-3.43/src/core/model/type-name.h	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/model/type-name.h	2025-03-09 16:55:49.363371100 -0700
@@ -13,8 +13,8 @@
 #include <string>
 
 /**
- * \file
- * \ingroup attributeimpl
+ * @file
+ * @ingroup attributeimpl
  * ns3::TypeNameGet() function declarations.
  */
 
@@ -22,14 +22,14 @@
 {
 
 /**
- * \ingroup attributeimpl
+ * @ingroup attributeimpl
  *
  * Type name strings for AttributeValue types.
  * Custom classes should add a template specialization of this function
  * using the macro \c TYPENAMEGET_DEFINE(T).
  *
- * \tparam T \explicit The type.
- * \returns The type name as a string.
+ * @tparam T \explicit The type.
+ * @returns The type name as a string.
  */
 template <typename T>
 std::string
@@ -40,11 +40,11 @@
 }
 
 /**
- * \ingroup attributeimpl
+ * @ingroup attributeimpl
  *
  * Macro that defines a template specialization for \c TypeNameGet<T>() .
  *
- * \param T The type.
+ * @param T The type.
  */
 #define TYPENAMEGET_DEFINE(T)                                                                      \
     template <>                                                                                    \
@@ -54,9 +54,9 @@
     }
 
 /**
- * \ingroup attributeimpl
+ * @ingroup attributeimpl
  * ns3::TypeNameGet() specialization for numeric types.
- * \returns The numeric type name as a string.
+ * @returns The numeric type name as a string.
  * @{
  */
 TYPENAMEGET_DEFINE(bool);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/type-traits.h ns-3.44/src/core/model/type-traits.h
--- ns-3.43/src/core/model/type-traits.h	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/model/type-traits.h	2025-03-09 16:55:49.363371100 -0700
@@ -12,8 +12,8 @@
 #include "ptr.h"
 
 /**
- *  \file
- *  \ingroup object
+ *  @file
+ *  @ingroup object
  *  ns3::TypeTraits introspection declaration and template implementation.
  */
 
@@ -21,9 +21,9 @@
 {
 
 /**
- * \ingroup object
+ * @ingroup object
  *  Inspect a type to deduce its features.
- *  \tparam T \deduced The type to inspect.
+ *  @tparam T \deduced The type to inspect.
  */
 template <typename T>
 struct NS_DEPRECATED_3_43("Use functions provided by #include <type_traits>") TypeTraits
@@ -36,7 +36,7 @@
 
     /**
      *  Not a const type.
-     *  \tparam U \deduced The type being inspected.
+     *  @tparam U \deduced The type being inspected.
      */
     template <typename U>
     struct UnConst
@@ -46,7 +46,7 @@
 
     /**
      *  Const type.
-     *  \tparam U \deduced The type being inspected.
+     *  @tparam U \deduced The type being inspected.
      */
     template <typename U>
     struct UnConst<const U>
@@ -56,7 +56,7 @@
 
     /**
      *  Not a reference type.
-     *  \tparam U \deduced The type being inspected.
+     *  @tparam U \deduced The type being inspected.
      */
     template <typename U>
     struct ReferenceTraits
@@ -72,7 +72,7 @@
 
     /**
      *  Reference type.
-     *  \tparam U \deduced The type being inspected.
+     *  @tparam U \deduced The type being inspected.
      */
     template <typename U>
     struct ReferenceTraits<U&>
@@ -88,7 +88,7 @@
 
     /**
      *  Not a pointer type.
-     *  \tparam U \deduced The type being inspected.
+     *  @tparam U \deduced The type being inspected.
      */
     template <typename U>
     struct PointerTraits
@@ -105,7 +105,7 @@
 
     /**
      *  Pointer type.
-     *  \tparam U \deduced The type being inspected.
+     *  @tparam U \deduced The type being inspected.
      */
     template <typename U>
     struct PointerTraits<U*>
@@ -122,7 +122,7 @@
 
     /**
      *  Ptr type.
-     *  \tparam U \deduced The type being inspected.
+     *  @tparam U \deduced The type being inspected.
      */
     template <typename U>
     struct PointerTraits<ns3::Ptr<U>>
@@ -139,7 +139,7 @@
 
     /**
      * Base type, after removing \c &, \c * and \c const.
-     * \tparam U \deduced The type being inspected.
+     * @tparam U \deduced The type being inspected.
      */
     template <typename U>
     struct Base
@@ -149,7 +149,7 @@
 
     /**
      * Base type, after removing \c &.
-     * \tparam U \deduced The type being inspected.
+     * @tparam U \deduced The type being inspected.
      */
     template <typename U>
     struct Base<U&>
@@ -159,7 +159,7 @@
 
     /**
      * Base type, after removing \c *.
-     * \tparam U \deduced The type being inspected.
+     * @tparam U \deduced The type being inspected.
      */
     template <typename U>
     struct Base<U*>
@@ -169,7 +169,7 @@
 
     /**
      * Base type, after removing \c const.
-     * \tparam U \deduced The type being inspected.
+     * @tparam U \deduced The type being inspected.
      */
     template <typename U>
     struct Base<const U>
@@ -179,7 +179,7 @@
 
     /**
      * Base type of a Ptr.
-     * \tparam U \deduced The type being inspected.
+     * @tparam U \deduced The type being inspected.
      */
     template <typename U>
     struct PtrBase
@@ -189,7 +189,7 @@
 
     /**
      * Base type of a Ptr.
-     * \tparam U \deduced The type being inspected.
+     * @tparam U \deduced The type being inspected.
      */
     template <typename U>
     struct PtrBase<ns3::Ptr<U>>
@@ -199,7 +199,7 @@
 
     /**
      *  Not a function pointer type.
-     *  \tparam U \deduced The type being inspected.
+     *  @tparam U \deduced The type being inspected.
      */
     template <typename U>
     struct FunctionPtrTraits
@@ -215,7 +215,7 @@
 
     /**
      *  Function pointer type.
-     *  \tparam U \deduced Return type.
+     *  @tparam U \deduced Return type.
      */
     template <typename U>
     struct FunctionPtrTraits<U (*)()>
@@ -236,8 +236,8 @@
 
     /**
      *  Function pointer type.
-     *  \tparam U \deduced Return type.
-     *  \tparam V1 \deduced Argument type.
+     *  @tparam U \deduced Return type.
+     *  @tparam V1 \deduced Argument type.
      */
     template <typename U, typename V1>
     struct FunctionPtrTraits<U (*)(V1)>
@@ -259,9 +259,9 @@
 
     /**
      *  Function pointer type.
-     *  \tparam U \deduced Return type.
-     *  \tparam V1 \deduced Argument type.
-     *  \tparam V2 \deduced Argument type.
+     *  @tparam U \deduced Return type.
+     *  @tparam V1 \deduced Argument type.
+     *  @tparam V2 \deduced Argument type.
      */
     template <typename U, typename V1, typename V2>
     struct FunctionPtrTraits<U (*)(V1, V2)>
@@ -284,10 +284,10 @@
 
     /**
      *  Function pointer type.
-     *  \tparam U \deduced Return type.
-     *  \tparam V1 \deduced Argument type.
-     *  \tparam V2 \deduced Argument type.
-     *  \tparam V3 \deduced Argument type.
+     *  @tparam U \deduced Return type.
+     *  @tparam V1 \deduced Argument type.
+     *  @tparam V2 \deduced Argument type.
+     *  @tparam V3 \deduced Argument type.
      */
     template <typename U, typename V1, typename V2, typename V3>
     struct FunctionPtrTraits<U (*)(V1, V2, V3)>
@@ -311,11 +311,11 @@
 
     /**
      *  Function pointer type.
-     *  \tparam U \deduced Return type.
-     *  \tparam V1 \deduced Argument type.
-     *  \tparam V2 \deduced Argument type.
-     *  \tparam V3 \deduced Argument type.
-     *  \tparam V4 \deduced Argument type.
+     *  @tparam U \deduced Return type.
+     *  @tparam V1 \deduced Argument type.
+     *  @tparam V2 \deduced Argument type.
+     *  @tparam V3 \deduced Argument type.
+     *  @tparam V4 \deduced Argument type.
      */
     template <typename U, typename V1, typename V2, typename V3, typename V4>
     struct FunctionPtrTraits<U (*)(V1, V2, V3, V4)>
@@ -340,12 +340,12 @@
 
     /**
      *  Function pointer type.
-     *  \tparam U \deduced Return type.
-     *  \tparam V1 \deduced Argument type.
-     *  \tparam V2 \deduced Argument type.
-     *  \tparam V3 \deduced Argument type.
-     *  \tparam V4 \deduced Argument type.
-     *  \tparam V5 \deduced Argument type.
+     *  @tparam U \deduced Return type.
+     *  @tparam V1 \deduced Argument type.
+     *  @tparam V2 \deduced Argument type.
+     *  @tparam V3 \deduced Argument type.
+     *  @tparam V4 \deduced Argument type.
+     *  @tparam V5 \deduced Argument type.
      */
     template <typename U, typename V1, typename V2, typename V3, typename V4, typename V5>
     struct FunctionPtrTraits<U (*)(V1, V2, V3, V4, V5)>
@@ -371,13 +371,13 @@
 
     /**
      *  Function pointer type.
-     *  \tparam U \deduced Return type.
-     *  \tparam V1 \deduced Argument type.
-     *  \tparam V2 \deduced Argument type.
-     *  \tparam V3 \deduced Argument type.
-     *  \tparam V4 \deduced Argument type.
-     *  \tparam V5 \deduced Argument type.
-     *  \tparam V6 \deduced Argument type.
+     *  @tparam U \deduced Return type.
+     *  @tparam V1 \deduced Argument type.
+     *  @tparam V2 \deduced Argument type.
+     *  @tparam V3 \deduced Argument type.
+     *  @tparam V4 \deduced Argument type.
+     *  @tparam V5 \deduced Argument type.
+     *  @tparam V6 \deduced Argument type.
      */
     template <typename U,
               typename V1,
@@ -410,7 +410,7 @@
 
     /**
      *  Not a pointer to member type.
-     *  \tparam U \deduced Return type.
+     *  @tparam U \deduced Return type.
      */
     template <typename U>
     struct PtrToMemberTraits
@@ -424,8 +424,8 @@
 
     /**
      *  Pointer to member function.
-     *  \tparam U \deduced Return type.
-     *  \tparam V \deduced Class type.
+     *  @tparam U \deduced Return type.
+     *  @tparam V \deduced Class type.
      */
     template <typename U, typename V>
     struct PtrToMemberTraits<U (V::*)()>
@@ -446,8 +446,8 @@
 
     /**
      *  Pointer to const member function.
-     *  \tparam U \deduced Return type.
-     *  \tparam V \deduced Class type.
+     *  @tparam U \deduced Return type.
+     *  @tparam V \deduced Class type.
      */
     template <typename U, typename V>
     struct PtrToMemberTraits<U (V::*)() const>
@@ -468,9 +468,9 @@
 
     /**
      *  Pointer to member function.
-     *  \tparam U \deduced Return type.
-     *  \tparam V \deduced Class type.
-     *  \tparam W1 \deduced Argument type.
+     *  @tparam U \deduced Return type.
+     *  @tparam V \deduced Class type.
+     *  @tparam W1 \deduced Argument type.
      */
     template <typename U, typename V, typename W1>
     struct PtrToMemberTraits<U (V::*)(W1)>
@@ -492,9 +492,9 @@
 
     /**
      *  Pointer to const member function.
-     *  \tparam U \deduced Return type.
-     *  \tparam V \deduced Class type.
-     *  \tparam W1 \deduced Argument type.
+     *  @tparam U \deduced Return type.
+     *  @tparam V \deduced Class type.
+     *  @tparam W1 \deduced Argument type.
      */
     template <typename U, typename V, typename W1>
     struct PtrToMemberTraits<U (V::*)(W1) const>
@@ -516,10 +516,10 @@
 
     /**
      *  Pointer to member function.
-     *  \tparam U \deduced Return type.
-     *  \tparam V \deduced Class type.
-     *  \tparam W1 \deduced Argument type.
-     *  \tparam W2 \deduced Argument type.
+     *  @tparam U \deduced Return type.
+     *  @tparam V \deduced Class type.
+     *  @tparam W1 \deduced Argument type.
+     *  @tparam W2 \deduced Argument type.
      */
     template <typename U, typename V, typename W1, typename W2>
     struct PtrToMemberTraits<U (V::*)(W1, W2)>
@@ -542,10 +542,10 @@
 
     /**
      *  Pointer to const member function.
-     *  \tparam U \deduced Return type.
-     *  \tparam V \deduced Class type.
-     *  \tparam W1 \deduced Argument type.
-     *  \tparam W2 \deduced Argument type.
+     *  @tparam U \deduced Return type.
+     *  @tparam V \deduced Class type.
+     *  @tparam W1 \deduced Argument type.
+     *  @tparam W2 \deduced Argument type.
      */
     template <typename U, typename V, typename W1, typename W2>
     struct PtrToMemberTraits<U (V::*)(W1, W2) const>
@@ -568,11 +568,11 @@
 
     /**
      *  Pointer to member function.
-     *  \tparam U \deduced Return type.
-     *  \tparam V \deduced Class type.
-     *  \tparam W1 \deduced Argument type.
-     *  \tparam W2 \deduced Argument type.
-     *  \tparam W3 \deduced Argument type.
+     *  @tparam U \deduced Return type.
+     *  @tparam V \deduced Class type.
+     *  @tparam W1 \deduced Argument type.
+     *  @tparam W2 \deduced Argument type.
+     *  @tparam W3 \deduced Argument type.
      */
     template <typename U, typename V, typename W1, typename W2, typename W3>
     struct PtrToMemberTraits<U (V::*)(W1, W2, W3)>
@@ -596,11 +596,11 @@
 
     /**
      *  Pointer to const member function.
-     *  \tparam U \deduced Return type.
-     *  \tparam V \deduced Class type.
-     *  \tparam W1 \deduced Argument type.
-     *  \tparam W2 \deduced Argument type.
-     *  \tparam W3 \deduced Argument type.
+     *  @tparam U \deduced Return type.
+     *  @tparam V \deduced Class type.
+     *  @tparam W1 \deduced Argument type.
+     *  @tparam W2 \deduced Argument type.
+     *  @tparam W3 \deduced Argument type.
      */
     template <typename U, typename V, typename W1, typename W2, typename W3>
     struct PtrToMemberTraits<U (V::*)(W1, W2, W3) const>
@@ -624,12 +624,12 @@
 
     /**
      *  Pointer to member function.
-     *  \tparam U \deduced Return type.
-     *  \tparam V \deduced Class type.
-     *  \tparam W1 \deduced Argument type.
-     *  \tparam W2 \deduced Argument type.
-     *  \tparam W3 \deduced Argument type.
-     *  \tparam W4 \deduced Argument type.
+     *  @tparam U \deduced Return type.
+     *  @tparam V \deduced Class type.
+     *  @tparam W1 \deduced Argument type.
+     *  @tparam W2 \deduced Argument type.
+     *  @tparam W3 \deduced Argument type.
+     *  @tparam W4 \deduced Argument type.
      */
     template <typename U, typename V, typename W1, typename W2, typename W3, typename W4>
     struct PtrToMemberTraits<U (V::*)(W1, W2, W3, W4)>
@@ -654,12 +654,12 @@
 
     /**
      *  Pointer to const member function.
-     *  \tparam U \deduced Return type.
-     *  \tparam V \deduced Class type.
-     *  \tparam W1 \deduced Argument type.
-     *  \tparam W2 \deduced Argument type.
-     *  \tparam W3 \deduced Argument type.
-     *  \tparam W4 \deduced Argument type.
+     *  @tparam U \deduced Return type.
+     *  @tparam V \deduced Class type.
+     *  @tparam W1 \deduced Argument type.
+     *  @tparam W2 \deduced Argument type.
+     *  @tparam W3 \deduced Argument type.
+     *  @tparam W4 \deduced Argument type.
      */
     template <typename U, typename V, typename W1, typename W2, typename W3, typename W4>
     struct PtrToMemberTraits<U (V::*)(W1, W2, W3, W4) const>
@@ -684,13 +684,13 @@
 
     /**
      *  Pointer to member function.
-     *  \tparam U \deduced Return type.
-     *  \tparam V \deduced Class type.
-     *  \tparam W1 \deduced Argument type.
-     *  \tparam W2 \deduced Argument type.
-     *  \tparam W3 \deduced Argument type.
-     *  \tparam W4 \deduced Argument type.
-     *  \tparam W5 \deduced Argument type.
+     *  @tparam U \deduced Return type.
+     *  @tparam V \deduced Class type.
+     *  @tparam W1 \deduced Argument type.
+     *  @tparam W2 \deduced Argument type.
+     *  @tparam W3 \deduced Argument type.
+     *  @tparam W4 \deduced Argument type.
+     *  @tparam W5 \deduced Argument type.
      */
     template <typename U,
               typename V,
@@ -722,13 +722,13 @@
 
     /**
      *  Pointer to const member function.
-     *  \tparam U \deduced Return type.
-     *  \tparam V \deduced Class type.
-     *  \tparam W1 \deduced Argument type.
-     *  \tparam W2 \deduced Argument type.
-     *  \tparam W3 \deduced Argument type.
-     *  \tparam W4 \deduced Argument type.
-     *  \tparam W5 \deduced Argument type.
+     *  @tparam U \deduced Return type.
+     *  @tparam V \deduced Class type.
+     *  @tparam W1 \deduced Argument type.
+     *  @tparam W2 \deduced Argument type.
+     *  @tparam W3 \deduced Argument type.
+     *  @tparam W4 \deduced Argument type.
+     *  @tparam W5 \deduced Argument type.
      */
     template <typename U,
               typename V,
@@ -760,14 +760,14 @@
 
     /**
      *  Pointer to member function.
-     *  \tparam U \deduced Return type.
-     *  \tparam V \deduced Class type.
-     *  \tparam W1 \deduced Argument type.
-     *  \tparam W2 \deduced Argument type.
-     *  \tparam W3 \deduced Argument type.
-     *  \tparam W4 \deduced Argument type.
-     *  \tparam W5 \deduced Argument type.
-     *  \tparam W6 \deduced Argument type.
+     *  @tparam U \deduced Return type.
+     *  @tparam V \deduced Class type.
+     *  @tparam W1 \deduced Argument type.
+     *  @tparam W2 \deduced Argument type.
+     *  @tparam W3 \deduced Argument type.
+     *  @tparam W4 \deduced Argument type.
+     *  @tparam W5 \deduced Argument type.
+     *  @tparam W6 \deduced Argument type.
      */
     template <typename U,
               typename V,
@@ -801,14 +801,14 @@
 
     /**
      *  Pointer to const member function.
-     *  \tparam U \deduced Return type.
-     *  \tparam V \deduced Class type.
-     *  \tparam W1 \deduced Argument type.
-     *  \tparam W2 \deduced Argument type.
-     *  \tparam W3 \deduced Argument type.
-     *  \tparam W4 \deduced Argument type.
-     *  \tparam W5 \deduced Argument type.
-     *  \tparam W6 \deduced Argument type.
+     *  @tparam U \deduced Return type.
+     *  @tparam V \deduced Class type.
+     *  @tparam W1 \deduced Argument type.
+     *  @tparam W2 \deduced Argument type.
+     *  @tparam W3 \deduced Argument type.
+     *  @tparam W4 \deduced Argument type.
+     *  @tparam W5 \deduced Argument type.
+     *  @tparam W6 \deduced Argument type.
      */
     template <typename U,
               typename V,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/uinteger.cc ns-3.44/src/core/model/uinteger.cc
--- ns-3.43/src/core/model/uinteger.cc	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/model/uinteger.cc	2025-03-09 16:55:49.363371100 -0700
@@ -13,8 +13,8 @@
 #include <sstream>
 
 /**
- * \file
- * \ingroup attribute_Uinteger
+ * @file
+ * @ingroup attribute_Uinteger
  * ns3::UintegerValue attribute value implementations.
  */
 
@@ -29,13 +29,13 @@
 {
 
 /**
- * \ingroup attribute_Uinteger
+ * @ingroup attribute_Uinteger
  * Make an Uinteger attribute checker with embedded numeric type name.
  *
- * \param [in] min The minimum allowed value.
- * \param [in] max The maximum allowed value.
- * \param [in] name The original type name ("uint8_t", "uint16_t", _etc_.).
- * \returns The AttributeChecker.
+ * @param [in] min The minimum allowed value.
+ * @param [in] max The maximum allowed value.
+ * @param [in] name The original type name ("uint8_t", "uint16_t", _etc_.).
+ * @returns The AttributeChecker.
  */
 Ptr<const AttributeChecker>
 MakeUintegerChecker(uint64_t min, uint64_t max, std::string name)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/uinteger.h ns-3.44/src/core/model/uinteger.h
--- ns-3.43/src/core/model/uinteger.h	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/model/uinteger.h	2025-03-09 16:55:49.363371100 -0700
@@ -15,8 +15,8 @@
 #include <stdint.h>
 
 /**
- * \file
- * \ingroup attribute_Uinteger
+ * @file
+ * @ingroup attribute_Uinteger
  * ns3::UintegerValue attribute value declarations and template implementations.
  */
 
@@ -42,9 +42,9 @@
  *
  * The minimum value is included in the allowed range.
  *
- * \param [in] min The minimum value.
- * \returns The AttributeChecker.
- * \see AttributeChecker
+ * @param [in] min The minimum value.
+ * @returns The AttributeChecker.
+ * @see AttributeChecker
  */
 template <typename T>
 Ptr<const AttributeChecker> MakeUintegerChecker(uint64_t min);
@@ -54,10 +54,10 @@
  *
  * The minimum and maximum values are included in the allowed range.
  *
- * \param [in] min The minimum value.
- * \param [in] max The maximum value.
- * \returns The AttributeChecker.
- * \see AttributeChecker
+ * @param [in] min The minimum value.
+ * @param [in] max The maximum value.
+ * @returns The AttributeChecker.
+ * @see AttributeChecker
  */
 template <typename T>
 Ptr<const AttributeChecker> MakeUintegerChecker(uint64_t min, uint64_t max);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/uniform-random-bit-generator.h ns-3.44/src/core/model/uniform-random-bit-generator.h
--- ns-3.43/src/core/model/uniform-random-bit-generator.h	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/model/uniform-random-bit-generator.h	2025-03-09 16:55:49.363371100 -0700
@@ -30,7 +30,7 @@
     }
 
     /**
-     * \return the ns-3 style uniform random variable
+     * @return the ns-3 style uniform random variable
      */
     Ptr<UniformRandomVariable> GetRv() const
     {
@@ -41,7 +41,7 @@
     using result_type = uint32_t;
 
     /**
-     * \return the smallest value that operator() may return
+     * @return the smallest value that operator() may return
      */
     static constexpr result_type min()
     {
@@ -49,7 +49,7 @@
     }
 
     /**
-     * \return the largest value that operator() may return
+     * @return the largest value that operator() may return
      */
     static constexpr result_type max()
     {
@@ -57,7 +57,7 @@
     }
 
     /**
-     * \return a value in the closed interval [min(), max()]
+     * @return a value in the closed interval [min(), max()]
      */
     result_type operator()()
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/unix-fd-reader.cc ns-3.44/src/core/model/unix-fd-reader.cc
--- ns-3.43/src/core/model/unix-fd-reader.cc	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/model/unix-fd-reader.cc	2025-03-09 16:55:49.363371100 -0700
@@ -21,8 +21,8 @@
 #include <unistd.h> // close()
 
 /**
- * \file
- * \ingroup system
+ * @file
+ * @ingroup system
  * ns3::FdReader implementation.
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/val-array.h ns-3.44/src/core/model/val-array.h
--- ns-3.43/src/core/model/val-array.h	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/model/val-array.h	2025-03-09 16:55:49.363371100 -0700
@@ -19,14 +19,14 @@
 {
 
 /**
- * \defgroup Matrices Classes to do efficient math operations on arrays
- * \ingroup core
+ * @defgroup Matrices Classes to do efficient math operations on arrays
+ * @ingroup core
  */
 
 /**
- * \ingroup Matrices
+ * @ingroup Matrices
  *
- * \brief ValArray is a class to efficiently store 3D array. The class is general
+ * @brief ValArray is a class to efficiently store 3D array. The class is general
  * enough to represent 1D array or 2D arrays. ValArray also provides basic
  * algebra element-wise operations over the whole array (1D, 2D, 3D).
  *
@@ -76,66 +76,66 @@
     // instruct the compiler to generate the default constructor
     ValArray() = default;
     /**
-     * \brief Constructor that creates "numPages" number of 2D arrays that are of
+     * @brief Constructor that creates "numPages" number of 2D arrays that are of
      * dimensions "numRows"x"numCols", and are initialized with all-zero elements.
      * If only 1 parameter, numRows, is provided then a single 1D array is being created.
-     * \param numRows the number of rows
-     * \param numCols the number of columns
-     * \param numPages the number of pages
+     * @param numRows the number of rows
+     * @param numCols the number of columns
+     * @param numPages the number of pages
      */
     ValArray(size_t numRows, size_t numCols = 1, size_t numPages = 1);
     /**
-     * \brief Constructor creates a single 1D array of values.size () elements and 1 column,
+     * @brief Constructor creates a single 1D array of values.size () elements and 1 column,
      * and uses std::valarray<T> values to initialize the elements.
-     * \param values std::valarray<T> that will be used to initialize elements of 1D array
+     * @param values std::valarray<T> that will be used to initialize elements of 1D array
      */
     explicit ValArray(const std::valarray<T>& values);
     /**
-     * \brief Constructor creates a single 1D array of values.size () elements and 1 column,
+     * @brief Constructor creates a single 1D array of values.size () elements and 1 column,
      * and moves std::valarray<T> values to initialize the elements.
-     * \param values std::valarray<T> that will be moved to initialize elements of 1D array
+     * @param values std::valarray<T> that will be moved to initialize elements of 1D array
      */
     ValArray(std::valarray<T>&& values);
     /**
-     * \brief Constructor creates a single 1D array of values.size () elements and 1 column,
+     * @brief Constructor creates a single 1D array of values.size () elements and 1 column,
      * and uses values std::vector<T> to initialize the elements.
-     * \param values std::vector<T> that will be used to initialize elements of 1D array
+     * @param values std::vector<T> that will be used to initialize elements of 1D array
      */
     explicit ValArray(const std::vector<T>& values);
     /**
-     * \brief Constructor creates a single 2D array of numRows and numCols, and uses
+     * @brief Constructor creates a single 2D array of numRows and numCols, and uses
      * std::valarray<T> values to initialize the elements.
-     * \param numRows the number of rows
-     * \param numCols the number of columns
-     * \param values valarray<T> that will be used to initialize elements of 3D array
+     * @param numRows the number of rows
+     * @param numCols the number of columns
+     * @param values valarray<T> that will be used to initialize elements of 3D array
      */
     ValArray(size_t numRows, size_t numCols, const std::valarray<T>& values);
     /**
-     * \brief Constructor creates a single 2D array of numRows and numCols, and moves
+     * @brief Constructor creates a single 2D array of numRows and numCols, and moves
      * std::valarray<T> values to initialize the elements.
-     * \param numRows the number of rows
-     * \param numCols the number of columns
-     * \param values valarray<T> that will be used to initialize elements of 3D array
+     * @param numRows the number of rows
+     * @param numCols the number of columns
+     * @param values valarray<T> that will be used to initialize elements of 3D array
      */
     ValArray(size_t numRows, size_t numCols, std::valarray<T>&& values);
     /**
-     * \brief Constructor creates the 3D array of numRows x numCols x numPages dimensions,
+     * @brief Constructor creates the 3D array of numRows x numCols x numPages dimensions,
      * and uses std::valarray<T> values to initialize all the 2D arrays, where first
      * numRows*numCols elements will belong to the first 2D array.
-     * \param numRows the number of rows
-     * \param numCols the number of columns
-     * \param numPages the number of pages
-     * \param values valarray<T> that will be used to initialize elements of 3D array
+     * @param numRows the number of rows
+     * @param numCols the number of columns
+     * @param numPages the number of pages
+     * @param values valarray<T> that will be used to initialize elements of 3D array
      */
     ValArray(size_t numRows, size_t numCols, size_t numPages, const std::valarray<T>& values);
     /**
-     * \brief Constructor creates the 3D array of numRows x numCols x numPages dimensions,
+     * @brief Constructor creates the 3D array of numRows x numCols x numPages dimensions,
      * and moves std::valarray<T> values to initialize all the 2D arrays, where first
      * numRows*numCols elements will belong to the first 2D array.
-     * \param numRows the number of rows
-     * \param numCols the number of columns
-     * \param numPages the number of pages
-     * \param values valarray<T> that will be used to initialize elements of 3D array
+     * @param numRows the number of rows
+     * @param numCols the number of columns
+     * @param numPages the number of pages
+     * @param values valarray<T> that will be used to initialize elements of 3D array
      */
     ValArray(size_t numRows, size_t numCols, size_t numPages, std::valarray<T>&& values);
     /** instruct the compiler to generate the implicitly declared destructor*/
@@ -143,215 +143,215 @@
     /** instruct the compiler to generate the implicitly declared copy constructor*/
     ValArray(const ValArray<T>&) = default;
     /**
-     * \brief Copy assignment operator.
+     * @brief Copy assignment operator.
      * Instruct the compiler to generate the implicitly declared copy assignment operator.
-     * \return a reference to the assigned object
+     * @return a reference to the assigned object
      */
     ValArray& operator=(const ValArray<T>&) = default;
     /** instruct the compiler to generate the implicitly declared move constructor*/
     ValArray(ValArray<T>&&) = default;
     /**
-     * \brief Move assignment operator.
+     * @brief Move assignment operator.
      * Instruct the compiler to generate the implicitly declared move assignment operator.
-     * \return a reference to the assigned object
+     * @return a reference to the assigned object
      */
     ValArray<T>& operator=(ValArray<T>&&) = default;
     /**
-     * \returns Number of rows
+     * @returns Number of rows
      */
     size_t GetNumRows() const;
     /**
-     * \returns Number of columns
+     * @returns Number of columns
      */
     size_t GetNumCols() const;
     /**
-     * \returns Number of pages, i.e., the number of 2D arrays
+     * @returns Number of pages, i.e., the number of 2D arrays
      */
     size_t GetNumPages() const;
     /**
-     * \returns Total number of elements
+     * @returns Total number of elements
      */
     size_t GetSize() const;
     /**
-     * \brief Access operator, with bound-checking in debug profile
-     * \param rowIndex The index of the row
-     * \param colIndex The index of the column
-     * \param pageIndex The index of the page
-     * \returns A const reference to the element with with rowIndex, colIndex and pageIndex indices.
+     * @brief Access operator, with bound-checking in debug profile
+     * @param rowIndex The index of the row
+     * @param colIndex The index of the column
+     * @param pageIndex The index of the page
+     * @returns A const reference to the element with with rowIndex, colIndex and pageIndex indices.
      */
     T& operator()(size_t rowIndex, size_t colIndex, size_t pageIndex);
     /**
-     * \brief Const access operator, with bound-checking in debug profile
-     * \param rowIndex The index of the row
-     * \param colIndex The index of the column
-     * \param pageIndex The index of the page
-     * \returns A const reference to the element with with rowIndex, colIndex and pageIndex indices.
+     * @brief Const access operator, with bound-checking in debug profile
+     * @param rowIndex The index of the row
+     * @param colIndex The index of the column
+     * @param pageIndex The index of the page
+     * @returns A const reference to the element with with rowIndex, colIndex and pageIndex indices.
      */
     const T& operator()(size_t rowIndex, size_t colIndex, size_t pageIndex) const;
     /**
-     * \brief Access operator for 2D ValArrays.
+     * @brief Access operator for 2D ValArrays.
      * Assuming that the third dimension is equal to 1, e.g. ValArray contains
      * a single 2D array.
      * Note: intentionally not implemented through three parameters access operator,
      * to avoid accidental mistakes by user, e.g., providing 2 parameters when
      * 3 are necessary, but access operator would return valid value if default
      * value of pages provided is 0.
-     * \param rowIndex The index of the row
-     * \param colIndex The index of the column
-     * \returns A reference to the element with the specified indices
+     * @param rowIndex The index of the row
+     * @param colIndex The index of the column
+     * @returns A reference to the element with the specified indices
      */
     T& operator()(size_t rowIndex, size_t colIndex);
     /**
-     * \brief Const access operator for 2D ValArrays.
+     * @brief Const access operator for 2D ValArrays.
      * Assuming that the third dimension is equal to 1, e.g. ValArray contains
      * a single 2D array.
-     * \param rowIndex row index
-     * \param colIndex column index
-     * \returns a Const reference to the value with the specified row and column index.
+     * @param rowIndex row index
+     * @param colIndex column index
+     * @returns a Const reference to the value with the specified row and column index.
      */
     const T& operator()(size_t rowIndex, size_t colIndex) const;
     /**
-     * \brief Single-element access operator() for 1D ValArrays.
+     * @brief Single-element access operator() for 1D ValArrays.
      * Assuming that the number of columns and pages is equal to 1, e.g. ValArray
      * contains a single column or a single row.
      *
      * Note: intentionally not implemented through three parameters access operator,
      * to avoid accidental mistakes by user, e.g., providing 1 parameters when
      * 2 or 3 are necessary.
-     * \param index The index of the 1D ValArray.
-     * \returns A reference to the value with the specified index.
+     * @param index The index of the 1D ValArray.
+     * @returns A reference to the value with the specified index.
      */
     T& operator()(size_t index);
     /**
-     * \brief Single-element access operator() for 1D ValArrays.
-     * \param index The index of the 1D ValArray.
-     * \returns The const reference to the values with the specified index.
+     * @brief Single-element access operator() for 1D ValArrays.
+     * @param index The index of the 1D ValArray.
+     * @returns The const reference to the values with the specified index.
      */
     const T& operator()(size_t index) const;
     /**
-     * \brief Element-wise multiplication with a scalar value.
-     * \param rhs A scalar value of type T
-     * \returns ValArray in which each element has been multiplied by the given
+     * @brief Element-wise multiplication with a scalar value.
+     * @param rhs A scalar value of type T
+     * @returns ValArray in which each element has been multiplied by the given
      * scalar value.
      */
     ValArray operator*(const T& rhs) const;
     /**
-     * \brief operator+ definition for ValArray<T>.
-     * \param rhs The rhs ValArray to be added to this ValArray.
-     * \return the ValArray instance that holds the results of the operator+
+     * @brief operator+ definition for ValArray<T>.
+     * @param rhs The rhs ValArray to be added to this ValArray.
+     * @return the ValArray instance that holds the results of the operator+
      */
     ValArray operator+(const ValArray<T>& rhs) const;
     /**
-     * \brief binary operator- definition for ValArray<T>.
-     * \param rhs The rhs ValArray to be subtracted from this ValArray.
-     * \return the ValArray instance that holds the results of the operator-
+     * @brief binary operator- definition for ValArray<T>.
+     * @param rhs The rhs ValArray to be subtracted from this ValArray.
+     * @return the ValArray instance that holds the results of the operator-
      */
     ValArray operator-(const ValArray<T>& rhs) const;
     /**
-     * \brief unary operator- definition for ValArray<T>.
-     * \return the ValArray instance that holds the results of the operator-
+     * @brief unary operator- definition for ValArray<T>.
+     * @return the ValArray instance that holds the results of the operator-
      */
     ValArray operator-() const;
     /**
-     * \brief operator+= definition for ValArray<T>.
-     * \param rhs The rhs ValArray to be added to this ValArray.
-     * \return a reference to this ValArray instance
+     * @brief operator+= definition for ValArray<T>.
+     * @param rhs The rhs ValArray to be added to this ValArray.
+     * @return a reference to this ValArray instance
      */
     ValArray<T>& operator+=(const ValArray<T>& rhs);
     /**
-     * \brief operator-= definition for ValArray<T>.
-     * \param rhs The rhs ValArray to be subtracted from this ValArray.
+     * @brief operator-= definition for ValArray<T>.
+     * @param rhs The rhs ValArray to be subtracted from this ValArray.
      ** \return a reference to this ValArray instance
      */
     ValArray<T>& operator-=(const ValArray<T>& rhs);
     /**
-     * \brief operator== definition for ValArray<T>.
-     * \param rhs The ValArray instance to be compared with lhs ValArray instance
-     * \return true if rhs ValArray is equal to this ValArray, otherwise it returns false
+     * @brief operator== definition for ValArray<T>.
+     * @param rhs The ValArray instance to be compared with lhs ValArray instance
+     * @return true if rhs ValArray is equal to this ValArray, otherwise it returns false
      */
     bool operator==(const ValArray<T>& rhs) const;
     /**
-     * \brief operator!= definition for ValArray<T>.
-     * \param rhs The ValArray instance to be compared with lhs ValArray instance
-     * \return true if rhs ValArray is not equal to this ValArray, otherwise it returns true
+     * @brief operator!= definition for ValArray<T>.
+     * @param rhs The ValArray instance to be compared with lhs ValArray instance
+     * @return true if rhs ValArray is not equal to this ValArray, otherwise it returns true
      */
     bool operator!=(const ValArray<T>& rhs) const;
     /**
-     * \brief Compare Valarray up to a given absolute tolerance. This operation
+     * @brief Compare Valarray up to a given absolute tolerance. This operation
      * is element-wise operation, i.e., the elements with the same indices from
      * the lhs and rhs ValArray are being compared, allowing the tolerance defined
      * byt "tol" parameter.
-     * \param rhs The rhs ValArray
-     * \param tol The absolute tolerance
-     * \returns true if the differences in each element-wise comparison is less
+     * @param rhs The rhs ValArray
+     * @param tol The absolute tolerance
+     * @returns true if the differences in each element-wise comparison is less
      * or equal to tol.
      */
     bool IsAlmostEqual(const ValArray<T>& rhs, T tol) const;
     /**
-     * \brief Get a data pointer to a specific 2D array for use in linear
+     * @brief Get a data pointer to a specific 2D array for use in linear
      * algebra libraries
-     * \param pageIndex The index of the desired 2D array
-     * \returns a pointer to the data elements of the 2D array
+     * @param pageIndex The index of the desired 2D array
+     * @returns a pointer to the data elements of the 2D array
      */
     T* GetPagePtr(size_t pageIndex);
     /**
-     * \brief Get a data pointer to a specific 2D array for use in linear
+     * @brief Get a data pointer to a specific 2D array for use in linear
      * algebra libraries
-     * \param pageIndex An index of the desired 2D array
-     * \returns a pointer to the data elements of the 2D array
+     * @param pageIndex An index of the desired 2D array
+     * @returns a pointer to the data elements of the 2D array
      */
     const T* GetPagePtr(size_t pageIndex) const;
     /**
-     * \brief Checks whether rhs and lhs ValArray objects have the same dimensions.
-     * \param rhs The rhs ValArray
-     * \returns true if the dimensions of lhs and rhs are equal, otherwise it returns false
+     * @brief Checks whether rhs and lhs ValArray objects have the same dimensions.
+     * @param rhs The rhs ValArray
+     * @returns true if the dimensions of lhs and rhs are equal, otherwise it returns false
      */
     bool EqualDims(const ValArray<T>& rhs) const;
     /**
-     * \brief Function that asserts if the dimensions of lhs and rhs ValArray are
+     * @brief Function that asserts if the dimensions of lhs and rhs ValArray are
      * not equal and prints a message with the matrices dimensions.
-     * \param rhs the rhs ValArray
+     * @param rhs the rhs ValArray
      */
     void AssertEqualDims(const ValArray<T>& rhs) const;
     /**
-     * \brief Single-element access operator[] that can be used to access a specific
+     * @brief Single-element access operator[] that can be used to access a specific
      * element of 1D ValArray. It mimics operator[] from std::vector.
      * This function is introduced for compatibility with ns-3 usage of 1D arrays,
      * which are usually represented through std::vector operators in spectrum
      * and antenna module.
      *
-     * \param index The index of the element to be returned
-     * \returns A reference to a specific element from the underlying std::valarray.
+     * @param index The index of the element to be returned
+     * @returns A reference to a specific element from the underlying std::valarray.
      */
     T& operator[](size_t index);
     /**
-     * \brief Const access operator that can be used to access a specific element of
+     * @brief Const access operator that can be used to access a specific element of
      * 1D ValArray.
      *
-     * \param index The index of the element to be returned
-     * \returns A const reference to a specific element from the underlying std::valarray.
+     * @param index The index of the element to be returned
+     * @returns A const reference to a specific element from the underlying std::valarray.
      */
     const T& operator[](size_t index) const;
     /**
-     * \brief Returns underlying values. This function allows to directly work
+     * @brief Returns underlying values. This function allows to directly work
      * with the underlying values, which can be faster then using access operators.
-     * \returns A const reference to the underlying std::valarray<T>.
+     * @returns A const reference to the underlying std::valarray<T>.
      */
     const std::valarray<T>& GetValues() const;
     /**
-     * \brief Alternative access operator to access a specific element.
-     * \param row the row index of the element to be obtained
-     * \param col the col index of the element to be obtained
-     * \param page the page index of the element to be obtained
-     * \return a reference to the element of this ValArray
+     * @brief Alternative access operator to access a specific element.
+     * @param row the row index of the element to be obtained
+     * @param col the col index of the element to be obtained
+     * @param page the page index of the element to be obtained
+     * @return a reference to the element of this ValArray
      */
     T& Elem(size_t row, size_t col, size_t page);
     /**
-     * \brief Alternative const access operator to access a specific element.
-     * \param row the row index of the element to be obtained
-     * \param col the column index of the element to be obtained
-     * \param page the page index of the element to be obtained
-     * \return a const reference to the element of this ValArray
+     * @brief Alternative const access operator to access a specific element.
+     * @param row the row index of the element to be obtained
+     * @param col the column index of the element to be obtained
+     * @param page the page index of the element to be obtained
+     * @return a const reference to the element of this ValArray
      */
     const T& Elem(size_t row, size_t col, size_t page) const;
 
@@ -700,11 +700,11 @@
 }
 
 /**
- * \brief Overloads output stream operator.
- * \tparam T the type of the ValArray for which will be called this function
- * \param os a reference to the output stream
- * \param a the ValArray instance using type T
- * \return a reference to the output stream
+ * @brief Overloads output stream operator.
+ * @tparam T the type of the ValArray for which will be called this function
+ * @param os a reference to the output stream
+ * @param a the ValArray instance using type T
+ * @return a reference to the output stream
  */
 template <class T>
 std::ostream&
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/vector.cc ns-3.44/src/core/model/vector.cc
--- ns-3.43/src/core/model/vector.cc	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/model/vector.cc	2025-03-09 16:55:49.367371000 -0700
@@ -15,8 +15,8 @@
 #include <tuple>
 
 /**
- * \file
- * \ingroup geometry
+ * @file
+ * @ingroup geometry
  * ns3::Vector, ns3::Vector2D and ns3::Vector3D attribute value implementations.
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/vector.h ns-3.44/src/core/model/vector.h
--- ns-3.43/src/core/model/vector.h	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/model/vector.h	2025-03-09 16:55:49.367371000 -0700
@@ -12,8 +12,8 @@
 #include "attribute.h"
 
 /**
- * \file
- * \ingroup geometry
+ * @file
+ * @ingroup geometry
  * ns3::Vector, ns3::Vector2D and ns3::Vector3D declarations.
  */
 
@@ -21,23 +21,23 @@
 {
 
 /**
- * \ingroup core
- * \defgroup geometry Geometry primitives
- * \brief Primitives for geometry, such as vectors and angles.
+ * @ingroup core
+ * @defgroup geometry Geometry primitives
+ * @brief Primitives for geometry, such as vectors and angles.
  */
 
 /**
- * \ingroup geometry
- * \brief a 3d vector
- * \see attribute_Vector3D
+ * @ingroup geometry
+ * @brief a 3d vector
+ * @see attribute_Vector3D
  */
 class Vector3D
 {
   public:
     /**
-     * \param [in] _x X coordinate of vector
-     * \param [in] _y Y coordinate of vector
-     * \param [in] _z Z coordinate of vector
+     * @param [in] _x X coordinate of vector
+     * @param [in] _y Y coordinate of vector
+     * @param [in] _z Z coordinate of vector
      *
      * Create vector (_x, _y, _z)
      */
@@ -51,29 +51,29 @@
 
     /**
      * Compute the length (magnitude) of the vector.
-     * \returns the vector length.
+     * @returns the vector length.
      */
     double GetLength() const;
 
     /**
      * Compute the squared length of the vector.
-     * \returns the vector length squared.
+     * @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
-     * \returns The distance between \pname{a} and \pname{b}.
+     * @brief Calculate the 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 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}.
+     * @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);
 
@@ -81,9 +81,9 @@
      * Output streamer.
      * Vectors are written as "x:y:z".
      *
-     * \param [in,out] os The stream.
-     * \param [in] vector The vector to stream
-     * \return The stream.
+     * @param [in,out] os The stream.
+     * @param [in] vector The vector to stream
+     * @return The stream.
      */
     friend std::ostream& operator<<(std::ostream& os, const Vector3D& vector);
 
@@ -92,112 +92,112 @@
      *
      * Vectors are expected to be in the form "x:y:z".
      *
-     * \param [in,out] is The stream.
-     * \param [in] vector The vector.
-     * \returns The stream.
+     * @param [in,out] is The stream.
+     * @param [in] vector The vector.
+     * @returns The stream.
      */
     friend std::istream& operator>>(std::istream& is, Vector3D& vector);
 
     /**
      * Less than comparison operator
-     * \param [in] a lhs vector
-     * \param [in] b rhs vector
-     * \returns \c true if \pname{a} is less than \pname{b}
+     * @param [in] a lhs vector
+     * @param [in] b rhs vector
+     * @returns \c true if \pname{a} is less than \pname{b}
      */
     friend bool operator<(const Vector3D& a, const Vector3D& b);
 
     /**
      * Less than or equal to comparison operator
-     * \param [in] a lhs vector
-     * \param [in] b rhs vector
-     * \returns \c true if \pname{a} is less than or equal to \pname{b}.
+     * @param [in] a lhs vector
+     * @param [in] b rhs vector
+     * @returns \c true if \pname{a} is less than or equal to \pname{b}.
      */
     friend bool operator<=(const Vector3D& a, const Vector3D& b);
 
     /**
      * Greater than comparison operator
-     * \param [in] a lhs vector
-     * \param [in] b rhs vector
-     * \returns \c true if \pname{a} is greater than \pname{b}.
+     * @param [in] a lhs vector
+     * @param [in] b rhs vector
+     * @returns \c true if \pname{a} is greater than \pname{b}.
      */
     friend bool operator>(const Vector3D& a, const Vector3D& b);
 
     /**
      * Greater than or equal to comparison operator
-     * \param [in] a lhs vector
-     * \param [in] b rhs vector
-     * \returns \c true if \pname{a} is greater than or equal to \pname{b}.
+     * @param [in] a lhs vector
+     * @param [in] b rhs vector
+     * @returns \c true if \pname{a} is greater than or equal to \pname{b}.
      */
     friend bool operator>=(const Vector3D& a, const Vector3D& b);
 
     /**
      * Equality operator.
-     * \param [in] a lhs vector.
-     * \param [in] b rhs vector.
-     * \returns \c true if \pname{a} is equal to \pname{b}.
+     * @param [in] a lhs vector.
+     * @param [in] b rhs vector.
+     * @returns \c true if \pname{a} is equal to \pname{b}.
      */
     friend bool operator==(const Vector3D& a, const Vector3D& b);
 
     /**
      * Inequality operator.
-     * \param [in] a lhs vector.
-     * \param [in] b rhs vector.
-     * \returns \c true if \pname{a} is not equal to \pname{b}.
+     * @param [in] a lhs vector.
+     * @param [in] b rhs vector.
+     * @returns \c true if \pname{a} is not equal to \pname{b}.
      */
     friend bool operator!=(const Vector3D& a, const Vector3D& b);
 
     /**
      * Addition operator.
-     * \param [in] a lhs vector.
-     * \param [in] b rhs vector.
-     * \returns The vector sum of \pname{a} and \pname{b}.
+     * @param [in] a lhs vector.
+     * @param [in] b rhs vector.
+     * @returns The vector sum of \pname{a} and \pname{b}.
      */
     friend Vector3D operator+(const Vector3D& a, const Vector3D& b);
 
     /**
      * Subtraction operator.
-     * \param [in] a lhs vector.
-     * \param [in] b rhs vector.
-     * \returns The vector difference of \pname{a} and \pname{b}.
+     * @param [in] a lhs vector.
+     * @param [in] b rhs vector.
+     * @returns The vector difference of \pname{a} and \pname{b}.
      */
     friend Vector3D operator-(const Vector3D& a, const Vector3D& b);
 
     /**
      * Scalar multiplication operator.
-     * \param [in] a lhs vector.
-     * \param [in] b rhs scalar.
-     * \returns The vector \pname{a} scaled by \pname{b}.
+     * @param [in] a lhs vector.
+     * @param [in] b rhs scalar.
+     * @returns The vector \pname{a} scaled by \pname{b}.
      */
     friend Vector3D operator*(const Vector3D& a, double b);
 
     /**
      * Scalar multiplication operator.
-     * \param [in] a lhs scalar.
-     * \param [in] b rhs vector.
-     * \returns The vector \pname{b} scaled by \pname{a}.
+     * @param [in] a lhs scalar.
+     * @param [in] b rhs vector.
+     * @returns The vector \pname{b} scaled by \pname{a}.
      */
     friend Vector3D operator*(double a, const Vector3D& b);
 
     /**
      * Dot product operator.
-     * \param [in] a lhs vector.
-     * \param [in] b rhs vector.
-     * \returns The dot product of \pname{a} and \pname{b}.
+     * @param [in] a lhs vector.
+     * @param [in] b rhs vector.
+     * @returns The dot product of \pname{a} and \pname{b}.
      */
     friend double operator*(const Vector3D& a, const Vector3D& b);
 };
 
 /**
- * \ingroup geometry
- * \brief a 2d vector
- * \see attribute_Vector2D
+ * @ingroup geometry
+ * @brief a 2d vector
+ * @see attribute_Vector2D
  */
 class Vector2D
 {
   public:
     /**
-     * \param [in] _x X coordinate of vector
-     * \param [in] _y Y coordinate of vector
+     * @param [in] _x X coordinate of vector
+     * @param [in] _y Y coordinate of vector
      *
      * Create vector (_x, _y)
      */
@@ -208,25 +208,25 @@
     double y; //!< y coordinate of vector
 
     // works:  /** \copydoc ns3::Vector3D::GetLength() */
-    /** \copydoc Vector3D::GetLength() */
+    /** @copydoc Vector3D::GetLength() */
     double GetLength() const;
 
-    /** \copydoc Vector3D::GetLengthSquared() */
+    /** @copydoc Vector3D::GetLengthSquared() */
     double GetLengthSquared() const;
 
     /**
-     * \brief Calculate the Cartesian distance between two points.
-     * \param [in] a One point
-     * \param [in] b Another point
-     * \returns The distance between \pname{a} and \pname{b}.
+     * @brief Calculate the 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 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}.
+     * @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);
 
@@ -234,9 +234,9 @@
      * Output streamer.
      * Vectors are written as "x:y".
      *
-     * \param [in,out] os The stream.
-     * \param [in] vector The vector to stream
-     * \return The stream.
+     * @param [in,out] os The stream.
+     * @param [in] vector The vector to stream
+     * @return The stream.
      */
     friend std::ostream& operator<<(std::ostream& os, const Vector2D& vector);
 
@@ -245,97 +245,97 @@
      *
      * Vectors are expected to be in the form "x:y".
      *
-     * \param [in,out] is The stream.
-     * \param [in] vector The vector.
-     * \returns The stream.
+     * @param [in,out] is The stream.
+     * @param [in] vector The vector.
+     * @returns The stream.
      */
     friend std::istream& operator>>(std::istream& is, Vector2D& vector);
 
     /**
      * Less than comparison operator
-     * \param [in] a lhs vector
-     * \param [in] b rhs vector
-     * \returns \c true if \pname{a} is less than \pname{b}
+     * @param [in] a lhs vector
+     * @param [in] b rhs vector
+     * @returns \c true if \pname{a} is less than \pname{b}
      */
     friend bool operator<(const Vector2D& a, const Vector2D& b);
 
     /**
      * Less than or equal to comparison operator
-     * \param [in] a lhs vector
-     * \param [in] b rhs vector
-     * \returns \c true if \pname{a} is less than or equal to \pname{b}.
+     * @param [in] a lhs vector
+     * @param [in] b rhs vector
+     * @returns \c true if \pname{a} is less than or equal to \pname{b}.
      */
     friend bool operator<=(const Vector2D& a, const Vector2D& b);
 
     /**
      * Greater than comparison operator
-     * \param [in] a lhs vector
-     * \param [in] b rhs vector
-     * \returns \c true if \pname{a} is greater than \pname{b}.
+     * @param [in] a lhs vector
+     * @param [in] b rhs vector
+     * @returns \c true if \pname{a} is greater than \pname{b}.
      */
     friend bool operator>(const Vector2D& a, const Vector2D& b);
 
     /**
      * Greater than or equal to comparison operator
-     * \param [in] a lhs vector
-     * \param [in] b rhs vector
-     * \returns \c true if \pname{a} is greater than or equal to \pname{b}.
+     * @param [in] a lhs vector
+     * @param [in] b rhs vector
+     * @returns \c true if \pname{a} is greater than or equal to \pname{b}.
      */
     friend bool operator>=(const Vector2D& a, const Vector2D& b);
 
     /**
      * Equality operator.
-     * \param [in] a lhs vector.
-     * \param [in] b rhs vector.
-     * \returns \c true if \pname{a} is equal to \pname{b}.
+     * @param [in] a lhs vector.
+     * @param [in] b rhs vector.
+     * @returns \c true if \pname{a} is equal to \pname{b}.
      */
     friend bool operator==(const Vector2D& a, const Vector2D& b);
 
     /**
      * Inequality operator.
-     * \param [in] a lhs vector.
-     * \param [in] b rhs vector.
-     * \returns \c true if \pname{a} is not equal to \pname{b}.
+     * @param [in] a lhs vector.
+     * @param [in] b rhs vector.
+     * @returns \c true if \pname{a} is not equal to \pname{b}.
      */
     friend bool operator!=(const Vector2D& a, const Vector2D& b);
 
     /**
      * Addition operator.
-     * \param [in] a lhs vector.
-     * \param [in] b rhs vector.
-     * \returns The vector sum of \pname{a} and \pname{b}.
+     * @param [in] a lhs vector.
+     * @param [in] b rhs vector.
+     * @returns The vector sum of \pname{a} and \pname{b}.
      */
     friend Vector2D operator+(const Vector2D& a, const Vector2D& b);
 
     /**
      * Subtraction operator.
-     * \param [in] a lhs vector.
-     * \param [in] b rhs vector.
-     * \returns The vector difference of \pname{a} and \pname{b}.
+     * @param [in] a lhs vector.
+     * @param [in] b rhs vector.
+     * @returns The vector difference of \pname{a} and \pname{b}.
      */
     friend Vector2D operator-(const Vector2D& a, const Vector2D& b);
 
     /**
      * Scalar multiplication operator.
-     * \param [in] a lhs vector.
-     * \param [in] b rhs scalar.
-     * \returns The vector \pname{a} scaled by \pname{b}.
+     * @param [in] a lhs vector.
+     * @param [in] b rhs scalar.
+     * @returns The vector \pname{a} scaled by \pname{b}.
      */
     friend Vector2D operator*(const Vector2D& a, double b);
 
     /**
      * Scalar multiplication operator.
-     * \param [in] a lhs scalar.
-     * \param [in] b rhs vector.
-     * \returns The vector \pname{b} scaled by \pname{a}.
+     * @param [in] a lhs scalar.
+     * @param [in] b rhs vector.
+     * @returns The vector \pname{b} scaled by \pname{a}.
      */
     friend Vector2D operator*(double a, const Vector2D& b);
 
     /**
      * Dot product operator.
-     * \param [in] a lhs vector.
-     * \param [in] b rhs vector.
-     * \returns The dot product of \pname{a} and \pname{b}.
+     * @param [in] a lhs vector.
+     * @param [in] b rhs vector.
+     * @returns The dot product of \pname{a} and \pname{b}.
      */
     friend double operator*(const Vector2D& a, const Vector2D& b);
 };
@@ -355,22 +355,22 @@
 ATTRIBUTE_HELPER_HEADER(Vector2D);
 
 /**
- * \ingroup attribute_Vector3D
- * \relates Vector3D
+ * @ingroup attribute_Vector3D
+ * @relates Vector3D
  * Vector alias typedef for compatibility with mobility models
  */
 typedef Vector3D Vector;
 
 /**
- * \ingroup attribute_Vector3D
- * \relates Vector3D
+ * @ingroup attribute_Vector3D
+ * @relates Vector3D
  * Vector alias typedef for compatibility with mobility models
  */
 typedef Vector3DValue VectorValue;
 
 /**
- * \ingroup attribute_Vector3D
- * \relates Vector3D
+ * @ingroup attribute_Vector3D
+ * @relates Vector3D
  * Vector alias typedef for compatibility with mobility models
  */
 typedef Vector3DChecker VectorChecker;
@@ -384,24 +384,24 @@
 // Document these by hand so they go in group attribute_Vector3D
 
 /**
- * \ingroup attribute_Vector3D
+ * @ingroup attribute_Vector3D
  * \fn ns3::Ptr<const ns3::AttributeAccessor> ns3::MakeVectorAccessor (T1 a1)
- * \copydoc ns3::MakeAccessorHelper(T1)
- * \see AttributeAccessor
+ * @copydoc ns3::MakeAccessorHelper(T1)
+ * @see AttributeAccessor
  */
 
 /**
- * \ingroup attribute_Vector3D
+ * @ingroup attribute_Vector3D
  * \fn ns3::Ptr<const ns3::AttributeAccessor> ns3::MakeVectorAccessor (T1 a1, T2 a2)
- * \copydoc ns3::MakeAccessorHelper(T1,T2)
- * \see AttributeAccessor
+ * @copydoc ns3::MakeAccessorHelper(T1,T2)
+ * @see AttributeAccessor
  */
 
 /**
- * \ingroup attribute_Vector3D
+ * @ingroup attribute_Vector3D
  * \fn ns3::Ptr<const ns3::AttributeChecker> ns3::MakeVectorChecker ()
- * \returns The AttributeChecker.
- * \see AttributeChecker
+ * @returns The AttributeChecker.
+ * @see AttributeChecker
  */
 
 #endif /* NS3_VECTOR_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/version.cache ns-3.44/src/core/model/version.cache
--- ns-3.43/src/core/model/version.cache	2024-10-09 16:41:49.368803700 -0700
+++ ns-3.44/src/core/model/version.cache	2025-03-09 16:56:26.395509200 -0700
@@ -1,10 +1,10 @@
-CLOSEST_TAG = '"ns-3.43"'
-VERSION_COMMIT_HASH = '"g753817468"'
+CLOSEST_TAG = '"ns-3.44"'
+VERSION_COMMIT_HASH = '"g43dce6710"'
 VERSION_DIRTY_FLAG = '0'
 VERSION_MAJOR = '3'
-VERSION_MINOR = '43'
+VERSION_MINOR = '44'
 VERSION_PATCH = '0'
 VERSION_RELEASE_CANDIDATE = '""'
-VERSION_TAG = '"ns-3.43"'
+VERSION_TAG = '"ns-3.44"'
 VERSION_TAG_DISTANCE = '0'
 VERSION_BUILD_PROFILE = 'default'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/version.cc ns-3.44/src/core/model/version.cc
--- ns-3.43/src/core/model/version.cc	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/model/version.cc	2025-03-09 16:55:49.367371000 -0700
@@ -13,8 +13,8 @@
 #include <sstream>
 
 /**
- * \file
- * \ingroup buildversion
+ * @file
+ * @ingroup buildversion
  * ns3::Version implementation
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/version.h ns-3.44/src/core/model/version.h
--- ns-3.43/src/core/model/version.h	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/model/version.h	2025-03-09 16:55:49.367371000 -0700
@@ -14,8 +14,8 @@
 #include <string>
 
 /**
- * \file
- * \ingroup buildversion
+ * @file
+ * @ingroup buildversion
  * class ns3::Version definition
  */
 
@@ -23,8 +23,8 @@
 {
 
 /**
- * \ingroup core
- * \defgroup buildversion Build version reporting
+ * @ingroup core
+ * @defgroup buildversion Build version reporting
  *
  * Version information is pulled from the local git repository during the build
  * process.  If a git repository is not found, the build system will search for
@@ -38,7 +38,7 @@
  */
 
 /**
- * \ingroup buildversion
+ * @ingroup buildversion
  *
  * Helper class providing functions to access various parts of the version
  * string, as well as functions for composing short and long variants of the
@@ -52,10 +52,10 @@
  *
  * Below is a partial view of a git branch:
  *
- * \note Square nodes represent tags
- * \note Circle nodes represent commits
+ * @note Square nodes represent tags
+ * @note Circle nodes represent commits
  *
- * \dot
+ * @dot
  * digraph {
  *   vt [label="ns-3.32", shape="box"]
  *   t  [label="mytag", shape="box"]
@@ -69,7 +69,7 @@
  *   t -> c2
  *   vt -> c4
  * }
- * \enddot
+ * @enddot
  *
  * Here are the values that will be assigned based on this example branch:
  *
@@ -94,12 +94,12 @@
      * Returns the ns-3 version tag of the closest ancestor commit.
      *
      * The format of the tag is
-     * \verbatim ns3-<major>.<minor>[.patch] \endverbatim
+     * @verbatim ns3-<major>.<minor>[.patch] \endverbatim
      *
      * The patch field is optional and may not be present.  The value of
      * patch defaults to 0 if the tag does not have a patch field.
      *
-     * \return ns-3 version tag
+     * @return ns-3 version tag
      */
     static std::string VersionTag();
 
@@ -110,7 +110,7 @@
      * The value returned by this function may be the same as VersionTag()
      * if the ns-3 version tag is the closest ancestor tag.
      *
-     * \return Closest tag attached to an ancestor of the current commit
+     * @return Closest tag attached to an ancestor of the current commit
      */
     static std::string ClosestAncestorTag();
 
@@ -118,11 +118,11 @@
      * Major component of the build version
      *
      * The format of the build version string is
-     * \verbatim ns-<major>.<minor>[.patch][-RC<digit>] \endverbatim
+     * @verbatim ns-<major>.<minor>[.patch][-RC<digit>] \endverbatim
      *
      * The major component is the number before the first period
      *
-     * \return The major component of the build version
+     * @return The major component of the build version
      */
     static uint32_t Major();
 
@@ -130,11 +130,11 @@
      * Minor component of the build version
      *
      * The format of the build version string is
-     * \verbatim ns-<major>.<minor>[.patch][-RC<digit>] \endverbatim
+     * @verbatim ns-<major>.<minor>[.patch][-RC<digit>] \endverbatim
      *
      * The minor component is the number after the first period
      *
-     * \return The minor component of the build version
+     * @return The minor component of the build version
      */
     static uint32_t Minor();
 
@@ -142,11 +142,11 @@
      * Patch component of the build version
      *
      * A build version with a patch component will have the format
-     * \verbatim ns-<major>.<minor>.<patch> \endverbatim
+     * @verbatim ns-<major>.<minor>.<patch> \endverbatim
      *
      * The patch component is the number after the second period
      *
-     * \return The patch component of the build version or 0 if the build version
+     * @return The patch component of the build version or 0 if the build version
      * does not have a patch component
      */
     static uint32_t Patch();
@@ -155,11 +155,11 @@
      * Release candidate component of the build version
      *
      * A build version with a release candidate will have the format
-     * \verbatim ns-<major>.<minor>[.patch]-RC<digit> \endverbatim
+     * @verbatim ns-<major>.<minor>[.patch]-RC<digit> \endverbatim
      *
      * The string returned by this function will have the format RC<digit>
      *
-     * \return The release candidate component of the build version or an empty
+     * @return The release candidate component of the build version or an empty
      * string if the build version does not have a release candidate component
      */
     static std::string ReleaseCandidate();
@@ -168,14 +168,14 @@
      * The number of commits between the current
      * commit and the tag returned by ClosestAncestorTag().
      *
-     * \return The number of commits made since the last tagged commit
+     * @return The number of commits made since the last tagged commit
      */
     static uint32_t TagDistance();
 
     /**
      * Indicates whether there were uncommitted changes during the build
      *
-     * \return \c true if the working tree had uncommitted changes.
+     * @return \c true if the working tree had uncommitted changes.
      */
     static bool DirtyWorkingTree();
 
@@ -191,7 +191,7 @@
      *
      * Example of hash output: g6bfb0c9
      *
-     * \return hexadecimal representation of the most recent commit id
+     * @return hexadecimal representation of the most recent commit id
      */
     static std::string CommitHash();
 
@@ -200,7 +200,7 @@
      *
      * This information is set by the --build-profile option of ns3 configure
      *
-     * \return String containing the type of build
+     * @return String containing the type of build
      */
     static std::string BuildProfile();
 
@@ -209,7 +209,7 @@
      * and indication of additional commits or dirty status.
      *
      * The format of the constructed string is
-     * \verbatim ns-<major>.<minor>[.patch][-rc]<flags> \endverbatim
+     * @verbatim ns-<major>.<minor>[.patch][-rc]<flags> \endverbatim
      *
      *   * [patch] is included when Patch() > 0.
      *   * [-rc] is included when ReleaseCandidate() contains a non-empty string
@@ -219,7 +219,7 @@
      * [flags] will contain none, one, or both characters depending on the state
      * of the branch
      *
-     * \return String containing the ns-3 major and minor components and flags.
+     * @return String containing the ns-3 major and minor components and flags.
      */
     static std::string ShortVersion();
 
@@ -237,7 +237,7 @@
      * [flags] will contain none, one, or both characters depending on the state
      * of the branch
      *
-     * \return String containing the closest ancestor tag and flags.
+     * @return String containing the closest ancestor tag and flags.
      */
     static std::string BuildSummary();
 
@@ -245,9 +245,9 @@
      * Constructs a string containing all of the build details
      *
      * The format of the constructed string is
-     * \verbatim
+     * @verbatim
      * ns-<major>.<minor>[.patch][-rc][-closest-tag]-<tag-distance>@<hash>[-dirty]-<build-profile>
-     * \endverbatim
+     * @endverbatim
      *
      * [patch], [rc], [closest-tag], and [dirty] will only be present under certain circumstances:
      *   * [patch] is included when Patch() > 0
@@ -255,7 +255,7 @@
      *   * [closest-tag] is included when ClosestTag() != VersionTag()
      *   * [dirty] is included when DirtyWorkingTree() is \c true
      *
-     * \return String containing full version
+     * @return String containing full version
      */
     static std::string LongVersion();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/wall-clock-synchronizer.cc ns-3.44/src/core/model/wall-clock-synchronizer.cc
--- ns-3.43/src/core/model/wall-clock-synchronizer.cc	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/model/wall-clock-synchronizer.cc	2025-03-09 16:55:49.367371000 -0700
@@ -14,8 +14,8 @@
 #include <mutex>
 
 /**
- * \file
- * \ingroup realtime
+ * @file
+ * @ingroup realtime
  * ns3::WallClockSynchronizer implementation.
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/warnings.h ns-3.44/src/core/model/warnings.h
--- ns-3.43/src/core/model/warnings.h	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/model/warnings.h	2025-03-09 16:55:49.367371000 -0700
@@ -10,74 +10,74 @@
 #define NS3_WARNINGS_H
 
 /**
- * \defgroup warnings Compiler warnings
- * \ingroup core
+ * @defgroup warnings Compiler warnings
+ * @ingroup core
  *
  * Macros useful to silence compiler warnings on selected code parts.
  */
 
 /**
- * \ingroup warnings
- * \def NS_WARNING_POP
+ * @ingroup warnings
+ * @def NS_WARNING_POP
  * Pops the diagnostic warning list from the stack, restoring it to the previous state.
  * \sa NS_WARNING_PUSH
  */
 
 /**
- * \ingroup warnings
- * \def NS_WARNING_PUSH
+ * @ingroup warnings
+ * @def NS_WARNING_PUSH
  * Push the diagnostic warning list to the stack, allowing it to be restored later.
  * \sa NS_WARNING_POP
  */
 
 /**
- * \ingroup warnings
- * \def NS_WARNING_SILENCE_DEPRECATED
+ * @ingroup warnings
+ * @def NS_WARNING_SILENCE_DEPRECATED
  * Silences the "-Wdeprecated-declarations" warnings.
  * \sa NS_WARNING_POP
  */
 
 /**
- * \ingroup warnings
- * \def NS_WARNING_SILENCE_MAYBE_UNINITIALIZED
+ * @ingroup warnings
+ * @def NS_WARNING_SILENCE_MAYBE_UNINITIALIZED
  * Silences GCC "-Wmaybe-uninitialized" warnings.
  * \sa NS_WARNING_POP
  */
 
 /**
- * \ingroup warnings
- * \def NS_WARNING_PUSH_DEPRECATED
+ * @ingroup warnings
+ * @def NS_WARNING_PUSH_DEPRECATED
  * Save the current warning list and disables the ones about deprecated functions and classes.
  *
  * This macro can be used to silence deprecation warnings and should be used as a last resort
  * to silence the compiler for very specific lines of code.
  * The typical pattern is:
- * \code
+ * @code
  *   NS_WARNING_PUSH_DEPRECATED;
  *   // call to a function or class that has been deprecated.
  *   NS_WARNING_POP;
- * \endcode
+ * @endcode
  *
  * This macro is equivalent to
- * \code
+ * @code
  *   NS_WARNING_PUSH;
  *   NS_WARNING_SILENCE_DEPRECATED;
- * \endcode
+ * @endcode
  *
  * Its use is, of course, not suggested unless strictly necessary.
  */
 
 /**
- * \ingroup warnings
- * \def NS_WARNING_PUSH_MAYBE_UNINITIALIZED
+ * @ingroup warnings
+ * @def NS_WARNING_PUSH_MAYBE_UNINITIALIZED
  * Save the current warning list and disables the ones about possible uninitialized variables.
  *
  *
  * This macro is equivalent to
- * \code
+ * @code
  *   NS_WARNING_PUSH;
  *   NS_WARNING_SILENCE_MAYBE_UNINITIALIZED;
- * \endcode
+ * @endcode
  *
  * \sa NS_WARNING_PUSH_DEPRECATED
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/watchdog.cc ns-3.44/src/core/model/watchdog.cc
--- ns-3.43/src/core/model/watchdog.cc	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/model/watchdog.cc	2025-03-09 16:55:49.367371000 -0700
@@ -10,8 +10,8 @@
 #include "log.h"
 
 /**
- * \file
- * \ingroup timer
+ * @file
+ * @ingroup timer
  * ns3::Watchdog timer class implementation.
  */
 
@@ -23,7 +23,7 @@
 Watchdog::Watchdog()
     : m_impl(nullptr),
       m_event(),
-      m_end(MicroSeconds(0))
+      m_end()
 {
     NS_LOG_FUNCTION_NOARGS();
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/watchdog.h ns-3.44/src/core/model/watchdog.h
--- ns-3.43/src/core/model/watchdog.h	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/model/watchdog.h	2025-03-09 16:55:49.367371000 -0700
@@ -12,8 +12,8 @@
 #include "nstime.h"
 
 /**
- * \file
- * \ingroup timer
+ * @file
+ * @ingroup timer
  * ns3::Watchdog timer class declaration.
  */
 
@@ -28,8 +28,8 @@
 } // namespace internal
 
 /**
- * \ingroup timer
- * \brief A very simple watchdog operating in virtual time.
+ * @ingroup timer
+ * @brief A very simple watchdog operating in virtual time.
  *
  * The watchdog timer is started by calling Ping with a delay value.
  * Once started the timer cannot be suspended, cancelled or shortened.
@@ -45,7 +45,7 @@
  * If you don't ping the watchdog sufficiently often, it triggers its
  * listening function.
  *
- * \see Timer for a more sophisticated general purpose timer.
+ * @see Timer for a more sophisticated general purpose timer.
  */
 class Watchdog
 {
@@ -58,7 +58,7 @@
     /**
      * Delay the timer.
      *
-     * \param [in] delay The watchdog delay
+     * @param [in] delay The watchdog delay
      *
      * After a call to this method, the watchdog will not be triggered
      * until the delay specified has been expired. This operation is
@@ -69,8 +69,8 @@
     /**
      * Set the function to execute when the timer expires.
      *
-     * \tparam FN \deduced The type of the function.
-     * \param [in] fn The function
+     * @tparam FN \deduced The type of the function.
+     * @param [in] fn The function
      *
      * Store this function in this Timer for later use by Timer::Schedule.
      */
@@ -80,10 +80,10 @@
     /**
      * Set the function to execute when the timer expires.
      *
-     * \tparam MEM_PTR \deduced Class method function type.
-     * \tparam OBJ_PTR \deduced Class type containing the function.
-     * \param [in] memPtr The member function pointer
-     * \param [in] objPtr The pointer to object
+     * @tparam MEM_PTR \deduced Class method function type.
+     * @tparam OBJ_PTR \deduced Class type containing the function.
+     * @param [in] memPtr The member function pointer
+     * @param [in] objPtr The pointer to object
      *
      * Store this function and object in this Timer for later use by Timer::Schedule.
      */
@@ -95,8 +95,8 @@
      */
     /**@{*/
     /**
-     * \tparam Ts \deduced Argument types.
-     * \param [in] args arguments
+     * @tparam Ts \deduced Argument types.
+     * @param [in] args arguments
      */
     template <typename... Ts>
     void SetArguments(Ts&&... args);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/model/win32-fd-reader.cc ns-3.44/src/core/model/win32-fd-reader.cc
--- ns-3.43/src/core/model/win32-fd-reader.cc	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/model/win32-fd-reader.cc	2025-03-09 16:55:49.367371000 -0700
@@ -20,8 +20,8 @@
 // #define pipe(fds) _pipe(fds,4096, _O_BINARY)
 
 /**
- * \file
- * \ingroup system
+ * @file
+ * @ingroup system
  * ns3::FdReader implementation.
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/test/attribute-container-test-suite.cc ns-3.44/src/core/test/attribute-container-test-suite.cc
--- ns-3.43/src/core/test/attribute-container-test-suite.cc	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/test/attribute-container-test-suite.cc	2025-03-09 16:55:49.367371000 -0700
@@ -6,18 +6,18 @@
  * Author: Jared Dulmage <jared.dulmage@caliola.com>
  */
 
-#include <ns3/attribute-container.h>
-#include <ns3/double.h>
-#include <ns3/integer.h>
-#include <ns3/log.h>
-#include <ns3/object.h>
-#include <ns3/pair.h>
-#include <ns3/ptr.h>
-#include <ns3/string.h>
-#include <ns3/test.h>
-#include <ns3/tuple.h>
-#include <ns3/type-id.h>
-#include <ns3/uinteger.h>
+#include "ns3/attribute-container.h"
+#include "ns3/double.h"
+#include "ns3/integer.h"
+#include "ns3/log.h"
+#include "ns3/object.h"
+#include "ns3/pair.h"
+#include "ns3/ptr.h"
+#include "ns3/string.h"
+#include "ns3/test.h"
+#include "ns3/tuple.h"
+#include "ns3/type-id.h"
+#include "ns3/uinteger.h"
 
 #include <algorithm>
 #include <iterator>
@@ -31,13 +31,13 @@
 NS_LOG_COMPONENT_DEFINE("AttributeContainerTestSuite");
 
 /**
- * \file
- * \ingroup attribute-tests
+ * @file
+ * @ingroup attribute-tests
  * Attribute container test suite
  */
 
 /**
- * \ingroup attribute-tests
+ * @ingroup attribute-tests
  * Attribute container object.
  */
 class AttributeContainerObject : public Object
@@ -52,34 +52,34 @@
     void ReverseDoubleList();
 
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
     /**
      * Set the list of doubles to the given list
      *
-     * \param doubleList the given list
+     * @param doubleList the given list
      */
     void SetDoubleList(const std::list<double>& doubleList);
     /**
      * Get the list of doubles
      *
-     * \return the list of doubles
+     * @return the list of doubles
      */
     std::list<double> GetDoubleList() const;
 
     /**
      * Set the vector of ints to the given vector
      *
-     * \param vec the given vector
+     * @param vec the given vector
      */
     void SetIntVec(std::vector<int> vec);
     /**
      * Get the vector of ints
      *
-     * \return the vector of ints
+     * @return the vector of ints
      */
     std::vector<int> GetIntVec() const;
 
@@ -185,7 +185,7 @@
 }
 
 /**
- * \ingroup attribute-tests
+ * @ingroup attribute-tests
  *
  * Test AttributeContainer instantiation, initialization, access
  */
@@ -292,7 +292,7 @@
 }
 
 /**
- * \ingroup attribute-tests
+ * @ingroup attribute-tests
  *
  * Attribute serialization and deserialization TestCase.
  */
@@ -408,7 +408,7 @@
 }
 
 /**
- * \ingroup attribute-tests
+ * @ingroup attribute-tests
  *
  * Attribute set and get TestCase.
  */
@@ -545,7 +545,7 @@
 }
 
 /**
- * \ingroup attribute-tests
+ * @ingroup attribute-tests
  *
  * Attribute attribute container TestCase.
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/test/attribute-test-suite.cc ns-3.44/src/core/test/attribute-test-suite.cc
--- ns-3.43/src/core/test/attribute-test-suite.cc	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/test/attribute-test-suite.cc	2025-03-09 16:55:49.367371000 -0700
@@ -29,21 +29,21 @@
 {
 
 /**
- * \file
- * \ingroup attribute-tests
+ * @file
+ * @ingroup attribute-tests
  * Attribute test suite
  */
 
 /**
- * \ingroup core-tests
- * \defgroup attribute-tests Attribute tests
+ * @ingroup core-tests
+ * @defgroup attribute-tests Attribute tests
  */
 
 /**
- * \ingroup attribute-tests
+ * @ingroup attribute-tests
  *
  * Test class for TracedValue callbacks attributes.
- * \see attribute_ValueClassTest
+ * @see attribute_ValueClassTest
  */
 class ValueClassTest
 {
@@ -55,8 +55,8 @@
     /**
      * TracedValue callback signature for ValueClassTest
      *
-     * \param [in] oldValue original value of the traced variable
-     * \param [in] newValue new value of the traced variable
+     * @param [in] oldValue original value of the traced variable
+     * @param [in] newValue new value of the traced variable
      */
     typedef void (*TracedValueCallback)(const ValueClassTest oldValue,
                                         const ValueClassTest newValue);
@@ -64,9 +64,9 @@
 
 /**
  * Operator not equal.
- * \param a The left operand.
- * \param b The right operand.
- * \return always true.
+ * @param a The left operand.
+ * @param b The right operand.
+ * @return always true.
  */
 bool
 operator!=(const ValueClassTest& a [[maybe_unused]], const ValueClassTest& b [[maybe_unused]])
@@ -75,11 +75,11 @@
 }
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param [in] os The reference to the output stream.
- * \param [in] v The ValueClassTest object.
- * \returns The reference to the output stream.
+ * @param [in] os The reference to the output stream.
+ * @param [in] v The ValueClassTest object.
+ * @returns The reference to the output stream.
  */
 std::ostream&
 operator<<(std::ostream& os, ValueClassTest v [[maybe_unused]])
@@ -88,11 +88,11 @@
 }
 
 /**
- * \brief Stream extraction operator.
+ * @brief Stream extraction operator.
  *
- * \param [in] is The reference to the input stream.
- * \param [out] v The ValueClassTest object.
- * \returns The reference to the input stream.
+ * @param [in] is The reference to the input stream.
+ * @param [out] v The ValueClassTest object.
+ * @returns The reference to the input stream.
  */
 std::istream&
 operator>>(std::istream& is, ValueClassTest& v [[maybe_unused]])
@@ -106,7 +106,7 @@
 } // namespace ns3
 
 /**
- * \ingroup attribute-tests
+ * @ingroup attribute-tests
  *
  * Simple class derived from ns3::Object, used to check attribute constructors.
  */
@@ -114,8 +114,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId()
     {
@@ -131,7 +131,7 @@
 NS_OBJECT_ENSURE_REGISTERED(Derived);
 
 /**
- * \ingroup attribute-tests
+ * @ingroup attribute-tests
  *
  * Class used to check attributes.
  */
@@ -155,8 +155,8 @@
     };
 
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId()
     {
@@ -339,7 +339,7 @@
                               BooleanValue(false),
                               MakeBooleanAccessor(&AttributeObjectTest::m_boolTestDeprecated),
                               MakeBooleanChecker(),
-                              TypeId::DEPRECATED,
+                              TypeId::SupportLevel::DEPRECATED,
                               "DEPRECATED test working.");
 
         return tid;
@@ -367,7 +367,7 @@
 
     /**
      * Adds an object to the first map.
-     * \param i The index to assign to the object.
+     * @param i The index to assign to the object.
      */
     void AddToMap1(uint32_t i)
     {
@@ -376,7 +376,7 @@
 
     /**
      * Adds an object to the unordered map.
-     * \param i The index to assign to the object.
+     * @param i The index to assign to the object.
      */
     void AddToUnorderedMap(uint64_t i)
     {
@@ -385,7 +385,7 @@
 
     /**
      * Remove an object from the first map.
-     * \param i The index to assign to the object.
+     * @param i The index to assign to the object.
      */
     void RemoveFromUnorderedMap(uint64_t i)
     {
@@ -394,9 +394,9 @@
 
     /**
      * Invoke the m_cb callback.
-     * \param a The first argument of the callback.
-     * \param b The second argument of the callback.
-     * \param c The third argument of the callback.
+     * @param a The first argument of the callback.
+     * @param b The second argument of the callback.
+     * @param c The third argument of the callback.
      */
     void InvokeCb(double a, int b, float c)
     {
@@ -405,7 +405,7 @@
 
     /**
      * Invoke the m_cbValue callback.
-     * \param a The argument of the callback.
+     * @param a The argument of the callback.
      */
     void InvokeCbValue(int8_t a)
     {
@@ -418,7 +418,7 @@
   private:
     /**
      * Set the m_boolTestA value.
-     * \param v The value to set.
+     * @param v The value to set.
      */
     void DoSetTestA(bool v)
     {
@@ -427,7 +427,7 @@
 
     /**
      * Get the m_boolTestA value.
-     * \return the value of m_boolTestA.
+     * @return the value of m_boolTestA.
      */
     bool DoGetTestA() const
     {
@@ -436,7 +436,7 @@
 
     /**
      * Get the m_int16SetGet value.
-     * \return the value of m_int16SetGet.
+     * @return the value of m_int16SetGet.
      */
     int16_t DoGetInt16() const
     {
@@ -445,7 +445,7 @@
 
     /**
      * Set the m_int16SetGet value.
-     * \param v The value to set.
+     * @param v The value to set.
      */
     void DoSetInt16(int16_t v)
     {
@@ -454,7 +454,7 @@
 
     /**
      * Get the length of m_vector2.
-     * \return the vector size.
+     * @return the vector size.
      */
     std::size_t DoGetVectorN() const
     {
@@ -463,8 +463,8 @@
 
     /**
      * Get the i-th item of m_vector2.
-     * \param i The index of the element to get.
-     * \return i-th item of m_vector2.
+     * @param i The index of the element to get.
+     * @return i-th item of m_vector2.
      */
     Ptr<Derived> DoGetVector(std::size_t i) const
     {
@@ -473,8 +473,8 @@
 
     /**
      * Set the m_intSrc2 value.
-     * \param v The value to set.
-     * \return true.
+     * @param v The value to set.
+     * @return true.
      */
     bool DoSetIntSrc(int8_t v)
     {
@@ -484,7 +484,7 @@
 
     /**
      * Get the m_intSrc2 value.
-     * \return the value of m_intSrc2.
+     * @return the value of m_intSrc2.
      */
     int8_t DoGetIntSrc() const
     {
@@ -493,8 +493,8 @@
 
     /**
      * Set the m_enumSetGet value.
-     * \param v The value to set.
-     * \return true.
+     * @param v The value to set.
+     * @return true.
      */
     bool DoSetEnum(Test_e v)
     {
@@ -504,7 +504,7 @@
 
     /**
      * Get the m_enumSetGet value.
-     * \return the value of m_enumSetGet.
+     * @return the value of m_enumSetGet.
      */
     Test_e DoGetEnum() const
     {
@@ -513,8 +513,8 @@
 
     /**
      * Set the m_enumClassSetGet value.
-     * \param v The value to set.
-     * \return true.
+     * @param v The value to set.
+     * @return true.
      */
     bool DoSetEnumClass(Test_ec v)
     {
@@ -524,7 +524,7 @@
 
     /**
      * Get the m_enumClassSetGet value.
-     * \return the value of m_enumSetGet.
+     * @return the value of m_enumSetGet.
      */
     Test_ec DoGetEnumClass() const
     {
@@ -570,9 +570,9 @@
 NS_OBJECT_ENSURE_REGISTERED(AttributeObjectTest);
 
 /**
- * \ingroup attribute-tests
+ * @ingroup attribute-tests
  *
- * \brief Test case template used for generic Attribute Value types -- used to make
+ * @brief Test case template used for generic Attribute Value types -- used to make
  * sure that Attributes work as expected.
  */
 template <typename T>
@@ -581,7 +581,7 @@
   public:
     /**
      * Constructor.
-     * \param description The TestCase description.
+     * @param description The TestCase description.
      */
     AttributeTestCase(std::string description);
     ~AttributeTestCase() override;
@@ -590,11 +590,11 @@
     void DoRun() override;
     /**
      * Check the attribute path and value.
-     * \param p The object to test.
-     * \param attributeName The attribute name.
-     * \param expectedString The expected attribute name.
-     * \param expectedValue The expected attribute value.
-     * \return true if everything is as expected.
+     * @param p The object to test.
+     * @param attributeName The attribute name.
+     * @param expectedString The expected attribute name.
+     * @param expectedValue The expected attribute value.
+     * @return true if everything is as expected.
      */
     bool CheckGetCodePaths(Ptr<Object> p,
                            std::string attributeName,
@@ -1232,7 +1232,7 @@
 }
 
 /**
- * \ingroup attribute-tests
+ * @ingroup attribute-tests
  *
  * Test the Attributes of type RandomVariableStream.
  */
@@ -1241,7 +1241,7 @@
   public:
     /**
      * Constructor.
-     * \param description The TestCase description.
+     * @param description The TestCase description.
      */
     RandomVariableStreamAttributeTestCase(std::string description);
 
@@ -1251,7 +1251,7 @@
 
     /**
      * Invoke the m_cbValue.
-     * \param a The value to use on the callback.
+     * @param a The value to use on the callback.
      */
     void InvokeCbValue(int8_t a)
     {
@@ -1269,7 +1269,7 @@
 
     /**
      * Function called when the callback is used.
-     * \param a The value of the callback.
+     * @param a The value of the callback.
      */
     void NotifyCallbackValue(int8_t a)
     {
@@ -1307,9 +1307,9 @@
 }
 
 /**
- * \ingroup attribute-tests
+ * @ingroup attribute-tests
  *
- * \brief Test case for Object Vector Attributes.
+ * @brief Test case for Object Vector Attributes.
  *
  * Generic nature is pretty much lost here, so we just break the class out.
  */
@@ -1318,7 +1318,7 @@
   public:
     /**
      * Constructor.
-     * \param description The TestCase description.
+     * @param description The TestCase description.
      */
     ObjectVectorAttributeTestCase(std::string description);
 
@@ -1393,16 +1393,16 @@
 }
 
 /**
- * \ingroup attribute-tests
+ * @ingroup attribute-tests
  *
- * \brief Test case for Object Map Attributes.
+ * @brief Test case for Object Map Attributes.
  */
 class ObjectMapAttributeTestCase : public TestCase
 {
   public:
     /**
      * Constructor.
-     * \param description The TestCase description.
+     * @param description The TestCase description.
      */
     ObjectMapAttributeTestCase(std::string description);
 
@@ -1508,9 +1508,9 @@
 }
 
 /**
- * \ingroup attribute-tests
+ * @ingroup attribute-tests
  *
- * \brief Trace sources with value semantics can be used like Attributes,
+ * @brief Trace sources with value semantics can be used like Attributes,
  * make sure we can use them that way.
  */
 class IntegerTraceSourceAttributeTestCase : public TestCase
@@ -1518,7 +1518,7 @@
   public:
     /**
      * Constructor.
-     * \param description The TestCase description.
+     * @param description The TestCase description.
      */
     IntegerTraceSourceAttributeTestCase(std::string description);
 
@@ -1619,9 +1619,9 @@
 }
 
 /**
- * \ingroup attribute-tests
+ * @ingroup attribute-tests
  *
- * \brief Trace sources used like Attributes must also work as trace sources,
+ * @brief Trace sources used like Attributes must also work as trace sources,
  * make sure we can use them that way.
  */
 class IntegerTraceSourceTestCase : public TestCase
@@ -1629,7 +1629,7 @@
   public:
     /**
      * Constructor.
-     * \param description The TestCase description.
+     * @param description The TestCase description.
      */
     IntegerTraceSourceTestCase(std::string description);
 
@@ -1642,8 +1642,8 @@
 
     /**
      * Notify the call of source 1.
-     * \param old First value.
-     * \param n Second value.
+     * @param old First value.
+     * @param n Second value.
      */
     void NotifySource1(int8_t old [[maybe_unused]], int8_t n)
     {
@@ -1718,9 +1718,9 @@
 }
 
 /**
- * \ingroup attribute-tests
+ * @ingroup attribute-tests
  *
- * \brief Trace sources used like Attributes must also work as trace sources,
+ * @brief Trace sources used like Attributes must also work as trace sources,
  * make sure we can use them that way.
  */
 class TracedCallbackTestCase : public TestCase
@@ -1728,7 +1728,7 @@
   public:
     /**
      * Constructor.
-     * \param description The TestCase description.
+     * @param description The TestCase description.
      */
     TracedCallbackTestCase(std::string description);
 
@@ -1741,9 +1741,9 @@
 
     /**
      * Notify the call of source 2.
-     * \param a First value.
-     * \param b Second value.
-     * \param c Third value.
+     * @param a First value.
+     * @param b Second value.
+     * @param c Third value.
      */
     void NotifySource2(double a, int b [[maybe_unused]], float c [[maybe_unused]])
     {
@@ -1817,9 +1817,9 @@
 }
 
 /**
- * \ingroup attribute-tests
+ * @ingroup attribute-tests
  *
- * \brief Smart pointers (Ptr) are central to our architecture, so they
+ * @brief Smart pointers (Ptr) are central to our architecture, so they
  * must work as attributes.
  */
 class PointerAttributeTestCase : public TestCase
@@ -1827,7 +1827,7 @@
   public:
     /**
      * Constructor.
-     * \param description The TestCase description.
+     * @param description The TestCase description.
      */
     PointerAttributeTestCase(std::string description);
 
@@ -1840,9 +1840,9 @@
 
     /**
      * Notify the call of source 2.
-     * \param a First value.
-     * \param b Second value.
-     * \param c Third value.
+     * @param a First value.
+     * @param b Second value.
+     * @param c Third value.
      */
     void NotifySource2(double a, int b [[maybe_unused]], float c [[maybe_unused]])
     {
@@ -1961,16 +1961,16 @@
 }
 
 /**
- * \ingroup attribute-tests
+ * @ingroup attribute-tests
  *
- * \brief Test the Attributes of type CallbackValue.
+ * @brief Test the Attributes of type CallbackValue.
  */
 class CallbackValueTestCase : public TestCase
 {
   public:
     /**
      * Constructor.
-     * \param description The TestCase description.
+     * @param description The TestCase description.
      */
     CallbackValueTestCase(std::string description);
 
@@ -1980,7 +1980,7 @@
 
     /**
      * Function to invoke the callback.
-     * \param a The value.
+     * @param a The value.
      */
     void InvokeCbValue(int8_t a)
     {
@@ -1997,7 +1997,7 @@
 
     /**
      * Function invoked when the callback is fired.
-     * \param a The value.
+     * @param a The value.
      */
     void NotifyCallbackValue(int8_t a)
     {
@@ -2062,9 +2062,9 @@
 }
 
 /**
- * \ingroup attribute-tests
+ * @ingroup attribute-tests
  *
- * \brief The attributes Test Suite.
+ * @brief The attributes Test Suite.
  */
 class AttributesTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/test/build-profile-test-suite.cc ns-3.44/src/core/test/build-profile-test-suite.cc
--- ns-3.43/src/core/test/build-profile-test-suite.cc	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/test/build-profile-test-suite.cc	2025-03-09 16:55:49.367371000 -0700
@@ -10,16 +10,16 @@
 #include "ns3/test.h"
 
 /**
- * \file
- * \ingroup core-tests
- * \ingroup debugging
- * \ingroup build-profile-tests
+ * @file
+ * @ingroup core-tests
+ * @ingroup debugging
+ * @ingroup build-profile-tests
  * NS_BUILD_PROFILE macros test suite.
  */
 
 /**
- * \ingroup core-tests
- * \defgroup build-profile-tests NS_BUILD_PROFILE macros test suite
+ * @ingroup core-tests
+ * @defgroup build-profile-tests NS_BUILD_PROFILE macros test suite
  */
 
 namespace ns3
@@ -29,7 +29,7 @@
 {
 
 /**
- * \ingroup build-profile-tests
+ * @ingroup build-profile-tests
  * Build profile test
  */
 class BuildProfileTestCase : public TestCase
@@ -82,7 +82,7 @@
 }
 
 /**
- * \ingroup build-profile-tests
+ * @ingroup build-profile-tests
  * Build profile test suite
  */
 class BuildProfileTestSuite : public TestSuite
@@ -98,7 +98,7 @@
 }
 
 /**
- * \ingroup build-profile-tests
+ * @ingroup build-profile-tests
  * BuildProfileTestSuite instance variable.
  */
 static BuildProfileTestSuite g_BuildProfileTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/test/callback-test-suite.cc ns-3.44/src/core/test/callback-test-suite.cc
--- ns-3.43/src/core/test/callback-test-suite.cc	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/test/callback-test-suite.cc	2025-03-09 16:55:49.367371000 -0700
@@ -12,18 +12,18 @@
 using namespace ns3;
 
 /**
- * \file
- * \ingroup callback-tests
+ * @file
+ * @ingroup callback-tests
  * Callback test suite
  */
 
 /**
- * \ingroup core-tests
- * \defgroup callback-tests Callback tests
+ * @ingroup core-tests
+ * @defgroup callback-tests Callback tests
  */
 
 /**
- * \ingroup callback-tests
+ * @ingroup callback-tests
  *
  * Test the basic Callback mechanism.
  */
@@ -46,7 +46,7 @@
 
     /**
      * Callback 2 target function.
-     * \return two.
+     * @return two.
      */
     int Target2()
     {
@@ -56,7 +56,7 @@
 
     /**
      * Callback 3 target function.
-     * \param a A parameter (unused).
+     * @param a A parameter (unused).
      */
     void Target3(double a [[maybe_unused]])
     {
@@ -65,9 +65,9 @@
 
     /**
      * Callback 4 target function.
-     * \param a A parameter (unused).
-     * \param b Another parameter (unused).
-     * \return four.
+     * @param a A parameter (unused).
+     * @param b Another parameter (unused).
+     * @return four.
      */
     int Target4(double a [[maybe_unused]], int b [[maybe_unused]])
     {
@@ -116,8 +116,8 @@
 
 /**
  * Callback 6 target function.
- * \param a The value passed by the callback.
- * \return the value of the calling function.
+ * @param a The value passed by the callback.
+ * @return the value of the calling function.
  */
 int
 BasicCallbackTarget7(int a)
@@ -174,7 +174,7 @@
 
     //
     // Make sure we can declare and compile a Callback pointing to a member
-    // function that returns void, takes two parameters, and execute it.
+    // function that returns int, takes two parameters, and execute it.
     //
     Callback<int, double, int> target4 =
         Callback<int, double, int>(&BasicCallbackTestCase::Target4, this);
@@ -220,7 +220,7 @@
 }
 
 /**
- * \ingroup callback-tests
+ * @ingroup callback-tests
  *
  * Test the MakeCallback mechanism.
  */
@@ -243,7 +243,7 @@
 
     /**
      * Callback 2 target function.
-     * \return two.
+     * @return two.
      */
     int Target2()
     {
@@ -253,7 +253,7 @@
 
     /**
      * Callback 3 target function.
-     * \param a A parameter (unused).
+     * @param a A parameter (unused).
      */
     void Target3(double a [[maybe_unused]])
     {
@@ -262,9 +262,9 @@
 
     /**
      * Callback 4 target function.
-     * \param a A parameter (unused).
-     * \param b Another parameter (unused).
-     * \return four.
+     * @param a A parameter (unused).
+     * @param b Another parameter (unused).
+     * @return four.
      */
     int Target4(double a [[maybe_unused]], int b [[maybe_unused]])
     {
@@ -312,8 +312,8 @@
 
 /**
  * MakeCallback 7 target function.
- * \param a The value passed by the callback.
- * \return the value of the calling function.
+ * @param a The value passed by the callback.
+ * @return the value of the calling function.
  */
 int
 MakeCallbackTarget7(int a)
@@ -406,7 +406,7 @@
 }
 
 /**
- * \ingroup callback-tests
+ * @ingroup callback-tests
  *
  * Test the MakeBoundCallback mechanism.
  */
@@ -422,10 +422,10 @@
     /**
      * Member function to test the creation of a bound callback pointing to a member function
      *
-     * \param a first argument
-     * \param b second argument
-     * \param c third argument
-     * \return the sum of the arguments
+     * @param a first argument
+     * @param b second argument
+     * @param c third argument
+     * @return the sum of the arguments
      */
     int BoundTarget(int a, int b, int c)
     {
@@ -470,7 +470,7 @@
 
 /**
  * MakeBoundCallback 1 target function.
- * \param a The value passed by the callback.
+ * @param a The value passed by the callback.
  */
 void
 MakeBoundCallbackTarget1(int a)
@@ -480,7 +480,7 @@
 
 /**
  * MakeBoundCallback 2 target function.
- * \param a The value passed by the callback.
+ * @param a The value passed by the callback.
  */
 void
 MakeBoundCallbackTarget2(bool* a)
@@ -490,9 +490,9 @@
 
 /**
  * MakeBoundCallback 3 target function.
- * \param a The value passed by the callback.
- * \param b The value passed by the callback.
- * \return the value 1234.
+ * @param a The value passed by the callback.
+ * @param b The value passed by the callback.
+ * @return the value 1234.
  */
 int
 MakeBoundCallbackTarget3(bool* a, int b)
@@ -504,8 +504,8 @@
 
 /**
  * MakeBoundCallback 4 target function.
- * \param a The value passed by the callback.
- * \param b The value passed by the callback.
+ * @param a The value passed by the callback.
+ * @param b The value passed by the callback.
  */
 void
 MakeBoundCallbackTarget4(int a, int b)
@@ -516,9 +516,9 @@
 
 /**
  * MakeBoundCallback 5 target function.
- * \param a The value passed by the callback.
- * \param b The value passed by the callback.
- * \return the value 1234.
+ * @param a The value passed by the callback.
+ * @param b The value passed by the callback.
+ * @return the value 1234.
  */
 int
 MakeBoundCallbackTarget5(int a, int b)
@@ -530,10 +530,10 @@
 
 /**
  * MakeBoundCallback 5 target function.
- * \param a The value passed by the callback.
- * \param b The value passed by the callback.
- * \param c The value passed by the callback.
- * \return the value 1234.
+ * @param a The value passed by the callback.
+ * @param b The value passed by the callback.
+ * @param c The value passed by the callback.
+ * @return the value 1234.
  */
 int
 MakeBoundCallbackTarget6(int a, int b, int c)
@@ -546,9 +546,9 @@
 
 /**
  * MakeBoundCallback 7 target function.
- * \param a The value passed by the callback.
- * \param b The value passed by the callback.
- * \param c The value passed by the callback.
+ * @param a The value passed by the callback.
+ * @param b The value passed by the callback.
+ * @param c The value passed by the callback.
  */
 void
 MakeBoundCallbackTarget7(int a, int b, int c)
@@ -560,10 +560,10 @@
 
 /**
  * MakeBoundCallback 8 target function.
- * \param a The value passed by the callback.
- * \param b The value passed by the callback.
- * \param c The value passed by the callback.
- * \return the value 1234.
+ * @param a The value passed by the callback.
+ * @param b The value passed by the callback.
+ * @param c The value passed by the callback.
+ * @return the value 1234.
  */
 int
 MakeBoundCallbackTarget8(int a, int b, int c)
@@ -576,11 +576,11 @@
 
 /**
  * MakeBoundCallback 5 target function.
- * \param a The value passed by the callback.
- * \param b The value passed by the callback.
- * \param c The value passed by the callback.
- * \param d The value passed by the callback.
- * \return the value 1234.
+ * @param a The value passed by the callback.
+ * @param b The value passed by the callback.
+ * @param c The value passed by the callback.
+ * @param d The value passed by the callback.
+ * @return the value 1234.
  */
 int
 MakeBoundCallbackTarget9(int a, int b, int c, int d)
@@ -766,7 +766,7 @@
 }
 
 /**
- * \ingroup callback-tests
+ * @ingroup callback-tests
  *
  * Test the callback equality implementation.
  */
@@ -782,9 +782,9 @@
     /**
      * Member function used to test equality of callbacks.
      *
-     * \param a first argument
-     * \param b second argument
-     * \return the sum of the arguments
+     * @param a first argument
+     * @param b second argument
+     * @return the sum of the arguments
      */
     int TargetMember(double a, int b)
     {
@@ -799,9 +799,9 @@
 /**
  * Non-member function used to test equality of callbacks.
  *
- * \param a first argument
- * \param b second argument
- * \return the sum of the arguments
+ * @param a first argument
+ * @param b second argument
+ * @return the sum of the arguments
  */
 int
 CallbackEqualityTarget(double a, int b)
@@ -923,7 +923,7 @@
 }
 
 /**
- * \ingroup callback-tests
+ * @ingroup callback-tests
  *
  * Test the Nullify mechanism.
  */
@@ -981,7 +981,7 @@
 }
 
 /**
- * \ingroup callback-tests
+ * @ingroup callback-tests
  *
  * Make sure that various MakeCallback template functions compile and execute;
  * doesn't check an results of the execution.
@@ -1031,7 +1031,7 @@
 /** @} */
 
 /**
- * \ingroup callback-tests
+ * @ingroup callback-tests
  *
  * Class used to check the capability of callbacks to call
  * public, protected, and private functions.
@@ -1063,7 +1063,7 @@
 };
 
 /**
- * \ingroup callback-tests
+ * @ingroup callback-tests
  *
  * Derived class used to check the capability of callbacks to call
  * public, protected, and private functions.
@@ -1168,9 +1168,9 @@
 }
 
 /**
- * \ingroup callback-tests
+ * @ingroup callback-tests
  *
- * \brief The callback Test Suite.
+ * @brief The callback Test Suite.
  */
 class CallbackTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/test/command-line-test-suite.cc ns-3.44/src/core/test/command-line-test-suite.cc
--- ns-3.43/src/core/test/command-line-test-suite.cc	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/test/command-line-test-suite.cc	2025-03-09 16:55:49.367371000 -0700
@@ -19,16 +19,16 @@
 #include <sstream>
 
 /**
- * \file
- * \ingroup core-tests
- * \ingroup commandline
- * \ingroup commandline-tests
+ * @file
+ * @ingroup core-tests
+ * @ingroup commandline
+ * @ingroup commandline-tests
  * CommandLine test suite.
  */
 
 /**
- * \ingroup core-tests
- * \defgroup commandline-tests CommandLine test suite
+ * @ingroup core-tests
+ * @defgroup commandline-tests CommandLine test suite
  */
 
 namespace ns3
@@ -38,7 +38,7 @@
 {
 
 /**
- * \ingroup commandline-tests
+ * @ingroup commandline-tests
  * A test base class that drives Command Line parsing
  */
 class CommandLineTestCaseBase : public TestCase
@@ -47,7 +47,7 @@
     /**
      * Constructor
      *
-     * \param description purpose of this TestCase
+     * @param description purpose of this TestCase
      */
     CommandLineTestCaseBase(std::string description);
 
@@ -59,8 +59,8 @@
     /**
      * Exercise the CommandLine with the provided arguments
      *
-     * \param cmd the configured CommandLine
-     * \param n the number of arguments
+     * @param cmd the configured CommandLine
+     * @param n the number of arguments
      */
     void Parse(CommandLine& cmd, int n, ...);
 
@@ -110,7 +110,7 @@
 }
 
 /**
- * \ingroup commandline-tests
+ * @ingroup commandline-tests
  * Test boolean Command Line processing
  */
 class CommandLineBooleanTestCase : public CommandLineTestCaseBase
@@ -180,7 +180,7 @@
 }
 
 /**
- * \ingroup commandline-tests
+ * @ingroup commandline-tests
  * Test \c uint8_t Command Line processing
  */
 class CommandLineUint8tTestCase : public CommandLineTestCaseBase
@@ -219,7 +219,7 @@
 }
 
 /**
- * \ingroup commandline-tests
+ * @ingroup commandline-tests
  * Test int Command Line processing
  */
 class CommandLineIntTestCase : public CommandLineTestCaseBase
@@ -267,7 +267,7 @@
 }
 
 /**
- * \ingroup commandline-tests
+ * @ingroup commandline-tests
  * Test unsigned int Command Line processing
  */
 class CommandLineUnsignedIntTestCase : public CommandLineTestCaseBase
@@ -312,7 +312,7 @@
 }
 
 /**
- * \ingroup commandline-tests
+ * @ingroup commandline-tests
  * Test string Command Line processing
  */
 class CommandLineStringTestCase : public CommandLineTestCaseBase
@@ -357,7 +357,7 @@
 }
 
 /**
- * \ingroup commandline-tests
+ * @ingroup commandline-tests
  * Test order of argument parsing
  */
 class CommandLineOrderTestCase : public CommandLineTestCaseBase
@@ -397,7 +397,7 @@
 }
 
 /**
- * \ingroup commandline-tests
+ * @ingroup commandline-tests
  * Test ignoring invalid arguments
  */
 class CommandLineInvalidTestCase : public CommandLineTestCaseBase
@@ -437,7 +437,7 @@
 }
 
 /**
- * \ingroup commandline-tests
+ * @ingroup commandline-tests
  * Test non-option arguments
  */
 class CommandLineNonOptionTestCase : public CommandLineTestCaseBase
@@ -501,7 +501,7 @@
 }
 
 /**
- * \ingroup commandline-tests
+ * @ingroup commandline-tests
  * Test \c char* buffer argument
  */
 class CommandLineCharStarTestCase : public CommandLineTestCaseBase
@@ -542,7 +542,7 @@
 }
 
 /**
- * \ingroup commandline-tests
+ * @ingroup commandline-tests
  * The Test Suite that glues all of the Test Cases together.
  */
 class CommandLineTestSuite : public TestSuite
@@ -567,7 +567,7 @@
 }
 
 /**
- * \ingroup commandline-tests
+ * @ingroup commandline-tests
  * CommandLineTestSuite instance variable.
  */
 static CommandLineTestSuite g_commandLineTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/test/config-test-suite.cc ns-3.44/src/core/test/config-test-suite.cc
--- ns-3.43/src/core/test/config-test-suite.cc	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/test/config-test-suite.cc	2025-03-09 16:55:49.367371000 -0700
@@ -21,16 +21,16 @@
 #include <sstream>
 
 /**
- * \file
- * \ingroup core-tests
- * \ingroup config
- * \ingroup config-tests
+ * @file
+ * @ingroup core-tests
+ * @ingroup config
+ * @ingroup config-tests
  * Config test suite
  */
 
 /**
- * \ingroup core-tests
- * \defgroup config-tests Config test suite
+ * @ingroup core-tests
+ * @defgroup config-tests Config test suite
  */
 
 namespace ns3
@@ -40,48 +40,48 @@
 {
 
 /**
- * \ingroup config-tests
+ * @ingroup config-tests
  * An object with some attributes that we can play with using config.
  */
 class ConfigTestObject : public Object
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
      * Add node A function
-     * \param a test object a
+     * @param a test object a
      */
     void AddNodeA(Ptr<ConfigTestObject> a);
     /**
      * Add node B function
-     * \param b test object b
+     * @param b test object b
      */
     void AddNodeB(Ptr<ConfigTestObject> b);
 
     /**
      * Set node A function
-     * \param a test object a
+     * @param a test object a
      */
     void SetNodeA(Ptr<ConfigTestObject> a);
     /**
      * Set node b function
-     * \param b test object b
+     * @param b test object b
      */
     void SetNodeB(Ptr<ConfigTestObject> b);
 
     /**
      * Get node A function
-     * \returns the value of node a
+     * @returns the value of node a
      */
     int8_t GetA() const;
     /**
      * Get node b function
-     * \returns the value of node b
+     * @returns the value of node b
      */
     int8_t GetB() const;
 
@@ -179,15 +179,15 @@
 }
 
 /**
- * \ingroup config-tests
+ * @ingroup config-tests
  * Derived test objects.
  */
 class DerivedConfigTestObject : public ConfigTestObject
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -210,15 +210,15 @@
 }
 
 /**
- * \ingroup config-tests
+ * @ingroup config-tests
  * Base config object.
  */
 class BaseConfigObject : public Object
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -251,15 +251,15 @@
 }
 
 /**
- * \ingroup config-tests
+ * @ingroup config-tests
  * Derived config object.
  */
 class DerivedConfigObject : public BaseConfigObject
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -282,7 +282,7 @@
 }
 
 /**
- * \ingroup config-tests
+ * @ingroup config-tests
  * Test for the ability to register and use a root namespace.
  */
 class RootNamespaceConfigTestCase : public TestCase
@@ -346,7 +346,7 @@
 }
 
 /**
- * \ingroup config-tests
+ * @ingroup config-tests
  * Test for the ability to add an object under the root namespace.
  */
 class UnderRootNamespaceConfigTestCase : public TestCase
@@ -459,7 +459,7 @@
 }
 
 /**
- * \ingroup config-tests
+ * @ingroup config-tests
  * Test for the ability to deal configure with vectors of objects.
  */
 class ObjectVectorConfigTestCase : public TestCase
@@ -619,7 +619,7 @@
 }
 
 /**
- * \ingroup config-tests
+ * @ingroup config-tests
  * Test for the ability to trace configure with vectors of objects.
  */
 class ObjectVectorTraceConfigTestCase : public TestCase
@@ -635,8 +635,8 @@
 
     /**
      * Trace callback without context.
-     * \param oldValue The old value.
-     * \param newValue The new value.
+     * @param oldValue The old value.
+     * @param newValue The new value.
      */
     void Trace(int16_t oldValue [[maybe_unused]], int16_t newValue)
     {
@@ -645,9 +645,9 @@
 
     /**
      * Trace callback with context path.
-     * \param path The context path.
-     * \param old The old value.
-     * \param newValue The new value.
+     * @param path The context path.
+     * @param old The old value.
+     * @param newValue The new value.
      */
     void TraceWithPath(std::string path, int16_t old [[maybe_unused]], int16_t newValue)
     {
@@ -797,7 +797,7 @@
 }
 
 /**
- * \ingroup config-tests
+ * @ingroup config-tests
  * Test for the ability to search attributes of parent classes
  * when Resolver searches for attributes in a derived class object.
  * This test passes with the patch found in
@@ -854,7 +854,7 @@
 }
 
 /**
- * \ingroup config-tests
+ * @ingroup config-tests
  * The Test Suite that glues all of the Test Cases together.
  */
 class ConfigTestSuite : public TestSuite
@@ -874,7 +874,7 @@
 }
 
 /**
- * \ingroup config-tests
+ * @ingroup config-tests
  * ConfigTestSuite instance variable.
  */
 static ConfigTestSuite g_configTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/test/environment-variable-test-suite.cc ns-3.44/src/core/test/environment-variable-test-suite.cc
--- ns-3.43/src/core/test/environment-variable-test-suite.cc	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/test/environment-variable-test-suite.cc	2025-03-09 16:55:49.367371000 -0700
@@ -18,18 +18,18 @@
 {
 
 /**
- * \file
- * \ingroup environ-var-tests
+ * @file
+ * @ingroup environ-var-tests
  * Environment variable caching test suite
  */
 
 /**
- * \ingroup core-tests
- * \defgroup environ-var-tests Environment variable caching tests
+ * @ingroup core-tests
+ * @defgroup environ-var-tests Environment variable caching tests
  */
 
 /**
- * \ingroup environ-var-tests
+ * @ingroup environ-var-tests
  *
  * EnvironmentVariable tests
  */
@@ -54,49 +54,49 @@
 
     /**
      * Set the test environment variable.
-     * \param where The test condition being checked.
-     * \param value The value to set.
+     * @param where The test condition being checked.
+     * @param value The value to set.
      */
     void SetVariable(const std::string& where, const std::string& value);
 
     /**
      * Unset the test environment variable.
-     * \param where The test condition being checked.
+     * @param where The test condition being checked.
      */
     void UnsetVariable(const std::string& where);
 
     /**
      * Read \p envValue and check that it contains only the key,value pairs
      * from \p expect.
-     * \param where The test condition being checked.
-     * \param envValue The environment variable to parse and check.
-     * \param expect The set of key,values expected.
+     * @param where The test condition being checked.
+     * @param envValue The environment variable to parse and check.
+     * @param expect The set of key,values expected.
      */
     void Check(const std::string& where, const std::string& envValue, KeyValueStore expect);
 
     /**
      * Set and Check the variable.
-     * \param where The test condition being checked.
-     * \param envValue The environment variable to parse and check.
-     * \param expect The set of key,values expected.
+     * @param where The test condition being checked.
+     * @param envValue The environment variable to parse and check.
+     * @param expect The set of key,values expected.
      */
     void SetAndCheck(const std::string& where, const std::string& envValue, KeyValueStore expect);
 
     /**
      * Check the result from a Get.
-     * \param where The test condition being checked.
-     * \param key The key to check.
-     * \param expect The expected result.
+     * @param where The test condition being checked.
+     * @param key The key to check.
+     * @param expect The expected result.
      */
     void CheckGet(const std::string& where, const std::string& key, KeyFoundType expect);
 
     /**
      * Set, Check, and Get a variable.
-     * \param where The test condition being checked.
-     * \param envValue The environment variable to parse and check.
-     * \param expectDict The set of key,values expected.
-     * \param key The key to check.
-     * \param expectValue The expected result.
+     * @param where The test condition being checked.
+     * @param envValue The environment variable to parse and check.
+     * @param expectDict The set of key,values expected.
+     * @param key The key to check.
+     * @param expectValue The expected result.
      */
     void SetCheckAndGet(const std::string& where,
                         const std::string& envValue,
@@ -301,7 +301,7 @@
 }
 
 /**
- * \ingroup environ-var-tests
+ * @ingroup environ-var-tests
  *
  * Environment variable handling test suite.
  */
@@ -318,7 +318,7 @@
 }
 
 /**
- * \ingroup environ-var-tests
+ * @ingroup environ-var-tests
  * Static variable for test initialization.
  */
 static EnvironmentVariableTestSuite g_EnvironmentVariableTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/test/event-garbage-collector-test-suite.cc ns-3.44/src/core/test/event-garbage-collector-test-suite.cc
--- ns-3.43/src/core/test/event-garbage-collector-test-suite.cc	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/test/event-garbage-collector-test-suite.cc	2025-03-09 16:55:49.367371000 -0700
@@ -10,16 +10,16 @@
 #include "ns3/test.h"
 
 /**
- * \file
- * \ingroup core-tests
- * \ingroup events
- * \ingroup event-garbage-tests
+ * @file
+ * @ingroup core-tests
+ * @ingroup events
+ * @ingroup event-garbage-tests
  * EventGarbageCollector test suite.
  */
 
 /**
- * \ingroup core-tests
- * \defgroup event-garbage-tests EventGarbageCollector test suite
+ * @ingroup core-tests
+ * @defgroup event-garbage-tests EventGarbageCollector test suite
  */
 
 namespace ns3
@@ -29,7 +29,7 @@
 {
 
 /**
- * \ingroup event-garbage-tests
+ * @ingroup event-garbage-tests
  * Event garbage collector test.
  */
 class EventGarbageCollectorTestCase : public TestCase
@@ -90,7 +90,7 @@
 }
 
 /**
- * \ingroup event-garbage-tests
+ * @ingroup event-garbage-tests
  * Event garbage collector test suite.
  */
 class EventGarbageCollectorTestSuite : public TestSuite
@@ -104,7 +104,7 @@
 };
 
 /**
- * \ingroup event-garbage-tests
+ * @ingroup event-garbage-tests
  * EventGarbageCollectorTestSuite instance variable.
  */
 static EventGarbageCollectorTestSuite g_eventGarbageCollectorTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/test/examples-as-tests-test-suite.cc ns-3.44/src/core/test/examples-as-tests-test-suite.cc
--- ns-3.43/src/core/test/examples-as-tests-test-suite.cc	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/test/examples-as-tests-test-suite.cc	2025-03-09 16:55:49.367371000 -0700
@@ -14,15 +14,15 @@
 using namespace ns3;
 
 /**
- * \file
- * \ingroup examples-as-tests
+ * @file
+ * @ingroup examples-as-tests
  * Examples-as-tests test suite
  */
 
 /**
- * \ingroup core-tests
- * \ingroup testing
- * \defgroup examples-as-tests Examples as tests test suite
+ * @ingroup core-tests
+ * @ingroup testing
+ * @defgroup examples-as-tests Examples as tests test suite
  *
  * Runs several examples as tests in order to test ExampleAsTestSuite and ExampleAsTestCase.
  */
@@ -33,7 +33,7 @@
 {
 
 /**
- * \ingroup examples-as-tests
+ * @ingroup examples-as-tests
  * Run command line example as a test case
  */
 class CommandLineExampleTestCase : public ExampleAsTestCase
@@ -55,7 +55,7 @@
      * Since the version changes each time a commit is made it shouldn't
      * be tested as part of the command-line-example output.
      *
-     * \returns The string of post-processing commands.
+     * @returns The string of post-processing commands.
      */
     std::string GetPostProcessingCommand() const override;
 };
@@ -81,7 +81,7 @@
 }
 
 /**
- * \ingroup examples-as-tests
+ * @ingroup examples-as-tests
  * Run examples as tests, checking stdout for regressions.
  */
 class ExamplesAsTestsTestSuite : public TestSuite
@@ -104,14 +104,14 @@
 }
 
 /**
- * \ingroup examples-as-tests
+ * @ingroup examples-as-tests
  * ExampleAsTestsTestSuite instance variable.
  * Tests multiple examples in a single TestSuite using AddTestCase to add the examples to the suite.
  */
 static ExamplesAsTestsTestSuite g_examplesAsTestsTestSuite;
 
 /**
- * \ingroup examples-as-tests
+ * @ingroup examples-as-tests
  * ExampleTestSuite instance variables.
  *
  * Tests ExampleTestSuite which runs a single example as test suite as specified in constructor
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/test/global-value-test-suite.cc ns-3.44/src/core/test/global-value-test-suite.cc
--- ns-3.43/src/core/test/global-value-test-suite.cc	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/test/global-value-test-suite.cc	2025-03-09 16:55:49.367371000 -0700
@@ -10,16 +10,16 @@
 #include "ns3/uinteger.h"
 
 /**
- * \file
- * \ingroup core
- * \ingroup core-tests
- * \ingroup global-value-tests
+ * @file
+ * @ingroup core
+ * @ingroup core-tests
+ * @ingroup global-value-tests
  * GlobalValue test suite
  */
 
 /**
- * \ingroup core-tests
- * \defgroup global-value-tests GlobalValue test suite
+ * @ingroup core-tests
+ * @defgroup global-value-tests GlobalValue test suite
  */
 
 namespace ns3
@@ -29,7 +29,7 @@
 {
 
 /**
- * \ingroup global-value-tests
+ * @ingroup global-value-tests
  * Test for the ability to get at a GlobalValue.
  */
 class GlobalValueTestCase : public TestCase
@@ -84,7 +84,7 @@
 }
 
 /**
- * \ingroup global-value-tests
+ * @ingroup global-value-tests
  * The Test Suite that glues all of the Test Cases together.
  */
 class GlobalValueTestSuite : public TestSuite
@@ -101,7 +101,7 @@
 }
 
 /**
- * \ingroup global-value-tests
+ * @ingroup global-value-tests
  * GlobalValueTestSuite instance variable.
  */
 static GlobalValueTestSuite g_globalValueTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/test/hash-test-suite.cc ns-3.44/src/core/test/hash-test-suite.cc
--- ns-3.43/src/core/test/hash-test-suite.cc	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/test/hash-test-suite.cc	2025-03-09 16:55:49.367371000 -0700
@@ -13,17 +13,17 @@
 #include <string>
 
 /**
- * \file
- * \ingroup core-tests
- * \ingroup hash
- * \ingroup hash-tests
+ * @file
+ * @ingroup core-tests
+ * @ingroup hash
+ * @ingroup hash-tests
  * Hash test suite
  */
 
 /**
- * \ingroup core-tests
- * \ingroup hash
- * \defgroup hash-tests Hash test suite
+ * @ingroup core-tests
+ * @ingroup hash
+ * @defgroup hash-tests Hash test suite
  */
 
 namespace ns3
@@ -33,7 +33,7 @@
 {
 
 /**
- * \ingroup hash-tests
+ * @ingroup hash-tests
  *  Base class for hash tests
  */
 class HashTestCase : public TestCase
@@ -42,7 +42,7 @@
     /**
      * Constructor
      *
-     * \param [in] name reference name
+     * @param [in] name reference name
      */
     HashTestCase(const std::string name);
     /** Destructor. */
@@ -51,14 +51,14 @@
   protected:
     /**
      * Check function
-     * \param [in] hashName the name of the hash
-     * \param [in] hash the hash value
+     * @param [in] hashName the name of the hash
+     * @param [in] hash the hash value
      */
     void Check(const std::string hashName, const uint32_t hash);
     /**
      * Check function
-     * \param [in] hashName the name of the hash
-     * \param [in] hash the hash value
+     * @param [in] hashName the name of the hash
+     * @param [in] hash the hash value
      */
     void Check(const std::string hashName, const uint64_t hash);
 
@@ -69,9 +69,9 @@
   private:
     /**
      * Check function
-     * \param [in] hashName the name of the hash
-     * \param [in] bits the number of bits
-     * \param [in] hash the hash value
+     * @param [in] hashName the name of the hash
+     * @param [in] bits the number of bits
+     * @param [in] hash the hash value
      */
     void Check(const std::string hashName, const int bits, const uint64_t hash);
     void DoRun() override;
@@ -135,7 +135,7 @@
 }
 
 /**
- * \ingroup hash-tests
+ * @ingroup hash-tests
  * Test default hash on fixed string
  */
 class DefaultHashTestCase : public HashTestCase
@@ -172,7 +172,7 @@
 }
 
 /**
- * \ingroup hash-tests
+ * @ingroup hash-tests
  * FNV hash on fixed string
  */
 class Fnv1aTestCase : public HashTestCase
@@ -208,7 +208,7 @@
 }
 
 /**
- * \ingroup hash-tests
+ * @ingroup hash-tests
  * Test Murmur3 hash on fixed string
  */
 class Murmur3TestCase : public HashTestCase
@@ -244,7 +244,7 @@
 }
 
 /**
- * \ingroup hash-tests
+ * @ingroup hash-tests
  * Simple hash function based on the GNU sum program.
  *
  * 16-bit checksum algorithm.  See
@@ -252,9 +252,9 @@
  *
  * Used to test Hash32Function_ptr/Hash64Function_ptr
  *
- * \param [in,out] buffer The data to hash.
- * \param [in] size The buffer size.
- * \returns The checksum of the buffer contents.
+ * @param [in,out] buffer The data to hash.
+ * @param [in] size The buffer size.
+ * @returns The checksum of the buffer contents.
  */
 uint16_t
 gnu_sum(const char* buffer, const std::size_t size)
@@ -273,9 +273,9 @@
 }
 
 /**
- * \ingroup hash-tests
+ * @ingroup hash-tests
  * A 32-bit hash function, based on gnu_sum().
- * \copydetails gnu_sum()
+ * @copydetails gnu_sum()
  */
 uint32_t
 gnu_sum32(const char* buffer, const std::size_t size)
@@ -285,9 +285,9 @@
 }
 
 /**
- * \ingroup hash-tests
+ * @ingroup hash-tests
  * A 64-bit hash function, base on gnu_sum().
- * \copydetails gnu_sum()
+ * @copydetails gnu_sum()
  */
 uint64_t
 gnu_sum64(const char* buffer, const std::size_t size)
@@ -297,7 +297,7 @@
 }
 
 /**
- * \ingroup hash-tests
+ * @ingroup hash-tests
  * Test 32-bit function pointer
  */
 class Hash32FunctionPtrTestCase : public HashTestCase
@@ -330,7 +330,7 @@
 }
 
 /**
- * \ingroup hash-tests
+ * @ingroup hash-tests
  * Test 64-bit function pointer
  */
 class Hash64FunctionPtrTestCase : public HashTestCase
@@ -363,7 +363,7 @@
 }
 
 /**
- * \ingroup hash-tests
+ * @ingroup hash-tests
  * Test incremental hashing
  */
 class IncrementalTestCase : public HashTestCase
@@ -378,8 +378,8 @@
     void DoRun() override;
     /**
      * Complute the hash test function
-     * \param name the hash name
-     * \param hasher the hash function
+     * @param name the hash name
+     * @param hasher the hash function
      */
     void DoHash(const std::string name, Hasher hasher);
     std::string key1;  //!< test string
@@ -427,7 +427,7 @@
 }
 
 /**
- * \ingroup hash-tests
+ * @ingroup hash-tests
  * Hash functions test suite
  */
 class HashTestSuite : public TestSuite
@@ -449,7 +449,7 @@
 }
 
 /**
- * \ingroup hash-tests
+ * @ingroup hash-tests
  * HashTestSuite instance variable.
  */
 static HashTestSuite g_hashTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/test/int64x64-test-suite.cc ns-3.44/src/core/test/int64x64-test-suite.cc
--- ns-3.43/src/core/test/int64x64-test-suite.cc	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/test/int64x64-test-suite.cc	2025-03-09 16:55:49.367371000 -0700
@@ -37,18 +37,18 @@
 {
 
 /**
- * \file
- * \ingroup int64x64-tests
+ * @file
+ * @ingroup int64x64-tests
  * int64x46 test suite
  */
 
 /**
- * \ingroup core-tests
- * \defgroup int64x64-tests int64x64 tests
+ * @ingroup core-tests
+ * @defgroup int64x64-tests int64x64 tests
  */
 
 /**
- * \ingroup int64x64-tests
+ * @ingroup int64x64-tests
  *
  * Pretty printer for test cases.
  */
@@ -58,8 +58,8 @@
     /**
      * Construct from high and low words of Q64.64 representation.
      *
-     * \param [in] high The integer portion.
-     * \param [in] low The fractional portion.
+     * @param [in] high The integer portion.
+     * @param [in] low The fractional portion.
      */
     Printer(const int64_t high, const uint64_t low)
         : m_haveInt(false),
@@ -72,7 +72,7 @@
     /**
      * Construct from an \c int64x64_t Q64.64 value.
      *
-     * \param [in] value The value.
+     * @param [in] value The value.
      */
     Printer(const int64x64_t value)
         : m_haveInt(true),
@@ -86,9 +86,9 @@
     /**
      * Output streamer, the main reason for this class.
      *
-     * \param [in] os The stream.
-     * \param [in] p The value to print.
-     * \returns The stream.
+     * @param [in] os The stream.
+     * @param [in] p The value to print.
+     * @returns The stream.
      */
     friend std::ostream& operator<<(std::ostream& os, const Printer& p);
 
@@ -112,7 +112,7 @@
 }
 
 /**
- * \ingroup int64x64-tests
+ * @ingroup int64x64-tests
  *
  * Test: manipulate the high and low part of every number.
  */
@@ -123,8 +123,8 @@
     void DoRun() override;
     /**
      * Check the high and low parts for correctness.
-     * \param hi The high part of the int64x64_t.
-     * \param lo The low part of the int64x64_t.
+     * @param hi The high part of the int64x64_t.
+     * @param lo The low part of the int64x64_t.
      */
     void Check(const int64_t hi, const uint64_t lo);
 };
@@ -188,7 +188,7 @@
 }
 
 /**
- * \ingroup int64x64-tests
+ * @ingroup int64x64-tests
  *
  * Test: check GetInt and Round.
  */
@@ -199,9 +199,9 @@
     void DoRun() override;
     /**
      * Check the int64x64 value for correctness.
-     * \param value The int64x64_t value.
-     * \param expectInt The expected integer value.
-     * \param expectRnd The expected rounding value.
+     * @param value The int64x64_t value.
+     * @param expectInt The expected integer value.
+     * @param expectRnd The expected rounding value.
      */
     void Check(const int64x64_t value, const int64_t expectInt, const int64_t expectRnd);
 };
@@ -253,7 +253,7 @@
 }
 
 /**
- * \ingroup int64x64-tests
+ * @ingroup int64x64-tests
  *
  * Test: parse int64x64_t numbers as strings.
  */
@@ -264,10 +264,10 @@
     void DoRun() override;
     /**
      * Check the iont64x64 for correctness.
-     * \param str String representation of a number.
-     * \param hi The expected high part of the int64x64_t.
-     * \param lo The expected low part of the int64x64_t.
-     * \param tolerance The allowed tolerance.
+     * @param str String representation of a number.
+     * @param hi The expected high part of the int64x64_t.
+     * @param lo The expected low part of the int64x64_t.
+     * @param tolerance The allowed tolerance.
      */
     void Check(const std::string& str,
                const int64_t hi,
@@ -339,7 +339,7 @@
 }
 
 /**
- * \ingroup int64x64-tests
+ * @ingroup int64x64-tests
  *
  * Test: roundtrip int64x64_t numbers as strings.
  *
@@ -352,8 +352,8 @@
     void DoRun() override;
     /**
      * Check the iont64x64 for correctness.
-     * \param str String representation of a number.
-     * \param tolerance The allowed tolerance.
+     * @param str String representation of a number.
+     * @param tolerance The allowed tolerance.
      */
     void Check(const std::string& str, const int64_t tolerance = 0);
 };
@@ -426,7 +426,7 @@
 }
 
 /**
- * \ingroup int64x64-tests
+ * @ingroup int64x64-tests
  *
  * Test: basic arithmetic operations.
  */
@@ -437,10 +437,10 @@
     void DoRun() override;
     /**
      * Check the int64x64 for correctness.
-     * \param test The test number.
-     * \param value The actual value.
-     * \param expect The expected value.
-     * \param tolerance The allowed tolerance.
+     * @param test The test number.
+     * @param value The actual value.
+     * @param expect The expected value.
+     * @param tolerance The allowed tolerance.
      */
     void Check(const int test,
                const int64x64_t value,
@@ -596,7 +596,7 @@
 }
 
 /**
- * \ingroup int64x64-tests
+ * @ingroup int64x64-tests
  *
  * Test case for bug 455.
  *
@@ -609,9 +609,9 @@
     void DoRun() override;
     /**
      * Check the int64x64 for correctness.
-     * \param result The actual value.
-     * \param expect The expected value.
-     * \param msg The error message to print.
+     * @param result The actual value.
+     * @param expect The expected value.
+     * @param msg The error message to print.
      */
     void Check(const double result, const double expect, const std::string& msg);
 };
@@ -660,7 +660,7 @@
 }
 
 /**
- * \ingroup int64x64-tests
+ * @ingroup int64x64-tests
  *
  * Test case for bug 455.
  *
@@ -673,9 +673,9 @@
     void DoRun() override;
     /**
      * Check the int64x64 for correctness.
-     * \param result The actual value.
-     * \param expect The expected value.
-     * \param msg The error message to print.
+     * @param result The actual value.
+     * @param expect The expected value.
+     * @param msg The error message to print.
      */
     void Check(const double result, const double expect, const std::string& msg);
 };
@@ -726,7 +726,7 @@
 }
 
 /**
- * \ingroup int64x64-tests
+ * @ingroup int64x64-tests
  *
  * Test case for bug 455.
  *
@@ -739,9 +739,9 @@
     void DoRun() override;
     /**
      * Check the int64x64 for correctness.
-     * \param low The actual low value.
-     * \param value The expected low part printed value.
-     * \param tolerance The allowed tolerance.
+     * @param low The actual low value.
+     * @param value The expected low part printed value.
+     * @param tolerance The allowed tolerance.
      */
     void Check(const uint64_t low, const std::string& value, const int64_t tolerance = 0);
 };
@@ -870,7 +870,7 @@
 }
 
 /**
- * \ingroup int64x64-tests
+ * @ingroup int64x64-tests
  *
  * Test: basic compare operations.
  */
@@ -882,9 +882,9 @@
 
     /**
      * Check the int64x64 for correctness.
-     * \param result The actual value.
-     * \param expect The expected value.
-     * \param msg The error message to print.
+     * @param result The actual value.
+     * @param expect The expected value.
+     * @param msg The error message to print.
      */
     void Check(const bool result, const bool expect, const std::string& msg);
 };
@@ -985,7 +985,7 @@
 }
 
 /**
- * \ingroup int64x64-tests
+ * @ingroup int64x64-tests
  *
  * Test: Invert and MulByInvert.
  */
@@ -996,16 +996,16 @@
     void DoRun() override;
     /**
      * Check the int64x64 for correctness.
-     * \param factor The factor used to invert the number.
+     * @param factor The factor used to invert the number.
      */
     void Check(const int64_t factor);
     /**
      * Check the int64x64 for correctness.
-     * \param factor The factor used to invert the number.
-     * \param result The value.
-     * \param expect The expected value.
-     * \param msg The error message to print.
-     * \param tolerance The allowed tolerance.
+     * @param factor The factor used to invert the number.
+     * @param result The value.
+     * @param expect The expected value.
+     * @param msg The error message to print.
+     * @param tolerance The allowed tolerance.
      */
     void CheckCase(const uint64_t factor,
                    const int64x64_t result,
@@ -1107,7 +1107,7 @@
 }
 
 /**
- * \ingroup int64x64-tests
+ * @ingroup int64x64-tests
  *
  * Test: construct from floating point.
  */
@@ -1119,15 +1119,15 @@
 
     /**
      * Check the int64x64 for correctness.
-     * \param intPart The expected integer part value of the int64x64.
+     * @param intPart The expected integer part value of the int64x64.
      */
     void Check(const int64_t intPart);
     /**
      * Check the int64x64 for correctness.
-     * \param dec The integer part of the value to test.
-     * \param frac The fractional part of the value to test.x
-     * \param intPart The expected integer part value of the int64x64.
-     * \param lo The expected low part value of the int64x64.
+     * @param dec The integer part of the value to test.
+     * @param frac The fractional part of the value to test.x
+     * @param intPart The expected integer part value of the int64x64.
+     * @param lo The expected low part value of the int64x64.
      */
     void Check(const long double dec,
                const long double frac,
@@ -1500,7 +1500,7 @@
 }
 
 /**
- * \ingroup int64x64-tests
+ * @ingroup int64x64-tests
  *
  * Test: print the implementation
  */
@@ -1551,8 +1551,8 @@
 }
 
 /**
- * \ingroup int64x64-tests
- * \internal
+ * @ingroup int64x64-tests
+ * @internal
  *
  * The int64x64 Test Suite.
  *
@@ -1564,12 +1564,12 @@
  * test comparisons.  If you need to increase the tolerance,
  * please append the system and compiler version.  For example:
  *
- * \code
+ * @code
  *   // Darwin 12.5.0 (Mac 10.8.5) g++ 4.2.1
  *   tolerance = 1;
  *   // System Foo gcc 3.9
  *   tolerance = 3;
- * \endcode
+ * @endcode
  */
 class Int64x64TestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/test/length-test-suite.cc ns-3.44/src/core/test/length-test-suite.cc
--- ns-3.43/src/core/test/length-test-suite.cc	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/test/length-test-suite.cc	2025-03-09 16:55:49.367371000 -0700
@@ -29,14 +29,14 @@
 #include <string>
 
 /**
- * \file
- * \ingroup length-tests
+ * @file
+ * @ingroup length-tests
  * Length class tests.
  */
 
 /**
- * \ingroup core-tests length
- * \defgroup length-tests Length test suite
+ * @ingroup core-tests length
+ * @defgroup length-tests Length test suite
  */
 
 using namespace ns3;
@@ -69,8 +69,8 @@
     /**
      * Helper function to compare results with false
      *
-     * \param condition The boolean condition to test
-     * \param msg The message to print if the test fails
+     * @param condition The boolean condition to test
+     * @param msg The message to print if the test fails
      */
     void AssertFalse(bool condition, std::string msg)
     {
@@ -80,8 +80,8 @@
     /**
      * Helper function to compare results with true
      *
-     * \param condition The boolean condition to test
-     * \param msg The message to print if the test fails
+     * @param condition The boolean condition to test
+     * @param msg The message to print if the test fails
      */
     void AssertTrue(bool condition, std::string msg)
     {
@@ -125,10 +125,10 @@
 
     /**
      * Test that a length object can be constructed from a string
-     * \param unitValue  //!< Value to test.
-     * \param meterValue //!< Reference value [m].
-     * \param tolerance  //!< Tolerance.
-     * \param symbols    //!< Unit symbols.
+     * @param unitValue  //!< Value to test.
+     * @param meterValue //!< Reference value [m].
+     * @param tolerance  //!< Tolerance.
+     * @param symbols    //!< Unit symbols.
      */
     void TestConstructLengthFromString(double unitValue,
                                        double meterValue,
@@ -233,12 +233,12 @@
      * Generic function for testing serialization of a Length object in
      * various units
      *
-     * \tparam T Type of the length unit that should be output during serialization
+     * @tparam T Type of the length unit that should be output during serialization
      *
-     * \param l Length object to serialize
-     * \param unit Unit that the length value will be converted to before serialization
-     * \param expectedOutput Expected result of the serialization
-     * \param context Included in the error message if the test fails
+     * @param l Length object to serialize
+     * @param unit Unit that the length value will be converted to before serialization
+     * @param expectedOutput Expected result of the serialization
+     * @param context Included in the error message if the test fails
      */
     template <class T>
     void TestLengthSerialization(const Length& l,
@@ -1407,7 +1407,7 @@
 }
 
 /**
- * \ingroup length-tests
+ * @ingroup length-tests
  *
  * Test case for LengthValue attribute
  */
@@ -1435,8 +1435,8 @@
     {
       public:
         /**
-         * \brief Get the type ID.
-         * \return The object TypeId.
+         * @brief Get the type ID.
+         * @return The object TypeId.
          */
         static TypeId GetTypeId();
 
@@ -1579,7 +1579,7 @@
 }
 
 /**
- * \ingroup length-tests
+ * @ingroup length-tests
  * The Test Suite that runs the test case
  */
 class LengthTestSuite : public TestSuite
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/test/many-uniform-random-variables-one-get-value-call-test-suite.cc ns-3.44/src/core/test/many-uniform-random-variables-one-get-value-call-test-suite.cc
--- ns-3.43/src/core/test/many-uniform-random-variables-one-get-value-call-test-suite.cc	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/test/many-uniform-random-variables-one-get-value-call-test-suite.cc	2025-03-09 16:55:49.367371000 -0700
@@ -14,10 +14,10 @@
 #include <vector>
 
 /**
- * \file
- * \ingroup core-tests
- * \ingroup randomvariable
- * \ingroup rng-tests
+ * @file
+ * @ingroup core-tests
+ * @ingroup randomvariable
+ * @ingroup rng-tests
  * Test for many uniform random variable streams.
  */
 
@@ -28,7 +28,7 @@
 {
 
 /**
- * \ingroup rng-tests
+ * @ingroup rng-tests
  * Test case for many uniform distribution random variable stream generators
  */
 class ManyUniformRandomVariablesOneGetValueCallTestCase : public TestCase
@@ -76,7 +76,7 @@
 }
 
 /**
- * \ingroup rng-tests
+ * @ingroup rng-tests
  * Test suite for many uniform distribution random variable stream generators
  */
 class ManyUniformRandomVariablesOneGetValueCallTestSuite : public TestSuite
@@ -93,7 +93,7 @@
 }
 
 /**
- * \ingroup rng-tests
+ * @ingroup rng-tests
  * ManuUniformRandomVariablesOneGetValueCallTestSuite instance variable.
  */
 static ManyUniformRandomVariablesOneGetValueCallTestSuite
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/test/matrix-array-test-suite.cc ns-3.44/src/core/test/matrix-array-test-suite.cc
--- ns-3.43/src/core/test/matrix-array-test-suite.cc	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/test/matrix-array-test-suite.cc	2025-03-09 16:55:49.367371000 -0700
@@ -10,15 +10,17 @@
 #include "ns3/matrix-array.h"
 #include "ns3/test.h"
 
+#include <algorithm>
+
 /**
- * \defgroup matrixArray-tests MatrixArray tests
- * \ingroup core-tests
- * \ingroup Matrices
+ * @defgroup matrixArray-tests MatrixArray tests
+ * @ingroup core-tests
+ * @ingroup Matrices
  */
 
 /**
- * \file
- * \ingroup matrixArray-tests
+ * @file
+ * @ingroup matrixArray-tests
  * MatrixArray test suite
  */
 namespace ns3
@@ -30,9 +32,9 @@
 NS_LOG_COMPONENT_DEFINE("MatrixArrayTest");
 
 /**
- * \brief Function casts an input valArray "in" (type IN) to an output valArray "out" (type T)
- * \param in Input valarray to be casted
- * \param out Output valarray to receive casted values
+ * @brief Function casts an input valArray "in" (type IN) to an output valArray "out" (type T)
+ * @param in Input valarray to be casted
+ * @param out Output valarray to receive casted values
  */
 template <typename IN, typename T>
 void
@@ -51,7 +53,7 @@
 }
 
 /**
- * \ingroup matrixArray-tests
+ * @ingroup matrixArray-tests
  *  MatrixArray test case for testing constructors, operators and other functions
  */
 template <class T>
@@ -62,32 +64,32 @@
     /**
      * Constructor
      *
-     * \param [in] name reference name
+     * @param [in] name reference name
      */
     MatrixArrayTestCase(const std::string& name);
 
     /** Destructor. */
     ~MatrixArrayTestCase() override;
     /**
-     * \brief Copy constructor.
+     * @brief Copy constructor.
      * Instruct the compiler to generate the implicitly declared copy constructor
      */
     MatrixArrayTestCase(const MatrixArrayTestCase<T>&) = default;
     /**
-     * \brief Copy assignment operator.
+     * @brief Copy assignment operator.
      * Instruct the compiler to generate the implicitly declared copy assignment operator.
-     * \return A reference to this MatrixArrayTestCase
+     * @return A reference to this MatrixArrayTestCase
      */
     MatrixArrayTestCase<T>& operator=(const MatrixArrayTestCase<T>&) = default;
     /**
-     * \brief Move constructor.
+     * @brief Move constructor.
      * Instruct the compiler to generate the implicitly declared move constructor
      */
     MatrixArrayTestCase(MatrixArrayTestCase<T>&&) = default;
     /**
-     * \brief Move assignment operator.
+     * @brief Move assignment operator.
      * Instruct the compiler to generate the implicitly declared copy constructor
-     * \return A reference to this MatrixArrayTestCase
+     * @return A reference to this MatrixArrayTestCase
      */
     MatrixArrayTestCase<T>& operator=(MatrixArrayTestCase<T>&&) = default;
 
@@ -604,7 +606,7 @@
 }
 
 /**
- * \ingroup matrixArray-tests
+ * @ingroup matrixArray-tests
  *  Test for testing functions that apply to MatrixArrays that use complex numbers,
  *  such as HermitianTranspose that is only defined for complex type
  */
@@ -616,7 +618,7 @@
     /**
      * Constructor
      *
-     * \param [in] name reference name
+     * @param [in] name reference name
      */
     ComplexMatrixArrayTestCase(const std::string& name);
     /** Destructor*/
@@ -681,7 +683,7 @@
 }
 
 /**
- * \ingroup matrixArray-tests
+ * @ingroup matrixArray-tests
  * MatrixArray test suite
  */
 class MatrixArrayTestSuite : public TestSuite
@@ -702,7 +704,7 @@
 }
 
 /**
- * \ingroup matrixArray-tests
+ * @ingroup matrixArray-tests
  * MatrixArrayTestSuite instance variable.
  */
 static MatrixArrayTestSuite g_matrixArrayTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/test/names-test-suite.cc ns-3.44/src/core/test/names-test-suite.cc
--- ns-3.43/src/core/test/names-test-suite.cc	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/test/names-test-suite.cc	2025-03-09 16:55:49.367371000 -0700
@@ -6,16 +6,16 @@
 #include "ns3/test.h"
 
 /**
- * \file
- * \ingroup core-tests
- * \ingroup config
- * \ingroup names-tests
+ * @file
+ * @ingroup core-tests
+ * @ingroup config
+ * @ingroup names-tests
  * Object Names test suite.
  */
 
 /**
- * \ingroup core-tests
- * \defgroup names-tests Object Names test suite
+ * @ingroup core-tests
+ * @defgroup names-tests Object Names test suite
  */
 
 namespace ns3
@@ -25,7 +25,7 @@
 {
 
 /**
- * \ingroup names-tests
+ * @ingroup names-tests
  * Simple test object to exercise the Name service.
  */
 class TestObject : public Object
@@ -33,7 +33,7 @@
   public:
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId()
     {
@@ -52,7 +52,7 @@
 };
 
 /**
- * \ingroup names-tests
+ * @ingroup names-tests
  * Alternate test object for the Name service.
  */
 class AlternateTestObject : public Object
@@ -60,7 +60,7 @@
   public:
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId()
     {
@@ -79,7 +79,7 @@
 };
 
 /**
- * \ingroup names-tests
+ * @ingroup names-tests
  * Test the Object Name Service can do its most basic job.
  *
  * Add associations between Objects using the lowest level add
@@ -155,7 +155,7 @@
 }
 
 /**
- * \ingroup names-tests
+ * @ingroup names-tests
  * Test the Object Name Service can correctly use a string context.
  *
  *     Add (std::string context, std::string name, Ptr<Object> object);
@@ -229,7 +229,7 @@
 }
 
 /**
- * \ingroup names-tests
+ * @ingroup names-tests
  * Test the Object Name Service can correctly use a
  * fully qualified path to add associations.
  *
@@ -302,7 +302,7 @@
 }
 
 /**
- * \ingroup names-tests
+ * @ingroup names-tests
  * Test the Object Name Service can correctly use a
  * relative path to add associations.
  *
@@ -379,7 +379,7 @@
 }
 
 /**
- * \ingroup names-tests
+ * @ingroup names-tests
  * Test the Object Name Service can rename objects.
  *
  *     Rename (Ptr<Object> context, std::string oldname, std::string newname);
@@ -446,7 +446,7 @@
 }
 
 /**
- * \ingroup names-tests
+ * @ingroup names-tests
  * Test the Object Name Service can rename objects
  * using a string context.
  *
@@ -512,7 +512,7 @@
 }
 
 /**
- * \ingroup names-tests
+ * @ingroup names-tests
  * Test the Object Name Service can rename objects
  * using a fully qualified path name.
  *
@@ -578,7 +578,7 @@
 }
 
 /**
- * \ingroup names-tests
+ * @ingroup names-tests
  * Test the Object Name Service can rename objects
  * using a relative path name.
  *
@@ -644,7 +644,7 @@
 }
 
 /**
- * \ingroup names-tests
+ * @ingroup names-tests
  * Test the Object Name Service can look up an object
  * and return its fully qualified path name.
  *
@@ -706,7 +706,7 @@
 }
 
 /**
- * \ingroup names-tests
+ * @ingroup names-tests
  * Test the Object Name Service can find Objects.
  *
  *     Find (Ptr<Object> context, std::string name);
@@ -779,7 +779,7 @@
 }
 
 /**
- * \ingroup names-tests
+ * @ingroup names-tests
  * Test the Object Name Service can find Objects using
  * a string context.
  *
@@ -853,7 +853,7 @@
 }
 
 /**
- * \ingroup names-tests
+ * @ingroup names-tests
  * Test the Object Name Service can find Objects using
  * a fully qualified path name.
  *
@@ -927,7 +927,7 @@
 }
 
 /**
- * \ingroup names-tests
+ * @ingroup names-tests
  * Test the Object Name Service can find Objects using
  * a relative path name.
  *
@@ -1001,7 +1001,7 @@
 }
 
 /**
- * \ingroup names-tests
+ * @ingroup names-tests
  * Test the Object Name Service can find Objects using
  * a second type.
  */
@@ -1067,7 +1067,7 @@
 }
 
 /**
- * \ingroup names-tests
+ * @ingroup names-tests
  * Names Test Suite
  */
 class NamesTestSuite : public TestSuite
@@ -1097,7 +1097,7 @@
 }
 
 /**
- * \ingroup names-tests
+ * @ingroup names-tests
  *  NamesTestSuite instance variable.
  */
 static NamesTestSuite g_namesTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/test/object-test-suite.cc ns-3.44/src/core/test/object-test-suite.cc
--- ns-3.43/src/core/test/object-test-suite.cc	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/test/object-test-suite.cc	2025-03-09 16:55:49.367371000 -0700
@@ -12,23 +12,23 @@
 #include "ns3/test.h"
 
 /**
- * \file
- * \ingroup core-tests
- * \ingroup object
- * \ingroup object-tests
+ * @file
+ * @ingroup core-tests
+ * @ingroup object
+ * @ingroup object-tests
  * Object test suite.
  */
 
 /**
- * \ingroup core-tests
- * \defgroup object-tests Object test suite
+ * @ingroup core-tests
+ * @defgroup object-tests Object test suite
  */
 
 namespace
 {
 
 /**
- * \ingroup object-tests
+ * @ingroup object-tests
  * Base class A.
  */
 class BaseA : public ns3::Object
@@ -36,7 +36,7 @@
   public:
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static ns3::TypeId GetTypeId()
     {
@@ -55,7 +55,7 @@
 };
 
 /**
- * \ingroup object-tests
+ * @ingroup object-tests
  * Derived class A.
  */
 class DerivedA : public BaseA
@@ -63,7 +63,7 @@
   public:
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static ns3::TypeId GetTypeId()
     {
@@ -88,7 +88,7 @@
 };
 
 /**
- * \ingroup object-tests
+ * @ingroup object-tests
  * Base class B.
  */
 class BaseB : public ns3::Object
@@ -96,7 +96,7 @@
   public:
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static ns3::TypeId GetTypeId()
     {
@@ -115,7 +115,7 @@
 };
 
 /**
- * \ingroup object-tests
+ * @ingroup object-tests
  * Derived class B.
  */
 class DerivedB : public BaseB
@@ -123,7 +123,7 @@
   public:
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static ns3::TypeId GetTypeId()
     {
@@ -161,7 +161,7 @@
 {
 
 /**
- * \ingroup object-tests
+ * @ingroup object-tests
  * Test we can make Objects using CreateObject.
  */
 class CreateObjectTestCase : public TestCase
@@ -242,7 +242,7 @@
 }
 
 /**
- * \ingroup object-tests
+ * @ingroup object-tests
  * Test we can aggregate Objects.
  */
 class AggregateObjectTestCase : public TestCase
@@ -454,7 +454,7 @@
 }
 
 /**
- * \ingroup object-tests
+ * @ingroup object-tests
  * Test we can aggregate Objects.
  */
 class UnidirectionalAggregateObjectTestCase : public TestCase
@@ -522,7 +522,7 @@
 }
 
 /**
- * \ingroup object-tests
+ * @ingroup object-tests
  * Test an Object factory can create Objects
  */
 class ObjectFactoryTestCase : public TestCase
@@ -607,7 +607,7 @@
 }
 
 /**
- * \ingroup object-tests
+ * @ingroup object-tests
  * The Test Suite that glues the Test Cases together.
  */
 class ObjectTestSuite : public TestSuite
@@ -627,7 +627,7 @@
 }
 
 /**
- * \ingroup object-tests
+ * @ingroup object-tests
  * ObjectTestSuite instance variable.
  */
 static ObjectTestSuite g_objectTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/test/one-uniform-random-variable-many-get-value-calls-test-suite.cc ns-3.44/src/core/test/one-uniform-random-variable-many-get-value-calls-test-suite.cc
--- ns-3.43/src/core/test/one-uniform-random-variable-many-get-value-calls-test-suite.cc	2024-10-09 16:41:09.864655700 -0700
+++ ns-3.44/src/core/test/one-uniform-random-variable-many-get-value-calls-test-suite.cc	2025-03-09 16:55:49.367371000 -0700
@@ -14,10 +14,10 @@
 #include <vector>
 
 /**
- * \file
- * \ingroup core-tests
- * \ingroup randomvariable
- * \ingroup rng-tests
+ * @file
+ * @ingroup core-tests
+ * @ingroup randomvariable
+ * @ingroup rng-tests
  * Test for one uniform random variable stream.
  */
 
@@ -28,7 +28,7 @@
 {
 
 /**
- * \ingroup rng-tests
+ * @ingroup rng-tests
  * Test case for one uniform distribution random variable stream generator
  */
 class OneUniformRandomVariableManyGetValueCallsTestCase : public TestCase
@@ -76,7 +76,7 @@
 }
 
 /**
- * \ingroup rng-tests
+ * @ingroup rng-tests
  * Test suite for one uniform distribution random variable stream generator
  */
 class OneUniformRandomVariableManyGetValueCallsTestSuite : public TestSuite
@@ -93,7 +93,7 @@
 }
 
 /**
- * \ingroup rng-tests
+ * @ingroup rng-tests
  * OneUniformRandomVariableManyGetValueCallsTestSuite instance variable.
  */
 static OneUniformRandomVariableManyGetValueCallsTestSuite
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/test/pair-value-test-suite.cc ns-3.44/src/core/test/pair-value-test-suite.cc
--- ns-3.43/src/core/test/pair-value-test-suite.cc	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/core/test/pair-value-test-suite.cc	2025-03-09 16:55:49.367371000 -0700
@@ -6,15 +6,15 @@
  * Author: Jared Dulmage <jared.dulmage@caliola.com>
  */
 
-#include <ns3/double.h>
-#include <ns3/integer.h>
-#include <ns3/log.h>
-#include <ns3/object.h>
-#include <ns3/pair.h>
-#include <ns3/ptr.h>
-#include <ns3/string.h>
-#include <ns3/test.h>
-#include <ns3/type-id.h>
+#include "ns3/double.h"
+#include "ns3/integer.h"
+#include "ns3/log.h"
+#include "ns3/object.h"
+#include "ns3/pair.h"
+#include "ns3/ptr.h"
+#include "ns3/string.h"
+#include "ns3/test.h"
+#include "ns3/type-id.h"
 
 #include <algorithm>
 #include <iterator>
@@ -26,18 +26,18 @@
 NS_LOG_COMPONENT_DEFINE("PairTestSuite");
 
 /**
- * \file
- * \ingroup pair-tests
+ * @file
+ * @ingroup pair-tests
  * Pairs tests.
  */
 
 /**
- * \ingroup core-tests
- * \defgroup pair-tests Pairs tests
+ * @ingroup core-tests
+ * @defgroup pair-tests Pairs tests
  */
 
 /**
- * \ingroup pair-tests
+ * @ingroup pair-tests
  *
  * Object holding pairs of values.
  */
@@ -48,8 +48,8 @@
     ~PairObject() override;
 
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
@@ -93,11 +93,11 @@
 }
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param [in] os The reference to the output stream.
- * \param [in] obj The PairObject.
- * \returns The reference to the output stream.
+ * @param [in] os The reference to the output stream.
+ * @param [in] obj The PairObject.
+ * @returns The reference to the output stream.
  */
 std::ostream&
 operator<<(std::ostream& os, const PairObject& obj)
@@ -108,7 +108,7 @@
 }
 
 /**
- * \ingroup pair-tests
+ * @ingroup pair-tests
  *
  * Pair test - Test instantiation, initialization, access.
  */
@@ -153,7 +153,7 @@
 }
 
 /**
- * \ingroup pair-tests
+ * @ingroup pair-tests
  *
  * Pair test - test setting through attribute interface.
  */
@@ -189,9 +189,9 @@
 }
 
 /**
- * \ingroup pair-tests
+ * @ingroup pair-tests
  *
- * \brief The pair-value Test Suite.
+ * @brief The pair-value Test Suite.
  */
 class PairValueTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/test/ptr-test-suite.cc ns-3.44/src/core/test/ptr-test-suite.cc
--- ns-3.43/src/core/test/ptr-test-suite.cc	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/core/test/ptr-test-suite.cc	2025-03-09 16:55:49.367371000 -0700
@@ -10,16 +10,16 @@
 #include "ns3/test.h"
 
 /**
- * \file
- * \ingroup core-tests
- * \ingroup ptr
- * \ingroup ptr-tests
+ * @file
+ * @ingroup core-tests
+ * @ingroup ptr
+ * @ingroup ptr-tests
  * Smart pointer test suite.
  */
 
 /**
- * \ingroup core-tests
- * \defgroup ptr-tests Smart pointer test suite
+ * @ingroup core-tests
+ * @defgroup ptr-tests Smart pointer test suite
  */
 
 namespace ns3
@@ -31,7 +31,7 @@
 class PtrTestCase;
 
 /**
- * \ingroup ptr-tests
+ * @ingroup ptr-tests
  * Pointer base test class
  */
 class PtrTestBase
@@ -51,7 +51,7 @@
 };
 
 /**
- * \ingroup ptr-tests
+ * @ingroup ptr-tests
  * No Count class
  */
 class NoCount : public PtrTestBase
@@ -60,7 +60,7 @@
     /**
      * Constructor
      *
-     * \param [in] test The object to track.
+     * @param [in] test The object to track.
      */
     NoCount(PtrTestCase* test);
     /**
@@ -77,7 +77,7 @@
 };
 
 /**
- * \ingroup ptr-tests
+ * @ingroup ptr-tests
  * Test case for pointer
  */
 class PtrTestCase : public TestCase
@@ -92,11 +92,11 @@
     void DoRun() override;
     /**
      * Test that \pname{p} is a valid object, by calling a member function.
-     * \param [in] p The object pointer to test.
-     * \returns The object pointer.
+     * @param [in] p The object pointer to test.
+     * @returns The object pointer.
      */
     Ptr<NoCount> CallTest(Ptr<NoCount> p);
-    /** \copydoc CallTest(Ptr<NoCount>) */
+    /** @copydoc CallTest(Ptr<NoCount>) */
     const Ptr<NoCount> CallTestConst(const Ptr<NoCount> p);
     uint32_t m_nDestroyed; //!< Counter of number of objects destroyed.
 };
@@ -327,7 +327,7 @@
 }
 
 /**
- * \ingroup ptr-tests
+ * @ingroup ptr-tests
  * Test suite for pointer
  */
 class PtrTestSuite : public TestSuite
@@ -342,7 +342,7 @@
 };
 
 /**
- * \ingroup ptr-tests
+ * @ingroup ptr-tests
  * PtrTestSuite instance variable.
  */
 static PtrTestSuite g_ptrTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/test/random-variable-stream-test-suite.cc ns-3.44/src/core/test/random-variable-stream-test-suite.cc
--- ns-3.43/src/core/test/random-variable-stream-test-suite.cc	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/core/test/random-variable-stream-test-suite.cc	2025-03-09 16:55:49.367371000 -0700
@@ -42,13 +42,13 @@
 {
 
 /**
- * \file
- * \ingroup rng-tests
+ * @file
+ * @ingroup rng-tests
  * Random number generator streams tests.
  */
 
 /**
- * \ingroup rng-tests
+ * @ingroup rng-tests
  * Base class for RandomVariableStream test suites.
  */
 class TestCaseBase : public TestCase
@@ -63,7 +63,7 @@
 
     /**
      * Constructor
-     * \param [in] name The test case name.
+     * @param [in] name The test case name.
      */
     TestCaseBase(std::string name)
         : TestCase(name)
@@ -73,12 +73,12 @@
     /**
      * Configure a GSL histogram with uniform bins, with optional
      * under/over-flow bins.
-     * \param [in,out] h The GSL histogram to configure.
-     * \param [in] start The minimum value of the lowest bin.
-     * \param [in] end The maximum value of the last bin.
-     * \param [in] underflow If \c true the lowest bin should contain the underflow,
-     * \param [in] overflow If \c true the highest bin should contain the overflow.
-     * \returns A vector of the bin edges, including the top of the highest bin.
+     * @param [in,out] h The GSL histogram to configure.
+     * @param [in] start The minimum value of the lowest bin.
+     * @param [in] end The maximum value of the last bin.
+     * @param [in] underflow If \c true the lowest bin should contain the underflow,
+     * @param [in] overflow If \c true the highest bin should contain the overflow.
+     * @returns A vector of the bin edges, including the top of the highest bin.
      * This vector has one more entry than the number of bins in the histogram.
      */
     std::vector<double> UniformHistogramBins(gsl_histogram* h,
@@ -114,8 +114,8 @@
 
     /**
      * Compute the average of a random variable.
-     * \param [in] rng The random variable to sample.
-     * \returns The average of \c N_MEASUREMENTS samples.
+     * @param [in] rng The random variable to sample.
+     * @returns The average of \c N_MEASUREMENTS samples.
      */
     double Average(Ptr<RandomVariableStream> rng) const
     {
@@ -132,9 +132,9 @@
 
     /**
      * Compute the variance of a random variable.
-     * \param [in] rng The random variable to sample.
-     * \param [in] average The previously calculated average value.
-     * \returns The variance of \c N_MEASUREMENTS samples.
+     * @param [in] rng The random variable to sample.
+     * @param [in] average The previously calculated average value.
+     * @returns The variance of \c N_MEASUREMENTS samples.
      */
     double Variance(Ptr<RandomVariableStream> rng, double average) const
     {
@@ -155,7 +155,7 @@
       public:
         /**
          * Create a new instance of a random variable stream
-         * \returns The new random variable stream instance.
+         * @returns The new random variable stream instance.
          */
         virtual Ptr<RandomVariableStream> Create() const = 0;
     };
@@ -163,7 +163,7 @@
     /**
      * Factory class to create new instances of a particular random variable stream.
      *
-     * \tparam RNG The type of random variable generator to create.
+     * @tparam RNG The type of random variable generator to create.
      */
     template <typename RNG>
     class RngGenerator : public RngGeneratorBase
@@ -171,7 +171,7 @@
       public:
         /**
          * Constructor.
-         * \param [in] anti Create antithetic streams if \c true.
+         * @param [in] anti Create antithetic streams if \c true.
          */
         RngGenerator(bool anti = false)
             : m_anti(anti)
@@ -201,10 +201,10 @@
      * The random variable is sampled \c N_MEASUREMENTS times, filling
      * a histogram. The chi square value is formed by comparing to the
      * expected distribution.
-     * \param [in,out] h The histogram, which defines the binning for sampling.
-     * \param [in] expected The expected distribution.
-     * \param [in] rng The random variable to sample.
-     * \returns The chi square value.
+     * @param [in,out] h The histogram, which defines the binning for sampling.
+     * @param [in] expected The expected distribution.
+     * @param [in] rng The random variable to sample.
+     * @returns The chi square value.
      */
     double ChiSquared(gsl_histogram* h,
                       const std::vector<double>& expected,
@@ -263,8 +263,8 @@
      *      return chiSquared;
      *    }
      *
-     * \param [in] rng The random number generator to test.
-     * \returns The chi squared value.
+     * @param [in] rng The random number generator to test.
+     * @returns The chi squared value.
      */
     virtual double ChiSquaredTest(Ptr<RandomVariableStream> rng) const
     {
@@ -274,10 +274,10 @@
     /**
      * Average the chi squared value over some number of runs,
      * each run with a new instance of the random number generator.
-     * \param [in] generator The factory to create instances of the
+     * @param [in] generator The factory to create instances of the
      *             random number generator.
-     * \param [in] nRuns The number of runs to average over.
-     * \returns The average chi square over the number of runs.
+     * @param [in] nRuns The number of runs to average over.
+     * @returns The average chi square over the number of runs.
      */
     double ChiSquaredsAverage(const RngGeneratorBase* generator, std::size_t nRuns) const
     {
@@ -355,7 +355,7 @@
 }; // class TestCaseBase
 
 /**
- * \ingroup rng-tests
+ * @ingroup rng-tests
  * Test case for uniform distribution random variable stream generator.
  */
 class UniformTestCase : public TestCaseBase
@@ -477,7 +477,7 @@
 }
 
 /**
- * \ingroup rng-tests
+ * @ingroup rng-tests
  * Test case for antithetic uniform distribution random variable stream generator
  */
 class UniformAntitheticTestCase : public TestCaseBase
@@ -552,7 +552,7 @@
 }
 
 /**
- * \ingroup rng-tests
+ * @ingroup rng-tests
  * Test case for constant random variable stream generator
  */
 class ConstantTestCase : public TestCaseBase
@@ -603,7 +603,7 @@
 }
 
 /**
- * \ingroup rng-tests
+ * @ingroup rng-tests
  * Test case for sequential random variable stream generator
  */
 class SequentialTestCase : public TestCaseBase
@@ -660,7 +660,7 @@
 }
 
 /**
- * \ingroup rng-tests
+ * @ingroup rng-tests
  * Test case for normal distribution random variable stream generator
  */
 class NormalTestCase : public TestCaseBase
@@ -746,7 +746,7 @@
 }
 
 /**
- * \ingroup rng-tests
+ * @ingroup rng-tests
  * Test case for antithetic normal distribution random variable stream generator
  */
 class NormalAntitheticTestCase : public TestCaseBase
@@ -834,7 +834,7 @@
 }
 
 /**
- * \ingroup rng-tests
+ * @ingroup rng-tests
  * Test case for exponential distribution random variable stream generator
  */
 class ExponentialTestCase : public TestCaseBase
@@ -915,7 +915,7 @@
 }
 
 /**
- * \ingroup rng-tests
+ * @ingroup rng-tests
  * Test case for antithetic exponential distribution random variable stream generator
  */
 class ExponentialAntitheticTestCase : public TestCaseBase
@@ -999,7 +999,7 @@
 }
 
 /**
- * \ingroup rng-tests
+ * @ingroup rng-tests
  * Test case for Pareto distribution random variable stream generator
  */
 class ParetoTestCase : public TestCaseBase
@@ -1092,7 +1092,7 @@
 }
 
 /**
- * \ingroup rng-tests
+ * @ingroup rng-tests
  * Test case for antithetic Pareto distribution random variable stream generator
  */
 class ParetoAntitheticTestCase : public TestCaseBase
@@ -1189,7 +1189,7 @@
 }
 
 /**
- * \ingroup rng-tests
+ * @ingroup rng-tests
  * Test case for Weibull distribution random variable stream generator
  */
 class WeibullTestCase : public TestCaseBase
@@ -1302,7 +1302,7 @@
 }
 
 /**
- * \ingroup rng-tests
+ * @ingroup rng-tests
  * Test case for antithetic Weibull distribution random variable stream generator
  */
 class WeibullAntitheticTestCase : public TestCaseBase
@@ -1413,7 +1413,7 @@
 }
 
 /**
- * \ingroup rng-tests
+ * @ingroup rng-tests
  * Test case for log-normal distribution random variable stream generator
  */
 class LogNormalTestCase : public TestCaseBase
@@ -1503,7 +1503,7 @@
     // Test that values have approximately the right mean value.
     //
     /**
-     * \todo This test fails sometimes if the required tolerance is less
+     * @todo This test fails sometimes if the required tolerance is less
      * than 3%, which may be because there is a bug in the
      * implementation or that the mean of this distribution is more
      * sensitive to its parameters than the others are.
@@ -1515,7 +1515,7 @@
 }
 
 /**
- * \ingroup rng-tests
+ * @ingroup rng-tests
  * Test case for antithetic log-normal distribution random variable stream generator
  */
 class LogNormalAntitheticTestCase : public TestCaseBase
@@ -1607,7 +1607,7 @@
     // Test that values have approximately the right mean value.
     //
     /**
-     * \todo This test fails sometimes if the required tolerance is less
+     * @todo This test fails sometimes if the required tolerance is less
      * than 3%, which may be because there is a bug in the
      * implementation or that the mean of this distribution is more
      * sensitive to its parameters than the others are.
@@ -1619,7 +1619,7 @@
 }
 
 /**
- * \ingroup rng-tests
+ * @ingroup rng-tests
  * Test case for gamma distribution random variable stream generator
  */
 class GammaTestCase : public TestCaseBase
@@ -1711,7 +1711,7 @@
 }
 
 /**
- * \ingroup rng-tests
+ * @ingroup rng-tests
  * Test case for antithetic gamma distribution random variable stream generator
  */
 class GammaAntitheticTestCase : public TestCaseBase
@@ -1807,7 +1807,7 @@
 }
 
 /**
- * \ingroup rng-tests
+ * @ingroup rng-tests
  * Test case for Erlang distribution random variable stream generator
  */
 class ErlangTestCase : public TestCaseBase
@@ -1902,7 +1902,7 @@
 }
 
 /**
- * \ingroup rng-tests
+ * @ingroup rng-tests
  * Test case for antithetic Erlang distribution random variable stream generator
  */
 class ErlangAntitheticTestCase : public TestCaseBase
@@ -2001,7 +2001,7 @@
 }
 
 /**
- * \ingroup rng-tests
+ * @ingroup rng-tests
  * Test case for Zipf distribution random variable stream generator
  */
 class ZipfTestCase : public TestCaseBase
@@ -2081,7 +2081,7 @@
 }
 
 /**
- * \ingroup rng-tests
+ * @ingroup rng-tests
  * Test case for antithetic Zipf distribution random variable stream generator
  */
 class ZipfAntitheticTestCase : public TestCaseBase
@@ -2164,7 +2164,7 @@
 }
 
 /**
- * \ingroup rng-tests
+ * @ingroup rng-tests
  * Test case for Zeta distribution random variable stream generator
  */
 class ZetaTestCase : public TestCaseBase
@@ -2227,7 +2227,7 @@
 }
 
 /**
- * \ingroup rng-tests
+ * @ingroup rng-tests
  * Test case for antithetic Zeta distribution random variable stream generator
  */
 class ZetaAntitheticTestCase : public TestCaseBase
@@ -2293,7 +2293,7 @@
 }
 
 /**
- * \ingroup rng-tests
+ * @ingroup rng-tests
  * Test case for deterministic random variable stream generator
  */
 class DeterministicTestCase : public TestCaseBase
@@ -2368,7 +2368,7 @@
 }
 
 /**
- * \ingroup rng-tests
+ * @ingroup rng-tests
  * Test case for empirical distribution random variable stream generator
  */
 class EmpiricalTestCase : public TestCaseBase
@@ -2468,7 +2468,7 @@
 }
 
 /**
- * \ingroup rng-tests
+ * @ingroup rng-tests
  * Test case for antithetic empirical distribution random variable stream generator
  */
 class EmpiricalAntitheticTestCase : public TestCaseBase
@@ -2547,7 +2547,7 @@
 }
 
 /**
- * \ingroup rng-tests
+ * @ingroup rng-tests
  * Test case for caching of Normal RV parameters (see issue #302)
  */
 class NormalCachingTestCase : public TestCaseBase
@@ -2581,7 +2581,7 @@
 }
 
 /**
- * \ingroup rng-tests
+ * @ingroup rng-tests
  * Test case for bernoulli distribution random variable stream generator
  */
 class BernoulliTestCase : public TestCaseBase
@@ -2652,7 +2652,7 @@
 }
 
 /**
- * \ingroup rng-tests
+ * @ingroup rng-tests
  * Test case for antithetic bernoulli distribution random variable stream generator
  */
 class BernoulliAntitheticTestCase : public TestCaseBase
@@ -2726,7 +2726,7 @@
 }
 
 /**
- * \ingroup rng-tests
+ * @ingroup rng-tests
  * Test case for binomial distribution random variable stream generator
  */
 class BinomialTestCase : public TestCaseBase
@@ -2805,7 +2805,7 @@
 }
 
 /**
- * \ingroup rng-tests
+ * @ingroup rng-tests
  * Test case for antithetic binomial distribution random variable stream generator
  */
 class BinomialAntitheticTestCase : public TestCaseBase
@@ -2887,10 +2887,10 @@
 }
 
 /**
- * \ingroup rng-test
- * \ingroup tests
+ * @ingroup rng-test
+ * @ingroup tests
  *
- * \brief Test the Shuffle function
+ * @brief Test the Shuffle function
  *
  * Check that the Shuffle function actually shuffles the elements and does so in a portable way.
  */
@@ -2952,7 +2952,7 @@
 }
 
 /**
- * \ingroup rng-tests
+ * @ingroup rng-tests
  * Test case for laplacian distribution random variable stream generator
  */
 class LaplacianTestCase : public TestCaseBase
@@ -3032,7 +3032,7 @@
 }
 
 /**
- * \ingroup rng-tests
+ * @ingroup rng-tests
  * Test case for largest extreme value distribution random variable stream generator
  */
 class LargestExtremeValueTestCase : public TestCaseBase
@@ -3088,7 +3088,7 @@
 }
 
 /**
- * \ingroup rng-tests
+ * @ingroup rng-tests
  * RandomVariableStream test suite, covering all random number variable
  * stream generator types.
  */
@@ -3115,14 +3115,14 @@
     AddTestCase(new WeibullTestCase);
     AddTestCase(new WeibullAntitheticTestCase);
     AddTestCase(new LogNormalTestCase);
-    /// \todo This test is currently disabled because it fails sometimes.
+    /// @todo This test is currently disabled because it fails sometimes.
     /// A possible reason for the failure is that the antithetic code is
     /// not implemented properly for this log-normal case.
     /*
     AddTestCase (new LogNormalAntitheticTestCase);
     */
     AddTestCase(new GammaTestCase);
-    /// \todo This test is currently disabled because it fails sometimes.
+    /// @todo This test is currently disabled because it fails sometimes.
     /// A possible reason for the failure is that the antithetic code is
     /// not implemented properly for this gamma case.
     /*
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/test/rng-test-suite.cc ns-3.44/src/core/test/rng-test-suite.cc
--- ns-3.43/src/core/test/rng-test-suite.cc	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/core/test/rng-test-suite.cc	2025-03-09 16:55:49.367371000 -0700
@@ -16,24 +16,24 @@
 using namespace ns3;
 
 /**
- * \file
- * \ingroup rng-tests
+ * @file
+ * @ingroup rng-tests
  * Random number generators tests.
  */
 
 /**
- * \ingroup core-tests
- * \defgroup rng-tests Random number generators tests
+ * @ingroup core-tests
+ * @defgroup rng-tests Random number generators tests
  */
 
 /**
- * \ingroup rng-tests
+ * @ingroup rng-tests
  *
  * Fill an array with increasing values, in the [start, end] range.
- * \param array The array to fill.
- * \param n The size of the array.
- * \param start The start value.
- * \param end The end value.
+ * @param array The array to fill.
+ * @param n The size of the array.
+ * @param start The start value.
+ * @param end The end value.
  */
 void
 FillHistoRangeUniformly(double* array, uint32_t n, double start, double end)
@@ -49,7 +49,7 @@
 }
 
 /**
- * \ingroup core-tests
+ * @ingroup core-tests
  *
  * Test case for uniform distribution random number generator.
  */
@@ -68,8 +68,8 @@
 
     /**
      * Run a chi-squared test on the results of the random number generator.
-     * \param u The random number generator.
-     * \return the chi-squared test result.
+     * @param u The random number generator.
+     * @return the chi-squared test result.
      */
     double ChiSquaredTest(Ptr<UniformRandomVariable> u);
 
@@ -142,7 +142,7 @@
 }
 
 /**
- * \ingroup rng-tests
+ * @ingroup rng-tests
  *
  * Test case for normal distribution random number generator.
  */
@@ -161,8 +161,8 @@
 
     /**
      * Run a chi-squared test on the results of the random number generator.
-     * \param n The random number generator.
-     * \return the chi-squared test result.
+     * @param n The random number generator.
+     * @return the chi-squared test result.
      */
     double ChiSquaredTest(Ptr<NormalRandomVariable> n);
 
@@ -249,7 +249,7 @@
 }
 
 /**
- * \ingroup rng-tests
+ * @ingroup rng-tests
  *
  * Test case for exponential distribution random number generator.
  */
@@ -268,8 +268,8 @@
 
     /**
      * Run a chi-squared test on the results of the random number generator.
-     * \param n The random number generator.
-     * \return the chi-squared test result.
+     * @param n The random number generator.
+     * @return the chi-squared test result.
      */
     double ChiSquaredTest(Ptr<ExponentialRandomVariable> n);
 
@@ -355,7 +355,7 @@
 }
 
 /**
- * \ingroup rng-tests
+ * @ingroup rng-tests
  *
  * Test case for pareto distribution random number generator.
  */
@@ -374,8 +374,8 @@
 
     /**
      * Run a chi-squared test on the results of the random number generator.
-     * \param p The random number generator.
-     * \return the chi-squared test result.
+     * @param p The random number generator.
+     * @return the chi-squared test result.
      */
     double ChiSquaredTest(Ptr<ParetoRandomVariable> p);
 
@@ -466,9 +466,9 @@
 }
 
 /**
- * \ingroup rng-tests
+ * @ingroup rng-tests
  *
- * \brief The random number generators Test Suite.
+ * @brief The random number generators Test Suite.
  */
 class RngTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/test/sample-test-suite.cc ns-3.44/src/core/test/sample-test-suite.cc
--- ns-3.43/src/core/test/sample-test-suite.cc	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/core/test/sample-test-suite.cc	2025-03-09 16:55:49.367371000 -0700
@@ -9,10 +9,10 @@
 #include "ns3/test.h"
 
 /**
- * \file
- * \ingroup core-tests
- * \ingroup testing
- * \ingroup testing-example
+ * @file
+ * @ingroup core-tests
+ * @ingroup testing
+ * @ingroup testing-example
  *
  * Example use of TestSuite.
  *
@@ -25,40 +25,40 @@
  *
  * Add it to the groups module-tests and class-tests:
  *
- * \verbatim /// \file
-/// \ingroup module-tests
-/// \ingroup class-tests
+ * @verbatim /// \file
+/// @ingroup module-tests
+/// @ingroup class-tests
 /// Class test suite. \endverbatim
  *
  * Define the class-tests group:
- * \verbatim /// \ingroup module-tests
-/// \defgroup class-tests Class test suite \endverbatim
+ * @verbatim /// \ingroup module-tests
+/// @defgroup class-tests Class test suite \endverbatim
  *
  * Make sure test.h is included:
- * \verbatim #include "ns3/test.h" \endverbatim
+ * @verbatim #include "ns3/test.h" \endverbatim
  *
  * Put the test code in namespace ns3::tests.
- * \verbatim namespace ns3 {
+ * @verbatim namespace ns3 {
   namespace tests { \endverbatim
  *
  * Write your test cases and final test suite, and put them in
  * your test group:
- * \verbatim /// \ingroup class-tests
+ * @verbatim /// \ingroup class-tests
 class ClassTestSuite : public TestSuite {...}; \endverbatim
  *
  * Create a static variable to hold the instance of your test suite:
- * \verbatim /// \ingroup class-tests
+ * @verbatim /// \ingroup class-tests
 /// ClassTestSuite instance variable.
 static ClassTestSuite g_classTestSuite; \endverbatim
  *
  * Finally, close the ingroup and namespace blocks:
- * \verbatim   }  // namespace tests
+ * @verbatim   }  // namespace tests
 }  // namespace ns3 \endverbatim
 */
 
 /**
- * \ingroup core-tests
- * \defgroup testing-example Example use of TestSuite
+ * @ingroup core-tests
+ * @defgroup testing-example Example use of TestSuite
  */
 
 namespace ns3
@@ -68,7 +68,7 @@
 {
 
 /**
- * \ingroup testing-example
+ * @ingroup testing-example
  * This is an example TestCase.
  */
 class SampleTestCase1 : public TestCase
@@ -111,7 +111,7 @@
 }
 
 /**
- * \ingroup testing-example
+ * @ingroup testing-example
  * The TestSuite class names the TestSuite, identifies what type of TestSuite,
  * and enables the TestCases to be run.  Typically, only the constructor for
  * this class must be defined
@@ -131,7 +131,7 @@
 
 // Do not forget to allocate an instance of this TestSuite
 /**
- * \ingroup testing-example
+ * @ingroup testing-example
  * SampleTestSuite instance variable.
  */
 static SampleTestSuite g_sampleTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/test/simulator-test-suite.cc ns-3.44/src/core/test/simulator-test-suite.cc
--- ns-3.43/src/core/test/simulator-test-suite.cc	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/core/test/simulator-test-suite.cc	2025-03-09 16:55:49.367371000 -0700
@@ -16,33 +16,33 @@
 using namespace ns3;
 
 /**
- * \file
- * \ingroup simulator-tests
+ * @file
+ * @ingroup simulator-tests
  * Simulator class test suite
  */
 
 /**
- * \ingroup core-tests
- * \defgroup simulator-tests Simulator class tests
+ * @ingroup core-tests
+ * @defgroup simulator-tests Simulator class tests
  */
 
 /**
- * \ingroup simulator-tests
+ * @ingroup simulator-tests
  *
- * \brief Check that basic event handling is working with different Simulator implementations.
+ * @brief Check that basic event handling is working with different Simulator implementations.
  */
 class SimulatorEventsTestCase : public TestCase
 {
   public:
     /**
      * Constructor.
-     * \param schedulerFactory Scheduler factory.
+     * @param schedulerFactory Scheduler factory.
      */
     SimulatorEventsTestCase(ObjectFactory schedulerFactory);
     void DoRun() override;
     /**
      * Test Event.
-     * \param value Event parameter.
+     * @param value Event parameter.
      * @{
      */
     void EventA(int value);
@@ -58,7 +58,7 @@
 
     /**
      * Get the simulator time.
-     * \return The actual time [ms].
+     * @return The actual time [ms].
      */
     uint64_t NowUs();
     /**
@@ -201,9 +201,9 @@
 }
 
 /**
- * \ingroup simulator-tests
+ * @ingroup simulator-tests
  *
- * \brief Check that all templates are instantiated correctly.
+ * @brief Check that all templates are instantiated correctly.
  *
  * This is a compilation test, it cannot fail at runtime.
  */
@@ -211,13 +211,20 @@
 {
   public:
     SimulatorTemplateTestCase();
+
     /**
      * Ref and Unref - only here for testing of Ptr<>
      *
      * @{
      */
-    void Ref() const {};
-    void Unref() const {};
+    void Ref() const
+    {
+    }
+
+    void Unref() const
+    {
+    }
+
     /** @} */
 
   private:
@@ -361,17 +368,17 @@
 SimulatorTemplateTestCase::DoRun()
 {
     // Test schedule of const methods
-    Simulator::Schedule(Seconds(0.0), &SimulatorTemplateTestCase::bar0c, this);
-    Simulator::Schedule(Seconds(0.0), &SimulatorTemplateTestCase::bar1c, this, 0);
-    Simulator::Schedule(Seconds(0.0), &SimulatorTemplateTestCase::bar2c, this, 0, 0);
-    Simulator::Schedule(Seconds(0.0), &SimulatorTemplateTestCase::bar3c, this, 0, 0, 0);
-    Simulator::Schedule(Seconds(0.0), &SimulatorTemplateTestCase::bar4c, this, 0, 0, 0, 0);
-    Simulator::Schedule(Seconds(0.0), &SimulatorTemplateTestCase::bar5c, this, 0, 0, 0, 0, 0);
-    Simulator::Schedule(Seconds(0.0), &SimulatorTemplateTestCase::cbaz1c, this, 0);
-    Simulator::Schedule(Seconds(0.0), &SimulatorTemplateTestCase::cbaz2c, this, 0, 0);
-    Simulator::Schedule(Seconds(0.0), &SimulatorTemplateTestCase::cbaz3c, this, 0, 0, 0);
-    Simulator::Schedule(Seconds(0.0), &SimulatorTemplateTestCase::cbaz4c, this, 0, 0, 0, 0);
-    Simulator::Schedule(Seconds(0.0), &SimulatorTemplateTestCase::cbaz5c, this, 0, 0, 0, 0, 0);
+    Simulator::Schedule(Seconds(0), &SimulatorTemplateTestCase::bar0c, this);
+    Simulator::Schedule(Seconds(0), &SimulatorTemplateTestCase::bar1c, this, 0);
+    Simulator::Schedule(Seconds(0), &SimulatorTemplateTestCase::bar2c, this, 0, 0);
+    Simulator::Schedule(Seconds(0), &SimulatorTemplateTestCase::bar3c, this, 0, 0, 0);
+    Simulator::Schedule(Seconds(0), &SimulatorTemplateTestCase::bar4c, this, 0, 0, 0, 0);
+    Simulator::Schedule(Seconds(0), &SimulatorTemplateTestCase::bar5c, this, 0, 0, 0, 0, 0);
+    Simulator::Schedule(Seconds(0), &SimulatorTemplateTestCase::cbaz1c, this, 0);
+    Simulator::Schedule(Seconds(0), &SimulatorTemplateTestCase::cbaz2c, this, 0, 0);
+    Simulator::Schedule(Seconds(0), &SimulatorTemplateTestCase::cbaz3c, this, 0, 0, 0);
+    Simulator::Schedule(Seconds(0), &SimulatorTemplateTestCase::cbaz4c, this, 0, 0, 0, 0);
+    Simulator::Schedule(Seconds(0), &SimulatorTemplateTestCase::cbaz5c, this, 0, 0, 0, 0, 0);
     Simulator::ScheduleNow(&SimulatorTemplateTestCase::bar0c, this);
     Simulator::ScheduleNow(&SimulatorTemplateTestCase::bar1c, this, 0);
     Simulator::ScheduleNow(&SimulatorTemplateTestCase::bar2c, this, 0, 0);
@@ -394,11 +401,11 @@
     Simulator::ScheduleDestroy(&SimulatorTemplateTestCase::cbaz3c, this, 0, 0, 0);
     Simulator::ScheduleDestroy(&SimulatorTemplateTestCase::cbaz4c, this, 0, 0, 0, 0);
     Simulator::ScheduleDestroy(&SimulatorTemplateTestCase::cbaz5c, this, 0, 0, 0, 0, 0);
-    Simulator::Schedule(Seconds(0.0), &SimulatorTemplateTestCase::baz1c, this, 0);
-    Simulator::Schedule(Seconds(0.0), &SimulatorTemplateTestCase::baz2c, this, 0, 0);
-    Simulator::Schedule(Seconds(0.0), &SimulatorTemplateTestCase::baz3c, this, 0, 0, 0);
-    Simulator::Schedule(Seconds(0.0), &SimulatorTemplateTestCase::baz4c, this, 0, 0, 0, 0);
-    Simulator::Schedule(Seconds(0.0), &SimulatorTemplateTestCase::baz5c, this, 0, 0, 0, 0, 0);
+    Simulator::Schedule(Seconds(0), &SimulatorTemplateTestCase::baz1c, this, 0);
+    Simulator::Schedule(Seconds(0), &SimulatorTemplateTestCase::baz2c, this, 0, 0);
+    Simulator::Schedule(Seconds(0), &SimulatorTemplateTestCase::baz3c, this, 0, 0, 0);
+    Simulator::Schedule(Seconds(0), &SimulatorTemplateTestCase::baz4c, this, 0, 0, 0, 0);
+    Simulator::Schedule(Seconds(0), &SimulatorTemplateTestCase::baz5c, this, 0, 0, 0, 0, 0);
     Simulator::ScheduleNow(&SimulatorTemplateTestCase::baz1c, this, 0);
     Simulator::ScheduleNow(&SimulatorTemplateTestCase::baz2c, this, 0, 0);
     Simulator::ScheduleNow(&SimulatorTemplateTestCase::baz3c, this, 0, 0, 0);
@@ -411,32 +418,32 @@
     Simulator::ScheduleDestroy(&SimulatorTemplateTestCase::baz5c, this, 0, 0, 0, 0, 0);
 
     // Test of schedule const methods with Ptr<> pointers
-    Simulator::Schedule(Seconds(0.0),
+    Simulator::Schedule(Seconds(0),
                         &SimulatorTemplateTestCase::bar0c,
                         Ptr<const SimulatorTemplateTestCase>(this));
-    Simulator::Schedule(Seconds(0.0),
+    Simulator::Schedule(Seconds(0),
                         &SimulatorTemplateTestCase::bar1c,
                         Ptr<const SimulatorTemplateTestCase>(this),
                         0);
-    Simulator::Schedule(Seconds(0.0),
+    Simulator::Schedule(Seconds(0),
                         &SimulatorTemplateTestCase::bar2c,
                         Ptr<const SimulatorTemplateTestCase>(this),
                         0,
                         0);
-    Simulator::Schedule(Seconds(0.0),
+    Simulator::Schedule(Seconds(0),
                         &SimulatorTemplateTestCase::bar3c,
                         Ptr<const SimulatorTemplateTestCase>(this),
                         0,
                         0,
                         0);
-    Simulator::Schedule(Seconds(0.0),
+    Simulator::Schedule(Seconds(0),
                         &SimulatorTemplateTestCase::bar4c,
                         Ptr<const SimulatorTemplateTestCase>(this),
                         0,
                         0,
                         0,
                         0);
-    Simulator::Schedule(Seconds(0.0),
+    Simulator::Schedule(Seconds(0),
                         &SimulatorTemplateTestCase::bar5c,
                         Ptr<const SimulatorTemplateTestCase>(this),
                         0,
@@ -500,17 +507,17 @@
                                0);
 
     // Test schedule of raw functions
-    Simulator::Schedule(Seconds(0.0), &foo0);
-    Simulator::Schedule(Seconds(0.0), &foo1, 0);
-    Simulator::Schedule(Seconds(0.0), &foo2, 0, 0);
-    Simulator::Schedule(Seconds(0.0), &foo3, 0, 0, 0);
-    Simulator::Schedule(Seconds(0.0), &foo4, 0, 0, 0, 0);
-    Simulator::Schedule(Seconds(0.0), &foo5, 0, 0, 0, 0, 0);
-    Simulator::Schedule(Seconds(0.0), &cber1, 0);
-    Simulator::Schedule(Seconds(0.0), &cber2, 0, 0);
-    Simulator::Schedule(Seconds(0.0), &cber3, 0, 0, 0);
-    Simulator::Schedule(Seconds(0.0), &cber4, 0, 0, 0, 0);
-    Simulator::Schedule(Seconds(0.0), &cber5, 0, 0, 0, 0, 0);
+    Simulator::Schedule(Seconds(0), &foo0);
+    Simulator::Schedule(Seconds(0), &foo1, 0);
+    Simulator::Schedule(Seconds(0), &foo2, 0, 0);
+    Simulator::Schedule(Seconds(0), &foo3, 0, 0, 0);
+    Simulator::Schedule(Seconds(0), &foo4, 0, 0, 0, 0);
+    Simulator::Schedule(Seconds(0), &foo5, 0, 0, 0, 0, 0);
+    Simulator::Schedule(Seconds(0), &cber1, 0);
+    Simulator::Schedule(Seconds(0), &cber2, 0, 0);
+    Simulator::Schedule(Seconds(0), &cber3, 0, 0, 0);
+    Simulator::Schedule(Seconds(0), &cber4, 0, 0, 0, 0);
+    Simulator::Schedule(Seconds(0), &cber5, 0, 0, 0, 0, 0);
     Simulator::ScheduleNow(&foo0);
     Simulator::ScheduleNow(&foo1, 0);
     Simulator::ScheduleNow(&foo2, 0, 0);
@@ -535,17 +542,17 @@
     Simulator::ScheduleDestroy(&cber5, 0, 0, 0, 0, 0);
 
     // Test schedule of normal member methods
-    Simulator::Schedule(Seconds(0.0), &SimulatorTemplateTestCase::bar0, this);
-    Simulator::Schedule(Seconds(0.0), &SimulatorTemplateTestCase::bar1, this, 0);
-    Simulator::Schedule(Seconds(0.0), &SimulatorTemplateTestCase::bar2, this, 0, 0);
-    Simulator::Schedule(Seconds(0.0), &SimulatorTemplateTestCase::bar3, this, 0, 0, 0);
-    Simulator::Schedule(Seconds(0.0), &SimulatorTemplateTestCase::bar4, this, 0, 0, 0, 0);
-    Simulator::Schedule(Seconds(0.0), &SimulatorTemplateTestCase::bar5, this, 0, 0, 0, 0, 0);
-    Simulator::Schedule(Seconds(0.0), &SimulatorTemplateTestCase::cbaz1, this, 0);
-    Simulator::Schedule(Seconds(0.0), &SimulatorTemplateTestCase::cbaz2, this, 0, 0);
-    Simulator::Schedule(Seconds(0.0), &SimulatorTemplateTestCase::cbaz3, this, 0, 0, 0);
-    Simulator::Schedule(Seconds(0.0), &SimulatorTemplateTestCase::cbaz4, this, 0, 0, 0, 0);
-    Simulator::Schedule(Seconds(0.0), &SimulatorTemplateTestCase::cbaz5, this, 0, 0, 0, 0, 0);
+    Simulator::Schedule(Seconds(0), &SimulatorTemplateTestCase::bar0, this);
+    Simulator::Schedule(Seconds(0), &SimulatorTemplateTestCase::bar1, this, 0);
+    Simulator::Schedule(Seconds(0), &SimulatorTemplateTestCase::bar2, this, 0, 0);
+    Simulator::Schedule(Seconds(0), &SimulatorTemplateTestCase::bar3, this, 0, 0, 0);
+    Simulator::Schedule(Seconds(0), &SimulatorTemplateTestCase::bar4, this, 0, 0, 0, 0);
+    Simulator::Schedule(Seconds(0), &SimulatorTemplateTestCase::bar5, this, 0, 0, 0, 0, 0);
+    Simulator::Schedule(Seconds(0), &SimulatorTemplateTestCase::cbaz1, this, 0);
+    Simulator::Schedule(Seconds(0), &SimulatorTemplateTestCase::cbaz2, this, 0, 0);
+    Simulator::Schedule(Seconds(0), &SimulatorTemplateTestCase::cbaz3, this, 0, 0, 0);
+    Simulator::Schedule(Seconds(0), &SimulatorTemplateTestCase::cbaz4, this, 0, 0, 0, 0);
+    Simulator::Schedule(Seconds(0), &SimulatorTemplateTestCase::cbaz5, this, 0, 0, 0, 0, 0);
     Simulator::ScheduleNow(&SimulatorTemplateTestCase::bar0, this);
     Simulator::ScheduleNow(&SimulatorTemplateTestCase::bar1, this, 0);
     Simulator::ScheduleNow(&SimulatorTemplateTestCase::bar2, this, 0, 0);
@@ -570,32 +577,32 @@
     Simulator::ScheduleDestroy(&SimulatorTemplateTestCase::cbaz5, this, 0, 0, 0, 0, 0);
 
     // test schedule of normal methods with Ptr<> pointers
-    Simulator::Schedule(Seconds(0.0),
+    Simulator::Schedule(Seconds(0),
                         &SimulatorTemplateTestCase::bar0,
                         Ptr<SimulatorTemplateTestCase>(this));
-    Simulator::Schedule(Seconds(0.0),
+    Simulator::Schedule(Seconds(0),
                         &SimulatorTemplateTestCase::bar1,
                         Ptr<SimulatorTemplateTestCase>(this),
                         0);
-    Simulator::Schedule(Seconds(0.0),
+    Simulator::Schedule(Seconds(0),
                         &SimulatorTemplateTestCase::bar2,
                         Ptr<SimulatorTemplateTestCase>(this),
                         0,
                         0);
-    Simulator::Schedule(Seconds(0.0),
+    Simulator::Schedule(Seconds(0),
                         &SimulatorTemplateTestCase::bar3,
                         Ptr<SimulatorTemplateTestCase>(this),
                         0,
                         0,
                         0);
-    Simulator::Schedule(Seconds(0.0),
+    Simulator::Schedule(Seconds(0),
                         &SimulatorTemplateTestCase::bar4,
                         Ptr<SimulatorTemplateTestCase>(this),
                         0,
                         0,
                         0,
                         0);
-    Simulator::Schedule(Seconds(0.0),
+    Simulator::Schedule(Seconds(0),
                         &SimulatorTemplateTestCase::bar5,
                         Ptr<SimulatorTemplateTestCase>(this),
                         0,
@@ -661,16 +668,16 @@
     // Simulator::Schedule (Seconds (0.0), &cber1, 0.0);
 
     // This code appears to be duplicate test code.
-    Simulator::Schedule(Seconds(0.0), &ber1, 0);
-    Simulator::Schedule(Seconds(0.0), &ber2, 0, 0);
-    Simulator::Schedule(Seconds(0.0), &ber3, 0, 0, 0);
-    Simulator::Schedule(Seconds(0.0), &ber4, 0, 0, 0, 0);
-    Simulator::Schedule(Seconds(0.0), &ber5, 0, 0, 0, 0, 0);
-    Simulator::Schedule(Seconds(0.0), &SimulatorTemplateTestCase::baz1, this, 0);
-    Simulator::Schedule(Seconds(0.0), &SimulatorTemplateTestCase::baz2, this, 0, 0);
-    Simulator::Schedule(Seconds(0.0), &SimulatorTemplateTestCase::baz3, this, 0, 0, 0);
-    Simulator::Schedule(Seconds(0.0), &SimulatorTemplateTestCase::baz4, this, 0, 0, 0, 0);
-    Simulator::Schedule(Seconds(0.0), &SimulatorTemplateTestCase::baz5, this, 0, 0, 0, 0, 0);
+    Simulator::Schedule(Seconds(0), &ber1, 0);
+    Simulator::Schedule(Seconds(0), &ber2, 0, 0);
+    Simulator::Schedule(Seconds(0), &ber3, 0, 0, 0);
+    Simulator::Schedule(Seconds(0), &ber4, 0, 0, 0, 0);
+    Simulator::Schedule(Seconds(0), &ber5, 0, 0, 0, 0, 0);
+    Simulator::Schedule(Seconds(0), &SimulatorTemplateTestCase::baz1, this, 0);
+    Simulator::Schedule(Seconds(0), &SimulatorTemplateTestCase::baz2, this, 0, 0);
+    Simulator::Schedule(Seconds(0), &SimulatorTemplateTestCase::baz3, this, 0, 0, 0);
+    Simulator::Schedule(Seconds(0), &SimulatorTemplateTestCase::baz4, this, 0, 0, 0, 0);
+    Simulator::Schedule(Seconds(0), &SimulatorTemplateTestCase::baz5, this, 0, 0, 0, 0, 0);
     Simulator::ScheduleNow(&ber1, 0);
     Simulator::ScheduleNow(&ber2, 0, 0);
     Simulator::ScheduleNow(&ber3, 0, 0, 0);
@@ -697,9 +704,9 @@
 }
 
 /**
- * \ingroup simulator-tests
+ * @ingroup simulator-tests
  *
- * \brief The simulator Test Suite.
+ * @brief The simulator Test Suite.
  */
 class SimulatorTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/test/splitstring-test-suite.cc ns-3.44/src/core/test/splitstring-test-suite.cc
--- ns-3.43/src/core/test/splitstring-test-suite.cc	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/core/test/splitstring-test-suite.cc	2025-03-09 16:55:49.367371000 -0700
@@ -16,18 +16,18 @@
 {
 
 /**
- * \file
- * \ingroup core-tests
+ * @file
+ * @ingroup core-tests
  * SplitString test suite implementation.
  */
 
 /**
- * \ingroup core-tests
- * \defgroup environ-var-tests Environment variable caching tests
+ * @ingroup core-tests
+ * @defgroup environ-var-tests Environment variable caching tests
  */
 
 /**
- * \ingroup core-tests
+ * @ingroup core-tests
  *
  * SplitString tests.
  */
@@ -47,9 +47,9 @@
     /**
      * Read \p str and check that it contains only the key,value pairs
      * from \p expect.
-     * \param where The test condition being checked.
-     * \param str The environment variable to parse and check.
-     * \param expect The set of key,values expected.
+     * @param where The test condition being checked.
+     * @param str The environment variable to parse and check.
+     * @param expect The set of key,values expected.
      */
     void Check(const std::string& where, const std::string& str, const StringVector& expect);
 
@@ -120,7 +120,7 @@
 }
 
 /**
- * \ingroup typeid-tests
+ * @ingroup typeid-tests
  *
  * TypeId test suites.
  */
@@ -137,7 +137,7 @@
 }
 
 /**
- * \ingroup environ-var-tests
+ * @ingroup environ-var-tests
  * Static variable for test initialization.
  */
 static SplitStringTestSuite g_SplitStringTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/test/threaded-test-suite.cc ns-3.44/src/core/test/threaded-test-suite.cc
--- ns-3.43/src/core/test/threaded-test-suite.cc	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/core/test/threaded-test-suite.cc	2025-03-09 16:55:49.367371000 -0700
@@ -26,20 +26,20 @@
 constexpr int MAXTHREADS = 64;
 
 /**
- * \file
- * \ingroup threaded-tests
+ * @file
+ * @ingroup threaded-tests
  * Threaded events test suite
  */
 
 /**
- * \ingroup core-tests
- * \defgroup threaded-tests Threaded events tests
+ * @ingroup core-tests
+ * @defgroup threaded-tests Threaded events tests
  */
 
 /**
- * \ingroup threaded-tests
+ * @ingroup threaded-tests
  *
- * \brief Check threaded event handling with various thread number, schedulers, and  simulator
+ * @brief Check threaded event handling with various thread number, schedulers, and  simulator
  * types.
  */
 class ThreadedSimulatorEventsTestCase : public TestCase
@@ -48,41 +48,41 @@
     /**
      * Constructor.
      *
-     * \param schedulerFactory The scheduler factory.
-     * \param simulatorType The simulator type.
-     * \param threads The number of threads.
+     * @param schedulerFactory The scheduler factory.
+     * @param simulatorType The simulator type.
+     * @param threads The number of threads.
      */
     ThreadedSimulatorEventsTestCase(ObjectFactory schedulerFactory,
                                     const std::string& simulatorType,
                                     unsigned int threads);
     /**
      * Event A
-     * \param a The Event parameter.
+     * @param a The Event parameter.
      */
     void EventA(int a);
     /**
      * Event B
-     * \param b The Event parameter.
+     * @param b The Event parameter.
      */
     void EventB(int b);
     /**
      * Event C
-     * \param c The Event parameter.
+     * @param c The Event parameter.
      */
     void EventC(int c);
     /**
      * Event D
-     * \param d The Event parameter.
+     * @param d The Event parameter.
      */
     void EventD(int d);
     /**
      * No-op function, records the thread that called it.
-     * \param threadno The thread number.
+     * @param threadno The thread number.
      */
     void DoNothing(unsigned int threadno);
     /**
      * Schedule a thread.
-     * \param context The context.
+     * @param context The context.
      */
     static void SchedulingThread(std::pair<ThreadedSimulatorEventsTestCase*, unsigned int> context);
     /**
@@ -268,9 +268,9 @@
 }
 
 /**
- * \ingroup threaded-tests
+ * @ingroup threaded-tests
  *
- * \brief The threaded simulator Test Suite.
+ * @brief The threaded simulator Test Suite.
  */
 class ThreadedSimulatorTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/test/timer-test-suite.cc ns-3.44/src/core/test/timer-test-suite.cc
--- ns-3.43/src/core/test/timer-test-suite.cc	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/core/test/timer-test-suite.cc	2025-03-09 16:55:49.367371000 -0700
@@ -11,46 +11,42 @@
 #include "ns3/timer.h"
 
 /**
- * \file
- * \ingroup timer-tests
+ * @file
+ * @ingroup timer-tests
  * Timer test suite
  */
 
 /**
- * \ingroup core-tests
- * \defgroup timer-tests Timer tests
+ * @ingroup core-tests
+ * @defgroup timer-tests Timer tests
  */
 
 namespace
 {
 
-// clang-format off
-
 /// Function with one int parameter.
-void bari (int) {};
+void bari(int){};
 /// Function with two int parameters.
-void bar2i (int, int) {};
+void bar2i(int, int){};
 /// Function with three int parameters.
-void bar3i (int, int, int) {};
+void bar3i(int, int, int){};
 /// Function with four int parameters.
-void bar4i (int, int, int, int) {};
+void bar4i(int, int, int, int){};
 /// Function with five int parameters.
-void bar5i (int, int, int, int, int) {};
+void bar5i(int, int, int, int, int){};
 /// Function with one const int reference parameter.
-void barcir (const int &) {};
+void barcir(const int&){};
 /// Function with one int reference parameter.
-void barir (int &) {};
-
-// clang-format on
+void barir(int&){};
 
 } // anonymous namespace
 
 using namespace ns3;
 
 /**
- * \ingroup timer-tests
+ * @ingroup timer-tests
  *
- * \brief Check correct state transitions.
+ * @brief Check correct state transitions.
  */
 class TimerStateTestCase : public TestCase
 {
@@ -71,7 +67,7 @@
 
     timer.SetFunction(&bari);
     timer.SetArguments(1);
-    timer.SetDelay(Seconds(10.0));
+    timer.SetDelay(Seconds(10));
     NS_TEST_ASSERT_MSG_EQ(!timer.IsRunning(), true, "");
     NS_TEST_ASSERT_MSG_EQ(timer.IsExpired(), true, "");
     NS_TEST_ASSERT_MSG_EQ(!timer.IsSuspended(), true, "");
@@ -99,9 +95,9 @@
 }
 
 /**
- * \ingroup timer-tests
+ * @ingroup timer-tests
  *
- * \brief Check that Timer template magic is working.
+ * @brief Check that Timer template magic is working.
  */
 class TimerTemplateTestCase : public TestCase
 {
@@ -164,7 +160,7 @@
     // the following call cannot possibly work and is flagged by
     // a runtime error.
     // timer.SetArguments (0.0);
-    timer.SetDelay(Seconds(1.0));
+    timer.SetDelay(Seconds(1));
     timer.Schedule();
 
     timer.SetFunction(&TimerTemplateTestCase::bazi, this);
@@ -210,9 +206,9 @@
 }
 
 /**
- * \ingroup timer-tests
+ * @ingroup timer-tests
  *
- * \brief The timer Test Suite.
+ * @brief The timer Test Suite.
  */
 class TimerTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/test/time-test-suite.cc ns-3.44/src/core/test/time-test-suite.cc
--- ns-3.43/src/core/test/time-test-suite.cc	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/core/test/time-test-suite.cc	2025-03-09 16:55:49.367371000 -0700
@@ -22,47 +22,47 @@
 using namespace ns3;
 
 /**
- * \ingroup core-tests
- * \brief time simple test case, Checks the basic operations on time
+ * @ingroup core-tests
+ * @brief time simple test case, Checks the basic operations on time
  */
 class TimeSimpleTestCase : public TestCase
 {
   public:
     /**
-     * \brief constructor for TimeSimpleTestCase.
+     * @brief constructor for TimeSimpleTestCase.
      */
     TimeSimpleTestCase();
 
   private:
     /**
-     * \brief setup function for TimeSimpleTestCase.
+     * @brief setup function for TimeSimpleTestCase.
      */
     void DoSetup() override;
 
     /**
-     * \brief Runs the Simple Time test case.
+     * @brief Runs the Simple Time test case.
      */
     void DoRun() override;
 
     /**
-     * \brief Tests the Time Operations.
+     * @brief Tests the Time Operations.
      */
     virtual void DoTimeOperations();
 
     /**
-     * \brief Does the tear down for TimeSimpleTestCase.
+     * @brief Does the tear down for TimeSimpleTestCase.
      */
     void DoTeardown() override;
 
     /**
      * Helper function to handle boilerplate code for multiplication tests
      *
-     * \tparam T type of multiplication value
+     * @tparam T type of multiplication value
      *
-     * \param t Time value to multiply
-     * \param expected Expected result of the multiplication
-     * \param val Value to multiply by
-     * \param msg Error message to print if test fails
+     * @param t Time value to multiply
+     * @param expected Expected result of the multiplication
+     * @param val Value to multiply by
+     * @param msg Error message to print if test fails
      */
     template <typename T>
     void TestMultiplication(Time t, Time expected, T val, const std::string& msg);
@@ -80,12 +80,12 @@
     /**
      * Helper function to handle boilerplate code for division tests
      *
-     * \tparam T type of division value
+     * @tparam T type of division value
      *
-     * \param t Time value to divide
-     * \param expected Expected result of the division
-     * \param val Value to divide by
-     * \param msg Error message to print if test fails
+     * @param t Time value to divide
+     * @param expected Expected result of the division
+     * @param val Value to divide by
+     * @param msg Error message to print if test fails
      */
     template <typename T>
     void TestDivision(Time t, Time expected, T val, const std::string& msg);
@@ -168,11 +168,11 @@
                               10.0,
                               Minutes(1).GetMinutes(),
                               "is 10 really 10 ?");
-    NS_TEST_ASSERT_MSG_EQ_TOL(Seconds(1.0).GetSeconds(),
+    NS_TEST_ASSERT_MSG_EQ_TOL(Seconds(1).GetSeconds(),
                               1.0,
                               TimeStep(1).GetSeconds(),
                               "is 1 really 1 ?");
-    NS_TEST_ASSERT_MSG_EQ_TOL(Seconds(10.0).GetSeconds(),
+    NS_TEST_ASSERT_MSG_EQ_TOL(Seconds(10).GetSeconds(),
                               10.0,
                               TimeStep(1).GetSeconds(),
                               "is 10 really 10 ?");
@@ -325,30 +325,30 @@
 }
 
 /**
- * \ingroup core-tests
- * \brief  time-tests Time with Sign test case
+ * @ingroup core-tests
+ * @brief  time-tests Time with Sign test case
  */
 class TimeWithSignTestCase : public TestCase
 {
   public:
     /**
-     * \brief constructor for TimeWithSignTestCase.
+     * @brief constructor for TimeWithSignTestCase.
      */
     TimeWithSignTestCase();
 
   private:
     /**
-     * \brief DoSetup for TimeWithSignTestCase.
+     * @brief DoSetup for TimeWithSignTestCase.
      */
     void DoSetup() override;
 
     /**
-     * \brief DoRun for TimeWithSignTestCase.
+     * @brief DoRun for TimeWithSignTestCase.
      */
     void DoRun() override;
 
     /**
-     * \brief DoTeardown for TimeWithSignTestCase.
+     * @brief DoTeardown for TimeWithSignTestCase.
      */
     void DoTeardown() override;
 };
@@ -399,32 +399,32 @@
 }
 
 /**
- * \ingroup core-tests
- * \brief Input output Test Case for Time
+ * @ingroup core-tests
+ * @brief Input output Test Case for Time
  */
 class TimeInputOutputTestCase : public TestCase
 {
   public:
     /**
-     * \brief Constructor for TimeInputOutputTestCase.
+     * @brief Constructor for TimeInputOutputTestCase.
      */
     TimeInputOutputTestCase();
 
   private:
     /**
-     * \brief DoRun for TimeInputOutputTestCase.
+     * @brief DoRun for TimeInputOutputTestCase.
      */
     void DoRun() override;
     /**
-     * \brief Check roundtrip from/to string.
-     * \param str Time input check.
+     * @brief Check roundtrip from/to string.
+     * @param str Time input check.
      */
     void Check(const std::string& str);
 
     /**
-     * \brief Check autoscaling output using Time::As()
-     * \param t Time instance.
-     * \param expect Expected string output with Time::As() autoscaling.
+     * @brief Check autoscaling output using Time::As()
+     * @param t Time instance.
+     * @param expect Expected string output with Time::As() autoscaling.
      */
     void CheckAs(const Time t, const std::string expect);
 };
@@ -524,8 +524,8 @@
 }
 
 /**
- * \ingroup core-tests
- * \brief   Time test Suite.  Runs the appropriate test cases for time
+ * @ingroup core-tests
+ * @brief   Time test Suite.  Runs the appropriate test cases for time
  */
 static class TimeTestSuite : public TestSuite
 {
@@ -539,5 +539,5 @@
         AddTestCase(new TimeSimpleTestCase(), TestCase::Duration::QUICK);
     }
 }
-/** \brief Member variable for time test suite */
+/** @brief Member variable for time test suite */
 g_timeTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/test/traced-callback-test-suite.cc ns-3.44/src/core/test/traced-callback-test-suite.cc
--- ns-3.43/src/core/test/traced-callback-test-suite.cc	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/core/test/traced-callback-test-suite.cc	2025-03-09 16:55:49.367371000 -0700
@@ -10,18 +10,18 @@
 using namespace ns3;
 
 /**
- * \file
- * \ingroup tracedcallback-tests
+ * @file
+ * @ingroup tracedcallback-tests
  * TracedCallback test suite
  */
 
 /**
- * \ingroup core-tests
- * \defgroup tracedcallback-tests TracedCallback class tests
+ * @ingroup core-tests
+ * @defgroup tracedcallback-tests TracedCallback class tests
  */
 
 /**
- * \ingroup tracedcallback-tests
+ * @ingroup tracedcallback-tests
  *
  * TracedCallback Test case, check basic TracedCallback operation.
  */
@@ -39,8 +39,8 @@
 
     /**
      * First callback.
-     * \param a First parameter.
-     * \param b Second parameter.
+     * @param a First parameter.
+     * @param b Second parameter.
      */
     void CbOne(uint8_t a, double b);
 
@@ -123,9 +123,9 @@
 }
 
 /**
- * \ingroup tracedcallback-tests
+ * @ingroup tracedcallback-tests
  *
- * \brief The traced callback Test Suite.
+ * @brief The traced callback Test Suite.
  */
 class TracedCallbackTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/test/trickle-timer-test-suite.cc ns-3.44/src/core/test/trickle-timer-test-suite.cc
--- ns-3.43/src/core/test/trickle-timer-test-suite.cc	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/core/test/trickle-timer-test-suite.cc	2025-03-09 16:55:49.367371000 -0700
@@ -14,10 +14,10 @@
 #include <vector>
 
 /**
- * \file
- * \ingroup core-tests
- * \ingroup timer
- * \ingroup timer-tests
+ * @file
+ * @ingroup core-tests
+ * @ingroup timer
+ * @ingroup timer-tests
  *
  * Trickle Timer test suite.
  *
@@ -35,7 +35,7 @@
 {
 
 /**
- * \ingroup timer-tests
+ * @ingroup timer-tests
  *  TrickleTimer test
  */
 class TrickleTimerTestCase : public TestCase
@@ -57,20 +57,20 @@
 
     /**
      * Test the steady-state
-     * \param unit Minimum interval
+     * @param unit Minimum interval
      */
     void TestSteadyState(Time unit);
 
     /**
      * Test the redundancy suppression
-     * \param unit Minimum interval
+     * @param unit Minimum interval
      */
     void TestRedundancy(Time unit);
 
     /**
      * Inject in the timer a consistent event
-     * \param interval Interval
-     * \param tricklePtr Pointer to the TrickleTimer
+     * @param interval Interval
+     * @param tricklePtr Pointer to the TrickleTimer
      */
     void ConsistentEvent(Time interval, TrickleTimer* tricklePtr);
 
@@ -194,7 +194,7 @@
 }
 
 /**
- * \ingroup timer-tests
+ * @ingroup timer-tests
  *  Trickle Timer test suite
  */
 class TrickleTimerTestSuite : public TestSuite
@@ -209,7 +209,7 @@
 };
 
 /**
- * \ingroup timer-tests
+ * @ingroup timer-tests
  * TrickleTimerTestSuite instance variable.
  */
 static TrickleTimerTestSuite g_trickleTimerTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/test/tuple-value-test-suite.cc ns-3.44/src/core/test/tuple-value-test-suite.cc
--- ns-3.43/src/core/test/tuple-value-test-suite.cc	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/core/test/tuple-value-test-suite.cc	2025-03-09 16:55:49.367371000 -0700
@@ -6,15 +6,15 @@
  * Author: Stefano Avallone <stavallo@unina.it>
  */
 
-#include <ns3/double.h>
-#include <ns3/enum.h>
-#include <ns3/log.h>
-#include <ns3/object.h>
-#include <ns3/ptr.h>
-#include <ns3/string.h>
-#include <ns3/test.h>
-#include <ns3/tuple.h>
-#include <ns3/uinteger.h>
+#include "ns3/double.h"
+#include "ns3/enum.h"
+#include "ns3/log.h"
+#include "ns3/object.h"
+#include "ns3/ptr.h"
+#include "ns3/string.h"
+#include "ns3/test.h"
+#include "ns3/tuple.h"
+#include "ns3/uinteger.h"
 
 #include <algorithm>
 #include <iterator>
@@ -44,8 +44,8 @@
     ~TupleObject() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -60,22 +60,22 @@
 
     /**
      * Set tuple1
-     * \param tuple tuple value
+     * @param tuple tuple value
      */
     void SetTuple1(const Tuple1& tuple);
     /**
      * Get tuple1
-     * \return tuple1
+     * @return tuple1
      */
     Tuple1 GetTuple1() const;
     /**
      * Set tuple2
-     * \param tuple tuple value
+     * @param tuple tuple value
      */
     void SetTuple2(const Tuple2& tuple);
     /**
      * Get tuple2
-     * \return tuple2
+     * @return tuple2
      */
     Tuple2 GetTuple2() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/test/type-id-test-suite.cc ns-3.44/src/core/test/type-id-test-suite.cc
--- ns-3.43/src/core/test/type-id-test-suite.cc	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/core/test/type-id-test-suite.cc	2025-03-09 16:55:49.367371000 -0700
@@ -20,22 +20,22 @@
 
 using namespace ns3;
 
-/// \return A const string used to build the test name.
+/// @return A const string used to build the test name.
 const std::string suite("type-id: ");
 
 /**
- * \file
- * \ingroup typeid-tests
+ * @file
+ * @ingroup typeid-tests
  * TypeId test suite
  */
 
 /**
- * \ingroup core-tests
- * \defgroup typeid-tests TypeId class tests
+ * @ingroup core-tests
+ * @defgroup typeid-tests TypeId class tests
  */
 
 /**
- * \ingroup typeid-tests
+ * @ingroup typeid-tests
  *
  * Test for uniqueness of all TypeIds.
  */
@@ -109,7 +109,7 @@
 }
 
 /**
- * \ingroup typeid-tests
+ * @ingroup typeid-tests
  *
  * Collision test.
  */
@@ -190,7 +190,7 @@
 }
 
 /**
- * \ingroup typeid-tests
+ * @ingroup typeid-tests
  *
  * Class used to test deprecated Attributes.
  */
@@ -216,8 +216,8 @@
     }
 
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId()
     {
@@ -237,7 +237,7 @@
                               IntegerValue(1),
                               MakeIntegerAccessor(&DeprecatedAttribute::m_attr),
                               MakeIntegerChecker<int>(),
-                              TypeId::DEPRECATED,
+                              TypeId::SupportLevel::DEPRECATED,
                               "use 'attribute' instead")
                 // Obsolete attribute, as an example
                 .AddAttribute("obsoleteAttribute",
@@ -245,7 +245,7 @@
                               EmptyAttributeValue(),
                               MakeEmptyAttributeAccessor(),
                               MakeEmptyAttributeChecker(),
-                              TypeId::OBSOLETE,
+                              TypeId::SupportLevel::OBSOLETE,
                               "refactor to use 'attribute'")
 
                 // The new trace source
@@ -258,14 +258,14 @@
                                 "the old trace source",
                                 MakeTraceSourceAccessor(&DeprecatedAttribute::m_trace),
                                 "ns3::TracedValueCallback::Double",
-                                TypeId::DEPRECATED,
+                                TypeId::SupportLevel::DEPRECATED,
                                 "use 'trace' instead")
                 // Obsolete trace source, as an example
                 .AddTraceSource("obsoleteTraceSource",
                                 "the obsolete trace source",
                                 MakeEmptyTraceSourceAccessor(),
                                 "ns3::TracedValueCallback::Void",
-                                TypeId::OBSOLETE,
+                                TypeId::SupportLevel::OBSOLETE,
                                 "refactor to use 'trace'");
 
         return tid;
@@ -273,7 +273,7 @@
 };
 
 /**
- * \ingroup typeid-tests
+ * @ingroup typeid-tests
  *
  * Check deprecated Attributes and TraceSources.
  */
@@ -311,29 +311,33 @@
                           true,
                           "lookup new attribute");
     std::cerr << suite << "lookup new attribute:"
-              << (ainfo.supportLevel == TypeId::SUPPORTED ? "supported" : "error") << std::endl;
+              << (ainfo.supportLevel == TypeId::SupportLevel::SUPPORTED ? "supported" : "error")
+              << std::endl;
 
     NS_TEST_ASSERT_MSG_EQ(tid.LookupAttributeByName("oldAttribute", &ainfo),
                           true,
                           "lookup old attribute");
     std::cerr << suite << "lookup old attribute:"
-              << (ainfo.supportLevel == TypeId::DEPRECATED ? "deprecated" : "error") << std::endl;
+              << (ainfo.supportLevel == TypeId::SupportLevel::DEPRECATED ? "deprecated" : "error")
+              << std::endl;
 
     TypeId::TraceSourceInformation tinfo;
     Ptr<const TraceSourceAccessor> acc;
     acc = tid.LookupTraceSourceByName("trace", &tinfo);
     NS_TEST_ASSERT_MSG_NE(acc, nullptr, "lookup new trace source");
     std::cerr << suite << "lookup new trace source:"
-              << (tinfo.supportLevel == TypeId::SUPPORTED ? "supported" : "error") << std::endl;
+              << (tinfo.supportLevel == TypeId::SupportLevel::SUPPORTED ? "supported" : "error")
+              << std::endl;
 
     acc = tid.LookupTraceSourceByName("oldTrace", &tinfo);
     NS_TEST_ASSERT_MSG_NE(acc, nullptr, "lookup old trace source");
     std::cerr << suite << "lookup old trace source:"
-              << (tinfo.supportLevel == TypeId::DEPRECATED ? "deprecated" : "error") << std::endl;
+              << (tinfo.supportLevel == TypeId::SupportLevel::DEPRECATED ? "deprecated" : "error")
+              << std::endl;
 }
 
 /**
- * \ingroup typeid-tests
+ * @ingroup typeid-tests
  *
  * Performance test: measure average lookup time.
  */
@@ -348,8 +352,8 @@
     void DoSetup() override;
     /**
      * Report the performance test results.
-     * \param how How the TypeId is searched (name or hash).
-     * \param delta The time required for the lookup.
+     * @param how How the TypeId is searched (name or hash).
+     * @param delta The time required for the lookup.
      */
     void Report(const std::string how, const uint32_t delta) const;
 
@@ -421,7 +425,7 @@
 }
 
 /**
- * \ingroup typeid-tests
+ * @ingroup typeid-tests
  *
  * TypeId test suites.
  */
@@ -450,7 +454,7 @@
 static TypeIdTestSuite g_TypeIdTestSuite;
 
 /**
- * \ingroup typeid-tests
+ * @ingroup typeid-tests
  *
  * TypeId performance test suites.
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/test/type-traits-test-suite.cc ns-3.44/src/core/test/type-traits-test-suite.cc
--- ns-3.43/src/core/test/type-traits-test-suite.cc	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/core/test/type-traits-test-suite.cc	2025-03-09 16:55:49.367371000 -0700
@@ -9,10 +9,10 @@
 #include "ns3/warnings.h"
 
 /**
- * \file
- * \ingroup core-tests
- * \ingroup object
- * \ingroup object-tests
+ * @file
+ * @ingroup core-tests
+ * @ingroup object
+ * @ingroup object-tests
  * TypeTraits test suite.
  */
 
@@ -23,7 +23,7 @@
 {
 
 /**
- * \ingroup object-tests
+ * @ingroup object-tests
  *  Type traits test
  */
 class TypeTraitsTestCase : public TestCase
@@ -80,7 +80,7 @@
 }
 
 /**
- * \ingroup object-tests
+ * @ingroup object-tests
  *  Type traits test suite
  */
 class TypeTraitsTestSuite : public TestSuite
@@ -97,7 +97,7 @@
 }
 
 /**
- * \ingroup object-tests
+ * @ingroup object-tests
  * TypeTraitsTestSuite instance variable.
  */
 static TypeTraitsTestSuite g_typeTraitsTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/test/val-array-test-suite.cc ns-3.44/src/core/test/val-array-test-suite.cc
--- ns-3.43/src/core/test/val-array-test-suite.cc	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/core/test/val-array-test-suite.cc	2025-03-09 16:55:49.367371000 -0700
@@ -11,20 +11,20 @@
 #include "ns3/val-array.h"
 
 /**
- * \defgroup valArray-tests ValArray tests
- * \ingroup core-tests
- * \ingroup Matrices
+ * @defgroup valArray-tests ValArray tests
+ * @ingroup core-tests
+ * @ingroup Matrices
  */
 
 /**
- * \file
- * \ingroup valArray-tests
+ * @file
+ * @ingroup valArray-tests
  * ValArray test suite
  */
 
 /**
- * \file
- * \ingroup core-tests
+ * @file
+ * @ingroup core-tests
  */
 
 namespace ns3
@@ -50,32 +50,32 @@
     /**
      * Constructor
      *
-     * \param [in] name reference name
+     * @param [in] name reference name
      */
     ValArrayTestCase(const std::string& name);
 
     /** Destructor. */
     ~ValArrayTestCase() override;
     /**
-     * \brief Copy constructor.
+     * @brief Copy constructor.
      * Instruct the compiler to generate the implicitly declared copy constructor
      */
     ValArrayTestCase(const ValArrayTestCase<T>&) = default;
     /**
-     * \brief Copy assignment operator.
+     * @brief Copy assignment operator.
      * Instruct the compiler to generate the implicitly declared copy assignment operator.
-     * \return A reference to this ValArrayTestCase
+     * @return A reference to this ValArrayTestCase
      */
     ValArrayTestCase<T>& operator=(const ValArrayTestCase<T>&) = default;
     /**
-     * \brief Move constructor.
+     * @brief Move constructor.
      * Instruct the compiler to generate the implicitly declared move constructor
      */
     ValArrayTestCase(ValArrayTestCase<T>&&) = default;
     /**
-     * \brief Move assignment operator.
+     * @brief Move assignment operator.
      * Instruct the compiler to generate the implicitly declared copy constructor
-     * \return A reference to this ValArrayTestCase
+     * @return A reference to this ValArrayTestCase
      */
     ValArrayTestCase<T>& operator=(ValArrayTestCase<T>&&) = default;
 
@@ -271,10 +271,10 @@
 }
 
 /**
- * \ingroup valArray-tests
+ * @ingroup valArray-tests
  * ValArray test suite
  *
- * \brief The test checks the correct behaviour of ValArray class
+ * @brief The test checks the correct behaviour of ValArray class
  */
 class ValArrayTestSuite : public TestSuite
 {
@@ -292,7 +292,7 @@
 }
 
 /**
- * \ingroup valArray-tests
+ * @ingroup valArray-tests
  * ValArrayTestSuite instance variable.
  */
 static ValArrayTestSuite g_valArrayTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/core/test/watchdog-test-suite.cc ns-3.44/src/core/test/watchdog-test-suite.cc
--- ns-3.43/src/core/test/watchdog-test-suite.cc	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/core/test/watchdog-test-suite.cc	2025-03-09 16:55:49.367371000 -0700
@@ -9,10 +9,10 @@
 #include "ns3/watchdog.h"
 
 /**
- * \file
- * \ingroup core-tests
- * \ingroup timer
- * \ingroup timer-tests
+ * @file
+ * @ingroup core-tests
+ * @ingroup timer
+ * @ingroup timer-tests
  * Watchdog test suite.
  */
 
@@ -23,7 +23,7 @@
 {
 
 /**
- * \ingroup timer-tests
+ * @ingroup timer-tests
  *  Watchdog test
  */
 class WatchdogTestCase : public TestCase
@@ -34,7 +34,7 @@
     void DoRun() override;
     /**
      * Function to invoke when Watchdog expires.
-     * \param arg The argument passed.
+     * @param arg The argument passed.
      */
     void Expire(int arg);
     bool m_expired;        //!< Flag for expired Watchdog
@@ -79,7 +79,7 @@
 }
 
 /**
- * \ingroup timer-tests
+ * @ingroup timer-tests
  *  Watchdog test suite
  */
 class WatchdogTestSuite : public TestSuite
@@ -94,7 +94,7 @@
 };
 
 /**
- * \ingroup timer-tests
+ * @ingroup timer-tests
  * WatchdogTestSuite instance variable.
  */
 static WatchdogTestSuite g_watchdogTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/csma/examples/csma-broadcast.cc ns-3.44/src/csma/examples/csma-broadcast.cc
--- ns-3.43/src/csma/examples/csma-broadcast.cc	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/csma/examples/csma-broadcast.cc	2025-03-09 16:55:49.367371000 -0700
@@ -83,16 +83,16 @@
 
     ApplicationContainer app = onoff.Install(c0.Get(0));
     // Start the application
-    app.Start(Seconds(1.0));
-    app.Stop(Seconds(10.0));
+    app.Start(Seconds(1));
+    app.Stop(Seconds(10));
 
     // Create an optional packet sink to receive these packets
     PacketSinkHelper sink("ns3::UdpSocketFactory",
                           Address(InetSocketAddress(Ipv4Address::GetAny(), port)));
     app = sink.Install(c0.Get(1));
     app.Add(sink.Install(c1.Get(1)));
-    app.Start(Seconds(1.0));
-    app.Stop(Seconds(10.0));
+    app.Start(Seconds(1));
+    app.Stop(Seconds(10));
 
     // Configure ascii tracing of all enqueue, dequeue, and NetDevice receive
     // events on all devices.  Trace output will be sent to the file
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/csma/examples/csma-multicast.cc ns-3.44/src/csma/examples/csma-multicast.cc
--- ns-3.43/src/csma/examples/csma-multicast.cc	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/csma/examples/csma-multicast.cc	2025-03-09 16:55:49.367371000 -0700
@@ -142,8 +142,8 @@
 
     ApplicationContainer sinkC = sink.Install(c1.Get(2)); // Node n4
     // Start the sink
-    sinkC.Start(Seconds(1.0));
-    sinkC.Stop(Seconds(10.0));
+    sinkC.Start(Seconds(1));
+    sinkC.Stop(Seconds(10));
 
     NS_LOG_INFO("Configure Tracing.");
     //
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/csma/examples/csma-one-subnet.cc ns-3.44/src/csma/examples/csma-one-subnet.cc
--- ns-3.43/src/csma/examples/csma-one-subnet.cc	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/csma/examples/csma-one-subnet.cc	2025-03-09 16:55:49.367371000 -0700
@@ -81,14 +81,14 @@
 
     ApplicationContainer app = onoff.Install(nodes.Get(0));
     // Start the application
-    app.Start(Seconds(1.0));
-    app.Stop(Seconds(10.0));
+    app.Start(Seconds(1));
+    app.Stop(Seconds(10));
 
     // Create an optional packet sink to receive these packets
     PacketSinkHelper sink("ns3::UdpSocketFactory",
                           Address(InetSocketAddress(Ipv4Address::GetAny(), port)));
     app = sink.Install(nodes.Get(1));
-    app.Start(Seconds(0.0));
+    app.Start(Seconds(0));
 
     //
     // Create a similar flow from n3 to n0, starting at time 1.1 seconds
@@ -96,10 +96,10 @@
     onoff.SetAttribute("Remote", AddressValue(InetSocketAddress(interfaces.GetAddress(0), port)));
     app = onoff.Install(nodes.Get(3));
     app.Start(Seconds(1.1));
-    app.Stop(Seconds(10.0));
+    app.Stop(Seconds(10));
 
     app = sink.Install(nodes.Get(0));
-    app.Start(Seconds(0.0));
+    app.Start(Seconds(0));
 
     NS_LOG_INFO("Configure Tracing.");
     //
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/csma/examples/csma-packet-socket.cc ns-3.44/src/csma/examples/csma-packet-socket.cc
--- ns-3.43/src/csma/examples/csma-packet-socket.cc	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/csma/examples/csma-packet-socket.cc	2025-03-09 16:55:49.367371000 -0700
@@ -35,9 +35,9 @@
 /**
  * Rx sink
  *
- * \param path The context.
- * \param p The packet.
- * \param address The sender address.
+ * @param path The context.
+ * @param p The packet.
+ * @param address The sender address.
  */
 static void
 SinkRx(std::string path, Ptr<const Packet> p, const Address& address)
@@ -88,22 +88,22 @@
     OnOffHelper onoff("ns3::PacketSocketFactory", Address(socket));
     onoff.SetConstantRate(DataRate("500kb/s"));
     ApplicationContainer apps = onoff.Install(nodes.Get(0));
-    apps.Start(Seconds(1.0));
-    apps.Stop(Seconds(10.0));
+    apps.Start(Seconds(1));
+    apps.Stop(Seconds(10));
 
     socket.SetSingleDevice(devs.Get(3)->GetIfIndex());
     socket.SetPhysicalAddress(devs.Get(0)->GetAddress());
     socket.SetProtocol(3);
     onoff.SetAttribute("Remote", AddressValue(socket));
     apps = onoff.Install(nodes.Get(3));
-    apps.Start(Seconds(1.0));
-    apps.Stop(Seconds(10.0));
+    apps.Start(Seconds(1));
+    apps.Stop(Seconds(10));
 
     // Install packet sink on node 0 to receive packets from node 1
     PacketSinkHelper sink = PacketSinkHelper("ns3::PacketSocketFactory", socket);
     apps = sink.Install(nodes.Get(0));
-    apps.Start(Seconds(0.0));
-    apps.Stop(Seconds(20.0));
+    apps.Start(Seconds(0));
+    apps.Stop(Seconds(20));
 
     // While the below trace sink is hooked to all nodes (the wildcard "*")
     // only one packet sink (on node 0) is actually added above, so
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/csma/examples/csma-ping.cc ns-3.44/src/csma/examples/csma-ping.cc
--- ns-3.43/src/csma/examples/csma-ping.cc	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/csma/examples/csma-ping.cc	2025-03-09 16:55:49.367371000 -0700
@@ -30,8 +30,8 @@
 /**
  * Rx sink
  *
- * \param p The packer.
- * \param ad The sender address.
+ * @param p The packer.
+ * @param ad The sender address.
  */
 static void
 SinkRx(Ptr<const Packet> p, const Address& ad)
@@ -42,9 +42,9 @@
 /**
  * Ping RTT trace sink
  *
- * \param context The context.
- * \param seqNo The Sequence Number.
- * \param rtt The RTT.
+ * @param context The context.
+ * @param seqNo The Sequence Number.
+ * @param rtt The RTT.
  */
 static void
 PingRtt(std::string context, uint16_t seqNo, Time rtt)
@@ -95,14 +95,14 @@
     onoff.SetAttribute("PacketSize", UintegerValue(1200));
 
     ApplicationContainer apps = onoff.Install(c.Get(0));
-    apps.Start(Seconds(1.0));
-    apps.Stop(Seconds(10.0));
+    apps.Start(Seconds(1));
+    apps.Stop(Seconds(10));
 
     NS_LOG_INFO("Create Sink.");
     PacketSinkHelper sink = PacketSinkHelper("ns3::Ipv4RawSocketFactory", dst);
     apps = sink.Install(c.Get(3));
-    apps.Start(Seconds(0.0));
-    apps.Stop(Seconds(11.0));
+    apps.Start(Seconds(0));
+    apps.Stop(Seconds(11));
 
     NS_LOG_INFO("Create pinger");
     PingHelper ping(addresses.GetAddress(2));
@@ -111,8 +111,8 @@
     pingers.Add(c.Get(1));
     pingers.Add(c.Get(3));
     apps = ping.Install(pingers);
-    apps.Start(Seconds(2.0));
-    apps.Stop(Seconds(5.0));
+    apps.Start(Seconds(2));
+    apps.Stop(Seconds(5));
 
     NS_LOG_INFO("Configure Tracing.");
     // first, pcap tracing in non-promiscuous mode
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/csma/examples/csma-raw-ip-socket.cc ns-3.44/src/csma/examples/csma-raw-ip-socket.cc
--- ns-3.43/src/csma/examples/csma-raw-ip-socket.cc	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/csma/examples/csma-raw-ip-socket.cc	2025-03-09 16:55:49.371371000 -0700
@@ -33,8 +33,8 @@
 /**
  * Receive sink function
  *
- * \param p the packet.
- * \param ad the sender's address.
+ * @param p the packet.
+ * @param ad the sender's address.
  */
 static void
 SinkRx(Ptr<const Packet> p, const Address& ad)
@@ -94,8 +94,8 @@
     NS_LOG_INFO("Create Sink.");
     PacketSinkHelper sink = PacketSinkHelper("ns3::Ipv4RawSocketFactory", dst);
     apps = sink.Install(c.Get(3));
-    apps.Start(Seconds(0.0));
-    apps.Stop(Seconds(12.0));
+    apps.Start(Seconds(0));
+    apps.Stop(Seconds(12));
 
     NS_LOG_INFO("Configure Tracing.");
     // first, pcap tracing in non-promiscuous mode
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/csma/helper/csma-helper.h ns-3.44/src/csma/helper/csma-helper.h
--- ns-3.43/src/csma/helper/csma-helper.h	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/csma/helper/csma-helper.h	2025-03-09 16:55:49.371371000 -0700
@@ -24,8 +24,8 @@
 class Packet;
 
 /**
- * \ingroup csma
- * \brief build a set of CsmaNetDevice objects
+ * @ingroup csma
+ * @brief build a set of CsmaNetDevice objects
  *
  * Normally we eschew multiple inheritance, however, the classes
  * PcapUserHelperForDevice and AsciiTraceUserHelperForDevice are
@@ -46,9 +46,9 @@
     }
 
     /**
-     * \tparam Ts \deduced Argument types
-     * \param type the type of queue
-     * \param [in] args Name and AttributeValue pairs to set.
+     * @tparam Ts \deduced Argument types
+     * @param type the type of queue
+     * @param [in] args Name and AttributeValue pairs to set.
      *
      * Set the type of queue to create and associated to each
      * CsmaNetDevice created through CsmaHelper::Install.
@@ -57,8 +57,8 @@
     void SetQueue(std::string type, Ts&&... args);
 
     /**
-     * \param n1 the name of the attribute to set
-     * \param v1 the value of the attribute to set
+     * @param n1 the name of the attribute to set
+     * @param v1 the value of the attribute to set
      *
      * Set these attributes on each ns3::CsmaNetDevice created
      * by CsmaHelper::Install
@@ -66,8 +66,8 @@
     void SetDeviceAttribute(std::string n1, const AttributeValue& v1);
 
     /**
-     * \param n1 the name of the attribute to set
-     * \param v1 the value of the attribute to set
+     * @param n1 the name of the attribute to set
+     * @param v1 the value of the attribute to set
      *
      * Set these attributes on each ns3::CsmaChannel created
      * by CsmaHelper::Install
@@ -90,8 +90,8 @@
      * configured by CsmaHelper::SetDeviceAttribute and then adds the device
      * to the node and attaches the channel to the device.
      *
-     * \param node The node to install the device in
-     * \returns A container holding the added net device.
+     * @param node The node to install the device in
+     * @returns A container holding the added net device.
      */
     NetDeviceContainer Install(Ptr<Node> node) const;
 
@@ -101,8 +101,8 @@
      * configured by CsmaHelper::SetDeviceAttribute and then adds the device
      * to the node and attaches the channel to the device.
      *
-     * \param name The name of the node to install the device in
-     * \returns A container holding the added net device.
+     * @param name The name of the node to install the device in
+     * @returns A container holding the added net device.
      */
     NetDeviceContainer Install(std::string name) const;
 
@@ -111,9 +111,9 @@
      * CsmaHelper::SetDeviceAttribute and then adds the device to the node and
      * attaches the provided channel to the device.
      *
-     * \param node The node to install the device in
-     * \param channel The channel to attach to the device.
-     * \returns A container holding the added net device.
+     * @param node The node to install the device in
+     * @param channel The channel to attach to the device.
+     * @returns A container holding the added net device.
      */
     NetDeviceContainer Install(Ptr<Node> node, Ptr<CsmaChannel> channel) const;
 
@@ -122,9 +122,9 @@
      * CsmaHelper::SetDeviceAttribute and then adds the device to the node and
      * attaches the provided channel to the device.
      *
-     * \param node The node to install the device in
-     * \param channelName The name of the channel to attach to the device.
-     * \returns A container holding the added net device.
+     * @param node The node to install the device in
+     * @param channelName The name of the channel to attach to the device.
+     * @returns A container holding the added net device.
      */
     NetDeviceContainer Install(Ptr<Node> node, std::string channelName) const;
 
@@ -133,9 +133,9 @@
      * CsmaHelper::SetDeviceAttribute and then adds the device to the node and
      * attaches the provided channel to the device.
      *
-     * \param nodeName The name of the node to install the device in
-     * \param channel The channel to attach to the device.
-     * \returns A container holding the added net device.
+     * @param nodeName The name of the node to install the device in
+     * @param channel The channel to attach to the device.
+     * @returns A container holding the added net device.
      */
     NetDeviceContainer Install(std::string nodeName, Ptr<CsmaChannel> channel) const;
 
@@ -144,9 +144,9 @@
      * CsmaHelper::SetDeviceAttribute and then adds the device to the node and
      * attaches the provided channel to the device.
      *
-     * \param nodeName The name of the node to install the device in
-     * \param channelName The name of the channel to attach to the device.
-     * \returns A container holding the added net device.
+     * @param nodeName The name of the node to install the device in
+     * @param channelName The name of the channel to attach to the device.
+     * @returns A container holding the added net device.
      */
     NetDeviceContainer Install(std::string nodeName, std::string channelName) const;
 
@@ -157,8 +157,8 @@
      * configured by CsmaHelper::SetDeviceAttribute); adds the device to the
      * node; and attaches the channel to the device.
      *
-     * \param c The NodeContainer holding the nodes to be changed.
-     * \returns A container holding the added net devices.
+     * @param c The NodeContainer holding the nodes to be changed.
+     * @returns A container holding the added net devices.
      */
     NetDeviceContainer Install(const NodeContainer& c) const;
 
@@ -168,9 +168,9 @@
      * CsmaHelper::SetDeviceAttribute); adds the device to the node; and attaches
      * the provided channel to the device.
      *
-     * \param c The NodeContainer holding the nodes to be changed.
-     * \param channel The channel to attach to the devices.
-     * \returns A container holding the added net devices.
+     * @param c The NodeContainer holding the nodes to be changed.
+     * @param channel The channel to attach to the devices.
+     * @returns A container holding the added net devices.
      */
     NetDeviceContainer Install(const NodeContainer& c, Ptr<CsmaChannel> channel) const;
 
@@ -180,9 +180,9 @@
      * CsmaHelper::SetDeviceAttribute); adds the device to the node; and attaches
      * the provided channel to the device.
      *
-     * \param c The NodeContainer holding the nodes to be changed.
-     * \param channelName The name of the channel to attach to the devices.
-     * \returns A container holding the added net devices.
+     * @param c The NodeContainer holding the nodes to be changed.
+     * @param channelName The name of the channel to attach to the devices.
+     * @returns A container holding the added net devices.
      */
     NetDeviceContainer Install(const NodeContainer& c, std::string channelName) const;
 
@@ -192,10 +192,10 @@
      * have been assigned. The Install() method should have previously been
      * called by the user.
      *
-     * \param c NetDeviceContainer of the set of net devices for which the
+     * @param c NetDeviceContainer of the set of net devices for which the
      *          CsmaNetDevice 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
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this helper
      */
     int64_t AssignStreams(NetDeviceContainer c, int64_t stream);
 
@@ -205,22 +205,22 @@
      * CsmaHelper::SetDeviceAttribute and then adds the device to the node and
      * attaches the provided channel to the device.
      *
-     * \param node The node to install the device in
-     * \param channel The channel to attach to the device.
-     * \returns A container holding the added net device.
+     * @param node The node to install the device in
+     * @param channel The channel to attach to the device.
+     * @returns A container holding the added net device.
      */
     Ptr<NetDevice> InstallPriv(Ptr<Node> node, Ptr<CsmaChannel> channel) const;
 
     /**
-     * \brief Enable pcap output on the indicated net device.
+     * @brief Enable pcap output on the indicated net device.
      *
      * NetDevice-specific implementation mechanism for hooking the trace and
      * writing to the trace file.
      *
-     * \param prefix Filename prefix to use for pcap files.
-     * \param nd Net device for which you want to enable tracing.
-     * \param promiscuous If true capture all possible packets available at the device.
-     * \param explicitFilename Treat the prefix as an explicit filename if true
+     * @param prefix Filename prefix to use for pcap files.
+     * @param nd Net device for which you want to enable tracing.
+     * @param promiscuous If true capture all possible packets available at the device.
+     * @param explicitFilename Treat the prefix as an explicit filename if true
      */
     void EnablePcapInternal(std::string prefix,
                             Ptr<NetDevice> nd,
@@ -228,15 +228,15 @@
                             bool explicitFilename) override;
 
     /**
-     * \brief Enable ascii trace output on the indicated net device.
+     * @brief Enable ascii trace output on the indicated net device.
      *
      * NetDevice-specific implementation mechanism for hooking the trace and
      * writing to the trace file.
      *
-     * \param stream The output stream object to use when logging ascii traces.
-     * \param prefix Filename prefix to use for ascii trace files.
-     * \param nd Net device for which you want to enable tracing.
-     * \param explicitFilename Treat the prefix as an explicit filename if true
+     * @param stream The output stream object to use when logging ascii traces.
+     * @param prefix Filename prefix to use for ascii trace files.
+     * @param nd Net device for which you want to enable tracing.
+     * @param explicitFilename Treat the prefix as an explicit filename if true
      */
     void EnableAsciiInternal(Ptr<OutputStreamWrapper> stream,
                              std::string prefix,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/csma/model/backoff.h ns-3.44/src/csma/model/backoff.h
--- ns-3.43/src/csma/model/backoff.h	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/csma/model/backoff.h	2025-03-09 16:55:49.371371000 -0700
@@ -19,8 +19,8 @@
 {
 
 /**
- * \ingroup csma
- * \brief The backoff class is used for calculating backoff times
+ * @ingroup csma
+ * @brief The backoff class is used for calculating backoff times
  * when many net devices can write to the same channel
  */
 
@@ -57,12 +57,12 @@
 
     Backoff();
     /**
-     * \brief Constructor
-     * \param slotTime Length of one slot
-     * \param minSlots Minimum number of backoff slots
-     * \param maxSlots Maximum number of backoff slots
-     * \param ceiling Cap to the exponential function
-     * \param maxRetries Maximum number of transmission retries
+     * @brief Constructor
+     * @param slotTime Length of one slot
+     * @param minSlots Minimum number of backoff slots
+     * @param maxSlots Maximum number of backoff slots
+     * @param ceiling Cap to the exponential function
+     * @param maxRetries Maximum number of transmission retries
      */
     Backoff(Time slotTime,
             uint32_t minSlots,
@@ -71,7 +71,7 @@
             uint32_t maxRetries);
 
     /**
-     * \return The amount of time that the net device should wait before
+     * @return The amount of time that the net device should wait before
      * trying to retransmit the packet
      */
     Time GetBackoffTime();
@@ -84,7 +84,7 @@
     void ResetBackoffTime();
 
     /**
-     * \return True if the maximum number of retries has been reached
+     * @return True if the maximum number of retries has been reached
      */
     bool MaxRetriesReached() const;
 
@@ -98,8 +98,8 @@
      * used by this model.  Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/csma/model/csma-channel.h ns-3.44/src/csma/model/csma-channel.h
--- ns-3.43/src/csma/model/csma-channel.h	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/csma/model/csma-channel.h	2025-03-09 16:55:49.371371000 -0700
@@ -22,8 +22,8 @@
 class CsmaNetDevice;
 
 /**
- * \ingroup csma
- * \brief CsmaNetDevice Record
+ * @ingroup csma
+ * @brief CsmaNetDevice Record
  *
  * Stores the information related to each net device that is
  * connected to the channel.
@@ -37,21 +37,21 @@
     CsmaDeviceRec();
 
     /**
-     * \brief Constructor
+     * @brief Constructor
      * Builds a record of the given NetDevice, its status is initialized to enabled.
      *
-     * \param device the device to record
+     * @param device the device to record
      */
     CsmaDeviceRec(Ptr<CsmaNetDevice> device);
 
     /**
      * Copy constructor
-     * \param o the object to copy
+     * @param o the object to copy
      */
     CsmaDeviceRec(const CsmaDeviceRec& o);
 
     /**
-     * \return If the net device pointed to by the devicePtr is active
+     * @return If the net device pointed to by the devicePtr is active
      * and ready to RX/TX.
      */
     bool IsActive() const;
@@ -68,8 +68,8 @@
 };
 
 /**
- * \ingroup csma
- * \brief Csma Channel.
+ * @ingroup csma
+ * @brief Csma Channel.
  *
  * This class represents a simple Csma channel that can be used
  * when many nodes are connected to one wire. It uses a single busy
@@ -81,17 +81,17 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Create a CsmaChannel
+     * @brief Create a CsmaChannel
      */
     CsmaChannel();
     /**
-     * \brief Destroy a CsmaChannel
+     * @brief Destroy a CsmaChannel
      */
     ~CsmaChannel() override;
 
@@ -100,87 +100,87 @@
     CsmaChannel& operator=(const CsmaChannel&) = delete;
 
     /**
-     * \brief Attach a given netdevice to this channel
+     * @brief Attach a given netdevice to this channel
      *
-     * \param device Device pointer to the netdevice to attach to the channel
-     * \return The assigned device number
+     * @param device Device pointer to the netdevice to attach to the channel
+     * @return The assigned device number
      */
     int32_t Attach(Ptr<CsmaNetDevice> device);
 
     /**
-     * \brief Detach a given netdevice from this channel
+     * @brief Detach a given netdevice from this channel
      *
      * The net device is marked as inactive and it is not allowed to
      * receive or transmit packets
      *
-     * \param device Device pointer to the netdevice to detach from the channel
-     * \return True if the device is found and attached to the channel,
+     * @param device Device pointer to the netdevice to detach from the channel
+     * @return True if the device is found and attached to the channel,
      * false if the device is not currently connected to the channel or
      * can't be found.
      */
     bool Detach(Ptr<CsmaNetDevice> device);
 
     /**
-     * \brief Detach a given netdevice from this channel
+     * @brief Detach a given netdevice from this channel
      *
      * The net device is marked as inactive and it is not allowed to
      * receive or transmit packets
      *
-     * \param deviceId The deviceID assigned to the net device when it
+     * @param deviceId The deviceID assigned to the net device when it
      * was connected to the channel
-     * \return True if the device is found and attached to the channel,
+     * @return True if the device is found and attached to the channel,
      * false if the device is not currently connected to the channel or
      * can't be found.
      */
     bool Detach(uint32_t deviceId);
 
     /**
-     * \brief Reattach a previously detached net device to the channel
+     * @brief Reattach a previously detached net device to the channel
      *
      * The net device is marked as active. It is now allowed to receive
      * or transmit packets. The net device must have been previously
      * attached to the channel using the attach function.
      *
-     * \param deviceId The device ID assigned to the net device when it
+     * @param deviceId The device ID assigned to the net device when it
      * was connected to the channel
-     * \return True if the device is found and is not attached to the
+     * @return True if the device is found and is not attached to the
      * channel, false if the device is currently connected to the
      * channel or can't be found.
      */
     bool Reattach(uint32_t deviceId);
 
     /**
-     * \brief Reattach a previously detached net device to the channel
+     * @brief Reattach a previously detached net device to the channel
      *
      * The net device is marked as active. It is now allowed to receive
      * or transmit packets. The net device must have been previously
      * attached to the channel using the attach function.
      *
-     * \param device Device pointer to the netdevice to detach from the channel
-     * \return True if the device is found and is not attached to the
+     * @param device Device pointer to the netdevice to detach from the channel
+     * @return True if the device is found and is not attached to the
      * channel, false if the device is currently connected to the
      * channel or can't be found.
      */
     bool Reattach(Ptr<CsmaNetDevice> device);
 
     /**
-     * \brief Start transmitting a packet over the channel
+     * @brief Start transmitting a packet over the channel
      *
      * If the srcId belongs to a net device that is connected to the
      * channel, packet transmission begins, and the channel becomes busy
      * until the packet has completely reached all destinations.
      *
-     * \param p A reference to the packet that will be transmitted over
+     * @param p A reference to the packet that will be transmitted over
      * the channel
-     * \param srcId The device Id of the net device that wants to
+     * @param srcId The device Id of the net device that wants to
      * transmit on the channel.
-     * \return True if the channel is not busy and the transmitting net
+     * @return True if the channel is not busy and the transmitting net
      * device is currently active.
      */
     bool TransmitStart(Ptr<const Packet> p, uint32_t srcId);
 
     /**
-     * \brief Indicates that the net device has finished transmitting
+     * @brief Indicates that the net device has finished transmitting
      * the packet over the channel
      *
      * The channel will stay busy until the packet has completely
@@ -190,13 +190,13 @@
      * packet p as the m_currentPkt, the packet being currently
      * transmitting.
      *
-     * \return Returns true unless the source was detached before it
+     * @return Returns true unless the source was detached before it
      * completed its transmission.
      */
     bool TransmitEnd();
 
     /**
-     * \brief Indicates that the channel has finished propagating the
+     * @brief Indicates that the channel has finished propagating the
      * current packet. The channel is released and becomes free.
      *
      * Calls the receive function of every active net device that is
@@ -205,67 +205,67 @@
     void PropagationCompleteEvent();
 
     /**
-     * \return Returns the device number assigned to a net device by the
+     * @return Returns the device number assigned to a net device by the
      * channel
      *
-     * \param device Device pointer to the netdevice for which the device
+     * @param device Device pointer to the netdevice for which the device
      * number is needed
      */
     int32_t GetDeviceNum(Ptr<CsmaNetDevice> device);
 
     /**
-     * \return Returns the state of the channel (IDLE -- free,
+     * @return Returns the state of the channel (IDLE -- free,
      * TRANSMITTING -- busy, PROPAGATING - busy )
      */
     WireState GetState();
 
     /**
-     * \brief Indicates if the channel is busy. The channel will only
+     * @brief Indicates if the channel is busy. The channel will only
      * accept new packets for transmission if it is not busy.
      *
-     * \return Returns true if the channel is busy and false if it is
+     * @return Returns true if the channel is busy and false if it is
      * free.
      */
     bool IsBusy();
 
     /**
-     * \brief Indicates if a net device is currently attached or
+     * @brief Indicates if a net device is currently attached or
      * detached from the channel.
      *
-     * \param deviceId The ID that was assigned to the net device when
+     * @param deviceId The ID that was assigned to the net device when
      * it was attached to the channel.
-     * \return Returns true if the net device is attached to the
+     * @return Returns true if the net device is attached to the
      * channel, false otherwise.
      */
     bool IsActive(uint32_t deviceId);
 
     /**
-     * \return Returns the number of net devices that are currently
+     * @return Returns the number of net devices that are currently
      * attached to the channel.
      */
     uint32_t GetNumActDevices();
 
     /**
-     * \return Returns the total number of devices including devices
+     * @return Returns the total number of devices including devices
      * that have been detached from the channel.
      */
     std::size_t GetNDevices() const override;
 
     /**
-     * \return Get a NetDevice pointer to a connected network device.
+     * @return Get a NetDevice pointer to a connected network device.
      *
-     * \param i The index of the net device.
-     * \return Returns the pointer to the net device that is associated
+     * @param i The index of the net device.
+     * @return Returns the pointer to the net device that is associated
      * with deviceId i.
      */
     Ptr<NetDevice> GetDevice(std::size_t i) const override;
 
     /**
-     * \return Get a CsmaNetDevice pointer to a connected network device.
+     * @return Get a CsmaNetDevice pointer to a connected network device.
      *
-     * \param i The deviceId of the net device for which we want the
+     * @param i The deviceId of the net device for which we want the
      * pointer.
-     * \return Returns the pointer to the net device that is associated
+     * @return Returns the pointer to the net device that is associated
      * with deviceId i.
      */
     Ptr<CsmaNetDevice> GetCsmaDevice(std::size_t i) const;
@@ -273,7 +273,7 @@
     /**
      * Get the assigned data rate of the channel
      *
-     * \return Returns the DataRate to be used by device transmitters.
+     * @return Returns the DataRate to be used by device transmitters.
      * with deviceId i.
      */
     DataRate GetDataRate();
@@ -281,7 +281,7 @@
     /**
      * Get the assigned speed-of-light delay of the channel
      *
-     * \return Returns the delay used by the channel.
+     * @return Returns the delay used by the channel.
      */
     Time GetDelay();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/csma/model/csma-net-device.h ns-3.44/src/csma/model/csma-net-device.h
--- ns-3.43/src/csma/model/csma-net-device.h	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/csma/model/csma-net-device.h	2025-03-09 16:55:49.371371000 -0700
@@ -32,16 +32,16 @@
 class ErrorModel;
 
 /**
- * \defgroup csma CSMA Network Device
+ * @defgroup csma CSMA Network Device
  *
  * This section documents the API of the ns-3 csma module. For a generic functional description,
  * please refer to the ns-3 manual.
  */
 
 /**
- * \ingroup csma
- * \class CsmaNetDevice
- * \brief A Device for a Csma Network Link.
+ * @ingroup csma
+ * @class CsmaNetDevice
+ * @brief A Device for a Csma Network Link.
  *
  * The Csma net device class is analogous to layer 1 and 2 of the
  * TCP stack. The NetDevice takes a raw packet of bytes and creates a
@@ -51,8 +51,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -85,7 +85,7 @@
      * defines the minimum space required between packets sent by this device.
      * As in Ethernet, it defaults to 96 bit times.
      *
-     * \param t the interframe gap time
+     * @param t the interframe gap time
      */
     void SetInterframeGap(Time t);
 
@@ -93,12 +93,12 @@
      * Set the backoff parameters used to determine the wait to retry
      * transmitting a packet when the channel is busy.
      *
-     * \see Attach ()
-     * \param slotTime Length of a packet slot (or average packet time)
-     * \param minSlots Minimum number of slots to wait
-     * \param maxSlots Maximum number of slots to wait
-     * \param maxRetries Maximum number of retries before packet is discard
-     * \param ceiling Cap on the exponential function when calculating max slots
+     * @see Attach ()
+     * @param slotTime Length of a packet slot (or average packet time)
+     * @param minSlots Minimum number of slots to wait
+     * @param maxSlots Maximum number of slots to wait
+     * @param maxRetries Maximum number of retries before packet is discard
+     * @param ceiling Cap on the exponential function when calculating max slots
      */
     void SetBackoffParams(Time slotTime,
                           uint32_t minSlots,
@@ -111,10 +111,10 @@
      *
      * The function Attach is used to add a CsmaNetDevice to a CsmaChannel.
      *
-     * \see SetDataRate ()
-     * \see SetInterframeGap ()
-     * \param ch a pointer to the channel to which this object is being attached.
-     * \returns true if no error
+     * @see SetDataRate ()
+     * @see SetInterframeGap ()
+     * @param ch a pointer to the channel to which this object is being attached.
+     * @returns true if no error
      */
     bool Attach(Ptr<CsmaChannel> ch);
 
@@ -125,16 +125,16 @@
      * level topology objects to implement a particular queueing method such as
      * DropTail.
      *
-     * \see Queue
-     * \see DropTailQueue
-     * \param queue a Ptr to the queue for being assigned to the device.
+     * @see Queue
+     * @see DropTailQueue
+     * @param queue a Ptr to the queue for being assigned to the device.
      */
     void SetQueue(Ptr<Queue<Packet>> queue);
 
     /**
      * Get a copy of the attached Queue.
      *
-     * \return a pointer to the queue.
+     * @return a pointer to the queue.
      */
     Ptr<Queue<Packet>> GetQueue() const;
 
@@ -144,8 +144,8 @@
      * The CsmaNetDevice may optionally include an ErrorModel in
      * the packet receive chain to simulate data errors in during transmission.
      *
-     * \see ErrorModel
-     * \param em a pointer to the ErrorModel
+     * @see ErrorModel
+     * @param em a pointer to the ErrorModel
      */
     void SetReceiveErrorModel(Ptr<ErrorModel> em);
 
@@ -157,44 +157,44 @@
      * used by the channel to indicate that the last bit of a packet has
      * arrived at the device.
      *
-     * \see CsmaChannel
-     * \param p a reference to the received packet
-     * \param sender the CsmaNetDevice that transmitted the packet in the first place
+     * @see CsmaChannel
+     * @param p a reference to the received packet
+     * @param sender the CsmaNetDevice that transmitted the packet in the first place
      */
     void Receive(Ptr<const Packet> p, Ptr<CsmaNetDevice> sender);
 
     /**
      * Is the send side of the network device enabled?
      *
-     * \returns True if the send side is enabled, otherwise false.
+     * @returns True if the send side is enabled, otherwise false.
      */
     bool IsSendEnabled() const;
 
     /**
      * Enable or disable the send side of the network device.
      *
-     * \param enable Enable the send side if true, otherwise disable.
+     * @param enable Enable the send side if true, otherwise disable.
      */
     void SetSendEnable(bool enable);
 
     /**
      * Is the receive side of the network device enabled?
      *
-     * \returns True if the receiver side is enabled, otherwise false.
+     * @returns True if the receiver side is enabled, otherwise false.
      */
     bool IsReceiveEnabled() const;
 
     /**
      * Enable or disable the receive side of the network device.
      *
-     * \param enable Enable the receive side if true, otherwise disable.
+     * @param enable Enable the receive side if true, otherwise disable.
      */
     void SetReceiveEnable(bool enable);
 
     /**
      * Set the encapsulation mode of this device.
      *
-     * \param mode The encapsulation mode of this device.
+     * @param mode The encapsulation mode of this device.
      *
      */
     void SetEncapsulationMode(CsmaNetDevice::EncapsulationMode mode);
@@ -202,7 +202,7 @@
     /**
      * Get the encapsulation mode of this device.
      *
-     * \returns The encapsulation mode of this device.
+     * @returns The encapsulation mode of this device.
      */
     CsmaNetDevice::EncapsulationMode GetEncapsulationMode();
 
@@ -223,7 +223,7 @@
     bool IsMulticast() const override;
 
     /**
-     * \brief Make and return a MAC multicast address using the provided
+     * @brief Make and return a MAC multicast address using the provided
      *        multicast group
      *
      * \RFC{1112} says that an Ipv4 host group address is mapped to an Ethernet
@@ -235,45 +235,45 @@
      * to an EUI-48-based CSMA device.  This MAC address is encapsulated in an
      *  abstract Address to avoid dependencies on the exact address format.
      *
-     * \param multicastGroup The IP address for the multicast group destination
+     * @param multicastGroup The IP address for the multicast group destination
      * of the packet.
-     * \return The MAC multicast Address used to send packets to the provided
+     * @return The MAC multicast Address used to send packets to the provided
      * multicast group.
      *
-     * \see Ipv4Address
-     * \see Mac48Address
-     * \see Address
+     * @see Ipv4Address
+     * @see Mac48Address
+     * @see Address
      */
     Address GetMulticast(Ipv4Address multicastGroup) const override;
 
     /**
      * Is this a point to point link?
-     * \returns false.
+     * @returns false.
      */
     bool IsPointToPoint() const override;
 
     /**
      * Is this a bridge?
-     * \returns false.
+     * @returns false.
      */
     bool IsBridge() const override;
 
     /**
      * Start sending a packet down the channel.
-     * \param packet packet to send
-     * \param dest layer 2 destination address
-     * \param protocolNumber protocol number
-     * \return true if successful, false otherwise (drop, ...)
+     * @param packet packet to send
+     * @param dest layer 2 destination address
+     * @param protocolNumber protocol number
+     * @return true if successful, false otherwise (drop, ...)
      */
     bool Send(Ptr<Packet> packet, const Address& dest, uint16_t protocolNumber) override;
 
     /**
      * Start sending a packet down the channel, with MAC spoofing
-     * \param packet packet to send
-     * \param source layer 2 source address
-     * \param dest layer 2 destination address
-     * \param protocolNumber protocol number
-     * \return true if successful, false otherwise (drop, ...)
+     * @param packet packet to send
+     * @param source layer 2 source address
+     * @param dest layer 2 destination address
+     * @param protocolNumber protocol number
+     * @return true if successful, false otherwise (drop, ...)
      */
     bool SendFrom(Ptr<Packet> packet,
                   const Address& source,
@@ -283,21 +283,21 @@
     /**
      * Get the node to which this device is attached.
      *
-     * \returns Ptr to the Node to which the device is attached.
+     * @returns Ptr to the Node to which the device is attached.
      */
     Ptr<Node> GetNode() const override;
 
     /**
      * Set the node to which this device is being attached.
      *
-     * \param node Ptr to the Node to which the device is being attached.
+     * @param node Ptr to the Node to which the device is being attached.
      */
     void SetNode(Ptr<Node> node) override;
 
     /**
      * Does this device need to use the address resolution protocol?
      *
-     * \returns True if the encapsulation mode is set to a value that requires
+     * @returns True if the encapsulation mode is set to a value that requires
      * ARP (IP_ARP or LLC).
      */
     bool NeedsArp() const override;
@@ -306,16 +306,16 @@
      * Set the callback to be used to notify higher layers when a packet has been
      * received.
      *
-     * \param cb The callback.
+     * @param cb The callback.
      */
     void SetReceiveCallback(NetDevice::ReceiveCallback cb) override;
 
     /**
-     * \brief Get the MAC multicast address corresponding
+     * @brief Get the MAC multicast address corresponding
      * to the IPv6 address provided.
-     * \param addr IPv6 address
-     * \return the MAC multicast address
-     * \warning Calling this method is invalid if IsMulticast returns not true.
+     * @param addr IPv6 address
+     * @return the MAC multicast address
+     * @warning Calling this method is invalid if IsMulticast returns not true.
      */
     Address GetMulticast(Ipv6Address addr) const override;
 
@@ -327,8 +327,8 @@
      * used by this model.  Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream);
 
@@ -343,10 +343,10 @@
      * Adds the necessary headers and trailers to a packet of data in order to
      * respect the packet type
      *
-     * \param p Packet to which header should be added
-     * \param source MAC source address from which packet should be sent
-     * \param dest MAC destination address to which packet should be sent
-     * \param protocolNumber In some protocols, identifies the type of
+     * @param p Packet to which header should be added
+     * @param source MAC source address from which packet should be sent
+     * @param dest MAC destination address to which packet should be sent
+     * @param protocolNumber In some protocols, identifies the type of
      * payload contained in this packet.
      */
     void AddHeader(Ptr<Packet> p, Mac48Address source, Mac48Address dest, uint16_t protocolNumber);
@@ -355,22 +355,22 @@
     /**
      * Operator = is declared but not implemented.  This disables the assignment
      * operator for CsmaNetDevice objects.
-     * \param o object to copy
-     * \returns the copied object
+     * @param o object to copy
+     * @returns the copied object
      */
     CsmaNetDevice& operator=(const CsmaNetDevice& o);
 
     /**
      * Copy constructor is declared but not implemented.  This disables the
      * copy constructor for CsmaNetDevice objects.
-     * \param o object to copy
+     * @param o object to copy
      */
     CsmaNetDevice(const CsmaNetDevice& o);
 
     /**
      * Initialization function used during object construction.
-     * \param sendEnable if device will be allowed to send
-     * \param receiveEnable if device will be allowed to receive
+     * @param sendEnable if device will be allowed to send
+     * @param receiveEnable if device will be allowed to receive
      */
     void Init(bool sendEnable, bool receiveEnable);
 
@@ -388,8 +388,8 @@
      * If the channel is found to be BUSY, this method reschedules itself for
      * execution at a later time (within the backoff period).
      *
-     * \see CsmaChannel::TransmitStart ()
-     * \see TransmitCompleteEvent ()
+     * @see CsmaChannel::TransmitStart ()
+     * @see TransmitCompleteEvent ()
      */
     void TransmitStart();
 
@@ -406,8 +406,8 @@
      * method, the net device also schedules the TransmitReadyEvent at which
      * time the transmitter becomes ready to send the next packet.
      *
-     * \see CsmaChannel::TransmitEnd ()
-     * \see TransmitReadyEvent ()
+     * @see CsmaChannel::TransmitEnd ()
+     * @see TransmitReadyEvent ()
      */
     void TransmitCompleteEvent();
 
@@ -423,7 +423,7 @@
      * If a packet is in the queue, it is extracted for the queue as the
      * next packet to be transmitted by the net device.
      *
-     * \see TransmitStart ()
+     * @see TransmitStart ()
      */
     void TransmitReadyEvent();
 
@@ -471,7 +471,7 @@
 
     /**
      * The state of the Net Device transmit state machine.
-     * \see TxMachineState
+     * @see TxMachineState
      */
     TxMachineState m_txMachineState;
 
@@ -485,14 +485,14 @@
     /**
      * The data rate that the Net Device uses to simulate packet transmission
      * timing.
-     * \see class DataRate
+     * @see class DataRate
      */
     DataRate m_bps;
 
     /**
      * The interframe gap that the Net Device uses insert time between packet
      * transmission
-     * \see class Time
+     * @see class Time
      */
     Time m_tInterframeGap;
 
@@ -513,7 +513,7 @@
     /**
      * The CsmaChannel to which this CsmaNetDevice has been
      * attached.
-     * \see class CsmaChannel
+     * @see class CsmaChannel
      */
     Ptr<CsmaChannel> m_channel;
 
@@ -521,8 +521,8 @@
      * The Queue which this CsmaNetDevice uses as a packet source.
      * Management of this Queue has been delegated to the CsmaNetDevice
      * and it has the responsibility for deletion.
-     * \see class Queue
-     * \see class DropTailQueue
+     * @see class Queue
+     * @see class DropTailQueue
      */
     Ptr<Queue<Packet>> m_queue;
 
@@ -537,7 +537,7 @@
      * The trace source fired when packets come into the "top" of the device
      * at the L3/L2 transition, before being queued for transmission.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_macTxTrace;
 
@@ -545,7 +545,7 @@
      * The trace source fired when packets coming into the "top" of the device
      * at the L3/L2 transition are dropped before being queued for transmission.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_macTxDropTrace;
 
@@ -554,7 +554,7 @@
      * immediately before being forwarded up to higher layers (at the L2/L3
      * transition).  This is a promiscuous trace.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_macPromiscRxTrace;
 
@@ -563,7 +563,7 @@
      * immediately before being forwarded up to higher layers (at the L2/L3
      * transition).  This is a non-promiscuous trace.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_macRxTrace;
 
@@ -572,7 +572,7 @@
      * but dropped before being forwarded up to higher layers (at the L2/L3
      * transition).
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_macRxDropTrace;
 
@@ -581,7 +581,7 @@
      * process for a packet.  This can happen a number of times as the backoff
      * sequence is repeated with increasing delays.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_macTxBackoffTrace;
 
@@ -589,7 +589,7 @@
      * The trace source fired when a packet begins the transmission process on
      * the medium.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_phyTxBeginTrace;
 
@@ -597,7 +597,7 @@
      * The trace source fired when a packet ends the transmission process on
      * the medium.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_phyTxEndTrace;
 
@@ -605,7 +605,7 @@
      * The trace source fired when the phy layer drops a packet as it tries
      * to transmit it.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_phyTxDropTrace;
 
@@ -613,7 +613,7 @@
      * The trace source fired when a packet begins the reception process from
      * the medium.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_phyRxBeginTrace;
 
@@ -621,14 +621,14 @@
      * The trace source fired when a packet ends the reception process from
      * the medium.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_phyRxEndTrace;
 
     /**
      * The trace source fired when the phy layer drops a packet it has received.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_phyRxDropTrace;
 
@@ -648,7 +648,7 @@
      * this would correspond to the point at which the packet is dispatched to
      * packet sniffers in netif_receive_skb.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_snifferTrace;
 
@@ -668,7 +668,7 @@
      * this would correspond to the point at which the packet is dispatched to
      * packet sniffers in netif_receive_skb.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_promiscSnifferTrace;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/csma-layout/examples/csma-star.cc ns-3.44/src/csma-layout/examples/csma-star.cc
--- ns-3.43/src/csma-layout/examples/csma-star.cc	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/csma-layout/examples/csma-star.cc	2025-03-09 16:55:49.367371000 -0700
@@ -148,16 +148,16 @@
         Address hubLocalAddress(InetSocketAddress(Ipv4Address::GetAny(), port));
         PacketSinkHelper packetSinkHelper("ns3::TcpSocketFactory", hubLocalAddress);
         ApplicationContainer hubApp = packetSinkHelper.Install(star.GetHub());
-        hubApp.Start(Seconds(1.0));
-        hubApp.Stop(Seconds(10.0));
+        hubApp.Start(Seconds(1));
+        hubApp.Stop(Seconds(10));
     }
     else
     {
         Address hubLocalAddress6(Inet6SocketAddress(Ipv6Address::GetAny(), port));
         PacketSinkHelper packetSinkHelper6("ns3::TcpSocketFactory", hubLocalAddress6);
         ApplicationContainer hubApp6 = packetSinkHelper6.Install(star.GetHub());
-        hubApp6.Start(Seconds(1.0));
-        hubApp6.Stop(Seconds(10.0));
+        hubApp6.Start(Seconds(1));
+        hubApp6.Stop(Seconds(10));
     }
 
     //
@@ -184,8 +184,8 @@
         spokeApps.Add(onOffHelper.Install(star.GetSpokeNode(i)));
     }
 
-    spokeApps.Start(Seconds(1.0));
-    spokeApps.Stop(Seconds(10.0));
+    spokeApps.Start(Seconds(1));
+    spokeApps.Stop(Seconds(10));
 
     //
     // Because we are evil, we also add OnOff applications to send TCP to the hub
@@ -214,8 +214,8 @@
         fillApps.Add(onOffHelper.Install(fillNodes.Get(i)));
     }
 
-    fillApps.Start(Seconds(1.0));
-    fillApps.Stop(Seconds(10.0));
+    fillApps.Start(Seconds(1));
+    fillApps.Stop(Seconds(10));
 
     NS_LOG_INFO("Enable static global routing.");
     //
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/csma-layout/model/csma-star-helper.h ns-3.44/src/csma-layout/model/csma-star-helper.h
--- ns-3.43/src/csma-layout/model/csma-star-helper.h	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/csma-layout/model/csma-star-helper.h	2025-03-09 16:55:49.367371000 -0700
@@ -21,14 +21,14 @@
 {
 
 /**
- * \defgroup csmalayout CSMA Layout Helpers
+ * @defgroup csmalayout CSMA Layout Helpers
  *
  */
 
 /**
- * \ingroup csmalayout
+ * @ingroup csmalayout
  *
- * \brief A helper to make it easier to create a star topology
+ * @brief A helper to make it easier to create a star topology
  * with Csma links
  */
 class CsmaStarHelper
@@ -38,11 +38,11 @@
      * Create a CsmaStarHelper in order to easily create
      * star topologies using Csma links
      *
-     * \param numSpokes the number of links attached to
+     * @param numSpokes the number of links attached to
      *        the hub node, creating a total of
      *        numSpokes + 1 nodes
      *
-     * \param csmaHelper the link helper for Csma links,
+     * @param csmaHelper the link helper for Csma links,
      *        used to link nodes together
      */
     CsmaStarHelper(uint32_t numSpokes, CsmaHelper csmaHelper);
@@ -51,80 +51,80 @@
 
   public:
     /**
-     * \returns a node pointer to the hub node in the
+     * @returns a node pointer to the hub node in the
      *          star, i.e., the center node
      */
     Ptr<Node> GetHub() const;
 
     /**
-     * \param i an index into the spokes of the star
+     * @param i an index into the spokes of the star
      *
-     * \returns a node pointer to the node at the indexed spoke
+     * @returns a node pointer to the node at the indexed spoke
      */
     Ptr<Node> GetSpokeNode(uint32_t i) const;
 
     /**
-     * \returns the net-device container which contains all of
+     * @returns the net-device container which contains all of
      *          the devices on the hub node
      */
     NetDeviceContainer GetHubDevices() const;
 
     /**
-     * \returns the net-device container which contains all of
+     * @returns the net-device container which contains all of
      *          the spoke node devices
      */
     NetDeviceContainer GetSpokeDevices() const;
 
     /**
-     * \param i index into the hub interfaces
+     * @param i index into the hub interfaces
      *
-     * \returns Ipv4Address according to indexed hub interface
+     * @returns Ipv4Address according to indexed hub interface
      */
     Ipv4Address GetHubIpv4Address(uint32_t i) const;
 
     /**
-     * \param i index into the hub interfaces
+     * @param i index into the hub interfaces
      *
-     * \returns Ipv6Address according to indexed hub interface
+     * @returns Ipv6Address according to indexed hub interface
      */
     Ipv6Address GetHubIpv6Address(uint32_t i) const;
 
     /**
-     * \param i index into the spoke interfaces
+     * @param i index into the spoke interfaces
      *
-     * \returns Ipv4Address according to indexed spoke interface
+     * @returns Ipv4Address according to indexed spoke interface
      */
     Ipv4Address GetSpokeIpv4Address(uint32_t i) const;
 
     /**
-     * \param i index into the spoke interfaces
+     * @param i index into the spoke interfaces
      *
-     * \returns Ipv6Address according to indexed spoke interface
+     * @returns Ipv6Address according to indexed spoke interface
      */
     Ipv6Address GetSpokeIpv6Address(uint32_t i) const;
 
     /**
-     * \returns the total number of spokes in the star
+     * @returns the total number of spokes in the star
      */
     uint32_t SpokeCount() const;
 
     /**
-     * \param stack an InternetStackHelper which is used to install
+     * @param stack an InternetStackHelper which is used to install
      *              on every node in the star
      */
     void InstallStack(InternetStackHelper stack);
 
     /**
-     * \param address an Ipv4AddressHelper which is used to install
+     * @param address an Ipv4AddressHelper which is used to install
      *                Ipv4 addresses on all the node interfaces in
      *                the star
      */
     void AssignIpv4Addresses(Ipv4AddressHelper address);
 
     /**
-     * \param network an IPv6 Address representing the network portion
+     * @param network an IPv6 Address representing the network portion
      *                of the Ipv6 Address
-     * \param prefix the prefix length
+     * @param prefix the prefix length
      */
     void AssignIpv6Addresses(Ipv6Address network, Ipv6Prefix prefix);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/dsdv/doc/dsdv.h ns-3.44/src/dsdv/doc/dsdv.h
--- ns-3.43/src/dsdv/doc/dsdv.h	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/dsdv/doc/dsdv.h	2025-03-09 16:55:49.371371000 -0700
@@ -22,7 +22,7 @@
 #define DSDV_H
 
 /**
- * \defgroup dsdv DSDV Routing
+ * @defgroup dsdv DSDV Routing
  *
  * This section documents the API of the ns-3 DSDV module. For a
  * generic functional description, please refer to the ns-3 model
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/dsdv/examples/dsdv-manet.cc ns-3.44/src/dsdv/examples/dsdv-manet.cc
--- ns-3.43/src/dsdv/examples/dsdv-manet.cc	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/dsdv/examples/dsdv-manet.cc	2025-03-09 16:55:49.371371000 -0700
@@ -35,15 +35,15 @@
 NS_LOG_COMPONENT_DEFINE("DsdvManetExample");
 
 /**
- * \defgroup dsdv-examples DSDV Examples
- * \ingroup dsdv
- * \ingroup examples
+ * @defgroup dsdv-examples DSDV Examples
+ * @ingroup dsdv
+ * @ingroup examples
  */
 
 /**
- * \ingroup dsdv-examples
+ * @ingroup dsdv-examples
  *
- * \brief DSDV Manet example
+ * @brief DSDV Manet example
  */
 class DsdvManetExample
 {
@@ -51,17 +51,17 @@
     DsdvManetExample();
     /**
      * Run function
-     * \param nWifis The total number of nodes
-     * \param nSinks The total number of receivers
-     * \param totalTime The total simulation time
-     * \param rate The network speed
-     * \param phyMode The physical mode
-     * \param nodeSpeed The node speed
-     * \param periodicUpdateInterval The routing update interval
-     * \param settlingTime The routing update settling time
-     * \param dataStart The data transmission start time
-     * \param printRoutes print the routes if true
-     * \param CSVfileName The CSV file name
+     * @param nWifis The total number of nodes
+     * @param nSinks The total number of receivers
+     * @param totalTime The total simulation time
+     * @param rate The network speed
+     * @param phyMode The physical mode
+     * @param nodeSpeed The node speed
+     * @param periodicUpdateInterval The routing update interval
+     * @param settlingTime The routing update settling time
+     * @param dataStart The data transmission start time
+     * @param printRoutes print the routes if true
+     * @param CSVfileName The CSV file name
      */
     void CaseRun(uint32_t nWifis,
                  uint32_t nSinks,
@@ -99,12 +99,12 @@
     void CreateNodes();
     /**
      * Create and initialize all devices
-     * \param tr_name The trace file name
+     * @param tr_name The trace file name
      */
     void CreateDevices(std::string tr_name);
     /**
      * Create network
-     * \param tr_name The trace file name
+     * @param tr_name The trace file name
      */
     void InstallInternetStack(std::string tr_name);
     /// Create data sinks and sources
@@ -113,14 +113,14 @@
     void SetupMobility();
     /**
      * Packet receive function
-     * \param socket The communication socket
+     * @param socket The communication socket
      */
     void ReceivePacket(Ptr<Socket> socket);
     /**
      * Setup packet receivers
-     * \param addr the receiving IPv4 address
-     * \param node the receiving node
-     * \returns the communication socket
+     * @param addr the receiving IPv4 address
+     * @param node the receiving node
+     * @returns the communication socket
      */
     Ptr<Socket> SetupPacketReceive(Ipv4Address addr, Ptr<Node> node);
     /// Check network throughput
@@ -229,7 +229,7 @@
 
     out.close();
     packetsReceived = 0;
-    Simulator::Schedule(Seconds(1.0), &DsdvManetExample::CheckThroughput, this);
+    Simulator::Schedule(Seconds(1), &DsdvManetExample::CheckThroughput, this);
 }
 
 Ptr<Socket>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/dsdv/helper/dsdv-helper.h ns-3.44/src/dsdv/helper/dsdv-helper.h
--- ns-3.43/src/dsdv/helper/dsdv-helper.h	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/dsdv/helper/dsdv-helper.h	2025-03-09 16:55:49.371371000 -0700
@@ -29,8 +29,8 @@
 namespace ns3
 {
 /**
- * \ingroup dsdv
- * \brief Helper class that adds DSDV routing to nodes.
+ * @ingroup dsdv
+ * @brief Helper class that adds DSDV routing to nodes.
  */
 class DsdvHelper : public Ipv4RoutingHelper
 {
@@ -38,7 +38,7 @@
     DsdvHelper();
     ~DsdvHelper() override;
     /**
-     * \returns pointer to clone of this DsdvHelper
+     * @returns pointer to clone of this DsdvHelper
      *
      * This method is mainly for internal use by the other helpers;
      * clients are expected to free the dynamic memory allocated by this method
@@ -46,16 +46,16 @@
     DsdvHelper* Copy() const override;
 
     /**
-     * \param node the node on which the routing protocol will run
-     * \returns a newly-created routing protocol
+     * @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
      *
      */
     Ptr<Ipv4RoutingProtocol> Create(Ptr<Node> node) const override;
     /**
-     * \param name the name of the attribute to set
-     * \param value the value of the attribute to set.
+     * @param name the name of the attribute to set
+     * @param value the value of the attribute to set.
      *
      * This method controls the attributes of ns3::dsdv::RoutingProtocol
      */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/dsdv/model/dsdv-packet.h ns-3.44/src/dsdv/model/dsdv-packet.h
--- ns-3.43/src/dsdv/model/dsdv-packet.h	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/dsdv/model/dsdv-packet.h	2025-03-09 16:55:49.371371000 -0700
@@ -31,9 +31,9 @@
 namespace dsdv
 {
 /**
- * \ingroup dsdv
- * \brief DSDV Update Packet Format
- * \verbatim
+ * @ingroup dsdv
+ * @brief DSDV Update Packet Format
+ * @verbatim
  |      0        |      1        |      2        |       3       |
   0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
@@ -43,7 +43,7 @@
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                       Sequence Number                         |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * \endverbatim
+ * @endverbatim
  */
 
 class DsdvHeader : public Header
@@ -52,15 +52,15 @@
     /**
      * Constructor
      *
-     * \param dst destination IP address
-     * \param hopcount hop count
-     * \param dstSeqNo destination sequence number
+     * @param dst destination IP address
+     * @param hopcount hop count
+     * @param dstSeqNo destination sequence number
      */
     DsdvHeader(Ipv4Address dst = Ipv4Address(), uint32_t hopcount = 0, uint32_t dstSeqNo = 0);
     ~DsdvHeader() override;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -71,7 +71,7 @@
 
     /**
      * Set destination address
-     * \param destination the destination IPv4 address
+     * @param destination the destination IPv4 address
      */
     void SetDst(Ipv4Address destination)
     {
@@ -80,7 +80,7 @@
 
     /**
      * Get destination address
-     * \returns the destination IPv4 address
+     * @returns the destination IPv4 address
      */
     Ipv4Address GetDst() const
     {
@@ -89,7 +89,7 @@
 
     /**
      * Set hop count
-     * \param hopCount the hop count
+     * @param hopCount the hop count
      */
     void SetHopCount(uint32_t hopCount)
     {
@@ -98,7 +98,7 @@
 
     /**
      * Get hop count
-     * \returns the hop count
+     * @returns the hop count
      */
     uint32_t GetHopCount() const
     {
@@ -107,7 +107,7 @@
 
     /**
      * Set destination sequence number
-     * \param sequenceNumber The sequence number
+     * @param sequenceNumber The sequence number
      */
     void SetDstSeqno(uint32_t sequenceNumber)
     {
@@ -116,7 +116,7 @@
 
     /**
      * Get destination sequence number
-     * \returns the destination sequence number
+     * @returns the destination sequence number
      */
     uint32_t GetDstSeqno() const
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/dsdv/model/dsdv-packet-queue.cc ns-3.44/src/dsdv/model/dsdv-packet-queue.cc
--- ns-3.43/src/dsdv/model/dsdv-packet-queue.cc	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/dsdv/model/dsdv-packet-queue.cc	2025-03-09 16:55:49.371371000 -0700
@@ -139,14 +139,14 @@
 struct IsExpired
 {
     /**
-     * \brief Check for expired entry
-     * \param e QueueEntry to check
-     * \return true if expired
+     * @brief Check for expired entry
+     * @param e QueueEntry to check
+     * @return true if expired
      */
     bool operator()(const QueueEntry& e) const
     {
         // NS_LOG_DEBUG("Expire time for packet in req queue: "<<e.GetExpireTime ());
-        return (e.GetExpireTime() < Seconds(0));
+        return (e.GetExpireTime().IsStrictlyNegative());
     }
 };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/dsdv/model/dsdv-packet-queue.h ns-3.44/src/dsdv/model/dsdv-packet-queue.h
--- ns-3.43/src/dsdv/model/dsdv-packet-queue.h	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/dsdv/model/dsdv-packet-queue.h	2025-03-09 16:55:49.371371000 -0700
@@ -30,8 +30,8 @@
 namespace dsdv
 {
 /**
- * \ingroup dsdv
- * \brief DSDV Queue Entry
+ * @ingroup dsdv
+ * @brief DSDV Queue Entry
  */
 class QueueEntry
 {
@@ -44,10 +44,10 @@
     /**
      * c-tor
      *
-     * \param pa the packet to create the entry
-     * \param h the Ipv4Header
-     * \param ucb the UnicastForwardCallback function
-     * \param ecb the ErrorCallback function
+     * @param pa the packet to create the entry
+     * @param h the Ipv4Header
+     * @param ucb the UnicastForwardCallback function
+     * @param ecb the ErrorCallback function
      */
     QueueEntry(Ptr<const Packet> pa = nullptr,
                const Ipv4Header& h = Ipv4Header(),
@@ -57,14 +57,14 @@
           m_header(h),
           m_ucb(ucb),
           m_ecb(ecb),
-          m_expire(Seconds(0))
+          m_expire()
     {
     }
 
     /**
      * Compare queue entries
-     * \param o QueueEntry to compare
-     * \return true if equal
+     * @param o QueueEntry to compare
+     * @return true if equal
      */
     bool operator==(const QueueEntry& o) const
     {
@@ -76,7 +76,7 @@
     // Fields
     /**
      * Get unicast forward callback function
-     * \returns the unicast forward callback
+     * @returns the unicast forward callback
      */
     UnicastForwardCallback GetUnicastForwardCallback() const
     {
@@ -85,7 +85,7 @@
 
     /**
      * Set unicast forward callback function
-     * \param ucb the unicast forward callback
+     * @param ucb the unicast forward callback
      */
     void SetUnicastForwardCallback(UnicastForwardCallback ucb)
     {
@@ -94,7 +94,7 @@
 
     /**
      * Get error callback function
-     * \returns the error callback
+     * @returns the error callback
      */
     ErrorCallback GetErrorCallback() const
     {
@@ -103,7 +103,7 @@
 
     /**
      * Set error callback function
-     * \param ecb the error callback
+     * @param ecb the error callback
      */
     void SetErrorCallback(ErrorCallback ecb)
     {
@@ -112,7 +112,7 @@
 
     /**
      * Get packet
-     * \returns the current packet
+     * @returns the current packet
      */
     Ptr<const Packet> GetPacket() const
     {
@@ -121,7 +121,7 @@
 
     /**
      * Set packet
-     * \param p The current packet
+     * @param p The current packet
      */
     void SetPacket(Ptr<const Packet> p)
     {
@@ -130,7 +130,7 @@
 
     /**
      * Get IP header
-     * \returns the IPv4 header
+     * @returns the IPv4 header
      */
     Ipv4Header GetIpv4Header() const
     {
@@ -139,7 +139,7 @@
 
     /**
      * Set IP header
-     * \param h The IPv4 header
+     * @param h The IPv4 header
      */
     void SetIpv4Header(Ipv4Header h)
     {
@@ -148,7 +148,7 @@
 
     /**
      * Set expire time
-     * \param exp
+     * @param exp
      */
     void SetExpireTime(Time exp)
     {
@@ -157,7 +157,7 @@
 
     /**
      * Get expire time
-     * \returns the expire time
+     * @returns the expire time
      */
     Time GetExpireTime() const
     {
@@ -178,8 +178,8 @@
 };
 
 /**
- * \ingroup dsdv
- * \brief DSDV Packet queue
+ * @ingroup dsdv
+ * @brief DSDV Packet queue
  *
  * When a route is not available, the packets are queued. Every node can buffer up to 5 packets per
  * destination. We have implemented a "drop front on full" queue where the first queued packet will
@@ -196,45 +196,45 @@
     /**
      * Push entry in queue, if there is no entry with the same packet and destination address in
      * queue.
-     * \param entry QueueEntry to compare
-     * \return true if successful
+     * @param entry QueueEntry to compare
+     * @return true if successful
      */
     bool Enqueue(QueueEntry& entry);
     /**
      * Return first found (the earliest) entry for given destination
      *
-     * \param dst the destination IP address
-     * \param entry the queue entry
-     * \returns true if successful
+     * @param dst the destination IP address
+     * @param entry the queue entry
+     * @returns true if successful
      */
     bool Dequeue(Ipv4Address dst, QueueEntry& entry);
     /**
      * Remove all packets with destination IP address dst
-     * \param dst the destination IP address
+     * @param dst the destination IP address
      */
     void DropPacketWithDst(Ipv4Address dst);
     /**
      * Finds whether a packet with destination dst exists in the queue
-     * \param dst the destination IP address
-     * \returns true if a packet found
+     * @param dst the destination IP address
+     * @returns true if a packet found
      */
     bool Find(Ipv4Address dst);
     /**
      * Get count of packets with destination dst in the queue
-     * \param dst the destination IP address
-     * \returns the count
+     * @param dst the destination IP address
+     * @returns the count
      */
     uint32_t GetCountForPacketsWithDst(Ipv4Address dst);
     /**
      * Get the number of entries
-     * \returns the number of entries
+     * @returns the number of entries
      */
     uint32_t GetSize();
 
     // Fields
     /**
      * Get maximum queue length
-     * \returns the maximum queue length
+     * @returns the maximum queue length
      */
     uint32_t GetMaxQueueLen() const
     {
@@ -243,7 +243,7 @@
 
     /**
      * Set maximum queue length
-     * \param len the maximum queue length
+     * @param len the maximum queue length
      */
     void SetMaxQueueLen(uint32_t len)
     {
@@ -252,7 +252,7 @@
 
     /**
      * Get maximum packets per destination
-     * \returns the maximum packets per destination
+     * @returns the maximum packets per destination
      */
     uint32_t GetMaxPacketsPerDst() const
     {
@@ -261,7 +261,7 @@
 
     /**
      * Set maximum packets per destination
-     * \param len The maximum packets per destination
+     * @param len The maximum packets per destination
      */
     void SetMaxPacketsPerDst(uint32_t len)
     {
@@ -270,7 +270,7 @@
 
     /**
      * Get queue timeout
-     * \returns the queue timeout
+     * @returns the queue timeout
      */
     Time GetQueueTimeout() const
     {
@@ -279,7 +279,7 @@
 
     /**
      * Set queue timeout
-     * \param t The queue timeout
+     * @param t The queue timeout
      */
     void SetQueueTimeout(Time t)
     {
@@ -292,8 +292,8 @@
     void Purge();
     /**
      * Notify that the packet is dropped from queue due to timeout
-     * \param en the queue entry
-     * \param reason the reason for the packet drop
+     * @param en the queue entry
+     * @param reason the reason for the packet drop
      */
     void Drop(QueueEntry en, std::string reason);
     /// The maximum number of packets that we allow a routing protocol to buffer.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/dsdv/model/dsdv-routing-protocol.cc ns-3.44/src/dsdv/model/dsdv-routing-protocol.cc
--- ns-3.43/src/dsdv/model/dsdv-routing-protocol.cc	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/dsdv/model/dsdv-routing-protocol.cc	2025-03-09 16:55:49.371371000 -0700
@@ -50,7 +50,7 @@
     /**
      * Constructor
      *
-     * \param o outgoing interface (OIF)
+     * @param o outgoing interface (OIF)
      */
     DeferredRouteOutputTag(int32_t o = -1)
         : Tag(),
@@ -59,8 +59,8 @@
     }
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId()
     {
@@ -1213,7 +1213,7 @@
     m_routingTable.LookupRoute(address, mainrt);
     if (EnableWST)
     {
-        if (mainrt.GetSettlingTime() == Seconds(0))
+        if (mainrt.GetSettlingTime().IsZero())
         {
             return Seconds(0);
         }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/dsdv/model/dsdv-routing-protocol.h ns-3.44/src/dsdv/model/dsdv-routing-protocol.h
--- ns-3.43/src/dsdv/model/dsdv-routing-protocol.h	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/dsdv/model/dsdv-routing-protocol.h	2025-03-09 16:55:49.371371000 -0700
@@ -38,15 +38,15 @@
 {
 
 /**
- * \ingroup dsdv
- * \brief DSDV routing protocol.
+ * @ingroup dsdv
+ * @brief DSDV routing protocol.
  */
 class RoutingProtocol : public Ipv4RoutingProtocol
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     static const uint32_t DSDV_PORT;
@@ -64,14 +64,14 @@
                                Socket::SocketErrno& sockerr) override;
     /**
      * Route input packet
-     * \param p The packet
-     * \param header The IPv4 header
-     * \param idev The device
-     * \param ucb The unicast forward callback
-     * \param mcb The multicast forward callback
-     * \param lcb The local deliver callback
-     * \param ecb The error callback
-     * \returns true if successful
+     * @param p The packet
+     * @param header The IPv4 header
+     * @param idev The device
+     * @param ucb The unicast forward callback
+     * @param mcb The multicast forward callback
+     * @param lcb The local deliver callback
+     * @param ecb The error callback
+     * @returns true if successful
      */
     bool RouteInput(Ptr<const Packet> p,
                     const Ipv4Header& header,
@@ -91,32 +91,32 @@
     // Methods to handle protocol parameters
     /**
      * Set enable buffer flag
-     * \param f The enable buffer flag
+     * @param f The enable buffer flag
      */
     void SetEnableBufferFlag(bool f);
     /**
      * Get enable buffer flag
-     * \returns the enable buffer flag
+     * @returns the enable buffer flag
      */
     bool GetEnableBufferFlag() const;
     /**
      * Set weighted settling time (WST) flag
-     * \param f the weighted settling time (WST) flag
+     * @param f the weighted settling time (WST) flag
      */
     void SetWSTFlag(bool f);
     /**
      * Get weighted settling time (WST) flag
-     * \returns the weighted settling time (WST) flag
+     * @returns the weighted settling time (WST) flag
      */
     bool GetWSTFlag() const;
     /**
      * Set enable route aggregation (RA) flag
-     * \param f the enable route aggregation (RA) flag
+     * @param f the enable route aggregation (RA) flag
      */
     void SetEnableRAFlag(bool f);
     /**
      * Get enable route aggregation (RA) flag
-     * \returns the enable route aggregation (RA) flag
+     * @returns the enable route aggregation (RA) flag
      */
     bool GetEnableRAFlag() const;
 
@@ -125,8 +125,8 @@
      * used by this model.  Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream);
 
@@ -186,10 +186,10 @@
     void Start();
     /**
      * Queue packet until we find a route
-     * \param p the packet to route
-     * \param header the Ipv4Header
-     * \param ucb the UnicastForwardCallback function
-     * \param ecb the ErrorCallback function
+     * @param p the packet to route
+     * @param header the Ipv4Header
+     * @param ucb the UnicastForwardCallback function
+     * @param ecb the ErrorCallback function
      */
     void DeferredRouteOutput(Ptr<const Packet> p,
                              const Ipv4Header& header,
@@ -199,43 +199,43 @@
     void LookForQueuedPackets();
     /**
      * Send packet from queue
-     * \param dst - destination address to which we are sending the packet to
-     * \param route - route identified for this packet
+     * @param dst - destination address to which we are sending the packet to
+     * @param route - route identified for this packet
      */
     void SendPacketFromQueue(Ipv4Address dst, Ptr<Ipv4Route> route);
     /**
      * Find socket with local interface address iface
-     * \param iface the interface
-     * \returns the socket
+     * @param iface the interface
+     * @returns the socket
      */
     Ptr<Socket> FindSocketWithInterfaceAddress(Ipv4InterfaceAddress iface) const;
 
     // Receive dsdv control packets
     /**
      * Receive and process dsdv control packet
-     * \param socket the socket for receiving dsdv control packets
+     * @param socket the socket for receiving dsdv control packets
      */
     void RecvDsdv(Ptr<Socket> socket);
     /**
      * Send a packet
-     * \param route the route
-     * \param packet the packet
-     * \param header the IPv4 header
+     * @param route the route
+     * @param packet the packet
+     * @param header the IPv4 header
      */
     void Send(Ptr<Ipv4Route> route, Ptr<const Packet> packet, const Ipv4Header& header);
 
     /**
      * Create loopback route for given header
      *
-     * \param header the IP header
-     * \param oif the device
-     * \returns the route
+     * @param header the IP header
+     * @param oif the device
+     * @returns the route
      */
     Ptr<Ipv4Route> LoopbackRoute(const Ipv4Header& header, Ptr<NetDevice> oif) const;
     /**
      * Get settlingTime for a destination
-     * \param dst - destination address
-     * \return settlingTime for the destination if found
+     * @param dst - destination address
+     * @return settlingTime for the destination if found
      */
     Time GetSettlingTime(Ipv4Address dst);
     /// Sends trigger update from a node
@@ -246,9 +246,9 @@
     void MergeTriggerPeriodicUpdates();
     /**
      * Notify that packet is dropped for some reason
-     * \param packet the dropped packet
-     * \param header the IPv4 header
-     * \param err the error number
+     * @param packet the dropped packet
+     * @param header the IPv4 header
+     * @param err the error number
      */
     void Drop(Ptr<const Packet> packet, const Ipv4Header& header, Socket::SocketErrno err);
     /// Timer to trigger periodic updates from a node
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/dsdv/model/dsdv-rtable.cc ns-3.44/src/dsdv/model/dsdv-rtable.cc
--- ns-3.43/src/dsdv/model/dsdv-rtable.cc	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/dsdv/model/dsdv-rtable.cc	2025-03-09 16:55:49.371371000 -0700
@@ -240,7 +240,7 @@
             ++i;
             m_ipv4AddressEntry.erase(itmp);
         }
-        /** \todo Need to decide when to invalidate a route */
+        /** @todo Need to decide when to invalidate a route */
         /*          else if (i->second.GetLifeTime() > m_holddownTime)
          {
          ++i;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/dsdv/model/dsdv-rtable.h ns-3.44/src/dsdv/model/dsdv-rtable.h
--- ns-3.43/src/dsdv/model/dsdv-rtable.h	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/dsdv/model/dsdv-rtable.h	2025-03-09 16:55:49.371371000 -0700
@@ -41,8 +41,8 @@
 };
 
 /**
- * \ingroup dsdv
- * \brief Routing table entry
+ * @ingroup dsdv
+ * @brief Routing table entry
  */
 class RoutingTableEntry
 {
@@ -50,15 +50,15 @@
     /**
      * c-tor
      *
-     * \param dev the net device
-     * \param dst the destination IP address
-     * \param seqNo the sequence number
-     * \param iface the interface
-     * \param hops the number of hops
-     * \param nextHop the IP address of the next hop
-     * \param lifetime the lifetime
-     * \param settlingTime the settling time
-     * \param changedEntries flag for changed entries
+     * @param dev the net device
+     * @param dst the destination IP address
+     * @param seqNo the sequence number
+     * @param iface the interface
+     * @param hops the number of hops
+     * @param nextHop the IP address of the next hop
+     * @param lifetime the lifetime
+     * @param settlingTime the settling time
+     * @param changedEntries flag for changed entries
      */
     RoutingTableEntry(Ptr<NetDevice> dev = nullptr,
                       Ipv4Address dst = Ipv4Address(),
@@ -74,7 +74,7 @@
 
     /**
      * Get destination IP address
-     * \returns the destination IPv4 address
+     * @returns the destination IPv4 address
      */
     Ipv4Address GetDestination() const
     {
@@ -83,7 +83,7 @@
 
     /**
      * Get route
-     * \returns the IPv4 route
+     * @returns the IPv4 route
      */
     Ptr<Ipv4Route> GetRoute() const
     {
@@ -92,7 +92,7 @@
 
     /**
      * Set route
-     * \param route the IPv4 route
+     * @param route the IPv4 route
      */
     void SetRoute(Ptr<Ipv4Route> route)
     {
@@ -101,7 +101,7 @@
 
     /**
      * Set next hop
-     * \param nextHop the IPv4 address of the next hop
+     * @param nextHop the IPv4 address of the next hop
      */
     void SetNextHop(Ipv4Address nextHop)
     {
@@ -110,7 +110,7 @@
 
     /**
      * Get next hop
-     * \returns the IPv4 address of the next hop
+     * @returns the IPv4 address of the next hop
      */
     Ipv4Address GetNextHop() const
     {
@@ -119,7 +119,7 @@
 
     /**
      * Set output device
-     * \param device the output device
+     * @param device the output device
      */
     void SetOutputDevice(Ptr<NetDevice> device)
     {
@@ -128,7 +128,7 @@
 
     /**
      * Get output device
-     * \returns the output device
+     * @returns the output device
      */
     Ptr<NetDevice> GetOutputDevice() const
     {
@@ -137,7 +137,7 @@
 
     /**
      * Get interface address
-     * \returns the IPv4 interface address
+     * @returns the IPv4 interface address
      */
     Ipv4InterfaceAddress GetInterface() const
     {
@@ -146,7 +146,7 @@
 
     /**
      * Set interface address
-     * \param iface the IPv4 interface address
+     * @param iface the IPv4 interface address
      */
     void SetInterface(Ipv4InterfaceAddress iface)
     {
@@ -155,7 +155,7 @@
 
     /**
      * Set sequence number
-     * \param sequenceNumber the sequence number
+     * @param sequenceNumber the sequence number
      */
     void SetSeqNo(uint32_t sequenceNumber)
     {
@@ -164,7 +164,7 @@
 
     /**
      * Get sequence number
-     * \returns the sequence number
+     * @returns the sequence number
      */
     uint32_t GetSeqNo() const
     {
@@ -173,7 +173,7 @@
 
     /**
      * Set hop
-     * \param hopCount the hop count
+     * @param hopCount the hop count
      */
     void SetHop(uint32_t hopCount)
     {
@@ -182,7 +182,7 @@
 
     /**
      * Get hop
-     * \returns the hop count
+     * @returns the hop count
      */
     uint32_t GetHop() const
     {
@@ -191,7 +191,7 @@
 
     /**
      * Set lifetime
-     * \param lifeTime the lifetime value
+     * @param lifeTime the lifetime value
      */
     void SetLifeTime(Time lifeTime)
     {
@@ -200,7 +200,7 @@
 
     /**
      * Get lifetime
-     * \returns the lifetime value
+     * @returns the lifetime value
      */
     Time GetLifeTime() const
     {
@@ -209,7 +209,7 @@
 
     /**
      * Set settling time
-     * \param settlingTime the settling time
+     * @param settlingTime the settling time
      */
     void SetSettlingTime(Time settlingTime)
     {
@@ -218,7 +218,7 @@
 
     /**
      * Get settling time
-     * \returns the settling time
+     * @returns the settling time
      */
     Time GetSettlingTime() const
     {
@@ -227,7 +227,7 @@
 
     /**
      * Set route flags
-     * \param flag the route flags
+     * @param flag the route flags
      */
     void SetFlag(RouteFlags flag)
     {
@@ -236,7 +236,7 @@
 
     /**
      * Get route flags
-     * \returns the route flags
+     * @returns the route flags
      */
     RouteFlags GetFlag() const
     {
@@ -245,7 +245,7 @@
 
     /**
      * Set entries changed indicator
-     * \param entriesChanged
+     * @param entriesChanged
      */
     void SetEntriesChanged(bool entriesChanged)
     {
@@ -254,7 +254,7 @@
 
     /**
      * Get entries changed
-     * \returns the entries changed flag
+     * @returns the entries changed flag
      */
     bool GetEntriesChanged() const
     {
@@ -262,9 +262,9 @@
     }
 
     /**
-     * \brief Compare destination address
-     * \param destination destination node IP address
-     * \return true if equal
+     * @brief Compare destination address
+     * @param destination destination node IP address
+     * @return true if equal
      */
     bool operator==(const Ipv4Address destination) const
     {
@@ -273,8 +273,8 @@
 
     /**
      * Print routing table entry
-     * \param stream the output stream
-     * \param unit the Time unit
+     * @param stream the output stream
+     * @param unit the Time unit
      */
     void Print(Ptr<OutputStreamWrapper> stream, Time::Unit unit = Time::S) const;
 
@@ -285,7 +285,7 @@
     /// Hop Count (number of hops needed to reach destination)
     uint32_t m_hops;
     /**
-     * \brief Expiration or deletion time of the route
+     * @brief Expiration or deletion time of the route
      * Lifetime field in the routing table plays dual role --
      * for an active route it is the expiration time, and for an invalid route
      * it is the deletion time.
@@ -310,8 +310,8 @@
 };
 
 /**
- * \ingroup dsdv
- * \brief The Routing table used by DSDV protocol
+ * @ingroup dsdv
+ * @brief The Routing table used by DSDV protocol
  */
 class RoutingTable
 {
@@ -320,53 +320,53 @@
     RoutingTable();
     /**
      * Add routing table entry if it doesn't yet exist in routing table
-     * \param r routing table entry
-     * \return true in success
+     * @param r routing table entry
+     * @return true in success
      */
     bool AddRoute(RoutingTableEntry& r);
     /**
      * Delete routing table entry with destination address dst, if it exists.
-     * \param dst destination address
-     * \return true on success
+     * @param dst destination address
+     * @return true on success
      */
     bool DeleteRoute(Ipv4Address dst);
     /**
      * Lookup routing table entry with destination address dst
-     * \param dst destination address
-     * \param rt entry with destination address dst, if exists
-     * \return true on success
+     * @param dst destination address
+     * @param rt entry with destination address dst, if exists
+     * @return true on success
      */
     bool LookupRoute(Ipv4Address dst, RoutingTableEntry& rt);
     /**
      * Lookup routing table entry with destination address dst
-     * \param id destination address
-     * \param rt entry with destination address dst, if exists
-     * \param forRouteInput for routing input
-     * \return true onns3  success
+     * @param id destination address
+     * @param rt entry with destination address dst, if exists
+     * @param forRouteInput for routing input
+     * @return true onns3  success
      */
     bool LookupRoute(Ipv4Address id, RoutingTableEntry& rt, bool forRouteInput);
     /**
      * Updating the routing Table with routing table entry rt
-     * \param rt routing table entry
-     * \return true on success
+     * @param rt routing table entry
+     * @return true on success
      */
     bool Update(RoutingTableEntry& rt);
     /**
      * Lookup list of addresses for which nxtHp is the next Hop address
-     * \param nxtHp nexthop's address for which we want the list of destinations
-     * \param dstList is the list that will hold all these destination addresses
+     * @param nxtHp nexthop's address for which we want the list of destinations
+     * @param dstList is the list that will hold all these destination addresses
      */
     void GetListOfDestinationWithNextHop(Ipv4Address nxtHp,
                                          std::map<Ipv4Address, RoutingTableEntry>& dstList);
     /**
      * Lookup list of all addresses in the routing table
-     * \param allRoutes is the list that will hold all these addresses present in the nodes routing
+     * @param allRoutes is the list that will hold all these addresses present in the nodes routing
      * table
      */
     void GetListOfAllRoutes(std::map<Ipv4Address, RoutingTableEntry>& allRoutes);
     /**
      * Delete all route from interface with address iface
-     * \param iface the interface
+     * @param iface the interface
      */
     void DeleteAllRoutesFromInterface(Ipv4InterfaceAddress iface);
 
@@ -378,58 +378,58 @@
 
     /**
      * Delete all outdated entries if Lifetime is expired
-     * \param removedAddresses is the list of addresses to purge
+     * @param removedAddresses is the list of addresses to purge
      */
     void Purge(std::map<Ipv4Address, RoutingTableEntry>& removedAddresses);
     /**
      * Print routing table
-     * \param stream the output stream
-     * \param unit the Time unit
+     * @param stream the output stream
+     * @param unit the Time unit
      */
     void Print(Ptr<OutputStreamWrapper> stream, Time::Unit unit = Time::S) const;
     /**
      * Provides the number of routes present in that nodes routing table.
-     * \returns the number of routes
+     * @returns the number of routes
      */
     uint32_t RoutingTableSize();
     /**
      * Add an event for a destination address so that the update to for that destination is sent
      * after the event is completed.
-     * \param address destination address for which this event is running.
-     * \param id unique eventid that was generated.
-     * \return true on success
+     * @param address destination address for which this event is running.
+     * @param id unique eventid that was generated.
+     * @return true on success
      */
     bool AddIpv4Event(Ipv4Address address, EventId id);
     /**
      * Clear up the entry from the map after the event is completed
-     * \param address destination address for which this event is running.
-     * \return true on success
+     * @param address destination address for which this event is running.
+     * @return true on success
      */
     bool DeleteIpv4Event(Ipv4Address address);
     /**
      * Force delete an update waiting for settling time to complete as a better update to
      * same destination was received.
-     * \param address destination address for which this event is running.
-     * \return true on success
+     * @param address destination address for which this event is running.
+     * @return true on success
      */
     bool AnyRunningEvent(Ipv4Address address);
     /**
      * Force delete an update waiting for settling time to complete as a better update to
      * same destination was received.
-     * \param address destination address for which this event is running.
-     * \return true on finding out that an event is already running for that destination address.
+     * @param address destination address for which this event is running.
+     * @return true on finding out that an event is already running for that destination address.
      */
     bool ForceDeleteIpv4Event(Ipv4Address address);
     /**
      * Get the EventId associated with that address.
-     * \param address destination address for which this event is running.
-     * \return EventId on finding out an event is associated else return NULL.
+     * @param address destination address for which this event is running.
+     * @return EventId on finding out an event is associated else return NULL.
      */
     EventId GetEventId(Ipv4Address address);
 
     /**
      * Get hold down time (time until an invalid route may be deleted)
-     * \returns the hold down time
+     * @returns the hold down time
      */
     Time Getholddowntime() const
     {
@@ -438,7 +438,7 @@
 
     /**
      * Set hold down time (time until an invalid route may be deleted)
-     * \param t the hold down time
+     * @param t the hold down time
      */
     void Setholddowntime(Time t)
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/dsdv/test/dsdv-testcase.cc ns-3.44/src/dsdv/test/dsdv-testcase.cc
--- ns-3.43/src/dsdv/test/dsdv-testcase.cc	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/dsdv/test/dsdv-testcase.cc	2025-03-09 16:55:49.371371000 -0700
@@ -34,15 +34,15 @@
 using namespace ns3;
 
 /**
- * \ingroup dsdv
- * \ingroup tests
- * \defgroup dsdv-test DSDV module tests
+ * @ingroup dsdv
+ * @ingroup tests
+ * @defgroup dsdv-test DSDV module tests
  */
 
 /**
- * \ingroup dsdv-test
+ * @ingroup dsdv-test
  *
- * \brief DSDV test case to verify the DSDV header
+ * @brief DSDV test case to verify the DSDV header
  *
  */
 class DsdvHeaderTestCase : public TestCase
@@ -98,9 +98,9 @@
 }
 
 /**
- * \ingroup dsdv-test
+ * @ingroup dsdv-test
  *
- * \brief DSDV routing table tests (adding and looking up routes)
+ * @brief DSDV routing table tests (adding and looking up routes)
  */
 class DsdvTableTestCase : public TestCase
 {
@@ -199,9 +199,9 @@
 }
 
 /**
- * \ingroup dsdv-test
+ * @ingroup dsdv-test
  *
- * \brief DSDV test suite
+ * @brief DSDV test suite
  */
 class DsdvTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/dsr/doc/dsr.h ns-3.44/src/dsr/doc/dsr.h
--- ns-3.43/src/dsr/doc/dsr.h	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/dsr/doc/dsr.h	2025-03-09 16:55:49.371371000 -0700
@@ -21,7 +21,7 @@
 #define DSR_H
 
 /**
- * \defgroup dsr DSR Routing
+ * @defgroup dsr DSR Routing
  *
  * This section documents the API of the ns-3 DSR module. For a
  * generic functional description, please refer to the ns-3 model
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/dsr/doc/dsr.rst ns-3.44/src/dsr/doc/dsr.rst
--- ns-3.43/src/dsr/doc/dsr.rst	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/dsr/doc/dsr.rst	2025-03-09 16:55:49.371371000 -0700
@@ -199,6 +199,8 @@
 
 The model full compliance with the RFC is planned for the future.
 
+At the moment, the model does not handle ICMP packets, and assumes that traffic is either TCP or UDP.
+
 References
 **********
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/dsr/examples/dsr-example.cc ns-3.44/src/dsr/examples/dsr-example.cc
--- ns-3.43/src/dsr/examples/dsr-example.cc	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/dsr/examples/dsr-example.cc	2025-03-09 16:55:49.371371000 -0700
@@ -183,7 +183,7 @@
         PacketSinkHelper sink("ns3::UdpSocketFactory",
                               InetSocketAddress(Ipv4Address::GetAny(), port));
         ApplicationContainer apps_sink = sink.Install(adhocNodes.Get(i));
-        apps_sink.Start(Seconds(0.0));
+        apps_sink.Start(Seconds(0));
         apps_sink.Stop(Seconds(TotalTime));
 
         OnOffHelper onoff1("ns3::UdpSocketFactory",
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/dsr/helper/dsr-helper.h ns-3.44/src/dsr/helper/dsr-helper.h
--- ns-3.43/src/dsr/helper/dsr-helper.h	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/dsr/helper/dsr-helper.h	2025-03-09 16:55:49.371371000 -0700
@@ -32,9 +32,9 @@
 {
 
 /**
- * \ingroup dsr
+ * @ingroup dsr
  *
- * \brief DSR helper class to manage creation of DSR routing instance and
+ * @brief DSR helper class to manage creation of DSR routing instance and
  *        to insert it on a node as a sublayer between transport and
  *        IP layers.
  */
@@ -52,27 +52,27 @@
     DsrHelper& operator=(const DsrHelper&) = delete;
 
     /**
-     * \brief Construct an DsrHelper from another previously initialized instance
+     * @brief Construct an DsrHelper from another previously initialized instance
      * (Copy Constructor).
-     * \param o object to copy from
+     * @param o object to copy from
      */
     DsrHelper(const DsrHelper& o);
     /**
-     * \returns pointer to clone of this DsrHelper
+     * @returns pointer to clone of this DsrHelper
      *
      * This method is mainly for internal use by the other helpers;
      * clients are expected to free the dynamic memory allocated by this method
      */
     DsrHelper* Copy() const;
     /**
-     * \param node the node on which the routing protocol will run
-     * \returns a newly-created L4 protocol
+     * @param node the node on which the routing protocol will run
+     * @returns a newly-created L4 protocol
      */
     Ptr<ns3::dsr::DsrRouting> Create(Ptr<Node> node) const;
     /**
      * Set attribute values for future instances of DSR that this helper creates
-     * \param name the node on which the routing protocol will run
-     * \param value newly-created L4 protocol
+     * @param name the node on which the routing protocol will run
+     * @param value newly-created L4 protocol
      */
     void Set(std::string name, const AttributeValue& value);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/dsr/helper/dsr-main-helper.h ns-3.44/src/dsr/helper/dsr-main-helper.h
--- ns-3.43/src/dsr/helper/dsr-main-helper.h	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/dsr/helper/dsr-main-helper.h	2025-03-09 16:55:49.371371000 -0700
@@ -31,9 +31,9 @@
 {
 
 /**
- * \ingroup dsr
+ * @ingroup dsr
  *
- * \brief Helper class that adds DSR routing to nodes.
+ * @brief Helper class that adds DSR routing to nodes.
  */
 class DsrMainHelper
 {
@@ -45,34 +45,34 @@
     DsrMainHelper();
     ~DsrMainHelper();
     /**
-     * \brief Construct an DsrMainHelper from another previously initialized instance
+     * @brief Construct an DsrMainHelper from another previously initialized instance
      * (Copy Constructor).
-     * \param o object to copy from
+     * @param o object to copy from
      */
     DsrMainHelper(const DsrMainHelper& o);
     /**
      * Install routing to the nodes
-     * \param dsrHelper The DSR helper class
-     * \param nodes the collection of nodes
+     * @param dsrHelper The DSR helper class
+     * @param nodes the collection of nodes
      */
     void Install(DsrHelper& dsrHelper, NodeContainer nodes);
     /**
      * Set the helper class
-     * \param dsrHelper the DSR helper class
+     * @param dsrHelper the DSR helper class
      */
     void SetDsrHelper(DsrHelper& dsrHelper);
 
   private:
     /**
      * Install routing to a node
-     * \param node the node to install DSR routing
+     * @param node the node to install DSR routing
      */
     void Install(Ptr<Node> node);
     /**
-     * \brief Assignment operator declared private and not implemented to disallow
+     * @brief Assignment operator declared private and not implemented to disallow
      * assignment and prevent the compiler from happily inserting its own.
-     * \param o source object to assign
-     * \return DsrHelper object
+     * @param o source object to assign
+     * @return DsrHelper object
      */
     DsrMainHelper& operator=(const DsrMainHelper& o);
     const DsrHelper* m_dsrHelper; ///< helper class
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/dsr/model/dsr-errorbuff.cc ns-3.44/src/dsr/model/dsr-errorbuff.cc
--- ns-3.43/src/dsr/model/dsr-errorbuff.cc	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/dsr/model/dsr-errorbuff.cc	2025-03-09 16:55:49.371371000 -0700
@@ -53,7 +53,7 @@
                                  << " dst " << i->GetDestination() << " "
                                  << entry.GetDestination());
 
-        /// \todo check the source and destination over here
+        /// @todo check the source and destination over here
         if ((i->GetPacket()->GetUid() == entry.GetPacket()->GetUid()) &&
             (i->GetSource() == entry.GetSource()) && (i->GetNextHop() == entry.GetSource()) &&
             (i->GetDestination() == entry.GetDestination()))
@@ -146,14 +146,14 @@
 struct IsExpired
 {
     /**
-     * \brief comparison operator
-     * \param e entry to compare
-     * \return true if entry expired
+     * @brief comparison operator
+     * @param e entry to compare
+     * @return true if entry expired
      */
     bool operator()(const DsrErrorBuffEntry& e) const
     {
         // NS_LOG_DEBUG("Expire time for packet in req queue: "<<e.GetExpireTime ());
-        return (e.GetExpireTime() < Seconds(0));
+        return (e.GetExpireTime().IsStrictlyNegative());
     }
 };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/dsr/model/dsr-errorbuff.h ns-3.44/src/dsr/model/dsr-errorbuff.h
--- ns-3.43/src/dsr/model/dsr-errorbuff.h	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/dsr/model/dsr-errorbuff.h	2025-03-09 16:55:49.371371000 -0700
@@ -30,8 +30,8 @@
 namespace dsr
 {
 /**
- * \ingroup dsr
- * \brief DSR Error Buffer Entry
+ * @ingroup dsr
+ * @brief DSR Error Buffer Entry
  */
 class DsrErrorBuffEntry
 {
@@ -39,12 +39,12 @@
     /**
      * Create an DsrErrorBuffEntry with the given parameters.
      *
-     * \param pa packet
-     * \param d IPv4 address of the destination
-     * \param s IPv4 address of the source
-     * \param n IPv4 address of the next hop
-     * \param exp expiration time
-     * \param p protocol number
+     * @param pa packet
+     * @param d IPv4 address of the destination
+     * @param s IPv4 address of the source
+     * @param n IPv4 address of the next hop
+     * @param exp expiration time
+     * @param p protocol number
      */
     DsrErrorBuffEntry(Ptr<const Packet> pa = nullptr,
                       Ipv4Address d = Ipv4Address(),
@@ -63,8 +63,8 @@
 
     /**
      * Compare send buffer entries
-     * \param o another DsrErrorBuffEntry
-     * \return true if equal
+     * @param o another DsrErrorBuffEntry
+     * @return true if equal
      */
     bool operator==(const DsrErrorBuffEntry& o) const
     {
@@ -75,7 +75,7 @@
     // Fields
     /**
      * Get packet from entry
-     * \returns the packet
+     * @returns the packet
      */
     Ptr<const Packet> GetPacket() const
     {
@@ -84,7 +84,7 @@
 
     /**
      * Set packet for entry
-     * \param p the packet
+     * @param p the packet
      */
     void SetPacket(Ptr<const Packet> p)
     {
@@ -93,7 +93,7 @@
 
     /**
      * Get destination address
-     * \returns the destination IPv4 address
+     * @returns the destination IPv4 address
      */
     Ipv4Address GetDestination() const
     {
@@ -102,7 +102,7 @@
 
     /**
      * Set destination address
-     * \param d the destination IPv4 address
+     * @param d the destination IPv4 address
      */
     void SetDestination(Ipv4Address d)
     {
@@ -111,7 +111,7 @@
 
     /**
      * Get source address
-     * \returns the source IPv4 address
+     * @returns the source IPv4 address
      */
     Ipv4Address GetSource() const
     {
@@ -120,7 +120,7 @@
 
     /**
      * Set source address
-     * \param s the source IPv4 address
+     * @param s the source IPv4 address
      */
     void SetSource(Ipv4Address s)
     {
@@ -129,7 +129,7 @@
 
     /**
      * Get next hop
-     * \returns the next hop address
+     * @returns the next hop address
      */
     Ipv4Address GetNextHop() const
     {
@@ -138,7 +138,7 @@
 
     /**
      * Set next hop
-     * \param n the next hop IPv4 address
+     * @param n the next hop IPv4 address
      */
     void SetNextHop(Ipv4Address n)
     {
@@ -147,7 +147,7 @@
 
     /**
      * Set expire time
-     * \param exp the expire time
+     * @param exp the expire time
      */
     void SetExpireTime(Time exp)
     {
@@ -156,7 +156,7 @@
 
     /**
      * Get expire time
-     * \returns the expire time
+     * @returns the expire time
      */
     Time GetExpireTime() const
     {
@@ -165,7 +165,7 @@
 
     /**
      * Set protocol number
-     * \param p the protocol number
+     * @param p the protocol number
      */
     void SetProtocol(uint8_t p)
     {
@@ -174,7 +174,7 @@
 
     /**
      * Get protocol number
-     * \returns the protocol number
+     * @returns the protocol number
      */
     uint8_t GetProtocol() const
     {
@@ -197,8 +197,8 @@
 };
 
 /**
- * \ingroup dsr
- * \brief DSR error buffer
+ * @ingroup dsr
+ * @brief DSR error buffer
  */
 /************************************************************************************************************************/
 class DsrErrorBuffer
@@ -215,39 +215,39 @@
      * Push entry in queue, if there is no entry with the same packet and destination address in
      * queue.
      *
-     * \param entry error buffer entry
-     * \return true if entry added
+     * @param entry error buffer entry
+     * @return true if entry added
      */
     bool Enqueue(DsrErrorBuffEntry& entry);
     /**
      * Return first found (the earliest) entry for given destination
-     * \param [in] dst The destination to look for
-     * \param [out] entry The entry
-     * \return true if an entry is found
+     * @param [in] dst The destination to look for
+     * @param [out] entry The entry
+     * @return true if an entry is found
      */
     bool Dequeue(Ipv4Address dst, DsrErrorBuffEntry& entry);
     /**
      * Remove all packets with the error link
-     * \param source The source
-     * \param nextHop The next hop
+     * @param source The source
+     * @param nextHop The next hop
      */
     void DropPacketForErrLink(Ipv4Address source, Ipv4Address nextHop);
     /**
      * Finds whether a packet with destination dst exists in the queue
-     * \param dst The destination
-     * \return true if a packet is found.
+     * @param dst The destination
+     * @return true if a packet is found.
      */
     bool Find(Ipv4Address dst);
     /**
      * Returns the number of entries in the queue.
-     * \return the number of entries in the queue.
+     * @return the number of entries in the queue.
      */
     uint32_t GetSize();
 
     // Fields
     /**
      * Get maximum queue length
-     * \returns the maximum queue length
+     * @returns the maximum queue length
      */
     uint32_t GetMaxQueueLen() const
     {
@@ -256,7 +256,7 @@
 
     /**
      * Set maximum queue length
-     * \param len the maximum queue length
+     * @param len the maximum queue length
      */
     void SetMaxQueueLen(uint32_t len)
     {
@@ -265,7 +265,7 @@
 
     /**
      * Get error buffer timeout
-     * \returns the error buffer timeout
+     * @returns the error buffer timeout
      */
     Time GetErrorBufferTimeout() const
     {
@@ -274,7 +274,7 @@
 
     /**
      * Set error buffer timeout
-     * \param t the error buffer timeout
+     * @param t the error buffer timeout
      */
     void SetErrorBufferTimeout(Time t)
     {
@@ -283,7 +283,7 @@
 
     /**
      * Get error buffer entry
-     * \returns the DSR error buffer
+     * @returns the DSR error buffer
      */
     std::vector<DsrErrorBuffEntry>& GetBuffer()
     {
@@ -297,15 +297,15 @@
     void Purge();
     /**
      * Notify that packet is dropped from queue by timeout
-     * \param en Error Buffer Entry
-     * \param reason Drop reason.
+     * @param en Error Buffer Entry
+     * @param reason Drop reason.
      */
     ///
     void Drop(DsrErrorBuffEntry en, std::string reason);
     /**
      * Notify that packet is dropped from queue by link error
-     * \param en Error Buffer Entry
-     * \param reason Drop reason.
+     * @param en Error Buffer Entry
+     * @param reason Drop reason.
      */
     void DropLink(DsrErrorBuffEntry en, std::string reason);
     /// The maximum number of packets that we allow a routing protocol to buffer.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/dsr/model/dsr-fs-header.h ns-3.44/src/dsr/model/dsr-fs-header.h
--- ns-3.43/src/dsr/model/dsr-fs-header.h	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/dsr/model/dsr-fs-header.h	2025-03-09 16:55:49.371371000 -0700
@@ -34,13 +34,13 @@
 namespace dsr
 {
 /**
- * \class DsrHeader
- * \brief Header for Dsr Routing.
+ * @class DsrHeader
+ * @brief Header for Dsr Routing.
  */
 
 /**
-* \ingroup dsr
-* \brief Dsr fixed size header Format
+* @ingroup dsr
+* @brief Dsr fixed size header Format
   \verbatim
    |      0        |      1        |      2        |      3        |
    0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
@@ -53,8 +53,8 @@
 */
 
 /**
-* \ingroup dsr
-* \brief The modified version of Dsr fixed size header Format
+* @ingroup dsr
+* @brief The modified version of Dsr fixed size header Format
   \verbatim
    |      0        |      1        |      2        |      3        |
    0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
@@ -71,125 +71,125 @@
 {
   public:
     /**
-     * \brief Get the type identificator.
-     * \return type identificator
+     * @brief Get the type identificator.
+     * @return type identificator
      */
     static TypeId GetTypeId();
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     DsrFsHeader();
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~DsrFsHeader() override;
     /**
-     * \brief Set the "Next header" field.
-     * \param protocol the next header number
+     * @brief Set the "Next header" field.
+     * @param protocol the next header number
      */
     void SetNextHeader(uint8_t protocol);
     /**
-     * \brief Get the next header.
-     * \return the next header number
+     * @brief Get the next header.
+     * @return the next header number
      */
     uint8_t GetNextHeader() const;
     /**
      * brief Set the message type of the header.
-     * \param messageType the message type of the header
+     * @param messageType the message type of the header
      */
     void SetMessageType(uint8_t messageType);
     /**
      * brief Get the message type of the header.
-     * \return message type the message type of the header
+     * @return message type the message type of the header
      */
     uint8_t GetMessageType() const;
     /**
      * brief Set the source ID of the header.
-     * \param sourceId the source ID of the header
+     * @param sourceId the source ID of the header
      */
     void SetSourceId(uint16_t sourceId);
     /**
      * brief Get the source ID of the header.
-     * \return source ID the source ID of the header
+     * @return source ID the source ID of the header
      */
     uint16_t GetSourceId() const;
     /**
      * brief Set the dest ID of the header.
-     * \param destId the destination ID of the header
+     * @param destId the destination ID of the header
      */
     void SetDestId(uint16_t destId);
     /**
      * brief Get the dest ID of the header.
-     * \return dest ID the dest ID of the header
+     * @return dest ID the dest ID of the header
      */
     uint16_t GetDestId() const;
     /**
      * brief Set the payload length of the header.
-     * \param length the payload length of the header in bytes
+     * @param length the payload length of the header in bytes
      */
     void SetPayloadLength(uint16_t length);
     /**
-     * \brief Get the payload length of the header.
-     * \return the payload length of the header
+     * @brief Get the payload length of the header.
+     * @return the payload length of the header
      */
     uint16_t GetPayloadLength() const;
     /**
-     * \brief Print some information about the packet.
-     * \param os output stream
+     * @brief Print some information about the packet.
+     * @param os output stream
      */
     void Print(std::ostream& os) const override;
     /**
-     * \brief Get the serialized size of the packet.
-     * \return size
+     * @brief Get the serialized size of the packet.
+     * @return size
      */
     uint32_t GetSerializedSize() const override;
     /**
-     * \brief Serialize the packet.
-     * \param start Buffer iterator
+     * @brief Serialize the packet.
+     * @param start Buffer iterator
      */
     void Serialize(Buffer::Iterator start) const override;
     /**
-     * \brief Deserialize the packet.
-     * \param start Buffer iterator
-     * \return size of the packet
+     * @brief Deserialize the packet.
+     * @param start Buffer iterator
+     * @return size of the packet
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
 
   private:
     /**
-     * \brief The "next header" field.
+     * @brief The "next header" field.
      */
     uint8_t m_nextHeader;
     /**
-     * \brief The type of the message.
+     * @brief The type of the message.
      */
     uint8_t m_messageType;
     /**
-     * \brief The "payload length" field.
+     * @brief The "payload length" field.
      */
     uint16_t m_payloadLen;
     /**
-     * \brief The source node id
+     * @brief The source node id
      */
     uint16_t m_sourceId;
     /**
-     * \brief The destination node id
+     * @brief The destination node id
      */
     uint16_t m_destId;
     /**
-     * \brief The data of the extension.
+     * @brief The data of the extension.
      */
     Buffer m_data;
 };
 
 /**
- * \class DsrOptionField
- * \brief Option field for an DsrFsHeader
+ * @class DsrOptionField
+ * @brief Option field for an DsrFsHeader
  * Enables adding options to an DsrFsHeader
  *
  * Implementor's note: Make sure to add the result of
@@ -201,109 +201,109 @@
 {
   public:
     /**
-     * \brief Constructor.
-     * \param optionsOffset option offset
+     * @brief Constructor.
+     * @param optionsOffset option offset
      */
     DsrOptionField(uint32_t optionsOffset);
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~DsrOptionField();
     /**
-     * \brief Get the serialized size of the packet.
-     * \return size
+     * @brief Get the serialized size of the packet.
+     * @return size
      */
     uint32_t GetSerializedSize() const;
     /**
-     * \brief Serialize all added options.
-     * \param start Buffer iterator
+     * @brief Serialize all added options.
+     * @param start Buffer iterator
      */
     void Serialize(Buffer::Iterator start) const;
     /**
-     * \brief Deserialize the packet.
-     * \param start Buffer iterator
-     * \param length length
-     * \return size of the packet
+     * @brief Deserialize the packet.
+     * @param start Buffer iterator
+     * @param length length
+     * @return size of the packet
      */
     uint32_t Deserialize(Buffer::Iterator start, uint32_t length);
     /**
-     * \brief Serialize the option, prepending pad1 or padn option as necessary
-     * \param option the option header to serialize
+     * @brief Serialize the option, prepending pad1 or padn option as necessary
+     * @param option the option header to serialize
      */
     void AddDsrOption(const DsrOptionHeader& option);
     /**
-     * \brief Get the offset where the options begin, measured from the start of
+     * @brief Get the offset where the options begin, measured from the start of
      * the extension header.
-     * \return the offset from the start of the extension header
+     * @return the offset from the start of the extension header
      */
     uint32_t GetDsrOptionsOffset() const;
     /**
-     * \brief Get the buffer.
-     * \return buffer
+     * @brief Get the buffer.
+     * @return buffer
      */
     Buffer GetDsrOptionBuffer();
 
   private:
     /**
-     * \brief Calculate padding.
-     * \param alignment alignment
-     * \return the number of bytes required to pad
+     * @brief Calculate padding.
+     * @param alignment alignment
+     * @return the number of bytes required to pad
      */
     uint32_t CalculatePad(DsrOptionHeader::Alignment alignment) const;
     /**
-     * \brief Data payload.
+     * @brief Data payload.
      */
     Buffer m_optionData;
     /**
-     * \brief Offset.
+     * @brief Offset.
      */
     uint32_t m_optionsOffset;
 };
 
 /**
- * \class DsrRoutingHeader
- * \brief Header of Dsr Routing
+ * @class DsrRoutingHeader
+ * @brief Header of Dsr Routing
  */
 class DsrRoutingHeader : public DsrFsHeader, public DsrOptionField
 {
   public:
     /**
-     * \brief Get the type identificator.
-     * \return type identificator
+     * @brief Get the type identificator.
+     * @return type identificator
      */
     static TypeId GetTypeId();
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     DsrRoutingHeader();
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~DsrRoutingHeader() override;
     /**
-     * \brief Print some information about the packet.
-     * \param os output stream
+     * @brief Print some information about the packet.
+     * @param os output stream
      */
     void Print(std::ostream& os) const override;
     /**
-     * \brief Get the serialized size of the packet.
-     * \return size
+     * @brief Get the serialized size of the packet.
+     * @return size
      */
     uint32_t GetSerializedSize() const override;
     /**
-     * \brief Serialize the packet.
-     * \param start Buffer iterator
+     * @brief Serialize the packet.
+     * @param start Buffer iterator
      */
     void Serialize(Buffer::Iterator start) const override;
     /**
-     * \brief Deserialize the packet.
-     * \param start Buffer iterator
-     * \return size of the packet
+     * @brief Deserialize the packet.
+     * @param start Buffer iterator
+     * @return size of the packet
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/dsr/model/dsr-gratuitous-reply-table.h ns-3.44/src/dsr/model/dsr-gratuitous-reply-table.h
--- ns-3.43/src/dsr/model/dsr-gratuitous-reply-table.h	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/dsr/model/dsr-gratuitous-reply-table.h	2025-03-09 16:55:49.371371000 -0700
@@ -45,9 +45,9 @@
     /**
      * Constructor
      *
-     * \param t IPv4 address to reply to
-     * \param f IPv4 address to hear from
-     * \param h gratuitous hold off time
+     * @param t IPv4 address to reply to
+     * @param f IPv4 address to hear from
+     * @param h gratuitous hold off time
      */
     GraReplyEntry(Ipv4Address t, Ipv4Address f, Time h)
         : m_replyTo(t),
@@ -58,15 +58,15 @@
 };
 
 /**
- * \ingroup dsr
- * \brief maintain the gratuitous reply
+ * @ingroup dsr
+ * @brief maintain the gratuitous reply
  */
 class DsrGraReply : public Object
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -74,28 +74,28 @@
     ~DsrGraReply() override;
 
     /// Set the gratuitous reply table size
-    /// \param g The gratuitous reply table size
+    /// @param g The gratuitous reply table size
     void SetGraTableSize(uint32_t g)
     {
         GraReplyTableSize = g;
     }
 
     /// Get the gratuitous reply table size
-    /// \returns The gratuitous reply table size
+    /// @returns The gratuitous reply table size
     uint32_t GetGraTableSize() const
     {
         return GraReplyTableSize;
     }
 
     /// Add a new gratuitous reply entry
-    /// \param graTableEntry The gratuitous reply entry
-    /// \return true on success
+    /// @param graTableEntry The gratuitous reply entry
+    /// @return true on success
     bool AddEntry(GraReplyEntry& graTableEntry);
     /// Update the route entry if found
-    /// \param replyTo Entry directed to
-    /// \param replyFrom Entry heard from
-    /// \param gratReplyHoldoff New gratuitous reply holdoff time
-    /// \return true on success
+    /// @param replyTo Entry directed to
+    /// @param replyFrom Entry heard from
+    /// @param gratReplyHoldoff New gratuitous reply holdoff time
+    /// @return true on success
     bool FindAndUpdate(Ipv4Address replyTo, Ipv4Address replyFrom, Time gratReplyHoldoff);
     /// Remove all expired entries
     void Purge();
@@ -118,8 +118,8 @@
         /**
          * Check if the entry is expired
          *
-         * \param b GraReplyEntry entry
-         * \return true if expired, false otherwise
+         * @param b GraReplyEntry entry
+         * @return true if expired, false otherwise
          */
         bool operator()(const GraReplyEntry& b) const
         {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/dsr/model/dsr-maintain-buff.cc ns-3.44/src/dsr/model/dsr-maintain-buff.cc
--- ns-3.43/src/dsr/model/dsr-maintain-buff.cc	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/dsr/model/dsr-maintain-buff.cc	2025-03-09 16:55:49.371371000 -0700
@@ -221,14 +221,14 @@
 struct IsExpired
 {
     /**
-     * \brief comparison operator
-     * \param e maintain buffer entry
-     * \return true if the entry is expired
+     * @brief comparison operator
+     * @param e maintain buffer entry
+     * @return true if the entry is expired
      */
     bool operator()(const DsrMaintainBuffEntry& e) const
     {
         // NS_LOG_DEBUG("Expire time for packet in req queue: "<<e.GetExpireTime ());
-        return (e.GetExpireTime() < Seconds(0));
+        return (e.GetExpireTime().IsStrictlyNegative());
     }
 };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/dsr/model/dsr-maintain-buff.h ns-3.44/src/dsr/model/dsr-maintain-buff.h
--- ns-3.43/src/dsr/model/dsr-maintain-buff.h	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/dsr/model/dsr-maintain-buff.h	2025-03-09 16:55:49.371371000 -0700
@@ -46,8 +46,8 @@
 
     /**
      * Compare maintain Buffer entries
-     * \param o object to compare
-     * \return true if equal
+     * @param o object to compare
+     * @return true if equal
      */
     bool operator<(const LinkKey& o) const
     {
@@ -98,8 +98,8 @@
 
     /**
      * Compare maintain Buffer entries
-     * \param o object to compare
-     * \return true if equal
+     * @param o object to compare
+     * @return true if equal
      */
     bool operator<(const NetworkKey& o) const
     {
@@ -157,8 +157,8 @@
 
     /**
      * Compare maintain Buffer entries
-     * \param o is the object to compare
-     * \return true if equal
+     * @param o is the object to compare
+     * @return true if equal
      */
     bool operator<(const PassiveKey& o) const
     {
@@ -199,8 +199,8 @@
 };
 
 /**
- * \ingroup dsr
- * \brief DSR Maintain Buffer Entry
+ * @ingroup dsr
+ * @brief DSR Maintain Buffer Entry
  */
 class DsrMaintainBuffEntry
 {
@@ -208,14 +208,14 @@
     /**
      * Construct a DsrMaintainBuffEntry with the given parameters
      *
-     * \param packet packet
-     * \param ourAddress our IPv4 address
-     * \param nextHop next hop IPv4 address
-     * \param src IPv4 address of the source
-     * \param dst IPv4 address of the destination
-     * \param ackId ACK ID
-     * \param segsLeft number of segments left
-     * \param expire expiration time
+     * @param packet packet
+     * @param ourAddress our IPv4 address
+     * @param nextHop next hop IPv4 address
+     * @param src IPv4 address of the source
+     * @param dst IPv4 address of the destination
+     * @param ackId ACK ID
+     * @param segsLeft number of segments left
+     * @param expire expiration time
      */
     DsrMaintainBuffEntry(Ptr<const Packet> packet = nullptr,
                          Ipv4Address ourAddress = Ipv4Address(),
@@ -239,7 +239,7 @@
     // Fields
     /**
      * Get packet
-     * \returns the current packet
+     * @returns the current packet
      */
     Ptr<const Packet> GetPacket() const
     {
@@ -248,7 +248,7 @@
 
     /**
      * Set packet
-     * \param p the current packet
+     * @param p the current packet
      */
     void SetPacket(Ptr<const Packet> p)
     {
@@ -257,7 +257,7 @@
 
     /**
      * Get local address of entry
-     * \returns the local IP address
+     * @returns the local IP address
      */
     Ipv4Address GetOurAdd() const
     {
@@ -266,7 +266,7 @@
 
     /**
      * Set local address of entry
-     * \param us the local IP address
+     * @param us the local IP address
      */
     void SetOurAdd(Ipv4Address us)
     {
@@ -275,7 +275,7 @@
 
     /**
      * Get next hop of entry
-     * \returns the IP address for the next hop
+     * @returns the IP address for the next hop
      */
     Ipv4Address GetNextHop() const
     {
@@ -284,7 +284,7 @@
 
     /**
      * Set next hop of entry
-     * \param n the next hop IP address
+     * @param n the next hop IP address
      */
     void SetNextHop(Ipv4Address n)
     {
@@ -293,7 +293,7 @@
 
     /**
      * Get destination address
-     * \returns the destination IP address
+     * @returns the destination IP address
      */
     Ipv4Address GetDst() const
     {
@@ -302,7 +302,7 @@
 
     /**
      * Set destination address
-     * \param n the destination IP address
+     * @param n the destination IP address
      */
     void SetDst(Ipv4Address n)
     {
@@ -311,7 +311,7 @@
 
     /**
      * Get source address
-     * \returns the source IP address
+     * @returns the source IP address
      */
     Ipv4Address GetSrc() const
     {
@@ -320,7 +320,7 @@
 
     /**
      * Set source address
-     * \param s the source IP address
+     * @param s the source IP address
      */
     void SetSrc(Ipv4Address s)
     {
@@ -329,7 +329,7 @@
 
     /**
      * Get acknowledge ID
-     * \returns the acknowledge ID
+     * @returns the acknowledge ID
      */
     uint16_t GetAckId() const
     {
@@ -338,7 +338,7 @@
 
     /**
      * Set acknowledge ID
-     * \param ackId the acknowledge ID
+     * @param ackId the acknowledge ID
      */
     void SetAckId(uint16_t ackId)
     {
@@ -347,7 +347,7 @@
 
     /**
      * Get segments left
-     * \returns the number of segments left
+     * @returns the number of segments left
      */
     uint8_t GetSegsLeft() const
     {
@@ -356,7 +356,7 @@
 
     /**
      * Set segments left
-     * \param segs the number of segments left
+     * @param segs the number of segments left
      */
     void SetSegsLeft(uint8_t segs)
     {
@@ -365,7 +365,7 @@
 
     /**
      * Set expiration time
-     * \param exp the expire time
+     * @param exp the expire time
      */
     void SetExpireTime(Time exp)
     {
@@ -374,7 +374,7 @@
 
     /**
      * Get expiration time
-     * \returns the expiration time
+     * @returns the expiration time
      */
     Time GetExpireTime() const
     {
@@ -401,8 +401,8 @@
 };
 
 /**
- * \ingroup dsr
- * \brief DSR maintain buffer
+ * @ingroup dsr
+ * @brief DSR maintain buffer
  */
 /************************************************************************************************************************/
 class DsrMaintainBuffer
@@ -417,29 +417,29 @@
 
     /// Push entry in queue, if there is no entry with the same packet and destination address in
     /// queue.
-    /// \param entry Maintain Buffer Entry
-    /// \return true on success adding the Entry.
+    /// @param entry Maintain Buffer Entry
+    /// @return true on success adding the Entry.
     bool Enqueue(DsrMaintainBuffEntry& entry);
     /// Return first found (the earliest) entry for given destination
-    /// \param [in] dst Entry destination
-    /// \param [out] entry The Entry found (if any).
-    /// \return true on success
+    /// @param [in] dst Entry destination
+    /// @param [out] entry The Entry found (if any).
+    /// @return true on success
     bool Dequeue(Ipv4Address dst, DsrMaintainBuffEntry& entry);
     /// Remove all packets with next hop IP address dst
-    /// \param nextHop Next hop in the route.
+    /// @param nextHop Next hop in the route.
     void DropPacketWithNextHop(Ipv4Address nextHop);
     /// Finds whether a packet with next hop dst exists in the queue
-    /// \param nextHop Next hop in the route.
-    /// \return true if there is a packet directed to the next hop.
+    /// @param nextHop Next hop in the route.
+    /// @return true if there is a packet directed to the next hop.
     bool Find(Ipv4Address nextHop);
     /// Number of entries
-    /// \return The number of entries.
+    /// @return The number of entries.
     uint32_t GetSize();
 
     // Fields
     /**
      * Get maximum queue length
-     * \returns the maximum queue length
+     * @returns the maximum queue length
      */
     uint32_t GetMaxQueueLen() const
     {
@@ -448,7 +448,7 @@
 
     /**
      * Set maximum queue length
-     * \param len the maximum queue length
+     * @param len the maximum queue length
      */
     void SetMaxQueueLen(uint32_t len)
     {
@@ -457,7 +457,7 @@
 
     /**
      * Get maintain buffer timeout
-     * \returns the maintain buffer timeout
+     * @returns the maintain buffer timeout
      */
     Time GetMaintainBufferTimeout() const
     {
@@ -466,7 +466,7 @@
 
     /**
      * Set maintain buffer timeout
-     * \param t the maintain buffer timeout
+     * @param t the maintain buffer timeout
      */
     void SetMaintainBufferTimeout(Time t)
     {
@@ -474,22 +474,22 @@
     }
 
     /// Verify if all the elements in the maintenance buffer entry is the same
-    /// \note For real this function checks if at most one entry is equal. If it is,
+    /// @note For real this function checks if at most one entry is equal. If it is,
     /// that entry is removed. Further entries are NOT checked. This could be a bug.
-    /// \param entry The Entry to check
-    /// \return true if an Entry was found and removed.
+    /// @param entry The Entry to check
+    /// @return true if an Entry was found and removed.
     bool AllEqual(DsrMaintainBuffEntry& entry);
     /// Verify if the maintain buffer entry is the same in every field for link ack
-    /// \param entry The Entry to check
-    /// \return true if an Entry was found and removed.
+    /// @param entry The Entry to check
+    /// @return true if an Entry was found and removed.
     bool LinkEqual(DsrMaintainBuffEntry& entry);
     /// Verify if the maintain buffer entry is the same in every field for network ack
-    /// \param entry The Entry to check
-    /// \return true if an Entry was found and removed.
+    /// @param entry The Entry to check
+    /// @return true if an Entry was found and removed.
     bool NetworkEqual(DsrMaintainBuffEntry& entry);
     /// Verify if the maintain buffer entry is the same in every field for promiscuous ack
-    /// \param entry The Entry to check
-    /// \return true if an Entry was found and removed.
+    /// @param entry The Entry to check
+    /// @return true if an Entry was found and removed.
     bool PromiscEqual(DsrMaintainBuffEntry& entry);
 
   private:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/dsr/model/dsr-network-queue.h ns-3.44/src/dsr/model/dsr-network-queue.h
--- ns-3.43/src/dsr/model/dsr-network-queue.h	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/dsr/model/dsr-network-queue.h	2025-03-09 16:55:49.371371000 -0700
@@ -40,8 +40,8 @@
 };
 
 /**
- * \ingroup dsr
- * \brief DSR Network Queue Entry
+ * @ingroup dsr
+ * @brief DSR Network Queue Entry
  */
 class DsrNetworkQueueEntry
 {
@@ -49,11 +49,11 @@
     /**
      * Construct a DsrNetworkQueueEntry with the given parameters
      *
-     * \param pa packet
-     * \param s IPv4 address of the source
-     * \param n IPv4 address of the next hop node
-     * \param exp expiration time
-     * \param r Route
+     * @param pa packet
+     * @param s IPv4 address of the source
+     * @param n IPv4 address of the next hop node
+     * @param exp expiration time
+     * @param r Route
      */
     DsrNetworkQueueEntry(Ptr<const Packet> pa = nullptr,
                          Ipv4Address s = Ipv4Address(),
@@ -70,8 +70,8 @@
 
     /**
      * Compare send buffer entries
-     * \param o entry to compare
-     * \return true if equal
+     * @param o entry to compare
+     * @return true if equal
      */
     bool operator==(const DsrNetworkQueueEntry& o) const
     {
@@ -83,7 +83,7 @@
     // Fields
     /**
      * Get packet function
-     * \returns the current packet
+     * @returns the current packet
      */
     Ptr<const Packet> GetPacket() const
     {
@@ -92,7 +92,7 @@
 
     /**
      * Set packet function
-     * \param p the current packet
+     * @param p the current packet
      */
     void SetPacket(Ptr<const Packet> p)
     {
@@ -101,7 +101,7 @@
 
     /**
      * Get IP route function
-     * \returns the IP route
+     * @returns the IP route
      */
     Ptr<Ipv4Route> GetIpv4Route() const
     {
@@ -110,7 +110,7 @@
 
     /**
      * Set IP route function
-     * \param route
+     * @param route
      */
     void SetIpv4Route(Ptr<Ipv4Route> route)
     {
@@ -119,7 +119,7 @@
 
     /**
      * Get source address function
-     * \returns the source IP address
+     * @returns the source IP address
      */
     Ipv4Address GetSourceAddress() const
     {
@@ -128,7 +128,7 @@
 
     /**
      * Set source address function
-     * \param addr the source IP address
+     * @param addr the source IP address
      */
     void SetSourceAddress(Ipv4Address addr)
     {
@@ -137,7 +137,7 @@
 
     /**
      * Get next hop address function
-     * \returns the next hop IP address
+     * @returns the next hop IP address
      */
     Ipv4Address GetNextHopAddress() const
     {
@@ -146,7 +146,7 @@
 
     /**
      * Set next hop address function
-     * \param addr the next hop IP address
+     * @param addr the next hop IP address
      */
     void SetNextHopAddress(Ipv4Address addr)
     {
@@ -155,7 +155,7 @@
 
     /**
      * Get inserted time stamp function
-     * \returns the inserted time stamp
+     * @returns the inserted time stamp
      */
     Time GetInsertedTimeStamp() const
     {
@@ -164,7 +164,7 @@
 
     /**
      * Set inserted time stamp function
-     * \param time the inserted timestamp
+     * @param time the inserted timestamp
      */
     void SetInsertedTimeStamp(Time time)
     {
@@ -185,8 +185,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -195,71 +195,71 @@
      * Construct a DsrNetworkQueue with the given
      * maximum length and maximum delay.
      *
-     * \param maxLen Maximum queue size
-     * \param maxDelay Maximum entry lifetime in the queue
+     * @param maxLen Maximum queue size
+     * @param maxDelay Maximum entry lifetime in the queue
      */
     DsrNetworkQueue(uint32_t maxLen, Time maxDelay);
     ~DsrNetworkQueue() override;
 
     /**
      * Find the packet entry with a given next hop
-     * \param nextHop the IP address of the next hop
-     * \param entry the DSR queue entry
-     * \returns true if found
+     * @param nextHop the IP address of the next hop
+     * @param entry the DSR queue entry
+     * @returns true if found
      */
     bool FindPacketWithNexthop(Ipv4Address nextHop, DsrNetworkQueueEntry& entry);
     /**
      * Try to find an entry with a particular next hop, and return true if found
-     * \param nextHop the next hop IP address
-     * \returns true if found
+     * @param nextHop the next hop IP address
+     * @returns true if found
      */
     bool Find(Ipv4Address nextHop);
     /**
      * Push entry in queue, if there is no entry with the same
      * packet and destination address in queue.
      *
-     * \param entry packet entry
-     * \return true if the given entry was put in the queue,
+     * @param entry packet entry
+     * @return true if the given entry was put in the queue,
      *         false otherwise
      */
     bool Enqueue(DsrNetworkQueueEntry& entry);
     /**
      * Return first found (the earliest) entry for given destination
      *
-     * \param entry pointer to the return entry
-     * \return true if an entry is returned,
+     * @param entry pointer to the return entry
+     * @return true if an entry is returned,
      *         false otherwise
      */
     bool Dequeue(DsrNetworkQueueEntry& entry);
     /**
      * Number of entries
      *
-     * \return the current queue size/length
+     * @return the current queue size/length
      */
     uint32_t GetSize();
 
     /**
      * Set the maximum queue size
      *
-     * \param maxSize the maximum queue size
+     * @param maxSize the maximum queue size
      */
     void SetMaxNetworkSize(uint32_t maxSize);
     /**
      * Set the maximum entry lifetime in the queue
      *
-     * \param delay the maximum entry lifetime
+     * @param delay the maximum entry lifetime
      */
     void SetMaxNetworkDelay(Time delay);
     /**
      * Return the maximum queue size
      *
-     * \return the maximum queue size
+     * @return the maximum queue size
      */
     uint32_t GetMaxNetworkSize() const;
     /**
      * Return the maximum entry lifetime for this queue
      *
-     * \return the maximum entry lifetime for this queue
+     * @return the maximum entry lifetime for this queue
      */
     Time GetMaxNetworkDelay() const;
     /**
@@ -270,7 +270,7 @@
     /**
      * Return the current queue entry
      *
-     * \return the current queue entry
+     * @return the current queue entry
      */
     std::vector<DsrNetworkQueueEntry>& GetQueue()
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/dsr/model/dsr-option-header.h ns-3.44/src/dsr/model/dsr-option-header.h
--- ns-3.43/src/dsr/model/dsr-option-header.h	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/dsr/model/dsr-option-header.h	2025-03-09 16:55:49.371371000 -0700
@@ -35,15 +35,15 @@
 namespace dsr
 {
 /**
- * \ingroup dsr
- * \brief header for Dsr Options.
+ * @ingroup dsr
+ * @brief header for Dsr Options.
  */
 class DsrOptionHeader : public Header
 {
   public:
     /**
-     * \struct Alignment
-     * \brief Represents the alignment requirements of an option header
+     * @struct Alignment
+     * @brief Represents the alignment requirements of an option header
      */
     struct Alignment
     {
@@ -52,67 +52,67 @@
     };
 
     /**
-     * \brief Get the type identificator.
-     * \return type identificator
+     * @brief Get the type identificator.
+     * @return type identificator
      */
     static TypeId GetTypeId();
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     DsrOptionHeader();
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~DsrOptionHeader() override;
     /**
-     * \brief Set the type of the option.
-     * \param type the type of the option
+     * @brief Set the type of the option.
+     * @param type the type of the option
      */
     void SetType(uint8_t type);
     /**
-     * \brief Get the type of the option.
-     * \return the type of the option
+     * @brief Get the type of the option.
+     * @return the type of the option
      */
     uint8_t GetType() const;
     /**
-     * \brief Set the option length.
-     * \param length the option length
+     * @brief Set the option length.
+     * @param length the option length
      */
     void SetLength(uint8_t length);
     /**
-     * \brief Get the option length.
-     * \return the option length
+     * @brief Get the option length.
+     * @return the option length
      */
     uint8_t GetLength() const;
     /**
-     * \brief Print some information about the packet.
-     * \param os output stream
+     * @brief Print some information about the packet.
+     * @param os output stream
      */
     void Print(std::ostream& os) const override;
     /**
-     * \brief Get the serialized size of the packet.
-     * \return size
+     * @brief Get the serialized size of the packet.
+     * @return size
      */
     uint32_t GetSerializedSize() const override;
     /**
-     * \brief Serialize the packet.
-     * \param start Buffer iterator
+     * @brief Serialize the packet.
+     * @param start Buffer iterator
      */
     void Serialize(Buffer::Iterator start) const override;
     /**
-     * \brief Deserialize the packet.
-     * \param start Buffer iterator
-     * \return size of the packet
+     * @brief Deserialize the packet.
+     * @param start Buffer iterator
+     * @return size of the packet
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
     /**
-     * \brief Get the Alignment requirement of this option header
-     * \return The required alignment
+     * @brief Get the Alignment requirement of this option header
+     * @return The required alignment
      *
      * Subclasses should only implement this method, if special alignment is
      * required. Default is no alignment (1n+0).
@@ -121,121 +121,121 @@
 
   private:
     /**
-     * \brief The type of the option.
+     * @brief The type of the option.
      */
     uint8_t m_type;
     /**
-     * \brief The option length.
+     * @brief The option length.
      */
     uint8_t m_length;
     /**
-     * \brief The anonymous data of this option
+     * @brief The anonymous data of this option
      */
     Buffer m_data;
 };
 
 /**
- * \ingroup dsr
- * \brief Header of Dsr Option Pad1
+ * @ingroup dsr
+ * @brief Header of Dsr Option Pad1
  */
 class DsrOptionPad1Header : public DsrOptionHeader
 {
   public:
     /**
-     * \brief Get the type identificator.
-     * \return type identificator
+     * @brief Get the type identificator.
+     * @return type identificator
      */
     static TypeId GetTypeId();
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     DsrOptionPad1Header();
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~DsrOptionPad1Header() override;
     /**
-     * \brief Print some information about the packet.
-     * \param os output stream
+     * @brief Print some information about the packet.
+     * @param os output stream
      */
     void Print(std::ostream& os) const override;
     /**
-     * \brief Get the serialized size of the packet.
-     * \return size
+     * @brief Get the serialized size of the packet.
+     * @return size
      */
     uint32_t GetSerializedSize() const override;
     /**
-     * \brief Serialize the packet.
-     * \param start Buffer iterator
+     * @brief Serialize the packet.
+     * @param start Buffer iterator
      */
     void Serialize(Buffer::Iterator start) const override;
     /**
-     * \brief Deserialize the packet.
-     * \param start Buffer iterator
-     * \return size of the packet
+     * @brief Deserialize the packet.
+     * @param start Buffer iterator
+     * @return size of the packet
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
 };
 
 /**
- * \ingroup dsr
- * \brief Header of Dsr Option Padn
+ * @ingroup dsr
+ * @brief Header of Dsr Option Padn
  */
 class DsrOptionPadnHeader : public DsrOptionHeader
 {
   public:
     /**
-     * \brief Get the type identificator.
-     * \return type identificator
+     * @brief Get the type identificator.
+     * @return type identificator
      */
     static TypeId GetTypeId();
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
     /**
-     * \brief Constructor.
-     * \param pad Number of bytes to pad (>=2)
+     * @brief Constructor.
+     * @param pad Number of bytes to pad (>=2)
      */
     DsrOptionPadnHeader(uint32_t pad = 2);
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~DsrOptionPadnHeader() override;
     /**
-     * \brief Print some information about the packet.
-     * \param os output stream
+     * @brief Print some information about the packet.
+     * @param os output stream
      */
     void Print(std::ostream& os) const override;
     /**
-     * \brief Get the serialized size of the packet.
-     * \return size
+     * @brief Get the serialized size of the packet.
+     * @return size
      */
     uint32_t GetSerializedSize() const override;
     /**
-     * \brief Serialize the packet.
-     * \param start Buffer iterator
+     * @brief Serialize the packet.
+     * @param start Buffer iterator
      */
     void Serialize(Buffer::Iterator start) const override;
     /**
-     * \brief Deserialize the packet.
-     * \param start Buffer iterator
-     * \return size of the packet
+     * @brief Deserialize the packet.
+     * @param start Buffer iterator
+     * @return size of the packet
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
 };
 
 /**
- * \ingroup dsr
- * \brief Header of Dsr Option Route Request
+ * @ingroup dsr
+ * @brief Header of Dsr Option Route Request
  *
- * \verbatim
+ * @verbatim
    Route Request (RREQ) Message Format
 
    |      0        |      1        |      2        |      3        |
@@ -259,110 +259,110 @@
 {
   public:
     /**
-     * \brief Get the type identificator.
-     * \return type identificator
+     * @brief Get the type identificator.
+     * @return type identificator
      */
     static TypeId GetTypeId();
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     DsrOptionRreqHeader();
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~DsrOptionRreqHeader() override;
     /**
-     * \brief Set the number of ipv4 address.
-     * \param n the number of ipv4 address
+     * @brief Set the number of ipv4 address.
+     * @param n the number of ipv4 address
      */
     void SetNumberAddress(uint8_t n);
     /**
-     * \brief Get the target ipv4 address.
-     * \return target the target packet
+     * @brief Get the target ipv4 address.
+     * @return target the target packet
      */
     Ipv4Address GetTarget();
     /**
-     * \brief Set the target ipv4 address.
-     * \param target the target packet
+     * @brief Set the target ipv4 address.
+     * @param target the target packet
      */
     void SetTarget(Ipv4Address target);
     /**
-     * \brief Set the vector of ipv4 address
-     * \param ipv4Address the vector of ipv4 address
+     * @brief Set the vector of ipv4 address
+     * @param ipv4Address the vector of ipv4 address
      */
     void SetNodesAddress(std::vector<Ipv4Address> ipv4Address);
     /**
-     * \brief Get the vector of ipv4 address
-     * \return the vector of ipv4 address
+     * @brief Get the vector of ipv4 address
+     * @return the vector of ipv4 address
      */
     std::vector<Ipv4Address> GetNodesAddresses() const;
     /**
-     * \brief Get the number of nodes
-     * \return the number of nodes
+     * @brief Get the number of nodes
+     * @return the number of nodes
      */
     uint32_t GetNodesNumber() const;
     /**
-     * \brief Add one node address
-     * \param ipv4 The ip address to add
+     * @brief Add one node address
+     * @param ipv4 The ip address to add
      */
     void AddNodeAddress(Ipv4Address ipv4);
     /**
-     * \brief Set a Node IPv4 Address.
-     * \param index the index of the IPv4 Address
-     * \param addr the new IPv4 Address
+     * @brief Set a Node IPv4 Address.
+     * @param index the index of the IPv4 Address
+     * @param addr the new IPv4 Address
      */
     void SetNodeAddress(uint8_t index, Ipv4Address addr);
     /**
-     * \brief Get a Node IPv4 Address.
-     * \param index the index of the IPv4 Address
-     * \return the router IPv4 Address
+     * @brief Get a Node IPv4 Address.
+     * @param index the index of the IPv4 Address
+     * @return the router IPv4 Address
      */
     Ipv4Address GetNodeAddress(uint8_t index) const;
     /**
-     * \brief Set the request id number.
-     * \param identification the identification number
+     * @brief Set the request id number.
+     * @param identification the identification number
      */
     void SetId(uint16_t identification);
     /**
-     * \brief Set the request id number.
-     * \return request id number
+     * @brief Set the request id number.
+     * @return request id number
      */
     uint16_t GetId() const;
     /**
-     * \brief Print some information about the packet.
-     * \param os output stream
+     * @brief Print some information about the packet.
+     * @param os output stream
      */
     void Print(std::ostream& os) const override;
     /**
-     * \brief Get the serialized size of the packet.
-     * \return size
+     * @brief Get the serialized size of the packet.
+     * @return size
      */
     uint32_t GetSerializedSize() const override;
     /**
-     * \brief Serialize the packet.
-     * \param start Buffer iterator
+     * @brief Serialize the packet.
+     * @param start Buffer iterator
      */
     void Serialize(Buffer::Iterator start) const override;
     /**
-     * \brief Deserialize the packet.
-     * \param start Buffer iterator
-     * \return size of the packet
+     * @brief Deserialize the packet.
+     * @param start Buffer iterator
+     * @return size of the packet
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
     /**
-     * \brief Get the Alignment requirement of this option header
-     * \return The required alignment
+     * @brief Get the Alignment requirement of this option header
+     * @return The required alignment
      */
     Alignment GetAlignment() const override;
 
   private:
     /**
-     * \brief Identifier of the packet.
+     * @brief Identifier of the packet.
      */
     uint16_t m_identification;
     /**
@@ -374,20 +374,20 @@
      */
     Ipv4Address m_address;
     /**
-     * \brief A vector of IPv4 Address.
+     * @brief A vector of IPv4 Address.
      */
     typedef std::vector<Ipv4Address> VectorIpv4Address_t;
     /**
-     * \brief The vector of Nodes' IPv4 Address.
+     * @brief The vector of Nodes' IPv4 Address.
      */
     VectorIpv4Address_t m_ipv4Address;
 };
 
 /**
- * \ingroup dsr
- * \brief Header of Dsr Option Route Reply
+ * @ingroup dsr
+ * @brief Header of Dsr Option Route Reply
  *
- * \verbatim
+ * @verbatim
    Standard Route Reply (RREP) Message Format
 
    |      0        |      1        |      2        |      3        |
@@ -407,7 +407,7 @@
  *
  * The Route Reply header modified for ns-3 implementation:
  *
- * \verbatim
+ * @verbatim
    ns-3 Route Reply (RREP) Message Format
 
    |      0        |      1        |      2        |      3        |
@@ -429,80 +429,80 @@
 {
   public:
     /**
-     * \brief Get the type identificator.
-     * \return type identificator
+     * @brief Get the type identificator.
+     * @return type identificator
      */
     static TypeId GetTypeId();
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     DsrOptionRrepHeader();
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~DsrOptionRrepHeader() override;
     /**
-     * \brief Set the number of ipv4 address.
-     * \param n the number of ipv4 address
+     * @brief Set the number of ipv4 address.
+     * @param n the number of ipv4 address
      */
     void SetNumberAddress(uint8_t n);
     /**
-     * \brief Set the vector of ipv4 address
-     * \param ipv4Address the vector of ipv4 address
+     * @brief Set the vector of ipv4 address
+     * @param ipv4Address the vector of ipv4 address
      */
     void SetNodesAddress(std::vector<Ipv4Address> ipv4Address);
     /**
-     * \brief Get the vector of ipv4 address
-     * \return the vector of ipv4 address
+     * @brief Get the vector of ipv4 address
+     * @return the vector of ipv4 address
      */
     std::vector<Ipv4Address> GetNodesAddress() const;
     /**
-     * \brief Get the target node Ip address
-     * \param ipv4Address target address
-     * \return the target address
+     * @brief Get the target node Ip address
+     * @param ipv4Address target address
+     * @return the target address
      */
     Ipv4Address GetTargetAddress(std::vector<Ipv4Address> ipv4Address) const;
     /**
-     * \brief Set a Node IPv4 Address.
-     * \param index the index of the IPv4 Address
-     * \param addr the new IPv4 Address
+     * @brief Set a Node IPv4 Address.
+     * @param index the index of the IPv4 Address
+     * @param addr the new IPv4 Address
      */
     void SetNodeAddress(uint8_t index, Ipv4Address addr);
     /**
-     * \brief Get a Node IPv4 Address.
-     * \param index the index of the IPv4 Address
-     * \return the router IPv4 Address
+     * @brief Get a Node IPv4 Address.
+     * @param index the index of the IPv4 Address
+     * @return the router IPv4 Address
      */
     Ipv4Address GetNodeAddress(uint8_t index) const;
     /**
-     * \brief Print some information about the packet.
-     * \param os output stream
+     * @brief Print some information about the packet.
+     * @param os output stream
      */
     void Print(std::ostream& os) const override;
     /**
-     * \brief Get the serialized size of the packet.
-     * \return size
+     * @brief Get the serialized size of the packet.
+     * @return size
      */
     uint32_t GetSerializedSize() const override;
     /**
-     * \brief Serialize the packet.
-     * \param start Buffer iterator
+     * @brief Serialize the packet.
+     * @param start Buffer iterator
      */
     void Serialize(Buffer::Iterator start) const override;
     /**
-     * \brief Deserialize the packet.
-     * \param start Buffer iterator
-     * \return size of the packet
+     * @brief Deserialize the packet.
+     * @param start Buffer iterator
+     * @return size of the packet
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
     /**
-     * \brief Get the Alignment requirement of this option header
-     * \return The required alignment
+     * @brief Get the Alignment requirement of this option header
+     * @return The required alignment
      */
     Alignment GetAlignment() const override;
 
@@ -512,20 +512,20 @@
      */
     Ipv4Address m_address;
     /**
-     * \brief typedef for a vector of IPv4 Addresses.
+     * @brief typedef for a vector of IPv4 Addresses.
      */
     typedef std::vector<Ipv4Address> VectorIpv4Address_t;
     /**
-     * \brief The vector of Nodes' IPv4 Address.
+     * @brief The vector of Nodes' IPv4 Address.
      */
     VectorIpv4Address_t m_ipv4Address;
 };
 
 /**
- * \ingroup dsr
- * \brief Header of Dsr Option Source Route
+ * @ingroup dsr
+ * @brief Header of Dsr Option Source Route
  *
- * \verbatim
+ * @verbatim
    Source Route (SR) Message Format
 
    |      0        |      1        |      2        |      3        |
@@ -547,136 +547,136 @@
 {
   public:
     /**
-     * \brief Get the type identificator.
-     * \return type identificator
+     * @brief Get the type identificator.
+     * @return type identificator
      */
     static TypeId GetTypeId();
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     DsrOptionSRHeader();
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~DsrOptionSRHeader() override;
     /**
-     * \brief Set the number of segments left to send
-     * \param segmentsLeft The segments left
+     * @brief Set the number of segments left to send
+     * @param segmentsLeft The segments left
      */
     void SetSegmentsLeft(uint8_t segmentsLeft);
     /**
-     * \brief Get the number of segments left to send
-     * \return The segments left
+     * @brief Get the number of segments left to send
+     * @return The segments left
      */
     uint8_t GetSegmentsLeft() const;
     /**
-     * \brief Set the number of ipv4 address.
-     * \param n the number of ipv4' address
+     * @brief Set the number of ipv4 address.
+     * @param n the number of ipv4' address
      */
     void SetNumberAddress(uint8_t n);
     /**
-     * \brief Set the vector of ipv4 address
-     * \param ipv4Address the vector of ipv4 address
+     * @brief Set the vector of ipv4 address
+     * @param ipv4Address the vector of ipv4 address
      */
     void SetNodesAddress(std::vector<Ipv4Address> ipv4Address);
     /**
-     * \brief Get the vector of ipv4 address
-     * \return the vector of ipv4 address
+     * @brief Get the vector of ipv4 address
+     * @return the vector of ipv4 address
      */
     std::vector<Ipv4Address> GetNodesAddress() const;
     /**
-     * \brief Get the node list size which is the number of ip address of the route
-     * \return the node list size
+     * @brief Get the node list size which is the number of ip address of the route
+     * @return the node list size
      */
     uint8_t GetNodeListSize() const;
     /**
-     * \brief Set a Node IPv4 Address.
-     * \param index the index of the IPv4 Address
-     * \param addr the new IPv4 Address
+     * @brief Set a Node IPv4 Address.
+     * @param index the index of the IPv4 Address
+     * @param addr the new IPv4 Address
      */
     void SetNodeAddress(uint8_t index, Ipv4Address addr);
     /**
-     * \brief Get a Node IPv4 Address.
-     * \param index the index of the IPv4 Address
-     * \return the router IPv4 Address
+     * @brief Get a Node IPv4 Address.
+     * @param index the index of the IPv4 Address
+     * @return the router IPv4 Address
      */
     Ipv4Address GetNodeAddress(uint8_t index) const;
     /**
-     * \brief Set the salvage value for a packet
-     * \param salvage The salvage value of the packet
+     * @brief Set the salvage value for a packet
+     * @param salvage The salvage value of the packet
      */
     void SetSalvage(uint8_t salvage);
     /**
-     * \brief Get the salvage value for a packet
-     * \return The salvage value of the packet
+     * @brief Get the salvage value for a packet
+     * @return The salvage value of the packet
      */
     uint8_t GetSalvage() const;
     /**
-     * \brief Print some information about the packet.
-     * \param os output stream
+     * @brief Print some information about the packet.
+     * @param os output stream
      */
     void Print(std::ostream& os) const override;
     /**
-     * \brief Get the serialized size of the packet.
-     * \return size
+     * @brief Get the serialized size of the packet.
+     * @return size
      */
     uint32_t GetSerializedSize() const override;
     /**
-     * \brief Serialize the packet.
-     * \param start Buffer iterator
+     * @brief Serialize the packet.
+     * @param start Buffer iterator
      */
     void Serialize(Buffer::Iterator start) const override;
     /**
-     * \brief Deserialize the packet.
-     * \param start Buffer iterator
-     * \return size of the packet
+     * @brief Deserialize the packet.
+     * @param start Buffer iterator
+     * @return size of the packet
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
     /**
-     * \brief Get the Alignment requirement of this option header
-     * \return The required alignment
+     * @brief Get the Alignment requirement of this option header
+     * @return The required alignment
      */
     Alignment GetAlignment() const override;
 
     /**
      * TracedCallback signature for DsrOptionSrHeader.
      *
-     * \param [in] header The DsrOptionsSRHeader
+     * @param [in] header The DsrOptionsSRHeader
      */
     typedef void (*TracedCallback)(const DsrOptionSRHeader& header);
 
   private:
     /**
-     * \brief The ip address header deserialize to
+     * @brief The ip address header deserialize to
      */
     Ipv4Address m_address;
     /**
-     * \brief Number of left segments.
+     * @brief Number of left segments.
      */
     uint8_t m_segmentsLeft;
     /**
-     * \brief Number of salvage times for a packet.
+     * @brief Number of salvage times for a packet.
      */
     uint8_t m_salvage;
     /**
-     * \brief A vector of IPv4 Address.
+     * @brief A vector of IPv4 Address.
      */
     typedef std::vector<Ipv4Address> VectorIpv4Address_t;
     /**
-     * \brief The vector of Nodes' IPv4 Address.
+     * @brief The vector of Nodes' IPv4 Address.
      */
     VectorIpv4Address_t m_ipv4Address;
 };
 
 /**
- * \ingroup dsr
- * \enum ErrorType
- * \brief Error type used in several DSR Option Headers
+ * @ingroup dsr
+ * @enum ErrorType
+ * @brief Error type used in several DSR Option Headers
  */
 enum ErrorType
 {
@@ -686,10 +686,10 @@
 };
 
 /**
- * \ingroup dsr
- * \brief Header of Dsr Option Route Error
+ * @ingroup dsr
+ * @brief Header of Dsr Option Route Error
  *
- * \verbatim
+ * @verbatim
    Route Error (RERR) Message Format
 
    |      0        |      1        |      2        |      3        |
@@ -714,122 +714,122 @@
 {
   public:
     /**
-     * \brief Get the type identificator.
-     * \return type identificator
+     * @brief Get the type identificator.
+     * @return type identificator
      */
     static TypeId GetTypeId();
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     DsrOptionRerrHeader();
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~DsrOptionRerrHeader() override;
     /**
-     * \brief Set the route error type
-     * \param errorType The error type
+     * @brief Set the route error type
+     * @param errorType The error type
      */
     void SetErrorType(uint8_t errorType);
     /**
-     * \brief Get the route error type
-     * \return The error type
+     * @brief Get the route error type
+     * @return The error type
      */
     uint8_t GetErrorType() const;
     /**
-     * \brief Set the route error source address
-     * \param errorSrcAddress The error source address
+     * @brief Set the route error source address
+     * @param errorSrcAddress The error source address
      */
     virtual void SetErrorSrc(Ipv4Address errorSrcAddress);
     /**
-     * \brief Get the route error source address
-     * \return The error source address
+     * @brief Get the route error source address
+     * @return The error source address
      */
     virtual Ipv4Address GetErrorSrc() const;
     /**
-     * \brief Set the salvage value of the packet
-     * \param salvage The salvage value of the packet
+     * @brief Set the salvage value of the packet
+     * @param salvage The salvage value of the packet
      */
     virtual void SetSalvage(uint8_t salvage);
     /**
-     * \brief Get the salvage value of the packet
-     * \return The salvage value of the packet
+     * @brief Get the salvage value of the packet
+     * @return The salvage value of the packet
      */
     virtual uint8_t GetSalvage() const;
     /**
-     * \brief Set the error destination ip address
-     * \param errorDstAddress The error destination address
+     * @brief Set the error destination ip address
+     * @param errorDstAddress The error destination address
      */
     virtual void SetErrorDst(Ipv4Address errorDstAddress);
     /**
-     * \brief Get the error destination ip address
-     * \return The error destination address
+     * @brief Get the error destination ip address
+     * @return The error destination address
      */
     virtual Ipv4Address GetErrorDst() const;
     /**
-     * \brief Print some information about the packet.
-     * \param os output stream
+     * @brief Print some information about the packet.
+     * @param os output stream
      */
     void Print(std::ostream& os) const override;
     /**
-     * \brief Get the serialized size of the packet.
-     * \return size
+     * @brief Get the serialized size of the packet.
+     * @return size
      */
     uint32_t GetSerializedSize() const override;
     /**
-     * \brief Serialize the packet.
-     * \param start Buffer iterator
+     * @brief Serialize the packet.
+     * @param start Buffer iterator
      */
     void Serialize(Buffer::Iterator start) const override;
     /**
-     * \brief Deserialize the packet.
-     * \param start Buffer iterator
-     * \return size of the packet
+     * @brief Deserialize the packet.
+     * @param start Buffer iterator
+     * @return size of the packet
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
     /**
-     * \brief Get the Alignment requirement of this option header
-     * \return The required alignment
+     * @brief Get the Alignment requirement of this option header
+     * @return The required alignment
      */
     Alignment GetAlignment() const override;
 
   private:
     /**
-     * \brief The error type or route error option
+     * @brief The error type or route error option
      */
     uint8_t m_errorType;
     /**
-     * \brief The salvage field
+     * @brief The salvage field
      */
     uint8_t m_salvage;
     /**
-     * \brief The specific error message length
+     * @brief The specific error message length
      */
     uint16_t m_errorLength;
     /**
-     * \brief The error source address
+     * @brief The error source address
      */
     Ipv4Address m_errorSrcAddress;
     /**
-     * \brief The error destination address
+     * @brief The error destination address
      */
     Ipv4Address m_errorDstAddress;
     /**
-     * \brief The anonymous data of this option
+     * @brief The anonymous data of this option
      */
     Buffer m_errorData;
 };
 
 /**
- * \ingroup dsr
- * \brief Route Error (RERR) Unreachable node address option Message Format
+ * @ingroup dsr
+ * @brief Route Error (RERR) Unreachable node address option Message Format
  *
- * \verbatim
+ * @verbatim
    Route Error Unreachable type-specific info field
 
    |      0        |      1        |      2        |      3        |
@@ -843,134 +843,134 @@
 {
   public:
     /**
-     * \brief Get the type identificator.
-     * \return type identificator
+     * @brief Get the type identificator.
+     * @return type identificator
      */
     static TypeId GetTypeId();
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     DsrOptionRerrUnreachHeader();
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~DsrOptionRerrUnreachHeader() override;
     /**
-     * \brief Set the route error source address
-     * \param errorSrcAddress The error source address
+     * @brief Set the route error source address
+     * @param errorSrcAddress The error source address
      */
     void SetErrorSrc(Ipv4Address errorSrcAddress) override;
     /**
-     * \brief Get the route error source address
-     * \return The error source address
+     * @brief Get the route error source address
+     * @return The error source address
      */
     Ipv4Address GetErrorSrc() const override;
     /**
-     * \brief Set the salvage value of the packet
-     * \param salvage The salvage value of the packet
+     * @brief Set the salvage value of the packet
+     * @param salvage The salvage value of the packet
      */
     void SetSalvage(uint8_t salvage) override;
     /**
-     * \brief Get the salvage value of the packet
-     * \return The salvage value of the packet
+     * @brief Get the salvage value of the packet
+     * @return The salvage value of the packet
      */
     uint8_t GetSalvage() const override;
     /**
-     * \brief Set the error destination ip address
-     * \param errorDstAddress The error destination address
+     * @brief Set the error destination ip address
+     * @param errorDstAddress The error destination address
      */
     void SetErrorDst(Ipv4Address errorDstAddress) override;
     /**
-     * \brief Get the error destination ip address
-     * \return The error destination address
+     * @brief Get the error destination ip address
+     * @return The error destination address
      */
     Ipv4Address GetErrorDst() const override;
     /**
-     * \brief Set the unreachable node ip address
-     * \param unreachNode The unreachable ip address
+     * @brief Set the unreachable node ip address
+     * @param unreachNode The unreachable ip address
      */
     void SetUnreachNode(Ipv4Address unreachNode);
     /**
-     * \brief Get the unreachable node ip address
-     * \return The unreachable ip address
+     * @brief Get the unreachable node ip address
+     * @return The unreachable ip address
      */
     Ipv4Address GetUnreachNode() const;
     /**
-     * \brief Set the unreachable node ip address
-     * \param originalDst The unreachable ip address
+     * @brief Set the unreachable node ip address
+     * @param originalDst The unreachable ip address
      */
     void SetOriginalDst(Ipv4Address originalDst);
     /**
-     * \brief Get the unreachable node ip address
-     * \return The unreachable ip address
+     * @brief Get the unreachable node ip address
+     * @return The unreachable ip address
      */
     Ipv4Address GetOriginalDst() const;
     /**
-     * \brief Print some information about the packet.
-     * \param os output stream
+     * @brief Print some information about the packet.
+     * @param os output stream
      */
     void Print(std::ostream& os) const override;
     /**
-     * \brief Get the serialized size of the packet.
-     * \return size
+     * @brief Get the serialized size of the packet.
+     * @return size
      */
     uint32_t GetSerializedSize() const override;
     /**
-     * \brief Serialize the packet.
-     * \param start Buffer iterator
+     * @brief Serialize the packet.
+     * @param start Buffer iterator
      */
     void Serialize(Buffer::Iterator start) const override;
     /**
-     * \brief Deserialize the packet.
-     * \param start Buffer iterator
-     * \return size of the packet
+     * @brief Deserialize the packet.
+     * @param start Buffer iterator
+     * @return size of the packet
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
     /**
-     * \brief Get the Alignment requirement of this option header
-     * \return The required alignment
+     * @brief Get the Alignment requirement of this option header
+     * @return The required alignment
      */
     Alignment GetAlignment() const override;
 
   private:
     /**
-     * \brief The error type or route error option
+     * @brief The error type or route error option
      */
     uint8_t m_errorType;
     /**
-     * \brief The salvage field
+     * @brief The salvage field
      */
     uint8_t m_salvage;
     /**
-     * \brief The error source address
+     * @brief The error source address
      */
     Ipv4Address m_errorSrcAddress;
     /**
-     * \brief The error destination address
+     * @brief The error destination address
      */
     Ipv4Address m_errorDstAddress;
     /**
-     * \brief The unreachable node address
+     * @brief The unreachable node address
      */
     Ipv4Address m_unreachNode;
     /**
-     * \brief The original destination address
+     * @brief The original destination address
      */
     Ipv4Address m_originalDst;
 };
 
 /**
- * \ingroup dsr
- * \brief Route Error (RERR) Unsupported option Message Format
+ * @ingroup dsr
+ * @brief Route Error (RERR) Unsupported option Message Format
  *
  * The type-specific info field of DsrOptionRerrHeader contains
  *
- * \verbatim
+ * @verbatim
    Route Error Unsupported type-specific info field
 
    |      0        |
@@ -984,118 +984,118 @@
 {
   public:
     /**
-     * \brief Get the type identificator.
-     * \return type identificator
+     * @brief Get the type identificator.
+     * @return type identificator
      */
     static TypeId GetTypeId();
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     DsrOptionRerrUnsupportedHeader();
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~DsrOptionRerrUnsupportedHeader() override;
     /**
-     * \brief Set the route error source address
-     * \param errorSrcAddress The error source address
+     * @brief Set the route error source address
+     * @param errorSrcAddress The error source address
      */
     void SetErrorSrc(Ipv4Address errorSrcAddress) override;
     /**
-     * \brief Get the route error source address
-     * \return The error source address
+     * @brief Get the route error source address
+     * @return The error source address
      */
     Ipv4Address GetErrorSrc() const override;
     /**
-     * \brief Set the salvage value of the packet
-     * \param salvage the salvage value
+     * @brief Set the salvage value of the packet
+     * @param salvage the salvage value
      */
     void SetSalvage(uint8_t salvage) override;
     /**
-     * \brief Get the salvage value of the packet
-     * \return The salvage value of the packet
+     * @brief Get the salvage value of the packet
+     * @return The salvage value of the packet
      */
     uint8_t GetSalvage() const override;
     /**
-     * \brief Set the error destination ip address
-     * \param errorDstAddress The error destination address
+     * @brief Set the error destination ip address
+     * @param errorDstAddress The error destination address
      */
     void SetErrorDst(Ipv4Address errorDstAddress) override;
     /**
-     * \brief Get the error destination ip address
-     * \return The error destination address
+     * @brief Get the error destination ip address
+     * @return The error destination address
      */
     Ipv4Address GetErrorDst() const override;
     /**
-     * \brief Set the unsupported option type value
-     * \param optionType The unsupported option type value
+     * @brief Set the unsupported option type value
+     * @param optionType The unsupported option type value
      */
     void SetUnsupported(uint16_t optionType);
     /**
-     * \brief Get the unsupported option type value
-     * \return The unsupported option type value
+     * @brief Get the unsupported option type value
+     * @return The unsupported option type value
      */
     uint16_t GetUnsupported() const;
     /**
-     * \brief Print some information about the packet.
-     * \param os output stream
+     * @brief Print some information about the packet.
+     * @param os output stream
      */
     void Print(std::ostream& os) const override;
     /**
-     * \brief Get the serialized size of the packet.
-     * \return size
+     * @brief Get the serialized size of the packet.
+     * @return size
      */
     uint32_t GetSerializedSize() const override;
     /**
-     * \brief Serialize the packet.
-     * \param start Buffer iterator
+     * @brief Serialize the packet.
+     * @param start Buffer iterator
      */
     void Serialize(Buffer::Iterator start) const override;
     /**
-     * \brief Deserialize the packet.
-     * \param start Buffer iterator
-     * \return size of the packet
+     * @brief Deserialize the packet.
+     * @param start Buffer iterator
+     * @return size of the packet
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
     /**
-     * \brief Get the Alignment requirement of this option header
-     * \return The required alignment
+     * @brief Get the Alignment requirement of this option header
+     * @return The required alignment
      */
     Alignment GetAlignment() const override;
 
   private:
     /**
-     * \brief The error type or route error option
+     * @brief The error type or route error option
      */
     uint8_t m_errorType;
     /**
-     * \brief The salvage field
+     * @brief The salvage field
      */
     uint8_t m_salvage;
     /**
-     * \brief The error source address
+     * @brief The error source address
      */
     Ipv4Address m_errorSrcAddress;
     /**
-     * \brief The error destination address
+     * @brief The error destination address
      */
     Ipv4Address m_errorDstAddress;
     /**
-     * \brief The unsupported option
+     * @brief The unsupported option
      */
     uint16_t m_unsupported;
 };
 
 /**
- * \ingroup dsr
- * \brief Header of Dsr Option ack request
+ * @ingroup dsr
+ * @brief Header of Dsr Option ack request
  *
- * \verbatim
+ * @verbatim
    Acknowledgement Request (ACK_RREQ) Message Format
 
    |      0        |      1        |      2        |      3        |
@@ -1109,57 +1109,57 @@
 {
   public:
     /**
-     * \brief Get the type identificator.
-     * \return type identificator
+     * @brief Get the type identificator.
+     * @return type identificator
      */
     static TypeId GetTypeId();
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     DsrOptionAckReqHeader();
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~DsrOptionAckReqHeader() override;
     /**
-     * \brief Set the Ack request id number.
-     * \param identification the identification number
+     * @brief Set the Ack request id number.
+     * @param identification the identification number
      */
     void SetAckId(uint16_t identification);
     /**
-     * \brief Set the Ack request id number.
-     * \return request id number
+     * @brief Set the Ack request id number.
+     * @return request id number
      */
     uint16_t GetAckId() const;
     /**
-     * \brief Print some information about the packet.
-     * \param os output stream
+     * @brief Print some information about the packet.
+     * @param os output stream
      */
     void Print(std::ostream& os) const override;
     /**
-     * \brief Get the serialized size of the packet.
-     * \return size
+     * @brief Get the serialized size of the packet.
+     * @return size
      */
     uint32_t GetSerializedSize() const override;
     /**
-     * \brief Serialize the packet.
-     * \param start Buffer iterator
+     * @brief Serialize the packet.
+     * @param start Buffer iterator
      */
     void Serialize(Buffer::Iterator start) const override;
     /**
-     * \brief Deserialize the packet.
-     * \param start Buffer iterator
-     * \return size of the packet
+     * @brief Deserialize the packet.
+     * @param start Buffer iterator
+     * @return size of the packet
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
     /**
-     * \brief Get the Alignment requirement of this option header
-     * \return The required alignment
+     * @brief Get the Alignment requirement of this option header
+     * @return The required alignment
      */
     Alignment GetAlignment() const override;
 
@@ -1171,10 +1171,10 @@
 };
 
 /**
- * \ingroup dsr
- * \brief Header of Dsr Option ack
+ * @ingroup dsr
+ * @brief Header of Dsr Option ack
  *
- * \verbatim
+ * @verbatim
    Acknowledgement (ACK) Message Format
 
    |      0        |      1        |      2        |      3        |
@@ -1192,91 +1192,91 @@
 {
   public:
     /**
-     * \brief Get the type identificator.
-     * \return type identificator
+     * @brief Get the type identificator.
+     * @return type identificator
      */
     static TypeId GetTypeId();
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     DsrOptionAckHeader();
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~DsrOptionAckHeader() override;
     /**
-     * \brief Set the Ack id number.
-     * \param identification the identification number
+     * @brief Set the Ack id number.
+     * @param identification the identification number
      */
     void SetAckId(uint16_t identification);
     /**
-     * \brief Set the Ack id number.
-     * \return request id number
+     * @brief Set the Ack id number.
+     * @return request id number
      */
     uint16_t GetAckId() const;
     /**
-     * \brief Set Error source ip address.
-     * \param realSrcAddress The real source address
+     * @brief Set Error source ip address.
+     * @param realSrcAddress The real source address
      */
     void SetRealSrc(Ipv4Address realSrcAddress);
     /**
-     * \brief Get Error source ip address.
-     * \return The real source address
+     * @brief Get Error source ip address.
+     * @return The real source address
      */
     Ipv4Address GetRealSrc() const;
     /**
-     * \brief Set Error source ip address.
-     * \param realDstAddress The real dst address
+     * @brief Set Error source ip address.
+     * @param realDstAddress The real dst address
      */
     void SetRealDst(Ipv4Address realDstAddress);
     /**
-     * \brief Get Error source ip address.
-     * \return The real dst address
+     * @brief Get Error source ip address.
+     * @return The real dst address
      */
     Ipv4Address GetRealDst() const;
     /**
-     * \brief Print some information about the packet.
-     * \param os output stream
+     * @brief Print some information about the packet.
+     * @param os output stream
      */
     void Print(std::ostream& os) const override;
     /**
-     * \brief Get the serialized size of the packet.
-     * \return size
+     * @brief Get the serialized size of the packet.
+     * @return size
      */
     uint32_t GetSerializedSize() const override;
     /**
-     * \brief Serialize the packet.
-     * \param start Buffer iterator
+     * @brief Serialize the packet.
+     * @param start Buffer iterator
      */
     void Serialize(Buffer::Iterator start) const override;
     /**
-     * \brief Deserialize the packet.
-     * \param start Buffer iterator
-     * \return size of the packet
+     * @brief Deserialize the packet.
+     * @param start Buffer iterator
+     * @return size of the packet
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
     /**
-     * \brief Get the Alignment requirement of this option header
-     * \return The required alignment
+     * @brief Get the Alignment requirement of this option header
+     * @return The required alignment
      */
     Alignment GetAlignment() const override;
 
   private:
     /**
-     * \brief Identification field
+     * @brief Identification field
      */
     uint16_t m_identification;
     /**
-     * \brief Ack source address
+     * @brief Ack source address
      */
     Ipv4Address m_realSrcAddress;
     /**
-     * \brief Ack destination address
+     * @brief Ack destination address
      */
     Ipv4Address m_realDstAddress;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/dsr/model/dsr-options.cc ns-3.44/src/dsr/model/dsr-options.cc
--- ns-3.43/src/dsr/model/dsr-options.cc	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/dsr/model/dsr-options.cc	2025-03-09 16:55:49.371371000 -0700
@@ -535,8 +535,8 @@
     Ptr<Packet> p =
         packet->Copy(); // Note: The packet here doesn't contain the fixed size dsr header
     /*
-     * \brief Get the number of routers' address field before removing the header
-     * \peek the packet and get the value
+     * @brief Get the number of routers' address field before removing the header
+     * @peek the packet and get the value
      */
     uint8_t buf[2];
     p->CopyData(buf, sizeof(buf));
@@ -1597,7 +1597,7 @@
         DsrOptionRerrUnsupportedHeader rerrUnsupported;
         p->RemoveHeader(rerrUnsupported);
 
-        /// \todo This is for the other two error options, not supporting for now
+        /// @todo This is for the other two error options, not supporting for now
         // uint32_t rerrSize = rerrUnsupported.GetSerializedSize();
         // uint32_t serialized = DoSendError (p, rerrUnsupported, rerrSize, ipv4Address, protocol);
         uint32_t serialized = 0;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/dsr/model/dsr-options.h ns-3.44/src/dsr/model/dsr-options.h
--- ns-3.43/src/dsr/model/dsr-options.h	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/dsr/model/dsr-options.h	2025-03-09 16:55:49.371371000 -0700
@@ -65,157 +65,157 @@
 {
   public:
     /**
-     * \brief Get the type identificator.
-     * \return type identificator
+     * @brief Get the type identificator.
+     * @return type identificator
      */
     static TypeId GetTypeId();
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     DsrOptions();
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~DsrOptions() override;
     /**
-     * \brief Get the option number.
-     * \return option number
+     * @brief Get the option number.
+     * @return option number
      */
     virtual uint8_t GetOptionNumber() const = 0;
     /**
-     * \brief Set the node.
-     * \param node the node to set
+     * @brief Set the node.
+     * @param node the node to set
      */
     void SetNode(Ptr<Node> node);
     /**
-     * \brief Get the node.
-     * \return the node
+     * @brief Get the node.
+     * @return the node
      */
     Ptr<Node> GetNode() const;
     /**
-     * \brief Search for the ipv4 address in the node list.
+     * @brief Search for the ipv4 address in the node list.
      *
-     * \param ipv4Address IPv4 address to search for
-     * \param destAddress IPv4 address in the list that we begin the search
-     * \param nodeList List of IPv4 addresses
-     * \return true if contain ip address
+     * @param ipv4Address IPv4 address to search for
+     * @param destAddress IPv4 address in the list that we begin the search
+     * @param nodeList List of IPv4 addresses
+     * @return true if contain ip address
      */
     bool ContainAddressAfter(Ipv4Address ipv4Address,
                              Ipv4Address destAddress,
                              std::vector<Ipv4Address>& nodeList);
     /**
-     * \brief Cut the route from ipv4Address to the end of the route vector
+     * @brief Cut the route from ipv4Address to the end of the route vector
      *
-     * \param ipv4Address the address to begin cutting
-     * \param nodeList List of IPv4 addresses
-     * \return the vector after the route cut
+     * @param ipv4Address the address to begin cutting
+     * @param nodeList List of IPv4 addresses
+     * @return the vector after the route cut
      */
     std::vector<Ipv4Address> CutRoute(Ipv4Address ipv4Address, std::vector<Ipv4Address>& nodeList);
     /**
-     * \brief Set the route to use for data packets,
+     * @brief Set the route to use for data packets,
      *        used by the option headers when sending data/control packets
      *
-     * \param nextHop IPv4 address of the next hop
-     * \param srcAddress IPv4 address of the source
-     * \return the route
+     * @param nextHop IPv4 address of the next hop
+     * @param srcAddress IPv4 address of the source
+     * @return the route
      */
     virtual Ptr<Ipv4Route> SetRoute(Ipv4Address nextHop, Ipv4Address srcAddress);
     /**
-     * \brief Reverse the routes.
+     * @brief Reverse the routes.
      *
-     * \param vec List of IPv4 addresses
-     * \return true if successfully reversed
+     * @param vec List of IPv4 addresses
+     * @return true if successfully reversed
      */
     bool ReverseRoutes(std::vector<Ipv4Address>& vec);
     /**
-     * \brief Search for the next hop in the route
+     * @brief Search for the next hop in the route
      *
-     * \param ipv4Address the IPv4 address of the node we are looking for its next hop address
-     * \param vec List of IPv4 addresses
-     * \return the next hop address if found
+     * @param ipv4Address the IPv4 address of the node we are looking for its next hop address
+     * @param vec List of IPv4 addresses
+     * @return the next hop address if found
      */
     Ipv4Address SearchNextHop(Ipv4Address ipv4Address, std::vector<Ipv4Address>& vec);
     /**
-     * \brief Reverse search for the next hop in the route
+     * @brief Reverse search for the next hop in the route
      *
-     * \param ipv4Address the IPv4 address of the node we are looking for its next hop address
-     * \param vec List of IPv4 addresses
-     * \return the previous next hop address if found
+     * @param ipv4Address the IPv4 address of the node we are looking for its next hop address
+     * @param vec List of IPv4 addresses
+     * @return the previous next hop address if found
      */
     Ipv4Address ReverseSearchNextHop(Ipv4Address ipv4Address, std::vector<Ipv4Address>& vec);
     /**
-     * \brief Reverse search for the next two hop in the route
+     * @brief Reverse search for the next two hop in the route
      *
-     * \param ipv4Address the IPv4 address of the node we are looking for its next two hop address
-     * \param vec List of IPv4 addresses
-     * \return the previous next two hop address if found
+     * @param ipv4Address the IPv4 address of the node we are looking for its next two hop address
+     * @param vec List of IPv4 addresses
+     * @return the previous next two hop address if found
      */
     Ipv4Address ReverseSearchNextTwoHop(Ipv4Address ipv4Address, std::vector<Ipv4Address>& vec);
     /**
-     * \brief Print out the elements in the route vector
-     * \param vec The route vector to print.
+     * @brief Print out the elements in the route vector
+     * @param vec The route vector to print.
      */
     void PrintVector(std::vector<Ipv4Address>& vec);
     /**
-     * \brief Check if the two vectors contain duplicate or not
+     * @brief Check if the two vectors contain duplicate or not
      *
-     * \param vec the first list of IPv4 addresses
-     * \param vec2 the second list of IPv4 addresses
-     * \return true if contains duplicate
+     * @param vec the first list of IPv4 addresses
+     * @param vec2 the second list of IPv4 addresses
+     * @return true if contains duplicate
      */
     bool IfDuplicates(std::vector<Ipv4Address>& vec, std::vector<Ipv4Address>& vec2);
     /**
-     * \brief Check if the route already contains the node ip address
+     * @brief Check if the route already contains the node ip address
      *
-     * \param ipv4Address the IPv4 address that we are looking for
-     * \param vec List of IPv4 addresses
-     * \return true if it already exists
+     * @param ipv4Address the IPv4 address that we are looking for
+     * @param vec List of IPv4 addresses
+     * @return true if it already exists
      */
     bool CheckDuplicates(Ipv4Address ipv4Address, std::vector<Ipv4Address>& vec);
     /**
-     * \brief Remove the duplicates from the route
+     * @brief Remove the duplicates from the route
      *
-     * \param [in,out] vec List of IPv4 addresses to clean
+     * @param [in,out] vec List of IPv4 addresses to clean
      */
     void RemoveDuplicates(std::vector<Ipv4Address>& vec);
     /**
-     * \brief Schedule the intermediate node route request broadcast
-     * \param packet the original packet
-     * \param nodeList The list of IPv4 addresses
-     * \param source address
-     * \param destination address
+     * @brief Schedule the intermediate node route request broadcast
+     * @param packet the original packet
+     * @param nodeList The list of IPv4 addresses
+     * @param source address
+     * @param destination address
      */
     void ScheduleReply(Ptr<Packet>& packet,
                        std::vector<Ipv4Address>& nodeList,
                        Ipv4Address& source,
                        Ipv4Address& destination);
     /**
-     * \brief Get the node id with Ipv4Address
+     * @brief Get the node id with Ipv4Address
      *
-     * \param address IPv4 address to look for ID
-     * \return the id of the node
+     * @param address IPv4 address to look for ID
+     * @return the id of the node
      */
     uint32_t GetIDfromIP(Ipv4Address address);
     /**
-     * \brief Get the node object with Ipv4Address
+     * @brief Get the node object with Ipv4Address
      *
-     * \param ipv4Address IPv4 address of the node
-     * \return the object of the node
+     * @param ipv4Address IPv4 address of the node
+     * @return the object of the node
      */
     Ptr<Node> GetNodeWithAddress(Ipv4Address ipv4Address);
     /**
-     * \brief Process method
+     * @brief Process method
      *
      * Called from DsrRouting::Receive.
-     * \param packet the packet
-     * \param dsrP  the clean packet with payload
-     * \param ipv4Address the IPv4 address
-     * \param source IPv4 address of the source
-     * \param ipv4Header the IPv4 header of packet received
-     * \param protocol the protocol number of the up layer
-     * \param isPromisc if the packet must be dropped
-     * \param promiscSource IPv4 address
-     * \return the processed size
+     * @param packet the packet
+     * @param dsrP  the clean packet with payload
+     * @param ipv4Address the IPv4 address
+     * @param source IPv4 address of the source
+     * @param ipv4Header the IPv4 header of packet received
+     * @param protocol the protocol number of the up layer
+     * @param isPromisc if the packet must be dropped
+     * @param promiscSource IPv4 address
+     * @return the processed size
      */
     virtual uint8_t Process(Ptr<Packet> packet,
                             Ptr<Packet> dsrP,
@@ -228,39 +228,39 @@
 
   protected:
     /**
-     * \brief Drop trace callback.
+     * @brief Drop trace callback.
      */
     TracedCallback<Ptr<const Packet>> m_dropTrace;
     /**
-     * \brief The broadcast IP address.
+     * @brief The broadcast IP address.
      */
     Ipv4Address Broadcast;
     /**
-     * \brief The route request table.
+     * @brief The route request table.
      */
     Ptr<dsr::DsrRreqTable> m_rreqTable;
     /**
-     * \brief The route cache table.
+     * @brief The route cache table.
      */
     Ptr<dsr::DsrRouteCache> m_routeCache;
     /**
-     * \brief The ipv4 route.
+     * @brief The ipv4 route.
      */
     Ptr<Ipv4Route> m_ipv4Route;
     /**
-     * \brief The ipv4.
+     * @brief The ipv4.
      */
     Ptr<Ipv4> m_ipv4;
     /**
-     * \brief The vector of Ipv4 address.
+     * @brief The vector of Ipv4 address.
      */
     std::vector<Ipv4Address> m_ipv4Address;
     /**
-     * \brief The vector of final Ipv4 address.
+     * @brief The vector of final Ipv4 address.
      */
     std::vector<Ipv4Address> m_finalRoute;
     /**
-     * \brief The active route timeout value.
+     * @brief The active route timeout value.
      */
     Time ActiveRouteTimeout;
     /**
@@ -273,20 +273,20 @@
 };
 
 /**
- * \class DsrOptionPad1
- * \brief Dsr Option Pad1
+ * @class DsrOptionPad1
+ * @brief Dsr Option Pad1
  */
 class DsrOptionPad1 : public DsrOptions
 {
   public:
     /**
-     * \brief Pad1 option number.
+     * @brief Pad1 option number.
      */
     static const uint8_t OPT_NUMBER = 224;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -305,20 +305,20 @@
 };
 
 /**
- * \class DsrOptionPadn
- * \brief IPv4 Option Padn
+ * @class DsrOptionPadn
+ * @brief IPv4 Option Padn
  */
 class DsrOptionPadn : public DsrOptions
 {
   public:
     /**
-     * \brief PadN option number.
+     * @brief PadN option number.
      */
     static const uint8_t OPT_NUMBER = 0;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -337,33 +337,33 @@
 };
 
 /**
- * \class DsrOptionRreq
- * \brief Dsr Option Rreq
+ * @class DsrOptionRreq
+ * @brief Dsr Option Rreq
  */
 class DsrOptionRreq : public DsrOptions
 {
   public:
     /**
-     * \brief Rreq option number.
+     * @brief Rreq option number.
      */
     static const uint8_t OPT_NUMBER = 1;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     DsrOptionRreq();
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~DsrOptionRreq() override;
 
@@ -379,35 +379,35 @@
 
   private:
     /**
-     * \brief The route cache.
+     * @brief The route cache.
      */
     Ptr<dsr::DsrRouteCache> m_routeCache;
     /**
-     * \brief The ipv4.
+     * @brief The ipv4.
      */
     Ptr<Ipv4> m_ipv4;
 };
 
 /**
- * \class DsrOptionRrep
- * \brief Dsr Option Route Reply
+ * @class DsrOptionRrep
+ * @brief Dsr Option Route Reply
  */
 class DsrOptionRrep : public DsrOptions
 {
   public:
     /**
-     * \brief Router alert option number.
+     * @brief Router alert option number.
      */
     static const uint8_t OPT_NUMBER = 2;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
 
@@ -426,35 +426,35 @@
 
   private:
     /**
-     * \brief The route cache.
+     * @brief The route cache.
      */
     Ptr<dsr::DsrRouteCache> m_routeCache;
     /**
-     * \brief The ip layer 3.
+     * @brief The ip layer 3.
      */
     Ptr<Ipv4> m_ipv4;
 };
 
 /**
- * \class DsrOptionSR
- * \brief Dsr Option Source Route
+ * @class DsrOptionSR
+ * @brief Dsr Option Source Route
  */
 class DsrOptionSR : public DsrOptions
 {
   public:
     /**
-     * \brief Source Route option number.
+     * @brief Source Route option number.
      */
     static const uint8_t OPT_NUMBER = 96;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
 
@@ -473,31 +473,31 @@
 
   private:
     /**
-     * \brief The ip layer 3.
+     * @brief The ip layer 3.
      */
     Ptr<Ipv4> m_ipv4;
 };
 
 /**
- * \class DsrOptionRerr
- * \brief Dsr Option Route Error
+ * @class DsrOptionRerr
+ * @brief Dsr Option Route Error
  */
 class DsrOptionRerr : public DsrOptions
 {
   public:
     /**
-     * \brief Dsr Route Error option number.
+     * @brief Dsr Route Error option number.
      */
     static const uint8_t OPT_NUMBER = 3;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
 
@@ -514,14 +514,14 @@
                     bool& isPromisc,
                     Ipv4Address promiscSource) override;
     /**
-     * \brief Do Send error message
+     * @brief Do Send error message
      *
-     * \param p the packet
-     * \param rerr  the DsrOptionRerrUnreachHeader header
-     * \param rerrSize the route error header size
-     * \param ipv4Address ipv4 address of our own
-     * \param protocol the protocol number of the up layer
-     * \return the processed size
+     * @param p the packet
+     * @param rerr  the DsrOptionRerrUnreachHeader header
+     * @param rerrSize the route error header size
+     * @param ipv4Address ipv4 address of our own
+     * @param protocol the protocol number of the up layer
+     * @return the processed size
      */
     uint8_t DoSendError(Ptr<Packet> p,
                         DsrOptionRerrUnreachHeader& rerr,
@@ -531,35 +531,35 @@
 
   private:
     /**
-     * \brief The route cache.
+     * @brief The route cache.
      */
     Ptr<dsr::DsrRouteCache> m_routeCache;
     /**
-     * \brief The ipv4 layer 3.
+     * @brief The ipv4 layer 3.
      */
     Ptr<Ipv4> m_ipv4;
 };
 
 /**
- * \class DsrOptionAckReq
- * \brief Dsr Option
+ * @class DsrOptionAckReq
+ * @brief Dsr Option
  */
 class DsrOptionAckReq : public DsrOptions
 {
   public:
     /**
-     * \brief Dsr ack request option number.
+     * @brief Dsr ack request option number.
      */
     static const uint8_t OPT_NUMBER = 160;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
 
@@ -578,35 +578,35 @@
 
   private:
     /**
-     * \brief The route cache.
+     * @brief The route cache.
      */
     Ptr<dsr::DsrRouteCache> m_routeCache;
     /**
-     * \brief The ipv4 layer 3.
+     * @brief The ipv4 layer 3.
      */
     Ptr<Ipv4> m_ipv4;
 };
 
 /**
- * \class DsrOptionAck
- * \brief Dsr Option Ack
+ * @class DsrOptionAck
+ * @brief Dsr Option Ack
  */
 class DsrOptionAck : public DsrOptions
 {
   public:
     /**
-     * \brief The Dsr Ack option number.
+     * @brief The Dsr Ack option number.
      */
     static const uint8_t OPT_NUMBER = 32;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
 
@@ -625,11 +625,11 @@
 
   private:
     /**
-     * \brief The route cache.
+     * @brief The route cache.
      */
     Ptr<dsr::DsrRouteCache> m_routeCache;
     /**
-     * \brief The ipv4 layer 3.
+     * @brief The ipv4 layer 3.
      */
     Ptr<Ipv4> m_ipv4;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/dsr/model/dsr-passive-buff.cc ns-3.44/src/dsr/model/dsr-passive-buff.cc
--- ns-3.43/src/dsr/model/dsr-passive-buff.cc	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/dsr/model/dsr-passive-buff.cc	2025-03-09 16:55:49.371371000 -0700
@@ -176,13 +176,13 @@
 {
     /**
      * Check for an expired entry
-     * \param e passive buffer entry
-     * \return true if equal
+     * @param e passive buffer entry
+     * @return true if equal
      */
     bool operator()(const DsrPassiveBuffEntry& e) const
     {
         // NS_LOG_DEBUG("Expire time for packet in req queue: "<<e.GetExpireTime ());
-        return (e.GetExpireTime() < Seconds(0));
+        return (e.GetExpireTime().IsStrictlyNegative());
     }
 };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/dsr/model/dsr-passive-buff.h ns-3.44/src/dsr/model/dsr-passive-buff.h
--- ns-3.43/src/dsr/model/dsr-passive-buff.h	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/dsr/model/dsr-passive-buff.h	2025-03-09 16:55:49.371371000 -0700
@@ -30,8 +30,8 @@
 namespace dsr
 {
 /**
- * \ingroup dsr
- * \brief DSR Passive Buffer Entry
+ * @ingroup dsr
+ * @brief DSR Passive Buffer Entry
  */
 class DsrPassiveBuffEntry
 {
@@ -39,15 +39,15 @@
     /**
      * Construct a DsrPassiveBuffEntry with the given parameters
      *
-     * \param pa packet
-     * \param d IPv4 address of the destination
-     * \param s IPv4 address of the source
-     * \param n IPv4 address of the next hop node
-     * \param i ID
-     * \param f fragment offset
-     * \param seg number of segments left
-     * \param exp expiration time
-     * \param p protocol number
+     * @param pa packet
+     * @param d IPv4 address of the destination
+     * @param s IPv4 address of the source
+     * @param n IPv4 address of the next hop node
+     * @param i ID
+     * @param f fragment offset
+     * @param seg number of segments left
+     * @param exp expiration time
+     * @param p protocol number
      */
     DsrPassiveBuffEntry(Ptr<const Packet> pa = nullptr,
                         Ipv4Address d = Ipv4Address(),
@@ -72,8 +72,8 @@
 
     /**
      * Compare send buffer entries
-     * \param o passive buffer entry to compare
-     * \return true if equal
+     * @param o passive buffer entry to compare
+     * @return true if equal
      */
     bool operator==(const DsrPassiveBuffEntry& o) const
     {
@@ -84,7 +84,7 @@
     // Fields
     /**
      * Get packet function
-     * \returns the current packet
+     * @returns the current packet
      */
     Ptr<const Packet> GetPacket() const
     {
@@ -93,7 +93,7 @@
 
     /**
      * Set packet function
-     * \param p the current packet
+     * @param p the current packet
      */
     void SetPacket(Ptr<const Packet> p)
     {
@@ -102,7 +102,7 @@
 
     /**
      * Get destination address function
-     * \returns the destination IP address
+     * @returns the destination IP address
      */
     Ipv4Address GetDestination() const
     {
@@ -111,7 +111,7 @@
 
     /**
      * Set destination address function
-     * \param d the destination IP address
+     * @param d the destination IP address
      */
     void SetDestination(Ipv4Address d)
     {
@@ -120,7 +120,7 @@
 
     /**
      * Get source address function
-     * \returns the source IP address
+     * @returns the source IP address
      */
     Ipv4Address GetSource() const
     {
@@ -129,7 +129,7 @@
 
     /**
      * Set surce address function
-     * \param s the source IP address
+     * @param s the source IP address
      */
     void SetSource(Ipv4Address s)
     {
@@ -138,7 +138,7 @@
 
     /**
      * Get next hop address function
-     * \returns the next hop IP address
+     * @returns the next hop IP address
      */
     Ipv4Address GetNextHop() const
     {
@@ -147,7 +147,7 @@
 
     /**
      * Set next hop address function
-     * \param n the next hop address
+     * @param n the next hop address
      */
     void SetNextHop(Ipv4Address n)
     {
@@ -156,7 +156,7 @@
 
     /**
      * Get identification function
-     * \returns the identification
+     * @returns the identification
      */
     uint16_t GetIdentification() const
     {
@@ -165,7 +165,7 @@
 
     /**
      * Set identification function
-     * \param i the identification
+     * @param i the identification
      */
     void SetIdentification(uint16_t i)
     {
@@ -174,7 +174,7 @@
 
     /**
      * Get fragment offset function
-     * \returns the fragment offset
+     * @returns the fragment offset
      */
     uint16_t GetFragmentOffset() const
     {
@@ -183,7 +183,7 @@
 
     /**
      * Set fragment offset function
-     * \param f the fragment offset
+     * @param f the fragment offset
      */
     void SetFragmentOffset(uint16_t f)
     {
@@ -192,7 +192,7 @@
 
     /**
      * Get segments left function
-     * \returns the number of segments left
+     * @returns the number of segments left
      */
     uint8_t GetSegsLeft() const
     {
@@ -201,7 +201,7 @@
 
     /**
      * Set segments left
-     * \param seg the number of segments left
+     * @param seg the number of segments left
      */
     void SetSegsLeft(uint8_t seg)
     {
@@ -210,7 +210,7 @@
 
     /**
      * Set expire time
-     * \param exp the expire time
+     * @param exp the expire time
      */
     void SetExpireTime(Time exp)
     {
@@ -219,7 +219,7 @@
 
     /**
      * Get expire time
-     * \returns the expire time
+     * @returns the expire time
      */
     Time GetExpireTime() const
     {
@@ -228,7 +228,7 @@
 
     /**
      * Set protocol function
-     * \param p the protocol
+     * @param p the protocol
      */
     void SetProtocol(uint8_t p)
     {
@@ -237,7 +237,7 @@
 
     /**
      * Get protocol
-     * \returns the protocol number
+     * @returns the protocol number
      */
     uint8_t GetProtocol() const
     {
@@ -266,17 +266,17 @@
 };
 
 /**
- * \ingroup dsr
- * \class DsrPassiveBuffer
- * \brief DSR passive buffer
+ * @ingroup dsr
+ * @class DsrPassiveBuffer
+ * @brief DSR passive buffer
  */
 /************************************************************************************************************************/
 class DsrPassiveBuffer : public Object
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -285,32 +285,32 @@
 
     /// Push entry in queue, if there is no entry with the same packet and destination address in
     /// queue.
-    /// \param entry Buffer Entry
-    /// \return true on success adding the Entry.
+    /// @param entry Buffer Entry
+    /// @return true on success adding the Entry.
     bool Enqueue(DsrPassiveBuffEntry& entry);
     /// Return first found (the earliest) entry for given destination
-    /// \param [in] dst Entry destination
-    /// \param [out] entry The Entry found (if any).
-    /// \return true on success
+    /// @param [in] dst Entry destination
+    /// @param [out] entry The Entry found (if any).
+    /// @return true on success
     bool Dequeue(Ipv4Address dst, DsrPassiveBuffEntry& entry);
     /// Finds whether a packet with destination dst exists in the queue
-    /// \param dst Destination.
-    /// \return true if there is a packet.
+    /// @param dst Destination.
+    /// @return true if there is a packet.
     bool Find(Ipv4Address dst);
     /// Check if all the entries in passive buffer entry is all equal or not
-    /// \note For real this function checks if at most one entry is equal. If it is,
+    /// @note For real this function checks if at most one entry is equal. If it is,
     /// that entry is removed. Further entries are NOT checked. This could be a bug.
-    /// \param entry The Entry to check
-    /// \return true if an Entry was found and removed.
+    /// @param entry The Entry to check
+    /// @return true if an Entry was found and removed.
     bool AllEqual(DsrPassiveBuffEntry& entry);
     /// Number of entries
-    /// \return The number of entries.
+    /// @return The number of entries.
     uint32_t GetSize();
 
     // Fields
     /**
      * Get maximum queue length
-     * \returns the maximum queue length
+     * @returns the maximum queue length
      */
     uint32_t GetMaxQueueLen() const
     {
@@ -319,7 +319,7 @@
 
     /**
      * Set maximum queue length
-     * \param len the maximum queue length
+     * @param len the maximum queue length
      */
     void SetMaxQueueLen(uint32_t len)
     {
@@ -328,7 +328,7 @@
 
     /**
      * Get passive buffer timeout
-     * \returns the passive buffer timeout
+     * @returns the passive buffer timeout
      */
     Time GetPassiveBufferTimeout() const
     {
@@ -337,7 +337,7 @@
 
     /**
      * Set passive buffer timeout
-     * \param t the passive buffer timeout
+     * @param t the passive buffer timeout
      */
     void SetPassiveBufferTimeout(Time t)
     {
@@ -350,12 +350,12 @@
     /// Remove all expired entries
     void Purge();
     /// Notify that packet is dropped from queue by timeout
-    /// \param en BuffEntry Buffer entry
-    /// \param reason Drop reason
+    /// @param en BuffEntry Buffer entry
+    /// @param reason Drop reason
     void Drop(DsrPassiveBuffEntry en, std::string reason);
     /// Notify that packet is dropped from queue by timeout
-    /// \param en BuffEntry Buffer entry
-    /// \param reason Drop reason
+    /// @param en BuffEntry Buffer entry
+    /// @param reason Drop reason
     void DropLink(DsrPassiveBuffEntry en, std::string reason);
     /// The maximum number of packets that we allow a routing protocol to buffer.
     uint32_t m_maxLen;
@@ -364,9 +364,9 @@
     Time m_passiveBufferTimeout;
 
     /// Check if the send buffer entry is the same or not
-    /// \param en The Entry to check
-    /// \param link The link to check
-    /// \return true if an Entry source and Next hop are equal to the Link parameters
+    /// @param en The Entry to check
+    /// @param link The link to check
+    /// @return true if an Entry source and Next hop are equal to the Link parameters
     static bool LinkEqual(DsrPassiveBuffEntry en, const std::vector<Ipv4Address> link)
     {
         return ((en.GetSource() == link[0]) && (en.GetNextHop() == link[1]));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/dsr/model/dsr-rcache.cc ns-3.44/src/dsr/model/dsr-rcache.cc
--- ns-3.43/src/dsr/model/dsr-rcache.cc	2024-10-09 16:41:09.868656000 -0700
+++ ns-3.44/src/dsr/model/dsr-rcache.cc	2025-03-09 16:55:49.371371000 -0700
@@ -308,7 +308,7 @@
 {
     NS_LOG_FUNCTION(this << source);
     /**
-     * \brief The following are initialize-single-source
+     * @brief The following are initialize-single-source
      */
     // @d shortest-path estimate
     std::map<Ipv4Address, uint32_t> d;
@@ -329,7 +329,7 @@
     }
     d[source] = 0;
     /**
-     * \brief The following is the core of Dijkstra algorithm
+     * @brief The following is the core of Dijkstra algorithm
      */
     // the node set which shortest distance has been calculated, if true calculated
     std::map<Ipv4Address, bool> s;
@@ -344,7 +344,7 @@
             if (s.find(ip) == s.end())
             {
                 /*
-                 * \brief The following are for comparison
+                 * @brief The following are for comparison
                  */
                 if (j->second <= temp)
                 {
@@ -454,7 +454,7 @@
     {
         NS_LOG_DEBUG("The link stability " << i->second.GetLinkStability().As(Time::S));
         auto itmp = i;
-        if (i->second.GetLinkStability() <= Seconds(0))
+        if (i->second.GetLinkStability().IsNegative())
         {
             ++i;
             m_linkCache.erase(itmp);
@@ -469,7 +469,7 @@
     {
         NS_LOG_DEBUG("The node stability " << i->second.GetNodeStability().As(Time::S));
         auto itmp = i;
-        if (i->second.GetNodeStability() <= Seconds(0))
+        if (i->second.GetNodeStability().IsNegative())
         {
             ++i;
             m_nodeCache.erase(itmp);
@@ -489,7 +489,7 @@
     for (auto i = m_linkCache.begin(); i != m_linkCache.end(); ++i)
     {
         // Here the weight is set as 1
-        /// \todo May need to set different weight for different link here later
+        /// @todo May need to set different weight for different link here later
         uint32_t weight = 1;
         m_netGraph[i->first.m_low][i->first.m_high] = weight;
         m_netGraph[i->first.m_high][i->first.m_low] = weight;
@@ -510,7 +510,7 @@
     }
     else
     {
-        /// \todo get rid of the debug here
+        /// @todo get rid of the debug here
         NS_LOG_INFO("The node stability " << i->second.GetNodeStability().As(Time::S));
         NS_LOG_INFO("The stability here "
                     << Time(i->second.GetNodeStability() * m_stabilityIncrFactor).As(Time::S));
@@ -534,7 +534,7 @@
     }
     else
     {
-        /// \todo remove it here
+        /// @todo remove it here
         NS_LOG_INFO("The stability here " << i->second.GetNodeStability().As(Time::S));
         NS_LOG_INFO("The stability here "
                     << Time(i->second.GetNodeStability() / m_stabilityDecrFactor).As(Time::S));
@@ -614,7 +614,7 @@
             if (m_linkCache[link].GetLinkStability() < m_useExtends)
             {
                 m_linkCache[link].SetLinkStability(m_useExtends);
-                /// \todo remove after debug
+                /// @todo remove after debug
                 NS_LOG_INFO("The time of the link "
                             << m_linkCache[link].GetLinkStability().As(Time::S));
             }
@@ -669,7 +669,7 @@
     NS_LOG_DEBUG("The existing route size " << rtVector.size() << " for destination address "
                                             << dst);
     /**
-     * \brief Drop the most aged packet when buffer reaches to max
+     * @brief Drop the most aged packet when buffer reaches to max
      */
     if (rtVector.size() >= m_maxEntriesEachDst)
     {
@@ -686,7 +686,7 @@
     else
     {
         // Check if the expire time for the new route has expired or not
-        if (rt.GetExpireTime() > Time(0))
+        if (rt.GetExpireTime().IsStrictlyPositive())
         {
             rtVector.push_back(rt);
             // This sort function will sort the route cache entries based on the size of route
@@ -780,7 +780,7 @@
         // erase the two kind of links to make sure the link is removed from the link cache
         NS_LOG_DEBUG("Erase the route");
         m_linkCache.erase(link1);
-        /// \todo get rid of this one
+        /// @todo get rid of this one
         NS_LOG_DEBUG("The link cache size " << m_linkCache.size());
         m_linkCache.erase(link2);
         NS_LOG_DEBUG("The link cache size " << m_linkCache.size());
@@ -982,7 +982,7 @@
                 /*
                  * First verify if the route has expired or not
                  */
-                if (j->GetExpireTime() <= Seconds(0))
+                if (j->GetExpireTime().IsNegative())
                 {
                     /*
                      * When the expire time has passed, erase the certain route
@@ -1153,8 +1153,8 @@
     /**
      * Check if the entry is expired
      *
-     * \param nb DsrRouteCache::Neighbor entry
-     * \return true if expired or closed, false otherwise
+     * @param nb DsrRouteCache::Neighbor entry
+     * @return true if expired or closed, false otherwise
      */
     bool operator()(const DsrRouteCache::Neighbor& nb) const
     {
@@ -1178,7 +1178,7 @@
             if (pred(*j))
             {
                 NS_LOG_LOGIC("Close link to " << j->m_neighborAddress);
-                /// \todo disable temporarily
+                /// @todo disable temporarily
                 //              m_handleLinkFailure (j->m_neighborAddress);
             }
         }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/dsr/model/dsr-rcache.h ns-3.44/src/dsr/model/dsr-rcache.h
--- ns-3.43/src/dsr/model/dsr-rcache.h	2024-10-09 16:41:09.872655900 -0700
+++ ns-3.44/src/dsr/model/dsr-rcache.h	2025-03-09 16:55:49.371371000 -0700
@@ -74,8 +74,8 @@
   \endverbatim
  */
 /**
- * \ingroup dsr
- * \brief DSR Route Cache Entry
+ * @ingroup dsr
+ * @brief DSR Route Cache Entry
  */
 struct Link
 {
@@ -85,8 +85,8 @@
     /**
      * Constructor
      *
-     * \param ip1 first IP address
-     * \param ip2 second IP address
+     * @param ip1 first IP address
+     * @param ip2 second IP address
      */
     Link(Ipv4Address ip1, Ipv4Address ip2)
     {
@@ -103,9 +103,9 @@
     }
 
     /**
-     * \brief less than comparison operator
-     * \param L link to compare
-     * \return true if less than
+     * @brief less than comparison operator
+     * @param L link to compare
+     * @return true if less than
      */
     bool operator<(const Link& L) const
     {
@@ -128,25 +128,25 @@
 };
 
 /**
- * \class DsrLinkStab
- * \brief DsrLinkStab class (DSR link stability)
+ * @class DsrLinkStab
+ * @brief DsrLinkStab class (DSR link stability)
  */
 class DsrLinkStab
 {
   public:
     /**
-     * \brief Constructor
-     * \param linkStab duration of the link stability
+     * @brief Constructor
+     * @param linkStab duration of the link stability
      */
     DsrLinkStab(Time linkStab = Simulator::Now());
     /**
-     * \brief Destructor
+     * @brief Destructor
      */
     virtual ~DsrLinkStab();
 
     /**
-     * \brief set the link stability
-     * \param linkStab duration of the link stability
+     * @brief set the link stability
+     * @param linkStab duration of the link stability
      */
     void SetLinkStability(Time linkStab)
     {
@@ -154,8 +154,8 @@
     }
 
     /**
-     * \brief get the link stability
-     * \returns remaining duration of the link stability
+     * @brief get the link stability
+     * @returns remaining duration of the link stability
      */
     Time GetLinkStability() const
     {
@@ -174,8 +174,8 @@
 };
 
 /**
- * \class DsrNodeStab
- * \brief DsrNodeStab class (DSR node stability)
+ * @class DsrNodeStab
+ * @brief DsrNodeStab class (DSR node stability)
  */
 class DsrNodeStab
 {
@@ -183,14 +183,14 @@
     /**
      * Constructor
      *
-     * \param nodeStab duration of stable node time
+     * @param nodeStab duration of stable node time
      */
     DsrNodeStab(Time nodeStab = Simulator::Now());
     virtual ~DsrNodeStab();
 
     /**
      * Set node stability
-     * \param nodeStab duration of the node stability
+     * @param nodeStab duration of the node stability
      */
     void SetNodeStability(Time nodeStab)
     {
@@ -199,7 +199,7 @@
 
     /**
      * Get node stability
-     * \returns the remaining time for node stability
+     * @returns the remaining time for node stability
      */
     Time GetNodeStability() const
     {
@@ -211,8 +211,8 @@
 };
 
 /**
- * \class DsrRouteCacheEntry
- * \brief DsrRouteCacheEntry class for entries in the route cache
+ * @class DsrRouteCacheEntry
+ * @brief DsrRouteCacheEntry class for entries in the route cache
  */
 class DsrRouteCacheEntry
 {
@@ -223,9 +223,9 @@
     /**
      * Constructor
      *
-     * \param ip IP_VECTOR
-     * \param dst destination IPv4 address
-     * \param exp expiration time
+     * @param ip IP_VECTOR
+     * @param dst destination IPv4 address
+     * @param exp expiration time
      */
     DsrRouteCacheEntry(IP_VECTOR const& ip = IP_VECTOR(),
                        Ipv4Address dst = Ipv4Address(),
@@ -233,13 +233,13 @@
     virtual ~DsrRouteCacheEntry();
 
     /// Mark entry as "down" (i.e. disable it)
-    /// \param badLinkLifetime Time before purging the link for real.
+    /// @param badLinkLifetime Time before purging the link for real.
     void Invalidate(Time badLinkLifetime);
 
     // Fields
     /**
      * Set unidirectional flag
-     * \param u the unidirectional flag
+     * @param u the unidirectional flag
      */
     void SetUnidirectional(bool u)
     {
@@ -248,7 +248,7 @@
 
     /**
      * Get unidirectional flag
-     * \returns the unidirectional flag
+     * @returns the unidirectional flag
      */
     bool IsUnidirectional() const
     {
@@ -257,7 +257,7 @@
 
     /**
      * Set blacklist timeout
-     * \param t the blacklist timeout
+     * @param t the blacklist timeout
      */
     void SetBlacklistTimeout(Time t)
     {
@@ -266,7 +266,7 @@
 
     /**
      * Get blacklist timeout
-     * \returns the blacklist timeout
+     * @returns the blacklist timeout
      */
     Time GetBlacklistTimeout() const
     {
@@ -275,7 +275,7 @@
 
     /**
      * Get destination address
-     * \returns the destination IP address
+     * @returns the destination IP address
      */
     Ipv4Address GetDestination() const
     {
@@ -284,7 +284,7 @@
 
     /**
      * Set destination address
-     * \param d the destination IP address
+     * @param d the destination IP address
      */
     void SetDestination(Ipv4Address d)
     {
@@ -293,7 +293,7 @@
 
     /**
      * Get the IP vector
-     * \returns the IP vector
+     * @returns the IP vector
      */
     IP_VECTOR GetVector() const
     {
@@ -302,7 +302,7 @@
 
     /**
      * Sets the IP vector
-     * \param v the IP vector
+     * @param v the IP vector
      */
     void SetVector(IP_VECTOR v)
     {
@@ -311,7 +311,7 @@
 
     /**
      * Set expire time
-     * \param exp the expire time
+     * @param exp the expire time
      */
     void SetExpireTime(Time exp)
     {
@@ -320,7 +320,7 @@
 
     /**
      * Get expire time
-     * \returns the expire time
+     * @returns the expire time
      */
     Time GetExpireTime() const
     {
@@ -328,15 +328,15 @@
     }
 
     /**
-     * \brief Print necessary fields
-     * \param os the output stream
+     * @brief Print necessary fields
+     * @param os the output stream
      */
     void Print(std::ostream& os) const;
 
     /**
-     * \brief Compare the route cache entry. Only the paths are compared.
-     * \param o entry to compare
-     * \return true if both route cache entries are equal
+     * @brief Compare the route cache entry. Only the paths are compared.
+     * @param o entry to compare
+     * @return true if both route cache entries are equal
      */
     bool operator==(const DsrRouteCacheEntry& o) const
     {
@@ -357,16 +357,16 @@
 };
 
 /**
- * \ingroup dsr
- * \brief DSR route request queue
+ * @ingroup dsr
+ * @brief DSR route request queue
  * Since DSR is an on demand routing we queue requests while looking for route.
  */
 class DsrRouteCache : public Object
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -377,19 +377,19 @@
     DsrRouteCache& operator=(const DsrRouteCache&) = delete;
 
     /**
-     * \brief Remove the aged route cache entries when the route cache is full
-     * \param rtVector the route cache to scan.
+     * @brief Remove the aged route cache entries when the route cache is full
+     * @param rtVector the route cache to scan.
      */
     void RemoveLastEntry(std::list<DsrRouteCacheEntry>& rtVector);
     /**
-     * \brief Define the vector of route entries.
+     * @brief Define the vector of route entries.
      */
     typedef std::list<DsrRouteCacheEntry::IP_VECTOR> routeVector;
 
     // Fields
     /**
      * Get subroute indicator
-     * \returns true if a subroute exists
+     * @returns true if a subroute exists
      */
     bool GetSubRoute() const
     {
@@ -398,7 +398,7 @@
 
     /**
      * Set subroute indicator
-     * \param subRoute the subroute indicator
+     * @param subRoute the subroute indicator
      */
     void SetSubRoute(bool subRoute)
     {
@@ -407,7 +407,7 @@
 
     /**
      * Get the max queue length
-     * \returns the maximum queue length
+     * @returns the maximum queue length
      */
     uint32_t GetMaxCacheLen() const
     {
@@ -416,7 +416,7 @@
 
     /**
      * Set the max queue length
-     * \param len the maximum queue length
+     * @param len the maximum queue length
      */
     void SetMaxCacheLen(uint32_t len)
     {
@@ -425,7 +425,7 @@
 
     /**
      * Get cache timeout value
-     * \returns the cache timeout time
+     * @returns the cache timeout time
      */
     Time GetCacheTimeout() const
     {
@@ -434,7 +434,7 @@
 
     /**
      * Set cache timeout value
-     * \param t the cache timeout time
+     * @param t the cache timeout time
      */
     void SetCacheTimeout(Time t)
     {
@@ -443,7 +443,7 @@
 
     /**
      * Get max entries for each destination
-     * \returns the maximum entries for each destination
+     * @returns the maximum entries for each destination
      */
     uint32_t GetMaxEntriesEachDst() const
     {
@@ -452,7 +452,7 @@
 
     /**
      * Set max entries for each destination
-     * \param entries the maximum entries for each destination
+     * @param entries the maximum entries for each destination
      */
     void SetMaxEntriesEachDst(uint32_t entries)
     {
@@ -461,7 +461,7 @@
 
     /**
      * Get bad link lifetime function
-     * \returns the bad link lifetime
+     * @returns the bad link lifetime
      */
     Time GetBadLinkLifetime() const
     {
@@ -470,7 +470,7 @@
 
     /**
      * Set bad link lifetime function
-     * \param t the bad link lifetime
+     * @param t the bad link lifetime
      */
     void SetBadLinkLifetime(Time t)
     {
@@ -479,7 +479,7 @@
 
     /**
      * Get stability decrease factor
-     * \returns the stability decrease factor
+     * @returns the stability decrease factor
      */
     uint64_t GetStabilityDecrFactor() const
     {
@@ -488,7 +488,7 @@
 
     /**
      * Set stability decrease factor
-     * \param decrFactor the stability decrease factor
+     * @param decrFactor the stability decrease factor
      */
     void SetStabilityDecrFactor(uint64_t decrFactor)
     {
@@ -497,7 +497,7 @@
 
     /**
      * Get stability increase factor
-     * \returns the stability increase factor
+     * @returns the stability increase factor
      */
     uint64_t GetStabilityIncrFactor() const
     {
@@ -506,7 +506,7 @@
 
     /**
      * Set stability increase factor
-     * \param incrFactor the stability increase factor
+     * @param incrFactor the stability increase factor
      */
     void SetStabilityIncrFactor(uint64_t incrFactor)
     {
@@ -515,7 +515,7 @@
 
     /**
      * Get initial stability
-     * \returns the initial stability
+     * @returns the initial stability
      */
     Time GetInitStability() const
     {
@@ -524,7 +524,7 @@
 
     /**
      * Set initial stability
-     * \param initStability the initial stability
+     * @param initStability the initial stability
      */
     void SetInitStability(Time initStability)
     {
@@ -533,7 +533,7 @@
 
     /**
      * Get minimum lifetime
-     * \returns the minimum lifetime
+     * @returns the minimum lifetime
      */
     Time GetMinLifeTime() const
     {
@@ -542,7 +542,7 @@
 
     /**
      * Set minimum lifetime
-     * \param minLifeTime the minimum lifetime
+     * @param minLifeTime the minimum lifetime
      */
     void SetMinLifeTime(Time minLifeTime)
     {
@@ -551,7 +551,7 @@
 
     /**
      * Get use extends
-     * \returns the use extends time
+     * @returns the use extends time
      */
     Time GetUseExtends() const
     {
@@ -560,7 +560,7 @@
 
     /**
      * Set use extends
-     * \param useExtends the use extends time
+     * @param useExtends the use extends time
      */
     void SetUseExtends(Time useExtends)
     {
@@ -568,55 +568,55 @@
     }
 
     /**
-     * \brief Update route cache entry if it has been recently used and successfully delivered the
+     * @brief Update route cache entry if it has been recently used and successfully delivered the
      * data packet
-     * \param dst destination address of the route
-     * \return true in success
+     * @param dst destination address of the route
+     * @return true in success
      */
     bool UpdateRouteEntry(Ipv4Address dst);
     /**
-     * \brief Add route cache entry if it doesn't yet exist in route cache
-     * \param rt route cache entry
-     * \return true on success
+     * @brief Add route cache entry if it doesn't yet exist in route cache
+     * @param rt route cache entry
+     * @return true on success
      */
     bool AddRoute(DsrRouteCacheEntry& rt);
     /**
-     * \brief Lookup route cache entry with destination address dst
-     * \param id destination address
-     * \param rt entry with destination address id, if exists
-     * \return true on success
+     * @brief Lookup route cache entry with destination address dst
+     * @param id destination address
+     * @param rt entry with destination address id, if exists
+     * @return true on success
      */
     bool LookupRoute(Ipv4Address id, DsrRouteCacheEntry& rt);
     /**
-     * \brief Print the route vector elements
-     * \param vec the route vector
+     * @brief Print the route vector elements
+     * @param vec the route vector
      */
     void PrintVector(std::vector<Ipv4Address>& vec);
     /**
-     * \brief Print all the route vector elements from the route list
-     * \param route the route list
+     * @brief Print all the route vector elements from the route list
+     * @param route the route list
      */
     void PrintRouteVector(std::list<DsrRouteCacheEntry> route);
     /**
-     * \brief Find the same route in the route cache
-     * \param rt entry with destination address dst, if exists
-     * \param rtVector the route vector
-     * \return true if same
+     * @brief Find the same route in the route cache
+     * @param rt entry with destination address dst, if exists
+     * @param rtVector the route vector
+     * @return true if same
      */
     bool FindSameRoute(DsrRouteCacheEntry& rt, std::list<DsrRouteCacheEntry>& rtVector);
     /**
-     * \brief Delete the route with certain destination address
-     * \param dst the destination address of the routes that should be deleted
-     * \return true if the route was deleted
+     * @brief Delete the route with certain destination address
+     * @param dst the destination address of the routes that should be deleted
+     * @return true if the route was deleted
      */
     bool DeleteRoute(Ipv4Address dst);
     /**
-     * \brief Delete all the routes which includes the link from next hop address that has just been
+     * @brief Delete all the routes which includes the link from next hop address that has just been
      * notified as unreachable
      *
-     * \param errorSrc The error source address
-     * \param unreachNode The unreachable node
-     * \param node This node's ip address
+     * @param errorSrc The error source address
+     * @param unreachNode The unreachable node
+     * @param node This node's ip address
      */
     void DeleteAllRoutesIncludeLink(Ipv4Address errorSrc,
                                     Ipv4Address unreachNode,
@@ -631,19 +631,19 @@
     /// Delete all outdated entries and invalidate valid entry if Lifetime is expired
     void Purge();
     /// Print route cache
-    /// \param os the output stream
+    /// @param os the output stream
     void Print(std::ostream& os);
 
     //------------------------------------------------------------------------------------------
     /**
-     * \brief Check for duplicate ids and save new entries if the id is not present in the table
-     * \param nextHop to check for in cache
-     * \return ack ID
+     * @brief Check for duplicate ids and save new entries if the id is not present in the table
+     * @param nextHop to check for in cache
+     * @return ack ID
      */
     uint16_t CheckUniqueAckId(Ipv4Address nextHop);
     /**
-     * \brief Get the ack table size
-     * \return ack size
+     * @brief Get the ack table size
+     * @return ack size
      */
     uint16_t GetAckSize();
 
@@ -659,9 +659,9 @@
         /**
          * Constructor
          *
-         * \param ip IP address of neighbor
-         * \param mac MAC address of neighbor
-         * \param t expiration time
+         * @param ip IP address of neighbor
+         * @param mac MAC address of neighbor
+         * @param t expiration time
          */
         Neighbor(Ipv4Address ip, Mac48Address mac, Time t)
             : m_neighborAddress(ip),
@@ -677,41 +677,41 @@
     };
 
     /**
-     * \brief Return expire time for neighbor node with address addr, if exists, else return 0.
-     * \param addr IP address
-     * \return expire time
+     * @brief Return expire time for neighbor node with address addr, if exists, else return 0.
+     * @param addr IP address
+     * @return expire time
      */
     Time GetExpireTime(Ipv4Address addr);
     /**
-     * \brief Check that node with address addr is neighbor
-     * \param addr IP address
-     * \return true if neighbor
+     * @brief Check that node with address addr is neighbor
+     * @param addr IP address
+     * @return true if neighbor
      */
     bool IsNeighbor(Ipv4Address addr);
     /**
-     * \brief Update expire time for entry with address addr, if it exists, else add new entry
-     * \param nodeList list of addresses
-     * \param expire expiration time
+     * @brief Update expire time for entry with address addr, if it exists, else add new entry
+     * @param nodeList list of addresses
+     * @param expire expiration time
      */
     void UpdateNeighbor(std::vector<Ipv4Address> nodeList, Time expire);
     /**
-     * \brief Add to the neighbor list
-     * \param nodeList neighbor list
-     * \param ownAddress local address
-     * \param expire expiration time
+     * @brief Add to the neighbor list
+     * @param nodeList neighbor list
+     * @param ownAddress local address
+     * @param expire expiration time
      */
     void AddNeighbor(std::vector<Ipv4Address> nodeList, Ipv4Address ownAddress, Time expire);
     /**
-     * \brief Remove all expired mac entries
+     * @brief Remove all expired mac entries
      */
     void PurgeMac();
     /**
-     * \brief Schedule m_ntimer.
+     * @brief Schedule m_ntimer.
      */
     void ScheduleTimer();
 
     /**
-     * \brief Remove all entries
+     * @brief Remove all entries
      */
     void ClearMac()
     {
@@ -719,19 +719,19 @@
     }
 
     /**
-     * \brief Add ARP cache to be used to allow layer 2 notifications processing
-     * \param a ARP cache
+     * @brief Add ARP cache to be used to allow layer 2 notifications processing
+     * @param a ARP cache
      */
     void AddArpCache(Ptr<ArpCache> a);
     /**
-     * \brief Don't use the provided ARP cache any more (interface is down)
-     * \param a ARP cache
+     * @brief Don't use the provided ARP cache any more (interface is down)
+     * @param a ARP cache
      */
     void DelArpCache(Ptr<ArpCache>);
 
     /**
      * Handle link failure callback
-     * \param cb the callback to be set
+     * @param cb the callback to be set
      */
     void SetCallback(Callback<void, Ipv4Address, uint8_t> cb)
     {
@@ -740,7 +740,7 @@
 
     /**
      * Handle link failure callback
-     * \return The callback to LinkFailure
+     * @return The callback to LinkFailure
      */
     Callback<void, Ipv4Address, uint8_t> GetCallback() const
     {
@@ -797,53 +797,53 @@
     std::map<Link, DsrLinkStab> m_linkCache;        ///< The data structure to store link info
     std::map<Ipv4Address, DsrNodeStab> m_nodeCache; ///< The data structure to store node info
     /**
-     * \brief used by LookupRoute when LinkCache
-     * \param id the ip address we are looking for
-     * \param rt the route cache entry to store the found one
-     * \return true if route route found
+     * @brief used by LookupRoute when LinkCache
+     * @param id the ip address we are looking for
+     * @param rt the route cache entry to store the found one
+     * @return true if route route found
      */
     bool LookupRoute_Link(Ipv4Address id, DsrRouteCacheEntry& rt);
     /**
-     * \brief increase the stability of the node
-     * \param node the ip address of the node we want to increase stability
-     * \return true if success
+     * @brief increase the stability of the node
+     * @param node the ip address of the node we want to increase stability
+     * @return true if success
      */
     bool IncStability(Ipv4Address node);
     /**
-     * \brief decrease the stability of the node
-     * \param node the ip address of the node we want to decrease stability
-     * \return true if success
+     * @brief decrease the stability of the node
+     * @param node the ip address of the node we want to decrease stability
+     * @return true if success
      */
     bool DecStability(Ipv4Address node);
 
   public:
     /**
-     * \brief Dijsktra algorithm to get the best route from m_netGraph and update the
+     * @brief Dijsktra algorithm to get the best route from m_netGraph and update the
      * m_bestRoutesTable_link when current graph information has changed
-     * \param type The type of the cache
+     * @param type The type of the cache
      */
     void SetCacheType(std::string type);
     /**
-     * \brief is link cached
-     * \return true if the link is cached
+     * @brief is link cached
+     * @return true if the link is cached
      */
     bool IsLinkCache();
     /**
-     * \brief dd route link to cache
-     * \param nodelist vector of nodes
-     * \param node ip address of node to add
-     * \return true if the link is cached
+     * @brief dd route link to cache
+     * @param nodelist vector of nodes
+     * @param node ip address of node to add
+     * @return true if the link is cached
      */
     bool AddRoute_Link(DsrRouteCacheEntry::IP_VECTOR nodelist, Ipv4Address node);
     /**
-     * \brief Rebuild the best route table
-     * \note Use MAXWEIGHT to represent maximum weight, use the IPv4 broadcast
+     * @brief Rebuild the best route table
+     * @note Use MAXWEIGHT to represent maximum weight, use the IPv4 broadcast
      *       address of 255.255.255.255 to represent a null preceding address
-     * \param source The source address used for computing the routes
+     * @param source The source address used for computing the routes
      */
     void RebuildBestRouteTable(Ipv4Address source);
     /**
-     * \brief Purge from the cache if the stability time expired
+     * @brief Purge from the cache if the stability time expired
      */
     void PurgeLinkNode();
     /**
@@ -852,11 +852,11 @@
      * incremented by the amount of time since that link was last used. When a link is used in a
      * route chosen for a packet originated or salvaged by this node, the link's lifetime is set to
      * be at least UseExtends into the future
-     * \param rt cache entry
+     * @param rt cache entry
      */
     void UseExtends(DsrRouteCacheEntry::IP_VECTOR rt);
     /**
-     * \brief Update the Net Graph for the link and node cache has changed
+     * @brief Update the Net Graph for the link and node cache has changed
      */
     void UpdateNetGraph();
     //---------------------------------------------------------------------------------------
@@ -875,12 +875,12 @@
     Time m_delay; ///< This timeout deals with the passive ack
 
     /// Find MAC address by IP using list of ARP caches
-    /// \param addr the IPv4 address to look for
-    /// \return The MAC address
+    /// @param addr the IPv4 address to look for
+    /// @return The MAC address
     Mac48Address LookupMacAddress(Ipv4Address addr);
 
     /// Process layer 2 TX error notification
-    /// \param hdr Wi-Fi Mac Header
+    /// @param hdr Wi-Fi Mac Header
     void ProcessTxError(const WifiMacHeader& hdr);
 };
 } // namespace dsr
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/dsr/model/dsr-routing.cc ns-3.44/src/dsr/model/dsr-routing.cc
--- ns-3.43/src/dsr/model/dsr-routing.cc	2024-10-09 16:41:09.872655900 -0700
+++ ns-3.44/src/dsr/model/dsr-routing.cc	2025-03-09 16:55:49.371371000 -0700
@@ -326,7 +326,7 @@
                           MakeUintegerChecker<uint32_t>())
             .AddAttribute("MaxNetworkQueueDelay",
                           "The max time for a packet to stay in the network queue.",
-                          TimeValue(Seconds(30.0)),
+                          TimeValue(Seconds(30)),
                           MakeTimeAccessor(&DsrRouting::m_maxNetworkDelay),
                           MakeTimeChecker())
             .AddAttribute("NumPriorityQueues",
@@ -953,7 +953,7 @@
                     // m_downTarget (newPacket, m_mainAddress, nextHop, GetProtocolNumber (),
                     // m_ipv4Route);
 
-                    /// \todo New DsrNetworkQueueEntry
+                    /// @todo New DsrNetworkQueueEntry
                     DsrNetworkQueueEntry newEntry(newPacket,
                                                   m_mainAddress,
                                                   nextHop,
@@ -1444,7 +1444,7 @@
 
         // m_downTarget (newPacket, m_mainAddress, nextHop, GetProtocolNumber (), m_ipv4Route);
 
-        /// \todo New DsrNetworkQueueEntry
+        /// @todo New DsrNetworkQueueEntry
         DsrNetworkQueueEntry newEntry(newPacket,
                                       m_mainAddress,
                                       nextHop,
@@ -1494,7 +1494,7 @@
 
     // m_downTarget (packet, m_mainAddress, nextHop, GetProtocolNumber (), route);
 
-    /// \todo New DsrNetworkQueueEntry
+    /// @todo New DsrNetworkQueueEntry
     DsrNetworkQueueEntry newEntry(packet, m_mainAddress, nextHop, Simulator::Now(), route);
 
     if (dsrNetworkQueue->Enqueue(newEntry))
@@ -1732,7 +1732,7 @@
 
     // m_downTarget (packet, source, nextHop, GetProtocolNumber (), m_ipv4Route);
 
-    /// \todo New DsrNetworkQueueEntry
+    /// @todo New DsrNetworkQueueEntry
     DsrNetworkQueueEntry newEntry(packet, source, nextHop, Simulator::Now(), m_ipv4Route);
 
     if (dsrNetworkQueue->Enqueue(newEntry))
@@ -2072,7 +2072,7 @@
                     // m_downTarget (newPacket, m_mainAddress, nextHop, GetProtocolNumber (),
                     // m_ipv4Route);
 
-                    /// \todo New DsrNetworkQueueEntry
+                    /// @todo New DsrNetworkQueueEntry
                     DsrNetworkQueueEntry newEntry(newPacket,
                                                   m_mainAddress,
                                                   nextHop,
@@ -2508,7 +2508,7 @@
 
         // m_downTarget (p, m_mainAddress, nextHop, GetProtocolNumber (), m_ipv4Route);
 
-        /// \todo New DsrNetworkQueueEntry
+        /// @todo New DsrNetworkQueueEntry
         DsrNetworkQueueEntry newEntry(p, m_mainAddress, nextHop, Simulator::Now(), m_ipv4Route);
 
         if (dsrNetworkQueue->Enqueue(newEntry))
@@ -3293,7 +3293,7 @@
 
     // m_downTarget (packet, source, m_broadcast, GetProtocolNumber (), 0);
 
-    /// \todo New DsrNetworkQueueEntry
+    /// @todo New DsrNetworkQueueEntry
     DsrNetworkQueueEntry newEntry(packet, source, m_broadcast, Simulator::Now(), nullptr);
     if (dsrNetworkQueue->Enqueue(newEntry))
     {
@@ -3408,7 +3408,7 @@
 
     // m_downTarget (packet, source, nextHop, GetProtocolNumber (), route);
 
-    /// \todo New DsrNetworkQueueEntry
+    /// @todo New DsrNetworkQueueEntry
     DsrNetworkQueueEntry newEntry(packet, source, nextHop, Simulator::Now(), route);
     if (dsrNetworkQueue->Enqueue(newEntry))
     {
@@ -3493,7 +3493,7 @@
 
     // m_downTarget (packet, m_mainAddress, destination, GetProtocolNumber (), route);
 
-    /// \todo New DsrNetworkQueueEntry
+    /// @todo New DsrNetworkQueueEntry
     DsrNetworkQueueEntry newEntry(packet, m_mainAddress, destination, Simulator::Now(), route);
     if (dsrNetworkQueue->Enqueue(newEntry))
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/dsr/model/dsr-routing.h ns-3.44/src/dsr/model/dsr-routing.h
--- ns-3.43/src/dsr/model/dsr-routing.h	2024-10-09 16:41:09.872655900 -0700
+++ ns-3.44/src/dsr/model/dsr-routing.h	2025-03-09 16:55:49.371371000 -0700
@@ -80,133 +80,133 @@
 class DsrOptions;
 
 /**
- * \class DsrRouting
- * \brief Dsr Routing base
+ * @class DsrRouting
+ * @brief Dsr Routing base
  */
 class DsrRouting : public IpL4Protocol
 {
   public:
     /**
-     * \brief Get the type identificator.
-     * \return type identificator
+     * @brief Get the type identificator.
+     * @return type identificator
      */
     static TypeId GetTypeId();
     /**
-     * \brief Define the dsr protocol number.
+     * @brief Define the dsr protocol number.
      */
     static const uint8_t PROT_NUMBER;
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     DsrRouting();
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~DsrRouting() override;
     /**
-     * \brief Get the node.
-     * \return the node
+     * @brief Get the node.
+     * @return the node
      */
     Ptr<Node> GetNode() const;
     /**
-     * \brief Set the node.
-     * \param node the node to set
+     * @brief Set the node.
+     * @param node the node to set
      */
     void SetNode(Ptr<Node> node);
     /**
-     * \brief Set the route cache.
-     * \param r the route cache to set
+     * @brief Set the route cache.
+     * @param r the route cache to set
      */
     void SetRouteCache(Ptr<dsr::DsrRouteCache> r);
     /**
-     * \brief Get the route cache.
-     * \return the route cache
+     * @brief Get the route cache.
+     * @return the route cache
      */
     Ptr<dsr::DsrRouteCache> GetRouteCache() const;
     /**
-     * \brief Set the node.
-     * \param r the request table to set
+     * @brief Set the node.
+     * @param r the request table to set
      */
     void SetRequestTable(Ptr<dsr::DsrRreqTable> r);
     /**
-     * \brief Get the request table.
-     * \return the request table
+     * @brief Get the request table.
+     * @return the request table
      */
     Ptr<dsr::DsrRreqTable> GetRequestTable() const;
     /**
-     * \brief Set the node.
-     * \param r the passive buffer to set
+     * @brief Set the node.
+     * @param r the passive buffer to set
      */
     void SetPassiveBuffer(Ptr<dsr::DsrPassiveBuffer> r);
     /**
-     * \brief Get the passive buffer
-     * \return the passive buffer
+     * @brief Get the passive buffer
+     * @return the passive buffer
      */
     Ptr<dsr::DsrPassiveBuffer> GetPassiveBuffer() const;
 
     /**
-     * \brief Checks if the link is cached in the route cache
+     * @brief Checks if the link is cached in the route cache
      * See also DsrRouteCache::IsLinkCache
      *
-     * \return true if the link is cached
+     * @return true if the link is cached
      */
     bool IsLinkCache();
 
     /**
-     * \brief Extends the lifetime of a route cache entry.
+     * @brief Extends the lifetime of a route cache entry.
      * See also DsrRouteCache::UseExtends
      *
-     * \param rt the route to extend
+     * @param rt the route to extend
      */
     void UseExtends(DsrRouteCacheEntry::IP_VECTOR rt);
 
     /**
-     * \brief Lookup route cache entry with destination address dst
+     * @brief Lookup route cache entry with destination address dst
      * See also DsrRouteCache::LookupRoute
      *
-     * \param id destination address
-     * \param rt entry with destination address id, if exists
-     * \return true on success
+     * @param id destination address
+     * @param rt entry with destination address id, if exists
+     * @return true on success
      */
     bool LookupRoute(Ipv4Address id, DsrRouteCacheEntry& rt);
 
     /**
-     * \brief dd route link to cache
+     * @brief dd route link to cache
      * See also DsrRouteCache::AddRoute_Link
      *
-     * \param nodelist vector of nodes
-     * \param source ip address of node to add
-     * \return true if the link is cached
+     * @param nodelist vector of nodes
+     * @param source ip address of node to add
+     * @return true if the link is cached
      */
     bool AddRoute_Link(DsrRouteCacheEntry::IP_VECTOR nodelist, Ipv4Address source);
 
     /**
-     * \brief Add route cache entry if it doesn't yet exist in route cache
+     * @brief Add route cache entry if it doesn't yet exist in route cache
      * See also DsrRouteCache::AddRoute
      *
-     * \param rt route cache entry
-     * \return true on success
+     * @param rt route cache entry
+     * @return true on success
      */
     bool AddRoute(DsrRouteCacheEntry& rt);
 
     /**
-     * \brief Delete all the routes which includes the link from next hop address that has just been
+     * @brief Delete all the routes which includes the link from next hop address that has just been
      * notified as unreachable. See also DsrRouteCache::DeleteAllRoutesIncludeLink
      *
-     * \param errorSrc The error source address
-     * \param unreachNode The unreachable node
-     * \param node This node's ip address
+     * @param errorSrc The error source address
+     * @param unreachNode The unreachable node
+     * @param node This node's ip address
      */
     void DeleteAllRoutesIncludeLink(Ipv4Address errorSrc,
                                     Ipv4Address unreachNode,
                                     Ipv4Address node);
 
     /**
-     * \brief Update route cache entry if it has been recently used and successfully delivered the
+     * @brief Update route cache entry if it has been recently used and successfully delivered the
      * data packet. See also DsrRouteCache::UpdateRouteEntry
      *
-     * \param dst destination address of the route
-     * \return true in success
+     * @param dst destination address of the route
+     * @return true in success
      */
     bool UpdateRouteEntry(Ipv4Address dst);
 
@@ -214,107 +214,107 @@
      * Find the source request entry in the route request queue, return false if not found.
      * See also DsrRreqTable::FindSourceEntry
      *
-     * \param src the source address we just received the source request
-     * \param dst the destination address the request is targeted at
-     * \param id the identification number for this request
-     * \return true if found, false otherwise
+     * @param src the source address we just received the source request
+     * @param dst the destination address the request is targeted at
+     * @param id the identification number for this request
+     * @return true if found, false otherwise
      */
     bool FindSourceEntry(Ipv4Address src, Ipv4Address dst, uint16_t id);
 
     /**
-     * \brief Get the netdevice from the context.
-     * \param context context
-     * \return the netdevice we are looking for
+     * @brief Get the netdevice from the context.
+     * @param context context
+     * @return the netdevice we are looking for
      */
     Ptr<NetDevice> GetNetDeviceFromContext(std::string context);
     /**
-     * \brief Get the elements from the tracing context.
-     * \param context context
-     * \return the elements we are looking for
+     * @brief Get the elements from the tracing context.
+     * @param context context
+     * @return the elements we are looking for
      */
     std::vector<std::string> GetElementsFromContext(std::string context);
     /**
-     * \brief Get the node id from ip address.
-     * \param address IPv4 address
-     * \return the node id
+     * @brief Get the node id from ip address.
+     * @param address IPv4 address
+     * @return the node id
      */
     uint16_t GetIDfromIP(Ipv4Address address);
     /**
-     * \brief Get the ip address from id.
-     * \param id unique ID
-     * \return the ip address for the id
+     * @brief Get the ip address from id.
+     * @param id unique ID
+     * @return the ip address for the id
      */
     Ipv4Address GetIPfromID(uint16_t id);
     /**
-     * \brief Get the Ip address from mac address.
-     * \param address Mac48Address
-     * \return the ip address
+     * @brief Get the Ip address from mac address.
+     * @param address Mac48Address
+     * @return the ip address
      */
     Ipv4Address GetIPfromMAC(Mac48Address address);
     /**
-     * \brief Get the node with give ip address.
-     * \param ipv4Address IPv4 address
-     * \return the node associated with the ip address
+     * @brief Get the node with give ip address.
+     * @param ipv4Address IPv4 address
+     * @return the node associated with the ip address
      */
     Ptr<Node> GetNodeWithAddress(Ipv4Address ipv4Address);
     /**
-     * \brief Print the route vector.
-     * \param vec the vector to print.
+     * @brief Print the route vector.
+     * @param vec the vector to print.
      */
     void PrintVector(std::vector<Ipv4Address>& vec);
     /**
-     * \brief Get the next hop of the route.
-     * \param ipv4Address
-     * \param vec Route
-     * \return the next hop address of the route
+     * @brief Get the next hop of the route.
+     * @param ipv4Address
+     * @param vec Route
+     * @return the next hop address of the route
      */
     Ipv4Address SearchNextHop(Ipv4Address ipv4Address, std::vector<Ipv4Address>& vec);
     /**
-     * \brief Get the dsr protocol number.
-     * \return protocol number
+     * @brief Get the dsr protocol number.
+     * @return protocol number
      */
     int GetProtocolNumber() const override;
     /**
-     * \brief The send buffer timer expire.
+     * @brief The send buffer timer expire.
      */
     void SendBuffTimerExpire();
     /**
-     * \brief Check the send buffer of packets with route when send buffer timer expire.
+     * @brief Check the send buffer of packets with route when send buffer timer expire.
      */
     void CheckSendBuffer();
     /**
-     * \brief When route vector corrupted, originate a new packet, normally not happening.
-     * \param packet to route
-     * \param source address
-     * \param destination address
-     * \param protocol number
+     * @brief When route vector corrupted, originate a new packet, normally not happening.
+     * @param packet to route
+     * @param source address
+     * @param destination address
+     * @param protocol number
      */
     void PacketNewRoute(Ptr<Packet> packet,
                         Ipv4Address source,
                         Ipv4Address destination,
                         uint8_t protocol);
     /**
-     * \brief Set the route to use for data packets,
+     * @brief Set the route to use for data packets,
      *        used by the option headers when sending data/control packets
-     * \param nextHop next hop IPv4 address
-     * \param srcAddress IPv4 address of the source
-     * \return the route
+     * @param nextHop next hop IPv4 address
+     * @param srcAddress IPv4 address of the source
+     * @return the route
      */
     Ptr<Ipv4Route> SetRoute(Ipv4Address nextHop, Ipv4Address srcAddress);
     /**
-     * \brief Set the priority of the packet in network queue
-     * \param messageType Message type
-     * \return the priority value
+     * @brief Set the priority of the packet in network queue
+     * @param messageType Message type
+     * @return the priority value
      */
     uint32_t GetPriority(DsrMessageType messageType);
     /**
-     * \brief This function is responsible for sending error packets in case of break link to next
+     * @brief This function is responsible for sending error packets in case of break link to next
      * hop
-     * \param unreachNode unreachable node
-     * \param destination address
-     * \param originalDst address
-     * \param salvage packet flag
-     * \param protocol number
+     * @param unreachNode unreachable node
+     * @param destination address
+     * @param originalDst address
+     * @param salvage packet flag
+     * @param protocol number
      */
     void SendUnreachError(Ipv4Address unreachNode,
                           Ipv4Address destination,
@@ -323,12 +323,12 @@
                           uint8_t protocol);
 
     /**
-     * \brief This function is responsible for forwarding error packets along the route
-     * \param rerr unreachable header
-     * \param sourceRoute source routing header
-     * \param nextHop IP address of next hop
-     * \param protocol number
-     * \param route IP route
+     * @brief This function is responsible for forwarding error packets along the route
+     * @param rerr unreachable header
+     * @param sourceRoute source routing header
+     * @param nextHop IP address of next hop
+     * @param protocol number
+     * @param route IP route
      */
     void ForwardErrPacket(DsrOptionRerrUnreachHeader& rerr,
                           DsrOptionSRHeader& sourceRoute,
@@ -336,12 +336,12 @@
                           uint8_t protocol,
                           Ptr<Ipv4Route> route);
     /**
-     * \brief This function is called by higher layer protocol when sending packets
-     * \param packet to send
-     * \param source IP address
-     * \param destination IP address
-     * \param protocol number
-     * \param route IP route
+     * @brief This function is called by higher layer protocol when sending packets
+     * @param packet to send
+     * @param source IP address
+     * @param destination IP address
+     * @param protocol number
+     * @param route IP route
      */
     void Send(Ptr<Packet> packet,
               Ipv4Address source,
@@ -349,62 +349,62 @@
               uint8_t protocol,
               Ptr<Ipv4Route> route);
     /**
-     * \brief This function is called to add ack request header for network acknowledgement
-     * \param packet for ack req
-     * \param nextHop IP address of the next hop
-     * \return ack ID
+     * @brief This function is called to add ack request header for network acknowledgement
+     * @param packet for ack req
+     * @param nextHop IP address of the next hop
+     * @return ack ID
      */
     uint16_t AddAckReqHeader(Ptr<Packet>& packet, Ipv4Address nextHop);
     /**
-     * \brief This function is called by when really sending out the packet
-     * \param packet to send
-     * \param source IP address
-     * \param nextHop IP address
-     * \param protocol number
+     * @brief This function is called by when really sending out the packet
+     * @param packet to send
+     * @param source IP address
+     * @param nextHop IP address
+     * @param protocol number
      */
     void SendPacket(Ptr<Packet> packet, Ipv4Address source, Ipv4Address nextHop, uint8_t protocol);
     /**
-     * \brief This function is called to schedule sending packets from the network queue
-     * \param priority for sending
+     * @brief This function is called to schedule sending packets from the network queue
+     * @param priority for sending
      */
     void Scheduler(uint32_t priority);
     /**
-     * \brief This function is called to schedule sending packets from the network queue by priority
-     * \param priority schedule
-     * \param continueWithFirst use all priorities
+     * @brief This function is called to schedule sending packets from the network queue by priority
+     * @param priority schedule
+     * @param continueWithFirst use all priorities
      */
     void PriorityScheduler(uint32_t priority, bool continueWithFirst);
     /**
-     * \brief This function is called to increase the retransmission timer for data packet in the
+     * @brief This function is called to increase the retransmission timer for data packet in the
      * network queue
      */
     void IncreaseRetransTimer();
     /**
-     * \brief This function is called to send packets down stack
-     * \param newEntry queue entry
-     * \return true if success
+     * @brief This function is called to send packets down stack
+     * @param newEntry queue entry
+     * @return true if success
      */
     bool SendRealDown(DsrNetworkQueueEntry& newEntry);
     /**
-     * \brief This function is responsible for sending out data packets when have route, if no route
+     * @brief This function is responsible for sending out data packets when have route, if no route
      * found, it will cache the packet and send out route requests
-     * \param sourceRoute source route
-     * \param nextHop next hop IP address
-     * \param protocol number
+     * @param sourceRoute source route
+     * @param nextHop next hop IP address
+     * @param protocol number
      */
     void SendPacketFromBuffer(const DsrOptionSRHeader& sourceRoute,
                               Ipv4Address nextHop,
                               uint8_t protocol);
     /**
-     * \brief Find the same passive entry
-     * \param packet to process
-     * \param source IP address
-     * \param destination IP address
-     * \param segsLeft segments left
-     * \param fragmentOffset
-     * \param identification
-     * \param saveEntry
-     * \return true if passive buffer entry
+     * @brief Find the same passive entry
+     * @param packet to process
+     * @param source IP address
+     * @param destination IP address
+     * @param segsLeft segments left
+     * @param fragmentOffset
+     * @param identification
+     * @param saveEntry
+     * @return true if passive buffer entry
      */
     bool PassiveEntryCheck(Ptr<Packet> packet,
                            Ipv4Address source,
@@ -415,115 +415,115 @@
                            bool saveEntry);
 
     /**
-     * \brief Cancel all the packet timers
-     * \param mb maintain buffer entry
+     * @brief Cancel all the packet timers
+     * @param mb maintain buffer entry
      */
     void CancelPacketAllTimer(DsrMaintainBuffEntry& mb);
     /**
-     * \brief Cancel the passive timer
-     * \param packet to process
-     * \param source IP address
-     * \param destination IP address
-     * \param segsLeft segments left
-     * \return
+     * @brief Cancel the passive timer
+     * @param packet to process
+     * @param source IP address
+     * @param destination IP address
+     * @param segsLeft segments left
+     * @return
      */
     bool CancelPassiveTimer(Ptr<Packet> packet,
                             Ipv4Address source,
                             Ipv4Address destination,
                             uint8_t segsLeft);
     /**
-     * \brief Call the cancel packet retransmission timer function
-     * \param ackId acknowledge ID
-     * \param ipv4Header header
-     * \param realSrc source IP address
-     * \param realDst destination IP address
+     * @brief Call the cancel packet retransmission timer function
+     * @param ackId acknowledge ID
+     * @param ipv4Header header
+     * @param realSrc source IP address
+     * @param realDst destination IP address
      */
     void CallCancelPacketTimer(uint16_t ackId,
                                const Ipv4Header& ipv4Header,
                                Ipv4Address realSrc,
                                Ipv4Address realDst);
     /**
-     * \brief Cancel the network packet retransmission timer for a specific maintenance entry
-     * \param mb maintain buffer entry
+     * @brief Cancel the network packet retransmission timer for a specific maintenance entry
+     * @param mb maintain buffer entry
      */
     void CancelNetworkPacketTimer(DsrMaintainBuffEntry& mb);
     /**
-     * \brief Cancel the passive packet retransmission timer for a specific maintenance entry
-     * \param mb maintain buffer entry
+     * @brief Cancel the passive packet retransmission timer for a specific maintenance entry
+     * @param mb maintain buffer entry
      */
     void CancelPassivePacketTimer(DsrMaintainBuffEntry& mb);
     /**
-     * \brief Cancel the link packet retransmission timer for a specific maintenance entry
-     * \param mb maintain buffer entry
+     * @brief Cancel the link packet retransmission timer for a specific maintenance entry
+     * @param mb maintain buffer entry
      */
     void CancelLinkPacketTimer(DsrMaintainBuffEntry& mb);
     /**
-     * \brief Cancel the packet retransmission timer for a all maintenance entries with nextHop
+     * @brief Cancel the packet retransmission timer for a all maintenance entries with nextHop
      * address
-     * \param nextHop next hop IP address
-     * \param protocol number
+     * @param nextHop next hop IP address
+     * @param protocol number
      */
     void CancelPacketTimerNextHop(Ipv4Address nextHop, uint8_t protocol);
     /**
-     * \brief Salvage the packet which has been transmitted for 3 times
-     * \param packet to process
-     * \param source IP address
-     * \param dst destination IP address
-     * \param protocol number
+     * @brief Salvage the packet which has been transmitted for 3 times
+     * @param packet to process
+     * @param source IP address
+     * @param dst destination IP address
+     * @param protocol number
      */
     void SalvagePacket(Ptr<const Packet> packet,
                        Ipv4Address source,
                        Ipv4Address dst,
                        uint8_t protocol);
     /**
-     * \brief Schedule the packet retransmission based on link-layer acknowledgment
-     * \param mb maintenance buffer entry
-     * \param protocol the protocol number
+     * @brief Schedule the packet retransmission based on link-layer acknowledgment
+     * @param mb maintenance buffer entry
+     * @param protocol the protocol number
      */
     void ScheduleLinkPacketRetry(DsrMaintainBuffEntry& mb, uint8_t protocol);
     /**
-     * \brief Schedule the packet retransmission based on passive acknowledgment
-     * \param mb maintenance buffer entry
-     * \param protocol the protocol number
+     * @brief Schedule the packet retransmission based on passive acknowledgment
+     * @param mb maintenance buffer entry
+     * @param protocol the protocol number
      */
     void SchedulePassivePacketRetry(DsrMaintainBuffEntry& mb, uint8_t protocol);
     /**
-     * \brief Schedule the packet retransmission based on network layer acknowledgment
-     * \param mb maintenance buffer entry
-     * \param isFirst see if this is the first packet retry or not
-     * \param protocol the protocol number
+     * @brief Schedule the packet retransmission based on network layer acknowledgment
+     * @param mb maintenance buffer entry
+     * @param isFirst see if this is the first packet retry or not
+     * @param protocol the protocol number
      */
     void ScheduleNetworkPacketRetry(DsrMaintainBuffEntry& mb, bool isFirst, uint8_t protocol);
     /**
-     * \brief This function deals with packet retransmission timer expire using link acknowledgment
-     * \param mb maintenance buffer entry
-     * \param protocol the protocol number
+     * @brief This function deals with packet retransmission timer expire using link acknowledgment
+     * @param mb maintenance buffer entry
+     * @param protocol the protocol number
      */
     void LinkScheduleTimerExpire(DsrMaintainBuffEntry& mb, uint8_t protocol);
     /**
-     * \brief This function deals with packet retransmission timer expire using network
+     * @brief This function deals with packet retransmission timer expire using network
      * acknowledgment
-     * \param mb maintenance buffer entry
-     * \param protocol the protocol number
+     * @param mb maintenance buffer entry
+     * @param protocol the protocol number
      */
     void NetworkScheduleTimerExpire(DsrMaintainBuffEntry& mb, uint8_t protocol);
     /**
-     * \brief This function deals with packet retransmission timer expire using passive
+     * @brief This function deals with packet retransmission timer expire using passive
      * acknowledgment
-     * \param mb maintenance buffer entry
-     * \param protocol the protocol number
+     * @param mb maintenance buffer entry
+     * @param protocol the protocol number
      */
     void PassiveScheduleTimerExpire(DsrMaintainBuffEntry& mb, uint8_t protocol);
     /**
-     * \brief Forward the packet using the route saved in the source route option header
-     * \param packet The packet
-     * \param sourceRoute Source route saved in option header
-     * \param ipv4Header IPv4 Header
-     * \param source source address
-     * \param destination destination address
-     * \param targetAddress target address
-     * \param protocol protocol number
-     * \param route route
+     * @brief Forward the packet using the route saved in the source route option header
+     * @param packet The packet
+     * @param sourceRoute Source route saved in option header
+     * @param ipv4Header IPv4 Header
+     * @param source source address
+     * @param destination destination address
+     * @param targetAddress target address
+     * @param protocol protocol number
+     * @param route route
      */
     void ForwardPacket(Ptr<const Packet> packet,
                        DsrOptionSRHeader& sourceRoute,
@@ -534,35 +534,35 @@
                        uint8_t protocol,
                        Ptr<Ipv4Route> route);
     /**
-     * \brief Broadcast the route request packet in subnet
-     * \param source source address
-     * \param destination destination address
-     * \param protocol protocol number
+     * @brief Broadcast the route request packet in subnet
+     * @param source source address
+     * @param destination destination address
+     * @param protocol protocol number
      */
     void SendInitialRequest(Ipv4Address source, Ipv4Address destination, uint8_t protocol);
     /**
-     * \brief Send the error request packet
-     * \param rerr the route error header
-     * \param protocol the protocol number
+     * @brief Send the error request packet
+     * @param rerr the route error header
+     * @param protocol the protocol number
      */
     void SendErrorRequest(DsrOptionRerrUnreachHeader& rerr, uint8_t protocol);
     /**
-     * \brief Forward the route request if the node is not the destination
-     * \param packet the original packet
-     * \param source address
+     * @brief Forward the route request if the node is not the destination
+     * @param packet the original packet
+     * @param source address
      */
     void SendRequest(Ptr<Packet> packet, Ipv4Address source);
     /**
-     * \brief Schedule the intermediate route request
-     * \param packet the original packet
+     * @brief Schedule the intermediate route request
+     * @param packet the original packet
      */
     void ScheduleInterRequest(Ptr<Packet> packet);
     /**
-     * \brief Send the gratuitous reply
-     * \param replyTo The destination address to send the reply to
-     * \param replyFrom The source address sending the reply
-     * \param nodeList Route
-     * \param protocol the protocol number
+     * @brief Send the gratuitous reply
+     * @param replyTo The destination address to send the reply to
+     * @param replyFrom The source address sending the reply
+     * @param nodeList Route
+     * @param protocol the protocol number
      */
     void SendGratuitousReply(Ipv4Address replyTo,
                              Ipv4Address replyFrom,
@@ -571,10 +571,10 @@
     /**
      * Send the route reply back to the request originator with the cumulated route
      *
-     * \param packet the original packet
-     * \param source IPv4 address of the source (i.e. request originator)
-     * \param nextHop IPv4 address of the next hop
-     * \param route Route
+     * @param packet the original packet
+     * @param source IPv4 address of the source (i.e. request originator)
+     * @param nextHop IPv4 address of the next hop
+     * @param route Route
      */
     void SendReply(Ptr<Packet> packet,
                    Ipv4Address source,
@@ -584,10 +584,10 @@
      * this is a generating the initial route reply from the destination address, a random delay
      * time [0, m_broadcastJitter] is used before unicasting back the route reply packet
      *
-     * \param packet the original packet
-     * \param source IPv4 address of the source (i.e. request originator)
-     * \param nextHop IPv4 address of the next hop
-     * \param route Route
+     * @param packet the original packet
+     * @param source IPv4 address of the source (i.e. request originator)
+     * @param nextHop IPv4 address of the next hop
+     * @param route Route
      */
     void ScheduleInitialReply(Ptr<Packet> packet,
                               Ipv4Address source,
@@ -596,11 +596,11 @@
     /**
      * Schedule the cached reply to a random start time to avoid possible route reply storm
      *
-     * \param packet the original packet
-     * \param source IPv4 address of the source (i.e. request originator)
-     * \param destination IPv4 address of the destination
-     * \param route Route
-     * \param hops number of hops
+     * @param packet the original packet
+     * @param source IPv4 address of the source (i.e. request originator)
+     * @param destination IPv4 address of the destination
+     * @param route Route
+     * @param hops number of hops
      */
     void ScheduleCachedReply(Ptr<Packet> packet,
                              Ipv4Address source,
@@ -611,12 +611,12 @@
      * Send network layer acknowledgment back to the earlier hop to notify the receipt of data
      * packet
      *
-     * \param ackId ACK ID
-     * \param destination IPv4 address of the immediate ACK receiver
-     * \param realSrc IPv4 address of the real source
-     * \param realDst IPv4 address of the real destination
-     * \param protocol the protocol number
-     * \param route Route
+     * @param ackId ACK ID
+     * @param destination IPv4 address of the immediate ACK receiver
+     * @param realSrc IPv4 address of the real source
+     * @param realDst IPv4 address of the real destination
+     * @param protocol the protocol number
+     * @param route Route
      */
     void SendAck(uint16_t ackId,
                  Ipv4Address destination,
@@ -625,10 +625,10 @@
                  uint8_t protocol,
                  Ptr<Ipv4Route> route);
     /**
-     * \param p packet to forward up
-     * \param header IPv4 Header information
-     * \param incomingInterface the Ipv4Interface on which the packet arrived
-     * \return receive status
+     * @param p packet to forward up
+     * @param header IPv4 Header information
+     * @param incomingInterface the Ipv4Interface on which the packet arrived
+     * @return receive status
      *
      * Called from lower-level layers to send the packet up
      * in the stack.
@@ -638,10 +638,10 @@
                                    Ptr<Ipv4Interface> incomingInterface) override;
 
     /**
-     * \param p packet to forward up
-     * \param header IPv6 Header information
-     * \param incomingInterface the Ipv6Interface on which the packet arrived
-     * \return receive status
+     * @param p packet to forward up
+     * @param header IPv6 Header information
+     * @param incomingInterface the Ipv6Interface on which the packet arrived
+     * @return receive status
      *
      * Called from lower-level layers to send the packet up
      * in the stack.  Not implemented (IPv6).
@@ -655,16 +655,16 @@
     IpL4Protocol::DownTargetCallback GetDownTarget() const override;
     IpL4Protocol::DownTargetCallback6 GetDownTarget6() const override;
     /**
-     * \brief Process method
+     * @brief Process method
      * Called from Ipv4L3Protocol::Receive.
      *
-     * \param packet the packet
-     * \param ipv4Header IPv4 header of the packet
-     * \param dst destination address of the packet received (i.e. us)
-     * \param nextHeader the next header
-     * \param protocol the protocol number
-     * \param isDropped if the packet must be dropped
-     * \return the size processed
+     * @param packet the packet
+     * @param ipv4Header IPv4 header of the packet
+     * @param dst destination address of the packet received (i.e. us)
+     * @param nextHeader the next header
+     * @param protocol the protocol number
+     * @param isDropped if the packet must be dropped
+     * @return the size processed
      */
     uint8_t Process(Ptr<Packet>& packet,
                     const Ipv4Header& ipv4Header,
@@ -673,29 +673,29 @@
                     uint8_t protocol,
                     bool& isDropped);
     /**
-     * \brief Insert a new Dsr Option.
-     * \param option the option to insert
+     * @brief Insert a new Dsr Option.
+     * @param option the option to insert
      */
     void Insert(Ptr<dsr::DsrOptions> option);
     /**
-     * \brief Get the option corresponding to optionNumber.
-     * \param optionNumber the option number of the option to retrieve
-     * \return a matching Dsr option
+     * @brief Get the option corresponding to optionNumber.
+     * @param optionNumber the option number of the option to retrieve
+     * @return a matching Dsr option
      */
     Ptr<dsr::DsrOptions> GetOption(int optionNumber);
     /**
-     * \brief Cancel the route request timer.
-     * \param dst The dst address of the route request timer
-     * \param isRemove whether to remove the route request entry or not
+     * @brief Cancel the route request timer.
+     * @param dst The dst address of the route request timer
+     * @param isRemove whether to remove the route request entry or not
      */
     void CancelRreqTimer(Ipv4Address dst, bool isRemove);
     /**
-     * \brief Schedule the route request retry.
-     * \param packet the original packet
-     * \param address List of IPv4 addresses
-     * \param nonProp flag if RREQ is non-propagating
-     * \param requestId Unique request ID
-     * \param protocol the protocol number
+     * @brief Schedule the route request retry.
+     * @param packet the original packet
+     * @param address List of IPv4 addresses
+     * @param nonProp flag if RREQ is non-propagating
+     * @param requestId Unique request ID
+     * @param protocol the protocol number
      */
     void ScheduleRreqRetry(Ptr<Packet> packet,
                            std::vector<Ipv4Address> address,
@@ -705,10 +705,10 @@
     /**
      * Handle route discovery timer
      *
-     * \param packet the original packet
-     * \param address List of IPv4 addresses
-     * \param requestId Unique request ID
-     * \param protocol the protocol number
+     * @param packet the original packet
+     * @param address List of IPv4 addresses
+     * @param requestId Unique request ID
+     * @param protocol the protocol number
      */
     void RouteRequestTimerExpire(Ptr<Packet> packet,
                                  std::vector<Ipv4Address> address,
@@ -720,8 +720,8 @@
      * used by this model.  Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream);
 
@@ -734,7 +734,7 @@
      *          */
     void NotifyNewAggregate() override;
     /**
-     * \brief Drop trace callback.
+     * @brief Drop trace callback.
      */
     void DoDispose() override;
     /**
@@ -746,20 +746,20 @@
   private:
     void Start();
     /**
-     * \brief Send the route error message when the link breaks to the next hop.
-     * \param nextHop next hop address
-     * \param protocol protocol number
+     * @brief Send the route error message when the link breaks to the next hop.
+     * @param nextHop next hop address
+     * @param protocol protocol number
      */
     void SendRerrWhenBreaksLinkToNextHop(Ipv4Address nextHop, uint8_t protocol);
     /**
-     * \brief Promiscuous receive data packets destined to some other node.
-     * \param device The network device
-     * \param packet Data packet we just received
-     * \param protocol The protocol we receive, need to verify it is dsr protocol
-     * \param from The from address we received the packet
-     * \param to The address this packet is destined for
-     * \param packetType The dsr packet type, 0 is for control packet, 1 for data packet
-     * \return true if the packet was processed, false otherwise
+     * @brief Promiscuous receive data packets destined to some other node.
+     * @param device The network device
+     * @param packet Data packet we just received
+     * @param protocol The protocol we receive, need to verify it is dsr protocol
+     * @param from The from address we received the packet
+     * @param to The address this packet is destined for
+     * @param packetType The dsr packet type, 0 is for control packet, 1 for data packet
+     * @return true if the packet was processed, false otherwise
      */
     bool PromiscReceive(Ptr<NetDevice> device,
                         Ptr<const Packet> packet,
@@ -768,11 +768,11 @@
                         const Address& to,
                         NetDevice::PacketType packetType);
     /**
-     * \brief Define the list to hold DSR options.
+     * @brief Define the list to hold DSR options.
      */
     typedef std::list<Ptr<DsrOptions>> DsrOptionList_t;
     /**
-     * \brief List of DSR Options supported.
+     * @brief List of DSR Options supported.
      */
     DsrOptionList_t m_options;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/dsr/model/dsr-rreq-table.cc ns-3.44/src/dsr/model/dsr-rreq-table.cc
--- ns-3.43/src/dsr/model/dsr-rreq-table.cc	2024-10-09 16:41:09.872655900 -0700
+++ ns-3.44/src/dsr/model/dsr-rreq-table.cc	2025-03-09 16:55:49.371371000 -0700
@@ -59,7 +59,7 @@
 {
     NS_LOG_FUNCTION(this);
     Ipv4Address firstExpire;
-    Time max = Seconds(0.0);
+    Time max;
     for (auto i = m_rreqDstMap.begin(); i != m_rreqDstMap.end(); ++i)
     {
         Ipv4Address dst = i->first;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/dsr/model/dsr-rreq-table.h ns-3.44/src/dsr/model/dsr-rreq-table.h
--- ns-3.43/src/dsr/model/dsr-rreq-table.h	2024-10-09 16:41:09.872655900 -0700
+++ ns-3.44/src/dsr/model/dsr-rreq-table.h	2025-03-09 16:55:49.371371000 -0700
@@ -53,8 +53,8 @@
     /**
      * Construct a BlackList with the given parameters
      *
-     * \param ip IPv4 address of the neighbor
-     * \param t expire time for the black list entry
+     * @param ip IPv4 address of the neighbor
+     * @param t expire time for the black list entry
      */
     BlackList(Ipv4Address ip, Time t)
         : m_neighborAddress(ip),
@@ -83,8 +83,8 @@
     /**
      * Construct a DsrReceivedRreqEntry with the given parameters
      *
-     * \param d IPv4 address of the destination
-     * \param i identification
+     * @param d IPv4 address of the destination
+     * @param i identification
      */
     DsrReceivedRreqEntry(Ipv4Address d = Ipv4Address(), uint16_t i = 0)
         : m_destination(d),
@@ -93,9 +93,9 @@
     }
 
     /**
-     * \brief Compare send buffer entries (destination address and identification)
-     * \param o another DsrReceivedRreqEntry
-     * \return true if equal
+     * @brief Compare send buffer entries (destination address and identification)
+     * @param o another DsrReceivedRreqEntry
+     * @return true if equal
      */
     bool operator==(const DsrReceivedRreqEntry& o) const
     {
@@ -105,7 +105,7 @@
     /**
      * Return IPv4 address of the destination
      *
-     * \return IPv4 address of the destination
+     * @return IPv4 address of the destination
      */
     Ipv4Address GetDestination() const
     {
@@ -115,7 +115,7 @@
     /**
      * Set IPv4 address of the destination
      *
-     * \param d IPv4 address of the destination
+     * @param d IPv4 address of the destination
      */
     void SetDestination(Ipv4Address d)
     {
@@ -125,7 +125,7 @@
     /**
      * Return IPv4 address of the source
      *
-     * \return IPv4 address of the source
+     * @return IPv4 address of the source
      */
     Ipv4Address GetSource() const
     {
@@ -135,7 +135,7 @@
     /**
      * Set IPv4 address of the source
      *
-     * \param s IPv4 address of the source
+     * @param s IPv4 address of the source
      */
     void SetSource(Ipv4Address s)
     {
@@ -145,7 +145,7 @@
     /**
      * Return identification
      *
-     * \return identification
+     * @return identification
      */
     uint16_t GetIdentification() const
     {
@@ -155,7 +155,7 @@
     /**
      * Set identification
      *
-     * \param i identification
+     * @param i identification
      */
     void SetIdentification(uint16_t i)
     {
@@ -167,7 +167,7 @@
      * Note that the parameter is duration but
      * the stored value is the absolute time.
      *
-     * \param exp duration before expire
+     * @param exp duration before expire
      */
     void SetExpireTime(Time exp)
     {
@@ -179,7 +179,7 @@
      * Note that we return the remaining time but the stored
      * value is the absolute time.
      *
-     * \return the remaining time before the RREQ entry expires
+     * @return the remaining time before the RREQ entry expires
      */
     Time GetExpireTime() const
     {
@@ -195,15 +195,15 @@
 };
 
 /**
- * \ingroup dsr
- * \brief maintain list of DsrRreqTable entry
+ * @ingroup dsr
+ * @brief maintain list of DsrRreqTable entry
  */
 class DsrRreqTable : public Object
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -213,7 +213,7 @@
     /**
      * Set the initial discovert hop limit
      *
-     * \param hl the initial discovert hop limit
+     * @param hl the initial discovert hop limit
      */
     void SetInitHopLimit(uint32_t hl)
     {
@@ -223,7 +223,7 @@
     /**
      * Return the initial discovert hop limit
      *
-     * \return the initial discovert hop limit
+     * @return the initial discovert hop limit
      */
     uint32_t GetInitHopLimit() const
     {
@@ -234,7 +234,7 @@
      * Set the maximum number of request entries in
      * the request table.
      *
-     * \param rt the maximum number of request entries
+     * @param rt the maximum number of request entries
      */
     void SetRreqTableSize(uint32_t rt)
     {
@@ -245,7 +245,7 @@
      * Return the maximum number of request entries in
      * the request table.
      *
-     * \return the maximum number of request entries
+     * @return the maximum number of request entries
      */
     uint32_t GetRreqTableSize() const
     {
@@ -256,7 +256,7 @@
      * Set the maximum number of request source Ids in
      * the request table
      *
-     * \param id the maximum number of request source Ids
+     * @param id the maximum number of request source Ids
      */
     void SetRreqIdSize(uint32_t id)
     {
@@ -267,7 +267,7 @@
      * Return the maximum number of request source Ids in
      * the request table
      *
-     * \return the maximum number of request source Ids
+     * @return the maximum number of request source Ids
      */
     uint32_t GetRreqIdSize() const
     {
@@ -278,7 +278,7 @@
      * Set the maximum number of request Ids in
      * the request table for a single destination.
      *
-     * \param uid the maximum number of request Ids
+     * @param uid the maximum number of request Ids
      */
     void SetUniqueRreqIdSize(uint32_t uid)
     {
@@ -289,7 +289,7 @@
      * Return the maximum number of request Ids in
      * the request table for a single destination.
      *
-     * \return the maximum number of request Ids
+     * @return the maximum number of request Ids
      */
     uint32_t GetUniqueRreqIdSize() const
     {
@@ -299,28 +299,28 @@
     /// Remove the least used entry
     void RemoveLeastExpire();
     /// Find the entry in the route request queue to see if already exists
-    /// \param dst Destination IP
+    /// @param dst Destination IP
     void FindAndUpdate(Ipv4Address dst);
     /// Remove route request entry for dst
-    /// \param dst Destination IP
+    /// @param dst Destination IP
     void RemoveRreqEntry(Ipv4Address dst);
     /// Get the request count number for one destination address
-    /// \param dst Destination IP
-    /// \return the route request counter
+    /// @param dst Destination IP
+    /// @return the route request counter
     uint32_t GetRreqCnt(Ipv4Address dst);
 
     /**
      * The following code generates new request id for each destination.
      * Check for duplicate ids and save new entries if the id is not present in the table.
      *
-     * \param dst IPv4 address of the destination
-     * \return id
+     * @param dst IPv4 address of the destination
+     * @return id
      */
     uint32_t CheckUniqueRreqId(Ipv4Address dst);
     /**
      * Get the request id size
      *
-     * \return the request id size
+     * @return the request id size
      */
     uint32_t GetRreqSize();
 
@@ -329,18 +329,18 @@
      */
     void Invalidate();
     /**
-     * \brief Verify if entry is unidirectional or not(e.g. add this neighbor to "blacklist" for
+     * @brief Verify if entry is unidirectional or not(e.g. add this neighbor to "blacklist" for
      * blacklistTimeout period)
-     * \param neighbor neighbor address link to which assumed to be unidirectional
-     * \return true on success
+     * @param neighbor neighbor address link to which assumed to be unidirectional
+     * @return true on success
      */
     BlackList* FindUnidirectional(Ipv4Address neighbor);
     /**
-     * \brief Mark entry as unidirectional (e.g. add this neighbor to "blacklist" for
+     * @brief Mark entry as unidirectional (e.g. add this neighbor to "blacklist" for
      * blacklistTimeout period)
-     * \param neighbor neighbor address link to which assumed to be unidirectional
-     * \param blacklistTimeout time for which the neighboring node is put into the blacklist
-     * \return true on success
+     * @param neighbor neighbor address link to which assumed to be unidirectional
+     * @param blacklistTimeout time for which the neighboring node is put into the blacklist
+     * @return true on success
      */
     bool MarkLinkAsUnidirectional(Ipv4Address neighbor, Time blacklistTimeout);
     /**
@@ -350,10 +350,10 @@
 
     /**
      * Find the source request entry in the route request queue, return false if not found
-     * \param src the source address we just received the source request
-     * \param dst the destination address the request is targeted at
-     * \param id the identification number for this request
-     * \return true if found, false otherwise
+     * @param src the source address we just received the source request
+     * @param dst the destination address the request is targeted at
+     * @param id the identification number for this request
+     * @return true if found, false otherwise
      */
     bool FindSourceEntry(Ipv4Address src, Ipv4Address dst, uint16_t id);
 
@@ -394,8 +394,8 @@
         /**
          * Check if the entry is expired
          *
-         * \param b BlackList entry
-         * \return true if expired, false otherwise
+         * @param b BlackList entry
+         * @return true if expired, false otherwise
          */
         bool operator()(const BlackList& b) const
         {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/dsr/model/dsr-rsendbuff.cc ns-3.44/src/dsr/model/dsr-rsendbuff.cc
--- ns-3.43/src/dsr/model/dsr-rsendbuff.cc	2024-10-09 16:41:09.872655900 -0700
+++ ns-3.44/src/dsr/model/dsr-rsendbuff.cc	2025-03-09 16:55:49.371371000 -0700
@@ -136,13 +136,13 @@
 {
     /**
      * comparison operator
-     * \param e entry to compare
-     * \return true if expired
+     * @param e entry to compare
+     * @return true if expired
      */
     bool operator()(const DsrSendBuffEntry& e) const
     {
         // NS_LOG_DEBUG("Expire time for packet in req queue: "<<e.GetExpireTime ());
-        return (e.GetExpireTime() < Seconds(0));
+        return (e.GetExpireTime().IsStrictlyNegative());
     }
 };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/dsr/model/dsr-rsendbuff.h ns-3.44/src/dsr/model/dsr-rsendbuff.h
--- ns-3.43/src/dsr/model/dsr-rsendbuff.h	2024-10-09 16:41:09.872655900 -0700
+++ ns-3.44/src/dsr/model/dsr-rsendbuff.h	2025-03-09 16:55:49.371371000 -0700
@@ -30,8 +30,8 @@
 namespace dsr
 {
 /**
- * \ingroup dsr
- * \brief DSR Send Buffer Entry
+ * @ingroup dsr
+ * @brief DSR Send Buffer Entry
  */
 class DsrSendBuffEntry
 {
@@ -39,10 +39,10 @@
     /**
      * Construct DsrSendBuffEntry with the given parameters.
      *
-     * \param pa packet
-     * \param d destination address
-     * \param exp expiration time
-     * \param p protocol number
+     * @param pa packet
+     * @param d destination address
+     * @param exp expiration time
+     * @param p protocol number
      */
     DsrSendBuffEntry(Ptr<const Packet> pa = nullptr,
                      Ipv4Address d = Ipv4Address(),
@@ -57,8 +57,8 @@
 
     /**
      * Compare send buffer entries
-     * \param o another DsrSendBuffEntry
-     * \return true if equal
+     * @param o another DsrSendBuffEntry
+     * @return true if equal
      */
     bool operator==(const DsrSendBuffEntry& o) const
     {
@@ -68,7 +68,7 @@
     // Fields
     /**
      * Get pointer to entry's packet
-     * \returns the current packet
+     * @returns the current packet
      */
     Ptr<const Packet> GetPacket() const
     {
@@ -77,7 +77,7 @@
 
     /**
      * Set pointer to entry's packet
-     * \param p the current packet
+     * @param p the current packet
      */
     void SetPacket(Ptr<const Packet> p)
     {
@@ -86,7 +86,7 @@
 
     /**
      * Get destination address of entry
-     * \returns the destination IPv4 address
+     * @returns the destination IPv4 address
      */
     Ipv4Address GetDestination() const
     {
@@ -95,7 +95,7 @@
 
     /**
      * Set destination address of entry
-     * \param d the destination IP address
+     * @param d the destination IP address
      */
     void SetDestination(Ipv4Address d)
     {
@@ -104,7 +104,7 @@
 
     /**
      * Set expire time for entry
-     * \param exp the expire time
+     * @param exp the expire time
      */
     void SetExpireTime(Time exp)
     {
@@ -113,7 +113,7 @@
 
     /**
      * Get expire time for entry
-     * \returns the expire time
+     * @returns the expire time
      */
     Time GetExpireTime() const
     {
@@ -122,7 +122,7 @@
 
     /**
      * Set protocol value
-     * \param p the protocol
+     * @param p the protocol
      */
     void SetProtocol(uint8_t p)
     {
@@ -131,7 +131,7 @@
 
     /**
      * Get protocol value
-     * \returns the protocol
+     * @returns the protocol
      */
     uint8_t GetProtocol() const
     {
@@ -150,8 +150,8 @@
 };
 
 /**
- * \ingroup dsr
- * \brief DSR send buffer
+ * @ingroup dsr
+ * @brief DSR send buffer
  */
 /************************************************************************************************************************/
 class DsrSendBuffer
@@ -168,8 +168,8 @@
      * Push entry in queue, if there is no entry with
      * the same packet and destination address in queue.
      *
-     * \param entry DsrSendBuffEntry to put in the queue
-     * \return true if successfully enqueued,
+     * @param entry DsrSendBuffEntry to put in the queue
+     * @return true if successfully enqueued,
      *         false otherwise
      */
     bool Enqueue(DsrSendBuffEntry& entry);
@@ -177,36 +177,36 @@
      * Return first found (the earliest) entry for
      * the given destination.
      *
-     * \param dst IPv4 address of the destination
-     * \param entry pointer to entry to return
-     * \return true if successfully dequeued,
+     * @param dst IPv4 address of the destination
+     * @param entry pointer to entry to return
+     * @return true if successfully dequeued,
      *         false otherwise
      */
     bool Dequeue(Ipv4Address dst, DsrSendBuffEntry& entry);
     /**
      * Remove all packets with destination IP address dst
      *
-     * \param dst IPv4 address of the destination
+     * @param dst IPv4 address of the destination
      */
     void DropPacketWithDst(Ipv4Address dst);
     /**
      * Check if a packet with destination dst exists in the queue
      *
-     * \param dst IPv4 address of the destination
-     * \return true if found, false otherwise
+     * @param dst IPv4 address of the destination
+     * @return true if found, false otherwise
      */
     bool Find(Ipv4Address dst);
     /**
      * Number of entries
      *
-     * \return the number of entries in the queue
+     * @return the number of entries in the queue
      */
     uint32_t GetSize();
 
     /**
      * Return the maximum queue length
      *
-     * \return the maximum queue length
+     * @return the maximum queue length
      */
     uint32_t GetMaxQueueLen() const
     {
@@ -216,7 +216,7 @@
     /**
      * Set the maximum queue length
      *
-     * \param len the maximum queue length
+     * @param len the maximum queue length
      */
     void SetMaxQueueLen(uint32_t len)
     {
@@ -226,7 +226,7 @@
     /**
      * Return the entry lifetime in the queue
      *
-     * \return the entry lifetime in the queue
+     * @return the entry lifetime in the queue
      */
     Time GetSendBufferTimeout() const
     {
@@ -236,7 +236,7 @@
     /**
      * Set the entry lifetime in the queue
      *
-     * \param t the entry lifetime in the queue
+     * @param t the entry lifetime in the queue
      */
     void SetSendBufferTimeout(Time t)
     {
@@ -248,7 +248,7 @@
     /**
      * Return a pointer to the internal queue
      *
-     * \return a pointer to the internal queue
+     * @return a pointer to the internal queue
      */
     std::vector<DsrSendBuffEntry>& GetBuffer()
     {
@@ -260,8 +260,8 @@
     void Purge();                               ///< Remove all expired entries
 
     /// Notify that packet is dropped from queue by timeout
-    /// \param en BuffEntry Buffer entry
-    /// \param reason Drop reason
+    /// @param en BuffEntry Buffer entry
+    /// @param reason Drop reason
     void Drop(DsrSendBuffEntry en, std::string reason);
 
     uint32_t
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/dsr/test/dsr-test-suite.cc ns-3.44/src/dsr/test/dsr-test-suite.cc
--- ns-3.43/src/dsr/test/dsr-test-suite.cc	2024-10-09 16:41:09.872655900 -0700
+++ ns-3.44/src/dsr/test/dsr-test-suite.cc	2025-03-09 16:55:49.375371000 -0700
@@ -42,16 +42,16 @@
 
 // -----------------------------------------------------------------------------
 /**
- * \ingroup dsr
- * \defgroup dsr-test DSR routing module tests
+ * @ingroup dsr
+ * @defgroup dsr-test DSR routing module tests
  */
 
 /**
- * \ingroup dsr-test
- * \ingroup tests
+ * @ingroup dsr-test
+ * @ingroup tests
  *
- * \class DsrFsHeaderTest
- * \brief Unit test for DSR Fixed Size Header
+ * @class DsrFsHeaderTest
+ * @brief Unit test for DSR Fixed Size Header
  */
 class DsrFsHeaderTest : public TestCase
 {
@@ -92,11 +92,11 @@
 
 // -----------------------------------------------------------------------------
 /**
- * \ingroup dsr-test
- * \ingroup tests
+ * @ingroup dsr-test
+ * @ingroup tests
  *
- * \class DsrRreqHeaderTest
- * \brief Unit test for RREQ
+ * @class DsrRreqHeaderTest
+ * @brief Unit test for RREQ
  */
 class DsrRreqHeaderTest : public TestCase
 {
@@ -148,11 +148,11 @@
 
 // -----------------------------------------------------------------------------
 /**
- * \ingroup dsr-test
- * \ingroup tests
+ * @ingroup dsr-test
+ * @ingroup tests
  *
- * \class DsrRrepHeaderTest
- * \brief Unit test for RREP
+ * @class DsrRrepHeaderTest
+ * @brief Unit test for RREP
  */
 class DsrRrepHeaderTest : public TestCase
 {
@@ -200,11 +200,11 @@
 
 // -----------------------------------------------------------------------------
 /**
- * \ingroup dsr-test
- * \ingroup tests
+ * @ingroup dsr-test
+ * @ingroup tests
  *
- * \class DsrSRHeaderTest
- * \brief Unit test for Source Route
+ * @class DsrSRHeaderTest
+ * @brief Unit test for Source Route
  */
 class DsrSRHeaderTest : public TestCase
 {
@@ -257,11 +257,11 @@
 
 // -----------------------------------------------------------------------------
 /**
- * \ingroup dsr-test
- * \ingroup tests
+ * @ingroup dsr-test
+ * @ingroup tests
  *
- * \class DsrRerrHeaderTest
- * \brief Unit test for RERR
+ * @class DsrRerrHeaderTest
+ * @brief Unit test for RERR
  */
 class DsrRerrHeaderTest : public TestCase
 {
@@ -305,11 +305,11 @@
 
 // -----------------------------------------------------------------------------
 /**
- * \ingroup dsr-test
- * \ingroup tests
+ * @ingroup dsr-test
+ * @ingroup tests
  *
- * \class DsrAckReqHeaderTest
- * \brief Unit test for ACK-REQ
+ * @class DsrAckReqHeaderTest
+ * @brief Unit test for ACK-REQ
  */
 class DsrAckReqHeaderTest : public TestCase
 {
@@ -350,11 +350,11 @@
 
 // -----------------------------------------------------------------------------
 /**
- * \ingroup dsr-test
- * \ingroup tests
+ * @ingroup dsr-test
+ * @ingroup tests
  *
- * \class DsrAckHeaderTest
- * \brief Unit test for ACK
+ * @class DsrAckHeaderTest
+ * @brief Unit test for ACK
  */
 class DsrAckHeaderTest : public TestCase
 {
@@ -399,11 +399,11 @@
 
 // -----------------------------------------------------------------------------
 /**
- * \ingroup dsr-test
- * \ingroup tests
+ * @ingroup dsr-test
+ * @ingroup tests
  *
- * \class DsrCacheEntryTest
- * \brief Unit test for DSR route cache entry
+ * @class DsrCacheEntryTest
+ * @brief Unit test for DSR route cache entry
  */
 class DsrCacheEntryTest : public TestCase
 {
@@ -466,11 +466,11 @@
 
 // -----------------------------------------------------------------------------
 /**
- * \ingroup dsr-test
- * \ingroup tests
+ * @ingroup dsr-test
+ * @ingroup tests
  *
- * \class DsrSendBuffTest
- * \brief Unit test for Send Buffer
+ * @class DsrSendBuffTest
+ * @brief Unit test for Send Buffer
  */
 class DsrSendBuffTest : public TestCase
 {
@@ -575,11 +575,11 @@
 
 // -----------------------------------------------------------------------------
 /**
- * \ingroup dsr-test
- * \ingroup tests
+ * @ingroup dsr-test
+ * @ingroup tests
  *
- * \class DsrRreqTableTest
- * \brief Unit test for DSR routing table entry
+ * @class DsrRreqTableTest
+ * @brief Unit test for DSR routing table entry
  */
 class DsrRreqTableTest : public TestCase
 {
@@ -609,11 +609,11 @@
 
 // -----------------------------------------------------------------------------
 /**
- * \ingroup dsr-test
- * \ingroup tests
+ * @ingroup dsr-test
+ * @ingroup tests
  *
- * \class DsrTestSuite
- * \brief DSR test suite
+ * @class DsrTestSuite
+ * @brief DSR test suite
  */
 class DsrTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/energy/doc/energy.rst ns-3.44/src/energy/doc/energy.rst
--- ns-3.43/src/energy/doc/energy.rst	2024-10-09 16:41:09.872655900 -0700
+++ ns-3.44/src/energy/doc/energy.rst	2025-03-09 16:55:49.375371000 -0700
@@ -32,6 +32,14 @@
 
     |ns3| energy framework
 
+Scope and Limitations
+---------------------
+
+* In the ``GenericBatteryModel`` charging behavior (voltage as a function of SoC) is included but is not been thoroughly tested. Testing requires the implementation of a harvesting device (A charger) capable of providing a CCCV charging method (typical of rechargeable batteries).
+* In the ``GenericBatteryModel`` impedance (battery resistance) is constant, battery aging or temperature effects are not considered.
+* The Rv battery model has some reported issues (See: issue `#164 <https://gitlab.com/nsnam/ns-3-dev/-/issues/164>`_).
+* The harvesting model can only be used with a ``BasicEnergySource`` because it does not consider the current capacity or voltage of the battery.
+* The is no energy sources or energy models others than the ones mentioned in this document. Support for other communication devices (lr-wpan, WiMax, etc) and other pieces of hardware (UAV, sensors, CPU) is required.
 
 Energy Source Models
 --------------------
@@ -111,48 +119,24 @@
 the behavior of a new battery, it is important to chose values that satisfies more than one curve,
 trial an error adjustments might be necessary to obtain the desired results.
 
-Attributes:
-
-* ``FullVoltage``: Represents the :math:`V_{full}` value.
-* ``MaxCapacity``: Represents the :math:`Q` value.
-* ``ExponentialVoltage``: Represents the :math:`V_{exp}` value.
-* ``ExponentialCapacity``: Represents the :math:`Q_{exp}` value.
-* ``NominalVoltage``: Represents the :math:`V_{nom}` value.
-* ``NominalCapacity``: Represents the :math:`Q_{nom}` value.
-* ``InternalResistance``: Represents the :math:`R` value.
-* ``TypicalDischargeCurrent``: Represents the :math:`i_{typical}` value.
-* ``CutoffVoltage``: The voltage where the battery is considered depleted.
-* ``BatteryType``: Indicates the battery type used.
-* ``PeriodicEnergyUpdateInterval``: Indicates how often the update values are obtained.
-* ``LowBatteryThreshold``: Additional voltage threshold to indicate when the battery has low energy.
-
 The process described above can be simplified by installing batteries presents of previously tested
 batteries using helpers. Details on helpers usage are detailed in the following sections.
 
 
-RV Battery Model
-~~~~~~~~~~~~~~~~
 
-Attributes:
+Rv Energy Source
+~~~~~~~~~~~~~~~~
 
-* ``RvBatteryModelPeriodicEnergyUpdateInterval``: RV battery model sampling
-  interval.
-* ``RvBatteryModelOpenCircuitVoltage``: RV battery model open circuit voltage.
-* ``RvBatteryModelCutoffVoltage``: RV battery model cutoff voltage.
-* ``RvBatteryModelAlphaValue``: RV battery model alpha value.
-* ``RvBatteryModelBetaValue``: RV battery model beta value.
-* ``RvBatteryModelNumOfTerms``: The number of terms of the infinite sum for estimating battery level.
+The Rakhmatov (Rv) energy source model is the first implementation of a non-linear Li-Ion energy source model for ns-3.
+Originally created for ns-2, it was later on ported to ns-3 by Wu et al. The Rv model requires some real batteries experiments apriori
+in order to obtain the attribute values required by the model. For more information read the original author's paper.
 
 Basic Energy Source
 ~~~~~~~~~~~~~~~~~~~
 
-Attributes:
-
-* ``BasicEnergySourceInitialEnergyJ``: Initial energy stored in
-  basic energy source.
-* ``BasicEnergySupplyVoltageV``: Initial supply voltage for basic energy source.
-* ``PeriodicEnergyUpdateInterval``: Time between two consecutive periodic energy updates.
-
+The Basic energy source represents an "ideal" linear energy source.
+Its straightforward design makes it useful for testing and designing energy models.
+However, users should consider utilizing different energy sources for testing realistic energy consumption scenarios, as the basic energy source is not reflective of most existing energy sources, such as the non-linear nature of energy sources such as batteries.
 
 Energy Consumption Models
 -------------------------
@@ -205,15 +189,6 @@
 so that the Wifi PHY is resumed from the OFF mode when the energy
 source is recharged.
 
-Attributes
-
-* ``IdleCurrentA``: The default radio Idle current in Ampere.
-* ``CcaBusyCurrentA``: The default radio CCA Busy State current in Ampere.
-* ``TxCurrentA``: The radio Tx current in Ampere.
-* ``RxCurrentA``: The radio Rx current in Ampere.
-* ``SwitchingCurrentA``: The default radio Channel Switch current in Ampere.
-* ``SleepCurrentA``: The radio Sleep current in Ampere.
-* ``TxCurrentModel``: A pointer to the attached tx current model.
 
 Energy Harvesting Models
 ------------------------
@@ -324,24 +299,73 @@
 Usage of both of these type of configurations are shown in ``generic-battery-discharge-example.cc``.
 The following table is a list of the available presents in |ns3|:
 
+.. table::
+   :align: left
+   :widths: auto
+
+   +------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------+
+   | Preset Name                                                                                                                  | Description                                     |
+   +==============================================================================================================================+=================================================+
+   | `PANASONIC_CGR18650DA_LION <https://www.nsnam.org/wp-content/uploads/2024/lr-wpan-datasheets/LiIonPanasonicCGR18650DA.pdf>`_ | Panasonic Li-Ion  (3.6V, 2450Ah, Size A)        |
+   +------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------+
+   | `PANASONIC_HHR650D_NIMH <https://www.nsnam.org/wp-content/uploads/2024/lr-wpan-datasheets/NiMHPanasonicHHR650D3.pdf>`_       | Panasonic NiMh HHR550D (1.2V 6.5Ah, Size D)     |
+   +------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------+
+   | `CSB_GP1272_LEADACID <https://www.nsnam.org/wp-content/uploads/2024/lr-wpan-datasheets/LeadAcidCSBGP1272.pdf>`_              | CSB Lead Acid GP1272 (12V,7.2Ah)                |
+   +------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------+
+   | `PANASONIC_N700AAC_NICD <https://www.nsnam.org/wp-content/uploads/2024/lr-wpan-datasheets/NiCdPanasonicN700AAC.pdf>`_        | Panasonic NiCd N-700AAC (1.2V 700mAh, Size: AA) |
+   +------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------+
+   | `RSPRO_LGP12100_LEADACID <https://www.nsnam.org/wp-content/uploads/2024/lr-wpan-datasheets/LeadAcidRsProLBLGP12100.pdf>`_    | Rs Pro Lead Acid LGP12100 (12V, 100Ah)          |
+   +------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------+
 
-+---------------------------+-------------------------------------------------+
-| Preset Name               | Description                                     |
-+===========================+=================================================+
-| PANASONIC_CGR18650DA_LION | Panasonic Li-Ion  (3.6V, 2450Ah, Size A)        |
-+---------------------------+-------------------------------------------------+
-| PANASONIC_HHR650D_NIMH    | Panasonic NiMh HHR550D (1.2V 6.5Ah, Size D)     |
-+---------------------------+-------------------------------------------------+
-| CSB_GP1272_LEADACID       | CSB Lead Acid GP1272 (12V,7.2Ah)                |
-+---------------------------+-------------------------------------------------+
-| PANASONIC_N700AAC_NICD    | Panasonic NiCd N-700AAC (1.2V 700mAh, Size: AA) |
-+---------------------------+-------------------------------------------------+
-| RSPRO_LGP12100_LEADACID   | Rs Pro Lead Acid LGP12100 (12V, 100Ah)          |
-+---------------------------+-------------------------------------------------+
+All the |ns3| available presets have been created by carefully choosing the batteries attribute values based on the information found on each battery datasheet.
 
+Attributes
+~~~~~~~~~~
 
-Tracing
-~~~~~~~
+Besides using established presets, users can create their own energy sources by using the **Generic Battery Model**  attributes to create their own energy sources (i.e. batteries):
+
+* ``FullVoltage``: Represents the :math:`V_{full}` value.
+* ``MaxCapacity``: Represents the :math:`Q` value.
+* ``ExponentialVoltage``: Represents the :math:`V_{exp}` value.
+* ``ExponentialCapacity``: Represents the :math:`Q_{exp}` value.
+* ``NominalVoltage``: Represents the :math:`V_{nom}` value.
+* ``NominalCapacity``: Represents the :math:`Q_{nom}` value.
+* ``InternalResistance``: Represents the :math:`R` value.
+* ``TypicalDischargeCurrent``: Represents the :math:`i_{typical}` value.
+* ``CutoffVoltage``: The voltage where the battery is considered depleted.
+* ``BatteryType``: Indicates the battery type used.
+* ``PeriodicEnergyUpdateInterval``: Indicates how often the update values are obtained.
+* ``LowBatteryThreshold``: Additional voltage threshold to indicate when the battery has low energy.
+
+**Rv Energy source** attributes:
+
+* ``RvBatteryModelPeriodicEnergyUpdateInterval``: RV battery model sampling interval.
+* ``RvBatteryModelOpenCircuitVoltage``: RV battery model open circuit voltage.
+* ``RvBatteryModelCutoffVoltage``: RV battery model cutoff voltage.
+* ``RvBatteryModelAlphaValue``: RV battery model alpha value.
+* ``RvBatteryModelBetaValue``: RV battery model beta value.
+* ``RvBatteryModelNumOfTerms``: The number of terms of the infinite sum for estimating battery level.
+
+**Basic Energy source** attributes:
+
+* ``BasicEnergySourceInitialEnergyJ``: Initial energy stored in
+  basic energy source.
+* ``BasicEnergySupplyVoltageV``: Initial supply voltage for basic energy source.
+* ``PeriodicEnergyUpdateInterval``: Time between two consecutive periodic energy updates.
+
+
+**Wifi Radio Energy model** attributes:
+
+* ``IdleCurrentA``: The default radio Idle current in Ampere.
+* ``CcaBusyCurrentA``: The default radio CCA Busy State current in Ampere.
+* ``TxCurrentA``: The radio Tx current in Ampere.
+* ``RxCurrentA``: The radio Rx current in Ampere.
+* ``SwitchingCurrentA``: The default radio Channel Switch current in Ampere.
+* ``SleepCurrentA``: The radio Sleep current in Ampere.
+* ``TxCurrentModel``: A pointer to the attached tx current model.
+
+Traces
+~~~~~~
 
 Traced values differ between Energy Sources, Devices Energy Models and
 Energy Harvesters implementations, please look at the specific child
@@ -365,8 +389,8 @@
 * ``HarvestedPower``: Current power provided by the BasicEnergyHarvester.
 * ``TotalEnergyHarvested``: Total energy harvested by the BasicEnergyHarvester.
 
-Examples
-~~~~~~~~
+Examples and Tests
+------------------
 
 The following examples have been written.
 
@@ -381,11 +405,9 @@
 Examples in ``examples/energy``:
 
 * ``energy-model-example.cc``
-* ``energy-model-with-harvesting-example.cc``: Shows the harvesting model usage. Only usable with basicEnergySources.
+* ``energy-model-with-harvesting-example.cc``: Shows the harvesting model usage. Only usable with ``BasicEnergySource``.
 
 
-Tests
-~~~~~
 The following tests have been written, which can be found in ``src/energy/tests/``:
 
 * ``basic-energy-harvester-test.cc``: Test energy harvester procedure
@@ -422,28 +444,10 @@
 
     NiMH battery discharge curve (Panasonic HHR650D)
 
-
-
-Scope and Limitations
----------------------
-
-* In the ``GenericBatteryModel`` charging behavior (voltage as a function of SoC) is included but is not been thoroughly tested. Testing requires the implementation of a harvesting device (A charger) capable of providing a CCCV charging method typically used in batteries.
-* In the ``GenericBatteryModel`` impedance (battery resistance) is constant, battery aging or temperature effects are not considered.
-* The Rv battery model has some reported issues (See: issue #164)
-* The harvesting mode can only be used with basic energy sources because it does not consider the current capacity or voltage of the battery.
-
-Future Work
------------
-
-* Support of device energy models for PHY layers (lr-wpan, WiMax, etc) and other pieces of hardware (UAV, sensors, CPU).
-* Support for realistic charging batteries in the ``GenericBatteryModule``.
-* Support for device capable of charging batteries (e.g. chargers with CCCV capabilities).
-* Implement an energy harvester that recharges the energy sources according to the power levels defined in a user customizable dataset of real measurements.
-
 References
 ----------
 
-Energy source models and energy consumption models:
+**Energy source models and energy consumption models**:
 
 [`1 <https://labs.ece.uw.edu/nsl/papers/SIMUTools-11.pdf>`_] H. Wu, S. Nabar and R. Poovendran. An Energy Framework for the Network Simulator 3 (ns-3).
 
@@ -459,12 +463,12 @@
 
 [`7 <https://www.mathworks.com/help/sps/powersys/ref/battery.html>`_]  MatWorks SimuLink Generic Battery Model
 
-[8] C. M. Shepherd. 1965. Design of Primary and Secondary Cells: II . An Equation Describing Battery Discharge. Journal of The Electrochemical Society 112, 7 (jul 1965), 657. https://doi.org/10.1149/1.2423659
+[`8 <https://iopscience.iop.org/article/10.1149/1.2423659>`_] C. M. Shepherd. 1965. Design of Primary and Secondary Cells: II . An Equation Describing Battery Discharge. Journal of The Electrochemical Society 112, 7 (jul 1965), 657. https://doi.org/10.1149/1.2423659
 
 [`9 <https://dl.acm.org/doi/abs/10.1145/3592149.3592156>`_] Alberto Gallegos Ramonet, Alexander Guzman Urbina, and Kazuhiko Kinoshita. 2023. Evaluation and Extension of ns-3 Battery Framework. In Proceedings of the 2023 Workshop on ns-3 (WNS3 '23). Association for Computing Machinery, New York, NY, USA, 102–108. https://doi.org/10.1145/3592149.3592156
 
 
-Energy Harvesting Models:
+**Energy harvesting models:**
 
 [10] C. Tapparello, H. Ayatollahi and W. Heinzelman. Extending the Energy Framework for Network Simulator 3 (ns-3). Workshop on ns-3 (WNS3), Poster Session, Atlanta, GA, USA. May, 2014.
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/energy/examples/basic-energy-model-test.cc ns-3.44/src/energy/examples/basic-energy-model-test.cc
--- ns-3.43/src/energy/examples/basic-energy-model-test.cc	2024-10-09 16:41:09.872655900 -0700
+++ ns-3.44/src/energy/examples/basic-energy-model-test.cc	2025-03-09 16:55:49.375371000 -0700
@@ -39,14 +39,14 @@
 
     /**
      * Performs some tests involving state updates and the relative energy consumption
-     * \return true is some error happened.
+     * @return true is some error happened.
      */
     bool DoRun();
 
   private:
     /**
-     * \param state Radio state to switch to.
-     * \return False if no error occurs.
+     * @param state Radio state to switch to.
+     * @return False if no error occurs.
      *
      * Runs simulation for a while, check if final state & remaining energy is
      * correctly updated.
@@ -249,7 +249,7 @@
 
     /**
      * Performs some tests involving energy depletion
-     * \return true is some error happened.
+     * @return true is some error happened.
      */
     bool DoRun();
 
@@ -260,9 +260,9 @@
     void DepletionHandler();
 
     /**
-     * \param simTimeS Simulation time, in seconds.
-     * \param updateIntervalS Device model update interval, in seconds.
-     * \return False if all is good.
+     * @param simTimeS Simulation time, in seconds.
+     * @param updateIntervalS Device model update interval, in seconds.
+     * @return False if all is good.
      *
      * Runs simulation with specified simulation time and update interval.
      */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/energy/examples/generic-battery-discharge-example.cc ns-3.44/src/energy/examples/generic-battery-discharge-example.cc
--- ns-3.43/src/energy/examples/generic-battery-discharge-example.cc	2024-10-09 16:41:09.872655900 -0700
+++ ns-3.44/src/energy/examples/generic-battery-discharge-example.cc	2025-03-09 16:55:49.375371000 -0700
@@ -6,9 +6,9 @@
  * Author: Alberto Gallegos Ramonet <alramonet@is.tokushima-u.ac.jp>
  */
 
-#include <ns3/core-module.h>
-#include <ns3/energy-module.h>
-#include <ns3/gnuplot.h>
+#include "ns3/core-module.h"
+#include "ns3/energy-module.h"
+#include "ns3/gnuplot.h"
 
 #include <fstream>
 #include <sstream>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/energy/examples/generic-battery-wifiradio-example.cc ns-3.44/src/energy/examples/generic-battery-wifiradio-example.cc
--- ns-3.43/src/energy/examples/generic-battery-wifiradio-example.cc	2024-10-09 16:41:09.872655900 -0700
+++ ns-3.44/src/energy/examples/generic-battery-wifiradio-example.cc	2025-03-09 16:55:49.375371000 -0700
@@ -26,12 +26,12 @@
  *
  */
 
-#include <ns3/core-module.h>
-#include <ns3/energy-module.h>
-#include <ns3/internet-module.h>
-#include <ns3/mobility-module.h>
-#include <ns3/network-module.h>
-#include <ns3/wifi-module.h>
+#include "ns3/core-module.h"
+#include "ns3/energy-module.h"
+#include "ns3/internet-module.h"
+#include "ns3/mobility-module.h"
+#include "ns3/network-module.h"
+#include "ns3/wifi-module.h"
 
 #include <sstream>
 #include <string>
@@ -44,8 +44,8 @@
 /**
  * Print a received packet
  *
- * \param from sender address
- * \return a string with the details of the packet: dst {IP, port}, time.
+ * @param from sender address
+ * @return a string with the details of the packet: dst {IP, port}, time.
  */
 inline std::string
 PrintReceivedPacket(Address& from)
@@ -60,7 +60,7 @@
 }
 
 /**
- * \param socket Pointer to socket.
+ * @param socket Pointer to socket.
  *
  * Packet receiving sink.
  */
@@ -79,11 +79,11 @@
 }
 
 /**
- * \param socket Pointer to socket.
- * \param pktSize Packet size.
- * \param n Pointer to node.
- * \param pktCount Number of packets to generate.
- * \param pktInterval Packet sending interval.
+ * @param socket Pointer to socket.
+ * @param pktSize Packet size.
+ * @param n Pointer to node.
+ * @param pktCount Number of packets to generate.
+ * @param pktInterval Packet sending interval.
  *
  * Generate Traffic
  */
@@ -114,8 +114,8 @@
 /**
  * Trace function for remaining energy at node.
  *
- * \param oldValue Old value
- * \param remainingEnergy New value
+ * @param oldValue Old value
+ * @param remainingEnergy New value
  */
 void
 RemainingEnergy(double oldValue, double remainingEnergy)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/energy/examples/rv-battery-model-test.cc ns-3.44/src/energy/examples/rv-battery-model-test.cc
--- ns-3.43/src/energy/examples/rv-battery-model-test.cc	2024-10-09 16:41:09.872655900 -0700
+++ ns-3.44/src/energy/examples/rv-battery-model-test.cc	2025-03-09 16:55:49.375371000 -0700
@@ -29,7 +29,7 @@
 NS_LOG_COMPONENT_DEFINE("RvBatteryModelTestSuite");
 
 /**
- * \ingroup energy
+ * @ingroup energy
  *
  * This example was originally devised as a test, then it was converted
  * to an example.
@@ -56,9 +56,9 @@
     void CreateLoadProfiles();
 
     /**
-     * \param load Load value, in Amperes (A).
-     * \param expLifetime Expected lifetime.
-     * \return False if no error occurs.
+     * @param load Load value, in Amperes (A).
+     * @param expLifetime Expected lifetime.
+     * @return False if no error occurs.
      *
      * Runs simulation with constant load and checks the battery lifetime with
      * known results.
@@ -66,10 +66,10 @@
     bool ConstantLoadTest(double load, Time expLifetime) const;
 
     /**
-     * \param loads Load profile.
-     * \param timeStamps Time stamps.
-     * \param expLifetime Expected lifetime.
-     * \returns False if no error occurs.
+     * @param loads Load profile.
+     * @param timeStamps Time stamps.
+     * @param expLifetime Expected lifetime.
+     * @returns False if no error occurs.
      *
      * Runs simulation with variable load and checks the battery lifetime with
      * known results.
@@ -528,7 +528,7 @@
     }
 
     loads.push_back(0.2227);
-    timeStamps.push_back(Seconds(200.0));
+    timeStamps.push_back(Seconds(200));
 
     profile.loads = loads;
     profile.timeStamps = timeStamps;
@@ -555,7 +555,7 @@
     }
 
     loads.push_back(0.2227);
-    timeStamps.push_back(Seconds(200.0));
+    timeStamps.push_back(Seconds(200));
 
     profile.loads = loads;
     profile.timeStamps = timeStamps;
@@ -638,27 +638,27 @@
     BatteryLifetimeTest test;
     int ret = 0;
 
-    if (test.ConstantLoadTest(0.640, Seconds(2844.0)))
+    if (test.ConstantLoadTest(0.640, Seconds(2844)))
     {
         ret = 1;
         std::cerr << "Problems with constant load test (640mA)." << std::endl;
     }
-    if (test.ConstantLoadTest(0.320, Seconds(6146.0)))
+    if (test.ConstantLoadTest(0.320, Seconds(6146)))
     {
         ret = 1;
         std::cerr << "Problems with constant load test (320mA)." << std::endl;
     }
-    if (test.ConstantLoadTest(0.128, Seconds(16052.0)))
+    if (test.ConstantLoadTest(0.128, Seconds(16052)))
     {
         ret = 1;
         std::cerr << "Problems with constant load test (128mA)." << std::endl;
     }
-    if (test.ConstantLoadTest(0.064, Seconds(32561.0)))
+    if (test.ConstantLoadTest(0.064, Seconds(32561)))
     {
         ret = 1;
         std::cerr << "Problems with constant load test (64mA)." << std::endl;
     }
-    if (test.ConstantLoadTest(0.032, Seconds(65580.0)))
+    if (test.ConstantLoadTest(0.032, Seconds(65580)))
     {
         ret = 1;
         std::cerr << "Problems with constant load test (32mA)." << std::endl;
@@ -766,7 +766,7 @@
     DeviceEnergyModelContainer deviceModels = radioEnergyHelper.Install(devices, sources);
 
     // run simulation
-    Simulator::Stop(Seconds(70000.0));
+    Simulator::Stop(Seconds(70000));
     Simulator::Run();
 
     Time actualLifetime;
@@ -864,7 +864,7 @@
     }
 
     // run simulation
-    Simulator::Stop(Seconds(70000.0));
+    Simulator::Stop(Seconds(70000));
     Simulator::Run();
 
     Time actualLifetime;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/energy/helper/basic-energy-harvester-helper.h ns-3.44/src/energy/helper/basic-energy-harvester-helper.h
--- ns-3.43/src/energy/helper/basic-energy-harvester-helper.h	2024-10-09 16:41:09.872655900 -0700
+++ ns-3.44/src/energy/helper/basic-energy-harvester-helper.h	2025-03-09 16:55:49.375371000 -0700
@@ -19,8 +19,8 @@
 {
 
 /**
- * \ingroup energy
- * \brief Creates a BasicEnergyHarvester object.
+ * @ingroup energy
+ * @brief Creates a BasicEnergyHarvester object.
  */
 class BasicEnergyHarvesterHelper : public EnergyHarvesterHelper
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/energy/helper/basic-energy-source-helper.h ns-3.44/src/energy/helper/basic-energy-source-helper.h
--- ns-3.43/src/energy/helper/basic-energy-source-helper.h	2024-10-09 16:41:09.872655900 -0700
+++ ns-3.44/src/energy/helper/basic-energy-source-helper.h	2025-03-09 16:55:49.375371000 -0700
@@ -17,8 +17,8 @@
 {
 
 /**
- * \ingroup energy
- * \brief Creates a BasicEnergySource object.
+ * @ingroup energy
+ * @brief Creates a BasicEnergySource object.
  *
  */
 class BasicEnergySourceHelper : public EnergySourceHelper
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/energy/helper/energy-harvester-container.h ns-3.44/src/energy/helper/energy-harvester-container.h
--- ns-3.43/src/energy/helper/energy-harvester-container.h	2024-10-09 16:41:09.872655900 -0700
+++ ns-3.44/src/energy/helper/energy-harvester-container.h	2025-03-09 16:55:49.375371000 -0700
@@ -24,14 +24,14 @@
 class EnergyHarvester;
 
 /**
- * \ingroup energy
- * \brief Holds a vector of ns3::EnergyHarvester pointers.
+ * @ingroup energy
+ * @brief Holds a vector of ns3::EnergyHarvester pointers.
  *
  * EnergyHarvesterContainer returns a list of EnergyHarvester pointers
  * installed on a node. Users can use this list to access EnergyHarvester
  * objects to obtain the total energy harvested on a node easily.
  *
- * \see NetDeviceContainer
+ * @see NetDeviceContainer
  *
  */
 class EnergyHarvesterContainer : public Object
@@ -42,8 +42,8 @@
 
   public:
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
     /**
@@ -53,7 +53,7 @@
     ~EnergyHarvesterContainer() override;
 
     /**
-     * \param harvester Pointer to an EnergyHarvester.
+     * @param harvester Pointer to an EnergyHarvester.
      *
      * Creates a EnergyHarvesterContainer with exactly one EnergyHarvester
      * previously instantiated.
@@ -61,7 +61,7 @@
     EnergyHarvesterContainer(Ptr<EnergyHarvester> harvester);
 
     /**
-     * \param harvesterName Name of EnergyHarvester.
+     * @param harvesterName Name of EnergyHarvester.
      *
      * Creates an EnergyHarvesterContainer with exactly one EnergyHarvester
      * previously instantiated and assigned a name using the Object name service.
@@ -70,77 +70,77 @@
     EnergyHarvesterContainer(std::string harvesterName);
 
     /**
-     * \param a A EnergyHarvesterContainer.
-     * \param b Another EnergyHarvesterContainer.
+     * @param a A EnergyHarvesterContainer.
+     * @param b Another EnergyHarvesterContainer.
      *
      * Creates a EnergyHarvesterContainer by concatenating EnergyHarvesterContainer b
      * to EnergyHarvesterContainer a.
      *
-     * \note Can be used to concatenate 2 Ptr<EnergyHarvester> directly. C++
+     * @note Can be used to concatenate 2 Ptr<EnergyHarvester> directly. C++
      * will be calling EnergyHarvesterContainer constructor with Ptr<EnergyHarvester>
      * first.
      */
     EnergyHarvesterContainer(const EnergyHarvesterContainer& a, const EnergyHarvesterContainer& b);
 
     /**
-     * \brief Get an iterator which refers to the first EnergyHarvester pointer
+     * @brief Get an iterator which refers to the first EnergyHarvester pointer
      * in the container.
      *
-     * \returns An iterator which refers to the first EnergyHarvester in container.
+     * @returns An iterator which refers to the first EnergyHarvester in container.
      *
      * EnergyHarvesters can be retrieved from the container in two ways. First,
      * directly by an index into the container, and second, using an iterator.
      * This method is used in the iterator method and is typically used in a
      * for-loop to run through the EnergyHarvesters.
      *
-     * \code
+     * @code
      *   EnergyHarvesterContainer::Iterator i;
      *   for (i = container.Begin (); i != container.End (); ++i)
      *     {
      *       (*i)->method ();  // some EnergyHarvester method
      *     }
-     * \endcode
+     * @endcode
      */
     Iterator Begin() const;
 
     /**
-     * \brief Get an iterator which refers to the last EnergyHarvester pointer
+     * @brief Get an iterator which refers to the last EnergyHarvester pointer
      * in the container.
      *
-     * \returns An iterator which refers to the last EnergyHarvester in container.
+     * @returns An iterator which refers to the last EnergyHarvester in container.
      *
      * EnergyHarvesters can be retrieved from the container in two ways. First,
      * directly by an index into the container, and second, using an iterator.
      * This method is used in the iterator method and is typically used in a
      * for-loop to run through the EnergyHarvesters.
      *
-     * \code
+     * @code
      *   EnergyHarvesterContainer::Iterator i;
      *   for (i = container.Begin (); i != container.End (); ++i)
      *     {
      *       (*i)->method ();  // some EnergyHarvester method
      *     }
-     * \endcode
+     * @endcode
      */
     Iterator End() const;
 
     /**
-     * \brief Get the number of Ptr<EnergyHarvester> stored in this container.
+     * @brief Get the number of Ptr<EnergyHarvester> stored in this container.
      *
-     * \returns The number of Ptr<EnergyHarvester> stored in this container.
+     * @returns The number of Ptr<EnergyHarvester> stored in this container.
      */
     uint32_t GetN() const;
 
     /**
-     * \brief Get the i-th Ptr<EnergyHarvester> stored in this container.
+     * @brief Get the i-th Ptr<EnergyHarvester> stored in this container.
      *
-     * \param i Index of the requested Ptr<EnergyHarvester>.
-     * \returns The requested Ptr<EnergyHarvester>.
+     * @param i Index of the requested Ptr<EnergyHarvester>.
+     * @returns The requested Ptr<EnergyHarvester>.
      */
     Ptr<EnergyHarvester> Get(uint32_t i) const;
 
     /**
-     * \param container Another EnergyHarvesterContainer.
+     * @param container Another EnergyHarvesterContainer.
      *
      * Appends the contents of another EnergyHarvesterContainer to the end of
      * this EnergyHarvesterContainer.
@@ -148,22 +148,22 @@
     void Add(EnergyHarvesterContainer container);
 
     /**
-     * \brief Append a single Ptr<EnergyHarvester> to the end of this container.
+     * @brief Append a single Ptr<EnergyHarvester> to the end of this container.
      *
-     * \param harvester Pointer to an EnergyHarvester.
+     * @param harvester Pointer to an EnergyHarvester.
      */
     void Add(Ptr<EnergyHarvester> harvester);
 
     /**
-     * \brief Append a single Ptr<EnergyHarvester> referred to by its object
+     * @brief Append a single Ptr<EnergyHarvester> referred to by its object
      * name to the end of this container.
      *
-     * \param harvesterName Name of EnergyHarvester object.
+     * @param harvesterName Name of EnergyHarvester object.
      */
     void Add(std::string harvesterName);
 
     /**
-     * \brief Removes all elements in the container.
+     * @brief Removes all elements in the container.
      */
     void Clear();
 
@@ -171,7 +171,7 @@
     void DoDispose() override;
 
     /**
-     * \brief Calls Object::Initialize () for all EnergySource objects.
+     * @brief Calls Object::Initialize () for all EnergySource objects.
      */
     void DoInitialize() override;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/energy/helper/energy-harvester-helper.h ns-3.44/src/energy/helper/energy-harvester-helper.h
--- ns-3.43/src/energy/helper/energy-harvester-helper.h	2024-10-09 16:41:09.872655900 -0700
+++ ns-3.44/src/energy/helper/energy-harvester-helper.h	2025-03-09 16:55:49.375371000 -0700
@@ -24,8 +24,8 @@
 {
 
 /**
- * \ingroup energy
- * \brief Creates EnergyHarvester objects.
+ * @ingroup energy
+ * @brief Creates EnergyHarvester objects.
  *
  * This class creates and installs energy harvesters onto network nodes.
  *
@@ -36,32 +36,32 @@
     virtual ~EnergyHarvesterHelper();
 
     /**
-     * \param name Name of attribute to set.
-     * \param v Value of the attribute.
+     * @param name Name of attribute to set.
+     * @param v Value of the attribute.
      *
      * Sets one of the attributes of underlying EnergyHarvester.
      */
     virtual void Set(std::string name, const AttributeValue& v) = 0;
 
     /**
-     * \param source Pointer to the energy source where EnergyHarvester will be installed.
-     * \returns An EnergyHarvesterContainer which contains all the EnergyHarvesters.
+     * @param source Pointer to the energy source where EnergyHarvester will be installed.
+     * @returns An EnergyHarvesterContainer which contains all the EnergyHarvesters.
      *
      * This function installs an EnergyHarvester onto an energy source.
      */
     energy::EnergyHarvesterContainer Install(Ptr<energy::EnergySource> source) const;
 
     /**
-     * \param sourceContainer List of nodes where EnergyHarvester will be installed.
-     * \returns An EnergyHarvesterContainer which contains all the EnergyHarvester.
+     * @param sourceContainer List of nodes where EnergyHarvester will be installed.
+     * @returns An EnergyHarvesterContainer which contains all the EnergyHarvester.
      *
      * This function installs an EnergyHarvester onto a list of energy sources.
      */
     energy::EnergyHarvesterContainer Install(energy::EnergySourceContainer sourceContainer) const;
 
     /**
-     * \param sourceName Name of node where EnergyHarvester will be installed.
-     * \returns An EnergyHarvesterContainer which contains all the EnergyHarvesters.
+     * @param sourceName Name of node where EnergyHarvester will be installed.
+     * @returns An EnergyHarvesterContainer which contains all the EnergyHarvesters.
      *
      * This function installs an EnergyHarvester onto a node.
      */
@@ -69,8 +69,8 @@
 
   private:
     /**
-     * \param source Pointer to node where the energy harvester is to be installed.
-     * \returns Pointer to the created EnergyHarvester.
+     * @param source Pointer to node where the energy harvester is to be installed.
+     * @returns Pointer to the created EnergyHarvester.
      *
      * Child classes of EnergyHarvesterHelper only have to implement this function,
      * to create and aggregate an EnergyHarvester object onto a single node. Rest of
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/energy/helper/energy-model-helper.h ns-3.44/src/energy/helper/energy-model-helper.h
--- ns-3.43/src/energy/helper/energy-model-helper.h	2024-10-09 16:41:09.872655900 -0700
+++ ns-3.44/src/energy/helper/energy-model-helper.h	2025-03-09 16:55:49.375371000 -0700
@@ -25,8 +25,8 @@
 {
 
 /**
- * \ingroup energy
- * \brief Creates EnergySource objects.
+ * @ingroup energy
+ * @brief Creates EnergySource objects.
  *
  * This class creates and installs an energy source onto network nodes.
  * Multiple sources can exist on a network node.
@@ -38,48 +38,48 @@
     virtual ~EnergySourceHelper();
 
     /**
-     * \param name Name of attribute to set.
-     * \param v Value of the attribute.
+     * @param name Name of attribute to set.
+     * @param v Value of the attribute.
      *
      * Sets one of the attributes of underlying EnergySource.
      */
     virtual void Set(std::string name, const AttributeValue& v) = 0;
 
     /**
-     * \param node Pointer to the node where EnergySource will be installed.
-     * \returns An EnergySourceContainer which contains all the EnergySources.
+     * @param node Pointer to the node where EnergySource will be installed.
+     * @returns An EnergySourceContainer which contains all the EnergySources.
      *
      * This function installs an EnergySource onto a node.
      */
     energy::EnergySourceContainer Install(Ptr<Node> node) const;
 
     /**
-     * \param c List of nodes where EnergySource will be installed.
-     * \returns An EnergySourceContainer which contains all the EnergySources.
+     * @param c List of nodes where EnergySource will be installed.
+     * @returns An EnergySourceContainer which contains all the EnergySources.
      *
      * This function installs an EnergySource onto a list of nodes.
      */
     energy::EnergySourceContainer Install(NodeContainer c) const;
 
     /**
-     * \param nodeName Name of node where EnergySource will be installed.
-     * \returns An EnergySourceContainer which contains all the EnergySources.
+     * @param nodeName Name of node where EnergySource will be installed.
+     * @returns An EnergySourceContainer which contains all the EnergySources.
      *
      * This function installs an EnergySource onto a node.
      */
     energy::EnergySourceContainer Install(std::string nodeName) const;
 
     /**
-     * \brief This function installs an EnergySource on all nodes in simulation.
+     * @brief This function installs an EnergySource on all nodes in simulation.
      *
-     * \returns An EnergySourceContainer which contains all the EnergySources.
+     * @returns An EnergySourceContainer which contains all the EnergySources.
      */
     energy::EnergySourceContainer InstallAll() const;
 
   private:
     /**
-     * \param node Pointer to node where the energy source is to be installed.
-     * \returns Pointer to the created EnergySource.
+     * @param node Pointer to node where the energy source is to be installed.
+     * @returns Pointer to the created EnergySource.
      *
      * Child classes of EnergySourceHelper only have to implement this function,
      * to create and aggregate an EnergySource object onto a single node. Rest of
@@ -90,8 +90,8 @@
 };
 
 /**
- * \ingroup energy
- * \brief Creates DeviceEnergyModel objects.
+ * @ingroup energy
+ * @brief Creates DeviceEnergyModel objects.
  *
  * This class helps to create and install DeviceEnergyModel onto NetDevice. A
  * DeviceEnergyModel is connected to a NetDevice (or PHY object) by callbacks.
@@ -106,17 +106,17 @@
     virtual ~DeviceEnergyModelHelper();
 
     /**
-     * \param name Name of attribute to set.
-     * \param v Value of the attribute.
+     * @param name Name of attribute to set.
+     * @param v Value of the attribute.
      *
      * Sets one of the attributes of underlying DeviceEnergyModel.
      */
     virtual void Set(std::string name, const AttributeValue& v) = 0;
 
     /**
-     * \param device Pointer to the NetDevice to install DeviceEnergyModel.
-     * \param source The EnergySource the DeviceEnergyModel will be using.
-     * \returns An DeviceEnergyModelContainer contains all the DeviceEnergyModels.
+     * @param device Pointer to the NetDevice to install DeviceEnergyModel.
+     * @param source The EnergySource the DeviceEnergyModel will be using.
+     * @returns An DeviceEnergyModelContainer contains all the DeviceEnergyModels.
      *
      * Installs an DeviceEnergyModel with a specified EnergySource onto a
      * xNetDevice.
@@ -125,11 +125,11 @@
                                                Ptr<energy::EnergySource> source) const;
 
     /**
-     * \param deviceContainer List of NetDevices to be install DeviceEnergyModel
+     * @param deviceContainer List of NetDevices to be install DeviceEnergyModel
      * objects.
-     * \param sourceContainer List of EnergySource the DeviceEnergyModel will be
+     * @param sourceContainer List of EnergySource the DeviceEnergyModel will be
      * using.
-     * \returns An DeviceEnergyModelContainer contains all the DeviceEnergyModels.
+     * @returns An DeviceEnergyModelContainer contains all the DeviceEnergyModels.
      *
      * Installs DeviceEnergyModels with specified EnergySources onto a list of
      * NetDevices.
@@ -139,9 +139,9 @@
 
   private:
     /**
-     * \param device The net device corresponding to DeviceEnergyModel object.
-     * \param source The EnergySource the DeviceEnergyModel will be using.
-     * \returns Pointer to the created DeviceEnergyModel.
+     * @param device The net device corresponding to DeviceEnergyModel object.
+     * @param source The EnergySource the DeviceEnergyModel will be using.
+     * @returns Pointer to the created DeviceEnergyModel.
      *
      * Child classes of DeviceEnergyModelHelper only have to implement this
      * function, to create and aggregate an DeviceEnergyModel object onto a single
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/energy/helper/energy-source-container.h ns-3.44/src/energy/helper/energy-source-container.h
--- ns-3.43/src/energy/helper/energy-source-container.h	2024-10-09 16:41:09.872655900 -0700
+++ ns-3.44/src/energy/helper/energy-source-container.h	2025-03-09 16:55:49.375371000 -0700
@@ -23,14 +23,14 @@
 {
 
 /**
- * \ingroup energy
- * \brief Holds a vector of ns3::EnergySource pointers.
+ * @ingroup energy
+ * @brief Holds a vector of ns3::EnergySource pointers.
  *
  * EnergySourceHelper returns a list of EnergySource pointers installed onto a
  * node. Users can use this list to access EnergySource objects to obtain total
  * energy consumption on a node easily.
  *
- * \see NetDeviceContainer
+ * @see NetDeviceContainer
  *
  */
 class EnergySourceContainer : public Object
@@ -41,8 +41,8 @@
 
   public:
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
     /**
@@ -52,7 +52,7 @@
     ~EnergySourceContainer() override;
 
     /**
-     * \param source Pointer to an EnergySource.
+     * @param source Pointer to an EnergySource.
      *
      * Creates an EnergySourceContainer with exactly one EnergySource previously
      * instantiated.
@@ -60,7 +60,7 @@
     EnergySourceContainer(Ptr<EnergySource> source);
 
     /**
-     * \param sourceName Name of EnergySource.
+     * @param sourceName Name of EnergySource.
      *
      * Creates an EnergySourceContainer with exactly one EnergySource previously
      * instantiated and assigned a name using the Object name service. This
@@ -69,76 +69,76 @@
     EnergySourceContainer(std::string sourceName);
 
     /**
-     * \param a A EnergySourceContainer.
-     * \param b Another EnergySourceContainer.
+     * @param a A EnergySourceContainer.
+     * @param b Another EnergySourceContainer.
      *
      * Creates an EnergySourceContainer by concatenating EnergySourceContainer b
      * to EnergySourceContainer a.
      *
-     * \note Can be used to concatenate 2 Ptr<EnergySource> directly. C++ will be
+     * @note Can be used to concatenate 2 Ptr<EnergySource> directly. C++ will be
      * calling EnergySourceContainer constructor with Ptr<EnergySource> first.
      */
     EnergySourceContainer(const EnergySourceContainer& a, const EnergySourceContainer& b);
 
     /**
-     * \brief Get an iterator which refers to the first EnergySource pointer in
+     * @brief Get an iterator which refers to the first EnergySource pointer in
      * the container.
      *
-     * \returns An iterator which refers to the first EnergySource in container.
+     * @returns An iterator which refers to the first EnergySource in container.
      *
      * EnergySources can be retrieved from the container in two ways. First,
      * directly by an index into the container, and second, using an iterator.
      * This method is used in the iterator method and is typically used in a
      * for-loop to run through the EnergySources.
      *
-     * \code
+     * @code
      *   EnergySourceContainer::Iterator i;
      *   for (i = container.Begin (); i != container.End (); ++i)
      *     {
      *       (*i)->method ();  // some EnergySource method
      *     }
-     * \endcode
+     * @endcode
      */
     Iterator Begin() const;
 
     /**
-     * \brief Get an iterator which refers to the last EnergySource pointer in
+     * @brief Get an iterator which refers to the last EnergySource pointer in
      * the container.
      *
-     * \returns An iterator which refers to the last EnergySource in container.
+     * @returns An iterator which refers to the last EnergySource in container.
      *
      * EnergySources can be retrieved from the container in two ways. First,
      * directly by an index into the container, and second, using an iterator.
      * This method is used in the iterator method and is typically used in a
      * for-loop to run through the EnergySources.
      *
-     * \code
+     * @code
      *   EnergySourceContainer::Iterator i;
      *   for (i = container.Begin (); i != container.End (); ++i)
      *     {
      *       (*i)->method ();  // some EnergySource method
      *     }
-     * \endcode
+     * @endcode
      */
     Iterator End() const;
 
     /**
-     * \brief Get the number of Ptr<EnergySource> stored in this container.
+     * @brief Get the number of Ptr<EnergySource> stored in this container.
      *
-     * \returns The number of Ptr<EnergySource> stored in this container.
+     * @returns The number of Ptr<EnergySource> stored in this container.
      */
     uint32_t GetN() const;
 
     /**
-     * \brief Get the i-th Ptr<EnergySource> stored in this container.
+     * @brief Get the i-th Ptr<EnergySource> stored in this container.
      *
-     * \param i Index of the requested Ptr<EnergySource>.
-     * \returns The requested Ptr<EnergySource>.
+     * @param i Index of the requested Ptr<EnergySource>.
+     * @returns The requested Ptr<EnergySource>.
      */
     Ptr<EnergySource> Get(uint32_t i) const;
 
     /**
-     * \param container Another EnergySourceContainer to append.
+     * @param container Another EnergySourceContainer to append.
      *
      * Appends the contents of another EnergySourceContainer to the end of this
      * EnergySourceContainer.
@@ -146,17 +146,17 @@
     void Add(EnergySourceContainer container);
 
     /**
-     * \brief Append a single Ptr<EnergySource> to the end of this container.
+     * @brief Append a single Ptr<EnergySource> to the end of this container.
      *
-     * \param source Pointer to an EnergySource.
+     * @param source Pointer to an EnergySource.
      */
     void Add(Ptr<EnergySource> source);
 
     /**
-     * \brief Append a single Ptr<EnergySource> referred to by its object name to
+     * @brief Append a single Ptr<EnergySource> referred to by its object name to
      * the end of this container.
      *
-     * \param sourceName Name of EnergySource object.
+     * @param sourceName Name of EnergySource object.
      */
     void Add(std::string sourceName);
 
@@ -164,7 +164,7 @@
     void DoDispose() override;
 
     /**
-     * \brief Calls Object::Start () for all EnergySource objects.
+     * @brief Calls Object::Start () for all EnergySource objects.
      */
     void DoInitialize() override;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/energy/helper/generic-battery-model-helper.h ns-3.44/src/energy/helper/generic-battery-model-helper.h
--- ns-3.43/src/energy/helper/generic-battery-model-helper.h	2024-10-09 16:41:09.872655900 -0700
+++ ns-3.44/src/energy/helper/generic-battery-model-helper.h	2025-03-09 16:55:49.375371000 -0700
@@ -11,15 +11,15 @@
 
 #include "energy-model-helper.h"
 
-#include <ns3/generic-battery-model.h>
-#include <ns3/node.h>
+#include "ns3/generic-battery-model.h"
+#include "ns3/node.h"
 
 namespace ns3
 {
 
 /**
- * \ingroup energy
- * \brief Creates and assign an assortment of BatteryModels to Nodes.
+ * @ingroup energy
+ * @brief Creates and assign an assortment of BatteryModels to Nodes.
  *
  */
 class GenericBatteryModelHelper : public EnergySourceHelper
@@ -31,8 +31,8 @@
     /**
      * Sets one of the attributes of underlying EnergySource.
      *
-     * \param name Name of attribute to set.
-     * \param v Value of the attribute.
+     * @param name Name of attribute to set.
+     * @param v Value of the attribute.
      */
     void Set(std::string name, const AttributeValue& v) override;
 
@@ -41,17 +41,17 @@
      * node container. An energy source (Li-Ion battery) with default values
      * is used on each node.
      *
-     * \param c The node container
-     * \returns An EnergySourceContainer which contains all the EnergySources.
+     * @param c The node container
+     * @returns An EnergySourceContainer which contains all the EnergySources.
      */
     Ptr<energy::EnergySourceContainer> Install(NodeContainer c) const;
 
     /**
      * This function installs an energy source (battery) into a node.
      *
-     * \param node The node object.
-     * \param bm The battery model that will be install to the node.
-     * \returns A pointer to the energy source object used.
+     * @param node The node object.
+     * @param bm The battery model that will be install to the node.
+     * @returns A pointer to the energy source object used.
      */
     Ptr<energy::EnergySource> Install(Ptr<Node> node, energy::BatteryModel bm) const;
 
@@ -59,9 +59,9 @@
      * This function installs energy sources in a group of nodes in a
      * node container.
      *
-     * \param c The node container.
-     * \param bm The battery model that will be install to the nodes in the node container.
-     * \returns An EnergySourceContainer which contains all the EnergySources.
+     * @param c The node container.
+     * @param bm The battery model that will be install to the nodes in the node container.
+     * @returns An EnergySourceContainer which contains all the EnergySources.
      */
     energy::EnergySourceContainer Install(NodeContainer c, energy::BatteryModel bm) const;
 
@@ -71,9 +71,9 @@
      * depends on the connection of the cells defined by the user
      * (number of cells connected in series, number of cells connected in parallel).
      *
-     * \param energySource The energy source used.
-     * \param series The number of cells connected in series.
-     * \param parallel The number of cells connected in parallel.
+     * @param energySource The energy source used.
+     * @param series The number of cells connected in series.
+     * @param parallel The number of cells connected in parallel.
      */
     void SetCellPack(Ptr<energy::EnergySource> energySource,
                      uint8_t series,
@@ -86,9 +86,9 @@
      * depends on the connection of the cells defined by the user
      * (number of cells connected in series, number of cells connected in parallel).
      *
-     * \param energySourceContainer The energy source container used.
-     * \param series The number of cells connected in series.
-     * \param parallel The number of cells connected in parallel.
+     * @param energySourceContainer The energy source container used.
+     * @param series The number of cells connected in series.
+     * @param parallel The number of cells connected in parallel.
      */
     void SetCellPack(energy::EnergySourceContainer energySourceContainer,
                      uint8_t series,
@@ -101,8 +101,8 @@
      * the installation process (eg. installing EnergySource on set of nodes) is
      * implemented in the EnergySourceHelper base class.
      *
-     * \param node Pointer to node where the energy source is to be installed.
-     * \returns Pointer to the created EnergySource.
+     * @param node Pointer to node where the energy source is to be installed.
+     * @returns Pointer to the created EnergySource.
      */
     Ptr<energy::EnergySource> DoInstall(Ptr<Node> node) const override;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/energy/helper/li-ion-energy-source-helper.h ns-3.44/src/energy/helper/li-ion-energy-source-helper.h
--- ns-3.43/src/energy/helper/li-ion-energy-source-helper.h	2024-10-09 16:41:09.872655900 -0700
+++ ns-3.44/src/energy/helper/li-ion-energy-source-helper.h	2025-03-09 16:55:49.375371000 -0700
@@ -19,8 +19,8 @@
 {
 
 /**
- * \ingroup energy
- * \brief Creates a LiIonEnergySource  object.
+ * @ingroup energy
+ * @brief Creates a LiIonEnergySource  object.
  *
  */
 class LiIonEnergySourceHelper : public EnergySourceHelper
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/energy/helper/rv-battery-model-helper.h ns-3.44/src/energy/helper/rv-battery-model-helper.h
--- ns-3.43/src/energy/helper/rv-battery-model-helper.h	2024-10-09 16:41:09.872655900 -0700
+++ ns-3.44/src/energy/helper/rv-battery-model-helper.h	2025-03-09 16:55:49.375371000 -0700
@@ -17,8 +17,8 @@
 {
 
 /**
- * \ingroup energy
- * \brief Creates a RvBatteryModel object.
+ * @ingroup energy
+ * @brief Creates a RvBatteryModel object.
  *
  */
 class RvBatteryModelHelper : public EnergySourceHelper
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/energy/model/basic-energy-harvester.cc ns-3.44/src/energy/model/basic-energy-harvester.cc
--- ns-3.43/src/energy/model/basic-energy-harvester.cc	2024-10-09 16:41:09.872655900 -0700
+++ ns-3.44/src/energy/model/basic-energy-harvester.cc	2025-03-09 16:55:49.375371000 -0700
@@ -36,7 +36,7 @@
             .AddAttribute("PeriodicHarvestedPowerUpdateInterval",
                           "Time between two consecutive periodic updates of the harvested power. "
                           "By default, the value is updated every 1 s",
-                          TimeValue(Seconds(1.0)),
+                          TimeValue(Seconds(1)),
                           MakeTimeAccessor(&BasicEnergyHarvester::SetHarvestedPowerUpdateInterval,
                                            &BasicEnergyHarvester::GetHarvestedPowerUpdateInterval),
                           MakeTimeChecker())
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/energy/model/basic-energy-harvester.h ns-3.44/src/energy/model/basic-energy-harvester.h
--- ns-3.43/src/energy/model/basic-energy-harvester.h	2024-10-09 16:41:09.872655900 -0700
+++ ns-3.44/src/energy/model/basic-energy-harvester.h	2025-03-09 16:55:49.375371000 -0700
@@ -26,7 +26,7 @@
 {
 
 /**
- * \ingroup energy
+ * @ingroup energy
  * BasicEnergyHarvester increases remaining energy stored in an associated
  * Energy Source. The BasicEnergyHarvester implements a simple model in which
  * the amount of power provided by the harvester varies over time according
@@ -40,15 +40,15 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
     BasicEnergyHarvester();
 
     /**
-     * \param updateInterval Energy harvesting update interval.
+     * @param updateInterval Energy harvesting update interval.
      *
      * BasicEnergyHarvester constructor function that sets the interval
      * between each update of the value of the power harvested by this
@@ -59,7 +59,7 @@
     ~BasicEnergyHarvester() override;
 
     /**
-     * \param updateInterval Energy harvesting update interval.
+     * @param updateInterval Energy harvesting update interval.
      *
      * This function sets the interval between each update of the value of the
      * power harvested by this energy harvester.
@@ -67,7 +67,7 @@
     void SetHarvestedPowerUpdateInterval(Time updateInterval);
 
     /**
-     * \returns The interval between each update of the harvested power.
+     * @returns The interval between each update of the harvested power.
      *
      * This function returns the interval between each update of the value of the
      * power harvested by this energy harvester.
@@ -75,8 +75,8 @@
     Time GetHarvestedPowerUpdateInterval() const;
 
     /**
-     * \param stream Random variable stream number.
-     * \returns The number of stream indices assigned by this model.
+     * @param stream Random variable stream number.
+     * @returns The number of stream indices assigned by this model.
      *
      * This function sets the stream number to be used by the random variable that
      * determines the amount of power that can be harvested by this energy harvester.
@@ -96,7 +96,7 @@
     void CalculateHarvestedPower();
 
     /**
-     * \returns m_harvestedPower The power currently provided by the Basic Energy Harvester.
+     * @returns m_harvestedPower The power currently provided by the Basic Energy Harvester.
      * Implements DoGetPower defined in EnergyHarvester.
      */
     double DoGetPower() const override;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/energy/model/basic-energy-source.cc ns-3.44/src/energy/model/basic-energy-source.cc
--- ns-3.43/src/energy/model/basic-energy-source.cc	2024-10-09 16:41:09.872655900 -0700
+++ ns-3.44/src/energy/model/basic-energy-source.cc	2025-03-09 16:55:49.375371000 -0700
@@ -55,7 +55,7 @@
                           MakeDoubleChecker<double>())
             .AddAttribute("PeriodicEnergyUpdateInterval",
                           "Time between two consecutive periodic energy updates.",
-                          TimeValue(Seconds(1.0)),
+                          TimeValue(Seconds(1)),
                           MakeTimeAccessor(&BasicEnergySource::SetEnergyUpdateInterval,
                                            &BasicEnergySource::GetEnergyUpdateInterval),
                           MakeTimeChecker())
@@ -69,7 +69,7 @@
 BasicEnergySource::BasicEnergySource()
 {
     NS_LOG_FUNCTION(this);
-    m_lastUpdateTime = Seconds(0.0);
+    m_lastUpdateTime = Seconds(0);
     m_depleted = false;
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/energy/model/basic-energy-source.h ns-3.44/src/energy/model/basic-energy-source.h
--- ns-3.43/src/energy/model/basic-energy-source.h	2024-10-09 16:41:09.872655900 -0700
+++ ns-3.44/src/energy/model/basic-energy-source.h	2025-03-09 16:55:49.375371000 -0700
@@ -21,7 +21,7 @@
 {
 
 /**
- * \ingroup energy
+ * @ingroup energy
  * BasicEnergySource decreases/increases remaining energy stored in itself in
  * linearly.
  *
@@ -30,36 +30,36 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
     BasicEnergySource();
     ~BasicEnergySource() override;
 
     /**
-     * \return Initial energy stored in energy source, in Joules.
+     * @return Initial energy stored in energy source, in Joules.
      *
      * Implements GetInitialEnergy.
      */
     double GetInitialEnergy() const override;
 
     /**
-     * \returns Supply voltage at the energy source.
+     * @returns Supply voltage at the energy source.
      *
      * Implements GetSupplyVoltage.
      */
     double GetSupplyVoltage() const override;
 
     /**
-     * \return Remaining energy in energy source, in Joules
+     * @return Remaining energy in energy source, in Joules
      *
      * Implements GetRemainingEnergy.
      */
     double GetRemainingEnergy() override;
 
     /**
-     * \returns Energy fraction.
+     * @returns Energy fraction.
      *
      * Implements GetEnergyFraction.
      */
@@ -71,7 +71,7 @@
     void UpdateEnergySource() override;
 
     /**
-     * \param initialEnergyJ Initial energy, in Joules
+     * @param initialEnergyJ Initial energy, in Joules
      *
      * Sets initial energy stored in the energy source. Note that initial energy
      * is assumed to be set before simulation starts and is set only once per
@@ -80,21 +80,21 @@
     void SetInitialEnergy(double initialEnergyJ);
 
     /**
-     * \param supplyVoltageV Supply voltage at the energy source, in Volts.
+     * @param supplyVoltageV Supply voltage at the energy source, in Volts.
      *
      * Sets supply voltage of the energy source.
      */
     void SetSupplyVoltage(double supplyVoltageV);
 
     /**
-     * \param interval Energy update interval.
+     * @param interval Energy update interval.
      *
      * This function sets the interval between each energy update.
      */
     void SetEnergyUpdateInterval(Time interval);
 
     /**
-     * \returns The interval between each energy update.
+     * @returns The interval between each energy update.
      */
     Time GetEnergyUpdateInterval() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/energy/model/device-energy-model-container.h ns-3.44/src/energy/model/device-energy-model-container.h
--- ns-3.43/src/energy/model/device-energy-model-container.h	2024-10-09 16:41:09.872655900 -0700
+++ ns-3.44/src/energy/model/device-energy-model-container.h	2025-03-09 16:55:49.375371000 -0700
@@ -22,14 +22,14 @@
 {
 
 /**
- * \ingroup energy
- * \brief Holds a vector of ns3::DeviceEnergyModel pointers.
+ * @ingroup energy
+ * @brief Holds a vector of ns3::DeviceEnergyModel pointers.
  *
  * DeviceEnergyModelContainer returns a list of DeviceEnergyModel pointers
  * installed on a node. Users can use this list to access DeviceEnergyModel
  * objects to obtain total device energy consumption on a node easily.
  *
- * \see NetDeviceContainer
+ * @see NetDeviceContainer
  *
  */
 class DeviceEnergyModelContainer
@@ -45,7 +45,7 @@
     DeviceEnergyModelContainer();
 
     /**
-     * \param model Pointer to a DeviceEnergyModel.
+     * @param model Pointer to a DeviceEnergyModel.
      *
      * Creates a DeviceEnergyModelContainer with exactly one DeviceEnergyModel
      * previously instantiated.
@@ -53,7 +53,7 @@
     DeviceEnergyModelContainer(Ptr<DeviceEnergyModel> model);
 
     /**
-     * \param modelName Name of DeviceEnergyModel.
+     * @param modelName Name of DeviceEnergyModel.
      *
      * Creates an DeviceEnergyModelContainer with exactly one DeviceEnergyModel
      * previously instantiated and assigned a name using the Object name service.
@@ -62,13 +62,13 @@
     DeviceEnergyModelContainer(std::string modelName);
 
     /**
-     * \param a A DeviceEnergyModelContainer.
-     * \param b Another DeviceEnergyModelContainer.
+     * @param a A DeviceEnergyModelContainer.
+     * @param b Another DeviceEnergyModelContainer.
      *
      * Creates a DeviceEnergyModelContainer by concatenating DeviceEnergyModelContainer b
      * to DeviceEnergyModelContainer a.
      *
-     * \note Can be used to concatenate 2 Ptr<DeviceEnergyModel> directly. C++
+     * @note Can be used to concatenate 2 Ptr<DeviceEnergyModel> directly. C++
      * will be calling DeviceEnergyModelContainer constructor with Ptr<DeviceEnergyModel>
      * first.
      */
@@ -76,64 +76,64 @@
                                const DeviceEnergyModelContainer& b);
 
     /**
-     * \brief Get an iterator which refers to the first DeviceEnergyModel pointer
+     * @brief Get an iterator which refers to the first DeviceEnergyModel pointer
      * in the container.
      *
-     * \returns An iterator which refers to the first DeviceEnergyModel in container.
+     * @returns An iterator which refers to the first DeviceEnergyModel in container.
      *
      * DeviceEnergyModels can be retrieved from the container in two ways. First,
      * directly by an index into the container, and second, using an iterator.
      * This method is used in the iterator method and is typically used in a
      * for-loop to run through the DeviceEnergyModels.
      *
-     * \code
+     * @code
      *   DeviceEnergyModelContainer::Iterator i;
      *   for (i = container.Begin (); i != container.End (); ++i)
      *     {
      *       (*i)->method ();  // some DeviceEnergyModel method
      *     }
-     * \endcode
+     * @endcode
      */
     Iterator Begin() const;
 
     /**
-     * \brief Get an iterator which refers to the last DeviceEnergyModel pointer
+     * @brief Get an iterator which refers to the last DeviceEnergyModel pointer
      * in the container.
      *
-     * \returns An iterator which refers to the last DeviceEnergyModel in container.
+     * @returns An iterator which refers to the last DeviceEnergyModel in container.
      *
      * DeviceEnergyModels can be retrieved from the container in two ways. First,
      * directly by an index into the container, and second, using an iterator.
      * This method is used in the iterator method and is typically used in a
      * for-loop to run through the DeviceEnergyModels.
      *
-     * \code
+     * @code
      *   DeviceEnergyModelContainer::Iterator i;
      *   for (i = container.Begin (); i != container.End (); ++i)
      *     {
      *       (*i)->method ();  // some DeviceEnergyModel method
      *     }
-     * \endcode
+     * @endcode
      */
     Iterator End() const;
 
     /**
-     * \brief Get the number of Ptr<DeviceEnergyModel> stored in this container.
+     * @brief Get the number of Ptr<DeviceEnergyModel> stored in this container.
      *
-     * \returns The number of Ptr<DeviceEnergyModel> stored in this container.
+     * @returns The number of Ptr<DeviceEnergyModel> stored in this container.
      */
     uint32_t GetN() const;
 
     /**
-     * \brief Get the i-th Ptr<DeviceEnergyModel> stored in this container.
+     * @brief Get the i-th Ptr<DeviceEnergyModel> stored in this container.
      *
-     * \param i Index of the requested Ptr<DeviceEnergyModel>.
-     * \returns The requested Ptr<DeviceEnergyModel>.
+     * @param i Index of the requested Ptr<DeviceEnergyModel>.
+     * @returns The requested Ptr<DeviceEnergyModel>.
      */
     Ptr<DeviceEnergyModel> Get(uint32_t i) const;
 
     /**
-     * \param container Another DeviceEnergyModelContainer.
+     * @param container Another DeviceEnergyModelContainer.
      *
      * Appends the contents of another DeviceEnergyModelContainer to the end of
      * this DeviceEnergyModelContainer.
@@ -141,22 +141,22 @@
     void Add(DeviceEnergyModelContainer container);
 
     /**
-     * \brief Append a single Ptr<DeviceEnergyModel> to the end of this container.
+     * @brief Append a single Ptr<DeviceEnergyModel> to the end of this container.
      *
-     * \param model Pointer to an DeviceEnergyModel.
+     * @param model Pointer to an DeviceEnergyModel.
      */
     void Add(Ptr<DeviceEnergyModel> model);
 
     /**
-     * \brief Append a single Ptr<DeviceEnergyModel> referred to by its object
+     * @brief Append a single Ptr<DeviceEnergyModel> referred to by its object
      * name to the end of this container.
      *
-     * \param modelName Name of DeviceEnergyModel object.
+     * @param modelName Name of DeviceEnergyModel object.
      */
     void Add(std::string modelName);
 
     /**
-     * \brief Removes all elements in the container.
+     * @brief Removes all elements in the container.
      */
     void Clear();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/energy/model/device-energy-model.h ns-3.44/src/energy/model/device-energy-model.h
--- ns-3.43/src/energy/model/device-energy-model.h	2024-10-09 16:41:09.872655900 -0700
+++ ns-3.44/src/energy/model/device-energy-model.h	2025-03-09 16:55:49.375371000 -0700
@@ -22,8 +22,8 @@
 class EnergySource;
 
 /**
- * \ingroup energy
- * \brief Base class for device energy models.
+ * @ingroup energy
+ * @brief Base class for device energy models.
  *
  * A device energy model should represent the energy consumption behavior of a
  * specific device. It will update remaining energy stored in the EnergySource
@@ -42,15 +42,15 @@
 
   public:
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
     DeviceEnergyModel();
     ~DeviceEnergyModel() override;
 
     /**
-     * \param source Pointer to energy source installed on node.
+     * @param source Pointer to energy source installed on node.
      *
      * This function sets the pointer to energy source installed on node. Should
      * be called only by DeviceEnergyModel helper classes.
@@ -58,14 +58,14 @@
     virtual void SetEnergySource(Ptr<EnergySource> source) = 0;
 
     /**
-     * \returns Total energy consumption of the device.
+     * @returns Total energy consumption of the device.
      *
      * DeviceEnergyModel records its own energy consumption during simulation.
      */
     virtual double GetTotalEnergyConsumption() const = 0;
 
     /**
-     * \param newState New state the device is in.
+     * @param newState New state the device is in.
      *
      * DeviceEnergyModel is a state based model. This function is implemented by
      * all child of DeviceEnergyModel to change the model's state. States are to
@@ -74,7 +74,7 @@
     virtual void ChangeState(int newState) = 0;
 
     /**
-     * \returns Current draw of the device, in Ampere.
+     * @returns Current draw of the device, in Ampere.
      *
      * This function returns the current draw at the device in its current state.
      * This function is called from the EnergySource to obtain the total current
@@ -102,7 +102,7 @@
 
   private:
     /**
-     * \returns 0.0 as the current value, in Ampere.
+     * @returns 0.0 as the current value, in Ampere.
      *
      * Child class does not have to implement this method if current draw for its
      * states are not know. This default method will always return 0.0A. For the
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/energy/model/energy-harvester.h ns-3.44/src/energy/model/energy-harvester.h
--- ns-3.43/src/energy/model/energy-harvester.h	2024-10-09 16:41:09.872655900 -0700
+++ ns-3.44/src/energy/model/energy-harvester.h	2025-03-09 16:55:49.375371000 -0700
@@ -27,17 +27,17 @@
 class EnergySource;
 
 /**
- * \ingroup energy
+ * @ingroup energy
  *
- * \brief Energy harvester base class.
+ * @brief Energy harvester base class.
  */
 
 class EnergyHarvester : public Object
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
@@ -46,14 +46,14 @@
     ~EnergyHarvester() override;
 
     /**
-     * \brief Sets pointer to node containing this EnergyHarvester.
+     * @brief Sets pointer to node containing this EnergyHarvester.
      *
-     * \param node Pointer to node containing this EnergyHarvester.
+     * @param node Pointer to node containing this EnergyHarvester.
      */
     void SetNode(Ptr<Node> node);
 
     /**
-     * \returns Pointer to node containing this EnergyHarvester.
+     * @returns Pointer to node containing this EnergyHarvester.
      *
      * When a subclass needs to get access to the underlying node base class to
      * print the nodeId for example, it can invoke this method.
@@ -61,7 +61,7 @@
     Ptr<Node> GetNode() const;
 
     /**
-     * \param source Pointer to energy source to which this EnergyHarvester is
+     * @param source Pointer to energy source to which this EnergyHarvester is
      * installed.
      *
      * This function sets the pointer to the energy source connected to the energy
@@ -70,7 +70,7 @@
     void SetEnergySource(Ptr<EnergySource> source);
 
     /**
-     * \returns Pointer to energy source connected to the harvester.
+     * @returns Pointer to energy source connected to the harvester.
      *
      * When a subclass needs to get access to the connected energy source,
      * it can invoke this method.
@@ -78,7 +78,7 @@
     Ptr<EnergySource> GetEnergySource() const;
 
     /**
-     * \returns Amount of power currently provided by the harvester.
+     * @returns Amount of power currently provided by the harvester.
      *
      * This method is called by the energy source connected to the harvester in order
      * to determine the amount of energy that the harvester provided since last update.
@@ -100,7 +100,7 @@
      * This method should be used to connect the logic behind the particular implementation
      * of the energy harvester with the energy source.
      *
-     * \returns Amount of power currently provided by the harvester.
+     * @returns Amount of power currently provided by the harvester.
      */
     virtual double DoGetPower() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/energy/model/energy-source.cc ns-3.44/src/energy/model/energy-source.cc
--- ns-3.43/src/energy/model/energy-source.cc	2024-10-09 16:41:09.872655900 -0700
+++ ns-3.44/src/energy/model/energy-source.cc	2025-03-09 16:55:49.375371000 -0700
@@ -13,7 +13,7 @@
 
 #include "energy-source.h"
 
-#include <ns3/log.h>
+#include "ns3/log.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/energy/model/energy-source.h ns-3.44/src/energy/model/energy-source.h
--- ns-3.43/src/energy/model/energy-source.h	2024-10-09 16:41:09.872655900 -0700
+++ ns-3.44/src/energy/model/energy-source.h	2025-03-09 16:55:49.375371000 -0700
@@ -30,19 +30,19 @@
 class EnergyHarvester;
 
 /**
- * \defgroup energy Energy Models
+ * @defgroup energy Energy Models
  */
 
 /**
- * \ingroup energy
- * \ingroup tests
- * \defgroup energy-tests Energy module tests
+ * @ingroup energy
+ * @ingroup tests
+ * @defgroup energy-tests Energy module tests
  */
 
 /**
- * \ingroup energy
+ * @ingroup energy
  *
- * \brief Energy source base class.
+ * @brief Energy source base class.
  *
  * This is the base class for energy sources. Energy sources keep track of
  * remaining energy. Device energy models will be updating the remaining energy
@@ -77,15 +77,15 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
     EnergySource();
     ~EnergySource() override;
 
     /**
-     * \returns Supply voltage of the energy source.
+     * @returns Supply voltage of the energy source.
      *
      * Set method is to be defined in child class only if necessary. For sources
      * with a fixed supply voltage, set method is not needed.
@@ -93,7 +93,7 @@
     virtual double GetSupplyVoltage() const = 0;
 
     /**
-     * \returns Initial energy (capacity) of the energy source.
+     * @returns Initial energy (capacity) of the energy source.
      *
      * Set method is to be defined in child class only if necessary. For sources
      * with a fixed initial energy (energy capacity), set method is not needed.
@@ -101,12 +101,12 @@
     virtual double GetInitialEnergy() const = 0;
 
     /**
-     * \returns Remaining energy at the energy source.
+     * @returns Remaining energy at the energy source.
      */
     virtual double GetRemainingEnergy() = 0;
 
     /**
-     * \return Energy fraction = remaining energy / initial energy [0, 1]
+     * @return Energy fraction = remaining energy / initial energy [0, 1]
      *
      * This function returns the percentage of energy left in the energy source.
      */
@@ -120,14 +120,14 @@
     virtual void UpdateEnergySource() = 0;
 
     /**
-     * \brief Sets pointer to node containing this EnergySource.
+     * @brief Sets pointer to node containing this EnergySource.
      *
-     * \param node Pointer to node containing this EnergySource.
+     * @param node Pointer to node containing this EnergySource.
      */
     void SetNode(Ptr<Node> node);
 
     /**
-     * \returns Pointer to node containing this EnergySource.
+     * @returns Pointer to node containing this EnergySource.
      *
      * When a subclass needs to get access to the underlying node base class to
      * print the nodeId for example, it can invoke this method.
@@ -135,7 +135,7 @@
     Ptr<Node> GetNode() const;
 
     /**
-     * \param deviceEnergyModelPtr Pointer to device energy model.
+     * @param deviceEnergyModelPtr Pointer to device energy model.
      *
      * This function appends a device energy model to the end of a list of
      * DeviceEnergyModelInfo structs.
@@ -143,14 +143,14 @@
     void AppendDeviceEnergyModel(Ptr<DeviceEnergyModel> deviceEnergyModelPtr);
 
     /**
-     * \param tid TypeId of the DeviceEnergyModel we are searching for.
-     * \returns List of pointers to DeviceEnergyModel objects installed on node.
+     * @param tid TypeId of the DeviceEnergyModel we are searching for.
+     * @returns List of pointers to DeviceEnergyModel objects installed on node.
      */
     DeviceEnergyModelContainer FindDeviceEnergyModels(TypeId tid);
 
     /**
-     * \param name name of the DeviceEnergyModel we are searching for.
-     * \returns List of pointers to DeviceEnergyModel objects installed on node.
+     * @param name name of the DeviceEnergyModel we are searching for.
+     * @returns List of pointers to DeviceEnergyModel objects installed on node.
      */
     DeviceEnergyModelContainer FindDeviceEnergyModels(std::string name);
 
@@ -169,7 +169,7 @@
     void DisposeDeviceModels();
 
     /**
-     * \param energyHarvesterPtr Pointer to energy harvester.
+     * @param energyHarvesterPtr Pointer to energy harvester.
      *
      * This function connect an energy harvester to the energy source. After the
      * execution of this method, the pointer to the energy harvester is appended
@@ -209,7 +209,7 @@
 
   protected:
     /**
-     * \returns Total current draw from all DeviceEnergyModels.
+     * @returns Total current draw from all DeviceEnergyModels.
      */
     double CalculateTotalCurrent();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/energy/model/generic-battery-model.cc ns-3.44/src/energy/model/generic-battery-model.cc
--- ns-3.43/src/energy/model/generic-battery-model.cc	2024-10-09 16:41:09.872655900 -0700
+++ ns-3.44/src/energy/model/generic-battery-model.cc	2025-03-09 16:55:49.375371000 -0700
@@ -11,11 +11,11 @@
 
 #include "generic-battery-model.h"
 
-#include <ns3/assert.h>
-#include <ns3/double.h>
-#include <ns3/log.h>
-#include <ns3/simulator.h>
-#include <ns3/trace-source-accessor.h>
+#include "ns3/assert.h"
+#include "ns3/double.h"
+#include "ns3/log.h"
+#include "ns3/simulator.h"
+#include "ns3/trace-source-accessor.h"
 
 #include <cmath>
 
@@ -88,7 +88,7 @@
                           MakeDoubleChecker<double>())
             .AddAttribute("PeriodicEnergyUpdateInterval",
                           "Time between two consecutive periodic energy updates.",
-                          TimeValue(Seconds(1.0)),
+                          TimeValue(Seconds(1)),
                           MakeTimeAccessor(&GenericBatteryModel::SetEnergyUpdateInterval,
                                            &GenericBatteryModel::GetEnergyUpdateInterval),
                           MakeTimeChecker())
@@ -114,7 +114,7 @@
       m_currentFiltered(0),
       m_entn(0),
       m_expZone(0),
-      m_lastUpdateTime(Seconds(0.0))
+      m_lastUpdateTime()
 {
     NS_LOG_FUNCTION(this);
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/energy/model/generic-battery-model.h ns-3.44/src/energy/model/generic-battery-model.h
--- ns-3.43/src/energy/model/generic-battery-model.h	2024-10-09 16:41:09.872655900 -0700
+++ ns-3.44/src/energy/model/generic-battery-model.h	2025-03-09 16:55:49.375371000 -0700
@@ -14,9 +14,9 @@
 
 #include "energy-source.h"
 
-#include <ns3/event-id.h>
-#include <ns3/nstime.h>
-#include <ns3/traced-value.h>
+#include "ns3/event-id.h"
+#include "ns3/nstime.h"
+#include "ns3/traced-value.h"
 
 namespace ns3
 {
@@ -24,7 +24,7 @@
 {
 
 /**
- * \ingroup energy
+ * @ingroup energy
  *
  *  Battery types.
  *  These are grouped according to their chemical characteristics
@@ -38,7 +38,7 @@
 };
 
 /**
- * \ingroup energy
+ * @ingroup energy
  *
  *  Battery models that described the parameters of the the battery presets.
  */
@@ -52,7 +52,7 @@
 };
 
 /**
- * \ingroup energy
+ * @ingroup energy
  *
  *  The structure containing the the parameter values that describe a
  *  battery preset.
@@ -73,7 +73,7 @@
 };
 
 /**
- * \ingroup energy
+ * @ingroup energy
  *
  *  Contains the values that form the battery presents available in this module.
  */
@@ -134,8 +134,8 @@
                                             0.8}};
 
 /**
- * \ingroup energy
- * \brief A generic battery model for  Li-Ion, NiCd, NiMh and Lead acid batteries
+ * @ingroup energy
+ * @brief A generic battery model for  Li-Ion, NiCd, NiMh and Lead acid batteries
  *
  * The generic battery model can be used to describe the discharge behavior of
  * the battery chemestries supported by the model.
@@ -144,8 +144,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
@@ -159,21 +159,21 @@
      * in the battery. This is because the battery cannot be used until Voltage = 0, only until
      * it reaches the cutoff voltage.
      *
-     * \return The initial energy stored in the fully charged battery, in Joules.
+     * @return The initial energy stored in the fully charged battery, in Joules.
      */
     double GetInitialEnergy() const override;
 
     /**
      * Implements GetSupplyVoltage.
      *
-     * \return Supply voltage at the energy source.
+     * @return Supply voltage at the energy source.
      */
     double GetSupplyVoltage() const override;
 
     /**
      * Implements GetRemainingEnergy.
      *
-     * \return Remaining energy in energy source, in Joules
+     * @return Remaining energy in energy source, in Joules
      */
     double GetRemainingEnergy() override;
 
@@ -181,7 +181,7 @@
      * Implements GetEnergyFraction. For the generic battery model, energy fraction
      * is equivalent to the remaining usable capacity (i.e. The SoC).
      *
-     * \return Energy fraction.
+     * @return Energy fraction.
      */
     double GetEnergyFraction() override;
 
@@ -193,7 +193,7 @@
     /**
      * This function sets the interval between each energy update.
      *
-     * \param interval Energy update interval.
+     * @param interval Energy update interval.
      */
     void SetEnergyUpdateInterval(Time interval);
 
@@ -203,7 +203,7 @@
      *  be set to a value bigger than the rated capacity (fully discharged) or
      *  less than 0 (fully charged).
      *
-     *  \param drainedCapacity The capacity drained so far in the battery.
+     *  @param drainedCapacity The capacity drained so far in the battery.
      */
     void SetDrainedCapacity(double drainedCapacity);
 
@@ -211,7 +211,7 @@
      * Obtain the amount of drained capacity from the battery based on the
      * integral of the current over time (Coulomb counting method).
      *
-     * \return The drainedCapacity (Ah)
+     * @return The drainedCapacity (Ah)
      */
     double GetDrainedCapacity() const;
 
@@ -219,12 +219,12 @@
      *  Calculates an estimate of the State of Charge (SoC).
      *  In essence, the amount of usable capacity remaining in the battery (%).
      *
-     *  \return The percentage of usable capacity remaining in the battery.
+     *  @return The percentage of usable capacity remaining in the battery.
      */
     double GetStateOfCharge() const;
 
     /**
-     * \return The interval between each energy update.
+     * @return The interval between each energy update.
      */
     Time GetEnergyUpdateInterval() const;
 
@@ -261,16 +261,16 @@
      *  It consider different discharge curves for different discharge currents
      *  and the remaining energy of the battery.
      *
-     *  \param current The actual discharge current value (+i).
-     *  \return The voltage of the battery.
+     *  @param current The actual discharge current value (+i).
+     *  @return The voltage of the battery.
      */
     double GetVoltage(double current);
 
     /**
      *  Obtain the battery voltage as a result of a charge current.
      *
-     *  \param current The actual charge current value (-i).
-     *  \return The voltage of the battery.
+     *  @param current The actual charge current value (-i).
+     *  @return The voltage of the battery.
      */
     double GetChargeVoltage(double current);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/energy/model/li-ion-energy-source.cc ns-3.44/src/energy/model/li-ion-energy-source.cc
--- ns-3.43/src/energy/model/li-ion-energy-source.cc	2024-10-09 16:41:09.872655900 -0700
+++ ns-3.44/src/energy/model/li-ion-energy-source.cc	2025-03-09 16:55:49.375371000 -0700
@@ -92,7 +92,7 @@
                           MakeDoubleChecker<double>())
             .AddAttribute("PeriodicEnergyUpdateInterval",
                           "Time between two consecutive periodic energy updates.",
-                          TimeValue(Seconds(1.0)),
+                          TimeValue(Seconds(1)),
                           MakeTimeAccessor(&LiIonEnergySource::SetEnergyUpdateInterval,
                                            &LiIonEnergySource::GetEnergyUpdateInterval),
                           MakeTimeChecker())
@@ -105,7 +105,7 @@
 
 LiIonEnergySource::LiIonEnergySource()
     : m_drainedCapacity(0.0),
-      m_lastUpdateTime(Seconds(0.0))
+      m_lastUpdateTime()
 {
     NS_LOG_FUNCTION(this);
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/energy/model/li-ion-energy-source.h ns-3.44/src/energy/model/li-ion-energy-source.h
--- ns-3.43/src/energy/model/li-ion-energy-source.h	2024-10-09 16:41:09.872655900 -0700
+++ ns-3.44/src/energy/model/li-ion-energy-source.h	2025-03-09 16:55:49.375371000 -0700
@@ -22,8 +22,8 @@
 {
 
 /**
- * \ingroup energy
- * \brief Model a generic Lithium Ion Battery basing on [1][2].
+ * @ingroup energy
+ * @brief Model a generic Lithium Ion Battery basing on [1][2].
  *
  * The model can be fitted to any type of Li-Ion Battery, simply changing the
  * model parameters.
@@ -74,22 +74,22 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
     LiIonEnergySource();
     ~LiIonEnergySource() override;
 
     /**
-     * \return Initial energy stored in energy source, in Joules.
+     * @return Initial energy stored in energy source, in Joules.
      *
      * Implements GetInitialEnergy.
      */
     double GetInitialEnergy() const override;
 
     /**
-     * \param initialEnergyJ Initial energy, in Joules
+     * @param initialEnergyJ Initial energy, in Joules
      *
      * Implements SetInitialEnergy. Note that initial energy is assumed to be set
      * before simulation starts and is set only once per simulation.
@@ -97,14 +97,14 @@
     void SetInitialEnergy(double initialEnergyJ);
 
     /**
-     * \returns Supply voltage at the energy source.
+     * @returns Supply voltage at the energy source.
      *
      * Implements GetSupplyVoltage.
      */
     double GetSupplyVoltage() const override;
 
     /**
-     * \param supplyVoltageV Initial Supply voltage at the energy source, in Volts.
+     * @param supplyVoltageV Initial Supply voltage at the energy source, in Volts.
      *
      * Sets the initial supply voltage of the energy source.
      * To be called only once.
@@ -112,21 +112,21 @@
     void SetInitialSupplyVoltage(double supplyVoltageV);
 
     /**
-     * \return Remaining energy in energy source, in Joules
+     * @return Remaining energy in energy source, in Joules
      *
      * Implements GetRemainingEnergy.
      */
     double GetRemainingEnergy() override;
 
     /**
-     * \returns Energy fraction.
+     * @returns Energy fraction.
      *
      * Implements GetEnergyFraction.
      */
     double GetEnergyFraction() override;
 
     /**
-     * \param energyJ Amount of energy (in Joules) to decrease from energy source.
+     * @param energyJ Amount of energy (in Joules) to decrease from energy source.
      *
      * Implements DecreaseRemainingEnergy.
      */
@@ -134,7 +134,7 @@
     virtual void DecreaseRemainingEnergy(double energyJ);
 
     /**
-     * \param energyJ Amount of energy (in Joules) to increase from energy source.
+     * @param energyJ Amount of energy (in Joules) to increase from energy source.
      *
      * Implements IncreaseRemainingEnergy.
      */
@@ -147,14 +147,14 @@
     void UpdateEnergySource() override;
 
     /**
-     * \param interval Energy update interval.
+     * @param interval Energy update interval.
      *
      * This function sets the interval between each energy update.
      */
     void SetEnergyUpdateInterval(Time interval);
 
     /**
-     * \returns The interval between each energy update.
+     * @returns The interval between each energy update.
      */
     Time GetEnergyUpdateInterval() const;
 
@@ -184,8 +184,8 @@
      * It consider different discharge curves for different discharge currents
      * and the remaining energy of the cell.
      *
-     * \param current the actual discharge current value.
-     * \return the cell voltage
+     * @param current the actual discharge current value.
+     * @return the cell voltage
      */
     double GetVoltage(double current) const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/energy/model/rv-battery-model.cc ns-3.44/src/energy/model/rv-battery-model.cc
--- ns-3.43/src/energy/model/rv-battery-model.cc	2024-10-09 16:41:09.872655900 -0700
+++ ns-3.44/src/energy/model/rv-battery-model.cc	2025-03-09 16:55:49.375371000 -0700
@@ -35,7 +35,7 @@
             .AddConstructor<RvBatteryModel>()
             .AddAttribute("RvBatteryModelPeriodicEnergyUpdateInterval",
                           "RV battery model sampling interval.",
-                          TimeValue(Seconds(1.0)),
+                          TimeValue(Seconds(1)),
                           MakeTimeAccessor(&RvBatteryModel::SetSamplingInterval,
                                            &RvBatteryModel::GetSamplingInterval),
                           MakeTimeChecker())
@@ -90,7 +90,7 @@
     m_timeStamps.push_back(m_lastSampleTime);
     m_previousLoad = -1.0;
     m_batteryLevel = 1; // fully charged
-    m_lifetime = Seconds(0.0);
+    m_lifetime = Seconds(0);
 }
 
 RvBatteryModel::~RvBatteryModel()
@@ -336,7 +336,7 @@
     if (m_timeStamps.size() == 1)
     {
         // constant load
-        calculatedAlpha = m_load[0] * RvModelAFunction(t, t, Seconds(0.0), m_beta);
+        calculatedAlpha = m_load[0] * RvModelAFunction(t, t, Seconds(0), m_beta);
     }
     else
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/energy/model/rv-battery-model.h ns-3.44/src/energy/model/rv-battery-model.h
--- ns-3.43/src/energy/model/rv-battery-model.h	2024-10-09 16:41:09.872655900 -0700
+++ ns-3.44/src/energy/model/rv-battery-model.h	2025-03-09 16:55:49.375371000 -0700
@@ -21,8 +21,8 @@
 {
 
 /**
- * \ingroup energy
- * \brief Rakhmatov Vrudhula non-linear battery model.
+ * @ingroup energy
+ * @brief Rakhmatov Vrudhula non-linear battery model.
  *
  * This (energy source) model implements an analytical non-linear battery model.
  * It is capable of capturing load capacity and recovery effects of batteries.
@@ -43,36 +43,36 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
     RvBatteryModel();
     ~RvBatteryModel() override;
 
     /**
-     * \return Initial energy stored (theoretical capacity) in the battery, in Joules.
+     * @return Initial energy stored (theoretical capacity) in the battery, in Joules.
      *
      * Implements GetInitialEnergy.
      */
     double GetInitialEnergy() const override;
 
     /**
-     * \returns Supply voltage at the energy source.
+     * @returns Supply voltage at the energy source.
      *
      * Implements GetSupplyVoltage.
      */
     double GetSupplyVoltage() const override;
 
     /**
-     * \return Remaining energy in energy source, in Joules
+     * @return Remaining energy in energy source, in Joules
      *
      * Implements GetRemainingEnergy.
      */
     double GetRemainingEnergy() override;
 
     /**
-     * \returns Energy fraction.
+     * @returns Energy fraction.
      *
      * Implements GetEnergyFraction. For the RV battery model, energy fraction is
      * equivalent to battery level.
@@ -86,85 +86,85 @@
     void UpdateEnergySource() override;
 
     /**
-     * \param interval Energy update interval.
+     * @param interval Energy update interval.
      *
      * This function sets the interval between each energy update.
      */
     void SetSamplingInterval(Time interval);
 
     /**
-     * \returns The interval between each energy update.
+     * @returns The interval between each energy update.
      */
     Time GetSamplingInterval() const;
 
     /**
-     * \brief Sets open circuit voltage of battery.
+     * @brief Sets open circuit voltage of battery.
      *
-     * \param voltage Open circuit voltage.
+     * @param voltage Open circuit voltage.
      */
     void SetOpenCircuitVoltage(double voltage);
 
     /**
-     * \return Open circuit voltage of battery.
+     * @return Open circuit voltage of battery.
      */
     double GetOpenCircuitVoltage() const;
 
     /**
-     * \brief Sets cutoff voltage of battery.
+     * @brief Sets cutoff voltage of battery.
      *
-     * \param voltage Cutoff voltage.
+     * @param voltage Cutoff voltage.
      */
     void SetCutoffVoltage(double voltage);
 
     /**
-     * \returns Cutoff voltage of battery.
+     * @returns Cutoff voltage of battery.
      */
     double GetCutoffVoltage() const;
 
     /**
-     * \brief Sets the alpha value for the battery model.
+     * @brief Sets the alpha value for the battery model.
      *
-     * \param alpha Alpha.
+     * @param alpha Alpha.
      */
     void SetAlpha(double alpha);
 
     /**
-     * \returns The alpha value used by the battery model.
+     * @returns The alpha value used by the battery model.
      */
     double GetAlpha() const;
 
     /**
-     * \brief Sets the beta value for the battery model.
+     * @brief Sets the beta value for the battery model.
      *
-     * \param beta Beta.
+     * @param beta Beta.
      */
     void SetBeta(double beta);
 
     /**
-     * \returns The beta value used by the battery model.
+     * @returns The beta value used by the battery model.
      */
     double GetBeta() const;
 
     /**
-     * \returns Battery level [0, 1].
+     * @returns Battery level [0, 1].
      */
     double GetBatteryLevel();
 
     /**
-     * \returns Lifetime of the battery.
+     * @returns Lifetime of the battery.
      */
     Time GetLifetime() const;
 
     /**
-     * \brief Sets the number of terms of the infinite sum for estimating battery
+     * @brief Sets the number of terms of the infinite sum for estimating battery
      * level.
      *
-     * \param num Number of terms.
+     * @param num Number of terms.
      */
     void SetNumOfTerms(int num);
 
     /**
-     * \returns The number of terms of the infinite sum for estimating battery
+     * @returns The number of terms of the infinite sum for estimating battery
      * level.
      */
     int GetNumOfTerms() const;
@@ -184,11 +184,11 @@
     void HandleEnergyDrainedEvent();
 
     /**
-     * \brief Discharges the battery.
+     * @brief Discharges the battery.
      *
-     * \param load Load value (total current form devices, in mA).
-     * \param t Time stamp of the load value.
-     * \returns Calculated alpha value.
+     * @param load Load value (total current form devices, in mA).
+     * @param t Time stamp of the load value.
+     * @returns Calculated alpha value.
      *
      * Discharge function calculates a value which is then compared to the alpha
      * value to determine if the battery is dead. It will also update the battery
@@ -199,13 +199,13 @@
     double Discharge(double load, Time t);
 
     /**
-     * \brief RV model A function.
+     * @brief RV model A function.
      *
-     * \param t Current time.
-     * \param sk Time stamp in array position k
-     * \param sk_1 Time stamp in array position k-1
-     * \param beta Beta value used by the battery model.
-     * \returns Result of A function.
+     * @param t Current time.
+     * @param sk Time stamp in array position k
+     * @param sk_1 Time stamp in array position k-1
+     * @param beta Beta value used by the battery model.
+     * @returns Result of A function.
      *
      * This function computes alpha value using the recorded load profile.
      */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/energy/model/simple-device-energy-model.cc ns-3.44/src/energy/model/simple-device-energy-model.cc
--- ns-3.43/src/energy/model/simple-device-energy-model.cc	2024-10-09 16:41:09.872655900 -0700
+++ ns-3.44/src/energy/model/simple-device-energy-model.cc	2025-03-09 16:55:49.375371000 -0700
@@ -41,7 +41,7 @@
 SimpleDeviceEnergyModel::SimpleDeviceEnergyModel()
 {
     NS_LOG_FUNCTION(this);
-    m_lastUpdateTime = Seconds(0.0);
+    m_lastUpdateTime = Seconds(0);
     m_actualCurrentA = 0.0;
     m_source = nullptr;
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/energy/model/simple-device-energy-model.h ns-3.44/src/energy/model/simple-device-energy-model.h
--- ns-3.43/src/energy/model/simple-device-energy-model.h	2024-10-09 16:41:09.872655900 -0700
+++ ns-3.44/src/energy/model/simple-device-energy-model.h	2025-03-09 16:55:49.375371000 -0700
@@ -20,7 +20,7 @@
 {
 
 /**
- * \ingroup energy
+ * @ingroup energy
  *
  * A simple device energy model where current drain can be set by the user.
  *
@@ -31,49 +31,49 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
     SimpleDeviceEnergyModel();
     ~SimpleDeviceEnergyModel() override;
 
     /**
-     * \brief Sets pointer to node.
+     * @brief Sets pointer to node.
      *
-     * \param node Pointer to node.
+     * @param node Pointer to node.
      *
      * Implements DeviceEnergyModel::SetNode.
      */
     virtual void SetNode(Ptr<Node> node);
 
     /**
-     * \brief Gets pointer to node.
+     * @brief Gets pointer to node.
      *
-     * \returns Pointer to node.
+     * @returns Pointer to node.
      *
      * Implements DeviceEnergyModel::GetNode.
      */
     virtual Ptr<Node> GetNode() const;
 
     /**
-     * \brief Sets pointer to EnergySource installed on node.
+     * @brief Sets pointer to EnergySource installed on node.
      *
-     * \param source Pointer to EnergySource installed on node.
+     * @param source Pointer to EnergySource installed on node.
      *
      * Implements DeviceEnergyModel::SetEnergySource.
      */
     void SetEnergySource(Ptr<EnergySource> source) override;
 
     /**
-     * \returns Total energy consumption of the vehicle.
+     * @returns Total energy consumption of the vehicle.
      *
      * Implements DeviceEnergyModel::GetTotalEnergyConsumption.
      */
     double GetTotalEnergyConsumption() const override;
 
     /**
-     * \param newState New state the device is in.
+     * @param newState New state the device is in.
      *
      * Not implemented
      */
@@ -82,7 +82,7 @@
     }
 
     /**
-     * \brief Handles energy depletion.
+     * @brief Handles energy depletion.
      *
      * Not implemented
      */
@@ -91,7 +91,7 @@
     }
 
     /**
-     * \brief Handles energy recharged.
+     * @brief Handles energy recharged.
      *
      * Not implemented
      */
@@ -100,7 +100,7 @@
     }
 
     /**
-     * \brief Handles energy changed.
+     * @brief Handles energy changed.
      *
      * Not implemented
      */
@@ -109,7 +109,7 @@
     }
 
     /**
-     * \param current the current draw of device.
+     * @param current the current draw of device.
      *
      * Set the actual current draw of the device.
      */
@@ -119,7 +119,7 @@
     void DoDispose() override;
 
     /**
-     * \returns Current draw of device, at current state.
+     * @returns Current draw of device, at current state.
      *
      * Implements DeviceEnergyModel::GetCurrentA.
      */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/energy/test/basic-energy-harvester-test.cc ns-3.44/src/energy/test/basic-energy-harvester-test.cc
--- ns-3.43/src/energy/test/basic-energy-harvester-test.cc	2024-10-09 16:41:09.872655900 -0700
+++ ns-3.44/src/energy/test/basic-energy-harvester-test.cc	2025-03-09 16:55:49.375371000 -0700
@@ -23,9 +23,9 @@
 NS_LOG_COMPONENT_DEFINE("BasicEnergyHarvesterTestSuite");
 
 /**
- * \ingroup energy-tests
+ * @ingroup energy-tests
  *
- * \brief Energy Harvester Test
+ * @brief Energy Harvester Test
  */
 class BasicEnergyHarvesterTestCase : public TestCase
 {
@@ -112,9 +112,9 @@
 }
 
 /**
- * \ingroup energy-tests
+ * @ingroup energy-tests
  *
- * \brief Energy harvester TestSuite
+ * @brief Energy harvester TestSuite
  */
 class BasicEnergyHarvesterTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/energy/test/li-ion-energy-source-test.cc ns-3.44/src/energy/test/li-ion-energy-source-test.cc
--- ns-3.43/src/energy/test/li-ion-energy-source-test.cc	2024-10-09 16:41:09.872655900 -0700
+++ ns-3.44/src/energy/test/li-ion-energy-source-test.cc	2025-03-09 16:55:49.375371000 -0700
@@ -31,9 +31,9 @@
 NS_LOG_COMPONENT_DEFINE("LiIonEnergySourceTestSuite");
 
 /**
- * \ingroup energy-tests
+ * @ingroup energy-tests
  *
- * \brief LiIon battery Test
+ * @brief LiIon battery Test
  */
 class LiIonEnergyTestCase : public TestCase
 {
@@ -86,9 +86,9 @@
 }
 
 /**
- * \ingroup energy-tests
+ * @ingroup energy-tests
  *
- * \brief LiIon battery TestSuite
+ * @brief LiIon battery TestSuite
  */
 class LiIonEnergySourceTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/fd-net-device/CMakeLists.txt ns-3.44/src/fd-net-device/CMakeLists.txt
--- ns-3.43/src/fd-net-device/CMakeLists.txt	2024-10-09 16:41:09.872655900 -0700
+++ ns-3.44/src/fd-net-device/CMakeLists.txt	2025-03-09 16:55:49.375371000 -0700
@@ -309,11 +309,11 @@
 
   if(${ENABLE_DPDKDEVNET})
     target_include_directories(
-      ${libfd-net-device-obj}
+      ${libfd-net-device}
       PRIVATE ${DPDK_INCLUDE_DIRS}
     )
     target_compile_options(
-      ${libfd-net-device-obj}
+      ${libfd-net-device}
       PRIVATE ${DPDK_CFLAGS}
     )
   endif()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/fd-net-device/doc/dpdk-net-device.rst ns-3.44/src/fd-net-device/doc/dpdk-net-device.rst
--- ns-3.43/src/fd-net-device/doc/dpdk-net-device.rst	2024-10-09 16:41:09.872655900 -0700
+++ ns-3.44/src/fd-net-device/doc/dpdk-net-device.rst	2025-03-09 16:55:49.375371000 -0700
@@ -13,7 +13,7 @@
 Data Plane Development Kit (DPDK) is a library hosted by The Linux Foundation
 to accelerate packet processing workloads (https://www.dpdk.org/).
 
-The ``DpdkNetDevice`` class provides the implementation of a network device which uses DPDK’s fast packet processing abilities and bypasses the kernel. This class is included in the ``src/fd-net-device model``. The ``DpdkNetDevice`` class inherits the ``FdNetDevice`` class and overrides the functions which are required by |ns3| to interact with DPDK environment.
+The ``DpdkNetDevice`` class provides the implementation of a network device which uses DPDK's fast packet processing abilities and bypasses the kernel. This class is included in the ``src/fd-net-device model``. The ``DpdkNetDevice`` class inherits the ``FdNetDevice`` class and overrides the functions which are required by |ns3| to interact with DPDK environment.
 
 The ``DpdkNetDevice`` for |ns3| [Patel2019]_ was developed by Harsh Patel,
 Hrishikesh Hiraskar and Mohit P. Tahiliani. They were supported by Intel
@@ -306,4 +306,4 @@
 The following examples are provided:
 
 * ``fd-emu-ping.cc``: This example can be configured to use the ``DpdkNetDevice`` to send ICMP traffic bypassing the kernel over a real channel.
-* ``fd-emu-onoff.cc``: This example can be configured to measure the throughput of the ``DpdkNetDevice`` by sending traffic from the simulated node to a real device using the ``ns3::OnOffApplication`` while leveraging DPDK’s fast packet processing abilities. This is achieved by saturating the channel with TCP/UDP traffic.
+* ``fd-emu-onoff.cc``: This example can be configured to measure the throughput of the ``DpdkNetDevice`` by sending traffic from the simulated node to a real device using the ``ns3::OnOffApplication`` while leveraging DPDK's fast packet processing abilities. This is achieved by saturating the channel with TCP/UDP traffic.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/fd-net-device/doc/netmap-net-device.rst ns-3.44/src/fd-net-device/doc/netmap-net-device.rst
--- ns-3.43/src/fd-net-device/doc/netmap-net-device.rst	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/fd-net-device/doc/netmap-net-device.rst	2025-03-09 16:55:49.375371000 -0700
@@ -68,7 +68,7 @@
 
 The read method is called by the reading thread to retrieve new incoming
 packets stored in the netmap receiver ring and pass them to the appropriate
-|ns3| protocol handler for further processing within the simulator’s network
+|ns3| protocol handler for further processing within the simulator's network
 stack. After retrieving packets, the reading thread also synchronizes
 the netmap receiver ring, so that the retrieved packets can be removed
 from the netmap receiver ring.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/fd-net-device/examples/dummy-network.cc ns-3.44/src/fd-net-device/examples/dummy-network.cc
--- ns-3.43/src/fd-net-device/examples/dummy-network.cc	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/fd-net-device/examples/dummy-network.cc	2025-03-09 16:55:49.375371000 -0700
@@ -57,8 +57,8 @@
     app->SetAttribute("Destination", AddressValue(interfaces.GetAddress(0)));
     app->SetAttribute("VerboseMode", EnumValue(Ping::VerboseMode::VERBOSE));
     nodes.Get(1)->AddApplication(app);
-    app->SetStartTime(Seconds(0.0));
-    app->SetStopTime(Seconds(4.0));
+    app->SetStartTime(Seconds(0));
+    app->SetStopTime(Seconds(4));
 
     fd.EnablePcapAll("dummy-network", true);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/fd-net-device/examples/fd2fd-onoff.cc ns-3.44/src/fd-net-device/examples/fd2fd-onoff.cc
--- ns-3.43/src/fd-net-device/examples/fd2fd-onoff.cc	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/fd-net-device/examples/fd2fd-onoff.cc	2025-03-09 16:55:49.375371000 -0700
@@ -109,8 +109,8 @@
 
     PacketSinkHelper sinkHelper(factory, sinkLocalAddress);
     ApplicationContainer sinkApp = sinkHelper.Install(serverNode);
-    sinkApp.Start(Seconds(0.0));
-    sinkApp.Stop(Seconds(30.0));
+    sinkApp.Start(Seconds(0));
+    sinkApp.Stop(Seconds(30));
     fd.EnablePcap("fd2fd-onoff-server", serverDevice);
 
     // client
@@ -122,11 +122,11 @@
     onoff.SetAttribute("DataRate", DataRateValue(dataRate));
     onoff.SetAttribute("PacketSize", UintegerValue(packetSize));
     ApplicationContainer clientApps = onoff.Install(clientNode);
-    clientApps.Start(Seconds(2.0));
-    clientApps.Stop(Seconds(29.0));
+    clientApps.Start(Seconds(2));
+    clientApps.Stop(Seconds(29));
     fd.EnablePcap("fd2fd-onoff-client", clientDevice);
 
-    Simulator::Stop(Seconds(30.0));
+    Simulator::Stop(Seconds(30));
     Simulator::Run();
     Simulator::Destroy();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/fd-net-device/examples/fd-emu-onoff.cc ns-3.44/src/fd-net-device/examples/fd-emu-onoff.cc
--- ns-3.43/src/fd-net-device/examples/fd-emu-onoff.cc	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/fd-net-device/examples/fd-emu-onoff.cc	2025-03-09 16:55:49.375371000 -0700
@@ -245,8 +245,8 @@
         Address sinkLocalAddress(InetSocketAddress(localIp, sinkPort));
         PacketSinkHelper sinkHelper(socketType, sinkLocalAddress);
         ApplicationContainer sinkApp = sinkHelper.Install(node);
-        sinkApp.Start(Seconds(1.0));
-        sinkApp.Stop(Seconds(60.0));
+        sinkApp.Start(Seconds(1));
+        sinkApp.Stop(Seconds(60));
 
         helper->EnablePcap("fd-server", device);
     }
@@ -261,13 +261,13 @@
         onoff.SetAttribute("PacketSize", UintegerValue(packetSize));
 
         ApplicationContainer clientApps = onoff.Install(node);
-        clientApps.Start(Seconds(4.0));
-        clientApps.Stop(Seconds(58.0));
+        clientApps.Start(Seconds(4));
+        clientApps.Stop(Seconds(58));
 
         helper->EnablePcap("fd-client", device);
     }
 
-    Simulator::Stop(Seconds(61.0));
+    Simulator::Stop(Seconds(61));
     Simulator::Run();
     Simulator::Destroy();
     delete helper;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/fd-net-device/examples/fd-emu-ping.cc ns-3.44/src/fd-net-device/examples/fd-emu-ping.cc
--- ns-3.43/src/fd-net-device/examples/fd-emu-ping.cc	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/fd-net-device/examples/fd-emu-ping.cc	2025-03-09 16:55:49.375371000 -0700
@@ -263,8 +263,8 @@
     app->SetAttribute("Destination", AddressValue(remoteIp));
     app->SetAttribute("VerboseMode", EnumValue(Ping::VerboseMode::VERBOSE));
     node->AddApplication(app);
-    app->SetStartTime(Seconds(1.0));
-    app->SetStopTime(Seconds(22.0));
+    app->SetStartTime(Seconds(1));
+    app->SetStopTime(Seconds(22));
 
     //
     // Give the application a name.  This makes life much easier when constructing
@@ -286,7 +286,7 @@
     // Now, do the actual emulation.
     //
     NS_LOG_INFO("Run Emulation in " << emuMode << " mode.");
-    Simulator::Stop(Seconds(23.0));
+    Simulator::Stop(Seconds(23));
     Simulator::Run();
     Simulator::Destroy();
     delete helper;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/fd-net-device/examples/fd-emu-send.cc ns-3.44/src/fd-net-device/examples/fd-emu-send.cc
--- ns-3.43/src/fd-net-device/examples/fd-emu-send.cc	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/fd-net-device/examples/fd-emu-send.cc	2025-03-09 16:55:49.375371000 -0700
@@ -181,7 +181,7 @@
     Simulator::Schedule(Seconds(3), &Send, device, level, emuMode);
 
     NS_LOG_INFO("Run Emulation.");
-    Simulator::Stop(Seconds(6.0));
+    Simulator::Stop(Seconds(6));
     Simulator::Run();
     Simulator::Destroy();
     delete helper;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/fd-net-device/examples/fd-emu-tc.cc ns-3.44/src/fd-net-device/examples/fd-emu-tc.cc
--- ns-3.43/src/fd-net-device/examples/fd-emu-tc.cc	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/fd-net-device/examples/fd-emu-tc.cc	2025-03-09 16:55:49.375371000 -0700
@@ -299,7 +299,7 @@
     }
 
     NS_LOG_INFO("Run Emulation.");
-    Simulator::Stop(Seconds(50.0));
+    Simulator::Stop(Seconds(50));
     Simulator::Run();
     Simulator::Destroy();
     delete helper0;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/fd-net-device/examples/fd-emu-udp-echo.cc ns-3.44/src/fd-net-device/examples/fd-emu-udp-echo.cc
--- ns-3.43/src/fd-net-device/examples/fd-emu-udp-echo.cc	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/fd-net-device/examples/fd-emu-udp-echo.cc	2025-03-09 16:55:49.375371000 -0700
@@ -169,7 +169,7 @@
         NS_LOG_INFO("Create Applications.");
         UdpEchoServerHelper server(9);
         apps = server.Install(n.Get(0));
-        apps.Start(Seconds(1.0));
+        apps.Start(Seconds(1));
         apps.Stop(Seconds(stopTime));
     }
     else if (clientMode)
@@ -185,7 +185,7 @@
         client.SetAttribute("Interval", TimeValue(interPacketInterval));
         client.SetAttribute("PacketSize", UintegerValue(packetSize));
         apps = client.Install(n.Get(0));
-        apps.Start(Seconds(2.0));
+        apps.Start(Seconds(2));
         apps.Stop(Seconds(stopTime));
     }
     else
@@ -196,7 +196,7 @@
         NS_LOG_INFO("Create Applications.");
         UdpEchoServerHelper server(9);
         apps = server.Install(n.Get(1));
-        apps.Start(Seconds(1.0));
+        apps.Start(Seconds(1));
         apps.Stop(Seconds(stopTime));
 
         //
@@ -210,7 +210,7 @@
         client.SetAttribute("Interval", TimeValue(interPacketInterval));
         client.SetAttribute("PacketSize", UintegerValue(packetSize));
         apps = client.Install(n.Get(0));
-        apps.Start(Seconds(2.0));
+        apps.Start(Seconds(2));
         apps.Stop(Seconds(stopTime));
     }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/fd-net-device/examples/fd-tap-ping6.cc ns-3.44/src/fd-net-device/examples/fd-tap-ping6.cc
--- ns-3.43/src/fd-net-device/examples/fd-tap-ping6.cc	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/fd-net-device/examples/fd-tap-ping6.cc	2025-03-09 16:55:49.375371000 -0700
@@ -124,7 +124,7 @@
     //
     uint32_t packetSize = 1024;
     uint32_t maxPacketCount = 1;
-    Time interPacketInterval = Seconds(1.0);
+    Time interPacketInterval = Seconds(1);
 
     PingHelper ping(Ipv6Address(tapIp.c_str()));
     ping.SetAttribute("Count", UintegerValue(maxPacketCount));
@@ -140,8 +140,8 @@
     // ping6.SetAttribute("Interval", TimeValue(interPacketInterval));
     // ping6.SetAttribute("PacketSize", UintegerValue(packetSize));
     // ApplicationContainer apps = ping6.Install(n);
-    apps.Start(Seconds(2.0));
-    apps.Stop(Seconds(20.0));
+    apps.Start(Seconds(2));
+    apps.Stop(Seconds(20));
 
     AsciiTraceHelper ascii;
     csma.EnableAsciiAll(ascii.CreateFileStream("csma-ping6.tr"));
@@ -156,7 +156,7 @@
     // Run the experiment.
     //
     NS_LOG_INFO("Run Emulation.");
-    Simulator::Stop(Seconds(200.0));
+    Simulator::Stop(Seconds(200));
     Simulator::Run();
     Simulator::Destroy();
     NS_LOG_INFO("Done.");
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/fd-net-device/examples/fd-tap-ping.cc ns-3.44/src/fd-net-device/examples/fd-tap-ping.cc
--- ns-3.43/src/fd-net-device/examples/fd-tap-ping.cc	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/fd-net-device/examples/fd-tap-ping.cc	2025-03-09 16:55:49.375371000 -0700
@@ -195,8 +195,8 @@
     app->SetAttribute("Destination", AddressValue(remoteIp));
     app->SetAttribute("VerboseMode", EnumValue(Ping::VerboseMode::VERBOSE));
     node->AddApplication(app);
-    app->SetStartTime(Seconds(1.0));
-    app->SetStopTime(Seconds(21.0));
+    app->SetStartTime(Seconds(1));
+    app->SetStopTime(Seconds(21));
 
     //
     // Give the application a name.  This makes life much easier when constructing
@@ -218,7 +218,7 @@
     // Now, do the actual emulation.
     //
     NS_LOG_INFO("Run Emulation.");
-    Simulator::Stop(Seconds(25.0));
+    Simulator::Stop(Seconds(25));
     Simulator::Run();
     Simulator::Destroy();
     NS_LOG_INFO("Done.");
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/fd-net-device/examples/realtime-dummy-network.cc ns-3.44/src/fd-net-device/examples/realtime-dummy-network.cc
--- ns-3.43/src/fd-net-device/examples/realtime-dummy-network.cc	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/fd-net-device/examples/realtime-dummy-network.cc	2025-03-09 16:55:49.375371000 -0700
@@ -60,8 +60,8 @@
     app->SetAttribute("Destination", AddressValue(interfaces.GetAddress(0)));
     app->SetAttribute("VerboseMode", EnumValue(Ping::VerboseMode::VERBOSE));
     nodes.Get(1)->AddApplication(app);
-    app->SetStartTime(Seconds(0.0));
-    app->SetStopTime(Seconds(4.0));
+    app->SetStartTime(Seconds(0));
+    app->SetStopTime(Seconds(4));
 
     fd.EnablePcapAll("realtime-dummy-network", false);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/fd-net-device/examples/realtime-fd2fd-onoff.cc ns-3.44/src/fd-net-device/examples/realtime-fd2fd-onoff.cc
--- ns-3.43/src/fd-net-device/examples/realtime-fd2fd-onoff.cc	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/fd-net-device/examples/realtime-fd2fd-onoff.cc	2025-03-09 16:55:49.375371000 -0700
@@ -94,8 +94,8 @@
     Address sinkLocalAddress(InetSocketAddress(serverIp, sinkPort));
     PacketSinkHelper sinkHelper("ns3::TcpSocketFactory", sinkLocalAddress);
     ApplicationContainer sinkApp = sinkHelper.Install(serverNode);
-    sinkApp.Start(Seconds(0.0));
-    sinkApp.Stop(Seconds(40.0));
+    sinkApp.Start(Seconds(0));
+    sinkApp.Stop(Seconds(40));
     fd.EnablePcap("rt-fd2fd-onoff-server", serverDevice);
 
     // client
@@ -107,11 +107,11 @@
     onoff.SetAttribute("DataRate", DataRateValue(dataRate));
     onoff.SetAttribute("PacketSize", UintegerValue(packetSize));
     ApplicationContainer clientApps = onoff.Install(clientNode);
-    clientApps.Start(Seconds(1.0));
-    clientApps.Stop(Seconds(39.0));
+    clientApps.Start(Seconds(1));
+    clientApps.Stop(Seconds(39));
     fd.EnablePcap("rt-fd2fd-onoff-client", clientDevice);
 
-    Simulator::Stop(Seconds(40.0));
+    Simulator::Stop(Seconds(40));
     Simulator::Run();
     Simulator::Destroy();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/fd-net-device/helper/creator-utils.cc ns-3.44/src/fd-net-device/helper/creator-utils.cc
--- ns-3.43/src/fd-net-device/helper/creator-utils.cc	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/fd-net-device/helper/creator-utils.cc	2025-03-09 16:55:49.379371200 -0700
@@ -31,12 +31,12 @@
 bool gVerbose = false;
 
 /**
- * \brief Send the file descriptor back to the code that invoked the creation.
+ * @brief Send the file descriptor back to the code that invoked the creation.
  *
- * \param path The socket address information from the Unix socket we use
+ * @param path The socket address information from the Unix socket we use
  * to send the created socket back to.
- * \param fd The file descriptor we're going to send.
- * \param magic_number A verification number to verify the caller is talking to the
+ * @param fd The file descriptor we're going to send.
+ * @param magic_number A verification number to verify the caller is talking to the
  * right process.
  */
 void
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/fd-net-device/helper/creator-utils.h ns-3.44/src/fd-net-device/helper/creator-utils.h
--- ns-3.43/src/fd-net-device/helper/creator-utils.h	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/fd-net-device/helper/creator-utils.h	2025-03-09 16:55:49.379371200 -0700
@@ -44,13 +44,13 @@
     }
 
 /**
- * \ingroup fd-net-device
- * \brief Send the file descriptor back to the code that invoked the creation.
+ * @ingroup fd-net-device
+ * @brief Send the file descriptor back to the code that invoked the creation.
  *
- * \param path The socket address information from the Unix socket we use
+ * @param path The socket address information from the Unix socket we use
  * to send the created socket back to.
- * \param fd The file descriptor we're going to send.
- * \param magic_number A verification number to verify the caller is talking to the
+ * @param fd The file descriptor we're going to send.
+ * @param magic_number A verification number to verify the caller is talking to the
  * right process.
  */
 void SendSocket(const char* path, int fd, const int magic_number);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/fd-net-device/helper/dpdk-net-device-helper.h ns-3.44/src/fd-net-device/helper/dpdk-net-device-helper.h
--- ns-3.43/src/fd-net-device/helper/dpdk-net-device-helper.h	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/fd-net-device/helper/dpdk-net-device-helper.h	2025-03-09 16:55:49.379371200 -0700
@@ -16,8 +16,8 @@
 {
 
 /**
- * \ingroup fd-net-device
- * \brief build a DpdkNetDevice object attached to a physical network
+ * @ingroup fd-net-device
+ * @brief build a DpdkNetDevice object attached to a physical network
  * interface
  */
 class DpdkNetDeviceHelper : public EmuFdNetDeviceHelper
@@ -33,33 +33,33 @@
     }
 
     /**
-     * \brief Sets list of logical cores to use
+     * @brief Sets list of logical cores to use
      *
-     * \param lCoreList Comma separated logical core list (e.g., "0,1")
+     * @param lCoreList Comma separated logical core list (e.g., "0,1")
      */
     void SetLCoreList(std::string lCoreList);
 
     /**
-     * \brief Sets PMD Library to be used for the NIC
+     * @brief Sets PMD Library to be used for the NIC
      *
-     * \param pmdLibrary The PMD Library
+     * @param pmdLibrary The PMD Library
      */
     void SetPmdLibrary(std::string pmdLibrary);
 
     /**
-     * \brief Sets DPDK Driver to bind NIC to
+     * @brief Sets DPDK Driver to bind NIC to
      *
-     * \param dpdkDriver The DPDK Driver
+     * @param dpdkDriver The DPDK Driver
      */
     void SetDpdkDriver(std::string dpdkDriver);
 
   protected:
     /**
-     * \brief This method creates an ns3::FdNetDevice attached to a physical network
+     * @brief This method creates an ns3::FdNetDevice attached to a physical network
      * interface
      *
-     * \param node The node to install the device in
-     * \returns A container holding the added net device.
+     * @param node The node to install the device in
+     * @returns A container holding the added net device.
      */
     Ptr<NetDevice> InstallPriv(Ptr<Node> node) const override;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/fd-net-device/helper/emu-fd-net-device-helper.h ns-3.44/src/fd-net-device/helper/emu-fd-net-device-helper.h
--- ns-3.43/src/fd-net-device/helper/emu-fd-net-device-helper.h	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/fd-net-device/helper/emu-fd-net-device-helper.h	2025-03-09 16:55:49.379371200 -0700
@@ -22,8 +22,8 @@
 {
 
 /**
- * \ingroup fd-net-device
- * \brief build a set of FdNetDevice objects attached to a physical network
+ * @ingroup fd-net-device
+ * @brief build a set of FdNetDevice objects attached to a physical network
  * interface
  *
  */
@@ -42,20 +42,20 @@
     /**
      * Get the device name of this device.
      *
-     * \returns The device name of this device.
+     * @returns The device name of this device.
      */
     std::string GetDeviceName();
 
     /**
      * Set the device name of this device.
      *
-     * \param deviceName The device name of this device.
+     * @param deviceName The device name of this device.
      */
     void SetDeviceName(std::string deviceName);
 
     /**
-     * \brief Request host qdisc bypass
-     * \param hostQdiscBypass to enable host qdisc bypass
+     * @brief Request host qdisc bypass
+     * @param hostQdiscBypass to enable host qdisc bypass
      */
     void HostQdiscBypass(bool hostQdiscBypass);
 
@@ -64,21 +64,21 @@
      * This method creates an ns3::FdNetDevice attached to a physical network
      * interface
      *
-     * \param node The node to install the device in
-     * \returns A container holding the added net device.
+     * @param node The node to install the device in
+     * @returns A container holding the added net device.
      */
     Ptr<NetDevice> InstallPriv(Ptr<Node> node) const override;
 
     /**
      * Sets a file descriptor on the FileDescriptorNetDevice.
-     * \param device the device to install the file descriptor in
+     * @param device the device to install the file descriptor in
      */
     virtual void SetFileDescriptor(Ptr<FdNetDevice> device) const;
 
     /**
      * Call out to a separate process running as suid root in order to get a raw
      * socket.  We do this to avoid having the entire simulation running as root.
-     * \return the rawSocket number
+     * @return the rawSocket number
      */
     virtual int CreateFileDescriptor() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/fd-net-device/helper/encode-decode.cc ns-3.44/src/fd-net-device/helper/encode-decode.cc
--- ns-3.43/src/fd-net-device/helper/encode-decode.cc	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/fd-net-device/helper/encode-decode.cc	2025-03-09 16:55:49.379371200 -0700
@@ -14,13 +14,13 @@
 {
 
 /**
- * \brief Convert a byte buffer to a string containing a hex representation
+ * @brief Convert a byte buffer to a string containing a hex representation
  * of the buffer.  Make the string pretty by adding a colon (':') between
  * the hex.
  *
- * \param buffer The input buffer to be converted.
- * \param len The length of the input buffer.
- * \returns A string containing a hex representation of the data in buffer.
+ * @param buffer The input buffer to be converted.
+ * @param len The length of the input buffer.
+ * @returns A string containing a hex representation of the data in buffer.
  */
 std::string
 BufferToString(uint8_t* buffer, uint32_t len)
@@ -44,13 +44,13 @@
 }
 
 /**
- * \brief Convert string encoded by the inverse function (TapBufferToString)
+ * @brief Convert string encoded by the inverse function (TapBufferToString)
  * back into a byte buffer.
  *
- * \param s The input string.
- * \param buffer The buffer to initialize with the converted bits.
- * \param len The length of the data that is valid in the buffer.
- * \returns True indicates a successful conversion.
+ * @param s The input string.
+ * @param buffer The buffer to initialize with the converted bits.
+ * @param len The length of the data that is valid in the buffer.
+ * @returns True indicates a successful conversion.
  */
 bool
 StringToBuffer(std::string s, uint8_t* buffer, uint32_t* len)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/fd-net-device/helper/fd-net-device-helper.h ns-3.44/src/fd-net-device/helper/fd-net-device-helper.h
--- ns-3.43/src/fd-net-device/helper/fd-net-device-helper.h	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/fd-net-device/helper/fd-net-device-helper.h	2025-03-09 16:55:49.379371200 -0700
@@ -23,8 +23,8 @@
 {
 
 /**
- * \ingroup fd-net-device
- * \brief build a set of FdNetDevice objects
+ * @ingroup fd-net-device
+ * @brief build a set of FdNetDevice objects
  * Normally we eschew multiple inheritance, however, the classes
  * PcapUserHelperForDevice and AsciiTraceUserHelperForDevice are
  * treated as "mixins".  A mixin is a self-contained class that
@@ -46,13 +46,13 @@
     /**
      * Set the TypeId of the Objects to be created by this helper.
      *
-     * \param [in] type The TypeId of the object to instantiate.
+     * @param [in] type The TypeId of the object to instantiate.
      */
     void SetTypeId(std::string type);
 
     /**
-     * \param n1 the name of the attribute to set
-     * \param v1 the value of the attribute to set
+     * @param n1 the name of the attribute to set
+     * @param v1 the value of the attribute to set
      *
      * Set these attributes on each ns3::FdNetDevice created
      * by FdNetDeviceHelper::Install
@@ -62,16 +62,16 @@
     /**
      * This method creates a FdNetDevice and associates it to a node
      *
-     * \param node The node to install the device in
-     * \returns A container holding the added net device.
+     * @param node The node to install the device in
+     * @returns A container holding the added net device.
      */
     virtual NetDeviceContainer Install(Ptr<Node> node) const;
 
     /**
      * This method creates a FdNetDevice and associates it to a node
      *
-     * \param name The name of the node to install the device in
-     * \returns A container holding the added net device.
+     * @param name The name of the node to install the device in
+     * @returns A container holding the added net device.
      */
     virtual NetDeviceContainer Install(std::string name) const;
 
@@ -81,8 +81,8 @@
      * (with the attributes  configured by FdNetDeviceHelper::SetDeviceAttribute);
      * adds the device to the node; and attaches the channel to the device.
      *
-     * \param c The NodeContainer holding the nodes to be changed.
-     * \returns A container holding the added net devices.
+     * @param c The NodeContainer holding the nodes to be changed.
+     * @returns A container holding the added net devices.
      */
     virtual NetDeviceContainer Install(const NodeContainer& c) const;
 
@@ -90,22 +90,22 @@
     /**
      * This method creates an ns3::FdNetDevice and associates it to a node
      *
-     * \param node The node to install the device in
-     * \returns A container holding the added net device.
+     * @param node The node to install the device in
+     * @returns A container holding the added net device.
      */
     virtual Ptr<NetDevice> InstallPriv(Ptr<Node> node) const;
 
   private:
     /**
-     * \brief Enable pcap output on the indicated net device.
+     * @brief Enable pcap output on the indicated net device.
      *
      * NetDevice-specific implementation mechanism for hooking the trace and
      * writing to the trace file.
      *
-     * \param prefix Filename prefix to use for pcap files.
-     * \param nd Net device for which you want to enable tracing.
-     * \param promiscuous If true capture all possible packets available at the device.
-     * \param explicitFilename Treat the prefix as an explicit filename if true
+     * @param prefix Filename prefix to use for pcap files.
+     * @param nd Net device for which you want to enable tracing.
+     * @param promiscuous If true capture all possible packets available at the device.
+     * @param explicitFilename Treat the prefix as an explicit filename if true
      */
     void EnablePcapInternal(std::string prefix,
                             Ptr<NetDevice> nd,
@@ -113,15 +113,15 @@
                             bool explicitFilename) override;
 
     /**
-     * \brief Enable ascii trace output on the indicated net device.
+     * @brief Enable ascii trace output on the indicated net device.
      *
      * NetDevice-specific implementation mechanism for hooking the trace and
      * writing to the trace file.
      *
-     * \param stream The output stream object to use when logging ascii traces.
-     * \param prefix Filename prefix to use for ascii trace files.
-     * \param nd Net device for which you want to enable tracing.
-     * \param explicitFilename Treat the prefix as an explicit filename if true
+     * @param stream The output stream object to use when logging ascii traces.
+     * @param prefix Filename prefix to use for ascii trace files.
+     * @param nd Net device for which you want to enable tracing.
+     * @param explicitFilename Treat the prefix as an explicit filename if true
      */
     void EnableAsciiInternal(Ptr<OutputStreamWrapper> stream,
                              std::string prefix,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/fd-net-device/helper/netmap-net-device-helper.cc ns-3.44/src/fd-net-device/helper/netmap-net-device-helper.cc
--- ns-3.43/src/fd-net-device/helper/netmap-net-device-helper.cc	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/fd-net-device/helper/netmap-net-device-helper.cc	2025-03-09 16:55:49.379371200 -0700
@@ -350,8 +350,7 @@
         // an "ancillary element" but the msghdr uses the control message terminology
         // so we call it "control."
         //
-        size_t msg_size = sizeof(int);
-        char control[CMSG_SPACE(msg_size)];
+        char control[CMSG_SPACE(sizeof(int))];
 
         //
         // There is a msghdr that is used to minimize the number of parameters
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/fd-net-device/helper/netmap-net-device-helper.h ns-3.44/src/fd-net-device/helper/netmap-net-device-helper.h
--- ns-3.43/src/fd-net-device/helper/netmap-net-device-helper.h	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/fd-net-device/helper/netmap-net-device-helper.h	2025-03-09 16:55:49.379371200 -0700
@@ -26,8 +26,8 @@
 class NetmapNetDevice;
 
 /**
- * \ingroup fd-net-device
- * \brief build a set of FdNetDevice objects attached to a physical network
+ * @ingroup fd-net-device
+ * @brief build a set of FdNetDevice objects attached to a physical network
  * interface
  *
  */
@@ -41,43 +41,43 @@
     }
 
     /**
-     * \brief Get the device name of this device.
-     * \returns The device name of this device.
+     * @brief Get the device name of this device.
+     * @returns The device name of this device.
      */
     std::string GetDeviceName();
 
     /**
-     * \brief Set the device name of this device.
-     * \param deviceName The device name of this device.
+     * @brief Set the device name of this device.
+     * @param deviceName The device name of this device.
      */
     void SetDeviceName(std::string deviceName);
 
   protected:
     /**
-     * \brief This method creates an ns3::FdNetDevice attached to a physical network
+     * @brief This method creates an ns3::FdNetDevice attached to a physical network
      * interface
-     * \param node The node to install the device in
-     * \returns A container holding the added net device.
+     * @param node The node to install the device in
+     * @returns A container holding the added net device.
      */
     Ptr<NetDevice> InstallPriv(Ptr<Node> node) const;
 
     /**
-     * \brief Sets device flags and MTU.
-     * \param device the FdNetDevice
+     * @brief Sets device flags and MTU.
+     * @param device the FdNetDevice
      */
     virtual void SetDeviceAttributes(Ptr<FdNetDevice> device) const;
 
     /**
-     * \brief Call out to a separate process running as suid root in order to get a raw
+     * @brief Call out to a separate process running as suid root in order to get a raw
      * socket.  We do this to avoid having the entire simulation running as root.
-     * \return the rawSocket number
+     * @return the rawSocket number
      */
     virtual int CreateFileDescriptor() const;
 
     /**
-     * \brief Switch the fd in netmap mode.
-     * \param fd the file descriptor
-     * \param device the NetmapNetDevice
+     * @brief Switch the fd in netmap mode.
+     * @param fd the file descriptor
+     * @param device the NetmapNetDevice
      */
     void SwitchInNetmapMode(int fd, Ptr<NetmapNetDevice> device) const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/fd-net-device/helper/tap-fd-net-device-helper.h ns-3.44/src/fd-net-device/helper/tap-fd-net-device-helper.h
--- ns-3.43/src/fd-net-device/helper/tap-fd-net-device-helper.h	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/fd-net-device/helper/tap-fd-net-device-helper.h	2025-03-09 16:55:49.379371200 -0700
@@ -23,8 +23,8 @@
 {
 
 /**
- * \ingroup fd-net-device
- * \brief build a set of FdNetDevice objects attached to a virtual TAP network
+ * @ingroup fd-net-device
+ * @brief build a set of FdNetDevice objects attached to a virtual TAP network
  * interface
  *
  */
@@ -43,42 +43,42 @@
     /**
      * Set flag IFF_NO_PI on the device.
      *
-     * \param pi Set the IFF_NO_PI flag if pi is false.
+     * @param pi Set the IFF_NO_PI flag if pi is false.
      */
     void SetModePi(bool pi);
 
     /**
      * Set the device IPv4 address.
      *
-     * \param address The IPv4 address for the TAP device.
+     * @param address The IPv4 address for the TAP device.
      */
     void SetTapIpv4Address(Ipv4Address address);
 
     /**
      * Set the IPv4 network mask for the TAP device.
      *
-     * \param mask The IPv4 network mask for the TAP device.
+     * @param mask The IPv4 network mask for the TAP device.
      */
     void SetTapIpv4Mask(Ipv4Mask mask);
 
     /**
      * Set the device IPv6 address.
      *
-     * \param address The IPv6 address for the TAP device.
+     * @param address The IPv6 address for the TAP device.
      */
     void SetTapIpv6Address(Ipv6Address address);
 
     /**
      * Set the IPv6 network mask for the TAP device.
      *
-     * \param prefix The IPv6 network prefix for the TAP device.
+     * @param prefix The IPv6 network prefix for the TAP device.
      */
     void SetTapIpv6Prefix(int prefix);
 
     /**
      * Set the MAC address for the TAP device.
      *
-     * \param mac The MAC address the TAP device.
+     * @param mac The MAC address the TAP device.
      */
     void SetTapMacAddress(Mac48Address mac);
 
@@ -87,21 +87,21 @@
      * This method creates an ns3::FdNetDevice attached to a virtual TAP network
      * interface
      *
-     * \param node The node to install the device in
-     * \returns A container holding the added net device.
+     * @param node The node to install the device in
+     * @returns A container holding the added net device.
      */
     Ptr<NetDevice> InstallPriv(Ptr<Node> node) const override;
 
     /**
      * Sets a file descriptor on the FileDescriptorNetDevice.
-     * \param device the device to install the file descriptor in
+     * @param device the device to install the file descriptor in
      */
     void SetFileDescriptor(Ptr<FdNetDevice> device) const override;
 
     /**
      * Call out to a separate process running as suid root in order to create a
      * TAP device and obtain the file descriptor associated to it.
-     * \returns The file descriptor associated with the TAP device.
+     * @returns The file descriptor associated with the TAP device.
      */
     int CreateFileDescriptor() const override;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/fd-net-device/model/dpdk-net-device.h ns-3.44/src/fd-net-device/model/dpdk-net-device.h
--- ns-3.43/src/fd-net-device/model/dpdk-net-device.h	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/fd-net-device/model/dpdk-net-device.h	2025-03-09 16:55:49.379371200 -0700
@@ -24,9 +24,9 @@
 {
 
 /**
- * \ingroup fd-net-device
+ * @ingroup fd-net-device
  *
- * \brief a NetDevice to read/write network traffic from/into a
+ * @brief a NetDevice to read/write network traffic from/into a
  *        Dpdk enabled port.
  *
  * A DpdkNetDevice object will read and write frames/packets
@@ -37,8 +37,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -62,30 +62,30 @@
      * Initialize Dpdk.
      * Initializes EAL.
      *
-     * \param argc Dpdk EAL args count.
-     * \param argv Dpdk EAL args list.
-     * \param dpdkDriver Dpdk Driver to bind NIC to.
+     * @param argc Dpdk EAL args count.
+     * @param argv Dpdk EAL args list.
+     * @param dpdkDriver Dpdk Driver to bind NIC to.
      */
     void InitDpdk(int argc, char** argv, std::string dpdkDriver);
 
     /**
      * Set device name.
      *
-     * \param deviceName The device name.
+     * @param deviceName The device name.
      */
     void SetDeviceName(std::string deviceName);
 
     /**
      * A signal handler for SIGINT and SIGTERM signals.
      *
-     * \param signum The signal number.
+     * @param signum The signal number.
      */
     static void SignalHandler(int signum);
 
     /**
      * A function to handle rx & tx operations.
-     * \param arg a pointer to the DpdkNetDevice
-     * \return zero on failure or exit.
+     * @param arg a pointer to the DpdkNetDevice
+     * @return zero on failure or exit.
      */
     static int LaunchCore(void* arg);
 
@@ -101,29 +101,29 @@
 
     /**
      * Check the status of the link.
-     * \return Status of the link - up/down as true/false.
+     * @return Status of the link - up/down as true/false.
      */
     bool IsLinkUp() const override;
 
     /**
      * Free the given packet buffer.
-     * \param buf the pointer to the buffer to be freed
+     * @param buf the pointer to the buffer to be freed
      */
     void FreeBuffer(uint8_t* buf) override;
 
     /**
      * Allocate packet buffer.
-     * \param len the length of the buffer
-     * \return A pointer to the newly created buffer.
+     * @param len the length of the buffer
+     * @return A pointer to the newly created buffer.
      */
     uint8_t* AllocateBuffer(size_t len) override;
 
   protected:
     /**
      * Write packet data to device.
-     * \param buffer The data.
-     * \param length The data length.
-     * \return The size of data written.
+     * @param buffer The data.
+     * @param length The data length.
+     * @return The size of data written.
      */
     ssize_t Write(uint8_t* buffer, size_t length) override;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/fd-net-device/model/fd-net-device.cc ns-3.44/src/fd-net-device/model/fd-net-device.cc
--- ns-3.43/src/fd-net-device/model/fd-net-device.cc	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/fd-net-device/model/fd-net-device.cc	2025-03-09 16:55:49.379371200 -0700
@@ -179,7 +179,7 @@
 {
     NS_LOG_FUNCTION(this);
     Start(m_tStart);
-    if (m_tStop != Seconds(0))
+    if (!m_tStop.IsZero())
     {
         Stop(m_tStop);
     }
@@ -326,12 +326,12 @@
 }
 
 /**
- * \ingroup fd-net-device
- * \brief Synthesize PI header for the kernel
- * \param buf the buffer to add the header to
- * \param len the buffer length
+ * @ingroup fd-net-device
+ * @brief Synthesize PI header for the kernel
+ * @param buf the buffer to add the header to
+ * @param len the buffer length
  *
- * \todo Consider having a instance member m_packetBuffer and using memmove
+ * @todo Consider having a instance member m_packetBuffer and using memmove
  * instead of memcpy to add the PI header. It might be faster in this case
  * to use memmove and avoid the extra mallocs.
  */
@@ -372,10 +372,10 @@
 }
 
 /**
- * \ingroup fd-net-device
- * \brief Removes PI header
- * \param buf the buffer to add the header to
- * \param len the buffer length
+ * @ingroup fd-net-device
+ * @brief Removes PI header
+ * @param buf the buffer to add the header to
+ * @param len the buffer length
  */
 static void
 RemovePIHeader(uint8_t*& buf, ssize_t& len)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/fd-net-device/model/fd-net-device.h ns-3.44/src/fd-net-device/model/fd-net-device.h
--- ns-3.43/src/fd-net-device/model/fd-net-device.h	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/fd-net-device/model/fd-net-device.h	2025-03-09 16:55:49.379371200 -0700
@@ -30,14 +30,14 @@
 {
 
 /**
- * \defgroup fd-net-device File Descriptor Network Device
+ * @defgroup fd-net-device File Descriptor Network Device
  * This section documents the API of the ns-3 fd-net-device module.
  * For a generic functional description, please refer to the ns-3 manual.
  */
 
 /**
- * \ingroup fd-net-device
- * \brief This class performs the actual data reading from the sockets.
+ * @ingroup fd-net-device
+ * @brief This class performs the actual data reading from the sockets.
  */
 class FdNetDeviceFdReader : public FdReader
 {
@@ -46,7 +46,7 @@
 
     /**
      * Set size of the read buffer.
-     * \param bufferSize the buffer size
+     * @param bufferSize the buffer size
      */
     void SetBufferSize(uint32_t bufferSize);
 
@@ -59,9 +59,9 @@
 class Node;
 
 /**
- * \ingroup fd-net-device
+ * @ingroup fd-net-device
  *
- * \brief a NetDevice to read/write network traffic from/into a file descriptor.
+ * @brief a NetDevice to read/write network traffic from/into a file descriptor.
  *
  * A FdNetDevice object will read and write frames/packets from/to a file descriptor.
  * This file descriptor might be associated to a Linux TAP/TUN device, to a socket
@@ -73,8 +73,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -109,7 +109,7 @@
     /**
      * Set the link layer encapsulation mode of this device.
      *
-     * \param mode The link layer encapsulation mode of this device.
+     * @param mode The link layer encapsulation mode of this device.
      *
      */
     void SetEncapsulationMode(FdNetDevice::EncapsulationMode mode);
@@ -117,13 +117,13 @@
     /**
      * Get the link layer encapsulation mode of this device.
      *
-     * \returns The link layer encapsulation mode of this device.
+     * @returns The link layer encapsulation mode of this device.
      */
     FdNetDevice::EncapsulationMode GetEncapsulationMode() const;
 
     /**
      * Set the associated file descriptor.
-     * \param fd the file descriptor
+     * @param fd the file descriptor
      */
     void SetFileDescriptor(int fd);
 
@@ -172,20 +172,20 @@
 
     /**
      * Set if the NetDevice is able to send Broadcast messages
-     * \param broadcast true if the NetDevice can send Broadcast
+     * @param broadcast true if the NetDevice can send Broadcast
      */
     virtual void SetIsBroadcast(bool broadcast);
     /**
      * Set if the NetDevice is able to send Multicast messages
-     * \param multicast true if the NetDevice can send Multicast
+     * @param multicast true if the NetDevice can send Multicast
      */
     virtual void SetIsMulticast(bool multicast);
 
     /**
      * Write packet data to device.
-     * \param buffer The data.
-     * \param length The data length.
-     * \return The size of data written.
+     * @param buffer The data.
+     * @param length The data length.
+     * @return The size of data written.
      */
     virtual ssize_t Write(uint8_t* buffer, size_t length);
 
@@ -199,27 +199,27 @@
 
     /**
      * Get the associated file descriptor.
-     * \return the associated file descriptor
+     * @return the associated file descriptor
      */
     int GetFileDescriptor() const;
 
     /**
      * Allocate packet buffer.
-     * \param len the length of the buffer
-     * \return A pointer to the newly allocated buffer.
+     * @param len the length of the buffer
+     * @return A pointer to the newly allocated buffer.
      */
     virtual uint8_t* AllocateBuffer(size_t len);
 
     /**
      * Free the given packet buffer.
-     * \param buf the buffer to free
+     * @param buf the buffer to free
      */
     virtual void FreeBuffer(uint8_t* buf);
 
     /**
      * Callback to invoke when a new frame is received
-     * \param buf a buffer containing the received frame
-     * \param len the length of the frame
+     * @param buf a buffer containing the received frame
+     * @param len the length of the frame
      */
     void ReceiveCallback(uint8_t* buf, ssize_t len);
 
@@ -246,7 +246,7 @@
 
     /**
      * Create the FdReader object
-     * \return the created FdReader object
+     * @return the created FdReader object
      */
     virtual Ptr<FdReader> DoCreateFdReader();
 
@@ -382,7 +382,7 @@
      * The trace source fired when packets come into the "top" of the device
      * at the L3/L2 transition, before being queued for transmission.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_macTxTrace;
 
@@ -390,7 +390,7 @@
      * The trace source fired when packets coming into the "top" of the device
      * at the L3/L2 transition are dropped before being queued for transmission.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_macTxDropTrace;
 
@@ -399,7 +399,7 @@
      * immediately before being forwarded up to higher layers (at the L2/L3
      * transition).  This is a promiscuous trace.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_macPromiscRxTrace;
 
@@ -408,7 +408,7 @@
      * immediately before being forwarded up to higher layers (at the L2/L3
      * transition).  This is a non-promiscuous trace.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_macRxTrace;
 
@@ -417,7 +417,7 @@
      * but which are dropped before being forwarded up to higher layers (at the
      * L2/L3 transition).
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_macRxDropTrace;
 
@@ -425,16 +425,16 @@
      * The trace source fired when the phy layer drops a packet as it tries
      * to transmit it.
      *
-     * \todo Remove: this TracedCallback is never invoked.
+     * @todo Remove: this TracedCallback is never invoked.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_phyTxDropTrace;
 
     /**
      * The trace source fired when the phy layer drops a packet it has received.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_phyRxDropTrace;
 
@@ -454,7 +454,7 @@
      * this would correspond to the point at which the packet is dispatched to
      * packet sniffers in netif_receive_skb.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_snifferTrace;
 
@@ -474,7 +474,7 @@
      * this would correspond to the point at which the packet is dispatched to
      * packet sniffers in netif_receive_skb.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_promiscSnifferTrace;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/fd-net-device/model/netmap-net-device.h ns-3.44/src/fd-net-device/model/netmap-net-device.h
--- ns-3.43/src/fd-net-device/model/netmap-net-device.h	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/fd-net-device/model/netmap-net-device.h	2025-03-09 16:55:49.379371200 -0700
@@ -22,9 +22,9 @@
 {
 
 /**
- * \ingroup fd-net-device
+ * @ingroup fd-net-device
  *
- * \brief Network device transmission queue with lock
+ * @brief Network device transmission queue with lock
  *
  * This class stores information about a single transmission queue
  * of a network device that is exposed to queue discs. This class extends
@@ -35,8 +35,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -63,8 +63,8 @@
     virtual void Wake();
 
     /**
-     * \brief Get the status of the device transmission queue.
-     * \return true if the device transmission queue is stopped.
+     * @brief Get the status of the device transmission queue.
+     * @return true if the device transmission queue is stopped.
      *
      * Called by queue discs to enquire about the status of a given transmission queue.
      * This is the analogous to the netif_xmit_stopped function of the Linux kernel.
@@ -72,14 +72,14 @@
     virtual bool IsStopped() const;
 
     /**
-     * \brief Called by the netdevice to report the number of bytes queued to the device queue
-     * \param bytes number of bytes queued to the device queue
+     * @brief Called by the netdevice to report the number of bytes queued to the device queue
+     * @param bytes number of bytes queued to the device queue
      */
     virtual void NotifyQueuedBytes(uint32_t bytes);
 
     /**
-     * \brief Called by the netdevice to report the number of bytes it is going to transmit
-     * \param bytes number of bytes the device is going to transmit
+     * @brief Called by the netdevice to report the number of bytes it is going to transmit
+     * @param bytes number of bytes the device is going to transmit
      */
     virtual void NotifyTransmittedBytes(uint32_t bytes);
 
@@ -88,9 +88,9 @@
 };
 
 /**
- * \ingroup fd-net-device
+ * @ingroup fd-net-device
  *
- * \brief This class performs the actual data reading from the netmap ring.
+ * @brief This class performs the actual data reading from the netmap ring.
  */
 class NetmapNetDeviceFdReader : public FdReader
 {
@@ -98,14 +98,14 @@
     NetmapNetDeviceFdReader();
 
     /**
-     * \brief Set size of the read buffer.
-     * \param bufferSize the size of the read buffer
+     * @brief Set size of the read buffer.
+     * @param bufferSize the size of the read buffer
      */
     void SetBufferSize(uint32_t bufferSize);
 
     /**
-     * \brief Set netmap interface representation.
-     * \param nifp the netmap interface representation
+     * @brief Set netmap interface representation.
+     * @param nifp the netmap interface representation
      */
     void SetNetmapIfp(struct netmap_if* nifp);
 
@@ -117,9 +117,9 @@
 };
 
 /**
- * \ingroup fd-net-device
+ * @ingroup fd-net-device
  *
- * \brief a NetDevice to read/write network traffic from/into a netmap file descriptor.
+ * @brief a NetDevice to read/write network traffic from/into a netmap file descriptor.
  *
  * A NetmapNetDevice object will read and write packets from/to a netmap file descriptor.
  *
@@ -128,8 +128,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -137,48 +137,48 @@
     virtual ~NetmapNetDevice();
 
     /**
-     * \brief Get the number of bytes currently in the netmap transmission ring.
-     * \return the number of bytes in the netmap transmission ring.
+     * @brief Get the number of bytes currently in the netmap transmission ring.
+     * @return the number of bytes in the netmap transmission ring.
      */
     uint32_t GetBytesInNetmapTxRing();
 
     /**
-     * \brief Get the number of slots currently available in the netmap transmission ring.
-     * \return the number of slots currently available in the netmap transmission ring.
+     * @brief Get the number of slots currently available in the netmap transmission ring.
+     * @return the number of slots currently available in the netmap transmission ring.
      */
     int GetSpaceInNetmapTxRing() const;
 
     /**
-     * \brief Set the NetDeviceQueue
-     * \param queue the NetDeviceQueue
+     * @brief Set the NetDeviceQueue
+     * @param queue the NetDeviceQueue
      */
     void SetNetDeviceQueue(Ptr<NetDeviceQueue> queue);
 
     /**
-     * \brief Set the netmap interface representation
-     * \param nifp the pointer to netmap interface representation
+     * @brief Set the netmap interface representation
+     * @param nifp the pointer to netmap interface representation
      */
     void SetNetmapInterfaceRepresentation(struct netmap_if* nifp);
 
     /**
-     * \brief Set the netmap transmission rings info
-     * \param nTxRings the number of transmission rings
-     * \param nTxRingsSlots the number of slots for each transmission ring
+     * @brief Set the netmap transmission rings info
+     * @param nTxRings the number of transmission rings
+     * @param nTxRingsSlots the number of slots for each transmission ring
      */
     void SetTxRingsInfo(uint32_t nTxRings, uint32_t nTxRingsSlots);
 
     /**
-     * \brief Set the netmap receiver rings info
-     * \param nRxRings the number of receiver rings
-     * \param nRxRingsSlots the number of slots for each receiver ring
+     * @brief Set the netmap receiver rings info
+     * @param nRxRings the number of receiver rings
+     * @param nRxRingsSlots the number of slots for each receiver ring
      */
     void SetRxRingsInfo(uint32_t nRxRings, uint32_t nRxRingsSlots);
 
     /**
-     * \brief The function Writes a packet into the netmap transmission ring.
-     * \param buffer the pointer to packet
-     * \param length the packet length
-     * \return the number of written bytes
+     * @brief The function Writes a packet into the netmap transmission ring.
+     * @param buffer the pointer to packet
+     * @param length the packet length
+     * @return the number of written bytes
      */
     virtual ssize_t Write(uint8_t* buffer, size_t length);
 
@@ -188,7 +188,7 @@
     void DoFinishStoppingDevice();
 
     /**
-     * \brief This function syncs netmap ring and notifies netdevice queue.
+     * @brief This function syncs netmap ring and notifies netdevice queue.
      * This function runs in a separate thread.
      */
     virtual void SyncAndNotifyQueue();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/flow-monitor/examples/wifi-olsr-flowmon.py ns-3.44/src/flow-monitor/examples/wifi-olsr-flowmon.py
--- ns-3.43/src/flow-monitor/examples/wifi-olsr-flowmon.py	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/flow-monitor/examples/wifi-olsr-flowmon.py	2025-03-09 16:55:49.379371200 -0700
@@ -114,7 +114,7 @@
     monitor.SetAttribute("JitterBinWidth", ns.DoubleValue(0.001))
     monitor.SetAttribute("PacketSizeBinWidth", ns.DoubleValue(20))
 
-    ns.Simulator.Stop(ns.Seconds(44.0))
+    ns.Simulator.Stop(ns.Seconds(44))
     ns.Simulator.Run()
 
     def print_stats(os, st):
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/flow-monitor/helper/flow-monitor-helper.h ns-3.44/src/flow-monitor/helper/flow-monitor-helper.h
--- ns-3.43/src/flow-monitor/helper/flow-monitor-helper.h	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/flow-monitor/helper/flow-monitor-helper.h	2025-03-09 16:55:49.379371200 -0700
@@ -23,8 +23,8 @@
 class Ipv6FlowClassifier;
 
 /**
- * \ingroup flow-monitor
- * \brief Helper to enable IP flow monitoring on a set of Nodes
+ * @ingroup flow-monitor
+ * @brief Helper to enable IP flow monitoring on a set of Nodes
  */
 class FlowMonitorHelper
 {
@@ -37,54 +37,54 @@
     FlowMonitorHelper& operator=(const FlowMonitorHelper&) = delete;
 
     /**
-     * \brief Set an attribute for the to-be-created FlowMonitor object
-     * \param n1 attribute name
-     * \param v1 attribute value
+     * @brief Set an attribute for the to-be-created FlowMonitor object
+     * @param n1 attribute name
+     * @param v1 attribute value
      */
     void SetMonitorAttribute(std::string n1, const AttributeValue& v1);
 
     /**
-     * \brief Enable flow monitoring on a set of nodes
-     * \param nodes A NodeContainer holding the set of nodes to work with.
-     * \returns a pointer to the FlowMonitor object
+     * @brief Enable flow monitoring on a set of nodes
+     * @param nodes A NodeContainer holding the set of nodes to work with.
+     * @returns a pointer to the FlowMonitor object
      */
     Ptr<FlowMonitor> Install(NodeContainer nodes);
     /**
-     * \brief Enable flow monitoring on a single node
-     * \param node A Ptr<Node> to the node on which to enable flow monitoring.
-     * \returns a pointer to the FlowMonitor object
+     * @brief Enable flow monitoring on a single node
+     * @param node A Ptr<Node> to the node on which to enable flow monitoring.
+     * @returns a pointer to the FlowMonitor object
      */
     Ptr<FlowMonitor> Install(Ptr<Node> node);
     /**
-     * \brief Enable flow monitoring on all nodes
-     * \returns a pointer to the FlowMonitor object
+     * @brief Enable flow monitoring on all nodes
+     * @returns a pointer to the FlowMonitor object
      */
     Ptr<FlowMonitor> InstallAll();
 
     /**
-     * \brief Retrieve the FlowMonitor object created by the Install* methods
-     * \returns a pointer to the FlowMonitor object
+     * @brief Retrieve the FlowMonitor object created by the Install* methods
+     * @returns a pointer to the FlowMonitor object
      */
     Ptr<FlowMonitor> GetMonitor();
 
     /**
-     * \brief Retrieve the FlowClassifier object for IPv4 created by the Install* methods
-     * \returns a pointer to the FlowClassifier object
+     * @brief Retrieve the FlowClassifier object for IPv4 created by the Install* methods
+     * @returns a pointer to the FlowClassifier object
      */
     Ptr<FlowClassifier> GetClassifier();
 
     /**
-     * \brief Retrieve the FlowClassifier object for IPv6 created by the Install* methods
-     * \returns a pointer to the FlowClassifier object
+     * @brief Retrieve the FlowClassifier object for IPv6 created by the Install* methods
+     * @returns a pointer to the FlowClassifier object
      */
     Ptr<FlowClassifier> GetClassifier6();
 
     /**
      * Serializes the results to an std::ostream in XML format
-     * \param os the output stream
-     * \param indent number of spaces to use as base indentation level
-     * \param enableHistograms if true, include also the histograms in the output
-     * \param enableProbes if true, include also the per-probe/flow pair statistics in the output
+     * @param os the output stream
+     * @param indent number of spaces to use as base indentation level
+     * @param enableHistograms if true, include also the histograms in the output
+     * @param enableProbes if true, include also the per-probe/flow pair statistics in the output
      */
     void SerializeToXmlStream(std::ostream& os,
                               uint16_t indent,
@@ -93,18 +93,18 @@
 
     /**
      * Same as SerializeToXmlStream, but returns the output as a std::string
-     * \param indent number of spaces to use as base indentation level
-     * \param enableHistograms if true, include also the histograms in the output
-     * \param enableProbes if true, include also the per-probe/flow pair statistics in the output
-     * \return the XML output as string
+     * @param indent number of spaces to use as base indentation level
+     * @param enableHistograms if true, include also the histograms in the output
+     * @param enableProbes if true, include also the per-probe/flow pair statistics in the output
+     * @return the XML output as string
      */
     std::string SerializeToXmlString(uint16_t indent, bool enableHistograms, bool enableProbes);
 
     /**
      * Same as SerializeToXmlStream, but writes to a file instead
-     * \param fileName name or path of the output file that will be created
-     * \param enableHistograms if true, include also the histograms in the output
-     * \param enableProbes if true, include also the per-probe/flow pair statistics in the output
+     * @param fileName name or path of the output file that will be created
+     * @param enableHistograms if true, include also the histograms in the output
+     * @param enableProbes if true, include also the per-probe/flow pair statistics in the output
      */
     void SerializeToXmlFile(std::string fileName, bool enableHistograms, bool enableProbes);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/flow-monitor/model/flow-classifier.h ns-3.44/src/flow-monitor/model/flow-classifier.h
--- ns-3.43/src/flow-monitor/model/flow-classifier.h	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/flow-monitor/model/flow-classifier.h	2025-03-09 16:55:49.379371200 -0700
@@ -17,18 +17,18 @@
 {
 
 /**
- * \ingroup flow-monitor
- * \brief Abstract identifier of a packet flow
+ * @ingroup flow-monitor
+ * @brief Abstract identifier of a packet flow
  */
 typedef uint32_t FlowId;
 
 /**
- * \ingroup flow-monitor
- * \brief Abstract identifier of a packet within a flow
+ * @ingroup flow-monitor
+ * @brief Abstract identifier of a packet within a flow
  */
 typedef uint32_t FlowPacketId;
 
-/// \ingroup flow-monitor
+/// @ingroup flow-monitor
 /// Provides a method to translate raw packet data into abstract
 /// `flow identifier` and `packet identifier` parameters.  These
 /// identifiers are unsigned 32-bit integers that uniquely identify a
@@ -53,19 +53,19 @@
     FlowClassifier& operator=(const FlowClassifier&) = delete;
 
     /// Serializes the results to an std::ostream in XML format
-    /// \param os the output stream
-    /// \param indent number of spaces to use as base indentation level
+    /// @param os the output stream
+    /// @param indent number of spaces to use as base indentation level
     virtual void SerializeToXmlStream(std::ostream& os, uint16_t indent) const = 0;
 
   protected:
     /// Returns a new, unique Flow Identifier
-    /// \returns a new FlowId
+    /// @returns a new FlowId
     FlowId GetNewFlowId();
 
     ///
-    /// \brief Add a number of spaces for indentation purposes.
-    /// \param os The stream to write to.
-    /// \param level The number of spaces to add.
+    /// @brief Add a number of spaces for indentation purposes.
+    /// @param os The stream to write to.
+    /// @param level The number of spaces to add.
     void Indent(std::ostream& os, uint16_t level) const;
 };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/flow-monitor/model/flow-monitor.cc ns-3.44/src/flow-monitor/model/flow-monitor.cc
--- ns-3.43/src/flow-monitor/model/flow-monitor.cc	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/flow-monitor/model/flow-monitor.cc	2025-03-09 16:55:49.379371200 -0700
@@ -37,12 +37,12 @@
                 "MaxPerHopDelay",
                 ("The maximum per-hop delay that should be considered.  "
                  "Packets still not received after this delay are to be considered lost."),
-                TimeValue(Seconds(10.0)),
+                TimeValue(Seconds(10)),
                 MakeTimeAccessor(&FlowMonitor::m_maxPerHopDelay),
                 MakeTimeChecker())
             .AddAttribute("StartTime",
                           ("The time when the monitoring starts."),
-                          TimeValue(Seconds(0.0)),
+                          TimeValue(Seconds(0)),
                           MakeTimeAccessor(&FlowMonitor::Start),
                           MakeTimeChecker())
             .AddAttribute("DelayBinWidth",
@@ -116,7 +116,7 @@
         ref.jitterSum = Seconds(0);
         ref.lastDelay = Seconds(0);
         ref.maxDelay = Seconds(0);
-        ref.minDelay = Seconds(std::numeric_limits<double>::max());
+        ref.minDelay = Time::Max();
         ref.txBytes = 0;
         ref.rxBytes = 0;
         ref.txPackets = 0;
@@ -225,7 +225,7 @@
     if (stats.rxPackets > 0)
     {
         Time jitter = stats.lastDelay - delay;
-        if (jitter > Seconds(0))
+        if (jitter.IsStrictlyPositive())
         {
             stats.jitterSum += jitter;
             stats.jitterHistogram.AddValue(jitter.GetSeconds());
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/flow-monitor/model/flow-monitor.h ns-3.44/src/flow-monitor/model/flow-monitor.h
--- ns-3.43/src/flow-monitor/model/flow-monitor.h	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/flow-monitor/model/flow-monitor.h	2025-03-09 16:55:49.379371200 -0700
@@ -25,13 +25,13 @@
 {
 
 /**
- * \defgroup flow-monitor Flow Monitor
- * \brief  Collect and store performance data from a simulation
+ * @defgroup flow-monitor Flow Monitor
+ * @brief  Collect and store performance data from a simulation
  */
 
 /**
- * \ingroup flow-monitor
- * \brief An object that monitors and reports back packet flows observed during a simulation
+ * @ingroup flow-monitor
+ * @brief An object that monitors and reports back packet flows observed during a simulation
  *
  * The FlowMonitor class is responsible for coordinating efforts
  * regarding probes, and collects end-to-end flow statistics.
@@ -40,7 +40,7 @@
 class FlowMonitor : public Object
 {
   public:
-    /// \brief Structure that represents the measured metrics of an individual packet flow
+    /// @brief Structure that represents the measured metrics of an individual packet flow
     struct FlowStats
     {
         /// Contains the absolute time when the first packet in the flow
@@ -133,24 +133,24 @@
 
     // --- basic methods ---
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
     FlowMonitor();
 
     /// Add a FlowClassifier to be used by the flow monitor.
-    /// \param classifier the FlowClassifier
+    /// @param classifier the FlowClassifier
     void AddFlowClassifier(Ptr<FlowClassifier> classifier);
 
     /// Set the time, counting from the current time, from which to start monitoring flows.
     /// This method overwrites any previous calls to Start()
-    /// \param time delta time to start
+    /// @param time delta time to start
     void Start(const Time& time);
     /// Set the time, counting from the current time, from which to stop monitoring flows.
     /// This method overwrites any previous calls to Stop()
-    /// \param time delta time to stop
+    /// @param time delta time to stop
     void Stop(const Time& time);
     /// Begin monitoring flows *right now*
     void StartRightNow();
@@ -161,48 +161,48 @@
     /// Register a new FlowProbe that will begin monitoring and report
     /// events to this monitor.  This method is normally only used by
     /// FlowProbe implementations.
-    /// \param probe the probe to add
+    /// @param probe the probe to add
     void AddProbe(Ptr<FlowProbe> probe);
 
     /// FlowProbe implementations are supposed to call this method to
     /// report that a new packet was transmitted (but keep in mind the
     /// distinction between a new packet entering the system and a
     /// packet that is already known and is only being forwarded).
-    /// \param probe the reporting probe
-    /// \param flowId flow identification
-    /// \param packetId Packet ID
-    /// \param packetSize packet size
+    /// @param probe the reporting probe
+    /// @param flowId flow identification
+    /// @param packetId Packet ID
+    /// @param packetSize packet size
     void ReportFirstTx(Ptr<FlowProbe> probe,
                        FlowId flowId,
                        FlowPacketId packetId,
                        uint32_t packetSize);
     /// FlowProbe implementations are supposed to call this method to
     /// report that a known packet is being forwarded.
-    /// \param probe the reporting probe
-    /// \param flowId flow identification
-    /// \param packetId Packet ID
-    /// \param packetSize packet size
+    /// @param probe the reporting probe
+    /// @param flowId flow identification
+    /// @param packetId Packet ID
+    /// @param packetSize packet size
     void ReportForwarding(Ptr<FlowProbe> probe,
                           FlowId flowId,
                           FlowPacketId packetId,
                           uint32_t packetSize);
     /// FlowProbe implementations are supposed to call this method to
     /// report that a known packet is being received.
-    /// \param probe the reporting probe
-    /// \param flowId flow identification
-    /// \param packetId Packet ID
-    /// \param packetSize packet size
+    /// @param probe the reporting probe
+    /// @param flowId flow identification
+    /// @param packetId Packet ID
+    /// @param packetSize packet size
     void ReportLastRx(Ptr<FlowProbe> probe,
                       FlowId flowId,
                       FlowPacketId packetId,
                       uint32_t packetSize);
     /// FlowProbe implementations are supposed to call this method to
     /// report that a known packet is being dropped due to some reason.
-    /// \param probe the reporting probe
-    /// \param flowId flow identification
-    /// \param packetId Packet ID
-    /// \param packetSize packet size
-    /// \param reasonCode drop reason code
+    /// @param probe the reporting probe
+    /// @param flowId flow identification
+    /// @param packetId Packet ID
+    /// @param packetSize packet size
+    /// @param reasonCode drop reason code
     void ReportDrop(Ptr<FlowProbe> probe,
                     FlowId flowId,
                     FlowPacketId packetId,
@@ -215,7 +215,7 @@
     /// Check right now for packets that appear to be lost, considering
     /// packets as lost if not seen in the network for a time larger
     /// than maxDelay
-    /// \param maxDelay the max delay for a packet
+    /// @param maxDelay the max delay for a packet
     void CheckForLostPackets(Time maxDelay);
 
     // --- methods to get the results ---
@@ -237,34 +237,34 @@
     /// FlowMonitor has not stopped monitoring yet, you should call
     /// CheckForLostPackets() to make sure all possibly lost packets are
     /// accounted for.
-    /// \returns the flows statistics
+    /// @returns the flows statistics
     const FlowStatsContainer& GetFlowStats() const;
 
     /// Get a list of all FlowProbe's associated with this FlowMonitor
-    /// \returns a list of all the probes
+    /// @returns a list of all the probes
     const FlowProbeContainer& GetAllProbes() const;
 
     /// Serializes the results to an std::ostream in XML format
-    /// \param os the output stream
-    /// \param indent number of spaces to use as base indentation level
-    /// \param enableHistograms if true, include also the histograms in the output
-    /// \param enableProbes if true, include also the per-probe/flow pair statistics in the output
+    /// @param os the output stream
+    /// @param indent number of spaces to use as base indentation level
+    /// @param enableHistograms if true, include also the histograms in the output
+    /// @param enableProbes if true, include also the per-probe/flow pair statistics in the output
     void SerializeToXmlStream(std::ostream& os,
                               uint16_t indent,
                               bool enableHistograms,
                               bool enableProbes);
 
     /// Same as SerializeToXmlStream, but returns the output as a std::string
-    /// \param indent number of spaces to use as base indentation level
-    /// \param enableHistograms if true, include also the histograms in the output
-    /// \param enableProbes if true, include also the per-probe/flow pair statistics in the output
-    /// \return the XML output as string
+    /// @param indent number of spaces to use as base indentation level
+    /// @param enableHistograms if true, include also the histograms in the output
+    /// @param enableProbes if true, include also the per-probe/flow pair statistics in the output
+    /// @return the XML output as string
     std::string SerializeToXmlString(uint16_t indent, bool enableHistograms, bool enableProbes);
 
     /// Same as SerializeToXmlStream, but writes to a file instead
-    /// \param fileName name or path of the output file that will be created
-    /// \param enableHistograms if true, include also the histograms in the output
-    /// \param enableProbes if true, include also the per-probe/flow pair statistics in the output
+    /// @param fileName name or path of the output file that will be created
+    /// @param enableHistograms if true, include also the histograms in the output
+    /// @param enableProbes if true, include also the per-probe/flow pair statistics in the output
     void SerializeToXmlFile(std::string fileName, bool enableHistograms, bool enableProbes);
 
     /// Reset all the statistics
@@ -305,8 +305,8 @@
     Time m_flowInterruptionsMinTime;    //!< Flow interruptions minimum time
 
     /// Get the stats for a given flow
-    /// \param flowId the Flow identification
-    /// \returns the stats of the flow
+    /// @param flowId the Flow identification
+    /// @returns the stats of the flow
     FlowStats& GetStatsForFlow(FlowId flowId);
 
     /// Periodic function to check for lost packets and prune statistics
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/flow-monitor/model/flow-probe.h ns-3.44/src/flow-monitor/model/flow-probe.h
--- ns-3.43/src/flow-monitor/model/flow-probe.h	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/flow-monitor/model/flow-probe.h	2025-03-09 16:55:49.379371200 -0700
@@ -30,7 +30,7 @@
 {
   protected:
     /// Constructor
-    /// \param flowMonitor the FlowMonitor this probe is associated with
+    /// @param flowMonitor the FlowMonitor this probe is associated with
     FlowProbe(Ptr<FlowMonitor> flowMonitor);
     void DoDispose() override;
 
@@ -42,14 +42,14 @@
     FlowProbe& operator=(const FlowProbe&) = delete;
 
     /// Register this type.
-    /// \return The TypeId.
+    /// @return The TypeId.
     static TypeId GetTypeId();
 
     /// Structure to hold the statistics of a flow
     struct FlowStats
     {
         FlowStats()
-            : delayFromFirstProbeSum(Seconds(0)),
+            : delayFromFirstProbeSum(),
               bytes(0),
               packets(0)
         {
@@ -72,26 +72,26 @@
     typedef std::map<FlowId, FlowStats> Stats;
 
     /// Add a packet data to the flow stats
-    /// \param flowId the flow Identifier
-    /// \param packetSize the packet size
-    /// \param delayFromFirstProbe packet delay
+    /// @param flowId the flow Identifier
+    /// @param packetSize the packet size
+    /// @param delayFromFirstProbe packet delay
     void AddPacketStats(FlowId flowId, uint32_t packetSize, Time delayFromFirstProbe);
     /// Add a packet drop data to the flow stats
-    /// \param flowId the flow Identifier
-    /// \param packetSize the packet size
-    /// \param reasonCode reason code for the drop
+    /// @param flowId the flow Identifier
+    /// @param packetSize the packet size
+    /// @param reasonCode reason code for the drop
     void AddPacketDropStats(FlowId flowId, uint32_t packetSize, uint32_t reasonCode);
 
     /// Get the partial flow statistics stored in this probe.  With this
     /// information you can, for example, find out what is the delay
     /// from the first probe to this one.
-    /// \returns the partial flow statistics
+    /// @returns the partial flow statistics
     Stats GetStats() const;
 
     /// Serializes the results to an std::ostream in XML format
-    /// \param os the output stream
-    /// \param indent number of spaces to use as base indentation level
-    /// \param index FlowProbe index
+    /// @param os the output stream
+    /// @param indent number of spaces to use as base indentation level
+    /// @param index FlowProbe index
     void SerializeToXmlStream(std::ostream& os, uint16_t indent, uint32_t index) const;
 
   protected:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/flow-monitor/model/ipv4-flow-classifier.h ns-3.44/src/flow-monitor/model/ipv4-flow-classifier.h
--- ns-3.43/src/flow-monitor/model/ipv4-flow-classifier.h	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/flow-monitor/model/ipv4-flow-classifier.h	2025-03-09 16:55:49.379371200 -0700
@@ -40,24 +40,24 @@
 
     Ipv4FlowClassifier();
 
-    /// \brief try to classify the packet into flow-id and packet-id
+    /// @brief try to classify the packet into flow-id and packet-id
     ///
     /// \warning: it must be called only once per packet, from SendOutgoingLogger.
     ///
-    /// \return true if the packet was classified, false if not (i.e. it
+    /// @return true if the packet was classified, false if not (i.e. it
     /// does not appear to be part of a flow).
-    /// \param ipHeader packet's IP header
-    /// \param ipPayload packet's IP payload
-    /// \param out_flowId packet's FlowId
-    /// \param out_packetId packet's identifier
+    /// @param ipHeader packet's IP header
+    /// @param ipPayload packet's IP payload
+    /// @param out_flowId packet's FlowId
+    /// @param out_packetId packet's identifier
     bool Classify(const Ipv4Header& ipHeader,
                   Ptr<const Packet> ipPayload,
                   uint32_t* out_flowId,
                   uint32_t* out_packetId);
 
     /// Searches for the FiveTuple corresponding to the given flowId
-    /// \param flowId the FlowId to search for
-    /// \returns the FiveTuple corresponding to flowId
+    /// @param flowId the FlowId to search for
+    /// @returns the FiveTuple corresponding to flowId
     FiveTuple FindFlow(FlowId flowId) const;
 
     /// Comparator used to sort the vector of DSCP values
@@ -65,18 +65,18 @@
     {
       public:
         /// Comparator function
-        /// \param left left operand
-        /// \param right right operand
-        /// \return true if left DSCP is greater than right DSCP
+        /// @param left left operand
+        /// @param right right operand
+        /// @return true if left DSCP is greater than right DSCP
         bool operator()(std::pair<Ipv4Header::DscpType, uint32_t> left,
                         std::pair<Ipv4Header::DscpType, uint32_t> right);
     };
 
-    /// \brief get the DSCP values of the packets belonging to the flow with the
+    /// @brief get the DSCP values of the packets belonging to the flow with the
     /// given FlowId, sorted in decreasing order of number of packets seen with
     /// that DSCP value
-    /// \param flowId the identifier of the flow of interest
-    /// \returns the vector of DSCP values
+    /// @param flowId the identifier of the flow of interest
+    /// @returns the vector of DSCP values
     std::vector<std::pair<Ipv4Header::DscpType, uint32_t>> GetDscpCounts(FlowId flowId) const;
 
     void SerializeToXmlStream(std::ostream& os, uint16_t indent) const override;
@@ -91,20 +91,20 @@
 };
 
 /**
- * \brief Less than operator.
+ * @brief Less than operator.
  *
- * \param t1 the first operand
- * \param t2 the first operand
- * \returns true if the operands are equal
+ * @param t1 the first operand
+ * @param t2 the first operand
+ * @returns true if the operands are equal
  */
 bool operator<(const Ipv4FlowClassifier::FiveTuple& t1, const Ipv4FlowClassifier::FiveTuple& t2);
 
 /**
- * \brief Equal to operator.
+ * @brief Equal to operator.
  *
- * \param t1 the first operand
- * \param t2 the first operand
- * \returns true if the operands are equal
+ * @param t1 the first operand
+ * @param t2 the first operand
+ * @returns true if the operands are equal
  */
 bool operator==(const Ipv4FlowClassifier::FiveTuple& t1, const Ipv4FlowClassifier::FiveTuple& t2);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/flow-monitor/model/ipv4-flow-probe.cc ns-3.44/src/flow-monitor/model/ipv4-flow-probe.cc
--- ns-3.43/src/flow-monitor/model/ipv4-flow-probe.cc	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/flow-monitor/model/ipv4-flow-probe.cc	2025-03-09 16:55:49.379371200 -0700
@@ -28,9 +28,9 @@
 //////////////////////////////////////
 
 /**
- * \ingroup flow-monitor
+ * @ingroup flow-monitor
  *
- * \brief Tag used to allow a fast identification of the packet
+ * @brief Tag used to allow a fast identification of the packet
  *
  * This tag is added by FlowMonitor when a packet is seen for
  * the first time, and it is then used to classify the packet in
@@ -40,8 +40,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -51,12 +51,12 @@
     void Print(std::ostream& os) const override;
     Ipv4FlowProbeTag();
     /**
-     * \brief Constructor
-     * \param flowId the flow identifier
-     * \param packetId the packet identifier
-     * \param packetSize the packet size
-     * \param src packet source address
-     * \param dst packet destination address
+     * @brief Constructor
+     * @param flowId the flow identifier
+     * @param packetId the packet identifier
+     * @param packetSize the packet size
+     * @param src packet source address
+     * @param dst packet destination address
      */
     Ipv4FlowProbeTag(uint32_t flowId,
                      uint32_t packetId,
@@ -64,44 +64,44 @@
                      Ipv4Address src,
                      Ipv4Address dst);
     /**
-     * \brief Set the flow identifier
-     * \param flowId the flow identifier
+     * @brief Set the flow identifier
+     * @param flowId the flow identifier
      */
     void SetFlowId(uint32_t flowId);
     /**
-     * \brief Set the packet identifier
-     * \param packetId the packet identifier
+     * @brief Set the packet identifier
+     * @param packetId the packet identifier
      */
     void SetPacketId(uint32_t packetId);
     /**
-     * \brief Set the packet size
-     * \param packetSize the packet size
+     * @brief Set the packet size
+     * @param packetSize the packet size
      */
     void SetPacketSize(uint32_t packetSize);
     /**
-     * \brief Set the flow identifier
-     * \returns the flow identifier
+     * @brief Set the flow identifier
+     * @returns the flow identifier
      */
     uint32_t GetFlowId() const;
     /**
-     * \brief Set the packet identifier
-     * \returns the packet identifier
+     * @brief Set the packet identifier
+     * @returns the packet identifier
      */
     uint32_t GetPacketId() const;
     /**
-     * \brief Get the packet size
-     * \returns the packet size
+     * @brief Get the packet size
+     * @returns the packet size
      */
     uint32_t GetPacketSize() const;
     /**
-     * \brief Checks if the addresses stored in tag are matching
+     * @brief Checks if the addresses stored in tag are matching
      * the arguments.
      *
      * This check is important for IP over IP encapsulation.
      *
-     * \param src Source address.
-     * \param dst Destination address.
-     * \returns True if the addresses are matching.
+     * @param src Source address.
+     * @param dst Destination address.
+     * @returns True if the addresses are matching.
      */
     bool IsSrcDstValid(Ipv4Address src, Ipv4Address dst) const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/flow-monitor/model/ipv4-flow-probe.h ns-3.44/src/flow-monitor/model/ipv4-flow-probe.h
--- ns-3.43/src/flow-monitor/model/ipv4-flow-probe.h	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/flow-monitor/model/ipv4-flow-probe.h	2025-03-09 16:55:49.379371200 -0700
@@ -21,8 +21,8 @@
 class FlowMonitor;
 class Node;
 
-/// \ingroup flow-monitor
-/// \brief Class that monitors flows at the IPv4 layer of a Node
+/// @ingroup flow-monitor
+/// @brief Class that monitors flows at the IPv4 layer of a Node
 ///
 /// For each node in the simulation, one instance of the class
 /// Ipv4FlowProbe is created to monitor that node.  Ipv4FlowProbe
@@ -31,18 +31,18 @@
 class Ipv4FlowProbe : public FlowProbe
 {
   public:
-    /// \brief Constructor
-    /// \param monitor the FlowMonitor this probe is associated with
-    /// \param classifier the Ipv4FlowClassifier this probe is associated with
-    /// \param node the Node this probe is associated with
+    /// @brief Constructor
+    /// @param monitor the FlowMonitor this probe is associated with
+    /// @param classifier the Ipv4FlowClassifier this probe is associated with
+    /// @param node the Node this probe is associated with
     Ipv4FlowProbe(Ptr<FlowMonitor> monitor, Ptr<Ipv4FlowClassifier> classifier, Ptr<Node> node);
     ~Ipv4FlowProbe() override;
 
     /// Register this type.
-    /// \return The TypeId.
+    /// @return The TypeId.
     static TypeId GetTypeId();
 
-    /// \brief enumeration of possible reasons why a packet may be dropped
+    /// @brief enumeration of possible reasons why a packet may be dropped
     enum DropReason
     {
         /// Packet dropped due to missing route to the destination
@@ -75,40 +75,40 @@
 
   private:
     /// Log a packet being sent
-    /// \param ipHeader IP header
-    /// \param ipPayload IP payload
-    /// \param interface outgoing interface
+    /// @param ipHeader IP header
+    /// @param ipPayload IP payload
+    /// @param interface outgoing interface
     void SendOutgoingLogger(const Ipv4Header& ipHeader,
                             Ptr<const Packet> ipPayload,
                             uint32_t interface);
     /// Log a packet being forwarded
-    /// \param ipHeader IP header
-    /// \param ipPayload IP payload
-    /// \param interface incoming interface
+    /// @param ipHeader IP header
+    /// @param ipPayload IP payload
+    /// @param interface incoming interface
     void ForwardLogger(const Ipv4Header& ipHeader, Ptr<const Packet> ipPayload, uint32_t interface);
     /// Log a packet being received by the destination
-    /// \param ipHeader IP header
-    /// \param ipPayload IP payload
-    /// \param interface incoming interface
+    /// @param ipHeader IP header
+    /// @param ipPayload IP payload
+    /// @param interface incoming interface
     void ForwardUpLogger(const Ipv4Header& ipHeader,
                          Ptr<const Packet> ipPayload,
                          uint32_t interface);
     /// Log a packet being dropped
-    /// \param ipHeader IP header
-    /// \param ipPayload IP payload
-    /// \param reason drop reason
-    /// \param ipv4 pointer to the IP object dropping the packet
-    /// \param ifIndex interface index
+    /// @param ipHeader IP header
+    /// @param ipPayload IP payload
+    /// @param reason drop reason
+    /// @param ipv4 pointer to the IP object dropping the packet
+    /// @param ifIndex interface index
     void DropLogger(const Ipv4Header& ipHeader,
                     Ptr<const Packet> ipPayload,
                     Ipv4L3Protocol::DropReason reason,
                     Ptr<Ipv4> ipv4,
                     uint32_t ifIndex);
     /// Log a packet being dropped by a queue
-    /// \param ipPayload IP payload
+    /// @param ipPayload IP payload
     void QueueDropLogger(Ptr<const Packet> ipPayload);
     /// Log a packet being dropped by a queue disc
-    /// \param item queue disc item
+    /// @param item queue disc item
     void QueueDiscDropLogger(Ptr<const QueueDiscItem> item);
 
     Ptr<Ipv4FlowClassifier> m_classifier; //!< the Ipv4FlowClassifier this probe is associated with
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/flow-monitor/model/ipv6-flow-classifier.h ns-3.44/src/flow-monitor/model/ipv6-flow-classifier.h
--- ns-3.43/src/flow-monitor/model/ipv6-flow-classifier.h	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/flow-monitor/model/ipv6-flow-classifier.h	2025-03-09 16:55:49.379371200 -0700
@@ -41,24 +41,24 @@
 
     Ipv6FlowClassifier();
 
-    /// \brief try to classify the packet into flow-id and packet-id
+    /// @brief try to classify the packet into flow-id and packet-id
     ///
     /// \warning: it must be called only once per packet, from SendOutgoingLogger.
     ///
-    /// \return true if the packet was classified, false if not (i.e. it
+    /// @return true if the packet was classified, false if not (i.e. it
     /// does not appear to be part of a flow).
-    /// \param ipHeader packet's IP header
-    /// \param ipPayload packet's IP payload
-    /// \param out_flowId packet's FlowId
-    /// \param out_packetId packet's identifier
+    /// @param ipHeader packet's IP header
+    /// @param ipPayload packet's IP payload
+    /// @param out_flowId packet's FlowId
+    /// @param out_packetId packet's identifier
     bool Classify(const Ipv6Header& ipHeader,
                   Ptr<const Packet> ipPayload,
                   uint32_t* out_flowId,
                   uint32_t* out_packetId);
 
     /// Searches for the FiveTuple corresponding to the given flowId
-    /// \param flowId the FlowId to search for
-    /// \returns the FiveTuple corresponding to flowId
+    /// @param flowId the FlowId to search for
+    /// @returns the FiveTuple corresponding to flowId
     FiveTuple FindFlow(FlowId flowId) const;
 
     /// Comparator used to sort the vector of DSCP values
@@ -66,18 +66,18 @@
     {
       public:
         /// Comparator function
-        /// \param left left operand
-        /// \param right right operand
-        /// \return true if left DSCP is greater than right DSCP
+        /// @param left left operand
+        /// @param right right operand
+        /// @return true if left DSCP is greater than right DSCP
         bool operator()(std::pair<Ipv6Header::DscpType, uint32_t> left,
                         std::pair<Ipv6Header::DscpType, uint32_t> right);
     };
 
-    /// \brief get the DSCP values of the packets belonging to the flow with the
+    /// @brief get the DSCP values of the packets belonging to the flow with the
     /// given FlowId, sorted in decreasing order of number of packets seen with
     /// that DSCP value
-    /// \param flowId the identifier of the flow of interest
-    /// \returns the vector of DSCP values
+    /// @param flowId the identifier of the flow of interest
+    /// @returns the vector of DSCP values
     std::vector<std::pair<Ipv6Header::DscpType, uint32_t>> GetDscpCounts(FlowId flowId) const;
 
     void SerializeToXmlStream(std::ostream& os, uint16_t indent) const override;
@@ -92,20 +92,20 @@
 };
 
 /**
- * \brief Less than operator.
+ * @brief Less than operator.
  *
- * \param t1 the first operand
- * \param t2 the first operand
- * \returns true if the operands are equal
+ * @param t1 the first operand
+ * @param t2 the first operand
+ * @returns true if the operands are equal
  */
 bool operator<(const Ipv6FlowClassifier::FiveTuple& t1, const Ipv6FlowClassifier::FiveTuple& t2);
 
 /**
- * \brief Equal to operator.
+ * @brief Equal to operator.
  *
- * \param t1 the first operand
- * \param t2 the first operand
- * \returns true if the operands are equal
+ * @param t1 the first operand
+ * @param t2 the first operand
+ * @returns true if the operands are equal
  */
 bool operator==(const Ipv6FlowClassifier::FiveTuple& t1, const Ipv6FlowClassifier::FiveTuple& t2);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/flow-monitor/model/ipv6-flow-probe.cc ns-3.44/src/flow-monitor/model/ipv6-flow-probe.cc
--- ns-3.43/src/flow-monitor/model/ipv6-flow-probe.cc	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/flow-monitor/model/ipv6-flow-probe.cc	2025-03-09 16:55:49.379371200 -0700
@@ -29,9 +29,9 @@
 //////////////////////////////////////
 
 /**
- * \ingroup flow-monitor
+ * @ingroup flow-monitor
  *
- * \brief Tag used to allow a fast identification of the packet
+ * @brief Tag used to allow a fast identification of the packet
  *
  * This tag is added by FlowMonitor when a packet is seen for
  * the first time, and it is then used to classify the packet in
@@ -41,8 +41,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -52,40 +52,40 @@
     void Print(std::ostream& os) const override;
     Ipv6FlowProbeTag();
     /**
-     * \brief Constructor
-     * \param flowId the flow identifier
-     * \param packetId the packet identifier
-     * \param packetSize the packet size
+     * @brief Constructor
+     * @param flowId the flow identifier
+     * @param packetId the packet identifier
+     * @param packetSize the packet size
      */
     Ipv6FlowProbeTag(uint32_t flowId, uint32_t packetId, uint32_t packetSize);
     /**
-     * \brief Set the flow identifier
-     * \param flowId the flow identifier
+     * @brief Set the flow identifier
+     * @param flowId the flow identifier
      */
     void SetFlowId(uint32_t flowId);
     /**
-     * \brief Set the packet identifier
-     * \param packetId the packet identifier
+     * @brief Set the packet identifier
+     * @param packetId the packet identifier
      */
     void SetPacketId(uint32_t packetId);
     /**
-     * \brief Set the packet size
-     * \param packetSize the packet size
+     * @brief Set the packet size
+     * @param packetSize the packet size
      */
     void SetPacketSize(uint32_t packetSize);
     /**
-     * \brief Set the flow identifier
-     * \returns the flow identifier
+     * @brief Set the flow identifier
+     * @returns the flow identifier
      */
     uint32_t GetFlowId() const;
     /**
-     * \brief Set the packet identifier
-     * \returns the packet identifier
+     * @brief Set the packet identifier
+     * @returns the packet identifier
      */
     uint32_t GetPacketId() const;
     /**
-     * \brief Get the packet size
-     * \returns the packet size
+     * @brief Get the packet size
+     * @returns the packet size
      */
     uint32_t GetPacketSize() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/flow-monitor/model/ipv6-flow-probe.h ns-3.44/src/flow-monitor/model/ipv6-flow-probe.h
--- ns-3.43/src/flow-monitor/model/ipv6-flow-probe.h	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/flow-monitor/model/ipv6-flow-probe.h	2025-03-09 16:55:49.379371200 -0700
@@ -22,8 +22,8 @@
 class FlowMonitor;
 class Node;
 
-/// \ingroup flow-monitor
-/// \brief Class that monitors flows at the IPv6 layer of a Node
+/// @ingroup flow-monitor
+/// @brief Class that monitors flows at the IPv6 layer of a Node
 ///
 /// For each node in the simulation, one instance of the class
 /// Ipv4FlowProbe is created to monitor that node.  Ipv4FlowProbe
@@ -32,18 +32,18 @@
 class Ipv6FlowProbe : public FlowProbe
 {
   public:
-    /// \brief Constructor
-    /// \param monitor the FlowMonitor this probe is associated with
-    /// \param classifier the Ipv4FlowClassifier this probe is associated with
-    /// \param node the Node this probe is associated with
+    /// @brief Constructor
+    /// @param monitor the FlowMonitor this probe is associated with
+    /// @param classifier the Ipv4FlowClassifier this probe is associated with
+    /// @param node the Node this probe is associated with
     Ipv6FlowProbe(Ptr<FlowMonitor> monitor, Ptr<Ipv6FlowClassifier> classifier, Ptr<Node> node);
     ~Ipv6FlowProbe() override;
 
     /// Register this type.
-    /// \return The TypeId.
+    /// @return The TypeId.
     static TypeId GetTypeId();
 
-    /// \brief enumeration of possible reasons why a packet may be dropped
+    /// @brief enumeration of possible reasons why a packet may be dropped
     enum DropReason
     {
         /// Packet dropped due to missing route to the destination
@@ -81,40 +81,40 @@
 
   private:
     /// Log a packet being sent
-    /// \param ipHeader IP header
-    /// \param ipPayload IP payload
-    /// \param interface outgoing interface
+    /// @param ipHeader IP header
+    /// @param ipPayload IP payload
+    /// @param interface outgoing interface
     void SendOutgoingLogger(const Ipv6Header& ipHeader,
                             Ptr<const Packet> ipPayload,
                             uint32_t interface);
     /// Log a packet being forwarded
-    /// \param ipHeader IP header
-    /// \param ipPayload IP payload
-    /// \param interface incoming interface
+    /// @param ipHeader IP header
+    /// @param ipPayload IP payload
+    /// @param interface incoming interface
     void ForwardLogger(const Ipv6Header& ipHeader, Ptr<const Packet> ipPayload, uint32_t interface);
     /// Log a packet being received by the destination
-    /// \param ipHeader IP header
-    /// \param ipPayload IP payload
-    /// \param interface incoming interface
+    /// @param ipHeader IP header
+    /// @param ipPayload IP payload
+    /// @param interface incoming interface
     void ForwardUpLogger(const Ipv6Header& ipHeader,
                          Ptr<const Packet> ipPayload,
                          uint32_t interface);
     /// Log a packet being dropped
-    /// \param ipHeader IP header
-    /// \param ipPayload IP payload
-    /// \param reason drop reason
-    /// \param ipv6 pointer to the IP object dropping the packet
-    /// \param ifIndex interface index
+    /// @param ipHeader IP header
+    /// @param ipPayload IP payload
+    /// @param reason drop reason
+    /// @param ipv6 pointer to the IP object dropping the packet
+    /// @param ifIndex interface index
     void DropLogger(const Ipv6Header& ipHeader,
                     Ptr<const Packet> ipPayload,
                     Ipv6L3Protocol::DropReason reason,
                     Ptr<Ipv6> ipv6,
                     uint32_t ifIndex);
     /// Log a packet being dropped by a queue
-    /// \param ipPayload IP payload
+    /// @param ipPayload IP payload
     void QueueDropLogger(Ptr<const Packet> ipPayload);
     /// Log a packet being dropped by a queue disc
-    /// \param item queue disc item
+    /// @param item queue disc item
     void QueueDiscDropLogger(Ptr<const QueueDiscItem> item);
 
     Ptr<Ipv6FlowClassifier> m_classifier; //!< the Ipv6FlowClassifier this probe is associated with
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/CMakeLists.txt ns-3.44/src/internet/CMakeLists.txt
--- ns-3.43/src/internet/CMakeLists.txt	2024-10-09 16:41:09.880655800 -0700
+++ ns-3.44/src/internet/CMakeLists.txt	2025-03-09 16:55:49.379371200 -0700
@@ -343,4 +343,5 @@
   LIBRARIES_TO_LINK ${libbridge}
                     ${libtraffic-control}
   TEST_SOURCES ${test_sources}
+  GENERATE_EXPORT_HEADER
 )
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/doc/tcp.rst ns-3.44/src/internet/doc/tcp.rst
--- ns-3.43/src/internet/doc/tcp.rst	2024-10-09 16:41:09.880655800 -0700
+++ ns-3.44/src/internet/doc/tcp.rst	2025-03-09 16:55:49.383371000 -0700
@@ -124,8 +124,8 @@
   Address sinkLocalAddress(InetSocketAddress(Ipv4Address::GetAny(), port));
   PacketSinkHelper sinkHelper("ns3::TcpSocketFactory", sinkLocalAddress);
   ApplicationContainer sinkApp = sinkHelper.Install(serverNode);
-  sinkApp.Start(Seconds(1.0));
-  sinkApp.Stop(Seconds(10.0));
+  sinkApp.Start(Seconds(1));
+  sinkApp.Stop(Seconds(10));
 
 Similarly, the below snippet configures OnOffApplication traffic source to use
 TCP::
@@ -1005,7 +1005,7 @@
 
 * ECT flags should be set for SYN, SYN+ACK, ACK and data packets for DCTCP traffic
 * ECT flags should not be set for SYN, SYN+ACK and pure ACK packets, but should be set on data packets for ECN enabled traditional TCP flows
-* ECE should be set only when CE flags are received at receiver and even if sender doesn’t send CWR, receiver should not send ECE if it doesn’t receive packets with CE flags
+* ECE should be set only when CE flags are received at receiver and even if sender doesn't send CWR, receiver should not send ECE if it doesn't receive packets with CE flags
 
 An example program, ``examples/tcp/tcp-validation.cc``, can be used to
 experiment with DCTCP for long-running flows with different bottleneck
@@ -1855,7 +1855,7 @@
       TcpGeneralTest::ConfigureEnvironment();
       SetAppPktCount(20);
       SetMTU(500);
-      SetTransmitStart(Seconds(2.0));
+      SetTransmitStart(Seconds(2));
       SetPropagationDelay(MilliSeconds(50));
   }
 
@@ -1901,7 +1901,7 @@
        Ptr<TcpSocketMsgBase> socket = TcpGeneralTest::CreateReceiverSocket(node);
 
        socket->SetAttribute("RcvBufSize", UintegerValue(0));
-       Simulator::Schedule(Seconds(10.0),
+       Simulator::Schedule(Seconds(10),
                          &TcpZeroWindowTest::IncreaseBufSize, this);
 
        return socket;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/doc/udp.rst ns-3.44/src/internet/doc/udp.rst
--- ns-3.43/src/internet/doc/udp.rst	2024-10-09 16:41:09.880655800 -0700
+++ ns-3.44/src/internet/doc/udp.rst	2025-03-09 16:55:49.383371000 -0700
@@ -66,8 +66,8 @@
   Address sinkLocalAddress(InetSocketAddress(Ipv4Address::GetAny(), port));
   PacketSinkHelper sinkHelper("ns3::UdpSocketFactory", sinkLocalAddress);
   ApplicationContainer sinkApp = sinkHelper.Install(serverNode);
-  sinkApp.Start(Seconds(1.0));
-  sinkApp.Stop(Seconds(10.0));
+  sinkApp.Start(Seconds(1));
+  sinkApp.Stop(Seconds(10));
 
 Similarly, the below snippet configures OnOffApplication traffic source to use
 UDP::
@@ -76,8 +76,8 @@
   OnOffHelper clientHelper("ns3::UdpSocketFactory", Address());
   clientHelper.SetAttribute("Remote", remoteAddress);
   ApplicationContainer clientApps =(clientHelper.Install(clientNode);
-  clientApps.Start(Seconds(2.0));
-  clientApps.Stop(Seconds(9.0));
+  clientApps.Start(Seconds(2));
+  clientApps.Stop(Seconds(9));
 
 For users who wish to have a pointer to the actual socket(so that
 socket operations like ``Bind()``, setting socket options, etc. can be
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/examples/main-simple.cc ns-3.44/src/internet/examples/main-simple.cc
--- ns-3.43/src/internet/examples/main-simple.cc	2024-10-09 16:41:09.880655800 -0700
+++ ns-3.44/src/internet/examples/main-simple.cc	2025-03-09 16:55:49.383371000 -0700
@@ -21,8 +21,8 @@
  * the function is scheduled to send a packet of (size-50) after 0.5s.
  * The process is iterated until the packet size is zero.
  *
- * \param socket output socket
- * \param size packet size
+ * @param socket output socket
+ * @param size packet size
  */
 static void
 GenerateTraffic(Ptr<Socket> socket, int32_t size)
@@ -40,7 +40,7 @@
 
 /**
  * Prints the packets received by a socket
- * \param socket input socket
+ * @param socket input socket
  */
 static void
 SocketPrinter(Ptr<Socket> socket)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/examples/neighbor-cache-dynamic.cc ns-3.44/src/internet/examples/neighbor-cache-dynamic.cc
--- ns-3.43/src/internet/examples/neighbor-cache-dynamic.cc	2024-10-09 16:41:09.880655800 -0700
+++ ns-3.44/src/internet/examples/neighbor-cache-dynamic.cc	2025-03-09 16:55:49.383371000 -0700
@@ -15,7 +15,7 @@
  * add entry to keep the neighbor cache up-to-date.
  *
  * IPv4 Network Topology
- * \verbatim
+ * @verbatim
   n1   n2   n3
   |    |    |
   ===========
@@ -23,7 +23,7 @@
   \endverbatim
  *
  * IPv6 Network Topology
- * \verbatim
+ * @verbatim
   n1   n2   n3
   |    |    |
   ===========
@@ -32,7 +32,7 @@
  *
  * Expected Outputs:
  * IPv4 (default):
- * \verbatim
+ * @verbatim
   ARP Cache of node 0 at time 0
   10.1.1.2 dev 0 lladdr 02-06-00:00:00:00:00:02 STATIC_AUTOGENERATED
   10.1.1.3 dev 0 lladdr 02-06-00:00:00:00:00:03 STATIC_AUTOGENERATED
@@ -69,7 +69,7 @@
   \endverbatim
  *
  * IPv6 (--useIPv6):
- * \verbatim
+ * @verbatim
   NDISC Cache of node 0 at time +0s
   2001:1::200:ff:fe00:2 dev 0 lladdr 02-06-00:00:00:00:00:02 STATIC_AUTOGENERATED
   2001:1::200:ff:fe00:3 dev 0 lladdr 02-06-00:00:00:00:00:03 STATIC_AUTOGENERATED
@@ -261,7 +261,7 @@
         Ipv6RoutingHelper::PrintNeighborCacheAllAt(Seconds(2), outputStream);
     }
 
-    Simulator::Stop(Seconds(10.0));
+    Simulator::Stop(Seconds(10));
     Simulator::Run();
     Simulator::Destroy();
     return 0;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/examples/neighbor-cache-example.cc ns-3.44/src/internet/examples/neighbor-cache-example.cc
--- ns-3.43/src/internet/examples/neighbor-cache-example.cc	2024-10-09 16:41:09.880655800 -0700
+++ ns-3.44/src/internet/examples/neighbor-cache-example.cc	2025-03-09 16:55:49.383371000 -0700
@@ -7,12 +7,12 @@
  */
 
 /**
- * \file
+ * @file
  * Generating neighbor caches in various scopes
  */
 
 /**
- * \file
+ * @file
  *
  * This example shows how to generate neighbor caches in various scopes.
  *
@@ -32,7 +32,7 @@
  * are reduced after pre-generate neighbor caches.
  *
  * IPv4 Network Topology
- * \verbatim
+ * @verbatim
    IPv4 Network Topology
        LAN 10.1.1.0/24
     n0 --------------- n1     n2     n3
@@ -41,7 +41,7 @@
                        LAN 10.1.2.0/24
    \endverbatim
  *
- * \verbatim
+ * @verbatim
    IPv6 Network Topology
       LAN 2001:1::/64
    n0 --------------- n1     n2     n3
@@ -53,7 +53,7 @@
  * Expected Outputs:
  * IPv4 (default):
  * Generate ARP caches for all devices (default) :
- * \verbatim
+ * @verbatim
    ARP Cache of node 0 at time 0
    10.1.1.2 dev 0 lladdr 02-06-00:00:00:00:00:02 STATIC_AUTOGENERATED
    ARP Cache of node 1 at time 0
@@ -69,7 +69,7 @@
    \endverbatim
  *
  * Generate ARP caches for the left channel (--useChannel):
- * \verbatim
+ * @verbatim
    ARP Cache of node 0 at time 0
    10.1.1.2 dev 0 lladdr 02-06-00:00:00:00:00:02 STATIC_AUTOGENERATED
    ARP Cache of node 1 at time 0
@@ -79,7 +79,7 @@
    \endverbatim
  *
  * Generate ARP caches for devices on the right side (--useNetDeviceContainer):
- * \verbatim
+ * @verbatim
    ARP Cache of node 0 at time 0
    ARP Cache of node 1 at time 0
    10.1.2.2 dev 1 lladdr 02-06-00:00:00:00:00:04 STATIC_AUTOGENERATED
@@ -93,7 +93,7 @@
    \endverbatim
  *
  * Generate ARP caches for specific interfaces (--useInterfaceContainer):
- * \verbatim
+ * @verbatim
    ARP Cache of node 0 at time 0
    10.1.1.2 dev 0 lladdr 02-06-00:00:00:00:00:02 STATIC_AUTOGENERATED
    ARP Cache of node 1 at time 0
@@ -104,7 +104,7 @@
    \endverbatim
  *
  * Do not generate neighbor cache (--noGenerate):
- * \verbatim
+ * @verbatim
    ARP Cache of node 0 at time 0
    ARP Cache of node 1 at time 0
    ARP Cache of node 2 at time 0
@@ -150,7 +150,7 @@
 /**
  * IPv6 (--useIPv6):
  * Generate NDISC caches for all devices (default) :
- * \verbatim
+ * @verbatim
    NDISC Cache of node 0 at time +0s
    2001:1::200:ff:fe00:2 dev 0 lladdr 02-06-00:00:00:00:00:02 STATIC_AUTOGENERATED
    fe80::200:ff:fe00:2 dev 0 lladdr 02-06-00:00:00:00:00:02 STATIC_AUTOGENERATED
@@ -174,7 +174,7 @@
    \endverbatim
  *
  * Generate NDISC caches for the left channel (--useChannel):
- * \verbatim
+ * @verbatim
    NDISC Cache of node 0 at time +0s
    2001:1::200:ff:fe00:2 dev 0 lladdr 02-06-00:00:00:00:00:02 STATIC_AUTOGENERATED
    fe80::200:ff:fe00:2 dev 0 lladdr 02-06-00:00:00:00:00:02 STATIC_AUTOGENERATED
@@ -186,7 +186,7 @@
    \endverbatim
  *
  * Generate NDISC caches for devices on the right side (--useNetDeviceContainer):
- * \verbatim
+ * @verbatim
    NDISC Cache of node 0 at time +0s
    NDISC Cache of node 1 at time +0s
    2001:2::200:ff:fe00:4 dev 1 lladdr 02-06-00:00:00:00:00:04 STATIC_AUTOGENERATED
@@ -206,7 +206,7 @@
    \endverbatim
  *
  * Generate NDISC caches for specific interfaces (--useInterfaceContainer):
- * \verbatim
+ * @verbatim
    NDISC Cache of node 0 at time +0s
    2001:1::200:ff:fe00:2 dev 0 lladdr 02-06-00:00:00:00:00:02 STATIC_AUTOGENERATED
    fe80::200:ff:fe00:2 dev 0 lladdr 02-06-00:00:00:00:00:02 STATIC_AUTOGENERATED
@@ -220,7 +220,7 @@
    \endverbatim
  *
  * Do not generate neighbor cache (--noGenerate):
- * \verbatim
+ * @verbatim
    NDISC Cache of node 0 at time +0s
    NDISC Cache of node 1 at time +0s
    NDISC Cache of node 2 at time +0s
@@ -287,19 +287,19 @@
     void Run();
 
     /**
-     * \brief description the command-line parameters.
-     * \param argc The argument count.
-     * \param argv The argument vector.
+     * @brief description the command-line parameters.
+     * @param argc The argument count.
+     * @param argv The argument vector.
      */
     void CommandSetup(int argc, char** argv);
 
   private:
     /**
-     * \brief Print the information of receive data.
-     * \param pkt The received packet.
-     * \param from The sender.
-     * \param dst The receiver.
-     * \param header The header with a sequence, a timestamp, and a "size" attribute
+     * @brief Print the information of receive data.
+     * @param pkt The received packet.
+     * @param from The sender.
+     * @param dst The receiver.
+     * @param header The header with a sequence, a timestamp, and a "size" attribute
      */
     void ReceivePacket(Ptr<const Packet> pkt,
                        const Address& from,
@@ -458,7 +458,7 @@
             onoff.SetConstantRate(DataRate("10Gbps"));
             onoff.SetAttribute("EnableSeqTsSizeHeader", BooleanValue(true));
             ApplicationContainer apps = onoff.Install(csmaNodesLeft.Get(0));
-            apps.Start(Seconds(1.0));
+            apps.Start(Seconds(1));
 
             // Create a packet sink to receive these packets
             PacketSinkHelper sink("ns3::UdpSocketFactory",
@@ -538,7 +538,7 @@
             onoff.SetConstantRate(DataRate("10Gbps"));
             onoff.SetAttribute("EnableSeqTsSizeHeader", BooleanValue(true));
             ApplicationContainer apps = onoff.Install(csmaNodesLeft.Get(0));
-            apps.Start(Seconds(1.0));
+            apps.Start(Seconds(1));
 
             // Create a packet sink to receive these packets
             PacketSinkHelper sink("ns3::UdpSocketFactory",
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/helper/internet-stack-helper.cc ns-3.44/src/internet/helper/internet-stack-helper.cc
--- ns-3.43/src/internet/helper/internet-stack-helper.cc	2024-10-09 16:41:09.880655800 -0700
+++ ns-3.44/src/internet/helper/internet-stack-helper.cc	2025-03-09 16:55:49.383371000 -0700
@@ -363,10 +363,10 @@
 }
 
 /**
- * \brief Sync function for IPv4 packet - Pcap output
- * \param p smart pointer to the packet
- * \param ipv4 smart pointer to the node's IPv4 stack
- * \param interface incoming interface
+ * @brief Sync function for IPv4 packet - Pcap output
+ * @param p smart pointer to the packet
+ * @param ipv4 smart pointer to the node's IPv4 stack
+ * @param interface incoming interface
  */
 static void
 Ipv4L3ProtocolRxTxSink(Ptr<const Packet> p, Ptr<Ipv4> ipv4, uint32_t interface)
@@ -469,10 +469,10 @@
 }
 
 /**
- * \brief Sync function for IPv6 packet - Pcap output
- * \param p smart pointer to the packet
- * \param ipv6 smart pointer to the node's IPv6 stack
- * \param interface incoming interface
+ * @brief Sync function for IPv6 packet - Pcap output
+ * @param p smart pointer to the packet
+ * @param ipv6 smart pointer to the node's IPv6 stack
+ * @param interface incoming interface
  */
 static void
 Ipv6L3ProtocolRxTxSink(Ptr<const Packet> p, Ptr<Ipv6> ipv6, uint32_t interface)
@@ -575,13 +575,13 @@
 }
 
 /**
- * \brief Sync function for IPv4 dropped packet - Ascii output
- * \param stream the output stream
- * \param header IPv4 header
- * \param packet smart pointer to the packet
- * \param reason the reason for the dropping
- * \param ipv4 smart pointer to the node's IPv4 stack
- * \param interface incoming interface
+ * @brief Sync function for IPv4 dropped packet - Ascii output
+ * @param stream the output stream
+ * @param header IPv4 header
+ * @param packet smart pointer to the packet
+ * @param reason the reason for the dropping
+ * @param ipv4 smart pointer to the node's IPv4 stack
+ * @param interface incoming interface
  */
 static void
 Ipv4L3ProtocolDropSinkWithoutContext(Ptr<OutputStreamWrapper> stream,
@@ -610,11 +610,11 @@
 }
 
 /**
- * \brief Sync function for IPv4 transmitted packet - Ascii output
- * \param stream the output stream
- * \param packet smart pointer to the packet
- * \param ipv4 smart pointer to the node's IPv4 stack
- * \param interface incoming interface
+ * @brief Sync function for IPv4 transmitted packet - Ascii output
+ * @param stream the output stream
+ * @param packet smart pointer to the packet
+ * @param ipv4 smart pointer to the node's IPv4 stack
+ * @param interface incoming interface
  */
 static void
 Ipv4L3ProtocolTxSinkWithoutContext(Ptr<OutputStreamWrapper> stream,
@@ -633,11 +633,11 @@
 }
 
 /**
- * \brief Sync function for IPv4 received packet - Ascii output
- * \param stream the output stream
- * \param packet smart pointer to the packet
- * \param ipv4 smart pointer to the node's IPv4 stack
- * \param interface incoming interface
+ * @brief Sync function for IPv4 received packet - Ascii output
+ * @param stream the output stream
+ * @param packet smart pointer to the packet
+ * @param ipv4 smart pointer to the node's IPv4 stack
+ * @param interface incoming interface
  */
 static void
 Ipv4L3ProtocolRxSinkWithoutContext(Ptr<OutputStreamWrapper> stream,
@@ -656,14 +656,14 @@
 }
 
 /**
- * \brief Sync function for IPv4 dropped packet - Ascii output
- * \param stream the output stream
- * \param context the context
- * \param header IPv4 header
- * \param packet smart pointer to the packet
- * \param reason the reason for the dropping
- * \param ipv4 smart pointer to the node's IPv4 stack
- * \param interface incoming interface
+ * @brief Sync function for IPv4 dropped packet - Ascii output
+ * @param stream the output stream
+ * @param context the context
+ * @param header IPv4 header
+ * @param packet smart pointer to the packet
+ * @param reason the reason for the dropping
+ * @param ipv4 smart pointer to the node's IPv4 stack
+ * @param interface incoming interface
  */
 static void
 Ipv4L3ProtocolDropSinkWithContext(Ptr<OutputStreamWrapper> stream,
@@ -699,12 +699,12 @@
 }
 
 /**
- * \brief Sync function for IPv4 transmitted packet - Ascii output
- * \param stream the output stream
- * \param context the context
- * \param packet smart pointer to the packet
- * \param ipv4 smart pointer to the node's IPv4 stack
- * \param interface incoming interface
+ * @brief Sync function for IPv4 transmitted packet - Ascii output
+ * @param stream the output stream
+ * @param context the context
+ * @param packet smart pointer to the packet
+ * @param ipv4 smart pointer to the node's IPv4 stack
+ * @param interface incoming interface
  */
 static void
 Ipv4L3ProtocolTxSinkWithContext(Ptr<OutputStreamWrapper> stream,
@@ -730,12 +730,12 @@
 }
 
 /**
- * \brief Sync function for IPv4 received packet - Ascii output
- * \param stream the output stream
- * \param context the context
- * \param packet smart pointer to the packet
- * \param ipv4 smart pointer to the node's IPv4 stack
- * \param interface incoming interface
+ * @brief Sync function for IPv4 received packet - Ascii output
+ * @param stream the output stream
+ * @param context the context
+ * @param packet smart pointer to the packet
+ * @param ipv4 smart pointer to the node's IPv4 stack
+ * @param interface incoming interface
  */
 static void
 Ipv4L3ProtocolRxSinkWithContext(Ptr<OutputStreamWrapper> stream,
@@ -919,13 +919,13 @@
 }
 
 /**
- * \brief Sync function for IPv6 dropped packet - Ascii output
- * \param stream the output stream
- * \param header IPv6 header
- * \param packet smart pointer to the packet
- * \param reason the reason for the dropping
- * \param ipv6 smart pointer to the node's IPv6 stack
- * \param interface incoming interface
+ * @brief Sync function for IPv6 dropped packet - Ascii output
+ * @param stream the output stream
+ * @param header IPv6 header
+ * @param packet smart pointer to the packet
+ * @param reason the reason for the dropping
+ * @param ipv6 smart pointer to the node's IPv6 stack
+ * @param interface incoming interface
  */
 static void
 Ipv6L3ProtocolDropSinkWithoutContext(Ptr<OutputStreamWrapper> stream,
@@ -954,11 +954,11 @@
 }
 
 /**
- * \brief Sync function for IPv6 transmitted packet - Ascii output
- * \param stream the output stream
- * \param packet smart pointer to the packet
- * \param ipv6 smart pointer to the node's IPv6 stack
- * \param interface incoming interface
+ * @brief Sync function for IPv6 transmitted packet - Ascii output
+ * @param stream the output stream
+ * @param packet smart pointer to the packet
+ * @param ipv6 smart pointer to the node's IPv6 stack
+ * @param interface incoming interface
  */
 static void
 Ipv6L3ProtocolTxSinkWithoutContext(Ptr<OutputStreamWrapper> stream,
@@ -977,11 +977,11 @@
 }
 
 /**
- * \brief Sync function for IPv6 received packet - Ascii output
- * \param stream the output stream
- * \param packet smart pointer to the packet
- * \param ipv6 smart pointer to the node's IPv6 stack
- * \param interface incoming interface
+ * @brief Sync function for IPv6 received packet - Ascii output
+ * @param stream the output stream
+ * @param packet smart pointer to the packet
+ * @param ipv6 smart pointer to the node's IPv6 stack
+ * @param interface incoming interface
  */
 static void
 Ipv6L3ProtocolRxSinkWithoutContext(Ptr<OutputStreamWrapper> stream,
@@ -1000,14 +1000,14 @@
 }
 
 /**
- * \brief Sync function for IPv6 dropped packet - Ascii output
- * \param stream the output stream
- * \param context the context
- * \param header IPv6 header
- * \param packet smart pointer to the packet
- * \param reason the reason for the dropping
- * \param ipv6 smart pointer to the node's IPv6 stack
- * \param interface incoming interface
+ * @brief Sync function for IPv6 dropped packet - Ascii output
+ * @param stream the output stream
+ * @param context the context
+ * @param header IPv6 header
+ * @param packet smart pointer to the packet
+ * @param reason the reason for the dropping
+ * @param ipv6 smart pointer to the node's IPv6 stack
+ * @param interface incoming interface
  */
 static void
 Ipv6L3ProtocolDropSinkWithContext(Ptr<OutputStreamWrapper> stream,
@@ -1043,12 +1043,12 @@
 }
 
 /**
- * \brief Sync function for IPv6 transmitted packet - Ascii output
- * \param stream the output stream
- * \param context the context
- * \param packet smart pointer to the packet
- * \param ipv6 smart pointer to the node's IPv6 stack
- * \param interface incoming interface
+ * @brief Sync function for IPv6 transmitted packet - Ascii output
+ * @param stream the output stream
+ * @param context the context
+ * @param packet smart pointer to the packet
+ * @param ipv6 smart pointer to the node's IPv6 stack
+ * @param interface incoming interface
  */
 static void
 Ipv6L3ProtocolTxSinkWithContext(Ptr<OutputStreamWrapper> stream,
@@ -1074,12 +1074,12 @@
 }
 
 /**
- * \brief Sync function for IPv6 received packet - Ascii output
- * \param stream the output stream
- * \param context the context
- * \param packet smart pointer to the packet
- * \param ipv6 smart pointer to the node's IPv6 stack
- * \param interface incoming interface
+ * @brief Sync function for IPv6 received packet - Ascii output
+ * @param stream the output stream
+ * @param context the context
+ * @param packet smart pointer to the packet
+ * @param ipv6 smart pointer to the node's IPv6 stack
+ * @param interface incoming interface
  */
 static void
 Ipv6L3ProtocolRxSinkWithContext(Ptr<OutputStreamWrapper> stream,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/helper/internet-stack-helper.h ns-3.44/src/internet/helper/internet-stack-helper.h
--- ns-3.43/src/internet/helper/internet-stack-helper.h	2024-10-09 16:41:09.880655800 -0700
+++ ns-3.44/src/internet/helper/internet-stack-helper.h	2025-03-09 16:55:49.383371000 -0700
@@ -27,26 +27,26 @@
 class Ipv6RoutingHelper;
 
 /**
- * \defgroup internet Internet
+ * @defgroup internet Internet
  *
  * This section documents the API of the ns-3 internet module. For a generic functional description,
  * please refer to the ns-3 manual.
  */
 
 /**
- * \ingroup internet
- * \defgroup ipv4Helpers IPv4 Helper classes
+ * @ingroup internet
+ * @defgroup ipv4Helpers IPv4 Helper classes
  */
 
 /**
- * \ingroup internet
- * \defgroup ipv6Helpers IPv6 Helper classes
+ * @ingroup internet
+ * @defgroup ipv6Helpers IPv6 Helper classes
  */
 
 /**
- * \ingroup internet
+ * @ingroup internet
  *
- * \brief aggregate IP/TCP/UDP functionality to existing Nodes.
+ * @brief aggregate IP/TCP/UDP functionality to existing Nodes.
  *
  * This helper enables pcap and ascii tracing of events in the internet stack
  * associated with a node.  This is substantially similar to the tracing
@@ -97,15 +97,15 @@
     ~InternetStackHelper() override;
 
     /**
-     * \brief Copy constructor
-     * \param o Object to copy from.
+     * @brief Copy constructor
+     * @param o Object to copy from.
      */
     InternetStackHelper(const InternetStackHelper& o);
 
     /**
-     * \brief Copy constructor
-     * \param o Object to copy from.
-     * \returns A copy of the InternetStackHelper.
+     * @brief Copy constructor
+     * @param o Object to copy from.
+     * @returns A copy of the InternetStackHelper.
      */
     InternetStackHelper& operator=(const InternetStackHelper& o);
 
@@ -115,7 +115,7 @@
     void Reset();
 
     /**
-     * \param routing a new routing helper
+     * @param routing a new routing helper
      *
      * Set the routing helper to use during Install. The routing
      * helper is really an object factory which is used to create
@@ -126,8 +126,8 @@
     void SetRoutingHelper(const Ipv4RoutingHelper& routing);
 
     /**
-     * \brief Set IPv6 routing helper.
-     * \param routing IPv6 routing helper
+     * @brief Set IPv6 routing helper.
+     * @param routing IPv6 routing helper
      */
     void SetRoutingHelper(const Ipv6RoutingHelper& routing);
 
@@ -136,7 +136,7 @@
      * onto the provided node.  This method will do nothing if the stacks are already installed,
      * and will not overwrite existing stacks parameters.
      *
-     * \param nodeName The name of the node on which to install the stack.
+     * @param nodeName The name of the node on which to install the stack.
      */
     void Install(std::string nodeName) const;
 
@@ -145,7 +145,7 @@
      * onto the provided node.  This method will do nothing if the stacks are already installed,
      * and will not overwrite existing stacks parameters.
      *
-     * \param node The node on which to install the stack.
+     * @param node The node on which to install the stack.
      */
     void Install(Ptr<Node> node) const;
 
@@ -154,7 +154,7 @@
      * ns3::Ipv4, ns3::Ipv6, ns3::Udp, and, ns3::Tcp classes.  This method will do nothing if the
      * stacks are already installed, and will not overwrite existing stacks parameters.
      *
-     * \param c NodeContainer that holds the set of nodes on which to install the
+     * @param c NodeContainer that holds the set of nodes on which to install the
      * new stacks.
      */
     void Install(NodeContainer c) const;
@@ -165,26 +165,26 @@
     void InstallAll() const;
 
     /**
-     * \brief Enable/disable IPv4 stack install.
-     * \param enable enable state
+     * @brief Enable/disable IPv4 stack install.
+     * @param enable enable state
      */
     void SetIpv4StackInstall(bool enable);
 
     /**
-     * \brief Enable/disable IPv6 stack install.
-     * \param enable enable state
+     * @brief Enable/disable IPv6 stack install.
+     * @param enable enable state
      */
     void SetIpv6StackInstall(bool enable);
 
     /**
-     * \brief Enable/disable IPv4 ARP Jitter.
-     * \param enable enable state
+     * @brief Enable/disable IPv4 ARP Jitter.
+     * @param enable enable state
      */
     void SetIpv4ArpJitter(bool enable);
 
     /**
-     * \brief Enable/disable IPv6 NS and RS Jitter.
-     * \param enable enable state
+     * @brief Enable/disable IPv6 NS and RS Jitter.
+     * @param enable enable state
      */
     void SetIpv6NsRsJitter(bool enable);
 
@@ -194,10 +194,10 @@
      * have been assigned.  The Install() method should have previously been
      * called by the user.
      *
-     * \param stream first stream index to use
-     * \param c NodeContainer of the set of nodes for which the internet models
+     * @param stream first stream index to use
+     * @param c NodeContainer of the set of nodes for which the internet models
      *          should be modified to use a fixed stream
-     * \return the number of stream indices assigned by this helper
+     * @return the number of stream indices assigned by this helper
      */
     int64_t AssignStreams(NodeContainer c, int64_t stream);
 
@@ -261,73 +261,73 @@
                                  bool explicitFilename) override;
 
     /**
-     * \brief Initialize the helper to its default values
+     * @brief Initialize the helper to its default values
      */
     void Initialize();
 
     /**
-     * \brief IPv4 routing helper.
+     * @brief IPv4 routing helper.
      */
     const Ipv4RoutingHelper* m_routing;
 
     /**
-     * \brief IPv6 routing helper.
+     * @brief IPv6 routing helper.
      */
     const Ipv6RoutingHelper* m_routingv6;
 
     /**
-     * \brief create an object from its TypeId and aggregates it to the node. Does nothing if
+     * @brief create an object from its TypeId and aggregates it to the node. Does nothing if
      * an object of the same type is already aggregated to the node.
-     * \param node the node
-     * \param typeId the object TypeId
+     * @param node the node
+     * @param typeId the object TypeId
      */
     static void CreateAndAggregateObjectFromTypeId(Ptr<Node> node, const std::string typeId);
 
     /**
-     * \brief checks if there is an hook to a Pcap wrapper
-     * \param ipv4 pointer to the IPv4 object
-     * \returns true if a hook is found
+     * @brief checks if there is an hook to a Pcap wrapper
+     * @param ipv4 pointer to the IPv4 object
+     * @returns true if a hook is found
      */
     bool PcapHooked(Ptr<Ipv4> ipv4);
 
     /**
-     * \brief checks if there is an hook to an ascii output stream
-     * \param ipv4 pointer to the IPv4 object
-     * \returns true if a hook is found
+     * @brief checks if there is an hook to an ascii output stream
+     * @param ipv4 pointer to the IPv4 object
+     * @returns true if a hook is found
      */
     bool AsciiHooked(Ptr<Ipv4> ipv4);
 
     /**
-     * \brief checks if there is an hook to a Pcap wrapper
-     * \param ipv6 pointer to the IPv6 object
-     * \returns true if a hook is found
+     * @brief checks if there is an hook to a Pcap wrapper
+     * @param ipv6 pointer to the IPv6 object
+     * @returns true if a hook is found
      */
     bool PcapHooked(Ptr<Ipv6> ipv6);
 
     /**
-     * \brief checks if there is an hook to an ascii output stream
-     * \param ipv6 pointer to the IPv6 object
-     * \returns true if a hook is found
+     * @brief checks if there is an hook to an ascii output stream
+     * @param ipv6 pointer to the IPv6 object
+     * @returns true if a hook is found
      */
     bool AsciiHooked(Ptr<Ipv6> ipv6);
 
     /**
-     * \brief IPv4 install state (enabled/disabled) ?
+     * @brief IPv4 install state (enabled/disabled) ?
      */
     bool m_ipv4Enabled;
 
     /**
-     * \brief IPv6 install state (enabled/disabled) ?
+     * @brief IPv6 install state (enabled/disabled) ?
      */
     bool m_ipv6Enabled;
 
     /**
-     * \brief IPv4 ARP Jitter state (enabled/disabled) ?
+     * @brief IPv4 ARP Jitter state (enabled/disabled) ?
      */
     bool m_ipv4ArpJitterEnabled;
 
     /**
-     * \brief IPv6 IPv6 NS and RS Jitter state (enabled/disabled) ?
+     * @brief IPv6 IPv6 NS and RS Jitter state (enabled/disabled) ?
      */
     bool m_ipv6NsRsJitterEnabled;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/helper/internet-trace-helper.h ns-3.44/src/internet/helper/internet-trace-helper.h
--- ns-3.43/src/internet/helper/internet-trace-helper.h	2024-10-09 16:41:09.880655800 -0700
+++ ns-3.44/src/internet/helper/internet-trace-helper.h	2025-03-09 16:55:49.383371000 -0700
@@ -19,7 +19,7 @@
 {
 
 /**
- * \ingroup ipv4Helpers
+ * @ingroup ipv4Helpers
  *
  * @brief Base class providing common user-level pcap operations for helpers
  * representing IPv4 protocols .
@@ -93,8 +93,8 @@
      * @brief Enable pcap output on all Ipv4 and interface pairs existing in the
      * nodes provided in the container.
      *
-     * \param prefix Filename prefix to use for pcap files.
-     * \param n container of nodes.
+     * @param prefix Filename prefix to use for pcap files.
+     * @param n container of nodes.
      */
     void EnablePcapIpv4(std::string prefix, NodeContainer n);
 
@@ -124,7 +124,7 @@
 };
 
 /**
- * \ingroup ipv4Helpers
+ * @ingroup ipv4Helpers
  *
  * @brief Base class providing common user-level ascii trace operations for
  * helpers representing IPv4 protocols .
@@ -249,8 +249,8 @@
      * @brief Enable ascii trace output on all Ipv4 and interface pairs existing
      * in the nodes provided in the container.
      *
-     * \param prefix Filename prefix to use for ascii files.
-     * \param n container of nodes.
+     * @param prefix Filename prefix to use for ascii files.
+     * @param n container of nodes.
      */
     void EnableAsciiIpv4(std::string prefix, NodeContainer n);
 
@@ -260,7 +260,7 @@
      *
      * @param stream An OutputStreamWrapper representing an existing file to use
      *               when writing trace data.
-     * \param n container of nodes.
+     * @param n container of nodes.
      */
     void EnableAsciiIpv4(Ptr<OutputStreamWrapper> stream, NodeContainer n);
 
@@ -409,7 +409,7 @@
 };
 
 /**
- * \ingroup ipv6Helpers
+ * @ingroup ipv6Helpers
  *
  * @brief Base class providing common user-level pcap operations for helpers
  * representing IPv6 protocols .
@@ -483,8 +483,8 @@
      * @brief Enable pcap output on all Ipv6 and interface pairs existing in the
      * nodes provided in the container.
      *
-     * \param prefix Filename prefix to use for pcap files.
-     * \param n container of nodes.
+     * @param prefix Filename prefix to use for pcap files.
+     * @param n container of nodes.
      */
     void EnablePcapIpv6(std::string prefix, NodeContainer n);
 
@@ -514,7 +514,7 @@
 };
 
 /**
- * \ingroup ipv6Helpers
+ * @ingroup ipv6Helpers
  *
  * @brief Base class providing common user-level ascii trace operations for
  * helpers representing IPv6 protocols .
@@ -639,8 +639,8 @@
      * @brief Enable ascii trace output on all Ipv6 and interface pairs existing
      * in the nodes provided in the container.
      *
-     * \param prefix Filename prefix to use for ascii files.
-     * \param n container of nodes.
+     * @param prefix Filename prefix to use for ascii files.
+     * @param n container of nodes.
      */
     void EnableAsciiIpv6(std::string prefix, NodeContainer n);
 
@@ -650,7 +650,7 @@
      *
      * @param stream An OutputStreamWrapper representing an existing file to use
      *               when writing trace data.
-     * \param n container of nodes.
+     * @param n container of nodes.
      */
     void EnableAsciiIpv6(Ptr<OutputStreamWrapper> stream, NodeContainer n);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/helper/ipv4-address-helper.h ns-3.44/src/internet/helper/ipv4-address-helper.h
--- ns-3.43/src/internet/helper/ipv4-address-helper.h	2024-10-09 16:41:09.880655800 -0700
+++ ns-3.44/src/internet/helper/ipv4-address-helper.h	2025-03-09 16:55:49.383371000 -0700
@@ -16,7 +16,7 @@
 {
 
 /**
- * \ingroup ipv4Helpers
+ * @ingroup ipv4Helpers
  *
  * @brief A helper class to make life easier while doing simple IPv4 address
  * assignment in scripts.
@@ -169,9 +169,9 @@
 
   private:
     /**
-     * \brief Returns the number of address bits (hostpart) for a given netmask
-     * \param maskbits the netmask
-     * \returns the number of bits in the hostpart
+     * @brief Returns the number of address bits (hostpart) for a given netmask
+     * @param maskbits the netmask
+     * @returns the number of bits in the hostpart
      */
     uint32_t NumAddressBits(uint32_t maskbits) const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/helper/ipv4-global-routing-helper.h ns-3.44/src/internet/helper/ipv4-global-routing-helper.h
--- ns-3.43/src/internet/helper/ipv4-global-routing-helper.h	2024-10-09 16:41:09.880655800 -0700
+++ ns-3.44/src/internet/helper/ipv4-global-routing-helper.h	2025-03-09 16:55:49.383371000 -0700
@@ -16,23 +16,23 @@
 {
 
 /**
- * \ingroup ipv4Helpers
+ * @ingroup ipv4Helpers
  *
- * \brief Helper class that adds ns3::Ipv4GlobalRouting objects
+ * @brief Helper class that adds ns3::Ipv4GlobalRouting objects
  */
 class Ipv4GlobalRoutingHelper : public Ipv4RoutingHelper
 {
   public:
     /**
-     * \brief Construct a GlobalRoutingHelper to make life easier for managing
+     * @brief Construct a GlobalRoutingHelper to make life easier for managing
      * global routing tasks.
      */
     Ipv4GlobalRoutingHelper();
 
     /**
-     * \brief Construct a GlobalRoutingHelper from another previously initialized
+     * @brief Construct a GlobalRoutingHelper from another previously initialized
      * instance (Copy Constructor).
-     * \param o object to be copied
+     * @param o object to be copied
      */
     Ipv4GlobalRoutingHelper(const Ipv4GlobalRoutingHelper& o);
 
@@ -40,7 +40,7 @@
     Ipv4GlobalRoutingHelper& operator=(const Ipv4GlobalRoutingHelper&) = delete;
 
     /**
-     * \returns pointer to clone of this Ipv4GlobalRoutingHelper
+     * @returns pointer to clone of this Ipv4GlobalRoutingHelper
      *
      * This method is mainly for internal use by the other helpers;
      * clients are expected to free the dynamic memory allocated by this method
@@ -48,15 +48,15 @@
     Ipv4GlobalRoutingHelper* Copy() const override;
 
     /**
-     * \param node the node on which the routing protocol will run
-     * \returns a newly-created routing protocol
+     * @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
      */
     Ptr<Ipv4RoutingProtocol> Create(Ptr<Node> node) const override;
 
     /**
-     * \brief Build a routing database and initialize the routing tables of
+     * @brief Build a routing database and initialize the routing tables of
      * the nodes in the simulation.  Makes all nodes in the simulation into
      * routers.
      *
@@ -66,7 +66,7 @@
      */
     static void PopulateRoutingTables();
     /**
-     * \brief Remove all routes that were previously installed in a prior call
+     * @brief Remove all routes that were previously installed in a prior call
      * to either PopulateRoutingTables() or RecomputeRoutingTables(), and
      * add a new set of routes.
      *
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/helper/ipv4-interface-container.h ns-3.44/src/internet/helper/ipv4-interface-container.h
--- ns-3.43/src/internet/helper/ipv4-interface-container.h	2024-10-09 16:41:09.880655800 -0700
+++ ns-3.44/src/internet/helper/ipv4-interface-container.h	2025-03-09 16:55:49.383371000 -0700
@@ -19,9 +19,9 @@
 {
 
 /**
- * \ingroup ipv4
+ * @ingroup ipv4
  *
- * \brief holds a vector of std::pair of Ptr<Ipv4> and interface index.
+ * @brief holds a vector of std::pair of Ptr<Ipv4> and interface index.
  *
  * Typically ns-3 Ipv4Interfaces are installed on devices using an Ipv4 address
  * helper.  The helper's Assign() method takes a NetDeviceContainer which holds
@@ -45,7 +45,7 @@
 {
   public:
     /**
-     * \brief Container Const Iterator for pairs of Ipv4 smart pointer / Interface Index.
+     * @brief Container Const Iterator for pairs of Ipv4 smart pointer / Interface Index.
      */
     typedef std::vector<std::pair<Ptr<Ipv4>, uint32_t>>::const_iterator Iterator;
 
@@ -56,12 +56,12 @@
 
     /**
      * Concatenate the entries in the other container with ours.
-     * \param other container
+     * @param other container
      */
     void Add(const Ipv4InterfaceContainer& other);
 
     /**
-     * \brief Get an iterator which refers to the first pair in the
+     * @brief Get an iterator which refers to the first pair in the
      * container.
      *
      * Pairs can be retrieved from the container in two ways.  First,
@@ -69,21 +69,21 @@
      * This method is used in the iterator method and is typically used in a
      * for-loop to run through the pairs
      *
-     * \code
+     * @code
      *   Ipv4InterfaceContainer::Iterator i;
      *   for (i = container.Begin (); i != container.End (); ++i)
      *     {
      *       std::pair<Ptr<Ipv4>, uint32_t> pair = *i;
      *       method (pair.first, pair.second);  // use the pair
      *     }
-     * \endcode
+     * @endcode
      *
-     * \returns an iterator which refers to the first pair in the container.
+     * @returns an iterator which refers to the first pair in the container.
      */
     Iterator Begin() const;
 
     /**
-     * \brief Get an iterator which indicates past-the-last Node in the
+     * @brief Get an iterator which indicates past-the-last Node in the
      * container.
      *
      * Nodes can be retrieved from the container in two ways.  First,
@@ -91,21 +91,21 @@
      * This method is used in the iterator method and is typically used in a
      * for-loop to run through the Nodes
      *
-     * \code
+     * @code
      *   NodeContainer::Iterator i;
      *   for (i = container.Begin (); i != container.End (); ++i)
      *     {
      *       std::pair<Ptr<Ipv4>, uint32_t> pair = *i;
      *       method (pair.first, pair.second);  // use the pair
      *     }
-     * \endcode
+     * @endcode
      *
-     * \returns an iterator which indicates an ending condition for a loop.
+     * @returns an iterator which indicates an ending condition for a loop.
      */
     Iterator End() const;
 
     /**
-     * \returns the number of Ptr<Ipv4> and interface pairs stored in this
+     * @returns the number of Ptr<Ipv4> and interface pairs stored in this
      * Ipv4InterfaceContainer.
      *
      * Pairs can be retrieved from the container in two ways.  First,
@@ -114,23 +114,23 @@
      * define an ending condition in a for-loop that runs through the stored
      * Nodes
      *
-     * \code
+     * @code
      *   uint32_t nNodes = container.GetN ();
      *   for (uint32_t i = 0 i < nNodes; ++i)
      *     {
      *       std::pair<Ptr<Ipv4>, uint32_t> pair = container.Get (i);
      *       method (pair.first, pair.second);  // use the pair
      *     }
-     * \endcode
+     * @endcode
      *
-     * \returns the number of Ptr<Node> stored in this container.
+     * @returns the number of Ptr<Node> stored in this container.
      */
     uint32_t GetN() const;
 
     /**
-     * \param i index of ipInterfacePair in container
-     * \param j interface address index (if interface has multiple addresses)
-     * \returns the IPv4 address of the j'th address of the interface
+     * @param i index of ipInterfacePair in container
+     * @param j interface address index (if interface has multiple addresses)
+     * @returns the IPv4 address of the j'th address of the interface
      *  corresponding to index i.
      *
      * If the second parameter is omitted, the zeroth indexed address of
@@ -140,9 +140,9 @@
     Ipv4Address GetAddress(uint32_t i, uint32_t j = 0) const;
 
     /**
-     * \brief Set a metric for the given interface
-     * \param i Interface index
-     * \param metric the interface metric
+     * @brief Set a metric for the given interface
+     * @param i Interface index
+     * @param metric the interface metric
      */
     void SetMetric(uint32_t i, uint16_t metric);
 
@@ -150,8 +150,8 @@
      * Manually add an entry to the container consisting of the individual parts
      * of an entry std::pair.
      *
-     * \param ipv4 pointer to Ipv4 object
-     * \param interface interface index of the Ipv4Interface to add to the container
+     * @param ipv4 pointer to Ipv4 object
+     * @param interface interface index of the Ipv4Interface to add to the container
      */
     void Add(Ptr<Ipv4> ipv4, uint32_t interface);
 
@@ -159,7 +159,7 @@
      * Manually add an entry to the container consisting of a previously composed
      * entry std::pair.
      *
-     * \param ipInterfacePair the pair of a pointer to Ipv4 object and interface index of the
+     * @param ipInterfacePair the pair of a pointer to Ipv4 object and interface index of the
      * Ipv4Interface to add to the container
      */
     void Add(std::pair<Ptr<Ipv4>, uint32_t> ipInterfacePair);
@@ -168,9 +168,9 @@
      * Manually add an entry to the container consisting of the individual parts
      * of an entry std::pair.
      *
-     * \param ipv4Name std:string referring to the saved name of an Ipv4 Object that
+     * @param ipv4Name std:string referring to the saved name of an Ipv4 Object that
      *        has been previously named using the Object Name Service.
-     * \param interface interface index of the Ipv4Interface to add to the container
+     * @param interface interface index of the Ipv4Interface to add to the container
      */
     void Add(std::string ipv4Name, uint32_t interface);
 
@@ -178,33 +178,33 @@
      * Get the std::pair of an Ptr<Ipv4> and interface stored at the location
      * specified by the index.
      *
-     * \param i the index of the container entry to retrieve.
-     * \return the std::pair of a Ptr<Ipv4> and an interface index
+     * @param i the index of the container entry to retrieve.
+     * @return the std::pair of a Ptr<Ipv4> and an interface index
      *
-     * \note The returned Ptr<Ipv4> cannot be used directly to fetch the
+     * @note The returned Ptr<Ipv4> cannot be used directly to fetch the
      *       Ipv4Interface using the returned index (the GetInterface () method
      *       is provided in class Ipv4L3Protocol, and not class Ipv4). An
      *       example usage is provided below.
      *
-     * \code
+     * @code
      *   Ipv4InterfaceContainer c;
      *   ...
      *   std::pair<Ptr<Ipv4>, uint32_t> returnValue = c.Get (0);
      *   Ptr<Ipv4> ipv4 = returnValue.first;
      *   uint32_t index = returnValue.second;
      *   Ptr<Ipv4Interface> iface =  DynamicCast<Ipv4L3Protocol> (ipv4)->GetInterface (index);
-     * \endcode
+     * @endcode
      */
     std::pair<Ptr<Ipv4>, uint32_t> Get(uint32_t i) const;
 
   private:
     /**
-     * \brief Container for pairs of Ipv4 smart pointer / Interface Index.
+     * @brief Container for pairs of Ipv4 smart pointer / Interface Index.
      */
     typedef std::vector<std::pair<Ptr<Ipv4>, uint32_t>> InterfaceVector;
 
     /**
-     * \brief List of IPv4 stack and interfaces index.
+     * @brief List of IPv4 stack and interfaces index.
      */
     InterfaceVector m_interfaces;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/helper/ipv4-list-routing-helper.h ns-3.44/src/internet/helper/ipv4-list-routing-helper.h
--- ns-3.43/src/internet/helper/ipv4-list-routing-helper.h	2024-10-09 16:41:09.880655800 -0700
+++ ns-3.44/src/internet/helper/ipv4-list-routing-helper.h	2025-03-09 16:55:49.383371000 -0700
@@ -17,9 +17,9 @@
 {
 
 /**
- * \ingroup ipv4Helpers
+ * @ingroup ipv4Helpers
  *
- * \brief Helper class that adds ns3::Ipv4ListRouting objects
+ * @brief Helper class that adds ns3::Ipv4ListRouting objects
  *
  * This class is expected to be used in conjunction with
  * ns3::InternetStackHelper::SetRoutingHelper
@@ -39,9 +39,9 @@
     ~Ipv4ListRoutingHelper() override;
 
     /**
-     * \brief Construct an Ipv4ListRoutingHelper from another previously
+     * @brief Construct an Ipv4ListRoutingHelper from another previously
      * initialized instance (Copy Constructor).
-     * \param o object to be copied
+     * @param o object to be copied
      */
     Ipv4ListRoutingHelper(const Ipv4ListRoutingHelper& o);
 
@@ -49,7 +49,7 @@
     Ipv4ListRoutingHelper& operator=(const Ipv4ListRoutingHelper&) = delete;
 
     /**
-     * \returns pointer to clone of this Ipv4ListRoutingHelper
+     * @returns pointer to clone of this Ipv4ListRoutingHelper
      *
      * This method is mainly for internal use by the other helpers;
      * clients are expected to free the dynamic memory allocated by this method
@@ -57,8 +57,8 @@
     Ipv4ListRoutingHelper* Copy() const override;
 
     /**
-     * \param routing a routing helper
-     * \param priority the priority of the associated helper
+     * @param routing a routing helper
+     * @param priority the priority of the associated helper
      *
      * Store in the internal list a reference to the input routing helper
      * and associated priority. These helpers will be used later by
@@ -68,8 +68,8 @@
      */
     void Add(const Ipv4RoutingHelper& routing, int16_t priority);
     /**
-     * \param node the node on which the routing protocol will run
-     * \returns a newly-created routing protocol
+     * @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
      */
@@ -77,7 +77,7 @@
 
   private:
     /**
-     * \brief Container for pairs of Ipv4RoutingHelper pointer / priority.
+     * @brief Container for pairs of Ipv4RoutingHelper pointer / priority.
      */
     std::list<std::pair<const Ipv4RoutingHelper*, int16_t>> m_list;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/helper/ipv4-routing-helper.h ns-3.44/src/internet/helper/ipv4-routing-helper.h
--- ns-3.43/src/internet/helper/ipv4-routing-helper.h	2024-10-09 16:41:09.880655800 -0700
+++ ns-3.44/src/internet/helper/ipv4-routing-helper.h	2025-03-09 16:55:49.383371000 -0700
@@ -21,9 +21,9 @@
 class Node;
 
 /**
- * \ingroup ipv4Helpers
+ * @ingroup ipv4Helpers
  *
- * \brief a factory to create ns3::Ipv4RoutingProtocol objects
+ * @brief a factory to create ns3::Ipv4RoutingProtocol objects
  *
  * For each new routing protocol created as a subclass of
  * ns3::Ipv4RoutingProtocol, you need to create a subclass of
@@ -40,8 +40,8 @@
     virtual ~Ipv4RoutingHelper();
 
     /**
-     * \brief virtual constructor
-     * \returns pointer to clone of this Ipv4RoutingHelper
+     * @brief virtual constructor
+     * @returns pointer to clone of this Ipv4RoutingHelper
      *
      * This method is mainly for internal use by the other helpers;
      * clients are expected to free the dynamic memory allocated by this method
@@ -49,16 +49,16 @@
     virtual Ipv4RoutingHelper* Copy() const = 0;
 
     /**
-     * \param node the node within which the new routing protocol will run
-     * \returns a newly-created routing protocol
+     * @param node the node within which the new routing protocol will run
+     * @returns a newly-created routing protocol
      */
     virtual Ptr<Ipv4RoutingProtocol> Create(Ptr<Node> node) const = 0;
 
     /**
-     * \brief prints the routing tables of all nodes at a particular time.
-     * \param printTime the time at which the routing table is supposed to be printed.
-     * \param stream The output stream object to use
-     * \param unit The time unit to be used in the report
+     * @brief prints the routing tables of all nodes at a particular time.
+     * @param printTime the time at which the routing table is supposed to be printed.
+     * @param stream The output stream object to use
+     * @param unit The time unit to be used in the report
      *
      * This method calls the PrintRoutingTable() method of the
      * Ipv4RoutingProtocol stored in the Ipv4 object, for all nodes at the
@@ -69,10 +69,10 @@
                                        Time::Unit unit = Time::S);
 
     /**
-     * \brief prints the routing tables of all nodes at regular intervals specified by user.
-     * \param printInterval the time interval for which the routing table is supposed to be printed.
-     * \param stream The output stream object to use
-     * \param unit The time unit to be used in the report
+     * @brief prints the routing tables of all nodes at regular intervals specified by user.
+     * @param printInterval the time interval for which the routing table is supposed to be printed.
+     * @param stream The output stream object to use
+     * @param unit The time unit to be used in the report
      *
      * This method calls the PrintRoutingTable() method of the
      * Ipv4RoutingProtocol stored in the Ipv4 object, for all nodes at the
@@ -83,11 +83,11 @@
                                           Time::Unit unit = Time::S);
 
     /**
-     * \brief prints the routing tables of a node at a particular time.
-     * \param printTime the time at which the routing table is supposed to be printed.
-     * \param node The node ptr for which we need the routing table to be printed
-     * \param stream The output stream object to use
-     * \param unit The time unit to be used in the report
+     * @brief prints the routing tables of a node at a particular time.
+     * @param printTime the time at which the routing table is supposed to be printed.
+     * @param node The node ptr for which we need the routing table to be printed
+     * @param stream The output stream object to use
+     * @param unit The time unit to be used in the report
      *
      * This method calls the PrintRoutingTable() method of the
      * Ipv4RoutingProtocol stored in the Ipv4 object, for the selected node
@@ -99,11 +99,11 @@
                                     Time::Unit unit = Time::S);
 
     /**
-     * \brief prints the routing tables of a node at regular intervals specified by user.
-     * \param printInterval the time interval for which the routing table is supposed to be printed.
-     * \param node The node ptr for which we need the routing table to be printed
-     * \param stream The output stream object to use
-     * \param unit The time unit to be used in the report
+     * @brief prints the routing tables of a node at regular intervals specified by user.
+     * @param printInterval the time interval for which the routing table is supposed to be printed.
+     * @param node The node ptr for which we need the routing table to be printed
+     * @param stream The output stream object to use
+     * @param unit The time unit to be used in the report
      *
      * This method calls the PrintRoutingTable() method of the
      * Ipv4RoutingProtocol stored in the Ipv4 object, for the selected node
@@ -115,15 +115,15 @@
                                        Time::Unit unit = Time::S);
 
     /**
-     * \brief prints the neighbor cache of all nodes at a particular time.
-     * \param printTime the time at which the neighbor cache is supposed to be printed.
-     * \param stream The output stream object to use
-     * \param unit The time unit to be used in the report
+     * @brief prints the neighbor cache of all nodes at a particular time.
+     * @param printTime the time at which the neighbor cache is supposed to be printed.
+     * @param stream The output stream object to use
+     * @param unit The time unit to be used in the report
      *
      * This method calls the PrintArpCache() method of the
      * ArpCache associated with each Ipv4Interface stored in the Ipv4 object, for all nodes at the
      * specified time. The output format is similar to:
-     * \verbatim
+     * @verbatim
        10.1.1.2 dev 1 lladdr 00-06-00:00:00:00:00:02 REACHABLE
        \endverbatim
      * Note that the MAC address is printed as "type"-"size"-"actual address"
@@ -133,16 +133,16 @@
                                         Time::Unit unit = Time::S);
 
     /**
-     * \brief prints the neighbor cache of all nodes at regular intervals specified by user.
-     * \param printInterval the time interval for which the neighbor cache is supposed to be
+     * @brief prints the neighbor cache of all nodes at regular intervals specified by user.
+     * @param printInterval the time interval for which the neighbor cache is supposed to be
      printed.
-     * \param stream The output stream object to use
-     * \param unit The time unit to be used in the report
+     * @param stream The output stream object to use
+     * @param unit The time unit to be used in the report
      *
      * This method calls the PrintArpCache() method of the
      * ArpCache associated with each Ipv4Interface stored in the Ipv4 object, for all nodes at the
      * specified time. The output format is similar to:
-     * \verbatim
+     * @verbatim
        10.1.1.2 dev 1 lladdr 00-06-00:00:00:00:00:02 REACHABLE
        \endverbatim
      * Note that the MAC address is printed as "type"-"size"-"actual address"
@@ -152,16 +152,16 @@
                                            Time::Unit unit = Time::S);
 
     /**
-     * \brief prints the neighbor cache of a node at a particular time.
-     * \param printTime the time at which the neighbor cache is supposed to be printed.
-     * \param node The node ptr for which we need the neighbor cache to be printed
-     * \param stream The output stream object to use
-     * \param unit The time unit to be used in the report
+     * @brief prints the neighbor cache of a node at a particular time.
+     * @param printTime the time at which the neighbor cache is supposed to be printed.
+     * @param node The node ptr for which we need the neighbor cache to be printed
+     * @param stream The output stream object to use
+     * @param unit The time unit to be used in the report
      *
      * This method calls the PrintArpCache() method of the
      * ArpCache associated with each Ipv4Interface stored in the Ipv4 object, for all nodes at the
      * specified time. The output format is similar to:
-     * \verbatim
+     * @verbatim
        10.1.1.2 dev 1 lladdr 00-06-00:00:00:00:00:02 REACHABLE
        \endverbatim
      * Note that the MAC address is printed as "type"-"size"-"actual address"
@@ -172,17 +172,17 @@
                                      Time::Unit unit = Time::S);
 
     /**
-     * \brief prints the neighbor cache of a node at regular intervals specified by user.
-     * \param printInterval the time interval for which the neighbor cache is supposed to be
+     * @brief prints the neighbor cache of a node at regular intervals specified by user.
+     * @param printInterval the time interval for which the neighbor cache is supposed to be
      printed.
-     * \param node The node ptr for which we need the neighbor cache to be printed
-     * \param stream The output stream object to use
-     * \param unit The time unit to be used in the report
+     * @param node The node ptr for which we need the neighbor cache to be printed
+     * @param stream The output stream object to use
+     * @param unit The time unit to be used in the report
      *
      * This method calls the PrintArpCache() method of the
      * ArpCache associated with each Ipv4Interface stored in the Ipv4 object, for all nodes at the
      * specified time. The output format is similar to:
-     * \verbatim
+     * @verbatim
        10.1.1.2 dev 1 lladdr 00-06-00:00:00:00:00:02 REACHABLE
        \endverbatim
      * Note that the MAC address is printed as "type"-"size"-"actual address"
@@ -193,23 +193,23 @@
                                         Time::Unit unit = Time::S);
 
     /**
-     * \brief Request a specified routing protocol &lt;T&gt; from Ipv4RoutingProtocol protocol
+     * @brief Request a specified routing protocol &lt;T&gt; from Ipv4RoutingProtocol protocol
      *
      * If protocol is Ipv4ListRouting, then protocol will be searched in the list,
      * otherwise a simple DynamicCast will be performed
      *
-     * \param protocol Smart pointer to Ipv4RoutingProtocol object
-     * \return a Smart Pointer to the requested protocol (zero if the protocol can't be found)
+     * @param protocol Smart pointer to Ipv4RoutingProtocol object
+     * @return a Smart Pointer to the requested protocol (zero if the protocol can't be found)
      */
     template <class T>
     static Ptr<T> GetRouting(Ptr<Ipv4RoutingProtocol> protocol);
 
   private:
     /**
-     * \brief prints the routing tables of a node.
-     * \param node The node ptr for which we need the routing table to be printed
-     * \param stream The output stream object to use
-     * \param unit The time unit to be used in the report
+     * @brief prints the routing tables of a node.
+     * @param node The node ptr for which we need the routing table to be printed
+     * @param stream The output stream object to use
+     * @param unit The time unit to be used in the report
      *
      * This method calls the PrintRoutingTable() method of the
      * Ipv4RoutingProtocol stored in the Ipv4 object;
@@ -218,11 +218,11 @@
     static void Print(Ptr<Node> node, Ptr<OutputStreamWrapper> stream, Time::Unit unit = Time::S);
 
     /**
-     * \brief prints the routing tables of a node at regular intervals specified by user.
-     * \param printInterval the time interval for which the routing table is supposed to be printed.
-     * \param node The node ptr for which we need the routing table to be printed
-     * \param stream The output stream object to use
-     * \param unit The time unit to be used in the report
+     * @brief prints the routing tables of a node at regular intervals specified by user.
+     * @param printInterval the time interval for which the routing table is supposed to be printed.
+     * @param node The node ptr for which we need the routing table to be printed
+     * @param stream The output stream object to use
+     * @param unit The time unit to be used in the report
      *
      * This method calls the PrintRoutingTable() method of the
      * Ipv4RoutingProtocol stored in the Ipv4 object, for the selected node
@@ -234,15 +234,15 @@
                            Time::Unit unit = Time::S);
 
     /**
-     * \brief prints the neighbor cache of a node.
-     * \param node The node ptr for which we need the neighbor cache to be printed
-     * \param stream The output stream object to use
-     * \param unit The time unit to be used in the report
+     * @brief prints the neighbor cache of a node.
+     * @param node The node ptr for which we need the neighbor cache to be printed
+     * @param stream The output stream object to use
+     * @param unit The time unit to be used in the report
      *
      * This method calls the PrintArpCache() method of the
      * ArpCache associated with each Ipv4Interface stored in the Ipv4 object, for all nodes at the
      * specified time. The output format is similar to:
-     * \verbatim
+     * @verbatim
        10.1.1.2 dev 1 lladdr 00-06-00:00:00:00:00:02 REACHABLE
        \endverbatim
      * Note that the MAC address is printed as "type"-"size"-"actual address"
@@ -252,17 +252,17 @@
                               Time::Unit unit = Time::S);
 
     /**
-     * \brief prints the neighbor cache of a node at regular intervals specified by user.
-     * \param printInterval the time interval for which the neighbor cache is supposed to be
+     * @brief prints the neighbor cache of a node at regular intervals specified by user.
+     * @param printInterval the time interval for which the neighbor cache is supposed to be
      printed.
-     * \param node The node ptr for which we need the neighbor cache to be printed
-     * \param stream The output stream object to use
-     * \param unit The time unit to be used in the report
+     * @param node The node ptr for which we need the neighbor cache to be printed
+     * @param stream The output stream object to use
+     * @param unit The time unit to be used in the report
      *
      * This method calls the PrintArpCache() method of the
      * ArpCache associated with each Ipv4Interface stored in the Ipv4 object, for all nodes at the
      * specified time. The output format is similar to:
-     * \verbatim
+     * @verbatim
        10.1.1.2 dev 1 lladdr 00-06-00:00:00:00:00:02 REACHABLE
        \endverbatim
      * Note that the MAC address is printed as "type"-"size"-"actual address"
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/helper/ipv4-static-routing-helper.h ns-3.44/src/internet/helper/ipv4-static-routing-helper.h
--- ns-3.43/src/internet/helper/ipv4-static-routing-helper.h	2024-10-09 16:41:09.880655800 -0700
+++ ns-3.44/src/internet/helper/ipv4-static-routing-helper.h	2025-03-09 16:55:49.383371000 -0700
@@ -22,9 +22,9 @@
 {
 
 /**
- * \ingroup ipv4Helpers
+ * @ingroup ipv4Helpers
  *
- * \brief Helper class that adds ns3::Ipv4StaticRouting objects
+ * @brief Helper class that adds ns3::Ipv4StaticRouting objects
  *
  * This class is expected to be used in conjunction with
  * ns3::InternetStackHelper::SetRoutingHelper
@@ -39,9 +39,9 @@
     Ipv4StaticRoutingHelper();
 
     /**
-     * \brief Construct an Ipv4StaticRoutingHelper from another previously
+     * @brief Construct an Ipv4StaticRoutingHelper from another previously
      * initialized instance (Copy Constructor).
-     * \param o object to be copied
+     * @param o object to be copied
      */
     Ipv4StaticRoutingHelper(const Ipv4StaticRoutingHelper& o);
 
@@ -49,7 +49,7 @@
     Ipv4StaticRoutingHelper& operator=(const Ipv4StaticRoutingHelper&) = delete;
 
     /**
-     * \returns pointer to clone of this Ipv4StaticRoutingHelper
+     * @returns pointer to clone of this Ipv4StaticRoutingHelper
      *
      * This method is mainly for internal use by the other helpers;
      * clients are expected to free the dynamic memory allocated by this method
@@ -57,8 +57,8 @@
     Ipv4StaticRoutingHelper* Copy() const override;
 
     /**
-     * \param node the node on which the routing protocol will run
-     * \returns a newly-created routing protocol
+     * @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
      */
@@ -69,20 +69,20 @@
      * protocol or in the list of routing protocols associated with the
      * Ipv4 provided.
      *
-     * \param ipv4 the Ptr<Ipv4> to search for the static routing protocol
-     * \returns Ipv4StaticRouting pointer or 0 if not found
+     * @param ipv4 the Ptr<Ipv4> to search for the static routing protocol
+     * @returns Ipv4StaticRouting pointer or 0 if not found
      */
     Ptr<Ipv4StaticRouting> GetStaticRouting(Ptr<Ipv4> ipv4) const;
 
     /**
-     * \brief Add a multicast route to a node and net device using explicit
+     * @brief Add a multicast route to a node and net device using explicit
      * Ptr<Node> and Ptr<NetDevice>
      *
-     * \param n The node.
-     * \param source Source address.
-     * \param group Multicast group.
-     * \param input Input NetDevice.
-     * \param output Output NetDevices.
+     * @param n The node.
+     * @param source Source address.
+     * @param group Multicast group.
+     * @param input Input NetDevice.
+     * @param output Output NetDevices.
      */
     void AddMulticastRoute(Ptr<Node> n,
                            Ipv4Address source,
@@ -91,15 +91,15 @@
                            NetDeviceContainer output);
 
     /**
-     * \brief Add a multicast route to a node and device using a name string
+     * @brief Add a multicast route to a node and device using a name string
      * previously associated to the node using the Object Name Service and a
      * Ptr<NetDevice>
      *
-     * \param n The node.
-     * \param source Source address.
-     * \param group Multicast group.
-     * \param input Input NetDevice.
-     * \param output Output NetDevices.
+     * @param n The node.
+     * @param source Source address.
+     * @param group Multicast group.
+     * @param input Input NetDevice.
+     * @param output Output NetDevices.
      */
     void AddMulticastRoute(std::string n,
                            Ipv4Address source,
@@ -108,14 +108,14 @@
                            NetDeviceContainer output);
 
     /**
-     * \brief Add a multicast route to a node and device using a Ptr<Node> and a
+     * @brief Add a multicast route to a node and device using a Ptr<Node> and a
      * name string previously associated to the device using the Object Name Service.
      *
-     * \param n The node.
-     * \param source Source address.
-     * \param group Multicast group.
-     * \param inputName Input NetDevice.
-     * \param output Output NetDevices.
+     * @param n The node.
+     * @param source Source address.
+     * @param group Multicast group.
+     * @param inputName Input NetDevice.
+     * @param output Output NetDevices.
      */
     void AddMulticastRoute(Ptr<Node> n,
                            Ipv4Address source,
@@ -124,15 +124,15 @@
                            NetDeviceContainer output);
 
     /**
-     * \brief Add a multicast route to a node and device using name strings
+     * @brief Add a multicast route to a node and device using name strings
      * previously associated to both the node and device using the Object Name
      * Service.
      *
-     * \param nName The node.
-     * \param source Source address.
-     * \param group Multicast group.
-     * \param inputName Input NetDevice.
-     * \param output Output NetDevices.
+     * @param nName The node.
+     * @param source Source address.
+     * @param group Multicast group.
+     * @param inputName Input NetDevice.
+     * @param output Output NetDevices.
      */
     void AddMulticastRoute(std::string nName,
                            Ipv4Address source,
@@ -141,49 +141,49 @@
                            NetDeviceContainer output);
 
     /**
-     * \brief Add a default route to the static routing protocol to forward
+     * @brief Add a default route to the static routing protocol to forward
      *        packets out a particular interface
      *
      * Functionally equivalent to:
      * route add 224.0.0.0 netmask 240.0.0.0 dev nd
-     * \param n node
-     * \param nd device of the node to add default route
+     * @param n node
+     * @param nd device of the node to add default route
      */
     void SetDefaultMulticastRoute(Ptr<Node> n, Ptr<NetDevice> nd);
 
     /**
-     * \brief Add a default route to the static routing protocol to forward
+     * @brief Add a default route to the static routing protocol to forward
      *        packets out a particular interface
      *
      * Functionally equivalent to:
      * route add 224.0.0.0 netmask 240.0.0.0 dev nd
-     * \param n node
-     * \param ndName string with name previously associated to device using the
+     * @param n node
+     * @param ndName string with name previously associated to device using the
      *        Object Name Service
      */
     void SetDefaultMulticastRoute(Ptr<Node> n, std::string ndName);
 
     /**
-     * \brief Add a default route to the static routing protocol to forward
+     * @brief Add a default route to the static routing protocol to forward
      *        packets out a particular interface
      *
      * Functionally equivalent to:
      * route add 224.0.0.0 netmask 240.0.0.0 dev nd
-     * \param nName string with name previously associated to node using the
+     * @param nName string with name previously associated to node using the
      *        Object Name Service
-     * \param nd device of the node to add default route
+     * @param nd device of the node to add default route
      */
     void SetDefaultMulticastRoute(std::string nName, Ptr<NetDevice> nd);
 
     /**
-     * \brief Add a default route to the static routing protocol to forward
+     * @brief Add a default route to the static routing protocol to forward
      *        packets out a particular interface
      *
      * Functionally equivalent to:
      * route add 224.0.0.0 netmask 240.0.0.0 dev nd
-     * \param nName string with name previously associated to node using the
+     * @param nName string with name previously associated to node using the
      *        Object Name Service
-     * \param ndName string with name previously associated to device using the
+     * @param ndName string with name previously associated to device using the
      *        Object Name Service
      */
     void SetDefaultMulticastRoute(std::string nName, std::string ndName);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/helper/ipv6-address-helper.h ns-3.44/src/internet/helper/ipv6-address-helper.h
--- ns-3.43/src/internet/helper/ipv6-address-helper.h	2024-10-09 16:41:09.880655800 -0700
+++ ns-3.44/src/internet/helper/ipv6-address-helper.h	2025-03-09 16:55:49.383371000 -0700
@@ -21,9 +21,9 @@
 {
 
 /**
- * \ingroup ipv6Helpers
+ * @ingroup ipv6Helpers
  *
- * \brief Helper class to auto-assign global IPv6 unicast addresses
+ * @brief Helper class to auto-assign global IPv6 unicast addresses
  *
  * Assign global unicast IPv6 addresses based on \RFC{4291} definition.
  *
@@ -73,31 +73,31 @@
 {
   public:
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Ipv6AddressHelper();
 
     /**
-     * \brief Constructor.
-     * \param network The IPv6 network
-     * \param prefix The prefix
-     * \param base The base interface ID
+     * @brief Constructor.
+     * @param network The IPv6 network
+     * @param prefix The prefix
+     * @param base The base interface ID
      */
     Ipv6AddressHelper(Ipv6Address network,
                       Ipv6Prefix prefix,
                       Ipv6Address base = Ipv6Address("::1"));
 
     /**
-     * \brief Set the base network number, network prefix, and base interface ID
+     * @brief Set the base network number, network prefix, and base interface ID
      *
-     * \param network The IPv6 network
-     * \param prefix The prefix
-     * \param base The base interface ID
+     * @param network The IPv6 network
+     * @param prefix The prefix
+     * @param base The base interface ID
      */
     void SetBase(Ipv6Address network, Ipv6Prefix prefix, Ipv6Address base = Ipv6Address("::1"));
 
     /**
-     * \brief Allocate a new network.
+     * @brief Allocate a new network.
      *
      * This method will cause the subnet prefix to increment, for future
      * network IDs, and resets the interface ID to the previously used
@@ -106,84 +106,84 @@
     void NewNetwork();
 
     /**
-     * \brief Allocate a new Ipv6Address.
+     * @brief Allocate a new Ipv6Address.
      *
      * If a Mac48Address is passed in, an Ipv6 autoconfigured address
      * according to the current subnet prefix is returned.  If something
      * other than Mac48 address is passed in, the program will terminate.
      *
-     * \param addr address used to generate the interface ID of the IPv6 address
-     * \return newly created Ipv6Address
+     * @param addr address used to generate the interface ID of the IPv6 address
+     * @return newly created Ipv6Address
      */
     Ipv6Address NewAddress(Address addr);
 
     /**
-     * \brief Allocate a new Ipv6Address with interface ID equal to the
+     * @brief Allocate a new Ipv6Address with interface ID equal to the
      * next one in the underlying generator.
      *
-     * \return newly created Ipv6Address
+     * @return newly created Ipv6Address
      */
     Ipv6Address NewAddress();
 
     /**
-     * \brief Allocate an Ipv6InterfaceContainer with auto-assigned addresses.
-     * \param c netdevice container
-     * \return newly created Ipv6InterfaceContainer
+     * @brief Allocate an Ipv6InterfaceContainer with auto-assigned addresses.
+     * @param c netdevice container
+     * @return newly created Ipv6InterfaceContainer
      */
     Ipv6InterfaceContainer Assign(const NetDeviceContainer& c);
 
     /**
-     * \brief Allocate an Ipv6InterfaceContainer, and control whether the
+     * @brief Allocate an Ipv6InterfaceContainer, and control whether the
      *        interfaces have addresses auto-assigned to them
      *
-     * \param c netdevice container
-     * \param withConfiguration a vector of values for which, for a
+     * @param c netdevice container
+     * @param withConfiguration a vector of values for which, for a
      *        given device, true : interface automatically addressed,
      *        false : no automatic address
-     * \return newly created Ipv6InterfaceContainer
+     * @return newly created Ipv6InterfaceContainer
      */
     Ipv6InterfaceContainer Assign(const NetDeviceContainer& c, std::vector<bool> withConfiguration);
 
     /**
-     * \brief Allocate an Ipv6InterfaceContainer, and control whether the
+     * @brief Allocate an Ipv6InterfaceContainer, and control whether the
      *        interfaces have addresses auto-assigned to them
      *
-     * \param c netdevice container
-     * \param withConfiguration a vector of values for which, for a
+     * @param c netdevice container
+     * @param withConfiguration a vector of values for which, for a
      *        given device, true : interface automatically addressed,
      *        false : no automatic address
-     * \param onLink a vector of values for which, for a
+     * @param onLink a vector of values for which, for a
      *        given device, true : on-link property added,
      *        false : network is not on-link
      *        Meaningful only if the address is automatically assigned.
-     * \return newly created Ipv6InterfaceContainer
+     * @return newly created Ipv6InterfaceContainer
      */
     Ipv6InterfaceContainer Assign(const NetDeviceContainer& c,
                                   std::vector<bool> withConfiguration,
                                   std::vector<bool> onLink);
 
     /**
-     * \brief Allocate an Ipv6InterfaceContainer but do not assign any IPv6 addresses
+     * @brief Allocate an Ipv6InterfaceContainer but do not assign any IPv6 addresses
      *
      * This method is used when IPv6 address assignment may occur later
      * (such as dynamic address assignment)
      *
      * Equivalent to AssignWithoutAddress (c, std::vector<bool> of false);
      *
-     * \param c netdevice container
-     * \return newly created Ipv6InterfaceContainer
+     * @param c netdevice container
+     * @return newly created Ipv6InterfaceContainer
      */
     Ipv6InterfaceContainer AssignWithoutAddress(const NetDeviceContainer& c);
 
     /**
-     * \brief Allocate an Ipv6InterfaceContainer with auto-assigned addresses,
+     * @brief Allocate an Ipv6InterfaceContainer with auto-assigned addresses,
      * but do not set the on-link property for the network.
      *
      * This method will assign a valid global address to the interface but
      * the routing will not consider the network as "on-link".
      *
-     * \param c netdevice container
-     * \return newly created Ipv6InterfaceContainer
+     * @param c netdevice container
+     * @return newly created Ipv6InterfaceContainer
      */
     Ipv6InterfaceContainer AssignWithoutOnLink(const NetDeviceContainer& c);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/helper/ipv6-interface-container.h ns-3.44/src/internet/helper/ipv6-interface-container.h
--- ns-3.43/src/internet/helper/ipv6-interface-container.h	2024-10-09 16:41:09.880655800 -0700
+++ ns-3.44/src/internet/helper/ipv6-interface-container.h	2025-03-09 16:55:49.383371000 -0700
@@ -21,25 +21,25 @@
 {
 
 /**
- * \ingroup ipv6
+ * @ingroup ipv6
  *
- * \brief Keep track of a set of IPv6 interfaces.
+ * @brief Keep track of a set of IPv6 interfaces.
  */
 class Ipv6InterfaceContainer
 {
   public:
     /**
-     * \brief Container Const Iterator for pairs of Ipv6 smart pointer / Interface Index.
+     * @brief Container Const Iterator for pairs of Ipv6 smart pointer / Interface Index.
      */
     typedef std::vector<std::pair<Ptr<Ipv6>, uint32_t>>::const_iterator Iterator;
 
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Ipv6InterfaceContainer();
 
     /**
-     * \returns the number of Ptr<Ipv6> and interface pairs stored in this
+     * @returns the number of Ptr<Ipv6> and interface pairs stored in this
      * Ipv6InterfaceContainer.
      *
      * Pairs can be retrieved from the container in two ways.  First,
@@ -48,55 +48,55 @@
      * define an ending condition in a for-loop that runs through the stored
      * Nodes
      *
-     * \code
+     * @code
      *   uint32_t nNodes = container.GetN ();
      *   for (uint32_t i = 0 i < nNodes; ++i)
      *     {
      *       std::pair<Ptr<Ipv6>, uint32_t> pair = container.Get (i);
      *       method (pair.first, pair.second);  // use the pair
      *     }
-     * \endcode
+     * @endcode
      */
     uint32_t GetN() const;
 
     /**
-     * \brief Get the interface index for the specified node index.
-     * \param i index of the node
-     * \return interface index
+     * @brief Get the interface index for the specified node index.
+     * @param i index of the node
+     * @return interface index
      */
     uint32_t GetInterfaceIndex(uint32_t i) const;
 
     /**
-     * \brief Get the address for the specified index.
-     * \param i interface index
-     * \param j address index, generally index 0 is the link-local address
-     * \return IPv6 address
+     * @brief Get the address for the specified index.
+     * @param i interface index
+     * @param j address index, generally index 0 is the link-local address
+     * @return IPv6 address
      */
     Ipv6Address GetAddress(uint32_t i, uint32_t j) const;
 
     /**
-     * \brief Get the link-local address for the specified index.
-     * \param i index
-     * \return the link-local address, or "::" if the interface has no link local address.
+     * @brief Get the link-local address for the specified index.
+     * @param i index
+     * @return the link-local address, or "::" if the interface has no link local address.
      */
     Ipv6Address GetLinkLocalAddress(uint32_t i);
 
     /**
-     * \brief Get the link-local address for the node with the specified global address.
-     * \param address the address to find.
-     * \return the link-local address, or "::" if the interface has no link local address.
+     * @brief Get the link-local address for the node with the specified global address.
+     * @param address the address to find.
+     * @return the link-local address, or "::" if the interface has no link local address.
      */
     Ipv6Address GetLinkLocalAddress(Ipv6Address address);
 
     /**
-     * \brief Add a couple IPv6/interface.
-     * \param ipv6 IPv6 address
-     * \param interface interface index
+     * @brief Add a couple IPv6/interface.
+     * @param ipv6 IPv6 address
+     * @param interface interface index
      */
     void Add(Ptr<Ipv6> ipv6, uint32_t interface);
 
     /**
-     * \brief Get an iterator which refers to the first pair in the
+     * @brief Get an iterator which refers to the first pair in the
      * container.
      *
      * Pairs can be retrieved from the container in two ways.  First,
@@ -104,21 +104,21 @@
      * This method is used in the iterator method and is typically used in a
      * for-loop to run through the pairs
      *
-     * \code
+     * @code
      *   Ipv6InterfaceContainer::Iterator i;
      *   for (i = container.Begin (); i != container.End (); ++i)
      *     {
      *       std::pair<Ptr<Ipv6>, uint32_t> pair = *i;
      *       method (pair.first, pair.second);  // use the pair
      *     }
-     * \endcode
+     * @endcode
      *
-     * \returns an iterator which refers to the first pair in the container.
+     * @returns an iterator which refers to the first pair in the container.
      */
     Iterator Begin() const;
 
     /**
-     * \brief Get an iterator which indicates past-the-last Node in the
+     * @brief Get an iterator which indicates past-the-last Node in the
      * container.
      *
      * Nodes can be retrieved from the container in two ways.  First,
@@ -126,29 +126,29 @@
      * This method is used in the iterator method and is typically used in a
      * for-loop to run through the Nodes
      *
-     * \code
+     * @code
      *   NodeContainer::Iterator i;
      *   for (i = container.Begin (); i != container.End (); ++i)
      *     {
      *       std::pair<Ptr<Ipv6>, uint32_t> pair = *i;
      *       method (pair.first, pair.second);  // use the pair
      *     }
-     * \endcode
+     * @endcode
      *
-     * \returns an iterator which indicates an ending condition for a loop.
+     * @returns an iterator which indicates an ending condition for a loop.
      */
     Iterator End() const;
 
     /**
-     * \brief Fusion with another Ipv6InterfaceContainer.
-     * \param c container
+     * @brief Fusion with another Ipv6InterfaceContainer.
+     * @param c container
      */
     void Add(const Ipv6InterfaceContainer& c);
 
     /**
-     * \brief Add a couple of name/interface.
-     * \param ipv6Name name of a node
-     * \param interface interface index to add
+     * @brief Add a couple of name/interface.
+     * @param ipv6Name name of a node
+     * @param interface interface index to add
      */
     void Add(std::string ipv6Name, uint32_t interface);
 
@@ -156,71 +156,71 @@
      * Get the std::pair of an Ptr<Ipv6> and interface stored at the location
      * specified by the index.
      *
-     * \param i the index of the container entry to retrieve.
-     * \return the std::pair of a Ptr<Ipv6> and an interface index
+     * @param i the index of the container entry to retrieve.
+     * @return the std::pair of a Ptr<Ipv6> and an interface index
      *
-     * \note The returned Ptr<Ipv6> cannot be used directly to fetch the
+     * @note The returned Ptr<Ipv6> cannot be used directly to fetch the
      *       Ipv6Interface using the returned index (the GetInterface () method
      *       is provided in class Ipv6L3Protocol, and not class Ipv6). An
      *       example usage is provided below.
      *
-     * \code
+     * @code
      *   Ipv6InterfaceContainer c;
      *   ...
      *   std::pair<Ptr<Ipv6>, uint32_t> returnValue = c.Get (0);
      *   Ptr<Ipv6> ipv6 = returnValue.first;
      *   uint32_t index = returnValue.second;
      *   Ptr<Ipv6Interface> iface =  DynamicCast<Ipv6L3Protocol> (ipv6)->GetInterface (index);
-     * \endcode
+     * @endcode
      */
     std::pair<Ptr<Ipv6>, uint32_t> Get(uint32_t i) const;
 
     /**
-     * \brief Set the state of the stack (act as a router or as an host) for the specified index.
+     * @brief Set the state of the stack (act as a router or as an host) for the specified index.
      * This automatically sets all the node's interfaces to the same forwarding state.
-     * \param i index
-     * \param state true : is a router, false : is an host
+     * @param i index
+     * @param state true : is a router, false : is an host
      */
     void SetForwarding(uint32_t i, bool state);
 
     /**
-     * \brief Set the default route for all the devices (except the router itself).
-     * \param router the default router index
+     * @brief Set the default route for all the devices (except the router itself).
+     * @param router the default router index
      */
     void SetDefaultRouteInAllNodes(uint32_t router);
 
     /**
-     * \brief Set the default route for all the devices (except the router itself).
+     * @brief Set the default route for all the devices (except the router itself).
      * Note that the route will be set to the link-local address of the node with the specified
      * address.
-     * \param routerAddr the default router address
+     * @param routerAddr the default router address
      */
     void SetDefaultRouteInAllNodes(Ipv6Address routerAddr);
 
     /**
-     * \brief Set the default route for the specified index.
-     * \param i index
-     * \param router the default router
+     * @brief Set the default route for the specified index.
+     * @param i index
+     * @param router the default router
      */
     void SetDefaultRoute(uint32_t i, uint32_t router);
 
     /**
-     * \brief Set the default route for the specified index.
+     * @brief Set the default route for the specified index.
      * Note that the route will be set to the link-local address of the node with the specified
      * address.
-     * \param i index
-     * \param routerAddr the default router address
+     * @param i index
+     * @param routerAddr the default router address
      */
     void SetDefaultRoute(uint32_t i, Ipv6Address routerAddr);
 
   private:
     /**
-     * \brief Container for pairs of Ipv6 smart pointer / Interface Index.
+     * @brief Container for pairs of Ipv6 smart pointer / Interface Index.
      */
     typedef std::vector<std::pair<Ptr<Ipv6>, uint32_t>> InterfaceVector;
 
     /**
-     * \brief List of IPv6 stack and interfaces index.
+     * @brief List of IPv6 stack and interfaces index.
      */
     InterfaceVector m_interfaces;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/helper/ipv6-list-routing-helper.h ns-3.44/src/internet/helper/ipv6-list-routing-helper.h
--- ns-3.43/src/internet/helper/ipv6-list-routing-helper.h	2024-10-09 16:41:09.880655800 -0700
+++ ns-3.44/src/internet/helper/ipv6-list-routing-helper.h	2025-03-09 16:55:49.383371000 -0700
@@ -17,9 +17,9 @@
 {
 
 /**
- * \ingroup ipv6Helpers
+ * @ingroup ipv6Helpers
  *
- * \brief Helper class that adds ns3::Ipv6ListRouting objects
+ * @brief Helper class that adds ns3::Ipv6ListRouting objects
  *
  * This class is expected to be used in conjunction with
  * ns3::InternetStackHelper::SetRoutingHelper
@@ -34,14 +34,14 @@
     Ipv6ListRoutingHelper();
 
     /**
-     * \brief Destroy an Ipv6 Ipv6ListRoutingHelper.
+     * @brief Destroy an Ipv6 Ipv6ListRoutingHelper.
      */
     ~Ipv6ListRoutingHelper() override;
 
     /**
-     * \brief Construct an Ipv6ListRoutingHelper from another previously
+     * @brief Construct an Ipv6ListRoutingHelper from another previously
      * initialized instance (Copy Constructor).
-     * \param o object to be copied
+     * @param o object to be copied
      */
     Ipv6ListRoutingHelper(const Ipv6ListRoutingHelper& o);
 
@@ -49,7 +49,7 @@
     Ipv6ListRoutingHelper& operator=(const Ipv6ListRoutingHelper&) = delete;
 
     /**
-     * \returns pointer to clone of this Ipv6ListRoutingHelper
+     * @returns pointer to clone of this Ipv6ListRoutingHelper
      *
      * This method is mainly for internal use by the other helpers;
      * clients are expected to free the dynamic memory allocated by this method
@@ -57,8 +57,8 @@
     Ipv6ListRoutingHelper* Copy() const override;
 
     /**
-     * \param routing a routing helper
-     * \param priority the priority of the associated helper
+     * @param routing a routing helper
+     * @param priority the priority of the associated helper
      *
      * Store in the internal list a reference to the input routing helper
      * and associated priority. These helpers will be used later by
@@ -68,8 +68,8 @@
      */
     void Add(const Ipv6RoutingHelper& routing, int16_t priority);
     /**
-     * \param node the node on which the routing protocol will run
-     * \returns a newly-created routing protocol
+     * @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
      */
@@ -77,7 +77,7 @@
 
   private:
     /**
-     * \brief Container for pairs of Ipv6RoutingHelper pointer / priority.
+     * @brief Container for pairs of Ipv6RoutingHelper pointer / priority.
      */
     std::list<std::pair<const Ipv6RoutingHelper*, int16_t>> m_list;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/helper/ipv6-routing-helper.h ns-3.44/src/internet/helper/ipv6-routing-helper.h
--- ns-3.43/src/internet/helper/ipv6-routing-helper.h	2024-10-09 16:41:09.880655800 -0700
+++ ns-3.44/src/internet/helper/ipv6-routing-helper.h	2025-03-09 16:55:49.383371000 -0700
@@ -21,9 +21,9 @@
 class Node;
 
 /**
- * \ingroup ipv6Helpers
+ * @ingroup ipv6Helpers
  *
- * \brief A factory to create ns3::Ipv6RoutingProtocol objects
+ * @brief A factory to create ns3::Ipv6RoutingProtocol objects
  *
  * For each new routing protocol created as a subclass of
  * ns3::Ipv6RoutingProtocol, you need to create a subclass of
@@ -35,13 +35,13 @@
 {
   public:
     /**
-     * \brief Destroy an Ipv6 Ipv6RoutingHelper.
+     * @brief Destroy an Ipv6 Ipv6RoutingHelper.
      */
     virtual ~Ipv6RoutingHelper();
 
     /**
-     * \brief virtual constructor
-     * \returns pointer to clone of this Ipv6RoutingHelper
+     * @brief virtual constructor
+     * @returns pointer to clone of this Ipv6RoutingHelper
      *
      * This method is mainly for internal use by the other helpers;
      * clients are expected to free the dynamic memory allocated by this method
@@ -49,16 +49,16 @@
     virtual Ipv6RoutingHelper* Copy() const = 0;
 
     /**
-     * \param node the node within which the new routing protocol will run
-     * \returns a newly-created routing protocol
+     * @param node the node within which the new routing protocol will run
+     * @returns a newly-created routing protocol
      */
     virtual Ptr<Ipv6RoutingProtocol> Create(Ptr<Node> node) const = 0;
 
     /**
-     * \brief prints the routing tables of all nodes at a particular time.
-     * \param printTime the time at which the routing table is supposed to be printed.
-     * \param stream The output stream object to use
-     * \param unit The time unit to be used in the report
+     * @brief prints the routing tables of all nodes at a particular time.
+     * @param printTime the time at which the routing table is supposed to be printed.
+     * @param stream The output stream object to use
+     * @param unit The time unit to be used in the report
      *
      * This method calls the PrintRoutingTable() method of the
      * Ipv6RoutingProtocol stored in the Ipv6 object, for all nodes at the
@@ -69,10 +69,10 @@
                                        Time::Unit unit = Time::S);
 
     /**
-     * \brief prints the routing tables of all nodes at regular intervals specified by user.
-     * \param printInterval the time interval for which the routing table is supposed to be printed.
-     * \param stream The output stream object to use
-     * \param unit The time unit to be used in the report
+     * @brief prints the routing tables of all nodes at regular intervals specified by user.
+     * @param printInterval the time interval for which the routing table is supposed to be printed.
+     * @param stream The output stream object to use
+     * @param unit The time unit to be used in the report
      *
      * This method calls the PrintRoutingTable() method of the
      * Ipv6RoutingProtocol stored in the Ipv6 object, for all nodes at the
@@ -83,11 +83,11 @@
                                           Time::Unit unit = Time::S);
 
     /**
-     * \brief prints the routing tables of a node at a particular time.
-     * \param printTime the time at which the routing table is supposed to be printed.
-     * \param node The node ptr for which we need the routing table to be printed
-     * \param stream The output stream object to use
-     * \param unit The time unit to be used in the report
+     * @brief prints the routing tables of a node at a particular time.
+     * @param printTime the time at which the routing table is supposed to be printed.
+     * @param node The node ptr for which we need the routing table to be printed
+     * @param stream The output stream object to use
+     * @param unit The time unit to be used in the report
      *
      * This method calls the PrintRoutingTable() method of the
      * Ipv6RoutingProtocol stored in the Ipv6 object, for the selected node
@@ -99,11 +99,11 @@
                                     Time::Unit unit = Time::S);
 
     /**
-     * \brief prints the routing tables of a node at regular intervals specified by user.
-     * \param printInterval the time interval for which the routing table is supposed to be printed.
-     * \param node The node ptr for which we need the routing table to be printed
-     * \param stream The output stream object to use
-     * \param unit The time unit to be used in the report
+     * @brief prints the routing tables of a node at regular intervals specified by user.
+     * @param printInterval the time interval for which the routing table is supposed to be printed.
+     * @param node The node ptr for which we need the routing table to be printed
+     * @param stream The output stream object to use
+     * @param unit The time unit to be used in the report
      *
      * This method calls the PrintRoutingTable() method of the
      * Ipv6RoutingProtocol stored in the Ipv6 object, for the selected node
@@ -115,15 +115,15 @@
                                        Time::Unit unit = Time::S);
 
     /**
-     * \brief prints the neighbor cache of all nodes at a particular time.
-     * \param printTime the time at which the neighbor cache is supposed to be printed.
-     * \param stream The output stream object to use
-     * \param unit The time unit to be used in the report
+     * @brief prints the neighbor cache of all nodes at a particular time.
+     * @param printTime the time at which the neighbor cache is supposed to be printed.
+     * @param stream The output stream object to use
+     * @param unit The time unit to be used in the report
      *
      * This method calls the PrintNdiscCache() method of the
      * NdiscCache associated with each Ipv6Interface stored in the Ipv6 object, for all nodes at the
      * specified time. The output format is similar to:
-     * \verbatim
+     * @verbatim
        2001:db8::f00d:beef:cafe dev 1 lladdr 00-06-00:00:00:00:00:02 REACHABLE
        \endverbatim
      * Note that the MAC address is printed as "type"-"size"-"actual address"
@@ -133,16 +133,16 @@
                                         Time::Unit unit = Time::S);
 
     /**
-     * \brief prints the neighbor cache of all nodes at regular intervals specified by user.
-     * \param printInterval the time interval for which the neighbor cache is supposed to be
+     * @brief prints the neighbor cache of all nodes at regular intervals specified by user.
+     * @param printInterval the time interval for which the neighbor cache is supposed to be
      printed.
-     * \param stream The output stream object to use
-     * \param unit The time unit to be used in the report
+     * @param stream The output stream object to use
+     * @param unit The time unit to be used in the report
      *
      * This method calls the PrintNdiscCache() method of the
      * NdiscCache associated with each Ipv6Interface stored in the Ipv6 object, for all nodes at the
      * specified time. The output format is similar to:
-     * \verbatim
+     * @verbatim
        2001:db8::f00d:beef:cafe dev 1 lladdr 00-06-00:00:00:00:00:02 REACHABLE
        \endverbatim
      * Note that the MAC address is printed as "type"-"size"-"actual address"
@@ -152,16 +152,16 @@
                                            Time::Unit unit = Time::S);
 
     /**
-     * \brief prints the neighbor cache of a node at a particular time.
-     * \param printTime the time at which the neighbor cache is supposed to be printed.
-     * \param node The node ptr for which we need the neighbor cache to be printed
-     * \param stream The output stream object to use
-     * \param unit The time unit to be used in the report
+     * @brief prints the neighbor cache of a node at a particular time.
+     * @param printTime the time at which the neighbor cache is supposed to be printed.
+     * @param node The node ptr for which we need the neighbor cache to be printed
+     * @param stream The output stream object to use
+     * @param unit The time unit to be used in the report
      *
      * This method calls the PrintNdiscCache() method of the
      * NdiscCache associated with each Ipv6Interface stored in the Ipv6 object, for all nodes at the
      * specified time. The output format is similar to:
-     * \verbatim
+     * @verbatim
        2001:db8::f00d:beef:cafe dev 1 lladdr 00-06-00:00:00:00:00:02 REACHABLE
        \endverbatim
      * Note that the MAC address is printed as "type"-"size"-"actual address"
@@ -172,17 +172,17 @@
                                      Time::Unit unit = Time::S);
 
     /**
-     * \brief prints the neighbor cache of a node at regular intervals specified by user.
-     * \param printInterval the time interval for which the neighbor cache is supposed to be
+     * @brief prints the neighbor cache of a node at regular intervals specified by user.
+     * @param printInterval the time interval for which the neighbor cache is supposed to be
      printed.
-     * \param node The node ptr for which we need the neighbor cache to be printed
-     * \param stream The output stream object to use
-     * \param unit The time unit to be used in the report
+     * @param node The node ptr for which we need the neighbor cache to be printed
+     * @param stream The output stream object to use
+     * @param unit The time unit to be used in the report
      *
      * This method calls the PrintNdiscCache() method of the
      * NdiscCache associated with each Ipv6Interface stored in the Ipv6 object, for all nodes at the
      * specified time. The output format is similar to:
-     * \verbatim
+     * @verbatim
        2001:db8::f00d:beef:cafe dev 1 lladdr 00-06-00:00:00:00:00:02 REACHABLE
        \endverbatim
      * Note that the MAC address is printed as "type"-"size"-"actual address"
@@ -193,23 +193,23 @@
                                         Time::Unit unit = Time::S);
 
     /**
-     * \brief Request a specified routing protocol &lt;T&gt; from Ipv6RoutingProtocol protocol
+     * @brief Request a specified routing protocol &lt;T&gt; from Ipv6RoutingProtocol protocol
      *
      * If protocol is Ipv6ListRouting, then protocol will be searched in the list,
      * otherwise a simple DynamicCast will be performed
      *
-     * \param protocol Smart pointer to Ipv6RoutingProtocol object
-     * \return a Smart Pointer to the requested protocol (zero if the protocol can't be found)
+     * @param protocol Smart pointer to Ipv6RoutingProtocol object
+     * @return a Smart Pointer to the requested protocol (zero if the protocol can't be found)
      */
     template <class T>
     static Ptr<T> GetRouting(Ptr<Ipv6RoutingProtocol> protocol);
 
   private:
     /**
-     * \brief prints the routing tables of a node.
-     * \param node The node ptr for which we need the routing table to be printed
-     * \param stream The output stream object to use
-     * \param unit The time unit to be used in the report
+     * @brief prints the routing tables of a node.
+     * @param node The node ptr for which we need the routing table to be printed
+     * @param stream The output stream object to use
+     * @param unit The time unit to be used in the report
      *
      * This method calls the PrintRoutingTable() method of the
      * Ipv6RoutingProtocol stored in the Ipv6 object;
@@ -218,11 +218,11 @@
     static void Print(Ptr<Node> node, Ptr<OutputStreamWrapper> stream, Time::Unit unit);
 
     /**
-     * \brief prints the routing tables of a node at regular intervals specified by user.
-     * \param printInterval the time interval for which the routing table is supposed to be printed.
-     * \param node The node ptr for which we need the routing table to be printed
-     * \param stream The output stream object to use
-     * \param unit The time unit to be used in the report
+     * @brief prints the routing tables of a node at regular intervals specified by user.
+     * @param printInterval the time interval for which the routing table is supposed to be printed.
+     * @param node The node ptr for which we need the routing table to be printed
+     * @param stream The output stream object to use
+     * @param unit The time unit to be used in the report
      *
      * This method calls the PrintRoutingTable() method of the
      * Ipv6RoutingProtocol stored in the Ipv6 object, for the selected node
@@ -234,15 +234,15 @@
                            Time::Unit unit);
 
     /**
-     * \brief prints the neighbor cache of a node.
-     * \param node The node ptr for which we need the neighbor cache to be printed
-     * \param stream The output stream object to use
-     * \param unit The time unit to be used in the report
+     * @brief prints the neighbor cache of a node.
+     * @param node The node ptr for which we need the neighbor cache to be printed
+     * @param stream The output stream object to use
+     * @param unit The time unit to be used in the report
      *
      * This method calls the PrintNdiscCache() method of the
      * NdiscCache associated with each Ipv6Interface stored in the Ipv6 object, for all nodes at the
      * specified time. The output format is similar to:
-     * \verbatim
+     * @verbatim
        2001:db8::f00d:beef:cafe dev 1 lladdr 00-06-00:00:00:00:00:02 REACHABLE
        \endverbatim
      * Note that the MAC address is printed as "type"-"size"-"actual address"
@@ -252,17 +252,17 @@
                                 Time::Unit unit = Time::S);
 
     /**
-     * \brief prints the neighbor cache of a node at regular intervals specified by user.
-     * \param printInterval the time interval for which the neighbor cache is supposed to be
+     * @brief prints the neighbor cache of a node at regular intervals specified by user.
+     * @param printInterval the time interval for which the neighbor cache is supposed to be
      printed.
-     * \param node The node ptr for which we need the neighbor cache to be printed
-     * \param stream The output stream object to use
-     * \param unit The time unit to be used in the report
+     * @param node The node ptr for which we need the neighbor cache to be printed
+     * @param stream The output stream object to use
+     * @param unit The time unit to be used in the report
      *
      * This method calls the PrintNdiscCache() method of the
      * NdiscCache associated with each Ipv6Interface stored in the Ipv6 object, for all nodes at the
      * specified time. The output format is similar to:
-     * \verbatim
+     * @verbatim
        2001:db8::f00d:beef:cafe dev 1 lladdr 00-06-00:00:00:00:00:02 REACHABLE
        \endverbatim
      * Note that the MAC address is printed as "type"-"size"-"actual address"
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/helper/ipv6-static-routing-helper.h ns-3.44/src/internet/helper/ipv6-static-routing-helper.h
--- ns-3.43/src/internet/helper/ipv6-static-routing-helper.h	2024-10-09 16:41:09.880655800 -0700
+++ ns-3.44/src/internet/helper/ipv6-static-routing-helper.h	2025-03-09 16:55:49.387371000 -0700
@@ -22,9 +22,9 @@
 {
 
 /**
- * \ingroup ipv6Helpers
+ * @ingroup ipv6Helpers
  *
- * \brief Helper class that adds ns3::Ipv6StaticRouting objects
+ * @brief Helper class that adds ns3::Ipv6StaticRouting objects
  *
  * This class is expected to be used in conjunction with
  * ns3::InternetStackHelper::SetRoutingHelper
@@ -33,14 +33,14 @@
 {
   public:
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Ipv6StaticRoutingHelper();
 
     /**
-     * \brief Construct an Ipv6ListRoutingHelper from another previously
+     * @brief Construct an Ipv6ListRoutingHelper from another previously
      * initialized instance (Copy Constructor).
-     * \param o object to be copied
+     * @param o object to be copied
      */
     Ipv6StaticRoutingHelper(const Ipv6StaticRoutingHelper& o);
 
@@ -48,7 +48,7 @@
     Ipv6StaticRoutingHelper& operator=(const Ipv6StaticRoutingHelper&) = delete;
 
     /**
-     * \returns pointer to clone of this Ipv6StaticRoutingHelper
+     * @returns pointer to clone of this Ipv6StaticRoutingHelper
      *
      * This method is mainly for internal use by the other helpers;
      * clients are expected to free the dynamic memory allocated by this method
@@ -56,29 +56,29 @@
     Ipv6StaticRoutingHelper* Copy() const override;
 
     /**
-     * \param node the node on which the routing protocol will run
-     * \returns a newly-created routing protocol
+     * @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
      */
     Ptr<Ipv6RoutingProtocol> Create(Ptr<Node> node) const override;
 
     /**
-     * \brief Get Ipv6StaticRouting pointer from IPv6 stack.
-     * \param ipv6 Ipv6 pointer
-     * \return Ipv6StaticRouting pointer or 0 if not found
+     * @brief Get Ipv6StaticRouting pointer from IPv6 stack.
+     * @param ipv6 Ipv6 pointer
+     * @return Ipv6StaticRouting pointer or 0 if not found
      */
     Ptr<Ipv6StaticRouting> GetStaticRouting(Ptr<Ipv6> ipv6) const;
 
     /**
-     * \brief Add a multicast route to a node and net device using explicit
+     * @brief Add a multicast route to a node and net device using explicit
      * Ptr<Node> and Ptr<NetDevice>
      *
-     * \param n The node.
-     * \param source Source address.
-     * \param group Multicast group.
-     * \param input Input NetDevice.
-     * \param output Output NetDevices.
+     * @param n The node.
+     * @param source Source address.
+     * @param group Multicast group.
+     * @param input Input NetDevice.
+     * @param output Output NetDevices.
      */
     void AddMulticastRoute(Ptr<Node> n,
                            Ipv6Address source,
@@ -87,15 +87,15 @@
                            NetDeviceContainer output);
 
     /**
-     * \brief Add a multicast route to a node and device using a name string
+     * @brief Add a multicast route to a node and device using a name string
      * previously associated to the node using the Object Name Service and a
      * Ptr<NetDevice>
      *
-     * \param n The node.
-     * \param source Source address.
-     * \param group Multicast group.
-     * \param input Input NetDevice.
-     * \param output Output NetDevices.
+     * @param n The node.
+     * @param source Source address.
+     * @param group Multicast group.
+     * @param input Input NetDevice.
+     * @param output Output NetDevices.
      */
     void AddMulticastRoute(std::string n,
                            Ipv6Address source,
@@ -104,14 +104,14 @@
                            NetDeviceContainer output);
 
     /**
-     * \brief Add a multicast route to a node and device using a Ptr<Node> and a
+     * @brief Add a multicast route to a node and device using a Ptr<Node> and a
      * name string previously associated to the device using the Object Name Service.
      *
-     * \param n The node.
-     * \param source Source address.
-     * \param group Multicast group.
-     * \param inputName Input NetDevice.
-     * \param output Output NetDevices.
+     * @param n The node.
+     * @param source Source address.
+     * @param group Multicast group.
+     * @param inputName Input NetDevice.
+     * @param output Output NetDevices.
      */
     void AddMulticastRoute(Ptr<Node> n,
                            Ipv6Address source,
@@ -120,15 +120,15 @@
                            NetDeviceContainer output);
 
     /**
-     * \brief Add a multicast route to a node and device using name strings
+     * @brief Add a multicast route to a node and device using name strings
      * previously associated to both the node and device using the Object Name
      * Service.
      *
-     * \param nName The node.
-     * \param source Source address.
-     * \param group Multicast group.
-     * \param inputName Input NetDevice.
-     * \param output Output NetDevices.
+     * @param nName The node.
+     * @param source Source address.
+     * @param group Multicast group.
+     * @param inputName Input NetDevice.
+     * @param output Output NetDevices.
      */
     void AddMulticastRoute(std::string nName,
                            Ipv6Address source,
@@ -138,7 +138,7 @@
 
 #if 0
   /**
-   * \brief Add a default route to the static routing protocol to forward
+   * @brief Add a default route to the static routing protocol to forward
    *        packets out a particular interface
    */
   void SetDefaultMulticastRoute (Ptr<Node> n, Ptr<NetDevice> nd);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/helper/neighbor-cache-helper.h ns-3.44/src/internet/helper/neighbor-cache-helper.h
--- ns-3.43/src/internet/helper/neighbor-cache-helper.h	2024-10-09 16:41:09.880655800 -0700
+++ ns-3.44/src/internet/helper/neighbor-cache-helper.h	2025-03-09 16:55:49.387371000 -0700
@@ -29,7 +29,7 @@
 {
 
 /**
- * \ingroup internet
+ * @ingroup internet
  *
  * @brief A helper class to populate neighbor cache.
  *
@@ -46,122 +46,122 @@
     ~NeighborCacheHelper();
 
     /**
-     * \brief Populate neighbor ARP and NDISC caches for all devices.
+     * @brief Populate neighbor ARP and NDISC caches for all devices.
      * This method walks the global ChannelList.
      */
     void PopulateNeighborCache();
 
     /**
-     * \brief Populate neighbor ARP and NDISC caches for all devices in the given
+     * @brief Populate neighbor ARP and NDISC caches for all devices in the given
      * Channel.
-     * \param channel the Channel to process
+     * @param channel the Channel to process
      */
     void PopulateNeighborCache(Ptr<Channel> channel) const;
 
     /**
-     * \brief Populate neighbor ARP and NDISC caches for all devices in the given
+     * @brief Populate neighbor ARP and NDISC caches for all devices in the given
      * NetDeviceContainer.
-     * \param c the NetDevice container to process
+     * @param c the NetDevice container to process
      */
     void PopulateNeighborCache(const NetDeviceContainer& c) const;
 
     /**
-     * \brief Populate neighbor ARP caches for all IPv4 interfaces in the given
+     * @brief Populate neighbor ARP caches for all IPv4 interfaces in the given
      * Ipv4InterfaceContainer.
-     * \param c the Ipv4InterfaceContainer to process
+     * @param c the Ipv4InterfaceContainer to process
      */
     void PopulateNeighborCache(const Ipv4InterfaceContainer& c) const;
 
     /**
-     * \brief Populate neighbor NDISC caches for all IPv6 interfaces in the given
+     * @brief Populate neighbor NDISC caches for all IPv6 interfaces in the given
      * Ipv6InterfaceContainer.
-     * \param c the Ipv6InterfaceContainer to process
+     * @param c the Ipv6InterfaceContainer to process
      */
     void PopulateNeighborCache(const Ipv6InterfaceContainer& c) const;
 
     /**
-     * \brief Remove entries generated from NeighborCacheHelper from ARP cache and NDISC cache
+     * @brief Remove entries generated from NeighborCacheHelper from ARP cache and NDISC cache
      */
     void FlushAutoGenerated() const;
 
     /**
-     * \brief Enable/disable dynamic neighbor cache, auto-generated neighbor cache will update
+     * @brief Enable/disable dynamic neighbor cache, auto-generated neighbor cache will update
      * by IP addresses changed when dynamic neighbor cache enabled. User should ensure that
      * the NeighborCacheHelper object persists for the duration of the simulation when dynamic
      * neighbor cache is enabled.
-     * \param enable enable state
+     * @param enable enable state
      */
     void SetDynamicNeighborCache(bool enable);
 
   private:
     /**
-     * \brief Populate neighbor ARP entries for given IPv4 interface.
-     * \param ipv4Interface the Ipv4Interface to process
-     * \param neighborDeviceInterface the potential neighbor Ipv4Interface
+     * @brief Populate neighbor ARP entries for given IPv4 interface.
+     * @param ipv4Interface the Ipv4Interface to process
+     * @param neighborDeviceInterface the potential neighbor Ipv4Interface
      */
     void PopulateNeighborEntriesIpv4(Ptr<Ipv4Interface> ipv4Interface,
                                      Ptr<Ipv4Interface> neighborDeviceInterface) const;
 
     /**
-     * \brief Populate neighbor NDISC entries for given IPv6 interface.
-     * \param ipv6Interface the Ipv6Interface to process
-     * \param neighborDeviceInterface the potential neighbor Ipv6Interface
+     * @brief Populate neighbor NDISC entries for given IPv6 interface.
+     * @param ipv6Interface the Ipv6Interface to process
+     * @param neighborDeviceInterface the potential neighbor Ipv6Interface
      */
     void PopulateNeighborEntriesIpv6(Ptr<Ipv6Interface> ipv6Interface,
                                      Ptr<Ipv6Interface> neighborDeviceInterface) const;
 
     /**
-     * \brief Add an auto_generated entry to the ARP cache of an interface.
-     * \param netDeviceInterface the Ipv4Interface that ARP cache belongs to
-     * \param ipv4Address the IPv4 address will be added to the cache.
-     * \param macAddress the MAC address will be added to the cache.
+     * @brief Add an auto_generated entry to the ARP cache of an interface.
+     * @param netDeviceInterface the Ipv4Interface that ARP cache belongs to
+     * @param ipv4Address the IPv4 address will be added to the cache.
+     * @param macAddress the MAC address will be added to the cache.
      */
     void AddEntry(Ptr<Ipv4Interface> netDeviceInterface,
                   Ipv4Address ipv4Address,
                   Address macAddress) const;
 
     /**
-     * \brief Add an auto_generated entry to the NDISC cache of an interface.
-     * \param netDeviceInterface the Ipv6Interface that NDISC cache belongs to
-     * \param ipv6Address the IPv6 address will be added to the cache.
-     * \param macAddress the MAC address will be added to the cache.
+     * @brief Add an auto_generated entry to the NDISC cache of an interface.
+     * @param netDeviceInterface the Ipv6Interface that NDISC cache belongs to
+     * @param ipv6Address the IPv6 address will be added to the cache.
+     * @param macAddress the MAC address will be added to the cache.
      */
     void AddEntry(Ptr<Ipv6Interface> netDeviceInterface,
                   Ipv6Address ipv6Address,
                   Address macAddress) const;
 
     /**
-     * \brief Update neighbor caches when an address is removed from a Ipv4Interface with auto
+     * @brief Update neighbor caches when an address is removed from a Ipv4Interface with auto
      * generated neighbor cache.
-     * \param interface the Ipv4Interface that address removed from.
-     * \param ifAddr the removed IPv4 interface address.
+     * @param interface the Ipv4Interface that address removed from.
+     * @param ifAddr the removed IPv4 interface address.
      */
     void UpdateCacheByIpv4AddressRemoved(const Ptr<Ipv4Interface> interface,
                                          const Ipv4InterfaceAddress ifAddr) const;
 
     /**
-     * \brief Update neighbor caches when an address is added to a Ipv4Interface with auto generated
+     * @brief Update neighbor caches when an address is added to a Ipv4Interface with auto generated
      * neighbor cache.
-     * \param interface the Ipv4Interface that address added to.
-     * \param ifAddr the added IPv4 interface address.
+     * @param interface the Ipv4Interface that address added to.
+     * @param ifAddr the added IPv4 interface address.
      */
     void UpdateCacheByIpv4AddressAdded(const Ptr<Ipv4Interface> interface,
                                        const Ipv4InterfaceAddress ifAddr) const;
 
     /**
-     * \brief Update neighbor caches when an address is removed from a Ipv6Interface with auto
+     * @brief Update neighbor caches when an address is removed from a Ipv6Interface with auto
      * generated neighbor cache.
-     * \param interface the Ipv6Interface that address removed from.
-     * \param ifAddr the removed IPv6 interface address.
+     * @param interface the Ipv6Interface that address removed from.
+     * @param ifAddr the removed IPv6 interface address.
      */
     void UpdateCacheByIpv6AddressRemoved(const Ptr<Ipv6Interface> interface,
                                          const Ipv6InterfaceAddress ifAddr) const;
 
     /**
-     * \brief Update neighbor cache when an address is added to a Ipv6Interface with auto generated
+     * @brief Update neighbor cache when an address is added to a Ipv6Interface with auto generated
      * neighbor cache.
-     * \param interface the Ipv6Interface that address added to.
-     * \param ifAddr the added IPv6 interface address.
+     * @param interface the Ipv6Interface that address added to.
+     * @param ifAddr the added IPv6 interface address.
      */
     void UpdateCacheByIpv6AddressAdded(const Ptr<Ipv6Interface> interface,
                                        const Ipv6InterfaceAddress ifAddr) const;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/helper/rip-helper.h ns-3.44/src/internet/helper/rip-helper.h
--- ns-3.43/src/internet/helper/rip-helper.h	2024-10-09 16:41:09.880655800 -0700
+++ ns-3.44/src/internet/helper/rip-helper.h	2025-03-09 16:55:49.387371000 -0700
@@ -19,9 +19,9 @@
 {
 
 /**
- * \ingroup ipv4Helpers
+ * @ingroup ipv4Helpers
  *
- * \brief Helper class that adds RIP routing to nodes.
+ * @brief Helper class that adds RIP routing to nodes.
  *
  * This class is expected to be used in conjunction with
  * ns3::InternetStackHelper::SetRoutingHelper
@@ -37,9 +37,9 @@
     RipHelper();
 
     /**
-     * \brief Construct an RipHelper from another previously
+     * @brief Construct an RipHelper from another previously
      * initialized instance (Copy Constructor).
-     * \param o The object to copy from.
+     * @param o The object to copy from.
      */
     RipHelper(const RipHelper& o);
 
@@ -49,7 +49,7 @@
     RipHelper& operator=(const RipHelper&) = delete;
 
     /**
-     * \returns pointer to clone of this RipHelper
+     * @returns pointer to clone of this RipHelper
      *
      * This method is mainly for internal use by the other helpers;
      * clients are expected to free the dynamic memory allocated by this method
@@ -57,16 +57,16 @@
     RipHelper* Copy() const override;
 
     /**
-     * \param node the node on which the routing protocol will run
-     * \returns a newly-created routing protocol
+     * @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
      */
     Ptr<Ipv4RoutingProtocol> Create(Ptr<Node> node) const override;
 
     /**
-     * \param name the name of the attribute to set
-     * \param value the value of the attribute to set.
+     * @param name the name of the attribute to set
+     * @param value the value of the attribute to set.
      *
      * This method controls the attributes of ns3::Ripng
      */
@@ -78,49 +78,49 @@
      * have been assigned. The Install() method should have previously been
      * called by the user.
      *
-     * \param c NetDeviceContainer of the set of net devices for which the
+     * @param c NetDeviceContainer of the set of net devices for which the
      *          SixLowPanNetDevice 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
+     * @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);
 
     /**
-     * \brief Install a default route in the node.
+     * @brief Install a default route in the node.
      *
      * The traffic will be routed to the nextHop, located on the specified
      * interface, unless a more specific route is found.
      *
-     * \param node the node
-     * \param nextHop the next hop
-     * \param interface the network interface
+     * @param node the node
+     * @param nextHop the next hop
+     * @param interface the network interface
      */
     void SetDefaultRouter(Ptr<Node> node, Ipv4Address nextHop, uint32_t interface);
 
     /**
-     * \brief Exclude an interface from RIP protocol.
+     * @brief Exclude an interface from RIP protocol.
      *
      * You have to call this function \a before installing RIP in the nodes.
      *
      * Note: the exclusion means that RIP will not be propagated on that interface.
      * The network prefix on that interface will be still considered in RIP.
      *
-     * \param node the node
-     * \param interface the network interface to be excluded
+     * @param node the node
+     * @param interface the network interface to be excluded
      */
     void ExcludeInterface(Ptr<Node> node, uint32_t interface);
 
     /**
-     * \brief Set a metric for an interface.
+     * @brief Set a metric for an interface.
      *
      * You have to call this function \a before installing RIP in the nodes.
      *
      * Note: RIP will apply the metric on route message reception.
      * As a consequence, interface metric should be set on the receiver.
      *
-     * \param node the node
-     * \param interface the network interface
-     * \param metric the interface metric
+     * @param node the node
+     * @param interface the network interface
+     * @param metric the interface metric
      */
     void SetInterfaceMetric(Ptr<Node> node, uint32_t interface, uint8_t metric);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/helper/ripng-helper.h ns-3.44/src/internet/helper/ripng-helper.h
--- ns-3.43/src/internet/helper/ripng-helper.h	2024-10-09 16:41:09.880655800 -0700
+++ ns-3.44/src/internet/helper/ripng-helper.h	2025-03-09 16:55:49.387371000 -0700
@@ -21,9 +21,9 @@
 {
 
 /**
- * \ingroup ipv6Helpers
+ * @ingroup ipv6Helpers
  *
- * \brief Helper class that adds RIPng routing to nodes.
+ * @brief Helper class that adds RIPng routing to nodes.
  *
  * This class is expected to be used in conjunction with
  * ns3::InternetStackHelper::SetRoutingHelper
@@ -39,9 +39,9 @@
     RipNgHelper();
 
     /**
-     * \brief Construct an RipNgHelper from another previously
+     * @brief Construct an RipNgHelper from another previously
      * initialized instance (Copy Constructor).
-     * \param o The object to copy from.
+     * @param o The object to copy from.
      */
     RipNgHelper(const RipNgHelper& o);
 
@@ -51,7 +51,7 @@
     RipNgHelper& operator=(const RipNgHelper&) = delete;
 
     /**
-     * \returns pointer to clone of this RipNgHelper
+     * @returns pointer to clone of this RipNgHelper
      *
      * This method is mainly for internal use by the other helpers;
      * clients are expected to free the dynamic memory allocated by this method
@@ -59,16 +59,16 @@
     RipNgHelper* Copy() const override;
 
     /**
-     * \param node the node on which the routing protocol will run
-     * \returns a newly-created routing protocol
+     * @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
      */
     Ptr<Ipv6RoutingProtocol> Create(Ptr<Node> node) const override;
 
     /**
-     * \param name the name of the attribute to set
-     * \param value the value of the attribute to set.
+     * @param name the name of the attribute to set
+     * @param value the value of the attribute to set.
      *
      * This method controls the attributes of ns3::RipNg
      */
@@ -80,49 +80,49 @@
      * have been assigned. The Install() method should have previously been
      * called by the user.
      *
-     * \param c NetDeviceContainer of the set of net devices for which the
+     * @param c NetDeviceContainer of the set of net devices for which the
      *          SixLowPanNetDevice 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
+     * @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);
 
     /**
-     * \brief Install a default route in the node.
+     * @brief Install a default route in the node.
      *
      * The traffic will be routed to the nextHop, located on the specified
      * interface, unless a more specific route is found.
      *
-     * \param node the node
-     * \param nextHop the next hop
-     * \param interface the network interface
+     * @param node the node
+     * @param nextHop the next hop
+     * @param interface the network interface
      */
     void SetDefaultRouter(Ptr<Node> node, Ipv6Address nextHop, uint32_t interface);
 
     /**
-     * \brief Exclude an interface from RIPng protocol.
+     * @brief Exclude an interface from RIPng protocol.
      *
      * You have to call this function \a before installing RIPng in the nodes.
      *
      * Note: the exclusion means that RIPng will not be propagated on that interface.
      * The network prefix on that interface will be still considered in RIPng.
      *
-     * \param node the node
-     * \param interface the network interface to be excluded
+     * @param node the node
+     * @param interface the network interface to be excluded
      */
     void ExcludeInterface(Ptr<Node> node, uint32_t interface);
 
     /**
-     * \brief Set a metric for an interface.
+     * @brief Set a metric for an interface.
      *
      * You have to call this function \a before installing RIPng in the nodes.
      *
      * Note: RIPng will apply the metric on route message reception.
      * As a consequence, interface metric should be set on the receiver.
      *
-     * \param node the node
-     * \param interface the network interface
-     * \param metric the interface metric
+     * @param node the node
+     * @param interface the network interface
+     * @param metric the interface metric
      */
     void SetInterfaceMetric(Ptr<Node> node, uint32_t interface, uint8_t metric);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/arp-cache.h ns-3.44/src/internet/model/arp-cache.h
--- ns-3.43/src/internet/model/arp-cache.h	2024-10-09 16:41:09.880655800 -0700
+++ ns-3.44/src/internet/model/arp-cache.h	2025-03-09 16:55:49.387371000 -0700
@@ -32,8 +32,8 @@
 class Ipv4Header;
 
 /**
- * \ingroup arp
- * \brief An ARP cache
+ * @ingroup arp
+ * @brief An ARP cache
  *
  * A cached lookup table for translating layer 3 addresses to layer 2.
  * This implementation does lookups from IPv4 to a MAC address
@@ -42,8 +42,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     class Entry;
@@ -56,52 +56,52 @@
     ArpCache& operator=(const ArpCache&) = delete;
 
     /**
-     * \brief Set the NetDevice and Ipv4Interface associated with the ArpCache
+     * @brief Set the NetDevice and Ipv4Interface associated with the ArpCache
      *
-     * \param device The hardware NetDevice associated with this ARP cache
-     * \param interface the Ipv4Interface associated with this ARP cache
+     * @param device The hardware NetDevice associated with this ARP cache
+     * @param interface the Ipv4Interface associated with this ARP cache
      */
     void SetDevice(Ptr<NetDevice> device, Ptr<Ipv4Interface> interface);
     /**
-     * \brief Returns the NetDevice that this ARP cache is associated with
-     * \return The NetDevice that this ARP cache is associated with
+     * @brief Returns the NetDevice that this ARP cache is associated with
+     * @return The NetDevice that this ARP cache is associated with
      */
     Ptr<NetDevice> GetDevice() const;
     /**
-     * \brief Returns the Ipv4Interface that this ARP cache is associated with
-     * \return the Ipv4Interface that this ARP cache is associated with
+     * @brief Returns the Ipv4Interface that this ARP cache is associated with
+     * @return the Ipv4Interface that this ARP cache is associated with
      */
     Ptr<Ipv4Interface> GetInterface() const;
 
     /**
-     * \brief Set the time the entry will be in ALIVE state (unless refreshed)
-     * \param aliveTimeout the Alive state timeout
+     * @brief Set the time the entry will be in ALIVE state (unless refreshed)
+     * @param aliveTimeout the Alive state timeout
      */
     void SetAliveTimeout(Time aliveTimeout);
     /**
-     * \brief Set the time the entry will be in DEAD state before being removed
-     * \param deadTimeout the Dead state timeout
+     * @brief Set the time the entry will be in DEAD state before being removed
+     * @param deadTimeout the Dead state timeout
      */
     void SetDeadTimeout(Time deadTimeout);
     /**
-     * \brief Set the time the entry will be in WAIT_REPLY state
-     * \param waitReplyTimeout the WAIT_REPLY state timeout
+     * @brief Set the time the entry will be in WAIT_REPLY state
+     * @param waitReplyTimeout the WAIT_REPLY state timeout
      */
     void SetWaitReplyTimeout(Time waitReplyTimeout);
 
     /**
-     * \brief Get the time the entry will be in ALIVE state (unless refreshed)
-     * \returns the Alive state timeout
+     * @brief Get the time the entry will be in ALIVE state (unless refreshed)
+     * @returns the Alive state timeout
      */
     Time GetAliveTimeout() const;
     /**
-     * \brief Get the time the entry will be in DEAD state before being removed
-     * \returns the Dead state timeout
+     * @brief Get the time the entry will be in DEAD state before being removed
+     * @returns the Dead state timeout
      */
     Time GetDeadTimeout() const;
     /**
-     * \brief Get the time the entry will be in WAIT_REPLY state
-     * \returns the WAIT_REPLY state timeout
+     * @brief Get the time the entry will be in WAIT_REPLY state
+     * @returns the WAIT_REPLY state timeout
      */
     Time GetWaitReplyTimeout() const;
 
@@ -110,7 +110,7 @@
      * the cache to generate an Arp request when the WaitReply
      * time expires and a retransmission must be sent
      *
-     * \param arpRequestCallback Callback for transmitting an Arp request.
+     * @param arpRequestCallback Callback for transmitting an Arp request.
      */
     void SetArpRequestCallback(Callback<void, Ptr<const ArpCache>, Ipv4Address> arpRequestCallback);
     /**
@@ -120,167 +120,167 @@
      */
     void StartWaitReplyTimer();
     /**
-     * \brief Do lookup in the ARP cache against an IP address
-     * \param destination The destination IPv4 address to lookup the MAC address
+     * @brief Do lookup in the ARP cache against an IP address
+     * @param destination The destination IPv4 address to lookup the MAC address
      * of
-     * \return An ArpCache::Entry with info about layer 2
+     * @return An ArpCache::Entry with info about layer 2
      */
     ArpCache::Entry* Lookup(Ipv4Address destination);
     /**
-     * \brief Do lookup in the ARP cache against a MAC address
-     * \param destination The destination MAC address to lookup
+     * @brief Do lookup in the ARP cache against a MAC address
+     * @param destination The destination MAC address to lookup
      * of
-     * \return A std::list of ArpCache::Entry with info about layer 2
+     * @return A std::list of ArpCache::Entry with info about layer 2
      */
     std::list<ArpCache::Entry*> LookupInverse(Address destination);
     /**
-     * \brief Add an Ipv4Address to this ARP cache
-     * \param to the destination address of the ARP entry.
-     * \returns A pointer to a new ARP Entry.
+     * @brief Add an Ipv4Address to this ARP cache
+     * @param to the destination address of the ARP entry.
+     * @returns A pointer to a new ARP Entry.
      */
     ArpCache::Entry* Add(Ipv4Address to);
     /**
-     * \brief Remove an entry.
-     * \param entry pointer to delete it from the list
+     * @brief Remove an entry.
+     * @param entry pointer to delete it from the list
      */
     void Remove(ArpCache::Entry* entry);
     /**
-     * \brief Clear the ArpCache of all entries
+     * @brief Clear the ArpCache of all entries
      */
     void Flush();
 
     /**
-     * \brief Print the ARP cache entries
+     * @brief Print the ARP cache entries
      *
-     * \param stream the ostream the ARP cache entries is printed to
+     * @param stream the ostream the ARP cache entries is printed to
      */
     void PrintArpCache(Ptr<OutputStreamWrapper> stream);
 
     /**
-     * \brief Clear the ArpCache of all Auto-Generated entries
+     * @brief Clear the ArpCache of all Auto-Generated entries
      */
     void RemoveAutoGeneratedEntries();
 
     /**
-     * \brief Pair of a packet and an Ipv4 header.
+     * @brief Pair of a packet and an Ipv4 header.
      */
     typedef std::pair<Ptr<Packet>, Ipv4Header> Ipv4PayloadHeaderPair;
 
     /**
-     * \brief A record that that holds information about an ArpCache entry
+     * @brief A record that that holds information about an ArpCache entry
      */
     class Entry
     {
       public:
         /**
-         * \brief Constructor
-         * \param arp The ArpCache this entry belongs to
+         * @brief Constructor
+         * @param arp The ArpCache this entry belongs to
          */
         Entry(ArpCache* arp);
 
         /**
-         * \brief Changes the state of this entry to dead
+         * @brief Changes the state of this entry to dead
          */
         void MarkDead();
         /**
-         * \param macAddress
+         * @param macAddress
          */
         void MarkAlive(Address macAddress);
         /**
-         * \param waiting
+         * @param waiting
          */
         void MarkWaitReply(Ipv4PayloadHeaderPair waiting);
         /**
-         * \brief Changes the state of this entry to Permanent.
+         * @brief Changes the state of this entry to Permanent.
          *
          * The entry must have a valid MacAddress.
          */
         void MarkPermanent();
         /**
-         * \brief Changes the state of this entry to auto-generated.
+         * @brief Changes the state of this entry to auto-generated.
          *
          * The entry must have a valid MacAddress.
          */
         void MarkAutoGenerated();
         /**
-         * \param waiting
-         * \return
+         * @param waiting
+         * @return
          */
         bool UpdateWaitReply(Ipv4PayloadHeaderPair waiting);
         /**
-         * \return True if the state of this entry is dead; false otherwise.
+         * @return True if the state of this entry is dead; false otherwise.
          */
         bool IsDead();
         /**
-         * \return True if the state of this entry is alive; false otherwise.
+         * @return True if the state of this entry is alive; false otherwise.
          */
         bool IsAlive();
         /**
-         * \return True if the state of this entry is wait_reply; false otherwise.
+         * @return True if the state of this entry is wait_reply; false otherwise.
          */
         bool IsWaitReply();
         /**
-         * \return True if the state of this entry is permanent; false otherwise.
+         * @return True if the state of this entry is permanent; false otherwise.
          */
         bool IsPermanent();
         /**
-         * \return True if the state of this entry is auto-generated; false otherwise.
+         * @return True if the state of this entry is auto-generated; false otherwise.
          */
         bool IsAutoGenerated();
         /**
-         * \return The MacAddress of this entry
+         * @return The MacAddress of this entry
          */
         Address GetMacAddress() const;
         /**
-         * \return The Ipv4Address for this entry
+         * @return The Ipv4Address for this entry
          */
         Ipv4Address GetIpv4Address() const;
         /**
-         * \param macAddress The MacAddress for this entry
+         * @param macAddress The MacAddress for this entry
          */
         void SetMacAddress(Address macAddress);
         /**
-         * \param destination The Ipv4Address for this entry
+         * @param destination The Ipv4Address for this entry
          */
         void SetIpv4Address(Ipv4Address destination);
         /**
-         * \return True if this entry has timed out; false otherwise.
+         * @return True if this entry has timed out; false otherwise.
          *
          * This function returns true if the time elapsed strictly exceeds
          * the timeout value (i.e., is not less than or equal to the timeout).
          */
         bool IsExpired() const;
         /**
-         * \returns 0 is no packet is pending, the next packet to send if
+         * @returns 0 is no packet is pending, the next packet to send if
          *            packets are pending.
          */
         Ipv4PayloadHeaderPair DequeuePending();
         /**
-         * \brief Clear the pending packet list
+         * @brief Clear the pending packet list
          */
         void ClearPendingPacket();
         /**
-         * \returns number of retries that have been sent for an ArpRequest
+         * @returns number of retries that have been sent for an ArpRequest
          *  in WaitReply state.
          */
         uint32_t GetRetries() const;
         /**
-         * \brief Increment the counter of number of retries for an entry
+         * @brief Increment the counter of number of retries for an entry
          */
         void IncrementRetries();
         /**
-         * \brief Zero the counter of number of retries for an entry
+         * @brief Zero the counter of number of retries for an entry
          */
         void ClearRetries();
 
         /**
-         * \brief Update the entry when seeing a packet
+         * @brief Update the entry when seeing a packet
          */
         void UpdateSeen();
 
       private:
         /**
-         * \brief ARP cache entry states
+         * @brief ARP cache entry states
          */
         enum ArpCacheEntryState_e
         {
@@ -292,8 +292,8 @@
         };
 
         /**
-         * \brief Returns the entry timeout
-         * \returns the entry timeout
+         * @brief Returns the entry timeout
+         * @returns the entry timeout
          */
         Time GetTimeout() const;
 
@@ -308,11 +308,11 @@
 
   private:
     /**
-     * \brief ARP Cache container
+     * @brief ARP Cache container
      */
     typedef std::map<Ipv4Address, ArpCache::Entry*> Cache;
     /**
-     * \brief ARP Cache container iterator
+     * @brief ARP Cache container iterator
      */
     typedef std::map<Ipv4Address, ArpCache::Entry*>::iterator CacheI;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/arp-header.cc ns-3.44/src/internet/model/arp-header.cc
--- ns-3.43/src/internet/model/arp-header.cc	2024-10-09 16:41:09.880655800 -0700
+++ ns-3.44/src/internet/model/arp-header.cc	2025-03-09 16:55:49.387371000 -0700
@@ -27,6 +27,7 @@
 {
     NS_LOG_FUNCTION(this << sourceHardwareAddress << sourceProtocolAddress
                          << destinationHardwareAddress << destinationProtocolAddress);
+    m_hardwareType = DetermineHardwareType(sourceHardwareAddress);
     m_type = ARP_TYPE_REQUEST;
     m_macSource = sourceHardwareAddress;
     m_macDest = destinationHardwareAddress;
@@ -42,6 +43,7 @@
 {
     NS_LOG_FUNCTION(this << sourceHardwareAddress << sourceProtocolAddress
                          << destinationHardwareAddress << destinationProtocolAddress);
+    m_hardwareType = DetermineHardwareType(sourceHardwareAddress);
     m_type = ARP_TYPE_REPLY;
     m_macSource = sourceHardwareAddress;
     m_macDest = destinationHardwareAddress;
@@ -49,6 +51,22 @@
     m_ipv4Dest = destinationProtocolAddress;
 }
 
+ArpHeader::HardwareType
+ArpHeader::DetermineHardwareType(const Address& address) const
+{
+    NS_LOG_FUNCTION(this << address);
+    uint8_t addressLength = address.GetLength();
+    switch (addressLength)
+    {
+    case 6:
+        return HardwareType::ETHERNET;
+    case 8:
+        return HardwareType::EUI_64;
+    default:
+        return HardwareType::UNKNOWN;
+    }
+}
+
 bool
 ArpHeader::IsRequest() const
 {
@@ -63,6 +81,13 @@
     return m_type == ARP_TYPE_REPLY;
 }
 
+ArpHeader::HardwareType
+ArpHeader::GetHardwareType() const
+{
+    NS_LOG_FUNCTION(this);
+    return m_hardwareType;
+}
+
 Address
 ArpHeader::GetSourceHardwareAddress() const
 {
@@ -114,7 +139,8 @@
     NS_LOG_FUNCTION(this << &os);
     if (IsRequest())
     {
-        os << "request "
+        os << "hardware type: " << GetHardwareType() << " "
+           << "request "
            << "source mac: " << m_macSource << " "
            << "source ipv4: " << m_ipv4Source << " "
            << "dest ipv4: " << m_ipv4Dest;
@@ -122,7 +148,8 @@
     else
     {
         NS_ASSERT(IsReply());
-        os << "reply "
+        os << "hardware type: " << GetHardwareType() << " "
+           << "reply "
            << "source mac: " << m_macSource << " "
            << "source ipv4: " << m_ipv4Source << " "
            << "dest mac: " << m_macDest << " "
@@ -151,8 +178,7 @@
     Buffer::Iterator i = start;
     NS_ASSERT(m_macSource.GetLength() == m_macDest.GetLength());
 
-    /* ethernet */
-    i.WriteHtonU16(0x0001);
+    i.WriteHtonU16(static_cast<uint16_t>(m_hardwareType));
     /* ipv4 */
     i.WriteHtonU16(0x0800);
     i.WriteU8(m_macSource.GetLength());
@@ -169,10 +195,10 @@
 {
     NS_LOG_FUNCTION(this << &start);
     Buffer::Iterator i = start;
-    i.Next(2);                                // Skip HRD
-    uint32_t protocolType = i.ReadNtohU16();  // Read PRO
-    uint32_t hardwareAddressLen = i.ReadU8(); // Read HLN
-    uint32_t protocolAddressLen = i.ReadU8(); // Read PLN
+    m_hardwareType = static_cast<HardwareType>(i.ReadNtohU16()); // Read HTYPE
+    uint32_t protocolType = i.ReadNtohU16();                     // Read PRO
+    uint32_t hardwareAddressLen = i.ReadU8();                    // Read HLN
+    uint32_t protocolAddressLen = i.ReadU8();                    // Read PLN
 
     //
     // It is implicit here that we have a protocol type of 0x800 (IP).
@@ -185,12 +211,27 @@
         return 0;
     }
 
-    m_type = i.ReadNtohU16();                     // Read OP
-    ReadFrom(i, m_macSource, hardwareAddressLen); // Read SHA (size HLN)
-    ReadFrom(i, m_ipv4Source);                    // Read SPA (size PLN == 4)
-    ReadFrom(i, m_macDest, hardwareAddressLen);   // Read THA (size HLN)
-    ReadFrom(i, m_ipv4Dest);                      // Read TPA (size PLN == 4)
+    m_type = static_cast<ArpType_e>(i.ReadNtohU16()); // Read OP
+    ReadFrom(i, m_macSource, hardwareAddressLen);     // Read SHA (size HLN)
+    ReadFrom(i, m_ipv4Source);                        // Read SPA (size PLN == 4)
+    ReadFrom(i, m_macDest, hardwareAddressLen);       // Read THA (size HLN)
+    ReadFrom(i, m_ipv4Dest);                          // Read TPA (size PLN == 4)
     return GetSerializedSize();
 }
 
+std::ostream&
+operator<<(std::ostream& os, ArpHeader::HardwareType hardwareType)
+{
+    switch (hardwareType)
+    {
+    case ArpHeader::HardwareType::ETHERNET:
+        return (os << "Ethernet");
+    case ArpHeader::HardwareType::EUI_64:
+        return (os << "EUI-64");
+    case ArpHeader::HardwareType::UNKNOWN:
+        return (os << "Unknown Hardware Type");
+    }
+    return os << "Unrecognized Hardware Type(" << static_cast<uint16_t>(hardwareType) << ")";
+}
+
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/arp-header.h ns-3.44/src/internet/model/arp-header.h
--- ns-3.43/src/internet/model/arp-header.h	2024-10-09 16:41:09.880655800 -0700
+++ ns-3.44/src/internet/model/arp-header.h	2025-03-09 16:55:49.387371000 -0700
@@ -13,36 +13,61 @@
 #include "ns3/header.h"
 #include "ns3/ipv4-address.h"
 
-#include <string>
-
 namespace ns3
 {
 /**
- * \ingroup arp
- * \brief The packet header for an ARP packet
+ * @ingroup arp
+ * @brief The packet header for an ARP packet
  */
 class ArpHeader : public Header
 {
   public:
     /**
-     * \brief Set the ARP request parameters
-     * \param sourceHardwareAddress the source hardware address
-     * \param sourceProtocolAddress the source IP address
-     * \param destinationHardwareAddress the destination hardware address (usually the
+     * @brief Enumeration listing the possible ARP types
+     *
+     * These ARP types are part of the standard ARP packet format as defined in Section
+     * "Definitions" of \RFC{826}.
+     */
+    enum ArpType_e : uint16_t
+    {
+        ARP_TYPE_REQUEST = 1,
+        ARP_TYPE_REPLY = 2
+    };
+
+    /**
+     * @brief Enumeration listing the supported hardware types
+     *
+     * \RFC{826} specifies that the Hardware Type field in the ARP packet indicates the type
+     of hardware used.
+     * For the full list of Hardware Types, refer to:
+     * https://www.iana.org/assignments/arp-parameters/arp-parameters.xhtml
+     */
+    enum class HardwareType : uint16_t
+    {
+        UNKNOWN = 0,
+        ETHERNET = 1,
+        EUI_64 = 27,
+    };
+
+    /**
+     * @brief Set the ARP request parameters
+     * @param sourceHardwareAddress the source hardware address
+     * @param sourceProtocolAddress the source IP address
+     * @param destinationHardwareAddress the destination hardware address (usually the
      * broadcast address)
-     * \param destinationProtocolAddress the destination IP address
+     * @param destinationProtocolAddress the destination IP address
      */
     void SetRequest(Address sourceHardwareAddress,
                     Ipv4Address sourceProtocolAddress,
                     Address destinationHardwareAddress,
                     Ipv4Address destinationProtocolAddress);
     /**
-     * \brief Set the ARP reply parameters
-     * \param sourceHardwareAddress the source hardware address
-     * \param sourceProtocolAddress the source IP address
-     * \param destinationHardwareAddress the destination hardware address (usually the
+     * @brief Set the ARP reply parameters
+     * @param sourceHardwareAddress the source hardware address
+     * @param sourceProtocolAddress the source IP address
+     * @param destinationHardwareAddress the destination hardware address (usually the
      * broadcast address)
-     * \param destinationProtocolAddress the destination IP address
+     * @param destinationProtocolAddress the destination IP address
      */
     void SetReply(Address sourceHardwareAddress,
                   Ipv4Address sourceProtocolAddress,
@@ -50,44 +75,66 @@
                   Ipv4Address destinationProtocolAddress);
 
     /**
-     * \brief Check if the ARP is a request
-     * \returns true if it is a request
+     * @brief Determines the hardware type based on the length of the address.
+     *
+     * This method determines the hardware type based on the length of the address.
+     * It supports two common hardware address lengths:
+     * - 6 bytes: Assumed to be Ethernet.
+     * - 8 bytes: Assumed to be EUI-64.
+     *
+     * If the length of the address does not match these common lengths, the method defaults
+     * to Unknown hardware type.
+     *
+     * @param address The address whose length is used to determine the hardware type.
+     * @return The corresponding hardware type.
+     */
+    HardwareType DetermineHardwareType(const Address& address) const;
+
+    /**
+     * @brief Check if the ARP is a request
+     * @returns true if it is a request
      */
     bool IsRequest() const;
 
     /**
-     * \brief Check if the ARP is a reply
-     * \returns true if it is a reply
+     * @brief Check if the ARP is a reply
+     * @returns true if it is a reply
      */
     bool IsReply() const;
 
     /**
-     * \brief Returns the source hardware address
-     * \returns the source hardware address
+     * @brief Get the hardware type
+     * @return the hardware type
+     */
+    HardwareType GetHardwareType() const;
+
+    /**
+     * @brief Returns the source hardware address
+     * @returns the source hardware address
      */
     Address GetSourceHardwareAddress() const;
 
     /**
-     * \brief Returns the destination hardware address
-     * \returns the destination hardware address
+     * @brief Returns the destination hardware address
+     * @returns the destination hardware address
      */
     Address GetDestinationHardwareAddress() const;
 
     /**
-     * \brief Returns the source IP address
-     * \returns the source IP address
+     * @brief Returns the source IP address
+     * @returns the source IP address
      */
     Ipv4Address GetSourceIpv4Address() const;
 
     /**
-     * \brief Returns the destination IP address
-     * \returns the destination IP address
+     * @brief Returns the destination IP address
+     * @returns the destination IP address
      */
     Ipv4Address GetDestinationIpv4Address() const;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -96,22 +143,23 @@
     void Serialize(Buffer::Iterator start) const override;
     uint32_t Deserialize(Buffer::Iterator start) override;
 
-    /**
-     * \brief Enumeration listing the possible ARP types
-     */
-    enum ArpType_e
-    {
-        ARP_TYPE_REQUEST = 1,
-        ARP_TYPE_REPLY = 2
-    };
-
-    uint16_t m_type;          //!< type of the ICMP (ARP_TYPE_REQUEST)
-    Address m_macSource;      //!< hardware source address
-    Address m_macDest;        //!< hardware destination address
-    Ipv4Address m_ipv4Source; //!< IP source address
-    Ipv4Address m_ipv4Dest;   //!< IP destination address
+    HardwareType m_hardwareType; //!< hardware type
+    ArpType_e m_type;            //!< type of the ICMP packet
+    Address m_macSource;         //!< hardware source address
+    Address m_macDest;           //!< hardware destination address
+    Ipv4Address m_ipv4Source;    //!< IP source address
+    Ipv4Address m_ipv4Dest;      //!< IP destination address
 };
 
+/**
+ * @brief Stream insertion operator.
+ *
+ * @param os The reference to the output stream
+ * @param hardwareType the hardware type
+ * @return The reference to the output stream.
+ */
+std::ostream& operator<<(std::ostream& os, ArpHeader::HardwareType hardwareType);
+
 } // namespace ns3
 
 #endif /* ARP_HEADER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/arp-l3-protocol.cc ns-3.44/src/internet/model/arp-l3-protocol.cc
--- ns-3.43/src/internet/model/arp-l3-protocol.cc	2024-10-09 16:41:09.884656000 -0700
+++ ns-3.44/src/internet/model/arp-l3-protocol.cc	2025-03-09 16:55:49.387371000 -0700
@@ -202,7 +202,7 @@
     }
 
     /**
-     * \internal
+     * @internal
      * Note: we do not update the ARP cache when we receive an ARP request
      *  from an unknown node. See \bugid{107}
      */
@@ -292,7 +292,7 @@
                 NS_LOG_LOGIC("node=" << m_node->GetId() << ", dead entry for " << destination
                                      << " expired -- send arp request");
                 entry->MarkWaitReply(ArpCache::Ipv4PayloadHeaderPair(packet, ipHeader));
-                Simulator::Schedule(Time(MilliSeconds(m_requestJitter->GetValue())),
+                Simulator::Schedule(MilliSeconds(m_requestJitter->GetValue()),
                                     &ArpL3Protocol::SendArpRequest,
                                     this,
                                     cache,
@@ -303,7 +303,7 @@
                 NS_LOG_LOGIC("node=" << m_node->GetId() << ", alive entry for " << destination
                                      << " expired -- send arp request");
                 entry->MarkWaitReply(ArpCache::Ipv4PayloadHeaderPair(packet, ipHeader));
-                Simulator::Schedule(Time(MilliSeconds(m_requestJitter->GetValue())),
+                Simulator::Schedule(MilliSeconds(m_requestJitter->GetValue()),
                                     &ArpL3Protocol::SendArpRequest,
                                     this,
                                     cache,
@@ -364,7 +364,7 @@
                              << " -- send arp request");
         entry = cache->Add(destination);
         entry->MarkWaitReply(ArpCache::Ipv4PayloadHeaderPair(packet, ipHeader));
-        Simulator::Schedule(Time(MilliSeconds(m_requestJitter->GetValue())),
+        Simulator::Schedule(MilliSeconds(m_requestJitter->GetValue()),
                             &ArpL3Protocol::SendArpRequest,
                             this,
                             cache,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/arp-l3-protocol.h ns-3.44/src/internet/model/arp-l3-protocol.h
--- ns-3.43/src/internet/model/arp-l3-protocol.h	2024-10-09 16:41:09.884656000 -0700
+++ ns-3.44/src/internet/model/arp-l3-protocol.h	2025-03-09 16:55:49.387371000 -0700
@@ -29,8 +29,8 @@
 class TrafficControlLayer;
 
 /**
- * \ingroup ipv4
- * \defgroup arp ARP protocol.
+ * @ingroup ipv4
+ * @defgroup arp ARP protocol.
  *
  * The ARP protocol and its associated tables are responsible
  * for the IPv4 - MAC address translation.
@@ -38,15 +38,15 @@
  */
 
 /**
- * \ingroup arp
- * \brief An implementation of the ARP protocol.
+ * @ingroup arp
+ * @brief An implementation of the ARP protocol.
  */
 class ArpL3Protocol : public Object
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     static const uint16_t PROT_NUMBER; //!< ARP protocol number (0x0806)
@@ -59,33 +59,33 @@
     ArpL3Protocol& operator=(const ArpL3Protocol&) = delete;
 
     /**
-     * \brief Set the node the ARP L3 protocol is associated with
-     * \param node the node
+     * @brief Set the node the ARP L3 protocol is associated with
+     * @param node the node
      */
     void SetNode(Ptr<Node> node);
 
     /**
-     * \brief Set the TrafficControlLayer.
-     * \param tc TrafficControlLayer object
+     * @brief Set the TrafficControlLayer.
+     * @param tc TrafficControlLayer object
      */
     void SetTrafficControl(Ptr<TrafficControlLayer> tc);
 
     /**
-     * \brief Create an ARP cache for the device/interface
-     * \param device the NetDevice
-     * \param interface the Ipv4Interface
-     * \returns a smart pointer to the ARP cache
+     * @brief Create an ARP cache for the device/interface
+     * @param device the NetDevice
+     * @param interface the Ipv4Interface
+     * @returns a smart pointer to the ARP cache
      */
     Ptr<ArpCache> CreateCache(Ptr<NetDevice> device, Ptr<Ipv4Interface> interface);
 
     /**
-     * \brief Receive a packet
-     * \param device the source NetDevice
-     * \param p the packet
-     * \param protocol the protocol
-     * \param from the source address
-     * \param to the destination address
-     * \param packetType type of packet (i.e., unicast, multicast, etc.)
+     * @brief Receive a packet
+     * @param device the source NetDevice
+     * @param p the packet
+     * @param protocol the protocol
+     * @param from the source address
+     * @param to the destination address
+     * @param packetType type of packet (i.e., unicast, multicast, etc.)
      */
     void Receive(Ptr<NetDevice> device,
                  Ptr<const Packet> p,
@@ -94,14 +94,14 @@
                  const Address& to,
                  NetDevice::PacketType packetType);
     /**
-     * \brief Perform an ARP lookup
-     * \param p the packet
-     * \param ipHeader the IPv4 header
-     * \param destination destination IP address
-     * \param device outgoing device
-     * \param cache ARP cache
-     * \param hardwareDestination filled with the destination MAC address (if the entry exists)
-     * \return true if there is a matching ARP Entry
+     * @brief Perform an ARP lookup
+     * @param p the packet
+     * @param ipHeader the IPv4 header
+     * @param destination destination IP address
+     * @param device outgoing device
+     * @param cache ARP cache
+     * @param hardwareDestination filled with the destination MAC address (if the entry exists)
+     * @return true if there is a matching ARP Entry
      */
     bool Lookup(Ptr<Packet> p,
                 const Ipv4Header& ipHeader,
@@ -115,8 +115,8 @@
      * used by this model.  Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream);
 
@@ -133,24 +133,24 @@
     typedef std::list<Ptr<ArpCache>> CacheList; //!< container of the ARP caches
 
     /**
-     * \brief Finds the cache associated with a NetDevice
-     * \param device the NetDevice
-     * \returns the ARP cache, or null if no cache is found
+     * @brief Finds the cache associated with a NetDevice
+     * @param device the NetDevice
+     * @returns the ARP cache, or null if no cache is found
      */
     Ptr<ArpCache> FindCache(Ptr<NetDevice> device);
 
     /**
-     * \brief Send an ARP request to an host
-     * \param cache the ARP cache to use
-     * \param to the destination IP
+     * @brief Send an ARP request to an host
+     * @param cache the ARP cache to use
+     * @param to the destination IP
      */
     void SendArpRequest(Ptr<const ArpCache> cache, Ipv4Address to);
     /**
-     * \brief Send an ARP reply to an host
-     * \param cache the ARP cache to use
-     * \param myIp the source IP address
-     * \param toIp the destination IP
-     * \param toMac the destination MAC address
+     * @brief Send an ARP reply to an host
+     * @param cache the ARP cache to use
+     * @param myIp the source IP address
+     * @param toIp the destination IP
+     * @param toMac the destination MAC address
      */
     void SendArpReply(Ptr<const ArpCache> cache, Ipv4Address myIp, Ipv4Address toIp, Address toMac);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/arp-queue-disc-item.h ns-3.44/src/internet/model/arp-queue-disc-item.h
--- ns-3.43/src/internet/model/arp-queue-disc-item.h	2024-10-09 16:41:09.884656000 -0700
+++ ns-3.44/src/internet/model/arp-queue-disc-item.h	2025-03-09 16:55:49.387371000 -0700
@@ -16,8 +16,8 @@
 {
 
 /**
- * \ingroup arp
- * \ingroup traffic-control
+ * @ingroup arp
+ * @ingroup traffic-control
  *
  * ArpQueueDiscItem is a subclass of QueueDiscItem which stores ARP packets.
  * Header and payload are kept separate to allow the queue disc to hash the
@@ -27,11 +27,11 @@
 {
   public:
     /**
-     * \brief Create an ARP queue disc item containing an ARP packet.
-     * \param p the packet included in the created item.
-     * \param addr the destination MAC address
-     * \param protocol the protocol number
-     * \param header the ARP header
+     * @brief Create an ARP queue disc item containing an ARP packet.
+     * @param p the packet included in the created item.
+     * @param addr the destination MAC address
+     * @param protocol the protocol number
+     * @param header the ARP header
      */
     ArpQueueDiscItem(Ptr<Packet> p,
                      const Address& addr,
@@ -47,37 +47,37 @@
     ArpQueueDiscItem& operator=(const ArpQueueDiscItem&) = delete;
 
     /**
-     * \return the correct packet size (header plus payload).
+     * @return the correct packet size (header plus payload).
      */
     uint32_t GetSize() const override;
 
     /**
-     * \return the header stored in this item..
+     * @return the header stored in this item..
      */
     const ArpHeader& GetHeader() const;
 
     /**
-     * \brief Add the header to the packet
+     * @brief Add the header to the packet
      */
     void AddHeader() override;
 
     /**
-     * \brief Print the item contents.
-     * \param os output stream in which the data should be printed.
+     * @brief Print the item contents.
+     * @param os output stream in which the data should be printed.
      */
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Inherited from the base class, but we cannot mark ARP packets
-     * \return false
+     * @brief Inherited from the base class, but we cannot mark ARP packets
+     * @return false
      */
     bool Mark() override;
 
     /**
-     * \brief Computes the hash of the packet's 5-tuple
+     * @brief Computes the hash of the packet's 5-tuple
      *
-     * \param perturbation hash perturbation value
-     * \return the hash of the packet's 5-tuple
+     * @param perturbation hash perturbation value
+     * @return the hash of the packet's 5-tuple
      */
     uint32_t Hash(uint32_t perturbation) const override;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/candidate-queue.cc ns-3.44/src/internet/model/candidate-queue.cc
--- ns-3.43/src/internet/model/candidate-queue.cc	2024-10-09 16:41:09.884656000 -0700
+++ ns-3.44/src/internet/model/candidate-queue.cc	2025-03-09 16:55:49.387371000 -0700
@@ -20,11 +20,11 @@
 NS_LOG_COMPONENT_DEFINE("CandidateQueue");
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the reference to the output stream
- * \param t the SPFVertex type
- * \returns the reference to the output stream
+ * @param os the reference to the output stream
+ * @param t the SPFVertex type
+ * @returns the reference to the output stream
  */
 std::ostream&
 operator<<(std::ostream& os, const SPFVertex::VertexType& t)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/candidate-queue.h ns-3.44/src/internet/model/candidate-queue.h
--- ns-3.43/src/internet/model/candidate-queue.h	2024-10-09 16:41:09.884656000 -0700
+++ ns-3.44/src/internet/model/candidate-queue.h	2025-03-09 16:55:49.387371000 -0700
@@ -20,9 +20,9 @@
 class SPFVertex;
 
 /**
- * \ingroup globalrouting
+ * @ingroup globalrouting
  *
- * \brief A Candidate Queue used in routing calculations.
+ * @brief A Candidate Queue used in routing calculations.
  *
  * The CandidateQueue is used in the OSPF shortest path computations.  It
  * is a priority queue used to store candidates for the shortest path to a
@@ -150,15 +150,15 @@
 
   private:
     /**
-     * \brief return true if v1 < v2
+     * @brief return true if v1 < v2
      *
      * SPFVertex items are added into the queue according to the ordering
      * defined by this method. If v1 should be popped before v2, this
      * method return true; false otherwise
      *
-     * \param v1 first operand
-     * \param v2 second operand
-     * \return True if v1 should be popped before v2; false otherwise
+     * @param v1 first operand
+     * @param v2 second operand
+     * @return True if v1 should be popped before v2; false otherwise
      */
     static bool CompareSPFVertex(const SPFVertex* v1, const SPFVertex* v2);
 
@@ -166,11 +166,11 @@
     CandidateList_t m_candidates;                  //!< SPFVertex candidates
 
     /**
-     * \brief Stream insertion operator.
+     * @brief Stream insertion operator.
      *
-     * \param os the reference to the output stream
-     * \param q the CandidateQueue
-     * \returns the reference to the output stream
+     * @param os the reference to the output stream
+     * @param q the CandidateQueue
+     * @returns the reference to the output stream
      */
     friend std::ostream& operator<<(std::ostream& os, const CandidateQueue& q);
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/global-route-manager.h ns-3.44/src/internet/model/global-route-manager.h
--- ns-3.43/src/internet/model/global-route-manager.h	2024-10-09 16:41:09.884656000 -0700
+++ ns-3.44/src/internet/model/global-route-manager.h	2025-03-09 16:55:49.391371000 -0700
@@ -16,7 +16,7 @@
 {
 
 /**
- * \ingroup globalrouting
+ * @ingroup globalrouting
  *
  * @brief A global global router
  *
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/global-route-manager-impl.cc ns-3.44/src/internet/model/global-route-manager-impl.cc
--- ns-3.43/src/internet/model/global-route-manager-impl.cc	2024-10-09 16:41:09.884656000 -0700
+++ ns-3.44/src/internet/model/global-route-manager-impl.cc	2025-03-09 16:55:49.387371000 -0700
@@ -35,11 +35,11 @@
 NS_LOG_COMPONENT_DEFINE("GlobalRouteManagerImpl");
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the reference to the output stream
- * \param exit the exit node
- * \returns the reference to the output stream
+ * @param os the reference to the output stream
+ * @param exit the exit node
+ * @returns the reference to the output stream
  */
 std::ostream&
 operator<<(std::ostream& os, const SPFVertex::NodeExit_t& exit)
@@ -1559,77 +1559,79 @@
         //
         NS_LOG_LOGIC("Considering router " << rtr->GetRouterId());
 
-        if (rtr->GetRouterId() == routerId)
+        if (rtr->GetRouterId() != routerId)
         {
-            NS_LOG_LOGIC("Setting routes for node " << node->GetId());
-            //
-            // Routing information is updated using the Ipv4 interface.  We need to QI
-            // for that interface.  If the node is acting as an IP version 4 router, it
-            // should absolutely have an Ipv4 interface.
-            //
-            Ptr<Ipv4> ipv4 = node->GetObject<Ipv4>();
-            NS_ASSERT_MSG(ipv4,
-                          "GlobalRouteManagerImpl::SPFIntraAddRouter (): "
-                          "QI for <Ipv4> interface failed");
-            //
-            // Get the Global Router Link State Advertisement from the vertex we're
-            // adding the routes to.  The LSA will have a number of attached Global Router
-            // Link Records corresponding to links off of that vertex / node.  We're going
-            // to be interested in the records corresponding to point-to-point links.
-            //
-            NS_ASSERT_MSG(v->GetLSA(),
-                          "GlobalRouteManagerImpl::SPFIntraAddRouter (): "
-                          "Expected valid LSA in SPFVertex* v");
-            Ipv4Mask tempmask = extlsa->GetNetworkLSANetworkMask();
-            Ipv4Address tempip = extlsa->GetLinkStateId();
-            tempip = tempip.CombineMask(tempmask);
+            continue;
+        }
 
-            //
-            // Here's why we did all of that work.  We're going to add a host route to the
-            // host address found in the m_linkData field of the point-to-point link
-            // record.  In the case of a point-to-point link, this is the local IP address
-            // of the node connected to the link.  Each of these point-to-point links
-            // will correspond to a local interface that has an IP address to which
-            // the node at the root of the SPF tree can send packets.  The vertex <v>
-            // (corresponding to the node that has these links and interfaces) has
-            // an m_nextHop address precalculated for us that is the address to which the
-            // root node should send packets to be forwarded to these IP addresses.
-            // Similarly, the vertex <v> has an m_rootOif (outbound interface index) to
-            // which the packets should be send for forwarding.
-            //
-            Ptr<GlobalRouter> router = node->GetObject<GlobalRouter>();
-            if (!router)
-            {
-                continue;
+        NS_LOG_LOGIC("Setting routes for node " << node->GetId());
+        //
+        // Routing information is updated using the Ipv4 interface.  We need to QI
+        // for that interface.  If the node is acting as an IP version 4 router, it
+        // should absolutely have an Ipv4 interface.
+        //
+        Ptr<Ipv4> ipv4 = node->GetObject<Ipv4>();
+        NS_ASSERT_MSG(ipv4,
+                      "GlobalRouteManagerImpl::SPFIntraAddRouter (): "
+                      "QI for <Ipv4> interface failed");
+        //
+        // Get the Global Router Link State Advertisement from the vertex we're
+        // adding the routes to.  The LSA will have a number of attached Global Router
+        // Link Records corresponding to links off of that vertex / node.  We're going
+        // to be interested in the records corresponding to point-to-point links.
+        //
+        NS_ASSERT_MSG(v->GetLSA(),
+                      "GlobalRouteManagerImpl::SPFIntraAddRouter (): "
+                      "Expected valid LSA in SPFVertex* v");
+        Ipv4Mask tempmask = extlsa->GetNetworkLSANetworkMask();
+        Ipv4Address tempip = extlsa->GetLinkStateId();
+        tempip = tempip.CombineMask(tempmask);
+
+        //
+        // Here's why we did all of that work.  We're going to add a host route to the
+        // host address found in the m_linkData field of the point-to-point link
+        // record.  In the case of a point-to-point link, this is the local IP address
+        // of the node connected to the link.  Each of these point-to-point links
+        // will correspond to a local interface that has an IP address to which
+        // the node at the root of the SPF tree can send packets.  The vertex <v>
+        // (corresponding to the node that has these links and interfaces) has
+        // an m_nextHop address precalculated for us that is the address to which the
+        // root node should send packets to be forwarded to these IP addresses.
+        // Similarly, the vertex <v> has an m_rootOif (outbound interface index) to
+        // which the packets should be send for forwarding.
+        //
+        Ptr<GlobalRouter> router = node->GetObject<GlobalRouter>();
+        if (!router)
+        {
+            continue;
+        }
+        Ptr<Ipv4GlobalRouting> gr = router->GetRoutingProtocol();
+        NS_ASSERT(gr);
+        // walk through all next-hop-IPs and out-going-interfaces for reaching
+        // the stub network gateway 'v' from the root node
+        for (uint32_t i = 0; i < v->GetNRootExitDirections(); i++)
+        {
+            SPFVertex::NodeExit_t exit = v->GetRootExitDirection(i);
+            Ipv4Address nextHop = exit.first;
+            int32_t outIf = exit.second;
+            if (outIf >= 0)
+            {
+                gr->AddASExternalRouteTo(tempip, tempmask, nextHop, outIf);
+                NS_LOG_LOGIC("(Route " << i << ") Node " << node->GetId()
+                                       << " add external network route to " << tempip
+                                       << " using next hop " << nextHop << " via interface "
+                                       << outIf);
             }
-            Ptr<Ipv4GlobalRouting> gr = router->GetRoutingProtocol();
-            NS_ASSERT(gr);
-            // walk through all next-hop-IPs and out-going-interfaces for reaching
-            // the stub network gateway 'v' from the root node
-            for (uint32_t i = 0; i < v->GetNRootExitDirections(); i++)
+            else
             {
-                SPFVertex::NodeExit_t exit = v->GetRootExitDirection(i);
-                Ipv4Address nextHop = exit.first;
-                int32_t outIf = exit.second;
-                if (outIf >= 0)
-                {
-                    gr->AddASExternalRouteTo(tempip, tempmask, nextHop, outIf);
-                    NS_LOG_LOGIC("(Route " << i << ") Node " << node->GetId()
-                                           << " add external network route to " << tempip
-                                           << " using next hop " << nextHop << " via interface "
-                                           << outIf);
-                }
-                else
-                {
-                    NS_LOG_LOGIC("(Route " << i << ") Node " << node->GetId()
-                                           << " NOT able to add network route to " << tempip
-                                           << " using next hop " << nextHop
-                                           << " since outgoing interface id is negative");
-                }
+                NS_LOG_LOGIC("(Route " << i << ") Node " << node->GetId()
+                                       << " NOT able to add network route to " << tempip
+                                       << " using next hop " << nextHop
+                                       << " since outgoing interface id is negative");
             }
-            return;
-        } // if
-    }     // for
+        }
+        return;
+    } // for
 }
 
 // Processing logic from RFC 2328, page 166 and quagga ospf_spf_process_stubs ()
@@ -1930,102 +1932,103 @@
         //
         NS_LOG_LOGIC("Considering router " << rtr->GetRouterId());
 
-        if (rtr->GetRouterId() == routerId)
+        if (rtr->GetRouterId() != routerId)
+        {
+            continue;
+        }
+
+        NS_LOG_LOGIC("Setting routes for node " << node->GetId());
+        //
+        // Routing information is updated using the Ipv4 interface.  We need to
+        // GetObject for that interface.  If the node is acting as an IP version 4
+        // router, it should absolutely have an Ipv4 interface.
+        //
+        Ptr<Ipv4> ipv4 = node->GetObject<Ipv4>();
+        NS_ASSERT_MSG(ipv4,
+                      "GlobalRouteManagerImpl::SPFIntraAddRouter (): "
+                      "GetObject for <Ipv4> interface failed");
+        //
+        // Get the Global Router Link State Advertisement from the vertex we're
+        // adding the routes to.  The LSA will have a number of attached Global Router
+        // Link Records corresponding to links off of that vertex / node.  We're going
+        // to be interested in the records corresponding to point-to-point links.
+        //
+        GlobalRoutingLSA* lsa = v->GetLSA();
+        NS_ASSERT_MSG(lsa,
+                      "GlobalRouteManagerImpl::SPFIntraAddRouter (): "
+                      "Expected valid LSA in SPFVertex* v");
+
+        uint32_t nLinkRecords = lsa->GetNLinkRecords();
+        //
+        // Iterate through the link records on the vertex to which we're going to add
+        // routes.  To make sure we're being clear, we're going to add routing table
+        // entries to the tables on the node corresponding to the root of the SPF tree.
+        // These entries will have routes to the IP addresses we find from looking at
+        // the local side of the point-to-point links found on the node described by
+        // the vertex <v>.
+        //
+        NS_LOG_LOGIC(" Node " << node->GetId() << " found " << nLinkRecords
+                              << " link records in LSA " << lsa << "with LinkStateId "
+                              << lsa->GetLinkStateId());
+        for (uint32_t j = 0; j < nLinkRecords; ++j)
         {
-            NS_LOG_LOGIC("Setting routes for node " << node->GetId());
-            //
-            // Routing information is updated using the Ipv4 interface.  We need to
-            // GetObject for that interface.  If the node is acting as an IP version 4
-            // router, it should absolutely have an Ipv4 interface.
             //
-            Ptr<Ipv4> ipv4 = node->GetObject<Ipv4>();
-            NS_ASSERT_MSG(ipv4,
-                          "GlobalRouteManagerImpl::SPFIntraAddRouter (): "
-                          "GetObject for <Ipv4> interface failed");
+            // We are only concerned about point-to-point links
             //
-            // Get the Global Router Link State Advertisement from the vertex we're
-            // adding the routes to.  The LSA will have a number of attached Global Router
-            // Link Records corresponding to links off of that vertex / node.  We're going
-            // to be interested in the records corresponding to point-to-point links.
+            GlobalRoutingLinkRecord* lr = lsa->GetLinkRecord(j);
+            if (lr->GetLinkType() != GlobalRoutingLinkRecord::PointToPoint)
+            {
+                continue;
+            }
             //
-            GlobalRoutingLSA* lsa = v->GetLSA();
-            NS_ASSERT_MSG(lsa,
-                          "GlobalRouteManagerImpl::SPFIntraAddRouter (): "
-                          "Expected valid LSA in SPFVertex* v");
-
-            uint32_t nLinkRecords = lsa->GetNLinkRecords();
+            // Here's why we did all of that work.  We're going to add a host route to the
+            // host address found in the m_linkData field of the point-to-point link
+            // record.  In the case of a point-to-point link, this is the local IP address
+            // of the node connected to the link.  Each of these point-to-point links
+            // will correspond to a local interface that has an IP address to which
+            // the node at the root of the SPF tree can send packets.  The vertex <v>
+            // (corresponding to the node that has these links and interfaces) has
+            // an m_nextHop address precalculated for us that is the address to which the
+            // root node should send packets to be forwarded to these IP addresses.
+            // Similarly, the vertex <v> has an m_rootOif (outbound interface index) to
+            // which the packets should be send for forwarding.
             //
-            // Iterate through the link records on the vertex to which we're going to add
-            // routes.  To make sure we're being clear, we're going to add routing table
-            // entries to the tables on the node corresponding to the root of the SPF tree.
-            // These entries will have routes to the IP addresses we find from looking at
-            // the local side of the point-to-point links found on the node described by
-            // the vertex <v>.
-            //
-            NS_LOG_LOGIC(" Node " << node->GetId() << " found " << nLinkRecords
-                                  << " link records in LSA " << lsa << "with LinkStateId "
-                                  << lsa->GetLinkStateId());
-            for (uint32_t j = 0; j < nLinkRecords; ++j)
+            Ptr<GlobalRouter> router = node->GetObject<GlobalRouter>();
+            if (!router)
             {
-                //
-                // We are only concerned about point-to-point links
-                //
-                GlobalRoutingLinkRecord* lr = lsa->GetLinkRecord(j);
-                if (lr->GetLinkType() != GlobalRoutingLinkRecord::PointToPoint)
+                continue;
+            }
+            Ptr<Ipv4GlobalRouting> gr = router->GetRoutingProtocol();
+            NS_ASSERT(gr);
+            // walk through all available exit directions due to ECMP,
+            // and add host route for each of the exit direction toward
+            // the vertex 'v'
+            for (uint32_t i = 0; i < v->GetNRootExitDirections(); i++)
+            {
+                SPFVertex::NodeExit_t exit = v->GetRootExitDirection(i);
+                Ipv4Address nextHop = exit.first;
+                int32_t outIf = exit.second;
+                if (outIf >= 0)
                 {
-                    continue;
+                    gr->AddHostRouteTo(lr->GetLinkData(), nextHop, outIf);
+                    NS_LOG_LOGIC("(Route " << i << ") Node " << node->GetId()
+                                           << " adding host route to " << lr->GetLinkData()
+                                           << " using next hop " << nextHop
+                                           << " and outgoing interface " << outIf);
                 }
-                //
-                // Here's why we did all of that work.  We're going to add a host route to the
-                // host address found in the m_linkData field of the point-to-point link
-                // record.  In the case of a point-to-point link, this is the local IP address
-                // of the node connected to the link.  Each of these point-to-point links
-                // will correspond to a local interface that has an IP address to which
-                // the node at the root of the SPF tree can send packets.  The vertex <v>
-                // (corresponding to the node that has these links and interfaces) has
-                // an m_nextHop address precalculated for us that is the address to which the
-                // root node should send packets to be forwarded to these IP addresses.
-                // Similarly, the vertex <v> has an m_rootOif (outbound interface index) to
-                // which the packets should be send for forwarding.
-                //
-                Ptr<GlobalRouter> router = node->GetObject<GlobalRouter>();
-                if (!router)
+                else
                 {
-                    continue;
+                    NS_LOG_LOGIC("(Route " << i << ") Node " << node->GetId()
+                                           << " NOT able to add host route to " << lr->GetLinkData()
+                                           << " using next hop " << nextHop
+                                           << " since outgoing interface id is negative " << outIf);
                 }
-                Ptr<Ipv4GlobalRouting> gr = router->GetRoutingProtocol();
-                NS_ASSERT(gr);
-                // walk through all available exit directions due to ECMP,
-                // and add host route for each of the exit direction toward
-                // the vertex 'v'
-                for (uint32_t i = 0; i < v->GetNRootExitDirections(); i++)
-                {
-                    SPFVertex::NodeExit_t exit = v->GetRootExitDirection(i);
-                    Ipv4Address nextHop = exit.first;
-                    int32_t outIf = exit.second;
-                    if (outIf >= 0)
-                    {
-                        gr->AddHostRouteTo(lr->GetLinkData(), nextHop, outIf);
-                        NS_LOG_LOGIC("(Route " << i << ") Node " << node->GetId()
-                                               << " adding host route to " << lr->GetLinkData()
-                                               << " using next hop " << nextHop
-                                               << " and outgoing interface " << outIf);
-                    }
-                    else
-                    {
-                        NS_LOG_LOGIC("(Route " << i << ") Node " << node->GetId()
-                                               << " NOT able to add host route to "
-                                               << lr->GetLinkData() << " using next hop " << nextHop
-                                               << " since outgoing interface id is negative "
-                                               << outIf);
-                    }
-                } // for all routes from the root the vertex 'v'
-            }
-            //
-            // Done adding the routes for the selected node.
-            //
-            return;
+            } // for all routes from the root the vertex 'v'
         }
+        //
+        // Done adding the routes for the selected node.
+        //
+        return;
     }
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/global-route-manager-impl.h ns-3.44/src/internet/model/global-route-manager-impl.h
--- ns-3.43/src/internet/model/global-route-manager-impl.h	2024-10-09 16:41:09.884656000 -0700
+++ ns-3.44/src/internet/model/global-route-manager-impl.h	2025-03-09 16:55:49.387371000 -0700
@@ -31,7 +31,7 @@
 class Ipv4GlobalRouting;
 
 /**
- * \ingroup globalrouting
+ * @ingroup globalrouting
  *
  * @brief Vertex used in shortest path first (SPF) computations. See \RFC{2328},
  * Section 16.
@@ -328,45 +328,45 @@
      */
     void SetRootExitDirection(SPFVertex::NodeExit_t exit);
     /**
-     * \brief Obtain a pair indicating the exit direction from the root
+     * @brief Obtain a pair indicating the exit direction from the root
      *
-     * \param i An index to a pair
-     * \return A pair of next-hop-IP and outgoing-interface-index for
+     * @param i An index to a pair
+     * @return A pair of next-hop-IP and outgoing-interface-index for
      * indicating an exit direction from the root. It is 0 if the index 'i'
      * is out-of-range
      */
     NodeExit_t GetRootExitDirection(uint32_t i) const;
     /**
-     * \brief Obtain a pair indicating the exit direction from the root
+     * @brief Obtain a pair indicating the exit direction from the root
      *
      * This method assumes there is only a single exit direction from the root.
      * Error occur if this assumption is invalid.
      *
-     * \return The pair of next-hop-IP and outgoing-interface-index for reaching
+     * @return The pair of next-hop-IP and outgoing-interface-index for reaching
      * 'this' vertex from the root
      */
     NodeExit_t GetRootExitDirection() const;
     /**
-     * \brief Merge into 'this' vertex the list of exit directions from
+     * @brief Merge into 'this' vertex the list of exit directions from
      * another vertex
      *
      * This merge is necessary when ECMP are found.
      *
-     * \param vertex From which the list of exit directions are obtain
+     * @param vertex From which the list of exit directions are obtain
      * and are merged into 'this' vertex
      */
     void MergeRootExitDirections(const SPFVertex* vertex);
     /**
-     * \brief Inherit all root exit directions from a given vertex to 'this' vertex
-     * \param vertex The vertex from which all root exit directions are to be inherited
+     * @brief Inherit all root exit directions from a given vertex to 'this' vertex
+     * @param vertex The vertex from which all root exit directions are to be inherited
      *
      * After the call of this method, the original root exit directions
      * in 'this' vertex are all lost.
      */
     void InheritAllRootExitDirections(const SPFVertex* vertex);
     /**
-     * \brief Get the number of exit directions from root for reaching 'this' vertex
-     * \return The number of exit directions from root
+     * @brief Get the number of exit directions from root for reaching 'this' vertex
+     * @return The number of exit directions from root
      */
     uint32_t GetNRootExitDirections() const;
 
@@ -411,9 +411,9 @@
      */
     void SetParent(SPFVertex* parent);
     /**
-     * \brief Merge the Parent list from the v into this vertex
+     * @brief Merge the Parent list from the v into this vertex
      *
-     * \param v The vertex from which its list of Parent is read
+     * @param v The vertex from which its list of Parent is read
      * and then merged into the list of Parent of *this* vertex.
      * Note that the list in v remains intact
      */
@@ -538,11 +538,11 @@
                             //!< computation
 
     /**
-     * \brief Stream insertion operator.
+     * @brief Stream insertion operator.
      *
-     * \param os the reference to the output stream
-     * \param vs a list of SPFVertex items
-     * \returns the reference to the output stream
+     * @param os the reference to the output stream
+     * @param vs a list of SPFVertex items
+     * @returns the reference to the output stream
      */
     friend std::ostream& operator<<(std::ostream& os, const SPFVertex::ListOfSPFVertex_t& vs);
 };
@@ -697,7 +697,7 @@
      * @brief Delete all static routes on all nodes that have a
      * GlobalRouterInterface
      *
-     * \todo  separate manually assigned static routes from static routes that
+     * @todo  separate manually assigned static routes from static routes that
      * the global routing code injects, and only delete the latter
      */
     virtual void DeleteGlobalRoutes();
@@ -731,49 +731,49 @@
     GlobalRouteManagerLSDB* m_lsdb; //!< the Link State DataBase (LSDB) of the Global Route Manager
 
     /**
-     * \brief Test if a node is a stub, from an OSPF sense.
+     * @brief Test if a node is a stub, from an OSPF sense.
      *
      * If there is only one link of type 1 or 2, then a default route
      * can safely be added to the next-hop router and SPF does not need
      * to be run
      *
-     * \param root the root node
-     * \returns true if the node is a stub
+     * @param root the root node
+     * @returns true if the node is a stub
      */
     bool CheckForStubNode(Ipv4Address root);
 
     /**
-     * \brief Calculate the shortest path first (SPF) tree
+     * @brief Calculate the shortest path first (SPF) tree
      *
      * Equivalent to quagga ospf_spf_calculate
-     * \param root the root node
+     * @param root the root node
      */
     void SPFCalculate(Ipv4Address root);
 
     /**
-     * \brief Process Stub nodes
+     * @brief Process Stub nodes
      *
      * Processing logic from RFC 2328, page 166 and quagga ospf_spf_process_stubs ()
      * stub link records will exist for point-to-point interfaces and for
      * broadcast interfaces for which no neighboring router can be found
      *
-     * \param v vertex to be processed
+     * @param v vertex to be processed
      */
     void SPFProcessStubs(SPFVertex* v);
 
     /**
-     * \brief Process Autonomous Systems (AS) External LSA
+     * @brief Process Autonomous Systems (AS) External LSA
      *
-     * \param v vertex to be processed
-     * \param extlsa external LSA
+     * @param v vertex to be processed
+     * @param extlsa external LSA
      */
     void ProcessASExternals(SPFVertex* v, GlobalRoutingLSA* extlsa);
 
     /**
-     * \brief Examine the links in v's LSA and update the list of candidates with any
+     * @brief Examine the links in v's LSA and update the list of candidates with any
      *        vertices not already on the list
      *
-     * \internal
+     * @internal
      *
      * This method is derived from quagga ospf_spf_next ().  See RFC2328 Section
      * 16.1 (2) for further details.
@@ -787,23 +787,23 @@
      * vertices not already on the list.  If a lower-cost path is found to a
      * vertex already on the candidate list, store the new (lower) cost.
      *
-     * \param v the vertex
-     * \param candidate the SPF candidate queue
+     * @param v the vertex
+     * @param candidate the SPF candidate queue
      */
     void SPFNext(SPFVertex* v, CandidateQueue& candidate);
 
     /**
-     * \brief Calculate nexthop from root through V (parent) to vertex W (destination)
+     * @brief Calculate nexthop from root through V (parent) to vertex W (destination)
      *        with given distance from root->W.
      *
      * This method is derived from quagga ospf_nexthop_calculation() 16.1.1.
      * For now, this is greatly simplified from the quagga code
      *
-     * \param v the parent
-     * \param w the destination
-     * \param l the link record
-     * \param distance the target distance
-     * \returns 1 on success
+     * @param v the parent
+     * @param w the destination
+     * @param l the link record
+     * @param distance the target distance
+     * @returns 1 on success
      */
     int SPFNexthopCalculation(SPFVertex* v,
                               SPFVertex* w,
@@ -811,7 +811,7 @@
                               uint32_t distance);
 
     /**
-     * \brief Adds a vertex to the list of children *in* each of its parents
+     * @brief Adds a vertex to the list of children *in* each of its parents
      *
      * Derived from quagga ospf_vertex_add_parents ()
      *
@@ -822,12 +822,12 @@
      * Given a pointer to a vertex, it links back to the vertex's parent that it
      * already has set and adds itself to that vertex's list of children.
      *
-     * \param v the vertex
+     * @param v the vertex
      */
     void SPFVertexAddParent(SPFVertex* v);
 
     /**
-     * \brief Search for a link between two vertices.
+     * @brief Search for a link between two vertices.
      *
      * This method is derived from quagga ospf_get_next_link ()
      *
@@ -840,17 +840,17 @@
      * to \a w.  If prev_link is not NULL, we return a Global Router Link Record
      * representing a possible *second* link from \a v to \a w.
      *
-     * \param v first vertex
-     * \param w second vertex
-     * \param prev_link the previous link in the list
-     * \returns the link's record
+     * @param v first vertex
+     * @param w second vertex
+     * @param prev_link the previous link in the list
+     * @returns the link's record
      */
     GlobalRoutingLinkRecord* SPFGetNextLink(SPFVertex* v,
                                             SPFVertex* w,
                                             GlobalRoutingLinkRecord* prev_link);
 
     /**
-     * \brief Add a host route to the routing tables
+     * @brief Add a host route to the routing tables
      *
      *
      * This method is derived from quagga ospf_intra_add_router ()
@@ -868,45 +868,45 @@
      * a destination IP address, reachable from the root, to which we add a host
      * route.
      *
-     * \param v the vertex
+     * @param v the vertex
      *
      */
     void SPFIntraAddRouter(SPFVertex* v);
 
     /**
-     * \brief Add a transit to the routing tables
+     * @brief Add a transit to the routing tables
      *
-     * \param v the vertex
+     * @param v the vertex
      */
     void SPFIntraAddTransit(SPFVertex* v);
 
     /**
-     * \brief Add a stub to the routing tables
+     * @brief Add a stub to the routing tables
      *
-     * \param l the global routing link record
-     * \param v the vertex
+     * @param l the global routing link record
+     * @param v the vertex
      */
     void SPFIntraAddStub(GlobalRoutingLinkRecord* l, SPFVertex* v);
 
     /**
-     * \brief Add an external route to the routing tables
+     * @brief Add an external route to the routing tables
      *
-     * \param extlsa the external LSA
-     * \param v the vertex
+     * @param extlsa the external LSA
+     * @param v the vertex
      */
     void SPFAddASExternal(GlobalRoutingLSA* extlsa, SPFVertex* v);
 
     /**
-     * \brief Return the interface number corresponding to a given IP address and mask
+     * @brief Return the interface number corresponding to a given IP address and mask
      *
      * This is a wrapper around GetInterfaceForPrefix(), but we first
      * have to find the right node pointer to pass to that function.
      * If no such interface is found, return -1 (note:  unit test framework
      * for routing assumes -1 to be a legal return value)
      *
-     * \param a the target IP address
-     * \param amask the target subnet mask
-     * \return the outgoing interface number
+     * @param a the target IP address
+     * @param amask the target subnet mask
+     * @return the outgoing interface number
      */
     int32_t FindOutgoingInterfaceId(Ipv4Address a, Ipv4Mask amask = Ipv4Mask("255.255.255.255"));
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/global-router-interface.h ns-3.44/src/internet/model/global-router-interface.h
--- ns-3.43/src/internet/model/global-router-interface.h	2024-10-09 16:41:09.884656000 -0700
+++ ns-3.44/src/internet/model/global-router-interface.h	2025-03-09 16:55:49.391371000 -0700
@@ -31,7 +31,7 @@
 class Ipv4GlobalRouting;
 
 /**
- * \ingroup globalrouting
+ * @ingroup globalrouting
  *
  * @brief A single link record for a link state advertisement.
  *
@@ -564,11 +564,11 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the reference to the output stream
- * \param lsa the LSA
- * \returns the reference to the output stream
+ * @param os the reference to the output stream
+ * @param lsa the LSA
+ * @returns the reference to the output stream
  */
 std::ostream& operator<<(std::ostream& os, GlobalRoutingLSA& lsa);
 
@@ -585,8 +585,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -600,14 +600,14 @@
     GlobalRouter& operator=(const GlobalRouter&) = delete;
 
     /**
-     * \brief Set the specific Global Routing Protocol to be used
-     * \param routing the routing protocol
+     * @brief Set the specific Global Routing Protocol to be used
+     * @param routing the routing protocol
      */
     void SetRoutingProtocol(Ptr<Ipv4GlobalRouting> routing);
 
     /**
-     * \brief Get the specific Global Routing Protocol used
-     * \returns the routing protocol
+     * @brief Get the specific Global Routing Protocol used
+     * @returns the routing protocol
      */
     Ptr<Ipv4GlobalRouting> GetRoutingProtocol();
 
@@ -730,95 +730,95 @@
     ~GlobalRouter() override;
 
     /**
-     * \brief Clear list of LSAs
+     * @brief Clear list of LSAs
      */
     void ClearLSAs();
 
     /**
-     * \brief Link through the given channel and find the net device that's on the other end.
+     * @brief Link through the given channel and find the net device that's on the other end.
      *
      * This only makes sense with a point-to-point channel.
      *
-     * \param nd outgoing NetDevice
-     * \param ch channel
-     * \returns the NetDevice on the other end
+     * @param nd outgoing NetDevice
+     * @param ch channel
+     * @returns the NetDevice on the other end
      */
     Ptr<NetDevice> GetAdjacent(Ptr<NetDevice> nd, Ptr<Channel> ch) const;
 
     /**
-     * \brief Finds a designated router
+     * @brief Finds a designated router
      *
      * Given a local net device, we need to walk the channel to which the net device is
      * attached and look for nodes with GlobalRouter interfaces on them (one of them
      * will be us).  Of these, the router with the lowest IP address on the net device
      * connecting to the channel becomes the designated router for the link.
      *
-     * \param ndLocal local NetDevice to scan
-     * \returns the IP address of the designated router
+     * @param ndLocal local NetDevice to scan
+     * @returns the IP address of the designated router
      */
     Ipv4Address FindDesignatedRouterForLink(Ptr<NetDevice> ndLocal) const;
 
     /**
-     * \brief Checks for the presence of another router on the NetDevice
+     * @brief Checks for the presence of another router on the NetDevice
      *
      * Given a node and an attached net device, take a look off in the channel to
      * which the net device is attached and look for a node on the other side
      * that has a GlobalRouter interface aggregated.
      *
-     * \param nd NetDevice to scan
-     * \returns true if a router is found
+     * @param nd NetDevice to scan
+     * @returns true if a router is found
      */
     bool AnotherRouterOnLink(Ptr<NetDevice> nd) const;
 
     /**
-     * \brief Process a generic broadcast link
+     * @brief Process a generic broadcast link
      *
-     * \param nd the NetDevice
-     * \param pLSA the Global LSA
-     * \param c the returned NetDevice container
+     * @param nd the NetDevice
+     * @param pLSA the Global LSA
+     * @param c the returned NetDevice container
      */
     void ProcessBroadcastLink(Ptr<NetDevice> nd, GlobalRoutingLSA* pLSA, NetDeviceContainer& c);
 
     /**
-     * \brief Process a single broadcast link
+     * @brief Process a single broadcast link
      *
-     * \param nd the NetDevice
-     * \param pLSA the Global LSA
-     * \param c the returned NetDevice container
+     * @param nd the NetDevice
+     * @param pLSA the Global LSA
+     * @param c the returned NetDevice container
      */
     void ProcessSingleBroadcastLink(Ptr<NetDevice> nd,
                                     GlobalRoutingLSA* pLSA,
                                     NetDeviceContainer& c);
 
     /**
-     * \brief Process a bridged broadcast link
+     * @brief Process a bridged broadcast link
      *
-     * \param nd the NetDevice
-     * \param pLSA the Global LSA
-     * \param c the returned NetDevice container
+     * @param nd the NetDevice
+     * @param pLSA the Global LSA
+     * @param c the returned NetDevice container
      */
     void ProcessBridgedBroadcastLink(Ptr<NetDevice> nd,
                                      GlobalRoutingLSA* pLSA,
                                      NetDeviceContainer& c);
 
     /**
-     * \brief Process a point to point link
+     * @brief Process a point to point link
      *
-     * \param ndLocal the NetDevice
-     * \param pLSA the Global LSA
+     * @param ndLocal the NetDevice
+     * @param pLSA the Global LSA
      */
     void ProcessPointToPointLink(Ptr<NetDevice> ndLocal, GlobalRoutingLSA* pLSA);
 
     /**
-     * \brief Build one NetworkLSA for each net device talking to a network that we are the
+     * @brief Build one NetworkLSA for each net device talking to a network that we are the
      * designated router for.
      *
-     * \param c the devices.
+     * @param c the devices.
      */
     void BuildNetworkLSAs(NetDeviceContainer c);
 
     /**
-     * \brief Return a container of all non-bridged NetDevices on a link
+     * @brief Return a container of all non-bridged NetDevices on a link
      *
      * This method will recursively find all of the 'edge' devices in an
      * L2 broadcast domain.  If there are no bridged devices, then the
@@ -828,16 +828,16 @@
      * bridges), the method will find all of the non-bridged devices
      * in the L2 broadcast domain.
      *
-     * \param ch a channel from the link
-     * \returns the NetDeviceContainer.
+     * @param ch a channel from the link
+     * @returns the NetDeviceContainer.
      */
     NetDeviceContainer FindAllNonBridgedDevicesOnLink(Ptr<Channel> ch) const;
 
     /**
-     * \brief Decide whether or not a given net device is being bridged by a BridgeNetDevice.
+     * @brief Decide whether or not a given net device is being bridged by a BridgeNetDevice.
      *
-     * \param nd the NetDevice
-     * \returns the BridgeNetDevice smart pointer or null if not found
+     * @param nd the NetDevice
+     * @returns the BridgeNetDevice smart pointer or null if not found
      */
     Ptr<BridgeNetDevice> NetDeviceIsBridged(Ptr<NetDevice> nd) const;
 
@@ -869,15 +869,15 @@
      * When recursively checking for devices on the link, check whether a
      * given device has already been visited.
      *
-     * \param device the bridge device to check
-     * \return true if bridge has already been visited
+     * @param device the bridge device to check
+     * @return true if bridge has already been visited
      */
     bool BridgeHasAlreadyBeenVisited(Ptr<BridgeNetDevice> device) const;
     /**
      * When recursively checking for devices on the link, mark a given device
      * as having been visited.
      *
-     * \param device the bridge device to mark
+     * @param device the bridge device to mark
      */
     void MarkBridgeAsVisited(Ptr<BridgeNetDevice> device) const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/global-routing.h ns-3.44/src/internet/model/global-routing.h
--- ns-3.43/src/internet/model/global-routing.h	2024-10-09 16:41:09.884656000 -0700
+++ ns-3.44/src/internet/model/global-routing.h	2025-03-09 16:55:49.391371000 -0700
@@ -6,13 +6,13 @@
  */
 
 /**
- * \ingroup ipv4Routing
- * \defgroup globalrouting Global Routing.
+ * @ingroup ipv4Routing
+ * @defgroup globalrouting Global Routing.
  *
  * Performs pre-simulation static route computation
  * on a layer-3 IPv4 topology.
  *
- * \section model Model
+ * @section model Model
  *
  * ns-3 global routing performs pre-simulation static route computation
  * on a layer-3 IPv4 topology.  The user API from the script level is
@@ -36,7 +36,7 @@
  *   There is a helper method that encapsulates this
  *   (Ipv4GlobalRoutingHelper::RecomputeRoutingTables())
  *
- * \section api API and Usage
+ * @section api API and Usage
  *
  * Users must include ns3/global-route-manager.h header file.  After the
  * IPv4 topology has been built and addresses assigned, users call
@@ -47,7 +47,7 @@
  * - Ipv4GlobalRouting::RandomEcmpRouting
  * - Ipv4GlobalRouting::RespondToInterfaceEvents
  *
- * \section impl Implementation
+ * @section impl Implementation
  *
  * A singleton object, ns3::GlobalRouteManager, builds a global routing
  * database of information about the topology, and executes a Dijkstra
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/icmpv4.h ns-3.44/src/internet/model/icmpv4.h
--- ns-3.43/src/internet/model/icmpv4.h	2024-10-09 16:41:09.884656000 -0700
+++ ns-3.44/src/internet/model/icmpv4.h	2025-03-09 16:55:49.391371000 -0700
@@ -22,9 +22,9 @@
 class Packet;
 
 /**
- * \ingroup icmp
+ * @ingroup icmp
  *
- * \brief Base class for all the ICMP packet headers.
+ * @brief Base class for all the ICMP packet headers.
  *
  * This header is the common part in all the ICMP packets.
  */
@@ -49,30 +49,30 @@
 
     /**
      * Set ICMP type
-     * \param type the ICMP type
+     * @param type the ICMP type
      */
     void SetType(uint8_t type);
 
     /**
      * Set ICMP code
-     * \param code the ICMP code
+     * @param code the ICMP code
      */
     void SetCode(uint8_t code);
 
     /**
      * Get ICMP type
-     * \returns the ICMP type
+     * @returns the ICMP type
      */
     uint8_t GetType() const;
     /**
      * Get ICMP code
-     * \returns the ICMP code
+     * @returns the ICMP code
      */
     uint8_t GetCode() const;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     Icmpv4Header();
@@ -91,53 +91,53 @@
 };
 
 /**
- * \ingroup icmp
+ * @ingroup icmp
  *
- * \brief ICMP Echo header
+ * @brief ICMP Echo header
  */
 class Icmpv4Echo : public Header
 {
   public:
     /**
-     * \brief Set the Echo identifier
-     * \param id the identifier
+     * @brief Set the Echo identifier
+     * @param id the identifier
      */
     void SetIdentifier(uint16_t id);
     /**
-     * \brief Set the Echo sequence number
-     * \param seq the sequence number
+     * @brief Set the Echo sequence number
+     * @param seq the sequence number
      */
     void SetSequenceNumber(uint16_t seq);
     /**
-     * \brief Set the Echo data
-     * \param data the data
+     * @brief Set the Echo data
+     * @param data the data
      */
     void SetData(Ptr<const Packet> data);
     /**
-     * \brief Get the Echo identifier
-     * \returns the identifier
+     * @brief Get the Echo identifier
+     * @returns the identifier
      */
     uint16_t GetIdentifier() const;
     /**
-     * \brief Get the Echo sequence number
-     * \returns the sequence number
+     * @brief Get the Echo sequence number
+     * @returns the sequence number
      */
     uint16_t GetSequenceNumber() const;
     /**
-     * \brief Get the Echo data size
-     * \returns the data size
+     * @brief Get the Echo data size
+     * @returns the data size
      */
     uint32_t GetDataSize() const;
     /**
-     * \brief Get the Echo data
-     * \param payload the data (filled)
-     * \returns the data length
+     * @brief Get the Echo data
+     * @param payload the data (filled)
+     * @returns the data length
      */
     uint32_t GetData(uint8_t payload[]) const;
 
     /**
      * Get ICMP type
-     * \returns the ICMP type
+     * @returns the ICMP type
      */
     static TypeId GetTypeId();
     Icmpv4Echo();
@@ -156,9 +156,9 @@
 };
 
 /**
- * \ingroup icmp
+ * @ingroup icmp
  *
- * \brief ICMP Destination Unreachable header
+ * @brief ICMP Destination Unreachable header
  */
 class Icmpv4DestinationUnreachable : public Header
 {
@@ -178,42 +178,42 @@
 
     /**
      * Get ICMP type
-     * \returns the ICMP type
+     * @returns the ICMP type
      */
     static TypeId GetTypeId();
     Icmpv4DestinationUnreachable();
     ~Icmpv4DestinationUnreachable() override;
 
     /**
-     * \brief Set the next hop MTU
-     * \param mtu the MTU
+     * @brief Set the next hop MTU
+     * @param mtu the MTU
      */
     void SetNextHopMtu(uint16_t mtu);
     /**
-     * \brief Get the next hop MTU
-     * \returns the MTU
+     * @brief Get the next hop MTU
+     * @returns the MTU
      */
     uint16_t GetNextHopMtu() const;
 
     /**
-     * \brief Set the ICMP carried data
-     * \param data the data
+     * @brief Set the ICMP carried data
+     * @param data the data
      */
     void SetData(Ptr<const Packet> data);
     /**
-     * \brief Set the ICMP carried IPv4 header
-     * \param header the header
+     * @brief Set the ICMP carried IPv4 header
+     * @param header the header
      */
     void SetHeader(Ipv4Header header);
 
     /**
-     * \brief Get the ICMP carried data
-     * \param payload the data (filled)
+     * @brief Get the ICMP carried data
+     * @param payload the data (filled)
      */
     void GetData(uint8_t payload[8]) const;
     /**
-     * \brief Get the ICMP carried IPv4 header
-     * \returns the header
+     * @brief Get the ICMP carried IPv4 header
+     * @returns the header
      */
     Ipv4Header GetHeader() const;
 
@@ -231,15 +231,15 @@
 };
 
 /**
- * \ingroup icmp
+ * @ingroup icmp
  *
- * \brief ICMP Time Exceeded header
+ * @brief ICMP Time Exceeded header
  */
 class Icmpv4TimeExceeded : public Header
 {
   public:
     /**
-     * \brief ICMP error code : Time Exceeded
+     * @brief ICMP error code : Time Exceeded
      */
     enum ErrorTimeExceeded_e
     {
@@ -248,30 +248,30 @@
     };
 
     /**
-     * \brief Get the ICMP carried data
-     * \param data the data
+     * @brief Get the ICMP carried data
+     * @param data the data
      */
     void SetData(Ptr<const Packet> data);
     /**
-     * \brief Set the ICMP carried IPv4 header
-     * \param header the header
+     * @brief Set the ICMP carried IPv4 header
+     * @param header the header
      */
     void SetHeader(Ipv4Header header);
 
     /**
-     * \brief Get the ICMP carried data
-     * \param payload the data (filled)
+     * @brief Get the ICMP carried data
+     * @param payload the data (filled)
      */
     void GetData(uint8_t payload[8]) const;
     /**
-     * \brief Get the ICMP carried IPv4 header
-     * \returns the header
+     * @brief Get the ICMP carried IPv4 header
+     * @returns the header
      */
     Ipv4Header GetHeader() const;
 
     /**
      * Get ICMP type
-     * \returns the ICMP type
+     * @returns the ICMP type
      */
     static TypeId GetTypeId();
     Icmpv4TimeExceeded();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/icmpv4-l4-protocol.cc ns-3.44/src/internet/model/icmpv4-l4-protocol.cc
--- ns-3.43/src/internet/model/icmpv4-l4-protocol.cc	2024-10-09 16:41:09.884656000 -0700
+++ ns-3.44/src/internet/model/icmpv4-l4-protocol.cc	2025-03-09 16:55:49.391371000 -0700
@@ -28,9 +28,6 @@
 
 NS_OBJECT_ENSURE_REGISTERED(Icmpv4L4Protocol);
 
-// see rfc 792
-const uint8_t Icmpv4L4Protocol::PROT_NUMBER = 1;
-
 TypeId
 Icmpv4L4Protocol::GetTypeId()
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/icmpv4-l4-protocol.h ns-3.44/src/internet/model/icmpv4-l4-protocol.h
--- ns-3.43/src/internet/model/icmpv4-l4-protocol.h	2024-10-09 16:41:09.884656000 -0700
+++ ns-3.44/src/internet/model/icmpv4-l4-protocol.h	2025-03-09 16:55:49.391371000 -0700
@@ -22,91 +22,92 @@
 class Ipv4Route;
 
 /**
- * \ingroup ipv4
- * \defgroup icmp ICMP protocol and associated headers.
+ * @ingroup ipv4
+ * @defgroup icmp ICMP protocol and associated headers.
  */
 
 /**
- * \ingroup icmp
+ * @ingroup icmp
  *
- * \brief This is the implementation of the ICMP protocol as
+ * @brief This is the implementation of the ICMP protocol as
  * described in \RFC{792}.
  */
 class Icmpv4L4Protocol : public IpL4Protocol
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
-    static const uint8_t PROT_NUMBER; //!< ICMP protocol number (0x1)
+
+    static constexpr uint8_t PROT_NUMBER = 1; //!< ICMP protocol number (see \RFC{792})
 
     Icmpv4L4Protocol();
     ~Icmpv4L4Protocol() override;
 
     /**
-     * \brief Set the node the protocol is associated with.
-     * \param node the node
+     * @brief Set the node the protocol is associated with.
+     * @param node the node
      */
     void SetNode(Ptr<Node> node);
 
     /**
      * Get the protocol number
-     * \returns the protocol number
+     * @returns the protocol number
      */
     static uint16_t GetStaticProtocolNumber();
 
     /**
      * Get the protocol number
-     * \returns the protocol number
+     * @returns the protocol number
      */
     int GetProtocolNumber() const override;
 
     /**
-     * \brief Receive method.
-     * \param p the packet
-     * \param header the IPv4 header
-     * \param incomingInterface the interface from which the packet is coming
-     * \returns the receive status
+     * @brief Receive method.
+     * @param p the packet
+     * @param header the IPv4 header
+     * @param incomingInterface the interface from which the packet is coming
+     * @returns the receive status
      */
     IpL4Protocol::RxStatus Receive(Ptr<Packet> p,
                                    const Ipv4Header& header,
                                    Ptr<Ipv4Interface> incomingInterface) override;
 
     /**
-     * \brief Receive method.
-     * \param p the packet
-     * \param header the IPv6 header
-     * \param incomingInterface the interface from which the packet is coming
-     * \returns the receive status
+     * @brief Receive method.
+     * @param p the packet
+     * @param header the IPv6 header
+     * @param incomingInterface the interface from which the packet is coming
+     * @returns the receive status
      */
     IpL4Protocol::RxStatus Receive(Ptr<Packet> p,
                                    const Ipv6Header& header,
                                    Ptr<Ipv6Interface> incomingInterface) override;
 
     /**
-     * \brief Send a Destination Unreachable - Fragmentation needed ICMP error
-     * \param header the original IP header
-     * \param orgData the original packet
-     * \param nextHopMtu the next hop MTU
+     * @brief Send a Destination Unreachable - Fragmentation needed ICMP error
+     * @param header the original IP header
+     * @param orgData the original packet
+     * @param nextHopMtu the next hop MTU
      */
     void SendDestUnreachFragNeeded(Ipv4Header header,
                                    Ptr<const Packet> orgData,
                                    uint16_t nextHopMtu);
 
     /**
-     * \brief Send a Time Exceeded ICMP error
-     * \param header the original IP header
-     * \param orgData the original packet
-     * \param isFragment true if the opcode must be FRAGMENT_REASSEMBLY
+     * @brief Send a Time Exceeded ICMP error
+     * @param header the original IP header
+     * @param orgData the original packet
+     * @param isFragment true if the opcode must be FRAGMENT_REASSEMBLY
      */
     void SendTimeExceededTtl(Ipv4Header header, Ptr<const Packet> orgData, bool isFragment);
 
     /**
-     * \brief Send a Time Exceeded ICMP error
-     * \param header the original IP header
-     * \param orgData the original packet
+     * @brief Send a Time Exceeded ICMP error
+     * @param header the original IP header
+     * @param orgData the original packet
      */
     void SendDestUnreachPort(Ipv4Header header, Ptr<const Packet> orgData);
 
@@ -127,12 +128,12 @@
 
   private:
     /**
-     * \brief Handles an incoming ICMP Echo packet
-     * \param p the packet
-     * \param header the IP header
-     * \param source the source address
-     * \param destination the destination address
-     * \param tos the type of service
+     * @brief Handles an incoming ICMP Echo packet
+     * @param p the packet
+     * @param header the IP header
+     * @param source the source address
+     * @param destination the destination address
+     * @param tos the type of service
      */
     void HandleEcho(Ptr<Packet> p,
                     Icmpv4Header header,
@@ -140,57 +141,57 @@
                     Ipv4Address destination,
                     uint8_t tos);
     /**
-     * \brief Handles an incoming ICMP Destination Unreachable packet
-     * \param p the packet
-     * \param header the IP header
-     * \param source the source address
-     * \param destination the destination address
+     * @brief Handles an incoming ICMP Destination Unreachable packet
+     * @param p the packet
+     * @param header the IP header
+     * @param source the source address
+     * @param destination the destination address
      */
     void HandleDestUnreach(Ptr<Packet> p,
                            Icmpv4Header header,
                            Ipv4Address source,
                            Ipv4Address destination);
     /**
-     * \brief Handles an incoming ICMP Time Exceeded packet
-     * \param p the packet
-     * \param icmp the ICMP header
-     * \param source the source address
-     * \param destination the destination address
+     * @brief Handles an incoming ICMP Time Exceeded packet
+     * @param p the packet
+     * @param icmp the ICMP header
+     * @param source the source address
+     * @param destination the destination address
      */
     void HandleTimeExceeded(Ptr<Packet> p,
                             Icmpv4Header icmp,
                             Ipv4Address source,
                             Ipv4Address destination);
     /**
-     * \brief Send an ICMP Destination Unreachable packet
+     * @brief Send an ICMP Destination Unreachable packet
      *
-     * \param header the original IP header
-     * \param orgData the original packet
-     * \param code the ICMP code
-     * \param nextHopMtu the next hop MTU
+     * @param header the original IP header
+     * @param orgData the original packet
+     * @param code the ICMP code
+     * @param nextHopMtu the next hop MTU
      */
     void SendDestUnreach(Ipv4Header header,
                          Ptr<const Packet> orgData,
                          uint8_t code,
                          uint16_t nextHopMtu);
     /**
-     * \brief Send a generic ICMP packet
+     * @brief Send a generic ICMP packet
      *
-     * \param packet the packet
-     * \param dest the destination
-     * \param type the ICMP type
-     * \param code the ICMP code
+     * @param packet the packet
+     * @param dest the destination
+     * @param type the ICMP type
+     * @param code the ICMP code
      */
     void SendMessage(Ptr<Packet> packet, Ipv4Address dest, uint8_t type, uint8_t code);
     /**
-     * \brief Send a generic ICMP packet
+     * @brief Send a generic ICMP packet
      *
-     * \param packet the packet
-     * \param source the source
-     * \param dest the destination
-     * \param type the ICMP type
-     * \param code the ICMP code
-     * \param route the route to be used
+     * @param packet the packet
+     * @param source the source
+     * @param dest the destination
+     * @param type the ICMP type
+     * @param code the ICMP code
+     * @param route the route to be used
      */
     void SendMessage(Ptr<Packet> packet,
                      Ipv4Address source,
@@ -199,13 +200,13 @@
                      uint8_t code,
                      Ptr<Ipv4Route> route);
     /**
-     * \brief Forward the message to an L4 protocol
+     * @brief Forward the message to an L4 protocol
      *
-     * \param source the source
-     * \param icmp the ICMP header
-     * \param info info data (e.g., the target MTU)
-     * \param ipHeader the IP header carried by ICMP
-     * \param payload payload chunk carried by ICMP
+     * @param source the source
+     * @param icmp the ICMP header
+     * @param info info data (e.g., the target MTU)
+     * @param ipHeader the IP header carried by ICMP
+     * @param payload payload chunk carried by ICMP
      */
     void Forward(Ipv4Address source,
                  Icmpv4Header icmp,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/icmpv6-header.cc ns-3.44/src/internet/model/icmpv6-header.cc
--- ns-3.43/src/internet/model/icmpv6-header.cc	2024-10-09 16:41:09.884656000 -0700
+++ ns-3.44/src/internet/model/icmpv6-header.cc	2025-03-09 16:55:49.391371000 -0700
@@ -1566,7 +1566,7 @@
 Icmpv6OptionHeader::Icmpv6OptionHeader()
 {
     NS_LOG_FUNCTION(this);
-    /** \todo */
+    /** @todo */
     m_type = 0;
     m_len = 0;
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/icmpv6-header.h ns-3.44/src/internet/model/icmpv6-header.h
--- ns-3.43/src/internet/model/icmpv6-header.h	2024-10-09 16:41:09.884656000 -0700
+++ ns-3.44/src/internet/model/icmpv6-header.h	2025-03-09 16:55:49.391371000 -0700
@@ -19,15 +19,15 @@
 {
 
 /**
- * \ingroup icmpv6
+ * @ingroup icmpv6
  *
- * \brief ICMPv6 header.
+ * @brief ICMPv6 header.
  */
 class Icmpv6Header : public Header
 {
   public:
     /**
-     * \brief ICMPv6 type code.
+     * @brief ICMPv6 type code.
      */
     enum Type_e
     {
@@ -60,7 +60,7 @@
     };
 
     /**
-     * \brief ICMPv6 Option type code.
+     * @brief ICMPv6 Option type code.
      */
     enum OptionType_e
     {
@@ -72,7 +72,7 @@
     };
 
     /**
-     * \brief ICMPv6 error code : Destination Unreachable
+     * @brief ICMPv6 error code : Destination Unreachable
      */
     enum ErrorDestinationUnreachable_e
     {
@@ -84,7 +84,7 @@
     };
 
     /**
-     * \brief ICMPv6 error code : Time Exceeded
+     * @brief ICMPv6 error code : Time Exceeded
      */
     enum ErrorTimeExceeded_e
     {
@@ -93,7 +93,7 @@
     };
 
     /**
-     * \brief ICMPv6 error code : Parameter Error
+     * @brief ICMPv6 error code : Parameter Error
      */
     enum ErrorParameterError_e
     {
@@ -103,94 +103,94 @@
     };
 
     /**
-     * \brief Get the UID of this class.
-     * \return UID
+     * @brief Get the UID of this class.
+     * @return UID
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
 
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Icmpv6Header();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Icmpv6Header() override;
 
     /**
-     * \brief Get the type field.
-     * \return type of ICMPv6 message
+     * @brief Get the type field.
+     * @return type of ICMPv6 message
      */
     uint8_t GetType() const;
 
     /**
-     * \brief Set the type.
-     * \param type type to set
+     * @brief Set the type.
+     * @param type type to set
      */
     void SetType(uint8_t type);
 
     /**
-     * \brief Get the code field.
-     * \return code of ICMPv6 message
+     * @brief Get the code field.
+     * @return code of ICMPv6 message
      */
     uint8_t GetCode() const;
 
     /**
-     * \brief Set the code field.
-     * \param code code to set
+     * @brief Set the code field.
+     * @param code code to set
      */
     void SetCode(uint8_t code);
 
     /**
-     * \brief Get the checksum.
-     * \return checksum
+     * @brief Get the checksum.
+     * @return checksum
      */
     uint16_t GetChecksum() const;
 
     /**
-     * \brief Set the checksum.
-     * \param checksum to set
+     * @brief Set the checksum.
+     * @param checksum to set
      */
     void SetChecksum(uint16_t checksum);
 
     /**
-     * \brief Print information.
-     * \param os output stream
+     * @brief Print information.
+     * @param os output stream
      */
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Get the serialized size.
-     * \return serialized size
+     * @brief Get the serialized size.
+     * @return serialized size
      */
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Serialize the packet.
-     * \param start start offset
+     * @brief Serialize the packet.
+     * @param start start offset
      */
     void Serialize(Buffer::Iterator start) const override;
 
     /**
-     * \brief Deserialize the packet.
-     * \param start start offset
-     * \return length of packet
+     * @brief Deserialize the packet.
+     * @param start start offset
+     * @return length of packet
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
 
     /**
-     * \brief Calculate pseudo header checksum for IPv6.
-     * \param src source address
-     * \param dst destination address
-     * \param length length
-     * \param protocol the protocol number to use in the
+     * @brief Calculate pseudo header checksum for IPv6.
+     * @param src source address
+     * @param dst destination address
+     * @param length length
+     * @param protocol the protocol number to use in the
      * underlying IPv6 packet.
      */
     void CalculatePseudoHeaderChecksum(Ipv6Address src,
@@ -200,1254 +200,1254 @@
 
   protected:
     /**
-     * \brief Checksum enable or not.
+     * @brief Checksum enable or not.
      */
     bool m_calcChecksum;
 
     /**
-     * \brief The checksum.
+     * @brief The checksum.
      */
     uint16_t m_checksum;
 
   private:
     /**
-     * \brief The type.
+     * @brief The type.
      */
     uint8_t m_type;
 
     /**
-     * \brief The code.
+     * @brief The code.
      */
     uint8_t m_code;
 };
 
 /**
- * \ingroup icmpv6
+ * @ingroup icmpv6
  *
- * \brief ICMPv6 option header.
+ * @brief ICMPv6 option header.
  */
 class Icmpv6OptionHeader : public Header
 {
   public:
     /**
-     * \brief Get the UID of this class.
-     * \return UID
+     * @brief Get the UID of this class.
+     * @return UID
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
 
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Icmpv6OptionHeader();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Icmpv6OptionHeader() override;
 
     /**
-     * \brief Get the type of the option.
-     * \return type
+     * @brief Get the type of the option.
+     * @return type
      */
     uint8_t GetType() const;
 
     /**
-     * \brief Set the type of the option.
-     * \param type the type to set
+     * @brief Set the type of the option.
+     * @param type the type to set
      */
     void SetType(uint8_t type);
 
     /**
-     * \brief Get the length of the option in 8 bytes unit.
-     * \return length of the option
+     * @brief Get the length of the option in 8 bytes unit.
+     * @return length of the option
      */
     uint8_t GetLength() const;
 
     /**
-     * \brief Set the length of the option.
-     * \param len length value to set
+     * @brief Set the length of the option.
+     * @param len length value to set
      */
     void SetLength(uint8_t len);
 
     /**
-     * \brief Print information.
-     * \param os output stream
+     * @brief Print information.
+     * @param os output stream
      */
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Get the serialized size.
-     * \return serialized size
+     * @brief Get the serialized size.
+     * @return serialized size
      */
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Serialize the packet.
-     * \param start start offset
+     * @brief Serialize the packet.
+     * @param start start offset
      */
     void Serialize(Buffer::Iterator start) const override;
 
     /**
-     * \brief Deserialize the packet.
-     * \param start start offset
-     * \return length of packet
+     * @brief Deserialize the packet.
+     * @param start start offset
+     * @return length of packet
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
 
   private:
     /**
-     * \brief The type.
+     * @brief The type.
      */
     uint8_t m_type;
 
     /**
-     * \brief The length.
+     * @brief The length.
      */
     uint8_t m_len;
 };
 
 /**
- * \ingroup icmpv6
+ * @ingroup icmpv6
  *
- * \brief ICMPv6 Neighbor Solicitation header.
+ * @brief ICMPv6 Neighbor Solicitation header.
  */
 class Icmpv6NS : public Icmpv6Header
 {
   public:
     /**
-     * \brief Constructor.
-     * \param target target IPv6 address
+     * @brief Constructor.
+     * @param target target IPv6 address
      */
     Icmpv6NS(Ipv6Address target);
 
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Icmpv6NS();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Icmpv6NS() override;
 
     /**
-     * \brief Get the UID of this class.
-     * \return UID
+     * @brief Get the UID of this class.
+     * @return UID
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
 
     /**
-     * \brief Get the reserved field.
-     * \return reserved value
+     * @brief Get the reserved field.
+     * @return reserved value
      */
     uint32_t GetReserved() const;
 
     /**
-     * \brief Set the reserved field.
-     * \param reserved the reserved value
+     * @brief Set the reserved field.
+     * @param reserved the reserved value
      */
     void SetReserved(uint32_t reserved);
 
     /**
-     * \brief Get the IPv6 target field.
-     * \return IPv6 address
+     * @brief Get the IPv6 target field.
+     * @return IPv6 address
      */
     Ipv6Address GetIpv6Target() const;
 
     /**
-     * \brief Set the IPv6 target field.
-     * \param target IPv6 address
+     * @brief Set the IPv6 target field.
+     * @param target IPv6 address
      */
     void SetIpv6Target(Ipv6Address target);
 
     /**
-     * \brief Print information.
-     * \param os output stream
+     * @brief Print information.
+     * @param os output stream
      */
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Get the serialized size.
-     * \return serialized size
+     * @brief Get the serialized size.
+     * @return serialized size
      */
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Serialize the packet.
-     * \param start start offset
+     * @brief Serialize the packet.
+     * @param start start offset
      */
     void Serialize(Buffer::Iterator start) const override;
 
     /**
-     * \brief Deserialize the packet.
-     * \param start start offset
-     * \return length of packet
+     * @brief Deserialize the packet.
+     * @param start start offset
+     * @return length of packet
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
 
   private:
     /**
-     * \brief The reserved value.
+     * @brief The reserved value.
      */
     uint32_t m_reserved;
 
     /**
-     * \brief The IPv6 target address.
+     * @brief The IPv6 target address.
      */
     Ipv6Address m_target;
 };
 
 /**
- * \ingroup icmpv6
+ * @ingroup icmpv6
  *
- * \brief ICMPv6 Neighbor Advertisement header.
+ * @brief ICMPv6 Neighbor Advertisement header.
  */
 class Icmpv6NA : public Icmpv6Header
 {
   public:
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Icmpv6NA();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Icmpv6NA() override;
 
     /**
-     * \brief Get the UID of this class.
-     * \return UID
+     * @brief Get the UID of this class.
+     * @return UID
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
 
     /**
-     * \brief Get the reserved field.
-     * \return reserved value
+     * @brief Get the reserved field.
+     * @return reserved value
      */
     uint32_t GetReserved() const;
 
     /**
-     * \brief Set the reserved field.
-     * \param reserved the reserved value
+     * @brief Set the reserved field.
+     * @param reserved the reserved value
      */
     void SetReserved(uint32_t reserved);
 
     /**
-     * \brief Get the IPv6 target field.
-     * \return IPv6 address
+     * @brief Get the IPv6 target field.
+     * @return IPv6 address
      */
     Ipv6Address GetIpv6Target() const;
 
     /**
-     * \brief Set the IPv6 target field.
-     * \param target IPv6 address
+     * @brief Set the IPv6 target field.
+     * @param target IPv6 address
      */
     void SetIpv6Target(Ipv6Address target);
 
     /**
-     * \brief Get the R flag.
-     * \return R flag
+     * @brief Get the R flag.
+     * @return R flag
      */
     bool GetFlagR() const;
 
     /**
-     * \brief Set the R flag.
-     * \param r value
+     * @brief Set the R flag.
+     * @param r value
      */
     void SetFlagR(bool r);
 
     /**
-     * \brief Get the S flag.
-     * \return S flag
+     * @brief Get the S flag.
+     * @return S flag
      */
     bool GetFlagS() const;
 
     /**
-     * \brief Set the S flag.
-     * \param s value
+     * @brief Set the S flag.
+     * @param s value
      */
     void SetFlagS(bool s);
 
     /**
-     * \brief Get the O flag.
-     * \return O flag
+     * @brief Get the O flag.
+     * @return O flag
      */
     bool GetFlagO() const;
 
     /**
-     * \brief Set the O flag.
-     * \param o value
+     * @brief Set the O flag.
+     * @param o value
      */
     void SetFlagO(bool o);
 
     /**
-     * \brief Print information.
-     * \param os output stream
+     * @brief Print information.
+     * @param os output stream
      */
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Get the serialized size.
-     * \return serialized size
+     * @brief Get the serialized size.
+     * @return serialized size
      */
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Serialize the packet.
-     * \param start start offset
+     * @brief Serialize the packet.
+     * @param start start offset
      */
     void Serialize(Buffer::Iterator start) const override;
 
     /**
-     * \brief Deserialize the packet.
-     * \param start start offset
-     * \return length of packet
+     * @brief Deserialize the packet.
+     * @param start start offset
+     * @return length of packet
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
 
   private:
     /**
-     * \brief The R flag.
+     * @brief The R flag.
      */
     bool m_flagR;
 
     /**
-     * \brief The O flag.
+     * @brief The O flag.
      */
     bool m_flagS;
 
     /**
-     * \brief The M flag.
+     * @brief The M flag.
      */
     bool m_flagO;
 
     /**
-     * \brief The reserved value.
+     * @brief The reserved value.
      */
     uint32_t m_reserved;
 
     /**
-     * \brief The IPv6 target address.
+     * @brief The IPv6 target address.
      */
     Ipv6Address m_target;
 };
 
 /**
- * \ingroup icmpv6
+ * @ingroup icmpv6
  *
- * \brief ICMPv6 Router Advertisement header.
+ * @brief ICMPv6 Router Advertisement header.
  */
 class Icmpv6RA : public Icmpv6Header
 {
   public:
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Icmpv6RA();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Icmpv6RA() override;
 
     /**
-     * \brief Get the UID of this class.
-     * \return UID
+     * @brief Get the UID of this class.
+     * @return UID
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
 
     /**
-     * \brief Set the IPv6 maximum number of jumps.
-     * \param m maximum jumps
+     * @brief Set the IPv6 maximum number of jumps.
+     * @param m maximum jumps
      */
     void SetCurHopLimit(uint8_t m);
 
     /**
-     * \brief Get the IPv6 maximum number of jumps.
-     * \return maximum jumps
+     * @brief Get the IPv6 maximum number of jumps.
+     * @return maximum jumps
      */
     uint8_t GetCurHopLimit() const;
 
     /**
-     * \brief Set the node Life time (Neighbor Discovery).
-     * \param l life time
+     * @brief Set the node Life time (Neighbor Discovery).
+     * @param l life time
      */
     void SetLifeTime(uint16_t l);
 
     /**
-     * \brief Get the node Life time (Neighbor Discovery).
-     * \return life time
+     * @brief Get the node Life time (Neighbor Discovery).
+     * @return life time
      */
     uint16_t GetLifeTime() const;
 
     /**
-     * \brief Set the node Reachable time (Neighbor Discovery).
-     * \param r Reachable time
+     * @brief Set the node Reachable time (Neighbor Discovery).
+     * @param r Reachable time
      */
     void SetReachableTime(uint32_t r);
 
     /**
-     * \brief Get the node Reachable time (Neighbor Discovery).
-     * \return reachable time
+     * @brief Get the node Reachable time (Neighbor Discovery).
+     * @return reachable time
      */
     uint32_t GetReachableTime() const;
 
     /**
-     * \brief Set the node Retransmission time (Neighbor Discovery).
-     * \param r Retransmission time
+     * @brief Set the node Retransmission time (Neighbor Discovery).
+     * @param r Retransmission time
      */
     void SetRetransmissionTime(uint32_t r);
 
     /**
-     * \brief Get the node Retransmission time (Neighbor Discovery).
-     * \return retransmission time
+     * @brief Get the node Retransmission time (Neighbor Discovery).
+     * @return retransmission time
      */
     uint32_t GetRetransmissionTime() const;
 
     /**
-     * \brief Get the M flag.
-     * \return M flag
+     * @brief Get the M flag.
+     * @return M flag
      */
     bool GetFlagM() const;
 
     /**
-     * \brief Set the M flag.
-     * \param m value
+     * @brief Set the M flag.
+     * @param m value
      */
     void SetFlagM(bool m);
 
     /**
-     * \brief Get the O flag.
-     * \return O flag
+     * @brief Get the O flag.
+     * @return O flag
      */
     bool GetFlagO() const;
 
     /**
-     * \brief Set the O flag.
-     * \param o value
+     * @brief Set the O flag.
+     * @param o value
      */
     void SetFlagO(bool o);
 
     /**
-     * \brief Get the H flag.
-     * \return H flag
+     * @brief Get the H flag.
+     * @return H flag
      */
     bool GetFlagH() const;
 
     /**
-     * \brief Set the H flag.
-     * \param h value
+     * @brief Set the H flag.
+     * @param h value
      */
     void SetFlagH(bool h);
 
     /**
-     * \brief Print information.
-     * \param os output stream
+     * @brief Print information.
+     * @param os output stream
      */
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Get the serialized size.
-     * \return serialized size
+     * @brief Get the serialized size.
+     * @return serialized size
      */
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Serialize the packet.
-     * \param start start offset
+     * @brief Serialize the packet.
+     * @param start start offset
      */
     void Serialize(Buffer::Iterator start) const override;
 
     /**
-     * \brief Deserialize the packet.
-     * \param start start offset
-     * \return length of packet
+     * @brief Deserialize the packet.
+     * @param start start offset
+     * @return length of packet
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
 
   private:
     /**
-     * \brief The M flag.
+     * @brief The M flag.
      */
     bool m_flagM;
 
     /**
-     * \brief The O flag.
+     * @brief The O flag.
      */
     bool m_flagO;
 
     /**
-     * \brief The H flag.
+     * @brief The H flag.
      */
     bool m_flagH;
 
     /**
-     * \brief The lifetime value.
+     * @brief The lifetime value.
      */
     uint16_t m_LifeTime;
 
     /**
-     * \brief The reachable time value.
+     * @brief The reachable time value.
      */
     uint32_t m_ReachableTime;
 
     /**
-     * \brief The retransmission timer.
+     * @brief The retransmission timer.
      */
     uint32_t m_RetransmissionTimer;
 
     /**
-     * \brief The max jumps.
+     * @brief The max jumps.
      */
     uint8_t m_curHopLimit;
 };
 
 /**
- * \ingroup icmpv6
+ * @ingroup icmpv6
  *
- * \brief ICMPv6 Router Solicitation header.
+ * @brief ICMPv6 Router Solicitation header.
  */
 class Icmpv6RS : public Icmpv6Header
 {
   public:
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Icmpv6RS();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Icmpv6RS() override;
 
     /**
-     * \brief Get the UID of this class.
-     * \return UID
+     * @brief Get the UID of this class.
+     * @return UID
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
 
     /**
-     * \brief Get the reserved field.
-     * \return reserved value
+     * @brief Get the reserved field.
+     * @return reserved value
      */
     uint32_t GetReserved() const;
 
     /**
-     * \brief Set the reserved field.
-     * \param reserved the reserved value
+     * @brief Set the reserved field.
+     * @param reserved the reserved value
      */
     void SetReserved(uint32_t reserved);
 
     /**
-     * \brief Print information.
-     * \param os output stream
+     * @brief Print information.
+     * @param os output stream
      */
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Get the serialized size.
-     * \return serialized size
+     * @brief Get the serialized size.
+     * @return serialized size
      */
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Serialize the packet.
-     * \param start start offset
+     * @brief Serialize the packet.
+     * @param start start offset
      */
     void Serialize(Buffer::Iterator start) const override;
 
     /**
-     * \brief Deserialize the packet.
-     * \param start start offset
-     * \return length of packet
+     * @brief Deserialize the packet.
+     * @param start start offset
+     * @return length of packet
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
 
   private:
     /**
-     * \brief The reserved value.
+     * @brief The reserved value.
      */
     uint32_t m_reserved;
 };
 
 /**
- * \ingroup icmpv6
+ * @ingroup icmpv6
  *
- * \brief ICMPv6 Redirection header.
+ * @brief ICMPv6 Redirection header.
  */
 class Icmpv6Redirection : public Icmpv6Header
 {
   public:
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Icmpv6Redirection();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Icmpv6Redirection() override;
 
     /**
-     * \brief Get the UID of this class.
-     * \return UID
+     * @brief Get the UID of this class.
+     * @return UID
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
 
     /**
-     * \brief Get the IPv6 target address.
-     * \return the IPv6 target address
+     * @brief Get the IPv6 target address.
+     * @return the IPv6 target address
      */
     Ipv6Address GetTarget() const;
 
     /**
-     * \brief Set the IPv6 target address.
-     * \param target IPv6 target address
+     * @brief Set the IPv6 target address.
+     * @param target IPv6 target address
      */
     void SetTarget(Ipv6Address target);
 
     /**
-     * \brief Get the IPv6 destination address.
-     * \return the IPv6 destination address
+     * @brief Get the IPv6 destination address.
+     * @return the IPv6 destination address
      */
     Ipv6Address GetDestination() const;
 
     /**
-     * \brief Set the IPv6 destination address.
-     * \param destination IPv6 destination address
+     * @brief Set the IPv6 destination address.
+     * @param destination IPv6 destination address
      */
     void SetDestination(Ipv6Address destination);
 
     /**
-     * \brief Print information.
-     * \param os output stream
+     * @brief Print information.
+     * @param os output stream
      */
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Get the serialized size.
-     * \return serialized size
+     * @brief Get the serialized size.
+     * @return serialized size
      */
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Serialize the packet.
-     * \param start start offset
+     * @brief Serialize the packet.
+     * @param start start offset
      */
     void Serialize(Buffer::Iterator start) const override;
 
     /**
-     * \brief Deserialize the packet.
-     * \param start start offset
-     * \return length of packet
+     * @brief Deserialize the packet.
+     * @param start start offset
+     * @return length of packet
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
 
     /**
-     * \brief Get the reserved field.
-     * \return reserved value
+     * @brief Get the reserved field.
+     * @return reserved value
      */
     uint32_t GetReserved() const;
 
     /**
-     * \brief Set the reserved field.
-     * \param reserved the reserved value
+     * @brief Set the reserved field.
+     * @param reserved the reserved value
      */
     void SetReserved(uint32_t reserved);
 
   private:
     /**
-     * \brief IPv6 target address.
+     * @brief IPv6 target address.
      */
     Ipv6Address m_target;
 
     /**
-     * \brief IPv6 destination address.
+     * @brief IPv6 destination address.
      */
     Ipv6Address m_destination;
 
     /**
-     * \brief Reserved value.
+     * @brief Reserved value.
      */
     uint32_t m_reserved;
 };
 
 /**
- * \ingroup icmpv6
+ * @ingroup icmpv6
  *
- * \brief ICMPv6 Echo message.
+ * @brief ICMPv6 Echo message.
  */
 class Icmpv6Echo : public Icmpv6Header
 {
   public:
     /**
-     * \brief Get the UID of this class.
-     * \return UID
+     * @brief Get the UID of this class.
+     * @return UID
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
 
     /**
-     * \brief Default constructor.
+     * @brief Default constructor.
      */
     Icmpv6Echo();
 
     /**
-     * \brief Constructor.
-     * \param request request or reply message
+     * @brief Constructor.
+     * @param request request or reply message
      */
     Icmpv6Echo(bool request);
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Icmpv6Echo() override;
 
     /**
-     * \brief Get the ID of the packet.
-     * \return id
+     * @brief Get the ID of the packet.
+     * @return id
      */
     uint16_t GetId() const;
 
     /**
-     * \brief Set the ID of the packet.
-     * \param id id to set
+     * @brief Set the ID of the packet.
+     * @param id id to set
      */
     void SetId(uint16_t id);
 
     /**
-     * \brief Get the sequence number.
-     * \return sequence number
+     * @brief Get the sequence number.
+     * @return sequence number
      */
     uint16_t GetSeq() const;
 
     /**
-     * \brief Set the sequence number.
-     * \param seq sequence to set
+     * @brief Set the sequence number.
+     * @param seq sequence to set
      */
     void SetSeq(uint16_t seq);
 
     /**
-     * \brief Print information.
-     * \param os output stream
+     * @brief Print information.
+     * @param os output stream
      */
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Get the serialized size.
-     * \return serialized size
+     * @brief Get the serialized size.
+     * @return serialized size
      */
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Serialize the packet.
-     * \param start start offset
+     * @brief Serialize the packet.
+     * @param start start offset
      */
     void Serialize(Buffer::Iterator start) const override;
 
     /**
-     * \brief Deserialize the packet.
-     * \param start start offset
-     * \return length of packet
+     * @brief Deserialize the packet.
+     * @param start start offset
+     * @return length of packet
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
 
   private:
     /**
-     * \brief ID of the packet (to distinguish response between many ping program).
+     * @brief ID of the packet (to distinguish response between many ping program).
      */
     uint16_t m_id;
 
     /**
-     * \brief Sequence number (to distinguish response).
+     * @brief Sequence number (to distinguish response).
      */
     uint16_t m_seq;
 };
 
 /**
- * \ingroup icmpv6
+ * @ingroup icmpv6
  *
- * \brief ICMPv6 Error Destination Unreachable header.
+ * @brief ICMPv6 Error Destination Unreachable header.
  */
 class Icmpv6DestinationUnreachable : public Icmpv6Header
 {
   public:
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Icmpv6DestinationUnreachable();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Icmpv6DestinationUnreachable() override;
 
     /**
-     * \brief Get the UID of this class.
-     * \return UID
+     * @brief Get the UID of this class.
+     * @return UID
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
 
     /**
-     * \brief Set the incorrect packet.
-     * \param p the incorrect packet
+     * @brief Set the incorrect packet.
+     * @param p the incorrect packet
      */
     void SetPacket(Ptr<Packet> p);
 
     /**
-     * \brief Print information.
-     * \param os output stream
+     * @brief Print information.
+     * @param os output stream
      */
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Get the serialized size.
-     * \return serialized size
+     * @brief Get the serialized size.
+     * @return serialized size
      */
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Serialize the packet.
-     * \param start start offset
+     * @brief Serialize the packet.
+     * @param start start offset
      */
     void Serialize(Buffer::Iterator start) const override;
 
     /**
-     * \brief Deserialize the packet.
-     * \param start start offset
-     * \return length of packet
+     * @brief Deserialize the packet.
+     * @param start start offset
+     * @return length of packet
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
 
   private:
     /**
-     * \brief The incorrect Packet.
+     * @brief The incorrect Packet.
      */
     Ptr<Packet> m_packet;
 };
 
 /**
- * \ingroup icmpv6
+ * @ingroup icmpv6
  *
- * \brief ICMPv6 Error Too Big header.
+ * @brief ICMPv6 Error Too Big header.
  */
 class Icmpv6TooBig : public Icmpv6Header
 {
   public:
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Icmpv6TooBig();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Icmpv6TooBig() override;
 
     /**
-     * \brief Get the UID of this class.
-     * \return UID
+     * @brief Get the UID of this class.
+     * @return UID
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
 
     /**
-     * \brief Set the incorrect packet.
-     * \param p the incorrect packet
+     * @brief Set the incorrect packet.
+     * @param p the incorrect packet
      */
     void SetPacket(Ptr<Packet> p);
 
     /**
-     * \brief Get the MTU field.
-     * \return MTU value
+     * @brief Get the MTU field.
+     * @return MTU value
      */
     uint32_t GetMtu() const;
 
     /**
-     * \brief Set the MTU.
-     * \param mtu the MTU
+     * @brief Set the MTU.
+     * @param mtu the MTU
      */
     void SetMtu(uint32_t mtu);
 
     /**
-     * \brief Print information.
-     * \param os output stream
+     * @brief Print information.
+     * @param os output stream
      */
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Get the serialized size.
-     * \return serialized size
+     * @brief Get the serialized size.
+     * @return serialized size
      */
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Serialize the packet.
-     * \param start start offset
+     * @brief Serialize the packet.
+     * @param start start offset
      */
     void Serialize(Buffer::Iterator start) const override;
 
     /**
-     * \brief Deserialize the packet.
-     * \param start start offset
-     * \return length of packet
+     * @brief Deserialize the packet.
+     * @param start start offset
+     * @return length of packet
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
 
   private:
     /**
-     * \brief the incorrect packet.
+     * @brief the incorrect packet.
      */
     Ptr<Packet> m_packet;
 
     /**
-     * \brief The MTU value.
+     * @brief The MTU value.
      */
     uint32_t m_mtu;
 };
 
 /**
- * \ingroup icmpv6
+ * @ingroup icmpv6
  *
- * \brief ICMPv6 Error Time Exceeded header.
+ * @brief ICMPv6 Error Time Exceeded header.
  */
 class Icmpv6TimeExceeded : public Icmpv6Header
 {
   public:
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Icmpv6TimeExceeded();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Icmpv6TimeExceeded() override;
 
     /**
-     * \brief Get the UID of this class.
-     * \return UID
+     * @brief Get the UID of this class.
+     * @return UID
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
 
     /**
-     * \brief Set the incorrect packet.
-     * \param p the incorrect packet
+     * @brief Set the incorrect packet.
+     * @param p the incorrect packet
      */
     void SetPacket(Ptr<Packet> p);
 
     /**
-     * \brief Print information.
-     * \param os output stream
+     * @brief Print information.
+     * @param os output stream
      */
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Get the serialized size.
-     * \return serialized size
+     * @brief Get the serialized size.
+     * @return serialized size
      */
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Serialize the packet.
-     * \param start start offset
+     * @brief Serialize the packet.
+     * @param start start offset
      */
     void Serialize(Buffer::Iterator start) const override;
 
     /**
-     * \brief Deserialize the packet.
-     * \param start start offset
-     * \return length of packet
+     * @brief Deserialize the packet.
+     * @param start start offset
+     * @return length of packet
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
 
   private:
     /**
-     * \brief The incorrect packet.
+     * @brief The incorrect packet.
      */
     Ptr<Packet> m_packet;
 };
 
 /**
- * \ingroup icmpv6
+ * @ingroup icmpv6
  *
- * \brief ICMPv6 Error Parameter Error header.
+ * @brief ICMPv6 Error Parameter Error header.
  */
 class Icmpv6ParameterError : public Icmpv6Header
 {
   public:
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Icmpv6ParameterError();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Icmpv6ParameterError() override;
 
     /**
-     * \brief Get the UID of this class.
-     * \return UID
+     * @brief Get the UID of this class.
+     * @return UID
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
 
     /**
-     * \brief Set the incorrect packet.
-     * \param p the incorrect packet
+     * @brief Set the incorrect packet.
+     * @param p the incorrect packet
      */
     void SetPacket(Ptr<Packet> p);
 
     /**
-     * \brief Get the pointer field.
-     * \return pointer value
+     * @brief Get the pointer field.
+     * @return pointer value
      */
     uint32_t GetPtr() const;
 
     /**
-     * \brief Set the pointer field.
-     * \param ptr byte where the error is located in the incorrect packet
+     * @brief Set the pointer field.
+     * @param ptr byte where the error is located in the incorrect packet
      */
     void SetPtr(uint32_t ptr);
 
     /**
-     * \brief Print information.
-     * \param os output stream
+     * @brief Print information.
+     * @param os output stream
      */
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Get the serialized size.
-     * \return serialized size
+     * @brief Get the serialized size.
+     * @return serialized size
      */
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Serialize the packet.
-     * \param start start offset
+     * @brief Serialize the packet.
+     * @param start start offset
      */
     void Serialize(Buffer::Iterator start) const override;
 
     /**
-     * \brief Deserialize the packet.
-     * \param start start offset
-     * \return length of packet
+     * @brief Deserialize the packet.
+     * @param start start offset
+     * @return length of packet
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
 
   private:
     /**
-     * \brief The incorrect packet.
+     * @brief The incorrect packet.
      */
     Ptr<Packet> m_packet;
 
     /**
-     * \brief The pointer field.
+     * @brief The pointer field.
      */
     uint32_t m_ptr;
 };
 
 /**
- * \ingroup icmpv6
+ * @ingroup icmpv6
  *
- * \brief ICMPv6 MTU option.
+ * @brief ICMPv6 MTU option.
  */
 class Icmpv6OptionMtu : public Icmpv6OptionHeader
 {
   public:
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Icmpv6OptionMtu();
 
     /**
-     * \brief Constructor.
-     * \param mtu MTU used.
+     * @brief Constructor.
+     * @param mtu MTU used.
      */
     Icmpv6OptionMtu(uint32_t mtu);
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Icmpv6OptionMtu() override;
 
     /**
-     * \brief Get the UID of this class.
-     * \return UID
+     * @brief Get the UID of this class.
+     * @return UID
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
 
     /**
-     * \brief Get the reserved field.
-     * \return the reserved value
+     * @brief Get the reserved field.
+     * @return the reserved value
      */
     uint16_t GetReserved() const;
 
     /**
-     * \brief Set the reserved field.
-     * \param reserved the reserved value
+     * @brief Set the reserved field.
+     * @param reserved the reserved value
      */
     void SetReserved(uint16_t reserved);
 
     /**
-     * \brief Get the MTU.
-     * \return the MTU value
+     * @brief Get the MTU.
+     * @return the MTU value
      */
     uint32_t GetMtu() const;
 
     /**
-     * \brief Set the MTU.
-     * \param mtu the MTU to set
+     * @brief Set the MTU.
+     * @param mtu the MTU to set
      */
     void SetMtu(uint32_t mtu);
 
     /**
-     * \brief Print information.
-     * \param os output stream
+     * @brief Print information.
+     * @param os output stream
      */
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Get the serialized size.
-     * \return serialized size
+     * @brief Get the serialized size.
+     * @return serialized size
      */
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Serialize the packet.
-     * \param start start offset
+     * @brief Serialize the packet.
+     * @param start start offset
      */
     void Serialize(Buffer::Iterator start) const override;
 
     /**
-     * \brief Deserialize the packet.
-     * \param start start offset
-     * \return length of packet
+     * @brief Deserialize the packet.
+     * @param start start offset
+     * @return length of packet
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
 
   private:
     /**
-     * \brief The reserved value
+     * @brief The reserved value
      */
     uint16_t m_reserved;
 
     /**
-     * \brief The MTU value.
+     * @brief The MTU value.
      */
     uint32_t m_mtu;
 };
 
 /**
- * \ingroup icmpv6
+ * @ingroup icmpv6
  *
- * \brief ICMPv6 Option Prefix Information.
+ * @brief ICMPv6 Option Prefix Information.
  */
 class Icmpv6OptionPrefixInformation : public Icmpv6OptionHeader
 {
   public:
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Icmpv6OptionPrefixInformation();
 
     /**
-     * \brief Constructor.
-     * \param network prefix
-     * \param prefixlen prefix length
+     * @brief Constructor.
+     * @param network prefix
+     * @param prefixlen prefix length
      */
     Icmpv6OptionPrefixInformation(Ipv6Address network, uint8_t prefixlen);
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Icmpv6OptionPrefixInformation() override;
 
     /**
-     * \brief Get the UID of this class.
-     * \return UID
+     * @brief Get the UID of this class.
+     * @return UID
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
 
     /**
-     * \brief Icmpv6 Option Prefix Information flag field values
+     * @brief Icmpv6 Option Prefix Information flag field values
      */
     enum Flags_t
     {
@@ -1458,285 +1458,285 @@
     };
 
     /**
-     * \brief Get the prefix length.
-     * \return prefix length
+     * @brief Get the prefix length.
+     * @return prefix length
      */
     uint8_t GetPrefixLength() const;
 
     /**
-     * \brief Set the prefix length.
-     * \param prefixLength the prefix length
+     * @brief Set the prefix length.
+     * @param prefixLength the prefix length
      */
     void SetPrefixLength(uint8_t prefixLength);
 
     /**
-     * \brief Get the flags.
-     * \return the flags.
+     * @brief Get the flags.
+     * @return the flags.
      */
     uint8_t GetFlags() const;
 
     /**
-     * \brief Set the flags.
-     * \param flags the flags to set
+     * @brief Set the flags.
+     * @param flags the flags to set
      */
     void SetFlags(uint8_t flags);
 
     /**
-     * \brief Get the valid time of the information.
-     * \return valid time
+     * @brief Get the valid time of the information.
+     * @return valid time
      */
     uint32_t GetValidTime() const;
 
     /**
-     * \brief Set the valid time of the information.
-     * \param validTime valid time
+     * @brief Set the valid time of the information.
+     * @param validTime valid time
      */
     void SetValidTime(uint32_t validTime);
 
     /**
-     * \brief Get the preferred time of the information.
-     * \return preferred time
+     * @brief Get the preferred time of the information.
+     * @return preferred time
      */
     uint32_t GetPreferredTime() const;
 
     /**
-     * \brief Set the preferred time of the information.
-     * \param preferredTime preferred time
+     * @brief Set the preferred time of the information.
+     * @param preferredTime preferred time
      */
     void SetPreferredTime(uint32_t preferredTime);
 
     /**
-     * \brief Get the reserved field.
-     * \return the reserved field (should be 0x00000000)
+     * @brief Get the reserved field.
+     * @return the reserved field (should be 0x00000000)
      */
     uint32_t GetReserved() const;
 
     /**
-     * \brief Set the reserved field (normally it will be 0x00000000).
-     * \param reserved reserved value
+     * @brief Set the reserved field (normally it will be 0x00000000).
+     * @param reserved reserved value
      */
     void SetReserved(uint32_t reserved);
 
     /**
-     * \brief Get the IPv6 prefix.
-     * \return IPv6 prefix
+     * @brief Get the IPv6 prefix.
+     * @return IPv6 prefix
      */
     Ipv6Address GetPrefix() const;
 
     /**
-     * \brief Set the IPv6 prefix.
-     * \param prefix the IPv6 prefix
+     * @brief Set the IPv6 prefix.
+     * @param prefix the IPv6 prefix
      */
     void SetPrefix(Ipv6Address prefix);
 
     /**
-     * \brief Print information.
-     * \param os output stream
+     * @brief Print information.
+     * @param os output stream
      */
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Get the serialized size.
-     * \return serialized size
+     * @brief Get the serialized size.
+     * @return serialized size
      */
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Serialize the packet.
-     * \param start start offset
+     * @brief Serialize the packet.
+     * @param start start offset
      */
     void Serialize(Buffer::Iterator start) const override;
 
     /**
-     * \brief Deserialize the packet.
-     * \param start start offset
-     * \return length of packet
+     * @brief Deserialize the packet.
+     * @param start start offset
+     * @return length of packet
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
 
   private:
     /**
-     * \brief The prefix value.
+     * @brief The prefix value.
      */
     Ipv6Address m_prefix;
 
     /**
-     * \brief The length of the prefix.
+     * @brief The length of the prefix.
      */
     uint8_t m_prefixLength;
 
     /**
-     * \brief The flags.
+     * @brief The flags.
      */
     uint8_t m_flags;
 
     /**
-     * \brief The valid time.
+     * @brief The valid time.
      */
     uint32_t m_validTime;
 
     /**
-     * \brief The preferred time.
+     * @brief The preferred time.
      */
     uint32_t m_preferredTime;
 
     /**
-     * \brief The reserved field.
+     * @brief The reserved field.
      */
     uint32_t m_reserved;
 };
 
 /**
- * \ingroup icmpv6
+ * @ingroup icmpv6
  *
- * \brief ICMPv6 link-layer address option.
+ * @brief ICMPv6 link-layer address option.
  */
 class Icmpv6OptionLinkLayerAddress : public Icmpv6OptionHeader
 {
   public:
     /**
-     * \brief Constructor.
-     * \param source source hardware address or target hardware address for the option
+     * @brief Constructor.
+     * @param source source hardware address or target hardware address for the option
      */
     Icmpv6OptionLinkLayerAddress(bool source);
 
     /**
-     * \brief Get the UID of this class.
-     * \return UID
+     * @brief Get the UID of this class.
+     * @return UID
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
 
     /**
-     * \brief Constructor.
-     * \param source source hardware address or target hardware address for the option
-     * \param addr hardware address
+     * @brief Constructor.
+     * @param source source hardware address or target hardware address for the option
+     * @param addr hardware address
      */
     Icmpv6OptionLinkLayerAddress(bool source, Address addr);
 
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Icmpv6OptionLinkLayerAddress();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Icmpv6OptionLinkLayerAddress() override;
 
     /**
-     * \brief Get the hardware address.
-     * \return the hardware address
+     * @brief Get the hardware address.
+     * @return the hardware address
      */
     Address GetAddress() const;
 
     /**
-     * \brief Set the hardware address.
-     * \param addr the address to set
+     * @brief Set the hardware address.
+     * @param addr the address to set
      */
     void SetAddress(Address addr);
 
     /**
-     * \brief Print information.
-     * \param os output stream
+     * @brief Print information.
+     * @param os output stream
      */
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Get the serialized size.
-     * \return serialized size
+     * @brief Get the serialized size.
+     * @return serialized size
      */
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Serialize the packet.
-     * \param start start offset
+     * @brief Serialize the packet.
+     * @param start start offset
      */
     void Serialize(Buffer::Iterator start) const override;
 
     /**
-     * \brief Deserialize the packet.
-     * \param start start offset
-     * \return length of packet
+     * @brief Deserialize the packet.
+     * @param start start offset
+     * @return length of packet
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
 
   private:
     /**
-     * \brief The hardware address.
+     * @brief The hardware address.
      */
     Address m_addr;
 };
 
 /**
- * \ingroup icmpv6
+ * @ingroup icmpv6
  *
- * \brief ICMPv6 redirected option.
+ * @brief ICMPv6 redirected option.
  */
 class Icmpv6OptionRedirected : public Icmpv6OptionHeader
 {
   public:
     /**
-     * \brief Get the UID of this class.
-     * \return UID
+     * @brief Get the UID of this class.
+     * @return UID
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
 
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Icmpv6OptionRedirected();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Icmpv6OptionRedirected() override;
 
     /**
-     * \brief Set the redirected packet.
-     * \param packet the redirected packet
+     * @brief Set the redirected packet.
+     * @param packet the redirected packet
      */
     void SetPacket(Ptr<Packet> packet);
 
     /**
-     * \brief Print information.
-     * \param os output stream
+     * @brief Print information.
+     * @param os output stream
      */
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Get the serialized size.
-     * \return serialized size
+     * @brief Get the serialized size.
+     * @return serialized size
      */
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Serialize the packet.
-     * \param start start offset
+     * @brief Serialize the packet.
+     * @param start start offset
      */
     void Serialize(Buffer::Iterator start) const override;
 
     /**
-     * \brief Deserialize the packet.
-     * \param start start offset
-     * \return length of packet
+     * @brief Deserialize the packet.
+     * @param start start offset
+     * @return length of packet
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
 
   private:
     /**
-     * \brief The redirected packet.
+     * @brief The redirected packet.
      */
     Ptr<Packet> m_packet;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/icmpv6-l4-protocol.cc ns-3.44/src/internet/model/icmpv6-l4-protocol.cc
--- ns-3.43/src/internet/model/icmpv6-l4-protocol.cc	2024-10-09 16:41:09.884656000 -0700
+++ ns-3.44/src/internet/model/icmpv6-l4-protocol.cc	2025-03-09 16:55:49.391371000 -0700
@@ -11,6 +11,7 @@
 
 #include "icmpv6-l4-protocol.h"
 
+#include "ipv4-interface.h"
 #include "ipv6-interface.h"
 #include "ipv6-l3-protocol.h"
 #include "ipv6-route.h"
@@ -265,7 +266,7 @@
         return;
     }
 
-    /** \todo disable multicast loopback to prevent NS probing to be received by the sender */
+    /** @todo disable multicast loopback to prevent NS probing to be received by the sender */
 
     NdiscCache::Ipv6PayloadHeaderPair p = ForgeNS("::",
                                                   Ipv6Address::MakeSolicitedAddress(target),
@@ -274,7 +275,7 @@
 
     /* update last packet UID */
     interface->SetNsDadUid(target, p.first->GetUid());
-    Simulator::Schedule(Time(MilliSeconds(m_solicitationJitter->GetValue())),
+    Simulator::Schedule(MilliSeconds(m_solicitationJitter->GetValue()),
                         &Ipv6Interface::Send,
                         interface,
                         p.first,
@@ -333,7 +334,7 @@
     case Icmpv6Header::ICMPV6_ECHO_REPLY:
         // EchoReply does not contain any info about L4
         // so we can not forward it up.
-        /// \todo implement request / reply consistency check.
+        /// @todo implement request / reply consistency check.
         break;
     case Icmpv6Header::ICMPV6_ERROR_DESTINATION_UNREACHABLE:
         HandleDestinationUnreachable(p, header.GetSource(), header.GetDestination(), interface);
@@ -366,7 +367,7 @@
 
     Ptr<Ipv6L3Protocol> ipv6 = m_node->GetObject<Ipv6L3Protocol>();
 
-    /// \todo assuming the ICMP is carrying a extensionless IP packet
+    /// @todo assuming the ICMP is carrying a extensionless IP packet
 
     uint8_t nextHeader = ipHeader.GetNextHeader();
 
@@ -476,7 +477,7 @@
             {
                 p->RemoveHeader(mtuHdr);
                 hasMtu = true;
-                /** \todo case of multiple prefix on single interface */
+                /** @todo case of multiple prefix on single interface */
                 /* interface->GetDevice ()->SetMtu (m.GetMtu ()); */
             }
             break;
@@ -1332,7 +1333,7 @@
     else
     {
         NS_LOG_LOGIC("Destination is Multicast, using DelayedSendMessage");
-        Simulator::Schedule(Time(MilliSeconds(m_solicitationJitter->GetValue())),
+        Simulator::Schedule(MilliSeconds(m_solicitationJitter->GetValue()),
                             &Icmpv6L4Protocol::DelayedSendMessage,
                             this,
                             p,
@@ -1388,7 +1389,7 @@
             // First RS transmission - also add some jitter to desynchronize nodes.
             m_rsInitialRetransmissionTime = Simulator::Now();
             rsTimeout = m_rsInitialRetransmissionTime * (1 + m_rsRetransmissionJitter->GetValue());
-            rsDelay = Time(MilliSeconds(m_solicitationJitter->GetValue()));
+            rsDelay = MilliSeconds(m_solicitationJitter->GetValue());
         }
         else
         {
@@ -1431,7 +1432,7 @@
         }
     }
 
-    if (m_rsMaxRetransmissionDuration != Time(0) &&
+    if (!m_rsMaxRetransmissionDuration.IsZero() &&
         Simulator::Now() - m_rsInitialRetransmissionTime > m_rsMaxRetransmissionDuration)
     {
         NS_LOG_LOGIC("Maximum RS retransmission time reached, giving up.");
@@ -1879,7 +1880,7 @@
              */
             NS_LOG_LOGIC("Scheduled a first Router Solicitation");
             m_rsRetransmissionCount = 0;
-            Simulator::Schedule(Seconds(0.0),
+            Simulator::Schedule(Seconds(0),
                                 &Icmpv6L4Protocol::SendRS,
                                 this,
                                 ifaddr.GetAddress(),
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/icmpv6-l4-protocol.h ns-3.44/src/internet/model/icmpv6-l4-protocol.h
--- ns-3.43/src/internet/model/icmpv6-l4-protocol.h	2024-10-09 16:41:09.884656000 -0700
+++ ns-3.44/src/internet/model/icmpv6-l4-protocol.h	2025-03-09 16:55:49.391371000 -0700
@@ -30,162 +30,162 @@
 class TraceContext;
 
 /**
- * \ingroup ipv6
- * \defgroup icmpv6 ICMPv6 protocol and associated headers.
+ * @ingroup ipv6
+ * @defgroup icmpv6 ICMPv6 protocol and associated headers.
  */
 
 /**
- * \ingroup icmpv6
+ * @ingroup icmpv6
  *
- * \brief An implementation of the ICMPv6 protocol.
+ * @brief An implementation of the ICMPv6 protocol.
  */
 class Icmpv6L4Protocol : public IpL4Protocol
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
 
     /**
-     * \brief ICMPv6 protocol number (58).
+     * @brief ICMPv6 protocol number (58).
      */
     static const uint8_t PROT_NUMBER;
 
     /**
-     * \brief Neighbor Discovery node constants: max multicast solicitations.
-     * \returns The max multicast solicitations number.
+     * @brief Neighbor Discovery node constants: max multicast solicitations.
+     * @returns The max multicast solicitations number.
      */
     uint8_t GetMaxMulticastSolicit() const;
 
     /**
-     * \brief Neighbor Discovery node constants: max unicast solicitations.
-     * \returns The max unicast solicitations number.
+     * @brief Neighbor Discovery node constants: max unicast solicitations.
+     * @returns The max unicast solicitations number.
      */
     uint8_t GetMaxUnicastSolicit() const;
 
     /**
-     * \brief Neighbor Discovery node constants: reachable time.
-     * \returns The Reachable time for an Neighbor cache entry.
+     * @brief Neighbor Discovery node constants: reachable time.
+     * @returns The Reachable time for an Neighbor cache entry.
      */
     Time GetReachableTime() const;
 
     /**
-     * \brief Neighbor Discovery node constants: retransmission timer.
-     * \returns The Retransmission time for an Neighbor cache entry probe.
+     * @brief Neighbor Discovery node constants: retransmission timer.
+     * @returns The Retransmission time for an Neighbor cache entry probe.
      */
     Time GetRetransmissionTime() const;
 
     /**
-     * \brief Neighbor Discovery node constants : delay for the first probe.
-     * \returns The time before a first probe for an Neighbor cache entry.
+     * @brief Neighbor Discovery node constants : delay for the first probe.
+     * @returns The time before a first probe for an Neighbor cache entry.
      */
     Time GetDelayFirstProbe() const;
 
     /**
-     * \brief Get ICMPv6 protocol number.
-     * \return protocol number
+     * @brief Get ICMPv6 protocol number.
+     * @return protocol number
      */
     static uint16_t GetStaticProtocolNumber();
 
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Icmpv6L4Protocol();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Icmpv6L4Protocol() override;
 
     /**
-     * \brief Set the node.
-     * \param node the node to set
+     * @brief Set the node.
+     * @param node the node to set
      */
     void SetNode(Ptr<Node> node);
 
     /**
-     * \brief Get the node.
-     * \return node
+     * @brief Get the node.
+     * @return node
      */
     Ptr<Node> GetNode();
 
     /**
-     * \brief This method is called by AggregateObject and completes the aggregation
+     * @brief This method is called by AggregateObject and completes the aggregation
      * by setting the node in the ICMPv6 stack and adding ICMPv6 factory to
      * IPv6 stack connected to the node.
      */
     void NotifyNewAggregate() override;
 
     /**
-     * \brief Get the protocol number.
-     * \return protocol number
+     * @brief Get the protocol number.
+     * @return protocol number
      */
     int GetProtocolNumber() const override;
 
     /**
-     * \brief Get the version of the protocol.
-     * \return version
+     * @brief Get the version of the protocol.
+     * @return version
      */
     virtual int GetVersion() const;
 
     /**
-     * \brief Send a packet via ICMPv6, note that packet already contains ICMPv6 header.
-     * \param packet the packet to send which contains ICMPv6 header
-     * \param src source address
-     * \param dst destination address
-     * \param ttl next hop limit
+     * @brief Send a packet via ICMPv6, note that packet already contains ICMPv6 header.
+     * @param packet the packet to send which contains ICMPv6 header
+     * @param src source address
+     * @param dst destination address
+     * @param ttl next hop limit
      */
     void SendMessage(Ptr<Packet> packet, Ipv6Address src, Ipv6Address dst, uint8_t ttl);
 
     /**
-     * \brief Helper function used during delayed solicitation. Calls SendMessage internally
-     * \param packet the packet to send which contains ICMPv6 header
-     * \param src source address
-     * \param dst destination address
-     * \param ttl next hop limit
+     * @brief Helper function used during delayed solicitation. Calls SendMessage internally
+     * @param packet the packet to send which contains ICMPv6 header
+     * @param src source address
+     * @param dst destination address
+     * @param ttl next hop limit
      */
     void DelayedSendMessage(Ptr<Packet> packet, Ipv6Address src, Ipv6Address dst, uint8_t ttl);
 
     /**
-     * \brief Send a packet via ICMPv6.
-     * \param packet the packet to send
-     * \param dst destination address
-     * \param icmpv6Hdr ICMPv6 header (needed to calculate checksum
+     * @brief Send a packet via ICMPv6.
+     * @param packet the packet to send
+     * @param dst destination address
+     * @param icmpv6Hdr ICMPv6 header (needed to calculate checksum
      * after source address is determined by routing stuff
-     * \param ttl next hop limit
+     * @param ttl next hop limit
      */
     void SendMessage(Ptr<Packet> packet, Ipv6Address dst, Icmpv6Header& icmpv6Hdr, uint8_t ttl);
 
     /**
-     * \brief Do the Duplication Address Detection (DAD).
+     * @brief Do the Duplication Address Detection (DAD).
      * It consists in sending a NS with our IPv6 as target. If
      * we received a NA with matched target address, we could not use
      * the address, else the address pass from TENTATIVE to PERMANENT.
      *
-     * \param target target address
-     * \param interface interface
+     * @param target target address
+     * @param interface interface
      */
     void DoDAD(Ipv6Address target, Ptr<Ipv6Interface> interface);
 
     /**
-     * \brief Send a Neighbor Advertisement.
-     * \param src source IPv6 address
-     * \param dst destination IPv6 address
-     * \param hardwareAddress our MAC address
-     * \param flags to set (4 = flag R, 2 = flag S, 3 = flag O)
+     * @brief Send a Neighbor Advertisement.
+     * @param src source IPv6 address
+     * @param dst destination IPv6 address
+     * @param hardwareAddress our MAC address
+     * @param flags to set (4 = flag R, 2 = flag S, 3 = flag O)
      */
     void SendNA(Ipv6Address src, Ipv6Address dst, Address* hardwareAddress, uint8_t flags);
 
     /**
-     * \brief Send a Echo Reply.
-     * \param src source IPv6 address
-     * \param dst destination IPv6 address
-     * \param id id of the packet
-     * \param seq sequence number
-     * \param data auxiliary data
+     * @brief Send a Echo Reply.
+     * @param src source IPv6 address
+     * @param dst destination IPv6 address
+     * @param id id of the packet
+     * @param seq sequence number
+     * @param data auxiliary data
      */
     void SendEchoReply(Ipv6Address src,
                        Ipv6Address dst,
@@ -194,11 +194,11 @@
                        Ptr<Packet> data);
 
     /**
-     * \brief Send a Neighbor Solicitation.
-     * \param src source IPv6 address
-     * \param dst destination IPv6 address
-     * \param target target IPv6 address
-     * \param hardwareAddress our mac address
+     * @brief Send a Neighbor Solicitation.
+     * @param src source IPv6 address
+     * @param dst destination IPv6 address
+     * @param target target IPv6 address
+     * @param hardwareAddress our mac address
      */
     virtual void SendNS(Ipv6Address src,
                         Ipv6Address dst,
@@ -206,37 +206,37 @@
                         Address hardwareAddress);
 
     /**
-     * \brief Send an error Destination Unreachable.
-     * \param malformedPacket the malformed packet
-     * \param dst destination IPv6 address
-     * \param code code of the error
+     * @brief Send an error Destination Unreachable.
+     * @param malformedPacket the malformed packet
+     * @param dst destination IPv6 address
+     * @param code code of the error
      */
     void SendErrorDestinationUnreachable(Ptr<Packet> malformedPacket,
                                          Ipv6Address dst,
                                          uint8_t code);
 
     /**
-     * \brief Send an error Too Big.
-     * \param malformedPacket the malformed packet
-     * \param dst destination IPv6 address
-     * \param mtu the mtu
+     * @brief Send an error Too Big.
+     * @param malformedPacket the malformed packet
+     * @param dst destination IPv6 address
+     * @param mtu the mtu
      */
     void SendErrorTooBig(Ptr<Packet> malformedPacket, Ipv6Address dst, uint32_t mtu);
 
     /**
-     * \brief Send an error Time Exceeded.
-     * \param malformedPacket the malformed packet
-     * \param dst destination IPv6 address
-     * \param code code of the error
+     * @brief Send an error Time Exceeded.
+     * @param malformedPacket the malformed packet
+     * @param dst destination IPv6 address
+     * @param code code of the error
      */
     void SendErrorTimeExceeded(Ptr<Packet> malformedPacket, Ipv6Address dst, uint8_t code);
 
     /**
-     * \brief Send an error Parameter Error.
-     * \param malformedPacket the malformed packet
-     * \param dst destination IPv6 address
-     * \param code code of the error
-     * \param ptr byte of p where the error is located
+     * @brief Send an error Parameter Error.
+     * @param malformedPacket the malformed packet
+     * @param dst destination IPv6 address
+     * @param code code of the error
+     * @param ptr byte of p where the error is located
      */
     void SendErrorParameterError(Ptr<Packet> malformedPacket,
                                  Ipv6Address dst,
@@ -244,13 +244,13 @@
                                  uint32_t ptr);
 
     /**
-     * \brief Send an ICMPv6 Redirection.
-     * \param redirectedPacket the redirected packet
-     * \param src IPv6 address to send the redirect from
-     * \param dst IPv6 address to send the redirect to
-     * \param redirTarget IPv6 target address for Icmpv6Redirection
-     * \param redirDestination IPv6 destination address for Icmpv6Redirection
-     * \param redirHardwareTarget L2 target address for Icmpv6OptionRdirected
+     * @brief Send an ICMPv6 Redirection.
+     * @param redirectedPacket the redirected packet
+     * @param src IPv6 address to send the redirect from
+     * @param dst IPv6 address to send the redirect to
+     * @param redirTarget IPv6 target address for Icmpv6Redirection
+     * @param redirDestination IPv6 destination address for Icmpv6Redirection
+     * @param redirHardwareTarget L2 target address for Icmpv6OptionRdirected
      */
     void SendRedirection(Ptr<Packet> redirectedPacket,
                          Ipv6Address src,
@@ -260,12 +260,12 @@
                          Address redirHardwareTarget);
 
     /**
-     * \brief Forge a Neighbor Solicitation.
-     * \param src source IPv6 address
-     * \param dst destination IPv6 address
-     * \param target target IPv6 address
-     * \param hardwareAddress our mac address
-     * \return NS packet (with IPv6 header)
+     * @brief Forge a Neighbor Solicitation.
+     * @param src source IPv6 address
+     * @param dst destination IPv6 address
+     * @param target target IPv6 address
+     * @param hardwareAddress our mac address
+     * @return NS packet (with IPv6 header)
      */
     NdiscCache::Ipv6PayloadHeaderPair ForgeNS(Ipv6Address src,
                                               Ipv6Address dst,
@@ -273,12 +273,12 @@
                                               Address hardwareAddress);
 
     /**
-     * \brief Forge a Neighbor Advertisement.
-     * \param src source IPv6 address
-     * \param dst destination IPv6 address
-     * \param hardwareAddress our mac address
-     * \param flags flags (bitfield => R (4), S (2), O (1))
-     * \return NA packet (with IPv6 header)
+     * @brief Forge a Neighbor Advertisement.
+     * @param src source IPv6 address
+     * @param dst destination IPv6 address
+     * @param hardwareAddress our mac address
+     * @param flags flags (bitfield => R (4), S (2), O (1))
+     * @return NA packet (with IPv6 header)
      */
     NdiscCache::Ipv6PayloadHeaderPair ForgeNA(Ipv6Address src,
                                               Ipv6Address dst,
@@ -286,24 +286,24 @@
                                               uint8_t flags);
 
     /**
-     * \brief Forge a Router Solicitation.
-     * \param src source IPv6 address
-     * \param dst destination IPv6 address
-     * \param hardwareAddress our mac address
-     * \return RS packet (with IPv6 header)
+     * @brief Forge a Router Solicitation.
+     * @param src source IPv6 address
+     * @param dst destination IPv6 address
+     * @param hardwareAddress our mac address
+     * @return RS packet (with IPv6 header)
      */
     NdiscCache::Ipv6PayloadHeaderPair ForgeRS(Ipv6Address src,
                                               Ipv6Address dst,
                                               Address hardwareAddress);
 
     /**
-     * \brief Forge an Echo Request.
-     * \param src source address
-     * \param dst destination address
-     * \param id ID of the packet
-     * \param seq sequence number
-     * \param data the data
-     * \return Echo Request packet (with IPv6 header)
+     * @brief Forge an Echo Request.
+     * @param src source address
+     * @param dst destination address
+     * @param id ID of the packet
+     * @param seq sequence number
+     * @param data the data
+     * @return Echo Request packet (with IPv6 header)
      */
     NdiscCache::Ipv6PayloadHeaderPair ForgeEchoRequest(Ipv6Address src,
                                                        Ipv6Address dst,
@@ -312,44 +312,44 @@
                                                        Ptr<Packet> data);
 
     /**
-     * \brief Receive method.
-     * \param p the packet
-     * \param header the IPv4 header
-     * \param interface the interface from which the packet is coming
-     * \returns the receive status
+     * @brief Receive method.
+     * @param p the packet
+     * @param header the IPv4 header
+     * @param interface the interface from which the packet is coming
+     * @returns the receive status
      */
     IpL4Protocol::RxStatus Receive(Ptr<Packet> p,
                                    const Ipv4Header& header,
                                    Ptr<Ipv4Interface> interface) override;
 
     /**
-     * \brief Receive method.
-     * \param p the packet
-     * \param header the IPv6 header
-     * \param interface the interface from which the packet is coming
-     * \returns the receive status
+     * @brief Receive method.
+     * @param p the packet
+     * @param header the IPv6 header
+     * @param interface the interface from which the packet is coming
+     * @returns the receive status
      */
     IpL4Protocol::RxStatus Receive(Ptr<Packet> p,
                                    const Ipv6Header& header,
                                    Ptr<Ipv6Interface> interface) override;
 
     /**
-     * \brief Function called when DAD timeout.
-     * \param interface the interface
-     * \param addr the IPv6 address
+     * @brief Function called when DAD timeout.
+     * @param interface the interface
+     * @param addr the IPv6 address
      */
     virtual void FunctionDadTimeout(Ipv6Interface* interface, Ipv6Address addr);
 
     /**
-     * \brief Lookup in the ND cache for the IPv6 address
+     * @brief Lookup in the ND cache for the IPv6 address
      *
-     * \note Unlike other Lookup method, it does not send NS request!
+     * @note Unlike other Lookup method, it does not send NS request!
      *
-     * \param dst destination address
-     * \param device device
-     * \param cache the neighbor cache
-     * \param hardwareDestination hardware address
-     * \return true if the address is in the ND cache, the hardwareDestination is updated.
+     * @param dst destination address
+     * @param device device
+     * @param cache the neighbor cache
+     * @param hardwareDestination hardware address
+     * @return true if the address is in the ND cache, the hardwareDestination is updated.
      */
     virtual bool Lookup(Ipv6Address dst,
                         Ptr<NetDevice> device,
@@ -357,16 +357,16 @@
                         Address* hardwareDestination);
 
     /**
-     * \brief Lookup in the ND cache for the IPv6 address (similar as ARP protocol).
+     * @brief Lookup in the ND cache for the IPv6 address (similar as ARP protocol).
      *
      * It also send NS request to target and store the waiting packet.
-     * \param p the packet
-     * \param ipHeader IPv6 header
-     * \param dst destination address
-     * \param device device
-     * \param cache the neighbor cache
-     * \param hardwareDestination hardware address
-     * \return true if the address is in the ND cache, the hardwareDestination is updated.
+     * @param p the packet
+     * @param ipHeader IPv6 header
+     * @param dst destination address
+     * @param device device
+     * @param cache the neighbor cache
+     * @param hardwareDestination hardware address
+     * @return true if the address is in the ND cache, the hardwareDestination is updated.
      */
     virtual bool Lookup(Ptr<Packet> p,
                         const Ipv6Header& ipHeader,
@@ -376,24 +376,24 @@
                         Address* hardwareDestination);
 
     /**
-     * \brief Send a Router Solicitation.
-     * \param src link-local source address
-     * \param dst destination address (usually ff02::2 i.e., all-routers)
-     * \param hardwareAddress link-layer address (SHOULD be included if src is not ::)
+     * @brief Send a Router Solicitation.
+     * @param src link-local source address
+     * @param dst destination address (usually ff02::2 i.e., all-routers)
+     * @param hardwareAddress link-layer address (SHOULD be included if src is not ::)
      */
     void SendRS(Ipv6Address src, Ipv6Address dst, Address hardwareAddress);
 
     /**
-     * \brief Create a neighbor cache.
-     * \param device the NetDevice
-     * \param interface the IPv6 interface
-     * \return a smart pointer of NdCache or 0 if problem
+     * @brief Create a neighbor cache.
+     * @param device the NetDevice
+     * @param interface the IPv6 interface
+     * @return a smart pointer of NdCache or 0 if problem
      */
     virtual Ptr<NdiscCache> CreateCache(Ptr<NetDevice> device, Ptr<Ipv6Interface> interface);
 
     /**
-     * \brief Is the node must do DAD.
-     * \return true if node has to do DAD.
+     * @brief Is the node must do DAD.
+     * @return true if node has to do DAD.
      */
     bool IsAlwaysDad() const;
 
@@ -402,21 +402,21 @@
      * used by this model.  Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream);
 
     /**
      * Get the DAD timeout
-     * \return the DAD timeout
+     * @return the DAD timeout
      */
     Time GetDadTimeout() const;
 
     /**
      * Set DHCPv6 callback.
      * Invoked when an RA is received with the M flag set.
-     * \param cb the callback function
+     * @param cb the callback function
      */
     void SetDhcpv6Callback(Callback<void, uint32_t> cb)
     {
@@ -425,19 +425,19 @@
 
   protected:
     /**
-     * \brief Dispose this object.
+     * @brief Dispose this object.
      */
     void DoDispose() override;
 
     typedef std::list<Ptr<NdiscCache>> CacheList; //!< container of NdiscCaches
 
     /**
-     * \brief Notify an ICMPv6 reception to upper layers (if requested).
-     * \param source the ICMP source
-     * \param icmp the ICMP header
-     * \param info information about the ICMP
-     * \param ipHeader the IP header carried by the ICMP
-     * \param payload the data carried by the ICMP
+     * @brief Notify an ICMPv6 reception to upper layers (if requested).
+     * @param source the ICMP source
+     * @param icmp the ICMP header
+     * @param info information about the ICMP
+     * @param ipHeader the IP header carried by the ICMP
+     * @param payload the data carried by the ICMP
      */
     void Forward(Ipv6Address source,
                  Icmpv6Header icmp,
@@ -446,11 +446,11 @@
                  const uint8_t payload[8]);
 
     /**
-     * \brief Receive Neighbor Solicitation method.
-     * \param p the packet
-     * \param src source address
-     * \param dst destination address
-     * \param interface the interface from which the packet is coming
+     * @brief Receive Neighbor Solicitation method.
+     * @param p the packet
+     * @param src source address
+     * @param dst destination address
+     * @param interface the interface from which the packet is coming
      */
     void HandleNS(Ptr<Packet> p,
                   const Ipv6Address& src,
@@ -458,11 +458,11 @@
                   Ptr<Ipv6Interface> interface);
 
     /**
-     * \brief Receive Router Solicitation method.
-     * \param p the packet
-     * \param src source address
-     * \param dst destination address
-     * \param interface the interface from which the packet is coming
+     * @brief Receive Router Solicitation method.
+     * @param p the packet
+     * @param src source address
+     * @param dst destination address
+     * @param interface the interface from which the packet is coming
      */
     void HandleRS(Ptr<Packet> p,
                   const Ipv6Address& src,
@@ -470,19 +470,19 @@
                   Ptr<Ipv6Interface> interface);
 
     /**
-     * \brief Router Solicitation Timeout handler.
-     * \param src link-local source address
-     * \param dst destination address (usually ff02::2 i.e all-routers)
-     * \param hardwareAddress link-layer address (SHOULD be included if src is not ::)
+     * @brief Router Solicitation Timeout handler.
+     * @param src link-local source address
+     * @param dst destination address (usually ff02::2 i.e all-routers)
+     * @param hardwareAddress link-layer address (SHOULD be included if src is not ::)
      */
     virtual void HandleRsTimeout(Ipv6Address src, Ipv6Address dst, Address hardwareAddress);
 
     /**
-     * \brief Receive Router Advertisement method.
-     * \param p the packet
-     * \param src source address
-     * \param dst destination address
-     * \param interface the interface from which the packet is coming
+     * @brief Receive Router Advertisement method.
+     * @param p the packet
+     * @param src source address
+     * @param dst destination address
+     * @param interface the interface from which the packet is coming
      */
     void HandleRA(Ptr<Packet> p,
                   const Ipv6Address& src,
@@ -490,11 +490,11 @@
                   Ptr<Ipv6Interface> interface);
 
     /**
-     * \brief Receive Echo Request method.
-     * \param p the packet
-     * \param src source address
-     * \param dst destination address
-     * \param interface the interface from which the packet is coming
+     * @brief Receive Echo Request method.
+     * @param p the packet
+     * @param src source address
+     * @param dst destination address
+     * @param interface the interface from which the packet is coming
      */
     void HandleEchoRequest(Ptr<Packet> p,
                            const Ipv6Address& src,
@@ -502,11 +502,11 @@
                            Ptr<Ipv6Interface> interface);
 
     /**
-     * \brief Receive Neighbor Advertisement method.
-     * \param p the packet
-     * \param src source address
-     * \param dst destination address
-     * \param interface the interface from which the packet is coming
+     * @brief Receive Neighbor Advertisement method.
+     * @param p the packet
+     * @param src source address
+     * @param dst destination address
+     * @param interface the interface from which the packet is coming
      */
     void HandleNA(Ptr<Packet> p,
                   const Ipv6Address& src,
@@ -514,11 +514,11 @@
                   Ptr<Ipv6Interface> interface);
 
     /**
-     * \brief Receive Redirection method.
-     * \param p the packet
-     * \param src source address
-     * \param dst destination address
-     * \param interface the interface from which the packet is coming
+     * @brief Receive Redirection method.
+     * @param p the packet
+     * @param src source address
+     * @param dst destination address
+     * @param interface the interface from which the packet is coming
      */
     void HandleRedirection(Ptr<Packet> p,
                            const Ipv6Address& src,
@@ -526,11 +526,11 @@
                            Ptr<Ipv6Interface> interface);
 
     /**
-     * \brief Receive Destination Unreachable method.
-     * \param p the packet
-     * \param src source address
-     * \param dst destination address
-     * \param interface the interface from which the packet is coming
+     * @brief Receive Destination Unreachable method.
+     * @param p the packet
+     * @param src source address
+     * @param dst destination address
+     * @param interface the interface from which the packet is coming
      */
     void HandleDestinationUnreachable(Ptr<Packet> p,
                                       const Ipv6Address& src,
@@ -538,11 +538,11 @@
                                       Ptr<Ipv6Interface> interface);
 
     /**
-     * \brief Receive Time Exceeded method.
-     * \param p the packet
-     * \param src source address
-     * \param dst destination address
-     * \param interface the interface from which the packet is coming
+     * @brief Receive Time Exceeded method.
+     * @param p the packet
+     * @param src source address
+     * @param dst destination address
+     * @param interface the interface from which the packet is coming
      */
     void HandleTimeExceeded(Ptr<Packet> p,
                             const Ipv6Address& src,
@@ -550,11 +550,11 @@
                             Ptr<Ipv6Interface> interface);
 
     /**
-     * \brief Receive Packet Too Big method.
-     * \param p the packet
-     * \param src source address
-     * \param dst destination address
-     * \param interface the interface from which the packet is coming
+     * @brief Receive Packet Too Big method.
+     * @param p the packet
+     * @param src source address
+     * @param dst destination address
+     * @param interface the interface from which the packet is coming
      */
     void HandlePacketTooBig(Ptr<Packet> p,
                             const Ipv6Address& src,
@@ -562,11 +562,11 @@
                             Ptr<Ipv6Interface> interface);
 
     /**
-     * \brief Receive Parameter Error method.
-     * \param p the packet
-     * \param src source address
-     * \param dst destination address
-     * \param interface the interface from which the packet is coming
+     * @brief Receive Parameter Error method.
+     * @param p the packet
+     * @param src source address
+     * @param dst destination address
+     * @param interface the interface from which the packet is coming
      */
     void HandleParameterError(Ptr<Packet> p,
                               const Ipv6Address& src,
@@ -574,11 +574,11 @@
                               Ptr<Ipv6Interface> interface);
 
     /**
-     * \brief Link layer address option processing.
-     * \param lla LLA option
-     * \param src source address
-     * \param dst destination address
-     * \param interface the interface from which the packet is coming
+     * @brief Link layer address option processing.
+     * @param lla LLA option
+     * @param src source address
+     * @param dst destination address
+     * @param interface the interface from which the packet is coming
      */
     void ReceiveLLA(Icmpv6OptionLinkLayerAddress lla,
                     const Ipv6Address& src,
@@ -586,9 +586,9 @@
                     Ptr<Ipv6Interface> interface);
 
     /**
-     * \brief Get the cache corresponding to the device.
-     * \param device the device
-     * \returns the NdiscCache associated with the device
+     * @brief Get the cache corresponding to the device.
+     * @param device the device
+     * @returns the NdiscCache associated with the device
      */
     Ptr<NdiscCache> FindCache(Ptr<NetDevice> device);
 
@@ -600,94 +600,94 @@
     IpL4Protocol::DownTargetCallback6 GetDownTarget6() const override;
 
     /**
-     * \brief Always do DAD ?
+     * @brief Always do DAD ?
      */
     bool m_alwaysDad;
 
     /**
-     * \brief A list of cache by device.
+     * @brief A list of cache by device.
      */
     CacheList m_cacheList;
 
     /**
-     * \brief Neighbor Discovery node constants: max multicast solicitations.
+     * @brief Neighbor Discovery node constants: max multicast solicitations.
      */
     uint8_t m_maxMulticastSolicit;
 
     /**
-     * \brief Neighbor Discovery node constants: max unicast solicitations.
+     * @brief Neighbor Discovery node constants: max unicast solicitations.
      */
     uint8_t m_maxUnicastSolicit;
 
     /**
-     * \brief Initial multicast RS retransmission time [\RFC{7559}].
+     * @brief Initial multicast RS retransmission time [\RFC{7559}].
      */
     Time m_rsInitialRetransmissionTime;
 
     /**
-     * \brief Maximum time between multicast RS retransmissions [\RFC{7559}]. Zero means unbound.
+     * @brief Maximum time between multicast RS retransmissions [\RFC{7559}]. Zero means unbound.
      */
     Time m_rsMaxRetransmissionTime;
 
     /**
-     * \brief Maximum number of multicast RS retransmissions [\RFC{7559}]. Zero means unbound.
+     * @brief Maximum number of multicast RS retransmissions [\RFC{7559}]. Zero means unbound.
      */
     uint32_t m_rsMaxRetransmissionCount;
 
     /**
-     * \brief Maximum duration of multicast RS retransmissions [\RFC{7559}]. Zero means unbound.
+     * @brief Maximum duration of multicast RS retransmissions [\RFC{7559}]. Zero means unbound.
      */
     Time m_rsMaxRetransmissionDuration;
 
     /**
-     * \brief Multicast RS retransmissions counter [\RFC{7559}].
+     * @brief Multicast RS retransmissions counter [\RFC{7559}].
      *
      * Zero indicate a first transmission, greater than zero means retransmissions.
      */
     uint32_t m_rsRetransmissionCount{0};
 
     /**
-     * \brief Previous multicast RS retransmissions timeout [\RFC{7559}].
+     * @brief Previous multicast RS retransmissions timeout [\RFC{7559}].
      */
     Time m_rsPrevRetransmissionTimeout;
 
     /**
-     * \brief First multicast RS transmissions [\RFC{7559}].
+     * @brief First multicast RS transmissions [\RFC{7559}].
      */
     Time m_rsFirstTransmissionTime;
 
     /**
-     * \brief Neighbor Discovery node constants: reachable time.
+     * @brief Neighbor Discovery node constants: reachable time.
      */
     Time m_reachableTime;
 
     /**
-     * \brief Neighbor Discovery node constants: retransmission timer.
+     * @brief Neighbor Discovery node constants: retransmission timer.
      */
     Time m_retransmissionTime;
 
     /**
-     * \brief Neighbor Discovery node constants: delay for the first probe.
+     * @brief Neighbor Discovery node constants: delay for the first probe.
      */
     Time m_delayFirstProbe;
 
     /**
-     * \brief The node.
+     * @brief The node.
      */
     Ptr<Node> m_node;
 
     /**
-     * \brief Random jitter before sending solicitations
+     * @brief Random jitter before sending solicitations
      */
     Ptr<RandomVariableStream> m_solicitationJitter;
 
     /**
-     * \brief Random jitter for RS retransmissions
+     * @brief Random jitter for RS retransmissions
      */
     Ptr<UniformRandomVariable> m_rsRetransmissionJitter;
 
     /**
-     * \brief DAD timeout
+     * @brief DAD timeout
      */
     Time m_dadTimeout;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ip-l4-protocol.h ns-3.44/src/internet/model/ip-l4-protocol.h
--- ns-3.43/src/internet/model/ip-l4-protocol.h	2024-10-09 16:41:09.884656000 -0700
+++ ns-3.44/src/internet/model/ip-l4-protocol.h	2025-03-09 16:55:49.391371000 -0700
@@ -30,9 +30,9 @@
 class Ipv6Route;
 
 /**
- * \ingroup internet
+ * @ingroup internet
  *
- * \brief L4 Protocol abstract base class.
+ * @brief L4 Protocol abstract base class.
  *
  * This is an abstract base class for layer four protocols which use IP as
  * the network layer.
@@ -41,7 +41,7 @@
 {
   public:
     /**
-     * \brief Rx status codes.
+     * @brief Rx status codes.
      */
     enum RxStatus
     {
@@ -52,54 +52,54 @@
     };
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     ~IpL4Protocol() override;
 
     /**
-     * \brief Returns the protocol number of this protocol.
-     * \returns the protocol number.
+     * @brief Returns the protocol number of this protocol.
+     * @returns the protocol number.
      */
     virtual int GetProtocolNumber() const = 0;
 
     /**
-     * \brief Called from lower-level layers to send the packet up in the stack.
-     * \param p packet to forward up
-     * \param header IPv4 Header information
-     * \param incomingInterface the Ipv4Interface on which the packet arrived
-     * \returns Rx status code
+     * @brief Called from lower-level layers to send the packet up in the stack.
+     * @param p packet to forward up
+     * @param header IPv4 Header information
+     * @param incomingInterface the Ipv4Interface on which the packet arrived
+     * @returns Rx status code
      */
     virtual RxStatus Receive(Ptr<Packet> p,
                              const Ipv4Header& header,
                              Ptr<Ipv4Interface> incomingInterface) = 0;
 
     /**
-     * \brief Called from lower-level layers to send the packet up in the stack.
-     * \param p packet to forward up
-     * \param header IPv6 Header information
-     * \param incomingInterface the Ipv6Interface on which the packet arrived
-     * \returns Rx status code
+     * @brief Called from lower-level layers to send the packet up in the stack.
+     * @param p packet to forward up
+     * @param header IPv6 Header information
+     * @param incomingInterface the Ipv6Interface on which the packet arrived
+     * @returns Rx status code
      */
     virtual RxStatus Receive(Ptr<Packet> p,
                              const Ipv6Header& header,
                              Ptr<Ipv6Interface> incomingInterface) = 0;
 
     /**
-     * \brief Called from lower-level layers to send the ICMP packet up in the stack.
-     * \param icmpSource the source address of the icmp message
-     * \param icmpTtl the ttl of the icmp message
-     * \param icmpType the 'type' field of the icmp message
-     * \param icmpCode the 'code' field of the icmp message
-     * \param icmpInfo extra information dependent on the icmp message
+     * @brief Called from lower-level layers to send the ICMP packet up in the stack.
+     * @param icmpSource the source address of the icmp message
+     * @param icmpTtl the ttl of the icmp message
+     * @param icmpType the 'type' field of the icmp message
+     * @param icmpCode the 'code' field of the icmp message
+     * @param icmpInfo extra information dependent on the icmp message
      *        generated by Icmpv4L4Protocol
-     * \param payloadSource the source address of the packet which triggered
+     * @param payloadSource the source address of the packet which triggered
      *        the icmp message
-     * \param payloadDestination the destination address of the packet which
+     * @param payloadDestination the destination address of the packet which
      *        triggered the icmp message.
-     * \param payload the first 8 bytes of the packet payload
+     * @param payload the first 8 bytes of the packet payload
      *        which triggered the icmp message.
      */
     virtual void ReceiveIcmp(Ipv4Address icmpSource,
@@ -112,18 +112,18 @@
                              const uint8_t payload[8]);
 
     /**
-     * \brief Called from lower-level layers to send the ICMPv6 packet up in the stack.
-     * \param icmpSource the source address of the icmp message
-     * \param icmpTtl the ttl of the icmp message
-     * \param icmpType the 'type' field of the icmp message
-     * \param icmpCode the 'code' field of the icmp message
-     * \param icmpInfo extra information dependent on the icmp message
+     * @brief Called from lower-level layers to send the ICMPv6 packet up in the stack.
+     * @param icmpSource the source address of the icmp message
+     * @param icmpTtl the ttl of the icmp message
+     * @param icmpType the 'type' field of the icmp message
+     * @param icmpCode the 'code' field of the icmp message
+     * @param icmpInfo extra information dependent on the icmp message
      *        generated by Icmpv6L4Protocol
-     * \param payloadSource the source address of the packet which triggered
+     * @param payloadSource the source address of the packet which triggered
      *        the icmp message
-     * \param payloadDestination the destination address of the packet which
+     * @param payloadDestination the destination address of the packet which
      *        triggered the icmp message.
-     * \param payload the first 8 bytes of the packet payload
+     * @param payload the first 8 bytes of the packet payload
      *        which triggered the icmp message.
      */
     virtual void ReceiveIcmp(Ipv6Address icmpSource,
@@ -136,12 +136,12 @@
                              const uint8_t payload[8]);
 
     /**
-     * \brief callback to send packets over IPv4
+     * @brief callback to send packets over IPv4
      */
     typedef Callback<void, Ptr<Packet>, Ipv4Address, Ipv4Address, uint8_t, Ptr<Ipv4Route>>
         DownTargetCallback;
     /**
-     * \brief callback to send packets over IPv6
+     * @brief callback to send packets over IPv6
      */
     typedef Callback<void, Ptr<Packet>, Ipv6Address, Ipv6Address, uint8_t, Ptr<Ipv6Route>>
         DownTargetCallback6;
@@ -150,7 +150,7 @@
      * This method allows a caller to set the current down target callback
      * set for this L4 protocol (IPv4 case)
      *
-     * \param cb current Callback for the L4 protocol
+     * @param cb current Callback for the L4 protocol
      */
     virtual void SetDownTarget(DownTargetCallback cb) = 0;
 
@@ -158,7 +158,7 @@
      * This method allows a caller to set the current down target callback
      * set for this L4 protocol (IPv6 case)
      *
-     * \param cb current Callback for the L4 protocol
+     * @param cb current Callback for the L4 protocol
      */
     virtual void SetDownTarget6(DownTargetCallback6 cb) = 0;
 
@@ -166,7 +166,7 @@
      * This method allows a caller to get the current down target callback
      * set for this L4 protocol (IPv4 case)
      *
-     * \return current Callback for the L4 protocol
+     * @return current Callback for the L4 protocol
      */
     virtual DownTargetCallback GetDownTarget() const = 0;
 
@@ -174,7 +174,7 @@
      * This method allows a caller to get the current down target callback
      * set for this L4 protocol (IPv6 case)
      *
-     * \return current Callback for the L4 protocol
+     * @return current Callback for the L4 protocol
      */
     virtual DownTargetCallback6 GetDownTarget6() const = 0;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv4-address-generator.cc ns-3.44/src/internet/model/ipv4-address-generator.cc
--- ns-3.43/src/internet/model/ipv4-address-generator.cc	2024-10-09 16:41:09.884656000 -0700
+++ ns-3.44/src/internet/model/ipv4-address-generator.cc	2025-03-09 16:55:49.391371000 -0700
@@ -19,9 +19,9 @@
 NS_LOG_COMPONENT_DEFINE("Ipv4AddressGenerator");
 
 /**
- * \ingroup address
+ * @ingroup address
  *
- * \brief Implementation class of Ipv4AddressGenerator
+ * @brief Implementation class of Ipv4AddressGenerator
  * This generator assigns addresses sequentially from a provided
  * network address; used in topology code. It also keeps track of all
  * addresses assigned to perform duplicate detection.
@@ -33,30 +33,30 @@
     virtual ~Ipv4AddressGeneratorImpl();
 
     /**
-     * \brief Initialise the base network, mask and address for the generator
+     * @brief Initialise the base network, mask and address for the generator
      *
      * The first call to NextAddress() or GetAddress() will return the
      * value passed in.
      *
-     * \param net The network for the base Ipv4Address
-     * \param mask The network mask of the base Ipv4Address
-     * \param addr The base address used for initialization
+     * @param net The network for the base Ipv4Address
+     * @param mask The network mask of the base Ipv4Address
+     * @param addr The base address used for initialization
      */
     void Init(const Ipv4Address net, const Ipv4Mask mask, const Ipv4Address addr);
 
     /**
-     * \brief Get the current network of the given Ipv4Mask
+     * @brief Get the current network of the given Ipv4Mask
      *
      * Does not change the internal state; this just peeks at the current
      * network
      *
-     * \param mask The Ipv4Mask for the current network
-     * \returns the IPv4 address of the current network
+     * @param mask The Ipv4Mask for the current network
+     * @returns the IPv4 address of the current network
      */
     Ipv4Address GetNetwork(const Ipv4Mask mask) const;
 
     /**
-     * \brief Get the next network according to the given Ipv4Mask
+     * @brief Get the next network according to the given Ipv4Mask
      *
      * This operation is a pre-increment, meaning that the internal state
      * is changed before returning the new network address.
@@ -64,77 +64,77 @@
      * This also resets the address to the base address that was
      * used for initialization.
      *
-     * \param mask The Ipv4Mask used to set the next network
-     * \returns the IPv4 address of the next network
+     * @param mask The Ipv4Mask used to set the next network
+     * @returns the IPv4 address of the next network
      */
     Ipv4Address NextNetwork(const Ipv4Mask mask);
 
     /**
-     * \brief Set the address for the given mask
+     * @brief Set the address for the given mask
      *
-     * \param addr The address to set for the current mask
-     * \param mask The Ipv4Mask whose address is to be set
+     * @param addr The address to set for the current mask
+     * @param mask The Ipv4Mask whose address is to be set
      */
     void InitAddress(const Ipv4Address addr, const Ipv4Mask mask);
 
     /**
-     * \brief Allocate the next Ipv4Address for the configured network and mask
+     * @brief Allocate the next Ipv4Address for the configured network and mask
      *
      * This operation is a post-increment, meaning that the first address
      * allocated will be the one that was initially configured.
      *
-     * \param mask The Ipv4Mask for the current network
-     * \returns the IPv4 address
+     * @param mask The Ipv4Mask for the current network
+     * @returns the IPv4 address
      */
     Ipv4Address NextAddress(const Ipv4Mask mask);
 
     /**
-     * \brief Get the Ipv4Address that will be allocated upon NextAddress ()
+     * @brief Get the Ipv4Address that will be allocated upon NextAddress ()
      *
      * Does not change the internal state; just is used to peek the next
      * address that will be allocated upon NextAddress ()
      *
-     * \param mask The Ipv4Mask for the current network
-     * \returns the IPv4 address
+     * @param mask The Ipv4Mask for the current network
+     * @returns the IPv4 address
      */
     Ipv4Address GetAddress(const Ipv4Mask mask) const;
 
     /**
-     * \brief Reset the networks and Ipv4Address to zero
+     * @brief Reset the networks and Ipv4Address to zero
      */
     void Reset();
 
     /**
-     * \brief Add the Ipv4Address to the list of IPv4 entries
+     * @brief Add the Ipv4Address to the list of IPv4 entries
      *
      * Typically, this is used by external address allocators that want
      * to make use of this class's ability to track duplicates.  AddAllocated
      * is always called internally for any address generated by NextAddress ()
      *
-     * \param addr The Ipv4Address to be added to the list of Ipv4 entries
-     * \returns true on success
+     * @param addr The Ipv4Address to be added to the list of Ipv4 entries
+     * @returns true on success
      */
     bool AddAllocated(const Ipv4Address addr);
 
     /**
-     * \brief Check the Ipv4Address allocation in the list of IPv4 entries
+     * @brief Check the Ipv4Address allocation in the list of IPv4 entries
      *
-     * \param addr The Ipv4Address to be checked in the list of Ipv4 entries
-     * \returns true if the address is already allocated
+     * @param addr The Ipv4Address to be checked in the list of Ipv4 entries
+     * @returns true if the address is already allocated
      */
     bool IsAddressAllocated(const Ipv4Address addr);
 
     /**
-     * \brief Check if a network has already allocated addresses
+     * @brief Check if a network has already allocated addresses
      *
-     * \param addr The Ipv4 network to be checked
-     * \param mask The Ipv4 network mask
-     * \returns true if the network is already allocated
+     * @param addr The Ipv4 network to be checked
+     * @param mask The Ipv4 network mask
+     * @returns true if the network is already allocated
      */
     bool IsNetworkAllocated(const Ipv4Address addr, const Ipv4Mask mask);
 
     /**
-     * \brief Used to turn off fatal errors and assertions, for testing
+     * @brief Used to turn off fatal errors and assertions, for testing
      */
     void TestMode();
 
@@ -143,14 +143,14 @@
     static const uint32_t MOST_SIGNIFICANT_BIT = 0x80000000; //!< MSB set to 1
 
     /**
-     * \brief Create an index number for the network mask
-     * \param mask the mask to index
-     * \returns an index
+     * @brief Create an index number for the network mask
+     * @param mask the mask to index
+     * @returns an index
      */
     uint32_t MaskToIndex(Ipv4Mask mask) const;
 
     /**
-     * \brief This class holds the state for a given network
+     * @brief This class holds the state for a given network
      */
     class NetworkState
     {
@@ -165,7 +165,7 @@
     NetworkState m_netTable[N_BITS]; //!< the available networks
 
     /**
-     * \brief This class holds the allocated addresses
+     * @brief This class holds the allocated addresses
      */
     class Entry
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv4-address-generator.h ns-3.44/src/internet/model/ipv4-address-generator.h
--- ns-3.43/src/internet/model/ipv4-address-generator.h	2024-10-09 16:41:09.884656000 -0700
+++ ns-3.44/src/internet/model/ipv4-address-generator.h	2025-03-09 16:55:49.391371000 -0700
@@ -13,13 +13,13 @@
 {
 
 /**
- * \ingroup address
- * \ingroup ipv4
+ * @ingroup address
+ * @ingroup ipv4
  *
- * \brief This generator assigns addresses sequentially from a provided
+ * @brief This generator assigns addresses sequentially from a provided
  * network address; used in topology code.
  *
- * \note BEWARE: this class acts as a Singleton.
+ * @note BEWARE: this class acts as a Singleton.
  * In other terms, two different instances of Ipv4AddressGenerator will
  * pick IPv4 numbers from the same pool. Changing the network in one of them
  * will also change the network in the other instances.
@@ -29,21 +29,21 @@
 {
   public:
     /**
-     * \brief Initialise the base network, mask and address for the generator
+     * @brief Initialise the base network, mask and address for the generator
      *
      * The first call to NextAddress() or GetAddress() will return the
      * value passed in.
      *
-     * \param net The network for the base Ipv4Address
-     * \param mask The network mask of the base Ipv4Address
-     * \param addr The base address used for initialization
+     * @param net The network for the base Ipv4Address
+     * @param mask The network mask of the base Ipv4Address
+     * @param addr The base address used for initialization
      */
     static void Init(const Ipv4Address net,
                      const Ipv4Mask mask,
                      const Ipv4Address addr = "0.0.0.1");
 
     /**
-     * \brief Get the next network according to the given Ipv4Mask
+     * @brief Get the next network according to the given Ipv4Mask
      *
      * This operation is a pre-increment, meaning that the internal state
      * is changed before returning the new network address.
@@ -51,88 +51,88 @@
      * This also resets the address to the base address that was
      * used for initialization.
      *
-     * \param mask The Ipv4Mask used to set the next network
-     * \returns the IPv4 address of the next network
+     * @param mask The Ipv4Mask used to set the next network
+     * @returns the IPv4 address of the next network
      */
     static Ipv4Address NextNetwork(const Ipv4Mask mask);
 
     /**
-     * \brief Get the current network of the given Ipv4Mask
+     * @brief Get the current network of the given Ipv4Mask
      *
      * Does not change the internal state; this just peeks at the current
      * network
      *
-     * \param mask The Ipv4Mask for the current network
-     * \returns the IPv4 address of the current network
+     * @param mask The Ipv4Mask for the current network
+     * @returns the IPv4 address of the current network
      */
     static Ipv4Address GetNetwork(const Ipv4Mask mask);
 
     /**
-     * \brief Set the address for the given mask
+     * @brief Set the address for the given mask
      *
-     * \param addr The address to set for the current mask
-     * \param mask The Ipv4Mask whose address is to be set
+     * @param addr The address to set for the current mask
+     * @param mask The Ipv4Mask whose address is to be set
      */
     static void InitAddress(const Ipv4Address addr, const Ipv4Mask mask);
 
     /**
-     * \brief Allocate the next Ipv4Address for the configured network and mask
+     * @brief Allocate the next Ipv4Address for the configured network and mask
      *
      * This operation is a post-increment, meaning that the first address
      * allocated will be the one that was initially configured.
      *
-     * \param mask The Ipv4Mask for the current network
-     * \returns the IPv4 address
+     * @param mask The Ipv4Mask for the current network
+     * @returns the IPv4 address
      */
     static Ipv4Address NextAddress(const Ipv4Mask mask);
 
     /**
-     * \brief Get the Ipv4Address that will be allocated upon NextAddress ()
+     * @brief Get the Ipv4Address that will be allocated upon NextAddress ()
      *
      * Does not change the internal state; just is used to peek the next
      * address that will be allocated upon NextAddress ()
      *
-     * \param mask The Ipv4Mask for the current network
-     * \returns the IPv4 address
+     * @param mask The Ipv4Mask for the current network
+     * @returns the IPv4 address
      */
     static Ipv4Address GetAddress(const Ipv4Mask mask);
 
     /**
-     * \brief Reset the networks and Ipv4Address to zero
+     * @brief Reset the networks and Ipv4Address to zero
      */
     static void Reset();
 
     /**
-     * \brief Add the Ipv4Address to the list of IPv4 entries
+     * @brief Add the Ipv4Address to the list of IPv4 entries
      *
      * Typically, this is used by external address allocators that want
      * to make use of this class's ability to track duplicates.  AddAllocated
      * is always called internally for any address generated by NextAddress ()
      *
-     * \param addr The Ipv4Address to be added to the list of Ipv4 entries
-     * \returns true on success
+     * @param addr The Ipv4Address to be added to the list of Ipv4 entries
+     * @returns true on success
      */
     static bool AddAllocated(const Ipv4Address addr);
 
     /**
-     * \brief Check the Ipv4Address allocation in the list of IPv4 entries
+     * @brief Check the Ipv4Address allocation in the list of IPv4 entries
      *
-     * \param addr The Ipv4Address to be checked in the list of Ipv4 entries
-     * \returns true if the network is already allocated
+     * @param addr The Ipv4Address to be checked in the list of Ipv4 entries
+     * @returns true if the network is already allocated
      */
     static bool IsAddressAllocated(const Ipv4Address addr);
 
     /**
-     * \brief Check if a network has already allocated addresses
+     * @brief Check if a network has already allocated addresses
      *
-     * \param addr The Ipv4 network to be checked
-     * \param mask The Ipv4 network mask
-     * \returns true if the network is already allocated
+     * @param addr The Ipv4 network to be checked
+     * @param mask The Ipv4 network mask
+     * @returns true if the network is already allocated
      */
     static bool IsNetworkAllocated(const Ipv4Address addr, const Ipv4Mask mask);
 
     /**
-     * \brief Used to turn off fatal errors and assertions, for testing
+     * @brief Used to turn off fatal errors and assertions, for testing
      */
     static void TestMode();
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv4.cc ns-3.44/src/internet/model/ipv4.cc
--- ns-3.43/src/internet/model/ipv4.cc	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/ipv4.cc	2025-03-09 16:55:49.399371100 -0700
@@ -41,7 +41,7 @@
                           BooleanValue(true),
                           MakeBooleanAccessor(&Ipv4::SetWeakEsModel, &Ipv4::GetWeakEsModel),
                           MakeBooleanChecker(),
-                          TypeId::DEPRECATED,
+                          TypeId::SupportLevel::DEPRECATED,
                           "DEPRECATED since ns-3.41. Use the StrongEndSystemModel attribute.")
             .AddAttribute(
                 "StrongEndSystemModel",
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv4-end-point-demux.h ns-3.44/src/internet/model/ipv4-end-point-demux.h
--- ns-3.43/src/internet/model/ipv4-end-point-demux.h	2024-10-09 16:41:09.884656000 -0700
+++ ns-3.44/src/internet/model/ipv4-end-point-demux.h	2025-03-09 16:55:49.391371000 -0700
@@ -22,9 +22,9 @@
 class Ipv4EndPoint;
 
 /**
- * \ingroup ipv4
+ * @ingroup ipv4
  *
- * \brief Demultiplexes packets to various transport layer endpoints
+ * @brief Demultiplexes packets to various transport layer endpoints
  *
  * This class serves as a lookup table to match partial or full information
  * about a four-tuple to an ns3::Ipv4EndPoint.  It internally contains a list
@@ -37,12 +37,12 @@
 {
   public:
     /**
-     * \brief Container of the IPv4 endpoints.
+     * @brief Container of the IPv4 endpoints.
      */
     typedef std::list<Ipv4EndPoint*> EndPoints;
 
     /**
-     * \brief Iterator to the container of the IPv4 endpoints.
+     * @brief Iterator to the container of the IPv4 endpoints.
      */
     typedef std::list<Ipv4EndPoint*>::iterator EndPointsI;
 
@@ -50,29 +50,29 @@
     ~Ipv4EndPointDemux();
 
     /**
-     * \brief Get the entire list of end points registered.
-     * \return list of Ipv4EndPoint
+     * @brief Get the entire list of end points registered.
+     * @return list of Ipv4EndPoint
      */
     EndPoints GetAllEndPoints();
 
     /**
-     * \brief Lookup for port local.
-     * \param port port to test
-     * \return true if a port local is in EndPoints, false otherwise
+     * @brief Lookup for port local.
+     * @param port port to test
+     * @return true if a port local is in EndPoints, false otherwise
      */
     bool LookupPortLocal(uint16_t port);
 
     /**
-     * \brief Lookup for address and port.
-     * \param boundNetDevice Bound NetDevice (if any)
-     * \param addr address to test
-     * \param port port to test
-     * \return true if there is a match in EndPoints, false otherwise
+     * @brief Lookup for address and port.
+     * @param boundNetDevice Bound NetDevice (if any)
+     * @param addr address to test
+     * @param port port to test
+     * @return true if there is a match in EndPoints, false otherwise
      */
     bool LookupLocal(Ptr<NetDevice> boundNetDevice, Ipv4Address addr, uint16_t port);
 
     /**
-     * \brief lookup for a match with all the parameters.
+     * @brief lookup for a match with all the parameters.
      *
      * The function will return a list of most-matching EndPoints, in this order:
      *   -# Full match
@@ -82,12 +82,12 @@
      *
      * EndPoint with disabled Rx are skipped.
      *
-     * \param daddr destination address to test
-     * \param dport destination port to test
-     * \param saddr source address to test
-     * \param sport source port to test
-     * \param incomingInterface the incoming interface
-     * \return list of IPv4EndPoints (could be 0 element)
+     * @param daddr destination address to test
+     * @param dport destination port to test
+     * @param saddr source address to test
+     * @param sport source port to test
+     * @param incomingInterface the incoming interface
+     * @return list of IPv4EndPoints (could be 0 element)
      */
     EndPoints Lookup(Ipv4Address daddr,
                      uint16_t dport,
@@ -96,12 +96,12 @@
                      Ptr<Ipv4Interface> incomingInterface);
 
     /**
-     * \brief simple lookup for a match with all the parameters.
-     * \param daddr destination address to test
-     * \param dport destination port to test
-     * \param saddr source address to test
-     * \param sport source port to test
-     * \return IPv4EndPoint (0 if not found)
+     * @brief simple lookup for a match with all the parameters.
+     * @param daddr destination address to test
+     * @param dport destination port to test
+     * @param saddr source address to test
+     * @param sport source port to test
+     * @return IPv4EndPoint (0 if not found)
      */
     Ipv4EndPoint* SimpleLookup(Ipv4Address daddr,
                                uint16_t dport,
@@ -109,43 +109,43 @@
                                uint16_t sport);
 
     /**
-     * \brief Allocate a Ipv4EndPoint.
-     * \return an empty Ipv4EndPoint instance
+     * @brief Allocate a Ipv4EndPoint.
+     * @return an empty Ipv4EndPoint instance
      */
     Ipv4EndPoint* Allocate();
 
     /**
-     * \brief Allocate a Ipv4EndPoint.
-     * \param address IPv4 address
-     * \return an Ipv4EndPoint instance
+     * @brief Allocate a Ipv4EndPoint.
+     * @param address IPv4 address
+     * @return an Ipv4EndPoint instance
      */
     Ipv4EndPoint* Allocate(Ipv4Address address);
 
     /**
-     * \brief Allocate a Ipv4EndPoint.
-     * \param boundNetDevice Bound NetDevice (if any)
-     * \param port local port
-     * \return an Ipv4EndPoint instance
+     * @brief Allocate a Ipv4EndPoint.
+     * @param boundNetDevice Bound NetDevice (if any)
+     * @param port local port
+     * @return an Ipv4EndPoint instance
      */
     Ipv4EndPoint* Allocate(Ptr<NetDevice> boundNetDevice, uint16_t port);
 
     /**
-     * \brief Allocate a Ipv4EndPoint.
-     * \param boundNetDevice Bound NetDevice (if any)
-     * \param address local address
-     * \param port local port
-     * \return an Ipv4EndPoint instance
+     * @brief Allocate a Ipv4EndPoint.
+     * @param boundNetDevice Bound NetDevice (if any)
+     * @param address local address
+     * @param port local port
+     * @return an Ipv4EndPoint instance
      */
     Ipv4EndPoint* Allocate(Ptr<NetDevice> boundNetDevice, Ipv4Address address, uint16_t port);
 
     /**
-     * \brief Allocate a Ipv4EndPoint.
-     * \param boundNetDevice Bound NetDevice (if any)
-     * \param localAddress local address
-     * \param localPort local port
-     * \param peerAddress peer address
-     * \param peerPort peer port
-     * \return an Ipv4EndPoint instance
+     * @brief Allocate a Ipv4EndPoint.
+     * @param boundNetDevice Bound NetDevice (if any)
+     * @param localAddress local address
+     * @param localPort local port
+     * @param peerAddress peer address
+     * @param peerPort peer port
+     * @return an Ipv4EndPoint instance
      */
     Ipv4EndPoint* Allocate(Ptr<NetDevice> boundNetDevice,
                            Ipv4Address localAddress,
@@ -154,35 +154,35 @@
                            uint16_t peerPort);
 
     /**
-     * \brief Remove a end point.
-     * \param endPoint the end point to remove
+     * @brief Remove a end point.
+     * @param endPoint the end point to remove
      */
     void DeAllocate(Ipv4EndPoint* endPoint);
 
   private:
     /**
-     * \brief Allocate an ephemeral port.
-     * \returns the ephemeral port
+     * @brief Allocate an ephemeral port.
+     * @returns the ephemeral port
      */
     uint16_t AllocateEphemeralPort();
 
     /**
-     * \brief The ephemeral port.
+     * @brief The ephemeral port.
      */
     uint16_t m_ephemeral;
 
     /**
-     * \brief The last ephemeral port.
+     * @brief The last ephemeral port.
      */
     uint16_t m_portLast;
 
     /**
-     * \brief The first ephemeral port.
+     * @brief The first ephemeral port.
      */
     uint16_t m_portFirst;
 
     /**
-     * \brief A list of IPv4 end points.
+     * @brief A list of IPv4 end points.
      */
     EndPoints m_endPoints;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv4-end-point.h ns-3.44/src/internet/model/ipv4-end-point.h
--- ns-3.43/src/internet/model/ipv4-end-point.h	2024-10-09 16:41:09.884656000 -0700
+++ ns-3.44/src/internet/model/ipv4-end-point.h	2025-03-09 16:55:49.395371200 -0700
@@ -25,9 +25,9 @@
 class Packet;
 
 /**
- * \ingroup ipv4
+ * @ingroup ipv4
  *
- * \brief A representation of an internet endpoint/connection
+ * @brief A representation of an internet endpoint/connection
  *
  * This class provides an internet four-tuple (source and destination ports
  * and addresses).  These are used in the ns3::Ipv4EndPointDemux as targets
@@ -41,52 +41,52 @@
 {
   public:
     /**
-     * \brief Constructor.
-     * \param address the IPv4 address
-     * \param port the port
+     * @brief Constructor.
+     * @param address the IPv4 address
+     * @param port the port
      */
     Ipv4EndPoint(Ipv4Address address, uint16_t port);
     ~Ipv4EndPoint();
 
     /**
-     * \brief Get the local address.
-     * \return the local address
+     * @brief Get the local address.
+     * @return the local address
      */
     Ipv4Address GetLocalAddress() const;
 
     /**
-     * \brief Set the local address.
-     * \param address the address to set
+     * @brief Set the local address.
+     * @param address the address to set
      */
     void SetLocalAddress(Ipv4Address address);
 
     /**
-     * \brief Get the local port.
-     * \return the local port
+     * @brief Get the local port.
+     * @return the local port
      */
     uint16_t GetLocalPort() const;
 
     /**
-     * \brief Get the peer address.
-     * \return the peer address
+     * @brief Get the peer address.
+     * @return the peer address
      */
     Ipv4Address GetPeerAddress() const;
 
     /**
-     * \brief Get the peer port.
-     * \return the peer port
+     * @brief Get the peer port.
+     * @return the peer port
      */
     uint16_t GetPeerPort() const;
 
     /**
-     * \brief Set the peer information (address and port).
-     * \param address peer address
-     * \param port peer port
+     * @brief Set the peer information (address and port).
+     * @param address peer address
+     * @param port peer port
      */
     void SetPeer(Ipv4Address address, uint16_t port);
 
     /**
-     * \brief Bind a socket to specific device.
+     * @brief Bind a socket to specific device.
      *
      * This method corresponds to using setsockopt() SO_BINDTODEVICE
      * of real network or BSD sockets.   If set on a socket, this option will
@@ -101,48 +101,48 @@
      * is also possible to bind to mismatching device and address, even if
      * the socket can not receive any packets as a result.
      *
-     * \param netdevice Pointer to Netdevice of desired interface
+     * @param netdevice Pointer to Netdevice of desired interface
      */
     void BindToNetDevice(Ptr<NetDevice> netdevice);
 
     /**
-     * \brief Returns socket's bound netdevice, if any.
+     * @brief Returns socket's bound netdevice, if any.
      *
      * This method corresponds to using getsockopt() SO_BINDTODEVICE
      * of real network or BSD sockets.
      *
      *
-     * \returns Pointer to interface.
+     * @returns Pointer to interface.
      */
     Ptr<NetDevice> GetBoundNetDevice() const;
 
     // Called from socket implementations to get notified about important events.
     /**
-     * \brief Set the reception callback.
-     * \param callback callback function
+     * @brief Set the reception callback.
+     * @param callback callback function
      */
     void SetRxCallback(
         Callback<void, Ptr<Packet>, Ipv4Header, uint16_t, Ptr<Ipv4Interface>> callback);
     /**
-     * \brief Set the ICMP callback.
-     * \param callback callback function
+     * @brief Set the ICMP callback.
+     * @param callback callback function
      */
     void SetIcmpCallback(Callback<void, Ipv4Address, uint8_t, uint8_t, uint8_t, uint32_t> callback);
     /**
-     * \brief Set the default destroy callback.
-     * \param callback callback function
+     * @brief Set the default destroy callback.
+     * @param callback callback function
      */
     void SetDestroyCallback(Callback<void> callback);
 
     /**
-     * \brief Forward the packet to the upper level.
+     * @brief Forward the packet to the upper level.
      *
      * Called from an L4Protocol implementation to notify an endpoint of a
      * packet reception.
-     * \param p the packet
-     * \param header the packet header
-     * \param sport source port
-     * \param incomingInterface incoming interface
+     * @param p the packet
+     * @param header the packet header
+     * @param sport source port
+     * @param incomingInterface incoming interface
      */
     void ForwardUp(Ptr<Packet> p,
                    const Ipv4Header& header,
@@ -150,16 +150,16 @@
                    Ptr<Ipv4Interface> incomingInterface);
 
     /**
-     * \brief Forward the ICMP packet to the upper level.
+     * @brief Forward the ICMP packet to the upper level.
      *
      * Called from an L4Protocol implementation to notify an endpoint of
      * an icmp message reception.
      *
-     * \param icmpSource source IP address
-     * \param icmpTtl time-to-live
-     * \param icmpType ICMP type
-     * \param icmpCode ICMP code
-     * \param icmpInfo ICMP info
+     * @param icmpSource source IP address
+     * @param icmpTtl time-to-live
+     * @param icmpType ICMP type
+     * @param icmpCode ICMP code
+     * @param icmpInfo ICMP info
      */
     void ForwardIcmp(Ipv4Address icmpSource,
                      uint8_t icmpTtl,
@@ -168,60 +168,60 @@
                      uint32_t icmpInfo);
 
     /**
-     * \brief Enable or Disable the endpoint Rx capability.
-     * \param enabled true if Rx is enabled
+     * @brief Enable or Disable the endpoint Rx capability.
+     * @param enabled true if Rx is enabled
      */
     void SetRxEnabled(bool enabled);
 
     /**
-     * \brief Checks if the endpoint can receive packets.
-     * \returns true if the endpoint can receive packets.
+     * @brief Checks if the endpoint can receive packets.
+     * @returns true if the endpoint can receive packets.
      */
     bool IsRxEnabled() const;
 
   private:
     /**
-     * \brief The local address.
+     * @brief The local address.
      */
     Ipv4Address m_localAddr;
 
     /**
-     * \brief The local port.
+     * @brief The local port.
      */
     uint16_t m_localPort;
 
     /**
-     * \brief The peer address.
+     * @brief The peer address.
      */
     Ipv4Address m_peerAddr;
 
     /**
-     * \brief The peer port.
+     * @brief The peer port.
      */
     uint16_t m_peerPort;
 
     /**
-     * \brief The NetDevice the EndPoint is bound to (if any).
+     * @brief The NetDevice the EndPoint is bound to (if any).
      */
     Ptr<NetDevice> m_boundnetdevice;
 
     /**
-     * \brief The RX callback.
+     * @brief The RX callback.
      */
     Callback<void, Ptr<Packet>, Ipv4Header, uint16_t, Ptr<Ipv4Interface>> m_rxCallback;
 
     /**
-     * \brief The ICMPv6 callback.
+     * @brief The ICMPv6 callback.
      */
     Callback<void, Ipv4Address, uint8_t, uint8_t, uint8_t, uint32_t> m_icmpCallback;
 
     /**
-     * \brief The destroy callback.
+     * @brief The destroy callback.
      */
     Callback<void> m_destroyCallback;
 
     /**
-     * \brief true if the endpoint can receive packets.
+     * @brief true if the endpoint can receive packets.
      */
     bool m_rxEnabled;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv4-global-routing.cc ns-3.44/src/internet/model/ipv4-global-routing.cc
--- ns-3.43/src/internet/model/ipv4-global-routing.cc	2024-10-09 16:41:09.884656000 -0700
+++ ns-3.44/src/internet/model/ipv4-global-routing.cc	2025-03-09 16:55:49.395371200 -0700
@@ -206,7 +206,7 @@
         // create a Ipv4Route object from the selected routing table entry
         rtentry = Create<Ipv4Route>();
         rtentry->SetDestination(route->GetDest());
-        /// \todo handle multi-address case
+        /// @todo handle multi-address case
         rtentry->SetSource(m_ipv4->GetAddress(route->GetInterface(), 0).GetLocal());
         rtentry->SetGateway(route->GetGateway());
         uint32_t interfaceIdx = route->GetInterface();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv4-global-routing.h ns-3.44/src/internet/model/ipv4-global-routing.h
--- ns-3.43/src/internet/model/ipv4-global-routing.h	2024-10-09 16:41:09.884656000 -0700
+++ ns-3.44/src/internet/model/ipv4-global-routing.h	2025-03-09 16:55:49.395371200 -0700
@@ -31,9 +31,9 @@
 class Node;
 
 /**
- * \ingroup ipv4
+ * @ingroup ipv4
  *
- * \brief Global routing protocol for IPv4 stacks.
+ * @brief Global routing protocol for IPv4 stacks.
  *
  * In ns-3 we have the concept of a pluggable routing protocol.  Routing
  * protocols are added to a list maintained by the Ipv4L3Protocol.  Every
@@ -54,24 +54,24 @@
  *
  * This class deals with Ipv4 unicast routes only.
  *
- * \see Ipv4RoutingProtocol
- * \see GlobalRouteManager
+ * @see Ipv4RoutingProtocol
+ * @see GlobalRouteManager
  */
 class Ipv4GlobalRouting : public Ipv4RoutingProtocol
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     /**
-     * \brief Construct an empty Ipv4GlobalRouting routing protocol,
+     * @brief Construct an empty Ipv4GlobalRouting routing protocol,
      *
      * The Ipv4GlobalRouting class supports host and network unicast routes.
      * This method initializes the lists containing these routes to empty.
      *
-     * \see Ipv4GlobalRouting
+     * @see Ipv4GlobalRouting
      */
     Ipv4GlobalRouting();
     ~Ipv4GlobalRouting() override;
@@ -98,37 +98,37 @@
                            Time::Unit unit = Time::S) const override;
 
     /**
-     * \brief Add a host route to the global routing table.
+     * @brief Add a host route to the global routing table.
      *
-     * \param dest The Ipv4Address destination for this route.
-     * \param nextHop The Ipv4Address of the next hop in the route.
-     * \param interface The network interface index used to send packets to the
+     * @param dest The Ipv4Address destination for this route.
+     * @param nextHop The Ipv4Address of the next hop in the route.
+     * @param interface The network interface index used to send packets to the
      * destination.
      *
-     * \see Ipv4Address
+     * @see Ipv4Address
      */
     void AddHostRouteTo(Ipv4Address dest, Ipv4Address nextHop, uint32_t interface);
     /**
-     * \brief Add a host route to the global routing table.
+     * @brief Add a host route to the global routing table.
      *
-     * \param dest The Ipv4Address destination for this route.
-     * \param interface The network interface index used to send packets to the
+     * @param dest The Ipv4Address destination for this route.
+     * @param interface The network interface index used to send packets to the
      * destination.
      *
-     * \see Ipv4Address
+     * @see Ipv4Address
      */
     void AddHostRouteTo(Ipv4Address dest, uint32_t interface);
 
     /**
-     * \brief Add a network route to the global routing table.
+     * @brief Add a network route to the global routing table.
      *
-     * \param network The Ipv4Address network for this route.
-     * \param networkMask The Ipv4Mask to extract the network.
-     * \param nextHop The next hop in the route to the destination network.
-     * \param interface The network interface index used to send packets to the
+     * @param network The Ipv4Address network for this route.
+     * @param networkMask The Ipv4Mask to extract the network.
+     * @param nextHop The next hop in the route to the destination network.
+     * @param interface The network interface index used to send packets to the
      * destination.
      *
-     * \see Ipv4Address
+     * @see Ipv4Address
      */
     void AddNetworkRouteTo(Ipv4Address network,
                            Ipv4Mask networkMask,
@@ -136,24 +136,24 @@
                            uint32_t interface);
 
     /**
-     * \brief Add a network route to the global routing table.
+     * @brief Add a network route to the global routing table.
      *
-     * \param network The Ipv4Address network for this route.
-     * \param networkMask The Ipv4Mask to extract the network.
-     * \param interface The network interface index used to send packets to the
+     * @param network The Ipv4Address network for this route.
+     * @param networkMask The Ipv4Mask to extract the network.
+     * @param interface The network interface index used to send packets to the
      * destination.
      *
-     * \see Ipv4Address
+     * @see Ipv4Address
      */
     void AddNetworkRouteTo(Ipv4Address network, Ipv4Mask networkMask, uint32_t interface);
 
     /**
-     * \brief Add an external route to the global routing table.
+     * @brief Add an external route to the global routing table.
      *
-     * \param network The Ipv4Address network for this route.
-     * \param networkMask The Ipv4Mask to extract the network.
-     * \param nextHop The next hop Ipv4Address
-     * \param interface The network interface index used to send packets to the
+     * @param network The Ipv4Address network for this route.
+     * @param networkMask The Ipv4Mask to extract the network.
+     * @param nextHop The next hop Ipv4Address
+     * @param interface The network interface index used to send packets to the
      * destination.
      */
     void AddASExternalRouteTo(Ipv4Address network,
@@ -162,16 +162,16 @@
                               uint32_t interface);
 
     /**
-     * \brief Get the number of individual unicast routes that have been added
+     * @brief Get the number of individual unicast routes that have been added
      * to the routing table.
      *
-     * \warning The default route counts as one of the routes.
-     * \returns the number of routes
+     * @warning The default route counts as one of the routes.
+     * @returns the number of routes
      */
     uint32_t GetNRoutes() const;
 
     /**
-     * \brief Get a route from the global unicast routing table.
+     * @brief Get a route from the global unicast routing table.
      *
      * Externally, the unicast global routing table appears simply as a table with
      * n entries.  The one subtlety of note is that if a default route has been set
@@ -182,18 +182,18 @@
      * Similarly, if the default route has been set, calling RemoveRoute (0) will
      * remove the default route.
      *
-     * \param i The index (into the routing table) of the route to retrieve.  If
+     * @param i The index (into the routing table) of the route to retrieve.  If
      * the default route has been set, it will occupy index zero.
-     * \return If route is set, a pointer to that Ipv4RoutingTableEntry is returned, otherwise
+     * @return If route is set, a pointer to that Ipv4RoutingTableEntry is returned, otherwise
      * a zero pointer is returned.
      *
-     * \see Ipv4RoutingTableEntry
-     * \see Ipv4GlobalRouting::RemoveRoute
+     * @see Ipv4RoutingTableEntry
+     * @see Ipv4GlobalRouting::RemoveRoute
      */
     Ipv4RoutingTableEntry* GetRoute(uint32_t i) const;
 
     /**
-     * \brief Remove a route from the global unicast routing table.
+     * @brief Remove a route from the global unicast routing table.
      *
      * Externally, the unicast global routing table appears simply as a table with
      * n entries.  The one subtlety of note is that if a default route has been set
@@ -201,12 +201,12 @@
      * default route has been set, calling RemoveRoute (0) will remove the
      * default route.
      *
-     * \param i The index (into the routing table) of the route to remove.  If
+     * @param i The index (into the routing table) of the route to remove.  If
      * the default route has been set, it will occupy index zero.
      *
-     * \see Ipv4RoutingTableEntry
-     * \see Ipv4GlobalRouting::GetRoute
-     * \see Ipv4GlobalRouting::AddRoute
+     * @see Ipv4RoutingTableEntry
+     * @see Ipv4GlobalRouting::GetRoute
+     * @see Ipv4GlobalRouting::AddRoute
      */
     void RemoveRoute(uint32_t i);
 
@@ -215,8 +215,8 @@
      * used by this model.  Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream);
 
@@ -255,10 +255,10 @@
     typedef std::list<Ipv4RoutingTableEntry*>::iterator ASExternalRoutesI;
 
     /**
-     * \brief Lookup in the forwarding table for destination.
-     * \param dest destination address
-     * \param oif output interface if any (put 0 otherwise)
-     * \return Ipv4Route to route the packet to reach dest address
+     * @brief Lookup in the forwarding table for destination.
+     * @param dest destination address
+     * @param oif output interface if any (put 0 otherwise)
+     * @return Ipv4Route to route the packet to reach dest address
      */
     Ptr<Ipv4Route> LookupGlobal(Ipv4Address dest, Ptr<NetDevice> oif = nullptr);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv4.h ns-3.44/src/internet/model/ipv4.h
--- ns-3.43/src/internet/model/ipv4.h	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/ipv4.h	2025-03-09 16:55:49.399371100 -0700
@@ -30,12 +30,12 @@
 class Ipv4Header;
 
 /**
- * \ingroup internet
- * \defgroup ipv4 IPv4 classes and sub-modules
+ * @ingroup internet
+ * @defgroup ipv4 IPv4 classes and sub-modules
  */
 /**
- * \ingroup ipv4
- * \brief Access to the IPv4 forwarding table, interfaces, and configuration
+ * @ingroup ipv4
+ * @brief Access to the IPv4 forwarding table, interfaces, and configuration
  *
  * This class defines the API to manipulate the following aspects of
  * the IPv4 implementation:
@@ -62,42 +62,42 @@
  *
  * TO DO:  Add API to allow access to the Ipv4 neighbor table
  *
- * \see Ipv4RoutingProtocol
- * \see Ipv4InterfaceAddress
+ * @see Ipv4RoutingProtocol
+ * @see Ipv4InterfaceAddress
  */
 class Ipv4 : public Object
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     Ipv4();
     ~Ipv4() override;
 
     /**
-     * \brief Register a new routing protocol to be used by this Ipv4 stack
+     * @brief Register a new routing protocol to be used by this Ipv4 stack
      *
      * This call will replace any routing protocol that has been previously
      * registered.  If you want to add multiple routing protocols, you must
      * add them to a Ipv4ListRoutingProtocol directly.
      *
-     * \param routingProtocol smart pointer to Ipv4RoutingProtocol object
+     * @param routingProtocol smart pointer to Ipv4RoutingProtocol object
      */
     virtual void SetRoutingProtocol(Ptr<Ipv4RoutingProtocol> routingProtocol) = 0;
 
     /**
-     * \brief Get the routing protocol to be used by this Ipv4 stack
+     * @brief Get the routing protocol to be used by this Ipv4 stack
      *
-     * \returns smart pointer to Ipv4RoutingProtocol object, or null pointer if none
+     * @returns smart pointer to Ipv4RoutingProtocol object, or null pointer if none
      */
     virtual Ptr<Ipv4RoutingProtocol> GetRoutingProtocol() const = 0;
 
     /**
-     * \param device device to add to the list of Ipv4 interfaces
+     * @param device device to add to the list of Ipv4 interfaces
      *        which can be used as output interfaces during packet forwarding.
-     * \returns the index of the Ipv4 interface added.
+     * @returns the index of the Ipv4 interface added.
      *
      * Once a device has been added, it can never be removed: if you want
      * to disable it, you can invoke Ipv4::SetDown which will
@@ -106,16 +106,16 @@
     virtual uint32_t AddInterface(Ptr<NetDevice> device) = 0;
 
     /**
-     * \returns the number of interfaces added by the user.
+     * @returns the number of interfaces added by the user.
      */
     virtual uint32_t GetNInterfaces() const = 0;
 
     /**
-     * \brief Return the interface number of the interface that has been
+     * @brief Return the interface number of the interface that has been
      *        assigned the specified IP address.
      *
-     * \param address The IP address being searched for
-     * \returns The interface number of the Ipv4 interface with the given
+     * @param address The IP address being searched for
+     * @returns The interface number of the Ipv4 interface with the given
      *          address or -1 if not found.
      *
      * Each IP interface has one or more IP addresses associated with it.
@@ -128,11 +128,11 @@
     virtual int32_t GetInterfaceForAddress(Ipv4Address address) const = 0;
 
     /**
-     * \param packet packet to send
-     * \param source source address of packet
-     * \param destination address of packet
-     * \param protocol number of packet
-     * \param route route entry
+     * @param packet packet to send
+     * @param source source address of packet
+     * @param destination address of packet
+     * @param protocol number of packet
+     * @param route route entry
      *
      * Higher-level layers call this method to send a packet
      * down the stack to the MAC and PHY layers.
@@ -144,9 +144,9 @@
                       Ptr<Ipv4Route> route) = 0;
 
     /**
-     * \param packet packet to send
-     * \param ipHeader IP Header
-     * \param route route entry
+     * @param packet packet to send
+     * @param ipHeader IP Header
+     * @param route route entry
      *
      * Higher-level layers call this method to send a packet with IPv4 Header
      * (Intend to be used with IpHeaderInclude attribute.)
@@ -154,7 +154,7 @@
     virtual void SendWithHeader(Ptr<Packet> packet, Ipv4Header ipHeader, Ptr<Ipv4Route> route) = 0;
 
     /**
-     * \param protocol a template for the protocol to add to this L4 Demux.
+     * @param protocol a template for the protocol to add to this L4 Demux.
      *
      * Invoke Copy on the input template to get a copy of the input
      * protocol which can be used on the Node on which this L4 Demux
@@ -165,7 +165,7 @@
     virtual void Insert(Ptr<IpL4Protocol> protocol) = 0;
 
     /**
-     * \brief Add a L4 protocol to a specific interface.
+     * @brief Add a L4 protocol to a specific interface.
      *
      * This may be called multiple times for multiple interfaces for the same
      * protocol.  To insert for all interfaces, use the separate
@@ -174,13 +174,13 @@
      * Setting a protocol on a specific interface will overwrite the
      * previously bound protocol.
      *
-     * \param protocol L4 protocol.
-     * \param interfaceIndex interface index.
+     * @param protocol L4 protocol.
+     * @param interfaceIndex interface index.
      */
     virtual void Insert(Ptr<IpL4Protocol> protocol, uint32_t interfaceIndex) = 0;
 
     /**
-     * \param protocol protocol to remove from this demux.
+     * @param protocol protocol to remove from this demux.
      *
      * The input value to this method should be the value
      * returned from the Ipv4L4Protocol::Insert method.
@@ -188,19 +188,19 @@
     virtual void Remove(Ptr<IpL4Protocol> protocol) = 0;
 
     /**
-     * \brief Remove a L4 protocol from a specific interface.
-     * \param protocol L4 protocol to remove.
-     * \param interfaceIndex interface index.
+     * @brief Remove a L4 protocol from a specific interface.
+     * @param protocol L4 protocol to remove.
+     * @param interfaceIndex interface index.
      */
     virtual void Remove(Ptr<IpL4Protocol> protocol, uint32_t interfaceIndex) = 0;
 
     /**
-     * \brief Determine whether address and interface corresponding to
+     * @brief Determine whether address and interface corresponding to
      *        received packet can be accepted for local delivery
      *
-     * \param address The IP address being considered
-     * \param iif The incoming Ipv4 interface index
-     * \returns true if the address is associated with the interface index
+     * @param address The IP address being considered
+     * @param iif The incoming Ipv4 interface index
+     * @returns true if the address is associated with the interface index
      *
      * This method can be used to determine whether a received packet has
      * an acceptable address for local delivery on the host.  The address
@@ -217,13 +217,13 @@
     virtual bool IsDestinationAddress(Ipv4Address address, uint32_t iif) const = 0;
 
     /**
-     * \brief Return the interface number of first interface found that
+     * @brief Return the interface number of first interface found that
      *  has an Ipv4 address within the prefix specified by the input
      *  address and mask parameters
      *
-     * \param address The IP address assigned to the interface of interest.
-     * \param mask The IP prefix to use in the mask
-     * \returns The interface number of the Ipv4 interface with the given
+     * @param address The IP address assigned to the interface of interest.
+     * @param mask The IP prefix to use in the mask
+     * @returns The interface number of the Ipv4 interface with the given
      *          address or -1 if not found.
      *
      * Each IP interface has one or more IP addresses associated with it.
@@ -235,27 +235,27 @@
     virtual int32_t GetInterfaceForPrefix(Ipv4Address address, Ipv4Mask mask) const = 0;
 
     /**
-     * \param interface The interface number of an Ipv4 interface.
-     * \returns The NetDevice associated with the Ipv4 interface number.
+     * @param interface The interface number of an Ipv4 interface.
+     * @returns The NetDevice associated with the Ipv4 interface number.
      */
     virtual Ptr<NetDevice> GetNetDevice(uint32_t interface) = 0;
 
     /**
-     * \param device The NetDevice for an Ipv4Interface
-     * \returns The interface number of an Ipv4 interface or -1 if not found.
+     * @param device The NetDevice for an Ipv4Interface
+     * @returns The interface number of an Ipv4 interface or -1 if not found.
      */
     virtual int32_t GetInterfaceForDevice(Ptr<const NetDevice> device) const = 0;
 
     /**
-     * \param interface Interface number of an Ipv4 interface
-     * \param address Ipv4InterfaceAddress address to associate with the underlying Ipv4 interface
-     * \returns true if the operation succeeded
+     * @param interface Interface number of an Ipv4 interface
+     * @param address Ipv4InterfaceAddress address to associate with the underlying Ipv4 interface
+     * @returns true if the operation succeeded
      */
     virtual bool AddAddress(uint32_t interface, Ipv4InterfaceAddress address) = 0;
 
     /**
-     * \param interface Interface number of an Ipv4 interface
-     * \returns the number of Ipv4InterfaceAddress entries for the interface.
+     * @param interface Interface number of an Ipv4 interface
+     * @returns the number of Ipv4InterfaceAddress entries for the interface.
      */
     virtual uint32_t GetNAddresses(uint32_t interface) const = 0;
 
@@ -263,9 +263,9 @@
      * Because addresses can be removed, the addressIndex is not guaranteed
      * to be static across calls to this method.
      *
-     * \param interface Interface number of an Ipv4 interface
-     * \param addressIndex index of Ipv4InterfaceAddress
-     * \returns the Ipv4InterfaceAddress associated to the interface and addressIndex
+     * @param interface Interface number of an Ipv4 interface
+     * @param addressIndex index of Ipv4InterfaceAddress
+     * @returns the Ipv4InterfaceAddress associated to the interface and addressIndex
      */
     virtual Ipv4InterfaceAddress GetAddress(uint32_t interface, uint32_t addressIndex) const = 0;
 
@@ -275,23 +275,23 @@
      * so, for example, to remove 5 addresses from an interface i, one could
      * call RemoveAddress (i, 0); 5 times.
      *
-     * \param interface Interface number of an Ipv4 interface
-     * \param addressIndex index of Ipv4InterfaceAddress to remove
-     * \returns true if the operation succeeded
+     * @param interface Interface number of an Ipv4 interface
+     * @param addressIndex index of Ipv4InterfaceAddress to remove
+     * @returns true if the operation succeeded
      */
     virtual bool RemoveAddress(uint32_t interface, uint32_t addressIndex) = 0;
 
     /**
-     * \brief Remove the given address on named Ipv4 interface
+     * @brief Remove the given address on named Ipv4 interface
      *
-     * \param interface Interface number of an Ipv4 interface
-     * \param address The address to remove
-     * \returns true if the operation succeeded
+     * @param interface Interface number of an Ipv4 interface
+     * @param address The address to remove
+     * @returns true if the operation succeeded
      */
     virtual bool RemoveAddress(uint32_t interface, Ipv4Address address) = 0;
 
     /**
-     * \brief Return the first primary source address with scope less than
+     * @brief Return the first primary source address with scope less than
      * or equal to the requested scope, to use in sending a packet to
      * destination dst out of the specified device.
      *
@@ -299,7 +299,7 @@
      * provided because interfaces may have multiple IP addresses configured
      * on them with different scopes, and with a primary and secondary status.
      * Secondary addresses are never returned.
-     * \see Ipv4InterfaceAddress
+     * @see Ipv4InterfaceAddress
      *
      * If a non-zero device pointer is provided, the method first tries to
      * return a primary address that is configured on that device, and whose
@@ -320,10 +320,10 @@
      * If there are no possible addresses to return, a warning log message
      * is issued and the all-zeroes address is returned.
      *
-     * \param device output NetDevice (optionally provided, only to constrain the search)
-     * \param dst Destination address to match, if device is provided
-     * \param scope Scope of returned address must be less than or equal to this
-     * \returns the first primary Ipv4Address that meets the search criteria
+     * @param device output NetDevice (optionally provided, only to constrain the search)
+     * @param dst Destination address to match, if device is provided
+     * @param scope Scope of returned address must be less than or equal to this
+     * @returns the first primary Ipv4Address that meets the search criteria
      */
     virtual Ipv4Address SelectSourceAddress(
         Ptr<const NetDevice> device,
@@ -331,35 +331,35 @@
         Ipv4InterfaceAddress::InterfaceAddressScope_e scope) = 0;
 
     /**
-     * \param interface The interface number of an Ipv4 interface
-     * \param metric routing metric (cost) associated to the underlying
+     * @param interface The interface number of an Ipv4 interface
+     * @param metric routing metric (cost) associated to the underlying
      *          Ipv4 interface
      */
     virtual void SetMetric(uint32_t interface, uint16_t metric) = 0;
 
     /**
-     * \param interface The interface number of an Ipv4 interface
-     * \returns routing metric (cost) associated to the underlying
+     * @param interface The interface number of an Ipv4 interface
+     * @returns routing metric (cost) associated to the underlying
      *          Ipv4 interface
      */
     virtual uint16_t GetMetric(uint32_t interface) const = 0;
 
     /**
-     * \param interface Interface number of Ipv4 interface
-     * \returns the Maximum Transmission Unit (in bytes) associated
+     * @param interface Interface number of Ipv4 interface
+     * @returns the Maximum Transmission Unit (in bytes) associated
      *          to the underlying Ipv4 interface
      */
     virtual uint16_t GetMtu(uint32_t interface) const = 0;
 
     /**
-     * \param interface Interface number of Ipv4 interface
-     * \returns true if the underlying interface is in the "up" state,
+     * @param interface Interface number of Ipv4 interface
+     * @returns true if the underlying interface is in the "up" state,
      *          false otherwise.
      */
     virtual bool IsUp(uint32_t interface) const = 0;
 
     /**
-     * \param interface Interface number of Ipv4 interface
+     * @param interface Interface number of Ipv4 interface
      *
      * Set the interface into the "up" state. In this state, it is
      * considered valid during Ipv4 forwarding.
@@ -367,7 +367,7 @@
     virtual void SetUp(uint32_t interface) = 0;
 
     /**
-     * \param interface Interface number of Ipv4 interface
+     * @param interface Interface number of Ipv4 interface
      *
      * Set the interface into the "down" state. In this state, it is
      * ignored during Ipv4 forwarding.
@@ -375,31 +375,31 @@
     virtual void SetDown(uint32_t interface) = 0;
 
     /**
-     * \param interface Interface number of Ipv4 interface
-     * \returns true if IP forwarding enabled for input datagrams on this device
+     * @param interface Interface number of Ipv4 interface
+     * @returns true if IP forwarding enabled for input datagrams on this device
      */
     virtual bool IsForwarding(uint32_t interface) const = 0;
 
     /**
-     * \param interface Interface number of Ipv4 interface
-     * \param val Value to set the forwarding flag
+     * @param interface Interface number of Ipv4 interface
+     * @param val Value to set the forwarding flag
      *
      * If set to true, IP forwarding is enabled for input datagrams on this device
      */
     virtual void SetForwarding(uint32_t interface, bool val) = 0;
 
     /**
-     * \brief Choose the source address to use with destination address.
-     * \param interface interface index
-     * \param dest IPv4 destination address
-     * \return IPv4 source address to use
+     * @brief Choose the source address to use with destination address.
+     * @param interface interface index
+     * @param dest IPv4 destination address
+     * @return IPv4 source address to use
      */
     virtual Ipv4Address SourceAddressSelection(uint32_t interface, Ipv4Address dest) = 0;
 
     /**
-     * \param protocolNumber number of protocol to lookup
+     * @param protocolNumber number of protocol to lookup
      *        in this L4 Demux
-     * \returns a matching L4 Protocol
+     * @returns a matching L4 Protocol
      *
      * This method is typically called by lower layers
      * to forward packets up the stack to the right protocol.
@@ -407,24 +407,24 @@
     virtual Ptr<IpL4Protocol> GetProtocol(int protocolNumber) const = 0;
 
     /**
-     * \brief Get L4 protocol by protocol number for the specified interface.
-     * \param protocolNumber protocol number
-     * \param interfaceIndex interface index, -1 means "any" interface.
-     * \return corresponding IpL4Protocol or 0 if not found
+     * @brief Get L4 protocol by protocol number for the specified interface.
+     * @param protocolNumber protocol number
+     * @param interfaceIndex interface index, -1 means "any" interface.
+     * @return corresponding IpL4Protocol or 0 if not found
      */
     virtual Ptr<IpL4Protocol> GetProtocol(int protocolNumber, int32_t interfaceIndex) const = 0;
 
     /**
-     * \brief Creates a raw socket
+     * @brief Creates a raw socket
      *
-     * \returns a smart pointer to the instantiated raw socket
+     * @returns a smart pointer to the instantiated raw socket
      */
     virtual Ptr<Socket> CreateRawSocket() = 0;
 
     /**
-     * \brief Deletes a particular raw socket
+     * @brief Deletes a particular raw socket
      *
-     * \param socket Smart pointer to the raw socket to be deleted
+     * @param socket Smart pointer to the raw socket to be deleted
      */
     virtual void DeleteRawSocket(Ptr<Socket> socket) = 0;
 
@@ -434,46 +434,46 @@
     // Indirect the Ipv4 attributes through private pure virtual methods
 
     /**
-     * \brief Set or unset the IP forwarding state
-     * \param forward the forwarding state
+     * @brief Set or unset the IP forwarding state
+     * @param forward the forwarding state
      */
     virtual void SetIpForward(bool forward) = 0;
     /**
-     * \brief Get the IP forwarding state
-     * \returns true if IP is in forwarding state
+     * @brief Get the IP forwarding state
+     * @returns true if IP is in forwarding state
      */
     virtual bool GetIpForward() const = 0;
 
     /**
-     * \brief Get the Weak Es Model status
+     * @brief Get the Weak Es Model status
      *
      * RFC1122 term for whether host accepts datagram with a dest. address on another interface
-     * \returns true for Weak Es Model activated
+     * @returns true for Weak Es Model activated
      */
     NS_DEPRECATED_3_41("Use GetStrongEndSystemModel instead")
     virtual bool GetWeakEsModel() const = 0;
 
     /**
-     * \brief Set or unset the Weak Es Model
+     * @brief Set or unset the Weak Es Model
      *
      * RFC1122 term for whether host accepts datagram with a dest. address on another interface
-     * \param model true for Weak Es Model
+     * @param model true for Weak Es Model
      */
     NS_DEPRECATED_3_41("Use SetStrongEndSystemModel instead")
     virtual void SetWeakEsModel(bool model) = 0;
 
     /**
-     * \brief Set or unset the Strong End System Model
+     * @brief Set or unset the Strong End System Model
      *
      * RFC1122 term for whether host rejects datagram with a dest. address on another interface
-     * \param model true for Strong End System Model
+     * @param model true for Strong End System Model
      */
     virtual void SetStrongEndSystemModel(bool model) = 0;
     /**
-     * \brief Get the Strong End System Model status
+     * @brief Get the Strong End System Model status
      *
      * RFC1122 term for whether host rejects datagram with a dest. address on another interface
-     * \returns true for Strong End System Model activated
+     * @returns true for Strong End System Model activated
      */
     virtual bool GetStrongEndSystemModel() const = 0;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv4-header.h ns-3.44/src/internet/model/ipv4-header.h
--- ns-3.43/src/internet/model/ipv4-header.h	2024-10-09 16:41:09.884656000 -0700
+++ ns-3.44/src/internet/model/ipv4-header.h	2025-03-09 16:55:49.395371200 -0700
@@ -15,40 +15,40 @@
 namespace ns3
 {
 /**
- * \ingroup ipv4
+ * @ingroup ipv4
  *
- * \brief Packet header for IPv4
+ * @brief Packet header for IPv4
  */
 class Ipv4Header : public Header
 {
   public:
     /**
-     * \brief Construct a null IPv4 header
+     * @brief Construct a null IPv4 header
      */
     Ipv4Header();
     /**
-     * \brief Enable checksum calculation for this header.
+     * @brief Enable checksum calculation for this header.
      */
     void EnableChecksum();
     /**
-     * \param size the size of the payload in bytes
+     * @param size the size of the payload in bytes
      */
     void SetPayloadSize(uint16_t size);
     /**
-     * \param identification the Identification field of IPv4 packets.
+     * @param identification the Identification field of IPv4 packets.
      *
      * By default, set to zero.
      */
     void SetIdentification(uint16_t identification);
     /**
-     * \param tos the 8 bits of Ipv4 TOS.
+     * @param tos the 8 bits of Ipv4 TOS.
      */
     void SetTos(uint8_t tos);
 
   public:
     /**
-     * \enum DscpType
-     * \brief DiffServ codepoints
+     * @enum DscpType
+     * @brief DiffServ codepoints
      *
      * The values correspond to the 6-bit DSCP codepoint within the 8-bit
      * DS field defined in \RFC{2474}.  ECN bits are separately set with the
@@ -90,14 +90,14 @@
     };
 
     /**
-     * \brief Set DSCP Field
-     * \param dscp DSCP value
+     * @brief Set DSCP Field
+     * @param dscp DSCP value
      */
     void SetDscp(DscpType dscp);
 
     /**
-     * \enum EcnType
-     * \brief ECN Type defined in \RFC{3168}
+     * @enum EcnType
+     * @brief ECN Type defined in \RFC{3168}
      */
     enum EcnType
     {
@@ -109,8 +109,8 @@
     };
 
     /**
-     * \brief Set ECN Field
-     * \param ecn ECN Type
+     * @brief Set ECN Field
+     * @param ecn ECN Type
      */
     void SetEcn(EcnType ecn);
     /**
@@ -133,86 +133,86 @@
      * The offset is measured in bytes for the packet start.
      * Mind that IPv4 "fragment offset" field is 13 bits long and is measured in 8-bytes words.
      * Hence, the function does enforce that the offset is a multiple of 8.
-     * \param offsetBytes the ipv4 fragment offset measured in bytes from the start.
+     * @param offsetBytes the ipv4 fragment offset measured in bytes from the start.
      */
     void SetFragmentOffset(uint16_t offsetBytes);
     /**
-     * \param ttl the ipv4 TTL
+     * @param ttl the ipv4 TTL
      */
     void SetTtl(uint8_t ttl);
     /**
-     * \param num the ipv4 protocol field
+     * @param num the ipv4 protocol field
      */
     void SetProtocol(uint8_t num);
     /**
-     * \param source the source of this packet
+     * @param source the source of this packet
      */
     void SetSource(Ipv4Address source);
     /**
-     * \param destination the destination of this packet.
+     * @param destination the destination of this packet.
      */
     void SetDestination(Ipv4Address destination);
     /**
-     * \returns the size of the payload in bytes
+     * @returns the size of the payload in bytes
      */
     uint16_t GetPayloadSize() const;
     /**
-     * \returns the identification field of this packet.
+     * @returns the identification field of this packet.
      */
     uint16_t GetIdentification() const;
     /**
-     * \returns the TOS field of this packet.
+     * @returns the TOS field of this packet.
      */
     uint8_t GetTos() const;
     /**
-     * \returns the DSCP field of this packet.
+     * @returns the DSCP field of this packet.
      */
     DscpType GetDscp() const;
     /**
-     * \param dscp the dscp
-     * \returns std::string of DSCPType
+     * @param dscp the dscp
+     * @returns std::string of DSCPType
      */
     std::string DscpTypeToString(DscpType dscp) const;
     /**
-     * \returns the ECN field of this packet.
+     * @returns the ECN field of this packet.
      */
     EcnType GetEcn() const;
     /**
-     * \param ecn the ECNType
-     * \returns std::string of ECNType
+     * @param ecn the ECNType
+     * @returns std::string of ECNType
      */
     std::string EcnTypeToString(EcnType ecn) const;
     /**
-     * \returns true if this is the last fragment of a packet, false otherwise.
+     * @returns true if this is the last fragment of a packet, false otherwise.
      */
     bool IsLastFragment() const;
     /**
-     * \returns true if this is this packet can be fragmented.
+     * @returns true if this is this packet can be fragmented.
      */
     bool IsDontFragment() const;
     /**
-     * \returns the offset of this fragment measured in bytes from the start.
+     * @returns the offset of this fragment measured in bytes from the start.
      */
     uint16_t GetFragmentOffset() const;
     /**
-     * \returns the TTL field of this packet
+     * @returns the TTL field of this packet
      */
     uint8_t GetTtl() const;
     /**
-     * \returns the protocol field of this packet
+     * @returns the protocol field of this packet
      */
     uint8_t GetProtocol() const;
     /**
-     * \returns the source address of this packet
+     * @returns the source address of this packet
      */
     Ipv4Address GetSource() const;
     /**
-     * \returns the destination address of this packet
+     * @returns the destination address of this packet
      */
     Ipv4Address GetDestination() const;
 
     /**
-     * \returns true if the ipv4 checksum is correct, false otherwise.
+     * @returns true if the ipv4 checksum is correct, false otherwise.
      *
      * If Ipv4Header::EnableChecksums has not been called prior to
      * deserializing this header, this method will always return true.
@@ -220,8 +220,8 @@
     bool IsChecksumOk() const;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv4-interface-address.h ns-3.44/src/internet/model/ipv4-interface-address.h
--- ns-3.43/src/internet/model/ipv4-interface-address.h	2024-10-09 16:41:09.884656000 -0700
+++ ns-3.44/src/internet/model/ipv4-interface-address.h	2025-03-09 16:55:49.395371200 -0700
@@ -17,10 +17,10 @@
 {
 
 /**
- * \ingroup address
- * \ingroup ipv4
+ * @ingroup address
+ * @ingroup ipv4
  *
- * \brief a class to store IPv4 address information on an interface
+ * @brief a class to store IPv4 address information on an interface
  *
  * Corresponds to Linux struct in_ifaddr.  A list of these addresses
  * is stored in Ipv4Interface.  This class is modelled after how current
@@ -34,8 +34,8 @@
 {
   public:
     /**
-     * \enum InterfaceAddressScope_e
-     * \brief Address scope.
+     * @enum InterfaceAddressScope_e
+     * @brief Address scope.
      */
     enum InterfaceAddressScope_e
     {
@@ -47,109 +47,109 @@
     Ipv4InterfaceAddress();
 
     /**
-     * \brief Configure local address, mask and broadcast address
-     * \param local the local address
-     * \param mask the network mask
+     * @brief Configure local address, mask and broadcast address
+     * @param local the local address
+     * @param mask the network mask
      */
     Ipv4InterfaceAddress(Ipv4Address local, Ipv4Mask mask);
     /**
      * Copy constructor
-     * \param o the object to copy
+     * @param o the object to copy
      */
     Ipv4InterfaceAddress(const Ipv4InterfaceAddress& o);
 
     /**
-     * \brief Set local address
-     * \param local the address
+     * @brief Set local address
+     * @param local the address
      *
-     * \note Functionally identical to `Ipv4InterfaceAddress::SetAddress`.
+     * @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
+     * @brief Set local address
+     * @param address the address
      *
-     * \note Functially identical to `Ipv4InterfaceAddress::SetLocal`.
+     * @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
+     * @brief Get the local address
+     * @returns the local address
      *
-     * \note Functionally identical to `Ipv4InterfaceAddress::GetAddress`.
+     * @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() const;
 
     /**
-     * \brief Get the local address
-     * \returns the local address
+     * @brief Get the local address
+     * @returns the local address
      *
-     * \note Functially identical to `Ipv4InterfaceAddress::GetLocal`.
+     * @note Functially identical to `Ipv4InterfaceAddress::GetLocal`.
      *       This function is consistent with `Ipv6InterfaceAddress::GetAddress`.
      */
     Ipv4Address GetAddress() const;
 
     /**
-     * \brief Set the network mask
-     * \param mask the network mask
+     * @brief Set the network mask
+     * @param mask the network mask
      */
     void SetMask(Ipv4Mask mask);
     /**
-     * \brief Get the network mask
-     * \returns the network mask
+     * @brief Get the network mask
+     * @returns the network mask
      */
     Ipv4Mask GetMask() const;
     /**
-     * \brief Set the broadcast address
-     * \param broadcast the broadcast address
+     * @brief Set the broadcast address
+     * @param broadcast the broadcast address
      */
     void SetBroadcast(Ipv4Address broadcast);
     /**
-     * \brief Get the broadcast address
-     * \returns the broadcast address
+     * @brief Get the broadcast address
+     * @returns the broadcast address
      */
     Ipv4Address GetBroadcast() const;
 
     /**
-     * \brief Set the scope.
-     * \param scope the scope of address
+     * @brief Set the scope.
+     * @param scope the scope of address
      */
     void SetScope(Ipv4InterfaceAddress::InterfaceAddressScope_e scope);
 
     /**
-     * \brief Get address scope.
-     * \return scope
+     * @brief Get address scope.
+     * @return scope
      */
     Ipv4InterfaceAddress::InterfaceAddressScope_e GetScope() 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.
+     * @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
+     * @brief Check if the address is a secondary address
      *
      * Secondary address is used for multihoming
-     * \returns true if the address is secondary
+     * @returns true if the address is secondary
      */
     bool IsSecondary() const;
 
     /**
-     * \brief Make the address secondary (used for multihoming)
+     * @brief Make the address secondary (used for multihoming)
      */
     void SetSecondary();
     /**
-     * \brief Make the address primary
+     * @brief Make the address primary
      */
     void SetPrimary();
 
@@ -164,30 +164,30 @@
     bool m_secondary;                //!< For use in multihoming
 
     /**
-     * \brief Equal to operator.
+     * @brief Equal to operator.
      *
-     * \param a the first operand
-     * \param b the first operand
-     * \returns true if the operands are equal
+     * @param a the first operand
+     * @param b the first operand
+     * @returns true if the operands are equal
      */
     friend bool operator==(const Ipv4InterfaceAddress& a, const Ipv4InterfaceAddress& b);
 
     /**
-     * \brief Not equal to operator.
+     * @brief Not equal to operator.
      *
-     * \param a the first operand
-     * \param b the first operand
-     * \returns true if the operands are not equal
+     * @param a the first operand
+     * @param b the first operand
+     * @returns true if the operands are not equal
      */
     friend bool operator!=(const Ipv4InterfaceAddress& a, const Ipv4InterfaceAddress& b);
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the reference to the output stream
- * \param addr the Ipv4InterfaceAddress
- * \returns the reference to the output stream
+ * @param os the reference to the output stream
+ * @param addr the Ipv4InterfaceAddress
+ * @returns the reference to the output stream
  */
 std::ostream& operator<<(std::ostream& os, const Ipv4InterfaceAddress& addr);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv4-interface.cc ns-3.44/src/internet/model/ipv4-interface.cc
--- ns-3.43/src/internet/model/ipv4-interface.cc	2024-10-09 16:41:09.884656000 -0700
+++ ns-3.44/src/internet/model/ipv4-interface.cc	2025-03-09 16:55:49.395371200 -0700
@@ -211,7 +211,7 @@
     // traffic control layer
     if (DynamicCast<LoopbackNetDevice>(m_device))
     {
-        /// \todo additional checks needed here (such as whether multicast
+        /// @todo additional checks needed here (such as whether multicast
         /// goes to loopback)?
         p->AddHeader(hdr);
         m_device->Send(p, m_device->GetBroadcast(), Ipv4L3Protocol::PROT_NUMBER);
@@ -323,24 +323,22 @@
 Ipv4Interface::GetAddress(uint32_t index) const
 {
     NS_LOG_FUNCTION(this << index);
-    if (index < m_ifaddrs.size())
+    if (index >= m_ifaddrs.size())
     {
-        uint32_t tmp = 0;
-        for (auto i = m_ifaddrs.begin(); i != m_ifaddrs.end(); i++)
-        {
-            if (tmp == index)
-            {
-                return *i;
-            }
-            ++tmp;
-        }
+        NS_FATAL_ERROR("index " << index << " out of bounds");
     }
-    else
+
+    uint32_t tmp = 0;
+    for (auto i = m_ifaddrs.begin(); i != m_ifaddrs.end(); i++)
     {
-        NS_FATAL_ERROR("index " << index << " out of bounds");
+        if (tmp == index)
+        {
+            return *i;
+        }
+        ++tmp;
     }
-    Ipv4InterfaceAddress addr;
-    return addr; // quiet compiler
+
+    return {}; // quiet compiler
 }
 
 Ipv4InterfaceAddress
@@ -351,14 +349,16 @@
     {
         NS_FATAL_ERROR("Bug in Ipv4Interface::RemoveAddress");
     }
-    auto i = m_ifaddrs.begin();
+
     uint32_t tmp = 0;
-    while (i != m_ifaddrs.end())
+    for (auto it = m_ifaddrs.begin(); it != m_ifaddrs.end(); it++)
     {
         if (tmp == index)
         {
-            Ipv4InterfaceAddress addr = *i;
-            m_ifaddrs.erase(i);
+            // NOLINTNEXTLINE(performance-unnecessary-copy-initialization)
+            Ipv4InterfaceAddress addr = *it;
+
+            m_ifaddrs.erase(it);
             if (!m_removeAddressCallback.IsNull())
             {
                 m_removeAddressCallback(this, addr);
@@ -366,11 +366,9 @@
             return addr;
         }
         ++tmp;
-        ++i;
     }
     NS_FATAL_ERROR("Address " << index << " not found");
-    Ipv4InterfaceAddress addr;
-    return addr; // quiet compiler
+    return {}; // quiet compiler
 }
 
 Ipv4InterfaceAddress
@@ -388,7 +386,9 @@
     {
         if ((*it).GetLocal() == address)
         {
+            // NOLINTNEXTLINE(performance-unnecessary-copy-initialization)
             Ipv4InterfaceAddress ifAddr = *it;
+
             m_ifaddrs.erase(it);
             if (!m_removeAddressCallback.IsNull())
             {
@@ -397,7 +397,7 @@
             return ifAddr;
         }
     }
-    return Ipv4InterfaceAddress();
+    return {};
 }
 
 void
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv4-interface.h ns-3.44/src/internet/model/ipv4-interface.h
--- ns-3.43/src/internet/model/ipv4-interface.h	2024-10-09 16:41:09.884656000 -0700
+++ ns-3.44/src/internet/model/ipv4-interface.h	2025-03-09 16:55:49.395371200 -0700
@@ -28,9 +28,9 @@
 class TrafficControlLayer;
 
 /**
- * \ingroup ipv4
+ * @ingroup ipv4
  *
- * \brief The IPv4 representation of a network interface
+ * @brief The IPv4 representation of a network interface
  *
  * This class roughly corresponds to the struct in_device
  * of Linux; the main purpose is to provide address-family
@@ -44,8 +44,8 @@
 {
   public:
     /**
-     * \brief Get the type ID
-     * \return type ID
+     * @brief Get the type ID
+     * @return type ID
      */
     static TypeId GetTypeId();
 
@@ -57,38 +57,38 @@
     Ipv4Interface& operator=(const Ipv4Interface&) = delete;
 
     /**
-     * \brief Set node associated with interface.
-     * \param node node
+     * @brief Set node associated with interface.
+     * @param node node
      */
     void SetNode(Ptr<Node> node);
     /**
-     * \brief Set the NetDevice.
-     * \param device NetDevice
+     * @brief Set the NetDevice.
+     * @param device NetDevice
      */
     void SetDevice(Ptr<NetDevice> device);
     /**
-     * \brief Set the TrafficControlLayer.
-     * \param tc TrafficControlLayer object
+     * @brief Set the TrafficControlLayer.
+     * @param tc TrafficControlLayer object
      */
     void SetTrafficControl(Ptr<TrafficControlLayer> tc);
     /**
-     * \brief Set ARP cache used by this interface
-     * \param arpCache the ARP cache
+     * @brief Set ARP cache used by this interface
+     * @param arpCache the ARP cache
      */
     void SetArpCache(Ptr<ArpCache> arpCache);
 
     /**
-     * \returns the underlying NetDevice. This method cannot return zero.
+     * @returns the underlying NetDevice. This method cannot return zero.
      */
     Ptr<NetDevice> GetDevice() const;
 
     /**
-     * \return ARP cache used by this interface
+     * @return ARP cache used by this interface
      */
     Ptr<ArpCache> GetArpCache() const;
 
     /**
-     * \param metric configured routing metric (cost) of this interface
+     * @param metric configured routing metric (cost) of this interface
      *
      * Note:  This is synonymous to the Metric value that ifconfig prints
      * out.  It is used by ns-3 global routing, but other routing daemons
@@ -97,7 +97,7 @@
     void SetMetric(uint16_t metric);
 
     /**
-     * \returns configured routing metric (cost) of this interface
+     * @returns configured routing metric (cost) of this interface
      *
      * Note:  This is synonymous to the Metric value that ifconfig prints
      * out.  It is used by ns-3 global routing, but other routing daemons
@@ -111,12 +111,12 @@
      * (where the device may be down but IP interface state is still up).
      */
     /**
-     * \returns true if this interface is enabled, false otherwise.
+     * @returns true if this interface is enabled, false otherwise.
      */
     bool IsUp() const;
 
     /**
-     * \returns true if this interface is disabled, false otherwise.
+     * @returns true if this interface is disabled, false otherwise.
      */
     bool IsDown() const;
 
@@ -131,19 +131,19 @@
     void SetDown();
 
     /**
-     * \returns true if this interface is enabled for IP forwarding of input datagrams
+     * @returns true if this interface is enabled for IP forwarding of input datagrams
      */
     bool IsForwarding() const;
 
     /**
-     * \param val Whether to enable or disable IP forwarding for input datagrams
+     * @param val Whether to enable or disable IP forwarding for input datagrams
      */
     void SetForwarding(bool val);
 
     /**
-     * \param p packet to send
-     * \param hdr IPv4 header
-     * \param dest next hop address of packet.
+     * @param p packet to send
+     * @param hdr IPv4 header
+     * @param dest next hop address of packet.
      *
      * This method will eventually call the private
      * SendTo method which must be implemented by subclasses.
@@ -151,33 +151,33 @@
     void Send(Ptr<Packet> p, const Ipv4Header& hdr, Ipv4Address dest);
 
     /**
-     * \param address The Ipv4InterfaceAddress to add to the interface
-     * \returns true if succeeded
+     * @param address The Ipv4InterfaceAddress to add to the interface
+     * @returns true if succeeded
      */
     bool AddAddress(Ipv4InterfaceAddress address);
 
     /**
-     * \param index Index of Ipv4InterfaceAddress to return
-     * \returns The Ipv4InterfaceAddress address whose index is i
+     * @param index Index of Ipv4InterfaceAddress to return
+     * @returns The Ipv4InterfaceAddress address whose index is i
      */
     Ipv4InterfaceAddress GetAddress(uint32_t index) const;
 
     /**
-     * \returns the number of Ipv4InterfaceAddress stored on this interface
+     * @returns the number of Ipv4InterfaceAddress stored on this interface
      */
     uint32_t GetNAddresses() const;
 
     /**
-     * \param index Index of Ipv4InterfaceAddress to remove
-     * \returns The Ipv4InterfaceAddress address whose index is index
+     * @param index Index of Ipv4InterfaceAddress to remove
+     * @returns The Ipv4InterfaceAddress address whose index is index
      */
     Ipv4InterfaceAddress RemoveAddress(uint32_t index);
 
     /**
-     * \brief Remove the given Ipv4 address from the interface.
-     * \param address The Ipv4 address to remove
-     * \returns The removed Ipv4 interface address
-     * \returns The null interface address if the interface did not contain the
+     * @brief Remove the given Ipv4 address from the interface.
+     * @param address The Ipv4 address to remove
+     * @returns The removed Ipv4 interface address
+     * @returns The null interface address if the interface did not contain the
      * address or if loopback address was passed as argument
      */
     Ipv4InterfaceAddress RemoveAddress(Ipv4Address address);
@@ -187,7 +187,7 @@
      * auto-generated Arp cache and it allow the neighbor cache helper to update
      * neighbor's Arp cache
      *
-     * \param removeAddressCallback Callback when remove an address.
+     * @param removeAddressCallback Callback when remove an address.
      */
     void RemoveAddressCallback(
         Callback<void, Ptr<Ipv4Interface>, Ipv4InterfaceAddress> removeAddressCallback);
@@ -197,7 +197,7 @@
      * auto-generated Arp cache and it allow the neighbor cache helper to update
      * neighbor's Arp cache
      *
-     * \param addAddressCallback Callback when remove an address.
+     * @param addAddressCallback Callback when remove an address.
      */
     void AddAddressCallback(
         Callback<void, Ptr<Ipv4Interface>, Ipv4InterfaceAddress> addAddressCallback);
@@ -207,22 +207,22 @@
 
   private:
     /**
-     * \brief Initialize interface.
+     * @brief Initialize interface.
      */
     void DoSetup();
 
     /**
-     * \brief Container for the Ipv4InterfaceAddresses.
+     * @brief Container for the Ipv4InterfaceAddresses.
      */
     typedef std::list<Ipv4InterfaceAddress> Ipv4InterfaceAddressList;
 
     /**
-     * \brief Container Iterator for the Ipv4InterfaceAddresses.
+     * @brief Container Iterator for the Ipv4InterfaceAddresses.
      */
     typedef std::list<Ipv4InterfaceAddress>::const_iterator Ipv4InterfaceAddressListCI;
 
     /**
-     * \brief Const Container Iterator for the Ipv4InterfaceAddresses.
+     * @brief Const Container Iterator for the Ipv4InterfaceAddresses.
      */
     typedef std::list<Ipv4InterfaceAddress>::iterator Ipv4InterfaceAddressListI;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv4-l3-protocol.cc ns-3.44/src/internet/model/ipv4-l3-protocol.cc
--- ns-3.43/src/internet/model/ipv4-l3-protocol.cc	2024-10-09 16:41:09.884656000 -0700
+++ ns-3.44/src/internet/model/ipv4-l3-protocol.cc	2025-03-09 16:55:49.395371200 -0700
@@ -36,8 +36,6 @@
 
 NS_LOG_COMPONENT_DEFINE("Ipv4L3Protocol");
 
-const uint16_t Ipv4L3Protocol::PROT_NUMBER = 0x0800;
-
 NS_OBJECT_ENSURE_REGISTERED(Ipv4L3Protocol);
 
 TypeId
@@ -1017,13 +1015,13 @@
 
         Ptr<Packet> packet = p->Copy();
         Ipv4Header ipHeader = header;
-        ipHeader.SetTtl(header.GetTtl() - 1);
-        if (ipHeader.GetTtl() == 0)
+        if (ipHeader.GetTtl() <= 1)
         {
             NS_LOG_WARN("TTL exceeded.  Drop.");
             m_dropTrace(header, packet, DROP_TTL_EXPIRED, this, interface);
             return;
         }
+        ipHeader.SetTtl(header.GetTtl() - 1);
         NS_LOG_LOGIC("Forward multicast via interface " << interface);
         Ptr<Ipv4Route> rtentry = Create<Ipv4Route>();
         rtentry->SetSource(ipHeader.GetSource());
@@ -1046,8 +1044,7 @@
     Ipv4Header ipHeader = header;
     Ptr<Packet> packet = p->Copy();
     int32_t interface = GetInterfaceForDevice(rtentry->GetOutputDevice());
-    ipHeader.SetTtl(ipHeader.GetTtl() - 1);
-    if (ipHeader.GetTtl() == 0)
+    if (ipHeader.GetTtl() <= 1)
     {
         // Do not reply to multicast/broadcast IP address
         if (!ipHeader.GetDestination().IsBroadcast() && !ipHeader.GetDestination().IsMulticast())
@@ -1059,6 +1056,7 @@
         m_dropTrace(header, packet, DROP_TTL_EXPIRED, this, interface);
         return;
     }
+    ipHeader.SetTtl(ipHeader.GetTtl() - 1);
     // in case the packet still has a priority tag attached, remove it
     SocketPriorityTag priorityTag;
     packet->RemovePacketTag(priorityTag);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv4-l3-protocol.h ns-3.44/src/internet/model/ipv4-l3-protocol.h
--- ns-3.43/src/internet/model/ipv4-l3-protocol.h	2024-10-09 16:41:09.884656000 -0700
+++ ns-3.44/src/internet/model/ipv4-l3-protocol.h	2025-03-09 16:55:49.395371200 -0700
@@ -45,9 +45,9 @@
 class Icmpv4L4Protocol;
 
 /**
- * \ingroup ipv4
+ * @ingroup ipv4
  *
- * \brief Implement the IPv4 layer.
+ * @brief Implement the IPv4 layer.
  *
  * This is the actual implementation of IP.  It contains APIs to send and
  * receive packets at the IP layer, as well as APIs for IP routing.
@@ -73,11 +73,12 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
-    static const uint16_t PROT_NUMBER; //!< Protocol number (0x0800)
+
+    static constexpr uint16_t PROT_NUMBER = 0x0800; //!< Protocol number
 
     Ipv4L3Protocol();
     ~Ipv4L3Protocol() override;
@@ -87,8 +88,8 @@
     Ipv4L3Protocol& operator=(const Ipv4L3Protocol&) = delete;
 
     /**
-     * \enum DropReason
-     * \brief Reason why a packet has been dropped.
+     * @enum DropReason
+     * @brief Reason why a packet has been dropped.
      */
     enum DropReason
     {
@@ -102,8 +103,8 @@
     };
 
     /**
-     * \brief Set node associated with this stack.
-     * \param node node to set
+     * @brief Set node associated with this stack.
+     * @param node node to set
      */
     void SetNode(Ptr<Node> node);
 
@@ -127,7 +128,7 @@
     Ipv4Address SourceAddressSelection(uint32_t interface, Ipv4Address dest) override;
 
     /**
-     * \param ttl default ttl to use
+     * @param ttl default ttl to use
      *
      * When we need to send an ipv4 packet, we use this default
      * ttl value.
@@ -140,12 +141,12 @@
      * packet is coming to:
      *    - implement a per-NetDevice ARP cache
      *    - send back arp replies on the right device
-     * \param device network device
-     * \param p the packet
-     * \param protocol protocol value
-     * \param from address of the correspondent
-     * \param to address of the destination
-     * \param packetType type of the packet
+     * @param device network device
+     * @param p the packet
+     * @param protocol protocol value
+     * @param from address of the correspondent
+     * @param to address of the destination
+     * @param packetType type of the packet
      */
     void Receive(Ptr<NetDevice> device,
                  Ptr<const Packet> p,
@@ -155,11 +156,11 @@
                  NetDevice::PacketType packetType);
 
     /**
-     * \param packet packet to send
-     * \param source source address of packet
-     * \param destination address of packet
-     * \param protocol number of packet
-     * \param route route entry
+     * @param packet packet to send
+     * @param source source address of packet
+     * @param destination address of packet
+     * @param protocol number of packet
+     * @param route route entry
      *
      * Higher-level layers call this method to send a packet
      * down the stack to the MAC and PHY layers.
@@ -170,9 +171,9 @@
               uint8_t protocol,
               Ptr<Ipv4Route> route) override;
     /**
-     * \param packet packet to send
-     * \param ipHeader IP Header
-     * \param route route entry
+     * @param packet packet to send
+     * @param ipHeader IP Header
+     * @param route route entry
      *
      * Higher-level layers call this method to send a packet with IPv4 Header
      * (Intend to be used with IpHeaderInclude attribute.)
@@ -181,9 +182,9 @@
 
     uint32_t AddInterface(Ptr<NetDevice> device) override;
     /**
-     * \brief Get an interface.
-     * \param i interface index
-     * \return IPv4 interface pointer
+     * @brief Get an interface.
+     * @param i interface index
+     * @return IPv4 interface pointer
      */
     Ptr<Ipv4Interface> GetInterface(uint32_t i) const;
     uint32_t GetNInterfaces() const override;
@@ -214,23 +215,23 @@
     Ptr<NetDevice> GetNetDevice(uint32_t i) override;
 
     /**
-     * \brief Check if an IPv4 address is unicast according to the node.
+     * @brief Check if an IPv4 address is unicast according to the node.
      *
      * This function checks all the node's interfaces and the respective subnet masks.
      * An address is considered unicast if it's not broadcast, subnet-broadcast or multicast.
      *
-     * \param ad address
+     * @param ad address
      *
-     * \return true if the address is unicast
+     * @return true if the address is unicast
      */
     bool IsUnicast(Ipv4Address ad) const;
 
     /**
      * TracedCallback signature for packet send, forward, or local deliver events.
      *
-     * \param [in] header the Ipv4Header
-     * \param [in] packet the packet
-     * \param [in] interface IP-level interface number
+     * @param [in] header the Ipv4Header
+     * @param [in] packet the packet
+     * @param [in] interface IP-level interface number
      */
     typedef void (*SentTracedCallback)(const Ipv4Header& header,
                                        Ptr<const Packet> packet,
@@ -239,10 +240,10 @@
     /**
      * TracedCallback signature for packet transmission or reception events.
      *
-     * \param [in] packet the packet.
-     * \param [in] ipv4 the Ipv4 protocol
-     * \param [in] interface IP-level interface number
-     * \deprecated The non-const \c Ptr<Ipv4> argument is deprecated
+     * @param [in] packet the packet.
+     * @param [in] ipv4 the Ipv4 protocol
+     * @param [in] interface IP-level interface number
+     * @deprecated The non-const \c Ptr<Ipv4> argument is deprecated
      * and will be changed to \c Ptr<const Ipv4> in a future release.
      */
     // NS_DEPRECATED() - tag for future removal
@@ -253,12 +254,12 @@
     /**
      * TracedCallback signature for packet drop events.
      *
-     * \param [in] header the Ipv4Header.
-     * \param [in] packet the packet.
-     * \param [in] reason the reason the packet was dropped.
-     * \param [in] ipv4 the Ipv4 protocol
-     * \param [in] interface IP-level interface number
-     * \deprecated The non-const \c Ptr<Ipv4> argument is deprecated
+     * @param [in] header the Ipv4Header.
+     * @param [in] packet the packet.
+     * @param [in] reason the reason the packet was dropped.
+     * @param [in] ipv4 the Ipv4 protocol
+     * @param [in] interface IP-level interface number
+     * @deprecated The non-const \c Ptr<Ipv4> argument is deprecated
      * and will be changed to \c Ptr<const Ipv4> in a future release.
      */
     // NS_DEPRECATED() - tag for future removal
@@ -279,8 +280,8 @@
 
   private:
     /**
-     * \brief Ipv4L3ProtocolTestCase test case.
-     * \relates Ipv4L3ProtocolTestCase
+     * @brief Ipv4L3ProtocolTestCase test case.
+     * @relates Ipv4L3ProtocolTestCase
      */
     friend class ::Ipv4L3ProtocolTestCase;
 
@@ -288,10 +289,10 @@
     void SetIpForward(bool forward) override;
     bool GetIpForward() const override;
 
-    /** \copydoc Ipv4::SetWeakEsModel */
+    /** @copydoc Ipv4::SetWeakEsModel */
     NS_DEPRECATED_3_41("Use SetStrongEndSystemModel instead")
     void SetWeakEsModel(bool model) override;
-    /** \copydoc Ipv4::GetWeakEsModel */
+    /** @copydoc Ipv4::GetWeakEsModel */
     NS_DEPRECATED_3_41("Use GetStrongEndSystemModel instead")
     bool GetWeakEsModel() const override;
 
@@ -299,23 +300,23 @@
     bool GetStrongEndSystemModel() const override;
 
     /**
-     * \brief Decrease the identification value for a dropped or recursed packet
-     * \param source source IPv4 address
-     * \param destination destination IPv4 address
-     * \param protocol L4 protocol
+     * @brief Decrease the identification value for a dropped or recursed packet
+     * @param source source IPv4 address
+     * @param destination destination IPv4 address
+     * @param protocol L4 protocol
      */
     void DecreaseIdentification(Ipv4Address source, Ipv4Address destination, uint8_t protocol);
 
     /**
-     * \brief Construct an IPv4 header.
-     * \param source source IPv4 address
-     * \param destination destination IPv4 address
-     * \param protocol L4 protocol
-     * \param payloadSize payload size
-     * \param ttl Time to Live
-     * \param tos Type of Service
-     * \param mayFragment true if the packet can be fragmented
-     * \return newly created IPv4 header
+     * @brief Construct an IPv4 header.
+     * @param source source IPv4 address
+     * @param destination destination IPv4 address
+     * @param protocol L4 protocol
+     * @param payloadSize payload size
+     * @param ttl Time to Live
+     * @param tos Type of Service
+     * @param mayFragment true if the packet can be fragmented
+     * @return newly created IPv4 header
      */
     Ipv4Header BuildHeader(Ipv4Address source,
                            Ipv4Address destination,
@@ -326,86 +327,86 @@
                            bool mayFragment);
 
     /**
-     * \brief Send packet with route.
-     * \param route route
-     * \param packet packet to send
-     * \param ipHeader IPv4 header to add to the packet
+     * @brief Send packet with route.
+     * @param route route
+     * @param packet packet to send
+     * @param ipHeader IPv4 header to add to the packet
      */
     void SendRealOut(Ptr<Ipv4Route> route, Ptr<Packet> packet, const Ipv4Header& ipHeader);
 
     /**
-     * \brief Forward a packet.
-     * \param rtentry route
-     * \param p packet to forward
-     * \param header IPv4 header to add to the packet
+     * @brief Forward a packet.
+     * @param rtentry route
+     * @param p packet to forward
+     * @param header IPv4 header to add to the packet
      */
     void IpForward(Ptr<Ipv4Route> rtentry, Ptr<const Packet> p, const Ipv4Header& header);
 
     /**
-     * \brief Forward a multicast packet.
-     * \param mrtentry route
-     * \param p packet to forward
-     * \param header IPv4 header to add to the packet
+     * @brief Forward a multicast packet.
+     * @param mrtentry route
+     * @param p packet to forward
+     * @param header IPv4 header to add to the packet
      */
     void IpMulticastForward(Ptr<Ipv4MulticastRoute> mrtentry,
                             Ptr<const Packet> p,
                             const Ipv4Header& header);
 
     /**
-     * \brief Deliver a packet.
-     * \param p packet delivered
-     * \param ip IPv4 header
-     * \param iif input interface packet was received
+     * @brief Deliver a packet.
+     * @param p packet delivered
+     * @param ip IPv4 header
+     * @param iif input interface packet was received
      */
     void LocalDeliver(Ptr<const Packet> p, const Ipv4Header& ip, uint32_t iif);
 
     /**
-     * \brief Fallback when no route is found.
-     * \param p packet
-     * \param ipHeader IPv4 header
-     * \param sockErrno error number
+     * @brief Fallback when no route is found.
+     * @param p packet
+     * @param ipHeader IPv4 header
+     * @param sockErrno error number
      */
     void RouteInputError(Ptr<const Packet> p,
                          const Ipv4Header& ipHeader,
                          Socket::SocketErrno sockErrno);
 
     /**
-     * \brief Add an IPv4 interface to the stack.
-     * \param interface interface to add
-     * \return index of newly added interface
+     * @brief Add an IPv4 interface to the stack.
+     * @param interface interface to add
+     * @return index of newly added interface
      */
     uint32_t AddIpv4Interface(Ptr<Ipv4Interface> interface);
 
     /**
-     * \brief Setup loopback interface.
+     * @brief Setup loopback interface.
      */
     void SetupLoopback();
 
     /**
-     * \brief Get ICMPv4 protocol.
-     * \return Icmpv4L4Protocol pointer
+     * @brief Get ICMPv4 protocol.
+     * @return Icmpv4L4Protocol pointer
      */
     Ptr<Icmpv4L4Protocol> GetIcmp() const;
 
     /**
-     * \brief Check if an IPv4 address is unicast.
-     * \param ad address
-     * \param interfaceMask the network mask
-     * \return true if the address is unicast
+     * @brief Check if an IPv4 address is unicast.
+     * @param ad address
+     * @param interfaceMask the network mask
+     * @return true if the address is unicast
      */
     bool IsUnicast(Ipv4Address ad, Ipv4Mask interfaceMask) const;
 
     /**
-     * \brief Pair of a packet and an Ipv4 header.
+     * @brief Pair of a packet and an Ipv4 header.
      */
     typedef std::pair<Ptr<Packet>, Ipv4Header> Ipv4PayloadHeaderPair;
 
     /**
-     * \brief Fragment a packet
-     * \param packet the packet
-     * \param ipv4Header the IPv4 header
-     * \param outIfaceMtu the MTU of the interface
-     * \param listFragments the list of fragments
+     * @brief Fragment a packet
+     * @param packet the packet
+     * @param ipv4Header the IPv4 header
+     * @param outIfaceMtu the MTU of the interface
+     * @param listFragments the list of fragments
      */
     void DoFragmentation(Ptr<Packet> packet,
                          const Ipv4Header& ipv4Header,
@@ -413,20 +414,20 @@
                          std::list<Ipv4PayloadHeaderPair>& listFragments);
 
     /**
-     * \brief Process a packet fragment
-     * \param packet the packet
-     * \param ipHeader the IP header
-     * \param iif Input Interface
-     * \return true is the fragment completed the packet
+     * @brief Process a packet fragment
+     * @param packet the packet
+     * @param ipHeader the IP header
+     * @param iif Input Interface
+     * @return true is the fragment completed the packet
      */
     bool ProcessFragment(Ptr<Packet>& packet, Ipv4Header& ipHeader, uint32_t iif);
 
     /**
-     * \brief Make a copy of the packet, add the header and invoke the TX trace callback
-     * \param ipHeader the IP header that will be added to the packet
-     * \param packet the packet
-     * \param ipv4 the Ipv4 protocol
-     * \param interface the IP-level interface index
+     * @brief Make a copy of the packet, add the header and invoke the TX trace callback
+     * @param ipHeader the IP header that will be added to the packet
+     * @param packet the packet
+     * @param ipv4 the Ipv4 protocol
+     * @param interface the IP-level interface index
      *
      * Note: If the TracedCallback API ever is extended, we could consider
      * to check for connected functions before adding the header
@@ -437,25 +438,25 @@
                      uint32_t interface);
 
     /**
-     * \brief Container of the IPv4 Interfaces.
+     * @brief Container of the IPv4 Interfaces.
      */
     typedef std::vector<Ptr<Ipv4Interface>> Ipv4InterfaceList;
     /**
-     * \brief Container of NetDevices registered to IPv4 and their interface indexes.
+     * @brief Container of NetDevices registered to IPv4 and their interface indexes.
      */
     typedef std::map<Ptr<const NetDevice>, uint32_t> Ipv4InterfaceReverseContainer;
     /**
-     * \brief Container of the IPv4 Raw Sockets.
+     * @brief Container of the IPv4 Raw Sockets.
      */
     typedef std::list<Ptr<Ipv4RawSocketImpl>> SocketList;
 
     /**
-     * \brief Container of the IPv4 L4 keys: protocol number, interface index
+     * @brief Container of the IPv4 L4 keys: protocol number, interface index
      */
     typedef std::pair<int, int32_t> L4ListKey_t;
 
     /**
-     * \brief Container of the IPv4 L4 instances.
+     * @brief Container of the IPv4 L4 instances.
      */
     typedef std::map<L4ListKey_t, Ptr<IpL4Protocol>> L4List_t;
 
@@ -481,18 +482,18 @@
 
     // The following two traces pass a packet with an IP header
     /// Trace of transmitted packets
-    /// \deprecated The non-const \c Ptr<Ipv4> argument is deprecated
+    /// @deprecated The non-const \c Ptr<Ipv4> argument is deprecated
     /// and will be changed to \c Ptr<const Ipv4> in a future release.
     // NS_DEPRECATED() - tag for future removal
     TracedCallback<Ptr<const Packet>, Ptr<Ipv4>, uint32_t> m_txTrace;
     /// Trace of received packets
-    /// \deprecated The non-const \c Ptr<Ipv4> argument is deprecated
+    /// @deprecated The non-const \c Ptr<Ipv4> argument is deprecated
     /// and will be changed to \c Ptr<const Ipv4> in a future release.
     // NS_DEPRECATED() - tag for future removal
     TracedCallback<Ptr<const Packet>, Ptr<Ipv4>, uint32_t> m_rxTrace;
     // <ip-header, payload, reason, ifindex> (ifindex not valid if reason is DROP_NO_ROUTE)
     /// Trace of dropped packets
-    /// \deprecated The non-const \c Ptr<Ipv4> argument is deprecated
+    /// @deprecated The non-const \c Ptr<Ipv4> argument is deprecated
     /// and will be changed to \c Ptr<const Ipv4> in a future release.
     // NS_DEPRECATED() - tag for future removal
     TracedCallback<const Ipv4Header&, Ptr<const Packet>, DropReason, Ptr<Ipv4>, uint32_t>
@@ -513,24 +514,24 @@
         FragmentsTimeoutsListI_t;
 
     /**
-     * \brief Process the timeout for packet fragments
-     * \param key representing the packet fragments
-     * \param ipHeader the IP header of the original packet
-     * \param iif Input Interface
+     * @brief Process the timeout for packet fragments
+     * @param key representing the packet fragments
+     * @param ipHeader the IP header of the original packet
+     * @param iif Input Interface
      */
     void HandleFragmentsTimeout(FragmentKey_t key, Ipv4Header& ipHeader, uint32_t iif);
 
     /**
-     * \brief Set a new timeout "event" for a fragmented packet
-     * \param key the fragment identification
-     * \param ipHeader the IPv4 header of the fragmented packet
-     * \param iif input interface of the packet
-     * \return an iterator to the inserted "event"
+     * @brief Set a new timeout "event" for a fragmented packet
+     * @param key the fragment identification
+     * @param ipHeader the IPv4 header of the fragmented packet
+     * @param iif input interface of the packet
+     * @return an iterator to the inserted "event"
      */
     FragmentsTimeoutsListI_t SetTimeout(FragmentKey_t key, Ipv4Header ipHeader, uint32_t iif);
 
     /**
-     * \brief Handles a fragmented packet timeout
+     * @brief Handles a fragmented packet timeout
      */
     void HandleTimeout();
 
@@ -539,67 +540,67 @@
     EventId m_timeoutEvent; //!< Event for the next scheduled timeout
 
     /**
-     * \brief A Set of Fragment belonging to the same packet (src, dst, identification and proto)
+     * @brief A Set of Fragment belonging to the same packet (src, dst, identification and proto)
      */
     class Fragments : public SimpleRefCount<Fragments>
     {
       public:
         /**
-         * \brief Constructor.
+         * @brief Constructor.
          */
         Fragments();
 
         /**
-         * \brief Add a fragment.
-         * \param fragment the fragment
-         * \param fragmentOffset the offset of the fragment
-         * \param moreFragment the bit "More Fragment"
+         * @brief Add a fragment.
+         * @param fragment the fragment
+         * @param fragmentOffset the offset of the fragment
+         * @param moreFragment the bit "More Fragment"
          */
         void AddFragment(Ptr<Packet> fragment, uint16_t fragmentOffset, bool moreFragment);
 
         /**
-         * \brief If all fragments have been added.
-         * \returns true if the packet is entire
+         * @brief If all fragments have been added.
+         * @returns true if the packet is entire
          */
         bool IsEntire() const;
 
         /**
-         * \brief Get the entire packet.
-         * \return the entire packet
+         * @brief Get the entire packet.
+         * @return the entire packet
          */
         Ptr<Packet> GetPacket() const;
 
         /**
-         * \brief Get the complete part of the packet.
-         * \return the part we have complete
+         * @brief Get the complete part of the packet.
+         * @return the part we have complete
          */
         Ptr<Packet> GetPartialPacket() const;
 
         /**
-         * \brief Set the Timeout iterator.
-         * \param iter The iterator.
+         * @brief Set the Timeout iterator.
+         * @param iter The iterator.
          */
         void SetTimeoutIter(FragmentsTimeoutsListI_t iter);
 
         /**
-         * \brief Get the Timeout iterator.
-         * \returns The iterator.
+         * @brief Get the Timeout iterator.
+         * @returns The iterator.
          */
         FragmentsTimeoutsListI_t GetTimeoutIter();
 
       private:
         /**
-         * \brief True if other fragments will be sent.
+         * @brief True if other fragments will be sent.
          */
         bool m_moreFragment;
 
         /**
-         * \brief The current fragments.
+         * @brief The current fragments.
          */
         std::list<std::pair<Ptr<Packet>, uint16_t>> m_fragments;
 
         /**
-         * \brief Timeout iterator to "event" handler
+         * @brief Timeout iterator to "event" handler
          */
         FragmentsTimeoutsListI_t m_timeoutIter;
     };
@@ -619,9 +620,9 @@
 
     /**
      * Registers duplicate entry, return false if new
-     * \param [in] p Possibly duplicate packet.
-     * \param [in] header Packet \pname{p} header.
-     * \return True if this packet is a duplicate
+     * @param [in] p Possibly duplicate packet.
+     * @param [in] header Packet \pname{p} header.
+     * @return True if this packet is a duplicate
      */
     bool UpdateDuplicate(Ptr<const Packet> p, const Ipv4Header& header);
     /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv4-list-routing.h ns-3.44/src/internet/model/ipv4-list-routing.h
--- ns-3.43/src/internet/model/ipv4-list-routing.h	2024-10-09 16:41:09.884656000 -0700
+++ ns-3.44/src/internet/model/ipv4-list-routing.h	2025-03-09 16:55:49.395371200 -0700
@@ -18,9 +18,9 @@
 {
 
 /**
- * \ingroup ipv4Routing
+ * @ingroup ipv4Routing
  *
- * \brief IPv4 list routing.
+ * @brief IPv4 list routing.
  *
  * This class is a specialization of Ipv4RoutingProtocol that allows
  * other instances of Ipv4RoutingProtocol to be inserted in a
@@ -36,8 +36,8 @@
 {
   public:
     /**
-     * \brief Get the type ID of this class.
-     * \return type ID
+     * @brief Get the type ID of this class.
+     * @return type ID
      */
     static TypeId GetTypeId();
 
@@ -45,15 +45,15 @@
     ~Ipv4ListRouting() override;
 
     /**
-     * \brief Register a new routing protocol to be used in this IPv4 stack
+     * @brief Register a new routing protocol to be used in this IPv4 stack
      *
-     * \param routingProtocol new routing protocol implementation object
-     * \param priority priority to give to this routing protocol.
+     * @param routingProtocol new routing protocol implementation object
+     * @param priority priority to give to this routing protocol.
      * Values may range between -32768 and +32767.
      */
     virtual void AddRoutingProtocol(Ptr<Ipv4RoutingProtocol> routingProtocol, int16_t priority);
     /**
-     * \return number of routing protocols in the list
+     * @return number of routing protocols in the list
      */
     virtual uint32_t GetNRoutingProtocols() const;
     /**
@@ -62,9 +62,9 @@
      * the second highest priority, and so on.  The priority parameter is an
      * output parameter and it returns the integer priority of the protocol.
      *
-     * \return pointer to routing protocol indexed by
-     * \param index index of protocol to return
-     * \param priority output parameter, set to the priority of the protocol
+     * @return pointer to routing protocol indexed by
+     * @param index index of protocol to return
+     * @param priority output parameter, set to the priority of the protocol
               being returned
      */
     virtual Ptr<Ipv4RoutingProtocol> GetRoutingProtocol(uint32_t index, int16_t& priority) const;
@@ -96,20 +96,20 @@
 
   private:
     /**
-     * \brief Container identifying an IPv4 Routing Protocol entry in the list.
+     * @brief Container identifying an IPv4 Routing Protocol entry in the list.
      */
     typedef std::pair<int16_t, Ptr<Ipv4RoutingProtocol>> Ipv4RoutingProtocolEntry;
     /**
-     * \brief Container of the IPv4 Routing Protocols.
+     * @brief Container of the IPv4 Routing Protocols.
      */
     typedef std::list<Ipv4RoutingProtocolEntry> Ipv4RoutingProtocolList;
     Ipv4RoutingProtocolList m_routingProtocols; //!<  List of routing protocols.
 
     /**
-     * \brief Compare two routing protocols.
-     * \param a first object to compare
-     * \param b second object to compare
-     * \return true if they are the same, false otherwise
+     * @brief Compare two routing protocols.
+     * @param a first object to compare
+     * @param b second object to compare
+     * @return true if they are the same, false otherwise
      */
     static bool Compare(const Ipv4RoutingProtocolEntry& a, const Ipv4RoutingProtocolEntry& b);
     Ptr<Ipv4> m_ipv4; //!< Ipv4 this protocol is associated with.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv4-packet-filter.h ns-3.44/src/internet/model/ipv4-packet-filter.h
--- ns-3.43/src/internet/model/ipv4-packet-filter.h	2024-10-09 16:41:09.884656000 -0700
+++ ns-3.44/src/internet/model/ipv4-packet-filter.h	2025-03-09 16:55:49.395371200 -0700
@@ -19,8 +19,8 @@
 {
 
 /**
- * \ingroup ipv4
- * \ingroup traffic-control
+ * @ingroup ipv4
+ * @ingroup traffic-control
  *
  * Ipv4PacketFilter is the abstract base class for filters defined for IPv4 packets.
  */
@@ -28,8 +28,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv4-packet-info-tag.h ns-3.44/src/internet/model/ipv4-packet-info-tag.h
--- ns-3.43/src/internet/model/ipv4-packet-info-tag.h	2024-10-09 16:41:09.884656000 -0700
+++ ns-3.44/src/internet/model/ipv4-packet-info-tag.h	2025-03-09 16:55:49.395371200 -0700
@@ -19,9 +19,9 @@
 class Packet;
 
 /**
- * \ingroup ipv4
+ * @ingroup ipv4
  *
- * \brief This class implements Linux struct pktinfo
+ * @brief This class implements Linux struct pktinfo
  * in order to deliver ancillary information to the socket interface.
  * This is used with socket option such as IP_PKTINFO, IP_RECVTTL,
  * IP_RECVTOS. See linux manpage ip(7).
@@ -40,48 +40,48 @@
     Ipv4PacketInfoTag();
 
     /**
-     * \brief Set the tag's address
+     * @brief Set the tag's address
      *
-     * \param addr the address
+     * @param addr the address
      */
     void SetAddress(Ipv4Address addr);
 
     /**
-     * \brief Get the tag's address
+     * @brief Get the tag's address
      *
-     * \returns the address
+     * @returns the address
      */
     Ipv4Address GetAddress() const;
 
     /**
-     * \brief Set the tag's receiving interface
+     * @brief Set the tag's receiving interface
      *
-     * \param ifindex the interface index
+     * @param ifindex the interface index
      */
     void SetRecvIf(uint32_t ifindex);
     /**
-     * \brief Get the tag's receiving interface
+     * @brief Get the tag's receiving interface
      *
-     * \returns the interface index
+     * @returns the interface index
      */
     uint32_t GetRecvIf() const;
 
     /**
-     * \brief Set the tag's Time to Live
+     * @brief Set the tag's Time to Live
      * Implemented, but not used in the stack yet
-     * \param ttl the TTL
+     * @param ttl the TTL
      */
     void SetTtl(uint8_t ttl);
     /**
-     * \brief Get the tag's Time to Live
+     * @brief Get the tag's Time to Live
      * Implemented, but not used in the stack yet
-     * \returns the TTL
+     * @returns the TTL
      */
     uint8_t GetTtl() const;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv4-packet-probe.h ns-3.44/src/internet/model/ipv4-packet-probe.h
--- ns-3.43/src/internet/model/ipv4-packet-probe.h	2024-10-09 16:41:09.884656000 -0700
+++ ns-3.44/src/internet/model/ipv4-packet-probe.h	2025-03-09 16:55:49.395371200 -0700
@@ -27,7 +27,7 @@
 {
 
 /**
- * \ingroup ipv4
+ * @ingroup ipv4
  *
  * This class is designed to probe an underlying ns3 TraceSource
  * exporting a packet, an IPv4 object, and an interface.  This probe
@@ -40,29 +40,29 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     Ipv4PacketProbe();
     ~Ipv4PacketProbe() override;
 
     /**
-     * \brief Set a probe value
+     * @brief Set a probe value
      *
-     * \param packet set the traced packet equal to this
-     * \param ipv4 set the IPv4 object for the traced packet equal to this
-     * \param interface set the IPv4 interface for the traced packet equal to this
+     * @param packet set the traced packet equal to this
+     * @param ipv4 set the IPv4 object for the traced packet equal to this
+     * @param interface set the IPv4 interface for the traced packet equal to this
      */
     void SetValue(Ptr<const Packet> packet, Ptr<Ipv4> ipv4, uint32_t interface);
 
     /**
-     * \brief Set a probe value by its name in the Config system
+     * @brief Set a probe value by its name in the Config system
      *
-     * \param path config path to access the probe
-     * \param packet set the traced packet equal to this
-     * \param ipv4 set the IPv4 object for the traced packet equal to this
-     * \param interface set the IPv4 interface for the traced packet equal to this
+     * @param path config path to access the probe
+     * @param packet set the traced packet equal to this
+     * @param ipv4 set the IPv4 object for the traced packet equal to this
+     * @param interface set the IPv4 interface for the traced packet equal to this
      */
     static void SetValueByPath(std::string path,
                                Ptr<const Packet> packet,
@@ -70,18 +70,18 @@
                                uint32_t interface);
 
     /**
-     * \brief connect to a trace source attribute provided by a given object
+     * @brief connect to a trace source attribute provided by a given object
      *
-     * \param traceSource the name of the attribute TraceSource to connect to
-     * \param obj ns3::Object to connect to
-     * \return true if the trace source was successfully connected
+     * @param traceSource the name of the attribute TraceSource to connect to
+     * @param obj ns3::Object to connect to
+     * @return true if the trace source was successfully connected
      */
     bool ConnectByObject(std::string traceSource, Ptr<Object> obj) override;
 
     /**
-     * \brief connect to a trace source provided by a config path
+     * @brief connect to a trace source provided by a config path
      *
-     * \param path Config path to bind to
+     * @param path Config path to bind to
      *
      * Note, if an invalid path is provided, the probe will not be connected
      * to anything.
@@ -90,12 +90,12 @@
 
   private:
     /**
-     * \brief Method to connect to an underlying ns3::TraceSource with
+     * @brief Method to connect to an underlying ns3::TraceSource with
      * arguments of type Ptr<const Packet>, Ptr<Ipv4>, and uint32_t
      *
-     * \param packet the traced packet
-     * \param ipv4 the IPv4 object for the traced packet
-     * \param interface the IPv4 interface for the traced packet
+     * @param packet the traced packet
+     * @param ipv4 the IPv4 object for the traced packet
+     * @param interface the IPv4 interface for the traced packet
      */
     void TraceSink(Ptr<const Packet> packet, Ptr<Ipv4> ipv4, uint32_t interface);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv4-queue-disc-item.h ns-3.44/src/internet/model/ipv4-queue-disc-item.h
--- ns-3.43/src/internet/model/ipv4-queue-disc-item.h	2024-10-09 16:41:09.884656000 -0700
+++ ns-3.44/src/internet/model/ipv4-queue-disc-item.h	2025-03-09 16:55:49.395371200 -0700
@@ -16,8 +16,8 @@
 {
 
 /**
- * \ingroup ipv4
- * \ingroup traffic-control
+ * @ingroup ipv4
+ * @ingroup traffic-control
  *
  * Ipv4QueueDiscItem is a subclass of QueueDiscItem which stores IPv4 packets.
  * Header and payload are kept separate to allow the queue disc to manipulate
@@ -27,11 +27,11 @@
 {
   public:
     /**
-     * \brief Create an IPv4 queue disc item containing an IPv4 packet.
-     * \param p the packet included in the created item.
-     * \param addr the destination MAC address
-     * \param protocol the protocol number
-     * \param header the IPv4 header
+     * @brief Create an IPv4 queue disc item containing an IPv4 packet.
+     * @param p the packet included in the created item.
+     * @param addr the destination MAC address
+     * @param protocol the protocol number
+     * @param header the IPv4 header
      */
     Ipv4QueueDiscItem(Ptr<Packet> p,
                       const Address& addr,
@@ -46,23 +46,23 @@
     Ipv4QueueDiscItem& operator=(const Ipv4QueueDiscItem&) = delete;
 
     /**
-     * \return the correct packet size (header plus payload).
+     * @return the correct packet size (header plus payload).
      */
     uint32_t GetSize() const override;
 
     /**
-     * \return the header stored in this item..
+     * @return the header stored in this item..
      */
     const Ipv4Header& GetHeader() const;
 
     /**
-     * \brief Add the header to the packet
+     * @brief Add the header to the packet
      */
     void AddHeader() override;
 
     /**
-     * \brief Print the item contents.
-     * \param os output stream in which the data should be printed.
+     * @brief Print the item contents.
+     * @param os output stream in which the data should be printed.
      */
     void Print(std::ostream& os) const override;
 
@@ -76,21 +76,21 @@
     bool GetUint8Value(Uint8Values field, uint8_t& value) const override;
 
     /**
-     * \brief Marks the packet by setting ECN_CE bits if the packet has
+     * @brief Marks the packet by setting ECN_CE bits if the packet has
      * ECN_ECT0 or ECN_ECT1 set.  If ECN_CE is already set, returns true.
-     * \return true if the method results in a marked packet, false otherwise
+     * @return true if the method results in a marked packet, false otherwise
      */
     bool Mark() override;
 
     /**
-     * \brief Computes the hash of the packet's 5-tuple
+     * @brief Computes the hash of the packet's 5-tuple
      *
      * Computes the hash of the source and destination IP addresses, protocol
      * number and, if the transport protocol is either UDP or TCP, the source
      * and destination port
      *
-     * \param perturbation hash perturbation value
-     * \return the hash of the packet's 5-tuple
+     * @param perturbation hash perturbation value
+     * @return the hash of the packet's 5-tuple
      */
     uint32_t Hash(uint32_t perturbation) const override;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv4-raw-socket-factory.h ns-3.44/src/internet/model/ipv4-raw-socket-factory.h
--- ns-3.43/src/internet/model/ipv4-raw-socket-factory.h	2024-10-09 16:41:09.884656000 -0700
+++ ns-3.44/src/internet/model/ipv4-raw-socket-factory.h	2025-03-09 16:55:49.395371200 -0700
@@ -16,10 +16,10 @@
 class Socket;
 
 /**
- * \ingroup socket
- * \ingroup ipv4
+ * @ingroup socket
+ * @ingroup ipv4
  *
- * \brief API to create RAW socket instances
+ * @brief API to create RAW socket instances
  *
  * This abstract class defines the API for RAW socket factory.
  *
@@ -28,8 +28,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv4-raw-socket-factory-impl.h ns-3.44/src/internet/model/ipv4-raw-socket-factory-impl.h
--- ns-3.43/src/internet/model/ipv4-raw-socket-factory-impl.h	2024-10-09 16:41:09.884656000 -0700
+++ ns-3.44/src/internet/model/ipv4-raw-socket-factory-impl.h	2025-03-09 16:55:49.395371200 -0700
@@ -15,10 +15,10 @@
 {
 
 /**
- * \ingroup socket
- * \ingroup ipv4
+ * @ingroup socket
+ * @ingroup ipv4
  *
- * \brief Implementation of IPv4 raw socket factory.
+ * @brief Implementation of IPv4 raw socket factory.
  */
 class Ipv4RawSocketFactoryImpl : public Ipv4RawSocketFactory
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv4-raw-socket-impl.h ns-3.44/src/internet/model/ipv4-raw-socket-impl.h
--- ns-3.43/src/internet/model/ipv4-raw-socket-impl.h	2024-10-09 16:41:09.884656000 -0700
+++ ns-3.44/src/internet/model/ipv4-raw-socket-impl.h	2025-03-09 16:55:49.395371200 -0700
@@ -16,10 +16,10 @@
 class Node;
 
 /**
- * \ingroup socket
- * \ingroup ipv4
+ * @ingroup socket
+ * @ingroup ipv4
  *
- * \brief IPv4 raw socket.
+ * @brief IPv4 raw socket.
  *
  * A RAW Socket typically is used to access specific IP layers not usually
  * available through L4 sockets, e.g., ICMP. The implementer should take
@@ -30,24 +30,24 @@
 {
   public:
     /**
-     * \brief Get the type ID of this class.
-     * \return type ID
+     * @brief Get the type ID of this class.
+     * @return type ID
      */
     static TypeId GetTypeId();
 
     Ipv4RawSocketImpl();
 
     /**
-     * \brief Set the node associated with this socket.
-     * \param node node to set
+     * @brief Set the node associated with this socket.
+     * @param node node to set
      */
     void SetNode(Ptr<Node> node);
 
     Socket::SocketErrno GetErrno() const override;
 
     /**
-     * \brief Get socket type (NS3_SOCK_RAW)
-     * \return socket type
+     * @brief Get socket type (NS3_SOCK_RAW)
+     * @return socket type
      */
     Socket::SocketType GetSocketType() const override;
 
@@ -70,17 +70,17 @@
     Ptr<Packet> RecvFrom(uint32_t maxSize, uint32_t flags, Address& fromAddress) override;
 
     /**
-     * \brief Set protocol field.
-     * \param protocol protocol to set
+     * @brief Set protocol field.
+     * @param protocol protocol to set
      */
     void SetProtocol(uint16_t protocol);
 
     /**
-     * \brief Forward up to receive method.
-     * \param p packet
-     * \param ipHeader IPv4 header
-     * \param incomingInterface incoming interface
-     * \return true if forwarded, false otherwise
+     * @brief Forward up to receive method.
+     * @param p packet
+     * @param ipHeader IPv4 header
+     * @param incomingInterface incoming interface
+     * @return true if forwarded, false otherwise
      */
     bool ForwardUp(Ptr<const Packet> p, Ipv4Header ipHeader, Ptr<Ipv4Interface> incomingInterface);
     bool SetAllowBroadcast(bool allowBroadcast) override;
@@ -90,8 +90,8 @@
     void DoDispose() override;
 
     /**
-     * \struct Data
-     * \brief IPv4 raw data and additional information.
+     * @struct Data
+     * @brief IPv4 raw data and additional information.
      */
     struct Data
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv4-route.h ns-3.44/src/internet/model/ipv4-route.h
--- ns-3.43/src/internet/model/ipv4-route.h	2024-10-09 16:41:09.884656000 -0700
+++ ns-3.44/src/internet/model/ipv4-route.h	2025-03-09 16:55:49.395371200 -0700
@@ -20,9 +20,9 @@
 class NetDevice;
 
 /**
- * \ingroup ipv4Routing
+ * @ingroup ipv4Routing
  *
- * \brief IPv4 route cache entry (similar to Linux struct rtable)
+ * @brief IPv4 route cache entry (similar to Linux struct rtable)
  *
  * This is a reference counted object.  In the future, we will add other
  * entries from struct dst_entry, struct rtable, and struct dst_ops as needed.
@@ -33,40 +33,40 @@
     Ipv4Route();
 
     /**
-     * \param dest Destination Ipv4Address
+     * @param dest Destination Ipv4Address
      */
     void SetDestination(Ipv4Address dest);
     /**
-     * \return Destination Ipv4Address of the route
+     * @return Destination Ipv4Address of the route
      */
     Ipv4Address GetDestination() const;
 
     /**
-     * \param src Source Ipv4Address
+     * @param src Source Ipv4Address
      */
     void SetSource(Ipv4Address src);
     /**
-     * \return Source Ipv4Address of the route
+     * @return Source Ipv4Address of the route
      */
     Ipv4Address GetSource() const;
 
     /**
-     * \param gw Gateway (next hop) Ipv4Address
+     * @param gw Gateway (next hop) Ipv4Address
      */
     void SetGateway(Ipv4Address gw);
     /**
-     * \return Ipv4Address of the gateway (next hop)
+     * @return Ipv4Address of the gateway (next hop)
      */
     Ipv4Address GetGateway() const;
 
     /**
      * Equivalent in Linux to dst_entry.dev
      *
-     * \param outputDevice pointer to NetDevice for outgoing packets
+     * @param outputDevice pointer to NetDevice for outgoing packets
      */
     void SetOutputDevice(Ptr<NetDevice> outputDevice);
     /**
-     * \return pointer to NetDevice for outgoing packets
+     * @return pointer to NetDevice for outgoing packets
      */
     Ptr<NetDevice> GetOutputDevice() const;
 
@@ -87,18 +87,18 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the reference to the output stream
- * \param route the Ipv4 route
- * \returns the reference to the output stream
+ * @param os the reference to the output stream
+ * @param route the Ipv4 route
+ * @returns the reference to the output stream
  */
 std::ostream& operator<<(std::ostream& os, const Ipv4Route& route);
 
 /**
- * \ingroup ipv4Routing
+ * @ingroup ipv4Routing
  *
- * \brief Ipv4 multicast route cache entry (similar to Linux struct mfc_cache)
+ * @brief Ipv4 multicast route cache entry (similar to Linux struct mfc_cache)
  */
 class Ipv4MulticastRoute : public SimpleRefCount<Ipv4MulticastRoute>
 {
@@ -106,40 +106,40 @@
     Ipv4MulticastRoute();
 
     /**
-     * \param group Ipv4Address of the multicast group
+     * @param group Ipv4Address of the multicast group
      */
     void SetGroup(const Ipv4Address group);
     /**
-     * \return Ipv4Address of the multicast group
+     * @return Ipv4Address of the multicast group
      */
     Ipv4Address GetGroup() const;
 
     /**
-     * \param origin Ipv4Address of the origin address
+     * @param origin Ipv4Address of the origin address
      */
     void SetOrigin(const Ipv4Address origin);
     /**
-     * \return Ipv4Address of the origin address
+     * @return Ipv4Address of the origin address
      */
     Ipv4Address GetOrigin() const;
 
     /**
-     * \param iif Parent (input interface) for this route
+     * @param iif Parent (input interface) for this route
      */
     void SetParent(uint32_t iif);
     /**
-     * \return Parent (input interface) for this route
+     * @return Parent (input interface) for this route
      */
     uint32_t GetParent() const;
 
     /**
-     * \param oif Outgoing interface index
-     * \param ttl time-to-live for this route
+     * @param oif Outgoing interface index
+     * @param ttl time-to-live for this route
      */
     void SetOutputTtl(uint32_t oif, uint32_t ttl);
 
     /**
-     * \return map of output interface Ids and TTLs for this route
+     * @return map of output interface Ids and TTLs for this route
      */
     std::map<uint32_t, uint32_t> GetOutputTtlMap() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv4-routing-protocol.h ns-3.44/src/internet/model/ipv4-routing-protocol.h
--- ns-3.43/src/internet/model/ipv4-routing-protocol.h	2024-10-09 16:41:09.884656000 -0700
+++ ns-3.44/src/internet/model/ipv4-routing-protocol.h	2025-03-09 16:55:49.395371200 -0700
@@ -25,8 +25,8 @@
 class NetDevice;
 
 /**
- * \ingroup internet
- * \defgroup ipv4Routing IPv4 Routing Protocols.
+ * @ingroup internet
+ * @defgroup ipv4Routing IPv4 Routing Protocols.
  *
  * The classes in this group implement different routing protocols
  * for IPv4. Other modules could implement further protocols
@@ -34,8 +34,8 @@
  */
 
 /**
- * \ingroup ipv4Routing
- * \brief Abstract base class for IPv4 routing protocols.
+ * @ingroup ipv4Routing
+ * @brief Abstract base class for IPv4 routing protocols.
  *
  * Defines two virtual functions for packet routing and forwarding.  The first,
  * RouteOutput(), is used for locally originated packets, and the second,
@@ -47,8 +47,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -67,7 +67,7 @@
     typedef Callback<void, Ptr<const Packet>, const Ipv4Header&, Socket::SocketErrno> ErrorCallback;
 
     /**
-     * \brief Query routing cache for an existing route, for an outbound packet
+     * @brief Query routing cache for an existing route, for an outbound packet
      *
      * This lookup is used by transport protocols.  It does not cause any
      * packet to be forwarded, and is synchronous.  Can be used for
@@ -77,14 +77,14 @@
      * for the source address, but the destination address should always be
      * properly set by the caller.
      *
-     * \param p packet to be routed.  Note that this method may modify the 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
+     * @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
+     * @param sockerr Output parameter; socket errno
      *
-     * \returns a code that indicates what happened in the lookup
+     * @returns a code that indicates what happened in the lookup
      */
     virtual Ptr<Ipv4Route> RouteOutput(Ptr<Packet> p,
                                        const Ipv4Header& header,
@@ -92,24 +92,24 @@
                                        Socket::SocketErrno& sockerr) = 0;
 
     /**
-     * \brief Route an input packet (to be forwarded or locally delivered)
+     * @brief Route an input packet (to be forwarded or locally delivered)
      *
      * This lookup is used in the forwarding process.  The packet is
      * handed over to the Ipv4RoutingProtocol, and will get forwarded onward
      * by one of the callbacks.  The Linux equivalent is ip_route_input().
      * There are four valid outcomes, and a matching callbacks to handle each.
      *
-     * \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
+     * @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
+     * @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
+     * @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 the Ipv4RoutingProtocol takes responsibility for
+     * @param ecb Callback to call if there is an error in forwarding
+     * @returns true if the Ipv4RoutingProtocol takes responsibility for
      *          forwarding or delivering the packet, false otherwise
      */
     virtual bool RouteInput(Ptr<const Packet> p,
@@ -121,14 +121,14 @@
                             const ErrorCallback& ecb) = 0;
 
     /**
-     * \param interface the index of the interface we are being notified about
+     * @param interface the index of the interface we are being notified about
      *
      * Protocols are expected to implement this method to be notified of the state change of
      * an interface in a node.
      */
     virtual void NotifyInterfaceUp(uint32_t interface) = 0;
     /**
-     * \param interface the index of the interface we are being notified about
+     * @param interface the index of the interface we are being notified about
      *
      * Protocols are expected to implement this method to be notified of the state change of
      * an interface in a node.
@@ -136,8 +136,8 @@
     virtual void NotifyInterfaceDown(uint32_t interface) = 0;
 
     /**
-     * \param interface the index of the interface we are being notified about
-     * \param address a new address being added to an interface
+     * @param interface the index of the interface we are being notified about
+     * @param address a new address being added to an interface
      *
      * Protocols are expected to implement this method to be notified whenever
      * a new address is added to an interface. Typically used to add a 'network route' on an
@@ -146,8 +146,8 @@
     virtual void NotifyAddAddress(uint32_t interface, Ipv4InterfaceAddress address) = 0;
 
     /**
-     * \param interface the index of the interface we are being notified about
-     * \param address a new address being added to an interface
+     * @param interface the index of the interface we are being notified about
+     * @param address a new address being added to an interface
      *
      * Protocols are expected to implement this method to be notified whenever
      * a new address is removed from an interface. Typically used to remove the 'network route' of
@@ -156,17 +156,17 @@
     virtual void NotifyRemoveAddress(uint32_t interface, Ipv4InterfaceAddress address) = 0;
 
     /**
-     * \param ipv4 the ipv4 object this routing protocol is being associated with
+     * @param ipv4 the ipv4 object this routing protocol is being associated with
      *
      * Typically, invoked directly or indirectly from ns3::Ipv4::SetRoutingProtocol
      */
     virtual void SetIpv4(Ptr<Ipv4> ipv4) = 0;
 
     /**
-     * \brief Print the Routing Table entries
+     * @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
+     * @param stream The ostream the Routing table is printed to
+     * @param unit The time unit to be used in the report
      */
     virtual void PrintRoutingTable(Ptr<OutputStreamWrapper> stream,
                                    Time::Unit unit = Time::S) const = 0;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv4-routing-table-entry.h ns-3.44/src/internet/model/ipv4-routing-table-entry.h
--- ns-3.43/src/internet/model/ipv4-routing-table-entry.h	2024-10-09 16:41:09.884656000 -0700
+++ ns-3.44/src/internet/model/ipv4-routing-table-entry.h	2025-03-09 16:55:49.399371100 -0700
@@ -18,7 +18,7 @@
 {
 
 /**
- * \ingroup ipv4Routing
+ * @ingroup ipv4Routing
  *
  * A record of an IPv4 routing table entry for Ipv4GlobalRouting and
  * Ipv4StaticRouting.  This is not a reference counted object.
@@ -27,131 +27,131 @@
 {
   public:
     /**
-     * \brief This constructor does nothing
+     * @brief This constructor does nothing
      */
     Ipv4RoutingTableEntry();
     /**
-     * \brief Copy Constructor
-     * \param route The route to copy
+     * @brief Copy Constructor
+     * @param route The route to copy
      */
     Ipv4RoutingTableEntry(const Ipv4RoutingTableEntry& route);
     /**
-     * \brief Copy Constructor
-     * \param route The route to copy
+     * @brief Copy Constructor
+     * @param route The route to copy
      */
     Ipv4RoutingTableEntry(const Ipv4RoutingTableEntry* route);
     /**
-     * \return True if this route is a host route (mask of all ones); false otherwise
+     * @return True if this route is a host route (mask of all ones); false otherwise
      */
     bool IsHost() const;
     /**
-     * \return True if this route is not a host route (mask is not all ones); false otherwise
+     * @return True if this route is not a host route (mask is not all ones); false otherwise
      *
      * This method is implemented as !IsHost ().
      */
     bool IsNetwork() const;
     /**
-     * \return True if this route is a default route; false otherwise
+     * @return True if this route is a default route; false otherwise
      */
     bool IsDefault() const;
     /**
-     * \return True if this route is a gateway route; false otherwise
+     * @return True if this route is a gateway route; false otherwise
      */
     bool IsGateway() const;
     /**
-     * \return address of the gateway stored in this entry
+     * @return address of the gateway stored in this entry
      */
     Ipv4Address GetGateway() const;
     /**
-     * \return The IPv4 address of the destination of this route
+     * @return The IPv4 address of the destination of this route
      */
     Ipv4Address GetDest() const;
     /**
-     * \return The IPv4 network number of the destination of this route
+     * @return The IPv4 network number of the destination of this route
      */
     Ipv4Address GetDestNetwork() const;
     /**
-     * \return The IPv4 network mask of the destination of this route
+     * @return The IPv4 network mask of the destination of this route
      */
     Ipv4Mask GetDestNetworkMask() const;
     /**
-     * \return The Ipv4 interface number used for sending outgoing packets
+     * @return The Ipv4 interface number used for sending outgoing packets
      */
     uint32_t GetInterface() const;
     /**
-     * \return An Ipv4RoutingTableEntry object corresponding to the input parameters.
-     * \param dest Ipv4Address of the destination
-     * \param nextHop Ipv4Address of the next hop
-     * \param interface Outgoing interface
+     * @return An Ipv4RoutingTableEntry object corresponding to the input parameters.
+     * @param dest Ipv4Address of the destination
+     * @param nextHop Ipv4Address of the next hop
+     * @param interface Outgoing interface
      */
     static Ipv4RoutingTableEntry CreateHostRouteTo(Ipv4Address dest,
                                                    Ipv4Address nextHop,
                                                    uint32_t interface);
     /**
-     * \return An Ipv4RoutingTableEntry object corresponding to the input parameters.
-     * \param dest Ipv4Address of the destination
-     * \param interface Outgoing interface
+     * @return An Ipv4RoutingTableEntry object corresponding to the input parameters.
+     * @param dest Ipv4Address of the destination
+     * @param interface Outgoing interface
      */
     static Ipv4RoutingTableEntry CreateHostRouteTo(Ipv4Address dest, uint32_t interface);
     /**
-     * \return An Ipv4RoutingTableEntry object corresponding to the input parameters.
-     * \param network Ipv4Address of the destination network
-     * \param networkMask Ipv4Mask of the destination network mask
-     * \param nextHop Ipv4Address of the next hop
-     * \param interface Outgoing interface
+     * @return An Ipv4RoutingTableEntry object corresponding to the input parameters.
+     * @param network Ipv4Address of the destination network
+     * @param networkMask Ipv4Mask of the destination network mask
+     * @param nextHop Ipv4Address of the next hop
+     * @param interface Outgoing interface
      */
     static Ipv4RoutingTableEntry CreateNetworkRouteTo(Ipv4Address network,
                                                       Ipv4Mask networkMask,
                                                       Ipv4Address nextHop,
                                                       uint32_t interface);
     /**
-     * \return An Ipv4RoutingTableEntry object corresponding to the input parameters.
-     * \param network Ipv4Address of the destination network
-     * \param networkMask Ipv4Mask of the destination network mask
-     * \param interface Outgoing interface
+     * @return An Ipv4RoutingTableEntry object corresponding to the input parameters.
+     * @param network Ipv4Address of the destination network
+     * @param networkMask Ipv4Mask of the destination network mask
+     * @param interface Outgoing interface
      */
     static Ipv4RoutingTableEntry CreateNetworkRouteTo(Ipv4Address network,
                                                       Ipv4Mask networkMask,
                                                       uint32_t interface);
     /**
-     * \return An Ipv4RoutingTableEntry object corresponding to the input
+     * @return An Ipv4RoutingTableEntry object corresponding to the input
      * parameters.  This route is distinguished; it will match any
      * destination for which a more specific route does not exist.
-     * \param nextHop Ipv4Address of the next hop
-     * \param interface Outgoing interface
+     * @param nextHop Ipv4Address of the next hop
+     * @param interface Outgoing interface
      */
     static Ipv4RoutingTableEntry CreateDefaultRoute(Ipv4Address nextHop, uint32_t interface);
 
   private:
     /**
-     * \brief Constructor.
-     * \param network network address
-     * \param mask network mask
-     * \param gateway the gateway
-     * \param interface the interface index
+     * @brief Constructor.
+     * @param network network address
+     * @param mask network mask
+     * @param gateway the gateway
+     * @param interface the interface index
      */
     Ipv4RoutingTableEntry(Ipv4Address network,
                           Ipv4Mask mask,
                           Ipv4Address gateway,
                           uint32_t interface);
     /**
-     * \brief Constructor.
-     * \param dest destination address
-     * \param mask network mask
-     * \param interface the interface index
+     * @brief Constructor.
+     * @param dest destination address
+     * @param mask network mask
+     * @param interface the interface index
      */
     Ipv4RoutingTableEntry(Ipv4Address dest, Ipv4Mask mask, uint32_t interface);
     /**
-     * \brief Constructor.
-     * \param dest destination address
-     * \param gateway the gateway
-     * \param interface the interface index
+     * @brief Constructor.
+     * @param dest destination address
+     * @param gateway the gateway
+     * @param interface the interface index
      */
     Ipv4RoutingTableEntry(Ipv4Address dest, Ipv4Address gateway, uint32_t interface);
     /**
-     * \brief Constructor.
-     * \param dest destination address
-     * \param interface the interface index
+     * @brief Constructor.
+     * @param dest destination address
+     * @param interface the interface index
      */
     Ipv4RoutingTableEntry(Ipv4Address dest, uint32_t interface);
 
@@ -162,77 +162,77 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the reference to the output stream
- * \param route the Ipv4 routing table entry
- * \returns the reference to the output stream
+ * @param os the reference to the output stream
+ * @param route the Ipv4 routing table entry
+ * @returns the reference to the output stream
  */
 std::ostream& operator<<(std::ostream& os, const Ipv4RoutingTableEntry& route);
 
 /**
- * \brief Equality operator.
+ * @brief Equality operator.
  *
- * \param a lhs
- * \param b rhs
- * \returns true if operands are equal, false otherwise
+ * @param a lhs
+ * @param b rhs
+ * @returns true if operands are equal, false otherwise
  */
 bool operator==(const Ipv4RoutingTableEntry a, const Ipv4RoutingTableEntry b);
 
 /**
- * \ingroup ipv4Routing
+ * @ingroup ipv4Routing
  *
- * \brief A record of an IPv4 multicast route for Ipv4GlobalRouting and Ipv4StaticRouting
+ * @brief A record of an IPv4 multicast route for Ipv4GlobalRouting and Ipv4StaticRouting
  */
 class Ipv4MulticastRoutingTableEntry
 {
   public:
     /**
-     * \brief This constructor does nothing
+     * @brief This constructor does nothing
      */
     Ipv4MulticastRoutingTableEntry();
 
     /**
-     * \brief Copy Constructor
-     * \param route The route to copy
+     * @brief Copy Constructor
+     * @param route The route to copy
      */
     Ipv4MulticastRoutingTableEntry(const Ipv4MulticastRoutingTableEntry& route);
     /**
-     * \brief Copy Constructor
-     * \param route The route to copy
+     * @brief Copy Constructor
+     * @param route The route to copy
      */
     Ipv4MulticastRoutingTableEntry(const Ipv4MulticastRoutingTableEntry* route);
     /**
-     * \return The IPv4 address of the source of this route
+     * @return The IPv4 address of the source of this route
      */
     Ipv4Address GetOrigin() const;
     /**
-     * \return The IPv4 address of the multicast group of this route
+     * @return The IPv4 address of the multicast group of this route
      */
     Ipv4Address GetGroup() const;
     /**
-     * \return The IPv4 address of the input interface of this route
+     * @return The IPv4 address of the input interface of this route
      */
     uint32_t GetInputInterface() const;
     /**
-     * \return The number of output interfaces of this route
+     * @return The number of output interfaces of this route
      */
     uint32_t GetNOutputInterfaces() const;
     /**
-     * \param n interface index
-     * \return A specified output interface.
+     * @param n interface index
+     * @return A specified output interface.
      */
     uint32_t GetOutputInterface(uint32_t n) const;
     /**
-     * \return A vector of all of the output interfaces of this route.
+     * @return A vector of all of the output interfaces of this route.
      */
     std::vector<uint32_t> GetOutputInterfaces() const;
     /**
-     * \return Ipv4MulticastRoutingTableEntry corresponding to the input parameters.
-     * \param origin Source address for the multicast route
-     * \param group Group destination address for the multicast route
-     * \param inputInterface Input interface that multicast datagram must be received on
-     * \param outputInterfaces vector of output interfaces to copy and forward the datagram to
+     * @return Ipv4MulticastRoutingTableEntry corresponding to the input parameters.
+     * @param origin Source address for the multicast route
+     * @param group Group destination address for the multicast route
+     * @param inputInterface Input interface that multicast datagram must be received on
+     * @param outputInterfaces vector of output interfaces to copy and forward the datagram to
      */
     static Ipv4MulticastRoutingTableEntry CreateMulticastRoute(
         Ipv4Address origin,
@@ -242,11 +242,11 @@
 
   private:
     /**
-     * \brief Constructor.
-     * \param origin source address
-     * \param group destination address
-     * \param inputInterface input interface
-     * \param outputInterfaces output interfaces
+     * @brief Constructor.
+     * @param origin source address
+     * @param group destination address
+     * @param inputInterface input interface
+     * @param outputInterfaces output interfaces
      */
     Ipv4MulticastRoutingTableEntry(Ipv4Address origin,
                                    Ipv4Address group,
@@ -260,20 +260,20 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the reference to the output stream
- * \param route the Ipv4 multicast routing table entry
- * \returns the reference to the output stream
+ * @param os the reference to the output stream
+ * @param route the Ipv4 multicast routing table entry
+ * @returns the reference to the output stream
  */
 std::ostream& operator<<(std::ostream& os, const Ipv4MulticastRoutingTableEntry& route);
 
 /**
- * \brief Equality operator.
+ * @brief Equality operator.
  *
- * \param a lhs
- * \param b rhs
- * \returns true if operands are equal, false otherwise
+ * @param a lhs
+ * @param b rhs
+ * @returns true if operands are equal, false otherwise
  */
 bool operator==(const Ipv4MulticastRoutingTableEntry a, const Ipv4MulticastRoutingTableEntry b);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv4-static-routing.h ns-3.44/src/internet/model/ipv4-static-routing.h
--- ns-3.43/src/internet/model/ipv4-static-routing.h	2024-10-09 16:41:09.884656000 -0700
+++ ns-3.44/src/internet/model/ipv4-static-routing.h	2025-03-09 16:55:49.399371100 -0700
@@ -35,9 +35,9 @@
 class Node;
 
 /**
- * \ingroup ipv4Routing
+ * @ingroup ipv4Routing
  *
- * \brief Static routing protocol for IP version 4 stacks.
+ * @brief Static routing protocol for IP version 4 stacks.
  *
  * This class provides a basic set of methods for inserting static
  * unicast and multicast routes into the Ipv4 routing system.
@@ -49,16 +49,16 @@
  * Ipv4RoutingProtocol that defines the interface methods that a routing
  * protocol must support.
  *
- * \see Ipv4RoutingProtocol
- * \see Ipv4ListRouting
- * \see Ipv4ListRouting::AddRoutingProtocol
+ * @see Ipv4RoutingProtocol
+ * @see Ipv4ListRouting
+ * @see Ipv4ListRouting::AddRoutingProtocol
  */
 class Ipv4StaticRouting : public Ipv4RoutingProtocol
 {
   public:
     /**
-     * \brief The interface Id associated with this class.
-     * \return type identifier
+     * @brief The interface Id associated with this class.
+     * @return type identifier
      */
     static TypeId GetTypeId();
 
@@ -87,16 +87,16 @@
                            Time::Unit unit = Time::S) const override;
 
     /**
-     * \brief Add a network route to the static routing table.
+     * @brief Add a network route to the static routing table.
      *
-     * \param network The Ipv4Address network for this route.
-     * \param networkMask The Ipv4Mask to extract the network.
-     * \param nextHop The next hop in the route to the destination network.
-     * \param interface The network interface index used to send packets to the
+     * @param network The Ipv4Address network for this route.
+     * @param networkMask The Ipv4Mask to extract the network.
+     * @param nextHop The next hop in the route to the destination network.
+     * @param interface The network interface index used to send packets to the
      * destination.
-     * \param metric Metric of route in case of multiple routes to same destination
+     * @param metric Metric of route in case of multiple routes to same destination
      *
-     * \see Ipv4Address
+     * @see Ipv4Address
      */
     void AddNetworkRouteTo(Ipv4Address network,
                            Ipv4Mask networkMask,
@@ -105,15 +105,15 @@
                            uint32_t metric = 0);
 
     /**
-     * \brief Add a network route to the static routing table.
+     * @brief Add a network route to the static routing table.
      *
-     * \param network The Ipv4Address network for this route.
-     * \param networkMask The Ipv4Mask to extract the network.
-     * \param interface The network interface index used to send packets to the
+     * @param network The Ipv4Address network for this route.
+     * @param networkMask The Ipv4Mask to extract the network.
+     * @param interface The network interface index used to send packets to the
      * destination.
-     * \param metric Metric of route in case of multiple routes to same destination
+     * @param metric Metric of route in case of multiple routes to same destination
      *
-     * \see Ipv4Address
+     * @see Ipv4Address
      */
     void AddNetworkRouteTo(Ipv4Address network,
                            Ipv4Mask networkMask,
@@ -121,33 +121,33 @@
                            uint32_t metric = 0);
 
     /**
-     * \brief Add a host route to the static routing table.
+     * @brief Add a host route to the static routing table.
      *
-     * \param dest The Ipv4Address destination for this route.
-     * \param nextHop The Ipv4Address of the next hop in the route.
-     * \param interface The network interface index used to send packets to the
+     * @param dest The Ipv4Address destination for this route.
+     * @param nextHop The Ipv4Address of the next hop in the route.
+     * @param interface The network interface index used to send packets to the
      * destination.
-     * \param metric Metric of route in case of multiple routes to same destination
+     * @param metric Metric of route in case of multiple routes to same destination
      *
-     * \see Ipv4Address
+     * @see Ipv4Address
      */
     void AddHostRouteTo(Ipv4Address dest,
                         Ipv4Address nextHop,
                         uint32_t interface,
                         uint32_t metric = 0);
     /**
-     * \brief Add a host route to the static routing table.
+     * @brief Add a host route to the static routing table.
      *
-     * \param dest The Ipv4Address destination for this route.
-     * \param interface The network interface index used to send packets to the
+     * @param dest The Ipv4Address destination for this route.
+     * @param interface The network interface index used to send packets to the
      * destination.
-     * \param metric Metric of route in case of multiple routes to same destination
+     * @param metric Metric of route in case of multiple routes to same destination
      *
-     * \see Ipv4Address
+     * @see Ipv4Address
      */
     void AddHostRouteTo(Ipv4Address dest, uint32_t interface, uint32_t metric = 0);
     /**
-     * \brief Add a default route to the static routing table.
+     * @brief Add a default route to the static routing table.
      *
      * This method tells the routing system what to do in the case where a specific
      * route to a destination is not found.  The system forwards packets to the
@@ -157,77 +157,77 @@
      * LookupStatic irrespective of destination address if no specific route is
      * found.
      *
-     * \param nextHop The Ipv4Address to send packets to in the hope that they
+     * @param nextHop The Ipv4Address to send packets to in the hope that they
      * will be forwarded correctly.
-     * \param interface The network interface index used to send packets.
-     * \param metric Metric of route in case of multiple routes to same destination
+     * @param interface The network interface index used to send packets.
+     * @param metric Metric of route in case of multiple routes to same destination
      *
-     * \see Ipv4Address
-     * \see Ipv4StaticRouting::Lookup
+     * @see Ipv4Address
+     * @see Ipv4StaticRouting::Lookup
      */
     void SetDefaultRoute(Ipv4Address nextHop, uint32_t interface, uint32_t metric = 0);
 
     /**
-     * \brief Get the number of individual unicast routes that have been added
+     * @brief Get the number of individual unicast routes that have been added
      * to the routing table.
      *
-     * \warning The default route counts as one of the routes.
-     * \return number of entries
+     * @warning The default route counts as one of the routes.
+     * @return number of entries
      */
     uint32_t GetNRoutes() const;
 
     /**
-     * \brief Get the default route with lowest metric from the static routing table.
+     * @brief Get the default route with lowest metric from the static routing table.
      *
-     * \return If the default route is set, a pointer to that Ipv4RoutingTableEntry is
+     * @return If the default route is set, a pointer to that Ipv4RoutingTableEntry is
      * returned, otherwise an empty routing table entry is returned.
      *  If multiple default routes exist, the one with lowest metric is returned.
      *
-     * \see Ipv4RoutingTableEntry
+     * @see Ipv4RoutingTableEntry
      */
     Ipv4RoutingTableEntry GetDefaultRoute();
 
     /**
-     * \brief Get a route from the static unicast routing table.
+     * @brief Get a route from the static unicast routing table.
      *
      * Externally, the unicast static routing table appears simply as a table with
      * n entries.
      *
-     * \param i The index (into the routing table) of the route to retrieve.
-     * \return If route is set, a pointer to that Ipv4RoutingTableEntry is returned, otherwise
+     * @param i The index (into the routing table) of the route to retrieve.
+     * @return If route is set, a pointer to that Ipv4RoutingTableEntry is returned, otherwise
      * a zero pointer is returned.
      *
-     * \see Ipv4RoutingTableEntry
-     * \see Ipv4StaticRouting::RemoveRoute
+     * @see Ipv4RoutingTableEntry
+     * @see Ipv4StaticRouting::RemoveRoute
      */
     Ipv4RoutingTableEntry GetRoute(uint32_t i) const;
 
     /**
-     * \brief Get a metric for route from the static unicast routing table.
+     * @brief Get a metric for route from the static unicast routing table.
      *
-     * \param index The index (into the routing table) of the route to retrieve.
-     * \return If route is set, the metric is returned. If not, an infinity metric (0xffffffff) is
+     * @param index The index (into the routing table) of the route to retrieve.
+     * @return If route is set, the metric is returned. If not, an infinity metric (0xffffffff) is
      * returned
      *
      */
     uint32_t GetMetric(uint32_t index) const;
 
     /**
-     * \brief Remove a route from the static unicast routing table.
+     * @brief Remove a route from the static unicast routing table.
      *
      * Externally, the unicast static routing table appears simply as a table with
      * n entries.
      *
-     * \param i The index (into the routing table) of the route to remove.
+     * @param i The index (into the routing table) of the route to remove.
      *
-     * \see Ipv4RoutingTableEntry
-     * \see Ipv4StaticRouting::GetRoute
-     * \see Ipv4StaticRouting::AddRoute
+     * @see Ipv4RoutingTableEntry
+     * @see Ipv4StaticRouting::GetRoute
+     * @see Ipv4StaticRouting::AddRoute
      */
     void RemoveRoute(uint32_t i);
 
     /**
-     * \brief Add a multicast route to the static routing table.
+     * @brief Add a multicast route to the static routing table.
      *
      * A multicast route must specify an origin IP address, a multicast group and
      * an input network interface index as conditions and provide a vector of
@@ -240,15 +240,15 @@
      * For originator nodes, the route is equivalent to a unicast route, and
      * must be added through `AddHostRouteTo`.
      *
-     * \param origin The Ipv4Address of the origin of packets for this route.  May
+     * @param origin The Ipv4Address of the origin of packets for this route.  May
      * be Ipv4Address:GetAny for open groups.
-     * \param group The Ipv4Address of the multicast group or this route.
-     * \param inputInterface The input network interface index over which to
+     * @param group The Ipv4Address of the multicast group or this route.
+     * @param inputInterface The input network interface index over which to
      * expect packets destined for this route.
-     * \param outputInterfaces A vector of network interface indexes used to specify
+     * @param outputInterfaces A vector of network interface indexes used to specify
      * how to send packets to the destination(s).
      *
-     * \see Ipv4Address
+     * @see Ipv4Address
      */
     void AddMulticastRoute(Ipv4Address origin,
                            Ipv4Address group,
@@ -256,7 +256,7 @@
                            std::vector<uint32_t> outputInterfaces);
 
     /**
-     * \brief Add a default multicast route to the static routing table.
+     * @brief Add a default multicast route to the static routing table.
      *
      * This is the multicast equivalent of the unicast version SetDefaultRoute.
      * We tell the routing system what to do in the case where a specific route
@@ -274,40 +274,40 @@
      * LookupStatic irrespective of origin or multicast group if another specific
      * route is not found.
      *
-     * \param outputInterface The network interface index used to specify where
+     * @param outputInterface The network interface index used to specify where
      * to send packets in the case of unknown routes.
      *
-     * \see Ipv4Address
+     * @see Ipv4Address
      */
     void SetDefaultMulticastRoute(uint32_t outputInterface);
 
     /**
-     * \brief Get the number of individual multicast routes that have been added
+     * @brief Get the number of individual multicast routes that have been added
      * to the routing table.
      *
-     * \warning The default multicast route counts as one of the routes.
-     * \return number of entries
+     * @warning The default multicast route counts as one of the routes.
+     * @return number of entries
      */
     uint32_t GetNMulticastRoutes() const;
 
     /**
-     * \brief Get a route from the static multicast routing table.
+     * @brief Get a route from the static multicast routing table.
      *
      * Externally, the multicast static routing table appears simply as a table
      * with n entries.
      *
-     * \param i The index (into the routing table) of the multicast route to
+     * @param i The index (into the routing table) of the multicast route to
      * retrieve.
-     * \return If route \e i is set, a pointer to that Ipv4MulticastRoutingTableEntry is
+     * @return If route \e i is set, a pointer to that Ipv4MulticastRoutingTableEntry is
      * returned, otherwise a zero pointer is returned.
      *
-     * \see Ipv4MulticastRoutingTableEntry
-     * \see Ipv4StaticRouting::RemoveRoute
+     * @see Ipv4MulticastRoutingTableEntry
+     * @see Ipv4StaticRouting::RemoveRoute
      */
     Ipv4MulticastRoutingTableEntry GetMulticastRoute(uint32_t i) const;
 
     /**
-     * \brief Remove a route from the static multicast routing table.
+     * @brief Remove a route from the static multicast routing table.
      *
      * Externally, the multicast static routing table appears simply as a table
      * with n entries.
@@ -320,31 +320,31 @@
      * remove routes with any address in the origin, but will only remove routes
      * with "0.0.0.0" set as the the origin.
      *
-     * \param origin The IP address specified as the origin of packets for the
+     * @param origin The IP address specified as the origin of packets for the
      * route.
-     * \param group The IP address specified as the multicast group address of
+     * @param group The IP address specified as the multicast group address of
      * the route.
-     * \param inputInterface The network interface index specified as the expected
+     * @param inputInterface The network interface index specified as the expected
      * input interface for the route.
-     * \returns true if a route was found and removed, false otherwise.
+     * @returns true if a route was found and removed, false otherwise.
      *
-     * \see Ipv4MulticastRoutingTableEntry
-     * \see Ipv4StaticRouting::AddMulticastRoute
+     * @see Ipv4MulticastRoutingTableEntry
+     * @see Ipv4StaticRouting::AddMulticastRoute
      */
     bool RemoveMulticastRoute(Ipv4Address origin, Ipv4Address group, uint32_t inputInterface);
 
     /**
-     * \brief Remove a route from the static multicast routing table.
+     * @brief Remove a route from the static multicast routing table.
      *
      * Externally, the multicast static routing table appears simply as a table
      * with n entries.
      *
-     * \param index The index (into the multicast routing table) of the route to
+     * @param index The index (into the multicast routing table) of the route to
      * remove.
      *
-     * \see Ipv4RoutingTableEntry
-     * \see Ipv4StaticRouting::GetRoute
-     * \see Ipv4StaticRouting::AddRoute
+     * @see Ipv4RoutingTableEntry
+     * @see Ipv4StaticRouting::GetRoute
+     * @see Ipv4StaticRouting::AddRoute
      */
     void RemoveMulticastRoute(uint32_t index);
 
@@ -371,42 +371,42 @@
     typedef std::list<Ipv4MulticastRoutingTableEntry*>::iterator MulticastRoutesI;
 
     /**
-     * \brief Checks if a route is already present in the forwarding table.
-     * \param route route
-     * \param metric metric of route
-     * \return true if the route/metric is already in the forwarding table
+     * @brief Checks if a route is already present in the forwarding table.
+     * @param route route
+     * @param metric metric of route
+     * @return true if the route/metric is already in the forwarding table
      */
     bool LookupRoute(const Ipv4RoutingTableEntry& route, uint32_t metric);
 
     /**
-     * \brief Lookup in the forwarding table for destination.
-     * \param dest destination address
-     * \param oif output interface if any (put 0 otherwise)
-     * \return Ipv4Route to route the packet to reach dest address
+     * @brief Lookup in the forwarding table for destination.
+     * @param dest destination address
+     * @param oif output interface if any (put 0 otherwise)
+     * @return Ipv4Route to route the packet to reach dest address
      */
     Ptr<Ipv4Route> LookupStatic(Ipv4Address dest, Ptr<NetDevice> oif = nullptr);
 
     /**
-     * \brief Lookup in the multicast forwarding table for destination.
-     * \param origin source address
-     * \param group group multicast address
-     * \param interface interface index
-     * \return Ipv4MulticastRoute to route the packet to reach dest address
+     * @brief Lookup in the multicast forwarding table for destination.
+     * @param origin source address
+     * @param group group multicast address
+     * @param interface interface index
+     * @return Ipv4MulticastRoute to route the packet to reach dest address
      */
     Ptr<Ipv4MulticastRoute> LookupStatic(Ipv4Address origin, Ipv4Address group, uint32_t interface);
 
     /**
-     * \brief the forwarding table for network.
+     * @brief the forwarding table for network.
      */
     NetworkRoutes m_networkRoutes;
 
     /**
-     * \brief the forwarding table for multicast.
+     * @brief the forwarding table for multicast.
      */
     MulticastRoutes m_multicastRoutes;
 
     /**
-     * \brief Ipv4 reference.
+     * @brief Ipv4 reference.
      */
     Ptr<Ipv4> m_ipv4;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv6-address-generator.cc ns-3.44/src/internet/model/ipv6-address-generator.cc
--- ns-3.43/src/internet/model/ipv6-address-generator.cc	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/ipv6-address-generator.cc	2025-03-09 16:55:49.399371100 -0700
@@ -20,9 +20,9 @@
 NS_LOG_COMPONENT_DEFINE("Ipv6AddressGenerator");
 
 /**
- * \ingroup address
+ * @ingroup address
  *
- * \brief Implementation class of Ipv6AddressGenerator
+ * @brief Implementation class of Ipv6AddressGenerator
  * This generator assigns addresses sequentially from a provided
  * network address; used in topology code. It also keeps track of all
  * addresses assigned to perform duplicate detection.
@@ -35,19 +35,19 @@
     virtual ~Ipv6AddressGeneratorImpl();
 
     /**
-     * \brief Initialise the base network and interfaceId for the generator
+     * @brief Initialise the base network and interfaceId for the generator
      *
      * The first call to NextAddress() or GetAddress() will return the
      * value passed in.
      *
-     * \param net The network for the base Ipv6Address
-     * \param prefix The prefix of the base Ipv6Address
-     * \param interfaceId The base interface ID used for initialization
+     * @param net The network for the base Ipv6Address
+     * @param prefix The prefix of the base Ipv6Address
+     * @param interfaceId The base interface ID used for initialization
      */
     void Init(const Ipv6Address net, const Ipv6Prefix prefix, const Ipv6Address interfaceId);
 
     /**
-     * \brief Get the next network according to the given Ipv6Prefix
+     * @brief Get the next network according to the given Ipv6Prefix
      *
      * This operation is a pre-increment, meaning that the internal state
      * is changed before returning the new network address.
@@ -55,88 +55,88 @@
      * This also resets the interface ID to the base interface ID that was
      * used for initialization.
      *
-     * \param prefix The Ipv6Prefix used to set the next network
-     * \returns the IPv6 address of the next network
+     * @param prefix The Ipv6Prefix used to set the next network
+     * @returns the IPv6 address of the next network
      */
     Ipv6Address NextNetwork(const Ipv6Prefix prefix);
 
     /**
-     * \brief Get the current network of the given Ipv6Prefix
+     * @brief Get the current network of the given Ipv6Prefix
      *
      * Does not change the internal state; this just peeks at the current
      * network
      *
-     * \param prefix The Ipv6Prefix for the current network
-     * \returns the IPv6 address of the current network
+     * @param prefix The Ipv6Prefix for the current network
+     * @returns the IPv6 address of the current network
      */
     Ipv6Address GetNetwork(const Ipv6Prefix prefix) const;
 
     /**
-     * \brief Set the interfaceId for the given Ipv6Prefix
+     * @brief Set the interfaceId for the given Ipv6Prefix
      *
-     * \param interfaceId The interfaceId to set for the current Ipv6Prefix
-     * \param prefix The Ipv6Prefix whose address is to be set
+     * @param interfaceId The interfaceId to set for the current Ipv6Prefix
+     * @param prefix The Ipv6Prefix whose address is to be set
      */
     void InitAddress(const Ipv6Address interfaceId, const Ipv6Prefix prefix);
 
     /**
-     * \brief Get the Ipv6Address that will be allocated upon NextAddress ()
+     * @brief Get the Ipv6Address that will be allocated upon NextAddress ()
      *
      * Does not change the internal state; just is used to peek the next
      * address that will be allocated upon NextAddress ()
      *
-     * \param prefix The Ipv6Prefix for the current network
-     * \returns the IPv6 address
+     * @param prefix The Ipv6Prefix for the current network
+     * @returns the IPv6 address
      */
     Ipv6Address GetAddress(const Ipv6Prefix prefix) const;
 
     /**
-     * \brief Allocate the next Ipv6Address for the configured network and prefix
+     * @brief Allocate the next Ipv6Address for the configured network and prefix
      *
      * This operation is a post-increment, meaning that the first address
      * allocated will be the one that was initially configured.
      *
-     * \param prefix The Ipv6Prefix for the current network
-     * \returns the IPv6 address
+     * @param prefix The Ipv6Prefix for the current network
+     * @returns the IPv6 address
      */
     Ipv6Address NextAddress(const Ipv6Prefix prefix);
 
     /**
-     * \brief Reset the networks and Ipv6Address to zero
+     * @brief Reset the networks and Ipv6Address to zero
      */
     void Reset();
 
     /**
-     * \brief Add the Ipv6Address to the list of IPv6 entries
+     * @brief Add the Ipv6Address to the list of IPv6 entries
      *
      * Typically, this is used by external address allocators that want
      * to make use of this class's ability to track duplicates.  AddAllocated
      * is always called internally for any address generated by NextAddress ()
      *
-     * \param addr The Ipv6Address to be added to the list of Ipv6 entries
-     * \returns true on success
+     * @param addr The Ipv6Address to be added to the list of Ipv6 entries
+     * @returns true on success
      */
     bool AddAllocated(const Ipv6Address addr);
 
     /**
-     * \brief Check the Ipv6Address allocation in the list of IPv6 entries
+     * @brief Check the Ipv6Address allocation in the list of IPv6 entries
      *
-     * \param addr The Ipv6Address to be checked in the list of Ipv4 entries
-     * \returns true if the network is already allocated
+     * @param addr The Ipv6Address to be checked in the list of Ipv4 entries
+     * @returns true if the network is already allocated
      */
     bool IsAddressAllocated(const Ipv6Address addr);
 
     /**
-     * \brief Check if a network has already allocated addresses
+     * @brief Check if a network has already allocated addresses
      *
-     * \param addr The Ipv6 network to be checked
-     * \param prefix The Ipv6 network prefix
-     * \returns true if the network is already allocated
+     * @param addr The Ipv6 network to be checked
+     * @param prefix The Ipv6 network prefix
+     * @returns true if the network is already allocated
      */
     bool IsNetworkAllocated(const Ipv6Address addr, const Ipv6Prefix prefix);
 
     /**
-     * \brief Used to turn off fatal errors and assertions, for testing
+     * @brief Used to turn off fatal errors and assertions, for testing
      */
     void TestMode();
 
@@ -145,14 +145,14 @@
     static const uint32_t MOST_SIGNIFICANT_BIT = 0x80; //!< MSB set to 1
 
     /**
-     * \brief Create an index number for the prefix
-     * \param prefix the prefix to index
-     * \returns an index
+     * @brief Create an index number for the prefix
+     * @param prefix the prefix to index
+     * @returns an index
      */
     uint32_t PrefixToIndex(Ipv6Prefix prefix) const;
 
     /**
-     * \brief This class holds the state for a given network
+     * @brief This class holds the state for a given network
      */
     class NetworkState
     {
@@ -167,7 +167,7 @@
     NetworkState m_netTable[N_BITS]; //!< the available networks
 
     /**
-     * \brief This class holds the allocated addresses
+     * @brief This class holds the allocated addresses
      */
     class Entry
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv6-address-generator.h ns-3.44/src/internet/model/ipv6-address-generator.h
--- ns-3.43/src/internet/model/ipv6-address-generator.h	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/ipv6-address-generator.h	2025-03-09 16:55:49.399371100 -0700
@@ -14,10 +14,10 @@
 {
 
 /**
- * \ingroup address
- * \ingroup ipv6
+ * @ingroup address
+ * @ingroup ipv6
  *
- * \brief This generator assigns addresses sequentially from a provided
+ * @brief This generator assigns addresses sequentially from a provided
  * network address; used in topology code. It also keeps track of all
  * addresses assigned to perform duplicate detection.
  *
@@ -41,7 +41,7 @@
  * but can also be a pseudo-random value (\RFC{3041}).  This implementation
  * does not generate EUI-64-based interface IDs.
  *
- * \note BEWARE: this class acts as a Singleton.
+ * @note BEWARE: this class acts as a Singleton.
  * In other terms, two different instances of Ipv6AddressGenerator will
  * pick IPv6 numbers from the same pool. Changing the network in one of them
  * will also change the network in the other instances.
@@ -51,21 +51,21 @@
 {
   public:
     /**
-     * \brief Initialise the base network and interfaceId for the generator
+     * @brief Initialise the base network and interfaceId for the generator
      *
      * The first call to NextAddress() or GetAddress() will return the
      * value passed in.
      *
-     * \param net The network for the base Ipv6Address
-     * \param prefix The prefix of the base Ipv6Address
-     * \param interfaceId The base interface ID used for initialization
+     * @param net The network for the base Ipv6Address
+     * @param prefix The prefix of the base Ipv6Address
+     * @param interfaceId The base interface ID used for initialization
      */
     static void Init(const Ipv6Address net,
                      const Ipv6Prefix prefix,
                      const Ipv6Address interfaceId = "::1");
 
     /**
-     * \brief Get the next network according to the given Ipv6Prefix
+     * @brief Get the next network according to the given Ipv6Prefix
      *
      * This operation is a pre-increment, meaning that the internal state
      * is changed before returning the new network address.
@@ -73,88 +73,88 @@
      * This also resets the interface ID to the base interface ID that was
      * used for initialization.
      *
-     * \param prefix The Ipv6Prefix used to set the next network
-     * \returns the IPv6 address of the next network
+     * @param prefix The Ipv6Prefix used to set the next network
+     * @returns the IPv6 address of the next network
      */
     static Ipv6Address NextNetwork(const Ipv6Prefix prefix);
 
     /**
-     * \brief Get the current network of the given Ipv6Prefix
+     * @brief Get the current network of the given Ipv6Prefix
      *
      * Does not change the internal state; this just peeks at the current
      * network
      *
-     * \param prefix The Ipv6Prefix for the current network
-     * \returns the IPv6 address of the current network
+     * @param prefix The Ipv6Prefix for the current network
+     * @returns the IPv6 address of the current network
      */
     static Ipv6Address GetNetwork(const Ipv6Prefix prefix);
 
     /**
-     * \brief Set the interfaceId for the given Ipv6Prefix
+     * @brief Set the interfaceId for the given Ipv6Prefix
      *
-     * \param interfaceId The interfaceId to set for the current Ipv6Prefix
-     * \param prefix The Ipv6Prefix whose address is to be set
+     * @param interfaceId The interfaceId to set for the current Ipv6Prefix
+     * @param prefix The Ipv6Prefix whose address is to be set
      */
     static void InitAddress(const Ipv6Address interfaceId, const Ipv6Prefix prefix);
 
     /**
-     * \brief Allocate the next Ipv6Address for the configured network and prefix
+     * @brief Allocate the next Ipv6Address for the configured network and prefix
      *
      * This operation is a post-increment, meaning that the first address
      * allocated will be the one that was initially configured.
      *
-     * \param prefix The Ipv6Prefix for the current network
-     * \returns the IPv6 address
+     * @param prefix The Ipv6Prefix for the current network
+     * @returns the IPv6 address
      */
     static Ipv6Address NextAddress(const Ipv6Prefix prefix);
 
     /**
-     * \brief Get the Ipv6Address that will be allocated upon NextAddress ()
+     * @brief Get the Ipv6Address that will be allocated upon NextAddress ()
      *
      * Does not change the internal state; just is used to peek the next
      * address that will be allocated upon NextAddress ()
      *
-     * \param prefix The Ipv6Prefix for the current network
-     * \returns the IPv6 address
+     * @param prefix The Ipv6Prefix for the current network
+     * @returns the IPv6 address
      */
     static Ipv6Address GetAddress(const Ipv6Prefix prefix);
 
     /**
-     * \brief Reset the networks and Ipv6Address to zero
+     * @brief Reset the networks and Ipv6Address to zero
      */
     static void Reset();
 
     /**
-     * \brief Add the Ipv6Address to the list of IPv6 entries
+     * @brief Add the Ipv6Address to the list of IPv6 entries
      *
      * Typically, this is used by external address allocators that want
      * to make use of this class's ability to track duplicates.  AddAllocated
      * is always called internally for any address generated by NextAddress ()
      *
-     * \param addr The Ipv6Address to be added to the list of Ipv6 entries
-     * \returns true on success
+     * @param addr The Ipv6Address to be added to the list of Ipv6 entries
+     * @returns true on success
      */
     static bool AddAllocated(const Ipv6Address addr);
 
     /**
-     * \brief Check the Ipv6Address allocation in the list of IPv6 entries
+     * @brief Check the Ipv6Address allocation in the list of IPv6 entries
      *
-     * \param addr The Ipv6Address to be checked in the list of Ipv4 entries
-     * \returns true if the address is already allocated
+     * @param addr The Ipv6Address to be checked in the list of Ipv4 entries
+     * @returns true if the address is already allocated
      */
     static bool IsAddressAllocated(const Ipv6Address addr);
 
     /**
-     * \brief Check if a network has already allocated addresses
+     * @brief Check if a network has already allocated addresses
      *
-     * \param addr The Ipv6 network to be checked
-     * \param prefix The Ipv6 network prefix
-     * \returns true if the network is already allocated
+     * @param addr The Ipv6 network to be checked
+     * @param prefix The Ipv6 network prefix
+     * @returns true if the network is already allocated
      */
     static bool IsNetworkAllocated(const Ipv6Address addr, const Ipv6Prefix prefix);
 
     /**
-     * \brief Used to turn off fatal errors and assertions, for testing
+     * @brief Used to turn off fatal errors and assertions, for testing
      */
     static void TestMode();
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv6-autoconfigured-prefix.h ns-3.44/src/internet/model/ipv6-autoconfigured-prefix.h
--- ns-3.43/src/internet/model/ipv6-autoconfigured-prefix.h	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/ipv6-autoconfigured-prefix.h	2025-03-09 16:55:49.399371100 -0700
@@ -22,22 +22,22 @@
 class Node;
 
 /**
- * \ingroup ipv6
+ * @ingroup ipv6
  *
- * \brief Router prefix information.
+ * @brief Router prefix information.
  */
 class Ipv6AutoconfiguredPrefix : public Object
 {
   public:
     /**
-     * \brief Constructor.
-     * \param node node
-     * \param interface interface index
-     * \param prefix IPv6 address
-     * \param mask bitmask prefix
-     * \param preferredLifeTime the preferred life time
-     * \param validLifeTime the valid life time
-     * \param router if it the prefix that configure the default gateway
+     * @brief Constructor.
+     * @param node node
+     * @param interface interface index
+     * @param prefix IPv6 address
+     * @param mask bitmask prefix
+     * @param preferredLifeTime the preferred life time
+     * @param validLifeTime the valid life time
+     * @param router if it the prefix that configure the default gateway
      */
     Ipv6AutoconfiguredPrefix(Ptr<Node> node,
                              uint32_t interface,
@@ -48,183 +48,183 @@
                              Ipv6Address router = Ipv6Address("::"));
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Ipv6AutoconfiguredPrefix() override;
 
     /**
-     * \brief Set the default gateway router.
-     * \param router IPv6 link-local address of the default router
+     * @brief Set the default gateway router.
+     * @param router IPv6 link-local address of the default router
      */
     void SetDefaultGatewayRouter(Ipv6Address router);
 
     /**
-     * \brief Get the default gateway address.
-     * \return IPv6 link-local address of the default router
+     * @brief Get the default gateway address.
+     * @return IPv6 link-local address of the default router
      */
     Ipv6Address GetDefaultGatewayRouter() const;
 
     /**
-     * \brief Get the interface index.
-     * \return interface index
+     * @brief Get the interface index.
+     * @return interface index
      */
     uint32_t GetInterface() const;
 
     /**
-     * \brief Set the interface.
-     * \param interface interface index to set
+     * @brief Set the interface.
+     * @param interface interface index to set
      */
     void SetInterface(uint32_t interface);
 
     /**
-     * \brief Get the prefix preferred life time.
-     * \return preferred life time
+     * @brief Get the prefix preferred life time.
+     * @return preferred life time
      */
     uint32_t GetPreferredLifeTime() const;
 
     /**
-     * \brief Set the prefix preferred life time.
-     * \param p the prefix preferred life time
+     * @brief Set the prefix preferred life time.
+     * @param p the prefix preferred life time
      */
     void SetPreferredLifeTime(uint32_t p);
 
     /**
-     * \brief Get the prefix valid life time.
-     * \return valid life time
+     * @brief Get the prefix valid life time.
+     * @return valid life time
      */
     uint32_t GetValidLifeTime() const;
 
     /**
-     * \brief Set the prefix valid life time.
-     * \param v the prefix valid life time
+     * @brief Set the prefix valid life time.
+     * @param v the prefix valid life time
      */
     void SetValidLifeTime(uint32_t v);
 
     /**
-     * \brief Test if the prefix is preferred.
-     * \return true if prefix is in preferred state, false otherwise
+     * @brief Test if the prefix is preferred.
+     * @return true if prefix is in preferred state, false otherwise
      */
     bool IsPreferred() const;
 
     /**
-     * \brief Test if the prefix is valid.
-     * \return true if prefix is in valid state, false otherwise
+     * @brief Test if the prefix is valid.
+     * @return true if prefix is in valid state, false otherwise
      */
     bool IsValid() const;
 
     /**
-     * \brief Set the prefix as preferred.
+     * @brief Set the prefix as preferred.
      */
     void SetPreferred();
 
     /**
-     * \brief Set the prefix as valid.
+     * @brief Set the prefix as valid.
      */
     void SetValid();
 
     /**
-     * \brief Start the preferred timer.
+     * @brief Start the preferred timer.
      */
     void StartPreferredTimer();
 
     /**
-     * \brief Start the valid timer.
+     * @brief Start the valid timer.
      */
     void StartValidTimer();
 
     /**
-     * \brief Stop the preferred timer.
+     * @brief Stop the preferred timer.
      */
     void StopPreferredTimer();
 
     /**
-     * \brief Stop the valid timer.
+     * @brief Stop the valid timer.
      */
     void StopValidTimer();
 
     /**
-     * \brief Set the prefix as preferred.
+     * @brief Set the prefix as preferred.
      */
     void MarkPreferredTime();
 
     /**
-     * \brief Set the prefix as valid.
+     * @brief Set the prefix as valid.
      */
     void MarkValidTime();
 
     /**
-     * \brief Signal that the preferred time expired and start the valid timer.
+     * @brief Signal that the preferred time expired and start the valid timer.
      */
     void FunctionPreferredTimeout();
 
     /**
-     * \brief Signal that the valid time expired.
+     * @brief Signal that the valid time expired.
      */
     void FunctionValidTimeout();
 
     /**
-     * \brief Remove this prefix from the prefix list.
+     * @brief Remove this prefix from the prefix list.
      */
     void RemoveMe();
 
     /**
-     * \brief Get the prefix identifier.
-     * \return id of the prefix.
+     * @brief Get the prefix identifier.
+     * @return id of the prefix.
      */
     uint32_t GetId() const;
 
     /**
-     * \brief Get the prefix address.
-     * \return prefix address
+     * @brief Get the prefix address.
+     * @return prefix address
      */
     Ipv6Address GetPrefix() const;
 
     /**
-     * \brief Set the prefix address.
-     * \param prefix prefix address to set
+     * @brief Set the prefix address.
+     * @param prefix prefix address to set
      */
     void SetPrefix(Ipv6Address prefix);
 
     /**
-     * \brief Get the bitmask prefix.
-     * \return bitmask prefix
+     * @brief Get the bitmask prefix.
+     * @return bitmask prefix
      */
     Ipv6Prefix GetMask() const;
 
     /**
-     * \brief Set the bitmask prefix.
-     * \param mask prefix
+     * @brief Set the bitmask prefix.
+     * @param mask prefix
      */
     void SetMask(Ipv6Prefix mask);
 
   private:
     /**
-     * \brief a static identifier.
+     * @brief a static identifier.
      */
     static uint32_t m_prefixId;
 
     /**
-     * \brief the identifier of this prefix.
+     * @brief the identifier of this prefix.
      */
     uint32_t m_id;
 
     /**
-     * \brief The node.
+     * @brief The node.
      */
     Ptr<Node> m_node;
 
     /**
-     * \brief The prefix IPv6 address.
+     * @brief The prefix IPv6 address.
      */
     Ipv6Address m_prefix;
 
     /**
-     * \brief The prefix bitmask (length).
+     * @brief The prefix bitmask (length).
      */
     Ipv6Prefix m_mask;
 
     /**
-     * \brief Default gateway router.
+     * @brief Default gateway router.
      *
      * If the RA received also configured the default gateway,
      * this variable has the link-local address. Otherwise this
@@ -233,38 +233,38 @@
     Ipv6Address m_defaultGatewayRouter;
 
     /**
-     * \brief The interface index (which is stored the address
+     * @brief The interface index (which is stored the address
      * corresponding of the prefix).
      */
     uint32_t m_interface;
 
     /**
-     * \brief the valid life time.
+     * @brief the valid life time.
      */
     uint32_t m_validLifeTime;
 
     /**
-     * \brief the preferred life time.
+     * @brief the preferred life time.
      */
     uint32_t m_preferredLifeTime;
 
     /**
-     * \brief true if the prefix is preferred.
+     * @brief true if the prefix is preferred.
      */
     bool m_preferred;
 
     /**
-     * \brief true if the prefix is valid.
+     * @brief true if the prefix is valid.
      */
     bool m_valid;
 
     /**
-     * \brief the timer for preferred life time.
+     * @brief the timer for preferred life time.
      */
     Timer m_preferredTimer;
 
     /**
-     * \brief the timer for valid life time.
+     * @brief the timer for valid life time.
      */
     Timer m_validTimer;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv6-end-point-demux.h ns-3.44/src/internet/model/ipv6-end-point-demux.h
--- ns-3.43/src/internet/model/ipv6-end-point-demux.h	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/ipv6-end-point-demux.h	2025-03-09 16:55:49.399371100 -0700
@@ -22,20 +22,20 @@
 class Ipv6EndPoint;
 
 /**
- * \ingroup ipv6
+ * @ingroup ipv6
  *
- * \brief Demultiplexer for end points.
+ * @brief Demultiplexer for end points.
  */
 class Ipv6EndPointDemux
 {
   public:
     /**
-     * \brief Container of the IPv6 endpoints.
+     * @brief Container of the IPv6 endpoints.
      */
     typedef std::list<Ipv6EndPoint*> EndPoints;
 
     /**
-     * \brief Iterator to the container of the IPv6 endpoints.
+     * @brief Iterator to the container of the IPv6 endpoints.
      */
     typedef std::list<Ipv6EndPoint*>::iterator EndPointsI;
 
@@ -43,23 +43,23 @@
     ~Ipv6EndPointDemux();
 
     /**
-     * \brief Lookup for port local.
-     * \param port port to test
-     * \return true if a port local is in EndPoints, false otherwise
+     * @brief Lookup for port local.
+     * @param port port to test
+     * @return true if a port local is in EndPoints, false otherwise
      */
     bool LookupPortLocal(uint16_t port);
 
     /**
-     * \brief Lookup for address and port.
-     * \param boundNetDevice Bound NetDevice (if any)
-     * \param addr address to test
-     * \param port port to test
-     * \return true if there is a match in EndPoints, false otherwise
+     * @brief Lookup for address and port.
+     * @param boundNetDevice Bound NetDevice (if any)
+     * @param addr address to test
+     * @param port port to test
+     * @return true if there is a match in EndPoints, false otherwise
      */
     bool LookupLocal(Ptr<NetDevice> boundNetDevice, Ipv6Address addr, uint16_t port);
 
     /**
-     * \brief lookup for a match with all the parameters.
+     * @brief lookup for a match with all the parameters.
      *
      * The function will return a list of most-matching EndPoints, in this order:
      *   -# Full match
@@ -69,12 +69,12 @@
      *
      * EndPoint with disabled Rx are skipped.
      *
-     * \param dst destination address to test
-     * \param dport destination port to test
-     * \param src source address to test
-     * \param sport source port to test
-     * \param incomingInterface the incoming interface
-     * \return list of IPv6EndPoints (could be 0 element)
+     * @param dst destination address to test
+     * @param dport destination port to test
+     * @param src source address to test
+     * @param sport source port to test
+     * @param incomingInterface the incoming interface
+     * @return list of IPv6EndPoints (could be 0 element)
      */
     EndPoints Lookup(Ipv6Address dst,
                      uint16_t dport,
@@ -83,53 +83,53 @@
                      Ptr<Ipv6Interface> incomingInterface);
 
     /**
-     * \brief Simple lookup for a four-tuple match.
-     * \param dst destination address to test
-     * \param dport destination port to test
-     * \param src source address to test
-     * \param sport source port to test
-     * \return match or 0 if not found
+     * @brief Simple lookup for a four-tuple match.
+     * @param dst destination address to test
+     * @param dport destination port to test
+     * @param src source address to test
+     * @param sport source port to test
+     * @return match or 0 if not found
      */
     Ipv6EndPoint* SimpleLookup(Ipv6Address dst, uint16_t dport, Ipv6Address src, uint16_t sport);
 
     /**
-     * \brief Allocate a Ipv6EndPoint.
-     * \return an empty Ipv6EndPoint instance
+     * @brief Allocate a Ipv6EndPoint.
+     * @return an empty Ipv6EndPoint instance
      */
     Ipv6EndPoint* Allocate();
 
     /**
-     * \brief Allocate a Ipv6EndPoint.
-     * \param address IPv6 address
-     * \return an Ipv6EndPoint instance
+     * @brief Allocate a Ipv6EndPoint.
+     * @param address IPv6 address
+     * @return an Ipv6EndPoint instance
      */
     Ipv6EndPoint* Allocate(Ipv6Address address);
 
     /**
-     * \brief Allocate a Ipv6EndPoint.
-     * \param boundNetDevice Bound NetDevice (if any)
-     * \param port local port
-     * \return an Ipv6EndPoint instance
+     * @brief Allocate a Ipv6EndPoint.
+     * @param boundNetDevice Bound NetDevice (if any)
+     * @param port local port
+     * @return an Ipv6EndPoint instance
      */
     Ipv6EndPoint* Allocate(Ptr<NetDevice> boundNetDevice, uint16_t port);
 
     /**
-     * \brief Allocate a Ipv6EndPoint.
-     * \param boundNetDevice Bound NetDevice (if any)
-     * \param address local address
-     * \param port local port
-     * \return an Ipv6EndPoint instance
+     * @brief Allocate a Ipv6EndPoint.
+     * @param boundNetDevice Bound NetDevice (if any)
+     * @param address local address
+     * @param port local port
+     * @return an Ipv6EndPoint instance
      */
     Ipv6EndPoint* Allocate(Ptr<NetDevice> boundNetDevice, Ipv6Address address, uint16_t port);
 
     /**
-     * \brief Allocate a Ipv6EndPoint.
-     * \param boundNetDevice Bound NetDevice (if any)
-     * \param localAddress local address
-     * \param localPort local port
-     * \param peerAddress peer address
-     * \param peerPort peer port
-     * \return an Ipv6EndPoint instance
+     * @brief Allocate a Ipv6EndPoint.
+     * @param boundNetDevice Bound NetDevice (if any)
+     * @param localAddress local address
+     * @param localPort local port
+     * @param peerAddress peer address
+     * @param peerPort peer port
+     * @return an Ipv6EndPoint instance
      */
     Ipv6EndPoint* Allocate(Ptr<NetDevice> boundNetDevice,
                            Ipv6Address localAddress,
@@ -138,41 +138,41 @@
                            uint16_t peerPort);
 
     /**
-     * \brief Remove a end point.
-     * \param endPoint the end point to remove
+     * @brief Remove a end point.
+     * @param endPoint the end point to remove
      */
     void DeAllocate(Ipv6EndPoint* endPoint);
 
     /**
-     * \brief Get the entire list of end points registered.
-     * \return list of Ipv6EndPoint
+     * @brief Get the entire list of end points registered.
+     * @return list of Ipv6EndPoint
      */
     EndPoints GetEndPoints() const;
 
   private:
     /**
-     * \brief Allocate a ephemeral port.
-     * \return a port
+     * @brief Allocate a ephemeral port.
+     * @return a port
      */
     uint16_t AllocateEphemeralPort();
 
     /**
-     * \brief The ephemeral port.
+     * @brief The ephemeral port.
      */
     uint16_t m_ephemeral;
 
     /**
-     * \brief The first ephemeral port.
+     * @brief The first ephemeral port.
      */
     uint16_t m_portFirst;
 
     /**
-     * \brief The last ephemeral port.
+     * @brief The last ephemeral port.
      */
     uint16_t m_portLast;
 
     /**
-     * \brief A list of IPv6 end points.
+     * @brief A list of IPv6 end points.
      */
     EndPoints m_endPoints;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv6-end-point.h ns-3.44/src/internet/model/ipv6-end-point.h
--- ns-3.43/src/internet/model/ipv6-end-point.h	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/ipv6-end-point.h	2025-03-09 16:55:49.399371100 -0700
@@ -25,9 +25,9 @@
 class Packet;
 
 /**
- * \ingroup ipv6
+ * @ingroup ipv6
  *
- * \brief A representation of an IPv6 endpoint/connection
+ * @brief A representation of an IPv6 endpoint/connection
  *
  * This class provides an Internet four-tuple (source and destination ports
  * and addresses).  These are used in the ns3::Ipv6EndPointDemux as targets
@@ -40,59 +40,59 @@
 {
   public:
     /**
-     * \brief Constructor.
-     * \param addr the IPv6 address
-     * \param port the port
+     * @brief Constructor.
+     * @param addr the IPv6 address
+     * @param port the port
      */
     Ipv6EndPoint(Ipv6Address addr, uint16_t port);
 
     ~Ipv6EndPoint();
 
     /**
-     * \brief Get the local address.
-     * \return the local address
+     * @brief Get the local address.
+     * @return the local address
      */
     Ipv6Address GetLocalAddress() const;
 
     /**
-     * \brief Set the local address.
-     * \param addr the address to set
+     * @brief Set the local address.
+     * @param addr the address to set
      */
     void SetLocalAddress(Ipv6Address addr);
 
     /**
-     * \brief Get the local port.
-     * \return the local port
+     * @brief Get the local port.
+     * @return the local port
      */
     uint16_t GetLocalPort() const;
 
     /**
-     * \brief Set the local port.
-     * \param port the port to set
+     * @brief Set the local port.
+     * @param port the port to set
      */
     void SetLocalPort(uint16_t port);
 
     /**
-     * \brief Get the peer address.
-     * \return the peer address
+     * @brief Get the peer address.
+     * @return the peer address
      */
     Ipv6Address GetPeerAddress() const;
 
     /**
-     * \brief Get the peer port.
-     * \return the peer port
+     * @brief Get the peer port.
+     * @return the peer port
      */
     uint16_t GetPeerPort() const;
 
     /**
-     * \brief Set the peer information (address and port).
-     * \param addr peer address
-     * \param port peer port
+     * @brief Set the peer information (address and port).
+     * @param addr peer address
+     * @param port peer port
      */
     void SetPeer(Ipv6Address addr, uint16_t port);
 
     /**
-     * \brief Bind a socket to specific device.
+     * @brief Bind a socket to specific device.
      *
      * This method corresponds to using setsockopt() SO_BINDTODEVICE
      * of real network or BSD sockets.   If set on a socket, this option will
@@ -107,50 +107,50 @@
      * is also possible to bind to mismatching device and address, even if
      * the socket can not receive any packets as a result.
      *
-     * \param netdevice Pointer to Netdevice of desired interface
+     * @param netdevice Pointer to Netdevice of desired interface
      */
     void BindToNetDevice(Ptr<NetDevice> netdevice);
 
     /**
-     * \brief Returns socket's bound netdevice, if any.
+     * @brief Returns socket's bound netdevice, if any.
      *
      * This method corresponds to using getsockopt() SO_BINDTODEVICE
      * of real network or BSD sockets.
      *
      *
-     * \returns Pointer to interface.
+     * @returns Pointer to interface.
      */
     Ptr<NetDevice> GetBoundNetDevice() const;
 
     /**
-     * \brief Set the reception callback.
-     * \param callback callback function
+     * @brief Set the reception callback.
+     * @param callback callback function
      */
     void SetRxCallback(
         Callback<void, Ptr<Packet>, Ipv6Header, uint16_t, Ptr<Ipv6Interface>> callback);
 
     /**
-     * \brief Set the ICMP callback.
-     * \param callback callback function
+     * @brief Set the ICMP callback.
+     * @param callback callback function
      */
     void SetIcmpCallback(Callback<void, Ipv6Address, uint8_t, uint8_t, uint8_t, uint32_t> callback);
 
     /**
-     * \brief Set the default destroy callback.
-     * \param callback callback function
+     * @brief Set the default destroy callback.
+     * @param callback callback function
      */
     void SetDestroyCallback(Callback<void> callback);
 
     /**
-     * \brief Forward the packet to the upper level.
+     * @brief Forward the packet to the upper level.
      *
      * Called from an L4Protocol implementation to notify an endpoint of a
      * packet reception.
      *
-     * \param p the packet
-     * \param header the packet header
-     * \param port source port
-     * \param incomingInterface incoming interface
+     * @param p the packet
+     * @param header the packet header
+     * @param port source port
+     * @param incomingInterface incoming interface
      */
     void ForwardUp(Ptr<Packet> p,
                    Ipv6Header header,
@@ -158,74 +158,74 @@
                    Ptr<Ipv6Interface> incomingInterface);
 
     /**
-     * \brief Forward the ICMP packet to the upper level.
+     * @brief Forward the ICMP packet to the upper level.
      *
      * Called from an L4Protocol implementation to notify an endpoint of
      * an icmp message reception.
      *
-     * \param src source IPv6 address
-     * \param ttl time-to-live
-     * \param type ICMPv6 type
-     * \param code ICMPv6 code
-     * \param info ICMPv6 info
+     * @param src source IPv6 address
+     * @param ttl time-to-live
+     * @param type ICMPv6 type
+     * @param code ICMPv6 code
+     * @param info ICMPv6 info
      */
     void ForwardIcmp(Ipv6Address src, uint8_t ttl, uint8_t type, uint8_t code, uint32_t info);
 
     /**
-     * \brief Enable or Disable the endpoint Rx capability.
-     * \param enabled true if Rx is enabled
+     * @brief Enable or Disable the endpoint Rx capability.
+     * @param enabled true if Rx is enabled
      */
     void SetRxEnabled(bool enabled);
 
     /**
-     * \brief Checks if the endpoint can receive packets.
-     * \returns true if the endpoint can receive packets.
+     * @brief Checks if the endpoint can receive packets.
+     * @returns true if the endpoint can receive packets.
      */
     bool IsRxEnabled() const;
 
   private:
     /**
-     * \brief The local address.
+     * @brief The local address.
      */
     Ipv6Address m_localAddr;
 
     /**
-     * \brief The local port.
+     * @brief The local port.
      */
     uint16_t m_localPort;
 
     /**
-     * \brief The peer address.
+     * @brief The peer address.
      */
     Ipv6Address m_peerAddr;
 
     /**
-     * \brief The peer port.
+     * @brief The peer port.
      */
     uint16_t m_peerPort;
 
     /**
-     * \brief The NetDevice the EndPoint is bound to (if any).
+     * @brief The NetDevice the EndPoint is bound to (if any).
      */
     Ptr<NetDevice> m_boundnetdevice;
 
     /**
-     * \brief The RX callback.
+     * @brief The RX callback.
      */
     Callback<void, Ptr<Packet>, Ipv6Header, uint16_t, Ptr<Ipv6Interface>> m_rxCallback;
 
     /**
-     * \brief The ICMPv6 callback.
+     * @brief The ICMPv6 callback.
      */
     Callback<void, Ipv6Address, uint8_t, uint8_t, uint8_t, uint32_t> m_icmpCallback;
 
     /**
-     * \brief The destroy callback.
+     * @brief The destroy callback.
      */
     Callback<void> m_destroyCallback;
 
     /**
-     * \brief true if the endpoint can receive packets.
+     * @brief true if the endpoint can receive packets.
      */
     bool m_rxEnabled;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv6-extension.cc ns-3.44/src/internet/model/ipv6-extension.cc
--- ns-3.43/src/internet/model/ipv6-extension.cc	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/ipv6-extension.cc	2025-03-09 16:55:49.399371100 -0700
@@ -1235,7 +1235,7 @@
 {
     NS_LOG_FUNCTION(this << packet << offset << ipv6Header << dst << nextHeader << isDropped);
 
-    /** \todo */
+    /** @todo */
 
     return 0;
 }
@@ -1278,7 +1278,7 @@
 {
     NS_LOG_FUNCTION(this << packet << offset << ipv6Header << dst << nextHeader << isDropped);
 
-    /** \todo */
+    /** @todo */
 
     return 1;
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv6-extension-demux.h ns-3.44/src/internet/model/ipv6-extension-demux.h
--- ns-3.43/src/internet/model/ipv6-extension-demux.h	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/ipv6-extension-demux.h	2025-03-09 16:55:49.399371100 -0700
@@ -21,73 +21,73 @@
 class Node;
 
 /**
- * \ingroup ipv6HeaderExt
+ * @ingroup ipv6HeaderExt
  *
- * \brief Demultiplexes IPv6 extensions.
+ * @brief Demultiplexes IPv6 extensions.
  */
 class Ipv6ExtensionDemux : public Object
 {
   public:
     /**
-     * \brief The interface ID.
-     * \return type ID
+     * @brief The interface ID.
+     * @return type ID
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Ipv6ExtensionDemux();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Ipv6ExtensionDemux() override;
 
     /**
-     * \brief Set the node.
-     * \param node the node to set
+     * @brief Set the node.
+     * @param node the node to set
      */
     void SetNode(Ptr<Node> node);
 
     /**
-     * \brief Insert a new IPv6 Extension.
-     * \param extension the extension to insert
+     * @brief Insert a new IPv6 Extension.
+     * @param extension the extension to insert
      */
     void Insert(Ptr<Ipv6Extension> extension);
 
     /**
-     * \brief Get the extension corresponding to extensionNumber.
-     * \param extensionNumber extension number of the extension to retrieve
-     * \return a matching IPv6 extension
+     * @brief Get the extension corresponding to extensionNumber.
+     * @param extensionNumber extension number of the extension to retrieve
+     * @return a matching IPv6 extension
      */
     Ptr<Ipv6Extension> GetExtension(uint8_t extensionNumber);
 
     /**
-     * \brief Remove an extension from this demux.
-     * \param extension pointer on the extension to remove
+     * @brief Remove an extension from this demux.
+     * @param extension pointer on the extension to remove
      */
     void Remove(Ptr<Ipv6Extension> extension);
 
   protected:
     /**
-     * \brief Dispose object.
+     * @brief Dispose object.
      */
     void DoDispose() override;
 
   private:
     /**
-     * \brief Container of the IPv6 Extensions.
+     * @brief Container of the IPv6 Extensions.
      */
     typedef std::list<Ptr<Ipv6Extension>> Ipv6ExtensionList_t;
 
     /**
-     * \brief List of IPv6 Extensions supported.
+     * @brief List of IPv6 Extensions supported.
      */
     Ipv6ExtensionList_t m_extensions;
 
     /**
-     * \brief The node.
+     * @brief The node.
      */
     Ptr<Node> m_node;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv6-extension.h ns-3.44/src/internet/model/ipv6-extension.h
--- ns-3.43/src/internet/model/ipv6-extension.h	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/ipv6-extension.h	2025-03-09 16:55:49.399371100 -0700
@@ -31,14 +31,14 @@
 {
 
 /**
- * \ingroup ipv6
- * \defgroup ipv6HeaderExt IPV6 Header extension system.
+ * @ingroup ipv6
+ * @defgroup ipv6HeaderExt IPV6 Header extension system.
  */
 
 /**
- * \ingroup ipv6HeaderExt
+ * @ingroup ipv6HeaderExt
  *
- * \brief IPv6 Extension base
+ * @brief IPv6 Extension base
  * If you want to implement a new IPv6 extension, all you have to do is
  * implement a subclass of this class and add it to an Ipv6ExtensionDemux.
  */
@@ -46,52 +46,52 @@
 {
   public:
     /**
-     * \brief Get the type identificator.
-     * \return type identificator
+     * @brief Get the type identificator.
+     * @return type identificator
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Ipv6Extension();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Ipv6Extension() override;
 
     /**
-     * \brief Set the node.
-     * \param node the node to set
+     * @brief Set the node.
+     * @param node the node to set
      */
     void SetNode(Ptr<Node> node);
 
     /**
-     * \brief Get the node.
-     * \return the node
+     * @brief Get the node.
+     * @return the node
      */
     Ptr<Node> GetNode() const;
 
     /**
-     * \brief Get the extension number.
-     * \return extension number
+     * @brief Get the extension number.
+     * @return extension number
      */
     virtual uint8_t GetExtensionNumber() const = 0;
 
     /**
-     * \brief Process method
+     * @brief Process method
      * Called from Ipv6L3Protocol::Receive.
      *
-     * \param packet the packet
-     * \param offset the offset of the extension to process
-     * \param ipv6Header the IPv6 header of packet received
-     * \param dst destination address of the packet received (i.e. us)
-     * \param nextHeader the next header
-     * \param stopProcessing true if the packet must not be further processed
-     * \param isDropped true if the packet must be dropped
-     * \param dropReason dropping reason
-     * \return the size processed
+     * @param packet the packet
+     * @param offset the offset of the extension to process
+     * @param ipv6Header the IPv6 header of packet received
+     * @param dst destination address of the packet received (i.e. us)
+     * @param nextHeader the next header
+     * @param stopProcessing true if the packet must not be further processed
+     * @param isDropped true if the packet must be dropped
+     * @param dropReason dropping reason
+     * @return the size processed
      */
     virtual uint8_t Process(Ptr<Packet>& packet,
                             uint8_t offset,
@@ -103,19 +103,19 @@
                             Ipv6L3Protocol::DropReason& dropReason) = 0;
 
     /**
-     * \brief Process options
+     * @brief Process options
      * Called by implementing classes to process the options
      *
-     * \param packet the packet
-     * \param offset the offset of the first option to process
-     * \param length the total length of all options (as specified in the extension header)
-     * \param ipv6Header the IPv6 header of packet received
-     * \param dst destination address of the packet received (i.e. us)
-     * \param nextHeader the next header
-     * \param stopProcessing true if the packet must not be further processed
-     * \param isDropped true if the packet must be dropped
-     * \param dropReason dropping reason
-     * \return the size processed
+     * @param packet the packet
+     * @param offset the offset of the first option to process
+     * @param length the total length of all options (as specified in the extension header)
+     * @param ipv6Header the IPv6 header of packet received
+     * @param dst destination address of the packet received (i.e. us)
+     * @param nextHeader the next header
+     * @param stopProcessing true if the packet must not be further processed
+     * @param isDropped true if the packet must be dropped
+     * @param dropReason dropping reason
+     * @return the size processed
      */
     virtual uint8_t ProcessOptions(Ptr<Packet>& packet,
                                    uint8_t offset,
@@ -132,56 +132,56 @@
      * used by this model.  Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream);
 
   protected:
     /**
-     * \brief Provides uniform random variables.
+     * @brief Provides uniform random variables.
      */
     Ptr<UniformRandomVariable> m_uvar;
 
   private:
     /**
-     * \brief The node.
+     * @brief The node.
      */
     Ptr<Node> m_node;
 };
 
 /**
- * \ingroup ipv6HeaderExt
+ * @ingroup ipv6HeaderExt
  *
- * \brief IPv6 Extension "Hop By Hop"
+ * @brief IPv6 Extension "Hop By Hop"
  */
 class Ipv6ExtensionHopByHop : public Ipv6Extension
 {
   public:
     /**
-     * \brief Hop-by-hop extension number.
+     * @brief Hop-by-hop extension number.
      */
     static const uint8_t EXT_NUMBER = 0;
 
     /**
-     * \brief Get the type identificator.
-     * \return type identificator
+     * @brief Get the type identificator.
+     * @return type identificator
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Ipv6ExtensionHopByHop();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Ipv6ExtensionHopByHop() override;
 
     /**
-     * \brief Get the extension number.
-     * \return extension number
+     * @brief Get the extension number.
+     * @return extension number
      */
     uint8_t GetExtensionNumber() const override;
 
@@ -196,37 +196,37 @@
 };
 
 /**
- * \ingroup ipv6HeaderExt
+ * @ingroup ipv6HeaderExt
  *
- * \brief IPv6 Extension Destination
+ * @brief IPv6 Extension Destination
  */
 class Ipv6ExtensionDestination : public Ipv6Extension
 {
   public:
     /**
-     * \brief Destination extension number.
+     * @brief Destination extension number.
      */
     static const uint8_t EXT_NUMBER = 60;
 
     /**
-     * \brief Get the type identificator.
-     * \return type identificator
+     * @brief Get the type identificator.
+     * @return type identificator
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Ipv6ExtensionDestination();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Ipv6ExtensionDestination() override;
 
     /**
-     * \brief Get the extension number.
-     * \return extension number
+     * @brief Get the extension number.
+     * @return extension number
      */
     uint8_t GetExtensionNumber() const override;
 
@@ -241,37 +241,37 @@
 };
 
 /**
- * \ingroup ipv6HeaderExt
+ * @ingroup ipv6HeaderExt
  *
- * \brief IPv6 Extension Fragment
+ * @brief IPv6 Extension Fragment
  */
 class Ipv6ExtensionFragment : public Ipv6Extension
 {
   public:
     /**
-     * \brief Fragmentation extension number.
+     * @brief Fragmentation extension number.
      */
     static const uint8_t EXT_NUMBER = 44;
 
     /**
-     * \brief Get the type identificator.
-     * \return type identificator
+     * @brief Get the type identificator.
+     * @return type identificator
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Ipv6ExtensionFragment();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Ipv6ExtensionFragment() override;
 
     /**
-     * \brief Get the extension number.
-     * \return extension number
+     * @brief Get the extension number.
+     * @return extension number
      */
     uint8_t GetExtensionNumber() const override;
 
@@ -285,18 +285,18 @@
                     Ipv6L3Protocol::DropReason& dropReason) override;
 
     /**
-     * \brief Pair of a packet and an Ipv6 header.
+     * @brief Pair of a packet and an Ipv6 header.
      */
     typedef std::pair<Ptr<Packet>, Ipv6Header> Ipv6PayloadHeaderPair;
 
     /**
-     * \brief Fragment a packet.
+     * @brief Fragment a packet.
      *
-     * \param packet the packet.
-     * \param ipv6Header the IPv6 header.
-     * \param fragmentSize the maximal size of the fragment (unfragmentable part + fragmentation
+     * @param packet the packet.
+     * @param ipv6Header the IPv6 header.
+     * @param fragmentSize the maximal size of the fragment (unfragmentable part + fragmentation
      * header + fragmentable part).
-     * \param listFragments the list of fragments.
+     * @param listFragments the list of fragments.
      */
     void GetFragments(Ptr<Packet> packet,
                       Ipv6Header ipv6Header,
@@ -305,7 +305,7 @@
 
   protected:
     /**
-     * \brief Dispose this object.
+     * @brief Dispose this object.
      */
     void DoDispose() override;
 
@@ -326,133 +326,133 @@
         FragmentsTimeoutsListI_t;
 
     /**
-     * \ingroup ipv6HeaderExt
+     * @ingroup ipv6HeaderExt
      *
-     * \brief This class stores the fragments of a packet waiting to be rebuilt.
+     * @brief This class stores the fragments of a packet waiting to be rebuilt.
      */
     class Fragments : public SimpleRefCount<Fragments>
     {
       public:
         /**
-         * \brief Constructor.
+         * @brief Constructor.
          */
         Fragments();
 
         /**
-         * \brief Destructor.
+         * @brief Destructor.
          */
         ~Fragments();
 
         /**
-         * \brief Add a fragment.
-         * \param fragment the fragment
-         * \param fragmentOffset the offset of the fragment
-         * \param moreFragment the bit "More Fragment"
+         * @brief Add a fragment.
+         * @param fragment the fragment
+         * @param fragmentOffset the offset of the fragment
+         * @param moreFragment the bit "More Fragment"
          */
         void AddFragment(Ptr<Packet> fragment, uint16_t fragmentOffset, bool moreFragment);
 
         /**
-         * \brief Set the unfragmentable part of the packet.
-         * \param unfragmentablePart the unfragmentable part
+         * @brief Set the unfragmentable part of the packet.
+         * @param unfragmentablePart the unfragmentable part
          */
         void SetUnfragmentablePart(Ptr<Packet> unfragmentablePart);
 
         /**
-         * \brief If all fragments have been added.
-         * \returns true if the packet is entire
+         * @brief If all fragments have been added.
+         * @returns true if the packet is entire
          */
         bool IsEntire() const;
 
         /**
-         * \brief Get the entire packet.
-         * \return the entire packet
+         * @brief Get the entire packet.
+         * @return the entire packet
          */
         Ptr<Packet> GetPacket() const;
 
         /**
-         * \brief Get the packet parts so far received.
-         * \return the partial packet
+         * @brief Get the packet parts so far received.
+         * @return the partial packet
          */
         Ptr<Packet> GetPartialPacket() const;
 
         /**
-         * \brief Set the Timeout iterator.
-         * \param iter The iterator.
+         * @brief Set the Timeout iterator.
+         * @param iter The iterator.
          */
         void SetTimeoutIter(FragmentsTimeoutsListI_t iter);
 
         /**
-         * \brief Get the Timeout iterator.
-         * \returns The iterator.
+         * @brief Get the Timeout iterator.
+         * @returns The iterator.
          */
         FragmentsTimeoutsListI_t GetTimeoutIter();
 
       private:
         /**
-         * \brief If other fragments will be sent.
+         * @brief If other fragments will be sent.
          */
         bool m_moreFragment;
 
         /**
-         * \brief The current fragments.
+         * @brief The current fragments.
          */
         std::list<std::pair<Ptr<Packet>, uint16_t>> m_packetFragments;
 
         /**
-         * \brief The unfragmentable part.
+         * @brief The unfragmentable part.
          */
         Ptr<Packet> m_unfragmentable;
 
         /**
-         * \brief Timeout iterator to "event" handler
+         * @brief Timeout iterator to "event" handler
          */
         FragmentsTimeoutsListI_t m_timeoutIter;
     };
 
     /**
-     * \brief Process the timeout for packet fragments
-     * \param key representing the packet fragments
-     * \param ipHeader the IP header of the original packet
+     * @brief Process the timeout for packet fragments
+     * @param key representing the packet fragments
+     * @param ipHeader the IP header of the original packet
      */
     void HandleFragmentsTimeout(FragmentKey_t key, Ipv6Header ipHeader);
 
     /**
-     * \brief Get the packet parts so far received.
-     * \return the partial packet
+     * @brief Get the packet parts so far received.
+     * @return the partial packet
      */
     Ptr<Packet> GetPartialPacket() const;
 
     /**
-     * \brief Set the Timeout EventId.
-     * \param event The event.
+     * @brief Set the Timeout EventId.
+     * @param event The event.
      */
     void SetTimeoutEventId(EventId event);
 
     /**
-     * \brief Cancel the timeout event
+     * @brief Cancel the timeout event
      */
     void CancelTimeout();
 
     /**
-     * \brief Container for the packet fragments.
+     * @brief Container for the packet fragments.
      */
     typedef std::map<FragmentKey_t, Ptr<Fragments>> MapFragments_t;
 
     /**
-     * \brief The hash of fragmented packets.
+     * @brief The hash of fragmented packets.
      */
     MapFragments_t m_fragments;
 
     /**
-     * \brief Set a new timeout "event" for a fragmented packet
-     * \param key the fragment identification
-     * \param ipHeader the IPv6 header of the fragmented packet
-     * \return an iterator to the inserted "event"
+     * @brief Set a new timeout "event" for a fragmented packet
+     * @param key the fragment identification
+     * @param ipHeader the IPv6 header of the fragmented packet
+     * @return an iterator to the inserted "event"
      */
     FragmentsTimeoutsListI_t SetTimeout(FragmentKey_t key, Ipv6Header ipHeader);
 
     /**
-     * \brief Handles a fragmented packet timeout
+     * @brief Handles a fragmented packet timeout
      */
     void HandleTimeout();
 
@@ -462,9 +462,9 @@
 };
 
 /**
- * \ingroup ipv6HeaderExt
+ * @ingroup ipv6HeaderExt
  *
- * \brief IPv6 Extension Routing.
+ * @brief IPv6 Extension Routing.
  *
  * If you want to implement a new IPv6 routing extension, all you have to do is
  * implement a subclass of this class and add it to an Ipv6ExtensionRoutingDemux.
@@ -473,42 +473,42 @@
 {
   public:
     /**
-     * \brief Routing extension number.
+     * @brief Routing extension number.
      */
     static const uint8_t EXT_NUMBER = 43;
 
     /**
-     * \brief Get the type identificator.
-     * \return type identificator
+     * @brief Get the type identificator.
+     * @return type identificator
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Ipv6ExtensionRouting();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Ipv6ExtensionRouting() override;
 
     /**
-     * \brief Get the extension number.
-     * \return extension number
+     * @brief Get the extension number.
+     * @return extension number
      */
     uint8_t GetExtensionNumber() const override;
 
     /**
-     * \brief Get the type of routing.
-     * \return type of routing
+     * @brief Get the type of routing.
+     * @return type of routing
      */
     virtual uint8_t GetTypeRouting() const;
 
     /**
-     * \brief Get a pointer to a new routing extension header.
+     * @brief Get a pointer to a new routing extension header.
      * The ownership is transferred to the caller.
-     * \return a pointer to a new routing extension header.
+     * @return a pointer to a new routing extension header.
      */
     virtual Ipv6ExtensionRoutingHeader* GetExtensionRoutingHeaderPtr();
 
@@ -523,117 +523,117 @@
 };
 
 /**
- * \ingroup ipv6HeaderExt
+ * @ingroup ipv6HeaderExt
  *
- * \brief IPv6 Extension Routing Demux.
+ * @brief IPv6 Extension Routing Demux.
  */
 class Ipv6ExtensionRoutingDemux : public Object
 {
   public:
     /**
-     * \brief The interface ID.
-     * \return type ID
+     * @brief The interface ID.
+     * @return type ID
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Ipv6ExtensionRoutingDemux();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Ipv6ExtensionRoutingDemux() override;
 
     /**
-     * \brief Set the node.
-     * \param node the node to set
+     * @brief Set the node.
+     * @param node the node to set
      */
     void SetNode(Ptr<Node> node);
 
     /**
-     * \brief Insert a new IPv6 Routing Extension.
-     * \param extensionRouting the routing extension to insert
+     * @brief Insert a new IPv6 Routing Extension.
+     * @param extensionRouting the routing extension to insert
      */
     void Insert(Ptr<Ipv6ExtensionRouting> extensionRouting);
 
     /**
-     * \brief Get the routing extension corresponding to typeRouting.
-     * \param typeRouting the number of the routing extension to retrieve
-     * \return a matching IPv6 routing extension
+     * @brief Get the routing extension corresponding to typeRouting.
+     * @param typeRouting the number of the routing extension to retrieve
+     * @return a matching IPv6 routing extension
      */
     Ptr<Ipv6ExtensionRouting> GetExtensionRouting(uint8_t typeRouting);
 
     /**
-     * \brief Get a pointer to a new routing extension header corresponding
+     * @brief Get a pointer to a new routing extension header corresponding
      * to typeRouting. The ownership is transferred to the caller.
-     * \param typeRouting the number of the routing extension to retrieve
-     * \return a pointer to a new routing extension header matching IPv6 routing extension
+     * @param typeRouting the number of the routing extension to retrieve
+     * @return a pointer to a new routing extension header matching IPv6 routing extension
      */
     Ipv6ExtensionRoutingHeader* GetExtensionRoutingHeaderPtr(uint8_t typeRouting);
 
     /**
-     * \brief Remove a routing extension from this demux.
-     * \param extensionRouting pointer on the extension to remove
+     * @brief Remove a routing extension from this demux.
+     * @param extensionRouting pointer on the extension to remove
      */
     void Remove(Ptr<Ipv6ExtensionRouting> extensionRouting);
 
   protected:
     /**
-     * \brief Dispose this object.
+     * @brief Dispose this object.
      */
     void DoDispose() override;
 
   private:
     /**
-     * \brief Container for the extension routing.
+     * @brief Container for the extension routing.
      */
     typedef std::list<Ptr<Ipv6ExtensionRouting>> Ipv6ExtensionRoutingList_t;
 
     /**
-     * \brief List of IPv6 Routing Extensions supported.
+     * @brief List of IPv6 Routing Extensions supported.
      */
     Ipv6ExtensionRoutingList_t m_extensionsRouting;
 
     /**
-     * \brief The node.
+     * @brief The node.
      */
     Ptr<Node> m_node;
 };
 
 /**
- * \ingroup ipv6HeaderExt
+ * @ingroup ipv6HeaderExt
  *
- * \brief IPv6 Extension Loose Routing
+ * @brief IPv6 Extension Loose Routing
  */
 class Ipv6ExtensionLooseRouting : public Ipv6ExtensionRouting
 {
   public:
     /**
-     * \brief Routing type.
+     * @brief Routing type.
      */
     static const uint8_t TYPE_ROUTING = 0;
 
     /**
-     * \brief Get the type identificator.
-     * \return type identificator
+     * @brief Get the type identificator.
+     * @return type identificator
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Ipv6ExtensionLooseRouting();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Ipv6ExtensionLooseRouting() override;
 
     /**
-     * \brief Get the type of routing.
-     * \return type of routing
+     * @brief Get the type of routing.
+     * @return type of routing
      */
     uint8_t GetTypeRouting() const override;
 
@@ -650,37 +650,37 @@
 };
 
 /**
- * \ingroup ipv6HeaderExt
+ * @ingroup ipv6HeaderExt
  *
- * \brief IPv6 Extension ESP (Encapsulating Security Payload)
+ * @brief IPv6 Extension ESP (Encapsulating Security Payload)
  */
 class Ipv6ExtensionESP : public Ipv6Extension
 {
   public:
     /**
-     * \brief ESP extension number.
+     * @brief ESP extension number.
      */
     static const uint8_t EXT_NUMBER = 50;
 
     /**
-     * \brief Get the type identificator.
-     * \return type identificator
+     * @brief Get the type identificator.
+     * @return type identificator
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Ipv6ExtensionESP();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Ipv6ExtensionESP() override;
 
     /**
-     * \brief Get the extension number.
-     * \return extension number
+     * @brief Get the extension number.
+     * @return extension number
      */
     uint8_t GetExtensionNumber() const override;
 
@@ -695,37 +695,37 @@
 };
 
 /**
- * \ingroup ipv6HeaderExt
+ * @ingroup ipv6HeaderExt
  *
- * \brief IPv6 Extension AH (Authentication Header)
+ * @brief IPv6 Extension AH (Authentication Header)
  */
 class Ipv6ExtensionAH : public Ipv6Extension
 {
   public:
     /**
-     * \brief AH extension number.
+     * @brief AH extension number.
      */
     static const uint8_t EXT_NUMBER = 51;
 
     /**
-     * \brief Get the type identificator.
-     * \return type identificator
+     * @brief Get the type identificator.
+     * @return type identificator
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Ipv6ExtensionAH();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Ipv6ExtensionAH() override;
 
     /**
-     * \brief Get the extension number.
-     * \return extension number
+     * @brief Get the extension number.
+     * @return extension number
      */
     uint8_t GetExtensionNumber() const override;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv6-extension-header.cc ns-3.44/src/internet/model/ipv6-extension-header.cc
--- ns-3.43/src/internet/model/ipv6-extension-header.cc	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/ipv6-extension-header.cc	2025-03-09 16:55:49.399371100 -0700
@@ -689,26 +689,26 @@
 void
 Ipv6ExtensionESPHeader::Print(std::ostream& os) const
 {
-    /** \todo */
+    /** @todo */
 }
 
 uint32_t
 Ipv6ExtensionESPHeader::GetSerializedSize() const
 {
-    /** \todo */
+    /** @todo */
     return 0;
 }
 
 void
 Ipv6ExtensionESPHeader::Serialize(Buffer::Iterator start) const
 {
-    /** \todo */
+    /** @todo */
 }
 
 uint32_t
 Ipv6ExtensionESPHeader::Deserialize(Buffer::Iterator start)
 {
-    /** \todo */
+    /** @todo */
     return 0;
 }
 
@@ -741,26 +741,26 @@
 void
 Ipv6ExtensionAHHeader::Print(std::ostream& os) const
 {
-    /** \todo */
+    /** @todo */
 }
 
 uint32_t
 Ipv6ExtensionAHHeader::GetSerializedSize() const
 {
-    /** \todo */
+    /** @todo */
     return 0;
 }
 
 void
 Ipv6ExtensionAHHeader::Serialize(Buffer::Iterator start) const
 {
-    /** \todo */
+    /** @todo */
 }
 
 uint32_t
 Ipv6ExtensionAHHeader::Deserialize(Buffer::Iterator start)
 {
-    /** \todo */
+    /** @todo */
     return 0;
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv6-extension-header.h ns-3.44/src/internet/model/ipv6-extension-header.h
--- ns-3.43/src/internet/model/ipv6-extension-header.h	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/ipv6-extension-header.h	2025-03-09 16:55:49.399371100 -0700
@@ -22,106 +22,106 @@
 {
 
 /**
- * \ingroup ipv6HeaderExt
+ * @ingroup ipv6HeaderExt
  *
- * \brief Header for IPv6 Extension.
+ * @brief Header for IPv6 Extension.
  */
 class Ipv6ExtensionHeader : public Header
 {
   public:
     /**
-     * \brief Get the type identificator.
-     * \return type identificator
+     * @brief Get the type identificator.
+     * @return type identificator
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
 
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Ipv6ExtensionHeader();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Ipv6ExtensionHeader() override;
 
     /**
-     * \brief Set the "Next header" field.
-     * \param nextHeader the next header number
+     * @brief Set the "Next header" field.
+     * @param nextHeader the next header number
      */
     void SetNextHeader(uint8_t nextHeader);
 
     /**
-     * \brief Get the next header.
-     * \return the next header number
+     * @brief Get the next header.
+     * @return the next header number
      */
     uint8_t GetNextHeader() const;
 
     /**
      * brief Set the length of the extension.
-     * \param length the length of the extension in bytes
+     * @param length the length of the extension in bytes
      */
     void SetLength(uint16_t length);
 
     /**
-     * \brief Get the length of the extension.
-     * \return the length of the extension
+     * @brief Get the length of the extension.
+     * @return the length of the extension
      */
     uint16_t GetLength() const;
 
     /**
-     * \brief Print some information about the packet.
-     * \param os output stream
+     * @brief Print some information about the packet.
+     * @param os output stream
      */
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Get the serialized size of the packet.
-     * \return size
+     * @brief Get the serialized size of the packet.
+     * @return size
      */
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Serialize the packet.
-     * \param start Buffer iterator
+     * @brief Serialize the packet.
+     * @param start Buffer iterator
      */
     void Serialize(Buffer::Iterator start) const override;
 
     /**
-     * \brief Deserialize the packet.
-     * \param start Buffer iterator
-     * \return size of the packet
+     * @brief Deserialize the packet.
+     * @param start Buffer iterator
+     * @return size of the packet
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
 
   protected:
     /**
-     * \brief The "length" field.
+     * @brief The "length" field.
      */
     uint8_t m_length;
 
   private:
     /**
-     * \brief The "next header" field.
+     * @brief The "next header" field.
      */
     uint8_t m_nextHeader;
 
     /**
-     * \brief The data of the extension.
+     * @brief The data of the extension.
      */
     Buffer m_data;
 };
 
 /**
- * \ingroup ipv6HeaderExt
+ * @ingroup ipv6HeaderExt
  *
- * \brief Option field for an IPv6ExtensionHeader.
+ * @brief Option field for an IPv6ExtensionHeader.
  *
  * Enables adding options to an IPv6ExtensionHeader.
  *
@@ -134,587 +134,587 @@
 {
   public:
     /**
-     * \brief Constructor.
-     * \param optionsOffset option offset
+     * @brief Constructor.
+     * @param optionsOffset option offset
      */
     OptionField(uint32_t optionsOffset);
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~OptionField();
 
     /**
-     * \brief Get the serialized size of the packet.
-     * \return size
+     * @brief Get the serialized size of the packet.
+     * @return size
      */
     uint32_t GetSerializedSize() const;
 
     /**
-     * \brief Serialize all added options.
-     * \param start Buffer iterator
+     * @brief Serialize all added options.
+     * @param start Buffer iterator
      */
     void Serialize(Buffer::Iterator start) const;
 
     /**
-     * \brief Deserialize the packet.
-     * \param start Buffer iterator
-     * \param length length
-     * \return size of the packet
+     * @brief Deserialize the packet.
+     * @param start Buffer iterator
+     * @param length length
+     * @return size of the packet
      */
     uint32_t Deserialize(Buffer::Iterator start, uint32_t length);
 
     /**
-     * \brief Serialize the option, prepending pad1 or padn option as necessary
-     * \param option the option header to serialize
+     * @brief Serialize the option, prepending pad1 or padn option as necessary
+     * @param option the option header to serialize
      */
     void AddOption(const Ipv6OptionHeader& option);
 
     /**
-     * \brief Get the offset where the options begin, measured from the start of
+     * @brief Get the offset where the options begin, measured from the start of
      * the extension header.
-     * \return the offset from the start of the extension header
+     * @return the offset from the start of the extension header
      */
     uint32_t GetOptionsOffset() const;
 
     /**
-     * \brief Get the buffer.
-     * \return buffer
+     * @brief Get the buffer.
+     * @return buffer
      */
     Buffer GetOptionBuffer();
 
   private:
     /**
-     * \brief Calculate padding.
-     * \param alignment alignment
-     * \return the number of pad bytes
+     * @brief Calculate padding.
+     * @param alignment alignment
+     * @return the number of pad bytes
      */
     uint32_t CalculatePad(Ipv6OptionHeader::Alignment alignment) const;
 
     /**
-     * \brief Data payload.
+     * @brief Data payload.
      */
     Buffer m_optionData;
 
     /**
-     * \brief Offset.
+     * @brief Offset.
      */
     uint32_t m_optionsOffset;
 };
 
 /**
- * \ingroup ipv6HeaderExt
+ * @ingroup ipv6HeaderExt
  *
- * \brief Header of IPv6 Extension "Hop by Hop"
+ * @brief Header of IPv6 Extension "Hop by Hop"
  */
 class Ipv6ExtensionHopByHopHeader : public Ipv6ExtensionHeader, public OptionField
 {
   public:
     /**
-     * \brief Get the type identificator.
-     * \return type identificator
+     * @brief Get the type identificator.
+     * @return type identificator
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
 
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Ipv6ExtensionHopByHopHeader();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Ipv6ExtensionHopByHopHeader() override;
 
     /**
-     * \brief Print some information about the packet.
-     * \param os output stream
+     * @brief Print some information about the packet.
+     * @param os output stream
      */
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Get the serialized size of the packet.
-     * \return size
+     * @brief Get the serialized size of the packet.
+     * @return size
      */
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Serialize the packet.
-     * \param start Buffer iterator
+     * @brief Serialize the packet.
+     * @param start Buffer iterator
      */
     void Serialize(Buffer::Iterator start) const override;
 
     /**
-     * \brief Deserialize the packet.
-     * \param start Buffer iterator
-     * \return size of the packet
+     * @brief Deserialize the packet.
+     * @param start Buffer iterator
+     * @return size of the packet
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
 };
 
 /**
- * \ingroup ipv6HeaderExt
+ * @ingroup ipv6HeaderExt
  *
- * \brief Header of IPv6 Extension Destination
+ * @brief Header of IPv6 Extension Destination
  */
 class Ipv6ExtensionDestinationHeader : public Ipv6ExtensionHeader, public OptionField
 {
   public:
     /**
-     * \brief Get the type identificator.
-     * \return type identificator
+     * @brief Get the type identificator.
+     * @return type identificator
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
 
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Ipv6ExtensionDestinationHeader();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Ipv6ExtensionDestinationHeader() override;
 
     /**
-     * \brief Print some information about the packet.
-     * \param os output stream
+     * @brief Print some information about the packet.
+     * @param os output stream
      */
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Get the serialized size of the packet.
-     * \return size
+     * @brief Get the serialized size of the packet.
+     * @return size
      */
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Serialize the packet.
-     * \param start Buffer iterator
+     * @brief Serialize the packet.
+     * @param start Buffer iterator
      */
     void Serialize(Buffer::Iterator start) const override;
 
     /**
-     * \brief Deserialize the packet.
-     * \param start Buffer iterator
-     * \return size of the packet
+     * @brief Deserialize the packet.
+     * @param start Buffer iterator
+     * @return size of the packet
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
 };
 
 /**
- * \ingroup ipv6HeaderExt
+ * @ingroup ipv6HeaderExt
  *
- * \brief Header of IPv6 Extension Fragment
+ * @brief Header of IPv6 Extension Fragment
  */
 class Ipv6ExtensionFragmentHeader : public Ipv6ExtensionHeader
 {
   public:
     /**
-     * \brief Get the type identificator.
-     * \return type identificator
+     * @brief Get the type identificator.
+     * @return type identificator
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
 
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Ipv6ExtensionFragmentHeader();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Ipv6ExtensionFragmentHeader() override;
 
     /**
-     * \brief Set the "Offset" field.
-     * \param offset the offset of the fragment
+     * @brief Set the "Offset" field.
+     * @param offset the offset of the fragment
      */
     void SetOffset(uint16_t offset);
 
     /**
-     * \brief Get the field "Offset".
-     * \return the offset of the fragment
+     * @brief Get the field "Offset".
+     * @return the offset of the fragment
      */
     uint16_t GetOffset() const;
 
     /**
-     * \brief Set the status of "More Fragment" bit.
-     * \param moreFragment the bit "More Fragment"
+     * @brief Set the status of "More Fragment" bit.
+     * @param moreFragment the bit "More Fragment"
      */
     void SetMoreFragment(bool moreFragment);
 
     /**
-     * \brief Get the status of "More Fragment" bit.
-     * \return the status of "More Fragment" bit.
+     * @brief Get the status of "More Fragment" bit.
+     * @return the status of "More Fragment" bit.
      */
     bool GetMoreFragment() const;
 
     /**
-     * \brief Set the "Identification" field.
-     * \param identification the identifier of the fragment
+     * @brief Set the "Identification" field.
+     * @param identification the identifier of the fragment
      */
     void SetIdentification(uint32_t identification);
 
     /**
-     * \brief Get the field "Identification".
-     * \return the identifier of the fragment
+     * @brief Get the field "Identification".
+     * @return the identifier of the fragment
      */
     uint32_t GetIdentification() const;
 
     /**
-     * \brief Print some information about the packet.
-     * \param os output stream
+     * @brief Print some information about the packet.
+     * @param os output stream
      */
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Get the serialized size of the packet.
-     * \return size
+     * @brief Get the serialized size of the packet.
+     * @return size
      */
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Serialize the packet.
-     * \param start Buffer iterator
+     * @brief Serialize the packet.
+     * @param start Buffer iterator
      */
     void Serialize(Buffer::Iterator start) const override;
 
     /**
-     * \brief Deserialize the packet.
-     * \param start Buffer iterator
-     * \return size of the packet
+     * @brief Deserialize the packet.
+     * @param start Buffer iterator
+     * @return size of the packet
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
 
   private:
     /**
-     * \brief Offset of the fragment and More Fragment bit.
+     * @brief Offset of the fragment and More Fragment bit.
      */
     uint16_t m_offset;
 
     /**
-     * \brief Identifier of the packet.
+     * @brief Identifier of the packet.
      */
     uint32_t m_identification;
 };
 
 /**
- * \ingroup ipv6HeaderExt
+ * @ingroup ipv6HeaderExt
  *
- * \brief Header of IPv6 Extension Routing
+ * @brief Header of IPv6 Extension Routing
  */
 class Ipv6ExtensionRoutingHeader : public Ipv6ExtensionHeader
 {
   public:
     /**
-     * \brief Get the type identificator.
-     * \return type identificator
+     * @brief Get the type identificator.
+     * @return type identificator
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
 
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Ipv6ExtensionRoutingHeader();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Ipv6ExtensionRoutingHeader() override;
 
     /**
-     * \brief Set the "Type of Routing" field.
-     * \param typeRouting the type of routing
+     * @brief Set the "Type of Routing" field.
+     * @param typeRouting the type of routing
      */
     void SetTypeRouting(uint8_t typeRouting);
 
     /**
-     * \brief Get the field "Type of Routing".
-     * \return the type of routing
+     * @brief Get the field "Type of Routing".
+     * @return the type of routing
      */
     uint8_t GetTypeRouting() const;
 
     /**
-     * \brief Set the "Segments left" field.
-     * \param segmentsLeft the number of segments left
+     * @brief Set the "Segments left" field.
+     * @param segmentsLeft the number of segments left
      */
     void SetSegmentsLeft(uint8_t segmentsLeft);
 
     /**
-     * \brief Get the field "Segments left".
-     * \return the number of segments left
+     * @brief Get the field "Segments left".
+     * @return the number of segments left
      */
     uint8_t GetSegmentsLeft() const;
 
     /**
-     * \brief Print some information about the packet.
-     * \param os output stream
+     * @brief Print some information about the packet.
+     * @param os output stream
      */
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Get the serialized size of the packet.
-     * \return size
+     * @brief Get the serialized size of the packet.
+     * @return size
      */
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Serialize the packet.
-     * \param start Buffer iterator
+     * @brief Serialize the packet.
+     * @param start Buffer iterator
      */
     void Serialize(Buffer::Iterator start) const override;
 
     /**
-     * \brief Deserialize the packet.
-     * \param start Buffer iterator
-     * \return size of the packet
+     * @brief Deserialize the packet.
+     * @param start Buffer iterator
+     * @return size of the packet
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
 
   private:
     /**
-     * \brief Type of routing.
+     * @brief Type of routing.
      */
     uint8_t m_typeRouting;
 
     /**
-     * \brief Number of left segments.
+     * @brief Number of left segments.
      */
     uint8_t m_segmentsLeft;
 };
 
 /**
- * \ingroup ipv6HeaderExt
+ * @ingroup ipv6HeaderExt
  *
- * \brief Header of IPv6 Extension Routing : Type 0 (Loose Routing)
+ * @brief Header of IPv6 Extension Routing : Type 0 (Loose Routing)
  */
 class Ipv6ExtensionLooseRoutingHeader : public Ipv6ExtensionRoutingHeader
 {
   public:
     /**
-     * \brief Get the type identificator.
-     * \return type identificator
+     * @brief Get the type identificator.
+     * @return type identificator
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
 
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Ipv6ExtensionLooseRoutingHeader();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Ipv6ExtensionLooseRoutingHeader() override;
 
     /**
-     * \brief Set the number of routers' address.
-     * \param n the number of routers' address
+     * @brief Set the number of routers' address.
+     * @param n the number of routers' address
      */
     void SetNumberAddress(uint8_t n);
 
     /**
-     * \brief Set the vector of routers' address
-     * \param routersAddress the vector of routers's address
+     * @brief Set the vector of routers' address
+     * @param routersAddress the vector of routers's address
      */
     void SetRoutersAddress(std::vector<Ipv6Address> routersAddress);
 
     /**
-     * \brief Get the vector of routers' address
-     * \return the vector of routers' address
+     * @brief Get the vector of routers' address
+     * @return the vector of routers' address
      */
     std::vector<Ipv6Address> GetRoutersAddress() const;
 
     /**
-     * \brief Set a Router IPv6 Address.
-     * \param index the index of the IPv6 Address
-     * \param addr the new IPv6 Address
+     * @brief Set a Router IPv6 Address.
+     * @param index the index of the IPv6 Address
+     * @param addr the new IPv6 Address
      */
     void SetRouterAddress(uint8_t index, Ipv6Address addr);
 
     /**
-     * \brief Get a Router IPv6 Address.
-     * \param index the index of the IPv6 Address
-     * \return the router IPv6 Address
+     * @brief Get a Router IPv6 Address.
+     * @param index the index of the IPv6 Address
+     * @return the router IPv6 Address
      */
     Ipv6Address GetRouterAddress(uint8_t index) const;
 
     /**
-     * \brief Print some information about the packet.
-     * \param os output stream
+     * @brief Print some information about the packet.
+     * @param os output stream
      */
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Get the serialized size of the packet.
-     * \return size
+     * @brief Get the serialized size of the packet.
+     * @return size
      */
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Serialize the packet.
-     * \param start Buffer iterator
+     * @brief Serialize the packet.
+     * @param start Buffer iterator
      */
     void Serialize(Buffer::Iterator start) const override;
 
     /**
-     * \brief Deserialize the packet.
-     * \param start Buffer iterator
-     * \return size of the packet
+     * @brief Deserialize the packet.
+     * @param start Buffer iterator
+     * @return size of the packet
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
 
   private:
     /**
-     * \brief A vector of IPv6 Address.
+     * @brief A vector of IPv6 Address.
      */
     typedef std::vector<Ipv6Address> VectorIpv6Address_t;
 
     /**
-     * \brief The vector of Routers' IPv6 Address.
+     * @brief The vector of Routers' IPv6 Address.
      */
     VectorIpv6Address_t m_routersAddress;
 };
 
 /**
- * \ingroup ipv6HeaderExt
+ * @ingroup ipv6HeaderExt
  *
- * \brief Header of IPv6 Extension ESP
+ * @brief Header of IPv6 Extension ESP
  */
 class Ipv6ExtensionESPHeader : public Ipv6ExtensionHeader
 {
   public:
     /**
-     * \brief Get the type identificator.
-     * \return type identificator
+     * @brief Get the type identificator.
+     * @return type identificator
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
 
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Ipv6ExtensionESPHeader();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Ipv6ExtensionESPHeader() override;
 
     /**
-     * \brief Print some information about the packet.
-     * \param os output stream
+     * @brief Print some information about the packet.
+     * @param os output stream
      */
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Get the serialized size of the packet.
-     * \return size
+     * @brief Get the serialized size of the packet.
+     * @return size
      */
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Serialize the packet.
-     * \param start Buffer iterator
+     * @brief Serialize the packet.
+     * @param start Buffer iterator
      */
     void Serialize(Buffer::Iterator start) const override;
 
     /**
-     * \brief Deserialize the packet.
-     * \param start Buffer iterator
-     * \return size of the packet
+     * @brief Deserialize the packet.
+     * @param start Buffer iterator
+     * @return size of the packet
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
 };
 
 /**
- * \ingroup ipv6HeaderExt
+ * @ingroup ipv6HeaderExt
  *
- * \brief Header of IPv6 Extension AH
+ * @brief Header of IPv6 Extension AH
  */
 class Ipv6ExtensionAHHeader : public Ipv6ExtensionHeader
 {
   public:
     /**
-     * \brief Get the type identificator.
-     * \return type identificator
+     * @brief Get the type identificator.
+     * @return type identificator
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
 
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Ipv6ExtensionAHHeader();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Ipv6ExtensionAHHeader() override;
 
     /**
-     * \brief Print some information about the packet.
-     * \param os output stream
+     * @brief Print some information about the packet.
+     * @param os output stream
      */
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Get the serialized size of the packet.
-     * \return size
+     * @brief Get the serialized size of the packet.
+     * @return size
      */
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Serialize the packet.
-     * \param start Buffer iterator
+     * @brief Serialize the packet.
+     * @param start Buffer iterator
      */
     void Serialize(Buffer::Iterator start) const override;
 
     /**
-     * \brief Deserialize the packet.
-     * \param start Buffer iterator
-     * \return size of the packet
+     * @brief Deserialize the packet.
+     * @param start Buffer iterator
+     * @return size of the packet
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv6.h ns-3.44/src/internet/model/ipv6.h
--- ns-3.43/src/internet/model/ipv6.h	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/ipv6.h	2025-03-09 16:55:49.403371000 -0700
@@ -31,13 +31,13 @@
 class Ipv6Route;
 
 /**
- * \ingroup internet
- * \defgroup ipv6 IPv6 classes and sub-modules
+ * @ingroup internet
+ * @defgroup ipv6 IPv6 classes and sub-modules
  */
 
 /**
- * \ingroup ipv6
- * \brief Access to the IPv6 forwarding table, interfaces, and configuration
+ * @ingroup ipv6
+ * @brief Access to the IPv6 forwarding table, interfaces, and configuration
  *
  * This class defines the API to manipulate the following aspects of
  * the IPv6 implementation:
@@ -64,70 +64,70 @@
  *
  * TO DO:  Add API to allow access to the IPv6 neighbor table
  *
- * \see Ipv6RoutingProtocol
- * \see Ipv6InterfaceAddress
+ * @see Ipv6RoutingProtocol
+ * @see Ipv6InterfaceAddress
  */
 class Ipv6 : public Object
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Ipv6();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Ipv6() override;
 
     /**
-     * \brief Register a new routing protocol to be used by this IPv6 stack
+     * @brief Register a new routing protocol to be used by this IPv6 stack
      *
      * This call will replace any routing protocol that has been previously
      * registered.  If you want to add multiple routing protocols, you must
      * add them to a Ipv6ListRoutingProtocol directly.
      *
-     * \param routingProtocol smart pointer to Ipv6RoutingProtocol object
+     * @param routingProtocol smart pointer to Ipv6RoutingProtocol object
      */
     virtual void SetRoutingProtocol(Ptr<Ipv6RoutingProtocol> routingProtocol) = 0;
 
     /**
-     * \brief Get the routing protocol to be used by this IPv6 stack
+     * @brief Get the routing protocol to be used by this IPv6 stack
      *
-     * \returns smart pointer to Ipv6RoutingProtocol object, or null pointer if none
+     * @returns smart pointer to Ipv6RoutingProtocol object, or null pointer if none
      */
     virtual Ptr<Ipv6RoutingProtocol> GetRoutingProtocol() const = 0;
 
     /**
-     * \brief Add a NetDevice interface.
+     * @brief Add a NetDevice interface.
      *
      * Once a device has been added, it can never be removed: if you want
      * to disable it, you can invoke Ipv6::SetDown which will
      * make sure that it is never used during packet forwarding.
-     * \param device device to add to the list of IPv6 interfaces
+     * @param device device to add to the list of IPv6 interfaces
      *        which can be used as output interfaces during packet forwarding.
-     * \returns the index of the IPv6 interface added.
+     * @returns the index of the IPv6 interface added.
      */
     virtual uint32_t AddInterface(Ptr<NetDevice> device) = 0;
 
     /**
-     * \brief Get number of interfaces.
-     * \returns the number of interfaces added by the user.
+     * @brief Get number of interfaces.
+     * @returns the number of interfaces added by the user.
      */
     virtual uint32_t GetNInterfaces() const = 0;
 
     /**
-     * \brief Return the interface number of the interface that has been
+     * @brief Return the interface number of the interface that has been
      *        assigned the specified IP address.
      *
-     * \param address The IP address being searched for
-     * \returns The interface number of the IPv6 interface with the given
+     * @param address The IP address being searched for
+     * @returns The interface number of the IPv6 interface with the given
      *          address or -1 if not found.
      *
      * Each IP interface has one or more IP addresses associated with it.
@@ -139,13 +139,13 @@
     virtual int32_t GetInterfaceForAddress(Ipv6Address address) const = 0;
 
     /**
-     * \brief Return the interface number of first interface found that
+     * @brief Return the interface number of first interface found that
      *  has an IPv6 address within the prefix specified by the input
      *  address and mask parameters
      *
-     * \param address The IP address assigned to the interface of interest.
-     * \param mask The IP prefix to use in the mask
-     * \returns The interface number of the IPv6 interface with the given
+     * @param address The IP address assigned to the interface of interest.
+     * @param mask The IP prefix to use in the mask
+     * @returns The interface number of the IPv6 interface with the given
      *          address or -1 if not found.
      *
      * Each IP interface has one or more IP addresses associated with it.
@@ -157,161 +157,161 @@
     virtual int32_t GetInterfaceForPrefix(Ipv6Address address, Ipv6Prefix mask) const = 0;
 
     /**
-     * \brief Get the NetDevice of the specified interface number.
-     * \param interface The interface number of an IPv6 interface.
-     * \returns The NetDevice associated with the IPv6 interface number.
+     * @brief Get the NetDevice of the specified interface number.
+     * @param interface The interface number of an IPv6 interface.
+     * @returns The NetDevice associated with the IPv6 interface number.
      */
     virtual Ptr<NetDevice> GetNetDevice(uint32_t interface) = 0;
 
     /**
-     * \brief Get the interface index of the specified NetDevice.
-     * \param device The NetDevice for an Ipv6Interface
-     * \returns The interface number of an IPv6 interface or -1 if not found.
+     * @brief Get the interface index of the specified NetDevice.
+     * @param device The NetDevice for an Ipv6Interface
+     * @returns The interface number of an IPv6 interface or -1 if not found.
      */
     virtual int32_t GetInterfaceForDevice(Ptr<const NetDevice> device) const = 0;
 
     /**
-     * \brief Add an address on the specified IPv6 interface.
-     * \param interface Interface number of an IPv6 interface
-     * \param address Ipv6InterfaceAddress address to associate with the underlying IPv6 interface
-     * \param addOnLinkRoute add on-link route to the network (default true)
-     * \returns true if the operation succeeded
+     * @brief Add an address on the specified IPv6 interface.
+     * @param interface Interface number of an IPv6 interface
+     * @param address Ipv6InterfaceAddress address to associate with the underlying IPv6 interface
+     * @param addOnLinkRoute add on-link route to the network (default true)
+     * @returns true if the operation succeeded
      */
     virtual bool AddAddress(uint32_t interface,
                             Ipv6InterfaceAddress address,
                             bool addOnLinkRoute = true) = 0;
 
     /**
-     * \brief Get number of addresses on specified IPv6 interface.
-     * \param interface Interface number of an IPv6 interface
-     * \returns the number of Ipv6InterfaceAddress entries for the interface.
+     * @brief Get number of addresses on specified IPv6 interface.
+     * @param interface Interface number of an IPv6 interface
+     * @returns the number of Ipv6InterfaceAddress entries for the interface.
      */
     virtual uint32_t GetNAddresses(uint32_t interface) const = 0;
 
     /**
-     * \brief Get IPv6 address on specified IPv6 interface.
+     * @brief Get IPv6 address on specified IPv6 interface.
      *
      * Because addresses can be removed, the addressIndex is not guaranteed
      * to be static across calls to this method.
      *
-     * \param interface Interface number of an IPv6 interface
-     * \param addressIndex index of Ipv6InterfaceAddress
-     * \returns the Ipv6InterfaceAddress associated to the interface and addressIndex
+     * @param interface Interface number of an IPv6 interface
+     * @param addressIndex index of Ipv6InterfaceAddress
+     * @returns the Ipv6InterfaceAddress associated to the interface and addressIndex
      */
     virtual Ipv6InterfaceAddress GetAddress(uint32_t interface, uint32_t addressIndex) const = 0;
 
     /**
-     * \brief Remove an address on specified IPv6 interface.
+     * @brief Remove an address on specified IPv6 interface.
      *
      * Remove the address at addressIndex on named interface.  The addressIndex
      * for all higher indices will decrement by one after this method is called;
      * so, for example, to remove 5 addresses from an interface i, one could
      * call RemoveAddress (i, 0); 5 times.
      *
-     * \param interface Interface number of an IPv6 interface
-     * \param addressIndex index of Ipv6InterfaceAddress to remove
-     * \returns true if the operation succeeded
+     * @param interface Interface number of an IPv6 interface
+     * @param addressIndex index of Ipv6InterfaceAddress to remove
+     * @returns true if the operation succeeded
      */
     virtual bool RemoveAddress(uint32_t interface, uint32_t addressIndex) = 0;
 
     /**
-     * \brief Remove the given address on named Ipv6 interface
+     * @brief Remove the given address on named Ipv6 interface
      *
-     * \param interface Interface number of an IPv6 interface
-     * \param address the address to remove
-     * \returns true if the operation succeeded
+     * @param interface Interface number of an IPv6 interface
+     * @param address the address to remove
+     * @returns true if the operation succeeded
      */
     virtual bool RemoveAddress(uint32_t interface, Ipv6Address address) = 0;
 
     /**
-     * \brief Set metric on specified Ipv6 interface.
+     * @brief Set metric on specified Ipv6 interface.
      *
-     * \param interface The interface number of an IPv6 interface
-     * \param metric routing metric (cost) associated to the underlying
+     * @param interface The interface number of an IPv6 interface
+     * @param metric routing metric (cost) associated to the underlying
      *          IPv6 interface
      */
     virtual void SetMetric(uint32_t interface, uint16_t metric) = 0;
 
     /**
-     * \brief Get metric for the specified IPv6 interface.
+     * @brief Get metric for the specified IPv6 interface.
      *
-     * \param interface The interface number of an IPv6 interface
-     * \returns routing metric (cost) associated to the underlying
+     * @param interface The interface number of an IPv6 interface
+     * @returns routing metric (cost) associated to the underlying
      *          IPv6 interface
      */
     virtual uint16_t GetMetric(uint32_t interface) const = 0;
 
     /**
-     * \brief Get MTU for the specified IPv6 interface.
-     * \param interface Interface number of IPv6 interface
-     * \returns the Maximum Transmission Unit (in bytes) associated
+     * @brief Get MTU for the specified IPv6 interface.
+     * @param interface Interface number of IPv6 interface
+     * @returns the Maximum Transmission Unit (in bytes) associated
      *          to the underlying IPv6 interface
      */
     virtual uint16_t GetMtu(uint32_t interface) const = 0;
 
     /**
-     * \brief Set the Path MTU for the specified IPv6 destination address.
-     * \param dst Ipv6 destination address
-     * \param pmtu the Path MTU
+     * @brief Set the Path MTU for the specified IPv6 destination address.
+     * @param dst Ipv6 destination address
+     * @param pmtu the Path MTU
      */
     virtual void SetPmtu(Ipv6Address dst, uint32_t pmtu) = 0;
 
     /**
-     * \brief If the specified interface index is in "up" state.
-     * \param interface Interface number of IPv6 interface
-     * \returns true if the underlying interface is in the "up" state,
+     * @brief If the specified interface index is in "up" state.
+     * @param interface Interface number of IPv6 interface
+     * @returns true if the underlying interface is in the "up" state,
      *          false otherwise.
      */
     virtual bool IsUp(uint32_t interface) const = 0;
 
     /**
-     * \brief Set the interface into the "up" state.
+     * @brief Set the interface into the "up" state.
      *
      * In this state, it is considered valid during IPv6 forwarding.
-     * \param interface Interface number of IPv6 interface
+     * @param interface Interface number of IPv6 interface
      */
     virtual void SetUp(uint32_t interface) = 0;
 
     /**
-     * \brief Set the interface into the "down" state.
+     * @brief Set the interface into the "down" state.
      *
      * In this state, it is ignored during IPv6 forwarding.
-     * \param interface Interface number of IPv6 interface
+     * @param interface Interface number of IPv6 interface
      */
     virtual void SetDown(uint32_t interface) = 0;
 
     /**
-     * \brief If the specified IPv6 interface has forwarding enabled.
-     * \param interface Interface number of IPv6 interface
-     * \returns true if IPv6 forwarding enabled for input datagrams on this device
+     * @brief If the specified IPv6 interface has forwarding enabled.
+     * @param interface Interface number of IPv6 interface
+     * @returns true if IPv6 forwarding enabled for input datagrams on this device
      */
     virtual bool IsForwarding(uint32_t interface) const = 0;
 
     /**
-     * \brief Set forwarding on specified IPv6 interface.
-     * \param interface Interface number of IPv6 interface
-     * \param val Value to set the forwarding flag
+     * @brief Set forwarding on specified IPv6 interface.
+     * @param interface Interface number of IPv6 interface
+     * @param val Value to set the forwarding flag
      *
      * If set to true, IPv6 forwarding is enabled for input datagrams on this device
      */
     virtual void SetForwarding(uint32_t interface, bool val) = 0;
 
     /**
-     * \brief Choose the source address to use with destination address.
-     * \param interface interface index
-     * \param dest IPv6 destination address
-     * \return IPv6 source address to use
+     * @brief Choose the source address to use with destination address.
+     * @param interface interface index
+     * @param dest IPv6 destination address
+     * @return IPv6 source address to use
      */
     virtual Ipv6Address SourceAddressSelection(uint32_t interface, Ipv6Address dest) = 0;
 
     /**
-     * \brief Add a L4 protocol.
-     * \param protocol L4 protocol
+     * @brief Add a L4 protocol.
+     * @param protocol L4 protocol
      */
     virtual void Insert(Ptr<IpL4Protocol> protocol) = 0;
 
     /**
-     * \brief Add a L4 protocol to a specific interface.
+     * @brief Add a L4 protocol to a specific interface.
      *
      * This may be called multiple times for multiple interfaces for the same
      * protocol.  To insert for all interfaces, use the separate
@@ -320,50 +320,50 @@
      * Setting a protocol on a specific interface will overwrite the
      * previously bound protocol.
      *
-     * \param protocol L4 protocol.
-     * \param interfaceIndex interface index.
+     * @param protocol L4 protocol.
+     * @param interfaceIndex interface index.
      */
     virtual void Insert(Ptr<IpL4Protocol> protocol, uint32_t interfaceIndex) = 0;
 
     /**
-     * \brief Remove a L4 protocol.
-     * \param protocol L4 protocol to remove.
+     * @brief Remove a L4 protocol.
+     * @param protocol L4 protocol to remove.
      */
     virtual void Remove(Ptr<IpL4Protocol> protocol) = 0;
 
     /**
-     * \brief Remove a L4 protocol from a specific interface.
-     * \param protocol L4 protocol to remove.
-     * \param interfaceIndex interface index.
+     * @brief Remove a L4 protocol from a specific interface.
+     * @param protocol L4 protocol to remove.
+     * @param interfaceIndex interface index.
      */
     virtual void Remove(Ptr<IpL4Protocol> protocol, uint32_t interfaceIndex) = 0;
 
     /**
-     * \brief Get L4 protocol by protocol number.
-     * \param protocolNumber protocol number
-     * \return corresponding IpL4Protocol or 0 if not found
+     * @brief Get L4 protocol by protocol number.
+     * @param protocolNumber protocol number
+     * @return corresponding IpL4Protocol or 0 if not found
      */
     virtual Ptr<IpL4Protocol> GetProtocol(int protocolNumber) const = 0;
 
     /**
-     * \brief Get L4 protocol by protocol number for the specified interface.
-     * \param protocolNumber protocol number
-     * \param interfaceIndex interface index, -1 means "any" interface.
-     * \return corresponding IpL4Protocol or 0 if not found
+     * @brief Get L4 protocol by protocol number for the specified interface.
+     * @param protocolNumber protocol number
+     * @param interfaceIndex interface index, -1 means "any" interface.
+     * @return corresponding IpL4Protocol or 0 if not found
      */
     virtual Ptr<IpL4Protocol> GetProtocol(int protocolNumber, int32_t interfaceIndex) const = 0;
 
     /**
-     * \brief Higher-level layers call this method to send a packet
+     * @brief Higher-level layers call this method to send a packet
      * down the stack to the MAC and PHY layers. All PMTU values are
      * stored at this level, so packet size calculations should be
      * done mathematically at higher levels.
      *
-     * \param packet packet to send
-     * \param source source address of packet
-     * \param destination address of packet
-     * \param protocol number of packet
-     * \param route route to take
+     * @param packet packet to send
+     * @param source source address of packet
+     * @param destination address of packet
+     * @param protocol number of packet
+     * @param route route to take
      */
     virtual void Send(Ptr<Packet> packet,
                       Ipv6Address source,
@@ -372,60 +372,60 @@
                       Ptr<Ipv6Route> route) = 0;
 
     /**
-     * \brief Register the IPv6 Extensions. Does nothing if the Extensions have been already
+     * @brief Register the IPv6 Extensions. Does nothing if the Extensions have been already
      * registered.
      */
     virtual void RegisterExtensions() = 0;
 
     /**
-     * \brief Register the IPv6 Options. Does nothing if the Options have been already
+     * @brief Register the IPv6 Options. Does nothing if the Options have been already
      * registered.
      */
     virtual void RegisterOptions() = 0;
 
     /**
-     * \brief Any interface magic number.
+     * @brief Any interface magic number.
      */
     static const uint32_t IF_ANY = 0xffffffff;
 
   private:
     // Indirect the IPv6 attributes through private pure virtual methods
     /**
-     * \brief Set IPv6 forwarding state.
-     * \param forward IPv6 forwarding enabled or not
+     * @brief Set IPv6 forwarding state.
+     * @param forward IPv6 forwarding enabled or not
      */
     virtual void SetIpForward(bool forward) = 0;
 
     /**
-     * \brief Get IPv6 forwarding state.
-     * \return forwarding state (enabled or not)
+     * @brief Get IPv6 forwarding state.
+     * @return forwarding state (enabled or not)
      */
     virtual bool GetIpForward() const = 0;
 
     /**
-     * \brief Set IPv6 MTU discover state.
-     * \param mtuDiscover IPv6 MTU discover enabled or not
+     * @brief Set IPv6 MTU discover state.
+     * @param mtuDiscover IPv6 MTU discover enabled or not
      */
     virtual void SetMtuDiscover(bool mtuDiscover) = 0;
 
     /**
-     * \brief Get IPv6 MTU discover state.
-     * \return MTU discover state (enabled or not)
+     * @brief Get IPv6 MTU discover state.
+     * @return MTU discover state (enabled or not)
      */
     virtual bool GetMtuDiscover() const = 0;
 
     /**
-     * \brief Set or unset the Strong End System Model
+     * @brief Set or unset the Strong End System Model
      *
      * RFC1122 term for whether host rejects datagram with a dest. address on another interface
-     * \param model true for Strong End System Model
+     * @param model true for Strong End System Model
      */
     virtual void SetStrongEndSystemModel(bool model) = 0;
     /**
-     * \brief Get the Strong End System Model status
+     * @brief Get the Strong End System Model status
      *
      * RFC1122 term for whether host rejects datagram with a dest. address on another interface
-     * \returns true for Strong End System Model activated
+     * @returns true for Strong End System Model activated
      */
     virtual bool GetStrongEndSystemModel() const = 0;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv6-header.h ns-3.44/src/internet/model/ipv6-header.h
--- ns-3.43/src/internet/model/ipv6-header.h	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/ipv6-header.h	2025-03-09 16:55:49.399371100 -0700
@@ -16,16 +16,16 @@
 {
 
 /**
- * \ingroup ipv6
+ * @ingroup ipv6
  *
- * \brief Packet header for IPv6
+ * @brief Packet header for IPv6
  */
 class Ipv6Header : public Header
 {
   public:
     /**
-     * \enum DscpType
-     * \brief DiffServ Code Points
+     * @enum DscpType
+     * @brief DiffServ Code Points
      * Code Points defined in
      * Assured Forwarding (AF) \RFC{2597}
      * Expedited Forwarding (EF) \RFC{2598}
@@ -64,8 +64,8 @@
     };
 
     /**
-     * \enum NextHeader_e
-     * \brief IPv6 next-header value
+     * @enum NextHeader_e
+     * @brief IPv6 next-header value
      */
     enum NextHeader_e
     {
@@ -87,54 +87,54 @@
     };
 
     /**
-     * \brief Get the type identifier.
-     * \return type identifier
+     * @brief Get the type identifier.
+     * @return type identifier
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Return the instance type identifier.
-     * \return instance type ID
+     * @brief Return the instance type identifier.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
 
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Ipv6Header();
 
     /**
-     * \brief Set the "Traffic class" field.
-     * \param traffic the 8-bit value
+     * @brief Set the "Traffic class" field.
+     * @param traffic the 8-bit value
      */
     void SetTrafficClass(uint8_t traffic);
 
     /**
-     * \brief Get the "Traffic class" field.
-     * \return the traffic value
+     * @brief Get the "Traffic class" field.
+     * @return the traffic value
      */
     uint8_t GetTrafficClass() const;
 
     /**
-     * \brief Set DSCP Field
-     * \param dscp DSCP value
+     * @brief Set DSCP Field
+     * @param dscp DSCP value
      */
     void SetDscp(DscpType dscp);
 
     /**
-     * \returns the DSCP field of this packet.
+     * @returns the DSCP field of this packet.
      */
     DscpType GetDscp() const;
 
     /**
-     * \param dscp the dscp
-     * \returns std::string of DSCPType
+     * @param dscp the dscp
+     * @returns std::string of DSCPType
      */
     std::string DscpTypeToString(DscpType dscp) const;
 
     /**
-     * \enum EcnType
-     * \brief ECN field bits
+     * @enum EcnType
+     * @brief ECN field bits
      */
     enum EcnType
     {
@@ -146,153 +146,153 @@
     };
 
     /**
-     * \brief Set ECN field bits
-     * \param ecn ECN field bits
+     * @brief Set ECN field bits
+     * @param ecn ECN field bits
      */
     void SetEcn(EcnType ecn);
 
     /**
-     * \return the ECN field bits of this packet.
+     * @return the ECN field bits of this packet.
      */
     EcnType GetEcn() const;
 
     /**
-     * \param ecn the ECNType
-     * \return std::string of ECNType
+     * @param ecn the ECNType
+     * @return std::string of ECNType
      */
     std::string EcnTypeToString(EcnType ecn) const;
 
     /**
-     * \brief Set the "Flow label" field.
-     * \param flow the 20-bit value
+     * @brief Set the "Flow label" field.
+     * @param flow the 20-bit value
      */
     void SetFlowLabel(uint32_t flow);
 
     /**
-     * \brief Get the "Flow label" field.
-     * \return the flow label value
+     * @brief Get the "Flow label" field.
+     * @return the flow label value
      */
     uint32_t GetFlowLabel() const;
 
     /**
-     * \brief Set the "Payload length" field.
-     * \param len the length of the payload in bytes
+     * @brief Set the "Payload length" field.
+     * @param len the length of the payload in bytes
      */
     void SetPayloadLength(uint16_t len);
 
     /**
-     * \brief Get the "Payload length" field.
-     * \return the payload length
+     * @brief Get the "Payload length" field.
+     * @return the payload length
      */
     uint16_t GetPayloadLength() const;
 
     /**
-     * \brief Set the "Next header" field.
-     * \param next the next header number
+     * @brief Set the "Next header" field.
+     * @param next the next header number
      */
     void SetNextHeader(uint8_t next);
 
     /**
-     * \brief Get the next header.
-     * \return the next header number
+     * @brief Get the next header.
+     * @return the next header number
      */
     uint8_t GetNextHeader() const;
 
     /**
-     * \brief Set the "Hop limit" field (TTL).
-     * \param limit the 8-bit value
+     * @brief Set the "Hop limit" field (TTL).
+     * @param limit the 8-bit value
      */
     void SetHopLimit(uint8_t limit);
 
     /**
-     * \brief Get the "Hop limit" field (TTL).
-     * \return the hop limit value
+     * @brief Get the "Hop limit" field (TTL).
+     * @return the hop limit value
      */
     uint8_t GetHopLimit() const;
 
     /**
-     * \brief Set the "Source address" field.
-     * \param src the source address
+     * @brief Set the "Source address" field.
+     * @param src the source address
      */
     void SetSource(Ipv6Address src);
 
     /**
-     * \brief Get the "Source address" field.
-     * \return the source address
+     * @brief Get the "Source address" field.
+     * @return the source address
      */
     Ipv6Address GetSource() const;
 
     /**
-     * \brief Set the "Destination address" field.
-     * \param dst the destination address
+     * @brief Set the "Destination address" field.
+     * @param dst the destination address
      */
     void SetDestination(Ipv6Address dst);
 
     /**
-     * \brief Get the "Destination address" field.
-     * \return the destination address
+     * @brief Get the "Destination address" field.
+     * @return the destination address
      */
     Ipv6Address GetDestination() const;
 
     /**
-     * \brief Print some information about the packet.
-     * \param os output stream
+     * @brief Print some information about the packet.
+     * @param os output stream
      */
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Get the serialized size of the packet.
-     * \return size
+     * @brief Get the serialized size of the packet.
+     * @return size
      */
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Serialize the packet.
-     * \param start Buffer iterator
+     * @brief Serialize the packet.
+     * @param start Buffer iterator
      */
     void Serialize(Buffer::Iterator start) const override;
 
     /**
-     * \brief Deserialize the packet.
-     * \param start Buffer iterator
-     * \return size of the packet
+     * @brief Deserialize the packet.
+     * @param start Buffer iterator
+     * @return size of the packet
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
 
   private:
     /**
-     * \brief The traffic class.
+     * @brief The traffic class.
      */
     uint32_t m_trafficClass : 8;
 
     /**
-     * \brief The flow label.
-     * \note This is 20-bit value.
+     * @brief The flow label.
+     * @note This is 20-bit value.
      */
     uint32_t m_flowLabel : 20;
 
     /**
-     * \brief The payload length.
+     * @brief The payload length.
      */
     uint16_t m_payloadLength;
 
     /**
-     * \brief The Next header number.
+     * @brief The Next header number.
      */
     uint8_t m_nextHeader;
 
     /**
-     * \brief The Hop limit value.
+     * @brief The Hop limit value.
      */
     uint8_t m_hopLimit;
 
     /**
-     * \brief The source address.
+     * @brief The source address.
      */
     Ipv6Address m_sourceAddress;
 
     /**
-     * \brief The destination address.
+     * @brief The destination address.
      */
     Ipv6Address m_destinationAddress;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv6-interface-address.h ns-3.44/src/internet/model/ipv6-interface-address.h
--- ns-3.43/src/internet/model/ipv6-interface-address.h	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/ipv6-interface-address.h	2025-03-09 16:55:49.399371100 -0700
@@ -17,17 +17,17 @@
 {
 
 /**
- * \ingroup address
- * \ingroup ipv6
+ * @ingroup address
+ * @ingroup ipv6
  *
- * \brief IPv6 address associated with an interface.
+ * @brief IPv6 address associated with an interface.
  */
 class Ipv6InterfaceAddress
 {
   public:
     /**
-     * \enum State_e
-     * \brief State of an address associated with an interface.
+     * @enum State_e
+     * @brief State of an address associated with an interface.
      */
     enum State_e
     {
@@ -42,8 +42,8 @@
     };
 
     /**
-     * \enum Scope_e
-     * \brief Address scope.
+     * @enum Scope_e
+     * @brief Address scope.
      */
     enum Scope_e
     {
@@ -53,184 +53,184 @@
     };
 
     /**
-     * \brief Default constructor.
+     * @brief Default constructor.
      */
     Ipv6InterfaceAddress();
 
     /**
-     * \brief Constructor. Prefix is 64 by default.
-     * \param address the IPv6 address to set
+     * @brief Constructor. Prefix is 64 by default.
+     * @param address the IPv6 address to set
      */
     Ipv6InterfaceAddress(Ipv6Address address);
 
     /**
-     * \brief Constructor.
-     * \param address IPv6 address to set
-     * \param prefix IPv6 prefix
+     * @brief Constructor.
+     * @param address IPv6 address to set
+     * @param prefix IPv6 prefix
      */
     Ipv6InterfaceAddress(Ipv6Address address, Ipv6Prefix prefix);
 
     /**
-     * \brief Constructor.
-     * \param address IPv6 address to set
-     * \param prefix IPv6 prefix
-     * \param onLink on-link property
+     * @brief Constructor.
+     * @param address IPv6 address to set
+     * @param prefix IPv6 prefix
+     * @param onLink on-link property
      */
     Ipv6InterfaceAddress(Ipv6Address address, Ipv6Prefix prefix, bool onLink);
 
     /**
-     * \brief Copy constructor.
-     * \param o object to copy
+     * @brief Copy constructor.
+     * @param o object to copy
      */
     Ipv6InterfaceAddress(const Ipv6InterfaceAddress& o);
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Ipv6InterfaceAddress();
 
     /**
-     * \brief Set IPv6 address (and scope).
-     * \param address IPv6 address to set
+     * @brief Set IPv6 address (and scope).
+     * @param address IPv6 address to set
      */
     void SetAddress(Ipv6Address address);
 
     /**
-     * \brief Get the IPv6 address.
-     * \return IPv6 address
+     * @brief Get the IPv6 address.
+     * @return IPv6 address
      */
     Ipv6Address GetAddress() const;
 
     /**
-     * \brief Get the IPv6 prefix.
-     * \return IPv6 prefix
+     * @brief Get the IPv6 prefix.
+     * @return IPv6 prefix
      */
     Ipv6Prefix GetPrefix() const;
 
     /**
-     * \brief Set the state.
-     * \param state the state
+     * @brief Set the state.
+     * @param state the state
      */
     void SetState(Ipv6InterfaceAddress::State_e state);
 
     /**
-     * \brief Get the address state.
-     * \return address state
+     * @brief Get the address state.
+     * @return address state
      */
     Ipv6InterfaceAddress::State_e GetState() const;
 
     /**
-     * \brief Set the scope.
-     * \param scope the scope of address
+     * @brief Set the scope.
+     * @param scope the scope of address
      */
     void SetScope(Ipv6InterfaceAddress::Scope_e scope);
 
     /**
-     * \brief Get address scope.
-     * \return scope
+     * @brief Get address scope.
+     * @return scope
      */
     Ipv6InterfaceAddress::Scope_e GetScope() 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.
+     * @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(Ipv6Address b) const;
 
     /**
-     * \brief Set the latest DAD probe packet UID.
-     * \param uid packet uid
+     * @brief Set the latest DAD probe packet UID.
+     * @param uid packet uid
      */
     void SetNsDadUid(uint32_t uid);
 
     /**
-     * \brief Get the latest DAD probe packet UID.
-     * \return uid
+     * @brief Get the latest DAD probe packet UID.
+     * @return uid
      */
     uint32_t GetNsDadUid() const;
 
     /**
-     * \brief Get the on-link property.
-     * \param onLink the on-link property
+     * @brief Get the on-link property.
+     * @param onLink the on-link property
      */
     void SetOnLink(bool onLink);
 
     /**
-     * \brief Get the on-link property.
-     * \return on-link flag
+     * @brief Get the on-link property.
+     * @return on-link flag
      */
     bool GetOnLink() const;
 
 #if 0
   /**
-   * \brief Start the DAD timer.
-   * \param interface interface
+   * @brief Start the DAD timer.
+   * @param interface interface
    */
   void StartDadTimer (Ptr<Ipv6Interface> interface);
 
   /**
-   * \brief Stop the DAD timer.
+   * @brief Stop the DAD timer.
    */
   void StopDadTimer ();
 #endif
 
   private:
     /**
-     * \brief The IPv6 address.
+     * @brief The IPv6 address.
      */
     Ipv6Address m_address;
 
     /**
-     * \brief The IPv6 prefix.
+     * @brief The IPv6 prefix.
      */
     Ipv6Prefix m_prefix;
 
     /**
-     * \brief State of the address.
+     * @brief State of the address.
      */
     State_e m_state;
 
     /**
-     * \brief Scope of the address.
+     * @brief Scope of the address.
      */
     Scope_e m_scope;
 
     /**
-     * \brief The address belongs to an on-link network.
+     * @brief The address belongs to an on-link network.
      */
     bool m_onLink;
 
     /**
-     * \brief Equal to operator.
+     * @brief Equal to operator.
      *
-     * \param a the first operand
-     * \param b the first operand
-     * \returns true if the operands are equal
+     * @param a the first operand
+     * @param b the first operand
+     * @returns true if the operands are equal
      */
     friend bool operator==(const Ipv6InterfaceAddress& a, const Ipv6InterfaceAddress& b);
 
     /**
-     * \brief Not equal to operator.
+     * @brief Not equal to operator.
      *
-     * \param a the first operand
-     * \param b the first operand
-     * \returns true if the operands are not equal
+     * @param a the first operand
+     * @param b the first operand
+     * @returns true if the operands are not equal
      */
     friend bool operator!=(const Ipv6InterfaceAddress& a, const Ipv6InterfaceAddress& b);
 
     /**
-     * \brief Last DAD probe packet UID.
+     * @brief Last DAD probe packet UID.
      */
     uint32_t m_nsDadUid;
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the reference to the output stream
- * \param addr the Ipv6InterfaceAddress
- * \returns the reference to the output stream
+ * @param os the reference to the output stream
+ * @param addr the Ipv6InterfaceAddress
+ * @returns the reference to the output stream
  */
 std::ostream& operator<<(std::ostream& os, const Ipv6InterfaceAddress& addr);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv6-interface.cc ns-3.44/src/internet/model/ipv6-interface.cc
--- ns-3.43/src/internet/model/ipv6-interface.cc	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/ipv6-interface.cc	2025-03-09 16:55:49.399371100 -0700
@@ -408,7 +408,7 @@
      * traffic control layer */
     if (DynamicCast<LoopbackNetDevice>(m_device))
     {
-        /** \todo additional checks needed here (such as whether multicast
+        /** @todo additional checks needed here (such as whether multicast
          * goes to loopback)?
          */
         p->AddHeader(hdr);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv6-interface.h ns-3.44/src/internet/model/ipv6-interface.h
--- ns-3.43/src/internet/model/ipv6-interface.h	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/ipv6-interface.h	2025-03-09 16:55:49.399371100 -0700
@@ -29,9 +29,9 @@
 class TrafficControlLayer;
 
 /**
- * \ingroup ipv6
+ * @ingroup ipv6
  *
- * \brief The IPv6 representation of a network interface.
+ * @brief The IPv6 representation of a network interface.
  *
  * By default IPv6 interfaces are created in the "down" state
  * with IP "fe80::1" and a /64 prefix. Before becoming usable,
@@ -42,18 +42,18 @@
 {
   public:
     /**
-     * \brief Get the type ID
-     * \return type ID
+     * @brief Get the type ID
+     * @return type ID
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Constructs an Ipv6Interface.
+     * @brief Constructs an Ipv6Interface.
      */
     Ipv6Interface();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Ipv6Interface() override;
 
@@ -62,206 +62,206 @@
     Ipv6Interface& operator=(const Ipv6Interface&) = delete;
 
     /**
-     * \brief Set node associated with interface.
-     * \param node node
+     * @brief Set node associated with interface.
+     * @param node node
      */
     void SetNode(Ptr<Node> node);
 
     /**
-     * \brief Set the NetDevice.
-     * \param device NetDevice
+     * @brief Set the NetDevice.
+     * @param device NetDevice
      */
     void SetDevice(Ptr<NetDevice> device);
 
     /**
-     * \brief Set the TrafficControlLayer.
-     * \param tc TrafficControlLayer object
+     * @brief Set the TrafficControlLayer.
+     * @param tc TrafficControlLayer object
      */
     void SetTrafficControl(Ptr<TrafficControlLayer> tc);
 
     /**
-     * \brief Get the NetDevice.
-     * \return the NetDevice associated with this interface
+     * @brief Get the NetDevice.
+     * @return the NetDevice associated with this interface
      */
     virtual Ptr<NetDevice> GetDevice() const;
 
     /**
-     * \brief Set the metric.
-     * \param metric configured routing metric (cost) of this interface
+     * @brief Set the metric.
+     * @param metric configured routing metric (cost) of this interface
      */
     void SetMetric(uint16_t metric);
 
     /**
-     * \brief Get the metric
-     * \return the metric
+     * @brief Get the metric
+     * @return the metric
      */
     uint16_t GetMetric() const;
 
     /**
-     * \brief Is the interface UP ?
-     * \return true if interface is enabled, false otherwise.
+     * @brief Is the interface UP ?
+     * @return true if interface is enabled, false otherwise.
      */
     bool IsUp() const;
 
     /**
-     * \brief Is the interface DOWN ?
-     * \return true if interface is disabled, false otherwise.
+     * @brief Is the interface DOWN ?
+     * @return true if interface is disabled, false otherwise.
      */
     bool IsDown() const;
 
     /**
-     * \brief Enable this interface.
+     * @brief Enable this interface.
      */
     void SetUp();
 
     /**
-     * \brief Disable this interface.
+     * @brief Disable this interface.
      */
     void SetDown();
 
     /**
-     * \brief If the interface allows forwarding packets.
-     * \return true if forwarding is enabled, false otherwise
+     * @brief If the interface allows forwarding packets.
+     * @return true if forwarding is enabled, false otherwise
      */
     bool IsForwarding() const;
 
     /**
-     * \brief Set forwarding enabled or not.
-     * \param forward forwarding state
+     * @brief Set forwarding enabled or not.
+     * @param forward forwarding state
      */
     void SetForwarding(bool forward);
 
     /**
-     * \brief Set the current hop limit.
-     * \param curHopLimit the value to set
+     * @brief Set the current hop limit.
+     * @param curHopLimit the value to set
      */
     void SetCurHopLimit(uint8_t curHopLimit);
 
     /**
-     * \brief Get the current hop limit value.
-     * \return current hop limit
+     * @brief Get the current hop limit value.
+     * @return current hop limit
      */
     uint8_t GetCurHopLimit() const;
 
     /**
-     * \brief Set the base reachable time.
-     * \param baseReachableTime the value to set
+     * @brief Set the base reachable time.
+     * @param baseReachableTime the value to set
      */
     void SetBaseReachableTime(uint16_t baseReachableTime);
 
     /**
-     * \brief Get the base reachable time.
-     * \return base reachable time
+     * @brief Get the base reachable time.
+     * @return base reachable time
      */
     uint16_t GetBaseReachableTime() const;
 
     /**
-     * \brief Set the reachable time.
-     * \param reachableTime value to set
+     * @brief Set the reachable time.
+     * @param reachableTime value to set
      */
     void SetReachableTime(uint16_t reachableTime);
 
     /**
-     * \brief Get the reachable time.
-     * \return reachable time
+     * @brief Get the reachable time.
+     * @return reachable time
      */
     uint16_t GetReachableTime() const;
 
     /**
-     * \brief Set the retransmission timer.
-     * \param retransTimer value to set
+     * @brief Set the retransmission timer.
+     * @param retransTimer value to set
      */
     void SetRetransTimer(uint16_t retransTimer);
 
     /**
-     * \brief Get the retransmission timer.
-     * \return retransmission timer
+     * @brief Get the retransmission timer.
+     * @return retransmission timer
      */
     uint16_t GetRetransTimer() const;
 
     /**
-     * \brief Send a packet through this interface.
-     * \param p packet to send
-     * \param hdr IPv6 header
-     * \param dest next hop address of packet.
+     * @brief Send a packet through this interface.
+     * @param p packet to send
+     * @param hdr IPv6 header
+     * @param dest next hop address of packet.
      *
-     * \note This method will eventually call the private SendTo
+     * @note This method will eventually call the private SendTo
      * method which must be implemented by subclasses.
      */
     void Send(Ptr<Packet> p, const Ipv6Header& hdr, Ipv6Address dest);
 
     /**
-     * \brief Add an IPv6 address.
-     * \param iface address to add
-     * \return true if address was added, false otherwise
+     * @brief Add an IPv6 address.
+     * @param iface address to add
+     * @return true if address was added, false otherwise
      */
     bool AddAddress(Ipv6InterfaceAddress iface);
 
     /**
-     * \brief Get link-local address from IPv6 interface.
-     * \return link-local Ipv6InterfaceAddress, assert if not found
+     * @brief Get link-local address from IPv6 interface.
+     * @return link-local Ipv6InterfaceAddress, assert if not found
      */
     Ipv6InterfaceAddress GetLinkLocalAddress() const;
 
     /**
-     * \brief Checks if the address is a Solicited Multicast address for this interface.
-     * \param address the address to check.
-     * \return true if it is a solicited multicast address.
+     * @brief Checks if the address is a Solicited Multicast address for this interface.
+     * @param address the address to check.
+     * @return true if it is a solicited multicast address.
      */
     bool IsSolicitedMulticastAddress(Ipv6Address address) const;
 
     /**
-     * \brief Get an address from IPv6 interface.
-     * \param index index
-     * \return Ipv6InterfaceAddress address whose index is i
+     * @brief Get an address from IPv6 interface.
+     * @param index index
+     * @return Ipv6InterfaceAddress address whose index is i
      */
     Ipv6InterfaceAddress GetAddress(uint32_t index) const;
 
     /**
-     * \brief Get an address which is in the same network prefix as destination.
-     * \param dst destination address
-     * \return Corresponding Ipv6InterfaceAddress or assert if not found
+     * @brief Get an address which is in the same network prefix as destination.
+     * @param dst destination address
+     * @return Corresponding Ipv6InterfaceAddress or assert if not found
      */
     Ipv6InterfaceAddress GetAddressMatchingDestination(Ipv6Address dst);
 
     /**
-     * \brief Get number of addresses on this IPv6 interface.
-     * \return number of address
+     * @brief Get number of addresses on this IPv6 interface.
+     * @return number of address
      */
     uint32_t GetNAddresses() const;
 
     /**
-     * \brief Remove an address from interface.
-     * \param index index to remove
-     * \return Ipv6InterfaceAddress address whose index is index
+     * @brief Remove an address from interface.
+     * @param index index to remove
+     * @return Ipv6InterfaceAddress address whose index is index
      */
     Ipv6InterfaceAddress RemoveAddress(uint32_t index);
 
     /**
-     * \brief Remove the given Ipv6 address from the interface.
-     * \param address The Ipv6 address to remove
-     * \returns The removed Ipv6 interface address
-     * \returns The null interface address if the interface did not contain the
+     * @brief Remove the given Ipv6 address from the interface.
+     * @param address The Ipv6 address to remove
+     * @returns The removed Ipv6 interface address
+     * @returns The null interface address if the interface did not contain the
      * address or if loopback address was passed as argument
      */
     Ipv6InterfaceAddress RemoveAddress(Ipv6Address address);
 
     /**
-     * \brief Update state of an interface address.
-     * \param address IPv6 address
-     * \param state new state
+     * @brief Update state of an interface address.
+     * @param address IPv6 address
+     * @param state new state
      */
     void SetState(Ipv6Address address, Ipv6InterfaceAddress::State_e state);
 
     /**
-     * \brief Update NS DAD packet UID of an interface address.
-     * \param address IPv6 address
-     * \param uid packet UID
+     * @brief Update NS DAD packet UID of an interface address.
+     * @param address IPv6 address
+     * @param uid packet UID
      */
     void SetNsDadUid(Ipv6Address address, uint32_t uid);
 
     /**
-     * \return NDISC cache used by this interface
+     * @return NDISC cache used by this interface
      */
     Ptr<NdiscCache> GetNdiscCache() const;
 
@@ -270,7 +270,7 @@
      * auto-generated Ndisc cache and it allow the neighbor cache helper to update
      * neighbor's Ndisc cache
      *
-     * \param removeAddressCallback Callback when remove an address.
+     * @param removeAddressCallback Callback when remove an address.
      */
     void RemoveAddressCallback(
         Callback<void, Ptr<Ipv6Interface>, Ipv6InterfaceAddress> removeAddressCallback);
@@ -280,103 +280,103 @@
      * auto-generated Ndisc cache and it allow the neighbor cache helper to update
      * neighbor's Ndisc cache
      *
-     * \param addAddressCallback Callback when remove an address.
+     * @param addAddressCallback Callback when remove an address.
      */
     void AddAddressCallback(
         Callback<void, Ptr<Ipv6Interface>, Ipv6InterfaceAddress> addAddressCallback);
 
   protected:
     /**
-     * \brief Dispose this object.
+     * @brief Dispose this object.
      */
     void DoDispose() override;
 
   private:
     /**
-     * \brief Container for the Ipv6InterfaceAddresses.
+     * @brief Container for the Ipv6InterfaceAddresses.
      */
     typedef std::list<std::pair<Ipv6InterfaceAddress, Ipv6Address>> Ipv6InterfaceAddressList;
 
     /**
-     * \brief Container Iterator for the Ipv6InterfaceAddresses.
+     * @brief Container Iterator for the Ipv6InterfaceAddresses.
      */
     typedef std::list<std::pair<Ipv6InterfaceAddress, Ipv6Address>>::iterator
         Ipv6InterfaceAddressListI;
 
     /**
-     * \brief Const Container Iterator for the Ipv6InterfaceAddresses.
+     * @brief Const Container Iterator for the Ipv6InterfaceAddresses.
      */
     typedef std::list<std::pair<Ipv6InterfaceAddress, Ipv6Address>>::const_iterator
         Ipv6InterfaceAddressListCI;
 
     /**
-     * \brief Initialize interface.
+     * @brief Initialize interface.
      */
     void DoSetup();
 
     /**
-     * \brief The addresses assigned to this interface.
+     * @brief The addresses assigned to this interface.
      */
     Ipv6InterfaceAddressList m_addresses;
 
     /**
-     * \brief The link-local addresses assigned to this interface.
+     * @brief The link-local addresses assigned to this interface.
      */
     Ipv6InterfaceAddress m_linkLocalAddress;
 
     /**
-     * \brief The state of this interface.
+     * @brief The state of this interface.
      */
     bool m_ifup;
 
     /**
-     * \brief Forwarding state.
+     * @brief Forwarding state.
      */
     bool m_forwarding;
 
     /**
-     * \brief The metric.
+     * @brief The metric.
      */
     uint16_t m_metric;
 
     /**
-     * \brief Node associated with this interface.
+     * @brief Node associated with this interface.
      */
     Ptr<Node> m_node;
 
     /**
-     * \brief NetDevice associated with this interface.
+     * @brief NetDevice associated with this interface.
      */
     Ptr<NetDevice> m_device;
 
     /**
-     * \brief TrafficControlLayer associated with this interface.
+     * @brief TrafficControlLayer associated with this interface.
      */
     Ptr<TrafficControlLayer> m_tc;
 
     /**
-     * \brief Neighbor cache.
+     * @brief Neighbor cache.
      */
     Ptr<NdiscCache> m_ndCache;
 
     /**
-     * \brief Current hop limit.
+     * @brief Current hop limit.
      */
     uint8_t m_curHopLimit;
 
     /**
-     * \brief Base value used for computing the random reachable time value (in millisecond).
+     * @brief Base value used for computing the random reachable time value (in millisecond).
      */
     uint16_t m_baseReachableTime;
 
     /**
-     * \brief Reachable time (in millisecond).
+     * @brief Reachable time (in millisecond).
      * The time a neighbor is considered reachable after receiving a reachability confirmation.
      */
     uint16_t m_reachableTime;
 
     /**
-     * \brief Retransmission timer (in millisecond).
+     * @brief Retransmission timer (in millisecond).
      * Time between retransmission of NS.
      */
     uint16_t m_retransTimer;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv6-l3-protocol.cc ns-3.44/src/internet/model/ipv6-l3-protocol.cc
--- ns-3.43/src/internet/model/ipv6-l3-protocol.cc	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/ipv6-l3-protocol.cc	2025-03-09 16:55:49.399371100 -0700
@@ -44,8 +44,6 @@
 
 NS_OBJECT_ENSURE_REGISTERED(Ipv6L3Protocol);
 
-const uint16_t Ipv6L3Protocol::PROT_NUMBER = 0x86DD;
-
 TypeId
 Ipv6L3Protocol::GetTypeId()
 {
@@ -1320,7 +1318,6 @@
     // Forwarding
     Ipv6Header ipHeader = header;
     Ptr<Packet> packet = p->Copy();
-    ipHeader.SetHopLimit(ipHeader.GetHopLimit() - 1);
 
     if (ipHeader.GetSource().IsLinkLocal())
     {
@@ -1328,7 +1325,9 @@
         return;
     }
 
-    if (ipHeader.GetHopLimit() == 0)
+    // RFC 8200: When forwarding, the packet is discarded if Hop
+    // Limit was zero when received or is decremented to zero.
+    if (ipHeader.GetHopLimit() <= 1)
     {
         NS_LOG_WARN("TTL exceeded.  Drop.");
         m_dropTrace(ipHeader, packet, DROP_TTL_EXPIRED, this, 0);
@@ -1342,6 +1341,7 @@
         }
         return;
     }
+    ipHeader.SetHopLimit(ipHeader.GetHopLimit() - 1);
 
     /* ICMPv6 Redirect */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv6-l3-protocol.h ns-3.44/src/internet/model/ipv6-l3-protocol.h
--- ns-3.43/src/internet/model/ipv6-l3-protocol.h	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/ipv6-l3-protocol.h	2025-03-09 16:55:49.399371100 -0700
@@ -35,9 +35,9 @@
 class Ipv6AutoconfiguredPrefix;
 
 /**
- * \ingroup ipv6
+ * @ingroup ipv6
  *
- * \brief IPv6 layer implementation.
+ * @brief IPv6 layer implementation.
  *
  * This class contains two distinct groups of trace sources.  The
  * trace sources 'Rx' and 'Tx' are called, respectively, immediately
@@ -53,19 +53,19 @@
 {
   public:
     /**
-     * \brief Get the type ID of this class.
-     * \return type ID
+     * @brief Get the type ID of this class.
+     * @return type ID
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief The protocol number for IPv6 (0x86DD).
+     * @brief The protocol number for IPv6 (0x86DD).
      */
-    static const uint16_t PROT_NUMBER;
+    static constexpr uint16_t PROT_NUMBER = 0x86DD;
 
     /**
-     * \enum DropReason
-     * \brief Reason why a packet has been dropped.
+     * @enum DropReason
+     * @brief Reason why a packet has been dropped.
      */
     enum DropReason
     {
@@ -80,12 +80,12 @@
     };
 
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Ipv6L3Protocol();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Ipv6L3Protocol() override;
 
@@ -94,8 +94,8 @@
     Ipv6L3Protocol& operator=(const Ipv6L3Protocol&) = delete;
 
     /**
-     * \brief Set node associated with this stack.
-     * \param node node to set
+     * @brief Set node associated with this stack.
+     * @param node node to set
      */
     void SetNode(Ptr<Node> node);
 
@@ -109,39 +109,39 @@
     Ptr<IpL4Protocol> GetProtocol(int protocolNumber, int32_t interfaceIndex) const override;
 
     /**
-     * \brief Create raw IPv6 socket.
-     * \return newly raw socket
+     * @brief Create raw IPv6 socket.
+     * @return newly raw socket
      */
     Ptr<Socket> CreateRawSocket();
 
     /**
-     * \brief Remove raw IPv6 socket.
-     * \param socket socket to remove
+     * @brief Remove raw IPv6 socket.
+     * @param socket socket to remove
      */
     void DeleteRawSocket(Ptr<Socket> socket);
 
     /**
-     * \brief Set the default TTL.
-     * \param ttl TTL to set
+     * @brief Set the default TTL.
+     * @param ttl TTL to set
      */
     void SetDefaultTtl(uint8_t ttl);
 
     /**
-     * \brief Set the default TCLASS.
-     * \param tclass TCLASS to set
+     * @brief Set the default TCLASS.
+     * @param tclass TCLASS to set
      */
     void SetDefaultTclass(uint8_t tclass);
 
     /**
-     * \brief Receive method when a packet arrive in the stack.
+     * @brief Receive method when a packet arrive in the stack.
      * This method removes IPv6 header and forward up to L4 protocol.
      *
-     * \param device network device
-     * \param p the packet
-     * \param protocol next header value
-     * \param from address of the correspondent
-     * \param to address of the destination
-     * \param packetType type of the packet
+     * @param device network device
+     * @param p the packet
+     * @param protocol next header value
+     * @param from address of the correspondent
+     * @param to address of the destination
+     * @param packetType type of the packet
      */
     void Receive(Ptr<NetDevice> device,
                  Ptr<const Packet> p,
@@ -157,184 +157,184 @@
               Ptr<Ipv6Route> route) override;
 
     /**
-     * \brief Set routing protocol for this stack.
-     * \param routingProtocol IPv6 routing protocol to set
+     * @brief Set routing protocol for this stack.
+     * @param routingProtocol IPv6 routing protocol to set
      */
     void SetRoutingProtocol(Ptr<Ipv6RoutingProtocol> routingProtocol) override;
 
     /**
-     * \brief Get current routing protocol used.
-     * \return routing protocol
+     * @brief Get current routing protocol used.
+     * @return routing protocol
      */
     Ptr<Ipv6RoutingProtocol> GetRoutingProtocol() const override;
 
     /**
-     * \brief Add IPv6 interface for a device.
-     * \param device net device
-     * \return interface index
+     * @brief Add IPv6 interface for a device.
+     * @param device net device
+     * @return interface index
      */
     uint32_t AddInterface(Ptr<NetDevice> device) override;
 
     /**
-     * \brief Get an interface.
-     * \param i interface index
-     * \return IPv6 interface pointer
+     * @brief Get an interface.
+     * @param i interface index
+     * @return IPv6 interface pointer
      */
     Ptr<Ipv6Interface> GetInterface(uint32_t i) const;
 
     /**
-     * \brief Get current number of interface on this stack.
-     * \return number of interface registered
+     * @brief Get current number of interface on this stack.
+     * @return number of interface registered
      */
     uint32_t GetNInterfaces() const override;
 
     /**
-     * \brief Get interface index which has specified IPv6 address
-     * \param addr IPv6 address
-     * \return interface index or -1 if not found
+     * @brief Get interface index which has specified IPv6 address
+     * @param addr IPv6 address
+     * @return interface index or -1 if not found
      */
     int32_t GetInterfaceForAddress(Ipv6Address addr) const override;
 
     /**
-     * \brief Get interface index which match specified address/prefix.
-     * \param addr IPv6 address
-     * \param mask IPv6 prefix (mask)
-     * \return interface index or -1 if not found
+     * @brief Get interface index which match specified address/prefix.
+     * @param addr IPv6 address
+     * @param mask IPv6 prefix (mask)
+     * @return interface index or -1 if not found
      */
     int32_t GetInterfaceForPrefix(Ipv6Address addr, Ipv6Prefix mask) const override;
 
     /**
-     * \brief Get interface index which is on a specified net device.
-     * \param device net device
-     * \returns the interface index
+     * @brief Get interface index which is on a specified net device.
+     * @param device net device
+     * @returns the interface index
      */
     int32_t GetInterfaceForDevice(Ptr<const NetDevice> device) const override;
 
     /**
-     * \brief Add an address on interface.
-     * \param i interface index
-     * \param address address to add
-     * \param addOnLinkRoute add on-link route to the network (default true)
-     * \returns true if the operation succeeded
+     * @brief Add an address on interface.
+     * @param i interface index
+     * @param address address to add
+     * @param addOnLinkRoute add on-link route to the network (default true)
+     * @returns true if the operation succeeded
      */
     bool AddAddress(uint32_t i, Ipv6InterfaceAddress address, bool addOnLinkRoute = true) override;
 
     /**
-     * \brief Get an address.
-     * \param interfaceIndex interface index
-     * \param addressIndex address index on the interface
-     * \return Ipv6InterfaceAddress or assert if not found
+     * @brief Get an address.
+     * @param interfaceIndex interface index
+     * @param addressIndex address index on the interface
+     * @return Ipv6InterfaceAddress or assert if not found
      */
     Ipv6InterfaceAddress GetAddress(uint32_t interfaceIndex, uint32_t addressIndex) const override;
 
     /**
-     * \brief Get number of address for an interface.
-     * \param interface interface index
-     * \return number of address
+     * @brief Get number of address for an interface.
+     * @param interface interface index
+     * @return number of address
      */
     uint32_t GetNAddresses(uint32_t interface) const override;
 
     /**
-     * \brief Remove an address from an interface.
-     * \param interfaceIndex interface index
-     * \param addressIndex address index on the interface
-     * \returns true if the operation succeeded
+     * @brief Remove an address from an interface.
+     * @param interfaceIndex interface index
+     * @param addressIndex address index on the interface
+     * @returns true if the operation succeeded
      */
     bool RemoveAddress(uint32_t interfaceIndex, uint32_t addressIndex) override;
 
     /**
-     * \brief Remove a specified Ipv6 address from an interface.
-     * \param interfaceIndex interface index
-     * \param address Ipv6Address to be removed from the interface
-     * \returns true if the operation succeeded
+     * @brief Remove a specified Ipv6 address from an interface.
+     * @param interfaceIndex interface index
+     * @param address Ipv6Address to be removed from the interface
+     * @returns true if the operation succeeded
      */
     bool RemoveAddress(uint32_t interfaceIndex, Ipv6Address address) override;
 
     /**
-     * \brief Set metric for an interface.
-     * \param i index
-     * \param metric
+     * @brief Set metric for an interface.
+     * @param i index
+     * @param metric
      */
     void SetMetric(uint32_t i, uint16_t metric) override;
 
     /**
-     * \brief Get metric for an interface.
-     * \param i index
-     * \return metric
+     * @brief Get metric for an interface.
+     * @param i index
+     * @return metric
      */
     uint16_t GetMetric(uint32_t i) const override;
 
     /**
-     * \brief Get MTU for an interface.
-     * \param i index
-     * \return MTU
+     * @brief Get MTU for an interface.
+     * @param i index
+     * @return MTU
      */
     uint16_t GetMtu(uint32_t i) const override;
 
     /**
-     * \brief Set the Path MTU for the specified IPv6 destination address.
-     * \param dst Ipv6 destination address
-     * \param pmtu the Path MTU
+     * @brief Set the Path MTU for the specified IPv6 destination address.
+     * @param dst Ipv6 destination address
+     * @param pmtu the Path MTU
      */
     void SetPmtu(Ipv6Address dst, uint32_t pmtu) override;
 
     /**
-     * \brief Is specified interface up ?
-     * \param i interface index
-     * \returns true if the interface is up
+     * @brief Is specified interface up ?
+     * @param i interface index
+     * @returns true if the interface is up
      */
     bool IsUp(uint32_t i) const override;
 
     /**
-     * \brief Set an interface up.
-     * \param i interface index
+     * @brief Set an interface up.
+     * @param i interface index
      */
     void SetUp(uint32_t i) override;
 
     /**
-     * \brief set an interface down.
-     * \param i interface index
+     * @brief set an interface down.
+     * @param i interface index
      */
     void SetDown(uint32_t i) override;
 
     /**
-     * \brief Is interface allows forwarding ?
-     * \param i interface index
-     * \returns true if the interface is forwarding
+     * @brief Is interface allows forwarding ?
+     * @param i interface index
+     * @returns true if the interface is forwarding
      */
     bool IsForwarding(uint32_t i) const override;
 
     /**
-     * \brief Enable or disable forwarding on interface
-     * \param i interface index
-     * \param val true = enable forwarding, false = disable
+     * @brief Enable or disable forwarding on interface
+     * @param i interface index
+     * @param val true = enable forwarding, false = disable
      */
     void SetForwarding(uint32_t i, bool val) override;
 
     Ipv6Address SourceAddressSelection(uint32_t interface, Ipv6Address dest) override;
 
     /**
-     * \brief Get device by index.
-     * \param i device index on this stack
-     * \return NetDevice pointer
+     * @brief Get device by index.
+     * @param i device index on this stack
+     * @return NetDevice pointer
      */
     Ptr<NetDevice> GetNetDevice(uint32_t i) override;
 
     /**
-     * \brief Get ICMPv6 protocol.
-     * \return Icmpv6L4Protocol pointer
+     * @brief Get ICMPv6 protocol.
+     * @return Icmpv6L4Protocol pointer
      */
     Ptr<Icmpv6L4Protocol> GetIcmpv6() const;
 
     /**
-     * \brief Add an autoconfigured address with RA information.
-     * \param interface interface index
-     * \param network network prefix
-     * \param mask network mask
-     * \param flags flags of the prefix information option (home agent, ...)
-     * \param validTime valid time of the prefix
-     * \param preferredTime preferred time of the prefix
-     * \param defaultRouter default router address
+     * @brief Add an autoconfigured address with RA information.
+     * @param interface interface index
+     * @param network network prefix
+     * @param mask network mask
+     * @param flags flags of the prefix information option (home agent, ...)
+     * @param validTime valid time of the prefix
+     * @param preferredTime preferred time of the prefix
+     * @param defaultRouter default router address
      */
     void AddAutoconfiguredAddress(uint32_t interface,
                                   Ipv6Address network,
@@ -345,13 +345,13 @@
                                   Ipv6Address defaultRouter = Ipv6Address::GetZero());
 
     /**
-     * \brief Remove an autoconfigured address.
+     * @brief Remove an autoconfigured address.
      *
      * Typically it is used when an autoconfigured address expires.
-     * \param interface interface index
-     * \param network network prefix
-     * \param mask network mask
-     * \param defaultRouter gateway
+     * @param interface interface index
+     * @param network network prefix
+     * @param mask network mask
+     * @param defaultRouter gateway
      */
     void RemoveAutoconfiguredAddress(uint32_t interface,
                                      Ipv6Address network,
@@ -362,13 +362,13 @@
     void RegisterOptions() override;
 
     /**
-     * \brief Report a packet drop
+     * @brief Report a packet drop
      *
      * This function is used by Fragment Timeout handling to signal a fragment drop.
      *
-     * \param ipHeader the IPv6 header of dropped packet
-     * \param p the packet (if available)
-     * \param dropReason the drop reason
+     * @param ipHeader the IPv6 header of dropped packet
+     * @param p the packet (if available)
+     * @param dropReason the drop reason
      *
      */
     virtual void ReportDrop(Ipv6Header ipHeader, Ptr<Packet> p, DropReason dropReason);
@@ -377,9 +377,9 @@
      * TracedCallback signature for packet sent, forwarded or
      * local-delivered events.
      *
-     * \param [in] header the Ipv6Header.
-     * \param [in] packet the packet.
-     * \param [in] interface the IP-level interface index
+     * @param [in] header the Ipv6Header.
+     * @param [in] packet the packet.
+     * @param [in] interface the IP-level interface index
      */
     typedef void (*SentTracedCallback)(const Ipv6Header& header,
                                        Ptr<const Packet> packet,
@@ -388,10 +388,10 @@
     /**
      * TracedCallback signature for packet transmission or reception events.
      *
-     * \param [in] packet the packet.
-     * \param [in] ipv6 the Ipv6 protocol
-     * \param [in] interface the IP-level interface index
-     * \deprecated The non-const \c Ptr<Ipv6> argument is deprecated
+     * @param [in] packet the packet.
+     * @param [in] ipv6 the Ipv6 protocol
+     * @param [in] interface the IP-level interface index
+     * @deprecated The non-const \c Ptr<Ipv6> argument is deprecated
      * and will be changed to \c Ptr<const Ipv6> in a future release.
      */
     // NS_DEPRECATED() - tag for future removal
@@ -402,12 +402,12 @@
     /**
      * TracedCallback signature for packet drop events.
      *
-     * \param [in] header the Ipv6Header.
-     * \param [in] packet the packet.
-     * \param [in] reason the reason the packet was dropped.
-     * \param [in] ipv6 the Ipv6 protocol
-     * \param [in] interface the IP-level interface index
-     * \deprecated The non-const \c Ptr<Ipv6> argument is deprecated
+     * @param [in] header the Ipv6Header.
+     * @param [in] packet the packet.
+     * @param [in] reason the reason the packet was dropped.
+     * @param [in] ipv6 the Ipv6 protocol
+     * @param [in] interface the IP-level interface index
+     * @deprecated The non-const \c Ptr<Ipv6> argument is deprecated
      * and will be changed to \c Ptr<const Ipv6> in a future release.
      */
     // NS_DEPRECATED() - tag for future removal
@@ -419,42 +419,42 @@
 
     /**
      * Adds a multicast address to the list of addresses to pass to local deliver.
-     * \param address the address.
+     * @param address the address.
      */
     void AddMulticastAddress(Ipv6Address address);
 
     /**
      * Adds a multicast address to the list of addresses to pass to local deliver.
-     * \param address the address.
-     * \param interface the incoming interface.
+     * @param address the address.
+     * @param interface the incoming interface.
      */
     void AddMulticastAddress(Ipv6Address address, uint32_t interface);
 
     /**
      * Removes a multicast address from the list of addresses to pass to local deliver.
-     * \param address the address.
+     * @param address the address.
      */
     void RemoveMulticastAddress(Ipv6Address address);
 
     /**
      * Removes a multicast address from the list of addresses to pass to local deliver.
-     * \param address the address.
-     * \param interface the incoming interface.
+     * @param address the address.
+     * @param interface the incoming interface.
      */
     void RemoveMulticastAddress(Ipv6Address address, uint32_t interface);
 
     /**
      * Checks if the address has been registered.
-     * \param address the address.
-     * \return true if the address is registered.
+     * @param address the address.
+     * @return true if the address is registered.
      */
     bool IsRegisteredMulticastAddress(Ipv6Address address) const;
 
     /**
      * Checks if the address has been registered for a specific interface.
-     * \param address the address.
-     * \param interface the incoming interface.
-     * \return true if the address is registered.
+     * @param address the address.
+     * @param interface the incoming interface.
+     * @return true if the address is registered.
      */
     bool IsRegisteredMulticastAddress(Ipv6Address address, uint32_t interface) const;
 
@@ -471,20 +471,20 @@
      * The correct way to check the IP interface index is by using
      * Ipv6::GetInterfaceForDevice ().
      *
-     * \param ipInterfaceIndex IP interface index
-     * \param address reachable address
-     * \return true if the NCE has been successfully updated.
+     * @param ipInterfaceIndex IP interface index
+     * @param address reachable address
+     * @return true if the NCE has been successfully updated.
      */
     bool ReachabilityHint(uint32_t ipInterfaceIndex, Ipv6Address address);
 
   protected:
     /**
-     * \brief Dispose object.
+     * @brief Dispose object.
      */
     void DoDispose() override;
 
     /**
-     * \brief Notify other components connected to the node that a new stack member is now
+     * @brief Notify other components connected to the node that a new stack member is now
      * connected.
      *
      * This will be used to notify Layer 3 protocol of layer 4 protocol stack to connect them
@@ -494,57 +494,57 @@
 
   private:
     /**
-     * \brief Ipv6L3ProtocolTestCase test case.
-     * \relates Ipv6L3ProtocolTestCase
+     * @brief Ipv6L3ProtocolTestCase test case.
+     * @relates Ipv6L3ProtocolTestCase
      */
     friend class ::Ipv6L3ProtocolTestCase;
     /**
-     * \brief Ipv6ExtensionLooseRouting.
-     * \relates Ipv6ExtensionLooseRouting
+     * @brief Ipv6ExtensionLooseRouting.
+     * @relates Ipv6ExtensionLooseRouting
      */
     friend class Ipv6ExtensionLooseRouting;
 
     /**
-     * \brief Container of the IPv6 Interfaces.
+     * @brief Container of the IPv6 Interfaces.
      */
     typedef std::vector<Ptr<Ipv6Interface>> Ipv6InterfaceList;
 
     /**
-     * \brief Container of NetDevices registered to IPv6 and their interface indexes.
+     * @brief Container of NetDevices registered to IPv6 and their interface indexes.
      */
     typedef std::map<Ptr<const NetDevice>, uint32_t> Ipv6InterfaceReverseContainer;
 
     /**
-     * \brief Container of the IPv6 Raw Sockets.
+     * @brief Container of the IPv6 Raw Sockets.
      */
     typedef std::list<Ptr<Ipv6RawSocketImpl>> SocketList;
 
     /**
-     * \brief Container of the IPv6 L4 keys: protocol number, interface index
+     * @brief Container of the IPv6 L4 keys: protocol number, interface index
      */
     typedef std::pair<int, int32_t> L4ListKey_t;
 
     /**
-     * \brief Container of the IPv6 L4 instances.
+     * @brief Container of the IPv6 L4 instances.
      */
     typedef std::map<L4ListKey_t, Ptr<IpL4Protocol>> L4List_t;
 
     /**
-     * \brief Container of the IPv6 Autoconfigured addresses.
+     * @brief Container of the IPv6 Autoconfigured addresses.
      */
     typedef std::list<Ptr<Ipv6AutoconfiguredPrefix>> Ipv6AutoconfiguredPrefixList;
 
     /**
-     * \brief Iterator of the container of the IPv6 Autoconfigured addresses.
+     * @brief Iterator of the container of the IPv6 Autoconfigured addresses.
      */
     typedef std::list<Ptr<Ipv6AutoconfiguredPrefix>>::iterator Ipv6AutoconfiguredPrefixListI;
 
     /**
-     * \brief Make a copy of the packet, add the header and invoke the TX trace callback
-     * \param ipHeader the IP header that will be added to the packet
-     * \param packet the packet
-     * \param ipv6 the Ipv6 protocol
-     * \param interface the IP-level interface index
+     * @brief Make a copy of the packet, add the header and invoke the TX trace callback
+     * @param ipHeader the IP header that will be added to the packet
+     * @param packet the packet
+     * @param ipv6 the Ipv6 protocol
+     * @param interface the IP-level interface index
      *
      * Note: If the TracedCallback API ever is extended, we could consider
      * to check for connected functions before adding the header
@@ -555,24 +555,24 @@
                      uint32_t interface);
 
     /**
-     * \brief Callback to trace TX (transmission) packets.
-     * \deprecated The non-const \c Ptr<Ipv6> argument is deprecated
+     * @brief Callback to trace TX (transmission) packets.
+     * @deprecated The non-const \c Ptr<Ipv6> argument is deprecated
      * and will be changed to \c Ptr<const Ipv6> in a future release.
      */
     // NS_DEPRECATED() - tag for future removal
     TracedCallback<Ptr<const Packet>, Ptr<Ipv6>, uint32_t> m_txTrace;
 
     /**
-     * \brief Callback to trace RX (reception) packets.
-     * \deprecated The non-const \c Ptr<Ipv6> argument is deprecated
+     * @brief Callback to trace RX (reception) packets.
+     * @deprecated The non-const \c Ptr<Ipv6> argument is deprecated
      * and will be changed to \c Ptr<const Ipv6> in a future release.
      */
     // NS_DEPRECATED() - tag for future removal
     TracedCallback<Ptr<const Packet>, Ptr<Ipv6>, uint32_t> m_rxTrace;
 
     /**
-     * \brief Callback to trace drop packets.
-     * \deprecated The non-const \c Ptr<Ipv6> argument is deprecated
+     * @brief Callback to trace drop packets.
+     * @deprecated The non-const \c Ptr<Ipv6> argument is deprecated
      * and will be changed to \c Ptr<const Ipv6> in a future release.
      */
     // NS_DEPRECATED() - tag for future removal
@@ -587,14 +587,14 @@
     TracedCallback<const Ipv6Header&, Ptr<const Packet>, uint32_t> m_localDeliverTrace;
 
     /**
-     * \brief Construct an IPv6 header.
-     * \param src source IPv6 address
-     * \param dst destination IPv6 address
-     * \param protocol L4 protocol
-     * \param payloadSize payload size
-     * \param hopLimit Hop limit
-     * \param tclass Tclass
-     * \return newly created IPv6 header
+     * @brief Construct an IPv6 header.
+     * @param src source IPv6 address
+     * @param dst destination IPv6 address
+     * @param protocol L4 protocol
+     * @param payloadSize payload size
+     * @param hopLimit Hop limit
+     * @param tclass Tclass
+     * @return newly created IPv6 header
      */
     Ipv6Header BuildHeader(Ipv6Address src,
                            Ipv6Address dst,
@@ -604,19 +604,19 @@
                            uint8_t tclass);
 
     /**
-     * \brief Send packet with route.
-     * \param route route
-     * \param packet packet to send
-     * \param ipHeader IPv6 header to add to the packet
+     * @brief Send packet with route.
+     * @param route route
+     * @param packet packet to send
+     * @param ipHeader IPv6 header to add to the packet
      */
     void SendRealOut(Ptr<Ipv6Route> route, Ptr<Packet> packet, const Ipv6Header& ipHeader);
 
     /**
-     * \brief Forward a packet.
-     * \param idev Pointer to ingress network device
-     * \param rtentry route
-     * \param p packet to forward
-     * \param header IPv6 header to add to the packet
+     * @brief Forward a packet.
+     * @param idev Pointer to ingress network device
+     * @param rtentry route
+     * @param p packet to forward
+     * @param header IPv6 header to add to the packet
      */
     void IpForward(Ptr<const NetDevice> idev,
                    Ptr<Ipv6Route> rtentry,
@@ -624,11 +624,11 @@
                    const Ipv6Header& header);
 
     /**
-     * \brief Forward a multicast packet.
-     * \param idev Pointer to ingress network device
-     * \param mrtentry route
-     * \param p packet to forward
-     * \param header IPv6 header to add to the packet
+     * @brief Forward a multicast packet.
+     * @param idev Pointer to ingress network device
+     * @param mrtentry route
+     * @param p packet to forward
+     * @param header IPv6 header to add to the packet
      */
     void IpMulticastForward(Ptr<const NetDevice> idev,
                             Ptr<Ipv6MulticastRoute> mrtentry,
@@ -636,68 +636,68 @@
                             const Ipv6Header& header);
 
     /**
-     * \brief Deliver a packet.
-     * \param p packet delivered
-     * \param ip IPv6 header
-     * \param iif input interface packet was received
+     * @brief Deliver a packet.
+     * @param p packet delivered
+     * @param ip IPv6 header
+     * @param iif input interface packet was received
      */
     void LocalDeliver(Ptr<const Packet> p, const Ipv6Header& ip, uint32_t iif);
 
     /**
-     * \brief Fallback when no route is found.
-     * \param p packet
-     * \param ipHeader IPv6 header
-     * \param sockErrno error number
+     * @brief Fallback when no route is found.
+     * @param p packet
+     * @param ipHeader IPv6 header
+     * @param sockErrno error number
      */
     void RouteInputError(Ptr<const Packet> p,
                          const Ipv6Header& ipHeader,
                          Socket::SocketErrno sockErrno);
 
     /**
-     * \brief Add an IPv6 interface to the stack.
-     * \param interface interface to add
-     * \return index of newly added interface
+     * @brief Add an IPv6 interface to the stack.
+     * @param interface interface to add
+     * @return index of newly added interface
      */
     uint32_t AddIpv6Interface(Ptr<Ipv6Interface> interface);
 
     /**
-     * \brief Setup loopback interface.
+     * @brief Setup loopback interface.
      */
     void SetupLoopback();
 
     /**
-     * \brief Set IPv6 forwarding state.
-     * \param forward IPv6 forwarding enabled or not
+     * @brief Set IPv6 forwarding state.
+     * @param forward IPv6 forwarding enabled or not
      */
     void SetIpForward(bool forward) override;
 
     /**
-     * \brief Get IPv6 forwarding state.
-     * \return forwarding state (enabled or not)
+     * @brief Get IPv6 forwarding state.
+     * @return forwarding state (enabled or not)
      */
     bool GetIpForward() const override;
 
     /**
-     * \brief Set IPv6 MTU discover state.
-     * \param mtuDiscover IPv6 MTU discover enabled or not
+     * @brief Set IPv6 MTU discover state.
+     * @param mtuDiscover IPv6 MTU discover enabled or not
      */
     void SetMtuDiscover(bool mtuDiscover) override;
 
     /**
-     * \brief Get IPv6 MTU discover state.
-     * \return MTU discover state (enabled or not)
+     * @brief Get IPv6 MTU discover state.
+     * @return MTU discover state (enabled or not)
      */
     bool GetMtuDiscover() const override;
 
     /**
-     * \brief Set the ICMPv6 Redirect sending state.
-     * \param sendIcmpv6Redirect ICMPv6 Redirect sending enabled or not
+     * @brief Set the ICMPv6 Redirect sending state.
+     * @param sendIcmpv6Redirect ICMPv6 Redirect sending enabled or not
      */
     virtual void SetSendIcmpv6Redirect(bool sendIcmpv6Redirect);
 
     /**
-     * \brief Get the ICMPv6 Redirect sending state.
-     * \return ICMPv6 Redirect sending state (enabled or not)
+     * @brief Get the ICMPv6 Redirect sending state.
+     * @return ICMPv6 Redirect sending state (enabled or not)
      */
     virtual bool GetSendIcmpv6Redirect() const;
 
@@ -705,32 +705,32 @@
     bool GetStrongEndSystemModel() const override;
 
     /**
-     * \brief Node attached to stack.
+     * @brief Node attached to stack.
      */
     Ptr<Node> m_node;
 
     /**
-     * \brief Forwarding packets (i.e. router mode) state.
+     * @brief Forwarding packets (i.e. router mode) state.
      */
     bool m_ipForward;
 
     /**
-     * \brief MTU Discover (i.e. Path MTU) state.
+     * @brief MTU Discover (i.e. Path MTU) state.
      */
     bool m_mtuDiscover;
 
     /**
-     * \brief Path MTU Cache.
+     * @brief Path MTU Cache.
      */
     Ptr<Ipv6PmtuCache> m_pmtuCache;
 
     /**
-     * \brief List of transport protocol.
+     * @brief List of transport protocol.
      */
     L4List_t m_protocols;
 
     /**
-     * \brief List of IPv6 interfaces.
+     * @brief List of IPv6 interfaces.
      */
     Ipv6InterfaceList m_interfaces;
 
@@ -740,92 +740,92 @@
     Ipv6InterfaceReverseContainer m_reverseInterfacesContainer;
 
     /**
-     * \brief Number of IPv6 interfaces managed by the stack.
+     * @brief Number of IPv6 interfaces managed by the stack.
      */
     uint32_t m_nInterfaces;
 
     /**
-     * \brief Default TTL for outgoing packets.
+     * @brief Default TTL for outgoing packets.
      */
     uint8_t m_defaultTtl;
 
     /**
-     * \brief Default TCLASS for outgoing packets.
+     * @brief Default TCLASS for outgoing packets.
      */
     uint8_t m_defaultTclass;
 
     /**
-     * \brief Rejects packets directed to an interface with wrong address (\RFC{1222}).
+     * @brief Rejects packets directed to an interface with wrong address (\RFC{1222}).
      */
     bool m_strongEndSystemModel;
 
     /**
-     * \brief Routing protocol.
+     * @brief Routing protocol.
      */
     Ptr<Ipv6RoutingProtocol> m_routingProtocol;
 
     /**
-     * \brief List of IPv6 raw sockets.
+     * @brief List of IPv6 raw sockets.
      */
     SocketList m_sockets;
 
     /**
-     * \brief List of IPv6 prefix received from RA.
+     * @brief List of IPv6 prefix received from RA.
      */
     Ipv6AutoconfiguredPrefixList m_prefixes;
 
     /**
-     * \brief Allow ICMPv6 Redirect sending state
+     * @brief Allow ICMPv6 Redirect sending state
      */
     bool m_sendIcmpv6Redirect;
 
     /**
-     * \brief IPv6 multicast addresses / interface key.
+     * @brief IPv6 multicast addresses / interface key.
      */
     typedef std::pair<Ipv6Address, uint64_t> Ipv6RegisteredMulticastAddressKey_t;
 
     /**
-     * \brief Container of the IPv6 multicast addresses.
+     * @brief Container of the IPv6 multicast addresses.
      */
     typedef std::map<Ipv6RegisteredMulticastAddressKey_t, uint32_t>
         Ipv6RegisteredMulticastAddress_t;
 
     /**
-     * \brief Container Iterator of the IPv6 multicast addresses.
+     * @brief Container Iterator of the IPv6 multicast addresses.
      */
     typedef std::map<Ipv6RegisteredMulticastAddressKey_t, uint32_t>::iterator
         Ipv6RegisteredMulticastAddressIter_t;
 
     /**
-     * \brief Container Const Iterator of the IPv6 multicast addresses.
+     * @brief Container Const Iterator of the IPv6 multicast addresses.
      */
     typedef std::map<Ipv6RegisteredMulticastAddressKey_t, uint32_t>::const_iterator
         Ipv6RegisteredMulticastAddressCIter_t;
 
     /**
-     * \brief Container of the IPv6 multicast addresses.
+     * @brief Container of the IPv6 multicast addresses.
      */
     typedef std::map<Ipv6Address, uint32_t> Ipv6RegisteredMulticastAddressNoInterface_t;
 
     /**
-     * \brief Container Iterator of the IPv6 multicast addresses.
+     * @brief Container Iterator of the IPv6 multicast addresses.
      */
     typedef std::map<Ipv6Address, uint32_t>::iterator
         Ipv6RegisteredMulticastAddressNoInterfaceIter_t;
 
     /**
-     * \brief Container Const Iterator of the IPv6 multicast addresses.
+     * @brief Container Const Iterator of the IPv6 multicast addresses.
      */
     typedef std::map<Ipv6Address, uint32_t>::const_iterator
         Ipv6RegisteredMulticastAddressNoInterfaceCIter_t;
 
     /**
-     * \brief List of multicast IP addresses of interest, divided per interface.
+     * @brief List of multicast IP addresses of interest, divided per interface.
      */
     Ipv6RegisteredMulticastAddress_t m_multicastAddresses;
 
     /**
-     * \brief List of multicast IP addresses of interest for all the interfaces.
+     * @brief List of multicast IP addresses of interest for all the interfaces.
      */
     Ipv6RegisteredMulticastAddressNoInterface_t m_multicastAddressesNoInterface;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv6-list-routing.h ns-3.44/src/internet/model/ipv6-list-routing.h
--- ns-3.43/src/internet/model/ipv6-list-routing.h	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/ipv6-list-routing.h	2025-03-09 16:55:49.399371100 -0700
@@ -15,9 +15,9 @@
 {
 
 /**
- * \ingroup ipv6Routing
+ * @ingroup ipv6Routing
  *
- * \brief Hold list of Ipv6RoutingProtocol objects.
+ * @brief Hold list of Ipv6RoutingProtocol objects.
  *
  * This class is a specialization of Ipv6RoutingProtocol that allows
  * other instances of Ipv6RoutingProtocol to be inserted in a
@@ -33,45 +33,45 @@
 {
   public:
     /**
-     * \brief Get the type ID of this class.
-     * \return type ID
+     * @brief Get the type ID of this class.
+     * @return type ID
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Ipv6ListRouting();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Ipv6ListRouting() override;
 
     /**
-     * \brief Register a new routing protocol to be used in this IPv4 stack
-     * \param routingProtocol new routing protocol implementation object
-     * \param priority priority to give to this routing protocol.
+     * @brief Register a new routing protocol to be used in this IPv4 stack
+     * @param routingProtocol new routing protocol implementation object
+     * @param priority priority to give to this routing protocol.
      * Values may range between -32768 and +32767.
      */
     virtual void AddRoutingProtocol(Ptr<Ipv6RoutingProtocol> routingProtocol, int16_t priority);
 
     /**
-     * \brief Get the number of routing protocols.
-     * \return number of routing protocols in the list
+     * @brief Get the number of routing protocols.
+     * @return number of routing protocols in the list
      */
     virtual uint32_t GetNRoutingProtocols() const;
 
     /**
-     * \brief Get pointer to routing protocol stored at index,
+     * @brief Get pointer to routing protocol stored at index,
      *
      * The first protocol (index 0) the highest priority, the next one (index 1)
      * the second highest priority, and so on.  The priority parameter is an
      * output parameter and it returns the integer priority of the protocol.
-     * \param index index of protocol to return
-     * \param priority output parameter, set to the priority of the protocol
+     * @param index index of protocol to return
+     * @param priority output parameter, set to the priority of the protocol
      * being returned
-     * \return pointer to routing protocol indexed by
+     * @return pointer to routing protocol indexed by
      */
     virtual Ptr<Ipv6RoutingProtocol> GetRoutingProtocol(uint32_t index, int16_t& priority) const;
 
@@ -108,26 +108,26 @@
 
   protected:
     /**
-     * \brief Dispose this object.
+     * @brief Dispose this object.
      */
     void DoDispose() override;
 
   private:
     /**
-     * \brief Container identifying an IPv6 Routing Protocol entry in the list.
+     * @brief Container identifying an IPv6 Routing Protocol entry in the list.
      */
     typedef std::pair<int16_t, Ptr<Ipv6RoutingProtocol>> Ipv6RoutingProtocolEntry;
 
     /**
-     * \brief Container of the IPv6 Routing Protocols.
+     * @brief Container of the IPv6 Routing Protocols.
      */
     typedef std::list<Ipv6RoutingProtocolEntry> Ipv6RoutingProtocolList;
 
     /**
-     * \brief Compare two routing protocols.
-     * \param a first object to compare
-     * \param b second object to compare
-     * \return true if they are the same, false otherwise
+     * @brief Compare two routing protocols.
+     * @param a first object to compare
+     * @param b second object to compare
+     * @return true if they are the same, false otherwise
      */
     static bool Compare(const Ipv6RoutingProtocolEntry& a, const Ipv6RoutingProtocolEntry& b);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv6-option-demux.h ns-3.44/src/internet/model/ipv6-option-demux.h
--- ns-3.43/src/internet/model/ipv6-option-demux.h	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/ipv6-option-demux.h	2025-03-09 16:55:49.399371100 -0700
@@ -21,73 +21,73 @@
 class Node;
 
 /**
- * \ingroup ipv6HeaderExt
+ * @ingroup ipv6HeaderExt
  *
- * \brief IPv6 Option Demux.
+ * @brief IPv6 Option Demux.
  */
 class Ipv6OptionDemux : public Object
 {
   public:
     /**
-     * \brief The interface ID.
-     * \return type ID
+     * @brief The interface ID.
+     * @return type ID
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Ipv6OptionDemux();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Ipv6OptionDemux() override;
 
     /**
-     * \brief Set the node.
-     * \param node the node to set
+     * @brief Set the node.
+     * @param node the node to set
      */
     void SetNode(Ptr<Node> node);
 
     /**
-     * \brief Insert a new IPv6 Option.
-     * \param option the option to insert
+     * @brief Insert a new IPv6 Option.
+     * @param option the option to insert
      */
     void Insert(Ptr<Ipv6Option> option);
 
     /**
-     * \brief Get the option corresponding to optionNumber.
-     * \param optionNumber the option number of the option to retrieve
-     * \return a matching IPv6 option
+     * @brief Get the option corresponding to optionNumber.
+     * @param optionNumber the option number of the option to retrieve
+     * @return a matching IPv6 option
      */
     Ptr<Ipv6Option> GetOption(int optionNumber);
 
     /**
-     * \brief Remove an option from this demux.
-     * \param option pointer on the option to remove
+     * @brief Remove an option from this demux.
+     * @param option pointer on the option to remove
      */
     void Remove(Ptr<Ipv6Option> option);
 
   protected:
     /**
-     * \brief Dispose this object.
+     * @brief Dispose this object.
      */
     void DoDispose() override;
 
   private:
     /**
-     * \brief Container of the IPv6 Options types.
+     * @brief Container of the IPv6 Options types.
      */
     typedef std::list<Ptr<Ipv6Option>> Ipv6OptionList_t;
 
     /**
-     * \brief List of IPv6 Options supported.
+     * @brief List of IPv6 Options supported.
      */
     Ipv6OptionList_t m_options;
 
     /**
-     * \brief The node.
+     * @brief The node.
      */
     Ptr<Node> m_node;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv6-option.h ns-3.44/src/internet/model/ipv6-option.h
--- ns-3.43/src/internet/model/ipv6-option.h	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/ipv6-option.h	2025-03-09 16:55:49.399371100 -0700
@@ -25,9 +25,9 @@
 {
 
 /**
- * \ingroup ipv6HeaderExt
+ * @ingroup ipv6HeaderExt
  *
- * \brief IPv6 Option base
+ * @brief IPv6 Option base
  *
  * If you want to implement a new IPv6 option, all you have to do is
  * implement a subclass of this class and add it to an Ipv6OptionDemux.
@@ -36,37 +36,37 @@
 {
   public:
     /**
-     * \brief Get the type identificator.
-     * \return type identificator
+     * @brief Get the type identificator.
+     * @return type identificator
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Ipv6Option() override;
 
     /**
-     * \brief Set the node.
-     * \param node the node to set
+     * @brief Set the node.
+     * @param node the node to set
      */
     void SetNode(Ptr<Node> node);
 
     /**
-     * \brief Get the option number.
-     * \return option number
+     * @brief Get the option number.
+     * @return option number
      */
     virtual uint8_t GetOptionNumber() const = 0;
 
     /**
-     * \brief Process method
+     * @brief Process method
      *
      * Called from Ipv6L3Protocol::Receive.
-     * \param packet the packet
-     * \param offset the offset of the extension to process
-     * \param ipv6Header the IPv6 header of packet received
-     * \param isDropped if the packet must be dropped
-     * \return the processed size
+     * @param packet the packet
+     * @param offset the offset of the extension to process
+     * @param ipv6Header the IPv6 header of packet received
+     * @param isDropped if the packet must be dropped
+     * @return the processed size
      */
     virtual uint8_t Process(Ptr<Packet> packet,
                             uint8_t offset,
@@ -75,55 +75,55 @@
 
   private:
     /**
-     * \brief The node.
+     * @brief The node.
      */
     Ptr<Node> m_node;
 };
 
 /**
- * \ingroup ipv6HeaderExt
+ * @ingroup ipv6HeaderExt
  *
- * \brief IPv6 Option Pad1
+ * @brief IPv6 Option Pad1
  */
 class Ipv6OptionPad1 : public Ipv6Option
 {
   public:
     /**
-     * \brief Pad1 option number.
+     * @brief Pad1 option number.
      */
     static const uint8_t OPT_NUMBER = 0;
 
     /**
-     * \brief Get the type identificator.
-     * \return type identificator
+     * @brief Get the type identificator.
+     * @return type identificator
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Ipv6OptionPad1();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Ipv6OptionPad1() override;
 
     /**
-     * \brief Get the option number.
-     * \return option number
+     * @brief Get the option number.
+     * @return option number
      */
     uint8_t GetOptionNumber() const override;
 
     /**
-     * \brief Process method
+     * @brief Process method
      *
      * Called from Ipv6L3Protocol::Receive.
-     * \param packet the packet
-     * \param offset the offset of the extension to process
-     * \param ipv6Header the IPv6 header of packet received
-     * \param isDropped if the packet must be dropped
-     * \return the processed size
+     * @param packet the packet
+     * @param offset the offset of the extension to process
+     * @param ipv6Header the IPv6 header of packet received
+     * @param isDropped if the packet must be dropped
+     * @return the processed size
      */
     uint8_t Process(Ptr<Packet> packet,
                     uint8_t offset,
@@ -132,49 +132,49 @@
 };
 
 /**
- * \ingroup ipv6HeaderExt
+ * @ingroup ipv6HeaderExt
  *
- * \brief IPv6 Option Padn
+ * @brief IPv6 Option Padn
  */
 class Ipv6OptionPadn : public Ipv6Option
 {
   public:
     /**
-     * \brief PadN option number.
+     * @brief PadN option number.
      */
     static const uint8_t OPT_NUMBER = 60;
 
     /**
-     * \brief Get the type identificator.
-     * \return type identificator
+     * @brief Get the type identificator.
+     * @return type identificator
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Ipv6OptionPadn();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Ipv6OptionPadn() override;
 
     /**
-     * \brief Get the option number.
-     * \return option number
+     * @brief Get the option number.
+     * @return option number
      */
     uint8_t GetOptionNumber() const override;
 
     /**
-     * \brief Process method
+     * @brief Process method
      *
      * Called from Ipv6L3Protocol::Receive.
-     * \param packet the packet
-     * \param offset the offset of the extension to process
-     * \param ipv6Header the IPv6 header of packet received
-     * \param isDropped if the packet must be dropped
-     * \return the processed size
+     * @param packet the packet
+     * @param offset the offset of the extension to process
+     * @param ipv6Header the IPv6 header of packet received
+     * @param isDropped if the packet must be dropped
+     * @return the processed size
      */
     uint8_t Process(Ptr<Packet> packet,
                     uint8_t offset,
@@ -183,48 +183,48 @@
 };
 
 /**
- * \ingroup ipv6HeaderExt
+ * @ingroup ipv6HeaderExt
  *
- * \brief IPv6 Option Jumbogram
+ * @brief IPv6 Option Jumbogram
  */
 class Ipv6OptionJumbogram : public Ipv6Option
 {
   public:
     /**
-     * \brief Jumbogram option number.
+     * @brief Jumbogram option number.
      */
     static const uint8_t OPT_NUMBER = 44;
 
     /**
-     * \brief Get the type identificator.
-     * \return type identificator
+     * @brief Get the type identificator.
+     * @return type identificator
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Ipv6OptionJumbogram();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Ipv6OptionJumbogram() override;
 
     /**
-     * \brief Get the option number.
-     * \return option number
+     * @brief Get the option number.
+     * @return option number
      */
     uint8_t GetOptionNumber() const override;
 
     /**
-     * \brief Process method
+     * @brief Process method
      * Called from Ipv6L3Protocol::Receive.
-     * \param packet the packet
-     * \param offset the offset of the extension to process
-     * \param ipv6Header the IPv6 header of packet received
-     * \param isDropped if the packet must be dropped
-     * \return the processed size
+     * @param packet the packet
+     * @param offset the offset of the extension to process
+     * @param ipv6Header the IPv6 header of packet received
+     * @param isDropped if the packet must be dropped
+     * @return the processed size
      */
     uint8_t Process(Ptr<Packet> packet,
                     uint8_t offset,
@@ -233,49 +233,49 @@
 };
 
 /**
- * \ingroup ipv6HeaderExt
+ * @ingroup ipv6HeaderExt
  *
- * \brief IPv6 Option Router Alert
+ * @brief IPv6 Option Router Alert
  */
 class Ipv6OptionRouterAlert : public Ipv6Option
 {
   public:
     /**
-     * \brief Router alert option number.
+     * @brief Router alert option number.
      */
     static const uint8_t OPT_NUMBER = 43;
 
     /**
-     * \brief Get the type identificator.
-     * \return type identificator
+     * @brief Get the type identificator.
+     * @return type identificator
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Ipv6OptionRouterAlert();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Ipv6OptionRouterAlert() override;
 
     /**
-     * \brief Get the option number.
-     * \return option number
+     * @brief Get the option number.
+     * @return option number
      */
     uint8_t GetOptionNumber() const override;
 
     /**
-     * \brief Process method
+     * @brief Process method
      *
      * Called from Ipv6L3Protocol::Receive.
-     * \param packet the packet
-     * \param offset the offset of the extension to process
-     * \param ipv6Header the IPv6 header of packet received
-     * \param isDropped if the packet must be dropped
-     * \return the processed size
+     * @param packet the packet
+     * @param offset the offset of the extension to process
+     * @param ipv6Header the IPv6 header of packet received
+     * @param isDropped if the packet must be dropped
+     * @return the processed size
      */
     uint8_t Process(Ptr<Packet> packet,
                     uint8_t offset,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv6-option-header.h ns-3.44/src/internet/model/ipv6-option-header.h
--- ns-3.43/src/internet/model/ipv6-option-header.h	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/ipv6-option-header.h	2025-03-09 16:55:49.399371100 -0700
@@ -17,16 +17,16 @@
 {
 
 /**
- * \ingroup ipv6HeaderExt
+ * @ingroup ipv6HeaderExt
  *
- * \brief Header for IPv6 Option.
+ * @brief Header for IPv6 Option.
  */
 class Ipv6OptionHeader : public Header
 {
   public:
     /**
-     * \struct Alignment
-     * \brief represents the alignment requirements of an option header
+     * @struct Alignment
+     * @brief represents the alignment requirements of an option header
      *
      * Represented as factor*n+offset (eg. 8n+2) See \RFC{2460}.
      * No alignment is represented as 1n+0.
@@ -38,79 +38,79 @@
     };
 
     /**
-     * \brief Get the type identificator.
-     * \return type identificator
+     * @brief Get the type identificator.
+     * @return type identificator
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
 
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Ipv6OptionHeader();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Ipv6OptionHeader() override;
 
     /**
-     * \brief Set the type of the option.
-     * \param type the type of the option
+     * @brief Set the type of the option.
+     * @param type the type of the option
      */
     void SetType(uint8_t type);
 
     /**
-     * \brief Get the type of the option.
-     * \return the type of the option
+     * @brief Get the type of the option.
+     * @return the type of the option
      */
     uint8_t GetType() const;
 
     /**
-     * \brief Set the option length.
-     * \param length the option length
+     * @brief Set the option length.
+     * @param length the option length
      */
     void SetLength(uint8_t length);
 
     /**
-     * \brief Get the option length.
-     * \return the option length
+     * @brief Get the option length.
+     * @return the option length
      */
     uint8_t GetLength() const;
 
     /**
-     * \brief Print some information about the packet.
-     * \param os output stream
+     * @brief Print some information about the packet.
+     * @param os output stream
      */
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Get the serialized size of the packet.
-     * \return size
+     * @brief Get the serialized size of the packet.
+     * @return size
      */
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Serialize the packet.
-     * \param start Buffer iterator
+     * @brief Serialize the packet.
+     * @param start Buffer iterator
      */
     void Serialize(Buffer::Iterator start) const override;
 
     /**
-     * \brief Deserialize the packet.
-     * \param start Buffer iterator
-     * \return size of the packet
+     * @brief Deserialize the packet.
+     * @param start Buffer iterator
+     * @return size of the packet
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
 
     /**
-     * \brief Get the Alignment requirement of this option header
-     * \return The required alignment
+     * @brief Get the Alignment requirement of this option header
+     * @return The required alignment
      *
      * Subclasses should only implement this method, if special alignment is
      * required. Default is no alignment (1n+0).
@@ -119,290 +119,290 @@
 
   private:
     /**
-     * \brief The type of the option.
+     * @brief The type of the option.
      */
     uint8_t m_type;
 
     /**
-     * \brief The option length.
+     * @brief The option length.
      */
     uint8_t m_length;
 
     /**
-     * \brief The anonymous data of this option
+     * @brief The anonymous data of this option
      */
     Buffer m_data;
 };
 
 /**
- * \ingroup ipv6HeaderExt
+ * @ingroup ipv6HeaderExt
  *
- * \brief Header of IPv6 Option Pad1
+ * @brief Header of IPv6 Option Pad1
  */
 class Ipv6OptionPad1Header : public Ipv6OptionHeader
 {
   public:
     /**
-     * \brief Get the type identificator.
-     * \return type identificator
+     * @brief Get the type identificator.
+     * @return type identificator
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
 
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Ipv6OptionPad1Header();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Ipv6OptionPad1Header() override;
 
     /**
-     * \brief Print some information about the packet.
-     * \param os output stream
+     * @brief Print some information about the packet.
+     * @param os output stream
      */
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Get the serialized size of the packet.
-     * \return size
+     * @brief Get the serialized size of the packet.
+     * @return size
      */
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Serialize the packet.
-     * \param start Buffer iterator
+     * @brief Serialize the packet.
+     * @param start Buffer iterator
      */
     void Serialize(Buffer::Iterator start) const override;
 
     /**
-     * \brief Deserialize the packet.
-     * \param start Buffer iterator
-     * \return size of the packet
+     * @brief Deserialize the packet.
+     * @param start Buffer iterator
+     * @return size of the packet
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
 };
 
 /**
- * \ingroup ipv6HeaderExt
+ * @ingroup ipv6HeaderExt
  *
- * \brief Header of IPv6 Option Padn
+ * @brief Header of IPv6 Option Padn
  */
 class Ipv6OptionPadnHeader : public Ipv6OptionHeader
 {
   public:
     /**
-     * \brief Get the type identificator.
-     * \return type identificator
+     * @brief Get the type identificator.
+     * @return type identificator
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
 
     /**
-     * \brief Constructor.
-     * \param pad Number of bytes to pad (>=2)
+     * @brief Constructor.
+     * @param pad Number of bytes to pad (>=2)
      */
     Ipv6OptionPadnHeader(uint32_t pad = 2);
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Ipv6OptionPadnHeader() override;
 
     /**
-     * \brief Print some information about the packet.
-     * \param os output stream
+     * @brief Print some information about the packet.
+     * @param os output stream
      */
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Get the serialized size of the packet.
-     * \return size
+     * @brief Get the serialized size of the packet.
+     * @return size
      */
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Serialize the packet.
-     * \param start Buffer iterator
+     * @brief Serialize the packet.
+     * @param start Buffer iterator
      */
     void Serialize(Buffer::Iterator start) const override;
 
     /**
-     * \brief Deserialize the packet.
-     * \param start Buffer iterator
-     * \return size of the packet
+     * @brief Deserialize the packet.
+     * @param start Buffer iterator
+     * @return size of the packet
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
 };
 
 /**
- * \ingroup ipv6HeaderExt
+ * @ingroup ipv6HeaderExt
  *
- * \brief Header of IPv6 Option Jumbogram
+ * @brief Header of IPv6 Option Jumbogram
  */
 class Ipv6OptionJumbogramHeader : public Ipv6OptionHeader
 {
   public:
     /**
-     * \brief Get the type identificator.
-     * \return type identificator
+     * @brief Get the type identificator.
+     * @return type identificator
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
 
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Ipv6OptionJumbogramHeader();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Ipv6OptionJumbogramHeader() override;
 
     /**
-     * \brief Set the data length.
-     * \param dataLength the data length
+     * @brief Set the data length.
+     * @param dataLength the data length
      */
     void SetDataLength(uint32_t dataLength);
 
     /**
-     * \brief Get the data length.
-     * \return the data length
+     * @brief Get the data length.
+     * @return the data length
      */
     uint32_t GetDataLength() const;
 
     /**
-     * \brief Print some information about the packet.
-     * \param os output stream
+     * @brief Print some information about the packet.
+     * @param os output stream
      */
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Get the serialized size of the packet.
-     * \return size
+     * @brief Get the serialized size of the packet.
+     * @return size
      */
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Serialize the packet.
-     * \param start Buffer iterator
+     * @brief Serialize the packet.
+     * @param start Buffer iterator
      */
     void Serialize(Buffer::Iterator start) const override;
 
     /**
-     * \brief Deserialize the packet.
-     * \param start Buffer iterator
-     * \return size of the packet
+     * @brief Deserialize the packet.
+     * @param start Buffer iterator
+     * @return size of the packet
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
 
     /**
-     * \brief Get the Alignment requirement of this option header
-     * \return The required alignment
+     * @brief Get the Alignment requirement of this option header
+     * @return The required alignment
      */
     Alignment GetAlignment() const override;
 
   private:
     /**
-     * \brief The data length.
+     * @brief The data length.
      */
     uint32_t m_dataLength;
 };
 
 /**
- * \ingroup ipv6HeaderExt
+ * @ingroup ipv6HeaderExt
  *
- * \brief Header of IPv6 Option Router Alert
+ * @brief Header of IPv6 Option Router Alert
  */
 class Ipv6OptionRouterAlertHeader : public Ipv6OptionHeader
 {
   public:
     /**
-     * \brief Get the type identificator.
-     * \return type identificator
+     * @brief Get the type identificator.
+     * @return type identificator
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Get the instance type ID.
-     * \return instance type ID
+     * @brief Get the instance type ID.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
 
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Ipv6OptionRouterAlertHeader();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Ipv6OptionRouterAlertHeader() override;
 
     /**
-     * \brief Set the field "value".
-     * \param value the value to be set.
+     * @brief Set the field "value".
+     * @param value the value to be set.
      */
     void SetValue(uint16_t value);
 
     /**
-     * \brief Get the field "value".
-     * \return the field "value"
+     * @brief Get the field "value".
+     * @return the field "value"
      */
     uint16_t GetValue() const;
 
     /**
-     * \brief Print some information about the packet.
-     * \param os output stream
+     * @brief Print some information about the packet.
+     * @param os output stream
      */
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Get the serialized size of the packet.
-     * \return size
+     * @brief Get the serialized size of the packet.
+     * @return size
      */
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Serialize the packet.
-     * \param start Buffer iterator
+     * @brief Serialize the packet.
+     * @param start Buffer iterator
      */
     void Serialize(Buffer::Iterator start) const override;
 
     /**
-     * \brief Deserialize the packet.
-     * \param start Buffer iterator
-     * \return size of the packet
+     * @brief Deserialize the packet.
+     * @param start Buffer iterator
+     * @return size of the packet
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
 
     /**
-     * \brief Get the Alignment requirement of this option header
-     * \return The required alignment
+     * @brief Get the Alignment requirement of this option header
+     * @return The required alignment
      */
     Alignment GetAlignment() const override;
 
   private:
     /**
-     * \brief The value.
+     * @brief The value.
      */
     uint16_t m_value;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv6-packet-filter.h ns-3.44/src/internet/model/ipv6-packet-filter.h
--- ns-3.43/src/internet/model/ipv6-packet-filter.h	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/ipv6-packet-filter.h	2025-03-09 16:55:49.399371100 -0700
@@ -19,8 +19,8 @@
 {
 
 /**
- * \ingroup ipv6
- * \ingroup traffic-control
+ * @ingroup ipv6
+ * @ingroup traffic-control
  *
  * Ipv6PacketFilter is the abstract base class for filters defined for IPv6 packets.
  */
@@ -28,8 +28,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv6-packet-info-tag.h ns-3.44/src/internet/model/ipv6-packet-info-tag.h
--- ns-3.43/src/internet/model/ipv6-packet-info-tag.h	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/ipv6-packet-info-tag.h	2025-03-09 16:55:49.399371100 -0700
@@ -19,9 +19,9 @@
 class Packet;
 
 /**
- * \ingroup ipv6
+ * @ingroup ipv6
  *
- * \brief This class implements a tag that carries socket ancillary
+ * @brief This class implements a tag that carries socket ancillary
  * data to the socket interface. This is used like
  * socket option of IP_PKTINFO/IPV6_PKTINFO in \RFC{3542}
  *
@@ -39,64 +39,64 @@
     Ipv6PacketInfoTag();
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Set the tag's address
+     * @brief Set the tag's address
      *
-     * \param addr the address
+     * @param addr the address
      */
     void SetAddress(Ipv6Address addr);
 
     /**
-     * \brief Get the tag's address
+     * @brief Get the tag's address
      *
-     * \returns the address
+     * @returns the address
      */
     Ipv6Address GetAddress() const;
 
     /**
-     * \brief Set the tag's receiving interface
+     * @brief Set the tag's receiving interface
      *
-     * \param ifindex the interface index
+     * @param ifindex the interface index
      */
     void SetRecvIf(uint32_t ifindex);
 
     /**
-     * \brief Get the tag's receiving interface
+     * @brief Get the tag's receiving interface
      *
-     * \returns the interface index
+     * @returns the interface index
      */
     uint32_t GetRecvIf() const;
 
     /**
-     * \brief Set the tag's Hop Limit
+     * @brief Set the tag's Hop Limit
      *
-     * \param ttl the hop limit
+     * @param ttl the hop limit
      */
     void SetHoplimit(uint8_t ttl);
 
     /**
-     * \brief Get the tag's Hop Limit
+     * @brief Get the tag's Hop Limit
      *
-     * \returns the Hop Limit
+     * @returns the Hop Limit
      */
     uint8_t GetHoplimit() const;
 
     /**
-     * \brief Set the tag's Traffic Class
+     * @brief Set the tag's Traffic Class
      *
-     * \param tclass the Traffic Class
+     * @param tclass the Traffic Class
      */
     void SetTrafficClass(uint8_t tclass);
 
     /**
-     * \brief Get the tag's Traffic Class
+     * @brief Get the tag's Traffic Class
      *
-     * \returns the Traffic Class
+     * @returns the Traffic Class
      */
     uint8_t GetTrafficClass() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv6-packet-probe.h ns-3.44/src/internet/model/ipv6-packet-probe.h
--- ns-3.43/src/internet/model/ipv6-packet-probe.h	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/ipv6-packet-probe.h	2025-03-09 16:55:49.399371100 -0700
@@ -28,7 +28,7 @@
 {
 
 /**
- * \ingroup ipv6
+ * @ingroup ipv6
  *
  * This class is designed to probe an underlying ns3 TraceSource
  * exporting a packet, an IPv6 object, and an interface.  This probe
@@ -41,8 +41,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -50,21 +50,21 @@
     ~Ipv6PacketProbe() override;
 
     /**
-     * \brief Set a probe value
+     * @brief Set a probe value
      *
-     * \param packet set the traced packet equal to this
-     * \param ipv6 set the IPv6 object for the traced packet equal to this
-     * \param interface set the IPv6 interface for the traced packet equal to this
+     * @param packet set the traced packet equal to this
+     * @param ipv6 set the IPv6 object for the traced packet equal to this
+     * @param interface set the IPv6 interface for the traced packet equal to this
      */
     void SetValue(Ptr<const Packet> packet, Ptr<Ipv6> ipv6, uint32_t interface);
 
     /**
-     * \brief Set a probe value by its name in the Config system
+     * @brief Set a probe value by its name in the Config system
      *
-     * \param path config path to access the probe
-     * \param packet set the traced packet equal to this
-     * \param ipv6 set the IPv6 object for the traced packet equal to this
-     * \param interface set the IPv6 interface for the traced packet equal to this
+     * @param path config path to access the probe
+     * @param packet set the traced packet equal to this
+     * @param ipv6 set the IPv6 object for the traced packet equal to this
+     * @param interface set the IPv6 interface for the traced packet equal to this
      */
     static void SetValueByPath(std::string path,
                                Ptr<const Packet> packet,
@@ -72,18 +72,18 @@
                                uint32_t interface);
 
     /**
-     * \brief connect to a trace source attribute provided by a given object
+     * @brief connect to a trace source attribute provided by a given object
      *
-     * \param traceSource the name of the attribute TraceSource to connect to
-     * \param obj ns3::Object to connect to
-     * \return true if the trace source was successfully connected
+     * @param traceSource the name of the attribute TraceSource to connect to
+     * @param obj ns3::Object to connect to
+     * @return true if the trace source was successfully connected
      */
     bool ConnectByObject(std::string traceSource, Ptr<Object> obj) override;
 
     /**
-     * \brief connect to a trace source provided by a config path
+     * @brief connect to a trace source provided by a config path
      *
-     * \param path Config path to bind to
+     * @param path Config path to bind to
      *
      * Note, if an invalid path is provided, the probe will not be connected
      * to anything.
@@ -92,12 +92,12 @@
 
   private:
     /**
-     * \brief Method to connect to an underlying ns3::TraceSource with
+     * @brief Method to connect to an underlying ns3::TraceSource with
      * arguments of type Ptr<const Packet>, Ptr<Ipv6>, and uint32_t
      *
-     * \param packet the traced packet
-     * \param ipv6 the IPv6 object for the traced packet
-     * \param interface the IPv6 interface for the traced packet
+     * @param packet the traced packet
+     * @param ipv6 the IPv6 object for the traced packet
+     * @param interface the IPv6 interface for the traced packet
      */
     void TraceSink(Ptr<const Packet> packet, Ptr<Ipv6> ipv6, uint32_t interface);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv6-pmtu-cache.cc ns-3.44/src/internet/model/ipv6-pmtu-cache.cc
--- ns-3.43/src/internet/model/ipv6-pmtu-cache.cc	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/ipv6-pmtu-cache.cc	2025-03-09 16:55:49.399371100 -0700
@@ -30,7 +30,7 @@
                 "Validity time for a Path MTU entry. Default is 10 minutes, minimum is 5 minutes.",
                 TimeValue(Seconds(60 * 10)),
                 MakeTimeAccessor(&Ipv6PmtuCache::m_validityTime),
-                MakeTimeChecker(Time(Seconds(60 * 5))));
+                MakeTimeChecker(Seconds(60 * 5)));
     return tid;
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv6-pmtu-cache.h ns-3.44/src/internet/model/ipv6-pmtu-cache.h
--- ns-3.43/src/internet/model/ipv6-pmtu-cache.h	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/ipv6-pmtu-cache.h	2025-03-09 16:55:49.399371100 -0700
@@ -21,9 +21,9 @@
 {
 
 /**
- * \ingroup ipv6
+ * @ingroup ipv6
  *
- * \brief This class implements the Path MTU cache, as defined by \RFC{1981}.
+ * @brief This class implements the Path MTU cache, as defined by \RFC{1981}.
  *
  * The Path MTU is stored according to the destination address, and it is
  * cleared upon expiration (default validity time is 10 minutes).
@@ -39,77 +39,77 @@
     class Entry;
 
     /**
-     * \brief Get the type ID
-     * \return type ID
+     * @brief Get the type ID
+     * @return type ID
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Ipv6PmtuCache();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Ipv6PmtuCache() override;
 
     /**
-     * \brief Dispose object.
+     * @brief Dispose object.
      */
     void DoDispose() override;
 
     /**
-     * \brief Gets the known Path MTU for the specific destination
-     * \param dst the destination
-     * \return the Path MTU (zero if unknown)
+     * @brief Gets the known Path MTU for the specific destination
+     * @param dst the destination
+     * @return the Path MTU (zero if unknown)
      */
     uint32_t GetPmtu(Ipv6Address dst);
 
     /**
-     * \brief Sets the Path MTU for the specific destination
-     * \param dst the destination
-     * \param pmtu the Path MTU
+     * @brief Sets the Path MTU for the specific destination
+     * @param dst the destination
+     * @param pmtu the Path MTU
      */
     void SetPmtu(Ipv6Address dst, uint32_t pmtu);
 
     /**
-     * \brief Gets the Path MTU validity time
-     * \return the Path MTU validity time
+     * @brief Gets the Path MTU validity time
+     * @return the Path MTU validity time
      */
     Time GetPmtuValidityTime() const;
 
     /**
-     * \brief Sets the Path MTU validity time (minimum is 5 minutes)
-     * \param validity the Path MTU validity time
-     * \return true if the change was successful
+     * @brief Sets the Path MTU validity time (minimum is 5 minutes)
+     * @param validity the Path MTU validity time
+     * @return true if the change was successful
      */
     bool SetPmtuValidityTime(Time validity);
 
   private:
     /**
-     * \brief Clears the Path MTU for the specific destination
-     * \param dst the destination
+     * @brief Clears the Path MTU for the specific destination
+     * @param dst the destination
      */
     void ClearPmtu(Ipv6Address dst);
 
     /**
-     * \brief Path MTU table
+     * @brief Path MTU table
      */
     std::map<Ipv6Address, uint32_t> m_pathMtu;
 
     /**
-     * \brief Container of the IPv6 PMTU data (Ipv6 destination address and expiration event).
+     * @brief Container of the IPv6 PMTU data (Ipv6 destination address and expiration event).
      */
     typedef std::map<Ipv6Address, EventId>::iterator pathMtuTimerIter;
 
     /**
-     * \brief Path MTU Expiration table
+     * @brief Path MTU Expiration table
      */
     std::map<Ipv6Address, EventId> m_pathMtuTimer;
 
     /**
-     * \brief Path MTU entry validity time
+     * @brief Path MTU entry validity time
      */
     Time m_validityTime;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv6-queue-disc-item.h ns-3.44/src/internet/model/ipv6-queue-disc-item.h
--- ns-3.43/src/internet/model/ipv6-queue-disc-item.h	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/ipv6-queue-disc-item.h	2025-03-09 16:55:49.399371100 -0700
@@ -16,8 +16,8 @@
 {
 
 /**
- * \ingroup ipv6
- * \ingroup traffic-control
+ * @ingroup ipv6
+ * @ingroup traffic-control
  *
  * Ipv6QueueDiscItem is a subclass of QueueDiscItem which stores IPv6 packets.
  * Header and payload are kept separate to allow the queue disc to manipulate
@@ -27,11 +27,11 @@
 {
   public:
     /**
-     * \brief Create an IPv6 queue disc item containing an IPv6 packet.
-     * \param p the packet included in the created item.
-     * \param addr the destination MAC address
-     * \param protocol the protocol number
-     * \param header the IPv6 header
+     * @brief Create an IPv6 queue disc item containing an IPv6 packet.
+     * @param p the packet included in the created item.
+     * @param addr the destination MAC address
+     * @param protocol the protocol number
+     * @param header the IPv6 header
      */
     Ipv6QueueDiscItem(Ptr<Packet> p,
                       const Address& addr,
@@ -46,23 +46,23 @@
     Ipv6QueueDiscItem& operator=(const Ipv6QueueDiscItem&) = delete;
 
     /**
-     * \return the correct packet size (header plus payload).
+     * @return the correct packet size (header plus payload).
      */
     uint32_t GetSize() const override;
 
     /**
-     * \return the header stored in this item..
+     * @return the header stored in this item..
      */
     const Ipv6Header& GetHeader() const;
 
     /**
-     * \brief Add the header to the packet
+     * @brief Add the header to the packet
      */
     void AddHeader() override;
 
     /**
-     * \brief Print the item contents.
-     * \param os output stream in which the data should be printed.
+     * @brief Print the item contents.
+     * @param os output stream in which the data should be printed.
      */
     void Print(std::ostream& os) const override;
 
@@ -76,21 +76,21 @@
     bool GetUint8Value(Uint8Values field, uint8_t& value) const override;
 
     /**
-     * \brief Marks the packet by setting ECN_CE bits if the packet has
+     * @brief Marks the packet by setting ECN_CE bits if the packet has
      * ECN_ECT0 or ECN_ECT1 set.  If ECN_CE is already set, returns true.
-     * \return true if the method results in a marked packet, false otherwise
+     * @return true if the method results in a marked packet, false otherwise
      */
     bool Mark() override;
 
     /**
-     * \brief Computes the hash of the packet's 5-tuple
+     * @brief Computes the hash of the packet's 5-tuple
      *
      * Computes the hash of the source and destination IP addresses, protocol
      * number and, if the transport protocol is either UDP or TCP, the source
      * and destination port
      *
-     * \param perturbation hash perturbation value
-     * \return the hash of the packet's 5-tuple
+     * @param perturbation hash perturbation value
+     * @return the hash of the packet's 5-tuple
      */
     uint32_t Hash(uint32_t perturbation) const override;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv6-raw-socket-factory.h ns-3.44/src/internet/model/ipv6-raw-socket-factory.h
--- ns-3.43/src/internet/model/ipv6-raw-socket-factory.h	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/ipv6-raw-socket-factory.h	2025-03-09 16:55:49.399371100 -0700
@@ -17,10 +17,10 @@
 class Socket;
 
 /**
- * \ingroup ipv6
- * \ingroup socket
+ * @ingroup ipv6
+ * @ingroup socket
  *
- * \brief API to create IPv6 RAW socket instances
+ * @brief API to create IPv6 RAW socket instances
  *
  * This abstract class defines the API for IPv6 RAW socket factory.
  *
@@ -34,7 +34,7 @@
  * behavior.
  *
  * A correct example is (from src/applications/model/radvd.cc):
- * \code
+ * @code
    if (!m_socket)
      {
        TypeId tid = TypeId::LookupByName ("ns3::Ipv6RawSocketFactory");
@@ -45,15 +45,15 @@
        m_socket->SetAttribute ("Protocol", UintegerValue(Ipv6Header::IPV6_ICMPV6));
        m_socket->SetRecvCallback (MakeCallback (&Radvd::HandleRead, this));
      }
- * \endcode
+ * @endcode
  *
  */
 class Ipv6RawSocketFactory : public SocketFactory
 {
   public:
     /**
-     * \brief Get the type ID of this class.
-     * \return type ID
+     * @brief Get the type ID of this class.
+     * @return type ID
      */
     static TypeId GetTypeId();
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv6-raw-socket-factory-impl.h ns-3.44/src/internet/model/ipv6-raw-socket-factory-impl.h
--- ns-3.43/src/internet/model/ipv6-raw-socket-factory-impl.h	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/ipv6-raw-socket-factory-impl.h	2025-03-09 16:55:49.399371100 -0700
@@ -15,17 +15,17 @@
 {
 
 /**
- * \ingroup socket
- * \ingroup ipv6
+ * @ingroup socket
+ * @ingroup ipv6
  *
- * \brief Implementation of IPv6 raw socket factory.
+ * @brief Implementation of IPv6 raw socket factory.
  */
 class Ipv6RawSocketFactoryImpl : public Ipv6RawSocketFactory
 {
   public:
     /**
-     * \brief Create a raw IPv6 socket.
-     * \returns A new RAW IPv6 socket.
+     * @brief Create a raw IPv6 socket.
+     * @returns A new RAW IPv6 socket.
      */
     Ptr<Socket> CreateSocket() override;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv6-raw-socket-impl.h ns-3.44/src/internet/model/ipv6-raw-socket-impl.h
--- ns-3.43/src/internet/model/ipv6-raw-socket-impl.h	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/ipv6-raw-socket-impl.h	2025-03-09 16:55:49.399371100 -0700
@@ -23,10 +23,10 @@
 class Node;
 
 /**
- * \ingroup socket
- * \ingroup ipv6
+ * @ingroup socket
+ * @ingroup ipv6
  *
- * \brief IPv6 raw socket.
+ * @brief IPv6 raw socket.
  *
  * A RAW Socket typically is used to access specific IP layers not usually
  * available through L4 sockets, e.g., ICMP. The implementer should take
@@ -38,7 +38,7 @@
  * behavior.
  *
  * A correct example is (from src/applications/model/radvd.cc):
- * \code
+ * @code
    if (!m_socket)
      {
        TypeId tid = TypeId::LookupByName ("ns3::Ipv6RawSocketFactory");
@@ -49,15 +49,15 @@
        m_socket->SetAttribute ("Protocol", UintegerValue(Ipv6Header::IPV6_ICMPV6));
        m_socket->SetRecvCallback (MakeCallback (&Radvd::HandleRead, this));
      }
- * \endcode
+ * @endcode
  *
  */
 class Ipv6RawSocketImpl : public Socket
 {
   public:
     /**
-     * \brief Get the type ID of this class.
-     * \return type ID
+     * @brief Get the type ID of this class.
+     * @return type ID
      */
     static TypeId GetTypeId();
 
@@ -65,16 +65,16 @@
     ~Ipv6RawSocketImpl() override;
 
     /**
-     * \brief Set the node associated with this socket.
-     * \param node node to set
+     * @brief Set the node associated with this socket.
+     * @param node node to set
      */
     void SetNode(Ptr<Node> node);
 
     Socket::SocketErrno GetErrno() const override;
 
     /**
-     * \brief Get socket type (NS3_SOCK_RAW)
-     * \return socket type
+     * @brief Get socket type (NS3_SOCK_RAW)
+     * @return socket type
      */
     Socket::SocketType GetSocketType() const override;
 
@@ -103,17 +103,17 @@
                        std::vector<Ipv6Address> sourceAddresses) override;
 
     /**
-     * \brief Set protocol field.
-     * \param protocol protocol to set
+     * @brief Set protocol field.
+     * @param protocol protocol to set
      */
     void SetProtocol(uint16_t protocol);
 
     /**
-     * \brief Forward up to receive method.
-     * \param p packet
-     * \param hdr IPv6 header
-     * \param device device
-     * \return true if forwarded, false otherwise
+     * @brief Forward up to receive method.
+     * @param p packet
+     * @param hdr IPv6 header
+     * @param device device
+     * @return true if forwarded, false otherwise
      */
     bool ForwardUp(Ptr<const Packet> p, Ipv6Header hdr, Ptr<NetDevice> device);
 
@@ -121,44 +121,44 @@
     bool GetAllowBroadcast() const override;
 
     /**
-     * \brief Clean the ICMPv6 filter structure
+     * @brief Clean the ICMPv6 filter structure
      */
     void Icmpv6FilterSetPassAll();
 
     /**
-     * \brief Set the filter to block all the ICMPv6 types
+     * @brief Set the filter to block all the ICMPv6 types
      */
     void Icmpv6FilterSetBlockAll();
 
     /**
-     * \brief Set the filter to pass one ICMPv6 type
-     * \param type the ICMPv6 type to pass
+     * @brief Set the filter to pass one ICMPv6 type
+     * @param type the ICMPv6 type to pass
      */
     void Icmpv6FilterSetPass(uint8_t type);
 
     /**
-     * \brief Set the filter to block one ICMPv6 type
-     * \param type the ICMPv6 type to block
+     * @brief Set the filter to block one ICMPv6 type
+     * @param type the ICMPv6 type to block
      */
     void Icmpv6FilterSetBlock(uint8_t type);
 
     /**
-     * \brief Ask the filter about the status of one ICMPv6 type
-     * \param type the ICMPv6 type
-     * \return true if the ICMP type is passing through
+     * @brief Ask the filter about the status of one ICMPv6 type
+     * @param type the ICMPv6 type
+     * @return true if the ICMP type is passing through
      */
     bool Icmpv6FilterWillPass(uint8_t type);
 
     /**
-     * \brief Ask the filter about the status of one ICMPv6 type
-     * \param type the ICMPv6 type
-     * \return true if the ICMP type is being blocked
+     * @brief Ask the filter about the status of one ICMPv6 type
+     * @param type the ICMPv6 type
+     * @return true if the ICMP type is being blocked
      */
     bool Icmpv6FilterWillBlock(uint8_t type);
 
   private:
     /**
-     * \brief IPv6 raw data and additional information.
+     * @brief IPv6 raw data and additional information.
      */
     struct Data
     {
@@ -168,52 +168,52 @@
     };
 
     /**
-     * \brief Dispose object.
+     * @brief Dispose object.
      */
     void DoDispose() override;
 
     /**
-     * \brief Last error number.
+     * @brief Last error number.
      */
     mutable Socket::SocketErrno m_err;
 
     /**
-     * \brief Node.
+     * @brief Node.
      */
     Ptr<Node> m_node;
 
     /**
-     * \brief Source address.
+     * @brief Source address.
      */
     Ipv6Address m_src;
 
     /**
-     * \brief Destination address.
+     * @brief Destination address.
      */
     Ipv6Address m_dst;
 
     /**
-     * \brief Protocol.
+     * @brief Protocol.
      */
     uint16_t m_protocol;
 
     /**
-     * \brief Packet waiting to be processed.
+     * @brief Packet waiting to be processed.
      */
     std::list<Data> m_data;
 
     /**
-     * \brief Flag to shutdown send capability.
+     * @brief Flag to shutdown send capability.
      */
     bool m_shutdownSend;
 
     /**
-     * \brief Flag to shutdown receive capability.
+     * @brief Flag to shutdown receive capability.
      */
     bool m_shutdownRecv;
 
     /**
-     * \brief Struct to hold the ICMPv6 filter
+     * @brief Struct to hold the ICMPv6 filter
      */
     struct Icmpv6Filter
     {
@@ -221,7 +221,7 @@
     };
 
     /**
-     * \brief ICMPv6 filter.
+     * @brief ICMPv6 filter.
      */
     Icmpv6Filter m_icmpFilter;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv6-route.h ns-3.44/src/internet/model/ipv6-route.h
--- ns-3.43/src/internet/model/ipv6-route.h	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/ipv6-route.h	2025-03-09 16:55:49.399371100 -0700
@@ -22,206 +22,206 @@
 class NetDevice;
 
 /**
- * \ingroup ipv6Routing
+ * @ingroup ipv6Routing
  *
- * \brief IPv6 route cache entry.
+ * @brief IPv6 route cache entry.
  */
 class Ipv6Route : public SimpleRefCount<Ipv6Route>
 {
   public:
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Ipv6Route();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     virtual ~Ipv6Route();
 
     /**
-     * \brief Set destination address.
-     * \param dest IPv6 destination address
+     * @brief Set destination address.
+     * @param dest IPv6 destination address
      */
     void SetDestination(Ipv6Address dest);
 
     /**
-     * \brief Get destination address.
-     * \return destination address
+     * @brief Get destination address.
+     * @return destination address
      */
     Ipv6Address GetDestination() const;
 
     /**
-     * \brief Set source address.
-     * \param src IPv6 source address
+     * @brief Set source address.
+     * @param src IPv6 source address
      */
     void SetSource(Ipv6Address src);
 
     /**
-     * \brief Get source address.
-     * \return source address
+     * @brief Get source address.
+     * @return source address
      */
     Ipv6Address GetSource() const;
 
     /**
-     * \brief Set gateway address.
-     * \param gw IPv6 gateway address
+     * @brief Set gateway address.
+     * @param gw IPv6 gateway address
      */
     void SetGateway(Ipv6Address gw);
 
     /**
-     * \brief Get gateway address.
-     * \return gateway address
+     * @brief Get gateway address.
+     * @return gateway address
      */
     Ipv6Address GetGateway() const;
 
     /**
-     * \brief Set output device for outgoing packets.
-     * \param outputDevice output device
+     * @brief Set output device for outgoing packets.
+     * @param outputDevice output device
      */
     void SetOutputDevice(Ptr<NetDevice> outputDevice);
 
     /**
-     * \brief Get output device.
-     * \return output device
+     * @brief Get output device.
+     * @return output device
      */
     Ptr<NetDevice> GetOutputDevice() const;
 
   private:
     /**
-     * \brief Destination address.
+     * @brief Destination address.
      */
     Ipv6Address m_dest;
 
     /**
-     * \brief source address.
+     * @brief source address.
      */
     Ipv6Address m_source;
 
     /**
-     * \brief Gateway address.
+     * @brief Gateway address.
      */
     Ipv6Address m_gateway;
 
     /**
-     * \brief Output device.
+     * @brief Output device.
      */
     Ptr<NetDevice> m_outputDevice;
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the reference to the output stream
- * \param route the Ipv6 route
- * \returns the reference to the output stream
+ * @param os the reference to the output stream
+ * @param route the Ipv6 route
+ * @returns the reference to the output stream
  */
 std::ostream& operator<<(std::ostream& os, const Ipv6Route& route);
 
 /**
- * \ingroup ipv6Routing
+ * @ingroup ipv6Routing
  *
- * \brief IPv6 multicast route entry.
+ * @brief IPv6 multicast route entry.
  */
 class Ipv6MulticastRoute : public SimpleRefCount<Ipv6MulticastRoute>
 {
   public:
     /**
-     * \brief Maximum number of multicast interfaces on a router.
+     * @brief Maximum number of multicast interfaces on a router.
      */
     static const uint32_t MAX_INTERFACES = 16;
 
     /**
-     * \brief Maximum Time-To-Live (TTL).
+     * @brief Maximum Time-To-Live (TTL).
      */
     static const uint32_t MAX_TTL = 255;
 
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Ipv6MulticastRoute();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     virtual ~Ipv6MulticastRoute();
 
     /**
-     * \brief Set IPv6 group.
-     * \param group Ipv6Address of the multicast group
+     * @brief Set IPv6 group.
+     * @param group Ipv6Address of the multicast group
      */
     void SetGroup(const Ipv6Address group);
 
     /**
-     * \brief Get IPv6 group.
-     * \return Ipv6Address of the multicast group
+     * @brief Get IPv6 group.
+     * @return Ipv6Address of the multicast group
      */
     Ipv6Address GetGroup() const;
 
     /**
-     * \brief Set origin address.
-     * \param origin Ipv6Address of the origin address
+     * @brief Set origin address.
+     * @param origin Ipv6Address of the origin address
      */
     void SetOrigin(const Ipv6Address origin);
 
     /**
-     * \brief Get source address.
-     * \return Ipv6Address of the origin address
+     * @brief Get source address.
+     * @return Ipv6Address of the origin address
      */
     Ipv6Address GetOrigin() const;
 
     /**
-     * \brief Set parent for this route.
-     * \param iif Parent (input interface) for this route
+     * @brief Set parent for this route.
+     * @param iif Parent (input interface) for this route
      */
     void SetParent(uint32_t iif);
 
     /**
-     * \brief Get parent for this route.
-     * \return Parent (input interface) for this route
+     * @brief Get parent for this route.
+     * @return Parent (input interface) for this route
      */
     uint32_t GetParent() const;
 
     /**
-     * \brief set output TTL for this route.
-     * \param oif Outgoing interface index
-     * \param ttl time-to-live for this route
+     * @brief set output TTL for this route.
+     * @param oif Outgoing interface index
+     * @param ttl time-to-live for this route
      */
     void SetOutputTtl(uint32_t oif, uint32_t ttl);
 
     /**
-     * \return map of output interface Ids and TTLs for this route
+     * @return map of output interface Ids and TTLs for this route
      */
     std::map<uint32_t, uint32_t> GetOutputTtlMap() const;
 
   private:
     /**
-     * \brief IPv6 group.
+     * @brief IPv6 group.
      */
     Ipv6Address m_group;
 
     /**
-     * \brief IPv6 origin (source).
+     * @brief IPv6 origin (source).
      */
     Ipv6Address m_origin;
 
     /**
-     * \brief Source interface.
+     * @brief Source interface.
      */
     uint32_t m_parent;
 
     /**
-     * \brief TTLs.
+     * @brief TTLs.
      */
     std::map<uint32_t, uint32_t> m_ttls;
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the reference to the output stream
- * \param route the Ipv6 multicast route
- * \returns the reference to the output stream
+ * @param os the reference to the output stream
+ * @param route the Ipv6 multicast route
+ * @returns the reference to the output stream
  */
 std::ostream& operator<<(std::ostream& os, const Ipv6MulticastRoute& route);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv6-routing-protocol.h ns-3.44/src/internet/model/ipv6-routing-protocol.h
--- ns-3.43/src/internet/model/ipv6-routing-protocol.h	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/ipv6-routing-protocol.h	2025-03-09 16:55:49.399371100 -0700
@@ -28,16 +28,16 @@
 class NetDevice;
 
 /**
- * \ingroup internet
- * \defgroup ipv6Routing IPv6 Routing Protocols.
+ * @ingroup internet
+ * @defgroup ipv6Routing IPv6 Routing Protocols.
  *
  * The classes in this group implement different routing protocols
  * for IPv6. Other modules could implement further protocols.
  */
 
 /**
- * \ingroup ipv6Routing
- * \brief Abstract base class for IPv6 routing protocols.
+ * @ingroup ipv6Routing
+ * @brief Abstract base class for IPv6 routing protocols.
  *
  * Defines two virtual functions for packet routing and forwarding.  The first,
  * RouteOutput (), is used for locally originated packets, and the second,
@@ -49,8 +49,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -77,20 +77,20 @@
     typedef Callback<void, Ptr<const Packet>, const Ipv6Header&, Socket::SocketErrno> ErrorCallback;
 
     /**
-     * \brief Query routing cache for an existing route, for an outbound packet
+     * @brief Query routing cache for an existing route, for an outbound packet
      *
      * This lookup is used by transport protocols.  It does not cause any
      * packet to be forwarded, and is synchronous.  Can be used for
      * multicast or unicast.  The Linux equivalent is ip_route_output ()
      *
-     * \param p packet to be routed.  Note that this method may modify the 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 device.  May be zero, or may be bound via
+     * @param header input parameter (used to form key to search for the route)
+     * @param oif Output interface device.  May be zero, or may be bound via
      *            socket options to a particular output interface.
-     * \param sockerr Output parameter; socket errno
+     * @param sockerr Output parameter; socket errno
      *
-     * \returns a code that indicates what happened in the lookup
+     * @returns a code that indicates what happened in the lookup
      */
     virtual Ptr<Ipv6Route> RouteOutput(Ptr<Packet> p,
                                        const Ipv6Header& header,
@@ -98,24 +98,24 @@
                                        Socket::SocketErrno& sockerr) = 0;
 
     /**
-     * \brief Route an input packet (to be forwarded or locally delivered)
+     * @brief Route an input packet (to be forwarded or locally delivered)
      *
      * This lookup is used in the forwarding process.  The packet is
      * handed over to the Ipv6RoutingProtocol, and will get forwarded onward
      * by one of the callbacks.  The Linux equivalent is ip_route_input ().
      * There are four valid outcomes, and a matching callbacks to handle each.
      *
-     * \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
+     * @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
+     * @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
+     * @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 the Ipv6RoutingProtocol takes responsibility for
+     * @param ecb Callback to call if there is an error in forwarding
+     * @returns true if the Ipv6RoutingProtocol takes responsibility for
      *          forwarding or delivering the packet, false otherwise
      */
     virtual bool RouteInput(Ptr<const Packet> p,
@@ -127,55 +127,55 @@
                             const ErrorCallback& ecb) = 0;
 
     /**
-     * \brief Notify when specified interface goes UP.
+     * @brief Notify when specified interface goes UP.
      *
      * Protocols are expected to implement this method to be notified of the state change of
      * an interface in a node.
-     * \param interface the index of the interface we are being notified about
+     * @param interface the index of the interface we are being notified about
      */
     virtual void NotifyInterfaceUp(uint32_t interface) = 0;
 
     /**
-     * \brief Notify when specified interface goes DOWN.
+     * @brief Notify when specified interface goes DOWN.
      *
      * Protocols are expected to implement this method to be notified of the state change of
      * an interface in a node.
-     * \param interface the index of the interface we are being notified about
+     * @param interface the index of the interface we are being notified about
      */
     virtual void NotifyInterfaceDown(uint32_t interface) = 0;
 
     /**
-     * \brief Notify when specified interface add an address.
+     * @brief Notify when specified interface add an address.
      *
      * Protocols are expected to implement this method to be notified whenever
      * a new address is added to an interface. Typically used to add a 'network route' on an
      * interface. Can be invoked on an up or down interface.
-     * \param interface the index of the interface we are being notified about
-     * \param address a new address being added to an interface
+     * @param interface the index of the interface we are being notified about
+     * @param address a new address being added to an interface
      */
     virtual void NotifyAddAddress(uint32_t interface, Ipv6InterfaceAddress address) = 0;
 
     /**
-     * \brief Notify when specified interface add an address.
+     * @brief Notify when specified interface add an address.
      *
      * Protocols are expected to implement this method to be notified whenever
      * a new address is removed from an interface. Typically used to remove the 'network route' of
      * an interface. Can be invoked on an up or down interface.
-     * \param interface the index of the interface we are being notified about
-     * \param address a new address being added to an interface
+     * @param interface the index of the interface we are being notified about
+     * @param address a new address being added to an interface
      */
     virtual void NotifyRemoveAddress(uint32_t interface, Ipv6InterfaceAddress address) = 0;
 
     /**
-     * \brief Notify a new route.
+     * @brief Notify a new route.
      *
      * Typically this is used to add another route from IPv6 stack (i.e. ICMPv6
      * redirect case, ...).
-     * \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
+     * @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
      */
     virtual void NotifyAddRoute(Ipv6Address dst,
                                 Ipv6Prefix mask,
@@ -184,12 +184,12 @@
                                 Ipv6Address prefixToUse = Ipv6Address::GetZero()) = 0;
 
     /**
-     * \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
+     * @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
      */
     virtual void NotifyRemoveRoute(Ipv6Address dst,
                                    Ipv6Prefix mask,
@@ -198,16 +198,16 @@
                                    Ipv6Address prefixToUse = Ipv6Address::GetZero()) = 0;
 
     /**
-     * \brief Typically, invoked directly or indirectly from ns3::Ipv6::SetRoutingProtocol
-     * \param ipv6 the ipv6 object this routing protocol is being associated with
+     * @brief Typically, invoked directly or indirectly from ns3::Ipv6::SetRoutingProtocol
+     * @param ipv6 the ipv6 object this routing protocol is being associated with
      */
     virtual void SetIpv6(Ptr<Ipv6> ipv6) = 0;
 
     /**
-     * \brief Print the Routing Table entries
+     * @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
+     * @param stream The ostream the Routing table is printed to
+     * @param unit The time unit to be used in the report
      */
     virtual void PrintRoutingTable(Ptr<OutputStreamWrapper> stream,
                                    Time::Unit unit = Time::S) const = 0;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv6-routing-table-entry.h ns-3.44/src/internet/model/ipv6-routing-table-entry.h
--- ns-3.43/src/internet/model/ipv6-routing-table-entry.h	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/ipv6-routing-table-entry.h	2025-03-09 16:55:49.399371100 -0700
@@ -19,108 +19,108 @@
 {
 
 /**
- * \ingroup ipv6Routing
+ * @ingroup ipv6Routing
  *
- * \brief A record of an IPv6 route.
+ * @brief A record of an IPv6 route.
  */
 class Ipv6RoutingTableEntry
 {
   public:
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Ipv6RoutingTableEntry();
 
     /**
-     * \brief Copy constructor.
-     * \param route the route to copy
+     * @brief Copy constructor.
+     * @param route the route to copy
      */
     Ipv6RoutingTableEntry(const Ipv6RoutingTableEntry& route);
 
     /**
-     * \brief Copy constructor.
-     * \param route the route to copy
+     * @brief Copy constructor.
+     * @param route the route to copy
      */
     Ipv6RoutingTableEntry(const Ipv6RoutingTableEntry* route);
 
     /**
-     * \brief Destructor
+     * @brief Destructor
      */
     virtual ~Ipv6RoutingTableEntry();
 
     /**
-     * \brief Is the route entry correspond to a host ?
-     * \return true if the route is a host, false otherwise
+     * @brief Is the route entry correspond to a host ?
+     * @return true if the route is a host, false otherwise
      */
     bool IsHost() const;
 
     /**
-     * \brief Get the destination.
-     * \return the IPv6 address of the destination of this route
+     * @brief Get the destination.
+     * @return the IPv6 address of the destination of this route
      */
     Ipv6Address GetDest() const;
 
     /**
-     * \brief Get the prefix to use (for multihomed link).
-     * \return prefix address to use
+     * @brief Get the prefix to use (for multihomed link).
+     * @return prefix address to use
      */
     Ipv6Address GetPrefixToUse() const;
 
     /**
-     * \brief Set the prefix to use.
-     * \param prefix prefix to use
+     * @brief Set the prefix to use.
+     * @param prefix prefix to use
      */
     void SetPrefixToUse(Ipv6Address prefix);
 
     /**
-     * \brief Is the route entry correspond to a network ?
-     * \return true if the route is a network, false otherwise
+     * @brief Is the route entry correspond to a network ?
+     * @return true if the route is a network, false otherwise
      */
     bool IsNetwork() const;
 
     /**
-     * \brief Get the destination network.
-     * \return the destination network
+     * @brief Get the destination network.
+     * @return the destination network
      */
     Ipv6Address GetDestNetwork() const;
 
     /**
-     * \brief Get the destination prefix.
-     * \return the destination prefix
+     * @brief Get the destination prefix.
+     * @return the destination prefix
      */
     Ipv6Prefix GetDestNetworkPrefix() const;
 
     /**
-     * \brief Is it the default route ?
-     * \return true if this route is a default route, false otherwise
+     * @brief Is it the default route ?
+     * @return true if this route is a default route, false otherwise
      */
     bool IsDefault() const;
 
     /**
-     * \brief Is it the gateway ?
-     * \return true if this route is a gateway, false otherwise
+     * @brief Is it the gateway ?
+     * @return true if this route is a gateway, false otherwise
      */
     bool IsGateway() const;
 
     /**
-     * \brief Get the gateway.
-     * \return the IPv6 address of the gateway
+     * @brief Get the gateway.
+     * @return the IPv6 address of the gateway
      */
     Ipv6Address GetGateway() const;
 
     /**
-     * \brief Get the interface index.
-     * \return the index of the interface
+     * @brief Get the interface index.
+     * @return the index of the interface
      */
     uint32_t GetInterface() const;
 
     /**
-     * \brief Create a route to a host.
-     * \param dest destination address
-     * \param nextHop next hop address to route the packet
-     * \param interface interface index
-     * \param prefixToUse prefix that should be used for source address for this destination
-     * \return IPv6Route object
+     * @brief Create a route to a host.
+     * @param dest destination address
+     * @param nextHop next hop address to route the packet
+     * @param interface interface index
+     * @param prefixToUse prefix that should be used for source address for this destination
+     * @return IPv6Route object
      */
     static Ipv6RoutingTableEntry CreateHostRouteTo(Ipv6Address dest,
                                                    Ipv6Address nextHop,
@@ -128,20 +128,20 @@
                                                    Ipv6Address prefixToUse = Ipv6Address());
 
     /**
-     * \brief Create a route to a host.
-     * \param dest destination address
-     * \param interface interface index
-     * \return IPv6Route object
+     * @brief Create a route to a host.
+     * @param dest destination address
+     * @param interface interface index
+     * @return IPv6Route object
      */
     static Ipv6RoutingTableEntry CreateHostRouteTo(Ipv6Address dest, uint32_t interface);
 
     /**
-     * \brief Create a route to a network.
-     * \param network network address
-     * \param networkPrefix network prefix
-     * \param nextHop next hop address to route the packet
-     * \param interface interface index
-     * \return IPv6Route object
+     * @brief Create a route to a network.
+     * @param network network address
+     * @param networkPrefix network prefix
+     * @param nextHop next hop address to route the packet
+     * @param interface interface index
+     * @return IPv6Route object
      */
     static Ipv6RoutingTableEntry CreateNetworkRouteTo(Ipv6Address network,
                                                       Ipv6Prefix networkPrefix,
@@ -149,13 +149,13 @@
                                                       uint32_t interface);
 
     /**
-     * \brief Create a route to a network.
-     * \param network network address
-     * \param networkPrefix network prefix
-     * \param nextHop next hop address to route the packet
-     * \param interface interface index
-     * \param prefixToUse prefix that should be used for source address for this destination
-     * \return IPv6Route object
+     * @brief Create a route to a network.
+     * @param network network address
+     * @param networkPrefix network prefix
+     * @param nextHop next hop address to route the packet
+     * @param interface interface index
+     * @param prefixToUse prefix that should be used for source address for this destination
+     * @return IPv6Route object
      */
     static Ipv6RoutingTableEntry CreateNetworkRouteTo(Ipv6Address network,
                                                       Ipv6Prefix networkPrefix,
@@ -164,31 +164,31 @@
                                                       Ipv6Address prefixToUse);
 
     /**
-     * \brief Create a route to a network.
-     * \param network network address
-     * \param networkPrefix network prefix
-     * \param interface interface index
-     * \return IPv6Route object
+     * @brief Create a route to a network.
+     * @param network network address
+     * @param networkPrefix network prefix
+     * @param interface interface index
+     * @return IPv6Route object
      */
     static Ipv6RoutingTableEntry CreateNetworkRouteTo(Ipv6Address network,
                                                       Ipv6Prefix networkPrefix,
                                                       uint32_t interface);
 
     /**
-     * \brief Create a default route.
-     * \param nextHop next hop address to route the packet
-     * \param interface interface index
-     * \return IPv6Route object
+     * @brief Create a default route.
+     * @param nextHop next hop address to route the packet
+     * @param interface interface index
+     * @return IPv6Route object
      */
     static Ipv6RoutingTableEntry CreateDefaultRoute(Ipv6Address nextHop, uint32_t interface);
 
   private:
     /**
-     * \brief Constructor.
-     * \param network network address
-     * \param prefix network prefix
-     * \param gateway the gateway
-     * \param interface the interface index
+     * @brief Constructor.
+     * @param network network address
+     * @param prefix network prefix
+     * @param gateway the gateway
+     * @param interface the interface index
      */
     Ipv6RoutingTableEntry(Ipv6Address network,
                           Ipv6Prefix prefix,
@@ -196,11 +196,11 @@
                           uint32_t interface);
 
     /**
-     * \brief Constructor.
-     * \param network network address
-     * \param prefix network prefix
-     * \param interface the interface index
-     * \param prefixToUse prefix to use
+     * @brief Constructor.
+     * @param network network address
+     * @param prefix network prefix
+     * @param interface the interface index
+     * @param prefixToUse prefix to use
      */
     Ipv6RoutingTableEntry(Ipv6Address network,
                           Ipv6Prefix prefix,
@@ -208,12 +208,12 @@
                           Ipv6Address prefixToUse);
 
     /**
-     * \brief Constructor.
-     * \param network network address
-     * \param prefix network prefix
-     * \param gateway the gateway
-     * \param interface the interface index
-     * \param prefixToUse prefix to use
+     * @brief Constructor.
+     * @param network network address
+     * @param prefix network prefix
+     * @param gateway the gateway
+     * @param interface the interface index
+     * @param prefixToUse prefix to use
      */
     Ipv6RoutingTableEntry(Ipv6Address network,
                           Ipv6Prefix prefix,
@@ -222,132 +222,132 @@
                           Ipv6Address prefixToUse);
 
     /**
-     * \brief Constructor.
-     * \param dest destination address
-     * \param prefix destination prefix
-     * \param interface interface index
+     * @brief Constructor.
+     * @param dest destination address
+     * @param prefix destination prefix
+     * @param interface interface index
      */
     Ipv6RoutingTableEntry(Ipv6Address dest, Ipv6Prefix prefix, uint32_t interface);
 
     /**
-     * \brief Constructor.
-     * \param dest destination address
-     * \param gateway the gateway
-     * \param interface interface index
+     * @brief Constructor.
+     * @param dest destination address
+     * @param gateway the gateway
+     * @param interface interface index
      */
     Ipv6RoutingTableEntry(Ipv6Address dest, Ipv6Address gateway, uint32_t interface);
 
     /**
-     * \brief Constructor.
-     * \param dest destination address
-     * \param interface interface index
+     * @brief Constructor.
+     * @param dest destination address
+     * @param interface interface index
      */
     Ipv6RoutingTableEntry(Ipv6Address dest, uint32_t interface);
 
     /**
-     * \brief IPv6 address of the destination.
+     * @brief IPv6 address of the destination.
      */
     Ipv6Address m_dest;
 
     /**
-     * \brief IPv6 prefix of the destination
+     * @brief IPv6 prefix of the destination
      */
     Ipv6Prefix m_destNetworkPrefix;
 
     /**
-     * \brief IPv6 address of the gateway.
+     * @brief IPv6 address of the gateway.
      */
     Ipv6Address m_gateway;
 
     /**
-     * \brief The interface index.
+     * @brief The interface index.
      */
     uint32_t m_interface;
 
     /**
-     * \brief Prefix to use.
+     * @brief Prefix to use.
      */
     Ipv6Address m_prefixToUse;
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the reference to the output stream
- * \param route the Ipv6 routing table entry
- * \returns the reference to the output stream
+ * @param os the reference to the output stream
+ * @param route the Ipv6 routing table entry
+ * @returns the reference to the output stream
  */
 std::ostream& operator<<(std::ostream& os, const Ipv6RoutingTableEntry& route);
 
 /**
- * \ingroup ipv6Routing
+ * @ingroup ipv6Routing
  *
- * \brief A record of an IPv6 multicast route.
+ * @brief A record of an IPv6 multicast route.
  */
 class Ipv6MulticastRoutingTableEntry
 {
   public:
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Ipv6MulticastRoutingTableEntry();
 
     /**
-     * \brief Copy constructor.
-     * \param route the route to copy
+     * @brief Copy constructor.
+     * @param route the route to copy
      */
     Ipv6MulticastRoutingTableEntry(const Ipv6MulticastRoutingTableEntry& route);
 
     /**
-     * \brief Copy constructor.
-     * \param route the route to copy
+     * @brief Copy constructor.
+     * @param route the route to copy
      */
     Ipv6MulticastRoutingTableEntry(const Ipv6MulticastRoutingTableEntry* route);
 
     /**
-     * \brief Get the source of this route
-     * \return IPv6 address of the source of this route
+     * @brief Get the source of this route
+     * @return IPv6 address of the source of this route
      */
     Ipv6Address GetOrigin() const;
 
     /**
-     * \brief Get the group.
-     * \return IPv6 address of the multicast group of this route
+     * @brief Get the group.
+     * @return IPv6 address of the multicast group of this route
      */
     Ipv6Address GetGroup() const;
 
     /**
-     * \brief Get the input interface address.
-     * \return input interface index
+     * @brief Get the input interface address.
+     * @return input interface index
      */
     uint32_t GetInputInterface() const;
 
     /**
-     * \brief Get the number of output interfaces of this route.
-     * \return number of output interfaces of this route.
+     * @brief Get the number of output interfaces of this route.
+     * @return number of output interfaces of this route.
      */
     uint32_t GetNOutputInterfaces() const;
 
     /**
-     * \brief Get a specified output interface.
-     * \param n index
-     * \return a specified output interface
+     * @brief Get a specified output interface.
+     * @param n index
+     * @return a specified output interface
      */
     uint32_t GetOutputInterface(uint32_t n) const;
 
     /**
-     * \brief Get all of the output interfaces of this route.
-     * \return a vector of all output interfaces of this route
+     * @brief Get all of the output interfaces of this route.
+     * @return a vector of all output interfaces of this route
      */
     std::vector<uint32_t> GetOutputInterfaces() const;
 
     /**
-     * \brief Create a multicast route.
-     * \param origin IPv6 address of the origin source
-     * \param group Ipv6Address of the group
-     * \param inputInterface interface number
-     * \param outputInterfaces list of output interface number
-     * \return a multicast route
+     * @brief Create a multicast route.
+     * @param origin IPv6 address of the origin source
+     * @param group Ipv6Address of the group
+     * @param inputInterface interface number
+     * @param outputInterfaces list of output interface number
+     * @return a multicast route
      */
     static Ipv6MulticastRoutingTableEntry CreateMulticastRoute(
         Ipv6Address origin,
@@ -357,11 +357,11 @@
 
   private:
     /**
-     * \brief Constructor.
-     * \param origin IPv6 address of the source
-     * \param group IPv6 address of the group
-     * \param inputInterface interface number
-     * \param outputInterfaces list of output interface number
+     * @brief Constructor.
+     * @param origin IPv6 address of the source
+     * @param group IPv6 address of the group
+     * @param inputInterface interface number
+     * @param outputInterfaces list of output interface number
      */
     Ipv6MulticastRoutingTableEntry(Ipv6Address origin,
                                    Ipv6Address group,
@@ -369,32 +369,32 @@
                                    std::vector<uint32_t> outputInterfaces);
 
     /**
-     * \brief The IPv6 address of the source.
+     * @brief The IPv6 address of the source.
      */
     Ipv6Address m_origin;
 
     /**
-     * \brief The IPv6 address of the group.
+     * @brief The IPv6 address of the group.
      */
     Ipv6Address m_group;
 
     /**
-     * \brief The input interface.
+     * @brief The input interface.
      */
     uint32_t m_inputInterface;
 
     /**
-     * \brief The output interfaces.
+     * @brief The output interfaces.
      */
     std::vector<uint32_t> m_outputInterfaces;
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the reference to the output stream
- * \param route the Ipv6 multicast routing table entry
- * \returns the reference to the output stream
+ * @param os the reference to the output stream
+ * @param route the Ipv6 multicast routing table entry
+ * @returns the reference to the output stream
  */
 std::ostream& operator<<(std::ostream& os, const Ipv6MulticastRoutingTableEntry& route);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ipv6-static-routing.h ns-3.44/src/internet/model/ipv6-static-routing.h
--- ns-3.43/src/internet/model/ipv6-static-routing.h	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/ipv6-static-routing.h	2025-03-09 16:55:49.399371100 -0700
@@ -31,9 +31,9 @@
 class Ipv6MulticastRoutingTableEntry;
 
 /**
- * \ingroup ipv6Routing
+ * @ingroup ipv6Routing
  *
- * \brief Static routing protocol for IP version 6 stacks.
+ * @brief Static routing protocol for IP version 6 stacks.
  *
  * This class provides a basic set of methods for inserting static
  * unicast and multicast routes into the Ipv6 routing system.
@@ -45,16 +45,16 @@
  * Ipv6RoutingProtocol that defines the interface methods that a routing
  * protocol must support.
  *
- * \see Ipv6RoutingProtocol
- * \see Ipv6ListRouting
- * \see Ipv6ListRouting::AddRoutingProtocol
+ * @see Ipv6RoutingProtocol
+ * @see Ipv6ListRouting
+ * @see Ipv6ListRouting::AddRoutingProtocol
  */
 class Ipv6StaticRouting : public Ipv6RoutingProtocol
 {
   public:
     /**
-     * \brief The interface Id associated with this class.
-     * \return type identifier
+     * @brief The interface Id associated with this class.
+     * @return type identifier
      */
     static TypeId GetTypeId();
 
@@ -62,12 +62,12 @@
     ~Ipv6StaticRouting() override;
 
     /**
-     * \brief Add route to host.
-     * \param dest destination address
-     * \param nextHop next hop address to route the packet.
-     * \param interface interface index
-     * \param prefixToUse prefix that should be used for source address for this destination
-     * \param metric metric of route in case of multiple routes to same destination
+     * @brief Add route to host.
+     * @param dest destination address
+     * @param nextHop next hop address to route the packet.
+     * @param interface interface index
+     * @param prefixToUse prefix that should be used for source address for this destination
+     * @param metric metric of route in case of multiple routes to same destination
      */
     void AddHostRouteTo(Ipv6Address dest,
                         Ipv6Address nextHop,
@@ -76,20 +76,20 @@
                         uint32_t metric = 0);
 
     /**
-     * \brief Add route to host.
-     * \param dest destination address.
-     * \param interface interface index
-     * \param metric metric of route in case of multiple routes to same destination
+     * @brief Add route to host.
+     * @param dest destination address.
+     * @param interface interface index
+     * @param metric metric of route in case of multiple routes to same destination
      */
     void AddHostRouteTo(Ipv6Address dest, uint32_t interface, uint32_t metric = 0);
 
     /**
-     * \brief Add route to network.
-     * \param network network address
-     * \param networkPrefix network prefix*
-     * \param nextHop next hop address to route the packet
-     * \param interface interface index
-     * \param metric metric of route in case of multiple routes to same destination
+     * @brief Add route to network.
+     * @param network network address
+     * @param networkPrefix network prefix*
+     * @param nextHop next hop address to route the packet
+     * @param interface interface index
+     * @param metric metric of route in case of multiple routes to same destination
      */
     void AddNetworkRouteTo(Ipv6Address network,
                            Ipv6Prefix networkPrefix,
@@ -98,13 +98,13 @@
                            uint32_t metric = 0);
 
     /**
-     * \brief Add route to network.
-     * \param network network address
-     * \param networkPrefix network prefix*
-     * \param nextHop next hop address to route the packet.
-     * \param interface interface index
-     * \param prefixToUse prefix that should be used for source address for this destination
-     * \param metric metric of route in case of multiple routes to same destination
+     * @brief Add route to network.
+     * @param network network address
+     * @param networkPrefix network prefix*
+     * @param nextHop next hop address to route the packet.
+     * @param interface interface index
+     * @param prefixToUse prefix that should be used for source address for this destination
+     * @param metric metric of route in case of multiple routes to same destination
      */
     void AddNetworkRouteTo(Ipv6Address network,
                            Ipv6Prefix networkPrefix,
@@ -114,11 +114,11 @@
                            uint32_t metric = 0);
 
     /**
-     * \brief Add route to network.
-     * \param network network address
-     * \param networkPrefix network prefix
-     * \param interface interface index
-     * \param metric metric of route in case of multiple routes to same destination
+     * @brief Add route to network.
+     * @param network network address
+     * @param networkPrefix network prefix
+     * @param interface interface index
+     * @param metric metric of route in case of multiple routes to same destination
      */
     void AddNetworkRouteTo(Ipv6Address network,
                            Ipv6Prefix networkPrefix,
@@ -126,11 +126,11 @@
                            uint32_t metric = 0);
 
     /**
-     * \brief Set the default route.
-     * \param nextHop next hop address to route the packet
-     * \param interface interface index
-     * \param prefixToUse prefix to use (i.e for multihoming)
-     * \param metric metric of route in case of multiple routes to same destination
+     * @brief Set the default route.
+     * @param nextHop next hop address to route the packet
+     * @param interface interface index
+     * @param prefixToUse prefix to use (i.e for multihoming)
+     * @param metric metric of route in case of multiple routes to same destination
      */
     void SetDefaultRoute(Ipv6Address nextHop,
                          uint32_t interface,
@@ -138,46 +138,46 @@
                          uint32_t metric = 0);
 
     /**
-     * \brief Get the number or entries in the routing table.
-     * \return number of entries
+     * @brief Get the number or entries in the routing table.
+     * @return number of entries
      */
     uint32_t GetNRoutes() const;
 
     /**
-     * \brief Get the default route.
+     * @brief Get the default route.
      *
      * If multiple default routes exist, the one with lowest metric is returned.
-     * \return default Ipv6Route
+     * @return default Ipv6Route
      */
     Ipv6RoutingTableEntry GetDefaultRoute();
 
     /**
-     * \brief Get a specified route.
-     * \param i index
-     * \return the route whose index is i
+     * @brief Get a specified route.
+     * @param i index
+     * @return the route whose index is i
      */
     Ipv6RoutingTableEntry GetRoute(uint32_t i) const;
 
     /**
-     * \brief Get a metric for route from the static unicast routing table.
-     * \param index The index (into the routing table) of the route to retrieve.
-     * \return If route is set, the metric is returned. If not, an infinity metric (0xffffffff) is
+     * @brief Get a metric for route from the static unicast routing table.
+     * @param index The index (into the routing table) of the route to retrieve.
+     * @return If route is set, the metric is returned. If not, an infinity metric (0xffffffff) is
      * returned
      */
     uint32_t GetMetric(uint32_t index) const;
 
     /**
-     * \brief Remove a route from the routing table.
-     * \param i index
+     * @brief Remove a route from the routing table.
+     * @param i index
      */
     void RemoveRoute(uint32_t i);
 
     /**
-     * \brief Remove a route from the routing table.
-     * \param network IPv6 network
-     * \param prefix IPv6 prefix
-     * \param ifIndex interface index
-     * \param prefixToUse IPv6 prefix to use with this route (multihoming)
+     * @brief Remove a route from the routing table.
+     * @param network IPv6 network
+     * @param prefix IPv6 prefix
+     * @param ifIndex interface index
+     * @param prefixToUse IPv6 prefix to use with this route (multihoming)
      */
     void RemoveRoute(Ipv6Address network,
                      Ipv6Prefix prefix,
@@ -185,11 +185,11 @@
                      Ipv6Address prefixToUse);
 
     /**
-     * \brief Add a multicast route for a given multicast source and group.
-     * \param origin IPv6 address of the source
-     * \param group the multicast group address.
-     * \param inputInterface the interface index
-     * \param outputInterfaces the list of output interface indices over which the packet
+     * @brief Add a multicast route for a given multicast source and group.
+     * @param origin IPv6 address of the source
+     * @param group the multicast group address.
+     * @param inputInterface the interface index
+     * @param outputInterfaces the list of output interface indices over which the packet
      * should be sent (excluding the inputInterface).
      */
     void AddMulticastRoute(Ipv6Address origin,
@@ -198,44 +198,44 @@
                            std::vector<uint32_t> outputInterfaces);
 
     /**
-     * \brief Set the default multicast route.
-     * \param outputInterface default output interface
+     * @brief Set the default multicast route.
+     * @param outputInterface default output interface
      */
     void SetDefaultMulticastRoute(uint32_t outputInterface);
 
     /**
-     * \brief Get the number of entries in the multicast routing table.
-     * \return number of entries
+     * @brief Get the number of entries in the multicast routing table.
+     * @return number of entries
      */
     uint32_t GetNMulticastRoutes() const;
 
     /**
-     * \brief Get the specified multicast route.
-     * \param i index
-     * \return the route whose index is i
+     * @brief Get the specified multicast route.
+     * @param i index
+     * @return the route whose index is i
      */
     Ipv6MulticastRoutingTableEntry GetMulticastRoute(uint32_t i) const;
 
     /**
-     * \brief Remove a static multicast route.
-     * \param origin IPv6 address of the source
-     * \param group the multicast group address.
-     * \param inputInterface the input interface index
-     * \return true on success
+     * @brief Remove a static multicast route.
+     * @param origin IPv6 address of the source
+     * @param group the multicast group address.
+     * @param inputInterface the input interface index
+     * @return true on success
      */
     bool RemoveMulticastRoute(Ipv6Address origin, Ipv6Address group, uint32_t inputInterface);
 
     /**
-     * \brief Remove a multicast route.
-     * \param i index of route to remove
+     * @brief Remove a multicast route.
+     * @param i index of route to remove
      */
     void RemoveMulticastRoute(uint32_t i);
 
     /**
-     * \brief If the destination is already present in network destination list.
-     * \param dest destination address
-     * \param interfaceIndex interface index
-     * \return true if dest is already in list, false otherwise
+     * @brief If the destination is already present in network destination list.
+     * @param dest destination address
+     * @param interfaceIndex interface index
+     * @return true if dest is already in list, false otherwise
      */
     bool HasNetworkDest(Ipv6Address dest, uint32_t interfaceIndex);
 
@@ -272,7 +272,7 @@
 
   protected:
     /**
-     * \brief Dispose this object.
+     * @brief Dispose this object.
      */
     void DoDispose() override;
 
@@ -296,42 +296,42 @@
     typedef std::list<Ipv6MulticastRoutingTableEntry*>::iterator MulticastRoutesI;
 
     /**
-     * \brief Checks if a route is already present in the forwarding table.
-     * \param route route
-     * \param metric metric of route
-     * \return true if the route/metric is already in the forwarding table
+     * @brief Checks if a route is already present in the forwarding table.
+     * @param route route
+     * @param metric metric of route
+     * @return true if the route/metric is already in the forwarding table
      */
     bool LookupRoute(const Ipv6RoutingTableEntry& route, uint32_t metric);
 
     /**
-     * \brief Lookup in the forwarding table for destination.
-     * \param dest destination address
-     * \param interface output interface if any (put 0 otherwise)
-     * \return Ipv6Route to route the packet to reach dest address
+     * @brief Lookup in the forwarding table for destination.
+     * @param dest destination address
+     * @param interface output interface if any (put 0 otherwise)
+     * @return Ipv6Route to route the packet to reach dest address
      */
     Ptr<Ipv6Route> LookupStatic(Ipv6Address dest, Ptr<NetDevice> = nullptr);
 
     /**
-     * \brief Lookup in the multicast forwarding table for destination.
-     * \param origin source address
-     * \param group group multicast address
-     * \param ifIndex interface index
-     * \return Ipv6MulticastRoute to route the packet to reach dest address
+     * @brief Lookup in the multicast forwarding table for destination.
+     * @param origin source address
+     * @param group group multicast address
+     * @param ifIndex interface index
+     * @return Ipv6MulticastRoute to route the packet to reach dest address
      */
     Ptr<Ipv6MulticastRoute> LookupStatic(Ipv6Address origin, Ipv6Address group, uint32_t ifIndex);
 
     /**
-     * \brief the forwarding table for network.
+     * @brief the forwarding table for network.
      */
     NetworkRoutes m_networkRoutes;
 
     /**
-     * \brief the forwarding table for multicast.
+     * @brief the forwarding table for multicast.
      */
     MulticastRoutes m_multicastRoutes;
 
     /**
-     * \brief Ipv6 reference.
+     * @brief Ipv6 reference.
      */
     Ptr<Ipv6> m_ipv6;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/loopback-net-device.cc ns-3.44/src/internet/model/loopback-net-device.cc
--- ns-3.43/src/internet/model/loopback-net-device.cc	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/loopback-net-device.cc	2025-03-09 16:55:49.403371000 -0700
@@ -172,7 +172,7 @@
     Mac48Address to = Mac48Address::ConvertFrom(dest);
     NS_ASSERT_MSG(to == GetBroadcast() || to == m_address, "Invalid destination address");
     Simulator::ScheduleWithContext(m_node->GetId(),
-                                   Seconds(0.0),
+                                   Seconds(0),
                                    &LoopbackNetDevice::Receive,
                                    this,
                                    packet,
@@ -193,7 +193,7 @@
     Mac48Address from = Mac48Address::ConvertFrom(source);
     NS_ASSERT_MSG(to.IsBroadcast() || to == m_address, "Invalid destination address");
     Simulator::ScheduleWithContext(m_node->GetId(),
-                                   Seconds(0.0),
+                                   Seconds(0),
                                    &LoopbackNetDevice::Receive,
                                    this,
                                    packet,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/loopback-net-device.h ns-3.44/src/internet/model/loopback-net-device.h
--- ns-3.43/src/internet/model/loopback-net-device.h	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/loopback-net-device.h	2025-03-09 16:55:49.403371000 -0700
@@ -20,10 +20,10 @@
 class Node;
 
 /**
- * \ingroup netdevice
- * \ingroup internet
+ * @ingroup netdevice
+ * @ingroup internet
  *
- * \brief Virtual network interface that loops back any data sent to it to
+ * @brief Virtual network interface that loops back any data sent to it to
  * be immediately received on the same interface.
  *
  * This NetDevice is automatically added to any node as soon as the Internet
@@ -33,8 +33,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     LoopbackNetDevice();
@@ -75,12 +75,12 @@
 
   private:
     /**
-     * Receive a packet from tge Loopback NetDevice.
+     * Receive a packet from the Loopback NetDevice.
      *
-     * \param packet a reference to the received packet
-     * \param protocol the protocol
-     * \param to destination address
-     * \param from source address
+     * @param packet a reference to the received packet
+     * @param protocol the protocol
+     * @param to destination address
+     * @param from source address
      */
     void Receive(Ptr<Packet> packet, uint16_t protocol, Mac48Address to, Mac48Address from);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ndisc-cache.cc ns-3.44/src/internet/model/ndisc-cache.cc
--- ns-3.43/src/internet/model/ndisc-cache.cc	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/ndisc-cache.cc	2025-03-09 16:55:49.403371000 -0700
@@ -237,7 +237,7 @@
       m_waiting(),
       m_router(false),
       m_nudTimer(Timer::CANCEL_ON_DESTROY),
-      m_lastReachabilityConfirmation(Seconds(0.0)),
+      m_lastReachabilityConfirmation(),
       m_nsRetransmit(0)
 {
     NS_LOG_FUNCTION(this);
@@ -265,7 +265,7 @@
     if (m_waiting.size() >= m_ndCache->GetUnresQlen())
     {
         /* we store only m_unresQlen packet => first packet in first packet remove */
-        /** \todo report packet as 'dropped' */
+        /** @todo report packet as 'dropped' */
         m_waiting.pop_front();
     }
     m_waiting.push_back(p);
@@ -275,7 +275,7 @@
 NdiscCache::Entry::ClearWaitingPacket()
 {
     NS_LOG_FUNCTION(this);
-    /** \todo report packets as 'dropped' */
+    /** @todo report packets as 'dropped' */
     m_waiting.clear();
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ndisc-cache.h ns-3.44/src/internet/model/ndisc-cache.h
--- ns-3.43/src/internet/model/ndisc-cache.h	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/ndisc-cache.h	2025-03-09 16:55:49.403371000 -0700
@@ -30,9 +30,9 @@
 class Icmpv6L4Protocol;
 
 /**
- * \ingroup ipv6
+ * @ingroup ipv6
  *
- * \brief IPv6 Neighbor Discovery cache.
+ * @brief IPv6 Neighbor Discovery cache.
  */
 class NdiscCache : public Object
 {
@@ -40,23 +40,23 @@
     class Entry;
 
     /**
-     * \brief Get the type ID
-     * \return type ID
+     * @brief Get the type ID
+     * @return type ID
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Default value for unres qlen.
+     * @brief Default value for unres qlen.
      */
     static const uint32_t DEFAULT_UNRES_QLEN = 3;
 
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     NdiscCache();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~NdiscCache() override;
 
@@ -65,106 +65,106 @@
     NdiscCache& operator=(const NdiscCache&) = delete;
 
     /**
-     * \brief Get the NetDevice associated with this cache.
-     * \return NetDevice
+     * @brief Get the NetDevice associated with this cache.
+     * @return NetDevice
      */
     Ptr<NetDevice> GetDevice() const;
 
     /**
-     * \brief Get the Ipv6Interface associated with this cache.
-     * \returns The Ipv6Interface.
+     * @brief Get the Ipv6Interface associated with this cache.
+     * @returns The Ipv6Interface.
      */
     Ptr<Ipv6Interface> GetInterface() const;
 
     /**
-     * \brief Lookup in the cache.
-     * \param dst destination address.
-     * \return the entry if found, 0 otherwise.
+     * @brief Lookup in the cache.
+     * @param dst destination address.
+     * @return the entry if found, 0 otherwise.
      */
     virtual NdiscCache::Entry* Lookup(Ipv6Address dst);
 
     /**
-     * \brief Lookup in the cache for a MAC address.
-     * \param dst destination MAC address.
-     * \return a list of matching entries.
+     * @brief Lookup in the cache for a MAC address.
+     * @param dst destination MAC address.
+     * @return a list of matching entries.
      */
     std::list<NdiscCache::Entry*> LookupInverse(Address dst);
 
     /**
-     * \brief Add an entry.
-     * \param to address to add
-     * \return an new Entry
+     * @brief Add an entry.
+     * @param to address to add
+     * @return an new Entry
      */
     virtual NdiscCache::Entry* Add(Ipv6Address to);
 
     /**
-     * \brief Delete an entry.
-     * \param entry pointer to delete from the list.
+     * @brief Delete an entry.
+     * @param entry pointer to delete from the list.
      */
     void Remove(NdiscCache::Entry* entry);
 
     /**
-     * \brief Flush the cache.
+     * @brief Flush the cache.
      */
     void Flush();
 
     /**
-     * \brief Set the max number of waiting packet.
-     * \param unresQlen value to set
+     * @brief Set the max number of waiting packet.
+     * @param unresQlen value to set
      */
     void SetUnresQlen(uint32_t unresQlen);
 
     /**
-     * \brief Get the max number of waiting packet.
-     * \return max number
+     * @brief Get the max number of waiting packet.
+     * @return max number
      */
     uint32_t GetUnresQlen();
 
     /**
-     * \brief Set the device and interface.
-     * \param device the device
-     * \param interface the IPv6 interface
-     * \param icmpv6 the ICMPv6 protocol
+     * @brief Set the device and interface.
+     * @param device the device
+     * @param interface the IPv6 interface
+     * @param icmpv6 the ICMPv6 protocol
      */
     void SetDevice(Ptr<NetDevice> device,
                    Ptr<Ipv6Interface> interface,
                    Ptr<Icmpv6L4Protocol> icmpv6);
 
     /**
-     * \brief Print the NDISC cache entries
+     * @brief Print the NDISC cache entries
      *
-     * \param stream the ostream the NDISC cache entries is printed to
+     * @param stream the ostream the NDISC cache entries is printed to
      */
     void PrintNdiscCache(Ptr<OutputStreamWrapper> stream);
 
     /**
-     * \brief Clear the NDISC cache of all Auto-Generated entries
+     * @brief Clear the NDISC cache of all Auto-Generated entries
      */
     void RemoveAutoGeneratedEntries();
 
     /**
-     * \brief Pair of a packet and an Ipv4 header.
+     * @brief Pair of a packet and an Ipv4 header.
      */
     typedef std::pair<Ptr<Packet>, Ipv6Header> Ipv6PayloadHeaderPair;
 
     /**
-     * \ingroup ipv6
+     * @ingroup ipv6
      *
-     * \brief A record that holds information about a NdiscCache entry.
+     * @brief A record that holds information about a NdiscCache entry.
      */
     class Entry
     {
       public:
         /**
-         * \brief Constructor.
-         * \param nd The NdiscCache this entry belongs to.
+         * @brief Constructor.
+         * @param nd The NdiscCache this entry belongs to.
          */
         Entry(NdiscCache* nd);
 
         virtual ~Entry() = default;
 
         /**
-         * \brief The Entry state enumeration.
+         * @brief The Entry state enumeration.
          */
         enum NdiscCacheEntryState_e
         {
@@ -178,313 +178,313 @@
         };
 
         /**
-         * \brief The state of the entry.
+         * @brief The state of the entry.
          */
         NdiscCacheEntryState_e m_state;
 
         /**
-         * \brief Changes the state to this entry to INCOMPLETE.
-         * \param p packet that wait to be sent
+         * @brief Changes the state to this entry to INCOMPLETE.
+         * @param p packet that wait to be sent
          */
         void MarkIncomplete(Ipv6PayloadHeaderPair p);
 
         /**
-         * \brief Changes the state to this entry to REACHABLE.
-         * \param mac MAC address
-         * \return the list of packet waiting
+         * @brief Changes the state to this entry to REACHABLE.
+         * @param mac MAC address
+         * @return the list of packet waiting
          */
         std::list<Ipv6PayloadHeaderPair> MarkReachable(Address mac);
 
         /**
-         * \brief Changes the state to this entry to PROBE.
+         * @brief Changes the state to this entry to PROBE.
          */
         void MarkProbe();
 
         /**
-         * \brief Changes the state to this entry to STALE.
-         * \param mac L2 address
-         * \return the list of packet waiting
+         * @brief Changes the state to this entry to STALE.
+         * @param mac L2 address
+         * @return the list of packet waiting
          */
         std::list<Ipv6PayloadHeaderPair> MarkStale(Address mac);
 
         /**
-         * \brief Changes the state to this entry to STALE.
+         * @brief Changes the state to this entry to STALE.
          */
         void MarkStale();
 
         /**
-         * \brief Changes the state to this entry to REACHABLE.
+         * @brief Changes the state to this entry to REACHABLE.
          */
         void MarkReachable();
 
         /**
-         * \brief Change the state to this entry to DELAY.
+         * @brief Change the state to this entry to DELAY.
          */
         void MarkDelay();
 
         /**
-         * \brief Change the state to this entry to PERMANENT.
+         * @brief Change the state to this entry to PERMANENT.
          */
         void MarkPermanent();
 
         /**
-         * \brief Changes the state of this entry to auto-generated.
+         * @brief Changes the state of this entry to auto-generated.
          *
          * The entry must have a valid MacAddress.
          */
         void MarkAutoGenerated();
 
         /**
-         * \brief Add a packet (or replace old value) in the queue.
-         * \param p packet to add
+         * @brief Add a packet (or replace old value) in the queue.
+         * @param p packet to add
          */
         void AddWaitingPacket(Ipv6PayloadHeaderPair p);
 
         /**
-         * \brief Clear the waiting packet list.
+         * @brief Clear the waiting packet list.
          */
         void ClearWaitingPacket();
 
         /**
-         * \brief Is the entry STALE
-         * \return true if the entry is in STALE state, false otherwise
+         * @brief Is the entry STALE
+         * @return true if the entry is in STALE state, false otherwise
          */
         bool IsStale() const;
 
         /**
-         * \brief Is the entry REACHABLE
-         * \return true if the entry is in REACHABLE state, false otherwise
+         * @brief Is the entry REACHABLE
+         * @return true if the entry is in REACHABLE state, false otherwise
          */
         bool IsReachable() const;
 
         /**
-         * \brief Is the entry DELAY
-         * \return true if the entry is in DELAY state, false otherwise
+         * @brief Is the entry DELAY
+         * @return true if the entry is in DELAY state, false otherwise
          */
         bool IsDelay() const;
 
         /**
-         * \brief Is the entry INCOMPLETE
-         * \return true if the entry is in INCOMPLETE state, false otherwise
+         * @brief Is the entry INCOMPLETE
+         * @return true if the entry is in INCOMPLETE state, false otherwise
          */
         bool IsIncomplete() const;
 
         /**
-         * \brief Is the entry PROBE
-         * \return true if the entry is in PROBE state, false otherwise
+         * @brief Is the entry PROBE
+         * @return true if the entry is in PROBE state, false otherwise
          */
         bool IsProbe() const;
 
         /**
-         * \brief Is the entry PERMANENT
-         * \return true if the entry is in PERMANENT state, false otherwise
+         * @brief Is the entry PERMANENT
+         * @return true if the entry is in PERMANENT state, false otherwise
          */
         bool IsPermanent() const;
 
         /**
-         * \brief Is the entry STATIC_AUTOGENERATED
-         * \return True if the state of this entry is auto-generated; false otherwise.
+         * @brief Is the entry STATIC_AUTOGENERATED
+         * @return True if the state of this entry is auto-generated; false otherwise.
          */
         bool IsAutoGenerated() const;
 
         /**
-         * \brief Get the MAC address of this entry.
-         * \return the L2 address
+         * @brief Get the MAC address of this entry.
+         * @return the L2 address
          */
         Address GetMacAddress() const;
 
         /**
-         * \brief Set the MAC address of this entry.
-         * \param mac the MAC address to set
+         * @brief Set the MAC address of this entry.
+         * @param mac the MAC address to set
          */
         void SetMacAddress(Address mac);
 
         /**
-         * \brief If the entry is a host or a router.
-         * \return true if the node is a router, 0 if it is a host
+         * @brief If the entry is a host or a router.
+         * @return true if the node is a router, 0 if it is a host
          */
         bool IsRouter() const;
 
         /**
-         * \brief Set the node type.
-         * \param router true is a router, false means a host
+         * @brief Set the node type.
+         * @param router true is a router, false means a host
          */
         void SetRouter(bool router);
 
         /**
-         * \brief Get the time of last reachability confirmation.
-         * \return time
+         * @brief Get the time of last reachability confirmation.
+         * @return time
          */
         Time GetLastReachabilityConfirmation() const;
 
         /**
-         * \brief Start the reachable timer.
+         * @brief Start the reachable timer.
          */
         void StartReachableTimer();
 
         /**
-         * \brief Update the reachable timer.
+         * @brief Update the reachable timer.
          */
         void UpdateReachableTimer();
 
         /**
-         * \brief Start retransmit timer.
+         * @brief Start retransmit timer.
          */
         void StartRetransmitTimer();
 
         /**
-         * \brief Start probe timer.
+         * @brief Start probe timer.
          */
         void StartProbeTimer();
 
         /**
-         * \brief Start delay timer.
+         * @brief Start delay timer.
          */
         void StartDelayTimer();
 
         /**
-         * \brief Stop NUD timer and reset the NUD retransmission counter
+         * @brief Stop NUD timer and reset the NUD retransmission counter
          */
         void StopNudTimer();
 
         /**
-         * \brief Function called when reachable timer timeout.
+         * @brief Function called when reachable timer timeout.
          */
         void FunctionReachableTimeout();
 
         /**
-         * \brief Function called when retransmit timer timeout.
+         * @brief Function called when retransmit timer timeout.
          * It verify that the NS retransmit has reached the max so discard the entry
          * otherwise it retransmit a NS.
          */
         void FunctionRetransmitTimeout();
 
         /**
-         * \brief Function called when probe timer timeout.
+         * @brief Function called when probe timer timeout.
          */
         void FunctionProbeTimeout();
 
         /**
-         * \brief Function called when delay timer timeout.
+         * @brief Function called when delay timer timeout.
          */
         void FunctionDelayTimeout();
 
         /**
-         * \brief Set the IPv6 address.
-         * \param ipv6Address IPv6 address
+         * @brief Set the IPv6 address.
+         * @param ipv6Address IPv6 address
          */
         void SetIpv6Address(Ipv6Address ipv6Address);
 
         /**
-         * \brief Get the IPv6 address.
-         * \returns The IPv6 address
+         * @brief Get the IPv6 address.
+         * @returns The IPv6 address
          */
         Ipv6Address GetIpv6Address() const;
 
         /**
-         * \brief Get the state of the entry.
-         * \returns The state of the entry
+         * @brief Get the state of the entry.
+         * @returns The state of the entry
          */
         NdiscCacheEntryState_e GetEntryState() const;
 
         /**
-         * \brief Print this entry to the given output stream.
+         * @brief Print this entry to the given output stream.
          *
-         * \param os the output stream to which this Ipv6Address is printed
+         * @param os the output stream to which this Ipv6Address is printed
          */
         void Print(std::ostream& os) const;
 
       protected:
         /**
-         * \brief the NdiscCache associated.
+         * @brief the NdiscCache associated.
          */
         NdiscCache* m_ndCache;
 
       private:
         /**
-         * \brief The IPv6 address.
+         * @brief The IPv6 address.
          */
         Ipv6Address m_ipv6Address;
 
         /**
-         * \brief The MAC address.
+         * @brief The MAC address.
          */
         Address m_macAddress;
 
         /**
-         * \brief The list of packet waiting.
+         * @brief The list of packet waiting.
          */
         std::list<Ipv6PayloadHeaderPair> m_waiting;
 
         /**
-         * \brief Type of node (router or host).
+         * @brief Type of node (router or host).
          */
         bool m_router;
 
         /**
-         * \brief Timer (used for NUD).
+         * @brief Timer (used for NUD).
          */
         Timer m_nudTimer;
 
         /**
-         * \brief Last time we see a reachability confirmation.
+         * @brief Last time we see a reachability confirmation.
          */
         Time m_lastReachabilityConfirmation;
 
         /**
-         * \brief Number of NS retransmission.
+         * @brief Number of NS retransmission.
          */
         uint8_t m_nsRetransmit;
     };
 
   protected:
     /**
-     * \brief Dispose this object.
+     * @brief Dispose this object.
      */
     void DoDispose() override;
 
     /**
-     * \brief Neighbor Discovery Cache container
+     * @brief Neighbor Discovery Cache container
      */
     typedef std::map<Ipv6Address, NdiscCache::Entry*> Cache;
     /**
-     * \brief Neighbor Discovery Cache container iterator
+     * @brief Neighbor Discovery Cache container iterator
      */
     typedef std::map<Ipv6Address, NdiscCache::Entry*>::iterator CacheI;
 
     /**
-     * \brief A list of Entry.
+     * @brief A list of Entry.
      */
     Cache m_ndCache;
 
   private:
     /**
-     * \brief The NetDevice.
+     * @brief The NetDevice.
      */
     Ptr<NetDevice> m_device;
 
     /**
-     * \brief the interface.
+     * @brief the interface.
      */
     Ptr<Ipv6Interface> m_interface;
 
     /**
-     * \brief the icmpv6 L4 protocol for this cache.
+     * @brief the icmpv6 L4 protocol for this cache.
      */
     Ptr<Icmpv6L4Protocol> m_icmpv6;
 
     /**
-     * \brief Max number of packet stored in m_waiting.
+     * @brief Max number of packet stored in m_waiting.
      */
     uint32_t m_unresQlen;
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the reference to the output stream
- * \param entry the NdiscCache::Entry
- * \returns the reference to the output stream
+ * @param os the reference to the output stream
+ * @param entry the NdiscCache::Entry
+ * @returns the reference to the output stream
  */
 std::ostream& operator<<(std::ostream& os, const NdiscCache::Entry& entry);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/rip.h ns-3.44/src/internet/model/rip.h
--- ns-3.43/src/internet/model/rip.h	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/rip.h	2025-03-09 16:55:49.403371000 -0700
@@ -24,8 +24,8 @@
 {
 
 /**
- * \ingroup ipv4Routing
- * \defgroup rip RIP
+ * @ingroup ipv4Routing
+ * @defgroup rip RIP
  *
  * The RIP protocol (\RFC{2453}) is a unicast-only IPv4 IGP (Interior Gateway Protocol).
  * Its convergence time is rather long. As a consequence, it is suggested to
@@ -47,8 +47,8 @@
  */
 
 /**
- * \ingroup rip
- * \brief Rip Routing Table Entry
+ * @ingroup rip
+ * @brief Rip Routing Table Entry
  */
 class RipRoutingTableEntry : public Ipv4RoutingTableEntry
 {
@@ -65,11 +65,11 @@
     RipRoutingTableEntry();
 
     /**
-     * \brief Constructor
-     * \param network network address
-     * \param networkPrefix network prefix
-     * \param nextHop next hop address to route the packet
-     * \param interface interface index
+     * @brief Constructor
+     * @param network network address
+     * @param networkPrefix network prefix
+     * @param nextHop next hop address to route the packet
+     * @param interface interface index
      */
     RipRoutingTableEntry(Ipv4Address network,
                          Ipv4Mask networkPrefix,
@@ -77,66 +77,66 @@
                          uint32_t interface);
 
     /**
-     * \brief Constructor
-     * \param network network address
-     * \param networkPrefix network prefix
-     * \param interface interface index
+     * @brief Constructor
+     * @param network network address
+     * @param networkPrefix network prefix
+     * @param interface interface index
      */
     RipRoutingTableEntry(Ipv4Address network, Ipv4Mask networkPrefix, uint32_t interface);
 
     virtual ~RipRoutingTableEntry();
 
     /**
-     * \brief Set the route tag
-     * \param routeTag the route tag
+     * @brief Set the route tag
+     * @param routeTag the route tag
      */
     void SetRouteTag(uint16_t routeTag);
 
     /**
-     * \brief Get the route tag
-     * \returns the route tag
+     * @brief Get the route tag
+     * @returns the route tag
      */
     uint16_t GetRouteTag() const;
 
     /**
-     * \brief Set the route metric
-     * \param routeMetric the route metric
+     * @brief Set the route metric
+     * @param routeMetric the route metric
      */
     void SetRouteMetric(uint8_t routeMetric);
 
     /**
-     * \brief Get the route metric
-     * \returns the route metric
+     * @brief Get the route metric
+     * @returns the route metric
      */
     uint8_t GetRouteMetric() const;
 
     /**
-     * \brief Set the route status
-     * \param status the route status
+     * @brief Set the route status
+     * @param status the route status
      */
     void SetRouteStatus(Status_e status);
 
     /**
-     * \brief Get the route status
-     * \returns the route status
+     * @brief Get the route status
+     * @returns the route status
      */
     Status_e GetRouteStatus() const;
 
     /**
-     * \brief Set the route as changed
+     * @brief Set the route as changed
      *
      * The changed routes are scheduled for a Triggered Update.
      * After a Triggered Update, all the changed flags are cleared
      * from the routing table.
      *
-     * \param changed true if route is changed
+     * @param changed true if route is changed
      */
     void SetRouteChanged(bool changed);
 
     /**
-     * \brief Get the route changed status
+     * @brief Get the route changed status
      *
-     * \returns true if route is changed
+     * @returns true if route is changed
      */
     bool IsRouteChanged() const;
 
@@ -148,18 +148,18 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the reference to the output stream
- * \param route the Ipv4 routing table entry
- * \returns the reference to the output stream
+ * @param os the reference to the output stream
+ * @param route the Ipv4 routing table entry
+ * @returns the reference to the output stream
  */
 std::ostream& operator<<(std::ostream& os, const RipRoutingTableEntry& route);
 
 /**
- * \ingroup rip
+ * @ingroup rip
  *
- * \brief RIP Routing Protocol, defined in \RFC{2453}.
+ * @brief RIP Routing Protocol, defined in \RFC{2453}.
  */
 class Rip : public Ipv4RoutingProtocol
 {
@@ -169,8 +169,8 @@
     ~Rip() override;
 
     /**
-     * \brief Get the type ID
-     * \return type ID
+     * @brief Get the type ID
+     * @return type ID
      */
     static TypeId GetTypeId();
 
@@ -209,51 +209,51 @@
      * used by this model.  Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream);
 
     /**
-     * \brief Get the set of interface excluded from the protocol
-     * \return the set of excluded interfaces
+     * @brief Get the set of interface excluded from the protocol
+     * @return the set of excluded interfaces
      */
     std::set<uint32_t> GetInterfaceExclusions() const;
 
     /**
-     * \brief Set the set of interface excluded from the protocol
-     * \param exceptions the set of excluded interfaces
+     * @brief Set the set of interface excluded from the protocol
+     * @param exceptions the set of excluded interfaces
      */
     void SetInterfaceExclusions(std::set<uint32_t> exceptions);
 
     /**
-     * \brief Get the metric for an interface
-     * \param interface the interface
-     * \returns the interface metric
+     * @brief Get the metric for an interface
+     * @param interface the interface
+     * @returns the interface metric
      */
     uint8_t GetInterfaceMetric(uint32_t interface) const;
 
     /**
-     * \brief Set the metric for an interface
-     * \param interface the interface
-     * \param metric the interface metric
+     * @brief Set the metric for an interface
+     * @param interface the interface
+     * @param metric the interface metric
      */
     void SetInterfaceMetric(uint32_t interface, uint8_t metric);
 
     /**
-     * \brief Add a default route to the router through the nextHop located on interface.
+     * @brief Add a default route to the router through the nextHop located on interface.
      *
      * The default route is usually installed manually, or it is the result of
      * some "other" routing protocol (e.g., BGP).
      *
-     * \param nextHop the next hop
-     * \param interface the interface
+     * @param nextHop the next hop
+     * @param interface the interface
      */
     void AddDefaultRouteTo(Ipv4Address nextHop, uint32_t interface);
 
   protected:
     /**
-     * \brief Dispose this object.
+     * @brief Dispose this object.
      */
     void DoDispose() override;
 
@@ -273,20 +273,20 @@
     typedef std::list<std::pair<RipRoutingTableEntry*, EventId>>::iterator RoutesI;
 
     /**
-     * \brief Receive RIP packets.
+     * @brief Receive RIP packets.
      *
-     * \param socket the socket the packet was received to.
+     * @param socket the socket the packet was received to.
      */
     void Receive(Ptr<Socket> socket);
 
     /**
-     * \brief Handle RIP requests.
+     * @brief Handle RIP requests.
      *
-     * \param hdr message header (including RTEs)
-     * \param senderAddress sender address
-     * \param senderPort sender port
-     * \param incomingInterface incoming interface
-     * \param hopLimit packet's hop limit
+     * @param hdr message header (including RTEs)
+     * @param senderAddress sender address
+     * @param senderPort sender port
+     * @param incomingInterface incoming interface
+     * @param hopLimit packet's hop limit
      */
     void HandleRequests(RipHeader hdr,
                         Ipv4Address senderAddress,
@@ -295,12 +295,12 @@
                         uint8_t hopLimit);
 
     /**
-     * \brief Handle RIP responses.
+     * @brief Handle RIP responses.
      *
-     * \param hdr message header (including RTEs)
-     * \param senderAddress sender address
-     * \param incomingInterface incoming interface
-     * \param hopLimit packet's hop limit
+     * @param hdr message header (including RTEs)
+     * @param senderAddress sender address
+     * @param incomingInterface incoming interface
+     * @param hopLimit packet's hop limit
      */
     void HandleResponses(RipHeader hdr,
                          Ipv4Address senderAddress,
@@ -308,31 +308,31 @@
                          uint8_t hopLimit);
 
     /**
-     * \brief Lookup in the forwarding table for destination.
-     * \param dest destination address
-     * \param setSource set source address in the route
-     * \param interface output interface if any (put 0 otherwise)
-     * \return Ipv4Route to route the packet to reach dest address
+     * @brief Lookup in the forwarding table for destination.
+     * @param dest destination address
+     * @param setSource set source address in the route
+     * @param interface output interface if any (put 0 otherwise)
+     * @return Ipv4Route to route the packet to reach dest address
      */
     Ptr<Ipv4Route> Lookup(Ipv4Address dest, bool setSource, Ptr<NetDevice> = nullptr);
 
     /**
      * Receive and process unicast packet
-     * \param socket socket where packet is arrived
+     * @param socket socket where packet is arrived
      */
     void RecvUnicastRip(Ptr<Socket> socket);
     /**
      * Receive and process multicast packet
-     * \param socket socket where packet is arrived
+     * @param socket socket where packet is arrived
      */
     void RecvMulticastRip(Ptr<Socket> socket);
 
     /**
-     * \brief Add route to network.
-     * \param network network address
-     * \param networkPrefix network prefix
-     * \param nextHop next hop address to route the packet.
-     * \param interface interface index
+     * @brief Add route to network.
+     * @param network network address
+     * @param networkPrefix network prefix
+     * @param nextHop next hop address to route the packet.
+     * @param interface interface index
      */
     void AddNetworkRouteTo(Ipv4Address network,
                            Ipv4Mask networkPrefix,
@@ -340,43 +340,43 @@
                            uint32_t interface);
 
     /**
-     * \brief Add route to network.
-     * \param network network address
-     * \param networkPrefix network prefix
-     * \param interface interface index
+     * @brief Add route to network.
+     * @param network network address
+     * @param networkPrefix network prefix
+     * @param interface interface index
      */
     void AddNetworkRouteTo(Ipv4Address network, Ipv4Mask networkPrefix, uint32_t interface);
 
     /**
-     * \brief Send Routing Updates on all interfaces.
-     * \param periodic true for periodic update, else triggered.
+     * @brief Send Routing Updates on all interfaces.
+     * @param periodic true for periodic update, else triggered.
      */
     void DoSendRouteUpdate(bool periodic);
 
     /**
-     * \brief Send Routing Request on all interfaces.
+     * @brief Send Routing Request on all interfaces.
      */
     void SendRouteRequest();
 
     /**
-     * \brief Send Triggered Routing Updates on all interfaces.
+     * @brief Send Triggered Routing Updates on all interfaces.
      */
     void SendTriggeredRouteUpdate();
 
     /**
-     * \brief Send Unsolicited Routing Updates on all interfaces.
+     * @brief Send Unsolicited Routing Updates on all interfaces.
      */
     void SendUnsolicitedRouteUpdate();
 
     /**
-     * \brief Invalidate a route.
-     * \param route the route to be removed
+     * @brief Invalidate a route.
+     * @param route the route to be removed
      */
     void InvalidateRoute(RipRoutingTableEntry* route);
 
     /**
-     * \brief Delete a route.
-     * \param route the route to be removed
+     * @brief Delete a route.
+     * @param route the route to be removed
      */
     void DeleteRoute(RipRoutingTableEntry* route);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/rip-header.h ns-3.44/src/internet/model/rip-header.h
--- ns-3.43/src/internet/model/rip-header.h	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/rip-header.h	2025-03-09 16:55:49.403371000 -0700
@@ -21,8 +21,8 @@
 {
 
 /**
- * \ingroup rip
- * \brief Rip v2 Routing Table Entry (RTE) - see \RFC{2453}.
+ * @ingroup rip
+ * @brief Rip v2 Routing Table Entry (RTE) - see \RFC{2453}.
  */
 class RipRte : public Header
 {
@@ -30,95 +30,95 @@
     RipRte();
 
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Return the instance type identifier.
-     * \return Instance type ID.
+     * @brief Return the instance type identifier.
+     * @return Instance type ID.
      */
     TypeId GetInstanceTypeId() const override;
 
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Get the serialized size of the packet.
-     * \return Size.
+     * @brief Get the serialized size of the packet.
+     * @return Size.
      */
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Serialize the packet.
-     * \param start Buffer iterator.
+     * @brief Serialize the packet.
+     * @param start Buffer iterator.
      */
     void Serialize(Buffer::Iterator start) const override;
 
     /**
-     * \brief Deserialize the packet.
-     * \param start Buffer iterator.
-     * \return Size of the packet.
+     * @brief Deserialize the packet.
+     * @param start Buffer iterator.
+     * @return Size of the packet.
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
 
     /**
-     * \brief Set the prefix.
-     * \param prefix The prefix.
+     * @brief Set the prefix.
+     * @param prefix The prefix.
      */
     void SetPrefix(Ipv4Address prefix);
 
     /**
-     * \brief Get the prefix.
-     * \returns The prefix.
+     * @brief Get the prefix.
+     * @returns The prefix.
      */
     Ipv4Address GetPrefix() const;
 
     /**
-     * \brief Set the subnet mask.
-     * \param subnetMask The subnet mask.
+     * @brief Set the subnet mask.
+     * @param subnetMask The subnet mask.
      */
     void SetSubnetMask(Ipv4Mask subnetMask);
 
     /**
-     * \brief Get the subnet mask.
-     * \returns The subnet mask.
+     * @brief Get the subnet mask.
+     * @returns The subnet mask.
      */
     Ipv4Mask GetSubnetMask() const;
 
     /**
-     * \brief Set the route tag.
-     * \param routeTag The route tag.
+     * @brief Set the route tag.
+     * @param routeTag The route tag.
      */
     void SetRouteTag(uint16_t routeTag);
 
     /**
-     * \brief Get the route tag.
-     * \returns The route tag.
+     * @brief Get the route tag.
+     * @returns The route tag.
      */
     uint16_t GetRouteTag() const;
 
     /**
-     * \brief Set the route metric.
-     * \param routeMetric The route metric.
+     * @brief Set the route metric.
+     * @param routeMetric The route metric.
      */
     void SetRouteMetric(uint32_t routeMetric);
 
     /**
-     * \brief Get the route metric.
-     * \returns The route metric.
+     * @brief Get the route metric.
+     * @returns The route metric.
      */
     uint32_t GetRouteMetric() const;
 
     /**
-     * \brief Set the next hop.
-     * \param nextHop The next hop.
+     * @brief Set the next hop.
+     * @param nextHop The next hop.
      */
     void SetNextHop(Ipv4Address nextHop);
 
     /**
-     * \brief Get the next hop.
-     * \returns The next hop.
+     * @brief Get the next hop.
+     * @returns The next hop.
      */
     Ipv4Address GetNextHop() const;
 
@@ -131,17 +131,17 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the reference to the output stream
- * \param h the Routing Table Entry
- * \returns the reference to the output stream
+ * @param os the reference to the output stream
+ * @param h the Routing Table Entry
+ * @returns the reference to the output stream
  */
 std::ostream& operator<<(std::ostream& os, const RipRte& h);
 
 /**
- * \ingroup rip
- * \brief RipHeader - see \RFC{2453}
+ * @ingroup rip
+ * @brief RipHeader - see \RFC{2453}
  */
 class RipHeader : public Header
 {
@@ -149,35 +149,35 @@
     RipHeader();
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Return the instance type identifier.
-     * \return instance type ID
+     * @brief Return the instance type identifier.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
 
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Get the serialized size of the packet.
-     * \return size
+     * @brief Get the serialized size of the packet.
+     * @return size
      */
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Serialize the packet.
-     * \param start Buffer iterator
+     * @brief Serialize the packet.
+     * @param start Buffer iterator
      */
     void Serialize(Buffer::Iterator start) const override;
 
     /**
-     * \brief Deserialize the packet.
-     * \param start Buffer iterator
-     * \return size of the packet
+     * @brief Deserialize the packet.
+     * @param start Buffer iterator
+     * @return size of the packet
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
 
@@ -191,37 +191,37 @@
     };
 
     /**
-     * \brief Set the command
-     * \param command the command
+     * @brief Set the command
+     * @param command the command
      */
     void SetCommand(Command_e command);
 
     /**
-     * \brief Get the command
-     * \returns the command
+     * @brief Get the command
+     * @returns the command
      */
     Command_e GetCommand() const;
 
     /**
-     * \brief Add a RTE to the message
-     * \param rte the RTE
+     * @brief Add a RTE to the message
+     * @param rte the RTE
      */
     void AddRte(RipRte rte);
 
     /**
-     * \brief Clear all the RTEs from the header
+     * @brief Clear all the RTEs from the header
      */
     void ClearRtes();
 
     /**
-     * \brief Get the number of RTE included in the message
-     * \returns the number of RTE in the message
+     * @brief Get the number of RTE included in the message
+     * @returns the number of RTE in the message
      */
     uint16_t GetRteNumber() const;
 
     /**
-     * \brief Get the list of the RTEs included in the message
-     * \returns the list of the RTEs in the message
+     * @brief Get the list of the RTEs included in the message
+     * @returns the list of the RTEs in the message
      */
     std::list<RipRte> GetRteList() const;
 
@@ -231,11 +231,11 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the reference to the output stream
- * \param h the Rip header
- * \returns the reference to the output stream
+ * @param os the reference to the output stream
+ * @param h the Rip header
+ * @returns the reference to the output stream
  */
 std::ostream& operator<<(std::ostream& os, const RipHeader& h);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ripng.h ns-3.44/src/internet/model/ripng.h
--- ns-3.43/src/internet/model/ripng.h	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/ripng.h	2025-03-09 16:55:49.403371000 -0700
@@ -24,8 +24,8 @@
 {
 
 /**
- * \ingroup ipv6Routing
- * \defgroup ripng RIPng
+ * @ingroup ipv6Routing
+ * @defgroup ripng RIPng
  *
  * The RIPng protocol (\RFC{2080}) is a unicast-only IPv6 IGP (Interior Gateway Protocol).
  * Its convergence time is rather long. As a consequence, it is suggested to
@@ -47,8 +47,8 @@
  */
 
 /**
- * \ingroup ripng
- * \brief RipNg Routing Table Entry
+ * @ingroup ripng
+ * @brief RipNg Routing Table Entry
  */
 class RipNgRoutingTableEntry : public Ipv6RoutingTableEntry
 {
@@ -65,12 +65,12 @@
     RipNgRoutingTableEntry();
 
     /**
-     * \brief Constructor
-     * \param network network address
-     * \param networkPrefix network prefix
-     * \param nextHop next hop address to route the packet
-     * \param interface interface index
-     * \param prefixToUse prefix that should be used for source address for this destination
+     * @brief Constructor
+     * @param network network address
+     * @param networkPrefix network prefix
+     * @param nextHop next hop address to route the packet
+     * @param interface interface index
+     * @param prefixToUse prefix that should be used for source address for this destination
      */
     RipNgRoutingTableEntry(Ipv6Address network,
                            Ipv6Prefix networkPrefix,
@@ -79,66 +79,66 @@
                            Ipv6Address prefixToUse);
 
     /**
-     * \brief Constructor
-     * \param network network address
-     * \param networkPrefix network prefix
-     * \param interface interface index
+     * @brief Constructor
+     * @param network network address
+     * @param networkPrefix network prefix
+     * @param interface interface index
      */
     RipNgRoutingTableEntry(Ipv6Address network, Ipv6Prefix networkPrefix, uint32_t interface);
 
     ~RipNgRoutingTableEntry() override;
 
     /**
-     * \brief Set the route tag
-     * \param routeTag the route tag
+     * @brief Set the route tag
+     * @param routeTag the route tag
      */
     void SetRouteTag(uint16_t routeTag);
 
     /**
-     * \brief Get the route tag
-     * \returns the route tag
+     * @brief Get the route tag
+     * @returns the route tag
      */
     uint16_t GetRouteTag() const;
 
     /**
-     * \brief Set the route metric
-     * \param routeMetric the route metric
+     * @brief Set the route metric
+     * @param routeMetric the route metric
      */
     void SetRouteMetric(uint8_t routeMetric);
 
     /**
-     * \brief Get the route metric
-     * \returns the route metric
+     * @brief Get the route metric
+     * @returns the route metric
      */
     uint8_t GetRouteMetric() const;
 
     /**
-     * \brief Set the route status
-     * \param status the route status
+     * @brief Set the route status
+     * @param status the route status
      */
     void SetRouteStatus(Status_e status);
 
     /**
-     * \brief Get the route status
-     * \returns the route status
+     * @brief Get the route status
+     * @returns the route status
      */
     Status_e GetRouteStatus() const;
 
     /**
-     * \brief Set the route as changed
+     * @brief Set the route as changed
      *
      * The changed routes are scheduled for a Triggered Update.
      * After a Triggered Update, all the changed flags are cleared
      * from the routing table.
      *
-     * \param changed true if route is changed
+     * @param changed true if route is changed
      */
     void SetRouteChanged(bool changed);
 
     /**
-     * \brief Get the route changed status
+     * @brief Get the route changed status
      *
-     * \returns true if route is changed
+     * @returns true if route is changed
      */
     bool IsRouteChanged() const;
 
@@ -150,18 +150,18 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the reference to the output stream
- * \param route the Ipv6 routing table entry
- * \returns the reference to the output stream
+ * @param os the reference to the output stream
+ * @param route the Ipv6 routing table entry
+ * @returns the reference to the output stream
  */
 std::ostream& operator<<(std::ostream& os, const RipNgRoutingTableEntry& route);
 
 /**
- * \ingroup ripng
+ * @ingroup ripng
  *
- * \brief RIPng Routing Protocol, defined in \RFC{2080}.
+ * @brief RIPng Routing Protocol, defined in \RFC{2080}.
  */
 class RipNg : public Ipv6RoutingProtocol
 {
@@ -171,8 +171,8 @@
     ~RipNg() override;
 
     /**
-     * \brief Get the type ID
-     * \return type ID
+     * @brief Get the type ID
+     * @return type ID
      */
     static TypeId GetTypeId();
 
@@ -221,51 +221,51 @@
      * used by this model.  Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream);
 
     /**
-     * \brief Get the set of interface excluded from the protocol
-     * \return the set of excluded interfaces
+     * @brief Get the set of interface excluded from the protocol
+     * @return the set of excluded interfaces
      */
     std::set<uint32_t> GetInterfaceExclusions() const;
 
     /**
-     * \brief Set the set of interface excluded from the protocol
-     * \param exceptions the set of excluded interfaces
+     * @brief Set the set of interface excluded from the protocol
+     * @param exceptions the set of excluded interfaces
      */
     void SetInterfaceExclusions(std::set<uint32_t> exceptions);
 
     /**
-     * \brief Get the metric for an interface
-     * \param interface the interface
-     * \returns the interface metric
+     * @brief Get the metric for an interface
+     * @param interface the interface
+     * @returns the interface metric
      */
     uint8_t GetInterfaceMetric(uint32_t interface) const;
 
     /**
-     * \brief Set the metric for an interface
-     * \param interface the interface
-     * \param metric the interface metric
+     * @brief Set the metric for an interface
+     * @param interface the interface
+     * @param metric the interface metric
      */
     void SetInterfaceMetric(uint32_t interface, uint8_t metric);
 
     /**
-     * \brief Add a default route to the router through the nextHop located on interface.
+     * @brief Add a default route to the router through the nextHop located on interface.
      *
      * The default route is usually installed manually, or it is the result of
      * some "other" routing protocol (e.g., BGP).
      *
-     * \param nextHop the next hop
-     * \param interface the interface
+     * @param nextHop the next hop
+     * @param interface the interface
      */
     void AddDefaultRouteTo(Ipv6Address nextHop, uint32_t interface);
 
   protected:
     /**
-     * \brief Dispose this object.
+     * @brief Dispose this object.
      */
     void DoDispose() override;
 
@@ -285,20 +285,20 @@
     typedef std::list<std::pair<RipNgRoutingTableEntry*, EventId>>::iterator RoutesI;
 
     /**
-     * \brief Receive RIPng packets.
+     * @brief Receive RIPng packets.
      *
-     * \param socket the socket the packet was received to.
+     * @param socket the socket the packet was received to.
      */
     void Receive(Ptr<Socket> socket);
 
     /**
-     * \brief Handle RIPng requests.
+     * @brief Handle RIPng requests.
      *
-     * \param hdr message header (including RTEs)
-     * \param senderAddress sender address
-     * \param senderPort sender port
-     * \param incomingInterface incoming interface
-     * \param hopLimit packet's hop limit
+     * @param hdr message header (including RTEs)
+     * @param senderAddress sender address
+     * @param senderPort sender port
+     * @param incomingInterface incoming interface
+     * @param hopLimit packet's hop limit
      */
     void HandleRequests(RipNgHeader hdr,
                         Ipv6Address senderAddress,
@@ -307,12 +307,12 @@
                         uint8_t hopLimit);
 
     /**
-     * \brief Handle RIPng responses.
+     * @brief Handle RIPng responses.
      *
-     * \param hdr message header (including RTEs)
-     * \param senderAddress sender address
-     * \param incomingInterface incoming interface
-     * \param hopLimit packet's hop limit
+     * @param hdr message header (including RTEs)
+     * @param senderAddress sender address
+     * @param incomingInterface incoming interface
+     * @param hopLimit packet's hop limit
      */
     void HandleResponses(RipNgHeader hdr,
                          Ipv6Address senderAddress,
@@ -320,32 +320,32 @@
                          uint8_t hopLimit);
 
     /**
-     * \brief Lookup in the forwarding table for destination.
-     * \param dest destination address
-     * \param setSource set source address in the route
-     * \param interface output interface if any (put 0 otherwise)
-     * \return Ipv6Route to route the packet to reach dest address
+     * @brief Lookup in the forwarding table for destination.
+     * @param dest destination address
+     * @param setSource set source address in the route
+     * @param interface output interface if any (put 0 otherwise)
+     * @return Ipv6Route to route the packet to reach dest address
      */
     Ptr<Ipv6Route> Lookup(Ipv6Address dest, bool setSource, Ptr<NetDevice> = nullptr);
 
     /**
      * Receive and process unicast packet
-     * \param socket socket where packet is arrived
+     * @param socket socket where packet is arrived
      */
     void RecvUnicastRipng(Ptr<Socket> socket);
     /**
      * Receive and process multicast packet
-     * \param socket socket where packet is arrived
+     * @param socket socket where packet is arrived
      */
     void RecvMulticastRipng(Ptr<Socket> socket);
 
     /**
-     * \brief Add route to network.
-     * \param network network address
-     * \param networkPrefix network prefix
-     * \param nextHop next hop address to route the packet.
-     * \param interface interface index
-     * \param prefixToUse prefix that should be used for source address for this destination
+     * @brief Add route to network.
+     * @param network network address
+     * @param networkPrefix network prefix
+     * @param nextHop next hop address to route the packet.
+     * @param interface interface index
+     * @param prefixToUse prefix that should be used for source address for this destination
      */
     void AddNetworkRouteTo(Ipv6Address network,
                            Ipv6Prefix networkPrefix,
@@ -354,43 +354,43 @@
                            Ipv6Address prefixToUse);
 
     /**
-     * \brief Add route to network.
-     * \param network network address
-     * \param networkPrefix network prefix
-     * \param interface interface index
+     * @brief Add route to network.
+     * @param network network address
+     * @param networkPrefix network prefix
+     * @param interface interface index
      */
     void AddNetworkRouteTo(Ipv6Address network, Ipv6Prefix networkPrefix, uint32_t interface);
 
     /**
-     * \brief Send Routing Updates on all interfaces.
-     * \param periodic true for periodic update, else triggered.
+     * @brief Send Routing Updates on all interfaces.
+     * @param periodic true for periodic update, else triggered.
      */
     void DoSendRouteUpdate(bool periodic);
 
     /**
-     * \brief Send Routing Request on all interfaces.
+     * @brief Send Routing Request on all interfaces.
      */
     void SendRouteRequest();
 
     /**
-     * \brief Send Triggered Routing Updates on all interfaces.
+     * @brief Send Triggered Routing Updates on all interfaces.
      */
     void SendTriggeredRouteUpdate();
 
     /**
-     * \brief Send Unsolicited Routing Updates on all interfaces.
+     * @brief Send Unsolicited Routing Updates on all interfaces.
      */
     void SendUnsolicitedRouteUpdate();
 
     /**
-     * \brief Invalidate a route.
-     * \param route the route to be removed
+     * @brief Invalidate a route.
+     * @param route the route to be removed
      */
     void InvalidateRoute(RipNgRoutingTableEntry* route);
 
     /**
-     * \brief Delete a route.
-     * \param route the route to be removed
+     * @brief Delete a route.
+     * @param route the route to be removed
      */
     void DeleteRoute(RipNgRoutingTableEntry* route);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/ripng-header.h ns-3.44/src/internet/model/ripng-header.h
--- ns-3.43/src/internet/model/ripng-header.h	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/ripng-header.h	2025-03-09 16:55:49.403371000 -0700
@@ -21,9 +21,9 @@
 {
 
 /**
- * \ingroup ripng
+ * @ingroup ripng
  *
- * \brief RipNg Routing Table Entry (RTE) - see \RFC{2080}
+ * @brief RipNg Routing Table Entry (RTE) - see \RFC{2080}
  */
 class RipNgRte : public Header
 {
@@ -31,83 +31,83 @@
     RipNgRte();
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Return the instance type identifier.
-     * \return instance type ID
+     * @brief Return the instance type identifier.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
 
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Get the serialized size of the packet.
-     * \return size
+     * @brief Get the serialized size of the packet.
+     * @return size
      */
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Serialize the packet.
-     * \param start Buffer iterator
+     * @brief Serialize the packet.
+     * @param start Buffer iterator
      */
     void Serialize(Buffer::Iterator start) const override;
 
     /**
-     * \brief Deserialize the packet.
-     * \param start Buffer iterator
-     * \return size of the packet
+     * @brief Deserialize the packet.
+     * @param start Buffer iterator
+     * @return size of the packet
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
 
     /**
-     * \brief Set the prefix
-     * \param prefix the prefix
+     * @brief Set the prefix
+     * @param prefix the prefix
      */
     void SetPrefix(Ipv6Address prefix);
 
     /**
-     * \brief Get the prefix
-     * \returns the prefix
+     * @brief Get the prefix
+     * @returns the prefix
      */
     Ipv6Address GetPrefix() const;
 
     /**
-     * \brief Set the prefix length
-     * \param prefixLen the prefix length
+     * @brief Set the prefix length
+     * @param prefixLen the prefix length
      */
     void SetPrefixLen(uint8_t prefixLen);
 
     /**
-     * \brief Get the prefix length
-     * \returns the prefix length
+     * @brief Get the prefix length
+     * @returns the prefix length
      */
     uint8_t GetPrefixLen() const;
 
     /**
-     * \brief Set the route tag
-     * \param routeTag the route tag
+     * @brief Set the route tag
+     * @param routeTag the route tag
      */
     void SetRouteTag(uint16_t routeTag);
 
     /**
-     * \brief Get the route tag
-     * \returns the route tag
+     * @brief Get the route tag
+     * @returns the route tag
      */
     uint16_t GetRouteTag() const;
 
     /**
-     * \brief Set the route metric
-     * \param routeMetric the route metric
+     * @brief Set the route metric
+     * @param routeMetric the route metric
      */
     void SetRouteMetric(uint8_t routeMetric);
 
     /**
-     * \brief Get the route metric
-     * \returns the route metric
+     * @brief Get the route metric
+     * @returns the route metric
      */
     uint8_t GetRouteMetric() const;
 
@@ -119,18 +119,18 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the reference to the output stream
- * \param h the Routing Table Entry
- * \returns the reference to the output stream
+ * @param os the reference to the output stream
+ * @param h the Routing Table Entry
+ * @returns the reference to the output stream
  */
 std::ostream& operator<<(std::ostream& os, const RipNgRte& h);
 
 /**
- * \ingroup ripng
+ * @ingroup ripng
  *
- * \brief RipNgHeader - see \RFC{2080}
+ * @brief RipNgHeader - see \RFC{2080}
  */
 class RipNgHeader : public Header
 {
@@ -138,35 +138,35 @@
     RipNgHeader();
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Return the instance type identifier.
-     * \return instance type ID
+     * @brief Return the instance type identifier.
+     * @return instance type ID
      */
     TypeId GetInstanceTypeId() const override;
 
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Get the serialized size of the packet.
-     * \return size
+     * @brief Get the serialized size of the packet.
+     * @return size
      */
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Serialize the packet.
-     * \param start Buffer iterator
+     * @brief Serialize the packet.
+     * @param start Buffer iterator
      */
     void Serialize(Buffer::Iterator start) const override;
 
     /**
-     * \brief Deserialize the packet.
-     * \param start Buffer iterator
-     * \return size of the packet
+     * @brief Deserialize the packet.
+     * @param start Buffer iterator
+     * @return size of the packet
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
 
@@ -180,37 +180,37 @@
     };
 
     /**
-     * \brief Set the command
-     * \param command the command
+     * @brief Set the command
+     * @param command the command
      */
     void SetCommand(Command_e command);
 
     /**
-     * \brief Get the command
-     * \returns the command
+     * @brief Get the command
+     * @returns the command
      */
     Command_e GetCommand() const;
 
     /**
-     * \brief Add a RTE to the message
-     * \param rte the RTE
+     * @brief Add a RTE to the message
+     * @param rte the RTE
      */
     void AddRte(RipNgRte rte);
 
     /**
-     * \brief Clear all the RTEs from the header
+     * @brief Clear all the RTEs from the header
      */
     void ClearRtes();
 
     /**
-     * \brief Get the number of RTE included in the message
-     * \returns the number of RTE in the message
+     * @brief Get the number of RTE included in the message
+     * @returns the number of RTE in the message
      */
     uint16_t GetRteNumber() const;
 
     /**
-     * \brief Get the list of the RTEs included in the message
-     * \returns the list of the RTEs in the message
+     * @brief Get the list of the RTEs included in the message
+     * @returns the list of the RTEs in the message
      */
     std::list<RipNgRte> GetRteList() const;
 
@@ -220,11 +220,11 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the reference to the output stream
- * \param h the RIPng header
- * \returns the reference to the output stream
+ * @param os the reference to the output stream
+ * @param h the RIPng header
+ * @returns the reference to the output stream
  */
 std::ostream& operator<<(std::ostream& os, const RipNgHeader& h);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/rtt-estimator.cc ns-3.44/src/internet/model/rtt-estimator.cc
--- ns-3.43/src/internet/model/rtt-estimator.cc	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/rtt-estimator.cc	2025-03-09 16:55:49.403371000 -0700
@@ -39,7 +39,7 @@
                             .SetGroupName("Internet")
                             .AddAttribute("InitialEstimation",
                                           "Initial RTT estimate",
-                                          TimeValue(Seconds(1.0)),
+                                          TimeValue(Seconds(1)),
                                           MakeTimeAccessor(&RttEstimator::m_initialEstimatedRtt),
                                           MakeTimeChecker());
     return tid;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/rtt-estimator.h ns-3.44/src/internet/model/rtt-estimator.h
--- ns-3.43/src/internet/model/rtt-estimator.h	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/rtt-estimator.h	2025-03-09 16:55:49.403371000 -0700
@@ -19,9 +19,9 @@
 {
 
 /**
- * \ingroup tcp
+ * @ingroup tcp
  *
- * \brief Base class for all RTT Estimators
+ * @brief Base class for all RTT Estimators
  *
  * The RTT Estimator class computes an estimate of the round trip time
  * observed in a series of Time measurements.  The estimate is provided in
@@ -32,15 +32,15 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     RttEstimator();
     /**
-     * \brief Copy constructor
-     * \param r the object to copy
+     * @brief Copy constructor
+     * @param r the object to copy
      */
     RttEstimator(const RttEstimator& r);
 
@@ -49,25 +49,25 @@
     TypeId GetInstanceTypeId() const override;
 
     /**
-     * \brief Add a new measurement to the estimator. Pure virtual function.
-     * \param t the new RTT measure.
+     * @brief Add a new measurement to the estimator. Pure virtual function.
+     * @param t the new RTT measure.
      */
     virtual void Measurement(Time t) = 0;
 
     /**
-     * \brief Copy object (including current internal state)
-     * \returns a copy of itself
+     * @brief Copy object (including current internal state)
+     * @returns a copy of itself
      */
     virtual Ptr<RttEstimator> Copy() const = 0;
 
     /**
-     * \brief Resets the estimation to its initial state.
+     * @brief Resets the estimation to its initial state.
      */
     virtual void Reset();
 
     /**
-     * \brief gets the RTT estimate.
-     * \return The RTT estimate.
+     * @brief gets the RTT estimate.
+     * @return The RTT estimate.
      */
     Time GetEstimate() const;
 
@@ -76,14 +76,14 @@
      * the same units as the estimate.  Mean deviation or standard deviation
      * are example quantities that could be provided here.
      *
-     * \brief gets the RTT estimate variation.
-     * \return The RTT estimate variation.
+     * @brief gets the RTT estimate variation.
+     * @return The RTT estimate variation.
      */
     Time GetVariation() const;
 
     /**
-     * \brief gets the number of samples used in the estimates
-     * \return the number of samples used in the estimates
+     * @brief gets the number of samples used in the estimates
+     * @return the number of samples used in the estimates
      */
     uint32_t GetNSamples() const;
 
@@ -97,9 +97,9 @@
 };
 
 /**
- * \ingroup tcp
+ * @ingroup tcp
  *
- * \brief The "Mean--Deviation" RTT estimator, as discussed by Van Jacobson
+ * @brief The "Mean--Deviation" RTT estimator, as discussed by Van Jacobson
  *
  * This class implements the "Mean--Deviation" RTT estimator, as discussed
  * by Van Jacobson and Michael J. Karels, in
@@ -113,31 +113,31 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     RttMeanDeviation();
 
     /**
-     * \brief Copy constructor
-     * \param r the object to copy
+     * @brief Copy constructor
+     * @param r the object to copy
      */
     RttMeanDeviation(const RttMeanDeviation& r);
 
     TypeId GetInstanceTypeId() const override;
 
     /**
-     * \brief Add a new measurement to the estimator.
-     * \param measure the new RTT measure.
+     * @brief Add a new measurement to the estimator.
+     * @param measure the new RTT measure.
      */
     void Measurement(Time measure) override;
 
     Ptr<RttEstimator> Copy() const override;
 
     /**
-     * \brief Resets the estimator.
+     * @brief Resets the estimator.
      */
     void Reset() override;
 
@@ -149,8 +149,8 @@
      * Values of 1/32, 1/16, 1/8, 1/4, and 1/2 (i.e., within the possible
      * range of experimentation for this estimator) are supported.
      *
-     * \param val value to check
-     * \return log base 2 (1/val) if reciprocal power of 2, or zero if not
+     * @param val value to check
+     * @return log base 2 (1/val) if reciprocal power of 2, or zero if not
      */
     uint32_t CheckForReciprocalPowerOfTwo(double val) const;
     /**
@@ -158,9 +158,9 @@
      * arithmetic, used when the values of Alpha and Beta support the
      * integer conversion.
      *
-     * \param m time measurement
-     * \param rttShift value corresponding to log base 2 (1/alpha)
-     * \param variationShift value corresponding to log base 2 (1/beta)
+     * @param m time measurement
+     * @param rttShift value corresponding to log base 2 (1/alpha)
+     * @param variationShift value corresponding to log base 2 (1/beta)
      */
     void IntegerUpdate(Time m, uint32_t rttShift, uint32_t variationShift);
     /**
@@ -168,7 +168,7 @@
      * point arithmetic, used when the values of Alpha and Beta are not
      * both a reciprocal power of two.
      *
-     * \param m time measurement
+     * @param m time measurement
      */
     void FloatingPointUpdate(Time m);
     double m_alpha; //!< Filter gain for average
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/tcp-bbr.cc ns-3.44/src/internet/model/tcp-bbr.cc
--- ns-3.43/src/internet/model/tcp-bbr.cc	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/tcp-bbr.cc	2025-03-09 16:55:49.403371000 -0700
@@ -359,7 +359,7 @@
 {
     NS_LOG_FUNCTION(this << tcb);
     m_minRttExpired = Simulator::Now() > (m_minRttStamp + m_minRttFilterLen);
-    if (tcb->m_lastRtt >= Seconds(0) && (tcb->m_lastRtt <= m_minRtt || m_minRttExpired))
+    if (tcb->m_lastRtt.Get().IsPositive() && (tcb->m_lastRtt <= m_minRtt || m_minRttExpired))
     {
         m_minRtt = tcb->m_lastRtt;
         m_minRttStamp = Simulator::Now();
@@ -418,13 +418,13 @@
     uint32_t totalBytes = m_delivered + tcb->m_bytesInFlight.Get();
     m_appLimited = (totalBytes > 0 ? totalBytes : 1);
 
-    if (m_probeRttDoneStamp == Seconds(0) && tcb->m_bytesInFlight <= m_minPipeCwnd)
+    if (m_probeRttDoneStamp.IsZero() && tcb->m_bytesInFlight <= m_minPipeCwnd)
     {
         m_probeRttDoneStamp = Simulator::Now() + m_probeRttDuration;
         m_probeRttRoundDone = false;
         m_nextRoundDelivered = m_delivered;
     }
-    else if (m_probeRttDoneStamp != Seconds(0))
+    else if (!m_probeRttDoneStamp.IsZero())
     {
         if (m_roundStart)
         {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/tcp-bbr.h ns-3.44/src/internet/model/tcp-bbr.h
--- ns-3.43/src/internet/model/tcp-bbr.h	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/tcp-bbr.h	2025-03-09 16:55:49.403371000 -0700
@@ -24,9 +24,9 @@
 {
 
 /**
- * \ingroup congestionOps
+ * @ingroup congestionOps
  *
- * \brief BBR congestion control algorithm
+ * @brief BBR congestion control algorithm
  *
  * This class implement the BBR (Bottleneck Bandwidth and Round-trip propagation time)
  * congestion control type.
@@ -35,34 +35,34 @@
 {
   public:
     /**
-     * \brief The number of phases in the BBR ProbeBW gain cycle.
+     * @brief The number of phases in the BBR ProbeBW gain cycle.
      */
     static const uint8_t GAIN_CYCLE_LENGTH = 8;
 
     /**
-     * \brief BBR uses an eight-phase cycle with the given pacing_gain value
+     * @brief BBR uses an eight-phase cycle with the given pacing_gain value
      * in the BBR ProbeBW gain cycle.
      */
     const static double PACING_GAIN_CYCLE[];
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Constructor
+     * @brief Constructor
      */
     TcpBbr();
 
     /**
      * Copy constructor.
-     * \param sock The socket to copy from.
+     * @param sock The socket to copy from.
      */
     TcpBbr(const TcpBbr& sock);
 
     /**
-     * \brief BBR has the following 4 modes for deciding how fast to send:
+     * @brief BBR has the following 4 modes for deciding how fast to send:
      */
     enum BbrMode_t
     {
@@ -79,7 +79,7 @@
         MaxBandwidthFilter_t; //!< Definition of max bandwidth filter.
 
     /**
-     * \brief Literal names of BBR mode for use in log messages
+     * @brief Literal names of BBR mode for use in log messages
      */
     static const char* const BbrModeName[BBR_PROBE_RTT + 1];
 
@@ -87,7 +87,7 @@
      * Assign a fixed random variable stream number to the random variables
      * used by this model.
      *
-     * \param stream first stream index to use
+     * @param stream first stream index to use
      */
     virtual void SetStream(uint32_t stream);
 
@@ -102,237 +102,237 @@
     uint32_t GetSsThresh(Ptr<const TcpSocketState> tcb, uint32_t bytesInFlight) override;
     Ptr<TcpCongestionOps> Fork() override;
 
-  protected:
+  public:
     /**
-     * \brief TcpBbrCheckGainValuesTest friend class (for tests).
-     * \relates TcpBbrCheckGainValuesTest
+     * @brief TcpBbrCheckGainValuesTest friend class (for tests).
+     * @relates TcpBbrCheckGainValuesTest
      */
-    friend class TcpBbrCheckGainValuesTest;
+    friend class ::TcpBbrCheckGainValuesTest;
 
     /**
-     * \brief Advances pacing gain using cycle gain algorithm, while in BBR_PROBE_BW state
+     * @brief Advances pacing gain using cycle gain algorithm, while in BBR_PROBE_BW state
      */
     void AdvanceCyclePhase();
 
     /**
-     * \brief Checks whether to advance pacing gain in BBR_PROBE_BW state,
+     * @brief Checks whether to advance pacing gain in BBR_PROBE_BW state,
      *  and if allowed calls AdvanceCyclePhase ()
-     * \param tcb the socket state.
-     * \param rs rate sample.
+     * @param tcb the socket state.
+     * @param rs rate sample.
      */
     void CheckCyclePhase(Ptr<TcpSocketState> tcb, const TcpRateOps::TcpRateSample& rs);
 
     /**
-     * \brief Checks whether its time to enter BBR_DRAIN or BBR_PROBE_BW state
-     * \param tcb the socket state.
+     * @brief Checks whether its time to enter BBR_DRAIN or BBR_PROBE_BW state
+     * @param tcb the socket state.
      */
     void CheckDrain(Ptr<TcpSocketState> tcb);
 
     /**
-     * \brief Identifies whether pipe or BDP is already full
-     * \param rs rate sample.
+     * @brief Identifies whether pipe or BDP is already full
+     * @param rs rate sample.
      */
     void CheckFullPipe(const TcpRateOps::TcpRateSample& rs);
 
     /**
-     * \brief This method handles the steps related to the ProbeRTT state
-     * \param tcb the socket state.
-     * \param rs rate sample.
+     * @brief This method handles the steps related to the ProbeRTT state
+     * @param tcb the socket state.
+     * @param rs rate sample.
      */
     void CheckProbeRTT(Ptr<TcpSocketState> tcb, const TcpRateOps::TcpRateSample& rs);
 
     /**
-     * \brief Updates variables specific to BBR_DRAIN state
+     * @brief Updates variables specific to BBR_DRAIN state
      */
     void EnterDrain();
 
     /**
-     * \brief Updates variables specific to BBR_PROBE_BW state
+     * @brief Updates variables specific to BBR_PROBE_BW state
      */
     void EnterProbeBW();
 
     /**
-     * \brief Updates variables specific to BBR_PROBE_RTT state
+     * @brief Updates variables specific to BBR_PROBE_RTT state
      */
     void EnterProbeRTT();
 
     /**
-     * \brief Updates variables specific to BBR_STARTUP state
+     * @brief Updates variables specific to BBR_STARTUP state
      */
     void EnterStartup();
 
     /**
-     * \brief Called on exiting from BBR_PROBE_RTT state, it eithers invoke EnterProbeBW () or
+     * @brief Called on exiting from BBR_PROBE_RTT state, it eithers invoke EnterProbeBW () or
      * EnterStartup ()
      */
     void ExitProbeRTT();
 
     /**
-     * \brief Gets BBR state.
-     * \return returns BBR state.
+     * @brief Gets BBR state.
+     * @return returns BBR state.
      */
     uint32_t GetBbrState();
 
     /**
-     * \brief Gets current pacing gain.
-     * \return returns current pacing gain.
+     * @brief Gets current pacing gain.
+     * @return returns current pacing gain.
      */
     double GetPacingGain();
 
     /**
-     * \brief Gets current cwnd gain.
-     * \return returns current cwnd gain.
+     * @brief Gets current cwnd gain.
+     * @return returns current cwnd gain.
      */
     double GetCwndGain();
 
     /**
-     * \brief Handles the steps for BBR_PROBE_RTT state.
-     * \param tcb the socket state.
+     * @brief Handles the steps for BBR_PROBE_RTT state.
+     * @param tcb the socket state.
      */
     void HandleProbeRTT(Ptr<TcpSocketState> tcb);
 
     /**
-     * \brief Updates pacing rate if socket is restarting from idle state.
-     * \param tcb the socket state.
-     * \param rs rate sample.
+     * @brief Updates pacing rate if socket is restarting from idle state.
+     * @param tcb the socket state.
+     * @param rs rate sample.
      */
     void HandleRestartFromIdle(Ptr<TcpSocketState> tcb, const TcpRateOps::TcpRateSample& rs);
 
     /**
-     * \brief Estimates the target value for congestion window
-     * \param tcb  the socket state.
-     * \param gain cwnd gain.
-     * \return returns congestion window based on max bandwidth and min RTT.
+     * @brief Estimates the target value for congestion window
+     * @param tcb  the socket state.
+     * @param gain cwnd gain.
+     * @return returns congestion window based on max bandwidth and min RTT.
      */
     uint32_t InFlight(Ptr<TcpSocketState> tcb, double gain);
 
     /**
-     * \brief Initializes the full pipe estimator.
+     * @brief Initializes the full pipe estimator.
      */
     void InitFullPipe();
 
     /**
-     * \brief Initializes the pacing rate.
-     * \param tcb  the socket state.
+     * @brief Initializes the pacing rate.
+     * @param tcb  the socket state.
      */
     void InitPacingRate(Ptr<TcpSocketState> tcb);
 
     /**
-     * \brief Initializes the round counting related variables.
+     * @brief Initializes the round counting related variables.
      */
     void InitRoundCounting();
 
     /**
-     * \brief Checks whether to move to next value of pacing gain while in BBR_PROBE_BW.
-     * \param tcb the socket state.
-     * \param rs  rate sample.
-     * \returns true if want to move to next value otherwise false.
+     * @brief Checks whether to move to next value of pacing gain while in BBR_PROBE_BW.
+     * @param tcb the socket state.
+     * @param rs  rate sample.
+     * @returns true if want to move to next value otherwise false.
      */
     bool IsNextCyclePhase(Ptr<TcpSocketState> tcb, const TcpRateOps::TcpRateSample& rs);
 
     /**
-     * \brief Modulates congestion window in BBR_PROBE_RTT.
-     * \param tcb the socket state.
+     * @brief Modulates congestion window in BBR_PROBE_RTT.
+     * @param tcb the socket state.
      */
     void ModulateCwndForProbeRTT(Ptr<TcpSocketState> tcb);
 
     /**
-     * \brief Modulates congestion window in CA_RECOVERY.
-     * \param tcb the socket state.
-     * \param rs rate sample.
-     * \return true if congestion window is updated in CA_RECOVERY.
+     * @brief Modulates congestion window in CA_RECOVERY.
+     * @param tcb the socket state.
+     * @param rs rate sample.
+     * @return true if congestion window is updated in CA_RECOVERY.
      */
     bool ModulateCwndForRecovery(Ptr<TcpSocketState> tcb, const TcpRateOps::TcpRateSample& rs);
 
     /**
-     * \brief Helper to restore the last-known good congestion window
-     * \param tcb the socket state.
+     * @brief Helper to restore the last-known good congestion window
+     * @param tcb the socket state.
      */
     void RestoreCwnd(Ptr<TcpSocketState> tcb);
 
     /**
-     * \brief Helper to remember the last-known good congestion window or
+     * @brief Helper to remember the last-known good congestion window or
      *        the latest congestion window unmodulated by loss recovery or ProbeRTT.
-     * \param tcb the socket state.
+     * @param tcb the socket state.
      */
     void SaveCwnd(Ptr<const TcpSocketState> tcb);
 
     /**
-     * \brief Updates congestion window based on the network model.
-     * \param tcb the socket state.
-     * \param rs  rate sample
+     * @brief Updates congestion window based on the network model.
+     * @param tcb the socket state.
+     * @param rs  rate sample
      */
     void SetCwnd(Ptr<TcpSocketState> tcb, const TcpRateOps::TcpRateSample& rs);
 
     /**
-     * \brief Updates pacing rate based on network model.
-     * \param tcb the socket state.
-     * \param gain pacing gain.
+     * @brief Updates pacing rate based on network model.
+     * @param tcb the socket state.
+     * @param gain pacing gain.
      */
     void SetPacingRate(Ptr<TcpSocketState> tcb, double gain);
 
     /**
-     * \brief Updates send quantum based on the network model.
-     * \param tcb the socket state.
+     * @brief Updates send quantum based on the network model.
+     * @param tcb the socket state.
      */
     void SetSendQuantum(Ptr<TcpSocketState> tcb);
 
     /**
-     * \brief Updates maximum bottleneck.
-     * \param tcb the socket state.
-     * \param rs rate sample.
+     * @brief Updates maximum bottleneck.
+     * @param tcb the socket state.
+     * @param rs rate sample.
      */
     void UpdateBottleneckBandwidth(Ptr<TcpSocketState> tcb, const TcpRateOps::TcpRateSample& rs);
 
     /**
-     * \brief Updates control parameters congestion windowm, pacing rate, send quantum.
-     * \param tcb the socket state.
-     * \param rs rate sample.
+     * @brief Updates control parameters congestion windowm, pacing rate, send quantum.
+     * @param tcb the socket state.
+     * @param rs rate sample.
      */
     void UpdateControlParameters(Ptr<TcpSocketState> tcb, const TcpRateOps::TcpRateSample& rs);
 
     /**
-     * \brief Updates BBR network model (Maximum bandwidth and minimum RTT).
-     * \param tcb the socket state.
-     * \param rs rate sample.
+     * @brief Updates BBR network model (Maximum bandwidth and minimum RTT).
+     * @param tcb the socket state.
+     * @param rs rate sample.
      */
     void UpdateModelAndState(Ptr<TcpSocketState> tcb, const TcpRateOps::TcpRateSample& rs);
 
     /**
-     * \brief Updates round counting related variables.
-     * \param tcb the socket state.
-     * \param rs rate sample.
+     * @brief Updates round counting related variables.
+     * @param tcb the socket state.
+     * @param rs rate sample.
      */
     void UpdateRound(Ptr<TcpSocketState> tcb, const TcpRateOps::TcpRateSample& rs);
 
     /**
-     * \brief Updates minimum RTT.
-     * \param tcb the socket state.
+     * @brief Updates minimum RTT.
+     * @param tcb the socket state.
      */
     void UpdateRTprop(Ptr<TcpSocketState> tcb);
 
     /**
-     * \brief Updates target congestion window.
-     * \param tcb the socket state.
+     * @brief Updates target congestion window.
+     * @param tcb the socket state.
      */
     void UpdateTargetCwnd(Ptr<TcpSocketState> tcb);
 
     /**
-     * \brief Sets BBR state.
-     * \param state BBR state.
+     * @brief Sets BBR state.
+     * @param state BBR state.
      */
     void SetBbrState(BbrMode_t state);
 
     /**
-     * \brief Find Cwnd increment based on ack aggregation.
-     * \return uint32_t aggregate cwnd.
+     * @brief Find Cwnd increment based on ack aggregation.
+     * @return uint32_t aggregate cwnd.
      */
     uint32_t AckAggregationCwnd();
 
     /**
-     * \brief Estimates max degree of aggregation.
-     * \param tcb the socket state.
-     * \param rs rate sample.
+     * @brief Estimates max degree of aggregation.
+     * @param tcb the socket state.
+     * @param rs rate sample.
      */
     void UpdateAckAggregation(Ptr<TcpSocketState> tcb, const TcpRateOps::TcpRateSample& rs);
 
@@ -352,13 +352,13 @@
     uint32_t m_nextRoundDelivered{0};           //!< Denotes the end of a packet-timed round trip
     Time m_probeRttDuration{MilliSeconds(200)}; //!< A constant specifying the minimum duration for
                                                 //!< which ProbeRTT state, default 200 millisecs
-    Time m_probeRtPropStamp{
-        Seconds(0)}; //!< The wall clock time at which the current BBR.RTProp sample was obtained.
-    Time m_probeRttDoneStamp{Seconds(0)}; //!< Time to exit from BBR_PROBE_RTT state
-    bool m_probeRttRoundDone{false};      //!< True when it is time to exit BBR_PROBE_RTT
-    bool m_packetConservation{false};     //!< Enable/Disable packet conservation mode
-    uint32_t m_priorCwnd{0};              //!< The last-known good congestion window
-    bool m_idleRestart{false};            //!< When restarting from idle, set it true
+    Time m_probeRtPropStamp;  //!< The wall clock time at which the current BBR.RTProp sample was
+                              //!< obtained.
+    Time m_probeRttDoneStamp; //!< Time to exit from BBR_PROBE_RTT state
+    bool m_probeRttRoundDone{false};  //!< True when it is time to exit BBR_PROBE_RTT
+    bool m_packetConservation{false}; //!< Enable/Disable packet conservation mode
+    uint32_t m_priorCwnd{0};          //!< The last-known good congestion window
+    bool m_idleRestart{false};        //!< When restarting from idle, set it true
     uint32_t m_targetCWnd{0}; //!< Target value for congestion window, adapted to the estimated BDP
     DataRate m_fullBandwidth{0};      //!< Value of full bandwidth recorded
     uint32_t m_fullBandwidthCount{0}; //!< Count of full bandwidth recorded consistently
@@ -366,14 +366,13 @@
         Time::Max()}; //!< Estimated two-way round-trip propagation delay of the path, estimated
                       //!< from the windowed minimum recent round-trip delay sample.
     uint32_t m_sendQuantum{
-        0}; //!< The maximum size of a data aggregate scheduled and transmitted together
-    Time m_cycleStamp{Seconds(0)};       //!< Last time gain cycle updated
+        0};            //!< The maximum size of a data aggregate scheduled and transmitted together
+    Time m_cycleStamp; //!< Last time gain cycle updated
     uint32_t m_cycleIndex{0};            //!< Current index of gain cycle
     bool m_minRttExpired{false};         //!< A boolean recording whether the BBR.RTprop has expired
     Time m_minRttFilterLen{Seconds(10)}; //!< A constant specifying the length of the RTProp min
                                          //!< filter window, default 10 secs.
-    Time m_minRttStamp{
-        Seconds(0)}; //!< The wall clock time at which the current BBR.RTProp sample was obtained
+    Time m_minRttStamp; //!< The wall clock time at which the current BBR.RTProp sample was obtained
     bool m_isInitialized{false}; //!< Set to true after first time initialization variables
     Ptr<UniformRandomVariable> m_uv{nullptr}; //!< Uniform Random Variable
     uint64_t m_delivered{0}; //!< The total amount of data in bytes delivered so far
@@ -385,10 +384,10 @@
     uint32_t m_extraAckedWinRttLength{5}; //!< Window length of extra acked window
     uint32_t m_ackEpochAckedResetThresh{
         1 << 17}; //!< Max allowed val for m_ackEpochAcked, after which sampling epoch is reset
-    uint32_t m_extraAckedIdx{0};     //!< Current index in extra acked array
-    Time m_ackEpochTime{Seconds(0)}; //!< Starting of ACK sampling epoch time
-    uint32_t m_ackEpochAcked{0};     //!< Bytes ACked in sampling epoch
-    bool m_hasSeenRtt{false};        //!< Have we seen RTT sample yet?
+    uint32_t m_extraAckedIdx{0}; //!< Current index in extra acked array
+    Time m_ackEpochTime;         //!< Starting of ACK sampling epoch time
+    uint32_t m_ackEpochAcked{0}; //!< Bytes ACked in sampling epoch
+    bool m_hasSeenRtt{false};    //!< Have we seen RTT sample yet?
     double m_pacingMargin{0.01}; //!< BBR intentionally reduces the pacing rate by 1% to drain any
                                  //!< standing queues. See `bbr_rate_bytes_per_sec` in Linux.
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/tcp-bic.h ns-3.44/src/internet/model/tcp-bic.h
--- ns-3.43/src/internet/model/tcp-bic.h	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/tcp-bic.h	2025-03-09 16:55:49.407371300 -0700
@@ -18,9 +18,9 @@
 {
 
 /**
- * \ingroup congestionOps
+ * @ingroup congestionOps
  *
- * \brief BIC congestion control algorithm
+ * @brief BIC congestion control algorithm
  *
  * In TCP Bic the congestion control problem is viewed as a search
  * problem. Taking as a starting point the current window value
@@ -71,19 +71,19 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Constructor
+     * @brief Constructor
      */
     TcpBic();
 
     /**
      * Copy constructor.
-     * \param sock The socket to copy from.
+     * @param sock The socket to copy from.
      */
     TcpBic(const TcpBic& sock);
 
@@ -95,21 +95,21 @@
 
   protected:
     /**
-     * \brief Bic window update after a new ack received
-     * \param tcb the socket state.
-     * \returns The number of segments acked since the last cwnd increment.
+     * @brief Bic window update after a new ack received
+     * @param tcb the socket state.
+     * @returns The number of segments acked since the last cwnd increment.
      */
     virtual uint32_t Update(Ptr<TcpSocketState> tcb);
 
   private:
     /**
-     * \brief TcpBicIncrementTest friend class (for tests).
-     * \relates TcpBicIncrementTest
+     * @brief TcpBicIncrementTest friend class (for tests).
+     * @relates TcpBicIncrementTest
      */
     friend class ::TcpBicIncrementTest;
     /**
-     * \brief TcpBicDecrementTest friend class (for tests).
-     * \relates TcpBicDecrementTest
+     * @brief TcpBicDecrementTest friend class (for tests).
+     * @relates TcpBicDecrementTest
      */
     friend class ::TcpBicDecrementTest;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/tcp-congestion-ops.cc ns-3.44/src/internet/model/tcp-congestion-ops.cc
--- ns-3.43/src/internet/model/tcp-congestion-ops.cc	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/tcp-congestion-ops.cc	2025-03-09 16:55:49.407371300 -0700
@@ -107,7 +107,7 @@
 }
 
 /**
- * \brief Tcp NewReno slow start algorithm
+ * @brief Tcp NewReno slow start algorithm
  *
  * Defined in RFC 5681 as
  *
@@ -144,9 +144,9 @@
  * than a segment size, but we keep count of how many segments we have ignored,
  * and return them.
  *
- * \param tcb internal congestion state
- * \param segmentsAcked count of segments acked
- * \return the number of segments not considered for increasing the cWnd
+ * @param tcb internal congestion state
+ * @param segmentsAcked count of segments acked
+ * @return the number of segments not considered for increasing the cWnd
  */
 uint32_t
 TcpNewReno::SlowStart(Ptr<TcpSocketState> tcb, uint32_t segmentsAcked)
@@ -165,13 +165,13 @@
 }
 
 /**
- * \brief NewReno congestion avoidance
+ * @brief NewReno congestion avoidance
  *
  * During congestion avoidance, cwnd is incremented by roughly 1 full-sized
  * segment per round-trip time (RTT).
  *
- * \param tcb internal congestion state
- * \param segmentsAcked count of segments acked
+ * @param tcb internal congestion state
+ * @param segmentsAcked count of segments acked
  */
 void
 TcpNewReno::CongestionAvoidance(Ptr<TcpSocketState> tcb, uint32_t segmentsAcked)
@@ -190,13 +190,13 @@
 }
 
 /**
- * \brief Try to increase the cWnd following the NewReno specification
+ * @brief Try to increase the cWnd following the NewReno specification
  *
- * \see SlowStart
- * \see CongestionAvoidance
+ * @see SlowStart
+ * @see CongestionAvoidance
  *
- * \param tcb internal congestion state
- * \param segmentsAcked count of segments acked
+ * @param tcb internal congestion state
+ * @param segmentsAcked count of segments acked
  */
 void
 TcpNewReno::IncreaseWindow(Ptr<TcpSocketState> tcb, uint32_t segmentsAcked)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/tcp-congestion-ops.h ns-3.44/src/internet/model/tcp-congestion-ops.h
--- ns-3.43/src/internet/model/tcp-congestion-ops.h	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/tcp-congestion-ops.h	2025-03-09 16:55:49.407371300 -0700
@@ -14,16 +14,16 @@
 {
 
 /**
- * \ingroup tcp
- * \defgroup congestionOps Congestion Control Algorithms.
+ * @ingroup tcp
+ * @defgroup congestionOps Congestion Control Algorithms.
  *
  * The various congestion control algorithms, also known as "TCP flavors".
  */
 
 /**
- * \ingroup congestionOps
+ * @ingroup congestionOps
  *
- * \brief Congestion control abstract class
+ * @brief Congestion control abstract class
  *
  * The design is inspired by what Linux v4.0 does (but it has been
  * in place for years). The congestion control is split from the main
@@ -34,46 +34,46 @@
  * Only three methods have been implemented right now; however, Linux has many others,
  * which can be added later in ns-3.
  *
- * \see IncreaseWindow
- * \see PktsAcked
+ * @see IncreaseWindow
+ * @see PktsAcked
  */
 class TcpCongestionOps : public Object
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     TcpCongestionOps();
 
     /**
-     * \brief Copy constructor.
-     * \param other object to copy.
+     * @brief Copy constructor.
+     * @param other object to copy.
      */
     TcpCongestionOps(const TcpCongestionOps& other);
 
     ~TcpCongestionOps() override;
 
     /**
-     * \brief Get the name of the congestion control algorithm
+     * @brief Get the name of the congestion control algorithm
      *
-     * \return A string identifying the name
+     * @return A string identifying the name
      */
     virtual std::string GetName() const = 0;
 
     /**
-     * \brief Set configuration required by congestion control algorithm
+     * @brief Set configuration required by congestion control algorithm
      *
-     * \param tcb internal congestion state
+     * @param tcb internal congestion state
      */
     virtual void Init(Ptr<TcpSocketState> tcb [[maybe_unused]])
     {
     }
 
     /**
-     * \brief Get the slow start threshold after a loss event
+     * @brief Get the slow start threshold after a loss event
      *
      * Is guaranteed that the congestion control state (\p TcpAckState_t) is
      * changed BEFORE the invocation of this method.
@@ -82,73 +82,73 @@
      * instantly recover from a loss event (e.g. when there is a network with an high
      * reordering factor).
      *
-     * \param tcb internal congestion state
-     * \param bytesInFlight total bytes in flight
-     * \return Slow start threshold
+     * @param tcb internal congestion state
+     * @param bytesInFlight total bytes in flight
+     * @return Slow start threshold
      */
     virtual uint32_t GetSsThresh(Ptr<const TcpSocketState> tcb, uint32_t bytesInFlight) = 0;
 
     /**
-     * \brief Congestion avoidance algorithm implementation
+     * @brief Congestion avoidance algorithm implementation
      *
      * Mimic the function \pname{cong_avoid} in Linux. New segments have been ACKed,
      * and the congestion control duty is to update the window.
      *
      * The function is allowed to change directly cWnd and/or ssThresh.
      *
-     * \param tcb internal congestion state
-     * \param segmentsAcked count of segments acked
+     * @param tcb internal congestion state
+     * @param segmentsAcked count of segments acked
      */
     virtual void IncreaseWindow(Ptr<TcpSocketState> tcb, uint32_t segmentsAcked);
 
     /**
-     * \brief Timing information on received ACK
+     * @brief Timing information on received ACK
      *
      * The function is called every time an ACK is received (only one time
      * also for cumulative ACKs) and contains timing information. It is
      * optional (congestion controls need not implement it) and the default
      * implementation does nothing.
      *
-     * \param tcb internal congestion state
-     * \param segmentsAcked count of segments acked
-     * \param rtt last rtt
+     * @param tcb internal congestion state
+     * @param segmentsAcked count of segments acked
+     * @param rtt last rtt
      */
     virtual void PktsAcked(Ptr<TcpSocketState> tcb, uint32_t segmentsAcked, const Time& rtt);
 
     /**
-     * \brief Trigger events/calculations specific to a congestion state
+     * @brief Trigger events/calculations specific to a congestion state
      *
      * This function mimics the notification function \pname{set_state} in Linux.
      * The function does not change the congestion state in the tcb; it notifies
      * the congestion control algorithm that this state is about to be changed.
      * The tcb->m_congState variable must be separately set; for example:
      *
-     * \code
+     * @code
      *   m_congestionControl->CongestionStateSet (m_tcb, TcpSocketState::CA_RECOVERY);
      *   m_tcb->m_congState = TcpSocketState::CA_RECOVERY;
-     * \endcode
+     * @endcode
      *
-     * \param tcb internal congestion state
-     * \param newState new congestion state to which the TCP is going to switch
+     * @param tcb internal congestion state
+     * @param newState new congestion state to which the TCP is going to switch
      */
     virtual void CongestionStateSet(Ptr<TcpSocketState> tcb,
                                     const TcpSocketState::TcpCongState_t newState);
 
     /**
-     * \brief Trigger events/calculations on occurrence of congestion window event
+     * @brief Trigger events/calculations on occurrence of congestion window event
      *
      * This function mimics the function \pname{cwnd_event} in Linux.
      * The function is called in case of congestion window events.
      *
-     * \param tcb internal congestion state
-     * \param event the event which triggered this function
+     * @param tcb internal congestion state
+     * @param event the event which triggered this function
      */
     virtual void CwndEvent(Ptr<TcpSocketState> tcb, const TcpSocketState::TcpCAEvent_t event);
 
     /**
-     * \brief Returns true when Congestion Control Algorithm implements CongControl
+     * @brief Returns true when Congestion Control Algorithm implements CongControl
      *
-     * \return true if CC implements CongControl function
+     * @return true if CC implements CongControl function
      *
      * This function is the equivalent in C++ of the C checks that are used
      * in the Linux kernel to see if an optional function has been defined.
@@ -160,14 +160,14 @@
     virtual bool HasCongControl() const;
 
     /**
-     * \brief Called when packets are delivered to update cwnd and pacing rate
+     * @brief Called when packets are delivered to update cwnd and pacing rate
      *
      * This function mimics the function cong_control in Linux. It is allowed to
      * change directly cWnd and pacing rate.
      *
-     * \param tcb internal congestion state
-     * \param rc Rate information for the connection
-     * \param rs Rate sample (over a period of time) information
+     * @param tcb internal congestion state
+     * @param rc Rate information for the connection
+     * @param rs Rate sample (over a period of time) information
      */
     virtual void CongControl(Ptr<TcpSocketState> tcb,
                              const TcpRateOps::TcpRateConnection& rc,
@@ -182,35 +182,35 @@
     //     void (*pkts_acked)(struct sock *sk, u32 ext, int *attr, union tcp_cc_info *info);
 
     /**
-     * \brief Copy the congestion control algorithm across sockets
+     * @brief Copy the congestion control algorithm across sockets
      *
-     * \return a pointer of the copied object
+     * @return a pointer of the copied object
      */
     virtual Ptr<TcpCongestionOps> Fork() = 0;
 };
 
 /**
- * \brief The NewReno implementation
+ * @brief The NewReno implementation
  *
  * New Reno introduces partial ACKs inside the well-established Reno algorithm.
  * This and other modifications are described in RFC 6582.
  *
- * \see IncreaseWindow
+ * @see IncreaseWindow
  */
 class TcpNewReno : public TcpCongestionOps
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     TcpNewReno();
 
     /**
-     * \brief Copy constructor.
-     * \param sock object to copy.
+     * @brief Copy constructor.
+     * @param sock object to copy.
      */
     TcpNewReno(const TcpNewReno& sock);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/tcp-cubic.h ns-3.44/src/internet/model/tcp-cubic.h
--- ns-3.43/src/internet/model/tcp-cubic.h	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/tcp-cubic.h	2025-03-09 16:55:49.407371300 -0700
@@ -15,7 +15,7 @@
 {
 
 /**
- * \brief The Cubic Congestion Control Algorithm
+ * @brief The Cubic Congestion Control Algorithm
  *
  * TCP Cubic is a protocol that enhances the fairness property
  * of Bic while retaining its scalability and stability. The main feature is
@@ -59,7 +59,7 @@
 {
   public:
     /**
-     * \brief Values to detect the Slow Start mode of HyStart
+     * @brief Values to detect the Slow Start mode of HyStart
      */
     enum HybridSSDetectionMode
     {
@@ -69,8 +69,8 @@
     };
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -78,7 +78,7 @@
 
     /**
      * Copy constructor
-     * \param sock Socket to copy
+     * @param sock Socket to copy
      */
     TcpCubic(const TcpCubic& sock);
 
@@ -130,41 +130,41 @@
 
   private:
     /**
-     * \brief Reset HyStart parameters
-     * \param tcb Transmission Control Block of the connection
+     * @brief Reset HyStart parameters
+     * @param tcb Transmission Control Block of the connection
      */
     void HystartReset(Ptr<const TcpSocketState> tcb);
 
     /**
-     * \brief Reset Cubic parameters
-     * \param tcb Transmission Control Block of the connection
+     * @brief Reset Cubic parameters
+     * @param tcb Transmission Control Block of the connection
      */
     void CubicReset(Ptr<const TcpSocketState> tcb);
 
     /**
-     * \brief Cubic window update after a new ack received
-     * \param tcb Transmission Control Block of the connection
-     * \param segmentsAcked Segments acked
-     * \returns the congestion window update counter
+     * @brief Cubic window update after a new ack received
+     * @param tcb Transmission Control Block of the connection
+     * @param segmentsAcked Segments acked
+     * @returns the congestion window update counter
      */
     uint32_t Update(Ptr<TcpSocketState> tcb, uint32_t segmentsAcked);
 
     /**
-     * \brief Update HyStart parameters
+     * @brief Update HyStart parameters
      *
-     * \param tcb Transmission Control Block of the connection
-     * \param delay Delay for HyStart algorithm
+     * @param tcb Transmission Control Block of the connection
+     * @param delay Delay for HyStart algorithm
      */
     void HystartUpdate(Ptr<TcpSocketState> tcb, const Time& delay);
 
     /**
-     * \brief Clamp time value in a range
+     * @brief Clamp time value in a range
      *
      * The returned value is t, clamped in a range specified
      * by attributes (HystartDelayMin < t < HystartDelayMax)
      *
-     * \param t Time value to clamp
-     * \return t itself if it is in range, otherwise the min or max
+     * @param t Time value to clamp
+     * @return t itself if it is in range, otherwise the min or max
      * value
      */
     Time HystartDelayThresh(const Time& t) const;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/tcp-dctcp.h ns-3.44/src/internet/model/tcp-dctcp.h
--- ns-3.43/src/internet/model/tcp-dctcp.h	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/tcp-dctcp.h	2025-03-09 16:55:49.407371300 -0700
@@ -19,9 +19,9 @@
 {
 
 /**
- * \ingroup tcp
+ * @ingroup tcp
  *
- * \brief An implementation of DCTCP. This model implements all of the
+ * @brief An implementation of DCTCP. This model implements all of the
  * endpoint capabilities mentioned in the DCTCP SIGCOMM paper.  Note that
  * this model presently will not do any fallback to RFC 5681 congestion
  * avoidance as specified in RFC 8257 Section 3.5, so it should only be
@@ -32,8 +32,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -43,13 +43,13 @@
     TcpDctcp();
 
     /**
-     * \brief Copy constructor
-     * \param sock the object to copy
+     * @brief Copy constructor
+     * @param sock the object to copy
      */
     TcpDctcp(const TcpDctcp& sock);
 
     /**
-     * \brief Destructor
+     * @brief Destructor
      */
     ~TcpDctcp() override;
 
@@ -57,21 +57,21 @@
     std::string GetName() const override;
 
     /**
-     * \brief Set configuration required by congestion control algorithm,
+     * @brief Set configuration required by congestion control algorithm,
      *        This method will force DctcpEcn mode and will force usage of
      *        either ECT(0) or ECT(1) (depending on the 'UseEct0' attribute),
      *        despite any other configuration in the base classes.
      *
-     * \param tcb internal congestion state
+     * @param tcb internal congestion state
      */
     void Init(Ptr<TcpSocketState> tcb) override;
 
     /**
      * TracedCallback signature for DCTCP update of congestion state
      *
-     * \param [in] bytesAcked Bytes acked in this observation window
-     * \param [in] bytesMarked Bytes marked in this observation window
-     * \param [in] alpha New alpha (congestion estimate) value
+     * @param [in] bytesAcked Bytes acked in this observation window
+     * @param [in] bytesMarked Bytes marked in this observation window
+     * @param [in] alpha New alpha (congestion estimate) value
      */
     typedef void (*CongestionEstimateTracedCallback)(uint32_t bytesAcked,
                                                      uint32_t bytesMarked,
@@ -85,38 +85,38 @@
 
   private:
     /**
-     * \brief Changes state of m_ceState to true
+     * @brief Changes state of m_ceState to true
      *
-     * \param tcb internal congestion state
+     * @param tcb internal congestion state
      */
     void CeState0to1(Ptr<TcpSocketState> tcb);
 
     /**
-     * \brief Changes state of m_ceState to false
+     * @brief Changes state of m_ceState to false
      *
-     * \param tcb internal congestion state
+     * @param tcb internal congestion state
      */
     void CeState1to0(Ptr<TcpSocketState> tcb);
 
     /**
-     * \brief Updates the value of m_delayedAckReserved
+     * @brief Updates the value of m_delayedAckReserved
      *
-     * \param tcb internal congestion state
-     * \param event the congestion window event
+     * @param tcb internal congestion state
+     * @param event the congestion window event
      */
     void UpdateAckReserved(Ptr<TcpSocketState> tcb, const TcpSocketState::TcpCAEvent_t event);
 
     /**
-     * \brief Resets the value of m_ackedBytesEcn, m_ackedBytesTotal and m_nextSeq
+     * @brief Resets the value of m_ackedBytesEcn, m_ackedBytesTotal and m_nextSeq
      *
-     * \param tcb internal congestion state
+     * @param tcb internal congestion state
      */
     void Reset(Ptr<TcpSocketState> tcb);
 
     /**
-     * \brief Initialize the value of m_alpha
+     * @brief Initialize the value of m_alpha
      *
-     * \param alpha DCTCP alpha parameter
+     * @param alpha DCTCP alpha parameter
      */
     void InitializeDctcpAlpha(double alpha);
 
@@ -134,7 +134,7 @@
     bool m_useEct0;            //!< Use ECT(0) for ECN codepoint
     bool m_initialized;        //!< Whether DCTCP has been initialized
     /**
-     * \brief Callback pointer for congestion state update
+     * @brief Callback pointer for congestion state update
      */
     TracedCallback<uint32_t, uint32_t, double> m_traceCongestionEstimate;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/tcp-header.h ns-3.44/src/internet/model/tcp-header.h
--- ns-3.43/src/internet/model/tcp-header.h	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/tcp-header.h	2025-03-09 16:55:49.407371300 -0700
@@ -24,8 +24,8 @@
 {
 
 /**
- * \ingroup tcp
- * \brief Header for the Transmission Control Protocol
+ * @ingroup tcp
+ * @brief Header for the Transmission Control Protocol
  *
  * This class has fields corresponding to those in a network TCP header
  * (port numbers, sequence and acknowledgement numbers, flags, etc) as well
@@ -38,19 +38,19 @@
     typedef std::list<Ptr<const TcpOption>> TcpOptionList; //!< List of TcpOption
 
     /**
-     * \brief Print a TCP header into an output stream
+     * @brief Print a TCP header into an output stream
      *
-     * \param os output stream
-     * \param tc TCP header to print
-     * \return The ostream passed as first argument
+     * @param os output stream
+     * @param tc TCP header to print
+     * @return The ostream passed as first argument
      */
     friend std::ostream& operator<<(std::ostream& os, const TcpHeader& tc);
 
     /**
-     * \brief Converts an integer into a human readable list of Tcp flags
+     * @brief Converts an integer into a human readable list of Tcp flags
      *
-     * \param flags Bitfield of TCP flags to convert to a readable string
-     * \param delimiter String to insert between flags
+     * @param flags Bitfield of TCP flags to convert to a readable string
+     * @param delimiter String to insert between flags
      *
      * FIN=0x1, SYN=0x2, RST=0x4, PSH=0x8, ACK=0x10, URG=0x20, ECE=0x40, CWR=0x80
      * TcpHeader::FlagsToString (0x1) should return the following string;
@@ -59,165 +59,165 @@
      * TcpHeader::FlagsToString (0xff) should return the following string;
      *     "FIN|SYN|RST|PSH|ACK|URG|ECE|CWR";
      *
-     * \return the generated string
+     * @return the generated string
      **/
     static std::string FlagsToString(uint8_t flags, const std::string& delimiter = "|");
 
     /**
-     * \brief Enable checksum calculation for TCP
+     * @brief Enable checksum calculation for TCP
      *
-     * \todo currently has no effect
+     * @todo currently has no effect
      */
     void EnableChecksums();
 
     // Setters
 
     /**
-     * \brief Set the source port
-     * \param port The source port for this TcpHeader
+     * @brief Set the source port
+     * @param port The source port for this TcpHeader
      */
     void SetSourcePort(uint16_t port);
 
     /**
-     * \brief Set the destination port
-     * \param port the destination port for this TcpHeader
+     * @brief Set the destination port
+     * @param port the destination port for this TcpHeader
      */
     void SetDestinationPort(uint16_t port);
 
     /**
-     * \brief Set the sequence Number
-     * \param sequenceNumber the sequence number for this TcpHeader
+     * @brief Set the sequence Number
+     * @param sequenceNumber the sequence number for this TcpHeader
      */
     void SetSequenceNumber(SequenceNumber32 sequenceNumber);
 
     /**
-     * \brief Set the ACK number
-     * \param ackNumber the ACK number for this TcpHeader
+     * @brief Set the ACK number
+     * @param ackNumber the ACK number for this TcpHeader
      */
     void SetAckNumber(SequenceNumber32 ackNumber);
 
     /**
-     * \brief Set flags of the header
-     * \param flags the flags for this TcpHeader
+     * @brief Set flags of the header
+     * @param flags the flags for this TcpHeader
      */
     void SetFlags(uint8_t flags);
 
     /**
-     * \brief Set the window size
-     * \param windowSize the window size for this TcpHeader
+     * @brief Set the window size
+     * @param windowSize the window size for this TcpHeader
      */
     void SetWindowSize(uint16_t windowSize);
 
     /**
-     * \brief Set the urgent pointer
-     * \param urgentPointer the urgent pointer for this TcpHeader
+     * @brief Set the urgent pointer
+     * @param urgentPointer the urgent pointer for this TcpHeader
      */
     void SetUrgentPointer(uint16_t urgentPointer);
 
     // Getters
 
     /**
-     * \brief Get the source port
-     * \return The source port for this TcpHeader
+     * @brief Get the source port
+     * @return The source port for this TcpHeader
      */
     uint16_t GetSourcePort() const;
 
     /**
-     * \brief Get the destination port
-     * \return the destination port for this TcpHeader
+     * @brief Get the destination port
+     * @return the destination port for this TcpHeader
      */
     uint16_t GetDestinationPort() const;
 
     /**
-     * \brief Get the sequence number
-     * \return the sequence number for this TcpHeader
+     * @brief Get the sequence number
+     * @return the sequence number for this TcpHeader
      */
     SequenceNumber32 GetSequenceNumber() const;
 
     /**
-     * \brief Get the ACK number
-     * \return the ACK number for this TcpHeader
+     * @brief Get the ACK number
+     * @return the ACK number for this TcpHeader
      */
     SequenceNumber32 GetAckNumber() const;
 
     /**
-     * \brief Get the length in words
+     * @brief Get the length in words
      *
      * A word is 4 bytes; without Tcp Options, header is 5 words (20 bytes).
      * With options, it can reach up to 15 words (60 bytes).
      *
-     * \return the length of this TcpHeader
+     * @return the length of this TcpHeader
      */
     uint8_t GetLength() const;
 
     /**
-     * \brief Get the flags
-     * \return the flags for this TcpHeader
+     * @brief Get the flags
+     * @return the flags for this TcpHeader
      */
     uint8_t GetFlags() const;
 
     /**
-     * \brief Get the window size
-     * \return the window size for this TcpHeader
+     * @brief Get the window size
+     * @return the window size for this TcpHeader
      */
     uint16_t GetWindowSize() const;
 
     /**
-     * \brief Get the urgent pointer
-     * \return the urgent pointer for this TcpHeader
+     * @brief Get the urgent pointer
+     * @return the urgent pointer for this TcpHeader
      */
     uint16_t GetUrgentPointer() const;
 
     /**
-     * \brief Get the option specified
-     * \param kind the option to retrieve
-     * \return Whether the header contains a specific kind of option, or 0
+     * @brief Get the option specified
+     * @param kind the option to retrieve
+     * @return Whether the header contains a specific kind of option, or 0
      */
     Ptr<const TcpOption> GetOption(uint8_t kind) const;
 
     /**
-     * \brief Get the list of option in this header
-     * \return a const reference to the option list
+     * @brief Get the list of option in this header
+     * @return a const reference to the option list
      */
     const TcpOptionList& GetOptionList() const;
 
     /**
-     * \brief Get the total length of appended options
-     * \return the total length of options appended to this TcpHeader
+     * @brief Get the total length of appended options
+     * @return the total length of options appended to this TcpHeader
      */
     uint8_t GetOptionLength() const;
 
     /**
-     * \brief Get maximum option length
-     * \return the maximum option length
+     * @brief Get maximum option length
+     * @return the maximum option length
      */
     uint8_t GetMaxOptionLength() const;
 
     /**
-     * \brief Check if the header has the option specified
-     * \param kind Option to check for
-     * \return true if the header has the option, false otherwise
+     * @brief Check if the header has the option specified
+     * @param kind Option to check for
+     * @return true if the header has the option, false otherwise
      */
     bool HasOption(uint8_t kind) const;
 
     /**
-     * \brief Append an option to the TCP header
-     * \param option The option to append
-     * \return true if option has been appended, false otherwise
+     * @brief Append an option to the TCP header
+     * @param option The option to append
+     * @return true if option has been appended, false otherwise
      */
     bool AppendOption(Ptr<const TcpOption> option);
 
     /**
-     * \brief Initialize the TCP checksum.
+     * @brief Initialize the TCP checksum.
      *
      * If you want to use tcp checksums, you should call this
      * method prior to adding the header to a packet.
      *
-     * \param source the IP source to use in the underlying
+     * @param source the IP source to use in the underlying
      *        IP packet.
-     * \param destination the IP destination to use in the
+     * @param destination the IP destination to use in the
      *        underlying IP packet.
-     * \param protocol the protocol number to use in the underlying
+     * @param protocol the protocol number to use in the underlying
      *        IP packet.
      *
      */
@@ -226,16 +226,16 @@
                             uint8_t protocol);
 
     /**
-     * \brief Initialize the TCP checksum.
+     * @brief Initialize the TCP checksum.
      *
      * If you want to use tcp checksums, you should call this
      * method prior to adding the header to a packet.
      *
-     * \param source the IP source to use in the underlying
+     * @param source the IP source to use in the underlying
      *        IP packet.
-     * \param destination the IP destination to use in the
+     * @param destination the IP destination to use in the
      *        underlying IP packet.
-     * \param protocol the protocol number to use in the underlying
+     * @param protocol the protocol number to use in the underlying
      *        IP packet.
      *
      */
@@ -244,23 +244,23 @@
                             uint8_t protocol);
 
     /**
-     * \brief Initialize the TCP checksum.
+     * @brief Initialize the TCP checksum.
      *
      * If you want to use tcp checksums, you should call this
      * method prior to adding the header to a packet.
      *
-     * \param source the IP source to use in the underlying
+     * @param source the IP source to use in the underlying
      *        IP packet.
-     * \param destination the IP destination to use in the
+     * @param destination the IP destination to use in the
      *        underlying IP packet.
-     * \param protocol the protocol number to use in the underlying
+     * @param protocol the protocol number to use in the underlying
      *        IP packet.
      *
      */
     void InitializeChecksum(const Address& source, const Address& destination, uint8_t protocol);
 
     /**
-     * \brief TCP flag field values
+     * @brief TCP flag field values
      */
     enum Flags_t
     {
@@ -276,8 +276,8 @@
     };
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -287,34 +287,34 @@
     uint32_t Deserialize(Buffer::Iterator start) override;
 
     /**
-     * \brief Is the TCP checksum correct ?
-     * \returns true if the checksum is correct, false otherwise.
+     * @brief Is the TCP checksum correct ?
+     * @returns true if the checksum is correct, false otherwise.
      */
     bool IsChecksumOk() const;
 
     /**
      * Comparison operator
-     * \param lhs left operand
-     * \param rhs right operand
-     * \return true if the operands are equal
+     * @param lhs left operand
+     * @param rhs right operand
+     * @return true if the operands are equal
      */
     friend bool operator==(const TcpHeader& lhs, const TcpHeader& rhs);
 
   private:
     /**
-     * \brief Calculate the header checksum
-     * \param size packet size
-     * \returns the checksum
+     * @brief Calculate the header checksum
+     * @param size packet size
+     * @returns the checksum
      */
     uint16_t CalculateHeaderChecksum(uint16_t size) const;
 
     /**
-     * \brief Calculates the header length (in words)
+     * @brief Calculates the header length (in words)
      *
      * Given the standard size of the header, the method checks for options
      * and calculates the real length (in words).
      *
-     * \return header length in 4-byte words
+     * @return header length in 4-byte words
      */
     uint8_t CalculateHeaderLength() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/tcp-highspeed.cc ns-3.44/src/internet/model/tcp-highspeed.cc
--- ns-3.43/src/internet/model/tcp-highspeed.cc	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/tcp-highspeed.cc	2025-03-09 16:55:49.407371300 -0700
@@ -53,7 +53,7 @@
 }
 
 /**
- * \brief Congestion avoidance of TcpHighSpeed
+ * @brief Congestion avoidance of TcpHighSpeed
  *
  * As implementation choice, we increment cWnd only by MSS, when the right
  * number of ACK has been received. At this point, the important question is:
@@ -81,8 +81,8 @@
  * acked. More weight, less ACK are necessary to increment cWnd, which is
  * exactly the Highspeed principle.
  *
- * \param tcb internal congestion state
- * \param segmentsAcked count of segments acked
+ * @param tcb internal congestion state
+ * @param segmentsAcked count of segments acked
  */
 void
 TcpHighSpeed::CongestionAvoidance(Ptr<TcpSocketState> tcb, uint32_t segmentsAcked)
@@ -119,12 +119,12 @@
 }
 
 /**
- * \brief Get slow start threshold following HighSpeed principles
+ * @brief Get slow start threshold following HighSpeed principles
  *
- * \param tcb internal congestion state
- * \param bytesInFlight Bytes in flight
+ * @param tcb internal congestion state
+ * @param bytesInFlight Bytes in flight
  *
- * \return the slow start threshold value
+ * @return the slow start threshold value
  */
 uint32_t
 TcpHighSpeed::GetSsThresh(Ptr<const TcpSocketState> tcb, uint32_t bytesInFlight)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/tcp-highspeed.h ns-3.44/src/internet/model/tcp-highspeed.h
--- ns-3.43/src/internet/model/tcp-highspeed.h	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/tcp-highspeed.h	2025-03-09 16:55:49.407371300 -0700
@@ -16,9 +16,9 @@
 class TcpSocketState;
 
 /**
- * \ingroup congestionOps
+ * @ingroup congestionOps
  *
- * \brief An implementation of TCP HighSpeed
+ * @brief An implementation of TCP HighSpeed
  *
  * TCP HighSpeed is designed for high-capacity channels or, in general, for
  * TCP connections with large congestion windows.
@@ -39,8 +39,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -50,8 +50,8 @@
     TcpHighSpeed();
 
     /**
-     * \brief Copy constructor
-     * \param sock the object to copy
+     * @brief Copy constructor
+     * @param sock the object to copy
      */
     TcpHighSpeed(const TcpHighSpeed& sock);
     ~TcpHighSpeed() override;
@@ -63,20 +63,20 @@
     Ptr<TcpCongestionOps> Fork() override;
 
     /**
-     * \brief Lookup table for the coefficient a (from RFC 3649)
+     * @brief Lookup table for the coefficient a (from RFC 3649)
      *
-     * \param w Window value (in packets)
+     * @param w Window value (in packets)
      *
-     * \return the coefficient a
+     * @return the coefficient a
      */
     static uint32_t TableLookupA(uint32_t w);
 
     /**
-     * \brief Lookup table for the coefficient b (from RFC 3649)
+     * @brief Lookup table for the coefficient b (from RFC 3649)
      *
-     * \param w Window value (in packets)
+     * @param w Window value (in packets)
      *
-     * \return the coefficient b
+     * @return the coefficient b
      */
     static double TableLookupB(uint32_t w);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/tcp-htcp.h ns-3.44/src/internet/model/tcp-htcp.h
--- ns-3.43/src/internet/model/tcp-htcp.h	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/tcp-htcp.h	2025-03-09 16:55:49.407371300 -0700
@@ -23,9 +23,9 @@
 class TcpSocketState;
 
 /**
- * \ingroup congestionOps
+ * @ingroup congestionOps
  *
- * \brief An implementation of the H-TCP variant of TCP.
+ * @brief An implementation of the H-TCP variant of TCP.
  *
  * This class contains the H-TCP implementation of TCP, according to
  * Internet-Draft draft-leith-tcp-htcp-03 and its related paper,
@@ -39,8 +39,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     /**
@@ -48,8 +48,8 @@
      */
     TcpHtcp();
     /**
-     * \brief Copy constructor
-     * \param sock the object to copy
+     * @brief Copy constructor
+     * @param sock the object to copy
      */
     TcpHtcp(const TcpHtcp& sock);
     ~TcpHtcp() override;
@@ -64,12 +64,12 @@
 
   private:
     /**
-     * \brief Updates the additive increase parameter for H-TCP
+     * @brief Updates the additive increase parameter for H-TCP
      */
     void UpdateAlpha();
 
     /**
-     * \brief Updates the multiplicative decrease factor beta for H-TCP
+     * @brief Updates the multiplicative decrease factor beta for H-TCP
      */
     void UpdateBeta();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/tcp-hybla.h ns-3.44/src/internet/model/tcp-hybla.h
--- ns-3.43/src/internet/model/tcp-hybla.h	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/tcp-hybla.h	2025-03-09 16:55:49.407371300 -0700
@@ -17,9 +17,9 @@
 class TcpSocketState;
 
 /**
- * \ingroup congestionOps
+ * @ingroup congestionOps
  *
- * \brief Implementation of the TCP Hybla algorithm
+ * @brief Implementation of the TCP Hybla algorithm
  *
  * The key idea behind TCP Hybla is to obtain for long RTT connections the same
  * instantaneous transmission rate of a reference TCP connection with lower RTT.
@@ -37,8 +37,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -48,8 +48,8 @@
     TcpHybla();
 
     /**
-     * \brief Copy constructor
-     * \param sock the object to copy
+     * @brief Copy constructor
+     * @param sock the object to copy
      */
     TcpHybla(const TcpHybla& sock);
 
@@ -71,8 +71,8 @@
 
   private:
     /**
-     * \brief Recalculate algorithm parameters
-     * \param tcb the socket state.
+     * @brief Recalculate algorithm parameters
+     * @param tcb the socket state.
      */
     void RecalcParam(const Ptr<TcpSocketState>& tcb);
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/tcp-illinois.h ns-3.44/src/internet/model/tcp-illinois.h
--- ns-3.43/src/internet/model/tcp-illinois.h	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/tcp-illinois.h	2025-03-09 16:55:49.407371300 -0700
@@ -24,9 +24,9 @@
 class TcpSocketState;
 
 /**
- * \ingroup congestionOps
+ * @ingroup congestionOps
  *
- * \brief An implementation of TCP Illinois algorithm
+ * @brief An implementation of TCP Illinois algorithm
  *
  * TCP Illinois is a hybrid congestion control algorithm designed for
  * high-speed networks.  Illinois implements a Concave-AIMD (or C-AIMD)
@@ -98,8 +98,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -109,8 +109,8 @@
     TcpIllinois();
 
     /**
-     * \brief Copy constructor
-     * \param sock the object to copy
+     * @brief Copy constructor
+     * @param sock the object to copy
      */
     TcpIllinois(const TcpIllinois& sock);
     ~TcpIllinois() override;
@@ -118,67 +118,67 @@
     std::string GetName() const override;
 
     /**
-     * \brief Get slow start threshold after congestion event
+     * @brief Get slow start threshold after congestion event
      *
-     * \param tcb internal congestion state
-     * \param bytesInFlight bytes in flight
+     * @param tcb internal congestion state
+     * @param bytesInFlight bytes in flight
      *
-     * \return the slow start threshold value
+     * @return the slow start threshold value
      */
     uint32_t GetSsThresh(Ptr<const TcpSocketState> tcb, uint32_t bytesInFlight) override;
 
     Ptr<TcpCongestionOps> Fork() override;
 
     /**
-     * \brief Reset Illinois parameters to default values upon a loss
+     * @brief Reset Illinois parameters to default values upon a loss
      *
-     * \param tcb internal congestion state
-     * \param newState new congestion state to which the TCP is going to switch
+     * @param tcb internal congestion state
+     * @param newState new congestion state to which the TCP is going to switch
      */
     void CongestionStateSet(Ptr<TcpSocketState> tcb,
                             const TcpSocketState::TcpCongState_t newState) override;
 
     /**
-     * \brief Adjust cwnd following Illinois congestion avoidance algorithm
+     * @brief Adjust cwnd following Illinois congestion avoidance algorithm
      *
-     * \param tcb internal congestion state
-     * \param segmentsAcked count of segments ACKed
+     * @param tcb internal congestion state
+     * @param segmentsAcked count of segments ACKed
      */
     void IncreaseWindow(Ptr<TcpSocketState> tcb, uint32_t segmentsAcked) override;
 
     /**
-     * \brief Measure RTT for each ACK
+     * @brief Measure RTT for each ACK
      * Keep track of min and max RTT
      *
-     * \param tcb internal congestion state
-     * \param segmentsAcked count of segments ACKed
-     * \param rtt last RTT
+     * @param tcb internal congestion state
+     * @param segmentsAcked count of segments ACKed
+     * @param rtt last RTT
      */
     void PktsAcked(Ptr<TcpSocketState> tcb, uint32_t segmentsAcked, const Time& rtt) override;
 
   protected:
   private:
     /**
-     * \brief Recalculate alpha and beta every RTT
+     * @brief Recalculate alpha and beta every RTT
      *
-     * \param cWnd current Cwnd (in bytes)
+     * @param cWnd current Cwnd (in bytes)
      */
     void RecalcParam(uint32_t cWnd);
 
     /**
-     * \brief Calculate additive increase factor alpha
+     * @brief Calculate additive increase factor alpha
      *
      * If average queueing delay is at minimum, then alpha is set to alphaMax.
      * Otherwise, alpha is a decreasing function of average queueing delay.
      *
-     * \param da current average queueing delay
-     * \param dm maximum average queueing delay
+     * @param da current average queueing delay
+     * @param dm maximum average queueing delay
      *
      */
     void CalculateAlpha(double da, double dm);
 
     /**
-     * \brief Calculate multiplicative decrease factor beta
+     * @brief Calculate multiplicative decrease factor beta
      *
      * If the current average queueing delay is <= 10% of max. (average) queueing delay,
      * beta is set to betaMin, which equals to 1/8 by default.
@@ -186,30 +186,30 @@
      * beta is set to betaMax, which equals to 1/2 by default.
      * Otherwise, beta is an increasing function of average queueing delay.
      *
-     * \param da current average queueing delay
-     * \param dm maximum average queueing delay
+     * @param da current average queueing delay
+     * @param dm maximum average queueing delay
      *
      */
     void CalculateBeta(double da, double dm);
 
     /**
-     * \brief Calculate average queueing delay
+     * @brief Calculate average queueing delay
      *
-     * \return average queueing delay da
+     * @return average queueing delay da
      */
     Time CalculateAvgDelay() const;
 
     /**
-     * \brief Calculate maximum queueing delay
+     * @brief Calculate maximum queueing delay
      *
-     * \return maximum average queueing delay dm
+     * @return maximum average queueing delay dm
      */
     Time CalculateMaxDelay() const;
 
     /**
-     * \brief Reset Illinois parameters
+     * @brief Reset Illinois parameters
      *
-     * \param nextTxSequence Next sequence to transmit
+     * @param nextTxSequence Next sequence to transmit
      */
     void Reset(const SequenceNumber32& nextTxSequence);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/tcp-l4-protocol.cc ns-3.44/src/internet/model/tcp-l4-protocol.cc
--- ns-3.43/src/internet/model/tcp-l4-protocol.cc	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/tcp-l4-protocol.cc	2025-03-09 16:55:49.407371300 -0700
@@ -56,9 +56,6 @@
         std::clog << " [node " << m_node->GetId() << "] ";                                         \
     }
 
-/* see http://www.iana.org/assignments/protocol-numbers */
-const uint8_t TcpL4Protocol::PROT_NUMBER = 6;
-
 TypeId
 TcpL4Protocol::GetTypeId()
 {
@@ -587,7 +584,7 @@
     // XXX outgoingHeader cannot be logged
 
     TcpHeader outgoingHeader = outgoing;
-    /** \todo UrgentPointer */
+    /** @todo UrgentPointer */
     /* outgoingHeader.SetUrgentPointer (0); */
     if (Node::ChecksumEnabled())
     {
@@ -646,7 +643,7 @@
                            oif));
     }
     TcpHeader outgoingHeader = outgoing;
-    /** \todo UrgentPointer */
+    /** @todo UrgentPointer */
     /* outgoingHeader.SetUrgentPointer (0); */
     if (Node::ChecksumEnabled())
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/tcp-l4-protocol.h ns-3.44/src/internet/model/tcp-l4-protocol.h
--- ns-3.43/src/internet/model/tcp-l4-protocol.h	2024-10-09 16:41:09.888656000 -0700
+++ ns-3.44/src/internet/model/tcp-l4-protocol.h	2025-03-09 16:55:49.407371300 -0700
@@ -33,8 +33,8 @@
 class NetDevice;
 
 /**
- * \ingroup internet
- * \defgroup tcp TCP
+ * @ingroup internet
+ * @defgroup tcp TCP
  *
  * This is an implementation of various Transmission Control Protocol flavors.
  *
@@ -45,8 +45,8 @@
  */
 
 /**
- * \ingroup tcp
- * \brief TCP socket creation and multiplexing/demultiplexing
+ * @ingroup tcp
+ * @brief TCP socket creation and multiplexing/demultiplexing
  *
  * A single instance of this class is held by one instance of class Node.
  *
@@ -61,20 +61,22 @@
  * and SHOULD checksum packets its receives from the socket layer going down
  * the stack, but currently checksumming is disabled.
  *
- * \see CreateSocket
- * \see NotifyNewAggregate
- * \see SendPacket
+ * @see CreateSocket
+ * @see NotifyNewAggregate
+ * @see SendPacket
  */
 
 class TcpL4Protocol : public IpL4Protocol
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
-    static const uint8_t PROT_NUMBER; //!< protocol number (0x6)
+
+    /// Protocol number (see http://www.iana.org/assignments/protocol-numbers)
+    static constexpr uint8_t PROT_NUMBER = 6;
 
     TcpL4Protocol();
     ~TcpL4Protocol() override;
@@ -85,77 +87,77 @@
 
     /**
      * Set node associated with this stack
-     * \param node the node
+     * @param node the node
      */
     void SetNode(Ptr<Node> node);
 
     // NOTE: API from here should not be removed, only added. Be backward-compatible!
 
     /**
-     * \brief Create a TCP socket using the TypeId set by SocketType attribute
+     * @brief Create a TCP socket using the TypeId set by SocketType attribute
      *
-     * \return A smart Socket pointer to a TcpSocket allocated by this instance
+     * @return A smart Socket pointer to a TcpSocket allocated by this instance
      * of the TCP protocol
      */
     Ptr<Socket> CreateSocket();
 
     /**
-     * \brief Create a TCP socket using the specified congestion control algorithm TypeId
+     * @brief Create a TCP socket using the specified congestion control algorithm TypeId
      *
-     * \return A smart Socket pointer to a TcpSocket allocated by this instance
+     * @return A smart Socket pointer to a TcpSocket allocated by this instance
      * of the TCP protocol
      *
-     * \warning using a congestionTypeId other than TCP is a bad idea.
+     * @warning using a congestionTypeId other than TCP is a bad idea.
      *
-     * \param congestionTypeId the congestion control algorithm TypeId
-     * \param recoveryTypeId the recovery algorithm TypeId
+     * @param congestionTypeId the congestion control algorithm TypeId
+     * @param recoveryTypeId the recovery algorithm TypeId
      */
     Ptr<Socket> CreateSocket(TypeId congestionTypeId, TypeId recoveryTypeId);
 
     /**
-     * \brief Create a TCP socket using the specified congestion control algorithm
-     * \return A smart Socket pointer to a TcpSocket allocated by this instance
+     * @brief Create a TCP socket using the specified congestion control algorithm
+     * @return A smart Socket pointer to a TcpSocket allocated by this instance
      * of the TCP protocol
      *
-     * \param congestionTypeId the congestion control algorithm TypeId
+     * @param congestionTypeId the congestion control algorithm TypeId
      *
      */
     Ptr<Socket> CreateSocket(TypeId congestionTypeId);
 
     /**
-     * \brief Allocate an IPv4 Endpoint
-     * \return the Endpoint
+     * @brief Allocate an IPv4 Endpoint
+     * @return the Endpoint
      */
     Ipv4EndPoint* Allocate();
     /**
-     * \brief Allocate an IPv4 Endpoint
-     * \param address address to use
-     * \return the Endpoint
+     * @brief Allocate an IPv4 Endpoint
+     * @param address address to use
+     * @return the Endpoint
      */
     Ipv4EndPoint* Allocate(Ipv4Address address);
     /**
-     * \brief Allocate an IPv4 Endpoint
-     * \param boundNetDevice Bound NetDevice (if any)
-     * \param port port to use
-     * \return the Endpoint
+     * @brief Allocate an IPv4 Endpoint
+     * @param boundNetDevice Bound NetDevice (if any)
+     * @param port port to use
+     * @return the Endpoint
      */
     Ipv4EndPoint* Allocate(Ptr<NetDevice> boundNetDevice, uint16_t port);
     /**
-     * \brief Allocate an IPv4 Endpoint
-     * \param boundNetDevice Bound NetDevice (if any)
-     * \param address address to use
-     * \param port port to use
-     * \return the Endpoint
+     * @brief Allocate an IPv4 Endpoint
+     * @param boundNetDevice Bound NetDevice (if any)
+     * @param address address to use
+     * @param port port to use
+     * @return the Endpoint
      */
     Ipv4EndPoint* Allocate(Ptr<NetDevice> boundNetDevice, Ipv4Address address, uint16_t port);
     /**
-     * \brief Allocate an IPv4 Endpoint
-     * \param boundNetDevice Bound NetDevice (if any)
-     * \param localAddress local address to use
-     * \param localPort local port to use
-     * \param peerAddress remote address to use
-     * \param peerPort remote port to use
-     * \return the Endpoint
+     * @brief Allocate an IPv4 Endpoint
+     * @param boundNetDevice Bound NetDevice (if any)
+     * @param localAddress local address to use
+     * @param localPort local port to use
+     * @param peerAddress remote address to use
+     * @param peerPort remote port to use
+     * @return the Endpoint
      */
     Ipv4EndPoint* Allocate(Ptr<NetDevice> boundNetDevice,
                            Ipv4Address localAddress,
@@ -163,39 +165,39 @@
                            Ipv4Address peerAddress,
                            uint16_t peerPort);
     /**
-     * \brief Allocate an IPv6 Endpoint
-     * \return the Endpoint
+     * @brief Allocate an IPv6 Endpoint
+     * @return the Endpoint
      */
     Ipv6EndPoint* Allocate6();
     /**
-     * \brief Allocate an IPv6 Endpoint
-     * \param address address to use
-     * \return the Endpoint
+     * @brief Allocate an IPv6 Endpoint
+     * @param address address to use
+     * @return the Endpoint
      */
     Ipv6EndPoint* Allocate6(Ipv6Address address);
     /**
-     * \brief Allocate an IPv6 Endpoint
-     * \param boundNetDevice Bound NetDevice (if any)
-     * \param port port to use
-     * \return the Endpoint
+     * @brief Allocate an IPv6 Endpoint
+     * @param boundNetDevice Bound NetDevice (if any)
+     * @param port port to use
+     * @return the Endpoint
      */
     Ipv6EndPoint* Allocate6(Ptr<NetDevice> boundNetDevice, uint16_t port);
     /**
-     * \brief Allocate an IPv6 Endpoint
-     * \param boundNetDevice Bound NetDevice (if any)
-     * \param address address to use
-     * \param port port to use
-     * \return the Endpoint
+     * @brief Allocate an IPv6 Endpoint
+     * @param boundNetDevice Bound NetDevice (if any)
+     * @param address address to use
+     * @param port port to use
+     * @return the Endpoint
      */
     Ipv6EndPoint* Allocate6(Ptr<NetDevice> boundNetDevice, Ipv6Address address, uint16_t port);
     /**
-     * \brief Allocate an IPv6 Endpoint
-     * \param boundNetDevice Bound NetDevice (if any)
-     * \param localAddress local address to use
-     * \param localPort local port to use
-     * \param peerAddress remote address to use
-     * \param peerPort remote port to use
-     * \return the Endpoint
+     * @brief Allocate an IPv6 Endpoint
+     * @param boundNetDevice Bound NetDevice (if any)
+     * @param localAddress local address to use
+     * @param localPort local port to use
+     * @param peerAddress remote address to use
+     * @param peerPort remote port to use
+     * @return the Endpoint
      */
     Ipv6EndPoint* Allocate6(Ptr<NetDevice> boundNetDevice,
                             Ipv6Address localAddress,
@@ -204,13 +206,13 @@
                             uint16_t peerPort);
 
     /**
-     * \brief Send a packet via TCP (IP-agnostic)
+     * @brief Send a packet via TCP (IP-agnostic)
      *
-     * \param pkt The packet to send
-     * \param outgoing The packet header
-     * \param saddr The source Ipv4Address
-     * \param daddr The destination Ipv4Address
-     * \param oif The output interface bound. Defaults to null (unspecified).
+     * @param pkt The packet to send
+     * @param outgoing The packet header
+     * @param saddr The source Ipv4Address
+     * @param daddr The destination Ipv4Address
+     * @param oif The output interface bound. Defaults to null (unspecified).
      */
     void SendPacket(Ptr<Packet> pkt,
                     const TcpHeader& outgoing,
@@ -219,30 +221,30 @@
                     Ptr<NetDevice> oif = nullptr) const;
 
     /**
-     * \brief Make a socket fully operational
+     * @brief Make a socket fully operational
      *
      * Called after a socket has been bound, it is inserted in an internal vector.
      *
-     * \param socket Socket to be added
+     * @param socket Socket to be added
      */
     void AddSocket(Ptr<TcpSocketBase> socket);
 
     /**
-     * \brief Remove a socket from the internal list
+     * @brief Remove a socket from the internal list
      *
-     * \param socket socket to Remove
-     * \return true if the socket has been removed
+     * @param socket socket to Remove
+     * @return true if the socket has been removed
      */
     bool RemoveSocket(Ptr<TcpSocketBase> socket);
 
     /**
-     * \brief Remove an IPv4 Endpoint.
-     * \param endPoint the end point to remove
+     * @brief Remove an IPv4 Endpoint.
+     * @param endPoint the end point to remove
      */
     void DeAllocate(Ipv4EndPoint* endPoint);
     /**
-     * \brief Remove an IPv6 Endpoint.
-     * \param endPoint the end point to remove
+     * @brief Remove an IPv6 Endpoint.
+     * @param endPoint the end point to remove
      */
     void DeAllocate(Ipv6EndPoint* endPoint);
 
@@ -281,7 +283,7 @@
     void DoDispose() override;
 
     /**
-     * \brief Setup socket factory and callbacks when aggregated to a node
+     * @brief Setup socket factory and callbacks when aggregated to a node
      *
      * This function will notify other components connected to the node that a
      * new stack member is now connected. This will be used to notify Layer 3
@@ -292,14 +294,14 @@
     void NotifyNewAggregate() override;
 
     /**
-     * \brief Get the tcp header of the incoming packet and checks its checksum if needed
+     * @brief Get the tcp header of the incoming packet and checks its checksum if needed
      *
-     * \param packet Received packet
-     * \param incomingTcpHeader Overwritten with the tcp header of the packet
-     * \param source Source address (an underlying Ipv4Address or Ipv6Address)
-     * \param destination Destination address (an underlying Ipv4Address or Ipv6Address)
+     * @param packet Received packet
+     * @param incomingTcpHeader Overwritten with the tcp header of the packet
+     * @param source Source address (an underlying Ipv4Address or Ipv6Address)
+     * @param destination Destination address (an underlying Ipv4Address or Ipv6Address)
      *
-     * \return RX_CSUM_FAILED if the checksum check fails, RX_OK otherwise
+     * @return RX_CSUM_FAILED if the checksum check fails, RX_OK otherwise
      */
     IpL4Protocol::RxStatus PacketReceived(Ptr<Packet> packet,
                                           TcpHeader& incomingTcpHeader,
@@ -307,16 +309,16 @@
                                           const Address& destination);
 
     /**
-     * \brief Check if RST packet should be sent, and in case, send it
+     * @brief Check if RST packet should be sent, and in case, send it
      *
      * The function is called when no endpoint is found for the received
      * packet. So TcpL4Protocol do not know to who the packet should be
      * given to. An RST packet is sent out as reply unless the received packet
      * has the RST flag set.
      *
-     * \param incomingHeader TCP header of the incoming packet
-     * \param incomingSAddr Source address of the incoming packet
-     * \param incomingDAddr Destination address of the incoming packet
+     * @param incomingHeader TCP header of the incoming packet
+     * @param incomingSAddr Source address of the incoming packet
+     * @param incomingDAddr Destination address of the incoming packet
      *
      */
     void NoEndPointsFound(const TcpHeader& incomingHeader,
@@ -337,13 +339,13 @@
     IpL4Protocol::DownTargetCallback6 m_downTarget6; //!< Callback to send packets over IPv6
 
     /**
-     * \brief Send a packet via TCP (IPv4)
+     * @brief Send a packet via TCP (IPv4)
      *
-     * \param pkt The packet to send
-     * \param outgoing The packet header
-     * \param saddr The source Ipv4Address
-     * \param daddr The destination Ipv4Address
-     * \param oif The output interface bound. Defaults to null (unspecified).
+     * @param pkt The packet to send
+     * @param outgoing The packet header
+     * @param saddr The source Ipv4Address
+     * @param daddr The destination Ipv4Address
+     * @param oif The output interface bound. Defaults to null (unspecified).
      */
     void SendPacketV4(Ptr<Packet> pkt,
                       const TcpHeader& outgoing,
@@ -352,13 +354,13 @@
                       Ptr<NetDevice> oif = nullptr) const;
 
     /**
-     * \brief Send a packet via TCP (IPv6)
+     * @brief Send a packet via TCP (IPv6)
      *
-     * \param pkt The packet to send
-     * \param outgoing The packet header
-     * \param saddr The source Ipv4Address
-     * \param daddr The destination Ipv4Address
-     * \param oif The output interface bound. Defaults to null (unspecified).
+     * @param pkt The packet to send
+     * @param outgoing The packet header
+     * @param saddr The source Ipv4Address
+     * @param daddr The destination Ipv4Address
+     * @param oif The output interface bound. Defaults to null (unspecified).
      */
     void SendPacketV6(Ptr<Packet> pkt,
                       const TcpHeader& outgoing,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/tcp-ledbat.h ns-3.44/src/internet/model/tcp-ledbat.h
--- ns-3.43/src/internet/model/tcp-ledbat.h	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/model/tcp-ledbat.h	2025-03-09 16:55:49.407371300 -0700
@@ -20,16 +20,16 @@
 class TcpSocketState;
 
 /**
- * \ingroup congestionOps
+ * @ingroup congestionOps
  *
- * \brief An implementation of LEDBAT
+ * @brief An implementation of LEDBAT
  */
 
 class TcpLedbat : public TcpNewReno
 {
   private:
     /**
-     * \brief The slowstart types
+     * @brief The slowstart types
      */
     enum SlowStartType
     {
@@ -38,7 +38,7 @@
     };
 
     /**
-     * \brief The state of LEDBAT. If LEDBAT is not in VALID_OWD state, it falls to
+     * @brief The state of LEDBAT. If LEDBAT is not in VALID_OWD state, it falls to
      *        default congestion ops.
      */
     enum State : uint32_t
@@ -49,8 +49,8 @@
 
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -60,29 +60,29 @@
     TcpLedbat();
 
     /**
-     * \brief Copy constructor
-     * \param sock the object to copy
+     * @brief Copy constructor
+     * @param sock the object to copy
      */
     TcpLedbat(const TcpLedbat& sock);
 
     /**
-     * \brief Destructor
+     * @brief Destructor
      */
     ~TcpLedbat() override;
 
     /**
-     * \brief Get the name of the TCP flavour
+     * @brief Get the name of the TCP flavour
      *
-     * \return The name of the TCP
+     * @return The name of the TCP
      */
     std::string GetName() const override;
 
     /**
-     * \brief Get information from the acked packet
+     * @brief Get information from the acked packet
      *
-     * \param tcb internal congestion state
-     * \param segmentsAcked count of segments ACKed
-     * \param rtt The estimated rtt
+     * @param tcb internal congestion state
+     * @param segmentsAcked count of segments ACKed
+     * @param rtt The estimated rtt
      */
     void PktsAcked(Ptr<TcpSocketState> tcb, uint32_t segmentsAcked, const Time& rtt) override;
 
@@ -90,32 +90,32 @@
     Ptr<TcpCongestionOps> Fork() override;
 
     /**
-     * \brief Adjust cwnd following LEDBAT algorithm
+     * @brief Adjust cwnd following LEDBAT algorithm
      *
-     * \param tcb internal congestion state
-     * \param segmentsAcked count of segments ACKed
+     * @param tcb internal congestion state
+     * @param segmentsAcked count of segments ACKed
      */
     void IncreaseWindow(Ptr<TcpSocketState> tcb, uint32_t segmentsAcked) override;
 
     /**
-     * \brief Change the Slow Start Capability
+     * @brief Change the Slow Start Capability
      *
-     * \param doSS Slow Start Option
+     * @param doSS Slow Start Option
      */
     void SetDoSs(SlowStartType doSS);
 
   protected:
     /**
-     * \brief Reduce Congestion
+     * @brief Reduce Congestion
      *
-     * \param tcb internal congestion state
-     * \param segmentsAcked count of segments ACKed
+     * @param tcb internal congestion state
+     * @param segmentsAcked count of segments ACKed
      */
     void CongestionAvoidance(Ptr<TcpSocketState> tcb, uint32_t segmentsAcked) override;
 
   private:
     /**
-     * \brief Buffer structure to store delays
+     * @brief Buffer structure to store delays
      */
     struct OwdCircBuf
     {
@@ -124,9 +124,9 @@
     };
 
     /**
-     * \brief Initialise a new buffer
+     * @brief Initialise a new buffer
      *
-     * \param buffer The buffer to be initialised
+     * @param buffer The buffer to be initialised
      */
     void InitCircBuf(OwdCircBuf& buffer);
 
@@ -134,41 +134,41 @@
     typedef uint32_t (*FilterFunction)(OwdCircBuf&);
 
     /**
-     * \brief Return the minimum delay of the buffer
+     * @brief Return the minimum delay of the buffer
      *
-     * \param b The buffer
-     * \return The minimum delay
+     * @param b The buffer
+     * @return The minimum delay
      */
     static uint32_t MinCircBuf(OwdCircBuf& b);
 
     /**
-     * \brief Return the value of current delay
+     * @brief Return the value of current delay
      *
-     * \param filter The filter function
-     * \return The current delay
+     * @param filter The filter function
+     * @return The current delay
      */
     uint32_t CurrentDelay(FilterFunction filter);
 
     /**
-     * \brief Return the value of base delay
+     * @brief Return the value of base delay
      *
-     * \return The base delay
+     * @return The base delay
      */
     uint32_t BaseDelay();
 
     /**
-     * \brief Add new delay to the buffers
+     * @brief Add new delay to the buffers
      *
-     * \param cb The buffer
-     * \param owd The new delay
-     * \param maxlen The maximum permitted length
+     * @param cb The buffer
+     * @param owd The new delay
+     * @param maxlen The maximum permitted length
      */
     void AddDelay(OwdCircBuf& cb, uint32_t owd, uint32_t maxlen);
 
     /**
-     * \brief Update the base delay buffer
+     * @brief Update the base delay buffer
      *
-     * \param owd The delay
+     * @param owd The delay
      */
     void UpdateBaseDelay(uint32_t owd);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/tcp-linux-reno.h ns-3.44/src/internet/model/tcp-linux-reno.h
--- ns-3.43/src/internet/model/tcp-linux-reno.h	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/model/tcp-linux-reno.h	2025-03-09 16:55:49.407371300 -0700
@@ -18,9 +18,9 @@
 {
 
 /**
- * \ingroup congestionOps
+ * @ingroup congestionOps
  *
- * \brief Reno congestion control algorithm
+ * @brief Reno congestion control algorithm
  *
  * This class implement the Reno congestion control type
  * and it mimics the one implemented in the Linux kernel.
@@ -29,16 +29,16 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     TcpLinuxReno();
 
     /**
-     * \brief Copy constructor.
-     * \param sock object to copy.
+     * @brief Copy constructor.
+     * @param sock object to copy.
      */
     TcpLinuxReno(const TcpLinuxReno& sock);
 
@@ -53,15 +53,15 @@
   protected:
     /**
      * Slow start phase handler
-     * \param tcb Transmission Control Block of the connection
-     * \param segmentsAcked count of segments acked
-     * \return Number of segments acked minus the difference between the receiver and sender Cwnd
+     * @param tcb Transmission Control Block of the connection
+     * @param segmentsAcked count of segments acked
+     * @return Number of segments acked minus the difference between the receiver and sender Cwnd
      */
     virtual uint32_t SlowStart(Ptr<TcpSocketState> tcb, uint32_t segmentsAcked);
     /**
      * Congestion avoidance phase handler
-     * \param tcb Transmission Control Block of the connection
-     * \param segmentsAcked count of segments acked
+     * @param tcb Transmission Control Block of the connection
+     * @param segmentsAcked count of segments acked
      */
     virtual void CongestionAvoidance(Ptr<TcpSocketState> tcb, uint32_t segmentsAcked);
 
@@ -72,7 +72,7 @@
      * derived classes using the IncreaseWindow() method may not want this
      * behavior, so this method exists to allow subclasses to set it to false.
      *
-     * \param value Value to set whether the isCwndLimited condition
+     * @param value Value to set whether the isCwndLimited condition
      *        suppresses window updates
      */
     void SetSuppressIncreaseIfCwndLimited(bool value);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/tcp-lp.h ns-3.44/src/internet/model/tcp-lp.h
--- ns-3.43/src/internet/model/tcp-lp.h	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/model/tcp-lp.h	2025-03-09 16:55:49.407371300 -0700
@@ -22,44 +22,44 @@
 class TcpSocketState;
 
 /**
- * \ingroup congestionOps
+ * @ingroup congestionOps
  *
- * \brief TCP-LP (Low Priority) congestion control algorithm
+ * @brief TCP-LP (Low Priority) congestion control algorithm
  */
 class TcpLp : public TcpNewReno
 {
   public:
     /**
-     * \brief Get the type ID.
+     * @brief Get the type ID.
      *
-     * \return the object TypeId
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Creates an unbound tcp socket.
+     * @brief Creates an unbound tcp socket.
      *
      */
     TcpLp();
 
     /**
-     * \brief Copy constructor
+     * @brief Copy constructor
      *
-     * \param sock the object to copy
+     * @param sock the object to copy
      */
     TcpLp(const TcpLp& sock);
 
     ~TcpLp() override;
 
     /**
-     * \brief Timing information on received ACK
+     * @brief Timing information on received ACK
      *
      * The function is called every time an ACK is received.
      * It determines the state of TcpLp and adjusts the congestion window accordingly.
      *
-     * \param tcb internal congestion state
-     * \param segmentsAcked count of segments acked
-     * \param rtt last rtt
+     * @param tcb internal congestion state
+     * @param segmentsAcked count of segments acked
+     * @param rtt last rtt
      */
     void PktsAcked(Ptr<TcpSocketState> tcb, uint32_t segmentsAcked, const Time& rtt) override;
 
@@ -69,16 +69,16 @@
 
   protected:
     /**
-     * \brief Invokes Congestion Avoidance of TcpNewReno if TcpLp is not within inference.
+     * @brief Invokes Congestion Avoidance of TcpNewReno if TcpLp is not within inference.
      *
-     * \param tcb internal congestion state
-     * \param segmentsAcked count of segments acked
+     * @param tcb internal congestion state
+     * @param segmentsAcked count of segments acked
      */
     void CongestionAvoidance(Ptr<TcpSocketState> tcb, uint32_t segmentsAcked) override;
 
   private:
     /**
-     * \brief Describes the state of TcpLp.
+     * @brief Describes the state of TcpLp.
      *
      */
     enum State
@@ -98,18 +98,18 @@
 
   private:
     /**
-     * \brief Calculates One-Way Delay using Sender and Receiver timestamps.
+     * @brief Calculates One-Way Delay using Sender and Receiver timestamps.
      *
-     * \param tcb internal congestion state
-     * \return One-Way Delay
+     * @param tcb internal congestion state
+     * @return One-Way Delay
      */
     uint32_t OwdCalculator(Ptr<TcpSocketState> tcb);
 
     /**
-     * \brief Estimates minimum and maximum One-Way Delays and calculates the smoothed One-Way
+     * @brief Estimates minimum and maximum One-Way Delays and calculates the smoothed One-Way
      * Delay.
      *
-     * \param tcb internal congestion state
+     * @param tcb internal congestion state
      */
     void RttSample(Ptr<TcpSocketState> tcb);
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/tcp-option.h ns-3.44/src/internet/model/tcp-option.h
--- ns-3.43/src/internet/model/tcp-option.h	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/model/tcp-option.h	2025-03-09 16:55:49.407371300 -0700
@@ -19,7 +19,7 @@
 {
 
 /**
- * \ingroup tcp
+ * @ingroup tcp
  *
  * Base class for all kinds of TCP options
  */
@@ -30,8 +30,8 @@
     ~TcpOption() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -55,56 +55,56 @@
     };
 
     /**
-     * \brief Print the Option contents
-     * \param os the output stream
+     * @brief Print the Option contents
+     * @param os the output stream
      */
     virtual void Print(std::ostream& os) const = 0;
     /**
-     * \brief Serialize the Option to a buffer iterator
-     * \param start the buffer iterator
+     * @brief Serialize the Option to a buffer iterator
+     * @param start the buffer iterator
      */
     virtual void Serialize(Buffer::Iterator start) const = 0;
 
     /**
-     * \brief Deserialize the Option from a buffer iterator
-     * \param start the buffer iterator
-     * \returns the number of deserialized bytes
+     * @brief Deserialize the Option from a buffer iterator
+     * @param start the buffer iterator
+     * @returns the number of deserialized bytes
      */
     virtual uint32_t Deserialize(Buffer::Iterator start) = 0;
 
     /**
-     * \brief Get the `kind' (as in \RFC{793}) of this option
-     * \return the Option Kind
+     * @brief Get the `kind' (as in \RFC{793}) of this option
+     * @return the Option Kind
      */
     virtual uint8_t GetKind() const = 0;
     /**
-     * \brief Returns number of bytes required for Option
+     * @brief Returns number of bytes required for Option
      * serialization.
      *
-     * \returns number of bytes required for Option
+     * @returns number of bytes required for Option
      * serialization
      */
     virtual uint32_t GetSerializedSize() const = 0;
 
     /**
-     * \brief Creates an option
-     * \param kind the option kind
-     * \return the requested option or an ns3::UnknownOption if the option is not supported
+     * @brief Creates an option
+     * @param kind the option kind
+     * @return the requested option or an ns3::UnknownOption if the option is not supported
      */
     static Ptr<TcpOption> CreateOption(uint8_t kind);
 
     /**
-     * \brief Check if the option is implemented
-     * \param kind the Option kind
-     * \return true if the option is known
+     * @brief Check if the option is implemented
+     * @param kind the Option kind
+     * @return true if the option is known
      */
     static bool IsKindKnown(uint8_t kind);
 };
 
 /**
- * \ingroup tcp
+ * @ingroup tcp
  *
- * \brief An unknown TCP option.
+ * @brief An unknown TCP option.
  *
  * An unknown option can be deserialized and (only if deserialized previously)
  * serialized again.
@@ -116,8 +116,8 @@
     ~TcpOptionUnknown() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/tcp-option-rfc793.h ns-3.44/src/internet/model/tcp-option-rfc793.h
--- ns-3.43/src/internet/model/tcp-option-rfc793.h	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/model/tcp-option-rfc793.h	2025-03-09 16:55:49.407371300 -0700
@@ -14,7 +14,7 @@
 {
 
 /**
- * \ingroup tcp
+ * @ingroup tcp
  *
  * Defines the TCP option of kind 0 (end of option list) as in \RFC{793}
  */
@@ -25,8 +25,8 @@
     ~TcpOptionEnd() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -49,8 +49,8 @@
     ~TcpOptionNOP() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -73,8 +73,8 @@
     ~TcpOptionMSS() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -87,13 +87,13 @@
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Get the Maximum Segment Size stored in the Option
-     * \return The Maximum Segment Size
+     * @brief Get the Maximum Segment Size stored in the Option
+     * @return The Maximum Segment Size
      */
     uint16_t GetMSS() const;
     /**
-     * \brief Set the Maximum Segment Size stored in the Option
-     * \param mss The Maximum Segment Size
+     * @brief Set the Maximum Segment Size stored in the Option
+     * @param mss The Maximum Segment Size
      */
     void SetMSS(uint16_t mss);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/tcp-option-sack.h ns-3.44/src/internet/model/tcp-option-sack.h
--- ns-3.43/src/internet/model/tcp-option-sack.h	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/model/tcp-option-sack.h	2025-03-09 16:55:49.407371300 -0700
@@ -22,7 +22,7 @@
 {
 
 /**
- * \brief Defines the TCP option of kind 5 (selective acknowledgment option) as
+ * @brief Defines the TCP option of kind 5 (selective acknowledgment option) as
  * in \RFC{2018}
  *
  * TCP SACK Option is used by a receiver to report non-contiguous blocks of data
@@ -40,8 +40,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -60,25 +60,25 @@
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Add a SACK block
-     * \param s the SACK block to be added
+     * @brief Add a SACK block
+     * @param s the SACK block to be added
      */
     void AddSackBlock(SackBlock s);
 
     /**
-     * \brief Count the total number of SACK blocks
-     * \return the total number of SACK blocks
+     * @brief Count the total number of SACK blocks
+     * @return the total number of SACK blocks
      */
     uint32_t GetNumSackBlocks() const;
 
     /**
-     * \brief Clear the SACK list
+     * @brief Clear the SACK list
      */
     void ClearSackList();
 
     /**
-     * \brief Get the SACK list
-     * \return the SACK list
+     * @brief Get the SACK list
+     * @return the SACK list
      */
     SackList GetSackList() const;
 
@@ -89,18 +89,18 @@
 };
 
 /**
- * \brief Output operator.
- * \param os The output stream.
- * \param sackOption the option to print.
- * \returns The output stream.
+ * @brief Output operator.
+ * @param os The output stream.
+ * @param sackOption the option to print.
+ * @returns The output stream.
  */
 std::ostream& operator<<(std::ostream& os, const TcpOptionSack& sackOption);
 
 /**
- * \brief Output operator.
- * \param os The output stream.
- * \param sackBlock the block to print.
- * \returns The output stream.
+ * @brief Output operator.
+ * @param os The output stream.
+ * @param sackBlock the block to print.
+ * @returns The output stream.
  */
 std::ostream& operator<<(std::ostream& os, const TcpOptionSack::SackBlock& sackBlock);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/tcp-option-sack-permitted.h ns-3.44/src/internet/model/tcp-option-sack-permitted.h
--- ns-3.43/src/internet/model/tcp-option-sack-permitted.h	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/model/tcp-option-sack-permitted.h	2025-03-09 16:55:49.407371300 -0700
@@ -20,7 +20,7 @@
 {
 
 /**
- * \brief Defines the TCP option of kind 4 (selective acknowledgment permitted
+ * @brief Defines the TCP option of kind 4 (selective acknowledgment permitted
  * option) as in \RFC{2018}
  *
  * TCP Sack-Permitted Option is 2-byte in length and sent in a SYN segment by a
@@ -32,8 +32,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/tcp-option-ts.cc ns-3.44/src/internet/model/tcp-option-ts.cc
--- ns-3.43/src/internet/model/tcp-option-ts.cc	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/model/tcp-option-ts.cc	2025-03-09 16:55:49.407371300 -0700
@@ -135,7 +135,7 @@
     uint64_t now64 = (uint64_t)Simulator::Now().GetMilliSeconds();
     uint32_t now32 = now64 & 0xFFFFFFFF;
 
-    Time ret = Seconds(0.0);
+    Time ret;
     if (now32 > echoTime)
     {
         ret = MilliSeconds(now32 - echoTime);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/tcp-option-ts.h ns-3.44/src/internet/model/tcp-option-ts.h
--- ns-3.43/src/internet/model/tcp-option-ts.h	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/model/tcp-option-ts.h	2025-03-09 16:55:49.407371300 -0700
@@ -17,7 +17,7 @@
 {
 
 /**
- * \ingroup tcp
+ * @ingroup tcp
  *
  * Defines the TCP option of kind 8 (timestamp option) as in \RFC{1323}
  */
@@ -29,8 +29,8 @@
     ~TcpOptionTS() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -43,28 +43,28 @@
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Get the timestamp stored in the Option
-     * \return the timestamp
+     * @brief Get the timestamp stored in the Option
+     * @return the timestamp
      */
     uint32_t GetTimestamp() const;
     /**
-     * \brief Get the timestamp echo stored in the Option
-     * \return the timestamp echo
+     * @brief Get the timestamp echo stored in the Option
+     * @return the timestamp echo
      */
     uint32_t GetEcho() const;
     /**
-     * \brief Set the timestamp stored in the Option
-     * \param ts the timestamp
+     * @brief Set the timestamp stored in the Option
+     * @param ts the timestamp
      */
     void SetTimestamp(uint32_t ts);
     /**
-     * \brief Set the timestamp echo stored in the Option
-     * \param ts the timestamp echo
+     * @brief Set the timestamp echo stored in the Option
+     * @param ts the timestamp echo
      */
     void SetEcho(uint32_t ts);
 
     /**
-     * \brief Return an uint32_t value which represent "now"
+     * @brief Return an uint32_t value which represent "now"
      *
      * The value returned is usually used as Timestamp option for the
      * TCP header; when the value will be echoed back, calculating the RTT
@@ -74,19 +74,19 @@
      * is implemented in OS, we use milliseconds. Any change to this must be
      * reflected to EstimateRttFromTs.
      *
-     * \see EstimateRttFromTs
-     * \return The Timestamp value to use
+     * @see EstimateRttFromTs
+     * @return The Timestamp value to use
      */
     static uint32_t NowToTsValue();
 
     /**
-     * \brief Estimate the Time elapsed from a TS echo value
+     * @brief Estimate the Time elapsed from a TS echo value
      *
      * The echoTime should be a value returned from NowToTsValue.
      *
-     * \param echoTime Echoed value from other side
-     * \see NowToTsValue
-     * \return The measured RTT
+     * @param echoTime Echoed value from other side
+     * @see NowToTsValue
+     * @return The measured RTT
      */
     static Time ElapsedTimeFromTsValue(uint32_t echoTime);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/tcp-option-winscale.h ns-3.44/src/internet/model/tcp-option-winscale.h
--- ns-3.43/src/internet/model/tcp-option-winscale.h	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/model/tcp-option-winscale.h	2025-03-09 16:55:49.407371300 -0700
@@ -16,9 +16,9 @@
 {
 
 /**
- * \ingroup tcp
+ * @ingroup tcp
  *
- * \brief Defines the TCP option of kind 3 (window scale option) as in \RFC{1323}
+ * @brief Defines the TCP option of kind 3 (window scale option) as in \RFC{1323}
  *
  * For more efficient use of high bandwidth networks, a larger TCP window size
  * may be used. The TCP window size field controls the flow of data and its
@@ -40,8 +40,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -57,17 +57,17 @@
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Get the scale value (uint8_t)
-     * \return The scale value
+     * @brief Get the scale value (uint8_t)
+     * @return The scale value
      */
     uint8_t GetScale() const;
 
     /**
-     * \brief Set the scale option
+     * @brief Set the scale option
      *
      * The scale option SHOULD be <= 14 (as \RFC{1323}).
      *
-     * \param scale Scale factor
+     * @param scale Scale factor
      */
     void SetScale(uint8_t scale);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/tcp-prr-recovery.h ns-3.44/src/internet/model/tcp-prr-recovery.h
--- ns-3.43/src/internet/model/tcp-prr-recovery.h	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/model/tcp-prr-recovery.h	2025-03-09 16:55:49.407371300 -0700
@@ -17,9 +17,9 @@
 {
 
 /**
- * \ingroup recoveryOps
+ * @ingroup recoveryOps
  *
- * \brief An implementation of PRR
+ * @brief An implementation of PRR
  *
  * PRR is an algorithm that determines TCP's sending rate in fast
  * recovery. PRR avoids excessive window reductions and aims for
@@ -32,8 +32,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -43,8 +43,8 @@
     TcpPrrRecovery();
 
     /**
-     * \brief Copy constructor
-     * \param sock the object to copy
+     * @brief Copy constructor
+     * @param sock the object to copy
      */
     TcpPrrRecovery(const TcpPrrRecovery& sock);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/tcp-rate-ops.cc ns-3.44/src/internet/model/tcp-rate-ops.cc
--- ns-3.43/src/internet/model/tcp-rate-ops.cc	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/model/tcp-rate-ops.cc	2025-03-09 16:55:49.407371300 -0700
@@ -69,7 +69,7 @@
      * a SACK reneging event may overestimate bw by including packets that
      * were SACKed before the reneg.
      */
-    if (m_rateSample.m_priorTime == Seconds(0) || is_sack_reneg)
+    if (m_rateSample.m_priorTime.IsZero() || is_sack_reneg)
     {
         NS_LOG_INFO("PriorTime is zero, invalidating sample");
         m_rateSample.m_delivered = -1;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/tcp-rate-ops.h ns-3.44/src/internet/model/tcp-rate-ops.h
--- ns-3.43/src/internet/model/tcp-rate-ops.h	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/model/tcp-rate-ops.h	2025-03-09 16:55:49.407371300 -0700
@@ -18,7 +18,7 @@
 {
 
 /**
- * \brief Interface for all operations that involve a Rate monitoring for TCP.
+ * @brief Interface for all operations that involve a Rate monitoring for TCP.
  *
  * The interface is meant to take information to generate rate information
  * valid for congestion avoidance algorithm such as BBR.
@@ -33,24 +33,24 @@
 
     /**
      * Get the type ID.
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     /**
-     * \brief Put the rate information inside the sent skb
+     * @brief Put the rate information inside the sent skb
      *
      * Snapshot the current delivery information in the skb, to generate
      * a rate sample later when the skb is (s)acked in SkbDelivered ().
      *
-     * \param skb The SKB sent
-     * \param isStartOfTransmission true if this is a start of transmission
+     * @param skb The SKB sent
+     * @param isStartOfTransmission true if this is a start of transmission
      * (i.e., in_flight == 0)
      */
     virtual void SkbSent(TcpTxItem* skb, bool isStartOfTransmission) = 0;
 
     /**
-     * \brief Update the Rate information after an item is received
+     * @brief Update the Rate information after an item is received
      *
      * When an skb is sacked or acked, we fill in the rate sample with the (prior)
      * delivery information when the skb was last transmitted.
@@ -59,22 +59,22 @@
      * called multiple times. We favor the information from the most recently
      * sent skb, i.e., the skb with the highest prior_delivered count.
      *
-     * \param skb The SKB delivered ((s)ACKed)
+     * @param skb The SKB delivered ((s)ACKed)
      */
     virtual void SkbDelivered(TcpTxItem* skb) = 0;
 
     /**
-     * \brief If a gap is detected between sends, it means we are app-limited.
+     * @brief If a gap is detected between sends, it means we are app-limited.
      * TODO What the Linux kernel is setting in tp->app_limited?
      * https://elixir.bootlin.com/linux/latest/source/net/ipv4/tcp_rate.c#L177
      *
-     * \param cWnd Congestion Window
-     * \param in_flight In Flight size (in bytes)
-     * \param segmentSize Segment size
-     * \param tailSeq Tail Sequence
-     * \param nextTx NextTx
-     * \param lostOut Number of lost bytes
-     * \param retransOut Number of retransmitted bytes
+     * @param cWnd Congestion Window
+     * @param in_flight In Flight size (in bytes)
+     * @param segmentSize Segment size
+     * @param tailSeq Tail Sequence
+     * @param nextTx NextTx
+     * @param lostOut Number of lost bytes
+     * @param retransOut Number of retransmitted bytes
      */
     virtual void CalculateAppLimited(uint32_t cWnd,
                                      uint32_t in_flight,
@@ -86,21 +86,21 @@
 
     /**
      *
-     * \brief Generate a TcpRateSample to feed a congestion avoidance algorithm.
+     * @brief Generate a TcpRateSample to feed a congestion avoidance algorithm.
      *
      * This function will be called after an ACK (or a SACK) is received. The
      * (S)ACK carries some implicit information, such as how many segments have been
      * lost or delivered. These values will be this function input.
      *
-     * \param delivered number of delivered segments (e.g., receiving a cumulative
+     * @param delivered number of delivered segments (e.g., receiving a cumulative
      * ACK means having more than 1 segment delivered) relative to the most recent
      * (S)ACK received
-     * \param lost number of segments that we detected as lost after the reception
+     * @param lost number of segments that we detected as lost after the reception
      * of the most recent (S)ACK
-     * \param priorInFlight number of segments previously considered in flight
-     * \param is_sack_reneg Is SACK reneged?
-     * \param minRtt Minimum RTT so far
-     * \return The TcpRateSample that will be used for CA
+     * @param priorInFlight number of segments previously considered in flight
+     * @param is_sack_reneg Is SACK reneged?
+     * @param minRtt Minimum RTT so far
+     * @return The TcpRateSample that will be used for CA
      */
     virtual const TcpRateSample& GenerateSample(uint32_t delivered,
                                                 uint32_t lost,
@@ -109,13 +109,13 @@
                                                 const Time& minRtt) = 0;
 
     /**
-     * \return The information about the rate connection
+     * @return The information about the rate connection
      *
      */
     virtual const TcpRateConnection& GetConnectionRate() = 0;
 
     /**
-     * \brief Rate Sample structure
+     * @brief Rate Sample structure
      *
      * A rate sample measures the number of (original/retransmitted) data
      * packets delivered "delivered" over an interval of time "interval_us".
@@ -128,56 +128,53 @@
     struct TcpRateSample
     {
         DataRate m_deliveryRate{DataRate("0bps")}; //!< The delivery rate sample
-        bool m_isAppLimited{false};    //!< Indicates whether the rate sample is application-limited
-        Time m_interval{Seconds(0.0)}; //!< The length of the sampling interval
+        bool m_isAppLimited{false}; //!< Indicates whether the rate sample is application-limited
+        Time m_interval;            //!< The length of the sampling interval
         int32_t m_delivered{
             0}; //!< The amount of data marked as delivered over the sampling interval
-        uint32_t m_priorDelivered{0};   //!< The delivered count of the most recent packet delivered
-        Time m_priorTime{Seconds(0.0)}; //!< The delivered time of the most recent packet delivered
-        Time m_sendElapsed{
-            Seconds(0.0)}; //!< Send time interval calculated from the most recent packet delivered
-        Time m_ackElapsed{
-            Seconds(0.0)}; //!< ACK time interval calculated from the most recent packet delivered
+        uint32_t m_priorDelivered{0}; //!< The delivered count of the most recent packet delivered
+        Time m_priorTime;             //!< The delivered time of the most recent packet delivered
+        Time m_sendElapsed; //!< Send time interval calculated from the most recent packet delivered
+        Time m_ackElapsed;  //!< ACK time interval calculated from the most recent packet delivered
         uint32_t m_bytesLoss{
             0}; //!< The amount of data marked as lost from the most recent ack received
         uint32_t m_priorInFlight{0}; //!< The value if bytes in flight prior to last received ack
         uint32_t m_ackedSacked{0}; //!< The amount of data acked and sacked in the last received ack
 
         /**
-         * \brief Is the sample valid?
-         * \return true if the sample is valid, false otherwise.
+         * @brief Is the sample valid?
+         * @return true if the sample is valid, false otherwise.
          */
         bool IsValid() const
         {
-            return (m_priorTime != Seconds(0.0) || m_interval != Seconds(0.0));
+            return (!m_priorTime.IsZero() || !m_interval.IsZero());
         }
     };
 
     /**
-     * \brief Information about the connection rate
+     * @brief Information about the connection rate
      *
      * In this struct, the values are for the entire connection, and not just
      * for an interval of time
      */
     struct TcpRateConnection
     {
-        uint64_t m_delivered{0};          //!< The total amount of data in bytes delivered so far
-        Time m_deliveredTime{Seconds(0)}; //!< Simulator time when m_delivered was last updated
-        Time m_firstSentTime{
-            Seconds(0)}; //!< The send time of the packet that was most recently marked as delivered
+        uint64_t m_delivered{0}; //!< The total amount of data in bytes delivered so far
+        Time m_deliveredTime;    //!< Simulator time when m_delivered was last updated
+        Time m_firstSentTime;    //!< The send time of the packet that was most recently marked as
+                                 //!< delivered
         uint32_t m_appLimited{
             0}; //!< The index of the last transmitted packet marked as application-limited
         uint32_t m_txItemDelivered{0}; //!< The value of delivered when the acked item was sent
         int32_t m_rateDelivered{
             0}; //!< The amount of data delivered considered to calculate delivery rate.
-        Time m_rateInterval{
-            Seconds(0)}; //!< The value of interval considered to calculate delivery rate.
+        Time m_rateInterval; //!< The value of interval considered to calculate delivery rate.
         bool m_rateAppLimited{false}; //!< Was sample was taken when data is app limited?
     };
 };
 
 /**
- * \brief Linux management and generation of Rate information for TCP
+ * @brief Linux management and generation of Rate information for TCP
  *
  * This class is inspired by what Linux is performing in tcp_rate.c
  */
@@ -186,8 +183,8 @@
   public:
     /**
      * Get the type ID.
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -220,7 +217,7 @@
      *
      * The callback will be fired each time the rate is updated.
      *
-     * \param [in] rate The rate information.
+     * @param [in] rate The rate information.
      */
     typedef void (*TcpRateUpdated)(const TcpRateConnection& rate);
 
@@ -229,7 +226,7 @@
      *
      * The callback will be fired each time the rate sample is updated.
      *
-     * \param [in] sample The rate sample that will be passed to congestion control
+     * @param [in] sample The rate sample that will be passed to congestion control
      * algorithms.
      */
     typedef void (*TcpRateSampleUpdated)(const TcpRateSample& sample);
@@ -244,34 +241,34 @@
 };
 
 /**
- * \brief Output operator.
- * \param os The output stream.
- * \param sample the TcpRateLinux::TcpRateSample to print.
- * \returns The output stream.
+ * @brief Output operator.
+ * @param os The output stream.
+ * @param sample the TcpRateLinux::TcpRateSample to print.
+ * @returns The output stream.
  */
 std::ostream& operator<<(std::ostream& os, const TcpRateOps::TcpRateSample& sample);
 
 /**
- * \brief Output operator.
- * \param os The output stream.
- * \param rate the TcpRateLinux::TcpRateConnection to print.
- * \returns The output stream.
+ * @brief Output operator.
+ * @param os The output stream.
+ * @param rate the TcpRateLinux::TcpRateConnection to print.
+ * @returns The output stream.
  */
 std::ostream& operator<<(std::ostream& os, const TcpRateOps::TcpRateConnection& rate);
 
 /**
  * Comparison operator
- * \param lhs left operand
- * \param rhs right operand
- * \return true if the operands are equal
+ * @param lhs left operand
+ * @param rhs right operand
+ * @return true if the operands are equal
  */
 bool operator==(const TcpRateLinux::TcpRateSample& lhs, const TcpRateLinux::TcpRateSample& rhs);
 
 /**
  * Comparison operator
- * \param lhs left operand
- * \param rhs right operand
- * \return true if the operands are equal
+ * @param lhs left operand
+ * @param rhs right operand
+ * @return true if the operands are equal
  */
 bool operator==(const TcpRateLinux::TcpRateConnection& lhs,
                 const TcpRateLinux::TcpRateConnection& rhs);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/tcp-recovery-ops.h ns-3.44/src/internet/model/tcp-recovery-ops.h
--- ns-3.43/src/internet/model/tcp-recovery-ops.h	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/model/tcp-recovery-ops.h	2025-03-09 16:55:49.407371300 -0700
@@ -19,17 +19,17 @@
 class TcpSocketState;
 
 /**
- * \ingroup tcp
- * \defgroup recoveryOps Recovery Algorithms.
+ * @ingroup tcp
+ * @defgroup recoveryOps Recovery Algorithms.
  *
  * The various recovery algorithms used in recovery phase of TCP. The interface
  * is defined in class TcpRecoveryOps.
  */
 
 /**
- * \ingroup recoveryOps
+ * @ingroup recoveryOps
  *
- * \brief recovery abstract class
+ * @brief recovery abstract class
  *
  * The design is inspired by the TcpCongestionOps class in ns-3. The fast
  * recovery is split from the main socket code, and it is a pluggable
@@ -43,50 +43,50 @@
  *
  * Each condition is represented by a pure virtual method.
  *
- * \see TcpClassicRecovery
- * \see DoRecovery
+ * @see TcpClassicRecovery
+ * @see DoRecovery
  */
 class TcpRecoveryOps : public Object
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Constructor
+     * @brief Constructor
      */
     TcpRecoveryOps();
 
     /**
-     * \brief Copy constructor.
-     * \param other object to copy.
+     * @brief Copy constructor.
+     * @param other object to copy.
      */
     TcpRecoveryOps(const TcpRecoveryOps& other);
 
     /**
-     * \brief Deconstructor
+     * @brief Deconstructor
      */
     ~TcpRecoveryOps() override;
 
     /**
-     * \brief Get the name of the recovery algorithm
+     * @brief Get the name of the recovery algorithm
      *
-     * \return A string identifying the name
+     * @return A string identifying the name
      */
     virtual std::string GetName() const = 0;
 
     /**
-     * \brief Performs variable initialization at the start of recovery
+     * @brief Performs variable initialization at the start of recovery
      *
      * The function is called when the TcpSocketState is changed to CA_RECOVERY.
      *
-     * \param tcb internal congestion state
-     * \param dupAckCount duplicate acknowledgement count
-     * \param unAckDataCount total bytes of data unacknowledged
-     * \param deliveredBytes bytes (S)ACKed in the last (S)ACK
+     * @param tcb internal congestion state
+     * @param dupAckCount duplicate acknowledgement count
+     * @param unAckDataCount total bytes of data unacknowledged
+     * @param deliveredBytes bytes (S)ACKed in the last (S)ACK
      */
     virtual void EnterRecovery(Ptr<TcpSocketState> tcb,
                                uint32_t dupAckCount,
@@ -94,48 +94,48 @@
                                uint32_t deliveredBytes) = 0;
 
     /**
-     * \brief Performs recovery based on the recovery algorithm
+     * @brief Performs recovery based on the recovery algorithm
      *
      * The function is called on arrival of every ack when TcpSocketState
      * is set to CA_RECOVERY. It performs the necessary cwnd changes
      * as per the recovery algorithm.
      * The param `isDupAck` has been added to align PRR implementation with RFC 6937 bis-08.
      *
-     * \param tcb internal congestion state
-     * \param deliveredBytes bytes (S)ACKed in the last (S)ACK
-     * \param isDupAck Indicates if the last acknowledgement was duplicate.
+     * @param tcb internal congestion state
+     * @param deliveredBytes bytes (S)ACKed in the last (S)ACK
+     * @param isDupAck Indicates if the last acknowledgement was duplicate.
      */
     virtual void DoRecovery(Ptr<TcpSocketState> tcb, uint32_t deliveredBytes, bool isDupAck) = 0;
 
     /**
-     * \brief Performs cwnd adjustments at the end of recovery
+     * @brief Performs cwnd adjustments at the end of recovery
      *
      * The function is called when the TcpSocketState is changed from CA_RECOVERY.
      *
-     * \param tcb internal congestion state
+     * @param tcb internal congestion state
      */
     virtual void ExitRecovery(Ptr<TcpSocketState> tcb) = 0;
 
     /**
-     * \brief Keeps track of bytes sent during recovery phase
+     * @brief Keeps track of bytes sent during recovery phase
      *
      * The function is called whenever a data packet is sent during recovery phase
      * (optional).
      *
-     * \param bytesSent bytes sent
+     * @param bytesSent bytes sent
      */
     virtual void UpdateBytesSent(uint32_t bytesSent);
 
     /**
-     * \brief Copy the recovery algorithm across socket
+     * @brief Copy the recovery algorithm across socket
      *
-     * \return a pointer of the copied object
+     * @return a pointer of the copied object
      */
     virtual Ptr<TcpRecoveryOps> Fork() = 0;
 };
 
 /**
- * \brief The Classic recovery implementation
+ * @brief The Classic recovery implementation
  *
  * Classic recovery refers to the two well-established recovery algorithms,
  * namely, NewReno (RFC 6582) and SACK based recovery (RFC 6675).
@@ -146,30 +146,30 @@
  * the highest sequence transmitted at time of detecting the loss is
  * ACKed by the receiver).
  *
- * \see DoRecovery
+ * @see DoRecovery
  */
 class TcpClassicRecovery : public TcpRecoveryOps
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Constructor
+     * @brief Constructor
      */
     TcpClassicRecovery();
 
     /**
-     * \brief Copy constructor.
-     * \param recovery object to copy.
+     * @brief Copy constructor.
+     * @param recovery object to copy.
      */
     TcpClassicRecovery(const TcpClassicRecovery& recovery);
 
     /**
-     * \brief Constructor
+     * @brief Constructor
      */
     ~TcpClassicRecovery() override;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/tcp-rx-buffer.h ns-3.44/src/internet/model/tcp-rx-buffer.h
--- ns-3.43/src/internet/model/tcp-rx-buffer.h	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/model/tcp-rx-buffer.h	2025-03-09 16:55:49.407371300 -0700
@@ -24,9 +24,9 @@
 class Packet;
 
 /**
- * \ingroup tcp
+ * @ingroup tcp
  *
- * \brief Rx reordering buffer for TCP
+ * @brief Rx reordering buffer for TCP
  *
  * The class is responsible to safely store the segments, and then
  * returning them in-order to the application, where "in-order" does not means
@@ -58,72 +58,72 @@
  * For more information about the SACK list, please check the documentation of
  * the method GetSackList.
  *
- * \see GetSackList
- * \see UpdateSackList
+ * @see GetSackList
+ * @see UpdateSackList
  */
 class TcpRxBuffer : public Object
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     /**
-     * \brief Constructor
-     * \param n initial Sequence number to be received
+     * @brief Constructor
+     * @param n initial Sequence number to be received
      */
     TcpRxBuffer(uint32_t n = 0);
     ~TcpRxBuffer() override;
 
     // Accessors
     /**
-     * \brief Get Next Rx Sequence number
-     * \returns Next Rx Sequence number
+     * @brief Get Next Rx Sequence number
+     * @returns Next Rx Sequence number
      */
     SequenceNumber32 NextRxSequence() const;
     /**
-     * \brief Get the lowest sequence number that this TcpRxBuffer cannot accept
-     * \returns the lowest sequence number that this TcpRxBuffer cannot accept
+     * @brief Get the lowest sequence number that this TcpRxBuffer cannot accept
+     * @returns the lowest sequence number that this TcpRxBuffer cannot accept
      */
     SequenceNumber32 MaxRxSequence() const;
     /**
-     * \brief Increment the Next Sequence number
+     * @brief Increment the Next Sequence number
      */
     void IncNextRxSequence();
     /**
-     * \brief Set the Next Sequence number
-     * \param s the Sequence number
+     * @brief Set the Next Sequence number
+     * @param s the Sequence number
      */
     void SetNextRxSequence(const SequenceNumber32& s);
     /**
-     * \brief Set the FIN Sequence number (i.e., the one closing the connection)
-     * \param s the Sequence number
+     * @brief Set the FIN Sequence number (i.e., the one closing the connection)
+     * @param s the Sequence number
      */
     void SetFinSequence(const SequenceNumber32& s);
     /**
-     * \brief Get the Maximum buffer size
-     * \returns the Maximum buffer size
+     * @brief Get the Maximum buffer size
+     * @returns the Maximum buffer size
      */
     uint32_t MaxBufferSize() const;
     /**
-     * \brief Set the Maximum buffer size
-     * \param s the Maximum buffer size
+     * @brief Set the Maximum buffer size
+     * @param s the Maximum buffer size
      */
     void SetMaxBufferSize(uint32_t s);
     /**
-     * \brief Get the actual buffer occupancy
-     * \returns buffer occupancy (in bytes)
+     * @brief Get the actual buffer occupancy
+     * @returns buffer occupancy (in bytes)
      */
     uint32_t Size() const;
     /**
-     * \brief Get the actual number of bytes available to be read
-     * \returns size of available data (in bytes)
+     * @brief Get the actual number of bytes available to be read
+     * @returns size of available data (in bytes)
      */
     uint32_t Available() const;
     /**
-     * \brief Check if the buffer did receive all the data (and the connection is closed)
-     * \returns true if all data have been received
+     * @brief Check if the buffer did receive all the data (and the connection is closed)
+     * @returns true if all data have been received
      */
     bool Finished();
 
@@ -134,9 +134,9 @@
      * removing data from the buffer that overlaps the tail of the inputted
      * packet
      *
-     * \param p packet
-     * \param tcph packet's TCP header
-     * \return True when success, false otherwise.
+     * @param p packet
+     * @param tcph packet's TCP header
+     * @return True when success, false otherwise.
      */
     bool Add(Ptr<Packet> p, const TcpHeader& tcph);
 
@@ -144,31 +144,31 @@
      * Extract data from the head of the buffer as indicated by nextRxSeq.
      * The extracted data is going to be forwarded to the application.
      *
-     * \param maxSize maximum number of bytes to extract
-     * \returns a packet
+     * @param maxSize maximum number of bytes to extract
+     * @returns a packet
      */
     Ptr<Packet> Extract(uint32_t maxSize);
 
     /**
-     * \brief Get the sack list
+     * @brief Get the sack list
      *
      * The sack list can be empty, and it is updated each time Add or Extract
      * are called through the private method UpdateSackList.
      *
-     * \return a list of isolated blocks
+     * @return a list of isolated blocks
      */
     TcpOptionSack::SackList GetSackList() const;
 
     /**
-     * \brief Get the size of Sack list
+     * @brief Get the size of Sack list
      *
-     * \return the size of the sack block list; can be empty
+     * @return the size of the sack block list; can be empty
      */
     uint32_t GetSackListSize() const;
 
     /**
-     * \brief Says if a FIN bit has been received
-     * \return true if we received a FIN bit
+     * @brief Says if a FIN bit has been received
+     * @return true if we received a FIN bit
      */
     bool GotFin() const
     {
@@ -177,7 +177,7 @@
 
   private:
     /**
-     * \brief Update the sack list, with the block seq starting at the beginning
+     * @brief Update the sack list, with the block seq starting at the beginning
      *
      * Note: the maximum size of the block list is 4. Caller is free to
      * drop blocks at the end to accommodate header size; from RFC 2018:
@@ -191,13 +191,13 @@
      * (or other) options, it is even less. For more detail about this function,
      * please see the source code and in-line comments.
      *
-     * \param head sequence number of the block at the beginning
-     * \param tail sequence number of the block at the end
+     * @param head sequence number of the block at the beginning
+     * @param tail sequence number of the block at the end
      */
     void UpdateSackList(const SequenceNumber32& head, const SequenceNumber32& tail);
 
     /**
-     * \brief Remove old blocks from the sack list
+     * @brief Remove old blocks from the sack list
      *
      * Used to remove blocks already delivered to the application.
      *
@@ -205,7 +205,7 @@
      * sequence numbers greater than seq; it is perfectly safe to call this
      * function with an empty sack list.
      *
-     * \param seq Last sequence to remove
+     * @param seq Last sequence to remove
      */
     void ClearSackList(const SequenceNumber32& seq);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/tcp-scalable.h ns-3.44/src/internet/model/tcp-scalable.h
--- ns-3.43/src/internet/model/tcp-scalable.h	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/model/tcp-scalable.h	2025-03-09 16:55:49.407371300 -0700
@@ -26,9 +26,9 @@
 class TcpSocketState;
 
 /**
- * \ingroup congestionOps
+ * @ingroup congestionOps
  *
- * \brief An implementation of TCP Scalable
+ * @brief An implementation of TCP Scalable
  *
  * Scalable improves TCP performance to better utilize the available bandwidth
  * of a highspeed wide area network by altering NewReno congestion window
@@ -54,8 +54,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -65,8 +65,8 @@
     TcpScalable();
 
     /**
-     * \brief Copy constructor
-     * \param sock the object to copy
+     * @brief Copy constructor
+     * @param sock the object to copy
      */
     TcpScalable(const TcpScalable& sock);
     ~TcpScalable() override;
@@ -74,12 +74,12 @@
     std::string GetName() const override;
 
     /**
-     * \brief Get slow start threshold following Scalable principle (Equation 2)
+     * @brief Get slow start threshold following Scalable principle (Equation 2)
      *
-     * \param tcb internal congestion state
-     * \param bytesInFlight bytes in flight
+     * @param tcb internal congestion state
+     * @param bytesInFlight bytes in flight
      *
-     * \return the slow start threshold value
+     * @return the slow start threshold value
      */
     uint32_t GetSsThresh(Ptr<const TcpSocketState> tcb, uint32_t bytesInFlight) override;
 
@@ -87,10 +87,10 @@
 
   protected:
     /**
-     * \brief Congestion avoidance of TcpScalable (Equation 1)
+     * @brief Congestion avoidance of TcpScalable (Equation 1)
      *
-     * \param tcb internal congestion state
-     * \param segmentsAcked count of segments acked
+     * @param tcb internal congestion state
+     * @param segmentsAcked count of segments acked
      */
     void CongestionAvoidance(Ptr<TcpSocketState> tcb, uint32_t segmentsAcked) override;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/tcp-socket-base.cc ns-3.44/src/internet/model/tcp-socket-base.cc
--- ns-3.43/src/internet/model/tcp-socket-base.cc	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/model/tcp-socket-base.cc	2025-03-09 16:55:49.407371300 -0700
@@ -58,7 +58,7 @@
 {
 
 /**
- * \brief map TcpPacketType and EcnMode to boolean value to check whether ECN-marking is allowed or
+ * @brief map TcpPacketType and EcnMode to boolean value to check whether ECN-marking is allowed or
  * not
  */
 const std::map<std::pair<ns3::TcpSocketBase::TcpPacketType_t, ns3::TcpSocketState::EcnMode_t>, bool>
@@ -142,7 +142,7 @@
             .AddAttribute(
                 "MinRto",
                 "Minimum retransmit timeout value",
-                TimeValue(Seconds(1.0)), // RFC 6298 says min RTO=1 sec, but Linux uses 200ms.
+                TimeValue(Seconds(1)), // RFC 6298 says min RTO=1 sec, but Linux uses 200ms.
                 // See http://www.postel.org/pipermail/end2end-interest/2004-November/004402.html
                 MakeTimeAccessor(&TcpSocketBase::SetMinRto, &TcpSocketBase::GetMinRto),
                 MakeTimeChecker())
@@ -808,7 +808,7 @@
 TcpSocketBase::Close()
 {
     NS_LOG_FUNCTION(this);
-    /// \internal
+    /// @internal
     /// First we check to see if there is any unread rx data.
     /// \bugid{426} claims we should send reset in this case.
     if (m_tcb->m_rxBuffer->Size() != 0)
@@ -1553,7 +1553,7 @@
             NS_LOG_WARN("Ignored ack of " << tcpHeader.GetAckNumber()
                                           << " HighTxMark = " << m_tcb->m_highTxMark);
 
-            // Receiver sets ECE flags when it receives a packet with CE bit on or sender hasn’t
+            // Receiver sets ECE flags when it receives a packet with CE bit on or sender hasn't
             // responded to ECN echo sent by receiver
             if (m_tcb->m_ecnState == TcpSocketState::ECN_CE_RCVD ||
                 m_tcb->m_ecnState == TcpSocketState::ECN_SENDING_ECE)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/tcp-socket-base.h ns-3.44/src/internet/model/tcp-socket-base.h
--- ns-3.43/src/internet/model/tcp-socket-base.h	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/model/tcp-socket-base.h	2025-03-09 16:55:49.411371200 -0700
@@ -43,23 +43,23 @@
 class TcpRateOps;
 
 /**
- * \ingroup tcp
+ * @ingroup tcp
  *
- * \brief Helper class to store RTT measurements
+ * @brief Helper class to store RTT measurements
  */
 class RttHistory
 {
   public:
     /**
-     * \brief Constructor - builds an RttHistory with the given parameters
-     * \param s First sequence number in packet sent
-     * \param c Number of bytes sent
-     * \param t Time this one was sent
+     * @brief Constructor - builds an RttHistory with the given parameters
+     * @param s First sequence number in packet sent
+     * @param c Number of bytes sent
+     * @param t Time this one was sent
      */
     RttHistory(SequenceNumber32 s, uint32_t c, Time t);
     /**
-     * \brief Copy constructor
-     * \param h the object to copy
+     * @brief Copy constructor
+     * @param h the object to copy
      */
     RttHistory(const RttHistory& h); // Copy constructor
   public:
@@ -70,10 +70,10 @@
 };
 
 /**
- * \ingroup socket
- * \ingroup tcp
+ * @ingroup socket
+ * @ingroup tcp
  *
- * \brief A base class for implementation of a stream socket using TCP.
+ * @brief A base class for implementation of a stream socket using TCP.
  *
  * This class contains the essential components of TCP, as well as a sockets
  * interface for upper layers to call. This class provides connection orientation
@@ -210,20 +210,20 @@
   public:
     /**
      * Get the type ID.
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Get the instance TypeId
-     * \return the instance TypeId
+     * @brief Get the instance TypeId
+     * @return the instance TypeId
      */
     TypeId GetInstanceTypeId() const override;
 
     /**
-     * \brief TcpGeneralTest friend class (for tests).
-     * \relates TcpGeneralTest
+     * @brief TcpGeneralTest friend class (for tests).
+     * @relates TcpGeneralTest
      */
     friend class TcpGeneralTest;
 
@@ -235,13 +235,13 @@
     /**
      * Clone a TCP socket, for use upon receiving a connection request in LISTEN state
      *
-     * \param sock the original Tcp Socket
+     * @param sock the original Tcp Socket
      */
     TcpSocketBase(const TcpSocketBase& sock);
     ~TcpSocketBase() override;
 
     /**
-     * \brief Tcp Packet Types
+     * @brief Tcp Packet Types
      *
      * Taxonomy referred from Table 1 of
      * https://www.ietf.org/archive/id/draft-ietf-tcpm-generalized-ecn-15.txt
@@ -262,68 +262,68 @@
     // Set associated Node, TcpL4Protocol, RttEstimator to this socket
 
     /**
-     * \brief Set the associated node.
-     * \param node the node
+     * @brief Set the associated node.
+     * @param node the node
      */
     virtual void SetNode(Ptr<Node> node);
 
     /**
-     * \brief Set the associated TCP L4 protocol.
-     * \param tcp the TCP L4 protocol
+     * @brief Set the associated TCP L4 protocol.
+     * @param tcp the TCP L4 protocol
      */
     virtual void SetTcp(Ptr<TcpL4Protocol> tcp);
 
     /**
-     * \brief Set the associated RTT estimator.
-     * \param rtt the RTT estimator
+     * @brief Set the associated RTT estimator.
+     * @param rtt the RTT estimator
      */
     virtual void SetRtt(Ptr<RttEstimator> rtt);
 
     /**
-     * \brief Sets the Minimum RTO.
-     * \param minRto The minimum RTO.
+     * @brief Sets the Minimum RTO.
+     * @param minRto The minimum RTO.
      */
     void SetMinRto(Time minRto);
 
     /**
-     * \brief Get the Minimum RTO.
-     * \return The minimum RTO.
+     * @brief Get the Minimum RTO.
+     * @return The minimum RTO.
      */
     Time GetMinRto() const;
 
     /**
-     * \brief Sets the Clock Granularity (used in RTO calcs).
-     * \param clockGranularity The Clock Granularity
+     * @brief Sets the Clock Granularity (used in RTO calcs).
+     * @param clockGranularity The Clock Granularity
      */
     void SetClockGranularity(Time clockGranularity);
 
     /**
-     * \brief Get the Clock Granularity (used in RTO calcs).
-     * \return The Clock Granularity.
+     * @brief Get the Clock Granularity (used in RTO calcs).
+     * @return The Clock Granularity.
      */
     Time GetClockGranularity() const;
 
     /**
-     * \brief Get a pointer to the Tx buffer
-     * \return a pointer to the tx buffer
+     * @brief Get a pointer to the Tx buffer
+     * @return a pointer to the tx buffer
      */
     Ptr<TcpTxBuffer> GetTxBuffer() const;
 
     /**
-     * \brief Get a pointer to the Rx buffer
-     * \return a pointer to the rx buffer
+     * @brief Get a pointer to the Rx buffer
+     * @return a pointer to the rx buffer
      */
     Ptr<TcpRxBuffer> GetRxBuffer() const;
 
     /**
-     * \brief Set the retransmission threshold (dup ack threshold for a fast retransmit)
-     * \param retxThresh the threshold
+     * @brief Set the retransmission threshold (dup ack threshold for a fast retransmit)
+     * @param retxThresh the threshold
      */
     void SetRetxThresh(uint32_t retxThresh);
 
     /**
-     * \brief Get the retransmission threshold (dup ack threshold for a fast retransmit)
-     * \return the threshold
+     * @brief Get the retransmission threshold (dup ack threshold for a fast retransmit)
+     * @return the threshold
      */
     uint32_t GetRetxThresh() const
     {
@@ -331,158 +331,158 @@
     }
 
     /**
-     * \brief Callback pointer for pacing rate trace chaining
+     * @brief Callback pointer for pacing rate trace chaining
      */
     TracedCallback<DataRate, DataRate> m_pacingRateTrace;
 
     /**
-     * \brief Callback pointer for cWnd trace chaining
+     * @brief Callback pointer for cWnd trace chaining
      */
     TracedCallback<uint32_t, uint32_t> m_cWndTrace;
 
     /**
-     * \brief Callback pointer for cWndInfl trace chaining
+     * @brief Callback pointer for cWndInfl trace chaining
      */
     TracedCallback<uint32_t, uint32_t> m_cWndInflTrace;
 
     /**
-     * \brief Callback pointer for ssTh trace chaining
+     * @brief Callback pointer for ssTh trace chaining
      */
     TracedCallback<uint32_t, uint32_t> m_ssThTrace;
 
     /**
-     * \brief Callback pointer for congestion state trace chaining
+     * @brief Callback pointer for congestion state trace chaining
      */
     TracedCallback<TcpSocketState::TcpCongState_t, TcpSocketState::TcpCongState_t> m_congStateTrace;
 
     /**
-     * \brief Callback pointer for ECN state trace chaining
+     * @brief Callback pointer for ECN state trace chaining
      */
     TracedCallback<TcpSocketState::EcnState_t, TcpSocketState::EcnState_t> m_ecnStateTrace;
 
     /**
-     * \brief Callback pointer for high tx mark chaining
+     * @brief Callback pointer for high tx mark chaining
      */
     TracedCallback<SequenceNumber32, SequenceNumber32> m_highTxMarkTrace;
 
     /**
-     * \brief Callback pointer for next tx sequence chaining
+     * @brief Callback pointer for next tx sequence chaining
      */
     TracedCallback<SequenceNumber32, SequenceNumber32> m_nextTxSequenceTrace;
 
     /**
-     * \brief Callback pointer for bytesInFlight trace chaining
+     * @brief Callback pointer for bytesInFlight trace chaining
      */
     TracedCallback<uint32_t, uint32_t> m_bytesInFlightTrace;
 
     /**
-     * \brief Callback pointer for RTT trace chaining
+     * @brief Callback pointer for RTT trace chaining
      */
     TracedCallback<Time, Time> m_srttTrace;
 
     /**
-     * \brief Callback pointer for Last RTT trace chaining
+     * @brief Callback pointer for Last RTT trace chaining
      */
     TracedCallback<Time, Time> m_lastRttTrace;
 
     /**
-     * \brief Callback function to hook to TcpSocketState pacing rate
-     * \param oldValue old pacing rate value
-     * \param newValue new pacing rate value
+     * @brief Callback function to hook to TcpSocketState pacing rate
+     * @param oldValue old pacing rate value
+     * @param newValue new pacing rate value
      */
     void UpdatePacingRateTrace(DataRate oldValue, DataRate newValue) const;
 
     /**
-     * \brief Callback function to hook to TcpSocketState congestion window
-     * \param oldValue old cWnd value
-     * \param newValue new cWnd value
+     * @brief Callback function to hook to TcpSocketState congestion window
+     * @param oldValue old cWnd value
+     * @param newValue new cWnd value
      */
     void UpdateCwnd(uint32_t oldValue, uint32_t newValue) const;
 
     /**
-     * \brief Callback function to hook to TcpSocketState inflated congestion window
-     * \param oldValue old cWndInfl value
-     * \param newValue new cWndInfl value
+     * @brief Callback function to hook to TcpSocketState inflated congestion window
+     * @param oldValue old cWndInfl value
+     * @param newValue new cWndInfl value
      */
     void UpdateCwndInfl(uint32_t oldValue, uint32_t newValue) const;
 
     /**
-     * \brief Callback function to hook to TcpSocketState slow start threshold
-     * \param oldValue old ssTh value
-     * \param newValue new ssTh value
+     * @brief Callback function to hook to TcpSocketState slow start threshold
+     * @param oldValue old ssTh value
+     * @param newValue new ssTh value
      */
     void UpdateSsThresh(uint32_t oldValue, uint32_t newValue) const;
 
     /**
-     * \brief Callback function to hook to TcpSocketState congestion state
-     * \param oldValue old congestion state value
-     * \param newValue new congestion state value
+     * @brief Callback function to hook to TcpSocketState congestion state
+     * @param oldValue old congestion state value
+     * @param newValue new congestion state value
      */
     void UpdateCongState(TcpSocketState::TcpCongState_t oldValue,
                          TcpSocketState::TcpCongState_t newValue) const;
 
     /**
-     * \brief Callback function to hook to EcnState state
-     * \param oldValue old ecn state value
-     * \param newValue new ecn state value
+     * @brief Callback function to hook to EcnState state
+     * @param oldValue old ecn state value
+     * @param newValue new ecn state value
      */
     void UpdateEcnState(TcpSocketState::EcnState_t oldValue,
                         TcpSocketState::EcnState_t newValue) const;
 
     /**
-     * \brief Callback function to hook to TcpSocketState high tx mark
-     * \param oldValue old high tx mark
-     * \param newValue new high tx mark
+     * @brief Callback function to hook to TcpSocketState high tx mark
+     * @param oldValue old high tx mark
+     * @param newValue new high tx mark
      */
     void UpdateHighTxMark(SequenceNumber32 oldValue, SequenceNumber32 newValue) const;
 
     /**
-     * \brief Callback function to hook to TcpSocketState next tx sequence
-     * \param oldValue old nextTxSeq value
-     * \param newValue new nextTxSeq value
+     * @brief Callback function to hook to TcpSocketState next tx sequence
+     * @param oldValue old nextTxSeq value
+     * @param newValue new nextTxSeq value
      */
     void UpdateNextTxSequence(SequenceNumber32 oldValue, SequenceNumber32 newValue) const;
 
     /**
-     * \brief Callback function to hook to TcpSocketState bytes inflight
-     * \param oldValue old bytesInFlight value
-     * \param newValue new bytesInFlight value
+     * @brief Callback function to hook to TcpSocketState bytes inflight
+     * @param oldValue old bytesInFlight value
+     * @param newValue new bytesInFlight value
      */
     void UpdateBytesInFlight(uint32_t oldValue, uint32_t newValue) const;
 
     /**
-     * \brief Callback function to hook to TcpSocketState rtt
-     * \param oldValue old rtt value
-     * \param newValue new rtt value
+     * @brief Callback function to hook to TcpSocketState rtt
+     * @param oldValue old rtt value
+     * @param newValue new rtt value
      */
     void UpdateRtt(Time oldValue, Time newValue) const;
 
     /**
-     * \brief Callback function to hook to TcpSocketState lastRtt
-     * \param oldValue old lastRtt value
-     * \param newValue new lastRtt value
+     * @brief Callback function to hook to TcpSocketState lastRtt
+     * @param oldValue old lastRtt value
+     * @param newValue new lastRtt value
      */
     void UpdateLastRtt(Time oldValue, Time newValue) const;
 
     /**
-     * \brief Install a congestion control algorithm on this socket
+     * @brief Install a congestion control algorithm on this socket
      *
-     * \param algo Algorithm to be installed
+     * @param algo Algorithm to be installed
      */
     void SetCongestionControlAlgorithm(Ptr<TcpCongestionOps> algo);
 
     /**
-     * \brief Install a recovery algorithm on this socket
+     * @brief Install a recovery algorithm on this socket
      *
-     * \param recovery Algorithm to be installed
+     * @param recovery Algorithm to be installed
      */
     void SetRecoveryAlgorithm(Ptr<TcpRecoveryOps> recovery);
 
     /**
-     * \brief Mark ECT(0) codepoint
+     * @brief Mark ECT(0) codepoint
      *
-     * \param tos the TOS byte to modify
-     * \return TOS with ECT(0) codepoint set
+     * @param tos the TOS byte to modify
+     * @return TOS with ECT(0) codepoint set
      */
     inline uint8_t MarkEcnEct0(uint8_t tos) const
     {
@@ -490,10 +490,10 @@
     }
 
     /**
-     * \brief Mark ECT(1) codepoint
+     * @brief Mark ECT(1) codepoint
      *
-     * \param tos the TOS byte to modify
-     * \return TOS with ECT(1) codepoint set
+     * @param tos the TOS byte to modify
+     * @return TOS with ECT(1) codepoint set
      */
     inline uint8_t MarkEcnEct1(uint8_t tos) const
     {
@@ -501,10 +501,10 @@
     }
 
     /**
-     * \brief Mark CE codepoint
+     * @brief Mark CE codepoint
      *
-     * \param tos the TOS byte to modify
-     * \return TOS with CE codepoint set
+     * @param tos the TOS byte to modify
+     * @return TOS with CE codepoint set
      */
     inline uint8_t MarkEcnCe(uint8_t tos) const
     {
@@ -512,10 +512,10 @@
     }
 
     /**
-     * \brief Clears ECN bits from TOS
+     * @brief Clears ECN bits from TOS
      *
-     * \param tos the TOS byte to modify
-     * \return TOS without ECN bits
+     * @param tos the TOS byte to modify
+     * @return TOS without ECN bits
      */
     inline uint8_t ClearEcnBits(uint8_t tos) const
     {
@@ -523,10 +523,10 @@
     }
 
     /**
-     * \brief Checks if TOS has no ECN codepoints
+     * @brief Checks if TOS has no ECN codepoints
      *
-     * \param tos the TOS byte to check
-     * \return true if TOS does not have any ECN codepoints set; otherwise false
+     * @param tos the TOS byte to check
+     * @return true if TOS does not have any ECN codepoints set; otherwise false
      */
     inline bool CheckNoEcn(uint8_t tos) const
     {
@@ -534,10 +534,10 @@
     }
 
     /**
-     * \brief Checks for ECT(0) codepoint
+     * @brief Checks for ECT(0) codepoint
      *
-     * \param tos the TOS byte to check
-     * \return true if TOS has ECT(0) codepoint set; otherwise false
+     * @param tos the TOS byte to check
+     * @return true if TOS has ECT(0) codepoint set; otherwise false
      */
     inline bool CheckEcnEct0(uint8_t tos) const
     {
@@ -545,10 +545,10 @@
     }
 
     /**
-     * \brief Checks for ECT(1) codepoint
+     * @brief Checks for ECT(1) codepoint
      *
-     * \param tos the TOS byte to check
-     * \return true if TOS has ECT(1) codepoint set; otherwise false
+     * @param tos the TOS byte to check
+     * @return true if TOS has ECT(1) codepoint set; otherwise false
      */
     inline bool CheckEcnEct1(uint8_t tos) const
     {
@@ -556,10 +556,10 @@
     }
 
     /**
-     * \brief Checks for CE codepoint
+     * @brief Checks for CE codepoint
      *
-     * \param tos the TOS byte to check
-     * \return true if TOS has CE codepoint set; otherwise false
+     * @param tos the TOS byte to check
+     * @return true if TOS has CE codepoint set; otherwise false
      */
     inline bool CheckEcnCe(uint8_t tos) const
     {
@@ -567,11 +567,11 @@
     }
 
     /**
-     * \brief mark ECN code point
+     * @brief mark ECN code point
      *
-     * \param tos the TOS byte to modify
-     * \param codePoint the codepoint to use
-     * \return TOS with specified ECN code point
+     * @param tos the TOS byte to modify
+     * @param codePoint the codepoint to use
+     * @return TOS with specified ECN code point
      */
     inline uint8_t MarkEcnCodePoint(const uint8_t tos,
                                     const TcpSocketState::EcnCodePoint_t codePoint) const
@@ -580,33 +580,33 @@
     }
 
     /**
-     * \brief Set ECN mode of use on the socket
+     * @brief Set ECN mode of use on the socket
      *
-     * \param useEcn Mode of ECN to use.
+     * @param useEcn Mode of ECN to use.
      */
     void SetUseEcn(TcpSocketState::UseEcn_t useEcn);
 
     /**
-     * \brief Enable or disable pacing
-     * \param pacing Boolean to enable or disable pacing
+     * @brief Enable or disable pacing
+     * @param pacing Boolean to enable or disable pacing
      */
     void SetPacingStatus(bool pacing);
 
     /**
-     * \brief Enable or disable pacing of the initial window
-     * \param paceWindow Boolean to enable or disable pacing of the initial window
+     * @brief Enable or disable pacing of the initial window
+     * @param paceWindow Boolean to enable or disable pacing of the initial window
      */
     void SetPaceInitialWindow(bool paceWindow);
 
     /**
-     * \brief Checks if a TCP packet should be ECN-capable (ECT) according to the TcpPacketType and
+     * @brief Checks if a TCP packet should be ECN-capable (ECT) according to the TcpPacketType and
      * ECN mode.
      *
      * Currently, only Classic ECN and DCTCP ECN modes are supported, with
      * potential extensions for future modes (Ecnpp).
      *
-     * \param packetType The type of the TCP packet, represented by an enum TcpPacketType.
-     * \return true if the packet is ECN-capable (ECT), false otherwise.
+     * @param packetType The type of the TCP packet, represented by an enum TcpPacketType.
+     * @return true if the packet is ECN-capable (ECT), false otherwise.
      *
      * Reference: https://www.ietf.org/archive/id/draft-ietf-tcpm-generalized-ecn-15.txt (Table 1)
      */
@@ -644,9 +644,9 @@
     /**
      * TracedCallback signature for TCP packet transmission or reception events.
      *
-     * \param [in] packet The packet.
-     * \param [in] header The TcpHeader
-     * \param [in] socket This socket
+     * @param [in] packet The packet.
+     * @param [in] header The TcpHeader
+     * @param [in] socket This socket
      */
     typedef void (*TcpTxRxTracedCallback)(const Ptr<const Packet> packet,
                                           const TcpHeader& header,
@@ -655,11 +655,11 @@
     /**
      * TracedCallback signature for TCP packet retransmission events.
      *
-     * \param [in] packet The packet.
-     * \param [in] header The TcpHeader
-     * \param [in] localAddr The local address
-     * \param [in] peerAddr The peer/remote address
-     * \param [in] socket This socket
+     * @param [in] packet The packet.
+     * @param [in] header The TcpHeader
+     * @param [in] localAddr The local address
+     * @param [in] peerAddr The peer/remote address
+     * @param [in] socket This socket
      */
     typedef void (*RetransmissionCallback)(const Ptr<const Packet> packet,
                                            const TcpHeader& header,
@@ -701,51 +701,51 @@
     // Helper functions: Connection set up
 
     /**
-     * \brief Common part of the two Bind(), i.e. set callback and remembering local addr:port
+     * @brief Common part of the two Bind(), i.e. set callback and remembering local addr:port
      *
-     * \returns 0 on success, -1 on failure
+     * @returns 0 on success, -1 on failure
      */
     int SetupCallback();
 
     /**
-     * \brief Perform the real connection tasks: Send SYN if allowed, RST if invalid
+     * @brief Perform the real connection tasks: Send SYN if allowed, RST if invalid
      *
-     * \returns 0 on success
+     * @returns 0 on success
      */
     int DoConnect();
 
     /**
-     * \brief Schedule-friendly wrapper for Socket::NotifyConnectionSucceeded()
+     * @brief Schedule-friendly wrapper for Socket::NotifyConnectionSucceeded()
      */
     void ConnectionSucceeded();
 
     /**
-     * \brief Configure the endpoint to a local address. Called by Connect() if Bind() didn't
+     * @brief Configure the endpoint to a local address. Called by Connect() if Bind() didn't
      * specify one.
      *
-     * \returns 0 on success
+     * @returns 0 on success
      */
     int SetupEndpoint();
 
     /**
-     * \brief Configure the endpoint v6 to a local address. Called by Connect() if Bind() didn't
+     * @brief Configure the endpoint v6 to a local address. Called by Connect() if Bind() didn't
      * specify one.
      *
-     * \returns 0 on success
+     * @returns 0 on success
      */
     int SetupEndpoint6();
 
     /**
-     * \brief Complete a connection by forking the socket
+     * @brief Complete a connection by forking the socket
      *
      * This function is called only if a SYN received in LISTEN state. After
      * TcpSocketBase cloned, allocate a new end point to handle the incoming
      * connection and send a SYN+ACK to complete the handshake.
      *
-     * \param p the packet triggering the fork
-     * \param tcpHeader the TCP header of the triggering packet
-     * \param fromAddress the address of the remote host
-     * \param toAddress the address the connection is directed to
+     * @param p the packet triggering the fork
+     * @param tcpHeader the TCP header of the triggering packet
+     * @param fromAddress the address of the remote host
+     * @param toAddress the address the connection is directed to
      */
     virtual void CompleteFork(Ptr<Packet> p,
                               const TcpHeader& tcpHeader,
@@ -755,24 +755,24 @@
     // Helper functions: Transfer operation
 
     /**
-     * \brief Checks whether the given TCP segment is valid or not.
+     * @brief Checks whether the given TCP segment is valid or not.
      *
-     * \param seq the sequence number of packet's TCP header
-     * \param tcpHeaderSize the size of packet's TCP header
-     * \param tcpPayloadSize the size of TCP payload
-     * \return true if the TCP segment is valid
+     * @param seq the sequence number of packet's TCP header
+     * @param tcpHeaderSize the size of packet's TCP header
+     * @param tcpPayloadSize the size of TCP payload
+     * @return true if the TCP segment is valid
      */
     bool IsValidTcpSegment(const SequenceNumber32 seq,
                            const uint32_t tcpHeaderSize,
                            const uint32_t tcpPayloadSize);
 
     /**
-     * \brief Called by the L3 protocol when it received a packet to pass on to TCP.
+     * @brief Called by the L3 protocol when it received a packet to pass on to TCP.
      *
-     * \param packet the incoming packet
-     * \param header the packet's IPv4 header
-     * \param port the remote port
-     * \param incomingInterface the incoming interface
+     * @param packet the incoming packet
+     * @param header the packet's IPv4 header
+     * @param port the remote port
+     * @param incomingInterface the incoming interface
      */
     void ForwardUp(Ptr<Packet> packet,
                    Ipv4Header header,
@@ -780,12 +780,12 @@
                    Ptr<Ipv4Interface> incomingInterface);
 
     /**
-     * \brief Called by the L3 protocol when it received a packet to pass on to TCP.
+     * @brief Called by the L3 protocol when it received a packet to pass on to TCP.
      *
-     * \param packet the incoming packet
-     * \param header the packet's IPv6 header
-     * \param port the remote port
-     * \param incomingInterface the incoming interface
+     * @param packet the incoming packet
+     * @param header the packet's IPv6 header
+     * @param port the remote port
+     * @param incomingInterface the incoming interface
      */
     void ForwardUp6(Ptr<Packet> packet,
                     Ipv6Header header,
@@ -793,29 +793,29 @@
                     Ptr<Ipv6Interface> incomingInterface);
 
     /**
-     * \brief Called by TcpSocketBase::ForwardUp{,6}().
+     * @brief Called by TcpSocketBase::ForwardUp{,6}().
      *
      * Get a packet from L3. This is the real function to handle the
      * incoming packet from lower layers. This is
      * wrapped by ForwardUp() so that this function can be overloaded by daughter
      * classes.
      *
-     * \param packet the incoming packet
-     * \param fromAddress the address of the sender of packet
-     * \param toAddress the address of the receiver of packet (hopefully, us)
+     * @param packet the incoming packet
+     * @param fromAddress the address of the sender of packet
+     * @param toAddress the address of the receiver of packet (hopefully, us)
      */
     virtual void DoForwardUp(Ptr<Packet> packet,
                              const Address& fromAddress,
                              const Address& toAddress);
 
     /**
-     * \brief Called by the L3 protocol when it received an ICMP packet to pass on to TCP.
+     * @brief Called by the L3 protocol when it received an ICMP packet to pass on to TCP.
      *
-     * \param icmpSource the ICMP source address
-     * \param icmpTtl the ICMP Time to Live
-     * \param icmpType the ICMP Type
-     * \param icmpCode the ICMP Code
-     * \param icmpInfo the ICMP Info
+     * @param icmpSource the ICMP source address
+     * @param icmpTtl the ICMP Time to Live
+     * @param icmpType the ICMP Type
+     * @param icmpCode the ICMP Code
+     * @param icmpInfo the ICMP Info
      */
     void ForwardIcmp(Ipv4Address icmpSource,
                      uint8_t icmpTtl,
@@ -824,13 +824,13 @@
                      uint32_t icmpInfo);
 
     /**
-     * \brief Called by the L3 protocol when it received an ICMPv6 packet to pass on to TCP.
+     * @brief Called by the L3 protocol when it received an ICMPv6 packet to pass on to TCP.
      *
-     * \param icmpSource the ICMP source address
-     * \param icmpTtl the ICMP Time to Live
-     * \param icmpType the ICMP Type
-     * \param icmpCode the ICMP Code
-     * \param icmpInfo the ICMP Info
+     * @param icmpSource the ICMP source address
+     * @param icmpTtl the ICMP Time to Live
+     * @param icmpType the ICMP Type
+     * @param icmpCode the ICMP Code
+     * @param icmpInfo the ICMP Info
      */
     void ForwardIcmp6(Ipv6Address icmpSource,
                       uint8_t icmpTtl,
@@ -839,63 +839,63 @@
                       uint32_t icmpInfo);
 
     /**
-     * \brief Send as much pending data as possible according to the Tx window.
+     * @brief Send as much pending data as possible according to the Tx window.
      *
      * Note that this function did not implement the PSH flag.
      *
-     * \param withAck forces an ACK to be sent
-     * \returns the number of packets sent
+     * @param withAck forces an ACK to be sent
+     * @returns the number of packets sent
      */
     uint32_t SendPendingData(bool withAck = false);
 
     /**
-     * \brief Extract at most maxSize bytes from the TxBuffer at sequence seq, add the
+     * @brief Extract at most maxSize bytes from the TxBuffer at sequence seq, add the
      *        TCP header, and send to TcpL4Protocol
      *
-     * \param seq the sequence number
-     * \param maxSize the maximum data block to be transmitted (in bytes)
-     * \param withAck forces an ACK to be sent
-     * \returns the number of bytes sent
+     * @param seq the sequence number
+     * @param maxSize the maximum data block to be transmitted (in bytes)
+     * @param withAck forces an ACK to be sent
+     * @returns the number of bytes sent
      */
     virtual uint32_t SendDataPacket(SequenceNumber32 seq, uint32_t maxSize, bool withAck);
 
     /**
-     * \brief Send a empty packet that carries a flag, e.g., ACK
+     * @brief Send a empty packet that carries a flag, e.g., ACK
      *
-     * \param flags the packet's flags
+     * @param flags the packet's flags
      */
     virtual void SendEmptyPacket(uint8_t flags);
 
     /**
-     * \brief Send reset and tear down this socket
+     * @brief Send reset and tear down this socket
      */
     void SendRST();
 
     /**
-     * \brief Check if a sequence number range is within the rx window
+     * @brief Check if a sequence number range is within the rx window
      *
-     * \param head start of the Sequence window
-     * \param tail end of the Sequence window
-     * \returns true if it is in range
+     * @param head start of the Sequence window
+     * @param tail end of the Sequence window
+     * @returns true if it is in range
      */
     bool OutOfRange(SequenceNumber32 head, SequenceNumber32 tail) const;
 
     // Helper functions: Connection close
 
     /**
-     * \brief Close a socket by sending RST, FIN, or FIN+ACK, depend on the current state
+     * @brief Close a socket by sending RST, FIN, or FIN+ACK, depend on the current state
      *
-     * \returns 0 on success
+     * @returns 0 on success
      */
     int DoClose();
 
     /**
-     * \brief Peacefully close the socket by notifying the upper layer and deallocate end point
+     * @brief Peacefully close the socket by notifying the upper layer and deallocate end point
      */
     void CloseAndNotify();
 
     /**
-     * \brief Kill this socket by zeroing its attributes (IPv4)
+     * @brief Kill this socket by zeroing its attributes (IPv4)
      *
      * This is a callback function configured to m_endpoint in
      * SetupCallback(), invoked when the endpoint is destroyed.
@@ -903,7 +903,7 @@
     void Destroy();
 
     /**
-     * \brief Kill this socket by zeroing its attributes (IPv6)
+     * @brief Kill this socket by zeroing its attributes (IPv6)
      *
      * This is a callback function configured to m_endpoint in
      * SetupCallback(), invoked when the endpoint is destroyed.
@@ -911,53 +911,53 @@
     void Destroy6();
 
     /**
-     * \brief Deallocate m_endPoint and m_endPoint6
+     * @brief Deallocate m_endPoint and m_endPoint6
      */
     void DeallocateEndPoint();
 
     /**
-     * \brief Received a FIN from peer, notify rx buffer
+     * @brief Received a FIN from peer, notify rx buffer
      *
-     * \param p the packet
-     * \param tcpHeader the packet's TCP header
+     * @param p the packet
+     * @param tcpHeader the packet's TCP header
      */
     void PeerClose(Ptr<Packet> p, const TcpHeader& tcpHeader);
 
     /**
-     * \brief FIN is in sequence, notify app and respond with a FIN
+     * @brief FIN is in sequence, notify app and respond with a FIN
      */
     void DoPeerClose();
 
     /**
-     * \brief Cancel all timer when endpoint is deleted
+     * @brief Cancel all timer when endpoint is deleted
      */
     void CancelAllTimers();
 
     /**
-     * \brief Move from CLOSING or FIN_WAIT_2 to TIME_WAIT state
+     * @brief Move from CLOSING or FIN_WAIT_2 to TIME_WAIT state
      */
     void TimeWait();
 
     // State transition functions
 
     /**
-     * \brief Received a packet upon ESTABLISHED state.
+     * @brief Received a packet upon ESTABLISHED state.
      *
      * This function is mimicking the role of tcp_rcv_established() in tcp_input.c in Linux kernel.
      *
-     * \param packet the packet
-     * \param tcpHeader the packet's TCP header
+     * @param packet the packet
+     * @param tcpHeader the packet's TCP header
      */
     void ProcessEstablished(Ptr<Packet> packet,
                             const TcpHeader& tcpHeader); // Received a packet upon ESTABLISHED state
 
     /**
-     * \brief Received a packet upon LISTEN state.
+     * @brief Received a packet upon LISTEN state.
      *
-     * \param packet the packet
-     * \param tcpHeader the packet's TCP header
-     * \param fromAddress the source address
-     * \param toAddress the destination address
+     * @param packet the packet
+     * @param tcpHeader the packet's TCP header
+     * @param fromAddress the source address
+     * @param toAddress the destination address
      */
     void ProcessListen(Ptr<Packet> packet,
                        const TcpHeader& tcpHeader,
@@ -965,20 +965,20 @@
                        const Address& toAddress);
 
     /**
-     * \brief Received a packet upon SYN_SENT
+     * @brief Received a packet upon SYN_SENT
      *
-     * \param packet the packet
-     * \param tcpHeader the packet's TCP header
+     * @param packet the packet
+     * @param tcpHeader the packet's TCP header
      */
     void ProcessSynSent(Ptr<Packet> packet, const TcpHeader& tcpHeader);
 
     /**
-     * \brief Received a packet upon SYN_RCVD.
+     * @brief Received a packet upon SYN_RCVD.
      *
-     * \param packet the packet
-     * \param tcpHeader the packet's TCP header
-     * \param fromAddress the source address
-     * \param toAddress the destination address
+     * @param packet the packet
+     * @param tcpHeader the packet's TCP header
+     * @param fromAddress the source address
+     * @param toAddress the destination address
      */
     void ProcessSynRcvd(Ptr<Packet> packet,
                         const TcpHeader& tcpHeader,
@@ -986,71 +986,71 @@
                         const Address& toAddress);
 
     /**
-     * \brief Received a packet upon CLOSE_WAIT, FIN_WAIT_1, FIN_WAIT_2
+     * @brief Received a packet upon CLOSE_WAIT, FIN_WAIT_1, FIN_WAIT_2
      *
-     * \param packet the packet
-     * \param tcpHeader the packet's TCP header
+     * @param packet the packet
+     * @param tcpHeader the packet's TCP header
      */
     void ProcessWait(Ptr<Packet> packet, const TcpHeader& tcpHeader);
 
     /**
-     * \brief Received a packet upon CLOSING
+     * @brief Received a packet upon CLOSING
      *
-     * \param packet the packet
-     * \param tcpHeader the packet's TCP header
+     * @param packet the packet
+     * @param tcpHeader the packet's TCP header
      */
     void ProcessClosing(Ptr<Packet> packet, const TcpHeader& tcpHeader);
 
     /**
-     * \brief Received a packet upon LAST_ACK
+     * @brief Received a packet upon LAST_ACK
      *
-     * \param packet the packet
-     * \param tcpHeader the packet's TCP header
+     * @param packet the packet
+     * @param tcpHeader the packet's TCP header
      */
     void ProcessLastAck(Ptr<Packet> packet, const TcpHeader& tcpHeader);
 
     // Window management
 
     /**
-     * \brief Return count of number of unacked bytes
+     * @brief Return count of number of unacked bytes
      *
      * The difference between SND.UNA and HighTx
      *
-     * \returns count of number of unacked bytes
+     * @returns count of number of unacked bytes
      */
     virtual uint32_t UnAckDataCount() const;
 
     /**
-     * \brief Return total bytes in flight
+     * @brief Return total bytes in flight
      *
      * Does not count segments lost and SACKed (or dupACKed)
      *
-     * \returns total bytes in flight
+     * @returns total bytes in flight
      */
     virtual uint32_t BytesInFlight() const;
 
     /**
-     * \brief Return the max possible number of unacked bytes
-     * \returns the max possible number of unacked bytes
+     * @brief Return the max possible number of unacked bytes
+     * @returns the max possible number of unacked bytes
      */
     virtual uint32_t Window() const;
 
     /**
-     * \brief Return unfilled portion of window
-     * \return unfilled portion of window
+     * @brief Return unfilled portion of window
+     * @return unfilled portion of window
      */
     virtual uint32_t AvailableWindow() const;
 
     /**
-     * \brief The amount of Rx window announced to the peer
-     * \param scale indicate if the window should be scaled. True for
+     * @brief The amount of Rx window announced to the peer
+     * @param scale indicate if the window should be scaled. True for
      * almost all cases, except when we are sending a SYN
-     * \returns size of Rx window announced to the peer
+     * @returns size of Rx window announced to the peer
      */
     virtual uint16_t AdvertisedWindowSize(bool scale = true) const;
 
     /**
-     * \brief Update the receiver window (RWND) based on the value of the
+     * @brief Update the receiver window (RWND) based on the value of the
      * window field in the header.
      *
      * This method suppresses updates unless one of the following three
@@ -1059,33 +1059,33 @@
      * but the segment acks new data (highest sequence number acked advances),
      * or 3) the advertised window is larger than the current send window
      *
-     * \param header TcpHeader from which to extract the new window value
+     * @param header TcpHeader from which to extract the new window value
      */
     void UpdateWindowSize(const TcpHeader& header);
 
     // Manage data tx/rx
 
     /**
-     * \brief Call CopyObject<> to clone me
-     * \returns a copy of the socket
+     * @brief Call CopyObject<> to clone me
+     * @returns a copy of the socket
      */
     virtual Ptr<TcpSocketBase> Fork();
 
     /**
-     * \brief Received an ACK packet
-     * \param packet the packet
-     * \param tcpHeader the packet's TCP header
+     * @brief Received an ACK packet
+     * @param packet the packet
+     * @param tcpHeader the packet's TCP header
      */
     virtual void ReceivedAck(Ptr<Packet> packet, const TcpHeader& tcpHeader);
 
     /**
-     * \brief Process a received ack
-     * \param ackNumber ack number
-     * \param scoreboardUpdated if true indicates that the scoreboard has been
-     * \param oldHeadSequence value of HeadSequence before ack
+     * @brief Process a received ack
+     * @param ackNumber ack number
+     * @param scoreboardUpdated if true indicates that the scoreboard has been
+     * @param oldHeadSequence value of HeadSequence before ack
      * updated with SACK information
-     * \param currentDelivered The number of bytes (S)ACKed
-     * \param receivedData if true indicates that data is piggybacked with ACK
+     * @param currentDelivered The number of bytes (S)ACKed
+     * @param receivedData if true indicates that data is piggybacked with ACK
      */
     virtual void ProcessAck(const SequenceNumber32& ackNumber,
                             bool scoreboardUpdated,
@@ -1094,251 +1094,251 @@
                             bool receivedData);
 
     /**
-     * \brief Recv of a data, put into buffer, call L7 to get it if necessary
-     * \param packet the packet
-     * \param tcpHeader the packet's TCP header
+     * @brief Recv of a data, put into buffer, call L7 to get it if necessary
+     * @param packet the packet
+     * @param tcpHeader the packet's TCP header
      */
     virtual void ReceivedData(Ptr<Packet> packet, const TcpHeader& tcpHeader);
 
     /**
-     * \brief Calculate RTT sample for the ACKed packet
+     * @brief Calculate RTT sample for the ACKed packet
      *
      * Per RFC 6298 (Section 3),
      * If `m_timestampsEnabled` is true, calculate RTT using timestamps option.
      * Otherwise, return RTT as the elapsed time since the packet was transmitted.
      * If ACKed packed was a retrasmitted packet, return zero time.
      *
-     * \param tcpHeader the packet's TCP header
-     * \param rttHistory the ACKed packet's RTT History
-     * \returns the RTT sample
+     * @param tcpHeader the packet's TCP header
+     * @param rttHistory the ACKed packet's RTT History
+     * @returns the RTT sample
      */
     virtual Time CalculateRttSample(const TcpHeader& tcpHeader, const RttHistory& rttHistory);
 
     /**
-     * \brief Take into account the packet for RTT estimation
-     * \param tcpHeader the packet's TCP header
+     * @brief Take into account the packet for RTT estimation
+     * @param tcpHeader the packet's TCP header
      */
     virtual void EstimateRtt(const TcpHeader& tcpHeader);
 
     /**
-     * \brief Update the RTT history, when we send TCP segments
+     * @brief Update the RTT history, when we send TCP segments
      *
-     * \param seq The sequence number of the TCP segment
-     * \param sz The segment's size
-     * \param isRetransmission Whether or not the segment is a retransmission
+     * @param seq The sequence number of the TCP segment
+     * @param sz The segment's size
+     * @param isRetransmission Whether or not the segment is a retransmission
      */
 
     virtual void UpdateRttHistory(const SequenceNumber32& seq, uint32_t sz, bool isRetransmission);
 
     /**
-     * \brief Update buffers w.r.t. ACK
-     * \param seq the sequence number
-     * \param resetRTO indicates if RTO should be reset
+     * @brief Update buffers w.r.t. ACK
+     * @param seq the sequence number
+     * @param resetRTO indicates if RTO should be reset
      */
     virtual void NewAck(const SequenceNumber32& seq, bool resetRTO);
 
     /**
-     * \brief Dupack management
+     * @brief Dupack management
      *
-     * \param currentDelivered Current (S)ACKed bytes
+     * @param currentDelivered Current (S)ACKed bytes
      */
     void DupAck(uint32_t currentDelivered);
 
     /**
-     * \brief Enter CA_CWR state upon receipt of an ECN Echo
+     * @brief Enter CA_CWR state upon receipt of an ECN Echo
      *
-     * \param currentDelivered Currently (S)ACKed bytes
+     * @param currentDelivered Currently (S)ACKed bytes
      */
     void EnterCwr(uint32_t currentDelivered);
 
     /**
-     * \brief Enter the CA_RECOVERY, and retransmit the head
+     * @brief Enter the CA_RECOVERY, and retransmit the head
      *
-     * \param currentDelivered Currently (S)ACKed bytes
+     * @param currentDelivered Currently (S)ACKed bytes
      */
     void EnterRecovery(uint32_t currentDelivered);
 
     /**
-     * \brief An RTO event happened
+     * @brief An RTO event happened
      */
     virtual void ReTxTimeout();
 
     /**
-     * \brief Action upon delay ACK timeout, i.e. send an ACK
+     * @brief Action upon delay ACK timeout, i.e. send an ACK
      */
     virtual void DelAckTimeout();
 
     /**
-     * \brief Timeout at LAST_ACK, close the connection
+     * @brief Timeout at LAST_ACK, close the connection
      */
     virtual void LastAckTimeout();
 
     /**
-     * \brief Send 1 byte probe to get an updated window size
+     * @brief Send 1 byte probe to get an updated window size
      */
     virtual void PersistTimeout();
 
     /**
-     * \brief Retransmit the first segment marked as lost, without considering
+     * @brief Retransmit the first segment marked as lost, without considering
      * available window nor pacing.
      */
     void DoRetransmit();
 
     /**
-     * \brief Add options to TcpHeader
+     * @brief Add options to TcpHeader
      *
      * Test each option, and if it is enabled on our side, add it
      * to the header
      *
-     * \param tcpHeader TcpHeader to add options to
+     * @param tcpHeader TcpHeader to add options to
      */
     void AddOptions(TcpHeader& tcpHeader);
 
     /**
-     * \brief Read TCP options before Ack processing
+     * @brief Read TCP options before Ack processing
      *
      * Timestamp and Window scale are managed in other pieces of code.
      *
-     * \param tcpHeader Header of the segment
-     * \param [out] bytesSacked Number of bytes SACKed, or 0
+     * @param tcpHeader Header of the segment
+     * @param [out] bytesSacked Number of bytes SACKed, or 0
      */
     void ReadOptions(const TcpHeader& tcpHeader, uint32_t* bytesSacked);
 
     /**
-     * \brief Return true if the specified option is enabled
+     * @brief Return true if the specified option is enabled
      *
-     * \param kind kind of TCP option
-     * \return true if the option is enabled
+     * @param kind kind of TCP option
+     * @return true if the option is enabled
      */
     bool IsTcpOptionEnabled(uint8_t kind) const;
 
     /**
-     * \brief Read and parse the Window scale option
+     * @brief Read and parse the Window scale option
      *
      * Read the window scale option (encoded logarithmically) and save it.
      * Per RFC 1323, the value can't exceed 14.
      *
-     * \param option Window scale option read from the header
+     * @param option Window scale option read from the header
      */
     void ProcessOptionWScale(const Ptr<const TcpOption> option);
     /**
-     * \brief Add the window scale option to the header
+     * @brief Add the window scale option to the header
      *
      * Calculate our factor from the rxBuffer max size, and add it
      * to the header.
      *
-     * \param header TcpHeader where the method should add the window scale option
+     * @param header TcpHeader where the method should add the window scale option
      */
     void AddOptionWScale(TcpHeader& header);
 
     /**
-     * \brief Calculate window scale value based on receive buffer space
+     * @brief Calculate window scale value based on receive buffer space
      *
      * Calculate our factor from the rxBuffer max size
      *
-     * \returns the Window Scale factor
+     * @returns the Window Scale factor
      */
     uint8_t CalculateWScale() const;
 
     /**
-     * \brief Read the SACK PERMITTED option
+     * @brief Read the SACK PERMITTED option
      *
      * Currently this is a placeholder, since no operations should be done
      * on such option.
      *
-     * \param option SACK PERMITTED option from the header
+     * @param option SACK PERMITTED option from the header
      */
     void ProcessOptionSackPermitted(const Ptr<const TcpOption> option);
 
     /**
-     * \brief Read the SACK option
+     * @brief Read the SACK option
      *
-     * \param option SACK option from the header
-     * \returns the number of bytes sacked by this option
+     * @param option SACK option from the header
+     * @returns the number of bytes sacked by this option
      */
     uint32_t ProcessOptionSack(const Ptr<const TcpOption> option);
 
     /**
-     * \brief Add the SACK PERMITTED option to the header
+     * @brief Add the SACK PERMITTED option to the header
      *
-     * \param header TcpHeader where the method should add the option
+     * @param header TcpHeader where the method should add the option
      */
     void AddOptionSackPermitted(TcpHeader& header);
 
     /**
-     * \brief Add the SACK option to the header
+     * @brief Add the SACK option to the header
      *
-     * \param header TcpHeader where the method should add the option
+     * @param header TcpHeader where the method should add the option
      */
     void AddOptionSack(TcpHeader& header);
 
     /**
-     * \brief Process the timestamp option from other side
+     * @brief Process the timestamp option from other side
      *
      * Get the timestamp and the echo, then save timestamp (which will
      * be the echo value in our out-packets) and save the echoed timestamp,
      * to utilize later to calculate RTT.
      *
-     * \see EstimateRtt
-     * \param option Option from the segment
-     * \param seq Sequence number of the segment
+     * @see EstimateRtt
+     * @param option Option from the segment
+     * @param seq Sequence number of the segment
      */
     void ProcessOptionTimestamp(const Ptr<const TcpOption> option, const SequenceNumber32& seq);
     /**
-     * \brief Add the timestamp option to the header
+     * @brief Add the timestamp option to the header
      *
      * Set the timestamp as the lower bits of the Simulator::Now time,
      * and the echo value as the last seen timestamp from the other part.
      *
-     * \param header TcpHeader to which add the option to
+     * @param header TcpHeader to which add the option to
      */
     void AddOptionTimestamp(TcpHeader& header);
 
     /**
-     * \brief Performs a safe subtraction between a and b (a-b)
+     * @brief Performs a safe subtraction between a and b (a-b)
      *
      * Safe is used to indicate that, if b>a, the results returned is 0.
      *
-     * \param a first number
-     * \param b second number
-     * \return 0 if b>0, (a-b) otherwise
+     * @param a first number
+     * @param b second number
+     * @return 0 if b>0, (a-b) otherwise
      */
     static uint32_t SafeSubtraction(uint32_t a, uint32_t b);
 
     /**
-     * \brief Notify Pacing
+     * @brief Notify Pacing
      */
     void NotifyPacingPerformed();
 
     /**
-     * \brief Return true if packets in the current window should be paced
-     * \return true if pacing is currently enabled
+     * @brief Return true if packets in the current window should be paced
+     * @return true if pacing is currently enabled
      */
     bool IsPacingEnabled() const;
 
     /**
-     * \brief Dynamically update the pacing rate
+     * @brief Dynamically update the pacing rate
      */
     void UpdatePacingRate();
 
     /**
-     * \brief Add Tags for the Socket
-     * \param p Packet
-     * \param isEct Whether the packet is allowed to be ECT capable
+     * @brief Add Tags for the Socket
+     * @param p Packet
+     * @param isEct Whether the packet is allowed to be ECT capable
      */
     void AddSocketTags(const Ptr<Packet>& p, bool isEct) const;
 
     /**
      * Get the current value of the receiver's offered window (RCV.WND)
-     * \note This method exists to expose the value to the TcpTxBuffer
-     * \return value of receiver's offered window
+     * @note This method exists to expose the value to the TcpTxBuffer
+     * @return value of receiver's offered window
      */
     uint32_t GetRWnd() const;
 
     /**
      * Get the current value of the receiver's highest (in-sequence) sequence number acked.
-     * \note This method exists to expose the value to the TcpTxBuffer
-     * \return value of receiver's highest sequence number acked.
+     * @note This method exists to expose the value to the TcpTxBuffer
+     * @return value of receiver's highest sequence number acked.
      */
     SequenceNumber32 GetHighRxAck() const;
 
@@ -1365,12 +1365,12 @@
     uint32_t m_dataRetries{0};   //!< Number of data retransmission attempts
 
     // Timeouts
-    TracedValue<Time> m_rto{Seconds(0.0)};   //!< Retransmit timeout
+    TracedValue<Time> m_rto;                 //!< Retransmit timeout
     Time m_minRto{Time::Max()};              //!< minimum value of the Retransmit timeout
     Time m_clockGranularity{Seconds(0.001)}; //!< Clock Granularity used in RTO calcs
-    Time m_delAckTimeout{Seconds(0.0)};      //!< Time to delay an ACK
-    Time m_persistTimeout{Seconds(0.0)};     //!< Time between sending 1-byte probes
-    Time m_cnTimeout{Seconds(0.0)};          //!< Timeout for connection retry
+    Time m_delAckTimeout;                    //!< Time to delay an ACK
+    Time m_persistTimeout;                   //!< Time between sending 1-byte probes
+    Time m_cnTimeout;                        //!< Timeout for connection retry
 
     // History of RTT
     std::deque<RttHistory> m_history; //!< List of sent packet
@@ -1469,21 +1469,21 @@
 };
 
 /**
- * \ingroup tcp
+ * @ingroup tcp
  * TracedValue Callback signature for TcpCongState_t
  *
- * \param [in] oldValue original value of the traced variable
- * \param [in] newValue new value of the traced variable
+ * @param [in] oldValue original value of the traced variable
+ * @param [in] newValue new value of the traced variable
  */
 typedef void (*TcpCongStatesTracedValueCallback)(const TcpSocketState::TcpCongState_t oldValue,
                                                  const TcpSocketState::TcpCongState_t newValue);
 
 /**
- * \ingroup tcp
+ * @ingroup tcp
  * TracedValue Callback signature for ECN state trace
  *
- * \param [in] oldValue original value of the traced variable
- * \param [in] newValue new value of the traced variable
+ * @param [in] oldValue original value of the traced variable
+ * @param [in] newValue new value of the traced variable
  */
 typedef void (*EcnStatesTracedValueCallback)(const TcpSocketState::EcnState_t oldValue,
                                              const TcpSocketState::EcnState_t newValue);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/tcp-socket-factory.h ns-3.44/src/internet/model/tcp-socket-factory.h
--- ns-3.43/src/internet/model/tcp-socket-factory.h	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/model/tcp-socket-factory.h	2025-03-09 16:55:49.411371200 -0700
@@ -16,10 +16,10 @@
 class Socket;
 
 /**
- * \ingroup socket
- * \ingroup tcp
+ * @ingroup socket
+ * @ingroup tcp
  *
- * \brief API to create TCP socket instances
+ * @brief API to create TCP socket instances
  *
  * This abstract class defines the API for TCP sockets.
  * This class also holds the global default variables used to
@@ -30,7 +30,7 @@
  * of CreateSocket
  * below, and should make use of the default values configured below.
  *
- * \see TcpSocketFactoryImpl
+ * @see TcpSocketFactoryImpl
  *
  */
 class TcpSocketFactory : public SocketFactory
@@ -38,8 +38,8 @@
   public:
     /**
      * Get the type ID.
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/tcp-socket-factory-impl.h ns-3.44/src/internet/model/tcp-socket-factory-impl.h
--- ns-3.43/src/internet/model/tcp-socket-factory-impl.h	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/model/tcp-socket-factory-impl.h	2025-03-09 16:55:49.411371200 -0700
@@ -18,10 +18,10 @@
 class TcpL4Protocol;
 
 /**
- * \ingroup socket
- * \ingroup tcp
+ * @ingroup socket
+ * @ingroup tcp
  *
- * \brief socket factory implementation for native ns-3 TCP
+ * @brief socket factory implementation for native ns-3 TCP
  *
  *
  * This class serves to create sockets of the TcpSocketBase type.
@@ -33,8 +33,8 @@
     ~TcpSocketFactoryImpl() override;
 
     /**
-     * \brief Set the associated TCP L4 protocol.
-     * \param tcp the TCP L4 protocol
+     * @brief Set the associated TCP L4 protocol.
+     * @param tcp the TCP L4 protocol
      */
     void SetTcp(Ptr<TcpL4Protocol> tcp);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/tcp-socket.h ns-3.44/src/internet/model/tcp-socket.h
--- ns-3.43/src/internet/model/tcp-socket.h	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/model/tcp-socket.h	2025-03-09 16:55:49.411371200 -0700
@@ -25,10 +25,10 @@
 class Packet;
 
 /**
- * \ingroup socket
- * \ingroup tcp
+ * @ingroup socket
+ * @ingroup tcp
  *
- * \brief (abstract) base class of all TcpSockets
+ * @brief (abstract) base class of all TcpSockets
  *
  * This class exists solely for hosting TcpSocket attributes that can
  * be reused across different implementations.
@@ -38,8 +38,8 @@
   public:
     /**
      * Get the type ID.
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -47,8 +47,8 @@
     ~TcpSocket() override;
 
     /**
-     * \ingroup tcp
-     * \brief Names of the 11 TCP states
+     * @ingroup tcp
+     * @brief Names of the 11 TCP states
      *
      */
     enum TcpStates_t
@@ -79,7 +79,7 @@
     };
 
     /**
-     * \brief Literal names of TCP states for use in log messages
+     * @brief Literal names of TCP states for use in log messages
      */
     static const char* const TcpStateName[TcpSocket::LAST_STATE];
 
@@ -87,166 +87,166 @@
     // Indirect the attribute setting and getting through private virtual methods
 
     /**
-     * \brief Set the send buffer size.
-     * \param size the buffer size (in bytes)
+     * @brief Set the send buffer size.
+     * @param size the buffer size (in bytes)
      */
     virtual void SetSndBufSize(uint32_t size) = 0;
 
     /**
-     * \brief Get the send buffer size.
-     * \returns the buffer size (in bytes)
+     * @brief Get the send buffer size.
+     * @returns the buffer size (in bytes)
      */
     virtual uint32_t GetSndBufSize() const = 0;
 
     /**
-     * \brief Set the receive buffer size.
-     * \param size the buffer size (in bytes)
+     * @brief Set the receive buffer size.
+     * @param size the buffer size (in bytes)
      */
     virtual void SetRcvBufSize(uint32_t size) = 0;
 
     /**
-     * \brief Get the receive buffer size.
-     * \returns the buffer size (in bytes)
+     * @brief Get the receive buffer size.
+     * @returns the buffer size (in bytes)
      */
     virtual uint32_t GetRcvBufSize() const = 0;
 
     /**
-     * \brief Set the segment size.
-     * \param size the segment size (in bytes)
+     * @brief Set the segment size.
+     * @param size the segment size (in bytes)
      */
     virtual void SetSegSize(uint32_t size) = 0;
 
     /**
-     * \brief Get the segment size.
-     * \returns the segment size (in bytes)
+     * @brief Get the segment size.
+     * @returns the segment size (in bytes)
      */
     virtual uint32_t GetSegSize() const = 0;
 
     /**
-     * \brief Set the initial Slow Start Threshold.
-     * \param threshold the Slow Start Threshold (in bytes)
+     * @brief Set the initial Slow Start Threshold.
+     * @param threshold the Slow Start Threshold (in bytes)
      */
     virtual void SetInitialSSThresh(uint32_t threshold) = 0;
 
     /**
-     * \brief Get the initial Slow Start Threshold.
-     * \returns the Slow Start Threshold (in bytes)
+     * @brief Get the initial Slow Start Threshold.
+     * @returns the Slow Start Threshold (in bytes)
      */
     virtual uint32_t GetInitialSSThresh() const = 0;
 
     /**
-     * \brief Set the initial Congestion Window.
-     * \param cwnd the initial congestion window (in segments)
+     * @brief Set the initial Congestion Window.
+     * @param cwnd the initial congestion window (in segments)
      */
     virtual void SetInitialCwnd(uint32_t cwnd) = 0;
 
     /**
-     * \brief Get the initial Congestion Window.
-     * \returns the initial congestion window (in segments)
+     * @brief Get the initial Congestion Window.
+     * @returns the initial congestion window (in segments)
      */
     virtual uint32_t GetInitialCwnd() const = 0;
 
     /**
-     * \brief Set the connection timeout.
-     * \param timeout the connection timeout
+     * @brief Set the connection timeout.
+     * @param timeout the connection timeout
      */
     virtual void SetConnTimeout(Time timeout) = 0;
 
     /**
-     * \brief Get the connection timeout.
-     * \returns the connection timeout
+     * @brief Get the connection timeout.
+     * @returns the connection timeout
      */
     virtual Time GetConnTimeout() const = 0;
 
     /**
-     * \brief Set the number of connection retries before giving up.
-     * \param count the number of connection retries
+     * @brief Set the number of connection retries before giving up.
+     * @param count the number of connection retries
      */
     virtual void SetSynRetries(uint32_t count) = 0;
 
     /**
-     * \brief Get the number of connection retries before giving up.
-     * \returns the number of connection retries
+     * @brief Get the number of connection retries before giving up.
+     * @returns the number of connection retries
      */
     virtual uint32_t GetSynRetries() const = 0;
 
     /**
-     * \brief Set the number of data transmission retries before giving up.
-     * \param retries the number of data transmission retries
+     * @brief Set the number of data transmission retries before giving up.
+     * @param retries the number of data transmission retries
      */
     virtual void SetDataRetries(uint32_t retries) = 0;
 
     /**
-     * \brief Get the number of data transmission retries before giving up.
-     * \returns the number of data transmission retries
+     * @brief Get the number of data transmission retries before giving up.
+     * @returns the number of data transmission retries
      */
     virtual uint32_t GetDataRetries() const = 0;
 
     /**
-     * \brief Set the time to delay an ACK.
-     * \param timeout the time to delay an ACK
+     * @brief Set the time to delay an ACK.
+     * @param timeout the time to delay an ACK
      */
     virtual void SetDelAckTimeout(Time timeout) = 0;
 
     /**
-     * \brief Get the time to delay an ACK.
-     * \returns the time to delay an ACK
+     * @brief Get the time to delay an ACK.
+     * @returns the time to delay an ACK
      */
     virtual Time GetDelAckTimeout() const = 0;
 
     /**
-     * \brief Set the number of packet to fire an ACK before delay timeout.
-     * \param count the umber of packet to fire an ACK before delay timeout
+     * @brief Set the number of packet to fire an ACK before delay timeout.
+     * @param count the umber of packet to fire an ACK before delay timeout
      */
     virtual void SetDelAckMaxCount(uint32_t count) = 0;
 
     /**
-     * \brief Get the number of packet to fire an ACK before delay timeout.
-     * \returns the number of packet to fire an ACK before delay timeout
+     * @brief Get the number of packet to fire an ACK before delay timeout.
+     * @returns the number of packet to fire an ACK before delay timeout
      */
     virtual uint32_t GetDelAckMaxCount() const = 0;
 
     /**
-     * \brief Enable/Disable Nagle's algorithm.
-     * \param noDelay true to DISABLE Nagle's algorithm
+     * @brief Enable/Disable Nagle's algorithm.
+     * @param noDelay true to DISABLE Nagle's algorithm
      */
     virtual void SetTcpNoDelay(bool noDelay) = 0;
 
     /**
-     * \brief Check if Nagle's algorithm is enabled or not.
-     * \returns true if Nagle's algorithm is DISABLED
+     * @brief Check if Nagle's algorithm is enabled or not.
+     * @returns true if Nagle's algorithm is DISABLED
      */
     virtual bool GetTcpNoDelay() const = 0;
 
     /**
-     * \brief Set the timeout for persistent connection
+     * @brief Set the timeout for persistent connection
      *
      * When the timeout expires, send 1-byte data to probe for the window
      * size at the receiver when the local knowledge tells that the
      * receiver has zero window size
      *
-     * \param timeout the persistent timeout
+     * @param timeout the persistent timeout
      */
     virtual void SetPersistTimeout(Time timeout) = 0;
 
     /**
-     * \brief Get the timeout for persistent connection
+     * @brief Get the timeout for persistent connection
      *
      * When the timeout expires, send 1-byte data to probe for the window
      * size at the receiver when the local knowledge tells that the
      * receiver has zero window size
      *
-     * \returns the persistent timeout
+     * @returns the persistent timeout
      */
     virtual Time GetPersistTimeout() const = 0;
 };
 
 /**
- * \ingroup tcp
+ * @ingroup tcp
  * TracedValue Callback signature for TcpStates_t
  *
- * \param [in] oldValue original value of the traced variable
- * \param [in] newValue new value of the traced variable
+ * @param [in] oldValue original value of the traced variable
+ * @param [in] newValue new value of the traced variable
  */
 typedef void (*TcpStatesTracedValueCallback)(const TcpSocket::TcpStates_t oldValue,
                                              const TcpSocket::TcpStates_t newValue);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/tcp-socket-state.h ns-3.44/src/internet/model/tcp-socket-state.h
--- ns-3.43/src/internet/model/tcp-socket-state.h	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/model/tcp-socket-state.h	2025-03-09 16:55:49.411371200 -0700
@@ -9,6 +9,7 @@
 #include "tcp-rx-buffer.h"
 
 #include "ns3/data-rate.h"
+#include "ns3/internet-export.h"
 #include "ns3/object.h"
 #include "ns3/sequence-number.h"
 #include "ns3/traced-value.h"
@@ -17,7 +18,7 @@
 {
 
 /**
- * \brief Data structure that records the congestion state of a connection
+ * @brief Data structure that records the congestion state of a connection
  *
  * In this data structure, basic information that should be passed between
  * socket and the congestion control algorithm are saved. Through the code,
@@ -33,13 +34,13 @@
   public:
     /**
      * Get the type ID.
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief TcpSocketState Constructor
+     * @brief TcpSocketState Constructor
      */
     TcpSocketState()
         : Object()
@@ -47,13 +48,13 @@
     }
 
     /**
-     * \brief Copy constructor.
-     * \param other object to copy.
+     * @brief Copy constructor.
+     * @param other object to copy.
      */
     TcpSocketState(const TcpSocketState& other);
 
     /**
-     * \brief Definition of the Congestion state machine
+     * @brief Definition of the Congestion state machine
      *
      * The design of this state machine is taken from Linux v4.0, but it has been
      * maintained in the Linux mainline from ages. It basically avoids to maintain
@@ -81,7 +82,7 @@
 
     // Note: "not triggered" events are currently not triggered by the code.
     /**
-     * \brief Congestion avoidance events
+     * @brief Congestion avoidance events
      */
     enum TcpCAEvent_t
     {
@@ -96,7 +97,7 @@
     };
 
     /**
-     * \brief Parameter value related to ECN enable/disable functionality
+     * @brief Parameter value related to ECN enable/disable functionality
      *        similar to sysctl for tcp_ecn. Currently value 2 from
      *        https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt
      *        is not implemented.
@@ -109,7 +110,7 @@
     };
 
     /**
-     * \brief ECN code points
+     * @brief ECN code points
      */
     enum EcnCodePoint_t
     {
@@ -120,7 +121,7 @@
     };
 
     /**
-     * \brief ECN Modes
+     * @brief ECN Modes
      */
     enum EcnMode_t
     {
@@ -130,7 +131,7 @@
     };
 
     /**
-     * \brief Definition of the Ecn state machine
+     * @brief Definition of the Ecn state machine
      *
      */
     enum EcnState_t
@@ -146,14 +147,14 @@
     };
 
     /**
-     * \brief Literal names of TCP states for use in log messages
+     * @brief Literal names of TCP states for use in log messages
      */
-    static const char* const TcpCongStateName[TcpSocketState::CA_LAST_STATE];
+    INTERNET_EXPORT static const char* const TcpCongStateName[TcpSocketState::CA_LAST_STATE];
 
     /**
-     * \brief Literal names of ECN states for use in log messages
+     * @brief Literal names of ECN states for use in log messages
      */
-    static const char* const EcnStateName[TcpSocketState::ECN_CWR_SENT + 1];
+    INTERNET_EXPORT static const char* const EcnStateName[TcpSocketState::ECN_CWR_SENT + 1];
 
     // Congestion control
     TracedValue<uint32_t> m_cWnd{0}; //!< Congestion window
@@ -212,9 +213,9 @@
             //!< is similar to acked_sacked variable in Linux
 
     /**
-     * \brief Get cwnd in segments rather than bytes
+     * @brief Get cwnd in segments rather than bytes
      *
-     * \return Congestion window in segments
+     * @return Congestion window in segments
      */
     uint32_t GetCwndInSegments() const
     {
@@ -222,9 +223,9 @@
     }
 
     /**
-     * \brief Get slow start thresh in segments rather than bytes
+     * @brief Get slow start thresh in segments rather than bytes
      *
-     * \return Slow start threshold in segments
+     * @return Slow start threshold in segments
      */
     uint32_t GetSsThreshInSegments() const
     {
@@ -241,21 +242,21 @@
 {
 
 /**
- * \ingroup tcp
+ * @ingroup tcp
  * TracedValue Callback signature for TcpCongState_t
  *
- * \param [in] oldValue original value of the traced variable
- * \param [in] newValue new value of the traced variable
+ * @param [in] oldValue original value of the traced variable
+ * @param [in] newValue new value of the traced variable
  */
 typedef void (*TcpCongState)(const TcpSocketState::TcpCongState_t oldValue,
                              const TcpSocketState::TcpCongState_t newValue);
 
 /**
- * \ingroup tcp
+ * @ingroup tcp
  * TracedValue Callback signature for EcnState_t
  *
- * \param [in] oldValue original value of the traced variable
- * \param [in] newValue new value of the traced variable
+ * @param [in] oldValue original value of the traced variable
+ * @param [in] newValue new value of the traced variable
  */
 typedef void (*EcnState)(const TcpSocketState::EcnState_t oldValue,
                          const TcpSocketState::EcnState_t newValue);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/tcp-tx-buffer.cc ns-3.44/src/internet/model/tcp-tx-buffer.cc
--- ns-3.43/src/internet/model/tcp-tx-buffer.cc	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/model/tcp-tx-buffer.cc	2025-03-09 16:55:49.411371200 -0700
@@ -23,8 +23,6 @@
 NS_LOG_COMPONENT_DEFINE("TcpTxBuffer");
 NS_OBJECT_ENSURE_REGISTERED(TcpTxBuffer);
 
-Callback<void, TcpTxItem*> TcpTxBuffer::m_nullCb = MakeNullCallback<void, TcpTxItem*>();
-
 TypeId
 TcpTxBuffer::GetTypeId()
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/tcp-tx-buffer.h ns-3.44/src/internet/model/tcp-tx-buffer.h
--- ns-3.43/src/internet/model/tcp-tx-buffer.h	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/model/tcp-tx-buffer.h	2025-03-09 16:55:49.411371200 -0700
@@ -13,6 +13,7 @@
 #include "tcp-option-sack.h"
 #include "tcp-tx-item.h"
 
+#include "ns3/internet-export.h"
 #include "ns3/object.h"
 #include "ns3/sequence-number.h"
 #include "ns3/traced-value.h"
@@ -22,9 +23,9 @@
 class Packet;
 
 /**
- * \ingroup tcp
+ * @ingroup tcp
  *
- * \brief Tcp sender buffer
+ * @brief Tcp sender buffer
  *
  * The class keeps track of all data that the application wishes to transmit to
  * the other end. When the data is acknowledged, it is removed from the buffer.
@@ -104,22 +105,22 @@
  * connection, the TcpSocketImplementation should provide hints through
  * the MarkHeadAsLost and AddRenoSack methods.
  *
- * \see BytesInFlight
- * \see Size
- * \see SizeFromSequence
- * \see CopyFromSequence
+ * @see BytesInFlight
+ * @see Size
+ * @see SizeFromSequence
+ * @see CopyFromSequence
  */
 class TcpTxBuffer : public Object
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     /**
-     * \brief Constructor
-     * \param n initial Sequence number to be transmitted
+     * @brief Constructor
+     * @param n initial Sequence number to be transmitted
      */
     TcpTxBuffer(uint32_t n = 0);
     ~TcpTxBuffer() override;
@@ -127,109 +128,109 @@
     // Accessors
 
     /**
-     * \brief Get the sequence number of the buffer head
-     * \returns the first byte's sequence number
+     * @brief Get the sequence number of the buffer head
+     * @returns the first byte's sequence number
      */
     SequenceNumber32 HeadSequence() const;
 
     /**
-     * \brief Get the sequence number of the buffer tail (plus one)
-     * \returns the last byte's sequence number + 1
+     * @brief Get the sequence number of the buffer tail (plus one)
+     * @returns the last byte's sequence number + 1
      */
     SequenceNumber32 TailSequence() const;
 
     /**
-     * \brief Returns total number of bytes in this buffer
-     * \returns total number of bytes in this Tx buffer
+     * @brief Returns total number of bytes in this buffer
+     * @returns total number of bytes in this Tx buffer
      */
     uint32_t Size() const;
 
     /**
-     * \brief Get the maximum buffer size
-     * \returns the Tx window size (in bytes)
+     * @brief Get the maximum buffer size
+     * @returns the Tx window size (in bytes)
      */
     uint32_t MaxBufferSize() const;
 
     /**
-     * \brief Set the maximum buffer size
-     * \param n Tx window size (in bytes)
+     * @brief Set the maximum buffer size
+     * @param n Tx window size (in bytes)
      */
     void SetMaxBufferSize(uint32_t n);
 
     /**
-     * \brief check whether SACK is used on the corresponding TCP socket
-     * \return true if SACK is used
+     * @brief check whether SACK is used on the corresponding TCP socket
+     * @return true if SACK is used
      */
     bool IsSackEnabled() const;
 
     /**
-     * \brief tell tx-buffer whether SACK is used on this TCP socket
+     * @brief tell tx-buffer whether SACK is used on this TCP socket
      *
-     * \param enabled whether sack is used
+     * @param enabled whether sack is used
      */
     void SetSackEnabled(bool enabled);
 
     /**
-     * \brief Returns the available capacity of this buffer
-     * \returns available capacity in this Tx window
+     * @brief Returns the available capacity of this buffer
+     * @returns available capacity in this Tx window
      */
     uint32_t Available() const;
 
     /**
-     * \brief Set the DupAckThresh
-     * \param dupAckThresh the threshold
+     * @brief Set the DupAckThresh
+     * @param dupAckThresh the threshold
      */
     void SetDupAckThresh(uint32_t dupAckThresh);
 
     /**
-     * \brief Set the segment size
-     * \param segmentSize the segment size
+     * @brief Set the segment size
+     * @param segmentSize the segment size
      */
     void SetSegmentSize(uint32_t segmentSize);
 
     /**
-     * \brief Return the number of segments in the sent list that
+     * @brief Return the number of segments in the sent list that
      * have been transmitted more than once, without acknowledgment.
      *
      * This method is to support the retransmits count for determining PipeSize
      * in NewReno-style TCP.
      *
-     * \returns number of segments that have been transmitted more than once, without acknowledgment
+     * @returns number of segments that have been transmitted more than once, without acknowledgment
      */
     uint32_t GetRetransmitsCount() const;
 
     /**
-     * \brief Get the number of segments that we believe are lost in the network
+     * @brief Get the number of segments that we believe are lost in the network
      *
      * It is calculated in UpdateLostCount.
-     * \return the number of lost segment
+     * @return the number of lost segment
      */
     uint32_t GetLost() const;
 
     /**
-     * \brief Get the number of segments that have been explicitly sacked by the receiver.
-     * \return the number of sacked segment.
+     * @brief Get the number of segments that have been explicitly sacked by the receiver.
+     * @return the number of sacked segment.
      */
     uint32_t GetSacked() const;
 
     /**
-     * \brief Append a data packet to the end of the buffer
+     * @brief Append a data packet to the end of the buffer
      *
-     * \param p The packet to be appended to the Tx buffer
-     * \return Boolean to indicate success
+     * @param p The packet to be appended to the Tx buffer
+     * @return Boolean to indicate success
      */
     bool Add(Ptr<Packet> p);
 
     /**
-     * \brief Returns the number of bytes from the buffer in the range [seq, tailSequence)
+     * @brief Returns the number of bytes from the buffer in the range [seq, tailSequence)
      *
-     * \param seq initial sequence number
-     * \returns the number of bytes from the buffer in the range
+     * @param seq initial sequence number
+     * @returns the number of bytes from the buffer in the range
      */
     uint32_t SizeFromSequence(const SequenceNumber32& seq) const;
 
     /**
-     * \brief Copy data from the range [seq, seq+numBytes) into a packet
+     * @brief Copy data from the range [seq, seq+numBytes) into a packet
      *
      * In the following, we refer to the block [seq, seq+numBytes) simply as "block".
      * We check the boundary of the block, and divide the possibilities in three
@@ -243,74 +244,74 @@
      * from GetNewSegment, and then calling GetTransmittedSegment with the full
      * block range.
      *
-     * \param numBytes number of bytes to copy
-     * \param seq start sequence number to extract
-     * \returns a pointer to the TcpTxItem that corresponds to what requested.
+     * @param numBytes number of bytes to copy
+     * @param seq start sequence number to extract
+     * @returns a pointer to the TcpTxItem that corresponds to what requested.
      * Please do not delete the pointer, nor modify Packet data or sequence numbers.
      */
     TcpTxItem* CopyFromSequence(uint32_t numBytes, const SequenceNumber32& seq);
 
     /**
-     * \brief Set the head sequence of the buffer
+     * @brief Set the head sequence of the buffer
      *
      * Set the head (m_firstByteSeq) to seq. Supposed to be called only when the
      * connection is just set up and we did not send any data out yet.
-     * \param seq The sequence number of the head byte
+     * @param seq The sequence number of the head byte
      */
     void SetHeadSequence(const SequenceNumber32& seq);
 
     /**
-     * \brief Checks whether the ack corresponds to retransmitted data
+     * @brief Checks whether the ack corresponds to retransmitted data
      *
-     * \param ack ACK number received
-     * \return true if retransmitted data was acked
+     * @param ack ACK number received
+     * @return true if retransmitted data was acked
      */
     bool IsRetransmittedDataAcked(const SequenceNumber32& ack) const;
 
     /**
-     * \brief Discard data up to but not including this sequence number.
+     * @brief Discard data up to but not including this sequence number.
      *
-     * \param seq The first sequence number to maintain after discarding all the
+     * @param seq The first sequence number to maintain after discarding all the
      * previous sequences.
-     * \param beforeDelCb Callback invoked, if it is not null, before the deletion
+     * @param beforeDelCb Callback invoked, if it is not null, before the deletion
      * of an Item (because it was, probably, ACKed)
      */
     void DiscardUpTo(const SequenceNumber32& seq,
                      const Callback<void, TcpTxItem*>& beforeDelCb = m_nullCb);
 
     /**
-     * \brief Update the scoreboard
-     * \param list list of SACKed blocks
-     * \param sackedCb Callback invoked, if it is not null, when a segment has been
+     * @brief Update the scoreboard
+     * @param list list of SACKed blocks
+     * @param sackedCb Callback invoked, if it is not null, when a segment has been
      * SACKed by the receiver.
-     * \returns the number of bytes newly sacked by the list of blocks
+     * @returns the number of bytes newly sacked by the list of blocks
      */
     uint32_t Update(const TcpOptionSack::SackList& list,
                     const Callback<void, TcpTxItem*>& sackedCb = m_nullCb);
 
     /**
-     * \brief Check if a segment is lost
+     * @brief Check if a segment is lost
      *
      * It does a check on the flags to determine if the segment has to be considered
      * as lost for an external class
      *
-     * \param seq sequence to check
-     * \return true if the sequence is supposed to be lost, false otherwise
+     * @param seq sequence to check
+     * @return true if the sequence is supposed to be lost, false otherwise
      */
     bool IsLost(const SequenceNumber32& seq) const;
 
     /**
-     * \brief Get the next sequence number to transmit, according to RFC 6675
+     * @brief Get the next sequence number to transmit, according to RFC 6675
      *
-     * \param seq Next sequence number to transmit, based on the scoreboard information
-     * \param seqHigh Maximum sequence number to transmit, based on SMSS and/or receiver window
-     * \param isRecovery true if the socket congestion state is in recovery mode
-     * \return true is seq is updated, false otherwise
+     * @param seq Next sequence number to transmit, based on the scoreboard information
+     * @param seqHigh Maximum sequence number to transmit, based on SMSS and/or receiver window
+     * @param isRecovery true if the socket congestion state is in recovery mode
+     * @return true is seq is updated, false otherwise
      */
     bool NextSeg(SequenceNumber32* seq, SequenceNumber32* seqHigh, bool isRecovery) const;
 
     /**
-     * \brief Return total bytes in flight
+     * @brief Return total bytes in flight
      *
      * Counting packets in flight is pretty simple:
      *
@@ -323,54 +324,54 @@
      *
      * To see how we define the lost packets, look at the method UpdateLostCount.
      *
-     * \returns total bytes in flight
+     * @returns total bytes in flight
      */
     uint32_t BytesInFlight() const;
 
     /**
-     * \brief Set the entire sent list as lost (typically after an RTO)
+     * @brief Set the entire sent list as lost (typically after an RTO)
      *
      * Used to set all the sent list as lost, so the bytes in flight is not counting
      * them as in flight, but we will continue to use SACK information for
      * recovering the timeout.
      *
      * Moreover, reset the retransmit flag for every item.
-     * \param resetSack True if the function should reset the SACK flags.
+     * @param resetSack True if the function should reset the SACK flags.
      */
     void SetSentListLost(bool resetSack = false);
 
     /**
-     * \brief Check if the head is retransmitted
+     * @brief Check if the head is retransmitted
      *
-     * \return true if the head is retransmitted, false in all other cases
+     * @return true if the head is retransmitted, false in all other cases
      * (including no segment sent)
      */
     bool IsHeadRetransmitted() const;
 
     /**
-     * \brief DeleteRetransmittedFlagFromHead
+     * @brief DeleteRetransmittedFlagFromHead
      */
     void DeleteRetransmittedFlagFromHead();
 
     /**
-     * \brief Reset the sent list
+     * @brief Reset the sent list
      *
      */
     void ResetSentList();
 
     /**
-     * \brief Take the last segment sent and put it back into the un-sent list
+     * @brief Take the last segment sent and put it back into the un-sent list
      * (at the beginning)
      */
     void ResetLastSegmentSent();
 
     /**
-     * \brief Mark the head of the sent list as lost.
+     * @brief Mark the head of the sent list as lost.
      */
     void MarkHeadAsLost();
 
     /**
-     * \brief Emulate SACKs for SACKless connection: account for a new dupack.
+     * @brief Emulate SACKs for SACKless connection: account for a new dupack.
      *
      * The method walk the list of the sent segment until it finds a segment
      * that was not accounted in the sackedOut count. The head will never
@@ -384,7 +385,7 @@
     void AddRenoSack();
 
     /**
-     * \brief Reset the SACKs.
+     * @brief Reset the SACKs.
      *
      * Reset the Scoreboard from all SACK information. This method also works in
      * case the SACKs are set by the Update method.
@@ -392,8 +393,8 @@
     void ResetRenoSack();
 
     /**
-     * \brief Set callback to obtain receiver window value
-     * \param rWndCallback receiver window callback
+     * @brief Set callback to obtain receiver window value
+     * @param rWndCallback receiver window callback
      */
     void SetRWndCallback(Callback<uint32_t> rWndCallback);
 
@@ -403,7 +404,7 @@
     typedef std::list<TcpTxItem*> PacketList; //!< container for data stored in the buffer
 
     /**
-     * \brief Update the lost count
+     * @brief Update the lost count
      *
      * Reset lost to 0, then walk the sent list looking for lost segments.
      * We have two possible algorithms for detecting lost packets:
@@ -424,31 +425,31 @@
     void UpdateLostCount();
 
     /**
-     * \brief Remove the size specified from the lostOut, retrans, sacked count
+     * @brief Remove the size specified from the lostOut, retrans, sacked count
      *
      * Used only in DiscardUpTo
      *
-     * \param item Item that will be discarded
-     * \param size size to remove (can be different from pktSize because of fragmentation)
+     * @param item Item that will be discarded
+     * @param size size to remove (can be different from pktSize because of fragmentation)
      */
     void RemoveFromCounts(TcpTxItem* item, uint32_t size);
 
     /**
-     * \brief Decide if a segment is lost based on RFC 6675 algorithm.
-     * \param seq Sequence
-     * \param segment Iterator to the sequence
-     * \return true if seq is lost per RFC 6675, false otherwise
+     * @brief Decide if a segment is lost based on RFC 6675 algorithm.
+     * @param seq Sequence
+     * @param segment Iterator to the sequence
+     * @return true if seq is lost per RFC 6675, false otherwise
      */
     bool IsLostRFC(const SequenceNumber32& seq, const PacketList::const_iterator& segment) const;
 
     /**
-     * \brief Calculate the number of bytes in flight per RFC 6675
-     * \return the number of bytes in flight
+     * @brief Calculate the number of bytes in flight per RFC 6675
+     * @return the number of bytes in flight
      */
     uint32_t BytesInFlightRFC() const;
 
     /**
-     * \brief Get a block of data not transmitted yet and move it into SentList
+     * @brief Get a block of data not transmitted yet and move it into SentList
      *
      * If the block is not yet transmitted, hopefully, seq is exactly the sequence
      * number of the first byte of the first packet inside AppList. We extract
@@ -456,31 +457,31 @@
      * block itself. We manage possible fragmentation (or merges) inside AppList
      * through GetPacketFromList.
      *
-     * \see GetPacketFromList
-     * \param numBytes number of bytes to copy
+     * @see GetPacketFromList
+     * @param numBytes number of bytes to copy
      *
-     * \return the item that contains the right packet
+     * @return the item that contains the right packet
      */
     TcpTxItem* GetNewSegment(uint32_t numBytes);
 
     /**
-     * \brief Get a block of data previously transmitted
+     * @brief Get a block of data previously transmitted
      *
      * This is clearly a retransmission, and if everything is going well,
      * the block requested is matching perfectly with another one requested
      * in the past. If not, fragmentation or merge are required. We manage
      * both inside GetPacketFromList.
      *
-     * \see GetPacketFromList
+     * @see GetPacketFromList
      *
-     * \param numBytes number of bytes to copy
-     * \param seq sequence requested
-     * \returns the item that contains the right packet
+     * @param numBytes number of bytes to copy
+     * @param seq sequence requested
+     * @returns the item that contains the right packet
      */
     TcpTxItem* GetTransmittedSegment(uint32_t numBytes, const SequenceNumber32& seq);
 
     /**
-     * \brief Get a block (which is returned as Packet) from a list
+     * @brief Get a block (which is returned as Packet) from a list
      *
      * This function extract a block [requestedSeq,numBytes) from the list, which
      * starts at startingSeq.
@@ -488,7 +489,7 @@
      * The cases we need to manage are two, and they are depicted in the following
      * image:
      *
-     * \verbatim
+     * @verbatim
                          |------|     |----|     |----|
                   list = |      | --> |    | --> |    |
                          |------|     |----|     |----|
@@ -514,7 +515,7 @@
      * and we reduce case (2) to case (1) through sequentially applying fragment
      * or merge. For instance:
      *
-     * \verbatim
+     * @verbatim
         |------|
         |      |
         |------|
@@ -542,12 +543,12 @@
      * MSS can change, but it is stable, and retransmissions do not happen for
      * each segment).
      *
-     * \param list List to extract block from
-     * \param startingSeq Starting sequence of the list
-     * \param numBytes Bytes to extract, starting from requestedSeq
-     * \param requestedSeq Requested sequence
-     * \param listEdited output parameter which indicates if the list has been edited
-     * \return the item that contains the right packet
+     * @param list List to extract block from
+     * @param startingSeq Starting sequence of the list
+     * @param numBytes Bytes to extract, starting from requestedSeq
+     * @param requestedSeq Requested sequence
+     * @param listEdited output parameter which indicates if the list has been edited
+     * @return the item that contains the right packet
      */
     TcpTxItem* GetPacketFromList(PacketList& list,
                                  const SequenceNumber32& startingSeq,
@@ -556,38 +557,38 @@
                                  bool* listEdited = nullptr) const;
 
     /**
-     * \brief Merge two TcpTxItem
+     * @brief Merge two TcpTxItem
      *
      * Merge t2 in t1. It consists in copying the lastSent field if t2 is more
      * recent than t1. Retransmitted field is copied only if it set in t2 but not
      * in t1. Sacked is copied only if it is true in both items.
      *
-     * \param t1 first item
-     * \param t2 second item
+     * @param t1 first item
+     * @param t2 second item
      */
     void MergeItems(TcpTxItem* t1, TcpTxItem* t2) const;
 
     /**
-     * \brief Split one TcpTxItem
+     * @brief Split one TcpTxItem
      *
      * Move "size" bytes from t2 into t1, copying all the fields.
      * Adjust the starting sequence of each item.
      *
-     * \param t1 first item
-     * \param t2 second item
-     * \param size Size to split
+     * @param t1 first item
+     * @param t2 second item
+     * @param size Size to split
      */
     void SplitItems(TcpTxItem* t1, TcpTxItem* t2, uint32_t size) const;
 
     /**
-     * \brief Check if the values of sacked, lost, retrans, are in sync
+     * @brief Check if the values of sacked, lost, retrans, are in sync
      * with the sent list.
      */
     void ConsistencyCheck() const;
 
     /**
-     * \brief Find the highest SACK byte
-     * \return a pair with the highest byte and an iterator inside m_sentList
+     * @brief Find the highest SACK byte
+     * @return a pair with the highest byte and an iterator inside m_sentList
      */
     std::pair<TcpTxBuffer::PacketList::const_iterator, SequenceNumber32> FindHighestSacked() const;
 
@@ -612,22 +613,23 @@
     bool m_sackEnabled{true};   //!< Indicates if SACK is enabled on this connection
     bool m_sackSeen{false};     //!< Indicates if a SACK was received
 
-    static Callback<void, TcpTxItem*> m_nullCb; //!< Null callback for an item
+    INTERNET_EXPORT static inline Callback<void, TcpTxItem*> m_nullCb =
+        MakeNullCallback<void, TcpTxItem*>(); //!< Null callback for an item
 };
 
 /**
- * \brief Output operator.
- * \param os The output stream.
- * \param tcpTxBuf the TcpTxBuffer to print.
- * \returns The output stream.
+ * @brief Output operator.
+ * @param os The output stream.
+ * @param tcpTxBuf the TcpTxBuffer to print.
+ * @returns The output stream.
  */
 std::ostream& operator<<(std::ostream& os, const TcpTxBuffer& tcpTxBuf);
 
 /**
- * \brief Output operator.
- * \param os The output stream.
- * \param item the item to print.
- * \returns The output stream.
+ * @brief Output operator.
+ * @param os The output stream.
+ * @param item the item to print.
+ * @returns The output stream.
  */
 std::ostream& operator<<(std::ostream& os, const TcpTxItem& item);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/tcp-tx-item.h ns-3.44/src/internet/model/tcp-tx-item.h
--- ns-3.43/src/internet/model/tcp-tx-item.h	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/model/tcp-tx-item.h	2025-03-09 16:55:49.411371200 -0700
@@ -14,9 +14,9 @@
 namespace ns3
 {
 /**
- * \ingroup tcp
+ * @ingroup tcp
  *
- * \brief Item that encloses the application packet and some flags for it
+ * @brief Item that encloses the application packet and some flags for it
  */
 class TcpTxItem
 {
@@ -24,51 +24,51 @@
     // Default constructor, copy-constructor, destructor
 
     /**
-     * \brief Print the time
-     * \param os ostream
-     * \param unit Time::Unit
+     * @brief Print the time
+     * @param os ostream
+     * @param unit Time::Unit
      */
     void Print(std::ostream& os, Time::Unit unit = Time::S) const;
 
     /**
-     * \brief Get the size in the sequence number space
+     * @brief Get the size in the sequence number space
      *
-     * \return 1 if the packet size is 0 or there's no packet, otherwise the size of the packet
+     * @return 1 if the packet size is 0 or there's no packet, otherwise the size of the packet
      */
     uint32_t GetSeqSize() const;
 
     /**
-     * \brief Is the item sacked?
-     * \return true if the item is sacked, false otherwise
+     * @brief Is the item sacked?
+     * @return true if the item is sacked, false otherwise
      */
     bool IsSacked() const;
 
     /**
-     * \brief Is the item retransmitted?
-     * \return true if the item have been retransmitted
+     * @brief Is the item retransmitted?
+     * @return true if the item have been retransmitted
      */
     bool IsRetrans() const;
 
     /**
-     * \brief Get a copy of the Packet underlying this item
-     * \return a copy of the Packet
+     * @brief Get a copy of the Packet underlying this item
+     * @return a copy of the Packet
      */
     Ptr<Packet> GetPacketCopy() const;
 
     /**
-     * \brief Get the Packet underlying this item
-     * \return a pointer to a const Packet
+     * @brief Get the Packet underlying this item
+     * @return a pointer to a const Packet
      */
     Ptr<const Packet> GetPacket() const;
 
     /**
-     * \brief Get a reference to the time the packet was sent for the last time
-     * \return a reference to the last sent time
+     * @brief Get a reference to the time the packet was sent for the last time
+     * @return a reference to the last sent time
      */
     const Time& GetLastSent() const;
 
     /**
-     * \brief Various rate-related information, can be accessed by TcpRateOps.
+     * @brief Various rate-related information, can be accessed by TcpRateOps.
      *
      * Note: This is not enforced through C++, but you developer must honour
      * this description.
@@ -84,9 +84,9 @@
     };
 
     /**
-     * \brief Get (to modify) the Rate Information of this item
+     * @brief Get (to modify) the Rate Information of this item
      *
-     * \return A reference to the rate information.
+     * @return A reference to the rate information.
      */
     RateInformation& GetRateInformation();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/tcp-vegas.h ns-3.44/src/internet/model/tcp-vegas.h
--- ns-3.43/src/internet/model/tcp-vegas.h	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/model/tcp-vegas.h	2025-03-09 16:55:49.411371200 -0700
@@ -23,9 +23,9 @@
 class TcpSocketState;
 
 /**
- * \ingroup congestionOps
+ * @ingroup congestionOps
  *
- * \brief An implementation of TCP Vegas
+ * @brief An implementation of TCP Vegas
  *
  * TCP Vegas is a pure delay-based congestion control algorithm implementing a proactive
  * scheme that tries to prevent packet drops by maintaining a small backlog at the
@@ -55,8 +55,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -66,8 +66,8 @@
     TcpVegas();
 
     /**
-     * \brief Copy constructor
-     * \param sock the object to copy
+     * @brief Copy constructor
+     * @param sock the object to copy
      */
     TcpVegas(const TcpVegas& sock);
     ~TcpVegas() override;
@@ -75,7 +75,7 @@
     std::string GetName() const override;
 
     /**
-     * \brief Compute RTTs needed to execute Vegas algorithm
+     * @brief Compute RTTs needed to execute Vegas algorithm
      *
      * The function filters RTT samples from the last RTT to find
      * the current smallest propagation delay + queueing delay (minRtt).
@@ -84,39 +84,39 @@
      * The function also min-filters all RTT measurements seen to find the
      * propagation delay (baseRtt).
      *
-     * \param tcb internal congestion state
-     * \param segmentsAcked count of segments ACKed
-     * \param rtt last RTT
+     * @param tcb internal congestion state
+     * @param segmentsAcked count of segments ACKed
+     * @param rtt last RTT
      *
      */
     void PktsAcked(Ptr<TcpSocketState> tcb, uint32_t segmentsAcked, const Time& rtt) override;
 
     /**
-     * \brief Enable/disable Vegas algorithm depending on the congestion state
+     * @brief Enable/disable Vegas algorithm depending on the congestion state
      *
      * We only start a Vegas cycle when we are in normal congestion state (CA_OPEN state).
      *
-     * \param tcb internal congestion state
-     * \param newState new congestion state to which the TCP is going to switch
+     * @param tcb internal congestion state
+     * @param newState new congestion state to which the TCP is going to switch
      */
     void CongestionStateSet(Ptr<TcpSocketState> tcb,
                             const TcpSocketState::TcpCongState_t newState) override;
 
     /**
-     * \brief Adjust cwnd following Vegas linear increase/decrease algorithm
+     * @brief Adjust cwnd following Vegas linear increase/decrease algorithm
      *
-     * \param tcb internal congestion state
-     * \param segmentsAcked count of segments ACKed
+     * @param tcb internal congestion state
+     * @param segmentsAcked count of segments ACKed
      */
     void IncreaseWindow(Ptr<TcpSocketState> tcb, uint32_t segmentsAcked) override;
 
     /**
-     * \brief Get slow start threshold following Vegas principle
+     * @brief Get slow start threshold following Vegas principle
      *
-     * \param tcb internal congestion state
-     * \param bytesInFlight bytes in flight
+     * @param tcb internal congestion state
+     * @param bytesInFlight bytes in flight
      *
-     * \return the slow start threshold value
+     * @return the slow start threshold value
      */
     uint32_t GetSsThresh(Ptr<const TcpSocketState> tcb, uint32_t bytesInFlight) override;
 
@@ -125,7 +125,7 @@
   protected:
   private:
     /**
-     * \brief Enable Vegas algorithm to start taking Vegas samples
+     * @brief Enable Vegas algorithm to start taking Vegas samples
      *
      * Vegas algorithm is enabled in the following situations:
      * 1. at the establishment of a connection
@@ -133,12 +133,12 @@
      * 3. after fast recovery
      * 4. when an idle connection is restarted
      *
-     * \param tcb internal congestion state
+     * @param tcb internal congestion state
      */
     void EnableVegas(Ptr<TcpSocketState> tcb);
 
     /**
-     * \brief Stop taking Vegas samples
+     * @brief Stop taking Vegas samples
      */
     void DisableVegas();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/tcp-veno.h ns-3.44/src/internet/model/tcp-veno.h
--- ns-3.43/src/internet/model/tcp-veno.h	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/model/tcp-veno.h	2025-03-09 16:55:49.411371200 -0700
@@ -23,9 +23,9 @@
 class TcpSocketState;
 
 /**
- * \ingroup congestionOps
+ * @ingroup congestionOps
  *
- * \brief An implementation of TCP Veno
+ * @brief An implementation of TCP Veno
  *
  * TCP Veno enhances Reno algorithm for more effectively dealing with random
  * packet loss in wireless access networks by employing Vegas's method in
@@ -61,8 +61,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -72,8 +72,8 @@
     TcpVeno();
 
     /**
-     * \brief Copy constructor
-     * \param sock the object to copy
+     * @brief Copy constructor
+     * @param sock the object to copy
      */
     TcpVeno(const TcpVeno& sock);
     ~TcpVeno() override;
@@ -81,7 +81,7 @@
     std::string GetName() const override;
 
     /**
-     * \brief Perform RTT sampling needed to execute Veno algorithm
+     * @brief Perform RTT sampling needed to execute Veno algorithm
      *
      * The function filters RTT samples from the last RTT to find
      * the current smallest propagation delay + queueing delay (m_minRtt).
@@ -90,39 +90,39 @@
      * The function also min-filters all RTT measurements seen to find the
      * propagation delay (m_baseRtt).
      *
-     * \param tcb internal congestion state
-     * \param segmentsAcked count of segments ACKed
-     * \param rtt last RTT
+     * @param tcb internal congestion state
+     * @param segmentsAcked count of segments ACKed
+     * @param rtt last RTT
      *
      */
     void PktsAcked(Ptr<TcpSocketState> tcb, uint32_t segmentsAcked, const Time& rtt) override;
 
     /**
-     * \brief Enable/disable Veno depending on the congestion state
+     * @brief Enable/disable Veno depending on the congestion state
      *
      * We only start a Veno when we are in normal congestion state (CA_OPEN state).
      *
-     * \param tcb internal congestion state
-     * \param newState new congestion state to which the TCP is going to switch
+     * @param tcb internal congestion state
+     * @param newState new congestion state to which the TCP is going to switch
      */
     void CongestionStateSet(Ptr<TcpSocketState> tcb,
                             const TcpSocketState::TcpCongState_t newState) override;
 
     /**
-     * \brief Adjust cwnd following Veno additive increase algorithm
+     * @brief Adjust cwnd following Veno additive increase algorithm
      *
-     * \param tcb internal congestion state
-     * \param segmentsAcked count of segments ACKed
+     * @param tcb internal congestion state
+     * @param segmentsAcked count of segments ACKed
      */
     void IncreaseWindow(Ptr<TcpSocketState> tcb, uint32_t segmentsAcked) override;
 
     /**
-     * \brief Get slow start threshold during Veno multiplicative-decrease phase
+     * @brief Get slow start threshold during Veno multiplicative-decrease phase
      *
-     * \param tcb internal congestion state
-     * \param bytesInFlight bytes in flight
+     * @param tcb internal congestion state
+     * @param bytesInFlight bytes in flight
      *
-     * \return the slow start threshold value
+     * @return the slow start threshold value
      */
     uint32_t GetSsThresh(Ptr<const TcpSocketState> tcb, uint32_t bytesInFlight) override;
 
@@ -131,7 +131,7 @@
   protected:
   private:
     /**
-     * \brief Enable Veno algorithm to start Veno sampling
+     * @brief Enable Veno algorithm to start Veno sampling
      *
      * Veno algorithm is enabled in the following situations:
      * 1. at the establishment of a connection
@@ -143,7 +143,7 @@
     void EnableVeno();
 
     /**
-     * \brief Turn off Veno
+     * @brief Turn off Veno
      */
     void DisableVeno();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/tcp-westwood-plus.h ns-3.44/src/internet/model/tcp-westwood-plus.h
--- ns-3.43/src/internet/model/tcp-westwood-plus.h	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/model/tcp-westwood-plus.h	2025-03-09 16:55:49.411371200 -0700
@@ -34,9 +34,9 @@
 class Time;
 
 /**
- * \ingroup congestionOps
+ * @ingroup congestionOps
  *
- * \brief An implementation of TCP Westwood+.
+ * @brief An implementation of TCP Westwood+.
  *
  * Westwood+ employ the AIAD (Additive Increase/Adaptive Decrease)
  * congestion control paradigm. When a congestion episode happens,
@@ -57,21 +57,21 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     TcpWestwoodPlus();
     /**
-     * \brief Copy constructor
-     * \param sock the object to copy
+     * @brief Copy constructor
+     * @param sock the object to copy
      */
     TcpWestwoodPlus(const TcpWestwoodPlus& sock);
     ~TcpWestwoodPlus() override;
 
     /**
-     * \brief Filter type (None or Tustin)
+     * @brief Filter type (None or Tustin)
      */
     enum FilterType
     {
@@ -89,15 +89,15 @@
     /**
      * Update the total number of acknowledged packets during the current RTT
      *
-     * \param [in] acked the number of packets the currently received ACK acknowledges
+     * @param [in] acked the number of packets the currently received ACK acknowledges
      */
     void UpdateAckedSegments(int acked);
 
     /**
      * Estimate the network's bandwidth
      *
-     * \param [in] rtt the RTT estimation.
-     * \param [in] tcb the socket state.
+     * @param [in] rtt the RTT estimation.
+     * @param [in] tcb the socket state.
      */
     void EstimateBW(const Time& rtt, Ptr<TcpSocketState> tcb);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/tcp-yeah.h ns-3.44/src/internet/model/tcp-yeah.h
--- ns-3.43/src/internet/model/tcp-yeah.h	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/model/tcp-yeah.h	2025-03-09 16:55:49.411371200 -0700
@@ -22,9 +22,9 @@
 {
 
 /**
- * \ingroup congestionOps
+ * @ingroup congestionOps
  *
- * \brief An implementation of TCP YeAH
+ * @brief An implementation of TCP YeAH
  *
  *  YeAH-TCP (Yet Another HighSpeed TCP) is a heuristic designed to balance various
  *  requirements of a state-of-the-art congestion control algorithm:
@@ -62,8 +62,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -73,8 +73,8 @@
     TcpYeah();
 
     /**
-     * \brief Copy constructor
-     * \param sock the object to copy
+     * @brief Copy constructor
+     * @param sock the object to copy
      */
     TcpYeah(const TcpYeah& sock);
     ~TcpYeah() override;
@@ -82,7 +82,7 @@
     std::string GetName() const override;
 
     /**
-     * \brief Compute RTTs needed to execute YeAH algorithm
+     * @brief Compute RTTs needed to execute YeAH algorithm
      *
      * The function filters RTT samples from the last RTT to find
      * the current smallest propagation delay + queueing delay (minRtt).
@@ -91,39 +91,39 @@
      * The function also min-filters all RTT measurements seen to find the
      * propagation delay (baseRtt).
      *
-     * \param tcb internal congestion state
-     * \param segmentsAcked count of segments ACKed
-     * \param rtt last RTT
+     * @param tcb internal congestion state
+     * @param segmentsAcked count of segments ACKed
+     * @param rtt last RTT
      *
      */
     void PktsAcked(Ptr<TcpSocketState> tcb, uint32_t segmentsAcked, const Time& rtt) override;
 
     /**
-     * \brief Enable/disable YeAH algorithm depending on the congestion state
+     * @brief Enable/disable YeAH algorithm depending on the congestion state
      *
      * We only start a YeAH cycle when we are in normal congestion state (CA_OPEN state).
      *
-     * \param tcb internal congestion state
-     * \param newState new congestion state to which the TCP is going to switch
+     * @param tcb internal congestion state
+     * @param newState new congestion state to which the TCP is going to switch
      */
     void CongestionStateSet(Ptr<TcpSocketState> tcb,
                             const TcpSocketState::TcpCongState_t newState) override;
 
     /**
-     * \brief Adjust cwnd following YeAH dual-mode algorithm
+     * @brief Adjust cwnd following YeAH dual-mode algorithm
      *
-     * \param tcb internal congestion state
-     * \param segmentsAcked count of segments ACKed
+     * @param tcb internal congestion state
+     * @param segmentsAcked count of segments ACKed
      */
     void IncreaseWindow(Ptr<TcpSocketState> tcb, uint32_t segmentsAcked) override;
 
     /**
-     * \brief Get slow start threshold upon the receipt of 3 dupACKs
+     * @brief Get slow start threshold upon the receipt of 3 dupACKs
      *
-     * \param tcb internal congestion state
-     * \param bytesInFlight number of outstanding bytes
+     * @param tcb internal congestion state
+     * @param bytesInFlight number of outstanding bytes
      *
-     * \return the slow start threshold value
+     * @return the slow start threshold value
      */
     uint32_t GetSsThresh(Ptr<const TcpSocketState> tcb, uint32_t bytesInFlight) override;
 
@@ -132,7 +132,7 @@
   protected:
   private:
     /**
-     * \brief Enable YeAH algorithm to start taking YeAH samples
+     * @brief Enable YeAH algorithm to start taking YeAH samples
      *
      * YeAH algorithm is enabled in the following situations:
      * 1. at the establishment of a connection
@@ -140,12 +140,12 @@
      * 3. after fast recovery
      * 4. when an idle connection is restarted
      *
-     * \param nextTxSequence Sequence to transmit next
+     * @param nextTxSequence Sequence to transmit next
      */
     void EnableYeah(const SequenceNumber32& nextTxSequence);
 
     /**
-     * \brief Stop taking YeAH samples
+     * @brief Stop taking YeAH samples
      */
     void DisableYeah();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/udp-header.h ns-3.44/src/internet/model/udp-header.h
--- ns-3.43/src/internet/model/udp-header.h	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/model/udp-header.h	2025-03-09 16:55:49.411371200 -0700
@@ -19,8 +19,8 @@
 namespace ns3
 {
 /**
- * \ingroup udp
- * \brief Packet header for UDP packets
+ * @ingroup udp
+ * @brief Packet header for UDP packets
  *
  * This class has fields corresponding to those in a network UDP header
  * (port numbers, payload size, checksum) as well as methods for serialization
@@ -30,32 +30,32 @@
 {
   public:
     /**
-     * \brief Enable checksum calculation for UDP
+     * @brief Enable checksum calculation for UDP
      */
     void EnableChecksums();
     /**
-     * \param port the destination port for this UdpHeader
+     * @param port the destination port for this UdpHeader
      */
     void SetDestinationPort(uint16_t port);
     /**
-     * \param port The source port for this UdpHeader
+     * @param port The source port for this UdpHeader
      */
     void SetSourcePort(uint16_t port);
     /**
-     * \return The source port for this UdpHeader
+     * @return The source port for this UdpHeader
      */
     uint16_t GetSourcePort() const;
     /**
-     * \return the destination port for this UdpHeader
+     * @return the destination port for this UdpHeader
      */
     uint16_t GetDestinationPort() const;
 
     /**
-     * \param source the ip source to use in the underlying
+     * @param source the ip source to use in the underlying
      *        ip packet.
-     * \param destination the ip destination to use in the
+     * @param destination the ip destination to use in the
      *        underlying ip packet.
-     * \param protocol the protocol number to use in the underlying
+     * @param protocol the protocol number to use in the underlying
      *        ip packet.
      *
      * If you want to use udp checksums, you should call this
@@ -64,11 +64,11 @@
     void InitializeChecksum(Address source, Address destination, uint8_t protocol);
 
     /**
-     * \param source the ip source to use in the underlying
+     * @param source the ip source to use in the underlying
      *        ip packet.
-     * \param destination the ip destination to use in the
+     * @param destination the ip destination to use in the
      *        underlying ip packet.
-     * \param protocol the protocol number to use in the underlying
+     * @param protocol the protocol number to use in the underlying
      *        ip packet.
      *
      * If you want to use udp checksums, you should call this
@@ -77,11 +77,11 @@
     void InitializeChecksum(Ipv4Address source, Ipv4Address destination, uint8_t protocol);
 
     /**
-     * \param source the ip source to use in the underlying
+     * @param source the ip source to use in the underlying
      *        ip packet.
-     * \param destination the ip destination to use in the
+     * @param destination the ip destination to use in the
      *        underlying ip packet.
-     * \param protocol the protocol number to use in the underlying
+     * @param protocol the protocol number to use in the underlying
      *        ip packet.
      *
      * If you want to use udp checksums, you should call this
@@ -90,8 +90,8 @@
     void InitializeChecksum(Ipv6Address source, Ipv6Address destination, uint8_t protocol);
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -101,13 +101,13 @@
     uint32_t Deserialize(Buffer::Iterator start) override;
 
     /**
-     * \brief Is the UDP checksum correct ?
-     * \returns true if the checksum is correct, false otherwise.
+     * @brief Is the UDP checksum correct ?
+     * @returns true if the checksum is correct, false otherwise.
      */
     bool IsChecksumOk() const;
 
     /**
-     * \brief Force the UDP checksum to a given value.
+     * @brief Force the UDP checksum to a given value.
      *
      * This might be useful for test purposes or to
      * restore the UDP checksum when the UDP header
@@ -119,33 +119,33 @@
      * When this option is used, the UDP checksum is written in
      * the header, regardless of the global ChecksumEnabled option.
      *
-     * \note The checksum value must be a big endian number.
+     * @note The checksum value must be a big endian number.
      *
-     * \param checksum the checksum to use (big endian).
+     * @param checksum the checksum to use (big endian).
      */
     void ForceChecksum(uint16_t checksum);
 
     /**
-     * \brief Force the UDP payload length to a given value.
+     * @brief Force the UDP payload length to a given value.
      *
      * This might be useful when forging a packet for test
      * purposes.
      *
-     * \param payloadSize the payload length to use.
+     * @param payloadSize the payload length to use.
      */
     void ForcePayloadSize(uint16_t payloadSize);
 
     /**
-     * \brief Return the checksum (only known after a Deserialize)
-     * \return The checksum for this UdpHeader
+     * @brief Return the checksum (only known after a Deserialize)
+     * @return The checksum for this UdpHeader
      */
     uint16_t GetChecksum() const;
 
   private:
     /**
-     * \brief Calculate the header checksum
-     * \param size packet size
-     * \returns the checksum
+     * @brief Calculate the header checksum
+     * @param size packet size
+     * @returns the checksum
      */
     uint16_t CalculateHeaderChecksum(uint16_t size) const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/udp-l4-protocol.cc ns-3.44/src/internet/model/udp-l4-protocol.cc
--- ns-3.43/src/internet/model/udp-l4-protocol.cc	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/model/udp-l4-protocol.cc	2025-03-09 16:55:49.411371200 -0700
@@ -36,9 +36,6 @@
 
 NS_OBJECT_ENSURE_REGISTERED(UdpL4Protocol);
 
-/* see http://www.iana.org/assignments/protocol-numbers */
-const uint8_t UdpL4Protocol::PROT_NUMBER = 17;
-
 TypeId
 UdpL4Protocol::GetTypeId()
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/udp-l4-protocol.h ns-3.44/src/internet/model/udp-l4-protocol.h
--- ns-3.43/src/internet/model/udp-l4-protocol.h	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/model/udp-l4-protocol.h	2025-03-09 16:55:49.411371200 -0700
@@ -30,8 +30,8 @@
 class NetDevice;
 
 /**
- * \ingroup internet
- * \defgroup udp UDP
+ * @ingroup internet
+ * @defgroup udp UDP
  *
  * This  is  an  implementation of the User Datagram Protocol described in
  * \RFC{768}.  It implements a connectionless,  unreliable  datagram  packet
@@ -46,18 +46,20 @@
  */
 
 /**
- * \ingroup udp
- * \brief Implementation of the UDP protocol
+ * @ingroup udp
+ * @brief Implementation of the UDP protocol
  */
 class UdpL4Protocol : public IpL4Protocol
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
-    static const uint8_t PROT_NUMBER; //!< protocol number (0x11)
+
+    /// Protocol number (see http://www.iana.org/assignments/protocol-numbers)
+    static constexpr uint8_t PROT_NUMBER = 17;
 
     UdpL4Protocol();
     ~UdpL4Protocol() override;
@@ -68,52 +70,52 @@
 
     /**
      * Set node associated with this stack
-     * \param node the node
+     * @param node the node
      */
     void SetNode(Ptr<Node> node);
 
     int GetProtocolNumber() const override;
 
     /**
-     * \return A smart Socket pointer to a UdpSocket, allocated by this instance
+     * @return A smart Socket pointer to a UdpSocket, allocated by this instance
      * of the UDP protocol
      */
     Ptr<Socket> CreateSocket();
 
     /**
-     * \brief Allocate an IPv4 Endpoint
-     * \return the Endpoint
+     * @brief Allocate an IPv4 Endpoint
+     * @return the Endpoint
      */
     Ipv4EndPoint* Allocate();
     /**
-     * \brief Allocate an IPv4 Endpoint
-     * \param address address to use
-     * \return the Endpoint
+     * @brief Allocate an IPv4 Endpoint
+     * @param address address to use
+     * @return the Endpoint
      */
     Ipv4EndPoint* Allocate(Ipv4Address address);
     /**
-     * \brief Allocate an IPv4 Endpoint
-     * \param boundNetDevice Bound NetDevice (if any)
-     * \param port port to use
-     * \return the Endpoint
+     * @brief Allocate an IPv4 Endpoint
+     * @param boundNetDevice Bound NetDevice (if any)
+     * @param port port to use
+     * @return the Endpoint
      */
     Ipv4EndPoint* Allocate(Ptr<NetDevice> boundNetDevice, uint16_t port);
     /**
-     * \brief Allocate an IPv4 Endpoint
-     * \param boundNetDevice Bound NetDevice (if any)
-     * \param address address to use
-     * \param port port to use
-     * \return the Endpoint
+     * @brief Allocate an IPv4 Endpoint
+     * @param boundNetDevice Bound NetDevice (if any)
+     * @param address address to use
+     * @param port port to use
+     * @return the Endpoint
      */
     Ipv4EndPoint* Allocate(Ptr<NetDevice> boundNetDevice, Ipv4Address address, uint16_t port);
     /**
-     * \brief Allocate an IPv4 Endpoint
-     * \param boundNetDevice Bound NetDevice (if any)
-     * \param localAddress local address to use
-     * \param localPort local port to use
-     * \param peerAddress remote address to use
-     * \param peerPort remote port to use
-     * \return the Endpoint
+     * @brief Allocate an IPv4 Endpoint
+     * @param boundNetDevice Bound NetDevice (if any)
+     * @param localAddress local address to use
+     * @param localPort local port to use
+     * @param peerAddress remote address to use
+     * @param peerPort remote port to use
+     * @return the Endpoint
      */
     Ipv4EndPoint* Allocate(Ptr<NetDevice> boundNetDevice,
                            Ipv4Address localAddress,
@@ -122,39 +124,39 @@
                            uint16_t peerPort);
 
     /**
-     * \brief Allocate an IPv6 Endpoint
-     * \return the Endpoint
+     * @brief Allocate an IPv6 Endpoint
+     * @return the Endpoint
      */
     Ipv6EndPoint* Allocate6();
     /**
-     * \brief Allocate an IPv6 Endpoint
-     * \param address address to use
-     * \return the Endpoint
+     * @brief Allocate an IPv6 Endpoint
+     * @param address address to use
+     * @return the Endpoint
      */
     Ipv6EndPoint* Allocate6(Ipv6Address address);
     /**
-     * \brief Allocate an IPv6 Endpoint
-     * \param boundNetDevice Bound NetDevice (if any)
-     * \param port port to use
-     * \return the Endpoint
+     * @brief Allocate an IPv6 Endpoint
+     * @param boundNetDevice Bound NetDevice (if any)
+     * @param port port to use
+     * @return the Endpoint
      */
     Ipv6EndPoint* Allocate6(Ptr<NetDevice> boundNetDevice, uint16_t port);
     /**
-     * \brief Allocate an IPv6 Endpoint
-     * \param boundNetDevice Bound NetDevice (if any)
-     * \param address address to use
-     * \param port port to use
-     * \return the Endpoint
+     * @brief Allocate an IPv6 Endpoint
+     * @param boundNetDevice Bound NetDevice (if any)
+     * @param address address to use
+     * @param port port to use
+     * @return the Endpoint
      */
     Ipv6EndPoint* Allocate6(Ptr<NetDevice> boundNetDevice, Ipv6Address address, uint16_t port);
     /**
-     * \brief Allocate an IPv6 Endpoint
-     * \param boundNetDevice Bound NetDevice (if any)
-     * \param localAddress local address to use
-     * \param localPort local port to use
-     * \param peerAddress remote address to use
-     * \param peerPort remote port to use
-     * \return the Endpoint
+     * @brief Allocate an IPv6 Endpoint
+     * @param boundNetDevice Bound NetDevice (if any)
+     * @param localAddress local address to use
+     * @param localPort local port to use
+     * @param peerAddress remote address to use
+     * @param peerPort remote port to use
+     * @return the Endpoint
      */
     Ipv6EndPoint* Allocate6(Ptr<NetDevice> boundNetDevice,
                             Ipv6Address localAddress,
@@ -163,32 +165,32 @@
                             uint16_t peerPort);
 
     /**
-     * \brief Remove an IPv4 Endpoint.
-     * \param endPoint the end point to remove
+     * @brief Remove an IPv4 Endpoint.
+     * @param endPoint the end point to remove
      */
     void DeAllocate(Ipv4EndPoint* endPoint);
     /**
-     * \brief Remove an IPv6 Endpoint.
-     * \param endPoint the end point to remove
+     * @brief Remove an IPv6 Endpoint.
+     * @param endPoint the end point to remove
      */
     void DeAllocate(Ipv6EndPoint* endPoint);
 
     /**
-     * \brief Remove a socket from the internal list
+     * @brief Remove a socket from the internal list
      *
-     * \param socket socket to remove
-     * \return true if the socket has been removed
+     * @param socket socket to remove
+     * @return true if the socket has been removed
      */
     bool RemoveSocket(Ptr<UdpSocketImpl> socket);
 
     // called by UdpSocket.
     /**
-     * \brief Send a packet via UDP (IPv4)
-     * \param packet The packet to send
-     * \param saddr The source Ipv4Address
-     * \param daddr The destination Ipv4Address
-     * \param sport The source port number
-     * \param dport The destination port number
+     * @brief Send a packet via UDP (IPv4)
+     * @param packet The packet to send
+     * @param saddr The source Ipv4Address
+     * @param daddr The destination Ipv4Address
+     * @param sport The source port number
+     * @param dport The destination port number
      */
     void Send(Ptr<Packet> packet,
               Ipv4Address saddr,
@@ -196,13 +198,13 @@
               uint16_t sport,
               uint16_t dport);
     /**
-     * \brief Send a packet via UDP (IPv4)
-     * \param packet The packet to send
-     * \param saddr The source Ipv4Address
-     * \param daddr The destination Ipv4Address
-     * \param sport The source port number
-     * \param dport The destination port number
-     * \param route The route
+     * @brief Send a packet via UDP (IPv4)
+     * @param packet The packet to send
+     * @param saddr The source Ipv4Address
+     * @param daddr The destination Ipv4Address
+     * @param sport The source port number
+     * @param dport The destination port number
+     * @param route The route
      */
     void Send(Ptr<Packet> packet,
               Ipv4Address saddr,
@@ -211,12 +213,12 @@
               uint16_t dport,
               Ptr<Ipv4Route> route);
     /**
-     * \brief Send a packet via UDP (IPv6)
-     * \param packet The packet to send
-     * \param saddr The source Ipv4Address
-     * \param daddr The destination Ipv4Address
-     * \param sport The source port number
-     * \param dport The destination port number
+     * @brief Send a packet via UDP (IPv6)
+     * @param packet The packet to send
+     * @param saddr The source Ipv4Address
+     * @param daddr The destination Ipv4Address
+     * @param sport The source port number
+     * @param dport The destination port number
      */
     void Send(Ptr<Packet> packet,
               Ipv6Address saddr,
@@ -224,13 +226,13 @@
               uint16_t sport,
               uint16_t dport);
     /**
-     * \brief Send a packet via UDP (IPv6)
-     * \param packet The packet to send
-     * \param saddr The source Ipv4Address
-     * \param daddr The destination Ipv4Address
-     * \param sport The source port number
-     * \param dport The destination port number
-     * \param route The route
+     * @brief Send a packet via UDP (IPv6)
+     * @param packet The packet to send
+     * @param saddr The source Ipv4Address
+     * @param daddr The destination Ipv4Address
+     * @param sport The source port number
+     * @param dport The destination port number
+     * @param route The route
      */
     void Send(Ptr<Packet> packet,
               Ipv6Address saddr,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/udp-socket-factory.h ns-3.44/src/internet/model/udp-socket-factory.h
--- ns-3.43/src/internet/model/udp-socket-factory.h	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/model/udp-socket-factory.h	2025-03-09 16:55:49.411371200 -0700
@@ -16,23 +16,23 @@
 class Socket;
 
 /**
- * \ingroup socket
- * \ingroup udp
+ * @ingroup socket
+ * @ingroup udp
  *
- * \brief API to create UDP socket instances
+ * @brief API to create UDP socket instances
  *
  * This abstract class defines the API for UDP socket factory.
  * All UDP implementations must provide an implementation of CreateSocket
  * below.
  *
- * \see UdpSocketFactoryImpl
+ * @see UdpSocketFactoryImpl
  */
 class UdpSocketFactory : public SocketFactory
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/udp-socket-factory-impl.h ns-3.44/src/internet/model/udp-socket-factory-impl.h
--- ns-3.43/src/internet/model/udp-socket-factory-impl.h	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/model/udp-socket-factory-impl.h	2025-03-09 16:55:49.411371200 -0700
@@ -18,10 +18,10 @@
 class UdpL4Protocol;
 
 /**
- * \ingroup socket
- * \ingroup udp
+ * @ingroup socket
+ * @ingroup udp
  *
- * \brief Object to create UDP socket instances
+ * @brief Object to create UDP socket instances
  *
  * This class implements the API for creating UDP sockets.
  * It is a socket factory (deriving from class SocketFactory).
@@ -33,16 +33,16 @@
     ~UdpSocketFactoryImpl() override;
 
     /**
-     * \brief Set the associated UDP L4 protocol.
-     * \param udp the UDP L4 protocol
+     * @brief Set the associated UDP L4 protocol.
+     * @param udp the UDP L4 protocol
      */
     void SetUdp(Ptr<UdpL4Protocol> udp);
 
     /**
-     * \brief Implements a method to create a Udp-based socket and return
+     * @brief Implements a method to create a Udp-based socket and return
      * a base class smart pointer to the socket.
      *
-     * \return smart pointer to Socket
+     * @return smart pointer to Socket
      */
     Ptr<Socket> CreateSocket() override;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/udp-socket.h ns-3.44/src/internet/model/udp-socket.h
--- ns-3.43/src/internet/model/udp-socket.h	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/model/udp-socket.h	2025-03-09 16:55:49.411371200 -0700
@@ -24,10 +24,10 @@
 class Packet;
 
 /**
- * \ingroup socket
- * \ingroup udp
+ * @ingroup socket
+ * @ingroup udp
  *
- * \brief (abstract) base class of all UdpSockets
+ * @brief (abstract) base class of all UdpSockets
  *
  * This class exists solely for hosting UdpSocket attributes that can
  * be reused across different implementations, and for declaring
@@ -38,8 +38,8 @@
   public:
     /**
      * Get the type ID.
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -47,11 +47,11 @@
     ~UdpSocket() override;
 
     /**
-     * \brief Corresponds to socket option MCAST_JOIN_GROUP
+     * @brief Corresponds to socket option MCAST_JOIN_GROUP
      *
-     * \param interface interface number, or 0
-     * \param groupAddress multicast group address
-     * \returns on success, zero is returned.  On error, -1 is returned,
+     * @param interface interface number, or 0
+     * @param groupAddress multicast group address
+     * @returns on success, zero is returned.  On error, -1 is returned,
      *          and errno is set appropriately
      *
      * Enable reception of multicast datagrams for this socket on the
@@ -62,7 +62,7 @@
      * just enables multicast datagram reception in the system if not already
      * enabled for this interface/groupAddress combination.
      *
-     * \attention IGMP is not yet implemented in ns-3
+     * @attention IGMP is not yet implemented in ns-3
      *
      * This function may be called repeatedly on a given socket but each
      * join must be for a different multicast address, or for the same
@@ -73,11 +73,11 @@
     virtual int MulticastJoinGroup(uint32_t interface, const Address& groupAddress) = 0;
 
     /**
-     * \brief Corresponds to socket option MCAST_LEAVE_GROUP
+     * @brief Corresponds to socket option MCAST_LEAVE_GROUP
      *
-     * \param interface interface number, or 0
-     * \param groupAddress multicast group address
-     * \returns on success, zero is returned.  On error, -1 is returned,
+     * @param interface interface number, or 0
+     * @param groupAddress multicast group address
+     * @returns on success, zero is returned.  On error, -1 is returned,
      *          and errno is set appropriately
      *
      * Disable reception of multicast datagrams for this socket on the
@@ -88,72 +88,72 @@
      * just disables multicast datagram reception in the system if this
      * socket is the last for this interface/groupAddress combination.
      *
-     * \attention IGMP is not yet implemented in ns-3
+     * @attention IGMP is not yet implemented in ns-3
      */
     virtual int MulticastLeaveGroup(uint32_t interface, const Address& groupAddress) = 0;
 
   private:
     // Indirect the attribute setting and getting through private virtual methods
     /**
-     * \brief Set the receiving buffer size
-     * \param size the buffer size
+     * @brief Set the receiving buffer size
+     * @param size the buffer size
      */
     virtual void SetRcvBufSize(uint32_t size) = 0;
     /**
-     * \brief Get the receiving buffer size
-     * \returns the buffer size
+     * @brief Get the receiving buffer size
+     * @returns the buffer size
      */
     virtual uint32_t GetRcvBufSize() const = 0;
     /**
-     * \brief Set the IP multicast TTL
-     * \param ipTtl the IP multicast TTL
+     * @brief Set the IP multicast TTL
+     * @param ipTtl the IP multicast TTL
      */
     virtual void SetIpMulticastTtl(uint8_t ipTtl) = 0;
     /**
-     * \brief Get the IP multicast TTL
-     * \returns the IP multicast TTL
+     * @brief Get the IP multicast TTL
+     * @returns the IP multicast TTL
      */
     virtual uint8_t GetIpMulticastTtl() const = 0;
     /**
-     * \brief Set the IP multicast interface
-     * \param ipIf the IP multicast interface
+     * @brief Set the IP multicast interface
+     * @param ipIf the IP multicast interface
      */
     virtual void SetIpMulticastIf(int32_t ipIf) = 0;
     /**
-     * \brief Get the IP multicast interface
-     * \returns the IP multicast interface
+     * @brief Get the IP multicast interface
+     * @returns the IP multicast interface
      */
     virtual int32_t GetIpMulticastIf() const = 0;
     /**
-     * \brief Set the IP multicast loop capability
+     * @brief Set the IP multicast loop capability
      *
      * This means that the socket will receive the packets
      * sent by itself on a multicast address.
      * Equivalent to setsockopt  IP_MULTICAST_LOOP
      *
-     * \param loop the IP multicast loop capability
+     * @param loop the IP multicast loop capability
      */
     virtual void SetIpMulticastLoop(bool loop) = 0;
     /**
-     * \brief Get the IP multicast loop capability
+     * @brief Get the IP multicast loop capability
      *
      * This means that the socket will receive the packets
      * sent by itself on a multicast address.
      * Equivalent to setsockopt  IP_MULTICAST_LOOP
      *
-     * \returns the IP multicast loop capability
+     * @returns the IP multicast loop capability
      */
     virtual bool GetIpMulticastLoop() const = 0;
     /**
-     * \brief Set the MTU discover capability
+     * @brief Set the MTU discover capability
      *
-     * \param discover the MTU discover capability
+     * @param discover the MTU discover capability
      */
     virtual void SetMtuDiscover(bool discover) = 0;
     /**
-     * \brief Get the MTU discover capability
+     * @brief Get the MTU discover capability
      *
-     * \returns the MTU discover capability
+     * @returns the MTU discover capability
      */
     virtual bool GetMtuDiscover() const = 0;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/udp-socket-impl.cc ns-3.44/src/internet/model/udp-socket-impl.cc
--- ns-3.43/src/internet/model/udp-socket-impl.cc	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/model/udp-socket-impl.cc	2025-03-09 16:55:49.411371200 -0700
@@ -87,7 +87,7 @@
 {
     NS_LOG_FUNCTION(this);
 
-    /// \todo  leave any multicast groups that have been joined
+    /// @todo  leave any multicast groups that have been joined
     m_node = nullptr;
     /**
      * Note: actually this function is called AFTER
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/udp-socket-impl.h ns-3.44/src/internet/model/udp-socket-impl.h
--- ns-3.43/src/internet/model/udp-socket-impl.h	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/model/udp-socket-impl.h	2025-03-09 16:55:49.411371200 -0700
@@ -33,10 +33,10 @@
 class Ipv6Interface;
 
 /**
- * \ingroup socket
- * \ingroup udp
+ * @ingroup socket
+ * @ingroup udp
  *
- * \brief A sockets interface to UDP
+ * @brief A sockets interface to UDP
  *
  * This class subclasses ns3::UdpSocket, and provides a socket interface
  * to ns3's implementation of UDP.
@@ -61,8 +61,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     /**
@@ -72,13 +72,13 @@
     ~UdpSocketImpl() override;
 
     /**
-     * \brief Set the associated node.
-     * \param node the node
+     * @brief Set the associated node.
+     * @param node the node
      */
     void SetNode(Ptr<Node> node);
     /**
-     * \brief Set the associated UDP L4 protocol.
-     * \param udp the UDP L4 protocol
+     * @brief Set the associated UDP L4 protocol.
+     * @param udp the UDP L4 protocol
      */
     void SetUdp(Ptr<UdpL4Protocol> udp);
 
@@ -124,25 +124,25 @@
     bool GetMtuDiscover() const override;
 
     /**
-     * \brief UdpSocketFactory friend class.
-     * \relates UdpSocketFactory
+     * @brief UdpSocketFactory friend class.
+     * @relates UdpSocketFactory
      */
     friend class UdpSocketFactory;
     // invoked by Udp class
 
     /**
      * Finish the binding process
-     * \returns 0 on success, -1 on failure
+     * @returns 0 on success, -1 on failure
      */
     int FinishBind();
 
     /**
-     * \brief Called by the L3 protocol when it received a packet to pass on to TCP.
+     * @brief Called by the L3 protocol when it received a packet to pass on to TCP.
      *
-     * \param packet the incoming packet
-     * \param header the packet's IPv4 header
-     * \param port the remote port
-     * \param incomingInterface the incoming interface
+     * @param packet the incoming packet
+     * @param header the packet's IPv4 header
+     * @param port the remote port
+     * @param incomingInterface the incoming interface
      */
     void ForwardUp(Ptr<Packet> packet,
                    Ipv4Header header,
@@ -150,12 +150,12 @@
                    Ptr<Ipv4Interface> incomingInterface);
 
     /**
-     * \brief Called by the L3 protocol when it received a packet to pass on to TCP.
+     * @brief Called by the L3 protocol when it received a packet to pass on to TCP.
      *
-     * \param packet the incoming packet
-     * \param header the packet's IPv6 header
-     * \param port the remote port
-     * \param incomingInterface the incoming interface
+     * @param packet the incoming packet
+     * @param header the packet's IPv6 header
+     * @param port the remote port
+     * @param incomingInterface the incoming interface
      */
     void ForwardUp6(Ptr<Packet> packet,
                     Ipv6Header header,
@@ -163,7 +163,7 @@
                     Ptr<Ipv6Interface> incomingInterface);
 
     /**
-     * \brief Kill this socket by zeroing its attributes (IPv4)
+     * @brief Kill this socket by zeroing its attributes (IPv4)
      *
      * This is a callback function configured to m_endpoint in
      * SetupCallback(), invoked when the endpoint is destroyed.
@@ -171,7 +171,7 @@
     void Destroy();
 
     /**
-     * \brief Kill this socket by zeroing its attributes (IPv6)
+     * @brief Kill this socket by zeroing its attributes (IPv6)
      *
      * This is a callback function configured to m_endpoint in
      * SetupCallback(), invoked when the endpoint is destroyed.
@@ -179,42 +179,42 @@
     void Destroy6();
 
     /**
-     * \brief Deallocate m_endPoint and m_endPoint6
+     * @brief Deallocate m_endPoint and m_endPoint6
      */
     void DeallocateEndPoint();
 
     /**
-     * \brief Send a packet
-     * \param p packet
-     * \returns 0 on success, -1 on failure
+     * @brief Send a packet
+     * @param p packet
+     * @returns 0 on success, -1 on failure
      */
     int DoSend(Ptr<Packet> p);
     /**
-     * \brief Send a packet to a specific destination and port (IPv4)
-     * \param p packet
-     * \param daddr destination address
-     * \param dport destination port
-     * \param tos ToS
-     * \returns 0 on success, -1 on failure
+     * @brief Send a packet to a specific destination and port (IPv4)
+     * @param p packet
+     * @param daddr destination address
+     * @param dport destination port
+     * @param tos ToS
+     * @returns 0 on success, -1 on failure
      */
     int DoSendTo(Ptr<Packet> p, Ipv4Address daddr, uint16_t dport, uint8_t tos);
     /**
-     * \brief Send a packet to a specific destination and port (IPv6)
-     * \param p packet
-     * \param daddr destination address
-     * \param dport destination port
-     * \returns 0 on success, -1 on failure
+     * @brief Send a packet to a specific destination and port (IPv6)
+     * @param p packet
+     * @param daddr destination address
+     * @param dport destination port
+     * @returns 0 on success, -1 on failure
      */
     int DoSendTo(Ptr<Packet> p, Ipv6Address daddr, uint16_t dport);
 
     /**
-     * \brief Called by the L3 protocol when it received an ICMP packet to pass on to TCP.
+     * @brief Called by the L3 protocol when it received an ICMP packet to pass on to TCP.
      *
-     * \param icmpSource the ICMP source address
-     * \param icmpTtl the ICMP Time to Live
-     * \param icmpType the ICMP Type
-     * \param icmpCode the ICMP Code
-     * \param icmpInfo the ICMP Info
+     * @param icmpSource the ICMP source address
+     * @param icmpTtl the ICMP Time to Live
+     * @param icmpType the ICMP Type
+     * @param icmpCode the ICMP Code
+     * @param icmpInfo the ICMP Info
      */
     void ForwardIcmp(Ipv4Address icmpSource,
                      uint8_t icmpTtl,
@@ -223,13 +223,13 @@
                      uint32_t icmpInfo);
 
     /**
-     * \brief Called by the L3 protocol when it received an ICMPv6 packet to pass on to TCP.
+     * @brief Called by the L3 protocol when it received an ICMPv6 packet to pass on to TCP.
      *
-     * \param icmpSource the ICMP source address
-     * \param icmpTtl the ICMP Time to Live
-     * \param icmpType the ICMP Type
-     * \param icmpCode the ICMP Code
-     * \param icmpInfo the ICMP Info
+     * @param icmpSource the ICMP source address
+     * @param icmpTtl the ICMP Time to Live
+     * @param icmpType the ICMP Type
+     * @param icmpCode the ICMP Code
+     * @param icmpInfo the ICMP Info
      */
     void ForwardIcmp6(Ipv6Address icmpSource,
                       uint8_t icmpTtl,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/model/windowed-filter.h ns-3.44/src/internet/model/windowed-filter.h
--- ns-3.43/src/internet/model/windowed-filter.h	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/model/windowed-filter.h	2025-03-09 16:55:49.411371200 -0700
@@ -42,19 +42,19 @@
 namespace ns3
 {
 /**
- * \brief Compares two values
- * \param T  type of the measurement that is being filtered.
+ * @brief Compares two values
+ * @param T  type of the measurement that is being filtered.
  */
 template <class T>
 struct MinFilter
 {
   public:
     /**
-     * \brief Compares two values
+     * @brief Compares two values
      *
-     * \param lhs left hand value
-     * \param rhs right hand value
-     * \return returns true if the first is less than or equal to the second.
+     * @param lhs left hand value
+     * @param rhs right hand value
+     * @return returns true if the first is less than or equal to the second.
      */
     bool operator()(const T& lhs, const T& rhs) const
     {
@@ -67,19 +67,19 @@
 };
 
 /**
- * \brief Compares two values
- * \param T  type of the measurement that is being filtered.
+ * @brief Compares two values
+ * @param T  type of the measurement that is being filtered.
  */
 template <class T>
 struct MaxFilter
 {
   public:
     /**
-     * \brief Compares two values
+     * @brief Compares two values
      *
-     * \param lhs left hand value
-     * \param rhs right hand value
-     * \return returns true if the first is greater than or equal to the second.
+     * @param lhs left hand value
+     * @param rhs right hand value
+     * @return returns true if the first is greater than or equal to the second.
      */
     bool operator()(const T& lhs, const T& rhs) const
     {
@@ -92,7 +92,7 @@
 };
 
 /**
- * \brief Construct a windowed filter
+ * @brief Construct a windowed filter
  *
  * Use the following to construct a windowed filter object of type T.
  * For example, a min filter using QuicTime as the time type:
@@ -100,10 +100,10 @@
  * max filter using 64-bit integers as the time type:
  *      WindowedFilter<T, MaxFilter<T>, uint64_t, int64_t> ObjectName;
  *
- * \param T -- type of the measurement that is being filtered.
- * \param Compare -- MinFilter<T> or MaxFilter<T>, depending on the type of filter desired.
- * \param TimeT -- the type used to represent timestamps.
- * \param TimeDeltaT -- the type used to represent continuous time intervals between
+ * @param T -- type of the measurement that is being filtered.
+ * @param Compare -- MinFilter<T> or MaxFilter<T>, depending on the type of filter desired.
+ * @param TimeT -- the type used to represent timestamps.
+ * @param TimeDeltaT -- the type used to represent continuous time intervals between
  * two timestamps.  Has to be the type of (a - b) if both |a| and |b| are
  * of type TimeT.
  */
@@ -112,18 +112,18 @@
 {
   public:
     /**
-     * \brief constructor
+     * @brief constructor
      */
     WindowedFilter()
     {
     }
 
     /**
-     * \brief constructor
-     * \param windowLength is the period after which a best estimate expires.
-     * \param zeroValue is used as the uninitialized value for objects of T. Importantly,
+     * @brief constructor
+     * @param windowLength is the period after which a best estimate expires.
+     * @param zeroValue is used as the uninitialized value for objects of T. Importantly,
      * zeroValue should be an invalid value for a true sample.
-     * \param zeroTime is the time of instance record time.
+     * @param zeroTime is the time of instance record time.
      */
     WindowedFilter(TimeDeltaT windowLength, T zeroValue, TimeT zeroTime)
         : m_windowLength(windowLength),
@@ -135,8 +135,8 @@
     }
 
     /**
-     * \brief Changes the window length.  Does not update any current samples.
-     * \param windowLength is the period after which a best estimate expires.
+     * @brief Changes the window length.  Does not update any current samples.
+     * @param windowLength is the period after which a best estimate expires.
      */
     void SetWindowLength(TimeDeltaT windowLength)
     {
@@ -144,11 +144,11 @@
     }
 
     /**
-     * \brief Updates best estimates with |sample|, and expires and updates best
+     * @brief Updates best estimates with |sample|, and expires and updates best
      * estimates as necessary.
      *
-     * \param new_sample update new sample.
-     * \param new_time record time of the new sample.
+     * @param new_sample update new sample.
+     * @param new_time record time of the new sample.
      */
     void Update(T new_sample, TimeT new_time)
     {
@@ -206,9 +206,9 @@
     }
 
     /**
-     * \brief Resets all estimates to new sample.
-     * \param new_sample update new sample.
-     * \param new_time record time of the new sample.
+     * @brief Resets all estimates to new sample.
+     * @param new_sample update new sample.
+     * @param new_time record time of the new sample.
      */
     void Reset(T new_sample, TimeT new_time)
     {
@@ -216,8 +216,8 @@
     }
 
     /**
-     * \brief Returns Max/Min value so far among the windowed samples.
-     * \return returns Best (max/min) value so far among the windowed samples.
+     * @brief Returns Max/Min value so far among the windowed samples.
+     * @return returns Best (max/min) value so far among the windowed samples.
      */
     T GetBest() const
     {
@@ -225,8 +225,8 @@
     }
 
     /**
-     * \brief Returns second Max/Min value so far among the windowed samples.
-     * \return returns second Best (max/min) value so far among the windowed samples.
+     * @brief Returns second Max/Min value so far among the windowed samples.
+     * @return returns second Best (max/min) value so far among the windowed samples.
      */
     T GetSecondBest() const
     {
@@ -234,8 +234,8 @@
     }
 
     /**
-     * \brief Returns third Max/Min value so far among the windowed samples.
-     * \return returns third Best (max/min) value so far among the windowed samples.
+     * @brief Returns third Max/Min value so far among the windowed samples.
+     * @return returns third Best (max/min) value so far among the windowed samples.
      */
     T GetThirdBest() const
     {
@@ -243,7 +243,7 @@
     }
 
     /**
-     * \brief sample.
+     * @brief sample.
      */
     struct Sample
     {
@@ -251,16 +251,16 @@
         TimeT time; //!< time when the sample was recorded.
 
         /**
-         * \brief constructor
+         * @brief constructor
          */
         Sample()
         {
         }
 
         /**
-         * \brief constructor
-         * \param init_sample value of sample.
-         * \param init_time time when the sample was recorded..
+         * @brief constructor
+         * @param init_sample value of sample.
+         * @param init_time time when the sample was recorded..
          */
         Sample(T init_sample, TimeT init_time)
             : sample(init_sample),
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/global-route-manager-impl-test-suite.cc ns-3.44/src/internet/test/global-route-manager-impl-test-suite.cc
--- ns-3.43/src/internet/test/global-route-manager-impl-test-suite.cc	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/test/global-route-manager-impl-test-suite.cc	2025-03-09 16:55:49.411371200 -0700
@@ -20,15 +20,15 @@
 using namespace ns3;
 
 /**
- * \ingroup internet
- * \ingroup tests
- * \defgroup internet-test internet module tests
+ * @ingroup internet
+ * @ingroup tests
+ * @defgroup internet-test internet module tests
  */
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Global Route Manager Test
+ * @brief Global Route Manager Test
  */
 class GlobalRouteManagerImplTestCase : public TestCase
 {
@@ -191,7 +191,7 @@
 
     Simulator::Run();
 
-    /// \todo here we should do some verification of the routes built
+    /// @todo here we should do some verification of the routes built
 
     Simulator::Destroy();
 
@@ -199,15 +199,15 @@
     // all of the LSAs, which each destroys the attached LinkRecords.
     delete srm;
 
-    /// \todo Testing
+    /// @todo Testing
     // No testing has actually been done other than making sure that this code
     // does not crash
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Global Route Manager TestSuite
+ * @brief Global Route Manager TestSuite
  */
 class GlobalRouteManagerImplTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/icmp-test.cc ns-3.44/src/internet/test/icmp-test.cc
--- ns-3.43/src/internet/test/icmp-test.cc	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/test/icmp-test.cc	2025-03-09 16:55:49.411371200 -0700
@@ -68,15 +68,15 @@
 using namespace ns3;
 
 /**
- * \ingroup internet-apps
- * \defgroup icmp-test ICMP protocol tests
+ * @ingroup internet-apps
+ * @defgroup icmp-test ICMP protocol tests
  */
 
 /**
- * \ingroup icmp-test
- * \ingroup tests
+ * @ingroup icmp-test
+ * @ingroup tests
  *
- * \brief ICMP  Echo Reply Test
+ * @brief ICMP  Echo Reply Test
  */
 class IcmpEchoReplyTestCase : public TestCase
 {
@@ -86,13 +86,13 @@
 
     /**
      * Send data
-     * \param socket output socket
-     * \param dst destination address
+     * @param socket output socket
+     * @param dst destination address
      */
     void SendData(Ptr<Socket> socket, Ipv4Address dst);
     /**
      * Receive data
-     * \param socket input socket
+     * @param socket input socket
      */
     void ReceivePkt(Ptr<Socket> socket);
 
@@ -202,10 +202,10 @@
 }
 
 /**
- * \ingroup icmp-test
- * \ingroup tests
+ * @ingroup icmp-test
+ * @ingroup tests
  *
- * \brief ICMP Time Exceed Reply Test
+ * @brief ICMP Time Exceed Reply Test
  */
 class IcmpTimeExceedTestCase : public TestCase
 {
@@ -215,13 +215,13 @@
 
     /**
      * Send data
-     * \param socket output socket
-     * \param dst destination address
+     * @param socket output socket
+     * @param dst destination address
      */
     void SendData(Ptr<Socket> socket, Ipv4Address dst);
     /**
      * Receive data
-     * \param socket input socket
+     * @param socket input socket
      */
     void ReceivePkt(Ptr<Socket> socket);
 
@@ -347,10 +347,10 @@
 }
 
 /**
- * \ingroup icmp-test
- * \ingroup tests
+ * @ingroup icmp-test
+ * @ingroup tests
  *
- * \brief ICMPV6  Echo Reply Test
+ * @brief ICMPV6  Echo Reply Test
  */
 class IcmpV6EchoReplyTestCase : public TestCase
 {
@@ -360,13 +360,13 @@
 
     /**
      * Send data
-     * \param socket output socket
-     * \param dst destination address
+     * @param socket output socket
+     * @param dst destination address
      */
     void SendData(Ptr<Socket> socket, Ipv6Address dst);
     /**
      * Receive data
-     * \param socket input socket
+     * @param socket input socket
      */
     void ReceivePkt(Ptr<Socket> socket);
 
@@ -485,10 +485,10 @@
 }
 
 /**
- * \ingroup icmp-test
- * \ingroup tests
+ * @ingroup icmp-test
+ * @ingroup tests
  *
- * \brief ICMPV6  Time Exceed response test
+ * @brief ICMPV6  Time Exceed response test
  */
 class IcmpV6TimeExceedTestCase : public TestCase
 {
@@ -498,13 +498,13 @@
 
     /**
      * Send data
-     * \param socket output socket
-     * \param dst destination address
+     * @param socket output socket
+     * @param dst destination address
      */
     void SendData(Ptr<Socket> socket, Ipv6Address dst);
     /**
      * Receive data
-     * \param socket input socket
+     * @param socket input socket
      */
     void ReceivePkt(Ptr<Socket> socket);
 
@@ -640,10 +640,10 @@
 }
 
 /**
- * \ingroup icmp-test
- * \ingroup tests
+ * @ingroup icmp-test
+ * @ingroup tests
  *
- * \brief ICMP TestSuite
+ * @brief ICMP TestSuite
  */
 
 class IcmpTestSuite : public TestSuite
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/internet-stack-helper-test-suite.cc ns-3.44/src/internet/test/internet-stack-helper-test-suite.cc
--- ns-3.43/src/internet/test/internet-stack-helper-test-suite.cc	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/test/internet-stack-helper-test-suite.cc	2025-03-09 16:55:49.411371200 -0700
@@ -18,9 +18,9 @@
 NS_LOG_COMPONENT_DEFINE("InternetStackHelperTestSuite");
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief InternetStackHelper Test
+ * @brief InternetStackHelper Test
  */
 class InternetStackHelperTestCase : public TestCase
 {
@@ -129,9 +129,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief InternetStackHelper TestSuite
+ * @brief InternetStackHelper TestSuite
  */
 class InternetStackHelperTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/ipv4-address-generator-test-suite.cc ns-3.44/src/internet/test/ipv4-address-generator-test-suite.cc
--- ns-3.43/src/internet/test/ipv4-address-generator-test-suite.cc	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/test/ipv4-address-generator-test-suite.cc	2025-03-09 16:55:49.411371200 -0700
@@ -11,9 +11,9 @@
 using namespace ns3;
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv4 network number Test
+ * @brief IPv4 network number Test
  */
 class NetworkNumberAllocatorTestCase : public TestCase
 {
@@ -71,9 +71,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv4 address allocator Test
+ * @brief IPv4 address allocator Test
  */
 class AddressAllocatorTestCase : public TestCase
 {
@@ -128,9 +128,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv4 network and address allocator Test
+ * @brief IPv4 network and address allocator Test
  */
 class NetworkAndAddressTestCase : public TestCase
 {
@@ -199,9 +199,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv4 AddressGenerator example (sort of) Test
+ * @brief IPv4 AddressGenerator example (sort of) Test
  */
 class ExampleAddressGeneratorTestCase : public TestCase
 {
@@ -257,9 +257,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv4 address collision Test
+ * @brief IPv4 address collision Test
  */
 class AddressCollisionTestCase : public TestCase
 {
@@ -339,9 +339,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv4 Address Generator TestSuite
+ * @brief IPv4 Address Generator TestSuite
  */
 class Ipv4AddressGeneratorTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/ipv4-address-helper-test-suite.cc ns-3.44/src/internet/test/ipv4-address-helper-test-suite.cc
--- ns-3.43/src/internet/test/ipv4-address-helper-test-suite.cc	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/test/ipv4-address-helper-test-suite.cc	2025-03-09 16:55:49.411371200 -0700
@@ -12,9 +12,9 @@
 using namespace ns3;
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv4 network allocator helper Test
+ * @brief IPv4 network allocator helper Test
  */
 class NetworkAllocatorHelperTestCase : public TestCase
 {
@@ -65,9 +65,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv4 address allocator helper Test
+ * @brief IPv4 address allocator helper Test
  */
 class AddressAllocatorHelperTestCase : public TestCase
 {
@@ -118,9 +118,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv4 reset allocator helper Test
+ * @brief IPv4 reset allocator helper Test
  */
 class ResetAllocatorHelperTestCase : public TestCase
 {
@@ -186,9 +186,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv4 address helper Test
+ * @brief IPv4 address helper Test
  */
 class IpAddressHelperTestCasev4 : public TestCase
 {
@@ -265,9 +265,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv4 Address Helper TestSuite
+ * @brief IPv4 Address Helper TestSuite
  */
 class Ipv4AddressHelperTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/ipv4-deduplication-test.cc ns-3.44/src/internet/test/ipv4-deduplication-test.cc
--- ns-3.43/src/internet/test/ipv4-deduplication-test.cc	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/test/ipv4-deduplication-test.cc	2025-03-09 16:55:49.411371200 -0700
@@ -45,9 +45,9 @@
 using namespace ns3;
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv4 Deduplication Test
+ * @brief IPv4 Deduplication Test
  *
  * Tests topology:
  *
@@ -71,42 +71,42 @@
 class Ipv4DeduplicationTest : public TestCase
 {
     /**
-     * \brief Send data.
-     * \param socket The sending socket.
-     * \param to Destination address.
+     * @brief Send data.
+     * @param socket The sending socket.
+     * @param to Destination address.
      */
     void DoSendData(Ptr<Socket> socket, std::string to);
     /**
-     * \brief Send data.
-     * \param socket The sending socket.
-     * \param packet The packet to send.
-     * \param to Destination address.
+     * @brief Send data.
+     * @param socket The sending socket.
+     * @param packet The packet to send.
+     * @param to Destination address.
      */
     void DoSendPacket(Ptr<Socket> socket, Ptr<Packet> packet, std::string to);
     /**
-     * \brief Send data.
-     * \param socket The sending socket.
-     * \param to Destination address.
+     * @brief Send data.
+     * @param socket The sending socket.
+     * @param to Destination address.
      */
     void SendData(Ptr<Socket> socket, std::string to);
 
     /**
-     * \brief Send data.
-     * \param socket The sending socket.
-     * \param packet The packet to send.
-     * \param to Destination address.
+     * @brief Send data.
+     * @param socket The sending socket.
+     * @param packet The packet to send.
+     * @param to Destination address.
      */
     void SendPacket(Ptr<Socket> socket, Ptr<Packet> packet, std::string to);
 
     /**
-     * \brief Check packet receptions
-     * \param name Node name
+     * @brief Check packet receptions
+     * @param name Node name
      */
     void CheckPackets(const std::string& name);
 
     /**
-     * \brief Check packet drops
-     * \param name Node name
+     * @brief Check packet drops
+     * @param name Node name
      */
     void CheckDrops(const std::string& name);
 
@@ -114,9 +114,9 @@
 
     /**
      * Creates the test name according to the parameters
-     * \param enable deduplication enabled
-     * \param expire expiration delay for duplicate cache entries
-     * \returns A string describing the test
+     * @param enable deduplication enabled
+     * @param expire expiration delay for duplicate cache entries
+     * @returns A string describing the test
      */
     static std::string MakeName(bool enable, Time expire);
 
@@ -142,24 +142,24 @@
 
     /**
      * Constructor
-     * \param enable deduplication enabled
-     * \param expire expiration delay for duplicate cache entries
+     * @param enable deduplication enabled
+     * @param expire expiration delay for duplicate cache entries
      */
     Ipv4DeduplicationTest(bool enable, Time expire = Seconds(1));
 
     /**
-     * \brief Receive data.
-     * \param [in] socket The receive socket.
+     * @brief Receive data.
+     * @param [in] socket The receive socket.
      */
     void ReceivePkt(Ptr<Socket> socket);
 
     /**
-     * \brief Register dropped packet.
-     * \param [in] ipHeader IP header
-     * \param [in] packet Packet that was dropped
-     * \param [in] reason Reason for dropping packet
-     * \param [in] ipv4 Ipv4 instance
-     * \param [in] interface Interface number
+     * @brief Register dropped packet.
+     * @param [in] ipHeader IP header
+     * @param [in] packet Packet that was dropped
+     * @param [in] reason Reason for dropping packet
+     * @param [in] ipv4 Ipv4 instance
+     * @param [in] interface Interface number
      */
     void DropPkt(const Ipv4Header& ipHeader,
                  Ptr<const Packet> packet,
@@ -533,9 +533,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv4 Deduplication TestSuite
+ * @brief IPv4 Deduplication TestSuite
  */
 class Ipv4DeduplicationTestSuite : public TestSuite
 {
@@ -558,9 +558,9 @@
     g_ipv4DeduplicationTestSuite; //!< Static variable for test initialization
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv4 Deduplication Performance Test
+ * @brief IPv4 Deduplication Performance Test
  *
  * This test case sets up a fully connected network of
  * 10 nodes.  Each node transmits 2 packets / second
@@ -593,9 +593,9 @@
 
     /**
      * Send data
-     * \param socket output socket
-     * \param to destination address
-     * \param socketIndex index of the socket
+     * @param socket output socket
+     * @param to destination address
+     * @param socketIndex index of the socket
      */
     void DoSendData(Ptr<Socket> socket, Address to, uint8_t socketIndex);
 };
@@ -715,9 +715,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv4 Deduplication Performance TestSuite
+ * @brief IPv4 Deduplication Performance TestSuite
  */
 class Ipv4DeduplicationPerformanceTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/ipv4-forwarding-test.cc ns-3.44/src/internet/test/ipv4-forwarding-test.cc
--- ns-3.43/src/internet/test/ipv4-forwarding-test.cc	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/test/ipv4-forwarding-test.cc	2025-03-09 16:55:49.411371200 -0700
@@ -32,24 +32,24 @@
 using namespace ns3;
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv4 Forwarding Test
+ * @brief IPv4 Forwarding Test
  */
 class Ipv4ForwardingTest : public TestCase
 {
     Ptr<Packet> m_receivedPacket; //!< Received packet
 
     /**
-     * \brief Send data.
-     * \param socket The sending socket.
-     * \param to Destination address.
+     * @brief Send data.
+     * @param socket The sending socket.
+     * @param to Destination address.
      */
     void DoSendData(Ptr<Socket> socket, std::string to);
     /**
-     * \brief Send data.
-     * \param socket The sending socket.
-     * \param to Destination address.
+     * @brief Send data.
+     * @param socket The sending socket.
+     * @param to Destination address.
      */
     void SendData(Ptr<Socket> socket, std::string to);
 
@@ -58,8 +58,8 @@
     Ipv4ForwardingTest();
 
     /**
-     * \brief Receive data.
-     * \param socket The receiving socket.
+     * @brief Receive data.
+     * @param socket The receiving socket.
      */
     void ReceivePkt(Ptr<Socket> socket);
 };
@@ -214,9 +214,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv4 Forwarding TestSuite
+ * @brief IPv4 Forwarding TestSuite
  */
 class Ipv4ForwardingTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/ipv4-fragmentation-test.cc ns-3.44/src/internet/test/ipv4-fragmentation-test.cc
--- ns-3.43/src/internet/test/ipv4-fragmentation-test.cc	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/test/ipv4-fragmentation-test.cc	2025-03-09 16:55:49.411371200 -0700
@@ -47,9 +47,9 @@
 class UdpSocketImpl;
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Tag used in IPv4 Fragmentation Test
+ * @brief Tag used in IPv4 Fragmentation Test
  */
 class IPv4TestTag : public Tag
 {
@@ -57,8 +57,8 @@
     uint64_t token; //!< Token carried by the tag.
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId()
     {
@@ -93,8 +93,8 @@
     }
 
     /**
-     * \brief Set the token.
-     * \param token The token.
+     * @brief Set the token.
+     * @param token The token.
      */
     void SetToken(uint64_t token)
     {
@@ -102,8 +102,8 @@
     }
 
     /**
-     * \brief Get the token.
-     * \returns The token.
+     * @brief Get the token.
+     * @returns The token.
      */
     uint64_t GetToken() const
     {
@@ -112,9 +112,9 @@
 };
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv4 Fragmentation Test
+ * @brief IPv4 Fragmentation Test
  */
 class Ipv4FragmentationTest : public TestCase
 {
@@ -134,7 +134,7 @@
     void DoRun() override;
     /**
      * Constructor
-     * \param broadcast send broadcast packets (true) or unicast packets (false)
+     * @param broadcast send broadcast packets (true) or unicast packets (false)
      */
     Ipv4FragmentationTest(bool broadcast);
     ~Ipv4FragmentationTest() override;
@@ -142,35 +142,35 @@
     // server part
 
     /**
-     * \brief Start the server.
-     * \param ServerNode The server.
+     * @brief Start the server.
+     * @param ServerNode The server.
      */
     void StartServer(Ptr<Node> ServerNode);
     /**
-     * \brief Handle incoming packets.
-     * \param socket The receiving socket.
+     * @brief Handle incoming packets.
+     * @param socket The receiving socket.
      */
     void HandleReadServer(Ptr<Socket> socket);
 
     // client part
 
     /**
-     * \brief Start the client.
-     * \param ClientNode The client.
+     * @brief Start the client.
+     * @param ClientNode The client.
      */
     void StartClient(Ptr<Node> ClientNode);
     /**
-     * \brief Handle incoming packets.
-     * \param socket The receiving socket.
+     * @brief Handle incoming packets.
+     * @param socket The receiving socket.
      */
     void HandleReadClient(Ptr<Socket> socket);
     /**
-     * \brief Handle incoming ICMP packets.
-     * \param icmpSource The ICMP sender.
-     * \param icmpTtl The ICMP TTL.
-     * \param icmpType The ICMP Type.
-     * \param icmpCode The ICMP Code.
-     * \param icmpInfo The ICMP Info.
+     * @brief Handle incoming ICMP packets.
+     * @param icmpSource The ICMP sender.
+     * @param icmpTtl The ICMP TTL.
+     * @param icmpType The ICMP Type.
+     * @param icmpCode The ICMP Code.
+     * @param icmpInfo The ICMP Info.
      */
     void HandleReadIcmpClient(Ipv4Address icmpSource,
                               uint8_t icmpTtl,
@@ -179,16 +179,16 @@
                               uint32_t icmpInfo);
 
     /**
-     * \brief Set the packet fill.
-     * \param fill The fill.
-     * \param fillSize The fill size.
-     * \param dataSize The packet size.
+     * @brief Set the packet fill.
+     * @param fill The fill.
+     * @param fillSize The fill size.
+     * @param dataSize The packet size.
      */
     void SetFill(uint8_t* fill, uint32_t fillSize, uint32_t dataSize);
 
     /**
-     * \brief Send a packet.
-     * \returns The sent packet.
+     * @brief Send a packet.
+     * @returns The sent packet.
      */
     Ptr<Packet> SendClient();
 };
@@ -565,9 +565,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv4 Fragmentation TestSuite
+ * @brief IPv4 Fragmentation TestSuite
  */
 class Ipv4FragmentationTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/ipv4-global-routing-test-suite.cc ns-3.44/src/internet/test/ipv4-global-routing-test-suite.cc
--- ns-3.43/src/internet/test/ipv4-global-routing-test-suite.cc	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/test/ipv4-global-routing-test-suite.cc	2025-03-09 16:55:49.411371200 -0700
@@ -106,9 +106,9 @@
 //              route to 10.1.1.0 gw 10.1.2.1
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv4 GlobalRouting Link test
+ * @brief IPv4 GlobalRouting Link test
  */
 class LinkTest : public TestCase
 {
@@ -190,9 +190,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv4 GlobalRouting LAN test
+ * @brief IPv4 GlobalRouting LAN test
  */
 class LanTest : public TestCase
 {
@@ -271,9 +271,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv4 GlobalRouting Two Link test
+ * @brief IPv4 GlobalRouting Two Link test
  */
 class TwoLinkTest : public TestCase
 {
@@ -390,9 +390,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv4 GlobalRouting Two LAN test
+ * @brief IPv4 GlobalRouting Two LAN test
  */
 class TwoLanTest : public TestCase
 {
@@ -490,9 +490,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv4 GlobalRouting Bridge test
+ * @brief IPv4 GlobalRouting Bridge test
  */
 class BridgeTest : public TestCase
 {
@@ -673,9 +673,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv4 GlobalRouting Two bridges test
+ * @brief IPv4 GlobalRouting Two bridges test
  */
 class TwoBridgeTest : public TestCase
 {
@@ -830,9 +830,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv4 Dynamic GlobalRouting test
+ * @brief IPv4 Dynamic GlobalRouting test
  */
 class Ipv4DynamicGlobalRoutingTestCase : public TestCase
 {
@@ -842,20 +842,20 @@
 
   private:
     /**
-     * \brief Send some data
-     * \param index Index of the socket to use.
+     * @brief Send some data
+     * @param index Index of the socket to use.
      */
     void SendData(uint8_t index);
 
     /**
-     * \brief Shutdown a socket
-     * \param index Index of the socket to close.
+     * @brief Shutdown a socket
+     * @param index Index of the socket to close.
      */
     void ShutDownSock(uint8_t index);
 
     /**
      * Handle an incoming packet
-     * \param socket The input socket.
+     * @param socket The input socket.
      */
     void HandleRead(Ptr<Socket> socket);
     void DoRun() override;
@@ -1027,8 +1027,8 @@
     sendSockA.first->Connect(InetSocketAddress(i5i6.GetAddress(1), port));
     sendSockA.second = true;
     m_sendSocks.push_back(sendSockA);
-    Simulator::Schedule(Seconds(1.0), &Ipv4DynamicGlobalRoutingTestCase::SendData, this, 0);
-    Simulator::Schedule(Seconds(10.0), &Ipv4DynamicGlobalRoutingTestCase::ShutDownSock, this, 0);
+    Simulator::Schedule(Seconds(1), &Ipv4DynamicGlobalRoutingTestCase::SendData, this, 0);
+    Simulator::Schedule(Seconds(10), &Ipv4DynamicGlobalRoutingTestCase::ShutDownSock, this, 0);
 
     std::pair<Ptr<Socket>, bool> sendSockB;
     sendSockB.first = Socket::CreateSocket(c.Get(1), tid);
@@ -1036,8 +1036,8 @@
     sendSockB.first->Connect(InetSocketAddress(i1i6.GetAddress(1), port));
     sendSockB.second = true;
     m_sendSocks.push_back(sendSockB);
-    Simulator::Schedule(Seconds(11.0), &Ipv4DynamicGlobalRoutingTestCase::SendData, this, 1);
-    Simulator::Schedule(Seconds(16.0), &Ipv4DynamicGlobalRoutingTestCase::ShutDownSock, this, 1);
+    Simulator::Schedule(Seconds(11), &Ipv4DynamicGlobalRoutingTestCase::SendData, this, 1);
+    Simulator::Schedule(Seconds(16), &Ipv4DynamicGlobalRoutingTestCase::ShutDownSock, this, 1);
 
     // Create an optional packet sink to receive these packets
     Ptr<Socket> sink2 = Socket::CreateSocket(c.Get(6), tid);
@@ -1138,9 +1138,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv4 Dynamic GlobalRouting /32 test
+ * @brief IPv4 Dynamic GlobalRouting /32 test
  */
 class Ipv4GlobalRoutingSlash32TestCase : public TestCase
 {
@@ -1151,20 +1151,20 @@
     Ptr<Packet> m_receivedPacket; //!< number of received packets
 
     /**
-     * \brief Receive a packet.
-     * \param socket The receiving socket.
+     * @brief Receive a packet.
+     * @param socket The receiving socket.
      */
     void ReceivePkt(Ptr<Socket> socket);
     /**
-     * \brief Send a packet.
-     * \param socket The sending socket.
-     * \param to The address of the receiver.
+     * @brief Send a packet.
+     * @param socket The sending socket.
+     * @param to The address of the receiver.
      */
     void DoSendData(Ptr<Socket> socket, std::string to);
     /**
-     * \brief Send a packet.
-     * \param socket The sending socket.
-     * \param to The address of the receiver.
+     * @brief Send a packet.
+     * @param socket The sending socket.
+     * @param to The address of the receiver.
      */
     void SendData(Ptr<Socket> socket, std::string to);
 
@@ -1301,9 +1301,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv4 GlobalRouting TestSuite
+ * @brief IPv4 GlobalRouting TestSuite
  */
 class Ipv4GlobalRoutingTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/ipv4-header-test.cc ns-3.44/src/internet/test/ipv4-header-test.cc
--- ns-3.43/src/internet/test/ipv4-header-test.cc	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/test/ipv4-header-test.cc	2025-03-09 16:55:49.411371200 -0700
@@ -41,9 +41,9 @@
 using namespace ns3;
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv4 Header Test
+ * @brief IPv4 Header Test
  */
 class Ipv4HeaderTest : public TestCase
 {
@@ -51,11 +51,11 @@
     Ipv4Header m_receivedHeader;  //!< Received header.
 
     /**
-     * \brief Send a packet with specific DSCP and ECN fields.
-     * \param socket The source socket.
-     * \param to The destination address.
-     * \param dscp The DSCP field.
-     * \param ecn The ECN field.
+     * @brief Send a packet with specific DSCP and ECN fields.
+     * @param socket The source socket.
+     * @param to The destination address.
+     * @param dscp The DSCP field.
+     * @param ecn The ECN field.
      */
     void DoSendData_IpHdr_Dscp(Ptr<Socket> socket,
                                std::string to,
@@ -63,11 +63,11 @@
                                Ipv4Header::EcnType ecn);
 
     /**
-     * \brief Send a packet with specific DSCP and ECN fields.
-     * \param socket The source socket.
-     * \param to The destination address.
-     * \param dscp The DSCP field.
-     * \param ecn The ECN field.
+     * @brief Send a packet with specific DSCP and ECN fields.
+     * @param socket The source socket.
+     * @param to The destination address.
+     * @param dscp The DSCP field.
+     * @param ecn The ECN field.
      */
     void SendData_IpHdr_Dscp(Ptr<Socket> socket,
                              std::string to,
@@ -79,15 +79,15 @@
     Ipv4HeaderTest();
 
     /**
-     * \brief Receives a packet.
-     * \param socket The receiving socket.
-     * \param packet The packet.
-     * \param from The source address.
+     * @brief Receives a packet.
+     * @param socket The receiving socket.
+     * @param packet The packet.
+     * @param from The source address.
      */
     void ReceivePacket(Ptr<Socket> socket, Ptr<Packet> packet, const Address& from);
     /**
-     * \brief Receives a packet.
-     * \param socket The receiving socket.
+     * @brief Receives a packet.
+     * @param socket The receiving socket.
      */
     void ReceivePkt(Ptr<Socket> socket);
 };
@@ -280,9 +280,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv4 Header TestSuite
+ * @brief IPv4 Header TestSuite
  */
 class Ipv4HeaderTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/ipv4-list-routing-test-suite.cc ns-3.44/src/internet/test/ipv4-list-routing-test-suite.cc
--- ns-3.43/src/internet/test/ipv4-list-routing-test-suite.cc	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/test/ipv4-list-routing-test-suite.cc	2025-03-09 16:55:49.411371200 -0700
@@ -13,9 +13,9 @@
 {
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv4 dummy routing class (A)
+ * @brief IPv4 dummy routing class (A)
  */
 class Ipv4ARouting : public Ipv4RoutingProtocol
 {
@@ -65,9 +65,9 @@
 };
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv4 dummy routing class (B)
+ * @brief IPv4 dummy routing class (B)
  */
 class Ipv4BRouting : public Ipv4RoutingProtocol
 {
@@ -117,9 +117,9 @@
 };
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv4 ListRouting negative test.
+ * @brief IPv4 ListRouting negative test.
  */
 class Ipv4ListRoutingNegativeTestCase : public TestCase
 {
@@ -151,9 +151,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv4 ListRouting positive test.
+ * @brief IPv4 ListRouting positive test.
  */
 class Ipv4ListRoutingPositiveTestCase : public TestCase
 {
@@ -190,9 +190,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv4 ListRouting TestSuite
+ * @brief IPv4 ListRouting TestSuite
  */
 class Ipv4ListRoutingTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/ipv4-packet-info-tag-test-suite.cc ns-3.44/src/internet/test/ipv4-packet-info-tag-test-suite.cc
--- ns-3.43/src/internet/test/ipv4-packet-info-tag-test-suite.cc	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/test/ipv4-packet-info-tag-test-suite.cc	2025-03-09 16:55:49.411371200 -0700
@@ -42,9 +42,9 @@
 using namespace ns3;
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv4 PacketInfoTag Test
+ * @brief IPv4 PacketInfoTag Test
  */
 class Ipv4PacketInfoTagTest : public TestCase
 {
@@ -55,14 +55,14 @@
     void DoRun() override;
 
     /**
-     * \brief Receive callback.
-     * \param socket Receiving socket.
+     * @brief Receive callback.
+     * @param socket Receiving socket.
      */
     void RxCb(Ptr<Socket> socket);
     /**
-     * \brief Send data.
-     * \param socket Sending socket.
-     * \param to Destination address.
+     * @brief Send data.
+     * @param socket Sending socket.
+     * @param to Destination address.
      */
     void DoSendData(Ptr<Socket> socket, std::string to);
 };
@@ -196,9 +196,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv4 PacketInfoTag TestSuite
+ * @brief IPv4 PacketInfoTag TestSuite
  */
 class Ipv4PacketInfoTagTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/ipv4-raw-test.cc ns-3.44/src/internet/test/ipv4-raw-test.cc
--- ns-3.43/src/internet/test/ipv4-raw-test.cc	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/test/ipv4-raw-test.cc	2025-03-09 16:55:49.411371200 -0700
@@ -42,9 +42,9 @@
 using namespace ns3;
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv4 RAW Socket Test
+ * @brief IPv4 RAW Socket Test
  */
 class Ipv4RawSocketImplTest : public TestCase
 {
@@ -52,27 +52,27 @@
     Ptr<Packet> m_receivedPacket2; //!< Received packet (2).
 
     /**
-     * \brief Send data.
-     * \param socket The sending socket.
-     * \param to Destination address.
+     * @brief Send data.
+     * @param socket The sending socket.
+     * @param to Destination address.
      */
     void DoSendData(Ptr<Socket> socket, std::string to);
     /**
-     * \brief Send data.
-     * \param socket The sending socket.
-     * \param to Destination address.
+     * @brief Send data.
+     * @param socket The sending socket.
+     * @param to Destination address.
      */
     void SendData(Ptr<Socket> socket, std::string to);
     /**
-     * \brief Send data.
-     * \param socket The sending socket.
-     * \param to Destination address.
+     * @brief Send data.
+     * @param socket The sending socket.
+     * @param to Destination address.
      */
     void DoSendData_IpHdr(Ptr<Socket> socket, std::string to);
     /**
-     * \brief Send data.
-     * \param socket The sending socket.
-     * \param to Destination address.
+     * @brief Send data.
+     * @param socket The sending socket.
+     * @param to Destination address.
      */
     void SendData_IpHdr(Ptr<Socket> socket, std::string to);
 
@@ -81,27 +81,27 @@
     Ipv4RawSocketImplTest();
 
     /**
-     * \brief Receive data.
-     * \param socket The receiving socket.
-     * \param packet The received packet.
-     * \param from The sender.
+     * @brief Receive data.
+     * @param socket The receiving socket.
+     * @param packet The received packet.
+     * @param from The sender.
      */
     void ReceivePacket(Ptr<Socket> socket, Ptr<Packet> packet, const Address& from);
     /**
-     * \brief Receive data.
-     * \param socket The receiving socket.
-     * \param packet The received packet.
-     * \param from The sender.
+     * @brief Receive data.
+     * @param socket The receiving socket.
+     * @param packet The received packet.
+     * @param from The sender.
      */
     void ReceivePacket2(Ptr<Socket> socket, Ptr<Packet> packet, const Address& from);
     /**
-     * \brief Receive data.
-     * \param socket The receiving socket.
+     * @brief Receive data.
+     * @param socket The receiving socket.
      */
     void ReceivePkt(Ptr<Socket> socket);
     /**
-     * \brief Receive data.
-     * \param socket The receiving socket.
+     * @brief Receive data.
+     * @param socket The receiving socket.
      */
     void ReceivePkt2(Ptr<Socket> socket);
 };
@@ -359,9 +359,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv4 RAW Socket TestSuite
+ * @brief IPv4 RAW Socket TestSuite
  */
 class Ipv4RawTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/ipv4-rip-test.cc ns-3.44/src/internet/test/ipv4-rip-test.cc
--- ns-3.43/src/internet/test/ipv4-rip-test.cc	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/test/ipv4-rip-test.cc	2025-03-09 16:55:49.411371200 -0700
@@ -34,24 +34,24 @@
 using namespace ns3;
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv4 RIP Test
+ * @brief IPv4 RIP Test
  */
 class Ipv4RipTest : public TestCase
 {
     Ptr<Packet> m_receivedPacket; //!< Received packet
 
     /**
-     * \brief Send data.
-     * \param socket The sending socket.
-     * \param to Destination address.
+     * @brief Send data.
+     * @param socket The sending socket.
+     * @param to Destination address.
      */
     void DoSendData(Ptr<Socket> socket, std::string to);
     /**
-     * \brief Send data.
-     * \param socket The sending socket.
-     * \param to Destination address.
+     * @brief Send data.
+     * @param socket The sending socket.
+     * @param to Destination address.
      */
     void SendData(Ptr<Socket> socket, std::string to);
 
@@ -60,8 +60,8 @@
     Ipv4RipTest();
 
     /**
-     * \brief Receive data.
-     * \param socket The receiving socket.
+     * @brief Receive data.
+     * @param socket The receiving socket.
      */
     void ReceivePkt(Ptr<Socket> socket);
 };
@@ -263,24 +263,24 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv4 RIP count to infinity Test
+ * @brief IPv4 RIP count to infinity Test
  */
 class Ipv4RipCountToInfinityTest : public TestCase
 {
     Ptr<Packet> m_receivedPacket; //!< Received packet
 
     /**
-     * \brief Send data.
-     * \param socket The sending socket.
-     * \param to Destination address.
+     * @brief Send data.
+     * @param socket The sending socket.
+     * @param to Destination address.
      */
     void DoSendData(Ptr<Socket> socket, std::string to);
     /**
-     * \brief Send data.
-     * \param socket The sending socket.
-     * \param to Destination address.
+     * @brief Send data.
+     * @param socket The sending socket.
+     * @param to Destination address.
      */
     void SendData(Ptr<Socket> socket, std::string to);
 
@@ -289,8 +289,8 @@
     Ipv4RipCountToInfinityTest();
 
     /**
-     * \brief Receive data.
-     * \param socket The receiving socket.
+     * @brief Receive data.
+     * @param socket The receiving socket.
      */
     void ReceivePkt(Ptr<Socket> socket);
 };
@@ -496,9 +496,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv4 RIP SplitHorizon strategy Test
+ * @brief IPv4 RIP SplitHorizon strategy Test
  */
 class Ipv4RipSplitHorizonStrategyTest : public TestCase
 {
@@ -509,14 +509,14 @@
     void DoRun() override;
 
     /**
-     * \brief Constructor.
-     * \param strategy The SplitHorizon strategy.
+     * @brief Constructor.
+     * @param strategy The SplitHorizon strategy.
      */
     Ipv4RipSplitHorizonStrategyTest(Rip::SplitHorizonType_e strategy);
 
     /**
-     * \brief Receive data.
-     * \param socket The receiving socket.
+     * @brief Receive data.
+     * @param socket The receiving socket.
      */
     void ReceivePktProbe(Ptr<Socket> socket);
 };
@@ -684,9 +684,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv4 RIP TestSuite
+ * @brief IPv4 RIP TestSuite
  */
 class Ipv4RipTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/ipv4-static-routing-test-suite.cc ns-3.44/src/internet/test/ipv4-static-routing-test-suite.cc
--- ns-3.43/src/internet/test/ipv4-static-routing-test-suite.cc	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/test/ipv4-static-routing-test-suite.cc	2025-03-09 16:55:49.411371200 -0700
@@ -27,9 +27,9 @@
 using namespace ns3;
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv4 StaticRouting /32 Test
+ * @brief IPv4 StaticRouting /32 Test
  */
 class Ipv4StaticRoutingSlash32TestCase : public TestCase
 {
@@ -40,21 +40,21 @@
     Ptr<Packet> m_receivedPacket; //!< Received packet
 
     /**
-     * \brief Send data.
-     * \param socket The sending socket.
-     * \param to Destination address.
+     * @brief Send data.
+     * @param socket The sending socket.
+     * @param to Destination address.
      */
     void DoSendData(Ptr<Socket> socket, std::string to);
     /**
-     * \brief Send data.
-     * \param socket The sending socket.
-     * \param to Destination address.
+     * @brief Send data.
+     * @param socket The sending socket.
+     * @param to Destination address.
      */
     void SendData(Ptr<Socket> socket, std::string to);
 
     /**
-     * \brief Receive data.
-     * \param socket The receiving socket.
+     * @brief Receive data.
+     * @param socket The receiving socket.
      */
     void ReceivePkt(Ptr<Socket> socket);
 
@@ -197,9 +197,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv4 StaticRouting /32 TestSuite
+ * @brief IPv4 StaticRouting /32 TestSuite
  */
 class Ipv4StaticRoutingTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/ipv4-test.cc ns-3.44/src/internet/test/ipv4-test.cc
--- ns-3.43/src/internet/test/ipv4-test.cc	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/test/ipv4-test.cc	2025-03-09 16:55:49.411371200 -0700
@@ -20,9 +20,9 @@
 using namespace ns3;
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv4 Test
+ * @brief IPv4 Test
  */
 class Ipv4L3ProtocolTestCase : public TestCase
 {
@@ -110,9 +110,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv4 TestSuite
+ * @brief IPv4 TestSuite
  */
 class IPv4L3ProtocolTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/ipv6-address-duplication-test.cc ns-3.44/src/internet/test/ipv6-address-duplication-test.cc
--- ns-3.43/src/internet/test/ipv6-address-duplication-test.cc	2024-10-09 16:41:09.892655800 -0700
+++ ns-3.44/src/internet/test/ipv6-address-duplication-test.cc	2025-03-09 16:55:49.411371200 -0700
@@ -32,9 +32,9 @@
 using namespace ns3;
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv6 Duplicate Address Detection Test
+ * @brief IPv6 Duplicate Address Detection Test
  */
 class Ipv6DadTest : public TestCase
 {
@@ -105,9 +105,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv6 Duplicate Address Detection TestSuite
+ * @brief IPv6 Duplicate Address Detection TestSuite
  */
 class Ipv6DadTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/ipv6-address-generator-test-suite.cc ns-3.44/src/internet/test/ipv6-address-generator-test-suite.cc
--- ns-3.43/src/internet/test/ipv6-address-generator-test-suite.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/ipv6-address-generator-test-suite.cc	2025-03-09 16:55:49.411371200 -0700
@@ -12,9 +12,9 @@
 using namespace ns3;
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv6 network number allocator Test
+ * @brief IPv6 network number allocator Test
  */
 class NetworkNumber6AllocatorTestCase : public TestCase
 {
@@ -70,9 +70,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv6 address allocator Test
+ * @brief IPv6 address allocator Test
  */
 class AddressAllocator6TestCase : public TestCase
 {
@@ -134,9 +134,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv6 network number and address allocator Test
+ * @brief IPv6 network number and address allocator Test
  */
 class NetworkAndAddress6TestCase : public TestCase
 {
@@ -185,9 +185,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv6 example of an address generator Test
+ * @brief IPv6 example of an address generator Test
  */
 class ExampleAddress6GeneratorTestCase : public TestCase
 {
@@ -249,9 +249,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv6 address collision Test
+ * @brief IPv6 address collision Test
  */
 class AddressCollision6TestCase : public TestCase
 {
@@ -331,9 +331,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv6 address generator TestSuite
+ * @brief IPv6 address generator TestSuite
  */
 class Ipv6AddressGeneratorTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/ipv6-address-helper-test-suite.cc ns-3.44/src/internet/test/ipv6-address-helper-test-suite.cc
--- ns-3.43/src/internet/test/ipv6-address-helper-test-suite.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/ipv6-address-helper-test-suite.cc	2025-03-09 16:55:49.411371200 -0700
@@ -17,9 +17,9 @@
 using namespace ns3;
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv6 AddressHelper Test
+ * @brief IPv6 AddressHelper Test
  */
 class IpAddressHelperTestCasev6 : public TestCase
 {
@@ -157,9 +157,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv6 AddressHelper TestSuite
+ * @brief IPv6 AddressHelper TestSuite
  */
 class Ipv6AddressHelperTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/ipv6-dual-stack-test-suite.cc ns-3.44/src/internet/test/ipv6-dual-stack-test-suite.cc
--- ns-3.43/src/internet/test/ipv6-dual-stack-test-suite.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/ipv6-dual-stack-test-suite.cc	2025-03-09 16:55:49.411371200 -0700
@@ -40,9 +40,9 @@
 NS_LOG_COMPONENT_DEFINE("Ipv6DualStackTestSuite");
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv6 dual stack Test
+ * @brief IPv6 dual stack Test
  */
 class DualStackTestCase : public TestCase
 {
@@ -54,7 +54,7 @@
     void DoTeardown() override;
 
     /**
-     * \brief Setup the test.
+     * @brief Setup the test.
      */
     void SetUpSim();
 
@@ -63,26 +63,26 @@
 
     /**
      * Handle connection created (1).
-     * \param s The socket.
-     * \param addr The peer address.
+     * @param s The socket.
+     * @param addr The peer address.
      */
     void ServerHandleConnectionCreated1(Ptr<Socket> s, const Address& addr);
     /**
      * Handle connection created (2).
-     * \param s The socket.
-     * \param addr The peer address.
+     * @param s The socket.
+     * @param addr The peer address.
      */
     void ServerHandleConnectionCreated2(Ptr<Socket> s, const Address& addr);
     /**
      * Handle connection created (3).
-     * \param s The socket.
-     * \param addr The peer address.
+     * @param s The socket.
+     * @param addr The peer address.
      */
     void ServerHandleConnectionCreated3(Ptr<Socket> s, const Address& addr);
     /**
      * Handle connection created (4).
-     * \param s The socket.
-     * \param addr The peer address.
+     * @param s The socket.
+     * @param addr The peer address.
      */
     void ServerHandleConnectionCreated4(Ptr<Socket> s, const Address& addr);
 
@@ -341,9 +341,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv6 dual stack TestSuite
+ * @brief IPv6 dual stack TestSuite
  */
 class Ipv6DualStackTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/ipv6-extension-header-test-suite.cc ns-3.44/src/internet/test/ipv6-extension-header-test-suite.cc
--- ns-3.43/src/internet/test/ipv6-extension-header-test-suite.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/ipv6-extension-header-test-suite.cc	2025-03-09 16:55:49.411371200 -0700
@@ -23,9 +23,9 @@
 // ===========================================================================
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv6 extensions Test: Empty option field.
+ * @brief IPv6 extensions Test: Empty option field.
  */
 class TestEmptyOptionField : public TestCase
 {
@@ -63,9 +63,9 @@
 // ===========================================================================
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv6 extensions Test: Option without alignment.
+ * @brief IPv6 extensions Test: Option without alignment.
  */
 class OptionWithoutAlignmentHeader : public Ipv6OptionHeader
 {
@@ -86,9 +86,9 @@
 };
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv6 extensions Test: Test the option without alignment.
+ * @brief IPv6 extensions Test: Test the option without alignment.
  */
 class TestOptionWithoutAlignment : public TestCase
 {
@@ -136,9 +136,9 @@
 // ===========================================================================
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv6 extensions Test: Option with alignment.
+ * @brief IPv6 extensions Test: Option with alignment.
  */
 class OptionWithAlignmentHeader : public Ipv6OptionHeader
 {
@@ -164,9 +164,9 @@
 };
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv6 extensions Test: Test the option with alignment.
+ * @brief IPv6 extensions Test: Test the option with alignment.
  */
 class TestOptionWithAlignment : public TestCase
 {
@@ -221,9 +221,9 @@
 // ===========================================================================
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv6 extensions Test: Test an option already aligned.
+ * @brief IPv6 extensions Test: Test an option already aligned.
  */
 class TestFulfilledAlignment : public TestCase
 {
@@ -260,9 +260,9 @@
 };
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv6 extensions TestSuite.
+ * @brief IPv6 extensions TestSuite.
  */
 class Ipv6ExtensionHeaderTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/ipv6-forwarding-test.cc ns-3.44/src/internet/test/ipv6-forwarding-test.cc
--- ns-3.43/src/internet/test/ipv6-forwarding-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/ipv6-forwarding-test.cc	2025-03-09 16:55:49.411371200 -0700
@@ -32,24 +32,24 @@
 using namespace ns3;
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv6 Forwarding Test
+ * @brief IPv6 Forwarding Test
  */
 class Ipv6ForwardingTest : public TestCase
 {
     Ptr<Packet> m_receivedPacket; //!< Received packet.
 
     /**
-     * \brief Send data.
-     * \param socket The sending socket.
-     * \param to Destination address.
+     * @brief Send data.
+     * @param socket The sending socket.
+     * @param to Destination address.
      */
     void DoSendData(Ptr<Socket> socket, std::string to);
     /**
-     * \brief Send data.
-     * \param socket The sending socket.
-     * \param to Destination address.
+     * @brief Send data.
+     * @param socket The sending socket.
+     * @param to Destination address.
      */
     void SendData(Ptr<Socket> socket, std::string to);
 
@@ -58,8 +58,8 @@
     Ipv6ForwardingTest();
 
     /**
-     * \brief Receive data.
-     * \param socket The receiving socket.
+     * @brief Receive data.
+     * @param socket The receiving socket.
      */
     void ReceivePkt(Ptr<Socket> socket);
 };
@@ -199,9 +199,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv6 Forwarding TestSuite
+ * @brief IPv6 Forwarding TestSuite
  */
 class Ipv6ForwardingTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/ipv6-fragmentation-test.cc ns-3.44/src/internet/test/ipv6-fragmentation-test.cc
--- ns-3.43/src/internet/test/ipv6-fragmentation-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/ipv6-fragmentation-test.cc	2025-03-09 16:55:49.411371200 -0700
@@ -6,7 +6,7 @@
  * Author: Tommaso Pecorella <tommaso.pecorella@unifi.it>
  */
 /**
- * \file
+ * @file
  *
  * This is the test code for ipv6-l3protocol.cc (only the fragmentation and reassembly part).
  */
@@ -55,9 +55,9 @@
 class UdpSocketImpl;
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Tag used in IPv6 Fragmentation Test
+ * @brief Tag used in IPv6 Fragmentation Test
  */
 class IPv6TestTag : public Tag
 {
@@ -65,8 +65,8 @@
     uint64_t token; //!< Token carried by the tag.
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId()
     {
@@ -101,8 +101,8 @@
     }
 
     /**
-     * \brief Set the token.
-     * \param token The token.
+     * @brief Set the token.
+     * @param token The token.
      */
     void SetToken(uint64_t token)
     {
@@ -110,8 +110,8 @@
     }
 
     /**
-     * \brief Get the token.
-     * \returns The token.
+     * @brief Get the token.
+     * @returns The token.
      */
     uint64_t GetToken() const
     {
@@ -120,9 +120,9 @@
 };
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv6 Fragmentation Test
+ * @brief IPv6 Fragmentation Test
  */
 class Ipv6FragmentationTest : public TestCase
 {
@@ -146,35 +146,35 @@
     // server part
 
     /**
-     * \brief Start the server.
-     * \param ServerNode The server.
+     * @brief Start the server.
+     * @param ServerNode The server.
      */
     void StartServer(Ptr<Node> ServerNode);
     /**
-     * \brief Handle incoming packets.
-     * \param socket The receiving socket.
+     * @brief Handle incoming packets.
+     * @param socket The receiving socket.
      */
     void HandleReadServer(Ptr<Socket> socket);
 
     // client part
 
     /**
-     * \brief Start the client.
-     * \param ClientNode The client.
+     * @brief Start the client.
+     * @param ClientNode The client.
      */
     void StartClient(Ptr<Node> ClientNode);
     /**
-     * \brief Handle incoming packets.
-     * \param socket The receiving socket.
+     * @brief Handle incoming packets.
+     * @param socket The receiving socket.
      */
     void HandleReadClient(Ptr<Socket> socket);
     /**
-     * \brief Handle incoming ICMP packets.
-     * \param icmpSource The ICMP sender.
-     * \param icmpTtl The ICMP TTL.
-     * \param icmpType The ICMP Type.
-     * \param icmpCode The ICMP Code.
-     * \param icmpInfo The ICMP Info.
+     * @brief Handle incoming ICMP packets.
+     * @param icmpSource The ICMP sender.
+     * @param icmpTtl The ICMP TTL.
+     * @param icmpType The ICMP Type.
+     * @param icmpCode The ICMP Code.
+     * @param icmpInfo The ICMP Info.
      */
     void HandleReadIcmpClient(Ipv6Address icmpSource,
                               uint8_t icmpTtl,
@@ -183,36 +183,36 @@
                               uint32_t icmpInfo);
 
     /**
-     * \brief Set the packet fill.
-     * \param fill The fill.
-     * \param fillSize The fill size.
-     * \param dataSize The packet size.
+     * @brief Set the packet fill.
+     * @param fill The fill.
+     * @param fillSize The fill size.
+     * @param dataSize The packet size.
      */
     void SetFill(uint8_t* fill, uint32_t fillSize, uint32_t dataSize);
 
     /**
-     * \brief Send a packet.
-     * \returns The sent packet.
+     * @brief Send a packet.
+     * @returns The sent packet.
      */
     Ptr<Packet> SendClient();
 
     /**
-     * \brief Handle Server's incoming packets.
+     * @brief Handle Server's incoming packets.
      * Ensure no packet greater than MTU is received
      *
-     * \param packet the packet.
-     * \param ipv6 the Ipv6 protocol.
-     * \param interface the IP-level interface index.
+     * @param packet the packet.
+     * @param ipv6 the Ipv6 protocol.
+     * @param interface the IP-level interface index.
      */
     void HandleServerRx(Ptr<const Packet> packet, Ptr<Ipv6> ipv6, uint32_t interface);
 
     /**
-     * \brief Handle Client's transmitting packets.
+     * @brief Handle Client's transmitting packets.
      * Ensure no packet greater than MTU is transmitted
      *
-     * \param packet the packet.
-     * \param ipv6 the Ipv6 protocol.
-     * \param interface the IP-level interface index.
+     * @param packet the packet.
+     * @param ipv6 the Ipv6 protocol.
+     * @param interface the IP-level interface index.
      */
     void HandleClientTx(Ptr<const Packet> packet, Ptr<Ipv6> ipv6, uint32_t interface);
 };
@@ -604,9 +604,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv6 Fragmentation TestSuite
+ * @brief IPv6 Fragmentation TestSuite
  */
 class Ipv6FragmentationTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/ipv6-list-routing-test-suite.cc ns-3.44/src/internet/test/ipv6-list-routing-test-suite.cc
--- ns-3.43/src/internet/test/ipv6-list-routing-test-suite.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/ipv6-list-routing-test-suite.cc	2025-03-09 16:55:49.411371200 -0700
@@ -14,9 +14,9 @@
 {
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv6 dummy routing class (A)
+ * @brief IPv6 dummy routing class (A)
  */
 class Ipv6ARouting : public Ipv6RoutingProtocol
 {
@@ -76,13 +76,15 @@
     {
     }
 
-    void PrintRoutingTable(Ptr<OutputStreamWrapper> stream, Time::Unit unit) const override{};
+    void PrintRoutingTable(Ptr<OutputStreamWrapper> stream, Time::Unit unit) const override
+    {
+    }
 };
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv6 dummy routing class (B)
+ * @brief IPv6 dummy routing class (B)
  */
 class Ipv6BRouting : public Ipv6RoutingProtocol
 {
@@ -142,13 +144,15 @@
     {
     }
 
-    void PrintRoutingTable(Ptr<OutputStreamWrapper> stream, Time::Unit unit) const override{};
+    void PrintRoutingTable(Ptr<OutputStreamWrapper> stream, Time::Unit unit) const override
+    {
+    }
 };
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv6 ListRouting negative test.
+ * @brief IPv6 ListRouting negative test.
  */
 class Ipv6ListRoutingNegativeTestCase : public TestCase
 {
@@ -180,9 +184,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv6 ListRouting positive test.
+ * @brief IPv6 ListRouting positive test.
  */
 class Ipv6ListRoutingPositiveTestCase : public TestCase
 {
@@ -219,9 +223,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv6 ListRouting TestSuite
+ * @brief IPv6 ListRouting TestSuite
  */
 class Ipv6ListRoutingTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/ipv6-packet-info-tag-test-suite.cc ns-3.44/src/internet/test/ipv6-packet-info-tag-test-suite.cc
--- ns-3.43/src/internet/test/ipv6-packet-info-tag-test-suite.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/ipv6-packet-info-tag-test-suite.cc	2025-03-09 16:55:49.411371200 -0700
@@ -64,9 +64,9 @@
 // }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv6 PacketInfoTag Test
+ * @brief IPv6 PacketInfoTag Test
  */
 class Ipv6PacketInfoTagTest : public TestCase
 {
@@ -76,14 +76,14 @@
   private:
     void DoRun() override;
     /**
-     * \brief Receive callback.
-     * \param socket Receiving socket.
+     * @brief Receive callback.
+     * @param socket Receiving socket.
      */
     void RxCb(Ptr<Socket> socket);
     /**
-     * \brief Send data.
-     * \param socket Sending socket.
-     * \param to Destination address.
+     * @brief Send data.
+     * @param socket Sending socket.
+     * @param to Destination address.
      */
     void DoSendData(Ptr<Socket> socket, std::string to);
 };
@@ -232,9 +232,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv6 PacketInfoTag TestSuite
+ * @brief IPv6 PacketInfoTag TestSuite
  */
 class Ipv6PacketInfoTagTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/ipv6-raw-test.cc ns-3.44/src/internet/test/ipv6-raw-test.cc
--- ns-3.43/src/internet/test/ipv6-raw-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/ipv6-raw-test.cc	2025-03-09 16:55:49.411371200 -0700
@@ -44,9 +44,9 @@
 using namespace ns3;
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv6 RAW Socket Test
+ * @brief IPv6 RAW Socket Test
  */
 class Ipv6RawSocketImplTest : public TestCase
 {
@@ -54,15 +54,15 @@
     Ptr<Packet> m_receivedPacket2; //!< Received packet (2).
 
     /**
-     * \brief Send data.
-     * \param socket The sending socket.
-     * \param to Destination address.
+     * @brief Send data.
+     * @param socket The sending socket.
+     * @param to Destination address.
      */
     void DoSendData(Ptr<Socket> socket, std::string to);
     /**
-     * \brief Send data.
-     * \param socket The sending socket.
-     * \param to Destination address.
+     * @brief Send data.
+     * @param socket The sending socket.
+     * @param to Destination address.
      */
     void SendData(Ptr<Socket> socket, std::string to);
 
@@ -71,27 +71,27 @@
     Ipv6RawSocketImplTest();
 
     /**
-     * \brief Receive data.
-     * \param socket The receiving socket.
-     * \param packet The received packet.
-     * \param from The sender.
+     * @brief Receive data.
+     * @param socket The receiving socket.
+     * @param packet The received packet.
+     * @param from The sender.
      */
     void ReceivePacket(Ptr<Socket> socket, Ptr<Packet> packet, const Address& from);
     /**
-     * \brief Receive data.
-     * \param socket The receiving socket.
-     * \param packet The received packet.
-     * \param from The sender.
+     * @brief Receive data.
+     * @param socket The receiving socket.
+     * @param packet The received packet.
+     * @param from The sender.
      */
     void ReceivePacket2(Ptr<Socket> socket, Ptr<Packet> packet, const Address& from);
     /**
-     * \brief Receive data.
-     * \param socket The receiving socket.
+     * @brief Receive data.
+     * @param socket The receiving socket.
      */
     void ReceivePkt(Ptr<Socket> socket);
     /**
-     * \brief Receive data.
-     * \param socket The receiving socket.
+     * @brief Receive data.
+     * @param socket The receiving socket.
      */
     void ReceivePkt2(Ptr<Socket> socket);
 };
@@ -311,9 +311,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv6 RAW Socket TestSuite
+ * @brief IPv6 RAW Socket TestSuite
  */
 class Ipv6RawTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/ipv6-ripng-test.cc ns-3.44/src/internet/test/ipv6-ripng-test.cc
--- ns-3.43/src/internet/test/ipv6-ripng-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/ipv6-ripng-test.cc	2025-03-09 16:55:49.411371200 -0700
@@ -33,24 +33,24 @@
 using namespace ns3;
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv6 RIPng Test
+ * @brief IPv6 RIPng Test
  */
 class Ipv6RipngTest : public TestCase
 {
     Ptr<Packet> m_receivedPacket; //!< Received packet
 
     /**
-     * \brief Send data.
-     * \param socket The sending socket.
-     * \param to Destination address.
+     * @brief Send data.
+     * @param socket The sending socket.
+     * @param to Destination address.
      */
     void DoSendData(Ptr<Socket> socket, std::string to);
     /**
-     * \brief Send data.
-     * \param socket The sending socket.
-     * \param to Destination address.
+     * @brief Send data.
+     * @param socket The sending socket.
+     * @param to Destination address.
      */
     void SendData(Ptr<Socket> socket, std::string to);
 
@@ -59,8 +59,8 @@
     Ipv6RipngTest();
 
     /**
-     * \brief Receive data.
-     * \param socket The receiving socket.
+     * @brief Receive data.
+     * @param socket The receiving socket.
      */
     void ReceivePkt(Ptr<Socket> socket);
 };
@@ -263,24 +263,24 @@
 // Ipv6RipngCountToInfinityTest
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv6 RIPng count to infinity Test
+ * @brief IPv6 RIPng count to infinity Test
  */
 class Ipv6RipngCountToInfinityTest : public TestCase
 {
     Ptr<Packet> m_receivedPacket; //!< Received packet
 
     /**
-     * \brief Send data.
-     * \param socket The sending socket.
-     * \param to Destination address.
+     * @brief Send data.
+     * @param socket The sending socket.
+     * @param to Destination address.
      */
     void DoSendData(Ptr<Socket> socket, std::string to);
     /**
-     * \brief Send data.
-     * \param socket The sending socket.
-     * \param to Destination address.
+     * @brief Send data.
+     * @param socket The sending socket.
+     * @param to Destination address.
      */
     void SendData(Ptr<Socket> socket, std::string to);
 
@@ -289,8 +289,8 @@
     Ipv6RipngCountToInfinityTest();
 
     /**
-     * \brief Receive data.
-     * \param socket The receiving socket.
+     * @brief Receive data.
+     * @param socket The receiving socket.
      */
     void ReceivePkt(Ptr<Socket> socket);
 };
@@ -495,9 +495,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv6 RIPng SplitHorizon strategy Test
+ * @brief IPv6 RIPng SplitHorizon strategy Test
  */
 class Ipv6RipngSplitHorizonStrategyTest : public TestCase
 {
@@ -507,14 +507,14 @@
   public:
     void DoRun() override;
     /**
-     * \brief Constructor.
-     * \param strategy The SplitHorizon strategy.
+     * @brief Constructor.
+     * @param strategy The SplitHorizon strategy.
      */
     Ipv6RipngSplitHorizonStrategyTest(RipNg::SplitHorizonType_e strategy);
 
     /**
-     * \brief Receive data.
-     * \param socket The receiving socket.
+     * @brief Receive data.
+     * @param socket The receiving socket.
      */
     void ReceivePktProbe(Ptr<Socket> socket);
 };
@@ -683,9 +683,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv6 RIPng TestSuite
+ * @brief IPv6 RIPng TestSuite
  */
 class Ipv6RipngTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/ipv6-test.cc ns-3.44/src/internet/test/ipv6-test.cc
--- ns-3.43/src/internet/test/ipv6-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/ipv6-test.cc	2025-03-09 16:55:49.411371200 -0700
@@ -20,9 +20,9 @@
 using namespace ns3;
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv6 Test
+ * @brief IPv6 Test
  */
 class Ipv6L3ProtocolTestCase : public TestCase
 {
@@ -167,9 +167,9 @@
 } // end DoRun
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief IPv6 TestSuite
+ * @brief IPv6 TestSuite
  */
 class IPv6L3ProtocolTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/neighbor-cache-test.cc ns-3.44/src/internet/test/neighbor-cache-test.cc
--- ns-3.43/src/internet/test/neighbor-cache-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/neighbor-cache-test.cc	2025-03-09 16:55:49.411371200 -0700
@@ -29,67 +29,67 @@
 using namespace ns3;
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Dynamic Neighbor Cache Test
+ * @brief Dynamic Neighbor Cache Test
  */
 class DynamicNeighborCacheTest : 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.
+     * @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.
+     * @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 socket The sending socket.
-     * \param to IPv4 Destination address.
+     * @brief Schedules the DoSendData () function to send the data.
+     * @param socket The sending socket.
+     * @param to IPv4 Destination address.
      */
     void SendData(Ptr<Socket> socket, Ipv4Address to);
 
     /**
-     * \brief Schedules the DoSendData () function to send the data.
-     * \param socket The sending socket.
-     * \param to IPv6 Destination address.
+     * @brief Schedules the DoSendData () function to send the data.
+     * @param socket The sending socket.
+     * @param to IPv6 Destination address.
      */
     void SendData(Ptr<Socket> socket, Ipv6Address to);
 
     /**
-     * \brief Add an IPv4 address to an IPv4 interface
-     * \param ipv4Interface The interface that address will be added.
-     * \param ifaceAddr The added IPv4 address.
+     * @brief Add an IPv4 address to an IPv4 interface
+     * @param ipv4Interface The interface that address will be added.
+     * @param ifaceAddr The added IPv4 address.
      */
     void AddIpv4Address(Ptr<Ipv4Interface> ipv4Interface, Ipv4InterfaceAddress ifaceAddr);
 
     /**
-     * \brief Add an IPv6 address to an IPv6 interface
-     * \param ipv6Interface The interface that address will be added.
-     * \param ifaceAddr The added IPv6 address.
+     * @brief Add an IPv6 address to an IPv6 interface
+     * @param ipv6Interface The interface that address will be added.
+     * @param ifaceAddr The added IPv6 address.
      */
     void AddIpv6Address(Ptr<Ipv6Interface> ipv6Interface, Ipv6InterfaceAddress ifaceAddr);
 
     /**
-     * \brief Remove an IPv4 address from an IPv4 interface
-     * \param ipv4Interface The interface that address will be removed from.
-     * \param index The index of IPv4 address that will be removed.
+     * @brief Remove an IPv4 address from an IPv4 interface
+     * @param ipv4Interface The interface that address will be removed from.
+     * @param index The index of IPv4 address that will be removed.
      */
     void RemoveIpv4Address(Ptr<Ipv4Interface> ipv4Interface, uint32_t index);
 
     /**
-     * \brief Remove an IPv6 address from an IPv6 interface
-     * \param ipv6Interface The interface that address will be removed from.
-     * \param index The index of IPv6 address that will be removed.
+     * @brief Remove an IPv6 address from an IPv6 interface
+     * @param ipv6Interface The interface that address will be removed from.
+     * @param index The index of IPv6 address that will be removed.
      */
     void RemoveIpv6Address(Ptr<Ipv6Interface> ipv6Interface, uint32_t index);
 
@@ -99,8 +99,8 @@
     DynamicNeighborCacheTest();
 
     /**
-     * \brief Receive data.
-     * \param socket The receiving socket.
+     * @brief Receive data.
+     * @param socket The receiving socket.
      */
     void ReceivePkt(Ptr<Socket> socket);
 
@@ -529,9 +529,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Neighbor cache on Channel Test
+ * @brief Neighbor cache on Channel Test
  */
 class ChannelTest : public TestCase
 {
@@ -618,9 +618,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Neighbor Cache on NetDeviceContainer Test
+ * @brief Neighbor Cache on NetDeviceContainer Test
  */
 class NetDeviceContainerTest : public TestCase
 {
@@ -708,9 +708,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Neighbor Cache on InterfaceContainer Test
+ * @brief Neighbor Cache on InterfaceContainer Test
  */
 class InterfaceContainerTest : public TestCase
 {
@@ -798,9 +798,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Neighbor Cache Flush Test
+ * @brief Neighbor Cache Flush Test
  */
 class FlushTest : public TestCase
 {
@@ -905,9 +905,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Neighbor Cache on Overlapped Scope Test
+ * @brief Neighbor Cache on Overlapped Scope Test
  */
 class DuplicateTest : public TestCase
 {
@@ -1004,9 +1004,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Dynamic Neighbor Cache on Reduced Scope Test
+ * @brief Dynamic Neighbor Cache on Reduced Scope Test
  */
 class DynamicPartialTest : public TestCase
 {
@@ -1015,30 +1015,30 @@
     DynamicPartialTest();
 
     /**
-     * \brief Add an IPv4 address to an IPv4 interface
-     * \param ipv4Interface The interface that address will be added.
-     * \param ifaceAddr The added IPv4 address.
+     * @brief Add an IPv4 address to an IPv4 interface
+     * @param ipv4Interface The interface that address will be added.
+     * @param ifaceAddr The added IPv4 address.
      */
     void AddIpv4Address(Ptr<Ipv4Interface> ipv4Interface, Ipv4InterfaceAddress ifaceAddr);
 
     /**
-     * \brief Add an IPv6 address to an IPv6 interface
-     * \param ipv6Interface The interface that address will be added.
-     * \param ifaceAddr The added IPv6 address.
+     * @brief Add an IPv6 address to an IPv6 interface
+     * @param ipv6Interface The interface that address will be added.
+     * @param ifaceAddr The added IPv6 address.
      */
     void AddIpv6Address(Ptr<Ipv6Interface> ipv6Interface, Ipv6InterfaceAddress ifaceAddr);
 
     /**
-     * \brief Remove an IPv4 address from an IPv4 interface
-     * \param ipv4Interface The interface that address will be removed from.
-     * \param index The index of IPv4 address that will be removed.
+     * @brief Remove an IPv4 address from an IPv4 interface
+     * @param ipv4Interface The interface that address will be removed from.
+     * @param index The index of IPv4 address that will be removed.
      */
     void RemoveIpv4Address(Ptr<Ipv4Interface> ipv4Interface, uint32_t index);
 
     /**
-     * \brief Remove an IPv6 address from an IPv6 interface
-     * \param ipv6Interface The interface that address will be removed from.
-     * \param index The index of IPv6 address that will be removed.
+     * @brief Remove an IPv6 address from an IPv6 interface
+     * @param ipv6Interface The interface that address will be removed from.
+     * @param index The index of IPv6 address that will be removed.
      */
     void RemoveIpv6Address(Ptr<Ipv6Interface> ipv6Interface, uint32_t index);
 
@@ -1211,9 +1211,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief NeighborCache TestSuite
+ * @brief NeighborCache TestSuite
  */
 class NeighborCacheTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/rtt-test.cc ns-3.44/src/internet/test/rtt-test.cc
--- ns-3.43/src/internet/test/rtt-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/rtt-test.cc	2025-03-09 16:55:49.411371200 -0700
@@ -16,9 +16,9 @@
 NS_LOG_COMPONENT_DEFINE("RttEstimatorTestSuite");
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief RTT estimator Test
+ * @brief RTT estimator Test
  */
 class RttEstimatorTestCase : public TestCase
 {
@@ -30,19 +30,19 @@
     void DoTeardown() override;
 
     /**
-     * \brief Check RTT values.
-     * \param rtt The RTT estimator.
-     * \param m The measurement.
-     * \param e The expected value.
-     * \param v The expected variance.
+     * @brief Check RTT values.
+     * @param rtt The RTT estimator.
+     * @param m The measurement.
+     * @param e The expected value.
+     * @param v The expected variance.
      */
     void CheckValues(Ptr<RttEstimator> rtt, Time m, Time e, Time v);
     /**
-     * \brief Check RTT values with a 1 nanosecond of tolerance.
-     * \param rtt The RTT estimator.
-     * \param m The measurement.
-     * \param e The expected value.
-     * \param v The expected variance.
+     * @brief Check RTT values with a 1 nanosecond of tolerance.
+     * @param rtt The RTT estimator.
+     * @param m The measurement.
+     * @param e The expected value.
+     * @param v The expected variance.
      */
     void CheckValuesWithTolerance(Ptr<RttEstimator> rtt, Time m, Time e, Time v);
 };
@@ -64,8 +64,8 @@
 RttEstimatorTestCase::CheckValuesWithTolerance(Ptr<RttEstimator> rtt, Time m, Time e, Time v)
 {
     rtt->Measurement(m);
-    NS_TEST_EXPECT_MSG_EQ_TOL(rtt->GetEstimate(), e, Time(NanoSeconds(1)), "Estimate not correct");
-    NS_TEST_EXPECT_MSG_EQ_TOL(rtt->GetVariation(), v, Time(NanoSeconds(1)), "Estimate not correct");
+    NS_TEST_EXPECT_MSG_EQ_TOL(rtt->GetEstimate(), e, NanoSeconds(1), "Estimate not correct");
+    NS_TEST_EXPECT_MSG_EQ_TOL(rtt->GetVariation(), v, NanoSeconds(1), "Estimate not correct");
 }
 
 void
@@ -103,23 +103,20 @@
     Time t(Seconds(1));
     Time t2(MilliSeconds(125));
     NS_TEST_EXPECT_MSG_EQ(t2, Time::From(t.GetInteger() >> 3), "X");
-    NS_TEST_EXPECT_MSG_EQ(rtt->GetEstimate(), Time(Seconds(1)), "Incorrect initial estimate");
-    NS_TEST_EXPECT_MSG_EQ(rtt->GetVariation(), Time(Seconds(0)), "Incorrect initial variance");
+    NS_TEST_EXPECT_MSG_EQ(rtt->GetEstimate(), Seconds(1), "Incorrect initial estimate");
+    NS_TEST_EXPECT_MSG_EQ(rtt->GetVariation(), Seconds(0), "Incorrect initial variance");
     NS_TEST_EXPECT_MSG_EQ(rtt->GetNSamples(), 0, "Incorrect initial estimate");
 
     // CheckValues (rtt, measurement, new estimate, new variance);
     // Initial value:  SRTT <- measurement; RTTVAR <- measurement/2
-    CheckValues(rtt, Time(Seconds(1)), Time(Seconds(1)), Time(MilliSeconds(500)));
+    CheckValues(rtt, Seconds(1), Seconds(1), MilliSeconds(500));
     // Subsequent values:  according to RFC 6298
-    CheckValues(rtt, Time(MilliSeconds(1200)), Time(MilliSeconds(1025)), Time(MilliSeconds(425)));
+    CheckValues(rtt, MilliSeconds(1200), MilliSeconds(1025), MilliSeconds(425));
     Ptr<RttEstimator> copy = rtt->Copy();
-    CheckValues(rtt, Time(MilliSeconds(900)), Time(MicroSeconds(1009375)), Time(MilliSeconds(350)));
+    CheckValues(rtt, MilliSeconds(900), MicroSeconds(1009375), MilliSeconds(350));
 
     // Check behavior of copy; should have inherited state
-    CheckValues(copy,
-                Time(MilliSeconds(900)),
-                Time(MicroSeconds(1009375)),
-                Time(MilliSeconds(350)));
+    CheckValues(copy, MilliSeconds(900), MicroSeconds(1009375), MilliSeconds(350));
 
     // Floating point arithmetic due to alpha and beta settings
     rtt->Reset();
@@ -127,15 +124,9 @@
     NS_TEST_EXPECT_MSG_EQ(ok, true, "Attribute should be settable");
     ok = rtt->SetAttributeFailSafe("Beta", DoubleValue(0.1));
     NS_TEST_EXPECT_MSG_EQ(ok, true, "Attribute should be settable");
-    CheckValuesWithTolerance(rtt, Time(Seconds(1.2)), Time(Seconds(1.2)), Time(Seconds(0.6)));
-    CheckValuesWithTolerance(rtt,
-                             Time(MilliSeconds(950)),
-                             Time(MilliSeconds(1175)),
-                             Time(MilliSeconds(565)));
-    CheckValuesWithTolerance(rtt,
-                             Time(MilliSeconds(1400)),
-                             Time(MicroSeconds(1197500)),
-                             Time(MilliSeconds(531)));
+    CheckValuesWithTolerance(rtt, Seconds(1.2), Seconds(1.2), Seconds(0.6));
+    CheckValuesWithTolerance(rtt, MilliSeconds(950), MilliSeconds(1175), MilliSeconds(565));
+    CheckValuesWithTolerance(rtt, MilliSeconds(1400), MicroSeconds(1197500), MilliSeconds(531));
 
     // Check boundary values; 0 will not update, 1 will use most recent value
     rtt->Reset();
@@ -143,22 +134,22 @@
     NS_TEST_EXPECT_MSG_EQ(ok, true, "Attribute should be settable");
     ok = rtt->SetAttributeFailSafe("Beta", DoubleValue(0));
     NS_TEST_EXPECT_MSG_EQ(ok, true, "Attribute should be settable");
-    CheckValues(rtt, Time(Seconds(1)), Time(Seconds(1)), Time(MilliSeconds(500)));
-    CheckValues(rtt, Time(Seconds(2)), Time(Seconds(1)), Time(MilliSeconds(500)));
-    CheckValues(rtt, Time(Seconds(3)), Time(Seconds(1)), Time(MilliSeconds(500)));
+    CheckValues(rtt, Seconds(1), Seconds(1), MilliSeconds(500));
+    CheckValues(rtt, Seconds(2), Seconds(1), MilliSeconds(500));
+    CheckValues(rtt, Seconds(3), Seconds(1), MilliSeconds(500));
     rtt->Reset();
     ok = rtt->SetAttributeFailSafe("Alpha", DoubleValue(1));
     NS_TEST_EXPECT_MSG_EQ(ok, true, "Attribute should be settable");
     ok = rtt->SetAttributeFailSafe("Beta", DoubleValue(1));
     NS_TEST_EXPECT_MSG_EQ(ok, true, "Attribute should be settable");
-    CheckValues(rtt, Time(Seconds(1)), Time(Seconds(1)), Time(MilliSeconds(500)));
-    CheckValues(rtt, Time(Seconds(2.5)), Time(Seconds(2.5)), Time(Seconds(1.5)));
-    CheckValues(rtt, Time(Seconds(7)), Time(Seconds(7)), Time(Seconds(4.5)));
+    CheckValues(rtt, Seconds(1), Seconds(1), MilliSeconds(500));
+    CheckValues(rtt, Seconds(2.5), Seconds(2.5), Seconds(1.5));
+    CheckValues(rtt, Seconds(7), Seconds(7), Seconds(4.5));
 
     // recheck initial values
     rtt->Reset();
-    NS_TEST_EXPECT_MSG_EQ(rtt->GetEstimate(), Time(Seconds(1)), "Incorrect initial estimate");
-    NS_TEST_EXPECT_MSG_EQ(rtt->GetVariation(), Time(Seconds(0)), "Incorrect initial variation");
+    NS_TEST_EXPECT_MSG_EQ(rtt->GetEstimate(), Seconds(1), "Incorrect initial estimate");
+    NS_TEST_EXPECT_MSG_EQ(rtt->GetVariation(), Seconds(0), "Incorrect initial variation");
     NS_TEST_EXPECT_MSG_EQ(rtt->GetNSamples(), 0, "Incorrect initial estimate");
 }
 
@@ -168,9 +159,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief RTT estimator TestSuite
+ * @brief RTT estimator TestSuite
  */
 class RttEstimatorTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/tcp-advertised-window-test.cc ns-3.44/src/internet/test/tcp-advertised-window-test.cc
--- ns-3.43/src/internet/test/tcp-advertised-window-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/tcp-advertised-window-test.cc	2025-03-09 16:55:49.415371200 -0700
@@ -17,25 +17,25 @@
 NS_LOG_COMPONENT_DEFINE("TcpAdvertisedWindowTestSuite");
 
 /**
- * \ingroup internet-test
- * \ingroup tests
- * \brief Socket that wraps every call to AdvertisedWindowSize ().
+ * @ingroup internet-test
+ * @ingroup tests
+ * @brief Socket that wraps every call to AdvertisedWindowSize ().
  */
 
 class TcpSocketAdvertisedWindowProxy : public TcpSocketMsgBase
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
-    /** \brief typedef for a cb */
+    /** @brief typedef for a cb */
     typedef Callback<void, uint16_t, uint16_t> InvalidAwndCallback;
 
     /**
-     * \brief Constructor
+     * @brief Constructor
      */
     TcpSocketAdvertisedWindowProxy()
         : TcpSocketMsgBase(),
@@ -44,9 +44,9 @@
     }
 
     /**
-     * \brief Copy-constructor
+     * @brief Copy-constructor
      *
-     * \param other Other obj
+     * @param other Other obj
      */
     TcpSocketAdvertisedWindowProxy(const TcpSocketAdvertisedWindowProxy& other)
         : TcpSocketMsgBase(other)
@@ -56,16 +56,16 @@
     }
 
     /**
-     * \brief Set the invalid AdvWnd callback
+     * @brief Set the invalid AdvWnd callback
      *
-     * \param cb callback to set
+     * @param cb callback to set
      */
     void SetInvalidAwndCb(InvalidAwndCallback cb);
 
     /**
-     * \brief Set the expected segment size
+     * @brief Set the expected segment size
      *
-     * \param seg Segment size
+     * @param seg Segment size
      */
     void SetExpectedSegmentSize(uint16_t seg)
     {
@@ -81,7 +81,7 @@
     InvalidAwndCallback m_inwalidAwndCb; //!< Callback
 
     /**
-     * \brief Test meta-information: size of the segments that are received.
+     * @brief Test meta-information: size of the segments that are received.
      *
      * This is necessary for making sure the calculated awnd only differs by
      * exactly that one segment that was not yet read by the application.
@@ -163,8 +163,8 @@
  * The legacy code used for calculating the advertised window.
  *
  * This was copied from tcp-socket-base.cc before changing the formula.
- * \param scale true if should scale the window
- * \return the old adv wnd value
+ * @param scale true if should scale the window
+ * @return the old adv wnd value
  */
 uint16_t
 TcpSocketAdvertisedWindowProxy::OldAdvertisedWindowSize(bool scale) const
@@ -195,23 +195,23 @@
 NS_OBJECT_ENSURE_REGISTERED(TcpSocketAdvertisedWindowProxy);
 
 /**
- * \ingroup internet-test
- * \ingroup tests
+ * @ingroup internet-test
+ * @ingroup tests
  *
- * \brief An error model that randomly drops a given rátio of TCP segments.
+ * @brief An error model that randomly drops a given rátio of TCP segments.
  */
 class TcpDropRatioErrorModel : public TcpGeneralErrorModel
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Constructor
-     * \param dropRatio the drop ratio
+     * @brief Constructor
+     * @param dropRatio the drop ratio
      */
     TcpDropRatioErrorModel(double dropRatio)
         : TcpGeneralErrorModel(),
@@ -226,7 +226,10 @@
                     uint32_t packetSize) override;
 
   private:
-    void DoReset() override{};
+    void DoReset() override
+    {
+    }
+
     double m_dropRatio;                //!< Drop ratio
     Ptr<UniformRandomVariable> m_prng; //!< Random variable
 };
@@ -249,9 +252,9 @@
 }
 
 /**
- * \ingroup internet-test
- * \ingroup tests
- * \brief Test the new formula for calculating TCP's advertised window size.
+ * @ingroup internet-test
+ * @ingroup tests
+ * @brief Test the new formula for calculating TCP's advertised window size.
  *
  * In TcpSocketBase, the advertised window is now calculated as
  *
@@ -275,11 +278,11 @@
 {
   public:
     /**
-     * \brief Constructor
-     * \param desc description
-     * \param size segment size
-     * \param packets number of packets to send
-     * \param lossRatio error ratio
+     * @brief Constructor
+     * @param desc description
+     * @param size segment size
+     * @param packets number of packets to send
+     * @param lossRatio error ratio
      */
     TcpAdvertisedWindowTest(const std::string& desc,
                             uint32_t size,
@@ -293,9 +296,9 @@
 
   private:
     /**
-     * \brief Callback called for the update of the awnd
-     * \param oldAwnd Old advertised window
-     * \param newAwnd new value
+     * @brief Callback called for the update of the awnd
+     * @param oldAwnd Old advertised window
+     * @param newAwnd new value
      */
     void InvalidAwndCb(uint16_t oldAwnd, uint16_t newAwnd);
     uint32_t m_pktSize;  //!< Packet size
@@ -320,7 +323,7 @@
     TcpGeneralTest::ConfigureEnvironment();
     SetAppPktCount(m_pktCount);
     SetPropagationDelay(MilliSeconds(50));
-    SetTransmitStart(Seconds(2.0));
+    SetTransmitStart(Seconds(2));
     SetAppPktSize(m_pktSize);
 }
 
@@ -353,19 +356,19 @@
 //-----------------------------------------------------------------------------
 
 /**
- * \ingroup internet-test
- * \ingroup tests
- * \brief Test the TCP's advertised window size when there is a loss of specific packets.
+ * @ingroup internet-test
+ * @ingroup tests
+ * @brief Test the TCP's advertised window size when there is a loss of specific packets.
  */
 class TcpAdvWindowOnLossTest : public TcpGeneralTest
 {
   public:
     /**
-     * \brief Constructor
-     * \param desc description
-     * \param size segment size
-     * \param packets number of packets to send
-     * \param toDrop packets to be dropped
+     * @brief Constructor
+     * @param desc description
+     * @param size segment size
+     * @param packets number of packets to send
+     * @param toDrop packets to be dropped
      */
     TcpAdvWindowOnLossTest(const std::string& desc,
                            uint32_t size,
@@ -380,9 +383,9 @@
 
   private:
     /**
-     * \brief Callback called for the update of the awnd
-     * \param oldAwnd Old advertised window
-     * \param newAwnd new value
+     * @brief Callback called for the update of the awnd
+     * @param oldAwnd Old advertised window
+     * @param newAwnd new value
      */
     void InvalidAwndCb(uint16_t oldAwnd, uint16_t newAwnd);
     uint32_t m_pktSize;             //!< Packet size
@@ -407,7 +410,7 @@
     TcpGeneralTest::ConfigureEnvironment();
     SetAppPktCount(m_pktCount);
     SetPropagationDelay(MilliSeconds(50));
-    SetTransmitStart(Seconds(2.0));
+    SetTransmitStart(Seconds(2));
     SetAppPktSize(m_pktSize);
 }
 
@@ -455,10 +458,10 @@
 //-----------------------------------------------------------------------------
 
 /**
- * \ingroup internet-test
- * \ingroup tests
+ * @ingroup internet-test
+ * @ingroup tests
  *
- * \brief Test Suite for TCP adv window
+ * @brief Test Suite for TCP adv window
  */
 class TcpAdvertisedWindowTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/tcp-bbr-test.cc ns-3.44/src/internet/test/tcp-bbr-test.cc
--- ns-3.43/src/internet/test/tcp-bbr-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/tcp-bbr-test.cc	2025-03-09 16:55:49.415371200 -0700
@@ -21,22 +21,22 @@
 NS_LOG_COMPONENT_DEFINE("TcpBbrTestSuite");
 
 /**
- * \brief Testing whether BBR enables pacing
+ * @brief Testing whether BBR enables pacing
  */
 class TcpBbrPacingEnableTest : public TestCase
 {
   public:
     /**
-     * \brief constructor
-     * \param pacing pacing configuration
-     * \param name description of the test
+     * @brief constructor
+     * @param pacing pacing configuration
+     * @param name description of the test
      */
     TcpBbrPacingEnableTest(bool pacing, const std::string& name);
 
   private:
     void DoRun() override;
     /**
-     * \brief Execute the test.
+     * @brief Execute the test.
      */
     void ExecuteTest();
     bool m_pacing; //!< Initial pacing configuration.
@@ -51,7 +51,7 @@
 void
 TcpBbrPacingEnableTest::DoRun()
 {
-    Simulator::Schedule(Seconds(0.0), &TcpBbrPacingEnableTest::ExecuteTest, this);
+    Simulator::Schedule(Seconds(0), &TcpBbrPacingEnableTest::ExecuteTest, this);
     Simulator::Run();
     Simulator::Destroy();
 }
@@ -70,23 +70,23 @@
 }
 
 /**
- * \brief Tests whether BBR sets correct value of pacing and cwnd gain based on different state.
+ * @brief Tests whether BBR sets correct value of pacing and cwnd gain based on different state.
  */
 class TcpBbrCheckGainValuesTest : public TestCase
 {
   public:
     /**
-     * \brief constructor
-     * \param state BBR state/mode under test
-     * \param highGain value of pacing and cwnd gain
-     * \param name description of the test
+     * @brief constructor
+     * @param state BBR state/mode under test
+     * @param highGain value of pacing and cwnd gain
+     * @param name description of the test
      */
     TcpBbrCheckGainValuesTest(TcpBbr::BbrMode_t state, double highGain, const std::string& name);
 
   private:
     void DoRun() override;
     /**
-     * \brief Execute the test.
+     * @brief Execute the test.
      */
     void ExecuteTest();
     TcpBbr::BbrMode_t m_mode; //!< BBR mode under test
@@ -105,7 +105,7 @@
 void
 TcpBbrCheckGainValuesTest::DoRun()
 {
-    Simulator::Schedule(Seconds(0.0), &TcpBbrCheckGainValuesTest::ExecuteTest, this);
+    Simulator::Schedule(Seconds(0), &TcpBbrCheckGainValuesTest::ExecuteTest, this);
     Simulator::Run();
     Simulator::Destroy();
 }
@@ -170,15 +170,15 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief TCP BBR TestSuite
+ * @brief TCP BBR TestSuite
  */
 class TcpBbrTestSuite : public TestSuite
 {
   public:
     /**
-     * \brief constructor
+     * @brief constructor
      */
     TcpBbrTestSuite()
         : TestSuite("tcp-bbr-test", Type::UNIT)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/tcp-bic-test.cc ns-3.44/src/internet/test/tcp-bic-test.cc
--- ns-3.43/src/internet/test/tcp-bic-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/tcp-bic-test.cc	2025-03-09 16:55:49.415371200 -0700
@@ -16,21 +16,21 @@
 NS_LOG_COMPONENT_DEFINE("TcpBicTestSuite");
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Testing the congestion avoidance increment on TcpBic
+ * @brief Testing the congestion avoidance increment on TcpBic
  */
 class TcpBicIncrementTest : public TestCase
 {
   public:
     /**
-     * \brief Constructor.
-     * \param cWnd Congestion window.
-     * \param segmentSize Segment size.
-     * \param ssThresh Slow Start Threshold.
-     * \param segmentsAcked Number of segments acked.
-     * \param lastMaxCwnd Last max Cwnd.
-     * \param name Test description.
+     * @brief Constructor.
+     * @param cWnd Congestion window.
+     * @param segmentSize Segment size.
+     * @param ssThresh Slow Start Threshold.
+     * @param segmentsAcked Number of segments acked.
+     * @param lastMaxCwnd Last max Cwnd.
+     * @param name Test description.
      */
     TcpBicIncrementTest(uint32_t cWnd,
                         uint32_t segmentSize,
@@ -43,14 +43,14 @@
     void DoRun() override;
 
     /**
-     * \brief Update the TCP socket state.
-     * \param tcb The TCP socket state.
-     * \returns The ack counter.
+     * @brief Update the TCP socket state.
+     * @param tcb The TCP socket state.
+     * @returns The ack counter.
      */
     uint32_t Update(Ptr<TcpSocketState> tcb);
 
     /**
-     * \brief Execute the test.
+     * @brief Execute the test.
      */
     void ExecuteTest();
 
@@ -86,7 +86,7 @@
     m_state->m_segmentSize = m_segmentSize;
     m_state->m_ssThresh = m_ssThresh;
 
-    Simulator::Schedule(Seconds(0.0), &TcpBicIncrementTest::ExecuteTest, this);
+    Simulator::Schedule(Seconds(0), &TcpBicIncrementTest::ExecuteTest, this);
     Simulator::Run();
     Simulator::Destroy();
 }
@@ -178,20 +178,20 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Testing the congestion avoidance decrement on TcpBic
+ * @brief Testing the congestion avoidance decrement on TcpBic
  */
 class TcpBicDecrementTest : public TestCase
 {
   public:
     /**
-     * \brief Constructor.
-     * \param cWnd Congestion window.
-     * \param segmentSize Segment size.
-     * \param fastConvergence Fast convergence.
-     * \param lastMaxCwnd Last max Cwnd.
-     * \param name Test description.
+     * @brief Constructor.
+     * @param cWnd Congestion window.
+     * @param segmentSize Segment size.
+     * @param fastConvergence Fast convergence.
+     * @param lastMaxCwnd Last max Cwnd.
+     * @param name Test description.
      */
     TcpBicDecrementTest(uint32_t cWnd,
                         uint32_t segmentSize,
@@ -203,7 +203,7 @@
     void DoRun() override;
 
     /**
-     * \brief Execute the test.
+     * @brief Execute the test.
      */
     void ExecuteTest();
 
@@ -235,7 +235,7 @@
     m_state->m_cWnd = m_cWnd;
     m_state->m_segmentSize = m_segmentSize;
 
-    Simulator::Schedule(Seconds(0.0), &TcpBicDecrementTest::ExecuteTest, this);
+    Simulator::Schedule(Seconds(0), &TcpBicDecrementTest::ExecuteTest, this);
     Simulator::Run();
     Simulator::Destroy();
 }
@@ -291,9 +291,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief TCP Bic TestSuite
+ * @brief TCP Bic TestSuite
  */
 class TcpBicTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/tcp-bytes-in-flight-test.cc ns-3.44/src/internet/test/tcp-bytes-in-flight-test.cc
--- ns-3.43/src/internet/test/tcp-bytes-in-flight-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/tcp-bytes-in-flight-test.cc	2025-03-09 16:55:49.415371200 -0700
@@ -17,83 +17,83 @@
 NS_LOG_COMPONENT_DEFINE("TcpBytesInFlightTestSuite");
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Check the value of BytesInFlight against a home-made guess
+ * @brief Check the value of BytesInFlight against a home-made guess
  *
  * The guess is made wrt to segments that travel the network; we have,
  * in theory, the possibility to know the real amount of bytes in flight. However
  * this value is useless, since the sender bases its guess on the received ACK.
  *
- * \see Tx
- * \see BytesInFlightTrace
+ * @see Tx
+ * @see BytesInFlightTrace
  */
 class TcpBytesInFlightTest : public TcpGeneralTest
 {
   public:
     /**
-     * \brief Constructor.
-     * \param desc Description.
-     * \param toDrop Packets to drop.
+     * @brief Constructor.
+     * @param desc Description.
+     * @param toDrop Packets to drop.
      */
     TcpBytesInFlightTest(const std::string& desc, std::vector<uint32_t>& toDrop);
 
   protected:
     /**
-     * \brief Create a receiver error model.
-     * \returns The receiver error model.
+     * @brief Create a receiver error model.
+     * @returns The receiver error model.
      */
     Ptr<ErrorModel> CreateReceiverErrorModel() override;
     /**
-     * \brief Receive a packet.
-     * \param p The packet.
-     * \param h The TCP header.
-     * \param who Who the socket belongs to (sender or receiver).
+     * @brief Receive a packet.
+     * @param p The packet.
+     * @param h The TCP header.
+     * @param who Who the socket belongs to (sender or receiver).
      */
     void Rx(const Ptr<const Packet> p, const TcpHeader& h, SocketWho who) override;
     /**
-     * \brief Transmit a packet.
-     * \param p The packet.
-     * \param h The TCP header.
-     * \param who Who the socket belongs to (sender or receiver).
+     * @brief Transmit a packet.
+     * @param p The packet.
+     * @param h The TCP header.
+     * @param who Who the socket belongs to (sender or receiver).
      */
     void Tx(const Ptr<const Packet> p, const TcpHeader& h, SocketWho who) override;
     /**
-     * \brief Track the bytes in flight.
-     * \param oldValue previous value.
-     * \param newValue actual value.
+     * @brief Track the bytes in flight.
+     * @param oldValue previous value.
+     * @param newValue actual value.
      */
     void BytesInFlightTrace(uint32_t oldValue, uint32_t newValue) override;
 
     /**
-     * \brief Called when a packet is dropped.
-     * \param ipH The IP header.
-     * \param tcpH The TCP header.
-     * \param p The packet.
+     * @brief Called when a packet is dropped.
+     * @param ipH The IP header.
+     * @param tcpH The TCP header.
+     * @param p The packet.
      */
     void PktDropped(const Ipv4Header& ipH, const TcpHeader& tcpH, Ptr<const Packet> p);
 
     /**
-     * \brief Configure the test.
+     * @brief Configure the test.
      */
     void ConfigureEnvironment() override;
 
     /**
-     * \brief Do the checks before the RTO expires.
-     * \param tcb The TcpSocketState.
-     * \param who The socket.
+     * @brief Do the checks before the RTO expires.
+     * @param tcb The TcpSocketState.
+     * @param who The socket.
      */
     void BeforeRTOExpired(const Ptr<const TcpSocketState> tcb, SocketWho who) override;
 
     /**
-     * \brief Update when RTO expires
-     * \param oldVal old time value
-     * \param newVal new time value
+     * @brief Update when RTO expires
+     * @param oldVal old time value
+     * @param newVal new time value
      */
     void RTOExpired(Time oldVal, Time newVal);
 
     /**
-     * \brief Do the final checks.
+     * @brief Do the final checks.
      */
     void FinalChecks() override;
 
@@ -121,7 +121,7 @@
     TcpGeneralTest::ConfigureEnvironment();
     SetAppPktCount(30);
     SetPropagationDelay(MilliSeconds(50));
-    SetTransmitStart(Seconds(2.0));
+    SetTransmitStart(Seconds(2));
 
     Config::SetDefault("ns3::TcpSocketBase::Sack", BooleanValue(false));
 }
@@ -270,9 +270,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief TestSuite: Check the value of BytesInFlight against a home-made guess
+ * @brief TestSuite: Check the value of BytesInFlight against a home-made guess
  */
 class TcpBytesInFlightTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/tcp-classic-recovery-test.cc ns-3.44/src/internet/test/tcp-classic-recovery-test.cc
--- ns-3.43/src/internet/test/tcp-classic-recovery-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/tcp-classic-recovery-test.cc	2025-03-09 16:55:49.415371200 -0700
@@ -21,18 +21,18 @@
 NS_LOG_COMPONENT_DEFINE("TcpClassicRecoveryTestSuite");
 
 /**
- * \brief Classic Recovery algorithm test
+ * @brief Classic Recovery algorithm test
  */
 class ClassicRecoveryTest : public TestCase
 {
   public:
     /**
-     * \brief Constructor.
-     * \param cWnd Congestion window.
-     * \param segmentSize Segment size.
-     * \param ssThresh Slow Start Threshold.
-     * \param dupAckCount Duplicate acknowledgement Threshold.
-     * \param name Test description.
+     * @brief Constructor.
+     * @param cWnd Congestion window.
+     * @param segmentSize Segment size.
+     * @param ssThresh Slow Start Threshold.
+     * @param dupAckCount Duplicate acknowledgement Threshold.
+     * @param name Test description.
      */
     ClassicRecoveryTest(uint32_t cWnd,
                         uint32_t segmentSize,
@@ -107,9 +107,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Classic Recovery TestSuite
+ * @brief Classic Recovery TestSuite
  */
 class ClassicRecoveryTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/tcp-close-test.cc ns-3.44/src/internet/test/tcp-close-test.cc
--- ns-3.43/src/internet/test/tcp-close-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/tcp-close-test.cc	2025-03-09 16:55:49.415371200 -0700
@@ -18,15 +18,15 @@
 NS_LOG_COMPONENT_DEFINE("TcpCloseTestSuite");
 
 /**
- * \brief Check if the TCP correctly close the connection after receiving
+ * @brief Check if the TCP correctly close the connection after receiving
  * previously lost data
  */
 class TcpCloseWithLossTestCase : public TcpGeneralTest
 {
   public:
     /**
-     * \brief Constructor
-     * \param sackEnabled Enable or disable SACK
+     * @brief Constructor
+     * @param sackEnabled Enable or disable SACK
      */
     TcpCloseWithLossTestCase(bool sackEnabled);
 
@@ -51,9 +51,9 @@
 
     /**
      * Called when a packet is dropped.
-     * \param ipH IP header
-     * \param tcpH TCP header
-     * \param pkt packet
+     * @param ipH IP header
+     * @param tcpH TCP header
+     * @param pkt packet
      */
     void PktDropped(const Ipv4Header& ipH, const TcpHeader& tcpH, Ptr<const Packet> pkt);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/tcp-cong-avoid-test.cc ns-3.44/src/internet/test/tcp-cong-avoid-test.cc
--- ns-3.43/src/internet/test/tcp-cong-avoid-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/tcp-cong-avoid-test.cc	2025-03-09 16:55:49.415371200 -0700
@@ -16,9 +16,9 @@
 NS_LOG_COMPONENT_DEFINE("TcpNewRenoCongAvoidTest");
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Test the behavior of RFC congestion avoidance
+ * @brief Test the behavior of RFC congestion avoidance
  *
  * From RFC 5681:\n
  *
@@ -44,12 +44,12 @@
 {
   public:
     /**
-     * \brief Constructor.
-     * \param segmentSize Segment size.
-     * \param packetSize Size of the packets.
-     * \param packets Number of packets.
-     * \param congControl Type of congestion control.
-     * \param desc The test description.
+     * @brief Constructor.
+     * @param segmentSize Segment size.
+     * @param packetSize Size of the packets.
+     * @param packets Number of packets.
+     * @param congControl Type of congestion control.
+     * @param desc The test description.
      */
     TcpNewRenoCongAvoidNormalTest(uint32_t segmentSize,
                                   uint32_t packetSize,
@@ -63,7 +63,7 @@
     void PhyDrop(SocketWho who) override;
     void NormalClose(SocketWho who) override;
     /**
-     * \brief Called each RTT (1.0 sec in the testing environment) and check
+     * @brief Called each RTT (1.0 sec in the testing environment) and check
      * that the overall increment in this RTT is less or equal than 1 MSS
      */
     void Check();
@@ -123,7 +123,7 @@
 
     if (!m_event.IsPending())
     {
-        m_event = Simulator::Schedule(Seconds(1.0), &TcpNewRenoCongAvoidNormalTest::Check, this);
+        m_event = Simulator::Schedule(Seconds(1), &TcpNewRenoCongAvoidNormalTest::Check, this);
     }
 
     m_increment += newValue - oldValue;
@@ -155,7 +155,7 @@
 
     m_increment = 0;
 
-    m_event = Simulator::Schedule(Seconds(1.0), &TcpNewRenoCongAvoidNormalTest::Check, this);
+    m_event = Simulator::Schedule(Seconds(1), &TcpNewRenoCongAvoidNormalTest::Check, this);
 }
 
 void
@@ -168,9 +168,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief TestSuite for the behavior of RFC congestion avoidance
+ * @brief TestSuite for the behavior of RFC congestion avoidance
  */
 class TcpRenoCongAvoidTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/tcp-datasentcb-test.cc ns-3.44/src/internet/test/tcp-datasentcb-test.cc
--- ns-3.43/src/internet/test/tcp-datasentcb-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/tcp-datasentcb-test.cc	2025-03-09 16:55:49.415371200 -0700
@@ -16,17 +16,17 @@
 NS_LOG_COMPONENT_DEFINE("TcpDatSentCbTest");
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Socket that the 50% of the times saves the entire packet in the buffer,
+ * @brief Socket that the 50% of the times saves the entire packet in the buffer,
  * while in the other 50% saves only half the packet.
  */
 class TcpSocketHalfAck : public TcpSocketMsgBase
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -77,9 +77,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Data Sent callback test
+ * @brief Data Sent callback test
  *
  * The rationale of this test is to check if the dataSent callback advertises
  * to the application all the transmitted bytes. We know in advance how many
@@ -92,9 +92,9 @@
   public:
     /**
      * Constructor.
-     * \param desc Test description.
-     * \param size Packet size.
-     * \param packets Number of packets.
+     * @param desc Test description.
+     * @param size Packet size.
+     * @param packets Number of packets.
      */
     TcpDataSentCbTestCase(const std::string& desc, uint32_t size, uint32_t packets)
         : TcpGeneralTest(desc),
@@ -150,9 +150,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief TestSuite: Data Sent callback
+ * @brief TestSuite: Data Sent callback
  */
 class TcpDataSentCbTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/tcp-dctcp-test.cc ns-3.44/src/internet/test/tcp-dctcp-test.cc
--- ns-3.43/src/internet/test/tcp-dctcp-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/tcp-dctcp-test.cc	2025-03-09 16:55:49.415371200 -0700
@@ -27,18 +27,18 @@
 NS_LOG_COMPONENT_DEFINE("TcpDctcpTestSuite");
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Validates the setting of ECT and ECE codepoints for DCTCP enabled traffic
+ * @brief Validates the setting of ECT and ECE codepoints for DCTCP enabled traffic
  */
 class TcpDctcpCodePointsTest : public TcpGeneralTest
 {
   public:
     /**
-     * \brief Constructor
+     * @brief Constructor
      *
-     * \param testCase Test case number
-     * \param desc Description about the test
+     * @param testCase Test case number
+     * @param desc Description about the test
      */
     TcpDctcpCodePointsTest(uint8_t testCase, const std::string& desc);
 
@@ -196,9 +196,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief A TCP socket which sends a data packet with CE flags set for test 3.
+ * @brief A TCP socket which sends a data packet with CE flags set for test 3.
  *
  * The SendDataPacket function of this class sends data packet numbered 1  with CE flags set and
  * also doesn't set CWR flags on receipt of ECE flags for test 3. This is done to verify that DCTCP
@@ -209,8 +209,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -224,8 +224,8 @@
     }
 
     /**
-     * \brief Constructor.
-     * \param other The object to copy from.
+     * @brief Constructor.
+     * @param other The object to copy from.
      */
     TcpDctcpCongestedRouter(const TcpDctcpCongestedRouter& other)
         : TcpSocketMsgBase(other)
@@ -234,7 +234,7 @@
 
     /**
      * Set the test case type
-     * \param testCase test case type
+     * @param testCase test case type
      */
     void SetTestCase(uint8_t testCase);
 
@@ -540,24 +540,24 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief DCTCP should be same as Linux during slow start
+ * @brief DCTCP should be same as Linux during slow start
  */
 class TcpDctcpToLinuxReno : public TestCase
 {
   public:
     /**
-     * \brief Constructor
+     * @brief Constructor
      *
-     * \param cWnd congestion window
-     * \param segmentSize segment size
-     * \param ssThresh slow start threshold
-     * \param segmentsAcked segments acked
-     * \param highTxMark high tx mark
-     * \param lastAckedSeq last acked seq
-     * \param rtt RTT
-     * \param name Name of the test
+     * @param cWnd congestion window
+     * @param segmentSize segment size
+     * @param ssThresh slow start threshold
+     * @param segmentsAcked segments acked
+     * @param highTxMark high tx mark
+     * @param lastAckedSeq last acked seq
+     * @param rtt RTT
+     * @param name Name of the test
      */
     TcpDctcpToLinuxReno(uint32_t cWnd,
                         uint32_t segmentSize,
@@ -570,7 +570,7 @@
 
   private:
     void DoRun() override;
-    /** \brief Execute the test
+    /** @brief Execute the test
      */
     void ExecuteTest();
 
@@ -606,7 +606,7 @@
 void
 TcpDctcpToLinuxReno::DoRun()
 {
-    Simulator::Schedule(Seconds(0.0), &TcpDctcpToLinuxReno::ExecuteTest, this);
+    Simulator::Schedule(Seconds(0), &TcpDctcpToLinuxReno::ExecuteTest, this);
     Simulator::Run();
     Simulator::Destroy();
 }
@@ -640,9 +640,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief TCP DCTCP TestSuite
+ * @brief TCP DCTCP TestSuite
  */
 class TcpDctcpTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/tcp-ecn-test.cc ns-3.44/src/internet/test/tcp-ecn-test.cc
--- ns-3.43/src/internet/test/tcp-ecn-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/tcp-ecn-test.cc	2025-03-09 16:55:49.415371200 -0700
@@ -30,9 +30,9 @@
 NS_LOG_COMPONENT_DEFINE("TcpEcnTestSuite");
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief checks if ECT, CWR and ECE bits are set correctly in different scenarios
+ * @brief checks if ECT, CWR and ECE bits are set correctly in different scenarios
  *
  * This test suite will run four combinations of enabling ECN (sender off and receiver off; sender
  * on and receiver off; sender off and receiver on; sender on and receiver on;) and checks that the
@@ -45,10 +45,10 @@
 {
   public:
     /**
-     * \brief Constructor
+     * @brief Constructor
      *
-     * \param testcase test case number
-     * \param desc Description about the ECN capabilities of sender and receiver
+     * @param testcase test case number
+     * @param desc Description about the ECN capabilities of sender and receiver
      */
     TcpEcnTest(uint32_t testcase, const std::string& desc);
 
@@ -68,9 +68,9 @@
 };
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief A TCP socket which sends certain data packets with CE flags set for tests 5 and 6.
+ * @brief A TCP socket which sends certain data packets with CE flags set for tests 5 and 6.
  *
  * The SendDataPacket function of this class sends data packets numbered 1 and 3 with CE flags set
  * for test 5 to verify if ECE and CWR bits are correctly set by receiver and sender respectively.
@@ -82,8 +82,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -97,8 +97,8 @@
     }
 
     /**
-     * \brief Constructor.
-     * \param other The object to copy from.
+     * @brief Constructor.
+     * @param other The object to copy from.
      */
     TcpSocketCongestedRouter(const TcpSocketCongestedRouter& other)
         : TcpSocketMsgBase(other)
@@ -107,7 +107,7 @@
 
     /**
      * Set the test case type
-     * \param testCase Test case type
+     * @param testCase Test case type
      */
     void SetTestCase(uint8_t testCase);
 
@@ -554,9 +554,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief TCP ECN TestSuite
+ * @brief TCP ECN TestSuite
  */
 class TcpEcnTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/tcp-endpoint-bug2211.cc ns-3.44/src/internet/test/tcp-endpoint-bug2211.cc
--- ns-3.43/src/internet/test/tcp-endpoint-bug2211.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/tcp-endpoint-bug2211.cc	2025-03-09 16:55:49.415371200 -0700
@@ -15,9 +15,9 @@
 using namespace ns3;
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Test for bug 2211.
+ * @brief Test for bug 2211.
  *
  * https://www.nsnam.org/bugzilla/show_bug.cgi?id=2211
  *
@@ -41,25 +41,25 @@
   public:
     /**
      * Constructor.
-     * \param desc Test description.
-     * \param ipVersion True to use IPv6.
+     * @param desc Test description.
+     * @param ipVersion True to use IPv6.
      */
     TcpEndPointBug2211Test(std::string desc, bool ipVersion);
 
     /**
-     * \brief Receive a packet.
-     * \param socket The receiving socket.
+     * @brief Receive a packet.
+     * @param socket The receiving socket.
      */
     void Recv(Ptr<Socket> socket);
     /**
-     * \brief Handle an incoming connection.
-     * \param s The receiving socket.
-     * \param from The other node IP address.
+     * @brief Handle an incoming connection.
+     * @param s The receiving socket.
+     * @param from The other node IP address.
      */
     void HandleAccept(Ptr<Socket> s, const Address& from);
     /**
-     * \brief Handle a connection establishment.
-     * \param socket The receiving socket.
+     * @brief Handle a connection establishment.
+     * @param socket The receiving socket.
      */
     void HandleConnect(Ptr<Socket> socket);
     void DoRun() override;
@@ -138,9 +138,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief TestSuite for bug 2211 - It must be used with valgrind.
+ * @brief TestSuite for bug 2211 - It must be used with valgrind.
  */
 class TcpEndpointBug2211TestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/tcp-error-model.h ns-3.44/src/internet/test/tcp-error-model.h
--- ns-3.43/src/internet/test/tcp-error-model.h	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/tcp-error-model.h	2025-03-09 16:55:49.415371200 -0700
@@ -15,9 +15,9 @@
 {
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief A general (TCP-aware) error model.
+ * @brief A general (TCP-aware) error model.
  *
  * The class is responsible to take away the IP and TCP header from the packet,
  * and then to interrogate the method ShouldDrop, dropping the packet accordingly
@@ -27,15 +27,15 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TcpGeneralErrorModel();
 
     /**
-     * \brief Set the drop callback.
-     * \param cb The callback to be set.
+     * @brief Set the drop callback.
+     * @param cb The callback to be set.
      */
     void SetDropCallback(Callback<void, const Ipv4Header&, const TcpHeader&, Ptr<const Packet>> cb)
     {
@@ -44,11 +44,11 @@
 
   protected:
     /**
-     * \brief Check if the packet should be dropped.
-     * \param ipHeader The packet IPv4 header.
-     * \param tcpHeader The packet TCP header.
-     * \param packetSize The packet size.
-     * \returns True if the packet should be dropped.
+     * @brief Check if the packet should be dropped.
+     * @param ipHeader The packet IPv4 header.
+     * @param tcpHeader The packet TCP header.
+     * @param packetSize The packet size.
+     * @returns True if the packet should be dropped.
      */
     virtual bool ShouldDrop(const Ipv4Header& ipHeader,
                             const TcpHeader& tcpHeader,
@@ -61,18 +61,18 @@
 };
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief An error model TCP aware: it drops the sequence number declared.
+ * @brief An error model TCP aware: it drops the sequence number declared.
  *
- * \see AddSeqToKill
+ * @see AddSeqToKill
  */
 class TcpSeqErrorModel : public TcpGeneralErrorModel
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -82,12 +82,12 @@
     }
 
     /**
-     * \brief Add the sequence number to the list of segments to be killed
+     * @brief Add the sequence number to the list of segments to be killed
      *
      * Calling x times this function indicates that you want to kill
      * the segment x times.
      *
-     * \param seq sequence number to be killed
+     * @param seq sequence number to be killed
      */
     void AddSeqToKill(const SequenceNumber32& seq)
     {
@@ -107,31 +107,31 @@
 };
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Error model which drop packets with specified TCP flags.
+ * @brief Error model which drop packets with specified TCP flags.
  *
  * Set the flags with SetFlagToKill and the number of the packets with such flags
  * which should be killed.
  *
- * \see SetFlagToKill
- * \see SetKillRepeat
+ * @see SetFlagToKill
+ * @see SetKillRepeat
  *
  */
 class TcpFlagErrorModel : public TcpGeneralErrorModel
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TcpFlagErrorModel();
 
     /**
-     * \brief Set the flags of the segment that should be killed
+     * @brief Set the flags of the segment that should be killed
      *
-     * \param flags Flags
+     * @param flags Flags
      */
     void SetFlagToKill(TcpHeader::Flags_t flags)
     {
@@ -139,7 +139,7 @@
     }
 
     /**
-     * \brief Set how many packets should be killed
+     * @brief Set how many packets should be killed
      *
      * If the flags are the same, this specified the numbers of drops:
      *
@@ -147,7 +147,7 @@
      * # 0  for no drops
      * # >1 the number of drops
      *
-     * \param killNumber Specifies the number of times the packet should be killed
+     * @param killNumber Specifies the number of times the packet should be killed
      */
     void SetKillRepeat(int16_t killNumber)
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/tcp-fast-retr-test.cc ns-3.44/src/internet/test/tcp-fast-retr-test.cc
--- ns-3.43/src/internet/test/tcp-fast-retr-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/tcp-fast-retr-test.cc	2025-03-09 16:55:49.415371200 -0700
@@ -17,9 +17,9 @@
 NS_LOG_COMPONENT_DEFINE("TcpFastRetrTest");
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Test the fast retransmission
+ * @brief Test the fast retransmission
  *
  * Checking what is happening is not so easy, so there are a lot of variables
  * which helps to keep track on what is happening.
@@ -30,10 +30,10 @@
 {
   public:
     /**
-     * \brief Constructor
-     * \param congControl Type of congestion control.
-     * \param seqToKill Sequence number of the packet to drop.
-     * \param msg Test message.
+     * @brief Constructor
+     * @param congControl Type of congestion control.
+     * @param seqToKill Sequence number of the packet to drop.
+     * @param msg Test message.
      */
     TcpFastRetrTest(TypeId congControl, uint32_t seqToKill, const std::string& msg);
 
@@ -57,10 +57,10 @@
     void AfterRTOExpired(const Ptr<const TcpSocketState> tcb, SocketWho who) override;
 
     /**
-     * \brief Check if the packet being dropped is the right one.
-     * \param ipH IPv4 header.
-     * \param tcpH TCP header.
-     * \param p The packet.
+     * @brief Check if the packet being dropped is the right one.
+     * @param ipH IPv4 header.
+     * @param tcpH TCP header.
+     * @param p The packet.
      */
     void PktDropped(const Ipv4Header& ipH, const TcpHeader& tcpH, Ptr<const Packet> p);
     void FinalChecks() override;
@@ -132,7 +132,7 @@
 TcpFastRetrTest::CreateSenderSocket(Ptr<Node> node)
 {
     Ptr<TcpSocketMsgBase> socket = TcpGeneralTest::CreateSenderSocket(node);
-    socket->SetAttribute("MinRto", TimeValue(Seconds(10.0)));
+    socket->SetAttribute("MinRto", TimeValue(Seconds(10)));
 
     return socket;
 }
@@ -414,9 +414,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Testsuite for the fast retransmission
+ * @brief Testsuite for the fast retransmission
  */
 class TcpFastRetrTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/tcp-general-test.cc ns-3.44/src/internet/test/tcp-general-test.cc
--- ns-3.43/src/internet/test/tcp-general-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/tcp-general-test.cc	2025-03-09 16:55:49.415371200 -0700
@@ -237,7 +237,7 @@
     m_receiverSocket->Listen();
     m_receiverSocket->ShutdownSend();
 
-    Simulator::Schedule(Seconds(0.0), &TcpGeneralTest::DoConnect, this);
+    Simulator::Schedule(Seconds(0), &TcpGeneralTest::DoConnect, this);
     Simulator::ScheduleWithContext(nodes.Get(0)->GetId(),
                                    m_startTime,
                                    &TcpGeneralTest::SendPacket,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/tcp-general-test.h ns-3.44/src/internet/test/tcp-general-test.h
--- ns-3.43/src/internet/test/tcp-general-test.h	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/tcp-general-test.h	2025-03-09 16:55:49.415371200 -0700
@@ -19,9 +19,9 @@
 {
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Class for inserting callbacks special points of the flow of TCP sockets
+ * @brief Class for inserting callbacks special points of the flow of TCP sockets
  *
  * This subclass is born to extend TcpSocketBase, inserting callbacks in certain
  * points of the flow, to be used in testing to check certain values or flow
@@ -32,17 +32,17 @@
  *
  * To be fair with testing, this class should NOT modify the behavior of TcpSocketBase.
  *
- * \see SetRcvAckCb
- * \see SetProcessedAckCb
- * \see SetAfterRetransmitCb
- * \see SetBeforeRetransmitCb
+ * @see SetRcvAckCb
+ * @see SetProcessedAckCb
+ * @see SetAfterRetransmitCb
+ * @see SetBeforeRetransmitCb
  */
 class TcpSocketMsgBase : public ns3::TcpSocketBase
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -52,8 +52,8 @@
     }
 
     /**
-     * \brief Constructor.
-     * \param other The object to copy from.
+     * @brief Constructor.
+     * @param other The object to copy from.
      */
     TcpSocketMsgBase(const TcpSocketMsgBase& other)
         : TcpSocketBase(other)
@@ -76,45 +76,45 @@
         UpdateRttCallback;
 
     /**
-     * \brief Set the callback invoked when an ACK is received (at the beginning
+     * @brief Set the callback invoked when an ACK is received (at the beginning
      * of the processing)
      *
-     * \param cb callback
+     * @param cb callback
      */
     void SetRcvAckCb(AckManagementCb cb);
 
     /**
-     * \brief Set the callback invoked when an ACK is received and processed
+     * @brief Set the callback invoked when an ACK is received and processed
      * (at the end of the processing)
      *
-     * \param cb callback
+     * @param cb callback
      */
     void SetProcessedAckCb(AckManagementCb cb);
 
     /**
-     * \brief Set the callback invoked after the processing of a retransmit timeout
+     * @brief Set the callback invoked after the processing of a retransmit timeout
      *
-     * \param cb callback
+     * @param cb callback
      */
     void SetAfterRetransmitCb(RetrCb cb);
 
     /**
-     * \brief Set the callback invoked before the processing of a retransmit timeout
+     * @brief Set the callback invoked before the processing of a retransmit timeout
      *
-     * \param cb callback
+     * @param cb callback
      */
     void SetBeforeRetransmitCb(RetrCb cb);
 
     /**
-     * \brief Set the callback invoked after the forking
-     * \param cb callback
+     * @brief Set the callback invoked after the forking
+     * @param cb callback
      */
     void SetForkCb(Callback<void, Ptr<TcpSocketMsgBase>> cb);
 
     /**
-     * \brief Set the callback invoked when we update rtt history
+     * @brief Set the callback invoked when we update rtt history
      *
-     * \param cb callback
+     * @param cb callback
      */
     void SetUpdateRttHistoryCb(UpdateRttCallback cb);
 
@@ -138,9 +138,9 @@
 };
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief A TCP socket which sends ACKs smaller than the segment received.
+ * @brief A TCP socket which sends ACKs smaller than the segment received.
  *
  * Usually, a TCP socket which receives the sequence number "x" replies with
  * an ACK to "x+1". What happen if a malicious socket sends smaller ACKs
@@ -151,14 +151,14 @@
  * Set the number of bytes that should be acked in each ACK packet with
  * SetBytesToAck.
  *
- * \see TcpSlowStartAttackerTest
+ * @see TcpSlowStartAttackerTest
  */
 class TcpSocketSmallAcks : public TcpSocketMsgBase
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -171,8 +171,8 @@
     }
 
     /**
-     * \brief Constructor.
-     * \param other The object to copy from.
+     * @brief Constructor.
+     * @param other The object to copy from.
      */
     TcpSocketSmallAcks(const TcpSocketSmallAcks& other)
         : TcpSocketMsgBase(other),
@@ -183,8 +183,8 @@
     }
 
     /**
-     * \brief Set the bytes to be ACKed.
-     * \param bytes The number of bytes.
+     * @brief Set the bytes to be ACKed.
+     * @param bytes The number of bytes.
      */
     void SetBytesToAck(uint32_t bytes)
     {
@@ -201,9 +201,9 @@
 };
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief General infrastructure for TCP testing
+ * @brief General infrastructure for TCP testing
  *
  * The class provides a simple setup for a connection testing. Implement
  * or modify the virtual methods in order to install a specified
@@ -237,25 +237,25 @@
  * isn't passed by inheritance, so the way to go is to write a Getters (like
  * GetSegSize) and call it in the subclass.
  *
- * \see DoRun
- * \see TcpSocketMsgBase
+ * @see DoRun
+ * @see TcpSocketMsgBase
  */
 class TcpGeneralTest : public TestCase
 {
   public:
     /**
-     * \brief TcpGeneralTest constructor
+     * @brief TcpGeneralTest constructor
      *
      * Please use the method ConfigureEnvironment () to configure other
      * parameters than the test description.
      *
-     * \param desc description of the test
+     * @param desc description of the test
      */
     TcpGeneralTest(const std::string& desc);
     ~TcpGeneralTest() override;
 
     /**
-     * \brief Used as parameter of methods, specifies on what node
+     * @brief Used as parameter of methods, specifies on what node
      * the caller is interested (e.g. GetSegSize).
      */
     enum SocketWho
@@ -266,60 +266,60 @@
 
   protected:
     /**
-     * \brief Create and return the channel installed between the two socket
+     * @brief Create and return the channel installed between the two socket
      *
-     * \return A SimpleChannel subclass
+     * @return A SimpleChannel subclass
      */
     virtual Ptr<SimpleChannel> CreateChannel();
 
     /**
-     * \brief Create and return the error model to install in the sender node
+     * @brief Create and return the error model to install in the sender node
      *
-     * \return sender error model
+     * @return sender error model
      */
     virtual Ptr<ErrorModel> CreateSenderErrorModel();
 
     /**
-     * \brief Create and return the error model to install in the receiver node
+     * @brief Create and return the error model to install in the receiver node
      *
-     * \return receiver error model
+     * @return receiver error model
      */
     virtual Ptr<ErrorModel> CreateReceiverErrorModel();
 
     /**
-     * \brief Create and install the socket to install on the receiver
-     * \param node receiver node pointer
-     * \return the socket to be installed in the receiver
+     * @brief Create and install the socket to install on the receiver
+     * @param node receiver node pointer
+     * @return the socket to be installed in the receiver
      */
     virtual Ptr<TcpSocketMsgBase> CreateReceiverSocket(Ptr<Node> node);
 
     /**
-     * \brief Create and install the socket to install on the sender
-     * \param node sender node pointer
-     * \return the socket to be installed in the sender
+     * @brief Create and install the socket to install on the sender
+     * @param node sender node pointer
+     * @return the socket to be installed in the sender
      */
     virtual Ptr<TcpSocketMsgBase> CreateSenderSocket(Ptr<Node> node);
 
     /**
-     * \brief Create a socket
+     * @brief Create a socket
      *
-     * \param node associated node
-     * \param socketType Type of the TCP socket
-     * \param congControl congestion control
-     * \return a pointer to the newer created socket
+     * @param node associated node
+     * @param socketType Type of the TCP socket
+     * @param congControl congestion control
+     * @return a pointer to the newer created socket
      */
     virtual Ptr<TcpSocketMsgBase> CreateSocket(Ptr<Node> node,
                                                TypeId socketType,
                                                TypeId congControl);
 
     /**
-     * \brief Create a socket
+     * @brief Create a socket
      *
-     * \param node associated node
-     * \param socketType Type of the TCP socket
-     * \param congControl congestion control
-     * \param recoveryAlgorithm recovery algorithm
-     * \return a pointer to the newer created socket
+     * @param node associated node
+     * @param socketType Type of the TCP socket
+     * @param congControl congestion control
+     * @param recoveryAlgorithm recovery algorithm
+     * @return a pointer to the newer created socket
      */
     virtual Ptr<TcpSocketMsgBase> CreateSocket(Ptr<Node> node,
                                                TypeId socketType,
@@ -327,8 +327,8 @@
                                                TypeId recoveryAlgorithm);
 
     /**
-     * \brief Get the pointer to a previously created sender socket
-     * \return ptr to sender socket or 0
+     * @brief Get the pointer to a previously created sender socket
+     * @return ptr to sender socket or 0
      */
     Ptr<TcpSocketMsgBase> GetSenderSocket()
     {
@@ -336,8 +336,8 @@
     }
 
     /**
-     * \brief Get the pointer to a previously created receiver socket
-     * \return ptr to receiver socket or 0
+     * @brief Get the pointer to a previously created receiver socket
+     * @return ptr to receiver socket or 0
      */
     Ptr<TcpSocketMsgBase> GetReceiverSocket()
     {
@@ -345,7 +345,7 @@
     }
 
     /**
-     * \brief Execute the tcp test
+     * @brief Execute the tcp test
      *
      * As environment, two socket are connected through a SimpleChannel. Each device
      * has an MTU of 1500 bytes, and the application starts to send packet at
@@ -358,274 +358,274 @@
      *
      * Please do not use any Config:: statements.
      *
-     * \see ConfigureEnvironment
+     * @see ConfigureEnvironment
      */
     void DoRun() override;
 
     /**
-     * \brief Change the configuration of the environment
+     * @brief Change the configuration of the environment
      */
     virtual void ConfigureEnvironment();
 
     /**
-     * \brief Change the configuration of the socket properties
+     * @brief Change the configuration of the socket properties
      */
     virtual void ConfigureProperties();
 
     /**
-     * \brief Teardown the TCP test
+     * @brief Teardown the TCP test
      */
     void DoTeardown() override;
 
     /**
-     * \brief Scheduled at 0.0, SENDER starts the connection to RECEIVER
+     * @brief Scheduled at 0.0, SENDER starts the connection to RECEIVER
      */
     void DoConnect();
 
     /**
-     * \brief Packet received
+     * @brief Packet received
      *
      * The method processes the packet (application-layer)
-     * \param socket socket which has received the packet
+     * @param socket socket which has received the packet
      */
     virtual void ReceivePacket(Ptr<Socket> socket);
 
     /**
-     * \brief Send packets to other endpoint
+     * @brief Send packets to other endpoint
      *
-     * \param socket Socket
-     * \param pktSize size of the packet
-     * \param pktCount number of packets to send
-     * \param pktInterval interval between packet (application-level)
+     * @param socket Socket
+     * @param pktSize size of the packet
+     * @param pktCount number of packets to send
+     * @param pktInterval interval between packet (application-level)
      */
     void SendPacket(Ptr<Socket> socket, uint32_t pktSize, uint32_t pktCount, Time pktInterval);
 
     /**
-     * \brief Get the segment size of the node specified
+     * @brief Get the segment size of the node specified
      *
-     * \param who node to get the parameter from
+     * @param who node to get the parameter from
      *
-     * \return segment size of the specified node
+     * @return segment size of the specified node
      */
     uint32_t GetSegSize(SocketWho who);
 
     /**
-     * \brief Get the highest tx mark of the node specified
+     * @brief Get the highest tx mark of the node specified
      *
-     * \param who node to get the parameter from
+     * @param who node to get the parameter from
      *
-     * \return mark of the specified node
+     * @return mark of the specified node
      */
     SequenceNumber32 GetHighestTxMark(SocketWho who);
 
     /**
-     * \brief Get the retransmission threshold
-     * \param who node to get the parameter from
-     * \return retransmission threshold
+     * @brief Get the retransmission threshold
+     * @param who node to get the parameter from
+     * @return retransmission threshold
      */
     uint32_t GetReTxThreshold(SocketWho who);
 
     /**
-     * \brief Get the initial slow start threshold
-     * \param who node to get the parameter from
-     * \return initial slow start threshold
+     * @brief Get the initial slow start threshold
+     * @param who node to get the parameter from
+     * @return initial slow start threshold
      */
     uint32_t GetInitialSsThresh(SocketWho who);
 
     /**
-     * \brief Get the initial congestion window
-     * \param who node to get the parameter from
-     * \return initial cwnd
+     * @brief Get the initial congestion window
+     * @param who node to get the parameter from
+     * @return initial cwnd
      */
     uint32_t GetInitialCwnd(SocketWho who);
 
     /**
-     * \brief Get the number of dupack received
-     * \param who node to get the parameter from
-     * \return number of dupack
+     * @brief Get the number of dupack received
+     * @param who node to get the parameter from
+     * @return number of dupack
      */
     uint32_t GetDupAckCount(SocketWho who);
 
     /**
-     * \brief Get the number of delayed ack (if present)
-     * \param who node to get the parameter from
-     * \return number of ack we will wait before sending an ACK
+     * @brief Get the number of delayed ack (if present)
+     * @param who node to get the parameter from
+     * @return number of ack we will wait before sending an ACK
      */
     uint32_t GetDelAckCount(SocketWho who);
 
     /**
-     * \brief Get the timeout of delayed ack (if present)
-     * \param who node to get the parameter from
-     * \return time we will wait before sending an ACK
+     * @brief Get the timeout of delayed ack (if present)
+     * @param who node to get the parameter from
+     * @return time we will wait before sending an ACK
      */
     Time GetDelAckTimeout(SocketWho who);
 
     /**
-     * \brief Get the retransmission time
+     * @brief Get the retransmission time
      *
-     * \param who node to get the parameter from
-     * \return calculated RTO time
+     * @param who node to get the parameter from
+     * @return calculated RTO time
      */
     Time GetRto(SocketWho who);
 
     /**
-     * \brief Get the minimum RTO attribute
+     * @brief Get the minimum RTO attribute
      *
-     * \param who node to get the parameter from
-     * \return minimum RTO time
+     * @param who node to get the parameter from
+     * @return minimum RTO time
      */
     Time GetMinRto(SocketWho who);
 
     /**
-     * \brief Get the retransmission time for the SYN segments
+     * @brief Get the retransmission time for the SYN segments
      *
-     * \param who node to get the parameter from
-     * \return SYN segments RTO time
+     * @param who node to get the parameter from
+     * @return SYN segments RTO time
      */
     Time GetConnTimeout(SocketWho who);
 
     /**
-     * \brief Get the Rtt estimator of the socket
+     * @brief Get the Rtt estimator of the socket
      *
-     * \param who node to get the parameter from
-     * \return Rtt estimator
+     * @param who node to get the parameter from
+     * @return Rtt estimator
      */
     Ptr<RttEstimator> GetRttEstimator(SocketWho who);
 
     /**
-     * \brief Get the clock granularity attribute
+     * @brief Get the clock granularity attribute
      *
-     * \param who node to get the parameter from
-     * \return clock granularity
+     * @param who node to get the parameter from
+     * @return clock granularity
      */
     Time GetClockGranularity(SocketWho who);
 
     /**
-     * \brief Get the state of the TCP state machine
+     * @brief Get the state of the TCP state machine
      *
-     * \param who socket where check the parameter
-     * \return the state of the socket
+     * @param who socket where check the parameter
+     * @return the state of the socket
      */
     TcpSocket::TcpStates_t GetTcpState(SocketWho who);
 
     /**
-     * \brief Get the TCB from selected socket
+     * @brief Get the TCB from selected socket
      *
-     * \param who socket where get the TCB
-     * \return the transmission control block
+     * @param who socket where get the TCB
+     * @return the transmission control block
      */
     Ptr<TcpSocketState> GetTcb(SocketWho who);
 
     /**
-     * \brief Get the Rx buffer from selected socket
+     * @brief Get the Rx buffer from selected socket
      *
-     * \param who socket where get the TCB
-     * \return the rx buffer
+     * @param who socket where get the TCB
+     * @return the rx buffer
      */
     Ptr<TcpRxBuffer> GetRxBuffer(SocketWho who);
 
     /**
-     * \brief Get the Tx buffer from selected socket
+     * @brief Get the Tx buffer from selected socket
      *
-     * \param who socket where get the TCB
-     * \return the tx buffer
+     * @param who socket where get the TCB
+     * @return the tx buffer
      */
     Ptr<TcpTxBuffer> GetTxBuffer(SocketWho who);
 
     /**
-     * \brief Get the rWnd of the selected socket
+     * @brief Get the rWnd of the selected socket
      *
-     * \param who socket where check the parameter
-     * \return the received advertised window
+     * @param who socket where check the parameter
+     * @return the received advertised window
      */
     uint32_t GetRWnd(SocketWho who);
 
     /**
-     * \brief Get the persistent event of the selected socket
+     * @brief Get the persistent event of the selected socket
      *
-     * \param who socket where check the parameter
-     * \return the persistent event in the selected socket
+     * @param who socket where check the parameter
+     * @return the persistent event in the selected socket
      */
     EventId GetPersistentEvent(SocketWho who);
 
     /**
-     * \brief Get the persistent timeout of the selected socket
+     * @brief Get the persistent timeout of the selected socket
      *
-     * \param who socket where check the parameter
-     * \return the persistent timeout in the selected socket
+     * @param who socket where check the parameter
+     * @return the persistent timeout in the selected socket
      */
     Time GetPersistentTimeout(SocketWho who);
 
     /**
-     * \brief Forcefully set a defined size for rx buffer
+     * @brief Forcefully set a defined size for rx buffer
      *
-     * \param who socket to force
-     * \param size size of the rx buffer
+     * @param who socket to force
+     * @param size size of the rx buffer
      */
     void SetRcvBufSize(SocketWho who, uint32_t size);
 
     /**
-     * \brief Forcefully set the segment size
+     * @brief Forcefully set the segment size
      *
-     * \param who socket to force
-     * \param segmentSize segmentSize
+     * @param who socket to force
+     * @param segmentSize segmentSize
      */
     void SetSegmentSize(SocketWho who, uint32_t segmentSize);
 
     /**
-     * \brief Forcefully set the initial cwnd
+     * @brief Forcefully set the initial cwnd
      *
-     * \param who socket to force
-     * \param initialCwnd size of the initial cwnd (segments)
+     * @param who socket to force
+     * @param initialCwnd size of the initial cwnd (segments)
      */
     void SetInitialCwnd(SocketWho who, uint32_t initialCwnd);
 
     /**
-     * \brief Forcefully set the delayed acknowledgement count
+     * @brief Forcefully set the delayed acknowledgement count
      *
-     * \param who socket to force
-     * \param count value of delayed ACKs
+     * @param who socket to force
+     * @param count value of delayed ACKs
      */
     void SetDelAckMaxCount(SocketWho who, uint32_t count);
 
     /**
-     * \brief Forcefully set the ECN mode of use
+     * @brief Forcefully set the ECN mode of use
      *
-     * \param who socket to force
-     * \param useEcn Value representing the mode of ECN usage requested
+     * @param who socket to force
+     * @param useEcn Value representing the mode of ECN usage requested
      */
     void SetUseEcn(SocketWho who, TcpSocketState::UseEcn_t useEcn);
 
     /**
-     * \brief Enable or disable pacing in the TCP socket
+     * @brief Enable or disable pacing in the TCP socket
      *
-     * \param who socket
-     * \param pacing Boolean to enable or disable pacing
+     * @param who socket
+     * @param pacing Boolean to enable or disable pacing
      */
     void SetPacingStatus(SocketWho who, bool pacing);
 
     /**
-     * \brief Enable or disable pacing of the initial window
+     * @brief Enable or disable pacing of the initial window
      *
-     * \param who socket
-     * \param paceWindow Boolean to enable or disable pacing of initial window
+     * @param who socket
+     * @param paceWindow Boolean to enable or disable pacing of initial window
      */
     void SetPaceInitialWindow(SocketWho who, bool paceWindow);
 
     /**
-     * \brief Forcefully set the initial ssthresh
+     * @brief Forcefully set the initial ssthresh
      *
-     * \param who socket to force
-     * \param initialSsThresh Initial slow start threshold (bytes)
+     * @param who socket to force
+     * @param initialSsThresh Initial slow start threshold (bytes)
      */
     void SetInitialSsThresh(SocketWho who, uint32_t initialSsThresh);
 
     /**
-     * \brief Set app packet size
+     * @brief Set app packet size
      *
      * The application will generate packet of this size.
      *
-     * \param pktSize size of the packet
+     * @param pktSize size of the packet
      */
     void SetAppPktSize(uint32_t pktSize)
     {
@@ -633,11 +633,11 @@
     }
 
     /**
-     * \brief Set app packet count
+     * @brief Set app packet count
      *
      * The application will generate this count of packets.
      *
-     * \param pktCount count of packets to generate
+     * @param pktCount count of packets to generate
      */
     void SetAppPktCount(uint32_t pktCount)
     {
@@ -645,9 +645,9 @@
     }
 
     /**
-     * \brief Interval between app-generated packet
+     * @brief Interval between app-generated packet
      *
-     * \param pktInterval interval
+     * @param pktInterval interval
      */
     void SetAppPktInterval(Time pktInterval)
     {
@@ -655,9 +655,9 @@
     }
 
     /**
-     * \brief Propagation delay of the bottleneck link
+     * @brief Propagation delay of the bottleneck link
      *
-     * \param propDelay propagation delay
+     * @param propDelay propagation delay
      */
     void SetPropagationDelay(Time propDelay)
     {
@@ -665,9 +665,9 @@
     }
 
     /**
-     * \brief Set the initial time at which the application sends the first data packet
+     * @brief Set the initial time at which the application sends the first data packet
      *
-     * \param startTime start time
+     * @param startTime start time
      */
     void SetTransmitStart(Time startTime)
     {
@@ -675,9 +675,9 @@
     }
 
     /**
-     * \brief Congestion control of the sender socket
+     * @brief Congestion control of the sender socket
      *
-     * \param congControl typeid of the congestion control algorithm
+     * @param congControl typeid of the congestion control algorithm
      */
     void SetCongestionControl(TypeId congControl)
     {
@@ -685,9 +685,9 @@
     }
 
     /**
-     * \brief recovery algorithm of the sender socket
+     * @brief recovery algorithm of the sender socket
      *
-     * \param recovery typeid of the recovery algorithm
+     * @param recovery typeid of the recovery algorithm
      */
     void SetRecoveryAlgorithm(TypeId recovery)
     {
@@ -695,9 +695,9 @@
     }
 
     /**
-     * \brief MTU of the bottleneck link
+     * @brief MTU of the bottleneck link
      *
-     * \param mtu MTU
+     * @param mtu MTU
      */
     void SetMTU(uint32_t mtu)
     {
@@ -705,9 +705,9 @@
     }
 
     /**
-     * \brief State on Ack state machine changes
-     * \param oldValue old value
-     * \param newValue new value
+     * @brief State on Ack state machine changes
+     * @param oldValue old value
+     * @param newValue new value
      */
     virtual void CongStateTrace(const TcpSocketState::TcpCongState_t oldValue [[maybe_unused]],
                                 const TcpSocketState::TcpCongState_t newValue [[maybe_unused]])
@@ -715,20 +715,20 @@
     }
 
     /**
-     * \brief Tracks the congestion window changes
+     * @brief Tracks the congestion window changes
      *
-     * \param oldValue old value
-     * \param newValue new value
+     * @param oldValue old value
+     * @param newValue new value
      */
     virtual void CWndTrace(uint32_t oldValue [[maybe_unused]], uint32_t newValue [[maybe_unused]])
     {
     }
 
     /**
-     * \brief Tracks the inflated congestion window changes
+     * @brief Tracks the inflated congestion window changes
      *
-     * \param oldValue old value
-     * \param newValue new value
+     * @param oldValue old value
+     * @param newValue new value
      */
     virtual void CWndInflTrace(uint32_t oldValue [[maybe_unused]],
                                uint32_t newValue [[maybe_unused]])
@@ -736,24 +736,24 @@
     }
 
     /**
-     * \brief Rtt changes
+     * @brief Rtt changes
      *
      * This applies only for sender socket.
      *
-     * \param oldTime old value
-     * \param newTime new value
+     * @param oldTime old value
+     * @param newTime new value
      */
     virtual void RttTrace(Time oldTime [[maybe_unused]], Time newTime [[maybe_unused]])
     {
     }
 
     /**
-     * \brief Slow start threshold changes
+     * @brief Slow start threshold changes
      *
      * This applies only for sender socket.
      *
-     * \param oldValue old value
-     * \param newValue new value
+     * @param oldValue old value
+     * @param newValue new value
      */
     virtual void SsThreshTrace(uint32_t oldValue [[maybe_unused]],
                                uint32_t newValue [[maybe_unused]])
@@ -761,12 +761,12 @@
     }
 
     /**
-     * \brief Bytes in flight changes
+     * @brief Bytes in flight changes
      *
      * This applies only for sender socket.
      *
-     * \param oldValue old value
-     * \param newValue new value
+     * @param oldValue old value
+     * @param newValue new value
      */
     virtual void BytesInFlightTrace(uint32_t oldValue [[maybe_unused]],
                                     uint32_t newValue [[maybe_unused]])
@@ -774,24 +774,24 @@
     }
 
     /**
-     * \brief RTO changes
+     * @brief RTO changes
      *
      * This applies only for sender socket.
      *
-     * \param oldValue old value
-     * \param newValue new value
+     * @param oldValue old value
+     * @param newValue new value
      */
     virtual void RtoTrace(Time oldValue [[maybe_unused]], Time newValue [[maybe_unused]])
     {
     }
 
     /**
-     * \brief Next tx seq changes
+     * @brief Next tx seq changes
      *
      * This applies only for sender socket.
      *
-     * \param oldValue old value
-     * \param newValue new value
+     * @param oldValue old value
+     * @param newValue new value
      */
     virtual void NextTxSeqTrace(SequenceNumber32 oldValue [[maybe_unused]],
                                 SequenceNumber32 newValue [[maybe_unused]])
@@ -799,12 +799,12 @@
     }
 
     /**
-     * \brief Highest tx seq changes
+     * @brief Highest tx seq changes
      *
      * This applies only for sender socket.
      *
-     * \param oldValue old value
-     * \param newValue new value
+     * @param oldValue old value
+     * @param newValue new value
      */
     virtual void HighestTxSeqTrace(SequenceNumber32 oldValue [[maybe_unused]],
                                    SequenceNumber32 newValue [[maybe_unused]])
@@ -812,63 +812,63 @@
     }
 
     /**
-     * \brief Track the rate value of TcpRateLinux.
-     * \param rate updated value of TcpRate.
+     * @brief Track the rate value of TcpRateLinux.
+     * @param rate updated value of TcpRate.
      */
     virtual void RateUpdatedTrace(const TcpRateLinux::TcpRateConnection& rate [[maybe_unused]])
     {
     }
 
     /**
-     * \brief Track the rate sample value of TcpRateLinux.
-     * \param sample updated value of TcpRateSample.
+     * @brief Track the rate sample value of TcpRateLinux.
+     * @param sample updated value of TcpRateSample.
      */
     virtual void RateSampleUpdatedTrace(const TcpRateLinux::TcpRateSample& sample [[maybe_unused]])
     {
     }
 
     /**
-     * \brief Socket closed normally
-     * \param who the socket closed (SENDER or RECEIVER)
+     * @brief Socket closed normally
+     * @param who the socket closed (SENDER or RECEIVER)
      */
     virtual void NormalClose(SocketWho who [[maybe_unused]])
     {
     }
 
     /**
-     * \brief Socket closed with an error
+     * @brief Socket closed with an error
      *
-     * \param who the socket closed (SENDER or RECEIVER)
+     * @param who the socket closed (SENDER or RECEIVER)
      */
     virtual void ErrorClose(SocketWho who [[maybe_unused]])
     {
-        /** \todo indicate the error */
+        /** @todo indicate the error */
     }
 
     /**
-     * \brief Drop on the queue
-     * \param who where the drop occurred (SENDER or RECEIVER)
+     * @brief Drop on the queue
+     * @param who where the drop occurred (SENDER or RECEIVER)
      */
     virtual void QueueDrop(SocketWho who [[maybe_unused]])
     {
     }
 
     /**
-     * \brief Link drop
-     * \param who where the drop occurred (SENDER or RECEIVER)
+     * @brief Link drop
+     * @param who where the drop occurred (SENDER or RECEIVER)
      */
     virtual void PhyDrop(SocketWho who [[maybe_unused]])
     {
     }
 
     /**
-     * \brief Received ack
+     * @brief Received ack
      *
      * Invoked when an ACK is received (no processing is done yet)
      *
-     * \param tcb Transmission Control Block
-     * \param h the header of segment
-     * \param who the socket which has received the ACK (SENDER or RECEIVER)
+     * @param tcb Transmission Control Block
+     * @param h the header of segment
+     * @param who the socket which has received the ACK (SENDER or RECEIVER)
      */
     virtual void RcvAck(const Ptr<const TcpSocketState> tcb [[maybe_unused]],
                         const TcpHeader& h [[maybe_unused]],
@@ -877,13 +877,13 @@
     }
 
     /**
-     * \brief Processed ack
+     * @brief Processed ack
      *
      * Invoked after the processing of the ACK
      *
-     * \param tcb Transmission Control Block
-     * \param h the header of segment
-     * \param who the socket which has processed the ACK (SENDER or RECEIVER)
+     * @param tcb Transmission Control Block
+     * @param h the header of segment
+     * @param who the socket which has processed the ACK (SENDER or RECEIVER)
      */
     virtual void ProcessedAck(const Ptr<const TcpSocketState> tcb [[maybe_unused]],
                               const TcpHeader& h [[maybe_unused]],
@@ -892,28 +892,28 @@
     }
 
     /**
-     * \brief Packet transmitted down to IP layer
+     * @brief Packet transmitted down to IP layer
      *
-     * \param p packet
-     * \param h header
-     * \param who the socket which has received the packet (SENDER or RECEIVER)
+     * @param p packet
+     * @param h header
+     * @param who the socket which has received the packet (SENDER or RECEIVER)
      */
     virtual void Tx(const Ptr<const Packet> p, const TcpHeader& h, SocketWho who);
 
     /**
-     * \brief Packet received from IP layer
+     * @brief Packet received from IP layer
      *
-     * \param p packet
-     * \param h header
-     * \param who  the socket which has received the packet (SENDER or RECEIVER)
+     * @param p packet
+     * @param h header
+     * @param who  the socket which has received the packet (SENDER or RECEIVER)
      */
     virtual void Rx(const Ptr<const Packet> p, const TcpHeader& h, SocketWho who);
 
     /**
-     * \brief Rto has expired
+     * @brief Rto has expired
      *
-     * \param tcb Transmission control block
-     * \param who where the RTO has expired (SENDER or RECEIVER)
+     * @param tcb Transmission control block
+     * @param who where the RTO has expired (SENDER or RECEIVER)
      */
     virtual void AfterRTOExpired(const Ptr<const TcpSocketState> tcb [[maybe_unused]],
                                  SocketWho who [[maybe_unused]])
@@ -921,10 +921,10 @@
     }
 
     /**
-     * \brief Rto has expired
+     * @brief Rto has expired
      *
-     * \param tcb Transmission control block
-     * \param who where the RTO has expired (SENDER or RECEIVER)
+     * @param tcb Transmission control block
+     * @param who where the RTO has expired (SENDER or RECEIVER)
      */
     virtual void BeforeRTOExpired(const Ptr<const TcpSocketState> tcb [[maybe_unused]],
                                   SocketWho who [[maybe_unused]])
@@ -932,11 +932,11 @@
     }
 
     /**
-     * \brief Updated the Rtt history
-     * \param seq Sequence inserted
-     * \param sz size
-     * \param isRetransmission self-explanatory
-     * \param who where the rtt history was updated
+     * @brief Updated the Rtt history
+     * @param seq Sequence inserted
+     * @param sz size
+     * @param isRetransmission self-explanatory
+     * @param who where the rtt history was updated
      */
     virtual void UpdatedRttHistory(const SequenceNumber32& seq [[maybe_unused]],
                                    uint32_t sz [[maybe_unused]],
@@ -946,25 +946,25 @@
     }
 
     /**
-     * \brief Notifying application for sent data
+     * @brief Notifying application for sent data
      *
-     * \param size the amount of bytes transmitted
-     * \param who where the RTO has expired (SENDER or RECEIVER)
+     * @param size the amount of bytes transmitted
+     * @param who where the RTO has expired (SENDER or RECEIVER)
      */
     virtual void DataSent(uint32_t size [[maybe_unused]], SocketWho who [[maybe_unused]])
     {
     }
 
     /**
-     * \brief Performs the (eventual) final checks through test asserts
+     * @brief Performs the (eventual) final checks through test asserts
      */
     virtual void FinalChecks()
     {
     }
 
     /**
-     * \brief Get the channel Propagation Delay
-     * \return propagation delay of the channel
+     * @brief Get the channel Propagation Delay
+     * @return propagation delay of the channel
      */
     Time GetPropagationDelay() const
     {
@@ -972,8 +972,8 @@
     }
 
     /**
-     * \brief Get the data start time
-     * \return start time of data packets
+     * @brief Get the data start time
+     * @return start time of data packets
      */
     Time GetStartTime() const
     {
@@ -981,8 +981,8 @@
     }
 
     /**
-     * \brief Get the MTU of the environment
-     * \return MTU of the environment
+     * @brief Get the MTU of the environment
+     * @return MTU of the environment
      */
     uint32_t GetMtu() const
     {
@@ -990,8 +990,8 @@
     }
 
     /**
-     * \brief Get the application packet size
-     * \return application packet size
+     * @brief Get the application packet size
+     * @return application packet size
      */
     uint32_t GetPktSize() const
     {
@@ -999,8 +999,8 @@
     }
 
     /**
-     * \brief Get the number of application packets
-     * \return count of application packets to be generated
+     * @brief Get the number of application packets
+     * @return count of application packets to be generated
      */
     uint32_t GetPktCount() const
     {
@@ -1008,9 +1008,9 @@
     }
 
     /**
-     * \brief Get the interval to wait for each packet sent down from application
+     * @brief Get the interval to wait for each packet sent down from application
      * to TCP
-     * \return interval between packet
+     * @return interval between packet
      */
     Time GetPktInterval() const
     {
@@ -1039,71 +1039,71 @@
     // De-multiplexing callbacks.
 
     /**
-     * \brief Normal Close Callback.
-     * \param socket The socket.
+     * @brief Normal Close Callback.
+     * @param socket The socket.
      */
     void NormalCloseCb(Ptr<Socket> socket);
     /**
-     * \brief Error Close Callback.
-     * \param socket The socket.
+     * @brief Error Close Callback.
+     * @param socket The socket.
      */
     void ErrorCloseCb(Ptr<Socket> socket);
     /**
-     * \brief Queue Drop Callback.
-     * \param context The context.
-     * \param p The packet.
+     * @brief Queue Drop Callback.
+     * @param context The context.
+     * @param p The packet.
      */
     void QueueDropCb(std::string context, Ptr<const Packet> p);
     /**
-     * \brief Drop at Phy layer Callback.
-     * \param context The context.
-     * \param p The packet.
+     * @brief Drop at Phy layer Callback.
+     * @param context The context.
+     * @param p The packet.
      */
     void PhyDropCb(std::string context, Ptr<const Packet> p);
     /**
-     * \brief Receive ACK Callback.
-     * \param p The packet.
-     * \param h TCP header.
-     * \param tcp The TCP socket.
+     * @brief Receive ACK Callback.
+     * @param p The packet.
+     * @param h TCP header.
+     * @param tcp The TCP socket.
      */
     void RcvAckCb(Ptr<const Packet> p, const TcpHeader& h, Ptr<const TcpSocketBase> tcp);
     /**
-     * \brief ACK processed Callback.
-     * \param p The packet.
-     * \param h TCP header.
-     * \param tcp The TCP socket.
+     * @brief ACK processed Callback.
+     * @param p The packet.
+     * @param h TCP header.
+     * @param tcp The TCP socket.
      */
     void ProcessedAckCb(Ptr<const Packet> p, const TcpHeader& h, Ptr<const TcpSocketBase> tcp);
     /**
-     * \brief Tx packet Callback.
-     * \param p The packet.
-     * \param h TCP header.
-     * \param tcp The TCP socket.
+     * @brief Tx packet Callback.
+     * @param p The packet.
+     * @param h TCP header.
+     * @param tcp The TCP socket.
      */
     void TxPacketCb(const Ptr<const Packet> p,
                     const TcpHeader& h,
                     const Ptr<const TcpSocketBase> tcp);
     /**
-     * \brief Rx packet Callback.
-     * \param p The packet.
-     * \param h TCP header.
-     * \param tcp The TCP socket.
+     * @brief Rx packet Callback.
+     * @param p The packet.
+     * @param h TCP header.
+     * @param tcp The TCP socket.
      */
     void RxPacketCb(const Ptr<const Packet> p,
                     const TcpHeader& h,
                     const Ptr<const TcpSocketBase> tcp);
     /**
-     * \brief RTO expired Callback.
-     * \param tcb Transmission control block.
-     * \param tcp The TCP socket.
+     * @brief RTO expired Callback.
+     * @param tcb Transmission control block.
+     * @param tcp The TCP socket.
      */
     void RtoExpiredCb(const Ptr<const TcpSocketState> tcb, const Ptr<const TcpSocketBase> tcp);
     /**
-     * \brief Update RTT with new data.
-     * \param tcp The TCP socket.
-     * \param seq The sequence number.
-     * \param sz The segment size.
-     * \param isRetransmission True if packet is a retransmission.
+     * @brief Update RTT with new data.
+     * @param tcp The TCP socket.
+     * @param seq The sequence number.
+     * @param sz The segment size.
+     * @param isRetransmission True if packet is a retransmission.
      */
     void UpdateRttHistoryCb(Ptr<const TcpSocketBase> tcp,
                             const SequenceNumber32& seq,
@@ -1111,35 +1111,35 @@
                             bool isRetransmission);
 
     /**
-     * \brief Invoked after a retransmit event.
-     * \param tcb Transmission control block.
-     * \param tcp The TCP socket.
+     * @brief Invoked after a retransmit event.
+     * @param tcb Transmission control block.
+     * @param tcp The TCP socket.
      */
     void AfterRetransmitCb(const Ptr<const TcpSocketState> tcb, const Ptr<const TcpSocketBase> tcp);
 
     /**
-     * \brief Invoked before a retransmit event.
-     * \param tcb Transmission control block.
-     * \param tcp The TCP socket.
+     * @brief Invoked before a retransmit event.
+     * @param tcb Transmission control block.
+     * @param tcp The TCP socket.
      */
     void BeforeRetransmitCb(const Ptr<const TcpSocketState> tcb,
                             const Ptr<const TcpSocketBase> tcp);
 
     /**
-     * \brief Data sent Callback.
-     * \param socket The socket.
-     * \param size The data size.
+     * @brief Data sent Callback.
+     * @param socket The socket.
+     * @param size The data size.
      */
     void DataSentCb(Ptr<Socket> socket, uint32_t size);
     /**
-     * \brief Fork Callback.
-     * \param tcp The TCP socket.
+     * @brief Fork Callback.
+     * @param tcp The TCP socket.
      */
     void ForkCb(Ptr<TcpSocketMsgBase> tcp);
     /**
-     * \brief Handle an accept connection.
-     * \param socket The socket.
-     * \param from The sender.
+     * @brief Handle an accept connection.
+     * @param socket The socket.
+     * @param from The sender.
      */
     void HandleAccept(Ptr<Socket> socket, const Address& from);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/tcp-header-test.cc ns-3.44/src/internet/test/tcp-header-test.cc
--- ns-3.43/src/internet/test/tcp-header-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/tcp-header-test.cc	2025-03-09 16:55:49.415371200 -0700
@@ -29,16 +29,16 @@
     static_cast<uint8_t>(RandomVariable->GetInteger(0, UINT8_MAX >> 2))
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief TCP header Get/Set test.
+ * @brief TCP header Get/Set test.
  */
 class TcpHeaderGetSetTestCase : public TestCase
 {
   public:
     /**
      * Constructor.
-     * \param name Test description.
+     * @param name Test description.
      */
     TcpHeaderGetSetTestCase(std::string name);
 
@@ -146,16 +146,16 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief TCP header with RFC793 Options test.
+ * @brief TCP header with RFC793 Options test.
  */
 class TcpHeaderWithRFC793OptionTestCase : public TestCase
 {
   public:
     /**
      * Constructor.
-     * \param name Test description.
+     * @param name Test description.
      */
     TcpHeaderWithRFC793OptionTestCase(std::string name);
 
@@ -164,15 +164,15 @@
     void DoTeardown() override;
 
     /**
-     * \brief Check an header with only one kind of option.
+     * @brief Check an header with only one kind of option.
      */
     void OneOptionAtTime();
     /**
-     * \brief Check an header for the correct padding.
+     * @brief Check an header for the correct padding.
      */
     void CheckNoPadding();
     /**
-     * \brief Check the correct header deserialization.
+     * @brief Check the correct header deserialization.
      */
     void CheckCorrectDeserialize();
 };
@@ -372,16 +372,16 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief TCP header Flags to String test.
+ * @brief TCP header Flags to String test.
  */
 class TcpHeaderFlagsToString : public TestCase
 {
   public:
     /**
      * Constructor.
-     * \param name Test description.
+     * @param name Test description.
      */
     TcpHeaderFlagsToString(std::string name);
 
@@ -441,9 +441,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief TCP header TestSuite
+ * @brief TCP header TestSuite
  */
 class TcpHeaderTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/tcp-highspeed-test.cc ns-3.44/src/internet/test/tcp-highspeed-test.cc
--- ns-3.43/src/internet/test/tcp-highspeed-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/tcp-highspeed-test.cc	2025-03-09 16:55:49.415371200 -0700
@@ -16,18 +16,18 @@
 NS_LOG_COMPONENT_DEFINE("TcpHighSpeedTestSuite");
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Testing the congestion avoidance increment on TcpHighSpeed
+ * @brief Testing the congestion avoidance increment on TcpHighSpeed
  */
 class TcpHighSpeedIncrementTest : public TestCase
 {
   public:
     /**
-     * \brief Constructor.
-     * \param cWnd Congestion window.
-     * \param segmentSize Segment size.
-     * \param name Test description.
+     * @brief Constructor.
+     * @param cWnd Congestion window.
+     * @param segmentSize Segment size.
+     * @param name Test description.
      */
     TcpHighSpeedIncrementTest(uint32_t cWnd, uint32_t segmentSize, const std::string& name);
 
@@ -70,18 +70,18 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Testing the congestion avoidance decrement on TcpHighSpeed
+ * @brief Testing the congestion avoidance decrement on TcpHighSpeed
  */
 class TcpHighSpeedDecrementTest : public TestCase
 {
   public:
     /**
-     * \brief Constructor.
-     * \param cWnd Congestion window.
-     * \param segmentSize Segment size.
-     * \param name Test description.
+     * @brief Constructor.
+     * @param cWnd Congestion window.
+     * @param segmentSize Segment size.
+     * @param name Test description.
      */
     TcpHighSpeedDecrementTest(uint32_t cWnd, uint32_t segmentSize, const std::string& name);
 
@@ -123,9 +123,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief TcpHighSpeed Congestion window values to test.
+ * @brief TcpHighSpeed Congestion window values to test.
  */
 struct HighSpeedImportantValues
 {
@@ -164,9 +164,9 @@
 #define HIGHSPEED_VALUES_N 71
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief TCP HighSpeed TestSuite
+ * @brief TCP HighSpeed TestSuite
  */
 class TcpHighSpeedTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/tcp-htcp-test.cc ns-3.44/src/internet/test/tcp-htcp-test.cc
--- ns-3.43/src/internet/test/tcp-htcp-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/tcp-htcp-test.cc	2025-03-09 16:55:49.415371200 -0700
@@ -24,23 +24,23 @@
 NS_LOG_COMPONENT_DEFINE("TcpHtcpTestSuite");
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Testing the congestion avoidance increment on TcpHtcp
+ * @brief Testing the congestion avoidance increment on TcpHtcp
  */
 class TcpHtcpIncrementTest : public TestCase
 {
   public:
     /**
-     * \brief Constructor.
-     * \param cWnd Congestion window.
-     * \param segmentSize Segment size.
-     * \param segmentsAcked Segments already ACKed.
-     * \param lastCongestion Last congestion time.
-     * \param firstAck First ACK time.
-     * \param secondAck Second ACK time.
-     * \param expectedCwnd Expected cWnd.
-     * \param name Test description.
+     * @brief Constructor.
+     * @param cWnd Congestion window.
+     * @param segmentSize Segment size.
+     * @param segmentsAcked Segments already ACKed.
+     * @param lastCongestion Last congestion time.
+     * @param firstAck First ACK time.
+     * @param secondAck Second ACK time.
+     * @param expectedCwnd Expected cWnd.
+     * @param name Test description.
      */
     TcpHtcpIncrementTest(uint32_t cWnd,
                          uint32_t segmentSize,
@@ -84,7 +84,7 @@
 }
 
 /**
- * \brief Since the calculation depends on the throughput and its associated
+ * @brief Since the calculation depends on the throughput and its associated
  * timing, we schedule a few exact events. We get the value from HTCP methods
  * during the simulation and compare them with their associated expected
  * values calculated from the algorithm by hand.
@@ -114,13 +114,13 @@
                         cong,
                         m_state,
                         m_segmentsAcked,
-                        Time(ns3::MilliSeconds(80)));
+                        MilliSeconds(80));
     Simulator::Schedule(Time(m_secondAck),
                         &TcpHtcp::PktsAcked,
                         cong,
                         m_state,
                         m_segmentsAcked,
-                        Time(ns3::MilliSeconds(100)));
+                        MilliSeconds(100));
 
     Simulator::Run();
     NS_LOG_DEBUG("Simulation ran for the scheduled events");
@@ -135,9 +135,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief TCP Htcp TestSuite.
+ * @brief TCP Htcp TestSuite.
  *
  * The following tests simulate conditions after a congestion event and
  * return to 1/2 ssthresh. After that, two acks are scheduled and the
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/tcp-hybla-test.cc ns-3.44/src/internet/test/tcp-hybla-test.cc
--- ns-3.43/src/internet/test/tcp-hybla-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/tcp-hybla-test.cc	2025-03-09 16:55:49.415371200 -0700
@@ -16,20 +16,20 @@
 NS_LOG_COMPONENT_DEFINE("TcpHyblaTestSuite");
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Testing the congestion avoidance increment on TcpHybla
+ * @brief Testing the congestion avoidance increment on TcpHybla
  */
 class TcpHyblaIncrementTest : public TestCase
 {
   public:
     /**
-     * \brief Constructor.
-     * \param cWnd Congestion window.
-     * \param ssThresh Slow Start Threshold.
-     * \param segmentSize Segment size.
-     * \param rtt Round trip time.
-     * \param name Test description.
+     * @brief Constructor.
+     * @param cWnd Congestion window.
+     * @param ssThresh Slow Start Threshold.
+     * @param segmentSize Segment size.
+     * @param rtt Round trip time.
+     * @param name Test description.
      */
     TcpHyblaIncrementTest(uint32_t cWnd,
                           uint32_t ssThresh,
@@ -41,9 +41,9 @@
     void DoRun() override;
 
     /**
-     * \brief Tracks TCP Hybla rho parameter changes.
-     * \param oldVal Previous value.
-     * \param newVal Actual value.
+     * @brief Tracks TCP Hybla rho parameter changes.
+     * @param oldVal Previous value.
+     * @param newVal Actual value.
      */
     void RhoUpdated(double oldVal, double newVal);
 
@@ -136,9 +136,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief TCP Hybla TestSuite
+ * @brief TCP Hybla TestSuite
  */
 class TcpHyblaTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/tcp-illinois-test.cc ns-3.44/src/internet/test/tcp-illinois-test.cc
--- ns-3.43/src/internet/test/tcp-illinois-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/tcp-illinois-test.cc	2025-03-09 16:55:49.415371200 -0700
@@ -23,24 +23,24 @@
 NS_LOG_COMPONENT_DEFINE("TcpIllinoisTestSuite");
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief TcpIllinois C-AIMD algorithm tests.
+ * @brief TcpIllinois C-AIMD algorithm tests.
  */
 class TcpIllinoisTest : public TestCase
 {
   public:
     /**
-     * \brief Constructor.
-     * \param cWnd Congestion window.
-     * \param ssThresh Slow Start Threshold.
-     * \param segmentSize Segment size.
-     * \param cntRtt RTT counter.
-     * \param maxRtt Max RTT.
-     * \param segmentsAcked Number of segments ACKed.
-     * \param nextTxSeq Next Tx sequence number.
-     * \param lastAckedSeq Last ACKed sequence number.
-     * \param name Test description.
+     * @brief Constructor.
+     * @param cWnd Congestion window.
+     * @param ssThresh Slow Start Threshold.
+     * @param segmentSize Segment size.
+     * @param cntRtt RTT counter.
+     * @param maxRtt Max RTT.
+     * @param segmentsAcked Number of segments ACKed.
+     * @param nextTxSeq Next Tx sequence number.
+     * @param lastAckedSeq Last ACKed sequence number.
+     * @param name Test description.
      */
     TcpIllinoisTest(uint32_t cWnd,
                     uint32_t ssThresh,
@@ -55,37 +55,37 @@
   private:
     void DoRun() override;
     /**
-     * \brief Increases the TCP window.
-     * \param cong The congestion control.
+     * @brief Increases the TCP window.
+     * @param cong The congestion control.
      */
     void IncreaseWindow(Ptr<TcpIllinois> cong);
     /**
-     * \brief Recalculate the internal TCP Illinois params.
-     * \param cong The congestion control.
+     * @brief Recalculate the internal TCP Illinois params.
+     * @param cong The congestion control.
      */
     void RecalcParam(Ptr<TcpIllinois> cong);
     /**
-     * \brief Calculate the maximum delay.
-     * \returns The maximum delay.
+     * @brief Calculate the maximum delay.
+     * @returns The maximum delay.
      */
     Time CalculateMaxDelay();
     /**
-     * \brief Calculate the average delay.
-     * \returns The average delay.
+     * @brief Calculate the average delay.
+     * @returns The average delay.
      */
     Time CalculateAvgDelay();
     /**
-     * \brief Calculate the TCP Illinois alpha param.
-     * \param cong The congestion control.
-     * \param da Average delay (in milliseconds).
-     * \param dm Maximum delay (in milliseconds).
+     * @brief Calculate the TCP Illinois alpha param.
+     * @param cong The congestion control.
+     * @param da Average delay (in milliseconds).
+     * @param dm Maximum delay (in milliseconds).
      */
     void CalculateAlpha(Ptr<TcpIllinois> cong, double da, double dm);
     /**
-     * \brief Calculate the TCP Illinois beta param.
-     * \param cong The congestion control.
-     * \param da Average delay (in milliseconds).
-     * \param dm Maximum delay (in milliseconds).
+     * @brief Calculate the TCP Illinois beta param.
+     * @param cong The congestion control.
+     * @param da Average delay (in milliseconds).
+     * @param dm Maximum delay (in milliseconds).
      */
     void CalculateBeta(Ptr<TcpIllinois> cong, double da, double dm);
     /**
@@ -333,9 +333,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief TCP Illinois TestSuite
+ * @brief TCP Illinois TestSuite
  */
 class TcpIllinoisTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/tcp-ledbat-test.cc ns-3.44/src/internet/test/tcp-ledbat-test.cc
--- ns-3.43/src/internet/test/tcp-ledbat-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/tcp-ledbat-test.cc	2025-03-09 16:55:49.415371200 -0700
@@ -19,24 +19,24 @@
 NS_LOG_COMPONENT_DEFINE("TcpLedbatTestSuite");
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief LEDBAT should be same as NewReno during slow start, and when timestamps are disabled
+ * @brief LEDBAT should be same as NewReno during slow start, and when timestamps are disabled
  */
 class TcpLedbatToNewReno : public TestCase
 {
   public:
     /**
-     * \brief Constructor
+     * @brief Constructor
      *
-     * \param cWnd congestion window
-     * \param segmentSize segment size
-     * \param ssThresh slow start threshold
-     * \param segmentsAcked segments acked
-     * \param highTxMark high tx mark
-     * \param lastAckedSeq last acked seq
-     * \param rtt RTT
-     * \param name Name of the test
+     * @param cWnd congestion window
+     * @param segmentSize segment size
+     * @param ssThresh slow start threshold
+     * @param segmentsAcked segments acked
+     * @param highTxMark high tx mark
+     * @param lastAckedSeq last acked seq
+     * @param rtt RTT
+     * @param name Name of the test
      */
     TcpLedbatToNewReno(uint32_t cWnd,
                        uint32_t segmentSize,
@@ -50,7 +50,7 @@
   private:
     void DoRun() override;
     /**
-     * \brief Execute the test
+     * @brief Execute the test
      */
     void ExecuteTest();
 
@@ -86,7 +86,7 @@
 void
 TcpLedbatToNewReno::DoRun()
 {
-    Simulator::Schedule(Seconds(0.0), &TcpLedbatToNewReno::ExecuteTest, this);
+    Simulator::Schedule(Seconds(0), &TcpLedbatToNewReno::ExecuteTest, this);
     Simulator::Run();
     Simulator::Destroy();
 }
@@ -120,24 +120,24 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Test to validate cWnd increment in LEDBAT
+ * @brief Test to validate cWnd increment in LEDBAT
  */
 class TcpLedbatIncrementTest : public TestCase
 {
   public:
     /**
-     * \brief Constructor
+     * @brief Constructor
      *
-     * \param cWnd congestion window
-     * \param segmentSize segment size
-     * \param ssThresh slow start threshold
-     * \param segmentsAcked segments acked
-     * \param highTxMark high tx mark
-     * \param lastAckedSeq last acked seq
-     * \param rtt RTT
-     * \param name Name of the test
+     * @param cWnd congestion window
+     * @param segmentSize segment size
+     * @param ssThresh slow start threshold
+     * @param segmentsAcked segments acked
+     * @param highTxMark high tx mark
+     * @param lastAckedSeq last acked seq
+     * @param rtt RTT
+     * @param name Name of the test
      */
     TcpLedbatIncrementTest(uint32_t cWnd,
                            uint32_t segmentSize,
@@ -151,7 +151,7 @@
   private:
     void DoRun() override;
     /**
-     * \brief Execute the test
+     * @brief Execute the test
      */
     void ExecuteTest();
 
@@ -187,7 +187,7 @@
 void
 TcpLedbatIncrementTest::DoRun()
 {
-    Simulator::Schedule(Seconds(0.0), &TcpLedbatIncrementTest::ExecuteTest, this);
+    Simulator::Schedule(Seconds(0), &TcpLedbatIncrementTest::ExecuteTest, this);
     Simulator::Run();
     Simulator::Destroy();
 }
@@ -222,24 +222,24 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Test to validate cWnd decrement in LEDBAT
+ * @brief Test to validate cWnd decrement in LEDBAT
  */
 class TcpLedbatDecrementTest : public TestCase
 {
   public:
     /**
-     * \brief Constructor
+     * @brief Constructor
      *
-     * \param cWnd congestion window
-     * \param segmentSize segment size
-     * \param ssThresh slow start threshold
-     * \param segmentsAcked segments acked
-     * \param highTxMark high tx mark
-     * \param lastAckedSeq last acked seq
-     * \param rtt RTT
-     * \param name Name of the test
+     * @param cWnd congestion window
+     * @param segmentSize segment size
+     * @param ssThresh slow start threshold
+     * @param segmentsAcked segments acked
+     * @param highTxMark high tx mark
+     * @param lastAckedSeq last acked seq
+     * @param rtt RTT
+     * @param name Name of the test
      */
     TcpLedbatDecrementTest(uint32_t cWnd,
                            uint32_t segmentSize,
@@ -253,7 +253,7 @@
   private:
     void DoRun() override;
     /**
-     * \brief Execute the test
+     * @brief Execute the test
      */
     void ExecuteTest();
 
@@ -289,7 +289,7 @@
 void
 TcpLedbatDecrementTest::DoRun()
 {
-    Simulator::Schedule(Seconds(0.0), &TcpLedbatDecrementTest::ExecuteTest, this);
+    Simulator::Schedule(Seconds(0), &TcpLedbatDecrementTest::ExecuteTest, this);
     Simulator::Run();
     Simulator::Destroy();
 }
@@ -327,9 +327,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief TCP Ledbat TestSuite
+ * @brief TCP Ledbat TestSuite
  */
 class TcpLedbatTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/tcp-linux-reno-test.cc ns-3.44/src/internet/test/tcp-linux-reno-test.cc
--- ns-3.43/src/internet/test/tcp-linux-reno-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/tcp-linux-reno-test.cc	2025-03-09 16:55:49.415371200 -0700
@@ -19,7 +19,7 @@
 NS_LOG_COMPONENT_DEFINE("TcpLinuxRenoTest");
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
  * This unit test checks that the slow start and congestion avoidance
  * behavior matches Linux behavior as follows:
@@ -36,15 +36,15 @@
 {
   public:
     /**
-     * \brief Constructor.
-     * \param segmentSize Segment size.
-     * \param packetSize Size of the packets.
-     * \param packets Number of packets.
-     * \param initialCwnd Initial congestion window
-     * \param delayedAck Delayed Acknowledgement
-     * \param expectedCwnd Expected value of m_cWnd
-     * \param congControl Type of congestion control.
-     * \param desc The test description.
+     * @brief Constructor.
+     * @param segmentSize Segment size.
+     * @param packetSize Size of the packets.
+     * @param packets Number of packets.
+     * @param initialCwnd Initial congestion window
+     * @param delayedAck Delayed Acknowledgement
+     * @param expectedCwnd Expected value of m_cWnd
+     * @param congControl Type of congestion control.
+     * @param desc The test description.
      */
     TcpLinuxRenoSSTest(uint32_t segmentSize,
                        uint32_t packetSize,
@@ -182,7 +182,7 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
  * This unit test checks that the slow start and congestion avoidance
  * behavior matches Linux behavior as follows:
@@ -199,16 +199,16 @@
 {
   public:
     /**
-     * \brief Constructor.
-     * \param segmentSize Segment size.
-     * \param packetSize Size of the packets.
-     * \param packets Number of packets.
-     * \param initialCwnd Initial congestion window (segments)
-     * \param initialSSThresh Initial slow start threshold (bytes)
-     * \param delayedAck Delayed Acknowledgement
-     * \param expectedCwnd Expected final m_cWnd value
-     * \param congControl Type of congestion control.
-     * \param desc The test description.
+     * @brief Constructor.
+     * @param segmentSize Segment size.
+     * @param packetSize Size of the packets.
+     * @param packets Number of packets.
+     * @param initialCwnd Initial congestion window (segments)
+     * @param initialSSThresh Initial slow start threshold (bytes)
+     * @param delayedAck Delayed Acknowledgement
+     * @param expectedCwnd Expected final m_cWnd value
+     * @param congControl Type of congestion control.
+     * @param desc The test description.
      */
     TcpLinuxRenoCongAvoidTest(uint32_t segmentSize,
                               uint32_t packetSize,
@@ -358,9 +358,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief TestSuite for the behavior of Linux Reno
+ * @brief TestSuite for the behavior of Linux Reno
  */
 class TcpLinuxRenoTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/tcp-loss-test.cc ns-3.44/src/internet/test/tcp-loss-test.cc
--- ns-3.43/src/internet/test/tcp-loss-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/tcp-loss-test.cc	2025-03-09 16:55:49.415371200 -0700
@@ -16,9 +16,9 @@
 NS_LOG_COMPONENT_DEFINE("TcpLossTestSuite");
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Check rollover of sequence number and how that affects loss recovery
+ * @brief Check rollover of sequence number and how that affects loss recovery
  *
  * This test checks that fast recovery is entered correctly even if it has
  * been a long time since the last recovery event.  Merge request !156
@@ -44,12 +44,12 @@
 {
   public:
     /**
-     * \brief Constructor
+     * @brief Constructor
      *
-     * \param firstLoss First packet number to force loss
-     * \param secondLoss Second packet number to force loss
-     * \param lastSegment Last packet number to transmit
-     * \param desc Description about the test
+     * @param firstLoss First packet number to force loss
+     * @param secondLoss Second packet number to force loss
+     * @param lastSegment Last packet number to transmit
+     * @param desc Description about the test
      */
     TcpLargeTransferLossTest(uint32_t firstLoss,
                              uint32_t secondLoss,
@@ -163,7 +163,7 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
  * Test various packet losses
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/tcp-lp-test.cc ns-3.44/src/internet/test/tcp-lp-test.cc
--- ns-3.43/src/internet/test/tcp-lp-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/tcp-lp-test.cc	2025-03-09 16:55:49.415371200 -0700
@@ -21,21 +21,21 @@
 NS_LOG_COMPONENT_DEFINE("TcpLpTestSuite");
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Testing the behaviour common to New Reno
+ * @brief Testing the behaviour common to New Reno
  */
 class TcpLpToNewReno : public TestCase
 {
   public:
     /**
      * Constructor
-     * \param cWnd Congestion window size
-     * \param segmentSize Segment size
-     * \param segmentsAcked Segments acked
-     * \param ssThresh Slow start threshold
-     * \param rtt RTT
-     * \param name Test case name
+     * @param cWnd Congestion window size
+     * @param segmentSize Segment size
+     * @param segmentsAcked Segments acked
+     * @param ssThresh Slow start threshold
+     * @param rtt RTT
+     * @param name Test case name
      */
     TcpLpToNewReno(uint32_t cWnd,
                    uint32_t segmentSize,
@@ -101,20 +101,20 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Testing TcpLp when cwd exceeds threshold
+ * @brief Testing TcpLp when cwd exceeds threshold
  */
 class TcpLpInferenceTest1 : public TestCase
 {
   public:
     /**
      * Constructor
-     * \param cWnd Congestion window size
-     * \param segmentSize Segment size
-     * \param segmentsAcked Segments acked
-     * \param rtt RTT
-     * \param name Test case name
+     * @param cWnd Congestion window size
+     * @param segmentSize Segment size
+     * @param segmentsAcked Segments acked
+     * @param rtt RTT
+     * @param name Test case name
      */
     TcpLpInferenceTest1(uint32_t cWnd,
                         uint32_t segmentSize,
@@ -170,20 +170,20 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Testing TcpLp when it is inference phase
+ * @brief Testing TcpLp when it is inference phase
  */
 class TcpLpInferenceTest2 : public TestCase
 {
   public:
     /**
      * Constructor
-     * \param cWnd Congestion window size
-     * \param segmentSize Segment size
-     * \param segmentsAcked Segments acked
-     * \param rtt RTT
-     * \param name Test case name
+     * @param cWnd Congestion window size
+     * @param segmentSize Segment size
+     * @param segmentsAcked Segments acked
+     * @param rtt RTT
+     * @param name Test case name
      */
     TcpLpInferenceTest2(uint32_t cWnd,
                         uint32_t segmentSize,
@@ -243,7 +243,7 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
  * Test the behaviour common to New Reno
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/tcp-option-test.cc ns-3.44/src/internet/test/tcp-option-test.cc
--- ns-3.43/src/internet/test/tcp-option-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/tcp-option-test.cc	2025-03-09 16:55:49.415371200 -0700
@@ -16,26 +16,26 @@
 using namespace ns3;
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief TCP Window Scaling option Test
+ * @brief TCP Window Scaling option Test
  */
 class TcpOptionWSTestCase : public TestCase
 {
   public:
     /**
-     * \brief Constructor.
-     * \param name Test description.
-     * \param scale Window scaling.
+     * @brief Constructor.
+     * @param name Test description.
+     * @param scale Window scaling.
      */
     TcpOptionWSTestCase(std::string name, uint8_t scale);
 
     /**
-     * \brief Serialization test.
+     * @brief Serialization test.
      */
     void TestSerialize();
     /**
-     * \brief Deserialization test.
+     * @brief Deserialization test.
      */
     void TestDeserialize();
 
@@ -94,25 +94,25 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief TCP TimeStamp option Test
+ * @brief TCP TimeStamp option Test
  */
 class TcpOptionTSTestCase : public TestCase
 {
   public:
     /**
-     * \brief Constructor.
-     * \param name Test description.
+     * @brief Constructor.
+     * @param name Test description.
      */
     TcpOptionTSTestCase(std::string name);
 
     /**
-     * \brief Serialization test.
+     * @brief Serialization test.
      */
     void TestSerialize();
     /**
-     * \brief Deserialization test.
+     * @brief Deserialization test.
      */
     void TestDeserialize();
 
@@ -184,9 +184,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief TCP options TestSuite
+ * @brief TCP options TestSuite
  */
 class TcpOptionTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/tcp-pacing-test.cc ns-3.44/src/internet/test/tcp-pacing-test.cc
--- ns-3.43/src/internet/test/tcp-pacing-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/tcp-pacing-test.cc	2025-03-09 16:55:49.415371200 -0700
@@ -18,9 +18,9 @@
 NS_LOG_COMPONENT_DEFINE("TcpPacingTestSuite");
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Test the behavior of TCP pacing
+ * @brief Test the behavior of TCP pacing
  *
  * This test checks that packets are paced at correct intervals.  The test
  * uses a shadow pacing rate calculation assumed to match the internal
@@ -79,17 +79,17 @@
 {
   public:
     /**
-     * \brief Constructor.
-     * \param segmentSize Segment size at the TCP layer (bytes).
-     * \param packetSize Size of packets sent at the application layer (bytes).
-     * \param packets Number of packets.
-     * \param pacingSsRatio Pacing Ratio during Slow Start (multiplied by 100)
-     * \param pacingCaRatio Pacing Ratio during Congestion Avoidance (multiplied by 100)
-     * \param ssThresh slow start threshold (bytes)
-     * \param paceInitialWindow whether to pace the initial window
-     * \param delAckMaxCount Delayed ACK max count parameter
-     * \param congControl Type of congestion control.
-     * \param desc The test description.
+     * @brief Constructor.
+     * @param segmentSize Segment size at the TCP layer (bytes).
+     * @param packetSize Size of packets sent at the application layer (bytes).
+     * @param packets Number of packets.
+     * @param pacingSsRatio Pacing Ratio during Slow Start (multiplied by 100)
+     * @param pacingCaRatio Pacing Ratio during Congestion Avoidance (multiplied by 100)
+     * @param ssThresh slow start threshold (bytes)
+     * @param paceInitialWindow whether to pace the initial window
+     * @param delAckMaxCount Delayed ACK max count parameter
+     * @param congControl Type of congestion control.
+     * @param desc The test description.
      */
     TcpPacingTest(uint32_t segmentSize,
                   uint32_t packetSize,
@@ -113,7 +113,7 @@
     void NormalClose(SocketWho who) override;
 
     /**
-     * \brief Update the expected interval at which next packet will be sent
+     * @brief Update the expected interval at which next packet will be sent
      */
     virtual void UpdateExpectedInterval();
 
@@ -174,11 +174,11 @@
       m_paceInitialWindow(paceInitialWindow),
       m_delAckMaxCount(delAckMaxCount),
       m_isConnAboutToEnd(false),
-      m_transmissionStartTime(Seconds(0)),
-      m_expectedInterval(Seconds(0)),
+      m_transmissionStartTime(),
+      m_expectedInterval(),
       m_packetsSent(0),
-      m_nextPacketInterval(Seconds(0)),
-      m_tracedRtt(Seconds(0))
+      m_nextPacketInterval(),
+      m_tracedRtt()
 {
     m_congControlTypeId = typeId;
 }
@@ -353,9 +353,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief TestSuite for the behavior of TCP pacing
+ * @brief TestSuite for the behavior of TCP pacing
  */
 class TcpPacingTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/tcp-pkts-acked-test.cc ns-3.44/src/internet/test/tcp-pkts-acked-test.cc
--- ns-3.43/src/internet/test/tcp-pkts-acked-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/tcp-pkts-acked-test.cc	2025-03-09 16:55:49.415371200 -0700
@@ -18,9 +18,9 @@
 class DummyCongControl;
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Check the number of times that PktsAcked is called
+ * @brief Check the number of times that PktsAcked is called
  *
  * Set a custom congestion control class, which calls PktsAckedCalled
  * each time the TCP implementation calls PktsAcked.
@@ -29,21 +29,21 @@
  * by segment size should be the same as the number of segments passed through
  * PktsAcked in the congestion control.
  *
- * \see DummyCongControl
- * \see FinalChecks
+ * @see DummyCongControl
+ * @see FinalChecks
  */
 class TcpPktsAckedOpenTest : public TcpGeneralTest
 {
   public:
     /**
-     * \brief Constructor.
-     * \param desc Test description.
+     * @brief Constructor.
+     * @param desc Test description.
      */
     TcpPktsAckedOpenTest(const std::string& desc);
 
     /**
-     * \brief Called when an ACK is received.
-     * \param segmentsAcked The segment ACKed.
+     * @brief Called when an ACK is received.
+     * @param segmentsAcked The segment ACKed.
      */
     void PktsAckedCalled(uint32_t segmentsAcked);
 
@@ -63,17 +63,17 @@
 };
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Behaves as NewReno, except that each time PktsAcked is called,
+ * @brief Behaves as NewReno, except that each time PktsAcked is called,
  * a notification is sent to TcpPktsAckedOpenTest.
  */
 class DummyCongControl : public TcpNewReno
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -82,8 +82,8 @@
     }
 
     /**
-     * \brief Set the callback to be used when an ACK is received.
-     * \param test The callback.
+     * @brief Set the callback to be used when an ACK is received.
+     * @param test The callback.
      */
     void SetCallback(Callback<void, uint32_t> test)
     {
@@ -159,9 +159,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief PktsAcked is calls TestSuite.
+ * @brief PktsAcked is calls TestSuite.
  */
 class TcpPktsAckedTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/tcp-prr-recovery-test.cc ns-3.44/src/internet/test/tcp-prr-recovery-test.cc
--- ns-3.43/src/internet/test/tcp-prr-recovery-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/tcp-prr-recovery-test.cc	2025-03-09 16:55:49.415371200 -0700
@@ -22,21 +22,21 @@
 NS_LOG_COMPONENT_DEFINE("TcpPrrRecoveryTestSuite");
 
 /**
- * \brief PRR Recovery algorithm test
+ * @brief PRR Recovery algorithm test
  */
 class PrrRecoveryTest : public TestCase
 {
   public:
     /**
-     * \brief Constructor.
-     * \param cWnd Congestion window.
-     * \param segmentSize Segment size.
-     * \param ssThresh Slow Start Threshold.
-     * \param unAckDataCount Unacknowledged data at the start of recovery.
-     * \param bytesInFlight Current bytes in flight.
-     * \param m_deliveredBytes Bytes SACKed on last acknowledgment.
-     * \param bytesSent Bytes sent while in recovery phase.
-     * \param name Test description.
+     * @brief Constructor.
+     * @param cWnd Congestion window.
+     * @param segmentSize Segment size.
+     * @param ssThresh Slow Start Threshold.
+     * @param unAckDataCount Unacknowledged data at the start of recovery.
+     * @param bytesInFlight Current bytes in flight.
+     * @param m_deliveredBytes Bytes SACKed on last acknowledgment.
+     * @param bytesSent Bytes sent while in recovery phase.
+     * @param name Test description.
      */
     PrrRecoveryTest(uint32_t cWnd,
                     uint32_t segmentSize,
@@ -127,9 +127,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief PRR Recovery TestSuite
+ * @brief PRR Recovery TestSuite
  */
 class PrrRecoveryTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/tcp-rate-ops-test.cc ns-3.44/src/internet/test/tcp-rate-ops-test.cc
--- ns-3.43/src/internet/test/tcp-rate-ops-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/tcp-rate-ops-test.cc	2025-03-09 16:55:49.415371200 -0700
@@ -25,21 +25,21 @@
 class MimicCongControl;
 
 /**
- * \ingroup internet-test
- * \ingroup tests
+ * @ingroup internet-test
+ * @ingroup tests
  *
- * \brief The TcpRateLinux Basic Test
+ * @brief The TcpRateLinux Basic Test
  */
 class TcpRateLinuxBasicTest : public TestCase
 {
   public:
     /**
      * Constructor
-     * \param cWnd Congestion window size
-     * \param tailSeq Tail sequence number
-     * \param nextTx Tx next sequence number
-     * \param testCase test case type
-     * \param testName test name
+     * @param cWnd Congestion window size
+     * @param tailSeq Tail sequence number
+     * @param nextTx Tx next sequence number
+     * @param testCase test case type
+     * @param testName test name
      */
     TcpRateLinuxBasicTest(uint32_t cWnd,
                           SequenceNumber32 tailSeq,
@@ -52,12 +52,12 @@
 
     /**
      * Send an application packet
-     * \param skb the data to send
+     * @param skb the data to send
      */
     void SendSkb(TcpTxItem* skb);
     /**
      * Deliver an application packet
-     * \param skb the data to deliver
+     * @param skb the data to deliver
      */
     void SkbDelivered(TcpTxItem* skb);
 
@@ -83,7 +83,7 @@
       m_inFlight(0),
       m_segmentSize(1),
       m_delivered(0),
-      m_deliveredTime(Seconds(0)),
+      m_deliveredTime(),
       m_tailSeq(tailSeq),
       m_nextTx(nextTx),
       m_testCase(testCase)
@@ -96,15 +96,12 @@
     for (uint8_t i = 0; i < 100; ++i)
     {
         m_skbs.push_back(new TcpTxItem());
-        Simulator::Schedule(Time(Seconds(i * 0.01)),
-                            &TcpRateLinuxBasicTest::SendSkb,
-                            this,
-                            m_skbs[i]);
+        Simulator::Schedule(Seconds(i * 0.01), &TcpRateLinuxBasicTest::SendSkb, this, m_skbs[i]);
     }
 
     for (uint8_t i = 0; i < 100; ++i)
     {
-        Simulator::Schedule(Time(Seconds((i + 1) * 0.1)),
+        Simulator::Schedule(Seconds((i + 1) * 0.1),
                             &TcpRateLinuxBasicTest::SkbDelivered,
                             this,
                             m_skbs[i]);
@@ -172,16 +169,16 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Behaves as NewReno except HasCongControl returns true
+ * @brief Behaves as NewReno except HasCongControl returns true
  */
 class MimicCongControl : public TcpNewReno
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -206,10 +203,10 @@
 }
 
 /**
- * \ingroup internet-test
- * \ingroup tests
+ * @ingroup internet-test
+ * @ingroup tests
  *
- * \brief The TcpRateLinux Test uses sender-receiver model to test its functionality.
+ * @brief The TcpRateLinux Test uses sender-receiver model to test its functionality.
  *        This test case uses the bytes inflight trace to check whether rate sample
  *        correctly sets the value of m_deliveredTime and m_firstSentTime. This is
  *        done using rate trace. Further, Using Rx trace, m_isDupAck is maintained to
@@ -220,10 +217,10 @@
 {
   public:
     /**
-     * \brief Constructor.
-     * \param desc Description.
-     * \param sackEnabled To use SACK or not
-     * \param toDrop Packets to drop.
+     * @brief Constructor.
+     * @param desc Description.
+     * @param sackEnabled To use SACK or not
+     * @param toDrop Packets to drop.
      */
     TcpRateLinuxWithSocketsTest(const std::string& desc,
                                 bool sackEnabled,
@@ -231,60 +228,60 @@
 
   protected:
     /**
-     * \brief Create and install the socket to install on the sender
-     * \param node sender node pointer
-     * \return the socket to be installed in the sender
+     * @brief Create and install the socket to install on the sender
+     * @param node sender node pointer
+     * @return the socket to be installed in the sender
      */
     Ptr<TcpSocketMsgBase> CreateSenderSocket(Ptr<Node> node) override;
 
     /**
-     * \brief Create a receiver error model.
-     * \returns The receiver error model.
+     * @brief Create a receiver error model.
+     * @returns The receiver error model.
      */
     Ptr<ErrorModel> CreateReceiverErrorModel() override;
 
     /**
-     * \brief Receive a packet.
-     * \param p The packet.
-     * \param h The TCP header.
-     * \param who Who the socket belongs to (sender or receiver).
+     * @brief Receive a packet.
+     * @param p The packet.
+     * @param h The TCP header.
+     * @param who Who the socket belongs to (sender or receiver).
      */
     void Rx(const Ptr<const Packet> p, const TcpHeader& h, SocketWho who) override;
 
     /**
-     * \brief Track the bytes in flight.
-     * \param oldValue previous value.
-     * \param newValue actual value.
+     * @brief Track the bytes in flight.
+     * @param oldValue previous value.
+     * @param newValue actual value.
      */
     void BytesInFlightTrace(uint32_t oldValue, uint32_t newValue) override;
 
     /**
-     * \brief Called when a packet is dropped.
-     * \param ipH The IP header.
-     * \param tcpH The TCP header.
-     * \param p The packet.
+     * @brief Called when a packet is dropped.
+     * @param ipH The IP header.
+     * @param tcpH The TCP header.
+     * @param p The packet.
      */
     void PktDropped(const Ipv4Header& ipH, const TcpHeader& tcpH, Ptr<const Packet> p);
 
     /**
-     * \brief Configure the test.
+     * @brief Configure the test.
      */
     void ConfigureEnvironment() override;
 
     /**
-     * \brief Do the final checks.
+     * @brief Do the final checks.
      */
     void FinalChecks() override;
 
     /**
-     * \brief Track the rate value of TcpRateLinux.
-     * \param rate updated value of TcpRate.
+     * @brief Track the rate value of TcpRateLinux.
+     * @param rate updated value of TcpRate.
      */
     void RateUpdatedTrace(const TcpRateLinux::TcpRateConnection& rate) override;
 
     /**
-     * \brief Track the rate sample value of TcpRateLinux.
-     * \param sample updated value of TcpRateSample.
+     * @brief Track the rate sample value of TcpRateLinux.
+     * @param sample updated value of TcpRateSample.
      */
     void RateSampleUpdatedTrace(const TcpRateLinux::TcpRateSample& sample) override;
 
@@ -323,7 +320,7 @@
     TcpGeneralTest::ConfigureEnvironment();
     SetAppPktCount(300);
     SetPropagationDelay(MilliSeconds(50));
-    SetTransmitStart(Seconds(2.0));
+    SetTransmitStart(Seconds(2));
 
     Config::SetDefault("ns3::TcpSocketBase::Sack", BooleanValue(m_sackEnabled));
 }
@@ -424,19 +421,19 @@
 }
 
 /**
- * \ingroup internet-test
- * \ingroup tests
+ * @ingroup internet-test
+ * @ingroup tests
  *
- * \brief The TcpRateLinuxWithBufferTest tests rate sample functionality with arbitrary SACK
+ * @brief The TcpRateLinuxWithBufferTest tests rate sample functionality with arbitrary SACK
  * scenario. Check the value of delivered against a home-made guess
  */
 class TcpRateLinuxWithBufferTest : public TestCase
 {
   public:
     /**
-     * \brief Constructor.
-     * \param segmentSize Segment size to use.
-     * \param desc Description.
+     * @brief Constructor.
+     * @param segmentSize Segment size to use.
+     * @param desc Description.
      */
     TcpRateLinuxWithBufferTest(uint32_t segmentSize, std::string desc);
 
@@ -445,21 +442,21 @@
     void DoTeardown() override;
 
     /**
-     * \brief Track the rate value of TcpRateLinux.
-     * \param rate updated value of TcpRate.
+     * @brief Track the rate value of TcpRateLinux.
+     * @param rate updated value of TcpRate.
      */
     virtual void RateUpdatedTrace(const TcpRateLinux::TcpRateConnection& rate);
 
     /**
-     * \brief Track the rate sample value of TcpRateLinux.
-     * \param sample updated value of TcpRateSample.
+     * @brief Track the rate sample value of TcpRateLinux.
+     * @param sample updated value of TcpRateSample.
      */
     virtual void RateSampleUpdatedTrace(const TcpRateLinux::TcpRateSample& sample);
 
-    /** \brief Test with acks without drop */
+    /** @brief Test with acks without drop */
     void TestWithStraightAcks();
 
-    /** \brief Test with arbitrary SACK scenario */
+    /** @brief Test with arbitrary SACK scenario */
     void TestWithSackBlocks();
 
     uint32_t m_expectedDelivered{0};   //!< Amount of expected delivered data
@@ -485,7 +482,7 @@
 void
 TcpRateLinuxWithBufferTest::DoRun()
 {
-    Simulator::Schedule(Seconds(0.0), &TcpRateLinuxWithBufferTest::TestWithSackBlocks, this);
+    Simulator::Schedule(Seconds(0), &TcpRateLinuxWithBufferTest::TestWithSackBlocks, this);
     Simulator::Run();
     Simulator::Destroy();
 }
@@ -582,9 +579,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief the TestSuite for the TcpRateLinux test case
+ * @brief the TestSuite for the TcpRateLinux test case
  */
 class TcpRateOpsTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/tcp-rto-test.cc ns-3.44/src/internet/test/tcp-rto-test.cc
--- ns-3.43/src/internet/test/tcp-rto-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/tcp-rto-test.cc	2025-03-09 16:55:49.415371200 -0700
@@ -18,9 +18,9 @@
 using namespace ns3;
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Testing the moments after an RTO expiration
+ * @brief Testing the moments after an RTO expiration
  *
  * The scope of this test is to be sure that, after an RTO expiration,
  * the TCP implementation set the correct state in the ACK state machine,
@@ -33,9 +33,9 @@
 {
   public:
     /**
-     * \brief Constructor.
-     * \param congControl Congestion control type.
-     * \param msg Test description.
+     * @brief Constructor.
+     * @param congControl Congestion control type.
+     * @param msg Test description.
      */
     TcpRtoTest(const TypeId& congControl, const std::string& msg);
 
@@ -154,9 +154,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Testing the ssthresh behavior after the RTO expires
+ * @brief Testing the ssthresh behavior after the RTO expires
  *
  * The scope of this test is to be sure that, after an RTO expiration,
  * the TCP implementation sets the correct ssthresh value
@@ -166,11 +166,11 @@
 {
   public:
     /**
-     * \brief Constructor.
-     * \param congControl congestion control type
-     * \param seqToDrop sequence number to drop
-     * \param minRto minimum RTO
-     * \param msg test description
+     * @brief Constructor.
+     * @param congControl congestion control type
+     * @param seqToDrop sequence number to drop
+     * @param minRto minimum RTO
+     * @param msg test description
      */
     TcpSsThreshRtoTest(const TypeId& congControl,
                        uint32_t seqToDrop,
@@ -188,10 +188,10 @@
     void ConfigureEnvironment() override;
 
     /**
-     * \brief Called when a packet has been dropped.
-     * \param ipH IPv4 header.
-     * \param tcpH TCP header.
-     * \param p The packet.
+     * @brief Called when a packet has been dropped.
+     * @param ipH IPv4 header.
+     * @param tcpH TCP header.
+     * @param p The packet.
      */
     void PktDropped(const Ipv4Header& ipH, const TcpHeader& tcpH, Ptr<const Packet> p);
 
@@ -300,9 +300,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Testing the timing of RTO
+ * @brief Testing the timing of RTO
  *
  * Checking if RTO is doubled ONLY after a retransmission.
  */
@@ -310,9 +310,9 @@
 {
   public:
     /**
-     * \brief Constructor.
-     * \param congControl Congestion control type.
-     * \param msg Test description.
+     * @brief Constructor.
+     * @param congControl Congestion control type.
+     * @param msg Test description.
      */
     TcpTimeRtoTest(const TypeId& congControl, const std::string& msg);
 
@@ -327,10 +327,10 @@
     void ConfigureEnvironment() override;
 
     /**
-     * \brief Called when a packet has been dropped.
-     * \param ipH IPv4 header.
-     * \param tcpH TCP header.
-     * \param p The packet.
+     * @brief Called when a packet has been dropped.
+     * @param ipH IPv4 header.
+     * @param tcpH TCP header.
+     * @param p The packet.
      */
     void PktDropped(const Ipv4Header& ipH, const TcpHeader& tcpH, Ptr<const Packet> p);
 
@@ -495,9 +495,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief TCP RTO TestSuite
+ * @brief TCP RTO TestSuite
  */
 class TcpRtoTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/tcp-rtt-estimation.cc ns-3.44/src/internet/test/tcp-rtt-estimation.cc
--- ns-3.43/src/internet/test/tcp-rtt-estimation.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/tcp-rtt-estimation.cc	2025-03-09 16:55:49.415371200 -0700
@@ -17,9 +17,9 @@
 NS_LOG_COMPONENT_DEFINE("TcpRttEstimationTestSuite");
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Check Rtt calculations
+ * @brief Check Rtt calculations
  *
  * First check is that, for each ACK, we have a valid estimation of the RTT.
  * The second check is that, when updating RTT history, we should consider
@@ -30,10 +30,10 @@
 {
   public:
     /**
-     * \brief Constructor.
-     * \param desc Test description.
-     * \param enableTs Enable TimeStamp option.
-     * \param pktCount Packet number.
+     * @brief Constructor.
+     * @param desc Test description.
+     * @param enableTs Enable TimeStamp option.
+     * @param pktCount Packet number.
      */
     TcpRttEstimationTest(const std::string& desc, bool enableTs, uint32_t pktCount);
 
@@ -78,7 +78,7 @@
     TcpGeneralTest::ConfigureEnvironment();
     SetAppPktCount(m_pktCount);
     SetPropagationDelay(MilliSeconds(50));
-    SetTransmitStart(Seconds(2.0));
+    SetTransmitStart(Seconds(2));
     SetMTU(500);
 }
 
@@ -179,21 +179,21 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Check Rtt calculations with packet losses.
+ * @brief Check Rtt calculations with packet losses.
  *
- * \see TcpRttEstimationTest
+ * @see TcpRttEstimationTest
  */
 class TcpRttEstimationWithLossTest : public TcpRttEstimationTest
 {
   public:
     /**
-     * \brief Constructor.
-     * \param desc Test description.
-     * \param enableTs Enable TimeStamp option.
-     * \param pktCount Packet number.
-     * \param toDrop List of packet to drop.
+     * @brief Constructor.
+     * @param desc Test description.
+     * @param enableTs Enable TimeStamp option.
+     * @param pktCount Packet number.
+     * @param toDrop List of packet to drop.
      */
     TcpRttEstimationWithLossTest(const std::string& desc,
                                  bool enableTs,
@@ -230,9 +230,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief TCP RTT estimation TestSuite
+ * @brief TCP RTT estimation TestSuite
  */
 class TcpRttEstimationTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/tcp-rx-buffer-test.cc ns-3.44/src/internet/test/tcp-rx-buffer-test.cc
--- ns-3.43/src/internet/test/tcp-rx-buffer-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/tcp-rx-buffer-test.cc	2025-03-09 16:55:49.415371200 -0700
@@ -13,10 +13,10 @@
 NS_LOG_COMPONENT_DEFINE("TcpRxBufferTestSuite");
 
 /**
- * \ingroup internet-test
- * \ingroup tests
+ * @ingroup internet-test
+ * @ingroup tests
  *
- * \brief The TcpRxBuffer Test
+ * @brief The TcpRxBuffer Test
  */
 class TcpRxBufferTestCase : public TestCase
 {
@@ -28,7 +28,7 @@
     void DoTeardown() override;
 
     /**
-     * \brief Test the SACK list update.
+     * @brief Test the SACK list update.
      */
     void TestUpdateSACKList();
 };
@@ -283,9 +283,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief the TestSuite for the TcpRxBuffer test case
+ * @brief the TestSuite for the TcpRxBuffer test case
  */
 class TcpRxBufferTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/tcp-sack-permitted-test.cc ns-3.44/src/internet/test/tcp-sack-permitted-test.cc
--- ns-3.43/src/internet/test/tcp-sack-permitted-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/tcp-sack-permitted-test.cc	2025-03-09 16:55:49.415371200 -0700
@@ -17,15 +17,15 @@
 NS_LOG_COMPONENT_DEFINE("SackPermittedTestSuite");
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Test case for checking the SACK-PERMITTED option.
+ * @brief Test case for checking the SACK-PERMITTED option.
  *
  */
 class SackPermittedTestCase : public TcpGeneralTest
 {
   public:
-    /** \brief Configuration of the test */
+    /** @brief Configuration of the test */
     enum Configuration
     {
         DISABLED,
@@ -35,8 +35,8 @@
     };
 
     /**
-     * \brief Constructor
-     * \param conf Test configuration.
+     * @brief Constructor
+     * @param conf Test configuration.
      * */
     SackPermittedTestCase(SackPermittedTestCase::Configuration conf);
 
@@ -186,15 +186,15 @@
 }
 
 /**
- * \ingroup internet-test
- * \ingroup tests
+ * @ingroup internet-test
+ * @ingroup tests
  *
  * The test case for testing the TCP SACK PERMITTED option.
  */
 class TcpSackPermittedTestSuite : public TestSuite
 {
   public:
-    /** \brief Constructor */
+    /** @brief Constructor */
     TcpSackPermittedTestSuite()
         : TestSuite("tcp-sack-permitted", Type::UNIT)
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/tcp-scalable-test.cc ns-3.44/src/internet/test/tcp-scalable-test.cc
--- ns-3.43/src/internet/test/tcp-scalable-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/tcp-scalable-test.cc	2025-03-09 16:55:49.415371200 -0700
@@ -24,19 +24,19 @@
 NS_LOG_COMPONENT_DEFINE("TcpScalableTestSuite");
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Testing the congestion avoidance increment on TcpScalable
+ * @brief Testing the congestion avoidance increment on TcpScalable
  */
 class TcpScalableIncrementTest : public TestCase
 {
   public:
     /**
-     * \brief Constructor.
-     * \param cWnd Congestion window.
-     * \param segmentSize Segment size.
-     * \param segmentsAcked Segments ACKed.
-     * \param name Test description.
+     * @brief Constructor.
+     * @param cWnd Congestion window.
+     * @param segmentSize Segment size.
+     * @param segmentsAcked Segments ACKed.
+     * @param name Test description.
      */
     TcpScalableIncrementTest(uint32_t cWnd,
                              uint32_t segmentSize,
@@ -93,18 +93,18 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Testing the multiplicative decrease on TcpScalable
+ * @brief Testing the multiplicative decrease on TcpScalable
  */
 class TcpScalableDecrementTest : public TestCase
 {
   public:
     /**
-     * \brief Constructor.
-     * \param cWnd Congestion window.
-     * \param segmentSize Segment size.
-     * \param name Test description.
+     * @brief Constructor.
+     * @param cWnd Congestion window.
+     * @param segmentSize Segment size.
+     * @param name Test description.
      */
     TcpScalableDecrementTest(uint32_t cWnd, uint32_t segmentSize, const std::string& name);
 
@@ -151,9 +151,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief TcpScalable TestSuite.
+ * @brief TcpScalable TestSuite.
  */
 class TcpScalableTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/tcp-slow-start-test.cc ns-3.44/src/internet/test/tcp-slow-start-test.cc
--- ns-3.43/src/internet/test/tcp-slow-start-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/tcp-slow-start-test.cc	2025-03-09 16:55:49.415371200 -0700
@@ -18,9 +18,9 @@
 NS_LOG_COMPONENT_DEFINE("TcpSlowStartTest");
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Test the normal behavior for slow start
+ * @brief Test the normal behavior for slow start
  *
  * As method for checking the slow start, a callback is attached to the
  * congestion window. With the knowledge of the number of segments, we can calculate
@@ -29,19 +29,19 @@
  *
  * Check what is done inside CWndTrace.
  *
- * \see CWndTrace
+ * @see CWndTrace
  */
 class TcpSlowStartNormalTest : public TcpGeneralTest
 {
   public:
     /**
-     * \brief Constructor.
-     * \param segmentSize Segment size.
-     * \param packetSize Packet size.
-     * \param initSsTh Initial SlowStart threshold.
-     * \param packets Packet counter.
-     * \param congControl Congestion control.
-     * \param desc Test description.
+     * @brief Constructor.
+     * @param segmentSize Segment size.
+     * @param packetSize Packet size.
+     * @param initSsTh Initial SlowStart threshold.
+     * @param packets Packet counter.
+     * @param congControl Congestion control.
+     * @param desc Test description.
      */
     TcpSlowStartNormalTest(uint32_t segmentSize,
                            uint32_t packetSize,
@@ -122,15 +122,15 @@
 }
 
 /**
- * \brief Trace the cWnd over the slow start
+ * @brief Trace the cWnd over the slow start
  *
  * This method is called each time the cWnd changes. It should be updated only
  * by MSS bytes at time. Since the size doubles each RTT, a timing test is also
  * performed: the doubling should be made in 0.5s from the first (0.5s is
  * the delay of the SimpleChannel which connect the two socket).
  *
- * \param oldValue old value of cWnd
- * \param newValue new value of cWnd
+ * @param oldValue old value of cWnd
+ * @param newValue new value of cWnd
  */
 void
 TcpSlowStartNormalTest::CWndTrace(uint32_t oldValue, uint32_t newValue)
@@ -195,9 +195,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief A slow start test using a socket which sends smaller ACKs
+ * @brief A slow start test using a socket which sends smaller ACKs
  *
  * The same test are performed over a connection where, on one side, there is
  * a malicious socket which sends smaller ACKs than the segment received.
@@ -208,13 +208,13 @@
 {
   public:
     /**
-     * \brief Constructor.
-     * \param segmentSize Segment size.
-     * \param packetSize Packet size.
-     * \param initSsTh Initial SlowStart threshold.
-     * \param packets Packet counter.
-     * \param congControl Congestion control.
-     * \param desc Test description.
+     * @brief Constructor.
+     * @param segmentSize Segment size.
+     * @param packetSize Packet size.
+     * @param initSsTh Initial SlowStart threshold.
+     * @param packets Packet counter.
+     * @param congControl Congestion control.
+     * @param desc Test description.
      */
     TcpSlowStartAttackerTest(uint32_t segmentSize,
                              uint32_t packetSize,
@@ -248,9 +248,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief TCP Slow Start TestSuite.
+ * @brief TCP Slow Start TestSuite.
  */
 class TcpSlowStartTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/tcp-syn-connection-failed-test.cc ns-3.44/src/internet/test/tcp-syn-connection-failed-test.cc
--- ns-3.43/src/internet/test/tcp-syn-connection-failed-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/tcp-syn-connection-failed-test.cc	2025-03-09 16:55:49.415371200 -0700
@@ -15,9 +15,9 @@
 using namespace ns3;
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Test that connection failed callback is called when
+ * @brief Test that connection failed callback is called when
  * SYN retransmission number is exceeded.
  */
 class TcpSynConnectionFailedTest : public TestCase
@@ -25,14 +25,14 @@
   public:
     /**
      * Constructor.
-     * \param desc Test description.
-     * \param useEcn Whether to enable ECN.
+     * @param desc Test description.
+     * @param useEcn Whether to enable ECN.
      */
     TcpSynConnectionFailedTest(std::string desc, bool useEcn);
 
     /**
-     * \brief Handle a connection failure.
-     * \param socket The receiving socket.
+     * @brief Handle a connection failure.
+     * @param socket The receiving socket.
      */
     void HandleConnectionFailed(Ptr<Socket> socket);
     void DoRun() override;
@@ -83,9 +83,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief TestSuite
+ * @brief TestSuite
  */
 class TcpSynConnectionFailedTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/tcp-test.cc ns-3.44/src/internet/test/tcp-test.cc
--- ns-3.43/src/internet/test/tcp-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/tcp-test.cc	2025-03-09 16:55:49.415371200 -0700
@@ -40,21 +40,21 @@
 NS_LOG_COMPONENT_DEFINE("TcpTestSuite");
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief TCP Test - send string data from client to server and back.
+ * @brief TCP Test - send string data from client to server and back.
  */
 class TcpTestCase : public TestCase
 {
   public:
     /**
-     * \brief Constructor.
-     * \param totalStreamSize Total stream size (in bytes).
-     * \param sourceWriteSize Client data size when sending.
-     * \param sourceReadSize Client data size when receiving.
-     * \param serverWriteSize Server data size when sending.
-     * \param serverReadSize Server data size when receiving.
-     * \param useIpv6 Use IPv6 instead of IPv4.
+     * @brief Constructor.
+     * @param totalStreamSize Total stream size (in bytes).
+     * @param sourceWriteSize Client data size when sending.
+     * @param sourceReadSize Client data size when receiving.
+     * @param serverWriteSize Server data size when sending.
+     * @param serverReadSize Server data size when receiving.
+     * @param useIpv6 Use IPv6 instead of IPv4.
      */
     TcpTestCase(uint32_t totalStreamSize,
                 uint32_t sourceWriteSize,
@@ -68,70 +68,70 @@
     void DoTeardown() override;
 
     /**
-     * \brief Setup the test (IPv4 version).
+     * @brief Setup the test (IPv4 version).
      */
     void SetupDefaultSim();
     /**
-     * \brief Setup the test (IPv6 version).
+     * @brief Setup the test (IPv6 version).
      */
     void SetupDefaultSim6();
 
     /**
-     * \brief Create a node with the Internet stack (IPv4 version).
-     * \returns The new node.
+     * @brief Create a node with the Internet stack (IPv4 version).
+     * @returns The new node.
      */
     Ptr<Node> CreateInternetNode();
     /**
-     * \brief Create a node with the Internet stack (IPv6 version).
-     * \returns The new node.
+     * @brief Create a node with the Internet stack (IPv6 version).
+     * @returns The new node.
      */
     Ptr<Node> CreateInternetNode6();
 
     /**
-     * \brief Add a SimpleNetDevice to a node (IPv4 version).
-     * \param node The target node.
-     * \param ipaddr the SimpleNetDevice IPv4 address.
-     * \param netmask the SimpleNetDevice IPv4 address netmask.
-     * \returns The new SimpleNetDevice.
+     * @brief Add a SimpleNetDevice to a node (IPv4 version).
+     * @param node The target node.
+     * @param ipaddr the SimpleNetDevice IPv4 address.
+     * @param netmask the SimpleNetDevice IPv4 address netmask.
+     * @returns The new SimpleNetDevice.
      */
     Ptr<SimpleNetDevice> AddSimpleNetDevice(Ptr<Node> node,
                                             const char* ipaddr,
                                             const char* netmask);
     /**
-     * \brief Add a SimpleNetDevice to a node (IPv6 version).
-     * \param node The target node.
-     * \param ipaddr the SimpleNetDevice IPv6 address.
-     * \param prefix the SimpleNetDevice IP6 address prefix.
-     * \returns The new SimpleNetDevice.
+     * @brief Add a SimpleNetDevice to a node (IPv6 version).
+     * @param node The target node.
+     * @param ipaddr the SimpleNetDevice IPv6 address.
+     * @param prefix the SimpleNetDevice IP6 address prefix.
+     * @returns The new SimpleNetDevice.
      */
     Ptr<SimpleNetDevice> AddSimpleNetDevice6(Ptr<Node> node, Ipv6Address ipaddr, Ipv6Prefix prefix);
 
     /**
-     * \brief Server: Handle connection created.
-     * \param s The socket.
-     * \param addr The other party address.
+     * @brief Server: Handle connection created.
+     * @param s The socket.
+     * @param addr The other party address.
      */
     void ServerHandleConnectionCreated(Ptr<Socket> s, const Address& addr);
     /**
-     * \brief Server: Receive data.
-     * \param sock The socket.
+     * @brief Server: Receive data.
+     * @param sock The socket.
      */
     void ServerHandleRecv(Ptr<Socket> sock);
     /**
-     * \brief Server: Send data.
-     * \param sock The socket.
-     * \param available Unused in the test.
+     * @brief Server: Send data.
+     * @param sock The socket.
+     * @param available Unused in the test.
      */
     void ServerHandleSend(Ptr<Socket> sock, uint32_t available);
     /**
-     * \brief Client: Send data.
-     * \param sock The socket.
-     * \param available Unused in the test.
+     * @brief Client: Send data.
+     * @param sock The socket.
+     * @param available Unused in the test.
      */
     void SourceHandleSend(Ptr<Socket> sock, uint32_t available);
     /**
-     * \brief Client: Receive data.
-     * \param sock The socket.
+     * @brief Client: Receive data.
+     * @param sock The socket.
      */
     void SourceHandleRecv(Ptr<Socket> sock);
 
@@ -524,9 +524,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief TCP TestSuite - send string data from client to server and back.
+ * @brief TCP TestSuite - send string data from client to server and back.
  */
 class TcpTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/tcp-timestamp-test.cc ns-3.44/src/internet/test/tcp-timestamp-test.cc
--- ns-3.43/src/internet/test/tcp-timestamp-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/tcp-timestamp-test.cc	2025-03-09 16:55:49.415371200 -0700
@@ -17,9 +17,9 @@
 NS_LOG_COMPONENT_DEFINE("TimestampTestSuite");
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief TCP TimeStamp enabling Test.
+ * @brief TCP TimeStamp enabling Test.
  */
 class TimestampTestCase : public TcpGeneralTest
 {
@@ -36,8 +36,8 @@
     };
 
     /**
-     * \brief Constructor.
-     * \param conf Test configuration.
+     * @brief Constructor.
+     * @param conf Test configuration.
      */
     TimestampTestCase(TimestampTestCase::Configuration conf);
 
@@ -191,18 +191,18 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief TCP TimeStamp values Test.
+ * @brief TCP TimeStamp values Test.
  */
 class TimestampValueTestCase : public TestCase
 {
   public:
     /**
-     * \brief Constructor.
-     * \param startTime Start time (Seconds).
-     * \param timeToWait Time to wait (Seconds).
-     * \param name Test description.
+     * @brief Constructor.
+     * @param startTime Start time (Seconds).
+     * @param timeToWait Time to wait (Seconds).
+     * @param name Test description.
      */
     TimestampValueTestCase(double startTime, double timeToWait, std::string name);
 
@@ -211,11 +211,11 @@
     void DoTeardown() override;
 
     /**
-     * \brief Perform the test checks.
+     * @brief Perform the test checks.
      */
     void Check();
     /**
-     * \brief Test initialization.
+     * @brief Test initialization.
      */
     void Init();
 
@@ -271,9 +271,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief TCP TimeStamp TestSuite.
+ * @brief TCP TimeStamp TestSuite.
  */
 class TcpTimestampTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/tcp-tx-buffer-test.cc ns-3.44/src/internet/test/tcp-tx-buffer-test.cc
--- ns-3.43/src/internet/test/tcp-tx-buffer-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/tcp-tx-buffer-test.cc	2025-03-09 16:55:49.415371200 -0700
@@ -16,35 +16,35 @@
 NS_LOG_COMPONENT_DEFINE("TcpTxBufferTestSuite");
 
 /**
- * \ingroup internet-test
- * \ingroup tests
+ * @ingroup internet-test
+ * @ingroup tests
  *
- * \brief The TcpTxBuffer Test
+ * @brief The TcpTxBuffer Test
  */
 class TcpTxBufferTestCase : public TestCase
 {
   public:
-    /** \brief Constructor */
+    /** @brief Constructor */
     TcpTxBufferTestCase();
 
   private:
     void DoRun() override;
     void DoTeardown() override;
 
-    /** \brief Test if a segment is really set as lost */
+    /** @brief Test if a segment is really set as lost */
     void TestIsLost();
-    /** \brief Test the generation of an unsent block */
+    /** @brief Test the generation of an unsent block */
     void TestNewBlock();
-    /** \brief Test the generation of a previously sent block */
+    /** @brief Test the generation of a previously sent block */
     void TestTransmittedBlock();
-    /** \brief Test the generation of the "next" block */
+    /** @brief Test the generation of the "next" block */
     void TestNextSeg();
-    /** \brief Test the logic of merging items in GetTransmittedSegment()
+    /** @brief Test the logic of merging items in GetTransmittedSegment()
      * which is triggered by CopyFromSequence()*/
     void TestMergeItemsWhenGetTransmittedSegment();
     /**
-     * \brief Callback to provide a value of receiver window
-     * \returns the receiver window size
+     * @brief Callback to provide a value of receiver window
+     * @returns the receiver window size
      */
     uint32_t GetRWnd() const;
 };
@@ -57,14 +57,14 @@
 void
 TcpTxBufferTestCase::DoRun()
 {
-    Simulator::Schedule(Seconds(0.0), &TcpTxBufferTestCase::TestIsLost, this);
+    Simulator::Schedule(Seconds(0), &TcpTxBufferTestCase::TestIsLost, this);
     /*
      * Cases for new block:
      * -> is exactly the same as stored
      * -> starts over the boundary, but ends earlier
      * -> starts over the boundary, but ends after
      */
-    Simulator::Schedule(Seconds(0.0), &TcpTxBufferTestCase::TestNewBlock, this);
+    Simulator::Schedule(Seconds(0), &TcpTxBufferTestCase::TestNewBlock, this);
 
     /*
      * Cases for transmitted block:
@@ -75,8 +75,8 @@
      * -> starts inside a packet, ends earlier in the same packet
      * -> starts inside a packet, ends in another packet
      */
-    Simulator::Schedule(Seconds(0.0), &TcpTxBufferTestCase::TestTransmittedBlock, this);
-    Simulator::Schedule(Seconds(0.0), &TcpTxBufferTestCase::TestNextSeg, this);
+    Simulator::Schedule(Seconds(0), &TcpTxBufferTestCase::TestTransmittedBlock, this);
+    Simulator::Schedule(Seconds(0), &TcpTxBufferTestCase::TestNextSeg, this);
 
     /*
      * Case for transmitted block:
@@ -85,7 +85,7 @@
      *  -> during retransmission, the sender tries to send a full segment but it
      *     should stop to merge items when they have different values for m_lost.
      */
-    Simulator::Schedule(Seconds(0.0),
+    Simulator::Schedule(Seconds(0),
                         &TcpTxBufferTestCase::TestMergeItemsWhenGetTransmittedSegment,
                         this);
 
@@ -420,9 +420,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief the TestSuite for the TcpTxBuffer test case
+ * @brief the TestSuite for the TcpTxBuffer test case
  */
 class TcpTxBufferTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/tcp-vegas-test.cc ns-3.44/src/internet/test/tcp-vegas-test.cc
--- ns-3.43/src/internet/test/tcp-vegas-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/tcp-vegas-test.cc	2025-03-09 16:55:49.415371200 -0700
@@ -23,21 +23,21 @@
 NS_LOG_COMPONENT_DEFINE("TcpVegasTestSuite");
 
 /**
- * \brief TcpVegas congestion control algorithm test
+ * @brief TcpVegas congestion control algorithm test
  */
 class TcpVegasTest : public TestCase
 {
   public:
     /**
-     * \brief Constructor.
-     * \param cWnd Congestion window.
-     * \param segmentSize Segment size.
-     * \param ssThresh Slow Start Threshold.
-     * \param rtt The RTT.
-     * \param segmentsAcked Number of segments ACKed.
-     * \param nextTxSeq Next Tx sequence number.
-     * \param lastAckedSeq Last ACKed sequence number.
-     * \param name Test description.
+     * @brief Constructor.
+     * @param cWnd Congestion window.
+     * @param segmentSize Segment size.
+     * @param ssThresh Slow Start Threshold.
+     * @param rtt The RTT.
+     * @param segmentsAcked Number of segments ACKed.
+     * @param nextTxSeq Next Tx sequence number.
+     * @param lastAckedSeq Last ACKed sequence number.
+     * @param name Test description.
      */
     TcpVegasTest(uint32_t cWnd,
                  uint32_t segmentSize,
@@ -51,13 +51,13 @@
   private:
     void DoRun() override;
     /**
-     * \brief Increases the TCP window.
-     * \param cong The congestion control.
+     * @brief Increases the TCP window.
+     * @param cong The congestion control.
      */
     void IncreaseWindow(Ptr<TcpVegas> cong);
     /**
      * brief Get and check the SSH threshold.
-     * \param cong The congestion control.
+     * @param cong The congestion control.
      */
     void GetSsThresh(Ptr<TcpVegas> cong);
 
@@ -190,9 +190,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief TCP Vegas TestSuite
+ * @brief TCP Vegas TestSuite
  */
 class TcpVegasTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/tcp-veno-test.cc ns-3.44/src/internet/test/tcp-veno-test.cc
--- ns-3.43/src/internet/test/tcp-veno-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/tcp-veno-test.cc	2025-03-09 16:55:49.415371200 -0700
@@ -23,22 +23,22 @@
 NS_LOG_COMPONENT_DEFINE("TcpVenoTestSuite");
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Testing the additive increase and multiplicative decrease of TcpVeno
+ * @brief Testing the additive increase and multiplicative decrease of TcpVeno
  */
 class TcpVenoTest : public TestCase
 {
   public:
     /**
-     * \brief Constructor.
-     * \param cWnd Congestion window.
-     * \param segmentSize Segment size.
-     * \param ssThresh Slow Start Threshold.
-     * \param rtt The RTT.
-     * \param segmentsAcked Number of segments acked.
-     * \param numRtt Number of RTTs (i.e., rounds) in the test.
-     * \param name Test description.
+     * @brief Constructor.
+     * @param cWnd Congestion window.
+     * @param segmentSize Segment size.
+     * @param ssThresh Slow Start Threshold.
+     * @param rtt The RTT.
+     * @param segmentsAcked Number of segments acked.
+     * @param numRtt Number of RTTs (i.e., rounds) in the test.
+     * @param name Test description.
      */
     TcpVenoTest(uint32_t cWnd,
                 uint32_t segmentSize,
@@ -52,43 +52,43 @@
     void DoRun() override;
 
     /**
-     * \brief TCP Veno additive increase formula.
-     * \param state The congestion control state.
-     * \param diff The difference between actual and expected throughput.
-     * \param beta TCP Veno beta param.
+     * @brief TCP Veno additive increase formula.
+     * @param state The congestion control state.
+     * @param diff The difference between actual and expected throughput.
+     * @param beta TCP Veno beta param.
      */
     void AdditiveIncrease(Ptr<TcpSocketState> state, uint32_t diff, UintegerValue beta);
 
     /**
-     * \brief TCP Veno multiplicative decrease formula.
-     * \param diff The difference between actual and expected throughput.
-     * \param beta TCP Veno beta param.
-     * \param bytesInFlight Bytes in flight.
-     * \returns The calculated SsThresh.
+     * @brief TCP Veno multiplicative decrease formula.
+     * @param diff The difference between actual and expected throughput.
+     * @param beta TCP Veno beta param.
+     * @param bytesInFlight Bytes in flight.
+     * @returns The calculated SsThresh.
      */
     uint32_t MultiplicativeDecrease(uint32_t diff,
                                     const UintegerValue& beta,
                                     uint32_t bytesInFlight) const;
 
     /**
-     * \brief Mimics the NewReno IncreaseWindow algorithm.
-     * \param state TCP socket state.
-     * \param segmentsAcked Number of segments acked.
+     * @brief Mimics the NewReno IncreaseWindow algorithm.
+     * @param state TCP socket state.
+     * @param segmentsAcked Number of segments acked.
      */
     void NewReno_IncreaseWindow(Ptr<TcpSocketState> state, uint32_t segmentsAcked);
 
     /**
-     * \brief Mimics the NewReno SlowStart algorithm.
-     * \param state TCP socket state.
-     * \param segmentsAcked Number of segments acked.
-     * \returns The number of segments that could be sent.
+     * @brief Mimics the NewReno SlowStart algorithm.
+     * @param state TCP socket state.
+     * @param segmentsAcked Number of segments acked.
+     * @returns The number of segments that could be sent.
      */
     uint32_t NewReno_SlowStart(Ptr<TcpSocketState> state, uint32_t segmentsAcked);
 
     /**
-     * \brief Mimics the NewReno Congestion Avoidance algorithm.
-     * \param state TCP socket state.
-     * \param segmentsAcked Number of segments acked.
+     * @brief Mimics the NewReno Congestion Avoidance algorithm.
+     * @param state TCP socket state.
+     * @param segmentsAcked Number of segments acked.
      */
     void NewReno_CongestionAvoidance(Ptr<TcpSocketState> state, uint32_t segmentsAcked);
 
@@ -287,9 +287,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief TCP Veno TestSuite
+ * @brief TCP Veno TestSuite
  */
 class TcpVenoTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/tcp-wscaling-test.cc ns-3.44/src/internet/test/tcp-wscaling-test.cc
--- ns-3.43/src/internet/test/tcp-wscaling-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/tcp-wscaling-test.cc	2025-03-09 16:55:49.415371200 -0700
@@ -20,9 +20,9 @@
 
 // TODO: Check the buffer size and scaling option value
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief TCP Window Scaling enabling Test.
+ * @brief TCP Window Scaling enabling Test.
  */
 class WScalingTestCase : public TcpGeneralTest
 {
@@ -39,11 +39,11 @@
     };
 
     /**
-     * \brief Constructor.
-     * \param conf Test configuration.
-     * \param maxRcvBufferSize Maximum receiver buffer size.
-     * \param maxSndBufferSize Maximum sender buffer size.
-     * \param name Test description.
+     * @brief Constructor.
+     * @param conf Test configuration.
+     * @param maxRcvBufferSize Maximum receiver buffer size.
+     * @param maxSndBufferSize Maximum sender buffer size.
+     * @param name Test description.
      */
     WScalingTestCase(WScalingTestCase::Configuration conf,
                      uint32_t maxRcvBufferSize,
@@ -207,9 +207,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief TCP Window Scaling TestSuite.
+ * @brief TCP Window Scaling TestSuite.
  */
 class TcpWScalingTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/tcp-yeah-test.cc ns-3.44/src/internet/test/tcp-yeah-test.cc
--- ns-3.43/src/internet/test/tcp-yeah-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/tcp-yeah-test.cc	2025-03-09 16:55:49.415371200 -0700
@@ -23,23 +23,23 @@
 NS_LOG_COMPONENT_DEFINE("TcpYeahTestSuite");
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Testing TcpYeah additive increase algorithm.
+ * @brief Testing TcpYeah additive increase algorithm.
  */
 class TcpYeahIncrementTest : public TestCase
 {
   public:
     /**
-     * \brief Constructor.
-     * \param cWnd Congestion window.
-     * \param ssThresh Slow Start Threshold.
-     * \param segmentSize Segment size.
-     * \param nextTxSeq Next Tx sequence number.
-     * \param lastAckedSeq Last ACKed sequence number.
-     * \param segmentsAcked Number of segments ACKed.
-     * \param minRtt Minimum RTT.
-     * \param name Test description.
+     * @brief Constructor.
+     * @param cWnd Congestion window.
+     * @param ssThresh Slow Start Threshold.
+     * @param segmentSize Segment size.
+     * @param nextTxSeq Next Tx sequence number.
+     * @param lastAckedSeq Last ACKed sequence number.
+     * @param segmentsAcked Number of segments ACKed.
+     * @param minRtt Minimum RTT.
+     * @param name Test description.
      */
     TcpYeahIncrementTest(uint32_t cWnd,
                          uint32_t ssThresh,
@@ -53,8 +53,8 @@
   private:
     void DoRun() override;
     /**
-     * \brief Increases the TCP window.
-     * \param cong The congestion control.
+     * @brief Increases the TCP window.
+     * @param cong The congestion control.
      */
     void IncreaseWindow(Ptr<TcpYeah> cong);
 
@@ -203,23 +203,23 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Testing TcpYeah multiplicative decrease algorithm
+ * @brief Testing TcpYeah multiplicative decrease algorithm
  */
 class TcpYeahDecrementTest : public TestCase
 {
   public:
     /**
-     * \brief Constructor.
-     * \param cWnd Congestion window.
-     * \param ssThresh Slow Start Threshold.
-     * \param segmentSize Segment size.
-     * \param nextTxSeq Next Tx sequence number.
-     * \param lastAckedSeq Last ACKed sequence number.
-     * \param minRtt Minimum RTT.
-     * \param rho TCP Yeah rho param.
-     * \param name Test description.
+     * @brief Constructor.
+     * @param cWnd Congestion window.
+     * @param ssThresh Slow Start Threshold.
+     * @param segmentSize Segment size.
+     * @param nextTxSeq Next Tx sequence number.
+     * @param lastAckedSeq Last ACKed sequence number.
+     * @param minRtt Minimum RTT.
+     * @param rho TCP Yeah rho param.
+     * @param name Test description.
      */
     TcpYeahDecrementTest(uint32_t cWnd,
                          uint32_t ssThresh,
@@ -233,9 +233,9 @@
   private:
     void DoRun() override;
     /**
-     * \brief Calculate the Slow Start threshold.
-     * \param cong The TCP state.
-     * \returns The SshThreshold.
+     * @brief Calculate the Slow Start threshold.
+     * @param cong The TCP state.
+     * @returns The SshThreshold.
      */
     uint32_t CalculateSsThresh(Ptr<TcpYeah> cong);
 
@@ -345,9 +345,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief TCP Yeah TestSuite
+ * @brief TCP Yeah TestSuite
  */
 class TcpYeahTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/tcp-zero-window-test.cc ns-3.44/src/internet/test/tcp-zero-window-test.cc
--- ns-3.43/src/internet/test/tcp-zero-window-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/tcp-zero-window-test.cc	2025-03-09 16:55:49.415371200 -0700
@@ -16,16 +16,16 @@
 NS_LOG_COMPONENT_DEFINE("TcpZeroWindowTestSuite");
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief Testing the congestion avoidance increment on TCP ZeroWindow
+ * @brief Testing the congestion avoidance increment on TCP ZeroWindow
  */
 class TcpZeroWindowTest : public TcpGeneralTest
 {
   public:
     /**
-     * \brief Constructor.
-     * \param desc Test description.
+     * @brief Constructor.
+     * @param desc Test description.
      */
     TcpZeroWindowTest(const std::string& desc);
 
@@ -45,7 +45,7 @@
     void ConfigureProperties() override;
 
     /**
-     * \brief Increase the receiver buffer size.
+     * @brief Increase the receiver buffer size.
      */
     void IncreaseBufSize();
 
@@ -72,7 +72,7 @@
     TcpGeneralTest::ConfigureEnvironment();
     SetAppPktCount(20);
     SetMTU(500);
-    SetTransmitStart(Seconds(2.0));
+    SetTransmitStart(Seconds(2));
     SetPropagationDelay(MilliSeconds(50));
 }
 
@@ -95,7 +95,7 @@
     Ptr<TcpSocketMsgBase> socket = TcpGeneralTest::CreateReceiverSocket(node);
 
     socket->SetAttribute("RcvBufSize", UintegerValue(0));
-    Simulator::Schedule(Seconds(10.0), &TcpZeroWindowTest::IncreaseBufSize, this);
+    Simulator::Schedule(Seconds(10), &TcpZeroWindowTest::IncreaseBufSize, this);
 
     return socket;
 }
@@ -236,9 +236,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief TCP ZeroWindow TestSuite
+ * @brief TCP ZeroWindow TestSuite
  */
 class TcpZeroWindowTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet/test/udp-test.cc ns-3.44/src/internet/test/udp-test.cc
--- ns-3.43/src/internet/test/udp-test.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/internet/test/udp-test.cc	2025-03-09 16:55:49.415371200 -0700
@@ -45,9 +45,9 @@
 using namespace ns3;
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief UDP Socket Loopback over IPv4 Test
+ * @brief UDP Socket Loopback over IPv4 Test
  */
 class UdpSocketLoopbackTest : public TestCase
 {
@@ -56,8 +56,8 @@
     void DoRun() override;
 
     /**
-     * \brief Receive a packet.
-     * \param socket The receiving socket.
+     * @brief Receive a packet.
+     * @param socket The receiving socket.
      */
     void ReceivePkt(Ptr<Socket> socket);
     Ptr<Packet> m_receivedPacket; //!< Received packet
@@ -102,9 +102,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief UDP Socket Loopback over IPv6 Test
+ * @brief UDP Socket Loopback over IPv6 Test
  */
 class Udp6SocketLoopbackTest : public TestCase
 {
@@ -113,8 +113,8 @@
     void DoRun() override;
 
     /**
-     * \brief Receive a packet.
-     * \param socket The receiving socket.
+     * @brief Receive a packet.
+     * @param socket The receiving socket.
      */
     void ReceivePkt(Ptr<Socket> socket);
     Ptr<Packet> m_receivedPacket; //!< Received packet
@@ -158,9 +158,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief UDP Socket over IPv4 Test
+ * @brief UDP Socket over IPv4 Test
  */
 class UdpSocketImplTest : public TestCase
 {
@@ -169,37 +169,37 @@
     Ptr<Ipv4QueueDiscItem> m_sentPacket; //!< Sent packet.
 
     /**
-     * \brief Get the TOS of the received packet.
-     * \returns The TOS.
+     * @brief Get the TOS of the received packet.
+     * @returns The TOS.
      */
     uint32_t GetTos();
 
     /**
-     * \brief Get the priority of the received packet.
-     * \returns The priority.
+     * @brief Get the priority of the received packet.
+     * @returns The priority.
      */
     uint32_t GetPriority();
 
     /**
-     * \brief Send data.
-     * \param socket The sending socket.
-     * \param to The destination address.
+     * @brief Send data.
+     * @param socket The sending socket.
+     * @param to The destination address.
      */
     void DoSendDataTo(Ptr<Socket> socket, std::string to);
     /**
-     * \brief Send data.
-     * \param socket The sending socket.
-     * \param to The destination address.
+     * @brief Send data.
+     * @param socket The sending socket.
+     * @param to The destination address.
      */
     void SendDataTo(Ptr<Socket> socket, std::string to);
     /**
-     * \brief Send data.
-     * \param socket The sending socket.
+     * @brief Send data.
+     * @param socket The sending socket.
      */
     void DoSendData(Ptr<Socket> socket);
     /**
-     * \brief Send data.
-     * \param socket The sending socket.
+     * @brief Send data.
+     * @param socket The sending socket.
      */
     void SendData(Ptr<Socket> socket);
 
@@ -208,19 +208,19 @@
     UdpSocketImplTest();
 
     /**
-     * \brief Receive packets (1).
-     * \param socket The receiving socket.
+     * @brief Receive packets (1).
+     * @param socket The receiving socket.
      */
     void ReceivePkt(Ptr<Socket> socket);
     /**
-     * \brief Receive packets (2).
-     * \param socket The receiving socket.
+     * @brief Receive packets (2).
+     * @param socket The receiving socket.
      */
     void ReceivePkt2(Ptr<Socket> socket);
 
     /**
-     * \brief Adds a packet to the list of sent packets.
-     * \param item The sent packet.
+     * @brief Adds a packet to the list of sent packets.
+     * @param item The sent packet.
      */
     void SentPkt(Ptr<const QueueDiscItem> item);
 };
@@ -507,9 +507,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief UDP Socket over IPv6 Test
+ * @brief UDP Socket over IPv6 Test
  */
 class Udp6SocketImplTest : public TestCase
 {
@@ -517,15 +517,15 @@
     Ptr<Packet> m_receivedPacket2; //!< Received packet (2).
 
     /**
-     * \brief Send data.
-     * \param socket The sending socket.
-     * \param to The destination address.
+     * @brief Send data.
+     * @param socket The sending socket.
+     * @param to The destination address.
      */
     void DoSendDataTo(Ptr<Socket> socket, std::string to);
     /**
-     * \brief Send data.
-     * \param socket The sending socket.
-     * \param to The destination address.
+     * @brief Send data.
+     * @param socket The sending socket.
+     * @param to The destination address.
      */
     void SendDataTo(Ptr<Socket> socket, std::string to);
 
@@ -534,27 +534,27 @@
     Udp6SocketImplTest();
 
     /**
-     * \brief Receive packets (1).
-     * \param socket The receiving socket.
-     * \param packet The received packet.
-     * \param from The source address.
+     * @brief Receive packets (1).
+     * @param socket The receiving socket.
+     * @param packet The received packet.
+     * @param from The source address.
      */
     void ReceivePacket(Ptr<Socket> socket, Ptr<Packet> packet, const Address& from);
     /**
-     * \brief Receive packets (2).
-     * \param socket The receiving socket.
-     * \param packet The received packet.
-     * \param from The source address.
+     * @brief Receive packets (2).
+     * @param socket The receiving socket.
+     * @param packet The received packet.
+     * @param from The source address.
      */
     void ReceivePacket2(Ptr<Socket> socket, Ptr<Packet> packet, const Address& from);
     /**
-     * \brief Receive packets (1).
-     * \param socket The receiving socket.
+     * @brief Receive packets (1).
+     * @param socket The receiving socket.
      */
     void ReceivePkt(Ptr<Socket> socket);
     /**
-     * \brief Receive packets (2).
-     * \param socket The receiving socket.
+     * @brief Receive packets (2).
+     * @param socket The receiving socket.
      */
     void ReceivePkt2(Ptr<Socket> socket);
 };
@@ -750,9 +750,9 @@
 }
 
 /**
- * \ingroup internet-test
+ * @ingroup internet-test
  *
- * \brief UDP TestSuite
+ * @brief UDP TestSuite
  */
 class UdpTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet-apps/doc/internet-apps.h ns-3.44/src/internet-apps/doc/internet-apps.h
--- ns-3.43/src/internet-apps/doc/internet-apps.h	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/internet-apps/doc/internet-apps.h	2025-03-09 16:55:49.379371200 -0700
@@ -6,7 +6,7 @@
 #define INTERNET_APPS_H
 
 /**
- * \defgroup internet-apps Internet Applications
+ * @defgroup internet-apps Internet Applications
  *
  * This section documents the API of the ns-3 Internet-specific applications module. For a generic
  * functional description, please refer to the ns-3 manual.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet-apps/examples/dhcp-example.cc ns-3.44/src/internet-apps/examples/dhcp-example.cc
--- ns-3.43/src/internet-apps/examples/dhcp-example.cc	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/internet-apps/examples/dhcp-example.cc	2025-03-09 16:55:49.379371200 -0700
@@ -145,7 +145,7 @@
     DynamicCast<DhcpServer>(dhcpServerApp.Get(0))
         ->AddStaticDhcpEntry(devNet.Get(2)->GetAddress(), Ipv4Address("172.30.0.14"));
 
-    dhcpServerApp.Start(Seconds(0.0));
+    dhcpServerApp.Start(Seconds(0));
     dhcpServerApp.Stop(stopTime);
 
     // DHCP clients
@@ -155,25 +155,25 @@
     dhcpClientNetDevs.Add(devNet.Get(2));
 
     ApplicationContainer dhcpClients = dhcpHelper.InstallDhcpClient(dhcpClientNetDevs);
-    dhcpClients.Start(Seconds(1.0));
+    dhcpClients.Start(Seconds(1));
     dhcpClients.Stop(stopTime);
 
     UdpEchoServerHelper echoServer(9);
 
     ApplicationContainer serverApps = echoServer.Install(p2pNodes.Get(1));
-    serverApps.Start(Seconds(0.0));
+    serverApps.Start(Seconds(0));
     serverApps.Stop(stopTime);
 
     UdpEchoClientHelper echoClient(p2pInterfaces.GetAddress(1), 9);
     echoClient.SetAttribute("MaxPackets", UintegerValue(100));
-    echoClient.SetAttribute("Interval", TimeValue(Seconds(1.0)));
+    echoClient.SetAttribute("Interval", TimeValue(Seconds(1)));
     echoClient.SetAttribute("PacketSize", UintegerValue(1024));
 
     ApplicationContainer clientApps = echoClient.Install(nodes.Get(1));
-    clientApps.Start(Seconds(10.0));
+    clientApps.Start(Seconds(10));
     clientApps.Stop(stopTime);
 
-    Simulator::Stop(stopTime + Seconds(10.0));
+    Simulator::Stop(stopTime + Seconds(10));
 
     if (tracing)
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet-apps/examples/ping-example.cc ns-3.44/src/internet-apps/examples/ping-example.cc
--- ns-3.43/src/internet-apps/examples/ping-example.cc	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/internet-apps/examples/ping-example.cc	2025-03-09 16:55:49.379371200 -0700
@@ -78,7 +78,7 @@
 main(int argc, char* argv[])
 {
     bool logging{false};
-    Time interPacketInterval{Seconds(1.0)};
+    Time interPacketInterval{Seconds(1)};
     uint32_t size{56};
     uint32_t count{5};
     std::string destinationStr;
@@ -246,7 +246,7 @@
 
     pointToPoint.EnablePcapAll("ping-example");
 
-    Simulator::Stop(Seconds(60.0));
+    Simulator::Stop(Seconds(60));
     Simulator::Run();
     Simulator::Destroy();
     return 0;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet-apps/examples/traceroute-example.cc ns-3.44/src/internet-apps/examples/traceroute-example.cc
--- ns-3.43/src/internet-apps/examples/traceroute-example.cc	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/internet-apps/examples/traceroute-example.cc	2025-03-09 16:55:49.379371200 -0700
@@ -24,9 +24,9 @@
 using namespace ns3;
 
 /**
- * \ingroup aodv-examples
- * \ingroup examples
- * \brief Test script.
+ * @ingroup aodv-examples
+ * @ingroup examples
+ * @brief Test script.
  *
  * This script creates 1-dimensional grid topology and Traceroute the last node from the first one:
  *
@@ -43,17 +43,17 @@
   public:
     TracerouteExample();
     /**
-     * \brief Configure script parameters
-     * \param argc is the command line argument count
-     * \param argv is the command line arguments
-     * \return true on successful configuration
+     * @brief Configure script parameters
+     * @param argc is the command line argument count
+     * @param argv is the command line arguments
+     * @return true on successful configuration
      */
     bool Configure(int argc, char** argv);
     /// Run simulation
     void Run();
     /**
      * Report results
-     * \param os the output stream
+     * @param os the output stream
      */
     void Report(std::ostream& os);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet-apps/helper/dhcp-helper.h ns-3.44/src/internet-apps/helper/dhcp-helper.h
--- ns-3.43/src/internet-apps/helper/dhcp-helper.h	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/internet-apps/helper/dhcp-helper.h	2025-03-09 16:55:49.379371200 -0700
@@ -25,10 +25,10 @@
 {
 
 /**
- * \ingroup dhcp
+ * @ingroup dhcp
  *
- * \class DhcpHelper
- * \brief The helper class used to configure and install DHCP applications on nodes
+ * @class DhcpHelper
+ * @brief The helper class used to configure and install DHCP applications on nodes
  */
 class DhcpHelper
 {
@@ -36,47 +36,47 @@
     DhcpHelper();
 
     /**
-     * \brief Set DHCP client attributes
-     * \param name Name of the attribute
-     * \param value Value to be set
+     * @brief Set DHCP client attributes
+     * @param name Name of the attribute
+     * @param value Value to be set
      */
     void SetClientAttribute(std::string name, const AttributeValue& value);
 
     /**
-     * \brief Set DHCP server attributes
-     * \param name Name of the attribute
-     * \param value Value to be set
+     * @brief Set DHCP server attributes
+     * @param name Name of the attribute
+     * @param value Value to be set
      */
     void SetServerAttribute(std::string name, const AttributeValue& value);
 
     /**
-     * \brief Install DHCP client of a nodes / NetDevice
-     * \param netDevice The NetDevice that the DHCP client will use
-     * \return The application container with DHCP client installed
+     * @brief Install DHCP client of a nodes / NetDevice
+     * @param netDevice The NetDevice that the DHCP client will use
+     * @return The application container with DHCP client installed
      */
     ApplicationContainer InstallDhcpClient(Ptr<NetDevice> netDevice) const;
 
     /**
-     * \brief Install DHCP client of a set of nodes / NetDevices
-     * \param netDevices The NetDevices that the DHCP client will use
-     * \return The application container with DHCP client installed
+     * @brief Install DHCP client of a set of nodes / NetDevices
+     * @param netDevices The NetDevices that the DHCP client will use
+     * @return The application container with DHCP client installed
      */
     ApplicationContainer InstallDhcpClient(NetDeviceContainer netDevices) const;
 
     /**
-     * \brief Install DHCP server of a node / NetDevice
+     * @brief Install DHCP server of a node / NetDevice
      *
      * Note: the server address must be coherent with the pool address, because
      * DHCP relays are not yet supported.
      *
-     * \param netDevice The NetDevice on which DHCP server application has to be installed
-     * \param serverAddr The Ipv4Address of the server
-     * \param poolAddr The Ipv4Address (network part) of the allocated pool
-     * \param poolMask The mask of the allocated pool
-     * \param minAddr The lower bound of the Ipv4Address pool
-     * \param maxAddr The upper bound of the Ipv4Address pool
-     * \param gateway The Ipv4Address of default gateway (optional)
-     * \return The application container with DHCP server installed
+     * @param netDevice The NetDevice on which DHCP server application has to be installed
+     * @param serverAddr The Ipv4Address of the server
+     * @param poolAddr The Ipv4Address (network part) of the allocated pool
+     * @param poolMask The mask of the allocated pool
+     * @param minAddr The lower bound of the Ipv4Address pool
+     * @param maxAddr The upper bound of the Ipv4Address pool
+     * @param gateway The Ipv4Address of default gateway (optional)
+     * @return The application container with DHCP server installed
      */
     ApplicationContainer InstallDhcpServer(Ptr<NetDevice> netDevice,
                                            Ipv4Address serverAddr,
@@ -86,11 +86,11 @@
                                            Ipv4Address maxAddr,
                                            Ipv4Address gateway = Ipv4Address());
     /**
-     * \brief Assign a fixed IP addresses to a net device.
-     * \param netDevice The NetDevice on which the address has to be installed
-     * \param addr The Ipv4Address
-     * \param mask The network mask
-     * \return the Ipv4 interface container
+     * @brief Assign a fixed IP addresses to a net device.
+     * @param netDevice The NetDevice on which the address has to be installed
+     * @param addr The Ipv4Address
+     * @param mask The network mask
+     * @return the Ipv4 interface container
      */
     Ipv4InterfaceContainer InstallFixedAddress(Ptr<NetDevice> netDevice,
                                                Ipv4Address addr,
@@ -98,9 +98,9 @@
 
   private:
     /**
-     * \brief Function to install DHCP client on a node
-     * \param netDevice The NetDevice on which DHCP client application has to be installed
-     * \return The pointer to the installed DHCP client
+     * @brief Function to install DHCP client on a node
+     * @param netDevice The NetDevice on which DHCP client application has to be installed
+     * @return The pointer to the installed DHCP client
      */
     Ptr<Application> InstallDhcpClientPriv(Ptr<NetDevice> netDevice) const;
     ObjectFactory m_clientFactory;           //!< DHCP client factory
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet-apps/helper/ping-helper.h ns-3.44/src/internet-apps/helper/ping-helper.h
--- ns-3.43/src/internet-apps/helper/ping-helper.h	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/internet-apps/helper/ping-helper.h	2025-03-09 16:55:49.379371200 -0700
@@ -14,15 +14,15 @@
 #ifndef PING_HELPER_H
 #define PING_HELPER_H
 
+#include "ns3/application-helper.h"
 #include "ns3/ping.h"
-#include <ns3/application-helper.h>
 
 namespace ns3
 {
 
 /**
- * \ingroup ping
- * \brief Create a ping application and associate it to a node
+ * @ingroup ping
+ * @brief Create a ping application and associate it to a node
  *
  * This class creates one or multiple instances of ns3::Ping and associates
  * it/them to one/multiple node(s).
@@ -40,8 +40,8 @@
      * Create a PingHelper which is used to make life easier for people wanting
      * to use ping Applications.
      *
-     * \param remote The address which should be pinged
-     * \param local The source address
+     * @param remote The address which should be pinged
+     * @param local The source address
      */
     PingHelper(const Address& remote, const Address& local = Address());
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet-apps/helper/radvd-helper.h ns-3.44/src/internet-apps/helper/radvd-helper.h
--- ns-3.43/src/internet-apps/helper/radvd-helper.h	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/internet-apps/helper/radvd-helper.h	2025-03-09 16:55:49.379371200 -0700
@@ -9,8 +9,8 @@
 #ifndef RADVD_HELPER_H
 #define RADVD_HELPER_H
 
+#include "ns3/application-helper.h"
 #include "ns3/radvd-interface.h"
-#include <ns3/application-helper.h>
 
 #include <map>
 #include <stdint.h>
@@ -19,49 +19,49 @@
 {
 
 /**
- * \ingroup radvd
- * \brief Radvd application helper.
+ * @ingroup radvd
+ * @brief Radvd application helper.
  */
 class RadvdHelper : public ApplicationHelper
 {
   public:
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     RadvdHelper();
 
     /**
-     * \brief Add a new prefix to be announced through an interface.
-     * \param interface outgoing interface
-     * \param prefix announced IPv6 prefix
-     * \param prefixLength announced IPv6 prefix length
+     * @brief Add a new prefix to be announced through an interface.
+     * @param interface outgoing interface
+     * @param prefix announced IPv6 prefix
+     * @param prefixLength announced IPv6 prefix length
      */
     void AddAnnouncedPrefix(uint32_t interface, const Ipv6Address& prefix, uint32_t prefixLength);
 
     /**
-     * \brief Enable the router as default router for the interface.
+     * @brief Enable the router as default router for the interface.
      * The effect is to set the Router Lifetime to the default value (30 minutes)
-     * \param interface outgoing interface
+     * @param interface outgoing interface
      */
     void EnableDefaultRouterForInterface(uint32_t interface);
 
     /**
-     * \brief Disable the router as default router for the interface.
+     * @brief Disable the router as default router for the interface.
      * The effect is to set the Router Lifetime to zero
-     * \param interface outgoing interface
+     * @param interface outgoing interface
      */
     void DisableDefaultRouterForInterface(uint32_t interface);
 
     /**
-     * \brief Get the low-level RadvdInterface specification for an interface.
+     * @brief Get the low-level RadvdInterface specification for an interface.
      * This method is provided to enable fine-grain parameter setup.
-     * \param interface outgoing interface
-     * \returns the RadvdInterface
+     * @param interface outgoing interface
+     * @returns the RadvdInterface
      */
     Ptr<RadvdInterface> GetRadvdInterface(uint32_t interface);
 
     /**
-     * \brief Clear the stored Prefixes
+     * @brief Clear the stored Prefixes
      */
     void ClearPrefixes();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet-apps/helper/v4traceroute-helper.h ns-3.44/src/internet-apps/helper/v4traceroute-helper.h
--- ns-3.43/src/internet-apps/helper/v4traceroute-helper.h	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/internet-apps/helper/v4traceroute-helper.h	2025-03-09 16:55:49.379371200 -0700
@@ -11,7 +11,7 @@
 #ifndef V4TRACEROUTE_HELPER_H
 #define V4TRACEROUTE_HELPER_H
 
-#include <ns3/application-helper.h>
+#include "ns3/application-helper.h"
 
 namespace ns3
 {
@@ -19,8 +19,8 @@
 class OutputStreamWrapper;
 
 /**
- * \ingroup v4traceroute
- * \brief Create a IPv4 traceroute application and associate it to a node
+ * @ingroup v4traceroute
+ * @brief Create a IPv4 traceroute application and associate it to a node
  *
  * This class creates one or multiple instances of ns3::V4TraceRoute and associates
  * it/them to one/multiple node(s).
@@ -32,14 +32,14 @@
      * Create a V4TraceRouteHelper which is used to make life easier for people wanting
      * to use TraceRoute
      *
-     * \param remote The address which should be traced
+     * @param remote The address which should be traced
      */
     V4TraceRouteHelper(const Ipv4Address& remote);
 
     /**
-     * \brief Print the resulting trace routes from given node.
-     * \param node The origin node where the traceroute is initiated.
-     * \param stream The outputstream used to print the resulting traced routes.
+     * @brief Print the resulting trace routes from given node.
+     * @param node The origin node where the traceroute is initiated.
+     * @param stream The outputstream used to print the resulting traced routes.
      */
     static void PrintTraceRouteAt(Ptr<Node> node, Ptr<OutputStreamWrapper> stream);
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet-apps/model/dhcp-client.cc ns-3.44/src/internet-apps/model/dhcp-client.cc
--- ns-3.43/src/internet-apps/model/dhcp-client.cc	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/internet-apps/model/dhcp-client.cc	2025-03-09 16:55:49.379371200 -0700
@@ -145,8 +145,10 @@
 DhcpClient::AssignStreams(int64_t stream)
 {
     NS_LOG_FUNCTION(this << stream);
-    m_ran->SetStream(stream);
-    return 1;
+    auto currentStream = stream;
+    m_ran->SetStream(currentStream++);
+    currentStream += Application::AssignStreams(currentStream);
+    return (currentStream - stream);
 }
 
 void
@@ -379,9 +381,9 @@
 
     DhcpHeader header = m_offerList.front();
     m_offerList.pop_front();
-    m_lease = Time(Seconds(header.GetLease()));
-    m_renew = Time(Seconds(header.GetRenew()));
-    m_rebind = Time(Seconds(header.GetRebind()));
+    m_lease = Seconds(header.GetLease());
+    m_renew = Seconds(header.GetRenew());
+    m_rebind = Seconds(header.GetRebind());
     m_offeredAddress = header.GetYiaddr();
     m_myMask = Ipv4Mask(header.GetMask());
     m_server = header.GetDhcps();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet-apps/model/dhcp-client.h ns-3.44/src/internet-apps/model/dhcp-client.h
--- ns-3.43/src/internet-apps/model/dhcp-client.h	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/internet-apps/model/dhcp-client.h	2025-03-09 16:55:49.379371200 -0700
@@ -28,17 +28,17 @@
 class RandomVariableStream;
 
 /**
- * \ingroup dhcp
+ * @ingroup dhcp
  *
- * \class DhcpClient
- * \brief Implements the functionality of a DHCP client
+ * @class DhcpClient
+ * @brief Implements the functionality of a DHCP client
  */
 class DhcpClient : public Application
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -46,26 +46,26 @@
     ~DhcpClient() override;
 
     /**
-     * \brief Constructor
-     * \param netDevice the NetDevice DHCP should work on
+     * @brief Constructor
+     * @param netDevice the NetDevice DHCP should work on
      */
     DhcpClient(Ptr<NetDevice> netDevice);
 
     /**
-     * \brief Get the the NetDevice DHCP should work on
-     * \return the NetDevice DHCP should work on
+     * @brief Get the the NetDevice DHCP should work on
+     * @return the NetDevice DHCP should work on
      */
     Ptr<NetDevice> GetDhcpClientNetDevice();
 
     /**
-     * \brief Set the NetDevice DHCP should work on
-     * \param netDevice the NetDevice DHCP should work on
+     * @brief Set the NetDevice DHCP should work on
+     * @param netDevice the NetDevice DHCP should work on
      */
     void SetDhcpClientNetDevice(Ptr<NetDevice> netDevice);
 
     /**
-     * \brief Get the IPv4Address of current DHCP server
-     * \return Ipv4Address of current DHCP server
+     * @brief Get the IPv4Address of current DHCP server
+     * @return Ipv4Address of current DHCP server
      */
     Ipv4Address GetDhcpServer();
 
@@ -89,47 +89,47 @@
     static const int DHCP_PEER_PORT = 67; //!< DHCP server port
 
     /**
-     * \brief Handles changes in LinkState
+     * @brief Handles changes in LinkState
      */
     void LinkStateHandler();
 
     /**
-     * \brief Handles incoming packets from the network
-     * \param socket Socket bound to port 68 of the DHCP client
+     * @brief Handles incoming packets from the network
+     * @param socket Socket bound to port 68 of the DHCP client
      */
     void NetHandler(Ptr<Socket> socket);
 
     /**
-     * \brief Sends DHCP DISCOVER and changes the client state to WAIT_OFFER
+     * @brief Sends DHCP DISCOVER and changes the client state to WAIT_OFFER
      */
     void Boot();
 
     /**
-     * \brief Stores DHCP offers in m_offerList
-     * \param header DhcpHeader of the DHCP OFFER message
+     * @brief Stores DHCP offers in m_offerList
+     * @param header DhcpHeader of the DHCP OFFER message
      */
     void OfferHandler(DhcpHeader header);
 
     /**
-     * \brief Selects an OFFER from m_offerList
+     * @brief Selects an OFFER from m_offerList
      */
     void Select();
 
     /**
-     * \brief Sends the DHCP REQUEST message and changes the client state to WAIT_ACK
+     * @brief Sends the DHCP REQUEST message and changes the client state to WAIT_ACK
      */
     void Request();
 
     /**
-     * \brief Receives the DHCP ACK and configures IP address of the client.
+     * @brief Receives the DHCP ACK and configures IP address of the client.
      *        It also triggers the timeout, renew and rebind events.
-     * \param header DhcpHeader of the DHCP ACK message
-     * \param from   Address of DHCP server that sent the DHCP ACK
+     * @param header DhcpHeader of the DHCP ACK message
+     * @param from   Address of DHCP server that sent the DHCP ACK
      */
     void AcceptAck(DhcpHeader header, Address from);
 
     /**
-     * \brief Remove the current DHCP information and restart the process
+     * @brief Remove the current DHCP information and restart the process
      */
     void RemoveAndStart();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet-apps/model/dhcp-header.h ns-3.44/src/internet-apps/model/dhcp-header.h
--- ns-3.43/src/internet-apps/model/dhcp-header.h	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/internet-apps/model/dhcp-header.h	2025-03-09 16:55:49.379371200 -0700
@@ -22,20 +22,20 @@
 {
 
 /**
- * \ingroup internet-apps
- * \defgroup dhcp DHCPv4 Client and Server
+ * @ingroup internet-apps
+ * @defgroup dhcp DHCPv4 Client and Server
  */
 
 /**
- * \ingroup dhcp
+ * @ingroup dhcp
  *
- * \class DhcpHeader
- * \brief BOOTP header with DHCP messages.  This supports the following options:
+ * @class DhcpHeader
+ * @brief BOOTP header with DHCP messages.  This supports the following options:
  *        Subnet Mask (1), Address Request (50), Refresh Lease Time (51),
  *        DHCP Message Type (53), DHCP Server ID (54), Renew Time (58),
  *        Rebind Time (59) and End (255) of BOOTP
  *
- * \verbatim
+ * @verbatim
    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
@@ -73,18 +73,18 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Constructor
+     * @brief Constructor
      */
     DhcpHeader();
 
     /**
-     * \brief Destructor
+     * @brief Destructor
      */
     ~DhcpHeader() override;
 
@@ -113,164 +113,164 @@
     };
 
     /**
-     * \brief Set the type of BOOTP and DHCP messages
-     * \param type The type of message
+     * @brief Set the type of BOOTP and DHCP messages
+     * @param type The type of message
      */
     void SetType(uint8_t type);
 
     /**
-     * \brief Return the type of DHCP message
-     * \return The type of message
+     * @brief Return the type of DHCP message
+     * @return The type of message
      */
     uint8_t GetType() const;
 
     /**
-     * \brief Set the hardware information
-     * \param htype Hardware type
-     * \param hlen Hardware length
+     * @brief Set the hardware information
+     * @param htype Hardware type
+     * @param hlen Hardware length
      */
     void SetHWType(uint8_t htype, uint8_t hlen);
 
     /**
-     * \brief Set the transaction ID
-     * \param tran The transaction number
+     * @brief Set the transaction ID
+     * @param tran The transaction number
      */
     void SetTran(uint32_t tran);
 
     /**
-     * \brief Get the transaction id
-     * \return The transaction id
+     * @brief Get the transaction id
+     * @return The transaction id
      */
     uint32_t GetTran() const;
 
     /**
-     * \brief Set the time when message is sent
+     * @brief Set the time when message is sent
      */
     void SetTime();
 
     /**
-     * \brief Set the Address of the device.
+     * @brief Set the Address of the device.
      *
      * Only the relevant bits are considered (i.e., not the type and length)
      *
-     * \param addr Address of the device
+     * @param addr Address of the device
      */
     void SetChaddr(Address addr);
 
     /**
-     * \brief Set the Address of the device
-     * \param addr Address of the device
-     * \param len Address length
+     * @brief Set the Address of the device
+     * @param addr Address of the device
+     * @param len Address length
      */
     void SetChaddr(uint8_t* addr, uint8_t len);
 
     /**
-     * \brief Get the Address of the client.
+     * @brief Get the Address of the client.
      *
      * Note: the address is always 16-bytes long.
      *
-     * \return Address of the client
+     * @return Address of the client
      */
     Address GetChaddr();
 
     /**
-     * \brief Set the IPv4Address of the client
-     * \param addr The client Ipv4Address
+     * @brief Set the IPv4Address of the client
+     * @param addr The client Ipv4Address
      */
     void SetYiaddr(Ipv4Address addr);
 
     /**
-     * \brief Get the IPv4Address of the client
-     * \return IPv4Address of the client
+     * @brief Get the IPv4Address of the client
+     * @return IPv4Address of the client
      */
     Ipv4Address GetYiaddr() const;
 
     /**
-     * \brief Set the DHCP server information
-     * \param addr IPv4Address of the server
+     * @brief Set the DHCP server information
+     * @param addr IPv4Address of the server
      */
     void SetDhcps(Ipv4Address addr);
 
     /**
-     * \brief Get the information about the DHCP server
-     * \return IPv4Address of DHCP server
+     * @brief Get the information about the DHCP server
+     * @return IPv4Address of DHCP server
      */
     Ipv4Address GetDhcps() const;
 
     /**
-     * \brief Set the Ipv4Address requested by the client
-     * \param addr Ipv4Address requested by the client
+     * @brief Set the Ipv4Address requested by the client
+     * @param addr Ipv4Address requested by the client
      */
     void SetReq(Ipv4Address addr);
 
     /**
-     * \brief Get the IPv4Address requested by the client
-     * \return IPv4Address requested by the client
+     * @brief Get the IPv4Address requested by the client
+     * @return IPv4Address requested by the client
      */
     Ipv4Address GetReq() const;
 
     /**
-     * \brief Set the mask of the IPv4Address
-     * \param addr 32 bit mask
+     * @brief Set the mask of the IPv4Address
+     * @param addr 32 bit mask
      */
     void SetMask(uint32_t addr);
 
     /**
-     * \brief Return the mask of the network
-     * \return 32 bit mask
+     * @brief Return the mask of the network
+     * @return 32 bit mask
      */
     uint32_t GetMask() const;
 
     /**
-     * \brief Set the Ipv4Address of gateway to be used
-     * \param addr The Ipv4Address of the gateway
+     * @brief Set the Ipv4Address of gateway to be used
+     * @param addr The Ipv4Address of the gateway
      */
     void SetRouter(Ipv4Address addr);
 
     /**
-     * \brief Return the Ipv4Address of gateway to be used
-     * \return The Ipv4Address of the gateway
+     * @brief Return the Ipv4Address of gateway to be used
+     * @return The Ipv4Address of the gateway
      */
     Ipv4Address GetRouter() const;
 
     /**
-     * \brief Set the lease time of the IPv4Address
-     * \param time 32 bit time
+     * @brief Set the lease time of the IPv4Address
+     * @param time 32 bit time
      */
     void SetLease(uint32_t time);
 
     /**
-     * \brief Return the lease time of the IPv4Address
-     * \return 32 bit time
+     * @brief Return the lease time of the IPv4Address
+     * @return 32 bit time
      */
     uint32_t GetLease() const;
 
     /**
-     * \brief Set the Renewal time of the IPv4Address
-     * \param time 32 bit time
+     * @brief Set the Renewal time of the IPv4Address
+     * @param time 32 bit time
      */
     void SetRenew(uint32_t time);
 
     /**
-     * \brief Return the Renewal time of the address
-     * \return 32 bit time
+     * @brief Return the Renewal time of the address
+     * @return 32 bit time
      */
     uint32_t GetRenew() const;
 
     /**
-     * \brief Set the Rebind time of the IPv4Address
-     * \param time 32 bit time
+     * @brief Set the Rebind time of the IPv4Address
+     * @param time 32 bit time
      */
     void SetRebind(uint32_t time);
 
     /**
-     * \brief Return the Rebind time of the address
-     * \return 32 bit time
+     * @brief Return the Rebind time of the address
+     * @return 32 bit time
      */
     uint32_t GetRebind() const;
 
     /**
-     * \brief Reset the BOOTP options
+     * @brief Reset the BOOTP options
      */
     void ResetOpt();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet-apps/model/dhcp-server.h ns-3.44/src/internet-apps/model/dhcp-server.h
--- ns-3.43/src/internet-apps/model/dhcp-server.h	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/internet-apps/model/dhcp-server.h	2025-03-09 16:55:49.379371200 -0700
@@ -28,17 +28,17 @@
 class Packet;
 
 /**
- * \ingroup dhcp
+ * @ingroup dhcp
  *
- * \class DhcpServer
- * \brief Implements the functionality of a DHCP server
+ * @class DhcpServer
+ * @brief Implements the functionality of a DHCP server
  */
 class DhcpServer : public Application
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -46,10 +46,10 @@
     ~DhcpServer() override;
 
     /**
-     * \brief Add a static entry to the pool.
+     * @brief Add a static entry to the pool.
      *
-     * \param chaddr The client chaddr.
-     * \param addr The address to handle to the client.
+     * @param chaddr The client chaddr.
+     * @param addr The address to handle to the client.
      */
     void AddStaticDhcpEntry(Address chaddr, Ipv4Address addr);
 
@@ -63,29 +63,29 @@
     static const int PORT = 67; //!< Port number of DHCP server
 
     /**
-     * \brief Handles incoming packets from the network
-     * \param socket Socket bound to port 67 of the DHCP server
+     * @brief Handles incoming packets from the network
+     * @param socket Socket bound to port 67 of the DHCP server
      */
     void NetHandler(Ptr<Socket> socket);
 
     /**
-     * \brief Sends DHCP offer after receiving DHCP Discover
-     * \param iDev incoming NetDevice
-     * \param header DHCP header of the received message
-     * \param from Address of the DHCP client
+     * @brief Sends DHCP offer after receiving DHCP Discover
+     * @param iDev incoming NetDevice
+     * @param header DHCP header of the received message
+     * @param from Address of the DHCP client
      */
     void SendOffer(Ptr<NetDevice> iDev, DhcpHeader header, InetSocketAddress from);
 
     /**
-     * \brief Sends DHCP ACK (or NACK) after receiving Request
-     * \param iDev incoming NetDevice
-     * \param header DHCP header of the received message
-     * \param from Address of the DHCP client
+     * @brief Sends DHCP ACK (or NACK) after receiving Request
+     * @param iDev incoming NetDevice
+     * @param header DHCP header of the received message
+     * @param from Address of the DHCP client
      */
     void SendAck(Ptr<NetDevice> iDev, DhcpHeader header, InetSocketAddress from);
 
     /**
-     * \brief Modifies the remaining lease time of addresses
+     * @brief Modifies the remaining lease time of addresses
      */
     void TimerHandler();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet-apps/model/ping.h ns-3.44/src/internet-apps/model/ping.h
--- ns-3.43/src/internet-apps/model/ping.h	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/internet-apps/model/ping.h	2025-03-09 16:55:49.379371200 -0700
@@ -26,12 +26,12 @@
 class Socket;
 
 /**
- * \ingroup internet-apps
- * \defgroup ping Ping
+ * @ingroup internet-apps
+ * @defgroup ping Ping
  */
 
 /**
- * \ingroup ping
+ * @ingroup ping
  *
  * This application behaves similarly to the Unix ping application, although
  * with fewer options supported.  The application can be used to send
@@ -45,14 +45,14 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \enum VerboseMode
-     * \brief Encode three possible levels of verbose output
+     * @enum VerboseMode
+     * @brief Encode three possible levels of verbose output
      */
     enum VerboseMode
     {
@@ -62,8 +62,8 @@
     };
 
     /**
-     * \enum DropReason
-     * \brief Reason why a ping was dropped
+     * @enum DropReason
+     * @brief Reason why a ping was dropped
      */
     enum DropReason
     {
@@ -100,39 +100,39 @@
     ~Ping() override;
 
     /**
-     * \brief Set routers for IPv6 routing type 0 (loose routing).
-     * \param routers routers addresses
+     * @brief Set routers for IPv6 routing type 0 (loose routing).
+     * @param routers routers addresses
      */
     void SetRouters(const std::vector<Ipv6Address>& routers);
 
     /**
      * TracedCallback signature for Rtt trace
      *
-     * \param [in] seq The ICMP sequence number
-     * \param [in] p The ICMP echo request packet (including ICMP header)
+     * @param [in] seq The ICMP sequence number
+     * @param [in] p The ICMP echo request packet (including ICMP header)
      */
     typedef void (*TxTrace)(uint16_t seq, Ptr<const Packet> p);
 
     /**
      * TracedCallback signature for Rtt trace
      *
-     * \param [in] seq The ICMP sequence number
-     * \param [in] rtt The reported RTT
+     * @param [in] seq The ICMP sequence number
+     * @param [in] rtt The reported RTT
      */
     typedef void (*RttTrace)(uint16_t seq, Time rtt);
 
     /**
      * TracedCallback signature for Drop trace
      *
-     * \param [in] seq The ICMP sequence number
-     * \param [in] reason The reason for the reported drop
+     * @param [in] seq The ICMP sequence number
+     * @param [in] reason The reason for the reported drop
      */
     typedef void (*DropTrace)(uint16_t seq, DropReason reason);
 
     /**
      * TracedCallback signature for Report trace
      *
-     * \param [in] report The report information
+     * @param [in] report The report information
      */
     typedef void (*ReportTrace)(const PingReport& report);
 
@@ -144,7 +144,7 @@
     void StopApplication() override;
 
     /**
-     * \brief Writes data to buffer in little-endian format.
+     * @brief Writes data to buffer in little-endian format.
      *
      * Least significant byte of data is at lowest buffer address
      *
@@ -154,16 +154,16 @@
     void Write64(uint8_t* buffer, const uint64_t data);
 
     /**
-     * \brief Writes data from a little-endian formatted buffer to data.
+     * @brief Writes data from a little-endian formatted buffer to data.
      *
-     * \param buffer the buffer to read from
-     * \return the read data
+     * @param buffer the buffer to read from
+     * @return the read data
      */
     uint64_t Read64(const uint8_t* buffer);
 
     /**
-     * \brief Return the application signatiure.
-     * \returns the application signature.
+     * @brief Return the application signatiure.
+     * @returns the application signature.
      *
      * The application signature is the NodeId concatenated with the
      * application index in the node.
@@ -171,15 +171,15 @@
     uint64_t GetApplicationSignature() const;
 
     /**
-     * \brief Receive an ICMPv4 or an ICMPv6 Echo reply
-     * \param socket the receiving socket
+     * @brief Receive an ICMPv4 or an ICMPv6 Echo reply
+     * @param socket the receiving socket
      *
      * This function is called by lower layers through a callback.
      */
     void Receive(Ptr<Socket> socket);
 
     /**
-     * \brief Send one Ping (ICMPv4 ECHO or ICMPv6 ECHO) to the destination
+     * @brief Send one Ping (ICMPv4 ECHO or ICMPv6 ECHO) to the destination
      */
     void Send();
 
@@ -229,15 +229,15 @@
     EventId m_next;
 
     /**
-     * \brief Sent echo request data.
+     * @brief Sent echo request data.
      */
     class EchoRequestData
     {
       public:
         /**
          * Constructor.
-         * \param txTimePar Echo request Tx time.
-         * \param ackedPar True if the Echo request has been acknowledged at least once.
+         * @param txTimePar Echo request Tx time.
+         * @param ackedPar True if the Echo request has been acknowledged at least once.
          */
         EchoRequestData(Time txTimePar, bool ackedPar)
             : txTime(txTimePar),
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet-apps/model/radvd.cc ns-3.44/src/internet-apps/model/radvd.cc
--- ns-3.43/src/internet-apps/model/radvd.cc	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/internet-apps/model/radvd.cc	2025-03-09 16:55:49.379371200 -0700
@@ -172,8 +172,10 @@
 Radvd::AssignStreams(int64_t stream)
 {
     NS_LOG_FUNCTION(this << stream);
-    m_jitter->SetStream(stream);
-    return 1;
+    auto currentStream = stream;
+    m_jitter->SetStream(currentStream++);
+    currentStream += Application::AssignStreams(currentStream);
+    return (currentStream - stream);
 }
 
 void
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet-apps/model/radvd.h ns-3.44/src/internet-apps/model/radvd.h
--- ns-3.43/src/internet-apps/model/radvd.h	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/internet-apps/model/radvd.h	2025-03-09 16:55:49.379371200 -0700
@@ -24,53 +24,53 @@
 class Socket;
 
 /**
- * \ingroup internet-apps
- * \defgroup radvd Radvd
+ * @ingroup internet-apps
+ * @defgroup radvd Radvd
  */
 
 /**
- * \ingroup radvd
- * \brief Router advertisement daemon.
+ * @ingroup radvd
+ * @brief Router advertisement daemon.
  */
 class Radvd : public Application
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return type ID
+     * @brief Get the type ID.
+     * @return type ID
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     Radvd();
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Radvd() override;
 
     /**
-     * \brief Default value for maximum delay of RA (ms)
+     * @brief Default value for maximum delay of RA (ms)
      */
     static const uint32_t MAX_RA_DELAY_TIME = 500;
     /**
-     * \brief Default value for maximum initial RA advertisements
+     * @brief Default value for maximum initial RA advertisements
      */
     static const uint32_t MAX_INITIAL_RTR_ADVERTISEMENTS = 3;
     /**
-     * \brief Default value for maximum initial RA advertisements interval (ms)
+     * @brief Default value for maximum initial RA advertisements interval (ms)
      */
     static const uint32_t MAX_INITIAL_RTR_ADVERT_INTERVAL = 16000;
     /**
-     * \brief Default value for minimum delay between RA advertisements (ms)
+     * @brief Default value for minimum delay between RA advertisements (ms)
      */
     static const uint32_t MIN_DELAY_BETWEEN_RAS = 3000;
 
     /**
-     * \brief Add configuration for an interface;
-     * \param routerInterface configuration
+     * @brief Add configuration for an interface;
+     * @param routerInterface configuration
      */
     void AddConfiguration(Ptr<RadvdInterface> routerInterface);
 
@@ -105,48 +105,48 @@
     typedef std::map<uint32_t, Ptr<Socket>>::const_iterator SocketMapCI;
 
     /**
-     * \brief Send a packet.
-     * \param config interface configuration
-     * \param dst destination address (default ff02::1)
-     * \param reschedule if true another send will be reschedule (periodic)
+     * @brief Send a packet.
+     * @param config interface configuration
+     * @param dst destination address (default ff02::1)
+     * @param reschedule if true another send will be reschedule (periodic)
      */
     void Send(Ptr<RadvdInterface> config,
               Ipv6Address dst = Ipv6Address::GetAllNodesMulticast(),
               bool reschedule = false);
 
     /**
-     * \brief Handle received packet, especially router solicitation
-     * \param socket socket to read data from
+     * @brief Handle received packet, especially router solicitation
+     * @param socket socket to read data from
      */
     void HandleRead(Ptr<Socket> socket);
 
     /**
-     * \brief Raw socket to receive RS.
+     * @brief Raw socket to receive RS.
      */
     Ptr<Socket> m_recvSocket;
 
     /**
-     * \brief Raw socket to send RA.
+     * @brief Raw socket to send RA.
      */
     SocketMap m_sendSockets;
 
     /**
-     * \brief List of configuration for interface.
+     * @brief List of configuration for interface.
      */
     RadvdInterfaceList m_configurations;
 
     /**
-     * \brief Event ID map for unsolicited RAs.
+     * @brief Event ID map for unsolicited RAs.
      */
     EventIdMap m_unsolicitedEventIds;
 
     /**
-     * \brief Event ID map for solicited RAs.
+     * @brief Event ID map for solicited RAs.
      */
     EventIdMap m_solicitedEventIds;
 
     /**
-     * \brief Variable to provide jitter in advertisement interval
+     * @brief Variable to provide jitter in advertisement interval
      */
     Ptr<UniformRandomVariable> m_jitter;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet-apps/model/radvd-interface.cc ns-3.44/src/internet-apps/model/radvd-interface.cc
--- ns-3.43/src/internet-apps/model/radvd-interface.cc	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/internet-apps/model/radvd-interface.cc	2025-03-09 16:55:49.379371200 -0700
@@ -8,7 +8,7 @@
 
 #include "radvd-interface.h"
 
-#include <ns3/log.h>
+#include "ns3/log.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet-apps/model/radvd-interface.h ns-3.44/src/internet-apps/model/radvd-interface.h
--- ns-3.43/src/internet-apps/model/radvd-interface.h	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/internet-apps/model/radvd-interface.h	2025-03-09 16:55:49.379371200 -0700
@@ -20,8 +20,8 @@
 {
 
 /**
- * \ingroup radvd
- * \brief Radvd interface configuration.
+ * @ingroup radvd
+ * @brief Radvd interface configuration.
  */
 class RadvdInterface : public SimpleRefCount<RadvdInterface>
 {
@@ -34,357 +34,357 @@
     typedef std::list<Ptr<RadvdPrefix>>::const_iterator RadvdPrefixListCI;
 
     /**
-     * \brief Constructor.
-     * \param interface interface index
+     * @brief Constructor.
+     * @param interface interface index
      */
     RadvdInterface(uint32_t interface);
 
     /**
-     * \brief Constructor.
-     * \param interface interface index
-     * \param maxRtrAdvInterval maximum RA interval (ms)
-     * \param minRtrAdvInterval minimum RA interval (ms)
+     * @brief Constructor.
+     * @param interface interface index
+     * @param maxRtrAdvInterval maximum RA interval (ms)
+     * @param minRtrAdvInterval minimum RA interval (ms)
      */
     RadvdInterface(uint32_t interface, uint32_t maxRtrAdvInterval, uint32_t minRtrAdvInterval);
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~RadvdInterface();
 
     /**
-     * \brief Get interface index for this configuration.
-     * \return interface index
+     * @brief Get interface index for this configuration.
+     * @return interface index
      */
     uint32_t GetInterface() const;
 
     /**
-     * \brief Get list of prefixes advertised for this interface.
-     * \return list of IPv6 prefixes
+     * @brief Get list of prefixes advertised for this interface.
+     * @return list of IPv6 prefixes
      */
     RadvdPrefixList GetPrefixes() const;
 
     /**
-     * \brief Add a prefix to advertise on interface.
-     * \param routerPrefix prefix to advertise
+     * @brief Add a prefix to advertise on interface.
+     * @param routerPrefix prefix to advertise
      */
     void AddPrefix(Ptr<RadvdPrefix> routerPrefix);
 
     /**
-     * \brief Is send advert enabled (periodic RA and reply to RS) ?
-     * \return send advert flag
+     * @brief Is send advert enabled (periodic RA and reply to RS) ?
+     * @return send advert flag
      */
     bool IsSendAdvert() const;
 
     /**
-     * \brief Set send advert flag.
-     * \param sendAdvert value
+     * @brief Set send advert flag.
+     * @param sendAdvert value
      */
     void SetSendAdvert(bool sendAdvert);
 
     /**
-     * \brief Get maximum RA interval.
-     * \return RA interval (ms)
+     * @brief Get maximum RA interval.
+     * @return RA interval (ms)
      */
     uint32_t GetMaxRtrAdvInterval() const;
 
     /**
-     * \brief Get maximum RA interval.
-     * \param maxRtrAdvInterval RA interval (ms)
+     * @brief Get maximum RA interval.
+     * @param maxRtrAdvInterval RA interval (ms)
      */
     void SetMaxRtrAdvInterval(uint32_t maxRtrAdvInterval);
 
     /**
-     * \brief Get minimum RA interval
-     * \return RA interval (ms)
+     * @brief Get minimum RA interval
+     * @return RA interval (ms)
      */
     uint32_t GetMinRtrAdvInterval() const;
 
     /**
-     * \brief Get minimum RA interval
-     * \param minRtrAdvInterval RA interval (ms).
+     * @brief Get minimum RA interval
+     * @param minRtrAdvInterval RA interval (ms).
      */
     void SetMinRtrAdvInterval(uint32_t minRtrAdvInterval);
 
     /**
-     * \brief Get minimum delay between RAs.
-     * \return minimum delay (ms)
+     * @brief Get minimum delay between RAs.
+     * @return minimum delay (ms)
      */
     uint32_t GetMinDelayBetweenRAs() const;
 
     /**
-     * \brief Set minimum delay between RAs.
-     * \param minDelayBetweenRAs minimum delay (ms)
+     * @brief Set minimum delay between RAs.
+     * @param minDelayBetweenRAs minimum delay (ms)
      */
     void SetMinDelayBetweenRAs(uint32_t minDelayBetweenRAs);
 
     /**
-     * \brief Is managed flag enabled ?
-     * \return managed flag
+     * @brief Is managed flag enabled ?
+     * @return managed flag
      */
     bool IsManagedFlag() const;
 
     /**
-     * \brief Set managed flag
-     * \param managedFlag value
+     * @brief Set managed flag
+     * @param managedFlag value
      */
     void SetManagedFlag(bool managedFlag);
 
     /**
-     * \brief Is "other config" flag enabled ?
-     * \return other config flag
+     * @brief Is "other config" flag enabled ?
+     * @return other config flag
      */
     bool IsOtherConfigFlag() const;
 
     /**
-     * \brief Set "other config" flag
-     * \param otherConfigFlag value
+     * @brief Set "other config" flag
+     * @param otherConfigFlag value
      */
     void SetOtherConfigFlag(bool otherConfigFlag);
 
     /**
-     * \brief Get link MTU.
-     * \return link MTU
+     * @brief Get link MTU.
+     * @return link MTU
      */
     uint32_t GetLinkMtu() const;
 
     /**
-     * \brief Set link MTU.
-     * \param linkMtu link MTU
+     * @brief Set link MTU.
+     * @param linkMtu link MTU
      */
     void SetLinkMtu(uint32_t linkMtu);
 
     /**
-     * \brief Get reachable time.
-     * \return reachable time
+     * @brief Get reachable time.
+     * @return reachable time
      */
     uint32_t GetReachableTime() const;
 
     /**
-     * \brief Set reachable time.
-     * \param reachableTime reachable time
+     * @brief Set reachable time.
+     * @param reachableTime reachable time
      */
     void SetReachableTime(uint32_t reachableTime);
 
     /**
-     * \brief Get default lifetime.
-     * \return default lifetime
+     * @brief Get default lifetime.
+     * @return default lifetime
      */
     uint32_t GetDefaultLifeTime() const;
 
     /**
-     * \brief Set default lifetime.
-     * \param defaultLifeTime default lifetime
+     * @brief Set default lifetime.
+     * @param defaultLifeTime default lifetime
      */
     void SetDefaultLifeTime(uint32_t defaultLifeTime);
 
     /**
-     * \brief Get retransmission timer.
-     * \return retransmission timer
+     * @brief Get retransmission timer.
+     * @return retransmission timer
      */
     uint32_t GetRetransTimer() const;
 
     /**
-     * \brief Set retransmission timer.
-     * \param retransTimer retransmission timer
+     * @brief Set retransmission timer.
+     * @param retransTimer retransmission timer
      */
     void SetRetransTimer(uint32_t retransTimer);
 
     /**
-     * \brief Get current hop limit.
-     * \return current hop limit for the link
+     * @brief Get current hop limit.
+     * @return current hop limit for the link
      */
     uint8_t GetCurHopLimit() const;
 
     /**
-     * \brief Set current hop limit.
-     * \param curHopLimit current hop limit for the link
+     * @brief Set current hop limit.
+     * @param curHopLimit current hop limit for the link
      */
     void SetCurHopLimit(uint8_t curHopLimit);
 
     /**
-     * \brief Get default preference.
-     * \return default preference
+     * @brief Get default preference.
+     * @return default preference
      */
     uint8_t GetDefaultPreference() const;
 
     /**
-     * \brief Set default preference.
-     * \param defaultPreference default preference
+     * @brief Set default preference.
+     * @param defaultPreference default preference
      */
     void SetDefaultPreference(uint8_t defaultPreference);
 
     /**
-     * \brief Is source LLA option should be included in RA ?
-     * \return true if source address is added in RA, false otherwise
+     * @brief Is source LLA option should be included in RA ?
+     * @return true if source address is added in RA, false otherwise
      */
     bool IsSourceLLAddress() const;
 
     /**
-     * \brief Set flag to add or not LLA to RA.
-     * \param sourceLLAddress value
+     * @brief Set flag to add or not LLA to RA.
+     * @param sourceLLAddress value
      */
     void SetSourceLLAddress(bool sourceLLAddress);
 
     /**
-     * \brief Is "home agent" flag enabled ?
-     * \return "home agent" flag
+     * @brief Is "home agent" flag enabled ?
+     * @return "home agent" flag
      */
     bool IsHomeAgentFlag() const;
 
     /**
-     * \brief Set "home agent" flag.
-     * \param homeAgentFlag value
+     * @brief Set "home agent" flag.
+     * @param homeAgentFlag value
      */
     void SetHomeAgentFlag(bool homeAgentFlag);
 
     /**
-     * \brief Is Home Agent Information option should be included in RA ?
-     * \return true if HA information option is added in RA, false otherwise
+     * @brief Is Home Agent Information option should be included in RA ?
+     * @return true if HA information option is added in RA, false otherwise
      */
     bool IsHomeAgentInfo() const;
 
     /**
-     * \brief Set flag to add or not HA information option to RA.
-     * \param homeAgentFlag value
+     * @brief Set flag to add or not HA information option to RA.
+     * @param homeAgentFlag value
      */
     void SetHomeAgentInfo(bool homeAgentFlag);
 
     /**
-     * \brief Get home agent lifetime.
-     * \return home agent lifetime
+     * @brief Get home agent lifetime.
+     * @return home agent lifetime
      */
     uint32_t GetHomeAgentLifeTime() const;
 
     /**
-     * \brief Set home agent lifetime.
-     * \param homeAgentLifeTime home agent lifetime
+     * @brief Set home agent lifetime.
+     * @param homeAgentLifeTime home agent lifetime
      */
     void SetHomeAgentLifeTime(uint32_t homeAgentLifeTime);
 
     /**
-     * \brief Get home agent preference.
-     * \return home agent preference
+     * @brief Get home agent preference.
+     * @return home agent preference
      */
     uint32_t GetHomeAgentPreference() const;
 
     /**
-     * \brief Set home agent preference.
-     * \param homeAgentPreference home agent preference
+     * @brief Set home agent preference.
+     * @param homeAgentPreference home agent preference
      */
     void SetHomeAgentPreference(uint32_t homeAgentPreference);
 
     /**
-     * \brief Is "mobile router support" flag enabled ?
-     * \return "mobile router support" flag
+     * @brief Is "mobile router support" flag enabled ?
+     * @return "mobile router support" flag
      */
     bool IsMobRtrSupportFlag() const;
 
     /**
-     * \brief Set "mobile router support" flag.
-     * \param mobRtrSupportFlag value
+     * @brief Set "mobile router support" flag.
+     * @param mobRtrSupportFlag value
      */
     void SetMobRtrSupportFlag(bool mobRtrSupportFlag);
 
     /**
-     * \brief Is advertisement interval option should be included in RA ?
-     * \return true if advertisement interval option is added in RA, false otherwise
+     * @brief Is advertisement interval option should be included in RA ?
+     * @return true if advertisement interval option is added in RA, false otherwise
      */
     bool IsIntervalOpt() const;
 
     /**
-     * \brief Set flag to add or not advertisement interval to RA.
-     * \param intervalOpt value
+     * @brief Set flag to add or not advertisement interval to RA.
+     * @param intervalOpt value
      */
     void SetIntervalOpt(bool intervalOpt);
 
     /**
-     * \brief Get the last time a RA has been sent.
-     * \returns the last RA send time
+     * @brief Get the last time a RA has been sent.
+     * @returns the last RA send time
      */
     Time GetLastRaTxTime();
 
     /**
-     * \brief Set the last RA send time. It also decrements the initial Rtr Advertisements counter.
-     * \param now the last RA send time
+     * @brief Set the last RA send time. It also decrements the initial Rtr Advertisements counter.
+     * @param now the last RA send time
      */
     void SetLastRaTxTime(Time now);
 
     /**
-     * \brief Checks if the interface is subject to the initial Rtr Advertisements rule.
-     * \returns true if the initial Rtr Advertisements counter is greater than zero.
+     * @brief Checks if the interface is subject to the initial Rtr Advertisements rule.
+     * @returns true if the initial Rtr Advertisements counter is greater than zero.
      */
     bool IsInitialRtrAdv() const;
 
   private:
     /**
-     * \brief Interface to advertise RA.
+     * @brief Interface to advertise RA.
      */
     uint32_t m_interface;
 
     /**
-     * \brief List of prefixes to advertise.
+     * @brief List of prefixes to advertise.
      */
     RadvdPrefixList m_prefixes;
 
     /**
-     * \brief Flag whether or not router sends periodic RA and respond to RS.
+     * @brief Flag whether or not router sends periodic RA and respond to RS.
      */
     bool m_sendAdvert;
 
     /**
-     * \brief Maximum RA interval in milliseconds.
+     * @brief Maximum RA interval in milliseconds.
      */
     uint32_t m_maxRtrAdvInterval;
 
     /**
-     * \brief Minimum RA interval in milliseconds.
+     * @brief Minimum RA interval in milliseconds.
      */
     uint32_t m_minRtrAdvInterval;
 
     /**
-     * \brief Minimum delay between RA in milliseconds.
+     * @brief Minimum delay between RA in milliseconds.
      */
     uint32_t m_minDelayBetweenRAs;
 
     /**
-     * \brief Managed flag. If true host use the stateful protocol for address autoconfiguration.
+     * @brief Managed flag. If true host use the stateful protocol for address autoconfiguration.
      */
     bool m_managedFlag;
 
     /**
-     * \brief Other configuration flag. If true host use stateful protocol for other (non-address)
+     * @brief Other configuration flag. If true host use stateful protocol for other (non-address)
      * information.
      */
     bool m_otherConfigFlag;
 
     /**
-     * \brief Link MTU to use.
+     * @brief Link MTU to use.
      */
     uint32_t m_linkMtu;
 
     /**
-     * \brief Reachable time in milliseconds.
+     * @brief Reachable time in milliseconds.
      */
     uint32_t m_reachableTime;
 
     /**
-     * \brief Retransmission timer in milliseconds.
+     * @brief Retransmission timer in milliseconds.
      */
     uint32_t m_retransTimer;
 
     /**
-     * \brief Current hop limit (TTL).
+     * @brief Current hop limit (TTL).
      */
     uint32_t m_curHopLimit;
 
     /**
-     * \brief Default life time in seconds.
+     * @brief Default life time in seconds.
      */
     uint32_t m_defaultLifeTime;
 
     /**
-     * \brief Preference associated with default router.
+     * @brief Preference associated with default router.
      * 0 = low
      * 1 = medium
      * 2 = high
@@ -392,48 +392,48 @@
     uint8_t m_defaultPreference;
 
     /**
-     * \brief Flag to add link-layer address in RA.
+     * @brief Flag to add link-layer address in RA.
      */
     bool m_sourceLLAddress;
 
     /**
-     * \brief Flag to add HA (home agent) flag in RA.
+     * @brief Flag to add HA (home agent) flag in RA.
      */
     bool m_homeAgentFlag;
 
     /**
-     * \brief Flag to add Home Agent Information option (Mobile IPv6).
+     * @brief Flag to add Home Agent Information option (Mobile IPv6).
      * Currently not implemented.
      */
     bool m_homeAgentInfo;
 
     /**
-     * \brief Home agent lifetime in seconds. Ignored if home agent info is not set.
+     * @brief Home agent lifetime in seconds. Ignored if home agent info is not set.
      */
     uint32_t m_homeAgentLifeTime;
 
     /**
-     * \brief Home agent preference. Ignored if home agent info is not set.
+     * @brief Home agent preference. Ignored if home agent info is not set.
      */
     uint32_t m_homeAgentPreference;
 
     /**
-     * \brief Flag for HA to signals it supports Mobile Router registrations (NEMO Basic).
+     * @brief Flag for HA to signals it supports Mobile Router registrations (NEMO Basic).
      */
     bool m_mobRtrSupportFlag;
 
     /**
-     * \brief Flag to add Advertisement Interval option in RA.
+     * @brief Flag to add Advertisement Interval option in RA.
      */
     bool m_intervalOpt;
 
     /**
-     * \brief Last RA send time.
+     * @brief Last RA send time.
      */
     Time m_lastSendTime;
 
     /**
-     * \brief Number of fast announcement to do
+     * @brief Number of fast announcement to do
      */
     uint8_t m_initialRtrAdvertisementsLeft;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet-apps/model/radvd-prefix.cc ns-3.44/src/internet-apps/model/radvd-prefix.cc
--- ns-3.43/src/internet-apps/model/radvd-prefix.cc	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/internet-apps/model/radvd-prefix.cc	2025-03-09 16:55:49.379371200 -0700
@@ -8,7 +8,7 @@
 
 #include "radvd-prefix.h"
 
-#include <ns3/log.h>
+#include "ns3/log.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet-apps/model/radvd-prefix.h ns-3.44/src/internet-apps/model/radvd-prefix.h
--- ns-3.43/src/internet-apps/model/radvd-prefix.h	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/internet-apps/model/radvd-prefix.h	2025-03-09 16:55:49.379371200 -0700
@@ -18,21 +18,21 @@
 {
 
 /**
- * \ingroup radvd
- * \brief Router prefix for radvd application.
+ * @ingroup radvd
+ * @brief Router prefix for radvd application.
  */
 class RadvdPrefix : public SimpleRefCount<RadvdPrefix>
 {
   public:
     /**
-     * \brief Constructor.
-     * \param network network prefix advertised
-     * \param prefixLength prefix length ( 0 < x <= 128)
-     * \param preferredLifeTime preferred life time in seconds (default 7 days)
-     * \param validLifeTime valid life time in seconds (default 30 days)
-     * \param onLinkFlag on link flag
-     * \param autonomousFlag autonomous link flag
-     * \param routerAddrFlag router address flag (for Mobile IPv6)
+     * @brief Constructor.
+     * @param network network prefix advertised
+     * @param prefixLength prefix length ( 0 < x <= 128)
+     * @param preferredLifeTime preferred life time in seconds (default 7 days)
+     * @param validLifeTime valid life time in seconds (default 30 days)
+     * @param onLinkFlag on link flag
+     * @param autonomousFlag autonomous link flag
+     * @param routerAddrFlag router address flag (for Mobile IPv6)
      */
     RadvdPrefix(Ipv6Address network,
                 uint8_t prefixLength,
@@ -43,127 +43,127 @@
                 bool routerAddrFlag = false);
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~RadvdPrefix();
 
     /**
-     * \brief Get network prefix.
-     * \return network prefix
+     * @brief Get network prefix.
+     * @return network prefix
      */
     Ipv6Address GetNetwork() const;
 
     /**
-     * \brief Set network prefix.
-     * \param network network prefix
+     * @brief Set network prefix.
+     * @param network network prefix
      */
     void SetNetwork(Ipv6Address network);
 
     /**
-     * \brief Get prefix length.
-     * \return prefix length
+     * @brief Get prefix length.
+     * @return prefix length
      */
     uint8_t GetPrefixLength() const;
 
     /**
-     * \brief Set prefix length.
-     * \param prefixLength prefix length
+     * @brief Set prefix length.
+     * @param prefixLength prefix length
      */
     void SetPrefixLength(uint8_t prefixLength);
 
     /**
-     * \brief Get preferred lifetime.
-     * \return lifetime
+     * @brief Get preferred lifetime.
+     * @return lifetime
      */
     uint32_t GetPreferredLifeTime() const;
 
     /**
-     * \brief Set preferred lifetime.
-     * \param preferredLifeTime lifetime
+     * @brief Set preferred lifetime.
+     * @param preferredLifeTime lifetime
      */
     void SetPreferredLifeTime(uint32_t preferredLifeTime);
 
     /**
-     * \brief Get valid lifetime.
-     * \return lifetime
+     * @brief Get valid lifetime.
+     * @return lifetime
      */
     uint32_t GetValidLifeTime() const;
 
     /**
-     * \brief Set valid lifetime.
-     * \param validLifeTime lifetime
+     * @brief Set valid lifetime.
+     * @param validLifeTime lifetime
      */
     void SetValidLifeTime(uint32_t validLifeTime);
 
     /**
-     * \brief Is on-link flag ?
-     * \return true if on-link is activated, false otherwise
+     * @brief Is on-link flag ?
+     * @return true if on-link is activated, false otherwise
      */
     bool IsOnLinkFlag() const;
 
     /**
-     * \brief Set on-link flag.
-     * \param onLinkFlag value
+     * @brief Set on-link flag.
+     * @param onLinkFlag value
      */
     void SetOnLinkFlag(bool onLinkFlag);
 
     /**
-     * \brief Is autonomous flag ?
-     * \return true if autonomous is activated, false otherwise
+     * @brief Is autonomous flag ?
+     * @return true if autonomous is activated, false otherwise
      */
     bool IsAutonomousFlag() const;
 
     /**
-     * \brief Set autonomous flag.
-     * \param autonomousFlag value
+     * @brief Set autonomous flag.
+     * @param autonomousFlag value
      */
     void SetAutonomousFlag(bool autonomousFlag);
 
     /**
-     * \brief Is router address flag ?
-     * \return true if router address is activated, false otherwise
+     * @brief Is router address flag ?
+     * @return true if router address is activated, false otherwise
      */
     bool IsRouterAddrFlag() const;
 
     /**
-     * \brief Set router address flag.
-     * \param routerAddrFlag value
+     * @brief Set router address flag.
+     * @param routerAddrFlag value
      */
     void SetRouterAddrFlag(bool routerAddrFlag);
 
   private:
     /**
-     * \brief Network prefix.
+     * @brief Network prefix.
      */
     Ipv6Address m_network;
 
     /**
-     * \brief Prefix length.
+     * @brief Prefix length.
      */
     uint8_t m_prefixLength;
 
     /**
-     * \brief Preferred time.
+     * @brief Preferred time.
      */
     uint32_t m_preferredLifeTime;
 
     /**
-     * \brief Valid time.
+     * @brief Valid time.
      */
     uint32_t m_validLifeTime;
 
     /**
-     * \brief On link flag, indicates that this prefix can be used for on-link determination.
+     * @brief On link flag, indicates that this prefix can be used for on-link determination.
      */
     bool m_onLinkFlag;
 
     /**
-     * \brief Autonomous flag, it is used for autonomous address configuration (\RFC{2462}).
+     * @brief Autonomous flag, it is used for autonomous address configuration (\RFC{2462}).
      */
     bool m_autonomousFlag;
 
     /**
-     * \brief Router address flag, indicates that router address is sent instead
+     * @brief Router address flag, indicates that router address is sent instead
      * of network prefix as is required by Mobile IPv6.
      */
     bool m_routerAddrFlag;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet-apps/model/v4traceroute.cc ns-3.44/src/internet-apps/model/v4traceroute.cc
--- ns-3.43/src/internet-apps/model/v4traceroute.cc	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/internet-apps/model/v4traceroute.cc	2025-03-09 16:55:49.379371200 -0700
@@ -85,7 +85,7 @@
 }
 
 V4TraceRoute::V4TraceRoute()
-    : m_interval(Seconds(0)),
+    : m_interval(),
       m_size(56),
       m_socket(nullptr),
       m_seq(0),
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet-apps/model/v4traceroute.h ns-3.44/src/internet-apps/model/v4traceroute.h
--- ns-3.43/src/internet-apps/model/v4traceroute.h	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/internet-apps/model/v4traceroute.h	2025-03-09 16:55:49.379371200 -0700
@@ -24,13 +24,13 @@
 class Socket;
 
 /**
- * \ingroup internet-apps
- * \defgroup v4traceroute V4Traceroute
+ * @ingroup internet-apps
+ * @defgroup v4traceroute V4Traceroute
  */
 
 /**
- * \ingroup v4traceroute
- * \brief Traceroute application sends one ICMP ECHO request with TTL=1,
+ * @ingroup v4traceroute
+ * @brief Traceroute application sends one ICMP ECHO request with TTL=1,
  *        and after receiving an ICMP TIME EXCEED reply, it increases the
  *        TTL and repeat the process to reveal all the intermediate hops to
  *        the destination.
@@ -40,15 +40,15 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     V4TraceRoute();
     ~V4TraceRoute() override;
     /**
-     * \brief Prints the application traced routes into a given OutputStream.
-     * \param stream the output stream
+     * @brief Prints the application traced routes into a given OutputStream.
+     * @param stream the output stream
      */
     void Print(Ptr<OutputStreamWrapper> stream);
 
@@ -60,25 +60,25 @@
     void StopApplication() override;
 
     /**
-     * \brief Return the application ID in the node.
-     * \returns the application id
+     * @brief Return the application ID in the node.
+     * @returns the application id
      */
     uint32_t GetApplicationId() const;
     /**
-     * \brief Receive an ICMP Echo
-     * \param socket the receiving socket
+     * @brief Receive an ICMP Echo
+     * @param socket the receiving socket
      *
      * This function is called by lower layers through a callback.
      */
     void Receive(Ptr<Socket> socket);
 
-    /** \brief Send one (ICMP ECHO) to the destination.*/
+    /** @brief Send one (ICMP ECHO) to the destination.*/
     void Send();
 
-    /** \brief Starts a timer after sending an ICMP ECHO.*/
+    /** @brief Starts a timer after sending an ICMP ECHO.*/
     void StartWaitReplyTimer();
 
-    /** \brief Triggers an action if an ICMP TIME EXCEED have not being received
+    /** @brief Triggers an action if an ICMP TIME EXCEED have not being received
      *         in the time defined by StartWaitReplyTimer.
      */
     void HandleWaitReplyTimeout();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet-apps/test/dhcp-test.cc ns-3.44/src/internet-apps/test/dhcp-test.cc
--- ns-3.43/src/internet-apps/test/dhcp-test.cc	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/internet-apps/test/dhcp-test.cc	2025-03-09 16:55:49.379371200 -0700
@@ -21,15 +21,15 @@
 using namespace ns3;
 
 /**
- * \ingroup dhcp
- * \defgroup dhcp-test DHCP module tests
+ * @ingroup dhcp
+ * @defgroup dhcp-test DHCP module tests
  */
 
 /**
- * \ingroup dhcp-test
- * \ingroup tests
+ * @ingroup dhcp-test
+ * @ingroup tests
  *
- * \brief DHCP basic tests
+ * @brief DHCP basic tests
  */
 class DhcpTestCase : public TestCase
 {
@@ -38,8 +38,8 @@
     ~DhcpTestCase() override;
     /**
      * Triggered by an address lease on a client.
-     * \param context The test name.
-     * \param newAddress The leased address.
+     * @param context The test name.
+     * @param newAddress The leased address.
      */
     void LeaseObtained(std::string context, const Ipv4Address& newAddress);
 
@@ -97,8 +97,8 @@
                                                                       Ipv4Address("172.30.0.10"),
                                                                       Ipv4Address("172.30.0.15"),
                                                                       Ipv4Address("172.30.0.17"));
-    dhcpServerApp.Start(Seconds(0.0));
-    dhcpServerApp.Stop(Seconds(20.0));
+    dhcpServerApp.Start(Seconds(0));
+    dhcpServerApp.Stop(Seconds(20));
 
     DynamicCast<DhcpServer>(dhcpServerApp.Get(0))
         ->AddStaticDhcpEntry(devNet.Get(3)->GetAddress(), Ipv4Address("172.30.0.14"));
@@ -109,8 +109,8 @@
     dhcpClientNetDevs.Add(devNet.Get(3));
 
     ApplicationContainer dhcpClientApps = dhcpHelper.InstallDhcpClient(dhcpClientNetDevs);
-    dhcpClientApps.Start(Seconds(1.0));
-    dhcpClientApps.Stop(Seconds(20.0));
+    dhcpClientApps.Start(Seconds(1));
+    dhcpClientApps.Stop(Seconds(20));
 
     dhcpClientApps.Get(0)->TraceConnect("NewLease",
                                         "0",
@@ -122,7 +122,7 @@
                                         "2",
                                         MakeCallback(&DhcpTestCase::LeaseObtained, this));
 
-    Simulator::Stop(Seconds(21.0));
+    Simulator::Stop(Seconds(21));
 
     Simulator::Run();
 
@@ -145,10 +145,10 @@
 }
 
 /**
- * \ingroup dhcp-test
- * \ingroup tests
+ * @ingroup dhcp-test
+ * @ingroup tests
  *
- * \brief DHCP TestSuite
+ * @brief DHCP TestSuite
  */
 class DhcpTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet-apps/test/ipv6-radvd-test.cc ns-3.44/src/internet-apps/test/ipv6-radvd-test.cc
--- ns-3.43/src/internet-apps/test/ipv6-radvd-test.cc	2024-10-09 16:41:09.876655800 -0700
+++ ns-3.44/src/internet-apps/test/ipv6-radvd-test.cc	2025-03-09 16:55:49.379371200 -0700
@@ -21,15 +21,15 @@
 using namespace ns3;
 
 /**
- * \ingroup radvd
- * \defgroup radvd-test radvd tests
+ * @ingroup radvd
+ * @defgroup radvd-test radvd tests
  */
 
 /**
- * \ingroup radvd-test
- * \ingroup tests
+ * @ingroup radvd-test
+ * @ingroup tests
  *
- * \brief radvd basic tests
+ * @brief radvd basic tests
  */
 class RadvdTestCase : public TestCase
 {
@@ -42,10 +42,10 @@
 
     /**
      * Checks the addresses on the selected NetDevices.
-     * \param n0Dev node 0 device
-     * \param r0Dev router device toward node 0
-     * \param r1Dev router device toward node 1
-     * \param n1Dev node 1 device
+     * @param n0Dev node 0 device
+     * @param r0Dev router device toward node 0
+     * @param r1Dev router device toward node 1
+     * @param n1Dev node 1 device
      */
     void CheckAddresses(Ptr<NetDevice> n0Dev,
                         Ptr<NetDevice> r0Dev,
@@ -53,10 +53,10 @@
                         Ptr<NetDevice> n1Dev);
     /**
      * Checks the routing between the selected NetDevices.
-     * \param n0Dev node 0 device
-     * \param r0Dev router device toward node 0
-     * \param r1Dev router device toward node 1
-     * \param n1Dev node 1 device
+     * @param n0Dev node 0 device
+     * @param r0Dev router device toward node 0
+     * @param r1Dev router device toward node 1
+     * @param n1Dev node 1 device
      */
     void CheckRouting(Ptr<NetDevice> n0Dev,
                       Ptr<NetDevice> r0Dev,
@@ -207,8 +207,8 @@
     radvdHelper.GetRadvdInterface(iic2.GetInterfaceIndex(1))->SetSendAdvert(false);
 
     ApplicationContainer radvdApps = radvdHelper.Install(r);
-    radvdApps.Start(Seconds(1.0));
-    radvdApps.Stop(Seconds(10.0));
+    radvdApps.Start(Seconds(1));
+    radvdApps.Stop(Seconds(10));
 
     Simulator::Schedule(Seconds(2),
                         &RadvdTestCase::CheckAddresses,
@@ -225,7 +225,7 @@
                         d2.Get(0),
                         d2.Get(1));
 
-    Simulator::Stop(Seconds(10.0));
+    Simulator::Stop(Seconds(10));
 
     Simulator::Run();
 
@@ -286,10 +286,10 @@
 }
 
 /**
- * \ingroup radvd-test
- * \ingroup tests
+ * @ingroup radvd-test
+ * @ingroup tests
  *
- * \brief radvd TestSuite
+ * @brief radvd TestSuite
  */
 class RadvdTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/internet-apps/test/ping-test.cc ns-3.44/src/internet-apps/test/ping-test.cc
--- ns-3.43/src/internet-apps/test/ping-test.cc	2024-10-09 16:41:09.880655800 -0700
+++ ns-3.44/src/internet-apps/test/ping-test.cc	2025-03-09 16:55:49.379371200 -0700
@@ -64,41 +64,41 @@
 constexpr bool USEIPV6_TRUE = true;
 
 /**
- * \ingroup ping
- * \defgroup ping-test ping tests
+ * @ingroup ping
+ * @defgroup ping-test ping tests
  */
 
 /**
- * \ingroup ping-test
- * \ingroup tests
+ * @ingroup ping-test
+ * @ingroup tests
  *
- * \brief ping basic tests
+ * @brief ping basic tests
  */
 class PingTestCase : public TestCase
 {
   public:
     /**
      * Constructor.
-     * \param name TestCase name.
-     * \param useIpv6 Use IPv6.
+     * @param name TestCase name.
+     * @param useIpv6 Use IPv6.
      */
     PingTestCase(std::string name, bool useIpv6);
 
     /**
      * Set the Simulation stop time.
-     * \param stopTime The simulation stop time.
+     * @param stopTime The simulation stop time.
      */
     void SetSimulatorStopTime(Time stopTime);
 
     /**
      * Set the destination address (either IPv4 or IPv6).
-     * \param address The destination address.
+     * @param address The destination address.
      */
     void SetDestinationAddress(Address address);
 
     /**
      * Set the PING start time.
-     * \param startTime Ping start time.
+     * @param startTime Ping start time.
      */
     void SetStartTime(Time startTime)
     {
@@ -107,7 +107,7 @@
 
     /**
      * Set the PING stop time.
-     * \param stopTime Ping stop time.
+     * @param stopTime Ping stop time.
      */
     void SetStopTime(Time stopTime)
     {
@@ -116,7 +116,7 @@
 
     /**
      * Set the number of pings to send.
-     * \param count Number of pings to send.
+     * @param count Number of pings to send.
      */
     void SetCount(uint32_t count)
     {
@@ -125,7 +125,7 @@
 
     /**
      * Set the size of pings.
-     * \param size Size of pings.
+     * @param size Size of pings.
      */
     void SetSize(uint32_t size)
     {
@@ -134,7 +134,7 @@
 
     /**
      * Set the interval of pings.
-     * \param interval Interval of pings.
+     * @param interval Interval of pings.
      */
     void SetInterval(Time interval)
     {
@@ -143,7 +143,7 @@
 
     /**
      * Set the packet drop list on the Ping node's interface
-     * \param dropList packet drop list
+     * @param dropList packet drop list
      */
     void SetDropList(const std::list<uint32_t>& dropList)
     {
@@ -152,37 +152,37 @@
 
     /**
      * Enable the check on Tx pings counted in Tx trace source.
-     * \param expectedTx Expected Tx.
+     * @param expectedTx Expected Tx.
      */
     void CheckTraceTx(uint32_t expectedTx);
 
     /**
      * Enable the check on Rtt event count in Rtt trace source.
-     * \param expectedRtt Expected Rtt.
+     * @param expectedRtt Expected Rtt.
      */
     void CheckTraceRtt(uint32_t expectedRtt);
 
     /**
      * Enable the check on Tx pings.
-     * \param expectedReportTx Expected Tx.
+     * @param expectedReportTx Expected Tx.
      */
     void CheckReportTransmitted(uint32_t expectedReportTx);
 
     /**
      * Enable the check on Rx pings.
-     * \param expectedReportRx Expected Rx.
+     * @param expectedReportRx Expected Rx.
      */
     void CheckReportReceived(uint32_t expectedReportRx);
 
     /**
      * Enable the check on Lost pings.
-     * \param expectedReportLoss Expected Lost.
+     * @param expectedReportLoss Expected Lost.
      */
     void CheckReportLoss(uint16_t expectedReportLoss);
 
     /**
      * Enable the check on average RTT.
-     * \param expectedTime Expected RTT.
+     * @param expectedTime Expected RTT.
      */
     void CheckReportTime(Time expectedTime);
 
@@ -193,28 +193,28 @@
 
     /**
      * Trace TX events.
-     * \param seq Sequence number.
-     * \param p Tx packet.
+     * @param seq Sequence number.
+     * @param p Tx packet.
      */
     void TxTraceSink(uint16_t seq, Ptr<Packet> p);
 
     /**
      * Trace RTT events.
-     * \param seq Sequence number.
-     * \param rttSample RTT sample.
+     * @param seq Sequence number.
+     * @param rttSample RTT sample.
      */
     void RttTraceSink(uint16_t seq, Time rttSample);
 
     /**
      * Trace Drop events.
-     * \param seq Sequence number.
-     * \param reason Drop reason.
+     * @param seq Sequence number.
+     * @param reason Drop reason.
      */
     void DropTraceSink(uint16_t seq, Ping::DropReason reason);
 
     /**
      * Trace Report generation events.
-     * \param report The report sample.
+     * @param report The report sample.
      */
     void ReportTraceSink(const Ping::PingReport& report);
 
@@ -242,13 +242,13 @@
     bool m_checkReportLoss{false};        //!< Set to true to check the Loss number
     bool m_checkReportTime{false};        //!< Set to true to check the Time
 
-    Time m_startTime{Seconds(1)};             //!< Start time
-    Time m_stopTime{Seconds(5)};              //!< Stop time
-    Time m_simulatorStopTime{Seconds(6)};     //!< Simulator stop time
-    bool m_useIpv6{false};                    //!< Use IPv6 (true) or IPv4 (false)
-    Time m_interpacketInterval{Seconds(1.0)}; //!< Time between pings
-    Time m_lastTx;                            //!< Last ping Tx time
-    std::list<uint32_t> m_dropList;           //!< Drop first reply (true)
+    Time m_startTime{Seconds(1)};           //!< Start time
+    Time m_stopTime{Seconds(5)};            //!< Stop time
+    Time m_simulatorStopTime{Seconds(6)};   //!< Simulator stop time
+    bool m_useIpv6{false};                  //!< Use IPv6 (true) or IPv4 (false)
+    Time m_interpacketInterval{Seconds(1)}; //!< Time between pings
+    Time m_lastTx;                          //!< Last ping Tx time
+    std::list<uint32_t> m_dropList;         //!< Drop first reply (true)
 
     NodeContainer m_nodes;                   //!< The simulation nodes
     Ipv4InterfaceContainer m_ipv4Interfaces; //!< The IPv4 interfaces
@@ -381,7 +381,7 @@
 {
     NS_LOG_FUNCTION(this << seq << p);
     m_countTraceTx++;
-    if (m_lastTx == Seconds(0))
+    if (m_lastTx.IsZero())
     {
         m_lastTx = Simulator::Now();
     }
@@ -544,10 +544,10 @@
 }
 
 /**
- * \ingroup ping-test
- * \ingroup tests
+ * @ingroup ping-test
+ * @ingroup tests
  *
- * \brief ping TestSuite
+ * @brief ping TestSuite
  */
 class PingTestSuite : public TestSuite
 {
@@ -671,7 +671,7 @@
     //                     The number sent (2) is equal to number received (2)
     // How validated:  PingReport trace is checked for number of packets
     //                 transmitted (2) and received (2), and number of drops (0)
-    Time interval = Seconds(3.0);
+    Time interval = Seconds(3);
     auto testcase4v4 =
         new PingTestCase("4. Test for the operation of interval attribute for IPv4", USEIPV6_FALSE);
     testcase4v4->SetStartTime(Seconds(1));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/doc/lr-wpan.rst ns-3.44/src/lr-wpan/doc/lr-wpan.rst
--- ns-3.43/src/lr-wpan/doc/lr-wpan.rst	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/lr-wpan/doc/lr-wpan.rst	2025-03-09 16:55:49.419371100 -0700
@@ -2,15 +2,18 @@
 .. highlight:: cpp
 .. highlight:: bash
 
-PageBreak
-
-Low-Rate Wireless Personal Area Network (LR-WPAN)
-=================================================
+IEEE 802.15.4: Low-Rate Wireless Personal Area Network (LR-WPAN)
+================================================================
 
 This chapter describes the implementation of |ns3| models for the
 low-rate, wireless personal area network (LR-WPAN) as specified by
-IEEE standard 802.15.4 (2003,2006,2011). Both beacon and non-beacon modes are
-supported. Bootstrap (scan and association) is also supported.
+IEEE standard 802.15.4 (2003,2006,2011). The current emphasis is on direct transmissions running on both,
+slotted and unslotted mode (CSMA/CA) of IEEE 802.15.4 operation for use in Zigbee (TM) and 6loWPAN networks.
+
+Both beacon and non-beacon modes are supported as well as the bootstrap mechanism (scan and association).
+
+In general, this document describes what is modeled and how it is modeled; the following section Scope and
+Limitations provides more details about what is not covered or what is missing in the model.
 
 The model is implemented into the ``src/lrwpan/`` folder.
 
@@ -107,10 +110,32 @@
 
 For more information on primitives, See IEEE 802.15.4-2011, Table 8.
 
-Although it is expected that other technology profiles (such as
-6LoWPAN and ZigBee) will write their own NetDevice classes, a basic
-LrWpanNetDevice is provided, which encapsulates the common operations
-of creating a generic LrWpan device and hooking things together.
+In addition, this module provides a configuration for connecting various components.
+The current design of the ``LrWpanNetDevice`` allows for the configuration of different instances of ``LrWpanMac``, which can only be set before the initialization of the NetDevice.
+This design can be extended in the future to support other subclasses of ``LrWpanMacBase``, enabling the configuration of different types of MAC layers using the same ``LrWpanNetDevice``.
+
+The ``LrWpanNetDevice`` presented in this module is intended to be used with other technology profiles, such as the 6LoWPAN and ZigBee stack.
+
+
+
+
+Scope and Limitations
+---------------------
+
+- Indirect data transmissions are not supported but planned for a future update.
+- Devices are capable of associating with a single PAN coordinator.
+- Interference is modeled as AWGN but this is currently not thoroughly tested.
+- The standard describes the support of multiple PHY band-modulations but currently, only 250kbps O-QPSK (channel page 0) is supported.
+- Active and passive MAC scans are able to obtain a LQI value from a beacon frame, however, the scan primitives assumes LQI is correctly implemented and does not check the validity of its value.
+- Configuration of the ED thresholds are currently not supported.
+- Coordinator realignment command is only supported in orphan scans.
+- Disassociation primitives are not supported.
+- Security is not supported.
+- Guaranteed Time Slots (GTS) are not supported.
+- Not all attributes are supported by the MLME-SET and MLME-GET primitives.
+- Indirect transmissions are only supported during the association process.
+- RSSI is not supported as this is part of the 2015 revision and the current implementation only supports until the 2011 revision.
+- PHY and MAC are currently not supported by the attribute system. To change the behavior of the PHY and MAC the standard SET primitives (e.g. MLME-SET.request) must be used.
 
 The PHY layer
 -------------
@@ -204,18 +229,18 @@
 by an association request but these can be used independently.
 |ns3| IEEE 802.15.4 MAC layer supports 4 types of scanning:
 
-* *Energy Detection (ED) Scan:* In an energy scan, a device or a coordinator scan a set number of channels looking for traces of energy. The maximum energy registered during a given amount of time is stored. Energy scan is typically used to measure the quality of a channel at any given time. For this reason, coordinators often use this scan before initiating a PAN on a channel.
+* **Energy Detection (ED) Scan:** In an energy scan, a device or a coordinator scan a set number of channels looking for traces of energy. The maximum energy registered during a given amount of time is stored. Energy scan is typically used to measure the quality of a channel at any given time. For this reason, coordinators often use this scan before initiating a PAN on a channel.
 
-* *Active Scan:* A device sends ``beacon request commands`` on a set number of channels looking for a PAN coordinator. The receiving coordinator must be configured on non-beacon mode. Coordinators on beacon-mode ignore these requests. The coordinators who accept the request, respond with a beacon. After an active scan take place, during the association process devices extract the information in the PAN descriptors from the collected beacons and based on this information (e.g. channel, LQI level), choose a coordinator to associate with.
+* **Active Scan:** A device sends ``beacon request commands`` on a set number of channels looking for a PAN coordinator. The receiving coordinator must be configured on non-beacon mode. Coordinators on beacon-mode ignore these requests. The coordinators who accept the request, respond with a beacon. After an active scan take place, during the association process devices extract the information in the PAN descriptors from the collected beacons and based on this information (e.g. channel, LQI level), choose a coordinator to associate with.
 
-* *Passive Scan:* In a passive scan, no ``beacon requests commands`` are sent. Devices scan a set number of channels looking for beacons currently being transmitted (coordinators in beacon-mode). Like in the active scan, the information from beacons is stored in PAN descriptors and used by the device to choose a coordinator to associate with.
+* **Passive Scan:** In a passive scan, no ``beacon requests commands`` are sent. Devices scan a set number of channels looking for beacons currently being transmitted (coordinators in beacon-mode). Like in the active scan, the information from beacons is stored in PAN descriptors and used by the device to choose a coordinator to associate with.
 
-* *Orphan Scan:* Orphan scan is used typically by device as a result of repeated communication failure attempts with a coordinator. In other words, an orphan scan represents the intent of a device to relocate its coordinator. In some situations, it can be used by devices higher layers to not only rejoin a network but also join a network for the first time. In an orphan scan, a device send a ``orphan notification command`` to a given list of channels. If a coordinator receives this notification, it responds to the device with a ``coordinator realignment command``.
+* **Orphan Scan:** Orphan scan is used typically by device as a result of repeated communication failure attempts with a coordinator. In other words, an orphan scan represents the intent of a device to relocate its coordinator. In some situations, it can be used by devices higher layers to not only rejoin a network but also join a network for the first time. In an orphan scan, a device send a ``orphan notification command`` to a given list of channels. If a coordinator receives this notification, it responds to the device with a ``coordinator realignment command``.
 
 In active and passive scans, the link quality indicator (LQI) is the main parameter used to
 determine the optimal coordinator. LQI values range from 0 to 255. Where 255 is the highest quality link value and 0 the lowest. Typically, a link lower than 127 is considered a link with poor quality.
 
-In LR-WPAN, association is used to join  PANs. All devices in LR-WPAN must belong to a PAN to communicate. |ns3| uses a classic association procedure described in the standard. The standard also covers a more effective association procedure known as fast association (See IEEE 802.15.4-2015, fastA) but this association is currently not supported by |ns3|. Alternatively, |ns3| can do a "quick and dirty" association using either ```LrWpanHelper::AssociateToPan``` or ```LrWpanHelper::AssociateToBeaconPan```. These functions are used when a preset association can be done. For example, when the relationships between existing nodes and coordinators are known and can be set before the beginning of the simulation. In other situations, like in many networks in real deployments or in large networks, it is desirable that devices "associate themselves" with the best possible available coordinator candidates. This is a process known as bootstrap, and simulating this process makes it possible to demonstrate the kind of situations a node would face in which large networks to associate in real environment.
+In LR-WPAN, association is used to join PANs. All devices in LR-WPAN must belong to a PAN to communicate. |ns3| uses a classic association procedure described in the standard. The standard also covers a more effective association procedure known as fast association (See IEEE 802.15.4-2015, fastA) but this association is currently not supported by |ns3|. Alternatively, |ns3| can do a "quick and dirty" association using either ```LrWpanHelper::AssociateToPan``` or ```LrWpanHelper::AssociateToBeaconPan```. These functions are used when a preset association can be done. For example, when the relationships between existing nodes and coordinators are known and can be set before the beginning of the simulation. In other situations, like in many networks in real deployments or in large networks, it is desirable that devices "associate themselves" with the best possible available coordinator candidates. This is a process known as bootstrap, and simulating this process makes it possible to demonstrate the kind of situations a node would face in which large networks to associate in real environment.
 
 Bootstrap (a.k.a. network initialization) is possible with a combination of scan and association MAC primitives. Details on the general process for this network initialization is described in the standard. Bootstrap is a complex process that not only requires the scanning networks, but also the exchange of command frames and the use of a pending transaction list (indirect transmissions) in the coordinator to store command frames. The following summarizes the whole process:
 
@@ -226,17 +251,23 @@
 Bootstrap as whole depends on procedures that also take place on higher layers of devices and coordinators. These procedures are briefly described in the standard but out of its scope (See IEE 802.15.4-2011 Section 5.1.3.1.). However, these procedures are necessary for a "complete bootstrap" process. In the examples in |ns3|, these high layer procedures are only briefly implemented to demonstrate a complete example that shows the use of scan and association. A full high layer (e.g. such as those found in Zigbee and Thread protocol stacks) should complete these procedures more robustly.
 Examples such as  ``lr-wpan-bootstrap.cc`` demonstrate the whole bootstrap process (including scanning and association) while doing some place holder of procedures that take place in higher layers which are not part of standard focus.
 
-A key element to remember is that bootstrap have 2 key objectives:
+A key element to remember is that bootstrap have 2 objectives:
 
-1- Enable devices to join a new formed network (associate).
-2- Assign short addresses and PAN ID.
+1. Enable devices to join a new formed network (associate).
+2. Assign short addresses and PAN ID.
 
 Devices that have the short address ``FF:FF`` are not associated an cannot participate in any unicast communication in the network.
 Devices that have the short address ``FF:FE`` and have a valid PAN ID can communicate with other devices in the network using the
 extended address mode. In this mode, devices will use its 64 bit address (A.K.A. extended address) to communicate in the network.
 
-A fixed association is possible in |ns3| without the use of the bootstrap process. For this purpose, the ``LrWpanHelper::CreateAssociatedPan``
-is used.
+Before ns-3.44, the MAC association struggled to handle scenarios where the association response command arrived before the acknowledgment (ACK)
+for a data request command. This issue could arise in saturated networks and is caused by a delayed data request command ACK
+(which do not use CSMA/CA but can be retried several times if necessary). This situation highlighted a problem and a design flaw in the original standard, where association responses
+are sent immediately after sending a data request acknowledgments. As a result, their arrival could become inverted. However,
+the current MAC implementation is now capable of correctly reacting to this delayed ACK issue.
+
+Finally, a fixed association is possible in |ns3| without the use of the bootstrap process. For this purpose, the ``LrWpanHelper::CreateAssociatedPan``
+is used. See the Helpers subsection for more details.
 
 MAC transmission Queues
 ~~~~~~~~~~~~~~~~~~~~~~~
@@ -327,13 +358,22 @@
     lrWpanHelper.CreateAssociatedPan(lrwpanDevices, 0xCAFE);
     NetDeviceContainer lrwpanDevices = lrWpanHelper.Install(nodes);
 
-In the example shown above, the function ``CreateAssociatedPan`` forms a star topology PAN with devices sharing the same PAN ID (0xCAFE).
-Devices are assigned both 64 bit addresses (extended addresses) and 16 bit addresses (short addresses). The first node is assigned the
-role of PAN coordinator. Number of nodes are limited by the number of possible assignable short addresses ([00:01]-[FF:FD]).
+In the example shown above, the function ``CreateAssociatedPan`` forms a star topology PAN with devices sharing the same PAN ID (In the example 0xCAFE).
+Devices are assigned both 64 bit addresses (extended addresses) and 16 bit addresses (short addresses) and can use either to communicate
+when the configuration is completed. The first node in the ``NodeContainer`` is assigned the role of PAN coordinator.
+The number of nodes provided to the helper are limited by the number of possible assignable short addresses ([00:01]-[FF:FD]).
+
+It is also possible to manually assign the PAN ID, the extended address and the short address without the use of a helper. To know how to do this,
+refer to the ``lr-wpan-data.cc`` example.
+
+For more complex topologies an auto-configured address assignation scheme is recommended,
+the bootstrap process (scan and association) described by the standard can help with this.
 
-For more complex topologies or a more robust address assignation scheme, the bootstrap process is recommended.
+**Important:** Devices that does not have short addresses assigned (Any address other than ``FF:FF``) on PAN IDs cannot communicate in lr-wpan network. Make sure both
+are present in your simulated devices using any of the schemes described.
 
-The helper can be used to generate pcap or ascii traces.
+
+Finally, the ``LrWpanHelper`` can be used to generate pcap or ascii traces.
 These pcap files can be later on visualized in Wireshark.
 
 ::
@@ -344,8 +384,59 @@
     Ptr<OutputStreamWrapper> stream = ascii.CreateFileStream("lr-wpan-data.tr");
     lrWpanHelper.EnableAsciiAll(stream);
 
-Examples
-~~~~~~~~
+Attributes
+~~~~~~~~~~
+
+The following is a list of attributes used to configure the behavior of the PHY layer:
+
+* ``PostReceptionErrorModel``: An optional packet error model can be added to the receive packet process after any propagation-based (SNR-based) error models have been applied. Typically this is used to force specific packet drops, for testing purposes.
+
+
+The following is a list of attributes that can be set directly to configure the
+general behavior of the **MAC layer**. Most of this attributes have a counter part with
+the PIB attributes and constants described by the standard.
+
+* ``PanId``: Set the 16-bit identifier of the associated PAN.
+
+Traces
+~~~~~~
+
+
+The following is a list of the trace source that can be used to monitor the behavior of the **PHY layer**:
+
+* ``TrxStateValue``: The state of the finit state machine of the PHY.
+* ``TrxState``: The state of the transceiver.
+* ``PhyTxBegin``: Indicates that a packet has begun transmitting over the channel medium.
+* ``PhyTxEnd``: Indicates that a packet has been completely transmitted over the channel.
+* ``PhyTxDrop``: Indicates that a packet has been dropped by the device during transmission.
+* ``PhyRxBegin``: Indicates that a packet has begun being received from the channel medium by the receiver.
+* ``PhyRxEnd``: Indicates that a packet has been completely received from the channel medium.
+* ``PhyRxDrop``: Indicates that a packet has been dropped by the device during reception.
+
+The following is a list of the trace sources that can be used to monitor the behavior of the **MAC layer**:
+
+* ``MacTxEnqueue``: Trace source indicating a packet has been enqueued in the transaction queue.
+* ``MacTxDequeue``: Trace source indicating a packet has was dequeued from the transaction queue.
+* ``MacIndTxEnqueue``: Trace source indicating a packet has been enqueued in the indirect transaction queue.
+* ``MacIndTxDequeue``: Trace source indicating a packet has was dequeued from the indirect transaction queue.
+* ``MacTx``: Trace source indicating a packet has arrived for transmission by this device.
+* ``MacTxOk``: Trace source indicating a packet has been successfully sent.
+* ``MacTxDrop``: Trace source indicating a packet has been dropped during transmission.
+* ``MacIndTxDrop``: Trace source indicating a packet has been dropped from the indirect transaction queue (The pending transaction list).
+* ``MacPromiscRx``: A packet has been received by this device, has been passed up from the physical layer and is being forwarded up the local protocol stack.
+* ``MacRx``: A packet has been received by this device, has been passed up from the physical layer and is being forwarded up the local protocol stack.
+* ``MacRxDrop``: Trace source indicating a packet was received, but dropped before being forwarded up the stack.
+* ``Sniffer``: Trace source simulating a non-promiscuous packet sniffer attached to the device.
+* ``PromiscSniffer``: Trace source simulating a promiscuous packet sniffer attached to the device.
+* ``MacStateValue``: Shows the current state of LrWpan MAC layer.
+* ``MacIncSuperframeStatus``: When using the beacon mode, shows the period status of the incoming superframe.
+* ``MacOutSuperframeStatus``: When using the beacon mode, shows the period status of the outgoing superframe.
+* ``MacState``: The state of LrWpan Mac.
+* ``MacSentPkt``: Trace source reporting some information about the sent packet.
+* ``IfsEnd``: Reports the end of an Interframe space period (IFS).
+
+Examples and Tests
+------------------
 
 The following examples have been written, which can be found in ``src/lr-wpan/examples/``:
 
@@ -394,9 +485,6 @@
 
     Default output of the program ``lr-wpan-error-distance-plot.cc``
 
-Tests
-~~~~~
-
 The following tests have been written, which can be found in ``src/lr-wpan/tests/``:
 
 * ``lr-wpan-ack-test.cc``:  Check that acknowledgments are being used and issued in the correct order.
@@ -432,28 +520,6 @@
 
     Default output of the program ``lr-wpan-error-model-plot.cc``
 
-
-Scope and Limitations
----------------------
-
-Future versions of this document will contain a PICS proforma similar to
-Appendix D of IEEE 802.15.4-2006. The current emphasis is on direct transmissions
-running on both, slotted and unslotted mode (CSMA/CA) of 802.15.4 operation for use in Zigbee.
-
-- Indirect data transmissions are not supported but planned for a future update.
-- Devices are capable of associating with a single PAN coordinator.
-- Interference is modeled as AWGN but this is currently not thoroughly tested.
-- The standard describes the support of multiple PHY band-modulations but currently, only 250kbps O-QPSK (channel page 0) is supported.
-- Active and passive MAC scans are able to obtain a LQI value from a beacon frame, however, the scan primitives assumes LQI is correctly implemented and does not check the validity of its value.
-- Configuration of the ED thresholds are currently not supported.
-- Coordinator realignment command is only supported in orphan scans.
-- Disassociation primitives are not supported.
-- Security is not supported.
-- Guaranteed Time Slots (GTS) are not supported.
-- Not all attributes are supported by the MLME-SET and MLME-GET primitives.
-- Indirect transmissions are only supported during the association process.
-- RSSI is not supported as this is part of the 2015 revision and the current implementation only supports until the 2011 revision.
-
 References
 ----------
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/examples/lr-wpan-active-scan.cc ns-3.44/src/lr-wpan/examples/lr-wpan-active-scan.cc
--- ns-3.43/src/lr-wpan/examples/lr-wpan-active-scan.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/lr-wpan/examples/lr-wpan-active-scan.cc	2025-03-09 16:55:49.419371100 -0700
@@ -28,15 +28,15 @@
  * Typically, a value below 127 is considered a link with poor quality.
  */
 
-#include <ns3/constant-position-mobility-model.h>
-#include <ns3/core-module.h>
-#include <ns3/log.h>
-#include <ns3/lr-wpan-module.h>
-#include <ns3/packet.h>
-#include <ns3/propagation-delay-model.h>
-#include <ns3/propagation-loss-model.h>
-#include <ns3/simulator.h>
-#include <ns3/single-model-spectrum-channel.h>
+#include "ns3/constant-position-mobility-model.h"
+#include "ns3/core-module.h"
+#include "ns3/log.h"
+#include "ns3/lr-wpan-module.h"
+#include "ns3/packet.h"
+#include "ns3/propagation-delay-model.h"
+#include "ns3/propagation-loss-model.h"
+#include "ns3/simulator.h"
+#include "ns3/single-model-spectrum-channel.h"
 
 #include <iostream>
 
@@ -144,7 +144,7 @@
     params.m_sfrmOrd = 15;
     params.m_logCh = 12;
     Simulator::ScheduleWithContext(1,
-                                   Seconds(2.0),
+                                   Seconds(2),
                                    &LrWpanMac::MlmeStartRequest,
                                    coord1NetDevice->GetMac(),
                                    params);
@@ -158,7 +158,7 @@
     params2.m_sfrmOrd = 15;
     params2.m_logCh = 14;
     Simulator::ScheduleWithContext(2,
-                                   Seconds(2.0),
+                                   Seconds(2),
                                    &LrWpanMac::MlmeStartRequest,
                                    coord2NetDevice->GetMac(),
                                    params2);
@@ -175,7 +175,7 @@
     scanParams.m_scanDuration = 14;
     scanParams.m_scanType = MLMESCAN_ACTIVE;
     Simulator::ScheduleWithContext(1,
-                                   Seconds(3.0),
+                                   Seconds(3),
                                    &LrWpanMac::MlmeScanRequest,
                                    endNodeNetDevice->GetMac(),
                                    scanParams);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/examples/lr-wpan-bootstrap.cc ns-3.44/src/lr-wpan/examples/lr-wpan-bootstrap.cc
--- ns-3.43/src/lr-wpan/examples/lr-wpan-bootstrap.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/lr-wpan/examples/lr-wpan-bootstrap.cc	2025-03-09 16:55:49.419371100 -0700
@@ -27,13 +27,13 @@
  * complete.
  */
 
-#include <ns3/core-module.h>
-#include <ns3/lr-wpan-module.h>
-#include <ns3/mobility-module.h>
-#include <ns3/netanim-module.h>
-#include <ns3/network-module.h>
-#include <ns3/propagation-module.h>
-#include <ns3/spectrum-module.h>
+#include "ns3/core-module.h"
+#include "ns3/lr-wpan-module.h"
+#include "ns3/mobility-module.h"
+#include "ns3/netanim-module.h"
+#include "ns3/network-module.h"
+#include "ns3/propagation-module.h"
+#include "ns3/spectrum-module.h"
 
 #include <iostream>
 
@@ -442,7 +442,7 @@
     params.m_logCh = 12;
 
     Simulator::ScheduleWithContext(coor1Device->GetNode()->GetId(),
-                                   Seconds(2.0),
+                                   Seconds(2),
                                    &LrWpanMac::MlmeStartRequest,
                                    coor1Device->GetMac(),
                                    params);
@@ -456,7 +456,7 @@
     params2.m_logCh = 14;
 
     Simulator::ScheduleWithContext(coor2Device->GetNode()->GetId(),
-                                   Seconds(2.0),
+                                   Seconds(2),
                                    &LrWpanMac::MlmeStartRequest,
                                    coor2Device->GetMac(),
                                    params2);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/examples/lr-wpan-data.cc ns-3.44/src/lr-wpan/examples/lr-wpan-data.cc
--- ns-3.43/src/lr-wpan/examples/lr-wpan-data.cc	2024-10-09 16:41:09.896656000 -0700
+++ ns-3.44/src/lr-wpan/examples/lr-wpan-data.cc	2025-03-09 16:55:49.419371100 -0700
@@ -13,15 +13,15 @@
  * Trace Phy state changes, and Mac DataIndication and DataConfirm events
  * to stdout
  */
-#include <ns3/constant-position-mobility-model.h>
-#include <ns3/core-module.h>
-#include <ns3/log.h>
-#include <ns3/lr-wpan-module.h>
-#include <ns3/packet.h>
-#include <ns3/propagation-delay-model.h>
-#include <ns3/propagation-loss-model.h>
-#include <ns3/simulator.h>
-#include <ns3/single-model-spectrum-channel.h>
+#include "ns3/constant-position-mobility-model.h"
+#include "ns3/core-module.h"
+#include "ns3/log.h"
+#include "ns3/lr-wpan-module.h"
+#include "ns3/packet.h"
+#include "ns3/propagation-delay-model.h"
+#include "ns3/propagation-loss-model.h"
+#include "ns3/simulator.h"
+#include "ns3/single-model-spectrum-channel.h"
 
 #include <iostream>
 
@@ -30,8 +30,8 @@
 
 /**
  * Function called when a Data indication is invoked
- * \param params MCPS data indication parameters
- * \param p packet
+ * @param params MCPS data indication parameters
+ * @param p packet
  */
 static void
 DataIndication(McpsDataIndicationParams params, Ptr<Packet> p)
@@ -41,7 +41,7 @@
 
 /**
  * Function called when a Data confirm is invoked
- * \param params MCPS data confirm parameters
+ * @param params MCPS data confirm parameters
  */
 static void
 DataConfirm(McpsDataConfirmParams params)
@@ -51,10 +51,10 @@
 
 /**
  * Function called when a the PHY state changes
- * \param context context
- * \param now time at which the function is called
- * \param oldState old PHY state
- * \param newState new PHY state
+ * @param context context
+ * @param now time at which the function is called
+ * @param oldState old PHY state
+ * @param newState new PHY state
  */
 static void
 StateChangeNotification(std::string context,
@@ -196,7 +196,7 @@
     params.m_txOptions = TX_OPTION_ACK;
     //  dev0->GetMac ()->McpsDataRequest (params, p0);
     Simulator::ScheduleWithContext(1,
-                                   Seconds(0.0),
+                                   Seconds(0),
                                    &LrWpanMac::McpsDataRequest,
                                    dev0->GetMac(),
                                    params,
@@ -213,7 +213,7 @@
         params.m_dstExtAddr = Mac64Address("00:00:00:00:00:00:00:01");
     }
     Simulator::ScheduleWithContext(2,
-                                   Seconds(2.0),
+                                   Seconds(2),
                                    &LrWpanMac::McpsDataRequest,
                                    dev1->GetMac(),
                                    params,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/examples/lr-wpan-ed-scan.cc ns-3.44/src/lr-wpan/examples/lr-wpan-ed-scan.cc
--- ns-3.43/src/lr-wpan/examples/lr-wpan-ed-scan.cc	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/examples/lr-wpan-ed-scan.cc	2025-03-09 16:55:49.419371100 -0700
@@ -28,15 +28,15 @@
  * ED range: 0 - 255
  */
 
-#include <ns3/constant-position-mobility-model.h>
-#include <ns3/core-module.h>
-#include <ns3/log.h>
-#include <ns3/lr-wpan-module.h>
-#include <ns3/packet.h>
-#include <ns3/propagation-delay-model.h>
-#include <ns3/propagation-loss-model.h>
-#include <ns3/simulator.h>
-#include <ns3/single-model-spectrum-channel.h>
+#include "ns3/constant-position-mobility-model.h"
+#include "ns3/core-module.h"
+#include "ns3/log.h"
+#include "ns3/lr-wpan-module.h"
+#include "ns3/packet.h"
+#include "ns3/propagation-delay-model.h"
+#include "ns3/propagation-loss-model.h"
+#include "ns3/simulator.h"
+#include "ns3/single-model-spectrum-channel.h"
 
 #include <iostream>
 
@@ -122,7 +122,7 @@
     params.m_sfrmOrd = 3;
     params.m_logCh = 12;
     Simulator::ScheduleWithContext(1,
-                                   Seconds(2.0),
+                                   Seconds(2),
                                    &LrWpanMac::MlmeStartRequest,
                                    dev0->GetMac(),
                                    params);
@@ -135,7 +135,7 @@
     params2.m_sfrmOrd = 3;
     params2.m_logCh = 14;
     Simulator::ScheduleWithContext(1,
-                                   Seconds(2.0),
+                                   Seconds(2),
                                    &LrWpanMac::MlmeStartRequest,
                                    dev2->GetMac(),
                                    params2);
@@ -152,7 +152,7 @@
     scanParams.m_scanDuration = 14;
     scanParams.m_scanType = MLMESCAN_ED;
     Simulator::ScheduleWithContext(1,
-                                   Seconds(2.0),
+                                   Seconds(2),
                                    &LrWpanMac::MlmeScanRequest,
                                    dev1->GetMac(),
                                    scanParams);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/examples/lr-wpan-error-distance-plot.cc ns-3.44/src/lr-wpan/examples/lr-wpan-error-distance-plot.cc
--- ns-3.43/src/lr-wpan/examples/lr-wpan-error-distance-plot.cc	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/examples/lr-wpan-error-distance-plot.cc	2025-03-09 16:55:49.419371100 -0700
@@ -25,28 +25,28 @@
    ./ns3 run "lr-wpan-error-distance-plot --txPower= 0 --rxSensitivity=-92"
 
 */
-#include <ns3/abort.h>
-#include <ns3/callback.h>
-#include <ns3/command-line.h>
-#include <ns3/constant-position-mobility-model.h>
-#include <ns3/gnuplot.h>
-#include <ns3/log.h>
-#include <ns3/lr-wpan-error-model.h>
-#include <ns3/lr-wpan-mac.h>
-#include <ns3/lr-wpan-net-device.h>
-#include <ns3/lr-wpan-spectrum-value-helper.h>
-#include <ns3/mac16-address.h>
-#include <ns3/multi-model-spectrum-channel.h>
-#include <ns3/net-device.h>
-#include <ns3/node.h>
-#include <ns3/nstime.h>
-#include <ns3/packet.h>
-#include <ns3/propagation-loss-model.h>
-#include <ns3/simulator.h>
-#include <ns3/single-model-spectrum-channel.h>
-#include <ns3/spectrum-value.h>
-#include <ns3/test.h>
-#include <ns3/uinteger.h>
+#include "ns3/abort.h"
+#include "ns3/callback.h"
+#include "ns3/command-line.h"
+#include "ns3/constant-position-mobility-model.h"
+#include "ns3/gnuplot.h"
+#include "ns3/log.h"
+#include "ns3/lr-wpan-error-model.h"
+#include "ns3/lr-wpan-mac.h"
+#include "ns3/lr-wpan-net-device.h"
+#include "ns3/lr-wpan-spectrum-value-helper.h"
+#include "ns3/mac16-address.h"
+#include "ns3/multi-model-spectrum-channel.h"
+#include "ns3/net-device.h"
+#include "ns3/node.h"
+#include "ns3/nstime.h"
+#include "ns3/packet.h"
+#include "ns3/propagation-loss-model.h"
+#include "ns3/simulator.h"
+#include "ns3/single-model-spectrum-channel.h"
+#include "ns3/spectrum-value.h"
+#include "ns3/test.h"
+#include "ns3/uinteger.h"
 
 #include <fstream>
 #include <iostream>
@@ -62,8 +62,8 @@
 
 /**
  * Function called when a Data indication is invoked
- * \param params MCPS data indication parameters
- * \param p packet
+ * @param params MCPS data indication parameters
+ * @param p packet
  */
 void
 LrWpanErrorDistanceCallback(McpsDataIndicationParams params, Ptr<Packet> p)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/examples/lr-wpan-error-model-plot.cc ns-3.44/src/lr-wpan/examples/lr-wpan-error-model-plot.cc
--- ns-3.43/src/lr-wpan/examples/lr-wpan-error-model-plot.cc	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/examples/lr-wpan-error-model-plot.cc	2025-03-09 16:55:49.419371100 -0700
@@ -5,15 +5,15 @@
  *
  * Author: Gary Pei <guangyu.pei@boeing.com>
  */
-#include <ns3/abort.h>
-#include <ns3/command-line.h>
-#include <ns3/gnuplot.h>
-#include <ns3/log.h>
-#include <ns3/lr-wpan-error-model.h>
-#include <ns3/nstime.h>
-#include <ns3/packet.h>
-#include <ns3/simulator.h>
-#include <ns3/uinteger.h>
+#include "ns3/abort.h"
+#include "ns3/command-line.h"
+#include "ns3/gnuplot.h"
+#include "ns3/log.h"
+#include "ns3/lr-wpan-error-model.h"
+#include "ns3/nstime.h"
+#include "ns3/packet.h"
+#include "ns3/simulator.h"
+#include "ns3/uinteger.h"
 
 #include <fstream>
 #include <iostream>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/examples/lr-wpan-mlme.cc ns-3.44/src/lr-wpan/examples/lr-wpan-mlme.cc
--- ns-3.43/src/lr-wpan/examples/lr-wpan-mlme.cc	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/examples/lr-wpan-mlme.cc	2025-03-09 16:55:49.419371100 -0700
@@ -21,15 +21,15 @@
  *
  */
 
-#include <ns3/constant-position-mobility-model.h>
-#include <ns3/core-module.h>
-#include <ns3/log.h>
-#include <ns3/lr-wpan-module.h>
-#include <ns3/packet.h>
-#include <ns3/propagation-delay-model.h>
-#include <ns3/propagation-loss-model.h>
-#include <ns3/simulator.h>
-#include <ns3/single-model-spectrum-channel.h>
+#include "ns3/constant-position-mobility-model.h"
+#include "ns3/core-module.h"
+#include "ns3/log.h"
+#include "ns3/lr-wpan-module.h"
+#include "ns3/packet.h"
+#include "ns3/propagation-delay-model.h"
+#include "ns3/propagation-loss-model.h"
+#include "ns3/simulator.h"
+#include "ns3/single-model-spectrum-channel.h"
 
 #include <iostream>
 
@@ -152,7 +152,7 @@
     params.m_bcnOrd = 14;
     params.m_sfrmOrd = 6;
     Simulator::ScheduleWithContext(1,
-                                   Seconds(2.0),
+                                   Seconds(2),
                                    &LrWpanMac::MlmeStartRequest,
                                    dev0->GetMac(),
                                    params);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/examples/lr-wpan-orphan-scan.cc ns-3.44/src/lr-wpan/examples/lr-wpan-orphan-scan.cc
--- ns-3.43/src/lr-wpan/examples/lr-wpan-orphan-scan.cc	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/examples/lr-wpan-orphan-scan.cc	2025-03-09 16:55:49.419371100 -0700
@@ -40,15 +40,15 @@
  * 6) Scanning of the remaining channels 13 and 14 is cancelled.
  */
 
-#include <ns3/constant-position-mobility-model.h>
-#include <ns3/core-module.h>
-#include <ns3/log.h>
-#include <ns3/lr-wpan-module.h>
-#include <ns3/packet.h>
-#include <ns3/propagation-delay-model.h>
-#include <ns3/propagation-loss-model.h>
-#include <ns3/simulator.h>
-#include <ns3/single-model-spectrum-channel.h>
+#include "ns3/constant-position-mobility-model.h"
+#include "ns3/core-module.h"
+#include "ns3/log.h"
+#include "ns3/lr-wpan-module.h"
+#include "ns3/packet.h"
+#include "ns3/propagation-delay-model.h"
+#include "ns3/propagation-loss-model.h"
+#include "ns3/simulator.h"
+#include "ns3/single-model-spectrum-channel.h"
 
 #include <iostream>
 
@@ -173,7 +173,7 @@
     params.m_sfrmOrd = 15;
     params.m_logCh = 12;
     Simulator::ScheduleWithContext(1,
-                                   Seconds(2.0),
+                                   Seconds(2),
                                    &LrWpanMac::MlmeStartRequest,
                                    coord1NetDevice->GetMac(),
                                    params);
@@ -192,7 +192,7 @@
     scanParams.m_scanChannels = 0x7800;
     scanParams.m_scanType = MLMESCAN_ORPHAN;
     Simulator::ScheduleWithContext(1,
-                                   Seconds(3.0),
+                                   Seconds(3),
                                    &LrWpanMac::MlmeScanRequest,
                                    endNodeNetDevice->GetMac(),
                                    scanParams);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/examples/lr-wpan-packet-print.cc ns-3.44/src/lr-wpan/examples/lr-wpan-packet-print.cc
--- ns-3.43/src/lr-wpan/examples/lr-wpan-packet-print.cc	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/examples/lr-wpan-packet-print.cc	2025-03-09 16:55:49.419371100 -0700
@@ -5,8 +5,8 @@
  *
  * Author:  Tom Henderson <thomas.r.henderson@boeing.com>
  */
-#include <ns3/core-module.h>
-#include <ns3/lr-wpan-module.h>
+#include "ns3/core-module.h"
+#include "ns3/lr-wpan-module.h"
 
 #include <iostream>
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/examples/lr-wpan-per-plot.cc ns-3.44/src/lr-wpan/examples/lr-wpan-per-plot.cc
--- ns-3.43/src/lr-wpan/examples/lr-wpan-per-plot.cc	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/examples/lr-wpan-per-plot.cc	2025-03-09 16:55:49.419371100 -0700
@@ -23,13 +23,13 @@
 
 */
 
-#include <ns3/core-module.h>
-#include <ns3/gnuplot.h>
-#include <ns3/lr-wpan-module.h>
-#include <ns3/mobility-module.h>
-#include <ns3/network-module.h>
-#include <ns3/propagation-module.h>
-#include <ns3/spectrum-module.h>
+#include "ns3/core-module.h"
+#include "ns3/gnuplot.h"
+#include "ns3/lr-wpan-module.h"
+#include "ns3/mobility-module.h"
+#include "ns3/network-module.h"
+#include "ns3/propagation-module.h"
+#include "ns3/spectrum-module.h"
 
 using namespace ns3;
 using namespace ns3::lrwpan;
@@ -40,8 +40,8 @@
 
 /**
  * Function called when a Data indication is invoked
- * \param params MCPS data indication parameters
- * \param p packet
+ * @param params MCPS data indication parameters
+ * @param p packet
  */
 void
 PacketReceivedCallback(McpsDataIndicationParams params, Ptr<Packet> p)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/examples/lr-wpan-phy-test.cc ns-3.44/src/lr-wpan/examples/lr-wpan-phy-test.cc
--- ns-3.43/src/lr-wpan/examples/lr-wpan-phy-test.cc	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/examples/lr-wpan-phy-test.cc	2025-03-09 16:55:49.419371100 -0700
@@ -5,22 +5,22 @@
  *
  * Author: Gary Pei <guangyu.pei@boeing.com>
  */
-#include <ns3/command-line.h>
-#include <ns3/constant-position-mobility-model.h>
-#include <ns3/log.h>
-#include <ns3/lr-wpan-mac.h>
-#include <ns3/lr-wpan-phy.h>
-#include <ns3/packet.h>
-#include <ns3/simulator.h>
-#include <ns3/single-model-spectrum-channel.h>
-#include <ns3/test.h>
+#include "ns3/command-line.h"
+#include "ns3/constant-position-mobility-model.h"
+#include "ns3/log.h"
+#include "ns3/lr-wpan-mac.h"
+#include "ns3/lr-wpan-phy.h"
+#include "ns3/packet.h"
+#include "ns3/simulator.h"
+#include "ns3/single-model-spectrum-channel.h"
+#include "ns3/test.h"
 
 using namespace ns3;
 using namespace ns3::lrwpan;
 
 /**
  * Function called when a the PHY state change is confirmed
- * \param status PHY state
+ * @param status PHY state
  */
 void
 GetSetTRXStateConfirm(PhyEnumeration status)
@@ -30,9 +30,9 @@
 
 /**
  * Function called when a the PHY receives a packet
- * \param psduLength PSDU length
- * \param p packet
- * \param lqi link quality indication
+ * @param psduLength PSDU length
+ * @param p packet
+ * @param lqi link quality indication
  */
 void
 ReceivePdDataIndication(uint32_t psduLength, Ptr<Packet> p, uint8_t lqi)
@@ -43,8 +43,8 @@
 
 /**
  * Send one packet
- * \param sender sender PHY
- * \param receiver receiver PHY
+ * @param sender sender PHY
+ * @param receiver receiver PHY
  */
 void
 SendOnePacket(Ptr<LrWpanPhy> sender, Ptr<LrWpanPhy> receiver)
@@ -89,9 +89,9 @@
 
     receiver->SetPdDataIndicationCallback(MakeCallback(&ReceivePdDataIndication));
 
-    Simulator::Schedule(Seconds(1.0), &SendOnePacket, sender, receiver);
+    Simulator::Schedule(Seconds(1), &SendOnePacket, sender, receiver);
 
-    Simulator::Stop(Seconds(10.0));
+    Simulator::Stop(Seconds(10));
 
     Simulator::Run();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/helper/lr-wpan-helper.cc ns-3.44/src/lr-wpan/helper/lr-wpan-helper.cc
--- ns-3.43/src/lr-wpan/helper/lr-wpan-helper.cc	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/helper/lr-wpan-helper.cc	2025-03-09 16:55:49.419371100 -0700
@@ -9,14 +9,14 @@
  */
 #include "lr-wpan-helper.h"
 
+#include "ns3/log.h"
+#include "ns3/lr-wpan-csmaca.h"
+#include "ns3/lr-wpan-error-model.h"
+#include "ns3/lr-wpan-net-device.h"
+#include "ns3/mobility-model.h"
+#include "ns3/multi-model-spectrum-channel.h"
 #include "ns3/names.h"
-#include <ns3/log.h>
-#include <ns3/lr-wpan-csmaca.h>
-#include <ns3/lr-wpan-error-model.h>
-#include <ns3/lr-wpan-net-device.h>
-#include <ns3/mobility-model.h>
-#include <ns3/multi-model-spectrum-channel.h>
-#include <ns3/single-model-spectrum-channel.h>
+#include "ns3/single-model-spectrum-channel.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/helper/lr-wpan-helper.h ns-3.44/src/lr-wpan/helper/lr-wpan-helper.h
--- ns-3.43/src/lr-wpan/helper/lr-wpan-helper.h	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/helper/lr-wpan-helper.h	2025-03-09 16:55:49.419371100 -0700
@@ -10,10 +10,10 @@
 #ifndef LR_WPAN_HELPER_H
 #define LR_WPAN_HELPER_H
 
-#include <ns3/lr-wpan-mac.h>
-#include <ns3/lr-wpan-phy.h>
-#include <ns3/node-container.h>
-#include <ns3/trace-helper.h>
+#include "ns3/lr-wpan-mac.h"
+#include "ns3/lr-wpan-phy.h"
+#include "ns3/node-container.h"
+#include "ns3/trace-helper.h"
 
 namespace ns3
 {
@@ -22,9 +22,9 @@
 class MobilityModel;
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
- * \brief helps to manage and create IEEE 802.15.4 NetDevice objects
+ * @brief helps to manage and create IEEE 802.15.4 NetDevice objects
  *
  * This class can help to create IEEE 802.15.4 NetDevice objects
  * and to configure their attributes during creation.  It also contains
@@ -39,13 +39,13 @@
 {
   public:
     /**
-     * \brief Create a LrWpan helper in an empty state.
+     * @brief Create a LrWpan helper in an empty state.
      */
     LrWpanHelper();
 
     /**
-     * \brief Create a LrWpan helper in an empty state.
-     * \param useMultiModelSpectrumChannel use a MultiModelSpectrumChannel if true, a
+     * @brief Create a LrWpan helper in an empty state.
+     * @param useMultiModelSpectrumChannel use a MultiModelSpectrumChannel if true, a
      * SingleModelSpectrumChannel otherwise
      */
     LrWpanHelper(bool useMultiModelSpectrumChannel);
@@ -57,27 +57,27 @@
     LrWpanHelper& operator=(const LrWpanHelper&) = delete;
 
     /**
-     * \brief Get the channel associated to this helper
-     * \returns the channel
+     * @brief Get the channel associated to this helper
+     * @returns the channel
      */
     Ptr<SpectrumChannel> GetChannel();
 
     /**
-     * \brief Set the channel associated to this helper
-     * \param channel the channel
+     * @brief Set the channel associated to this helper
+     * @param channel the channel
      */
     void SetChannel(Ptr<SpectrumChannel> channel);
 
     /**
-     * \brief Set the channel associated to this helper
-     * \param channelName the channel name
+     * @brief Set the channel associated to this helper
+     * @param channelName the channel name
      */
     void SetChannel(std::string channelName);
 
     /**
-     * \tparam Ts \deduced Argument types
-     * \param name the name of the model to set
-     * \param [in] args Name and AttributeValue pairs to set.
+     * @tparam Ts \deduced Argument types
+     * @param name the name of the model to set
+     * @param [in] args Name and AttributeValue pairs to set.
      *
      * Add a propagation loss model to the set of currently-configured loss models.
      */
@@ -85,9 +85,9 @@
     void AddPropagationLossModel(std::string name, Ts&&... args);
 
     /**
-     * \tparam Ts \deduced Argument types
-     * \param name the name of the model to set
-     * \param [in] args Name and AttributeValue pairs to set.
+     * @tparam Ts \deduced Argument types
+     * @param name the name of the model to set
+     * @param [in] args Name and AttributeValue pairs to set.
      *
      * Configure a propagation delay for this channel.
      */
@@ -95,14 +95,14 @@
     void SetPropagationDelayModel(std::string name, Ts&&... args);
 
     /**
-     * \brief Add mobility model to a physical device
-     * \param phy the physical device
-     * \param m the mobility model
+     * @brief Add mobility model to a physical device
+     * @param phy the physical device
+     * @param m the mobility model
      */
     void AddMobility(Ptr<lrwpan::LrWpanPhy> phy, Ptr<MobilityModel> m);
 
     /**
-     * \brief Install a LrWpanNetDevice and the associated structures (e.g., channel) in the nodes.
+     * @brief Install a LrWpanNetDevice and the associated structures (e.g., channel) in the nodes.
      *
      * If the channel is not already initialized, it will be created as either a
      * SingleModelSpectrumChannel or a MultiModelSpectrumChannel, depending on the
@@ -113,26 +113,26 @@
      *
      * If the channel is already initialized but lacks either a PropagationDelayModel or a
      * PropagationLossModel, an error will be raised.
-     * \param c a set of nodes
-     * \returns A container holding the added net devices.
+     * @param c a set of nodes
+     * @returns A container holding the added net devices.
      */
     NetDeviceContainer Install(NodeContainer c);
 
     /**
-     * \brief Creates an PAN with associated nodes and assigned addresses(16 and 64)
+     * @brief Creates an PAN with associated nodes and assigned addresses(16 and 64)
      *        from the nodes in the node container.
      *        The first node in the container becomes the PAN coordinator.
      *
-     * \param c a The node container with the nodes that will form the PAN.
-     * \param panId The PAN identifier.
+     * @param c a The node container with the nodes that will form the PAN.
+     * @param panId The PAN identifier.
      */
     void CreateAssociatedPan(NetDeviceContainer c, uint16_t panId);
 
     /**
-     * \brief Set the extended 64 bit addresses (EUI-64) for a group of
+     * @brief Set the extended 64 bit addresses (EUI-64) for a group of
      *        LrWpanNetDevices
      *
-     * \param c The NetDevice container.
+     * @param c The NetDevice container.
      *
      */
     void SetExtendedAddresses(NetDeviceContainer c);
@@ -143,16 +143,16 @@
     void EnableLogComponents();
 
     /**
-     * \brief Transform the LrWpanPhyEnumeration enumeration into a printable string.
-     * \param e the LrWpanPhyEnumeration
-     * \return a string
+     * @brief Transform the LrWpanPhyEnumeration enumeration into a printable string.
+     * @param e the LrWpanPhyEnumeration
+     * @return a string
      */
     static std::string LrWpanPhyEnumerationPrinter(lrwpan::PhyEnumeration e);
 
     /**
-     * \brief Transform the LrWpanMacState enumeration into a printable string.
-     * \param e the LrWpanMacState
-     * \return a string
+     * @brief Transform the LrWpanMacState enumeration into a printable string.
+     * @param e the LrWpanMacState
+     * @return a string
      */
     static std::string LrWpanMacStatePrinter(lrwpan::MacState e);
 
@@ -162,24 +162,24 @@
      * assigned. The Install() method should have previously been
      * called by the user.
      *
-     * \param c NetDeviceContainer of the set of net devices for which the
+     * @param c NetDeviceContainer of the set of net devices for which the
      *          CsmaNetDevice 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
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this helper
      */
     int64_t AssignStreams(NetDeviceContainer c, int64_t stream);
 
   private:
     /**
-     * \brief Enable pcap output on the indicated net device.
+     * @brief Enable pcap output on the indicated net device.
      *
      * NetDevice-specific implementation mechanism for hooking the trace and
      * writing to the trace file.
      *
-     * \param prefix Filename prefix to use for pcap files.
-     * \param nd Net device for which you want to enable tracing.
-     * \param promiscuous If true capture all possible packets available at the device.
-     * \param explicitFilename Treat the prefix as an explicit filename if true
+     * @param prefix Filename prefix to use for pcap files.
+     * @param nd Net device for which you want to enable tracing.
+     * @param promiscuous If true capture all possible packets available at the device.
+     * @param explicitFilename Treat the prefix as an explicit filename if true
      */
     void EnablePcapInternal(std::string prefix,
                             Ptr<NetDevice> nd,
@@ -187,15 +187,15 @@
                             bool explicitFilename) override;
 
     /**
-     * \brief Enable ascii trace output on the indicated net device.
+     * @brief Enable ascii trace output on the indicated net device.
      *
      * NetDevice-specific implementation mechanism for hooking the trace and
      * writing to the trace file.
      *
-     * \param stream The output stream object to use when logging ascii traces.
-     * \param prefix Filename prefix to use for ascii trace files.
-     * \param nd Net device for which you want to enable tracing.
-     * \param explicitFilename Treat the prefix as an explicit filename if true
+     * @param stream The output stream object to use when logging ascii traces.
+     * @param prefix Filename prefix to use for ascii trace files.
+     * @param nd Net device for which you want to enable tracing.
+     * @param explicitFilename Treat the prefix as an explicit filename if true
      */
     void EnableAsciiInternal(Ptr<OutputStreamWrapper> stream,
                              std::string prefix,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/model/lr-wpan-constants.h ns-3.44/src/lr-wpan/model/lr-wpan-constants.h
--- ns-3.43/src/lr-wpan/model/lr-wpan-constants.h	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/model/lr-wpan-constants.h	2025-03-09 16:55:49.419371100 -0700
@@ -23,8 +23,8 @@
 {
 
 /**
- * \defgroup LrWpanConstants LR-WPAN common parameters
- * \ingroup lr-wpan
+ * @defgroup LrWpanConstants LR-WPAN common parameters
+ * @ingroup lr-wpan
  *
  * Contains common parameters about LR-WPAN that can be reused in multiple files.
  * These parameters are defined in the IEEE 802.15.4-2011 standard and adopt the
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/model/lr-wpan-csmaca.cc ns-3.44/src/lr-wpan/model/lr-wpan-csmaca.cc
--- ns-3.43/src/lr-wpan/model/lr-wpan-csmaca.cc	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/model/lr-wpan-csmaca.cc	2025-03-09 16:55:49.419371100 -0700
@@ -13,9 +13,9 @@
 
 #include "lr-wpan-constants.h"
 
-#include <ns3/log.h>
-#include <ns3/random-variable-stream.h>
-#include <ns3/simulator.h>
+#include "ns3/log.h"
+#include "ns3/random-variable-stream.h"
+#include "ns3/simulator.h"
 
 #include <algorithm>
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/model/lr-wpan-csmaca.h ns-3.44/src/lr-wpan/model/lr-wpan-csmaca.h
--- ns-3.43/src/lr-wpan/model/lr-wpan-csmaca.h	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/model/lr-wpan-csmaca.h	2025-03-09 16:55:49.419371100 -0700
@@ -14,8 +14,8 @@
 
 #include "lr-wpan-mac.h"
 
-#include <ns3/event-id.h>
-#include <ns3/object.h>
+#include "ns3/event-id.h"
+#include "ns3/object.h"
 
 namespace ns3
 {
@@ -26,13 +26,13 @@
 {
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * This method informs the MAC whether the channel is idle or busy.
  */
 typedef Callback<void, MacState> LrWpanMacStateCallback;
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * This method informs the transaction cost in a slotted CSMA-CA data transmission.
  * i.e. Reports number of symbols (time) it would take slotted CSMA-CA to process the current
@@ -42,7 +42,7 @@
 typedef Callback<void, uint32_t> LrWpanMacTransCostCallback;
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * This class is a helper for the LrWpanMac to manage the Csma/CA
  * state machine according to IEEE 802.15.4-2006, section 7.5.1.4.
@@ -53,7 +53,7 @@
     /**
      * Get the type ID.
      *
-     * \return the object TypeId
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     /**
@@ -69,13 +69,13 @@
     /**
      * Set the MAC to which this CSMA/CA implementation is attached to.
      *
-     * \param mac the used MAC
+     * @param mac the used MAC
      */
     void SetMac(Ptr<LrWpanMac> mac);
     /**
      * Get the MAC to which this CSMA/CA implementation is attached to.
      *
-     * \return the used MAC
+     * @return the used MAC
      */
     Ptr<LrWpanMac> GetMac() const;
 
@@ -90,48 +90,48 @@
     /**
      * Check if the slotted CSMA/CA version is being used.
      *
-     * \return true, if slotted CSMA/CA is used, false otherwise.
+     * @return true, if slotted CSMA/CA is used, false otherwise.
      */
     bool IsSlottedCsmaCa() const;
     /**
      * Check if the unslotted CSMA/CA version is being used.
      *
-     * \return true, if unslotted CSMA/CA is used, false otherwise.
+     * @return true, if unslotted CSMA/CA is used, false otherwise.
      */
     bool IsUnSlottedCsmaCa() const;
     /**
      * Set the minimum backoff exponent value.
      * See IEEE 802.15.4-2006, section 7.4.2, Table 86.
      *
-     * \param macMinBE the minimum backoff exponent value
+     * @param macMinBE the minimum backoff exponent value
      */
     void SetMacMinBE(uint8_t macMinBE);
     /**
      * Get the minimum backoff exponent value.
      * See IEEE 802.15.4-2006, section 7.4.2, Table 86.
      *
-     * \return the minimum backoff exponent value
+     * @return the minimum backoff exponent value
      */
     uint8_t GetMacMinBE() const;
     /**
      * Set the maximum backoff exponent value.
      * See IEEE 802.15.4-2006, section 7.4.2, Table 86.
      *
-     * \param macMaxBE the maximum backoff exponent value
+     * @param macMaxBE the maximum backoff exponent value
      */
     void SetMacMaxBE(uint8_t macMaxBE);
     /**
      * Get the maximum backoff exponent value.
      * See IEEE 802.15.4-2006, section 7.4.2, Table 86.
      *
-     * \return the maximum backoff exponent value
+     * @return the maximum backoff exponent value
      */
     uint8_t GetMacMaxBE() const;
     /**
      * Set the maximum number of backoffs.
      * See IEEE 802.15.4-2006, section 7.4.2, Table 86.
      *
-     * \param macMaxCSMABackoffs the maximum number of backoffs
+     * @param macMaxCSMABackoffs the maximum number of backoffs
      */
     void SetMacMaxCSMABackoffs(uint8_t macMaxCSMABackoffs);
 
@@ -139,14 +139,14 @@
      * Get the maximum number of backoffs.
      * See IEEE 802.15.4-2006, section 7.4.2, Table 86.
      *
-     * \return the maximum number of backoffs
+     * @return the maximum number of backoffs
      */
     uint8_t GetMacMaxCSMABackoffs() const;
     /**
      * Locates the time to the next backoff period boundary in the SUPERFRAME
      * and returns the amount of time left to this moment.
      *
-     * \return time offset to the next slot
+     * @return time offset to the next slot
      */
     Time GetTimeToNextSlot() const;
     /**
@@ -182,7 +182,7 @@
     /**
      * IEEE 802.15.4-2006 section 6.2.2.2
      * PLME-CCA.confirm status
-     * \param status TRX_OFF, BUSY or IDLE
+     * @param status TRX_OFF, BUSY or IDLE
      *
      * When Phy has completed CCA, it calls back here which in turn execute the final steps
      * of the CSMA-CA algorithm.
@@ -196,7 +196,7 @@
      * triggered in CanProceed() after calculating the transaction cost (2 CCA checks,transmission
      * cost, turnAroundTime, ifs) in the boundary of an Active Period.
      *
-     * \param trans the transaction cost callback
+     * @param trans the transaction cost callback
      */
     void SetLrWpanMacTransCostCallback(LrWpanMacTransCostCallback trans);
     /**
@@ -204,41 +204,41 @@
      * interconnections between the CSMA-CA and the MAC. The callback
      * lets MAC know a channel is either idle or busy.
      *
-     * \param macState the mac state callback
+     * @param macState the mac state callback
      */
     void SetLrWpanMacStateCallback(LrWpanMacStateCallback macState);
     /**
      * Set the value of the Battery Life Extension
      *
-     * \param batteryLifeExtension the Battery Life Extension value active or inactive
+     * @param batteryLifeExtension the Battery Life Extension value active or inactive
      */
     void SetBatteryLifeExtension(bool batteryLifeExtension);
     /**
      * Assign a fixed random variable stream number to the random variables
      * used by this model.  Return the number of streams that have been assigned.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream);
     /**
      * Get the number of CSMA retries
      *
-     * \returns the number of CSMA retries
+     * @returns the number of CSMA retries
      */
     uint8_t GetNB() const;
     /**
      * Get the value of the Battery Life Extension
      *
-     * \returns  true or false to Battery Life Extension support
+     * @returns  true or false to Battery Life Extension support
      */
     bool GetBatteryLifeExtension() const;
 
   private:
     void DoDispose() override;
     /**
-     * \brief Get the time left in the CAP portion of the Outgoing or Incoming superframe.
-     * \return the time left in the CAP
+     * @brief Get the time left in the CAP portion of the Outgoing or Incoming superframe.
+     * @return the time left in the CAP
      */
     Time GetTimeLeftInCap();
     /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/model/lr-wpan-error-model.cc ns-3.44/src/lr-wpan/model/lr-wpan-error-model.cc
--- ns-3.43/src/lr-wpan/model/lr-wpan-error-model.cc	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/model/lr-wpan-error-model.cc	2025-03-09 16:55:49.419371100 -0700
@@ -7,7 +7,7 @@
  */
 #include "lr-wpan-error-model.h"
 
-#include <ns3/log.h>
+#include "ns3/log.h"
 
 #include <cmath>
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/model/lr-wpan-error-model.h ns-3.44/src/lr-wpan/model/lr-wpan-error-model.h
--- ns-3.43/src/lr-wpan/model/lr-wpan-error-model.h	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/model/lr-wpan-error-model.h	2025-03-09 16:55:49.419371100 -0700
@@ -8,7 +8,7 @@
 #ifndef LR_WPAN_ERROR_MODEL_H
 #define LR_WPAN_ERROR_MODEL_H
 
-#include <ns3/object.h>
+#include "ns3/object.h"
 
 namespace ns3
 {
@@ -16,7 +16,7 @@
 {
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * Model the error rate for IEEE 802.15.4 2.4 GHz AWGN channel for OQPSK
  * the model description can be found in IEEE Std 802.15.4-2006, section
@@ -28,7 +28,7 @@
     /**
      * Get the type ID.
      *
-     * \return the object TypeId
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -37,9 +37,9 @@
     /**
      * Return chunk success rate for given SNR.
      *
-     * \return success rate (i.e. 1 - chunk error rate)
-     * \param snr SNR expressed as a power ratio (i.e. not in dB)
-     * \param nbits number of bits in the chunk
+     * @return success rate (i.e. 1 - chunk error rate)
+     * @param snr SNR expressed as a power ratio (i.e. not in dB)
+     * @param nbits number of bits in the chunk
      */
     double GetChunkSuccessRate(double snr, uint32_t nbits) const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/model/lr-wpan-fields.cc ns-3.44/src/lr-wpan/model/lr-wpan-fields.cc
--- ns-3.43/src/lr-wpan/model/lr-wpan-fields.cc	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/model/lr-wpan-fields.cc	2025-03-09 16:55:49.419371100 -0700
@@ -8,8 +8,8 @@
 
 #include "lr-wpan-fields.h"
 
-#include <ns3/address-utils.h>
-#include <ns3/log.h>
+#include "ns3/address-utils.h"
+#include "ns3/log.h"
 
 namespace ns3
 {
@@ -562,10 +562,10 @@
 /**
  * output stream output operator
  *
- * \param os output stream
- * \param capabilityField the Capability Information Field
+ * @param os output stream
+ * @param capabilityField the Capability Information Field
  *
- * \returns output stream
+ * @returns output stream
  */
 std::ostream&
 operator<<(std::ostream& os, const CapabilityField& capabilityField)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/model/lr-wpan-fields.h ns-3.44/src/lr-wpan/model/lr-wpan-fields.h
--- ns-3.43/src/lr-wpan/model/lr-wpan-fields.h	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/model/lr-wpan-fields.h	2025-03-09 16:55:49.419371100 -0700
@@ -16,8 +16,8 @@
 #define LR_WPAN_FIELDS_H
 
 #include "ns3/buffer.h"
-#include <ns3/mac16-address.h>
-#include <ns3/mac64-address.h>
+#include "ns3/mac16-address.h"
+#include "ns3/mac64-address.h"
 
 #include <array>
 
@@ -27,7 +27,7 @@
 {
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  * The device Capabilities.
  */
 enum DeviceType
@@ -37,7 +37,7 @@
 };
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  * Represent the Superframe Specification information field.
  * See IEEE 802.15.4-2011   Section 5.2.2.1.2 Figure 41
  */
@@ -50,80 +50,80 @@
      * Create a superframe Specification Information field with
      * the information specified in the bitmap.
      *
-     * \param bitmap The superframe in bitmap form
+     * @param bitmap The superframe in bitmap form
      */
     SuperframeField(uint16_t bitmap);
     /**
      * Set the whole Superframe Specification Information field.
-     * \param superFrm The Superframe Specification information field.
+     * @param superFrm The Superframe Specification information field.
      */
     void SetSuperframe(uint16_t superFrm);
     /**
      * Set the superframe specification Beacon Order field.
-     * \param bcnOrder The beacon order value to set in the superframe.
+     * @param bcnOrder The beacon order value to set in the superframe.
      */
     void SetBeaconOrder(uint8_t bcnOrder);
     /**
      * Set the superframe specification Superframe Order field.
-     * \param frmOrder The frame Order value to set on the superframe.
+     * @param frmOrder The frame Order value to set on the superframe.
      */
     void SetSuperframeOrder(uint8_t frmOrder);
     /**
      * Set the superframe specification Final CAP slot field.
-     * \param capSlot Set the final slot of the Contention Access Period (CAP).
+     * @param capSlot Set the final slot of the Contention Access Period (CAP).
      */
     void SetFinalCapSlot(uint8_t capSlot);
     /**
      * Set the Superframe Specification Battery Life Extension (BLE).
-     * \param battLifeExt Sets true or false the value of the Battery Life Extension flag of the
+     * @param battLifeExt Sets true or false the value of the Battery Life Extension flag of the
      * superframe field.
      */
     void SetBattLifeExt(bool battLifeExt);
     /**
      * Set the Superframe Specification PAN coordinator field.
-     * \param panCoor set true or false the value for the PAN Coordinator flag of the superframe
+     * @param panCoor set true or false the value for the PAN Coordinator flag of the superframe
      * field.
      */
     void SetPanCoor(bool panCoor);
     /**
      * Set the Superframe Specification Association Permit field.
-     * \param assocPermit set true or false the value of the Association Permit flag of the
+     * @param assocPermit set true or false the value of the Association Permit flag of the
      * superframe field.
      */
     void SetAssocPermit(bool assocPermit);
     /**
      * Get the Superframe Specification Beacon Order field.
-     * \return the Superframe Specification Beacon Order field.
+     * @return the Superframe Specification Beacon Order field.
      */
     uint8_t GetBeaconOrder() const;
     /**
      * Get the Superframe Specification Frame Order field.
-     * \return The Superframe Specification Frame Order field.
+     * @return The Superframe Specification Frame Order field.
      */
     uint8_t GetFrameOrder() const;
     /**
      * Get the the Final CAP Slot.
-     * \returns The Final CAP Slot
+     * @returns The Final CAP Slot
      */
     uint8_t GetFinalCapSlot() const;
     /**
      * Check if the Battery Life Extension bit is enabled.
-     * \returns true if the Battery Life Extension bit is enabled
+     * @returns true if the Battery Life Extension bit is enabled
      */
     bool IsBattLifeExt() const;
     /**
      * Check if the PAN Coordinator bit is enabled.
-     * \returns true if the PAN Coordinator bit is enabled
+     * @returns true if the PAN Coordinator bit is enabled
      */
     bool IsPanCoor() const;
     /**
      * Check if the Association Permit bit is enabled.
-     * \returns true if the Association Permit bit is enabled
+     * @returns true if the Association Permit bit is enabled
      */
     bool IsAssocPermit() const;
     /**
      * Get the Superframe specification information field.
-     * \return the Superframe Specification Information field bits.
+     * @return the Superframe Specification Information field bits.
      */
     uint16_t GetSuperframe() const;
 
@@ -140,16 +140,16 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param [in] os The reference to the output stream.
- * \param [in] superframeField The Superframe fields.
- * \returns The reference to the output stream.
+ * @param [in] os The reference to the output stream.
+ * @param [in] superframeField The Superframe fields.
+ * @returns The reference to the output stream.
  */
 std::ostream& operator<<(std::ostream& os, const SuperframeField& superframeField);
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  * Represent the GTS information fields.
  * See IEEE 802.15.4-2011   Section 5.2.2 Figure 39
  */
@@ -159,45 +159,45 @@
     GtsFields();
     /**
      * Get the GTS Specification Field from the GTS Fields
-     * \return The GTS Specification Field
+     * @return The GTS Specification Field
      */
     uint8_t GetGtsSpecField() const;
     /**
      * Get the GTS Direction Field from the GTS Fields
-     * \return The GTS Direction Field
+     * @return The GTS Direction Field
      */
     uint8_t GetGtsDirectionField() const;
     /**
      * Set the GTS Specification Field to the GTS Fields
-     * \param gtsSpec The GTS Specification Field to set.
+     * @param gtsSpec The GTS Specification Field to set.
      */
     void SetGtsSpecField(uint8_t gtsSpec);
     /**
      * Set the GTS direction field to the GTS Fields
-     * \param gtsDir The GTS Direction Field to set
+     * @param gtsDir The GTS Direction Field to set
      */
     void SetGtsDirectionField(uint8_t gtsDir);
     /**
      * Get the GTS Specification Permit. TRUE if coordinator is accepting GTS requests.
-     * \return True if the coordinator is accepting GTS request.
+     * @return True if the coordinator is accepting GTS request.
      */
     bool GetGtsPermit() const;
     /**
      * Get the size of the serialized GTS fields.
-     * \return the size of the serialized fields.
+     * @return the size of the serialized fields.
      */
     uint32_t GetSerializedSize() const;
     /**
      * Serialize the entire GTS fields.
-     * \param i an iterator which points to where the superframe specification field should be
+     * @param i an iterator which points to where the superframe specification field should be
      * written.
-     * \return an iterator.
+     * @return an iterator.
      */
     Buffer::Iterator Serialize(Buffer::Iterator i) const;
     /**
      * Deserialize the entire GTS fields.
-     * \param i an iterator which points to where the superframe specification field should be read.
-     * \return an iterator.
+     * @param i an iterator which points to where the superframe specification field should be read.
+     * @return an iterator.
      */
     Buffer::Iterator Deserialize(Buffer::Iterator i);
 
@@ -224,16 +224,16 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param [in] os The reference to the output stream.
- * \param [in] gtsFields The GTS fields.
- * \returns The reference to the output stream.
+ * @param [in] os The reference to the output stream.
+ * @param [in] gtsFields The GTS fields.
+ * @returns The reference to the output stream.
  */
 std::ostream& operator<<(std::ostream& os, const GtsFields& gtsFields);
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  * Represent the Pending Address Specification field.
  * See IEEE 802.15.4-2011   Section 5.2.2.1.6. Figure 45
  */
@@ -243,64 +243,64 @@
     PendingAddrFields();
     /**
      * Add a short Pending Address to the Address List.
-     * \param shortAddr The extended Pending Address List.
+     * @param shortAddr The extended Pending Address List.
      */
     void AddAddress(Mac16Address shortAddr);
     /**
      * Add a extended Pending Address to the Address List.
-     * \param extAddr The extended Pending Address List.
+     * @param extAddr The extended Pending Address List.
      */
     void AddAddress(Mac64Address extAddr);
     /**
      * Search for the short Pending Address in the Address List.
-     * \param shortAddr The extended Address to look in the Address List.
-     * \return True if the address exist in the extended Address List.
+     * @param shortAddr The extended Address to look in the Address List.
+     * @return True if the address exist in the extended Address List.
      */
     bool SearchAddress(Mac16Address shortAddr);
     /**
      * Search for the extended Pending Address in the Address List.
-     * \param extAddr The extended Address to look in the Address List.
-     * \return True if the address exist in the extended Address List.
+     * @param extAddr The extended Address to look in the Address List.
+     * @return True if the address exist in the extended Address List.
      */
     bool SearchAddress(Mac64Address extAddr);
     /**
      * Get the whole Pending Address Specification Field from the Pending Address Fields.
-     * \return The Pending Address Specification Field.
+     * @return The Pending Address Specification Field.
      */
     uint8_t GetPndAddrSpecField() const;
     /**
      * Get the number of Short Pending Address indicated in the Pending Address Specification Field.
-     * \return The number Short Pending Address.
+     * @return The number Short Pending Address.
      */
     uint8_t GetNumShortAddr() const;
     /**
      * Get the number of Extended Pending Address indicated in the Pending Address Specification
      * Field.
-     * \return The number Short Pending Address.
+     * @return The number Short Pending Address.
      */
     uint8_t GetNumExtAddr() const;
 
     /**
      * Set the whole Pending Address Specification field. This field is part of the
      * Pending Address Fields header.
-     * \param pndAddrSpecField The Pending Address Specification Field
+     * @param pndAddrSpecField The Pending Address Specification Field
      */
     void SetPndAddrSpecField(uint8_t pndAddrSpecField);
     /**
      * Get the size of the serialized Pending Address Fields.
-     * \return the size of the serialized fields.
+     * @return the size of the serialized fields.
      */
     uint32_t GetSerializedSize() const;
     /**
      * Serialize the entire Pending Address Fields.
-     * \param i an iterator which points to where the Pending Address Fields should be written.
-     * \return an iterator.
+     * @param i an iterator which points to where the Pending Address Fields should be written.
+     * @return an iterator.
      */
     Buffer::Iterator Serialize(Buffer::Iterator i) const;
     /**
      * Deserialize the all the Pending Address Fields.
-     * \param i an iterator which points to where the Pending Address Fields should be read.
-     * \return an iterator.
+     * @param i an iterator which points to where the Pending Address Fields should be read.
+     * @return an iterator.
      */
     Buffer::Iterator Deserialize(Buffer::Iterator i);
 
@@ -318,16 +318,16 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param [in] os The reference to the output stream.
- * \param [in] pendingAddrFields The Pending Address fields.
- * \returns The reference to the output stream.
+ * @param [in] os The reference to the output stream.
+ * @param [in] pendingAddrFields The Pending Address fields.
+ * @returns The reference to the output stream.
  */
 std::ostream& operator<<(std::ostream& os, const PendingAddrFields& pendingAddrFields);
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * Represent the Capability Information Field.
  * See IEEE 802.15.4-2011   Section 5.3.1.2 Figure 50
@@ -340,21 +340,21 @@
     /**
      * Construct a Capability field based on a bitmap.
      *
-     * \param bitmap The bitmap representing the capability
+     * @param bitmap The bitmap representing the capability
      */
     CapabilityField(uint8_t bitmap);
 
     /**
      * Get the bitmap representing the device capability.
      *
-     * \return The bitmap representing the device capability.
+     * @return The bitmap representing the device capability.
      */
     uint8_t GetCapability() const;
 
     /**
      * Set the bitmap representing the device capability.
      *
-     * \param bitmap The bitmap representing the capability
+     * @param bitmap The bitmap representing the capability
      */
     void SetCapability(uint8_t bitmap);
 
@@ -362,7 +362,7 @@
      * True if the device type is a Full Functional Device (FFD) false if is a Reduced Functional
      * Device (RFD).
      *
-     * \return True if the device type is a Full Functional Device (FFD) false if is a Reduced
+     * @return True if the device type is a Full Functional Device (FFD) false if is a Reduced
      * Functional Device (RFD).
      */
     bool IsDeviceTypeFfd() const;
@@ -370,14 +370,14 @@
     /**
      * True if the device is receiving power from alternating current mains.
      *
-     * \return True if the device is receiving power from alternating current mains.
+     * @return True if the device is receiving power from alternating current mains.
      */
     bool IsPowSrcAvailable() const;
 
     /**
      * True if the device does not disable its receiver to conserve power during idle periods.
      *
-     * \return True if the device does not disable its receiver to conserve power during idle
+     * @return True if the device does not disable its receiver to conserve power during idle
      * periods.
      */
     bool IsReceiverOnWhenIdle() const;
@@ -386,7 +386,7 @@
      * True if the device is capable of sending and receiving cryptographically protected MAC
      * frames.
      *
-     * \return True if the device is capable of sending and receiving cryptographically protected
+     * @return True if the device is capable of sending and receiving cryptographically protected
      * MAC frames.
      */
     bool IsSecurityCapability() const;
@@ -395,7 +395,7 @@
      * True if the device wishes the coordinator to allocate a short address as result of the
      * association procedure.
      *
-     * \return True if the device wishes the coordinator to allocate a short address as result of
+     * @return True if the device wishes the coordinator to allocate a short address as result of
      * the association procedure.
      */
     bool IsShortAddrAllocOn() const;
@@ -404,35 +404,35 @@
      * Set the Device type in the Capability Information Field.
      * True = full functional device (FFD)  False = reduced functional device (RFD).
      *
-     * \param devType The device type described in the Capability Information Field.
+     * @param devType The device type described in the Capability Information Field.
      */
     void SetFfdDevice(bool devType);
 
     /**
      * Set the Power Source available flag in the Capability Information Field.
      *
-     * \param pow Set true if a Power Source is available in the Capability Information Field.
+     * @param pow Set true if a Power Source is available in the Capability Information Field.
      */
     void SetPowSrcAvailable(bool pow);
 
     /**
      * Indicate if the receiver is On on Idle
      *
-     * \param rxIdle Set true if the receiver is on when Idle
+     * @param rxIdle Set true if the receiver is on when Idle
      */
     void SetRxOnWhenIdle(bool rxIdle);
 
     /**
      * Set the Security Capability flag in the Capability Information Field.
      *
-     * \param sec Set true if the device have Security Capabilities.
+     * @param sec Set true if the device have Security Capabilities.
      */
     void SetSecurityCap(bool sec);
 
     /**
      * Set the Short Address Flag in the Capability Information Field.
      *
-     * \param addrAlloc Describes whether or not the coordinator should allocate a short
+     * @param addrAlloc Describes whether or not the coordinator should allocate a short
      *                  address in the association process.
      */
     void SetShortAddrAllocOn(bool addrAlloc);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/model/lr-wpan-interference-helper.cc ns-3.44/src/lr-wpan/model/lr-wpan-interference-helper.cc
--- ns-3.43/src/lr-wpan/model/lr-wpan-interference-helper.cc	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/model/lr-wpan-interference-helper.cc	2025-03-09 16:55:49.419371100 -0700
@@ -8,9 +8,9 @@
  */
 #include "lr-wpan-interference-helper.h"
 
-#include <ns3/log.h>
-#include <ns3/spectrum-model.h>
-#include <ns3/spectrum-value.h>
+#include "ns3/log.h"
+#include "ns3/spectrum-model.h"
+#include "ns3/spectrum-value.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/model/lr-wpan-interference-helper.h ns-3.44/src/lr-wpan/model/lr-wpan-interference-helper.h
--- ns-3.43/src/lr-wpan/model/lr-wpan-interference-helper.h	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/model/lr-wpan-interference-helper.h	2025-03-09 16:55:49.419371100 -0700
@@ -9,8 +9,8 @@
 #ifndef LR_WPAN_INTERFERENCE_HELPER_H
 #define LR_WPAN_INTERFERENCE_HELPER_H
 
-#include <ns3/ptr.h>
-#include <ns3/simple-ref-count.h>
+#include "ns3/ptr.h"
+#include "ns3/simple-ref-count.h"
 
 #include <set>
 
@@ -24,9 +24,9 @@
 {
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
- * \brief This class provides helper functions for LrWpan interference handling.
+ * @brief This class provides helper functions for LrWpan interference handling.
  */
 class LrWpanInterferenceHelper : public SimpleRefCount<LrWpanInterferenceHelper>
 {
@@ -34,7 +34,7 @@
     /**
      * Create a new interference helper for the given SpectrumModel.
      *
-     * \param spectrumModel the SpectrumModel to be used
+     * @param spectrumModel the SpectrumModel to be used
      */
     LrWpanInterferenceHelper(Ptr<const SpectrumModel> spectrumModel);
 
@@ -45,8 +45,8 @@
      * signal more than once. The SpectrumModels of the signal and the one used
      * for instantiation of the helper have to be the same.
      *
-     * \param signal the signal to be added
-     * \return false, if the signal was not added because the SpectrumModel of the
+     * @param signal the signal to be added
+     * @return false, if the signal was not added because the SpectrumModel of the
      * signal does not match the one of the helper, true otherwise.
      */
     bool AddSignal(Ptr<const SpectrumValue> signal);
@@ -54,8 +54,8 @@
     /**
      * Remove the given signal to the set of accumulated signals.
      *
-     * \param signal the signal to be removed
-     * \return false, if the signal was not removed (because it was not added
+     * @param signal the signal to be removed
+     * @return false, if the signal was not removed (because it was not added
      * before), true otherwise.
      */
     bool RemoveSignal(Ptr<const SpectrumValue> signal);
@@ -68,26 +68,26 @@
     /**
      * Get the sum of all accumulated signals.
      *
-     * \return the sum of the signals
+     * @return the sum of the signals
      */
     Ptr<SpectrumValue> GetSignalPsd() const;
 
     /**
      * Get the SpectrumModel used by the helper.
      *
-     * \return the helpers SpectrumModel
+     * @return the helpers SpectrumModel
      */
     Ptr<const SpectrumModel> GetSpectrumModel() const;
 
   private:
     // Disable implicit copy constructors
     /**
-     * \brief Copy constructor - defined and not implemented.
+     * @brief Copy constructor - defined and not implemented.
      */
     LrWpanInterferenceHelper(const LrWpanInterferenceHelper&);
     /**
-     * \brief Copy constructor - defined and not implemented.
-     * \returns
+     * @brief Copy constructor - defined and not implemented.
+     * @returns
      */
     LrWpanInterferenceHelper& operator=(const LrWpanInterferenceHelper&);
     /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/model/lr-wpan-lqi-tag.cc ns-3.44/src/lr-wpan/model/lr-wpan-lqi-tag.cc
--- ns-3.43/src/lr-wpan/model/lr-wpan-lqi-tag.cc	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/model/lr-wpan-lqi-tag.cc	2025-03-09 16:55:49.419371100 -0700
@@ -8,7 +8,7 @@
  */
 #include "lr-wpan-lqi-tag.h"
 
-#include <ns3/integer.h>
+#include "ns3/integer.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/model/lr-wpan-lqi-tag.h ns-3.44/src/lr-wpan/model/lr-wpan-lqi-tag.h
--- ns-3.43/src/lr-wpan/model/lr-wpan-lqi-tag.h	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/model/lr-wpan-lqi-tag.h	2025-03-09 16:55:49.419371100 -0700
@@ -9,7 +9,7 @@
 #ifndef LR_WPAN_LQI_TAG_H
 #define LR_WPAN_LQI_TAG_H
 
-#include <ns3/tag.h>
+#include "ns3/tag.h"
 
 namespace ns3
 {
@@ -17,7 +17,7 @@
 {
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  * Represent the LQI (Link Quality Estination).
  *
  * The LQI Tag is added to each received packet, and can be
@@ -31,7 +31,7 @@
     /**
      * Get the type ID.
      *
-     * \return the object TypeId
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -44,7 +44,7 @@
 
     /**
      * Create a LrWpanLqiTag with the given LQI value.
-     * \param lqi The LQI.
+     * @param lqi The LQI.
      */
     LrWpanLqiTag(uint8_t lqi);
 
@@ -56,14 +56,14 @@
     /**
      * Set the LQI to the given value.
      *
-     * \param lqi the value of the LQI to set
+     * @param lqi the value of the LQI to set
      */
     void Set(uint8_t lqi);
 
     /**
      * Get the LQI value.
      *
-     * \return the LQI value
+     * @return the LQI value
      */
     uint8_t Get() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/model/lr-wpan-mac-base.cc ns-3.44/src/lr-wpan/model/lr-wpan-mac-base.cc
--- ns-3.43/src/lr-wpan/model/lr-wpan-mac-base.cc	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/model/lr-wpan-mac-base.cc	2025-03-09 16:55:49.419371100 -0700
@@ -8,8 +8,8 @@
 
 #include "lr-wpan-mac-base.h"
 
-#include <ns3/log.h>
-#include <ns3/uinteger.h>
+#include "ns3/log.h"
+#include "ns3/uinteger.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/model/lr-wpan-mac-base.h ns-3.44/src/lr-wpan/model/lr-wpan-mac-base.h
--- ns-3.43/src/lr-wpan/model/lr-wpan-mac-base.h	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/model/lr-wpan-mac-base.h	2025-03-09 16:55:49.419371100 -0700
@@ -9,13 +9,13 @@
 #ifndef LR_WPAN_MAC_BASE_H
 #define LR_WPAN_MAC_BASE_H
 
-#include <ns3/callback.h>
-#include <ns3/mac16-address.h>
-#include <ns3/mac64-address.h>
-#include <ns3/nstime.h>
-#include <ns3/object.h>
-#include <ns3/packet.h>
-#include <ns3/ptr.h>
+#include "ns3/callback.h"
+#include "ns3/mac16-address.h"
+#include "ns3/mac64-address.h"
+#include "ns3/nstime.h"
+#include "ns3/object.h"
+#include "ns3/packet.h"
+#include "ns3/ptr.h"
 
 #include <cstdint>
 
@@ -25,7 +25,7 @@
 {
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * The status of a confirm or an indication primitive as a result of a previous request.
  * Represent the value of status in IEEE 802.15.4-2011 primitives.
@@ -79,7 +79,7 @@
 };
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * table 80 of 802.15.4
  */
@@ -92,7 +92,7 @@
 };
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * Table 30 of IEEE 802.15.4-2011
  */
@@ -105,7 +105,7 @@
 };
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * MCPS-DATA.request params. See 7.1.1.1
  */
@@ -121,7 +121,7 @@
 };
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * MLME-START.request params. See 802.15.4-2011  Section 6.2.12.1
  */
@@ -145,7 +145,7 @@
 };
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * MLME-SCAN.request params. See IEEE 802.15.4-2011  Section 6.2.10.1 Table 30
  */
@@ -164,7 +164,7 @@
 };
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * MLME-ASSOCIATE.request params. See 802.15.4-2011  Section 6.2.2.1
  */
@@ -184,7 +184,7 @@
 };
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * MLME-ASSOCIATE.response params. See 802.15.4-2011 6.2.2.3.
  */
@@ -199,7 +199,7 @@
 };
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * MLME-ORPHAN.response params. See  802.15.4-2011   Section 6.2.7.2
  */
@@ -211,7 +211,7 @@
 };
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * MLME-SYNC.request params. See 802.15.4-2011  Section 6.2.13.1
  */
@@ -223,7 +223,7 @@
 };
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * MLME-POLL.request params. See 802.15.4-2011  Section 6.2.14.1
  */
@@ -237,7 +237,7 @@
 };
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * IEEE 802.15.4-2006 PHY and MAC PIB Attribute Identifiers Table 23 and Table 86.
  * Note: Attribute identifiers use standardized values.
@@ -294,19 +294,19 @@
 };
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * IEEE802.15.4-2011 PHY PIB Attributes Table 52 in section 6.4.2
  */
 struct MacPibAttributes : public SimpleRefCount<MacPibAttributes>
 {
-    std::vector<uint8_t> macBeaconPayload; //!< The set with the contents of the beacon payload.
-    uint8_t macBeaconPayloadLength{0};     //!< The length in octets of the beacon payload.
-    Mac16Address macShortAddress;          //!< The 16 bit mac short address
-    Mac64Address macExtendedAddress;       //!< The EUI-64 bit address
-    uint16_t macPanId{0xffff};             //!< The identifier of the PAN
-    bool macAssociationPermit{true};       //!< Indication of whether the coordinator is allowing
-                                           //!< association.
+    std::vector<uint8_t> macBeaconPayload{}; //!< The set with the contents of the beacon payload.
+    uint8_t macBeaconPayloadLength{0};       //!< The length in octets of the beacon payload.
+    Mac16Address macShortAddress;            //!< The 16 bit mac short address
+    Mac64Address macExtendedAddress;         //!< The EUI-64 bit address
+    uint16_t macPanId{0xffff};               //!< The identifier of the PAN
+    bool macAssociationPermit{true};         //!< Indication of whether the coordinator is allowing
+                                             //!< association.
     bool macRxOnWhenIdle{true}; //!< Indication of whether the MAC is enabled during idle periods.
     bool macPromiscuousMode{false}; //!< Indication of whether the mac is in promiscuous mode
                                     //!<  (Receive all mode).
@@ -316,7 +316,7 @@
 };
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * MCPS-DATA.confirm params. See 7.1.1.2
  */
@@ -328,7 +328,7 @@
 };
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * MCPS-DATA.indication params. See 7.1.1.3
  */
@@ -347,7 +347,7 @@
 };
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * MLME-ASSOCIATE.indication params. See 802.15.4-2011 6.2.2.2.
  */
@@ -361,7 +361,7 @@
 };
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * MLME-COMM-STATUS.indication params. See  802.15.4-2011   Section 6.2.4.2 Table 18
  */
@@ -383,7 +383,7 @@
 };
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * MLME-ORPHAN.indication params. See  802.15.4-2011   Section 6.2.7.1
  */
@@ -393,7 +393,7 @@
 };
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * MLME-START.confirm params. See  802.15.4-2011   Section 6.2.12.2
  */
@@ -404,7 +404,7 @@
 };
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * PAN Descriptor, Table 17 IEEE 802.15.4-2011
  */
@@ -431,7 +431,7 @@
 };
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * MLME-SCAN.confirm params. See IEEE 802.15.4-2011 Section 6.2.10.2
  */
@@ -453,7 +453,7 @@
 };
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * MLME-ASSOCIATE.confirm params. See 802.15.4-2011  Section 6.2.2.4
  */
@@ -465,7 +465,7 @@
 };
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * MLME-BEACON-NOTIFY.indication params. See  802.15.4-2011   Section 6.2.4.1, Table 16
  */
@@ -478,7 +478,7 @@
 };
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * MLME-SYNC-LOSS.indication params. See  802.15.4-2011   Section 6.2.13.2, Table 37
  */
@@ -493,7 +493,7 @@
 };
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * MLME-SET.confirm params. See  802.15.4-2011   Section 6.2.11.2
  */
@@ -502,11 +502,13 @@
     MacStatus m_status{MacStatus::UNSUPPORTED_ATTRIBUTE}; //!< The result of
                                                           //!< the request to write
                                                           //!< the PIB attribute.
-    MacPibAttributeIdentifier id; //!< The id of the PIB attribute that was written.
+    MacPibAttributeIdentifier id{
+        MacPibAttributeIdentifier::unsupported}; //!< The id of the
+                                                 //!< PIB attribute that was written.
 };
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * MLME-START.confirm params. See  802.15.4-2011   Section 6.2.14.2
  */
@@ -518,7 +520,7 @@
 };
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * This callback is called after a McpsDataRequest has been called from
  * the higher layer.  It returns a status of the outcome of the
@@ -527,18 +529,18 @@
 using McpsDataConfirmCallback = Callback<void, McpsDataConfirmParams>;
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * This callback is called after a Mcps has successfully received a
  *  frame and wants to deliver it to the higher layer.
  *
- *  \todo for now, we do not deliver all of the parameters in section
+ *  @todo for now, we do not deliver all of the parameters in section
  *  802.15.4-2006 7.1.1.3.1 but just send up the packet.
  */
 using McpsDataIndicationCallback = Callback<void, McpsDataIndicationParams, Ptr<Packet>>;
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * This callback is called after a Mlme has successfully received a command
  *  frame and wants to deliver it to the higher layer.
@@ -549,7 +551,7 @@
 using MlmeAssociateIndicationCallback = Callback<void, MlmeAssociateIndicationParams>;
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * This callback is called by the MLME and issued to its next higher layer following
  * a transmission instigated through a response primitive.
@@ -560,7 +562,7 @@
 using MlmeCommStatusIndicationCallback = Callback<void, MlmeCommStatusIndicationParams>;
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * This callback is called by the MLME and issued to its next higher layer following
  * the reception of a orphan notification.
@@ -571,7 +573,7 @@
 using MlmeOrphanIndicationCallback = Callback<void, MlmeOrphanIndicationParams>;
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * This callback is called after a MlmeStartRequest has been called from
  * the higher layer.  It returns a status of the outcome of the
@@ -580,7 +582,7 @@
 using MlmeStartConfirmCallback = Callback<void, MlmeStartConfirmParams>;
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * This callback is called after a MlmeScanRequest has been called from
  * the higher layer.  It returns a status of the outcome of the scan.
@@ -588,7 +590,7 @@
 using MlmeScanConfirmCallback = Callback<void, MlmeScanConfirmParams>;
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * This callback is called after a MlmeAssociateRequest has been called from
  * the higher layer. It returns a status of the outcome of the
@@ -597,29 +599,29 @@
 using MlmeAssociateConfirmCallback = Callback<void, MlmeAssociateConfirmParams>;
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * This callback is called after a Mlme has successfully received a
  *  beacon frame and wants to deliver it to the higher layer.
  *
- *  \todo for now, we do not deliver all of the parameters in section
+ *  @todo for now, we do not deliver all of the parameters in section
  *  802.15.4-2006 6.2.4.1 but just send up the packet.
  */
 using MlmeBeaconNotifyIndicationCallback = Callback<void, MlmeBeaconNotifyIndicationParams>;
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * This callback is called to indicate the loss of synchronization with
  * a coordinator.
  *
- * \todo for now, we do not deliver all of the parameters in section
+ * @todo for now, we do not deliver all of the parameters in section
  *  See IEEE 802.15.4-2011 6.2.13.2.
  */
 using MlmeSyncLossIndicationCallback = Callback<void, MlmeSyncLossIndicationParams>;
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * This callback is called after a MlmeSetRequest has been called from
  * the higher layer to set a PIB. It returns a status of the outcome of the
@@ -628,7 +630,7 @@
 using MlmeSetConfirmCallback = Callback<void, MlmeSetConfirmParams>;
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * This callback is called after a MlmeGetRequest has been called from
  * the higher layer to get a PIB. It returns a status of the outcome of the
@@ -638,7 +640,7 @@
     Callback<void, MacStatus, MacPibAttributeIdentifier, Ptr<MacPibAttributes>>;
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * This callback is called after a Mlme-Poll.Request has been called from
  * the higher layer.  It returns a status of the outcome of the
@@ -647,9 +649,9 @@
 using MlmePollConfirmCallback = Callback<void, MlmePollConfirmParams>;
 
 /**
- * \ingroup netdevice
+ * @ingroup netdevice
  *
- * \brief Lr-wpan MAC layer abstraction
+ * @brief Lr-wpan MAC layer abstraction
  *
  * This class defines the interface functions (primitives) used by a IEEE 802.15.4-2011 compliant
  * MAC layer. Any lr-wpan MAC should extend from this class and implement the
@@ -660,8 +662,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     ~LrWpanMacBase() override;
@@ -671,8 +673,8 @@
      * MCPS-DATA.request
      * Request to transfer a MSDU.
      *
-     * \param params the request parameters
-     * \param p the packet to be transmitted
+     * @param params the request parameters
+     * @param p the packet to be transmitted
      */
     virtual void McpsDataRequest(McpsDataRequestParams params, Ptr<Packet> p) = 0;
 
@@ -682,7 +684,7 @@
      * Request to allow a PAN coordinator to initiate
      * a new PAN or beginning a new superframe configuration.
      *
-     * \param params the request parameters
+     * @param params the request parameters
      */
     virtual void MlmeStartRequest(MlmeStartRequestParams params) = 0;
 
@@ -691,7 +693,7 @@
      * MLME-SCAN.request
      * Request primitive used to initiate a channel scan over a given list of channels.
      *
-     * \param params the scan request parameters
+     * @param params the scan request parameters
      */
     virtual void MlmeScanRequest(MlmeScanRequestParams params) = 0;
 
@@ -701,7 +703,7 @@
      * Request primitive used by a device to request an association with
      * a coordinator.
      *
-     * \param params the request parameters
+     * @param params the request parameters
      */
     virtual void MlmeAssociateRequest(MlmeAssociateRequestParams params) = 0;
 
@@ -711,7 +713,7 @@
      * Primitive used to initiate a response to an MLME-ASSOCIATE.indication
      * primitive.
      *
-     * \param params the associate response parameters
+     * @param params the associate response parameters
      */
     virtual void MlmeAssociateResponse(MlmeAssociateResponseParams params) = 0;
 
@@ -721,7 +723,7 @@
      * Request to synchronize with the coordinator by acquiring and,
      * if specified, tracking beacons.
      *
-     * \param params the request parameters
+     * @param params the request parameters
      */
     virtual void MlmeSyncRequest(MlmeSyncRequestParams params) = 0;
 
@@ -730,7 +732,7 @@
      * MLME-POLL.request
      * Prompts the device to request data from the coordinator.
      *
-     * \param params the request parameters
+     * @param params the request parameters
      */
     virtual void MlmePollRequest(MlmePollRequestParams params) = 0;
 
@@ -740,7 +742,7 @@
      * Primitive used to initiatte a response to an MLME-ORPHAN.indication
      * primitive.
      *
-     * \param params the orphan response parameters
+     * @param params the orphan response parameters
      */
     virtual void MlmeOrphanResponse(MlmeOrphanResponseParams params) = 0;
 
@@ -749,8 +751,8 @@
      * MLME-SET.request
      * Attempts to write the given value to the indicated PIB attribute.
      *
-     * \param id the attributed identifier
-     * \param attribute the attribute value
+     * @param id the attributed identifier
+     * @param attribute the attribute value
      */
     virtual void MlmeSetRequest(MacPibAttributeIdentifier id, Ptr<MacPibAttributes> attribute) = 0;
 
@@ -761,7 +763,7 @@
      * Note: The PibAttributeIndex parameter is not included because
      * attributes that represent tables are not supported.
      *
-     * \param id the attribute identifier
+     * @param id the attribute identifier
      */
     virtual void MlmeGetRequest(MacPibAttributeIdentifier id) = 0;
 
@@ -770,7 +772,7 @@
      * The callback implements MCPS-DATA.confirm SAP of IEEE 802.15.4-2006,
      * section 7.1.1.2.
      *
-     * \param c the callback
+     * @param c the callback
      */
     void SetMcpsDataConfirmCallback(McpsDataConfirmCallback c);
 
@@ -779,7 +781,7 @@
      * The callback implements MCPS-DATA.indication SAP of IEEE 802.15.4-2006,
      * section 7.1.1.3.
      *
-     * \param c the callback
+     * @param c the callback
      */
     void SetMcpsDataIndicationCallback(McpsDataIndicationCallback c);
 
@@ -788,7 +790,7 @@
      * The callback implements MLME-ASSOCIATE.indication SAP of IEEE 802.15.4-2011,
      * section 6.2.2.2.
      *
-     * \param c the callback
+     * @param c the callback
      */
     void SetMlmeAssociateIndicationCallback(MlmeAssociateIndicationCallback c);
 
@@ -797,7 +799,7 @@
      * The callback implements MLME-COMM-STATUS.indication SAP of IEEE 802.15.4-2011,
      * section 6.2.4.2.
      *
-     * \param c the callback
+     * @param c the callback
      */
     void SetMlmeCommStatusIndicationCallback(MlmeCommStatusIndicationCallback c);
 
@@ -806,7 +808,7 @@
      * The callback implements MLME-ORPHAN.indication SAP of IEEE 802.15.4-2011,
      * section 6.2.7.1.
      *
-     * \param c the callback
+     * @param c the callback
      */
     void SetMlmeOrphanIndicationCallback(MlmeOrphanIndicationCallback c);
 
@@ -815,7 +817,7 @@
      * The callback implements MLME-START.confirm SAP of IEEE 802.15.4-2006,
      * section 7.1.14.2.
      *
-     * \param c the callback
+     * @param c the callback
      */
     void SetMlmeStartConfirmCallback(MlmeStartConfirmCallback c);
 
@@ -824,7 +826,7 @@
      * The callback implements MLME-SCAN.confirm SAP of IEEE 802.15.4-2011,
      * section 6.2.10.2.
      *
-     * \param c the callback
+     * @param c the callback
      */
     void SetMlmeScanConfirmCallback(MlmeScanConfirmCallback c);
 
@@ -833,7 +835,7 @@
      * The callback implements MLME-ASSOCIATE.confirm SAP of IEEE 802.15.4-2011,
      * section 6.2.2.4.
      *
-     * \param c the callback
+     * @param c the callback
      */
     void SetMlmeAssociateConfirmCallback(MlmeAssociateConfirmCallback c);
 
@@ -842,7 +844,7 @@
      * The callback implements MLME-BEACON-NOTIFY.indication SAP of IEEE 802.15.4-2011,
      * section 6.2.4.1.
      *
-     * \param c the callback
+     * @param c the callback
      */
     void SetMlmeBeaconNotifyIndicationCallback(MlmeBeaconNotifyIndicationCallback c);
 
@@ -851,7 +853,7 @@
      * The callback implements MLME-SYNC-LOSS.indication SAP of IEEE 802.15.4-2011,
      * section 6.2.13.2.
      *
-     * \param c the callback
+     * @param c the callback
      */
     void SetMlmeSyncLossIndicationCallback(MlmeSyncLossIndicationCallback c);
 
@@ -860,7 +862,7 @@
      * The callback implements MLME-SET.confirm SAP of IEEE 802.15.4-2011,
      * section 6.2.11.2
      *
-     * \param c the callback
+     * @param c the callback
      */
     void SetMlmeSetConfirmCallback(MlmeSetConfirmCallback c);
 
@@ -869,7 +871,7 @@
      * The callback implements MLME-GET.confirm SAP of IEEE 802.15.4-2011,
      * section 6.2.5.2
      *
-     * \param c the callback
+     * @param c the callback
      */
     void SetMlmeGetConfirmCallback(MlmeGetConfirmCallback c);
 
@@ -878,7 +880,7 @@
      * The callback implements MLME-POLL.confirm SAP of IEEE 802.15.4-2011,
      * section 6.2.14.2
      *
-     * \param c the callback
+     * @param c the callback
      */
     void SetMlmePollConfirmCallback(MlmePollConfirmCallback c);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/model/lr-wpan-mac.cc ns-3.44/src/lr-wpan/model/lr-wpan-mac.cc
--- ns-3.43/src/lr-wpan/model/lr-wpan-mac.cc	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/model/lr-wpan-mac.cc	2025-03-09 16:55:49.419371100 -0700
@@ -19,13 +19,13 @@
 #include "lr-wpan-mac-pl-headers.h"
 #include "lr-wpan-mac-trailer.h"
 
-#include <ns3/double.h>
-#include <ns3/log.h>
-#include <ns3/node.h>
-#include <ns3/packet.h>
-#include <ns3/random-variable-stream.h>
-#include <ns3/simulator.h>
-#include <ns3/uinteger.h>
+#include "ns3/double.h"
+#include "ns3/log.h"
+#include "ns3/node.h"
+#include "ns3/packet.h"
+#include "ns3/random-variable-stream.h"
+#include "ns3/simulator.h"
+#include "ns3/uinteger.h"
 
 #undef NS_LOG_APPEND_CONTEXT
 #define NS_LOG_APPEND_CONTEXT                                                                      \
@@ -76,7 +76,7 @@
         break;
     }
     return os;
-};
+}
 
 TypeId
 LrWpanMac::GetTypeId()
@@ -252,11 +252,14 @@
 
 LrWpanMac::~LrWpanMac()
 {
+    NS_LOG_FUNCTION(this);
 }
 
 void
 LrWpanMac::DoInitialize()
 {
+    NS_LOG_FUNCTION(this);
+
     if (m_macRxOnWhenIdle)
     {
         m_phy->PlmeSetTRXStateRequest(IEEE_802_15_4_PHY_RX_ON);
@@ -272,6 +275,8 @@
 void
 LrWpanMac::DoDispose()
 {
+    NS_LOG_FUNCTION(this);
+
     if (m_csmaCa)
     {
         m_csmaCa->Dispose();
@@ -291,6 +296,7 @@
     }
     m_indTxQueue.clear();
 
+    m_uniformVar = nullptr;
     m_phy = nullptr;
     m_mcpsDataConfirmCallback = MakeNullCallback<void, McpsDataConfirmParams>();
     m_mcpsDataIndicationCallback = MakeNullCallback<void, McpsDataIndicationParams, Ptr<Packet>>();
@@ -313,6 +319,7 @@
     m_scanEnergyEvent.Cancel();
     m_scanOrphanEvent.Cancel();
     m_beaconEvent.Cancel();
+    m_assocResCmdWaitTimeout.Cancel();
 
     Object::DoDispose();
 }
@@ -675,6 +682,8 @@
     // obtained from those operations.
     m_pendPrimitive = MLME_ASSOC_REQ;
     m_associateParams = params;
+    m_ignoreDataCmdAck = false;
+
     bool invalidRequest = false;
 
     if (params.m_coordPanId == 0xffff)
@@ -1036,8 +1045,7 @@
     else
     {
         // Extract the octets from m_macBeaconPayload and place them in a packet
-        uint8_t* octets = &m_macBeaconPayload[0];
-        beaconPacket = Create<Packet>(octets, m_macBeaconPayload.size());
+        beaconPacket = Create<Packet>(m_macBeaconPayload.data(), m_macBeaconPayload.size());
     }
 
     LrWpanMacHeader macHdr(LrWpanMacHeader::LRWPAN_MAC_BEACON, m_macBsn.GetValue());
@@ -2306,10 +2314,28 @@
                     case CommandPayloadHeader::ASSOCIATION_REQ:
                         NS_LOG_DEBUG("Association Request Command Received; processing ACK");
                         break;
-                    case CommandPayloadHeader::ASSOCIATION_RESP:
-                        m_assocResCmdWaitTimeout.Cancel(); // cancel event to a lost assoc resp cmd.
-                        NS_LOG_DEBUG("Association Response Command Received; processing ACK");
+                    case CommandPayloadHeader::ASSOCIATION_RESP: {
+                        if (m_assocResCmdWaitTimeout.IsPending())
+                        {
+                            m_assocResCmdWaitTimeout
+                                .Cancel(); // cancel event to a lost assoc resp cmd.
+                            NS_LOG_DEBUG("Association Response Command Received; processing ACK");
+                        }
+                        else
+                        {
+                            // Association response command was received before (or never received)
+                            // a Data request command ACK. This is an extreme case and it is
+                            // essentially caused by saturation in the network.
+                            // We turn a flag ON to not react once
+                            // we finally receive the Data request command ACK. This behavior is not
+                            // standard, but necessary to address this flaw in design of the
+                            // original association process.
+                            m_ignoreDataCmdAck = true;
+                            NS_LOG_DEBUG("Assoc. Resp Cmd received before Data Req. Cmd. in "
+                                         "Association request");
+                        }
                         break;
+                    }
                     default:
                         break;
                     }
@@ -2499,15 +2525,18 @@
                             }
 
                             case CommandPayloadHeader::DATA_REQ: {
-                                // Schedule an event in case the Association Response Command never
-                                // reached this device during an association process.
-                                double symbolRate = m_phy->GetDataOrSymbolRate(false);
-                                Time waitTime = Seconds(
-                                    static_cast<double>(m_assocRespCmdWaitTime) / symbolRate);
-                                m_assocResCmdWaitTimeout =
-                                    Simulator::Schedule(waitTime,
-                                                        &LrWpanMac::LostAssocRespCommand,
-                                                        this);
+                                if (!m_ignoreDataCmdAck)
+                                {
+                                    // Schedule an event in case the Association Response Command
+                                    // never reached this device during an association process.
+                                    double symbolRate = m_phy->GetDataOrSymbolRate(false);
+                                    Time waitTime = Seconds(
+                                        static_cast<double>(m_assocRespCmdWaitTime) / symbolRate);
+                                    m_assocResCmdWaitTimeout =
+                                        Simulator::Schedule(waitTime,
+                                                            &LrWpanMac::LostAssocRespCommand,
+                                                            this);
+                                }
 
                                 if (!m_mlmePollConfirmCallback.IsNull())
                                 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/model/lr-wpan-mac.h ns-3.44/src/lr-wpan/model/lr-wpan-mac.h
--- ns-3.43/src/lr-wpan/model/lr-wpan-mac.h	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/model/lr-wpan-mac.h	2025-03-09 16:55:49.419371100 -0700
@@ -18,10 +18,10 @@
 #include "lr-wpan-mac-base.h"
 #include "lr-wpan-phy.h"
 
-#include <ns3/event-id.h>
-#include <ns3/sequence-number.h>
-#include <ns3/traced-callback.h>
-#include <ns3/traced-value.h>
+#include "ns3/event-id.h"
+#include "ns3/sequence-number.h"
+#include "ns3/traced-callback.h"
+#include "ns3/traced-value.h"
 
 #include <deque>
 #include <memory>
@@ -36,14 +36,14 @@
 class LrWpanCsmaCa;
 
 /**
- * \defgroup lr-wpan LR-WPAN models
+ * @defgroup lr-wpan LR-WPAN models
  *
  * This section documents the API of the IEEE 802.15.4-related models.  For a generic functional
  * description, please refer to the ns-3 manual.
  */
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * Tx options
  */
@@ -56,7 +56,7 @@
 };
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * MAC states
  */
@@ -77,14 +77,14 @@
 /**
  *  Overloaded operator to print the value of a MacState.
  *
- *  \param os The output stream
- *  \param state The text value of the PHY state
- *  \return The output stream with text value of the MAC state
+ *  @param os The output stream
+ *  @param state The text value of the PHY state
+ *  @return The output stream with text value of the MAC state
  */
 std::ostream& operator<<(std::ostream& os, const MacState& state);
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * Superframe status
  */
@@ -97,7 +97,7 @@
 };
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * Superframe type
  */
@@ -108,7 +108,7 @@
 };
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * Indicates a pending MAC primitive
  */
@@ -125,27 +125,27 @@
 {
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  * TracedValue callback signature for MacState.
  *
- * \param [in] oldValue original value of the traced variable
- * \param [in] newValue new value of the traced variable
+ * @param [in] oldValue original value of the traced variable
+ * @param [in] newValue new value of the traced variable
  */
 typedef void (*MacState)(MacState oldValue, MacState newValue);
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  * TracedValue callback signature for SuperframeStatus.
  *
- * \param [in] oldValue original value of the traced variable
- * \param [in] newValue new value of the traced variable
+ * @param [in] oldValue original value of the traced variable
+ * @param [in] newValue new value of the traced variable
  */
 typedef void (*SuperframeStatus)(SuperframeStatus oldValue, SuperframeStatus newValue);
 
 } // namespace TracedValueCallback
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * Class that implements the LR-WPAN MAC state machine
  */
@@ -155,7 +155,7 @@
     /**
      * Get the type ID.
      *
-     * \return the object TypeId
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -168,14 +168,14 @@
     /**
      * Check if the receiver will be enabled when the MAC is idle.
      *
-     * \return true, if the receiver is enabled during idle periods, false otherwise
+     * @return true, if the receiver is enabled during idle periods, false otherwise
      */
     bool GetRxOnWhenIdle() const;
 
     /**
      * Set if the receiver should be enabled when the MAC is idle.
      *
-     * \param rxOnWhenIdle set to true to enable the receiver during idle periods
+     * @param rxOnWhenIdle set to true to enable the receiver during idle periods
      */
     void SetRxOnWhenIdle(bool rxOnWhenIdle);
 
@@ -183,56 +183,56 @@
     /**
      * Set the short address of this MAC.
      *
-     * \param address the new address
+     * @param address the new address
      */
     void SetShortAddress(Mac16Address address);
 
     /**
      * Get the short address of this MAC.
      *
-     * \return the short address
+     * @return the short address
      */
     Mac16Address GetShortAddress() const;
 
     /**
      * Set the extended address of this MAC.
      *
-     * \param address the new address
+     * @param address the new address
      */
     void SetExtendedAddress(Mac64Address address);
 
     /**
      * Get the extended address of this MAC.
      *
-     * \return the extended address
+     * @return the extended address
      */
     Mac64Address GetExtendedAddress() const;
 
     /**
      * Set the PAN id used by this MAC.
      *
-     * \param panId the new PAN id.
+     * @param panId the new PAN id.
      */
     void SetPanId(uint16_t panId);
 
     /**
      * Get the PAN id used by this MAC.
      *
-     * \return the PAN id.
+     * @return the PAN id.
      */
     uint16_t GetPanId() const;
 
     /**
      * Get the coordinator short address currently associated to this device.
      *
-     * \return The coordinator short address
+     * @return The coordinator short address
      */
     Mac16Address GetCoordShortAddress() const;
 
     /**
      * Get the coordinator extended address currently associated to this device.
      *
-     * \return The coordinator extended address
+     * @return The coordinator extended address
      */
     Mac64Address GetCoordExtAddress() const;
 
@@ -259,21 +259,21 @@
     /**
      * Set the CSMA/CA implementation to be used by the MAC.
      *
-     * \param csmaCa the CSMA/CA implementation
+     * @param csmaCa the CSMA/CA implementation
      */
     void SetCsmaCa(Ptr<LrWpanCsmaCa> csmaCa);
 
     /**
      * Set the underlying PHY for the MAC.
      *
-     * \param phy the PHY
+     * @param phy the PHY
      */
     void SetPhy(Ptr<LrWpanPhy> phy);
 
     /**
      * Get the underlying PHY of the MAC.
      *
-     * \return the PHY
+     * @return the PHY
      */
     Ptr<LrWpanPhy> GetPhy();
 
@@ -285,16 +285,16 @@
      * IEEE 802.15.4-2006 section 6.2.1.3
      * PD-DATA.indication
      * Indicates the transfer of an MPDU from PHY to MAC (receiving)
-     * \param psduLength number of bytes in the PSDU
-     * \param p the packet to be transmitted
-     * \param lqi Link quality (LQI) value measured during reception of the PPDU
+     * @param psduLength number of bytes in the PSDU
+     * @param p the packet to be transmitted
+     * @param lqi Link quality (LQI) value measured during reception of the PPDU
      */
     void PdDataIndication(uint32_t psduLength, Ptr<Packet> p, uint8_t lqi);
 
     /**
      * IEEE 802.15.4-2006 section 6.2.1.2
      * Confirm the end of transmission of an MPDU to MAC
-     * \param status to report to MAC
+     * @param status to report to MAC
      *        PHY PD-DATA.confirm status
      */
     void PdDataConfirm(PhyEnumeration status);
@@ -302,15 +302,15 @@
     /**
      * IEEE 802.15.4-2006 section 6.2.2.2
      * PLME-CCA.confirm status
-     * \param status TRX_OFF, BUSY or IDLE
+     * @param status TRX_OFF, BUSY or IDLE
      */
     void PlmeCcaConfirm(PhyEnumeration status);
 
     /**
      * IEEE 802.15.4-2006 section 6.2.2.4
      * PLME-ED.confirm status and energy level
-     * \param status SUCCESS, TRX_OFF or TX_ON
-     * \param energyLevel 0x00-0xff ED level for the channel
+     * @param status SUCCESS, TRX_OFF or TX_ON
+     * @param energyLevel 0x00-0xff ED level for the channel
      */
     void PlmeEdConfirm(PhyEnumeration status, uint8_t energyLevel);
 
@@ -318,9 +318,9 @@
      * IEEE 802.15.4-2006 section 6.2.2.6
      * PLME-GET.confirm
      * Get attributes per definition from Table 23 in section 6.4.2
-     * \param status SUCCESS or UNSUPPORTED_ATTRIBUTE
-     * \param id the attributed identifier
-     * \param attribute the attribute value
+     * @param status SUCCESS or UNSUPPORTED_ATTRIBUTE
+     * @param id the attributed identifier
+     * @param attribute the attribute value
      */
     void PlmeGetAttributeConfirm(PhyEnumeration status,
                                  PhyPibAttributeIdentifier id,
@@ -330,7 +330,7 @@
      * IEEE 802.15.4-2006 section 6.2.2.8
      * PLME-SET-TRX-STATE.confirm
      * Set PHY state
-     * \param status in RX_ON,TRX_OFF,FORCE_TRX_OFF,TX_ON
+     * @param status in RX_ON,TRX_OFF,FORCE_TRX_OFF,TX_ON
      */
     void PlmeSetTRXStateConfirm(PhyEnumeration status);
 
@@ -338,29 +338,29 @@
      * IEEE 802.15.4-2006 section 6.2.2.10
      * PLME-SET.confirm
      * Set attributes per definition from Table 23 in section 6.4.2
-     * \param status SUCCESS, UNSUPPORTED_ATTRIBUTE, INVALID_PARAMETER, or READ_ONLY
-     * \param id the attributed identifier
+     * @param status SUCCESS, UNSUPPORTED_ATTRIBUTE, INVALID_PARAMETER, or READ_ONLY
+     * @param id the attributed identifier
      */
     void PlmeSetAttributeConfirm(PhyEnumeration status, PhyPibAttributeIdentifier id);
 
     /**
      * CSMA-CA algorithm calls back the MAC after executing channel assessment.
      *
-     * \param macState indicate BUSY or IDLE channel condition
+     * @param macState indicate BUSY or IDLE channel condition
      */
     void SetLrWpanMacState(MacState macState);
 
     /**
      * Set the max size of the transmit queue.
      *
-     * \param queueSize The transmit queue size.
+     * @param queueSize The transmit queue size.
      */
     void SetTxQMaxSize(uint32_t queueSize);
 
     /**
      * Set the max size of the indirect transmit queue (Pending Transaction list)
      *
-     * \param queueSize The indirect transmit queue size.
+     * @param queueSize The indirect transmit queue size.
      */
     void SetIndTxQMaxSize(uint32_t queueSize);
 
@@ -491,7 +491,7 @@
     uint16_t m_macPanId;
 
     /**
-     * Temporally stores the value of the current m_macPanId when a MLME-SCAN.request is performed.
+     * Temporarily stores the value of the current m_macPanId when a MLME-SCAN.request is performed.
      * See IEEE 802.15.4-2011, section 5.1.2.1.2.
      */
     uint16_t m_macPanIdScan;
@@ -624,14 +624,14 @@
     /**
      * Get the macAckWaitDuration attribute value.
      *
-     * \return the maximum number symbols to wait for an acknowledgment frame
+     * @return the maximum number symbols to wait for an acknowledgment frame
      */
     uint64_t GetMacAckWaitDuration() const;
 
     /**
      * Get the macMaxFrameRetries attribute value.
      *
-     * \return the maximum number of retries
+     * @return the maximum number of retries
      */
     uint8_t GetMacMaxFrameRetries() const;
 
@@ -643,61 +643,61 @@
     /**
      * Set the macMaxFrameRetries attribute value.
      *
-     * \param retries the maximum number of retries
+     * @param retries the maximum number of retries
      */
     void SetMacMaxFrameRetries(uint8_t retries);
 
     /**
      * Check if the packet destination is its coordinator
      *
-     * \return True if m_txPkt (packet awaiting to be sent) destination is its coordinator
+     * @return True if m_txPkt (packet awaiting to be sent) destination is its coordinator
      */
     bool IsCoordDest();
 
     /**
      * Check if the packet destination is its coordinator
      *
-     * \param mac The coordinator short MAC Address
+     * @param mac The coordinator short MAC Address
      */
     void SetAssociatedCoor(Mac16Address mac);
 
     /**
      * Check if the packet destination is its coordinator
      *
-     * \param mac The coordinator extended MAC Address
+     * @param mac The coordinator extended MAC Address
      */
     void SetAssociatedCoor(Mac64Address mac);
 
     /**
      * Get the size of the Interframe Space according to MPDU size (m_txPkt).
      *
-     * \return the IFS size in symbols
+     * @return the IFS size in symbols
      */
     uint32_t GetIfsSize();
 
     /**
      * Obtain the number of symbols in the packet which is currently being sent by the MAC layer.
      *
-     * \return packet number of symbols
+     * @return packet number of symbols
      */
     uint64_t GetTxPacketSymbols();
 
     /**
      * Check if the packet to transmit requires acknowledgment
      *
-     * \return True if the Tx packet requires acknowledgment
+     * @return True if the Tx packet requires acknowledgment
      */
     bool IsTxAckReq();
 
     /**
      * Print the Pending transaction list.
-     * \param os The reference to the output stream used by this print function.
+     * @param os The reference to the output stream used by this print function.
      */
     void PrintPendingTxQueue(std::ostream& os) const;
 
     /**
      * Print the Transmit Queue.
-     * \param os The reference to the output stream used by this print function.
+     * @param os The reference to the output stream used by this print function.
      */
     void PrintTxQueue(std::ostream& os) const;
 
@@ -705,26 +705,26 @@
      * Assign a fixed random variable stream number to the random variables
      * used by this model.  Return the number of streams that have been assigned.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream);
 
     /**
      * TracedCallback signature for sent packets.
      *
-     * \param [in] packet The packet.
-     * \param [in] retries The number of retries.
-     * \param [in] backoffs The number of CSMA backoffs.
+     * @param [in] packet The packet.
+     * @param [in] retries The number of retries.
+     * @param [in] backoffs The number of CSMA backoffs.
      */
     typedef void (*SentTracedCallback)(Ptr<const Packet> packet, uint8_t retries, uint8_t backoffs);
 
     /**
      * TracedCallback signature for MacState change events.
      *
-     * \param [in] oldValue The original state value.
-     * \param [in] newValue The new state value.
-     * \deprecated The MacState is now accessible as the
+     * @param [in] oldValue The original state value.
+     * @param [in] newValue The new state value.
+     * @deprecated The MacState is now accessible as the
      * TracedValue \c MacStateValue. The \c MacState TracedCallback will
      * be removed in a future release.
      */
@@ -777,7 +777,7 @@
     /**
      * Called to send an associate response command.
      *
-     * \param rxDataReqPkt The received data request pkt that instigated the Association response
+     * @param rxDataReqPkt The received data request pkt that instigated the Association response
      * command.
      */
     void SendAssocResponseCommand(Ptr<Packet> rxDataReqPkt);
@@ -824,7 +824,7 @@
      * Called to begin the Contention Free Period (CFP) in a
      * beacon-enabled mode.
      *
-     * \param superframeType The incoming or outgoing superframe reference
+     * @param superframeType The incoming or outgoing superframe reference
      */
     void StartCFP(SuperframeType superframeType);
 
@@ -832,14 +832,14 @@
      * Called to begin the Contention Access Period (CAP) in a
      * beacon-enabled mode.
      *
-     * \param superframeType The incoming or outgoing superframe reference
+     * @param superframeType The incoming or outgoing superframe reference
      */
     void StartCAP(SuperframeType superframeType);
 
     /**
      * Start the Inactive Period in a beacon-enabled mode.
      *
-     * \param superframeType The incoming or outgoing superframe reference
+     * @param superframeType The incoming or outgoing superframe reference
      *
      */
     void StartInactivePeriod(SuperframeType superframeType);
@@ -858,22 +858,22 @@
     /**
      * Used to process the reception of a beacon packet.
      *
-     * \param lqi The value of the link quality indicator (LQI) of the received packet
-     * \param p The packet containing the MAC header and the beacon payload information
+     * @param lqi The value of the link quality indicator (LQI) of the received packet
+     * @param p The packet containing the MAC header and the beacon payload information
      */
     void ReceiveBeacon(uint8_t lqi, Ptr<Packet> p);
 
     /**
      * Send an acknowledgment packet for the given sequence number.
      *
-     * \param seqno the sequence number for the ACK
+     * @param seqno the sequence number for the ACK
      */
     void SendAck(uint8_t seqno);
 
     /**
      * Add an element to the transmission queue.
      *
-     * \param txQElement The element added to the Tx Queue.
+     * @param txQElement The element added to the Tx Queue.
      */
     void EnqueueTxQElement(Ptr<TxQueueElement> txQElement);
 
@@ -886,7 +886,7 @@
     /**
      * Change the current MAC state to the given new state.
      *
-     * \param newState the new state
+     * @param newState the new state
      */
     void ChangeMacState(MacState newState);
 
@@ -901,7 +901,7 @@
      * the mac layer wait an Interframe Space (IFS) time and triggers this function
      * to continue with the MAC flow.
      *
-     * \param ifsTime IFS time
+     * @param ifsTime IFS time
      */
     void IfsWaitTimeout(Time ifsTime);
 
@@ -909,23 +909,23 @@
      * Check for remaining retransmissions for the packet currently being sent.
      * Drop the packet, if there are no retransmissions left.
      *
-     * \return true, if the packet should be retransmitted, false otherwise.
+     * @return true, if the packet should be retransmitted, false otherwise.
      */
     bool PrepareRetransmission();
 
     /**
      * Adds a packet to the pending transactions list (Indirect transmissions).
      *
-     * \param p The packet added to pending transaction list.
+     * @param p The packet added to pending transaction list.
      */
     void EnqueueInd(Ptr<Packet> p);
 
     /**
      * Extracts a packet from pending transactions list (Indirect transmissions).
-     * \param dst The extended address used an index to obtain an element from the pending
+     * @param dst The extended address used an index to obtain an element from the pending
      * transaction list.
-     * \param entry The dequeued element from the pending transaction list.
-     * \return The status of the dequeue
+     * @param entry The dequeued element from the pending transaction list.
+     * @return The status of the dequeue
      */
     bool DequeueInd(Mac64Address dst, Ptr<IndTxQueueElement> entry);
 
@@ -937,7 +937,7 @@
     /**
      * Remove an element from the pending transaction list.
      *
-     * \param p The packet to be removed from the pending transaction list.
+     * @param p The packet to be removed from the pending transaction list.
      */
     void RemovePendTxQElement(Ptr<Packet> p);
 
@@ -952,7 +952,7 @@
      * Constructs a Superframe specification field from the local information,
      * the superframe Specification field is necessary to create a beacon frame.
      *
-     * \returns the Superframe specification field (bitmap)
+     * @returns the Superframe specification field (bitmap)
      */
     uint16_t GetSuperframeField();
 
@@ -960,7 +960,7 @@
      * Constructs the Guaranteed Time Slots (GTS) Fields from local information.
      * The GTS Fields are part of the beacon frame.
      *
-     * \returns the Guaranteed Time Slots (GTS) Fields
+     * @returns the Guaranteed Time Slots (GTS) Fields
      */
     GtsFields GetGtsFields();
 
@@ -968,7 +968,7 @@
      * Constructs Pending Address Fields from the local information,
      * the Pending Address Fields are part of the beacon frame.
      *
-     * \returns the Pending Address Fields
+     * @returns the Pending Address Fields
      */
     PendingAddrFields GetPendingAddrFields();
 
@@ -985,7 +985,7 @@
      * The data should represent:
      * packet, number of retries, total number of csma backoffs
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>, uint8_t, uint8_t> m_sentPktTrace;
 
@@ -993,7 +993,7 @@
      * The trace source fired when packets come into the "top" of the device
      * at the L3/L2 transition, when being queued for transmission.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_macTxEnqueueTrace;
 
@@ -1001,7 +1001,7 @@
      * The trace source fired when packets are dequeued from the
      * L3/l2 transmission queue.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_macTxDequeueTrace;
 
@@ -1009,7 +1009,7 @@
      * The trace source fired when packets come into the "top" of the device
      * at the L3/L2 transition, when being queued for indirect transmission
      * (pending transaction list).
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_macIndTxEnqueueTrace;
 
@@ -1017,14 +1017,14 @@
      * The trace source fired when packets are dequeued from the
      * L3/l2 indirect transmission queue (Pending transaction list).
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_macIndTxDequeueTrace;
 
     /**
      * The trace source fired when packets are being sent down to L1.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_macTxTrace;
 
@@ -1033,7 +1033,7 @@
      * an acknowledgment was received, if requested, or the packet was
      * successfully sent by L1, if no ACK was requested.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_macTxOkTrace;
 
@@ -1041,7 +1041,7 @@
      * The trace source fired when packets are dropped due to missing ACKs or
      * because of transmission failures in L1.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_macTxDropTrace;
 
@@ -1049,7 +1049,7 @@
      * The trace source fired when packets are dropped due to indirect Tx queue
      * overflows or expiration.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_macIndTxDropTrace;
 
@@ -1058,7 +1058,7 @@
      * immediately before being forwarded up to higher layers (at the L2/L3
      * transition).  This is a promiscuous trace.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_macPromiscRxTrace;
 
@@ -1067,7 +1067,7 @@
      * immediately before being forwarded up to higher layers (at the L2/L3
      * transition).  This is a non-promiscuous trace.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_macRxTrace;
 
@@ -1076,7 +1076,7 @@
      * but dropped before being forwarded up to higher layers (at the L2/L3
      * transition).
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_macRxDropTrace;
 
@@ -1096,7 +1096,7 @@
      * this would correspond to the point at which the packet is dispatched to
      * packet sniffers in netif_receive_skb.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_snifferTrace;
 
@@ -1116,7 +1116,7 @@
      * this would correspond to the point at which the packet is dispatched to
      * packet sniffers in netif_receive_skb.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_promiscSnifferTrace;
 
@@ -1124,7 +1124,7 @@
      * A trace source that fires when the MAC changes states.
      * Parameters are the old mac state and the new mac state.
      *
-     * \deprecated This TracedCallback is deprecated and will be
+     * @deprecated This TracedCallback is deprecated and will be
      * removed in a future release,  Instead, use the \c MacStateValue
      * TracedValue.
      */
@@ -1262,6 +1262,14 @@
     uint8_t m_lastRxFrameLqi;
 
     /**
+     * This flag informs the MAC that an association response command was received
+     * before the acknowledgment (ACK) for the data request command that
+     * should precede it. This situation typically occurs due to network saturation.
+     */
+
+    bool m_ignoreDataCmdAck;
+
+    /**
      * Scheduler event for the ACK timeout of the currently transmitted data
      * packet.
      */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/model/lr-wpan-mac-header.cc ns-3.44/src/lr-wpan/model/lr-wpan-mac-header.cc
--- ns-3.43/src/lr-wpan/model/lr-wpan-mac-header.cc	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/model/lr-wpan-mac-header.cc	2025-03-09 16:55:49.419371100 -0700
@@ -7,7 +7,7 @@
  */
 #include "lr-wpan-mac-header.h"
 
-#include <ns3/address-utils.h>
+#include "ns3/address-utils.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/model/lr-wpan-mac-header.h ns-3.44/src/lr-wpan/model/lr-wpan-mac-header.h
--- ns-3.43/src/lr-wpan/model/lr-wpan-mac-header.h	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/model/lr-wpan-mac-header.h	2025-03-09 16:55:49.419371100 -0700
@@ -26,9 +26,9 @@
 #ifndef LR_WPAN_MAC_HEADER_H
 #define LR_WPAN_MAC_HEADER_H
 
-#include <ns3/header.h>
-#include <ns3/mac16-address.h>
-#include <ns3/mac64-address.h>
+#include "ns3/header.h"
+#include "ns3/mac16-address.h"
+#include "ns3/mac64-address.h"
 
 namespace ns3
 {
@@ -36,7 +36,7 @@
 {
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  * Represent the Mac Header with the Frame Control and Sequence Number fields
  */
 class LrWpanMacHeader : public Header
@@ -80,10 +80,10 @@
 
     /**
      * Constructor
-     * \param wpanMacType the header MAC type
-     * \param seqNum the sequence number
+     * @param wpanMacType the header MAC type
+     * @param seqNum the sequence number
      *
-     * \internal
+     * @internal
      * Data, ACK, Control MAC Header must have frame control and sequence number.
      * Beacon MAC Header must have frame control, sequence number, source PAN Id, source address.
      */
@@ -93,158 +93,158 @@
 
     /**
      * Get the header type
-     * \return the header type
+     * @return the header type
      */
     LrWpanMacType GetType() const;
     /**
      * Get the Frame control field
-     * \return the Frame control field
+     * @return the Frame control field
      */
     uint16_t GetFrameControl() const;
     /**
      * Check if Security Enabled bit of Frame Control is enabled
-     * \return true if Security Enabled bit is enabled
+     * @return true if Security Enabled bit is enabled
      */
     bool IsSecEnable() const;
     /**
      * Check if Frame Pending bit of Frame Control is enabled
-     * \return true if Frame Pending bit is enabled
+     * @return true if Frame Pending bit is enabled
      */
     bool IsFrmPend() const;
     /**
      * Check if Ack. Request bit of Frame Control is enabled
-     * \return true if Ack. Request bit is enabled
+     * @return true if Ack. Request bit is enabled
      */
     bool IsAckReq() const;
     /**
      * Check if PAN ID Compression bit of Frame Control is enabled
-     * \return true if PAN ID Compression bit is enabled
+     * @return true if PAN ID Compression bit is enabled
      */
     bool IsPanIdComp() const;
     /**
      * Get the Reserved bits of Frame control field
-     * \return the Reserved bits
+     * @return the Reserved bits
      */
     uint8_t GetFrmCtrlRes() const;
     /**
      * Get the Dest. Addressing Mode of Frame control field
-     * \return the Dest. Addressing Mode bits
+     * @return the Dest. Addressing Mode bits
      */
     uint8_t GetDstAddrMode() const;
     /**
      * Get the Frame Version of Frame control field
-     * \return the Frame Version bits
+     * @return the Frame Version bits
      */
     uint8_t GetFrameVer() const;
     /**
      * Get the Source Addressing Mode of Frame control field
-     * \return the Source Addressing Mode bits
+     * @return the Source Addressing Mode bits
      */
     uint8_t GetSrcAddrMode() const;
     /**
      * Get the frame Sequence number
-     * \return the sequence number
+     * @return the sequence number
      */
     uint8_t GetSeqNum() const;
     /**
      * Get the Destination PAN ID
-     * \return the Destination PAN ID
+     * @return the Destination PAN ID
      */
     uint16_t GetDstPanId() const;
     /**
      * Get the Destination Short address
-     * \return the Destination Short address
+     * @return the Destination Short address
      */
     Mac16Address GetShortDstAddr() const;
     /**
      * Get the Destination Extended address
-     * \return the Destination Extended address
+     * @return the Destination Extended address
      */
     Mac64Address GetExtDstAddr() const;
     /**
      * Get the Source PAN ID
-     * \return the Source PAN ID
+     * @return the Source PAN ID
      */
     uint16_t GetSrcPanId() const;
     /**
      * Get the Source Short address
-     * \return the Source Short address
+     * @return the Source Short address
      */
     Mac16Address GetShortSrcAddr() const;
     /**
      * Get the Source Extended address
-     * \return the Source Extended address
+     * @return the Source Extended address
      */
     Mac64Address GetExtSrcAddr() const;
     /**
      * Get the Auxiliary Security Header - Security Control Octet
-     * \return the Auxiliary Security Header - Security Control Octet
+     * @return the Auxiliary Security Header - Security Control Octet
      */
     uint8_t GetSecControl() const;
     /**
      * Get the Auxiliary Security Header - Frame Counter Octets
-     * \return the Auxiliary Security Header - Frame Counter Octets
+     * @return the Auxiliary Security Header - Frame Counter Octets
      */
     uint32_t GetFrmCounter() const;
 
     /**
      * Get the Auxiliary Security Header - Security Control - Security Level bits
-     * \return the Auxiliary Security Header - Security Control - Security Level bits
+     * @return the Auxiliary Security Header - Security Control - Security Level bits
      */
     uint8_t GetSecLevel() const;
     /**
      * Get the Auxiliary Security Header - Security Control - Key Identifier Mode bits
-     * \return the Auxiliary Security Header - Security Control - Key Identifier Mode bits
+     * @return the Auxiliary Security Header - Security Control - Key Identifier Mode bits
      */
     uint8_t GetKeyIdMode() const;
     /**
      * Get the Auxiliary Security Header - Security Control - Reserved bits
-     * \return the Auxiliary Security Header - Security Control - Reserved bits
+     * @return the Auxiliary Security Header - Security Control - Reserved bits
      */
     uint8_t GetSecCtrlReserved() const;
     /**
      * Get the Auxiliary Security Header - Key Identifier - Key Source (2 Octets)
-     * \return the Auxiliary Security Header - Key Identifier - Key Source  (2 Octets)
+     * @return the Auxiliary Security Header - Key Identifier - Key Source  (2 Octets)
      */
     uint32_t GetKeyIdSrc32() const;
     /**
      * Get the Auxiliary Security Header - Key Identifier - Key Source (4 Octets)
-     * \return the Auxiliary Security Header - Key Identifier - Key Source  (4 Octets)
+     * @return the Auxiliary Security Header - Key Identifier - Key Source  (4 Octets)
      */
     uint64_t GetKeyIdSrc64() const;
     /**
      * Get the Auxiliary Security Header - Key Identifier - Key Index
-     * \return the Auxiliary Security Header - Key Identifier - Key Index
+     * @return the Auxiliary Security Header - Key Identifier - Key Index
      */
     uint8_t GetKeyIdIndex() const;
     /**
      * Returns true if the header is a beacon
-     * \return true if the header is a beacon
+     * @return true if the header is a beacon
      */
     bool IsBeacon() const;
     /**
      * Returns true if the header is a data
-     * \return true if the header is a data
+     * @return true if the header is a data
      */
     bool IsData() const;
     /**
      * Returns true if the header is an ack
-     * \return true if the header is an ack
+     * @return true if the header is an ack
      */
     bool IsAcknowledgment() const;
     /**
      * Returns true if the header is a command
-     * \return true if the header is a command
+     * @return true if the header is a command
      */
     bool IsCommand() const;
     /**
      * Set the Frame Control field "Frame Type" bits
-     * \param wpanMacType the frame type
+     * @param wpanMacType the frame type
      */
     void SetType(LrWpanMacType wpanMacType);
     /**
      * Set the whole Frame Control field
-     * \param frameControl the Frame Control field
+     * @param frameControl the Frame Control field
      */
     void SetFrameControl(uint16_t frameControl);
     /**
@@ -281,102 +281,102 @@
     void SetNoPanIdComp();
     /**
      * Set the Frame Control field "Reserved" bits
-     * \param res reserved bits
+     * @param res reserved bits
      */
     void SetFrmCtrlRes(uint8_t res);
     /**
      * Set the Destination address mode
-     * \param addrMode Destination address mode
+     * @param addrMode Destination address mode
      */
     void SetDstAddrMode(uint8_t addrMode);
     /**
      * Set the Frame version
-     * \param ver frame version
+     * @param ver frame version
      */
     void SetFrameVer(uint8_t ver);
     /**
      * Set the Source address mode
-     * \param addrMode Source address mode
+     * @param addrMode Source address mode
      */
     void SetSrcAddrMode(uint8_t addrMode);
     /**
      * Set the Sequence number
-     * \param seqNum sequence number
+     * @param seqNum sequence number
      */
     void SetSeqNum(uint8_t seqNum);
     /* The Source/Destination Addressing fields are only set if SrcAddrMode/DstAddrMode are set */
     /**
      * Set Source address fields
-     * \param panId source PAN ID
-     * \param addr source address (16 bit)
+     * @param panId source PAN ID
+     * @param addr source address (16 bit)
      */
     void SetSrcAddrFields(uint16_t panId, Mac16Address addr);
     /**
      * Set Source address fields
-     * \param panId source PAN ID
-     * \param addr source address (64 bit)
+     * @param panId source PAN ID
+     * @param addr source address (64 bit)
      */
     void SetSrcAddrFields(uint16_t panId, Mac64Address addr);
     /**
      * Set Destination address fields
-     * \param panId destination PAN ID
-     * \param addr destination address (16 bit)
+     * @param panId destination PAN ID
+     * @param addr destination address (16 bit)
      */
     void SetDstAddrFields(uint16_t panId, Mac16Address addr);
     /**
      * Set Destination address fields
-     * \param panId destination PAN ID
-     * \param addr destination address (64 bit)
+     * @param panId destination PAN ID
+     * @param addr destination address (64 bit)
      */
     void SetDstAddrFields(uint16_t panId, Mac64Address addr);
 
     /* Auxiliary Security Header is only set if Sec Enable (SecU) field is set to 1 */
     /**
      * Set the auxiliary security header "Security Control" octet
-     * \param secLevel the "Security Control" octet
+     * @param secLevel the "Security Control" octet
      */
     void SetSecControl(uint8_t secLevel);
     /**
      * Set the auxiliary security header "Frame Counter" octet
-     * \param frmCntr the "Frame Counter" octet
+     * @param frmCntr the "Frame Counter" octet
      */
     void SetFrmCounter(uint32_t frmCntr);
     /**
      * Set the Security Control field "Security Level" bits (3 bits)
-     * \param secLevel the "Security Level" bits
+     * @param secLevel the "Security Level" bits
      */
     void SetSecLevel(uint8_t secLevel);
     /**
      * Set the Security Control field "Key Identifier Mode" bits (2 bits)
-     * \param keyIdMode the "Key Identifier Mode" bits
+     * @param keyIdMode the "Key Identifier Mode" bits
      */
     void SetKeyIdMode(uint8_t keyIdMode);
     /**
      * Set the Security Control field "Reserved" bits (3 bits)
-     * \param res the "Reserved" bits
+     * @param res the "Reserved" bits
      */
     void SetSecCtrlReserved(uint8_t res);
     /* Variable length will be dependent on Key Id Mode*/
     /**
      * Set the Key Index
-     * \param keyIndex the Key index
+     * @param keyIndex the Key index
      */
     void SetKeyId(uint8_t keyIndex);
     /**
      * Set the Key Index and originator
-     * \param keySrc the originator of a group key
-     * \param keyIndex the Key index
+     * @param keySrc the originator of a group key
+     * @param keyIndex the Key index
      */
     void SetKeyId(uint32_t keySrc, uint8_t keyIndex);
     /**
      * Set the Key Index and originator
-     * \param keySrc the originator of a group key
-     * \param keyIndex the Key index
+     * @param keySrc the originator of a group key
+     * @param keyIndex the Key index
      */
     void SetKeyId(uint64_t keySrc, uint8_t keyIndex);
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/model/lr-wpan-mac-pl-headers.cc ns-3.44/src/lr-wpan/model/lr-wpan-mac-pl-headers.cc
--- ns-3.43/src/lr-wpan/model/lr-wpan-mac-pl-headers.cc	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/model/lr-wpan-mac-pl-headers.cc	2025-03-09 16:55:49.419371100 -0700
@@ -8,8 +8,8 @@
 
 #include "lr-wpan-mac-pl-headers.h"
 
-#include <ns3/address-utils.h>
-#include <ns3/simulator.h>
+#include "ns3/address-utils.h"
+#include "ns3/simulator.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/model/lr-wpan-mac-pl-headers.h ns-3.44/src/lr-wpan/model/lr-wpan-mac-pl-headers.h
--- ns-3.43/src/lr-wpan/model/lr-wpan-mac-pl-headers.h	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/model/lr-wpan-mac-pl-headers.h	2025-03-09 16:55:49.419371100 -0700
@@ -11,9 +11,9 @@
 
 #include "lr-wpan-fields.h"
 
-#include <ns3/header.h>
-#include <ns3/mac16-address.h>
-#include <ns3/mac64-address.h>
+#include "ns3/header.h"
+#include "ns3/mac16-address.h"
+#include "ns3/mac64-address.h"
 
 namespace ns3
 {
@@ -21,7 +21,7 @@
 {
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  * Implements the header for the MAC payload beacon frame according to
  * the IEEE 802.15.4-2011 Std.
  */
@@ -30,8 +30,8 @@
   public:
     BeaconPayloadHeader();
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -41,32 +41,32 @@
     void Print(std::ostream& os) const override;
     /**
      * Set the superframe specification field to the beacon payload header.
-     * \param sfrmField The superframe specification field (bitmap)
+     * @param sfrmField The superframe specification field (bitmap)
      */
     void SetSuperframeSpecField(uint16_t sfrmField);
     /**
      * Set the superframe Guaranteed Time Slot (GTS) fields to the beacon payload header.
-     * \param gtsFields The GTS fields.
+     * @param gtsFields The GTS fields.
      */
     void SetGtsFields(GtsFields gtsFields);
     /**
      * Set the superframe Pending Address fields to the beacon payload header.
-     * \param pndAddrFields The Pending Address fields.
+     * @param pndAddrFields The Pending Address fields.
      */
     void SetPndAddrFields(PendingAddrFields pndAddrFields);
     /**
      * Get the superframe specification field from the beacon payload header.
-     * \return The superframe specification field (bitmap)
+     * @return The superframe specification field (bitmap)
      */
     uint16_t GetSuperframeSpecField() const;
     /**
      * Get the Guaranteed Time Slots (GTS) fields from the beacon payload header.
-     * \return The GTS fields.
+     * @return The GTS fields.
      */
     GtsFields GetGtsFields() const;
     /**
      * Get the pending address fields from the beacon payload header.
-     * \return The Pending Address fields.
+     * @return The Pending Address fields.
      */
     PendingAddrFields GetPndAddrFields() const;
 
@@ -86,7 +86,7 @@
 };
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  * Implements the header for the MAC payload command frame according to
  * the IEEE 802.15.4-2011 Std.
  * - Association Response Command (See 5.3.2.2.)
@@ -117,12 +117,12 @@
     CommandPayloadHeader();
     /**
      * Constructor
-     * \param macCmd the command type of this command header
+     * @param macCmd the command type of this command header
      */
     CommandPayloadHeader(MacCommand macCmd);
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -133,86 +133,86 @@
 
     /**
      * Set the command frame type
-     * \param macCmd the command frame type
+     * @param macCmd the command frame type
      */
     void SetCommandFrameType(MacCommand macCmd);
     /**
      * Set the Capability Information Field to the command payload header (Association Request
      * Command).
-     * \param cap The capability Information field
+     * @param cap The capability Information field
      */
     void SetCapabilityField(uint8_t cap);
     /**
      *  Set the coordinator short address (16 bit address).
-     * \param addr The coordinator short address.
+     * @param addr The coordinator short address.
      */
     void SetCoordShortAddr(Mac16Address addr);
     /**
      *  Set the logical channel number.
-     * \param channel The channel number.
+     * @param channel The channel number.
      */
     void SetChannel(uint8_t channel);
     /**
      *  Set the logical channel page number.
-     * \param page The page number.
+     * @param page The page number.
      */
     void SetPage(uint8_t page);
     /**
      * Get the PAN identifier.
-     * \param id The PAN identifier.
+     * @param id The PAN identifier.
      */
     void SetPanId(uint16_t id);
     /**
      * Set the Short Address Assigned by the coordinator
      * (Association Response and Coordinator Realigment Commands).
-     * \param shortAddr The short address assigned by the coordinator
+     * @param shortAddr The short address assigned by the coordinator
      */
     void SetShortAddr(Mac16Address shortAddr);
     /**
      * Set status resulting from the association attempt (Association Response Command).
-     * \param status The status resulting from the association attempt
+     * @param status The status resulting from the association attempt
      */
     void SetAssociationStatus(uint8_t status);
     /**
      * Get the Short address assigned by the coordinator
      * (Association Response and Coordinator Realigment commands).
-     * \return The Mac16Address assigned by the coordinator
+     * @return The Mac16Address assigned by the coordinator
      */
     Mac16Address GetShortAddr() const;
     /**
      * Get the status resulting from an association request (Association Response Command).
-     * \return The resulting status from an association request
+     * @return The resulting status from an association request
      */
     uint8_t GetAssociationStatus() const;
     /**
      * Get the command frame type ID
-     * \return The command type ID from the command payload header
+     * @return The command type ID from the command payload header
      */
     MacCommand GetCommandFrameType() const;
     /**
      * Get the Capability Information Field from the command payload header.
      * (Association Request Command)
-     * \return The Capability Information Field (8 bit bitmap)
+     * @return The Capability Information Field (8 bit bitmap)
      */
     uint8_t GetCapabilityField() const;
     /**
      *  Get the coordinator short address.
-     * \return The coordinator short address (16 bit address)
+     * @return The coordinator short address (16 bit address)
      */
     Mac16Address GetCoordShortAddr() const;
     /**
      *  Get the logical channel number.
-     * \return The channel number
+     * @return The channel number
      */
     uint8_t GetChannel() const;
     /**
      *  Get the logical channel page number.
-     * \return The page number.
+     * @return The page number.
      */
     uint8_t GetPage() const;
     /**
      * Get the PAN identifier.
-     * \return The PAN Identifier
+     * @return The PAN Identifier
      */
     uint16_t GetPanId() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/model/lr-wpan-mac-trailer.cc ns-3.44/src/lr-wpan/model/lr-wpan-mac-trailer.cc
--- ns-3.43/src/lr-wpan/model/lr-wpan-mac-trailer.cc	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/model/lr-wpan-mac-trailer.cc	2025-03-09 16:55:49.419371100 -0700
@@ -10,7 +10,7 @@
  */
 #include "lr-wpan-mac-trailer.h"
 
-#include <ns3/packet.h>
+#include "ns3/packet.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/model/lr-wpan-mac-trailer.h ns-3.44/src/lr-wpan/model/lr-wpan-mac-trailer.h
--- ns-3.43/src/lr-wpan/model/lr-wpan-mac-trailer.h	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/model/lr-wpan-mac-trailer.h	2025-03-09 16:55:49.419371100 -0700
@@ -12,7 +12,7 @@
 #ifndef LR_WPAN_MAC_TRAILER_H
 #define LR_WPAN_MAC_TRAILER_H
 
-#include <ns3/trailer.h>
+#include "ns3/trailer.h"
 
 namespace ns3
 {
@@ -23,7 +23,7 @@
 {
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * Represent the Mac Trailer with the Frame Check Sequence field.
  */
@@ -33,7 +33,7 @@
     /**
      * Get the type ID.
      *
-     * \return the object TypeId
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -53,14 +53,14 @@
      * Get this trailers FCS value. If FCS calculation is disabled for this
      * trailer, the returned value is always 0.
      *
-     * \return the FCS value.
+     * @return the FCS value.
      */
     uint16_t GetFcs() const;
 
     /**
      * Calculate and set the FCS value based on the given packet.
      *
-     * \param p the packet for which the FCS should be calculated
+     * @param p the packet for which the FCS should be calculated
      */
     void SetFcs(Ptr<const Packet> p);
 
@@ -69,22 +69,22 @@
      * trailer. The packet itself should contain no trailer. If FCS calculation is
      * disabled for this trailer, CheckFcs() will always return true.
      *
-     * \param p the packet to be checked
-     * \return false, if the FCS values do not match, true otherwise
+     * @param p the packet to be checked
+     * @return false, if the FCS values do not match, true otherwise
      */
     bool CheckFcs(Ptr<const Packet> p);
 
     /**
      * Enable or disable FCS calculation for this trailer.
      *
-     * \param enable flag, indicating if FCS calculation should be enabled or not
+     * @param enable flag, indicating if FCS calculation should be enabled or not
      */
     void EnableFcs(bool enable);
 
     /**
      * Query if FCS calculation is enabled for this trailer.
      *
-     * \return true, if FCS calculation is enabled, false otherwise.
+     * @return true, if FCS calculation is enabled, false otherwise.
      */
     bool IsFcsEnabled() const;
 
@@ -94,9 +94,9 @@
      * CRC16-CCITT with a generator polynomial = ^16 + ^12 + ^5 + 1, LSB first and
      * initial value = 0x0000.
      *
-     * \param data the checksum will be calculated over this data
-     * \param length the length of the data
-     * \return the checksum
+     * @param data the checksum will be calculated over this data
+     * @param length the length of the data
+     * @return the checksum
      */
     uint16_t GenerateCrc16(uint8_t* data, int length);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/model/lr-wpan-net-device.cc ns-3.44/src/lr-wpan/model/lr-wpan-net-device.cc
--- ns-3.43/src/lr-wpan/model/lr-wpan-net-device.cc	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/model/lr-wpan-net-device.cc	2025-03-09 16:55:49.419371100 -0700
@@ -14,13 +14,13 @@
 #include "lr-wpan-error-model.h"
 #include "lr-wpan-phy.h"
 
-#include <ns3/abort.h>
-#include <ns3/boolean.h>
-#include <ns3/log.h>
-#include <ns3/node.h>
-#include <ns3/packet.h>
-#include <ns3/pointer.h>
-#include <ns3/spectrum-channel.h>
+#include "ns3/abort.h"
+#include "ns3/boolean.h"
+#include "ns3/log.h"
+#include "ns3/node.h"
+#include "ns3/packet.h"
+#include "ns3/pointer.h"
+#include "ns3/spectrum-channel.h"
 
 namespace ns3
 {
@@ -76,10 +76,10 @@
     : m_configComplete(false)
 {
     NS_LOG_FUNCTION(this);
-    m_mac = CreateObject<LrWpanMac>();
+
     m_phy = CreateObject<LrWpanPhy>();
     m_csmaca = CreateObject<LrWpanCsmaCa>();
-    CompleteConfig();
+    m_mac = CreateObject<LrWpanMac>();
 }
 
 LrWpanNetDevice::~LrWpanNetDevice()
@@ -91,7 +91,6 @@
 LrWpanNetDevice::DoDispose()
 {
     NS_LOG_FUNCTION(this);
-    m_mac->Dispose();
     m_phy->Dispose();
     m_csmaca->Dispose();
     m_phy = nullptr;
@@ -106,19 +105,23 @@
 LrWpanNetDevice::DoInitialize()
 {
     NS_LOG_FUNCTION(this);
+
     m_phy->Initialize();
-    m_mac->Initialize();
+    AggregateObject(m_mac);
+    CompleteConfig();
+
     NetDevice::DoInitialize();
 }
 
 void
 LrWpanNetDevice::CompleteConfig()
 {
-    NS_LOG_FUNCTION(this);
     if (!m_mac || !m_phy || !m_csmaca || !m_node || m_configComplete)
     {
         return;
     }
+
+    NS_LOG_FUNCTION(this);
     m_mac->SetPhy(m_phy);
     m_mac->SetCsmaCa(m_csmaca);
     m_mac->SetMcpsDataIndicationCallback(MakeCallback(&LrWpanNetDevice::McpsDataIndication, this));
@@ -146,75 +149,68 @@
 void
 LrWpanNetDevice::SetMac(Ptr<LrWpanMac> mac)
 {
-    NS_LOG_FUNCTION(this);
+    NS_ABORT_MSG_IF(LrWpanNetDevice::IsInitialized(),
+                    "MAC layer cannot be set after initialization");
     m_mac = mac;
-    CompleteConfig();
 }
 
 void
 LrWpanNetDevice::SetPhy(Ptr<LrWpanPhy> phy)
 {
-    NS_LOG_FUNCTION(this);
+    NS_ABORT_MSG_IF(LrWpanNetDevice::IsInitialized(),
+                    "PHY layer cannot be set after initialization");
     m_phy = phy;
-    CompleteConfig();
 }
 
 void
 LrWpanNetDevice::SetCsmaCa(Ptr<LrWpanCsmaCa> csmaca)
 {
-    NS_LOG_FUNCTION(this);
+    NS_ABORT_MSG_IF(LrWpanNetDevice::IsInitialized(), "CSMA/CA cannot be set after initialization");
     m_csmaca = csmaca;
-    CompleteConfig();
 }
 
 void
 LrWpanNetDevice::SetChannel(Ptr<SpectrumChannel> channel)
 {
-    NS_LOG_FUNCTION(this << channel);
+    NS_ABORT_MSG_IF(LrWpanNetDevice::IsInitialized(),
+                    "Spectrum channel cannot be set after initialization");
     m_phy->SetChannel(channel);
     channel->AddRx(m_phy);
-    CompleteConfig();
 }
 
 Ptr<LrWpanMac>
 LrWpanNetDevice::GetMac() const
 {
-    // NS_LOG_FUNCTION (this);
     return m_mac;
 }
 
 Ptr<LrWpanPhy>
 LrWpanNetDevice::GetPhy() const
 {
-    NS_LOG_FUNCTION(this);
     return m_phy;
 }
 
 Ptr<LrWpanCsmaCa>
 LrWpanNetDevice::GetCsmaCa() const
 {
-    NS_LOG_FUNCTION(this);
     return m_csmaca;
 }
 
 void
 LrWpanNetDevice::SetIfIndex(const uint32_t index)
 {
-    NS_LOG_FUNCTION(this << index);
     m_ifIndex = index;
 }
 
 uint32_t
 LrWpanNetDevice::GetIfIndex() const
 {
-    NS_LOG_FUNCTION(this);
     return m_ifIndex;
 }
 
 Ptr<Channel>
 LrWpanNetDevice::GetChannel() const
 {
-    NS_LOG_FUNCTION(this);
     return m_phy->GetChannel();
 }
 
@@ -449,14 +445,12 @@
 Ptr<Node>
 LrWpanNetDevice::GetNode() const
 {
-    NS_LOG_FUNCTION(this);
     return m_node;
 }
 
 void
 LrWpanNetDevice::SetNode(Ptr<Node> node)
 {
-    NS_LOG_FUNCTION(this);
     m_node = node;
     CompleteConfig();
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/model/lr-wpan-net-device.h ns-3.44/src/lr-wpan/model/lr-wpan-net-device.h
--- ns-3.43/src/lr-wpan/model/lr-wpan-net-device.h	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/model/lr-wpan-net-device.h	2025-03-09 16:55:49.419371100 -0700
@@ -13,8 +13,8 @@
 
 #include "lr-wpan-mac.h"
 
-#include <ns3/net-device.h>
-#include <ns3/traced-callback.h>
+#include "ns3/net-device.h"
+#include "ns3/traced-callback.h"
 
 namespace ns3
 {
@@ -29,9 +29,9 @@
 class LrWpanCsmaCa;
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
- * \brief Network layer to device interface.
+ * @brief Network layer to device interface.
  *
  * The ns3::NetDevice includes IP-specific API such as GetMulticast(), Send()
  * and SendTo() methods, which do not map well the the 802.15.4 MAC MCPS
@@ -46,7 +46,7 @@
     /**
      * Get the type ID.
      *
-     * \return the object TypeId
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -68,21 +68,21 @@
     /**
      * Set the MAC to be used by this NetDevice.
      *
-     * \param mac the MAC to be used
+     * @param mac the MAC to be used
      */
     void SetMac(Ptr<LrWpanMac> mac);
 
     /**
      * Set the PHY to be used by the MAC and this NetDevice.
      *
-     * \param phy the PHY to be used
+     * @param phy the PHY to be used
      */
     void SetPhy(Ptr<LrWpanPhy> phy);
 
     /**
      * Set the CSMA/CA implementation to be used by the MAC and this NetDevice.
      *
-     * \param csmaca the CSMA/CA implementation to be used
+     * @param csmaca the CSMA/CA implementation to be used
      */
     void SetCsmaCa(Ptr<LrWpanCsmaCa> csmaca);
 
@@ -90,28 +90,28 @@
      * Set the channel to which the NetDevice, and therefore the PHY, should be
      * attached to.
      *
-     * \param channel the channel to be used
+     * @param channel the channel to be used
      */
     void SetChannel(Ptr<SpectrumChannel> channel);
 
     /**
      * Get the MAC used by this NetDevice.
      *
-     * \return the MAC object
+     * @return the MAC object
      */
     Ptr<LrWpanMac> GetMac() const;
 
     /**
      * Get the PHY used by this NetDevice.
      *
-     * \return the PHY object
+     * @return the PHY object
      */
     Ptr<LrWpanPhy> GetPhy() const;
 
     /**
      * Get the CSMA/CA implementation used by this NetDevice.
      *
-     * \return the CSMA/CA implementation object
+     * @return the CSMA/CA implementation object
      */
     Ptr<LrWpanCsmaCa> GetCsmaCa() const;
 
@@ -121,12 +121,12 @@
     Ptr<Channel> GetChannel() const override;
     /**
      * This method indirects to LrWpanMac::SetShortAddress ()
-     * \param address The short address.
+     * @param address The short address.
      */
     void SetAddress(Address address) override;
     /**
      * This method indirects to LrWpanMac::SetShortAddress ()
-     * \returns The short address.
+     * @returns The short address.
      */
     Address GetAddress() const override;
 
@@ -135,19 +135,19 @@
      * which the device or coordinator is associated. When assigning a short address
      * the extended address must also be present.
      *
-     * \param panId The id of the PAN used by the coordinator device.
+     * @param panId The id of the PAN used by the coordinator device.
      *
-     * \param coordExtAddr The coordinator extended address (EUI-64) through which this
+     * @param coordExtAddr The coordinator extended address (EUI-64) through which this
      *                     device or coordinator is associated.
      *
-     * \param coordShortAddr The coordinator assigned short address through which this
+     * @param coordShortAddr The coordinator assigned short address through which this
      *                       device or coordinator is associated.
      *                       [FF:FF] address indicates that the value is unknown.
      *                       [FF:FE] indicates that the associated coordinator is using only
      *                       its extended address.
      *
      *
-     * \param assignedShortAddr The assigned short address for this device.
+     * @param assignedShortAddr The assigned short address for this device.
      *                          [FF:FF] address indicates that the device have no short address
      *                                  and is not associated.
      *                          [FF:FE] address indicates that the devices has associated but
@@ -188,8 +188,8 @@
      * NetDevice. This callback will in turn use the ReceiveCallback set by
      * SetReceiveCallback() to notify upper layers.
      *
-     * \param params 802.15.4 specific parameters, including source and destination addresses
-     * \param pkt the packet do be delivered
+     * @param params 802.15.4 specific parameters, including source and destination addresses
+     * @param pkt the packet do be delivered
      */
     void McpsDataIndication(McpsDataIndicationParams params, Ptr<Packet> pkt);
 
@@ -197,8 +197,8 @@
      * Assign a fixed random variable stream number to the random variables
      * used by this model.  Return the number of streams that have been assigned.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream);
 
@@ -220,7 +220,7 @@
     /**
      * Attribute accessor method for the "Channel" attribute.
      *
-     * \return the channel to which this NetDevice is attached
+     * @return the channel to which this NetDevice is attached
      */
     Ptr<SpectrumChannel> DoGetChannel() const;
 
@@ -242,9 +242,9 @@
      *
      * As a consequence, here we set it to 1.
      *
-     * \param panId The PanID
-     * \param shortAddr The Short MAC address
-     * \return a Pseudo-Mac48Address
+     * @param panId The PanID
+     * @param shortAddr The Short MAC address
+     * @return a Pseudo-Mac48Address
      */
     Mac48Address BuildPseudoMacAddress(uint16_t panId, Mac16Address shortAddr) const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/model/lr-wpan-phy.cc ns-3.44/src/lr-wpan/model/lr-wpan-phy.cc
--- ns-3.43/src/lr-wpan/model/lr-wpan-phy.cc	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/model/lr-wpan-phy.cc	2025-03-09 16:55:49.419371100 -0700
@@ -16,21 +16,21 @@
 #include "lr-wpan-spectrum-signal-parameters.h"
 #include "lr-wpan-spectrum-value-helper.h"
 
-#include <ns3/abort.h>
-#include <ns3/antenna-model.h>
-#include <ns3/double.h>
-#include <ns3/error-model.h>
-#include <ns3/log.h>
-#include <ns3/mobility-model.h>
-#include <ns3/net-device.h>
-#include <ns3/node.h>
-#include <ns3/packet-burst.h>
-#include <ns3/packet.h>
-#include <ns3/pointer.h>
-#include <ns3/random-variable-stream.h>
-#include <ns3/simulator.h>
-#include <ns3/spectrum-channel.h>
-#include <ns3/spectrum-value.h>
+#include "ns3/abort.h"
+#include "ns3/antenna-model.h"
+#include "ns3/double.h"
+#include "ns3/error-model.h"
+#include "ns3/log.h"
+#include "ns3/mobility-model.h"
+#include "ns3/net-device.h"
+#include "ns3/node.h"
+#include "ns3/packet-burst.h"
+#include "ns3/packet.h"
+#include "ns3/pointer.h"
+#include "ns3/random-variable-stream.h"
+#include "ns3/simulator.h"
+#include "ns3/spectrum-channel.h"
+#include "ns3/spectrum-value.h"
 
 namespace ns3
 {
@@ -123,14 +123,14 @@
         break;
     }
     return os;
-};
+}
 
 std::ostream&
 operator<<(std::ostream& os, const TracedValue<PhyEnumeration>& state)
 {
     PhyEnumeration s = state;
     return os << s;
-};
+}
 
 TypeId
 LrWpanPhy::GetTypeId()
@@ -1705,8 +1705,8 @@
     }
 
     m_edPower.averagePower = 0.0;
-    m_edPower.lastUpdate = Seconds(0.0);
-    m_edPower.measurementLength = Seconds(0.0);
+    m_edPower.lastUpdate = Seconds(0);
+    m_edPower.measurementLength = Seconds(0);
 
     // TODO: Change the limits  Rx sensitivity when other modulations are supported
     // Currently, only O-QPSK 250kbps is supported and its maximum possible sensitivity is
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/model/lr-wpan-phy.h ns-3.44/src/lr-wpan/model/lr-wpan-phy.h
--- ns-3.43/src/lr-wpan/model/lr-wpan-phy.h	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/model/lr-wpan-phy.h	2025-03-09 16:55:49.419371100 -0700
@@ -12,10 +12,10 @@
 
 #include "lr-wpan-interference-helper.h"
 
-#include <ns3/event-id.h>
-#include <ns3/spectrum-phy.h>
-#include <ns3/traced-callback.h>
-#include <ns3/traced-value.h>
+#include "ns3/event-id.h"
+#include "ns3/spectrum-phy.h"
+#include "ns3/traced-callback.h"
+#include "ns3/traced-value.h"
 
 #include <iostream>
 
@@ -39,7 +39,7 @@
 struct LrWpanSpectrumSignalParameters;
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * Helper structure to manage the power measurement during ED.
  */
@@ -51,7 +51,7 @@
 };
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * This data structure provides the Bit rate and Symbol rate for a given channel
  * See IEEE802.15.4-2006 Table 1 and 2 in section 6.1.1 and 6.1.2
@@ -63,7 +63,7 @@
 };
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * This data structure provides number of symbols for the PPDU headers: SHR and PHR
  * See IEEE802.15.4-2006 Figure 16, Table 19 and 20 in section 6.3
@@ -76,7 +76,7 @@
 };
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * This Phy option will be used to index various Tables in IEEE802.15.4-2011
  */
@@ -95,7 +95,7 @@
 };
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * IEEE802.15.4-2006 PHY Emumerations Table 18
  * in section 6.2.3
@@ -120,35 +120,35 @@
 /**
  *  Overloaded operator to print the value of a PhyEnumeration.
  *
- *  \param os The output stream
- *  \param state The text value of the PHY state
- *  \return The output stream with text value of the PHY state
+ *  @param os The output stream
+ *  @param state The text value of the PHY state
+ *  @return The output stream with text value of the PHY state
  */
 std::ostream& operator<<(std::ostream& os, const PhyEnumeration& state);
 
 /**
  *  Overloaded operator to print the value of a TracedValue<PhyEnumeration>.
  *
- *  \param os The output stream
- *  \param state The text value of the PHY state
- *  \return The output stream with text value of the PHY state
+ *  @param os The output stream
+ *  @param state The text value of the PHY state
+ *  @return The output stream with text value of the PHY state
  */
 std::ostream& operator<<(std::ostream& os, const TracedValue<PhyEnumeration>& state);
 
 namespace TracedValueCallback
 {
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  * TracedValue callback signature for PhyEnumeration.
  *
- * \param [in] oldValue original value of the traced variable
- * \param [in] newValue new value of the traced variable
+ * @param [in] oldValue original value of the traced variable
+ * @param [in] newValue new value of the traced variable
  */
 typedef void (*PhyEnumeration)(PhyEnumeration oldValue, PhyEnumeration newValue);
 } // namespace TracedValueCallback
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * IEEE802.15.4-2006 PHY PIB Attribute Identifiers Table 23 in section 6.4.2
  */
@@ -165,7 +165,7 @@
 };
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * IEEE802.15.4-2006 PHY PIB Attributes Table 23 in section 6.4.2
  */
@@ -184,18 +184,18 @@
 };
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * This method implements the PD SAP: PdDataIndication
  *
- * \param psduLength number of bytes in the PSDU
- * \param p the packet to be transmitted
- * \param lqi Link quality (LQI) value measured during reception of the PPDU
+ * @param psduLength number of bytes in the PSDU
+ * @param p the packet to be transmitted
+ * @param lqi Link quality (LQI) value measured during reception of the PPDU
  */
 typedef Callback<void, uint32_t, Ptr<Packet>, uint8_t> PdDataIndicationCallback;
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * This method implements the PD SAP: PdDataConfirm
  *
@@ -204,7 +204,7 @@
 typedef Callback<void, PhyEnumeration> PdDataConfirmCallback;
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * This method implements the PD SAP: PlmeCcaConfirm
  *
@@ -213,7 +213,7 @@
 typedef Callback<void, PhyEnumeration> PlmeCcaConfirmCallback;
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * This method implements the PD SAP: PlmeEdConfirm
  *
@@ -223,7 +223,7 @@
 typedef Callback<void, PhyEnumeration, uint8_t> PlmeEdConfirmCallback;
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * This method implements the PD SAP: PlmeGetAttributeConfirm
  *
@@ -235,7 +235,7 @@
     PlmeGetAttributeConfirmCallback;
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * This method implements the PD SAP: PlmeSetTRXStateConfirm
  *
@@ -244,7 +244,7 @@
 typedef Callback<void, PhyEnumeration> PlmeSetTRXStateConfirmCallback;
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * This method implements the PD SAP: PlmeSetAttributeConfirm
  *
@@ -254,7 +254,7 @@
 typedef Callback<void, PhyEnumeration, PhyPibAttributeIdentifier> PlmeSetAttributeConfirmCallback;
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * Make LrWpanPhy a SpectrumPhy so we can enable the eventual modeling of
  * device interference
@@ -265,7 +265,7 @@
     /**
      * Get the type ID.
      *
-     * \return the object TypeId
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -283,7 +283,7 @@
     /**
      * Get the currently attached channel.
      *
-     * \return the channel
+     * @return the channel
      */
     Ptr<SpectrumChannel> GetChannel();
     void SetDevice(Ptr<NetDevice> d) override;
@@ -292,7 +292,7 @@
     /**
      * Set the attached antenna.
      *
-     * \param a the antenna
+     * @param a the antenna
      */
     void SetAntenna(Ptr<AntennaModel> a);
     Ptr<Object> GetAntenna() const override;
@@ -337,14 +337,14 @@
      * is -106.58 dBm (This does not include any noise figure).
      * A sensitivity of -95dBm or less is considered by many vendors a high sensitivity.
      *
-     * \param dbmSensitivity The receiver power sensitivity to set in dBm.
+     * @param dbmSensitivity The receiver power sensitivity to set in dBm.
      */
     void SetRxSensitivity(double dbmSensitivity);
 
     /**
      * Get the receiver power sensitivity used by this device in dBm.
      *
-     * \return The receiver power sensitivity used by this device in dBm.
+     * @return The receiver power sensitivity used by this device in dBm.
      */
     double GetRxSensitivity();
 
@@ -359,8 +359,8 @@
      * IEEE 802.15.4-2006 section 6.2.1.1
      * PD-DATA.request
      * Request to transfer MPDU from MAC (transmitting)
-     * \param psduLength number of bytes in the PSDU
-     * \param p the packet to be transmitted
+     * @param psduLength number of bytes in the PSDU
+     * @param p the packet to be transmitted
      */
     void PdDataRequest(const uint32_t psduLength, Ptr<Packet> p);
 
@@ -387,7 +387,7 @@
      * IEEE 802.15.4-2006 section 6.2.2.5
      * PLME-GET.request
      * Get attributes per definition from Table 23 in section 6.4.2
-     * \param id the attributed identifier
+     * @param id the attributed identifier
      */
     void PlmeGetAttributeRequest(PhyPibAttributeIdentifier id);
 
@@ -395,7 +395,7 @@
      * IEEE 802.15.4-2006 section 6.2.2.7
      * PLME-SET-TRX-STATE.request
      * Set PHY state
-     * \param state in RX_ON,TRX_OFF,FORCE_TRX_OFF,TX_ON
+     * @param state in RX_ON,TRX_OFF,FORCE_TRX_OFF,TX_ON
      */
     void PlmeSetTRXStateRequest(PhyEnumeration state);
 
@@ -403,8 +403,8 @@
      * IEEE 802.15.4-2006 section 6.2.2.9
      * PLME-SET.request
      * Set attributes per definition from Table 23 in section 6.4.2
-     * \param id the attributed identifier
-     * \param attribute the attribute value
+     * @param id the attributed identifier
+     * @param attribute the attribute value
      */
     void PlmeSetAttributeRequest(PhyPibAttributeIdentifier id, Ptr<PhyPibAttributes> attribute);
 
@@ -412,7 +412,7 @@
      * set the callback for the end of a RX, as part of the
      * interconnections between the PHY and the MAC. The callback
      * implements PD Indication SAP.
-     * \param c the callback
+     * @param c the callback
      */
     void SetPdDataIndicationCallback(PdDataIndicationCallback c);
 
@@ -420,7 +420,7 @@
      * set the callback for the end of a TX, as part of the
      * interconnections between the PHY and the MAC. The callback
      * implements PD SAP.
-     * \param c the callback
+     * @param c the callback
      */
     void SetPdDataConfirmCallback(PdDataConfirmCallback c);
 
@@ -428,7 +428,7 @@
      * set the callback for the end of a CCA, as part of the
      * interconnections between the PHY and the MAC. The callback
      * implement PLME CCA confirm SAP
-     * \param c the callback
+     * @param c the callback
      */
     void SetPlmeCcaConfirmCallback(PlmeCcaConfirmCallback c);
 
@@ -436,7 +436,7 @@
      * set the callback for the end of an ED, as part of the
      * interconnections between the PHY and the MAC. The callback
      * implement PLME ED confirm SAP
-     * \param c the callback
+     * @param c the callback
      */
     void SetPlmeEdConfirmCallback(PlmeEdConfirmCallback c);
 
@@ -444,7 +444,7 @@
      * set the callback for the end of an GetAttribute, as part of the
      * interconnections between the PHY and the MAC. The callback
      * implement PLME GetAttribute confirm SAP
-     * \param c the callback
+     * @param c the callback
      */
     void SetPlmeGetAttributeConfirmCallback(PlmeGetAttributeConfirmCallback c);
 
@@ -452,7 +452,7 @@
      * set the callback for the end of an SetTRXState, as part of the
      * interconnections between the PHY and the MAC. The callback
      * implement PLME SetTRXState confirm SAP
-     * \param c the callback
+     * @param c the callback
      */
     void SetPlmeSetTRXStateConfirmCallback(PlmeSetTRXStateConfirmCallback c);
 
@@ -460,43 +460,43 @@
      * set the callback for the end of an SetAttribute, as part of the
      * interconnections between the PHY and the MAC. The callback
      * implement PLME SetAttribute confirm SAP
-     * \param c the callback
+     * @param c the callback
      */
     void SetPlmeSetAttributeConfirmCallback(PlmeSetAttributeConfirmCallback c);
 
     /**
      * Get The current channel page number in use in this PHY from the PIB attributes.
      *
-     * \return The current page number
+     * @return The current page number
      */
     uint8_t GetCurrentPage() const;
 
     /**
      * Get The current channel number in use in this PHY from the PIB attributes.
      *
-     * \return The current channel number
+     * @return The current channel number
      */
     uint8_t GetCurrentChannelNum() const;
 
     /**
      * implement PLME SetAttribute confirm SAP
      * bit rate is in bit/s.  Symbol rate is in symbol/s.
-     * \param isData is true for data rate or false for symbol rate
-     * \return the rate value of this PHY
+     * @param isData is true for data rate or false for symbol rate
+     * @return the rate value of this PHY
      */
     double GetDataOrSymbolRate(bool isData);
 
     /**
      * set the error model to use
      *
-     * \param e pointer to LrWpanErrorModel to use
+     * @param e pointer to LrWpanErrorModel to use
      */
     void SetErrorModel(Ptr<LrWpanErrorModel> e);
 
     /**
      * get the error model in use
      *
-     * \return pointer to LrWpanErrorModel in use
+     * @return pointer to LrWpanErrorModel in use
      */
     Ptr<LrWpanErrorModel> GetErrorModel() const;
 
@@ -509,7 +509,7 @@
      * is typically used to force specific packet losses or
      * for testing purposes.
      *
-     * \param em Pointer to the ErrorModel.
+     * @param em Pointer to the ErrorModel.
      */
     void SetPostReceptionErrorModel(const Ptr<ErrorModel> em);
 
@@ -517,7 +517,7 @@
      * Get the duration of the SHR (preamble and SFD) in symbols, depending on
      * the currently selected channel.
      *
-     * \return the SHR duration in symbols
+     * @return the SHR duration in symbols
      */
     uint64_t GetPhySHRDuration() const;
 
@@ -525,7 +525,7 @@
      * Get the number of symbols per octet, depending on the currently selected
      * channel.
      *
-     * \return the number of symbols per octet
+     * @return the number of symbols per octet
      */
     double GetPhySymbolsPerOctet() const;
 
@@ -533,7 +533,7 @@
      * Get the current accumulated sum of signals in the transceiver including
      * signals considered as interference.
      *
-     * \return the accumulated signal power spectral density value in Dbm.
+     * @return the accumulated signal power spectral density value in Dbm.
      */
     double GetCurrentSignalPsd();
 
@@ -541,18 +541,18 @@
      * Assign a fixed random variable stream number to the random variables
      * used by this model.  Return the number of streams that have been assigned.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream);
 
     /**
      * TracedCallback signature for Trx state change events.
      *
-     * \param [in] time The time of the state change.
-     * \param [in] oldState The old state.
-     * \param [in] newState The new state.
-     * \deprecated The LrWpanPhyEnumeration state is now accessible as the
+     * @param [in] time The time of the state change.
+     * @param [in] oldState The old state.
+     * @param [in] newState The new state.
+     * @deprecated The LrWpanPhyEnumeration state is now accessible as the
      * TracedValue \c TrxStateValue.  The \c TrxState TracedCallback will
      * be removed in a future release.
      */
@@ -574,7 +574,7 @@
     /**
      * Change the PHY state to the given new state, firing the state change trace.
      *
-     * \param newState the new state
+     * @param newState the new state
      */
     void ChangeTrxState(PhyEnumeration newState);
 
@@ -582,7 +582,7 @@
      * Get the currently configured PHY option.
      * See IEEE 802.15.4-2006, section 6.1.2, Table 2.
      *
-     * \return the PHY option
+     * @return the PHY option
      */
     PhyOption GetMyPhyOption();
 
@@ -607,7 +607,7 @@
      * This method is also called for every packet which only contributes to
      * interference.
      *
-     * \param params signal parameters of the packet
+     * @param params signal parameters of the packet
      */
     void EndRx(Ptr<SpectrumSignalParameters> params);
 
@@ -616,7 +616,7 @@
      * switched off or set to TX mode. This calls the appropriate confirm callback
      * of the MAC.
      *
-     * \param state the new state which is the cause for canceling ED
+     * @param state the new state which is the cause for canceling ED
      */
     void CancelEd(PhyEnumeration state);
 
@@ -642,31 +642,31 @@
      * Calculate the time required for sending the given packet, including
      * preamble, SFD and PHR.
      *
-     * \param packet the packet for which the transmission time should be calculated
-     * \return the time required for transmitting the packet
+     * @param packet the packet for which the transmission time should be calculated
+     * @return the time required for transmitting the packet
      */
     Time CalculateTxTime(Ptr<const Packet> packet);
 
     /**
      * Calculate the time required for sending the PPDU header, that is the
      * preamble, SFD and PHR.
-     * \returns The time required for sending the PPDU header.
+     * @returns The time required for sending the PPDU header.
      */
     Time GetPpduHeaderTxTime();
 
     /**
      * Check if the given channel is supported by the PHY.
      *
-     * \param channel the channel to check
-     * \return true, if the channel is supported, false otherwise
+     * @param channel the channel to check
+     * @return true, if the channel is supported, false otherwise
      */
     bool ChannelSupported(uint8_t channel);
 
     /**
      * Check if the given page is supported by the PHY.
      *
-     * \param page the page to check
-     * \return true, if the page is supported, false otherwise
+     * @param page the page to check
+     * @return true, if the page is supported, false otherwise
      */
     bool PageSupported(uint8_t page);
 
@@ -674,7 +674,7 @@
      * Check if the PHY is busy, which is the case if the PHY is currently sending
      * or receiving a frame.
      *
-     * \return true, if the PHY is busy, false otherwise
+     * @return true, if the PHY is busy, false otherwise
      */
     bool PhyIsBusy() const;
 
@@ -683,7 +683,7 @@
      * The trace source fired when a packet begins the transmission process on
      * the medium.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_phyTxBeginTrace;
 
@@ -691,7 +691,7 @@
      * The trace source fired when a packet ends the transmission process on
      * the medium.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_phyTxEndTrace;
 
@@ -699,7 +699,7 @@
      * The trace source fired when the phy layer drops a packet as it tries
      * to transmit it.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_phyTxDropTrace;
 
@@ -707,7 +707,7 @@
      * The trace source fired when a packet begins the reception process from
      * the medium.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_phyRxBeginTrace;
 
@@ -718,7 +718,7 @@
      * a complete packet or a packet that is later on dropped because of interference,
      * cancellation or post-rx corruption. Second quantity is the received SINR (LQI).
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>, double> m_phyRxEndTrace;
 
@@ -727,15 +727,15 @@
      * (Destruction of a packet due to interference, post-rx corruption or
      *  cancellation of packet rx)
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_phyRxDropTrace;
 
     /**
      * The trace source fired when the phy layer changes the transceiver state.
      *
-     * \see class CallBackTraceSource
-     * \deprecated The PhyEnumeration state is now accessible as the
+     * @see class CallBackTraceSource
+     * @deprecated The PhyEnumeration state is now accessible as the
      * TracedValue \c TrxStateValue.  This TracedCallback will
      * be removed in a future release.
      */
@@ -755,24 +755,24 @@
      * This function extracts the 6 LSBs corresponding to the nominal transmit power and
      * converts it to a `int8_t`.
      *
-     * \param phyTransmitPower the PIB attribute
-     * \return The nominal transmit power in dBm.
+     * @param phyTransmitPower the PIB attribute
+     * @return The nominal transmit power in dBm.
      */
     int8_t GetNominalTxPowerFromPib(uint8_t phyTransmitPower);
 
     /**
      * Transform watts (W) to decibels milliwatts (dBm).
      *
-     * \param watt The Watts that will be converted to dBm.
-     * \return The value of Watts in dBm.
+     * @param watt The Watts that will be converted to dBm.
+     * @return The value of Watts in dBm.
      */
     double WToDbm(double watt);
 
     /**
      * Transforms decibels milliwatts (dBm) to watts (W).
      *
-     * \param dbm The DBm that will be converted to Watts.
-     * \return The value of DBm in Watts.
+     * @param dbm The DBm that will be converted to Watts.
+     * @return The value of DBm in Watts.
      */
     double DbmToW(double dbm);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/model/lr-wpan-spectrum-signal-parameters.cc ns-3.44/src/lr-wpan/model/lr-wpan-spectrum-signal-parameters.cc
--- ns-3.43/src/lr-wpan/model/lr-wpan-spectrum-signal-parameters.cc	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/model/lr-wpan-spectrum-signal-parameters.cc	2025-03-09 16:55:49.419371100 -0700
@@ -7,8 +7,8 @@
  */
 #include "lr-wpan-spectrum-signal-parameters.h"
 
-#include <ns3/log.h>
-#include <ns3/packet-burst.h>
+#include "ns3/log.h"
+#include "ns3/packet-burst.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/model/lr-wpan-spectrum-signal-parameters.h ns-3.44/src/lr-wpan/model/lr-wpan-spectrum-signal-parameters.h
--- ns-3.43/src/lr-wpan/model/lr-wpan-spectrum-signal-parameters.h	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/model/lr-wpan-spectrum-signal-parameters.h	2025-03-09 16:55:49.419371100 -0700
@@ -9,7 +9,7 @@
 #ifndef LR_WPAN_SPECTRUM_SIGNAL_PARAMETERS_H
 #define LR_WPAN_SPECTRUM_SIGNAL_PARAMETERS_H
 
-#include <ns3/spectrum-signal-parameters.h>
+#include "ns3/spectrum-signal-parameters.h"
 
 namespace ns3
 {
@@ -20,7 +20,7 @@
 {
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
  * Signal parameters for LrWpan.
  */
@@ -35,7 +35,7 @@
 
     /**
      * copy constructor
-     * \param p the object to copy from.
+     * @param p the object to copy from.
      */
     LrWpanSpectrumSignalParameters(const LrWpanSpectrumSignalParameters& p);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/model/lr-wpan-spectrum-value-helper.cc ns-3.44/src/lr-wpan/model/lr-wpan-spectrum-value-helper.cc
--- ns-3.43/src/lr-wpan/model/lr-wpan-spectrum-value-helper.cc	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/model/lr-wpan-spectrum-value-helper.cc	2025-03-09 16:55:49.419371100 -0700
@@ -7,8 +7,8 @@
  */
 #include "lr-wpan-spectrum-value-helper.h"
 
-#include <ns3/log.h>
-#include <ns3/spectrum-value.h>
+#include "ns3/log.h"
+#include "ns3/spectrum-value.h"
 
 #include <cmath>
 
@@ -23,8 +23,8 @@
     g_LrWpanSpectrumModel; //!< Global object used to initialize the LrWpan Spectrum Model
 
 /**
- * \ingroup lr-wpan
- * \brief Helper class used to automatically initialize the LrWpan Spectrum Model objects
+ * @ingroup lr-wpan
+ * @brief Helper class used to automatically initialize the LrWpan Spectrum Model objects
  */
 class LrWpanSpectrumModelInitializer
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/model/lr-wpan-spectrum-value-helper.h ns-3.44/src/lr-wpan/model/lr-wpan-spectrum-value-helper.h
--- ns-3.43/src/lr-wpan/model/lr-wpan-spectrum-value-helper.h	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/model/lr-wpan-spectrum-value-helper.h	2025-03-09 16:55:49.419371100 -0700
@@ -8,7 +8,7 @@
 #ifndef LR_WPAN_SPECTRUM_VALUE_HELPER_H
 #define LR_WPAN_SPECTRUM_VALUE_HELPER_H
 
-#include <ns3/ptr.h>
+#include "ns3/ptr.h"
 
 namespace ns3
 {
@@ -19,9 +19,9 @@
 {
 
 /**
- * \ingroup lr-wpan
+ * @ingroup lr-wpan
  *
- * \brief This class defines all functions to create spectrum model for LrWpan
+ * @brief This class defines all functions to create spectrum model for LrWpan
  */
 class LrWpanSpectrumValueHelper
 {
@@ -30,32 +30,32 @@
     virtual ~LrWpanSpectrumValueHelper();
 
     /**
-     * \brief create spectrum value
-     * \param txPower the power transmission in dBm
-     * \param channel the channel number per IEEE802.15.4
-     * \return a Ptr to a newly created SpectrumValue instance
+     * @brief create spectrum value
+     * @param txPower the power transmission in dBm
+     * @param channel the channel number per IEEE802.15.4
+     * @return a Ptr to a newly created SpectrumValue instance
      */
     Ptr<SpectrumValue> CreateTxPowerSpectralDensity(double txPower, uint32_t channel);
 
     /**
-     * \brief create spectrum value for noise
-     * \param channel the channel number per IEEE802.15.4
-     * \return a Ptr to a newly created SpectrumValue instance
+     * @brief create spectrum value for noise
+     * @param channel the channel number per IEEE802.15.4
+     * @return a Ptr to a newly created SpectrumValue instance
      */
     Ptr<SpectrumValue> CreateNoisePowerSpectralDensity(uint32_t channel);
 
     /**
      * Set the noise factor added to the thermal noise.
-     * \param f A dimensionless ratio (i.e. Not in dB)
+     * @param f A dimensionless ratio (i.e. Not in dB)
      */
     void SetNoiseFactor(double f);
 
     /**
-     * \brief total average power of the signal is the integral of the PSD using
+     * @brief total average power of the signal is the integral of the PSD using
      * the limits of the given channel
-     * \param psd spectral density
-     * \param channel the channel number per IEEE802.15.4
-     * \return total power (using composite trap. rule to numerally integrate)
+     * @param psd spectral density
+     * @param channel the channel number per IEEE802.15.4
+     * @return total power (using composite trap. rule to numerally integrate)
      */
     static double TotalAvgPower(Ptr<const SpectrumValue> psd, uint32_t channel);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/test/lr-wpan-ack-test.cc ns-3.44/src/lr-wpan/test/lr-wpan-ack-test.cc
--- ns-3.43/src/lr-wpan/test/lr-wpan-ack-test.cc	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/test/lr-wpan-ack-test.cc	2025-03-09 16:55:49.419371100 -0700
@@ -9,16 +9,16 @@
  *  Tommaso Pecorella <tommaso.pecorella@unifi.it>
  */
 
+#include "ns3/constant-position-mobility-model.h"
+#include "ns3/core-module.h"
+#include "ns3/log.h"
+#include "ns3/lr-wpan-module.h"
+#include "ns3/packet.h"
+#include "ns3/propagation-delay-model.h"
+#include "ns3/propagation-loss-model.h"
 #include "ns3/rng-seed-manager.h"
-#include <ns3/constant-position-mobility-model.h>
-#include <ns3/core-module.h>
-#include <ns3/log.h>
-#include <ns3/lr-wpan-module.h>
-#include <ns3/packet.h>
-#include <ns3/propagation-delay-model.h>
-#include <ns3/propagation-loss-model.h>
-#include <ns3/simulator.h>
-#include <ns3/single-model-spectrum-channel.h>
+#include "ns3/simulator.h"
+#include "ns3/single-model-spectrum-channel.h"
 
 #include <fstream>
 #include <iostream>
@@ -31,15 +31,15 @@
 NS_LOG_COMPONENT_DEFINE("lr-wpan-ack-test");
 
 /**
- * \ingroup lr-wpan
- * \defgroup lr-wpan-test LrWpan module tests
+ * @ingroup lr-wpan
+ * @defgroup lr-wpan-test LrWpan module tests
  */
 
 /**
- * \ingroup lr-wpan-test
- * \ingroup tests
+ * @ingroup lr-wpan-test
+ * @ingroup tests
  *
- * \brief LrWpan ACK Test
+ * @brief LrWpan ACK Test
  */
 class LrWpanAckTestCase : public TestCase
 {
@@ -58,31 +58,31 @@
     /**
      * Create test case
      *
-     * \param prefix Unique file names prefix
-     * \param mode   Test mode
+     * @param prefix Unique file names prefix
+     * @param mode   Test mode
      */
     LrWpanAckTestCase(const char* const prefix, TestMode_e mode);
 
     /**
-     * \brief Function called when DataIndication is hit on dev0.
-     * \param params The MCPS params.
-     * \param p the packet.
+     * @brief Function called when DataIndication is hit on dev0.
+     * @param params The MCPS params.
+     * @param p the packet.
      */
     void DataIndicationDev0(McpsDataIndicationParams params, Ptr<Packet> p);
     /**
-     * \brief Function called when DataIndication is hit on dev1.
-     * \param params The MCPS params.
-     * \param p the packet.
+     * @brief Function called when DataIndication is hit on dev1.
+     * @param params The MCPS params.
+     * @param p the packet.
      */
     void DataIndicationDev1(McpsDataIndicationParams params, Ptr<Packet> p);
     /**
-     * \brief Function called when DataConfirm is hit on dev0.
-     * \param params The MCPS params.
+     * @brief Function called when DataConfirm is hit on dev0.
+     * @param params The MCPS params.
      */
     void DataConfirmDev0(McpsDataConfirmParams params);
     /**
-     * \brief Function called when DataConfirm is hit on dev1.
-     * \param params The MCPS params.
+     * @brief Function called when DataConfirm is hit on dev1.
+     * @param params The MCPS params.
      */
     void DataConfirmDev1(McpsDataConfirmParams params);
 
@@ -277,12 +277,14 @@
     }
     traceFile.close();
 
-    // Note: the packet being correctly sent includes receiving an ACK in case of for unicact
+    // Note: the packet being correctly sent includes receiving an ACK in case of for unicast
     // packets.
     NS_TEST_EXPECT_MSG_LT(m_requestTime,
                           m_replyTime,
                           "Sent the request before the reply (as expected)");
-    NS_TEST_EXPECT_MSG_GT(m_requestSentTime, Time(0), "The request was sent (as expected)");
+    NS_TEST_EXPECT_MSG_EQ(m_requestSentTime.IsStrictlyPositive(),
+                          true,
+                          "The request was sent (as expected)");
     NS_TEST_EXPECT_MSG_LT(m_requestSentTime,
                           m_replyArrivalTime,
                           "The request was sent before the reply arrived (as expected)");
@@ -300,10 +302,10 @@
 }
 
 /**
- * \ingroup lr-wpan-test
- * \ingroup tests
+ * @ingroup lr-wpan-test
+ * @ingroup tests
  *
- * \brief LrWpan ACK TestSuite
+ * @brief LrWpan ACK TestSuite
  */
 class LrWpanAckTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/test/lr-wpan-cca-test.cc ns-3.44/src/lr-wpan/test/lr-wpan-cca-test.cc
--- ns-3.43/src/lr-wpan/test/lr-wpan-cca-test.cc	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/test/lr-wpan-cca-test.cc	2025-03-09 16:55:49.419371100 -0700
@@ -8,16 +8,16 @@
  *  Alberto Gallegos Ramonet <alramonet@is.tokushima-u.ac.jp>
  */
 
+#include "ns3/constant-position-mobility-model.h"
+#include "ns3/core-module.h"
+#include "ns3/log.h"
+#include "ns3/lr-wpan-module.h"
+#include "ns3/packet.h"
+#include "ns3/propagation-delay-model.h"
+#include "ns3/propagation-loss-model.h"
 #include "ns3/rng-seed-manager.h"
-#include <ns3/constant-position-mobility-model.h>
-#include <ns3/core-module.h>
-#include <ns3/log.h>
-#include <ns3/lr-wpan-module.h>
-#include <ns3/packet.h>
-#include <ns3/propagation-delay-model.h>
-#include <ns3/propagation-loss-model.h>
-#include <ns3/simulator.h>
-#include <ns3/single-model-spectrum-channel.h>
+#include "ns3/simulator.h"
+#include "ns3/single-model-spectrum-channel.h"
 
 #include <iomanip>
 #include <iostream>
@@ -28,8 +28,8 @@
 NS_LOG_COMPONENT_DEFINE("lr-wpan-cca-test");
 
 /**
- * \ingroup lr-wpan-test
- * \ingroup tests
+ * @ingroup lr-wpan-test
+ * @ingroup tests
  *
  * LrWpan CCA Test
  */
@@ -349,10 +349,10 @@
 }
 
 /**
- * \ingroup lr-wpan-test
- * \ingroup tests
+ * @ingroup lr-wpan-test
+ * @ingroup tests
  *
- * \brief Test the sensitivity of the CSMA/CA clear channel assestment (CCA)
+ * @brief Test the sensitivity of the CSMA/CA clear channel assestment (CCA)
  */
 class CCAVulnerableWindowTest : public TestCase
 {
@@ -587,8 +587,8 @@
 }
 
 /**
- * \ingroup lr-wpan-test
- * \ingroup tests
+ * @ingroup lr-wpan-test
+ * @ingroup tests
  *
  * LrWpan ACK TestSuite
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/test/lr-wpan-collision-test.cc ns-3.44/src/lr-wpan/test/lr-wpan-collision-test.cc
--- ns-3.43/src/lr-wpan/test/lr-wpan-collision-test.cc	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/test/lr-wpan-collision-test.cc	2025-03-09 16:55:49.419371100 -0700
@@ -6,15 +6,15 @@
  * Author: Tommaso Pecorella <tommaso.pecorella@unifi.it>
  */
 
-#include <ns3/log.h>
-#include <ns3/lr-wpan-module.h>
-#include <ns3/mac16-address.h>
-#include <ns3/mac64-address.h>
-#include <ns3/mobility-module.h>
-#include <ns3/packet.h>
-#include <ns3/propagation-module.h>
-#include <ns3/spectrum-module.h>
-#include <ns3/test.h>
+#include "ns3/log.h"
+#include "ns3/lr-wpan-module.h"
+#include "ns3/mac16-address.h"
+#include "ns3/mac64-address.h"
+#include "ns3/mobility-module.h"
+#include "ns3/packet.h"
+#include "ns3/propagation-module.h"
+#include "ns3/spectrum-module.h"
+#include "ns3/test.h"
 
 using namespace ns3;
 using namespace ns3::lrwpan;
@@ -22,10 +22,10 @@
 NS_LOG_COMPONENT_DEFINE("lr-wpan-collision-test");
 
 /**
- * \ingroup lr-wpan-test
- * \ingroup tests
+ * @ingroup lr-wpan-test
+ * @ingroup tests
  *
- * \brief LrWpan Collision Test
+ * @brief LrWpan Collision Test
  */
 class LrWpanCollisionTestCase : public TestCase
 {
@@ -34,9 +34,9 @@
     ~LrWpanCollisionTestCase() override;
 
     /**
-     * \brief Function called when DataIndication is hit.
-     * \param params The MCPS params.
-     * \param p The packet.
+     * @brief Function called when DataIndication is hit.
+     * @param params The MCPS params.
+     * @param p The packet.
      */
     void DataIndication(McpsDataIndicationParams params, Ptr<Packet> p);
 
@@ -203,10 +203,10 @@
 }
 
 /**
- * \ingroup lr-wpan-test
- * \ingroup tests
+ * @ingroup lr-wpan-test
+ * @ingroup tests
  *
- * \brief LrWpan Collision TestSuite
+ * @brief LrWpan Collision TestSuite
  */
 class LrWpanCollisionTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/test/lr-wpan-ed-test.cc ns-3.44/src/lr-wpan/test/lr-wpan-ed-test.cc
--- ns-3.43/src/lr-wpan/test/lr-wpan-ed-test.cc	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/test/lr-wpan-ed-test.cc	2025-03-09 16:55:49.419371100 -0700
@@ -7,16 +7,16 @@
  *  Sascha Alexander Jopen <jopen@cs.uni-bonn.de>
  */
 
+#include "ns3/constant-position-mobility-model.h"
+#include "ns3/core-module.h"
+#include "ns3/log.h"
+#include "ns3/lr-wpan-module.h"
+#include "ns3/packet.h"
+#include "ns3/propagation-delay-model.h"
+#include "ns3/propagation-loss-model.h"
 #include "ns3/rng-seed-manager.h"
-#include <ns3/constant-position-mobility-model.h>
-#include <ns3/core-module.h>
-#include <ns3/log.h>
-#include <ns3/lr-wpan-module.h>
-#include <ns3/packet.h>
-#include <ns3/propagation-delay-model.h>
-#include <ns3/propagation-loss-model.h>
-#include <ns3/simulator.h>
-#include <ns3/single-model-spectrum-channel.h>
+#include "ns3/simulator.h"
+#include "ns3/single-model-spectrum-channel.h"
 
 #include <iostream>
 
@@ -26,10 +26,10 @@
 NS_LOG_COMPONENT_DEFINE("lr-wpan-energy-detection-test");
 
 /**
- * \ingroup lr-wpan-test
- * \ingroup tests
+ * @ingroup lr-wpan-test
+ * @ingroup tests
  *
- * \brief LrWpan Energy Detection Test
+ * @brief LrWpan Energy Detection Test
  */
 class LrWpanEdTestCase : public TestCase
 {
@@ -40,9 +40,9 @@
     void DoRun() override;
 
     /**
-     * \brief Function called when PlmeEdConfirm is hit.
-     * \param status The PHY status.
-     * \param level The ED level.
+     * @brief Function called when PlmeEdConfirm is hit.
+     * @param status The PHY status.
+     * @param level The ED level.
      */
     void PlmeEdConfirm(PhyEnumeration status, uint8_t level);
 
@@ -244,10 +244,10 @@
 }
 
 /**
- * \ingroup lr-wpan-test
- * \ingroup tests
+ * @ingroup lr-wpan-test
+ * @ingroup tests
  *
- * \brief LrWpan Energy Detection TestSuite
+ * @brief LrWpan Energy Detection TestSuite
  */
 class LrWpanEdTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/test/lr-wpan-error-model-test.cc ns-3.44/src/lr-wpan/test/lr-wpan-error-model-test.cc
--- ns-3.43/src/lr-wpan/test/lr-wpan-error-model-test.cc	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/test/lr-wpan-error-model-test.cc	2025-03-09 16:55:49.419371100 -0700
@@ -5,21 +5,21 @@
  *
  * Author: Tom Henderson <thomas.r.henderson@boeing.com>
  */
+#include "ns3/callback.h"
+#include "ns3/constant-position-mobility-model.h"
+#include "ns3/log.h"
+#include "ns3/lr-wpan-error-model.h"
+#include "ns3/lr-wpan-mac.h"
+#include "ns3/lr-wpan-net-device.h"
+#include "ns3/mac16-address.h"
+#include "ns3/net-device.h"
+#include "ns3/node.h"
+#include "ns3/packet.h"
+#include "ns3/propagation-loss-model.h"
 #include "ns3/rng-seed-manager.h"
-#include <ns3/callback.h>
-#include <ns3/constant-position-mobility-model.h>
-#include <ns3/log.h>
-#include <ns3/lr-wpan-error-model.h>
-#include <ns3/lr-wpan-mac.h>
-#include <ns3/lr-wpan-net-device.h>
-#include <ns3/mac16-address.h>
-#include <ns3/net-device.h>
-#include <ns3/node.h>
-#include <ns3/packet.h>
-#include <ns3/propagation-loss-model.h>
-#include <ns3/simulator.h>
-#include <ns3/single-model-spectrum-channel.h>
-#include <ns3/test.h>
+#include "ns3/simulator.h"
+#include "ns3/single-model-spectrum-channel.h"
+#include "ns3/test.h"
 
 using namespace ns3;
 using namespace ns3::lrwpan;
@@ -27,10 +27,10 @@
 NS_LOG_COMPONENT_DEFINE("lr-wpan-error-model-test");
 
 /**
- * \ingroup lr-wpan-test
- * \ingroup tests
+ * @ingroup lr-wpan-test
+ * @ingroup tests
  *
- * \brief LrWpan Error Vs Distance Test
+ * @brief LrWpan Error Vs Distance Test
  */
 class LrWpanErrorDistanceTestCase : public TestCase
 {
@@ -39,8 +39,8 @@
     ~LrWpanErrorDistanceTestCase() override;
 
     /**
-     * \brief Get the number of received packets.
-     * \returns The number of received packets.
+     * @brief Get the number of received packets.
+     * @returns The number of received packets.
      */
     uint32_t GetReceived() const
     {
@@ -51,19 +51,19 @@
     void DoRun() override;
 
     /**
-     * \brief Function to be called when a packet is received.
-     * \param params MCPS params.
-     * \param p The packet.
+     * @brief Function to be called when a packet is received.
+     * @param params MCPS params.
+     * @param p The packet.
      */
     void Callback(McpsDataIndicationParams params, Ptr<Packet> p);
     uint32_t m_received; //!< The number of received packets.
 };
 
 /**
- * \ingroup lr-wpan-test
- * \ingroup tests
+ * @ingroup lr-wpan-test
+ * @ingroup tests
  *
- * \brief LrWpan Error model Test
+ * @brief LrWpan Error model Test
  */
 class LrWpanErrorModelTestCase : public TestCase
 {
@@ -185,10 +185,10 @@
 }
 
 /**
- * \ingroup lr-wpan-test
- * \ingroup tests
+ * @ingroup lr-wpan-test
+ * @ingroup tests
  *
- * \brief LrWpan Error model TestSuite
+ * @brief LrWpan Error model TestSuite
  */
 class LrWpanErrorModelTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/test/lr-wpan-ifs-test.cc ns-3.44/src/lr-wpan/test/lr-wpan-ifs-test.cc
--- ns-3.43/src/lr-wpan/test/lr-wpan-ifs-test.cc	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/test/lr-wpan-ifs-test.cc	2025-03-09 16:55:49.419371100 -0700
@@ -7,16 +7,16 @@
  *  Alberto Gallegos Ramonet <ramonet@fc.ritsumei.ac.jp>
  */
 
+#include "ns3/constant-position-mobility-model.h"
+#include "ns3/core-module.h"
+#include "ns3/log.h"
+#include "ns3/lr-wpan-module.h"
+#include "ns3/packet.h"
+#include "ns3/propagation-delay-model.h"
+#include "ns3/propagation-loss-model.h"
 #include "ns3/rng-seed-manager.h"
-#include <ns3/constant-position-mobility-model.h>
-#include <ns3/core-module.h>
-#include <ns3/log.h>
-#include <ns3/lr-wpan-module.h>
-#include <ns3/packet.h>
-#include <ns3/propagation-delay-model.h>
-#include <ns3/propagation-loss-model.h>
-#include <ns3/simulator.h>
-#include <ns3/single-model-spectrum-channel.h>
+#include "ns3/simulator.h"
+#include "ns3/single-model-spectrum-channel.h"
 
 #include <iomanip>
 #include <iostream>
@@ -27,10 +27,10 @@
 NS_LOG_COMPONENT_DEFINE("lr-wpan-ifs-test");
 
 /**
- * \ingroup lr-wpan-test
- * \ingroup tests
+ * @ingroup lr-wpan-test
+ * @ingroup tests
  *
- * \brief LrWpan Dataframe transmission with Interframe Space
+ * @brief LrWpan Dataframe transmission with Interframe Space
  */
 class LrWpanDataIfsTestCase : public TestCase
 {
@@ -40,50 +40,50 @@
 
   private:
     /**
-     * \brief Function called when DataConfirm is hit.
-     * \param testcase pointer to the testcase
-     * \param dev originating NetDevice
-     * \param params the MCPS params
+     * @brief Function called when DataConfirm is hit.
+     * @param testcase pointer to the testcase
+     * @param dev originating NetDevice
+     * @param params the MCPS params
      */
     static void DataConfirm(LrWpanDataIfsTestCase* testcase,
                             Ptr<LrWpanNetDevice> dev,
                             McpsDataConfirmParams params);
 
     /**
-     * \brief Function called when DataReceived is hit.
-     * \param testcase pointer to the testcase
-     * \param dev originating NetDevice
-     * \param p packet
+     * @brief Function called when DataReceived is hit.
+     * @param testcase pointer to the testcase
+     * @param dev originating NetDevice
+     * @param p packet
      */
     static void DataReceivedDev0(LrWpanDataIfsTestCase* testcase,
                                  Ptr<LrWpanNetDevice> dev,
                                  Ptr<const Packet> p);
 
     /**
-     * \brief Function called when PhyDataRxStart is hit.
-     * \param testcase pointer to the testcase
-     * \param dev originating NetDevice
-     * \param p packet
+     * @brief Function called when PhyDataRxStart is hit.
+     * @param testcase pointer to the testcase
+     * @param dev originating NetDevice
+     * @param p packet
      */
     static void PhyDataRxStart(LrWpanDataIfsTestCase* testcase,
                                Ptr<LrWpanNetDevice> dev,
                                Ptr<const Packet> p);
 
     /**
-     * \brief Function called when DataConfirm is hit.
-     * \param testcase pointer to the testcase
-     * \param dev originating NetDevice
-     * \param p packet
+     * @brief Function called when DataConfirm is hit.
+     * @param testcase pointer to the testcase
+     * @param dev originating NetDevice
+     * @param p packet
      */
     static void DataReceivedDev1(LrWpanDataIfsTestCase* testcase,
                                  Ptr<LrWpanNetDevice> dev,
                                  Ptr<const Packet>);
 
     /**
-     * \brief Function called when the IFS ends.
-     * \param testcase pointer to the testcase
-     * \param dev originating NetDevice
-     * \param IfsTime the IFS time
+     * @brief Function called when the IFS ends.
+     * @param testcase pointer to the testcase
+     * @param dev originating NetDevice
+     * @param IfsTime the IFS time
      */
     static void IfsEnd(LrWpanDataIfsTestCase* testcase, Ptr<LrWpanNetDevice> dev, Time IfsTime);
 
@@ -271,7 +271,7 @@
     ////////////////////////  SIFS ///////////////////////////
 
     Simulator::ScheduleWithContext(1,
-                                   Seconds(0.0),
+                                   Seconds(0),
                                    &LrWpanMac::McpsDataRequest,
                                    dev0->GetMac(),
                                    params,
@@ -284,7 +284,7 @@
     // SIFS = 12 symbols (192 Microseconds on a 2.4Ghz O-QPSK PHY)
     ifsSize = m_endIfs - m_lastTxTime;
     NS_TEST_EXPECT_MSG_EQ(ifsSize,
-                          Time(MicroSeconds(192)),
+                          MicroSeconds(192),
                           "Wrong Short InterFrame Space (SIFS) Size after dataframe Tx");
     std::cout << "----------------------------------\n";
 
@@ -293,7 +293,7 @@
     p0 = Create<Packet>(8);
 
     Simulator::ScheduleWithContext(1,
-                                   Seconds(0.0),
+                                   Seconds(0),
                                    &LrWpanMac::McpsDataRequest,
                                    dev0->GetMac(),
                                    params,
@@ -306,7 +306,7 @@
     // LIFS = 40 symbols (640 Microseconds on a 2.4Ghz O-QPSK PHY)
     ifsSize = m_endIfs - m_lastTxTime;
     NS_TEST_EXPECT_MSG_EQ(ifsSize,
-                          Time(MicroSeconds(640)),
+                          MicroSeconds(640),
                           "Wrong Long InterFrame Space (LIFS) Size after dataframe Tx");
     std::cout << "----------------------------------\n";
 
@@ -316,7 +316,7 @@
     p0 = Create<Packet>(2);
 
     Simulator::ScheduleWithContext(1,
-                                   Seconds(0.0),
+                                   Seconds(0),
                                    &LrWpanMac::McpsDataRequest,
                                    dev0->GetMac(),
                                    params,
@@ -329,7 +329,7 @@
     // SIFS = 12 symbols (192 Microseconds on a 2.4Ghz O-QPSK PHY)
     ifsSize = m_endIfs - m_ackRxTime;
     NS_TEST_EXPECT_MSG_EQ(ifsSize,
-                          Time(MicroSeconds(192)),
+                          MicroSeconds(192),
                           "Wrong Short InterFrame Space (SIFS) Size after ACK Rx");
     std::cout << "----------------------------------\n";
 
@@ -339,7 +339,7 @@
     p0 = Create<Packet>(8);
 
     Simulator::ScheduleWithContext(1,
-                                   Seconds(0.0),
+                                   Seconds(0),
                                    &LrWpanMac::McpsDataRequest,
                                    dev0->GetMac(),
                                    params,
@@ -352,7 +352,7 @@
     // LIFS = 40 symbols (640 Microseconds on a 2.4Ghz O-QPSK PHY)
     ifsSize = m_endIfs - m_ackRxTime;
     NS_TEST_EXPECT_MSG_EQ(ifsSize,
-                          Time(MicroSeconds(640)),
+                          MicroSeconds(640),
                           "Wrong Long InterFrame Space (LIFS) Size after ACK Rx");
     std::cout << "----------------------------------\n";
 
@@ -377,7 +377,7 @@
     params.m_msduHandle = 0;
 
     Simulator::ScheduleWithContext(1,
-                                   Seconds(0.0),
+                                   Seconds(0),
                                    &LrWpanMac::McpsDataRequest,
                                    dev0->GetMac(),
                                    params,
@@ -391,14 +391,28 @@
 
     //////////////////////////////////////////////////////////////////////////////////
 
+    // Disconnect traces to eliminate Valgrid errors
+    dev0->GetMac()->TraceDisconnectWithoutContext(
+        "IfsEnd",
+        MakeBoundCallback(&LrWpanDataIfsTestCase::IfsEnd, this, dev0));
+    dev0->GetMac()->TraceDisconnectWithoutContext(
+        "MacRx",
+        MakeBoundCallback(&LrWpanDataIfsTestCase::DataReceivedDev0, this, dev0));
+    dev0->GetPhy()->TraceDisconnectWithoutContext(
+        "PhyRxBegin",
+        MakeBoundCallback(&LrWpanDataIfsTestCase::PhyDataRxStart, this, dev0));
+    dev1->GetMac()->TraceDisconnectWithoutContext(
+        "MacRx",
+        MakeBoundCallback(&LrWpanDataIfsTestCase::DataReceivedDev1, this, dev1));
+
     Simulator::Destroy();
 }
 
 /**
- * \ingroup lr-wpan-test
- * \ingroup tests
+ * @ingroup lr-wpan-test
+ * @ingroup tests
  *
- * \brief LrWpan IFS TestSuite
+ * @brief LrWpan IFS TestSuite
  */
 
 class LrWpanIfsTestSuite : public TestSuite
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/test/lr-wpan-mac-test.cc ns-3.44/src/lr-wpan/test/lr-wpan-mac-test.cc
--- ns-3.43/src/lr-wpan/test/lr-wpan-mac-test.cc	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/test/lr-wpan-mac-test.cc	2025-03-09 16:55:49.419371100 -0700
@@ -6,15 +6,15 @@
  * Author: Alberto Gallegos Ramonet <alramonet@is.tokushima-u.ac.jp>
  */
 
-#include <ns3/constant-position-mobility-model.h>
-#include <ns3/core-module.h>
-#include <ns3/log.h>
-#include <ns3/lr-wpan-module.h>
-#include <ns3/packet.h>
-#include <ns3/propagation-delay-model.h>
-#include <ns3/propagation-loss-model.h>
-#include <ns3/simulator.h>
-#include <ns3/single-model-spectrum-channel.h>
+#include "ns3/constant-position-mobility-model.h"
+#include "ns3/core-module.h"
+#include "ns3/log.h"
+#include "ns3/lr-wpan-module.h"
+#include "ns3/packet.h"
+#include "ns3/propagation-delay-model.h"
+#include "ns3/propagation-loss-model.h"
+#include "ns3/simulator.h"
+#include "ns3/single-model-spectrum-channel.h"
 
 #include <iostream>
 
@@ -24,10 +24,10 @@
 NS_LOG_COMPONENT_DEFINE("lr-wpan-mac-test");
 
 /**
- * \ingroup lr-wpan-test
- * \ingroup tests
+ * @ingroup lr-wpan-test
+ * @ingroup tests
  *
- * \brief Test PHY going to TRX_OFF after CSMA failure (MAC->RxOnWhenIdle(false))
+ * @brief Test PHY going to TRX_OFF after CSMA failure (MAC->RxOnWhenIdle(false))
  */
 class TestRxOffWhenIdleAfterCsmaFailure : public TestCase
 {
@@ -38,21 +38,21 @@
   private:
     /**
      * Function called when a Data indication is invoked
-     * \param params MCPS data indication parameters
-     * \param p packet
+     * @param params MCPS data indication parameters
+     * @param p packet
      */
     void DataIndication(McpsDataIndicationParams params, Ptr<Packet> p);
     /**
      * Function called when a Data confirm is invoked (After Tx Attempt)
-     * \param params MCPS data confirm parameters
+     * @param params MCPS data confirm parameters
      */
     void DataConfirm(McpsDataConfirmParams params);
     /**
      * Function called when a the PHY state changes in Dev0 [00:01]
-     * \param context context
-     * \param now time at which the function is called
-     * \param oldState old PHY state
-     * \param newState new PHY state
+     * @param context context
+     * @param now time at which the function is called
+     * @param oldState old PHY state
+     * @param newState new PHY state
      */
     void StateChangeNotificationDev0(std::string context,
                                      Time now,
@@ -60,10 +60,10 @@
                                      PhyEnumeration newState);
     /**
      * Function called when a the PHY state changes in Dev2 [00:03]
-     * \param context context
-     * \param now time at which the function is called
-     * \param oldState old PHY state
-     * \param newState new PHY state
+     * @param context context
+     * @param now time at which the function is called
+     * @param oldState old PHY state
+     * @param newState new PHY state
      */
     void StateChangeNotificationDev2(std::string context,
                                      Time now,
@@ -263,7 +263,7 @@
     params.m_dstAddr = Mac16Address("00:02");
 
     Simulator::ScheduleWithContext(2,
-                                   Seconds(0.0),
+                                   Seconds(0),
                                    &LrWpanMac::McpsDataRequest,
                                    dev2->GetMac(),
                                    params,
@@ -280,10 +280,10 @@
 }
 
 /**
- * \ingroup lr-wpan-test
- * \ingroup tests
+ * @ingroup lr-wpan-test
+ * @ingroup tests
  *
- * \brief Test MAC Active Scan PAN descriptor reception and check some of its values.
+ * @brief Test MAC Active Scan PAN descriptor reception and check some of its values.
  */
 class TestActiveScanPanDescriptors : public TestCase
 {
@@ -295,14 +295,14 @@
     /**
      * Function called in response to a MAC scan request.
      *
-     * \param params MLME scan confirm parameters
+     * @param params MLME scan confirm parameters
      */
     void ScanConfirm(MlmeScanConfirmParams params);
 
     /**
      * Function used to notify the reception of a beacon with payload.
      *
-     * \param params The MLME-BEACON-NOTIFY.indication parameters
+     * @param params The MLME-BEACON-NOTIFY.indication parameters
      */
     void BeaconNotifyIndication(MlmeBeaconNotifyIndicationParams params);
 
@@ -437,7 +437,7 @@
     params.m_sfrmOrd = 15;
     params.m_logCh = 12;
     Simulator::ScheduleWithContext(1,
-                                   Seconds(2.0),
+                                   Seconds(2),
                                    &LrWpanMac::MlmeStartRequest,
                                    coord1NetDevice->GetMac(),
                                    params);
@@ -460,7 +460,7 @@
     params2.m_sfrmOrd = 15;
     params2.m_logCh = 14;
     Simulator::ScheduleWithContext(2,
-                                   Seconds(2.0),
+                                   Seconds(2),
                                    &LrWpanMac::MlmeStartRequest,
                                    coord2NetDevice->GetMac(),
                                    params2);
@@ -477,7 +477,7 @@
     scanParams.m_scanDuration = 14;
     scanParams.m_scanType = MLMESCAN_ACTIVE;
     Simulator::ScheduleWithContext(1,
-                                   Seconds(3.0),
+                                   Seconds(3),
                                    &LrWpanMac::MlmeScanRequest,
                                    endNodeNetDevice->GetMac(),
                                    scanParams);
@@ -519,10 +519,10 @@
 }
 
 /**
- * \ingroup lr-wpan-test
- * \ingroup tests
+ * @ingroup lr-wpan-test
+ * @ingroup tests
  *
- * \brief Test MAC Orphan Scan Coordinator Realignment command reception and its values.
+ * @brief Test MAC Orphan Scan Coordinator Realignment command reception and its values.
  */
 class TestOrphanScan : public TestCase
 {
@@ -534,7 +534,7 @@
     /**
      * Function called in response to a MAC scan request.
      *
-     * \param params MLME scan confirm parameters
+     * @param params MLME scan confirm parameters
      */
     void ScanConfirm(MlmeScanConfirmParams params);
 
@@ -542,7 +542,7 @@
      * Function called as a result of receiving an orphan notification command
      * on the coordinator
      *
-     * \param params MLME orphan indication parameters
+     * @param params MLME orphan indication parameters
      */
     void OrphanIndicationCoord(MlmeOrphanIndicationParams params);
 
@@ -660,7 +660,7 @@
     params.m_sfrmOrd = 15;
     params.m_logCh = 12;
     Simulator::ScheduleWithContext(1,
-                                   Seconds(2.0),
+                                   Seconds(2),
                                    &LrWpanMac::MlmeStartRequest,
                                    coord1NetDevice->GetMac(),
                                    params);
@@ -679,7 +679,7 @@
     scanParams.m_scanChannels = 0x7800;
     scanParams.m_scanType = MLMESCAN_ORPHAN;
     Simulator::ScheduleWithContext(1,
-                                   Seconds(3.0),
+                                   Seconds(3),
                                    &LrWpanMac::MlmeScanRequest,
                                    endNodeNetDevice->GetMac(),
                                    scanParams);
@@ -704,10 +704,10 @@
 }
 
 /**
- * \ingroup lr-wpan-test
- * \ingroup tests
+ * @ingroup lr-wpan-test
+ * @ingroup tests
  *
- * \brief LrWpan MAC TestSuite
+ * @brief LrWpan MAC TestSuite
  */
 class LrWpanMacTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/test/lr-wpan-packet-test.cc ns-3.44/src/lr-wpan/test/lr-wpan-packet-test.cc
--- ns-3.43/src/lr-wpan/test/lr-wpan-packet-test.cc	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/test/lr-wpan-packet-test.cc	2025-03-09 16:55:49.419371100 -0700
@@ -5,13 +5,13 @@
  *
  * Author:  Tom Henderson <thomas.r.henderson@boeing.com>
  */
-#include <ns3/log.h>
-#include <ns3/lr-wpan-mac-header.h>
-#include <ns3/lr-wpan-mac-trailer.h>
-#include <ns3/mac16-address.h>
-#include <ns3/mac64-address.h>
-#include <ns3/packet.h>
-#include <ns3/test.h>
+#include "ns3/log.h"
+#include "ns3/lr-wpan-mac-header.h"
+#include "ns3/lr-wpan-mac-trailer.h"
+#include "ns3/mac16-address.h"
+#include "ns3/mac64-address.h"
+#include "ns3/packet.h"
+#include "ns3/test.h"
 
 #include <vector>
 
@@ -21,10 +21,10 @@
 NS_LOG_COMPONENT_DEFINE("lr-wpan-packet-test");
 
 /**
- * \ingroup lr-wpan-test
- * \ingroup tests
+ * @ingroup lr-wpan-test
+ * @ingroup tests
  *
- * \brief LrWpan header and trailer Test
+ * @brief LrWpan header and trailer Test
  */
 class LrWpanPacketTestCase : public TestCase
 {
@@ -98,10 +98,10 @@
 }
 
 /**
- * \ingroup lr-wpan-test
- * \ingroup tests
+ * @ingroup lr-wpan-test
+ * @ingroup tests
  *
- * \brief LrWpan header and trailer TestSuite
+ * @brief LrWpan header and trailer TestSuite
  */
 class LrWpanPacketTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/test/lr-wpan-pd-plme-sap-test.cc ns-3.44/src/lr-wpan/test/lr-wpan-pd-plme-sap-test.cc
--- ns-3.43/src/lr-wpan/test/lr-wpan-pd-plme-sap-test.cc	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/test/lr-wpan-pd-plme-sap-test.cc	2025-03-09 16:55:49.419371100 -0700
@@ -5,22 +5,22 @@
  *
  * Author: Gary Pei <guangyu.pei@boeing.com>
  */
-#include <ns3/log.h>
-#include <ns3/lr-wpan-mac.h>
-#include <ns3/lr-wpan-phy.h>
-#include <ns3/packet.h>
-#include <ns3/simulator.h>
-#include <ns3/single-model-spectrum-channel.h>
-#include <ns3/test.h>
+#include "ns3/log.h"
+#include "ns3/lr-wpan-mac.h"
+#include "ns3/lr-wpan-phy.h"
+#include "ns3/packet.h"
+#include "ns3/simulator.h"
+#include "ns3/single-model-spectrum-channel.h"
+#include "ns3/test.h"
 
 using namespace ns3;
 using namespace ns3::lrwpan;
 
 /**
- * \ingroup lr-wpan-test
- * \ingroup tests
+ * @ingroup lr-wpan-test
+ * @ingroup tests
  *
- * \brief LrWpan PLME and PD Interfaces Test
+ * @brief LrWpan PLME and PD Interfaces Test
  */
 class LrWpanPlmeAndPdInterfaceTestCase : public TestCase
 {
@@ -32,10 +32,10 @@
     void DoRun() override;
 
     /**
-     * \brief Receives a PdData indication
-     * \param psduLength The PSDU length.
-     * \param p The packet.
-     * \param lqi The LQI.
+     * @brief Receives a PdData indication
+     * @param psduLength The PSDU length.
+     * @param p The packet.
+     * @param lqi The LQI.
      */
     void ReceivePdDataIndication(uint32_t psduLength, Ptr<Packet> p, uint8_t lqi);
 };
@@ -82,10 +82,10 @@
 }
 
 /**
- * \ingroup lr-wpan-test
- * \ingroup tests
+ * @ingroup lr-wpan-test
+ * @ingroup tests
  *
- * \brief LrWpan PLME and PD Interfaces TestSuite
+ * @brief LrWpan PLME and PD Interfaces TestSuite
  */
 class LrWpanPlmeAndPdInterfaceTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/test/lr-wpan-slotted-csmaca-test.cc ns-3.44/src/lr-wpan/test/lr-wpan-slotted-csmaca-test.cc
--- ns-3.43/src/lr-wpan/test/lr-wpan-slotted-csmaca-test.cc	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/test/lr-wpan-slotted-csmaca-test.cc	2025-03-09 16:55:49.419371100 -0700
@@ -7,15 +7,15 @@
  *  Alberto Gallegos Ramonet <ramonet@fc.ritsumei.ac.jp>
  */
 
-#include <ns3/constant-position-mobility-model.h>
-#include <ns3/core-module.h>
-#include <ns3/log.h>
-#include <ns3/lr-wpan-module.h>
-#include <ns3/packet.h>
-#include <ns3/propagation-delay-model.h>
-#include <ns3/propagation-loss-model.h>
-#include <ns3/simulator.h>
-#include <ns3/single-model-spectrum-channel.h>
+#include "ns3/constant-position-mobility-model.h"
+#include "ns3/core-module.h"
+#include "ns3/log.h"
+#include "ns3/lr-wpan-module.h"
+#include "ns3/packet.h"
+#include "ns3/propagation-delay-model.h"
+#include "ns3/propagation-loss-model.h"
+#include "ns3/simulator.h"
+#include "ns3/single-model-spectrum-channel.h"
 
 using namespace ns3;
 using namespace ns3::lrwpan;
@@ -23,10 +23,10 @@
 NS_LOG_COMPONENT_DEFINE("lr-wpan-slotted-csma-test");
 
 /**
- * \ingroup lr-wpan-test
- * \ingroup tests
+ * @ingroup lr-wpan-test
+ * @ingroup tests
  *
- * \brief Test the correct allocation of DIRECT transmissions in the
+ * @brief Test the correct allocation of DIRECT transmissions in the
  *        contention access period (CAP) of the superframe
  *        (Slotted CSMA-CA algorithm).
  */
@@ -38,41 +38,41 @@
 
   private:
     /**
-     * \brief Function called when McpsDataConfirm is hit.
-     * \param testcase The TestCase.
-     * \param dev The LrWpanNetDevice.
-     * \param params The McpsDataConfirm parameters.
+     * @brief Function called when McpsDataConfirm is hit.
+     * @param testcase The TestCase.
+     * @param dev The LrWpanNetDevice.
+     * @param params The McpsDataConfirm parameters.
      */
     static void TransEndIndication(LrWpanSlottedCsmacaTestCase* testcase,
                                    Ptr<LrWpanNetDevice> dev,
                                    McpsDataConfirmParams params);
     /**
-     * \brief Function called when McpsDataIndication is hit.
-     * \param testcase The TestCase.
-     * \param dev The LrWpanNetDevice.
-     * \param params The McpsDataIndication parameters.
-     * \param p The received packet.
+     * @brief Function called when McpsDataIndication is hit.
+     * @param testcase The TestCase.
+     * @param dev The LrWpanNetDevice.
+     * @param params The McpsDataIndication parameters.
+     * @param p The received packet.
      */
     static void DataIndicationCoordinator(LrWpanSlottedCsmacaTestCase* testcase,
                                           Ptr<LrWpanNetDevice> dev,
                                           McpsDataIndicationParams params,
                                           Ptr<Packet> p);
     /**
-     * \brief Function called when MlmeStartConfirm is hit.
-     * \param testcase The TestCase.
-     * \param dev The LrWpanNetDevice.
-     * \param params The MlmeStartConfirm parameters.
+     * @brief Function called when MlmeStartConfirm is hit.
+     * @param testcase The TestCase.
+     * @param dev The LrWpanNetDevice.
+     * @param params The MlmeStartConfirm parameters.
      */
     static void StartConfirm(LrWpanSlottedCsmacaTestCase* testcase,
                              Ptr<LrWpanNetDevice> dev,
                              MlmeStartConfirmParams params);
 
     /**
-     * \brief Function called on each Superframe status change (CAP|CFP|INACTIVE).
-     * \param testcase The TestCase.
-     * \param dev The LrWpanNetDevice.
-     * \param oldValue The previous superframe status.
-     * \param newValue THe new superframe status.
+     * @brief Function called on each Superframe status change (CAP|CFP|INACTIVE).
+     * @param testcase The TestCase.
+     * @param dev The LrWpanNetDevice.
+     * @param oldValue The previous superframe status.
+     * @param newValue THe new superframe status.
      */
     static void IncomingSuperframeStatus(LrWpanSlottedCsmacaTestCase* testcase,
                                          Ptr<LrWpanNetDevice> dev,
@@ -80,10 +80,10 @@
                                          SuperframeStatus newValue);
 
     /**
-     * \brief Function called to indicated the calculated transaction cost in slotted CSMA-CA
-     * \param testcase The TestCase.
-     * \param dev The LrWpanNetDevice.
-     * \param trans The transaction cost in symbols.
+     * @brief Function called to indicated the calculated transaction cost in slotted CSMA-CA
+     * @param testcase The TestCase.
+     * @param dev The LrWpanNetDevice.
+     * @param trans The transaction cost in symbols.
      */
     static void TransactionCost(LrWpanSlottedCsmacaTestCase* testcase,
                                 Ptr<LrWpanNetDevice> dev,
@@ -243,7 +243,7 @@
     params.m_bcnOrd = 14;
     params.m_sfrmOrd = 6;
     Simulator::ScheduleWithContext(1,
-                                   Seconds(2.0),
+                                   Seconds(2),
                                    &LrWpanMac::MlmeStartRequest,
                                    dev0->GetMac(),
                                    params);
@@ -324,14 +324,19 @@
                           (m_apBoundary + transactionTime),
                           "Error, the transaction time is not the expected value");
 
+    // Disconnect traces to eliminate valgrid errors
+    dev1->GetMac()->TraceDisconnectWithoutContext(
+        "MacIncSuperframeStatus",
+        MakeBoundCallback(&LrWpanSlottedCsmacaTestCase::IncomingSuperframeStatus, this, dev1));
+
     Simulator::Destroy();
 }
 
 /**
- * \ingroup lr-wpan-test
- * \ingroup tests
+ * @ingroup lr-wpan-test
+ * @ingroup tests
  *
- * \brief LrWpan Slotted CSMA-CA TestSuite
+ * @brief LrWpan Slotted CSMA-CA TestSuite
  */
 
 class LrWpanSlottedCsmacaTestSuite : public TestSuite
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lr-wpan/test/lr-wpan-spectrum-value-helper-test.cc ns-3.44/src/lr-wpan/test/lr-wpan-spectrum-value-helper-test.cc
--- ns-3.43/src/lr-wpan/test/lr-wpan-spectrum-value-helper-test.cc	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lr-wpan/test/lr-wpan-spectrum-value-helper-test.cc	2025-03-09 16:55:49.419371100 -0700
@@ -5,10 +5,10 @@
  *
  * Author:  Tom Henderson <thomas.r.henderson@boeing.com>
  */
-#include <ns3/log.h>
-#include <ns3/lr-wpan-spectrum-value-helper.h>
-#include <ns3/spectrum-value.h>
-#include <ns3/test.h>
+#include "ns3/log.h"
+#include "ns3/lr-wpan-spectrum-value-helper.h"
+#include "ns3/spectrum-value.h"
+#include "ns3/test.h"
 
 #include <cmath>
 
@@ -16,10 +16,10 @@
 using namespace ns3::lrwpan;
 
 /**
- * \ingroup lr-wpan-test
- * \ingroup tests
+ * @ingroup lr-wpan-test
+ * @ingroup tests
  *
- * \brief LrWpan SpectrumValue Helper TestSuite
+ * @brief LrWpan SpectrumValue Helper TestSuite
  */
 class LrWpanSpectrumValueHelperTestCase : public TestCase
 {
@@ -63,10 +63,10 @@
 }
 
 /**
- * \ingroup lr-wpan-test
- * \ingroup tests
+ * @ingroup lr-wpan-test
+ * @ingroup tests
  *
- * \brief LrWpan SpectrumValue Helper TestSuite
+ * @brief LrWpan SpectrumValue Helper TestSuite
  */
 class LrWpanSpectrumValueHelperTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/CMakeLists.txt ns-3.44/src/lte/CMakeLists.txt
--- ns-3.43/src/lte/CMakeLists.txt	2024-10-09 16:41:09.900656000 -0700
+++ ns-3.44/src/lte/CMakeLists.txt	2025-03-09 16:55:49.419371100 -0700
@@ -358,4 +358,5 @@
     ${libconfig-store}
   TEST_SOURCES ${test_sources}
   MODULE_ENABLED_FEATURES ${emu_features}
+  GENERATE_EXPORT_HEADER
 )
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/doc/source/lte-design.rst ns-3.44/src/lte/doc/source/lte-design.rst
--- ns-3.43/src/lte/doc/source/lte-design.rst	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/doc/source/lte-design.rst	2025-03-09 16:55:49.447371200 -0700
@@ -1169,7 +1169,7 @@
 
  * :math:`t_{i}`: packet arrival rate (byte/sec )
  * :math:`r_{i}`: token generation rate (byte/sec)
- * :math:`p_{i}`: token pool size (byte)
+ * :math:`p_{i}`: token pool size (byte)
  * :math:`E_{i}`: counter that records the number of token borrowed from or given to the token bank by flow :math:`i` ;
    :math:`E_{i}` can be smaller than zero
 
@@ -1183,7 +1183,7 @@
 has more opportunity to borrow tokens from bank. In addition, TBFQ can police the traffic by setting the token
 generation rate to limit the throughput.  Additionally, TBFQ also maintains following three parameters for each flow:
 
- * Debt limit :math:`d_{i}`: if :math:`E_{i}` belows this threshold, user i cannot further borrow tokens from bank. This is for
+ * Debt limit :math:`d_{i}`: if :math:`E_{i}` is below this threshold, user i cannot further borrow tokens from bank. This is for
    preventing malicious UE to borrow too much tokens.
  * Credit limit :math:`c_{i}`: the maximum number of tokens UE i can borrow from the bank in one time.
  * Credit threshold :math:`C`: once :math:`E_{i}` reaches debt limit, UE i must store :math:`C` tokens to bank in order to further
@@ -2893,7 +2893,7 @@
    |            |          |            | COMPLETE    |          |            |
    +------------+----------+------------+-------------+----------+------------+
    | Connection | eNodeB   | Send RRC   | Never       | 30 ms    | Remove UE  |
-   | rejected   | RRC      | CONNECTION |             |          | context    |
+   | rejected   | RRC      | CONNECTION |             |          | context    |
    | timeout    |          | REJECT     |             |          |            |
    +------------+----------+------------+-------------+----------+------------+
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/doc/source/lte-references.rst ns-3.44/src/lte/doc/source/lte-references.rst
--- ns-3.43/src/lte/doc/source/lte-references.rst	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/doc/source/lte-references.rst	2025-03-09 16:55:49.447371200 -0700
@@ -136,7 +136,7 @@
    Scheduler to enhance the capacity of Voice over LTE systems"
    <https://ieeexplore.ieee.org/document/6808890>`_,
    in Proceedings of 11th International Multi-Conference on Systems,
-   Signals & Devices (SSD’14), Castelldefels, 11-14 February 2014,
+   Signals & Devices (SSD'14), Castelldefels, 11-14 February 2014,
    Castelldefels (Spain).
 
 .. [Baldo2014] N. Baldo, R. Martínez, P. Dini, R. Vilalta, M. Miozzo,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/doc/source/lte-testing.rst ns-3.44/src/lte/doc/source/lte-testing.rst
--- ns-3.43/src/lte/doc/source/lte-testing.rst	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/doc/source/lte-testing.rst	2025-03-09 16:55:49.467371500 -0700
@@ -118,7 +118,7 @@
 
 Dedicated Bearer Deactivation Tests
 -----------------------------------
-The test suite ‘lte-test-deactivate-bearer’ creates test case with single EnodeB and Three UE’s.
+The test suite 'lte-test-deactivate-bearer' creates test case with single EnodeB and Three UE's.
 Each UE consists of one Default and one Dedicated EPS bearer with same bearer specification but with different ARP.
 Test Case Flow is as follows:
 Attach UE -> Create Default+Dedicated Bearer -> Deactivate one of the Dedicated bearer
@@ -134,7 +134,7 @@
 
 Test case executes in three epochs:
 
- #. In first Epoch (0.04s-1.04s) All UE’s and corresponding bearers gets attached and packet flow over the dedicated bearers activated.
+ #. In first Epoch (0.04s-1.04s) All UE's and corresponding bearers gets attached and packet flow over the dedicated bearers activated.
  #. In second Epoch (1.04s-2.04s), bearer deactivation is instantiated, hence User can see relatively less number of TxBytes on UE_ID=1 and LCID=4 as compared to other bearers.
  #. In third Epoch (2.04s-3.04s) since bearer deactivation of UE_ID=1 and LCID=4 is completed, user will not see any logging related to LCID=4.
 
@@ -1521,7 +1521,7 @@
 
 UE uses Uplink Power Control to automatically change Tx Power level for Uplink
 Physical Channels. Tx Power is computed based on path-loss, number of RB used for transmission,
-some configurable parameters and TPC command from eNB.
+some configurable parameters and TPC command from eNB.
 
 The test suite ``lte-uplink-power-control`` verifies if Tx Power is computed correctly.
 There are three different test cases:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/doc/source/lte-user.rst ns-3.44/src/lte/doc/source/lte-user.rst
--- ns-3.43/src/lte/doc/source/lte-user.rst	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/doc/source/lte-user.rst	2025-03-09 16:55:49.471371400 -0700
@@ -481,7 +481,7 @@
 And for setting the parameters::
 
   lteHelper->SetFadingModelAttribute("TraceFilename", StringValue("src/lte/model/fading-traces/fading_trace_EPA_3kmph.fad"));
-  lteHelper->SetFadingModelAttribute("TraceLength", TimeValue(Seconds(10.0)));
+  lteHelper->SetFadingModelAttribute("TraceLength", TimeValue(Seconds(10)));
   lteHelper->SetFadingModelAttribute("SamplesNum", UintegerValue(10000));
   lteHelper->SetFadingModelAttribute("WindowSize", TimeValue(Seconds(0.5)));
   lteHelper->SetFadingModelAttribute("RbNum", UintegerValue(100));
@@ -939,7 +939,7 @@
 
 That's all! You can now start your simulation as usual::
 
-  Simulator::Stop(Seconds(10.0));
+  Simulator::Stop(Seconds(10));
   Simulator::Run();
 
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/examples/lena-cc-helper.cc ns-3.44/src/lte/examples/lena-cc-helper.cc
--- ns-3.43/src/lte/examples/lena-cc-helper.cc	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/examples/lena-cc-helper.cc	2025-03-09 16:55:49.471371400 -0700
@@ -6,10 +6,10 @@
  * Author: Danilo Abrignani <danilo.abrignani@unibo.it>
  */
 
+#include "ns3/buildings-helper.h"
 #include "ns3/cc-helper.h"
 #include "ns3/component-carrier.h"
 #include "ns3/core-module.h"
-#include <ns3/buildings-helper.h>
 // #include "ns3/config-store.h"
 
 using namespace ns3;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/examples/lena-cqi-threshold.cc ns-3.44/src/lte/examples/lena-cqi-threshold.cc
--- ns-3.43/src/lte/examples/lena-cqi-threshold.cc	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/examples/lena-cqi-threshold.cc	2025-03-09 16:55:49.471371400 -0700
@@ -6,12 +6,12 @@
  * Author: Manuel Requena <manuel.requena@cttc.es>
  */
 
+#include "ns3/buildings-helper.h"
 #include "ns3/config-store.h"
 #include "ns3/core-module.h"
 #include "ns3/lte-module.h"
 #include "ns3/mobility-module.h"
 #include "ns3/network-module.h"
-#include <ns3/buildings-helper.h>
 // #include "ns3/gtk-config-store.h"
 
 using namespace ns3;
@@ -22,7 +22,7 @@
  * This function will move a node with a x coordinate greater than 10 m
  * to a x equal to 5 m, and less than or equal to 10 m to 10 Km
  *
- * \param node The node to move.
+ * @param node The node to move.
  */
 static void
 ChangePosition(Ptr<Node> node)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/examples/lena-deactivate-bearer.cc ns-3.44/src/lte/examples/lena-deactivate-bearer.cc
--- ns-3.43/src/lte/examples/lena-deactivate-bearer.cc	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/examples/lena-deactivate-bearer.cc	2025-03-09 16:55:49.471371400 -0700
@@ -223,7 +223,7 @@
                         2);
 
     // stop simulation after 3 seconds
-    Simulator::Stop(Seconds(3.0));
+    Simulator::Stop(Seconds(3));
 
     Simulator::Run();
     /*GtkConfigStore config;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/examples/lena-distributed-ffr.cc ns-3.44/src/lte/examples/lena-distributed-ffr.cc
--- ns-3.43/src/lte/examples/lena-distributed-ffr.cc	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/examples/lena-distributed-ffr.cc	2025-03-09 16:55:49.471371400 -0700
@@ -8,6 +8,7 @@
  */
 
 #include "ns3/applications-module.h"
+#include "ns3/buildings-helper.h"
 #include "ns3/core-module.h"
 #include "ns3/internet-module.h"
 #include "ns3/log.h"
@@ -17,7 +18,6 @@
 #include "ns3/point-to-point-epc-helper.h"
 #include "ns3/point-to-point-module.h"
 #include "ns3/spectrum-module.h"
-#include <ns3/buildings-helper.h>
 
 using namespace ns3;
 
@@ -280,7 +280,7 @@
 
             UdpClientHelper dlClientHelper(ueIpIfaces.GetAddress(u), dlPort);
             dlClientHelper.SetAttribute("MaxPackets", UintegerValue(1000000));
-            dlClientHelper.SetAttribute("Interval", TimeValue(MilliSeconds(1.0)));
+            dlClientHelper.SetAttribute("Interval", TimeValue(MilliSeconds(1)));
             clientApps.Add(dlClientHelper.Install(remoteHost));
             PacketSinkHelper dlPacketSinkHelper("ns3::UdpSocketFactory",
                                                 InetSocketAddress(Ipv4Address::GetAny(), dlPort));
@@ -288,7 +288,7 @@
 
             UdpClientHelper ulClientHelper(remoteHostAddr, ulPort);
             ulClientHelper.SetAttribute("MaxPackets", UintegerValue(1000000));
-            ulClientHelper.SetAttribute("Interval", TimeValue(MilliSeconds(1.0)));
+            ulClientHelper.SetAttribute("Interval", TimeValue(MilliSeconds(1)));
             clientApps.Add(ulClientHelper.Install(ue));
             PacketSinkHelper ulPacketSinkHelper("ns3::UdpSocketFactory",
                                                 InetSocketAddress(Ipv4Address::GetAny(), ulPort));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/examples/lena-dual-stripe.cc ns-3.44/src/lte/examples/lena-dual-stripe.cc
--- ns-3.43/src/lte/examples/lena-dual-stripe.cc	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/examples/lena-dual-stripe.cc	2025-03-09 16:55:49.471371400 -0700
@@ -6,16 +6,16 @@
  * Author: Nicola Baldo <nbaldo@cttc.es>
  */
 
-#include <ns3/applications-module.h>
-#include <ns3/buildings-module.h>
-#include <ns3/config-store-module.h>
-#include <ns3/core-module.h>
-#include <ns3/internet-module.h>
-#include <ns3/log.h>
-#include <ns3/lte-module.h>
-#include <ns3/mobility-module.h>
-#include <ns3/network-module.h>
-#include <ns3/point-to-point-helper.h>
+#include "ns3/applications-module.h"
+#include "ns3/buildings-module.h"
+#include "ns3/config-store-module.h"
+#include "ns3/core-module.h"
+#include "ns3/internet-module.h"
+#include "ns3/log.h"
+#include "ns3/lte-module.h"
+#include "ns3/mobility-module.h"
+#include "ns3/network-module.h"
+#include "ns3/point-to-point-helper.h"
 
 #include <iomanip>
 #include <ios>
@@ -34,9 +34,9 @@
 /**
  * Check if two boxes are overlapping.
  *
- * \param a First box.
- * \param b Second box.
- * \return true if the boxes are overlapping, false otherwise.
+ * @param a First box.
+ * @param b Second box.
+ * @return true if the boxes are overlapping, false otherwise.
  */
 bool
 AreOverlapping(Box a, Box b)
@@ -54,14 +54,14 @@
   public:
     /**
      * Constructor
-     * \param area the total area
-     * \param nApartmentsX the number of apartments in the X direction
-     * \param nFloors the number of floors
+     * @param area the total area
+     * @param nApartmentsX the number of apartments in the X direction
+     * @param nFloors the number of floors
      */
     FemtocellBlockAllocator(Box area, uint32_t nApartmentsX, uint32_t nFloors);
     /**
      * Function that creates building blocks.
-     * \param n the number of blocks to create
+     * @param n the number of blocks to create
      */
     void Create(uint32_t n);
     /// Create function
@@ -71,8 +71,8 @@
     /**
      * Function that checks if the box area is overlapping with some of previously created building
      * blocks.
-     * \param box the area to check
-     * \returns true if there is an overlap
+     * @param box the area to check
+     * @returns true if there is an overlap
      */
     bool OverlapsWithAnyPrevious(Box box);
     Box m_area;                           ///< Area
@@ -160,7 +160,7 @@
 /**
  * Print a list of buildings that can be plotted using Gnuplot.
  *
- * \param filename the output file name.
+ * @param filename the output file name.
  */
 void
 PrintGnuplottableBuildingListToFile(std::string filename)
@@ -185,7 +185,7 @@
 /**
  * Print a list of UEs that can be plotted using Gnuplot.
  *
- * \param filename the output file name.
+ * @param filename the output file name.
  */
 void
 PrintGnuplottableUeListToFile(std::string filename)
@@ -219,7 +219,7 @@
 /**
  * Print a list of ENBs that can be plotted using Gnuplot.
  *
- * \param filename the output file name.
+ * @param filename the output file name.
  */
 void
 PrintGnuplottableEnbListToFile(std::string filename)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/examples/lena-fading.cc ns-3.44/src/lte/examples/lena-fading.cc
--- ns-3.43/src/lte/examples/lena-fading.cc	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/examples/lena-fading.cc	2025-03-09 16:55:49.471371400 -0700
@@ -6,13 +6,13 @@
  * Author: Marco Miozzo <marco.miozzo@cttc.es>
  */
 
+#include "ns3/buildings-helper.h"
 #include "ns3/config-store.h"
 #include "ns3/core-module.h"
 #include "ns3/lte-module.h"
 #include "ns3/mobility-module.h"
 #include "ns3/network-module.h"
-#include <ns3/buildings-helper.h>
-#include <ns3/string.h>
+#include "ns3/string.h"
 
 #include <fstream>
 // #include "ns3/gtk-config-store.h"
@@ -71,7 +71,7 @@
     // - 10,000 samples
     // - 0.5 seconds for window size
     // - 100 RB
-    lteHelper->SetFadingModelAttribute("TraceLength", TimeValue(Seconds(10.0)));
+    lteHelper->SetFadingModelAttribute("TraceLength", TimeValue(Seconds(10)));
     lteHelper->SetFadingModelAttribute("SamplesNum", UintegerValue(10000));
     lteHelper->SetFadingModelAttribute("WindowSize", TimeValue(Seconds(0.5)));
     lteHelper->SetFadingModelAttribute("RbNum", UintegerValue(100));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/examples/lena-frequency-reuse.cc ns-3.44/src/lte/examples/lena-frequency-reuse.cc
--- ns-3.43/src/lte/examples/lena-frequency-reuse.cc	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/examples/lena-frequency-reuse.cc	2025-03-09 16:55:49.471371400 -0700
@@ -7,13 +7,13 @@
  *
  */
 
+#include "ns3/buildings-helper.h"
 #include "ns3/core-module.h"
+#include "ns3/log.h"
 #include "ns3/lte-module.h"
 #include "ns3/mobility-module.h"
 #include "ns3/network-module.h"
-#include <ns3/buildings-helper.h>
-#include <ns3/log.h>
-#include <ns3/spectrum-module.h>
+#include "ns3/spectrum-module.h"
 
 using namespace ns3;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/examples/lena-ipv6-addr-conf.cc ns-3.44/src/lte/examples/lena-ipv6-addr-conf.cc
--- ns-3.43/src/lte/examples/lena-ipv6-addr-conf.cc	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/examples/lena-ipv6-addr-conf.cc	2025-03-09 16:55:49.471371400 -0700
@@ -122,25 +122,25 @@
 
     ApplicationContainer serverApps = echoServer.Install(remoteHost);
 
-    serverApps.Start(Seconds(4.0));
-    serverApps.Stop(Seconds(20.0));
+    serverApps.Start(Seconds(4));
+    serverApps.Stop(Seconds(20));
 
     UdpEchoClientHelper echoClient1(remoteHostAddr, 9);
     UdpEchoClientHelper echoClient2(remoteHostAddr, 9);
 
     echoClient1.SetAttribute("MaxPackets", UintegerValue(1000));
-    echoClient1.SetAttribute("Interval", TimeValue(Seconds(1.0)));
+    echoClient1.SetAttribute("Interval", TimeValue(Seconds(1)));
     echoClient1.SetAttribute("PacketSize", UintegerValue(1024));
 
     echoClient2.SetAttribute("MaxPackets", UintegerValue(1000));
-    echoClient2.SetAttribute("Interval", TimeValue(Seconds(1.0)));
+    echoClient2.SetAttribute("Interval", TimeValue(Seconds(1)));
     echoClient2.SetAttribute("PacketSize", UintegerValue(1024));
 
     ApplicationContainer clientApps1 = echoClient1.Install(ueNodes.Get(0));
     ApplicationContainer clientApps2 = echoClient2.Install(ueNodes.Get(1));
 
-    clientApps1.Start(Seconds(4.0));
-    clientApps1.Stop(Seconds(14.0));
+    clientApps1.Start(Seconds(4));
+    clientApps1.Stop(Seconds(14));
 
     clientApps2.Start(Seconds(4.5));
     clientApps2.Stop(Seconds(14.5));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/examples/lena-ipv6-ue-rh.cc ns-3.44/src/lte/examples/lena-ipv6-ue-rh.cc
--- ns-3.43/src/lte/examples/lena-ipv6-ue-rh.cc	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/examples/lena-ipv6-ue-rh.cc	2025-03-09 16:55:49.471371400 -0700
@@ -120,25 +120,25 @@
 
     ApplicationContainer serverApps = echoServer.Install(remoteHost);
 
-    serverApps.Start(Seconds(1.0));
-    serverApps.Stop(Seconds(20.0));
+    serverApps.Start(Seconds(1));
+    serverApps.Stop(Seconds(20));
 
     UdpEchoClientHelper echoClient1(remoteHostAddr, 9);
     UdpEchoClientHelper echoClient2(remoteHostAddr, 9);
 
     echoClient1.SetAttribute("MaxPackets", UintegerValue(1000));
-    echoClient1.SetAttribute("Interval", TimeValue(Seconds(1.0)));
+    echoClient1.SetAttribute("Interval", TimeValue(Seconds(1)));
     echoClient1.SetAttribute("PacketSize", UintegerValue(1024));
 
     echoClient2.SetAttribute("MaxPackets", UintegerValue(1000));
-    echoClient2.SetAttribute("Interval", TimeValue(Seconds(1.0)));
+    echoClient2.SetAttribute("Interval", TimeValue(Seconds(1)));
     echoClient2.SetAttribute("PacketSize", UintegerValue(1024));
 
     ApplicationContainer clientApps1 = echoClient1.Install(ueNodes.Get(0));
     ApplicationContainer clientApps2 = echoClient2.Install(ueNodes.Get(1));
 
-    clientApps1.Start(Seconds(1.0));
-    clientApps1.Stop(Seconds(14.0));
+    clientApps1.Start(Seconds(1));
+    clientApps1.Stop(Seconds(14));
 
     clientApps2.Start(Seconds(1.5));
     clientApps2.Stop(Seconds(14.5));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/examples/lena-ipv6-ue-ue.cc ns-3.44/src/lte/examples/lena-ipv6-ue-ue.cc
--- ns-3.43/src/lte/examples/lena-ipv6-ue-ue.cc	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/examples/lena-ipv6-ue-ue.cc	2025-03-09 16:55:49.471371400 -0700
@@ -119,25 +119,25 @@
 
     ApplicationContainer serverApps = echoServer.Install(ueNodes.Get(0));
 
-    serverApps.Start(Seconds(1.0));
-    serverApps.Stop(Seconds(20.0));
+    serverApps.Start(Seconds(1));
+    serverApps.Stop(Seconds(20));
 
     UdpEchoClientHelper echoClient1(ueIpIface.GetAddress(0, 1), 9);
     UdpEchoClientHelper echoClient2(ueIpIface.GetAddress(0, 1), 9);
 
     echoClient1.SetAttribute("MaxPackets", UintegerValue(1000));
-    echoClient1.SetAttribute("Interval", TimeValue(Seconds(1.0)));
+    echoClient1.SetAttribute("Interval", TimeValue(Seconds(1)));
     echoClient1.SetAttribute("PacketSize", UintegerValue(1024));
 
     echoClient2.SetAttribute("MaxPackets", UintegerValue(1000));
-    echoClient2.SetAttribute("Interval", TimeValue(Seconds(1.0)));
+    echoClient2.SetAttribute("Interval", TimeValue(Seconds(1)));
     echoClient2.SetAttribute("PacketSize", UintegerValue(1024));
 
     ApplicationContainer clientApps1 = echoClient1.Install(remoteHost);
     ApplicationContainer clientApps2 = echoClient2.Install(ueNodes.Get(1));
 
-    clientApps1.Start(Seconds(1.0));
-    clientApps1.Stop(Seconds(14.0));
+    clientApps1.Start(Seconds(1));
+    clientApps1.Stop(Seconds(14));
 
     clientApps2.Start(Seconds(1.5));
     clientApps2.Stop(Seconds(14.5));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/examples/lena-pathloss-traces.cc ns-3.44/src/lte/examples/lena-pathloss-traces.cc
--- ns-3.43/src/lte/examples/lena-pathloss-traces.cc	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/examples/lena-pathloss-traces.cc	2025-03-09 16:55:49.475371400 -0700
@@ -9,12 +9,12 @@
 
 #include "ns3/config-store.h"
 #include "ns3/core-module.h"
+#include "ns3/log.h"
 #include "ns3/lte-global-pathloss-database.h"
 #include "ns3/lte-module.h"
 #include "ns3/mobility-module.h"
 #include "ns3/network-module.h"
 #include "ns3/radio-bearer-stats-calculator.h"
-#include <ns3/log.h>
 
 #include <iomanip>
 #include <string>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/examples/lena-profiling.cc ns-3.44/src/lte/examples/lena-profiling.cc
--- ns-3.43/src/lte/examples/lena-profiling.cc	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/examples/lena-profiling.cc	2025-03-09 16:55:49.475371400 -0700
@@ -6,12 +6,12 @@
  * Author: Jaume Nin <jnin@cttc.es>
  */
 
+#include "ns3/buildings-module.h"
 #include "ns3/config-store.h"
 #include "ns3/core-module.h"
 #include "ns3/lte-module.h"
 #include "ns3/mobility-module.h"
 #include "ns3/network-module.h"
-#include <ns3/buildings-module.h>
 
 #include <iomanip>
 #include <string>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/examples/lena-radio-link-failure.cc ns-3.44/src/lte/examples/lena-radio-link-failure.cc
--- ns-3.43/src/lte/examples/lena-radio-link-failure.cc	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/examples/lena-radio-link-failure.cc	2025-03-09 16:55:49.475371400 -0700
@@ -25,15 +25,15 @@
 
 // Global values to check the simulation
 // behavior during and after the simulation.
-uint16_t counterN310FirsteNB = 0;        //!< Counter of N310 indications.
-Time t310StartTimeFirstEnb = Seconds(0); //!< Time of first N310 indication.
-uint32_t ByteCounter = 0;                //!< Byte counter.
-uint32_t oldByteCounter = 0;             //!< Old Byte counter,
+uint16_t counterN310FirsteNB = 0; //!< Counter of N310 indications.
+Time t310StartTimeFirstEnb;       //!< Time of first N310 indication.
+uint32_t ByteCounter = 0;         //!< Byte counter.
+uint32_t oldByteCounter = 0;      //!< Old Byte counter,
 
 /**
  * Print the position of a UE with given IMSI.
  *
- * \param imsi The IMSI.
+ * @param imsi The IMSI.
  */
 void
 PrintUePosition(uint64_t imsi)
@@ -61,10 +61,10 @@
 /**
  * UE Notify connection established.
  *
- * \param context The context.
- * \param imsi The IMSI.
- * \param cellid The Cell ID.
- * \param rnti The RNTI.
+ * @param context The context.
+ * @param imsi The IMSI.
+ * @param cellid The Cell ID.
+ * @param rnti The RNTI.
  */
 void
 NotifyConnectionEstablishedUe(std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti)
@@ -76,10 +76,10 @@
 /**
  * eNB Notify connection established.
  *
- * \param context The context.
- * \param imsi The IMSI.
- * \param cellId The Cell ID.
- * \param rnti The RNTI.
+ * @param context The context.
+ * @param imsi The IMSI.
+ * @param cellId The Cell ID.
+ * @param rnti The RNTI.
  */
 void
 NotifyConnectionEstablishedEnb(std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti)
@@ -100,41 +100,14 @@
     }
 }
 
-/// Map each of UE RRC states to its string representation.
-static const std::string g_ueRrcStateName[LteUeRrc::NUM_STATES] = {
-    "IDLE_START",
-    "IDLE_CELL_SEARCH",
-    "IDLE_WAIT_MIB_SIB1",
-    "IDLE_WAIT_MIB",
-    "IDLE_WAIT_SIB1",
-    "IDLE_CAMPED_NORMALLY",
-    "IDLE_WAIT_SIB2",
-    "IDLE_RANDOM_ACCESS",
-    "IDLE_CONNECTING",
-    "CONNECTED_NORMALLY",
-    "CONNECTED_HANDOVER",
-    "CONNECTED_PHY_PROBLEM",
-    "CONNECTED_REESTABLISHING",
-};
-
-/**
- * \param s The UE RRC state.
- * \return The string representation of the given state.
- */
-static const std::string&
-ToString(LteUeRrc::State s)
-{
-    return g_ueRrcStateName[s];
-}
-
 /**
  * UE state transition tracer.
  *
- * \param imsi The IMSI.
- * \param cellId The Cell ID.
- * \param rnti The RNTI.
- * \param oldState The old state.
- * \param newState The new state.
+ * @param imsi The IMSI.
+ * @param cellId The Cell ID.
+ * @param rnti The RNTI.
+ * @param oldState The old state.
+ * @param newState The new state.
  */
 void
 UeStateTransition(uint64_t imsi,
@@ -144,17 +117,17 @@
                   LteUeRrc::State newState)
 {
     std::cout << Simulator::Now().As(Time::S) << " UE with IMSI " << imsi << " RNTI " << rnti
-              << " connected to cell " << cellId << " transitions from " << ToString(oldState)
-              << " to " << ToString(newState) << std::endl;
+              << " connected to cell " << cellId << " transitions from " << oldState << " to "
+              << newState << std::endl;
 }
 
 /**
  * eNB RRC timeout tracer.
  *
- * \param imsi The IMSI.
- * \param rnti The RNTI.
- * \param cellId The Cell ID.
- * \param cause The reason for timeout.
+ * @param imsi The IMSI.
+ * @param rnti The RNTI.
+ * @param cellId The Cell ID.
+ * @param cause The reason for timeout.
  */
 void
 EnbRrcTimeout(uint64_t imsi, uint16_t rnti, uint16_t cellId, std::string cause)
@@ -166,9 +139,9 @@
 /**
  * Notification of connection release at eNB.
  *
- * \param imsi The IMSI.
- * \param cellId The Cell ID.
- * \param rnti The RNTI.
+ * @param imsi The IMSI.
+ * @param cellId The Cell ID.
+ * @param rnti The RNTI.
  */
 void
 NotifyConnectionReleaseAtEnodeB(uint64_t imsi, uint16_t cellId, uint16_t rnti)
@@ -180,12 +153,12 @@
 /**
  * PHY sync detection tracer.
  *
- * \param n310 310 data.
- * \param imsi The IMSI.
- * \param rnti The RNTI.
- * \param cellId The Cell ID.
- * \param type The type.
- * \param count The count.
+ * @param n310 310 data.
+ * @param imsi The IMSI.
+ * @param rnti The RNTI.
+ * @param cellId The Cell ID.
+ * @param type The type.
+ * @param count The count.
  */
 void
 PhySyncDetection(uint16_t n310,
@@ -213,10 +186,10 @@
 /**
  * Radio link failure tracer.
  *
- * \param t310 310 data.
- * \param imsi The IMSI.
- * \param cellId The Cell ID.
- * \param rnti The RNTI.
+ * @param t310 310 data.
+ * @param imsi The IMSI.
+ * @param cellId The Cell ID.
+ * @param rnti The RNTI.
  */
 void
 RadioLinkFailure(Time t310, uint64_t imsi, uint16_t cellId, uint16_t rnti)
@@ -237,9 +210,9 @@
 /**
  * UE Random access error notification.
  *
- * \param imsi The IMSI.
- * \param cellId The Cell ID.
- * \param rnti The RNTI.
+ * @param imsi The IMSI.
+ * @param cellId The Cell ID.
+ * @param rnti The RNTI.
  */
 void
 NotifyRandomAccessErrorUe(uint64_t imsi, uint16_t cellId, uint16_t rnti)
@@ -251,10 +224,10 @@
 /**
  * UE Connection timeout notification.
  *
- * \param imsi The IMSI.
- * \param cellId The Cell ID.
- * \param rnti The RNTI.
- * \param connEstFailCount Connection failure count.
+ * @param imsi The IMSI.
+ * @param cellId The Cell ID.
+ * @param rnti The RNTI.
+ * @param connEstFailCount Connection failure count.
  */
 void
 NotifyConnectionTimeoutUe(uint64_t imsi, uint16_t cellId, uint16_t rnti, uint8_t connEstFailCount)
@@ -267,10 +240,10 @@
 /**
  * UE RA response timeout notification.
  *
- * \param imsi The IMSI.
- * \param contention Contention flag.
- * \param preambleTxCounter Preamble Tx counter.
- * \param maxPreambleTxLimit Max preamble Ts limit.
+ * @param imsi The IMSI.
+ * @param contention Contention flag.
+ * @param preambleTxCounter Preamble Tx counter.
+ * @param maxPreambleTxLimit Max preamble Ts limit.
  */
 void
 NotifyRaResponseTimeoutUe(uint64_t imsi,
@@ -287,7 +260,7 @@
 /**
  * Receive a packet.
  *
- * \param packet The packet.
+ * @param packet The packet.
  */
 void
 ReceivePacket(Ptr<const Packet> packet, const Address&)
@@ -298,9 +271,9 @@
 /**
  * Write the throughput to file.
  *
- * \param firstWrite True if first time writing.
- * \param binSize Bin size.
- * \param fileName Output filename.
+ * @param firstWrite True if first time writing.
+ * @param binSize Bin size.
+ * @param fileName Output filename.
  */
 void
 Throughput(bool firstWrite, Time binSize, std::string fileName)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/examples/lena-rem.cc ns-3.44/src/lte/examples/lena-rem.cc
--- ns-3.43/src/lte/examples/lena-rem.cc	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/examples/lena-rem.cc	2025-03-09 16:55:49.475371400 -0700
@@ -7,13 +7,13 @@
  *         Nicola Baldo <nbaldo@cttc.es>
  */
 
+#include "ns3/buildings-helper.h"
 #include "ns3/config-store.h"
 #include "ns3/core-module.h"
 #include "ns3/lte-module.h"
 #include "ns3/mobility-module.h"
 #include "ns3/network-module.h"
 #include "ns3/spectrum-module.h"
-#include <ns3/buildings-helper.h>
 // #include "ns3/gtk-config-store.h"
 
 using namespace ns3;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/examples/lena-rem-sector-antenna.cc ns-3.44/src/lte/examples/lena-rem-sector-antenna.cc
--- ns-3.43/src/lte/examples/lena-rem-sector-antenna.cc	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/examples/lena-rem-sector-antenna.cc	2025-03-09 16:55:49.475371400 -0700
@@ -6,14 +6,14 @@
  * Author: Jaume Nin <jnin@cttc.es>
  */
 
+#include "ns3/buildings-helper.h"
+#include "ns3/buildings-propagation-loss-model.h"
 #include "ns3/config-store.h"
 #include "ns3/core-module.h"
 #include "ns3/lte-module.h"
 #include "ns3/mobility-module.h"
 #include "ns3/network-module.h"
-#include <ns3/buildings-helper.h>
-#include <ns3/buildings-propagation-loss-model.h>
-#include <ns3/radio-environment-map-helper.h>
+#include "ns3/radio-environment-map-helper.h"
 
 #include <iomanip>
 #include <string>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/examples/lena-simple.cc ns-3.44/src/lte/examples/lena-simple.cc
--- ns-3.43/src/lte/examples/lena-simple.cc	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/examples/lena-simple.cc	2025-03-09 16:55:49.475371400 -0700
@@ -6,12 +6,12 @@
  * Author: Manuel Requena <manuel.requena@cttc.es>
  */
 
+#include "ns3/buildings-helper.h"
 #include "ns3/config-store.h"
 #include "ns3/core-module.h"
 #include "ns3/lte-module.h"
 #include "ns3/mobility-module.h"
 #include "ns3/network-module.h"
-#include <ns3/buildings-helper.h>
 // #include "ns3/gtk-config-store.h"
 
 using namespace ns3;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/examples/lena-uplink-power-control.cc ns-3.44/src/lte/examples/lena-uplink-power-control.cc
--- ns-3.43/src/lte/examples/lena-uplink-power-control.cc	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/examples/lena-uplink-power-control.cc	2025-03-09 16:55:49.475371400 -0700
@@ -7,11 +7,11 @@
  *
  */
 
+#include "ns3/buildings-helper.h"
 #include "ns3/core-module.h"
 #include "ns3/lte-module.h"
 #include "ns3/mobility-module.h"
 #include "ns3/network-module.h"
-#include <ns3/buildings-helper.h>
 
 using namespace ns3;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/examples/lena-x2-handover.cc ns-3.44/src/lte/examples/lena-x2-handover.cc
--- ns-3.43/src/lte/examples/lena-x2-handover.cc	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/examples/lena-x2-handover.cc	2025-03-09 16:55:49.475371400 -0700
@@ -22,10 +22,10 @@
 /**
  * UE Connection established notification.
  *
- * \param context The context.
- * \param imsi The IMSI of the connected terminal.
- * \param cellid The Cell ID.
- * \param rnti The RNTI.
+ * @param context The context.
+ * @param imsi The IMSI of the connected terminal.
+ * @param cellid The Cell ID.
+ * @param rnti The RNTI.
  */
 void
 NotifyConnectionEstablishedUe(std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti)
@@ -37,11 +37,11 @@
 /**
  * UE Start Handover notification.
  *
- * \param context The context.
- * \param imsi The IMSI of the connected terminal.
- * \param cellid The actual Cell ID.
- * \param rnti The RNTI.
- * \param targetCellId The target Cell ID.
+ * @param context The context.
+ * @param imsi The IMSI of the connected terminal.
+ * @param cellid The actual Cell ID.
+ * @param rnti The RNTI.
+ * @param targetCellId The target Cell ID.
  */
 void
 NotifyHandoverStartUe(std::string context,
@@ -58,10 +58,10 @@
 /**
  * UE Handover end successful notification.
  *
- * \param context The context.
- * \param imsi The IMSI of the connected terminal.
- * \param cellid The Cell ID.
- * \param rnti The RNTI.
+ * @param context The context.
+ * @param imsi The IMSI of the connected terminal.
+ * @param cellid The Cell ID.
+ * @param rnti The RNTI.
  */
 void
 NotifyHandoverEndOkUe(std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti)
@@ -73,10 +73,10 @@
 /**
  * eNB Connection established notification.
  *
- * \param context The context.
- * \param imsi The IMSI of the connected terminal.
- * \param cellid The Cell ID.
- * \param rnti The RNTI.
+ * @param context The context.
+ * @param imsi The IMSI of the connected terminal.
+ * @param cellid The Cell ID.
+ * @param rnti The RNTI.
  */
 void
 NotifyConnectionEstablishedEnb(std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti)
@@ -89,11 +89,11 @@
 /**
  * eNB Start Handover notification.
  *
- * \param context The context.
- * \param imsi The IMSI of the connected terminal.
- * \param cellid The actual Cell ID.
- * \param rnti The RNTI.
- * \param targetCellId The target Cell ID.
+ * @param context The context.
+ * @param imsi The IMSI of the connected terminal.
+ * @param cellid The actual Cell ID.
+ * @param rnti The RNTI.
+ * @param targetCellId The target Cell ID.
  */
 void
 NotifyHandoverStartEnb(std::string context,
@@ -110,10 +110,10 @@
 /**
  * eNB Handover end successful notification.
  *
- * \param context The context.
- * \param imsi The IMSI of the connected terminal.
- * \param cellid The Cell ID.
- * \param rnti The RNTI.
+ * @param context The context.
+ * @param imsi The IMSI of the connected terminal.
+ * @param cellid The Cell ID.
+ * @param rnti The RNTI.
  */
 void
 NotifyHandoverEndOkEnb(std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti)
@@ -125,10 +125,10 @@
 /**
  * Handover failure notification
  *
- * \param context The context.
- * \param imsi The IMSI of the connected terminal.
- * \param cellid The Cell ID.
- * \param rnti The RNTI.
+ * @param context The context.
+ * @param imsi The IMSI of the connected terminal.
+ * @param cellid The Cell ID.
+ * @param rnti The RNTI.
  */
 void
 NotifyHandoverFailure(std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/examples/lena-x2-handover-measures.cc ns-3.44/src/lte/examples/lena-x2-handover-measures.cc
--- ns-3.43/src/lte/examples/lena-x2-handover-measures.cc	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/examples/lena-x2-handover-measures.cc	2025-03-09 16:55:49.475371400 -0700
@@ -295,9 +295,9 @@
     lteHelper->EnableRlcTraces();
     lteHelper->EnablePdcpTraces();
     Ptr<RadioBearerStatsCalculator> rlcStats = lteHelper->GetRlcStats();
-    rlcStats->SetAttribute("EpochDuration", TimeValue(Seconds(1.0)));
+    rlcStats->SetAttribute("EpochDuration", TimeValue(Seconds(1)));
     Ptr<RadioBearerStatsCalculator> pdcpStats = lteHelper->GetPdcpStats();
-    pdcpStats->SetAttribute("EpochDuration", TimeValue(Seconds(1.0)));
+    pdcpStats->SetAttribute("EpochDuration", TimeValue(Seconds(1)));
 
     // connect custom trace sinks for RRC connection establishment and handover notification
     Config::Connect("/NodeList/*/DeviceList/*/LteEnbRrc/ConnectionEstablished",
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/helper/cc-helper.cc ns-3.44/src/lte/helper/cc-helper.cc
--- ns-3.43/src/lte/helper/cc-helper.cc	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/helper/cc-helper.cc	2025-03-09 16:55:49.475371400 -0700
@@ -8,13 +8,13 @@
 
 #include "cc-helper.h"
 
-#include <ns3/abort.h>
-#include <ns3/component-carrier.h>
-#include <ns3/log.h>
-#include <ns3/lte-spectrum-value-helper.h>
-#include <ns3/pointer.h>
-#include <ns3/string.h>
-#include <ns3/uinteger.h>
+#include "ns3/abort.h"
+#include "ns3/component-carrier.h"
+#include "ns3/log.h"
+#include "ns3/lte-spectrum-value-helper.h"
+#include "ns3/pointer.h"
+#include "ns3/string.h"
+#include "ns3/uinteger.h"
 
 #include <iostream>
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/helper/cc-helper.h ns-3.44/src/lte/helper/cc-helper.h
--- ns-3.43/src/lte/helper/cc-helper.h	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/helper/cc-helper.h	2025-03-09 16:55:49.475371400 -0700
@@ -9,14 +9,14 @@
 #ifndef CC_HELPER_H
 #define CC_HELPER_H
 
-#include <ns3/component-carrier.h>
-#include <ns3/config.h>
-#include <ns3/names.h>
-#include <ns3/net-device-container.h>
-#include <ns3/net-device.h>
-#include <ns3/node-container.h>
-#include <ns3/node.h>
-#include <ns3/simulator.h>
+#include "ns3/component-carrier.h"
+#include "ns3/config.h"
+#include "ns3/names.h"
+#include "ns3/net-device-container.h"
+#include "ns3/net-device.h"
+#include "ns3/node-container.h"
+#include "ns3/node.h"
+#include "ns3/simulator.h"
 
 #include <map>
 
@@ -24,7 +24,7 @@
 {
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
  * Creation and configuration of Component Carrier entities. One CcHelper instance is
  * typically enough for an LTE simulation. To create it:
@@ -51,7 +51,7 @@
 
     /**
      * Register this type.
-     * \return The object TypeId.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
     void DoDispose() override;
@@ -59,12 +59,12 @@
     /**
      * Create single CC.
      *
-     * \param ulBandwidth the UL bandwidth
-     * \param dlBandwidth the DL bandwidth
-     * \param ulEarfcn the UL EARFCN
-     * \param dlEarfcn the DL EARFCN
-     * \param isPrimary true if primary
-     * \returns the component carrier
+     * @param ulBandwidth the UL bandwidth
+     * @param dlBandwidth the DL bandwidth
+     * @param ulEarfcn the UL EARFCN
+     * @param dlEarfcn the DL EARFCN
+     * @param isPrimary true if primary
+     * @returns the component carrier
      */
     ComponentCarrier DoCreateSingleCc(uint16_t ulBandwidth,
                                       uint16_t dlBandwidth,
@@ -75,8 +75,8 @@
     /**
      * Set an attribute for the Component Carrier to be created.
      *
-     * \param n the name of the attribute.
-     * \param v the value of the attribute
+     * @param n the name of the attribute.
+     * @param v the value of the attribute
      */
     void SetCcAttribute(std::string n, const AttributeValue& v);
 
@@ -91,7 +91,7 @@
      * while they are spaced by exactly the bandwidth. Hence, using this method,
      * you will create a intra-channel Carrier Aggregation scheme.
      *
-     * \returns std::map< uint8_t, Ptr<ComponentCarrier> >
+     * @returns std::map< uint8_t, Ptr<ComponentCarrier> >
      */
 
     std::map<uint8_t, ComponentCarrier> EquallySpacedCcs();
@@ -99,61 +99,61 @@
     /**
      * Set number of CCs.
      *
-     * \param nCc the number of CCs
+     * @param nCc the number of CCs
      */
     void SetNumberOfComponentCarriers(uint16_t nCc);
     /**
      * Set UL EARFCN.
      *
-     * \param ulEarfcn the UL EARFCN
+     * @param ulEarfcn the UL EARFCN
      */
     void SetUlEarfcn(uint32_t ulEarfcn);
     /**
      * Set DL EARFCN.
      *
-     * \param dlEarfcn the DL EARFCN
+     * @param dlEarfcn the DL EARFCN
      */
     void SetDlEarfcn(uint32_t dlEarfcn);
     /**
      * Set DL bandwidth.
      *
-     * \param dlBandwidth the DL bandwidth
+     * @param dlBandwidth the DL bandwidth
      */
     void SetDlBandwidth(uint16_t dlBandwidth);
     /**
      * Set UL bandwidth.
      *
-     * \param ulBandwidth the UL bandwidth
+     * @param ulBandwidth the UL bandwidth
      */
     void SetUlBandwidth(uint16_t ulBandwidth);
     /**
      * Get number of component carriers.
      *
-     * \returns the number of component carriers
+     * @returns the number of component carriers
      */
     uint16_t GetNumberOfComponentCarriers() const;
     /**
      * Get UL EARFCN.
      *
-     * \returns the UL EARFCN
+     * @returns the UL EARFCN
      */
     uint32_t GetUlEarfcn() const;
     /**
      * Get DL EARFCN.
      *
-     * \returns the DL EARFCN
+     * @returns the DL EARFCN
      */
     uint32_t GetDlEarfcn() const;
     /**
      * Get DL bandwidth.
      *
-     * \returns the DL bandwidth
+     * @returns the DL bandwidth
      */
     uint16_t GetDlBandwidth() const;
     /**
      * Get UL bandwidth.
      *
-     * \returns the UL bandwidth
+     * @returns the UL bandwidth
      */
     uint16_t GetUlBandwidth() const;
 
@@ -165,13 +165,13 @@
     /**
      * Create a single component carrier.
      *
-     * \param ulBandwidth uplink bandwidth for the current CC
-     * \param dlBandwidth downlink bandwidth for the current CC
-     * \param ulEarfcn uplink EARFCN - not control on the validity at this point
-     * \param dlEarfcn downlink EARFCN - not control on the validity at this point
-     * \param isPrimary identify if this is the Primary Component Carrier (PCC) - only one
+     * @param ulBandwidth uplink bandwidth for the current CC
+     * @param dlBandwidth downlink bandwidth for the current CC
+     * @param ulEarfcn uplink EARFCN - not control on the validity at this point
+     * @param dlEarfcn downlink EARFCN - not control on the validity at this point
+     * @param isPrimary identify if this is the Primary Component Carrier (PCC) - only one
      * PCC is allowed
-     * \return the component carrier
+     * @return the component carrier
      */
     ComponentCarrier CreateSingleCc(uint16_t ulBandwidth,
                                     uint16_t dlBandwidth,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/helper/emu-epc-helper.h ns-3.44/src/lte/helper/emu-epc-helper.h
--- ns-3.43/src/lte/helper/emu-epc-helper.h	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/helper/emu-epc-helper.h	2025-03-09 16:55:49.475371400 -0700
@@ -18,9 +18,9 @@
 {
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
- * \brief Create an EPC network using EmuFdNetDevice
+ * @brief Create an EPC network using EmuFdNetDevice
  *
  * This Helper will create an EPC network topology comprising of a
  * single node that implements both the SGW and PGW functionality, and
@@ -44,7 +44,7 @@
     // inherited from Object
     /**
      * Register this type.
-     * \return The object TypeId.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/helper/epc-helper.cc ns-3.44/src/lte/helper/epc-helper.cc
--- ns-3.43/src/lte/helper/epc-helper.cc	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/helper/epc-helper.cc	2025-03-09 16:55:49.475371400 -0700
@@ -11,10 +11,10 @@
 
 #include "epc-helper.h"
 
-#include <ns3/ipv4-address.h>
-#include <ns3/ipv6-address.h>
-#include <ns3/log.h>
-#include <ns3/node.h>
+#include "ns3/ipv4-address.h"
+#include "ns3/ipv6-address.h"
+#include "ns3/log.h"
+#include "ns3/node.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/helper/epc-helper.h ns-3.44/src/lte/helper/epc-helper.h
--- ns-3.43/src/lte/helper/epc-helper.h	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/helper/epc-helper.h	2025-03-09 16:55:49.475371400 -0700
@@ -12,12 +12,12 @@
 #ifndef EPC_HELPER_H
 #define EPC_HELPER_H
 
-#include <ns3/data-rate.h>
-#include <ns3/epc-tft.h>
-#include <ns3/eps-bearer.h>
-#include <ns3/ipv4-address-helper.h>
-#include <ns3/ipv6-address-helper.h>
-#include <ns3/object.h>
+#include "ns3/data-rate.h"
+#include "ns3/epc-tft.h"
+#include "ns3/eps-bearer.h"
+#include "ns3/ipv4-address-helper.h"
+#include "ns3/ipv6-address-helper.h"
+#include "ns3/object.h"
 
 namespace ns3
 {
@@ -28,9 +28,9 @@
 class EpcX2;
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
- * \brief Base helper class to handle the creation of the EPC entities.
+ * @brief Base helper class to handle the creation of the EPC entities.
  *
  * This class provides the API for the implementation of helpers that
  * allow to create EPC entities and the nodes and interfaces that host
@@ -52,7 +52,7 @@
     // inherited from Object
     /**
      * Register this type.
-     * \return The object TypeId.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
     void DoDispose() override;
@@ -60,10 +60,10 @@
     /**
      * Add an eNB to the EPC
      *
-     * \param enbNode the previously created eNB node which is to be
+     * @param enbNode the previously created eNB node which is to be
      * added to the EPC
-     * \param lteEnbNetDevice the LteEnbNetDevice of the eNB node
-     * \param cellIds IDs of cells served by this eNB
+     * @param lteEnbNetDevice the LteEnbNetDevice of the eNB node
+     * @param cellIds IDs of cells served by this eNB
      */
     virtual void AddEnb(Ptr<Node> enbNode,
                         Ptr<NetDevice> lteEnbNetDevice,
@@ -72,26 +72,26 @@
     /**
      * Notify the EPC of the existence of a new UE which might attach at a later time
      *
-     * \param ueLteDevice the UE device to be attached
-     * \param imsi the unique identifier of the UE
+     * @param ueLteDevice the UE device to be attached
+     * @param imsi the unique identifier of the UE
      */
     virtual void AddUe(Ptr<NetDevice> ueLteDevice, uint64_t imsi) = 0;
 
     /**
      * Add an X2 interface between two eNB
      *
-     * \param enbNode1 one eNB peer of the X2 interface
-     * \param enbNode2 the other eNB peer of the X2 interface
+     * @param enbNode1 one eNB peer of the X2 interface
+     * @param enbNode2 the other eNB peer of the X2 interface
      */
     virtual void AddX2Interface(Ptr<Node> enbNode1, Ptr<Node> enbNode2) = 0;
 
     /**
      * Add an S1 interface between an eNB and a SGW
      *
-     * \param enb eNB peer of the S1 interface
-     * \param enbAddress eNB IPv4 address of the S1 interface
-     * \param sgwAddress SGW IPv4 address of the S1 interface
-     * \param cellIds cellIds of the eNB
+     * @param enb eNB peer of the S1 interface
+     * @param enbAddress eNB IPv4 address of the S1 interface
+     * @param sgwAddress SGW IPv4 address of the S1 interface
+     * @param cellIds cellIds of the eNB
      */
     virtual void AddS1Interface(Ptr<Node> enb,
                                 Ipv4Address enbAddress,
@@ -103,12 +103,12 @@
      *
      *
      *
-     * \param ueLteDevice the Ipv4-enabled device of the UE, normally
+     * @param ueLteDevice the Ipv4-enabled device of the UE, normally
      * connected via the LTE radio interface
-     * \param imsi the unique identifier of the UE
-     * \param tft the Traffic Flow Template of the new bearer
-     * \param bearer struct describing the characteristics of the EPS bearer to be activated
-     * \return bearer ID
+     * @param imsi the unique identifier of the UE
+     * @param tft the Traffic Flow Template of the new bearer
+     * @param bearer struct describing the characteristics of the EPS bearer to be activated
+     * @return bearer ID
      */
     virtual uint8_t ActivateEpsBearer(Ptr<NetDevice> ueLteDevice,
                                       uint64_t imsi,
@@ -118,14 +118,14 @@
     /**
      * Get the SGW node
      *
-     * \return a pointer to the SGW
+     * @return a pointer to the SGW
      */
     virtual Ptr<Node> GetSgwNode() const = 0;
 
     /**
      * Get the PGW node
      *
-     * \return a pointer to the PGW node
+     * @return a pointer to the PGW node
      * The primary use intended for this method is to allow the user to configure the SGi
      * interface of the PGW, i.e., to connect the PGW to the internet.
      */
@@ -134,38 +134,38 @@
     /**
      * Assign IPv4 addresses to UE devices
      *
-     * \param ueDevices the set of UE devices
+     * @param ueDevices the set of UE devices
      *
-     * \return the interface container, \see Ipv4AddressHelper::Assign() which has similar semantics
+     * @return the interface container, \see Ipv4AddressHelper::Assign() which has similar semantics
      */
     virtual Ipv4InterfaceContainer AssignUeIpv4Address(NetDeviceContainer ueDevices) = 0;
 
     /**
      * Assign IPv6 addresses to UE devices
      *
-     * \param ueDevices the set of UE devices
+     * @param ueDevices the set of UE devices
      *
-     * \return the interface container, \see Ipv6AddressHelper::Assign() which has similar semantics
+     * @return the interface container, \see Ipv6AddressHelper::Assign() which has similar semantics
      */
     virtual Ipv6InterfaceContainer AssignUeIpv6Address(NetDeviceContainer ueDevices) = 0;
 
     /**
      *
-     * \return the IPv4 address of the Default Gateway to be used by UEs to reach the internet
+     * @return the IPv4 address of the Default Gateway to be used by UEs to reach the internet
      */
     virtual Ipv4Address GetUeDefaultGatewayAddress() = 0;
 
     /**
      *
-     * \return the IPv6 address of the Default Gateway to be used by UEs to reach the internet
+     * @return the IPv6 address of the Default Gateway to be used by UEs to reach the internet
      */
     virtual Ipv6Address GetUeDefaultGatewayAddress6() = 0;
 
     /**
      * Assign a fixed random variable stream number to the random variables used.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices (possibly zero) that have been assigned
+     * @param stream first stream index to use
+     * @return the number of stream indices (possibly zero) that have been assigned
      */
     virtual int64_t AssignStreams(int64_t stream) = 0;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/helper/lte-global-pathloss-database.h ns-3.44/src/lte/helper/lte-global-pathloss-database.h
--- ns-3.43/src/lte/helper/lte-global-pathloss-database.h	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/helper/lte-global-pathloss-database.h	2025-03-09 16:55:49.475371400 -0700
@@ -9,8 +9,8 @@
 #ifndef LTE_GLOBAL_PATHLOSS_DATABASE_H
 #define LTE_GLOBAL_PATHLOSS_DATABASE_H
 
-#include <ns3/log.h>
-#include <ns3/ptr.h>
+#include "ns3/log.h"
+#include "ns3/ptr.h"
 
 #include <map>
 #include <string>
@@ -21,7 +21,7 @@
 class SpectrumPhy;
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
  * Store the last pathloss value for each TX-RX pair. This is an
  * example of how the PathlossTrace (provided by some SpectrumChannel
@@ -36,10 +36,10 @@
     /**
      * update the pathloss value
      *
-     * \param context
-     * \param txPhy the transmitting PHY
-     * \param rxPhy the receiving PHY
-     * \param lossDb the loss in dB
+     * @param context
+     * @param txPhy the transmitting PHY
+     * @param rxPhy the receiving PHY
+     * @param lossDb the loss in dB
      */
     virtual void UpdatePathloss(std::string context,
                                 Ptr<const SpectrumPhy> txPhy,
@@ -49,10 +49,10 @@
     /**
      *
      *
-     * \param cellId the id of the eNB
-     * \param imsi the id of the UE
+     * @param cellId the id of the eNB
+     * @param imsi the id of the UE
      *
-     * \return the pathloss value between the UE and the eNB
+     * @return the pathloss value between the UE and the eNB
      */
     double GetPathloss(uint16_t cellId, uint64_t imsi);
 
@@ -71,7 +71,7 @@
 };
 
 /**
- * \ingroup lte
+ * @ingroup lte
  * Store the last pathloss value for each TX-RX pair for downlink
  */
 class DownlinkLteGlobalPathlossDatabase : public LteGlobalPathlossDatabase
@@ -85,7 +85,7 @@
 };
 
 /**
- * \ingroup lte
+ * @ingroup lte
  * Store the last pathloss value for each TX-RX pair for uplink
  */
 class UplinkLteGlobalPathlossDatabase : public LteGlobalPathlossDatabase
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/helper/lte-helper.cc ns-3.44/src/lte/helper/lte-helper.cc
--- ns-3.43/src/lte/helper/lte-helper.cc	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/helper/lte-helper.cc	2025-03-09 16:55:49.479371500 -0700
@@ -18,44 +18,44 @@
 #include "phy-stats-calculator.h"
 #include "phy-tx-stats-calculator.h"
 
-#include <ns3/abort.h>
-#include <ns3/buildings-propagation-loss-model.h>
-#include <ns3/epc-enb-application.h>
-#include <ns3/epc-enb-s1-sap.h>
-#include <ns3/epc-ue-nas.h>
-#include <ns3/epc-x2.h>
-#include <ns3/ff-mac-scheduler.h>
-#include <ns3/friis-spectrum-propagation-loss.h>
-#include <ns3/isotropic-antenna-model.h>
-#include <ns3/log.h>
-#include <ns3/lte-anr.h>
-#include <ns3/lte-chunk-processor.h>
-#include <ns3/lte-common.h>
-#include <ns3/lte-enb-component-carrier-manager.h>
-#include <ns3/lte-enb-mac.h>
-#include <ns3/lte-enb-net-device.h>
-#include <ns3/lte-enb-phy.h>
-#include <ns3/lte-enb-rrc.h>
-#include <ns3/lte-ffr-algorithm.h>
-#include <ns3/lte-handover-algorithm.h>
-#include <ns3/lte-rlc-am.h>
-#include <ns3/lte-rlc-um.h>
-#include <ns3/lte-rlc.h>
-#include <ns3/lte-rrc-protocol-ideal.h>
-#include <ns3/lte-rrc-protocol-real.h>
-#include <ns3/lte-spectrum-phy.h>
-#include <ns3/lte-spectrum-value-helper.h>
-#include <ns3/lte-ue-component-carrier-manager.h>
-#include <ns3/lte-ue-mac.h>
-#include <ns3/lte-ue-net-device.h>
-#include <ns3/lte-ue-phy.h>
-#include <ns3/lte-ue-rrc.h>
-#include <ns3/multi-model-spectrum-channel.h>
-#include <ns3/object-factory.h>
-#include <ns3/object-map.h>
-#include <ns3/pointer.h>
-#include <ns3/string.h>
-#include <ns3/trace-fading-loss-model.h>
+#include "ns3/abort.h"
+#include "ns3/buildings-propagation-loss-model.h"
+#include "ns3/epc-enb-application.h"
+#include "ns3/epc-enb-s1-sap.h"
+#include "ns3/epc-ue-nas.h"
+#include "ns3/epc-x2.h"
+#include "ns3/ff-mac-scheduler.h"
+#include "ns3/friis-spectrum-propagation-loss.h"
+#include "ns3/isotropic-antenna-model.h"
+#include "ns3/log.h"
+#include "ns3/lte-anr.h"
+#include "ns3/lte-chunk-processor.h"
+#include "ns3/lte-common.h"
+#include "ns3/lte-enb-component-carrier-manager.h"
+#include "ns3/lte-enb-mac.h"
+#include "ns3/lte-enb-net-device.h"
+#include "ns3/lte-enb-phy.h"
+#include "ns3/lte-enb-rrc.h"
+#include "ns3/lte-ffr-algorithm.h"
+#include "ns3/lte-handover-algorithm.h"
+#include "ns3/lte-rlc-am.h"
+#include "ns3/lte-rlc-um.h"
+#include "ns3/lte-rlc.h"
+#include "ns3/lte-rrc-protocol-ideal.h"
+#include "ns3/lte-rrc-protocol-real.h"
+#include "ns3/lte-spectrum-phy.h"
+#include "ns3/lte-spectrum-value-helper.h"
+#include "ns3/lte-ue-component-carrier-manager.h"
+#include "ns3/lte-ue-mac.h"
+#include "ns3/lte-ue-net-device.h"
+#include "ns3/lte-ue-phy.h"
+#include "ns3/lte-ue-rrc.h"
+#include "ns3/multi-model-spectrum-channel.h"
+#include "ns3/object-factory.h"
+#include "ns3/object-map.h"
+#include "ns3/pointer.h"
+#include "ns3/string.h"
+#include "ns3/trace-fading-loss-model.h"
 
 #include <iostream>
 
@@ -1166,7 +1166,7 @@
 }
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
  * DrbActivatior allows user to activate bearers for UEs
  * when EPC is not used. Activation function is hooked to
@@ -1180,8 +1180,8 @@
     /**
      * DrbActivator Constructor
      *
-     * \param ueDevice the UeNetDevice for which bearer will be activated
-     * \param bearer the bearer configuration
+     * @param ueDevice the UeNetDevice for which bearer will be activated
+     * @param bearer the bearer configuration
      */
     DrbActivator(Ptr<NetDevice> ueDevice, EpsBearer bearer);
 
@@ -1189,11 +1189,11 @@
      * Function hooked to the Enb RRC Connection Established trace source
      * Fired upon successful RRC connection establishment.
      *
-     * \param a DrbActivator object
-     * \param context
-     * \param imsi
-     * \param cellId
-     * \param rnti
+     * @param a DrbActivator object
+     * @param context
+     * @param imsi
+     * @param cellId
+     * @param rnti
      */
     static void ActivateCallback(Ptr<DrbActivator> a,
                                  std::string context,
@@ -1207,9 +1207,9 @@
      * in RRC connected state. If all requirements are met, it performs
      * bearer activation.
      *
-     * \param imsi
-     * \param cellId
-     * \param rnti
+     * @param imsi
+     * @param cellId
+     * @param rnti
      */
     void ActivateDrb(uint64_t imsi, uint16_t cellId, uint16_t rnti);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/helper/lte-helper.h ns-3.44/src/lte/helper/lte-helper.h
--- ns-3.43/src/lte/helper/lte-helper.h	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/helper/lte-helper.h	2025-03-09 16:55:49.479371500 -0700
@@ -18,17 +18,17 @@
 #include "radio-bearer-stats-calculator.h"
 #include "radio-bearer-stats-connector.h"
 
-#include <ns3/component-carrier-enb.h>
-#include <ns3/config.h>
-#include <ns3/epc-tft.h>
-#include <ns3/eps-bearer.h>
-#include <ns3/mobility-model.h>
-#include <ns3/names.h>
-#include <ns3/net-device-container.h>
-#include <ns3/net-device.h>
-#include <ns3/node-container.h>
-#include <ns3/node.h>
-#include <ns3/simulator.h>
+#include "ns3/component-carrier-enb.h"
+#include "ns3/config.h"
+#include "ns3/epc-tft.h"
+#include "ns3/eps-bearer.h"
+#include "ns3/mobility-model.h"
+#include "ns3/names.h"
+#include "ns3/net-device-container.h"
+#include "ns3/net-device.h"
+#include "ns3/node-container.h"
+#include "ns3/node.h"
+#include "ns3/simulator.h"
 
 #include <map>
 
@@ -43,7 +43,7 @@
 class SpectrumPropagationLossModel;
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
  * Creation and configuration of LTE entities. One LteHelper instance is
  * typically enough for an LTE simulation. To create it:
@@ -96,7 +96,7 @@
 
     /**
      * Register this type.
-     * \return The object TypeId.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
     void DoDispose() override;
@@ -105,21 +105,21 @@
      * Set the EpcHelper to be used to setup the EPC network in
      * conjunction with the setup of the LTE radio access network.
      *
-     * \note if no EpcHelper is ever set, then LteHelper will default
+     * @note if no EpcHelper is ever set, then LteHelper will default
      * to creating an LTE-only simulation with no EPC, using LteRlcSm as
      * the RLC model, and without supporting any IP networking. In other
      * words, it will be a radio-level simulation involving only LTE PHY
      * and MAC and the FF Scheduler, with a saturation traffic model for
      * the RLC.
      *
-     * \param h a pointer to the EpcHelper to be used
+     * @param h a pointer to the EpcHelper to be used
      */
     void SetEpcHelper(Ptr<EpcHelper> h);
 
     /**
      * Set the type of path loss model to be used for both DL and UL channels.
      *
-     * \param type type of path loss model, must be a type name of any class
+     * @param type type of path loss model, must be a type name of any class
      *             inheriting from ns3::PropagationLossModel, for example:
      *             "ns3::FriisPropagationLossModel"
      */
@@ -128,15 +128,15 @@
     /**
      * Set an attribute for the path loss models to be created.
      *
-     * \param n the name of the attribute
-     * \param v the value of the attribute
+     * @param n the name of the attribute
+     * @param v the value of the attribute
      */
     void SetPathlossModelAttribute(std::string n, const AttributeValue& v);
 
     /**
      * Set the type of scheduler to be used by eNodeB devices.
      *
-     * \param type type of scheduler, must be a type name of any class
+     * @param type type of scheduler, must be a type name of any class
      *             inheriting from ns3::FfMacScheduler, for example:
      *             "ns3::PfFfMacScheduler"
      *
@@ -146,22 +146,22 @@
 
     /**
      *
-     * \return the scheduler type
+     * @return the scheduler type
      */
     std::string GetSchedulerType() const;
 
     /**
      * Set an attribute for the scheduler to be created.
      *
-     * \param n the name of the attribute
-     * \param v the value of the attribute
+     * @param n the name of the attribute
+     * @param v the value of the attribute
      */
     void SetSchedulerAttribute(std::string n, const AttributeValue& v);
 
     /**
      * Set the type of FFR algorithm to be used by eNodeB devices.
      *
-     * \param type type of FFR algorithm, must be a type name of any class
+     * @param type type of FFR algorithm, must be a type name of any class
      *             inheriting from ns3::LteFfrAlgorithm, for example:
      *             "ns3::LteFrNoOpAlgorithm"
      *
@@ -171,22 +171,22 @@
 
     /**
      *
-     * \return the FFR algorithm type
+     * @return the FFR algorithm type
      */
     std::string GetFfrAlgorithmType() const;
 
     /**
      * Set an attribute for the FFR algorithm to be created.
      *
-     * \param n the name of the attribute
-     * \param v the value of the attribute
+     * @param n the name of the attribute
+     * @param v the value of the attribute
      */
     void SetFfrAlgorithmAttribute(std::string n, const AttributeValue& v);
 
     /**
      * Set the type of handover algorithm to be used by eNodeB devices.
      *
-     * \param type type of handover algorithm, must be a type name of any class
+     * @param type type of handover algorithm, must be a type name of any class
      *             inheriting from ns3::LteHandoverAlgorithm, for example:
      *             "ns3::NoOpHandoverAlgorithm"
      *
@@ -196,30 +196,30 @@
 
     /**
      *
-     * \return the handover algorithm type
+     * @return the handover algorithm type
      */
     std::string GetHandoverAlgorithmType() const;
 
     /**
      * Set an attribute for the handover algorithm to be created.
      *
-     * \param n the name of the attribute
-     * \param v the value of the attribute
+     * @param n the name of the attribute
+     * @param v the value of the attribute
      */
     void SetHandoverAlgorithmAttribute(std::string n, const AttributeValue& v);
 
     /**
      * Set an attribute for the eNodeB devices (LteEnbNetDevice) to be created.
      *
-     * \param n the name of the attribute.
-     * \param v the value of the attribute
+     * @param n the name of the attribute.
+     * @param v the value of the attribute
      */
     void SetEnbDeviceAttribute(std::string n, const AttributeValue& v);
 
     /**
      * Set the type of antenna model to be used by eNodeB devices.
      *
-     * \param type type of antenna model, must be a type name of any class
+     * @param type type of antenna model, must be a type name of any class
      *             inheriting from ns3::AntennaModel, for example:
      *             "ns3::IsotropicAntennaModel"
      */
@@ -228,23 +228,23 @@
     /**
      * Set an attribute for the eNodeB antenna model to be created.
      *
-     * \param n the name of the attribute.
-     * \param v the value of the attribute
+     * @param n the name of the attribute.
+     * @param v the value of the attribute
      */
     void SetEnbAntennaModelAttribute(std::string n, const AttributeValue& v);
 
     /**
      * Set an attribute for the UE devices (LteUeNetDevice) to be created.
      *
-     * \param n the name of the attribute.
-     * \param v the value of the attribute
+     * @param n the name of the attribute.
+     * @param v the value of the attribute
      */
     void SetUeDeviceAttribute(std::string n, const AttributeValue& v);
 
     /**
      * Set the type of antenna model to be used by UE devices.
      *
-     * \param type type of antenna model, must be a type name of any class
+     * @param type type of antenna model, must be a type name of any class
      *             inheriting from ns3::AntennaModel, for example:
      *             "ns3::IsotropicAntennaModel"
      */
@@ -253,15 +253,15 @@
     /**
      * Set an attribute for the UE antenna model to be created.
      *
-     * \param n the name of the attribute
-     * \param v the value of the attribute
+     * @param n the name of the attribute
+     * @param v the value of the attribute
      */
     void SetUeAntennaModelAttribute(std::string n, const AttributeValue& v);
 
     /**
      * Set the type of spectrum channel to be used in both DL and UL.
      *
-     * \param type type of spectrum channel model, must be a type name of any
+     * @param type type of spectrum channel model, must be a type name of any
      *             class inheriting from ns3::SpectrumChannel, for example:
      *             "ns3::MultiModelSpectrumChannel"
      */
@@ -270,75 +270,75 @@
     /**
      * Set an attribute for the spectrum channel to be created (both DL and UL).
      *
-     * \param n the name of the attribute
-     * \param v the value of the attribute
+     * @param n the name of the attribute
+     * @param v the value of the attribute
      */
     void SetSpectrumChannelAttribute(std::string n, const AttributeValue& v);
 
     /**
      * Set the type of carrier component algorithm to be used by eNodeB devices.
      *
-     * \param type type of carrier component manager
+     * @param type type of carrier component manager
      *
      */
     void SetEnbComponentCarrierManagerType(std::string type);
 
     /**
      *
-     * \return the carrier enb component carrier manager type
+     * @return the carrier enb component carrier manager type
      */
     std::string GetEnbComponentCarrierManagerType() const;
 
     /**
      * Set an attribute for the enb component carrier manager to be created.
      *
-     * \param n the name of the attribute
-     * \param v the value of the attribute
+     * @param n the name of the attribute
+     * @param v the value of the attribute
      */
     void SetEnbComponentCarrierManagerAttribute(std::string n, const AttributeValue& v);
 
     /**
      * Set the type of Component Carrier Manager to be used by Ue devices.
      *
-     * \param type type of UE Component Carrier Manager
+     * @param type type of UE Component Carrier Manager
      *
      */
     void SetUeComponentCarrierManagerType(std::string type);
 
     /**
      *
-     * \return the carrier ue component carrier manager type
+     * @return the carrier ue component carrier manager type
      */
     std::string GetUeComponentCarrierManagerType() const;
 
     /**
      * Set an attribute for the ue component carrier manager to be created.
      *
-     * \param n the name of the attribute
-     * \param v the value of the attribute
+     * @param n the name of the attribute
+     * @param v the value of the attribute
      */
     void SetUeComponentCarrierManagerAttribute(std::string n, const AttributeValue& v);
 
     /**
      * Create a set of eNodeB devices.
      *
-     * \param c the node container where the devices are to be installed
-     * \return the NetDeviceContainer with the newly created devices
+     * @param c the node container where the devices are to be installed
+     * @return the NetDeviceContainer with the newly created devices
      */
     NetDeviceContainer InstallEnbDevice(NodeContainer c);
 
     /**
      * Create a set of UE devices.
      *
-     * \param c the node container where the devices are to be installed
-     * \return the NetDeviceContainer with the newly created devices
+     * @param c the node container where the devices are to be installed
+     * @return the NetDeviceContainer with the newly created devices
      */
     NetDeviceContainer InstallUeDevice(NodeContainer c);
 
     /**
-     * \brief Enables automatic attachment of a set of UE devices to a suitable
+     * @brief Enables automatic attachment of a set of UE devices to a suitable
      *        cell using Idle mode initial cell selection procedure.
-     * \param ueDevices the set of UE devices to be attached
+     * @param ueDevices the set of UE devices to be attached
      *
      * By calling this, the UE will start the initial cell selection procedure at
      * the beginning of simulation. In addition, the function also instructs each
@@ -355,9 +355,9 @@
     void Attach(NetDeviceContainer ueDevices);
 
     /**
-     * \brief Enables automatic attachment of a UE device to a suitable cell
+     * @brief Enables automatic attachment of a UE device to a suitable cell
      *        using Idle mode initial cell selection procedure.
-     * \param ueDevice the UE device to be attached
+     * @param ueDevice the UE device to be attached
      *
      * By calling this, the UE will start the initial cell selection procedure at
      * the beginning of simulation. In addition, the function also instructs the
@@ -374,10 +374,10 @@
     void Attach(Ptr<NetDevice> ueDevice);
 
     /**
-     * \brief Manual attachment of a set of UE devices to the network via a given
+     * @brief Manual attachment of a set of UE devices to the network via a given
      *        eNodeB.
-     * \param ueDevices the set of UE devices to be attached
-     * \param enbDevice the destination eNodeB device
+     * @param ueDevices the set of UE devices to be attached
+     * @param enbDevice the destination eNodeB device
      *
      * In addition, the function also instructs each UE to immediately enter
      * CONNECTED mode and activates the default EPS bearer.
@@ -389,10 +389,10 @@
     void Attach(NetDeviceContainer ueDevices, Ptr<NetDevice> enbDevice);
 
     /**
-     * \brief Manual attachment of a UE device to the network via a given eNodeB.
-     * \param ueDevice the UE device to be attached
-     * \param enbDevice the destination eNodeB device
-     * \param componentCarrierId the destination eNodeB component carrier
+     * @brief Manual attachment of a UE device to the network via a given eNodeB.
+     * @param ueDevice the UE device to be attached
+     * @param enbDevice the destination eNodeB device
+     * @param componentCarrierId the destination eNodeB component carrier
      *
      * In addition, the function also instructs the UE to immediately enter
      * CONNECTED mode and activates the default EPS bearer.
@@ -404,10 +404,10 @@
     void Attach(Ptr<NetDevice> ueDevice, Ptr<NetDevice> enbDevice, uint8_t componentCarrierId = 0);
 
     /**
-     * \brief Manual attachment of a set of UE devices to the network via the
+     * @brief Manual attachment of a set of UE devices to the network via the
      *        closest eNodeB (with respect to distance) among those in the set.
-     * \param ueDevices the set of UE devices to be attached
-     * \param enbDevices the set of eNodeB devices to be considered
+     * @param ueDevices the set of UE devices to be attached
+     * @param enbDevices the set of eNodeB devices to be considered
      *
      * This function finds among the eNodeB set the closest eNodeB for each UE,
      * and then invokes manual attachment between the pair.
@@ -420,10 +420,10 @@
     void AttachToClosestEnb(NetDeviceContainer ueDevices, NetDeviceContainer enbDevices);
 
     /**
-     * \brief Manual attachment of a UE device to the network via the closest
+     * @brief Manual attachment of a UE device to the network via the closest
      *        eNodeB (with respect to distance) among those in the set.
-     * \param ueDevice the UE device to be attached
-     * \param enbDevices the set of eNodeB devices to be considered
+     * @param ueDevice the UE device to be attached
+     * @param enbDevices the set of eNodeB devices to be considered
      *
      * This function finds among the eNodeB set the closest eNodeB for the UE,
      * and then invokes manual attachment between the pair.
@@ -438,10 +438,10 @@
     /**
      * Activate a dedicated EPS bearer on a given set of UE devices.
      *
-     * \param ueDevices the set of UE devices
-     * \param bearer the characteristics of the bearer to be activated
-     * \param tft the Traffic Flow Template that identifies the traffic to go on this bearer
-     * \returns bearer ID
+     * @param ueDevices the set of UE devices
+     * @param bearer the characteristics of the bearer to be activated
+     * @param tft the Traffic Flow Template that identifies the traffic to go on this bearer
+     * @returns bearer ID
      */
     uint8_t ActivateDedicatedEpsBearer(NetDeviceContainer ueDevices,
                                        EpsBearer bearer,
@@ -450,21 +450,21 @@
     /**
      * Activate a dedicated EPS bearer on a given UE device.
      *
-     * \param ueDevice the UE device
-     * \param bearer the characteristics of the bearer to be activated
-     * \param tft the Traffic Flow Template that identifies the traffic to go on this bearer.
-     * \returns bearer ID
+     * @param ueDevice the UE device
+     * @param bearer the characteristics of the bearer to be activated
+     * @param tft the Traffic Flow Template that identifies the traffic to go on this bearer.
+     * @returns bearer ID
      */
     uint8_t ActivateDedicatedEpsBearer(Ptr<NetDevice> ueDevice, EpsBearer bearer, Ptr<EpcTft> tft);
 
     /**
-     * \brief Manually trigger dedicated bearer de-activation at specific simulation time
-     * \param ueDevice the UE on which dedicated bearer to be de-activated must be of the type
+     * @brief Manually trigger dedicated bearer de-activation at specific simulation time
+     * @param ueDevice the UE on which dedicated bearer to be de-activated must be of the type
      * LteUeNetDevice
-     * \param enbDevice eNB, must be of the type LteEnbNetDevice
-     * \param bearerId Bearer Identity which is to be de-activated
+     * @param enbDevice eNB, must be of the type LteEnbNetDevice
+     * @param bearerId Bearer Identity which is to be de-activated
      *
-     * \warning Requires the use of EPC mode. See SetEpcHelper() method.
+     * @warning Requires the use of EPC mode. See SetEpcHelper() method.
      */
 
     void DeActivateDedicatedEpsBearer(Ptr<NetDevice> ueDevice,
@@ -473,30 +473,30 @@
     /**
      * Create an X2 interface between all the eNBs in a given set.
      *
-     * \param enbNodes the set of eNB nodes
+     * @param enbNodes the set of eNB nodes
      */
     void AddX2Interface(NodeContainer enbNodes);
 
     /**
      * Create an X2 interface between two eNBs.
      *
-     * \param enbNode1 one eNB of the X2 interface
-     * \param enbNode2 the other eNB of the X2 interface
+     * @param enbNode1 one eNB of the X2 interface
+     * @param enbNode2 the other eNB of the X2 interface
      */
     void AddX2Interface(Ptr<Node> enbNode1, Ptr<Node> enbNode2);
 
     /**
      * Manually trigger an X2-based handover.
      *
-     * \param hoTime when the handover shall be initiated
-     * \param ueDev the UE that hands off, must be of the type LteUeNetDevice
-     * \param sourceEnbDev source eNB, must be of the type LteEnbNetDevice
+     * @param hoTime when the handover shall be initiated
+     * @param ueDev the UE that hands off, must be of the type LteUeNetDevice
+     * @param sourceEnbDev source eNB, must be of the type LteEnbNetDevice
      *                     (originally the UE is attached to this eNB)
-     * \param targetEnbDev target eNB, must be of the type LteEnbNetDevice
+     * @param targetEnbDev target eNB, must be of the type LteEnbNetDevice
      *                     (the UE would be connected to this eNB after the
      *                     handover)
      *
-     * \warning Requires the use of EPC mode. See SetEpcHelper() method
+     * @warning Requires the use of EPC mode. See SetEpcHelper() method
      */
     void HandoverRequest(Time hoTime,
                          Ptr<NetDevice> ueDev,
@@ -506,14 +506,14 @@
     /**
      * Manually trigger an X2-based handover.
      *
-     * \param hoTime when the handover shall be initiated
-     * \param ueDev the UE that hands off, must be of the type LteUeNetDevice
-     * \param sourceEnbDev source eNB, must be of the type LteEnbNetDevice
+     * @param hoTime when the handover shall be initiated
+     * @param ueDev the UE that hands off, must be of the type LteUeNetDevice
+     * @param sourceEnbDev source eNB, must be of the type LteEnbNetDevice
      *                     (originally the UE is attached to this eNB)
-     * \param targetCellId target CellId (the UE primary component carrier will
+     * @param targetCellId target CellId (the UE primary component carrier will
      *                     be connected to this cell after the handover)
      *
-     * \warning Requires the use of EPC mode. See SetEpcHelper() method
+     * @warning Requires the use of EPC mode. See SetEpcHelper() method
      */
     void HandoverRequest(Time hoTime,
                          Ptr<NetDevice> ueDev,
@@ -523,8 +523,8 @@
     /**
      * Activate a Data Radio Bearer on a given UE devices (for LTE-only simulation).
      *
-     * \param ueDevices the set of UE devices
-     * \param bearer the characteristics of the bearer to be activated
+     * @param ueDevices the set of UE devices
+     * @param bearer the characteristics of the bearer to be activated
      */
     void ActivateDataRadioBearer(NetDeviceContainer ueDevices, EpsBearer bearer);
 
@@ -533,15 +533,15 @@
      * This method will schedule the actual activation
      * the bearer so that it happens after the UE got connected.
      *
-     * \param ueDevice the UE device
-     * \param bearer the characteristics of the bearer to be activated
+     * @param ueDevice the UE device
+     * @param bearer the characteristics of the bearer to be activated
      */
     void ActivateDataRadioBearer(Ptr<NetDevice> ueDevice, EpsBearer bearer);
 
     /**
      * Set the type of fading model to be used in both DL and UL.
      *
-     * \param type type of fading model, must be a type name of any class
+     * @param type type of fading model, must be a type name of any class
      *             inheriting from ns3::SpectrumPropagationLossModel, for
      *             example: "ns3::TraceFadingLossModel"
      */
@@ -550,8 +550,8 @@
     /**
      * Set an attribute for the fading model to be created (both DL and UL).
      *
-     * \param n the name of the attribute
-     * \param v the value of the attribute
+     * @param n the name of the attribute
+     * @param v the value of the attribute
      */
     void SetFadingModelAttribute(std::string n, const AttributeValue& v);
 
@@ -624,7 +624,7 @@
 
     /**
      *
-     * \return the RLC stats calculator object
+     * @return the RLC stats calculator object
      */
     Ptr<RadioBearerStatsCalculator> GetRlcStats();
 
@@ -635,7 +635,7 @@
 
     /**
      *
-     * \return the PDCP stats calculator object
+     * @return the PDCP stats calculator object
      */
     Ptr<RadioBearerStatsCalculator> GetPdcpStats();
 
@@ -651,20 +651,20 @@
      * If an EPC has been configured, streams will be assigned on the EPC
      * nodes as well via EpcHelper::AssignStreams ().
      *
-     * \param c NetDeviceContainer of the set of net devices for which the
+     * @param c NetDeviceContainer of the set of net devices for which the
      *          LteNetDevice should be modified to use a fixed stream
-     * \param stream first stream index to use
-     * \return the number of stream indices (possibly zero) that have been assigned
+     * @param stream first stream index to use
+     * @return the number of stream indices (possibly zero) that have been assigned
      */
     int64_t AssignStreams(NetDeviceContainer c, int64_t stream);
 
     /**
-     * \return a pointer to the SpectrumChannel instance used for the uplink
+     * @return a pointer to the SpectrumChannel instance used for the uplink
      */
     Ptr<SpectrumChannel> GetUplinkSpectrumChannel() const;
 
     /**
-     * \return a pointer to the SpectrumChannel instance used for the downlink
+     * @return a pointer to the SpectrumChannel instance used for the downlink
      */
     Ptr<SpectrumChannel> GetDownlinkSpectrumChannel() const;
 
@@ -676,10 +676,10 @@
     /**
      * Configure the component carriers
      *
-     * \param ulEarfcn uplink EARFCN
-     * \param dlEarfcn downlink EARFCN
-     * \param ulbw uplink bandwidth for each CC
-     * \param dlbw downlink bandwidth for each CC
+     * @param ulEarfcn uplink EARFCN
+     * @param dlEarfcn downlink EARFCN
+     * @param ulbw uplink bandwidth for each CC
+     * @param dlbw downlink bandwidth for each CC
      */
     void DoComponentCarrierConfigure(uint32_t ulEarfcn,
                                      uint32_t dlEarfcn,
@@ -687,24 +687,24 @@
                                      uint16_t dlbw);
     /**
      * Create an eNodeB device (LteEnbNetDevice) on the given node.
-     * \param n the node where the device is to be installed
-     * \return pointer to the created device
+     * @param n the node where the device is to be installed
+     * @return pointer to the created device
      */
     Ptr<NetDevice> InstallSingleEnbDevice(Ptr<Node> n);
 
     /**
      * Create a UE device (LteUeNetDevice) on the given node
-     * \param n the node where the device is to be installed
-     * \return pointer to the created device
+     * @param n the node where the device is to be installed
+     * @return pointer to the created device
      */
     Ptr<NetDevice> InstallSingleUeDevice(Ptr<Node> n);
 
     /**
      * The actual function to trigger a manual handover.
-     * \param ueDev the UE that hands off, must be of the type LteUeNetDevice
-     * \param sourceEnbDev source eNB, must be of the type LteEnbNetDevice
+     * @param ueDev the UE that hands off, must be of the type LteUeNetDevice
+     * @param sourceEnbDev source eNB, must be of the type LteEnbNetDevice
      *                     (originally the UE is attached to this eNB)
-     * \param targetCellId target CellId (the UE primary component carrier will
+     * @param targetCellId target CellId (the UE primary component carrier will
      *                     be connected to this cell after the handover)
      *
      * This method is normally scheduled by HandoverRequest() to run at a specific
@@ -715,10 +715,10 @@
                            uint16_t targetCellId);
 
     /**
-     * \brief The actual function to trigger a manual bearer de-activation
-     * \param ueDevice the UE on which bearer to be de-activated must be of the type LteUeNetDevice
-     * \param enbDevice eNB, must be of the type LteEnbNetDevice
-     * \param bearerId Bearer Identity which is to be de-activated
+     * @brief The actual function to trigger a manual bearer de-activation
+     * @param ueDevice the UE on which bearer to be de-activated must be of the type LteUeNetDevice
+     * @param enbDevice eNB, must be of the type LteEnbNetDevice
+     * @param bearerId Bearer Identity which is to be de-activated
      *
      * This method is normally scheduled by DeActivateDedicatedEpsBearer() to run at a specific
      * time when a manual bearer de-activation is desired by the simulation user.
@@ -731,7 +731,7 @@
     void ChannelModelInitialization();
 
     /**
-     * \brief This function create the component carrier based on provided configuration parameters
+     * @brief This function create the component carrier based on provided configuration parameters
      */
 
     /// The downlink LTE channel used in the simulation.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/helper/lte-hex-grid-enb-topology-helper.cc ns-3.44/src/lte/helper/lte-hex-grid-enb-topology-helper.cc
--- ns-3.43/src/lte/helper/lte-hex-grid-enb-topology-helper.cc	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/helper/lte-hex-grid-enb-topology-helper.cc	2025-03-09 16:55:49.479371500 -0700
@@ -10,10 +10,10 @@
 
 #include "epc-helper.h"
 
-#include <ns3/abort.h>
-#include <ns3/double.h>
-#include <ns3/log.h>
-#include <ns3/pointer.h>
+#include "ns3/abort.h"
+#include "ns3/double.h"
+#include "ns3/log.h"
+#include "ns3/pointer.h"
 
 #include <iostream>
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/helper/lte-hex-grid-enb-topology-helper.h ns-3.44/src/lte/helper/lte-hex-grid-enb-topology-helper.h
--- ns-3.43/src/lte/helper/lte-hex-grid-enb-topology-helper.h	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/helper/lte-hex-grid-enb-topology-helper.h	2025-03-09 16:55:49.479371500 -0700
@@ -15,7 +15,7 @@
 {
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
  * This helper class allows to easily create a topology with eNBs
  * grouped in three-sector sites laid out on an hexagonal grid. The
@@ -30,7 +30,7 @@
 
     /**
      * Register this type.
-     * \return The object TypeId.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
     void DoDispose() override;
@@ -38,14 +38,14 @@
     /**
      * Set the LteHelper to be used to actually create the EnbNetDevices
      *
-     * \note if no EpcHelper is ever set, then LteHexGridEnbTopologyHelper will default
+     * @note if no EpcHelper is ever set, then LteHexGridEnbTopologyHelper will default
      * to creating an LTE-only simulation with no EPC, using LteRlcSm as
      * the RLC model, and without supporting any IP networking. In other
      * words, it will be a radio-level simulation involving only LTE PHY
      * and MAC and the FF Scheduler, with a saturation traffic model for
      * the RLC.
      *
-     * \param h a pointer to the EpcHelper to be used
+     * @param h a pointer to the EpcHelper to be used
      */
     void SetLteHelper(Ptr<LteHelper> h);
 
@@ -53,9 +53,9 @@
      * Position the nodes on a hex grid and install the corresponding
      * EnbNetDevices with antenna boresight configured properly
      *
-     * \param c the node container where the devices are to be installed
+     * @param c the node container where the devices are to be installed
      *
-     * \return the NetDeviceContainer with the newly created devices
+     * @return the NetDeviceContainer with the newly created devices
      */
     NetDeviceContainer SetPositionAndInstallEnbDevice(NodeContainer c);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/helper/lte-stats-calculator.cc ns-3.44/src/lte/helper/lte-stats-calculator.cc
--- ns-3.43/src/lte/helper/lte-stats-calculator.cc	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/helper/lte-stats-calculator.cc	2025-03-09 16:55:49.479371500 -0700
@@ -8,12 +8,12 @@
 
 #include "lte-stats-calculator.h"
 
-#include <ns3/config.h>
-#include <ns3/log.h>
-#include <ns3/lte-enb-net-device.h>
-#include <ns3/lte-enb-rrc.h>
-#include <ns3/lte-ue-net-device.h>
-#include <ns3/lte-ue-rrc.h>
+#include "ns3/config.h"
+#include "ns3/log.h"
+#include "ns3/lte-enb-net-device.h"
+#include "ns3/lte-enb-rrc.h"
+#include "ns3/lte-ue-net-device.h"
+#include "ns3/lte-ue-rrc.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/helper/lte-stats-calculator.h ns-3.44/src/lte/helper/lte-stats-calculator.h
--- ns-3.43/src/lte/helper/lte-stats-calculator.h	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/helper/lte-stats-calculator.h	2025-03-09 16:55:49.479371500 -0700
@@ -18,7 +18,7 @@
 {
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
  * Base class for ***StatsCalculator classes. Provides
  * basic functionality to parse and store IMSI and CellId.
@@ -40,14 +40,14 @@
 
     /**
      * Register this type.
-     * \return The object TypeId.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
     /**
      * Set the name of the file where the uplink statistics will be stored.
      *
-     * \param outputFilename string with the name of the file
+     * @param outputFilename string with the name of the file
      */
     void SetUlOutputFilename(std::string outputFilename);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/helper/mac-stats-calculator.cc ns-3.44/src/lte/helper/mac-stats-calculator.cc
--- ns-3.43/src/lte/helper/mac-stats-calculator.cc	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/helper/mac-stats-calculator.cc	2025-03-09 16:55:49.479371500 -0700
@@ -10,9 +10,9 @@
 
 #include "mac-stats-calculator.h"
 
+#include "ns3/log.h"
+#include "ns3/simulator.h"
 #include "ns3/string.h"
-#include <ns3/log.h>
-#include <ns3/simulator.h>
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/helper/mac-stats-calculator.h ns-3.44/src/lte/helper/mac-stats-calculator.h
--- ns-3.43/src/lte/helper/mac-stats-calculator.h	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/helper/mac-stats-calculator.h	2025-03-09 16:55:49.479371500 -0700
@@ -24,7 +24,7 @@
 {
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
  * Takes care of storing the information generated at MAC layer. Metrics saved are:
  *   - Timestamp (in seconds)
@@ -52,14 +52,14 @@
     // Inherited from ns3::Object
     /**
      * Register this type.
-     * \return The object TypeId.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
     /**
      * Set the name of the file where the uplink statistics will be stored.
      *
-     * \param outputFilename string with the name of the file
+     * @param outputFilename string with the name of the file
      */
     void SetUlOutputFilename(std::string outputFilename);
 
@@ -124,9 +124,9 @@
     /**
      * Trace sink for the ns3::LteEnbMac::DlScheduling trace source
      *
-     * \param macStats
-     * \param path
-     * \param dlSchedulingCallbackInfo DlSchedulingCallbackInfo structure containing all downlink
+     * @param macStats
+     * @param path
+     * @param dlSchedulingCallbackInfo DlSchedulingCallbackInfo structure containing all downlink
      * information that is generated what DlScheduling traces is fired
      */
     static void DlSchedulingCallback(Ptr<MacStatsCalculator> macStats,
@@ -136,14 +136,14 @@
     /**
      * Trace sink for the ns3::LteEnbMac::UlScheduling trace source
      *
-     * \param macStats
-     * \param path
-     * \param frameNo
-     * \param subframeNo
-     * \param rnti
-     * \param mcs
-     * \param size
-     * \param componentCarrierId
+     * @param macStats
+     * @param path
+     * @param frameNo
+     * @param subframeNo
+     * @param rnti
+     * @param mcs
+     * @param size
+     * @param componentCarrierId
      */
     static void UlSchedulingCallback(Ptr<MacStatsCalculator> macStats,
                                      std::string path,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/helper/no-backhaul-epc-helper.cc ns-3.44/src/lte/helper/no-backhaul-epc-helper.cc
--- ns-3.43/src/lte/helper/no-backhaul-epc-helper.cc	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/helper/no-backhaul-epc-helper.cc	2025-03-09 16:55:49.479371500 -0700
@@ -37,11 +37,11 @@
 NoBackhaulEpcHelper::NoBackhaulEpcHelper()
     : m_gtpuUdpPort(2152), // fixed by the standard
       m_s11LinkDataRate(DataRate("10Gb/s")),
-      m_s11LinkDelay(Seconds(0)),
+      m_s11LinkDelay(),
       m_s11LinkMtu(3000),
       m_gtpcUdpPort(2123), // fixed by the standard
       m_s5LinkDataRate(DataRate("10Gb/s")),
-      m_s5LinkDelay(Seconds(0)),
+      m_s5LinkDelay(),
       m_s5LinkMtu(3000)
 {
     NS_LOG_FUNCTION(this);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/helper/no-backhaul-epc-helper.h ns-3.44/src/lte/helper/no-backhaul-epc-helper.h
--- ns-3.43/src/lte/helper/no-backhaul-epc-helper.h	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/helper/no-backhaul-epc-helper.h	2025-03-09 16:55:49.479371500 -0700
@@ -20,8 +20,8 @@
 class EpcMmeApplication;
 
 /**
- * \ingroup lte
- * \brief Create an EPC network with PointToPoint links between the core network nodes.
+ * @ingroup lte
+ * @brief Create an EPC network with PointToPoint links between the core network nodes.
  *
  * This Helper will create an EPC network topology comprising of
  * three nodes: SGW, PGW and MME.
@@ -48,7 +48,7 @@
     // inherited from Object
     /**
      * Register this type.
-     * \return The object TypeId.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -78,14 +78,14 @@
 
   protected:
     /**
-     * \brief DoAddX2Interface: Call AddX2Interface on top of the Enb device pointers
+     * @brief DoAddX2Interface: Call AddX2Interface on top of the Enb device pointers
      *
-     * \param enb1X2 EPCX2 of ENB1
-     * \param enb1LteDev LTE device of ENB1
-     * \param enb1X2Address Address for ENB1
-     * \param enb2X2 EPCX2 of ENB2
-     * \param enb2LteDev LTE device of ENB2
-     * \param enb2X2Address Address for ENB2
+     * @param enb1X2 EPCX2 of ENB1
+     * @param enb1LteDev LTE device of ENB1
+     * @param enb1X2Address Address for ENB1
+     * @param enb2X2 EPCX2 of ENB2
+     * @param enb2LteDev LTE device of ENB2
+     * @param enb2X2Address Address for ENB2
      */
     virtual void DoAddX2Interface(const Ptr<EpcX2>& enb1X2,
                                   const Ptr<NetDevice>& enb1LteDev,
@@ -95,10 +95,10 @@
                                   const Ipv4Address& enb2X2Address) const;
 
     /**
-     * \brief DoActivateEpsBearerForUe: Schedule ActivateEpsBearer on the UE
-     * \param ueDevice LTE device for the UE
-     * \param tft TFT
-     * \param bearer Bearer
+     * @brief DoActivateEpsBearerForUe: Schedule ActivateEpsBearer on the UE
+     * @param ueDevice LTE device for the UE
+     * @param tft TFT
+     * @param bearer Bearer
      */
     virtual void DoActivateEpsBearerForUe(const Ptr<NetDevice>& ueDevice,
                                           const Ptr<EpcTft>& tft,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/helper/phy-rx-stats-calculator.cc ns-3.44/src/lte/helper/phy-rx-stats-calculator.cc
--- ns-3.43/src/lte/helper/phy-rx-stats-calculator.cc	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/helper/phy-rx-stats-calculator.cc	2025-03-09 16:55:49.479371500 -0700
@@ -10,9 +10,9 @@
 
 #include "phy-rx-stats-calculator.h"
 
+#include "ns3/log.h"
+#include "ns3/simulator.h"
 #include "ns3/string.h"
-#include <ns3/log.h>
-#include <ns3/simulator.h>
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/helper/phy-rx-stats-calculator.h ns-3.44/src/lte/helper/phy-rx-stats-calculator.h
--- ns-3.43/src/lte/helper/phy-rx-stats-calculator.h	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/helper/phy-rx-stats-calculator.h	2025-03-09 16:55:49.479371500 -0700
@@ -13,9 +13,9 @@
 
 #include "lte-stats-calculator.h"
 
+#include "ns3/lte-common.h"
 #include "ns3/nstime.h"
 #include "ns3/uinteger.h"
-#include <ns3/lte-common.h>
 
 #include <fstream>
 #include <string>
@@ -24,7 +24,7 @@
 {
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
  * Takes care of storing the information generated at PHY layer regarding
  * reception. Metrics saved are:
@@ -54,14 +54,14 @@
     // Inherited from ns3::Object
     /**
      * Register this type.
-     * \return The object TypeId.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
     /**
      * Set the name of the file where the UL Rx PHY statistics will be stored.
      *
-     * \param outputFilename string with the name of the file
+     * @param outputFilename string with the name of the file
      */
     void SetUlRxOutputFilename(std::string outputFilename);
 
@@ -99,9 +99,9 @@
     /**
      * trace sink
      *
-     * \param phyRxStats
-     * \param path
-     * \param params
+     * @param phyRxStats
+     * @param path
+     * @param params
      */
     static void DlPhyReceptionCallback(Ptr<PhyRxStatsCalculator> phyRxStats,
                                        std::string path,
@@ -110,9 +110,9 @@
     /**
      * trace sink
      *
-     * \param phyRxStats
-     * \param path
-     * \param params
+     * @param phyRxStats
+     * @param path
+     * @param params
      */
     static void UlPhyReceptionCallback(Ptr<PhyRxStatsCalculator> phyRxStats,
                                        std::string path,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/helper/phy-stats-calculator.cc ns-3.44/src/lte/helper/phy-stats-calculator.cc
--- ns-3.43/src/lte/helper/phy-stats-calculator.cc	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/helper/phy-stats-calculator.cc	2025-03-09 16:55:49.479371500 -0700
@@ -10,9 +10,9 @@
 
 #include "phy-stats-calculator.h"
 
+#include "ns3/log.h"
+#include "ns3/simulator.h"
 #include "ns3/string.h"
-#include <ns3/log.h>
-#include <ns3/simulator.h>
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/helper/phy-stats-calculator.h ns-3.44/src/lte/helper/phy-stats-calculator.h
--- ns-3.43/src/lte/helper/phy-stats-calculator.h	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/helper/phy-stats-calculator.h	2025-03-09 16:55:49.479371500 -0700
@@ -22,7 +22,7 @@
 {
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
  * Takes care of storing the information generated at PHY layer. Metrics saved are:
  * - RSRP and average SINR for DL
@@ -144,13 +144,13 @@
     /**
      * trace sink
      *
-     * \param phyStats
-     * \param path
-     * \param cellId
-     * \param rnti
-     * \param rsrp
-     * \param sinr
-     * \param componentCarrierId
+     * @param phyStats
+     * @param path
+     * @param cellId
+     * @param rnti
+     * @param rsrp
+     * @param sinr
+     * @param componentCarrierId
      */
     static void ReportCurrentCellRsrpSinrCallback(Ptr<PhyStatsCalculator> phyStats,
                                                   std::string path,
@@ -163,12 +163,12 @@
     /**
      * trace sink
      *
-     * \param phyStats
-     * \param path
-     * \param cellId
-     * \param rnti
-     * \param sinrLinear
-     * \param componentCarrierId
+     * @param phyStats
+     * @param path
+     * @param cellId
+     * @param rnti
+     * @param sinrLinear
+     * @param componentCarrierId
      */
     static void ReportUeSinr(Ptr<PhyStatsCalculator> phyStats,
                              std::string path,
@@ -180,10 +180,10 @@
     /**
      * trace sink
      *
-     * \param phyStats
-     * \param path
-     * \param cellId
-     * \param interference
+     * @param phyStats
+     * @param path
+     * @param cellId
+     * @param interference
      */
     static void ReportInterference(Ptr<PhyStatsCalculator> phyStats,
                                    std::string path,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/helper/phy-tx-stats-calculator.cc ns-3.44/src/lte/helper/phy-tx-stats-calculator.cc
--- ns-3.43/src/lte/helper/phy-tx-stats-calculator.cc	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/helper/phy-tx-stats-calculator.cc	2025-03-09 16:55:49.479371500 -0700
@@ -10,9 +10,9 @@
 
 #include "phy-tx-stats-calculator.h"
 
+#include "ns3/log.h"
+#include "ns3/simulator.h"
 #include "ns3/string.h"
-#include <ns3/log.h>
-#include <ns3/simulator.h>
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/helper/phy-tx-stats-calculator.h ns-3.44/src/lte/helper/phy-tx-stats-calculator.h
--- ns-3.43/src/lte/helper/phy-tx-stats-calculator.h	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/helper/phy-tx-stats-calculator.h	2025-03-09 16:55:49.479371500 -0700
@@ -13,9 +13,9 @@
 
 #include "lte-stats-calculator.h"
 
+#include "ns3/lte-common.h"
 #include "ns3/nstime.h"
 #include "ns3/uinteger.h"
-#include <ns3/lte-common.h>
 
 #include <fstream>
 #include <string>
@@ -24,7 +24,7 @@
 {
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
  * Takes care of storing the information generated at PHY layer regarding
  * transmission. Metrics saved are:
@@ -54,7 +54,7 @@
     // Inherited from ns3::Object
     /**
      * Register this type.
-     * \return The object TypeId.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
@@ -99,9 +99,9 @@
     /**
      * trace sink
      *
-     * \param phyTxStats
-     * \param path
-     * \param params
+     * @param phyTxStats
+     * @param path
+     * @param params
      */
     static void DlPhyTransmissionCallback(Ptr<PhyTxStatsCalculator> phyTxStats,
                                           std::string path,
@@ -110,9 +110,9 @@
     /**
      * trace sink
      *
-     * \param phyTxStats
-     * \param path
-     * \param params
+     * @param phyTxStats
+     * @param path
+     * @param params
      */
     static void UlPhyTransmissionCallback(Ptr<PhyTxStatsCalculator> phyTxStats,
                                           std::string path,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/helper/point-to-point-epc-helper.h ns-3.44/src/lte/helper/point-to-point-epc-helper.h
--- ns-3.43/src/lte/helper/point-to-point-epc-helper.h	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/helper/point-to-point-epc-helper.h	2025-03-09 16:55:49.479371500 -0700
@@ -19,8 +19,8 @@
 {
 
 /**
- * \ingroup lte
- * \brief Create an EPC network with PointToPoint links in the backhaul network.
+ * @ingroup lte
+ * @brief Create an EPC network with PointToPoint links in the backhaul network.
  *
  * This Helper extends NoBackhaulEpcHelper creating PointToPoint links in the
  * backhaul network (i.e. in the S1-U and S1-MME interfaces)
@@ -41,7 +41,7 @@
     // inherited from Object
     /**
      * Register this type.
-     * \return The object TypeId.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/helper/radio-bearer-stats-calculator.cc ns-3.44/src/lte/helper/radio-bearer-stats-calculator.cc
--- ns-3.43/src/lte/helper/radio-bearer-stats-calculator.cc	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/helper/radio-bearer-stats-calculator.cc	2025-03-09 16:55:49.479371500 -0700
@@ -9,9 +9,9 @@
 
 #include "radio-bearer-stats-calculator.h"
 
+#include "ns3/log.h"
 #include "ns3/nstime.h"
 #include "ns3/string.h"
-#include <ns3/log.h>
 
 #include <algorithm>
 #include <vector>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/helper/radio-bearer-stats-calculator.h ns-3.44/src/lte/helper/radio-bearer-stats-calculator.h
--- ns-3.43/src/lte/helper/radio-bearer-stats-calculator.h	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/helper/radio-bearer-stats-calculator.h	2025-03-09 16:55:49.479371500 -0700
@@ -37,7 +37,7 @@
 typedef std::map<ImsiLcidPair_t, LteFlowId_t> FlowIdMap;
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
  * This class is an ns-3 trace sink that performs the calculation of
  * PDU statistics for uplink and downlink. Statistics are generated
@@ -66,7 +66,7 @@
 
     /**
      * Class constructor
-     * \param protocolType the name of the protocol type
+     * @param protocolType the name of the protocol type
      */
     RadioBearerStatsCalculator(std::string protocolType);
 
@@ -79,7 +79,7 @@
     // Inherited from ns3::Object
     /**
      * Register this type.
-     * \return The object TypeId.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
     void DoDispose() override;
@@ -124,25 +124,25 @@
 
     /**
      *
-     * \param t the value of the StartTime attribute
+     * @param t the value of the StartTime attribute
      */
     void SetStartTime(Time t);
 
     /**
      *
-     * \return the value of the StartTime attribute
+     * @return the value of the StartTime attribute
      */
     Time GetStartTime() const;
 
     /**
      *
-     * \param e the epoch duration
+     * @param e the epoch duration
      */
     void SetEpoch(Time e);
 
     /**
      *
-     * \return the epoch duration
+     * @return the epoch duration
      */
     Time GetEpoch() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/helper/radio-bearer-stats-connector.cc ns-3.44/src/lte/helper/radio-bearer-stats-connector.cc
--- ns-3.43/src/lte/helper/radio-bearer-stats-connector.cc	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/helper/radio-bearer-stats-connector.cc	2025-03-09 16:55:49.479371500 -0700
@@ -45,11 +45,11 @@
 
 /**
  * Callback function for DL TX statistics for both RLC and PDCP
- * \param arg
- * \param path
- * \param rnti
- * \param lcid
- * \param packetSize
+ * @param arg
+ * @param path
+ * @param rnti
+ * @param lcid
+ * @param packetSize
  */
 void
 DlTxPduCallback(Ptr<BoundCallbackArgument> arg,
@@ -64,12 +64,12 @@
 
 /**
  * Callback function for DL RX statistics for both RLC and PDCP
- * \param arg
- * \param path
- * \param rnti
- * \param lcid
- * \param packetSize
- * \param delay
+ * @param arg
+ * @param path
+ * @param rnti
+ * @param lcid
+ * @param packetSize
+ * @param delay
  */
 void
 DlRxPduCallback(Ptr<BoundCallbackArgument> arg,
@@ -85,11 +85,11 @@
 
 /**
  * Callback function for UL TX statistics for both RLC and PDCP
- * \param arg
- * \param path
- * \param rnti
- * \param lcid
- * \param packetSize
+ * @param arg
+ * @param path
+ * @param rnti
+ * @param lcid
+ * @param packetSize
  */
 void
 UlTxPduCallback(Ptr<BoundCallbackArgument> arg,
@@ -104,12 +104,12 @@
 
 /**
  * Callback function for UL RX statistics for both RLC and PDCP
- * \param arg
- * \param path
- * \param rnti
- * \param lcid
- * \param packetSize
- * \param delay
+ * @param arg
+ * @param path
+ * @param rnti
+ * @param lcid
+ * @param packetSize
+ * @param delay
  */
 void
 UlRxPduCallback(Ptr<BoundCallbackArgument> arg,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/helper/radio-bearer-stats-connector.h ns-3.44/src/lte/helper/radio-bearer-stats-connector.h
--- ns-3.43/src/lte/helper/radio-bearer-stats-connector.h	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/helper/radio-bearer-stats-connector.h	2025-03-09 16:55:49.479371500 -0700
@@ -24,7 +24,7 @@
 class RadioBearerStatsCalculator;
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
  * This class is very useful when user needs to collect
  * statistics from PDCP and RLC. It automatically connects
@@ -43,14 +43,14 @@
     /**
      * Enables trace sinks for RLC layer. Usually, this function
      * is called by LteHelper::EnableRlcTraces().
-     * \param rlcStats statistics calculator for RLC layer
+     * @param rlcStats statistics calculator for RLC layer
      */
     void EnableRlcStats(Ptr<RadioBearerStatsCalculator> rlcStats);
 
     /**
      * Enables trace sinks for PDCP layer. Usually, this function
      * is called by LteHelper::EnablePdcpTraces().
-     * \param pdcpStats statistics calculator for PDCP layer
+     * @param pdcpStats statistics calculator for PDCP layer
      */
     void EnablePdcpStats(Ptr<RadioBearerStatsCalculator> pdcpStats);
 
@@ -66,10 +66,10 @@
      * which is fired upon creation of a new UE context.
      * It stores the UE manager path and connects the callback that will be called
      * when the DRB is created in the eNB.
-     * \param c
-     * \param context
-     * \param cellid
-     * \param rnti
+     * @param c
+     * @param context
+     * @param cellid
+     * @param rnti
      */
     static void NotifyNewUeContextEnb(RadioBearerStatsConnector* c,
                                       std::string context,
@@ -80,11 +80,11 @@
      * Function hooked to RandomAccessSuccessful trace source at UE RRC,
      * which is fired upon successful completion of the random access procedure.
      * It connects the callbacks for the SRB0 at the eNB and the UE.
-     * \param c
-     * \param context
-     * \param imsi
-     * \param cellid
-     * \param rnti
+     * @param c
+     * @param context
+     * @param imsi
+     * @param cellid
+     * @param rnti
      */
     static void NotifyRandomAccessSuccessfulUe(RadioBearerStatsConnector* c,
                                                std::string context,
@@ -96,11 +96,11 @@
      * Function hooked to Srb1Created trace source at UE RRC,
      * which is fired when SRB1 is created, i.e. RLC and PDCP are created for one LC = 1.
      * It connects the callbacks for the DRB at the eNB.
-     * \param c
-     * \param context
-     * \param imsi
-     * \param cellid
-     * \param rnti
+     * @param c
+     * @param context
+     * @param imsi
+     * @param cellid
+     * @param rnti
      */
     static void CreatedSrb1Ue(RadioBearerStatsConnector* c,
                               std::string context,
@@ -112,12 +112,12 @@
      * Function hooked to DrbCreated trace source at UE manager in eNB RRC,
      * which is fired when DRB is created, i.e. RLC and PDCP are created for LC = lcid.
      * It connects the callbacks for the DRB at the eNB.
-     * \param c
-     * \param context
-     * \param imsi
-     * \param cellid
-     * \param rnti
-     * \param lcid
+     * @param c
+     * @param context
+     * @param imsi
+     * @param cellid
+     * @param rnti
+     * @param lcid
      */
     static void CreatedDrbEnb(RadioBearerStatsConnector* c,
                               std::string context,
@@ -130,12 +130,12 @@
      * Function hooked to DrbCreated trace source at UE RRC,
      * which is fired when DRB is created, i.e. RLC and PDCP are created for LC = lcid.
      * It connects the callbacks for the DRB at the UE.
-     * \param c
-     * \param context
-     * \param imsi
-     * \param cellid
-     * \param rnti
-     * \param lcid
+     * @param c
+     * @param context
+     * @param imsi
+     * @param cellid
+     * @param rnti
+     * @param lcid
      */
     static void CreatedDrbUe(RadioBearerStatsConnector* c,
                              std::string context,
@@ -147,57 +147,57 @@
     /**
      * Disconnects all trace sources at eNB to RLC and PDCP calculators.
      * Function is not implemented.
-     * \param context
-     * \param imsi
-     * \param cellid
-     * \param rnti
+     * @param context
+     * @param imsi
+     * @param cellid
+     * @param rnti
      */
     void DisconnectTracesEnb(std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti);
 
     /**
      * Disconnects all trace sources at UE to RLC and PDCP calculators.
      * Function is not implemented.
-     * \param context
-     * \param imsi
-     * \param cellid
-     * \param rnti
+     * @param context
+     * @param imsi
+     * @param cellid
+     * @param rnti
      */
     void DisconnectTracesUe(std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti);
 
   private:
     /**
      * Creates UE Manager path and stores it in m_ueManagerPathByCellIdRnti
-     * \param ueManagerPath
-     * \param cellId
-     * \param rnti
+     * @param ueManagerPath
+     * @param cellId
+     * @param rnti
      */
     void StoreUeManagerPath(std::string ueManagerPath, uint16_t cellId, uint16_t rnti);
 
     /**
      * Connects SRB0 trace sources at UE and eNB to RLC and PDCP calculators
-     * \param context
-     * \param imsi
-     * \param cellId
-     * \param rnti
+     * @param context
+     * @param imsi
+     * @param cellId
+     * @param rnti
      */
     void ConnectTracesSrb0(std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti);
 
     /**
      * Connects SRB1 trace sources at UE and eNB to RLC and PDCP calculators
-     * \param context
-     * \param imsi
-     * \param cellId
-     * \param rnti
+     * @param context
+     * @param imsi
+     * @param cellId
+     * @param rnti
      */
     void ConnectTracesSrb1(std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti);
 
     /**
      * Connects DRB trace sources at eNB to RLC and PDCP calculators
-     * \param context
-     * \param imsi
-     * \param cellId
-     * \param rnti
-     * \param lcid
+     * @param context
+     * @param imsi
+     * @param cellId
+     * @param rnti
+     * @param lcid
      */
     void ConnectTracesDrbEnb(std::string context,
                              uint64_t imsi,
@@ -207,11 +207,11 @@
 
     /**
      * Connects DRB trace sources at UE to RLC and PDCP calculators
-     * \param context
-     * \param imsi
-     * \param cellId
-     * \param rnti
-     * \param lcid
+     * @param context
+     * @param imsi
+     * @param cellId
+     * @param rnti
+     * @param lcid
      */
     void ConnectTracesDrbUe(std::string context,
                             uint64_t imsi,
@@ -236,9 +236,9 @@
     /**
      * Less than operator for CellIdRnti, because it is used as key in map
      *
-     * \param a the lhs operand
-     * \param b the rhs operand
-     * \returns true if less than
+     * @param a the lhs operand
+     * @param b the rhs operand
+     * @returns true if less than
      */
     friend bool operator<(const CellIdRnti& a, const CellIdRnti& b);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/helper/radio-environment-map-helper.cc ns-3.44/src/lte/helper/radio-environment-map-helper.cc
--- ns-3.43/src/lte/helper/radio-environment-map-helper.cc	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/helper/radio-environment-map-helper.cc	2025-03-09 16:55:49.479371500 -0700
@@ -8,23 +8,23 @@
 
 #include "radio-environment-map-helper.h"
 
-#include <ns3/abort.h>
-#include <ns3/boolean.h>
-#include <ns3/buildings-helper.h>
-#include <ns3/config.h>
-#include <ns3/constant-position-mobility-model.h>
-#include <ns3/double.h>
-#include <ns3/integer.h>
-#include <ns3/log.h>
-#include <ns3/lte-spectrum-value-helper.h>
-#include <ns3/mobility-building-info.h>
-#include <ns3/node.h>
-#include <ns3/pointer.h>
-#include <ns3/rem-spectrum-phy.h>
-#include <ns3/simulator.h>
-#include <ns3/spectrum-channel.h>
-#include <ns3/string.h>
-#include <ns3/uinteger.h>
+#include "ns3/abort.h"
+#include "ns3/boolean.h"
+#include "ns3/buildings-helper.h"
+#include "ns3/config.h"
+#include "ns3/constant-position-mobility-model.h"
+#include "ns3/double.h"
+#include "ns3/integer.h"
+#include "ns3/log.h"
+#include "ns3/lte-spectrum-value-helper.h"
+#include "ns3/mobility-building-info.h"
+#include "ns3/node.h"
+#include "ns3/pointer.h"
+#include "ns3/rem-spectrum-phy.h"
+#include "ns3/simulator.h"
+#include "ns3/spectrum-channel.h"
+#include "ns3/string.h"
+#include "ns3/uinteger.h"
 
 #include <fstream>
 #include <limits>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/helper/radio-environment-map-helper.h ns-3.44/src/lte/helper/radio-environment-map-helper.h
--- ns-3.43/src/lte/helper/radio-environment-map-helper.h	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/helper/radio-environment-map-helper.h	2025-03-09 16:55:49.479371500 -0700
@@ -9,7 +9,7 @@
 #ifndef RADIO_ENVIRONMENT_MAP_HELPER_H
 #define RADIO_ENVIRONMENT_MAP_HELPER_H
 
-#include <ns3/object.h>
+#include "ns3/object.h"
 
 #include <fstream>
 
@@ -24,7 +24,7 @@
 class MobilityModel;
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
  * Generates a 2D map of the SINR from the strongest transmitter in the
  * downlink of an LTE FDD system. For instructions on usage, please refer to
@@ -40,18 +40,18 @@
     void DoDispose() override;
     /**
      * Register this type.
-     * \return The object TypeId.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
     /**
-     * \return the bandwidth (in num of RBs) over which SINR is calculated
+     * @return the bandwidth (in num of RBs) over which SINR is calculated
      */
     uint16_t GetBandwidth() const;
 
     /**
      *
-     * \param bw  the bandwidth (in num of RBs) over which SINR is calculated
+     * @param bw  the bandwidth (in num of RBs) over which SINR is calculated
      */
     void SetBandwidth(uint16_t bw);
 
@@ -80,10 +80,10 @@
      * Mobilize all the listeners to a specified area. Afterwards, schedule a
      * call to PrintAndReset() in 0.5 milliseconds.
      *
-     * \param xMin X coordinate of the first SINR listening point to deploy.
-     * \param xMax X coordinate of the last SINR listening point to deploy.
-     * \param yMin Y coordinate of the first SINR listening point to deploy.
-     * \param yMax Y coordinate of the last SINR listening point to deploy.
+     * @param xMin X coordinate of the first SINR listening point to deploy.
+     * @param xMax X coordinate of the last SINR listening point to deploy.
+     * @param yMin Y coordinate of the first SINR listening point to deploy.
+     * @param yMax Y coordinate of the last SINR listening point to deploy.
      */
     void RunOneIteration(double xMin, double xMax, double yMin, double yMax);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/a2-a4-rsrq-handover-algorithm.cc ns-3.44/src/lte/model/a2-a4-rsrq-handover-algorithm.cc
--- ns-3.43/src/lte/model/a2-a4-rsrq-handover-algorithm.cc	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/model/a2-a4-rsrq-handover-algorithm.cc	2025-03-09 16:55:49.479371500 -0700
@@ -15,8 +15,8 @@
 
 #include "a2-a4-rsrq-handover-algorithm.h"
 
-#include <ns3/log.h>
-#include <ns3/uinteger.h>
+#include "ns3/log.h"
+#include "ns3/uinteger.h"
 
 #include <algorithm>
 
@@ -213,7 +213,7 @@
     NS_LOG_FUNCTION(this << cellId);
 
     /**
-     * \todo In the future, this function can be expanded to validate whether the
+     * @todo In the future, this function can be expanded to validate whether the
      *       neighbour cell is a valid target cell, e.g., taking into account the
      *       NRT in ANR and whether it is a CSG cell with closed access.
      */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/a2-a4-rsrq-handover-algorithm.h ns-3.44/src/lte/model/a2-a4-rsrq-handover-algorithm.h
--- ns-3.43/src/lte/model/a2-a4-rsrq-handover-algorithm.h	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/model/a2-a4-rsrq-handover-algorithm.h	2025-03-09 16:55:49.479371500 -0700
@@ -20,8 +20,8 @@
 #include "lte-handover-management-sap.h"
 #include "lte-rrc-sap.h"
 
-#include <ns3/ptr.h>
-#include <ns3/simple-ref-count.h>
+#include "ns3/ptr.h"
+#include "ns3/simple-ref-count.h"
 
 #include <map>
 
@@ -29,7 +29,7 @@
 {
 
 /**
- * \brief Handover algorithm implementation based on RSRQ measurements, Event
+ * @brief Handover algorithm implementation based on RSRQ measurements, Event
  *        A2 and Event A4.
  *
  * Handover decision made by this algorithm is primarily based on Event A2
@@ -63,7 +63,7 @@
  *                                               UintegerValue (1));
  *     NetDeviceContainer enbLteDevs = lteHelper->InstallEnbDevice (enbNodes);
  *
- * \note Setting the handover algorithm type and attributes after the call to
+ * @note Setting the handover algorithm type and attributes after the call to
  *       LteHelper::InstallEnbDevice does not have any effect to the devices
  *       that have already been installed.
  */
@@ -76,8 +76,8 @@
     ~A2A4RsrqHandoverAlgorithm() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -100,8 +100,8 @@
     /**
      * Called when Event A2 is detected, then trigger a handover if needed.
      *
-     * \param rnti The RNTI of the UE who reported the event.
-     * \param servingCellRsrq The RSRQ of this cell as reported by the UE.
+     * @param rnti The RNTI of the UE who reported the event.
+     * @param servingCellRsrq The RSRQ of this cell as reported by the UE.
      */
     void EvaluateHandover(uint16_t rnti, uint8_t servingCellRsrq);
 
@@ -109,8 +109,8 @@
      * Determines if a neighbour cell is a valid destination for handover.
      * Currently always return true.
      *
-     * \param cellId The cell ID of the neighbour cell.
-     * \return True if the cell is a valid destination for handover.
+     * @param cellId The cell ID of the neighbour cell.
+     * @return True if the cell is a valid destination for handover.
      */
     bool IsValidNeighbour(uint16_t cellId);
 
@@ -120,9 +120,9 @@
      * entry will be created. Only the latest measurements are stored in the
      * table.
      *
-     * \param rnti The RNTI of the UE who reported the event.
-     * \param cellId The cell ID of the measured cell.
-     * \param rsrq The RSRQ of the cell as measured by the UE.
+     * @param rnti The RNTI of the UE who reported the event.
+     * @param cellId The cell ID of the measured cell.
+     * @param rsrq The RSRQ of the cell as measured by the UE.
      */
     void UpdateNeighbourMeasurements(uint16_t rnti, uint16_t cellId, uint8_t rsrq);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/a3-rsrp-handover-algorithm.cc ns-3.44/src/lte/model/a3-rsrp-handover-algorithm.cc
--- ns-3.43/src/lte/model/a3-rsrp-handover-algorithm.cc	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/model/a3-rsrp-handover-algorithm.cc	2025-03-09 16:55:49.479371500 -0700
@@ -11,8 +11,8 @@
 
 #include "lte-common.h"
 
-#include <ns3/double.h>
-#include <ns3/log.h>
+#include "ns3/double.h"
+#include "ns3/log.h"
 
 #include <algorithm>
 #include <list>
@@ -119,45 +119,43 @@
         return;
     }
 
-    if (measResults.haveMeasResultNeighCells && !measResults.measResultListEutra.empty())
+    if (!measResults.haveMeasResultNeighCells || measResults.measResultListEutra.empty())
     {
-        uint16_t bestNeighbourCellId = 0;
-        uint8_t bestNeighbourRsrp = 0;
+        NS_LOG_WARN(
+            this << " Event A3 received without measurement results from neighbouring cells");
+        return;
+    }
 
-        for (auto it = measResults.measResultListEutra.begin();
-             it != measResults.measResultListEutra.end();
-             ++it)
+    uint16_t bestNeighbourCellId = 0;
+    uint8_t bestNeighbourRsrp = 0;
+
+    for (auto it = measResults.measResultListEutra.begin();
+         it != measResults.measResultListEutra.end();
+         ++it)
+    {
+        if (it->haveRsrpResult)
         {
-            if (it->haveRsrpResult)
-            {
-                if ((bestNeighbourRsrp < it->rsrpResult) && IsValidNeighbour(it->physCellId))
-                {
-                    bestNeighbourCellId = it->physCellId;
-                    bestNeighbourRsrp = it->rsrpResult;
-                }
-            }
-            else
+            if ((bestNeighbourRsrp < it->rsrpResult) && IsValidNeighbour(it->physCellId))
             {
-                NS_LOG_WARN("RSRP measurement is missing from cell ID " << it->physCellId);
+                bestNeighbourCellId = it->physCellId;
+                bestNeighbourRsrp = it->rsrpResult;
             }
         }
-
-        if (bestNeighbourCellId > 0)
+        else
         {
-            NS_LOG_LOGIC("Trigger Handover to cellId " << bestNeighbourCellId);
-            NS_LOG_LOGIC("target cell RSRP " << (uint16_t)bestNeighbourRsrp);
-            NS_LOG_LOGIC("serving cell RSRP " << (uint16_t)measResults.measResultPCell.rsrpResult);
-
-            // Inform eNodeB RRC about handover
-            m_handoverManagementSapUser->TriggerHandover(rnti, bestNeighbourCellId);
+            NS_LOG_WARN("RSRP measurement is missing from cell ID " << it->physCellId);
         }
     }
-    else
+
+    if (bestNeighbourCellId > 0)
     {
-        NS_LOG_WARN(
-            this << " Event A3 received without measurement results from neighbouring cells");
-    }
+        NS_LOG_LOGIC("Trigger Handover to cellId " << bestNeighbourCellId);
+        NS_LOG_LOGIC("target cell RSRP " << (uint16_t)bestNeighbourRsrp);
+        NS_LOG_LOGIC("serving cell RSRP " << (uint16_t)measResults.measResultPCell.rsrpResult);
 
+        // Inform eNodeB RRC about handover
+        m_handoverManagementSapUser->TriggerHandover(rnti, bestNeighbourCellId);
+    }
 } // end of DoReportUeMeas
 
 bool
@@ -166,7 +164,7 @@
     NS_LOG_FUNCTION(this << cellId);
 
     /**
-     * \todo In the future, this function can be expanded to validate whether the
+     * @todo In the future, this function can be expanded to validate whether the
      *       neighbour cell is a valid target cell, e.g., taking into account the
      *       NRT in ANR and whether it is a CSG cell with closed access.
      */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/a3-rsrp-handover-algorithm.h ns-3.44/src/lte/model/a3-rsrp-handover-algorithm.h
--- ns-3.43/src/lte/model/a3-rsrp-handover-algorithm.h	2024-10-09 16:41:09.928656000 -0700
+++ ns-3.44/src/lte/model/a3-rsrp-handover-algorithm.h	2025-03-09 16:55:49.479371500 -0700
@@ -14,13 +14,13 @@
 #include "lte-handover-management-sap.h"
 #include "lte-rrc-sap.h"
 
-#include <ns3/nstime.h>
+#include "ns3/nstime.h"
 
 namespace ns3
 {
 
 /**
- * \brief Implementation of the strongest cell handover algorithm, based on RSRP
+ * @brief Implementation of the strongest cell handover algorithm, based on RSRP
  *        measurements and Event A3.
  *
  * The algorithm utilizes Event A3 (Section 5.5.4.4 of 3GPP TS 36.331) UE
@@ -47,7 +47,7 @@
  *                                               TimeValue (MilliSeconds (256)));
  *     NetDeviceContainer enbLteDevs = lteHelper->InstallEnbDevice (enbNodes);
  *
- * \note Setting the handover algorithm type and attributes after the call to
+ * @note Setting the handover algorithm type and attributes after the call to
  *       LteHelper::InstallEnbDevice does not have any effect to the devices
  *       that have already been installed.
  */
@@ -60,8 +60,8 @@
     ~A3RsrpHandoverAlgorithm() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -85,8 +85,8 @@
      * Determines if a neighbour cell is a valid destination for handover.
      * Currently always return true.
      *
-     * \param cellId The cell ID of the neighbour cell.
-     * \return True if the cell is a valid destination for handover.
+     * @param cellId The cell ID of the neighbour cell.
+     * @return True if the cell is a valid destination for handover.
      */
     bool IsValidNeighbour(uint16_t cellId);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/component-carrier.cc ns-3.44/src/lte/model/component-carrier.cc
--- ns-3.43/src/lte/model/component-carrier.cc	2024-10-09 16:41:09.932656000 -0700
+++ ns-3.44/src/lte/model/component-carrier.cc	2025-03-09 16:55:49.479371500 -0700
@@ -8,10 +8,10 @@
 
 #include "component-carrier.h"
 
-#include <ns3/abort.h>
-#include <ns3/boolean.h>
-#include <ns3/log.h>
-#include <ns3/uinteger.h>
+#include "ns3/abort.h"
+#include "ns3/boolean.h"
+#include "ns3/log.h"
+#include "ns3/uinteger.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/component-carrier-enb.cc ns-3.44/src/lte/model/component-carrier-enb.cc
--- ns-3.43/src/lte/model/component-carrier-enb.cc	2024-10-09 16:41:09.932656000 -0700
+++ ns-3.44/src/lte/model/component-carrier-enb.cc	2025-03-09 16:55:49.479371500 -0700
@@ -13,12 +13,12 @@
 #include "lte-enb-phy.h"
 #include "lte-ffr-algorithm.h"
 
-#include <ns3/abort.h>
-#include <ns3/boolean.h>
-#include <ns3/log.h>
-#include <ns3/pointer.h>
-#include <ns3/simulator.h>
-#include <ns3/uinteger.h>
+#include "ns3/abort.h"
+#include "ns3/boolean.h"
+#include "ns3/log.h"
+#include "ns3/pointer.h"
+#include "ns3/simulator.h"
+#include "ns3/uinteger.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/component-carrier-enb.h ns-3.44/src/lte/model/component-carrier-enb.h
--- ns-3.43/src/lte/model/component-carrier-enb.h	2024-10-09 16:41:09.932656000 -0700
+++ ns-3.44/src/lte/model/component-carrier-enb.h	2025-03-09 16:55:49.479371500 -0700
@@ -12,10 +12,10 @@
 #include "component-carrier.h"
 #include "lte-enb-phy.h"
 
-#include <ns3/nstime.h>
-#include <ns3/object.h>
-#include <ns3/packet.h>
-#include <ns3/pointer.h>
+#include "ns3/nstime.h"
+#include "ns3/object.h"
+#include "ns3/packet.h"
+#include "ns3/pointer.h"
 
 namespace ns3
 {
@@ -25,7 +25,7 @@
 class LteFfrAlgorithm;
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
  * Defines a single carrier for enb, and contains pointers to LteEnbPhy,
  * LteEnbMac, LteFfrAlgorithm, and FfMacScheduler objects.
@@ -35,8 +35,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -46,45 +46,45 @@
     void DoDispose() override;
 
     /**
-     * \return a pointer to the physical layer.
+     * @return a pointer to the physical layer.
      */
     Ptr<LteEnbPhy> GetPhy();
 
     /**
-     * \return a pointer to the MAC layer.
+     * @return a pointer to the MAC layer.
      */
     Ptr<LteEnbMac> GetMac();
 
     /**
-     * \return a pointer to the Ffr Algorithm.
+     * @return a pointer to the Ffr Algorithm.
      */
     Ptr<LteFfrAlgorithm> GetFfrAlgorithm();
 
     /**
-     * \return a pointer to the Mac Scheduler.
+     * @return a pointer to the Mac Scheduler.
      */
     Ptr<FfMacScheduler> GetFfMacScheduler();
 
     /**
      * Set the LteEnbPhy
-     * \param s a pointer to the LteEnbPhy
+     * @param s a pointer to the LteEnbPhy
      */
     void SetPhy(Ptr<LteEnbPhy> s);
     /**
      * Set the LteEnbMac
-     * \param s a pointer to the LteEnbMac
+     * @param s a pointer to the LteEnbMac
      */
     void SetMac(Ptr<LteEnbMac> s);
 
     /**
      * Set the FfMacScheduler Algorithm
-     * \param s a pointer to the FfMacScheduler
+     * @param s a pointer to the FfMacScheduler
      */
     void SetFfMacScheduler(Ptr<FfMacScheduler> s);
 
     /**
      * Set the LteFfrAlgorithm
-     * \param s a pointer to the LteFfrAlgorithm
+     * @param s a pointer to the LteFfrAlgorithm
      */
     void SetFfrAlgorithm(Ptr<LteFfrAlgorithm> s);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/component-carrier.h ns-3.44/src/lte/model/component-carrier.h
--- ns-3.43/src/lte/model/component-carrier.h	2024-10-09 16:41:09.932656000 -0700
+++ ns-3.44/src/lte/model/component-carrier.h	2025-03-09 16:55:49.479371500 -0700
@@ -9,13 +9,13 @@
 #ifndef COMPONENT_CARRIER_H
 #define COMPONENT_CARRIER_H
 
-#include <ns3/object.h>
+#include "ns3/object.h"
 
 namespace ns3
 {
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
  * ComponentCarrier Object, it defines a single Carrier
  * This is the parent class for both ComponentCarrierBaseStation
@@ -28,8 +28,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -39,55 +39,55 @@
     void DoDispose() override;
 
     /**
-     * \return the uplink bandwidth in RBs
+     * @return the uplink bandwidth in RBs
      */
     uint16_t GetUlBandwidth() const;
 
     /**
-     * \param bw the uplink bandwidth in RBs
+     * @param bw the uplink bandwidth in RBs
      */
     virtual void SetUlBandwidth(uint16_t bw);
 
     /**
-     * \return the downlink bandwidth in RBs
+     * @return the downlink bandwidth in RBs
      */
     uint16_t GetDlBandwidth() const;
 
     /**
-     * \param bw the downlink bandwidth in RBs
+     * @param bw the downlink bandwidth in RBs
      */
     virtual void SetDlBandwidth(uint16_t bw);
 
     /**
-     * \return the downlink carrier frequency (EARFCN)
+     * @return the downlink carrier frequency (EARFCN)
      */
     uint32_t GetDlEarfcn() const;
 
     /**
-     * \param earfcn the downlink carrier frequency (EARFCN)
+     * @param earfcn the downlink carrier frequency (EARFCN)
      */
     void SetDlEarfcn(uint32_t earfcn);
 
     /**
-     * \return the uplink carrier frequency (EARFCN)
+     * @return the uplink carrier frequency (EARFCN)
      */
     uint32_t GetUlEarfcn() const;
 
     /**
-     * \param earfcn the uplink carrier frequency (EARFCN)
+     * @param earfcn the uplink carrier frequency (EARFCN)
      */
     void SetUlEarfcn(uint32_t earfcn);
 
     /**
-     * \brief Returns the CSG ID of the eNodeB.
-     * \return the Closed Subscriber Group identity
+     * @brief Returns the CSG ID of the eNodeB.
+     * @return the Closed Subscriber Group identity
      * \sa LteEnbNetDevice::SetCsgId
      */
     uint32_t GetCsgId() const;
 
     /**
-     * \brief Associate the eNodeB device with a particular CSG.
-     * \param csgId the intended Closed Subscriber Group identity
+     * @brief Associate the eNodeB device with a particular CSG.
+     * @param csgId the intended Closed Subscriber Group identity
      *
      * CSG identity is a number identifying a Closed Subscriber Group which the
      * cell belongs to. eNodeB is associated with a single CSG identity.
@@ -100,15 +100,15 @@
     void SetCsgId(uint32_t csgId);
 
     /**
-     * \brief Returns the CSG indication flag of the eNodeB.
-     * \return the CSG indication flag
+     * @brief Returns the CSG indication flag of the eNodeB.
+     * @return the CSG indication flag
      * \sa LteEnbNetDevice::SetCsgIndication
      */
     bool GetCsgIndication() const;
 
     /**
-     * \brief Enable or disable the CSG indication flag.
-     * \param csgIndication if TRUE, only CSG members are allowed to access this
+     * @brief Enable or disable the CSG indication flag.
+     * @param csgIndication if TRUE, only CSG members are allowed to access this
      *                      cell
      *
      * When the CSG indication field is set to TRUE, only UEs which are members of
@@ -116,7 +116,7 @@
      * enforcing closed access mode. Otherwise, the eNodeB operates as a non-CSG
      * cell and implements open access mode.
      *
-     * \note This restriction only applies to initial cell selection and
+     * @note This restriction only applies to initial cell selection and
      *       EPC-enabled simulation.
      *
      * \sa LteEnbNetDevice::SetCsgIndication
@@ -124,14 +124,14 @@
     void SetCsgIndication(bool csgIndication);
 
     /**
-     * \brief Set as primary carrier
-     * \param primaryCarrier true to set as primary carrier
+     * @brief Set as primary carrier
+     * @param primaryCarrier true to set as primary carrier
      */
     void SetAsPrimary(bool primaryCarrier);
 
     /**
-     * \brief Checks if the carrier is the primary carrier
-     * \returns true if the carrier is primary
+     * @brief Checks if the carrier is the primary carrier
+     * @returns true if the carrier is primary
      */
     bool IsPrimary() const;
 
@@ -149,7 +149,7 @@
 };
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
  * Defines a Base station, that is a ComponentCarrier but with a cell Id.
  *
@@ -158,30 +158,30 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Constructor
+     * @brief Constructor
      */
     ComponentCarrierBaseStation();
 
     /**
-     * \brief ~ComponentCarrierBaseStation
+     * @brief ~ComponentCarrierBaseStation
      */
     ~ComponentCarrierBaseStation() override;
 
     /**
      * Get cell identifier
-     * \return cell identifier
+     * @return cell identifier
      */
     uint16_t GetCellId() const;
 
     /**
      * Set physical cell identifier
-     * \param cellId cell identifier
+     * @param cellId cell identifier
      */
     void SetCellId(uint16_t cellId);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/component-carrier-ue.cc ns-3.44/src/lte/model/component-carrier-ue.cc
--- ns-3.43/src/lte/model/component-carrier-ue.cc	2024-10-09 16:41:09.932656000 -0700
+++ ns-3.44/src/lte/model/component-carrier-ue.cc	2025-03-09 16:55:49.479371500 -0700
@@ -11,12 +11,12 @@
 #include "lte-ue-mac.h"
 #include "lte-ue-phy.h"
 
-#include <ns3/abort.h>
-#include <ns3/boolean.h>
-#include <ns3/log.h>
-#include <ns3/pointer.h>
-#include <ns3/simulator.h>
-#include <ns3/uinteger.h>
+#include "ns3/abort.h"
+#include "ns3/boolean.h"
+#include "ns3/log.h"
+#include "ns3/pointer.h"
+#include "ns3/simulator.h"
+#include "ns3/uinteger.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/component-carrier-ue.h ns-3.44/src/lte/model/component-carrier-ue.h
--- ns-3.43/src/lte/model/component-carrier-ue.h	2024-10-09 16:41:09.932656000 -0700
+++ ns-3.44/src/lte/model/component-carrier-ue.h	2025-03-09 16:55:49.479371500 -0700
@@ -13,9 +13,9 @@
 #include "lte-phy.h"
 #include "lte-ue-phy.h"
 
-#include <ns3/nstime.h>
-#include <ns3/object.h>
-#include <ns3/packet.h>
+#include "ns3/nstime.h"
+#include "ns3/object.h"
+#include "ns3/packet.h"
 
 namespace ns3
 {
@@ -23,7 +23,7 @@
 class LteUeMac;
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
  * ComponentCarrierUe Object, it defines a single Carrier for the Ue
  */
@@ -31,8 +31,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -42,24 +42,24 @@
     void DoDispose() override;
 
     /**
-     * \return a pointer to the physical layer.
+     * @return a pointer to the physical layer.
      */
     Ptr<LteUePhy> GetPhy() const;
 
     /**
-     * \return a pointer to the MAC layer.
+     * @return a pointer to the MAC layer.
      */
     Ptr<LteUeMac> GetMac() const;
 
     /**
      * Set LteUePhy
-     * \param s a pointer to the LteUePhy
+     * @param s a pointer to the LteUePhy
      */
     void SetPhy(Ptr<LteUePhy> s);
 
     /**
      * Set the LteEnbMac
-     * \param s a pointer to the LteEnbMac
+     * @param s a pointer to the LteEnbMac
      */
     void SetMac(Ptr<LteUeMac> s);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/cqa-ff-mac-scheduler.cc ns-3.44/src/lte/model/cqa-ff-mac-scheduler.cc
--- ns-3.43/src/lte/model/cqa-ff-mac-scheduler.cc	2024-10-09 16:41:09.932656000 -0700
+++ ns-3.44/src/lte/model/cqa-ff-mac-scheduler.cc	2025-03-09 16:55:49.483371500 -0700
@@ -17,13 +17,13 @@
 #include "lte-amc.h"
 #include "lte-vendor-specific-parameters.h"
 
-#include <ns3/boolean.h>
-#include <ns3/integer.h>
-#include <ns3/log.h>
-#include <ns3/math.h>
-#include <ns3/pointer.h>
-#include <ns3/simulator.h>
-#include <ns3/string.h>
+#include "ns3/boolean.h"
+#include "ns3/integer.h"
+#include "ns3/log.h"
+#include "ns3/math.h"
+#include "ns3/pointer.h"
+#include "ns3/simulator.h"
+#include "ns3/string.h"
 
 #include <cfloat>
 #include <set>
@@ -53,9 +53,9 @@
 
 /**
  * CQI value comparator function
- * \param key1 the first item
- * \param key2 the second item
- * \returns true if the first item is > the second item
+ * @param key1 the first item
+ * @param key2 the second item
+ * @returns true if the first item is > the second item
  */
 bool
 CQIValueDescComparator(uint8_t key1, uint8_t key2)
@@ -65,9 +65,9 @@
 
 /**
  * CGA group comparator function
- * \param key1 the first item
- * \param key2 the second item
- * \returns true if the first item is > the second item
+ * @param key1 the first item
+ * @param key2 the second item
+ * @returns true if the first item is > the second item
  */
 bool
 CqaGroupDescComparator(int key1, int key2)
@@ -107,9 +107,9 @@
 
 /**
  * CQA key comparator
- * \param key1 the first item
- * \param key2 the second item
- * \returns true if the first item > the second item
+ * @param key1 the first item
+ * @param key2 the second item
+ * @returns true if the first item > the second item
  */
 bool
 CqaKeyDescComparator(uint16_t key1, uint16_t key2)
@@ -1495,7 +1495,8 @@
             }
 
             qos_rb_and_CQI_assigned_to_lc s;
-            s.cqi_value_for_lc = UeToCQIValue.find(userWithMaximumMetric)->second;
+            const auto ueToCqiIt = UeToCQIValue.find(userWithMaximumMetric);
+            s.cqi_value_for_lc = ueToCqiIt != UeToCQIValue.end() ? ueToCqiIt->second : 1;
             s.resource_block_index = currentRB;
 
             auto itMap = allocationMapPerRntiPerLCId.find(userWithMaximumMetric.m_rnti);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/cqa-ff-mac-scheduler.h ns-3.44/src/lte/model/cqa-ff-mac-scheduler.h
--- ns-3.43/src/lte/model/cqa-ff-mac-scheduler.h	2024-10-09 16:41:09.932656000 -0700
+++ ns-3.44/src/lte/model/cqa-ff-mac-scheduler.h	2025-03-09 16:55:49.483371500 -0700
@@ -19,7 +19,7 @@
 #include "lte-common.h"
 #include "lte-ffr-sap.h"
 
-#include <ns3/nstime.h>
+#include "ns3/nstime.h"
 
 #include <map>
 #include <set>
@@ -40,8 +40,8 @@
 };
 
 /**
- * \ingroup ff-api
- * \brief Implements the SCHED SAP and CSCHED SAP for the Channel and QoS Aware Scheduler
+ * @ingroup ff-api
+ * @brief Implements the SCHED SAP and CSCHED SAP for the Channel and QoS Aware Scheduler
  *
  * This class implements the interface defined by the FfMacScheduler abstract class
  */
@@ -50,7 +50,7 @@
 {
   public:
     /**
-     * \brief Constructor
+     * @brief Constructor
      *
      * Creates the MAC Scheduler interface implementation
      */
@@ -64,8 +64,8 @@
     // inherited from Object
     void DoDispose() override;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -86,8 +86,8 @@
 
     /**
      * Trans mode config update
-     * \param rnti the RNTI
-     * \param txMode the transmit mode
+     * @param rnti the RNTI
+     * @param txMode the transmit mode
      */
     void TransmissionModeConfigurationUpdate(uint16_t rnti, uint8_t txMode);
 
@@ -99,31 +99,31 @@
 
     /**
      * Csched Cell Config Request
-     * \param params CschedCellConfigReqParameters&
+     * @param params CschedCellConfigReqParameters&
      */
     void DoCschedCellConfigReq(const FfMacCschedSapProvider::CschedCellConfigReqParameters& params);
 
     /**
      * Csched UE Config Request
-     * \param params CschedUeConfigReqParameters&
+     * @param params CschedUeConfigReqParameters&
      */
     void DoCschedUeConfigReq(const FfMacCschedSapProvider::CschedUeConfigReqParameters& params);
 
     /**
      * Csched LC Config Request
-     * \param params CschedLcConfigReqParameters&
+     * @param params CschedLcConfigReqParameters&
      */
     void DoCschedLcConfigReq(const FfMacCschedSapProvider::CschedLcConfigReqParameters& params);
 
     /**
      * Csched LC Release Request
-     * \param params CschedLcReleaseReqParameters&
+     * @param params CschedLcReleaseReqParameters&
      */
     void DoCschedLcReleaseReq(const FfMacCschedSapProvider::CschedLcReleaseReqParameters& params);
 
     /**
      * Csched UE Release Request
-     * \param params CschedUeReleaseReqParameters&
+     * @param params CschedUeReleaseReqParameters&
      */
     void DoCschedUeReleaseReq(const FfMacCschedSapProvider::CschedUeReleaseReqParameters& params);
 
@@ -134,92 +134,92 @@
 
     /**
      * Sched DL RLC Buffer Request
-     * \param params SchedDlRlcBufferReqParameters&
+     * @param params SchedDlRlcBufferReqParameters&
      */
     void DoSchedDlRlcBufferReq(const FfMacSchedSapProvider::SchedDlRlcBufferReqParameters& params);
 
     /**
      * Sched DL Paging Buffer Request
-     * \param params SchedDlPagingBufferReqParameters&
+     * @param params SchedDlPagingBufferReqParameters&
      */
     void DoSchedDlPagingBufferReq(
         const FfMacSchedSapProvider::SchedDlPagingBufferReqParameters& params);
 
     /**
      * Sched DL MAC Buffer Request
-     * \param params SchedDlMacBufferReqParameters&
+     * @param params SchedDlMacBufferReqParameters&
      */
     void DoSchedDlMacBufferReq(const FfMacSchedSapProvider::SchedDlMacBufferReqParameters& params);
 
     /**
      * Sched DL RLC Buffer Request
-     * \param params SchedDlTriggerReqParameters&
+     * @param params SchedDlTriggerReqParameters&
      */
     void DoSchedDlTriggerReq(const FfMacSchedSapProvider::SchedDlTriggerReqParameters& params);
 
     /**
      * Sched DL RACH Info Request
-     * \param params SchedDlRachInfoReqParameters&
+     * @param params SchedDlRachInfoReqParameters&
      */
     void DoSchedDlRachInfoReq(const FfMacSchedSapProvider::SchedDlRachInfoReqParameters& params);
 
     /**
      * Sched DL CGI Info Request
-     * \param params SchedDlCqiInfoReqParameters&
+     * @param params SchedDlCqiInfoReqParameters&
      */
     void DoSchedDlCqiInfoReq(const FfMacSchedSapProvider::SchedDlCqiInfoReqParameters& params);
 
     /**
      * Sched UL Trigger Request
-     * \param params SchedUlTriggerReqParameters&
+     * @param params SchedUlTriggerReqParameters&
      */
     void DoSchedUlTriggerReq(const FfMacSchedSapProvider::SchedUlTriggerReqParameters& params);
 
     /**
      * Sched UL Noise InterferenceRequest
-     * \param params SchedUlNoiseInterferenceReqParameters&
+     * @param params SchedUlNoiseInterferenceReqParameters&
      */
     void DoSchedUlNoiseInterferenceReq(
         const FfMacSchedSapProvider::SchedUlNoiseInterferenceReqParameters& params);
 
     /**
      * Sched UL Sr Info Request
-     * \param params SchedUlSrInfoReqParameters&
+     * @param params SchedUlSrInfoReqParameters&
      */
     void DoSchedUlSrInfoReq(const FfMacSchedSapProvider::SchedUlSrInfoReqParameters& params);
 
     /**
      * Sched UL MAC Control Info Request
-     * \param params SchedUlMacCtrlInfoReqParameters&
+     * @param params SchedUlMacCtrlInfoReqParameters&
      */
     void DoSchedUlMacCtrlInfoReq(
         const FfMacSchedSapProvider::SchedUlMacCtrlInfoReqParameters& params);
 
     /**
      * Sched UL CGI Info Request
-     * \param params SchedUlCqiInfoReqParameters&
+     * @param params SchedUlCqiInfoReqParameters&
      */
     void DoSchedUlCqiInfoReq(const FfMacSchedSapProvider::SchedUlCqiInfoReqParameters& params);
 
     /**
      * Get RBG Size
-     * \param dlbandwidth the DL bandwidth
-     * \returns the size
+     * @param dlbandwidth the DL bandwidth
+     * @returns the size
      */
     int GetRbgSize(int dlbandwidth);
 
     /**
      * LC Active per flow
-     * \param rnti the RNTI
-     * \returns the LC active per flow
+     * @param rnti the RNTI
+     * @returns the LC active per flow
      */
     unsigned int LcActivePerFlow(uint16_t rnti);
 
     /**
      * Estimate UL Sinr
-     * \param rnti the RNTI
-     * \param rb the RB
-     * \returns the UL SINR
+     * @param rnti the RNTI
+     * @param rb the RB
+     * @returns the UL SINR
      */
     double EstimateUlSinr(uint16_t rnti, uint16_t rb);
 
@@ -230,36 +230,36 @@
 
     /**
      * Update DL RLC buffer info
-     * \param rnti the RNTI
-     * \param lcid the LCID
-     * \param size the size
+     * @param rnti the RNTI
+     * @param lcid the LCID
+     * @param size the size
      */
     void UpdateDlRlcBufferInfo(uint16_t rnti, uint8_t lcid, uint16_t size);
     /**
      * Update UL RLC buffer info
-     * \param rnti the RNTI
-     * \param size the size
+     * @param rnti the RNTI
+     * @param size the size
      */
     void UpdateUlRlcBufferInfo(uint16_t rnti, uint16_t size);
 
     /**
-     * \brief Update and return a new process Id for the RNTI specified
+     * @brief Update and return a new process Id for the RNTI specified
      *
-     * \param rnti the RNTI of the UE to be updated
-     * \return the process id  value
+     * @param rnti the RNTI of the UE to be updated
+     * @return the process id  value
      */
     uint8_t UpdateHarqProcessId(uint16_t rnti);
 
     /**
-     * \brief Return the availability of free process for the RNTI specified
+     * @brief Return the availability of free process for the RNTI specified
      *
-     * \param rnti the RNTI of the UE to be updated
-     * \return the availability
+     * @param rnti the RNTI of the UE to be updated
+     * @return the availability
      */
     bool HarqProcessAvailability(uint16_t rnti);
 
     /**
-     * \brief Refresh HARQ processes according to the timers
+     * @brief Refresh HARQ processes according to the timers
      *
      */
     void RefreshHarqProcesses();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/epc-enb-application.h ns-3.44/src/lte/model/epc-enb-application.h
--- ns-3.43/src/lte/model/epc-enb-application.h	2024-10-09 16:41:09.932656000 -0700
+++ ns-3.44/src/lte/model/epc-enb-application.h	2025-03-09 16:55:49.483371500 -0700
@@ -14,14 +14,14 @@
 #include "epc-enb-s1-sap.h"
 #include "epc-s1ap-sap.h"
 
-#include <ns3/address.h>
-#include <ns3/application.h>
-#include <ns3/callback.h>
-#include <ns3/object.h>
-#include <ns3/ptr.h>
-#include <ns3/socket.h>
-#include <ns3/traced-callback.h>
-#include <ns3/virtual-net-device.h>
+#include "ns3/address.h"
+#include "ns3/application.h"
+#include "ns3/callback.h"
+#include "ns3/object.h"
+#include "ns3/ptr.h"
+#include "ns3/socket.h"
+#include "ns3/traced-callback.h"
+#include "ns3/virtual-net-device.h"
 
 #include <map>
 
@@ -31,7 +31,7 @@
 class EpcEnbS1SapProvider;
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
  * This application is installed inside eNBs and provides the bridge functionality for user data
  * plane packets between the radio interface and the S1-U interface.
@@ -45,8 +45,8 @@
 
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -57,21 +57,21 @@
     /**
      * Constructor
      *
-     * \param lteSocket the socket to be used to send/receive IPv4 packets to/from the
+     * @param lteSocket the socket to be used to send/receive IPv4 packets to/from the
      * LTE radio interface
-     * \param lteSocket6 the socket to be used to send/receive IPv6 packets to/from the
+     * @param lteSocket6 the socket to be used to send/receive IPv6 packets to/from the
      * LTE radio interface
-     * \param cellId the identifier of the eNB
+     * @param cellId the identifier of the eNB
      */
     EpcEnbApplication(Ptr<Socket> lteSocket, Ptr<Socket> lteSocket6, uint16_t cellId);
 
     /**
      * Add a S1-U interface to the eNB
      *
-     * \param s1uSocket the socket to be used to send/receive packets to/from the S1-U interface
+     * @param s1uSocket the socket to be used to send/receive packets to/from the S1-U interface
      * connected with the SGW
-     * \param enbS1uAddress the IPv4 address of the S1-U interface of this eNB
-     * \param sgwS1uAddress the IPv4 address at which this eNB will be able to reach its SGW for
+     * @param enbS1uAddress the IPv4 address of the S1-U interface of this eNB
+     * @param sgwS1uAddress the IPv4 address at which this eNB will be able to reach its SGW for
      * S1-U communications
      */
     void AddS1Interface(Ptr<Socket> s1uSocket,
@@ -87,26 +87,26 @@
     /**
      * Set the S1 SAP User
      *
-     * \param s the S1 SAP User
+     * @param s the S1 SAP User
      */
     void SetS1SapUser(EpcEnbS1SapUser* s);
 
     /**
      *
-     * \return the S1 SAP Provider
+     * @return the S1 SAP Provider
      */
     EpcEnbS1SapProvider* GetS1SapProvider();
 
     /**
      * Set the MME side of the S1-AP SAP
      *
-     * \param s the MME side of the S1-AP SAP
+     * @param s the MME side of the S1-AP SAP
      */
     void SetS1apSapMme(EpcS1apSapMme* s);
 
     /**
      *
-     * \return the ENB side of the S1-AP SAP
+     * @return the ENB side of the S1-AP SAP
      */
     EpcS1apSapEnb* GetS1apSapEnb();
 
@@ -114,7 +114,7 @@
      * Method to be assigned to the recv callback of the LTE socket. It is called when the eNB
      * receives a data packet from the radio interface that is to be forwarded to the SGW.
      *
-     * \param socket pointer to the LTE socket
+     * @param socket pointer to the LTE socket
      */
     void RecvFromLteSocket(Ptr<Socket> socket);
 
@@ -122,14 +122,14 @@
      * Method to be assigned to the recv callback of the S1-U socket. It is called when the eNB
      * receives a data packet from the SGW that is to be forwarded to the UE.
      *
-     * \param socket pointer to the S1-U socket
+     * @param socket pointer to the S1-U socket
      */
     void RecvFromS1uSocket(Ptr<Socket> socket);
 
     /**
      * TracedCallback signature for data Packet reception event.
      *
-     * \param [in] packet The data packet sent from the internet.
+     * @param [in] packet The data packet sent from the internet.
      */
     typedef void (*RxTracedCallback)(Ptr<Packet> packet);
 
@@ -146,25 +146,25 @@
         /**
          * Constructor
          *
-         * \param a RNTI
-         * \param b bid
+         * @param a RNTI
+         * @param b bid
          */
         EpsFlowId_t(const uint16_t a, const uint8_t b);
 
         /**
          * Comparison operator
          *
-         * \param a first application
-         * \param b second application
-         * \returns true is the applications are "equal"
+         * @param a first application
+         * @param b second application
+         * @returns true is the applications are "equal"
          */
         friend bool operator==(const EpsFlowId_t& a, const EpsFlowId_t& b);
         /**
          * Less than operator
          *
-         * \param a first application
-         * \param b second application
-         * \returns true is the applications are "equal"
+         * @param a first application
+         * @param b second application
+         * @returns true is the applications are "equal"
          */
         friend bool operator<(const EpsFlowId_t& a, const EpsFlowId_t& b);
     };
@@ -173,27 +173,27 @@
     // ENB S1 SAP provider methods
     /**
      * Initial UE message function
-     * \param imsi the IMSI
-     * \param rnti the RNTI
+     * @param imsi the IMSI
+     * @param rnti the RNTI
      */
     void DoInitialUeMessage(uint64_t imsi, uint16_t rnti);
     /**
      * Path switch request function
-     * \param params PathSwitchRequestParameters
+     * @param params PathSwitchRequestParameters
      */
     void DoPathSwitchRequest(EpcEnbS1SapProvider::PathSwitchRequestParameters params);
     /**
      * UE Context Release function
-     * \param rnti the RNTI
+     * @param rnti the RNTI
      */
     void DoUeContextRelease(uint16_t rnti);
 
     // S1-AP SAP ENB methods
     /**
      * Initial Context Setup Request
-     * \param mmeUeS1Id the MME UE S1 ID
-     * \param enbUeS1Id the ENB UE S1 ID
-     * \param erabToBeSetupList the ERAB setup list
+     * @param mmeUeS1Id the MME UE S1 ID
+     * @param enbUeS1Id the ENB UE S1 ID
+     * @param erabToBeSetupList the ERAB setup list
      */
     void DoInitialContextSetupRequest(
         uint64_t mmeUeS1Id,
@@ -201,10 +201,10 @@
         std::list<EpcS1apSapEnb::ErabToBeSetupItem> erabToBeSetupList);
     /**
      * Path Switch Request Acknowledge
-     * \param mmeUeS1Id the MME UE S1 ID
-     * \param enbUeS1Id the ENB UE S1 ID
-     * \param cgi the CGI
-     * \param erabToBeSwitchedInUplinkList the ERAB switched in uplink list
+     * @param mmeUeS1Id the MME UE S1 ID
+     * @param enbUeS1Id the ENB UE S1 ID
+     * @param cgi the CGI
+     * @param erabToBeSwitchedInUplinkList the ERAB switched in uplink list
      */
     void DoPathSwitchRequestAcknowledge(
         uint64_t enbUeS1Id,
@@ -213,37 +213,37 @@
         std::list<EpcS1apSapEnb::ErabSwitchedInUplinkItem> erabToBeSwitchedInUplinkList);
 
     /**
-     * \brief This function accepts bearer id corresponding to a particular UE and schedules
+     * @brief This function accepts bearer id corresponding to a particular UE and schedules
      * indication of bearer release towards MME
-     * \param imsi maps to mmeUeS1Id
-     * \param rnti maps to enbUeS1Id
-     * \param bearerId Bearer Identity which is to be de-activated
+     * @param imsi maps to mmeUeS1Id
+     * @param rnti maps to enbUeS1Id
+     * @param bearerId Bearer Identity which is to be de-activated
      */
     void DoReleaseIndication(uint64_t imsi, uint16_t rnti, uint8_t bearerId);
 
     /**
      * Send a packet to the UE via the LTE radio interface of the eNB
      *
-     * \param packet t
-     * \param rnti maps to enbUeS1Id
-     * \param bid the EPS Bearer Identifier
+     * @param packet t
+     * @param rnti maps to enbUeS1Id
+     * @param bid the EPS Bearer Identifier
      */
     void SendToLteSocket(Ptr<Packet> packet, uint16_t rnti, uint8_t bid);
 
     /**
      * Send a packet to the SGW via the S1-U interface
      *
-     * \param packet packet to be sent
-     * \param teid the Tunnel Endpoint Identifier
+     * @param packet packet to be sent
+     * @param teid the Tunnel Endpoint Identifier
      */
     void SendToS1uSocket(Ptr<Packet> packet, uint32_t teid);
 
     /**
      * internal method used for the actual setup of the S1 Bearer
      *
-     * \param teid the Tunnel Endpoint Identifier
-     * \param rnti maps to enbUeS1Id
-     * \param bid the S1-U Bearer Identifier
+     * @param teid the Tunnel Endpoint Identifier
+     * @param rnti maps to enbUeS1Id
+     * @param bid the S1-U Bearer Identifier
      */
     void SetupS1Bearer(uint32_t teid, uint16_t rnti, uint8_t bid);
 
@@ -320,12 +320,12 @@
     uint16_t m_cellId; ///< cell ID
 
     /**
-     * \brief Callback to trace RX (reception) data packets from LTE Socket.
+     * @brief Callback to trace RX (reception) data packets from LTE Socket.
      */
     TracedCallback<Ptr<Packet>> m_rxLteSocketPktTrace;
 
     /**
-     * \brief Callback to trace RX (reception) data packets from S1-U Socket.
+     * @brief Callback to trace RX (reception) data packets from S1-U Socket.
      */
     TracedCallback<Ptr<Packet>> m_rxS1uSocketPktTrace;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/epc-enb-s1-sap.h ns-3.44/src/lte/model/epc-enb-s1-sap.h
--- ns-3.43/src/lte/model/epc-enb-s1-sap.h	2024-10-09 16:41:09.932656000 -0700
+++ ns-3.44/src/lte/model/epc-enb-s1-sap.h	2025-03-09 16:55:49.483371500 -0700
@@ -11,7 +11,7 @@
 
 #include "eps-bearer.h"
 
-#include <ns3/ipv4-address.h>
+#include "ns3/ipv4-address.h"
 
 #include <list>
 
@@ -32,16 +32,16 @@
     /**
      * Initial UE message.
      *
-     * \param imsi IMSI
-     * \param rnti RNTI
+     * @param imsi IMSI
+     * @param rnti RNTI
      */
     virtual void InitialUeMessage(uint64_t imsi, uint16_t rnti) = 0;
 
     /**
-     * \brief Triggers epc-enb-application to send ERAB Release Indication message towards MME
-     * \param imsi the UE IMSI
-     * \param rnti the UE RNTI
-     * \param bearerId Bearer Identity which is to be de-activated
+     * @brief Triggers epc-enb-application to send ERAB Release Indication message towards MME
+     * @param imsi the UE IMSI
+     * @param rnti the UE RNTI
+     * @param bearerId Bearer Identity which is to be de-activated
      */
     virtual void DoSendReleaseIndication(uint64_t imsi, uint16_t rnti, uint8_t bearerId) = 0;
 
@@ -64,7 +64,7 @@
     /**
      * Path Switch Request
      *
-     * \param params
+     * @param params
      */
     virtual void PathSwitchRequest(PathSwitchRequestParameters params) = 0;
 
@@ -73,7 +73,7 @@
      * reception of the UE CONTEXT RELEASE X2 message from the target eNB
      * during X2-based handover
      *
-     * \param rnti RNTI
+     * @param rnti RNTI
      */
     virtual void UeContextRelease(uint16_t rnti) = 0;
 };
@@ -100,7 +100,7 @@
     /**
      * Initial context setup request
      *
-     * \param params Parameters
+     * @param params Parameters
      */
     virtual void InitialContextSetupRequest(InitialContextSetupRequestParameters params) = 0;
 
@@ -120,7 +120,7 @@
     /**
      * Request the setup of a DataRadioBearer
      *
-     * \param params Parameters
+     * @param params Parameters
      */
     virtual void DataRadioBearerSetupRequest(DataRadioBearerSetupRequestParameters params) = 0;
 
@@ -133,7 +133,7 @@
     /**
      * Request a path switch acknowledge
      *
-     * \param params Parameters
+     * @param params Parameters
      */
     virtual void PathSwitchRequestAcknowledge(PathSwitchRequestAcknowledgeParameters params) = 0;
 };
@@ -149,7 +149,7 @@
     /**
      * Constructor
      *
-     * \param owner the owner class
+     * @param owner the owner class
      */
     MemberEpcEnbS1SapProvider(C* owner);
 
@@ -214,7 +214,7 @@
     /**
      * Constructor
      *
-     * \param owner the owner class
+     * @param owner the owner class
      */
     MemberEpcEnbS1SapUser(C* owner);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/epc-gtpc-header.h ns-3.44/src/lte/model/epc-gtpc-header.h
--- ns-3.43/src/lte/model/epc-gtpc-header.h	2024-10-09 16:41:09.932656000 -0700
+++ ns-3.44/src/lte/model/epc-gtpc-header.h	2025-03-09 16:55:49.483371500 -0700
@@ -18,9 +18,9 @@
 {
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
- * \brief Header of the GTPv2-C protocol
+ * @brief Header of the GTPv2-C protocol
  *
  * Implementation of the GPRS Tunnelling Protocol for Control Plane (GTPv2-C) header
  * according to the 3GPP TS 29.274 document
@@ -31,8 +31,8 @@
     GtpcHeader();
     ~GtpcHeader() override;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -46,54 +46,54 @@
      *
      * Subclasses are supposed to have a message size greater than zero.
      *
-     * \returns the message size
+     * @returns the message size
      */
     virtual uint32_t GetMessageSize() const;
 
     /**
      * Get message type
-     * \returns the message type
+     * @returns the message type
      */
     uint8_t GetMessageType() const;
     /**
      * Get message length
-     * \returns the message length
+     * @returns the message length
      */
     uint16_t GetMessageLength() const;
     /**
      * Get TEID
-     * \returns the TEID
+     * @returns the TEID
      */
     uint32_t GetTeid() const;
     /**
      * Get sequence number
-     * \returns the sequence number
+     * @returns the sequence number
      */
     uint32_t GetSequenceNumber() const;
 
     /**
      * Set message type
-     * \param messageType the message type
+     * @param messageType the message type
      */
     void SetMessageType(uint8_t messageType);
     /**
      * Set message length
-     * \param messageLength the message length
+     * @param messageLength the message length
      */
     void SetMessageLength(uint16_t messageLength);
     /**
      * Set TEID
-     * \param teid the TEID
+     * @param teid the TEID
      */
     void SetTeid(uint32_t teid);
     /**
      * Set sequence number
-     * \param sequenceNumber the sequence number
+     * @param sequenceNumber the sequence number
      */
     void SetSequenceNumber(uint32_t sequenceNumber);
     /**
      * Set IEs length. It is used to compute the message length
-     * \param iesLength the IEs length
+     * @param iesLength the IEs length
      */
     void SetIesLength(uint16_t iesLength);
 
@@ -165,19 +165,19 @@
   protected:
     /**
      * Serialize the GTP-C header in the GTP-C messages
-     * \param i the buffer iterator
+     * @param i the buffer iterator
      */
     void PreSerialize(Buffer::Iterator& i) const;
     /**
      * Deserialize the GTP-C header in the GTP-C messages
-     * \param i the buffer iterator
-     * \return number of bytes deserialized
+     * @param i the buffer iterator
+     * @return number of bytes deserialized
      */
     uint32_t PreDeserialize(Buffer::Iterator& i);
 };
 
 /**
- * \ingroup lte
+ * @ingroup lte
  * GTP-C Information Elements
  */
 class GtpcIes
@@ -199,8 +199,8 @@
     const uint32_t serializedSizePacketFilter =
         3 + 9 + 9 + 5 + 5 + 3; //!< Packet filter serialized size
     /**
-     * \return the BearerTft serialized size
-     * \param packetFilters The packet filter
+     * @return the BearerTft serialized size
+     * @param packetFilters The packet filter
      */
     uint32_t GetSerializedSizeBearerTft(std::list<EpcTft::PacketFilter> packetFilters) const;
     const uint32_t serializedSizeUliEcgi = 12;            //!< UliEcgi serialized size
@@ -209,49 +209,49 @@
 
     /**
      * Serialize the IMSI
-     * \param i Buffer iterator
-     * \param imsi The IMSI
+     * @param i Buffer iterator
+     * @param imsi The IMSI
      */
     void SerializeImsi(Buffer::Iterator& i, uint64_t imsi) const;
     /**
      * Deserialize the IMSI
-     * \param i Buffer iterator
-     * \param [out] imsi The IMSI
-     * \return the number of deserialized bytes
+     * @param i Buffer iterator
+     * @param [out] imsi The IMSI
+     * @return the number of deserialized bytes
      */
     uint32_t DeserializeImsi(Buffer::Iterator& i, uint64_t& imsi) const;
 
     /**
      * Serialize the Cause
-     * \param i Buffer iterator
-     * \param cause The Cause
+     * @param i Buffer iterator
+     * @param cause The Cause
      */
     void SerializeCause(Buffer::Iterator& i, Cause_t cause) const;
     /**
      * Deserialize the Cause
-     * \param i Buffer iterator
-     * \param [out] cause The cause
-     * \return the number of deserialized bytes
+     * @param i Buffer iterator
+     * @param [out] cause The cause
+     * @return the number of deserialized bytes
      */
     uint32_t DeserializeCause(Buffer::Iterator& i, Cause_t& cause) const;
 
     /**
      * Serialize the eps Bearer Id
-     * \param i Buffer iterator
-     * \param  epsBearerId The eps Bearer Id
+     * @param i Buffer iterator
+     * @param  epsBearerId The eps Bearer Id
      */
     void SerializeEbi(Buffer::Iterator& i, uint8_t epsBearerId) const;
     /**
      * Deserialize the eps Bearer Id
-     * \param i Buffer iterator
-     * \param [out] epsBearerId The eps Bearer Id
-     * \return the number of deserialized bytes
+     * @param i Buffer iterator
+     * @param [out] epsBearerId The eps Bearer Id
+     * @return the number of deserialized bytes
      */
     uint32_t DeserializeEbi(Buffer::Iterator& i, uint8_t& epsBearerId) const;
 
     /**
-     * \param i Buffer iterator
-     * \param data data to write in buffer
+     * @param i Buffer iterator
+     * @param data data to write in buffer
      *
      * Write the data in buffer and advance the iterator position
      * by five bytes. The data is written in network order and the
@@ -259,8 +259,8 @@
      */
     void WriteHtonU40(Buffer::Iterator& i, uint64_t data) const;
     /**
-     * \param i Buffer iterator
-     * \return the five bytes read in the buffer.
+     * @param i Buffer iterator
+     * @return the five bytes read in the buffer.
      *
      * Read data and advance the Iterator by the number of bytes
      * read.
@@ -270,78 +270,78 @@
 
     /**
      * Serialize the eps Bearer QoS
-     * \param i Buffer iterator
-     * \param bearerQos The Bearer QoS
+     * @param i Buffer iterator
+     * @param bearerQos The Bearer QoS
      */
     void SerializeBearerQos(Buffer::Iterator& i, EpsBearer bearerQos) const;
     /**
      * Deserialize the eps Bearer QoS
-     * \param i Buffer iterator
-     * \param [out] bearerQos The Bearer QoS
-     * \return the number of deserialized bytes
+     * @param i Buffer iterator
+     * @param [out] bearerQos The Bearer QoS
+     * @return the number of deserialized bytes
      */
     uint32_t DeserializeBearerQos(Buffer::Iterator& i, EpsBearer& bearerQos);
 
     /**
      * Serialize the Bearer TFT
-     * \param i Buffer iterator
-     * \param packetFilters The Packet filters
+     * @param i Buffer iterator
+     * @param packetFilters The Packet filters
      */
     void SerializeBearerTft(Buffer::Iterator& i,
                             std::list<EpcTft::PacketFilter> packetFilters) const;
     /**
      * Deserialize the Bearer TFT
-     * \param i Buffer iterator
-     * \param [out] epcTft The Bearer TFT
-     * \return the number of deserialized bytes
+     * @param i Buffer iterator
+     * @param [out] epcTft The Bearer TFT
+     * @return the number of deserialized bytes
      */
     uint32_t DeserializeBearerTft(Buffer::Iterator& i, Ptr<EpcTft> epcTft) const;
 
     /**
      * Serialize the UliEcgi
-     * \param i Buffer iterator
-     * \param uliEcgi The UliEcgi
+     * @param i Buffer iterator
+     * @param uliEcgi The UliEcgi
      */
     void SerializeUliEcgi(Buffer::Iterator& i, uint32_t uliEcgi) const;
     /**
      * Deserialize the UliEcgi
-     * \param i Buffer iterator
-     * \param [out] uliEcgi UliEcgi
-     * \return the number of deserialized bytes
+     * @param i Buffer iterator
+     * @param [out] uliEcgi UliEcgi
+     * @return the number of deserialized bytes
      */
     uint32_t DeserializeUliEcgi(Buffer::Iterator& i, uint32_t& uliEcgi) const;
 
     /**
      * Serialize the Fteid_t
-     * \param i Buffer iterator
-     * \param fteid The Fteid_t
+     * @param i Buffer iterator
+     * @param fteid The Fteid_t
      */
     void SerializeFteid(Buffer::Iterator& i, GtpcHeader::Fteid_t fteid) const;
     /**
      * Deserialize the Fteid
-     * \param i Buffer iterator
-     * \param [out] fteid Fteid
-     * \return the number of deserialized bytes
+     * @param i Buffer iterator
+     * @param [out] fteid Fteid
+     * @return the number of deserialized bytes
      */
     uint32_t DeserializeFteid(Buffer::Iterator& i, GtpcHeader::Fteid_t& fteid) const;
 
     /**
      * Serialize the Bearer Context Header
-     * \param i Buffer iterator
-     * \param length The length
+     * @param i Buffer iterator
+     * @param length The length
      */
     void SerializeBearerContextHeader(Buffer::Iterator& i, uint16_t length) const;
     /**
      * Deserialize the Bearer Context Header
-     * \param i Buffer iterator
-     * \param [out] length length
-     * \return the number of deserialized bytes
+     * @param i Buffer iterator
+     * @param [out] length length
+     * @return the number of deserialized bytes
      */
     uint32_t DeserializeBearerContextHeader(Buffer::Iterator& i, uint16_t& length) const;
 };
 
 /**
- * \ingroup lte
+ * @ingroup lte
  * GTP-C Create Session Request Message
  */
 class GtpcCreateSessionRequestMessage : public GtpcHeader, public GtpcIes
@@ -350,8 +350,8 @@
     GtpcCreateSessionRequestMessage();
     ~GtpcCreateSessionRequestMessage() override;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -363,34 +363,34 @@
 
     /**
      * Get the IMSI
-     * \return IMSI
+     * @return IMSI
      */
     uint64_t GetImsi() const;
     /**
      * Set the IMSI
-     * \param imsi IMSI
+     * @param imsi IMSI
      */
     void SetImsi(uint64_t imsi);
 
     /**
      * Get the UliEcgi
-     * \return UliEcgi
+     * @return UliEcgi
      */
     uint32_t GetUliEcgi() const;
     /**
      * Set the UliEcgi
-     * \param uliEcgi UliEcgi
+     * @param uliEcgi UliEcgi
      */
     void SetUliEcgi(uint32_t uliEcgi);
 
     /**
      * Get the Sender CpFteid
-     * \return Sender CpFteid
+     * @return Sender CpFteid
      */
     GtpcHeader::Fteid_t GetSenderCpFteid() const;
     /**
      * Set the Sender CpFteid
-     * \param fteid Sender CpFteid
+     * @param fteid Sender CpFteid
      */
     void SetSenderCpFteid(GtpcHeader::Fteid_t fteid);
 
@@ -407,12 +407,12 @@
 
     /**
      * Get the Bearer Contexts
-     * \return the Bearer Context list
+     * @return the Bearer Context list
      */
     std::list<BearerContextToBeCreated> GetBearerContextsToBeCreated() const;
     /**
      * Set the Bearer Contexts
-     * \param bearerContexts the Bearer Context list
+     * @param bearerContexts the Bearer Context list
      */
     void SetBearerContextsToBeCreated(std::list<BearerContextToBeCreated> bearerContexts);
 
@@ -426,7 +426,7 @@
 };
 
 /**
- * \ingroup lte
+ * @ingroup lte
  * GTP-C Create Session Response Message
  */
 class GtpcCreateSessionResponseMessage : public GtpcHeader, public GtpcIes
@@ -435,8 +435,8 @@
     GtpcCreateSessionResponseMessage();
     ~GtpcCreateSessionResponseMessage() override;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -448,23 +448,23 @@
 
     /**
      * Get the Cause
-     * \return the Cause
+     * @return the Cause
      */
     Cause_t GetCause() const;
     /**
      * Set the Cause
-     * \param cause The cause
+     * @param cause The cause
      */
     void SetCause(Cause_t cause);
 
     /**
      * Get the Sender CpFteid
-     * \return the Sender CpFteid
+     * @return the Sender CpFteid
      */
     GtpcHeader::Fteid_t GetSenderCpFteid() const;
     /**
      * Set the Sender CpFteid
-     * \param fteid the Sender CpFteid
+     * @param fteid the Sender CpFteid
      */
     void SetSenderCpFteid(GtpcHeader::Fteid_t fteid);
 
@@ -482,12 +482,12 @@
 
     /**
      * Get the Container of Bearer Contexts
-     * \return a list of Bearer Contexts
+     * @return a list of Bearer Contexts
      */
     std::list<BearerContextCreated> GetBearerContextsCreated() const;
     /**
      * Set the Bearer Contexts
-     * \param bearerContexts a list of Bearer Contexts
+     * @param bearerContexts a list of Bearer Contexts
      */
     void SetBearerContextsCreated(std::list<BearerContextCreated> bearerContexts);
 
@@ -499,7 +499,7 @@
 };
 
 /**
- * \ingroup lte
+ * @ingroup lte
  * GTP-C Modify Bearer Request Message
  */
 class GtpcModifyBearerRequestMessage : public GtpcHeader, public GtpcIes
@@ -508,8 +508,8 @@
     GtpcModifyBearerRequestMessage();
     ~GtpcModifyBearerRequestMessage() override;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -521,23 +521,23 @@
 
     /**
      * Get the IMSI
-     * \return IMSI
+     * @return IMSI
      */
     uint64_t GetImsi() const;
     /**
      * Set the IMSI
-     * \param imsi IMSI
+     * @param imsi IMSI
      */
     void SetImsi(uint64_t imsi);
 
     /**
      * Get the UliEcgi
-     * \return UliEcgi
+     * @return UliEcgi
      */
     uint32_t GetUliEcgi() const;
     /**
      * Set the UliEcgi
-     * \param uliEcgi UliEcgi
+     * @param uliEcgi UliEcgi
      */
     void SetUliEcgi(uint32_t uliEcgi);
 
@@ -552,12 +552,12 @@
 
     /**
      * Get the Bearer Contexts
-     * \return the Bearer Context list
+     * @return the Bearer Context list
      */
     std::list<BearerContextToBeModified> GetBearerContextsToBeModified() const;
     /**
      * Set the Bearer Contexts
-     * \param bearerContexts the Bearer Context list
+     * @param bearerContexts the Bearer Context list
      */
     void SetBearerContextsToBeModified(std::list<BearerContextToBeModified> bearerContexts);
 
@@ -570,7 +570,7 @@
 };
 
 /**
- * \ingroup lte
+ * @ingroup lte
  * GTP-C Modify Bearer Response Message
  */
 class GtpcModifyBearerResponseMessage : public GtpcHeader, public GtpcIes
@@ -579,8 +579,8 @@
     GtpcModifyBearerResponseMessage();
     ~GtpcModifyBearerResponseMessage() override;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -592,12 +592,12 @@
 
     /**
      * Get the Cause
-     * \return the Cause
+     * @return the Cause
      */
     Cause_t GetCause() const;
     /**
      * Set the Cause
-     * \param cause The cause
+     * @param cause The cause
      */
     void SetCause(Cause_t cause);
 
@@ -606,7 +606,7 @@
 };
 
 /**
- * \ingroup lte
+ * @ingroup lte
  * GTP-C Delete Bearer Command Message
  */
 class GtpcDeleteBearerCommandMessage : public GtpcHeader, public GtpcIes
@@ -615,8 +615,8 @@
     GtpcDeleteBearerCommandMessage();
     ~GtpcDeleteBearerCommandMessage() override;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -634,12 +634,12 @@
 
     /**
      * Get the Bearer contexts
-     * \return container of beraer contexts
+     * @return container of beraer contexts
      */
     std::list<BearerContext> GetBearerContexts() const;
     /**
      * Set the Bearer contexts
-     * \param bearerContexts container of beraer contexts
+     * @param bearerContexts container of beraer contexts
      */
     void SetBearerContexts(std::list<BearerContext> bearerContexts);
 
@@ -648,7 +648,7 @@
 };
 
 /**
- * \ingroup lte
+ * @ingroup lte
  * GTP-C Delete Bearer Request Message
  */
 class GtpcDeleteBearerRequestMessage : public GtpcHeader, public GtpcIes
@@ -657,8 +657,8 @@
     GtpcDeleteBearerRequestMessage();
     ~GtpcDeleteBearerRequestMessage() override;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -670,12 +670,12 @@
 
     /**
      * Get the Bearers IDs
-     * \return a container of Bearers IDs
+     * @return a container of Bearers IDs
      */
     std::list<uint8_t> GetEpsBearerIds() const;
     /**
      * Set the Bearers IDs
-     * \param epsBearerIds The container of Bearers IDs
+     * @param epsBearerIds The container of Bearers IDs
      */
     void SetEpsBearerIds(std::list<uint8_t> epsBearerIds);
 
@@ -684,7 +684,7 @@
 };
 
 /**
- * \ingroup lte
+ * @ingroup lte
  * GTP-C Delete Bearer Response Message
  */
 class GtpcDeleteBearerResponseMessage : public GtpcHeader, public GtpcIes
@@ -693,8 +693,8 @@
     GtpcDeleteBearerResponseMessage();
     ~GtpcDeleteBearerResponseMessage() override;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -706,23 +706,23 @@
 
     /**
      * Get the Cause
-     * \return the Cause
+     * @return the Cause
      */
     Cause_t GetCause() const;
     /**
      * Set the Cause
-     * \param cause The cause
+     * @param cause The cause
      */
     void SetCause(Cause_t cause);
 
     /**
      * Get the Bearers IDs
-     * \return a container of Bearers IDs
+     * @return a container of Bearers IDs
      */
     std::list<uint8_t> GetEpsBearerIds() const;
     /**
      * Set the Bearers IDs
-     * \param epsBearerIds The container of Bearers IDs
+     * @param epsBearerIds The container of Bearers IDs
      */
     void SetEpsBearerIds(std::list<uint8_t> epsBearerIds);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/epc-gtpu-header.h ns-3.44/src/lte/model/epc-gtpu-header.h
--- ns-3.43/src/lte/model/epc-gtpu-header.h	2024-10-09 16:41:09.932656000 -0700
+++ ns-3.44/src/lte/model/epc-gtpu-header.h	2025-03-09 16:55:49.483371500 -0700
@@ -9,9 +9,9 @@
 #ifndef EPS_GTPU_V1_H
 #define EPS_GTPU_V1_H
 
-#include <ns3/header.h>
-#include <ns3/ipv4-header.h>
-#include <ns3/ptr.h>
+#include "ns3/header.h"
+#include "ns3/ipv4-header.h"
+#include "ns3/ptr.h"
 
 namespace ns3
 {
@@ -19,7 +19,7 @@
 class Packet;
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
  * Implementation of the GPRS Tunnelling Protocol header according to
  * GTPv1-U Release 10 as per 3Gpp TS 29.281 document
@@ -29,8 +29,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     GtpuHeader();
@@ -43,120 +43,120 @@
 
     /**
      * Get extension header flag function
-     * \returns the extension header flag
+     * @returns the extension header flag
      */
     bool GetExtensionHeaderFlag() const;
     /**
      * Get length function
-     * \returns the length
+     * @returns the length
      */
     uint16_t GetLength() const;
     /**
      * Get message type function
-     * \returns the message type
+     * @returns the message type
      */
     uint8_t GetMessageType() const;
     /**
      * Get NPDU number function
-     * \returns the NPDU number
+     * @returns the NPDU number
      */
     uint8_t GetNPduNumber() const;
     /**
      * Get type of GTP-U message function
-     * \returns the NPDU number flag
+     * @returns the NPDU number flag
      */
     bool GetNPduNumberFlag() const;
     /**
      * Get next extension type function
-     * \returns the next extension type
+     * @returns the next extension type
      */
     uint8_t GetNextExtensionType() const;
     /**
      * Get protocol type function
-     * \returns the protocol type
+     * @returns the protocol type
      */
     bool GetProtocolType() const;
     /**
      * Get protocol type function
-     * \returns the sequence number
+     * @returns the sequence number
      */
     uint16_t GetSequenceNumber() const;
     /**
      * Get sequence number flag function
-     * \returns the sequence number flag
+     * @returns the sequence number flag
      */
     bool GetSequenceNumberFlag() const;
     /**
      * Get a tunnel endpoint identificator (TEID)
-     * \returns the TEID
+     * @returns the TEID
      */
     uint32_t GetTeid() const;
     /**
      * Get version function
-     * \returns the version
+     * @returns the version
      */
     uint8_t GetVersion() const;
     /**
      * Set extension header flag function
-     * \param extensionHeaderFlag
+     * @param extensionHeaderFlag
      */
     void SetExtensionHeaderFlag(bool extensionHeaderFlag);
     /**
      * Set the length in octets of the payload
-     * \param length the length
+     * @param length the length
      */
     void SetLength(uint16_t length);
     /**
      * Set message type function
-     * \param messageType the message type
+     * @param messageType the message type
      */
     void SetMessageType(uint8_t messageType);
     /**
      * Set NPDU number function
-     * \param nPduNumber the NPDU number
+     * @param nPduNumber the NPDU number
      */
     void SetNPduNumber(uint8_t nPduNumber);
     /**
      * Sets the flag that indicates the presence of a meaningful value of the N-PDU Number field.
-     * \param nPduNumberFlag the NPDU number flag
+     * @param nPduNumberFlag the NPDU number flag
      */
     void SetNPduNumberFlag(bool nPduNumberFlag);
     /**
      * Set next extension type function
-     * \param nextExtensionType the next extension type
+     * @param nextExtensionType the next extension type
      */
     void SetNextExtensionType(uint8_t nextExtensionType);
     /**
      * Set protocol type function
-     * \param protocolType the protocol type
+     * @param protocolType the protocol type
      */
     void SetProtocolType(bool protocolType);
     /**
      * Set sequence number function
-     * \param sequenceNumber the sequence number
+     * @param sequenceNumber the sequence number
      */
     void SetSequenceNumber(uint16_t sequenceNumber);
     /**
      * Set sequence number flag function
-     * \param sequenceNumberFlag the sequence number flag
+     * @param sequenceNumberFlag the sequence number flag
      */
     void SetSequenceNumberFlag(bool sequenceNumberFlag);
     /**
      * Set TEID function
-     * \param teid the TEID
+     * @param teid the TEID
      */
     void SetTeid(uint32_t teid);
     /**
      * Set version function
-     * \param version the version
+     * @param version the version
      */
     void SetVersion(uint8_t version);
 
     /**
      * Equality operator.
      *
-     * \param b GtpuHeader object to compare
-     * \returns true of equal
+     * @param b GtpuHeader object to compare
+     * @returns true of equal
      */
     bool operator==(const GtpuHeader& b) const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/epc-mme-application.h ns-3.44/src/lte/model/epc-mme-application.h
--- ns-3.43/src/lte/model/epc-mme-application.h	2024-10-09 16:41:09.932656000 -0700
+++ ns-3.44/src/lte/model/epc-mme-application.h	2025-03-09 16:55:49.483371500 -0700
@@ -21,7 +21,7 @@
 {
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
  * This application implements the Mobility Management Entity (MME) according to
  * the 3GPP TS 23.401 document.
@@ -43,8 +43,8 @@
 
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     void DoDispose() override;
@@ -57,25 +57,25 @@
 
     /**
      *
-     * \return the MME side of the S1-AP SAP
+     * @return the MME side of the S1-AP SAP
      */
     EpcS1apSapMme* GetS1apSapMme();
 
     /**
      * Add a new SGW to the MME
      *
-     * \param sgwS11Addr IPv4 address of the SGW S11 interface
-     * \param mmeS11Addr IPv4 address of the MME S11 interface
-     * \param mmeS11Socket socket of the MME S11 interface
+     * @param sgwS11Addr IPv4 address of the SGW S11 interface
+     * @param mmeS11Addr IPv4 address of the MME S11 interface
+     * @param mmeS11Socket socket of the MME S11 interface
      */
     void AddSgw(Ipv4Address sgwS11Addr, Ipv4Address mmeS11Addr, Ptr<Socket> mmeS11Socket);
 
     /**
      * Add a new eNB to the MME
      *
-     * \param ecgi E-UTRAN Cell Global ID, the unique identifier of the eNodeB
-     * \param enbS1UAddr IPv4 address of the eNB for S1-U communications
-     * \param enbS1apSap the eNB side of the S1-AP SAP
+     * @param ecgi E-UTRAN Cell Global ID, the unique identifier of the eNodeB
+     * @param enbS1UAddr IPv4 address of the eNB for S1-U communications
+     * @param enbS1apSap the eNB side of the S1-AP SAP
      */
     void AddEnb(uint16_t ecgi, Ipv4Address enbS1UAddr, EpcS1apSapEnb* enbS1apSap);
 
@@ -83,7 +83,7 @@
      * Add a new UE to the MME. This is the equivalent of storing the UE
      * credentials before the UE is ever turned on.
      *
-     * \param imsi the unique identifier of the UE
+     * @param imsi the unique identifier of the UE
      */
     void AddUe(uint64_t imsi);
 
@@ -92,10 +92,10 @@
      * The bearer will be activated when the UE enters the ECM
      * connected state.
      *
-     * \param imsi UE identifier
-     * \param tft traffic flow template of the bearer
-     * \param bearer QoS characteristics of the bearer
-     * \returns bearer ID
+     * @param imsi UE identifier
+     * @param tft traffic flow template of the bearer
+     * @param bearer QoS characteristics of the bearer
+     * @returns bearer ID
      */
     uint8_t AddBearer(uint64_t imsi, Ptr<EpcTft> tft, EpsBearer bearer);
 
@@ -104,18 +104,18 @@
 
     /**
      * Process the S1 Initial UE Message received from an eNB
-     * \param mmeUeS1Id the MME UE S1 ID
-     * \param enbUeS1Id the ENB UE S1 ID
-     * \param imsi the IMSI
-     * \param ecgi the ECGI
+     * @param mmeUeS1Id the MME UE S1 ID
+     * @param enbUeS1Id the ENB UE S1 ID
+     * @param imsi the IMSI
+     * @param ecgi the ECGI
      */
     void DoInitialUeMessage(uint64_t mmeUeS1Id, uint16_t enbUeS1Id, uint64_t imsi, uint16_t ecgi);
 
     /**
      * Process the S1 Initial Context Setup Response received from an eNB
-     * \param mmeUeS1Id the MME UE S1 ID
-     * \param enbUeS1Id the ENB UE S1 ID
-     * \param erabSetupList the ERAB setup list
+     * @param mmeUeS1Id the MME UE S1 ID
+     * @param enbUeS1Id the ENB UE S1 ID
+     * @param erabSetupList the ERAB setup list
      */
     void DoInitialContextSetupResponse(uint64_t mmeUeS1Id,
                                        uint16_t enbUeS1Id,
@@ -123,10 +123,10 @@
 
     /**
      * Process the S1 Path Switch Request received from an eNB
-     * \param mmeUeS1Id the MME UE S1 ID
-     * \param enbUeS1Id the ENB UE S1 ID
-     * \param cgi the CGI
-     * \param erabToBeSwitchedInDownlinkList the ERAB to be switched in downlink list
+     * @param mmeUeS1Id the MME UE S1 ID
+     * @param enbUeS1Id the ENB UE S1 ID
+     * @param cgi the CGI
+     * @param erabToBeSwitchedInDownlinkList the ERAB to be switched in downlink list
      */
     void DoPathSwitchRequest(
         uint64_t enbUeS1Id,
@@ -136,9 +136,9 @@
 
     /**
      * Process ERAB Release Indication received from an eNB
-     * \param mmeUeS1Id the MME UE S1 ID
-     * \param enbUeS1Id the ENB UE S1 ID
-     * \param erabToBeReleaseIndication the ERAB to be release indication list
+     * @param mmeUeS1Id the MME UE S1 ID
+     * @param enbUeS1Id the ENB UE S1 ID
+     * @param erabToBeReleaseIndication the ERAB to be release indication list
      */
     void DoErabReleaseIndication(
         uint64_t mmeUeS1Id,
@@ -149,28 +149,28 @@
 
     /**
      * Reads the S11 messages from a socket
-     * \param socket the socket
+     * @param socket the socket
      */
     void RecvFromS11Socket(Ptr<Socket> socket);
 
     /**
      * Process GTP-C Create Session Response message
-     * \param header the GTP-C header
-     * \param packet the packet containing the message
+     * @param header the GTP-C header
+     * @param packet the packet containing the message
      */
     void DoRecvCreateSessionResponse(GtpcHeader& header, Ptr<Packet> packet);
 
     /**
      * Process GTP-C Modify Bearer Response message
-     * \param header the GTP-C header
-     * \param packet the packet containing the message
+     * @param header the GTP-C header
+     * @param packet the packet containing the message
      */
     void DoRecvModifyBearerResponse(GtpcHeader& header, Ptr<Packet> packet);
 
     /**
      * Process GTP-C Delete Bearer Request message
-     * \param header the GTP-C header
-     * \param packet the packet containing the message
+     * @param header the GTP-C header
+     * @param packet the packet containing the message
      */
     void DoRecvDeleteBearerRequest(GtpcHeader& header, Ptr<Packet> packet);
 
@@ -203,9 +203,9 @@
     std::map<uint64_t, Ptr<UeInfo>> m_ueInfoMap;
 
     /**
-     * \brief This Function erases all contexts of bearer from MME side
-     * \param ueInfo UE information pointer
-     * \param epsBearerId Bearer Id which need to be removed corresponding to UE
+     * @brief This Function erases all contexts of bearer from MME side
+     * @param ueInfo UE information pointer
+     * @param epsBearerId Bearer Id which need to be removed corresponding to UE
      */
     void RemoveBearer(Ptr<UeInfo> ueInfo, uint8_t epsBearerId);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/epc-pgw-application.cc ns-3.44/src/lte/model/epc-pgw-application.cc
--- ns-3.43/src/lte/model/epc-pgw-application.cc	2024-10-09 16:41:09.932656000 -0700
+++ ns-3.44/src/lte/model/epc-pgw-application.cc	2025-03-09 16:55:49.483371500 -0700
@@ -48,8 +48,11 @@
 {
     NS_LOG_FUNCTION(this << (uint16_t)bearerId);
     auto it = m_teidByBearerIdMap.find(bearerId);
-    m_tftClassifier.Delete(it->second); // delete tft
-    m_teidByBearerIdMap.erase(bearerId);
+    if (it != m_teidByBearerIdMap.end())
+    {
+        m_tftClassifier.Delete(it->second); // delete tft
+        m_teidByBearerIdMap.erase(bearerId);
+    }
 }
 
 uint32_t
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/epc-pgw-application.h ns-3.44/src/lte/model/epc-pgw-application.h
--- ns-3.43/src/lte/model/epc-pgw-application.h	2024-10-09 16:41:09.932656000 -0700
+++ ns-3.44/src/lte/model/epc-pgw-application.h	2025-03-09 16:55:49.483371500 -0700
@@ -21,7 +21,7 @@
 {
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
  * This application implements the Packet Data Network (PDN) Gateway Entity (PGW)
  * according to the 3GPP TS 23.401 document.
@@ -42,8 +42,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     void DoDispose() override;
@@ -51,12 +51,12 @@
     /**
      * Constructor that binds the tap device to the callback methods.
      *
-     * \param tunDevice TUN VirtualNetDevice used to tunnel IP packets from
+     * @param tunDevice TUN VirtualNetDevice used to tunnel IP packets from
      * the SGi interface of the PGW in the internet
      * over GTP-U/UDP/IP on the S5 interface
-     * \param s5Addr IP address of the PGW S5 interface
-     * \param s5uSocket socket used to send GTP-U packets to the peer SGW
-     * \param s5cSocket socket used to send GTP-C packets to the peer SGW
+     * @param s5Addr IP address of the PGW S5 interface
+     * @param s5uSocket socket used to send GTP-U packets to the peer SGW
+     * @param s5cSocket socket used to send GTP-C packets to the peer SGW
      */
     EpcPgwApplication(const Ptr<VirtualNetDevice> tunDevice,
                       Ipv4Address s5Addr,
@@ -72,11 +72,11 @@
      * internet (including IP headers) that is to be sent to the UE via
      * its associated SGW and eNB, tunneling IP over GTP-U/UDP/IP.
      *
-     * \param packet
-     * \param source
-     * \param dest
-     * \param protocolNumber
-     * \return true always
+     * @param packet
+     * @param source
+     * @param dest
+     * @param protocolNumber
+     * @return true always
      */
     bool RecvFromTunDevice(Ptr<Packet> packet,
                            const Address& source,
@@ -88,7 +88,7 @@
      * It is called when the PGW receives a data packet from the SGW
      * that is to be forwarded to the internet.
      *
-     * \param socket pointer to the S5-U socket
+     * @param socket pointer to the S5-U socket
      */
     void RecvFromS5uSocket(Ptr<Socket> socket);
 
@@ -96,86 +96,86 @@
      * Method to be assigned to the receiver callback of the S5-C socket.
      * It is called when the PGW receives a control packet from the SGW.
      *
-     * \param socket pointer to the S5-C socket
+     * @param socket pointer to the S5-C socket
      */
     void RecvFromS5cSocket(Ptr<Socket> socket);
 
     /**
      * Send a data packet to the internet via the SGi interface of the PGW
      *
-     * \param packet packet to be sent
-     * \param teid the Tunnel Endpoint Identifier
+     * @param packet packet to be sent
+     * @param teid the Tunnel Endpoint Identifier
      */
     void SendToTunDevice(Ptr<Packet> packet, uint32_t teid);
 
     /**
      * Send a data packet to the SGW via the S5-U interface
      *
-     * \param packet packet to be sent
-     * \param sgwS5uAddress the address of the SGW
-     * \param teid the Tunnel Endpoint Identifier
+     * @param packet packet to be sent
+     * @param sgwS5uAddress the address of the SGW
+     * @param teid the Tunnel Endpoint Identifier
      */
     void SendToS5uSocket(Ptr<Packet> packet, Ipv4Address sgwS5uAddress, uint32_t teid);
 
     /**
      * Let the PGW be aware of a new SGW
      *
-     * \param sgwS5Addr the address of the SGW S5 interface
+     * @param sgwS5Addr the address of the SGW S5 interface
      */
     void AddSgw(Ipv4Address sgwS5Addr);
 
     /**
      * Let the PGW be aware of a new UE
      *
-     * \param imsi the unique identifier of the UE
+     * @param imsi the unique identifier of the UE
      */
     void AddUe(uint64_t imsi);
 
     /**
      * Set the address of a previously added UE
      *
-     * \param imsi the unique identifier of the UE
-     * \param ueAddr the IPv4 address of the UE
+     * @param imsi the unique identifier of the UE
+     * @param ueAddr the IPv4 address of the UE
      */
     void SetUeAddress(uint64_t imsi, Ipv4Address ueAddr);
 
     /**
      * set the address of a previously added UE
      *
-     * \param imsi the unique identifier of the UE
-     * \param ueAddr the IPv6 address of the UE
+     * @param imsi the unique identifier of the UE
+     * @param ueAddr the IPv6 address of the UE
      */
     void SetUeAddress6(uint64_t imsi, Ipv6Address ueAddr);
 
     /**
      * TracedCallback signature for data Packet reception event.
      *
-     * \param [in] packet The data packet sent from the internet.
+     * @param [in] packet The data packet sent from the internet.
      */
     typedef void (*RxTracedCallback)(Ptr<Packet> packet);
 
   private:
     /**
      * Process Create Session Request message
-     * \param packet GTPv2-C Create Session Request message
+     * @param packet GTPv2-C Create Session Request message
      */
     void DoRecvCreateSessionRequest(Ptr<Packet> packet);
 
     /**
      * Process Modify Bearer Request message
-     * \param packet GTPv2-C Modify Bearer Request message
+     * @param packet GTPv2-C Modify Bearer Request message
      */
     void DoRecvModifyBearerRequest(Ptr<Packet> packet);
 
     /**
      * Process Delete Bearer Command message
-     * \param packet GTPv2-C Delete Bearer Command message
+     * @param packet GTPv2-C Delete Bearer Command message
      */
     void DoRecvDeleteBearerCommand(Ptr<Packet> packet);
 
     /**
      * Process Delete Bearer Response message
-     * \param packet GTPv2-C Delete Bearer Response message
+     * @param packet GTPv2-C Delete Bearer Response message
      */
     void DoRecvDeleteBearerResponse(Ptr<Packet> packet);
 
@@ -190,27 +190,27 @@
         /**
          * Add a bearer for this UE on PGW side
          *
-         * \param bearerId the ID of the EPS Bearer to be activated
-         * \param teid  the TEID of the new bearer
-         * \param tft the Traffic Flow Template of the new bearer to be added
+         * @param bearerId the ID of the EPS Bearer to be activated
+         * @param teid  the TEID of the new bearer
+         * @param tft the Traffic Flow Template of the new bearer to be added
          */
         void AddBearer(uint8_t bearerId, uint32_t teid, Ptr<EpcTft> tft);
 
         /**
          * Delete context of bearer for this UE on PGW side
          *
-         * \param bearerId the ID of the EPS Bearer whose contexts is to be removed
+         * @param bearerId the ID of the EPS Bearer whose contexts is to be removed
          */
         void RemoveBearer(uint8_t bearerId);
 
         /**
          * Classify the packet according to TFTs of this UE
          *
-         * \param p the IPv4 or IPv6 packet from the internet to be classified
-         * \param protocolNumber identifies the type of packet.
+         * @param p the IPv4 or IPv6 packet from the internet to be classified
+         * @param protocolNumber identifies the type of packet.
          *        Only IPv4 and IPv6 packets are allowed.
          *
-         * \return the corresponding bearer ID > 0 identifying the bearer
+         * @return the corresponding bearer ID > 0 identifying the bearer
          * among all the bearers of this UE;  returns 0 if no bearers
          * matches with the previously declared TFTs
          */
@@ -219,42 +219,42 @@
         /**
          * Get the address of the SGW to which the UE is connected
          *
-         * \return the address of the SGW
+         * @return the address of the SGW
          */
         Ipv4Address GetSgwAddr();
 
         /**
          * Set the address of the eNB to which the UE is connected
          *
-         * \param addr the address of the SGW
+         * @param addr the address of the SGW
          */
         void SetSgwAddr(Ipv4Address addr);
 
         /**
          * Get the IPv4 address of the UE
          *
-         * \return the IPv4 address of the UE
+         * @return the IPv4 address of the UE
          */
         Ipv4Address GetUeAddr();
 
         /**
          * Set the IPv4 address of the UE
          *
-         * \param addr the IPv4 address of the UE
+         * @param addr the IPv4 address of the UE
          */
         void SetUeAddr(Ipv4Address addr);
 
         /**
          * Get the IPv6 address of the UE
          *
-         * \return the IPv6 address of the UE
+         * @return the IPv6 address of the UE
          */
         Ipv6Address GetUeAddr6();
 
         /**
          * Set the IPv6 address of the UE
          *
-         * \param addr the IPv6 address of the UE
+         * @param addr the IPv6 address of the UE
          */
         void SetUeAddr6(Ipv6Address addr);
 
@@ -318,12 +318,12 @@
     Ipv4Address m_sgwS5Addr;
 
     /**
-     * \brief Callback to trace received data packets at Tun NetDevice from internet.
+     * @brief Callback to trace received data packets at Tun NetDevice from internet.
      */
     TracedCallback<Ptr<Packet>> m_rxTunPktTrace;
 
     /**
-     * \brief Callback to trace received data packets from S5 socket.
+     * @brief Callback to trace received data packets from S5 socket.
      */
     TracedCallback<Ptr<Packet>> m_rxS5PktTrace;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/epc-s11-sap.h ns-3.44/src/lte/model/epc-s11-sap.h
--- ns-3.43/src/lte/model/epc-s11-sap.h	2024-10-09 16:41:09.932656000 -0700
+++ ns-3.44/src/lte/model/epc-s11-sap.h	2025-03-09 16:55:49.483371500 -0700
@@ -12,9 +12,9 @@
 #include "epc-tft.h"
 #include "eps-bearer.h"
 
-#include <ns3/address.h>
-#include <ns3/object.h>
-#include <ns3/ptr.h>
+#include "ns3/address.h"
+#include "ns3/object.h"
+#include "ns3/ptr.h"
 
 #include <list>
 
@@ -56,7 +56,7 @@
 };
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
  * MME side of the S11 Service Access Point (SAP), provides the MME
  * methods to be called when an S11 message is received by the MME.
@@ -86,7 +86,7 @@
     /**
      * send a Create Session Response message
      *
-     * \param msg the message
+     * @param msg the message
      */
     virtual void CreateSessionResponse(CreateSessionResponseMessage msg) = 0;
 
@@ -107,9 +107,9 @@
     };
 
     /**
-     * \brief As per 3GPP TS 29.274 Release 9 V9.3.0, a Delete Bearer Request message shall be sent
+     * @brief As per 3GPP TS 29.274 Release 9 V9.3.0, a Delete Bearer Request message shall be sent
      * on the S11 interface by PGW to SGW and from SGW to MME
-     * \param msg the message
+     * @param msg the message
      */
     virtual void DeleteBearerRequest(DeleteBearerRequestMessage msg) = 0;
 
@@ -133,13 +133,13 @@
     /**
      * Send a Modify Bearer Response message
      *
-     * \param msg the message
+     * @param msg the message
      */
     virtual void ModifyBearerResponse(ModifyBearerResponseMessage msg) = 0;
 };
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
  * SGW side of the S11 Service Access Point (SAP), provides the SGW
  * methods to be called when an S11 message is received by the SGW.
@@ -170,7 +170,7 @@
     /**
      * Send a Create Session Request message
      *
-     * \param msg the message
+     * @param msg the message
      */
     virtual void CreateSessionRequest(CreateSessionRequestMessage msg) = 0;
 
@@ -190,9 +190,9 @@
     };
 
     /**
-     * \brief As per 3GPP TS 29.274 Release 9 V9.3.0, a Delete Bearer Command message shall be sent
+     * @brief As per 3GPP TS 29.274 Release 9 V9.3.0, a Delete Bearer Command message shall be sent
      * on the S11 interface by the MME to the SGW
-     * \param msg the DeleteBearerCommandMessage
+     * @param msg the DeleteBearerCommandMessage
      */
     virtual void DeleteBearerCommand(DeleteBearerCommandMessage msg) = 0;
 
@@ -212,9 +212,9 @@
     };
 
     /**
-     * \brief As per 3GPP TS 29.274 Release 9 V9.3.0, a Delete Bearer Command message shall be sent
+     * @brief As per 3GPP TS 29.274 Release 9 V9.3.0, a Delete Bearer Command message shall be sent
      * on the S11 interface by the MME to the SGW
-     * \param msg the message
+     * @param msg the message
      */
     virtual void DeleteBearerResponse(DeleteBearerResponseMessage msg) = 0;
 
@@ -229,7 +229,7 @@
     /**
      * Send a Modify Bearer Request message
      *
-     * \param msg the message
+     * @param msg the message
      */
     virtual void ModifyBearerRequest(ModifyBearerRequestMessage msg) = 0;
 };
@@ -245,7 +245,7 @@
     /**
      * Constructor
      *
-     * \param owner the owner class
+     * @param owner the owner class
      */
     MemberEpcS11SapMme(C* owner);
 
@@ -299,7 +299,7 @@
     /**
      * Constructor
      *
-     * \param owner the owner class
+     * @param owner the owner class
      */
     MemberEpcS11SapSgw(C* owner);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/epc-s1ap-sap.h ns-3.44/src/lte/model/epc-s1ap-sap.h
--- ns-3.43/src/lte/model/epc-s1ap-sap.h	2024-10-09 16:41:09.932656000 -0700
+++ ns-3.44/src/lte/model/epc-s1ap-sap.h	2025-03-09 16:55:49.483371500 -0700
@@ -11,10 +11,10 @@
 
 #include "eps-bearer.h"
 
-#include <ns3/address.h>
-#include <ns3/ipv4-address.h>
-#include <ns3/object.h>
-#include <ns3/ptr.h>
+#include "ns3/address.h"
+#include "ns3/ipv4-address.h"
+#include "ns3/object.h"
+#include "ns3/ptr.h"
 
 #include <list>
 
@@ -22,7 +22,7 @@
 {
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
  * Base class that defines EPC S1-AP Service Access Point (SAP) interface.
  */
@@ -33,7 +33,7 @@
 };
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
  * MME side of the S1-AP Service Access Point (SAP), provides the MME
  * methods to be called when an S1-AP message is received by the MME.
@@ -44,10 +44,10 @@
     /**
      * Initial UE message.
      *
-     * \param mmeUeS1Id in practice, we use the IMSI
-     * \param enbUeS1Id in practice, we use the RNTI
-     * \param stmsi in practice, the imsi
-     * \param ecgi in practice, the cell Id
+     * @param mmeUeS1Id in practice, we use the IMSI
+     * @param enbUeS1Id in practice, we use the RNTI
+     * @param stmsi in practice, the imsi
+     * @param ecgi in practice, the cell Id
      */
     virtual void InitialUeMessage(uint64_t mmeUeS1Id,
                                   uint16_t enbUeS1Id,
@@ -63,13 +63,13 @@
     };
 
     /**
-     * \brief As per 3GPP TS 36.413 version 9.8.0 section 8.2.3.2.2, the eNB
+     * @brief As per 3GPP TS 36.413 version 9.8.0 section 8.2.3.2.2, the eNB
      * indicates bearer release by sending an E-RAB RELEASE INDICATION message
      * towards MME
      *
-     * \param mmeUeS1Id in practice, we use the IMSI
-     * \param enbUeS1Id in practice, we use the RNTI
-     * \param erabToBeReleaseIndication List of bearers to be deactivated
+     * @param mmeUeS1Id in practice, we use the IMSI
+     * @param enbUeS1Id in practice, we use the RNTI
+     * @param erabToBeReleaseIndication List of bearers to be deactivated
      */
     virtual void ErabReleaseIndication(
         uint64_t mmeUeS1Id,
@@ -89,9 +89,9 @@
     /**
      * INITIAL CONTEXT SETUP RESPONSE message,  see 3GPP TS 36.413 9.1.4.2
      *
-     * \param mmeUeS1Id in practice, we use the IMSI
-     * \param enbUeS1Id in practice, we use the RNTI
-     * \param erabSetupList List of ERAB setup
+     * @param mmeUeS1Id in practice, we use the IMSI
+     * @param enbUeS1Id in practice, we use the RNTI
+     * @param erabSetupList List of ERAB setup
      *
      */
     virtual void InitialContextSetupResponse(uint64_t mmeUeS1Id,
@@ -111,10 +111,10 @@
     /**
      * PATH SWITCH REQUEST message, see 3GPP TS 36.413 9.1.5.8
      *
-     * \param enbUeS1Id in practice, we use the RNTI
-     * \param mmeUeS1Id in practice, we use the IMSI
-     * \param gci GCI
-     * \param erabToBeSwitchedInDownlinkList List of ERAB to be switched in downlink
+     * @param enbUeS1Id in practice, we use the RNTI
+     * @param mmeUeS1Id in practice, we use the IMSI
+     * @param gci GCI
+     * @param erabToBeSwitchedInDownlinkList List of ERAB to be switched in downlink
      */
     virtual void PathSwitchRequest(
         uint64_t enbUeS1Id,
@@ -124,7 +124,7 @@
 };
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
  * eNB side of the S1-AP Service Access Point (SAP), provides the eNB
  * methods to be called when an S1-AP message is received by the eNB.
@@ -144,9 +144,9 @@
     /**
      * Initial context setup request
      *
-     * \param mmeUeS1Id in practice, we use the IMSI
-     * \param enbUeS1Id in practice, we use the RNTI
-     * \param erabToBeSetupList List of ERAB to be setup
+     * @param mmeUeS1Id in practice, we use the IMSI
+     * @param enbUeS1Id in practice, we use the RNTI
+     * @param erabToBeSetupList List of ERAB to be setup
      */
     virtual void InitialContextSetupRequest(uint64_t mmeUeS1Id,
                                             uint16_t enbUeS1Id,
@@ -165,10 +165,10 @@
     /**
      * PATH SWITCH REQUEST ACKNOWLEDGE message, see 3GPP TS 36.413 9.1.5.9
      *
-     * \param enbUeS1Id in practice, we use the RNTI
-     * \param mmeUeS1Id in practice, we use the IMSI
-     * \param cgi CGI
-     * \param erabToBeSwitchedInUplinkList List of ERAB to be switched in uplink
+     * @param enbUeS1Id in practice, we use the RNTI
+     * @param mmeUeS1Id in practice, we use the IMSI
+     * @param cgi CGI
+     * @param erabToBeSwitchedInUplinkList List of ERAB to be switched in uplink
      */
     virtual void PathSwitchRequestAcknowledge(
         uint64_t enbUeS1Id,
@@ -188,7 +188,7 @@
     /**
      * Constructor
      *
-     * \param owner the owner class
+     * @param owner the owner class
      */
     MemberEpcS1apSapMme(C* owner);
 
@@ -198,10 +198,10 @@
     // inherited from EpcS1apSapMme
     /**
      * Initial UE Message function
-     * \param mmeUeS1Id in practice, we use the IMSI
-     * \param enbUeS1Id in practice, we use the RNTI
-     * \param imsi the IMSI
-     * \param ecgi ECGI
+     * @param mmeUeS1Id in practice, we use the IMSI
+     * @param enbUeS1Id in practice, we use the RNTI
+     * @param imsi the IMSI
+     * @param ecgi ECGI
      */
     void InitialUeMessage(uint64_t mmeUeS1Id,
                           uint16_t enbUeS1Id,
@@ -209,9 +209,9 @@
                           uint16_t ecgi) override;
     /**
      * ERAB Release Indiation function
-     * \param mmeUeS1Id in practice, we use the IMSI
-     * \param enbUeS1Id in practice, we use the RNTI
-     * \param erabToBeReleaseIndication List of ERAB to be release indication
+     * @param mmeUeS1Id in practice, we use the IMSI
+     * @param enbUeS1Id in practice, we use the RNTI
+     * @param erabToBeReleaseIndication List of ERAB to be release indication
      */
     void ErabReleaseIndication(
         uint64_t mmeUeS1Id,
@@ -220,19 +220,19 @@
 
     /**
      * Initial context setup response
-     * \param mmeUeS1Id in practice, we use the IMSI
-     * \param enbUeS1Id in practice, we use the RNTI
-     * \param erabSetupList List of ERAB setup
+     * @param mmeUeS1Id in practice, we use the IMSI
+     * @param enbUeS1Id in practice, we use the RNTI
+     * @param erabSetupList List of ERAB setup
      */
     void InitialContextSetupResponse(uint64_t mmeUeS1Id,
                                      uint16_t enbUeS1Id,
                                      std::list<ErabSetupItem> erabSetupList) override;
     /**
      * Path switch request
-     * \param enbUeS1Id in practice, we use the RNTI
-     * \param mmeUeS1Id in practice, we use the IMSI
-     * \param cgi CGI
-     * \param erabToBeSwitchedInDownlinkList List of ERAB to be switched in downlink
+     * @param enbUeS1Id in practice, we use the RNTI
+     * @param mmeUeS1Id in practice, we use the IMSI
+     * @param cgi CGI
+     * @param erabToBeSwitchedInDownlinkList List of ERAB to be switched in downlink
      */
     void PathSwitchRequest(
         uint64_t enbUeS1Id,
@@ -301,7 +301,7 @@
     /**
      * Constructor
      *
-     * \param owner the owner class
+     * @param owner the owner class
      */
     MemberEpcS1apSapEnb(C* owner);
 
@@ -311,19 +311,19 @@
     // inherited from EpcS1apSapEnb
     /**
      * Initial context setup request function
-     * \param mmeUeS1Id in practice, we use the IMSI
-     * \param enbUeS1Id in practice, we use the RNTI
-     * \param erabToBeSetupList List of ERAB to be setup
+     * @param mmeUeS1Id in practice, we use the IMSI
+     * @param enbUeS1Id in practice, we use the RNTI
+     * @param erabToBeSetupList List of ERAB to be setup
      */
     void InitialContextSetupRequest(uint64_t mmeUeS1Id,
                                     uint16_t enbUeS1Id,
                                     std::list<ErabToBeSetupItem> erabToBeSetupList) override;
     /**
      * Path switch request acknowledge function
-     * \param enbUeS1Id in practice, we use the RNTI
-     * \param mmeUeS1Id in practice, we use the IMSI
-     * \param cgi CGI
-     * \param erabToBeSwitchedInUplinkList List of ERAB to be switched in uplink
+     * @param enbUeS1Id in practice, we use the RNTI
+     * @param mmeUeS1Id in practice, we use the IMSI
+     * @param cgi CGI
+     * @param erabToBeSwitchedInUplinkList List of ERAB to be switched in uplink
      */
     void PathSwitchRequestAcknowledge(
         uint64_t enbUeS1Id,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/epc-sgw-application.h ns-3.44/src/lte/model/epc-sgw-application.h
--- ns-3.43/src/lte/model/epc-sgw-application.h	2024-10-09 16:41:09.932656000 -0700
+++ ns-3.44/src/lte/model/epc-sgw-application.h	2025-03-09 16:55:49.483371500 -0700
@@ -21,7 +21,7 @@
 {
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
  * This application implements the Serving Gateway Entity (SGW)
  * according to the 3GPP TS 23.401 document.
@@ -41,8 +41,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     void DoDispose() override;
@@ -50,10 +50,10 @@
     /**
      * Constructor that binds callback methods of sockets.
      *
-     * \param s1uSocket socket used to send/receive GTP-U packets to/from the eNBs
-     * \param s5Addr IPv4 address of the S5 interface
-     * \param s5uSocket socket used to send/receive GTP-U packets to/from the PGW
-     * \param s5cSocket socket used to send/receive GTP-C packets to/from the PGW
+     * @param s1uSocket socket used to send/receive GTP-U packets to/from the eNBs
+     * @param s5Addr IPv4 address of the S5 interface
+     * @param s5uSocket socket used to send/receive GTP-U packets to/from the PGW
+     * @param s5cSocket socket used to send/receive GTP-C packets to/from the PGW
      */
     EpcSgwApplication(const Ptr<Socket> s1uSocket,
                       Ipv4Address s5Addr,
@@ -66,24 +66,24 @@
     /**
      * Let the SGW be aware of an MME
      *
-     * \param mmeS11Addr the address of the MME
-     * \param s11Socket the socket to send/receive messages from the MME
+     * @param mmeS11Addr the address of the MME
+     * @param s11Socket the socket to send/receive messages from the MME
      */
     void AddMme(Ipv4Address mmeS11Addr, Ptr<Socket> s11Socket);
 
     /**
      * Let the SGW be aware of a PGW
      *
-     * \param pgwAddr the address of the PGW
+     * @param pgwAddr the address of the PGW
      */
     void AddPgw(Ipv4Address pgwAddr);
 
     /**
      * Let the SGW be aware of a new eNB
      *
-     * \param cellId the cell identifier
-     * \param enbAddr the address of the eNB
-     * \param sgwAddr the address of the SGW
+     * @param cellId the cell identifier
+     * @param enbAddr the address of the eNB
+     * @param sgwAddr the address of the SGW
      */
     void AddEnb(uint16_t cellId, Ipv4Address enbAddr, Ipv4Address sgwAddr);
 
@@ -92,7 +92,7 @@
      * Method to be assigned to the recv callback of the S11 socket.
      * It is called when the SGW receives a control packet from the MME.
      *
-     * \param socket pointer to the S11 socket
+     * @param socket pointer to the S11 socket
      */
     void RecvFromS11Socket(Ptr<Socket> socket);
 
@@ -101,7 +101,7 @@
      * It is called when the SGW receives a data packet from the PGW
      * that is to be forwarded to an eNB.
      *
-     * \param socket pointer to the S5-U socket
+     * @param socket pointer to the S5-U socket
      */
     void RecvFromS5uSocket(Ptr<Socket> socket);
 
@@ -109,7 +109,7 @@
      * Method to be assigned to the recv callback of the S5-C socket.
      * It is called when the SGW receives a control packet from the PGW.
      *
-     * \param socket pointer to the S5-C socket
+     * @param socket pointer to the S5-C socket
      */
     void RecvFromS5cSocket(Ptr<Socket> socket);
 
@@ -118,25 +118,25 @@
      * It is called when the SGW receives a data packet from the eNB
      * that is to be forwarded to the PGW.
      *
-     * \param socket pointer to the S1-U socket
+     * @param socket pointer to the S1-U socket
      */
     void RecvFromS1uSocket(Ptr<Socket> socket);
 
     /**
      * Send a data packet to the PGW via the S5 interface
      *
-     * \param packet packet to be sent
-     * \param pgwAddr the address of the PGW
-     * \param teid the Tunnel Endpoint Identifier
+     * @param packet packet to be sent
+     * @param pgwAddr the address of the PGW
+     * @param teid the Tunnel Endpoint Identifier
      */
     void SendToS5uSocket(Ptr<Packet> packet, Ipv4Address pgwAddr, uint32_t teid);
 
     /**
      * Send a data packet to an eNB via the S1-U interface
      *
-     * \param packet packet to be sent
-     * \param enbS1uAddress the address of the eNB
-     * \param teid the Tunnel Endpoint Identifier
+     * @param packet packet to be sent
+     * @param enbS1uAddress the address of the eNB
+     * @param teid the Tunnel Endpoint Identifier
      */
     void SendToS1uSocket(Ptr<Packet> packet, Ipv4Address enbS1uAddress, uint32_t teid);
 
@@ -144,25 +144,25 @@
 
     /**
      * Process GTP-C Create Session Request message
-     * \param packet the packet containing the message
+     * @param packet the packet containing the message
      */
     void DoRecvCreateSessionRequest(Ptr<Packet> packet);
 
     /**
      * Process GTP-C Modify Bearer Request message
-     * \param packet the packet containing the message
+     * @param packet the packet containing the message
      */
     void DoRecvModifyBearerRequest(Ptr<Packet> packet);
 
     /**
      * Process GTP-C Delete Bearer Command message
-     * \param packet the packet containing the message
+     * @param packet the packet containing the message
      */
     void DoRecvDeleteBearerCommand(Ptr<Packet> packet);
 
     /**
      * Process GTP-C Delete Bearer Response message
-     * \param packet the packet containing the message
+     * @param packet the packet containing the message
      */
     void DoRecvDeleteBearerResponse(Ptr<Packet> packet);
 
@@ -170,19 +170,19 @@
 
     /**
      * Process GTP-C Create Session Response message
-     * \param packet the packet containing the message
+     * @param packet the packet containing the message
      */
     void DoRecvCreateSessionResponse(Ptr<Packet> packet);
 
     /**
      * Process GTP-C Modify Bearer Response message
-     * \param packet the packet containing the message
+     * @param packet the packet containing the message
      */
     void DoRecvModifyBearerResponse(Ptr<Packet> packet);
 
     /**
      * Process GTP-C Delete Bearer Request message
-     * \param packet the packet containing the message
+     * @param packet the packet containing the message
      */
     void DoRecvDeleteBearerRequest(Ptr<Packet> packet);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/epc-tft.cc ns-3.44/src/lte/model/epc-tft.cc
--- ns-3.43/src/lte/model/epc-tft.cc	2024-10-09 16:41:09.932656000 -0700
+++ ns-3.44/src/lte/model/epc-tft.cc	2025-03-09 16:55:49.483371500 -0700
@@ -19,9 +19,9 @@
 /**
  * Output stream operator for EPC TFT direction
  *
- * \param os output stream
- * \param d EPC TFT direction
- * \return ostream
+ * @param os output stream
+ * @param d EPC TFT direction
+ * @return ostream
  */
 std::ostream&
 operator<<(std::ostream& os, const EpcTft::Direction& d)
@@ -44,9 +44,9 @@
 /**
  * Output stream for EPC TFT packet filter
  *
- * \param os output stream
- * \param f EPC TFT packet filter
- * \return ostream
+ * @param os output stream
+ * @param f EPC TFT packet filter
+ * @return ostream
  */
 std::ostream&
 operator<<(std::ostream& os, const EpcTft::PacketFilter& f)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/epc-tft-classifier.h ns-3.44/src/lte/model/epc-tft-classifier.h
--- ns-3.43/src/lte/model/epc-tft-classifier.h	2024-10-09 16:41:09.932656000 -0700
+++ ns-3.44/src/lte/model/epc-tft-classifier.h	2025-03-09 16:55:49.483371500 -0700
@@ -23,9 +23,9 @@
 class Packet;
 
 /**
- * \brief classifies IP packets according to Traffic Flow Templates (TFTs)
+ * @brief classifies IP packets according to Traffic Flow Templates (TFTs)
  *
- * \note this implementation works with IPv4 and IPv6.
+ * @note this implementation works with IPv4 and IPv6.
  * When there is fragmentation of IP packets, UDP/TCP ports maybe missing.
  *
  * The following actions are performed to use the port info present in the first segment with
@@ -46,8 +46,8 @@
     /**
      * add a TFT to the Classifier
      *
-     * \param tft the TFT to be added
-     * \param id the ID of the bearer which will be classified by specified TFT classifier
+     * @param tft the TFT to be added
+     * @param id the ID of the bearer which will be classified by specified TFT classifier
      *
      */
     void Add(Ptr<EpcTft> tft, uint32_t id);
@@ -55,18 +55,18 @@
     /**
      * delete an existing TFT from the classifier
      *
-     * \param id the identifier of the TFT to be deleted
+     * @param id the identifier of the TFT to be deleted
      */
     void Delete(uint32_t id);
 
     /**
      * classify an IP packet
      *
-     * \param p the IP packet. The outmost header can only be an IPv4 or an IPv6 header.
-     * \param direction the EPC TFT direction (can be downlink, uplink or bi-directional)
-     * \param protocolNumber the protocol of the packet. Only IPv4 and IPv6 are supported.
+     * @param p the IP packet. The outmost header can only be an IPv4 or an IPv6 header.
+     * @param direction the EPC TFT direction (can be downlink, uplink or bi-directional)
+     * @param protocolNumber the protocol of the packet. Only IPv4 and IPv6 are supported.
      *
-     * \return the identifier (>0) of the first TFT that matches with the IP packet; 0 if no TFT
+     * @return the identifier (>0) of the first TFT that matches with the IP packet; 0 if no TFT
      * matched.
      */
     uint32_t Classify(Ptr<Packet> p, EpcTft::Direction direction, uint16_t protocolNumber);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/epc-tft.h ns-3.44/src/lte/model/epc-tft.h
--- ns-3.43/src/lte/model/epc-tft.h	2024-10-09 16:41:09.932656000 -0700
+++ ns-3.44/src/lte/model/epc-tft.h	2025-03-09 16:55:49.483371500 -0700
@@ -9,9 +9,9 @@
 #ifndef EPC_TFT_H
 #define EPC_TFT_H
 
-#include <ns3/ipv4-address.h>
-#include <ns3/ipv6-address.h>
-#include <ns3/simple-ref-count.h>
+#include "ns3/ipv4-address.h"
+#include "ns3/ipv6-address.h"
+#include "ns3/simple-ref-count.h"
 
 #include <list>
 
@@ -29,7 +29,7 @@
     /**
      * creates a TFT matching any traffic
      *
-     * \return a newly created TFT that will match any traffic
+     * @return a newly created TFT that will match any traffic
      */
     static Ptr<EpcTft> Default();
 
@@ -62,14 +62,14 @@
 
         /**
          *
-         * \param d the direction
-         * \param ra the remote address
-         * \param la the local address
-         * \param rp the remote port
-         * \param lp the local port
-         * \param tos the type of service
+         * @param d the direction
+         * @param ra the remote address
+         * @param la the local address
+         * @param rp the remote port
+         * @param lp the local port
+         * @param tos the type of service
          *
-         * \return true if the parameters match with the PacketFilter,
+         * @return true if the parameters match with the PacketFilter,
          * false otherwise.
          */
         bool Matches(Direction d,
@@ -81,14 +81,14 @@
 
         /**
          *
-         * \param d the direction
-         * \param ra the remote address
-         * \param la the local address
-         * \param rp the remote port
-         * \param lp the local port
-         * \param tos the type of service
+         * @param d the direction
+         * @param ra the remote address
+         * @param la the local address
+         * @param rp the remote port
+         * @param lp the local port
+         * @param tos the type of service
          *
-         * \return true if the parameters match with the PacketFilter,
+         * @return true if the parameters match with the PacketFilter,
          * false otherwise.
          */
         bool Matches(Direction d,
@@ -129,23 +129,23 @@
     /**
      * add a PacketFilter to the Traffic Flow Template
      *
-     * \param f the PacketFilter to be added
+     * @param f the PacketFilter to be added
      *
-     * \return the id( 0 <= id < 16) of the newly added filter, if the addition was successful. Will
+     * @return the id( 0 <= id < 16) of the newly added filter, if the addition was successful. Will
      * fail if you try to add more than 15 filters. This is to be compliant with TS 24.008.
      */
     uint8_t Add(PacketFilter f);
 
     /**
      *
-     * \param direction
-     * \param remoteAddress
-     * \param localAddress
-     * \param remotePort
-     * \param localPort
-     * \param typeOfService
+     * @param direction
+     * @param remoteAddress
+     * @param localAddress
+     * @param remotePort
+     * @param localPort
+     * @param typeOfService
      *
-     * \return true if any PacketFilter in the TFT matches with the
+     * @return true if any PacketFilter in the TFT matches with the
      * parameters, false otherwise.
      */
     bool Matches(Direction direction,
@@ -157,14 +157,14 @@
 
     /**
      *
-     * \param direction
-     * \param remoteAddress
-     * \param localAddress
-     * \param remotePort
-     * \param localPort
-     * \param typeOfService
+     * @param direction
+     * @param remoteAddress
+     * @param localAddress
+     * @param remotePort
+     * @param localPort
+     * @param typeOfService
      *
-     * \return true if any PacketFilter in the TFT matches with the
+     * @return true if any PacketFilter in the TFT matches with the
      * parameters, false otherwise.
      */
     bool Matches(Direction direction,
@@ -176,7 +176,7 @@
 
     /**
      * Get the packet filters
-     * \return a container of packet filters
+     * @return a container of packet filters
      */
     std::list<PacketFilter> GetPacketFilters() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/epc-ue-nas.cc ns-3.44/src/lte/model/epc-ue-nas.cc
--- ns-3.43/src/lte/model/epc-ue-nas.cc	2024-10-09 16:41:09.932656000 -0700
+++ ns-3.44/src/lte/model/epc-ue-nas.cc	2025-03-09 16:55:49.483371500 -0700
@@ -10,35 +10,16 @@
 
 #include "lte-as-sap.h"
 
-#include <ns3/epc-helper.h>
-#include <ns3/fatal-error.h>
-#include <ns3/log.h>
-#include <ns3/simulator.h>
+#include "ns3/epc-helper.h"
+#include "ns3/fatal-error.h"
+#include "ns3/log.h"
+#include "ns3/simulator.h"
 
 namespace ns3
 {
 
 NS_LOG_COMPONENT_DEFINE("EpcUeNas");
 
-/// Map each of UE NAS states to its string representation.
-static const std::string g_ueNasStateName[EpcUeNas::NUM_STATES] = {
-    "OFF",
-    "ATTACHING",
-    "IDLE_REGISTERED",
-    "CONNECTING_TO_EPC",
-    "ACTIVE",
-};
-
-/**
- * \param s The UE NAS state.
- * \return The string representation of the given state.
- */
-static inline const std::string&
-ToString(EpcUeNas::State s)
-{
-    return g_ueNasStateName[s];
-}
-
 NS_OBJECT_ENSURE_REGISTERED(EpcUeNas);
 
 EpcUeNas::EpcUeNas()
@@ -273,11 +254,10 @@
 void
 EpcUeNas::SwitchToState(State newState)
 {
-    NS_LOG_FUNCTION(this << ToString(newState));
+    NS_LOG_FUNCTION(this << newState);
     State oldState = m_state;
     m_state = newState;
-    NS_LOG_INFO("IMSI " << m_imsi << " NAS " << ToString(oldState) << " --> "
-                        << ToString(newState));
+    NS_LOG_INFO("IMSI " << m_imsi << " NAS " << oldState << " --> " << newState);
     m_stateTransitionCallback(oldState, newState);
 
     // actions to be done when entering a new state:
@@ -296,4 +276,25 @@
     }
 }
 
+std::ostream&
+operator<<(std::ostream& os, EpcUeNas::State state)
+{
+    switch (state)
+    {
+    case EpcUeNas::State::OFF:
+        return os << "OFF";
+    case EpcUeNas::State::ATTACHING:
+        return os << "ATTACHING";
+    case EpcUeNas::State::IDLE_REGISTERED:
+        return os << "IDLE_REGISTERED";
+    case EpcUeNas::State::CONNECTING_TO_EPC:
+        return os << "CONNECTING_TO_EPC";
+    case EpcUeNas::State::ACTIVE:
+        return os << "ACTIVE";
+    case EpcUeNas::State::NUM_STATES:
+        return os << "NUM_STATES";
+    };
+    return os << "UNKNOWN(" << static_cast<uint32_t>(state) << ")";
+}
+
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/epc-ue-nas.h ns-3.44/src/lte/model/epc-ue-nas.h
--- ns-3.43/src/lte/model/epc-ue-nas.h	2024-10-09 16:41:09.932656000 -0700
+++ ns-3.44/src/lte/model/epc-ue-nas.h	2025-03-09 16:55:49.483371500 -0700
@@ -13,8 +13,8 @@
 #include "eps-bearer.h"
 #include "lte-as-sap.h"
 
-#include <ns3/object.h>
-#include <ns3/traced-callback.h>
+#include "ns3/object.h"
+#include "ns3/traced-callback.h"
 
 namespace ns3
 {
@@ -41,76 +41,76 @@
     // inherited from Object
     void DoDispose() override;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
      *
-     * \param dev the UE NetDevice
+     * @param dev the UE NetDevice
      */
     void SetDevice(Ptr<NetDevice> dev);
 
     /**
      *
      *
-     * \param imsi the unique UE identifier
+     * @param imsi the unique UE identifier
      */
     void SetImsi(uint64_t imsi);
 
     /**
      *
-     * \param csgId Closed Subscriber Group identity
+     * @param csgId Closed Subscriber Group identity
      */
     void SetCsgId(uint32_t csgId);
 
     /**
      *
-     * \return csgId Closed Subscriber Group identity
+     * @return csgId Closed Subscriber Group identity
      */
     uint32_t GetCsgId() const;
 
     /**
      * Set the AS SAP provider to interact with the NAS entity
      *
-     * \param s the AS SAP provider
+     * @param s the AS SAP provider
      */
     void SetAsSapProvider(LteAsSapProvider* s);
 
     /**
      *
      *
-     * \return the AS SAP user exported by this RRC
+     * @return the AS SAP user exported by this RRC
      */
     LteAsSapUser* GetAsSapUser();
 
     /**
      * set the callback used to forward data packets up the stack
      *
-     * \param cb the callback
+     * @param cb the callback
      */
     void SetForwardUpCallback(Callback<void, Ptr<Packet>> cb);
 
     /**
-     * \brief Causes NAS to tell AS to find a suitable cell and camp to it.
+     * @brief Causes NAS to tell AS to find a suitable cell and camp to it.
      *
-     * \param dlEarfcn the DL frequency of the eNB
+     * @param dlEarfcn the DL frequency of the eNB
      */
     void StartCellSelection(uint32_t dlEarfcn);
 
     /**
-     * \brief Causes NAS to tell AS to go to ACTIVE state.
+     * @brief Causes NAS to tell AS to go to ACTIVE state.
      *
      * The end result is equivalent with EMM Registered + ECM Connected states.
      */
     void Connect();
 
     /**
-     * \brief Causes NAS to tell AS to camp to a specific cell and go to ACTIVE
+     * @brief Causes NAS to tell AS to camp to a specific cell and go to ACTIVE
      *        state.
-     * \param cellId the id of the eNB to camp on
-     * \param dlEarfcn the DL frequency of the eNB
+     * @param cellId the id of the eNB to camp on
+     * @param dlEarfcn the DL frequency of the eNB
      *
      * The end result is equivalent with EMM Registered + ECM Connected states.
      * Since RRC Idle Mode cell selection is not supported yet, we force the UE
@@ -127,18 +127,18 @@
     /**
      * Activate an EPS bearer
      *
-     * \param bearer the characteristics of the bearer to be created
-     * \param tft the TFT identifying the traffic that will go on this bearer
+     * @param bearer the characteristics of the bearer to be created
+     * @param tft the TFT identifying the traffic that will go on this bearer
      */
     void ActivateEpsBearer(EpsBearer bearer, Ptr<EpcTft> tft);
 
     /**
      * Enqueue an IP packet on the proper bearer for uplink transmission
      *
-     * \param p the packet
-     * \param protocolNumber the protocol number of the packet
+     * @param p the packet
+     * @param protocolNumber the protocol number of the packet
      *
-     * \return true if successful, false if an error occurred
+     * @return true if successful, false if an error occurred
      */
     bool Send(Ptr<Packet> p, uint16_t protocolNumber);
 
@@ -158,15 +158,15 @@
     };
 
     /**
-     * \return The current state
+     * @return The current state
      */
     State GetState() const;
 
     /**
      * TracedCallback signature for state change events.
      *
-     * \param [in] oldState The old State.
-     * \param [in] newState the new State.
+     * @param [in] oldState The old State.
+     * @param [in] newState the new State.
      */
     typedef void (*StateTracedCallback)(const State oldState, const State newState);
 
@@ -180,20 +180,20 @@
     void DoNotifyConnectionReleased();
     /**
      * Receive data
-     * \param packet the packet
+     * @param packet the packet
      */
     void DoRecvData(Ptr<Packet> packet);
 
     // internal methods
     /**
      * Activate EPS Bearer
-     * \param bearer the EPS bearer
-     * \param tft the EPC TFT
+     * @param bearer the EPS bearer
+     * @param tft the EPC TFT
      */
     void DoActivateEpsBearer(EpsBearer bearer, Ptr<EpcTft> tft);
     /**
      * Switch the UE RRC to the given state.
-     * \param s the destination state
+     * @param s the destination state
      */
     void SwitchToState(State s);
 
@@ -203,7 +203,7 @@
     /**
      * The `StateTransition` trace source. Fired upon every UE NAS state
      * transition. Exporting old state and new state.
-     * \todo This should be a TracedValue
+     * @todo This should be a TracedValue
      */
     TracedCallback<State, State> m_stateTransitionCallback;
 
@@ -243,6 +243,14 @@
     std::list<BearerToBeActivated> m_bearersToBeActivatedListForReconnection;
 };
 
+/**
+ * @brief Stream insertion operator.
+ * @param [in] os The reference to the output stream.
+ * @param [in] state The EpcUeNas::State.
+ * @return The reference to the output stream.
+ */
+std::ostream& operator<<(std::ostream& os, EpcUeNas::State state);
+
 } // namespace ns3
 
 #endif // EPC_UE_NAS_H
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/epc-x2.h ns-3.44/src/lte/model/epc-x2.h
--- ns-3.43/src/lte/model/epc-x2.h	2024-10-09 16:41:09.932656000 -0700
+++ ns-3.44/src/lte/model/epc-x2.h	2025-03-09 16:55:49.487371400 -0700
@@ -30,9 +30,9 @@
     /**
      * Constructor
      *
-     * \param remoteIpAddr remote IP address
-     * \param localCtrlPlaneSocket control plane socket
-     * \param localUserPlaneSocket user plane socket
+     * @param remoteIpAddr remote IP address
+     * @param localCtrlPlaneSocket control plane socket
+     * @param localUserPlaneSocket user plane socket
      */
     X2IfaceInfo(Ipv4Address remoteIpAddr,
                 Ptr<Socket> localCtrlPlaneSocket,
@@ -41,8 +41,8 @@
 
     /**
      * Assignment operator
-     * \param value value to assign
-     * \returns X2IfaceInfo&
+     * @param value value to assign
+     * @returns X2IfaceInfo&
      */
     X2IfaceInfo& operator=(const X2IfaceInfo& value);
 
@@ -61,16 +61,16 @@
     /**
      * Constructor
      *
-     * \param localCellIds local cell IDs
-     * \param remoteCellIds remote cell IDs
+     * @param localCellIds local cell IDs
+     * @param remoteCellIds remote cell IDs
      */
     X2CellInfo(std::vector<uint16_t> localCellIds, std::vector<uint16_t> remoteCellIds);
     virtual ~X2CellInfo();
 
     /**
      * Assignment operator
-     * \param value value to assign
-     * \returns X2CellInfo&
+     * @param value value to assign
+     * @returns X2CellInfo&
      */
     X2CellInfo& operator=(const X2CellInfo& value);
 
@@ -80,7 +80,7 @@
 };
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
  * This entity is installed inside an eNB and provides the functionality for the X2 interface
  */
@@ -101,28 +101,28 @@
     ~EpcX2() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     void DoDispose() override;
 
     /**
-     * \param s the X2 SAP User to be used by this EPC X2 entity
+     * @param s the X2 SAP User to be used by this EPC X2 entity
      */
     void SetEpcX2SapUser(EpcX2SapUser* s);
 
     /**
-     * \return the X2 SAP Provider interface offered by this EPC X2 entity
+     * @return the X2 SAP Provider interface offered by this EPC X2 entity
      */
     EpcX2SapProvider* GetEpcX2SapProvider();
 
     /**
      * Add an X2 interface to this EPC X2 entity
-     * \param enb1CellId the cell ID of the current eNodeB
-     * \param enb1X2Address the address of the current eNodeB
-     * \param enb2CellIds the cell IDs of the neighbouring eNodeB
-     * \param enb2X2Address the address of the neighbouring eNodeB
+     * @param enb1CellId the cell ID of the current eNodeB
+     * @param enb1X2Address the address of the current eNodeB
+     * @param enb2CellIds the cell IDs of the neighbouring eNodeB
+     * @param enb2X2Address the address of the neighbouring eNodeB
      */
     void AddX2Interface(uint16_t enb1CellId,
                         Ipv4Address enb1X2Address,
@@ -133,7 +133,7 @@
      * Method to be assigned to the recv callback of the X2-C (X2 Control Plane) socket.
      * It is called when the eNB receives a packet from the peer eNB of the X2-C interface
      *
-     * \param socket socket of the X2-C interface
+     * @param socket socket of the X2-C interface
      */
     void RecvFromX2cSocket(Ptr<Socket> socket);
 
@@ -141,7 +141,7 @@
      * Method to be assigned to the recv callback of the X2-U (X2 User Plane) socket.
      * It is called when the eNB receives a packet from the peer eNB of the X2-U interface
      *
-     * \param socket socket of the X2-U interface
+     * @param socket socket of the X2-U interface
      */
     void RecvFromX2uSocket(Ptr<Socket> socket);
 
@@ -149,49 +149,49 @@
     // Interface provided by EpcX2SapProvider
     /**
      * Send handover request function
-     * \param params the send handover request parameters
+     * @param params the send handover request parameters
      */
     virtual void DoSendHandoverRequest(EpcX2SapProvider::HandoverRequestParams params);
     /**
      * Send handover request ack function
-     * \param params the send handover request ack parameters
+     * @param params the send handover request ack parameters
      */
     virtual void DoSendHandoverRequestAck(EpcX2SapProvider::HandoverRequestAckParams params);
     /**
      * Send handover preparation failure function
-     * \param params the handover preparation failure parameters
+     * @param params the handover preparation failure parameters
      */
     virtual void DoSendHandoverPreparationFailure(
         EpcX2SapProvider::HandoverPreparationFailureParams params);
     /**
      * Send SN status transfer function
-     * \param params the SN status transfer parameters
+     * @param params the SN status transfer parameters
      */
     virtual void DoSendSnStatusTransfer(EpcX2SapProvider::SnStatusTransferParams params);
     /**
      * Send UE context release function
-     * \param params the UE context release parameters
+     * @param params the UE context release parameters
      */
     virtual void DoSendUeContextRelease(EpcX2SapProvider::UeContextReleaseParams params);
     /**
      * Send load information function
-     * \param params the send load information parameters
+     * @param params the send load information parameters
      */
     virtual void DoSendLoadInformation(EpcX2SapProvider::LoadInformationParams params);
     /**
      * Send resource status update function
-     * \param params the send resource status update parameters
+     * @param params the send resource status update parameters
      */
     virtual void DoSendResourceStatusUpdate(EpcX2SapProvider::ResourceStatusUpdateParams params);
     /**
      * Send UE data function
      *
-     * \param params EpcX2SapProvider::UeDataParams
+     * @param params EpcX2SapProvider::UeDataParams
      */
     virtual void DoSendUeData(EpcX2SapProvider::UeDataParams params);
     /**
-     * \brief Send Handover Cancel function
-     * \param params the handover cancel parameters
+     * @brief Send Handover Cancel function
+     * @param params the handover cancel parameters
      *
      */
     virtual void DoSendHandoverCancel(EpcX2SapProvider::HandoverCancelParams params);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/epc-x2-header.h ns-3.44/src/lte/model/epc-x2-header.h
--- ns-3.43/src/lte/model/epc-x2-header.h	2024-10-09 16:41:09.932656000 -0700
+++ ns-3.44/src/lte/model/epc-x2-header.h	2025-03-09 16:55:49.487371400 -0700
@@ -25,8 +25,8 @@
     ~EpcX2Header() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -37,34 +37,34 @@
 
     /**
      * Get message type function
-     * \returns the message type
+     * @returns the message type
      */
     uint8_t GetMessageType() const;
     /**
      * Set message type function
-     * \param messageType the message type
+     * @param messageType the message type
      */
     void SetMessageType(uint8_t messageType);
 
     /**
      * Get procedure code function
-     * \returns the procedure code
+     * @returns the procedure code
      */
     uint8_t GetProcedureCode() const;
     /**
      * Set procedure code function
-     * \param procedureCode the procedure code
+     * @param procedureCode the procedure code
      */
     void SetProcedureCode(uint8_t procedureCode);
 
     /**
      * Set length of IEs function
-     * \param lengthOfIes the length of IEs
+     * @param lengthOfIes the length of IEs
      */
     void SetLengthOfIes(uint32_t lengthOfIes);
     /**
      * Set number of IEs function
-     * \param numberOfIes the number of IEs
+     * @param numberOfIes the number of IEs
      */
     void SetNumberOfIes(uint32_t numberOfIes);
 
@@ -105,8 +105,8 @@
     ~EpcX2HandoverRequestHeader() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -117,89 +117,89 @@
 
     /**
      * Get old ENB X2 AP ID function
-     * \returns the old ENB UE X2 AP ID
+     * @returns the old ENB UE X2 AP ID
      */
     uint16_t GetOldEnbUeX2apId() const;
     /**
      * Set old ENB X2 AP ID function
-     * \param x2apId the X2 AP ID
+     * @param x2apId the X2 AP ID
      */
     void SetOldEnbUeX2apId(uint16_t x2apId);
 
     /**
      * Get cause function
-     * \returns the cause
+     * @returns the cause
      */
     uint16_t GetCause() const;
     /**
      * Set cause function
-     * \param cause
+     * @param cause
      */
     void SetCause(uint16_t cause);
 
     /**
      * Get target cell id function
-     * \returns the target cell ID
+     * @returns the target cell ID
      */
     uint16_t GetTargetCellId() const;
     /**
      * Set target cell id function
-     * \param targetCellId the target cell ID
+     * @param targetCellId the target cell ID
      */
     void SetTargetCellId(uint16_t targetCellId);
 
     /**
      * Get MME UE S1 AP ID function
-     * \returns the MME UE S1 AP ID
+     * @returns the MME UE S1 AP ID
      */
     uint32_t GetMmeUeS1apId() const;
     /**
      * Set MME UE S1 AP ID function
-     * \param mmeUeS1apId the MME UE S1 AP ID
+     * @param mmeUeS1apId the MME UE S1 AP ID
      */
     void SetMmeUeS1apId(uint32_t mmeUeS1apId);
 
     /**
      * Get bearers function
-     * \returns <EpcX2Sap::ErabToBeSetupItem>
+     * @returns <EpcX2Sap::ErabToBeSetupItem>
      */
     std::vector<EpcX2Sap::ErabToBeSetupItem> GetBearers() const;
     /**
      * Set bearers function
-     * \param bearers std::vector <EpcX2Sap::ErabToBeSetupItem>
+     * @param bearers std::vector <EpcX2Sap::ErabToBeSetupItem>
      */
     void SetBearers(std::vector<EpcX2Sap::ErabToBeSetupItem> bearers);
 
     /**
      * Get UE Aggregate Max Bit Rate Downlink function
-     * \returns the UE aggregate max bit rate downlink
+     * @returns the UE aggregate max bit rate downlink
      */
     uint64_t GetUeAggregateMaxBitRateDownlink() const;
     /**
      * Set UE Aggregate Max Bit Rate Downlink function
-     * \param bitRate the bit rate
+     * @param bitRate the bit rate
      */
     void SetUeAggregateMaxBitRateDownlink(uint64_t bitRate);
 
     /**
      * Get UE Aggregate Max Bit Rate Uplik function
-     * \returns the UE aggregate max bit rate uplink
+     * @returns the UE aggregate max bit rate uplink
      */
     uint64_t GetUeAggregateMaxBitRateUplink() const;
     /**
      * Set UE Aggregate Max Bit Rate Uplik function
-     * \param bitRate the bit rate
+     * @param bitRate the bit rate
      */
     void SetUeAggregateMaxBitRateUplink(uint64_t bitRate);
 
     /**
      * Get length of IEs
-     * \returns the length of IEs
+     * @returns the length of IEs
      */
     uint32_t GetLengthOfIes() const;
     /**
      * Get number of IEs
-     * \returns the number of IEs
+     * @returns the number of IEs
      */
     uint32_t GetNumberOfIes() const;
 
@@ -226,8 +226,8 @@
     ~EpcX2HandoverRequestAckHeader() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -238,56 +238,56 @@
 
     /**
      * Get old ENB UE X2 AP ID function
-     * \returns the old ENB UE X2 AP ID
+     * @returns the old ENB UE X2 AP ID
      */
     uint16_t GetOldEnbUeX2apId() const;
     /**
      * Set old ENB UE X2 AP ID function
-     * \param x2apId the old ENB UE X2 AP ID
+     * @param x2apId the old ENB UE X2 AP ID
      */
     void SetOldEnbUeX2apId(uint16_t x2apId);
 
     /**
      * Get new ENB UE X2 AP ID function
-     * \returns the new ENB UE X2 AP ID
+     * @returns the new ENB UE X2 AP ID
      */
     uint16_t GetNewEnbUeX2apId() const;
     /**
      * Set new ENB UE X2 AP ID function
-     * \param x2apId the new ENB UE X2 AP ID
+     * @param x2apId the new ENB UE X2 AP ID
      */
     void SetNewEnbUeX2apId(uint16_t x2apId);
 
     /**
      * Get admittied bearers function
-     * \returns <EpcX2Sap::ErabAdmittedItem>
+     * @returns <EpcX2Sap::ErabAdmittedItem>
      */
     std::vector<EpcX2Sap::ErabAdmittedItem> GetAdmittedBearers() const;
     /**
      * Set admitted bearers function
-     * \param bearers the admitted bearers
+     * @param bearers the admitted bearers
      */
     void SetAdmittedBearers(std::vector<EpcX2Sap::ErabAdmittedItem> bearers);
 
     /**
      * Get not admitted bearers function
-     * \returns the not admitted bearers
+     * @returns the not admitted bearers
      */
     std::vector<EpcX2Sap::ErabNotAdmittedItem> GetNotAdmittedBearers() const;
     /**
      * Set not admitted bearers function
-     * \param bearers the not admitted bearers
+     * @param bearers the not admitted bearers
      */
     void SetNotAdmittedBearers(std::vector<EpcX2Sap::ErabNotAdmittedItem> bearers);
 
     /**
      * Get length of IEs function
-     * \returns the length of IEs
+     * @returns the length of IEs
      */
     uint32_t GetLengthOfIes() const;
     /**
      * Get number of IEs function
-     * \returns the number of IEs
+     * @returns the number of IEs
      */
     uint32_t GetNumberOfIes() const;
 
@@ -311,8 +311,8 @@
     ~EpcX2HandoverPreparationFailureHeader() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -323,45 +323,45 @@
 
     /**
      * Get old ENB UE X2 AP ID function
-     * \returns the old ENB UE X2 AP ID
+     * @returns the old ENB UE X2 AP ID
      */
     uint16_t GetOldEnbUeX2apId() const;
     /**
      * Set old ENB UE X2 AP ID function
-     * \param x2apId the old ENB UE X2 AP ID
+     * @param x2apId the old ENB UE X2 AP ID
      */
     void SetOldEnbUeX2apId(uint16_t x2apId);
 
     /**
      * Get cause function
-     * \returns the cause
+     * @returns the cause
      */
     uint16_t GetCause() const;
     /**
      * Set cause function
-     * \param cause
+     * @param cause
      */
     void SetCause(uint16_t cause);
 
     /**
      * Get criticality diagnostics function
-     * \returns the criticality diagnostics
+     * @returns the criticality diagnostics
      */
     uint16_t GetCriticalityDiagnostics() const;
     /**
      * Set criticality diagnostics function
-     * \param criticalityDiagnostics the criticality diagnostics
+     * @param criticalityDiagnostics the criticality diagnostics
      */
     void SetCriticalityDiagnostics(uint16_t criticalityDiagnostics);
 
     /**
      * Get length of IEs function
-     * \returns the length of IEs
+     * @returns the length of IEs
      */
     uint32_t GetLengthOfIes() const;
     /**
      * Get number of IEs function
-     * \returns the number of IEs
+     * @returns the number of IEs
      */
     uint32_t GetNumberOfIes() const;
 
@@ -384,8 +384,8 @@
     ~EpcX2SnStatusTransferHeader() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -396,47 +396,47 @@
 
     /**
      * Get old ENB UE X2 AP ID function
-     * \returns the old ENB UE X2 AP ID
+     * @returns the old ENB UE X2 AP ID
      */
     uint16_t GetOldEnbUeX2apId() const;
     /**
      * Set old ENB UE X2 AP ID function
-     * \param x2apId the old ENB UE X2 AP ID
+     * @param x2apId the old ENB UE X2 AP ID
      */
     void SetOldEnbUeX2apId(uint16_t x2apId);
 
     /**
      * Get new ENB UE X2 AP ID function
-     * \returns the new ENB UE X2AP ID
+     * @returns the new ENB UE X2AP ID
      */
     uint16_t GetNewEnbUeX2apId() const;
     /**
      * Set new ENB UE X2 AP ID function
-     * \param x2apId the new ENB UE X2AP ID
+     * @param x2apId the new ENB UE X2AP ID
      */
     void SetNewEnbUeX2apId(uint16_t x2apId);
 
     /**
      * Get ERABs subject to status transfer list function
-     * \returns std::vector <EpcX2Sap::ErabsSubjectToStatusTransferItem>
+     * @returns std::vector <EpcX2Sap::ErabsSubjectToStatusTransferItem>
      */
     std::vector<EpcX2Sap::ErabsSubjectToStatusTransferItem> GetErabsSubjectToStatusTransferList()
         const;
     /**
      * Set ERABs subject to status transfer list function
-     * \param erabs std::vector <EpcX2Sap::ErabsSubjectToStatusTransferItem>
+     * @param erabs std::vector <EpcX2Sap::ErabsSubjectToStatusTransferItem>
      */
     void SetErabsSubjectToStatusTransferList(
         std::vector<EpcX2Sap::ErabsSubjectToStatusTransferItem> erabs);
 
     /**
      * Get length of IEs function
-     * \returns the length of IEs
+     * @returns the length of IEs
      */
     uint32_t GetLengthOfIes() const;
     /**
      * Get number of IEs function
-     * \returns the number of IEs
+     * @returns the number of IEs
      */
     uint32_t GetNumberOfIes() const;
 
@@ -460,8 +460,8 @@
     ~EpcX2UeContextReleaseHeader() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -472,34 +472,34 @@
 
     /**
      * Get old ENB UE X2 AP ID function
-     * \returns the old ENB UE X2 AP ID
+     * @returns the old ENB UE X2 AP ID
      */
     uint16_t GetOldEnbUeX2apId() const;
     /**
      * Set old ENB UE X2 AP ID function
-     * \param x2apId the old ENB UE X2 AP ID
+     * @param x2apId the old ENB UE X2 AP ID
      */
     void SetOldEnbUeX2apId(uint16_t x2apId);
 
     /**
      * Get new ENB UE X2 AP ID function
-     * \returns the new ENB UE X2 AP ID
+     * @returns the new ENB UE X2 AP ID
      */
     uint16_t GetNewEnbUeX2apId() const;
     /**
      * Set new ENB UE X2 AP ID function
-     * \param x2apId the new ENB UE X2 AP ID
+     * @param x2apId the new ENB UE X2 AP ID
      */
     void SetNewEnbUeX2apId(uint16_t x2apId);
 
     /**
      * Get length of IEs function
-     * \returns the length of IEs
+     * @returns the length of IEs
      */
     uint32_t GetLengthOfIes() const;
     /**
      * Set length of IEs function
-     * \returns the number of IEs
+     * @returns the number of IEs
      */
     uint32_t GetNumberOfIes() const;
 
@@ -521,8 +521,8 @@
     ~EpcX2LoadInformationHeader() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -533,23 +533,23 @@
 
     /**
      * Get cell information list function
-     * \returns std::vector <EpcX2Sap::CellInformationItem>
+     * @returns std::vector <EpcX2Sap::CellInformationItem>
      */
     std::vector<EpcX2Sap::CellInformationItem> GetCellInformationList() const;
     /**
      * Set cell information list function
-     * \param cellInformationList std::vector <EpcX2Sap::CellInformationItem>
+     * @param cellInformationList std::vector <EpcX2Sap::CellInformationItem>
      */
     void SetCellInformationList(std::vector<EpcX2Sap::CellInformationItem> cellInformationList);
 
     /**
      * Get length of IEs function
-     * \returns the length of IEs
+     * @returns the length of IEs
      */
     uint32_t GetLengthOfIes() const;
     /**
      * Get number of IEs function
-     * \returns the number of IEs
+     * @returns the number of IEs
      */
     uint32_t GetNumberOfIes() const;
 
@@ -570,8 +570,8 @@
     ~EpcX2ResourceStatusUpdateHeader() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -582,46 +582,46 @@
 
     /**
      * Get ENB1 measurement ID function
-     * \returns the ENB1 measurement ID
+     * @returns the ENB1 measurement ID
      */
     uint16_t GetEnb1MeasurementId() const;
     /**
      * Set ENB1 measurement ID function
-     * \param enb1MeasurementId the ENB1 measurement ID
+     * @param enb1MeasurementId the ENB1 measurement ID
      */
     void SetEnb1MeasurementId(uint16_t enb1MeasurementId);
 
     /**
      * Get ENB2 measurement ID function
-     * \returns the ENB2 measurement ID
+     * @returns the ENB2 measurement ID
      */
     uint16_t GetEnb2MeasurementId() const;
     /**
      * Set ENB2 measurement ID function
-     * \param enb2MeasurementId ENB2 measruement ID
+     * @param enb2MeasurementId ENB2 measruement ID
      */
     void SetEnb2MeasurementId(uint16_t enb2MeasurementId);
 
     /**
      * Get cell measurement results list function
-     * \returns the cell measurement results list
+     * @returns the cell measurement results list
      */
     std::vector<EpcX2Sap::CellMeasurementResultItem> GetCellMeasurementResultList() const;
     /**
      * Set cell measurement results list function
-     * \param cellMeasurementResultList the cell measurement results list
+     * @param cellMeasurementResultList the cell measurement results list
      */
     void SetCellMeasurementResultList(
         std::vector<EpcX2Sap::CellMeasurementResultItem> cellMeasurementResultList);
 
     /**
      * Get length of IEs function
-     * \returns the length of IEs
+     * @returns the length of IEs
      */
     uint32_t GetLengthOfIes() const;
     /**
      * Get number of IEs function
-     * \returns the number of IEs
+     * @returns the number of IEs
      */
     uint32_t GetNumberOfIes() const;
 
@@ -645,8 +645,8 @@
     ~EpcX2HandoverCancelHeader() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -656,46 +656,46 @@
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Get old ENB UE X2 AP ID function
-     * \returns the old ENB UE X2 AP ID
+     * @brief Get old ENB UE X2 AP ID function
+     * @returns the old ENB UE X2 AP ID
      */
     uint16_t GetOldEnbUeX2apId() const;
     /**
-     * \brief Set old ENB UE X2 AP ID function
-     * \param x2apId the old ENB UE X2 AP ID
+     * @brief Set old ENB UE X2 AP ID function
+     * @param x2apId the old ENB UE X2 AP ID
      */
     void SetOldEnbUeX2apId(uint16_t x2apId);
 
     /**
-     * \brief Get new ENB UE X2 AP ID function
-     * \returns the new ENB UE X2 AP ID
+     * @brief Get new ENB UE X2 AP ID function
+     * @returns the new ENB UE X2 AP ID
      */
     uint16_t GetNewEnbUeX2apId() const;
     /**
-     * \brief Set new ENB UE X2 AP ID function
-     * \param x2apId the new ENB UE X2 AP ID
+     * @brief Set new ENB UE X2 AP ID function
+     * @param x2apId the new ENB UE X2 AP ID
      */
     void SetNewEnbUeX2apId(uint16_t x2apId);
 
     /**
-     * \brief Get cause function
-     * \returns the cause
+     * @brief Get cause function
+     * @returns the cause
      */
     uint16_t GetCause() const;
     /**
-     * \brief Set cause function
-     * \param cause
+     * @brief Set cause function
+     * @param cause
      */
     void SetCause(uint16_t cause);
 
     /**
-     * \brief Get length of IEs function
-     * \returns the length of IEs
+     * @brief Get length of IEs function
+     * @returns the length of IEs
      */
     uint32_t GetLengthOfIes() const;
     /**
-     * \brief Get number of IEs function
-     * \returns the number of IEs
+     * @brief Get number of IEs function
+     * @returns the number of IEs
      */
     uint32_t GetNumberOfIes() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/epc-x2-sap.h ns-3.44/src/lte/model/epc-x2-sap.h
--- ns-3.43/src/lte/model/epc-x2-sap.h	2024-10-09 16:41:09.932656000 -0700
+++ ns-3.44/src/lte/model/epc-x2-sap.h	2025-03-09 16:55:49.487371400 -0700
@@ -33,7 +33,7 @@
  */
 
 /**
- * \brief Common structures for EpcX2SapProvider and EpcX2SapUser
+ * @brief Common structures for EpcX2SapProvider and EpcX2SapUser
  */
 class EpcX2Sap
 {
@@ -211,7 +211,7 @@
     };
 
     /**
-     * \brief Parameters of the HANDOVER REQUEST message.
+     * @brief Parameters of the HANDOVER REQUEST message.
      *
      * See section 9.1.1.1 for further info about the parameters
      */
@@ -229,7 +229,7 @@
     };
 
     /**
-     * \brief Parameters of the HANDOVER REQUEST ACKNOWLEDGE message.
+     * @brief Parameters of the HANDOVER REQUEST ACKNOWLEDGE message.
      *
      * See section 9.1.1.2 for further info about the parameters
      */
@@ -245,7 +245,7 @@
     };
 
     /**
-     * \brief Parameters of the HANDOVER PREPARATION FAILURE message.
+     * @brief Parameters of the HANDOVER PREPARATION FAILURE message.
      *
      * See section 9.1.1.3 for further info about the parameters
      */
@@ -259,7 +259,7 @@
     };
 
     /**
-     * \brief Parameters of the SN STATUS TRANSFER message.
+     * @brief Parameters of the SN STATUS TRANSFER message.
      *
      * See section 9.1.1.4 for further info about the parameters
      */
@@ -274,7 +274,7 @@
     };
 
     /**
-     * \brief Parameters of the UE CONTEXT RELEASE message.
+     * @brief Parameters of the UE CONTEXT RELEASE message.
      *
      * See section 9.1.1.5 for further info about the parameters
      */
@@ -287,7 +287,7 @@
     };
 
     /**
-     * \brief Parameters of the LOAD INFORMATION message.
+     * @brief Parameters of the LOAD INFORMATION message.
      *
      * See section 9.1.2.1 for further info about the parameters
      */
@@ -298,7 +298,7 @@
     };
 
     /**
-     * \brief Parameters of the RESOURCE STATUS UPDATE message.
+     * @brief Parameters of the RESOURCE STATUS UPDATE message.
      *
      * See section 9.1.2.14 for further info about the parameters
      */
@@ -312,7 +312,7 @@
     };
 
     /**
-     * \brief Parameters of the UE DATA primitive
+     * @brief Parameters of the UE DATA primitive
      *
      * Forward UE data during the handover procedure from source eNB (sourceCellId)
      * to target eNB (targetCellId) using a GTP-U tunnel (gtpTeid)
@@ -326,7 +326,7 @@
     };
 
     /**
-     * \brief Parameters of the HANDOVER CANCEL message.
+     * @brief Parameters of the HANDOVER CANCEL message.
      *
      * See section 9.1.1.6 for further info about the parameters
      */
@@ -355,55 +355,55 @@
 
     /**
      * Send handover request function
-     * \param params handover request parameters
+     * @param params handover request parameters
      */
     virtual void SendHandoverRequest(HandoverRequestParams params) = 0;
 
     /**
      * Send handover request ack function
-     * \param params the handover request ack parameters
+     * @param params the handover request ack parameters
      */
     virtual void SendHandoverRequestAck(HandoverRequestAckParams params) = 0;
 
     /**
      * Send handover preparation failure function
-     * \param params the handover preparation failure
+     * @param params the handover preparation failure
      */
     virtual void SendHandoverPreparationFailure(HandoverPreparationFailureParams params) = 0;
 
     /**
      * Send SN status transfer function
-     * \param params the SN status transfer parameters
+     * @param params the SN status transfer parameters
      */
     virtual void SendSnStatusTransfer(SnStatusTransferParams params) = 0;
 
     /**
      * Send UE context release function
-     * \param params the UE context release parameters
+     * @param params the UE context release parameters
      */
     virtual void SendUeContextRelease(UeContextReleaseParams params) = 0;
 
     /**
      * Send load information function
-     * \param params the load information parameters
+     * @param params the load information parameters
      */
     virtual void SendLoadInformation(LoadInformationParams params) = 0;
 
     /**
      * Send resource status update function
-     * \param params the resource statue update parameters
+     * @param params the resource statue update parameters
      */
     virtual void SendResourceStatusUpdate(ResourceStatusUpdateParams params) = 0;
 
     /**
      * Send UE data function
-     * \param params the UE data parameters
+     * @param params the UE data parameters
      */
     virtual void SendUeData(UeDataParams params) = 0;
 
     /**
-     * \brief Send handover Cancel to the target eNB
-     * \param params the handover cancel parameters
+     * @brief Send handover Cancel to the target eNB
+     * @param params the handover cancel parameters
      */
     virtual void SendHandoverCancel(HandoverCancelParams params) = 0;
 };
@@ -423,55 +423,55 @@
 
     /**
      * Receive handover request function
-     * \param params the handover request parameters
+     * @param params the handover request parameters
      */
     virtual void RecvHandoverRequest(HandoverRequestParams params) = 0;
 
     /**
      * Receive handover request ack function
-     * \param params the handover request ack parameters
+     * @param params the handover request ack parameters
      */
     virtual void RecvHandoverRequestAck(HandoverRequestAckParams params) = 0;
 
     /**
      * Receive handover preparation failure function
-     * \param params the handover preparation failure parameters
+     * @param params the handover preparation failure parameters
      */
     virtual void RecvHandoverPreparationFailure(HandoverPreparationFailureParams params) = 0;
 
     /**
      * Receive SN status transfer function
-     * \param params the SN status transfer parameters
+     * @param params the SN status transfer parameters
      */
     virtual void RecvSnStatusTransfer(SnStatusTransferParams params) = 0;
 
     /**
      * Receive UE context release function
-     * \param params the receive UE context release parameters
+     * @param params the receive UE context release parameters
      */
     virtual void RecvUeContextRelease(UeContextReleaseParams params) = 0;
 
     /**
      * Receive load information function
-     * \param params the load information parameters
+     * @param params the load information parameters
      */
     virtual void RecvLoadInformation(LoadInformationParams params) = 0;
 
     /**
      * Receive resource status update function
-     * \param params the resource status update parameters
+     * @param params the resource status update parameters
      */
     virtual void RecvResourceStatusUpdate(ResourceStatusUpdateParams params) = 0;
 
     /**
      * Receive UE data function
-     * \param params UE data parameters
+     * @param params UE data parameters
      */
     virtual void RecvUeData(UeDataParams params) = 0;
 
     /**
      * Receive handover cancel function
-     * \param params the receive handover cancel parameters
+     * @param params the receive handover cancel parameters
      *
      */
     virtual void RecvHandoverCancel(HandoverCancelParams params) = 0;
@@ -489,7 +489,7 @@
     /**
      * Constructor
      *
-     * \param x2 the owner class
+     * @param x2 the owner class
      */
     EpcX2SpecificEpcX2SapProvider(C* x2);
 
@@ -502,55 +502,55 @@
 
     /**
      * Send handover request function
-     * \param params the handover request parameters
+     * @param params the handover request parameters
      */
     void SendHandoverRequest(HandoverRequestParams params) override;
 
     /**
      * Send handover request ack function
-     * \param params the handover request ack parameters
+     * @param params the handover request ack parameters
      */
     void SendHandoverRequestAck(HandoverRequestAckParams params) override;
 
     /**
      * Send handover preparation failure function
-     * \param params the handover preparation failure parameters
+     * @param params the handover preparation failure parameters
      */
     void SendHandoverPreparationFailure(HandoverPreparationFailureParams params) override;
 
     /**
      * Send SN status transfer function
-     * \param params the SN status transfer parameters
+     * @param params the SN status transfer parameters
      */
     void SendSnStatusTransfer(SnStatusTransferParams params) override;
 
     /**
      * Send UE context release function
-     * \param params the UE context release parameters
+     * @param params the UE context release parameters
      */
     void SendUeContextRelease(UeContextReleaseParams params) override;
 
     /**
      * Send load information function
-     * \param params the load information parameters
+     * @param params the load information parameters
      */
     void SendLoadInformation(LoadInformationParams params) override;
 
     /**
      * Send resource status update function
-     * \param params the resource status update parameters
+     * @param params the resource status update parameters
      */
     void SendResourceStatusUpdate(ResourceStatusUpdateParams params) override;
 
     /**
      * Send UE data function
-     * \param params the UE data parameters
+     * @param params the UE data parameters
      */
     void SendUeData(UeDataParams params) override;
 
     /**
-     * \brief Send handover Cancel to the target eNB
-     * \param params the handover cancel parameters
+     * @brief Send handover Cancel to the target eNB
+     * @param params the handover cancel parameters
      */
     void SendHandoverCancel(HandoverCancelParams params) override;
 
@@ -638,7 +638,7 @@
     /**
      * Constructor
      *
-     * \param rrc RRC
+     * @param rrc RRC
      */
     EpcX2SpecificEpcX2SapUser(C* rrc);
 
@@ -651,55 +651,55 @@
 
     /**
      * Receive handover request function
-     * \param params the receive handover request parameters
+     * @param params the receive handover request parameters
      */
     void RecvHandoverRequest(HandoverRequestParams params) override;
 
     /**
      * Receive handover request ack function
-     * \param params the receive handover request ack parameters
+     * @param params the receive handover request ack parameters
      */
     void RecvHandoverRequestAck(HandoverRequestAckParams params) override;
 
     /**
      * Receive handover preparation failure function
-     * \param params the receive handover preparation failure parameters
+     * @param params the receive handover preparation failure parameters
      */
     void RecvHandoverPreparationFailure(HandoverPreparationFailureParams params) override;
 
     /**
      * Receive SN status transfer function
-     * \param params the SN status transfer parameters
+     * @param params the SN status transfer parameters
      */
     void RecvSnStatusTransfer(SnStatusTransferParams params) override;
 
     /**
      * Receive UE context release function
-     * \param params the UE context release parameters
+     * @param params the UE context release parameters
      */
     void RecvUeContextRelease(UeContextReleaseParams params) override;
 
     /**
      * Receive load information function
-     * \param params the load information parameters
+     * @param params the load information parameters
      */
     void RecvLoadInformation(LoadInformationParams params) override;
 
     /**
      * Receive resource status update function
-     * \param params the receive resource status update
+     * @param params the receive resource status update
      */
     void RecvResourceStatusUpdate(ResourceStatusUpdateParams params) override;
 
     /**
      * Receive UE data function
-     * \param params the UE data parameters
+     * @param params the UE data parameters
      */
     void RecvUeData(UeDataParams params) override;
 
     /**
      * Receive handover cancel function
-     * \param params the receive handover cancel parameters
+     * @param params the receive handover cancel parameters
      *
      */
     void RecvHandoverCancel(HandoverCancelParams params) override;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/eps-bearer.cc ns-3.44/src/lte/model/eps-bearer.cc
--- ns-3.43/src/lte/model/eps-bearer.cc	2024-10-09 16:41:09.932656000 -0700
+++ ns-3.44/src/lte/model/eps-bearer.cc	2025-03-09 16:55:49.487371400 -0700
@@ -8,8 +8,8 @@
 
 #include "eps-bearer.h"
 
-#include <ns3/attribute-construction-list.h>
-#include <ns3/fatal-error.h>
+#include "ns3/attribute-construction-list.h"
+#include "ns3/fatal-error.h"
 
 namespace ns3
 {
@@ -138,27 +138,16 @@
 const EpsBearer::BearerRequirementsMap&
 EpsBearer::GetRequirementsRel11()
 {
-    /* Needed to support GCC 4.9. Otherwise, use list constructors, for example:
-     * EpsBearer::BearerRequirementsMap
-     * EpsBearer::GetRequirementsRel15 ()
-     * {
-     *   return
-     *     {
-     *       { GBR_CONV_VOICE          , { 1,  20, 100, 1.0e-2,    0, 2000} },
-     *       ...
-     *     };
-     * }
-     */
     static EpsBearer::BearerRequirementsMap ret{
-        {GBR_CONV_VOICE, std::make_tuple(1, 2, 100, 1.0e-2, 0, 0)},
-        {GBR_CONV_VIDEO, std::make_tuple(1, 4, 150, 1.0e-3, 0, 0)},
-        {GBR_GAMING, std::make_tuple(1, 3, 50, 1.0e-3, 0, 0)},
-        {GBR_NON_CONV_VIDEO, std::make_tuple(1, 5, 300, 1.0e-6, 0, 0)},
-        {NGBR_IMS, std::make_tuple(0, 1, 100, 1.0e-6, 0, 0)},
-        {NGBR_VIDEO_TCP_OPERATOR, std::make_tuple(0, 6, 300, 1.0e-6, 0, 0)},
-        {NGBR_VOICE_VIDEO_GAMING, std::make_tuple(0, 7, 100, 1.0e-3, 0, 0)},
-        {NGBR_VIDEO_TCP_PREMIUM, std::make_tuple(0, 8, 300, 1.0e-6, 0, 0)},
-        {NGBR_VIDEO_TCP_DEFAULT, std::make_tuple(0, 9, 300, 1.0e-6, 0, 0)},
+        {GBR_CONV_VOICE, {1, 2, 100, 1.0e-2, 0, 0}},
+        {GBR_CONV_VIDEO, {1, 4, 150, 1.0e-3, 0, 0}},
+        {GBR_GAMING, {1, 3, 50, 1.0e-3, 0, 0}},
+        {GBR_NON_CONV_VIDEO, {1, 5, 300, 1.0e-6, 0, 0}},
+        {NGBR_IMS, {0, 1, 100, 1.0e-6, 0, 0}},
+        {NGBR_VIDEO_TCP_OPERATOR, {0, 6, 300, 1.0e-6, 0, 0}},
+        {NGBR_VOICE_VIDEO_GAMING, {0, 7, 100, 1.0e-3, 0, 0}},
+        {NGBR_VIDEO_TCP_PREMIUM, {0, 8, 300, 1.0e-6, 0, 0}},
+        {NGBR_VIDEO_TCP_DEFAULT, {0, 9, 300, 1.0e-6, 0, 0}},
     };
     return ret;
 }
@@ -166,29 +155,28 @@
 const EpsBearer::BearerRequirementsMap&
 EpsBearer::GetRequirementsRel15()
 {
-    // Needed to support GCC 4.9. Otherwise, use list constructors (see GetRequirementsRel10)
     static EpsBearer::BearerRequirementsMap ret{
-        {GBR_CONV_VOICE, std::make_tuple(1, 20, 100, 1.0e-2, 0, 2000)},
-        {GBR_CONV_VIDEO, std::make_tuple(1, 40, 150, 1.0e-3, 0, 2000)},
-        {GBR_GAMING, std::make_tuple(1, 30, 50, 1.0e-3, 0, 2000)},
-        {GBR_NON_CONV_VIDEO, std::make_tuple(1, 50, 300, 1.0e-6, 0, 2000)},
-        {GBR_MC_PUSH_TO_TALK, std::make_tuple(1, 7, 75, 1.0e-2, 0, 2000)},
-        {GBR_NMC_PUSH_TO_TALK, std::make_tuple(1, 20, 100, 1.0e-2, 0, 2000)},
-        {GBR_MC_VIDEO, std::make_tuple(1, 15, 100, 1.0e-3, 0, 2000)},
-        {GBR_V2X, std::make_tuple(1, 25, 50, 1.0e-2, 0, 2000)},
-        {NGBR_IMS, std::make_tuple(0, 10, 100, 1.0e-6, 0, 0)},
-        {NGBR_VIDEO_TCP_OPERATOR, std::make_tuple(0, 60, 300, 1.0e-6, 0, 0)},
-        {NGBR_VOICE_VIDEO_GAMING, std::make_tuple(0, 70, 100, 1.0e-3, 0, 0)},
-        {NGBR_VIDEO_TCP_PREMIUM, std::make_tuple(0, 80, 300, 1.0e-6, 0, 0)},
-        {NGBR_VIDEO_TCP_DEFAULT, std::make_tuple(0, 90, 300, 1.0e-6, 0, 0)},
-        {NGBR_MC_DELAY_SIGNAL, std::make_tuple(0, 5, 60, 1.0e-6, 0, 0)},
-        {NGBR_MC_DATA, std::make_tuple(0, 55, 200, 1.0e-6, 0, 0)},
-        {NGBR_V2X, std::make_tuple(0, 65, 5, 1.0e-2, 0, 0)},
-        {NGBR_LOW_LAT_EMBB, std::make_tuple(0, 68, 10, 1.0e-6, 0, 0)},
-        {DGBR_DISCRETE_AUT_SMALL, std::make_tuple(2, 19, 10, 1.0e-4, 255, 2000)},
-        {DGBR_DISCRETE_AUT_LARGE, std::make_tuple(2, 22, 10, 1.0e-4, 1358, 2000)},
-        {DGBR_ITS, std::make_tuple(2, 24, 30, 1.0e-5, 1354, 2000)},
-        {DGBR_ELECTRICITY, std::make_tuple(2, 21, 5, 1.0e-5, 255, 2000)},
+        {GBR_CONV_VOICE, {1, 20, 100, 1.0e-2, 0, 2000}},
+        {GBR_CONV_VIDEO, {1, 40, 150, 1.0e-3, 0, 2000}},
+        {GBR_GAMING, {1, 30, 50, 1.0e-3, 0, 2000}},
+        {GBR_NON_CONV_VIDEO, {1, 50, 300, 1.0e-6, 0, 2000}},
+        {GBR_MC_PUSH_TO_TALK, {1, 7, 75, 1.0e-2, 0, 2000}},
+        {GBR_NMC_PUSH_TO_TALK, {1, 20, 100, 1.0e-2, 0, 2000}},
+        {GBR_MC_VIDEO, {1, 15, 100, 1.0e-3, 0, 2000}},
+        {GBR_V2X, {1, 25, 50, 1.0e-2, 0, 2000}},
+        {NGBR_IMS, {0, 10, 100, 1.0e-6, 0, 0}},
+        {NGBR_VIDEO_TCP_OPERATOR, {0, 60, 300, 1.0e-6, 0, 0}},
+        {NGBR_VOICE_VIDEO_GAMING, {0, 70, 100, 1.0e-3, 0, 0}},
+        {NGBR_VIDEO_TCP_PREMIUM, {0, 80, 300, 1.0e-6, 0, 0}},
+        {NGBR_VIDEO_TCP_DEFAULT, {0, 90, 300, 1.0e-6, 0, 0}},
+        {NGBR_MC_DELAY_SIGNAL, {0, 5, 60, 1.0e-6, 0, 0}},
+        {NGBR_MC_DATA, {0, 55, 200, 1.0e-6, 0, 0}},
+        {NGBR_V2X, {0, 65, 5, 1.0e-2, 0, 0}},
+        {NGBR_LOW_LAT_EMBB, {0, 68, 10, 1.0e-6, 0, 0}},
+        {DGBR_DISCRETE_AUT_SMALL, {2, 19, 10, 1.0e-4, 255, 2000}},
+        {DGBR_DISCRETE_AUT_LARGE, {2, 22, 10, 1.0e-4, 1358, 2000}},
+        {DGBR_ITS, {2, 24, 30, 1.0e-5, 1354, 2000}},
+        {DGBR_ELECTRICITY, {2, 21, 5, 1.0e-5, 255, 2000}},
     };
     return ret;
 }
@@ -196,39 +184,38 @@
 const EpsBearer::BearerRequirementsMap&
 EpsBearer::GetRequirementsRel18()
 {
-    // Needed to support GCC 4.9. Otherwise, use list constructors (see GetRequirementsRel10)
     static EpsBearer::BearerRequirementsMap ret{
-        {GBR_CONV_VOICE, std::make_tuple(1, 20, 100, 1.0e-2, 0, 2000)},
-        {GBR_CONV_VIDEO, std::make_tuple(1, 40, 150, 1.0e-3, 0, 2000)},
-        {GBR_GAMING, std::make_tuple(1, 30, 50, 1.0e-3, 0, 2000)},
-        {GBR_NON_CONV_VIDEO, std::make_tuple(1, 50, 300, 1.0e-6, 0, 2000)},
-        {GBR_MC_PUSH_TO_TALK, std::make_tuple(1, 7, 75, 1.0e-2, 0, 2000)},
-        {GBR_NMC_PUSH_TO_TALK, std::make_tuple(1, 20, 100, 1.0e-2, 0, 2000)},
-        {GBR_MC_VIDEO, std::make_tuple(1, 15, 100, 1.0e-3, 0, 2000)},
-        {GBR_V2X, std::make_tuple(1, 25, 50, 1.0e-2, 0, 2000)},
-        {NGBR_IMS, std::make_tuple(0, 10, 100, 1.0e-6, 0, 0)},
-        {NGBR_VIDEO_TCP_OPERATOR, std::make_tuple(0, 60, 300, 1.0e-6, 0, 0)},
-        {NGBR_VOICE_VIDEO_GAMING, std::make_tuple(0, 70, 100, 1.0e-3, 0, 0)},
-        {NGBR_VIDEO_TCP_PREMIUM, std::make_tuple(0, 80, 300, 1.0e-6, 0, 0)},
-        {NGBR_VIDEO_TCP_DEFAULT, std::make_tuple(0, 90, 300, 1.0e-6, 0, 0)},
-        {NGBR_MC_DELAY_SIGNAL, std::make_tuple(0, 5, 60, 1.0e-6, 0, 0)},
-        {NGBR_MC_DATA, std::make_tuple(0, 55, 200, 1.0e-6, 0, 0)},
-        {NGBR_V2X, std::make_tuple(0, 65, 5, 1.0e-2, 0, 0)},
-        {NGBR_LOW_LAT_EMBB, std::make_tuple(0, 68, 10, 1.0e-6, 0, 0)},
-        {GBR_LIVE_UL_71, std::make_tuple(1, 56, 150, 1.0e-6, 0, 0)},
-        {GBR_LIVE_UL_72, std::make_tuple(1, 56, 300, 1.0e-4, 0, 0)},
-        {GBR_LIVE_UL_73, std::make_tuple(1, 56, 300, 1.0e-8, 0, 0)},
-        {GBR_LIVE_UL_74, std::make_tuple(1, 56, 500, 1.0e-8, 0, 0)},
-        {GBR_LIVE_UL_76, std::make_tuple(1, 56, 500, 1.0e-4, 0, 0)},
-        {DGBR_DISCRETE_AUT_SMALL, std::make_tuple(2, 19, 10, 1.0e-4, 255, 2000)},
-        {DGBR_DISCRETE_AUT_LARGE, std::make_tuple(2, 22, 10, 1.0e-4, 1358, 2000)},
-        {DGBR_ITS, std::make_tuple(2, 24, 30, 1.0e-5, 1354, 2000)},
-        {DGBR_ELECTRICITY, std::make_tuple(2, 21, 5, 1.0e-5, 255, 2000)},
-        {DGBR_V2X, std::make_tuple(2, 18, 5, 1.0e-4, 1354, 2000)},
-        {DGBR_INTER_SERV_87, std::make_tuple(2, 25, 5, 1.0e-3, 500, 2000)},
-        {DGBR_INTER_SERV_88, std::make_tuple(2, 25, 10, 1.0e-3, 1125, 2000)},
-        {DGBR_VISUAL_CONTENT_89, std::make_tuple(2, 25, 15, 1.0e-4, 17000, 2000)},
-        {DGBR_VISUAL_CONTENT_90, std::make_tuple(2, 25, 20, 1.0e-4, 63000, 2000)},
+        {GBR_CONV_VOICE, {1, 20, 100, 1.0e-2, 0, 2000}},
+        {GBR_CONV_VIDEO, {1, 40, 150, 1.0e-3, 0, 2000}},
+        {GBR_GAMING, {1, 30, 50, 1.0e-3, 0, 2000}},
+        {GBR_NON_CONV_VIDEO, {1, 50, 300, 1.0e-6, 0, 2000}},
+        {GBR_MC_PUSH_TO_TALK, {1, 7, 75, 1.0e-2, 0, 2000}},
+        {GBR_NMC_PUSH_TO_TALK, {1, 20, 100, 1.0e-2, 0, 2000}},
+        {GBR_MC_VIDEO, {1, 15, 100, 1.0e-3, 0, 2000}},
+        {GBR_V2X, {1, 25, 50, 1.0e-2, 0, 2000}},
+        {NGBR_IMS, {0, 10, 100, 1.0e-6, 0, 0}},
+        {NGBR_VIDEO_TCP_OPERATOR, {0, 60, 300, 1.0e-6, 0, 0}},
+        {NGBR_VOICE_VIDEO_GAMING, {0, 70, 100, 1.0e-3, 0, 0}},
+        {NGBR_VIDEO_TCP_PREMIUM, {0, 80, 300, 1.0e-6, 0, 0}},
+        {NGBR_VIDEO_TCP_DEFAULT, {0, 90, 300, 1.0e-6, 0, 0}},
+        {NGBR_MC_DELAY_SIGNAL, {0, 5, 60, 1.0e-6, 0, 0}},
+        {NGBR_MC_DATA, {0, 55, 200, 1.0e-6, 0, 0}},
+        {NGBR_V2X, {0, 65, 5, 1.0e-2, 0, 0}},
+        {NGBR_LOW_LAT_EMBB, {0, 68, 10, 1.0e-6, 0, 0}},
+        {GBR_LIVE_UL_71, {1, 56, 150, 1.0e-6, 0, 0}},
+        {GBR_LIVE_UL_72, {1, 56, 300, 1.0e-4, 0, 0}},
+        {GBR_LIVE_UL_73, {1, 56, 300, 1.0e-8, 0, 0}},
+        {GBR_LIVE_UL_74, {1, 56, 500, 1.0e-8, 0, 0}},
+        {GBR_LIVE_UL_76, {1, 56, 500, 1.0e-4, 0, 0}},
+        {DGBR_DISCRETE_AUT_SMALL, {2, 19, 10, 1.0e-4, 255, 2000}},
+        {DGBR_DISCRETE_AUT_LARGE, {2, 22, 10, 1.0e-4, 1358, 2000}},
+        {DGBR_ITS, {2, 24, 30, 1.0e-5, 1354, 2000}},
+        {DGBR_ELECTRICITY, {2, 21, 5, 1.0e-5, 255, 2000}},
+        {DGBR_V2X, {2, 18, 5, 1.0e-4, 1354, 2000}},
+        {DGBR_INTER_SERV_87, {2, 25, 5, 1.0e-3, 500, 2000}},
+        {DGBR_INTER_SERV_88, {2, 25, 10, 1.0e-3, 1125, 2000}},
+        {DGBR_VISUAL_CONTENT_89, {2, 25, 15, 1.0e-4, 17000, 2000}},
+        {DGBR_VISUAL_CONTENT_90, {2, 25, 20, 1.0e-4, 63000, 2000}},
     };
     return ret;
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/eps-bearer.h ns-3.44/src/lte/model/eps-bearer.h
--- ns-3.43/src/lte/model/eps-bearer.h	2024-10-09 16:41:09.932656000 -0700
+++ ns-3.44/src/lte/model/eps-bearer.h	2025-03-09 16:55:49.487371400 -0700
@@ -9,8 +9,8 @@
 #ifndef EPS_BEARER
 #define EPS_BEARER
 
-#include <ns3/object-base.h>
-#include <ns3/uinteger.h>
+#include "ns3/object-base.h"
+#include "ns3/uinteger.h"
 
 #include <unordered_map>
 
@@ -50,11 +50,11 @@
 };
 
 /**
- * \brief This class contains the specification of EPS Bearers.
+ * @brief This class contains the specification of EPS Bearers.
  *
  * See the following references:
- * 3GPP TS 23.203, Section 4.7.2 The EPS bearer
- * 3GPP TS 23.203, Section 4.7.3 Bearer level QoS parameters
+ * 3GPP TS 23.401, Section 4.7.2 The EPS bearer
+ * 3GPP TS 23.401, Section 4.7.3 Bearer level QoS parameters
  * 3GPP TS 36.413 Section 9.2.1.15 E-RAB Level QoS Parameters
  *
  * It supports the selection of different specifications depending on the
@@ -80,8 +80,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -164,21 +164,21 @@
     EpsBearer(Qci x, GbrQosInformation y);
 
     /**
-     * \brief EpsBearer copy constructor
-     * \param o other instance
+     * @brief EpsBearer copy constructor
+     * @param o other instance
      */
     EpsBearer(const EpsBearer& o);
 
     /**
-     * \brief Deconstructor
+     * @brief Deconstructor
      */
     ~EpsBearer() override
     {
     }
 
     /**
-     * \brief SetRelease
-     * \param release The release the user want for this bearer
+     * @brief SetRelease
+     * @param release The release the user want for this bearer
      *
      * Releases introduces new types, and change values for existing ones.
      * While we can't do much for the added type (we must expose them even
@@ -191,8 +191,8 @@
     void SetRelease(uint8_t release);
 
     /**
-     * \brief GetRelease
-     * \return The release currently set for this bearer type
+     * @brief GetRelease
+     * @return The release currently set for this bearer type
      */
     uint8_t GetRelease() const
     {
@@ -232,120 +232,110 @@
 
   private:
     /**
-     * \brief Map between QCI and requirements
-     *
-     * The tuple is formed by: resource type, priority, packet delay budget, packet error rate,
-     *  default maximum data burst, default averaging window (0 when does not apply)
+     * @brief Struct containing bearer requirements
      */
-    using BearerRequirementsMap =
-        std::unordered_map<Qci, std::tuple<uint8_t, uint8_t, uint16_t, double, uint32_t, uint32_t>>;
+    struct BearerRequirements
+    {
+        uint8_t resourceType{0};         //!< resource type
+        uint8_t priority{0};             //!< priority
+        uint16_t packetDelayBudgetMs{0}; //!< packet delay budget in ms
+        double packetErrorLossRate{0.0}; //!< packet error rate
+        uint32_t maxDataBurst{0};        //!< default maximum data burst
+        uint32_t avgWindow{0};           //!< default averaging window (0 when does not apply)
+    };
 
     /**
-     * \brief Get the resource type (NON-GBR, GBR, DC-GBR) of the selected QCI
-     * \param map Map between QCI and requirements
-     * \param qci QCI to look for
-     * \return the resource type (NON-GBR, GBR, DC-GBR) of the selected QCI
+     * @brief Map between QCI and requirements
+     */
+    using BearerRequirementsMap = std::unordered_map<Qci, BearerRequirements>;
+
+    /**
+     * @brief Get the resource type (NON-GBR, GBR, DC-GBR) of the selected QCI
+     * @param map Map between QCI and requirements
+     * @param qci QCI to look for
+     * @return the resource type (NON-GBR, GBR, DC-GBR) of the selected QCI
      */
     static uint8_t GetResourceType(const BearerRequirementsMap& map, Qci qci)
     {
-        return std::get<0>(map.at(qci));
+        return map.at(qci).resourceType;
     }
 
     /**
-     * \brief Get priority for the selected QCI
-     * \param map Map between QCI and requirements
-     * \param qci QCI to look for
-     * \return priority for the selected QCI
+     * @brief Get priority for the selected QCI
+     * @param map Map between QCI and requirements
+     * @param qci QCI to look for
+     * @return priority for the selected QCI
      */
     static uint8_t GetPriority(const BearerRequirementsMap& map, Qci qci)
     {
-        return std::get<1>(map.at(qci));
+        return map.at(qci).priority;
     }
 
     /**
-     * \brief Get packet delay in ms for the selected QCI
-     * \param map Map between QCI and requirements
-     * \param qci QCI to look for
-     * \return packet delay in ms for the selected QCI
+     * @brief Get packet delay in ms for the selected QCI
+     * @param map Map between QCI and requirements
+     * @param qci QCI to look for
+     * @return packet delay in ms for the selected QCI
      */
     static uint16_t GetPacketDelayBudgetMs(const BearerRequirementsMap& map, Qci qci)
     {
-        return std::get<2>(map.at(qci));
+        return map.at(qci).packetDelayBudgetMs;
     }
 
     /**
-     * \brief Get packet error rate for the selected QCI
-     * \param map Map between QCI and requirements
-     * \param qci QCI to look for
-     * \return packet error rate for the selected QCI
+     * @brief Get packet error rate for the selected QCI
+     * @param map Map between QCI and requirements
+     * @param qci QCI to look for
+     * @return packet error rate for the selected QCI
      */
     static double GetPacketErrorLossRate(const BearerRequirementsMap& map, Qci qci)
     {
-        return std::get<3>(map.at(qci));
+        return map.at(qci).packetErrorLossRate;
     }
 
     /**
-     * \brief Get maximum data burst for the selected QCI
-     * \param map Map between QCI and requirements
-     * \param qci QCI to look for
-     * \return maximum data burst for the selected QCI
+     * @brief Get maximum data burst for the selected QCI
+     * @param map Map between QCI and requirements
+     * @param qci QCI to look for
+     * @return maximum data burst for the selected QCI
      */
     static uint32_t GetMaxDataBurst(const BearerRequirementsMap& map, Qci qci)
     {
-        return std::get<4>(map.at(qci));
+        return map.at(qci).maxDataBurst;
     }
 
     /**
-     * \brief Get default averaging window for the selected QCI
-     * \param map Map between QCI and requirements
-     * \param qci QCI to look for
-     * \return default averaging window for the selected QCI
+     * @brief Get default averaging window for the selected QCI
+     * @param map Map between QCI and requirements
+     * @param qci QCI to look for
+     * @return default averaging window for the selected QCI
      */
     static uint32_t GetAvgWindow(const BearerRequirementsMap& map, Qci qci)
     {
-        return std::get<5>(map.at(qci));
+        return map.at(qci).avgWindow;
     }
 
     /**
-     * \brief Retrieve requirements for Rel. 11
-     * \return the BearerRequirementsMap for Release 11
-     *
-     * It returns a pointer to a non-const static data. That is not thread-safe,
-     * nor safe to do in general. However, a const-correct version would have
-     * to initialize two static maps, and then returning either one or the other.
-     * But that's a huge memory increase, and EpsBearer is used everywhere.
-     *
-     * To be revisited when GCC 4.9 will not be supported anymore.
+     * @brief Retrieve requirements for Rel. 11
+     * @return the BearerRequirementsMap for Release 11
      */
     static const BearerRequirementsMap& GetRequirementsRel11();
 
     /**
-     * \brief Retrieve requirements for Rel. 15
-     * \return the BearerRequirementsMap for Release 15
-     *
-     * It returns a pointer to a non-const static data. That is not thread-safe,
-     * nor safe to do in general. However, a const-correct version would have
-     * to initialize two static maps, and then returning either one or the other.
-     * But that's a huge memory increase, and EpsBearer is used everywhere.
-     *
-     * To be revisited when GCC 4.9 will not be supported anymore.
+     * @brief Retrieve requirements for Rel. 15
+     * @return the BearerRequirementsMap for Release 15
      */
     static const BearerRequirementsMap& GetRequirementsRel15();
 
     /**
-     * \brief Retrieve requirements for Rel. 18
-     * \return the BearerRequirementsMap for Release 18
+     * @brief Retrieve requirements for Rel. 18
+     * @return the BearerRequirementsMap for Release 18
      */
     static const BearerRequirementsMap& GetRequirementsRel18();
 
-    /**
-     * \brief Requirements pointer per bearer
-     *
-     * It will point to a static map.
-     */
-    BearerRequirementsMap m_requirements;
+    BearerRequirementsMap m_requirements; //!< Map of requirements per bearer
 
-    uint8_t m_release{30}; //!< Release (10 or 15 or 18)
+    uint8_t m_release{30}; //!< Release (8 to 11 or 15 or 18)
 };
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/eps-bearer-tag.h ns-3.44/src/lte/model/eps-bearer-tag.h
--- ns-3.43/src/lte/model/eps-bearer-tag.h	2024-10-09 16:41:09.932656000 -0700
+++ ns-3.44/src/lte/model/eps-bearer-tag.h	2025-03-09 16:55:49.487371400 -0700
@@ -25,8 +25,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -65,12 +65,12 @@
 
     /**
      * Get RNTI function
-     * \returns the RNTI
+     * @returns the RNTI
      */
     uint16_t GetRnti() const;
     /**
      * Get Bearer Id function
-     * \returns the Bearer Id
+     * @returns the Bearer Id
      */
     uint8_t GetBid() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/fdbet-ff-mac-scheduler.cc ns-3.44/src/lte/model/fdbet-ff-mac-scheduler.cc
--- ns-3.43/src/lte/model/fdbet-ff-mac-scheduler.cc	2024-10-09 16:41:10.036656400 -0700
+++ ns-3.44/src/lte/model/fdbet-ff-mac-scheduler.cc	2025-03-09 16:55:49.599372000 -0700
@@ -12,11 +12,11 @@
 #include "lte-amc.h"
 #include "lte-vendor-specific-parameters.h"
 
-#include <ns3/boolean.h>
-#include <ns3/log.h>
-#include <ns3/math.h>
-#include <ns3/pointer.h>
-#include <ns3/simulator.h>
+#include "ns3/boolean.h"
+#include "ns3/log.h"
+#include "ns3/math.h"
+#include "ns3/pointer.h"
+#include "ns3/simulator.h"
 
 #include <cfloat>
 #include <set>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/fdbet-ff-mac-scheduler.h ns-3.44/src/lte/model/fdbet-ff-mac-scheduler.h
--- ns-3.43/src/lte/model/fdbet-ff-mac-scheduler.h	2024-10-09 16:41:10.036656400 -0700
+++ ns-3.44/src/lte/model/fdbet-ff-mac-scheduler.h	2025-03-09 16:55:49.599372000 -0700
@@ -17,7 +17,7 @@
 #include "lte-common.h"
 #include "lte-ffr-sap.h"
 
-#include <ns3/nstime.h>
+#include "ns3/nstime.h"
 
 #include <map>
 #include <vector>
@@ -35,8 +35,8 @@
 };
 
 /**
- * \ingroup ff-api
- * \brief Implements the SCHED SAP and CSCHED SAP for a Frequency Domain Blind Equal Throughput
+ * @ingroup ff-api
+ * @brief Implements the SCHED SAP and CSCHED SAP for a Frequency Domain Blind Equal Throughput
  * scheduler
  *
  * This class implements the interface defined by the FfMacScheduler abstract class
@@ -46,7 +46,7 @@
 {
   public:
     /**
-     * \brief Constructor
+     * @brief Constructor
      *
      * Creates the MAC Scheduler interface implementation
      */
@@ -60,8 +60,8 @@
     // inherited from Object
     void DoDispose() override;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -82,8 +82,8 @@
 
     /**
      * Transmission mode configuration update function
-     * \param rnti the RNTI
-     * \param txMode the transmit mode
+     * @param rnti the RNTI
+     * @param txMode the transmit mode
      */
     void TransmissionModeConfigurationUpdate(uint16_t rnti, uint8_t txMode);
 
@@ -95,31 +95,31 @@
 
     /**
      * CSched cell config request function
-     * \param params the CSched cell config request parameters
+     * @param params the CSched cell config request parameters
      */
     void DoCschedCellConfigReq(const FfMacCschedSapProvider::CschedCellConfigReqParameters& params);
 
     /**
      * Csched UE config request function
-     * \param params the CSched UE config request parameters
+     * @param params the CSched UE config request parameters
      */
     void DoCschedUeConfigReq(const FfMacCschedSapProvider::CschedUeConfigReqParameters& params);
 
     /**
      * Csched LC config request function
-     * \param params the CSched LC config request parameters
+     * @param params the CSched LC config request parameters
      */
     void DoCschedLcConfigReq(const FfMacCschedSapProvider::CschedLcConfigReqParameters& params);
 
     /**
      * CSched LC release request function
-     * \param params the CSched LC release request parameters
+     * @param params the CSched LC release request parameters
      */
     void DoCschedLcReleaseReq(const FfMacCschedSapProvider::CschedLcReleaseReqParameters& params);
 
     /**
      * CSched UE release request function
-     * \param params the CSChed UE release request parameters
+     * @param params the CSChed UE release request parameters
      */
     void DoCschedUeReleaseReq(const FfMacCschedSapProvider::CschedUeReleaseReqParameters& params);
 
@@ -130,93 +130,93 @@
 
     /**
      * Sched DL RLC buffer request function
-     * \param params the Sched DL RLC buffer request parameters
+     * @param params the Sched DL RLC buffer request parameters
      */
     void DoSchedDlRlcBufferReq(const FfMacSchedSapProvider::SchedDlRlcBufferReqParameters& params);
 
     /**
      * Sched DL paging buffer request function
-     * \param params the Sched DL paging buffer request parameters
+     * @param params the Sched DL paging buffer request parameters
      */
     void DoSchedDlPagingBufferReq(
         const FfMacSchedSapProvider::SchedDlPagingBufferReqParameters& params);
 
     /**
      * Sched DL MAC buffer request function
-     * \param params the Sched DL MAC buffer request parameters
+     * @param params the Sched DL MAC buffer request parameters
      */
     void DoSchedDlMacBufferReq(const FfMacSchedSapProvider::SchedDlMacBufferReqParameters& params);
 
     /**
      * Sched DL trigger request function
      *
-     * \param params FfMacSchedSapProvider::SchedDlTriggerReqParameters&
+     * @param params FfMacSchedSapProvider::SchedDlTriggerReqParameters&
      */
     void DoSchedDlTriggerReq(const FfMacSchedSapProvider::SchedDlTriggerReqParameters& params);
 
     /**
      * Sched DL RACH info request function
-     * \param params the Sched DL RACH info request parameters
+     * @param params the Sched DL RACH info request parameters
      */
     void DoSchedDlRachInfoReq(const FfMacSchedSapProvider::SchedDlRachInfoReqParameters& params);
 
     /**
      * Sched DL CGI info request function
-     * \param params the Sched DL CGI info request parameters
+     * @param params the Sched DL CGI info request parameters
      */
     void DoSchedDlCqiInfoReq(const FfMacSchedSapProvider::SchedDlCqiInfoReqParameters& params);
 
     /**
      * Sched UL trigger request function
-     * \param params the Sched UL trigger request parameters
+     * @param params the Sched UL trigger request parameters
      */
     void DoSchedUlTriggerReq(const FfMacSchedSapProvider::SchedUlTriggerReqParameters& params);
 
     /**
      * Sched UL noise interference request function
-     * \param params the Sched UL noise interference request parameters
+     * @param params the Sched UL noise interference request parameters
      */
     void DoSchedUlNoiseInterferenceReq(
         const FfMacSchedSapProvider::SchedUlNoiseInterferenceReqParameters& params);
 
     /**
      * Sched UL SR info request function
-     * \param params the Schedule UL SR info request parameters
+     * @param params the Schedule UL SR info request parameters
      */
     void DoSchedUlSrInfoReq(const FfMacSchedSapProvider::SchedUlSrInfoReqParameters& params);
 
     /**
      * Sched UL MAC control info request function
-     * \param params the Sched UL MAC control info request parameters
+     * @param params the Sched UL MAC control info request parameters
      */
     void DoSchedUlMacCtrlInfoReq(
         const FfMacSchedSapProvider::SchedUlMacCtrlInfoReqParameters& params);
 
     /**
      * Sched UL CGI info request function
-     * \param params the Sched UL CGI info request parameters
+     * @param params the Sched UL CGI info request parameters
      */
     void DoSchedUlCqiInfoReq(const FfMacSchedSapProvider::SchedUlCqiInfoReqParameters& params);
 
     /**
      * Get RBG size function
-     * \param dlbandwidth the DL bandwidth
-     * \returns the RBG size
+     * @param dlbandwidth the DL bandwidth
+     * @returns the RBG size
      */
     int GetRbgSize(int dlbandwidth);
 
     /**
      * LC active per flow function
-     * \param rnti the RNTI
-     * \returns the LC active per flow
+     * @param rnti the RNTI
+     * @returns the LC active per flow
      */
     unsigned int LcActivePerFlow(uint16_t rnti);
 
     /**
      * Estimate UL SNR
-     * \param rnti the RNTI
-     * \param rb the RB
-     * \returns the UL SINR
+     * @param rnti the RNTI
+     * @param rb the RB
+     * @returns the UL SINR
      */
     double EstimateUlSinr(uint16_t rnti, uint16_t rb);
 
@@ -227,36 +227,36 @@
 
     /**
      * Update DL RLC buffer info
-     * \param rnti the RNTI
-     * \param lcid the LCID
-     * \param size the size
+     * @param rnti the RNTI
+     * @param lcid the LCID
+     * @param size the size
      */
     void UpdateDlRlcBufferInfo(uint16_t rnti, uint8_t lcid, uint16_t size);
     /**
      * Update UL RLC buffer info
-     * \param rnti the RNTI
-     * \param size the size
+     * @param rnti the RNTI
+     * @param size the size
      */
     void UpdateUlRlcBufferInfo(uint16_t rnti, uint16_t size);
 
     /**
-     * \brief Update and return a new process Id for the RNTI specified
+     * @brief Update and return a new process Id for the RNTI specified
      *
-     * \param rnti the RNTI of the UE to be updated
-     * \return the process id  value
+     * @param rnti the RNTI of the UE to be updated
+     * @return the process id  value
      */
     uint8_t UpdateHarqProcessId(uint16_t rnti);
 
     /**
-     * \brief Return the availability of free process for the RNTI specified
+     * @brief Return the availability of free process for the RNTI specified
      *
-     * \param rnti the RNTI of the UE to be updated
-     * \return the availability
+     * @param rnti the RNTI of the UE to be updated
+     * @return the availability
      */
     bool HarqProcessAvailability(uint16_t rnti);
 
     /**
-     * \brief Refresh HARQ processes according to the timers
+     * @brief Refresh HARQ processes according to the timers
      *
      */
     void RefreshHarqProcesses();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/fdmt-ff-mac-scheduler.cc ns-3.44/src/lte/model/fdmt-ff-mac-scheduler.cc
--- ns-3.43/src/lte/model/fdmt-ff-mac-scheduler.cc	2024-10-09 16:41:10.036656400 -0700
+++ ns-3.44/src/lte/model/fdmt-ff-mac-scheduler.cc	2025-03-09 16:55:49.599372000 -0700
@@ -12,11 +12,11 @@
 #include "lte-amc.h"
 #include "lte-vendor-specific-parameters.h"
 
-#include <ns3/boolean.h>
-#include <ns3/log.h>
-#include <ns3/math.h>
-#include <ns3/pointer.h>
-#include <ns3/simulator.h>
+#include "ns3/boolean.h"
+#include "ns3/log.h"
+#include "ns3/math.h"
+#include "ns3/pointer.h"
+#include "ns3/simulator.h"
 
 #include <cfloat>
 #include <set>
@@ -843,111 +843,112 @@
     for (int i = 0; i < rbgNum; i++)
     {
         NS_LOG_INFO(this << " ALLOCATION for RBG " << i << " of " << rbgNum);
-        if (!rbgMap.at(i))
+        if (rbgMap.at(i))
         {
-            auto itMax = m_flowStatsDl.end();
-            double rcqiMax = 0.0;
-            for (auto it = m_flowStatsDl.begin(); it != m_flowStatsDl.end(); it++)
-            {
-                auto itRnti = rntiAllocated.find(*it);
-                if (itRnti != rntiAllocated.end() || !HarqProcessAvailability(*it))
-                {
-                    // UE already allocated for HARQ or without HARQ process available -> drop it
-                    if (itRnti != rntiAllocated.end())
-                    {
-                        NS_LOG_DEBUG(this << " RNTI discarded for HARQ tx" << (uint16_t)(*it));
-                    }
-                    if (!HarqProcessAvailability(*it))
-                    {
-                        NS_LOG_DEBUG(this << " RNTI discarded for HARQ id" << (uint16_t)(*it));
-                    }
-                    continue;
-                }
+            continue;
+        }
 
-                auto itCqi = m_a30CqiRxed.find(*it);
-                auto itTxMode = m_uesTxMode.find(*it);
-                if (itTxMode == m_uesTxMode.end())
-                {
-                    NS_FATAL_ERROR("No Transmission Mode info on user " << (*it));
-                }
-                auto nLayer = TransmissionModesLayers::TxMode2LayerNum((*itTxMode).second);
-                std::vector<uint8_t> sbCqi;
-                if (itCqi == m_a30CqiRxed.end())
-                {
-                    sbCqi = std::vector<uint8_t>(nLayer, 1); // start with lowest value
-                }
-                else
+        auto itMax = m_flowStatsDl.end();
+        double rcqiMax = 0.0;
+        for (auto it = m_flowStatsDl.begin(); it != m_flowStatsDl.end(); it++)
+        {
+            auto itRnti = rntiAllocated.find(*it);
+            if (itRnti != rntiAllocated.end() || !HarqProcessAvailability(*it))
+            {
+                // UE already allocated for HARQ or without HARQ process available -> drop it
+                if (itRnti != rntiAllocated.end())
                 {
-                    sbCqi = (*itCqi).second.m_higherLayerSelected.at(i).m_sbCqi;
+                    NS_LOG_DEBUG(this << " RNTI discarded for HARQ tx" << (uint16_t)(*it));
                 }
-                uint8_t cqi1 = sbCqi.at(0);
-                uint8_t cqi2 = 0;
-                if (sbCqi.size() > 1)
+                if (!HarqProcessAvailability(*it))
                 {
-                    cqi2 = sbCqi.at(1);
+                    NS_LOG_DEBUG(this << " RNTI discarded for HARQ id" << (uint16_t)(*it));
                 }
-                if ((cqi1 > 0) ||
-                    (cqi2 > 0)) // CQI == 0 means "out of range" (see table 7.2.3-1 of 36.213)
+                continue;
+            }
+
+            auto itCqi = m_a30CqiRxed.find(*it);
+            auto itTxMode = m_uesTxMode.find(*it);
+            if (itTxMode == m_uesTxMode.end())
+            {
+                NS_FATAL_ERROR("No Transmission Mode info on user " << (*it));
+            }
+            auto nLayer = TransmissionModesLayers::TxMode2LayerNum((*itTxMode).second);
+            std::vector<uint8_t> sbCqi;
+            if (itCqi == m_a30CqiRxed.end())
+            {
+                sbCqi = std::vector<uint8_t>(nLayer, 1); // start with lowest value
+            }
+            else
+            {
+                sbCqi = (*itCqi).second.m_higherLayerSelected.at(i).m_sbCqi;
+            }
+            uint8_t cqi1 = sbCqi.at(0);
+            uint8_t cqi2 = 0;
+            if (sbCqi.size() > 1)
+            {
+                cqi2 = sbCqi.at(1);
+            }
+            if ((cqi1 > 0) ||
+                (cqi2 > 0)) // CQI == 0 means "out of range" (see table 7.2.3-1 of 36.213)
+            {
+                if (LcActivePerFlow(*it) > 0)
                 {
-                    if (LcActivePerFlow(*it) > 0)
+                    // this UE has data to transmit
+                    double achievableRate = 0.0;
+                    uint8_t mcs = 0;
+                    for (uint8_t k = 0; k < nLayer; k++)
                     {
-                        // this UE has data to transmit
-                        double achievableRate = 0.0;
-                        uint8_t mcs = 0;
-                        for (uint8_t k = 0; k < nLayer; k++)
+                        if (sbCqi.size() > k)
                         {
-                            if (sbCqi.size() > k)
-                            {
-                                mcs = m_amc->GetMcsFromCqi(sbCqi.at(k));
-                            }
-                            else
-                            {
-                                // no info on this subband -> worst MCS
-                                mcs = 0;
-                            }
-                            achievableRate += ((m_amc->GetDlTbSizeFromMcs(mcs, rbgSize) / 8) /
-                                               0.001); // = TB size / TTI
+                            mcs = m_amc->GetMcsFromCqi(sbCqi.at(k));
                         }
-
-                        double rcqi = achievableRate;
-                        NS_LOG_INFO(this << " RNTI " << (*it) << " MCS " << (uint32_t)mcs
-                                         << " achievableRate " << achievableRate << " RCQI "
-                                         << rcqi);
-
-                        if (rcqi > rcqiMax)
+                        else
                         {
-                            rcqiMax = rcqi;
-                            itMax = it;
+                            // no info on this subband -> worst MCS
+                            mcs = 0;
                         }
+                        achievableRate += ((m_amc->GetDlTbSizeFromMcs(mcs, rbgSize) / 8) /
+                                           0.001); // = TB size / TTI
                     }
-                } // end if cqi
 
-            } // end for m_rlcBufferReq
+                    double rcqi = achievableRate;
+                    NS_LOG_INFO(this << " RNTI " << (*it) << " MCS " << (uint32_t)mcs
+                                     << " achievableRate " << achievableRate << " RCQI " << rcqi);
 
-            if (itMax == m_flowStatsDl.end())
-            {
-                // no UE available for this RB
-                NS_LOG_INFO(this << " any UE found");
+                    if (rcqi > rcqiMax)
+                    {
+                        rcqiMax = rcqi;
+                        itMax = it;
+                    }
+                }
+            } // end if cqi
+
+        } // end for m_rlcBufferReq
+
+        if (itMax == m_flowStatsDl.end())
+        {
+            // no UE available for this RB
+            NS_LOG_INFO(this << " any UE found");
+        }
+        else
+        {
+            rbgMap.at(i) = true;
+            auto itMap = allocationMap.find(*itMax);
+            if (itMap == allocationMap.end())
+            {
+                // insert new element
+                std::vector<uint16_t> tempMap;
+                tempMap.push_back(i);
+                allocationMap[*itMax] = tempMap;
             }
             else
             {
-                rbgMap.at(i) = true;
-                auto itMap = allocationMap.find(*itMax);
-                if (itMap == allocationMap.end())
-                {
-                    // insert new element
-                    std::vector<uint16_t> tempMap;
-                    tempMap.push_back(i);
-                    allocationMap[*itMax] = tempMap;
-                }
-                else
-                {
-                    (*itMap).second.push_back(i);
-                }
-                NS_LOG_INFO(this << " UE assigned " << (*itMax));
+                (*itMap).second.push_back(i);
             }
-        } // end for RBG free
-    }     // end for RBGs
+            NS_LOG_INFO(this << " UE assigned " << (*itMax));
+        }
+    } // end for RBGs
 
     // generate the transmission opportunities by grouping the RBGs of the same RNTI and
     // creating the correspondent DCIs
@@ -1207,25 +1208,23 @@
         // no cqi info about this UE
         return NO_SINR;
     }
-    else
-    {
-        // take the average SINR value among the available
-        double sinrSum = 0;
-        unsigned int sinrNum = 0;
-        for (uint32_t i = 0; i < m_cschedCellConfig.m_ulBandwidth; i++)
-        {
-            double sinr = (*itCqi).second.at(i);
-            if (sinr != NO_SINR)
-            {
-                sinrSum += sinr;
-                sinrNum++;
-            }
-        }
-        double estimatedSinr = (sinrNum > 0) ? (sinrSum / sinrNum) : DBL_MAX;
-        // store the value
-        (*itCqi).second.at(rb) = estimatedSinr;
-        return estimatedSinr;
-    }
+
+    // take the average SINR value among the available
+    double sinrSum = 0;
+    unsigned int sinrNum = 0;
+    for (uint32_t i = 0; i < m_cschedCellConfig.m_ulBandwidth; i++)
+    {
+        double sinr = (*itCqi).second.at(i);
+        if (sinr != NO_SINR)
+        {
+            sinrSum += sinr;
+            sinrNum++;
+        }
+    }
+    double estimatedSinr = (sinrNum > 0) ? (sinrSum / sinrNum) : DBL_MAX;
+    // store the value
+    (*itCqi).second.at(rb) = estimatedSinr;
+    return estimatedSinr;
 }
 
 void
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/fdmt-ff-mac-scheduler.h ns-3.44/src/lte/model/fdmt-ff-mac-scheduler.h
--- ns-3.43/src/lte/model/fdmt-ff-mac-scheduler.h	2024-10-09 16:41:10.036656400 -0700
+++ ns-3.44/src/lte/model/fdmt-ff-mac-scheduler.h	2025-03-09 16:55:49.599372000 -0700
@@ -17,7 +17,7 @@
 #include "lte-common.h"
 #include "lte-ffr-sap.h"
 
-#include <ns3/nstime.h>
+#include "ns3/nstime.h"
 
 #include <map>
 #include <set>
@@ -27,8 +27,8 @@
 {
 
 /**
- * \ingroup ff-api
- * \brief Implements the SCHED SAP and CSCHED SAP for a Frequency Domain Maximize Throughput
+ * @ingroup ff-api
+ * @brief Implements the SCHED SAP and CSCHED SAP for a Frequency Domain Maximize Throughput
  * scheduler
  *
  * This class implements the interface defined by the FfMacScheduler abstract class
@@ -38,7 +38,7 @@
 {
   public:
     /**
-     * \brief Constructor
+     * @brief Constructor
      *
      * Creates the MAC Scheduler interface implementation
      */
@@ -52,8 +52,8 @@
     // inherited from Object
     void DoDispose() override;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -74,8 +74,8 @@
 
     /**
      * Transmission mode configuration update
-     * \param rnti the RNTI
-     * \param txMode the transmit mode
+     * @param rnti the RNTI
+     * @param txMode the transmit mode
      */
     void TransmissionModeConfigurationUpdate(uint16_t rnti, uint8_t txMode);
 
@@ -87,31 +87,31 @@
 
     /**
      * Csched cell config request function
-     * \param params the CSched cell config request parameters
+     * @param params the CSched cell config request parameters
      */
     void DoCschedCellConfigReq(const FfMacCschedSapProvider::CschedCellConfigReqParameters& params);
 
     /**
      * CSched UE config request function
-     * \param params the CSChed UE config request parameters
+     * @param params the CSChed UE config request parameters
      */
     void DoCschedUeConfigReq(const FfMacCschedSapProvider::CschedUeConfigReqParameters& params);
 
     /**
      * CSched LC config request function
-     * \param params the CSChed LC config request parameters
+     * @param params the CSChed LC config request parameters
      */
     void DoCschedLcConfigReq(const FfMacCschedSapProvider::CschedLcConfigReqParameters& params);
 
     /**
      * CSched LC release request function
-     * \param params the CSched LC release request parameters
+     * @param params the CSched LC release request parameters
      */
     void DoCschedLcReleaseReq(const FfMacCschedSapProvider::CschedLcReleaseReqParameters& params);
 
     /**
      * CSched UE release request function
-     * \param params th CSched UE release request parameters
+     * @param params th CSched UE release request parameters
      */
     void DoCschedUeReleaseReq(const FfMacCschedSapProvider::CschedUeReleaseReqParameters& params);
 
@@ -122,93 +122,93 @@
 
     /**
      * Sched DL RLC buffer request function
-     * \param params the Sched DL RLC buffer request parameters
+     * @param params the Sched DL RLC buffer request parameters
      */
     void DoSchedDlRlcBufferReq(const FfMacSchedSapProvider::SchedDlRlcBufferReqParameters& params);
 
     /**
      * Sched DL paging buffer request function
-     * \param params the Sched DL paging buffer request parameters
+     * @param params the Sched DL paging buffer request parameters
      */
     void DoSchedDlPagingBufferReq(
         const FfMacSchedSapProvider::SchedDlPagingBufferReqParameters& params);
 
     /**
      * Sched DL MAC buffer request function
-     * \param params the Sched DL MAC buffer request parameters
+     * @param params the Sched DL MAC buffer request parameters
      */
     void DoSchedDlMacBufferReq(const FfMacSchedSapProvider::SchedDlMacBufferReqParameters& params);
 
     /**
      * Sched DL trigger request function
      *
-     * \param params FfMacSchedSapProvider::SchedDlTriggerReqParameters&
+     * @param params FfMacSchedSapProvider::SchedDlTriggerReqParameters&
      */
     void DoSchedDlTriggerReq(const FfMacSchedSapProvider::SchedDlTriggerReqParameters& params);
 
     /**
      * Sched DL RACH info request function
-     * \param params the Sched DL RACH info request parameters
+     * @param params the Sched DL RACH info request parameters
      */
     void DoSchedDlRachInfoReq(const FfMacSchedSapProvider::SchedDlRachInfoReqParameters& params);
 
     /**
      * Sched DL CQI info request function
-     * \param params the Sched DL CQI info request parameters
+     * @param params the Sched DL CQI info request parameters
      */
     void DoSchedDlCqiInfoReq(const FfMacSchedSapProvider::SchedDlCqiInfoReqParameters& params);
 
     /**
      * Sched UL trigger request function
-     * \param params the Sched UL trigger request parameters
+     * @param params the Sched UL trigger request parameters
      */
     void DoSchedUlTriggerReq(const FfMacSchedSapProvider::SchedUlTriggerReqParameters& params);
 
     /**
      * Sched UL noise interference request function
-     * \param params the Sched UL noise interference request parameters
+     * @param params the Sched UL noise interference request parameters
      */
     void DoSchedUlNoiseInterferenceReq(
         const FfMacSchedSapProvider::SchedUlNoiseInterferenceReqParameters& params);
 
     /**
      * Sched UL SR info request function
-     * \param params the Sched UL SR info request parameters
+     * @param params the Sched UL SR info request parameters
      */
     void DoSchedUlSrInfoReq(const FfMacSchedSapProvider::SchedUlSrInfoReqParameters& params);
 
     /**
      * Sched UL MAC control info request function
-     * \param params the Sched UL MAC control info request parameters
+     * @param params the Sched UL MAC control info request parameters
      */
     void DoSchedUlMacCtrlInfoReq(
         const FfMacSchedSapProvider::SchedUlMacCtrlInfoReqParameters& params);
 
     /**
      * Sched UL CQI info request function
-     * \param params the Sched UL CQI info request parameters
+     * @param params the Sched UL CQI info request parameters
      */
     void DoSchedUlCqiInfoReq(const FfMacSchedSapProvider::SchedUlCqiInfoReqParameters& params);
 
     /**
      * Get RBG size function
-     * \param dlbandwidth the DL bandwidth
-     * \returns the RBG size
+     * @param dlbandwidth the DL bandwidth
+     * @returns the RBG size
      */
     int GetRbgSize(int dlbandwidth);
 
     /**
      * LC Active per flow function
-     * \param rnti the RNTI
-     * \returns the LC active per flow
+     * @param rnti the RNTI
+     * @returns the LC active per flow
      */
     unsigned int LcActivePerFlow(uint16_t rnti);
 
     /**
      * Estimate UL SNR function
-     * \param rnti the RNTI
-     * \param rb the RB
-     * \returns the UL SINR
+     * @param rnti the RNTI
+     * @param rb the RB
+     * @returns the UL SINR
      */
     double EstimateUlSinr(uint16_t rnti, uint16_t rb);
 
@@ -219,36 +219,36 @@
 
     /**
      * Update DL RLC buffer info function
-     * \param rnti the RNTI
-     * \param lcid the LCID
-     * \param size the size
+     * @param rnti the RNTI
+     * @param lcid the LCID
+     * @param size the size
      */
     void UpdateDlRlcBufferInfo(uint16_t rnti, uint8_t lcid, uint16_t size);
     /**
      * Update UL RLC buffer info function
-     * \param rnti the RNTI
-     * \param size the size
+     * @param rnti the RNTI
+     * @param size the size
      */
     void UpdateUlRlcBufferInfo(uint16_t rnti, uint16_t size);
 
     /**
-     * \brief Update and return a new process Id for the RNTI specified
+     * @brief Update and return a new process Id for the RNTI specified
      *
-     * \param rnti the RNTI of the UE to be updated
-     * \return the process id  value
+     * @param rnti the RNTI of the UE to be updated
+     * @return the process id  value
      */
     uint8_t UpdateHarqProcessId(uint16_t rnti);
 
     /**
-     * \brief Return the availability of free process for the RNTI specified
+     * @brief Return the availability of free process for the RNTI specified
      *
-     * \param rnti the RNTI of the UE to be updated
-     * \return the availability
+     * @param rnti the RNTI of the UE to be updated
+     * @return the availability
      */
     bool HarqProcessAvailability(uint16_t rnti);
 
     /**
-     * \brief Refresh HARQ processes according to the timers
+     * @brief Refresh HARQ processes according to the timers
      *
      */
     void RefreshHarqProcesses();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/fdtbfq-ff-mac-scheduler.cc ns-3.44/src/lte/model/fdtbfq-ff-mac-scheduler.cc
--- ns-3.43/src/lte/model/fdtbfq-ff-mac-scheduler.cc	2024-10-09 16:41:10.036656400 -0700
+++ ns-3.44/src/lte/model/fdtbfq-ff-mac-scheduler.cc	2025-03-09 16:55:49.599372000 -0700
@@ -12,12 +12,12 @@
 #include "lte-amc.h"
 #include "lte-vendor-specific-parameters.h"
 
-#include <ns3/boolean.h>
-#include <ns3/integer.h>
-#include <ns3/log.h>
-#include <ns3/math.h>
-#include <ns3/pointer.h>
-#include <ns3/simulator.h>
+#include "ns3/boolean.h"
+#include "ns3/integer.h"
+#include "ns3/log.h"
+#include "ns3/math.h"
+#include "ns3/pointer.h"
+#include "ns3/simulator.h"
 
 #include <cfloat>
 #include <set>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/fdtbfq-ff-mac-scheduler.h ns-3.44/src/lte/model/fdtbfq-ff-mac-scheduler.h
--- ns-3.43/src/lte/model/fdtbfq-ff-mac-scheduler.h	2024-10-09 16:41:10.036656400 -0700
+++ ns-3.44/src/lte/model/fdtbfq-ff-mac-scheduler.h	2025-03-09 16:55:49.599372000 -0700
@@ -17,7 +17,7 @@
 #include "lte-common.h"
 #include "lte-ffr-sap.h"
 
-#include <ns3/nstime.h>
+#include "ns3/nstime.h"
 
 #include <map>
 #include <vector>
@@ -44,8 +44,8 @@
 };
 
 /**
- * \ingroup ff-api
- * \brief Implements the SCHED SAP and CSCHED SAP for a Frequency Domain Token Bank Fair Queue
+ * @ingroup ff-api
+ * @brief Implements the SCHED SAP and CSCHED SAP for a Frequency Domain Token Bank Fair Queue
  * scheduler
  *
  * This class implements the interface defined by the FfMacScheduler abstract class
@@ -55,7 +55,7 @@
 {
   public:
     /**
-     * \brief Constructor
+     * @brief Constructor
      *
      * Creates the MAC Scheduler interface implementation
      */
@@ -69,42 +69,42 @@
     // inherited from Object
     void DoDispose() override;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     // inherited from FfMacScheduler
     /**
      * Set FF MAC Csched SAP user function
-     * \param s the FF MAC Csched SAP user
+     * @param s the FF MAC Csched SAP user
      */
     void SetFfMacCschedSapUser(FfMacCschedSapUser* s) override;
     /**
      * Set FF MAC sched SAP user function
-     * \param s the FF MAC sched SAP user
+     * @param s the FF MAC sched SAP user
      */
     void SetFfMacSchedSapUser(FfMacSchedSapUser* s) override;
     /**
      * Get FF MAC CSched SAP provider function
-     * \returns the FF MAC CSched SAP provider
+     * @returns the FF MAC CSched SAP provider
      */
     FfMacCschedSapProvider* GetFfMacCschedSapProvider() override;
     /**
      * Get FF MAC sched SAP provider function
-     * \returns the FF MAC Sched SAP Provider
+     * @returns the FF MAC Sched SAP Provider
      */
     FfMacSchedSapProvider* GetFfMacSchedSapProvider() override;
 
     // FFR SAPs
     /**
      * Set FFR SAP provider function
-     * \param s the FFR SAP provider
+     * @param s the FFR SAP provider
      */
     void SetLteFfrSapProvider(LteFfrSapProvider* s) override;
     /**
      * Get FFR SAP user function
-     * \returns the FFR SAP User
+     * @returns the FFR SAP User
      */
     LteFfrSapUser* GetLteFfrSapUser() override;
 
@@ -115,8 +115,8 @@
 
     /**
      * Transmission mode config update function
-     * \param rnti the RNTI
-     * \param txMode the transmit mode
+     * @param rnti the RNTI
+     * @param txMode the transmit mode
      */
     void TransmissionModeConfigurationUpdate(uint16_t rnti, uint8_t txMode);
 
@@ -128,31 +128,31 @@
 
     /**
      * Csched cell config request function
-     * \param params the CSched cell config request parameters
+     * @param params the CSched cell config request parameters
      */
     void DoCschedCellConfigReq(const FfMacCschedSapProvider::CschedCellConfigReqParameters& params);
 
     /**
      * CSched UE config request function
-     * \param params CSChed UE config request parameters
+     * @param params CSChed UE config request parameters
      */
     void DoCschedUeConfigReq(const FfMacCschedSapProvider::CschedUeConfigReqParameters& params);
 
     /**
      * CSched LC config request function
-     * \param params the CSched LC config request parameters
+     * @param params the CSched LC config request parameters
      */
     void DoCschedLcConfigReq(const FfMacCschedSapProvider::CschedLcConfigReqParameters& params);
 
     /**
      * CSched LC release request function
-     * \param params the CSChed LC release request parameters
+     * @param params the CSChed LC release request parameters
      */
     void DoCschedLcReleaseReq(const FfMacCschedSapProvider::CschedLcReleaseReqParameters& params);
 
     /**
      * CSched UE release request function
-     * \param params the CSched UE release request parameters
+     * @param params the CSched UE release request parameters
      */
     void DoCschedUeReleaseReq(const FfMacCschedSapProvider::CschedUeReleaseReqParameters& params);
 
@@ -163,93 +163,93 @@
 
     /**
      * Sched DL RLC buffer request function
-     * \param params the Sched DL RLC buffer request parameters
+     * @param params the Sched DL RLC buffer request parameters
      */
     void DoSchedDlRlcBufferReq(const FfMacSchedSapProvider::SchedDlRlcBufferReqParameters& params);
 
     /**
      * Sched DL paging buffer request function
-     * \param params the Sched DL paging buffer request parameters
+     * @param params the Sched DL paging buffer request parameters
      */
     void DoSchedDlPagingBufferReq(
         const FfMacSchedSapProvider::SchedDlPagingBufferReqParameters& params);
 
     /**
      * Sched DL MAC  buffer request function
-     * \param params Sched DL MAC buffer request parameters
+     * @param params Sched DL MAC buffer request parameters
      */
     void DoSchedDlMacBufferReq(const FfMacSchedSapProvider::SchedDlMacBufferReqParameters& params);
 
     /**
      * Sched DL trigger request function
      *
-     * \param params FfMacSchedSapProvider::SchedDlTriggerReqParameters&
+     * @param params FfMacSchedSapProvider::SchedDlTriggerReqParameters&
      */
     void DoSchedDlTriggerReq(const FfMacSchedSapProvider::SchedDlTriggerReqParameters& params);
 
     /**
      * Sched DL RACH info request function
-     * \param params the Sched DL RACH info request parameters
+     * @param params the Sched DL RACH info request parameters
      */
     void DoSchedDlRachInfoReq(const FfMacSchedSapProvider::SchedDlRachInfoReqParameters& params);
 
     /**
      * Sched DL CQI info request function
-     * \param params the Sched DL CQI info request parameters
+     * @param params the Sched DL CQI info request parameters
      */
     void DoSchedDlCqiInfoReq(const FfMacSchedSapProvider::SchedDlCqiInfoReqParameters& params);
 
     /**
      * Sched UL trigger request function
-     * \param params the Sched UL trigger request parameters
+     * @param params the Sched UL trigger request parameters
      */
     void DoSchedUlTriggerReq(const FfMacSchedSapProvider::SchedUlTriggerReqParameters& params);
 
     /**
      * Sched UL noise interference request function
-     * \param params the Sched UL noise interference request parameters
+     * @param params the Sched UL noise interference request parameters
      */
     void DoSchedUlNoiseInterferenceReq(
         const FfMacSchedSapProvider::SchedUlNoiseInterferenceReqParameters& params);
 
     /**
      * Sched UL SR info request function
-     * \param params the Sched UL SR info request parameters
+     * @param params the Sched UL SR info request parameters
      */
     void DoSchedUlSrInfoReq(const FfMacSchedSapProvider::SchedUlSrInfoReqParameters& params);
 
     /**
      * Sched UL MAC control info request function
-     * \param params the Sched UL MAC control info request parameters
+     * @param params the Sched UL MAC control info request parameters
      */
     void DoSchedUlMacCtrlInfoReq(
         const FfMacSchedSapProvider::SchedUlMacCtrlInfoReqParameters& params);
 
     /**
      * Sched UL CQI info request function
-     * \param params the Sched UL CQI info request parameters
+     * @param params the Sched UL CQI info request parameters
      */
     void DoSchedUlCqiInfoReq(const FfMacSchedSapProvider::SchedUlCqiInfoReqParameters& params);
 
     /**
      * Get RBG size function
-     * \param dlbandwidth the DL bandwidth
-     * \returns the RBG size
+     * @param dlbandwidth the DL bandwidth
+     * @returns the RBG size
      */
     int GetRbgSize(int dlbandwidth);
 
     /**
      * LC Active per flow function
-     * \param rnti the RNTI
-     * \returns the LC active per flow
+     * @param rnti the RNTI
+     * @returns the LC active per flow
      */
     unsigned int LcActivePerFlow(uint16_t rnti);
 
     /**
      * Estimate UL SNR function
-     * \param rnti the RNTI
-     * \param rb the RB
-     * \returns the UL SINR
+     * @param rnti the RNTI
+     * @param rb the RB
+     * @returns the UL SINR
      */
     double EstimateUlSinr(uint16_t rnti, uint16_t rb);
 
@@ -260,36 +260,36 @@
 
     /**
      * Update DL RLC buffer info function
-     * \param rnti the RNTI
-     * \param lcid the LCID
-     * \param size the size
+     * @param rnti the RNTI
+     * @param lcid the LCID
+     * @param size the size
      */
     void UpdateDlRlcBufferInfo(uint16_t rnti, uint8_t lcid, uint16_t size);
     /**
      * Update UL RLC buffer info function
-     * \param rnti the RNTI
-     * \param size the size
+     * @param rnti the RNTI
+     * @param size the size
      */
     void UpdateUlRlcBufferInfo(uint16_t rnti, uint16_t size);
 
     /**
-     * \brief Update and return a new process Id for the RNTI specified
+     * @brief Update and return a new process Id for the RNTI specified
      *
-     * \param rnti the RNTI of the UE to be updated
-     * \return the process id  value
+     * @param rnti the RNTI of the UE to be updated
+     * @return the process id  value
      */
     uint8_t UpdateHarqProcessId(uint16_t rnti);
 
     /**
-     * \brief Return the availability of free process for the RNTI specified
+     * @brief Return the availability of free process for the RNTI specified
      *
-     * \param rnti the RNTI of the UE to be updated
-     * \return the availability
+     * @param rnti the RNTI of the UE to be updated
+     * @return the availability
      */
     bool HarqProcessAvailability(uint16_t rnti);
 
     /**
-     * \brief Refresh HARQ processes according to the timers
+     * @brief Refresh HARQ processes according to the timers
      *
      */
     void RefreshHarqProcesses();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/ff-mac-common.h ns-3.44/src/lte/model/ff-mac-common.h
--- ns-3.43/src/lte/model/ff-mac-common.h	2024-10-09 16:41:10.036656400 -0700
+++ ns-3.44/src/lte/model/ff-mac-common.h	2025-03-09 16:55:49.599372000 -0700
@@ -9,8 +9,8 @@
 #ifndef FF_MAC_COMMON_H
 #define FF_MAC_COMMON_H
 
-#include <ns3/ptr.h>
-#include <ns3/simple-ref-count.h>
+#include "ns3/ptr.h"
+#include "ns3/simple-ref-count.h"
 
 #include <vector>
 
@@ -75,8 +75,8 @@
 };
 
 /**
- * \brief See section 4.3.1 dlDciListElement
- * \struct DlDciListElement_s
+ * @brief See section 4.3.1 dlDciListElement
+ * @struct DlDciListElement_s
  */
 struct DlDciListElement_s
 {
@@ -138,8 +138,8 @@
 };
 
 /**
- * \brief See section 4.3.2 ulDciListElement
- * \struct UlDciListElement_s
+ * @brief See section 4.3.2 ulDciListElement
+ * @struct UlDciListElement_s
  */
 struct UlDciListElement_s
 {
@@ -163,7 +163,7 @@
 };
 
 /**
- * \brief Base class for storing the values of vendor specific parameters
+ * @brief Base class for storing the values of vendor specific parameters
  */
 struct VendorSpecificValue : public SimpleRefCount<VendorSpecificValue>
 {
@@ -171,8 +171,8 @@
 };
 
 /**
- * \brief See section 4.3.3 vendorSpecificListElement
- * \struct VendorSpecificListElement_s
+ * @brief See section 4.3.3 vendorSpecificListElement
+ * @struct VendorSpecificListElement_s
  */
 struct VendorSpecificListElement_s
 {
@@ -182,8 +182,8 @@
 };
 
 /**
- * \brief See section 4.3.4 logicalChannelConfigListElement
- * \struct LogicalChannelConfigListElement_s
+ * @brief See section 4.3.4 logicalChannelConfigListElement
+ * @struct LogicalChannelConfigListElement_s
  */
 struct LogicalChannelConfigListElement_s
 {
@@ -216,8 +216,8 @@
 };
 
 /**
- * \brief See section 4.3.6 rachListElement
- * \struct RachListElement_s
+ * @brief See section 4.3.6 rachListElement
+ * @struct RachListElement_s
  */
 struct RachListElement_s
 {
@@ -226,8 +226,8 @@
 };
 
 /**
- * \brief See section 4.3.7 phichListElement
- * \struct PhichListElement_s
+ * @brief See section 4.3.7 phichListElement
+ * @struct PhichListElement_s
  */
 struct PhichListElement_s
 {
@@ -243,7 +243,7 @@
 };
 
 /**
- * \brief See section 4.3.9 rlcPDU_ListElement
+ * @brief See section 4.3.9 rlcPDU_ListElement
  */
 struct RlcPduListElement_s
 {
@@ -252,8 +252,8 @@
 };
 
 /**
- * \brief See section 4.3.8 buildDataListElement
- * \struct BuildDataListElement_s
+ * @brief See section 4.3.8 buildDataListElement
+ * @struct BuildDataListElement_s
  */
 struct BuildDataListElement_s
 {
@@ -264,7 +264,7 @@
 };
 
 /**
- * \brief Substitutive structure for specifying BuildRarListElement_s::m_grant field
+ * @brief Substitutive structure for specifying BuildRarListElement_s::m_grant field
  */
 struct UlGrant_s
 {
@@ -280,7 +280,7 @@
 };
 
 /**
- * \brief See section 4.3.10 buildRARListElement
+ * @brief See section 4.3.10 buildRARListElement
  */
 struct BuildRarListElement_s
 {
@@ -291,7 +291,7 @@
 };
 
 /**
- * \brief See section 4.3.11 buildBroadcastListElement
+ * @brief See section 4.3.11 buildBroadcastListElement
  */
 struct BuildBroadcastListElement_s
 {
@@ -308,7 +308,7 @@
 };
 
 /**
- * \brief See section 4.3.12 ulInfoListElement
+ * @brief See section 4.3.12 ulInfoListElement
  */
 struct UlInfoListElement_s
 {
@@ -327,7 +327,7 @@
 };
 
 /**
- * \brief See section 4.3.13 srListElement
+ * @brief See section 4.3.13 srListElement
  */
 struct SrListElement_s
 {
@@ -335,7 +335,7 @@
 };
 
 /**
- * \brief See section 4.3.15 macCEValue
+ * @brief See section 4.3.15 macCEValue
  */
 struct MacCeValue_u
 {
@@ -345,7 +345,7 @@
 };
 
 /**
- * \brief See section 4.3.14 macCEListElement
+ * @brief See section 4.3.14 macCEListElement
  */
 struct MacCeListElement_s
 {
@@ -363,7 +363,7 @@
 };
 
 /**
- * \brief See section 4.3.16 drxConfig
+ * @brief See section 4.3.16 drxConfig
  */
 struct DrxConfig_s
 {
@@ -377,7 +377,7 @@
 };
 
 /**
- * \brief See section 4.3.17 spsConfig
+ * @brief See section 4.3.17 spsConfig
  */
 struct SpsConfig_s
 {
@@ -390,7 +390,7 @@
 };
 
 /**
- * \brief See section 4.3.18 srConfig
+ * @brief See section 4.3.18 srConfig
  */
 struct SrConfig_s
 {
@@ -406,7 +406,7 @@
 };
 
 /**
- * \brief See section 4.3.19 cqiConfig
+ * @brief See section 4.3.19 cqiConfig
  */
 struct CqiConfig_s
 {
@@ -422,7 +422,7 @@
 };
 
 /**
- * \brief See section 4.3.20 ueCapabilities
+ * @brief See section 4.3.20 ueCapabilities
  */
 struct UeCapabilities_s
 {
@@ -434,7 +434,7 @@
 };
 
 /**
- * \brief See section 4.3.22 siMessageListElement
+ * @brief See section 4.3.22 siMessageListElement
  */
 struct SiMessageListElement_s
 {
@@ -443,7 +443,7 @@
 };
 
 /**
- * \brief See section 4.3.21 siConfiguration
+ * @brief See section 4.3.21 siConfiguration
  */
 struct SiConfiguration_s
 {
@@ -454,7 +454,7 @@
 };
 
 /**
- * \brief See section 4.3.23 dlInfoListElement
+ * @brief See section 4.3.23 dlInfoListElement
  */
 struct DlInfoListElement_s
 {
@@ -473,7 +473,7 @@
 };
 
 /**
- * \brief See section 4.3.28 bwPart
+ * @brief See section 4.3.28 bwPart
  */
 struct BwPart_s
 {
@@ -483,7 +483,7 @@
 };
 
 /**
- * \brief See section 4.3.27 higherLayerSelected
+ * @brief See section 4.3.27 higherLayerSelected
  */
 struct HigherLayerSelected_s
 {
@@ -492,7 +492,7 @@
 };
 
 /**
- * \brief See section 4.3.26 ueSelected
+ * @brief See section 4.3.26 ueSelected
  */
 struct UeSelected_s
 {
@@ -502,7 +502,7 @@
 };
 
 /**
- * \brief See section 4.3.25 sbMeasResult
+ * @brief See section 4.3.25 sbMeasResult
  */
 struct SbMeasResult_s
 {
@@ -512,7 +512,7 @@
 };
 
 /**
- * \brief See section 4.3.24 cqiListElement
+ * @brief See section 4.3.24 cqiListElement
  */
 struct CqiListElement_s
 {
@@ -541,7 +541,7 @@
 };
 
 /**
- * \brief See section 4.3.29 ulCQI
+ * @brief See section 4.3.29 ulCQI
  */
 struct UlCqi_s
 {
@@ -560,7 +560,7 @@
 };
 
 /**
- * \brief See section 4.3.30 pagingInfoListElement
+ * @brief See section 4.3.30 pagingInfoListElement
  */
 struct PagingInfoListElement_s
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/ff-mac-csched-sap.h ns-3.44/src/lte/model/ff-mac-csched-sap.h
--- ns-3.43/src/lte/model/ff-mac-csched-sap.h	2024-10-09 16:41:10.036656400 -0700
+++ ns-3.44/src/lte/model/ff-mac-csched-sap.h	2025-03-09 16:55:49.599372000 -0700
@@ -18,8 +18,8 @@
 {
 
 /**
- * \ingroup ff-api
- * \brief Provides the CSCHED SAP
+ * @ingroup ff-api
+ * @brief Provides the CSCHED SAP
  *
  * This abstract class defines the MAC Scheduler interface specified in the
  * Femto Forum Technical Document:
@@ -234,37 +234,37 @@
     //
 
     /**
-     * \brief CSCHED_CELL_CONFIG_REQ
+     * @brief CSCHED_CELL_CONFIG_REQ
      *
-     * \param params CschedCellConfigReqParameters
+     * @param params CschedCellConfigReqParameters
      */
     virtual void CschedCellConfigReq(const CschedCellConfigReqParameters& params) = 0;
 
     /**
-     * \brief CSCHED_UE_CONFIG_REQ
+     * @brief CSCHED_UE_CONFIG_REQ
      *
-     * \param params CschedUeConfigReqParameters
+     * @param params CschedUeConfigReqParameters
      */
     virtual void CschedUeConfigReq(const CschedUeConfigReqParameters& params) = 0;
 
     /**
-     * \brief CSCHED_LC_CONFIG_REQ
+     * @brief CSCHED_LC_CONFIG_REQ
      *
-     * \param params CschedLcConfigReqParameters
+     * @param params CschedLcConfigReqParameters
      */
     virtual void CschedLcConfigReq(const CschedLcConfigReqParameters& params) = 0;
 
     /**
-     * \brief CSCHED_LC_RELEASE_REQ
+     * @brief CSCHED_LC_RELEASE_REQ
      *
-     * \param params CschedLcReleaseReqParameters
+     * @param params CschedLcReleaseReqParameters
      */
     virtual void CschedLcReleaseReq(const CschedLcReleaseReqParameters& params) = 0;
 
     /**
-     * \brief CSCHED_UE_RELEASE_REQ
+     * @brief CSCHED_UE_RELEASE_REQ
      *
-     * \param params CschedUeReleaseReqParameters
+     * @param params CschedUeReleaseReqParameters
      */
     virtual void CschedUeReleaseReq(const CschedUeReleaseReqParameters& params) = 0;
 
@@ -382,51 +382,51 @@
     //
 
     /**
-     * \brief CSCHED_CELL_CONFIG_CNF
+     * @brief CSCHED_CELL_CONFIG_CNF
      *
-     * \param params CschedCellConfigCnfParameters
+     * @param params CschedCellConfigCnfParameters
      */
     virtual void CschedCellConfigCnf(const CschedCellConfigCnfParameters& params) = 0;
 
     /**
-     * \brief CSCHED_UE_CONFIG_CNF
+     * @brief CSCHED_UE_CONFIG_CNF
      *
-     * \param params CschedUeConfigCnfParameters
+     * @param params CschedUeConfigCnfParameters
      */
     virtual void CschedUeConfigCnf(const CschedUeConfigCnfParameters& params) = 0;
 
     /**
-     * \brief CSCHED_LC_CONFIG_CNF
+     * @brief CSCHED_LC_CONFIG_CNF
      *
-     * \param params CschedLcConfigCnfParameters
+     * @param params CschedLcConfigCnfParameters
      */
     virtual void CschedLcConfigCnf(const CschedLcConfigCnfParameters& params) = 0;
 
     /**
-     * \brief CSCHED_LC_RELEASE_CNF
+     * @brief CSCHED_LC_RELEASE_CNF
      *
-     * \param params CschedLcReleaseCnfParameters
+     * @param params CschedLcReleaseCnfParameters
      */
     virtual void CschedLcReleaseCnf(const CschedLcReleaseCnfParameters& params) = 0;
 
     /**
-     * \brief CSCHED_UE_RELEASE_CNF
+     * @brief CSCHED_UE_RELEASE_CNF
      *
-     * \param params CschedUeReleaseCnfParameters
+     * @param params CschedUeReleaseCnfParameters
      */
     virtual void CschedUeReleaseCnf(const CschedUeReleaseCnfParameters& params) = 0;
 
     /**
-     * \brief CSCHED_UE_UPDATE_IND
+     * @brief CSCHED_UE_UPDATE_IND
      *
-     * \param params CschedUeConfigUpdateIndParameters
+     * @param params CschedUeConfigUpdateIndParameters
      */
     virtual void CschedUeConfigUpdateInd(const CschedUeConfigUpdateIndParameters& params) = 0;
 
     /**
-     * \brief CSCHED_UE_CONFIG_IND
+     * @brief CSCHED_UE_CONFIG_IND
      *
-     * \param params CschedCellConfigUpdateIndParameters
+     * @param params CschedCellConfigUpdateIndParameters
      */
     virtual void CschedCellConfigUpdateInd(const CschedCellConfigUpdateIndParameters& params) = 0;
 
@@ -441,7 +441,7 @@
     /**
      * Constructor
      *
-     * \param scheduler the scheduler class
+     * @param scheduler the scheduler class
      */
     MemberCschedSapProvider(C* scheduler);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/ff-mac-sched-sap.h ns-3.44/src/lte/model/ff-mac-sched-sap.h
--- ns-3.43/src/lte/model/ff-mac-sched-sap.h	2024-10-09 16:41:10.036656400 -0700
+++ ns-3.44/src/lte/model/ff-mac-sched-sap.h	2025-03-09 16:55:49.599372000 -0700
@@ -18,8 +18,8 @@
 {
 
 /**
- * \ingroup ff-api
- * \brief Provides the SCHED SAP
+ * @ingroup ff-api
+ * @brief Provides the SCHED SAP
  *
  * This abstract class defines the MAC Scheduler interface specified in the
  * Femto Forum Technical Document:
@@ -184,80 +184,80 @@
     //
 
     /**
-     * \brief SCHED_DL_RLC_BUFFER_REQ
+     * @brief SCHED_DL_RLC_BUFFER_REQ
      *
-     * \param params SchedDlRlcBufferReqParameters
+     * @param params SchedDlRlcBufferReqParameters
      */
     virtual void SchedDlRlcBufferReq(const SchedDlRlcBufferReqParameters& params) = 0;
 
     /**
-     * \brief SCHED_DL_PAGING_BUFFER_REQ
+     * @brief SCHED_DL_PAGING_BUFFER_REQ
      *
-     * \param params SchedDlPagingBufferReqParameters
+     * @param params SchedDlPagingBufferReqParameters
      */
     virtual void SchedDlPagingBufferReq(const SchedDlPagingBufferReqParameters& params) = 0;
 
     /**
-     * \brief SCHED_DL_MAC_BUFFER_REQ
+     * @brief SCHED_DL_MAC_BUFFER_REQ
      *
-     * \param params SchedDlMacBufferReqParameters
+     * @param params SchedDlMacBufferReqParameters
      */
     virtual void SchedDlMacBufferReq(const SchedDlMacBufferReqParameters& params) = 0;
 
     /**
-     * \brief SCHED_DL_TRIGGER_REQ
+     * @brief SCHED_DL_TRIGGER_REQ
      *
-     * \param params SchedDlTriggerReqParameters
+     * @param params SchedDlTriggerReqParameters
      */
     virtual void SchedDlTriggerReq(const SchedDlTriggerReqParameters& params) = 0;
 
     /**
-     * \brief SCHED_DL_RACH_INFO_REQ
+     * @brief SCHED_DL_RACH_INFO_REQ
      *
-     * \param params SchedDlRachInfoReqParameters
+     * @param params SchedDlRachInfoReqParameters
      */
     virtual void SchedDlRachInfoReq(const SchedDlRachInfoReqParameters& params) = 0;
 
     /**
-     * \brief SCHED_DL_CQI_INFO_REQ
+     * @brief SCHED_DL_CQI_INFO_REQ
      *
-     * \param params SchedDlCqiInfoReqParameters
+     * @param params SchedDlCqiInfoReqParameters
      */
     virtual void SchedDlCqiInfoReq(const SchedDlCqiInfoReqParameters& params) = 0;
 
     /**
-     * \brief SCHED_UL_TRIGGER_REQ
+     * @brief SCHED_UL_TRIGGER_REQ
      *
-     * \param params SchedUlTriggerReqParameters
+     * @param params SchedUlTriggerReqParameters
      */
     virtual void SchedUlTriggerReq(const SchedUlTriggerReqParameters& params) = 0;
 
     /**
-     * \brief SCHED_UL_NOISE_INTERFERENCE_REQ
+     * @brief SCHED_UL_NOISE_INTERFERENCE_REQ
      *
-     * \param params SchedUlNoiseInterferenceReqParameters
+     * @param params SchedUlNoiseInterferenceReqParameters
      */
     virtual void SchedUlNoiseInterferenceReq(
         const SchedUlNoiseInterferenceReqParameters& params) = 0;
 
     /**
-     * \brief SCHED_UL_SR_INFO_REQ
+     * @brief SCHED_UL_SR_INFO_REQ
      *
-     * \param params SchedUlSrInfoReqParameters
+     * @param params SchedUlSrInfoReqParameters
      */
     virtual void SchedUlSrInfoReq(const SchedUlSrInfoReqParameters& params) = 0;
 
     /**
-     * \brief SCHED_UL_MAC_CTRL_INFO_REQ
+     * @brief SCHED_UL_MAC_CTRL_INFO_REQ
      *
-     * \param params SchedUlMacCtrlInfoReqParameters
+     * @param params SchedUlMacCtrlInfoReqParameters
      */
     virtual void SchedUlMacCtrlInfoReq(const SchedUlMacCtrlInfoReqParameters& params) = 0;
 
     /**
-     * \brief SCHED_UL_CQI_INFO_REQ
+     * @brief SCHED_UL_CQI_INFO_REQ
      *
-     * \param params SchedUlCqiInfoReqParameters
+     * @param params SchedUlCqiInfoReqParameters
      */
     virtual void SchedUlCqiInfoReq(const SchedUlCqiInfoReqParameters& params) = 0;
 
@@ -307,16 +307,16 @@
     //
 
     /**
-     * \brief SCHED_DL_CONFIG_IND
+     * @brief SCHED_DL_CONFIG_IND
      *
-     * \param params SchedDlConfigIndParameters
+     * @param params SchedDlConfigIndParameters
      */
     virtual void SchedDlConfigInd(const SchedDlConfigIndParameters& params) = 0;
 
     /**
-     * \brief SCHED_UL_CONFIG_IND
+     * @brief SCHED_UL_CONFIG_IND
      *
-     * \param params SchedUlConfigIndParameters
+     * @param params SchedUlConfigIndParameters
      */
     virtual void SchedUlConfigInd(const SchedUlConfigIndParameters& params) = 0;
 
@@ -331,7 +331,7 @@
     /**
      * Constructor
      *
-     * \param scheduler the scheduler class
+     * @param scheduler the scheduler class
      */
     MemberSchedSapProvider(C* scheduler);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/ff-mac-scheduler.cc ns-3.44/src/lte/model/ff-mac-scheduler.cc
--- ns-3.43/src/lte/model/ff-mac-scheduler.cc	2024-10-09 16:41:10.036656400 -0700
+++ ns-3.44/src/lte/model/ff-mac-scheduler.cc	2025-03-09 16:55:49.599372000 -0700
@@ -8,8 +8,8 @@
 
 #include "ff-mac-scheduler.h"
 
-#include <ns3/enum.h>
-#include <ns3/log.h>
+#include "ns3/enum.h"
+#include "ns3/log.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/ff-mac-scheduler.h ns-3.44/src/lte/model/ff-mac-scheduler.h
--- ns-3.43/src/lte/model/ff-mac-scheduler.h	2024-10-09 16:41:10.036656400 -0700
+++ ns-3.44/src/lte/model/ff-mac-scheduler.h	2025-03-09 16:55:49.599372000 -0700
@@ -12,7 +12,7 @@
 
 #include "ff-mac-common.h"
 
-#include <ns3/object.h>
+#include "ns3/object.h"
 
 namespace ns3
 {
@@ -25,8 +25,8 @@
 class LteFfrSapUser;
 
 /**
- * \ingroup lte
- * \defgroup ff-api FF MAC Schedulers
+ * @ingroup lte
+ * @defgroup ff-api FF MAC Schedulers
  */
 
 /// DL HARQ process status vector
@@ -61,7 +61,7 @@
 constexpr uint32_t HARQ_DL_TIMEOUT = 11;
 
 /**
- * \ingroup ff-api
+ * @ingroup ff-api
  *
  * This abstract base class identifies the interface by means of which
  * the helper object can plug on the MAC a scheduler implementation based on the
@@ -97,8 +97,8 @@
     // inherited from Object
     void DoDispose() override;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -106,7 +106,7 @@
      * set the user part of the FfMacCschedSap that this Scheduler will
      * interact with. Normally this part of the SAP is exported by the MAC.
      *
-     * \param s
+     * @param s
      */
     virtual void SetFfMacCschedSapUser(FfMacCschedSapUser* s) = 0;
 
@@ -115,19 +115,19 @@
      * set the user part of the FfMacSchedSap that this Scheduler will
      * interact with. Normally this part of the SAP is exported by the MAC.
      *
-     * \param s
+     * @param s
      */
     virtual void SetFfMacSchedSapUser(FfMacSchedSapUser* s) = 0;
 
     /**
      *
-     * \return the Provider part of the FfMacCschedSap provided by the Scheduler
+     * @return the Provider part of the FfMacCschedSap provided by the Scheduler
      */
     virtual FfMacCschedSapProvider* GetFfMacCschedSapProvider() = 0;
 
     /**
      *
-     * \return the Provider part of the FfMacSchedSap provided by the Scheduler
+     * @return the Provider part of the FfMacSchedSap provided by the Scheduler
      */
     virtual FfMacSchedSapProvider* GetFfMacSchedSapProvider() = 0;
 
@@ -137,13 +137,13 @@
      * Set the Provider part of the LteFfrSap that this Scheduler will
      * interact with
      *
-     * \param s
+     * @param s
      */
     virtual void SetLteFfrSapProvider(LteFfrSapProvider* s) = 0;
 
     /**
      *
-     * \return the User part of the LteFfrSap provided by the FfrAlgorithm
+     * @return the User part of the LteFfrSap provided by the FfrAlgorithm
      */
     virtual LteFfrSapUser* GetLteFfrSapUser() = 0;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-amc.cc ns-3.44/src/lte/model/lte-amc.cc
--- ns-3.43/src/lte/model/lte-amc.cc	2024-10-09 16:41:10.036656400 -0700
+++ ns-3.44/src/lte/model/lte-amc.cc	2025-03-09 16:55:49.599372000 -0700
@@ -12,12 +12,12 @@
 
 #include "lte-mi-error-model.h"
 
+#include "ns3/assert.h"
+#include "ns3/double.h"
 #include "ns3/enum.h"
-#include <ns3/assert.h>
-#include <ns3/double.h>
-#include <ns3/log.h>
-#include <ns3/math.h>
-#include <ns3/spectrum-value.h>
+#include "ns3/log.h"
+#include "ns3/math.h"
+#include "ns3/spectrum-value.h"
 
 #include <vector>
 
@@ -111,7 +111,7 @@
  * Table of number of physical resource blocks (NPRB), TBS index (ITBS), and
  * their associated transport block size. Taken from 3GPP TS 36.213 v8.8.0
  * Table 7.1.7.2.1-1: _Transport block size table (dimension 27×110)_.
- * \note For NPRB = 1 and ITBS = 6 the standard returns 328, but it is not
+ * @note For NPRB = 1 and ITBS = 6 the standard returns 328, but it is not
  *       consistent with the other values, therefore we use 88 obtained by
  *       following the sequence of NPRB = 1 values.
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-amc.h ns-3.44/src/lte/model/lte-amc.h
--- ns-3.43/src/lte/model/lte-amc.h	2024-10-09 16:41:10.036656400 -0700
+++ ns-3.44/src/lte/model/lte-amc.h	2025-03-09 16:55:49.599372000 -0700
@@ -11,8 +11,8 @@
 #ifndef AMCMODULE_H
 #define AMCMODULE_H
 
-#include <ns3/object.h>
-#include <ns3/ptr.h>
+#include "ns3/object.h"
+#include "ns3/ptr.h"
 
 #include <vector>
 
@@ -22,7 +22,7 @@
 class SpectrumValue;
 
 /**
- * \ingroup lte
+ * @ingroup lte
  * Implements the Adaptive Modulation And Coding Scheme. As proposed in 3GPP
  * TSG-RAN WG1 [R1-081483 Conveying MCS and TB size via PDCCH]
  * (http://www.3gpp.org/ftp/tsg_ran/WG1_RL1/TSGR1_52b/Docs/R1-081483.zip).
@@ -31,8 +31,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -43,7 +43,7 @@
     enum AmcModel
     {
         /**
-         * \details
+         * @details
          * An AMC model based on Piro, G.; Grieco, L.A; Boggia, G.; Camarda, P.,
          * "A two-level scheduling algorithm for QoS support in the downlink of
          * LTE cellular networks," _Wireless Conference (EW), 2010 European_,
@@ -57,53 +57,53 @@
     };
 
     /**
-     * \brief Get the Modulation and Coding Scheme for
+     * @brief Get the Modulation and Coding Scheme for
      * a CQI value
-     * \param cqi the cqi value
-     * \return the MCS value
+     * @param cqi the cqi value
+     * @return the MCS value
      */
     int GetMcsFromCqi(int cqi);
 
     /**
-     * \brief Get the Transport Block Size for a selected MCS and number of PRB (table 7.1.7.2.1-1
+     * @brief Get the Transport Block Size for a selected MCS and number of PRB (table 7.1.7.2.1-1
      * of 36.213)
-     * \param mcs the MCS index
-     * \param nprb the no. of PRB
-     * \return the Transport Block Size in bits
+     * @param mcs the MCS index
+     * @param nprb the no. of PRB
+     * @return the Transport Block Size in bits
      */
     int GetDlTbSizeFromMcs(int mcs, int nprb);
 
     /**
-     * \brief Get the Transport Block Size for a selected MCS and number of PRB (table 8.6.1-1
+     * @brief Get the Transport Block Size for a selected MCS and number of PRB (table 8.6.1-1
      * of 36.213)
-     * \param mcs the MCS index
-     * \param nprb the no. of PRB
-     * \return the Transport Block Size in bits
+     * @param mcs the MCS index
+     * @param nprb the no. of PRB
+     * @return the Transport Block Size in bits
      */
     int GetUlTbSizeFromMcs(int mcs, int nprb);
 
     /**
-     * \brief Get the spectral efficiency value associated
+     * @brief Get the spectral efficiency value associated
      * to the received CQI
-     * \param cqi the cqi value
-     * \return the spectral efficiency in (bit/s)/Hz
+     * @param cqi the cqi value
+     * @return the spectral efficiency in (bit/s)/Hz
      */
     double GetSpectralEfficiencyFromCqi(int cqi);
 
     /**
-     * \brief Create a message with CQI feedback
-     * \param sinr the SpectrumValue vector of SINR for evaluating the CQI
-     * \param rbgSize size of RB group (in RBs) for evaluating subband/wideband CQI
-     * \return a vector of CQI feedbacks
+     * @brief Create a message with CQI feedback
+     * @param sinr the SpectrumValue vector of SINR for evaluating the CQI
+     * @param rbgSize size of RB group (in RBs) for evaluating subband/wideband CQI
+     * @return a vector of CQI feedbacks
      */
     std::vector<int> CreateCqiFeedbacks(const SpectrumValue& sinr, uint8_t rbgSize = 0);
 
     /**
-     * \brief Get a proper CQI for the spectral efficiency value.
+     * @brief Get a proper CQI for the spectral efficiency value.
      * In order to assure a lower block error rate, the AMC chooses the lower CQI value
      * for a given spectral efficiency
-     * \param s the spectral efficiency
-     * \return the CQI value
+     * @param s the spectral efficiency
+     * @return the CQI value
      */
     int GetCqiFromSpectralEfficiency(double s);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-anr.cc ns-3.44/src/lte/model/lte-anr.cc
--- ns-3.43/src/lte/model/lte-anr.cc	2024-10-09 16:41:10.036656400 -0700
+++ ns-3.44/src/lte/model/lte-anr.cc	2025-03-09 16:55:49.599372000 -0700
@@ -15,8 +15,8 @@
 
 #include "lte-anr.h"
 
-#include <ns3/log.h>
-#include <ns3/uinteger.h>
+#include "ns3/log.h"
+#include "ns3/uinteger.h"
 
 namespace ns3
 {
@@ -192,7 +192,7 @@
         {
             NS_LOG_WARN(
                 this << " Event A4 received without measurement results from neighbouring cells");
-            /// \todo Remove neighbours in the NRT.
+            /// @todo Remove neighbours in the NRT.
         }
 
     } // end of else of if (measId != m_measId)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-anr.h ns-3.44/src/lte/model/lte-anr.h
--- ns-3.43/src/lte/model/lte-anr.h	2024-10-09 16:41:10.036656400 -0700
+++ ns-3.44/src/lte/model/lte-anr.h	2025-03-09 16:55:49.599372000 -0700
@@ -19,7 +19,7 @@
 #include "lte-anr-sap.h"
 #include "lte-rrc-sap.h"
 
-#include <ns3/object.h>
+#include "ns3/object.h"
 
 #include <map>
 
@@ -31,7 +31,7 @@
 class LteNeighbourRelation;
 
 /**
- * \brief Automatic Neighbour Relation function.
+ * @brief Automatic Neighbour Relation function.
  *
  * ANR is a conceptually a list of neighbouring cells called the Neighbour
  * Relation Table (NRT). ANR has the capability of automatically inserting new
@@ -71,23 +71,23 @@
 {
   public:
     /**
-     * \brief Creates an ANR instance.
-     * \param servingCellId the cell ID of the eNodeB instance whom this ANR
+     * @brief Creates an ANR instance.
+     * @param servingCellId the cell ID of the eNodeB instance whom this ANR
      *                      instance is to be associated with
      */
     LteAnr(uint16_t servingCellId);
     ~LteAnr() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Provide an advance information about a related neighbouring cell
+     * @brief Provide an advance information about a related neighbouring cell
      *        and add it as a new Neighbour Relation entry.
-     * \param cellId the cell ID of the new neighbour
+     * @param cellId the cell ID of the new neighbour
      *
      * This function simulates the Neighbour Relation addition operation by
      * network operations and maintenance, as depicted in Section 22.3.2a of
@@ -101,8 +101,8 @@
     void AddNeighbourRelation(uint16_t cellId);
 
     /**
-     * \brief Remove an existing Neighbour Relation entry.
-     * \param cellId the cell ID to be removed from the NRT
+     * @brief Remove an existing Neighbour Relation entry.
+     * @param cellId the cell ID to be removed from the NRT
      *
      * This function simulates the Neighbour Relation removal operation by
      * network operations and maintenance, as depicted in Section 22.3.2a of
@@ -111,16 +111,16 @@
     void RemoveNeighbourRelation(uint16_t cellId);
 
     /**
-     * \brief Set the "user" part of the ANR SAP interface that this ANR instance
+     * @brief Set the "user" part of the ANR SAP interface that this ANR instance
      *        will interact with.
-     * \param s a reference to the "user" part of the interface, typically a
+     * @param s a reference to the "user" part of the interface, typically a
      *          member of an LteEnbRrc instance
      */
     virtual void SetLteAnrSapUser(LteAnrSapUser* s);
 
     /**
-     * \brief Export the "provider" part of the ANR SAP interface.
-     * \return the reference to the "provider" part of the interface, typically to
+     * @brief Export the "provider" part of the ANR SAP interface.
+     * @return the reference to the "provider" part of the interface, typically to
      *         be kept by an LteEnbRrc instance
      */
     virtual LteAnrSapProvider* GetLteAnrSapProvider();
@@ -137,36 +137,36 @@
     // ANR SAP PROVIDER IMPLEMENTATION
 
     /**
-     * \brief Implementation of LteAnrSapProvider::ReportUeMeas.
-     * \param measResults a single report of one measurement identity
+     * @brief Implementation of LteAnrSapProvider::ReportUeMeas.
+     * @param measResults a single report of one measurement identity
      */
     void DoReportUeMeas(LteRrcSap::MeasResults measResults);
 
     /**
-     * \brief Implementation of LteAnrSapProvider::AddNeighbourRelation.
-     * \param cellId the Physical Cell ID of the new neighbouring cell
+     * @brief Implementation of LteAnrSapProvider::AddNeighbourRelation.
+     * @param cellId the Physical Cell ID of the new neighbouring cell
      */
     void DoAddNeighbourRelation(uint16_t cellId);
 
     /**
-     * \brief Implementation of LteAnrSapProvider::GetNoRemove.
-     * \param cellId the Physical Cell ID of the neighbouring cell of interest
-     * \return if true, the Neighbour Relation shall *not* be removed from the NRT
+     * @brief Implementation of LteAnrSapProvider::GetNoRemove.
+     * @param cellId the Physical Cell ID of the neighbouring cell of interest
+     * @return if true, the Neighbour Relation shall *not* be removed from the NRT
      */
     bool DoGetNoRemove(uint16_t cellId) const;
 
     /**
-     * \brief Implementation of LteAnrSapProvider::GetNoHo.
-     * \param cellId the Physical Cell ID of the neighbouring cell of interest
-     * \return if true, the Neighbour Relation shall *not* be used by the eNodeB
+     * @brief Implementation of LteAnrSapProvider::GetNoHo.
+     * @param cellId the Physical Cell ID of the neighbouring cell of interest
+     * @return if true, the Neighbour Relation shall *not* be used by the eNodeB
      *         for handover reasons
      */
     bool DoGetNoHo(uint16_t cellId) const;
 
     /**
-     * \brief Implementation of LteAnrSapProvider::GetNoX2.
-     * \param cellId the Physical Cell ID of the neighbouring cell of interest
-     * \return if true, the Neighbour Relation shall *not* use an X2 interface in
+     * @brief Implementation of LteAnrSapProvider::GetNoX2.
+     * @param cellId the Physical Cell ID of the neighbouring cell of interest
+     * @return if true, the Neighbour Relation shall *not* use an X2 interface in
      *         order to initiate procedures towards the eNodeB parenting the
      *         target cell
      */
@@ -175,13 +175,13 @@
     // ANR SAP
 
     /**
-     * \brief Reference to the "provider" part of the ANR SAP interface, which is
+     * @brief Reference to the "provider" part of the ANR SAP interface, which is
      *        automatically created when this class instantiates.
      */
     LteAnrSapProvider* m_anrSapProvider;
 
     /**
-     * \brief Reference to the "user" part of the ANR SAP interface, which is
+     * @brief Reference to the "user" part of the ANR SAP interface, which is
      *        provided by the eNodeB RRC instance.
      */
     LteAnrSapUser* m_anrSapUser;
@@ -192,7 +192,7 @@
     uint8_t m_threshold;
 
     /**
-     * \brief Neighbour Relation between two eNodeBs (serving eNodeB and neighbour
+     * @brief Neighbour Relation between two eNodeBs (serving eNodeB and neighbour
      *        eNodeB).
      */
     struct NeighbourRelation_t
@@ -210,9 +210,9 @@
     NeighbourRelationTable_t m_neighbourRelationTable;
 
     /**
-     * \internal methods
-     * \param cellId
-     * \returns the neighbor relation
+     * @internal methods
+     * @param cellId
+     * @returns the neighbor relation
      */
     const NeighbourRelation_t* Find(uint16_t cellId) const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-anr-sap.h ns-3.44/src/lte/model/lte-anr-sap.h
--- ns-3.43/src/lte/model/lte-anr-sap.h	2024-10-09 16:41:10.036656400 -0700
+++ ns-3.44/src/lte/model/lte-anr-sap.h	2025-03-09 16:55:49.599372000 -0700
@@ -16,7 +16,7 @@
 {
 
 /**
- * \brief Service Access Point (SAP) offered by the ANR instance to the eNodeB
+ * @brief Service Access Point (SAP) offered by the ANR instance to the eNodeB
  *        RRC instance.
  *
  * This is the *ANR SAP Provider*, i.e., the part of the SAP that contains the
@@ -28,8 +28,8 @@
     virtual ~LteAnrSapProvider();
 
     /**
-     * \brief Send a UE measurement report to the ANC instance.
-     * \param measResults a single report of one measurement identity
+     * @brief Send a UE measurement report to the ANC instance.
+     * @param measResults a single report of one measurement identity
      *
      * The received measurement report is a result of the UE measurement
      * configuration previously configured by calling
@@ -39,33 +39,33 @@
     virtual void ReportUeMeas(LteRrcSap::MeasResults measResults) = 0;
 
     /**
-     * \brief Add a new Neighbour Relation entry.
-     * \param cellId the Physical Cell ID of the new neighbouring cell
+     * @brief Add a new Neighbour Relation entry.
+     * @param cellId the Physical Cell ID of the new neighbouring cell
      */
     virtual void AddNeighbourRelation(uint16_t cellId) = 0;
 
     /**
-     * \brief Get the value of *No Remove* field of a neighbouring cell from the
+     * @brief Get the value of *No Remove* field of a neighbouring cell from the
      *        Neighbour Relation Table (NRT).
-     * \param cellId the Physical Cell ID of the neighbouring cell of interest
-     * \return if true, the Neighbour Relation shall *not* be removed from the NRT
+     * @param cellId the Physical Cell ID of the neighbouring cell of interest
+     * @return if true, the Neighbour Relation shall *not* be removed from the NRT
      */
     virtual bool GetNoRemove(uint16_t cellId) const = 0;
 
     /**
-     * \brief Get the value of *No HO* field of a neighbouring cell from the
+     * @brief Get the value of *No HO* field of a neighbouring cell from the
      *        Neighbour Relation Table (NRT).
-     * \param cellId the Physical Cell ID of the neighbouring cell of interest
-     * \return if true, the Neighbour Relation shall *not* be used by the eNodeB
+     * @param cellId the Physical Cell ID of the neighbouring cell of interest
+     * @return if true, the Neighbour Relation shall *not* be used by the eNodeB
      *         for handover reasons
      */
     virtual bool GetNoHo(uint16_t cellId) const = 0;
 
     /**
-     * \brief Get the value of *No X2* field of a neighbouring cell from the
+     * @brief Get the value of *No X2* field of a neighbouring cell from the
      *        Neighbour Relation Table (NRT).
-     * \param cellId the Physical Cell ID of the neighbouring cell of interest
-     * \return if true, the Neighbour Relation shall *not* use an X2 interface in
+     * @param cellId the Physical Cell ID of the neighbouring cell of interest
+     * @return if true, the Neighbour Relation shall *not* use an X2 interface in
      *         order to initiate procedures towards the eNodeB parenting the
      *         target cell
      */
@@ -74,7 +74,7 @@
 }; // end of class LteAnrSapProvider
 
 /**
- * \brief Service Access Point (SAP) offered by the eNodeB RRC instance to the
+ * @brief Service Access Point (SAP) offered by the eNodeB RRC instance to the
  *        ANR instance.
  *
  * This is the *ANR SAP User*, i.e., the part of the SAP that contains the
@@ -86,10 +86,10 @@
     virtual ~LteAnrSapUser();
 
     /**
-     * \brief Request a certain reporting configuration to be fulfilled by the UEs
+     * @brief Request a certain reporting configuration to be fulfilled by the UEs
      *        attached to the eNodeB entity.
-     * \param reportConfig the UE measurement reporting configuration
-     * \return the measurement identity associated with this newly added
+     * @param reportConfig the UE measurement reporting configuration
+     * @return the measurement identity associated with this newly added
      *         reporting configuration
      *
      * The eNodeB RRC entity is expected to configure the same reporting
@@ -98,14 +98,14 @@
      * configuration, the eNodeB RRC entity shall forward this report to the ANC
      * instance through the LteAnrSapProvider::ReportUeMeas SAP function.
      *
-     * \note This function is only valid before the simulation begins.
+     * @note This function is only valid before the simulation begins.
      */
     virtual uint8_t AddUeMeasReportConfigForAnr(LteRrcSap::ReportConfigEutra reportConfig) = 0;
 
 }; // end of class LteAnrSapUser
 
 /**
- * \brief Template for the implementation of the LteAnrSapProvider as a member
+ * @brief Template for the implementation of the LteAnrSapProvider as a member
  *        of an owner class of type C to which all methods are forwarded.
  */
 template <class C>
@@ -115,7 +115,7 @@
     /**
      * Constructor
      *
-     * \param owner the owner class
+     * @param owner the owner class
      */
     MemberLteAnrSapProvider(C* owner);
 
@@ -176,7 +176,7 @@
 }
 
 /**
- * \brief Template for the implementation of the LteAnrSapUser as a member of an
+ * @brief Template for the implementation of the LteAnrSapUser as a member of an
  *        owner class of type C to which all methods are forwarded.
  */
 template <class C>
@@ -186,7 +186,7 @@
     /**
      * Constructor
      *
-     * \param owner the owner class
+     * @param owner the owner class
      */
     MemberLteAnrSapUser(C* owner);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-asn1-header.h ns-3.44/src/lte/model/lte-asn1-header.h
--- ns-3.43/src/lte/model/lte-asn1-header.h	2024-10-09 16:41:10.036656400 -0700
+++ ns-3.44/src/lte/model/lte-asn1-header.h	2025-03-09 16:55:49.599372000 -0700
@@ -29,8 +29,8 @@
     ~Asn1Header() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -61,7 +61,7 @@
 
     /**
      * Function to write in m_serializationResult, after resizing its size
-     * \param octet bits to write
+     * @param octet bits to write
      */
     void WriteOctet(uint8_t octet) const;
 
@@ -69,35 +69,35 @@
 
     /**
      * Serialize a bool
-     * \param value value to serialize
+     * @param value value to serialize
      */
     void SerializeBoolean(bool value) const;
     /**
      * Serialize an Integer
-     * \param n value to serialize
-     * \param nmin min value to serialize
-     * \param nmax max value to serialize
+     * @param n value to serialize
+     * @param nmin min value to serialize
+     * @param nmax max value to serialize
      */
     void SerializeInteger(int n, int nmin, int nmax) const;
     // void SerializeOctetstring (std::string s) const;
     /**
      * Serialize a Sequence
-     * \param numElems element number to serialize
-     * \param nMax max value to serialize
-     * \param nMin min value to serialize
+     * @param numElems element number to serialize
+     * @param nMax max value to serialize
+     * @param nMin min value to serialize
      */
     void SerializeSequenceOf(int numElems, int nMax, int nMin) const;
     /**
      * Serialize a Choice (set of options)
-     * \param numOptions number of options
-     * \param selectedOption selected option
-     * \param isExtensionMarkerPresent true if extension mark is present
+     * @param numOptions number of options
+     * @param selectedOption selected option
+     * @param isExtensionMarkerPresent true if extension mark is present
      */
     void SerializeChoice(int numOptions, int selectedOption, bool isExtensionMarkerPresent) const;
     /**
      * Serialize an Enum
-     * \param numElems number of elements in the enum
-     * \param selectedElem selected element
+     * @param numElems number of elements in the enum
+     * @param selectedElem selected element
      */
     void SerializeEnum(int numElems, int selectedElem) const;
     /**
@@ -111,141 +111,141 @@
 
     /**
      * Serialize a bitset
-     * \param data data to serialize
+     * @param data data to serialize
      */
     template <int N>
     void SerializeBitset(std::bitset<N> data) const;
 
     /**
      * Serialize a sequence
-     * \param optionalOrDefaultMask Mask to serialize
-     * \param isExtensionMarkerPresent true if Extension Marker is present
+     * @param optionalOrDefaultMask Mask to serialize
+     * @param isExtensionMarkerPresent true if Extension Marker is present
      */
     template <int N>
     void SerializeSequence(std::bitset<N> optionalOrDefaultMask,
                            bool isExtensionMarkerPresent) const;
     /**
      * Serialize a sequence
-     * \param optionalOrDefaultMask Mask to serialize
-     * \param isExtensionMarkerPresent true if Extension Marker is present
+     * @param optionalOrDefaultMask Mask to serialize
+     * @param isExtensionMarkerPresent true if Extension Marker is present
      */
     void SerializeSequence(std::bitset<0> optionalOrDefaultMask,
                            bool isExtensionMarkerPresent) const;
     /**
      * Serialize a sequence
-     * \param optionalOrDefaultMask Mask to serialize
-     * \param isExtensionMarkerPresent true if Extension Marker is present
+     * @param optionalOrDefaultMask Mask to serialize
+     * @param isExtensionMarkerPresent true if Extension Marker is present
      */
     void SerializeSequence(std::bitset<1> optionalOrDefaultMask,
                            bool isExtensionMarkerPresent) const;
     /**
      * Serialize a sequence
-     * \param optionalOrDefaultMask Mask to serialize
-     * \param isExtensionMarkerPresent true if Extension Marker is present
+     * @param optionalOrDefaultMask Mask to serialize
+     * @param isExtensionMarkerPresent true if Extension Marker is present
      */
     void SerializeSequence(std::bitset<2> optionalOrDefaultMask,
                            bool isExtensionMarkerPresent) const;
     /**
      * Serialize a sequence
-     * \param optionalOrDefaultMask Mask to serialize
-     * \param isExtensionMarkerPresent true if Extension Marker is present
+     * @param optionalOrDefaultMask Mask to serialize
+     * @param isExtensionMarkerPresent true if Extension Marker is present
      */
     void SerializeSequence(std::bitset<3> optionalOrDefaultMask,
                            bool isExtensionMarkerPresent) const;
     /**
      * Serialize a sequence
-     * \param optionalOrDefaultMask Mask to serialize
-     * \param isExtensionMarkerPresent true if Extension Marker is present
+     * @param optionalOrDefaultMask Mask to serialize
+     * @param isExtensionMarkerPresent true if Extension Marker is present
      */
     void SerializeSequence(std::bitset<4> optionalOrDefaultMask,
                            bool isExtensionMarkerPresent) const;
     /**
      * Serialize a sequence
-     * \param optionalOrDefaultMask Mask to serialize
-     * \param isExtensionMarkerPresent true if Extension Marker is present
+     * @param optionalOrDefaultMask Mask to serialize
+     * @param isExtensionMarkerPresent true if Extension Marker is present
      */
     void SerializeSequence(std::bitset<5> optionalOrDefaultMask,
                            bool isExtensionMarkerPresent) const;
     /**
      * Serialize a sequence
-     * \param optionalOrDefaultMask Mask to serialize
-     * \param isExtensionMarkerPresent true if Extension Marker is present
+     * @param optionalOrDefaultMask Mask to serialize
+     * @param isExtensionMarkerPresent true if Extension Marker is present
      */
     void SerializeSequence(std::bitset<6> optionalOrDefaultMask,
                            bool isExtensionMarkerPresent) const;
     /**
      * Serialize a sequence
-     * \param optionalOrDefaultMask Mask to serialize
-     * \param isExtensionMarkerPresent true if Extension Marker is present
+     * @param optionalOrDefaultMask Mask to serialize
+     * @param isExtensionMarkerPresent true if Extension Marker is present
      */
     void SerializeSequence(std::bitset<7> optionalOrDefaultMask,
                            bool isExtensionMarkerPresent) const;
     /**
      * Serialize a sequence
-     * \param optionalOrDefaultMask Mask to serialize
-     * \param isExtensionMarkerPresent true if Extension Marker is present
+     * @param optionalOrDefaultMask Mask to serialize
+     * @param isExtensionMarkerPresent true if Extension Marker is present
      */
     void SerializeSequence(std::bitset<9> optionalOrDefaultMask,
                            bool isExtensionMarkerPresent) const;
     /**
      * Serialize a sequence
-     * \param optionalOrDefaultMask Mask to serialize
-     * \param isExtensionMarkerPresent true if Extension Marker is present
+     * @param optionalOrDefaultMask Mask to serialize
+     * @param isExtensionMarkerPresent true if Extension Marker is present
      */
     void SerializeSequence(std::bitset<10> optionalOrDefaultMask,
                            bool isExtensionMarkerPresent) const;
     /**
      * Serialize a sequence
-     * \param optionalOrDefaultMask Mask to serialize
-     * \param isExtensionMarkerPresent true if Extension Marker is present
+     * @param optionalOrDefaultMask Mask to serialize
+     * @param isExtensionMarkerPresent true if Extension Marker is present
      */
     void SerializeSequence(std::bitset<11> optionalOrDefaultMask,
                            bool isExtensionMarkerPresent) const;
 
     /**
      * Serialize a bitstring
-     * \param bitstring bitstring to serialize
+     * @param bitstring bitstring to serialize
      */
     template <int N>
     void SerializeBitstring(std::bitset<N> bitstring) const;
     /**
      * Serialize a bitstring
-     * \param bitstring bitstring to serialize
+     * @param bitstring bitstring to serialize
      */
     void SerializeBitstring(std::bitset<1> bitstring) const;
     /**
      * Serialize a bitstring
-     * \param bitstring bitstring to serialize
+     * @param bitstring bitstring to serialize
      */
     void SerializeBitstring(std::bitset<2> bitstring) const;
     /**
      * Serialize a bitstring
-     * \param bitstring bitstring to serialize
+     * @param bitstring bitstring to serialize
      */
     void SerializeBitstring(std::bitset<8> bitstring) const;
     /**
      * Serialize a bitstring
-     * \param bitstring bitstring to serialize
+     * @param bitstring bitstring to serialize
      */
     void SerializeBitstring(std::bitset<10> bitstring) const;
     /**
      * Serialize a bitstring
-     * \param bitstring bitstring to serialize
+     * @param bitstring bitstring to serialize
      */
     void SerializeBitstring(std::bitset<16> bitstring) const;
     /**
      * Serialize a bitstring
-     * \param bitstring bitstring to serialize
+     * @param bitstring bitstring to serialize
      */
     void SerializeBitstring(std::bitset<27> bitstring) const;
     /**
      * Serialize a bitstring
-     * \param bitstring bitstring to serialize
+     * @param bitstring bitstring to serialize
      */
     void SerializeBitstring(std::bitset<28> bitstring) const;
     /**
      * Serialize a bitstring
-     * \param bitstring bitstring to serialize
+     * @param bitstring bitstring to serialize
      */
     void SerializeBitstring(std::bitset<32> bitstring) const;
 
@@ -253,43 +253,43 @@
 
     /**
      * Deserialize a bitset
-     * \param data buffer to store the result
-     * \param bIterator buffer iterator
-     * \returns the modified buffer iterator
+     * @param data buffer to store the result
+     * @param bIterator buffer iterator
+     * @returns the modified buffer iterator
      */
     template <int N>
     Buffer::Iterator DeserializeBitset(std::bitset<N>* data, Buffer::Iterator bIterator);
     /**
      * Deserialize a bitset
-     * \param data buffer to store the result
-     * \param bIterator buffer iterator
-     * \returns the modified buffer iterator
+     * @param data buffer to store the result
+     * @param bIterator buffer iterator
+     * @returns the modified buffer iterator
      */
     Buffer::Iterator DeserializeBitset(std::bitset<8>* data, Buffer::Iterator bIterator);
 
     /**
      * Deserialize a boolean
-     * \param value buffer to store the result
-     * \param bIterator buffer iterator
-     * \returns the modified buffer iterator
+     * @param value buffer to store the result
+     * @param bIterator buffer iterator
+     * @returns the modified buffer iterator
      */
     Buffer::Iterator DeserializeBoolean(bool* value, Buffer::Iterator bIterator);
     /**
      * Deserialize an integer
-     * \param n buffer to store the result
-     * \param nmin min value to serialize
-     * \param nmax max value to serialize
-     * \param bIterator buffer iterator
-     * \returns the modified buffer iterator
+     * @param n buffer to store the result
+     * @param nmin min value to serialize
+     * @param nmax max value to serialize
+     * @param bIterator buffer iterator
+     * @returns the modified buffer iterator
      */
     Buffer::Iterator DeserializeInteger(int* n, int nmin, int nmax, Buffer::Iterator bIterator);
     /**
      * Deserialize a Choice (set of options)
-     * \param numOptions number of options
-     * \param isExtensionMarkerPresent true if extension mark is present
-     * \param selectedOption buffer to store the result
-     * \param bIterator buffer iterator
-     * \returns the modified buffer iterator
+     * @param numOptions number of options
+     * @param isExtensionMarkerPresent true if extension mark is present
+     * @param selectedOption buffer to store the result
+     * @param bIterator buffer iterator
+     * @returns the modified buffer iterator
      */
     Buffer::Iterator DeserializeChoice(int numOptions,
                                        bool isExtensionMarkerPresent,
@@ -297,19 +297,19 @@
                                        Buffer::Iterator bIterator);
     /**
      * Deserialize an Enum
-     * \param numElems number of elements in the enum
-     * \param selectedElem buffer to store the result
-     * \param bIterator buffer iterator
-     * \returns the modified buffer iterator
+     * @param numElems number of elements in the enum
+     * @param selectedElem buffer to store the result
+     * @param bIterator buffer iterator
+     * @returns the modified buffer iterator
      */
     Buffer::Iterator DeserializeEnum(int numElems, int* selectedElem, Buffer::Iterator bIterator);
 
     /**
      * Deserialize a sequence
-     * \param optionalOrDefaultMask buffer to store the result
-     * \param isExtensionMarkerPresent true if Extension Marker is present
-     * \param bIterator buffer iterator
-     * \returns the modified buffer iterator
+     * @param optionalOrDefaultMask buffer to store the result
+     * @param isExtensionMarkerPresent true if Extension Marker is present
+     * @param bIterator buffer iterator
+     * @returns the modified buffer iterator
      */
     template <int N>
     Buffer::Iterator DeserializeSequence(std::bitset<N>* optionalOrDefaultMask,
@@ -317,70 +317,70 @@
                                          Buffer::Iterator bIterator);
     /**
      * Deserialize a sequence
-     * \param optionalOrDefaultMask buffer to store the result
-     * \param isExtensionMarkerPresent true if Extension Marker is present
-     * \param bIterator buffer iterator
-     * \returns the modified buffer iterator
+     * @param optionalOrDefaultMask buffer to store the result
+     * @param isExtensionMarkerPresent true if Extension Marker is present
+     * @param bIterator buffer iterator
+     * @returns the modified buffer iterator
      */
     Buffer::Iterator DeserializeSequence(std::bitset<0>* optionalOrDefaultMask,
                                          bool isExtensionMarkerPresent,
                                          Buffer::Iterator bIterator);
     /**
      * Deserialize a sequence
-     * \param optionalOrDefaultMask buffer to store the result
-     * \param isExtensionMarkerPresent true if Extension Marker is present
-     * \param bIterator buffer iterator
-     * \returns the modified buffer iterator
+     * @param optionalOrDefaultMask buffer to store the result
+     * @param isExtensionMarkerPresent true if Extension Marker is present
+     * @param bIterator buffer iterator
+     * @returns the modified buffer iterator
      */
     Buffer::Iterator DeserializeSequence(std::bitset<1>* optionalOrDefaultMask,
                                          bool isExtensionMarkerPresent,
                                          Buffer::Iterator bIterator);
     /**
      * Deserialize a sequence
-     * \param optionalOrDefaultMask buffer to store the result
-     * \param isExtensionMarkerPresent true if Extension Marker is present
-     * \param bIterator buffer iterator
-     * \returns the modified buffer iterator
+     * @param optionalOrDefaultMask buffer to store the result
+     * @param isExtensionMarkerPresent true if Extension Marker is present
+     * @param bIterator buffer iterator
+     * @returns the modified buffer iterator
      */
     Buffer::Iterator DeserializeSequence(std::bitset<2>* optionalOrDefaultMask,
                                          bool isExtensionMarkerPresent,
                                          Buffer::Iterator bIterator);
     /**
      * Deserialize a sequence
-     * \param optionalOrDefaultMask buffer to store the result
-     * \param isExtensionMarkerPresent true if Extension Marker is present
-     * \param bIterator buffer iterator
-     * \returns the modified buffer iterator
+     * @param optionalOrDefaultMask buffer to store the result
+     * @param isExtensionMarkerPresent true if Extension Marker is present
+     * @param bIterator buffer iterator
+     * @returns the modified buffer iterator
      */
     Buffer::Iterator DeserializeSequence(std::bitset<3>* optionalOrDefaultMask,
                                          bool isExtensionMarkerPresent,
                                          Buffer::Iterator bIterator);
     /**
      * Deserialize a sequence
-     * \param optionalOrDefaultMask buffer to store the result
-     * \param isExtensionMarkerPresent true if Extension Marker is present
-     * \param bIterator buffer iterator
-     * \returns the modified buffer iterator
+     * @param optionalOrDefaultMask buffer to store the result
+     * @param isExtensionMarkerPresent true if Extension Marker is present
+     * @param bIterator buffer iterator
+     * @returns the modified buffer iterator
      */
     Buffer::Iterator DeserializeSequence(std::bitset<4>* optionalOrDefaultMask,
                                          bool isExtensionMarkerPresent,
                                          Buffer::Iterator bIterator);
     /**
      * Deserialize a sequence
-     * \param optionalOrDefaultMask buffer to store the result
-     * \param isExtensionMarkerPresent true if Extension Marker is present
-     * \param bIterator buffer iterator
-     * \returns the modified buffer iterator
+     * @param optionalOrDefaultMask buffer to store the result
+     * @param isExtensionMarkerPresent true if Extension Marker is present
+     * @param bIterator buffer iterator
+     * @returns the modified buffer iterator
      */
     Buffer::Iterator DeserializeSequence(std::bitset<5>* optionalOrDefaultMask,
                                          bool isExtensionMarkerPresent,
                                          Buffer::Iterator bIterator);
     /**
      * Deserialize a sequence
-     * \param optionalOrDefaultMask buffer to store the result
-     * \param isExtensionMarkerPresent true if Extension Marker is present
-     * \param bIterator buffer iterator
-     * \returns the modified buffer iterator
+     * @param optionalOrDefaultMask buffer to store the result
+     * @param isExtensionMarkerPresent true if Extension Marker is present
+     * @param bIterator buffer iterator
+     * @returns the modified buffer iterator
      */
     Buffer::Iterator DeserializeSequence(std::bitset<6>* optionalOrDefaultMask,
                                          bool isExtensionMarkerPresent,
@@ -388,40 +388,40 @@
 
     /**
      * Deserialize a sequence
-     * \param optionalOrDefaultMask buffer to store the result
-     * \param isExtensionMarkerPresent true if Extension Marker is present
-     * \param bIterator buffer iterator
-     * \returns the modified buffer iterator
+     * @param optionalOrDefaultMask buffer to store the result
+     * @param isExtensionMarkerPresent true if Extension Marker is present
+     * @param bIterator buffer iterator
+     * @returns the modified buffer iterator
      */
     Buffer::Iterator DeserializeSequence(std::bitset<7>* optionalOrDefaultMask,
                                          bool isExtensionMarkerPresent,
                                          Buffer::Iterator bIterator);
     /**
      * Deserialize a sequence
-     * \param optionalOrDefaultMask buffer to store the result
-     * \param isExtensionMarkerPresent true if Extension Marker is present
-     * \param bIterator buffer iterator
-     * \returns the modified buffer iterator
+     * @param optionalOrDefaultMask buffer to store the result
+     * @param isExtensionMarkerPresent true if Extension Marker is present
+     * @param bIterator buffer iterator
+     * @returns the modified buffer iterator
      */
     Buffer::Iterator DeserializeSequence(std::bitset<9>* optionalOrDefaultMask,
                                          bool isExtensionMarkerPresent,
                                          Buffer::Iterator bIterator);
     /**
      * Deserialize a sequence
-     * \param optionalOrDefaultMask buffer to store the result
-     * \param isExtensionMarkerPresent true if Extension Marker is present
-     * \param bIterator buffer iterator
-     * \returns the modified buffer iterator
+     * @param optionalOrDefaultMask buffer to store the result
+     * @param isExtensionMarkerPresent true if Extension Marker is present
+     * @param bIterator buffer iterator
+     * @returns the modified buffer iterator
      */
     Buffer::Iterator DeserializeSequence(std::bitset<10>* optionalOrDefaultMask,
                                          bool isExtensionMarkerPresent,
                                          Buffer::Iterator bIterator);
     /**
      * Deserialize a sequence
-     * \param optionalOrDefaultMask buffer to store the result
-     * \param isExtensionMarkerPresent true if Extension Marker is present
-     * \param bIterator buffer iterator
-     * \returns the modified buffer iterator
+     * @param optionalOrDefaultMask buffer to store the result
+     * @param isExtensionMarkerPresent true if Extension Marker is present
+     * @param bIterator buffer iterator
+     * @returns the modified buffer iterator
      */
     Buffer::Iterator DeserializeSequence(std::bitset<11>* optionalOrDefaultMask,
                                          bool isExtensionMarkerPresent,
@@ -429,82 +429,82 @@
 
     /**
      * Deserialize a bitstring
-     * \param bitstring buffer to store the result
-     * \param bIterator buffer iterator
-     * \returns the modified buffer iterator
+     * @param bitstring buffer to store the result
+     * @param bIterator buffer iterator
+     * @returns the modified buffer iterator
      */
     template <int N>
     Buffer::Iterator DeserializeBitstring(std::bitset<N>* bitstring, Buffer::Iterator bIterator);
     /**
      * Deserialize a bitstring
-     * \param bitstring buffer to store the result
-     * \param bIterator buffer iterator
-     * \returns the modified buffer iterator
+     * @param bitstring buffer to store the result
+     * @param bIterator buffer iterator
+     * @returns the modified buffer iterator
      */
     Buffer::Iterator DeserializeBitstring(std::bitset<1>* bitstring, Buffer::Iterator bIterator);
     /**
      * Deserialize a bitstring
-     * \param bitstring buffer to store the result
-     * \param bIterator buffer iterator
-     * \returns the modified buffer iterator
+     * @param bitstring buffer to store the result
+     * @param bIterator buffer iterator
+     * @returns the modified buffer iterator
      */
     Buffer::Iterator DeserializeBitstring(std::bitset<2>* bitstring, Buffer::Iterator bIterator);
     /**
      * Deserialize a bitstring
-     * \param bitstring buffer to store the result
-     * \param bIterator buffer iterator
-     * \returns the modified buffer iterator
+     * @param bitstring buffer to store the result
+     * @param bIterator buffer iterator
+     * @returns the modified buffer iterator
      */
     Buffer::Iterator DeserializeBitstring(std::bitset<8>* bitstring, Buffer::Iterator bIterator);
     /**
      * Deserialize a bitstring
-     * \param bitstring buffer to store the result
-     * \param bIterator buffer iterator
-     * \returns the modified buffer iterator
+     * @param bitstring buffer to store the result
+     * @param bIterator buffer iterator
+     * @returns the modified buffer iterator
      */
     Buffer::Iterator DeserializeBitstring(std::bitset<10>* bitstring, Buffer::Iterator bIterator);
     /**
      * Deserialize a bitstring
-     * \param bitstring buffer to store the result
-     * \param bIterator buffer iterator
-     * \returns the modified buffer iterator
+     * @param bitstring buffer to store the result
+     * @param bIterator buffer iterator
+     * @returns the modified buffer iterator
      */
     Buffer::Iterator DeserializeBitstring(std::bitset<16>* bitstring, Buffer::Iterator bIterator);
     /**
      * Deserialize a bitstring
-     * \param bitstring buffer to store the result
-     * \param bIterator buffer iterator
-     * \returns the modified buffer iterator
+     * @param bitstring buffer to store the result
+     * @param bIterator buffer iterator
+     * @returns the modified buffer iterator
      */
     Buffer::Iterator DeserializeBitstring(std::bitset<27>* bitstring, Buffer::Iterator bIterator);
     /**
      * Deserialize a bitstring
-     * \param bitstring buffer to store the result
-     * \param bIterator buffer iterator
-     * \returns the modified buffer iterator
+     * @param bitstring buffer to store the result
+     * @param bIterator buffer iterator
+     * @returns the modified buffer iterator
      */
     Buffer::Iterator DeserializeBitstring(std::bitset<28>* bitstring, Buffer::Iterator bIterator);
     /**
      * Deserialize a bitstring
-     * \param bitstring buffer to store the result
-     * \param bIterator buffer iterator
-     * \returns the modified buffer iterator
+     * @param bitstring buffer to store the result
+     * @param bIterator buffer iterator
+     * @returns the modified buffer iterator
      */
     Buffer::Iterator DeserializeBitstring(std::bitset<32>* bitstring, Buffer::Iterator bIterator);
 
     /**
      * Deserialize nothing (null op)
-     * \param bIterator buffer iterator
-     * \returns the modified buffer iterator
+     * @param bIterator buffer iterator
+     * @returns the modified buffer iterator
      */
     Buffer::Iterator DeserializeNull(Buffer::Iterator bIterator);
     /**
      * Deserialize a Sequence
-     * \param numElems buffer to store the result
-     * \param nMax max value to serialize
-     * \param nMin min value to serialize
-     * \param bIterator buffer iterator
-     * \returns the modified buffer iterator
+     * @param numElems buffer to store the result
+     * @param nMax max value to serialize
+     * @param nMin min value to serialize
+     * @param bIterator buffer iterator
+     * @returns the modified buffer iterator
      */
     Buffer::Iterator DeserializeSequenceOf(int* numElems,
                                            int nMax,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-as-sap.h ns-3.44/src/lte/model/lte-as-sap.h
--- ns-3.43/src/lte/model/lte-as-sap.h	2024-10-09 16:41:10.036656400 -0700
+++ ns-3.44/src/lte/model/lte-as-sap.h	2025-03-09 16:55:49.599372000 -0700
@@ -9,8 +9,8 @@
 #ifndef LTE_AS_SAP_H
 #define LTE_AS_SAP_H
 
-#include <ns3/packet.h>
-#include <ns3/ptr.h>
+#include "ns3/packet.h"
+#include "ns3/ptr.h"
 
 #include <stdint.h>
 
@@ -30,30 +30,30 @@
     virtual ~LteAsSapProvider();
 
     /**
-     * \brief Set the selected Closed Subscriber Group subscription list to be
+     * @brief Set the selected Closed Subscriber Group subscription list to be
      *        used for cell selection.
      *
-     * \param csgId identity of the subscribed CSG
+     * @param csgId identity of the subscribed CSG
      */
     virtual void SetCsgWhiteList(uint32_t csgId) = 0;
 
     /**
-     * \brief Initiate Idle mode cell selection procedure.
+     * @brief Initiate Idle mode cell selection procedure.
      *
-     * \param dlEarfcn the downlink carrier frequency (EARFCN)
+     * @param dlEarfcn the downlink carrier frequency (EARFCN)
      */
     virtual void StartCellSelection(uint32_t dlEarfcn) = 0;
 
     /**
-     * \brief Force the RRC entity to stay camped on a certain eNodeB.
+     * @brief Force the RRC entity to stay camped on a certain eNodeB.
      *
-     * \param cellId the cell ID identifying the eNodeB
-     * \param dlEarfcn the downlink carrier frequency (EARFCN)
+     * @param cellId the cell ID identifying the eNodeB
+     * @param dlEarfcn the downlink carrier frequency (EARFCN)
      */
     virtual void ForceCampedOnEnb(uint16_t cellId, uint32_t dlEarfcn) = 0;
 
     /**
-     * \brief Tell the RRC entity to enter Connected mode.
+     * @brief Tell the RRC entity to enter Connected mode.
      *
      * If this function is called when the UE is in a situation where connecting
      * is not possible (e.g. before the simulation begin), then the UE will
@@ -63,15 +63,15 @@
     virtual void Connect() = 0;
 
     /**
-     * \brief Send a data packet.
+     * @brief Send a data packet.
      *
-     * \param packet the packet
-     * \param bid the EPS bearer ID
+     * @param packet the packet
+     * @param bid the EPS bearer ID
      */
     virtual void SendData(Ptr<Packet> packet, uint8_t bid) = 0;
 
     /**
-     * \brief Tell the RRC entity to release the connection.
+     * @brief Tell the RRC entity to release the connection.
      */
     virtual void Disconnect() = 0;
 };
@@ -89,12 +89,12 @@
     virtual ~LteAsSapUser();
 
     /**
-     * \brief Notify the NAS that RRC Connection Establishment was successful.
+     * @brief Notify the NAS that RRC Connection Establishment was successful.
      */
     virtual void NotifyConnectionSuccessful() = 0;
 
     /**
-     * \brief Notify the NAS that RRC Connection Establishment failed.
+     * @brief Notify the NAS that RRC Connection Establishment failed.
      */
     virtual void NotifyConnectionFailed() = 0;
 
@@ -106,7 +106,7 @@
     /**
      * receive a data packet
      *
-     * \param packet the packet
+     * @param packet the packet
      */
     virtual void RecvData(Ptr<Packet> packet) = 0;
 };
@@ -122,7 +122,7 @@
     /**
      * Constructor
      *
-     * \param owner the owner class
+     * @param owner the owner class
      */
     MemberLteAsSapProvider(C* owner);
 
@@ -200,7 +200,7 @@
     /**
      * Constructor
      *
-     * \param owner the owner class
+     * @param owner the owner class
      */
     MemberLteAsSapUser(C* owner);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-ccm-mac-sap.h ns-3.44/src/lte/model/lte-ccm-mac-sap.h
--- ns-3.43/src/lte/model/lte-ccm-mac-sap.h	2024-10-09 16:41:10.036656400 -0700
+++ ns-3.44/src/lte/model/lte-ccm-mac-sap.h	2025-03-09 16:55:49.599372000 -0700
@@ -16,9 +16,9 @@
 namespace ns3
 {
 /**
- * \ingroup lte
+ * @ingroup lte
  *
- * \brief Service Access Point (SAP) offered by the component carrier manager (CCM)
+ * @brief Service Access Point (SAP) offered by the component carrier manager (CCM)
  *  by MAC to CCM.
  *
  * This is the *Component Carrier Manager SAP Provider*, i.e., the part of the SAP
@@ -31,26 +31,26 @@
     virtual ~LteCcmMacSapProvider();
 
     /**
-     * \brief Add the Buffer Status Report to the list.
-     * \param bsr LteEnbComponentCarrierManager used this function to
+     * @brief Add the Buffer Status Report to the list.
+     * @param bsr LteEnbComponentCarrierManager used this function to
      *  send back an uplink BSR to some of the MAC instances
      */
     virtual void ReportMacCeToScheduler(MacCeListElement_s bsr) = 0;
 
     /**
-     * \brief Report SR to the right scheduler
-     * \param rnti RNTI of the user that requested the SR
+     * @brief Report SR to the right scheduler
+     * @param rnti RNTI of the user that requested the SR
      *
-     * \see LteCcmMacSapUser::UlReceiveSr
+     * @see LteCcmMacSapUser::UlReceiveSr
      */
     virtual void ReportSrToScheduler(uint16_t rnti) = 0;
 
 }; // end of class LteCcmMacSapProvider
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
- * \brief Service Access Point (SAP) offered by MAC to the
+ * @brief Service Access Point (SAP) offered by MAC to the
  *        component carrier manager (CCM).
  *
  *
@@ -63,17 +63,17 @@
   public:
     ~LteCcmMacSapUser() override;
     /**
-     * \brief When the Primary Component carrier receive a buffer status report
+     * @brief When the Primary Component carrier receive a buffer status report
      *  it is sent to the CCM.
-     * \param bsr Buffer Status Report received from a Ue
-     * \param componentCarrierId
+     * @param bsr Buffer Status Report received from a Ue
+     * @param componentCarrierId
      */
     virtual void UlReceiveMacCe(MacCeListElement_s bsr, uint8_t componentCarrierId) = 0;
 
     /**
-     * \brief The MAC received a SR
-     * \param rnti RNTI of the UE that requested a SR
-     * \param componentCarrierId CC that received the SR
+     * @brief The MAC received a SR
+     * @param rnti RNTI of the UE that requested a SR
+     * @param componentCarrierId CC that received the SR
      *
      * NOTE: Not implemented in the LTE module. The FemtoForum API requires
      * that this function gets as parameter a struct  SchedUlSrInfoReqParameters.
@@ -85,9 +85,9 @@
     virtual void UlReceiveSr(uint16_t rnti, uint8_t componentCarrierId) = 0;
 
     /**
-     * \brief Notifies component carrier manager about physical resource block occupancy
-     * \param prbOccupancy The physical resource block occupancy
-     * \param componentCarrierId The component carrier id
+     * @brief Notifies component carrier manager about physical resource block occupancy
+     * @param prbOccupancy The physical resource block occupancy
+     * @param componentCarrierId The component carrier id
      */
     virtual void NotifyPrbOccupancy(double prbOccupancy, uint8_t componentCarrierId) = 0;
 
@@ -101,7 +101,7 @@
     /**
      * Constructor
      *
-     * \param owner the owner class
+     * @param owner the owner class
      */
     MemberLteCcmMacSapProvider(C* owner);
     // inherited from LteCcmRrcSapProvider
@@ -140,7 +140,7 @@
     /**
      * Constructor
      *
-     * \param owner the owner class
+     * @param owner the owner class
      */
     MemberLteCcmMacSapUser(C* owner);
     // inherited from LteCcmRrcSapUser
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-ccm-rrc-sap.h ns-3.44/src/lte/model/lte-ccm-rrc-sap.h
--- ns-3.43/src/lte/model/lte-ccm-rrc-sap.h	2024-10-09 16:41:10.036656400 -0700
+++ ns-3.44/src/lte/model/lte-ccm-rrc-sap.h	2025-03-09 16:55:49.599372000 -0700
@@ -26,7 +26,7 @@
 class LteRrcSap;
 
 /**
- * \brief Service Access Point (SAP) offered by the Component Carrier Manager (CCM)
+ * @brief Service Access Point (SAP) offered by the Component Carrier Manager (CCM)
  * instance to the eNodeB RRC instance.
  *
  * This is the *Component Carrier Manager SAP Provider*, i.e., the part of the SAP
@@ -51,10 +51,10 @@
     };
 
     /**
-     * \brief Reports UE measurements to the component carrier manager.
-     * \param rnti Radio Network Temporary Identity, an integer identifying
+     * @brief Reports UE measurements to the component carrier manager.
+     * @param rnti Radio Network Temporary Identity, an integer identifying
      * the UE where the measurement report originates from.
-     * \param measResults a single report of one measurement identity
+     * @param measResults a single report of one measurement identity
      *
      * The received measurement report is a result of the UE measurements configuration
      * previously configured by calling
@@ -64,39 +64,39 @@
     virtual void ReportUeMeas(uint16_t rnti, LteRrcSap::MeasResults measResults) = 0;
 
     /**
-     * \brief Add a new UE in the LteEnbComponentCarrierManager.
-     * \param rnti Radio Network Temporary Identity, an integer identifying the UE.
-     * \param state The current rrc state of the UE.
+     * @brief Add a new UE in the LteEnbComponentCarrierManager.
+     * @param rnti Radio Network Temporary Identity, an integer identifying the UE.
+     * @param state The current rrc state of the UE.
      */
     virtual void AddUe(uint16_t rnti, uint8_t state) = 0;
 
     /**
-     * \brief Add a new logical channel.
-     * \param lcInfo - information about newly created logical channel
-     * \param msu - pointer to corresponding rlc interface
+     * @brief Add a new logical channel.
+     * @param lcInfo - information about newly created logical channel
+     * @param msu - pointer to corresponding rlc interface
      *
      */
     virtual void AddLc(LteEnbCmacSapProvider::LcInfo lcInfo, LteMacSapUser* msu) = 0;
 
     /**
-     * \brief Remove an existing UE.
-     * \param rnti Radio Network Temporary Identity, an integer identifying the UE
+     * @brief Remove an existing UE.
+     * @param rnti Radio Network Temporary Identity, an integer identifying the UE
      *             where the report originates from
      */
     virtual void RemoveUe(uint16_t rnti) = 0;
 
     /**
-     * \brief Add a new Bearer for the Ue in the LteEnbComponentCarrierManager.
-     * \param bearer a pointer to the EpsBearer object
-     * \param bearerId a unique identifier for the bearer
-     * \param rnti Radio Network Temporary Identity, an integer identifying the UE
+     * @brief Add a new Bearer for the Ue in the LteEnbComponentCarrierManager.
+     * @param bearer a pointer to the EpsBearer object
+     * @param bearerId a unique identifier for the bearer
+     * @param rnti Radio Network Temporary Identity, an integer identifying the UE
      *             where the report originates from
-     * \param lcid the Logical Channel id
-     * \param lcGroup the Logical Channel group
-     * \param msu a pointer to the LteMacSapUser, the LteEnbComponentCarrierManager
+     * @param lcid the Logical Channel id
+     * @param lcGroup the Logical Channel group
+     * @param msu a pointer to the LteMacSapUser, the LteEnbComponentCarrierManager
      *             has to store a LteMacSapUser for each Rlc instance, in order to
      *             properly redirect the packet
-     * \return vector of LcsConfig contains the lc configuration for each Mac
+     * @return vector of LcsConfig contains the lc configuration for each Mac
      *                the size of the vector is equal to the number of component
      *                carrier enabled.
      *
@@ -112,21 +112,21 @@
         LteMacSapUser* msu) = 0;
 
     /**
-     * \brief Release an existing Data Radio Bearer for a Ue in the LteEnbComponentCarrierManager
-     * \param rnti Radio Network Temporary Identity, an integer identifying the UE
+     * @brief Release an existing Data Radio Bearer for a Ue in the LteEnbComponentCarrierManager
+     * @param rnti Radio Network Temporary Identity, an integer identifying the UE
      *             where the report originates from
-     * \param lcid the Logical Channel Id
-     * \return vector of integer the componentCarrierId of the componentCarrier
+     * @param lcid the Logical Channel Id
+     * @return vector of integer the componentCarrierId of the componentCarrier
      *                where the bearer is enabled
      */
 
     virtual std::vector<uint8_t> ReleaseDataRadioBearer(uint16_t rnti, uint8_t lcid) = 0;
 
     /**
-     * \brief Add the Signal Bearer for a specific Ue in LteEnbComponenCarrierManager
-     * \param lcInfo this structure it is hard-coded in the LteEnbRrc
-     * \param rlcMacSapUser it is the MacSapUser of the Rlc instance
-     * \return the LteMacSapUser of the ComponentCarrierManager
+     * @brief Add the Signal Bearer for a specific Ue in LteEnbComponenCarrierManager
+     * @param lcInfo this structure it is hard-coded in the LteEnbRrc
+     * @param rlcMacSapUser it is the MacSapUser of the Rlc instance
+     * @return the LteMacSapUser of the ComponentCarrierManager
      *
      */
     virtual LteMacSapUser* ConfigureSignalBearer(LteEnbCmacSapProvider::LcInfo lcInfo,
@@ -135,7 +135,7 @@
 }; // end of class LteCcmRrcSapProvider
 
 /**
- * \brief Service Access Point (SAP) offered by the eNodeB RRC instance to the
+ * @brief Service Access Point (SAP) offered by the eNodeB RRC instance to the
  *        component carrier manager (CCM) instance.
  *
  * This is the *Component Carrier Management SAP User*, i.e., the part of the SAP that
@@ -150,10 +150,10 @@
     virtual ~LteCcmRrcSapUser();
 
     /**
-     * \brief Request a certain reporting configuration to be fulfilled by the UEs
+     * @brief Request a certain reporting configuration to be fulfilled by the UEs
      *        attached to the eNodeB entity.
-     * \param reportConfig the UE measurement reporting configuration
-     * \return the measurement identity associated with this newly added
+     * @param reportConfig the UE measurement reporting configuration
+     * @return the measurement identity associated with this newly added
      *         reporting configuration
      *
      * The eNodeB RRC entity is expected to configure the same reporting
@@ -163,16 +163,16 @@
      * ComponentCarrier algorithm through the LteCcmRrcSapProvider::ReportUeMeas
      * SAP function.
      *
-     * \note This function is only valid before the simulation begins.
+     * @note This function is only valid before the simulation begins.
      */
     virtual uint8_t AddUeMeasReportConfigForComponentCarrier(
         LteRrcSap::ReportConfigEutra reportConfig) = 0;
 
     /**
-     * \brief Instruct the eNodeB RRC entity to prepare a component carrier.
-     * \param rnti Radio Network Temporary Identity, an integer identifying the
+     * @brief Instruct the eNodeB RRC entity to prepare a component carrier.
+     * @param rnti Radio Network Temporary Identity, an integer identifying the
      *             UE which shall perform the ComponentCarrier
-     * \param targetCellId the cell ID of the target eNodeB
+     * @param targetCellId the cell ID of the target eNodeB
      *
      * This function is used by the ComponentCarrier manager when a decision on
      * component carriers configurations.
@@ -186,7 +186,7 @@
     /**
      * add a new Logical Channel (LC)
      *
-     * \param lcConfig is a single structure contains logical Channel Id, Logical Channel config and
+     * @param lcConfig is a single structure contains logical Channel Id, Logical Channel config and
      * Component Carrier Id
      */
     virtual void AddLcs(std::vector<LteEnbRrcSapProvider::LogicalChannelConfig> lcConfig) = 0;
@@ -194,23 +194,23 @@
     /**
      * remove an existing LC
      *
-     * \param rnti
-     * \param lcid
+     * @param rnti
+     * @param lcid
      */
     virtual void ReleaseLcs(uint16_t rnti, uint8_t lcid) = 0;
 
     /**
      * Get UE manager by RNTI
      *
-     * \param rnti RNTI
-     * \return UE manager
+     * @param rnti RNTI
+     * @return UE manager
      */
     virtual Ptr<UeManager> GetUeManager(uint16_t rnti) = 0;
 
     /**
-     * \brief Set the number of component carriers
+     * @brief Set the number of component carriers
      *
-     * \param noOfComponentCarriers The number of component carriers
+     * @param noOfComponentCarriers The number of component carriers
      */
     virtual void SetNumberOfComponentCarriers(uint16_t noOfComponentCarriers) = 0;
 
@@ -224,7 +224,7 @@
     /**
      * Constructor
      *
-     * \param owner the owner class
+     * @param owner the owner class
      */
     MemberLteCcmRrcSapProvider(C* owner);
 
@@ -316,7 +316,7 @@
     /**
      * Constructor
      *
-     * \param owner the owner class
+     * @param owner the owner class
      */
     MemberLteCcmRrcSapUser(C* owner);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-chunk-processor.cc ns-3.44/src/lte/model/lte-chunk-processor.cc
--- ns-3.43/src/lte/model/lte-chunk-processor.cc	2024-10-09 16:41:10.036656400 -0700
+++ ns-3.44/src/lte/model/lte-chunk-processor.cc	2025-03-09 16:55:49.599372000 -0700
@@ -10,8 +10,8 @@
 
 #include "lte-chunk-processor.h"
 
-#include <ns3/log.h>
-#include <ns3/spectrum-value.h>
+#include "ns3/log.h"
+#include "ns3/spectrum-value.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-chunk-processor.h ns-3.44/src/lte/model/lte-chunk-processor.h
--- ns-3.43/src/lte/model/lte-chunk-processor.h	2024-10-09 16:41:10.036656400 -0700
+++ ns-3.44/src/lte/model/lte-chunk-processor.h	2025-03-09 16:55:49.599372000 -0700
@@ -14,9 +14,9 @@
 #ifndef LTE_CHUNK_PROCESSOR_H
 #define LTE_CHUNK_PROCESSOR_H
 
-#include <ns3/nstime.h>
-#include <ns3/object.h>
-#include <ns3/ptr.h>
+#include "ns3/nstime.h"
+#include "ns3/object.h"
+#include "ns3/ptr.h"
 
 namespace ns3
 {
@@ -38,18 +38,18 @@
     virtual ~LteChunkProcessor();
 
     /**
-     * \brief Add callback to list
+     * @brief Add callback to list
      *
      * This function adds callback c to list. Each callback pass
      * calculated value to its object and is called in
      * LteChunkProcessor::End().
      *
-     * \param c callback function
+     * @param c callback function
      */
     virtual void AddCallback(LteChunkProcessorCallback c);
 
     /**
-     * \brief Clear internal variables
+     * @brief Clear internal variables
      *
      * This function clears internal variables in the beginning of
      * calculation
@@ -57,17 +57,17 @@
     virtual void Start();
 
     /**
-     * \brief Collect SpectrumValue and duration of signal
+     * @brief Collect SpectrumValue and duration of signal
      *
      * Passed values are collected in m_sumValues and m_totDuration variables.
      *
-     * \param sinr the SINR
-     * \param duration the duration
+     * @param sinr the SINR
+     * @param duration the duration
      */
     virtual void EvaluateChunk(const SpectrumValue& sinr, Time duration);
 
     /**
-     * \brief Finish calculation and inform interested objects about calculated value
+     * @brief Finish calculation and inform interested objects about calculated value
      *
      * During this function all callbacks from list are executed
      * to inform interested object about calculated value. This
@@ -94,14 +94,14 @@
     /**
      * function to be plugged to LteChunkProcessor::AddCallback ()
      *
-     * \param value
+     * @param value
      */
     void ReportValue(const SpectrumValue& value);
 
     /**
      *
      *
-     * \return the latest value reported by the LteChunkProcessor
+     * @return the latest value reported by the LteChunkProcessor
      */
     Ptr<SpectrumValue> GetValue();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-common.cc ns-3.44/src/lte/model/lte-common.cc
--- ns-3.43/src/lte/model/lte-common.cc	2024-10-09 16:41:10.036656400 -0700
+++ ns-3.44/src/lte/model/lte-common.cc	2025-03-09 16:55:49.599372000 -0700
@@ -9,8 +9,8 @@
 
 #include "lte-common.h"
 
-#include <ns3/abort.h>
-#include <ns3/log.h>
+#include "ns3/abort.h"
+#include "ns3/log.h"
 
 namespace ns3
 {
@@ -30,9 +30,9 @@
 /**
  * Equality operator
  *
- * \param a lhs
- * \param b rhs
- * \returns true if "equal"
+ * @param a lhs
+ * @param b rhs
+ * @returns true if "equal"
  */
 bool
 operator==(const LteFlowId_t& a, const LteFlowId_t& b)
@@ -43,9 +43,9 @@
 /**
  * Less than operator
  *
- * \param a lhs
- * \param b rhs
- * \returns true if "less than"
+ * @param a lhs
+ * @param b rhs
+ * @returns true if "less than"
  */
 bool
 operator<(const LteFlowId_t& a, const LteFlowId_t& b)
@@ -66,9 +66,9 @@
 /**
  * Equality operator
  *
- * \param a lhs
- * \param b rhs
- * \returns true if "equal"
+ * @param a lhs
+ * @param b rhs
+ * @returns true if "equal"
  */
 bool
 operator==(const ImsiLcidPair_t& a, const ImsiLcidPair_t& b)
@@ -79,9 +79,9 @@
 /**
  * Less than operator
  *
- * \param a lhs
- * \param b rhs
- * \returns true if "less than"
+ * @param a lhs
+ * @param b rhs
+ * @returns true if "less than"
  */
 bool
 operator<(const ImsiLcidPair_t& a, const ImsiLcidPair_t& b)
@@ -96,9 +96,9 @@
 /**
  * Equality operator
  *
- * \param a lhs
- * \param b rhs
- * \returns true if "equal"
+ * @param a lhs
+ * @param b rhs
+ * @returns true if "equal"
  */
 bool
 operator==(const LteUeConfig_t& a, const LteUeConfig_t& b)
@@ -109,9 +109,9 @@
 /**
  * Less than operator
  *
- * \param a lhs
- * \param b rhs
- * \returns true if "less than"
+ * @param a lhs
+ * @param b rhs
+ * @returns true if "less than"
  */
 bool
 operator<(const LteUeConfig_t& a, const LteUeConfig_t& b)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-common.h ns-3.44/src/lte/model/lte-common.h
--- ns-3.43/src/lte/model/lte-common.h	2024-10-09 16:41:10.036656400 -0700
+++ ns-3.44/src/lte/model/lte-common.h	2025-03-09 16:55:49.599372000 -0700
@@ -38,8 +38,8 @@
     /**
      * Constructor
      *
-     * \param a RNTI
-     * \param b LCID
+     * @param a RNTI
+     * @param b LCID
      */
     LteFlowId_t(const uint16_t a, const uint8_t b);
 
@@ -58,8 +58,8 @@
     /**
      * Constructor
      *
-     * \param a first pair
-     * \param b second pair
+     * @param a first pair
+     * @param b second pair
      */
     ImsiLcidPair_t(const uint64_t a, const uint8_t b);
 
@@ -68,7 +68,7 @@
 };
 
 /**
- * \brief Parameters for configuring the UE
+ * @brief Parameters for configuring the UE
  */
 struct LteUeConfig_t
 {
@@ -95,17 +95,17 @@
     /**
      * Equality operator
      *
-     * \param a lhs
-     * \param b rhs
-     * \returns true if "equal"
+     * @param a lhs
+     * @param b rhs
+     * @returns true if "equal"
      */
     friend bool operator==(const LteUeConfig_t& a, const LteUeConfig_t& b);
     /**
      * Less than operator
      *
-     * \param a lhs
-     * \param b rhs
-     * \returns true if "less than"
+     * @param a lhs
+     * @param b rhs
+     * @returns true if "less than"
      */
     friend bool operator<(const LteUeConfig_t& a, const LteUeConfig_t& b);
 };
@@ -117,21 +117,21 @@
     /**
      * Convert from double to fixed point S11.3 notation
      *
-     * \param val double value
-     * \returns fixed point S11.3 value
+     * @param val double value
+     * @returns fixed point S11.3 value
      */
     static uint16_t double2fpS11dot3(double val);
     /**
      * Convert from fixed point S11.3 notation to double
      *
-     * \param val fixed point S11.3 value
-     * \returns double value
+     * @param val fixed point S11.3 value
+     * @returns double value
      */
     static double fpS11dot3toDouble(uint16_t val);
     /**
      * Get minimum fixed point S11.3 value
      *
-     * \returns double value for the minimum fixed point S11.3 value
+     * @returns double value for the minimum fixed point S11.3 value
      */
     static double getMinFpS11dot3Value();
 
@@ -145,15 +145,15 @@
     /**
      * Convert BSR ID to buffer size
      *
-     * \param val BSR ID
-     * \returns buffer size
+     * @param val BSR ID
+     * @returns buffer size
      */
     static uint32_t BsrId2BufferSize(uint8_t val);
     /**
      * Convert Buffer size to BSR ID
      *
-     * \param val buffer size
-     * \returns BSR ID
+     * @param val buffer size
+     * @returns BSR ID
      */
     static uint8_t BufferSize2BsrId(uint32_t val);
 
@@ -166,8 +166,8 @@
   public:
     /**
      * Transmit mode 2 layer number
-     * \param txMode the transmit mode
-     * \returns the layer 2 number
+     * @param txMode the transmit mode
+     * @returns the layer 2 number
      */
     static uint8_t TxMode2LayerNum(uint8_t txMode);
 };
@@ -190,8 +190,8 @@
     /**
      *  TracedCallback signature.
      *
-     * \param [in] params Value of the PhyTransmissionionStatParameters.
-     * \todo The argument should be passed by const reference, since it's large.
+     * @param [in] params Value of the PhyTransmissionionStatParameters.
+     * @todo The argument should be passed by const reference, since it's large.
      */
     typedef void (*TracedCallback)(const PhyTransmissionStatParameters params);
 };
@@ -215,8 +215,8 @@
     /**
      *  TracedCallback signature.
      *
-     * \param [in] params Value of the PhyReceptionStatParameters.
-     * \todo The argument should be passed by const reference, since it's large.
+     * @param [in] params Value of the PhyReceptionStatParameters.
+     * @todo The argument should be passed by const reference, since it's large.
      */
     typedef void (*TracedCallback)(const PhyReceptionStatParameters params);
 };
@@ -246,9 +246,9 @@
      * converts an RSRP range to dBm as per
      * 3GPP TS 36.133 section 9.1.4 RSRP Measurement Report Mapping
      *
-     * \param range the RSRP range value
+     * @param range the RSRP range value
      *
-     * \return the corresponding RSRP value in dBm
+     * @return the corresponding RSRP value in dBm
      */
     static double RsrpRange2Dbm(uint8_t range);
 
@@ -256,9 +256,9 @@
      * convert an RSRP value in dBm to the corresponding range as per
      * 3GPP TS 36.133 section 9.1.4 RSRP Measurement Report Mapping
      *
-     * \param dbm the RSRP value in dBm
+     * @param dbm the RSRP value in dBm
      *
-     * \return the corresponding range
+     * @return the corresponding range
      */
     static uint8_t Dbm2RsrpRange(double dbm);
 
@@ -266,9 +266,9 @@
      * converts an RSRQ range to dB as per
      * 3GPP TS 36.133 section 9.1.7 RSRQ Measurement Report Mapping
      *
-     * \param range the RSRQ range value
+     * @param range the RSRQ range value
      *
-     * \return the corresponding RSRQ value in dB
+     * @return the corresponding RSRQ value in dB
      */
     static double RsrqRange2Db(uint8_t range);
 
@@ -276,34 +276,34 @@
      * convert an RSRQ value in dB to the corresponding range as per
      * 3GPP TS 36.133 section 9.1.7 RSRQ Measurement Report Mapping
      *
-     * \param db the RSRQ value in dB
+     * @param db the RSRQ value in dB
      *
-     * \return the corresponding range
+     * @return the corresponding range
      */
     static uint8_t Db2RsrqRange(double db);
 
     /**
      * Quantize an RSRP value according to the measurement mapping of TS 36.133
      *
-     * \param v RSRP value in dBm
+     * @param v RSRP value in dBm
      *
-     * \return the quantized RSRP value in dBm
+     * @return the quantized RSRP value in dBm
      */
     static double QuantizeRsrp(double v);
 
     /**
      * Quantize an RSRQ value according to the measurement mapping of TS 36.133
      *
-     * \param v RSRQ value in dB
+     * @param v RSRQ value in dB
      *
-     * \return the quantized RSRQ value in dB
+     * @return the quantized RSRQ value in dB
      */
     static double QuantizeRsrq(double v);
 
     /**
-     * \brief Returns the actual value of a hysteresis parameter.
-     * \param hysteresisIeValue IE value of hysteresis
-     * \return actual value in dB, which is IE value * 0.5 dB
+     * @brief Returns the actual value of a hysteresis parameter.
+     * @param hysteresisIeValue IE value of hysteresis
+     * @return actual value in dB, which is IE value * 0.5 dB
      *
      * As per section 6.3.5 of 3GPP TS 36.331.
      *
@@ -314,9 +314,9 @@
     static double IeValue2ActualHysteresis(uint8_t hysteresisIeValue);
 
     /**
-     * \brief Returns the IE value of hysteresis.
-     * \param hysteresisDb actual hysteresis value in dB
-     * \return IE value of hysteresis in dB, which is actual value * 2, rounded
+     * @brief Returns the IE value of hysteresis.
+     * @param hysteresisDb actual hysteresis value in dB
+     * @return IE value of hysteresis in dB, which is actual value * 2, rounded
      *         to the nearest integer
      *
      * The allowed values for hysteresis are between 0 and 15 dB.
@@ -326,9 +326,9 @@
     static uint8_t ActualHysteresis2IeValue(double hysteresisDb);
 
     /**
-     * \brief Returns the actual value of an a3-Offset parameter.
-     * \param a3OffsetIeValue IE value of a3-Offset
-     * \return actual value in dB, which is IE value * 0.5 dB
+     * @brief Returns the actual value of an a3-Offset parameter.
+     * @param a3OffsetIeValue IE value of a3-Offset
+     * @return actual value in dB, which is IE value * 0.5 dB
      *
      * As per section 6.3.5 of 3GPP TS 36.331.
      *
@@ -339,9 +339,9 @@
     static double IeValue2ActualA3Offset(int8_t a3OffsetIeValue);
 
     /**
-     * \brief Returns the IE value of a3-Offset.
-     * \param a3OffsetDb actual A3 Offset value in dB
-     * \return IE value of a3-Offset in dB, which is actual value * 2, rounded
+     * @brief Returns the IE value of a3-Offset.
+     * @param a3OffsetDb actual A3 Offset value in dB
+     * @return IE value of a3-Offset in dB, which is actual value * 2, rounded
      *         to the nearest integer
      *
      * The allowed values for A3 Offset are between -15 and 15 dB.
@@ -351,9 +351,9 @@
     static int8_t ActualA3Offset2IeValue(double a3OffsetDb);
 
     /**
-     * \brief Returns the actual value of an Q-RxLevMin parameter.
-     * \param qRxLevMinIeValue IE value of Q-RxLevMin
-     * \return Q-RxLevMin actual value in dBm, which is IE value * 2 dBm
+     * @brief Returns the actual value of an Q-RxLevMin parameter.
+     * @param qRxLevMinIeValue IE value of Q-RxLevMin
+     * @return Q-RxLevMin actual value in dBm, which is IE value * 2 dBm
      *
      * As per section 6.3.4 of 3GPP TS 36.331.
      *
@@ -362,9 +362,9 @@
     static double IeValue2ActualQRxLevMin(int8_t qRxLevMinIeValue);
 
     /**
-     * \brief Returns the actual value of an Q-QualMin parameter.
-     * \param qQualMinIeValue IE value of Q-QualMin
-     * \return Q-QualMin actual value in dB, which is IE value dB
+     * @brief Returns the actual value of an Q-QualMin parameter.
+     * @param qQualMinIeValue IE value of Q-QualMin
+     * @return Q-QualMin actual value in dB, which is IE value dB
      *
      * As per section 6.3.4 of 3GPP TS 36.331.
      *
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-control-messages.h ns-3.44/src/lte/model/lte-control-messages.h
--- ns-3.43/src/lte/model/lte-control-messages.h	2024-10-09 16:41:10.036656400 -0700
+++ ns-3.44/src/lte/model/lte-control-messages.h	2025-03-09 16:55:49.599372000 -0700
@@ -13,8 +13,8 @@
 #include "ff-mac-common.h"
 #include "lte-rrc-sap.h"
 
-#include <ns3/ptr.h>
-#include <ns3/simple-ref-count.h>
+#include "ns3/ptr.h"
+#include "ns3/simple-ref-count.h"
 
 #include <list>
 
@@ -24,7 +24,7 @@
 class LteNetDevice;
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
  * The LteControlMessage provides a basic implementations for
  * control messages (such as PDCCH allocation map, CQI feedbacks)
@@ -59,13 +59,13 @@
     virtual ~LteControlMessage();
 
     /**
-     * \brief Set the type of the message
-     * \param type the type of the message
+     * @brief Set the type of the message
+     * @param type the type of the message
      */
     void SetMessageType(MessageType type);
     /**
-     * \brief Get the type of the message
-     * \return the type of the message
+     * @brief Get the type of the message
+     * @return the type of the message
      */
     MessageType GetMessageType();
 
@@ -76,7 +76,7 @@
 // -----------------------------------------------------------------------
 
 /**
- * \ingroup lte
+ * @ingroup lte
  * The Downlink Data Control Indicator messages defines the RB allocation for the
  * users in the downlink
  */
@@ -87,14 +87,14 @@
     ~DlDciLteControlMessage() override;
 
     /**
-     * \brief add a DCI into the message
-     * \param dci the dci
+     * @brief add a DCI into the message
+     * @param dci the dci
      */
     void SetDci(DlDciListElement_s dci);
 
     /**
-     * \brief Get dic information
-     * \return dci messages
+     * @brief Get dic information
+     * @return dci messages
      */
     const DlDciListElement_s& GetDci();
 
@@ -105,7 +105,7 @@
 // ---------------------------------------------------------------------------
 
 /**
- * \ingroup lte
+ * @ingroup lte
  * The Uplink Data Control Indicator messages defines the RB allocation for the
  * users in the uplink
  */
@@ -116,14 +116,14 @@
     ~UlDciLteControlMessage() override;
 
     /**
-     * \brief add a DCI into the message
-     * \param dci the dci
+     * @brief add a DCI into the message
+     * @param dci the dci
      */
     void SetDci(UlDciListElement_s dci);
 
     /**
-     * \brief Get dic information
-     * \return dci messages
+     * @brief Get dic information
+     * @return dci messages
      */
     const UlDciListElement_s& GetDci();
 
@@ -134,7 +134,7 @@
 // ---------------------------------------------------------------------------
 
 /**
- * \ingroup lte
+ * @ingroup lte
  * The downlink CqiLteControlMessage defines an ideal list of
  * feedback about the channel quality sent by the UE to the eNodeB.
  */
@@ -145,14 +145,14 @@
     ~DlCqiLteControlMessage() override;
 
     /**
-     * \brief add a DL-CQI feedback record into the message.
-     * \param dlcqi the DL cqi feedback
+     * @brief add a DL-CQI feedback record into the message.
+     * @param dlcqi the DL cqi feedback
      */
     void SetDlCqi(CqiListElement_s dlcqi);
 
     /**
-     * \brief Get DL cqi information
-     * \return dlcqi messages
+     * @brief Get DL cqi information
+     * @return dlcqi messages
      */
     CqiListElement_s GetDlCqi();
 
@@ -163,7 +163,7 @@
 // ---------------------------------------------------------------------------
 
 /**
- * \ingroup lte
+ * @ingroup lte
  * The uplink BsrLteControlMessage defines the specific
  * extension of the CE element for reporting the buffer status report
  */
@@ -174,14 +174,14 @@
     ~BsrLteControlMessage() override;
 
     /**
-     * \brief add a BSR feedback record into the message.
-     * \param bsr the BSR feedback
+     * @brief add a BSR feedback record into the message.
+     * @param bsr the BSR feedback
      */
     void SetBsr(MacCeListElement_s bsr);
 
     /**
-     * \brief Get BSR information
-     * \return BSR message
+     * @brief Get BSR information
+     * @return BSR message
      */
     MacCeListElement_s GetBsr();
 
@@ -192,7 +192,7 @@
 // ---------------------------------------------------------------------------
 
 /**
- * \ingroup lte
+ * @ingroup lte
  * The downlink DlHarqFeedbackLteControlMessage defines the specific
  * messages for transmitting the DL HARQ feedback through PUCCH
  */
@@ -203,14 +203,14 @@
     ~DlHarqFeedbackLteControlMessage() override;
 
     /**
-     * \brief add a DL HARQ feedback record into the message.
-     * \param m the DL HARQ feedback
+     * @brief add a DL HARQ feedback record into the message.
+     * @param m the DL HARQ feedback
      */
     void SetDlHarqFeedback(DlInfoListElement_s m);
 
     /**
-     * \brief Get DL HARQ information
-     * \return DL HARQ message
+     * @brief Get DL HARQ information
+     * @return DL HARQ message
      */
     DlInfoListElement_s GetDlHarqFeedback();
 
@@ -221,7 +221,7 @@
 // ---------------------------------------------------------------------------
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
  * abstract model for the Random Access Preamble
  */
@@ -233,13 +233,13 @@
     /**
      * Set the Random Access Preamble Identifier (RAPID), see 3GPP TS 36.321 6.2.2
      *
-     * \param rapid the RAPID
+     * @param rapid the RAPID
      */
     void SetRapId(uint32_t rapid);
 
     /**
      *
-     * \return the RAPID
+     * @return the RAPID
      */
     uint32_t GetRapId() const;
 
@@ -250,7 +250,7 @@
 // ---------------------------------------------------------------------------
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
  * abstract model for the MAC Random Access Response message
  */
@@ -261,13 +261,13 @@
 
     /**
      *
-     * \param raRnti the RA-RNTI, see 3GPP TS 36.321 5.1.4
+     * @param raRnti the RA-RNTI, see 3GPP TS 36.321 5.1.4
      */
     void SetRaRnti(uint16_t raRnti);
 
     /**
      *
-     * \return  the RA-RNTI, see 3GPP TS 36.321 5.1.4
+     * @return  the RA-RNTI, see 3GPP TS 36.321 5.1.4
      */
     uint16_t GetRaRnti() const;
 
@@ -284,19 +284,19 @@
     /**
      * add a RAR to the MAC PDU, see 3GPP TS 36.321 6.2.3
      *
-     * \param rar the rar
+     * @param rar the rar
      */
     void AddRar(Rar rar);
 
     /**
      *
-     * \return a const iterator to the beginning of the RAR list
+     * @return a const iterator to the beginning of the RAR list
      */
     std::list<Rar>::const_iterator RarListBegin() const;
 
     /**
      *
-     * \return a const iterator to the end of the RAR list
+     * @return a const iterator to the end of the RAR list
      */
     std::list<Rar>::const_iterator RarListEnd() const;
 
@@ -308,8 +308,8 @@
 // ---------------------------------------------------------------------------
 
 /**
- * \ingroup lte
- * \brief Abstract model for broadcasting the Master Information Block (MIB)
+ * @ingroup lte
+ * @brief Abstract model for broadcasting the Master Information Block (MIB)
  *        within the control channel (BCCH).
  *
  * MIB is transmitted by eNodeB RRC and received by UE RRC at every radio frame,
@@ -322,19 +322,19 @@
 {
   public:
     /**
-     * \brief Create a new instance of MIB control message.
+     * @brief Create a new instance of MIB control message.
      */
     MibLteControlMessage();
 
     /**
-     * \brief Replace the MIB content of this control message.
-     * \param mib the desired MIB content
+     * @brief Replace the MIB content of this control message.
+     * @param mib the desired MIB content
      */
     void SetMib(LteRrcSap::MasterInformationBlock mib);
 
     /**
-     * \brief Retrieve the MIB content from this control message.
-     * \return the current MIB content that this control message holds
+     * @brief Retrieve the MIB content from this control message.
+     * @return the current MIB content that this control message holds
      */
     LteRrcSap::MasterInformationBlock GetMib() const;
 
@@ -346,8 +346,8 @@
 // ---------------------------------------------------------------------------
 
 /**
- * \ingroup lte
- * \brief Abstract model for broadcasting the System Information Block Type 1
+ * @ingroup lte
+ * @brief Abstract model for broadcasting the System Information Block Type 1
  *        (SIB1) within the control channel (BCCH).
  *
  * SIB1 is transmitted by eNodeB RRC and received by UE RRC at the 6th subframe
@@ -360,19 +360,19 @@
 {
   public:
     /**
-     * \brief Create a new instance of SIB1 control message.
+     * @brief Create a new instance of SIB1 control message.
      */
     Sib1LteControlMessage();
 
     /**
-     * \brief Replace the SIB1 content of this control message.
-     * \param sib1 the desired SIB1 content
+     * @brief Replace the SIB1 content of this control message.
+     * @param sib1 the desired SIB1 content
      */
     void SetSib1(LteRrcSap::SystemInformationBlockType1 sib1);
 
     /**
-     * \brief Retrieve the SIB1 content from this control message.
-     * \return the current SIB1 content that this control message holds
+     * @brief Retrieve the SIB1 content from this control message.
+     * @return the current SIB1 content that this control message holds
      */
     LteRrcSap::SystemInformationBlockType1 GetSib1() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-enb-cmac-sap.h ns-3.44/src/lte/model/lte-enb-cmac-sap.h
--- ns-3.43/src/lte/model/lte-enb-cmac-sap.h	2024-10-09 16:41:10.036656400 -0700
+++ ns-3.44/src/lte/model/lte-enb-cmac-sap.h	2025-03-09 16:55:49.599372000 -0700
@@ -10,7 +10,7 @@
 #ifndef LTE_ENB_CMAC_SAP_H
 #define LTE_ENB_CMAC_SAP_H
 
-#include <ns3/packet.h>
+#include "ns3/packet.h"
 
 namespace ns3
 {
@@ -39,14 +39,14 @@
     /**
      * Add UE function
      *
-     * \param rnti
+     * @param rnti
      */
     virtual void AddUe(uint16_t rnti) = 0;
 
     /**
      * remove the UE, e.g., after handover or termination of the RRC connection
      *
-     * \param rnti
+     * @param rnti
      */
     virtual void RemoveUe(uint16_t rnti) = 0;
 
@@ -71,28 +71,28 @@
     /**
      * Add a new logical channel
      *
-     * \param lcinfo
-     * \param msu
+     * @param lcinfo
+     * @param msu
      */
     virtual void AddLc(LcInfo lcinfo, LteMacSapUser* msu) = 0;
 
     /**
      * Reconfigure an existing logical channel
      *
-     * \param lcinfo
+     * @param lcinfo
      */
     virtual void ReconfigureLc(LcInfo lcinfo) = 0;
 
     /**
      * release an existing logical channel
      *
-     * \param rnti
-     * \param lcid
+     * @param rnti
+     * @param lcid
      */
     virtual void ReleaseLc(uint16_t rnti, uint8_t lcid) = 0;
 
     /**
-     * \brief Parameters for [re]configuring the UE
+     * @brief Parameters for [re]configuring the UE
      */
     struct UeConfig
     {
@@ -109,7 +109,7 @@
     /**
      * update the configuration of the UE
      *
-     * \param params
+     * @param params
      */
     virtual void UeUpdateConfigurationReq(UeConfig params) = 0;
 
@@ -127,12 +127,12 @@
 
     /**
      *
-     * \return the current RACH configuration of the MAC
+     * @return the current RACH configuration of the MAC
      */
     virtual RachConfig GetRachConfig() = 0;
 
     /**
-     * \brief AllocateNcRaPreambleReturnValue structure
+     * @brief AllocateNcRaPreambleReturnValue structure
      *
      */
     struct AllocateNcRaPreambleReturnValue
@@ -146,9 +146,9 @@
      * Allocate a random access preamble for non-contention based random access (e.g., for
      * handover).
      *
-     * \param rnti the RNTI of the UE who will perform non-contention based random access
+     * @param rnti the RNTI of the UE who will perform non-contention based random access
      *
-     * \return  the newly allocated random access preamble
+     * @return  the newly allocated random access preamble
      */
     virtual AllocateNcRaPreambleReturnValue AllocateNcRaPreamble(uint16_t rnti) = 0;
 };
@@ -168,21 +168,21 @@
     /**
      * request the allocation of a Temporary C-RNTI
      *
-     * \return the T-C-RNTI
+     * @return the T-C-RNTI
      */
     virtual uint16_t AllocateTemporaryCellRnti() = 0;
 
     /**
      * notify the result of the last LC config operation
      *
-     * \param rnti the rnti of the user
-     * \param lcid the logical channel id
-     * \param success true if the operation was successful, false otherwise
+     * @param rnti the rnti of the user
+     * @param lcid the logical channel id
+     * @param success true if the operation was successful, false otherwise
      */
     virtual void NotifyLcConfigResult(uint16_t rnti, uint8_t lcid, bool success) = 0;
 
     /**
-     * \brief Parameters for [re]configuring the UE
+     * @brief Parameters for [re]configuring the UE
      */
     struct UeConfig
     {
@@ -199,12 +199,12 @@
     /**
      * Notify the RRC of a UE config updated requested by the MAC (normally, by the scheduler)
      *
-     * \param params
+     * @param params
      */
     virtual void RrcConfigurationUpdateInd(UeConfig params) = 0;
 
     /**
-     * \brief Is random access completed function
+     * @brief Is random access completed function
      *
      * This method is executed to decide if the non contention based
      * preamble has to be reused or not upon preamble expiry. If the random access
@@ -212,8 +212,8 @@
      * If not, the same UE retains the preamble and other available preambles are
      * assigned to the required UEs.
      *
-     * \param rnti the C-RNTI identifying the user
-     * \return true if the random access in connected mode is completed
+     * @param rnti the C-RNTI identifying the user
+     * @return true if the random access in connected mode is completed
      */
     virtual bool IsRandomAccessCompleted(uint16_t rnti) = 0;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-enb-component-carrier-manager.cc ns-3.44/src/lte/model/lte-enb-component-carrier-manager.cc
--- ns-3.43/src/lte/model/lte-enb-component-carrier-manager.cc	2024-10-09 16:41:10.036656400 -0700
+++ ns-3.44/src/lte/model/lte-enb-component-carrier-manager.cc	2025-03-09 16:55:49.599372000 -0700
@@ -11,7 +11,7 @@
 
 #include "lte-common.h"
 
-#include <ns3/log.h>
+#include "ns3/log.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-enb-component-carrier-manager.h ns-3.44/src/lte/model/lte-enb-component-carrier-manager.h
--- ns-3.43/src/lte/model/lte-enb-component-carrier-manager.h	2024-10-09 16:41:10.036656400 -0700
+++ ns-3.44/src/lte/model/lte-enb-component-carrier-manager.h	2025-03-09 16:55:49.599372000 -0700
@@ -17,7 +17,7 @@
 #include "lte-mac-sap.h"
 #include "lte-rrc-sap.h"
 
-#include <ns3/object.h>
+#include "ns3/object.h"
 
 #include <map>
 #include <vector>
@@ -33,7 +33,7 @@
 class LteCcmMacSapProvider;
 
 /**
- * \brief The class implements Component Carrier Manager (CCM) that operates
+ * @brief The class implements Component Carrier Manager (CCM) that operates
  * using the Component Carrier Manager SAP interfaces.
  *
  * CCM receives measurement reports from an eNode RRC instance and is forwarding
@@ -71,72 +71,72 @@
     LteEnbComponentCarrierManager();
     ~LteEnbComponentCarrierManager() override;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Set the "user" part of the ComponentCarrier Management SAP interface that
+     * @brief Set the "user" part of the ComponentCarrier Management SAP interface that
      *        this ComponentCarrier algorithm instance will interact with.
-     * \param s a reference to the "user" part of the interface, typically a
+     * @param s a reference to the "user" part of the interface, typically a
      *          member of an LteEnbRrc instance
      */
     virtual void SetLteCcmRrcSapUser(LteCcmRrcSapUser* s);
 
     /**
-     * \brief Export the "provider" part of the ComponentCarrier Management SAP interface.
-     * \return the reference to the "provider" part of the interface, typically to
+     * @brief Export the "provider" part of the ComponentCarrier Management SAP interface.
+     * @return the reference to the "provider" part of the interface, typically to
      *         be kept by an LteEnbRlc instance
      */
     virtual LteCcmRrcSapProvider* GetLteCcmRrcSapProvider();
 
     /**
-     * \brief This function returns a pointer to the LteCcmMacSapUser interface, which
+     * @brief This function returns a pointer to the LteCcmMacSapUser interface, which
      * is used by MAC to communicate to CCM when e.g. UL buffer status report is
      * received, or to notify CCM about PRB occupancy, and similar. Functions that are
      * specific for the communication between MAC and CCM.
      *
-     * \returns LteCcmMacSapUser*
+     * @returns LteCcmMacSapUser*
      */
     virtual LteCcmMacSapUser* GetLteCcmMacSapUser();
 
     /**
-     * \brief Returns the pointer to the LteMacSapProvider interface, the
+     * @brief Returns the pointer to the LteMacSapProvider interface, the
      * provider of MAC, which is this new architecture served by
      * LteEnbComponentCarrierManager object which will behave as a
      * proxy, and will forward calls between to MAC objects of
      * component carriers based on the logic implemented in the
      * specific component carrier manager.
      *
-     * \returns LteMacSapProvider*
+     * @returns LteMacSapProvider*
      */
     virtual LteMacSapProvider* GetLteMacSapProvider();
 
     /**
-     * \brief Set LteMacSapProvider interface for the MAC object of
+     * @brief Set LteMacSapProvider interface for the MAC object of
      * the specified component carrier.
      *
-     * \param componentCarrierId component carrier ID
-     * \param sap the MAC SAP provider
-     * \returns true if successful
+     * @param componentCarrierId component carrier ID
+     * @param sap the MAC SAP provider
+     * @returns true if successful
      */
     virtual bool SetMacSapProvider(uint8_t componentCarrierId, LteMacSapProvider* sap);
 
     /**
-     * \brief Set LteCcmMacSapProvider interface for the MAC object of
+     * @brief Set LteCcmMacSapProvider interface for the MAC object of
      * the specified component carrier. Through this interface CCM communicates with
      * MAC, e.g. it notifies MAC of the specific carrier when to scheduler UL BSR.
      *
-     * \param componentCarrierId component carrier ID
-     * \param sap the MAC SAP provider
-     * \returns true if successful
+     * @param componentCarrierId component carrier ID
+     * @param sap the MAC SAP provider
+     * @returns true if successful
      */
     virtual bool SetCcmMacSapProviders(uint8_t componentCarrierId, LteCcmMacSapProvider* sap);
 
     /**
-     * \brief Sets the total number of component carriers.
-     * \param noOfComponentCarriers number of component carriers
+     * @brief Sets the total number of component carriers.
+     * @param noOfComponentCarriers number of component carriers
      */
     virtual void SetNumberOfComponentCarriers(uint16_t noOfComponentCarriers);
 
@@ -145,15 +145,15 @@
     void DoDispose() override;
 
     /**
-     * \brief Implementation of ReportUeMeas.
-     * \param rnti Radio Network Temporary Identity, an integer identifying the UE
+     * @brief Implementation of ReportUeMeas.
+     * @param rnti Radio Network Temporary Identity, an integer identifying the UE
      *             where the report originates from
-     * \param measResults a single report of one measurement identity
+     * @param measResults a single report of one measurement identity
      */
     virtual void DoReportUeMeas(uint16_t rnti, LteRrcSap::MeasResults measResults) = 0;
 
     /**
-     * \brief Structure to represent UE info
+     * @brief Structure to represent UE info
      */
     struct UeInfo
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-enb-cphy-sap.h ns-3.44/src/lte/model/lte-enb-cphy-sap.h
--- ns-3.43/src/lte/model/lte-enb-cphy-sap.h	2024-10-09 16:41:10.036656400 -0700
+++ ns-3.44/src/lte/model/lte-enb-cphy-sap.h	2025-03-09 16:55:49.599372000 -0700
@@ -12,7 +12,7 @@
 
 #include "lte-rrc-sap.h"
 
-#include <ns3/ptr.h>
+#include "ns3/ptr.h"
 
 #include <stdint.h>
 
@@ -38,82 +38,82 @@
     /**
      * Set cell ID
      *
-     * \param cellId the Cell Identifier
+     * @param cellId the Cell Identifier
      */
     virtual void SetCellId(uint16_t cellId) = 0;
 
     /**
      * Set bandwidth
      *
-     * \param ulBandwidth the UL bandwidth in PRBs
-     * \param dlBandwidth the DL bandwidth in PRBs
+     * @param ulBandwidth the UL bandwidth in PRBs
+     * @param dlBandwidth the DL bandwidth in PRBs
      */
     virtual void SetBandwidth(uint16_t ulBandwidth, uint16_t dlBandwidth) = 0;
 
     /**
      * Set EARFCN
      *
-     * \param ulEarfcn the UL EARFCN
-     * \param dlEarfcn the DL EARFCN
+     * @param ulEarfcn the UL EARFCN
+     * @param dlEarfcn the DL EARFCN
      */
     virtual void SetEarfcn(uint32_t ulEarfcn, uint32_t dlEarfcn) = 0;
 
     /**
      * Add a new UE to the cell
      *
-     * \param rnti the UE id relative to this cell
+     * @param rnti the UE id relative to this cell
      */
     virtual void AddUe(uint16_t rnti) = 0;
 
     /**
      * Remove an UE from the cell
      *
-     * \param rnti the UE id relative to this cell
+     * @param rnti the UE id relative to this cell
      */
     virtual void RemoveUe(uint16_t rnti) = 0;
 
     /**
      * Set the UE transmission power offset P_A
      *
-     * \param rnti the UE id relative to this cell
-     * \param pa transmission power offset
+     * @param rnti the UE id relative to this cell
+     * @param pa transmission power offset
      */
     virtual void SetPa(uint16_t rnti, double pa) = 0;
 
     /**
      * Set transmission mode
      *
-     * \param rnti the RNTI of the user
-     * \param txMode the transmissionMode of the user
+     * @param rnti the RNTI of the user
+     * @param txMode the transmissionMode of the user
      */
     virtual void SetTransmissionMode(uint16_t rnti, uint8_t txMode) = 0;
 
     /**
      * Set SRS configuration index
      *
-     * \param rnti the RNTI of the user
-     * \param srsCi the SRS Configuration Index of the user
+     * @param rnti the RNTI of the user
+     * @param srsCi the SRS Configuration Index of the user
      */
     virtual void SetSrsConfigurationIndex(uint16_t rnti, uint16_t srsCi) = 0;
 
     /**
      * Set master information block
      *
-     * \param mib the Master Information Block to be sent on the BCH
+     * @param mib the Master Information Block to be sent on the BCH
      */
     virtual void SetMasterInformationBlock(LteRrcSap::MasterInformationBlock mib) = 0;
 
     /**
      * Set system information block type 1
      *
-     * \param sib1 the System Information Block Type 1 to be sent on the BCH
+     * @param sib1 the System Information Block Type 1 to be sent on the BCH
      */
     virtual void SetSystemInformationBlockType1(LteRrcSap::SystemInformationBlockType1 sib1) = 0;
 
     /**
      * Get reference signal power
      *
-     * \return Reference Signal Power for SIB2
+     * @return Reference Signal Power for SIB2
      */
     virtual int8_t GetReferenceSignalPower() = 0;
 };
@@ -144,7 +144,7 @@
     /**
      * Constructor
      *
-     * \param owner the owner class
+     * @param owner the owner class
      */
     MemberLteEnbCphySapProvider(C* owner);
 
@@ -263,7 +263,7 @@
     /**
      * Constructor
      *
-     * \param owner the owner class
+     * @param owner the owner class
      */
     MemberLteEnbCphySapUser(C* owner);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-enb-mac.cc ns-3.44/src/lte/model/lte-enb-mac.cc
--- ns-3.43/src/lte/model/lte-enb-mac.cc	2024-10-09 16:41:10.036656400 -0700
+++ ns-3.44/src/lte/model/lte-enb-mac.cc	2025-03-09 16:55:49.599372000 -0700
@@ -18,10 +18,10 @@
 #include "lte-mac-sap.h"
 #include "lte-radio-bearer-tag.h"
 
-#include <ns3/log.h>
-#include <ns3/packet.h>
-#include <ns3/pointer.h>
-#include <ns3/simulator.h>
+#include "ns3/log.h"
+#include "ns3/packet.h"
+#include "ns3/pointer.h"
+#include "ns3/simulator.h"
 
 namespace ns3
 {
@@ -41,7 +41,7 @@
     /**
      * Constructor
      *
-     * \param mac the MAC
+     * @param mac the MAC
      */
     EnbMacMemberLteEnbCmacSapProvider(LteEnbMac* mac);
 
@@ -126,7 +126,7 @@
     /**
      * Constructor
      *
-     * \param mac the MAC
+     * @param mac the MAC
      */
     EnbMacMemberFfMacSchedSapUser(LteEnbMac* mac);
 
@@ -161,7 +161,7 @@
     /**
      * Constructor
      *
-     * \param mac the MAC
+     * @param mac the MAC
      */
     EnbMacMemberFfMacCschedSapUser(LteEnbMac* mac);
 
@@ -233,7 +233,7 @@
     /**
      * Constructor
      *
-     * \param mac the MAC
+     * @param mac the MAC
      */
     EnbMacMemberLteEnbPhySapUser(LteEnbMac* mac);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-enb-mac.h ns-3.44/src/lte/model/lte-enb-mac.h
--- ns-3.43/src/lte/model/lte-enb-mac.h	2024-10-09 16:41:10.036656400 -0700
+++ ns-3.44/src/lte/model/lte-enb-mac.h	2025-03-09 16:55:49.599372000 -0700
@@ -21,11 +21,11 @@
 #include "lte-enb-phy-sap.h"
 #include "lte-mac-sap.h"
 
-#include <ns3/nstime.h>
-#include <ns3/packet-burst.h>
-#include <ns3/packet.h>
-#include <ns3/trace-source-accessor.h>
-#include <ns3/traced-value.h>
+#include "ns3/nstime.h"
+#include "ns3/packet-burst.h"
+#include "ns3/packet.h"
+#include "ns3/trace-source-accessor.h"
+#include "ns3/traced-value.h"
 
 #include <map>
 #include <vector>
@@ -60,8 +60,8 @@
 
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -70,87 +70,87 @@
     void DoDispose() override;
 
     /**
-     * \brief Set the component carrier ID
-     * \param index the component carrier ID
+     * @brief Set the component carrier ID
+     * @param index the component carrier ID
      */
     void SetComponentCarrierId(uint8_t index);
     /**
-     * \brief Set the scheduler SAP provider
-     * \param s a pointer SAP provider of the FF packet scheduler
+     * @brief Set the scheduler SAP provider
+     * @param s a pointer SAP provider of the FF packet scheduler
      */
     void SetFfMacSchedSapProvider(FfMacSchedSapProvider* s);
     /**
-     * \brief Get the scheduler SAP user
-     * \return a pointer to the SAP user of the scheduler
+     * @brief Get the scheduler SAP user
+     * @return a pointer to the SAP user of the scheduler
      */
     FfMacSchedSapUser* GetFfMacSchedSapUser();
     /**
-     * \brief Set the control scheduler SAP provider
-     * \param s a pointer to the control scheduler SAP provider
+     * @brief Set the control scheduler SAP provider
+     * @param s a pointer to the control scheduler SAP provider
      */
     void SetFfMacCschedSapProvider(FfMacCschedSapProvider* s);
     /**
-     * \brief Get the control scheduler SAP user
-     * \return a pointer to the control scheduler SAP user
+     * @brief Get the control scheduler SAP user
+     * @return a pointer to the control scheduler SAP user
      */
     FfMacCschedSapUser* GetFfMacCschedSapUser();
 
     /**
-     * \brief Set the MAC SAP user
-     * \param s a pointer to the MAC SAP user
+     * @brief Set the MAC SAP user
+     * @param s a pointer to the MAC SAP user
      */
     void SetLteMacSapUser(LteMacSapUser* s);
     /**
-     * \brief Get the MAC SAP provider
-     * \return a pointer to the SAP provider of the MAC
+     * @brief Get the MAC SAP provider
+     * @return a pointer to the SAP provider of the MAC
      */
     LteMacSapProvider* GetLteMacSapProvider();
     /**
-     * \brief Set the control MAC SAP user
-     * \param s a pointer to the control MAC SAP user
+     * @brief Set the control MAC SAP user
+     * @param s a pointer to the control MAC SAP user
      */
     void SetLteEnbCmacSapUser(LteEnbCmacSapUser* s);
     /**
-     * \brief Get the control MAC SAP provider
-     * \return a pointer to the control MAC SAP provider
+     * @brief Get the control MAC SAP provider
+     * @return a pointer to the control MAC SAP provider
      */
     LteEnbCmacSapProvider* GetLteEnbCmacSapProvider();
 
     /**
-     * \brief Get the eNB-PHY SAP User
-     * \return a pointer to the SAP User of the PHY
+     * @brief Get the eNB-PHY SAP User
+     * @return a pointer to the SAP User of the PHY
      */
     LteEnbPhySapUser* GetLteEnbPhySapUser();
 
     /**
-     * \brief Set the PHY SAP Provider
-     * \param s a pointer to the PHY SAP provider
+     * @brief Set the PHY SAP Provider
+     * @param s a pointer to the PHY SAP provider
      */
     void SetLteEnbPhySapProvider(LteEnbPhySapProvider* s);
 
     /**
-     * \brief Get the eNB-ComponentCarrierManager SAP User
-     * \return a pointer to the SAP User of the ComponentCarrierManager
+     * @brief Get the eNB-ComponentCarrierManager SAP User
+     * @return a pointer to the SAP User of the ComponentCarrierManager
      */
     LteCcmMacSapProvider* GetLteCcmMacSapProvider();
 
     /**
-     * \brief Set the ComponentCarrierManager SAP user
-     * \param s a pointer to the ComponentCarrierManager provider
+     * @brief Set the ComponentCarrierManager SAP user
+     * @param s a pointer to the ComponentCarrierManager provider
      */
     void SetLteCcmMacSapUser(LteCcmMacSapUser* s);
 
     /**
      * TracedCallback signature for DL scheduling events.
      *
-     * \param [in] frame Frame number.
-     * \param [in] subframe Subframe number.
-     * \param [in] rnti The C-RNTI identifying the UE.
-     * \param [in] mcs0 The MCS for transport block..
-     * \param [in] tbs0Size
-     * \param [in] mcs1 The MCS for transport block.
-     * \param [in] tbs1Size
-     * \param [in] component carrier id
+     * @param [in] frame Frame number.
+     * @param [in] subframe Subframe number.
+     * @param [in] rnti The C-RNTI identifying the UE.
+     * @param [in] mcs0 The MCS for transport block..
+     * @param [in] tbs0Size
+     * @param [in] mcs1 The MCS for transport block.
+     * @param [in] tbs1Size
+     * @param [in] component carrier id
      */
     typedef void (*DlSchedulingTracedCallback)(const uint32_t frame,
                                                const uint32_t subframe,
@@ -164,11 +164,11 @@
     /**
      *  TracedCallback signature for UL scheduling events.
      *
-     * \param [in] frame Frame number.
-     * \param [in] subframe Subframe number.
-     * \param [in] rnti The C-RNTI identifying the UE.
-     * \param [in] mcs  The MCS for transport block
-     * \param [in] tbsSize
+     * @param [in] frame Frame number.
+     * @param [in] subframe Subframe number.
+     * @param [in] rnti The C-RNTI identifying the UE.
+     * @param [in] mcs  The MCS for transport block
+     * @param [in] tbsSize
      */
     typedef void (*UlSchedulingTracedCallback)(const uint32_t frame,
                                                const uint32_t subframe,
@@ -178,165 +178,165 @@
 
   private:
     /**
-     * \brief Receive a DL CQI ideal control message
-     * \param msg the DL CQI message
+     * @brief Receive a DL CQI ideal control message
+     * @param msg the DL CQI message
      */
     void ReceiveDlCqiLteControlMessage(Ptr<DlCqiLteControlMessage> msg);
 
     /**
-     * \brief Receive a DL CQI ideal control message
-     * \param msg the DL CQI message
+     * @brief Receive a DL CQI ideal control message
+     * @param msg the DL CQI message
      */
     void DoReceiveLteControlMessage(Ptr<LteControlMessage> msg);
 
     /**
-     * \brief Receive a CE element containing the buffer status report
-     * \param bsr the BSR message
+     * @brief Receive a CE element containing the buffer status report
+     * @param bsr the BSR message
      */
     void ReceiveBsrMessage(MacCeListElement_s bsr);
 
     /**
-     * \brief UL CQI report
-     * \param ulcqi FfMacSchedSapProvider::SchedUlCqiInfoReqParameters
+     * @brief UL CQI report
+     * @param ulcqi FfMacSchedSapProvider::SchedUlCqiInfoReqParameters
      */
     void DoUlCqiReport(FfMacSchedSapProvider::SchedUlCqiInfoReqParameters ulcqi);
 
     // forwarded from LteEnbCmacSapProvider
     /**
-     * \brief Configure MAC function
-     * \param ulBandwidth the UL bandwidth
-     * \param dlBandwidth the DL bandwidth
+     * @brief Configure MAC function
+     * @param ulBandwidth the UL bandwidth
+     * @param dlBandwidth the DL bandwidth
      */
     void DoConfigureMac(uint16_t ulBandwidth, uint16_t dlBandwidth);
     /**
-     * \brief Add UE function
-     * \param rnti the RNTI
+     * @brief Add UE function
+     * @param rnti the RNTI
      */
     void DoAddUe(uint16_t rnti);
     /**
-     * \brief Remove UE function
-     * \param rnti the RNTI
+     * @brief Remove UE function
+     * @param rnti the RNTI
      */
     void DoRemoveUe(uint16_t rnti);
     /**
-     * \brief Add LC function
-     * \param lcinfo the LC info
-     * \param msu the LTE MAC SAP user
+     * @brief Add LC function
+     * @param lcinfo the LC info
+     * @param msu the LTE MAC SAP user
      */
     void DoAddLc(LteEnbCmacSapProvider::LcInfo lcinfo, LteMacSapUser* msu);
     /**
-     * \brief Reconfigure LC function
-     * \param lcinfo the LC info
+     * @brief Reconfigure LC function
+     * @param lcinfo the LC info
      */
     void DoReconfigureLc(LteEnbCmacSapProvider::LcInfo lcinfo);
     /**
-     * \brief Release LC function
-     * \param rnti the RNTI
-     * \param lcid the LCID
+     * @brief Release LC function
+     * @param rnti the RNTI
+     * @param lcid the LCID
      */
     void DoReleaseLc(uint16_t rnti, uint8_t lcid);
     /**
-     * \brief UE Update configuration request function
-     * \param params LteEnbCmacSapProvider::UeConfig
+     * @brief UE Update configuration request function
+     * @param params LteEnbCmacSapProvider::UeConfig
      */
     void DoUeUpdateConfigurationReq(LteEnbCmacSapProvider::UeConfig params);
     /**
-     * \brief Get RACH configuration function
-     * \returns LteEnbCmacSapProvider::RachConfig
+     * @brief Get RACH configuration function
+     * @returns LteEnbCmacSapProvider::RachConfig
      */
     LteEnbCmacSapProvider::RachConfig DoGetRachConfig() const;
     /**
-     * \brief Allocate NC RA preamble function
-     * \param rnti the RNTI
-     * \returns LteEnbCmacSapProvider::AllocateNcRaPreambleReturnValue
+     * @brief Allocate NC RA preamble function
+     * @param rnti the RNTI
+     * @returns LteEnbCmacSapProvider::AllocateNcRaPreambleReturnValue
      */
     LteEnbCmacSapProvider::AllocateNcRaPreambleReturnValue DoAllocateNcRaPreamble(uint16_t rnti);
 
     // forwarded from LteMacSapProvider
     /**
-     * \brief Transmit PDU function
-     * \param params LteMacSapProvider::TransmitPduParameters
+     * @brief Transmit PDU function
+     * @param params LteMacSapProvider::TransmitPduParameters
      */
     void DoTransmitPdu(LteMacSapProvider::TransmitPduParameters params);
     /**
-     * \brief Report Buffer Status function
-     * \param params LteMacSapProvider::ReportBufferStatusParameters
+     * @brief Report Buffer Status function
+     * @param params LteMacSapProvider::ReportBufferStatusParameters
      */
     void DoReportBufferStatus(LteMacSapProvider::ReportBufferStatusParameters params);
 
     // forwarded from FfMacCchedSapUser
     /**
-     * \brief CSched Cell Config configure function
-     * \param params FfMacCschedSapUser::CschedCellConfigCnfParameters
+     * @brief CSched Cell Config configure function
+     * @param params FfMacCschedSapUser::CschedCellConfigCnfParameters
      */
     void DoCschedCellConfigCnf(FfMacCschedSapUser::CschedCellConfigCnfParameters params);
     /**
-     * \brief CSched UE Config configure function
-     * \param params FfMacCschedSapUser::CschedUeConfigCnfParameters
+     * @brief CSched UE Config configure function
+     * @param params FfMacCschedSapUser::CschedUeConfigCnfParameters
      */
     void DoCschedUeConfigCnf(FfMacCschedSapUser::CschedUeConfigCnfParameters params);
     /**
-     * \brief CSched LC Config configure function
-     * \param params FfMacCschedSapUser::CschedLcConfigCnfParameters
+     * @brief CSched LC Config configure function
+     * @param params FfMacCschedSapUser::CschedLcConfigCnfParameters
      */
     void DoCschedLcConfigCnf(FfMacCschedSapUser::CschedLcConfigCnfParameters params);
     /**
-     * \brief CSched LC Release configure function
-     * \param params FfMacCschedSapUser::CschedLcReleaseCnfParameters
+     * @brief CSched LC Release configure function
+     * @param params FfMacCschedSapUser::CschedLcReleaseCnfParameters
      */
     void DoCschedLcReleaseCnf(FfMacCschedSapUser::CschedLcReleaseCnfParameters params);
     /**
-     * \brief CSched UE Release configure function
-     * \param params FfMacCschedSapUser::CschedUeReleaseCnfParameters
+     * @brief CSched UE Release configure function
+     * @param params FfMacCschedSapUser::CschedUeReleaseCnfParameters
      */
     void DoCschedUeReleaseCnf(FfMacCschedSapUser::CschedUeReleaseCnfParameters params);
     /**
-     * \brief CSched UE Config Update Indication function
-     * \param params FfMacCschedSapUser::CschedUeConfigUpdateIndParameters
+     * @brief CSched UE Config Update Indication function
+     * @param params FfMacCschedSapUser::CschedUeConfigUpdateIndParameters
      */
     void DoCschedUeConfigUpdateInd(FfMacCschedSapUser::CschedUeConfigUpdateIndParameters params);
     /**
-     * \brief CSched Cell Config Update Indication function
-     * \param params FfMacCschedSapUser::CschedCellConfigUpdateIndParameters
+     * @brief CSched Cell Config Update Indication function
+     * @param params FfMacCschedSapUser::CschedCellConfigUpdateIndParameters
      */
     void DoCschedCellConfigUpdateInd(
         FfMacCschedSapUser::CschedCellConfigUpdateIndParameters params);
 
     // forwarded from FfMacSchedSapUser
     /**
-     * \brief Sched DL Config Indication function
-     * \param ind FfMacSchedSapUser::SchedDlConfigIndParameters
+     * @brief Sched DL Config Indication function
+     * @param ind FfMacSchedSapUser::SchedDlConfigIndParameters
      */
     void DoSchedDlConfigInd(FfMacSchedSapUser::SchedDlConfigIndParameters ind);
     /**
-     * \brief Sched UL Config Indication function
-     * \param params FfMacSchedSapUser::SchedUlConfigIndParameters
+     * @brief Sched UL Config Indication function
+     * @param params FfMacSchedSapUser::SchedUlConfigIndParameters
      */
     void DoSchedUlConfigInd(FfMacSchedSapUser::SchedUlConfigIndParameters params);
 
     // forwarded from LteEnbPhySapUser
     /**
-     * \brief Subrame Indication function
-     * \param frameNo frame number
-     * \param subframeNo subframe number
+     * @brief Subrame Indication function
+     * @param frameNo frame number
+     * @param subframeNo subframe number
      */
     void DoSubframeIndication(uint32_t frameNo, uint32_t subframeNo);
     /**
-     * \brief Receive RACH Preamble function
-     * \param prachId PRACH ID number
+     * @brief Receive RACH Preamble function
+     * @param prachId PRACH ID number
      */
     void DoReceiveRachPreamble(uint8_t prachId);
 
     // forwarded by LteCcmMacSapProvider
     /**
      * Report MAC CE to scheduler
-     * \param bsr the BSR
+     * @param bsr the BSR
      */
     void DoReportMacCeToScheduler(MacCeListElement_s bsr);
 
     /**
-     * \brief Report SR to scheduler
-     * \param rnti RNTI of the UE that requested the SR
+     * @brief Report SR to scheduler
+     * @param rnti RNTI of the UE that requested the SR
      *
      * Since SR is not implemented in LTE, this method does nothing.
      */
@@ -347,19 +347,19 @@
   public:
     /**
      * legacy public for use the Phy callback
-     * \param p packet
+     * @param p packet
      */
     void DoReceivePhyPdu(Ptr<Packet> p);
 
   private:
     /**
-     * \brief UL Info List Elements HARQ Feedback function
-     * \param params UlInfoListElement_s
+     * @brief UL Info List Elements HARQ Feedback function
+     * @param params UlInfoListElement_s
      */
     void DoUlInfoListElementHarqFeedback(UlInfoListElement_s params);
     /**
-     * \brief DL Info List Elements HARQ Feedback function
-     * \param params DlInfoListElement_s
+     * @brief DL Info List Elements HARQ Feedback function
+     * @param params DlInfoListElement_s
      */
     void DoDlInfoListElementHarqFeedback(DlInfoListElement_s params);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-enb-net-device.cc ns-3.44/src/lte/model/lte-enb-net-device.cc
--- ns-3.43/src/lte/model/lte-enb-net-device.cc	2024-10-09 16:41:10.036656400 -0700
+++ ns-3.44/src/lte/model/lte-enb-net-device.cc	2025-03-09 16:55:49.599372000 -0700
@@ -22,22 +22,22 @@
 #include "lte-handover-algorithm.h"
 #include "lte-net-device.h"
 
-#include <ns3/abort.h>
-#include <ns3/callback.h>
-#include <ns3/enum.h>
-#include <ns3/ipv4-l3-protocol.h>
-#include <ns3/ipv6-l3-protocol.h>
-#include <ns3/llc-snap-header.h>
-#include <ns3/log.h>
-#include <ns3/node.h>
-#include <ns3/object-factory.h>
-#include <ns3/object-map.h>
-#include <ns3/packet-burst.h>
-#include <ns3/packet.h>
-#include <ns3/pointer.h>
-#include <ns3/simulator.h>
-#include <ns3/trace-source-accessor.h>
-#include <ns3/uinteger.h>
+#include "ns3/abort.h"
+#include "ns3/callback.h"
+#include "ns3/enum.h"
+#include "ns3/ipv4-l3-protocol.h"
+#include "ns3/ipv6-l3-protocol.h"
+#include "ns3/llc-snap-header.h"
+#include "ns3/log.h"
+#include "ns3/node.h"
+#include "ns3/object-factory.h"
+#include "ns3/object-map.h"
+#include "ns3/packet-burst.h"
+#include "ns3/packet.h"
+#include "ns3/pointer.h"
+#include "ns3/simulator.h"
+#include "ns3/trace-source-accessor.h"
+#include "ns3/uinteger.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-enb-net-device.h ns-3.44/src/lte/model/lte-enb-net-device.h
--- ns-3.43/src/lte/model/lte-enb-net-device.h	2024-10-09 16:41:10.036656400 -0700
+++ ns-3.44/src/lte/model/lte-enb-net-device.h	2025-03-09 16:55:49.599372000 -0700
@@ -40,7 +40,7 @@
 class LteEnbComponentCarrierManager;
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
  * The eNodeB device implementation
  */
@@ -48,8 +48,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -62,103 +62,103 @@
     bool Send(Ptr<Packet> packet, const Address& dest, uint16_t protocolNumber) override;
 
     /**
-     * \return a pointer to the MAC of the PCC.
+     * @return a pointer to the MAC of the PCC.
      */
     Ptr<LteEnbMac> GetMac() const;
 
     /**
-     * \param index CC index
-     * \return a pointer to the MAC of the CC addressed by index.
+     * @param index CC index
+     * @return a pointer to the MAC of the CC addressed by index.
      */
     Ptr<LteEnbMac> GetMac(uint8_t index) const;
 
     /**
-     * \return a pointer to the physical layer of the PCC.
+     * @return a pointer to the physical layer of the PCC.
      */
     Ptr<LteEnbPhy> GetPhy() const;
 
     /**
-     * \param index SCC index
-     * \return a pointer to the physical layer of the SCC addressed by index.
+     * @param index SCC index
+     * @return a pointer to the physical layer of the SCC addressed by index.
      */
     Ptr<LteEnbPhy> GetPhy(uint8_t index) const;
 
     /**
-     * \return a pointer to the Radio Resource Control instance of the eNB
+     * @return a pointer to the Radio Resource Control instance of the eNB
      */
     Ptr<LteEnbRrc> GetRrc() const;
 
     /**
-     * \return a pointer to the ComponentCarrierManager instance of the eNB
+     * @return a pointer to the ComponentCarrierManager instance of the eNB
      */
     Ptr<LteEnbComponentCarrierManager> GetComponentCarrierManager() const;
 
     /**
-     * \return the Cell Identifier of this eNB
+     * @return the Cell Identifier of this eNB
      */
     uint16_t GetCellId() const;
 
     /**
-     * \return the identifiers of cells served by this eNB
+     * @return the identifiers of cells served by this eNB
      */
     std::vector<uint16_t> GetCellIds() const;
 
     /**
-     * \param cellId cell ID
-     * \return true if cellId is served by this eNB
+     * @param cellId cell ID
+     * @return true if cellId is served by this eNB
      */
     bool HasCellId(uint16_t cellId) const;
 
     /**
-     * \return the uplink bandwidth in RBs
+     * @return the uplink bandwidth in RBs
      */
     uint16_t GetUlBandwidth() const;
 
     /**
-     * \param bw the uplink bandwidth in RBs
+     * @param bw the uplink bandwidth in RBs
      */
     void SetUlBandwidth(uint16_t bw);
 
     /**
-     * \return the downlink bandwidth in RBs
+     * @return the downlink bandwidth in RBs
      */
     uint16_t GetDlBandwidth() const;
 
     /**
-     * \param bw the downlink bandwidth in RBs
+     * @param bw the downlink bandwidth in RBs
      */
     void SetDlBandwidth(uint16_t bw);
 
     /**
-     * \return the downlink carrier frequency (EARFCN)
+     * @return the downlink carrier frequency (EARFCN)
      */
     uint32_t GetDlEarfcn() const;
 
     /**
-     * \param earfcn the downlink carrier frequency (EARFCN)
+     * @param earfcn the downlink carrier frequency (EARFCN)
      */
     void SetDlEarfcn(uint32_t earfcn);
 
     /**
-     * \return the uplink carrier frequency (EARFCN)
+     * @return the uplink carrier frequency (EARFCN)
      */
     uint32_t GetUlEarfcn() const;
 
     /**
-     * \param earfcn the uplink carrier frequency (EARFCN)
+     * @param earfcn the uplink carrier frequency (EARFCN)
      */
     void SetUlEarfcn(uint32_t earfcn);
 
     /**
-     * \brief Returns the CSG ID of the eNodeB.
-     * \return the Closed Subscriber Group identity
+     * @brief Returns the CSG ID of the eNodeB.
+     * @return the Closed Subscriber Group identity
      * \sa LteEnbNetDevice::SetCsgId
      */
     uint32_t GetCsgId() const;
 
     /**
-     * \brief Associate the eNodeB device with a particular CSG.
-     * \param csgId the intended Closed Subscriber Group identity
+     * @brief Associate the eNodeB device with a particular CSG.
+     * @param csgId the intended Closed Subscriber Group identity
      *
      * CSG identity is a number identifying a Closed Subscriber Group which the
      * cell belongs to. eNodeB is associated with a single CSG identity.
@@ -171,15 +171,15 @@
     void SetCsgId(uint32_t csgId);
 
     /**
-     * \brief Returns the CSG indication flag of the eNodeB.
-     * \return the CSG indication flag
+     * @brief Returns the CSG indication flag of the eNodeB.
+     * @return the CSG indication flag
      * \sa LteEnbNetDevice::SetCsgIndication
      */
     bool GetCsgIndication() const;
 
     /**
-     * \brief Enable or disable the CSG indication flag.
-     * \param csgIndication if TRUE, only CSG members are allowed to access this
+     * @brief Enable or disable the CSG indication flag.
+     * @param csgIndication if TRUE, only CSG members are allowed to access this
      *                      cell
      *
      * When the CSG indication field is set to TRUE, only UEs which are members of
@@ -187,7 +187,7 @@
      * enforcing closed access mode. Otherwise, the eNodeB operates as a non-CSG
      * cell and implements open access mode.
      *
-     * \note This restriction only applies to initial cell selection and
+     * @note This restriction only applies to initial cell selection and
      *       EPC-enabled simulation.
      *
      * \sa LteEnbNetDevice::SetCsgIndication
@@ -195,15 +195,15 @@
     void SetCsgIndication(bool csgIndication);
 
     /**
-     * \brief Set the ComponentCarrier Map of the Enb
-     * \param ccm the map of ComponentCarrierEnb
+     * @brief Set the ComponentCarrier Map of the Enb
+     * @param ccm the map of ComponentCarrierEnb
      *
      */
 
     void SetCcMap(std::map<uint8_t, Ptr<ComponentCarrierBaseStation>> ccm);
 
     /**
-     * \returns  The Component Carrier Map of the Enb.
+     * @returns  The Component Carrier Map of the Enb.
      *
      */
 
@@ -218,7 +218,7 @@
     bool m_isConfigured;  ///< is configured?
 
     /**
-     * \brief Propagate attributes and configuration to sub-modules.
+     * @brief Propagate attributes and configuration to sub-modules.
      *
      * Several attributes (e.g., the bandwidth) are exported as the attributes of
      * the LteEnbNetDevice from a user perspective, but are actually used also in
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-enb-phy.cc ns-3.44/src/lte/model/lte-enb-phy.cc
--- ns-3.43/src/lte/model/lte-enb-phy.cc	2024-10-09 16:41:10.036656400 -0700
+++ ns-3.44/src/lte/model/lte-enb-phy.cc	2025-03-09 16:55:49.599372000 -0700
@@ -15,19 +15,19 @@
 #include "lte-spectrum-value-helper.h"
 #include "lte-vendor-specific-parameters.h"
 
-#include <ns3/attribute-accessor-helper.h>
-#include <ns3/double.h>
-#include <ns3/log.h>
-#include <ns3/object-factory.h>
-#include <ns3/simulator.h>
+#include "ns3/attribute-accessor-helper.h"
+#include "ns3/double.h"
+#include "ns3/log.h"
+#include "ns3/object-factory.h"
+#include "ns3/simulator.h"
 
 #include <cfloat>
 #include <cmath>
 
 // WILD HACK for the initialization of direct eNB-UE ctrl messaging
-#include <ns3/node-list.h>
-#include <ns3/node.h>
-#include <ns3/pointer.h>
+#include "ns3/node-list.h"
+#include "ns3/node.h"
+#include "ns3/pointer.h"
 
 namespace ns3
 {
@@ -55,14 +55,14 @@
 // member SAP forwarders
 ////////////////////////////////////////
 
-/// \todo SetBandwidth() and SetCellId() can be removed.
+/// @todo SetBandwidth() and SetCellId() can be removed.
 class EnbMemberLteEnbPhySapProvider : public LteEnbPhySapProvider
 {
   public:
     /**
      * Constructor
      *
-     * \param phy the ENB Phy
+     * @param phy the ENB Phy
      */
     EnbMemberLteEnbPhySapProvider(LteEnbPhy* phy);
 
@@ -73,14 +73,14 @@
     /**
      * Set bandwidth function
      *
-     * \param ulBandwidth the UL bandwidth
-     * \param dlBandwidth the DL bandwidth
+     * @param ulBandwidth the UL bandwidth
+     * @param dlBandwidth the DL bandwidth
      */
     virtual void SetBandwidth(uint16_t ulBandwidth, uint16_t dlBandwidth);
     /**
      * Set Cell ID function
      *
-     * \param cellId the cell ID
+     * @param cellId the cell ID
      */
     virtual void SetCellId(uint16_t cellId);
 
@@ -140,7 +140,7 @@
       m_nrFrames(0),
       m_nrSubFrames(0),
       m_srsPeriodicity(0),
-      m_srsStartTime(Seconds(0)),
+      m_srsStartTime(),
       m_currentSrsOffset(0),
       m_interferenceSampleCounter(0)
 {
@@ -760,6 +760,7 @@
     NS_LOG_FUNCTION(this << " eNB " << m_cellId << " start tx ctrl frame");
     // set the current tx power spectral density (full bandwidth)
     std::vector<int> dlRb;
+    dlRb.reserve(m_dlBandwidth);
     for (uint16_t i = 0; i < m_dlBandwidth; i++)
     {
         dlRb.push_back(i);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-enb-phy.h ns-3.44/src/lte/model/lte-enb-phy.h
--- ns-3.43/src/lte/model/lte-enb-phy.h	2024-10-09 16:41:10.036656400 -0700
+++ ns-3.44/src/lte/model/lte-enb-phy.h	2025-03-09 16:55:49.599372000 -0700
@@ -27,7 +27,7 @@
 class LteUePhy;
 
 /**
- * \ingroup lte
+ * @ingroup lte
  * LteEnbPhy models the physical layer for the eNodeB
  */
 class LteEnbPhy : public LtePhy
@@ -45,16 +45,16 @@
 
     /**
      *
-     * \param dlPhy the downlink LteSpectrumPhy instance
-     * \param ulPhy the uplink LteSpectrumPhy instance
+     * @param dlPhy the downlink LteSpectrumPhy instance
+     * @param ulPhy the uplink LteSpectrumPhy instance
      */
     LteEnbPhy(Ptr<LteSpectrumPhy> dlPhy, Ptr<LteSpectrumPhy> ulPhy);
 
     ~LteEnbPhy() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     // inherited from Object
@@ -62,79 +62,79 @@
     void DoDispose() override;
 
     /**
-     * \brief Get the PHY SAP provider
-     * \return a pointer to the SAP Provider of the PHY
+     * @brief Get the PHY SAP provider
+     * @return a pointer to the SAP Provider of the PHY
      */
     LteEnbPhySapProvider* GetLteEnbPhySapProvider();
 
     /**
-     * \brief Set the PHY SAP User
-     * \param s a pointer to the PHY SAP user
+     * @brief Set the PHY SAP User
+     * @param s a pointer to the PHY SAP user
      */
     void SetLteEnbPhySapUser(LteEnbPhySapUser* s);
 
     /**
-     * \brief Get the CPHY SAP provider
-     * \return a pointer to the SAP Provider
+     * @brief Get the CPHY SAP provider
+     * @return a pointer to the SAP Provider
      */
     LteEnbCphySapProvider* GetLteEnbCphySapProvider();
 
     /**
-     * \brief Set the CPHY SAP User
-     * \param s a pointer to the SAP user
+     * @brief Set the CPHY SAP User
+     * @param s a pointer to the SAP user
      */
     void SetLteEnbCphySapUser(LteEnbCphySapUser* s);
 
     /**
-     * \param pow the transmission power in dBm
+     * @param pow the transmission power in dBm
      */
     void SetTxPower(double pow);
 
     /**
-     * \return the transmission power in dBm
+     * @return the transmission power in dBm
      */
     double GetTxPower() const;
 
     /**
-     * \return the transmission power in dBm
+     * @return the transmission power in dBm
      */
     int8_t DoGetReferenceSignalPower() const;
 
     /**
-     * \param pow the noise figure in dB
+     * @param pow the noise figure in dB
      */
     void SetNoiseFigure(double pow);
 
     /**
-     * \return the noise figure in dB
+     * @return the noise figure in dB
      */
     double GetNoiseFigure() const;
 
     /**
-     * \param delay the TTI delay between MAC and channel
+     * @param delay the TTI delay between MAC and channel
      */
     void SetMacChDelay(uint8_t delay);
 
     /**
-     * \returns the TTI delay between MAC and channel
+     * @returns the TTI delay between MAC and channel
      */
     uint8_t GetMacChDelay() const;
 
     /**
-     * \return a pointer to the LteSpectrumPhy instance relative to the downlink
+     * @return a pointer to the LteSpectrumPhy instance relative to the downlink
      */
     Ptr<LteSpectrumPhy> GetDlSpectrumPhy() const;
 
     /**
-     * \return a pointer to the LteSpectrumPhy instance relative to the uplink
+     * @return a pointer to the LteSpectrumPhy instance relative to the uplink
      */
     Ptr<LteSpectrumPhy> GetUlSpectrumPhy() const;
 
     /**
-     * \brief set the resource blocks (a.k.a. sub channels) to be used in the downlink for
+     * @brief set the resource blocks (a.k.a. sub channels) to be used in the downlink for
      * transmission
      *
-     * \param mask a vector of integers, if the i-th value is j it means
+     * @param mask a vector of integers, if the i-th value is j it means
      * that the j-th resource block is used for transmission in the
      * downlink. If there is no i such that the value of the i-th
      * element is j, it means that RB j is not used.
@@ -142,10 +142,10 @@
     void SetDownlinkSubChannels(std::vector<int> mask);
 
     /**
-     * \brief set the resource blocks (a.k.a. sub channels) and its power
+     * @brief set the resource blocks (a.k.a. sub channels) and its power
      * to be used in the downlink for transmission
      *
-     * \param mask a vector of integers, if the i-th value is j it means
+     * @param mask a vector of integers, if the i-th value is j it means
      * that the j-th resource block is used for transmission in the
      * downlink. If there is no i such that the value of the i-th
      * element is j, it means that RB j is not used.
@@ -153,7 +153,7 @@
     void SetDownlinkSubChannelsWithPowerAllocation(std::vector<int> mask);
     /**
      *
-     * \return  a vector of integers, if the i-th value is j it means
+     * @return  a vector of integers, if the i-th value is j it means
      * that the j-th resource block is used for transmission in the
      * downlink. If there is no i such that the value of the i-th
      * element is j, it means that RB j is not used.
@@ -161,105 +161,105 @@
     std::vector<int> GetDownlinkSubChannels();
 
     /**
-     * \brief Generate power allocation map (i.e. tx power level for each RB)
+     * @brief Generate power allocation map (i.e. tx power level for each RB)
      *
-     * \param rnti indicates which UE will occupy this RB
-     * \param rbId indicates which RB UE is using,
+     * @param rnti indicates which UE will occupy this RB
+     * @param rbId indicates which RB UE is using,
      * power level for this RB is power level of UE
      */
     void GeneratePowerAllocationMap(uint16_t rnti, int rbId);
 
     /**
-     * \brief Create the PSD for TX
-     * \returns the PSD
+     * @brief Create the PSD for TX
+     * @returns the PSD
      */
     Ptr<SpectrumValue> CreateTxPowerSpectralDensity() override;
 
     /**
-     * \brief Create the PSD for TX with power allocation for each RB
-     * \return the PSD
+     * @brief Create the PSD for TX with power allocation for each RB
+     * @return the PSD
      */
     virtual Ptr<SpectrumValue> CreateTxPowerSpectralDensityWithPowerAllocation();
 
     /**
-     * \brief Calculate the channel quality for a given UE
-     * \param sinr a list of computed SINR
-     * \param ue the UE
+     * @brief Calculate the channel quality for a given UE
+     * @param sinr a list of computed SINR
+     * @param ue the UE
      */
     void CalcChannelQualityForUe(std::vector<double> sinr, Ptr<LteSpectrumPhy> ue);
 
     /**
-     * \brief Receive the control message
-     * \param msg the received message
+     * @brief Receive the control message
+     * @param msg the received message
      */
     virtual void ReceiveLteControlMessage(Ptr<LteControlMessage> msg);
 
     /**
-     * \brief Create the UL CQI feedback from SINR values perceived at
+     * @brief Create the UL CQI feedback from SINR values perceived at
      * the physical layer with the PUSCH signal received from eNB
-     * \param sinr SINR values vector
-     * \return UL CQI feedback in the format usable by an FF MAC scheduler
+     * @param sinr SINR values vector
+     * @return UL CQI feedback in the format usable by an FF MAC scheduler
      */
     FfMacSchedSapProvider::SchedUlCqiInfoReqParameters CreatePuschCqiReport(
         const SpectrumValue& sinr);
 
     /**
-     * \brief Create the UL CQI feedback from SINR values perceived at
+     * @brief Create the UL CQI feedback from SINR values perceived at
      * the physical layer with the SRS signal received from eNB
-     * \param sinr SINR values vector
-     * \return UL CQI feedback in the format usable by an FF MAC scheduler
+     * @param sinr SINR values vector
+     * @return UL CQI feedback in the format usable by an FF MAC scheduler
      */
     FfMacSchedSapProvider::SchedUlCqiInfoReqParameters CreateSrsCqiReport(
         const SpectrumValue& sinr);
 
     /**
-     * \brief Send the PDCCH and PCFICH in the first 3 symbols
-     * \param ctrlMsgList the list of control messages of PDCCH
+     * @brief Send the PDCCH and PCFICH in the first 3 symbols
+     * @param ctrlMsgList the list of control messages of PDCCH
      */
     void SendControlChannels(std::list<Ptr<LteControlMessage>> ctrlMsgList);
 
     /**
-     * \brief Send the PDSCH
-     * \param pb the PacketBurst to be sent
+     * @brief Send the PDSCH
+     * @param pb the PacketBurst to be sent
      */
     void SendDataChannels(Ptr<PacketBurst> pb);
 
     /**
-     * \param m the UL-CQI to be queued
+     * @param m the UL-CQI to be queued
      */
     void QueueUlDci(UlDciLteControlMessage m);
 
     /**
-     * \returns the list of UL-CQI to be processed
+     * @returns the list of UL-CQI to be processed
      */
     std::list<UlDciLteControlMessage> DequeueUlDci();
 
     /**
-     * \brief Start a LTE frame
+     * @brief Start a LTE frame
      */
     void StartFrame();
     /**
-     * \brief Start a LTE sub frame
+     * @brief Start a LTE sub frame
      */
     void StartSubFrame();
     /**
-     * \brief End a LTE sub frame
+     * @brief End a LTE sub frame
      */
     void EndSubFrame();
     /**
-     * \brief End a LTE frame
+     * @brief End a LTE frame
      */
     void EndFrame();
 
     /**
-     * \brief PhySpectrum received a new PHY-PDU
-     * \param p the packet received
+     * @brief PhySpectrum received a new PHY-PDU
+     * @param p the packet received
      */
     void PhyPduReceived(Ptr<Packet> p);
 
     /**
-     * \brief PhySpectrum received a new list of LteControlMessage
-     * \param msgList List of control messages
+     * @brief PhySpectrum received a new list of LteControlMessage
+     * @param msgList List of control messages
      */
     virtual void ReceiveLteControlMessageList(std::list<Ptr<LteControlMessage>> msgList);
 
@@ -270,25 +270,25 @@
     void ReportRsReceivedPower(const SpectrumValue& power) override;
 
     /**
-     * \brief Report the uplink HARQ feedback generated by LteSpectrumPhy to MAC
+     * @brief Report the uplink HARQ feedback generated by LteSpectrumPhy to MAC
      *
-     * \param mes UlInfoListElement_s
+     * @param mes UlInfoListElement_s
      */
     virtual void ReportUlHarqFeedback(UlInfoListElement_s mes);
 
     /**
-     * \brief Set the HARQ Phy module
+     * @brief Set the HARQ Phy module
      *
-     * \param harq the HARQ Phy
+     * @param harq the HARQ Phy
      */
     void SetHarqPhyModule(Ptr<LteHarqPhy> harq);
 
     /**
      * TracedCallback signature for the linear average of SRS SINRs.
      *
-     * \param [in] cellId
-     * \param [in] rnti
-     * \param [in] sinrLinear
+     * @param [in] cellId
+     * @param [in] rnti
+     * @param [in] sinrLinear
      */
     typedef void (*ReportUeSinrTracedCallback)(uint16_t cellId,
                                                uint16_t rnti,
@@ -298,9 +298,9 @@
     /**
      * TracedCallback signature for the linear average of SRS SINRs.
      *
-     * \param [in] cellId
-     * \param [in] spectrumValue
-     * \deprecated The non-const \c Ptr<SpectrumValue> argument is deprecated
+     * @param [in] cellId
+     * @param [in] spectrumValue
+     * @deprecated The non-const \c Ptr<SpectrumValue> argument is deprecated
      * and will be changed to \c Ptr<const SpectrumValue> in a future release.
      */
     // NS_DEPRECATED() - tag for future removal
@@ -312,60 +312,60 @@
     /**
      * Set bandwidth function
      *
-     * \param ulBandwidth UL bandwidth
-     * \param dlBandwidth DL bandwidth
+     * @param ulBandwidth UL bandwidth
+     * @param dlBandwidth DL bandwidth
      */
     void DoSetBandwidth(uint16_t ulBandwidth, uint16_t dlBandwidth);
     /**
      * Set EARFCN
      *
-     * \param dlEarfcn DL EARFCN
-     * \param ulEarfcn UL EARFCN
+     * @param dlEarfcn DL EARFCN
+     * @param ulEarfcn UL EARFCN
      */
     void DoSetEarfcn(uint32_t dlEarfcn, uint32_t ulEarfcn);
     /**
      * Add UE
      *
-     * \param rnti RNTI
+     * @param rnti RNTI
      */
     void DoAddUe(uint16_t rnti);
     /**
      * Remove UE
      *
-     * \param rnti RNTI
+     * @param rnti RNTI
      */
     void DoRemoveUe(uint16_t rnti);
     /**
      * Set PA
      *
-     * \param rnti RNTI
-     * \param pa PA
+     * @param rnti RNTI
+     * @param pa PA
      */
     void DoSetPa(uint16_t rnti, double pa);
     /**
      * Set transmission mode
      *
-     * \param rnti RNTI
-     * \param txMode transmit mode
+     * @param rnti RNTI
+     * @param txMode transmit mode
      */
     void DoSetTransmissionMode(uint16_t rnti, uint8_t txMode);
     /**
      * Set source configuration index
      *
-     * \param rnti RNTI
-     * \param srcCi source configuration index
+     * @param rnti RNTI
+     * @param srcCi source configuration index
      */
     void DoSetSrsConfigurationIndex(uint16_t rnti, uint16_t srcCi);
     /**
      * Set master information block
      *
-     * \param mib LteRrcSap::MasterInformationBlock
+     * @param mib LteRrcSap::MasterInformationBlock
      */
     void DoSetMasterInformationBlock(LteRrcSap::MasterInformationBlock mib);
     /**
      * Set system information block
      *
-     * \param sib1 LteRrcSap::SystemInformationBlockType1
+     * @param sib1 LteRrcSap::SystemInformationBlockType1
      */
     void DoSetSystemInformationBlockType1(LteRrcSap::SystemInformationBlockType1 sib1);
 
@@ -374,34 +374,34 @@
     /**
      * Send LTE Control Message function
      *
-     * \param msg LTE control message
+     * @param msg LTE control message
      */
     void DoSendLteControlMessage(Ptr<LteControlMessage> msg);
     /**
      * Get MAC ch TTI delay function
      *
-     * \returns delay value
+     * @returns delay value
      */
     uint8_t DoGetMacChTtiDelay();
 
     /**
      * Add the given RNTI to the list of attached UE #m_ueAttached.
-     * \param rnti RNTI of a UE
-     * \return true if the RNTI has _not_ existed before, or false otherwise.
+     * @param rnti RNTI of a UE
+     * @return true if the RNTI has _not_ existed before, or false otherwise.
      */
     bool AddUePhy(uint16_t rnti);
     /**
      * Remove the given RNTI from the list of attached UE #m_ueAttached.
-     * \param rnti RNTI of a UE
-     * \return true if the RNTI has existed before, or false otherwise.
+     * @param rnti RNTI of a UE
+     * @return true if the RNTI has existed before, or false otherwise.
      */
     bool DeleteUePhy(uint16_t rnti);
 
     /**
      * Create SRS report function
      *
-     * \param rnti the RNTI
-     * \param srs the SRS
+     * @param rnti the RNTI
+     * @param srs the SRS
      */
     void CreateSrsReport(uint16_t rnti, double srs);
 
@@ -484,7 +484,7 @@
      * The `ReportInterference` trace source. Reporting the interference per PHY
      * RB (TS 36.214 section 5.2.2, measured on DATA). Exporting cell ID and
      * interference linear power per RB basis.
-     * \deprecated The non-const \c Ptr<SpectrumValue> argument is deprecated
+     * @deprecated The non-const \c Ptr<SpectrumValue> argument is deprecated
      * and will be changed to \c Ptr<const SpectrumValue> in a future release.
      */
     // NS_DEPRECATED() - tag for future removal
@@ -492,7 +492,7 @@
     /**
      * The `InterferenceSamplePeriod` attribute. The sampling period for
      * reporting interference stats.
-     * \todo In what unit is this?
+     * @todo In what unit is this?
      */
     uint16_t m_interferenceSamplePeriod;
     uint16_t m_interferenceSampleCounter; ///< interference sample counter
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-enb-phy-sap.h ns-3.44/src/lte/model/lte-enb-phy-sap.h
--- ns-3.43/src/lte/model/lte-enb-phy-sap.h	2024-10-09 16:41:10.036656400 -0700
+++ ns-3.44/src/lte/model/lte-enb-phy-sap.h	2025-03-09 16:55:49.599372000 -0700
@@ -12,7 +12,7 @@
 #include "ff-mac-common.h"
 #include "ff-mac-sched-sap.h"
 
-#include <ns3/packet.h>
+#include "ns3/packet.h"
 
 namespace ns3
 {
@@ -31,20 +31,20 @@
     virtual ~LteEnbPhySapProvider();
 
     /**
-     * \brief Send the MAC PDU to the channel
-     * \param p the MAC PDU to send
+     * @brief Send the MAC PDU to the channel
+     * @param p the MAC PDU to send
      */
     virtual void SendMacPdu(Ptr<Packet> p) = 0;
 
     /**
-     * \brief Send SendLteControlMessage (PDCCH map, CQI feedbacks) using the ideal control channel
-     * \param msg the Ideal Control Message to send
+     * @brief Send SendLteControlMessage (PDCCH map, CQI feedbacks) using the ideal control channel
+     * @param msg the Ideal Control Message to send
      */
     virtual void SendLteControlMessage(Ptr<LteControlMessage> msg) = 0;
 
     /**
-     * \brief Get the delay from MAC to Channel expressed in TTIs
-     * \returns MAC channel TTI delay
+     * @brief Get the delay from MAC to Channel expressed in TTIs
+     * @returns MAC channel TTI delay
      */
     virtual uint8_t GetMacChTtiDelay() = 0;
 };
@@ -63,48 +63,48 @@
     /**
      * Called by the Phy to notify the MAC of the reception of a new PHY-PDU
      *
-     * \param p
+     * @param p
      */
     virtual void ReceivePhyPdu(Ptr<Packet> p) = 0;
 
     /**
-     * \brief Trigger the start from a new frame (input from Phy layer)
-     * \param frameNo frame number
-     * \param subframeNo subframe number
+     * @brief Trigger the start from a new frame (input from Phy layer)
+     * @param frameNo frame number
+     * @param subframeNo subframe number
      */
     virtual void SubframeIndication(uint32_t frameNo, uint32_t subframeNo) = 0;
 
     /**
-     * \brief Receive SendLteControlMessage (PDCCH map, CQI feedbacks) using the ideal control
+     * @brief Receive SendLteControlMessage (PDCCH map, CQI feedbacks) using the ideal control
      * channel
-     * \param msg the Ideal Control Message to receive
+     * @param msg the Ideal Control Message to receive
      */
     virtual void ReceiveLteControlMessage(Ptr<LteControlMessage> msg) = 0;
 
     /**
      * notify the reception of a RACH preamble on the PRACH
      *
-     * \param prachId the ID of the preamble
+     * @param prachId the ID of the preamble
      */
     virtual void ReceiveRachPreamble(uint32_t prachId) = 0;
 
     /**
-     * \brief Returns to MAC level the UL-CQI evaluated
-     * \param ulcqi the UL-CQI (see FF MAC API 4.3.29)
+     * @brief Returns to MAC level the UL-CQI evaluated
+     * @param ulcqi the UL-CQI (see FF MAC API 4.3.29)
      */
     virtual void UlCqiReport(FfMacSchedSapProvider::SchedUlCqiInfoReqParameters ulcqi) = 0;
 
     /**
      * Notify the HARQ on the UL transmission status
      *
-     * \param params
+     * @param params
      */
     virtual void UlInfoListElementHarqFeedback(UlInfoListElement_s params) = 0;
 
     /**
      * Notify the HARQ on the DL transmission status
      *
-     * \param params
+     * @param params
      */
     virtual void DlInfoListElementHarqFeedback(DlInfoListElement_s params) = 0;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-enb-rrc.cc ns-3.44/src/lte/model/lte-enb-rrc.cc
--- ns-3.43/src/lte/model/lte-enb-rrc.cc	2024-10-09 16:41:10.036656400 -0700
+++ ns-3.44/src/lte/model/lte-enb-rrc.cc	2025-03-09 16:55:49.599372000 -0700
@@ -25,14 +25,14 @@
 #include "lte-rlc-um.h"
 #include "lte-rlc.h"
 
-#include <ns3/abort.h>
-#include <ns3/fatal-error.h>
-#include <ns3/log.h>
-#include <ns3/object-factory.h>
-#include <ns3/object-map.h>
-#include <ns3/packet.h>
-#include <ns3/pointer.h>
-#include <ns3/simulator.h>
+#include "ns3/abort.h"
+#include "ns3/fatal-error.h"
+#include "ns3/log.h"
+#include "ns3/object-factory.h"
+#include "ns3/object-map.h"
+#include "ns3/packet.h"
+#include "ns3/pointer.h"
+#include "ns3/simulator.h"
 
 namespace ns3
 {
@@ -44,7 +44,7 @@
 ///////////////////////////////////////////
 
 /**
- * \brief Class for forwarding CMAC SAP User functions.
+ * @brief Class for forwarding CMAC SAP User functions.
  */
 class EnbRrcMemberLteEnbCmacSapUser : public LteEnbCmacSapUser
 {
@@ -52,8 +52,8 @@
     /**
      * Constructor
      *
-     * \param rrc ENB RRC
-     * \param componentCarrierId
+     * @param rrc ENB RRC
+     * @param componentCarrierId
      */
     EnbRrcMemberLteEnbCmacSapUser(LteEnbRrc* rrc, uint8_t componentCarrierId);
 
@@ -102,31 +102,6 @@
 // UeManager
 ///////////////////////////////////////////
 
-/// Map each of UE Manager states to its string representation.
-static const std::string g_ueManagerStateName[UeManager::NUM_STATES] = {
-    "INITIAL_RANDOM_ACCESS",
-    "CONNECTION_SETUP",
-    "CONNECTION_REJECTED",
-    "ATTACH_REQUEST",
-    "CONNECTED_NORMALLY",
-    "CONNECTION_RECONFIGURATION",
-    "CONNECTION_REESTABLISHMENT",
-    "HANDOVER_PREPARATION",
-    "HANDOVER_JOINING",
-    "HANDOVER_PATH_SWITCH",
-    "HANDOVER_LEAVING",
-};
-
-/**
- * \param s The UE manager state.
- * \return The string representation of the given state.
- */
-static const std::string&
-ToString(UeManager::State s)
-{
-    return g_ueManagerStateName[s];
-}
-
 NS_OBJECT_ENSURE_REGISTERED(UeManager);
 
 UeManager::UeManager()
@@ -296,7 +271,7 @@
         break;
 
     default:
-        NS_FATAL_ERROR("unexpected state " << ToString(m_state));
+        NS_FATAL_ERROR("unexpected state " << m_state);
         break;
     }
     m_caSupportConfigured = false;
@@ -381,7 +356,7 @@
     }
     else
     {
-        NS_FATAL_ERROR("method unexpected in state " << ToString(m_state));
+        NS_FATAL_ERROR("method unexpected in state " << m_state);
     }
 }
 
@@ -640,7 +615,7 @@
     break;
 
     default:
-        NS_FATAL_ERROR("method unexpected in state " << ToString(m_state));
+        NS_FATAL_ERROR("method unexpected in state " << m_state);
         break;
     }
 }
@@ -780,7 +755,7 @@
     break;
 
     default:
-        NS_FATAL_ERROR("method unexpected in state " << ToString(m_state));
+        NS_FATAL_ERROR("method unexpected in state " << m_state);
         break;
     }
 }
@@ -975,7 +950,7 @@
     break;
 
     default:
-        NS_FATAL_ERROR("method unexpected in state " << ToString(m_state));
+        NS_FATAL_ERROR("method unexpected in state " << m_state);
         break;
     }
 }
@@ -1027,7 +1002,7 @@
         break;
 
     default:
-        NS_FATAL_ERROR("method unexpected in state " << ToString(m_state));
+        NS_FATAL_ERROR("method unexpected in state " << m_state);
         break;
     }
 }
@@ -1051,7 +1026,7 @@
         break;
 
     default:
-        NS_FATAL_ERROR("method unexpected in state " << ToString(m_state));
+        NS_FATAL_ERROR("method unexpected in state " << m_state);
         break;
     }
 }
@@ -1078,7 +1053,7 @@
 UeManager::RecvUeContextRelease(EpcX2SapUser::UeContextReleaseParams params)
 {
     NS_LOG_FUNCTION(this);
-    NS_ASSERT_MSG(m_state == HANDOVER_LEAVING, "method unexpected in state " << ToString(m_state));
+    NS_ASSERT_MSG(m_state == HANDOVER_LEAVING, "method unexpected in state " << m_state);
     m_handoverLeavingTimeout.Cancel();
 }
 
@@ -1086,7 +1061,7 @@
 UeManager::RecvHandoverCancel(EpcX2SapUser::HandoverCancelParams params)
 {
     NS_LOG_FUNCTION(this);
-    NS_ASSERT_MSG(m_state == HANDOVER_JOINING, "method unexpected in state " << ToString(m_state));
+    NS_ASSERT_MSG(m_state == HANDOVER_JOINING, "method unexpected in state " << m_state);
     m_handoverJoiningTimeout.Cancel();
 }
 
@@ -1164,7 +1139,7 @@
     break;
 
     default:
-        NS_FATAL_ERROR("method unexpected in state " << ToString(m_state));
+        NS_FATAL_ERROR("method unexpected in state " << m_state);
         break;
     }
 }
@@ -1198,7 +1173,7 @@
         break;
 
     default:
-        NS_FATAL_ERROR("method unexpected in state " << ToString(m_state));
+        NS_FATAL_ERROR("method unexpected in state " << m_state);
         break;
     }
 }
@@ -1242,13 +1217,11 @@
     // This case is added to NS-3 in order to handle bearer de-activation scenario for CONNECTED
     // state UE
     case CONNECTED_NORMALLY:
-        NS_LOG_INFO("ignoring RecvRrcConnectionReconfigurationCompleted in state "
-                    << ToString(m_state));
+        NS_LOG_INFO("ignoring RecvRrcConnectionReconfigurationCompleted in state " << m_state);
         break;
 
     case HANDOVER_LEAVING:
-        NS_LOG_INFO("ignoring RecvRrcConnectionReconfigurationCompleted in state "
-                    << ToString(m_state));
+        NS_LOG_INFO("ignoring RecvRrcConnectionReconfigurationCompleted in state " << m_state);
         break;
 
     case HANDOVER_JOINING: {
@@ -1285,7 +1258,7 @@
     break;
 
     default:
-        NS_FATAL_ERROR("method unexpected in state " << ToString(m_state));
+        NS_FATAL_ERROR("method unexpected in state " << m_state);
         break;
     }
 }
@@ -1305,7 +1278,7 @@
         break;
 
     default:
-        NS_FATAL_ERROR("method unexpected in state " << ToString(m_state));
+        NS_FATAL_ERROR("method unexpected in state " << m_state);
         break;
     }
 
@@ -1685,11 +1658,11 @@
 void
 UeManager::SwitchToState(State newState)
 {
-    NS_LOG_FUNCTION(this << ToString(newState));
+    NS_LOG_FUNCTION(this << newState);
     State oldState = m_state;
     m_state = newState;
-    NS_LOG_INFO(this << " IMSI " << m_imsi << " RNTI " << m_rnti << " UeManager "
-                     << ToString(oldState) << " --> " << ToString(newState));
+    NS_LOG_INFO(this << " IMSI " << m_imsi << " RNTI " << m_rnti << " UeManager " << oldState
+                     << " --> " << newState);
     m_stateTransitionTrace(m_imsi,
                            m_rrc->ComponentCarrierToCellId(m_componentCarrierId),
                            m_rnti,
@@ -2344,7 +2317,7 @@
             m_ueMeasConfig.reportConfigToAddModList.size() * m_numberOfComponentCarriers,
         "Measurement identities and reporting configuration should not have different quantity");
 
-    if (Simulator::Now() != Seconds(0))
+    if (!Simulator::Now().IsZero())
     {
         NS_FATAL_ERROR("AddUeMeasReportConfig may not be called after the simulation has run");
     }
@@ -2608,7 +2581,7 @@
     NS_LOG_FUNCTION(this << rnti);
     NS_ASSERT_MSG(GetUeManager(rnti)->GetState() == UeManager::INITIAL_RANDOM_ACCESS,
                   "ConnectionRequestTimeout in unexpected state "
-                      << ToString(GetUeManager(rnti)->GetState()));
+                      << GetUeManager(rnti)->GetState());
     m_rrcTimeoutTrace(GetUeManager(rnti)->GetImsi(),
                       rnti,
                       ComponentCarrierToCellId(GetUeManager(rnti)->GetComponentCarrierId()),
@@ -2621,8 +2594,7 @@
 {
     NS_LOG_FUNCTION(this << rnti);
     NS_ASSERT_MSG(GetUeManager(rnti)->GetState() == UeManager::CONNECTION_SETUP,
-                  "ConnectionSetupTimeout in unexpected state "
-                      << ToString(GetUeManager(rnti)->GetState()));
+                  "ConnectionSetupTimeout in unexpected state " << GetUeManager(rnti)->GetState());
     m_rrcTimeoutTrace(GetUeManager(rnti)->GetImsi(),
                       rnti,
                       ComponentCarrierToCellId(GetUeManager(rnti)->GetComponentCarrierId()),
@@ -2636,7 +2608,7 @@
     NS_LOG_FUNCTION(this << rnti);
     NS_ASSERT_MSG(GetUeManager(rnti)->GetState() == UeManager::CONNECTION_REJECTED,
                   "ConnectionRejectedTimeout in unexpected state "
-                      << ToString(GetUeManager(rnti)->GetState()));
+                      << GetUeManager(rnti)->GetState());
     m_rrcTimeoutTrace(GetUeManager(rnti)->GetImsi(),
                       rnti,
                       ComponentCarrierToCellId(GetUeManager(rnti)->GetComponentCarrierId()),
@@ -2649,8 +2621,7 @@
 {
     NS_LOG_FUNCTION(this << rnti);
     NS_ASSERT_MSG(GetUeManager(rnti)->GetState() == UeManager::HANDOVER_JOINING,
-                  "HandoverJoiningTimeout in unexpected state "
-                      << ToString(GetUeManager(rnti)->GetState()));
+                  "HandoverJoiningTimeout in unexpected state " << GetUeManager(rnti)->GetState());
     m_handoverFailureJoiningTrace(
         GetUeManager(rnti)->GetImsi(),
         rnti,
@@ -2677,8 +2648,7 @@
 {
     NS_LOG_FUNCTION(this << rnti);
     NS_ASSERT_MSG(GetUeManager(rnti)->GetState() == UeManager::HANDOVER_LEAVING,
-                  "HandoverLeavingTimeout in unexpected state "
-                      << ToString(GetUeManager(rnti)->GetState()));
+                  "HandoverLeavingTimeout in unexpected state " << GetUeManager(rnti)->GetState());
     m_handoverFailureLeavingTrace(
         GetUeManager(rnti)->GetImsi(),
         rnti,
@@ -3166,8 +3136,7 @@
     {
         isHandoverAllowed = false;
         NS_LOG_LOGIC(this << " handover is not allowed because the UE"
-                          << " rnti=" << rnti << " is in " << ToString(ueManager->GetState())
-                          << " state");
+                          << " rnti=" << rnti << " is in " << ueManager->GetState() << " state");
     }
 
     if (isHandoverAllowed)
@@ -3525,4 +3494,37 @@
     }
 }
 
+std::ostream&
+operator<<(std::ostream& os, UeManager::State state)
+{
+    switch (state)
+    {
+    case UeManager::State::INITIAL_RANDOM_ACCESS:
+        return os << "INITIAL_RANDOM_ACCESS";
+    case UeManager::State::CONNECTION_SETUP:
+        return os << "CONNECTION_SETUP";
+    case UeManager::State::CONNECTION_REJECTED:
+        return os << "CONNECTION_REJECTED";
+    case UeManager::State::ATTACH_REQUEST:
+        return os << "ATTACH_REQUEST";
+    case UeManager::State::CONNECTED_NORMALLY:
+        return os << "CONNECTED_NORMALLY";
+    case UeManager::State::CONNECTION_RECONFIGURATION:
+        return os << "CONNECTION_RECONFIGURATION";
+    case UeManager::State::CONNECTION_REESTABLISHMENT:
+        return os << "CONNECTION_REESTABLISHMENT";
+    case UeManager::State::HANDOVER_PREPARATION:
+        return os << "HANDOVER_PREPARATION";
+    case UeManager::State::HANDOVER_JOINING:
+        return os << "HANDOVER_JOINING";
+    case UeManager::State::HANDOVER_PATH_SWITCH:
+        return os << "HANDOVER_PATH_SWITCH";
+    case UeManager::State::HANDOVER_LEAVING:
+        return os << "HANDOVER_LEAVING";
+    case UeManager::State::NUM_STATES:
+        return os << "NUM_STATES";
+    };
+    return os << "UNKNOWN(" << static_cast<uint32_t>(state) << ")";
+}
+
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-enb-rrc.h ns-3.44/src/lte/model/lte-enb-rrc.h
--- ns-3.43/src/lte/model/lte-enb-rrc.h	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-enb-rrc.h	2025-03-09 16:55:49.599372000 -0700
@@ -30,10 +30,10 @@
 #include "lte-pdcp-sap.h"
 #include "lte-rrc-sap.h"
 
-#include <ns3/event-id.h>
-#include <ns3/nstime.h>
-#include <ns3/object.h>
-#include <ns3/traced-callback.h>
+#include "ns3/event-id.h"
+#include "ns3/nstime.h"
+#include "ns3/object.h"
+#include "ns3/traced-callback.h"
 
 #include <map>
 #include <set>
@@ -49,7 +49,7 @@
 class Packet;
 
 /**
- * \ingroup lte
+ * @ingroup lte
  * Manages all the radio bearer information possessed by the ENB RRC for a
  * single UE.
  */
@@ -84,10 +84,10 @@
     /**
      * UeManager constructor
      *
-     * \param rrc pointer to the LteEnbRrc holding this UeManager
-     * \param rnti RNTI of the UE
-     * \param s initial state of the UeManager
-     * \param componentCarrierId primary component carrier ID
+     * @param rrc pointer to the LteEnbRrc holding this UeManager
+     * @param rnti RNTI of the UE
+     * @param s initial state of the UeManager
+     * @param componentCarrierId primary component carrier ID
      */
     UeManager(Ptr<LteEnbRrc> rrc, uint16_t rnti, State s, uint8_t componentCarrierId);
 
@@ -100,8 +100,8 @@
 
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -109,15 +109,15 @@
      * Set the identifiers of the source eNB for the case where a UE
      * joins the current eNB as part of a handover procedure
      *
-     * \param sourceCellId
-     * \param sourceX2apId
+     * @param sourceCellId
+     * @param sourceX2apId
      */
     void SetSource(uint16_t sourceCellId, uint16_t sourceX2apId);
 
     /**
      * Set the IMSI
      *
-     * \param imsi the IMSI
+     * @param imsi the IMSI
      */
     void SetImsi(uint64_t imsi);
 
@@ -131,10 +131,10 @@
      * Setup a new data radio bearer, including both the configuration
      * within the eNB and the necessary RRC signaling with the UE
      *
-     * \param bearer the QoS characteristics of the bearer
-     * \param bearerId the EPS bearer identifier
-     * \param gtpTeid S1-bearer GTP tunnel endpoint identifier, see 36.423 9.2.1
-     * \param transportLayerAddress  IP Address of the SGW, see 36.423 9.2.1
+     * @param bearer the QoS characteristics of the bearer
+     * @param bearerId the EPS bearer identifier
+     * @param gtpTeid S1-bearer GTP tunnel endpoint identifier, see 36.423 9.2.1
+     * @param transportLayerAddress  IP Address of the SGW, see 36.423 9.2.1
      *
      */
     void SetupDataRadioBearer(EpsBearer bearer,
@@ -160,7 +160,7 @@
      *
      * Release a given radio bearer
      *
-     * \param drbid the data radio bearer id of the bearer to be released
+     * @param drbid the data radio bearer id of the bearer to be released
      */
     void ReleaseDataRadioBearer(uint8_t drbid);
 
@@ -173,32 +173,32 @@
     /**
      * Start the handover preparation and send the handover request
      *
-     * \param cellId id of the target cell
+     * @param cellId id of the target cell
      */
     void PrepareHandover(uint16_t cellId);
 
     /**
      * take the necessary actions in response to the reception of an X2 HANDOVER REQUEST ACK message
      *
-     * \param params
+     * @param params
      */
     void RecvHandoverRequestAck(EpcX2SapUser::HandoverRequestAckParams params);
 
     /**
      *
-     * \return the HandoverPreparationInfo sent by the source eNB to the
+     * @return the HandoverPreparationInfo sent by the source eNB to the
      * target eNB in the X2-based handover procedure
      */
     LteRrcSap::RadioResourceConfigDedicated GetRadioResourceConfigForHandoverPreparationInfo();
 
     /**
-     * \param componentCarrierId target component carrier ID
+     * @param componentCarrierId target component carrier ID
      *
-     * \return retrieve the data that the target eNB needs to send to the source
+     * @return retrieve the data that the target eNB needs to send to the source
      * eNB as the Handover Command in the X2-based handover
      * procedure.
      *
-     * \note mobility control info is not expected to be filled in
+     * @note mobility control info is not expected to be filled in
      * (shall be filled in by the caller).
      */
     LteRrcSap::RrcConnectionReconfiguration GetRrcConnectionReconfigurationForHandover(
@@ -212,14 +212,14 @@
      * RRC Connection Reconfiguration, the packet is sent through the
      * X2 interface.
      *
-     * \param bid the corresponding EPS Bearer ID
-     * \param p the packet
+     * @param bid the corresponding EPS Bearer ID
+     * @param p the packet
      */
     void SendData(uint8_t bid, Ptr<Packet> p);
 
     /**
      *
-     * \return a list of ERAB-to-be-setup items to be put in a X2 HO REQ message
+     * @return a list of ERAB-to-be-setup items to be put in a X2 HO REQ message
      */
     std::vector<EpcX2Sap::ErabToBeSetupItem> GetErabList();
 
@@ -234,28 +234,28 @@
      * Take the necessary actions in response to the reception of an X2 HO preparation failure
      * message
      *
-     * \param cellId id of the target cell
+     * @param cellId id of the target cell
      */
     void RecvHandoverPreparationFailure(uint16_t cellId);
 
     /**
      * Take the necessary actions in response to the reception of an X2 SN STATUS TRANSFER message
      *
-     * \param params the SN STATUS
+     * @param params the SN STATUS
      */
     void RecvSnStatusTransfer(EpcX2SapUser::SnStatusTransferParams params);
 
     /**
      * Take the necessary actions in response to the reception of an X2 UE CONTEXT RELEASE message
      *
-     * \param params the SN STATUS
+     * @param params the SN STATUS
      */
     void RecvUeContextRelease(EpcX2SapUser::UeContextReleaseParams params);
 
     /**
      * Take the necessary actions in response to the reception of an X2 UE CONTEXT RELEASE message
      *
-     * \param params the SN STATUS
+     * @param params the SN STATUS
      */
     void RecvHandoverCancel(EpcX2SapUser::HandoverCancelParams params);
 
@@ -263,46 +263,46 @@
 
     /**
      * Implement the LteEnbRrcSapProvider::CompleteSetupUe interface.
-     * \param params CompleteSetupUeParameters
+     * @param params CompleteSetupUeParameters
      */
     void CompleteSetupUe(LteEnbRrcSapProvider::CompleteSetupUeParameters params);
     /**
      * Implement the LteEnbRrcSapProvider::RecvRrcConnectionRequest interface.
-     * \param msg the RRC connection request message
+     * @param msg the RRC connection request message
      */
     void RecvRrcConnectionRequest(LteRrcSap::RrcConnectionRequest msg);
     /**
      * Implement the LteEnbRrcSapProvider::RecvRrcConnectionSetupCompleted interface.
-     * \param msg RRC connection setup completed message
+     * @param msg RRC connection setup completed message
      */
     void RecvRrcConnectionSetupCompleted(LteRrcSap::RrcConnectionSetupCompleted msg);
     /**
      * Implement the LteEnbRrcSapProvider::RecvRrcConnectionReconfigurationCompleted interface.
-     * \param msg RRC connection reconfiguration completed message
+     * @param msg RRC connection reconfiguration completed message
      */
     void RecvRrcConnectionReconfigurationCompleted(
         LteRrcSap::RrcConnectionReconfigurationCompleted msg);
     /**
      * Implement the LteEnbRrcSapProvider::RecvRrcConnectionReestablishmentRequest interface.
-     * \param msg the RRC connection reestablishment request message
+     * @param msg the RRC connection reestablishment request message
      */
     void RecvRrcConnectionReestablishmentRequest(
         LteRrcSap::RrcConnectionReestablishmentRequest msg);
     /**
      * Implement the LteEnbRrcSapProvider::RecvRrcConnectionReestablishmentComplete interface.
-     * \param msg the RRC connection reestablsihment complete message
+     * @param msg the RRC connection reestablsihment complete message
      */
     void RecvRrcConnectionReestablishmentComplete(
         LteRrcSap::RrcConnectionReestablishmentComplete msg);
     /**
      * Implement the LteEnbRrcSapProvider::RecvMeasurementReport interface.
-     * \param msg the measrurement report
+     * @param msg the measrurement report
      */
     void RecvMeasurementReport(LteRrcSap::MeasurementReport msg);
     /**
      * Implement the LteEnbRrcSapProvider::RecvIdealUeContextRemoveRequest interface.
      *
-     * \param rnti the C-RNTI identifying the user
+     * @param rnti the C-RNTI identifying the user
      */
     void RecvIdealUeContextRemoveRequest(uint16_t rnti);
 
@@ -310,7 +310,7 @@
 
     /**
      * CMAC UE config update indication function
-     * \param cmacParams the UE config parameters
+     * @param cmacParams the UE config parameters
      */
     void CmacUeConfigUpdateInd(LteEnbCmacSapUser::UeConfig cmacParams);
 
@@ -318,45 +318,45 @@
 
     /**
      * Receive PDCP SDU function
-     * \param params the receive PDCP SDU parameters
+     * @param params the receive PDCP SDU parameters
      */
     void DoReceivePdcpSdu(LtePdcpSapUser::ReceivePdcpSduParameters params);
 
     /**
      *
-     * \return the RNTI, i.e., an UE identifier that is unique within
+     * @return the RNTI, i.e., an UE identifier that is unique within
      * the cell
      */
     uint16_t GetRnti() const;
 
     /**
      *
-     * \return the IMSI, i.e., a globally unique UE identifier
+     * @return the IMSI, i.e., a globally unique UE identifier
      */
     uint64_t GetImsi() const;
 
     /**
      *
-     * \return the primary component carrier ID
+     * @return the primary component carrier ID
      */
     uint8_t GetComponentCarrierId() const;
 
     /**
      *
-     * \return the SRS Configuration Index
+     * @return the SRS Configuration Index
      */
     uint16_t GetSrsConfigurationIndex() const;
 
     /**
      * Set the SRS configuration index and do the necessary reconfiguration
      *
-     * \param srsConfIndex
+     * @param srsConfIndex
      */
     void SetSrsConfigurationIndex(uint16_t srsConfIndex);
 
     /**
      *
-     * \return the current state
+     * @return the current state
      */
     State GetState() const;
 
@@ -364,7 +364,7 @@
      * Configure PdschConfigDedicated (i.e. P_A value) for UE and start RrcConnectionReconfiguration
      * to inform UE about new PdschConfigDedicated
      *
-     * \param pdschConfigDedicated new pdschConfigDedicated (i.e. P_A value) to be set
+     * @param pdschConfigDedicated new pdschConfigDedicated (i.e. P_A value) to be set
      */
     void SetPdschConfigDedicated(LteRrcSap::PdschConfigDedicated pdschConfigDedicated);
 
@@ -375,32 +375,32 @@
     void CancelPendingEvents();
 
     /**
-     *  \brief This function acts as an interface to trigger the connection
+     *  @brief This function acts as an interface to trigger the connection
      *  release towards eNB, EPC and UE.
      *
      */
     void SendRrcConnectionRelease();
 
     /**
-     * \brief build handover preparation failure message
-     * \return the handover preparation failure message.
+     * @brief build handover preparation failure message
+     * @return the handover preparation failure message.
      */
     EpcX2Sap::HandoverPreparationFailureParams BuildHoPrepFailMsg();
 
     /**
-     * \brief build handover cancel message
-     * \return the handover cancel message.
+     * @brief build handover cancel message
+     * @return the handover cancel message.
      */
     EpcX2Sap::HandoverCancelParams BuildHoCancelMsg();
 
     /**
      * TracedCallback signature for state transition events.
      *
-     * \param [in] imsi
-     * \param [in] cellId
-     * \param [in] rnti
-     * \param [in] oldState
-     * \param [in] newState
+     * @param [in] imsi
+     * @param [in] cellId
+     * @param [in] rnti
+     * @param [in] oldState
+     * @param [in] newState
      */
     typedef void (*StateTracedCallback)(const uint64_t imsi,
                                         const uint16_t cellId,
@@ -412,92 +412,92 @@
     /**
      * Add a new LteDataRadioBearerInfo structure to the UeManager
      *
-     * \param radioBearerInfo
+     * @param radioBearerInfo
      *
-     * \return the id of the newly added data radio bearer structure
+     * @return the id of the newly added data radio bearer structure
      */
     uint8_t AddDataRadioBearerInfo(Ptr<LteDataRadioBearerInfo> radioBearerInfo);
 
     /**
-     * \param drbid the Data Radio Bearer id
+     * @param drbid the Data Radio Bearer id
      *
-     * \return the corresponding LteDataRadioBearerInfo
+     * @return the corresponding LteDataRadioBearerInfo
      */
     Ptr<LteDataRadioBearerInfo> GetDataRadioBearerInfo(uint8_t drbid);
 
     /**
      * remove the LteDataRadioBearerInfo corresponding to a bearer being released
      *
-     * \param drbid the Data Radio Bearer id
+     * @param drbid the Data Radio Bearer id
      */
     void RemoveDataRadioBearerInfo(uint8_t drbid);
 
     /**
      *
-     * \return an RrcConnectionReconfiguration struct built based on the
+     * @return an RrcConnectionReconfiguration struct built based on the
      * current configuration
      */
     LteRrcSap::RrcConnectionReconfiguration BuildRrcConnectionReconfiguration();
 
     /**
      *
-     * \return an NonCriticalExtensionConfiguration struct built based on the
+     * @return an NonCriticalExtensionConfiguration struct built based on the
      * current configuration
      */
     LteRrcSap::NonCriticalExtensionConfiguration BuildNonCriticalExtensionConfigurationCa();
 
     /**
      *
-     * \return a RadioResourceConfigDedicated struct built based on the
+     * @return a RadioResourceConfigDedicated struct built based on the
      * current configuration
      */
     LteRrcSap::RadioResourceConfigDedicated BuildRadioResourceConfigDedicated();
 
     /**
      *
-     * \return a newly allocated identifier for a new RRC transaction
+     * @return a newly allocated identifier for a new RRC transaction
      */
     uint8_t GetNewRrcTransactionIdentifier();
 
     /**
-     * \param lcid a Logical Channel Identifier
+     * @param lcid a Logical Channel Identifier
      *
-     * \return the corresponding Data Radio Bearer Id
+     * @return the corresponding Data Radio Bearer Id
      */
     uint8_t Lcid2Drbid(uint8_t lcid);
 
     /**
-     * \param drbid a Data Radio Bearer Id
+     * @param drbid a Data Radio Bearer Id
      *
-     * \return the corresponding  Logical Channel Identifier
+     * @return the corresponding  Logical Channel Identifier
      */
     uint8_t Drbid2Lcid(uint8_t drbid);
 
     /**
-     * \param lcid a  Logical Channel Identifier
+     * @param lcid a  Logical Channel Identifier
      *
-     * \return the corresponding EPS Bearer Identifier
+     * @return the corresponding EPS Bearer Identifier
      */
     uint8_t Lcid2Bid(uint8_t lcid);
 
     /**
-     * \param bid  an EPS Bearer Identifier
+     * @param bid  an EPS Bearer Identifier
      *
-     * \return the corresponding Logical Channel Identifier
+     * @return the corresponding Logical Channel Identifier
      */
     uint8_t Bid2Lcid(uint8_t bid);
 
     /**
-     * \param drbid Data Radio Bearer Id
+     * @param drbid Data Radio Bearer Id
      *
-     * \return the corresponding EPS Bearer Identifier
+     * @return the corresponding EPS Bearer Identifier
      */
     uint8_t Drbid2Bid(uint8_t drbid);
 
     /**
-     * \param bid an EPS Bearer Identifier
+     * @param bid an EPS Bearer Identifier
      *
-     * \return the corresponding Data Radio Bearer Id
+     * @return the corresponding Data Radio Bearer Id
      */
     uint8_t Bid2Drbid(uint8_t bid);
 
@@ -507,15 +507,15 @@
      * or when the RRC Connection Reconfiguration Complete message
      * is received and the packets are debuffered.
      *
-     * \param bid the corresponding EPS Bearer ID
-     * \param p the packet
+     * @param bid the corresponding EPS Bearer ID
+     * @param p the packet
      */
     void SendPacket(uint8_t bid, Ptr<Packet> p);
 
     /**
      * Switch the UeManager to the given state
      *
-     * \param s the given state
+     * @param s the given state
      */
     void SwitchToState(State s);
 
@@ -637,7 +637,7 @@
 }; // end of `class UeManager`
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
  * The LTE Radio Resource Control entity at the eNB
  */
@@ -680,61 +680,61 @@
 
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
      * Set the X2 SAP this RRC should interact with
-     * \param s the X2 SAP Provider to be used by this RRC entity
+     * @param s the X2 SAP Provider to be used by this RRC entity
      */
     void SetEpcX2SapProvider(EpcX2SapProvider* s);
 
     /**
      * Get the X2 SAP offered by this RRC
-     * \return s the X2 SAP User interface offered to the X2 entity by this RRC entity
+     * @return s the X2 SAP User interface offered to the X2 entity by this RRC entity
      */
     EpcX2SapUser* GetEpcX2SapUser();
 
     /**
      * set the CMAC SAP this RRC should interact with
      *
-     * \param s the CMAC SAP Provider to be used by this RRC
+     * @param s the CMAC SAP Provider to be used by this RRC
      */
     void SetLteEnbCmacSapProvider(LteEnbCmacSapProvider* s);
 
     /**
      * set the CMAC SAP this RRC should interact with
      *
-     * \param s the CMAC SAP Provider to be used by this RRC
-     * \param pos the position
+     * @param s the CMAC SAP Provider to be used by this RRC
+     * @param pos the position
      */
     void SetLteEnbCmacSapProvider(LteEnbCmacSapProvider* s, uint8_t pos);
 
     /**
      * Get the CMAC SAP offered by this RRC
-     * \returns the CMAC SAP User interface offered to the MAC by this RRC
+     * @returns the CMAC SAP User interface offered to the MAC by this RRC
      */
     LteEnbCmacSapUser* GetLteEnbCmacSapUser();
 
     /**
      * Get the CMAC SAP offered by this RRC
-     * \param pos the position
-     * \returns the CMAC SAP User interface offered to the MAC by this RRC
+     * @param pos the position
+     * @returns the CMAC SAP User interface offered to the MAC by this RRC
      */
     LteEnbCmacSapUser* GetLteEnbCmacSapUser(uint8_t pos);
 
     /**
      * set the Handover Management SAP this RRC should interact with
      *
-     * \param s the Handover Management SAP Provider to be used by this RRC
+     * @param s the Handover Management SAP Provider to be used by this RRC
      */
     void SetLteHandoverManagementSapProvider(LteHandoverManagementSapProvider* s);
 
     /**
      * Get the Handover Management SAP offered by this RRC
-     * \returns the Handover Management SAP User interface offered to the
+     * @returns the Handover Management SAP User interface offered to the
      *           handover algorithm by this RRC
      */
     LteHandoverManagementSapUser* GetLteHandoverManagementSapUser();
@@ -742,13 +742,13 @@
     /**
      * set the Component Carrier Management SAP this RRC should interact with
      *
-     * \param s the Component Carrier Management SAP Provider to be used by this RRC
+     * @param s the Component Carrier Management SAP Provider to be used by this RRC
      */
     void SetLteCcmRrcSapProvider(LteCcmRrcSapProvider* s);
 
     /**
      * Get the Component Carrier Management SAP offered by this RRC
-     * \return s the Component Carrier Management SAP User interface offered to the
+     * @return s the Component Carrier Management SAP User interface offered to the
      *           carrier component selection algorithm by this RRC
      */
     LteCcmRrcSapUser* GetLteCcmRrcSapUser();
@@ -756,13 +756,13 @@
     /**
      * set the ANR SAP this RRC should interact with
      *
-     * \param s the ANR SAP Provider to be used by this RRC
+     * @param s the ANR SAP Provider to be used by this RRC
      */
     void SetLteAnrSapProvider(LteAnrSapProvider* s);
 
     /**
      * Get the ANR SAP offered by this RRC
-     * \return s the ANR SAP User interface offered to the ANR instance by this
+     * @return s the ANR SAP User interface offered to the ANR instance by this
      *           RRC
      */
     LteAnrSapUser* GetLteAnrSapUser();
@@ -770,27 +770,27 @@
     /**
      * set the FFR SAP this RRC should interact with
      *
-     * \param s the FFR SAP Provider to be used by this RRC
+     * @param s the FFR SAP Provider to be used by this RRC
      */
     void SetLteFfrRrcSapProvider(LteFfrRrcSapProvider* s);
     /**
      * set the FFR SAP this RRC should interact with
      *
-     * \param s the FFR SAP Provider to be used by this RRC
-     * \param index the index
+     * @param s the FFR SAP Provider to be used by this RRC
+     * @param index the index
      */
     void SetLteFfrRrcSapProvider(LteFfrRrcSapProvider* s, uint8_t index);
 
     /**
      * Get the FFR SAP offered by this RRC
-     * \return s the FFR SAP User interface offered to the ANR instance by this
+     * @return s the FFR SAP User interface offered to the ANR instance by this
      *           RRC
      */
     LteFfrRrcSapUser* GetLteFfrRrcSapUser();
     /**
      * Get the FFR SAP offered by this RRC
-     * \param index the index
-     * \return s the FFR SAP User interface offered to the ANR instance by this
+     * @param index the index
+     * @return s the FFR SAP User interface offered to the ANR instance by this
      *           RRC
      */
     LteFfrRrcSapUser* GetLteFfrRrcSapUser(uint8_t index);
@@ -798,14 +798,14 @@
     /**
      * set the RRC SAP this RRC should interact with
      *
-     * \param s the RRC SAP User to be used by this RRC
+     * @param s the RRC SAP User to be used by this RRC
      */
     void SetLteEnbRrcSapUser(LteEnbRrcSapUser* s);
 
     /**
      *
      *
-     * \return s the RRC SAP Provider interface offered to the MAC by this RRC
+     * @return s the RRC SAP Provider interface offered to the MAC by this RRC
      */
     LteEnbRrcSapProvider* GetLteEnbRrcSapProvider();
 
@@ -813,7 +813,7 @@
      * set the MAC SAP provider. The eNB RRC does not use this
      * directly, but it needs to provide it to newly created RLC instances.
      *
-     * \param s the MAC SAP provider that will be used by all
+     * @param s the MAC SAP provider that will be used by all
      * newly created RLC instances
      */
     void SetLteMacSapProvider(LteMacSapProvider* s);
@@ -821,68 +821,68 @@
     /**
      * Set the S1 SAP Provider
      *
-     * \param s the S1 SAP Provider
+     * @param s the S1 SAP Provider
      */
     void SetS1SapProvider(EpcEnbS1SapProvider* s);
 
     /**
      *
-     * \return the S1 SAP user
+     * @return the S1 SAP user
      */
     EpcEnbS1SapUser* GetS1SapUser();
 
     /**
      * set the CPHY SAP this RRC should use to interact with the PHY
      *
-     * \param s the CPHY SAP Provider
+     * @param s the CPHY SAP Provider
      */
     void SetLteEnbCphySapProvider(LteEnbCphySapProvider* s);
 
     /**
      * set the CPHY SAP this RRC should use to interact with the PHY
      *
-     * \param s the CPHY SAP Provider
-     * \param pos the position
+     * @param s the CPHY SAP Provider
+     * @param pos the position
      */
     void SetLteEnbCphySapProvider(LteEnbCphySapProvider* s, uint8_t pos);
 
     /**
      *
      *
-     * \return s the CPHY SAP User interface offered to the PHY by this RRC
+     * @return s the CPHY SAP User interface offered to the PHY by this RRC
      */
     LteEnbCphySapUser* GetLteEnbCphySapUser();
 
     /**
      * Get the ENB CPhy SAP user
      *
-     * \param pos the position
-     * \return s the CPHY SAP User interface offered to the PHY by this RRC
+     * @param pos the position
+     * @return s the CPHY SAP User interface offered to the PHY by this RRC
      */
     LteEnbCphySapUser* GetLteEnbCphySapUser(uint8_t pos);
 
     /**
      *
      *
-     * \param rnti the identifier of an UE
+     * @param rnti the identifier of an UE
      *
-     * \return true if the corresponding UeManager instance exists
+     * @return true if the corresponding UeManager instance exists
      */
     bool HasUeManager(uint16_t rnti) const;
 
     /**
      *
      *
-     * \param rnti the identifier of an UE
+     * @param rnti the identifier of an UE
      *
-     * \return the corresponding UeManager instance
+     * @return the corresponding UeManager instance
      */
     Ptr<UeManager> GetUeManager(uint16_t rnti);
 
     /**
-     * \brief Add a new UE measurement reporting configuration
-     * \param config the new reporting configuration
-     * \return the measurement IDs (measId) referring to the newly added
+     * @brief Add a new UE measurement reporting configuration
+     * @param config the new reporting configuration
+     * @return the measurement IDs (measId) referring to the newly added
      *         reporting configuration
      *
      * Assuming intra-frequency environment, the new measurement reporting
@@ -894,7 +894,7 @@
     std::vector<uint8_t> AddUeMeasReportConfig(LteRrcSap::ReportConfigEutra config);
 
     /**
-     * \brief Configure cell-specific parameters.
+     * @brief Configure cell-specific parameters.
      *
      * Configure cell-specific parameters and propagate them to lower layers.
      * The parameters include bandwidth, EARFCN (E-UTRA Absolute Radio Frequency
@@ -911,54 +911,54 @@
      * Typically runs when the eNodeB NetDevice is installed, for instance by
      * `LteHelper::InstallEnbDevice` (i.e. before the simulation starts).
      *
-     * \warning Raises an error when executed more than once.
+     * @warning Raises an error when executed more than once.
      *
-     * \param ccPhyConf the component carrier configuration
+     * @param ccPhyConf the component carrier configuration
      */
     void ConfigureCell(std::map<uint8_t, Ptr<ComponentCarrierBaseStation>> ccPhyConf);
 
     /**
-     * \brief Configure carriers.
-     * \param ccPhyConf the component carrier configuration
+     * @brief Configure carriers.
+     * @param ccPhyConf the component carrier configuration
      */
     void ConfigureCarriers(std::map<uint8_t, Ptr<ComponentCarrierBaseStation>> ccPhyConf);
 
     /**
      * set the cell id of this eNB
      *
-     * \param m_cellId
+     * @param m_cellId
      */
     void SetCellId(uint16_t m_cellId);
 
     /**
      * set the cell id of this eNB
      *
-     * \param m_cellId
-     * \param ccIndex
+     * @param m_cellId
+     * @param ccIndex
      */
     void SetCellId(uint16_t m_cellId, uint8_t ccIndex);
 
     /**
      * convert the cell id to component carrier id
      *
-     * \param cellId Cell ID
+     * @param cellId Cell ID
      *
-     * \return corresponding component carrier id
+     * @return corresponding component carrier id
      */
     uint8_t CellToComponentCarrierId(uint16_t cellId);
 
     /**
      * convert the component carrier id to cell id
      *
-     * \param componentCarrierId component carrier ID
+     * @param componentCarrierId component carrier ID
      *
-     * \return corresponding cell ID
+     * @return corresponding cell ID
      */
     uint16_t ComponentCarrierToCellId(uint8_t componentCarrierId);
 
     /**
-     * \param cellId cell ID
-     * \return true if cellId is served by this eNB
+     * @param cellId cell ID
+     * @return true if cellId is served by this eNB
      */
     bool HasCellId(uint16_t cellId) const;
 
@@ -967,16 +967,16 @@
      * transmission. Normally expected to be called by the NetDevice
      * forwarding a packet coming from the EpcEnbApplication
      *
-     * \param p the packet
+     * @param p the packet
      *
-     * \return true if successful, false if an error occurred
+     * @return true if successful, false if an error occurred
      */
     bool SendData(Ptr<Packet> p);
 
     /**
      * set the callback used to forward data packets up the stack
      *
-     * \param cb
+     * @param cb
      */
     void SetForwardUpCallback(Callback<void, Ptr<Packet>> cb);
 
@@ -984,7 +984,7 @@
      * Method triggered when a UE is expected to request for connection but does
      * not do so in a reasonable time. The method will remove the UE context.
      *
-     * \param rnti the T-C-RNTI whose timeout expired
+     * @param rnti the T-C-RNTI whose timeout expired
      */
     void ConnectionRequestTimeout(uint16_t rnti);
 
@@ -993,7 +993,7 @@
      * procedure but does not do so in a reasonable time. The method will remove
      * the UE context.
      *
-     * \param rnti the T-C-RNTI whose timeout expired
+     * @param rnti the T-C-RNTI whose timeout expired
      */
     void ConnectionSetupTimeout(uint16_t rnti);
 
@@ -1001,7 +1001,7 @@
      * Method triggered a while after sending RRC Connection Rejected. The method
      * will remove the UE context.
      *
-     * \param rnti the T-C-RNTI whose timeout expired
+     * @param rnti the T-C-RNTI whose timeout expired
      */
     void ConnectionRejectedTimeout(uint16_t rnti);
 
@@ -1010,7 +1010,7 @@
      * but does not do so in a reasonable time. The method will remove the UE
      * context.
      *
-     * \param rnti the C-RNTI whose timeout expired
+     * @param rnti the C-RNTI whose timeout expired
      */
     void HandoverJoiningTimeout(uint16_t rnti);
 
@@ -1019,7 +1019,7 @@
      * but no feedback is received in a reasonable time. The method will remove
      * the UE context.
      *
-     * \param rnti the C-RNTI whose timeout expired
+     * @param rnti the C-RNTI whose timeout expired
      */
     void HandoverLeavingTimeout(uint16_t rnti);
 
@@ -1028,22 +1028,22 @@
      * trigger a handover which is started by the RRC by sending a handover
      * request to the target eNB over the X2 interface
      *
-     * \param rnti the ID of the UE to be handed over
-     * \param cellId the ID of the target eNB
+     * @param rnti the ID of the UE to be handed over
+     * @param cellId the ID of the target eNB
      */
     void SendHandoverRequest(uint16_t rnti, uint16_t cellId);
 
     /**
-     * \brief This function acts as an interface to trigger Release indication messages towards eNB
+     * @brief This function acts as an interface to trigger Release indication messages towards eNB
      * and EPC
-     * \param imsi the IMSI
-     * \param rnti the RNTI
-     * \param bearerId Bearer Identity which is to be de-activated
+     * @param imsi the IMSI
+     * @param rnti the RNTI
+     * @param bearerId Bearer Identity which is to be de-activated
      */
     void DoSendReleaseDataRadioBearer(uint64_t imsi, uint16_t rnti, uint8_t bearerId);
 
     /**
-     *  \brief Send RRC connection release function
+     *  @brief Send RRC connection release function
      *
      *  This function acts as an interface to trigger the connection
      *  release towards eNB, EPC and UE.
@@ -1065,17 +1065,17 @@
     /**
      * TracedCallback signature for new Ue Context events.
      *
-     * \param [in] cellId
-     * \param [in] rnti
+     * @param [in] cellId
+     * @param [in] rnti
      */
     typedef void (*NewUeContextTracedCallback)(const uint16_t cellId, const uint16_t rnti);
 
     /**
      * TracedCallback signature for connection and handover end events.
      *
-     * \param [in] imsi
-     * \param [in] cellId
-     * \param [in] rnti
+     * @param [in] imsi
+     * @param [in] cellId
+     * @param [in] rnti
      */
     typedef void (*ConnectionHandoverTracedCallback)(const uint64_t imsi,
                                                      const uint16_t cellId,
@@ -1084,10 +1084,10 @@
     /**
      * TracedCallback signature for handover start events.
      *
-     * \param [in] imsi
-     * \param [in] cellId
-     * \param [in] rnti
-     * \param [in] targetCid
+     * @param [in] imsi
+     * @param [in] cellId
+     * @param [in] rnti
+     * @param [in] targetCid
      */
     typedef void (*HandoverStartTracedCallback)(const uint64_t imsi,
                                                 const uint16_t cellId,
@@ -1097,11 +1097,11 @@
     /**
      * TracedCallback signature for receive measurement report events.
      *
-     * \param [in] imsi
-     * \param [in] cellId
-     * \param [in] rnti
-     * \param [in] report
-     * \todo The \c LteRrcSap::MeasurementReport argument should be
+     * @param [in] imsi
+     * @param [in] cellId
+     * @param [in] rnti
+     * @param [in] report
+     * @todo The \c LteRrcSap::MeasurementReport argument should be
      * changed to a const reference since the argument is large.
      */
     typedef void (*ReceiveReportTracedCallback)(const uint64_t imsi,
@@ -1112,10 +1112,10 @@
     /**
      * TracedCallback signature for timer expiry events
      *
-     * \param [in] imsi
-     * \param [in] rnti
-     * \param [in] cellId
-     * \param [in] cause
+     * @param [in] imsi
+     * @param [in] rnti
+     * @param [in] cellId
+     * @param [in] cause
      */
     typedef void (*TimerExpiryTracedCallback)(const uint64_t imsi,
                                               const uint16_t rnti,
@@ -1125,9 +1125,9 @@
     /**
      * TracedCallback signature for handover failure events.
      *
-     * \param [in] imsi
-     * \param [in] rnti
-     * \param [in] cellId
+     * @param [in] imsi
+     * @param [in] rnti
+     * @param [in] cellId
      */
     typedef void (*HandoverFailureTracedCallback)(const uint64_t imsi,
                                                   const uint16_t rnti,
@@ -1139,24 +1139,24 @@
     /**
      * Part of the RRC protocol. Forwarding LteEnbRrcSapProvider::CompleteSetupUe interface to
      * UeManager::CompleteSetupUe
-     * \param rnti the RNTI
-     * \param params the LteEnbRrcSapProvider::CompleteSetupUeParameters
+     * @param rnti the RNTI
+     * @param params the LteEnbRrcSapProvider::CompleteSetupUeParameters
      */
     void DoCompleteSetupUe(uint16_t rnti, LteEnbRrcSapProvider::CompleteSetupUeParameters params);
     /**
      * Part of the RRC protocol. Forwarding LteEnbRrcSapProvider::RecvRrcConnectionRequest interface
      * to UeManager::RecvRrcConnectionRequest
      *
-     * \param rnti the RNTI
-     * \param msg the LteRrcSap::RrcConnectionRequest
+     * @param rnti the RNTI
+     * @param msg the LteRrcSap::RrcConnectionRequest
      */
     void DoRecvRrcConnectionRequest(uint16_t rnti, LteRrcSap::RrcConnectionRequest msg);
     /**
      * Part of the RRC protocol. Forwarding LteEnbRrcSapProvider::RecvRrcConnectionSetupCompleted
      * interface to UeManager::RecvRrcConnectionSetupCompleted
      *
-     * \param rnti the RNTI
-     * \param msg the LteRrcSap::RrcConnectionSetupCompleted
+     * @param rnti the RNTI
+     * @param msg the LteRrcSap::RrcConnectionSetupCompleted
      */
     void DoRecvRrcConnectionSetupCompleted(uint16_t rnti,
                                            LteRrcSap::RrcConnectionSetupCompleted msg);
@@ -1165,8 +1165,8 @@
      * LteEnbRrcSapProvider::RecvRrcConnectionReconfigurationCompleted interface to
      * UeManager::RecvRrcConnectionReconfigurationCompleted
      *
-     * \param rnti the RNTI
-     * \param msg the LteRrcSap::RrcConnectionReconfigurationCompleted
+     * @param rnti the RNTI
+     * @param msg the LteRrcSap::RrcConnectionReconfigurationCompleted
      */
     void DoRecvRrcConnectionReconfigurationCompleted(
         uint16_t rnti,
@@ -1176,8 +1176,8 @@
      * LteEnbRrcSapProvider::RecvRrcConnectionReestablishmentRequest interface to
      * UeManager::RecvRrcConnectionReestablishmentRequest
      *
-     * \param rnti the RNTI
-     * \param msg the LteRrcSap::RrcConnectionReestablishmentRequest
+     * @param rnti the RNTI
+     * @param msg the LteRrcSap::RrcConnectionReestablishmentRequest
      */
     void DoRecvRrcConnectionReestablishmentRequest(
         uint16_t rnti,
@@ -1187,8 +1187,8 @@
      * LteEnbRrcSapProvider::RecvRrcConnectionReestablishmentComplete interface to
      * UeManager::RecvRrcConnectionReestablishmentComplete
      *
-     * \param rnti the RNTI
-     * \param msg the LteRrcSap::RrcConnectionReestablishmentComplete
+     * @param rnti the RNTI
+     * @param msg the LteRrcSap::RrcConnectionReestablishmentComplete
      */
     void DoRecvRrcConnectionReestablishmentComplete(
         uint16_t rnti,
@@ -1197,12 +1197,12 @@
      * Part of the RRC protocol. Forwarding LteEnbRrcSapProvider::RecvMeasurementReport interface to
      * UeManager::RecvMeasurementReport
      *
-     * \param rnti the RNTI
-     * \param msg the LteRrcSap::MeasurementReport
+     * @param rnti the RNTI
+     * @param msg the LteRrcSap::MeasurementReport
      */
     void DoRecvMeasurementReport(uint16_t rnti, LteRrcSap::MeasurementReport msg);
     /**
-     * \brief Part of the RRC protocol. Forwarding
+     * @brief Part of the RRC protocol. Forwarding
      * LteEnbRrcSapProvider::RecvIdealUeContextRemoveRequest interface to
      * UeManager::RecvIdealUeContextRemoveRequest.
      *
@@ -1211,7 +1211,7 @@
      * MME only at the beginning of simulation and if they are removed,
      * the bearers cannot be activated again.
      *
-     * \param rnti the C-RNTI identifying the user
+     * @param rnti the C-RNTI identifying the user
      */
     void DoRecvIdealUeContextRemoveRequest(uint16_t rnti);
 
@@ -1220,20 +1220,20 @@
     /**
      * Initial context setup request function
      *
-     * \param params EpcEnbS1SapUser::InitialContextSetupRequestParameters
+     * @param params EpcEnbS1SapUser::InitialContextSetupRequestParameters
      */
     void DoInitialContextSetupRequest(EpcEnbS1SapUser::InitialContextSetupRequestParameters params);
     /**
      * Data radio beaerer setup request function
      *
-     * \param params EpcEnbS1SapUser::DataRadioBearerSetupRequestParameters
+     * @param params EpcEnbS1SapUser::DataRadioBearerSetupRequestParameters
      */
     void DoDataRadioBearerSetupRequest(
         EpcEnbS1SapUser::DataRadioBearerSetupRequestParameters params);
     /**
      * Path switch request acknowledge function
      *
-     * \param params EpcEnbS1SapUser::PathSwitchRequestAcknowledgeParameters
+     * @param params EpcEnbS1SapUser::PathSwitchRequestAcknowledgeParameters
      */
     void DoPathSwitchRequestAcknowledge(
         EpcEnbS1SapUser::PathSwitchRequestAcknowledgeParameters params);
@@ -1243,55 +1243,55 @@
     /**
      * Receive handover request function
      *
-     * \param params EpcX2SapUser::HandoverRequestParams
+     * @param params EpcX2SapUser::HandoverRequestParams
      */
     void DoRecvHandoverRequest(EpcX2SapUser::HandoverRequestParams params);
     /**
      * Receive handover request acknowledge function
      *
-     * \param params EpcX2SapUser::HandoverRequestAckParams
+     * @param params EpcX2SapUser::HandoverRequestAckParams
      */
     void DoRecvHandoverRequestAck(EpcX2SapUser::HandoverRequestAckParams params);
     /**
      * Receive handover preparation failure function
      *
-     * \param params EpcX2SapUser::HandoverPreparationFailureParams
+     * @param params EpcX2SapUser::HandoverPreparationFailureParams
      */
     void DoRecvHandoverPreparationFailure(EpcX2SapUser::HandoverPreparationFailureParams params);
     /**
      * Receive SN status transfer function
      *
-     * \param params EpcX2SapUser::SnStatusTransferParams
+     * @param params EpcX2SapUser::SnStatusTransferParams
      */
     void DoRecvSnStatusTransfer(EpcX2SapUser::SnStatusTransferParams params);
     /**
      * Receive UE context release function
      *
-     * \param params EpcX2SapUser::UeContextReleaseParams
+     * @param params EpcX2SapUser::UeContextReleaseParams
      */
     void DoRecvUeContextRelease(EpcX2SapUser::UeContextReleaseParams params);
     /**
      * Receive load information function
      *
-     * \param params EpcX2SapUser::LoadInformationParams
+     * @param params EpcX2SapUser::LoadInformationParams
      */
     void DoRecvLoadInformation(EpcX2SapUser::LoadInformationParams params);
     /**
      * Receive resource status update function
      *
-     * \param params EpcX2SapUser::ResourceStatusUpdateParams
+     * @param params EpcX2SapUser::ResourceStatusUpdateParams
      */
     void DoRecvResourceStatusUpdate(EpcX2SapUser::ResourceStatusUpdateParams params);
     /**
      * Receive UE data function
      *
-     * \param params EpcX2SapUser::UeDataParams
+     * @param params EpcX2SapUser::UeDataParams
      */
     void DoRecvUeData(EpcX2SapUser::UeDataParams params);
     /**
      * Receive Handover Cancel function.
      *
-     * \param params EpcX2SapUser::HandoverCancelParams
+     * @param params EpcX2SapUser::HandoverCancelParams
      */
     void DoRecvHandoverCancel(EpcX2SapUser::HandoverCancelParams params);
 
@@ -1300,22 +1300,22 @@
     /**
      * Allocate temporary cell RNTI function
      *
-     * \param componentCarrierId ID of the primary component carrier
-     * \return temporary RNTI
+     * @param componentCarrierId ID of the primary component carrier
+     * @return temporary RNTI
      */
     uint16_t DoAllocateTemporaryCellRnti(uint8_t componentCarrierId);
     /**
      * Notify LC config result function
      *
-     * \param rnti RNTI
-     * \param lcid LCID
-     * \param success the success indicator
+     * @param rnti RNTI
+     * @param lcid LCID
+     * @param success the success indicator
      */
     void DoNotifyLcConfigResult(uint16_t rnti, uint8_t lcid, bool success);
     /**
      * RRC configuration update indication function
      *
-     * \param params LteEnbCmacSapUser::UeConfig
+     * @param params LteEnbCmacSapUser::UeConfig
      */
     void DoRrcConfigurationUpdateInd(LteEnbCmacSapUser::UeConfig params);
 
@@ -1324,29 +1324,29 @@
     /**
      * Add UE measure report config for handover function
      *
-     * \param reportConfig LteRrcSap::ReportConfigEutra
-     * \returns measure ID
+     * @param reportConfig LteRrcSap::ReportConfigEutra
+     * @returns measure ID
      */
     std::vector<uint8_t> DoAddUeMeasReportConfigForHandover(
         LteRrcSap::ReportConfigEutra reportConfig);
     /**
      * Add UE measure report config for component carrier function
      *
-     * \param reportConfig LteRrcSap::ReportConfigEutra
-     * \returns measure ID
+     * @param reportConfig LteRrcSap::ReportConfigEutra
+     * @returns measure ID
      */
     uint8_t DoAddUeMeasReportConfigForComponentCarrier(LteRrcSap::ReportConfigEutra reportConfig);
     /**
-     * \brief Set number of component carriers
-     * \param numberOfComponentCarriers the number of component carriers
+     * @brief Set number of component carriers
+     * @param numberOfComponentCarriers the number of component carriers
      */
     void DoSetNumberOfComponentCarriers(uint16_t numberOfComponentCarriers);
 
     /**
      * Trigger handover function
      *
-     * \param rnti RNTI
-     * \param targetCellId target cell ID
+     * @param rnti RNTI
+     * @param targetCellId target cell ID
      */
     void DoTriggerHandover(uint16_t rnti, uint16_t targetCellId);
 
@@ -1355,8 +1355,8 @@
     /**
      * Add UE measure report config for ANR function
      *
-     * \param reportConfig LteRrcSap::ReportConfigEutra
-     * \returns measure ID
+     * @param reportConfig LteRrcSap::ReportConfigEutra
+     * @returns measure ID
      */
     uint8_t DoAddUeMeasReportConfigForAnr(LteRrcSap::ReportConfigEutra reportConfig);
 
@@ -1364,21 +1364,21 @@
     /**
      * Add UE measure report config for FFR function
      *
-     * \param reportConfig LteRrcSap::ReportConfigEutra
-     * \returns measure ID
+     * @param reportConfig LteRrcSap::ReportConfigEutra
+     * @returns measure ID
      */
     uint8_t DoAddUeMeasReportConfigForFfr(LteRrcSap::ReportConfigEutra reportConfig);
     /**
      * Set PDSCH config dedicated function
      *
-     * \param rnti the RNTI
-     * \param pa LteRrcSap::PdschConfigDedicated
+     * @param rnti the RNTI
+     * @param pa LteRrcSap::PdschConfigDedicated
      */
     void DoSetPdschConfigDedicated(uint16_t rnti, LteRrcSap::PdschConfigDedicated pa);
     /**
      * Send load information function
      *
-     * \param params EpcX2Sap::LoadInformationParams
+     * @param params EpcX2Sap::LoadInformationParams
      */
     void DoSendLoadInformation(EpcX2Sap::LoadInformationParams params);
 
@@ -1389,30 +1389,30 @@
      *   * T-C-RNTI allocation upon contention-based MAC Random Access procedure
      *   * target cell RNTI allocation upon handover
      *
-     * \param state the initial state of the UeManager
-     * \param componentCarrierId primary component carrier ID of the UeManager
+     * @param state the initial state of the UeManager
+     * @param componentCarrierId primary component carrier ID of the UeManager
      *
-     * \return the newly allocated RNTI
+     * @return the newly allocated RNTI
      */
     uint16_t AddUe(UeManager::State state, uint8_t componentCarrierId);
 
     /**
      * remove a UE from the cell
      *
-     * \param rnti the C-RNTI identiftying the user
+     * @param rnti the C-RNTI identiftying the user
      */
     void RemoveUe(uint16_t rnti);
 
     /**
      *
-     * \param bearer the specification of an EPS bearer
+     * @param bearer the specification of an EPS bearer
      *
-     * \return the type of RLC that is to be created for the given EPS bearer
+     * @return the type of RLC that is to be created for the given EPS bearer
      */
     TypeId GetRlcType(EpsBearer bearer);
 
     /**
-     * \brief Is random access completed function
+     * @brief Is random access completed function
      *
      * This method is executed to decide if the non contention based
      * preamble has to reused or not upon preamble expiry. If the random access
@@ -1420,8 +1420,8 @@
      * If not, the same UE retains the preamble and other available preambles is
      * assigned to the required UEs.
      *
-     * \param rnti the C-RNTI identifying the user
-     * \return true if the random access in connected mode is completed
+     * @param rnti the C-RNTI identifying the user
+     * @return true if the random access in connected mode is completed
      */
     bool IsRandomAccessCompleted(uint16_t rnti);
 
@@ -1429,26 +1429,26 @@
     /**
      * Add a neighbour with an X2 interface
      *
-     * \param cellId neighbouring cell id
+     * @param cellId neighbouring cell id
      */
     void AddX2Neighbour(uint16_t cellId);
 
     /**
      *
-     * \param p the SRS periodicity in num TTIs
+     * @param p the SRS periodicity in num TTIs
      */
     void SetSrsPeriodicity(uint32_t p);
 
     /**
      *
-     * \return the current SRS periodicity
+     * @return the current SRS periodicity
      */
     uint32_t GetSrsPeriodicity() const;
 
     /**
-     * \brief Associate this RRC entity with a particular CSG information.
-     * \param csgId the intended Closed Subscriber Group identity
-     * \param csgIndication if TRUE, only CSG members are allowed to access the
+     * @brief Associate this RRC entity with a particular CSG information.
+     * @param csgId the intended Closed Subscriber Group identity
+     * @param csgIndication if TRUE, only CSG members are allowed to access the
      *                      cell
      *
      * CSG identity is a number identifying a Closed Subscriber Group which the
@@ -1470,42 +1470,42 @@
     /**
      * Allocate a new SRS configuration index for a new UE.
      *
-     * \note this method can have the side effect of updating the SRS
+     * @note this method can have the side effect of updating the SRS
      * configuration index of all UEs
      *
-     * \return the newly allocated SRS configuration index
+     * @return the newly allocated SRS configuration index
      */
     uint16_t GetNewSrsConfigurationIndex();
 
     /**
      * remove a previously allocated SRS configuration index
      *
-     * \note this method can have the side effect of updating the SRS
+     * @note this method can have the side effect of updating the SRS
      * configuration index of all UEs
      *
-     * \param srcCi the index to be removed
+     * @param srcCi the index to be removed
      */
     void RemoveSrsConfigurationIndex(uint16_t srcCi);
 
     /**
-     * \return true if all the SRS indices are assigned to UEs
+     * @return true if all the SRS indices are assigned to UEs
      */
     bool IsMaxSrsReached();
 
     /**
      *
-     * \param bearer the characteristics of the bearer
+     * @param bearer the characteristics of the bearer
      *
-     * \return the Logical Channel Group in a bearer with these
+     * @return the Logical Channel Group in a bearer with these
      * characteristics is put. Used for MAC Buffer Status Reporting purposes.
      */
     uint8_t GetLogicalChannelGroup(EpsBearer bearer);
 
     /**
      *
-     * \param bearer the characteristics of the bearer
+     * @param bearer the characteristics of the bearer
      *
-     * \return the priority level of a bearer with these
+     * @return the priority level of a bearer with these
      * characteristics is put. Used for the part of UL MAC Scheduling
      * carried out by the UE
      */
@@ -1777,6 +1777,14 @@
 
 }; // end of `class LteEnbRrc`
 
+/**
+ * @brief Stream insertion operator.
+ * @param [in] os The reference to the output stream.
+ * @param [in] state The UeManager::State.
+ * @return The reference to the output stream.
+ */
+std::ostream& operator<<(std::ostream& os, UeManager::State state);
+
 } // namespace ns3
 
 #endif // LTE_ENB_RRC_H
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-ffr-algorithm.cc ns-3.44/src/lte/model/lte-ffr-algorithm.cc
--- ns-3.43/src/lte/model/lte-ffr-algorithm.cc	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-ffr-algorithm.cc	2025-03-09 16:55:49.599372000 -0700
@@ -10,8 +10,8 @@
 #include "lte-ffr-algorithm.h"
 
 #include "ns3/boolean.h"
+#include "ns3/log.h"
 #include "ns3/uinteger.h"
-#include <ns3/log.h>
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-ffr-algorithm.h ns-3.44/src/lte/model/lte-ffr-algorithm.h
--- ns-3.43/src/lte/model/lte-ffr-algorithm.h	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-ffr-algorithm.h	2025-03-09 16:55:49.599372000 -0700
@@ -14,7 +14,7 @@
 #include "ff-mac-sched-sap.h"
 #include "lte-rrc-sap.h"
 
-#include <ns3/object.h>
+#include "ns3/object.h"
 
 #include <map>
 
@@ -28,7 +28,7 @@
 class LteFfrRrcSapProvider;
 
 /**
- * \brief The abstract base class of a Frequency Reuse algorithm
+ * @brief The abstract base class of a Frequency Reuse algorithm
  *
  * Generally Frequency reuse algorithm tells the Scheduler which RB can be allocated
  * and which can not. FR policy depend on its implementation.
@@ -52,68 +52,68 @@
     ~LteFfrAlgorithm() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Set the "user" part of the LteFfrSap interface that
+     * @brief Set the "user" part of the LteFfrSap interface that
      *        this frequency reuse algorithm instance will interact with.
-     * \param s a reference to the "user" part of the interface, typically a
+     * @param s a reference to the "user" part of the interface, typically a
      *          member of an Scheduler instance
      */
     virtual void SetLteFfrSapUser(LteFfrSapUser* s) = 0;
 
     /**
-     * \brief Set the "user" part of the LteFfrRrcSap interface that
+     * @brief Set the "user" part of the LteFfrRrcSap interface that
      *        this frequency reuse algorithm instance will interact with.
-     * \param s a reference to the "user" part of the interface, typically a
+     * @param s a reference to the "user" part of the interface, typically a
      *          member of an LteEnbRrc instance
      */
     virtual void SetLteFfrRrcSapUser(LteFfrRrcSapUser* s) = 0;
 
     /**
-     * \brief Export the "provider" part of the LteFfrSap interface.
-     * \return the reference to the "provider" part of the interface, typically to
+     * @brief Export the "provider" part of the LteFfrSap interface.
+     * @return the reference to the "provider" part of the interface, typically to
      *         be kept by an Scheduler instance
      */
     virtual LteFfrSapProvider* GetLteFfrSapProvider() = 0;
 
     /**
-     * \brief Export the "provider" part of the LteFfrRrcSap interface.
-     * \return the reference to the "provider" part of the interface, typically to
+     * @brief Export the "provider" part of the LteFfrRrcSap interface.
+     * @return the reference to the "provider" part of the interface, typically to
      *         be kept by an LteEnbRrc instance
      */
     virtual LteFfrRrcSapProvider* GetLteFfrRrcSapProvider() = 0;
 
     /**
-     * \return the uplink bandwidth in RBs
+     * @return the uplink bandwidth in RBs
      */
     uint16_t GetUlBandwidth() const;
 
     /**
-     * \param bw the uplink bandwidth in RBs
+     * @param bw the uplink bandwidth in RBs
      */
     void SetUlBandwidth(uint16_t bw);
 
     /**
-     * \return the downlink bandwidth in RBs
+     * @return the downlink bandwidth in RBs
      */
     uint16_t GetDlBandwidth() const;
 
     /**
-     * \param bw the downlink bandwidth in RBs
+     * @param bw the downlink bandwidth in RBs
      */
     void SetDlBandwidth(uint16_t bw);
 
     /**
-     * \param cellTypeId for automatic FR configuration
+     * @param cellTypeId for automatic FR configuration
      */
     void SetFrCellTypeId(uint8_t cellTypeId);
 
     /**
-     * \return cellTypeId which is used for automatic FR configuration
+     * @return cellTypeId which is used for automatic FR configuration
      */
     uint8_t GetFrCellTypeId() const;
 
@@ -122,114 +122,114 @@
     void DoDispose() override;
 
     /**
-     * \brief Automatic FR reconfiguration
+     * @brief Automatic FR reconfiguration
      */
     virtual void Reconfigure() = 0;
 
     // FFR SAP PROVIDER IMPLEMENTATION
 
     /**
-     * \brief Implementation of LteFfrSapProvider::GetAvailableDlRbg
-     * \return vector of size (m_dlBandwidth/RbgSize); false indicates
+     * @brief Implementation of LteFfrSapProvider::GetAvailableDlRbg
+     * @return vector of size (m_dlBandwidth/RbgSize); false indicates
      *                    that RBG is free to use, true otherwise
      */
     virtual std::vector<bool> DoGetAvailableDlRbg() = 0;
 
     /**
-     * \brief Implementation of LteFfrSapProvider::IsDlRbgAvailableForUe
-     * \param rbId
-     * \param rnti Radio Network Temporary Identity, an integer identifying the UE
+     * @brief Implementation of LteFfrSapProvider::IsDlRbgAvailableForUe
+     * @param rbId
+     * @param rnti Radio Network Temporary Identity, an integer identifying the UE
      *             where the report originates from
-     * \return true if UE can be served on i-th RB, false otherwise
+     * @return true if UE can be served on i-th RB, false otherwise
      */
     virtual bool DoIsDlRbgAvailableForUe(int rbId, uint16_t rnti) = 0;
 
     /**
-     * \brief Implementation of LteFfrSapProvider::GetAvailableUlRbg.
-     * \return vector of size m_ulBandwidth; false indicates
+     * @brief Implementation of LteFfrSapProvider::GetAvailableUlRbg.
+     * @return vector of size m_ulBandwidth; false indicates
      *                    that RB is free to use, true otherwise
      */
     virtual std::vector<bool> DoGetAvailableUlRbg() = 0;
 
     /**
-     * \brief Implementation of LteFfrSapProvider::IsUlRbgAvailableForUe.
-     * \param rbId
-     * \param rnti Radio Network Temporary Identity, an integer identifying the UE
+     * @brief Implementation of LteFfrSapProvider::IsUlRbgAvailableForUe.
+     * @param rbId
+     * @param rnti Radio Network Temporary Identity, an integer identifying the UE
      *             where the report originates from
-     * \return true if UE can be served on i-th RB, false otherwise
+     * @return true if UE can be served on i-th RB, false otherwise
      */
     virtual bool DoIsUlRbgAvailableForUe(int rbId, uint16_t rnti) = 0;
 
     /**
-     * \brief DoReportDlCqiInfo
-     * \param params
+     * @brief DoReportDlCqiInfo
+     * @param params
      *
      */
     virtual void DoReportDlCqiInfo(
         const FfMacSchedSapProvider::SchedDlCqiInfoReqParameters& params) = 0;
 
     /**
-     * \brief DoReportUlCqiInfo
-     * \param params
+     * @brief DoReportUlCqiInfo
+     * @param params
      *
      */
     virtual void DoReportUlCqiInfo(
         const FfMacSchedSapProvider::SchedUlCqiInfoReqParameters& params) = 0;
 
     /**
-     * \brief DoReportUlCqiInfo
-     * \param ulCqiMap
+     * @brief DoReportUlCqiInfo
+     * @param ulCqiMap
      *
      */
     virtual void DoReportUlCqiInfo(std::map<uint16_t, std::vector<double>> ulCqiMap) = 0;
 
     /**
-     * \brief DoGetTpc for UE
-     * \param rnti
-     * \return TPC value
+     * @brief DoGetTpc for UE
+     * @param rnti
+     * @return TPC value
      */
     virtual uint8_t DoGetTpc(uint16_t rnti) = 0;
 
     /**
-     * \brief DoGetMinContinuousUlBandwidth in number of RB
-     * \return number of RB in min continuous UL Bandwidth
+     * @brief DoGetMinContinuousUlBandwidth in number of RB
+     * @return number of RB in min continuous UL Bandwidth
      */
     virtual uint16_t DoGetMinContinuousUlBandwidth() = 0;
 
     // FFR SAP RRC PROVIDER IMPLEMENTATION
 
     /**
-     * \brief SetCellId
-     * \param cellId the Cell Identifier
+     * @brief SetCellId
+     * @param cellId the Cell Identifier
      */
     virtual void DoSetCellId(uint16_t cellId);
 
     /**
-     * \brief Implementation of LteFfrRrcSapProvider::SetBandwidth.
-     * \param ulBandwidth UL bandwidth in number of RB
-     * \param dlBandwidth DL bandwidth in number of RB
+     * @brief Implementation of LteFfrRrcSapProvider::SetBandwidth.
+     * @param ulBandwidth UL bandwidth in number of RB
+     * @param dlBandwidth DL bandwidth in number of RB
      */
     virtual void DoSetBandwidth(uint16_t ulBandwidth, uint16_t dlBandwidth);
 
     /**
-     * \brief Implementation of LteFfrRrcSapProvider::ReportUeMeas.
-     * \param rnti Radio Network Temporary Identity, an integer identifying the UE
+     * @brief Implementation of LteFfrRrcSapProvider::ReportUeMeas.
+     * @param rnti Radio Network Temporary Identity, an integer identifying the UE
      *             where the report originates from
-     * \param measResults a single report of one measurement identity
+     * @param measResults a single report of one measurement identity
      */
     virtual void DoReportUeMeas(uint16_t rnti, LteRrcSap::MeasResults measResults) = 0;
 
     /**
-     * \brief DoRecvLoadInformation
-     * \param params
+     * @brief DoRecvLoadInformation
+     * @param params
      *
      */
     virtual void DoRecvLoadInformation(EpcX2Sap::LoadInformationParams params) = 0;
 
     /**
-     * \brief Get RBG size for DL Bandwidth according to table 7.1.6.1-1 of 36.213
-     * \param dlbandwidth
-     * \return size of RBG in number of RB
+     * @brief Get RBG size for DL Bandwidth according to table 7.1.6.1-1 of 36.213
+     * @param dlbandwidth
+     * @return size of RBG in number of RB
      */
     int GetRbgSize(int dlbandwidth);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-ffr-distributed-algorithm.cc ns-3.44/src/lte/model/lte-ffr-distributed-algorithm.cc
--- ns-3.43/src/lte/model/lte-ffr-distributed-algorithm.cc	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-ffr-distributed-algorithm.cc	2025-03-09 16:55:49.599372000 -0700
@@ -9,7 +9,7 @@
 
 #include "lte-ffr-distributed-algorithm.h"
 
-#include <ns3/log.h>
+#include "ns3/log.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-ffr-distributed-algorithm.h ns-3.44/src/lte/model/lte-ffr-distributed-algorithm.h
--- ns-3.43/src/lte/model/lte-ffr-distributed-algorithm.h	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-ffr-distributed-algorithm.h	2025-03-09 16:55:49.599372000 -0700
@@ -19,7 +19,7 @@
 {
 
 /**
- * \brief Distributed Fractional Frequency Reuse algorithm implementation.
+ * @brief Distributed Fractional Frequency Reuse algorithm implementation.
  */
 class LteFfrDistributedAlgorithm : public LteFfrAlgorithm
 {
@@ -28,8 +28,8 @@
     ~LteFfrDistributedAlgorithm() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -73,15 +73,15 @@
     /**
      * Set down link configuration function
      *
-     * \param cellId cell ID
-     * \param bandwidth the bandwidth
+     * @param cellId cell ID
+     * @param bandwidth the bandwidth
      */
     void SetDownlinkConfiguration(uint16_t cellId, uint8_t bandwidth);
     /**
      * Set up link configuration function
      *
-     * \param cellId cell ID
-     * \param bandwidth the bandwidth
+     * @param cellId cell ID
+     * @param bandwidth the bandwidth
      */
     void SetUplinkConfiguration(uint16_t cellId, uint8_t bandwidth);
     /**
@@ -96,10 +96,10 @@
     /**
      * Initialize up link RBG maps function
      *
-     * \param rnti the RNTI
-     * \param cellId the cell ID
-     * \param rsrp the RSRP
-     * \param rsrq the RSRQ
+     * @param rnti the RNTI
+     * @param cellId the cell ID
+     * @param rsrp the RSRP
+     * @param rsrq the RSRQ
      */
     void UpdateNeighbourMeasurements(uint16_t rnti, uint16_t cellId, uint8_t rsrp, uint8_t rsrq);
 
@@ -108,7 +108,7 @@
     /**
      * Send load information function
      *
-     * \param targetCellId the cell ID
+     * @param targetCellId the cell ID
      */
     void SendLoadInformation(uint16_t targetCellId);
 
@@ -153,7 +153,7 @@
     uint8_t m_rsrpMeasId; ///< RSRP measurement ID
 
     /**
-     * \brief Measurements reported by a UE for a cell ID.
+     * @brief Measurements reported by a UE for a cell ID.
      *
      * The values are quantized according 3GPP TS 36.133 section 9.1.4 and 9.1.7.
      */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-ffr-enhanced-algorithm.cc ns-3.44/src/lte/model/lte-ffr-enhanced-algorithm.cc
--- ns-3.43/src/lte/model/lte-ffr-enhanced-algorithm.cc	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-ffr-enhanced-algorithm.cc	2025-03-09 16:55:49.599372000 -0700
@@ -13,8 +13,8 @@
 #include "lte-common.h"
 
 #include "ns3/boolean.h"
-#include <ns3/double.h>
-#include <ns3/log.h>
+#include "ns3/double.h"
+#include "ns3/log.h"
 
 #include <cfloat>
 
@@ -97,10 +97,10 @@
     {3, 100, 64, 16, 16},
 };
 
-/** \returns number of downlink configurations */
+/** @returns number of downlink configurations */
 const uint16_t NUM_DOWNLINK_CONFS(sizeof(g_ffrEnhancedDownlinkDefaultConfiguration) /
                                   sizeof(FfrEnhancedDownlinkDefaultConfiguration));
-/** \returns number of uplink configurations */
+/** @returns number of uplink configurations */
 const uint16_t NUM_UPLINK_CONFS(sizeof(g_ffrEnhancedUplinkDefaultConfiguration) /
                                 sizeof(FfrEnhancedUplinkDefaultConfiguration));
 
@@ -736,10 +736,10 @@
         for (uint32_t j = 0; j < dlRbgAvailableMap.size(); j++)
         {
             uint32_t index = rbgSize * j;
-            for (uint32_t i = 0; i < rbgSize; i++)
+            for (uint32_t i = 0; i < rbgSize && index < m_ulBandwidth; i++)
             {
-                index = index + i;
                 ulRbAvailableMap[index] = dlRbgAvailableMap[j];
+                index++;
             }
         }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-ffr-enhanced-algorithm.h ns-3.44/src/lte/model/lte-ffr-enhanced-algorithm.h
--- ns-3.43/src/lte/model/lte-ffr-enhanced-algorithm.h	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-ffr-enhanced-algorithm.h	2025-03-09 16:55:49.599372000 -0700
@@ -25,20 +25,20 @@
 {
 
 /**
- * \brief Enhanced Fractional Frequency Reuse algorithm implementation
+ * @brief Enhanced Fractional Frequency Reuse algorithm implementation
  */
 class LteFfrEnhancedAlgorithm : public LteFfrAlgorithm
 {
   public:
     /**
-     * \brief Creates a trivial ffr algorithm instance.
+     * @brief Creates a trivial ffr algorithm instance.
      */
     LteFfrEnhancedAlgorithm();
     ~LteFfrEnhancedAlgorithm() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -82,15 +82,15 @@
     /**
      * Set downlink configuration
      *
-     * \param cellId the cell ID
-     * \param bandwidth the bandwidth
+     * @param cellId the cell ID
+     * @param bandwidth the bandwidth
      */
     void SetDownlinkConfiguration(uint16_t cellId, uint8_t bandwidth);
     /**
      * Set uplink configuration
      *
-     * \param cellId the cell ID
-     * \param bandwidth the bandwidth
+     * @param cellId the cell ID
+     * @param bandwidth the bandwidth
      */
     void SetUplinkConfiguration(uint16_t cellId, uint8_t bandwidth);
     /**
@@ -105,10 +105,10 @@
     /**
      * Initialize uplink RBG maps
      *
-     * \param rnti the RNTI
-     * \param rb RB
-     * \param ulCqiMap UL CQI map
-     * \returns UL SINR
+     * @param rnti the RNTI
+     * @param rb RB
+     * @param ulCqiMap UL CQI map
+     * @returns UL SINR
      */
     double EstimateUlSinr(uint16_t rnti,
                           uint16_t rb,
@@ -116,8 +116,8 @@
     /**
      * Get CQI from spectral efficiency
      *
-     * \param s spectral efficiency
-     * \returns CQI
+     * @param s spectral efficiency
+     * @returns CQI
      */
     int GetCqiFromSpectralEfficiency(double s);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-ffr-rrc-sap.h ns-3.44/src/lte/model/lte-ffr-rrc-sap.h
--- ns-3.43/src/lte/model/lte-ffr-rrc-sap.h	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-ffr-rrc-sap.h	2025-03-09 16:55:49.599372000 -0700
@@ -17,7 +17,7 @@
 {
 
 /**
- * \brief Service Access Point (SAP) offered by the Frequency Reuse algorithm
+ * @brief Service Access Point (SAP) offered by the Frequency Reuse algorithm
  *        instance to the eNodeB RRC instance.
  *
  * This is the *LteFfrRrcSapProvider*, i.e., the part of the SAP
@@ -30,24 +30,24 @@
     virtual ~LteFfrRrcSapProvider();
 
     /**
-     * \brief SetCellId
-     * \param cellId the Cell Identifier
+     * @brief SetCellId
+     * @param cellId the Cell Identifier
      */
     virtual void SetCellId(uint16_t cellId) = 0;
 
     /**
-     * \brief Configure DL and UL bandwidth in Frequency Reuse Algorithm
+     * @brief Configure DL and UL bandwidth in Frequency Reuse Algorithm
      *        function is called during Cell configuration
-     * \param ulBandwidth UL bandwidth in number of RB
-     * \param dlBandwidth DL bandwidth in number of RB
+     * @param ulBandwidth UL bandwidth in number of RB
+     * @param dlBandwidth DL bandwidth in number of RB
      */
     virtual void SetBandwidth(uint8_t ulBandwidth, uint8_t dlBandwidth) = 0;
 
     /**
-     * \brief Send a UE measurement report to Frequency Reuse algorithm.
-     * \param rnti Radio Network Temporary Identity, an integer identifying the UE
+     * @brief Send a UE measurement report to Frequency Reuse algorithm.
+     * @param rnti Radio Network Temporary Identity, an integer identifying the UE
      *             where the report originates from
-     * \param measResults a single report of one measurement identity
+     * @param measResults a single report of one measurement identity
      *
      * The received measurement report is a result of the UE measurement
      * configuration previously configured by calling
@@ -58,15 +58,15 @@
     virtual void ReportUeMeas(uint16_t rnti, LteRrcSap::MeasResults measResults) = 0;
 
     /**
-     * \brief RecvLoadInformation
-     * \param params the EpcX2Sap::LoadInformationParams
+     * @brief RecvLoadInformation
+     * @param params the EpcX2Sap::LoadInformationParams
      */
     virtual void RecvLoadInformation(EpcX2Sap::LoadInformationParams params) = 0;
 
 }; // end of class LteFfrRrcSapProvider
 
 /**
- * \brief Service Access Point (SAP) offered by the eNodeB RRC instance to the
+ * @brief Service Access Point (SAP) offered by the eNodeB RRC instance to the
  *        Frequency Reuse algorithm instance.
  *
  * This is the *LteFfrRrcSapUser*, i.e., the part of the SAP that
@@ -78,10 +78,10 @@
     virtual ~LteFfrRrcSapUser();
 
     /**
-     * \brief Request a certain reporting configuration to be fulfilled by the UEs
+     * @brief Request a certain reporting configuration to be fulfilled by the UEs
      *        attached to the eNodeB entity.
-     * \param reportConfig the UE measurement reporting configuration
-     * \return the measurement identity associated with this newly added
+     * @param reportConfig the UE measurement reporting configuration
+     * @return the measurement identity associated with this newly added
      *         reporting configuration
      *
      * The eNodeB RRC entity is expected to configure the same reporting
@@ -91,17 +91,17 @@
      * Frequency Reuse algorithm through the LteFfrRrcSapProvider::ReportUeMeas
      * SAP function.
      *
-     * \note This function is only valid before the simulation begins.
+     * @note This function is only valid before the simulation begins.
      */
     virtual uint8_t AddUeMeasReportConfigForFfr(LteRrcSap::ReportConfigEutra reportConfig) = 0;
 
     /**
-     * \brief Instruct the eNodeB RRC entity to perform RrcConnectionReconfiguration
+     * @brief Instruct the eNodeB RRC entity to perform RrcConnectionReconfiguration
      *        to inform UE about new PdschConfigDedicated (i.e. P_a value).
      *        Also Downlink Power Allocation is done based on this value.
-     * \param rnti Radio Network Temporary Identity, an integer identifying the
+     * @param rnti Radio Network Temporary Identity, an integer identifying the
      *             UE which shall perform the handover
-     * \param pdschConfigDedicated new PdschConfigDedicated to be configured for UE
+     * @param pdschConfigDedicated new PdschConfigDedicated to be configured for UE
      *
      * This function is used by the Frequency Reuse algorithm entity when it decides
      * that PDSCH for this UE should be allocated with different transmit power.
@@ -114,15 +114,15 @@
                                          LteRrcSap::PdschConfigDedicated pdschConfigDedicated) = 0;
 
     /**
-     * \brief SendLoadInformation
-     * \param params the EpcX2Sap::LoadInformationParams
+     * @brief SendLoadInformation
+     * @param params the EpcX2Sap::LoadInformationParams
      */
     virtual void SendLoadInformation(EpcX2Sap::LoadInformationParams params) = 0;
 
 }; // end of class LteFfrRrcSapUser
 
 /**
- * \brief Template for the implementation of the LteFfrRrcSapProvider
+ * @brief Template for the implementation of the LteFfrRrcSapProvider
  *        as a member of an owner class of type C to which all methods are
  *        forwarded.
  */
@@ -132,7 +132,7 @@
   public:
     /**
      * Constructor
-     * \param owner the owner class
+     * @param owner the owner class
      */
     MemberLteFfrRrcSapProvider(C* owner);
 
@@ -185,7 +185,7 @@
 }
 
 /**
- * \brief Template for the implementation of the LteFfrRrcSapUser
+ * @brief Template for the implementation of the LteFfrRrcSapUser
  *        as a member of an owner class of type C to which all methods are
  *        forwarded.
  */
@@ -196,7 +196,7 @@
     /**
      * Constructor
      *
-     * \param owner the owner class
+     * @param owner the owner class
      */
     MemberLteFfrRrcSapUser(C* owner);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-ffr-sap.h ns-3.44/src/lte/model/lte-ffr-sap.h
--- ns-3.43/src/lte/model/lte-ffr-sap.h	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-ffr-sap.h	2025-03-09 16:55:49.599372000 -0700
@@ -18,7 +18,7 @@
 {
 
 /**
- * \brief Service Access Point (SAP) offered by the Frequency Reuse algorithm
+ * @brief Service Access Point (SAP) offered by the Frequency Reuse algorithm
  *        instance to the MAC Scheduler instance.
  *
  * This is the *LteFfrSapProvider*, i.e., the part of the SAP
@@ -31,8 +31,8 @@
     virtual ~LteFfrSapProvider();
 
     /**
-     * \brief Get vector of available RBG in DL for this Cell
-     * \return vector of size (m_dlBandwidth/RbgSize); false indicates
+     * @brief Get vector of available RBG in DL for this Cell
+     * @return vector of size (m_dlBandwidth/RbgSize); false indicates
      *                   that RBG is free to use, true otherwise
      *
      * This function is called by MAC Scheduler in the beginning of DL
@@ -43,11 +43,11 @@
     virtual std::vector<bool> GetAvailableDlRbg() = 0;
 
     /**
-     * \brief Check if UE can be served on i-th RB in DL
-     * \param i RBG ID
-     * \param rnti Radio Network Temporary Identity, an integer identifying the UE
+     * @brief Check if UE can be served on i-th RB in DL
+     * @param i RBG ID
+     * @param rnti Radio Network Temporary Identity, an integer identifying the UE
      *             where the report originates from
-     * \return true if UE can be served on i-th RB, false otherwise
+     * @return true if UE can be served on i-th RB, false otherwise
      *
      * This function is called by MAC Scheduler during DL scheduling process
      * to check if UE is allowed to be served with i-th RBG. Frequency Reuse
@@ -58,8 +58,8 @@
     virtual bool IsDlRbgAvailableForUe(int i, uint16_t rnti) = 0;
 
     /**
-     * \brief Get vector of available RB in UL for this Cell
-     * \return vector of size m_ulBandwidth; false indicates
+     * @brief Get vector of available RB in UL for this Cell
+     * @return vector of size m_ulBandwidth; false indicates
      *                    that RB is free to use, true otherwise
      *
      * This function is called by MAC Scheduler in the beginning of UL
@@ -70,11 +70,11 @@
     virtual std::vector<bool> GetAvailableUlRbg() = 0;
 
     /**
-     * \brief Check if UE can be served on i-th RB in UL
-     * \param i RB ID
-     * \param rnti Radio Network Temporary Identity, an integer identifying the UE
+     * @brief Check if UE can be served on i-th RB in UL
+     * @param i RB ID
+     * @param rnti Radio Network Temporary Identity, an integer identifying the UE
      *             where the report originates from
-     * \return true if UE can be served on i-th RB, false otherwise
+     * @return true if UE can be served on i-th RB, false otherwise
      *
      * This function is called by MAC Scheduler during UL scheduling process
      * to check if UE is allowed to be served with i-th RB. Frequency Reuse
@@ -85,41 +85,41 @@
     virtual bool IsUlRbgAvailableForUe(int i, uint16_t rnti) = 0;
 
     /**
-     * \brief ReportDlCqiInfo
-     * \param params the struct FfMacSchedSapProvider::SchedDlCqiInfoReqParameters
+     * @brief ReportDlCqiInfo
+     * @param params the struct FfMacSchedSapProvider::SchedDlCqiInfoReqParameters
      */
     virtual void ReportDlCqiInfo(
         const FfMacSchedSapProvider::SchedDlCqiInfoReqParameters& params) = 0;
 
     /**
-     * \brief ReportUlCqiInfo
-     * \param params the struct FfMacSchedSapProvider::SchedUlCqiInfoReqParameters
+     * @brief ReportUlCqiInfo
+     * @param params the struct FfMacSchedSapProvider::SchedUlCqiInfoReqParameters
      */
     virtual void ReportUlCqiInfo(
         const FfMacSchedSapProvider::SchedUlCqiInfoReqParameters& params) = 0;
 
     /**
-     * \brief ReportUlCqiInfo
-     * \param ulCqiMap the UL CQI map
+     * @brief ReportUlCqiInfo
+     * @param ulCqiMap the UL CQI map
      */
     virtual void ReportUlCqiInfo(std::map<uint16_t, std::vector<double>> ulCqiMap) = 0;
 
     /**
-     * \brief GetTpc
-     * \param rnti the RNTI
-     * \returns the TCP
+     * @brief GetTpc
+     * @param rnti the RNTI
+     * @returns the TCP
      */
     virtual uint8_t GetTpc(uint16_t rnti) = 0;
 
     /**
-     * \brief Get the minimum continuous Ul bandwidth
-     * \returns the minimum continuous UL bandwidth
+     * @brief Get the minimum continuous Ul bandwidth
+     * @returns the minimum continuous UL bandwidth
      */
     virtual uint16_t GetMinContinuousUlBandwidth() = 0;
 }; // end of class LteFfrSapProvider
 
 /**
- * \brief Service Access Point (SAP) offered by the eNodeB RRC instance to the
+ * @brief Service Access Point (SAP) offered by the eNodeB RRC instance to the
  *        Frequency Reuse algorithm instance.
  *
  * This is the *LteFfrSapUser*, i.e., the part of the SAP that
@@ -133,7 +133,7 @@
 }; // end of class LteFfrSapUser
 
 /**
- * \brief Template for the implementation of the LteFfrSapProvider
+ * @brief Template for the implementation of the LteFfrSapProvider
  *        as a member of an owner class of type C to which all methods are
  *        forwarded.
  */
@@ -144,7 +144,7 @@
     /**
      * Constructor
      *
-     * \param owner the owner class
+     * @param owner the owner class
      */
     MemberLteFfrSapProvider(C* owner);
 
@@ -239,7 +239,7 @@
 }
 
 /**
- * \brief Template for the implementation of the LteFfrSapUser
+ * @brief Template for the implementation of the LteFfrSapUser
  *        as a member of an owner class of type C to which all methods are
  *        forwarded.
  */
@@ -250,7 +250,7 @@
     /**
      * Constructor
      *
-     * \param owner the owner class
+     * @param owner the owner class
      */
     MemberLteFfrSapUser(C* owner);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-ffr-soft-algorithm.cc ns-3.44/src/lte/model/lte-ffr-soft-algorithm.cc
--- ns-3.43/src/lte/model/lte-ffr-soft-algorithm.cc	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-ffr-soft-algorithm.cc	2025-03-09 16:55:49.599372000 -0700
@@ -10,7 +10,7 @@
 #include "lte-ffr-soft-algorithm.h"
 
 #include "ns3/boolean.h"
-#include <ns3/log.h>
+#include "ns3/log.h"
 
 namespace ns3
 {
@@ -77,10 +77,10 @@
     {3, 100, 28, 48, 24},
 };
 
-/** \returns number of downlink configurations */
+/** @returns number of downlink configurations */
 const uint16_t NUM_DOWNLINK_CONFS(sizeof(g_ffrSoftDownlinkDefaultConfiguration) /
                                   sizeof(FfrSoftDownlinkDefaultConfiguration));
-/** \returns number of uplink configurations */
+/** @returns number of uplink configurations */
 const uint16_t NUM_UPLINK_CONFS(sizeof(g_ffrSoftUplinkDefaultConfiguration) /
                                 sizeof(FfrSoftUplinkDefaultConfiguration));
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-ffr-soft-algorithm.h ns-3.44/src/lte/model/lte-ffr-soft-algorithm.h
--- ns-3.43/src/lte/model/lte-ffr-soft-algorithm.h	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-ffr-soft-algorithm.h	2025-03-09 16:55:49.599372000 -0700
@@ -21,21 +21,21 @@
 {
 
 /**
- * \brief Soft Fractional Frequency Reuse algorithm implementation
+ * @brief Soft Fractional Frequency Reuse algorithm implementation
  */
 class LteFfrSoftAlgorithm : public LteFfrAlgorithm
 {
   public:
     /**
-     * \brief Creates a trivial ffr algorithm instance.
+     * @brief Creates a trivial ffr algorithm instance.
      */
     LteFfrSoftAlgorithm();
 
     ~LteFfrSoftAlgorithm() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -79,15 +79,15 @@
     /**
      * Set downlink configuration function
      *
-     * \param cellId the cell ID
-     * \param bandwidth the bandwidth
+     * @param cellId the cell ID
+     * @param bandwidth the bandwidth
      */
     void SetDownlinkConfiguration(uint16_t cellId, uint8_t bandwidth);
     /**
      * Set uplink configuration function
      *
-     * \param cellId the cell ID
-     * \param bandwidth the bandwidth
+     * @param cellId the cell ID
+     * @param bandwidth the bandwidth
      */
     void SetUplinkConfiguration(uint16_t cellId, uint8_t bandwidth);
     /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-fr-hard-algorithm.cc ns-3.44/src/lte/model/lte-fr-hard-algorithm.cc
--- ns-3.43/src/lte/model/lte-fr-hard-algorithm.cc	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-fr-hard-algorithm.cc	2025-03-09 16:55:49.599372000 -0700
@@ -9,7 +9,7 @@
 
 #include "lte-fr-hard-algorithm.h"
 
-#include <ns3/log.h>
+#include "ns3/log.h"
 
 namespace ns3
 {
@@ -74,10 +74,10 @@
     {3, 100, 64, 36},
 };
 
-/** \returns number of downlink configurations */
+/** @returns number of downlink configurations */
 const uint16_t NUM_DOWNLINK_CONFS(sizeof(g_frHardDownlinkDefaultConfiguration) /
                                   sizeof(FrHardDownlinkDefaultConfiguration));
-/** \returns number of uplink configurations */
+/** @returns number of uplink configurations */
 const uint16_t NUM_UPLINK_CONFS(sizeof(g_frHardUplinkDefaultConfiguration) /
                                 sizeof(FrHardUplinkDefaultConfiguration));
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-fr-hard-algorithm.h ns-3.44/src/lte/model/lte-fr-hard-algorithm.h
--- ns-3.43/src/lte/model/lte-fr-hard-algorithm.h	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-fr-hard-algorithm.h	2025-03-09 16:55:49.599372000 -0700
@@ -19,21 +19,21 @@
 {
 
 /**
- * \brief Hard Frequency Reuse algorithm implementation which uses only 1 sub-band.
+ * @brief Hard Frequency Reuse algorithm implementation which uses only 1 sub-band.
  */
 class LteFrHardAlgorithm : public LteFfrAlgorithm
 {
   public:
     /**
-     * \brief Creates a trivial ffr algorithm instance.
+     * @brief Creates a trivial ffr algorithm instance.
      */
     LteFrHardAlgorithm();
 
     ~LteFrHardAlgorithm() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -77,15 +77,15 @@
     /**
      * Set downlink configuration
      *
-     * \param cellId the cell ID
-     * \param bandwidth the bandwidth
+     * @param cellId the cell ID
+     * @param bandwidth the bandwidth
      */
     void SetDownlinkConfiguration(uint16_t cellId, uint8_t bandwidth);
     /**
      * Set uplink configuration
      *
-     * \param cellId the cell ID
-     * \param bandwidth the bandwidth
+     * @param cellId the cell ID
+     * @param bandwidth the bandwidth
      */
     void SetUplinkConfiguration(uint16_t cellId, uint8_t bandwidth);
     /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-fr-no-op-algorithm.cc ns-3.44/src/lte/model/lte-fr-no-op-algorithm.cc
--- ns-3.43/src/lte/model/lte-fr-no-op-algorithm.cc	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-fr-no-op-algorithm.cc	2025-03-09 16:55:49.599372000 -0700
@@ -9,7 +9,7 @@
 
 #include "lte-fr-no-op-algorithm.h"
 
-#include <ns3/log.h>
+#include "ns3/log.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-fr-no-op-algorithm.h ns-3.44/src/lte/model/lte-fr-no-op-algorithm.h
--- ns-3.43/src/lte/model/lte-fr-no-op-algorithm.h	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-fr-no-op-algorithm.h	2025-03-09 16:55:49.599372000 -0700
@@ -19,7 +19,7 @@
 {
 
 /**
- * \brief FR algorithm implementation which simply does nothing.
+ * @brief FR algorithm implementation which simply does nothing.
  *
  * Selecting this FR algorithm is equivalent to disabling FFR.
  * This is the default choice.
@@ -31,15 +31,15 @@
 {
   public:
     /**
-     * \brief Creates a NoOP FR algorithm instance.
+     * @brief Creates a NoOP FR algorithm instance.
      */
     LteFrNoOpAlgorithm();
 
     ~LteFrNoOpAlgorithm() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-fr-soft-algorithm.cc ns-3.44/src/lte/model/lte-fr-soft-algorithm.cc
--- ns-3.43/src/lte/model/lte-fr-soft-algorithm.cc	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-fr-soft-algorithm.cc	2025-03-09 16:55:49.599372000 -0700
@@ -10,7 +10,7 @@
 #include "lte-fr-soft-algorithm.h"
 
 #include "ns3/boolean.h"
-#include <ns3/log.h>
+#include "ns3/log.h"
 
 namespace ns3
 {
@@ -75,10 +75,10 @@
     {3, 100, 64, 36},
 };
 
-/** \returns number of downlink configurations */
+/** @returns number of downlink configurations */
 const uint16_t NUM_DOWNLINK_CONFS(sizeof(g_frSoftDownlinkDefaultConfiguration) /
                                   sizeof(FrSoftDownlinkDefaultConfiguration));
-/** \returns number of uplink configurations */
+/** @returns number of uplink configurations */
 const uint16_t NUM_UPLINK_CONFS(sizeof(g_frSoftUplinkDefaultConfiguration) /
                                 sizeof(FrSoftUplinkDefaultConfiguration));
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-fr-soft-algorithm.h ns-3.44/src/lte/model/lte-fr-soft-algorithm.h
--- ns-3.43/src/lte/model/lte-fr-soft-algorithm.h	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-fr-soft-algorithm.h	2025-03-09 16:55:49.599372000 -0700
@@ -21,21 +21,21 @@
 {
 
 /**
- * \brief Soft Frequency Reuse algorithm implementation
+ * @brief Soft Frequency Reuse algorithm implementation
  */
 class LteFrSoftAlgorithm : public LteFfrAlgorithm
 {
   public:
     /**
-     * \brief Creates a trivial ffr algorithm instance.
+     * @brief Creates a trivial ffr algorithm instance.
      */
     LteFrSoftAlgorithm();
 
     ~LteFrSoftAlgorithm() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -79,15 +79,15 @@
     /**
      * Set downlink configuration
      *
-     * \param cellId the cell ID
-     * \param bandwidth the bandwidth
+     * @param cellId the cell ID
+     * @param bandwidth the bandwidth
      */
     void SetDownlinkConfiguration(uint16_t cellId, uint8_t bandwidth);
     /**
      * Set uplink configuration
      *
-     * \param cellId the cell ID
-     * \param bandwidth the bandwidth
+     * @param cellId the cell ID
+     * @param bandwidth the bandwidth
      */
     void SetUplinkConfiguration(uint16_t cellId, uint8_t bandwidth);
     /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-fr-strict-algorithm.cc ns-3.44/src/lte/model/lte-fr-strict-algorithm.cc
--- ns-3.43/src/lte/model/lte-fr-strict-algorithm.cc	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-fr-strict-algorithm.cc	2025-03-09 16:55:49.599372000 -0700
@@ -10,7 +10,7 @@
 #include "lte-fr-strict-algorithm.h"
 
 #include "ns3/boolean.h"
-#include <ns3/log.h>
+#include "ns3/log.h"
 
 namespace ns3
 {
@@ -77,10 +77,10 @@
     {3, 100, 28, 48, 24},
 };
 
-/** \returns number of downlink configurations */
+/** @returns number of downlink configurations */
 const uint16_t NUM_DOWNLINK_CONFS(sizeof(g_frStrictDownlinkDefaultConfiguration) /
                                   sizeof(FrStrictDownlinkDefaultConfiguration));
-/** \returns number of uplink configurations */
+/** @returns number of uplink configurations */
 const uint16_t NUM_UPLINK_CONFS(sizeof(g_frStrictUplinkDefaultConfiguration) /
                                 sizeof(FrStrictUplinkDefaultConfiguration));
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-fr-strict-algorithm.h ns-3.44/src/lte/model/lte-fr-strict-algorithm.h
--- ns-3.43/src/lte/model/lte-fr-strict-algorithm.h	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-fr-strict-algorithm.h	2025-03-09 16:55:49.599372000 -0700
@@ -21,21 +21,21 @@
 {
 
 /**
- * \brief Strict Frequency Reuse algorithm implementation
+ * @brief Strict Frequency Reuse algorithm implementation
  */
 class LteFrStrictAlgorithm : public LteFfrAlgorithm
 {
   public:
     /**
-     * \brief Creates a trivial ffr algorithm instance.
+     * @brief Creates a trivial ffr algorithm instance.
      */
     LteFrStrictAlgorithm();
 
     ~LteFrStrictAlgorithm() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -79,15 +79,15 @@
     /**
      * Set downlink configuration
      *
-     * \param cellId the cell ID
-     * \param bandwidth the bandwidth
+     * @param cellId the cell ID
+     * @param bandwidth the bandwidth
      */
     void SetDownlinkConfiguration(uint16_t cellId, uint8_t bandwidth);
     /**
      * Set uplink configuration
      *
-     * \param cellId the cell ID
-     * \param bandwidth the bandwidth
+     * @param cellId the cell ID
+     * @param bandwidth the bandwidth
      */
     void SetUplinkConfiguration(uint16_t cellId, uint8_t bandwidth);
     /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-handover-algorithm.cc ns-3.44/src/lte/model/lte-handover-algorithm.cc
--- ns-3.43/src/lte/model/lte-handover-algorithm.cc	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-handover-algorithm.cc	2025-03-09 16:55:49.599372000 -0700
@@ -9,7 +9,7 @@
 
 #include "lte-handover-algorithm.h"
 
-#include <ns3/log.h>
+#include "ns3/log.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-handover-algorithm.h ns-3.44/src/lte/model/lte-handover-algorithm.h
--- ns-3.43/src/lte/model/lte-handover-algorithm.h	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-handover-algorithm.h	2025-03-09 16:55:49.599372000 -0700
@@ -12,7 +12,7 @@
 
 #include "lte-rrc-sap.h"
 
-#include <ns3/object.h>
+#include "ns3/object.h"
 
 namespace ns3
 {
@@ -21,7 +21,7 @@
 class LteHandoverManagementSapProvider;
 
 /**
- * \brief The abstract base class of a handover algorithm that operates using
+ * @brief The abstract base class of a handover algorithm that operates using
  *        the Handover Management SAP interface.
  *
  * Handover algorithm receives measurement reports from an eNodeB RRC instance
@@ -58,22 +58,22 @@
     ~LteHandoverAlgorithm() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Set the "user" part of the Handover Management SAP interface that
+     * @brief Set the "user" part of the Handover Management SAP interface that
      *        this handover algorithm instance will interact with.
-     * \param s a reference to the "user" part of the interface, typically a
+     * @param s a reference to the "user" part of the interface, typically a
      *          member of an LteEnbRrc instance
      */
     virtual void SetLteHandoverManagementSapUser(LteHandoverManagementSapUser* s) = 0;
 
     /**
-     * \brief Export the "provider" part of the Handover Management SAP interface.
-     * \return the reference to the "provider" part of the interface, typically to
+     * @brief Export the "provider" part of the Handover Management SAP interface.
+     * @return the reference to the "provider" part of the interface, typically to
      *         be kept by an LteEnbRrc instance
      */
     virtual LteHandoverManagementSapProvider* GetLteHandoverManagementSapProvider() = 0;
@@ -85,10 +85,10 @@
     // HANDOVER MANAGEMENT SAP PROVIDER IMPLEMENTATION
 
     /**
-     * \brief Implementation of LteHandoverManagementSapProvider::ReportUeMeas.
-     * \param rnti Radio Network Temporary Identity, an integer identifying the UE
+     * @brief Implementation of LteHandoverManagementSapProvider::ReportUeMeas.
+     * @param rnti Radio Network Temporary Identity, an integer identifying the UE
      *             where the report originates from
-     * \param measResults a single report of one measurement identity
+     * @param measResults a single report of one measurement identity
      */
     virtual void DoReportUeMeas(uint16_t rnti, LteRrcSap::MeasResults measResults) = 0;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-handover-management-sap.h ns-3.44/src/lte/model/lte-handover-management-sap.h
--- ns-3.43/src/lte/model/lte-handover-management-sap.h	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-handover-management-sap.h	2025-03-09 16:55:49.599372000 -0700
@@ -16,7 +16,7 @@
 {
 
 /**
- * \brief Service Access Point (SAP) offered by the handover algorithm instance
+ * @brief Service Access Point (SAP) offered by the handover algorithm instance
  *        to the eNodeB RRC instance.
  *
  * This is the *Handover Management SAP Provider*, i.e., the part of the SAP
@@ -29,10 +29,10 @@
     virtual ~LteHandoverManagementSapProvider();
 
     /**
-     * \brief Send a UE measurement report to handover algorithm.
-     * \param rnti Radio Network Temporary Identity, an integer identifying the UE
+     * @brief Send a UE measurement report to handover algorithm.
+     * @param rnti Radio Network Temporary Identity, an integer identifying the UE
      *             where the report originates from
-     * \param measResults a single report of one measurement identity
+     * @param measResults a single report of one measurement identity
      *
      * The received measurement report is a result of the UE measurement
      * configuration previously configured by calling
@@ -44,7 +44,7 @@
 }; // end of class LteHandoverManagementSapProvider
 
 /**
- * \brief Service Access Point (SAP) offered by the eNodeB RRC instance to the
+ * @brief Service Access Point (SAP) offered by the eNodeB RRC instance to the
  *        handover algorithm instance.
  *
  * This is the *Handover Management SAP User*, i.e., the part of the SAP that
@@ -56,10 +56,10 @@
     virtual ~LteHandoverManagementSapUser();
 
     /**
-     * \brief Request a certain reporting configuration to be fulfilled by the UEs
+     * @brief Request a certain reporting configuration to be fulfilled by the UEs
      *        attached to the eNodeB entity.
-     * \param reportConfig the UE measurement reporting configuration
-     * \return the measurement identities associated with this newly added
+     * @param reportConfig the UE measurement reporting configuration
+     * @return the measurement identities associated with this newly added
      *         reporting configuration
      *
      * The eNodeB RRC entity is expected to configure the same reporting
@@ -69,16 +69,16 @@
      * handover algorithm through the LteHandoverManagementSapProvider::ReportUeMeas
      * SAP function.
      *
-     * \note This function is only valid before the simulation begins.
+     * @note This function is only valid before the simulation begins.
      */
     virtual std::vector<uint8_t> AddUeMeasReportConfigForHandover(
         LteRrcSap::ReportConfigEutra reportConfig) = 0;
 
     /**
-     * \brief Instruct the eNodeB RRC entity to prepare a handover.
-     * \param rnti Radio Network Temporary Identity, an integer identifying the
+     * @brief Instruct the eNodeB RRC entity to prepare a handover.
+     * @param rnti Radio Network Temporary Identity, an integer identifying the
      *             UE which shall perform the handover
-     * \param targetCellId the cell ID of the target eNodeB
+     * @param targetCellId the cell ID of the target eNodeB
      *
      * This function is used by the handover algorithm entity when a handover
      * decision has been reached.
@@ -92,7 +92,7 @@
 }; // end of class LteHandoverManagementSapUser
 
 /**
- * \brief Template for the implementation of the LteHandoverManagementSapProvider
+ * @brief Template for the implementation of the LteHandoverManagementSapProvider
  *        as a member of an owner class of type C to which all methods are
  *        forwarded.
  */
@@ -103,7 +103,7 @@
     /**
      * Constructor
      *
-     * \param owner the owner class
+     * @param owner the owner class
      */
     MemberLteHandoverManagementSapProvider(C* owner);
 
@@ -133,7 +133,7 @@
 }
 
 /**
- * \brief Template for the implementation of the LteHandoverManagementSapUser
+ * @brief Template for the implementation of the LteHandoverManagementSapUser
  *        as a member of an owner class of type C to which all methods are
  *        forwarded.
  */
@@ -144,7 +144,7 @@
     /**
      * Constructor
      *
-     * \param owner the owner class
+     * @param owner the owner class
      */
     MemberLteHandoverManagementSapUser(C* owner);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-harq-phy.cc ns-3.44/src/lte/model/lte-harq-phy.cc
--- ns-3.43/src/lte/model/lte-harq-phy.cc	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-harq-phy.cc	2025-03-09 16:55:49.603371900 -0700
@@ -8,8 +8,8 @@
 
 #include "lte-harq-phy.h"
 
-#include <ns3/assert.h>
-#include <ns3/log.h>
+#include "ns3/assert.h"
+#include "ns3/log.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-harq-phy.h ns-3.44/src/lte/model/lte-harq-phy.h
--- ns-3.43/src/lte/model/lte-harq-phy.h	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-harq-phy.h	2025-03-09 16:55:49.603371900 -0700
@@ -9,9 +9,9 @@
 #ifndef LTE_HARQ_PHY_MODULE_H
 #define LTE_HARQ_PHY_MODULE_H
 
-#include <ns3/assert.h>
-#include <ns3/log.h>
-#include <ns3/simple-ref-count.h>
+#include "ns3/assert.h"
+#include "ns3/log.h"
+#include "ns3/simple-ref-count.h"
 
 #include <map>
 #include <math.h>
@@ -33,8 +33,8 @@
     HarqProcessInfoList_t; ///< HarqProcessInfoList_t typedef
 
 /**
- * \ingroup lte
- * \brief The LteHarqPhy class implements the HARQ functionalities related to PHY layer
+ * @ingroup lte
+ * @brief The LteHarqPhy class implements the HARQ functionalities related to PHY layer
  *(i.e., decodification buffers for incremental redundancy management)
  *
  */
@@ -45,55 +45,55 @@
     ~LteHarqPhy();
 
     /**
-     * \brief Subframe Indication function
-     * \param frameNo the frame number
-     * \param subframeNo the subframe number
+     * @brief Subframe Indication function
+     * @param frameNo the frame number
+     * @param subframeNo the subframe number
      */
     void SubframeIndication(uint32_t frameNo, uint32_t subframeNo);
 
     /**
-     * \brief Return the cumulated MI of the HARQ procId in case of retransmissions
+     * @brief Return the cumulated MI of the HARQ procId in case of retransmissions
      * for DL (asynchronous)
-     * \param harqProcId the HARQ proc id
-     * \param layer layer no. (for MIMO spatial multiplexing)
-     * \return the MI accumulated
+     * @param harqProcId the HARQ proc id
+     * @param layer layer no. (for MIMO spatial multiplexing)
+     * @return the MI accumulated
      */
     double GetAccumulatedMiDl(uint8_t harqProcId, uint8_t layer);
 
     /**
-     * \brief Return the info of the HARQ procId in case of retransmissions
+     * @brief Return the info of the HARQ procId in case of retransmissions
      * for DL (asynchronous)
-     * \param harqProcId the HARQ proc id
-     * \param layer layer no. (for MIMO spatial multiplexing)
-     * \return the vector of the info related to HARQ proc Id
+     * @param harqProcId the HARQ proc id
+     * @param layer layer no. (for MIMO spatial multiplexing)
+     * @return the vector of the info related to HARQ proc Id
      */
     HarqProcessInfoList_t GetHarqProcessInfoDl(uint8_t harqProcId, uint8_t layer);
 
     /**
-     * \brief Return the cumulated MI of the HARQ procId in case of retransmissions
+     * @brief Return the cumulated MI of the HARQ procId in case of retransmissions
      * for UL (synchronous)
-     * \param rnti the RNTI of the transmitter
-     * \return the MI accumulated
+     * @param rnti the RNTI of the transmitter
+     * @return the MI accumulated
      */
     double GetAccumulatedMiUl(uint16_t rnti);
 
     /**
-     * \brief Return the info of the HARQ procId in case of retransmissions
+     * @brief Return the info of the HARQ procId in case of retransmissions
      * for UL (asynchronous)
-     * \param rnti the RNTI of the transmitter
-     * \param harqProcId the HARQ proc id
-     * \return the vector of the info related to HARQ proc Id
+     * @param rnti the RNTI of the transmitter
+     * @param harqProcId the HARQ proc id
+     * @return the vector of the info related to HARQ proc Id
      */
     HarqProcessInfoList_t GetHarqProcessInfoUl(uint16_t rnti, uint8_t harqProcId);
 
     /**
-     * \brief Update the Info associated to the decodification of an HARQ process
+     * @brief Update the Info associated to the decodification of an HARQ process
      * for DL (asynchronous)
-     * \param id the HARQ proc id
-     * \param layer layer no. (for MIMO spatial multiplexing)
-     * \param mi the new MI
-     * \param infoBytes the no. of bytes of info
-     * \param codeBytes the total no. of bytes txed
+     * @param id the HARQ proc id
+     * @param layer layer no. (for MIMO spatial multiplexing)
+     * @param mi the new MI
+     * @param infoBytes the no. of bytes of info
+     * @param codeBytes the total no. of bytes txed
      */
     void UpdateDlHarqProcessStatus(uint8_t id,
                                    uint8_t layer,
@@ -102,19 +102,19 @@
                                    uint16_t codeBytes);
 
     /**
-     * \brief Reset the info associated to the decodification of an HARQ process
+     * @brief Reset the info associated to the decodification of an HARQ process
      * for DL (asynchronous)
-     * \param id the HARQ proc id
+     * @param id the HARQ proc id
      */
     void ResetDlHarqProcessStatus(uint8_t id);
 
     /**
-     * \brief Update the MI value associated to the decodification of an HARQ process
+     * @brief Update the MI value associated to the decodification of an HARQ process
      * for DL (asynchronous)
-     * \param rnti the RNTI of the transmitter
-     * \param mi the new MI
-     * \param infoBytes the no. of bytes of info
-     * \param codeBytes the total no. of bytes txed
+     * @param rnti the RNTI of the transmitter
+     * @param mi the new MI
+     * @param infoBytes the no. of bytes of info
+     * @param codeBytes the total no. of bytes txed
      */
     void UpdateUlHarqProcessStatus(uint16_t rnti,
                                    double mi,
@@ -122,17 +122,17 @@
                                    uint16_t codeBytes);
 
     /**
-     * \brief Reset  the info associated to the decodification of an HARQ process
+     * @brief Reset  the info associated to the decodification of an HARQ process
      * for DL (asynchronous)
-     * \param rnti the RNTI of the transmitter
-     * \param id the HARQ proc id
+     * @param rnti the RNTI of the transmitter
+     * @param id the HARQ proc id
      */
     void ResetUlHarqProcessStatus(uint16_t rnti, uint8_t id);
 
     /**
-     * \brief Clear the downlink HARQ buffer
+     * @brief Clear the downlink HARQ buffer
      *
-     * \param rnti the RNTI of the UE
+     * @param rnti the RNTI of the UE
      */
     void ClearDlHarqBuffer(uint16_t rnti);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-interference.cc ns-3.44/src/lte/model/lte-interference.cc
--- ns-3.43/src/lte/model/lte-interference.cc	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-interference.cc	2025-03-09 16:55:49.603371900 -0700
@@ -10,8 +10,8 @@
 
 #include "lte-chunk-processor.h"
 
-#include <ns3/log.h>
-#include <ns3/simulator.h>
+#include "ns3/log.h"
+#include "ns3/simulator.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-interference.h ns-3.44/src/lte/model/lte-interference.h
--- ns-3.43/src/lte/model/lte-interference.h	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-interference.h	2025-03-09 16:55:49.603371900 -0700
@@ -9,10 +9,10 @@
 #ifndef LTE_INTERFERENCE_H
 #define LTE_INTERFERENCE_H
 
-#include <ns3/nstime.h>
-#include <ns3/object.h>
-#include <ns3/packet.h>
-#include <ns3/spectrum-value.h>
+#include "ns3/nstime.h"
+#include "ns3/object.h"
+#include "ns3/packet.h"
+#include "ns3/spectrum-value.h"
 
 #include <list>
 
@@ -33,14 +33,14 @@
     ~LteInterference() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     void DoDispose() override;
 
     /**
-     * \brief Add a LteChunkProcessor that will use the time-vs-frequency SINR
+     * @brief Add a LteChunkProcessor that will use the time-vs-frequency SINR
      * calculated by this LteInterference instance. Note that all the
      * added LteChunkProcessors will work in parallel.
      *
@@ -49,7 +49,7 @@
     virtual void AddSinrChunkProcessor(Ptr<LteChunkProcessor> p);
 
     /**
-     * \brief Add a LteChunkProcessor that will use the time-vs-frequency
+     * @brief Add a LteChunkProcessor that will use the time-vs-frequency
      * interference calculated by this LteInterference instance. Note
      * that all the added LteChunkProcessors will work in parallel.
      *
@@ -67,7 +67,7 @@
     virtual void AddRsPowerChunkProcessor(Ptr<LteChunkProcessor> p);
 
     /**
-     * \brief Notify that the PHY is starting a RX attempt
+     * @brief Notify that the PHY is starting a RX attempt
      *
      * @param rxPsd the power spectral density of the signal being RX
      */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-mac-sap.h ns-3.44/src/lte/model/lte-mac-sap.h
--- ns-3.43/src/lte/model/lte-mac-sap.h	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-mac-sap.h	2025-03-09 16:55:49.603371900 -0700
@@ -9,7 +9,7 @@
 #ifndef LTE_MAC_SAP_H
 #define LTE_MAC_SAP_H
 
-#include <ns3/packet.h>
+#include "ns3/packet.h"
 
 namespace ns3
 {
@@ -47,7 +47,7 @@
      * send an RLC PDU to the MAC for transmission. This method is to be
      * called as a response to LteMacSapUser::NotifyTxOpportunity
      *
-     * \param params TransmitPduParameters
+     * @param params TransmitPduParameters
      */
     virtual void TransmitPdu(TransmitPduParameters params) = 0;
 
@@ -69,7 +69,7 @@
     /**
      * Report the RLC buffer status to the MAC
      *
-     * \param params ReportBufferStatusParameters
+     * @param params ReportBufferStatusParameters
      */
     virtual void ReportBufferStatus(ReportBufferStatusParameters params) = 0;
 };
@@ -93,13 +93,13 @@
     struct TxOpportunityParameters
     {
         /**
-         * \brief TxOpportunityParameters constructor
-         * \param bytes Bytes
-         * \param layer Layer
-         * \param harqId HarqID
-         * \param ccId Component carrier ID
-         * \param rnti RNTI
-         * \param lcId Logical Channel ID
+         * @brief TxOpportunityParameters constructor
+         * @param bytes Bytes
+         * @param layer Layer
+         * @param harqId HarqID
+         * @param ccId Component carrier ID
+         * @param rnti RNTI
+         * @param lcId Logical Channel ID
          */
         TxOpportunityParameters(uint32_t bytes,
                                 uint8_t layer,
@@ -117,7 +117,7 @@
         }
 
         /**
-         * \brief TxOpportunityParameters default constructor (DEPRECATED)
+         * @brief TxOpportunityParameters default constructor (DEPRECATED)
          */
         TxOpportunityParameters()
         {
@@ -135,7 +135,7 @@
      * Called by the MAC to notify the RLC that the scheduler granted a
      * transmission opportunity to this RLC instance.
      *
-     * \param params the TxOpportunityParameters
+     * @param params the TxOpportunityParameters
      */
     virtual void NotifyTxOpportunity(TxOpportunityParameters params) = 0;
 
@@ -154,17 +154,17 @@
     struct ReceivePduParameters
     {
         /**
-         * \brief ReceivePduParameters default constructor (DEPRECATED)
+         * @brief ReceivePduParameters default constructor (DEPRECATED)
          */
         ReceivePduParameters()
         {
         }
 
         /**
-         * \brief ReceivePduParameters constructor
-         * \param p Packet
-         * \param rnti RNTI
-         * \param lcid Logical Channel ID
+         * @brief ReceivePduParameters constructor
+         * @param p Packet
+         * @param rnti RNTI
+         * @param lcid Logical Channel ID
          */
         ReceivePduParameters(const Ptr<Packet>& p, uint16_t rnti, uint8_t lcid)
         {
@@ -181,7 +181,7 @@
     /**
      * Called by the MAC to notify the RLC of the reception of a new PDU
      *
-     * \param params the ReceivePduParameters
+     * @param params the ReceivePduParameters
      */
     virtual void ReceivePdu(ReceivePduParameters params) = 0;
 };
@@ -194,7 +194,7 @@
     /**
      * Constructor
      *
-     * \param mac the MAC class
+     * @param mac the MAC class
      */
     EnbMacMemberLteMacSapProvider(C* mac);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-mi-error-model.cc ns-3.44/src/lte/model/lte-mi-error-model.cc
--- ns-3.43/src/lte/model/lte-mi-error-model.cc	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-mi-error-model.cc	2025-03-09 16:55:49.603371900 -0700
@@ -19,8 +19,8 @@
 
 #include "lte-mi-error-model.h"
 
-#include <ns3/log.h>
-#include <ns3/pointer.h>
+#include "ns3/log.h"
+#include "ns3/pointer.h"
 
 #include <cmath>
 #include <list>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-mi-error-model.h ns-3.44/src/lte/model/lte-mi-error-model.h
--- ns-3.43/src/lte/model/lte-mi-error-model.h	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-mi-error-model.h	2025-03-09 16:55:49.603371900 -0700
@@ -22,8 +22,8 @@
 
 #include "lte-harq-phy.h"
 
-#include <ns3/ptr.h>
-#include <ns3/spectrum-value.h>
+#include "ns3/ptr.h"
+#include "ns3/spectrum-value.h"
 
 #include <list>
 #include <stdint.h>
@@ -67,31 +67,31 @@
 {
   public:
     /**
-     * \brief find the mmib (mean mutual information per bit) for different modulations of the
+     * @brief find the mmib (mean mutual information per bit) for different modulations of the
      * specified TB
-     * \param sinr the perceived sinr values in the whole bandwidth in Watt
-     * \param map the active RBs for the TB
-     * \param mcs the MCS of the TB
-     * \return the mmib
+     * @param sinr the perceived sinr values in the whole bandwidth in Watt
+     * @param map the active RBs for the TB
+     * @param mcs the MCS of the TB
+     * @return the mmib
      */
     static double Mib(const SpectrumValue& sinr, const std::vector<int>& map, uint8_t mcs);
     /**
-     * \brief map the mmib (mean mutual information per bit) for different MCS
-     * \param mib mean mutual information per bit of a code-block
-     * \param ecrId Effective Code Rate ID
-     * \param cbSize the size of the CB
-     * \return the code block error rate
+     * @brief map the mmib (mean mutual information per bit) for different MCS
+     * @param mib mean mutual information per bit of a code-block
+     * @param ecrId Effective Code Rate ID
+     * @param cbSize the size of the CB
+     * @return the code block error rate
      */
     static double MappingMiBler(double mib, uint8_t ecrId, uint16_t cbSize);
 
     /**
-     * \brief run the error-model algorithm for the specified TB
-     * \param sinr the perceived sinr values in the whole bandwidth in Watt
-     * \param map the active RBs for the TB
-     * \param size the size in bytes of the TB
-     * \param mcs the MCS of the TB
-     * \param miHistory MI of past transmissions (in case of retx)
-     * \return the TB error rate and MI
+     * @brief run the error-model algorithm for the specified TB
+     * @param sinr the perceived sinr values in the whole bandwidth in Watt
+     * @param map the active RBs for the TB
+     * @param size the size in bytes of the TB
+     * @param mcs the MCS of the TB
+     * @param miHistory MI of past transmissions (in case of retx)
+     * @return the TB error rate and MI
      */
     static TbStats_t GetTbDecodificationStats(const SpectrumValue& sinr,
                                               const std::vector<int>& map,
@@ -100,9 +100,9 @@
                                               HarqProcessInfoList_t miHistory);
 
     /**
-     * \brief run the error-model algorithm for the specified PCFICH+PDCCH channels
-     * \param sinr the perceived sinr values in the whole bandwidth in Watt
-     * \return the decodification error of the PCFICH+PDCCH channels
+     * @brief run the error-model algorithm for the specified PCFICH+PDCCH channels
+     * @param sinr the perceived sinr values in the whole bandwidth in Watt
+     * @return the decodification error of the PCFICH+PDCCH channels
      */
     static double GetPcfichPdcchError(const SpectrumValue& sinr);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-net-device.cc ns-3.44/src/lte/model/lte-net-device.cc
--- ns-3.43/src/lte/model/lte-net-device.cc	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-net-device.cc	2025-03-09 16:55:49.603371900 -0700
@@ -13,8 +13,11 @@
 #include "ns3/channel.h"
 #include "ns3/enum.h"
 #include "ns3/ipv4-header.h"
+#include "ns3/ipv4-l3-protocol.h"
 #include "ns3/ipv6-header.h"
+#include "ns3/ipv6-l3-protocol.h"
 #include "ns3/llc-snap-header.h"
+#include "ns3/log.h"
 #include "ns3/node.h"
 #include "ns3/packet-burst.h"
 #include "ns3/packet.h"
@@ -22,9 +25,6 @@
 #include "ns3/simulator.h"
 #include "ns3/trace-source-accessor.h"
 #include "ns3/uinteger.h"
-#include <ns3/ipv4-l3-protocol.h>
-#include <ns3/ipv6-l3-protocol.h>
-#include <ns3/log.h>
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-net-device.h ns-3.44/src/lte/model/lte-net-device.h
--- ns-3.43/src/lte/model/lte-net-device.h	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-net-device.h	2025-03-09 16:55:49.603371900 -0700
@@ -10,11 +10,11 @@
 #ifndef LTE_NET_DEVICE_H
 #define LTE_NET_DEVICE_H
 
-#include <ns3/event-id.h>
-#include <ns3/mac64-address.h>
-#include <ns3/net-device.h>
-#include <ns3/nstime.h>
-#include <ns3/traced-callback.h>
+#include "ns3/event-id.h"
+#include "ns3/mac64-address.h"
+#include "ns3/net-device.h"
+#include "ns3/nstime.h"
+#include "ns3/traced-callback.h"
 
 namespace ns3
 {
@@ -23,12 +23,12 @@
 class Packet;
 
 /**
- * \defgroup lte LTE Models
+ * @defgroup lte LTE Models
  *
  */
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
  * LteNetDevice provides  basic implementation for all LTE network devices
  */
@@ -36,8 +36,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -81,7 +81,7 @@
     /**
      * receive a packet from the lower layers in order to forward it to the upper layers
      *
-     * \param p the packet
+     * @param p the packet
      */
     void Receive(Ptr<Packet> p);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-pdcp.cc ns-3.44/src/lte/model/lte-pdcp.cc
--- ns-3.43/src/lte/model/lte-pdcp.cc	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-pdcp.cc	2025-03-09 16:55:49.603371900 -0700
@@ -27,7 +27,7 @@
     /**
      * Constructor
      *
-     * \param pdcp PDCP
+     * @param pdcp PDCP
      */
     LtePdcpSpecificLteRlcSapUser(LtePdcp* pdcp);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-pdcp.h ns-3.44/src/lte/model/lte-pdcp.h
--- ns-3.43/src/lte/model/lte-pdcp.h	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-pdcp.h	2025-03-09 16:55:49.603371900 -0700
@@ -33,8 +33,8 @@
     LtePdcp();
     ~LtePdcp() override;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     void DoDispose() override;
@@ -42,42 +42,42 @@
     /**
      *
      *
-     * \param rnti
+     * @param rnti
      */
     void SetRnti(uint16_t rnti);
 
     /**
      *
      *
-     * \param lcId
+     * @param lcId
      */
     void SetLcId(uint8_t lcId);
 
     /**
      *
      *
-     * \param s the PDCP SAP user to be used by this LTE_PDCP
+     * @param s the PDCP SAP user to be used by this LTE_PDCP
      */
     void SetLtePdcpSapUser(LtePdcpSapUser* s);
 
     /**
      *
      *
-     * \return the PDCP SAP Provider interface offered to the RRC by this LTE_PDCP
+     * @return the PDCP SAP Provider interface offered to the RRC by this LTE_PDCP
      */
     LtePdcpSapProvider* GetLtePdcpSapProvider();
 
     /**
      *
      *
-     * \param s the RLC SAP Provider to be used by this LTE_PDCP
+     * @param s the RLC SAP Provider to be used by this LTE_PDCP
      */
     void SetLteRlcSapProvider(LteRlcSapProvider* s);
 
     /**
      *
      *
-     * \return the RLC SAP User interface offered to the RLC by this LTE_PDCP
+     * @return the RLC SAP User interface offered to the RLC by this LTE_PDCP
      */
     LteRlcSapUser* GetLteRlcSapUser();
 
@@ -95,35 +95,35 @@
 
     /**
      *
-     * \return the current status of the PDCP
+     * @return the current status of the PDCP
      */
     Status GetStatus() const;
 
     /**
      * Set the status of the PDCP
      *
-     * \param s
+     * @param s
      */
     void SetStatus(Status s);
 
     /**
      * TracedCallback for PDU transmission event.
      *
-     * \param [in] rnti The C-RNTI identifying the UE.
-     * \param [in] lcid The logical channel id corresponding to
+     * @param [in] rnti The C-RNTI identifying the UE.
+     * @param [in] lcid The logical channel id corresponding to
      *             the sending RLC instance.
-     * \param [in] size Packet size.
+     * @param [in] size Packet size.
      */
     typedef void (*PduTxTracedCallback)(uint16_t rnti, uint8_t lcid, uint32_t size);
 
     /**
      * TracedCallback signature for PDU receive event.
      *
-     * \param [in] rnti The C-RNTI identifying the UE.
-     * \param [in] lcid The logical channel id corresponding to
+     * @param [in] rnti The C-RNTI identifying the UE.
+     * @param [in] lcid The logical channel id corresponding to
      *             the sending RLC instance.
-     * \param [in] size Packet size.
-     * \param [in] delay Delay since packet sent, in ns..
+     * @param [in] size Packet size.
+     * @param [in] delay Delay since packet sent, in ns..
      */
     typedef void (*PduRxTracedCallback)(const uint16_t rnti,
                                         const uint8_t lcid,
@@ -134,7 +134,7 @@
     /**
      * Interface provided to upper RRC entity
      *
-     * \param params the TransmitPdcpSduParameters
+     * @param params the TransmitPdcpSduParameters
      */
     virtual void DoTransmitPdcpSdu(LtePdcpSapProvider::TransmitPdcpSduParameters params);
 
@@ -144,7 +144,7 @@
     /**
      * Interface provided to lower RLC entity
      *
-     * \param p packet
+     * @param p packet
      */
     virtual void DoReceivePdu(Ptr<Packet> p);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-pdcp-header.h ns-3.44/src/lte/model/lte-pdcp-header.h
--- ns-3.43/src/lte/model/lte-pdcp-header.h	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-pdcp-header.h	2025-03-09 16:55:49.603371900 -0700
@@ -17,8 +17,8 @@
 {
 
 /**
- * \ingroup lte
- * \brief The packet header for the Packet Data Convergence Protocol (PDCP) packets
+ * @ingroup lte
+ * @brief The packet header for the Packet Data Convergence Protocol (PDCP) packets
  *
  * This class has fields corresponding to those in an PDCP header as well as
  * methods for serialization to and deserialization from a byte buffer.
@@ -28,7 +28,7 @@
 {
   public:
     /**
-     * \brief Constructor
+     * @brief Constructor
      *
      * Creates a null header
      */
@@ -36,28 +36,28 @@
     ~LtePdcpHeader() override;
 
     /**
-     * \brief Set DC bit
+     * @brief Set DC bit
      *
-     * \param dcBit DC bit to set
+     * @param dcBit DC bit to set
      */
     void SetDcBit(uint8_t dcBit);
     /**
-     * \brief Set sequence number
+     * @brief Set sequence number
      *
-     * \param sequenceNumber sequence number
+     * @param sequenceNumber sequence number
      */
     void SetSequenceNumber(uint16_t sequenceNumber);
 
     /**
-     * \brief Get DC bit
+     * @brief Get DC bit
      *
-     * \returns DC bit
+     * @returns DC bit
      */
     uint8_t GetDcBit() const;
     /**
-     * \brief Get sequence number
+     * @brief Get sequence number
      *
-     * \returns sequence number
+     * @returns sequence number
      */
     uint16_t GetSequenceNumber() const;
 
@@ -69,8 +69,8 @@
     } DcBit_t; ///< DcBit_t typedef
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-pdcp-sap.h ns-3.44/src/lte/model/lte-pdcp-sap.h
--- ns-3.43/src/lte/model/lte-pdcp-sap.h	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-pdcp-sap.h	2025-03-09 16:55:49.603371900 -0700
@@ -42,7 +42,7 @@
      * This method is to be called when upper RRC entity has a
      * RRC PDU ready to send
      *
-     * \param params Parameters
+     * @param params Parameters
      */
     virtual void TransmitPdcpSdu(TransmitPdcpSduParameters params) = 0;
 };
@@ -72,7 +72,7 @@
     /**
      * Called by the PDCP entity to notify the RRC entity of the reception of a new RRC PDU
      *
-     * \param params Parameters
+     * @param params Parameters
      */
     virtual void ReceivePdcpSdu(ReceivePdcpSduParameters params) = 0;
 };
@@ -85,7 +85,7 @@
     /**
      * Constructor
      *
-     * \param pdcp PDCP
+     * @param pdcp PDCP
      */
     LtePdcpSpecificLtePdcpSapProvider(C* pdcp);
 
@@ -120,7 +120,7 @@
     /**
      * Constructor
      *
-     * \param rrc RRC
+     * @param rrc RRC
      */
     LtePdcpSpecificLtePdcpSapUser(C* rrc);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-pdcp-tag.h ns-3.44/src/lte/model/lte-pdcp-tag.h
--- ns-3.43/src/lte/model/lte-pdcp-tag.h	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-pdcp-tag.h	2025-03-09 16:55:49.603371900 -0700
@@ -26,8 +26,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -38,7 +38,7 @@
     PdcpTag();
     /**
      * Create an PDCP tag with the given senderTimestamp
-     * \param senderTimestamp the time stamp
+     * @param senderTimestamp the time stamp
      */
     PdcpTag(Time senderTimestamp);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-phy.cc ns-3.44/src/lte/model/lte-phy.cc
--- ns-3.43/src/lte/model/lte-phy.cc	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-phy.cc	2025-03-09 16:55:49.603371900 -0700
@@ -12,11 +12,11 @@
 #include "lte-control-messages.h"
 #include "lte-net-device.h"
 
+#include "ns3/log.h"
+#include "ns3/object-factory.h"
+#include "ns3/simulator.h"
 #include "ns3/spectrum-error-model.h"
-#include <ns3/log.h>
-#include <ns3/object-factory.h>
-#include <ns3/simulator.h>
-#include <ns3/waveform-generator.h>
+#include "ns3/waveform-generator.h"
 
 #include <cmath>
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-phy.h ns-3.44/src/lte/model/lte-phy.h
--- ns-3.43/src/lte/model/lte-phy.h	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-phy.h	2025-03-09 16:55:49.603371900 -0700
@@ -13,15 +13,15 @@
 
 #include "lte-spectrum-phy.h"
 
-#include <ns3/generic-phy.h>
-#include <ns3/mobility-model.h>
-#include <ns3/nstime.h>
-#include <ns3/packet.h>
-#include <ns3/spectrum-channel.h>
-#include <ns3/spectrum-interference.h>
-#include <ns3/spectrum-phy.h>
-#include <ns3/spectrum-signal-parameters.h>
-#include <ns3/spectrum-value.h>
+#include "ns3/generic-phy.h"
+#include "ns3/mobility-model.h"
+#include "ns3/nstime.h"
+#include "ns3/packet.h"
+#include "ns3/spectrum-channel.h"
+#include "ns3/spectrum-interference.h"
+#include "ns3/spectrum-phy.h"
+#include "ns3/spectrum-signal-parameters.h"
+#include "ns3/spectrum-value.h"
 
 namespace ns3
 {
@@ -31,7 +31,7 @@
 class LteControlMessage;
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
  * The LtePhy models the physical layer of LTE. It is composed by two
  * LteSpectrumPhy, one for the downlink and one for the uplink.
@@ -46,63 +46,63 @@
 
     /**
      *
-     * \param dlPhy the downlink LteSpectrumPhy instance
-     * \param ulPhy the uplink LteSpectrumPhy instance
+     * @param dlPhy the downlink LteSpectrumPhy instance
+     * @param ulPhy the uplink LteSpectrumPhy instance
      */
     LtePhy(Ptr<LteSpectrumPhy> dlPhy, Ptr<LteSpectrumPhy> ulPhy);
 
     ~LtePhy() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Set the device where the phy layer is attached
-     * \param d the device
+     * @brief Set the device where the phy layer is attached
+     * @param d the device
      */
     void SetDevice(Ptr<LteNetDevice> d);
     /**
-     * \brief Get the device where the phy layer is attached
-     * \return the pointer to the device
+     * @brief Get the device where the phy layer is attached
+     * @return the pointer to the device
      */
     Ptr<LteNetDevice> GetDevice() const;
 
     /**
      *
-     * \return a pointer to the LteSpectrumPhy instance that manages the downlink
+     * @return a pointer to the LteSpectrumPhy instance that manages the downlink
      */
     Ptr<LteSpectrumPhy> GetDownlinkSpectrumPhy();
 
     /**
      *
-     * \return a pointer to the LteSpectrumPhy instance that manages the uplink
+     * @return a pointer to the LteSpectrumPhy instance that manages the uplink
      */
     Ptr<LteSpectrumPhy> GetUplinkSpectrumPhy();
 
     /**
-     * \brief Queue the MAC PDU to be sent (according to m_macChTtiDelay)
-     * \param p the MAC PDU to sent
+     * @brief Queue the MAC PDU to be sent (according to m_macChTtiDelay)
+     * @param p the MAC PDU to sent
      */
     virtual void DoSendMacPdu(Ptr<Packet> p) = 0;
 
     /**
      * Set the downlink channel
-     * \param c the downlink channel
+     * @param c the downlink channel
      */
     void SetDownlinkChannel(Ptr<SpectrumChannel> c);
 
     /**
      * Set the uplink channel
-     * \param c the uplink channel
+     * @param c the uplink channel
      */
     void SetUplinkChannel(Ptr<SpectrumChannel> c);
 
     /**
-     * \brief Compute the TX Power Spectral Density
-     * \return a pointer to a newly allocated SpectrumValue representing the TX Power Spectral
+     * @brief Compute the TX Power Spectral Density
+     * @return a pointer to a newly allocated SpectrumValue representing the TX Power Spectral
      * Density in W/Hz for each Resource Block
      */
     virtual Ptr<SpectrumValue> CreateTxPowerSpectralDensity() = 0;
@@ -110,61 +110,61 @@
     void DoDispose() override;
 
     /**
-     * \param tti transmission time interval
+     * @param tti transmission time interval
      */
     void SetTti(double tti);
     /**
-     * \returns transmission time interval
+     * @returns transmission time interval
      */
     double GetTti() const;
 
     /**
      *
-     * \param cellId the Cell Identifier
+     * @param cellId the Cell Identifier
      */
     void DoSetCellId(uint16_t cellId);
 
     /**
-     * \returns the RB group size according to the bandwidth
+     * @returns the RB group size according to the bandwidth
      */
     uint8_t GetRbgSize() const;
 
     /**
-     * \returns the SRS periodicity (see Table 8.2-1 of 36.213)
-     * \param srcCi the SRS Configuration Index
+     * @returns the SRS periodicity (see Table 8.2-1 of 36.213)
+     * @param srcCi the SRS Configuration Index
      */
     uint16_t GetSrsPeriodicity(uint16_t srcCi) const;
 
     /**
-     * \returns the SRS Subframe offset (see Table 8.2-1 of 36.213)
-     * \param srcCi the SRS Configuration Index
+     * @returns the SRS Subframe offset (see Table 8.2-1 of 36.213)
+     * @param srcCi the SRS Configuration Index
      */
     uint16_t GetSrsSubframeOffset(uint16_t srcCi) const;
 
     /**
-     * \param p queue MAC PDU to be sent
+     * @param p queue MAC PDU to be sent
      */
     void SetMacPdu(Ptr<Packet> p);
 
     /**
-     * \returns the packet burst to be sent
+     * @returns the packet burst to be sent
      */
     Ptr<PacketBurst> GetPacketBurst();
 
     /**
-     * \param m the control message to be sent
+     * @param m the control message to be sent
      */
     void SetControlMessages(Ptr<LteControlMessage> m);
 
     /**
-     * \returns the list of control messages to be sent
+     * @returns the list of control messages to be sent
      */
     std::list<Ptr<LteControlMessage>> GetControlMessages();
 
     /**
      * generate a CQI report based on the given SINR of Ctrl frame
      *
-     * \param sinr the SINR vs frequency measured by the device
+     * @param sinr the SINR vs frequency measured by the device
      */
     virtual void GenerateCtrlCqiReport(const SpectrumValue& sinr) = 0;
 
@@ -172,7 +172,7 @@
      * generate a CQI report based on the given SINR of Data frame
      * (used for PUSCH CQIs)
      *
-     * \param sinr the SINR vs frequency measured by the device
+     * @param sinr the SINR vs frequency measured by the device
      */
     virtual void GenerateDataCqiReport(const SpectrumValue& sinr) = 0;
 
@@ -181,7 +181,7 @@
      * perceived during DATA frame
      * NOTE: used only by eNB
      *
-     * \param interf the interference + noise power measured by the device
+     * @param interf the interference + noise power measured by the device
      */
     virtual void ReportInterference(const SpectrumValue& interf) = 0;
 
@@ -190,21 +190,21 @@
      * frame
      * NOTE: used only by UE for evaluating RSRP
      *
-     * \param power the RS power measured by the device
+     * @param power the RS power measured by the device
      */
     virtual void ReportRsReceivedPower(const SpectrumValue& power) = 0;
 
     /**
      * Set the component carrier ID
      *
-     * \param index the component carrier ID index
+     * @param index the component carrier ID index
      */
     void SetComponentCarrierId(uint8_t index);
 
     /**
      * Get the component carrier ID
      *
-     * \returns the component carrier ID index
+     * @returns the component carrier ID index
      */
     uint8_t GetComponentCarrierId() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-phy-tag.h ns-3.44/src/lte/model/lte-phy-tag.h
--- ns-3.43/src/lte/model/lte-phy-tag.h	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-phy-tag.h	2025-03-09 16:55:49.603371900 -0700
@@ -21,8 +21,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -34,7 +34,7 @@
 
     /**
      * Create a LtePhyTag with the given RNTI and LC id
-     * \param cellId the cell ID
+     * @param cellId the cell ID
      */
     LtePhyTag(uint16_t cellId);
 
@@ -48,7 +48,7 @@
     /**
      * Get cell ID
      *
-     * \returns cell ID
+     * @returns cell ID
      */
     uint16_t GetCellId() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-radio-bearer-info.cc ns-3.44/src/lte/model/lte-radio-bearer-info.cc
--- ns-3.43/src/lte/model/lte-radio-bearer-info.cc	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-radio-bearer-info.cc	2025-03-09 16:55:49.603371900 -0700
@@ -11,7 +11,7 @@
 #include "lte-pdcp.h"
 #include "lte-rlc.h"
 
-#include <ns3/log.h>
+#include "ns3/log.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-radio-bearer-info.h ns-3.44/src/lte/model/lte-radio-bearer-info.h
--- ns-3.43/src/lte/model/lte-radio-bearer-info.h	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-radio-bearer-info.h	2025-03-09 16:55:49.603371900 -0700
@@ -12,9 +12,9 @@
 #include "eps-bearer.h"
 #include "lte-rrc-sap.h"
 
-#include <ns3/ipv4-address.h>
-#include <ns3/object.h>
-#include <ns3/pointer.h>
+#include "ns3/ipv4-address.h"
+#include "ns3/object.h"
+#include "ns3/pointer.h"
 
 namespace ns3
 {
@@ -32,8 +32,8 @@
     LteRadioBearerInfo();
     ~LteRadioBearerInfo() override;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -49,8 +49,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -66,8 +66,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-radio-bearer-tag.h ns-3.44/src/lte/model/lte-radio-bearer-tag.h
--- ns-3.43/src/lte/model/lte-radio-bearer-tag.h	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-radio-bearer-tag.h	2025-03-09 16:55:49.603371900 -0700
@@ -23,8 +23,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -36,16 +36,16 @@
 
     /**
      * Create a LteRadioBearerTag with the given RNTI and LC id
-     * \param rnti the RNTI
-     * \param lcId the LCID
+     * @param rnti the RNTI
+     * @param lcId the LCID
      */
     LteRadioBearerTag(uint16_t rnti, uint8_t lcId);
 
     /**
      * Create a LteRadioBearerTag with the given RNTI, LC id and layer
-     * \param rnti the RNTI
-     * \param lcId the LCID
-     * \param layer the layer
+     * @param rnti the RNTI
+     * @param lcId the LCID
+     * @param layer the layer
      */
     LteRadioBearerTag(uint16_t rnti, uint8_t lcId, uint8_t layer);
 
@@ -78,19 +78,19 @@
     /**
      * Get RNTI function
      *
-     * \returns RNTI
+     * @returns RNTI
      */
     uint16_t GetRnti() const;
     /**
      * Get LCID function
      *
-     * \returns LCID
+     * @returns LCID
      */
     uint8_t GetLcid() const;
     /**
      * Get layer function
      *
-     * \returns layer
+     * @returns layer
      */
     uint8_t GetLayer() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-rlc-am.cc ns-3.44/src/lte/model/lte-rlc-am.cc
--- ns-3.43/src/lte/model/lte-rlc-am.cc	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-rlc-am.cc	2025-03-09 16:55:49.603371900 -0700
@@ -1012,7 +1012,7 @@
             NS_LOG_LOGIC("Reordering timer is running");
             if ((m_vrX == m_vrR) || ((!IsInsideReceivingWindow(m_vrX)) && (m_vrX != m_vrMr)))
             {
-                /// \todo stop and reset the t-Reordering
+                /// @todo stop and reset the t-Reordering
                 NS_LOG_LOGIC("Stop reordering timer");
                 m_reorderingTimer.Cancel();
             }
@@ -1219,7 +1219,7 @@
             {
                 NS_LOG_LOGIC("INTERNAL ERROR: Not enough data in the packet ("
                              << packet->GetSize() << "). Needed LI=" << lengthIndicator);
-                /// \todo What to do in this case? Discard packet and continue? Or Assert?
+                /// @todo What to do in this case? Discard packet and continue? Or Assert?
             }
 
             // Split packet in two fragments
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-rlc-am.h ns-3.44/src/lte/model/lte-rlc-am.h
--- ns-3.43/src/lte/model/lte-rlc-am.h	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-rlc-am.h	2025-03-09 16:55:49.603371900 -0700
@@ -12,7 +12,7 @@
 #include "lte-rlc-sequence-number.h"
 #include "lte-rlc.h"
 
-#include <ns3/event-id.h>
+#include "ns3/event-id.h"
 
 #include <map>
 #include <vector>
@@ -29,8 +29,8 @@
     LteRlcAm();
     ~LteRlcAm() override;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     void DoDispose() override;
@@ -38,14 +38,14 @@
     /**
      * RLC SAP
      *
-     * \param p packet
+     * @param p packet
      */
     void DoTransmitPdcpPdu(Ptr<Packet> p) override;
 
     /**
      * MAC SAP
      *
-     * \param txOpParams the LteMacSapUser::TxOpportunityParameters
+     * @param txOpParams the LteMacSapUser::TxOpportunityParameters
      */
     void DoNotifyTxOpportunity(LteMacSapUser::TxOpportunityParameters txOpParams) override;
     /**
@@ -75,8 +75,8 @@
     /**
      * method called when the T_status_prohibit timer expires
      *
-     * \param seqNumber SequenceNumber10
-     * \returns true is inside receiving window
+     * @param seqNumber SequenceNumber10
+     * @returns true is inside receiving window
      */
     bool IsInsideReceivingWindow(SequenceNumber10 seqNumber);
     //
@@ -87,7 +87,7 @@
     /**
      * Reassemble and deliver
      *
-     * \param packet the packet
+     * @param packet the packet
      */
     void ReassembleAndDeliver(Ptr<Packet> packet);
 
@@ -98,14 +98,14 @@
 
   private:
     /**
-     * \brief Store an incoming (from layer above us) PDU, waiting to transmit it
+     * @brief Store an incoming (from layer above us) PDU, waiting to transmit it
      */
     struct TxPdu
     {
         /**
-         * \brief TxPdu default constructor
-         * \param pdu the PDU
-         * \param time the arrival time
+         * @brief TxPdu default constructor
+         * @param pdu the PDU
+         * @param time the arrival time
          */
         TxPdu(const Ptr<Packet>& pdu, const Time& time)
             : m_pdu(pdu),
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-rlc-am-header.h ns-3.44/src/lte/model/lte-rlc-am-header.h
--- ns-3.43/src/lte/model/lte-rlc-am-header.h	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-rlc-am-header.h	2025-03-09 16:55:49.603371900 -0700
@@ -19,8 +19,8 @@
 {
 
 /**
- * \ingroup lte
- * \brief The packet header for the AM Radio Link Control (RLC) protocol packets
+ * @ingroup lte
+ * @brief The packet header for the AM Radio Link Control (RLC) protocol packets
  *
  * This class has fields corresponding to those in an RLC header as well as
  * methods for serialization to and deserialization from a byte buffer.
@@ -30,7 +30,7 @@
 {
   public:
     /**
-     * \brief Constructor
+     * @brief Constructor
      *
      * Creates a null header
      */
@@ -42,17 +42,17 @@
     /**
      * Set control PDU function
      *
-     * \param controlPduType
+     * @param controlPduType
      */
     void SetControlPdu(uint8_t controlPduType);
     /**
      * Is data PDU function
-     * \returns true if data PDU
+     * @returns true if data PDU
      */
     bool IsDataPdu() const;
     /**
      * Is control PDU function
-     * \returns true if control PDU
+     * @returns true if control PDU
      */
     bool IsControlPdu() const;
 
@@ -73,26 +73,26 @@
     /**
      * Set sequence number
      *
-     * \param sequenceNumber sequence number
+     * @param sequenceNumber sequence number
      */
     void SetSequenceNumber(SequenceNumber10 sequenceNumber);
     /**
      * Get sequence number
      *
-     * \returns sequence number
+     * @returns sequence number
      */
     SequenceNumber10 GetSequenceNumber() const;
 
     /**
      * Set sequence number
      *
-     * \param framingInfo framing info
+     * @param framingInfo framing info
      */
     void SetFramingInfo(uint8_t framingInfo);
     /**
      * Get framing info
      *
-     * \returns framing info
+     * @returns framing info
      */
     uint8_t GetFramingInfo() const;
 
@@ -108,26 +108,26 @@
     /**
      * Push extension bit function
      *
-     * \param extensionBit the extension bit
+     * @param extensionBit the extension bit
      */
     void PushExtensionBit(uint8_t extensionBit);
     /**
      * Push length indicator function
      *
-     * \param lengthIndicator the length indicator
+     * @param lengthIndicator the length indicator
      */
     void PushLengthIndicator(uint16_t lengthIndicator);
 
     /**
      * Pop extension bit function
      *
-     * \returns the extension bit
+     * @returns the extension bit
      */
     uint8_t PopExtensionBit();
     /**
      * Pop length indicator function
      *
-     * \returns the length indicator
+     * @returns the length indicator
      */
     uint16_t PopLengthIndicator();
 
@@ -141,13 +141,13 @@
     /**
      * Pop extension bit function
      *
-     * \param resegFlag resegmentation flag
+     * @param resegFlag resegmentation flag
      */
     void SetResegmentationFlag(uint8_t resegFlag);
     /**
      * Get resegmentation flag function
      *
-     * \returns resegmentation flag
+     * @returns resegmentation flag
      */
     uint8_t GetResegmentationFlag() const;
 
@@ -161,13 +161,13 @@
     /**
      * Set polling bit function
      *
-     * \param pollingBit polling bit
+     * @param pollingBit polling bit
      */
     void SetPollingBit(uint8_t pollingBit);
     /**
      * Get polling bit function
      *
-     * \returns polling bit
+     * @returns polling bit
      */
     uint8_t GetPollingBit() const;
 
@@ -181,13 +181,13 @@
     /**
      * Set last segment flag function
      *
-     * \param lsf last segment flag
+     * @param lsf last segment flag
      */
     void SetLastSegmentFlag(uint8_t lsf);
     /**
      * Get last segment flag function
      *
-     * \returns last segment flag
+     * @returns last segment flag
      */
     uint8_t GetLastSegmentFlag() const;
 
@@ -201,19 +201,19 @@
     /**
      * Set segment offset function
      *
-     * \param segmentOffset segment offset
+     * @param segmentOffset segment offset
      */
     void SetSegmentOffset(uint16_t segmentOffset);
     /**
      * Get segment offset function
      *
-     * \returns segment offset
+     * @returns segment offset
      */
     uint16_t GetSegmentOffset() const;
     /**
      * Get last offset function
      *
-     * \returns last offset
+     * @returns last offset
      */
     uint16_t GetLastOffset() const;
 
@@ -224,19 +224,19 @@
     /**
      * Set ack sn function
      *
-     * \param ackSn ack sn
+     * @param ackSn ack sn
      */
     void SetAckSn(SequenceNumber10 ackSn);
     /**
      * Get ack sn function
      *
-     * \returns sequence number
+     * @returns sequence number
      */
     SequenceNumber10 GetAckSn() const;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -248,25 +248,25 @@
     /**
      *
      *
-     * \param bytes max allowed CONTROL PDU size
+     * @param bytes max allowed CONTROL PDU size
      *
-     * \return true if one more NACK would fit in the CONTROL PDU; false otherwise
+     * @return true if one more NACK would fit in the CONTROL PDU; false otherwise
      */
     bool OneMoreNackWouldFitIn(uint16_t bytes);
 
     /**
      * Add one more NACK to the CONTROL PDU
      *
-     * \param nack
+     * @param nack
      */
     void PushNack(int nack);
 
     /**
      *
      *
-     * \param nack SN of the NACK
+     * @param nack SN of the NACK
      *
-     * \return true if the NACK is present in the STATUS PDU, false otherwise
+     * @return true if the NACK is present in the STATUS PDU, false otherwise
      */
     bool IsNackPresent(SequenceNumber10 nack);
 
@@ -274,7 +274,7 @@
      * Retrieve one NACK from the CONTROL PDU
      *
      *
-     * \return the SN  >= 0 of the next nack; returns -1 if no NACK is left
+     * @return the SN  >= 0 of the next nack; returns -1 if no NACK is left
      */
     int PopNack();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-rlc.cc ns-3.44/src/lte/model/lte-rlc.cc
--- ns-3.43/src/lte/model/lte-rlc.cc	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-rlc.cc	2025-03-09 16:55:49.603371900 -0700
@@ -28,7 +28,7 @@
     /**
      * Constructor
      *
-     * \param rlc the RLC
+     * @param rlc the RLC
      */
     LteRlcSpecificLteMacSapUser(LteRlc* rlc);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-rlc.h ns-3.44/src/lte/model/lte-rlc.h
--- ns-3.43/src/lte/model/lte-rlc.h	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-rlc.h	2025-03-09 16:55:49.603371900 -0700
@@ -14,11 +14,11 @@
 
 #include "ns3/nstime.h"
 #include "ns3/object.h"
+#include "ns3/packet.h"
+#include "ns3/simple-ref-count.h"
 #include "ns3/trace-source-accessor.h"
 #include "ns3/traced-value.h"
 #include "ns3/uinteger.h"
-#include <ns3/packet.h>
-#include <ns3/simple-ref-count.h>
 
 namespace ns3
 {
@@ -45,8 +45,8 @@
     LteRlc();
     ~LteRlc() override;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     void DoDispose() override;
@@ -54,75 +54,75 @@
     /**
      *
      *
-     * \param rnti
+     * @param rnti
      */
     void SetRnti(uint16_t rnti);
 
     /**
      *
      *
-     * \param lcId
+     * @param lcId
      */
     void SetLcId(uint8_t lcId);
 
     /**
-     * \param packetDelayBudget
+     * @param packetDelayBudget
      */
     void SetPacketDelayBudgetMs(uint16_t packetDelayBudget);
 
     /**
      *
      *
-     * \param s the RLC SAP user to be used by this LTE_RLC
+     * @param s the RLC SAP user to be used by this LTE_RLC
      */
     void SetLteRlcSapUser(LteRlcSapUser* s);
 
     /**
      *
      *
-     * \return the RLC SAP Provider interface offered to the PDCP by this LTE_RLC
+     * @return the RLC SAP Provider interface offered to the PDCP by this LTE_RLC
      */
     LteRlcSapProvider* GetLteRlcSapProvider();
 
     /**
      *
      *
-     * \param s the MAC SAP Provider to be used by this LTE_RLC
+     * @param s the MAC SAP Provider to be used by this LTE_RLC
      */
     void SetLteMacSapProvider(LteMacSapProvider* s);
 
     /**
      *
      *
-     * \return the MAC SAP User interface offered to the MAC by this LTE_RLC
+     * @return the MAC SAP User interface offered to the MAC by this LTE_RLC
      */
     LteMacSapUser* GetLteMacSapUser();
 
     /**
      * TracedCallback signature for NotifyTxOpportunity events.
      *
-     * \param [in] rnti C-RNTI scheduled.
-     * \param [in] lcid The logical channel id corresponding to
+     * @param [in] rnti C-RNTI scheduled.
+     * @param [in] lcid The logical channel id corresponding to
      *             the sending RLC instance.
-     * \param [in] bytes The number of bytes to transmit
+     * @param [in] bytes The number of bytes to transmit
      */
     typedef void (*NotifyTxTracedCallback)(uint16_t rnti, uint8_t lcid, uint32_t bytes);
 
     /**
      * TracedCallback signature for
      *
-     * \param [in] rnti C-RNTI scheduled.
-     * \param [in] lcid The logical channel id corresponding to
+     * @param [in] rnti C-RNTI scheduled.
+     * @param [in] lcid The logical channel id corresponding to
      *             the sending RLC instance.
-     * \param [in] bytes The packet size.
-     * \param [in] delay Delay since sender timestamp, in ns.
+     * @param [in] bytes The packet size.
+     * @param [in] delay Delay since sender timestamp, in ns.
      */
     typedef void (*ReceiveTracedCallback)(uint16_t rnti,
                                           uint8_t lcid,
                                           uint32_t bytes,
                                           uint64_t delay);
 
-    /// \todo MRE What is the sense to duplicate all the interfaces here???
+    /// @todo MRE What is the sense to duplicate all the interfaces here???
     // NB to avoid the use of multiple inheritance
 
   protected:
@@ -130,7 +130,7 @@
     /**
      * Transmit PDCP PDU
      *
-     * \param p packet
+     * @param p packet
      */
     virtual void DoTransmitPdcpPdu(Ptr<Packet> p) = 0;
 
@@ -141,7 +141,7 @@
     /**
      * Notify transmit opportunity
      *
-     * \param params LteMacSapUser::TxOpportunityParameters
+     * @param params LteMacSapUser::TxOpportunityParameters
      */
     virtual void DoNotifyTxOpportunity(LteMacSapUser::TxOpportunityParameters params) = 0;
     /**
@@ -151,7 +151,7 @@
     /**
      * Receive PDU function
      *
-     * \param params the LteMacSapUser::ReceivePduParameters
+     * @param params the LteMacSapUser::ReceivePduParameters
      */
     virtual void DoReceivePdu(LteMacSapUser::ReceivePduParameters params) = 0;
 
@@ -192,8 +192,8 @@
     LteRlcSm();
     ~LteRlcSm() override;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     void DoInitialize() override;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-rlc-header.h ns-3.44/src/lte/model/lte-rlc-header.h
--- ns-3.43/src/lte/model/lte-rlc-header.h	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-rlc-header.h	2025-03-09 16:55:49.603371900 -0700
@@ -19,8 +19,8 @@
 {
 
 /**
- * \ingroup lte
- * \brief The packet header for the Radio Link Control (RLC) protocol packets
+ * @ingroup lte
+ * @brief The packet header for the Radio Link Control (RLC) protocol packets
  *
  * This class has fields corresponding to those in an RLC header as well as
  * methods for serialization to and deserialization from a byte buffer.
@@ -30,7 +30,7 @@
 {
   public:
     /**
-     * \brief Constructor
+     * @brief Constructor
      *
      * Creates a null header
      */
@@ -40,52 +40,52 @@
     /**
      * Set framing info
      *
-     * \param framingInfo framing info
+     * @param framingInfo framing info
      */
     void SetFramingInfo(uint8_t framingInfo);
     /**
      * Set sequence number
      *
-     * \param sequenceNumber sequence number
+     * @param sequenceNumber sequence number
      */
     void SetSequenceNumber(SequenceNumber10 sequenceNumber);
 
     /**
      * Get framing info
      *
-     * \returns framing info
+     * @returns framing info
      */
     uint8_t GetFramingInfo() const;
     /**
      * Get sequence number
      *
-     * \returns sequence number
+     * @returns sequence number
      */
     SequenceNumber10 GetSequenceNumber() const;
 
     /**
      * Push extension bit
      *
-     * \param extensionBit the extension bit
+     * @param extensionBit the extension bit
      */
     void PushExtensionBit(uint8_t extensionBit);
     /**
      * Push length indicator
      *
-     * \param lengthIndicator the length indicator
+     * @param lengthIndicator the length indicator
      */
     void PushLengthIndicator(uint16_t lengthIndicator);
 
     /**
      * Pop extension bit
      *
-     * \returns the extension bit
+     * @returns the extension bit
      */
     uint8_t PopExtensionBit();
     /**
      * Pop length indicator
      *
-     * \returns the length indicator
+     * @returns the length indicator
      */
     uint16_t PopLengthIndicator();
 
@@ -106,8 +106,8 @@
     };
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-rlc-sap.h ns-3.44/src/lte/model/lte-rlc-sap.h
--- ns-3.43/src/lte/model/lte-rlc-sap.h	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-rlc-sap.h	2025-03-09 16:55:49.603371900 -0700
@@ -40,7 +40,7 @@
      * Send a PDCP PDU to the RLC for transmission
      * This method is to be called
      * when upper PDCP entity has a PDCP PDU ready to send
-     * \param params the TransmitPdcpPduParameters
+     * @param params the TransmitPdcpPduParameters
      */
     virtual void TransmitPdcpPdu(TransmitPdcpPduParameters params) = 0;
 };
@@ -60,7 +60,7 @@
     /**
      * Called by the RLC entity to notify the PDCP entity of the reception of a new PDCP PDU
      *
-     * \param p the PDCP PDU
+     * @param p the PDCP PDU
      */
     virtual void ReceivePdcpPdu(Ptr<Packet> p) = 0;
 };
@@ -73,7 +73,7 @@
     /**
      * Constructor
      *
-     * \param rlc the RLC
+     * @param rlc the RLC
      */
     LteRlcSpecificLteRlcSapProvider(C* rlc);
 
@@ -82,7 +82,7 @@
 
     /**
      * Interface implemented from LteRlcSapProvider
-     * \param params the TransmitPdcpPduParameters
+     * @param params the TransmitPdcpPduParameters
      */
     void TransmitPdcpPdu(TransmitPdcpPduParameters params) override;
 
@@ -111,7 +111,7 @@
     /**
      * Constructor
      *
-     * \param pdcp the PDCP
+     * @param pdcp the PDCP
      */
     LteRlcSpecificLteRlcSapUser(C* pdcp);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-rlc-sdu-status-tag.h ns-3.44/src/lte/model/lte-rlc-sdu-status-tag.h
--- ns-3.43/src/lte/model/lte-rlc-sdu-status-tag.h	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-rlc-sdu-status-tag.h	2025-03-09 16:55:49.603371900 -0700
@@ -15,7 +15,7 @@
 {
 
 /**
- * \brief This class implements a tag that carries the status of a RLC SDU
+ * @brief This class implements a tag that carries the status of a RLC SDU
  * for the fragmentation process
  * Status of RLC SDU
  */
@@ -27,19 +27,19 @@
     /**
      * Set status function
      *
-     * \param status the status
+     * @param status the status
      */
     void SetStatus(uint8_t status);
     /**
      * Get status function
      *
-     * \returns the status
+     * @returns the status
      */
     uint8_t GetStatus() const;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-rlc-sequence-number.cc ns-3.44/src/lte/model/lte-rlc-sequence-number.cc
--- ns-3.43/src/lte/model/lte-rlc-sequence-number.cc	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-rlc-sequence-number.cc	2025-03-09 16:55:49.603371900 -0700
@@ -13,9 +13,9 @@
 
 /**
  * Ostream output function
- * \param os the output stream
- * \param val the sequence number
- * \returns the os
+ * @param os the output stream
+ * @param val the sequence number
+ * @returns the os
  */
 std::ostream&
 operator<<(std::ostream& os, const SequenceNumber10& val)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-rlc-sequence-number.h ns-3.44/src/lte/model/lte-rlc-sequence-number.h
--- ns-3.43/src/lte/model/lte-rlc-sequence-number.h	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-rlc-sequence-number.h	2025-03-09 16:55:49.603371900 -0700
@@ -9,7 +9,7 @@
 #ifndef LTE_RLC_SEQUENCE_NUMBER_H
 #define LTE_RLC_SEQUENCE_NUMBER_H
 
-#include <ns3/assert.h>
+#include "ns3/assert.h"
 
 #include <iostream>
 #include <limits>
@@ -31,7 +31,7 @@
     /**
      * Constructor
      *
-     * \param value the value
+     * @param value the value
      */
     explicit SequenceNumber10(uint16_t value)
         : m_value(value % 1024),
@@ -42,7 +42,7 @@
     /**
      * Constructor
      *
-     * \param value the value
+     * @param value the value
      */
     SequenceNumber10(const SequenceNumber10& value)
         : m_value(value.m_value),
@@ -53,8 +53,8 @@
     /**
      * Assignment operator
      *
-     * \param value the value
-     * \returns SequenceNumber10
+     * @param value the value
+     * @returns SequenceNumber10
      */
     SequenceNumber10& operator=(uint16_t value)
     {
@@ -63,8 +63,8 @@
     }
 
     /**
-     * \brief Extracts the numeric value of the sequence number
-     * \returns the sequence number value
+     * @brief Extracts the numeric value of the sequence number
+     * @returns the sequence number value
      */
     uint16_t GetValue() const
     {
@@ -72,8 +72,8 @@
     }
 
     /**
-     * \brief Set modulus base
-     * \param modulusBase the modulus
+     * @brief Set modulus base
+     * @param modulusBase the modulus
      */
     void SetModulusBase(SequenceNumber10 modulusBase)
     {
@@ -81,8 +81,8 @@
     }
 
     /**
-     * \brief Set modulus base
-     * \param modulusBase the modulus
+     * @brief Set modulus base
+     * @param modulusBase the modulus
      */
     void SetModulusBase(uint16_t modulusBase)
     {
@@ -91,7 +91,7 @@
 
     /**
      * postfix ++ operator
-     * \returns SequenceNumber10
+     * @returns SequenceNumber10
      */
     SequenceNumber10 operator++(int)
     {
@@ -103,8 +103,8 @@
 
     /**
      * addition operator
-     * \param delta the amount to add
-     * \returns SequenceNumber10
+     * @param delta the amount to add
+     * @returns SequenceNumber10
      */
     SequenceNumber10 operator+(uint16_t delta) const
     {
@@ -115,8 +115,8 @@
 
     /**
      * subtraction operator
-     * \param delta the amount to subtract
-     * \returns SequenceNumber10
+     * @param delta the amount to subtract
+     * @returns SequenceNumber10
      */
     SequenceNumber10 operator-(uint16_t delta) const
     {
@@ -127,8 +127,8 @@
 
     /**
      * subtraction operator
-     * \param other the amount to subtract
-     * \returns SequenceNumber10
+     * @param other the amount to subtract
+     * @returns SequenceNumber10
      */
     uint16_t operator-(const SequenceNumber10& other) const
     {
@@ -138,8 +138,8 @@
 
     /**
      * greater than operator
-     * \param other the object to compare
-     * \returns true if greater than
+     * @param other the object to compare
+     * @returns true if greater than
      */
     bool operator>(const SequenceNumber10& other) const
     {
@@ -151,8 +151,8 @@
 
     /**
      * equality operator
-     * \param other the object to compare
-     * \returns true if equal
+     * @param other the object to compare
+     * @returns true if equal
      */
     bool operator==(const SequenceNumber10& other) const
     {
@@ -161,8 +161,8 @@
 
     /**
      * inequality operator
-     * \param other the object to compare
-     * \returns true if not equal
+     * @param other the object to compare
+     * @returns true if not equal
      */
     bool operator!=(const SequenceNumber10& other) const
     {
@@ -171,8 +171,8 @@
 
     /**
      * less than or equal operator
-     * \param other the object to compare
-     * \returns true if less than or equal
+     * @param other the object to compare
+     * @returns true if less than or equal
      */
     bool operator<=(const SequenceNumber10& other) const
     {
@@ -181,8 +181,8 @@
 
     /**
      * greater than or equal operator
-     * \param other the object to compare
-     * \returns true if greater than or equal
+     * @param other the object to compare
+     * @returns true if greater than or equal
      */
     bool operator>=(const SequenceNumber10& other) const
     {
@@ -191,8 +191,8 @@
 
     /**
      * less than operator
-     * \param other the object to compare
-     * \returns true if less than
+     * @param other the object to compare
+     * @returns true if less than
      */
     bool operator<(const SequenceNumber10& other) const
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-rlc-tag.h ns-3.44/src/lte/model/lte-rlc-tag.h
--- ns-3.43/src/lte/model/lte-rlc-tag.h	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-rlc-tag.h	2025-03-09 16:55:49.603371900 -0700
@@ -25,8 +25,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -37,7 +37,7 @@
     RlcTag();
     /**
      * Create an RLC tag with the given senderTimestamp
-     * \param senderTimestamp the time
+     * @param senderTimestamp the time
      */
     RlcTag(Time senderTimestamp);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-rlc-tm.h ns-3.44/src/lte/model/lte-rlc-tm.h
--- ns-3.43/src/lte/model/lte-rlc-tm.h	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-rlc-tm.h	2025-03-09 16:55:49.603371900 -0700
@@ -12,7 +12,7 @@
 
 #include "lte-rlc.h"
 
-#include <ns3/event-id.h>
+#include "ns3/event-id.h"
 
 #include <map>
 
@@ -32,8 +32,8 @@
     LteRlcTm();
     ~LteRlcTm() override;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     void DoDispose() override;
@@ -41,14 +41,14 @@
     /**
      * RLC SAP
      *
-     * \param p packet
+     * @param p packet
      */
     void DoTransmitPdcpPdu(Ptr<Packet> p) override;
 
     /**
      * MAC SAP
      *
-     * \param txOpParams the LteMacSapUser::TxOpportunityParameters
+     * @param txOpParams the LteMacSapUser::TxOpportunityParameters
      */
     void DoNotifyTxOpportunity(LteMacSapUser::TxOpportunityParameters txOpParams) override;
     /**
@@ -65,14 +65,14 @@
 
   private:
     /**
-     * \brief Store an incoming (from layer above us) PDU, waiting to transmit it
+     * @brief Store an incoming (from layer above us) PDU, waiting to transmit it
      */
     struct TxPdu
     {
         /**
-         * \brief TxPdu default constructor
-         * \param pdu the PDU
-         * \param time the arrival time
+         * @brief TxPdu default constructor
+         * @param pdu the PDU
+         * @param time the arrival time
          */
         TxPdu(const Ptr<Packet>& pdu, const Time& time)
             : m_pdu(pdu),
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-rlc-um.h ns-3.44/src/lte/model/lte-rlc-um.h
--- ns-3.43/src/lte/model/lte-rlc-um.h	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-rlc-um.h	2025-03-09 16:55:49.603371900 -0700
@@ -12,7 +12,7 @@
 #include "lte-rlc-sequence-number.h"
 #include "lte-rlc.h"
 
-#include <ns3/event-id.h>
+#include "ns3/event-id.h"
 
 #include <deque>
 #include <map>
@@ -29,8 +29,8 @@
     LteRlcUm();
     ~LteRlcUm() override;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     void DoDispose() override;
@@ -38,14 +38,14 @@
     /**
      * RLC SAP
      *
-     * \param p packet
+     * @param p packet
      */
     void DoTransmitPdcpPdu(Ptr<Packet> p) override;
 
     /**
      * MAC SAP
      *
-     * \param txOpParams the LteMacSapUser::TxOpportunityParameters
+     * @param txOpParams the LteMacSapUser::TxOpportunityParameters
      */
     void DoNotifyTxOpportunity(LteMacSapUser::TxOpportunityParameters txOpParams) override;
     void DoNotifyHarqDeliveryFailure() override;
@@ -60,8 +60,8 @@
     /**
      * Is inside reordering window function
      *
-     * \param seqNumber the sequence number
-     * \returns true if inside the window
+     * @param seqNumber the sequence number
+     * @returns true if inside the window
      */
     bool IsInsideReorderingWindow(SequenceNumber10 seqNumber);
 
@@ -70,15 +70,15 @@
     /**
      * Reassemble SN interval function
      *
-     * \param lowSeqNumber the low sequence number
-     * \param highSeqNumber the high sequence number
+     * @param lowSeqNumber the low sequence number
+     * @param highSeqNumber the high sequence number
      */
     void ReassembleSnInterval(SequenceNumber10 lowSeqNumber, SequenceNumber10 highSeqNumber);
 
     /**
      * Reassemble and deliver function
      *
-     * \param packet the packet
+     * @param packet the packet
      */
     void ReassembleAndDeliver(Ptr<Packet> packet);
 
@@ -90,14 +90,14 @@
     uint32_t m_txBufferSize;    ///< transmit buffer size
 
     /**
-     * \brief Store an incoming (from layer above us) PDU, waiting to transmit it
+     * @brief Store an incoming (from layer above us) PDU, waiting to transmit it
      */
     struct TxPdu
     {
         /**
-         * \brief TxPdu default constructor
-         * \param pdu the PDU
-         * \param time the arrival time
+         * @brief TxPdu default constructor
+         * @param pdu the PDU
+         * @param time the arrival time
          */
         TxPdu(const Ptr<Packet>& pdu, const Time& time)
             : m_pdu(pdu),
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-rrc-header.h ns-3.44/src/lte/model/lte-rrc-header.h
--- ns-3.43/src/lte/model/lte-rrc-header.h	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-rrc-header.h	2025-03-09 16:55:49.603371900 -0700
@@ -24,7 +24,7 @@
 {
 
 /**
- * \ingroup lte
+ * @ingroup lte
  */
 
 /**
@@ -38,14 +38,14 @@
     /**
      * Get message type
      *
-     * \returns the message type
+     * @returns the message type
      */
     int GetMessageType() const;
 
   protected:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     // Inherited from Asn1Header
@@ -57,15 +57,15 @@
     /**
      * Convert from bandwidth (in RBs) to ENUMERATED value
      *
-     * \param bandwidth Bandwidth in RBs: 6, 15, 25, 50, 75, 100
-     * \returns ENUMERATED value: 0, 1, 2, 3, 4, 5
+     * @param bandwidth Bandwidth in RBs: 6, 15, 25, 50, 75, 100
+     * @returns ENUMERATED value: 0, 1, 2, 3, 4, 5
      */
     int BandwidthToEnum(uint16_t bandwidth) const;
     /**
      * Convert from ENUMERATED value to bandwidth (in RBs)
      *
-     * \param n ENUMERATED value: 0, 1, 2, 3, 4, 5
-     * \returns bandwidth Bandwidth in RBs: 6, 15, 25, 50, 75, 100
+     * @param n ENUMERATED value: 0, 1, 2, 3, 4, 5
+     * @returns bandwidth Bandwidth in RBs: 6, 15, 25, 50, 75, 100
      */
     uint16_t EnumToBandwidth(int n) const;
 
@@ -73,124 +73,124 @@
     /**
      * Serialize SRB to add mod list function
      *
-     * \param srbToAddModList std::list<LteRrcSap::SrbToAddMod>
+     * @param srbToAddModList std::list<LteRrcSap::SrbToAddMod>
      */
     void SerializeSrbToAddModList(std::list<LteRrcSap::SrbToAddMod> srbToAddModList) const;
     /**
      * Serialize DRB to add mod list function
      *
-     * \param drbToAddModList std::list<LteRrcSap::SrbToAddMod>
+     * @param drbToAddModList std::list<LteRrcSap::SrbToAddMod>
      */
     void SerializeDrbToAddModList(std::list<LteRrcSap::DrbToAddMod> drbToAddModList) const;
     /**
      * Serialize logicala channel config function
      *
-     * \param logicalChannelConfig LteRrcSap::LogicalChannelConfig
+     * @param logicalChannelConfig LteRrcSap::LogicalChannelConfig
      */
     void SerializeLogicalChannelConfig(LteRrcSap::LogicalChannelConfig logicalChannelConfig) const;
     /**
      * Serialize radio resource config function
      *
-     * \param radioResourceConfigDedicated LteRrcSap::RadioResourceConfigDedicated
+     * @param radioResourceConfigDedicated LteRrcSap::RadioResourceConfigDedicated
      */
     void SerializeRadioResourceConfigDedicated(
         LteRrcSap::RadioResourceConfigDedicated radioResourceConfigDedicated) const;
     /**
      * Serialize physical config dedicated function
      *
-     * \param physicalConfigDedicated LteRrcSap::PhysicalConfigDedicated
+     * @param physicalConfigDedicated LteRrcSap::PhysicalConfigDedicated
      */
     void SerializePhysicalConfigDedicated(
         LteRrcSap::PhysicalConfigDedicated physicalConfigDedicated) const;
     /**
      * Serialize physical config dedicated function
      *
-     * \param pcdsc LteRrcSap::PhysicalConfigDedicatedSCell
+     * @param pcdsc LteRrcSap::PhysicalConfigDedicatedSCell
      */
     void SerializePhysicalConfigDedicatedSCell(LteRrcSap::PhysicalConfigDedicatedSCell pcdsc) const;
     /**
      * Serialize system information block type 1 function
      *
-     * \param systemInformationBlockType1 LteRrcSap::SystemInformationBlockType1
+     * @param systemInformationBlockType1 LteRrcSap::SystemInformationBlockType1
      */
     void SerializeSystemInformationBlockType1(
         LteRrcSap::SystemInformationBlockType1 systemInformationBlockType1) const;
     /**
      * Serialize system information block type 2 function
      *
-     * \param systemInformationBlockType2 LteRrcSap::SystemInformationBlockType2
+     * @param systemInformationBlockType2 LteRrcSap::SystemInformationBlockType2
      */
     void SerializeSystemInformationBlockType2(
         LteRrcSap::SystemInformationBlockType2 systemInformationBlockType2) const;
     /**
      * Serialize system information block type 2 function
      *
-     * \param radioResourceConfigCommon LteRrcSap::RadioResourceConfigCommon
+     * @param radioResourceConfigCommon LteRrcSap::RadioResourceConfigCommon
      */
     void SerializeRadioResourceConfigCommon(
         LteRrcSap::RadioResourceConfigCommon radioResourceConfigCommon) const;
     /**
      * Serialize radio resource config common SIB function
      *
-     * \param radioResourceConfigCommonSib LteRrcSap::RadioResourceConfigCommonSib
+     * @param radioResourceConfigCommonSib LteRrcSap::RadioResourceConfigCommonSib
      */
     void SerializeRadioResourceConfigCommonSib(
         LteRrcSap::RadioResourceConfigCommonSib radioResourceConfigCommonSib) const;
     /**
      * Serialize measure results function
      *
-     * \param measResults LteRrcSap::MeasResults
+     * @param measResults LteRrcSap::MeasResults
      */
     void SerializeMeasResults(LteRrcSap::MeasResults measResults) const;
     /**
      * Serialize PLMN identity function
      *
-     * \param plmnId the PLMN ID
+     * @param plmnId the PLMN ID
      */
     void SerializePlmnIdentity(uint32_t plmnId) const;
     /**
      * Serialize RACH config common function
      *
-     * \param rachConfigCommon LteRrcSap::RachConfigCommon
+     * @param rachConfigCommon LteRrcSap::RachConfigCommon
      */
     void SerializeRachConfigCommon(LteRrcSap::RachConfigCommon rachConfigCommon) const;
     /**
      * Serialize measure config function
      *
-     * \param measConfig LteRrcSap::MeasConfig
+     * @param measConfig LteRrcSap::MeasConfig
      */
     void SerializeMeasConfig(LteRrcSap::MeasConfig measConfig) const;
     /**
      * Serialize non critical extension config function
      *
-     * \param nonCriticalExtensionConfiguration LteRrcSap::NonCriticalExtensionConfiguration
+     * @param nonCriticalExtensionConfiguration LteRrcSap::NonCriticalExtensionConfiguration
      */
     void SerializeNonCriticalExtensionConfiguration(
         LteRrcSap::NonCriticalExtensionConfiguration nonCriticalExtensionConfiguration) const;
     /**
      * Serialize radio resource config common SCell function
      *
-     * \param rrccsc LteRrcSap::RadioResourceConfigCommonSCell
+     * @param rrccsc LteRrcSap::RadioResourceConfigCommonSCell
      */
     void SerializeRadioResourceConfigCommonSCell(
         LteRrcSap::RadioResourceConfigCommonSCell rrccsc) const;
     /**
      * Serialize radio resource dedicated SCell function
      *
-     * \param rrcdsc LteRrcSap::RadioResourceConfigDedicatedSCell
+     * @param rrcdsc LteRrcSap::RadioResourceConfigDedicatedSCell
      */
     void SerializeRadioResourceDedicatedSCell(
         LteRrcSap::RadioResourceConfigDedicatedSCell rrcdsc) const;
     /**
      * Serialize Q offset range function
      *
-     * \param qOffsetRange q offset range
+     * @param qOffsetRange q offset range
      */
     void SerializeQoffsetRange(int8_t qOffsetRange) const;
     /**
      * Serialize threshold eutra function
      *
-     * \param thresholdEutra LteRrcSap::ThresholdEutra
+     * @param thresholdEutra LteRrcSap::ThresholdEutra
      */
     void SerializeThresholdEutra(LteRrcSap::ThresholdEutra thresholdEutra) const;
 
@@ -198,27 +198,27 @@
     /**
      * Deserialize DRB to add mod list function
      *
-     * \param drbToAddModLis std::list<LteRrcSap::DrbToAddMod> *
-     * \param bIterator buffer iterator
-     * \returns buffer iterator
+     * @param drbToAddModLis std::list<LteRrcSap::DrbToAddMod> *
+     * @param bIterator buffer iterator
+     * @returns buffer iterator
      */
     Buffer::Iterator DeserializeDrbToAddModList(std::list<LteRrcSap::DrbToAddMod>* drbToAddModLis,
                                                 Buffer::Iterator bIterator);
     /**
      * Deserialize SRB to add mod list function
      *
-     * \param srbToAddModList std::list<LteRrcSap::SrbToAddMod> *
-     * \param bIterator buffer iterator
-     * \returns buffer iterator
+     * @param srbToAddModList std::list<LteRrcSap::SrbToAddMod> *
+     * @param bIterator buffer iterator
+     * @returns buffer iterator
      */
     Buffer::Iterator DeserializeSrbToAddModList(std::list<LteRrcSap::SrbToAddMod>* srbToAddModList,
                                                 Buffer::Iterator bIterator);
     /**
      * Deserialize logical channel config function
      *
-     * \param logicalChannelConfig LteRrcSap::LogicalChannelConfig *
-     * \param bIterator buffer iterator
-     * \returns buffer iterator
+     * @param logicalChannelConfig LteRrcSap::LogicalChannelConfig *
+     * @param bIterator buffer iterator
+     * @returns buffer iterator
      */
     Buffer::Iterator DeserializeLogicalChannelConfig(
         LteRrcSap::LogicalChannelConfig* logicalChannelConfig,
@@ -226,9 +226,9 @@
     /**
      * Deserialize radio resource config dedicated function
      *
-     * \param radioResourceConfigDedicated LteRrcSap::RadioResourceConfigDedicated *
-     * \param bIterator buffer iterator
-     * \returns buffer iterator
+     * @param radioResourceConfigDedicated LteRrcSap::RadioResourceConfigDedicated *
+     * @param bIterator buffer iterator
+     * @returns buffer iterator
      */
     Buffer::Iterator DeserializeRadioResourceConfigDedicated(
         LteRrcSap::RadioResourceConfigDedicated* radioResourceConfigDedicated,
@@ -236,9 +236,9 @@
     /**
      * Deserialize physical config dedicated function
      *
-     * \param physicalConfigDedicated LteRrcSap::PhysicalConfigDedicated *
-     * \param bIterator buffer iterator
-     * \returns buffer iterator
+     * @param physicalConfigDedicated LteRrcSap::PhysicalConfigDedicated *
+     * @param bIterator buffer iterator
+     * @returns buffer iterator
      */
     Buffer::Iterator DeserializePhysicalConfigDedicated(
         LteRrcSap::PhysicalConfigDedicated* physicalConfigDedicated,
@@ -246,9 +246,9 @@
     /**
      * Deserialize system information block type 1 function
      *
-     * \param systemInformationBlockType1 LteRrcSap::SystemInformationBlockType1 *
-     * \param bIterator buffer iterator
-     * \returns buffer iterator
+     * @param systemInformationBlockType1 LteRrcSap::SystemInformationBlockType1 *
+     * @param bIterator buffer iterator
+     * @returns buffer iterator
      */
     Buffer::Iterator DeserializeSystemInformationBlockType1(
         LteRrcSap::SystemInformationBlockType1* systemInformationBlockType1,
@@ -256,9 +256,9 @@
     /**
      * Deserialize system information block type 2 function
      *
-     * \param systemInformationBlockType2 LteRrcSap::SystemInformationBlockType2 *
-     * \param bIterator buffer iterator
-     * \returns buffer iterator
+     * @param systemInformationBlockType2 LteRrcSap::SystemInformationBlockType2 *
+     * @param bIterator buffer iterator
+     * @returns buffer iterator
      */
     Buffer::Iterator DeserializeSystemInformationBlockType2(
         LteRrcSap::SystemInformationBlockType2* systemInformationBlockType2,
@@ -266,9 +266,9 @@
     /**
      * Deserialize radio resource config common function
      *
-     * \param radioResourceConfigCommon LteRrcSap::RadioResourceConfigCommon *
-     * \param bIterator buffer iterator
-     * \returns buffer iterator
+     * @param radioResourceConfigCommon LteRrcSap::RadioResourceConfigCommon *
+     * @param bIterator buffer iterator
+     * @returns buffer iterator
      */
     Buffer::Iterator DeserializeRadioResourceConfigCommon(
         LteRrcSap::RadioResourceConfigCommon* radioResourceConfigCommon,
@@ -276,9 +276,9 @@
     /**
      * Deserialize radio resource config common SIB function
      *
-     * \param radioResourceConfigCommonSib LteRrcSap::RadioResourceConfigCommonSib *
-     * \param bIterator buffer iterator
-     * \returns buffer iterator
+     * @param radioResourceConfigCommonSib LteRrcSap::RadioResourceConfigCommonSib *
+     * @param bIterator buffer iterator
+     * @returns buffer iterator
      */
     Buffer::Iterator DeserializeRadioResourceConfigCommonSib(
         LteRrcSap::RadioResourceConfigCommonSib* radioResourceConfigCommonSib,
@@ -286,61 +286,61 @@
     /**
      * Deserialize measure results function
      *
-     * \param measResults LteRrcSap::MeasResults *
-     * \param bIterator buffer iterator
-     * \returns buffer iterator
+     * @param measResults LteRrcSap::MeasResults *
+     * @param bIterator buffer iterator
+     * @returns buffer iterator
      */
     Buffer::Iterator DeserializeMeasResults(LteRrcSap::MeasResults* measResults,
                                             Buffer::Iterator bIterator);
     /**
      * Deserialize PLMN identity function
      *
-     * \param plmnId the PLMN ID
-     * \param bIterator buffer iterator
-     * \returns buffer iterator
+     * @param plmnId the PLMN ID
+     * @param bIterator buffer iterator
+     * @returns buffer iterator
      */
     Buffer::Iterator DeserializePlmnIdentity(uint32_t* plmnId, Buffer::Iterator bIterator);
     /**
      * Deserialize RACH config common function
      *
-     * \param rachConfigCommon LteRrcSap::RachConfigCommon *
-     * \param bIterator buffer iterator
-     * \returns buffer iterator
+     * @param rachConfigCommon LteRrcSap::RachConfigCommon *
+     * @param bIterator buffer iterator
+     * @returns buffer iterator
      */
     Buffer::Iterator DeserializeRachConfigCommon(LteRrcSap::RachConfigCommon* rachConfigCommon,
                                                  Buffer::Iterator bIterator);
     /**
      * Deserialize measure config function
      *
-     * \param measConfig LteRrcSap::MeasConfig *
-     * \param bIterator buffer iterator
-     * \returns buffer iterator
+     * @param measConfig LteRrcSap::MeasConfig *
+     * @param bIterator buffer iterator
+     * @returns buffer iterator
      */
     Buffer::Iterator DeserializeMeasConfig(LteRrcSap::MeasConfig* measConfig,
                                            Buffer::Iterator bIterator);
     /**
      * Deserialize Qoffset range function
      *
-     * \param qOffsetRange Qoffset range
-     * \param bIterator buffer iterator
-     * \returns buffer iterator
+     * @param qOffsetRange Qoffset range
+     * @param bIterator buffer iterator
+     * @returns buffer iterator
      */
     Buffer::Iterator DeserializeQoffsetRange(int8_t* qOffsetRange, Buffer::Iterator bIterator);
     /**
      * Deserialize threshold eutra function
      *
-     * \param thresholdEutra LteRrcSap::ThresholdEutra *
-     * \param bIterator buffer iterator
-     * \returns buffer iterator
+     * @param thresholdEutra LteRrcSap::ThresholdEutra *
+     * @param bIterator buffer iterator
+     * @returns buffer iterator
      */
     Buffer::Iterator DeserializeThresholdEutra(LteRrcSap::ThresholdEutra* thresholdEutra,
                                                Buffer::Iterator bIterator);
     /**
      * Deserialize non critical extension config function
      *
-     * \param nonCriticalExtension LteRrcSap::NonCriticalExtensionConfiguration *
-     * \param bIterator buffer iterator
-     * \returns buffer iterator
+     * @param nonCriticalExtension LteRrcSap::NonCriticalExtensionConfiguration *
+     * @param bIterator buffer iterator
+     * @returns buffer iterator
      */
     Buffer::Iterator DeserializeNonCriticalExtensionConfig(
         LteRrcSap::NonCriticalExtensionConfiguration* nonCriticalExtension,
@@ -348,18 +348,18 @@
     /**
      * Deserialize cell identification function
      *
-     * \param ci LteRrcSap::CellIdentification *
-     * \param bIterator buffer iterator
-     * \returns buffer iterator
+     * @param ci LteRrcSap::CellIdentification *
+     * @param bIterator buffer iterator
+     * @returns buffer iterator
      */
     Buffer::Iterator DeserializeCellIdentification(LteRrcSap::CellIdentification* ci,
                                                    Buffer::Iterator bIterator);
     /**
      * Deserialize radio resource config common SCell function
      *
-     * \param rrccsc LteRrcSap::RadioResourceConfigCommonSCell *
-     * \param bIterator buffer iterator
-     * \returns buffer iterator
+     * @param rrccsc LteRrcSap::RadioResourceConfigCommonSCell *
+     * @param bIterator buffer iterator
+     * @returns buffer iterator
      */
     Buffer::Iterator DeserializeRadioResourceConfigCommonSCell(
         LteRrcSap::RadioResourceConfigCommonSCell* rrccsc,
@@ -367,9 +367,9 @@
     /**
      * Deserialize radio resource config dedicated SCell function
      *
-     * \param rrcdsc LteRrcSap::RadioResourceConfigDedicatedSCell *
-     * \param bIterator buffer iterator
-     * \returns buffer iterator
+     * @param rrcdsc LteRrcSap::RadioResourceConfigDedicatedSCell *
+     * @param bIterator buffer iterator
+     * @returns buffer iterator
      */
     Buffer::Iterator DeserializeRadioResourceConfigDedicatedSCell(
         LteRrcSap::RadioResourceConfigDedicatedSCell* rrcdsc,
@@ -377,9 +377,9 @@
     /**
      * Deserialize physical config dedicated SCell function
      *
-     * \param pcdsc LteRrcSap::PhysicalConfigDedicatedSCell *
-     * \param bIterator buffer iterator
-     * \returns buffer iterator
+     * @param pcdsc LteRrcSap::PhysicalConfigDedicatedSCell *
+     * @param bIterator buffer iterator
+     * @returns buffer iterator
      */
     Buffer::Iterator DeserializePhysicalConfigDedicatedSCell(
         LteRrcSap::PhysicalConfigDedicatedSCell* pcdsc,
@@ -421,14 +421,14 @@
     /**
      * Serialize UL DCCH message function
      *
-     * \param msgType message type
+     * @param msgType message type
      */
     void SerializeUlDcchMessage(int msgType) const;
     /**
      * Deserialize UL DCCH message function
      *
-     * \param bIterator buffer iterator
-     * \returns buffer iterator
+     * @param bIterator buffer iterator
+     * @returns buffer iterator
      */
     Buffer::Iterator DeserializeUlDcchMessage(Buffer::Iterator bIterator);
 };
@@ -452,14 +452,14 @@
     /**
      * Serialize DL DCCH message function
      *
-     * \param msgType message type
+     * @param msgType message type
      */
     void SerializeDlDcchMessage(int msgType) const;
     /**
      * Deserialize DL DCCH message function
      *
-     * \param bIterator buffer iterator
-     * \returns buffer iterator
+     * @param bIterator buffer iterator
+     * @returns buffer iterator
      */
     Buffer::Iterator DeserializeDlDcchMessage(Buffer::Iterator bIterator);
 };
@@ -483,14 +483,14 @@
     /**
      * Serialize UL CCCH message function
      *
-     * \param msgType message type
+     * @param msgType message type
      */
     void SerializeUlCcchMessage(int msgType) const;
     /**
      * Deserialize DL CCCH message function
      *
-     * \param bIterator buffer iterator
-     * \returns buffer iterator
+     * @param bIterator buffer iterator
+     * @returns buffer iterator
      */
     Buffer::Iterator DeserializeUlCcchMessage(Buffer::Iterator bIterator);
 };
@@ -514,14 +514,14 @@
     /**
      * Serialize DL CCCH message function
      *
-     * \param msgType message type
+     * @param msgType message type
      */
     void SerializeDlCcchMessage(int msgType) const;
     /**
      * Deserialize DL CCCH message function
      *
-     * \param bIterator buffer iterator
-     * \returns buffer iterator
+     * @param bIterator buffer iterator
+     * @returns buffer iterator
      */
     Buffer::Iterator DeserializeDlCcchMessage(Buffer::Iterator bIterator);
 };
@@ -536,8 +536,8 @@
     ~RrcConnectionRequestHeader() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     // Inherited from RrcAsn1Header
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-rrc-protocol-ideal.cc ns-3.44/src/lte/model/lte-rrc-protocol-ideal.cc
--- ns-3.43/src/lte/model/lte-rrc-protocol-ideal.cc	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-rrc-protocol-ideal.cc	2025-03-09 16:55:49.603371900 -0700
@@ -13,12 +13,12 @@
 #include "lte-ue-net-device.h"
 #include "lte-ue-rrc.h"
 
-#include <ns3/fatal-error.h>
-#include <ns3/log.h>
-#include <ns3/node-list.h>
-#include <ns3/node.h>
-#include <ns3/nstime.h>
-#include <ns3/simulator.h>
+#include "ns3/fatal-error.h"
+#include "ns3/log.h"
+#include "ns3/node-list.h"
+#include "ns3/node.h"
+#include "ns3/nstime.h"
+#include "ns3/simulator.h"
 
 namespace ns3
 {
@@ -26,12 +26,12 @@
 NS_LOG_COMPONENT_DEFINE("LteRrcProtocolIdeal");
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
  */
 
 /// RRC ideal message delay
-static const Time RRC_IDEAL_MSG_DELAY = MilliSeconds(0);
+static const Time RRC_IDEAL_MSG_DELAY;
 
 NS_OBJECT_ENSURE_REGISTERED(LteUeRrcProtocolIdeal);
 
@@ -461,18 +461,18 @@
     /**
      * Get the message ID function
      *
-     * \returns the message ID
+     * @returns the message ID
      */
     uint32_t GetMsgId() const;
     /**
      * Set the message ID function
      *
-     * \param id the message ID
+     * @param id the message ID
      */
     void SetMsgId(uint32_t id);
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -585,18 +585,18 @@
     /**
      * Get the message ID function
      *
-     * \returns the message ID
+     * @returns the message ID
      */
     uint32_t GetMsgId() const;
     /**
      * Set the message ID function
      *
-     * \param id the message ID
+     * @param id the message ID
      */
     void SetMsgId(uint32_t id);
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-rrc-protocol-ideal.h ns-3.44/src/lte/model/lte-rrc-protocol-ideal.h
--- ns-3.43/src/lte/model/lte-rrc-protocol-ideal.h	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-rrc-protocol-ideal.h	2025-03-09 16:55:49.603371900 -0700
@@ -11,8 +11,8 @@
 
 #include "lte-rrc-sap.h"
 
-#include <ns3/object.h>
-#include <ns3/ptr.h>
+#include "ns3/object.h"
+#include "ns3/ptr.h"
 
 #include <map>
 #include <stdint.h>
@@ -26,7 +26,7 @@
 class LteUeRrc;
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
  * Models the transmission of RRC messages from the UE to the eNB in
  * an ideal fashion, without errors and without consuming any radio
@@ -45,28 +45,28 @@
     // inherited from Object
     void DoDispose() override;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
      * Set LTE UE RRC SAP provider function
      *
-     * \param p LTE UE RRC SAP provider
+     * @param p LTE UE RRC SAP provider
      */
     void SetLteUeRrcSapProvider(LteUeRrcSapProvider* p);
     /**
      * Get LTE UE RRC SAP user function
      *
-     * \returns LTE UE RRC SAP user
+     * @returns LTE UE RRC SAP user
      */
     LteUeRrcSapUser* GetLteUeRrcSapUser();
 
     /**
      * Set LTE UE RRC  function
      *
-     * \param rrc LTE UE RRC
+     * @param rrc LTE UE RRC
      */
     void SetUeRrc(Ptr<LteUeRrc> rrc);
 
@@ -75,57 +75,57 @@
     /**
      * Setup function
      *
-     * \param params LteUeRrcSapUser::SetupParameters
+     * @param params LteUeRrcSapUser::SetupParameters
      */
     void DoSetup(LteUeRrcSapUser::SetupParameters params);
     /**
      * Send RRC connection request function
      *
-     * \param msg LteRrcSap::RrcConnectionRequest
+     * @param msg LteRrcSap::RrcConnectionRequest
      */
     void DoSendRrcConnectionRequest(LteRrcSap::RrcConnectionRequest msg);
     /**
      * Send RRC connection setup completed function
      *
-     * \param msg LteRrcSap::RrcConnectionSetupCompleted
+     * @param msg LteRrcSap::RrcConnectionSetupCompleted
      */
     void DoSendRrcConnectionSetupCompleted(LteRrcSap::RrcConnectionSetupCompleted msg);
     /**
      * Send RRC connection reconfiguration completed function
      *
-     * \param msg LteRrcSap::RrcConnectionReconfigurationCompleted
+     * @param msg LteRrcSap::RrcConnectionReconfigurationCompleted
      */
     void DoSendRrcConnectionReconfigurationCompleted(
         LteRrcSap::RrcConnectionReconfigurationCompleted msg);
     /**
      * Send RRC connection reestablishment request function
      *
-     * \param msg LteRrcSap::RrcConnectionReestablishmentRequest
+     * @param msg LteRrcSap::RrcConnectionReestablishmentRequest
      */
     void DoSendRrcConnectionReestablishmentRequest(
         LteRrcSap::RrcConnectionReestablishmentRequest msg);
     /**
      * Send RRC connection reestablishment complete function
      *
-     * \param msg LteRrcSap::RrcConnectionReestablishmentRequest
+     * @param msg LteRrcSap::RrcConnectionReestablishmentRequest
      */
     void DoSendRrcConnectionReestablishmentComplete(
         LteRrcSap::RrcConnectionReestablishmentComplete msg);
     /**
      * Send measurement report function
      *
-     * \param msg LteRrcSap::MeasurementReport
+     * @param msg LteRrcSap::MeasurementReport
      */
     void DoSendMeasurementReport(LteRrcSap::MeasurementReport msg);
 
     /**
-     * \brief Send Ideal UE context remove request function
+     * @brief Send Ideal UE context remove request function
      *
      * Notify eNodeB to release UE context once radio link failure
      * or random access failure is detected. It is needed since no
      * RLF detection mechanism at eNodeB is implemented
      *
-     * \param rnti the RNTI of the UE
+     * @param rnti the RNTI of the UE
      */
     void DoSendIdealUeContextRemoveRequest(uint16_t rnti);
 
@@ -157,43 +157,43 @@
     // inherited from Object
     void DoDispose() override;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
      * Set LTE ENB RRC SAP provider function
      *
-     * \param p the LTE ENB RRC SAP provider
+     * @param p the LTE ENB RRC SAP provider
      */
     void SetLteEnbRrcSapProvider(LteEnbRrcSapProvider* p);
     /**
      * Get LTE ENB RRC SAP user function
      *
-     * \returns LTE ENB RRC SAP user
+     * @returns LTE ENB RRC SAP user
      */
     LteEnbRrcSapUser* GetLteEnbRrcSapUser();
 
     /**
      * Set the cell ID function
      *
-     * \param cellId the cell ID
+     * @param cellId the cell ID
      */
     void SetCellId(uint16_t cellId);
 
     /**
      * Get LTE UE RRC SAP provider function
      *
-     * \param rnti the RNTI
-     * \returns LTE UE RRC SAP provider
+     * @param rnti the RNTI
+     * @returns LTE UE RRC SAP provider
      */
     LteUeRrcSapProvider* GetUeRrcSapProvider(uint16_t rnti);
     /**
      * Set UE RRC SAP provider function
      *
-     * \param rnti the RNTI
-     * \param p the UE RRC SAP provider
+     * @param rnti the RNTI
+     * @param p the UE RRC SAP provider
      */
     void SetUeRrcSapProvider(uint16_t rnti, LteUeRrcSapProvider* p);
 
@@ -202,57 +202,57 @@
     /**
      * Setup UE function
      *
-     * \param rnti the RNTI
-     * \param params LteEnbRrcSapUser::SetupUeParameters
+     * @param rnti the RNTI
+     * @param params LteEnbRrcSapUser::SetupUeParameters
      */
     void DoSetupUe(uint16_t rnti, LteEnbRrcSapUser::SetupUeParameters params);
     /**
      * Remove UE function
      *
-     * \param rnti the RNTI
+     * @param rnti the RNTI
      */
     void DoRemoveUe(uint16_t rnti);
     /**
      * Send system information function
      *
-     * \param cellId cell ID
-     * \param msg LteRrcSap::SystemInformation
+     * @param cellId cell ID
+     * @param msg LteRrcSap::SystemInformation
      */
     void DoSendSystemInformation(uint16_t cellId, LteRrcSap::SystemInformation msg);
     /**
      * Send system information function
      *
-     * \param msg LteRrcSap::SystemInformation
+     * @param msg LteRrcSap::SystemInformation
      */
     void SendSystemInformation(LteRrcSap::SystemInformation msg);
     /**
      * Send RRC connection setup function
      *
-     * \param rnti the RNTI
-     * \param msg LteRrcSap::RrcConnectionSetup
+     * @param rnti the RNTI
+     * @param msg LteRrcSap::RrcConnectionSetup
      */
     void DoSendRrcConnectionSetup(uint16_t rnti, LteRrcSap::RrcConnectionSetup msg);
     /**
      * Send RRC connection reconfiguration function
      *
-     * \param rnti the RNTI
-     * \param msg LteRrcSap::RrcConnectionReconfiguration
+     * @param rnti the RNTI
+     * @param msg LteRrcSap::RrcConnectionReconfiguration
      */
     void DoSendRrcConnectionReconfiguration(uint16_t rnti,
                                             LteRrcSap::RrcConnectionReconfiguration msg);
     /**
      * Send RRC connection reestablishment function
      *
-     * \param rnti the RNTI
-     * \param msg LteRrcSap::RrcConnectionReestablishment
+     * @param rnti the RNTI
+     * @param msg LteRrcSap::RrcConnectionReestablishment
      */
     void DoSendRrcConnectionReestablishment(uint16_t rnti,
                                             LteRrcSap::RrcConnectionReestablishment msg);
     /**
      * Send RRC connection reestablishment reject function
      *
-     * \param rnti the RNTI
-     * \param msg LteRrcSap::RrcConnectionReestablishmentReject
+     * @param rnti the RNTI
+     * @param msg LteRrcSap::RrcConnectionReestablishmentReject
      */
     void DoSendRrcConnectionReestablishmentReject(
         uint16_t rnti,
@@ -260,43 +260,43 @@
     /**
      * Send RRC connection release function
      *
-     * \param rnti the RNTI
-     * \param msg LteRrcSap::RrcConnectionRelease
+     * @param rnti the RNTI
+     * @param msg LteRrcSap::RrcConnectionRelease
      */
     void DoSendRrcConnectionRelease(uint16_t rnti, LteRrcSap::RrcConnectionRelease msg);
     /**
      * Send RRC connection reject function
      *
-     * \param rnti the RNTI
-     * \param msg LteRrcSap::RrcConnectionReject
+     * @param rnti the RNTI
+     * @param msg LteRrcSap::RrcConnectionReject
      */
     void DoSendRrcConnectionReject(uint16_t rnti, LteRrcSap::RrcConnectionReject msg);
     /**
      * Encode handover preparation information function
      *
-     * \param msg LteRrcSap::HandoverPreparationInfo
-     * \returns the packet
+     * @param msg LteRrcSap::HandoverPreparationInfo
+     * @returns the packet
      */
     Ptr<Packet> DoEncodeHandoverPreparationInformation(LteRrcSap::HandoverPreparationInfo msg);
     /**
      * Encode handover preparation information function
      *
-     * \param p the packet
-     * \returns LteRrcSap::HandoverPreparationInfo
+     * @param p the packet
+     * @returns LteRrcSap::HandoverPreparationInfo
      */
     LteRrcSap::HandoverPreparationInfo DoDecodeHandoverPreparationInformation(Ptr<Packet> p);
     /**
      * Encode handover command function
      *
-     * \param msg LteRrcSap::RrcConnectionReconfiguration
-     * \returns rnti the RNTI
+     * @param msg LteRrcSap::RrcConnectionReconfiguration
+     * @returns rnti the RNTI
      */
     Ptr<Packet> DoEncodeHandoverCommand(LteRrcSap::RrcConnectionReconfiguration msg);
     /**
      * Decode handover command function
      *
-     * \param p the packet
-     * \returns LteRrcSap::RrcConnectionReconfiguration
+     * @param p the packet
+     * @returns LteRrcSap::RrcConnectionReconfiguration
      */
     LteRrcSap::RrcConnectionReconfiguration DoDecodeHandoverCommand(Ptr<Packet> p);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-rrc-protocol-real.cc ns-3.44/src/lte/model/lte-rrc-protocol-real.cc
--- ns-3.43/src/lte/model/lte-rrc-protocol-real.cc	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-rrc-protocol-real.cc	2025-03-09 16:55:49.603371900 -0700
@@ -15,12 +15,12 @@
 #include "lte-ue-net-device.h"
 #include "lte-ue-rrc.h"
 
-#include <ns3/fatal-error.h>
-#include <ns3/log.h>
-#include <ns3/node-list.h>
-#include <ns3/node.h>
-#include <ns3/nstime.h>
-#include <ns3/simulator.h>
+#include "ns3/fatal-error.h"
+#include "ns3/log.h"
+#include "ns3/node-list.h"
+#include "ns3/node.h"
+#include "ns3/nstime.h"
+#include "ns3/simulator.h"
 
 namespace ns3
 {
@@ -28,7 +28,7 @@
 NS_LOG_COMPONENT_DEFINE("LteRrcProtocolReal");
 
 /// RRC real message delay
-const Time RRC_REAL_MSG_DELAY = MilliSeconds(0);
+const Time RRC_REAL_MSG_DELAY;
 
 NS_OBJECT_ENSURE_REGISTERED(LteUeRrcProtocolReal);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-rrc-protocol-real.h ns-3.44/src/lte/model/lte-rrc-protocol-real.h
--- ns-3.43/src/lte/model/lte-rrc-protocol-real.h	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-rrc-protocol-real.h	2025-03-09 16:55:49.603371900 -0700
@@ -14,8 +14,8 @@
 #include "lte-rlc-sap.h"
 #include "lte-rrc-sap.h"
 
-#include <ns3/object.h>
-#include <ns3/ptr.h>
+#include "ns3/object.h"
+#include "ns3/ptr.h"
 
 #include <map>
 #include <stdint.h>
@@ -29,7 +29,7 @@
 class LteUeRrc;
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
  * Models the transmission of RRC messages from the UE to the eNB in
  * a real fashion, by creating real RRC PDUs and transmitting them
@@ -53,28 +53,28 @@
     // inherited from Object
     void DoDispose() override;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
      * Set LTE UE RRC SAP provider function
      *
-     * \param p the LTE UE RRC SAP provider
+     * @param p the LTE UE RRC SAP provider
      */
     void SetLteUeRrcSapProvider(LteUeRrcSapProvider* p);
     /**
      * Get LTE UE RRC SAP user function
      *
-     * \returns LTE UE RRC SAP user
+     * @returns LTE UE RRC SAP user
      */
     LteUeRrcSapUser* GetLteUeRrcSapUser();
 
     /**
      * Set UE RRC function
      *
-     * \param rrc the LTE UE RRC
+     * @param rrc the LTE UE RRC
      */
     void SetUeRrc(Ptr<LteUeRrc> rrc);
 
@@ -83,56 +83,56 @@
     /**
      * Setup function
      *
-     * \param params LteUeRrcSapUser::SetupParameters
+     * @param params LteUeRrcSapUser::SetupParameters
      */
     void DoSetup(LteUeRrcSapUser::SetupParameters params);
     /**
      * Send RRC connection request function
      *
-     * \param msg LteRrcSap::RrcConnectionRequest
+     * @param msg LteRrcSap::RrcConnectionRequest
      */
     void DoSendRrcConnectionRequest(LteRrcSap::RrcConnectionRequest msg);
     /**
      * Send RRC connection setup completed function
      *
-     * \param msg LteRrcSap::RrcConnectionSetupCompleted
+     * @param msg LteRrcSap::RrcConnectionSetupCompleted
      */
     void DoSendRrcConnectionSetupCompleted(LteRrcSap::RrcConnectionSetupCompleted msg) const;
     /**
      * Send RRC connection reconfiguration setup completed function
      *
-     * \param msg LteRrcSap::RrcConnectionReconfigurationCompleted
+     * @param msg LteRrcSap::RrcConnectionReconfigurationCompleted
      */
     void DoSendRrcConnectionReconfigurationCompleted(
         LteRrcSap::RrcConnectionReconfigurationCompleted msg);
     /**
      * Send RRC connection reestablishment request function
      *
-     * \param msg LteRrcSap::RrcConnectionReestablishmentRequest
+     * @param msg LteRrcSap::RrcConnectionReestablishmentRequest
      */
     void DoSendRrcConnectionReestablishmentRequest(
         LteRrcSap::RrcConnectionReestablishmentRequest msg) const;
     /**
      * Send RRC connection reestablishment complete function
      *
-     * \param msg LteRrcSap::RrcConnectionReestablishmentComplete
+     * @param msg LteRrcSap::RrcConnectionReestablishmentComplete
      */
     void DoSendRrcConnectionReestablishmentComplete(
         LteRrcSap::RrcConnectionReestablishmentComplete msg) const;
     /**
      * Send measurement report function
      *
-     * \param msg LteRrcSap::MeasurementReport
+     * @param msg LteRrcSap::MeasurementReport
      */
     void DoSendMeasurementReport(LteRrcSap::MeasurementReport msg);
     /**
-     * \brief Send ideal UE context remove request function
+     * @brief Send ideal UE context remove request function
      *
      * Notify eNodeB to release UE context once radio link failure
      * or random access failure is detected. It is needed since no
      * RLF detection mechanism at eNodeB is implemented
      *
-     * \param rnti the RNTI of the UE
+     * @param rnti the RNTI of the UE
      */
     void DoSendIdealUeContextRemoveRequest(uint16_t rnti);
 
@@ -141,13 +141,13 @@
     /**
      * Receive PDCP PDU function
      *
-     * \param p the packet
+     * @param p the packet
      */
     void DoReceivePdcpPdu(Ptr<Packet> p);
     /**
      * Receive PDCP SDU function
      *
-     * \param params LtePdcpSapUser::ReceivePdcpSduParameters
+     * @param params LtePdcpSapUser::ReceivePdcpSduParameters
      */
     void DoReceivePdcpSdu(LtePdcpSapUser::ReceivePdcpSduParameters params);
 
@@ -187,43 +187,43 @@
     // inherited from Object
     void DoDispose() override;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
      * Set LTE ENB RRC SAP provider function
      *
-     * \param p LteEnbRrcSapProvider *
+     * @param p LteEnbRrcSapProvider *
      */
     void SetLteEnbRrcSapProvider(LteEnbRrcSapProvider* p);
     /**
      * Get LTE ENB RRC SAP user function
      *
-     * \returns LteEnbRrcSapUser *
+     * @returns LteEnbRrcSapUser *
      */
     LteEnbRrcSapUser* GetLteEnbRrcSapUser();
 
     /**
      * Set cell ID function
      *
-     * \param cellId the cell ID
+     * @param cellId the cell ID
      */
     void SetCellId(uint16_t cellId);
 
     /**
      * Get UE RRC SAP provider function
      *
-     * \param rnti the RNTI
-     * \returns LteUeRrcSapProvider *
+     * @param rnti the RNTI
+     * @returns LteUeRrcSapProvider *
      */
     LteUeRrcSapProvider* GetUeRrcSapProvider(uint16_t rnti);
     /**
      * Set UE RRC SAP provider function
      *
-     * \param rnti the RNTI
-     * \param p LteUeRrcSapProvider *
+     * @param rnti the RNTI
+     * @param p LteUeRrcSapProvider *
      */
     void SetUeRrcSapProvider(uint16_t rnti, LteUeRrcSapProvider* p);
 
@@ -232,58 +232,58 @@
     /**
      * Setup UE function
      *
-     * \param rnti the RNTI
-     * \param params LteEnbRrcSapUser::SetupUeParameters
+     * @param rnti the RNTI
+     * @param params LteEnbRrcSapUser::SetupUeParameters
      */
     void DoSetupUe(uint16_t rnti, LteEnbRrcSapUser::SetupUeParameters params);
     /**
      * Remove UE function
      *
-     * \param rnti the RNTI
+     * @param rnti the RNTI
      */
     void DoRemoveUe(uint16_t rnti);
     /**
      * Send system information function
      *
-     * \param cellId cell ID
-     * \param msg LteRrcSap::SystemInformation
+     * @param cellId cell ID
+     * @param msg LteRrcSap::SystemInformation
      */
     void DoSendSystemInformation(uint16_t cellId, LteRrcSap::SystemInformation msg);
     /**
      * Send system information function
      *
-     * \param cellId cell ID
-     * \param msg LteRrcSap::SystemInformation
+     * @param cellId cell ID
+     * @param msg LteRrcSap::SystemInformation
      */
     void SendSystemInformation(uint16_t cellId, LteRrcSap::SystemInformation msg);
     /**
      * Send RRC connection setup function
      *
-     * \param rnti the RNTI
-     * \param msg LteRrcSap::RrcConnectionSetup
+     * @param rnti the RNTI
+     * @param msg LteRrcSap::RrcConnectionSetup
      */
     void DoSendRrcConnectionSetup(uint16_t rnti, LteRrcSap::RrcConnectionSetup msg);
     /**
      * Send RRC connection reconfiguration function
      *
-     * \param rnti the RNTI
-     * \param msg LteRrcSap::RrcConnectionReconfiguration
+     * @param rnti the RNTI
+     * @param msg LteRrcSap::RrcConnectionReconfiguration
      */
     void DoSendRrcConnectionReconfiguration(uint16_t rnti,
                                             LteRrcSap::RrcConnectionReconfiguration msg);
     /**
      * Send RRC connection reestabishment function
      *
-     * \param rnti the RNTI
-     * \param msg LteRrcSap::RrcConnectionReestablishment
+     * @param rnti the RNTI
+     * @param msg LteRrcSap::RrcConnectionReestablishment
      */
     void DoSendRrcConnectionReestablishment(uint16_t rnti,
                                             LteRrcSap::RrcConnectionReestablishment msg);
     /**
      * Send RRC connection reestabishment reject function
      *
-     * \param rnti the RNTI
-     * \param msg LteRrcSap::RrcConnectionReestablishmentReject
+     * @param rnti the RNTI
+     * @param msg LteRrcSap::RrcConnectionReestablishmentReject
      */
     void DoSendRrcConnectionReestablishmentReject(
         uint16_t rnti,
@@ -291,57 +291,57 @@
     /**
      * Send RRC connection release function
      *
-     * \param rnti the RNTI
-     * \param msg LteRrcSap::RrcConnectionRelease
+     * @param rnti the RNTI
+     * @param msg LteRrcSap::RrcConnectionRelease
      */
     void DoSendRrcConnectionRelease(uint16_t rnti, LteRrcSap::RrcConnectionRelease msg);
     /**
      * Send RRC connection reject function
      *
-     * \param rnti the RNTI
-     * \param msg LteRrcSap::RrcConnectionReject
+     * @param rnti the RNTI
+     * @param msg LteRrcSap::RrcConnectionReject
      */
     void DoSendRrcConnectionReject(uint16_t rnti, LteRrcSap::RrcConnectionReject msg);
     /**
      * Encode handover preparation information function
      *
-     * \param msg LteRrcSap::HandoverPreparationInfo
-     * \returns the packet
+     * @param msg LteRrcSap::HandoverPreparationInfo
+     * @returns the packet
      */
     Ptr<Packet> DoEncodeHandoverPreparationInformation(LteRrcSap::HandoverPreparationInfo msg);
     /**
      * Decode handover preparation information function
      *
-     * \param p the packet
-     * \returns LteRrcSap::HandoverPreparationInfo
+     * @param p the packet
+     * @returns LteRrcSap::HandoverPreparationInfo
      */
     LteRrcSap::HandoverPreparationInfo DoDecodeHandoverPreparationInformation(Ptr<Packet> p);
     /**
      * Encode handover command function
      *
-     * \param msg LteRrcSap::RrcConnectionReconfiguration
-     * \returns the packet
+     * @param msg LteRrcSap::RrcConnectionReconfiguration
+     * @returns the packet
      */
     Ptr<Packet> DoEncodeHandoverCommand(LteRrcSap::RrcConnectionReconfiguration msg);
     /**
      * Decode handover command function
      *
-     * \param p the packet
-     * \returns LteRrcSap::RrcConnectionReconfiguration
+     * @param p the packet
+     * @returns LteRrcSap::RrcConnectionReconfiguration
      */
     LteRrcSap::RrcConnectionReconfiguration DoDecodeHandoverCommand(Ptr<Packet> p);
 
     /**
      * Receive PDCP SDU function
      *
-     * \param params LtePdcpSapUser::ReceivePdcpSduParameters
+     * @param params LtePdcpSapUser::ReceivePdcpSduParameters
      */
     void DoReceivePdcpSdu(LtePdcpSapUser::ReceivePdcpSduParameters params);
     /**
      * Receive PDCP PDU function
      *
-     * \param rnti the RNTI
-     * \param p the packet
+     * @param rnti the RNTI
+     * @param p the packet
      */
     void DoReceivePdcpPdu(uint16_t rnti, Ptr<Packet> p);
 
@@ -363,8 +363,8 @@
     /**
      * Real protocol RC SAP user
      *
-     * \param pdcp LteEnbRrcProtocolReal *
-     * \param rnti the RNTI
+     * @param pdcp LteEnbRrcProtocolReal *
+     * @param rnti the RNTI
      */
     RealProtocolRlcSapUser(LteEnbRrcProtocolReal* pdcp, uint16_t rnti);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-rrc-sap.h ns-3.44/src/lte/model/lte-rrc-sap.h
--- ns-3.43/src/lte/model/lte-rrc-sap.h	2024-10-09 16:41:10.040656600 -0700
+++ ns-3.44/src/lte/model/lte-rrc-sap.h	2025-03-09 16:55:49.603371900 -0700
@@ -10,8 +10,8 @@
 #ifndef LTE_RRC_SAP_H
 #define LTE_RRC_SAP_H
 
-#include <ns3/ptr.h>
-#include <ns3/simulator.h>
+#include "ns3/ptr.h"
+#include "ns3/simulator.h"
 
 #include <list>
 #include <stdint.h>
@@ -26,9 +26,9 @@
 class Packet;
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
- * \brief Class holding definition common to all UE/eNodeB SAP Users/Providers.
+ * @brief Class holding definition common to all UE/eNodeB SAP Users/Providers.
  *
  * See 3GPP TS 36.331 for reference.
  *
@@ -172,8 +172,8 @@
     /**
      * Convert PDSCH config dedicated function
      *
-     * \param pdschConfigDedicated PdschConfigDedicated
-     * \returns double value
+     * @param pdschConfigDedicated PdschConfigDedicated
+     * @returns double value
      */
     static double ConvertPdschConfigDedicated2Double(PdschConfigDedicated pdschConfigDedicated)
     {
@@ -337,7 +337,7 @@
     };
 
     /**
-     * \brief Threshold for event evaluation.
+     * @brief Threshold for event evaluation.
      *
      * For RSRP-based threshold, the actual value is (value - 140) dBm. While for
      * RSRQ-based threshold, the actual value is (value - 40) / 2 dB. This is in
@@ -940,7 +940,7 @@
 };
 
 /**
- * \brief Part of the RRC protocol. This Service Access Point (SAP) is used by
+ * @brief Part of the RRC protocol. This Service Access Point (SAP) is used by
  *        the UE RRC to send messages to the eNB. Each method defined in this
  *        class corresponds to the transmission of a message that is defined in
  *        Section 6.2.2 of TS 36.331.
@@ -956,76 +956,76 @@
     };
 
     /**
-     * \brief Setup function
-     * \param params the setup parameters
+     * @brief Setup function
+     * @param params the setup parameters
      */
     virtual void Setup(SetupParameters params) = 0;
 
     /**
-     * \brief Send an _RRCConnectionRequest message to the serving eNodeB
+     * @brief Send an _RRCConnectionRequest message to the serving eNodeB
      *        during an RRC connection establishment procedure
      *        (Section 5.3.3 of TS 36.331).
-     * \param msg the message
+     * @param msg the message
      */
     virtual void SendRrcConnectionRequest(RrcConnectionRequest msg) = 0;
 
     /**
-     * \brief Send an _RRCConnectionSetupComplete_ message to the serving eNodeB
+     * @brief Send an _RRCConnectionSetupComplete_ message to the serving eNodeB
      *        during an RRC connection establishment procedure
      *        (Section 5.3.3 of TS 36.331).
-     * \param msg the message
+     * @param msg the message
      */
     virtual void SendRrcConnectionSetupCompleted(RrcConnectionSetupCompleted msg) = 0;
 
     /**
-     * \brief Send an _RRCConnectionReconfigurationComplete_ message to the serving eNodeB
+     * @brief Send an _RRCConnectionReconfigurationComplete_ message to the serving eNodeB
      *        during an RRC connection reconfiguration procedure
      *        (Section 5.3.5 of TS 36.331).
-     * \param msg the message
+     * @param msg the message
      */
     virtual void SendRrcConnectionReconfigurationCompleted(
         RrcConnectionReconfigurationCompleted msg) = 0;
 
     /**
-     * \brief Send an _RRCConnectionReestablishmentRequest_ message to the serving eNodeB
+     * @brief Send an _RRCConnectionReestablishmentRequest_ message to the serving eNodeB
      *        during an RRC connection re-establishment procedure
      *        (Section 5.3.7 of TS 36.331).
-     * \param msg the message
+     * @param msg the message
      */
     virtual void SendRrcConnectionReestablishmentRequest(
         RrcConnectionReestablishmentRequest msg) = 0;
 
     /**
-     * \brief Send an _RRCConnectionReestablishmentComplete_ message to the serving eNodeB
+     * @brief Send an _RRCConnectionReestablishmentComplete_ message to the serving eNodeB
      *        during an RRC connection re-establishment procedure
      *        (Section 5.3.7 of TS 36.331).
-     * \param msg the message
+     * @param msg the message
      */
     virtual void SendRrcConnectionReestablishmentComplete(
         RrcConnectionReestablishmentComplete msg) = 0;
 
     /**
-     * \brief Send a _MeasurementReport_ message to the serving eNodeB
+     * @brief Send a _MeasurementReport_ message to the serving eNodeB
      *        during a measurement reporting procedure
      *        (Section 5.5.5 of TS 36.331).
-     * \param msg the message
+     * @param msg the message
      */
     virtual void SendMeasurementReport(MeasurementReport msg) = 0;
 
     /**
-     * \brief Send UE context remove request function
+     * @brief Send UE context remove request function
      *
      * Request eNodeB to remove UE context once radio link failure or
      * random access failure is detected. It is needed since no RLF
      * detection mechanism at eNodeB is implemented.
      *
-     * \param rnti the C-RNTI of the UE
+     * @param rnti the C-RNTI of the UE
      */
     virtual void SendIdealUeContextRemoveRequest(uint16_t rnti) = 0;
 };
 
 /**
- * \brief Part of the RRC protocol. This Service Access Point (SAP) is used to
+ * @brief Part of the RRC protocol. This Service Access Point (SAP) is used to
  *        let the UE RRC receive a message from the eNB RRC. Each method defined
  *        in this class corresponds to the reception of a message that is
  *        defined in Section 6.2.2 of TS 36.331.
@@ -1041,70 +1041,70 @@
     };
 
     /**
-     * \brief Complete setup function
-     * \param params the complete setup parameters
+     * @brief Complete setup function
+     * @param params the complete setup parameters
      */
     virtual void CompleteSetup(CompleteSetupParameters params) = 0;
 
     /**
-     * \brief Receive a _SystemInformation_ message from the serving eNodeB
+     * @brief Receive a _SystemInformation_ message from the serving eNodeB
      *        during a system information acquisition procedure
      *        (Section 5.2.2 of TS 36.331).
-     * \param msg the message
+     * @param msg the message
      */
     virtual void RecvSystemInformation(SystemInformation msg) = 0;
 
     /**
-     * \brief Receive an _RRCConnectionSetup_ message from the serving eNodeB
+     * @brief Receive an _RRCConnectionSetup_ message from the serving eNodeB
      *        during an RRC connection establishment procedure
      *        (Section 5.3.3 of TS 36.331).
-     * \param msg the message
+     * @param msg the message
      */
     virtual void RecvRrcConnectionSetup(RrcConnectionSetup msg) = 0;
 
     /**
-     * \brief Receive an _RRCConnectionReconfiguration_ message from the serving eNodeB
+     * @brief Receive an _RRCConnectionReconfiguration_ message from the serving eNodeB
      *        during an RRC connection reconfiguration procedure
      *        (Section 5.3.5 of TS 36.331).
-     * \param msg the message
+     * @param msg the message
      */
     virtual void RecvRrcConnectionReconfiguration(RrcConnectionReconfiguration msg) = 0;
 
     /**
-     * \brief Receive an _RRCConnectionReestablishment_ message from the serving eNodeB
+     * @brief Receive an _RRCConnectionReestablishment_ message from the serving eNodeB
      *        during an RRC connection re-establishment procedure
      *        (Section 5.3.7 of TS 36.331).
-     * \param msg the message
+     * @param msg the message
      */
     virtual void RecvRrcConnectionReestablishment(RrcConnectionReestablishment msg) = 0;
 
     /**
-     * \brief Receive an _RRCConnectionReestablishmentReject_ message from the serving eNodeB
+     * @brief Receive an _RRCConnectionReestablishmentReject_ message from the serving eNodeB
      *        during an RRC connection re-establishment procedure
      *        (Section 5.3.7 of TS 36.331).
-     * \param msg the message
+     * @param msg the message
      */
     virtual void RecvRrcConnectionReestablishmentReject(RrcConnectionReestablishmentReject msg) = 0;
 
     /**
-     * \brief Receive an _RRCConnectionRelease_ message from the serving eNodeB
+     * @brief Receive an _RRCConnectionRelease_ message from the serving eNodeB
      *        during an RRC connection release procedure
      *        (Section 5.3.8 of TS 36.331).
-     * \param msg the message
+     * @param msg the message
      */
     virtual void RecvRrcConnectionRelease(RrcConnectionRelease msg) = 0;
 
     /**
-     * \brief Receive an _RRCConnectionReject_ message from the serving eNodeB
+     * @brief Receive an _RRCConnectionReject_ message from the serving eNodeB
      *        during an RRC connection establishment procedure
      *        (Section 5.3.3 of TS 36.331).
-     * \param msg the message
+     * @param msg the message
      */
     virtual void RecvRrcConnectionReject(RrcConnectionReject msg) = 0;
 };
 
 /**
- * \brief Part of the RRC protocol. This Service Access Point (SAP) is used by
+ * @brief Part of the RRC protocol. This Service Access Point (SAP) is used by
  *        the eNB RRC to send messages to the UE RRC.  Each method defined in
  *        this class corresponds to the transmission of a message that is
  *        defined in Section 6.2.2 of TS 36.331.
@@ -1120,111 +1120,111 @@
     };
 
     /**
-     * \brief Setup UE function
-     * \param rnti the RNTI
-     * \param params the setup UE parameters
+     * @brief Setup UE function
+     * @param rnti the RNTI
+     * @param params the setup UE parameters
      */
     virtual void SetupUe(uint16_t rnti, SetupUeParameters params) = 0;
     /**
-     * \brief Remove UE function
-     * \param rnti the RNTI
+     * @brief Remove UE function
+     * @param rnti the RNTI
      */
     virtual void RemoveUe(uint16_t rnti) = 0;
 
     /**
-     * \brief Send a _SystemInformation_ message to all attached UEs
+     * @brief Send a _SystemInformation_ message to all attached UEs
      *        during a system information acquisition procedure
      *        (Section 5.2.2 of TS 36.331).
-     * \param cellId cell ID
-     * \param msg the message
+     * @param cellId cell ID
+     * @param msg the message
      */
     virtual void SendSystemInformation(uint16_t cellId, SystemInformation msg) = 0;
 
     /**
-     * \brief Send an _RRCConnectionSetup_ message to a UE
+     * @brief Send an _RRCConnectionSetup_ message to a UE
      *        during an RRC connection establishment procedure
      *        (Section 5.3.3 of TS 36.331).
-     * \param rnti the RNTI of the destination UE
-     * \param msg the message
+     * @param rnti the RNTI of the destination UE
+     * @param msg the message
      */
     virtual void SendRrcConnectionSetup(uint16_t rnti, RrcConnectionSetup msg) = 0;
 
     /**
-     * \brief Send an _RRCConnectionReconfiguration_ message to a UE
+     * @brief Send an _RRCConnectionReconfiguration_ message to a UE
      *        during an RRC connection reconfiguration procedure
      *        (Section 5.3.5 of TS 36.331).
-     * \param rnti the RNTI of the destination UE
-     * \param msg the message
+     * @param rnti the RNTI of the destination UE
+     * @param msg the message
      */
     virtual void SendRrcConnectionReconfiguration(uint16_t rnti,
                                                   RrcConnectionReconfiguration msg) = 0;
 
     /**
-     * \brief Send an _RRCConnectionReestablishment_ message to a UE
+     * @brief Send an _RRCConnectionReestablishment_ message to a UE
      *        during an RRC connection re-establishment procedure
      *        (Section 5.3.7 of TS 36.331).
-     * \param rnti the RNTI of the destination UE
-     * \param msg the message
+     * @param rnti the RNTI of the destination UE
+     * @param msg the message
      */
     virtual void SendRrcConnectionReestablishment(uint16_t rnti,
                                                   RrcConnectionReestablishment msg) = 0;
 
     /**
-     * \brief Send an _RRCConnectionReestablishmentReject_ message to a UE
+     * @brief Send an _RRCConnectionReestablishmentReject_ message to a UE
      *        during an RRC connection re-establishment procedure
      *        (Section 5.3.7 of TS 36.331).
-     * \param rnti the RNTI of the destination UE
-     * \param msg the message
+     * @param rnti the RNTI of the destination UE
+     * @param msg the message
      */
     virtual void SendRrcConnectionReestablishmentReject(uint16_t rnti,
                                                         RrcConnectionReestablishmentReject msg) = 0;
 
     /**
-     * \brief Send an _RRCConnectionRelease_ message to a UE
+     * @brief Send an _RRCConnectionRelease_ message to a UE
      *        during an RRC connection release procedure
      *        (Section 5.3.8 of TS 36.331).
-     * \param rnti the RNTI of the destination UE
-     * \param msg the message
+     * @param rnti the RNTI of the destination UE
+     * @param msg the message
      */
     virtual void SendRrcConnectionRelease(uint16_t rnti, RrcConnectionRelease msg) = 0;
 
     /**
-     * \brief Send an _RRCConnectionReject_ message to a UE
+     * @brief Send an _RRCConnectionReject_ message to a UE
      *        during an RRC connection establishment procedure
      *        (Section 5.3.3 of TS 36.331).
-     * \param rnti the RNTI of the destination UE
-     * \param msg the message
+     * @param rnti the RNTI of the destination UE
+     * @param msg the message
      */
     virtual void SendRrcConnectionReject(uint16_t rnti, RrcConnectionReject msg) = 0;
 
     /**
-     * \brief Encode handover prepration information
-     * \param msg HandoverPreparationInfo
-     * \returns the packet
+     * @brief Encode handover prepration information
+     * @param msg HandoverPreparationInfo
+     * @returns the packet
      */
     virtual Ptr<Packet> EncodeHandoverPreparationInformation(HandoverPreparationInfo msg) = 0;
     /**
-     * \brief Decode handover prepration information
-     * \param p the packet
-     * \returns HandoverPreparationInfo
+     * @brief Decode handover prepration information
+     * @param p the packet
+     * @returns HandoverPreparationInfo
      */
     virtual HandoverPreparationInfo DecodeHandoverPreparationInformation(Ptr<Packet> p) = 0;
     /**
-     * \brief Encode handover command
-     * \param msg RrcConnectionReconfiguration
-     * \returns the packet
+     * @brief Encode handover command
+     * @param msg RrcConnectionReconfiguration
+     * @returns the packet
      */
     virtual Ptr<Packet> EncodeHandoverCommand(RrcConnectionReconfiguration msg) = 0;
     /**
-     * \brief Decode handover command
-     * \param p the packet
-     * \returns RrcConnectionReconfiguration
+     * @brief Decode handover command
+     * @param p the packet
+     * @returns RrcConnectionReconfiguration
      */
     virtual RrcConnectionReconfiguration DecodeHandoverCommand(Ptr<Packet> p) = 0;
 };
 
 /**
- * \brief Part of the RRC protocol. This Service Access Point (SAP) is used to
+ * @brief Part of the RRC protocol. This Service Access Point (SAP) is used to
  *        let the eNB RRC receive a message from a UE RRC.  Each method defined
  *        in this class corresponds to the reception of a message that is
  *        defined in Section 6.2.2 of TS 36.331.
@@ -1240,81 +1240,81 @@
     };
 
     /**
-     * \brief Complete setup UE function
-     * \param rnti the RNTI of UE which sent the message
-     * \param params CompleteSetupUeParameters
+     * @brief Complete setup UE function
+     * @param rnti the RNTI of UE which sent the message
+     * @param params CompleteSetupUeParameters
      */
     virtual void CompleteSetupUe(uint16_t rnti, CompleteSetupUeParameters params) = 0;
 
     /**
-     * \brief Receive an _RRCConnectionRequest_ message from a UE
+     * @brief Receive an _RRCConnectionRequest_ message from a UE
      *        during an RRC connection establishment procedure
      *        (Section 5.3.3 of TS 36.331).
-     * \param rnti the RNTI of UE which sent the message
-     * \param msg the message
+     * @param rnti the RNTI of UE which sent the message
+     * @param msg the message
      */
     virtual void RecvRrcConnectionRequest(uint16_t rnti, RrcConnectionRequest msg) = 0;
 
     /**
-     * \brief Receive an _RRCConnectionSetupComplete_ message from a UE
+     * @brief Receive an _RRCConnectionSetupComplete_ message from a UE
      *        during an RRC connection establishment procedure
      *        (Section 5.3.3 of TS 36.331).
-     * \param rnti the RNTI of UE which sent the message
-     * \param msg the message
+     * @param rnti the RNTI of UE which sent the message
+     * @param msg the message
      */
     virtual void RecvRrcConnectionSetupCompleted(uint16_t rnti,
                                                  RrcConnectionSetupCompleted msg) = 0;
 
     /**
-     * \brief Receive an _RRCConnectionReconfigurationComplete_ message from a UE
+     * @brief Receive an _RRCConnectionReconfigurationComplete_ message from a UE
      *        during an RRC connection reconfiguration procedure
      *        (Section 5.3.5 of TS 36.331).
-     * \param rnti the RNTI of UE which sent the message
-     * \param msg the message
+     * @param rnti the RNTI of UE which sent the message
+     * @param msg the message
      */
     virtual void RecvRrcConnectionReconfigurationCompleted(
         uint16_t rnti,
         RrcConnectionReconfigurationCompleted msg) = 0;
 
     /**
-     * \brief Receive an _RRCConnectionReestablishmentRequest_ message from a UE
+     * @brief Receive an _RRCConnectionReestablishmentRequest_ message from a UE
      *        during an RRC connection re-establishment procedure
      *        (Section 5.3.7 of TS 36.331).
-     * \param rnti the RNTI of UE which sent the message
-     * \param msg the message
+     * @param rnti the RNTI of UE which sent the message
+     * @param msg the message
      */
     virtual void RecvRrcConnectionReestablishmentRequest(
         uint16_t rnti,
         RrcConnectionReestablishmentRequest msg) = 0;
 
     /**
-     * \brief Receive an _RRCConnectionReestablishmentComplete_ message from a UE
+     * @brief Receive an _RRCConnectionReestablishmentComplete_ message from a UE
      *        during an RRC connection re-establishment procedure
      *        (Section 5.3.7 of TS 36.331).
-     * \param rnti the RNTI of UE which sent the message
-     * \param msg the message
+     * @param rnti the RNTI of UE which sent the message
+     * @param msg the message
      */
     virtual void RecvRrcConnectionReestablishmentComplete(
         uint16_t rnti,
         RrcConnectionReestablishmentComplete msg) = 0;
 
     /**
-     * \brief Receive a _MeasurementReport_ message from a UE
+     * @brief Receive a _MeasurementReport_ message from a UE
      *        during a measurement reporting procedure
      *        (Section 5.5.5 of TS 36.331).
-     * \param rnti the RNTI of UE which sent the message
-     * \param msg the message
+     * @param rnti the RNTI of UE which sent the message
+     * @param msg the message
      */
     virtual void RecvMeasurementReport(uint16_t rnti, MeasurementReport msg) = 0;
 
     /**
-     * \brief Receive ideal UE context remove request from the UE RRC.
+     * @brief Receive ideal UE context remove request from the UE RRC.
      *
      * Receive the notification from UE to remove the UE context
      * once radio link failure or random access failure is detected.
      * It is needed since no RLF detection mechanism at eNodeB is implemented.
      *
-     * \param rnti the C-RNTI of the UE
+     * @param rnti the C-RNTI of the UE
      */
     virtual void RecvIdealUeContextRemoveRequest(uint16_t rnti) = 0;
 };
@@ -1335,7 +1335,7 @@
     /**
      * Constructor
      *
-     * \param owner the owner class
+     * @param owner the owner class
      */
     MemberLteUeRrcSapUser(C* owner);
 
@@ -1434,7 +1434,7 @@
     /**
      * Constructor
      *
-     * \param owner the owner class
+     * @param owner the owner class
      */
     MemberLteUeRrcSapProvider(C* owner);
 
@@ -1530,7 +1530,7 @@
     /**
      * Constructor
      *
-     * \param owner the owner class
+     * @param owner the owner class
      */
     MemberLteEnbRrcSapUser(C* owner);
 
@@ -1669,7 +1669,7 @@
     /**
      * Constructor
      *
-     * \param owner
+     * @param owner
      */
     MemberLteEnbRrcSapProvider(C* owner);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-spectrum-phy.cc ns-3.44/src/lte/model/lte-spectrum-phy.cc
--- ns-3.43/src/lte/model/lte-spectrum-phy.cc	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/model/lte-spectrum-phy.cc	2025-03-09 16:55:49.603371900 -0700
@@ -16,14 +16,14 @@
 #include "lte-radio-bearer-tag.h"
 #include "lte-spectrum-signal-parameters.h"
 
-#include <ns3/antenna-model.h>
-#include <ns3/boolean.h>
-#include <ns3/config.h>
-#include <ns3/double.h>
-#include <ns3/log.h>
-#include <ns3/object-factory.h>
-#include <ns3/simulator.h>
-#include <ns3/trace-source-accessor.h>
+#include "ns3/antenna-model.h"
+#include "ns3/boolean.h"
+#include "ns3/config.h"
+#include "ns3/double.h"
+#include "ns3/log.h"
+#include "ns3/object-factory.h"
+#include "ns3/simulator.h"
+#include "ns3/trace-source-accessor.h"
 
 #include <cmath>
 
@@ -59,9 +59,9 @@
 /**
  * Equality operator
  *
- * \param a lhs
- * \param b rhs
- * \returns true if rnti and layer are equal
+ * @param a lhs
+ * @param b rhs
+ * @returns true if rnti and layer are equal
  */
 bool
 operator==(const TbId_t& a, const TbId_t& b)
@@ -72,9 +72,9 @@
 /**
  * Less than operator
  *
- * \param a lhs
- * \param b rhs
- * \returns true if rnti less than ro rnti equal and layer less than
+ * @param a lhs
+ * @param b rhs
+ * @returns true if rnti less than ro rnti equal and layer less than
  */
 bool
 operator<(const TbId_t& a, const TbId_t& b)
@@ -135,9 +135,9 @@
 /**
  * Output stream output operator
  *
- * \param os output stream
- * \param s state
- * \returns output stream
+ * @param os output stream
+ * @param s state
+ * @returns output stream
  */
 std::ostream&
 operator<<(std::ostream& os, LteSpectrumPhy::State s)
@@ -1029,127 +1029,125 @@
             itTb = m_expectedTbs.find(tbId);
             NS_LOG_INFO(this << " Packet of " << tbId.m_rnti << " layer "
                              << (uint16_t)tag.GetLayer());
-            if (itTb != m_expectedTbs.end())
+            if (itTb == m_expectedTbs.end())
             {
-                if (!(*itTb).second.corrupt)
+                continue;
+            }
+
+            if (!(*itTb).second.corrupt)
+            {
+                m_phyRxEndOkTrace(*j);
+
+                if (!m_ltePhyRxDataEndOkCallback.IsNull())
                 {
-                    m_phyRxEndOkTrace(*j);
+                    m_ltePhyRxDataEndOkCallback(*j);
+                }
+            }
+            else
+            {
+                // TB received with errors
+                m_phyRxEndErrorTrace(*j);
+            }
 
-                    if (!m_ltePhyRxDataEndOkCallback.IsNull())
-                    {
-                        m_ltePhyRxDataEndOkCallback(*j);
-                    }
+            // send HARQ feedback (if not already done for this TB)
+            if ((*itTb).second.harqFeedbackSent)
+            {
+                continue;
+            }
+
+            (*itTb).second.harqFeedbackSent = true;
+            if (!(*itTb).second.downlink)
+            {
+                UlInfoListElement_s harqUlInfo;
+                harqUlInfo.m_rnti = tbId.m_rnti;
+                harqUlInfo.m_tpc = 0;
+                if ((*itTb).second.corrupt)
+                {
+                    harqUlInfo.m_receptionStatus = UlInfoListElement_s::NotOk;
+                    NS_LOG_DEBUG(this << " RNTI " << tbId.m_rnti << " send UL-HARQ-NACK");
+                    m_harqPhyModule->UpdateUlHarqProcessStatus(
+                        tbId.m_rnti,
+                        (*itTb).second.mi,
+                        (*itTb).second.size,
+                        (*itTb).second.size / EffectiveCodingRate[(*itTb).second.mcs]);
                 }
                 else
                 {
-                    // TB received with errors
-                    m_phyRxEndErrorTrace(*j);
+                    harqUlInfo.m_receptionStatus = UlInfoListElement_s::Ok;
+                    NS_LOG_DEBUG(this << " RNTI " << tbId.m_rnti << " send UL-HARQ-ACK");
+                    m_harqPhyModule->ResetUlHarqProcessStatus(tbId.m_rnti,
+                                                              (*itTb).second.harqProcessId);
                 }
-
-                // send HARQ feedback (if not already done for this TB)
-                if (!(*itTb).second.harqFeedbackSent)
+                if (!m_ltePhyUlHarqFeedbackCallback.IsNull())
                 {
-                    (*itTb).second.harqFeedbackSent = true;
-                    if (!(*itTb).second.downlink)
+                    m_ltePhyUlHarqFeedbackCallback(harqUlInfo);
+                }
+            }
+            else
+            {
+                auto itHarq = harqDlInfoMap.find(tbId.m_rnti);
+                if (itHarq == harqDlInfoMap.end())
+                {
+                    DlInfoListElement_s harqDlInfo;
+                    harqDlInfo.m_harqStatus.resize(m_layersNum, DlInfoListElement_s::ACK);
+                    harqDlInfo.m_rnti = tbId.m_rnti;
+                    harqDlInfo.m_harqProcessId = (*itTb).second.harqProcessId;
+                    if ((*itTb).second.corrupt)
                     {
-                        UlInfoListElement_s harqUlInfo;
-                        harqUlInfo.m_rnti = tbId.m_rnti;
-                        harqUlInfo.m_tpc = 0;
-                        if ((*itTb).second.corrupt)
-                        {
-                            harqUlInfo.m_receptionStatus = UlInfoListElement_s::NotOk;
-                            NS_LOG_DEBUG(this << " RNTI " << tbId.m_rnti << " send UL-HARQ-NACK");
-                            m_harqPhyModule->UpdateUlHarqProcessStatus(
-                                tbId.m_rnti,
-                                (*itTb).second.mi,
-                                (*itTb).second.size,
-                                (*itTb).second.size / EffectiveCodingRate[(*itTb).second.mcs]);
-                        }
-                        else
-                        {
-                            harqUlInfo.m_receptionStatus = UlInfoListElement_s::Ok;
-                            NS_LOG_DEBUG(this << " RNTI " << tbId.m_rnti << " send UL-HARQ-ACK");
-                            m_harqPhyModule->ResetUlHarqProcessStatus(tbId.m_rnti,
-                                                                      (*itTb).second.harqProcessId);
-                        }
-                        if (!m_ltePhyUlHarqFeedbackCallback.IsNull())
-                        {
-                            m_ltePhyUlHarqFeedbackCallback(harqUlInfo);
-                        }
+                        harqDlInfo.m_harqStatus.at(tbId.m_layer) = DlInfoListElement_s::NACK;
+                        NS_LOG_DEBUG(this << " RNTI " << tbId.m_rnti << " harqId "
+                                          << (uint16_t)(*itTb).second.harqProcessId << " layer "
+                                          << (uint16_t)tbId.m_layer << " send DL-HARQ-NACK");
+                        m_harqPhyModule->UpdateDlHarqProcessStatus(
+                            (*itTb).second.harqProcessId,
+                            tbId.m_layer,
+                            (*itTb).second.mi,
+                            (*itTb).second.size,
+                            (*itTb).second.size / EffectiveCodingRate[(*itTb).second.mcs]);
                     }
                     else
                     {
-                        auto itHarq = harqDlInfoMap.find(tbId.m_rnti);
-                        if (itHarq == harqDlInfoMap.end())
-                        {
-                            DlInfoListElement_s harqDlInfo;
-                            harqDlInfo.m_harqStatus.resize(m_layersNum, DlInfoListElement_s::ACK);
-                            harqDlInfo.m_rnti = tbId.m_rnti;
-                            harqDlInfo.m_harqProcessId = (*itTb).second.harqProcessId;
-                            if ((*itTb).second.corrupt)
-                            {
-                                harqDlInfo.m_harqStatus.at(tbId.m_layer) =
-                                    DlInfoListElement_s::NACK;
-                                NS_LOG_DEBUG(this << " RNTI " << tbId.m_rnti << " harqId "
-                                                  << (uint16_t)(*itTb).second.harqProcessId
-                                                  << " layer " << (uint16_t)tbId.m_layer
-                                                  << " send DL-HARQ-NACK");
-                                m_harqPhyModule->UpdateDlHarqProcessStatus(
-                                    (*itTb).second.harqProcessId,
-                                    tbId.m_layer,
-                                    (*itTb).second.mi,
-                                    (*itTb).second.size,
-                                    (*itTb).second.size / EffectiveCodingRate[(*itTb).second.mcs]);
-                            }
-                            else
-                            {
-                                harqDlInfo.m_harqStatus.at(tbId.m_layer) = DlInfoListElement_s::ACK;
-                                NS_LOG_DEBUG(this << " RNTI " << tbId.m_rnti << " harqId "
-                                                  << (uint16_t)(*itTb).second.harqProcessId
-                                                  << " layer " << (uint16_t)tbId.m_layer << " size "
-                                                  << (*itTb).second.size << " send DL-HARQ-ACK");
-                                m_harqPhyModule->ResetDlHarqProcessStatus(
-                                    (*itTb).second.harqProcessId);
-                            }
-                            harqDlInfoMap.insert(
-                                std::pair<uint16_t, DlInfoListElement_s>(tbId.m_rnti, harqDlInfo));
-                        }
-                        else
-                        {
-                            if ((*itTb).second.corrupt)
-                            {
-                                (*itHarq).second.m_harqStatus.at(tbId.m_layer) =
-                                    DlInfoListElement_s::NACK;
-                                NS_LOG_DEBUG(this << " RNTI " << tbId.m_rnti << " harqId "
-                                                  << (uint16_t)(*itTb).second.harqProcessId
-                                                  << " layer " << (uint16_t)tbId.m_layer << " size "
-                                                  << (*itHarq).second.m_harqStatus.size()
-                                                  << " send DL-HARQ-NACK");
-                                m_harqPhyModule->UpdateDlHarqProcessStatus(
-                                    (*itTb).second.harqProcessId,
-                                    tbId.m_layer,
-                                    (*itTb).second.mi,
-                                    (*itTb).second.size,
-                                    (*itTb).second.size / EffectiveCodingRate[(*itTb).second.mcs]);
-                            }
-                            else
-                            {
-                                NS_ASSERT_MSG(tbId.m_layer < (*itHarq).second.m_harqStatus.size(),
-                                              " layer " << (uint16_t)tbId.m_layer);
-                                (*itHarq).second.m_harqStatus.at(tbId.m_layer) =
-                                    DlInfoListElement_s::ACK;
-                                NS_LOG_DEBUG(this << " RNTI " << tbId.m_rnti << " harqId "
-                                                  << (uint16_t)(*itTb).second.harqProcessId
-                                                  << " layer " << (uint16_t)tbId.m_layer << " size "
-                                                  << (*itHarq).second.m_harqStatus.size()
-                                                  << " send DL-HARQ-ACK");
-                                m_harqPhyModule->ResetDlHarqProcessStatus(
-                                    (*itTb).second.harqProcessId);
-                            }
-                        }
-                    } // end if ((*itTb).second.downlink) HARQ
-                }     // end if (!(*itTb).second.harqFeedbackSent)
-            }
+                        harqDlInfo.m_harqStatus.at(tbId.m_layer) = DlInfoListElement_s::ACK;
+                        NS_LOG_DEBUG(this << " RNTI " << tbId.m_rnti << " harqId "
+                                          << (uint16_t)(*itTb).second.harqProcessId << " layer "
+                                          << (uint16_t)tbId.m_layer << " size "
+                                          << (*itTb).second.size << " send DL-HARQ-ACK");
+                        m_harqPhyModule->ResetDlHarqProcessStatus((*itTb).second.harqProcessId);
+                    }
+                    harqDlInfoMap.insert(
+                        std::pair<uint16_t, DlInfoListElement_s>(tbId.m_rnti, harqDlInfo));
+                }
+                else
+                {
+                    if ((*itTb).second.corrupt)
+                    {
+                        (*itHarq).second.m_harqStatus.at(tbId.m_layer) = DlInfoListElement_s::NACK;
+                        NS_LOG_DEBUG(this << " RNTI " << tbId.m_rnti << " harqId "
+                                          << (uint16_t)(*itTb).second.harqProcessId << " layer "
+                                          << (uint16_t)tbId.m_layer << " size "
+                                          << (*itHarq).second.m_harqStatus.size()
+                                          << " send DL-HARQ-NACK");
+                        m_harqPhyModule->UpdateDlHarqProcessStatus(
+                            (*itTb).second.harqProcessId,
+                            tbId.m_layer,
+                            (*itTb).second.mi,
+                            (*itTb).second.size,
+                            (*itTb).second.size / EffectiveCodingRate[(*itTb).second.mcs]);
+                    }
+                    else
+                    {
+                        NS_ASSERT_MSG(tbId.m_layer < (*itHarq).second.m_harqStatus.size(),
+                                      " layer " << (uint16_t)tbId.m_layer);
+                        (*itHarq).second.m_harqStatus.at(tbId.m_layer) = DlInfoListElement_s::ACK;
+                        NS_LOG_DEBUG(this << " RNTI " << tbId.m_rnti << " harqId "
+                                          << (uint16_t)(*itTb).second.harqProcessId << " layer "
+                                          << (uint16_t)tbId.m_layer << " size "
+                                          << (*itHarq).second.m_harqStatus.size()
+                                          << " send DL-HARQ-ACK");
+                        m_harqPhyModule->ResetDlHarqProcessStatus((*itTb).second.harqProcessId);
+                    }
+                }
+            } // end if ((*itTb).second.downlink) HARQ
         }
     }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-spectrum-phy.h ns-3.44/src/lte/model/lte-spectrum-phy.h
--- ns-3.43/src/lte/model/lte-spectrum-phy.h	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/model/lte-spectrum-phy.h	2025-03-09 16:55:49.603371900 -0700
@@ -16,19 +16,19 @@
 #include "lte-harq-phy.h"
 #include "lte-interference.h"
 
-#include <ns3/data-rate.h>
-#include <ns3/event-id.h>
-#include <ns3/generic-phy.h>
-#include <ns3/mobility-model.h>
-#include <ns3/net-device.h>
-#include <ns3/nstime.h>
-#include <ns3/packet-burst.h>
-#include <ns3/packet.h>
-#include <ns3/random-variable-stream.h>
-#include <ns3/spectrum-channel.h>
-#include <ns3/spectrum-interference.h>
-#include <ns3/spectrum-phy.h>
-#include <ns3/spectrum-value.h>
+#include "ns3/data-rate.h"
+#include "ns3/event-id.h"
+#include "ns3/generic-phy.h"
+#include "ns3/mobility-model.h"
+#include "ns3/net-device.h"
+#include "ns3/nstime.h"
+#include "ns3/packet-burst.h"
+#include "ns3/packet.h"
+#include "ns3/random-variable-stream.h"
+#include "ns3/spectrum-channel.h"
+#include "ns3/spectrum-interference.h"
+#include "ns3/spectrum-phy.h"
+#include "ns3/spectrum-value.h"
 
 #include <map>
 
@@ -46,8 +46,8 @@
     /**
      * Constructor
      *
-     * \param a RNTI
-     * \param b Layer
+     * @param a RNTI
+     * @param b Layer
      */
     TbId_t(const uint16_t a, const uint8_t b);
 
@@ -127,8 +127,8 @@
 typedef Callback<void, UlInfoListElement_s> LtePhyUlHarqFeedbackCallback;
 
 /**
- * \ingroup lte
- * \class LteSpectrumPhy
+ * @ingroup lte
+ * @class LteSpectrumPhy
  *
  * The LteSpectrumPhy models the physical layer of LTE
  *
@@ -156,8 +156,8 @@
     };
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     // inherited from Object
@@ -173,23 +173,23 @@
     Ptr<Object> GetAntenna() const override;
     void StartRx(Ptr<SpectrumSignalParameters> params) override;
     /**
-     * \brief Start receive data function
-     * \param params Ptr<LteSpectrumSignalParametersDataFrame>
+     * @brief Start receive data function
+     * @param params Ptr<LteSpectrumSignalParametersDataFrame>
      */
     void StartRxData(Ptr<LteSpectrumSignalParametersDataFrame> params);
     /**
-     * \brief Start receive DL control function
-     * \param lteDlCtrlRxParams Ptr<LteSpectrumSignalParametersDlCtrlFrame>
+     * @brief Start receive DL control function
+     * @param lteDlCtrlRxParams Ptr<LteSpectrumSignalParametersDlCtrlFrame>
      */
     void StartRxDlCtrl(Ptr<LteSpectrumSignalParametersDlCtrlFrame> lteDlCtrlRxParams);
     /**
-     * \brief Start receive UL SRS function
-     * \param lteUlSrsRxParams Ptr<LteSpectrumSignalParametersUlSrsFrame>
+     * @brief Start receive UL SRS function
+     * @param lteUlSrsRxParams Ptr<LteSpectrumSignalParametersUlSrsFrame>
      */
     void StartRxUlSrs(Ptr<LteSpectrumSignalParametersUlSrsFrame> lteUlSrsRxParams);
     /**
-     * \brief Set HARQ phy function
-     * \param harq the HARQ phy module
+     * @brief Set HARQ phy function
+     * @param harq the HARQ phy module
      */
     void SetHarqPhyModule(Ptr<LteHarqPhy> harq);
 
@@ -201,7 +201,7 @@
     void SetTxPowerSpectralDensity(Ptr<SpectrumValue> txPsd);
 
     /**
-     * \brief set the noise power spectral density
+     * @brief set the noise power spectral density
      * @param noisePsd the Noise Power Spectral Density in power units
      * (Watt, Pascal...) per Hz.
      */
@@ -216,7 +216,7 @@
     /**
      * set the AntennaModel to be used
      *
-     * \param a the Antenna Model
+     * @param a the Antenna Model
      */
     void SetAntenna(Ptr<AntennaModel> a);
 
@@ -312,28 +312,28 @@
     void SetLtePhyUlHarqFeedbackCallback(LtePhyUlHarqFeedbackCallback c);
 
     /**
-     * \brief Set the state of the phy layer
-     * \param newState the state
+     * @brief Set the state of the phy layer
+     * @param newState the state
      */
     void SetState(State newState);
 
     /**
      *
      *
-     * \param cellId the Cell Identifier
+     * @param cellId the Cell Identifier
      */
     void SetCellId(uint16_t cellId);
 
     /**
      *
-     * \param componentCarrierId the component carrier id
+     * @param componentCarrierId the component carrier id
      */
     void SetComponentCarrierId(uint8_t componentCarrierId);
 
     /**
      *
      *
-     * \param p the new LteChunkProcessor to be added to the RS power
+     * @param p the new LteChunkProcessor to be added to the RS power
      *          processing chain
      */
     void AddRsPowerChunkProcessor(Ptr<LteChunkProcessor> p);
@@ -341,7 +341,7 @@
     /**
      *
      *
-     * \param p the new LteChunkProcessor to be added to the Data Channel power
+     * @param p the new LteChunkProcessor to be added to the Data Channel power
      *          processing chain
      */
     void AddDataPowerChunkProcessor(Ptr<LteChunkProcessor> p);
@@ -349,7 +349,7 @@
     /**
      *
      *
-     * \param p the new LteChunkProcessor to be added to the data processing chain
+     * @param p the new LteChunkProcessor to be added to the data processing chain
      */
     void AddDataSinrChunkProcessor(Ptr<LteChunkProcessor> p);
 
@@ -357,7 +357,7 @@
      *  LteChunkProcessor devoted to evaluate interference + noise power
      *  in control symbols of the subframe
      *
-     * \param p the new LteChunkProcessor to be added to the data processing chain
+     * @param p the new LteChunkProcessor to be added to the data processing chain
      */
     void AddInterferenceCtrlChunkProcessor(Ptr<LteChunkProcessor> p);
 
@@ -365,29 +365,29 @@
      *  LteChunkProcessor devoted to evaluate interference + noise power
      *  in data symbols of the subframe
      *
-     * \param p the new LteChunkProcessor to be added to the data processing chain
+     * @param p the new LteChunkProcessor to be added to the data processing chain
      */
     void AddInterferenceDataChunkProcessor(Ptr<LteChunkProcessor> p);
 
     /**
      *
      *
-     * \param p the new LteChunkProcessor to be added to the ctrl processing chain
+     * @param p the new LteChunkProcessor to be added to the ctrl processing chain
      */
     void AddCtrlSinrChunkProcessor(Ptr<LteChunkProcessor> p);
 
     /**
      *
      *
-     * \param rnti the RNTI of the source of the TB
-     * \param ndi new data indicator flag
-     * \param size the size of the TB
-     * \param mcs the MCS of the TB
-     * \param map the map of RB(s) used
-     * \param layer the layer (in case of MIMO tx)
-     * \param harqId the id of the HARQ process (valid only for DL)
-     * \param rv the redundancy version
-     * \param downlink true when the TB is for DL
+     * @param rnti the RNTI of the source of the TB
+     * @param ndi new data indicator flag
+     * @param size the size of the TB
+     * @param mcs the MCS of the TB
+     * @param map the map of RB(s) used
+     * @param layer the layer (in case of MIMO tx)
+     * @param harqId the id of the HARQ process (valid only for DL)
+     * @param rv the redundancy version
+     * @param downlink true when the TB is for DL
      */
     void AddExpectedTb(uint16_t rnti,
                        uint8_t ndi,
@@ -399,7 +399,7 @@
                        uint8_t rv,
                        bool downlink);
     /**
-     * \brief Remove expected transport block.
+     * @brief Remove expected transport block.
      *
      * When UE context at eNodeB is removed and if UL TB is expected to be received
      * but not transmitted due to break in radio link. The TB with different rnti or lcid
@@ -407,27 +407,27 @@
      * m_ulPhyReception trace, since the UE context was already removed. TB has to be
      * removed when ue context at eNodeB is removed
      *
-     * \param rnti The RNTI of the UE
+     * @param rnti The RNTI of the UE
      */
     void RemoveExpectedTb(uint16_t rnti);
 
     /**
      *
      *
-     * \param sinr vector of sinr perceived per each RB
+     * @param sinr vector of sinr perceived per each RB
      */
     void UpdateSinrPerceived(const SpectrumValue& sinr);
 
     /**
      *
      *
-     * \param txMode UE transmission mode (SISO, MIMO tx diversity, ...)
+     * @param txMode UE transmission mode (SISO, MIMO tx diversity, ...)
      */
     void SetTransmissionMode(uint8_t txMode);
 
     /**
      *
-     * \return the previously set channel
+     * @return the previously set channel
      */
     Ptr<SpectrumChannel> GetChannel();
 
@@ -439,16 +439,16 @@
      * used by this model.  Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream);
 
   private:
     /**
-     * \brief Change state function
+     * @brief Change state function
      *
-     * \param newState the new state to set
+     * @param newState the new state to set
      */
     void ChangeState(State newState);
     /// End transmit data function
@@ -465,10 +465,10 @@
     void EndRxUlSrs();
 
     /**
-     * \brief Set transmit mode gain function
+     * @brief Set transmit mode gain function
      *
-     * \param txMode the transmit mode
-     * \param gain the gain to set
+     * @param txMode the transmit mode
+     * @param gain the gain to set
      */
     void SetTxModeGain(uint8_t txMode, double gain);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-spectrum-signal-parameters.cc ns-3.44/src/lte/model/lte-spectrum-signal-parameters.cc
--- ns-3.43/src/lte/model/lte-spectrum-signal-parameters.cc	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/model/lte-spectrum-signal-parameters.cc	2025-03-09 16:55:49.603371900 -0700
@@ -11,9 +11,9 @@
 
 #include "lte-control-messages.h"
 
-#include <ns3/log.h>
-#include <ns3/packet-burst.h>
-#include <ns3/ptr.h>
+#include "ns3/log.h"
+#include "ns3/packet-burst.h"
+#include "ns3/ptr.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-spectrum-signal-parameters.h ns-3.44/src/lte/model/lte-spectrum-signal-parameters.h
--- ns-3.43/src/lte/model/lte-spectrum-signal-parameters.h	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/model/lte-spectrum-signal-parameters.h	2025-03-09 16:55:49.603371900 -0700
@@ -10,7 +10,7 @@
 #ifndef LTE_SPECTRUM_SIGNAL_PARAMETERS_H
 #define LTE_SPECTRUM_SIGNAL_PARAMETERS_H
 
-#include <ns3/spectrum-signal-parameters.h>
+#include "ns3/spectrum-signal-parameters.h"
 
 #include <list>
 
@@ -21,7 +21,7 @@
 class LteControlMessage;
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
  * Signal parameters for Lte
  */
@@ -36,7 +36,7 @@
 
     /**
      * copy constructor
-     * \param p the LteSpectrumSignalParameters to copy
+     * @param p the LteSpectrumSignalParameters to copy
      */
     LteSpectrumSignalParameters(const LteSpectrumSignalParameters& p);
 
@@ -47,7 +47,7 @@
 };
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
  * Signal parameters for Lte Data Frame (PDSCH), and eventually after some
  * control messages through other control channel embedded in PDSCH
@@ -64,7 +64,7 @@
 
     /**
      * copy constructor
-     * \param p the LteSpectrumSignalParametersDataFrame to copy
+     * @param p the LteSpectrumSignalParametersDataFrame to copy
      */
     LteSpectrumSignalParametersDataFrame(const LteSpectrumSignalParametersDataFrame& p);
 
@@ -79,7 +79,7 @@
 };
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
  * Signal parameters for Lte DL Ctrl Frame (RS, PCFICH and PDCCH)
  */
@@ -94,7 +94,7 @@
 
     /**
      * copy constructor
-     * \param p the LteSpectrumSignalParametersDlCtrlFrame to copy
+     * @param p the LteSpectrumSignalParametersDlCtrlFrame to copy
      */
     LteSpectrumSignalParametersDlCtrlFrame(const LteSpectrumSignalParametersDlCtrlFrame& p);
 
@@ -105,7 +105,7 @@
 };
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
  * Signal parameters for Lte SRS Frame
  */
@@ -120,7 +120,7 @@
 
     /**
      * copy constructor
-     * \param p the LteSpectrumSignalParametersUlSrsFrame to copy
+     * @param p the LteSpectrumSignalParametersUlSrsFrame to copy
      */
     LteSpectrumSignalParametersUlSrsFrame(const LteSpectrumSignalParametersUlSrsFrame& p);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-spectrum-value-helper.cc ns-3.44/src/lte/model/lte-spectrum-value-helper.cc
--- ns-3.43/src/lte/model/lte-spectrum-value-helper.cc	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/model/lte-spectrum-value-helper.cc	2025-03-09 16:55:49.603371900 -0700
@@ -9,8 +9,8 @@
 
 #include "lte-spectrum-value-helper.h"
 
-#include <ns3/fatal-error.h>
-#include <ns3/log.h>
+#include "ns3/fatal-error.h"
+#include "ns3/log.h"
 
 #include <cmath>
 #include <map>
@@ -20,14 +20,14 @@
 {
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \note This function scope is strictly local, and can not be
+ * @note This function scope is strictly local, and can not be
  * used in other source files.
  *
- * \param [in] os The reference to the output stream.
- * \param [in] v The std::vector<int>.
- * \returns The reference to the output stream.
+ * @param [in] os The reference to the output stream.
+ * @param [in] v The std::vector<int>.
+ * @returns The reference to the output stream.
  */
 ostream&
 operator<<(ostream& os, const vector<int>& v)
@@ -205,8 +205,8 @@
     /**
      * Constructor
      *
-     * \param f earfcn
-     * \param b bandwidth
+     * @param f earfcn
+     * @param b bandwidth
      */
     LteSpectrumModelId(uint32_t f, uint8_t b);
     uint32_t earfcn;    ///< EARFCN
@@ -222,9 +222,9 @@
 /**
  * Constructor
  *
- * \param a lhs
- * \param b rhs
- * \returns true if earfcn less than of if earfcn equal and bandwidth less than
+ * @param a lhs
+ * @param b rhs
+ * @returns true if earfcn less than of if earfcn equal and bandwidth less than
  */
 bool
 operator<(const LteSpectrumModelId& a, const LteSpectrumModelId& b)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-spectrum-value-helper.h ns-3.44/src/lte/model/lte-spectrum-value-helper.h
--- ns-3.43/src/lte/model/lte-spectrum-value-helper.h	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/model/lte-spectrum-value-helper.h	2025-03-09 16:55:49.603371900 -0700
@@ -9,7 +9,7 @@
 #ifndef LTE_SPECTRUM_VALUE_HELPER_H
 #define LTE_SPECTRUM_VALUE_HELPER_H
 
-#include <ns3/spectrum-value.h>
+#include "ns3/spectrum-value.h"
 
 #include <map>
 #include <vector>
@@ -18,9 +18,9 @@
 {
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
- * \brief This class defines all functions to create spectrum model for lte
+ * @brief This class defines all functions to create spectrum model for lte
  */
 class LteSpectrumValueHelper
 {
@@ -30,27 +30,27 @@
      * Radio Frequency Channel Number (EARFCN) according to 3GPP TS
      * 36.101 section 5.7.3 "Carrier frequency and EARFCN".
      *
-     * \param earfcn the EARFCN
+     * @param earfcn the EARFCN
      *
-     * \return the carrier frequency in Hz
+     * @return the carrier frequency in Hz
      */
     static double GetCarrierFrequency(uint32_t earfcn);
 
     /**
      * Converts downlink EARFCN to corresponding LTE frequency band number.
      *
-     * \param nDl the EARFCN
+     * @param nDl the EARFCN
      *
-     * \return the downlink carrier band
+     * @return the downlink carrier band
      */
     static uint16_t GetDownlinkCarrierBand(uint32_t nDl);
 
     /**
      * Converts uplink EARFCN to corresponding LTE frequency band number.
      *
-     * \param nUl the EARFCN
+     * @param nUl the EARFCN
      *
-     * \return the uplink carrier band
+     * @return the uplink carrier band
      */
     static uint16_t GetUplinkCarrierBand(uint32_t nUl);
 
@@ -59,9 +59,9 @@
      * Radio Frequency Channel Number (EARFCN) using the formula in 3GPP TS
      * 36.101 section 5.7.3 "Carrier frequency and EARFCN".
      *
-     * \param earfcn the EARFCN
+     * @param earfcn the EARFCN
      *
-     * \return the downlink carrier frequency in Hz
+     * @return the downlink carrier frequency in Hz
      */
     static double GetDownlinkCarrierFrequency(uint32_t earfcn);
 
@@ -70,30 +70,30 @@
      * Radio Frequency Channel Number (EARFCN) using the formula in 3GPP TS
      * 36.101 section 5.7.3 "Carrier frequency and EARFCN".
      *
-     * \param earfcn the EARFCN
+     * @param earfcn the EARFCN
      *
-     * \return the uplink carrier frequency in Hz
+     * @return the uplink carrier frequency in Hz
      */
     static double GetUplinkCarrierFrequency(uint32_t earfcn);
 
     /**
      *
      *
-     * \param txBandwidthConf the transmission bandwidth
+     * @param txBandwidthConf the transmission bandwidth
      * configuration in number of resource blocks
      *
-     * \return the nominal channel bandwidth in Hz as per 3GPP TS 36.101
+     * @return the nominal channel bandwidth in Hz as per 3GPP TS 36.101
      */
     static double GetChannelBandwidth(uint16_t txBandwidthConf);
 
     /**
      *
-     * \param earfcn the carrier frequency (EARFCN) at which reception
+     * @param earfcn the carrier frequency (EARFCN) at which reception
      * is made
-     * \param bandwidth the Transmission Bandwidth Configuration in
+     * @param bandwidth the Transmission Bandwidth Configuration in
      * number of resource blocks
      *
-     * \return the static SpectrumModel instance corresponding to the
+     * @return the static SpectrumModel instance corresponding to the
      * given carrier frequency and transmission bandwidth
      * configuration. If such SpectrumModel does not exist, it is
      * created.
@@ -105,13 +105,13 @@
      * density of a signal to be transmitted. See 3GPP TS 36.101 for
      * a definition of most of the parameters described here.
      *
-     * \param earfcn the carrier frequency (EARFCN) of the transmission
-     * \param bandwidth the Transmission Bandwidth Configuration in
+     * @param earfcn the carrier frequency (EARFCN) of the transmission
+     * @param bandwidth the Transmission Bandwidth Configuration in
      * number of resource blocks
-     * \param powerTx the total power in dBm over the whole bandwidth
-     * \param activeRbs the list of Active Resource Blocks (PRBs)
+     * @param powerTx the total power in dBm over the whole bandwidth
+     * @param activeRbs the list of Active Resource Blocks (PRBs)
      *
-     * \return a pointer to a newly allocated SpectrumValue representing the TX Power Spectral
+     * @return a pointer to a newly allocated SpectrumValue representing the TX Power Spectral
      * Density in W/Hz for each Resource Block
      */
     static Ptr<SpectrumValue> CreateTxPowerSpectralDensity(uint32_t earfcn,
@@ -124,16 +124,16 @@
      * density of a signal to be transmitted. See 3GPP TS 36.101 for
      * a definition of most of the parameters described here.
      *
-     * \param earfcn the carrier frequency (EARFCN) of the transmission
-     * \param bandwidth the Transmission Bandwidth Configuration in
+     * @param earfcn the carrier frequency (EARFCN) of the transmission
+     * @param bandwidth the Transmission Bandwidth Configuration in
      * number of resource blocks
-     * \param powerTx the total power in dBm over the whole bandwidth
-     * \param powerTxMap the map of power in dBm for each RB,
+     * @param powerTx the total power in dBm over the whole bandwidth
+     * @param powerTxMap the map of power in dBm for each RB,
      * if map contain power for RB, powerTx is not used for this RB,
      * otherwise powerTx is set for this RB
-     * \param activeRbs the list of Active Resource Blocks (PRBs)
+     * @param activeRbs the list of Active Resource Blocks (PRBs)
      *
-     * \return a pointer to a newly allocated SpectrumValue representing the TX Power Spectral
+     * @return a pointer to a newly allocated SpectrumValue representing the TX Power Spectral
      * Density in W/Hz for each Resource Block
      */
     static Ptr<SpectrumValue> CreateTxPowerSpectralDensity(uint32_t earfcn,
@@ -148,13 +148,13 @@
      * a definition of most of the parameters described here.
      * This function splits the power over the active RBs instead of
      * the entire bandwidth
-     * \param earfcn the carrier frequency (EARFCN) of the transmission
-     * \param bandwidth the Transmission Bandwidth Configuration in
+     * @param earfcn the carrier frequency (EARFCN) of the transmission
+     * @param bandwidth the Transmission Bandwidth Configuration in
      * number of resource blocks
-     * \param powerTx the total power in dBm over the whole bandwidth
-     * \param activeRbs the list of Active Resource Blocks (PRBs)
+     * @param powerTx the total power in dBm over the whole bandwidth
+     * @param activeRbs the list of Active Resource Blocks (PRBs)
      *
-     * \return a pointer to a newly allocated SpectrumValue representing the TX Power Spectral
+     * @return a pointer to a newly allocated SpectrumValue representing the TX Power Spectral
      * Density in W/Hz for each Resource Block
      */
     static Ptr<SpectrumValue> CreateUlTxPowerSpectralDensity(uint16_t earfcn,
@@ -165,13 +165,13 @@
     /**
      * create a SpectrumValue that models the power spectral density of AWGN
      *
-     * \param earfcn the carrier frequency (EARFCN) at which reception
+     * @param earfcn the carrier frequency (EARFCN) at which reception
      * is made
-     * \param bandwidth the Transmission Bandwidth Configuration in
+     * @param bandwidth the Transmission Bandwidth Configuration in
      * number of resource blocks
-     * \param noiseFigure the noise figure in dB w.r.t. a reference temperature of 290K
+     * @param noiseFigure the noise figure in dB w.r.t. a reference temperature of 290K
      *
-     * \return a pointer to a newly allocated SpectrumValue representing the noise Power Spectral
+     * @return a pointer to a newly allocated SpectrumValue representing the noise Power Spectral
      * Density in W/Hz for each Resource Block
      */
     static Ptr<SpectrumValue> CreateNoisePowerSpectralDensity(uint32_t earfcn,
@@ -181,10 +181,10 @@
     /**
      *  create a SpectrumValue that models the power spectral density of AWGN
      *
-     * \param noiseFigure  the noise figure in dB  w.r.t. a reference temperature of 290K
-     * \param spectrumModel the SpectrumModel instance to be used
+     * @param noiseFigure  the noise figure in dB  w.r.t. a reference temperature of 290K
+     * @param spectrumModel the SpectrumModel instance to be used
      *
-     * \return a pointer to a newly allocated SpectrumValue representing the noise Power Spectral
+     * @return a pointer to a newly allocated SpectrumValue representing the noise Power Spectral
      * Density in W/Hz for each Resource Block
      */
     static Ptr<SpectrumValue> CreateNoisePowerSpectralDensity(double noiseFigure,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-ue-ccm-rrc-sap.h ns-3.44/src/lte/model/lte-ue-ccm-rrc-sap.h
--- ns-3.43/src/lte/model/lte-ue-ccm-rrc-sap.h	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/model/lte-ue-ccm-rrc-sap.h	2025-03-09 16:55:49.603371900 -0700
@@ -21,7 +21,7 @@
 class LteMacSapUser;
 
 /**
- * \brief Service Access Point (SAP) offered by the UE component carrier manager
+ * @brief Service Access Point (SAP) offered by the UE component carrier manager
  *  to the UE RRC.
  *
  * This is the *Component Carrier Management SAP Provider*, i.e., the part of the SAP
@@ -47,11 +47,11 @@
     /**
      * add a new Logical Channel (LC)
      *
-     * \param lcId is the Logical Channel Id
-     * \param lcConfig is a single structure contains logical Channel Id, Logical Channel config and
+     * @param lcId is the Logical Channel Id
+     * @param lcConfig is a single structure contains logical Channel Id, Logical Channel config and
      * Component Carrier Id
-     * \param msu is the pointer to LteMacSapUser related to the Rlc instance
-     * \return vector of LcsConfig contains the lc configuration for each Mac
+     * @param msu is the pointer to LteMacSapUser related to the Rlc instance
+     * @return vector of LcsConfig contains the lc configuration for each Mac
      *                the size of the vector is equal to the number of component
      *                carrier enabled.
      *
@@ -64,14 +64,14 @@
         LteMacSapUser* msu) = 0;
 
     /**
-     * \brief Remove an existing Logical Channel for a Ue in the LteUeComponentCarrierManager
-     * \param lcid the Logical Channel Id
-     * \return vector of integer the componentCarrierId of the componentCarrier
+     * @brief Remove an existing Logical Channel for a Ue in the LteUeComponentCarrierManager
+     * @param lcid the Logical Channel Id
+     * @return vector of integer the componentCarrierId of the componentCarrier
      *                where the bearer is enabled
      */
     virtual std::vector<uint16_t> RemoveLc(uint8_t lcid) = 0;
     /**
-     * \brief Reset LC maps
+     * @brief Reset LC maps
      *
      */
     virtual void Reset() = 0;
@@ -79,11 +79,11 @@
     virtual void NotifyConnectionReconfigurationMsg() = 0;
 
     /**
-     * \brief Add the Signal Bearer for a specific Ue in LteUeComponenCarrierManager
-     * \param lcid the Logical Channel Id
-     * \param lcConfig this structure it is hard-coded in the LteEnbRrc
-     * \param msu it is the MacSapUser of the Rlc instance
-     * \return the LteMacSapUser of the ComponentCarrierManager
+     * @brief Add the Signal Bearer for a specific Ue in LteUeComponenCarrierManager
+     * @param lcid the Logical Channel Id
+     * @param lcConfig this structure it is hard-coded in the LteEnbRrc
+     * @param msu it is the MacSapUser of the Rlc instance
+     * @return the LteMacSapUser of the ComponentCarrierManager
      *
      */
     virtual LteMacSapUser* ConfigureSignalBearer(
@@ -101,7 +101,7 @@
     /**
      * Constructor
      *
-     * \param owner the owner class
+     * @param owner the owner class
      */
     MemberLteUeCcmRrcSapProvider(C* owner);
 
@@ -169,7 +169,7 @@
 }
 
 /**
- * \brief Service Access Point (SAP) offered by the UE RRC to the UE CCM.
+ * @brief Service Access Point (SAP) offered by the UE RRC to the UE CCM.
  *
  * This is the *Component Carrier Management SAP User*, i.e., the part of the SAP
  * that contains the UE RRC methods called by the UE CCM instance.
@@ -183,13 +183,13 @@
      * this function will be used after the RRC notify to ComponentCarrierManager
      * that a reconfiguration message with Secondary component carrier (SCc) arrived or not
      * the method it is called only if the SCc wasn't set up
-     * \param componentCarrierList component carrier list
+     * @param componentCarrierList component carrier list
      */
     virtual void ComponentCarrierEnabling(std::vector<uint8_t> componentCarrierList) = 0;
     /**
-     * \brief Set the number of component carriers
+     * @brief Set the number of component carriers
      *
-     * \param noOfComponentCarriers The number of component carriers
+     * @param noOfComponentCarriers The number of component carriers
      */
     virtual void SetNumberOfComponentCarriers(uint16_t noOfComponentCarriers) = 0;
 
@@ -203,7 +203,7 @@
     /**
      * Constructor
      *
-     * \param owner the owner class
+     * @param owner the owner class
      */
     MemberLteUeCcmRrcSapUser(C* owner);
     // inherited from LteUeCcmRrcSapUser
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-ue-cmac-sap.h ns-3.44/src/lte/model/lte-ue-cmac-sap.h
--- ns-3.43/src/lte/model/lte-ue-cmac-sap.h	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/model/lte-ue-cmac-sap.h	2025-03-09 16:55:49.603371900 -0700
@@ -9,7 +9,7 @@
 #ifndef LTE_UE_CMAC_SAP_H
 #define LTE_UE_CMAC_SAP_H
 
-#include <ns3/packet.h>
+#include "ns3/packet.h"
 
 namespace ns3
 {
@@ -39,7 +39,7 @@
     /**
      * Configure RACH function
      *
-     * \param rc the RACH config
+     * @param rc the RACH config
      */
     virtual void ConfigureRach(RachConfig rc) = 0;
 
@@ -54,9 +54,9 @@
      * tell the MAC to start a non-contention-based random access
      * procedure, e.g., as a consequence of handover
      *
-     * \param rnti
-     * \param rapId Random Access Preamble Identifier
-     * \param prachMask
+     * @param rnti
+     * @param rapId Random Access Preamble Identifier
+     * @param prachMask
      */
     virtual void StartNonContentionBasedRandomAccessProcedure(uint16_t rnti,
                                                               uint8_t rapId,
@@ -74,16 +74,16 @@
     /**
      * add a new Logical Channel (LC)
      *
-     * \param lcId the ID of the LC
-     * \param lcConfig the LC configuration provided by the RRC
-     * \param msu the corresponding LteMacSapUser
+     * @param lcId the ID of the LC
+     * @param lcConfig the LC configuration provided by the RRC
+     * @param msu the corresponding LteMacSapUser
      */
     virtual void AddLc(uint8_t lcId, LogicalChannelConfig lcConfig, LteMacSapUser* msu) = 0;
 
     /**
      * remove an existing LC
      *
-     * \param lcId
+     * @param lcId
      */
     virtual void RemoveLc(uint8_t lcId) = 0;
 
@@ -95,19 +95,19 @@
 
     /**
      *
-     * \param rnti the cell-specific UE identifier
+     * @param rnti the cell-specific UE identifier
      */
     virtual void SetRnti(uint16_t rnti) = 0;
 
     /**
-     * \brief Notify MAC about the successful RRC connection
+     * @brief Notify MAC about the successful RRC connection
      * establishment.
      */
     virtual void NotifyConnectionSuccessful() = 0;
 
     /**
-     * \brief A method call by UE RRC to communicate the IMSI to the UE MAC
-     * \param imsi the IMSI of the UE
+     * @brief A method call by UE RRC to communicate the IMSI to the UE MAC
+     * @param imsi the IMSI of the UE
      */
     virtual void SetImsi(uint64_t imsi) = 0;
 };
@@ -126,7 +126,7 @@
     /**
      *
      *
-     * \param rnti the T-C-RNTI, which will eventually become the C-RNTI after contention resolution
+     * @param rnti the T-C-RNTI, which will eventually become the C-RNTI after contention resolution
      */
     virtual void SetTemporaryCellRnti(uint16_t rnti) = 0;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-ue-component-carrier-manager.cc ns-3.44/src/lte/model/lte-ue-component-carrier-manager.cc
--- ns-3.43/src/lte/model/lte-ue-component-carrier-manager.cc	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/model/lte-ue-component-carrier-manager.cc	2025-03-09 16:55:49.603371900 -0700
@@ -11,7 +11,7 @@
 
 #include "lte-common.h"
 
-#include <ns3/log.h>
+#include "ns3/log.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-ue-component-carrier-manager.h ns-3.44/src/lte/model/lte-ue-component-carrier-manager.h
--- ns-3.43/src/lte/model/lte-ue-component-carrier-manager.h	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/model/lte-ue-component-carrier-manager.h	2025-03-09 16:55:49.603371900 -0700
@@ -13,7 +13,7 @@
 #include "lte-mac-sap.h"
 #include "lte-ue-ccm-rrc-sap.h"
 
-#include <ns3/object.h>
+#include "ns3/object.h"
 
 #include <map>
 #include <vector>
@@ -28,7 +28,7 @@
 class LteMacSapProvider;
 
 /**
- * \brief The abstract base class of a Component Carrier Manager* for UE
+ * @brief The abstract base class of a Component Carrier Manager* for UE
   that operates using the component carrier manager SAP interface.
  *
  */
@@ -39,44 +39,44 @@
     ~LteUeComponentCarrierManager() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Set the "user" part of the ComponentCarrier Management SAP interface
+     * @brief Set the "user" part of the ComponentCarrier Management SAP interface
      * that this UE component carrier manager will interact with.
-     * \param s a reference to the "user" part of the interface, typically a
+     * @param s a reference to the "user" part of the interface, typically a
      *          member of an LteEnbRrc instance
      */
     virtual void SetLteCcmRrcSapUser(LteUeCcmRrcSapUser* s);
 
     /**
-     * \brief Exports the "provider" part of the ComponentCarrier Management SAP interface.
-     * \return the reference to the "provider" part of the interface, typically to
+     * @brief Exports the "provider" part of the ComponentCarrier Management SAP interface.
+     * @return the reference to the "provider" part of the interface, typically to
      *         be kept by an LteUeRrc instance
      */
     virtual LteUeCcmRrcSapProvider* GetLteCcmRrcSapProvider();
 
     /**
-     * \brief Returns the MAC sap provider interface that if forwarding calls to the
+     * @brief Returns the MAC sap provider interface that if forwarding calls to the
      * instance of the LteUeComponentCarrierManager.
-     * \return the reference to the "provider" part of the interface
+     * @return the reference to the "provider" part of the interface
      */
     virtual LteMacSapProvider* GetLteMacSapProvider() = 0;
 
     /**
-     * \brief Sets a pointer to SAP interface of MAC instance for the specified carrier.
-     * \param componentCarrierId the component carrier id
-     * \param sap the pointer to the sap interface
-     * \return whether the settings of the sap provider was successful
+     * @brief Sets a pointer to SAP interface of MAC instance for the specified carrier.
+     * @param componentCarrierId the component carrier id
+     * @param sap the pointer to the sap interface
+     * @return whether the settings of the sap provider was successful
      */
     bool SetComponentCarrierMacSapProviders(uint8_t componentCarrierId, LteMacSapProvider* sap);
 
     /**
-     * \brief Sets number of component carriers that are supported by this UE.
-     * \param noOfComponentCarriers number of component carriers
+     * @brief Sets number of component carriers that are supported by this UE.
+     * @param noOfComponentCarriers number of component carriers
      */
     void SetNumberOfComponentCarriers(uint8_t noOfComponentCarriers);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-ue-cphy-sap.h ns-3.44/src/lte/model/lte-ue-cphy-sap.h
--- ns-3.43/src/lte/model/lte-ue-cphy-sap.h	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/model/lte-ue-cphy-sap.h	2025-03-09 16:55:49.603371900 -0700
@@ -12,7 +12,7 @@
 
 #include "lte-rrc-sap.h"
 
-#include <ns3/ptr.h>
+#include "ns3/ptr.h"
 
 #include <stdint.h>
 
@@ -41,9 +41,9 @@
     virtual void Reset() = 0;
 
     /**
-     * \brief Tell the PHY entity to listen to PSS from surrounding cells and
+     * @brief Tell the PHY entity to listen to PSS from surrounding cells and
      *        measure the RSRP.
-     * \param dlEarfcn the downlink carrier frequency (EARFCN) to listen to
+     * @param dlEarfcn the downlink carrier frequency (EARFCN) to listen to
      *
      * This function will instruct this PHY instance to listen to the DL channel
      * over the bandwidth of 6 RB at the frequency associated with the given
@@ -56,9 +56,9 @@
     virtual void StartCellSearch(uint32_t dlEarfcn) = 0;
 
     /**
-     * \brief Tell the PHY entity to synchronize with a given eNodeB over the
+     * @brief Tell the PHY entity to synchronize with a given eNodeB over the
      *        currently active EARFCN for communication purposes.
-     * \param cellId the ID of the eNodeB to synchronize with
+     * @param cellId the ID of the eNodeB to synchronize with
      *
      * By synchronizing, the PHY will start receiving various information
      * transmitted by the eNodeB. For instance, when receiving system information,
@@ -73,10 +73,10 @@
     virtual void SynchronizeWithEnb(uint16_t cellId) = 0;
 
     /**
-     * \brief Tell the PHY entity to align to the given EARFCN and synchronize
+     * @brief Tell the PHY entity to align to the given EARFCN and synchronize
      *        with a given eNodeB for communication purposes.
-     * \param cellId the ID of the eNodeB to synchronize with
-     * \param dlEarfcn the downlink carrier frequency (EARFCN)
+     * @param cellId the ID of the eNodeB to synchronize with
+     * @param dlEarfcn the downlink carrier frequency (EARFCN)
      *
      * By synchronizing, the PHY will start receiving various information
      * transmitted by the eNodeB. For instance, when receiving system information,
@@ -91,85 +91,85 @@
     virtual void SynchronizeWithEnb(uint16_t cellId, uint32_t dlEarfcn) = 0;
 
     /**
-     * \brief Get PHY cell ID
-     * \return cell ID this PHY is synchronized to
+     * @brief Get PHY cell ID
+     * @return cell ID this PHY is synchronized to
      */
     virtual uint16_t GetCellId() = 0;
 
     /**
-     * \brief Get PHY DL EARFCN
-     * \return DL EARFCN this PHY is synchronized to
+     * @brief Get PHY DL EARFCN
+     * @return DL EARFCN this PHY is synchronized to
      */
     virtual uint32_t GetDlEarfcn() = 0;
 
     /**
-     * \param dlBandwidth the DL bandwidth in number of PRBs
+     * @param dlBandwidth the DL bandwidth in number of PRBs
      */
     virtual void SetDlBandwidth(uint16_t dlBandwidth) = 0;
 
     /**
-     * \brief Configure uplink (normally done after reception of SIB2)
+     * @brief Configure uplink (normally done after reception of SIB2)
      *
-     * \param ulEarfcn the uplink carrier frequency (EARFCN)
-     * \param ulBandwidth the UL bandwidth in number of PRBs
+     * @param ulEarfcn the uplink carrier frequency (EARFCN)
+     * @param ulBandwidth the UL bandwidth in number of PRBs
      */
     virtual void ConfigureUplink(uint32_t ulEarfcn, uint16_t ulBandwidth) = 0;
 
     /**
-     * \brief Configure referenceSignalPower
+     * @brief Configure referenceSignalPower
      *
-     * \param referenceSignalPower received from eNB in SIB2
+     * @param referenceSignalPower received from eNB in SIB2
      */
     virtual void ConfigureReferenceSignalPower(int8_t referenceSignalPower) = 0;
 
     /**
-     * \brief Set Rnti function
+     * @brief Set Rnti function
      *
-     * \param rnti the cell-specific UE identifier
+     * @param rnti the cell-specific UE identifier
      */
     virtual void SetRnti(uint16_t rnti) = 0;
 
     /**
-     * \brief Set transmission mode
+     * @brief Set transmission mode
      *
-     * \param txMode the transmissionMode of the user
+     * @param txMode the transmissionMode of the user
      */
     virtual void SetTransmissionMode(uint8_t txMode) = 0;
 
     /**
-     * \brief Set SRS configuration index
+     * @brief Set SRS configuration index
      *
-     * \param srcCi the SRS configuration index
+     * @param srcCi the SRS configuration index
      */
     virtual void SetSrsConfigurationIndex(uint16_t srcCi) = 0;
 
     /**
-     * \brief Set P_A value for UE power control
+     * @brief Set P_A value for UE power control
      *
-     * \param pa the P_A value
+     * @param pa the P_A value
      */
     virtual void SetPa(double pa) = 0;
 
     /**
-     * \brief Set RSRP filter coefficient.
+     * @brief Set RSRP filter coefficient.
      *
      * Determines the strength of smoothing effect induced by layer 3
      * filtering of RSRP used for uplink power control in all attached UE.
      * If equals to 0, no layer 3 filtering is applicable.
      *
-     * \param rsrpFilterCoefficient value.
+     * @param rsrpFilterCoefficient value.
      */
     virtual void SetRsrpFilterCoefficient(uint8_t rsrpFilterCoefficient) = 0;
 
     /**
-     * \brief Reset the PHY after radio link failure function
+     * @brief Reset the PHY after radio link failure function
      * It resets the physical layer parameters of the
      * UE after RLF.
      */
     virtual void ResetPhyAfterRlf() = 0;
 
     /**
-     * \brief Reset radio link failure parameters
+     * @brief Reset radio link failure parameters
      *
      * Upon receiving N311 in-sync indications from the UE
      * PHY the UE RRC instructs the UE PHY to reset the
@@ -178,7 +178,7 @@
     virtual void ResetRlfParams() = 0;
 
     /**
-     * \brief Start in-sync detection function
+     * @brief Start in-sync detection function
      * When T310 timer is started, it indicates that physical layer
      * problems are detected at the UE and the recovery process is
      * started by checking if the radio frames are in-sync for N311
@@ -187,8 +187,8 @@
     virtual void StartInSyncDetection() = 0;
 
     /**
-     * \brief A method call by UE RRC to communicate the IMSI to the UE PHY
-     * \param imsi the IMSI of the UE
+     * @brief A method call by UE RRC to communicate the IMSI to the UE PHY
+     * @param imsi the IMSI of the UE
      */
     virtual void SetImsi(uint64_t imsi) = 0;
 };
@@ -226,39 +226,39 @@
     };
 
     /**
-     * \brief Relay an MIB message from the PHY entity to the RRC layer.
+     * @brief Relay an MIB message from the PHY entity to the RRC layer.
      *
      * This function is typically called after PHY receives an MIB message over
      * the BCH.
      *
-     * \param cellId the ID of the eNodeB where the message originates from
-     * \param mib the Master Information Block message.
+     * @param cellId the ID of the eNodeB where the message originates from
+     * @param mib the Master Information Block message.
      */
     virtual void RecvMasterInformationBlock(uint16_t cellId,
                                             LteRrcSap::MasterInformationBlock mib) = 0;
 
     /**
-     * \brief Relay an SIB1 message from the PHY entity to the RRC layer.
+     * @brief Relay an SIB1 message from the PHY entity to the RRC layer.
      *
      * This function is typically called after PHY receives an SIB1 message over
      * the BCH.
      *
-     * \param cellId the ID of the eNodeB where the message originates from
-     * \param sib1 the System Information Block Type 1 message
+     * @param cellId the ID of the eNodeB where the message originates from
+     * @param sib1 the System Information Block Type 1 message
      */
     virtual void RecvSystemInformationBlockType1(uint16_t cellId,
                                                  LteRrcSap::SystemInformationBlockType1 sib1) = 0;
 
     /**
-     * \brief Send a report of RSRP and RSRQ values perceived from PSS by the PHY
+     * @brief Send a report of RSRP and RSRQ values perceived from PSS by the PHY
      *        entity (after applying layer-1 filtering) to the RRC layer.
      *
-     * \param params the structure containing a vector of cellId, RSRP and RSRQ
+     * @param params the structure containing a vector of cellId, RSRP and RSRQ
      */
     virtual void ReportUeMeasurements(UeMeasurementsParameters params) = 0;
 
     /**
-     * \brief Send an out of sync indication to UE RRC.
+     * @brief Send an out of sync indication to UE RRC.
      *
      * When the number of out-of-sync indications
      * are equal to N310, RRC starts the T310 timer.
@@ -266,7 +266,7 @@
     virtual void NotifyOutOfSync() = 0;
 
     /**
-     * \brief Send an in sync indication to UE RRC.
+     * @brief Send an in sync indication to UE RRC.
      *
      * When the number of in-sync indications
      * are equal to N311, RRC stops the T310 timer.
@@ -274,7 +274,7 @@
     virtual void NotifyInSync() = 0;
 
     /**
-     * \brief Reset the sync indication counter.
+     * @brief Reset the sync indication counter.
      *
      * Resets the sync indication counter of RRC if the Qin or Qout condition
      * is not fulfilled for the number of consecutive frames.
@@ -293,7 +293,7 @@
     /**
      * Constructor
      *
-     * \param owner the owner class
+     * @param owner the owner class
      */
     MemberLteUeCphySapProvider(C* owner);
 
@@ -467,7 +467,7 @@
     /**
      * Constructor
      *
-     * \param owner the owner class
+     * @param owner the owner class
      */
     MemberLteUeCphySapUser(C* owner);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-ue-mac.cc ns-3.44/src/lte/model/lte-ue-mac.cc
--- ns-3.43/src/lte/model/lte-ue-mac.cc	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/model/lte-ue-mac.cc	2025-03-09 16:55:49.603371900 -0700
@@ -14,12 +14,12 @@
 #include "lte-control-messages.h"
 #include "lte-radio-bearer-tag.h"
 
-#include <ns3/log.h>
-#include <ns3/packet-burst.h>
-#include <ns3/packet.h>
-#include <ns3/pointer.h>
-#include <ns3/random-variable-stream.h>
-#include <ns3/simulator.h>
+#include "ns3/log.h"
+#include "ns3/packet-burst.h"
+#include "ns3/packet.h"
+#include "ns3/pointer.h"
+#include "ns3/random-variable-stream.h"
+#include "ns3/simulator.h"
 
 namespace ns3
 {
@@ -39,7 +39,7 @@
     /**
      * Constructor
      *
-     * \param mac the UE MAC
+     * @param mac the UE MAC
      */
     UeMemberLteUeCmacSapProvider(LteUeMac* mac);
 
@@ -130,7 +130,7 @@
     /**
      * Constructor
      *
-     * \param mac the UE MAC
+     * @param mac the UE MAC
      */
     UeMemberLteMacSapProvider(LteUeMac* mac);
 
@@ -168,7 +168,7 @@
     /**
      * Constructor
      *
-     * \param mac the UE MAC
+     * @param mac the UE MAC
      */
     UeMemberLteUePhySapUser(LteUeMac* mac);
 
@@ -227,7 +227,7 @@
 
 LteUeMac::LteUeMac()
     : m_bsrPeriodicity(MilliSeconds(1)), // ideal behavior
-      m_bsrLast(MilliSeconds(0)),
+      m_bsrLast(),
       m_freshUlBsr(false),
       m_harqProcessId(0),
       m_rnti(0),
@@ -854,7 +854,7 @@
                     if (it->rapId == m_raPreambleId) // RAR is for me
                     {
                         RecvRaResponse(it->rarPayload);
-                        /// \todo RRC generates the RecvRaResponse messaged
+                        /// @todo RRC generates the RecvRaResponse messaged
                         /// for avoiding holes in transmission at PHY layer
                         /// (which produce erroneous UL CQI evaluation)
                     }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-ue-mac.h ns-3.44/src/lte/model/lte-ue-mac.h
--- ns-3.43/src/lte/model/lte-ue-mac.h	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/model/lte-ue-mac.h	2025-03-09 16:55:49.603371900 -0700
@@ -15,11 +15,11 @@
 #include "lte-ue-cmac-sap.h"
 #include "lte-ue-phy-sap.h"
 
-#include <ns3/event-id.h>
-#include <ns3/nstime.h>
-#include <ns3/packet-burst.h>
-#include <ns3/packet.h>
-#include <ns3/traced-callback.h>
+#include "ns3/event-id.h"
+#include "ns3/nstime.h"
+#include "ns3/packet-burst.h"
+#include "ns3/packet.h"
+#include "ns3/traced-callback.h"
 
 #include <map>
 #include <vector>
@@ -40,8 +40,8 @@
 
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -50,14 +50,14 @@
     void DoDispose() override;
 
     /**
-     * \brief TracedCallback signature for RA response timeout events
+     * @brief TracedCallback signature for RA response timeout events
      * exporting IMSI, contention flag, preamble transmission counter
      * and the max limit of preamble transmission
      *
-     * \param [in] imsi
-     * \param [in] contention
-     * \param [in] preambleTxCounter
-     * \param [in] maxPreambleTxLimit
+     * @param [in] imsi
+     * @param [in] contention
+     * @param [in] preambleTxCounter
+     * @param [in] maxPreambleTxLimit
      */
     typedef void (*RaResponseTimeoutTracedCallback)(uint64_t imsi,
                                                     bool contention,
@@ -65,44 +65,44 @@
                                                     uint8_t maxPreambleTxLimit);
 
     /**
-     * \brief Get the LTE MAC SAP provider
-     * \return a pointer to the LTE MAC SAP provider
+     * @brief Get the LTE MAC SAP provider
+     * @return a pointer to the LTE MAC SAP provider
      */
     LteMacSapProvider* GetLteMacSapProvider();
     /**
-     * \brief Set the LTE UE CMAC SAP user
-     * \param s the LTE UE CMAC SAP User
+     * @brief Set the LTE UE CMAC SAP user
+     * @param s the LTE UE CMAC SAP User
      */
     void SetLteUeCmacSapUser(LteUeCmacSapUser* s);
     /**
-     * \brief Get the LTE CMAC SAP provider
-     * \return a pointer to the LTE CMAC SAP provider
+     * @brief Get the LTE CMAC SAP provider
+     * @return a pointer to the LTE CMAC SAP provider
      */
     LteUeCmacSapProvider* GetLteUeCmacSapProvider();
 
     /**
-     * \brief Set the component carried ID
-     * \param index the component carrier ID
+     * @brief Set the component carried ID
+     * @param index the component carrier ID
      */
     void SetComponentCarrierId(uint8_t index);
 
     /**
-     * \brief Get the PHY SAP user
-     * \return a pointer to the SAP user of the PHY
+     * @brief Get the PHY SAP user
+     * @return a pointer to the SAP user of the PHY
      */
     LteUePhySapUser* GetLteUePhySapUser();
 
     /**
-     * \brief Set the PHY SAP Provider
-     * \param s a pointer to the PHY SAP Provider
+     * @brief Set the PHY SAP Provider
+     * @param s a pointer to the PHY SAP Provider
      */
     void SetLteUePhySapProvider(LteUePhySapProvider* s);
 
     /**
-     * \brief Forwarded from LteUePhySapUser: trigger the start from a new frame
+     * @brief Forwarded from LteUePhySapUser: trigger the start from a new frame
      *
-     * \param frameNo frame number
-     * \param subframeNo subframe number
+     * @param frameNo frame number
+     * @param subframeNo subframe number
      */
     void DoSubframeIndication(uint32_t frameNo, uint32_t subframeNo);
 
@@ -111,8 +111,8 @@
      * used by this model.  Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream);
 
@@ -121,13 +121,13 @@
     /**
      * Transmit PDU function
      *
-     * \param params LteMacSapProvider::TransmitPduParameters
+     * @param params LteMacSapProvider::TransmitPduParameters
      */
     void DoTransmitPdu(LteMacSapProvider::TransmitPduParameters params);
     /**
      * Report buffers status function
      *
-     * \param params LteMacSapProvider::ReportBufferStatusParameters
+     * @param params LteMacSapProvider::ReportBufferStatusParameters
      */
     void DoReportBufferStatus(LteMacSapProvider::ReportBufferStatusParameters params);
 
@@ -135,7 +135,7 @@
     /**
      * Configure RACH function
      *
-     * \param rc LteUeCmacSapProvider::RachConfig
+     * @param rc LteUeCmacSapProvider::RachConfig
      */
     void DoConfigureRach(LteUeCmacSapProvider::RachConfig rc);
     /**
@@ -145,15 +145,15 @@
     /**
      * Set RNTI
      *
-     * \param rnti the RNTI
+     * @param rnti the RNTI
      */
     void DoSetRnti(uint16_t rnti);
     /**
      * Start non contention based random access procedure function
      *
-     * \param rnti the RNTI
-     * \param rapId the RAPID
-     * \param prachMask the PRACH mask
+     * @param rnti the RNTI
+     * @param rapId the RAPID
+     * @param prachMask the PRACH mask
      */
     void DoStartNonContentionBasedRandomAccessProcedure(uint16_t rnti,
                                                         uint8_t rapId,
@@ -161,9 +161,9 @@
     /**
      * Add LC function
      *
-     * \param lcId the LCID
-     * \param lcConfig the logical channel config
-     * \param msu the MSU
+     * @param lcId the LCID
+     * @param lcConfig the logical channel config
+     * @param msu the MSU
      */
     void DoAddLc(uint8_t lcId,
                  LteUeCmacSapProvider::LogicalChannelConfig lcConfig,
@@ -171,22 +171,22 @@
     /**
      * Remove LC function
      *
-     * \param lcId the LCID
+     * @param lcId the LCID
      */
     void DoRemoveLc(uint8_t lcId);
     /**
-     * \brief Reset function
+     * @brief Reset function
      */
     void DoReset();
     /**
-     * \brief Notify MAC about the successful RRC connection
+     * @brief Notify MAC about the successful RRC connection
      * establishment.
      */
     void DoNotifyConnectionSuccessful();
     /**
      * Set IMSI
      *
-     * \param imsi the IMSI of the UE
+     * @param imsi the IMSI of the UE
      */
     void DoSetImsi(uint64_t imsi);
 
@@ -194,13 +194,13 @@
     /**
      * Receive Phy PDU function
      *
-     * \param p the packet
+     * @param p the packet
      */
     void DoReceivePhyPdu(Ptr<Packet> p);
     /**
      * Receive LTE control message function
      *
-     * \param msg the LTE control message
+     * @param msg the LTE control message
      */
     void DoReceiveLteControlMessage(Ptr<LteControlMessage> msg);
 
@@ -210,7 +210,7 @@
     /**
      * Send RA preamble function
      *
-     * \param contention if true randomly select and send the RA preamble
+     * @param contention if true randomly select and send the RA preamble
      */
     void SendRaPreamble(bool contention);
     /// Start waiting for RA response function
@@ -218,13 +218,13 @@
     /**
      * Receive the RA response function
      *
-     * \param raResponse RA response received
+     * @param raResponse RA response received
      */
     void RecvRaResponse(BuildRarListElement_s raResponse);
     /**
      * RA response timeout function
      *
-     * \param contention if true randomly select and send the RA preamble
+     * @param contention if true randomly select and send the RA preamble
      */
     void RaResponseTimeout(bool contention);
     /// Send report buffer status
@@ -283,7 +283,7 @@
     bool m_waitingForRaResponse; ///< waiting for RA response
 
     /**
-     * \brief The `RaResponseTimeout` trace source. Fired RA response timeout.
+     * @brief The `RaResponseTimeout` trace source. Fired RA response timeout.
      * Exporting IMSI, contention flag, preamble transmission counter
      * and the max limit of preamble transmission.
      */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-ue-net-device.cc ns-3.44/src/lte/model/lte-ue-net-device.cc
--- ns-3.43/src/lte/model/lte-ue-net-device.cc	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/model/lte-ue-net-device.cc	2025-03-09 16:55:49.603371900 -0700
@@ -24,22 +24,22 @@
 #include "ns3/callback.h"
 #include "ns3/enum.h"
 #include "ns3/ipv4-header.h"
+#include "ns3/ipv4-l3-protocol.h"
 #include "ns3/ipv4.h"
 #include "ns3/ipv6-header.h"
+#include "ns3/ipv6-l3-protocol.h"
 #include "ns3/ipv6.h"
 #include "ns3/llc-snap-header.h"
+#include "ns3/log.h"
 #include "ns3/node.h"
+#include "ns3/object-factory.h"
+#include "ns3/object-map.h"
 #include "ns3/packet-burst.h"
 #include "ns3/packet.h"
 #include "ns3/pointer.h"
 #include "ns3/simulator.h"
 #include "ns3/trace-source-accessor.h"
 #include "ns3/uinteger.h"
-#include <ns3/ipv4-l3-protocol.h>
-#include <ns3/ipv6-l3-protocol.h>
-#include <ns3/log.h>
-#include <ns3/object-factory.h>
-#include <ns3/object-map.h>
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-ue-net-device.h ns-3.44/src/lte/model/lte-ue-net-device.h
--- ns-3.43/src/lte/model/lte-ue-net-device.h	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/model/lte-ue-net-device.h	2025-03-09 16:55:49.603371900 -0700
@@ -39,15 +39,15 @@
 class LteUeComponentCarrierManager;
 
 /**
- * \ingroup lte
+ * @ingroup lte
  * The LteUeNetDevice class implements the UE net device
  */
 class LteUeNetDevice : public LteNetDevice
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -59,43 +59,43 @@
     bool Send(Ptr<Packet> packet, const Address& dest, uint16_t protocolNumber) override;
 
     /**
-     * \brief Get the MAC.
-     * \return the LTE UE MAC
+     * @brief Get the MAC.
+     * @return the LTE UE MAC
      */
     Ptr<LteUeMac> GetMac() const;
 
     /**
-     * \brief Get the RRC.
-     * \return the LTE UE RRC
+     * @brief Get the RRC.
+     * @return the LTE UE RRC
      */
     Ptr<LteUeRrc> GetRrc() const;
 
     /**
-     * \brief Get the Phy.
-     * \return the LTE UE Phy
+     * @brief Get the Phy.
+     * @return the LTE UE Phy
      */
     Ptr<LteUePhy> GetPhy() const;
 
     /**
-     * \brief Get the NAS.
-     * \return the LTE UE NAS
+     * @brief Get the NAS.
+     * @return the LTE UE NAS
      */
     Ptr<EpcUeNas> GetNas() const;
 
     /**
-     * \brief Get the componentn carrier manager.
-     * \return the LTE UE component carrier manager
+     * @brief Get the componentn carrier manager.
+     * @return the LTE UE component carrier manager
      */
     Ptr<LteUeComponentCarrierManager> GetComponentCarrierManager() const;
 
     /**
-     * \brief Get the IMSI.
-     * \return the IMSI
+     * @brief Get the IMSI.
+     * @return the IMSI
      */
     uint64_t GetImsi() const;
 
     /**
-     * \return the downlink carrier frequency (EARFCN)
+     * @return the downlink carrier frequency (EARFCN)
      *
      * Note that real-life handset typically supports more than one EARFCN, but
      * the sake of simplicity we assume only one EARFCN is supported.
@@ -103,7 +103,7 @@
     uint32_t GetDlEarfcn() const;
 
     /**
-     * \param earfcn the downlink carrier frequency (EARFCN)
+     * @param earfcn the downlink carrier frequency (EARFCN)
      *
      * Note that real-life handset typically supports more than one EARFCN, but
      * the sake of simplicity we assume only one EARFCN is supported.
@@ -111,45 +111,45 @@
     void SetDlEarfcn(uint32_t earfcn);
 
     /**
-     * \brief Returns the CSG ID the UE is currently a member of.
-     * \return the Closed Subscriber Group identity
+     * @brief Returns the CSG ID the UE is currently a member of.
+     * @return the Closed Subscriber Group identity
      */
     uint32_t GetCsgId() const;
 
     /**
-     * \brief Enlist the UE device as a member of a particular CSG.
-     * \param csgId the intended Closed Subscriber Group identity
+     * @brief Enlist the UE device as a member of a particular CSG.
+     * @param csgId the intended Closed Subscriber Group identity
      *
      * UE is associated with a single CSG identity, and thus becoming a member of
      * this particular CSG. As a result, the UE may gain access to cells which
      * belong to this CSG. This does not revoke the UE's access to non-CSG cells.
      *
-     * \note This restriction only applies to initial cell selection and
+     * @note This restriction only applies to initial cell selection and
      *       EPC-enabled simulation.
      */
     void SetCsgId(uint32_t csgId);
 
     /**
-     * \brief Set the target eNB where the UE is registered
-     * \param enb
+     * @brief Set the target eNB where the UE is registered
+     * @param enb
      */
     void SetTargetEnb(Ptr<LteEnbNetDevice> enb);
 
     /**
-     * \brief Get the target eNB where the UE is registered
-     * \return the pointer to the enb
+     * @brief Get the target eNB where the UE is registered
+     * @return the pointer to the enb
      */
     Ptr<LteEnbNetDevice> GetTargetEnb();
 
     /**
-     * \brief Set the ComponentCarrier Map for the UE
-     * \param ccm the map of ComponentCarrierUe
+     * @brief Set the ComponentCarrier Map for the UE
+     * @param ccm the map of ComponentCarrierUe
      */
     void SetCcMap(std::map<uint8_t, Ptr<ComponentCarrierUe>> ccm);
 
     /**
-     * \brief Get the ComponentCarrier Map for the UE
-     * \returns the map of ComponentCarrierUe
+     * @brief Get the ComponentCarrier Map for the UE
+     * @returns the map of ComponentCarrierUe
      */
     std::map<uint8_t, Ptr<ComponentCarrierUe>> GetCcMap();
 
@@ -161,7 +161,7 @@
     bool m_isConstructed; ///< is constructed?
 
     /**
-     * \brief Propagate attributes and configuration to sub-modules.
+     * @brief Propagate attributes and configuration to sub-modules.
      *
      * Several attributes (e.g., the IMSI) are exported as the attributes of the
      * LteUeNetDevice from a user perspective, but are actually used also in other
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-ue-phy.cc ns-3.44/src/lte/model/lte-ue-phy.cc
--- ns-3.43/src/lte/model/lte-ue-phy.cc	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/model/lte-ue-phy.cc	2025-03-09 16:55:49.607372000 -0700
@@ -21,13 +21,13 @@
 #include "lte-ue-net-device.h"
 #include "lte-ue-power-control.h"
 
-#include <ns3/boolean.h>
-#include <ns3/double.h>
-#include <ns3/log.h>
-#include <ns3/node.h>
-#include <ns3/object-factory.h>
-#include <ns3/pointer.h>
-#include <ns3/simulator.h>
+#include "ns3/boolean.h"
+#include "ns3/double.h"
+#include "ns3/log.h"
+#include "ns3/node.h"
+#include "ns3/object-factory.h"
+#include "ns3/pointer.h"
+#include "ns3/simulator.h"
 
 #include <cfloat>
 #include <cmath>
@@ -64,7 +64,7 @@
     /**
      * Constructor
      *
-     * \param phy the LTE UE Phy
+     * @param phy the LTE UE Phy
      */
     UeMemberLteUePhySapProvider(LteUePhy* phy);
 
@@ -111,22 +111,6 @@
 // LteUePhy methods
 ////////////////////////////////////////
 
-/// Map each of UE PHY states to its string representation.
-static const std::string g_uePhyStateName[LteUePhy::NUM_STATES] = {
-    "CELL_SEARCH",
-    "SYNCHRONIZED",
-};
-
-/**
- * \param s The UE PHY state.
- * \return The string representation of the given state.
- */
-static inline const std::string&
-ToString(LteUePhy::State s)
-{
-    return g_uePhyStateName[s];
-}
-
 NS_OBJECT_ENSURE_REGISTERED(LteUePhy);
 
 LteUePhy::LteUePhy()
@@ -146,7 +130,7 @@
       m_dataInterferencePowerUpdated(false),
       m_pssReceived(false),
       m_ueMeasurementsFilterPeriod(MilliSeconds(200)),
-      m_ueMeasurementsFilterLast(MilliSeconds(0)),
+      m_ueMeasurementsFilterLast(),
       m_rsrpSinrSampleCounter(0),
       m_imsi(0)
 {
@@ -630,58 +614,59 @@
         m_rsrpSinrSampleCounter = 0;
     }
 
-    if (m_pssReceived)
+    if (!m_pssReceived)
     {
-        // measure instantaneous RSRQ now
-        NS_ASSERT_MSG(m_rsInterferencePowerUpdated, " RS interference power info obsolete");
+        return;
+    }
 
-        auto itPss = m_pssList.begin();
-        while (itPss != m_pssList.end())
-        {
-            uint16_t rbNum = 0;
-            double rssiSum = 0.0;
+    // measure instantaneous RSRQ now
+    NS_ASSERT_MSG(m_rsInterferencePowerUpdated, " RS interference power info obsolete");
 
-            auto itIntN = m_rsInterferencePower.ConstValuesBegin();
-            auto itPj = m_rsReceivedPower.ConstValuesBegin();
-            for (itPj = m_rsReceivedPower.ConstValuesBegin();
-                 itPj != m_rsReceivedPower.ConstValuesEnd();
-                 itIntN++, itPj++)
+    auto itPss = m_pssList.begin();
+    while (itPss != m_pssList.end())
+    {
+        uint16_t rbNum = 0;
+        double rssiSum = 0.0;
+
+        auto itIntN = m_rsInterferencePower.ConstValuesBegin();
+        auto itPj = m_rsReceivedPower.ConstValuesBegin();
+        for (itPj = m_rsReceivedPower.ConstValuesBegin();
+             itPj != m_rsReceivedPower.ConstValuesEnd();
+             itIntN++, itPj++)
+        {
+            rbNum++;
+            // convert PSD [W/Hz] to linear power [W] for the single RE
+            double interfPlusNoisePowerTxW = (*itIntN);
+            double signalPowerTxW = (*itPj);
+            rssiSum += (2 * (interfPlusNoisePowerTxW + signalPowerTxW));
+        }
+        rssiSum *= (180000.0 / 12.0);
+
+        NS_ASSERT(rbNum == (*itPss).nRB);
+        double rsrq_dB = 10 * log10((*itPss).pssPsdSum / rssiSum);
+
+        if (rsrq_dB > m_pssReceptionThreshold)
+        {
+            NS_LOG_INFO(this << " PSS RNTI " << m_rnti << " cellId " << m_cellId << " has RSRQ "
+                             << rsrq_dB << " and RBnum " << rbNum);
+            // store measurements
+            auto itMeasMap = m_ueMeasurementsMap.find((*itPss).cellId);
+            if (itMeasMap != m_ueMeasurementsMap.end())
             {
-                rbNum++;
-                // convert PSD [W/Hz] to linear power [W] for the single RE
-                double interfPlusNoisePowerTxW = (*itIntN);
-                double signalPowerTxW = (*itPj);
-                rssiSum += (2 * (interfPlusNoisePowerTxW + signalPowerTxW));
+                (*itMeasMap).second.rsrqSum += rsrq_dB;
+                (*itMeasMap).second.rsrqNum++;
             }
-            rssiSum *= (180000.0 / 12.0);
-
-            NS_ASSERT(rbNum == (*itPss).nRB);
-            double rsrq_dB = 10 * log10((*itPss).pssPsdSum / rssiSum);
-
-            if (rsrq_dB > m_pssReceptionThreshold)
+            else
             {
-                NS_LOG_INFO(this << " PSS RNTI " << m_rnti << " cellId " << m_cellId << " has RSRQ "
-                                 << rsrq_dB << " and RBnum " << rbNum);
-                // store measurements
-                auto itMeasMap = m_ueMeasurementsMap.find((*itPss).cellId);
-                if (itMeasMap != m_ueMeasurementsMap.end())
-                {
-                    (*itMeasMap).second.rsrqSum += rsrq_dB;
-                    (*itMeasMap).second.rsrqNum++;
-                }
-                else
-                {
-                    NS_LOG_WARN("race condition of bug 2091 occurred");
-                }
+                NS_LOG_WARN("race condition of bug 2091 occurred");
             }
+        }
 
-            itPss++;
-
-        } // end of while (itPss != m_pssList.end ())
+        itPss++;
 
-        m_pssList.clear();
+    } // end of while (itPss != m_pssList.end ())
 
-    } // end of if (m_pssReceived)
+    m_pssList.clear();
 
 } // end of void LteUePhy::GenerateCtrlCqiReport (const SpectrumValue& sinr)
 
@@ -1322,6 +1307,7 @@
     NS_ASSERT(m_cellId > 0);
     // set the current tx power spectral density (full bandwidth)
     std::vector<int> dlRb;
+    dlRb.reserve(m_ulBandwidth);
     for (uint16_t i = 0; i < m_ulBandwidth; i++)
     {
         dlRb.push_back(i);
@@ -1754,9 +1740,24 @@
     NS_LOG_FUNCTION(this << newState);
     State oldState = m_state;
     m_state = newState;
-    NS_LOG_INFO(this << " cellId=" << m_cellId << " rnti=" << m_rnti << " UePhy "
-                     << ToString(oldState) << " --> " << ToString(newState));
+    NS_LOG_INFO(this << " cellId=" << m_cellId << " rnti=" << m_rnti << " UePhy " << oldState
+                     << " --> " << newState);
     m_stateTransitionTrace(m_cellId, m_rnti, oldState, newState);
 }
 
+std::ostream&
+operator<<(std::ostream& os, LteUePhy::State state)
+{
+    switch (state)
+    {
+    case LteUePhy::State::CELL_SEARCH:
+        return os << "CELL_SEARCH";
+    case LteUePhy::State::SYNCHRONIZED:
+        return os << "SYNCHRONIZED";
+    case LteUePhy::State::NUM_STATES:
+        return os << "NUM_STATES";
+    };
+    return os << "UNKNOWN(" << static_cast<uint32_t>(state) << ")";
+}
+
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-ue-phy.h ns-3.44/src/lte/model/lte-ue-phy.h
--- ns-3.43/src/lte/model/lte-ue-phy.h	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/model/lte-ue-phy.h	2025-03-09 16:55:49.607372000 -0700
@@ -21,7 +21,7 @@
 #include "lte-ue-phy-sap.h"
 #include "lte-ue-power-control.h"
 
-#include <ns3/ptr.h>
+#include "ns3/ptr.h"
 
 #include <set>
 
@@ -33,7 +33,7 @@
 class LteHarqPhy;
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
  * The LteSpectrumPhy models the physical layer of LTE
  */
@@ -46,7 +46,7 @@
 
   public:
     /**
-     * \brief The states of the UE PHY entity
+     * @brief The states of the UE PHY entity
      */
     enum State
     {
@@ -62,16 +62,16 @@
 
     /**
      *
-     * \param dlPhy the downlink LteSpectrumPhy instance
-     * \param ulPhy the uplink LteSpectrumPhy instance
+     * @param dlPhy the downlink LteSpectrumPhy instance
+     * @param ulPhy the uplink LteSpectrumPhy instance
      */
     LteUePhy(Ptr<LteSpectrumPhy> dlPhy, Ptr<LteSpectrumPhy> ulPhy);
 
     ~LteUePhy() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     // inherited from Object
@@ -79,128 +79,128 @@
     void DoDispose() override;
 
     /**
-     * \brief Get the PHY SAP provider
+     * @brief Get the PHY SAP provider
      *
-     * \return a pointer to the SAP Provider
+     * @return a pointer to the SAP Provider
      */
     LteUePhySapProvider* GetLteUePhySapProvider();
 
     /**
-     * \brief Set the PHY SAP User
+     * @brief Set the PHY SAP User
      *
-     * \param s a pointer to the SAP user
+     * @param s a pointer to the SAP user
      */
     void SetLteUePhySapUser(LteUePhySapUser* s);
 
     /**
-     * \brief Get the CPHY SAP provider
+     * @brief Get the CPHY SAP provider
      *
-     * \return a pointer to the SAP Provider
+     * @return a pointer to the SAP Provider
      */
     LteUeCphySapProvider* GetLteUeCphySapProvider();
 
     /**
-     * \brief Set the CPHY SAP User
+     * @brief Set the CPHY SAP User
      *
-     * \param s a pointer to the SAP user
+     * @param s a pointer to the SAP user
      */
     void SetLteUeCphySapUser(LteUeCphySapUser* s);
 
     /**
-     * \brief Set transmit power
+     * @brief Set transmit power
      *
-     * \param pow the transmission power in dBm
+     * @param pow the transmission power in dBm
      */
     void SetTxPower(double pow);
 
     /**
-     * \brief Get transmit power
+     * @brief Get transmit power
      *
-     * \return the transmission power in dBm
+     * @return the transmission power in dBm
      */
     double GetTxPower() const;
 
     /**
-     * \brief Get Uplink power control
+     * @brief Get Uplink power control
      *
-     * \return ptr to UE Uplink Power Control entity
+     * @return ptr to UE Uplink Power Control entity
      */
     Ptr<LteUePowerControl> GetUplinkPowerControl() const;
 
     /**
-     * \brief Set noise figure
+     * @brief Set noise figure
      *
-     * \param nf the noise figure in dB
+     * @param nf the noise figure in dB
      */
     void SetNoiseFigure(double nf);
 
     /**
-     * \brief Get noise figure
+     * @brief Get noise figure
      *
-     * \return the noise figure in dB
+     * @return the noise figure in dB
      */
     double GetNoiseFigure() const;
 
     /**
-     * \brief Get MAC to Channel delay
+     * @brief Get MAC to Channel delay
      *
-     * \returns the TTI delay between MAC and channel
+     * @returns the TTI delay between MAC and channel
      */
     uint8_t GetMacChDelay() const;
 
     /**
-     * \brief Get Downlink spectrum phy
+     * @brief Get Downlink spectrum phy
      *
-     * \return a pointer to the LteSpectrumPhy instance relative to the downlink
+     * @return a pointer to the LteSpectrumPhy instance relative to the downlink
      */
     Ptr<LteSpectrumPhy> GetDlSpectrumPhy() const;
 
     /**
-     * \brief Get Uplink spectrum phy
+     * @brief Get Uplink spectrum phy
      *
-     * \return a pointer to the LteSpectrumPhy instance relative to the uplink
+     * @return a pointer to the LteSpectrumPhy instance relative to the uplink
      */
     Ptr<LteSpectrumPhy> GetUlSpectrumPhy() const;
 
     /**
-     * \brief Create the PSD for the TX
+     * @brief Create the PSD for the TX
      *
-     * \return the pointer to the PSD
+     * @return the pointer to the PSD
      */
     Ptr<SpectrumValue> CreateTxPowerSpectralDensity() override;
 
     /**
-     * \brief Set a list of sub channels to use in TX
+     * @brief Set a list of sub channels to use in TX
      *
-     * \param mask a list of sub channels
+     * @param mask a list of sub channels
      */
     void SetSubChannelsForTransmission(std::vector<int> mask);
     /**
-     * \brief Get a list of sub channels to use in RX
+     * @brief Get a list of sub channels to use in RX
      *
-     * \return a list of sub channels
+     * @return a list of sub channels
      */
     std::vector<int> GetSubChannelsForTransmission();
 
     /**
-     * \brief Get a list of sub channels to use in RX
+     * @brief Get a list of sub channels to use in RX
      *
-     * \param mask list of sub channels
+     * @param mask list of sub channels
      */
     void SetSubChannelsForReception(std::vector<int> mask);
     /**
-     * \brief Get a list of sub channels to use in RX
+     * @brief Get a list of sub channels to use in RX
      *
-     * \return a list of sub channels
+     * @return a list of sub channels
      */
     std::vector<int> GetSubChannelsForReception();
 
     /**
-     * \brief Create the DL CQI feedback from SINR values perceived at
+     * @brief Create the DL CQI feedback from SINR values perceived at
      * the physical layer with the signal received from eNB
      *
-     * \param sinr SINR values vector
-     * \return a DL CQI control message containing the CQI feedback
+     * @param sinr SINR values vector
+     * @return a DL CQI control message containing the CQI feedback
      */
     Ptr<DlCqiLteControlMessage> CreateDlCqiFeedbackMessage(const SpectrumValue& sinr);
 
@@ -208,83 +208,83 @@
     void GenerateCtrlCqiReport(const SpectrumValue& sinr) override;
     void GenerateDataCqiReport(const SpectrumValue& sinr) override;
     /**
-     * \brief Create the mixed CQI report
+     * @brief Create the mixed CQI report
      *
-     * \param sinr SINR values vector
+     * @param sinr SINR values vector
      */
     virtual void GenerateMixedCqiReport(const SpectrumValue& sinr);
     void ReportInterference(const SpectrumValue& interf) override;
     /**
-     * \brief Create the mixed CQI report
+     * @brief Create the mixed CQI report
      *
-     * \param interf interference values vector
+     * @param interf interference values vector
      */
     virtual void ReportDataInterference(const SpectrumValue& interf);
     void ReportRsReceivedPower(const SpectrumValue& power) override;
 
     // callbacks for LteSpectrumPhy
     /**
-     * \brief Receive LTE control message list function
+     * @brief Receive LTE control message list function
      *
-     * \param msgList LTE control message list
+     * @param msgList LTE control message list
      */
     virtual void ReceiveLteControlMessageList(std::list<Ptr<LteControlMessage>> msgList);
     /**
-     * \brief Receive PSS function
+     * @brief Receive PSS function
      *
-     * \param cellId the cell ID
-     * \param p PSS list
+     * @param cellId the cell ID
+     * @param p PSS list
      */
     virtual void ReceivePss(uint16_t cellId, Ptr<SpectrumValue> p);
 
     /**
-     * \brief PhySpectrum received a new PHY-PDU
+     * @brief PhySpectrum received a new PHY-PDU
      *
-     * \param p the packet received
+     * @param p the packet received
      */
     void PhyPduReceived(Ptr<Packet> p);
 
     /**
-     * \brief trigger from eNB the start from a new frame
+     * @brief trigger from eNB the start from a new frame
      *
-     * \param frameNo frame number
-     * \param subframeNo subframe number
+     * @param frameNo frame number
+     * @param subframeNo subframe number
      */
     void SubframeIndication(uint32_t frameNo, uint32_t subframeNo);
 
     /**
-     * \brief Send the SRS signal in the last symbols of the frame
+     * @brief Send the SRS signal in the last symbols of the frame
      */
     void SendSrs();
 
     /**
-     * \brief Enqueue the downlink HARQ feedback generated by LteSpectrumPhy
+     * @brief Enqueue the downlink HARQ feedback generated by LteSpectrumPhy
      *
-     * \param mes the DlInfoListElement_s
+     * @param mes the DlInfoListElement_s
      */
     virtual void EnqueueDlHarqFeedback(DlInfoListElement_s mes);
 
     /**
-     * \brief Set the HARQ PHY module
+     * @brief Set the HARQ PHY module
      *
-     * \param harq the HARQ PHY module
+     * @param harq the HARQ PHY module
      */
     void SetHarqPhyModule(Ptr<LteHarqPhy> harq);
 
     /**
-     * \brief Get state of the UE physical layer
+     * @brief Get state of the UE physical layer
      *
-     * \return The current state
+     * @return The current state
      */
     State GetState() const;
 
     /**
      * TracedCallback signature for state transition events.
      *
-     * \param [in] cellId
-     * \param [in] rnti
-     * \param [in] oldState
-     * \param [in] newState
+     * @param [in] cellId
+     * @param [in] rnti
+     * @param [in] oldState
+     * @param [in] newState
      */
     typedef void (*StateTracedCallback)(uint16_t cellId,
                                         uint16_t rnti,
@@ -294,11 +294,11 @@
     /**
      * TracedCallback signature for cell RSRP and SINR report.
      *
-     * \param [in] cellId
-     * \param [in] rnti
-     * \param [in] rsrp
-     * \param [in] sinr
-     * \param [in] componentCarrierId
+     * @param [in] cellId
+     * @param [in] rnti
+     * @param [in] rsrp
+     * @param [in] sinr
+     * @param [in] componentCarrierId
      */
     typedef void (*RsrpSinrTracedCallback)(uint16_t cellId,
                                            uint16_t rnti,
@@ -309,12 +309,12 @@
     /**
      * TracedCallback signature for cell RSRP and RSRQ.
      *
-     * \param [in] rnti
-     * \param [in] cellId
-     * \param [in] rsrp
-     * \param [in] rsrq
-     * \param [in] isServingCell
-     * \param [in] componentCarrierId
+     * @param [in] rnti
+     * @param [in] cellId
+     * @param [in] rsrp
+     * @param [in] rsrq
+     * @param [in] isServingCell
+     * @param [in] componentCarrierId
      */
     typedef void (*RsrpRsrqTracedCallback)(uint16_t rnti,
                                            uint16_t cellId,
@@ -326,86 +326,86 @@
     /**
      * TracedCallback signature for UL Phy resource blocks.
      *
-     * \param [in] rnti
-     * \param [in] rbs Vector of resource blocks allocated for UL.
+     * @param [in] rnti
+     * @param [in] rbs Vector of resource blocks allocated for UL.
      */
     typedef void (*UlPhyResourceBlocksTracedCallback)(uint16_t rnti, const std::vector<int>& rbs);
 
     /**
      * TracedCallback signature for spectral value.
      *
-     * \param [in] rnti
-     * \param [in] psd The spectral power density.
+     * @param [in] rnti
+     * @param [in] psd The spectral power density.
      */
     typedef void (*PowerSpectralDensityTracedCallback)(uint16_t rnti, Ptr<SpectrumValue> psd);
 
   private:
     /**
-     * \brief Set transmit mode 1 gain function
+     * @brief Set transmit mode 1 gain function
      *
-     * \param [in] gain
+     * @param [in] gain
      */
     void SetTxMode1Gain(double gain);
     /**
      * Set transmit mode 2 gain function
      *
-     * \param [in] gain
+     * @param [in] gain
      */
     void SetTxMode2Gain(double gain);
     /**
-     * \brief Set transmit mode 3 gain function
+     * @brief Set transmit mode 3 gain function
      *
-     * \param [in] gain
+     * @param [in] gain
      */
     void SetTxMode3Gain(double gain);
     /**
-     * \brief Set transmit mode 4 gain function
+     * @brief Set transmit mode 4 gain function
      *
-     * \param [in] gain
+     * @param [in] gain
      */
     void SetTxMode4Gain(double gain);
     /**
-     * \brief Set transmit mode 5 gain function
+     * @brief Set transmit mode 5 gain function
      *
-     * \param [in] gain
+     * @param [in] gain
      */
     void SetTxMode5Gain(double gain);
     /**
-     * \brief Set transmit mode 6 gain function
+     * @brief Set transmit mode 6 gain function
      *
-     * \param [in] gain
+     * @param [in] gain
      */
     void SetTxMode6Gain(double gain);
     /**
-     * \brief Set transmit mode 7 gain function
+     * @brief Set transmit mode 7 gain function
      *
-     * \param [in] gain
+     * @param [in] gain
      */
     void SetTxMode7Gain(double gain);
     /**
-     * \brief Set transmit mode gain function
+     * @brief Set transmit mode gain function
      *
-     * \param [in] txMode
-     * \param [in] gain
+     * @param [in] txMode
+     * @param [in] gain
      */
     void SetTxModeGain(uint8_t txMode, double gain);
     /**
-     * \brief Queue subchannels for transmission function
+     * @brief Queue subchannels for transmission function
      *
-     * \param [in] rbMap
+     * @param [in] rbMap
      */
     void QueueSubChannelsForTransmission(std::vector<int> rbMap);
     /**
-     * \brief Get CQI, RSRP, and RSRQ
+     * @brief Get CQI, RSRP, and RSRQ
      *
      * internal method that takes care of generating CQI reports,
      * calculating the RSRP and RSRQ metrics, and generating RSRP+SINR traces
      *
-     * \param sinr
+     * @param sinr
      */
     void GenerateCqiRsrpRsrq(const SpectrumValue& sinr);
     /**
-     * \brief Layer-1 filtering of RSRP and RSRQ measurements and reporting to
+     * @brief Layer-1 filtering of RSRP and RSRQ measurements and reporting to
      *        the RRC entity.
      *
      * Initially executed at +0.200s, and then repeatedly executed with
@@ -413,138 +413,138 @@
      */
     void ReportUeMeasurements();
     /**
-     * \brief Set the periodicty for the downlink periodic
+     * @brief Set the periodicty for the downlink periodic
      * wideband and aperiodic subband CQI reporting.
      *
-     * \param cqiPeriodicity The downlink CQI reporting periodicity in milliseconds
+     * @param cqiPeriodicity The downlink CQI reporting periodicity in milliseconds
      */
     void SetDownlinkCqiPeriodicity(Time cqiPeriodicity);
     /**
-     * \brief Switch the UE PHY to the given state.
-     * \param s the destination state
+     * @brief Switch the UE PHY to the given state.
+     * @param s the destination state
      */
     void SwitchToState(State s);
     /**
-     * \brief Set number of Qout evaluation subframes
+     * @brief Set number of Qout evaluation subframes
      *
      * The number passed to this method should be multiple
      * of 10. This number specifies the total number of consecutive
      * subframes, which corresponds to the Qout evaluation period.
      *
-     * \param numSubframes the number of subframes
+     * @param numSubframes the number of subframes
      */
     void SetNumQoutEvalSf(uint16_t numSubframes);
     /**
-     * \brief Set number of Qin evaluation subframes
+     * @brief Set number of Qin evaluation subframes
      *
      * The number passed to this method should be multiple
      * of 10. This number specifies the total number of consecutive
      * subframes, which corresponds to the Qin evaluation period.
      *
-     * \param numSubframes the number of subframes
+     * @param numSubframes the number of subframes
      */
     void SetNumQinEvalSf(uint16_t numSubframes);
     /**
-     * \brief Get number of Qout evaluation subframes
+     * @brief Get number of Qout evaluation subframes
      *
      * The number returned by this method specifies the
      * total number of consecutive subframes, which corresponds
      * to the Qout evaluation period.
      *
-     * \return the number of consecutive subframes used for Qout evaluation
+     * @return the number of consecutive subframes used for Qout evaluation
      */
     uint16_t GetNumQoutEvalSf() const;
     /**
-     * \brief Get number of Qin evaluation subframes
+     * @brief Get number of Qin evaluation subframes
      *
      * The number returned by this method specifies the
      * total number of consecutive subframes, which corresponds
      * to the Qin evaluation period.
      *
-     * \return the number of consecutive subframes used for Qin evaluation
+     * @return the number of consecutive subframes used for Qin evaluation
      */
     uint16_t GetNumQinEvalSf() const;
 
     // UE CPHY SAP methods
     /**
-     * \brief Do Reset function
+     * @brief Do Reset function
      */
     void DoReset();
     /**
-     * \brief Start the cell search function
+     * @brief Start the cell search function
      *
-     * \param dlEarfcn the DL EARFCN
+     * @param dlEarfcn the DL EARFCN
      */
     void DoStartCellSearch(uint32_t dlEarfcn);
     /**
-     * \brief Synchronize with ENB function
+     * @brief Synchronize with ENB function
      *
-     * \param cellId the cell ID
+     * @param cellId the cell ID
      */
     void DoSynchronizeWithEnb(uint16_t cellId);
     /**
-     * \brief Synchronize with ENB function
+     * @brief Synchronize with ENB function
      *
-     * \param cellId the cell ID
-     * \param dlEarfcn the DL EARFCN
+     * @param cellId the cell ID
+     * @param dlEarfcn the DL EARFCN
      */
     void DoSynchronizeWithEnb(uint16_t cellId, uint32_t dlEarfcn);
     /**
      *
      * Get cell ID
-     * \returns cell ID
+     * @returns cell ID
      */
     uint16_t DoGetCellId();
     /**
      * Get DL EARFCN
-     * \returns DL EARFCN
+     * @returns DL EARFCN
      */
     uint32_t DoGetDlEarfcn();
     /**
      * Set DL bandwidth function
      *
-     * \param dlBandwidth the DL bandwidth
+     * @param dlBandwidth the DL bandwidth
      */
     void DoSetDlBandwidth(uint16_t dlBandwidth);
     /**
-     * \brief Configure UL uplink function
+     * @brief Configure UL uplink function
      *
-     * \param ulEarfcn UL EARFCN
-     * \param ulBandwidth the UL bandwidth
+     * @param ulEarfcn UL EARFCN
+     * @param ulBandwidth the UL bandwidth
      */
     void DoConfigureUplink(uint32_t ulEarfcn, uint16_t ulBandwidth);
     /**
-     * \brief Configure reference signal power function
+     * @brief Configure reference signal power function
      *
-     * \param referenceSignalPower reference signal power in dBm
+     * @param referenceSignalPower reference signal power in dBm
      */
     void DoConfigureReferenceSignalPower(int8_t referenceSignalPower);
     /**
-     * \brief Set RNTI function
+     * @brief Set RNTI function
      *
-     * \param rnti the RNTI
+     * @param rnti the RNTI
      */
     void DoSetRnti(uint16_t rnti);
     /**
-     * \brief Set transmission mode function
+     * @brief Set transmission mode function
      *
-     * \param txMode the transmission mode
+     * @param txMode the transmission mode
      */
     void DoSetTransmissionMode(uint8_t txMode);
     /**
-     * \brief Set SRS configuration index function
+     * @brief Set SRS configuration index function
      *
-     * \param srcCi the SRS configuration index
+     * @param srcCi the SRS configuration index
      */
     void DoSetSrsConfigurationIndex(uint16_t srcCi);
     /**
-     * \brief Set PA function
+     * @brief Set PA function
      *
-     * \param pa the PA value
+     * @param pa the PA value
      */
     void DoSetPa(double pa);
     /**
-     * \brief Reset Phy after radio link failure function
+     * @brief Reset Phy after radio link failure function
      *
      * It resets the physical layer parameters of the
      * UE after RLF.
@@ -552,7 +552,7 @@
      */
     void DoResetPhyAfterRlf();
     /**
-     * \brief Reset radio link failure parameters
+     * @brief Reset radio link failure parameters
      *
      * Upon receiving N311 in Sync indications from the UE
      * PHY, the UE RRC instructs the UE PHY to reset the
@@ -562,7 +562,7 @@
     void DoResetRlfParams();
 
     /**
-     * \brief Start in Sync detection function
+     * @brief Start in Sync detection function
      *
      * When T310 timer is started, it indicates that physical layer
      * problems are detected at the UE and the recovery process is
@@ -573,7 +573,7 @@
     void DoStartInSyncDetection();
 
     /**
-     * \brief Radio link failure detection function
+     * @brief Radio link failure detection function
      *
      * Radio link monitoring is started to detect downlink radio link
      * quality when the UE is both uplink and downlink synchronized
@@ -586,13 +586,13 @@
      * downlink radio link quality estimated over the last 100 ms period becomes
      * better than the threshold Qin, an in-sync indication is sent to RRC.
      *
-     * \param sinrdB the average SINR value in dB measured across
+     * @param sinrdB the average SINR value in dB measured across
      * all resource blocks
      *
      */
     void RlfDetection(double sinrdB);
     /**
-     * \brief Initialize radio link failure parameters
+     * @brief Initialize radio link failure parameters
      *
      * Upon receiving the notification about the successful RRC connection
      * establishment, the UE phy initialize the RLF parameters to be
@@ -603,43 +603,43 @@
     /**
      * Set IMSI
      *
-     * \param imsi the IMSI of the UE
+     * @param imsi the IMSI of the UE
      */
     void DoSetImsi(uint64_t imsi);
     /**
-     * \brief Do set RSRP filter coefficient
+     * @brief Do set RSRP filter coefficient
      *
-     * \param rsrpFilterCoefficient value. Determines the strength of
+     * @param rsrpFilterCoefficient value. Determines the strength of
      * smoothing effect induced by layer 3 filtering of RSRP
      * used for uplink power control in all attached UE.
      * If equals to 0, no layer 3 filtering is applicable.
      */
     void DoSetRsrpFilterCoefficient(uint8_t rsrpFilterCoefficient);
     /**
-     * \brief Compute average SINR among the RBs
+     * @brief Compute average SINR among the RBs
      *
-     * \param sinr
-     * \return the average SINR value
+     * @param sinr
+     * @return the average SINR value
      */
     double ComputeAvgSinr(const SpectrumValue& sinr);
 
     // UE PHY SAP methods
     void DoSendMacPdu(Ptr<Packet> p) override;
     /**
-     * \brief Send LTE control message function
+     * @brief Send LTE control message function
      *
-     * \param msg the LTE control message
+     * @param msg the LTE control message
      */
     virtual void DoSendLteControlMessage(Ptr<LteControlMessage> msg);
     /**
-     * \brief Send RACH preamble function
+     * @brief Send RACH preamble function
      *
-     * \param prachId the RACH preamble ID
-     * \param raRnti the rnti
+     * @param prachId the RACH preamble ID
+     * @param raRnti the rnti
      */
     virtual void DoSendRachPreamble(uint32_t prachId, uint32_t raRnti);
     /**
-     * \brief Notify PHY about the successful RRC connection
+     * @brief Notify PHY about the successful RRC connection
      * establishment.
      */
     virtual void DoNotifyConnectionSuccessful();
@@ -669,7 +669,7 @@
     /**
      * SubBand Aperiodic CQI. Activated by DCI format 0 or Random Access Response
      * Grant.
-     * \note Defines a periodicity for academic studies.
+     * @note Defines a periodicity for academic studies.
      */
     Time m_a30CqiPeriodicity;
     Time m_a30CqiLast; ///< last aperiodic CQI
@@ -703,7 +703,7 @@
      */
     TracedCallback<uint16_t, uint16_t, State, State> m_stateTransitionTrace;
 
-    /// \todo Can be removed.
+    /// @todo Can be removed.
     uint8_t m_subframeNo;
 
     bool m_rsReceivedPowerUpdated;   ///< RS receive power updated?
@@ -752,7 +752,7 @@
      * measurements, i.e., the length of layer-1 filtering (default 200 ms).
      */
     Time m_ueMeasurementsFilterPeriod;
-    /// \todo Can be removed.
+    /// @todo Can be removed.
     Time m_ueMeasurementsFilterLast;
 
     Ptr<LteHarqPhy> m_harqPhyModule; ///< HARQ phy module
@@ -844,6 +844,14 @@
 
 }; // end of `class LteUePhy`
 
+/**
+ * @brief Stream insertion operator.
+ * @param [in] os The reference to the output stream.
+ * @param [in] state The LteUePhy::State.
+ * @return The reference to the output stream.
+ */
+std::ostream& operator<<(std::ostream& os, LteUePhy::State state);
+
 } // namespace ns3
 
 #endif /* LTE_UE_PHY_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-ue-phy-sap.h ns-3.44/src/lte/model/lte-ue-phy-sap.h
--- ns-3.43/src/lte/model/lte-ue-phy-sap.h	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/model/lte-ue-phy-sap.h	2025-03-09 16:55:49.603371900 -0700
@@ -9,7 +9,7 @@
 #ifndef LTE_UE_PHY_SAP_H
 #define LTE_UE_PHY_SAP_H
 
-#include <ns3/packet.h>
+#include "ns3/packet.h"
 
 namespace ns3
 {
@@ -28,29 +28,29 @@
     virtual ~LteUePhySapProvider();
 
     /**
-     * \brief Send the MAC PDU to the channel
+     * @brief Send the MAC PDU to the channel
      *
-     * \param p the MAC PDU to send
+     * @param p the MAC PDU to send
      */
     virtual void SendMacPdu(Ptr<Packet> p) = 0;
 
     /**
-     * \brief Send SendLteControlMessage (PDCCH map, CQI feedbacks) using the ideal control channel
+     * @brief Send SendLteControlMessage (PDCCH map, CQI feedbacks) using the ideal control channel
      *
-     * \param msg the Ideal Control Message to send
+     * @param msg the Ideal Control Message to send
      */
     virtual void SendLteControlMessage(Ptr<LteControlMessage> msg) = 0;
 
     /**
-     * \brief Send a preamble on the PRACH
+     * @brief Send a preamble on the PRACH
      *
-     * \param prachId the ID of the preamble
-     * \param raRnti the RA RNTI
+     * @param prachId the ID of the preamble
+     * @param raRnti the RA RNTI
      */
     virtual void SendRachPreamble(uint32_t prachId, uint32_t raRnti) = 0;
 
     /**
-     * \brief Notify PHY about the successful RRC connection
+     * @brief Notify PHY about the successful RRC connection
      * establishment.
      */
     virtual void NotifyConnectionSuccessful() = 0;
@@ -68,27 +68,27 @@
     virtual ~LteUePhySapUser();
 
     /**
-     * \brief Receive Phy Pdu function.
+     * @brief Receive Phy Pdu function.
      *
      * It is called by the Phy to notify the MAC of the reception of a new PHY-PDU
      *
-     * \param p
+     * @param p
      */
     virtual void ReceivePhyPdu(Ptr<Packet> p) = 0;
 
     /**
-     * \brief Trigger the start from a new frame (input from Phy layer)
+     * @brief Trigger the start from a new frame (input from Phy layer)
      *
-     * \param frameNo frame number
-     * \param subframeNo subframe number
+     * @param frameNo frame number
+     * @param subframeNo subframe number
      */
     virtual void SubframeIndication(uint32_t frameNo, uint32_t subframeNo) = 0;
 
     /**
-     * \brief Receive SendLteControlMessage (PDCCH map, CQI feedbacks) using the ideal control
+     * @brief Receive SendLteControlMessage (PDCCH map, CQI feedbacks) using the ideal control
      * channel
      *
-     * \param msg the Ideal Control Message to receive
+     * @param msg the Ideal Control Message to receive
      */
     virtual void ReceiveLteControlMessage(Ptr<LteControlMessage> msg) = 0;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-ue-power-control.cc ns-3.44/src/lte/model/lte-ue-power-control.cc
--- ns-3.43/src/lte/model/lte-ue-power-control.cc	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/model/lte-ue-power-control.cc	2025-03-09 16:55:49.607372000 -0700
@@ -9,11 +9,11 @@
 
 #include "lte-ue-power-control.h"
 
-#include <ns3/boolean.h>
-#include <ns3/double.h>
-#include <ns3/integer.h>
-#include <ns3/log.h>
-#include <ns3/math.h>
+#include "ns3/boolean.h"
+#include "ns3/double.h"
+#include "ns3/integer.h"
+#include "ns3/log.h"
+#include "ns3/math.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-ue-power-control.h ns-3.44/src/lte/model/lte-ue-power-control.h
--- ns-3.43/src/lte/model/lte-ue-power-control.h	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/model/lte-ue-power-control.h	2025-03-09 16:55:49.607372000 -0700
@@ -10,9 +10,9 @@
 #ifndef LTE_UE_POWER_CONTROL_H
 #define LTE_UE_POWER_CONTROL_H
 
-#include <ns3/object.h>
-#include <ns3/ptr.h>
-#include <ns3/traced-callback.h>
+#include "ns3/object.h"
+#include "ns3/ptr.h"
+#include "ns3/traced-callback.h"
 
 #include <vector>
 
@@ -20,7 +20,7 @@
 {
 
 /**
- * \brief This class realizes Uplink Power Control functionality
+ * @brief This class realizes Uplink Power Control functionality
  *
  * When LteUePhy is about sending PUSCH/PUCCH/SRS it should ask
  * LteUePowerControl for current channel TX power level and then
@@ -47,8 +47,8 @@
     ~LteUePowerControl() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     // inherited from Object
@@ -56,82 +56,82 @@
     void DoDispose() override;
 
     /**
-     * \brief Set PC maximum function
+     * @brief Set PC maximum function
      *
-     * \param value the PC maximum value
+     * @param value the PC maximum value
      */
     void SetPcmax(double value);
     /**
-     * \brief Get PC maximum function
+     * @brief Get PC maximum function
      *
-     * \returns the PC maximum value
+     * @returns the PC maximum value
      */
     double GetPcmax();
 
     /**
-     * \brief Set transmit power function
+     * @brief Set transmit power function
      *
-     * \param value the transmit power value
+     * @param value the transmit power value
      */
     void SetTxPower(double value);
     /**
-     * \brief Configure reference signal power (dBm) function
+     * @brief Configure reference signal power (dBm) function
      *
-     * \param referenceSignalPower the reference signal power
+     * @param referenceSignalPower the reference signal power
      */
     void ConfigureReferenceSignalPower(int8_t referenceSignalPower);
 
     /**
-     * \brief Set the cell ID function
+     * @brief Set the cell ID function
      *
-     * \param cellId the cell ID
+     * @param cellId the cell ID
      */
     void SetCellId(uint16_t cellId);
     /**
-     * \brief Set the RNTI function
+     * @brief Set the RNTI function
      *
-     * \param rnti the RNTI
+     * @param rnti the RNTI
      */
     void SetRnti(uint16_t rnti);
 
     /**
-     * \brief Set PO nominal PUSCH function
+     * @brief Set PO nominal PUSCH function
      *
-     * \param value the value to set
+     * @param value the value to set
      */
     void SetPoNominalPusch(int16_t value);
     /**
-     * \brief Set PO UE PUSCH function
+     * @brief Set PO UE PUSCH function
      *
-     * \param value the value to set
+     * @param value the value to set
      */
     void SetPoUePusch(int16_t value);
     /**
-     * \brief Set alpha function
+     * @brief Set alpha function
      *
-     * \param value the alpha value to set
+     * @param value the alpha value to set
      */
     void SetAlpha(double value);
 
     /**
-     * \brief Set RSRP function
+     * @brief Set RSRP function
      *
-     * \param value the RSRP (dBm) value to set
+     * @param value the RSRP (dBm) value to set
      */
     void SetRsrp(double value);
     /**
-     * \brief Set RSRP function
+     * @brief Set RSRP function
      *
-     * \param rsrpFilterCoefficient value. Determines the strength of
+     * @param rsrpFilterCoefficient value. Determines the strength of
      * smoothing effect induced by layer 3 filtering of RSRP
      * used for uplink power control in all attached UE.
      * If equals to 0, no layer 3 filtering is applicable.
      */
     void SetRsrpFilterCoefficient(uint8_t rsrpFilterCoefficient);
     /**
-     * \brief Set RSRP function
+     * @brief Set RSRP function
      *
-     * \param tpc the TPC to report
+     * @param tpc the TPC to report
      */
     void ReportTpc(uint8_t tpc);
 
@@ -143,33 +143,33 @@
     void CalculateSrsTxPower();
 
     /**
-     * \brief Get PUSCH transmit power function
+     * @brief Get PUSCH transmit power function
      *
-     * \param rb the DL RB list
-     * \returns the PUSCH transmit power
+     * @param rb the DL RB list
+     * @returns the PUSCH transmit power
      */
     double GetPuschTxPower(std::vector<int> rb);
     /**
-     * \brief Get PUCCH transmit power function
+     * @brief Get PUCCH transmit power function
      *
-     * \param rb unused
-     * \returns the PUCCH transmit power
+     * @param rb unused
+     * @returns the PUCCH transmit power
      */
     double GetPucchTxPower(std::vector<int> rb);
     /**
-     * \brief Get SRS transmit power function
+     * @brief Get SRS transmit power function
      *
-     * \param rb the DL RB list
-     * \returns the SRS transmit power
+     * @param rb the DL RB list
+     * @returns the SRS transmit power
      */
     double GetSrsTxPower(std::vector<int> rb);
 
     /**
      * TracedCallback signature for uplink transmit power.
      *
-     * \param [in] cellId Cell identifier.
-     * \param [in] rnti The C-RNTI identifying the UE.
-     * \param [in] power The current TX power.
+     * @param [in] cellId Cell identifier.
+     * @param [in] rnti The C-RNTI identifying the UE.
+     * @param [in] power The current TX power.
      */
     typedef void (*TxPowerTracedCallback)(uint16_t cellId, uint16_t rnti, double power);
 
@@ -177,7 +177,7 @@
     /**
      * Set subchannel mask function
      *
-     * \param [in] mask the subchannel mask
+     * @param [in] mask the subchannel mask
      */
     void SetSubChannelMask(std::vector<int> mask);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-ue-rrc.cc ns-3.44/src/lte/model/lte-ue-rrc.cc
--- ns-3.43/src/lte/model/lte-ue-rrc.cc	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/model/lte-ue-rrc.cc	2025-03-09 16:55:49.607372000 -0700
@@ -22,11 +22,11 @@
 #include "lte-rlc-um.h"
 #include "lte-rlc.h"
 
-#include <ns3/fatal-error.h>
-#include <ns3/log.h>
-#include <ns3/object-factory.h>
-#include <ns3/object-map.h>
-#include <ns3/simulator.h>
+#include "ns3/fatal-error.h"
+#include "ns3/log.h"
+#include "ns3/object-factory.h"
+#include "ns3/object-map.h"
+#include "ns3/simulator.h"
 
 #include <cmath>
 
@@ -47,7 +47,7 @@
     /**
      * Constructor
      *
-     * \param rrc the RRC class
+     * @param rrc the RRC class
      */
     UeMemberLteUeCmacSapUser(LteUeRrc* rrc);
 
@@ -82,23 +82,6 @@
     m_rrc->DoNotifyRandomAccessFailed();
 }
 
-/// Map each of UE RRC states to its string representation.
-static const std::string g_ueRrcStateName[LteUeRrc::NUM_STATES] = {
-    "IDLE_START",
-    "IDLE_CELL_SEARCH",
-    "IDLE_WAIT_MIB_SIB1",
-    "IDLE_WAIT_MIB",
-    "IDLE_WAIT_SIB1",
-    "IDLE_CAMPED_NORMALLY",
-    "IDLE_WAIT_SIB2",
-    "IDLE_RANDOM_ACCESS",
-    "IDLE_CONNECTING",
-    "CONNECTED_NORMALLY",
-    "CONNECTED_HANDOVER",
-    "CONNECTED_PHY_PROBLEM",
-    "CONNECTED_REESTABLISHING",
-};
-
 /////////////////////////////
 // ue RRC methods
 /////////////////////////////
@@ -625,7 +608,7 @@
         break;
 
     default: // i.e. IDLE_RANDOM_ACCESS
-        NS_FATAL_ERROR("method unexpected in state " << ToString(m_state));
+        NS_FATAL_ERROR("method unexpected in state " << m_state);
         break;
     }
 }
@@ -649,7 +632,7 @@
 void
 LteUeRrc::DoNotifyRandomAccessSuccessful()
 {
-    NS_LOG_FUNCTION(this << m_imsi << ToString(m_state));
+    NS_LOG_FUNCTION(this << m_imsi << m_state);
     m_randomAccessSuccessfulTrace(m_imsi, m_cellId, m_rnti);
 
     switch (m_state)
@@ -685,7 +668,7 @@
     break;
 
     default:
-        NS_FATAL_ERROR("unexpected event in state " << ToString(m_state));
+        NS_FATAL_ERROR("unexpected event in state " << m_state);
         break;
     }
 }
@@ -693,7 +676,7 @@
 void
 LteUeRrc::DoNotifyRandomAccessFailed()
 {
-    NS_LOG_FUNCTION(this << m_imsi << ToString(m_state));
+    NS_LOG_FUNCTION(this << m_imsi << m_state);
     m_randomAccessErrorTrace(m_imsi, m_cellId, m_rnti);
 
     switch (m_state)
@@ -707,7 +690,7 @@
     case CONNECTED_HANDOVER: {
         m_handoverEndErrorTrace(m_imsi, m_cellId, m_rnti);
         /**
-         * \todo After a handover failure because of a random access failure,
+         * @todo After a handover failure because of a random access failure,
          *       send an RRC Connection Re-establishment and switch to
          *       CONNECTED_REESTABLISHING state.
          */
@@ -725,7 +708,7 @@
     break;
 
     default:
-        NS_FATAL_ERROR("unexpected event in state " << ToString(m_state));
+        NS_FATAL_ERROR("unexpected event in state " << m_state);
         break;
     }
 }
@@ -741,8 +724,7 @@
 LteUeRrc::DoStartCellSelection(uint32_t dlEarfcn)
 {
     NS_LOG_FUNCTION(this << m_imsi << dlEarfcn);
-    NS_ASSERT_MSG(m_state == IDLE_START,
-                  "cannot start cell selection from state " << ToString(m_state));
+    NS_ASSERT_MSG(m_state == IDLE_START, "cannot start cell selection from state " << m_state);
     m_dlEarfcn = dlEarfcn;
     m_cphySapProvider.at(0)->StartCellSearch(dlEarfcn);
     SwitchToState(IDLE_CELL_SEARCH);
@@ -765,7 +747,7 @@
     case IDLE_CELL_SEARCH:
     case IDLE_WAIT_MIB_SIB1:
     case IDLE_WAIT_SIB1:
-        NS_FATAL_ERROR("cannot abort cell selection " << ToString(m_state));
+        NS_FATAL_ERROR("cannot abort cell selection " << m_state);
         break;
 
     case IDLE_WAIT_MIB:
@@ -787,7 +769,7 @@
         break;
 
     default:
-        NS_FATAL_ERROR("unexpected event in state " << ToString(m_state));
+        NS_FATAL_ERROR("unexpected event in state " << m_state);
         break;
     }
 }
@@ -825,7 +807,7 @@
         break;
 
     default:
-        NS_FATAL_ERROR("unexpected event in state " << ToString(m_state));
+        NS_FATAL_ERROR("unexpected event in state " << m_state);
         break;
     }
 }
@@ -1032,7 +1014,7 @@
     break;
 
     default:
-        NS_FATAL_ERROR("method unexpected in state " << ToString(m_state));
+        NS_FATAL_ERROR("method unexpected in state " << m_state);
         break;
     }
 }
@@ -1136,7 +1118,7 @@
         break;
 
     default:
-        NS_FATAL_ERROR("method unexpected in state " << ToString(m_state));
+        NS_FATAL_ERROR("method unexpected in state " << m_state);
         break;
     }
 }
@@ -1149,7 +1131,7 @@
     {
     case CONNECTED_REESTABLISHING: {
         /**
-         * \todo After receiving RRC Connection Re-establishment, stop timer
+         * @todo After receiving RRC Connection Re-establishment, stop timer
          *       T301, fire a new trace source, reply with RRC Connection
          *       Re-establishment Complete, and finally switch to
          *       CONNECTED_NORMALLY state. See Section 5.3.7.5 of 3GPP TS
@@ -1159,7 +1141,7 @@
     break;
 
     default:
-        NS_FATAL_ERROR("method unexpected in state " << ToString(m_state));
+        NS_FATAL_ERROR("method unexpected in state " << m_state);
         break;
     }
 }
@@ -1173,7 +1155,7 @@
     {
     case CONNECTED_REESTABLISHING: {
         /**
-         * \todo After receiving RRC Connection Re-establishment Reject, stop
+         * @todo After receiving RRC Connection Re-establishment Reject, stop
          *       timer T301. See Section 5.3.7.8 of 3GPP TS 36.331.
          */
         m_asSapUser->NotifyConnectionReleased(); // Inform upper layers
@@ -1181,7 +1163,7 @@
     break;
 
     default:
-        NS_FATAL_ERROR("method unexpected in state " << ToString(m_state));
+        NS_FATAL_ERROR("method unexpected in state " << m_state);
         break;
     }
 }
@@ -1190,7 +1172,7 @@
 LteUeRrc::DoRecvRrcConnectionRelease(LteRrcSap::RrcConnectionRelease msg)
 {
     NS_LOG_FUNCTION(this << " RNTI " << m_rnti);
-    /// \todo Currently not implemented, see Section 5.3.8 of 3GPP TS 36.331.
+    /// @todo Currently not implemented, see Section 5.3.8 of 3GPP TS 36.331.
 
     m_lastRrcTransactionIdentifier = msg.rrcTransactionIdentifier;
     // release resources at UE
@@ -1318,7 +1300,7 @@
         // and start random access.
         if (!m_connectionPending)
         {
-            NS_LOG_DEBUG("Calling DoConnect in state = " << ToString(m_state));
+            NS_LOG_DEBUG("Calling DoConnect in state = " << m_state);
             DoConnect();
         }
         SwitchToState(IDLE_CAMPED_NORMALLY);
@@ -1428,7 +1410,7 @@
         {
             // SRB1 not setup yet
             NS_ASSERT_MSG((m_state == IDLE_CONNECTING) || (m_state == CONNECTED_HANDOVER),
-                          "unexpected state " << ToString(m_state));
+                          "unexpected state " << m_state);
             NS_ASSERT_MSG(stamIt->srbIdentity == 1, "only SRB1 supported");
 
             const uint8_t lcid = 1; // fixed LCID for SRB1
@@ -1593,7 +1575,7 @@
         {
             NS_LOG_INFO("request to modify existing DRBID");
             Ptr<LteDataRadioBearerInfo> drbInfo = drbMapIt->second;
-            /// \todo currently not implemented. Would need to modify drbInfo, and then propagate
+            /// @todo currently not implemented. Would need to modify drbInfo, and then propagate
             /// changes to the MAC
         }
     }
@@ -1888,9 +1870,9 @@
         storedMeasIt = ret.first;
     }
 
-    NS_LOG_DEBUG(this << " IMSI " << m_imsi << " state " << ToString(m_state) << ", measured cell "
-                      << cellId << ", carrier component Id " << componentCarrierId << ", new RSRP "
-                      << rsrp << " stored " << storedMeasIt->second.rsrp << ", new RSRQ " << rsrq
+    NS_LOG_DEBUG(this << " IMSI " << m_imsi << " state " << m_state << ", measured cell " << cellId
+                      << ", carrier component Id " << componentCarrierId << ", new RSRP " << rsrp
+                      << " stored " << storedMeasIt->second.rsrp << ", new RSRQ " << rsrq
                       << " stored " << storedMeasIt->second.rsrq);
 
 } // end of void SaveUeMeasurements
@@ -2696,13 +2678,7 @@
     {
         NS_ASSERT(it2->measId == measId);
 
-        for (auto it3 = it2->concernedCells.begin(); it3 != it2->concernedCells.end(); ++it3)
-        {
-            if (*it3 == cellId)
-            {
-                it3 = it2->concernedCells.erase(it3);
-            }
-        }
+        it2->concernedCells.remove_if([cellId](auto cell) { return cellId == cell; });
 
         if (it2->concernedCells.empty())
         {
@@ -2753,13 +2729,7 @@
     {
         NS_ASSERT(it2->measId == measId);
 
-        for (auto it3 = it2->concernedCells.begin(); it3 != it2->concernedCells.end(); ++it3)
-        {
-            if (*it3 == cellId)
-            {
-                it3 = it2->concernedCells.erase(it3);
-            }
-        }
+        it2->concernedCells.remove_if([cellId](auto cell) { return cellId == cell; });
 
         if (it2->concernedCells.empty())
         {
@@ -3214,11 +3184,11 @@
 void
 LteUeRrc::SwitchToState(State newState)
 {
-    NS_LOG_FUNCTION(this << ToString(newState));
+    NS_LOG_FUNCTION(this << newState);
     State oldState = m_state;
     m_state = newState;
-    NS_LOG_INFO(this << " IMSI " << m_imsi << " RNTI " << m_rnti << " UeRrc " << ToString(oldState)
-                     << " --> " << ToString(newState));
+    NS_LOG_INFO(this << " IMSI " << m_imsi << " RNTI " << m_rnti << " UeRrc " << oldState << " --> "
+                     << newState);
     m_stateTransitionTrace(m_imsi, m_cellId, m_rnti, oldState, newState);
 
     switch (newState)
@@ -3332,7 +3302,46 @@
 const std::string
 LteUeRrc::ToString(LteUeRrc::State s)
 {
-    return g_ueRrcStateName[s];
+    std::ostringstream ss;
+    ss << s;
+    return ss.str();
+}
+
+std::ostream&
+operator<<(std::ostream& os, LteUeRrc::State state)
+{
+    switch (state)
+    {
+    case LteUeRrc::State::IDLE_START:
+        return os << "IDLE_START";
+    case LteUeRrc::State::IDLE_CELL_SEARCH:
+        return os << "IDLE_CELL_SEARCH";
+    case LteUeRrc::State::IDLE_WAIT_MIB_SIB1:
+        return os << "IDLE_WAIT_MIB_SIB1";
+    case LteUeRrc::State::IDLE_WAIT_MIB:
+        return os << "IDLE_WAIT_MIB";
+    case LteUeRrc::State::IDLE_WAIT_SIB1:
+        return os << "IDLE_WAIT_SIB1";
+    case LteUeRrc::State::IDLE_CAMPED_NORMALLY:
+        return os << "IDLE_CAMPED_NORMALLY";
+    case LteUeRrc::State::IDLE_WAIT_SIB2:
+        return os << "IDLE_WAIT_SIB2";
+    case LteUeRrc::State::IDLE_RANDOM_ACCESS:
+        return os << "IDLE_RANDOM_ACCESS";
+    case LteUeRrc::State::IDLE_CONNECTING:
+        return os << "IDLE_CONNECTING";
+    case LteUeRrc::State::CONNECTED_NORMALLY:
+        return os << "CONNECTED_NORMALLY";
+    case LteUeRrc::State::CONNECTED_HANDOVER:
+        return os << "CONNECTED_HANDOVER";
+    case LteUeRrc::State::CONNECTED_PHY_PROBLEM:
+        return os << "CONNECTED_PHY_PROBLEM";
+    case LteUeRrc::State::CONNECTED_REESTABLISHING:
+        return os << "CONNECTED_REESTABLISHING";
+    case LteUeRrc::State::NUM_STATES:
+        return os << "NUM_STATES";
+    };
+    return os << "UNKNOWN(" << static_cast<uint32_t>(state) << ")";
 }
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-ue-rrc.h ns-3.44/src/lte/model/lte-ue-rrc.h
--- ns-3.43/src/lte/model/lte-ue-rrc.h	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/model/lte-ue-rrc.h	2025-03-09 16:55:49.607372000 -0700
@@ -22,9 +22,11 @@
 #include "lte-ue-cmac-sap.h"
 #include "lte-ue-cphy-sap.h"
 
-#include <ns3/object.h>
-#include <ns3/packet.h>
-#include <ns3/traced-callback.h>
+#include "ns3/deprecated.h"
+#include "ns3/lte-export.h"
+#include "ns3/object.h"
+#include "ns3/packet.h"
+#include "ns3/traced-callback.h"
 
 #include <map>
 #include <set>
@@ -34,7 +36,7 @@
 {
 
 /**
- * \brief Artificial delay of UE measurements procedure.
+ * @brief Artificial delay of UE measurements procedure.
  *
  * i.e. the period between the time layer-1-filtered measurements from PHY
  * layer is received and the earliest time the actual measurement report
@@ -49,7 +51,7 @@
  *  - time-to-trigger check is always performed before the reporting, so there
  *    would still be chance for it to cancel the reporting if necessary.
  */
-extern const Time UE_MEASUREMENT_REPORT_DELAY;
+LTE_EXPORT extern const Time UE_MEASUREMENT_REPORT_DELAY;
 
 class LteRlc;
 class LteMacSapProvider;
@@ -120,8 +122,8 @@
 
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -131,67 +133,67 @@
     /**
      * set the CPHY SAP this RRC should use to interact with the PHY
      *
-     * \param s the CPHY SAP Provider
+     * @param s the CPHY SAP Provider
      */
     void SetLteUeCphySapProvider(LteUeCphySapProvider* s);
     /**
      * set the CPHY SAP this RRC should use to interact with the PHY
      *
-     * \param s the CPHY SAP Provider
-     * \param index the index
+     * @param s the CPHY SAP Provider
+     * @param index the index
      */
     void SetLteUeCphySapProvider(LteUeCphySapProvider* s, uint8_t index);
 
     /**
      *
      *
-     * \return s the CPHY SAP User interface offered to the PHY by this RRC
+     * @return s the CPHY SAP User interface offered to the PHY by this RRC
      */
     LteUeCphySapUser* GetLteUeCphySapUser();
     /**
      *
-     * \param index the index
-     * \return s the CPHY SAP User interface offered to the PHY by this RRC
+     * @param index the index
+     * @return s the CPHY SAP User interface offered to the PHY by this RRC
      */
     LteUeCphySapUser* GetLteUeCphySapUser(uint8_t index);
 
     /**
      * set the CMAC SAP this RRC should interact with
-     * \brief This function is overloaded to maintain backward compatibility
-     * \param s the CMAC SAP Provider to be used by this RRC
+     * @brief This function is overloaded to maintain backward compatibility
+     * @param s the CMAC SAP Provider to be used by this RRC
      */
     void SetLteUeCmacSapProvider(LteUeCmacSapProvider* s);
     /**
      * set the CMAC SAP this RRC should interact with
-     * \brief This function is overloaded to maintain backward compatibility
-     * \param s the CMAC SAP Provider to be used by this RRC
-     * \param index the index
+     * @brief This function is overloaded to maintain backward compatibility
+     * @param s the CMAC SAP Provider to be used by this RRC
+     * @param index the index
      */
     void SetLteUeCmacSapProvider(LteUeCmacSapProvider* s, uint8_t index);
 
     /**
-     * \brief This function is overloaded to maintain backward compatibility
-     * \return s the CMAC SAP User interface offered to the MAC by this RRC
+     * @brief This function is overloaded to maintain backward compatibility
+     * @return s the CMAC SAP User interface offered to the MAC by this RRC
      */
     LteUeCmacSapUser* GetLteUeCmacSapUser();
     /**
-     * \brief This function is overloaded to maintain backward compatibility
-     * \param index the index
-     * \return s the CMAC SAP User interface offered to the MAC by this RRC
+     * @brief This function is overloaded to maintain backward compatibility
+     * @param index the index
+     * @return s the CMAC SAP User interface offered to the MAC by this RRC
      */
     LteUeCmacSapUser* GetLteUeCmacSapUser(uint8_t index);
 
     /**
      * set the RRC SAP this RRC should interact with
      *
-     * \param s the RRC SAP User to be used by this RRC
+     * @param s the RRC SAP User to be used by this RRC
      */
     void SetLteUeRrcSapUser(LteUeRrcSapUser* s);
 
     /**
      *
      *
-     * \return s the RRC SAP Provider interface offered to the MAC by this RRC
+     * @return s the RRC SAP Provider interface offered to the MAC by this RRC
      */
     LteUeRrcSapProvider* GetLteUeRrcSapProvider();
 
@@ -199,7 +201,7 @@
      * set the MAC SAP provider. The ue RRC does not use this
      * directly, but it needs to provide it to newly created RLC instances.
      *
-     * \param s the MAC SAP provider that will be used by all
+     * @param s the MAC SAP provider that will be used by all
      * newly created RLC instances
      */
     void SetLteMacSapProvider(LteMacSapProvider* s);
@@ -207,128 +209,129 @@
     /**
      * Set the AS SAP user to interact with the NAS entity
      *
-     * \param s the AS SAP user
+     * @param s the AS SAP user
      */
     void SetAsSapUser(LteAsSapUser* s);
 
     /**
      *
      *
-     * \return the AS SAP provider exported by this RRC
+     * @return the AS SAP provider exported by this RRC
      */
     LteAsSapProvider* GetAsSapProvider();
 
     /**
      * set the Component Carrier Management SAP this RRC should interact with
      *
-     * \param s the Component Carrier Management SAP Provider to be used by this RRC
+     * @param s the Component Carrier Management SAP Provider to be used by this RRC
      */
     void SetLteCcmRrcSapProvider(LteUeCcmRrcSapProvider* s);
 
     /**
      * Get the Component Carrier Management SAP offered by this RRC
-     * \return s the Component Carrier Management SAP User interface offered to the
+     * @return s the Component Carrier Management SAP User interface offered to the
      *           carrier component selection algorithm by this RRC
      */
     LteUeCcmRrcSapUser* GetLteCcmRrcSapUser();
 
     /**
      *
-     * \param imsi the unique UE identifier
+     * @param imsi the unique UE identifier
      */
     void SetImsi(uint64_t imsi);
 
     /**
-     * \brief Store the previous cell id
+     * @brief Store the previous cell id
      *
-     * \param cellId The cell id of the previous cell the UE was attached to
+     * @param cellId The cell id of the previous cell the UE was attached to
      */
     void StorePreviousCellId(uint16_t cellId);
 
     /**
      *
-     * \return imsi the unique UE identifier
+     * @return imsi the unique UE identifier
      */
     uint64_t GetImsi() const;
 
     /**
      *
-     * \return the C-RNTI of the user
+     * @return the C-RNTI of the user
      */
     uint16_t GetRnti() const;
 
     /**
      *
-     * \return the CellId of the attached Enb
+     * @return the CellId of the attached Enb
      */
     uint16_t GetCellId() const;
 
     /**
-     * \param cellId cell identifier
-     * \return true if cellId is the serving cell for this UE
+     * @param cellId cell identifier
+     * @return true if cellId is the serving cell for this UE
      */
     bool IsServingCell(uint16_t cellId) const;
 
     /**
-     * \return the uplink bandwidth in RBs
+     * @return the uplink bandwidth in RBs
      */
     uint8_t GetUlBandwidth() const;
 
     /**
-     * \return the downlink bandwidth in RBs
+     * @return the downlink bandwidth in RBs
      */
     uint8_t GetDlBandwidth() const;
 
     /**
-     * \return the downlink carrier frequency (EARFCN)
+     * @return the downlink carrier frequency (EARFCN)
      */
     uint32_t GetDlEarfcn() const;
 
     /**
-     * \return the uplink carrier frequency (EARFCN)
+     * @return the uplink carrier frequency (EARFCN)
      */
     uint32_t GetUlEarfcn() const;
 
     /**
      *
-     * \return the current state
+     * @return the current state
      */
     State GetState() const;
 
     /**
-     * \brief Get the previous cell id
+     * @brief Get the previous cell id
      *
-     * \return The cell Id of the previous cell the UE was attached to.
+     * @return The cell Id of the previous cell the UE was attached to.
      */
     uint16_t GetPreviousCellId() const;
 
     /**
      *
      *
-     * \param val true if RLC SM is to be used, false if RLC UM/AM are to be used
+     * @param val true if RLC SM is to be used, false if RLC UM/AM are to be used
      */
     void SetUseRlcSm(bool val);
 
     /**
-     * \param s The UE RRC state.
-     * \return The string representation of the given state.
+     * @param s The UE RRC state.
+     * @return The string representation of the given state.
      */
+    NS_DEPRECATED_3_44("Use operator<< instead")
     static const std::string ToString(LteUeRrc::State s);
 
     /**
      * TracedCallback signature for imsi, cellId and rnti events.
      *
-     * \param [in] imsi
-     * \param [in] cellId
+     * @param [in] imsi
+     * @param [in] cellId
      */
     typedef void (*CellSelectionTracedCallback)(uint64_t imsi, uint16_t cellId);
 
     /**
      * TracedCallback signature for imsi, cellId and rnti events.
      *
-     * \param [in] imsi
-     * \param [in] cellId
-     * \param [in] rnti
+     * @param [in] imsi
+     * @param [in] cellId
+     * @param [in] rnti
      */
     typedef void (*ImsiCidRntiTracedCallback)(uint64_t imsi, uint16_t cellId, uint16_t rnti);
 
@@ -336,10 +339,10 @@
      * TracedCallback signature for MIBReceived, Sib1Received and
      * HandoverStart events.
      *
-     * \param [in] imsi
-     * \param [in] cellId
-     * \param [in] rnti
-     * \param [in] otherCid
+     * @param [in] imsi
+     * @param [in] cellId
+     * @param [in] rnti
+     * @param [in] otherCid
      */
     typedef void (*MibSibHandoverTracedCallback)(uint64_t imsi,
                                                  uint16_t cellId,
@@ -349,11 +352,11 @@
     /**
      * TracedCallback signature for state transition events.
      *
-     * \param [in] imsi
-     * \param [in] cellId
-     * \param [in] rnti
-     * \param [in] oldState
-     * \param [in] newState
+     * @param [in] imsi
+     * @param [in] cellId
+     * @param [in] rnti
+     * @param [in] oldState
+     * @param [in] newState
      */
     typedef void (*StateTracedCallback)(uint64_t imsi,
                                         uint16_t cellId,
@@ -364,8 +367,8 @@
     /**
      * TracedCallback signature for secondary carrier configuration events.
      *
-     * \param [in] Pointer to UE RRC
-     * \param [in] List of LteRrcSap::SCellToAddMod
+     * @param [in] Pointer to UE RRC
+     * @param [in] List of LteRrcSap::SCellToAddMod
      */
     typedef void (*SCarrierConfiguredTracedCallback)(Ptr<LteUeRrc>,
                                                      std::list<LteRrcSap::SCellToAddMod>);
@@ -374,11 +377,11 @@
      * TracedCallback signature for in-sync and out-of-sync detection events.
      *
      *
-     * \param [in] imsi
-     * \param [in] rnti
-     * \param [in] cellId
-     * \param [in] type
-     * \param [in] count
+     * @param [in] imsi
+     * @param [in] rnti
+     * @param [in] cellId
+     * @param [in] type
+     * @param [in] count
      */
     typedef void (*PhySyncDetectionTracedCallback)(uint64_t imsi,
                                                    uint16_t rnti,
@@ -390,10 +393,10 @@
      * TracedCallback signature for imsi, cellId, rnti and counter for
      * random access events.
      *
-     * \param [in] imsi
-     * \param [in] cellId
-     * \param [in] rnti
-     * \param [in] count
+     * @param [in] imsi
+     * @param [in] cellId
+     * @param [in] rnti
+     * @param [in] count
      */
     typedef void (*ImsiCidRntiCountTracedCallback)(uint64_t imsi,
                                                    uint16_t cellId,
@@ -405,7 +408,7 @@
     /**
      * Receive PDCP SDU function
      *
-     * \param params LtePdcpSapUser::ReceivePdcpSduParameters
+     * @param params LtePdcpSapUser::ReceivePdcpSduParameters
      */
     void DoReceivePdcpSdu(LtePdcpSapUser::ReceivePdcpSduParameters params);
 
@@ -413,7 +416,7 @@
     /**
      * Set temporary cell rnti function
      *
-     * \param rnti RNTI
+     * @param rnti RNTI
      */
     void DoSetTemporaryCellRnti(uint16_t rnti);
     /// Notify random access successful function
@@ -425,20 +428,20 @@
     /**
      * Set CSG white list function
      *
-     * \param csgId CSG ID
+     * @param csgId CSG ID
      */
     void DoSetCsgWhiteList(uint32_t csgId);
     /**
      * Force camped on ENB function
      *
-     * \param cellId the cell ID
-     * \param dlEarfcn the DL EARFCN
+     * @param cellId the cell ID
+     * @param dlEarfcn the DL EARFCN
      */
     void DoForceCampedOnEnb(uint16_t cellId, uint32_t dlEarfcn);
     /**
      * Start cell selection function
      *
-     * \param dlEarfcn the DL EARFCN
+     * @param dlEarfcn the DL EARFCN
      */
     void DoStartCellSelection(uint32_t dlEarfcn);
     /// Connect function
@@ -446,8 +449,8 @@
     /**
      * Send data function
      *
-     * \param packet the packet
-     * \param bid the BID
+     * @param packet the packet
+     * @param bid the BID
      */
     void DoSendData(Ptr<Packet> packet, uint8_t bid);
     /// Disconnect function
@@ -457,22 +460,22 @@
     /**
      * Receive master information block function
      *
-     * \param cellId the cell ID
-     * \param msg LteRrcSap::MasterInformationBlock
+     * @param cellId the cell ID
+     * @param msg LteRrcSap::MasterInformationBlock
      */
     void DoRecvMasterInformationBlock(uint16_t cellId, LteRrcSap::MasterInformationBlock msg);
     /**
      * Receive system information block type 1 function
      *
-     * \param cellId the cell ID
-     * \param msg LteRrcSap::SystemInformationBlockType1
+     * @param cellId the cell ID
+     * @param msg LteRrcSap::SystemInformationBlockType1
      */
     void DoRecvSystemInformationBlockType1(uint16_t cellId,
                                            LteRrcSap::SystemInformationBlockType1 msg);
     /**
      * Report UE measurements function
      *
-     * \param params LteUeCphySapUser::UeMeasurementsParameters
+     * @param params LteUeCphySapUser::UeMeasurementsParameters
      */
     void DoReportUeMeasurements(LteUeCphySapUser::UeMeasurementsParameters params);
 
@@ -480,73 +483,73 @@
 
     /**
      * Part of the RRC protocol. Implement the LteUeRrcSapProvider::CompleteSetup interface.
-     * \param params the LteUeRrcSapProvider::CompleteSetupParameters
+     * @param params the LteUeRrcSapProvider::CompleteSetupParameters
      */
     void DoCompleteSetup(LteUeRrcSapProvider::CompleteSetupParameters params);
     /**
      * Part of the RRC protocol. Implement the LteUeRrcSapProvider::RecvSystemInformation interface.
-     * \param msg the LteRrcSap::SystemInformation
+     * @param msg the LteRrcSap::SystemInformation
      */
     void DoRecvSystemInformation(LteRrcSap::SystemInformation msg);
     /**
      * Part of the RRC protocol. Implement the LteUeRrcSapProvider::RecvRrcConnectionSetup
      * interface.
-     * \param msg the LteRrcSap::RrcConnectionSetup
+     * @param msg the LteRrcSap::RrcConnectionSetup
      */
     void DoRecvRrcConnectionSetup(LteRrcSap::RrcConnectionSetup msg);
     /**
      * Part of the RRC protocol. Implement the LteUeRrcSapProvider::RecvRrcConnectionReconfiguration
      * interface.
-     * \param msg the LteRrcSap::RrcConnectionReconfiguration
+     * @param msg the LteRrcSap::RrcConnectionReconfiguration
      */
     void DoRecvRrcConnectionReconfiguration(LteRrcSap::RrcConnectionReconfiguration msg);
     /**
      * Part of the RRC protocol. Implement the LteUeRrcSapProvider::RecvRrcConnectionReestablishment
      * interface.
-     * \param msg LteRrcSap::RrcConnectionReestablishment
+     * @param msg LteRrcSap::RrcConnectionReestablishment
      */
     void DoRecvRrcConnectionReestablishment(LteRrcSap::RrcConnectionReestablishment msg);
     /**
      * Part of the RRC protocol. Implement the
      * LteUeRrcSapProvider::RecvRrcConnectionReestablishmentReject interface.
-     * \param msg LteRrcSap::RrcConnectionReestablishmentReject
+     * @param msg LteRrcSap::RrcConnectionReestablishmentReject
      */
     void DoRecvRrcConnectionReestablishmentReject(
         LteRrcSap::RrcConnectionReestablishmentReject msg);
     /**
      * Part of the RRC protocol. Implement the LteUeRrcSapProvider::RecvRrcConnectionRelease
      * interface.
-     * \param msg LteRrcSap::RrcConnectionRelease
+     * @param msg LteRrcSap::RrcConnectionRelease
      */
     void DoRecvRrcConnectionRelease(LteRrcSap::RrcConnectionRelease msg);
     /**
      * Part of the RRC protocol. Implement the LteUeRrcSapProvider::RecvRrcConnectionReject
      * interface.
-     * \param msg the LteRrcSap::RrcConnectionReject
+     * @param msg the LteRrcSap::RrcConnectionReject
      */
     void DoRecvRrcConnectionReject(LteRrcSap::RrcConnectionReject msg);
 
     /**
      * RRC CCM SAP USER Method
-     * \param noOfComponentCarriers the number of component carriers
+     * @param noOfComponentCarriers the number of component carriers
      */
     void DoSetNumberOfComponentCarriers(uint16_t noOfComponentCarriers);
 
     // INTERNAL METHODS
 
     /**
-     * \brief Go through the list of measurement results, choose the one with the
+     * @brief Go through the list of measurement results, choose the one with the
      *        strongest RSRP, and tell PHY to synchronize to it.
      *
-     * \warning This function is a part of the *initial cell selection* procedure,
+     * @warning This function is a part of the *initial cell selection* procedure,
      *          hence must be only executed during IDLE mode.
      */
     void SynchronizeToStrongestCell();
 
     /**
-     * \brief Performs cell selection evaluation to the current serving cell.
+     * @brief Performs cell selection evaluation to the current serving cell.
      *
-     * \warning This function is a part of the *initial cell selection* procedure,
+     * @warning This function is a part of the *initial cell selection* procedure,
      *          hence must be only executed during IDLE mode and specifically
      *          during the state when the UE just received the first SIB1 message
      *          from the serving cell.
@@ -563,8 +566,8 @@
     void EvaluateCellForSelection();
 
     /**
-     * \brief Update the current measurement configuration #m_varMeasConfig.
-     * \param mc measurements to be performed by the UE
+     * @brief Update the current measurement configuration #m_varMeasConfig.
+     * @param mc measurements to be performed by the UE
      *
      * Implements Section 5.5.2 "Measurement configuration" of 3GPP TS 36.331.
      * The supported subfunctions are:
@@ -600,7 +603,7 @@
      * - s-Measure
      * - Speed-dependent scaling
      *
-     * \warning There is a possibility that the input argument (of type
+     * @warning There is a possibility that the input argument (of type
      *          LteRrcSap::MeasConfig) may contain information in fields related
      *          to the unsupported features. In such case, the function will raise
      *          an error.
@@ -618,14 +621,14 @@
     void ApplyMeasConfig(LteRrcSap::MeasConfig mc);
 
     /**
-     * \brief Keep the given measurement result as the latest measurement figures,
+     * @brief Keep the given measurement result as the latest measurement figures,
      *        to be utilised by UE RRC functions.
-     * \param cellId the cell ID of the measured cell
-     * \param rsrp measured RSRP value to be saved (in dBm)
-     * \param rsrq measured RSRQ value to be saved (in dB)
-     * \param useLayer3Filtering
-     * \param componentCarrierId
-     * \todo Remove the useLayer3Filtering argument
+     * @param cellId the cell ID of the measured cell
+     * @param rsrp measured RSRP value to be saved (in dBm)
+     * @param rsrq measured RSRQ value to be saved (in dB)
+     * @param useLayer3Filtering
+     * @param componentCarrierId
+     * @todo Remove the useLayer3Filtering argument
      *
      * Implements Section 5.5.3.2 "Layer 3 filtering" of 3GPP TS 36.331. *Layer-3
      * filtering* is applied to the given measurement results before saved to
@@ -647,9 +650,9 @@
                             uint8_t componentCarrierId);
 
     /**
-     * \brief Evaluate the reporting criteria of a measurement identity and
+     * @brief Evaluate the reporting criteria of a measurement identity and
      *        invoke some reporting actions based on the result.
-     * \param measId the measurement identity to be evaluated
+     * @param measId the measurement identity to be evaluated
      *
      * Implements Section 5.5.4.1 "Measurement report triggering - General" of
      * 3GPP TS 36.331. This function take into use the latest measurement results
@@ -673,10 +676,10 @@
     void MeasurementReportTriggering(uint8_t measId);
 
     /**
-     * \brief Produce a proper measurement report from the given measurement
+     * @brief Produce a proper measurement report from the given measurement
      *        identity's reporting entry in #m_varMeasReportList and then submit
      *        it to the serving eNodeB.
-     * \param measId the measurement identity which report is to be submitted.
+     * @param measId the measurement identity which report is to be submitted.
      *
      * Implements Section 5.5.5 "Measurement reporting" of 3GPP TS 36.331.
      * Producing a *measurement report* involves several tasks such as:
@@ -707,19 +710,19 @@
 
     /**
      * Apply radio resource config dedicated.
-     * \param rrcd LteRrcSap::RadioResourceConfigDedicated
+     * @param rrcd LteRrcSap::RadioResourceConfigDedicated
      */
     void ApplyRadioResourceConfigDedicated(LteRrcSap::RadioResourceConfigDedicated rrcd);
     /**
      * Apply radio resource config dedicated secondary carrier.
-     * \param nonCec LteRrcSap::NonCriticalExtensionConfiguration
+     * @param nonCec LteRrcSap::NonCriticalExtensionConfiguration
      */
     void ApplyRadioResourceConfigDedicatedSecondaryCarrier(
         LteRrcSap::NonCriticalExtensionConfiguration nonCec);
     /// Start connection function
     void StartConnection();
     /**
-     * \brief Leave connected mode method
+     * @brief Leave connected mode method
      * Resets the UE back to an appropriate state depending
      * on the nature of cause. For example, the UE is move
      * to the IDLE_START state upon radio link failure. At
@@ -733,13 +736,13 @@
     void DisposeOldSrb1();
     /**
      * Bid 2 DR bid.
-     * \param bid the BID
-     * \returns the DR bid
+     * @param bid the BID
+     * @returns the DR bid
      */
     uint8_t Bid2Drbid(uint8_t bid);
     /**
      * Switch the UE RRC to the given state.
-     * \param s the destination state
+     * @param s the destination state
      */
     void SwitchToState(State s);
 
@@ -940,7 +943,7 @@
     // INTERNAL DATA STRUCTURE RELATED TO UE MEASUREMENTS
 
     /**
-     * \brief Includes the accumulated configuration of the measurements to be
+     * @brief Includes the accumulated configuration of the measurements to be
      *        performed by the UE.
      *
      * Based on 3GPP TS 36.331 section 7.1. Also note that some optional variables
@@ -957,7 +960,7 @@
     };
 
     /**
-     * \brief Includes the accumulated configuration of the measurements to be
+     * @brief Includes the accumulated configuration of the measurements to be
      *        performed by the UE.
      *
      * Based on 3GPP TS 36.331 section 7.1.
@@ -965,7 +968,7 @@
     VarMeasConfig m_varMeasConfig;
 
     /**
-     * \brief Represents a single measurement reporting entry., which includes
+     * @brief Represents a single measurement reporting entry., which includes
      *        information about a measurement for which the triggering conditions
      *        have been met.
      *
@@ -980,61 +983,61 @@
     };
 
     /**
-     * \brief The list of active reporting entries, indexed by the measurement
+     * @brief The list of active reporting entries, indexed by the measurement
      *        identity which triggered the reporting. Includes information about
      *        measurements for which the triggering conditions have been met.
      */
     std::map<uint8_t, VarMeasReport> m_varMeasReportList;
 
     /**
-     * \brief List of cell IDs which are responsible for a certain trigger.
+     * @brief List of cell IDs which are responsible for a certain trigger.
      */
     typedef std::list<uint16_t> ConcernedCells_t;
 
     /**
-     * \brief Compose a new reporting entry of the given measurement identity,
+     * @brief Compose a new reporting entry of the given measurement identity,
      *        insert it into #m_varMeasReportList, and set it up for submission
      *        to eNodeB.
-     * \param measId the measurement identity which the new reporting entry will
+     * @param measId the measurement identity which the new reporting entry will
      *               be based upon
-     * \param enteringCells the cells which are responsible for triggering the
+     * @param enteringCells the cells which are responsible for triggering the
      *                      reporting (i.e., successfully fulfilling the entering
      *                      condition of the measurement identity) and will be
      *                      included in the measurement report.
      *
-     * \note If an existing reporting entry with the same measurement identity has
+     * @note If an existing reporting entry with the same measurement identity has
      *       already existed in #m_varMeasReportList, the function will update it
      *       by adding the entering cells into the existing reporting entry.
-     * \note When time-to-trigger is enabled for this measurement identity, the
+     * @note When time-to-trigger is enabled for this measurement identity, the
      *       function will also remove the related trigger from the
      *       #m_enteringTriggerQueue.
      */
     void VarMeasReportListAdd(uint8_t measId, ConcernedCells_t enteringCells);
 
     /**
-     * \brief Remove some cells from an existing reporting entry in
+     * @brief Remove some cells from an existing reporting entry in
      *        #m_varMeasReportList.
-     * \param measId the measurement identity to be removed from
+     * @param measId the measurement identity to be removed from
      *               #m_varMeasReportList, must already exists there, otherwise
      *               an error would be raised
-     * \param leavingCells the cells which are about to be removed
-     * \param reportOnLeave when true, will make the function send one last
+     * @param leavingCells the cells which are about to be removed
+     * @param reportOnLeave when true, will make the function send one last
      *                      measurement report to eNodeB before removing it
      *
-     * \note If a given cell is not found in the reporting entry, the function
+     * @note If a given cell is not found in the reporting entry, the function
      *       will quietly continue.
-     * \note If the removal has removed all the cells in the reporting entry, the
+     * @note If the removal has removed all the cells in the reporting entry, the
      *       function will remove the reporting entry as well.
-     * \note When time-to-trigger is enabled for this measurement identity, the
+     * @note When time-to-trigger is enabled for this measurement identity, the
      *       function will also remove the related trigger from the
      *       #m_leavingTriggerQueue.
      */
     void VarMeasReportListErase(uint8_t measId, ConcernedCells_t leavingCells, bool reportOnLeave);
 
     /**
-     * \brief Remove the reporting entry of the given measurement identity from
+     * @brief Remove the reporting entry of the given measurement identity from
      *        #m_varMeasReportList.
-     * \param measId the measurement identity to be removed from
+     * @param measId the measurement identity to be removed from
      *               #m_varMeasReportList, must already exists there, otherwise
      *               an error would be raised
      *
@@ -1044,7 +1047,7 @@
     void VarMeasReportListClear(uint8_t measId);
 
     /**
-     * \brief Represents a measurement result from a certain cell.
+     * @brief Represents a measurement result from a certain cell.
      */
     struct MeasValues
     {
@@ -1054,7 +1057,7 @@
     };
 
     /**
-     * \brief Internal storage of the latest measurement results from all detected
+     * @brief Internal storage of the latest measurement results from all detected
      *        detected cells, indexed by the cell ID where the measurement was
      *        taken from.
      *
@@ -1069,12 +1072,12 @@
     std::map<uint16_t, MeasValues> m_storedMeasValues;
 
     /**
-     * \brief Stored measure values per carrier.
+     * @brief Stored measure values per carrier.
      */
     std::map<uint16_t, std::map<uint8_t, MeasValues>> m_storedMeasValuesPerCarrier;
 
     /**
-     * \brief Internal storage of the latest measurement results from all detected
+     * @brief Internal storage of the latest measurement results from all detected
      *        detected Secondary carrier component, indexed by the carrier component ID
      *        where the measurement was taken from.
      *
@@ -1092,7 +1095,7 @@
     std::map<uint16_t, MeasValues> m_storedScellMeasValues;
 
     /**
-     * \brief Represents a single triggered event from a measurement identity
+     * @brief Represents a single triggered event from a measurement identity
      *        which reporting criteria have been fulfilled, but delayed by
      *        time-to-trigger.
      */
@@ -1105,7 +1108,7 @@
     };
 
     /**
-     * \brief List of triggers that were raised because entering condition have
+     * @brief List of triggers that were raised because entering condition have
      *        been true, but are still delayed from reporting it by
      *        time-to-trigger.
      *
@@ -1116,7 +1119,7 @@
     std::map<uint8_t, std::list<PendingTrigger_t>> m_enteringTriggerQueue;
 
     /**
-     * \brief List of triggers that were raised because leaving condition have
+     * @brief List of triggers that were raised because leaving condition have
      *        been true, but are still delayed from stopping the reporting by
      *        time-to-trigger.
      *
@@ -1128,13 +1131,13 @@
     std::map<uint8_t, std::list<PendingTrigger_t>> m_leavingTriggerQueue;
 
     /**
-     * \brief Clear all the waiting triggers in #m_enteringTriggerQueue which are
+     * @brief Clear all the waiting triggers in #m_enteringTriggerQueue which are
      *        associated with the given measurement identity.
-     * \param measId the measurement identity to be processed, must already exists
+     * @param measId the measurement identity to be processed, must already exists
      *               in #m_enteringTriggerQueue, otherwise an error would be
      *               raised
      *
-     * \note The function may conclude that there is nothing to be removed. In
+     * @note The function may conclude that there is nothing to be removed. In
      *       this case, the function will simply ignore quietly.
      *
      * This function is used when the entering condition of the measurement
@@ -1147,15 +1150,15 @@
     void CancelEnteringTrigger(uint8_t measId);
 
     /**
-     * \brief Remove a specific cell from the waiting triggers in
+     * @brief Remove a specific cell from the waiting triggers in
      *        #m_enteringTriggerQueue which belong to the given measurement
      *        identity.
-     * \param measId the measurement identity to be processed, must already exists
+     * @param measId the measurement identity to be processed, must already exists
      *               in #m_enteringTriggerQueue, otherwise an error would be
      *               raised
-     * \param cellId the cell ID to be removed from the waiting triggers
+     * @param cellId the cell ID to be removed from the waiting triggers
      *
-     * \note The function may conclude that there is nothing to be removed. In
+     * @note The function may conclude that there is nothing to be removed. In
      *       this case, the function will simply ignore quietly.
      *
      * This function is used when a specific neighbour cell no longer fulfills
@@ -1168,13 +1171,13 @@
     void CancelEnteringTrigger(uint8_t measId, uint16_t cellId);
 
     /**
-     * \brief Clear all the waiting triggers in #m_leavingTriggerQueue which are
+     * @brief Clear all the waiting triggers in #m_leavingTriggerQueue which are
      *        associated with the given measurement identity.
-     * \param measId the measurement identity to be processed, must already exists
+     * @param measId the measurement identity to be processed, must already exists
      *               in #m_leavingTriggerQueue, otherwise an error would be
      *               raised
      *
-     * \note The function may conclude that there is nothing to be removed. In
+     * @note The function may conclude that there is nothing to be removed. In
      *       this case, the function will simply ignore quietly.
      *
      * This function is used when the leaving condition of the measurement
@@ -1187,15 +1190,15 @@
     void CancelLeavingTrigger(uint8_t measId);
 
     /**
-     * \brief Remove a specific cell from the waiting triggers in
+     * @brief Remove a specific cell from the waiting triggers in
      *        #m_leavingTriggerQueue which belong to the given measurement
      *        identity.
-     * \param measId the measurement identity to be processed, must already exists
+     * @param measId the measurement identity to be processed, must already exists
      *               in #m_leavingTriggerQueue, otherwise an error would be
      *               raised
-     * \param cellId the cell ID to be removed from the waiting triggers
+     * @param cellId the cell ID to be removed from the waiting triggers
      *
-     * \note The function may conclude that there is nothing to be removed. In
+     * @note The function may conclude that there is nothing to be removed. In
      *       this case, the function will simply ignore quietly.
      *
      * This function is used when a specific neighbour cell no longer fulfills
@@ -1215,13 +1218,13 @@
     Time m_t300;
 
     /**
-     * \brief Invokes ConnectionEstablishmentTimeout() if RRC connection
+     * @brief Invokes ConnectionEstablishmentTimeout() if RRC connection
      *        establishment procedure for this UE takes longer than T300.
      */
     EventId m_connectionTimeout;
 
     /**
-     * \brief Invoked after timer T300 expires, notifying upper layers that RRC
+     * @brief Invoked after timer T300 expires, notifying upper layers that RRC
      *        connection establishment procedure has failed.
      */
     void ConnectionTimeout();
@@ -1272,7 +1275,7 @@
 
     uint8_t m_connEstFailCount; ///< the counter to count T300 timer expiration
     /**
-     * \brief Radio link failure detected function
+     * @brief Radio link failure detected function
      *
      * Upon detection of radio link failure, the UE is reverted
      * back to idle state and the UE context at eNodeB and EPC
@@ -1284,7 +1287,7 @@
     void RadioLinkFailureDetected();
 
     /**
-     * \brief Do notify in sync function
+     * @brief Do notify in sync function
      *
      * Triggered upon receiving an in sync indication from UE PHY.
      * When the count equals N311, then T310 is cancelled.
@@ -1292,7 +1295,7 @@
     void DoNotifyInSync();
 
     /**
-     * \brief Do notify out of sync function
+     * @brief Do notify out of sync function
      *
      * Triggered upon receiving an out of sync indication from UE PHY.
      * When the count equals N310, then T310 is started.
@@ -1300,7 +1303,7 @@
     void DoNotifyOutOfSync();
 
     /**
-     * \brief Do reset sync indication counter function
+     * @brief Do reset sync indication counter function
      *
      * Reset the sync indication counter
      * if the Qin or Qout condition at PHY
@@ -1310,7 +1313,7 @@
     void DoResetSyncIndicationCounter();
 
     /**
-     * \brief Reset radio link failure parameters
+     * @brief Reset radio link failure parameters
      *
      * RLF timers and counters should be rest upon:
      *
@@ -1333,6 +1336,14 @@
 
 }; // end of class LteUeRrc
 
+/**
+ * @brief Stream insertion operator.
+ * @param [in] os The reference to the output stream.
+ * @param [in] state The LteUeRrc::State.
+ * @return The reference to the output stream.
+ */
+std::ostream& operator<<(std::ostream& os, LteUeRrc::State state);
+
 } // namespace ns3
 
 #endif // LTE_UE_RRC_H
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-vendor-specific-parameters.cc ns-3.44/src/lte/model/lte-vendor-specific-parameters.cc
--- ns-3.43/src/lte/model/lte-vendor-specific-parameters.cc	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/model/lte-vendor-specific-parameters.cc	2025-03-09 16:55:49.607372000 -0700
@@ -8,7 +8,7 @@
 
 #include "lte-vendor-specific-parameters.h"
 
-#include <ns3/log.h>
+#include "ns3/log.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/lte-vendor-specific-parameters.h ns-3.44/src/lte/model/lte-vendor-specific-parameters.h
--- ns-3.43/src/lte/model/lte-vendor-specific-parameters.h	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/model/lte-vendor-specific-parameters.h	2025-03-09 16:55:49.607372000 -0700
@@ -17,23 +17,23 @@
 {
 
 /**
- * \brief Define the RNTI that has generated the
+ * @brief Define the RNTI that has generated the
  */
 class SrsCqiRntiVsp : public VendorSpecificValue
 {
   public:
     /**
-     * \brief SRS CQI RNTI VSP
+     * @brief SRS CQI RNTI VSP
      *
-     * \param rnti the RNTI
+     * @param rnti the RNTI
      */
     SrsCqiRntiVsp(uint16_t rnti);
     ~SrsCqiRntiVsp() override;
 
     /**
-     * \brief Get RNTI function
+     * @brief Get RNTI function
      *
-     * \returns the RNTI
+     * @returns the RNTI
      */
     uint16_t GetRnti() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/no-op-component-carrier-manager.cc ns-3.44/src/lte/model/no-op-component-carrier-manager.cc
--- ns-3.43/src/lte/model/no-op-component-carrier-manager.cc	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/model/no-op-component-carrier-manager.cc	2025-03-09 16:55:49.607372000 -0700
@@ -13,8 +13,8 @@
 
 #include "lte-common.h"
 
-#include <ns3/log.h>
-#include <ns3/random-variable-stream.h>
+#include "ns3/log.h"
+#include "ns3/random-variable-stream.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/no-op-component-carrier-manager.h ns-3.44/src/lte/model/no-op-component-carrier-manager.h
--- ns-3.43/src/lte/model/no-op-component-carrier-manager.h	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/model/no-op-component-carrier-manager.h	2025-03-09 16:55:49.607372000 -0700
@@ -24,7 +24,7 @@
 class LteCcmRrcSapProvider;
 
 /**
- * \brief The default component carrier manager that forwards all traffic, the uplink and the
+ * @brief The default component carrier manager that forwards all traffic, the uplink and the
  * downlink, over the primary carrier, and will not use secondary carriers. To enable carrier
  * aggregation feature, select another component carrier manager class, i.e., some of child classes
  * of LteEnbComponentCarrierManager of NoOpComponentCarrierManager.
@@ -45,8 +45,8 @@
     NoOpComponentCarrierManager();
     ~NoOpComponentCarrierManager() override;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -56,26 +56,26 @@
     void DoDispose() override;
     void DoReportUeMeas(uint16_t rnti, LteRrcSap::MeasResults measResults) override;
     /**
-     * \brief Add UE.
-     * \param rnti the RNTI
-     * \param state the state
+     * @brief Add UE.
+     * @param rnti the RNTI
+     * @param state the state
      */
     virtual void DoAddUe(uint16_t rnti, uint8_t state);
     /**
-     * \brief Add LC.
-     * \param lcInfo the LC info
-     * \param msu the MSU
+     * @brief Add LC.
+     * @param lcInfo the LC info
+     * @param msu the MSU
      */
     virtual void DoAddLc(LteEnbCmacSapProvider::LcInfo lcInfo, LteMacSapUser* msu);
     /**
-     * \brief Setup data radio bearer.
-     * \param bearer the radio bearer
-     * \param bearerId the bearerID
-     * \param rnti the RNTI
-     * \param lcid the LCID
-     * \param lcGroup the LC group
-     * \param msu the MSU
-     * \returns std::vector<LteCcmRrcSapProvider::LcsConfig>
+     * @brief Setup data radio bearer.
+     * @param bearer the radio bearer
+     * @param bearerId the bearerID
+     * @param rnti the RNTI
+     * @param lcid the LCID
+     * @param lcGroup the LC group
+     * @param msu the MSU
+     * @returns std::vector<LteCcmRrcSapProvider::LcsConfig>
      */
     virtual std::vector<LteCcmRrcSapProvider::LcsConfig> DoSetupDataRadioBearer(EpsBearer bearer,
                                                                                 uint8_t bearerId,
@@ -84,66 +84,66 @@
                                                                                 uint8_t lcGroup,
                                                                                 LteMacSapUser* msu);
     /**
-     * \brief Transmit PDU.
-     * \param params the transmit PDU parameters
+     * @brief Transmit PDU.
+     * @param params the transmit PDU parameters
      */
     virtual void DoTransmitPdu(LteMacSapProvider::TransmitPduParameters params);
     /**
-     * \brief Report buffer status.
-     * \param params the report buffer status parameters
+     * @brief Report buffer status.
+     * @param params the report buffer status parameters
      */
     virtual void DoReportBufferStatus(LteMacSapProvider::ReportBufferStatusParameters params);
     /**
-     * \brief Notify transmit opportunity.
+     * @brief Notify transmit opportunity.
      *
-     * \param txOpParams the LteMacSapUser::TxOpportunityParameters
+     * @param txOpParams the LteMacSapUser::TxOpportunityParameters
      */
     virtual void DoNotifyTxOpportunity(LteMacSapUser::TxOpportunityParameters txOpParams);
     /**
-     * \brief Receive PDU.
+     * @brief Receive PDU.
      *
-     * \param rxPduParams the LteMacSapUser::ReceivePduParameters
+     * @param rxPduParams the LteMacSapUser::ReceivePduParameters
      */
     virtual void DoReceivePdu(LteMacSapUser::ReceivePduParameters rxPduParams);
     /// Notify HARQ delivery failure
     virtual void DoNotifyHarqDeliveryFailure();
     /**
-     * \brief Remove UE.
-     * \param rnti the RNTI
+     * @brief Remove UE.
+     * @param rnti the RNTI
      */
     virtual void DoRemoveUe(uint16_t rnti);
     /**
-     * \brief Release data radio bearer.
-     * \param rnti the RNTI
-     * \param lcid the LCID
-     * \returns updated data radio bearer list
+     * @brief Release data radio bearer.
+     * @param rnti the RNTI
+     * @param lcid the LCID
+     * @returns updated data radio bearer list
      */
     virtual std::vector<uint8_t> DoReleaseDataRadioBearer(uint16_t rnti, uint8_t lcid);
     /**
-     * \brief Configure the signal bearer.
-     * \param lcinfo the LteEnbCmacSapProvider::LcInfo
-     * \param msu the MSU
-     * \returns updated data radio bearer list
+     * @brief Configure the signal bearer.
+     * @param lcinfo the LteEnbCmacSapProvider::LcInfo
+     * @param msu the MSU
+     * @returns updated data radio bearer list
      */
     virtual LteMacSapUser* DoConfigureSignalBearer(LteEnbCmacSapProvider::LcInfo lcinfo,
                                                    LteMacSapUser* msu);
     /**
-     * \brief Forwards uplink BSR to CCM, called by MAC through CCM SAP interface.
-     * \param bsr the BSR
-     * \param componentCarrierId the component carrier ID
+     * @brief Forwards uplink BSR to CCM, called by MAC through CCM SAP interface.
+     * @param bsr the BSR
+     * @param componentCarrierId the component carrier ID
      */
     virtual void DoUlReceiveMacCe(MacCeListElement_s bsr, uint8_t componentCarrierId);
     /**
-     * \brief Forward uplink SR to CCM, called by MAC through CCM SAP interface.
-     * \param rnti RNTI of the UE that requested SR
-     * \param componentCarrierId the component carrier ID that forwarded the SR
+     * @brief Forward uplink SR to CCM, called by MAC through CCM SAP interface.
+     * @param rnti RNTI of the UE that requested SR
+     * @param componentCarrierId the component carrier ID that forwarded the SR
      */
     virtual void DoUlReceiveSr(uint16_t rnti, uint8_t componentCarrierId);
     /**
-     * \brief Function implements the function of the SAP interface of CCM instance which is used by
+     * @brief Function implements the function of the SAP interface of CCM instance which is used by
      * MAC to notify the PRB occupancy reported by scheduler.
-     * \param prbOccupancy the PRB occupancy
-     * \param componentCarrierId the component carrier ID
+     * @param prbOccupancy the PRB occupancy
+     * @param componentCarrierId the component carrier ID
      */
     virtual void DoNotifyPrbOccupancy(double prbOccupancy, uint8_t componentCarrierId);
 
@@ -154,7 +154,7 @@
 }; // end of class NoOpComponentCarrierManager
 
 /**
- * \brief Component carrier manager implementation that splits traffic equally among carriers.
+ * @brief Component carrier manager implementation that splits traffic equally among carriers.
  */
 class RrComponentCarrierManager : public NoOpComponentCarrierManager
 {
@@ -162,8 +162,8 @@
     RrComponentCarrierManager();
     ~RrComponentCarrierManager() override;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/no-op-handover-algorithm.cc ns-3.44/src/lte/model/no-op-handover-algorithm.cc
--- ns-3.43/src/lte/model/no-op-handover-algorithm.cc	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/model/no-op-handover-algorithm.cc	2025-03-09 16:55:49.607372000 -0700
@@ -9,7 +9,7 @@
 
 #include "no-op-handover-algorithm.h"
 
-#include <ns3/log.h>
+#include "ns3/log.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/no-op-handover-algorithm.h ns-3.44/src/lte/model/no-op-handover-algorithm.h
--- ns-3.43/src/lte/model/no-op-handover-algorithm.h	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/model/no-op-handover-algorithm.h	2025-03-09 16:55:49.607372000 -0700
@@ -18,7 +18,7 @@
 {
 
 /**
- * \brief Handover algorithm implementation which simply does nothing.
+ * @brief Handover algorithm implementation which simply does nothing.
  *
  * Selecting this handover algorithm is equivalent to disabling automatic
  * triggering of handover. This is the default choice.
@@ -35,8 +35,8 @@
     ~NoOpHandoverAlgorithm() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/pf-ff-mac-scheduler.cc ns-3.44/src/lte/model/pf-ff-mac-scheduler.cc
--- ns-3.43/src/lte/model/pf-ff-mac-scheduler.cc	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/model/pf-ff-mac-scheduler.cc	2025-03-09 16:55:49.607372000 -0700
@@ -11,11 +11,11 @@
 #include "lte-amc.h"
 #include "lte-vendor-specific-parameters.h"
 
-#include <ns3/boolean.h>
-#include <ns3/log.h>
-#include <ns3/math.h>
-#include <ns3/pointer.h>
-#include <ns3/simulator.h>
+#include "ns3/boolean.h"
+#include "ns3/log.h"
+#include "ns3/math.h"
+#include "ns3/pointer.h"
+#include "ns3/simulator.h"
 
 #include <cfloat>
 #include <set>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/pf-ff-mac-scheduler.h ns-3.44/src/lte/model/pf-ff-mac-scheduler.h
--- ns-3.43/src/lte/model/pf-ff-mac-scheduler.h	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/model/pf-ff-mac-scheduler.h	2025-03-09 16:55:49.607372000 -0700
@@ -16,7 +16,7 @@
 #include "lte-common.h"
 #include "lte-ffr-sap.h"
 
-#include <ns3/nstime.h>
+#include "ns3/nstime.h"
 
 #include <map>
 #include <vector>
@@ -34,8 +34,8 @@
 };
 
 /**
- * \ingroup ff-api
- * \brief Implements the SCHED SAP and CSCHED SAP for a Proportional Fair scheduler
+ * @ingroup ff-api
+ * @brief Implements the SCHED SAP and CSCHED SAP for a Proportional Fair scheduler
  *
  * This class implements the interface defined by the FfMacScheduler abstract class
  */
@@ -44,7 +44,7 @@
 {
   public:
     /**
-     * \brief Constructor
+     * @brief Constructor
      *
      * Creates the MAC Scheduler interface implementation
      */
@@ -58,8 +58,8 @@
     // inherited from Object
     void DoDispose() override;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -79,10 +79,10 @@
     friend class MemberSchedSapProvider<PfFfMacScheduler>;
 
     /**
-     * \brief transmission mode configuration update
+     * @brief transmission mode configuration update
      *
-     * \param rnti the RNTI
-     * \param txMode the transmit mode
+     * @param rnti the RNTI
+     * @param txMode the transmit mode
      */
     void TransmissionModeConfigurationUpdate(uint16_t rnti, uint8_t txMode);
 
@@ -93,37 +93,37 @@
     //
 
     /**
-     * \brief CSched cell config request
+     * @brief CSched cell config request
      *
-     * \param params FfMacCschedSapProvider::CschedCellConfigReqParameters
+     * @param params FfMacCschedSapProvider::CschedCellConfigReqParameters
      */
     void DoCschedCellConfigReq(const FfMacCschedSapProvider::CschedCellConfigReqParameters& params);
 
     /**
-     * \brief CSched UE config request
+     * @brief CSched UE config request
      *
-     * \param params FfMacCschedSapProvider::CschedUeConfigReqParameters
+     * @param params FfMacCschedSapProvider::CschedUeConfigReqParameters
      */
     void DoCschedUeConfigReq(const FfMacCschedSapProvider::CschedUeConfigReqParameters& params);
 
     /**
-     * \brief CSched LC config request
+     * @brief CSched LC config request
      *
-     * \param params FfMacCschedSapProvider::CschedLcConfigReqParameters
+     * @param params FfMacCschedSapProvider::CschedLcConfigReqParameters
      */
     void DoCschedLcConfigReq(const FfMacCschedSapProvider::CschedLcConfigReqParameters& params);
 
     /**
-     * \brief CSched LC release request
+     * @brief CSched LC release request
      *
-     * \param params FfMacCschedSapProvider::CschedLcReleaseReqParameters
+     * @param params FfMacCschedSapProvider::CschedLcReleaseReqParameters
      */
     void DoCschedLcReleaseReq(const FfMacCschedSapProvider::CschedLcReleaseReqParameters& params);
 
     /**
-     * \brief CSched UE release request
+     * @brief CSched UE release request
      *
-     * \param params FfMacCschedSapProvider::CschedLcReleaseReqParameters
+     * @param params FfMacCschedSapProvider::CschedLcReleaseReqParameters
      */
     void DoCschedUeReleaseReq(const FfMacCschedSapProvider::CschedUeReleaseReqParameters& params);
 
@@ -133,107 +133,107 @@
     //
 
     /**
-     * \brief Sched DL RLC buffer request
+     * @brief Sched DL RLC buffer request
      *
-     * \param params FfMacSchedSapProvider::SchedDlRlcBufferReqParameters
+     * @param params FfMacSchedSapProvider::SchedDlRlcBufferReqParameters
      */
     void DoSchedDlRlcBufferReq(const FfMacSchedSapProvider::SchedDlRlcBufferReqParameters& params);
 
     /**
-     * \brief Sched DL paging buffer request
+     * @brief Sched DL paging buffer request
      *
-     * \param params FfMacSchedSapProvider::SchedDlPagingBufferReqParameters
+     * @param params FfMacSchedSapProvider::SchedDlPagingBufferReqParameters
      */
     void DoSchedDlPagingBufferReq(
         const FfMacSchedSapProvider::SchedDlPagingBufferReqParameters& params);
 
     /**
-     * \brief Sched DL MAC buffer request
+     * @brief Sched DL MAC buffer request
      *
-     * \param params FfMacSchedSapProvider::SchedDlMacBufferReqParameters
+     * @param params FfMacSchedSapProvider::SchedDlMacBufferReqParameters
      */
     void DoSchedDlMacBufferReq(const FfMacSchedSapProvider::SchedDlMacBufferReqParameters& params);
 
     /**
-     * \brief Sched DL trigger request
+     * @brief Sched DL trigger request
      *
-     * \param params FfMacSchedSapProvider::SchedDlTriggerReqParameters
+     * @param params FfMacSchedSapProvider::SchedDlTriggerReqParameters
      */
     void DoSchedDlTriggerReq(const FfMacSchedSapProvider::SchedDlTriggerReqParameters& params);
 
     /**
-     * \brief Sched DL RACH info request
+     * @brief Sched DL RACH info request
      *
-     * \param params FfMacSchedSapProvider::SchedDlRachInfoReqParameters
+     * @param params FfMacSchedSapProvider::SchedDlRachInfoReqParameters
      */
     void DoSchedDlRachInfoReq(const FfMacSchedSapProvider::SchedDlRachInfoReqParameters& params);
 
     /**
-     * \brief Sched DL CQI info request
+     * @brief Sched DL CQI info request
      *
-     * \param params FfMacSchedSapProvider::SchedDlCqiInfoReqParameters
+     * @param params FfMacSchedSapProvider::SchedDlCqiInfoReqParameters
      */
     void DoSchedDlCqiInfoReq(const FfMacSchedSapProvider::SchedDlCqiInfoReqParameters& params);
 
     /**
-     * \brief Sched UL trigger request
+     * @brief Sched UL trigger request
      *
-     * \param params FfMacSchedSapProvider::SchedUlTriggerReqParameters
+     * @param params FfMacSchedSapProvider::SchedUlTriggerReqParameters
      */
     void DoSchedUlTriggerReq(const FfMacSchedSapProvider::SchedUlTriggerReqParameters& params);
 
     /**
-     * \brief Sched UL noise interference request
+     * @brief Sched UL noise interference request
      *
-     * \param params FfMacSchedSapProvider::SchedUlNoiseInterferenceReqParameters
+     * @param params FfMacSchedSapProvider::SchedUlNoiseInterferenceReqParameters
      */
     void DoSchedUlNoiseInterferenceReq(
         const FfMacSchedSapProvider::SchedUlNoiseInterferenceReqParameters& params);
 
     /**
-     * \brief Sched UL SR info request
+     * @brief Sched UL SR info request
      *
-     * \param params FfMacSchedSapProvider::SchedUlSrInfoReqParameters
+     * @param params FfMacSchedSapProvider::SchedUlSrInfoReqParameters
      */
     void DoSchedUlSrInfoReq(const FfMacSchedSapProvider::SchedUlSrInfoReqParameters& params);
 
     /**
-     * \brief Sched UL MAC control info request
+     * @brief Sched UL MAC control info request
      *
-     * \param params FfMacSchedSapProvider::SchedUlMacCtrlInfoReqParameters
+     * @param params FfMacSchedSapProvider::SchedUlMacCtrlInfoReqParameters
      */
     void DoSchedUlMacCtrlInfoReq(
         const FfMacSchedSapProvider::SchedUlMacCtrlInfoReqParameters& params);
 
     /**
-     * \brief Sched UL CQI info request
+     * @brief Sched UL CQI info request
      *
-     * \param params FfMacSchedSapProvider::SchedUlCqiInfoReqParameters
+     * @param params FfMacSchedSapProvider::SchedUlCqiInfoReqParameters
      */
     void DoSchedUlCqiInfoReq(const FfMacSchedSapProvider::SchedUlCqiInfoReqParameters& params);
 
     /**
-     * \brief Get RBG size
+     * @brief Get RBG size
      *
-     * \param dlbandwidth dDL bandwidth
-     * \returns the RBG size
+     * @param dlbandwidth dDL bandwidth
+     * @returns the RBG size
      */
     int GetRbgSize(int dlbandwidth);
 
     /**
-     * \brief LC active per flow
+     * @brief LC active per flow
      *
-     * \param rnti the RNTI
-     * \returns the LC active per flow
+     * @param rnti the RNTI
+     * @returns the LC active per flow
      */
     unsigned int LcActivePerFlow(uint16_t rnti);
 
     /**
-     * \brief Estimate UL SINR
+     * @brief Estimate UL SINR
      *
-     * \param rnti the RNTI
-     * \param rb the RB
-     * \returns the SINR
+     * @param rnti the RNTI
+     * @param rb the RB
+     * @returns the SINR
      */
     double EstimateUlSinr(uint16_t rnti, uint16_t rb);
 
@@ -243,39 +243,39 @@
     void RefreshUlCqiMaps();
 
     /**
-     * \brief Update DL RCL buffer info
+     * @brief Update DL RCL buffer info
      *
-     * \param rnti the RNTI
-     * \param lcid the LCID
-     * \param size the size
+     * @param rnti the RNTI
+     * @param lcid the LCID
+     * @param size the size
      */
     void UpdateDlRlcBufferInfo(uint16_t rnti, uint8_t lcid, uint16_t size);
     /**
-     * \brief Update UL RCL buffer info
+     * @brief Update UL RCL buffer info
      *
-     * \param rnti the RNTI
-     * \param size the size
+     * @param rnti the RNTI
+     * @param size the size
      */
     void UpdateUlRlcBufferInfo(uint16_t rnti, uint16_t size);
 
     /**
-     * \brief Update and return a new process Id for the RNTI specified
+     * @brief Update and return a new process Id for the RNTI specified
      *
-     * \param rnti the RNTI of the UE to be updated
-     * \return the process id  value
+     * @param rnti the RNTI of the UE to be updated
+     * @return the process id  value
      */
     uint8_t UpdateHarqProcessId(uint16_t rnti);
 
     /**
-     * \brief Return the availability of free process for the RNTI specified
+     * @brief Return the availability of free process for the RNTI specified
      *
-     * \param rnti the RNTI of the UE to be updated
-     * \return the availability
+     * @param rnti the RNTI of the UE to be updated
+     * @return the availability
      */
     bool HarqProcessAvailability(uint16_t rnti);
 
     /**
-     * \brief Refresh HARQ processes according to the timers
+     * @brief Refresh HARQ processes according to the timers
      *
      */
     void RefreshHarqProcesses();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/pss-ff-mac-scheduler.cc ns-3.44/src/lte/model/pss-ff-mac-scheduler.cc
--- ns-3.43/src/lte/model/pss-ff-mac-scheduler.cc	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/model/pss-ff-mac-scheduler.cc	2025-03-09 16:55:49.607372000 -0700
@@ -12,12 +12,12 @@
 #include "lte-amc.h"
 #include "lte-vendor-specific-parameters.h"
 
-#include <ns3/boolean.h>
-#include <ns3/log.h>
-#include <ns3/math.h>
-#include <ns3/pointer.h>
-#include <ns3/simulator.h>
-#include <ns3/string.h>
+#include "ns3/boolean.h"
+#include "ns3/log.h"
+#include "ns3/math.h"
+#include "ns3/pointer.h"
+#include "ns3/simulator.h"
+#include "ns3/string.h"
 
 #include <algorithm>
 #include <cfloat>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/pss-ff-mac-scheduler.h ns-3.44/src/lte/model/pss-ff-mac-scheduler.h
--- ns-3.43/src/lte/model/pss-ff-mac-scheduler.h	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/model/pss-ff-mac-scheduler.h	2025-03-09 16:55:49.607372000 -0700
@@ -17,7 +17,7 @@
 #include "lte-common.h"
 #include "lte-ffr-sap.h"
 
-#include <ns3/nstime.h>
+#include "ns3/nstime.h"
 
 #include <map>
 #include <vector>
@@ -39,8 +39,8 @@
 };
 
 /**
- * \ingroup ff-api
- * \brief Implements the SCHED SAP and CSCHED SAP for a Priority Set scheduler
+ * @ingroup ff-api
+ * @brief Implements the SCHED SAP and CSCHED SAP for a Priority Set scheduler
  *
  * This class implements the interface defined by the FfMacScheduler abstract class
  */
@@ -49,7 +49,7 @@
 {
   public:
     /**
-     * \brief Constructor
+     * @brief Constructor
      *
      * Creates the MAC Scheduler interface implementation
      */
@@ -63,8 +63,8 @@
     // inherited from Object
     void DoDispose() override;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -84,10 +84,10 @@
     friend class MemberSchedSapProvider<PssFfMacScheduler>;
 
     /**
-     * \brief Transmission mode configuration update function
+     * @brief Transmission mode configuration update function
      *
-     * \param rnti the RNTI
-     * \param txMode the transmit mode
+     * @param rnti the RNTI
+     * @param txMode the transmit mode
      */
     void TransmissionModeConfigurationUpdate(uint16_t rnti, uint8_t txMode);
 
@@ -98,37 +98,37 @@
     //
 
     /**
-     * \brief CSched cell config request function
+     * @brief CSched cell config request function
      *
-     * \param params FfMacCschedSapProvider::CschedCellConfigReqParameters
+     * @param params FfMacCschedSapProvider::CschedCellConfigReqParameters
      */
     void DoCschedCellConfigReq(const FfMacCschedSapProvider::CschedCellConfigReqParameters& params);
 
     /**
-     * \brief CSched UE config request function
+     * @brief CSched UE config request function
      *
-     * \param params FfMacCschedSapProvider::CschedUeConfigReqParameters
+     * @param params FfMacCschedSapProvider::CschedUeConfigReqParameters
      */
     void DoCschedUeConfigReq(const FfMacCschedSapProvider::CschedUeConfigReqParameters& params);
 
     /**
-     * \brief CSched LC config request function
+     * @brief CSched LC config request function
      *
-     * \param params FfMacCschedSapProvider::CschedLcConfigReqParameters
+     * @param params FfMacCschedSapProvider::CschedLcConfigReqParameters
      */
     void DoCschedLcConfigReq(const FfMacCschedSapProvider::CschedLcConfigReqParameters& params);
 
     /**
-     * \brief CSched LC release request function
+     * @brief CSched LC release request function
      *
-     * \param params FfMacCschedSapProvider::CschedLcReleaseReqParameters
+     * @param params FfMacCschedSapProvider::CschedLcReleaseReqParameters
      */
     void DoCschedLcReleaseReq(const FfMacCschedSapProvider::CschedLcReleaseReqParameters& params);
 
     /**
-     * \brief CSched UE release request function
+     * @brief CSched UE release request function
      *
-     * \param params FfMacCschedSapProvider::CschedUeReleaseReqParameters
+     * @param params FfMacCschedSapProvider::CschedUeReleaseReqParameters
      */
     void DoCschedUeReleaseReq(const FfMacCschedSapProvider::CschedUeReleaseReqParameters& params);
 
@@ -138,107 +138,107 @@
     //
 
     /**
-     * \brief Sched DL RLC buffer request function
+     * @brief Sched DL RLC buffer request function
      *
-     * \param params FfMacSchedSapProvider::SchedDlRlcBufferReqParameters
+     * @param params FfMacSchedSapProvider::SchedDlRlcBufferReqParameters
      */
     void DoSchedDlRlcBufferReq(const FfMacSchedSapProvider::SchedDlRlcBufferReqParameters& params);
 
     /**
-     * \brief Sched DL paging buffer request function
+     * @brief Sched DL paging buffer request function
      *
-     * \param params FfMacSchedSapProvider::SchedDlPagingBufferReqParameters
+     * @param params FfMacSchedSapProvider::SchedDlPagingBufferReqParameters
      */
     void DoSchedDlPagingBufferReq(
         const FfMacSchedSapProvider::SchedDlPagingBufferReqParameters& params);
 
     /**
-     * \brief Sched DL MAC buffer request function
+     * @brief Sched DL MAC buffer request function
      *
-     * \param params FfMacSchedSapProvider::SchedDlMacBufferReqParameters
+     * @param params FfMacSchedSapProvider::SchedDlMacBufferReqParameters
      */
     void DoSchedDlMacBufferReq(const FfMacSchedSapProvider::SchedDlMacBufferReqParameters& params);
 
     /**
-     * \brief Sched DL trigger request function
+     * @brief Sched DL trigger request function
      *
-     * \param params FfMacSchedSapProvider::SchedDlTriggerReqParameters
+     * @param params FfMacSchedSapProvider::SchedDlTriggerReqParameters
      */
     void DoSchedDlTriggerReq(const FfMacSchedSapProvider::SchedDlTriggerReqParameters& params);
 
     /**
-     * \brief Sched DL RACH info request function
+     * @brief Sched DL RACH info request function
      *
-     * \param params FfMacSchedSapProvider::SchedDlRachInfoReqParameters
+     * @param params FfMacSchedSapProvider::SchedDlRachInfoReqParameters
      */
     void DoSchedDlRachInfoReq(const FfMacSchedSapProvider::SchedDlRachInfoReqParameters& params);
 
     /**
-     * \brief Sched DL CQI info request function
+     * @brief Sched DL CQI info request function
      *
-     * \param params FfMacSchedSapProvider::SchedDlCqiInfoReqParameters
+     * @param params FfMacSchedSapProvider::SchedDlCqiInfoReqParameters
      */
     void DoSchedDlCqiInfoReq(const FfMacSchedSapProvider::SchedDlCqiInfoReqParameters& params);
 
     /**
-     * \brief Sched UL trigger request function
+     * @brief Sched UL trigger request function
      *
-     * \param params FfMacSchedSapProvider::SchedUlTriggerReqParameters
+     * @param params FfMacSchedSapProvider::SchedUlTriggerReqParameters
      */
     void DoSchedUlTriggerReq(const FfMacSchedSapProvider::SchedUlTriggerReqParameters& params);
 
     /**
-     * \brief Sched UL noise interference request function
+     * @brief Sched UL noise interference request function
      *
-     * \param params FfMacSchedSapProvider::SchedUlNoiseInterferenceReqParameters
+     * @param params FfMacSchedSapProvider::SchedUlNoiseInterferenceReqParameters
      */
     void DoSchedUlNoiseInterferenceReq(
         const FfMacSchedSapProvider::SchedUlNoiseInterferenceReqParameters& params);
 
     /**
-     * \brief Sched UL SR info request function
+     * @brief Sched UL SR info request function
      *
-     * \param params FfMacSchedSapProvider::SchedUlSrInfoReqParameters
+     * @param params FfMacSchedSapProvider::SchedUlSrInfoReqParameters
      */
     void DoSchedUlSrInfoReq(const FfMacSchedSapProvider::SchedUlSrInfoReqParameters& params);
 
     /**
-     * \brief Sched UL MAC control info request function
+     * @brief Sched UL MAC control info request function
      *
-     * \param params FfMacSchedSapProvider::SchedUlMacCtrlInfoReqParameters
+     * @param params FfMacSchedSapProvider::SchedUlMacCtrlInfoReqParameters
      */
     void DoSchedUlMacCtrlInfoReq(
         const FfMacSchedSapProvider::SchedUlMacCtrlInfoReqParameters& params);
 
     /**
-     * \brief Sched UL CQI info request function
+     * @brief Sched UL CQI info request function
      *
-     * \param params FfMacSchedSapProvider::SchedUlCqiInfoReqParameters
+     * @param params FfMacSchedSapProvider::SchedUlCqiInfoReqParameters
      */
     void DoSchedUlCqiInfoReq(const FfMacSchedSapProvider::SchedUlCqiInfoReqParameters& params);
 
     /**
-     * \brief Get RBG size function
+     * @brief Get RBG size function
      *
-     * \param dlbandwidth DL bandwidth
-     * \returns RBG size
+     * @param dlbandwidth DL bandwidth
+     * @returns RBG size
      */
     int GetRbgSize(int dlbandwidth);
 
     /**
-     * \brief Get LC active flow function
+     * @brief Get LC active flow function
      *
-     * \param rnti the RNTI
-     * \returns LC active flow
+     * @param rnti the RNTI
+     * @returns LC active flow
      */
     unsigned int LcActivePerFlow(uint16_t rnti);
 
     /**
-     * \brief Estimate UL SINR function
+     * @brief Estimate UL SINR function
      *
-     * \param rnti the RNTI
-     * \param rb the RB
-     * \returns UL SINR
+     * @param rnti the RNTI
+     * @param rb the RB
+     * @returns UL SINR
      */
     double EstimateUlSinr(uint16_t rnti, uint16_t rb);
 
@@ -248,39 +248,39 @@
     void RefreshUlCqiMaps();
 
     /**
-     * \brief Update DL RLC buffer info function
+     * @brief Update DL RLC buffer info function
      *
-     * \param rnti the RNTI
-     * \param lcid the LCID
-     * \param size the size
+     * @param rnti the RNTI
+     * @param lcid the LCID
+     * @param size the size
      */
     void UpdateDlRlcBufferInfo(uint16_t rnti, uint8_t lcid, uint16_t size);
     /**
-     * \brief Update UL RLC buffer info function
+     * @brief Update UL RLC buffer info function
      *
-     * \param rnti the RNTI
-     * \param size the size
+     * @param rnti the RNTI
+     * @param size the size
      */
     void UpdateUlRlcBufferInfo(uint16_t rnti, uint16_t size);
 
     /**
-     * \brief Update and return a new process Id for the RNTI specified
+     * @brief Update and return a new process Id for the RNTI specified
      *
-     * \param rnti the RNTI of the UE to be updated
-     * \return the process id  value
+     * @param rnti the RNTI of the UE to be updated
+     * @return the process id  value
      */
     uint8_t UpdateHarqProcessId(uint16_t rnti);
 
     /**
-     * \brief Return the availability of free process for the RNTI specified
+     * @brief Return the availability of free process for the RNTI specified
      *
-     * \param rnti the RNTI of the UE to be updated
-     * \return the availability
+     * @param rnti the RNTI of the UE to be updated
+     * @return the availability
      */
     bool HarqProcessAvailability(uint16_t rnti);
 
     /**
-     * \brief Refresh HARQ processes according to the timers
+     * @brief Refresh HARQ processes according to the timers
      *
      */
     void RefreshHarqProcesses();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/rem-spectrum-phy.cc ns-3.44/src/lte/model/rem-spectrum-phy.cc
--- ns-3.43/src/lte/model/rem-spectrum-phy.cc	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/model/rem-spectrum-phy.cc	2025-03-09 16:55:49.607372000 -0700
@@ -12,12 +12,12 @@
 
 #include "lte-spectrum-signal-parameters.h"
 
-#include <ns3/antenna-model.h>
-#include <ns3/double.h>
-#include <ns3/log.h>
-#include <ns3/object-factory.h>
-#include <ns3/simulator.h>
-#include <ns3/trace-source-accessor.h>
+#include "ns3/antenna-model.h"
+#include "ns3/double.h"
+#include "ns3/log.h"
+#include "ns3/object-factory.h"
+#include "ns3/simulator.h"
+#include "ns3/trace-source-accessor.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/rem-spectrum-phy.h ns-3.44/src/lte/model/rem-spectrum-phy.h
--- ns-3.43/src/lte/model/rem-spectrum-phy.h	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/model/rem-spectrum-phy.h	2025-03-09 16:55:49.607372000 -0700
@@ -9,13 +9,13 @@
 #ifndef REM_SPECTRUM_PHY_H
 #define REM_SPECTRUM_PHY_H
 
-#include <ns3/mobility-model.h>
-#include <ns3/net-device.h>
-#include <ns3/nstime.h>
-#include <ns3/packet.h>
-#include <ns3/spectrum-channel.h>
-#include <ns3/spectrum-phy.h>
-#include <ns3/spectrum-value.h>
+#include "ns3/mobility-model.h"
+#include "ns3/net-device.h"
+#include "ns3/nstime.h"
+#include "ns3/packet.h"
+#include "ns3/spectrum-channel.h"
+#include "ns3/spectrum-phy.h"
+#include "ns3/spectrum-value.h"
 
 #include <fstream>
 #include <string>
@@ -45,8 +45,8 @@
     // inherited from Object
     void DoDispose() override;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -63,14 +63,14 @@
     /**
      * set the RX spectrum model to be used
      *
-     * \param m
+     * @param m
      */
     void SetRxSpectrumModel(Ptr<const SpectrumModel> m);
 
     /**
      *
-     * \param noisePower the noise power
-     * \return the Signal to Noise Ratio calculated
+     * @param noisePower the noise power
+     * @return the Signal to Noise Ratio calculated
      */
     double GetSinr(double noisePower) const;
 
@@ -82,7 +82,7 @@
 
     /**
      *
-     * \return true if active
+     * @return true if active
      */
     bool IsActive() const;
 
@@ -95,14 +95,14 @@
     /**
      * set usage of DataChannel
      *
-     * \param value if true, data channel signal will be processed, control signal otherwise
+     * @param value if true, data channel signal will be processed, control signal otherwise
      */
     void SetUseDataChannel(bool value);
 
     /**
      * set RB Id
      *
-     * \param rbId Resource Block Id which will be processed
+     * @param rbId Resource Block Id which will be processed
      */
     void SetRbId(int32_t rbId);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/rr-ff-mac-scheduler.cc ns-3.44/src/lte/model/rr-ff-mac-scheduler.cc
--- ns-3.43/src/lte/model/rr-ff-mac-scheduler.cc	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/model/rr-ff-mac-scheduler.cc	2025-03-09 16:55:49.607372000 -0700
@@ -12,11 +12,11 @@
 #include "lte-common.h"
 #include "lte-vendor-specific-parameters.h"
 
-#include <ns3/boolean.h>
-#include <ns3/log.h>
-#include <ns3/math.h>
-#include <ns3/pointer.h>
-#include <ns3/simulator.h>
+#include "ns3/boolean.h"
+#include "ns3/log.h"
+#include "ns3/math.h"
+#include "ns3/pointer.h"
+#include "ns3/simulator.h"
 
 #include <cfloat>
 #include <climits>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/rr-ff-mac-scheduler.h ns-3.44/src/lte/model/rr-ff-mac-scheduler.h
--- ns-3.43/src/lte/model/rr-ff-mac-scheduler.h	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/model/rr-ff-mac-scheduler.h	2025-03-09 16:55:49.607372000 -0700
@@ -23,8 +23,8 @@
 {
 
 /**
- * \ingroup ff-api
- * \brief Implements the SCHED SAP and CSCHED SAP for a Round Robin scheduler
+ * @ingroup ff-api
+ * @brief Implements the SCHED SAP and CSCHED SAP for a Round Robin scheduler
  *
  * This class implements the interface defined by the FfMacScheduler abstract class
  */
@@ -33,7 +33,7 @@
 {
   public:
     /**
-     * \brief Constructor
+     * @brief Constructor
      *
      * Creates the MAC Scheduler interface implementation
      */
@@ -47,8 +47,8 @@
     // inherited from Object
     void DoDispose() override;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -68,9 +68,9 @@
     friend class MemberSchedSapProvider<RrFfMacScheduler>;
 
     /**
-     * \brief Transmission mode configuration update function
-     * \param rnti the RNTI
-     * \param txMode the transmission mode
+     * @brief Transmission mode configuration update function
+     * @param rnti the RNTI
+     * @param txMode the transmission mode
      */
     void TransmissionModeConfigurationUpdate(uint16_t rnti, uint8_t txMode);
 
@@ -81,32 +81,32 @@
     //
 
     /**
-     * \brief CSched cell config request
-     * \param params FfMacCschedSapProvider::CschedCellConfigReqParameters
+     * @brief CSched cell config request
+     * @param params FfMacCschedSapProvider::CschedCellConfigReqParameters
      */
     void DoCschedCellConfigReq(const FfMacCschedSapProvider::CschedCellConfigReqParameters& params);
 
     /**
-     * \brief CSched UE config request
-     * \param params FfMacCschedSapProvider::CschedUeConfigReqParameters
+     * @brief CSched UE config request
+     * @param params FfMacCschedSapProvider::CschedUeConfigReqParameters
      */
     void DoCschedUeConfigReq(const FfMacCschedSapProvider::CschedUeConfigReqParameters& params);
 
     /**
-     * \brief CSched LC config request
-     * \param params FfMacCschedSapProvider::CschedLcConfigReqParameters
+     * @brief CSched LC config request
+     * @param params FfMacCschedSapProvider::CschedLcConfigReqParameters
      */
     void DoCschedLcConfigReq(const FfMacCschedSapProvider::CschedLcConfigReqParameters& params);
 
     /**
-     * \brief CSched LC release request
-     * \param params FfMacCschedSapProvider::CschedLcReleaseReqParameters
+     * @brief CSched LC release request
+     * @param params FfMacCschedSapProvider::CschedLcReleaseReqParameters
      */
     void DoCschedLcReleaseReq(const FfMacCschedSapProvider::CschedLcReleaseReqParameters& params);
 
     /**
-     * \brief CSched UE release request
-     * \param params FfMacCschedSapProvider::CschedUeReleaseReqParameters
+     * @brief CSched UE release request
+     * @param params FfMacCschedSapProvider::CschedUeReleaseReqParameters
      */
     void DoCschedUeReleaseReq(const FfMacCschedSapProvider::CschedUeReleaseReqParameters& params);
 
@@ -116,86 +116,86 @@
     //
 
     /**
-     * \brief Sched DL RLC buffer request
-     * \param params FfMacSchedSapProvider::SchedDlRlcBufferReqParameters
+     * @brief Sched DL RLC buffer request
+     * @param params FfMacSchedSapProvider::SchedDlRlcBufferReqParameters
      */
     void DoSchedDlRlcBufferReq(const FfMacSchedSapProvider::SchedDlRlcBufferReqParameters& params);
 
     /**
-     * \brief Sched DL paging buffer request
-     * \param params FfMacSchedSapProvider::SchedDlPagingBufferReqParameters
+     * @brief Sched DL paging buffer request
+     * @param params FfMacSchedSapProvider::SchedDlPagingBufferReqParameters
      */
     void DoSchedDlPagingBufferReq(
         const FfMacSchedSapProvider::SchedDlPagingBufferReqParameters& params);
 
     /**
-     * \brief Sched DL MAC buffer request
-     * \param params FfMacSchedSapProvider::SchedDlMacBufferReqParameters
+     * @brief Sched DL MAC buffer request
+     * @param params FfMacSchedSapProvider::SchedDlMacBufferReqParameters
      */
     void DoSchedDlMacBufferReq(const FfMacSchedSapProvider::SchedDlMacBufferReqParameters& params);
 
     /**
-     * \brief Sched DL trigger request
-     * \param params FfMacSchedSapProvider::SchedDlTriggerReqParameters
+     * @brief Sched DL trigger request
+     * @param params FfMacSchedSapProvider::SchedDlTriggerReqParameters
      */
     void DoSchedDlTriggerReq(const FfMacSchedSapProvider::SchedDlTriggerReqParameters& params);
 
     /**
-     * \brief Sched DL RACH info request
-     * \param params FfMacSchedSapProvider::SchedDlRachInfoReqParameters
+     * @brief Sched DL RACH info request
+     * @param params FfMacSchedSapProvider::SchedDlRachInfoReqParameters
      */
     void DoSchedDlRachInfoReq(const FfMacSchedSapProvider::SchedDlRachInfoReqParameters& params);
 
     /**
-     * \brief Sched DL CQI info request
-     * \param params FfMacSchedSapProvider::SchedDlCqiInfoReqParameters
+     * @brief Sched DL CQI info request
+     * @param params FfMacSchedSapProvider::SchedDlCqiInfoReqParameters
      */
     void DoSchedDlCqiInfoReq(const FfMacSchedSapProvider::SchedDlCqiInfoReqParameters& params);
 
     /**
-     * \brief Sched UL trigger request
-     * \param params FfMacSchedSapProvider::SchedUlTriggerReqParameters
+     * @brief Sched UL trigger request
+     * @param params FfMacSchedSapProvider::SchedUlTriggerReqParameters
      */
     void DoSchedUlTriggerReq(const FfMacSchedSapProvider::SchedUlTriggerReqParameters& params);
 
     /**
-     * \brief Sched UL noise interference request
-     * \param params FfMacSchedSapProvider::SchedUlNoiseInterferenceReqParameters
+     * @brief Sched UL noise interference request
+     * @param params FfMacSchedSapProvider::SchedUlNoiseInterferenceReqParameters
      */
     void DoSchedUlNoiseInterferenceReq(
         const FfMacSchedSapProvider::SchedUlNoiseInterferenceReqParameters& params);
 
     /**
-     * \brief Sched UL SRS info request
-     * \param params FfMacSchedSapProvider::SchedUlSrInfoReqParameters
+     * @brief Sched UL SRS info request
+     * @param params FfMacSchedSapProvider::SchedUlSrInfoReqParameters
      */
     void DoSchedUlSrInfoReq(const FfMacSchedSapProvider::SchedUlSrInfoReqParameters& params);
 
     /**
-     * \brief Sched UL MAC control info request
-     * \param params FfMacSchedSapProvider::SchedUlMacCtrlInfoReqParameters
+     * @brief Sched UL MAC control info request
+     * @param params FfMacSchedSapProvider::SchedUlMacCtrlInfoReqParameters
      */
     void DoSchedUlMacCtrlInfoReq(
         const FfMacSchedSapProvider::SchedUlMacCtrlInfoReqParameters& params);
 
     /**
-     * \brief Sched UL CQI info request
-     * \param params FfMacSchedSapProvider::SchedUlCqiInfoReqParameters
+     * @brief Sched UL CQI info request
+     * @param params FfMacSchedSapProvider::SchedUlCqiInfoReqParameters
      */
     void DoSchedUlCqiInfoReq(const FfMacSchedSapProvider::SchedUlCqiInfoReqParameters& params);
 
     /**
-     * \brief Get RBG size function
-     * \param dlbandwidth the DL bandwidth
-     * \returns RBG size
+     * @brief Get RBG size function
+     * @param dlbandwidth the DL bandwidth
+     * @returns RBG size
      */
     int GetRbgSize(int dlbandwidth);
 
     /**
-     * \brief Sort RLC buffer request function
-     * \param i FfMacSchedSapProvider::SchedDlRlcBufferReqParameters
-     * \param j FfMacSchedSapProvider::SchedDlRlcBufferReqParameters
-     * \returns true if
+     * @brief Sort RLC buffer request function
+     * @param i FfMacSchedSapProvider::SchedDlRlcBufferReqParameters
+     * @param j FfMacSchedSapProvider::SchedDlRlcBufferReqParameters
+     * @returns true if
      */
     static bool SortRlcBufferReq(FfMacSchedSapProvider::SchedDlRlcBufferReqParameters i,
                                  FfMacSchedSapProvider::SchedDlRlcBufferReqParameters j);
@@ -206,37 +206,37 @@
     void RefreshUlCqiMaps();
 
     /**
-     * \brief Update DL RLC buffer info function
-     * \param rnti the RNTI
-     * \param lcid the LCID
-     * \param size the size
+     * @brief Update DL RLC buffer info function
+     * @param rnti the RNTI
+     * @param lcid the LCID
+     * @param size the size
      */
     void UpdateDlRlcBufferInfo(uint16_t rnti, uint8_t lcid, uint16_t size);
     /**
-     * \brief Update UL RLC buffer info function
-     * \param rnti the RNTI
-     * \param size the size
+     * @brief Update UL RLC buffer info function
+     * @param rnti the RNTI
+     * @param size the size
      */
     void UpdateUlRlcBufferInfo(uint16_t rnti, uint16_t size);
 
     /**
-     * \brief Update and return a new process Id for the RNTI specified
+     * @brief Update and return a new process Id for the RNTI specified
      *
-     * \param rnti the RNTI of the UE to be updated
-     * \return the process id  value
+     * @param rnti the RNTI of the UE to be updated
+     * @return the process id  value
      */
     uint8_t UpdateHarqProcessId(uint16_t rnti);
 
     /**
-     * \brief Return the availability of free process for the RNTI specified
+     * @brief Return the availability of free process for the RNTI specified
      *
-     * \param rnti the RNTI of the UE to be updated
-     * \return the availability
+     * @param rnti the RNTI of the UE to be updated
+     * @return the availability
      */
     bool HarqProcessAvailability(uint16_t rnti);
 
     /**
-     * \brief Refresh HARQ processes according to the timers
+     * @brief Refresh HARQ processes according to the timers
      *
      */
     void RefreshHarqProcesses();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/simple-ue-component-carrier-manager.cc ns-3.44/src/lte/model/simple-ue-component-carrier-manager.cc
--- ns-3.43/src/lte/model/simple-ue-component-carrier-manager.cc	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/model/simple-ue-component-carrier-manager.cc	2025-03-09 16:55:49.607372000 -0700
@@ -9,7 +9,7 @@
 
 #include "simple-ue-component-carrier-manager.h"
 
-#include <ns3/log.h>
+#include "ns3/log.h"
 
 namespace ns3
 {
@@ -33,7 +33,7 @@
     /**
      * Constructor
      *
-     * \param mac the component carrier manager
+     * @param mac the component carrier manager
      */
     SimpleUeCcmMacSapProvider(SimpleUeComponentCarrierManager* mac);
 
@@ -73,7 +73,7 @@
     /**
      * Constructor
      *
-     * \param mac the component carrier manager
+     * @param mac the component carrier manager
      */
     SimpleUeCcmMacSapUser(SimpleUeComponentCarrierManager* mac);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/simple-ue-component-carrier-manager.h ns-3.44/src/lte/model/simple-ue-component-carrier-manager.h
--- ns-3.43/src/lte/model/simple-ue-component-carrier-manager.h	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/model/simple-ue-component-carrier-manager.h	2025-03-09 16:55:49.607372000 -0700
@@ -21,7 +21,7 @@
 class LteUeCcmRrcSapProvider;
 
 /**
- * \brief Component carrier manager implementation which simply does nothing.
+ * @brief Component carrier manager implementation which simply does nothing.
  *
  * Selecting this component carrier selection algorithm is equivalent to disabling automatic
  * triggering of component carrier selection. This is the default choice.
@@ -36,8 +36,8 @@
     ~SimpleUeComponentCarrierManager() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -59,68 +59,68 @@
     void DoDispose() override;
     // inherited from LteCcsAlgorithm as a Component Carrier Management SAP implementation
     /**
-     * \brief Report Ue Measure function
-     * \param rnti the RNTI
-     * \param measResults the measure results
+     * @brief Report Ue Measure function
+     * @param rnti the RNTI
+     * @param measResults the measure results
      */
     void DoReportUeMeas(uint16_t rnti, LteRrcSap::MeasResults measResults);
     // forwarded from LteMacSapProvider
     /**
-     * \brief Transmit PDU function
-     * \param params LteMacSapProvider::TransmitPduParameters
+     * @brief Transmit PDU function
+     * @param params LteMacSapProvider::TransmitPduParameters
      */
     void DoTransmitPdu(LteMacSapProvider::TransmitPduParameters params);
     /**
-     * \brief Report buffer status function
-     * \param params LteMacSapProvider::ReportBufferStatusParameters
+     * @brief Report buffer status function
+     * @param params LteMacSapProvider::ReportBufferStatusParameters
      */
     virtual void DoReportBufferStatus(LteMacSapProvider::ReportBufferStatusParameters params);
     /// Notify HARQ deliver failure
     void DoNotifyHarqDeliveryFailure();
     // forwarded from LteMacSapUser
     /**
-     * \brief Notify TX opportunity function
+     * @brief Notify TX opportunity function
      *
-     * \param txOpParams the LteMacSapUser::TxOpportunityParameters
+     * @param txOpParams the LteMacSapUser::TxOpportunityParameters
      */
     void DoNotifyTxOpportunity(LteMacSapUser::TxOpportunityParameters txOpParams);
     /**
-     * \brief Receive PDU function
+     * @brief Receive PDU function
      *
-     * \param rxPduParams the LteMacSapUser::ReceivePduParameters
+     * @param rxPduParams the LteMacSapUser::ReceivePduParameters
      */
     void DoReceivePdu(LteMacSapUser::ReceivePduParameters rxPduParams);
     // forwarded from LteUeCcmRrcSapProvider
     /**
-     * \brief Add LC function
-     * \param lcId the LCID
-     * \param lcConfig the logical channel config
-     * \param msu the MSU
-     * \returns updated LC config list
+     * @brief Add LC function
+     * @param lcId the LCID
+     * @param lcConfig the logical channel config
+     * @param msu the MSU
+     * @returns updated LC config list
      */
     virtual std::vector<LteUeCcmRrcSapProvider::LcsConfig> DoAddLc(
         uint8_t lcId,
         LteUeCmacSapProvider::LogicalChannelConfig lcConfig,
         LteMacSapUser* msu);
     /**
-     * \brief Remove LC function
-     * \param lcid the LCID
-     * \returns updated LC list
+     * @brief Remove LC function
+     * @param lcid the LCID
+     * @returns updated LC list
      */
     std::vector<uint16_t> DoRemoveLc(uint8_t lcid);
     /**
-     * \brief Configure signal bearer function
-     * \param lcId the LCID
-     * \param lcConfig the logical channel config
-     * \param msu the MSU
-     * \returns LteMacSapUser *
+     * @brief Configure signal bearer function
+     * @param lcId the LCID
+     * @param lcConfig the logical channel config
+     * @param msu the MSU
+     * @returns LteMacSapUser *
      */
     virtual LteMacSapUser* DoConfigureSignalBearer(
         uint8_t lcId,
         LteUeCmacSapProvider::LogicalChannelConfig lcConfig,
         LteMacSapUser* msu);
     /**
-     * \brief Reset LC map
+     * @brief Reset LC map
      *
      */
     void DoReset();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/tdbet-ff-mac-scheduler.cc ns-3.44/src/lte/model/tdbet-ff-mac-scheduler.cc
--- ns-3.43/src/lte/model/tdbet-ff-mac-scheduler.cc	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/model/tdbet-ff-mac-scheduler.cc	2025-03-09 16:55:49.607372000 -0700
@@ -12,11 +12,11 @@
 #include "lte-amc.h"
 #include "lte-vendor-specific-parameters.h"
 
-#include <ns3/boolean.h>
-#include <ns3/log.h>
-#include <ns3/math.h>
-#include <ns3/pointer.h>
-#include <ns3/simulator.h>
+#include "ns3/boolean.h"
+#include "ns3/log.h"
+#include "ns3/math.h"
+#include "ns3/pointer.h"
+#include "ns3/simulator.h"
 
 #include <cfloat>
 #include <set>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/tdbet-ff-mac-scheduler.h ns-3.44/src/lte/model/tdbet-ff-mac-scheduler.h
--- ns-3.43/src/lte/model/tdbet-ff-mac-scheduler.h	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/model/tdbet-ff-mac-scheduler.h	2025-03-09 16:55:49.607372000 -0700
@@ -17,7 +17,7 @@
 #include "lte-common.h"
 #include "lte-ffr-sap.h"
 
-#include <ns3/nstime.h>
+#include "ns3/nstime.h"
 
 #include <map>
 #include <vector>
@@ -35,8 +35,8 @@
 };
 
 /**
- * \ingroup ff-api
- * \brief Implements the SCHED SAP and CSCHED SAP for a Time Domain Blind Equal Throughput scheduler
+ * @ingroup ff-api
+ * @brief Implements the SCHED SAP and CSCHED SAP for a Time Domain Blind Equal Throughput scheduler
  *
  * This class implements the interface defined by the FfMacScheduler abstract class
  */
@@ -45,7 +45,7 @@
 {
   public:
     /**
-     * \brief Constructor
+     * @brief Constructor
      *
      * Creates the MAC Scheduler interface implementation
      */
@@ -59,8 +59,8 @@
     // inherited from Object
     void DoDispose() override;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -80,9 +80,9 @@
     friend class MemberSchedSapProvider<TdBetFfMacScheduler>;
 
     /**
-     * \brief Transmission mode configuration update function
-     * \param rnti the RNTI
-     * \param txMode the transmission mode
+     * @brief Transmission mode configuration update function
+     * @param rnti the RNTI
+     * @param txMode the transmission mode
      */
     void TransmissionModeConfigurationUpdate(uint16_t rnti, uint8_t txMode);
 
@@ -93,32 +93,32 @@
     //
 
     /**
-     * \brief CSched cell config request
-     * \param params FfMacCschedSapProvider::CschedCellConfigReqParameters
+     * @brief CSched cell config request
+     * @param params FfMacCschedSapProvider::CschedCellConfigReqParameters
      */
     void DoCschedCellConfigReq(const FfMacCschedSapProvider::CschedCellConfigReqParameters& params);
 
     /**
-     * \brief CSched UE config request
-     * \param params FfMacCschedSapProvider::CschedUeConfigReqParameters
+     * @brief CSched UE config request
+     * @param params FfMacCschedSapProvider::CschedUeConfigReqParameters
      */
     void DoCschedUeConfigReq(const FfMacCschedSapProvider::CschedUeConfigReqParameters& params);
 
     /**
-     * \brief CSched LC config request
-     * \param params FfMacCschedSapProvider::CschedLcConfigReqParameters
+     * @brief CSched LC config request
+     * @param params FfMacCschedSapProvider::CschedLcConfigReqParameters
      */
     void DoCschedLcConfigReq(const FfMacCschedSapProvider::CschedLcConfigReqParameters& params);
 
     /**
-     * \brief CSched LC release request
-     * \param params FfMacCschedSapProvider::CschedLcReleaseReqParameters
+     * @brief CSched LC release request
+     * @param params FfMacCschedSapProvider::CschedLcReleaseReqParameters
      */
     void DoCschedLcReleaseReq(const FfMacCschedSapProvider::CschedLcReleaseReqParameters& params);
 
     /**
-     * \brief CSched UE release request
-     * \param params FfMacCschedSapProvider::CschedUeReleaseReqParameters
+     * @brief CSched UE release request
+     * @param params FfMacCschedSapProvider::CschedUeReleaseReqParameters
      */
     void DoCschedUeReleaseReq(const FfMacCschedSapProvider::CschedUeReleaseReqParameters& params);
 
@@ -128,93 +128,93 @@
     //
 
     /**
-     * \brief Sched DL RLC buffer request
-     * \param params FfMacSchedSapProvider::SchedDlRlcBufferReqParameters
+     * @brief Sched DL RLC buffer request
+     * @param params FfMacSchedSapProvider::SchedDlRlcBufferReqParameters
      */
     void DoSchedDlRlcBufferReq(const FfMacSchedSapProvider::SchedDlRlcBufferReqParameters& params);
 
     /**
-     * \brief Sched DL paging buffer request
-     * \param params FfMacSchedSapProvider::SchedDlPagingBufferReqParameters
+     * @brief Sched DL paging buffer request
+     * @param params FfMacSchedSapProvider::SchedDlPagingBufferReqParameters
      */
     void DoSchedDlPagingBufferReq(
         const FfMacSchedSapProvider::SchedDlPagingBufferReqParameters& params);
 
     /**
-     * \brief Sched DL MAC buffer request
-     * \param params FfMacSchedSapProvider::SchedDlMacBufferReqParameters
+     * @brief Sched DL MAC buffer request
+     * @param params FfMacSchedSapProvider::SchedDlMacBufferReqParameters
      */
     void DoSchedDlMacBufferReq(const FfMacSchedSapProvider::SchedDlMacBufferReqParameters& params);
 
     /**
-     * \brief Sched DL trigger request
-     * \param params FfMacSchedSapProvider::SchedDlTriggerReqParameters
+     * @brief Sched DL trigger request
+     * @param params FfMacSchedSapProvider::SchedDlTriggerReqParameters
      */
     void DoSchedDlTriggerReq(const FfMacSchedSapProvider::SchedDlTriggerReqParameters& params);
 
     /**
-     * \brief Sched DL RACH info request
-     * \param params FfMacSchedSapProvider::SchedDlRachInfoReqParameters
+     * @brief Sched DL RACH info request
+     * @param params FfMacSchedSapProvider::SchedDlRachInfoReqParameters
      */
     void DoSchedDlRachInfoReq(const FfMacSchedSapProvider::SchedDlRachInfoReqParameters& params);
 
     /**
-     * \brief Sched DL CQI info request
-     * \param params FfMacSchedSapProvider::SchedDlCqiInfoReqParameters
+     * @brief Sched DL CQI info request
+     * @param params FfMacSchedSapProvider::SchedDlCqiInfoReqParameters
      */
     void DoSchedDlCqiInfoReq(const FfMacSchedSapProvider::SchedDlCqiInfoReqParameters& params);
 
     /**
-     * \brief Sched UL trigger request
-     * \param params FfMacSchedSapProvider::SchedUlTriggerReqParameters
+     * @brief Sched UL trigger request
+     * @param params FfMacSchedSapProvider::SchedUlTriggerReqParameters
      */
     void DoSchedUlTriggerReq(const FfMacSchedSapProvider::SchedUlTriggerReqParameters& params);
 
     /**
-     * \brief Sched UL noise interference request
-     * \param params FfMacSchedSapProvider::SchedUlNoiseInterferenceReqParameters
+     * @brief Sched UL noise interference request
+     * @param params FfMacSchedSapProvider::SchedUlNoiseInterferenceReqParameters
      */
     void DoSchedUlNoiseInterferenceReq(
         const FfMacSchedSapProvider::SchedUlNoiseInterferenceReqParameters& params);
 
     /**
-     * \brief Sched UL SR info request
-     * \param params FfMacSchedSapProvider::SchedUlSrInfoReqParameters
+     * @brief Sched UL SR info request
+     * @param params FfMacSchedSapProvider::SchedUlSrInfoReqParameters
      */
     void DoSchedUlSrInfoReq(const FfMacSchedSapProvider::SchedUlSrInfoReqParameters& params);
 
     /**
-     * \brief Sched UL MAC control info request
-     * \param params FfMacSchedSapProvider::SchedUlMacCtrlInfoReqParameters
+     * @brief Sched UL MAC control info request
+     * @param params FfMacSchedSapProvider::SchedUlMacCtrlInfoReqParameters
      */
     void DoSchedUlMacCtrlInfoReq(
         const FfMacSchedSapProvider::SchedUlMacCtrlInfoReqParameters& params);
 
     /**
-     * \brief Sched UL CQI info request
-     * \param params FfMacSchedSapProvider::SchedUlCqiInfoReqParameters
+     * @brief Sched UL CQI info request
+     * @param params FfMacSchedSapProvider::SchedUlCqiInfoReqParameters
      */
     void DoSchedUlCqiInfoReq(const FfMacSchedSapProvider::SchedUlCqiInfoReqParameters& params);
 
     /**
-     * \brief Get RBG size function
-     * \param dlbandwidth DL bandwidth
-     * \returns RBG size
+     * @brief Get RBG size function
+     * @param dlbandwidth DL bandwidth
+     * @returns RBG size
      */
     int GetRbgSize(int dlbandwidth);
 
     /**
-     * \brief LC active flow function
-     * \param rnti the RNTI
-     * \returns LC active flow
+     * @brief LC active flow function
+     * @param rnti the RNTI
+     * @returns LC active flow
      */
     unsigned int LcActivePerFlow(uint16_t rnti);
 
     /**
-     * \brief Estimate UL SINR function
-     * \param rnti the RNTI
-     * \param rb the RB
-     * \returns SINR
+     * @brief Estimate UL SINR function
+     * @param rnti the RNTI
+     * @param rb the RB
+     * @returns SINR
      */
     double EstimateUlSinr(uint16_t rnti, uint16_t rb);
 
@@ -224,37 +224,37 @@
     void RefreshUlCqiMaps();
 
     /**
-     * \brief Update DL RLC buffer info function
-     * \param rnti the RNTI
-     * \param lcid the LCID
-     * \param size the size
+     * @brief Update DL RLC buffer info function
+     * @param rnti the RNTI
+     * @param lcid the LCID
+     * @param size the size
      */
     void UpdateDlRlcBufferInfo(uint16_t rnti, uint8_t lcid, uint16_t size);
     /**
-     * \brief Update UL RLC buffer info function
-     * \param rnti the RNTI
-     * \param size the size
+     * @brief Update UL RLC buffer info function
+     * @param rnti the RNTI
+     * @param size the size
      */
     void UpdateUlRlcBufferInfo(uint16_t rnti, uint16_t size);
 
     /**
-     * \brief Update and return a new process Id for the RNTI specified
+     * @brief Update and return a new process Id for the RNTI specified
      *
-     * \param rnti the RNTI of the UE to be updated
-     * \return the process id  value
+     * @param rnti the RNTI of the UE to be updated
+     * @return the process id  value
      */
     uint8_t UpdateHarqProcessId(uint16_t rnti);
 
     /**
-     * \brief Return the availability of free process for the RNTI specified
+     * @brief Return the availability of free process for the RNTI specified
      *
-     * \param rnti the RNTI of the UE to be updated
-     * \return the availability
+     * @param rnti the RNTI of the UE to be updated
+     * @return the availability
      */
     bool HarqProcessAvailability(uint16_t rnti);
 
     /**
-     * \brief Refresh HARQ processes according to the timers
+     * @brief Refresh HARQ processes according to the timers
      *
      */
     void RefreshHarqProcesses();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/tdmt-ff-mac-scheduler.cc ns-3.44/src/lte/model/tdmt-ff-mac-scheduler.cc
--- ns-3.43/src/lte/model/tdmt-ff-mac-scheduler.cc	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/model/tdmt-ff-mac-scheduler.cc	2025-03-09 16:55:49.607372000 -0700
@@ -12,11 +12,11 @@
 #include "lte-amc.h"
 #include "lte-vendor-specific-parameters.h"
 
-#include <ns3/boolean.h>
-#include <ns3/log.h>
-#include <ns3/math.h>
-#include <ns3/pointer.h>
-#include <ns3/simulator.h>
+#include "ns3/boolean.h"
+#include "ns3/log.h"
+#include "ns3/math.h"
+#include "ns3/pointer.h"
+#include "ns3/simulator.h"
 
 #include <cfloat>
 #include <set>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/tdmt-ff-mac-scheduler.h ns-3.44/src/lte/model/tdmt-ff-mac-scheduler.h
--- ns-3.43/src/lte/model/tdmt-ff-mac-scheduler.h	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/model/tdmt-ff-mac-scheduler.h	2025-03-09 16:55:49.607372000 -0700
@@ -17,7 +17,7 @@
 #include "lte-common.h"
 #include "lte-ffr-sap.h"
 
-#include <ns3/nstime.h>
+#include "ns3/nstime.h"
 
 #include <map>
 #include <set>
@@ -27,8 +27,8 @@
 {
 
 /**
- * \ingroup ff-api
- * \brief Implements the SCHED SAP and CSCHED SAP for a Time Domain Maximize Throughput scheduler
+ * @ingroup ff-api
+ * @brief Implements the SCHED SAP and CSCHED SAP for a Time Domain Maximize Throughput scheduler
  *
  * This class implements the interface defined by the FfMacScheduler abstract class
  */
@@ -37,7 +37,7 @@
 {
   public:
     /**
-     * \brief Constructor
+     * @brief Constructor
      *
      * Creates the MAC Scheduler interface implementation
      */
@@ -51,8 +51,8 @@
     // inherited from Object
     void DoDispose() override;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -72,9 +72,9 @@
     friend class MemberSchedSapProvider<TdMtFfMacScheduler>;
 
     /**
-     * \brief Transmission mode configuration update function
-     * \param rnti the RNTI
-     * \param txMode the transmission mode
+     * @brief Transmission mode configuration update function
+     * @param rnti the RNTI
+     * @param txMode the transmission mode
      */
     void TransmissionModeConfigurationUpdate(uint16_t rnti, uint8_t txMode);
 
@@ -85,32 +85,32 @@
     //
 
     /**
-     * \brief CSched cell config request
-     * \param params FfMacCschedSapProvider::CschedCellConfigReqParameters
+     * @brief CSched cell config request
+     * @param params FfMacCschedSapProvider::CschedCellConfigReqParameters
      */
     void DoCschedCellConfigReq(const FfMacCschedSapProvider::CschedCellConfigReqParameters& params);
 
     /**
-     * \brief CSched UE config request
-     * \param params FfMacCschedSapProvider::CschedUeConfigReqParameters
+     * @brief CSched UE config request
+     * @param params FfMacCschedSapProvider::CschedUeConfigReqParameters
      */
     void DoCschedUeConfigReq(const FfMacCschedSapProvider::CschedUeConfigReqParameters& params);
 
     /**
-     * \brief CSched LC config request
-     * \param params FfMacCschedSapProvider::CschedLcConfigReqParameters
+     * @brief CSched LC config request
+     * @param params FfMacCschedSapProvider::CschedLcConfigReqParameters
      */
     void DoCschedLcConfigReq(const FfMacCschedSapProvider::CschedLcConfigReqParameters& params);
 
     /**
-     * \brief CSched LC release request
-     * \param params FfMacCschedSapProvider::CschedLcReleaseReqParameters
+     * @brief CSched LC release request
+     * @param params FfMacCschedSapProvider::CschedLcReleaseReqParameters
      */
     void DoCschedLcReleaseReq(const FfMacCschedSapProvider::CschedLcReleaseReqParameters& params);
 
     /**
-     * \brief CSched UE release request
-     * \param params FfMacCschedSapProvider::CschedUeReleaseReqParameters
+     * @brief CSched UE release request
+     * @param params FfMacCschedSapProvider::CschedUeReleaseReqParameters
      */
     void DoCschedUeReleaseReq(const FfMacCschedSapProvider::CschedUeReleaseReqParameters& params);
 
@@ -120,93 +120,93 @@
     //
 
     /**
-     * \brief Sched DL RLC buffer request
-     * \param params FfMacSchedSapProvider::SchedDlRlcBufferReqParameters
+     * @brief Sched DL RLC buffer request
+     * @param params FfMacSchedSapProvider::SchedDlRlcBufferReqParameters
      */
     void DoSchedDlRlcBufferReq(const FfMacSchedSapProvider::SchedDlRlcBufferReqParameters& params);
 
     /**
-     * \brief Sched DL paging buffer request
-     * \param params FfMacSchedSapProvider::SchedDlPagingBufferReqParameters
+     * @brief Sched DL paging buffer request
+     * @param params FfMacSchedSapProvider::SchedDlPagingBufferReqParameters
      */
     void DoSchedDlPagingBufferReq(
         const FfMacSchedSapProvider::SchedDlPagingBufferReqParameters& params);
 
     /**
-     * \brief Sched DL MAC buffer request
-     * \param params FfMacSchedSapProvider::SchedDlMacBufferReqParameters
+     * @brief Sched DL MAC buffer request
+     * @param params FfMacSchedSapProvider::SchedDlMacBufferReqParameters
      */
     void DoSchedDlMacBufferReq(const FfMacSchedSapProvider::SchedDlMacBufferReqParameters& params);
 
     /**
-     * \brief Sched DL trigger request
-     * \param params FfMacSchedSapProvider::SchedDlTriggerReqParameters
+     * @brief Sched DL trigger request
+     * @param params FfMacSchedSapProvider::SchedDlTriggerReqParameters
      */
     void DoSchedDlTriggerReq(const FfMacSchedSapProvider::SchedDlTriggerReqParameters& params);
 
     /**
-     * \brief Sched DL RACH info request
-     * \param params FfMacSchedSapProvider::SchedDlRachInfoReqParameters
+     * @brief Sched DL RACH info request
+     * @param params FfMacSchedSapProvider::SchedDlRachInfoReqParameters
      */
     void DoSchedDlRachInfoReq(const FfMacSchedSapProvider::SchedDlRachInfoReqParameters& params);
 
     /**
-     * \brief Sched DL CQI info request
-     * \param params FfMacSchedSapProvider::SchedDlCqiInfoReqParameters
+     * @brief Sched DL CQI info request
+     * @param params FfMacSchedSapProvider::SchedDlCqiInfoReqParameters
      */
     void DoSchedDlCqiInfoReq(const FfMacSchedSapProvider::SchedDlCqiInfoReqParameters& params);
 
     /**
-     * \brief Sched UL trigger request
-     * \param params FfMacSchedSapProvider::SchedUlTriggerReqParameters
+     * @brief Sched UL trigger request
+     * @param params FfMacSchedSapProvider::SchedUlTriggerReqParameters
      */
     void DoSchedUlTriggerReq(const FfMacSchedSapProvider::SchedUlTriggerReqParameters& params);
 
     /**
-     * \brief Sched UL noise interference request
-     * \param params FfMacSchedSapProvider::SchedUlNoiseInterferenceReqParameters
+     * @brief Sched UL noise interference request
+     * @param params FfMacSchedSapProvider::SchedUlNoiseInterferenceReqParameters
      */
     void DoSchedUlNoiseInterferenceReq(
         const FfMacSchedSapProvider::SchedUlNoiseInterferenceReqParameters& params);
 
     /**
-     * \brief Sched UL SR info request
-     * \param params FfMacSchedSapProvider::SchedUlSrInfoReqParameters
+     * @brief Sched UL SR info request
+     * @param params FfMacSchedSapProvider::SchedUlSrInfoReqParameters
      */
     void DoSchedUlSrInfoReq(const FfMacSchedSapProvider::SchedUlSrInfoReqParameters& params);
 
     /**
-     * \brief Sched UL MAC control info request
-     * \param params FfMacSchedSapProvider::SchedUlMacCtrlInfoReqParameters
+     * @brief Sched UL MAC control info request
+     * @param params FfMacSchedSapProvider::SchedUlMacCtrlInfoReqParameters
      */
     void DoSchedUlMacCtrlInfoReq(
         const FfMacSchedSapProvider::SchedUlMacCtrlInfoReqParameters& params);
 
     /**
-     * \brief Sched UL CQI info request
-     * \param params FfMacSchedSapProvider::SchedUlCqiInfoReqParameters
+     * @brief Sched UL CQI info request
+     * @param params FfMacSchedSapProvider::SchedUlCqiInfoReqParameters
      */
     void DoSchedUlCqiInfoReq(const FfMacSchedSapProvider::SchedUlCqiInfoReqParameters& params);
 
     /**
-     * \brief Get RBG size function
-     * \param dlbandwidth the DL bandwidth
-     * \returns the RBG size
+     * @brief Get RBG size function
+     * @param dlbandwidth the DL bandwidth
+     * @returns the RBG size
      */
     int GetRbgSize(int dlbandwidth);
 
     /**
-     * \brief LC active flow function
-     * \param rnti the RNTI
-     * \returns the LC active flow
+     * @brief LC active flow function
+     * @param rnti the RNTI
+     * @returns the LC active flow
      */
     unsigned int LcActivePerFlow(uint16_t rnti);
 
     /**
-     * \brief Estimate UL SINR function
-     * \param rnti the RNTI
-     * \param rb the RB
-     * \returns the SINR
+     * @brief Estimate UL SINR function
+     * @param rnti the RNTI
+     * @param rb the RB
+     * @returns the SINR
      */
     double EstimateUlSinr(uint16_t rnti, uint16_t rb);
 
@@ -216,37 +216,37 @@
     void RefreshUlCqiMaps();
 
     /**
-     * \brief Update DL RLC buffer info function
-     * \param rnti the RNTI
-     * \param lcid the LCID
-     * \param size the size
+     * @brief Update DL RLC buffer info function
+     * @param rnti the RNTI
+     * @param lcid the LCID
+     * @param size the size
      */
     void UpdateDlRlcBufferInfo(uint16_t rnti, uint8_t lcid, uint16_t size);
     /**
-     * \brief Update UL RLC buffer info function
-     * \param rnti the RNTI
-     * \param size the size
+     * @brief Update UL RLC buffer info function
+     * @param rnti the RNTI
+     * @param size the size
      */
     void UpdateUlRlcBufferInfo(uint16_t rnti, uint16_t size);
 
     /**
-     * \brief Update and return a new process Id for the RNTI specified
+     * @brief Update and return a new process Id for the RNTI specified
      *
-     * \param rnti the RNTI of the UE to be updated
-     * \return the process id  value
+     * @param rnti the RNTI of the UE to be updated
+     * @return the process id  value
      */
     uint8_t UpdateHarqProcessId(uint16_t rnti);
 
     /**
-     * \brief Return the availability of free process for the RNTI specified
+     * @brief Return the availability of free process for the RNTI specified
      *
-     * \param rnti the RNTI of the UE to be updated
-     * \return the availability
+     * @param rnti the RNTI of the UE to be updated
+     * @return the availability
      */
     bool HarqProcessAvailability(uint16_t rnti);
 
     /**
-     * \brief Refresh HARQ processes according to the timers
+     * @brief Refresh HARQ processes according to the timers
      *
      */
     void RefreshHarqProcesses();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/tdtbfq-ff-mac-scheduler.cc ns-3.44/src/lte/model/tdtbfq-ff-mac-scheduler.cc
--- ns-3.43/src/lte/model/tdtbfq-ff-mac-scheduler.cc	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/model/tdtbfq-ff-mac-scheduler.cc	2025-03-09 16:55:49.607372000 -0700
@@ -12,12 +12,12 @@
 #include "lte-amc.h"
 #include "lte-vendor-specific-parameters.h"
 
-#include <ns3/boolean.h>
-#include <ns3/integer.h>
-#include <ns3/log.h>
-#include <ns3/math.h>
-#include <ns3/pointer.h>
-#include <ns3/simulator.h>
+#include "ns3/boolean.h"
+#include "ns3/integer.h"
+#include "ns3/log.h"
+#include "ns3/math.h"
+#include "ns3/pointer.h"
+#include "ns3/simulator.h"
 
 #include <cfloat>
 #include <set>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/tdtbfq-ff-mac-scheduler.h ns-3.44/src/lte/model/tdtbfq-ff-mac-scheduler.h
--- ns-3.43/src/lte/model/tdtbfq-ff-mac-scheduler.h	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/model/tdtbfq-ff-mac-scheduler.h	2025-03-09 16:55:49.607372000 -0700
@@ -17,7 +17,7 @@
 #include "lte-common.h"
 #include "lte-ffr-sap.h"
 
-#include <ns3/nstime.h>
+#include "ns3/nstime.h"
 
 #include <map>
 #include <vector>
@@ -44,8 +44,8 @@
 };
 
 /**
- * \ingroup ff-api
- * \brief Implements the SCHED SAP and CSCHED SAP for a Time Domain Token Bank Fair Queue  scheduler
+ * @ingroup ff-api
+ * @brief Implements the SCHED SAP and CSCHED SAP for a Time Domain Token Bank Fair Queue  scheduler
  *
  * This class implements the interface defined by the FfMacScheduler abstract class
  */
@@ -54,7 +54,7 @@
 {
   public:
     /**
-     * \brief Constructor
+     * @brief Constructor
      *
      * Creates the MAC Scheduler interface implementation
      */
@@ -68,8 +68,8 @@
     // inherited from Object
     void DoDispose() override;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -89,9 +89,9 @@
     friend class MemberSchedSapProvider<TdTbfqFfMacScheduler>;
 
     /**
-     * \brief Transmission mde configuration update function
-     * \param rnti the RNTI
-     * \param txMode the transmission mode
+     * @brief Transmission mde configuration update function
+     * @param rnti the RNTI
+     * @param txMode the transmission mode
      */
     void TransmissionModeConfigurationUpdate(uint16_t rnti, uint8_t txMode);
 
@@ -102,32 +102,32 @@
     //
 
     /**
-     * \brief CSched cell config request
-     * \param params FfMacCschedSapProvider::CschedCellConfigReqParameters
+     * @brief CSched cell config request
+     * @param params FfMacCschedSapProvider::CschedCellConfigReqParameters
      */
     void DoCschedCellConfigReq(const FfMacCschedSapProvider::CschedCellConfigReqParameters& params);
 
     /**
-     * \brief CSched UE config request
-     * \param params FfMacCschedSapProvider::CschedUeConfigReqParameters
+     * @brief CSched UE config request
+     * @param params FfMacCschedSapProvider::CschedUeConfigReqParameters
      */
     void DoCschedUeConfigReq(const FfMacCschedSapProvider::CschedUeConfigReqParameters& params);
 
     /**
-     * \brief CSched LC config request
-     * \param params FfMacCschedSapProvider::CschedLcConfigReqParameters
+     * @brief CSched LC config request
+     * @param params FfMacCschedSapProvider::CschedLcConfigReqParameters
      */
     void DoCschedLcConfigReq(const FfMacCschedSapProvider::CschedLcConfigReqParameters& params);
 
     /**
-     * \brief CSched LC release request
-     * \param params FfMacCschedSapProvider::CschedLcReleaseReqParameters
+     * @brief CSched LC release request
+     * @param params FfMacCschedSapProvider::CschedLcReleaseReqParameters
      */
     void DoCschedLcReleaseReq(const FfMacCschedSapProvider::CschedLcReleaseReqParameters& params);
 
     /**
-     * \brief CSched UE release request
-     * \param params FfMacCschedSapProvider::CschedUeReleaseReqParameters
+     * @brief CSched UE release request
+     * @param params FfMacCschedSapProvider::CschedUeReleaseReqParameters
      */
     void DoCschedUeReleaseReq(const FfMacCschedSapProvider::CschedUeReleaseReqParameters& params);
 
@@ -137,93 +137,93 @@
     //
 
     /**
-     * \brief Sched DL RLC buffer request
-     * \param params FfMacSchedSapProvider::SchedDlRlcBufferReqParameters
+     * @brief Sched DL RLC buffer request
+     * @param params FfMacSchedSapProvider::SchedDlRlcBufferReqParameters
      */
     void DoSchedDlRlcBufferReq(const FfMacSchedSapProvider::SchedDlRlcBufferReqParameters& params);
 
     /**
-     * \brief Sched DL paging buffer request
-     * \param params FfMacSchedSapProvider::SchedDlPagingBufferReqParameters
+     * @brief Sched DL paging buffer request
+     * @param params FfMacSchedSapProvider::SchedDlPagingBufferReqParameters
      */
     void DoSchedDlPagingBufferReq(
         const FfMacSchedSapProvider::SchedDlPagingBufferReqParameters& params);
 
     /**
-     * \brief Sched DL MAC buffer request
-     * \param params FfMacSchedSapProvider::SchedDlMacBufferReqParameters
+     * @brief Sched DL MAC buffer request
+     * @param params FfMacSchedSapProvider::SchedDlMacBufferReqParameters
      */
     void DoSchedDlMacBufferReq(const FfMacSchedSapProvider::SchedDlMacBufferReqParameters& params);
 
     /**
-     * \brief Sched DL trigger request
-     * \param params FfMacSchedSapProvider::SchedDlTriggerReqParameters
+     * @brief Sched DL trigger request
+     * @param params FfMacSchedSapProvider::SchedDlTriggerReqParameters
      */
     void DoSchedDlTriggerReq(const FfMacSchedSapProvider::SchedDlTriggerReqParameters& params);
 
     /**
-     * \brief Sched DL RACH info request
-     * \param params FfMacSchedSapProvider::SchedDlRachInfoReqParameters
+     * @brief Sched DL RACH info request
+     * @param params FfMacSchedSapProvider::SchedDlRachInfoReqParameters
      */
     void DoSchedDlRachInfoReq(const FfMacSchedSapProvider::SchedDlRachInfoReqParameters& params);
 
     /**
-     * \brief Sched DL CQI info request
-     * \param params FfMacSchedSapProvider::SchedDlCqiInfoReqParameters
+     * @brief Sched DL CQI info request
+     * @param params FfMacSchedSapProvider::SchedDlCqiInfoReqParameters
      */
     void DoSchedDlCqiInfoReq(const FfMacSchedSapProvider::SchedDlCqiInfoReqParameters& params);
 
     /**
-     * \brief Sched UL trigger request
-     * \param params FfMacSchedSapProvider::SchedUlTriggerReqParameters
+     * @brief Sched UL trigger request
+     * @param params FfMacSchedSapProvider::SchedUlTriggerReqParameters
      */
     void DoSchedUlTriggerReq(const FfMacSchedSapProvider::SchedUlTriggerReqParameters& params);
 
     /**
-     * \brief Sched UL noise interference request
-     * \param params FfMacSchedSapProvider::SchedUlNoiseInterferenceReqParameters
+     * @brief Sched UL noise interference request
+     * @param params FfMacSchedSapProvider::SchedUlNoiseInterferenceReqParameters
      */
     void DoSchedUlNoiseInterferenceReq(
         const FfMacSchedSapProvider::SchedUlNoiseInterferenceReqParameters& params);
 
     /**
-     * \brief Sched UL SR info request
-     * \param params FfMacSchedSapProvider::SchedUlSrInfoReqParameters
+     * @brief Sched UL SR info request
+     * @param params FfMacSchedSapProvider::SchedUlSrInfoReqParameters
      */
     void DoSchedUlSrInfoReq(const FfMacSchedSapProvider::SchedUlSrInfoReqParameters& params);
 
     /**
-     * \brief Sched UL MAC control info request
-     * \param params FfMacSchedSapProvider::SchedUlMacCtrlInfoReqParameters
+     * @brief Sched UL MAC control info request
+     * @param params FfMacSchedSapProvider::SchedUlMacCtrlInfoReqParameters
      */
     void DoSchedUlMacCtrlInfoReq(
         const FfMacSchedSapProvider::SchedUlMacCtrlInfoReqParameters& params);
 
     /**
-     * \brief Sched UL CQI info request
-     * \param params FfMacSchedSapProvider::SchedUlCqiInfoReqParameters
+     * @brief Sched UL CQI info request
+     * @param params FfMacSchedSapProvider::SchedUlCqiInfoReqParameters
      */
     void DoSchedUlCqiInfoReq(const FfMacSchedSapProvider::SchedUlCqiInfoReqParameters& params);
 
     /**
-     * \brief Get RBG size
-     * \param dlbandwidth he DL bandwidth
-     * \returns the RBG size
+     * @brief Get RBG size
+     * @param dlbandwidth he DL bandwidth
+     * @returns the RBG size
      */
     int GetRbgSize(int dlbandwidth);
 
     /**
-     * \brief LC active flow size
-     * \param rnti the RNTI
-     * \returns the LC active flow
+     * @brief LC active flow size
+     * @param rnti the RNTI
+     * @returns the LC active flow
      */
     unsigned int LcActivePerFlow(uint16_t rnti);
 
     /**
-     * \brief Estimate UL SINR function
-     * \param rnti the RNTI
-     * \param rb the RB
-     * \returns the SINR
+     * @brief Estimate UL SINR function
+     * @param rnti the RNTI
+     * @param rb the RB
+     * @returns the SINR
      */
     double EstimateUlSinr(uint16_t rnti, uint16_t rb);
 
@@ -233,37 +233,37 @@
     void RefreshUlCqiMaps();
 
     /**
-     * \brief Update DL RLC buffer info function
-     * \param rnti the RNTI
-     * \param lcid the LCID
-     * \param size the size
+     * @brief Update DL RLC buffer info function
+     * @param rnti the RNTI
+     * @param lcid the LCID
+     * @param size the size
      */
     void UpdateDlRlcBufferInfo(uint16_t rnti, uint8_t lcid, uint16_t size);
     /**
-     * \brief Update UL RLC buffer info function
-     * \param rnti the RNTI
-     * \param size the size
+     * @brief Update UL RLC buffer info function
+     * @param rnti the RNTI
+     * @param size the size
      */
     void UpdateUlRlcBufferInfo(uint16_t rnti, uint16_t size);
 
     /**
-     * \brief Update and return a new process Id for the RNTI specified
+     * @brief Update and return a new process Id for the RNTI specified
      *
-     * \param rnti the RNTI of the UE to be updated
-     * \return the process id  value
+     * @param rnti the RNTI of the UE to be updated
+     * @return the process id  value
      */
     uint8_t UpdateHarqProcessId(uint16_t rnti);
 
     /**
-     * \brief Return the availability of free process for the RNTI specified
+     * @brief Return the availability of free process for the RNTI specified
      *
-     * \param rnti the RNTI of the UE to be updated
-     * \return the availability
+     * @param rnti the RNTI of the UE to be updated
+     * @return the availability
      */
     bool HarqProcessAvailability(uint16_t rnti);
 
     /**
-     * \brief Refresh HARQ processes according to the timers
+     * @brief Refresh HARQ processes according to the timers
      *
      */
     void RefreshHarqProcesses();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/tta-ff-mac-scheduler.cc ns-3.44/src/lte/model/tta-ff-mac-scheduler.cc
--- ns-3.43/src/lte/model/tta-ff-mac-scheduler.cc	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/model/tta-ff-mac-scheduler.cc	2025-03-09 16:55:49.607372000 -0700
@@ -12,11 +12,11 @@
 #include "lte-amc.h"
 #include "lte-vendor-specific-parameters.h"
 
-#include <ns3/boolean.h>
-#include <ns3/log.h>
-#include <ns3/math.h>
-#include <ns3/pointer.h>
-#include <ns3/simulator.h>
+#include "ns3/boolean.h"
+#include "ns3/log.h"
+#include "ns3/math.h"
+#include "ns3/pointer.h"
+#include "ns3/simulator.h"
 
 #include <cfloat>
 #include <set>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/model/tta-ff-mac-scheduler.h ns-3.44/src/lte/model/tta-ff-mac-scheduler.h
--- ns-3.43/src/lte/model/tta-ff-mac-scheduler.h	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/model/tta-ff-mac-scheduler.h	2025-03-09 16:55:49.607372000 -0700
@@ -17,7 +17,7 @@
 #include "lte-common.h"
 #include "lte-ffr-sap.h"
 
-#include <ns3/nstime.h>
+#include "ns3/nstime.h"
 
 #include <map>
 #include <set>
@@ -27,8 +27,8 @@
 {
 
 /**
- * \ingroup ff-api
- * \brief Implements the SCHED SAP and CSCHED SAP for a Throughput to Average scheduler
+ * @ingroup ff-api
+ * @brief Implements the SCHED SAP and CSCHED SAP for a Throughput to Average scheduler
  *
  * This class implements the interface defined by the FfMacScheduler abstract class
  */
@@ -37,7 +37,7 @@
 {
   public:
     /**
-     * \brief Constructor
+     * @brief Constructor
      *
      * Creates the MAC Scheduler interface implementation
      */
@@ -51,8 +51,8 @@
     // inherited from Object
     void DoDispose() override;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -72,9 +72,9 @@
     friend class MemberSchedSapProvider<TtaFfMacScheduler>;
 
     /**
-     * \brief Transmission mode configuration update
-     * \param rnti the RNTI
-     * \param txMode the transmission mode
+     * @brief Transmission mode configuration update
+     * @param rnti the RNTI
+     * @param txMode the transmission mode
      */
     void TransmissionModeConfigurationUpdate(uint16_t rnti, uint8_t txMode);
 
@@ -85,32 +85,32 @@
     //
 
     /**
-     * \brief CSched cell config request function
-     * \param params FfMacCschedSapProvider::CschedCellConfigReqParameters
+     * @brief CSched cell config request function
+     * @param params FfMacCschedSapProvider::CschedCellConfigReqParameters
      */
     void DoCschedCellConfigReq(const FfMacCschedSapProvider::CschedCellConfigReqParameters& params);
 
     /**
-     * \brief CSched UE config request function
-     * \param params FfMacCschedSapProvider::CschedUeConfigReqParameters
+     * @brief CSched UE config request function
+     * @param params FfMacCschedSapProvider::CschedUeConfigReqParameters
      */
     void DoCschedUeConfigReq(const FfMacCschedSapProvider::CschedUeConfigReqParameters& params);
 
     /**
-     * \brief CSched LC config request function
-     * \param params FfMacCschedSapProvider::CschedLcConfigReqParameters
+     * @brief CSched LC config request function
+     * @param params FfMacCschedSapProvider::CschedLcConfigReqParameters
      */
     void DoCschedLcConfigReq(const FfMacCschedSapProvider::CschedLcConfigReqParameters& params);
 
     /**
-     * \brief CSched LC release request function
-     * \param params FfMacCschedSapProvider::CschedLcReleaseReqParameters
+     * @brief CSched LC release request function
+     * @param params FfMacCschedSapProvider::CschedLcReleaseReqParameters
      */
     void DoCschedLcReleaseReq(const FfMacCschedSapProvider::CschedLcReleaseReqParameters& params);
 
     /**
-     * \brief CSched UE release request function
-     * \param params FfMacCschedSapProvider::CschedUeReleaseReqParameters
+     * @brief CSched UE release request function
+     * @param params FfMacCschedSapProvider::CschedUeReleaseReqParameters
      */
     void DoCschedUeReleaseReq(const FfMacCschedSapProvider::CschedUeReleaseReqParameters& params);
 
@@ -120,93 +120,93 @@
     //
 
     /**
-     * \brief Sched DL RLC buffer request function
-     * \param params FfMacSchedSapProvider::SchedDlRlcBufferReqParameters
+     * @brief Sched DL RLC buffer request function
+     * @param params FfMacSchedSapProvider::SchedDlRlcBufferReqParameters
      */
     void DoSchedDlRlcBufferReq(const FfMacSchedSapProvider::SchedDlRlcBufferReqParameters& params);
 
     /**
-     * \brief Sched DL paging buffer request function
-     * \param params FfMacCschedSapProvider::SchedDlPagingBufferReqParameters
+     * @brief Sched DL paging buffer request function
+     * @param params FfMacCschedSapProvider::SchedDlPagingBufferReqParameters
      */
     void DoSchedDlPagingBufferReq(
         const FfMacSchedSapProvider::SchedDlPagingBufferReqParameters& params);
 
     /**
-     * \brief Sched DL MAC buffer request function
-     * \param params FfMacCschedSapProvider::SchedDlMacBufferReqParameters
+     * @brief Sched DL MAC buffer request function
+     * @param params FfMacCschedSapProvider::SchedDlMacBufferReqParameters
      */
     void DoSchedDlMacBufferReq(const FfMacSchedSapProvider::SchedDlMacBufferReqParameters& params);
 
     /**
-     * \brief Sched DL trigger request function
-     * \param params FfMacCschedSapProvider::SchedDlTriggerReqParameters
+     * @brief Sched DL trigger request function
+     * @param params FfMacCschedSapProvider::SchedDlTriggerReqParameters
      */
     void DoSchedDlTriggerReq(const FfMacSchedSapProvider::SchedDlTriggerReqParameters& params);
 
     /**
-     * \brief Sched DL RACH info request function
-     * \param params FfMacCschedSapProvider::SchedDlRachInfoReqParameters
+     * @brief Sched DL RACH info request function
+     * @param params FfMacCschedSapProvider::SchedDlRachInfoReqParameters
      */
     void DoSchedDlRachInfoReq(const FfMacSchedSapProvider::SchedDlRachInfoReqParameters& params);
 
     /**
-     * \brief Sched DL CQI info request function
-     * \param params FfMacCschedSapProvider::SchedDlCqiInfoReqParameters
+     * @brief Sched DL CQI info request function
+     * @param params FfMacCschedSapProvider::SchedDlCqiInfoReqParameters
      */
     void DoSchedDlCqiInfoReq(const FfMacSchedSapProvider::SchedDlCqiInfoReqParameters& params);
 
     /**
-     * \brief Sched UL trigger request function
-     * \param params FfMacCschedSapProvider::SchedUlTriggerReqParameters
+     * @brief Sched UL trigger request function
+     * @param params FfMacCschedSapProvider::SchedUlTriggerReqParameters
      */
     void DoSchedUlTriggerReq(const FfMacSchedSapProvider::SchedUlTriggerReqParameters& params);
 
     /**
-     * \brief Sched UL noise interference request function
-     * \param params FfMacCschedSapProvider::SchedUlNoiseInterferenceReqParameters
+     * @brief Sched UL noise interference request function
+     * @param params FfMacCschedSapProvider::SchedUlNoiseInterferenceReqParameters
      */
     void DoSchedUlNoiseInterferenceReq(
         const FfMacSchedSapProvider::SchedUlNoiseInterferenceReqParameters& params);
 
     /**
-     * \brief Sched UL SR info request function
-     * \param params FfMacCschedSapProvider::SchedUlSrInfoReqParameters
+     * @brief Sched UL SR info request function
+     * @param params FfMacCschedSapProvider::SchedUlSrInfoReqParameters
      */
     void DoSchedUlSrInfoReq(const FfMacSchedSapProvider::SchedUlSrInfoReqParameters& params);
 
     /**
-     * \brief Sched UL MAC control info request function
-     * \param params FfMacCschedSapProvider::SchedUlMacCtrlInfoReqParameters
+     * @brief Sched UL MAC control info request function
+     * @param params FfMacCschedSapProvider::SchedUlMacCtrlInfoReqParameters
      */
     void DoSchedUlMacCtrlInfoReq(
         const FfMacSchedSapProvider::SchedUlMacCtrlInfoReqParameters& params);
 
     /**
-     * \brief Sched UL CQI info request function
-     * \param params FfMacCschedSapProvider::SchedUlCqiInfoReqParameters
+     * @brief Sched UL CQI info request function
+     * @param params FfMacCschedSapProvider::SchedUlCqiInfoReqParameters
      */
     void DoSchedUlCqiInfoReq(const FfMacSchedSapProvider::SchedUlCqiInfoReqParameters& params);
 
     /**
-     * \brief Get RBG size function
-     * \param dlbandwidth the DL bandwidth
-     * \returns the RBG size
+     * @brief Get RBG size function
+     * @param dlbandwidth the DL bandwidth
+     * @returns the RBG size
      */
     int GetRbgSize(int dlbandwidth);
 
     /**
-     * \brief LC active per flow function
-     * \param rnti the RNTI
-     * \returns the LC active per flow
+     * @brief LC active per flow function
+     * @param rnti the RNTI
+     * @returns the LC active per flow
      */
     unsigned int LcActivePerFlow(uint16_t rnti);
 
     /**
-     * \brief Estimate UL SINR function
-     * \param rnti the RNTI
-     * \param rb the RB
-     * \returns the SINR
+     * @brief Estimate UL SINR function
+     * @param rnti the RNTI
+     * @param rb the RB
+     * @returns the SINR
      */
     double EstimateUlSinr(uint16_t rnti, uint16_t rb);
 
@@ -216,37 +216,37 @@
     void RefreshUlCqiMaps();
 
     /**
-     * \brief Update DL RLC buffer info function
-     * \param rnti the RNTI
-     * \param lcid the LCID
-     * \param size the size
+     * @brief Update DL RLC buffer info function
+     * @param rnti the RNTI
+     * @param lcid the LCID
+     * @param size the size
      */
     void UpdateDlRlcBufferInfo(uint16_t rnti, uint8_t lcid, uint16_t size);
     /**
-     * \brief Update DL RLC buffer info function
-     * \param rnti the RNTI
-     * \param size the size
+     * @brief Update DL RLC buffer info function
+     * @param rnti the RNTI
+     * @param size the size
      */
     void UpdateUlRlcBufferInfo(uint16_t rnti, uint16_t size);
 
     /**
-     * \brief Update and return a new process Id for the RNTI specified
+     * @brief Update and return a new process Id for the RNTI specified
      *
-     * \param rnti the RNTI of the UE to be updated
-     * \return the process id  value
+     * @param rnti the RNTI of the UE to be updated
+     * @return the process id  value
      */
     uint8_t UpdateHarqProcessId(uint16_t rnti);
 
     /**
-     * \brief Return the availability of free process for the RNTI specified
+     * @brief Return the availability of free process for the RNTI specified
      *
-     * \param rnti the RNTI of the UE to be updated
-     * \return the availability
+     * @param rnti the RNTI of the UE to be updated
+     * @return the availability
      */
     bool HarqProcessAvailability(uint16_t rnti);
 
     /**
-     * \brief Refresh HARQ processes according to the timers
+     * @brief Refresh HARQ processes according to the timers
      *
      */
     void RefreshHarqProcesses();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/epc-test-gtpu.h ns-3.44/src/lte/test/epc-test-gtpu.h
--- ns-3.43/src/lte/test/epc-test-gtpu.h	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/test/epc-test-gtpu.h	2025-03-09 16:55:49.607372000 -0700
@@ -15,15 +15,15 @@
 using namespace ns3;
 
 /**
- * \ingroup lte
- * \ingroup tests
- * \defgroup lte-test lte module tests
+ * @ingroup lte
+ * @ingroup tests
+ * @defgroup lte-test lte module tests
  */
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test suite for testing GPRS tunnelling protocol header coding and decoding.
+ * @brief Test suite for testing GPRS tunnelling protocol header coding and decoding.
  */
 class EpsGtpuTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/epc-test-s1u-downlink.cc ns-3.44/src/lte/test/epc-test-s1u-downlink.cc
--- ns-3.43/src/lte/test/epc-test-s1u-downlink.cc	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/test/epc-test-s1u-downlink.cc	2025-03-09 16:55:49.607372000 -0700
@@ -16,6 +16,8 @@
 #include "ns3/inet-socket-address.h"
 #include "ns3/internet-stack-helper.h"
 #include "ns3/ipv4-address-helper.h"
+#include "ns3/ipv4-static-routing-helper.h"
+#include "ns3/ipv4-static-routing.h"
 #include "ns3/log.h"
 #include "ns3/packet-sink-helper.h"
 #include "ns3/packet-sink.h"
@@ -25,25 +27,23 @@
 #include "ns3/test.h"
 #include "ns3/udp-echo-helper.h"
 #include "ns3/uinteger.h"
-#include <ns3/ipv4-static-routing-helper.h>
-#include <ns3/ipv4-static-routing.h>
 
 using namespace ns3;
 
 NS_LOG_COMPONENT_DEFINE("EpcTestS1uDownlink");
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Custom structure for testing UE downlink data
+ * @brief Custom structure for testing UE downlink data
  */
 struct UeDlTestData
 {
     /**
      * Constructor
      *
-     * \param n number of packets
-     * \param s packet size
+     * @param n number of packets
+     * @param s packet size
      */
     UeDlTestData(uint32_t n, uint32_t s);
 
@@ -61,9 +61,9 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Custom structure for testing eNodeB downlink data, contains
+ * @brief Custom structure for testing eNodeB downlink data, contains
  * the list of data structures for UEs
  */
 struct EnbDlTestData
@@ -72,9 +72,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief EpcS1uDlTestCase class
+ * @brief EpcS1uDlTestCase class
  */
 class EpcS1uDlTestCase : public TestCase
 {
@@ -82,8 +82,8 @@
     /**
      * Constructor
      *
-     * \param name the name of the test case instance
-     * \param v list of eNodeB downlink test data information
+     * @param name the name of the test case instance
+     * @param v list of eNodeB downlink test data information
      */
     EpcS1uDlTestCase(std::string name, std::vector<EnbDlTestData> v);
     ~EpcS1uDlTestCase() override;
@@ -202,8 +202,8 @@
             PacketSinkHelper packetSinkHelper("ns3::UdpSocketFactory",
                                               InetSocketAddress(Ipv4Address::GetAny(), port));
             ApplicationContainer apps = packetSinkHelper.Install(ue);
-            apps.Start(Seconds(1.0));
-            apps.Stop(Seconds(10.0));
+            apps.Start(Seconds(1));
+            apps.Stop(Seconds(10));
             enbit->ues[u].serverApp = apps.Get(0)->GetObject<PacketSink>();
 
             Time interPacketInterval = Seconds(0.01);
@@ -212,8 +212,8 @@
             client.SetAttribute("Interval", TimeValue(interPacketInterval));
             client.SetAttribute("PacketSize", UintegerValue(enbit->ues[u].pktSize));
             apps = client.Install(remoteHost);
-            apps.Start(Seconds(2.0));
-            apps.Stop(Seconds(10.0));
+            apps.Start(Seconds(2));
+            apps.Stop(Seconds(10));
             enbit->ues[u].clientApp = apps.Get(0);
 
             uint64_t imsi = ++imsiCounter;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/epc-test-s1u-uplink.cc ns-3.44/src/lte/test/epc-test-s1u-uplink.cc
--- ns-3.43/src/lte/test/epc-test-s1u-uplink.cc	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/test/epc-test-s1u-uplink.cc	2025-03-09 16:55:49.607372000 -0700
@@ -21,7 +21,11 @@
 #include "ns3/inet-socket-address.h"
 #include "ns3/internet-stack-helper.h"
 #include "ns3/ipv4-address-helper.h"
+#include "ns3/ipv4-interface.h"
+#include "ns3/ipv4-static-routing-helper.h"
+#include "ns3/ipv4-static-routing.h"
 #include "ns3/log.h"
+#include "ns3/mac48-address.h"
 #include "ns3/packet-sink-helper.h"
 #include "ns3/packet-sink.h"
 #include "ns3/point-to-point-epc-helper.h"
@@ -30,17 +34,13 @@
 #include "ns3/simulator.h"
 #include "ns3/test.h"
 #include "ns3/uinteger.h"
-#include <ns3/ipv4-interface.h>
-#include <ns3/ipv4-static-routing-helper.h>
-#include <ns3/ipv4-static-routing.h>
-#include <ns3/mac48-address.h>
 
 using namespace ns3;
 
 NS_LOG_COMPONENT_DEFINE("EpcTestS1uUplink");
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
  * A Udp client. Sends UDP packet carrying sequence number and time
  * stamp but also including the EpsBearerTag. This tag is normally
@@ -54,8 +54,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -63,17 +63,17 @@
     /**
      * Constructor
      *
-     * \param rnti the RNTI
-     * \param bid the BID
+     * @param rnti the RNTI
+     * @param bid the BID
      */
     EpsBearerTagUdpClient(uint16_t rnti, uint8_t bid);
 
     ~EpsBearerTagUdpClient() override;
 
     /**
-     * \brief set the remote address and port
-     * \param ip remote IP address
-     * \param port remote port
+     * @brief set the remote address and port
+     * @param ip remote IP address
+     * @param port remote port
      */
     void SetRemote(Ipv4Address ip, uint16_t port);
 
@@ -85,8 +85,8 @@
     void StopApplication() override;
 
     /**
-     * \brief Schedule transmit function
-     * \param dt the delta time
+     * @brief Schedule transmit function
+     * @param dt the delta time
      */
     void ScheduleTransmit(Time dt);
     /// Send function
@@ -121,7 +121,7 @@
                 MakeUintegerChecker<uint32_t>())
             .AddAttribute("Interval",
                           "The time to wait between packets",
-                          TimeValue(Seconds(1.0)),
+                          TimeValue(Seconds(1)),
                           MakeTimeAccessor(&EpsBearerTagUdpClient::m_interval),
                           MakeTimeChecker())
             .AddAttribute("RemoteAddress",
@@ -196,7 +196,7 @@
     }
 
     m_socket->SetRecvCallback(MakeNullCallback<void, Ptr<Socket>>());
-    m_sendEvent = Simulator::Schedule(Seconds(0.0), &EpsBearerTagUdpClient::Send, this);
+    m_sendEvent = Simulator::Schedule(Seconds(0), &EpsBearerTagUdpClient::Send, this);
 }
 
 void
@@ -237,19 +237,19 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Custom test structure to hold information of data transmitted in the uplink per UE
+ * @brief Custom test structure to hold information of data transmitted in the uplink per UE
  */
 struct UeUlTestData
 {
     /**
      * Constructor
      *
-     * \param n number of packets
-     * \param s packet size
-     * \param r the RNTI
-     * \param l the BID
+     * @param n number of packets
+     * @param s packet size
+     * @param r the RNTI
+     * @param l the BID
      */
     UeUlTestData(uint32_t n, uint32_t s, uint16_t r, uint8_t l);
 
@@ -271,9 +271,9 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Custom structure containing information about data sent in the uplink
+ * @brief Custom structure containing information about data sent in the uplink
  * of eNodeB. Includes the information of the data sent in the uplink per UE.
  */
 struct EnbUlTestData
@@ -282,9 +282,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief EpcS1uUlTestCase class
+ * @brief EpcS1uUlTestCase class
  */
 class EpcS1uUlTestCase : public TestCase
 {
@@ -292,8 +292,8 @@
     /**
      * Constructor
      *
-     * \param name the reference name
-     * \param v the list of UE lists
+     * @param name the reference name
+     * @param v the list of UE lists
      */
     EpcS1uUlTestCase(std::string name, std::vector<EnbUlTestData> v);
     ~EpcS1uUlTestCase() override;
@@ -435,8 +435,8 @@
                 "ns3::UdpSocketFactory",
                 InetSocketAddress(Ipv4Address::GetAny(), udpSinkPort));
             ApplicationContainer sinkApp = packetSinkHelper.Install(remoteHost);
-            sinkApp.Start(Seconds(1.0));
-            sinkApp.Stop(Seconds(10.0));
+            sinkApp.Start(Seconds(1));
+            sinkApp.Stop(Seconds(10));
             enbit->ues[u].serverApp = sinkApp.Get(0)->GetObject<PacketSink>();
 
             Time interPacketInterval = Seconds(0.01);
@@ -451,8 +451,8 @@
             ue->AddApplication(client);
             ApplicationContainer clientApp;
             clientApp.Add(client);
-            clientApp.Start(Seconds(2.0));
-            clientApp.Stop(Seconds(10.0));
+            clientApp.Start(Seconds(2));
+            clientApp.Stop(Seconds(10));
             enbit->ues[u].clientApp = client;
 
             uint64_t imsi = ++imsiCounter;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-ffr-simple.cc ns-3.44/src/lte/test/lte-ffr-simple.cc
--- ns-3.43/src/lte/test/lte-ffr-simple.cc	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/test/lte-ffr-simple.cc	2025-03-09 16:55:49.607372000 -0700
@@ -9,8 +9,8 @@
 
 #include "lte-ffr-simple.h"
 
+#include "ns3/log.h"
 #include "ns3/lte-rrc-sap.h"
-#include <ns3/log.h>
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-ffr-simple.h ns-3.44/src/lte/test/lte-ffr-simple.h
--- ns-3.43/src/lte/test/lte-ffr-simple.h	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/test/lte-ffr-simple.h	2025-03-09 16:55:49.607372000 -0700
@@ -10,11 +10,11 @@
 #ifndef LTE_FFR_SIMPLE_H
 #define LTE_FFR_SIMPLE_H
 
-#include <ns3/lte-ffr-algorithm.h>
-#include <ns3/lte-ffr-rrc-sap.h>
-#include <ns3/lte-ffr-sap.h>
-#include <ns3/lte-rrc-sap.h>
-#include <ns3/traced-callback.h>
+#include "ns3/lte-ffr-algorithm.h"
+#include "ns3/lte-ffr-rrc-sap.h"
+#include "ns3/lte-ffr-sap.h"
+#include "ns3/lte-rrc-sap.h"
+#include "ns3/traced-callback.h"
 
 #include <map>
 
@@ -22,9 +22,9 @@
 {
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Simple Frequency Reuse algorithm implementation which uses only 1 sub-band.
+ * @brief Simple Frequency Reuse algorithm implementation which uses only 1 sub-band.
  *                Used to test Downlink Power Allocation. When Simple FR receives UE measurements
  *                it immediately call functions to change PdschConfigDedicated (i.e. P_A) value for
  *                this UE.
@@ -33,34 +33,34 @@
 {
   public:
     /**
-     * \brief Creates a trivial ffr algorithm instance.
+     * @brief Creates a trivial ffr algorithm instance.
      */
     LteFfrSimple();
 
     ~LteFfrSimple() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Callback function that is used to be connected to trace ChangePdschConfigDedicated
-     * \param change trace fired upon change of PdschConfigDedicated if true
+     * @brief Callback function that is used to be connected to trace ChangePdschConfigDedicated
+     * @param change trace fired upon change of PdschConfigDedicated if true
      */
     void ChangePdschConfigDedicated(bool change);
     /**
-     * \brief Set PDSCH config dedicated function
-     * \param pdschConfigDedicated LteRrcSap::PdschConfigDedicated object
+     * @brief Set PDSCH config dedicated function
+     * @param pdschConfigDedicated LteRrcSap::PdschConfigDedicated object
      */
     void SetPdschConfigDedicated(LteRrcSap::PdschConfigDedicated pdschConfigDedicated);
 
     /**
-     * \brief Set transmission power control
-     * \param tpc TPC
-     * \param num number of TPC configurations in the test case
-     * \param accumulatedMode whether TPC accumulated mode is used
+     * @brief Set transmission power control
+     * @param tpc TPC
+     * @param num number of TPC configurations in the test case
+     * @param accumulatedMode whether TPC accumulated mode is used
      */
     void SetTpc(uint32_t tpc, uint32_t num, bool accumulatedMode);
 
@@ -79,8 +79,8 @@
     /**
      * TracedCallback signature for change of PdschConfigDedicated.
      *
-     * \param [in] rnti
-     * \param [in] pdschPa PdschConfiDedicated.pa
+     * @param [in] rnti
+     * @param [in] pdschPa PdschConfiDedicated.pa
      */
     typedef void (*PdschTracedCallback)(uint16_t rnti, uint8_t pdschPa);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-simple-helper.cc ns-3.44/src/lte/test/lte-simple-helper.cc
--- ns-3.43/src/lte/test/lte-simple-helper.cc	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/test/lte-simple-helper.cc	2025-03-09 16:55:49.607372000 -0700
@@ -232,11 +232,11 @@
 /**
  * DL transmit PDU callback
  *
- * \param rlcStats the stats calculator
- * \param path
- * \param rnti the RNTI
- * \param lcid the LCID
- * \param packetSize the packet size
+ * @param rlcStats the stats calculator
+ * @param path
+ * @param rnti the RNTI
+ * @param lcid the LCID
+ * @param packetSize the packet size
  */
 void
 LteSimpleHelperDlTxPduCallback(Ptr<RadioBearerStatsCalculator> rlcStats,
@@ -254,12 +254,12 @@
 /**
  * DL receive PDU callback
  *
- * \param rlcStats the stats calculator
- * \param path
- * \param rnti the RNTI
- * \param lcid the LCID
- * \param packetSize the packet size
- * \param delay the delay
+ * @param rlcStats the stats calculator
+ * @param path
+ * @param rnti the RNTI
+ * @param lcid the LCID
+ * @param packetSize the packet size
+ * @param delay the delay
  */
 void
 LteSimpleHelperDlRxPduCallback(Ptr<RadioBearerStatsCalculator> rlcStats,
@@ -289,11 +289,11 @@
 /**
  * UL transmit PDU callback
  *
- * \param rlcStats the stats calculator
- * \param path
- * \param rnti the RNTI
- * \param lcid the LCID
- * \param packetSize the packet size
+ * @param rlcStats the stats calculator
+ * @param path
+ * @param rnti the RNTI
+ * @param lcid the LCID
+ * @param packetSize the packet size
  */
 void
 LteSimpleHelperUlTxPduCallback(Ptr<RadioBearerStatsCalculator> rlcStats,
@@ -311,12 +311,12 @@
 /**
  * UL receive PDU callback
  *
- * \param rlcStats the stats calculator
- * \param path
- * \param rnti the RNTI
- * \param lcid the LCID
- * \param packetSize the packet size
- * \param delay the delay
+ * @param rlcStats the stats calculator
+ * @param path
+ * @param rnti the RNTI
+ * @param lcid the LCID
+ * @param packetSize the packet size
+ * @param delay the delay
  */
 void
 LteSimpleHelperUlRxPduCallback(Ptr<RadioBearerStatsCalculator> rlcStats,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-simple-helper.h ns-3.44/src/lte/test/lte-simple-helper.h
--- ns-3.43/src/lte/test/lte-simple-helper.h	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/test/lte-simple-helper.h	2025-03-09 16:55:49.607372000 -0700
@@ -26,9 +26,9 @@
 class LteTestMac;
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief A simplified version of LteHelper, that
+ * @brief A simplified version of LteHelper, that
  * is used for creation and configuration of LTE entities for testing purposes
  * when just a limited LteHelper functionality is wanted.
  *
@@ -40,8 +40,8 @@
     ~LteSimpleHelper() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     void DoDispose() override;
@@ -49,18 +49,18 @@
     /**
      * create a set of eNB devices
      *
-     * \param c the node container where the devices are to be installed
+     * @param c the node container where the devices are to be installed
      *
-     * \return the NetDeviceContainer with the newly created devices
+     * @return the NetDeviceContainer with the newly created devices
      */
     NetDeviceContainer InstallEnbDevice(NodeContainer c);
 
     /**
      * create a set of UE devices
      *
-     * \param c the node container where the devices are to be installed
+     * @param c the node container where the devices are to be installed
      *
-     * \return the NetDeviceContainer with the newly created devices
+     * @return the NetDeviceContainer with the newly created devices
      */
     NetDeviceContainer InstallUeDevice(NodeContainer c);
 
@@ -113,15 +113,15 @@
     /**
      * Install single ENB device
      *
-     * \param n the node
-     * \returns the device
+     * @param n the node
+     * @returns the device
      */
     Ptr<NetDevice> InstallSingleEnbDevice(Ptr<Node> n);
     /**
      * Install single UE device
      *
-     * \param n the node
-     * \returns the device
+     * @param n the node
+     * @returns the device
      */
     Ptr<NetDevice> InstallSingleUeDevice(Ptr<Node> n);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-simple-net-device.h ns-3.44/src/lte/test/lte-simple-net-device.h
--- ns-3.43/src/lte/test/lte-simple-net-device.h	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/test/lte-simple-net-device.h	2025-03-09 16:55:49.607372000 -0700
@@ -20,7 +20,7 @@
 {
 
 /**
- * \ingroup lte
+ * @ingroup lte
  * The LteSimpleNetDevice class implements the LTE simple net device.
  * This class is used to provide a limited LteNetDevice functionalities that
  * are necessary for testing purposes.
@@ -29,8 +29,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -38,7 +38,7 @@
     /**
      * Constructor
      *
-     * \param node the Node
+     * @param node the Node
      */
     LteSimpleNetDevice(Ptr<Node> node);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-simple-spectrum-phy.cc ns-3.44/src/lte/test/lte-simple-spectrum-phy.cc
--- ns-3.43/src/lte/test/lte-simple-spectrum-phy.cc	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/test/lte-simple-spectrum-phy.cc	2025-03-09 16:55:49.607372000 -0700
@@ -9,14 +9,14 @@
 
 #include "lte-simple-spectrum-phy.h"
 
+#include "ns3/antenna-model.h"
+#include "ns3/boolean.h"
+#include "ns3/double.h"
+#include "ns3/log.h"
 #include "ns3/lte-net-device.h"
 #include "ns3/lte-phy-tag.h"
 #include "ns3/lte-spectrum-signal-parameters.h"
-#include <ns3/antenna-model.h>
-#include <ns3/boolean.h>
-#include <ns3/double.h>
-#include <ns3/log.h>
-#include <ns3/simulator.h>
+#include "ns3/simulator.h"
 
 #include <cmath>
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-simple-spectrum-phy.h ns-3.44/src/lte/test/lte-simple-spectrum-phy.h
--- ns-3.43/src/lte/test/lte-simple-spectrum-phy.h	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/test/lte-simple-spectrum-phy.h	2025-03-09 16:55:49.607372000 -0700
@@ -10,19 +10,19 @@
 #ifndef LTE_SIMPLE_SPECTRUM_PHY_H
 #define LTE_SIMPLE_SPECTRUM_PHY_H
 
-#include <ns3/event-id.h>
-#include <ns3/mobility-model.h>
-#include <ns3/net-device.h>
-#include <ns3/spectrum-channel.h>
-#include <ns3/spectrum-phy.h>
-#include <ns3/spectrum-value.h>
-#include <ns3/traced-callback.h>
+#include "ns3/event-id.h"
+#include "ns3/mobility-model.h"
+#include "ns3/net-device.h"
+#include "ns3/spectrum-channel.h"
+#include "ns3/spectrum-phy.h"
+#include "ns3/spectrum-value.h"
+#include "ns3/traced-callback.h"
 
 namespace ns3
 {
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
  * The LteSimpleSpectrumPhy models the physical layer of LTE
  * This class is used to test Frequency Reuse Algorithms,
@@ -40,8 +40,8 @@
     ~LteSimpleSpectrumPhy() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     // inherited from Object
@@ -58,14 +58,14 @@
     void StartRx(Ptr<SpectrumSignalParameters> params) override;
 
     /**
-     * \brief Set receive spectrum model.
-     * \param model the spectrum model
+     * @brief Set receive spectrum model.
+     * @param model the spectrum model
      */
     void SetRxSpectrumModel(Ptr<const SpectrumModel> model);
 
     /**
-     * \brief Set cell ID.
-     * \param cellId the cell ID
+     * @brief Set cell ID.
+     * @param cellId the cell ID
      */
     void SetCellId(uint16_t cellId);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-aggregation-throughput-scale.cc ns-3.44/src/lte/test/lte-test-aggregation-throughput-scale.cc
--- ns-3.43/src/lte/test/lte-test-aggregation-throughput-scale.cc	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/test/lte-test-aggregation-throughput-scale.cc	2025-03-09 16:55:49.607372000 -0700
@@ -9,25 +9,25 @@
 
 #include "lte-test-aggregation-throughput-scale.h"
 
-#include <ns3/application-container.h>
-#include <ns3/friis-spectrum-propagation-loss.h>
-#include <ns3/internet-stack-helper.h>
-#include <ns3/ipv4-address-helper.h>
-#include <ns3/ipv4-interface-container.h>
-#include <ns3/ipv4-static-routing-helper.h>
-#include <ns3/log.h>
-#include <ns3/lte-enb-net-device.h>
-#include <ns3/lte-helper.h>
-#include <ns3/lte-ue-net-device.h>
-#include <ns3/lte-ue-rrc.h>
-#include <ns3/mobility-helper.h>
-#include <ns3/net-device-container.h>
-#include <ns3/node-container.h>
-#include <ns3/packet-sink.h>
-#include <ns3/point-to-point-epc-helper.h>
-#include <ns3/point-to-point-helper.h>
-#include <ns3/simulator.h>
-#include <ns3/udp-client.h>
+#include "ns3/application-container.h"
+#include "ns3/friis-spectrum-propagation-loss.h"
+#include "ns3/internet-stack-helper.h"
+#include "ns3/ipv4-address-helper.h"
+#include "ns3/ipv4-interface-container.h"
+#include "ns3/ipv4-static-routing-helper.h"
+#include "ns3/log.h"
+#include "ns3/lte-enb-net-device.h"
+#include "ns3/lte-helper.h"
+#include "ns3/lte-ue-net-device.h"
+#include "ns3/lte-ue-rrc.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/net-device-container.h"
+#include "ns3/node-container.h"
+#include "ns3/packet-sink.h"
+#include "ns3/point-to-point-epc-helper.h"
+#include "ns3/point-to-point-helper.h"
+#include "ns3/simulator.h"
+#include "ns3/udp-client.h"
 
 #include <algorithm>
 #include <numeric>
@@ -44,7 +44,7 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LteAggregationThroughputScaleTestSuite g_lteAggregationThroughputScaleTestSuite;
@@ -132,9 +132,9 @@
     pgwNode->AddApplication(client);
 
     apps.Add(client);
-    apps.Start(Seconds(1.0));
+    apps.Start(Seconds(1));
 
-    Simulator::Stop(Seconds(2.0));
+    Simulator::Stop(Seconds(2));
     Simulator::Run();
 
     m_actualCellId = ueDev->GetRrc()->GetCellId();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-aggregation-throughput-scale.h ns-3.44/src/lte/test/lte-test-aggregation-throughput-scale.h
--- ns-3.43/src/lte/test/lte-test-aggregation-throughput-scale.h	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/test/lte-test-aggregation-throughput-scale.h	2025-03-09 16:55:49.607372000 -0700
@@ -10,12 +10,12 @@
 #ifndef LTE_AGGREGATION_THROUGHPUT_SCALE_H
 #define LTE_AGGREGATION_THROUGHPUT_SCALE_H
 
-#include <ns3/test.h>
+#include "ns3/test.h"
 
 using namespace ns3;
 
 /**
- * \brief Test suite for executing carrier aggregation throughput scaling test case.
+ * @brief Test suite for executing carrier aggregation throughput scaling test case.
  *
  * \sa ns3::LteAggregationThroughputScaleTestCase
  */
@@ -26,9 +26,9 @@
 };
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
- * \brief Testing that UE throughput scales linearly with number of component carriers.
+ * @brief Testing that UE throughput scales linearly with number of component carriers.
  *        Also attaches UE to last component carrier to make sure no code assumes
  *        that primary carrier is first.
  */
@@ -36,8 +36,8 @@
 {
   public:
     /**
-     * \brief Creates an instance of the carrier aggregation throughput scaling test case.
-     * \param name name of this test
+     * @brief Creates an instance of the carrier aggregation throughput scaling test case.
+     * @param name name of this test
      */
     LteAggregationThroughputScaleTestCase(std::string name);
 
@@ -45,15 +45,15 @@
 
   private:
     /**
-     * \brief Setup the simulation, run it, and verify the result.
+     * @brief Setup the simulation, run it, and verify the result.
      */
     void DoRun() override;
 
     /**
-     * \brief Get throughput function
+     * @brief Get throughput function
      *
-     * \param numberOfComponentCarriers Number of component carriers
-     * \return The total data received (in Megabits)
+     * @param numberOfComponentCarriers Number of component carriers
+     * @return The total data received (in Megabits)
      */
     double GetThroughput(uint8_t numberOfComponentCarriers);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-carrier-aggregation.cc ns-3.44/src/lte/test/lte-test-carrier-aggregation.cc
--- ns-3.43/src/lte/test/lte-test-carrier-aggregation.cc	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/test/lte-test-carrier-aggregation.cc	2025-03-09 16:55:49.607372000 -0700
@@ -9,31 +9,31 @@
 
 #include "lte-test-carrier-aggregation.h"
 
+#include "ns3/boolean.h"
+#include "ns3/constant-position-mobility-model.h"
 #include "ns3/double.h"
+#include "ns3/enum.h"
+#include "ns3/eps-bearer.h"
 #include "ns3/ff-mac-scheduler.h"
+#include "ns3/log.h"
+#include "ns3/lte-enb-net-device.h"
+#include "ns3/lte-enb-phy.h"
+#include "ns3/lte-helper.h"
+#include "ns3/lte-ue-net-device.h"
+#include "ns3/lte-ue-phy.h"
+#include "ns3/lte-ue-rrc.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/net-device-container.h"
+#include "ns3/node-container.h"
+#include "ns3/object.h"
+#include "ns3/packet.h"
+#include "ns3/ptr.h"
 #include "ns3/radio-bearer-stats-calculator.h"
+#include "ns3/simulator.h"
+#include "ns3/spectrum-error-model.h"
+#include "ns3/spectrum-interference.h"
 #include "ns3/string.h"
-#include <ns3/boolean.h>
-#include <ns3/constant-position-mobility-model.h>
-#include <ns3/enum.h>
-#include <ns3/eps-bearer.h>
-#include <ns3/log.h>
-#include <ns3/lte-enb-net-device.h>
-#include <ns3/lte-enb-phy.h>
-#include <ns3/lte-helper.h>
-#include <ns3/lte-ue-net-device.h>
-#include <ns3/lte-ue-phy.h>
-#include <ns3/lte-ue-rrc.h>
-#include <ns3/mobility-helper.h>
-#include <ns3/net-device-container.h>
-#include <ns3/node-container.h>
-#include <ns3/object.h>
-#include <ns3/packet.h>
-#include <ns3/ptr.h>
-#include <ns3/simulator.h>
-#include <ns3/spectrum-error-model.h>
-#include <ns3/spectrum-interference.h>
-#include <ns3/test.h>
+#include "ns3/test.h"
 
 #include <errno.h>
 #include <iostream>
@@ -317,7 +317,7 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static TestCarrierAggregationSuite lenaTestRrFfMacSchedulerSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-carrier-aggregation-configuration.cc ns-3.44/src/lte/test/lte-test-carrier-aggregation-configuration.cc
--- ns-3.43/src/lte/test/lte-test-carrier-aggregation-configuration.cc	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/test/lte-test-carrier-aggregation-configuration.cc	2025-03-09 16:55:49.607372000 -0700
@@ -7,19 +7,19 @@
  *
  */
 
-#include <ns3/callback.h>
-#include <ns3/constant-position-mobility-model.h>
-#include <ns3/log.h>
-#include <ns3/lte-helper.h>
-#include <ns3/lte-spectrum-value-helper.h>
-#include <ns3/lte-ue-rrc.h>
-#include <ns3/mobility-helper.h>
-#include <ns3/net-device-container.h>
-#include <ns3/node-container.h>
-#include <ns3/object.h>
-#include <ns3/ptr.h>
-#include <ns3/simulator.h>
-#include <ns3/test.h>
+#include "ns3/callback.h"
+#include "ns3/constant-position-mobility-model.h"
+#include "ns3/log.h"
+#include "ns3/lte-helper.h"
+#include "ns3/lte-spectrum-value-helper.h"
+#include "ns3/lte-ue-rrc.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/net-device-container.h"
+#include "ns3/node-container.h"
+#include "ns3/object.h"
+#include "ns3/ptr.h"
+#include "ns3/simulator.h"
+#include "ns3/test.h"
 
 using namespace ns3;
 
@@ -61,9 +61,9 @@
 NS_LOG_COMPONENT_DEFINE("TestCarrierAggregationConfig");
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Carrier aggregation configuration test case.
+ * @brief Carrier aggregation configuration test case.
  */
 class CarrierAggregationConfigTestCase : public TestCase
 {
@@ -71,10 +71,10 @@
     /**
      * Constructor
      *
-     * \param numberOfNodes Total Number of eNBs and UEs
-     * \param numberOfComponentCarriers  Total number of component carriers
-     * \param configToCheck Vector containing all the configurations to check
-     * \param simulationDuration Duration of the simulation
+     * @param numberOfNodes Total Number of eNBs and UEs
+     * @param numberOfComponentCarriers  Total number of component carriers
+     * @param configToCheck Vector containing all the configurations to check
+     * @param simulationDuration Duration of the simulation
      */
     CarrierAggregationConfigTestCase(uint32_t numberOfNodes,
                                      uint16_t numberOfComponentCarriers,
@@ -98,11 +98,11 @@
     /**
      * Build name string function
      *
-     * \param numberOfNodes Total Number of eNBs and UEs
-     * \param numberOfComponentCarriers  Total number of component carriers
-     * \param configToCheck Vector containing all the configurations to check
-     * \param simulationDuration Duration of the simulation
-     * \returns the name string
+     * @param numberOfNodes Total Number of eNBs and UEs
+     * @param numberOfComponentCarriers  Total number of component carriers
+     * @param configToCheck Vector containing all the configurations to check
+     * @param simulationDuration Duration of the simulation
+     * @returns the name string
      */
     std::string BuildNameString(uint32_t numberOfNodes,
                                 uint16_t numberOfComponentCarriers,
@@ -111,9 +111,9 @@
     /**
      * Evaluate function
      *
-     * \param context The context
-     * \param ueRrc Pointer to the UE RRC
-     * \param sCellToAddModList List of the configuration parameters for secondary cell
+     * @param context The context
+     * @param ueRrc Pointer to the UE RRC
+     * @param sCellToAddModList List of the configuration parameters for secondary cell
      */
     void Evaluate(std::string context,
                   Ptr<LteUeRrc> ueRrc,
@@ -121,7 +121,7 @@
     /**
      * Equally spaced component carriers function
      *
-     * \return Vector of maps containing the per component carrier configuration
+     * @return Vector of maps containing the per component carrier configuration
      */
     std::vector<std::map<uint16_t, ConfigToCheck>> EquallySpacedCcs();
 
@@ -375,9 +375,9 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Carrier aggregation configuration test suite.
+ * @brief Carrier aggregation configuration test suite.
  */
 class CarrierAggregationConfigTestSuite : public TestSuite
 {
@@ -439,7 +439,7 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static CarrierAggregationConfigTestSuite g_carrierAggregationConfigTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-carrier-aggregation.h ns-3.44/src/lte/test/lte-test-carrier-aggregation.h
--- ns-3.43/src/lte/test/lte-test-carrier-aggregation.h	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/test/lte-test-carrier-aggregation.h	2025-03-09 16:55:49.607372000 -0700
@@ -21,9 +21,9 @@
 using namespace ns3;
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief This system test program creates different test cases with a single eNB and
+ * @brief This system test program creates different test cases with a single eNB and
  * several UEs, all having the same Radio Bearer specification. In each test
  * case, the UEs see the same SINR from the eNB; different test cases are
  * implemented obtained by using different SINR values and different numbers of
@@ -41,11 +41,11 @@
     /**
      * Constructor of test case
      *
-     * \param nUser number of users
-     * \param dist the distance
-     * \param dlbandwidth the DL bandwidth
-     * \param ulBandwidth the UL badnwidth
-     * \param numberOfComponentCarriers number of component carriers to be used in test
+     * @param nUser number of users
+     * @param dist the distance
+     * @param dlbandwidth the DL bandwidth
+     * @param ulBandwidth the UL badnwidth
+     * @param numberOfComponentCarriers number of component carriers to be used in test
      * configuration
      */
     CarrierAggregationTestCase(uint16_t nUser,
@@ -56,17 +56,17 @@
     ~CarrierAggregationTestCase() override;
     /**
      * DL Scheduling function that is used in this test as callback function of DL scheduling trace
-     * \param dlInfo the DL scheduling callback info
+     * @param dlInfo the DL scheduling callback info
      */
     void DlScheduling(DlSchedulingCallbackInfo dlInfo);
     /**
      * UL Scheduling function that is used in this test as callback function of UL scheduling trace
-     * \param frameNo the frame number
-     * \param subframeNo the subframe number
-     * \param rnti the RNTI
-     * \param mcs the MCS
-     * \param sizeTb
-     * \param componentCarrierId the component carrier ID
+     * @param frameNo the frame number
+     * @param subframeNo the subframe number
+     * @param rnti the RNTI
+     * @param mcs the MCS
+     * @param sizeTb
+     * @param componentCarrierId the component carrier ID
      */
     void UlScheduling(uint32_t frameNo,
                       uint32_t subframeNo,
@@ -81,12 +81,12 @@
     void DoRun() override;
     /**
      * Builds the test name string based on provided parameter values
-     * \param nUser number of users
-     * \param dist the distance
-     * \param dlBandwidth the DL bandwidth
-     * \param ulBandwidth the UL badnwidth
-     * \param numberOfComponentCarriers number of component carriers
-     * \returns the test name
+     * @param nUser number of users
+     * @param dist the distance
+     * @param dlBandwidth the DL bandwidth
+     * @param ulBandwidth the UL badnwidth
+     * @param numberOfComponentCarriers number of component carriers
+     * @returns the test name
      */
     static std::string BuildNameString(uint16_t nUser,
                                        uint16_t dist,
@@ -108,9 +108,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test Carrier Aggregation Suite
+ * @brief Test Carrier Aggregation Suite
  */
 class TestCarrierAggregationSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-cell-selection.cc ns-3.44/src/lte/test/lte-test-cell-selection.cc
--- ns-3.43/src/lte/test/lte-test-cell-selection.cc	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/test/lte-test-cell-selection.cc	2025-03-09 16:55:49.607372000 -0700
@@ -9,25 +9,25 @@
 
 #include "lte-test-cell-selection.h"
 
-#include <ns3/boolean.h>
-#include <ns3/double.h>
-#include <ns3/integer.h>
-#include <ns3/internet-stack-helper.h>
-#include <ns3/ipv4-address-helper.h>
-#include <ns3/ipv4-interface-container.h>
-#include <ns3/ipv4-static-routing-helper.h>
-#include <ns3/log.h>
-#include <ns3/lte-enb-net-device.h>
-#include <ns3/lte-helper.h>
-#include <ns3/lte-ue-net-device.h>
-#include <ns3/lte-ue-rrc.h>
-#include <ns3/mobility-helper.h>
-#include <ns3/net-device-container.h>
-#include <ns3/node-container.h>
-#include <ns3/point-to-point-epc-helper.h>
-#include <ns3/point-to-point-helper.h>
-#include <ns3/rng-seed-manager.h>
-#include <ns3/simulator.h>
+#include "ns3/boolean.h"
+#include "ns3/double.h"
+#include "ns3/integer.h"
+#include "ns3/internet-stack-helper.h"
+#include "ns3/ipv4-address-helper.h"
+#include "ns3/ipv4-interface-container.h"
+#include "ns3/ipv4-static-routing-helper.h"
+#include "ns3/log.h"
+#include "ns3/lte-enb-net-device.h"
+#include "ns3/lte-helper.h"
+#include "ns3/lte-ue-net-device.h"
+#include "ns3/lte-ue-rrc.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/net-device-container.h"
+#include "ns3/node-container.h"
+#include "ns3/point-to-point-epc-helper.h"
+#include "ns3/point-to-point-helper.h"
+#include "ns3/rng-seed-manager.h"
+#include "ns3/simulator.h"
 
 using namespace ns3;
 
@@ -86,7 +86,7 @@
 } // end of LteCellSelectionTestSuite::LteCellSelectionTestSuite ()
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LteCellSelectionTestSuite g_lteCellSelectionTestSuite;
@@ -226,7 +226,7 @@
     enbDevs.Add(lteHelper->InstallEnbDevice(enbNodes.Get(3)));
 
     NetDeviceContainer ueDevs;
-    Time lastCheckPoint = MilliSeconds(0);
+    Time lastCheckPoint;
     NS_ASSERT(m_ueSetupList.size() == ueNodes.GetN());
     NodeContainer::Iterator itNode;
     for (itSetup = m_ueSetupList.begin(), itNode = ueNodes.Begin();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-cell-selection.h ns-3.44/src/lte/test/lte-test-cell-selection.h
--- ns-3.43/src/lte/test/lte-test-cell-selection.h	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/test/lte-test-cell-selection.h	2025-03-09 16:55:49.607372000 -0700
@@ -10,11 +10,11 @@
 #ifndef LTE_TEST_CELL_SELECTION_H
 #define LTE_TEST_CELL_SELECTION_H
 
-#include <ns3/lte-ue-rrc.h>
-#include <ns3/node-container.h>
-#include <ns3/nstime.h>
-#include <ns3/test.h>
-#include <ns3/vector.h>
+#include "ns3/lte-ue-rrc.h"
+#include "ns3/node-container.h"
+#include "ns3/nstime.h"
+#include "ns3/test.h"
+#include "ns3/vector.h"
 
 #include <vector>
 
@@ -28,7 +28,7 @@
 using namespace ns3;
 
 /**
- * \brief Test suite for executing the cell selection test cases in without-EPC
+ * @brief Test suite for executing the cell selection test cases in without-EPC
  *        and with-EPC scenarios.
  *
  * \sa ns3::LteCellSelectionTestCase
@@ -40,16 +40,16 @@
 };
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
- * \brief Testing the initial cell selection procedure by UE at IDLE state in
+ * @brief Testing the initial cell selection procedure by UE at IDLE state in
  *        the beginning of simulation.
  */
 class LteCellSelectionTestCase : public TestCase
 {
   public:
     /**
-     * \brief A set of input parameters for setting up a UE in the simulation.
+     * @brief A set of input parameters for setting up a UE in the simulation.
      */
     struct UeSetup_t
     {
@@ -62,14 +62,14 @@
         uint16_t expectedCellId2; ///< An alternative cell ID that the UE is expected to attach to
                                   ///< (0 means that this no alternative cell is expected).
         /**
-         * \brief UE test setup function.
-         * \param relPosX relative position to the inter site distance in X
-         * \param relPosY relative position to the inter site distance in Y
-         * \param isCsgMember if true, simulation is allowed access to CSG cell
-         * \param checkPoint the time in the simulation when the UE is verified
-         * \param expectedCellId1 the cell ID that the UE is expected to attach to
+         * @brief UE test setup function.
+         * @param relPosX relative position to the inter site distance in X
+         * @param relPosY relative position to the inter site distance in Y
+         * @param isCsgMember if true, simulation is allowed access to CSG cell
+         * @param checkPoint the time in the simulation when the UE is verified
+         * @param expectedCellId1 the cell ID that the UE is expected to attach to
          * (0 means that the UE should not attach to any cell).
-         * \param expectedCellId2 an alternative cell ID that the UE is expected to attach to
+         * @param expectedCellId2 an alternative cell ID that the UE is expected to attach to
          * (0 means that this no alternative cell is expected).
          */
         UeSetup_t(double relPosX,
@@ -81,13 +81,13 @@
     };
 
     /**
-     * \brief Creates an instance of the initial cell selection test case.
-     * \param name name of this test
-     * \param isEpcMode set to true for setting up simulation with EPC enabled
-     * \param isIdealRrc if true, simulation uses Ideal RRC protocol, otherwise
+     * @brief Creates an instance of the initial cell selection test case.
+     * @param name name of this test
+     * @param isEpcMode set to true for setting up simulation with EPC enabled
+     * @param isIdealRrc if true, simulation uses Ideal RRC protocol, otherwise
      *                   simulation uses Real RRC protocol
-     * \param interSiteDistance the distance between eNodeB in meters
-     * \param ueSetupList a list of UE configuration to be installed in the
+     * @param interSiteDistance the distance between eNodeB in meters
+     * @param ueSetupList a list of UE configuration to be installed in the
      *                    simulation
      */
     LteCellSelectionTestCase(std::string name,
@@ -100,28 +100,28 @@
 
   private:
     /**
-     * \brief Setup the simulation according to the configuration set by the
+     * @brief Setup the simulation according to the configuration set by the
      *        class constructor, run it, and verify the result.
      */
     void DoRun() override;
 
     /**
-     * \brief Verifies if the given UE is attached to either of the given two
+     * @brief Verifies if the given UE is attached to either of the given two
      *        cells and in a CONNECTED_NORMALLY state.
-     * \param ueDev the UE device
-     * \param expectedCellId1 the first cell ID
-     * \param expectedCellId2 the second cell ID
+     * @param ueDev the UE device
+     * @param expectedCellId1 the first cell ID
+     * @param expectedCellId2 the second cell ID
      */
     void CheckPoint(Ptr<LteUeNetDevice> ueDev, uint16_t expectedCellId1, uint16_t expectedCellId2);
 
     /**
-     * \brief State transition callback function
-     * \param context the context string
-     * \param imsi the IMSI
-     * \param cellId the cell ID
-     * \param rnti the RNTI
-     * \param oldState the old state
-     * \param newState the new state
+     * @brief State transition callback function
+     * @param context the context string
+     * @param imsi the IMSI
+     * @param cellId the cell ID
+     * @param rnti the RNTI
+     * @param oldState the old state
+     * @param newState the new state
      */
     void StateTransitionCallback(std::string context,
                                  uint64_t imsi,
@@ -130,25 +130,25 @@
                                  LteUeRrc::State oldState,
                                  LteUeRrc::State newState);
     /**
-     * \brief Initial cell selection end ok callback function
-     * \param context the context string
-     * \param imsi the IMSI
-     * \param cellId the cell ID
+     * @brief Initial cell selection end ok callback function
+     * @param context the context string
+     * @param imsi the IMSI
+     * @param cellId the cell ID
      */
     void InitialCellSelectionEndOkCallback(std::string context, uint64_t imsi, uint16_t cellId);
     /**
-     * \brief Initial cell selection end error callback function
-     * \param context the context string
-     * \param imsi the IMSI
-     * \param cellId the cell ID
+     * @brief Initial cell selection end error callback function
+     * @param context the context string
+     * @param imsi the IMSI
+     * @param cellId the cell ID
      */
     void InitialCellSelectionEndErrorCallback(std::string context, uint64_t imsi, uint16_t cellId);
     /**
-     * \brief Connection established callback function
-     * \param context the context string
-     * \param imsi the IMSI
-     * \param cellId the cell ID
-     * \param rnti the RNTI
+     * @brief Connection established callback function
+     * @param context the context string
+     * @param imsi the IMSI
+     * @param cellId the cell ID
+     * @param rnti the RNTI
      */
     void ConnectionEstablishedCallback(std::string context,
                                        uint64_t imsi,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-cqa-ff-mac-scheduler.cc ns-3.44/src/lte/test/lte-test-cqa-ff-mac-scheduler.cc
--- ns-3.43/src/lte/test/lte-test-cqa-ff-mac-scheduler.cc	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/test/lte-test-cqa-ff-mac-scheduler.cc	2025-03-09 16:55:49.607372000 -0700
@@ -12,38 +12,38 @@
 
 #include "lte-test-cqa-ff-mac-scheduler.h"
 
+#include "ns3/boolean.h"
+#include "ns3/constant-position-mobility-model.h"
 #include "ns3/double.h"
+#include "ns3/enum.h"
+#include "ns3/eps-bearer.h"
+#include "ns3/ff-mac-scheduler.h"
 #include "ns3/internet-module.h"
 #include "ns3/ipv4-global-routing-helper.h"
+#include "ns3/log.h"
+#include "ns3/lte-enb-net-device.h"
+#include "ns3/lte-enb-phy.h"
+#include "ns3/lte-helper.h"
+#include "ns3/lte-ue-net-device.h"
+#include "ns3/lte-ue-phy.h"
+#include "ns3/lte-ue-rrc.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/net-device-container.h"
 #include "ns3/network-module.h"
+#include "ns3/node-container.h"
+#include "ns3/object.h"
 #include "ns3/packet-sink-helper.h"
+#include "ns3/packet.h"
 #include "ns3/point-to-point-epc-helper.h"
 #include "ns3/point-to-point-helper.h"
+#include "ns3/ptr.h"
 #include "ns3/radio-bearer-stats-calculator.h"
+#include "ns3/simulator.h"
+#include "ns3/spectrum-error-model.h"
+#include "ns3/spectrum-interference.h"
 #include "ns3/string.h"
+#include "ns3/test.h"
 #include "ns3/udp-client-server-helper.h"
-#include <ns3/boolean.h>
-#include <ns3/constant-position-mobility-model.h>
-#include <ns3/enum.h>
-#include <ns3/eps-bearer.h>
-#include <ns3/ff-mac-scheduler.h>
-#include <ns3/log.h>
-#include <ns3/lte-enb-net-device.h>
-#include <ns3/lte-enb-phy.h>
-#include <ns3/lte-helper.h>
-#include <ns3/lte-ue-net-device.h>
-#include <ns3/lte-ue-phy.h>
-#include <ns3/lte-ue-rrc.h>
-#include <ns3/mobility-helper.h>
-#include <ns3/net-device-container.h>
-#include <ns3/node-container.h>
-#include <ns3/object.h>
-#include <ns3/packet.h>
-#include <ns3/ptr.h>
-#include <ns3/simulator.h>
-#include <ns3/spectrum-error-model.h>
-#include <ns3/spectrum-interference.h>
-#include <ns3/test.h>
 
 #include <iostream>
 #include <sstream>
@@ -251,7 +251,7 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LenaTestCqaFfMacSchedulerSuite lenaTestCqaFfMacSchedulerSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-cqa-ff-mac-scheduler.h ns-3.44/src/lte/test/lte-test-cqa-ff-mac-scheduler.h
--- ns-3.43/src/lte/test/lte-test-cqa-ff-mac-scheduler.h	2024-10-09 16:41:10.044656500 -0700
+++ ns-3.44/src/lte/test/lte-test-cqa-ff-mac-scheduler.h	2025-03-09 16:55:49.607372000 -0700
@@ -19,9 +19,9 @@
 using namespace ns3;
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief This is a system test program. The test is based on a scenario with single eNB and several
+ * @brief This is a system test program. The test is based on a scenario with single eNB and several
  * UEs. The goal of the test is validating if the obtained throughput performance is consistent with
  * the definition of CQA scheduler.
  */
@@ -32,13 +32,13 @@
     /**
      * Constructor
      *
-     * \param nUser number of UE nodes
-     * \param dist distance between nodes
-     * \param thrRefDl DL throughput reference
-     * \param thrRefUl UL throughput reference
-     * \param packetSize packet size
-     * \param interval time interval
-     * \param errorModelEnabled error model enabled?
+     * @param nUser number of UE nodes
+     * @param dist distance between nodes
+     * @param thrRefDl DL throughput reference
+     * @param thrRefUl UL throughput reference
+     * @param packetSize packet size
+     * @param interval time interval
+     * @param errorModelEnabled error model enabled?
      */
     LenaCqaFfMacSchedulerTestCase1(uint16_t nUser,
                                    double dist,
@@ -53,9 +53,9 @@
     /**
      *  Builds the test name string based on provided parameter values
      *
-     * \param nUser number of UE nodes
-     * \param dist distance between nodes
-     * \returns name string
+     * @param nUser number of UE nodes
+     * @param dist distance between nodes
+     * @returns name string
      */
     static std::string BuildNameString(uint16_t nUser, double dist);
     void DoRun() override;
@@ -69,9 +69,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief This is a system test program. The test is based on a scenario with single eNB and several
+ * @brief This is a system test program. The test is based on a scenario with single eNB and several
  * UEs. The goal of the test is validating if the obtained throughput performance is consistent with
  * the definition of CQA scheduler when the UEs with different SINRs.
  */
@@ -82,11 +82,11 @@
     /**
      * Constructor
      *
-     * \param dist distance between nodes
-     * \param estThrCqaDl estimated CQA throughput in the downlink
-     * \param packetSize packet size
-     * \param interval the UDP packet time interval
-     * \param errorModelEnabled whether the error model enabled is enabled in the test case
+     * @param dist distance between nodes
+     * @param estThrCqaDl estimated CQA throughput in the downlink
+     * @param packetSize packet size
+     * @param interval the UDP packet time interval
+     * @param errorModelEnabled whether the error model enabled is enabled in the test case
      */
     LenaCqaFfMacSchedulerTestCase2(std::vector<double> dist,
                                    std::vector<uint32_t> estThrCqaDl,
@@ -99,9 +99,9 @@
     /**
      *  Builds the test name string based on provided parameter values
      *
-     * \param nUser number of UE nodes
-     * \param dist distance between nodes
-     * \returns name string
+     * @param nUser number of UE nodes
+     * @param dist distance between nodes
+     * @returns name string
      */
     static std::string BuildNameString(uint16_t nUser, std::vector<double> dist);
     void DoRun() override;
@@ -114,9 +114,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief The test suite for testing CQA scheduler functionality
+ * @brief The test suite for testing CQA scheduler functionality
  */
 
 class LenaTestCqaFfMacSchedulerSuite : public TestSuite
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-cqi-generation.cc ns-3.44/src/lte/test/lte-test-cqi-generation.cc
--- ns-3.43/src/lte/test/lte-test-cqi-generation.cc	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-cqi-generation.cc	2025-03-09 16:55:49.607372000 -0700
@@ -11,21 +11,21 @@
 
 #include "lte-ffr-simple.h"
 
+#include "ns3/boolean.h"
+#include "ns3/callback.h"
+#include "ns3/config.h"
+#include "ns3/double.h"
+#include "ns3/enum.h"
 #include "ns3/ff-mac-scheduler.h"
+#include "ns3/log.h"
 #include "ns3/lte-helper.h"
 #include "ns3/lte-rrc-sap.h"
+#include "ns3/lte-ue-mac.h"
+#include "ns3/lte-ue-net-device.h"
 #include "ns3/mobility-helper.h"
-#include <ns3/boolean.h>
-#include <ns3/callback.h>
-#include <ns3/config.h>
-#include <ns3/double.h>
-#include <ns3/enum.h>
-#include <ns3/log.h>
-#include <ns3/lte-ue-mac.h>
-#include <ns3/lte-ue-net-device.h>
-#include <ns3/pointer.h>
-#include <ns3/simulator.h>
-#include <ns3/string.h>
+#include "ns3/pointer.h"
+#include "ns3/simulator.h"
+#include "ns3/string.h"
 
 using namespace ns3;
 
@@ -134,7 +134,7 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LteCqiGenerationTestSuite lteCqiGenerationTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-cqi-generation.h ns-3.44/src/lte/test/lte-test-cqi-generation.h
--- ns-3.43/src/lte/test/lte-test-cqi-generation.h	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-cqi-generation.h	2025-03-09 16:55:49.607372000 -0700
@@ -16,9 +16,9 @@
 using namespace ns3;
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Lte Cqi Generation Test Suite
+ * @brief Lte Cqi Generation Test Suite
  */
 
 class LteCqiGenerationTestSuite : public TestSuite
@@ -28,9 +28,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief This is the test case for testing different configuration of CQI generation.
+ * @brief This is the test case for testing different configuration of CQI generation.
  *  The topology consists of the two UEs and two eNbs. UEs have the same position,
  *  while eNodeBs are at the same distance from both UEs. The checking whether CQI is
  *  generated properly for two different cases: when PDCCH is used for the CQI
@@ -43,10 +43,10 @@
     /**
      * Constructor
      *
-     * \param name reference name
-     * \param usePdcchForCqiGeneration use PDCCH for CQI generation
-     * \param dlMcs DL MCS
-     * \param ulMcs UL MCS
+     * @param name reference name
+     * @param usePdcchForCqiGeneration use PDCCH for CQI generation
+     * @param dlMcs DL MCS
+     * @param ulMcs UL MCS
      */
     LteCqiGenerationTestCase(std::string name,
                              bool usePdcchForCqiGeneration,
@@ -55,18 +55,18 @@
     ~LteCqiGenerationTestCase() override;
 
     /**
-     * \brief DL Scheduling function
-     * \param dlInfo DL info
+     * @brief DL Scheduling function
+     * @param dlInfo DL info
      */
     void DlScheduling(DlSchedulingCallbackInfo dlInfo);
 
     /**
-     * \brief UL Scheduling function
-     * \param frameNo frame number
-     * \param subframeNo subframe number
-     * \param rnti the RNTI
-     * \param mcs the MCS
-     * \param sizeTb size
+     * @brief UL Scheduling function
+     * @param frameNo frame number
+     * @param subframeNo subframe number
+     * @param rnti the RNTI
+     * @param mcs the MCS
+     * @param sizeTb size
      */
     void UlScheduling(uint32_t frameNo,
                       uint32_t subframeNo,
@@ -83,9 +83,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief This test is very similar to LteCqiGenerationTestCase. The difference is that in this
+ * @brief This test is very similar to LteCqiGenerationTestCase. The difference is that in this
  * test is enabled the downlink power control.
  */
 
@@ -95,11 +95,11 @@
     /**
      * Constructor
      *
-     * \param name reference name
-     * \param cell0Pa cell # 0 PA
-     * \param cell1Pa cell # 1 PA
-     * \param dlMcs DL MCS
-     * \param ulMcs UL MCS
+     * @param name reference name
+     * @param cell0Pa cell # 0 PA
+     * @param cell1Pa cell # 1 PA
+     * @param dlMcs DL MCS
+     * @param ulMcs UL MCS
      */
     LteCqiGenerationDlPowerControlTestCase(std::string name,
                                            uint8_t cell0Pa,
@@ -109,18 +109,18 @@
     ~LteCqiGenerationDlPowerControlTestCase() override;
 
     /**
-     * \brief DL Scheduling function
-     * \param dlInfo DL info
+     * @brief DL Scheduling function
+     * @param dlInfo DL info
      */
     void DlScheduling(DlSchedulingCallbackInfo dlInfo);
 
     /**
-     * \brief UL Scheduling function
-     * \param frameNo frame number
-     * \param subframeNo subframe number
-     * \param rnti the RNTI
-     * \param mcs the MCS
-     * \param sizeTb size
+     * @brief UL Scheduling function
+     * @param frameNo frame number
+     * @param subframeNo subframe number
+     * @param rnti the RNTI
+     * @param mcs the MCS
+     * @param sizeTb size
      */
     void UlScheduling(uint32_t frameNo,
                       uint32_t subframeNo,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-deactivate-bearer.cc ns-3.44/src/lte/test/lte-test-deactivate-bearer.cc
--- ns-3.43/src/lte/test/lte-test-deactivate-bearer.cc	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-deactivate-bearer.cc	2025-03-09 16:55:49.607372000 -0700
@@ -8,38 +8,38 @@
 
 #include "lte-test-deactivate-bearer.h"
 
+#include "ns3/boolean.h"
+#include "ns3/constant-position-mobility-model.h"
 #include "ns3/double.h"
+#include "ns3/enum.h"
+#include "ns3/eps-bearer.h"
 #include "ns3/internet-module.h"
 #include "ns3/ipv4-global-routing-helper.h"
+#include "ns3/log.h"
+#include "ns3/lte-enb-net-device.h"
+#include "ns3/lte-enb-phy.h"
+#include "ns3/lte-helper.h"
+#include "ns3/lte-ue-net-device.h"
+#include "ns3/lte-ue-phy.h"
+#include "ns3/lte-ue-rrc.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/net-device-container.h"
 #include "ns3/network-module.h"
+#include "ns3/node-container.h"
+#include "ns3/object.h"
 #include "ns3/packet-sink-helper.h"
+#include "ns3/packet.h"
 #include "ns3/point-to-point-epc-helper.h"
 #include "ns3/point-to-point-helper.h"
+#include "ns3/ptr.h"
 #include "ns3/radio-bearer-stats-calculator.h"
+#include "ns3/rng-seed-manager.h"
+#include "ns3/simulator.h"
+#include "ns3/spectrum-error-model.h"
+#include "ns3/spectrum-interference.h"
 #include "ns3/string.h"
+#include "ns3/test.h"
 #include "ns3/udp-client-server-helper.h"
-#include <ns3/boolean.h>
-#include <ns3/constant-position-mobility-model.h>
-#include <ns3/enum.h>
-#include <ns3/eps-bearer.h>
-#include <ns3/log.h>
-#include <ns3/lte-enb-net-device.h>
-#include <ns3/lte-enb-phy.h>
-#include <ns3/lte-helper.h>
-#include <ns3/lte-ue-net-device.h>
-#include <ns3/lte-ue-phy.h>
-#include <ns3/lte-ue-rrc.h>
-#include <ns3/mobility-helper.h>
-#include <ns3/net-device-container.h>
-#include <ns3/node-container.h>
-#include <ns3/object.h>
-#include <ns3/packet.h>
-#include <ns3/ptr.h>
-#include <ns3/rng-seed-manager.h>
-#include <ns3/simulator.h>
-#include <ns3/spectrum-error-model.h>
-#include <ns3/spectrum-interference.h>
-#include <ns3/test.h>
 
 #include <iostream>
 #include <sstream>
@@ -88,7 +88,7 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LenaTestBearerDeactivateSuite lenaTestBearerDeactivateSuite;
@@ -330,7 +330,7 @@
                         2);
 
     // stop simulation after 3 seconds
-    Simulator::Stop(Seconds(3.0));
+    Simulator::Stop(Seconds(3));
 
     Simulator::Run();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-deactivate-bearer.h ns-3.44/src/lte/test/lte-test-deactivate-bearer.h
--- ns-3.43/src/lte/test/lte-test-deactivate-bearer.h	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-deactivate-bearer.h	2025-03-09 16:55:49.607372000 -0700
@@ -9,12 +9,12 @@
 {
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test case that for testing the deactivation of the bearer
+ * @brief Test case that for testing the deactivation of the bearer
  * functionality. The test consist in deactivating the bearer and checking
  * if some traffic will appear afterwards on the given bearer. If some traffic
- * is detected the test will fail. Firs the de-activation is performed by
+ * is detected the test will fail. First the de-activation is performed by
  * using Simulator::Schedule() method which will initiate bearer de-activation
  * after deActivateTime that is specified as the test parameter. Additionally,
  * test instantiate de-activation in sequence.
@@ -26,12 +26,12 @@
     /**
      * Constructor
      *
-     * \param dist distance between the nodes
-     * \param estThrPssDl estimated throughput PSS DL
-     * \param packetSize packet size in bytes
-     * \param interval interval time in ms
-     * \param errorModelEnabled whether the error model is enabled
-     * \param useIdealRrc whether to use ideal RRC
+     * @param dist distance between the nodes
+     * @param estThrPssDl estimated throughput PSS DL
+     * @param packetSize packet size in bytes
+     * @param interval interval time in ms
+     * @param errorModelEnabled whether the error model is enabled
+     * @param useIdealRrc whether to use ideal RRC
      */
     LenaDeactivateBearerTestCase(std::vector<uint16_t> dist,
                                  std::vector<uint32_t> estThrPssDl,
@@ -45,9 +45,9 @@
     /**
      * Build name string function
      *
-     * \param nUser number of UE nodes
-     * \param dist distance between nodes
-     * \returns name string
+     * @param nUser number of UE nodes
+     * @param dist distance between nodes
+     * @returns name string
      */
     static std::string BuildNameString(uint16_t nUser, std::vector<uint16_t> dist);
     void DoRun() override;
@@ -60,9 +60,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief The test suite class for the LenaDeactivateBearerTestCase.
+ * @brief The test suite class for the LenaDeactivateBearerTestCase.
  */
 
 class LenaTestBearerDeactivateSuite : public TestSuite
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-downlink-power-control.cc ns-3.44/src/lte/test/lte-test-downlink-power-control.cc
--- ns-3.43/src/lte/test/lte-test-downlink-power-control.cc	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-downlink-power-control.cc	2025-03-09 16:55:49.607372000 -0700
@@ -11,27 +11,27 @@
 
 #include "lte-ffr-simple.h"
 
+#include "ns3/boolean.h"
+#include "ns3/callback.h"
+#include "ns3/config.h"
+#include "ns3/double.h"
+#include "ns3/enum.h"
+#include "ns3/ff-mac-scheduler.h"
+#include "ns3/log.h"
+#include "ns3/lte-chunk-processor.h"
+#include "ns3/lte-common.h"
+#include "ns3/lte-enb-net-device.h"
+#include "ns3/lte-enb-phy.h"
+#include "ns3/lte-enb-rrc.h"
 #include "ns3/lte-helper.h"
+#include "ns3/lte-rrc-sap.h"
+#include "ns3/lte-ue-net-device.h"
+#include "ns3/lte-ue-phy.h"
+#include "ns3/lte-ue-rrc.h"
 #include "ns3/mobility-helper.h"
-#include <ns3/boolean.h>
-#include <ns3/callback.h>
-#include <ns3/config.h>
-#include <ns3/double.h>
-#include <ns3/enum.h>
-#include <ns3/ff-mac-scheduler.h>
-#include <ns3/log.h>
-#include <ns3/lte-chunk-processor.h>
-#include <ns3/lte-common.h>
-#include <ns3/lte-enb-net-device.h>
-#include <ns3/lte-enb-phy.h>
-#include <ns3/lte-enb-rrc.h>
-#include <ns3/lte-rrc-sap.h>
-#include <ns3/lte-ue-net-device.h>
-#include <ns3/lte-ue-phy.h>
-#include <ns3/lte-ue-rrc.h>
-#include <ns3/pointer.h>
-#include <ns3/simulator.h>
-#include <ns3/string.h>
+#include "ns3/pointer.h"
+#include "ns3/simulator.h"
+#include "ns3/string.h"
 
 using namespace ns3;
 
@@ -376,7 +376,7 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LteDownlinkPowerControlTestSuite lteDownlinkPowerControlTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-downlink-power-control.h ns-3.44/src/lte/test/lte-test-downlink-power-control.h
--- ns-3.43/src/lte/test/lte-test-downlink-power-control.h	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-downlink-power-control.h	2025-03-09 16:55:49.607372000 -0700
@@ -10,18 +10,18 @@
 #ifndef LTE_TEST_DOWNLINK_POWER_CONTROL_H
 #define LTE_TEST_DOWNLINK_POWER_CONTROL_H
 
+#include "ns3/lte-rrc-sap.h"
 #include "ns3/lte-spectrum-value-helper.h"
 #include "ns3/spectrum-test.h"
 #include "ns3/spectrum-value.h"
 #include "ns3/test.h"
-#include <ns3/lte-rrc-sap.h>
 
 using namespace ns3;
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test suite for the LteDownlinkPowerControlSpectrumValueTestCase.
+ * @brief Test suite for the LteDownlinkPowerControlSpectrumValueTestCase.
  *
  */
 class LteDownlinkPowerControlTestSuite : public TestSuite
@@ -30,33 +30,33 @@
     LteDownlinkPowerControlTestSuite();
 
     /**
-     * \brief Calculate RB transmit power function
-     * \param txPower the transmit power
-     * \param pa the PA
-     * \returns RB transmit power
+     * @brief Calculate RB transmit power function
+     * @param txPower the transmit power
+     * @param pa the PA
+     * @returns RB transmit power
      */
     double CalculateRbTxPower(double txPower, uint8_t pa);
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test SINR calculation in the downlink when power control is used.
+ * @brief Test SINR calculation in the downlink when power control is used.
  * Test if the difference in power levels are corresponding to the estamated values.
  */
 class LteDownlinkPowerControlSpectrumValueTestCase : public TestCase
 {
   public:
     /**
-     * \brief Constructor
+     * @brief Constructor
      *
-     * \param name the reference name
-     * \param earfcn the EARFCN
-     * \param bw the bandwidth
-     * \param powerTx
-     * \param powerTxMap
-     * \param activeRbs
-     * \param expected the expected Tx Power Spectral Density
+     * @param name the reference name
+     * @param earfcn the EARFCN
+     * @param bw the bandwidth
+     * @param powerTx
+     * @param powerTxMap
+     * @param activeRbs
+     * @param expected the expected Tx Power Spectral Density
      */
     LteDownlinkPowerControlSpectrumValueTestCase(std::string name,
                                                  uint16_t earfcn,
@@ -74,9 +74,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test SINR calculation in the downlink when the power control is used.
+ * @brief Test SINR calculation in the downlink when the power control is used.
  * Test the power control by comparing the downlink data and ctrl power
  * difference with the estimated value based on the specified change in power.
  */
@@ -84,11 +84,11 @@
 {
   public:
     /**
-     * \brief Constructor
+     * @brief Constructor
      *
-     * \param changePower
-     * \param pa
-     * \param name the reference name
+     * @param changePower
+     * @param pa
+     * @param name the reference name
      */
     LteDownlinkPowerControlTestCase(bool changePower, uint8_t pa, std::string name);
     ~LteDownlinkPowerControlTestCase() override;
@@ -102,9 +102,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test if RRC connection reconfiguration messages are properly
+ * @brief Test if RRC connection reconfiguration messages are properly
  * generated upon the change in the downlink power.
  *
  */
@@ -112,21 +112,21 @@
 {
   public:
     /**
-     * \brief Constructor
+     * @brief Constructor
      *
-     * \param useIdealRrc if true use ideal RRC
-     * \param name the reference name
+     * @param useIdealRrc if true use ideal RRC
+     * @param name the reference name
      */
     LteDownlinkPowerControlRrcConnectionReconfigurationTestCase(bool useIdealRrc, std::string name);
     ~LteDownlinkPowerControlRrcConnectionReconfigurationTestCase() override;
 
     /**
-     * \brief Connection Reconfiguration ENB
+     * @brief Connection Reconfiguration ENB
      *
-     * \param context the context name
-     * \param imsi the IMSI
-     * \param cellid the cell ID
-     * \param rnti the RNTI
+     * @param context the context name
+     * @param imsi the IMSI
+     * @param cellid the cell ID
+     * @param rnti the RNTI
      */
     void ConnectionReconfigurationEnb(std::string context,
                                       uint64_t imsi,
@@ -134,12 +134,12 @@
                                       uint16_t rnti);
 
     /**
-     * \brief Connection Reconfiguration UE
+     * @brief Connection Reconfiguration UE
      *
-     * \param context the context name
-     * \param imsi the IMSI
-     * \param cellid the cell ID
-     * \param rnti the RNTI
+     * @param context the context name
+     * @param imsi the IMSI
+     * @param cellid the cell ID
+     * @param rnti the RNTI
      */
     void ConnectionReconfigurationUe(std::string context,
                                      uint64_t imsi,
@@ -147,10 +147,10 @@
                                      uint16_t rnti);
 
     /**
-     * \brief Change PDSCH config dedicated
+     * @brief Change PDSCH config dedicated
      *
-     * \param rnti the RNTI
-     * \param pa the PA
+     * @param rnti the RNTI
+     * @param pa the PA
      */
     void ChangePdschConfigDedicated(uint16_t rnti, uint8_t pa);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-downlink-sinr.cc ns-3.44/src/lte/test/lte-test-downlink-sinr.cc
--- ns-3.43/src/lte/test/lte-test-downlink-sinr.cc	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-downlink-sinr.cc	2025-03-09 16:55:49.607372000 -0700
@@ -14,13 +14,13 @@
 
 #include "ns3/boolean.h"
 #include "ns3/log.h"
+#include "ns3/lte-chunk-processor.h"
+#include "ns3/lte-control-messages.h"
 #include "ns3/lte-helper.h"
 #include "ns3/lte-phy-tag.h"
 #include "ns3/lte-spectrum-signal-parameters.h"
 #include "ns3/simulator.h"
 #include "ns3/spectrum-test.h"
-#include <ns3/lte-chunk-processor.h>
-#include <ns3/lte-control-messages.h>
 
 using namespace ns3;
 
@@ -93,7 +93,7 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LteDownlinkSinrTestSuite lteDownlinkSinrTestSuite;
@@ -254,7 +254,7 @@
     ip4->cellId = pbCellId[4];
     Simulator::Schedule(ti4, &LteSpectrumPhy::StartRx, dlPhy, ip4);
 
-    Simulator::Stop(Seconds(5.0));
+    Simulator::Stop(Seconds(5));
     Simulator::Run();
 
     NS_LOG_INFO("Data Frame - Theoretical SINR: " << *m_expectedSinr);
@@ -429,7 +429,7 @@
     ip4->pss = false;
     Simulator::Schedule(ti4, &LteSpectrumPhy::StartRx, dlPhy, ip4);
 
-    Simulator::Stop(Seconds(5.0));
+    Simulator::Stop(Seconds(5));
     Simulator::Run();
 
     NS_LOG_INFO("Ctrl Frame - Theoretical SINR: " << *m_expectedSinr);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-downlink-sinr.h ns-3.44/src/lte/test/lte-test-downlink-sinr.h
--- ns-3.43/src/lte/test/lte-test-downlink-sinr.h	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-downlink-sinr.h	2025-03-09 16:55:49.607372000 -0700
@@ -17,9 +17,9 @@
 using namespace ns3;
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test 1.1 SINR calculation in downlink
+ * @brief Test 1.1 SINR calculation in downlink
  */
 class LteDownlinkSinrTestSuite : public TestSuite
 {
@@ -28,9 +28,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief  Test compares if the generated SINR is equal to estimated SINR
+ * @brief  Test compares if the generated SINR is equal to estimated SINR
  *  value. Test generates several calls to LteSpectrumPhy::StartRx corresponding
  *  to several signals. One will be the signal of interest, i.e., the
  *  LteSpectrumSignalParametersDlCtrlFrame of the first signal will have the
@@ -43,9 +43,9 @@
     /**
      * Constructor
      *
-     * \param sv the spectrum value
-     * \param sinr the SINR
-     * \param name the name of the test
+     * @param sv the spectrum value
+     * @param sinr the SINR
+     * @param name the name of the test
      */
     LteDownlinkDataSinrTestCase(Ptr<SpectrumValue> sv, Ptr<SpectrumValue> sinr, std::string name);
     ~LteDownlinkDataSinrTestCase() override;
@@ -59,9 +59,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief
+ * @brief
  *  Test compares if the generated SINR is equal to estimated SINR value.
  *  Test generates several calls to LteSpectrumPhy::StartRx corresponding
  *  to several signals. One will be the signal of interest, i.e., the
@@ -75,9 +75,9 @@
     /**
      * Constructor
      *
-     * \param sv the spectrum value
-     * \param sinr the SINR
-     * \param name the name of the test
+     * @param sv the spectrum value
+     * @param sinr the SINR
+     * @param name the name of the test
      */
     LteDownlinkCtrlSinrTestCase(Ptr<SpectrumValue> sv, Ptr<SpectrumValue> sinr, std::string name);
     ~LteDownlinkCtrlSinrTestCase() override;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-earfcn.cc ns-3.44/src/lte/test/lte-test-earfcn.cc
--- ns-3.43/src/lte/test/lte-test-earfcn.cc	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-earfcn.cc	2025-03-09 16:55:49.607372000 -0700
@@ -15,9 +15,9 @@
 NS_LOG_COMPONENT_DEFINE("LteTestEarfcn");
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test case that is testing if the frequency is properly generated
+ * @brief Test case that is testing if the frequency is properly generated
  * from provided EARFCN frequency.
  */
 
@@ -27,9 +27,9 @@
     /**
      * Constructor
      *
-     * \param str reference name
-     * \param earfcn EARFCN
-     * \param f frequency
+     * @param str reference name
+     * @param earfcn EARFCN
+     * @param f frequency
      */
     LteEarfcnTestCase(const char* str, uint32_t earfcn, double f);
     ~LteEarfcnTestCase() override;
@@ -62,9 +62,9 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief
+ * @brief
  * Test case that is testing if the downlink frequency is properly
  * converted from provided downlink EARFCN frequency value.
  */
@@ -75,9 +75,9 @@
     /**
      * Constructor
      *
-     * \param str reference name
-     * \param earfcn EARFCN
-     * \param f frequency
+     * @param str reference name
+     * @param earfcn EARFCN
+     * @param f frequency
      */
     LteEarfcnDlTestCase(const char* str, uint32_t earfcn, double f);
 
@@ -102,9 +102,9 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief  Test case that is testing if the uplink frequency is properly
+ * @brief  Test case that is testing if the uplink frequency is properly
  * converted from provided uplink EARFCN frequency value.
  */
 
@@ -114,9 +114,9 @@
     /**
      * Constructor
      *
-     * \param str reference name
-     * \param earfcn EARFCN
-     * \param f frequency
+     * @param str reference name
+     * @param earfcn EARFCN
+     * @param f frequency
      */
     LteEarfcnUlTestCase(const char* str, uint32_t earfcn, double f);
 
@@ -137,9 +137,9 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test suite for testing correct conversion of frequencies in
+ * @brief Test suite for testing correct conversion of frequencies in
  * the downlink and the uplink, and general EARFCN frequencies.
  */
 class LteEarfcnTestSuite : public TestSuite
@@ -149,7 +149,7 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LteEarfcnTestSuite g_lteEarfcnTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-entities.cc ns-3.44/src/lte/test/lte-test-entities.cc
--- ns-3.43/src/lte/test/lte-test-entities.cc	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-entities.cc	2025-03-09 16:55:49.607372000 -0700
@@ -174,7 +174,7 @@
 LteTestRrc::Start()
 {
     NS_LOG_FUNCTION(this);
-    NS_ASSERT_MSG(m_arrivalTime != Time(0), "Arrival time must be different from 0");
+    NS_ASSERT_MSG(!m_arrivalTime.IsZero(), "Arrival time must be different from 0");
 
     // Stats
     m_txPdus++;
@@ -485,7 +485,7 @@
 
     if (m_txOpportunityMode == RANDOM_MODE)
     {
-        if (m_txOppTime != Seconds(0))
+        if (!m_txOppTime.IsZero())
         {
             Simulator::Schedule(m_txOppTime,
                                 &LteTestMac::SendTxOpportunity,
@@ -518,7 +518,7 @@
 
     if (m_txOpportunityMode == RANDOM_MODE)
     {
-        if (m_txOppTime != Seconds(0.0))
+        if (!m_txOppTime.IsZero())
         {
             SendTxOpportunity(m_txOppTime, m_txOppSize);
         }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-entities.h ns-3.44/src/lte/test/lte-test-entities.h
--- ns-3.43/src/lte/test/lte-test-entities.h	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-entities.h	2025-03-09 16:55:49.607372000 -0700
@@ -9,21 +9,21 @@
 #ifndef LTE_TEST_ENTITIES_H
 #define LTE_TEST_ENTITIES_H
 
+#include "ns3/epc-enb-s1-sap.h"
 #include "ns3/lte-mac-sap.h"
 #include "ns3/lte-pdcp-sap.h"
 #include "ns3/lte-rlc-sap.h"
 #include "ns3/net-device.h"
 #include "ns3/simulator.h"
 #include "ns3/test.h"
-#include <ns3/epc-enb-s1-sap.h>
 
 namespace ns3
 {
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief This class implements a testing RRC entity
+ * @brief This class implements a testing RRC entity
  */
 class LteTestRrc : public Object
 {
@@ -37,8 +37,8 @@
 
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -47,13 +47,13 @@
     void DoDispose() override;
 
     /**
-     * \brief Set the PDCP SAP provider
-     * \param s a pointer to the PDCP SAP provider
+     * @brief Set the PDCP SAP provider
+     * @param s a pointer to the PDCP SAP provider
      */
     void SetLtePdcpSapProvider(LtePdcpSapProvider* s);
     /**
-     * \brief Get the PDCP SAP user
-     * \return a pointer to the SAP user of the RLC
+     * @brief Get the PDCP SAP user
+     * @return a pointer to the SAP user of the RLC
      */
     LtePdcpSapUser* GetLtePdcpSapUser();
 
@@ -63,71 +63,71 @@
     void Stop();
 
     /**
-     * \brief Send data function
-     * \param at the time to send
-     * \param dataToSend the data to send
+     * @brief Send data function
+     * @param at the time to send
+     * @param dataToSend the data to send
      */
     void SendData(Time at, std::string dataToSend);
     /**
-     * \brief Get data received function
-     * \returns the received data string
+     * @brief Get data received function
+     * @returns the received data string
      */
     std::string GetDataReceived();
 
     // Stats
     /**
-     * \brief Get the transmit PDUs
-     * \return the number of transmit PDUS
+     * @brief Get the transmit PDUs
+     * @return the number of transmit PDUS
      */
     uint32_t GetTxPdus();
     /**
-     * \brief Get the transmit bytes
-     * \return the number of bytes transmitted
+     * @brief Get the transmit bytes
+     * @return the number of bytes transmitted
      */
     uint32_t GetTxBytes();
     /**
-     * \brief Get the receive PDUs
-     * \return the number of receive PDUS
+     * @brief Get the receive PDUs
+     * @return the number of receive PDUS
      */
     uint32_t GetRxPdus();
     /**
-     * \brief Get the receive bytes
-     * \return the number of bytes received
+     * @brief Get the receive bytes
+     * @return the number of bytes received
      */
     uint32_t GetRxBytes();
 
     /**
-     * \brief Get the last transmit time
-     * \return the time of the last transmit
+     * @brief Get the last transmit time
+     * @return the time of the last transmit
      */
     Time GetTxLastTime();
     /**
-     * \brief Get the last receive time
-     * \return the time of the last receive
+     * @brief Get the last receive time
+     * @return the time of the last receive
      */
     Time GetRxLastTime();
 
     /**
-     * \brief Set the arrival time
-     * \param arrivalTime the arrival time
+     * @brief Set the arrival time
+     * @param arrivalTime the arrival time
      */
     void SetArrivalTime(Time arrivalTime);
     /**
-     * \brief Set the PDU size
-     * \param pduSize the PDU size
+     * @brief Set the PDU size
+     * @param pduSize the PDU size
      */
     void SetPduSize(uint32_t pduSize);
 
     /**
-     * \brief Set the device
-     * \param device the device
+     * @brief Set the device
+     * @param device the device
      */
     void SetDevice(Ptr<NetDevice> device);
 
   private:
     /**
      * Interface forwarded by LtePdcpSapUser
-     * \param params the LtePdcpSapUser::ReceivePdcpSduParameters
+     * @param params the LtePdcpSapUser::ReceivePdcpSduParameters
      */
     virtual void DoReceivePdcpSdu(LtePdcpSapUser::ReceivePdcpSduParameters params);
 
@@ -153,9 +153,9 @@
 /////////////////////////////////////////////////////////////////////
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief This class implements a testing PDCP entity
+ * @brief This class implements a testing PDCP entity
  */
 class LteTestPdcp : public Object
 {
@@ -164,8 +164,8 @@
 
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -174,13 +174,13 @@
     void DoDispose() override;
 
     /**
-     * \brief Set the RLC SAP provider
-     * \param s a pointer to the RLC SAP provider
+     * @brief Set the RLC SAP provider
+     * @param s a pointer to the RLC SAP provider
      */
     void SetLteRlcSapProvider(LteRlcSapProvider* s);
     /**
-     * \brief Get the RLC SAP user
-     * \return a pointer to the SAP user of the RLC
+     * @brief Get the RLC SAP user
+     * @return a pointer to the SAP user of the RLC
      */
     LteRlcSapUser* GetLteRlcSapUser();
 
@@ -188,21 +188,21 @@
     void Start();
 
     /**
-     * \brief Send data function
-     * \param time the time to send
-     * \param dataToSend the data to send
+     * @brief Send data function
+     * @param time the time to send
+     * @param dataToSend the data to send
      */
     void SendData(Time time, std::string dataToSend);
     /**
-     * \brief Get data received function
-     * \returns the received data string
+     * @brief Get data received function
+     * @returns the received data string
      */
     std::string GetDataReceived();
 
   private:
     /**
      * Interface forwarded by LteRlcSapUser
-     * \param p the PDCP PDU packet received
+     * @param p the PDCP PDU packet received
      */
     virtual void DoReceivePdcpPdu(Ptr<Packet> p);
 
@@ -215,9 +215,9 @@
 /////////////////////////////////////////////////////////////////////
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief This class implements a testing loopback MAC layer
+ * @brief This class implements a testing loopback MAC layer
  */
 class LteTestMac : public Object
 {
@@ -230,8 +230,8 @@
 
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -240,59 +240,59 @@
     void DoDispose() override;
 
     /**
-     * \brief Set the device function
-     * \param device the device
+     * @brief Set the device function
+     * @param device the device
      */
     void SetDevice(Ptr<NetDevice> device);
 
     /**
-     * \brief Send transmit opportunity function
-     * \param time the time
-     * \param bytes the number of bytes
+     * @brief Send transmit opportunity function
+     * @param time the time
+     * @param bytes the number of bytes
      */
     void SendTxOpportunity(Time time, uint32_t bytes);
     /**
-     * \brief Get data received function
-     * \returns the received data string
+     * @brief Get data received function
+     * @returns the received data string
      */
     std::string GetDataReceived();
 
     /**
-     * \brief the Receive function
-     * \param nd the device
-     * \param p the packet
-     * \param protocol the protocol
-     * \param addr the address
-     * \returns true if successful
+     * @brief the Receive function
+     * @param nd the device
+     * @param p the packet
+     * @param protocol the protocol
+     * @param addr the address
+     * @returns true if successful
      */
     bool Receive(Ptr<NetDevice> nd, Ptr<const Packet> p, uint16_t protocol, const Address& addr);
 
     /**
-     * \brief Set the MAC SAP user
-     * \param s a pointer to the MAC SAP user
+     * @brief Set the MAC SAP user
+     * @param s a pointer to the MAC SAP user
      */
     void SetLteMacSapUser(LteMacSapUser* s);
     /**
-     * \brief Get the MAC SAP provider
-     * \return a pointer to the SAP provider of the MAC
+     * @brief Get the MAC SAP provider
+     * @return a pointer to the SAP provider of the MAC
      */
     LteMacSapProvider* GetLteMacSapProvider();
 
     /**
-     * \brief Set the other side of the MAC Loopback
-     * \param s a pointer to the other side of the MAC loopback
+     * @brief Set the other side of the MAC Loopback
+     * @param s a pointer to the other side of the MAC loopback
      */
     void SetLteMacLoopback(Ptr<LteTestMac> s);
 
     /**
-     * \brief Set PDCP header present function
-     * \param present true iif PDCP header present
+     * @brief Set PDCP header present function
+     * @param present true iif PDCP header present
      */
     void SetPdcpHeaderPresent(bool present);
 
     /**
-     * \brief Set RLC header type
-     * \param rlcHeaderType the RLC header type
+     * @brief Set RLC header type
+     * @param rlcHeaderType the RLC header type
      */
     void SetRlcHeaderType(uint8_t rlcHeaderType);
 
@@ -305,7 +305,7 @@
 
     /**
      * Set transmit opportunity mode
-     * \param mode the transmit opportunity mode
+     * @param mode the transmit opportunity mode
      */
     void SetTxOpportunityMode(uint8_t mode);
 
@@ -319,34 +319,34 @@
 
     /**
      * Set transmit opportunity time
-     * \param txOppTime the transmit opportunity time
+     * @param txOppTime the transmit opportunity time
      */
     void SetTxOppTime(Time txOppTime);
     /**
      * Set transmit opportunity time
-     * \param txOppSize the transmit opportunity size
+     * @param txOppSize the transmit opportunity size
      */
     void SetTxOppSize(uint32_t txOppSize);
 
     // Stats
     /**
-     * \brief Get the transmit PDUs
-     * \return the number of transmit PDUS
+     * @brief Get the transmit PDUs
+     * @return the number of transmit PDUS
      */
     uint32_t GetTxPdus();
     /**
-     * \brief Get the transmit bytes
-     * \return the number of bytes transmitted
+     * @brief Get the transmit bytes
+     * @return the number of bytes transmitted
      */
     uint32_t GetTxBytes();
     /**
-     * \brief Get the receive PDUs
-     * \return the number of receive PDUS
+     * @brief Get the receive PDUs
+     * @return the number of receive PDUS
      */
     uint32_t GetRxPdus();
     /**
-     * \brief Get the receive bytes
-     * \return the number of bytes received
+     * @brief Get the receive bytes
+     * @return the number of bytes received
      */
     uint32_t GetRxBytes();
 
@@ -354,12 +354,12 @@
     // forwarded from LteMacSapProvider
     /**
      * Transmit PDU
-     * \param params LteMacSapProvider::TransmitPduParameters
+     * @param params LteMacSapProvider::TransmitPduParameters
      */
     void DoTransmitPdu(LteMacSapProvider::TransmitPduParameters params);
     /**
      * Report buffer status function
-     * \param params LteMacSapProvider::ReportBufferStatusParameters
+     * @param params LteMacSapProvider::ReportBufferStatusParameters
      */
     void DoReportBufferStatus(LteMacSapProvider::ReportBufferStatusParameters params);
 
@@ -389,9 +389,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief RRC stub providing a testing S1 SAP user to be used with the EpcEnbApplication
+ * @brief RRC stub providing a testing S1 SAP user to be used with the EpcEnbApplication
  */
 class EpcTestRrc : public Object
 {
@@ -405,21 +405,21 @@
     // inherited from Object
     void DoDispose() override;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
      * Set the S1 SAP Provider
      *
-     * \param s the S1 SAP Provider
+     * @param s the S1 SAP Provider
      */
     void SetS1SapProvider(EpcEnbS1SapProvider* s);
 
     /**
      *
-     * \return the S1 SAP user
+     * @return the S1 SAP user
      */
     EpcEnbS1SapUser* GetS1SapUser();
 
@@ -427,18 +427,18 @@
     // S1 SAP methods
     /**
      * Initial context setup request
-     * \param params EpcEnbS1SapUser::InitialContextSetupRequestParameters
+     * @param params EpcEnbS1SapUser::InitialContextSetupRequestParameters
      */
     void DoInitialContextSetupRequest(EpcEnbS1SapUser::InitialContextSetupRequestParameters params);
     /**
      * Data radio bearer setup request
-     * \param params EpcEnbS1SapUser::DataRadioBearerSetupRequestParameters
+     * @param params EpcEnbS1SapUser::DataRadioBearerSetupRequestParameters
      */
     void DoDataRadioBearerSetupRequest(
         EpcEnbS1SapUser::DataRadioBearerSetupRequestParameters params);
     /**
      * Path switch request acknowledge function
-     * \param params EpcEnbS1SapUser::PathSwitchRequestAcknowledgeParameters
+     * @param params EpcEnbS1SapUser::PathSwitchRequestAcknowledgeParameters
      */
     void DoPathSwitchRequestAcknowledge(
         EpcEnbS1SapUser::PathSwitchRequestAcknowledgeParameters params);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-fdbet-ff-mac-scheduler.cc ns-3.44/src/lte/test/lte-test-fdbet-ff-mac-scheduler.cc
--- ns-3.43/src/lte/test/lte-test-fdbet-ff-mac-scheduler.cc	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-fdbet-ff-mac-scheduler.cc	2025-03-09 16:55:49.607372000 -0700
@@ -10,31 +10,31 @@
 
 #include "lte-test-fdbet-ff-mac-scheduler.h"
 
+#include "ns3/boolean.h"
+#include "ns3/constant-position-mobility-model.h"
 #include "ns3/double.h"
+#include "ns3/enum.h"
+#include "ns3/eps-bearer.h"
+#include "ns3/ff-mac-scheduler.h"
+#include "ns3/log.h"
+#include "ns3/lte-enb-net-device.h"
+#include "ns3/lte-enb-phy.h"
+#include "ns3/lte-helper.h"
+#include "ns3/lte-ue-net-device.h"
+#include "ns3/lte-ue-phy.h"
+#include "ns3/lte-ue-rrc.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/net-device-container.h"
+#include "ns3/node-container.h"
+#include "ns3/object.h"
+#include "ns3/packet.h"
+#include "ns3/ptr.h"
 #include "ns3/radio-bearer-stats-calculator.h"
+#include "ns3/simulator.h"
+#include "ns3/spectrum-error-model.h"
+#include "ns3/spectrum-interference.h"
 #include "ns3/string.h"
-#include <ns3/boolean.h>
-#include <ns3/constant-position-mobility-model.h>
-#include <ns3/enum.h>
-#include <ns3/eps-bearer.h>
-#include <ns3/ff-mac-scheduler.h>
-#include <ns3/log.h>
-#include <ns3/lte-enb-net-device.h>
-#include <ns3/lte-enb-phy.h>
-#include <ns3/lte-helper.h>
-#include <ns3/lte-ue-net-device.h>
-#include <ns3/lte-ue-phy.h>
-#include <ns3/lte-ue-rrc.h>
-#include <ns3/mobility-helper.h>
-#include <ns3/net-device-container.h>
-#include <ns3/node-container.h>
-#include <ns3/object.h>
-#include <ns3/packet.h>
-#include <ns3/ptr.h>
-#include <ns3/simulator.h>
-#include <ns3/spectrum-error-model.h>
-#include <ns3/spectrum-interference.h>
-#include <ns3/test.h>
+#include "ns3/test.h"
 
 #include <iostream>
 #include <sstream>
@@ -185,7 +185,7 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LenaTestFdBetFfMacSchedulerSuite lenaTestFdBetFfMacSchedulerSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-fdbet-ff-mac-scheduler.h ns-3.44/src/lte/test/lte-test-fdbet-ff-mac-scheduler.h
--- ns-3.43/src/lte/test/lte-test-fdbet-ff-mac-scheduler.h	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-fdbet-ff-mac-scheduler.h	2025-03-09 16:55:49.607372000 -0700
@@ -17,9 +17,9 @@
 using namespace ns3;
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief This system test program creates different test cases with a single eNB and
+ * @brief This system test program creates different test cases with a single eNB and
  * several UEs, all having the same Radio Bearer specification. In each test
  * case, the UEs see the same SINR from the eNB; different test cases are
  * implemented obtained by using different SINR values and different numbers of
@@ -33,11 +33,11 @@
     /**
      * Constructor
      *
-     * \param nUser number of UE nodes
-     * \param dist distance between nodes
-     * \param thrRefDl DL throughput reference
-     * \param thrRefUl UL throughput reference
-     * \param errorModelEnabled error model enabled?
+     * @param nUser number of UE nodes
+     * @param dist distance between nodes
+     * @param thrRefDl DL throughput reference
+     * @param thrRefUl UL throughput reference
+     * @param errorModelEnabled error model enabled?
      */
     LenaFdBetFfMacSchedulerTestCase1(uint16_t nUser,
                                      double dist,
@@ -50,9 +50,9 @@
     /**
      *  Builds the test name string based on provided parameter values
      *
-     * \param nUser number of UE nodes
-     * \param dist distance between nodes
-     * \returns name string
+     * @param nUser number of UE nodes
+     * @param dist distance between nodes
+     * @returns name string
      */
     static std::string BuildNameString(uint16_t nUser, double dist);
     void DoRun() override;
@@ -64,9 +64,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test case is similar to the one defined in
+ * @brief Test case is similar to the one defined in
  * LenaFdBetFfMacSchedulerTestCase1, with the difference that UEs are
  * placed in such a way to experience different SINRs from eNodeB.
  */
@@ -76,10 +76,10 @@
     /**
      * Constructor
      *
-     * \param dist distance between nodes
-     * \param achievableRateDl DL achievable rate
-     * \param estThrFdBetUl UL estimated throughput bet UL
-     * \param errorModelEnabled error model enabled?
+     * @param dist distance between nodes
+     * @param achievableRateDl DL achievable rate
+     * @param estThrFdBetUl UL estimated throughput bet UL
+     * @param errorModelEnabled error model enabled?
      */
     LenaFdBetFfMacSchedulerTestCase2(std::vector<double> dist,
                                      std::vector<uint32_t> achievableRateDl,
@@ -91,9 +91,9 @@
     /**
      *  Builds the test name string based on provided parameter values
      *
-     * \param nUser number of UE nodes
-     * \param dist distance between nodes
-     * \returns name string
+     * @param nUser number of UE nodes
+     * @param dist distance between nodes
+     * @returns name string
      */
     static std::string BuildNameString(uint16_t nUser, std::vector<double> dist);
     void DoRun() override;
@@ -105,9 +105,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test suite for FDBetFfMacScheduler test case.
+ * @brief Test suite for FDBetFfMacScheduler test case.
  */
 
 class LenaTestFdBetFfMacSchedulerSuite : public TestSuite
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-fdmt-ff-mac-scheduler.cc ns-3.44/src/lte/test/lte-test-fdmt-ff-mac-scheduler.cc
--- ns-3.43/src/lte/test/lte-test-fdmt-ff-mac-scheduler.cc	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-fdmt-ff-mac-scheduler.cc	2025-03-09 16:55:49.607372000 -0700
@@ -10,31 +10,31 @@
 
 #include "lte-test-fdmt-ff-mac-scheduler.h"
 
+#include "ns3/boolean.h"
+#include "ns3/constant-position-mobility-model.h"
 #include "ns3/double.h"
+#include "ns3/enum.h"
+#include "ns3/eps-bearer.h"
+#include "ns3/ff-mac-scheduler.h"
+#include "ns3/log.h"
+#include "ns3/lte-enb-net-device.h"
+#include "ns3/lte-enb-phy.h"
+#include "ns3/lte-helper.h"
+#include "ns3/lte-ue-net-device.h"
+#include "ns3/lte-ue-phy.h"
+#include "ns3/lte-ue-rrc.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/net-device-container.h"
+#include "ns3/node-container.h"
+#include "ns3/object.h"
+#include "ns3/packet.h"
+#include "ns3/ptr.h"
 #include "ns3/radio-bearer-stats-calculator.h"
+#include "ns3/simulator.h"
+#include "ns3/spectrum-error-model.h"
+#include "ns3/spectrum-interference.h"
 #include "ns3/string.h"
-#include <ns3/boolean.h>
-#include <ns3/constant-position-mobility-model.h>
-#include <ns3/enum.h>
-#include <ns3/eps-bearer.h>
-#include <ns3/ff-mac-scheduler.h>
-#include <ns3/log.h>
-#include <ns3/lte-enb-net-device.h>
-#include <ns3/lte-enb-phy.h>
-#include <ns3/lte-helper.h>
-#include <ns3/lte-ue-net-device.h>
-#include <ns3/lte-ue-phy.h>
-#include <ns3/lte-ue-rrc.h>
-#include <ns3/mobility-helper.h>
-#include <ns3/net-device-container.h>
-#include <ns3/node-container.h>
-#include <ns3/object.h>
-#include <ns3/packet.h>
-#include <ns3/ptr.h>
-#include <ns3/simulator.h>
-#include <ns3/spectrum-error-model.h>
-#include <ns3/spectrum-interference.h>
-#include <ns3/test.h>
+#include "ns3/test.h"
 
 #include <iostream>
 #include <sstream>
@@ -161,7 +161,7 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LenaTestFdMtFfMacSchedulerSuite lenaTestFdMtFfMacSchedulerSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-fdmt-ff-mac-scheduler.h ns-3.44/src/lte/test/lte-test-fdmt-ff-mac-scheduler.h
--- ns-3.43/src/lte/test/lte-test-fdmt-ff-mac-scheduler.h	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-fdmt-ff-mac-scheduler.h	2025-03-09 16:55:49.607372000 -0700
@@ -17,9 +17,9 @@
 using namespace ns3;
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief This system test program creates different test cases with a single eNB and
+ * @brief This system test program creates different test cases with a single eNB and
  * several UEs, all having the same Radio Bearer specification. In each test
  * case, the UEs see the same SINR from the eNB; different test cases are
  * implemented obtained by using different SINR values and different numbers of
@@ -33,11 +33,11 @@
     /**
      * Constructor
      *
-     * \param nUser number of UE nodes
-     * \param dist distance between nodes
-     * \param thrRefDl DL throughput reference
-     * \param thrRefUl UL throughput reference
-     * \param errorModelEnabled error model enabled?
+     * @param nUser number of UE nodes
+     * @param dist distance between nodes
+     * @param thrRefDl DL throughput reference
+     * @param thrRefUl UL throughput reference
+     * @param errorModelEnabled error model enabled?
      */
     LenaFdMtFfMacSchedulerTestCase(uint16_t nUser,
                                    double dist,
@@ -50,9 +50,9 @@
     /**
      *  Builds the test name string based on provided parameter values
      *
-     * \param nUser number of UE nodes
-     * \param dist distance between nodes
-     * \returns name string
+     * @param nUser number of UE nodes
+     * @param dist distance between nodes
+     * @returns name string
      */
     static std::string BuildNameString(uint16_t nUser, double dist);
     void DoRun() override;
@@ -64,9 +64,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test suite for LenaFdMtFfMacSchedulerTestCase test case.
+ * @brief Test suite for LenaFdMtFfMacSchedulerTestCase test case.
  */
 class LenaTestFdMtFfMacSchedulerSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-fdtbfq-ff-mac-scheduler.cc ns-3.44/src/lte/test/lte-test-fdtbfq-ff-mac-scheduler.cc
--- ns-3.43/src/lte/test/lte-test-fdtbfq-ff-mac-scheduler.cc	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-fdtbfq-ff-mac-scheduler.cc	2025-03-09 16:55:49.607372000 -0700
@@ -10,38 +10,38 @@
 
 #include "lte-test-fdtbfq-ff-mac-scheduler.h"
 
+#include "ns3/boolean.h"
+#include "ns3/constant-position-mobility-model.h"
 #include "ns3/double.h"
+#include "ns3/enum.h"
+#include "ns3/eps-bearer.h"
+#include "ns3/ff-mac-scheduler.h"
 #include "ns3/internet-module.h"
 #include "ns3/ipv4-global-routing-helper.h"
+#include "ns3/log.h"
+#include "ns3/lte-enb-net-device.h"
+#include "ns3/lte-enb-phy.h"
+#include "ns3/lte-helper.h"
+#include "ns3/lte-ue-net-device.h"
+#include "ns3/lte-ue-phy.h"
+#include "ns3/lte-ue-rrc.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/net-device-container.h"
 #include "ns3/network-module.h"
+#include "ns3/node-container.h"
+#include "ns3/object.h"
 #include "ns3/packet-sink-helper.h"
+#include "ns3/packet.h"
 #include "ns3/point-to-point-epc-helper.h"
 #include "ns3/point-to-point-helper.h"
+#include "ns3/ptr.h"
 #include "ns3/radio-bearer-stats-calculator.h"
+#include "ns3/simulator.h"
+#include "ns3/spectrum-error-model.h"
+#include "ns3/spectrum-interference.h"
 #include "ns3/string.h"
+#include "ns3/test.h"
 #include "ns3/udp-client-server-helper.h"
-#include <ns3/boolean.h>
-#include <ns3/constant-position-mobility-model.h>
-#include <ns3/enum.h>
-#include <ns3/eps-bearer.h>
-#include <ns3/ff-mac-scheduler.h>
-#include <ns3/log.h>
-#include <ns3/lte-enb-net-device.h>
-#include <ns3/lte-enb-phy.h>
-#include <ns3/lte-helper.h>
-#include <ns3/lte-ue-net-device.h>
-#include <ns3/lte-ue-phy.h>
-#include <ns3/lte-ue-rrc.h>
-#include <ns3/mobility-helper.h>
-#include <ns3/net-device-container.h>
-#include <ns3/node-container.h>
-#include <ns3/object.h>
-#include <ns3/packet.h>
-#include <ns3/ptr.h>
-#include <ns3/simulator.h>
-#include <ns3/spectrum-error-model.h>
-#include <ns3/spectrum-interference.h>
-#include <ns3/test.h>
 
 #include <iostream>
 #include <sstream>
@@ -252,7 +252,7 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LenaTestFdTbfqFfMacSchedulerSuite lenaTestFdTbfqFfMacSchedulerSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-fdtbfq-ff-mac-scheduler.h ns-3.44/src/lte/test/lte-test-fdtbfq-ff-mac-scheduler.h
--- ns-3.43/src/lte/test/lte-test-fdtbfq-ff-mac-scheduler.h	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-fdtbfq-ff-mac-scheduler.h	2025-03-09 16:55:49.607372000 -0700
@@ -17,9 +17,9 @@
 using namespace ns3;
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief This system test program creates different test cases with a single eNB and
+ * @brief This system test program creates different test cases with a single eNB and
  * several UEs, all having the same Radio Bearer specification. In each test
  * case, the UEs see the same SINR from the eNB; different test cases are
  * implemented obtained by using different SINR values and different numbers of
@@ -33,13 +33,13 @@
     /**
      * Constructor
      *
-     * \param nUser number of UE nodes
-     * \param dist distance between nodes
-     * \param thrRefDl DL throughput reference
-     * \param thrRefUl UL throughput reference
-     * \param packetSize packet size
-     * \param interval time interval
-     * \param errorModelEnabled error model enabled?
+     * @param nUser number of UE nodes
+     * @param dist distance between nodes
+     * @param thrRefDl DL throughput reference
+     * @param thrRefUl UL throughput reference
+     * @param packetSize packet size
+     * @param interval time interval
+     * @param errorModelEnabled error model enabled?
      */
     LenaFdTbfqFfMacSchedulerTestCase1(uint16_t nUser,
                                       double dist,
@@ -54,9 +54,9 @@
     /**
      *  Builds the test name string based on provided parameter values
      *
-     * \param nUser number of UE nodes
-     * \param dist distance between nodes
-     * \returns name string
+     * @param nUser number of UE nodes
+     * @param dist distance between nodes
+     * @returns name string
      */
     static std::string BuildNameString(uint16_t nUser, double dist);
     void DoRun() override;
@@ -70,9 +70,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test case is similar to the one defined in
+ * @brief Test case is similar to the one defined in
  * LenaFdTbfqFfMacSchedulerTestCase1, with the difference that UEs are
  * placed in such a way to experience different SINRs from eNodeB.
  */
@@ -82,11 +82,11 @@
     /**
      * Constructor
      *
-     * \param dist distance between nodes
-     * \param estThrFdTbfqDl estimated DL throughput
-     * \param packetSize packet size
-     * \param interval time interval
-     * \param errorModelEnabled indicates whether the error model is enabled
+     * @param dist distance between nodes
+     * @param estThrFdTbfqDl estimated DL throughput
+     * @param packetSize packet size
+     * @param interval time interval
+     * @param errorModelEnabled indicates whether the error model is enabled
      */
     LenaFdTbfqFfMacSchedulerTestCase2(std::vector<double> dist,
                                       std::vector<uint32_t> estThrFdTbfqDl,
@@ -99,9 +99,9 @@
     /**
      *  Builds the test name string based on provided parameter values
      *
-     * \param nUser number of UE nodes
-     * \param dist distance between nodes
-     * \returns name string
+     * @param nUser number of UE nodes
+     * @param dist distance between nodes
+     * @returns name string
      */
     static std::string BuildNameString(uint16_t nUser, std::vector<double> dist);
     void DoRun() override;
@@ -114,9 +114,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test suit for FdTbfqFfMacScheduler test.
+ * @brief Test suit for FdTbfqFfMacScheduler test.
  */
 class LenaTestFdTbfqFfMacSchedulerSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-frequency-reuse.cc ns-3.44/src/lte/test/lte-test-frequency-reuse.cc
--- ns-3.43/src/lte/test/lte-test-frequency-reuse.cc	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-frequency-reuse.cc	2025-03-09 16:55:49.607372000 -0700
@@ -12,30 +12,30 @@
 #include "lte-ffr-simple.h"
 #include "lte-simple-spectrum-phy.h"
 
+#include "ns3/boolean.h"
+#include "ns3/callback.h"
+#include "ns3/config.h"
+#include "ns3/double.h"
+#include "ns3/enum.h"
+#include "ns3/ff-mac-scheduler.h"
 #include "ns3/internet-module.h"
+#include "ns3/log.h"
+#include "ns3/lte-common.h"
+#include "ns3/lte-enb-net-device.h"
+#include "ns3/lte-enb-phy.h"
+#include "ns3/lte-enb-rrc.h"
 #include "ns3/lte-helper.h"
+#include "ns3/lte-ue-net-device.h"
+#include "ns3/lte-ue-phy.h"
+#include "ns3/lte-ue-rrc.h"
 #include "ns3/mobility-helper.h"
 #include "ns3/packet-sink-helper.h"
 #include "ns3/point-to-point-epc-helper.h"
 #include "ns3/point-to-point-module.h"
+#include "ns3/pointer.h"
+#include "ns3/simulator.h"
+#include "ns3/string.h"
 #include "ns3/udp-client-server-helper.h"
-#include <ns3/boolean.h>
-#include <ns3/callback.h>
-#include <ns3/config.h>
-#include <ns3/double.h>
-#include <ns3/enum.h>
-#include <ns3/ff-mac-scheduler.h>
-#include <ns3/log.h>
-#include <ns3/lte-common.h>
-#include <ns3/lte-enb-net-device.h>
-#include <ns3/lte-enb-phy.h>
-#include <ns3/lte-enb-rrc.h>
-#include <ns3/lte-ue-net-device.h>
-#include <ns3/lte-ue-phy.h>
-#include <ns3/lte-ue-rrc.h>
-#include <ns3/pointer.h>
-#include <ns3/simulator.h>
-#include <ns3/string.h>
 
 using namespace ns3;
 
@@ -424,7 +424,7 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LteFrequencyReuseTestSuite lteFrequencyReuseTestSuite;
@@ -2112,7 +2112,7 @@
             NS_LOG_LOGIC("installing UDP DL app for UE " << u);
             UdpClientHelper dlClientHelper(ueIpIfaces.GetAddress(u), dlPort);
             dlClientHelper.SetAttribute("MaxPackets", UintegerValue(1000000));
-            dlClientHelper.SetAttribute("Interval", TimeValue(MilliSeconds(1.0)));
+            dlClientHelper.SetAttribute("Interval", TimeValue(MilliSeconds(1)));
             clientApps.Add(dlClientHelper.Install(remoteHost));
             PacketSinkHelper dlPacketSinkHelper("ns3::UdpSocketFactory",
                                                 InetSocketAddress(Ipv4Address::GetAny(), dlPort));
@@ -2121,7 +2121,7 @@
             NS_LOG_LOGIC("installing UDP UL app for UE " << u);
             UdpClientHelper ulClientHelper(remoteHostAddr, ulPort);
             ulClientHelper.SetAttribute("MaxPackets", UintegerValue(1000000));
-            ulClientHelper.SetAttribute("Interval", TimeValue(MilliSeconds(1.0)));
+            ulClientHelper.SetAttribute("Interval", TimeValue(MilliSeconds(1)));
             clientApps.Add(ulClientHelper.Install(ue));
             PacketSinkHelper ulPacketSinkHelper("ns3::UdpSocketFactory",
                                                 InetSocketAddress(Ipv4Address::GetAny(), ulPort));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-frequency-reuse.h ns-3.44/src/lte/test/lte-test-frequency-reuse.h
--- ns-3.43/src/lte/test/lte-test-frequency-reuse.h	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-frequency-reuse.h	2025-03-09 16:55:49.607372000 -0700
@@ -10,12 +10,12 @@
 #ifndef LTE_TEST_DOWNLINK_FR_H
 #define LTE_TEST_DOWNLINK_FR_H
 
+#include "ns3/lte-rrc-sap.h"
 #include "ns3/lte-spectrum-value-helper.h"
 #include "ns3/node.h"
 #include "ns3/spectrum-test.h"
 #include "ns3/spectrum-value.h"
 #include "ns3/test.h"
-#include <ns3/lte-rrc-sap.h>
 
 namespace ns3
 {
@@ -25,9 +25,9 @@
 using namespace ns3;
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test the fractional frequency reuse algorithms.
+ * @brief Test the fractional frequency reuse algorithms.
  */
 class LteFrequencyReuseTestSuite : public TestSuite
 {
@@ -36,9 +36,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test frequency reuse algorithm. Test fails if the muted frequencies
+ * @brief Test frequency reuse algorithm. Test fails if the muted frequencies
  *  are being used.
  */
 class LteFrTestCase : public TestCase
@@ -47,12 +47,12 @@
     /**
      * Constructor
      *
-     * \param name the reference name
-     * \param userNum the number of UE nodes
-     * \param dlBandwidth the DL bandwidth
-     * \param ulBandwidth the UL bandwidth
-     * \param availableDlRb the available DL per RB
-     * \param availableUlRb the available UL per RB
+     * @param name the reference name
+     * @param userNum the number of UE nodes
+     * @param dlBandwidth the DL bandwidth
+     * @param ulBandwidth the UL bandwidth
+     * @param availableDlRb the available DL per RB
+     * @param availableUlRb the available UL per RB
      */
     LteFrTestCase(std::string name,
                   uint32_t userNum,
@@ -64,12 +64,12 @@
 
     /**
      * DL data receive start function
-     * \param spectrumValue the DL data receive spectrum value
+     * @param spectrumValue the DL data receive spectrum value
      */
     void DlDataRxStart(Ptr<const SpectrumValue> spectrumValue);
     /**
      * UL data receive start function
-     * \param spectrumValue the UL data receive spectrum value
+     * @param spectrumValue the UL data receive spectrum value
      */
     void UlDataRxStart(Ptr<const SpectrumValue> spectrumValue);
 
@@ -88,9 +88,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test hard frequency reuse algorithm. Test fails if the muted
+ * @brief Test hard frequency reuse algorithm. Test fails if the muted
  *  frequencies are being used.
  */
 class LteHardFrTestCase : public LteFrTestCase
@@ -99,17 +99,17 @@
     /**
      * Constructor
      *
-     * \param name the reference name
-     * \param userNum the number of UE nodes
-     * \param schedulerType the scheduler type
-     * \param dlBandwidth the DL bandwidth
-     * \param ulBandwidth the UL bandwidth
-     * \param dlSubBandOffset DL subband offset
-     * \param dlSubBandwidth DL subbandwidth
-     * \param ulSubBandOffset UL subband offset
-     * \param ulSubBandwidth UL subbandwidth
-     * \param availableDlRb the available DL per RB
-     * \param availableUlRb the available UL per RB
+     * @param name the reference name
+     * @param userNum the number of UE nodes
+     * @param schedulerType the scheduler type
+     * @param dlBandwidth the DL bandwidth
+     * @param ulBandwidth the UL bandwidth
+     * @param dlSubBandOffset DL subband offset
+     * @param dlSubBandwidth DL subbandwidth
+     * @param ulSubBandOffset UL subband offset
+     * @param ulSubBandwidth UL subbandwidth
+     * @param availableDlRb the available DL per RB
+     * @param availableUlRb the available UL per RB
      */
     LteHardFrTestCase(std::string name,
                       uint32_t userNum,
@@ -137,9 +137,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test strict frequency reuse algorithm. Test fails if the muted frequencies
+ * @brief Test strict frequency reuse algorithm. Test fails if the muted frequencies
  *  are being used.
  */
 class LteStrictFrTestCase : public LteFrTestCase
@@ -148,19 +148,19 @@
     /**
      * Constructor
      *
-     * \param name the reference name
-     * \param userNum the number of UE nodes
-     * \param schedulerType the scheduler type
-     * \param dlBandwidth the DL bandwidth
-     * \param ulBandwidth the UL bandwidth
-     * \param dlCommonSubBandwidth DL common bandwidth
-     * \param dlEdgeSubBandOffset DL edge subband offset
-     * \param dlEdgeSubBandwidth DL edge subbandwidth
-     * \param ulCommonSubBandwidth UL common subbandwidth
-     * \param ulEdgeSubBandOffset UL subband offset
-     * \param ulEdgeSubBandwidth UL subbandwidth
-     * \param availableDlRb the available DL per RB
-     * \param availableUlRb the available UL per RB
+     * @param name the reference name
+     * @param userNum the number of UE nodes
+     * @param schedulerType the scheduler type
+     * @param dlBandwidth the DL bandwidth
+     * @param ulBandwidth the UL bandwidth
+     * @param dlCommonSubBandwidth DL common bandwidth
+     * @param dlEdgeSubBandOffset DL edge subband offset
+     * @param dlEdgeSubBandwidth DL edge subbandwidth
+     * @param ulCommonSubBandwidth UL common subbandwidth
+     * @param ulEdgeSubBandOffset UL subband offset
+     * @param ulEdgeSubBandwidth UL subbandwidth
+     * @param availableDlRb the available DL per RB
+     * @param availableUlRb the available UL per RB
      */
     LteStrictFrTestCase(std::string name,
                         uint32_t userNum,
@@ -192,9 +192,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test frequency reuse algorithm by teleporting UEs to different
+ * @brief Test frequency reuse algorithm by teleporting UEs to different
  * parts of area and checking if the frequency is used according to the
  * frequency pattern for different parts of area. Test fails if the muted
  * frequencies for a given part of area are being used by UE.
@@ -205,44 +205,44 @@
     /**
      * Constructor
      *
-     * \param name the reference name
-     * \param schedulerType the scheduler type
+     * @param name the reference name
+     * @param schedulerType the scheduler type
      */
     LteFrAreaTestCase(std::string name, std::string schedulerType);
     ~LteFrAreaTestCase() override;
 
     /**
      * DL data receive start function
-     * \param spectrumValue the DL receive spectrum value
+     * @param spectrumValue the DL receive spectrum value
      */
     void DlDataRxStart(Ptr<const SpectrumValue> spectrumValue);
     /**
      * UL data receive start function
-     * \param spectrumValue the UL receive spectrum value
+     * @param spectrumValue the UL receive spectrum value
      */
     void UlDataRxStart(Ptr<const SpectrumValue> spectrumValue);
 
     /**
      * Simple teleport UE function
-     * \param x the X position
-     * \param y the Y position
+     * @param x the X position
+     * @param y the Y position
      */
     void SimpleTeleportUe(uint32_t x, uint32_t y);
     /**
      * Teleport UE function
-     * \param x the X position
-     * \param y the Y position
-     * \param expectedPower the expected power
-     * \param expectedDlRb the expected DL pwr RB
+     * @param x the X position
+     * @param y the Y position
+     * @param expectedPower the expected power
+     * @param expectedDlRb the expected DL pwr RB
      */
     void TeleportUe(uint32_t x, uint32_t y, double expectedPower, std::vector<bool> expectedDlRb);
     /**
      * Teleport UE 2 function
-     * \param ueNode the UE node
-     * \param x the X position
-     * \param y the Y position
-     * \param expectedPower the expected power
-     * \param expectedDlRb the expected DL pwr RB
+     * @param ueNode the UE node
+     * @param x the X position
+     * @param y the Y position
+     * @param expectedPower the expected power
+     * @param expectedDlRb the expected DL pwr RB
      */
     void TeleportUe2(Ptr<Node> ueNode,
                      uint32_t x,
@@ -252,14 +252,14 @@
 
     /**
      * Set DL expected values function
-     * \param expectedPower the expected power
-     * \param expectedDlRb the expected DL pwr RB
+     * @param expectedPower the expected power
+     * @param expectedDlRb the expected DL pwr RB
      */
     void SetDlExpectedValues(double expectedPower, std::vector<bool> expectedDlRb);
     /**
      * Set UL expected values function
-     * \param expectedPower the expected power
-     * \param expectedDlRb the expected DL pwr RB
+     * @param expectedPower the expected power
+     * @param expectedDlRb the expected DL pwr RB
      */
     void SetUlExpectedValues(double expectedPower, std::vector<bool> expectedDlRb);
 
@@ -286,9 +286,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Lte Fr Area Test Case
+ * @brief Lte Fr Area Test Case
  */
 class LteStrictFrAreaTestCase : public LteFrAreaTestCase
 {
@@ -296,8 +296,8 @@
     /**
      * Constructor
      *
-     * \param name the reference name
-     * \param schedulerType the scheduler type
+     * @param name the reference name
+     * @param schedulerType the scheduler type
      */
     LteStrictFrAreaTestCase(std::string name, std::string schedulerType);
     ~LteStrictFrAreaTestCase() override;
@@ -307,9 +307,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Lte Soft Fr Area Test Case
+ * @brief Lte Soft Fr Area Test Case
  */
 class LteSoftFrAreaTestCase : public LteFrAreaTestCase
 {
@@ -317,8 +317,8 @@
     /**
      * Constructor
      *
-     * \param name the reference name
-     * \param schedulerType the scheduler type
+     * @param name the reference name
+     * @param schedulerType the scheduler type
      */
     LteSoftFrAreaTestCase(std::string name, std::string schedulerType);
     ~LteSoftFrAreaTestCase() override;
@@ -328,9 +328,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Lte Soft Ffr Area Test Case
+ * @brief Lte Soft Ffr Area Test Case
  */
 class LteSoftFfrAreaTestCase : public LteFrAreaTestCase
 {
@@ -338,8 +338,8 @@
     /**
      * Constructor
      *
-     * \param name the reference name
-     * \param schedulerType the scheduler type
+     * @param name the reference name
+     * @param schedulerType the scheduler type
      */
     LteSoftFfrAreaTestCase(std::string name, std::string schedulerType);
     ~LteSoftFfrAreaTestCase() override;
@@ -349,9 +349,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Lte Enhanced Ffr Area Test Case
+ * @brief Lte Enhanced Ffr Area Test Case
  */
 class LteEnhancedFfrAreaTestCase : public LteFrAreaTestCase
 {
@@ -359,8 +359,8 @@
     /**
      * Constructor
      *
-     * \param name the reference name
-     * \param schedulerType the scheduler type
+     * @param name the reference name
+     * @param schedulerType the scheduler type
      */
     LteEnhancedFfrAreaTestCase(std::string name, std::string schedulerType);
     ~LteEnhancedFfrAreaTestCase() override;
@@ -370,9 +370,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Lte Distributed Ffr Area Test Case
+ * @brief Lte Distributed Ffr Area Test Case
  */
 class LteDistributedFfrAreaTestCase : public LteFrAreaTestCase
 {
@@ -380,8 +380,8 @@
     /**
      * Constructor
      *
-     * \param name the reference name
-     * \param schedulerType the scheduler type
+     * @param name the reference name
+     * @param schedulerType the scheduler type
      */
     LteDistributedFfrAreaTestCase(std::string name, std::string schedulerType);
     ~LteDistributedFfrAreaTestCase() override;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-harq.cc ns-3.44/src/lte/test/lte-test-harq.cc
--- ns-3.43/src/lte/test/lte-test-harq.cc	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-harq.cc	2025-03-09 16:55:49.607372000 -0700
@@ -8,34 +8,34 @@
 
 #include "lte-test-harq.h"
 
-#include <ns3/boolean.h>
-#include <ns3/buildings-helper.h>
-#include <ns3/config.h>
-#include <ns3/double.h>
-#include <ns3/enum.h>
-#include <ns3/eps-bearer.h>
-#include <ns3/ff-mac-scheduler.h>
-#include <ns3/hybrid-buildings-propagation-loss-model.h>
-#include <ns3/log.h>
-#include <ns3/lte-enb-net-device.h>
-#include <ns3/lte-enb-phy.h>
-#include <ns3/lte-helper.h>
-#include <ns3/lte-ue-net-device.h>
-#include <ns3/lte-ue-phy.h>
-#include <ns3/lte-ue-rrc.h>
-#include <ns3/mobility-building-info.h>
-#include <ns3/mobility-helper.h>
-#include <ns3/net-device-container.h>
-#include <ns3/node-container.h>
-#include <ns3/object.h>
-#include <ns3/packet.h>
-#include <ns3/ptr.h>
-#include <ns3/radio-bearer-stats-calculator.h>
-#include <ns3/simulator.h>
-#include <ns3/spectrum-error-model.h>
-#include <ns3/spectrum-interference.h>
-#include <ns3/string.h>
-#include <ns3/test.h>
+#include "ns3/boolean.h"
+#include "ns3/buildings-helper.h"
+#include "ns3/config.h"
+#include "ns3/double.h"
+#include "ns3/enum.h"
+#include "ns3/eps-bearer.h"
+#include "ns3/ff-mac-scheduler.h"
+#include "ns3/hybrid-buildings-propagation-loss-model.h"
+#include "ns3/log.h"
+#include "ns3/lte-enb-net-device.h"
+#include "ns3/lte-enb-phy.h"
+#include "ns3/lte-helper.h"
+#include "ns3/lte-ue-net-device.h"
+#include "ns3/lte-ue-phy.h"
+#include "ns3/lte-ue-rrc.h"
+#include "ns3/mobility-building-info.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/net-device-container.h"
+#include "ns3/node-container.h"
+#include "ns3/object.h"
+#include "ns3/packet.h"
+#include "ns3/ptr.h"
+#include "ns3/radio-bearer-stats-calculator.h"
+#include "ns3/simulator.h"
+#include "ns3/spectrum-error-model.h"
+#include "ns3/spectrum-interference.h"
+#include "ns3/string.h"
+#include "ns3/test.h"
 
 #include <cmath>
 #include <iostream>
@@ -63,7 +63,7 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LenaTestHarqSuite lenaTestHarqSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-harq.h ns-3.44/src/lte/test/lte-test-harq.h
--- ns-3.43/src/lte/test/lte-test-harq.h	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-harq.h	2025-03-09 16:55:49.607372000 -0700
@@ -15,9 +15,9 @@
 using namespace ns3;
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief This system test program creates different test cases with a single eNB and
+ * @brief This system test program creates different test cases with a single eNB and
  * several UEs, all having the same Radio Bearer specification. In each test
  * case, the UEs see the same SINR from the eNB; different test cases are
  * implemented obtained by using different SINR values and different numbers of
@@ -29,11 +29,11 @@
     /**
      * Constructor
      *
-     * \param nUser the number of UE nodes
-     * \param dist the distance between n odes
-     * \param tbSize
-     * \param amcBer the AMC bit error rate
-     * \param thrRef the throughput reference
+     * @param nUser the number of UE nodes
+     * @param dist the distance between n odes
+     * @param tbSize
+     * @param amcBer the AMC bit error rate
+     * @param thrRef the throughput reference
      */
     LenaHarqTestCase(uint16_t nUser, uint16_t dist, uint16_t tbSize, double amcBer, double thrRef);
     ~LenaHarqTestCase() override;
@@ -43,10 +43,10 @@
     /**
      * Build name string function
      *
-     * \param nUser number of UE nodes
-     * \param dist distance between nodes
-     * \param tbSize
-     * \returns name string
+     * @param nUser number of UE nodes
+     * @param dist distance between nodes
+     * @param tbSize
+     * @returns name string
      */
     static std::string BuildNameString(uint16_t nUser, uint16_t dist, uint16_t tbSize);
     uint16_t m_nUser;       ///< number of UE nodes
@@ -56,9 +56,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test suite for harq test.
+ * @brief Test suite for harq test.
  */
 
 class LenaTestHarqSuite : public TestSuite
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-interference.cc ns-3.44/src/lte/test/lte-test-interference.cc
--- ns-3.43/src/lte/test/lte-test-interference.cc	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-interference.cc	2025-03-09 16:55:49.611372000 -0700
@@ -11,8 +11,10 @@
 
 #include "ns3/boolean.h"
 #include "ns3/double.h"
+#include "ns3/enum.h"
 #include "ns3/ff-mac-scheduler.h"
 #include "ns3/log.h"
+#include "ns3/lte-chunk-processor.h"
 #include "ns3/lte-enb-net-device.h"
 #include "ns3/lte-enb-phy.h"
 #include "ns3/lte-helper.h"
@@ -21,8 +23,6 @@
 #include "ns3/mobility-helper.h"
 #include "ns3/simulator.h"
 #include "ns3/string.h"
-#include <ns3/enum.h>
-#include <ns3/lte-chunk-processor.h>
 
 using namespace ns3;
 
@@ -177,7 +177,7 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LteInterferenceTestSuite lteLinkAdaptationWithInterferenceTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-interference-fr.cc ns-3.44/src/lte/test/lte-test-interference-fr.cc
--- ns-3.43/src/lte/test/lte-test-interference-fr.cc	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-interference-fr.cc	2025-03-09 16:55:49.607372000 -0700
@@ -15,8 +15,10 @@
 
 #include "ns3/boolean.h"
 #include "ns3/double.h"
+#include "ns3/enum.h"
 #include "ns3/ff-mac-scheduler.h"
 #include "ns3/log.h"
+#include "ns3/lte-chunk-processor.h"
 #include "ns3/lte-enb-net-device.h"
 #include "ns3/lte-enb-phy.h"
 #include "ns3/lte-helper.h"
@@ -24,12 +26,10 @@
 #include "ns3/lte-ue-net-device.h"
 #include "ns3/lte-ue-phy.h"
 #include "ns3/mobility-helper.h"
+#include "ns3/pointer.h"
 #include "ns3/simulator.h"
 #include "ns3/spectrum-value.h"
 #include "ns3/string.h"
-#include <ns3/enum.h>
-#include <ns3/lte-chunk-processor.h>
-#include <ns3/pointer.h>
 
 using namespace ns3;
 
@@ -109,7 +109,7 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LteInterferenceFrTestSuite LteInterferenceFrTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-interference-fr.h ns-3.44/src/lte/test/lte-test-interference-fr.h
--- ns-3.43/src/lte/test/lte-test-interference-fr.h	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-interference-fr.h	2025-03-09 16:55:49.607372000 -0700
@@ -17,10 +17,10 @@
 using namespace ns3;
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test suite for the interference test when using different
- * frequency reuse algorithms.Check if the interfence values correspond to
+ * @brief Test suite for the interference test when using different
+ * frequency reuse algorithms.Check if the interference values correspond to
  * theoretical values.
  */
 class LteInterferenceFrTestSuite : public TestSuite
@@ -30,10 +30,10 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Lte interference test when using hard frequency reuse algorithm. Check
- * if the interfence values correspond to theoretical values.
+ * @brief Lte interference test when using hard frequency reuse algorithm. Check
+ * if the interference values correspond to theoretical values.
  */
 class LteInterferenceHardFrTestCase : public TestCase
 {
@@ -41,11 +41,11 @@
     /**
      * Constructor
      *
-     * \param name the reference name
-     * \param d1 distance between ENB and UE
-     * \param d2 distance between ENB and other UE
-     * \param dlSinr the DL SINR
-     * \param ulSinr the UL SINR
+     * @param name the reference name
+     * @param d1 distance between ENB and UE
+     * @param d2 distance between ENB and other UE
+     * @param dlSinr the DL SINR
+     * @param ulSinr the UL SINR
      */
     LteInterferenceHardFrTestCase(std::string name,
                                   double d1,
@@ -63,9 +63,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Lte interference test when using strict frequency reuse algorithm.
+ * @brief Lte interference test when using strict frequency reuse algorithm.
  */
 class LteInterferenceStrictFrTestCase : public TestCase
 {
@@ -73,14 +73,14 @@
     /**
      * Constructor
      *
-     * \param name the reference name
-     * \param d1 distance between ENB and UE
-     * \param d2 distance between ENB and other UE
-     * \param commonDlSinr the DL SINR
-     * \param commonUlSinr the UL SINR
-     * \param edgeDlSinr the DL SINR
-     * \param edgeUlSinr the UL SINR
-     * \param rspqThreshold RSPQ threshold
+     * @param name the reference name
+     * @param d1 distance between ENB and UE
+     * @param d2 distance between ENB and other UE
+     * @param commonDlSinr the DL SINR
+     * @param commonUlSinr the UL SINR
+     * @param edgeDlSinr the DL SINR
+     * @param edgeUlSinr the UL SINR
+     * @param rspqThreshold RSPQ threshold
      */
     LteInterferenceStrictFrTestCase(std::string name,
                                     double d1,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-interference.h ns-3.44/src/lte/test/lte-test-interference.h
--- ns-3.43/src/lte/test/lte-test-interference.h	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-interference.h	2025-03-09 16:55:49.611372000 -0700
@@ -16,9 +16,9 @@
 using namespace ns3;
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test suite for interference test.
+ * @brief Test suite for interference test.
  */
 class LteInterferenceTestSuite : public TestSuite
 {
@@ -27,9 +27,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test that SINR calculation and MCS selection works fine in a
+ * @brief Test that SINR calculation and MCS selection works fine in a
  * multi-cell interference scenario.
  */
 class LteInterferenceTestCase : public TestCase
@@ -38,15 +38,15 @@
     /**
      * Constructor
      *
-     * \param name the reference name
-     * \param d1 distance between ENB and UE
-     * \param d2 distance between ENB and other UE
-     * \param dlSinr the DL SINR
-     * \param ulSinr the UL SINR
-     * \param dlSe the DL se
-     * \param ulSe the UL se
-     * \param dlMcs the DL MCS
-     * \param ulMcs the UL MCS
+     * @param name the reference name
+     * @param d1 distance between ENB and UE
+     * @param d2 distance between ENB and other UE
+     * @param dlSinr the DL SINR
+     * @param ulSinr the UL SINR
+     * @param dlSe the DL se
+     * @param ulSe the UL se
+     * @param dlMcs the DL MCS
+     * @param ulMcs the UL MCS
      */
     LteInterferenceTestCase(std::string name,
                             double d1,
@@ -61,17 +61,17 @@
 
     /**
      * DL scheduling function
-     * \param dlInfo the DL info
+     * @param dlInfo the DL info
      */
     void DlScheduling(DlSchedulingCallbackInfo dlInfo);
 
     /**
      * UL scheduling function
-     * \param frameNo the frame number
-     * \param subframeNo the subframe number
-     * \param rnti the RNTI
-     * \param mcs the MCS
-     * \param sizeTb
+     * @param frameNo the frame number
+     * @param subframeNo the subframe number
+     * @param rnti the RNTI
+     * @param mcs the MCS
+     * @param sizeTb
      */
     void UlScheduling(uint32_t frameNo,
                       uint32_t subframeNo,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-ipv6-routing.cc ns-3.44/src/lte/test/lte-test-ipv6-routing.cc
--- ns-3.43/src/lte/test/lte-test-ipv6-routing.cc	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-ipv6-routing.cc	2025-03-09 16:55:49.611372000 -0700
@@ -39,9 +39,9 @@
 using namespace ns3;
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Lte Ipv6 routing test case.
+ * @brief Lte Ipv6 routing test case.
  */
 class LteIpv6RoutingTestCase : public TestCase
 {
@@ -50,35 +50,35 @@
     ~LteIpv6RoutingTestCase() override;
 
     /**
-     * \brief Initialize testing parameters.
+     * @brief Initialize testing parameters.
      */
     void Checker();
 
     /**
-     * \brief sent Packets from client's IPv6 interface.
-     * \param p packet
-     * \param ipv6 Ipv6 object
-     * \param interface Ipv6interface from which the packet is transmitted
+     * @brief sent Packets from client's IPv6 interface.
+     * @param p packet
+     * @param ipv6 Ipv6 object
+     * @param interface Ipv6interface from which the packet is transmitted
      */
     void SentAtClient(Ptr<const Packet> p, Ptr<Ipv6> ipv6, uint32_t interface);
 
     /**
-     * \brief Received Packets at client's IPv6 interface.
-     * \param p packet
-     * \param ipv6 Ipv6 object
-     * \param interface Ipv6interface at which the packet is received
+     * @brief Received Packets at client's IPv6 interface.
+     * @param p packet
+     * @param ipv6 Ipv6 object
+     * @param interface Ipv6interface at which the packet is received
      */
     void ReceivedAtClient(Ptr<const Packet> p, Ptr<Ipv6> ipv6, uint32_t interface);
 
     /**
-     * \brief Received Packet at pgw from enb.
-     * \param p packet
+     * @brief Received Packet at pgw from enb.
+     * @param p packet
      */
     void EnbToPgw(Ptr<Packet> p);
 
     /**
-     * \brief Received Packet at pgw from enb.
-     * \param p packet
+     * @brief Received Packet at pgw from enb.
+     * @param p packet
      */
     void TunToPgw(Ptr<Packet> p);
 
@@ -311,8 +311,8 @@
     serverApps.Add(echoServer2.Install(ueNodes.Get(1)));
     serverApps.Add(echoServer3.Install(ueNodes.Get(2)));
 
-    serverApps.Start(Seconds(4.0));
-    serverApps.Stop(Seconds(12.0));
+    serverApps.Start(Seconds(4));
+    serverApps.Stop(Seconds(12));
 
     UdpEchoClientHelper echoClient1(m_remoteHostAddr, 10);
     UdpEchoClientHelper echoClient2(m_ueIpIface.GetAddress(1, 1), 11);
@@ -334,14 +334,14 @@
     ApplicationContainer clientApps2 = echoClient2.Install(ueNodes.Get(0));
     ApplicationContainer clientApps3 = echoClient3.Install(ueNodes.Get(0));
 
-    clientApps1.Start(Seconds(4.0));
-    clientApps1.Stop(Seconds(6.0));
+    clientApps1.Start(Seconds(4));
+    clientApps1.Stop(Seconds(6));
 
     clientApps2.Start(Seconds(6.1));
-    clientApps2.Stop(Seconds(8.0));
+    clientApps2.Stop(Seconds(8));
 
     clientApps3.Start(Seconds(8.1));
-    clientApps3.Stop(Seconds(10.0));
+    clientApps3.Stop(Seconds(10));
 
     // Set Cllback for Client Sent and Received packets
     Ptr<Ipv6L3Protocol> ipL3 = (ueNodes.Get(0))->GetObject<Ipv6L3Protocol>();
@@ -358,7 +358,7 @@
     appPgw->TraceConnectWithoutContext("RxFromTun",
                                        MakeCallback(&LteIpv6RoutingTestCase::TunToPgw, this));
 
-    Simulator::Schedule(Time(Seconds(12.0)), &LteIpv6RoutingTestCase::Checker, this);
+    Simulator::Schedule(Seconds(12), &LteIpv6RoutingTestCase::Checker, this);
 
     Simulator::Stop(Seconds(14));
     Simulator::Run();
@@ -367,7 +367,7 @@
 }
 
 /**
- * \brief test suite 1
+ * @brief test suite 1
  */
 class LteIpv6RoutingTestSuite : public TestSuite
 {
@@ -382,7 +382,7 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LteIpv6RoutingTestSuite g_lteipv6testsuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-link-adaptation.cc ns-3.44/src/lte/test/lte-test-link-adaptation.cc
--- ns-3.43/src/lte/test/lte-test-link-adaptation.cc	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-link-adaptation.cc	2025-03-09 16:55:49.611372000 -0700
@@ -10,15 +10,15 @@
 
 #include "ns3/boolean.h"
 #include "ns3/double.h"
+#include "ns3/enum.h"
 #include "ns3/log.h"
+#include "ns3/lte-chunk-processor.h"
 #include "ns3/lte-helper.h"
 #include "ns3/lte-ue-net-device.h"
 #include "ns3/lte-ue-phy.h"
 #include "ns3/mobility-helper.h"
 #include "ns3/simulator.h"
 #include "ns3/string.h"
-#include <ns3/enum.h>
-#include <ns3/lte-chunk-processor.h>
 
 using namespace ns3;
 
@@ -95,7 +95,7 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LteLinkAdaptationTestSuite lteLinkAdaptationTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-link-adaptation.h ns-3.44/src/lte/test/lte-test-link-adaptation.h
--- ns-3.43/src/lte/test/lte-test-link-adaptation.h	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-link-adaptation.h	2025-03-09 16:55:49.611372000 -0700
@@ -15,9 +15,9 @@
 using namespace ns3;
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test 1.3 Link adaptation
+ * @brief Test 1.3 Link adaptation
  */
 class LteLinkAdaptationTestSuite : public TestSuite
 {
@@ -26,9 +26,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test that LTE link adaptation works according to the theoretical model.
+ * @brief Test that LTE link adaptation works according to the theoretical model.
  */
 class LteLinkAdaptationTestCase : public TestCase
 {
@@ -36,18 +36,18 @@
     /**
      * Constructor
      *
-     * \param name the reference name
-     * \param snrDb the SNR in dB
-     * \param loss the loss
-     * \param mcsIndex the DL se
+     * @param name the reference name
+     * @param snrDb the SNR in dB
+     * @param loss the loss
+     * @param mcsIndex the DL se
      */
     LteLinkAdaptationTestCase(std::string name, double snrDb, double loss, uint16_t mcsIndex);
     LteLinkAdaptationTestCase();
     ~LteLinkAdaptationTestCase() override;
 
     /**
-     * \brief DL scheduling function
-     * \param dlInfo the DL info
+     * @brief DL scheduling function
+     * @param dlInfo the DL info
      */
     void DlScheduling(DlSchedulingCallbackInfo dlInfo);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-mimo.cc ns-3.44/src/lte/test/lte-test-mimo.cc
--- ns-3.43/src/lte/test/lte-test-mimo.cc	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-mimo.cc	2025-03-09 16:55:49.611372000 -0700
@@ -8,35 +8,35 @@
 
 #include "lte-test-mimo.h"
 
+#include "ns3/boolean.h"
+#include "ns3/buildings-helper.h"
+#include "ns3/buildings-propagation-loss-model.h"
 #include "ns3/double.h"
+#include "ns3/enum.h"
+#include "ns3/eps-bearer.h"
+#include "ns3/log.h"
+#include "ns3/lte-enb-net-device.h"
+#include "ns3/lte-enb-phy.h"
+#include "ns3/lte-helper.h"
+#include "ns3/lte-ue-net-device.h"
+#include "ns3/lte-ue-phy.h"
+#include "ns3/lte-ue-rrc.h"
+#include "ns3/mobility-building-info.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/net-device-container.h"
+#include "ns3/node-container.h"
+#include "ns3/object.h"
+#include "ns3/packet.h"
+#include "ns3/pf-ff-mac-scheduler.h"
+#include "ns3/pointer.h"
+#include "ns3/ptr.h"
 #include "ns3/radio-bearer-stats-calculator.h"
+#include "ns3/rr-ff-mac-scheduler.h"
+#include "ns3/simulator.h"
+#include "ns3/spectrum-error-model.h"
+#include "ns3/spectrum-interference.h"
 #include "ns3/string.h"
-#include <ns3/boolean.h>
-#include <ns3/buildings-helper.h>
-#include <ns3/buildings-propagation-loss-model.h>
-#include <ns3/enum.h>
-#include <ns3/eps-bearer.h>
-#include <ns3/log.h>
-#include <ns3/lte-enb-net-device.h>
-#include <ns3/lte-enb-phy.h>
-#include <ns3/lte-helper.h>
-#include <ns3/lte-ue-net-device.h>
-#include <ns3/lte-ue-phy.h>
-#include <ns3/lte-ue-rrc.h>
-#include <ns3/mobility-building-info.h>
-#include <ns3/mobility-helper.h>
-#include <ns3/net-device-container.h>
-#include <ns3/node-container.h>
-#include <ns3/object.h>
-#include <ns3/packet.h>
-#include <ns3/pf-ff-mac-scheduler.h>
-#include <ns3/pointer.h>
-#include <ns3/ptr.h>
-#include <ns3/rr-ff-mac-scheduler.h>
-#include <ns3/simulator.h>
-#include <ns3/spectrum-error-model.h>
-#include <ns3/spectrum-interference.h>
-#include <ns3/test.h>
+#include "ns3/test.h"
 
 #include <iostream>
 #include <sstream>
@@ -71,7 +71,7 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LenaTestMimoSuite lenaTestMimoSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-mimo.h ns-3.44/src/lte/test/lte-test-mimo.h
--- ns-3.43/src/lte/test/lte-test-mimo.h	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-mimo.h	2025-03-09 16:55:49.611372000 -0700
@@ -20,9 +20,9 @@
 using namespace ns3;
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief This system test program creates different test cases with a
+ * @brief This system test program creates different test cases with a
  * single eNB and single UE. The traffic is configured to be in saturation
  * mode. It is checked if the throughput reaches the expected values
  * when MIMO is used.
@@ -33,10 +33,10 @@
     /**
      * Constructor
      *
-     * \param dist the distance
-     * \param estThrDl the estimated throughput DL
-     * \param schedulerType the scheduler type
-     * \param useIdealRrc true if use ideal RRC
+     * @param dist the distance
+     * @param estThrDl the estimated throughput DL
+     * @param schedulerType the scheduler type
+     * @param useIdealRrc true if use ideal RRC
      */
     LenaMimoTestCase(uint16_t dist,
                      std::vector<uint32_t> estThrDl,
@@ -49,18 +49,18 @@
 
     /**
      * Get RLC buffer sample
-     * \param rlcStats Ptr<RadioBearerStatsCalculator>
-     * \param imsi the IMSI
-     * \param rnti the RNTI
+     * @param rlcStats Ptr<RadioBearerStatsCalculator>
+     * @param imsi the IMSI
+     * @param rnti the RNTI
      */
     void GetRlcBufferSample(Ptr<RadioBearerStatsCalculator> rlcStats, uint64_t imsi, uint8_t rnti);
 
     /**
      * Builds the test name string based on provided parameter values
-     * \param dist the distance
-     * \param schedulerType the scheduler type
-     * \param useIdealRrc if true use the ideal RRC
-     * \returns the name string
+     * @param dist the distance
+     * @param schedulerType the scheduler type
+     * @param useIdealRrc if true use the ideal RRC
+     * @returns the name string
      */
     static std::string BuildNameString(uint16_t dist, std::string schedulerType, bool useIdealRrc);
     uint16_t m_dist;                  ///< the distance
@@ -72,9 +72,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Lena Test Mimo Suite
+ * @brief Lena Test Mimo Suite
  */
 
 class LenaTestMimoSuite : public TestSuite
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-pathloss-model.cc ns-3.44/src/lte/test/lte-test-pathloss-model.cc
--- ns-3.43/src/lte/test/lte-test-pathloss-model.cc	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-pathloss-model.cc	2025-03-09 16:55:49.611372000 -0700
@@ -10,28 +10,28 @@
 
 #include "lte-test-ue-phy.h"
 
+#include "ns3/boolean.h"
+#include "ns3/building.h"
+#include "ns3/buildings-helper.h"
 #include "ns3/double.h"
+#include "ns3/enum.h"
+#include "ns3/hybrid-buildings-propagation-loss-model.h"
 #include "ns3/log.h"
 #include "ns3/lte-chunk-processor.h"
+#include "ns3/lte-enb-net-device.h"
+#include "ns3/lte-enb-phy.h"
+#include "ns3/lte-helper.h"
 #include "ns3/lte-phy-tag.h"
+#include "ns3/lte-ue-net-device.h"
+#include "ns3/lte-ue-phy.h"
+#include "ns3/lte-ue-rrc.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/net-device-container.h"
+#include "ns3/node-container.h"
 #include "ns3/simulator.h"
+#include "ns3/single-model-spectrum-channel.h"
 #include "ns3/spectrum-test.h"
 #include "ns3/string.h"
-#include <ns3/boolean.h>
-#include <ns3/building.h>
-#include <ns3/buildings-helper.h>
-#include <ns3/enum.h>
-#include <ns3/hybrid-buildings-propagation-loss-model.h>
-#include <ns3/lte-enb-net-device.h>
-#include <ns3/lte-enb-phy.h>
-#include <ns3/lte-helper.h>
-#include <ns3/lte-ue-net-device.h>
-#include <ns3/lte-ue-phy.h>
-#include <ns3/lte-ue-rrc.h>
-#include <ns3/mobility-helper.h>
-#include <ns3/net-device-container.h>
-#include <ns3/node-container.h>
-#include <ns3/single-model-spectrum-channel.h>
 
 using namespace ns3;
 
@@ -131,7 +131,7 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LtePathlossModelTestSuite ltePathlossModelTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-pathloss-model.h ns-3.44/src/lte/test/lte-test-pathloss-model.h
--- ns-3.43/src/lte/test/lte-test-pathloss-model.h	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-pathloss-model.h	2025-03-09 16:55:49.611372000 -0700
@@ -9,17 +9,17 @@
 #ifndef LTE_TEST_PATHLOSS_MODEL_H
 #define LTE_TEST_PATHLOSS_MODEL_H
 
+#include "ns3/buildings-propagation-loss-model.h"
 #include "ns3/lte-common.h"
 #include "ns3/spectrum-value.h"
 #include "ns3/test.h"
-#include <ns3/buildings-propagation-loss-model.h>
 
 using namespace ns3;
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test 1.1 pathloss calculation
+ * @brief Test 1.1 pathloss calculation
  */
 class LtePathlossModelTestSuite : public TestSuite
 {
@@ -28,9 +28,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief  Tests that the BuildingPathlossModel works according to
+ * @brief  Tests that the BuildingPathlossModel works according to
  * the expected theoretical values. Theoretical reference values
  * are obtained with the octave script src/lte/test/reference/lte_pathloss.m
  */
@@ -40,18 +40,18 @@
     /**
      * Constructor
      *
-     * \param name the reference name
-     * \param snrDb the SNR in dB
-     * \param dist the distance
-     * \param mcsIndex the MCS index
+     * @param name the reference name
+     * @param snrDb the SNR in dB
+     * @param dist the distance
+     * @param mcsIndex the MCS index
      */
     LtePathlossModelSystemTestCase(std::string name, double snrDb, double dist, uint16_t mcsIndex);
     LtePathlossModelSystemTestCase();
     ~LtePathlossModelSystemTestCase() override;
 
     /**
-     * \brief DL scheduling function
-     * \param dlInfo the DL info
+     * @brief DL scheduling function
+     * @param dlInfo the DL info
      */
     void DlScheduling(DlSchedulingCallbackInfo dlInfo);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-pf-ff-mac-scheduler.cc ns-3.44/src/lte/test/lte-test-pf-ff-mac-scheduler.cc
--- ns-3.43/src/lte/test/lte-test-pf-ff-mac-scheduler.cc	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-pf-ff-mac-scheduler.cc	2025-03-09 16:55:49.611372000 -0700
@@ -9,31 +9,31 @@
 
 #include "lte-test-pf-ff-mac-scheduler.h"
 
+#include "ns3/boolean.h"
+#include "ns3/constant-position-mobility-model.h"
 #include "ns3/double.h"
+#include "ns3/enum.h"
+#include "ns3/eps-bearer.h"
+#include "ns3/ff-mac-scheduler.h"
+#include "ns3/log.h"
+#include "ns3/lte-enb-net-device.h"
+#include "ns3/lte-enb-phy.h"
+#include "ns3/lte-helper.h"
+#include "ns3/lte-ue-net-device.h"
+#include "ns3/lte-ue-phy.h"
+#include "ns3/lte-ue-rrc.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/net-device-container.h"
+#include "ns3/node-container.h"
+#include "ns3/object.h"
+#include "ns3/packet.h"
+#include "ns3/ptr.h"
 #include "ns3/radio-bearer-stats-calculator.h"
+#include "ns3/simulator.h"
+#include "ns3/spectrum-error-model.h"
+#include "ns3/spectrum-interference.h"
 #include "ns3/string.h"
-#include <ns3/boolean.h>
-#include <ns3/constant-position-mobility-model.h>
-#include <ns3/enum.h>
-#include <ns3/eps-bearer.h>
-#include <ns3/ff-mac-scheduler.h>
-#include <ns3/log.h>
-#include <ns3/lte-enb-net-device.h>
-#include <ns3/lte-enb-phy.h>
-#include <ns3/lte-helper.h>
-#include <ns3/lte-ue-net-device.h>
-#include <ns3/lte-ue-phy.h>
-#include <ns3/lte-ue-rrc.h>
-#include <ns3/mobility-helper.h>
-#include <ns3/net-device-container.h>
-#include <ns3/node-container.h>
-#include <ns3/object.h>
-#include <ns3/packet.h>
-#include <ns3/ptr.h>
-#include <ns3/simulator.h>
-#include <ns3/spectrum-error-model.h>
-#include <ns3/spectrum-interference.h>
-#include <ns3/test.h>
+#include "ns3/test.h"
 
 #include <iostream>
 #include <sstream>
@@ -202,7 +202,7 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LenaTestPfFfMacSchedulerSuite lenaTestPfFfMacSchedulerSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-pf-ff-mac-scheduler.h ns-3.44/src/lte/test/lte-test-pf-ff-mac-scheduler.h
--- ns-3.43/src/lte/test/lte-test-pf-ff-mac-scheduler.h	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-pf-ff-mac-scheduler.h	2025-03-09 16:55:49.611372000 -0700
@@ -16,9 +16,9 @@
 using namespace ns3;
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief This system test program creates different test cases with a single eNB and
+ * @brief This system test program creates different test cases with a single eNB and
  * several UEs, all having the same Radio Bearer specification. In each test
  * case, the UEs see the same SINR from the eNB; different test cases are
  * implemented obtained by using different SINR values and different numbers of
@@ -32,11 +32,11 @@
     /**
      * Constructor
      *
-     * \param nUser the number of UE nodes
-     * \param dist the distance between nodes
-     * \param thrRefDl the DL throughput reference
-     * \param thrRefUl the UL throughput reference
-     * \param errorModelEnabled if true the error model is enabled
+     * @param nUser the number of UE nodes
+     * @param dist the distance between nodes
+     * @param thrRefDl the DL throughput reference
+     * @param thrRefUl the UL throughput reference
+     * @param errorModelEnabled if true the error model is enabled
      */
     LenaPfFfMacSchedulerTestCase1(uint16_t nUser,
                                   double dist,
@@ -48,9 +48,9 @@
   private:
     /**
      * Build name string
-     * \param nUser the number of UE nodes
-     * \param dist the distance between nodes
-     * \returns the name string
+     * @param nUser the number of UE nodes
+     * @param dist the distance between nodes
+     * @returns the name string
      */
     static std::string BuildNameString(uint16_t nUser, double dist);
     void DoRun() override;
@@ -62,9 +62,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Lena PfFf Mac Scheduler Test Case 2
+ * @brief Lena PfFf Mac Scheduler Test Case 2
  */
 class LenaPfFfMacSchedulerTestCase2 : public TestCase
 {
@@ -72,10 +72,10 @@
     /**
      * Constructor
      *
-     * \param dist the distance between nodes
-     * \param estThrPfDl the estimated DL throughput PF
-     * \param estThrPfUl the estimated UL throughput PF
-     * \param errorModelEnabled if true the error model is enabled
+     * @param dist the distance between nodes
+     * @param estThrPfDl the estimated DL throughput PF
+     * @param estThrPfUl the estimated UL throughput PF
+     * @param errorModelEnabled if true the error model is enabled
      */
     LenaPfFfMacSchedulerTestCase2(std::vector<double> dist,
                                   std::vector<uint32_t> estThrPfDl,
@@ -86,9 +86,9 @@
   private:
     /**
      * Builds the test name string based on provided parameter values
-     * \param nUser the number of UE nodes
-     * \param dist the distance between nodes
-     * \returns the name string
+     * @param nUser the number of UE nodes
+     * @param dist the distance between nodes
+     * @returns the name string
      */
     static std::string BuildNameString(uint16_t nUser, std::vector<double> dist);
     void DoRun() override;
@@ -100,9 +100,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief PfFfMacScheduler test suite
+ * @brief PfFfMacScheduler test suite
  */
 
 class LenaTestPfFfMacSchedulerSuite : public TestSuite
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-phy-error-model.cc ns-3.44/src/lte/test/lte-test-phy-error-model.cc
--- ns-3.43/src/lte/test/lte-test-phy-error-model.cc	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-phy-error-model.cc	2025-03-09 16:55:49.611372000 -0700
@@ -9,35 +9,35 @@
 
 #include "lte-test-phy-error-model.h"
 
-#include <ns3/boolean.h>
-#include <ns3/buildings-helper.h>
-#include <ns3/config.h>
-#include <ns3/double.h>
-#include <ns3/enum.h>
-#include <ns3/eps-bearer.h>
-#include <ns3/ff-mac-scheduler.h>
-#include <ns3/hybrid-buildings-propagation-loss-model.h>
-#include <ns3/integer.h>
-#include <ns3/log.h>
-#include <ns3/lte-enb-net-device.h>
-#include <ns3/lte-enb-phy.h>
-#include <ns3/lte-helper.h>
-#include <ns3/lte-ue-net-device.h>
-#include <ns3/lte-ue-phy.h>
-#include <ns3/lte-ue-rrc.h>
-#include <ns3/mobility-building-info.h>
-#include <ns3/mobility-helper.h>
-#include <ns3/net-device-container.h>
-#include <ns3/node-container.h>
-#include <ns3/object.h>
-#include <ns3/packet.h>
-#include <ns3/ptr.h>
-#include <ns3/radio-bearer-stats-calculator.h>
-#include <ns3/simulator.h>
-#include <ns3/spectrum-error-model.h>
-#include <ns3/spectrum-interference.h>
-#include <ns3/string.h>
-#include <ns3/test.h>
+#include "ns3/boolean.h"
+#include "ns3/buildings-helper.h"
+#include "ns3/config.h"
+#include "ns3/double.h"
+#include "ns3/enum.h"
+#include "ns3/eps-bearer.h"
+#include "ns3/ff-mac-scheduler.h"
+#include "ns3/hybrid-buildings-propagation-loss-model.h"
+#include "ns3/integer.h"
+#include "ns3/log.h"
+#include "ns3/lte-enb-net-device.h"
+#include "ns3/lte-enb-phy.h"
+#include "ns3/lte-helper.h"
+#include "ns3/lte-ue-net-device.h"
+#include "ns3/lte-ue-phy.h"
+#include "ns3/lte-ue-rrc.h"
+#include "ns3/mobility-building-info.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/net-device-container.h"
+#include "ns3/node-container.h"
+#include "ns3/object.h"
+#include "ns3/packet.h"
+#include "ns3/ptr.h"
+#include "ns3/radio-bearer-stats-calculator.h"
+#include "ns3/simulator.h"
+#include "ns3/spectrum-error-model.h"
+#include "ns3/spectrum-interference.h"
+#include "ns3/string.h"
+#include "ns3/test.h"
 
 #include <iostream>
 
@@ -112,7 +112,7 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LenaTestPhyErrorModelSuite lenaTestPhyErrorModelSuite;
@@ -230,7 +230,7 @@
         uePhy->SetAttribute("NoiseFigure", DoubleValue(9.0));
     }
 
-    Time statsDuration = Seconds(1.0);
+    Time statsDuration = Seconds(1);
     Simulator::Stop(m_statsStartTime + statsDuration - Seconds(0.0001));
 
     lena->EnableRlcTraces();
@@ -392,7 +392,7 @@
     uePhy->SetAttribute("TxPower", DoubleValue(23.0));
     uePhy->SetAttribute("NoiseFigure", DoubleValue(9.0));
 
-    Time statsDuration = Seconds(1.0);
+    Time statsDuration = Seconds(1);
     Simulator::Stop(m_statsStartTime + statsDuration - Seconds(0.0001));
 
     lena->EnableRlcTraces();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-phy-error-model.h ns-3.44/src/lte/test/lte-test-phy-error-model.h
--- ns-3.43/src/lte/test/lte-test-phy-error-model.h	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-phy-error-model.h	2025-03-09 16:55:49.611372000 -0700
@@ -9,16 +9,16 @@
 #ifndef LENA_TEST_PHY_ERROR_MODEL_H
 #define LENA_TEST_PHY_ERROR_MODEL_H
 
-#include <ns3/nstime.h>
-#include <ns3/simulator.h>
-#include <ns3/test.h>
+#include "ns3/nstime.h"
+#include "ns3/simulator.h"
+#include "ns3/test.h"
 
 using namespace ns3;
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief This system test program creates different test cases with a single eNB and
+ * @brief This system test program creates different test cases with a single eNB and
  * several UEs, all having the same Radio Bearer specification. In each test
  * case, the UEs see the same SINR from the eNB; different test cases are
  * implemented obtained by using different SINR values and different numbers of
@@ -30,12 +30,12 @@
     /**
      * Constructor
      *
-     * \param nUser the number of UE nodes
-     * \param dist the distance between nodes
-     * \param blerRef expected BLER
-     * \param toleranceRxPackets receive packet loss tolerance
-     * \param statsStartTime the start time for collecting statistics
-     * \param rngRun rng run
+     * @param nUser the number of UE nodes
+     * @param dist the distance between nodes
+     * @param blerRef expected BLER
+     * @param toleranceRxPackets receive packet loss tolerance
+     * @param statsStartTime the start time for collecting statistics
+     * @param rngRun rng run
      */
     LenaDataPhyErrorModelTestCase(uint16_t nUser,
                                   uint16_t dist,
@@ -49,10 +49,10 @@
     void DoRun() override;
     /**
      * Builds the test name string based on provided parameter values
-     * \param nUser the number of UE nodes
-     * \param dist the distance between nodes
-     * \param rngRun the rng run
-     * \returns the name string
+     * @param nUser the number of UE nodes
+     * @param dist the distance between nodes
+     * @param rngRun the rng run
+     * @returns the name string
      */
     static std::string BuildNameString(uint16_t nUser, uint16_t dist, uint32_t rngRun);
     uint16_t m_nUser;              ///< number of UE nodes
@@ -65,9 +65,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Lena Dl Ctrl Phy Error Model Test Case
+ * @brief Lena Dl Ctrl Phy Error Model Test Case
  */
 class LenaDlCtrlPhyErrorModelTestCase : public TestCase
 {
@@ -75,12 +75,12 @@
     /**
      * Constructor
      *
-     * \param nEnb the number of ENB nodes
-     * \param dist the distance between nodes
-     * \param blerRef expected BLER
-     * \param toleranceRxPackets receive packet loss tolerance
-     * \param statsStartTime the start time for collecting statistics
-     * \param rngRun rng number
+     * @param nEnb the number of ENB nodes
+     * @param dist the distance between nodes
+     * @param blerRef expected BLER
+     * @param toleranceRxPackets receive packet loss tolerance
+     * @param statsStartTime the start time for collecting statistics
+     * @param rngRun rng number
      */
     LenaDlCtrlPhyErrorModelTestCase(uint16_t nEnb,
                                     uint16_t dist,
@@ -94,10 +94,10 @@
     void DoRun() override;
     /**
      * Build name string
-     * \param nUser the number of UE nodes
-     * \param dist the distance between nodes
-     * \param rngRun the rng run
-     * \returns the name string
+     * @param nUser the number of UE nodes
+     * @param dist the distance between nodes
+     * @param rngRun the rng run
+     * @returns the name string
      */
     static std::string BuildNameString(uint16_t nUser, uint16_t dist, uint32_t rngRun);
     uint16_t m_nEnb;               ///< the number of ENB nodes
@@ -110,9 +110,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Lena Test Phy Error Model Suite
+ * @brief Lena Test Phy Error Model Suite
  */
 class LenaTestPhyErrorModelSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-primary-cell-change.cc ns-3.44/src/lte/test/lte-test-primary-cell-change.cc
--- ns-3.43/src/lte/test/lte-test-primary-cell-change.cc	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-primary-cell-change.cc	2025-03-09 16:55:49.611372000 -0700
@@ -9,25 +9,25 @@
 
 #include "lte-test-primary-cell-change.h"
 
-#include <ns3/boolean.h>
-#include <ns3/double.h>
-#include <ns3/friis-spectrum-propagation-loss.h>
-#include <ns3/integer.h>
-#include <ns3/internet-stack-helper.h>
-#include <ns3/ipv4-address-helper.h>
-#include <ns3/ipv4-interface-container.h>
-#include <ns3/ipv4-static-routing-helper.h>
-#include <ns3/log.h>
-#include <ns3/lte-enb-net-device.h>
-#include <ns3/lte-helper.h>
-#include <ns3/lte-ue-net-device.h>
-#include <ns3/lte-ue-rrc.h>
-#include <ns3/mobility-helper.h>
-#include <ns3/net-device-container.h>
-#include <ns3/node-container.h>
-#include <ns3/point-to-point-epc-helper.h>
-#include <ns3/point-to-point-helper.h>
-#include <ns3/simulator.h>
+#include "ns3/boolean.h"
+#include "ns3/double.h"
+#include "ns3/friis-spectrum-propagation-loss.h"
+#include "ns3/integer.h"
+#include "ns3/internet-stack-helper.h"
+#include "ns3/ipv4-address-helper.h"
+#include "ns3/ipv4-interface-container.h"
+#include "ns3/ipv4-static-routing-helper.h"
+#include "ns3/log.h"
+#include "ns3/lte-enb-net-device.h"
+#include "ns3/lte-helper.h"
+#include "ns3/lte-ue-net-device.h"
+#include "ns3/lte-ue-rrc.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/net-device-container.h"
+#include "ns3/node-container.h"
+#include "ns3/point-to-point-epc-helper.h"
+#include "ns3/point-to-point-helper.h"
+#include "ns3/simulator.h"
 
 using namespace ns3;
 
@@ -86,7 +86,7 @@
 } // end of LtePrimaryCellChangeTestSuite::LtePrimaryCellChangeTestSuite ()
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LtePrimaryCellChangeTestSuite g_ltePrimaryCellChangeTestSuite;
@@ -182,10 +182,10 @@
                                 ->GetCellId();
 
     lteHelper->AddX2Interface(enbNodes);
-    lteHelper->HandoverRequest(Seconds(1.0), ueDev, sourceEnbDev, targetCellId);
+    lteHelper->HandoverRequest(Seconds(1), ueDev, sourceEnbDev, targetCellId);
 
     // Run simulation.
-    Simulator::Stop(Seconds(2.0));
+    Simulator::Stop(Seconds(2));
     Simulator::Run();
 
     uint16_t expectedCellId = targetCellId;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-primary-cell-change.h ns-3.44/src/lte/test/lte-test-primary-cell-change.h
--- ns-3.43/src/lte/test/lte-test-primary-cell-change.h	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-primary-cell-change.h	2025-03-09 16:55:49.611372000 -0700
@@ -10,18 +10,18 @@
 #ifndef LTE_TEST_PRIMARY_CELL_CHANGE_H
 #define LTE_TEST_PRIMARY_CELL_CHANGE_H
 
-#include <ns3/lte-ue-rrc.h>
-#include <ns3/node-container.h>
-#include <ns3/nstime.h>
-#include <ns3/test.h>
-#include <ns3/vector.h>
+#include "ns3/lte-ue-rrc.h"
+#include "ns3/node-container.h"
+#include "ns3/nstime.h"
+#include "ns3/test.h"
+#include "ns3/vector.h"
 
 #include <vector>
 
 using namespace ns3;
 
 /**
- * \brief Test suite for executing the primary cell change test cases.
+ * @brief Test suite for executing the primary cell change test cases.
  *
  * \sa ns3::LtePrimaryCellChangeTestCase
  */
@@ -32,22 +32,22 @@
 };
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
- * \brief Testing the handover procedure with multiple component carriers.
+ * @brief Testing the handover procedure with multiple component carriers.
  */
 class LtePrimaryCellChangeTestCase : public TestCase
 {
   public:
     /**
-     * \brief Creates an instance of the initial cell selection test case.
-     * \param name name of this test
-     * \param isIdealRrc if true, simulation uses Ideal RRC protocol, otherwise
+     * @brief Creates an instance of the initial cell selection test case.
+     * @param name name of this test
+     * @param isIdealRrc if true, simulation uses Ideal RRC protocol, otherwise
      *                   simulation uses Real RRC protocol
-     * \param rngRun the number of run to be used by the random number generator
-     * \param numberOfComponentCarriers number of component carriers
-     * \param sourceComponentCarrier source component carrier
-     * \param targetComponentCarrier target component carrier
+     * @param rngRun the number of run to be used by the random number generator
+     * @param numberOfComponentCarriers number of component carriers
+     * @param sourceComponentCarrier source component carrier
+     * @param targetComponentCarrier target component carrier
      *
      * If sourceComponentCarrier or targetComponentCarrier is greater than
      * number of component carriers, it identifies component carrier on second eNB.
@@ -63,19 +63,19 @@
 
   private:
     /**
-     * \brief Setup the simulation according to the configuration set by the
+     * @brief Setup the simulation according to the configuration set by the
      *        class constructor, run it, and verify the result.
      */
     void DoRun() override;
 
     /**
-     * \brief State transition callback function
-     * \param context the context string
-     * \param imsi the IMSI
-     * \param cellId the cell ID
-     * \param rnti the RNTI
-     * \param oldState the old state
-     * \param newState the new state
+     * @brief State transition callback function
+     * @param context the context string
+     * @param imsi the IMSI
+     * @param cellId the cell ID
+     * @param rnti the RNTI
+     * @param oldState the old state
+     * @param newState the new state
      */
     void StateTransitionCallback(std::string context,
                                  uint64_t imsi,
@@ -84,18 +84,18 @@
                                  LteUeRrc::State oldState,
                                  LteUeRrc::State newState);
     /**
-     * \brief Initial cell selection end ok callback function
-     * \param context the context string
-     * \param imsi the IMSI
-     * \param cellId the cell ID
+     * @brief Initial cell selection end ok callback function
+     * @param context the context string
+     * @param imsi the IMSI
+     * @param cellId the cell ID
      */
     void InitialPrimaryCellChangeEndOkCallback(std::string context, uint64_t imsi, uint16_t cellId);
     /**
-     * \brief Connection established callback function
-     * \param context the context string
-     * \param imsi the IMSI
-     * \param cellId the cell ID
-     * \param rnti the RNTI
+     * @brief Connection established callback function
+     * @param context the context string
+     * @param imsi the IMSI
+     * @param cellId the cell ID
+     * @param rnti the RNTI
      */
     void ConnectionEstablishedCallback(std::string context,
                                        uint64_t imsi,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-pss-ff-mac-scheduler.cc ns-3.44/src/lte/test/lte-test-pss-ff-mac-scheduler.cc
--- ns-3.43/src/lte/test/lte-test-pss-ff-mac-scheduler.cc	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-pss-ff-mac-scheduler.cc	2025-03-09 16:55:49.611372000 -0700
@@ -10,38 +10,38 @@
 
 #include "lte-test-pss-ff-mac-scheduler.h"
 
+#include "ns3/boolean.h"
+#include "ns3/constant-position-mobility-model.h"
 #include "ns3/double.h"
+#include "ns3/enum.h"
+#include "ns3/eps-bearer.h"
+#include "ns3/ff-mac-scheduler.h"
 #include "ns3/internet-module.h"
 #include "ns3/ipv4-global-routing-helper.h"
+#include "ns3/log.h"
+#include "ns3/lte-enb-net-device.h"
+#include "ns3/lte-enb-phy.h"
+#include "ns3/lte-helper.h"
+#include "ns3/lte-ue-net-device.h"
+#include "ns3/lte-ue-phy.h"
+#include "ns3/lte-ue-rrc.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/net-device-container.h"
 #include "ns3/network-module.h"
+#include "ns3/node-container.h"
+#include "ns3/object.h"
 #include "ns3/packet-sink-helper.h"
+#include "ns3/packet.h"
 #include "ns3/point-to-point-epc-helper.h"
 #include "ns3/point-to-point-helper.h"
+#include "ns3/ptr.h"
 #include "ns3/radio-bearer-stats-calculator.h"
+#include "ns3/simulator.h"
+#include "ns3/spectrum-error-model.h"
+#include "ns3/spectrum-interference.h"
 #include "ns3/string.h"
+#include "ns3/test.h"
 #include "ns3/udp-client-server-helper.h"
-#include <ns3/boolean.h>
-#include <ns3/constant-position-mobility-model.h>
-#include <ns3/enum.h>
-#include <ns3/eps-bearer.h>
-#include <ns3/ff-mac-scheduler.h>
-#include <ns3/log.h>
-#include <ns3/lte-enb-net-device.h>
-#include <ns3/lte-enb-phy.h>
-#include <ns3/lte-helper.h>
-#include <ns3/lte-ue-net-device.h>
-#include <ns3/lte-ue-phy.h>
-#include <ns3/lte-ue-rrc.h>
-#include <ns3/mobility-helper.h>
-#include <ns3/net-device-container.h>
-#include <ns3/node-container.h>
-#include <ns3/object.h>
-#include <ns3/packet.h>
-#include <ns3/ptr.h>
-#include <ns3/simulator.h>
-#include <ns3/spectrum-error-model.h>
-#include <ns3/spectrum-interference.h>
-#include <ns3/test.h>
 
 #include <iostream>
 #include <sstream>
@@ -249,7 +249,7 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LenaTestPssFfMacSchedulerSuite lenaTestPssFfMacSchedulerSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-pss-ff-mac-scheduler.h ns-3.44/src/lte/test/lte-test-pss-ff-mac-scheduler.h
--- ns-3.43/src/lte/test/lte-test-pss-ff-mac-scheduler.h	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-pss-ff-mac-scheduler.h	2025-03-09 16:55:49.611372000 -0700
@@ -17,9 +17,9 @@
 using namespace ns3;
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief This system test program creates different test cases with a single eNB and
+ * @brief This system test program creates different test cases with a single eNB and
  * several UEs, all having the same Radio Bearer specification. In each test
  * case, the UEs see the same SINR from the eNB; different test cases are
  * implemented obtained by using different SINR values and different numbers of
@@ -33,13 +33,13 @@
     /**
      * Constructor
      *
-     * \param nUser the number of UE nodes
-     * \param dist the distance between nodes
-     * \param thrRefDl the DL throughput reference
-     * \param thrRefUl the UL throughput reference
-     * \param packetSize the packet size
-     * \param interval the interval time
-     * \param errorModelEnabled if true the error model is enabled
+     * @param nUser the number of UE nodes
+     * @param dist the distance between nodes
+     * @param thrRefDl the DL throughput reference
+     * @param thrRefUl the UL throughput reference
+     * @param packetSize the packet size
+     * @param interval the interval time
+     * @param errorModelEnabled if true the error model is enabled
      */
     LenaPssFfMacSchedulerTestCase1(uint16_t nUser,
                                    double dist,
@@ -53,9 +53,9 @@
   private:
     /**
      * Builds the test name string based on provided parameter values
-     * \param nUser the number of UE nodes
-     * \param dist the distance between nodes
-     * \returns the name string
+     * @param nUser the number of UE nodes
+     * @param dist the distance between nodes
+     * @returns the name string
      */
     static std::string BuildNameString(uint16_t nUser, double dist);
     void DoRun() override;
@@ -69,9 +69,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Similar to the LenaPssFfMacSchedulerTestCase1 with the difference that
+ * @brief Similar to the LenaPssFfMacSchedulerTestCase1 with the difference that
  * UEs are places in such a way to experience different SINRs. Test checks if the
  * achieved throughput in such conditions has expected value.
  */
@@ -81,11 +81,11 @@
     /**
      * Constructor
      *
-     * \param dist the distance between nodes
-     * \param estThrPssDl the estimated DL throughput PSS
-     * \param packetSize the packet size
-     * \param interval the interval time
-     * \param errorModelEnabled if true the error model is enabled
+     * @param dist the distance between nodes
+     * @param estThrPssDl the estimated DL throughput PSS
+     * @param packetSize the packet size
+     * @param interval the interval time
+     * @param errorModelEnabled if true the error model is enabled
      */
     LenaPssFfMacSchedulerTestCase2(std::vector<double> dist,
                                    std::vector<uint32_t> estThrPssDl,
@@ -97,9 +97,9 @@
   private:
     /**
      * Builds the test name string based on provided parameter values
-     * \param nUser the number of UE nodes
-     * \param dist the distance between nodes
-     * \returns the name string
+     * @param nUser the number of UE nodes
+     * @param dist the distance between nodes
+     * @returns the name string
      */
     static std::string BuildNameString(uint16_t nUser, std::vector<double> dist);
     void DoRun() override;
@@ -112,9 +112,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Lena Pss Ff Mac Scheduler Test Suite
+ * @brief Lena Pss Ff Mac Scheduler Test Suite
  */
 class LenaTestPssFfMacSchedulerSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-radio-link-failure.cc ns-3.44/src/lte/test/lte-test-radio-link-failure.cc
--- ns-3.43/src/lte/test/lte-test-radio-link-failure.cc	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-radio-link-failure.cc	2025-03-09 16:55:49.611372000 -0700
@@ -104,7 +104,7 @@
 } // end of LteRadioLinkFailureTestSuite::LteRadioLinkFailureTestSuite ()
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LteRadioLinkFailureTestSuite g_lteRadioLinkFailureTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-radio-link-failure.h ns-3.44/src/lte/test/lte-test-radio-link-failure.h
--- ns-3.43/src/lte/test/lte-test-radio-link-failure.h	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-radio-link-failure.h	2025-03-09 16:55:49.611372000 -0700
@@ -9,13 +9,13 @@
 #ifndef LTE_TEST_RADIO_LINK_FAILURE_H
 #define LTE_TEST_RADIO_LINK_FAILURE_H
 
-#include <ns3/lte-ue-rrc.h>
-#include <ns3/mobility-model.h>
-#include <ns3/net-device-container.h>
-#include <ns3/node-container.h>
-#include <ns3/nstime.h>
-#include <ns3/test.h>
-#include <ns3/vector.h>
+#include "ns3/lte-ue-rrc.h"
+#include "ns3/mobility-model.h"
+#include "ns3/net-device-container.h"
+#include "ns3/node-container.h"
+#include "ns3/nstime.h"
+#include "ns3/test.h"
+#include "ns3/vector.h"
 
 #include <vector>
 
@@ -29,7 +29,7 @@
 using namespace ns3;
 
 /**
- * \brief Test suite for
+ * @brief Test suite for
  *
  * \sa ns3::LteRadioLinkFailureTestCase
  */
@@ -40,25 +40,25 @@
 };
 
 /**
- * \ingroup lte
+ * @ingroup lte
  *
- * \brief Testing the cell reselection procedure by UE at IDLE state
+ * @brief Testing the cell reselection procedure by UE at IDLE state
  */
 class LteRadioLinkFailureTestCase : public TestCase
 {
   public:
     /**
-     * \brief Creates an instance of the radio link failure test case.
+     * @brief Creates an instance of the radio link failure test case.
      *
-     * \param numEnbs number of eNodeBs
-     * \param numUes number of UEs
-     * \param simTime the simulation time
-     * \param isIdealRrc if true, simulation uses Ideal RRC protocol, otherwise
+     * @param numEnbs number of eNodeBs
+     * @param numUes number of UEs
+     * @param simTime the simulation time
+     * @param isIdealRrc if true, simulation uses Ideal RRC protocol, otherwise
      *                   simulation uses Real RRC protocol
-     * \param uePositionList Position of the UEs
-     * \param enbPositionList Position of the eNodeBs
-     * \param ueJumpAwayPosition Vector holding the UE jump away coordinates
-     * \param checkConnectedList the time at which UEs should have an active RRC connection
+     * @param uePositionList Position of the UEs
+     * @param enbPositionList Position of the eNodeBs
+     * @param ueJumpAwayPosition Vector holding the UE jump away coordinates
+     * @param checkConnectedList the time at which UEs should have an active RRC connection
      */
     LteRadioLinkFailureTestCase(uint32_t numEnbs,
                                 uint32_t numUes,
@@ -74,48 +74,48 @@
   private:
     /**
      * Builds the test name string based on provided parameter values
-     * \param numEnbs the number of eNB nodes
-     * \param numUes the number of UE nodes
-     * \param isIdealRrc True if the Ideal RRC protocol is used
-     * \returns the name string
+     * @param numEnbs the number of eNB nodes
+     * @param numUes the number of UE nodes
+     * @param isIdealRrc True if the Ideal RRC protocol is used
+     * @returns the name string
      */
     std::string BuildNameString(uint32_t numEnbs, uint32_t numUes, bool isIdealRrc);
     /**
-     * \brief Setup the simulation according to the configuration set by the
+     * @brief Setup the simulation according to the configuration set by the
      *        class constructor, run it, and verify the result.
      */
     void DoRun() override;
 
     /**
      * Check connected function
-     * \param ueDevice the UE device
-     * \param enbDevices the ENB devices
+     * @param ueDevice the UE device
+     * @param enbDevices the ENB devices
      */
     void CheckConnected(Ptr<NetDevice> ueDevice, NetDeviceContainer enbDevices);
 
     /**
      * Check if the UE is in idle state
-     * \param ueDevice the UE device
-     * \param enbDevices the ENB devices
+     * @param ueDevice the UE device
+     * @param enbDevices the ENB devices
      */
     void CheckIdle(Ptr<NetDevice> ueDevice, NetDeviceContainer enbDevices);
 
     /**
-     * \brief Check if the UE exist at the eNB
-     * \param rnti the RNTI of the UE
-     * \param enbDevice the eNB device
-     * \return true if the UE exist at the eNB, otherwise false
+     * @brief Check if the UE exist at the eNB
+     * @param rnti the RNTI of the UE
+     * @param enbDevice the eNB device
+     * @return true if the UE exist at the eNB, otherwise false
      */
     bool CheckUeExistAtEnb(uint16_t rnti, Ptr<NetDevice> enbDevice);
 
     /**
-     * \brief State transition callback function
-     * \param context the context string
-     * \param imsi the IMSI
-     * \param cellId the cell ID
-     * \param rnti the RNTI
-     * \param oldState the old state
-     * \param newState the new state
+     * @brief State transition callback function
+     * @param context the context string
+     * @param imsi the IMSI
+     * @param cellId the cell ID
+     * @param rnti the RNTI
+     * @param oldState the old state
+     * @param newState the new state
      */
     void UeStateTransitionCallback(std::string context,
                                    uint64_t imsi,
@@ -125,11 +125,11 @@
                                    LteUeRrc::State newState);
 
     /**
-     * \brief Connection established at UE callback function
-     * \param context the context string
-     * \param imsi the IMSI
-     * \param cellId the cell ID
-     * \param rnti the RNTI
+     * @brief Connection established at UE callback function
+     * @param context the context string
+     * @param imsi the IMSI
+     * @param cellId the cell ID
+     * @param rnti the RNTI
      */
     void ConnectionEstablishedUeCallback(std::string context,
                                          uint64_t imsi,
@@ -137,11 +137,11 @@
                                          uint16_t rnti);
 
     /**
-     * \brief Connection established at eNodeB callback function
-     * \param context the context string
-     * \param imsi the IMSI
-     * \param cellId the cell ID
-     * \param rnti the RNTI
+     * @brief Connection established at eNodeB callback function
+     * @param context the context string
+     * @param imsi the IMSI
+     * @param cellId the cell ID
+     * @param rnti the RNTI
      */
     void ConnectionEstablishedEnbCallback(std::string context,
                                           uint64_t imsi,
@@ -149,11 +149,11 @@
                                           uint16_t rnti);
 
     /**
-     * \brief This callback function is executed when UE context is removed at eNodeB
-     * \param context the context string
-     * \param imsi the IMSI
-     * \param cellId the cell ID
-     * \param rnti the RNTI
+     * @brief This callback function is executed when UE context is removed at eNodeB
+     * @param context the context string
+     * @param imsi the IMSI
+     * @param cellId the cell ID
+     * @param rnti the RNTI
      */
     void ConnectionReleaseAtEnbCallback(std::string context,
                                         uint64_t imsi,
@@ -161,14 +161,14 @@
                                         uint16_t rnti);
 
     /**
-     * \brief This callback function is executed when UE RRC receives an in-sync or out-of-sync
+     * @brief This callback function is executed when UE RRC receives an in-sync or out-of-sync
      * indication
-     * \param context the context string
-     * \param imsi the IMSI
-     * \param rnti the RNTI
-     * \param cellId the cell ID
-     * \param type in-sync or out-of-sync indication
-     * \param count the number of in-sync or out-of-sync indications
+     * @param context the context string
+     * @param imsi the IMSI
+     * @param rnti the RNTI
+     * @param cellId the cell ID
+     * @param type in-sync or out-of-sync indication
+     * @param count the number of in-sync or out-of-sync indications
      */
     void PhySyncDetectionCallback(std::string context,
                                   uint64_t imsi,
@@ -178,11 +178,11 @@
                                   uint8_t count);
 
     /**
-     * \brief This callback function is executed when radio link failure is detected
-     * \param context the context string
-     * \param imsi the IMSI
-     * \param rnti the RNTI
-     * \param cellId the cell ID
+     * @brief This callback function is executed when radio link failure is detected
+     * @param context the context string
+     * @param imsi the IMSI
+     * @param rnti the RNTI
+     * @param cellId the cell ID
      */
     void RadioLinkFailureCallback(std::string context,
                                   uint64_t imsi,
@@ -190,9 +190,9 @@
                                   uint16_t rnti);
 
     /**
-     * \brief Jump away function
+     * @brief Jump away function
      *
-     * \param UeJumpAwayPositionList A list of positions where UE would jump
+     * @param UeJumpAwayPositionList A list of positions where UE would jump
      */
     void JumpAway(Vector UeJumpAwayPositionList);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-rlc-am-e2e.cc ns-3.44/src/lte/test/lte-test-rlc-am-e2e.cc
--- ns-3.43/src/lte/test/lte-test-rlc-am-e2e.cc	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-rlc-am-e2e.cc	2025-03-09 16:55:49.611372000 -0700
@@ -87,7 +87,7 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LteRlcAmE2eTestSuite lteRlcAmE2eTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-rlc-am-e2e.h ns-3.44/src/lte/test/lte-test-rlc-am-e2e.h
--- ns-3.43/src/lte/test/lte-test-rlc-am-e2e.h	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-rlc-am-e2e.h	2025-03-09 16:55:49.611372000 -0700
@@ -21,9 +21,9 @@
 using namespace ns3;
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test suite for RlcAmE2e test case.
+ * @brief Test suite for RlcAmE2e test case.
  */
 class LteRlcAmE2eTestSuite : public TestSuite
 {
@@ -32,7 +32,7 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
  * Test cases used for the test suite lte-rlc-am-e2e. See the testing section of
  * the LTE module documentation for details.
@@ -43,10 +43,10 @@
     /**
      * Constructor
      *
-     * \param name the reference name
-     * \param seed the random variable seed
-     * \param losses the error rate
-     * \param bulkSduArrival true if bulk SDU arrival
+     * @param name the reference name
+     * @param seed the random variable seed
+     * @param losses the error rate
+     * @param bulkSduArrival true if bulk SDU arrival
      */
     LteRlcAmE2eTestCase(std::string name, uint32_t seed, double losses, bool bulkSduArrival);
     LteRlcAmE2eTestCase();
@@ -57,12 +57,12 @@
 
     /**
      * DL drop event
-     * \param p the packet
+     * @param p the packet
      */
     void DlDropEvent(Ptr<const Packet> p);
     /**
      * UL drop event
-     * \param p the packet
+     * @param p the packet
      */
     void UlDropEvent(Ptr<const Packet> p);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-rlc-am-transmitter.cc ns-3.44/src/lte/test/lte-test-rlc-am-transmitter.cc
--- ns-3.43/src/lte/test/lte-test-rlc-am-transmitter.cc	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-rlc-am-transmitter.cc	2025-03-09 16:55:49.611372000 -0700
@@ -40,7 +40,7 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LteRlcAmTransmitterTestSuite lteRlcAmTransmitterTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-rlc-am-transmitter.h ns-3.44/src/lte/test/lte-test-rlc-am-transmitter.h
--- ns-3.43/src/lte/test/lte-test-rlc-am-transmitter.h	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-rlc-am-transmitter.h	2025-03-09 16:55:49.611372000 -0700
@@ -26,9 +26,9 @@
 using namespace ns3;
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief TestSuite 4.1.1 RLC AM: Only transmitter functionality.
+ * @brief TestSuite 4.1.1 RLC AM: Only transmitter functionality.
  */
 class LteRlcAmTransmitterTestSuite : public TestSuite
 {
@@ -37,9 +37,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test case used by LteRlcAmTransmitterOneSduTestCase to create topology
+ * @brief Test case used by LteRlcAmTransmitterOneSduTestCase to create topology
  * and to implement functionalities and check if data received corresponds to
  * data sent.
  */
@@ -49,7 +49,7 @@
     /**
      * Constructor
      *
-     * \param name the reference name
+     * @param name the reference name
      */
     LteRlcAmTransmitterTestCase(std::string name);
     LteRlcAmTransmitterTestCase();
@@ -57,9 +57,9 @@
 
     /**
      * Check data received function
-     * \param time the time to check
-     * \param shouldReceived should have received indicator
-     * \param assertMsg the assert message
+     * @param time the time to check
+     * @param shouldReceived should have received indicator
+     * @param assertMsg the assert message
      */
     void CheckDataReceived(Time time, std::string shouldReceived, std::string assertMsg);
 
@@ -73,16 +73,16 @@
   private:
     /**
      * Check data received function
-     * \param shouldReceived should have received indicator
-     * \param assertMsg the assert message
+     * @param shouldReceived should have received indicator
+     * @param assertMsg the assert message
      */
     void DoCheckDataReceived(std::string shouldReceived, std::string assertMsg);
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test 4.1.1.1 Test that SDU transmitted at PDCP corresponds to PDU
+ * @brief Test 4.1.1.1 Test that SDU transmitted at PDCP corresponds to PDU
  * received by MAC.
  */
 class LteRlcAmTransmitterOneSduTestCase : public LteRlcAmTransmitterTestCase
@@ -91,7 +91,7 @@
     /**
      * Constructor
      *
-     * \param name the reference name
+     * @param name the reference name
      */
     LteRlcAmTransmitterOneSduTestCase(std::string name);
     LteRlcAmTransmitterOneSduTestCase();
@@ -102,9 +102,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test 4.1.1.2 Test the correct functionality of the Segmentation.
+ * @brief Test 4.1.1.2 Test the correct functionality of the Segmentation.
  * Test check that single SDU is properly segmented to n PDUs.
  */
 class LteRlcAmTransmitterSegmentationTestCase : public LteRlcAmTransmitterTestCase
@@ -113,7 +113,7 @@
     /**
      * Constructor
      *
-     * \param name the reference name
+     * @param name the reference name
      */
     LteRlcAmTransmitterSegmentationTestCase(std::string name);
     LteRlcAmTransmitterSegmentationTestCase();
@@ -124,9 +124,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test 4.1.1.3 Test that concatenation functionality works properly.
+ * @brief Test 4.1.1.3 Test that concatenation functionality works properly.
  * Test check if n SDUs are correctly contactenate to single PDU.
  */
 class LteRlcAmTransmitterConcatenationTestCase : public LteRlcAmTransmitterTestCase
@@ -135,7 +135,7 @@
     /**
      * Constructor
      *
-     * \param name the reference name
+     * @param name the reference name
      */
     LteRlcAmTransmitterConcatenationTestCase(std::string name);
     LteRlcAmTransmitterConcatenationTestCase();
@@ -146,9 +146,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test 4.1.1.4 Test checks functionality of Report Buffer Status by
+ * @brief Test 4.1.1.4 Test checks functionality of Report Buffer Status by
  * testing primitive parameters.
  */
 class LteRlcAmTransmitterReportBufferStatusTestCase : public LteRlcAmTransmitterTestCase
@@ -157,7 +157,7 @@
     /**
      * Constructor
      *
-     * \param name the reference name
+     * @param name the reference name
      */
     LteRlcAmTransmitterReportBufferStatusTestCase(std::string name);
     LteRlcAmTransmitterReportBufferStatusTestCase();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-rlc-um-e2e.cc ns-3.44/src/lte/test/lte-test-rlc-um-e2e.cc
--- ns-3.43/src/lte/test/lte-test-rlc-um-e2e.cc	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-rlc-um-e2e.cc	2025-03-09 16:55:49.611372000 -0700
@@ -65,7 +65,7 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LteRlcUmE2eTestSuite lteRlcUmE2eTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-rlc-um-e2e.h ns-3.44/src/lte/test/lte-test-rlc-um-e2e.h
--- ns-3.43/src/lte/test/lte-test-rlc-um-e2e.h	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-rlc-um-e2e.h	2025-03-09 16:55:49.611372000 -0700
@@ -20,9 +20,9 @@
 using namespace ns3;
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test suite for RlcUmE2eTestCase
+ * @brief Test suite for RlcUmE2eTestCase
  */
 class LteRlcUmE2eTestSuite : public TestSuite
 {
@@ -31,9 +31,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test end-to-end flow when RLC UM is being used.
+ * @brief Test end-to-end flow when RLC UM is being used.
  */
 class LteRlcUmE2eTestCase : public TestCase
 {
@@ -41,9 +41,9 @@
     /**
      * Constructor
      *
-     * \param name the reference name
-     * \param seed the random variable seed
-     * \param losses the error rate
+     * @param name the reference name
+     * @param seed the random variable seed
+     * @param losses the error rate
      */
     LteRlcUmE2eTestCase(std::string name, uint32_t seed, double losses);
     LteRlcUmE2eTestCase();
@@ -54,12 +54,12 @@
 
     /**
      * DL drop event
-     * \param p the packet
+     * @param p the packet
      */
     void DlDropEvent(Ptr<const Packet> p);
     /**
      * UL drop event
-     * \param p the packet
+     * @param p the packet
      */
     void UlDropEvent(Ptr<const Packet> p);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-rlc-um-transmitter.cc ns-3.44/src/lte/test/lte-test-rlc-um-transmitter.cc
--- ns-3.43/src/lte/test/lte-test-rlc-um-transmitter.cc	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-rlc-um-transmitter.cc	2025-03-09 16:55:49.611372000 -0700
@@ -42,7 +42,7 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LteRlcUmTransmitterTestSuite lteRlcUmTransmitterTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-rlc-um-transmitter.h ns-3.44/src/lte/test/lte-test-rlc-um-transmitter.h
--- ns-3.43/src/lte/test/lte-test-rlc-um-transmitter.h	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-rlc-um-transmitter.h	2025-03-09 16:55:49.611372000 -0700
@@ -26,9 +26,9 @@
 using namespace ns3;
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief TestSuite 4.1.1 for RLC UM: Only transmitter part.
+ * @brief TestSuite 4.1.1 for RLC UM: Only transmitter part.
  */
 class LteRlcUmTransmitterTestSuite : public TestSuite
 {
@@ -37,9 +37,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test case used by LteRlcUmTransmitterOneSduTestCase to create topology
+ * @brief Test case used by LteRlcUmTransmitterOneSduTestCase to create topology
  * and to implement functionalities and check if data received corresponds to
  * data sent.
  */
@@ -49,7 +49,7 @@
     /**
      * Constructor
      *
-     * \param name the test name
+     * @param name the test name
      */
     LteRlcUmTransmitterTestCase(std::string name);
     LteRlcUmTransmitterTestCase();
@@ -57,9 +57,9 @@
 
     /**
      * Check data received function
-     * \param time the time to check
-     * \param shouldReceived should have received indicator
-     * \param assertMsg the assert message
+     * @param time the time to check
+     * @param shouldReceived should have received indicator
+     * @param assertMsg the assert message
      */
     void CheckDataReceived(Time time, std::string shouldReceived, std::string assertMsg);
 
@@ -73,16 +73,16 @@
   private:
     /**
      * Check data received function
-     * \param shouldReceived should have received indicator
-     * \param assertMsg the assert message
+     * @param shouldReceived should have received indicator
+     * @param assertMsg the assert message
      */
     void DoCheckDataReceived(std::string shouldReceived, std::string assertMsg);
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test 4.1.1.1 One SDU, One PDU
+ * @brief Test 4.1.1.1 One SDU, One PDU
  */
 class LteRlcUmTransmitterOneSduTestCase : public LteRlcUmTransmitterTestCase
 {
@@ -90,7 +90,7 @@
     /**
      * Constructor
      *
-     * \param name the test name
+     * @param name the test name
      */
     LteRlcUmTransmitterOneSduTestCase(std::string name);
     LteRlcUmTransmitterOneSduTestCase();
@@ -101,9 +101,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test 4.1.1.2 Segmentation (One SDU => n PDUs)
+ * @brief Test 4.1.1.2 Segmentation (One SDU => n PDUs)
  */
 class LteRlcUmTransmitterSegmentationTestCase : public LteRlcUmTransmitterTestCase
 {
@@ -111,7 +111,7 @@
     /**
      * Constructor
      *
-     * \param name the reference name
+     * @param name the reference name
      */
     LteRlcUmTransmitterSegmentationTestCase(std::string name);
     LteRlcUmTransmitterSegmentationTestCase();
@@ -122,9 +122,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test 4.1.1.3 Concatenation (n SDUs => One PDU)
+ * @brief Test 4.1.1.3 Concatenation (n SDUs => One PDU)
  */
 class LteRlcUmTransmitterConcatenationTestCase : public LteRlcUmTransmitterTestCase
 {
@@ -132,7 +132,7 @@
     /**
      * Constructor
      *
-     * \param name the reference name
+     * @param name the reference name
      */
     LteRlcUmTransmitterConcatenationTestCase(std::string name);
     LteRlcUmTransmitterConcatenationTestCase();
@@ -143,9 +143,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test 4.1.1.4 Report Buffer Status (test primitive parameters)
+ * @brief Test 4.1.1.4 Report Buffer Status (test primitive parameters)
  */
 class LteRlcUmTransmitterReportBufferStatusTestCase : public LteRlcUmTransmitterTestCase
 {
@@ -153,7 +153,7 @@
     /**
      * Constructor
      *
-     * \param name the reference name
+     * @param name the reference name
      */
     LteRlcUmTransmitterReportBufferStatusTestCase(std::string name);
     LteRlcUmTransmitterReportBufferStatusTestCase();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-rr-ff-mac-scheduler.cc ns-3.44/src/lte/test/lte-test-rr-ff-mac-scheduler.cc
--- ns-3.43/src/lte/test/lte-test-rr-ff-mac-scheduler.cc	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-rr-ff-mac-scheduler.cc	2025-03-09 16:55:49.611372000 -0700
@@ -9,31 +9,31 @@
 
 #include "lte-test-rr-ff-mac-scheduler.h"
 
+#include "ns3/boolean.h"
+#include "ns3/constant-position-mobility-model.h"
 #include "ns3/double.h"
+#include "ns3/enum.h"
+#include "ns3/eps-bearer.h"
+#include "ns3/ff-mac-scheduler.h"
+#include "ns3/log.h"
+#include "ns3/lte-enb-net-device.h"
+#include "ns3/lte-enb-phy.h"
+#include "ns3/lte-helper.h"
+#include "ns3/lte-ue-net-device.h"
+#include "ns3/lte-ue-phy.h"
+#include "ns3/lte-ue-rrc.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/net-device-container.h"
+#include "ns3/node-container.h"
+#include "ns3/object.h"
+#include "ns3/packet.h"
+#include "ns3/ptr.h"
 #include "ns3/radio-bearer-stats-calculator.h"
+#include "ns3/simulator.h"
+#include "ns3/spectrum-error-model.h"
+#include "ns3/spectrum-interference.h"
 #include "ns3/string.h"
-#include <ns3/boolean.h>
-#include <ns3/constant-position-mobility-model.h>
-#include <ns3/enum.h>
-#include <ns3/eps-bearer.h>
-#include <ns3/ff-mac-scheduler.h>
-#include <ns3/log.h>
-#include <ns3/lte-enb-net-device.h>
-#include <ns3/lte-enb-phy.h>
-#include <ns3/lte-helper.h>
-#include <ns3/lte-ue-net-device.h>
-#include <ns3/lte-ue-phy.h>
-#include <ns3/lte-ue-rrc.h>
-#include <ns3/mobility-helper.h>
-#include <ns3/net-device-container.h>
-#include <ns3/node-container.h>
-#include <ns3/object.h>
-#include <ns3/packet.h>
-#include <ns3/ptr.h>
-#include <ns3/simulator.h>
-#include <ns3/spectrum-error-model.h>
-#include <ns3/spectrum-interference.h>
-#include <ns3/test.h>
+#include "ns3/test.h"
 
 #include <iostream>
 
@@ -166,7 +166,7 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LenaTestRrFfMacSchedulerSuite lenaTestRrFfMacSchedulerSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-rr-ff-mac-scheduler.h ns-3.44/src/lte/test/lte-test-rr-ff-mac-scheduler.h
--- ns-3.43/src/lte/test/lte-test-rr-ff-mac-scheduler.h	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-rr-ff-mac-scheduler.h	2025-03-09 16:55:49.611372000 -0700
@@ -15,9 +15,9 @@
 using namespace ns3;
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief This system test program creates different test cases with a single eNB and
+ * @brief This system test program creates different test cases with a single eNB and
  * This system test program creates different test cases with a single eNB and
  * several UEs, all having the same Radio Bearer specification. In each test
  * case, the UEs see the same SINR from the eNB; different test cases are
@@ -32,11 +32,11 @@
     /**
      * Constructor
      *
-     * \param nUser the number of UE nodes
-     * \param dist the distance between nodes
-     * \param thrRefDl the DL throughput reference
-     * \param thrRefUl the UL throughput reference
-     * \param errorModelEnabled if true the error model is enabled
+     * @param nUser the number of UE nodes
+     * @param dist the distance between nodes
+     * @param thrRefDl the DL throughput reference
+     * @param thrRefUl the UL throughput reference
+     * @param errorModelEnabled if true the error model is enabled
      */
     LenaRrFfMacSchedulerTestCase(uint16_t nUser,
                                  double dist,
@@ -49,9 +49,9 @@
     void DoRun() override;
     /**
      * Builds the test name string based on provided parameter values
-     * \param nUser the number of UE nodes
-     * \param dist the distance between UE nodes and eNodeB
-     * \returns the name string
+     * @param nUser the number of UE nodes
+     * @param dist the distance between UE nodes and eNodeB
+     * @returns the name string
      */
     static std::string BuildNameString(uint16_t nUser, double dist);
     uint16_t m_nUser;         ///< number of UE nodes
@@ -62,9 +62,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test suite for RrFfMacScheduler test
+ * @brief Test suite for RrFfMacScheduler test
  */
 class LenaTestRrFfMacSchedulerSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-secondary-cell-handover.cc ns-3.44/src/lte/test/lte-test-secondary-cell-handover.cc
--- ns-3.43/src/lte/test/lte-test-secondary-cell-handover.cc	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-secondary-cell-handover.cc	2025-03-09 16:55:49.611372000 -0700
@@ -7,55 +7,55 @@
  *
  */
 
-#include <ns3/boolean.h>
-#include <ns3/double.h>
-#include <ns3/friis-spectrum-propagation-loss.h>
-#include <ns3/integer.h>
-#include <ns3/internet-stack-helper.h>
-#include <ns3/log.h>
-#include <ns3/lte-enb-net-device.h>
-#include <ns3/lte-helper.h>
-#include <ns3/lte-ue-net-device.h>
-#include <ns3/lte-ue-rrc.h>
-#include <ns3/mobility-helper.h>
-#include <ns3/point-to-point-epc-helper.h>
-#include <ns3/simulator.h>
-#include <ns3/test.h>
+#include "ns3/boolean.h"
+#include "ns3/double.h"
+#include "ns3/friis-spectrum-propagation-loss.h"
+#include "ns3/integer.h"
+#include "ns3/internet-stack-helper.h"
+#include "ns3/log.h"
+#include "ns3/lte-enb-net-device.h"
+#include "ns3/lte-helper.h"
+#include "ns3/lte-ue-net-device.h"
+#include "ns3/lte-ue-rrc.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/point-to-point-epc-helper.h"
+#include "ns3/simulator.h"
+#include "ns3/test.h"
 
 using namespace ns3;
 
 NS_LOG_COMPONENT_DEFINE("LteSecondaryCellHandoverTest");
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test measurement-based handover to secondary cell.
+ * @brief Test measurement-based handover to secondary cell.
  */
 
 class LteSecondaryCellHandoverTestCase : public TestCase
 {
   public:
     /**
-     * \brief Creates an instance of the measurement-based secondary cell handover test case.
-     * \param name name of the test case
-     * \param useIdealRrc if true, simulation uses Ideal RRC protocol, otherwise
+     * @brief Creates an instance of the measurement-based secondary cell handover test case.
+     * @param name name of the test case
+     * @param useIdealRrc if true, simulation uses Ideal RRC protocol, otherwise
      *                    simulation uses Real RRC protocol
      */
 
     LteSecondaryCellHandoverTestCase(std::string name, bool useIdealRrc);
 
     /**
-     * \brief Shutdown cellId by reducing its power to 1 dBm.
-     * \param cellId ID of the cell to shutdown
+     * @brief Shutdown cellId by reducing its power to 1 dBm.
+     * @param cellId ID of the cell to shutdown
      */
     void ShutdownCell(uint32_t cellId);
 
     /**
-     * \brief Callback method indicating start of UE handover
-     * \param imsi The IMSI
-     * \param sourceCellId The source cell ID
-     * \param rnti The RNTI
-     * \param targetCellId The target cell ID
+     * @brief Callback method indicating start of UE handover
+     * @param imsi The IMSI
+     * @param sourceCellId The source cell ID
+     * @param rnti The RNTI
+     * @param targetCellId The target cell ID
      */
     void UeHandoverStartCallback(uint64_t imsi,
                                  uint16_t sourceCellId,
@@ -64,12 +64,12 @@
 
   private:
     /**
-     * \brief Run a simulation.
+     * @brief Run a simulation.
      */
     void DoRun() override;
 
     /**
-     * \brief Verify that handover has occurred during the simulation.
+     * @brief Verify that handover has occurred during the simulation.
      */
     void DoTeardown() override;
 
@@ -183,9 +183,9 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief LTE measurement-based handover to secondary cell test suite.
+ * @brief LTE measurement-based handover to secondary cell test suite.
  */
 class LteSecondaryCellHandoverTestSuite : public TestSuite
 {
@@ -201,7 +201,7 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LteSecondaryCellHandoverTestSuite g_lteSecondaryCellHandoverTestSuiteInstance;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-secondary-cell-selection.cc ns-3.44/src/lte/test/lte-test-secondary-cell-selection.cc
--- ns-3.43/src/lte/test/lte-test-secondary-cell-selection.cc	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-secondary-cell-selection.cc	2025-03-09 16:55:49.611372000 -0700
@@ -9,25 +9,25 @@
 
 #include "lte-test-secondary-cell-selection.h"
 
-#include <ns3/boolean.h>
-#include <ns3/double.h>
-#include <ns3/friis-spectrum-propagation-loss.h>
-#include <ns3/integer.h>
-#include <ns3/internet-stack-helper.h>
-#include <ns3/ipv4-address-helper.h>
-#include <ns3/ipv4-interface-container.h>
-#include <ns3/ipv4-static-routing-helper.h>
-#include <ns3/log.h>
-#include <ns3/lte-enb-net-device.h>
-#include <ns3/lte-helper.h>
-#include <ns3/lte-ue-net-device.h>
-#include <ns3/lte-ue-rrc.h>
-#include <ns3/mobility-helper.h>
-#include <ns3/net-device-container.h>
-#include <ns3/node-container.h>
-#include <ns3/point-to-point-epc-helper.h>
-#include <ns3/point-to-point-helper.h>
-#include <ns3/simulator.h>
+#include "ns3/boolean.h"
+#include "ns3/double.h"
+#include "ns3/friis-spectrum-propagation-loss.h"
+#include "ns3/integer.h"
+#include "ns3/internet-stack-helper.h"
+#include "ns3/ipv4-address-helper.h"
+#include "ns3/ipv4-interface-container.h"
+#include "ns3/ipv4-static-routing-helper.h"
+#include "ns3/log.h"
+#include "ns3/lte-enb-net-device.h"
+#include "ns3/lte-helper.h"
+#include "ns3/lte-ue-net-device.h"
+#include "ns3/lte-ue-rrc.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/net-device-container.h"
+#include "ns3/node-container.h"
+#include "ns3/point-to-point-epc-helper.h"
+#include "ns3/point-to-point-helper.h"
+#include "ns3/simulator.h"
 
 using namespace ns3;
 
@@ -57,7 +57,7 @@
 } // end of LteSecondaryCellSelectionTestSuite::LteSecondaryCellSelectionTestSuite ()
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LteSecondaryCellSelectionTestSuite g_lteSecondaryCellSelectionTestSuite;
@@ -142,7 +142,7 @@
         MakeCallback(&LteSecondaryCellSelectionTestCase::ConnectionEstablishedCallback, this));
 
     // Run simulation.
-    Simulator::Stop(Seconds(2.0));
+    Simulator::Stop(Seconds(2));
     Simulator::Run();
 
     for (auto& it : enbDev->GetCcMap())
@@ -173,8 +173,7 @@
                                                            LteUeRrc::State oldState,
                                                            LteUeRrc::State newState)
 {
-    NS_LOG_FUNCTION(this << imsi << cellId << rnti << LteUeRrc::ToString(oldState)
-                         << LteUeRrc::ToString(newState));
+    NS_LOG_FUNCTION(this << imsi << cellId << rnti << oldState << newState);
     m_lastState[imsi] = newState;
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-secondary-cell-selection.h ns-3.44/src/lte/test/lte-test-secondary-cell-selection.h
--- ns-3.43/src/lte/test/lte-test-secondary-cell-selection.h	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-secondary-cell-selection.h	2025-03-09 16:55:49.611372000 -0700
@@ -10,20 +10,20 @@
 #ifndef LTE_TEST_SECONDARY_CELL_SELECTION_H
 #define LTE_TEST_SECONDARY_CELL_SELECTION_H
 
-#include <ns3/lte-ue-rrc.h>
-#include <ns3/node-container.h>
-#include <ns3/nstime.h>
-#include <ns3/test.h>
-#include <ns3/vector.h>
+#include "ns3/lte-ue-rrc.h"
+#include "ns3/node-container.h"
+#include "ns3/nstime.h"
+#include "ns3/test.h"
+#include "ns3/vector.h"
 
 #include <vector>
 
 using namespace ns3;
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test suite for executing the secondary cell selection test cases.
+ * @brief Test suite for executing the secondary cell selection test cases.
  *
  * Checks that if multiple component carriers are defined for an eNB, that
  * UEs can connect to each of these component carriers, not just the primary
@@ -37,21 +37,21 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Testing the initial cell selection procedure by UE at IDLE state in
+ * @brief Testing the initial cell selection procedure by UE at IDLE state in
  *        the beginning of simulation with multiple component carriers.
  */
 class LteSecondaryCellSelectionTestCase : public TestCase
 {
   public:
     /**
-     * \brief Creates an instance of the initial cell selection test case.
-     * \param name name of this test
-     * \param isIdealRrc if true, simulation uses Ideal RRC protocol, otherwise
+     * @brief Creates an instance of the initial cell selection test case.
+     * @param name name of this test
+     * @param isIdealRrc if true, simulation uses Ideal RRC protocol, otherwise
      *                   simulation uses Real RRC protocol
-     * \param rngRun the number of run to be used by the random number generator
-     * \param numberOfComponentCarriers number of component carriers
+     * @param rngRun the number of run to be used by the random number generator
+     * @param numberOfComponentCarriers number of component carriers
      */
     LteSecondaryCellSelectionTestCase(std::string name,
                                       bool isIdealRrc,
@@ -62,19 +62,19 @@
 
   private:
     /**
-     * \brief Setup the simulation according to the configuration set by the
+     * @brief Setup the simulation according to the configuration set by the
      *        class constructor, run it, and verify the result.
      */
     void DoRun() override;
 
     /**
-     * \brief State transition callback function
-     * \param context the context string
-     * \param imsi the IMSI
-     * \param cellId the cell ID
-     * \param rnti the RNTI
-     * \param oldState the old state
-     * \param newState the new state
+     * @brief State transition callback function
+     * @param context the context string
+     * @param imsi the IMSI
+     * @param cellId the cell ID
+     * @param rnti the RNTI
+     * @param oldState the old state
+     * @param newState the new state
      */
     void StateTransitionCallback(std::string context,
                                  uint64_t imsi,
@@ -83,20 +83,20 @@
                                  LteUeRrc::State oldState,
                                  LteUeRrc::State newState);
     /**
-     * \brief Initial cell selection end ok callback function
-     * \param context the context string
-     * \param imsi the IMSI
-     * \param cellId the cell ID
+     * @brief Initial cell selection end ok callback function
+     * @param context the context string
+     * @param imsi the IMSI
+     * @param cellId the cell ID
      */
     void InitialSecondaryCellSelectionEndOkCallback(std::string context,
                                                     uint64_t imsi,
                                                     uint16_t cellId);
     /**
-     * \brief Connection established callback function
-     * \param context the context string
-     * \param imsi the IMSI
-     * \param cellId the cell ID
-     * \param rnti the RNTI
+     * @brief Connection established callback function
+     * @param context the context string
+     * @param imsi the IMSI
+     * @param cellId the cell ID
+     * @param rnti the RNTI
      */
     void ConnectionEstablishedCallback(std::string context,
                                        uint64_t imsi,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-spectrum-value-helper.cc ns-3.44/src/lte/test/lte-test-spectrum-value-helper.cc
--- ns-3.43/src/lte/test/lte-test-spectrum-value-helper.cc	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-spectrum-value-helper.cc	2025-03-09 16:55:49.611372000 -0700
@@ -16,9 +16,9 @@
 NS_LOG_COMPONENT_DEFINE("LteTestSpectrumValueHelper");
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test checks if lte spectrum model is generated properly. Different
+ * @brief Test checks if lte spectrum model is generated properly. Different
  * test cases are configured by defining different frequency and banwidth.
  */
 class LteSpectrumModelTestCase : public TestCase
@@ -27,10 +27,10 @@
     /**
      * Constructor
      *
-     * \param str the test reference name
-     * \param earfcn the central carrier frequency
-     * \param bw bandwidth the bandwidth
-     * \param fcs the expected spectrum model
+     * @param str the test reference name
+     * @param earfcn the central carrier frequency
+     * @param bw bandwidth the bandwidth
+     * @param fcs the expected spectrum model
      */
     LteSpectrumModelTestCase(const char* str, uint16_t earfcn, uint8_t bw, std::vector<double> fcs);
     ~LteSpectrumModelTestCase() override;
@@ -69,9 +69,9 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test that the function for creation of LTE noise power spectral
+ * @brief Test that the function for creation of LTE noise power spectral
  * density is working properly.
  */
 class LteNoisePsdTestCase : public TestCase
@@ -80,11 +80,11 @@
     /**
      * Constructor
      *
-     * \param str the test reference name
-     * \param earfcn
-     * \param bw bandwidth
-     * \param noiseFigureDb noise figure in dB
-     * \param expected executed spectrum value
+     * @param str the test reference name
+     * @param earfcn
+     * @param bw bandwidth
+     * @param noiseFigureDb noise figure in dB
+     * @param expected executed spectrum value
      */
     LteNoisePsdTestCase(const char* str,
                         uint16_t earfcn,
@@ -130,9 +130,9 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test that the funtcion for the creation of the Lte transmission power
+ * @brief Test that the funtcion for the creation of the Lte transmission power
  * spectral density is working as expected.
  */
 class LteTxPsdTestCase : public TestCase
@@ -141,12 +141,12 @@
     /**
      * Constructor
      *
-     * \param str the reference name
-     * \param earfcn
-     * \param bw bandwidth
-     * \param txPowerDbm transmit power in dBm
-     * \param activeRbs active RBs
-     * \param expected executed spectrum value
+     * @param str the reference name
+     * @param earfcn
+     * @param bw bandwidth
+     * @param txPowerDbm transmit power in dBm
+     * @param activeRbs active RBs
+     * @param expected executed spectrum value
      */
     LteTxPsdTestCase(const char* str,
                      uint16_t earfcn,
@@ -195,9 +195,9 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test suite for LteSpectrumValueHelper. Test suite is
+ * @brief Test suite for LteSpectrumValueHelper. Test suite is
  * checking different functionalities of LteSpectrumValueHelper.
  */
 class LteSpectrumValueHelperTestSuite : public TestSuite
@@ -207,7 +207,7 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LteSpectrumValueHelperTestSuite g_lteSpectrumValueHelperTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-tdbet-ff-mac-scheduler.cc ns-3.44/src/lte/test/lte-test-tdbet-ff-mac-scheduler.cc
--- ns-3.43/src/lte/test/lte-test-tdbet-ff-mac-scheduler.cc	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-tdbet-ff-mac-scheduler.cc	2025-03-09 16:55:49.611372000 -0700
@@ -10,31 +10,31 @@
 
 #include "lte-test-tdbet-ff-mac-scheduler.h"
 
+#include "ns3/boolean.h"
+#include "ns3/constant-position-mobility-model.h"
 #include "ns3/double.h"
+#include "ns3/enum.h"
+#include "ns3/eps-bearer.h"
+#include "ns3/ff-mac-scheduler.h"
+#include "ns3/log.h"
+#include "ns3/lte-enb-net-device.h"
+#include "ns3/lte-enb-phy.h"
+#include "ns3/lte-helper.h"
+#include "ns3/lte-ue-net-device.h"
+#include "ns3/lte-ue-phy.h"
+#include "ns3/lte-ue-rrc.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/net-device-container.h"
+#include "ns3/node-container.h"
+#include "ns3/object.h"
+#include "ns3/packet.h"
+#include "ns3/ptr.h"
 #include "ns3/radio-bearer-stats-calculator.h"
+#include "ns3/simulator.h"
+#include "ns3/spectrum-error-model.h"
+#include "ns3/spectrum-interference.h"
 #include "ns3/string.h"
-#include <ns3/boolean.h>
-#include <ns3/constant-position-mobility-model.h>
-#include <ns3/enum.h>
-#include <ns3/eps-bearer.h>
-#include <ns3/ff-mac-scheduler.h>
-#include <ns3/log.h>
-#include <ns3/lte-enb-net-device.h>
-#include <ns3/lte-enb-phy.h>
-#include <ns3/lte-helper.h>
-#include <ns3/lte-ue-net-device.h>
-#include <ns3/lte-ue-phy.h>
-#include <ns3/lte-ue-rrc.h>
-#include <ns3/mobility-helper.h>
-#include <ns3/net-device-container.h>
-#include <ns3/node-container.h>
-#include <ns3/object.h>
-#include <ns3/packet.h>
-#include <ns3/ptr.h>
-#include <ns3/simulator.h>
-#include <ns3/spectrum-error-model.h>
-#include <ns3/spectrum-interference.h>
-#include <ns3/test.h>
+#include "ns3/test.h"
 
 #include <iostream>
 #include <sstream>
@@ -185,7 +185,7 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LenaTestTdBetFfMacSchedulerSuite lenaTestTdBetFfMacSchedulerSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-tdbet-ff-mac-scheduler.h ns-3.44/src/lte/test/lte-test-tdbet-ff-mac-scheduler.h
--- ns-3.43/src/lte/test/lte-test-tdbet-ff-mac-scheduler.h	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-tdbet-ff-mac-scheduler.h	2025-03-09 16:55:49.611372000 -0700
@@ -17,9 +17,9 @@
 using namespace ns3;
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief This system test program creates different test cases with a single eNB and
+ * @brief This system test program creates different test cases with a single eNB and
  * several UEs, all having the same Radio Bearer specification. In each test
  * case, the UEs see the same SINR from the eNB; different test cases are
  * implemented obtained by using different SINR values and different numbers of
@@ -33,11 +33,11 @@
     /**
      * Constructor
      *
-     * \param nUser the number of UE nodes
-     * \param dist the distance between UE nodes and eNodeB
-     * \param thrRefDl DL reference throughput
-     * \param thrRefUl UL reference throughput
-     * \param errorModelEnabled indicates whether the error model is enabled
+     * @param nUser the number of UE nodes
+     * @param dist the distance between UE nodes and eNodeB
+     * @param thrRefDl DL reference throughput
+     * @param thrRefUl UL reference throughput
+     * @param errorModelEnabled indicates whether the error model is enabled
      */
     LenaTdBetFfMacSchedulerTestCase1(uint16_t nUser,
                                      double dist,
@@ -49,9 +49,9 @@
   private:
     /**
      * Builds the test name string based on provided parameter values
-     * \param nUser the number of UE nodes
-     * \param dist the distance between UE nodes and eNodeB
-     * \returns the name string
+     * @param nUser the number of UE nodes
+     * @param dist the distance between UE nodes and eNodeB
+     * @returns the name string
      */
     static std::string BuildNameString(uint16_t nUser, double dist);
     void DoRun() override;
@@ -63,9 +63,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Lena TdBet Ff Mac Scheduler Test Case
+ * @brief Lena TdBet Ff Mac Scheduler Test Case
  */
 class LenaTdBetFfMacSchedulerTestCase2 : public TestCase
 {
@@ -73,10 +73,10 @@
     /**
      * Constructor
      *
-     * \param dist the distance between nodes
-     * \param achievableRateDl the DL achievable rate
-     * \param estThrTdBetUl UL reference throughput
-     * \param errorModelEnabled indicates whether the error model is enabled
+     * @param dist the distance between nodes
+     * @param achievableRateDl the DL achievable rate
+     * @param estThrTdBetUl UL reference throughput
+     * @param errorModelEnabled indicates whether the error model is enabled
      */
     LenaTdBetFfMacSchedulerTestCase2(std::vector<double> dist,
                                      std::vector<uint32_t> achievableRateDl,
@@ -87,9 +87,9 @@
   private:
     /**
      * Build name string
-     * \param nUser the number of UE nodes
-     * \param dist the distance between nodes
-     * \returns the name string
+     * @param nUser the number of UE nodes
+     * @param dist the distance between nodes
+     * @returns the name string
      */
     static std::string BuildNameString(uint16_t nUser, std::vector<double> dist);
     void DoRun() override;
@@ -101,9 +101,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test suite for TdBetFfMacScheduler tests.
+ * @brief Test suite for TdBetFfMacScheduler tests.
  */
 class LenaTestTdBetFfMacSchedulerSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-tdmt-ff-mac-scheduler.cc ns-3.44/src/lte/test/lte-test-tdmt-ff-mac-scheduler.cc
--- ns-3.43/src/lte/test/lte-test-tdmt-ff-mac-scheduler.cc	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-tdmt-ff-mac-scheduler.cc	2025-03-09 16:55:49.611372000 -0700
@@ -10,31 +10,31 @@
 
 #include "lte-test-tdmt-ff-mac-scheduler.h"
 
+#include "ns3/boolean.h"
+#include "ns3/constant-position-mobility-model.h"
 #include "ns3/double.h"
+#include "ns3/enum.h"
+#include "ns3/eps-bearer.h"
+#include "ns3/ff-mac-scheduler.h"
+#include "ns3/log.h"
+#include "ns3/lte-enb-net-device.h"
+#include "ns3/lte-enb-phy.h"
+#include "ns3/lte-helper.h"
+#include "ns3/lte-ue-net-device.h"
+#include "ns3/lte-ue-phy.h"
+#include "ns3/lte-ue-rrc.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/net-device-container.h"
+#include "ns3/node-container.h"
+#include "ns3/object.h"
+#include "ns3/packet.h"
+#include "ns3/ptr.h"
 #include "ns3/radio-bearer-stats-calculator.h"
+#include "ns3/simulator.h"
+#include "ns3/spectrum-error-model.h"
+#include "ns3/spectrum-interference.h"
 #include "ns3/string.h"
-#include <ns3/boolean.h>
-#include <ns3/constant-position-mobility-model.h>
-#include <ns3/enum.h>
-#include <ns3/eps-bearer.h>
-#include <ns3/ff-mac-scheduler.h>
-#include <ns3/log.h>
-#include <ns3/lte-enb-net-device.h>
-#include <ns3/lte-enb-phy.h>
-#include <ns3/lte-helper.h>
-#include <ns3/lte-ue-net-device.h>
-#include <ns3/lte-ue-phy.h>
-#include <ns3/lte-ue-rrc.h>
-#include <ns3/mobility-helper.h>
-#include <ns3/net-device-container.h>
-#include <ns3/node-container.h>
-#include <ns3/object.h>
-#include <ns3/packet.h>
-#include <ns3/ptr.h>
-#include <ns3/simulator.h>
-#include <ns3/spectrum-error-model.h>
-#include <ns3/spectrum-interference.h>
-#include <ns3/test.h>
+#include "ns3/test.h"
 
 #include <iostream>
 #include <sstream>
@@ -160,7 +160,7 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LenaTestTdMtFfMacSchedulerSuite lenaTestTdMtFfMacSchedulerSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-tdmt-ff-mac-scheduler.h ns-3.44/src/lte/test/lte-test-tdmt-ff-mac-scheduler.h
--- ns-3.43/src/lte/test/lte-test-tdmt-ff-mac-scheduler.h	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-tdmt-ff-mac-scheduler.h	2025-03-09 16:55:49.611372000 -0700
@@ -17,9 +17,9 @@
 using namespace ns3;
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief This system test program creates different test cases with a single eNB and
+ * @brief This system test program creates different test cases with a single eNB and
  * several UEs, all having the same Radio Bearer specification. In each test
  * case, the UEs see the same SINR from the eNB; different test cases are
  * implemented obtained by using different SINR values and different numbers of
@@ -33,11 +33,11 @@
     /**
      * Constructor
      *
-     * \param nUser the number of UE nodes
-     * \param dist the distance between UE nodes and eNodeB
-     * \param thrRefDl the DL throughput reference
-     * \param thrRefUl the UL throughput reference
-     * \param errorModelEnabled if true the error model is enabled
+     * @param nUser the number of UE nodes
+     * @param dist the distance between UE nodes and eNodeB
+     * @param thrRefDl the DL throughput reference
+     * @param thrRefUl the UL throughput reference
+     * @param errorModelEnabled if true the error model is enabled
      */
     LenaTdMtFfMacSchedulerTestCase(uint16_t nUser,
                                    double dist,
@@ -49,9 +49,9 @@
   private:
     /**
      * Builds the test name string based on provided parameter values
-     * \param nUser the number of UE nodes
-     * \param dist the distance between nodes
-     * \returns the name string
+     * @param nUser the number of UE nodes
+     * @param dist the distance between nodes
+     * @returns the name string
      */
     static std::string BuildNameString(uint16_t nUser, double dist);
     void DoRun() override;
@@ -63,9 +63,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test suite for TdMtFfMacScheduler tests.
+ * @brief Test suite for TdMtFfMacScheduler tests.
  */
 class LenaTestTdMtFfMacSchedulerSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-tdtbfq-ff-mac-scheduler.cc ns-3.44/src/lte/test/lte-test-tdtbfq-ff-mac-scheduler.cc
--- ns-3.43/src/lte/test/lte-test-tdtbfq-ff-mac-scheduler.cc	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-tdtbfq-ff-mac-scheduler.cc	2025-03-09 16:55:49.611372000 -0700
@@ -10,38 +10,38 @@
 
 #include "lte-test-tdtbfq-ff-mac-scheduler.h"
 
+#include "ns3/boolean.h"
+#include "ns3/constant-position-mobility-model.h"
 #include "ns3/double.h"
+#include "ns3/enum.h"
+#include "ns3/eps-bearer.h"
+#include "ns3/ff-mac-scheduler.h"
 #include "ns3/internet-module.h"
 #include "ns3/ipv4-global-routing-helper.h"
+#include "ns3/log.h"
+#include "ns3/lte-enb-net-device.h"
+#include "ns3/lte-enb-phy.h"
+#include "ns3/lte-helper.h"
+#include "ns3/lte-ue-net-device.h"
+#include "ns3/lte-ue-phy.h"
+#include "ns3/lte-ue-rrc.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/net-device-container.h"
 #include "ns3/network-module.h"
+#include "ns3/node-container.h"
+#include "ns3/object.h"
 #include "ns3/packet-sink-helper.h"
+#include "ns3/packet.h"
 #include "ns3/point-to-point-epc-helper.h"
 #include "ns3/point-to-point-helper.h"
+#include "ns3/ptr.h"
 #include "ns3/radio-bearer-stats-calculator.h"
+#include "ns3/simulator.h"
+#include "ns3/spectrum-error-model.h"
+#include "ns3/spectrum-interference.h"
 #include "ns3/string.h"
+#include "ns3/test.h"
 #include "ns3/udp-client-server-helper.h"
-#include <ns3/boolean.h>
-#include <ns3/constant-position-mobility-model.h>
-#include <ns3/enum.h>
-#include <ns3/eps-bearer.h>
-#include <ns3/ff-mac-scheduler.h>
-#include <ns3/log.h>
-#include <ns3/lte-enb-net-device.h>
-#include <ns3/lte-enb-phy.h>
-#include <ns3/lte-helper.h>
-#include <ns3/lte-ue-net-device.h>
-#include <ns3/lte-ue-phy.h>
-#include <ns3/lte-ue-rrc.h>
-#include <ns3/mobility-helper.h>
-#include <ns3/net-device-container.h>
-#include <ns3/node-container.h>
-#include <ns3/object.h>
-#include <ns3/packet.h>
-#include <ns3/ptr.h>
-#include <ns3/simulator.h>
-#include <ns3/spectrum-error-model.h>
-#include <ns3/spectrum-interference.h>
-#include <ns3/test.h>
 
 #include <iostream>
 #include <sstream>
@@ -252,7 +252,7 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LenaTestTdTbfqFfMacSchedulerSuite lenaTestTdTbfqFfMacSchedulerSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-tdtbfq-ff-mac-scheduler.h ns-3.44/src/lte/test/lte-test-tdtbfq-ff-mac-scheduler.h
--- ns-3.43/src/lte/test/lte-test-tdtbfq-ff-mac-scheduler.h	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-tdtbfq-ff-mac-scheduler.h	2025-03-09 16:55:49.611372000 -0700
@@ -17,9 +17,9 @@
 using namespace ns3;
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief This system test program creates different test cases with a single eNB and
+ * @brief This system test program creates different test cases with a single eNB and
  * several UEs, all having the same Radio Bearer specification. In each test
  * case, the UEs see the same SINR from the eNB; different test cases are
  * implemented obtained by using different SINR values and different numbers of
@@ -33,13 +33,13 @@
     /**
      * Constructor
      *
-     * \param nUser the number of UE nodes
-     * \param dist the distance between nodes
-     * \param thrRefDl the DL throughput reference
-     * \param thrRefUl the UL throughput reference
-     * \param packetSize the packet size
-     * \param interval the interval time
-     * \param errorModelEnabled if true the error model is enabled
+     * @param nUser the number of UE nodes
+     * @param dist the distance between nodes
+     * @param thrRefDl the DL throughput reference
+     * @param thrRefUl the UL throughput reference
+     * @param packetSize the packet size
+     * @param interval the interval time
+     * @param errorModelEnabled if true the error model is enabled
      */
     LenaTdTbfqFfMacSchedulerTestCase1(uint16_t nUser,
                                       double dist,
@@ -53,9 +53,9 @@
   private:
     /**
      * Builds the test name string based on provided parameter values
-     * \param nUser the number of UE nodes
-     * \param dist the distance between UE nodes and eNodeB
-     * \returns the name string
+     * @param nUser the number of UE nodes
+     * @param dist the distance between UE nodes and eNodeB
+     * @returns the name string
      */
     static std::string BuildNameString(uint16_t nUser, double dist);
     void DoRun() override;
@@ -69,9 +69,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Lena TdTbfq Ff Mac Scheduler Test Case 2
+ * @brief Lena TdTbfq Ff Mac Scheduler Test Case 2
  */
 class LenaTdTbfqFfMacSchedulerTestCase2 : public TestCase
 {
@@ -79,11 +79,11 @@
     /**
      * Constructor
      *
-     * \param dist the distance between nodes
-     * \param estThrTdTbfqDl the estimated DL throughput TdTbfq
-     * \param packetSize the packet size
-     * \param interval the interval time
-     * \param errorModelEnabled if true the error model is enabled
+     * @param dist the distance between nodes
+     * @param estThrTdTbfqDl the estimated DL throughput TdTbfq
+     * @param packetSize the packet size
+     * @param interval the interval time
+     * @param errorModelEnabled if true the error model is enabled
      */
     LenaTdTbfqFfMacSchedulerTestCase2(std::vector<double> dist,
                                       std::vector<uint32_t> estThrTdTbfqDl,
@@ -95,9 +95,9 @@
   private:
     /**
      * Builds the test name string based on provided parameter values
-     * \param nUser the number of UE nodes
-     * \param dist the distance between nodes
-     * \returns the name string
+     * @param nUser the number of UE nodes
+     * @param dist the distance between nodes
+     * @returns the name string
      */
     static std::string BuildNameString(uint16_t nUser, std::vector<double> dist);
     void DoRun() override;
@@ -110,9 +110,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test suite for TdTbfqFfMacScheduler test.
+ * @brief Test suite for TdTbfqFfMacScheduler test.
  */
 class LenaTestTdTbfqFfMacSchedulerSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-tta-ff-mac-scheduler.cc ns-3.44/src/lte/test/lte-test-tta-ff-mac-scheduler.cc
--- ns-3.43/src/lte/test/lte-test-tta-ff-mac-scheduler.cc	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-tta-ff-mac-scheduler.cc	2025-03-09 16:55:49.611372000 -0700
@@ -10,31 +10,31 @@
 
 #include "lte-test-tta-ff-mac-scheduler.h"
 
+#include "ns3/boolean.h"
+#include "ns3/constant-position-mobility-model.h"
 #include "ns3/double.h"
+#include "ns3/enum.h"
+#include "ns3/eps-bearer.h"
+#include "ns3/ff-mac-scheduler.h"
+#include "ns3/log.h"
+#include "ns3/lte-enb-net-device.h"
+#include "ns3/lte-enb-phy.h"
+#include "ns3/lte-helper.h"
+#include "ns3/lte-ue-net-device.h"
+#include "ns3/lte-ue-phy.h"
+#include "ns3/lte-ue-rrc.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/net-device-container.h"
+#include "ns3/node-container.h"
+#include "ns3/object.h"
+#include "ns3/packet.h"
+#include "ns3/ptr.h"
 #include "ns3/radio-bearer-stats-calculator.h"
+#include "ns3/simulator.h"
+#include "ns3/spectrum-error-model.h"
+#include "ns3/spectrum-interference.h"
 #include "ns3/string.h"
-#include <ns3/boolean.h>
-#include <ns3/constant-position-mobility-model.h>
-#include <ns3/enum.h>
-#include <ns3/eps-bearer.h>
-#include <ns3/ff-mac-scheduler.h>
-#include <ns3/log.h>
-#include <ns3/lte-enb-net-device.h>
-#include <ns3/lte-enb-phy.h>
-#include <ns3/lte-helper.h>
-#include <ns3/lte-ue-net-device.h>
-#include <ns3/lte-ue-phy.h>
-#include <ns3/lte-ue-rrc.h>
-#include <ns3/mobility-helper.h>
-#include <ns3/net-device-container.h>
-#include <ns3/node-container.h>
-#include <ns3/object.h>
-#include <ns3/packet.h>
-#include <ns3/ptr.h>
-#include <ns3/simulator.h>
-#include <ns3/spectrum-error-model.h>
-#include <ns3/spectrum-interference.h>
-#include <ns3/test.h>
+#include "ns3/test.h"
 
 #include <iostream>
 #include <sstream>
@@ -160,7 +160,7 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LenaTestTtaFfMacSchedulerSuite lenaTestTtaFfMacSchedulerSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-tta-ff-mac-scheduler.h ns-3.44/src/lte/test/lte-test-tta-ff-mac-scheduler.h
--- ns-3.43/src/lte/test/lte-test-tta-ff-mac-scheduler.h	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-tta-ff-mac-scheduler.h	2025-03-09 16:55:49.611372000 -0700
@@ -17,9 +17,9 @@
 using namespace ns3;
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief This system test program creates different test cases with a single eNB and
+ * @brief This system test program creates different test cases with a single eNB and
  * several UEs, all having the same Radio Bearer specification. In each test
  * case, the UEs see the same SINR from the eNB; different test cases are
  * implemented obtained by using different SINR values and different numbers of
@@ -33,11 +33,11 @@
     /**
      * Constructor
      *
-     * \param nUser the number of UE nodes
-     * \param dist the distance between nodes
-     * \param thrRefDl the DL throughput reference
-     * \param thrRefUl the UL throughput reference
-     * \param errorModelEnabled if true the error model is enabled
+     * @param nUser the number of UE nodes
+     * @param dist the distance between nodes
+     * @param thrRefDl the DL throughput reference
+     * @param thrRefUl the UL throughput reference
+     * @param errorModelEnabled if true the error model is enabled
      */
     LenaTtaFfMacSchedulerTestCase(uint16_t nUser,
                                   double dist,
@@ -49,9 +49,9 @@
   private:
     /**
      * Build name string
-     * \param nUser the number of UE nodes
-     * \param dist the distance between nodes
-     * \returns the name string
+     * @param nUser the number of UE nodes
+     * @param dist the distance between nodes
+     * @returns the name string
      */
     static std::string BuildNameString(uint16_t nUser, double dist);
     void DoRun() override;
@@ -63,9 +63,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Lena Test Tta Ff Mac Scheduler Suite
+ * @brief Lena Test Tta Ff Mac Scheduler Suite
  */
 class LenaTestTtaFfMacSchedulerSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-ue-measurements.cc ns-3.44/src/lte/test/lte-test-ue-measurements.cc
--- ns-3.43/src/lte/test/lte-test-ue-measurements.cc	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-ue-measurements.cc	2025-03-09 16:55:49.611372000 -0700
@@ -11,32 +11,32 @@
 
 #include "lte-test-ue-measurements.h"
 
-#include <ns3/boolean.h>
-#include <ns3/callback.h>
-#include <ns3/config.h>
-#include <ns3/double.h>
-#include <ns3/enum.h>
-#include <ns3/ff-mac-scheduler.h>
-#include <ns3/internet-stack-helper.h>
-#include <ns3/ipv4-address-helper.h>
-#include <ns3/ipv4-interface-container.h>
-#include <ns3/ipv4-static-routing-helper.h>
-#include <ns3/log.h>
-#include <ns3/lte-common.h>
-#include <ns3/lte-enb-net-device.h>
-#include <ns3/lte-enb-phy.h>
-#include <ns3/lte-enb-rrc.h>
-#include <ns3/lte-helper.h>
-#include <ns3/lte-ue-net-device.h>
-#include <ns3/lte-ue-phy.h>
-#include <ns3/lte-ue-rrc.h>
-#include <ns3/mobility-helper.h>
-#include <ns3/net-device-container.h>
-#include <ns3/node-container.h>
-#include <ns3/point-to-point-epc-helper.h>
-#include <ns3/point-to-point-helper.h>
-#include <ns3/simulator.h>
-#include <ns3/string.h>
+#include "ns3/boolean.h"
+#include "ns3/callback.h"
+#include "ns3/config.h"
+#include "ns3/double.h"
+#include "ns3/enum.h"
+#include "ns3/ff-mac-scheduler.h"
+#include "ns3/internet-stack-helper.h"
+#include "ns3/ipv4-address-helper.h"
+#include "ns3/ipv4-interface-container.h"
+#include "ns3/ipv4-static-routing-helper.h"
+#include "ns3/log.h"
+#include "ns3/lte-common.h"
+#include "ns3/lte-enb-net-device.h"
+#include "ns3/lte-enb-phy.h"
+#include "ns3/lte-enb-rrc.h"
+#include "ns3/lte-helper.h"
+#include "ns3/lte-ue-net-device.h"
+#include "ns3/lte-ue-phy.h"
+#include "ns3/lte-ue-rrc.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/net-device-container.h"
+#include "ns3/node-container.h"
+#include "ns3/point-to-point-epc-helper.h"
+#include "ns3/point-to-point-helper.h"
+#include "ns3/simulator.h"
+#include "ns3/string.h"
 
 using namespace ns3;
 
@@ -222,7 +222,7 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LteUeMeasurementsTestSuite lteUeMeasurementsTestSuite;
@@ -687,7 +687,7 @@
 } // end of LteUeMeasurementsPiecewiseTestSuite1::LteUeMeasurementsPiecewiseTestSuite1
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LteUeMeasurementsPiecewiseTestSuite1 lteUeMeasurementsPiecewiseTestSuite1;
@@ -1390,7 +1390,7 @@
 } // end of LteUeMeasurementsPiecewiseTestSuite2::LteUeMeasurementsPiecewiseTestSuite2
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LteUeMeasurementsPiecewiseTestSuite2 lteUeMeasurementsPiecewiseTestSuite2;
@@ -1571,81 +1571,82 @@
     NS_ASSERT(rnti == 1);
     NS_ASSERT(cellId == 1);
 
-    if (report.measResults.measId == m_expectedMeasId)
+    if (report.measResults.measId != m_expectedMeasId)
     {
-        // verifying the report completeness
-        LteRrcSap::MeasResults measResults = report.measResults;
-        NS_LOG_DEBUG(
-            this << " Serving cellId=" << cellId
-                 << " rsrp=" << (uint16_t)measResults.measResultPCell.rsrpResult << " ("
-                 << EutranMeasurementMapping::RsrpRange2Dbm(measResults.measResultPCell.rsrpResult)
-                 << " dBm)"
-                 << " rsrq=" << (uint16_t)measResults.measResultPCell.rsrqResult << " ("
-                 << EutranMeasurementMapping::RsrqRange2Db(measResults.measResultPCell.rsrqResult)
-                 << " dB)");
-
-        // verifying reported best cells
-        if (measResults.measResultListEutra.empty())
-        {
-            NS_TEST_ASSERT_MSG_EQ(measResults.haveMeasResultNeighCells,
-                                  false,
-                                  "Unexpected report content");
-        }
-        else
-        {
-            NS_TEST_ASSERT_MSG_EQ(measResults.haveMeasResultNeighCells,
-                                  true,
-                                  "Unexpected report content");
-            auto it = measResults.measResultListEutra.begin();
-            NS_ASSERT(it != measResults.measResultListEutra.end());
-            NS_ASSERT(it->physCellId == 2);
-            NS_TEST_ASSERT_MSG_EQ(it->haveCgiInfo,
-                                  false,
-                                  "Report contains cgi-info, which is not supported");
-            NS_TEST_ASSERT_MSG_EQ(it->haveRsrpResult,
-                                  true,
-                                  "Report does not contain measured RSRP result");
-            NS_TEST_ASSERT_MSG_EQ(it->haveRsrqResult,
-                                  true,
-                                  "Report does not contain measured RSRQ result");
-            NS_LOG_DEBUG(this << " Neighbour cellId=" << it->physCellId
-                              << " rsrp=" << (uint16_t)it->rsrpResult << " ("
-                              << EutranMeasurementMapping::RsrpRange2Dbm(it->rsrpResult) << " dBm)"
-                              << " rsrq=" << (uint16_t)it->rsrqResult << " ("
-                              << EutranMeasurementMapping::RsrqRange2Db(it->rsrqResult) << " dB)");
+        return;
+    }
 
-        } // end of else of if (measResults.measResultListEutra.size () == 0)
+    // verifying the report completeness
+    LteRrcSap::MeasResults measResults = report.measResults;
+    NS_LOG_DEBUG(
+        this << " Serving cellId=" << cellId
+             << " rsrp=" << (uint16_t)measResults.measResultPCell.rsrpResult << " ("
+             << EutranMeasurementMapping::RsrpRange2Dbm(measResults.measResultPCell.rsrpResult)
+             << " dBm)"
+             << " rsrq=" << (uint16_t)measResults.measResultPCell.rsrqResult << " ("
+             << EutranMeasurementMapping::RsrqRange2Db(measResults.measResultPCell.rsrqResult)
+             << " dB)");
 
-        // verifying the report timing
-        bool hasEnded = m_itExpectedTime == m_expectedTime.end();
-        NS_TEST_ASSERT_MSG_EQ(hasEnded,
+    // verifying reported best cells
+    if (measResults.measResultListEutra.empty())
+    {
+        NS_TEST_ASSERT_MSG_EQ(measResults.haveMeasResultNeighCells,
                               false,
-                              "Reporting should not have occurred at "
-                                  << Simulator::Now().As(Time::S));
-        if (!hasEnded)
-        {
-            hasEnded = m_itExpectedRsrp == m_expectedRsrp.end();
-            NS_ASSERT(!hasEnded);
-
-            // using milliseconds to avoid floating-point comparison
-            uint64_t timeNowMs = Simulator::Now().GetMilliSeconds();
-            uint64_t timeExpectedMs = m_itExpectedTime->GetMilliSeconds();
-            m_itExpectedTime++;
+                              "Unexpected report content");
+    }
+    else
+    {
+        NS_TEST_ASSERT_MSG_EQ(measResults.haveMeasResultNeighCells,
+                              true,
+                              "Unexpected report content");
+        auto it = measResults.measResultListEutra.begin();
+        NS_ASSERT(it != measResults.measResultListEutra.end());
+        NS_ASSERT(it->physCellId == 2);
+        NS_TEST_ASSERT_MSG_EQ(it->haveCgiInfo,
+                              false,
+                              "Report contains cgi-info, which is not supported");
+        NS_TEST_ASSERT_MSG_EQ(it->haveRsrpResult,
+                              true,
+                              "Report does not contain measured RSRP result");
+        NS_TEST_ASSERT_MSG_EQ(it->haveRsrqResult,
+                              true,
+                              "Report does not contain measured RSRQ result");
+        NS_LOG_DEBUG(this << " Neighbour cellId=" << it->physCellId
+                          << " rsrp=" << (uint16_t)it->rsrpResult << " ("
+                          << EutranMeasurementMapping::RsrpRange2Dbm(it->rsrpResult) << " dBm)"
+                          << " rsrq=" << (uint16_t)it->rsrqResult << " ("
+                          << EutranMeasurementMapping::RsrqRange2Db(it->rsrqResult) << " dB)");
 
-            uint16_t observedRsrp = measResults.measResultPCell.rsrpResult;
-            uint16_t referenceRsrp = *m_itExpectedRsrp;
-            m_itExpectedRsrp++;
+    } // end of else of if (measResults.measResultListEutra.size () == 0)
 
-            NS_TEST_ASSERT_MSG_EQ(timeNowMs,
-                                  timeExpectedMs,
-                                  "Reporting should not have occurred at this time");
-            NS_TEST_ASSERT_MSG_EQ(observedRsrp,
-                                  referenceRsrp,
-                                  "The RSRP observed differs with the reference RSRP");
+    // verifying the report timing
+    bool hasEnded = m_itExpectedTime == m_expectedTime.end();
+    NS_TEST_ASSERT_MSG_EQ(hasEnded,
+                          false,
+                          "Reporting should not have occurred at " << Simulator::Now().As(Time::S));
+    if (hasEnded)
+    {
+        return;
+    }
 
-        } // end of if (!hasEnded)
+    hasEnded = m_itExpectedRsrp == m_expectedRsrp.end();
+    NS_ASSERT(!hasEnded);
 
-    } // end of if (report.measResults.measId == m_expectedMeasId)
+    // using milliseconds to avoid floating-point comparison
+    uint64_t timeNowMs = Simulator::Now().GetMilliSeconds();
+    uint64_t timeExpectedMs = m_itExpectedTime->GetMilliSeconds();
+    m_itExpectedTime++;
+
+    uint16_t observedRsrp = measResults.measResultPCell.rsrpResult;
+    uint16_t referenceRsrp = *m_itExpectedRsrp;
+    m_itExpectedRsrp++;
+
+    NS_TEST_ASSERT_MSG_EQ(timeNowMs,
+                          timeExpectedMs,
+                          "Reporting should not have occurred at this time");
+    NS_TEST_ASSERT_MSG_EQ(observedRsrp,
+                          referenceRsrp,
+                          "The RSRP observed differs with the reference RSRP");
 
 } // end of void LteUeMeasurementsPiecewiseTestCase2::RecvMeasurementReportCallback
 
@@ -1717,7 +1718,7 @@
 } // end of LteUeMeasurementsPiecewiseTestSuite3::LteUeMeasurementsPiecewiseTestSuite3
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LteUeMeasurementsPiecewiseTestSuite3 lteUeMeasurementsPiecewiseTestSuite3;
@@ -1863,75 +1864,76 @@
     NS_ASSERT(rnti == 1);
     NS_ASSERT(cellId == 1);
 
-    if (report.measResults.measId == m_expectedMeasId)
+    if (report.measResults.measId != m_expectedMeasId)
     {
-        // verifying the report completeness
-        LteRrcSap::MeasResults measResults = report.measResults;
-        NS_LOG_DEBUG(
-            this << " Serving cellId=" << cellId
-                 << " rsrp=" << (uint16_t)measResults.measResultPCell.rsrpResult << " ("
-                 << EutranMeasurementMapping::RsrpRange2Dbm(measResults.measResultPCell.rsrpResult)
-                 << " dBm)"
-                 << " rsrq=" << (uint16_t)measResults.measResultPCell.rsrqResult << " ("
-                 << EutranMeasurementMapping::RsrqRange2Db(measResults.measResultPCell.rsrqResult)
-                 << " dB)");
-
-        // verifying reported best cells
-        if (measResults.measResultListEutra.empty())
-        {
-            NS_TEST_ASSERT_MSG_EQ(measResults.haveMeasResultNeighCells,
-                                  false,
-                                  "Unexpected report content");
-        }
-        else
-        {
-            NS_TEST_ASSERT_MSG_EQ(measResults.haveMeasResultNeighCells,
-                                  true,
-                                  "Unexpected report content");
-            auto it = measResults.measResultListEutra.begin();
-            NS_ASSERT(it != measResults.measResultListEutra.end());
-            for (const auto& it : measResults.measResultListEutra)
-            {
-                NS_ASSERT(it.physCellId == 2 || it.physCellId == 3);
-                NS_TEST_ASSERT_MSG_EQ(it.haveCgiInfo,
-                                      false,
-                                      "Report contains cgi-info, which is not supported");
-                NS_TEST_ASSERT_MSG_EQ(it.haveRsrpResult,
-                                      true,
-                                      "Report does not contain measured RSRP result");
-                NS_TEST_ASSERT_MSG_EQ(it.haveRsrqResult,
-                                      true,
-                                      "Report does not contain measured RSRQ result");
-                NS_LOG_DEBUG(
-                    this << " Neighbour cellId=" << it.physCellId
-                         << " rsrp=" << (uint16_t)it.rsrpResult << " ("
-                         << EutranMeasurementMapping::RsrpRange2Dbm(it.rsrpResult) << " dBm)"
-                         << " rsrq=" << (uint16_t)it.rsrqResult << " ("
-                         << EutranMeasurementMapping::RsrqRange2Db(it.rsrqResult) << " dB)");
-            }
+        return;
+    }
 
-        } // end of else of if (measResults.measResultListEutra.size () == 0)
+    // verifying the report completeness
+    LteRrcSap::MeasResults measResults = report.measResults;
+    NS_LOG_DEBUG(
+        this << " Serving cellId=" << cellId
+             << " rsrp=" << (uint16_t)measResults.measResultPCell.rsrpResult << " ("
+             << EutranMeasurementMapping::RsrpRange2Dbm(measResults.measResultPCell.rsrpResult)
+             << " dBm)"
+             << " rsrq=" << (uint16_t)measResults.measResultPCell.rsrqResult << " ("
+             << EutranMeasurementMapping::RsrqRange2Db(measResults.measResultPCell.rsrqResult)
+             << " dB)");
 
-        // verifying the report timing
-        bool hasEnded = m_itExpectedTime == m_expectedTime.end();
-        NS_TEST_ASSERT_MSG_EQ(hasEnded,
+    // verifying reported best cells
+    if (measResults.measResultListEutra.empty())
+    {
+        NS_TEST_ASSERT_MSG_EQ(measResults.haveMeasResultNeighCells,
                               false,
-                              "Reporting should not have occurred at "
-                                  << Simulator::Now().GetSeconds() << "s");
-        if (!hasEnded)
+                              "Unexpected report content");
+    }
+    else
+    {
+        NS_TEST_ASSERT_MSG_EQ(measResults.haveMeasResultNeighCells,
+                              true,
+                              "Unexpected report content");
+        auto it = measResults.measResultListEutra.begin();
+        NS_ASSERT(it != measResults.measResultListEutra.end());
+        for (const auto& it : measResults.measResultListEutra)
         {
-            // using milliseconds to avoid floating-point comparison
-            uint64_t timeNowMs = Simulator::Now().GetMilliSeconds();
-            uint64_t timeExpectedMs = m_itExpectedTime->GetMilliSeconds();
-            m_itExpectedTime++;
+            NS_ASSERT(it.physCellId == 2 || it.physCellId == 3);
+            NS_TEST_ASSERT_MSG_EQ(it.haveCgiInfo,
+                                  false,
+                                  "Report contains cgi-info, which is not supported");
+            NS_TEST_ASSERT_MSG_EQ(it.haveRsrpResult,
+                                  true,
+                                  "Report does not contain measured RSRP result");
+            NS_TEST_ASSERT_MSG_EQ(it.haveRsrqResult,
+                                  true,
+                                  "Report does not contain measured RSRQ result");
+            NS_LOG_DEBUG(this << " Neighbour cellId=" << it.physCellId
+                              << " rsrp=" << (uint16_t)it.rsrpResult << " ("
+                              << EutranMeasurementMapping::RsrpRange2Dbm(it.rsrpResult) << " dBm)"
+                              << " rsrq=" << (uint16_t)it.rsrqResult << " ("
+                              << EutranMeasurementMapping::RsrqRange2Db(it.rsrqResult) << " dB)");
+        }
 
-            NS_TEST_ASSERT_MSG_EQ(timeNowMs,
-                                  timeExpectedMs,
-                                  "Reporting should not have occurred at this time");
+    } // end of else of if (measResults.measResultListEutra.size () == 0)
 
-        } // end of if (!hasEnded)
+    // verifying the report timing
+    bool hasEnded = m_itExpectedTime == m_expectedTime.end();
+    NS_TEST_ASSERT_MSG_EQ(hasEnded,
+                          false,
+                          "Reporting should not have occurred at " << Simulator::Now().GetSeconds()
+                                                                   << "s");
+    if (hasEnded)
+    {
+        return;
+    }
 
-    } // end of if (report.measResults.measId == m_expectedMeasId)
+    // using milliseconds to avoid floating-point comparison
+    uint64_t timeNowMs = Simulator::Now().GetMilliSeconds();
+    uint64_t timeExpectedMs = m_itExpectedTime->GetMilliSeconds();
+    m_itExpectedTime++;
+
+    NS_TEST_ASSERT_MSG_EQ(timeNowMs,
+                          timeExpectedMs,
+                          "Reporting should not have occurred at this time");
 
 } // end of void LteUeMeasurementsPiecewiseTestCase3::RecvMeasurementReportCallback
 
@@ -2268,7 +2270,7 @@
 } // end of LteUeMeasurementsHandoverTestSuite::LteUeMeasurementsHandoverTestSuite
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LteUeMeasurementsHandoverTestSuite lteUeMeasurementsHandoverTestSuite;
@@ -2491,81 +2493,82 @@
         NS_FATAL_ERROR("Invalid cell ID " << cellId);
     }
 
-    if (isCorrectMeasId)
+    if (!isCorrectMeasId)
     {
-        // verifying the report completeness
-        LteRrcSap::MeasResults measResults = report.measResults;
-        NS_LOG_DEBUG(
-            this << " Serving cellId=" << cellId
-                 << " rsrp=" << (uint16_t)measResults.measResultPCell.rsrpResult << " ("
-                 << EutranMeasurementMapping::RsrpRange2Dbm(measResults.measResultPCell.rsrpResult)
-                 << " dBm)"
-                 << " rsrq=" << (uint16_t)measResults.measResultPCell.rsrqResult << " ("
-                 << EutranMeasurementMapping::RsrqRange2Db(measResults.measResultPCell.rsrqResult)
-                 << " dB)");
-
-        // verifying reported best cells
-        if (measResults.measResultListEutra.empty())
-        {
-            NS_TEST_ASSERT_MSG_EQ(measResults.haveMeasResultNeighCells,
-                                  false,
-                                  "Unexpected report content");
-        }
-        else
-        {
-            NS_TEST_ASSERT_MSG_EQ(measResults.haveMeasResultNeighCells,
-                                  true,
-                                  "Unexpected report content");
-            auto it = measResults.measResultListEutra.begin();
-            NS_ASSERT(it != measResults.measResultListEutra.end());
-            NS_ASSERT(it->physCellId != cellId);
-            NS_ASSERT(it->physCellId <= 2);
-            NS_TEST_ASSERT_MSG_EQ(it->haveCgiInfo,
-                                  false,
-                                  "Report contains cgi-info, which is not supported");
-            NS_TEST_ASSERT_MSG_EQ(it->haveRsrpResult,
-                                  true,
-                                  "Report does not contain measured RSRP result");
-            NS_TEST_ASSERT_MSG_EQ(it->haveRsrqResult,
-                                  true,
-                                  "Report does not contain measured RSRQ result");
-            NS_LOG_DEBUG(this << " Neighbour cellId=" << it->physCellId
-                              << " rsrp=" << (uint16_t)it->rsrpResult << " ("
-                              << EutranMeasurementMapping::RsrpRange2Dbm(it->rsrpResult) << " dBm)"
-                              << " rsrq=" << (uint16_t)it->rsrqResult << " ("
-                              << EutranMeasurementMapping::RsrqRange2Db(it->rsrqResult) << " dB)");
+        return;
+    }
 
-        } // end of else of if (measResults.measResultListEutra.size () == 0)
+    // verifying the report completeness
+    LteRrcSap::MeasResults measResults = report.measResults;
+    NS_LOG_DEBUG(
+        this << " Serving cellId=" << cellId
+             << " rsrp=" << (uint16_t)measResults.measResultPCell.rsrpResult << " ("
+             << EutranMeasurementMapping::RsrpRange2Dbm(measResults.measResultPCell.rsrpResult)
+             << " dBm)"
+             << " rsrq=" << (uint16_t)measResults.measResultPCell.rsrqResult << " ("
+             << EutranMeasurementMapping::RsrqRange2Db(measResults.measResultPCell.rsrqResult)
+             << " dB)");
 
-        // verifying the report timing
-        bool hasEnded = m_itExpectedTime == m_expectedTime.end();
-        NS_TEST_ASSERT_MSG_EQ(hasEnded,
+    // verifying reported best cells
+    if (measResults.measResultListEutra.empty())
+    {
+        NS_TEST_ASSERT_MSG_EQ(measResults.haveMeasResultNeighCells,
                               false,
-                              "Reporting should not have occurred at "
-                                  << Simulator::Now().As(Time::S));
-        if (!hasEnded)
-        {
-            hasEnded = m_itExpectedRsrp == m_expectedRsrp.end();
-            NS_ASSERT(!hasEnded);
-
-            // using milliseconds to avoid floating-point comparison
-            uint64_t timeNowMs = Simulator::Now().GetMilliSeconds();
-            uint64_t timeExpectedMs = m_itExpectedTime->GetMilliSeconds();
-            m_itExpectedTime++;
+                              "Unexpected report content");
+    }
+    else
+    {
+        NS_TEST_ASSERT_MSG_EQ(measResults.haveMeasResultNeighCells,
+                              true,
+                              "Unexpected report content");
+        auto it = measResults.measResultListEutra.begin();
+        NS_ASSERT(it != measResults.measResultListEutra.end());
+        NS_ASSERT(it->physCellId != cellId);
+        NS_ASSERT(it->physCellId <= 2);
+        NS_TEST_ASSERT_MSG_EQ(it->haveCgiInfo,
+                              false,
+                              "Report contains cgi-info, which is not supported");
+        NS_TEST_ASSERT_MSG_EQ(it->haveRsrpResult,
+                              true,
+                              "Report does not contain measured RSRP result");
+        NS_TEST_ASSERT_MSG_EQ(it->haveRsrqResult,
+                              true,
+                              "Report does not contain measured RSRQ result");
+        NS_LOG_DEBUG(this << " Neighbour cellId=" << it->physCellId
+                          << " rsrp=" << (uint16_t)it->rsrpResult << " ("
+                          << EutranMeasurementMapping::RsrpRange2Dbm(it->rsrpResult) << " dBm)"
+                          << " rsrq=" << (uint16_t)it->rsrqResult << " ("
+                          << EutranMeasurementMapping::RsrqRange2Db(it->rsrqResult) << " dB)");
 
-            uint16_t observedRsrp = measResults.measResultPCell.rsrpResult;
-            uint16_t referenceRsrp = *m_itExpectedRsrp;
-            m_itExpectedRsrp++;
+    } // end of else of if (measResults.measResultListEutra.size () == 0)
 
-            NS_TEST_ASSERT_MSG_EQ(timeNowMs,
-                                  timeExpectedMs,
-                                  "Reporting should not have occurred at this time");
-            NS_TEST_ASSERT_MSG_EQ(observedRsrp,
-                                  referenceRsrp,
-                                  "The RSRP observed differs with the reference RSRP");
+    // verifying the report timing
+    bool hasEnded = m_itExpectedTime == m_expectedTime.end();
+    NS_TEST_ASSERT_MSG_EQ(hasEnded,
+                          false,
+                          "Reporting should not have occurred at " << Simulator::Now().As(Time::S));
+    if (hasEnded)
+    {
+        return;
+    }
 
-        } // end of if (!hasEnded)
+    hasEnded = m_itExpectedRsrp == m_expectedRsrp.end();
+    NS_ASSERT(!hasEnded);
 
-    } // end of if (report.measResults.measId == correctMeasId)
+    // using milliseconds to avoid floating-point comparison
+    uint64_t timeNowMs = Simulator::Now().GetMilliSeconds();
+    uint64_t timeExpectedMs = m_itExpectedTime->GetMilliSeconds();
+    m_itExpectedTime++;
+
+    uint16_t observedRsrp = measResults.measResultPCell.rsrpResult;
+    uint16_t referenceRsrp = *m_itExpectedRsrp;
+    m_itExpectedRsrp++;
+
+    NS_TEST_ASSERT_MSG_EQ(timeNowMs,
+                          timeExpectedMs,
+                          "Reporting should not have occurred at this time");
+    NS_TEST_ASSERT_MSG_EQ(observedRsrp,
+                          referenceRsrp,
+                          "The RSRP observed differs with the reference RSRP");
 
 } // end of void LteUeMeasurementsHandoverTestCase::RecvMeasurementReportCallback
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-ue-measurements.h ns-3.44/src/lte/test/lte-test-ue-measurements.h
--- ns-3.43/src/lte/test/lte-test-ue-measurements.h	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-ue-measurements.h	2025-03-09 16:55:49.611372000 -0700
@@ -13,9 +13,9 @@
 #ifndef LTE_TEST_UE_MEASUREMENTS_H
 #define LTE_TEST_UE_MEASUREMENTS_H
 
-#include <ns3/lte-rrc-sap.h>
-#include <ns3/nstime.h>
-#include <ns3/test.h>
+#include "ns3/lte-rrc-sap.h"
+#include "ns3/nstime.h"
+#include "ns3/test.h"
 
 #include <list>
 #include <set>
@@ -33,9 +33,9 @@
 // ===== LTE-UE-MEASUREMENTS TEST SUITE ==================================== //
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test that UE Measurements (see 36.214) calculation works fine in a
+ * @brief Test that UE Measurements (see 36.214) calculation works fine in a
  * multi-cell interference scenario.
  */
 class LteUeMeasurementsTestSuite : public TestSuite
@@ -45,9 +45,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test that UE measurements calculation works properly in a scenario
+ * @brief Test that UE measurements calculation works properly in a scenario
  * with 2 eNodeBs and 2UEs. Test that RSRP and RSRQ of the serving cell and of
  * the neighbor cell correspond to the reference values.
  */
@@ -57,13 +57,13 @@
     /**
      * Constructor
      *
-     * \param name the reference name
-     * \param d1 distance between UE and ENB node pair
-     * \param d2 distance between UE and other ENB node
-     * \param rsrpDbmUe1 RSRP in dBm UE 1
-     * \param rsrpDbmUe2 RSRP in dBm UE 2
-     * \param rsrqDbUe1 RSRQ in dBm UE 1
-     * \param rsrqDbUe2 RSRQ in dBm UE 2
+     * @param name the reference name
+     * @param d1 distance between UE and ENB node pair
+     * @param d2 distance between UE and other ENB node
+     * @param rsrpDbmUe1 RSRP in dBm UE 1
+     * @param rsrpDbmUe2 RSRP in dBm UE 2
+     * @param rsrqDbUe1 RSRQ in dBm UE 1
+     * @param rsrqDbUe2 RSRQ in dBm UE 2
      */
     LteUeMeasurementsTestCase(std::string name,
                               double d1,
@@ -76,11 +76,11 @@
 
     /**
      * Report UE measurements function
-     * \param rnti the RNTI
-     * \param cellId the cell ID
-     * \param rsrp the RSRP
-     * \param rsrq the RSRQ
-     * \param servingCell the serving cell
+     * @param rnti the RNTI
+     * @param cellId the cell ID
+     * @param rsrp the RSRP
+     * @param rsrq the RSRQ
+     * @param servingCell the serving cell
      */
     void ReportUeMeasurements(uint16_t rnti,
                               uint16_t cellId,
@@ -90,10 +90,10 @@
 
     /**
      * Reeive measurement report function
-     * \param imsi the IMSI
-     * \param cellId the cell ID
-     * \param rnti the RNTI
-     * \param meas LteRrcSap::MeasurementReport
+     * @param imsi the IMSI
+     * @param cellId the cell ID
+     * @param rnti the RNTI
+     * @param meas LteRrcSap::MeasurementReport
      */
     void RecvMeasurementReport(uint64_t imsi,
                                uint16_t cellId,
@@ -114,9 +114,9 @@
 // ===== LTE-UE-MEASUREMENTS-PIECEWISE-1 TEST SUITE ======================== //
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test suite for generating calls to UE measurements test case
+ * @brief Test suite for generating calls to UE measurements test case
  *        ns3::LteUeMeasurementsPiecewiseTestCase1.
  */
 class LteUeMeasurementsPiecewiseTestSuite1 : public TestSuite
@@ -126,9 +126,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Testing UE measurements in LTE with simulation of 1 eNodeB and 1 UE in
+ * @brief Testing UE measurements in LTE with simulation of 1 eNodeB and 1 UE in
  *        piecewise configuration and 120 ms report interval. During the simulation
  *        the placement of UE is being changed several times. Four different
  *        cases are considered: UE is very near to eNodeB, UE is near to eNodeB,
@@ -148,10 +148,10 @@
     /**
      * Constructor
      *
-     * \param name the reference name
-     * \param config LteRrcSap::ReportConfigEutra
-     * \param expectedTime the expected time
-     * \param expectedRsrp the expected RSRP
+     * @param name the reference name
+     * @param config LteRrcSap::ReportConfigEutra
+     * @param expectedTime the expected time
+     * @param expectedRsrp the expected RSRP
      */
     LteUeMeasurementsPiecewiseTestCase1(std::string name,
                                         LteRrcSap::ReportConfigEutra config,
@@ -161,7 +161,7 @@
     ~LteUeMeasurementsPiecewiseTestCase1() override;
 
     /**
-     * \brief Triggers when eNodeB receives measurement report from UE, then
+     * @brief Triggers when eNodeB receives measurement report from UE, then
      *        perform verification on it.
      *
      * The trigger is set up beforehand by connecting to the
@@ -170,11 +170,11 @@
      * Verification consists of checking whether the report carries the right
      * value of RSRP or not, and whether it occurs at the expected time or not.
      *
-     * \param context the context
-     * \param imsi the IMSI
-     * \param cellId the cell ID
-     * \param rnti  the RNTI
-     * \param report LteRrcSap::MeasurementReport
+     * @param context the context
+     * @param imsi the IMSI
+     * @param cellId the cell ID
+     * @param rnti  the RNTI
+     * @param report LteRrcSap::MeasurementReport
      */
     void RecvMeasurementReportCallback(std::string context,
                                        uint64_t imsi,
@@ -184,7 +184,7 @@
 
   private:
     /**
-     * \brief Setup the simulation with the intended UE measurement reporting
+     * @brief Setup the simulation with the intended UE measurement reporting
      *        configuration, run it, and connect the
      *        `RecvMeasurementReportCallback` function to the
      *        `LteUeRrc::RecvMeasurementReport` trace source.
@@ -192,7 +192,7 @@
     void DoRun() override;
 
     /**
-     * \brief Runs at the end of the simulation, verifying that all expected
+     * @brief Runs at the end of the simulation, verifying that all expected
      *        measurement reports have been examined.
      */
     void DoTeardown() override;
@@ -207,36 +207,36 @@
     void TeleportVeryFar();
 
     /**
-     * \brief The active report triggering configuration.
+     * @brief The active report triggering configuration.
      */
     LteRrcSap::ReportConfigEutra m_config;
 
     /**
-     * \brief The list of expected time when measurement reports are received by
+     * @brief The list of expected time when measurement reports are received by
      *        eNodeB.
      */
     std::vector<Time> m_expectedTime;
 
     /**
-     * \brief The list of expected values of RSRP (in 3GPP range unit) from the
+     * @brief The list of expected values of RSRP (in 3GPP range unit) from the
      *        measurement reports received.
      */
     std::vector<uint8_t> m_expectedRsrp;
 
     /**
-     * \brief Pointer to the element of `m_expectedTime` which is expected to
+     * @brief Pointer to the element of `m_expectedTime` which is expected to
      *        occur next in the simulation.
      */
     std::vector<Time>::iterator m_itExpectedTime;
 
     /**
-     * \brief Pointer to the element of `m_expectedRsrp` which is expected to
+     * @brief Pointer to the element of `m_expectedRsrp` which is expected to
      *        occur next in the simulation.
      */
     std::vector<uint8_t>::iterator m_itExpectedRsrp;
 
     /**
-     * \brief The measurement identity being tested. Measurement reports with
+     * @brief The measurement identity being tested. Measurement reports with
      *        different measurement identity (e.g. from handover algorithm) will
      *        be ignored.
      */
@@ -249,9 +249,9 @@
 // ===== LTE-UE-MEASUREMENTS-PIECEWISE-2 TEST SUITE ======================== //
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test suite for generating calls to UE measurements test case
+ * @brief Test suite for generating calls to UE measurements test case
  *        ns3::LteUeMeasurementsPiecewiseTestCase2.
  */
 class LteUeMeasurementsPiecewiseTestSuite2 : public TestSuite
@@ -261,9 +261,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Testing UE measurements in LTE with simulation of 2 eNodeB and 1 UE in
+ * @brief Testing UE measurements in LTE with simulation of 2 eNodeB and 1 UE in
  *        piecewise configuration and 240 ms report interval.
  *        Here is intenisvely test events A1 and A2. A1 event should be triggered
  *        when the serving cell becomes better than a given threshold. A2 shall
@@ -283,10 +283,10 @@
     /**
      * Constructor
      *
-     * \param name the reference name
-     * \param config LteRrcSap::ReportConfigEutra
-     * \param expectedTime the expected time
-     * \param expectedRsrp the expected RSRP
+     * @param name the reference name
+     * @param config LteRrcSap::ReportConfigEutra
+     * @param expectedTime the expected time
+     * @param expectedRsrp the expected RSRP
      */
     LteUeMeasurementsPiecewiseTestCase2(std::string name,
                                         LteRrcSap::ReportConfigEutra config,
@@ -296,7 +296,7 @@
     ~LteUeMeasurementsPiecewiseTestCase2() override;
 
     /**
-     * \brief Triggers when eNodeB receives measurement report from UE, then
+     * @brief Triggers when eNodeB receives measurement report from UE, then
      *        perform verification on it.
      *
      * The trigger is set up beforehand by connecting to the
@@ -305,11 +305,11 @@
      * Verification consists of checking whether the report carries the right
      * value of RSRP or not, and whether it occurs at the expected time or not.
      *
-     * \param context the context
-     * \param imsi the IMSI
-     * \param cellId the cell ID
-     * \param rnti  the RNTI
-     * \param report LteRrcSap::MeasurementReport
+     * @param context the context
+     * @param imsi the IMSI
+     * @param cellId the cell ID
+     * @param rnti  the RNTI
+     * @param report LteRrcSap::MeasurementReport
      */
     void RecvMeasurementReportCallback(std::string context,
                                        uint64_t imsi,
@@ -319,7 +319,7 @@
 
   private:
     /**
-     * \brief Setup the simulation with the intended UE measurement reporting
+     * @brief Setup the simulation with the intended UE measurement reporting
      *        configuration, run it, and connect the
      *        `RecvMeasurementReportCallback` function to the
      *        `LteUeRrc::RecvMeasurementReport` trace source.
@@ -327,7 +327,7 @@
     void DoRun() override;
 
     /**
-     * \brief Runs at the end of the simulation, verifying that all expected
+     * @brief Runs at the end of the simulation, verifying that all expected
      *        measurement reports have been examined.
      */
     void DoTeardown() override;
@@ -342,36 +342,36 @@
     void TeleportVeryFar();
 
     /**
-     * \brief The active report triggering configuration.
+     * @brief The active report triggering configuration.
      */
     LteRrcSap::ReportConfigEutra m_config;
 
     /**
-     * \brief The list of expected time when measurement reports are received by
+     * @brief The list of expected time when measurement reports are received by
      *        eNodeB.
      */
     std::vector<Time> m_expectedTime;
 
     /**
-     * \brief The list of expected values of RSRP (in 3GPP range unit) from the
+     * @brief The list of expected values of RSRP (in 3GPP range unit) from the
      *        measurement reports received.
      */
     std::vector<uint8_t> m_expectedRsrp;
 
     /**
-     * \brief Pointer to the element of `m_expectedTime` which is expected to
+     * @brief Pointer to the element of `m_expectedTime` which is expected to
      *        occur next in the simulation.
      */
     std::vector<Time>::iterator m_itExpectedTime;
 
     /**
-     * \brief Pointer to the element of `m_expectedRsrp` which is expected to
+     * @brief Pointer to the element of `m_expectedRsrp` which is expected to
      *        occur next in the simulation.
      */
     std::vector<uint8_t>::iterator m_itExpectedRsrp;
 
     /**
-     * \brief The measurement identity being tested. Measurement reports with
+     * @brief The measurement identity being tested. Measurement reports with
      *        different measurement identity (e.g. from handover algorithm) will
      *        be ignored.
      */
@@ -384,9 +384,9 @@
 // ===== LTE-UE-MEASUREMENTS-PIECEWISE-3 TEST SUITE ======================== //
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test suite for generating calls to UE measurements test case
+ * @brief Test suite for generating calls to UE measurements test case
  *        ns3::LteUeMeasurementsPiecewiseTestCase3.
  */
 class LteUeMeasurementsPiecewiseTestSuite3 : public TestSuite
@@ -396,9 +396,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Testing UE measurements in LTE with simulation of 3 eNodeB and 1 UE in
+ * @brief Testing UE measurements in LTE with simulation of 3 eNodeB and 1 UE in
  *        piecewise configuration and 240 ms report interval.
  *        This test is to cover a corner case using event A4, which is not
  *        covered by LteUeMeasurementsPiecewiseTestCase1 and
@@ -436,9 +436,9 @@
     /**
      * Constructor
      *
-     * \param name the reference name
-     * \param config LteRrcSap::ReportConfigEutra
-     * \param expectedTime the expected time
+     * @param name the reference name
+     * @param config LteRrcSap::ReportConfigEutra
+     * @param expectedTime the expected time
      */
     LteUeMeasurementsPiecewiseTestCase3(std::string name,
                                         LteRrcSap::ReportConfigEutra config,
@@ -447,7 +447,7 @@
     ~LteUeMeasurementsPiecewiseTestCase3() override;
 
     /**
-     * \brief Triggers when eNodeB receives measurement report from UE, then
+     * @brief Triggers when eNodeB receives measurement report from UE, then
      *        perform verification on it.
      *
      * The trigger is set up beforehand by connecting to the
@@ -456,11 +456,11 @@
      * Verification consists of checking whether the report carries the right
      * value of RSRP or not, and whether it occurs at the expected time or not.
      *
-     * \param context the context
-     * \param imsi the IMSI
-     * \param cellId the cell ID
-     * \param rnti  the RNTI
-     * \param report LteRrcSap::MeasurementReport
+     * @param context the context
+     * @param imsi the IMSI
+     * @param cellId the cell ID
+     * @param rnti  the RNTI
+     * @param report LteRrcSap::MeasurementReport
      */
     void RecvMeasurementReportCallback(std::string context,
                                        uint64_t imsi,
@@ -470,7 +470,7 @@
 
   private:
     /**
-     * \brief Setup the simulation with the intended UE measurement reporting
+     * @brief Setup the simulation with the intended UE measurement reporting
      *        configuration, run it, and connect the
      *        `RecvMeasurementReportCallback` function to the
      *        `LteUeRrc::RecvMeasurementReport` trace source.
@@ -478,7 +478,7 @@
     void DoRun() override;
 
     /**
-     * \brief Runs at the end of the simulation, verifying that all expected
+     * @brief Runs at the end of the simulation, verifying that all expected
      *        measurement reports have been examined.
      */
     void DoTeardown() override;
@@ -487,24 +487,24 @@
     void TeleportEnbNear();
 
     /**
-     * \brief The active report triggering configuration.
+     * @brief The active report triggering configuration.
      */
     LteRrcSap::ReportConfigEutra m_config;
 
     /**
-     * \brief The list of expected time when measurement reports are received by
+     * @brief The list of expected time when measurement reports are received by
      *        eNodeB.
      */
     std::vector<Time> m_expectedTime;
 
     /**
-     * \brief Pointer to the element of `m_expectedTime` which is expected to
+     * @brief Pointer to the element of `m_expectedTime` which is expected to
      *        occur next in the simulation.
      */
     std::vector<Time>::iterator m_itExpectedTime;
 
     /**
-     * \brief The measurement identity being tested. Measurement reports with
+     * @brief The measurement identity being tested. Measurement reports with
      *        different measurement identity (e.g. from handover algorithm) will
      *        be ignored.
      */
@@ -517,9 +517,9 @@
 // ===== LTE-UE-MEASUREMENTS-HANDOVER TEST SUITE =========================== //
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test suite for generating calls to UE measurements test case
+ * @brief Test suite for generating calls to UE measurements test case
  *        ns3::LteUeMeasurementsHandoverTestCase.
  */
 class LteUeMeasurementsHandoverTestSuite : public TestSuite
@@ -529,9 +529,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Testing UE measurements in LTE with simulation of 2 eNodeB and 1 UE in
+ * @brief Testing UE measurements in LTE with simulation of 2 eNodeB and 1 UE in
  *        a handover configuration.
  *
  * The simulation will run for the specified duration, while the handover
@@ -551,12 +551,12 @@
     /**
      * Constructor
      *
-     * \param name the reference name
-     * \param sourceConfigList std::list<LteRrcSap::ReportConfigEutra>
-     * \param targetConfigList std::list<LteRrcSap::ReportConfigEutra>
-     * \param expectedTime the expected time
-     * \param expectedRsrp the expected RSRP
-     * \param duration the duration
+     * @param name the reference name
+     * @param sourceConfigList std::list<LteRrcSap::ReportConfigEutra>
+     * @param targetConfigList std::list<LteRrcSap::ReportConfigEutra>
+     * @param expectedTime the expected time
+     * @param expectedRsrp the expected RSRP
+     * @param duration the duration
      */
     LteUeMeasurementsHandoverTestCase(std::string name,
                                       std::list<LteRrcSap::ReportConfigEutra> sourceConfigList,
@@ -568,7 +568,7 @@
     ~LteUeMeasurementsHandoverTestCase() override;
 
     /**
-     * \brief Triggers when either one of the eNodeBs receives measurement report
+     * @brief Triggers when either one of the eNodeBs receives measurement report
      *        from UE, then perform verification on it.
      *
      * The trigger is set up beforehand by connecting to the
@@ -577,11 +577,11 @@
      * Verification consists of checking whether the report carries the right
      * value of RSRP or not, and whether it occurs at the expected time or not.
      *
-     * \param context the context
-     * \param imsi the IMSI
-     * \param cellId the cell ID
-     * \param rnti  the RNTI
-     * \param report LteRrcSap::MeasurementReport
+     * @param context the context
+     * @param imsi the IMSI
+     * @param cellId the cell ID
+     * @param rnti  the RNTI
+     * @param report LteRrcSap::MeasurementReport
      */
     void RecvMeasurementReportCallback(std::string context,
                                        uint64_t imsi,
@@ -591,7 +591,7 @@
 
   private:
     /**
-     * \brief Setup the simulation with the intended UE measurement reporting
+     * @brief Setup the simulation with the intended UE measurement reporting
      *        configuration, run it, and connect the
      *        `RecvMeasurementReportCallback` function to the
      *        `LteUeRrc::RecvMeasurementReport` trace source.
@@ -599,61 +599,61 @@
     void DoRun() override;
 
     /**
-     * \brief Runs at the end of the simulation, verifying that all expected
+     * @brief Runs at the end of the simulation, verifying that all expected
      *        measurement reports have been examined.
      */
     void DoTeardown() override;
 
     /**
-     * \brief The list of active report triggering configuration for the source
+     * @brief The list of active report triggering configuration for the source
      *        eNodeB.
      */
     std::list<LteRrcSap::ReportConfigEutra> m_sourceConfigList;
 
     /**
-     * \brief The list of active report triggering configuration for the target
+     * @brief The list of active report triggering configuration for the target
      *        eNodeB.
      */
     std::list<LteRrcSap::ReportConfigEutra> m_targetConfigList;
 
     /**
-     * \brief The list of expected time when measurement reports are received by
+     * @brief The list of expected time when measurement reports are received by
      *        eNodeB.
      */
     std::vector<Time> m_expectedTime;
 
     /**
-     * \brief The list of expected values of RSRP (in 3GPP range unit) from the
+     * @brief The list of expected values of RSRP (in 3GPP range unit) from the
      *        measurement reports received.
      */
     std::vector<uint8_t> m_expectedRsrp;
 
     /**
-     * \brief Pointer to the element of `m_expectedTime` which is expected to
+     * @brief Pointer to the element of `m_expectedTime` which is expected to
      *        occur next in the simulation.
      */
     std::vector<Time>::iterator m_itExpectedTime;
 
     /**
-     * \brief Pointer to the element of `m_expectedRsrp` which is expected to
+     * @brief Pointer to the element of `m_expectedRsrp` which is expected to
      *        occur next in the simulation.
      */
     std::vector<uint8_t>::iterator m_itExpectedRsrp;
 
     /**
-     * \brief Duration of simulation.
+     * @brief Duration of simulation.
      */
     Time m_duration;
 
     /**
-     * \brief The list of measurement identities being tested in the source cell.
+     * @brief The list of measurement identities being tested in the source cell.
      *        Measurement reports with different measurement identity (e.g. from
      *        handover algorithm and ANR) will be ignored.
      */
     std::set<uint8_t> m_expectedSourceCellMeasId;
 
     /**
-     * \brief The list of measurement identities being tested in the target cell.
+     * @brief The list of measurement identities being tested in the target cell.
      *        Measurement reports with different measurement identity (e.g. from
      *        handover algorithm and ANR) will be ignored.
      */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-ue-phy.h ns-3.44/src/lte/test/lte-test-ue-phy.h
--- ns-3.43/src/lte/test/lte-test-ue-phy.h	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-ue-phy.h	2025-03-09 16:55:49.611372000 -0700
@@ -17,9 +17,9 @@
 {
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Defines a simplified LtePhy class that is used for testing purposes
+ * @brief Defines a simplified LtePhy class that is used for testing purposes
  * of downlink and uplink SINR generation. Used in LteDownlinkDataSinrTestCase
  * and LteUplinkDataSinrTestCase as simplified LTE PHY.
  */
@@ -32,8 +32,8 @@
     LteTestUePhy();
 
     /**
-     * \param dlPhy the downlink LteSpectrumPhy instance
-     * \param ulPhy the uplink LteSpectrumPhy instance
+     * @param dlPhy the downlink LteSpectrumPhy instance
+     * @param ulPhy the uplink LteSpectrumPhy instance
      */
     LteTestUePhy(Ptr<LteSpectrumPhy> dlPhy, Ptr<LteSpectrumPhy> ulPhy);
 
@@ -41,20 +41,20 @@
 
     void DoDispose() override;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Queue the MAC PDU to be sent
-     * \param p the MAC PDU to sent
+     * @brief Queue the MAC PDU to be sent
+     * @param p the MAC PDU to sent
      */
     void DoSendMacPdu(Ptr<Packet> p) override;
 
     /**
-     * \brief Create the PSD for the TX
-     * \return the pointer to the PSD
+     * @brief Create the PSD for the TX
+     * @return the pointer to the PSD
      */
     Ptr<SpectrumValue> CreateTxPowerSpectralDensity() override;
 
@@ -67,14 +67,14 @@
     void ReportRsReceivedPower(const SpectrumValue& power) override;
 
     /**
-     * \brief Reeive LTE Control Message
-     * \param msg the control message
+     * @brief Reeive LTE Control Message
+     * @param msg the control message
      */
     virtual void ReceiveLteControlMessage(Ptr<LteControlMessage> msg);
 
     /**
-     * \brief Get the SINR
-     * \return the SINR
+     * @brief Get the SINR
+     * @return the SINR
      */
     SpectrumValue GetSinr();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-uplink-power-control.cc ns-3.44/src/lte/test/lte-test-uplink-power-control.cc
--- ns-3.43/src/lte/test/lte-test-uplink-power-control.cc	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-uplink-power-control.cc	2025-03-09 16:55:49.611372000 -0700
@@ -11,27 +11,27 @@
 
 #include "lte-ffr-simple.h"
 
+#include "ns3/boolean.h"
+#include "ns3/callback.h"
+#include "ns3/config.h"
+#include "ns3/double.h"
+#include "ns3/enum.h"
+#include "ns3/ff-mac-scheduler.h"
+#include "ns3/integer.h"
+#include "ns3/log.h"
+#include "ns3/lte-common.h"
+#include "ns3/lte-enb-net-device.h"
+#include "ns3/lte-enb-phy.h"
+#include "ns3/lte-enb-rrc.h"
 #include "ns3/lte-helper.h"
+#include "ns3/lte-rrc-sap.h"
+#include "ns3/lte-ue-net-device.h"
+#include "ns3/lte-ue-phy.h"
+#include "ns3/lte-ue-rrc.h"
 #include "ns3/mobility-helper.h"
-#include <ns3/boolean.h>
-#include <ns3/callback.h>
-#include <ns3/config.h>
-#include <ns3/double.h>
-#include <ns3/enum.h>
-#include <ns3/ff-mac-scheduler.h>
-#include <ns3/integer.h>
-#include <ns3/log.h>
-#include <ns3/lte-common.h>
-#include <ns3/lte-enb-net-device.h>
-#include <ns3/lte-enb-phy.h>
-#include <ns3/lte-enb-rrc.h>
-#include <ns3/lte-rrc-sap.h>
-#include <ns3/lte-ue-net-device.h>
-#include <ns3/lte-ue-phy.h>
-#include <ns3/lte-ue-rrc.h>
-#include <ns3/pointer.h>
-#include <ns3/simulator.h>
-#include <ns3/string.h>
+#include "ns3/pointer.h"
+#include "ns3/simulator.h"
+#include "ns3/string.h"
 
 using namespace ns3;
 
@@ -59,7 +59,7 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LteUplinkPowerControlTestSuite lteUplinkPowerControlTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-uplink-power-control.h ns-3.44/src/lte/test/lte-test-uplink-power-control.h
--- ns-3.43/src/lte/test/lte-test-uplink-power-control.h	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-uplink-power-control.h	2025-03-09 16:55:49.611372000 -0700
@@ -26,9 +26,9 @@
 } // namespace ns3
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test 1.1 Uplink Power Control
+ * @brief Test 1.1 Uplink Power Control
  */
 class LteUplinkPowerControlTestSuite : public TestSuite
 {
@@ -37,9 +37,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Lte Uplink Power Control Test Case
+ * @brief Lte Uplink Power Control Test Case
  */
 class LteUplinkPowerControlTestCase : public TestCase
 {
@@ -47,7 +47,7 @@
     /**
      * Constructor
      *
-     * \param name the reference name
+     * @param name the reference name
      */
     LteUplinkPowerControlTestCase(std::string name);
     ~LteUplinkPowerControlTestCase() override;
@@ -55,11 +55,11 @@
     /**
      * Teleport UE funcction
      *
-     * \param x the X position
-     * \param y the Y position
-     * \param expectedPuschTxPower the expected PUSCH transmit power
-     * \param expectedPucchTxPower the expected PUCCH transmit power
-     * \param expectedSrsTxPower the expected SRS transmit power
+     * @param x the X position
+     * @param y the Y position
+     * @param expectedPuschTxPower the expected PUSCH transmit power
+     * @param expectedPucchTxPower the expected PUCCH transmit power
+     * @param expectedSrsTxPower the expected SRS transmit power
      */
     void TeleportUe(uint32_t x,
                     uint32_t y,
@@ -70,11 +70,11 @@
     /**
      * Set TPC configuration funcction
      *
-     * \param tpc the TPC
-     * \param tpcNum the TPC number
-     * \param expectedPuschTxPower the expected PUSCH transmit power
-     * \param expectedPucchTxPower the expected PUCCH transmit power
-     * \param expectedSrsTxPower the expected SRS transmit power
+     * @param tpc the TPC
+     * @param tpcNum the TPC number
+     * @param expectedPuschTxPower the expected PUSCH transmit power
+     * @param expectedPucchTxPower the expected PUCCH transmit power
+     * @param expectedSrsTxPower the expected SRS transmit power
      */
     void SetTpcConfiguration(uint32_t tpc,
                              uint32_t tpcNum,
@@ -85,25 +85,25 @@
     /**
      * PUSCH transmit power trace funcction
      *
-     * \param cellId the cell ID
-     * \param rnti the RNTI
-     * \param txPower the transmit power
+     * @param cellId the cell ID
+     * @param rnti the RNTI
+     * @param txPower the transmit power
      */
     void PuschTxPowerTrace(uint16_t cellId, uint16_t rnti, double txPower);
     /**
      * PUCCH transmit power trace funcction
      *
-     * \param cellId the cell ID
-     * \param rnti the RNTI
-     * \param txPower the transmit power
+     * @param cellId the cell ID
+     * @param rnti the RNTI
+     * @param txPower the transmit power
      */
     void PucchTxPowerTrace(uint16_t cellId, uint16_t rnti, double txPower);
     /**
      * SRS transmit power trace funcction
      *
-     * \param cellId the cell ID
-     * \param rnti the RNTI
-     * \param txPower the transmit power
+     * @param cellId the cell ID
+     * @param rnti the RNTI
+     * @param txPower the transmit power
      */
     void SrsTxPowerTrace(uint16_t cellId, uint16_t rnti, double txPower);
 
@@ -124,9 +124,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Lte Uplink Open Loop Power Control Test Case
+ * @brief Lte Uplink Open Loop Power Control Test Case
  */
 class LteUplinkOpenLoopPowerControlTestCase : public LteUplinkPowerControlTestCase
 {
@@ -134,7 +134,7 @@
     /**
      * Constructor
      *
-     * \param name the reference name
+     * @param name the reference name
      */
     LteUplinkOpenLoopPowerControlTestCase(std::string name);
     ~LteUplinkOpenLoopPowerControlTestCase() override;
@@ -144,9 +144,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Lte Uplink Closed Loop Power Control Absolute Mode Test Case
+ * @brief Lte Uplink Closed Loop Power Control Absolute Mode Test Case
  */
 class LteUplinkClosedLoopPowerControlAbsoluteModeTestCase : public LteUplinkPowerControlTestCase
 {
@@ -154,7 +154,7 @@
     /**
      * Constructor
      *
-     * \param name the reference name
+     * @param name the reference name
      */
     LteUplinkClosedLoopPowerControlAbsoluteModeTestCase(std::string name);
     ~LteUplinkClosedLoopPowerControlAbsoluteModeTestCase() override;
@@ -164,9 +164,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Lte Uplink Closed Loop Power Control Accumulated Mode Test Case
+ * @brief Lte Uplink Closed Loop Power Control Accumulated Mode Test Case
  */
 class LteUplinkClosedLoopPowerControlAccumulatedModeTestCase : public LteUplinkPowerControlTestCase
 {
@@ -174,7 +174,7 @@
     /**
      * Constructor
      *
-     * \param name the reference name
+     * @param name the reference name
      */
     LteUplinkClosedLoopPowerControlAccumulatedModeTestCase(std::string name);
     ~LteUplinkClosedLoopPowerControlAccumulatedModeTestCase() override;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-uplink-sinr.cc ns-3.44/src/lte/test/lte-test-uplink-sinr.cc
--- ns-3.43/src/lte/test/lte-test-uplink-sinr.cc	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-uplink-sinr.cc	2025-03-09 16:55:49.611372000 -0700
@@ -13,12 +13,12 @@
 #include "lte-test-ue-phy.h"
 
 #include "ns3/log.h"
+#include "ns3/lte-chunk-processor.h"
+#include "ns3/lte-helper.h"
 #include "ns3/lte-phy-tag.h"
 #include "ns3/lte-spectrum-signal-parameters.h"
 #include "ns3/simulator.h"
 #include "ns3/spectrum-test.h"
-#include <ns3/lte-chunk-processor.h>
-#include <ns3/lte-helper.h>
 
 using namespace ns3;
 
@@ -112,7 +112,7 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LteUplinkSinrTestSuite lteUplinkSinrTestSuite;
@@ -298,7 +298,7 @@
     ip4->cellId = pbCellId[5];
     Simulator::Schedule(ti4, &LteSpectrumPhy::StartRx, ulPhy, ip4);
 
-    Simulator::Stop(Seconds(5.0));
+    Simulator::Stop(Seconds(5));
     Simulator::Run();
 
     NS_LOG_INFO("Data Frame - Theoretical SINR: " << *m_expectedSinr);
@@ -474,7 +474,7 @@
     ip4->cellId = pbCellId[5];
     Simulator::Schedule(ti4, &LteSpectrumPhy::StartRx, ulPhy, ip4);
 
-    Simulator::Stop(Seconds(5.0));
+    Simulator::Stop(Seconds(5));
     Simulator::Run();
 
     NS_ASSERT_MSG(m_actualSinr, "no actual SINR reported");
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/lte-test-uplink-sinr.h ns-3.44/src/lte/test/lte-test-uplink-sinr.h
--- ns-3.43/src/lte/test/lte-test-uplink-sinr.h	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/lte-test-uplink-sinr.h	2025-03-09 16:55:49.611372000 -0700
@@ -17,9 +17,9 @@
 using namespace ns3;
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test 1.2 SINR calculation in uplink
+ * @brief Test 1.2 SINR calculation in uplink
  */
 class LteUplinkSinrTestSuite : public TestSuite
 {
@@ -28,9 +28,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test generation of SINR in the uplink. Test schedules the signal and the interference
+ * @brief Test generation of SINR in the uplink. Test schedules the signal and the interference
  * signals and it evaluates if the obtained value for SINR corresponds to the theoretical value
  * in given conditions.
  */
@@ -40,10 +40,10 @@
     /**
      * Constructor
      *
-     * \param sv1 spectrum value 1
-     * \param sv2 spectrum value 2
-     * \param sinr the SINR
-     * \param name the reference name
+     * @param sv1 spectrum value 1
+     * @param sv2 spectrum value 2
+     * @param sinr the SINR
+     * @param name the reference name
      */
     LteUplinkDataSinrTestCase(Ptr<SpectrumValue> sv1,
                               Ptr<SpectrumValue> sv2,
@@ -61,9 +61,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief  In this test one signal will be of interest, i.e., the
+ * @brief  In this test one signal will be of interest, i.e., the
  *  SRS of the first signal will have the same CellId of the
  *  receiving PHY; the others will have a different
  *  CellId and hence will be the interfering signals. The test
@@ -76,10 +76,10 @@
     /**
      * Constructor
      *
-     * \param sv1 spectrum value 1
-     * \param sv2 spectrum value 2
-     * \param sinr the SINR
-     * \param name the reference name
+     * @param sv1 spectrum value 1
+     * @param sv2 spectrum value 2
+     * @param sinr the SINR
+     * @param name the reference name
      */
     LteUplinkSrsSinrTestCase(Ptr<SpectrumValue> sv1,
                              Ptr<SpectrumValue> sv2,
@@ -90,7 +90,7 @@
     /**
      * Callback to be connected to an LteChunkProcessor to collect the reported SINR
      *
-     * \param sinr
+     * @param sinr
      */
     void ReportSinr(const SpectrumValue& sinr);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/test-asn1-encoding.cc ns-3.44/src/lte/test/test-asn1-encoding.cc
--- ns-3.43/src/lte/test/test-asn1-encoding.cc	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/test-asn1-encoding.cc	2025-03-09 16:55:49.611372000 -0700
@@ -25,17 +25,17 @@
 NS_LOG_COMPONENT_DEFINE("Asn1EncodingTest");
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Contains ASN encoding test utility functions.
+ * @brief Contains ASN encoding test utility functions.
  */
 class TestUtils
 {
   public:
     /**
      * Function to convert packet contents in hex format
-     * \param pkt the packet
-     * \returns the text string
+     * @param pkt the packet
+     * @returns the text string
      */
     static std::string sprintPacketContentsHex(Ptr<Packet> pkt)
     {
@@ -51,8 +51,8 @@
 
     /**
      * Function to convert packet contents in binary format
-     * \param pkt the packet
-     * \returns the text string
+     * @param pkt the packet
+     * @returns the text string
      */
     static std::string sprintPacketContentsBin(Ptr<Packet> pkt)
     {
@@ -68,7 +68,7 @@
 
     /**
      * Function to log packet contents
-     * \param pkt the packet
+     * @param pkt the packet
      */
     static void LogPacketContents(Ptr<Packet> pkt)
     {
@@ -79,8 +79,8 @@
 
     /**
      * Function to log packet info
-     * \param source T
-     * \param s the string
+     * @param source T
+     * @param s the string
      */
     template <class T>
     static void LogPacketInfo(T source, std::string s)
@@ -94,9 +94,9 @@
 
 // --------------------------- CLASS RrcHeaderTestCase -----------------------------
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief This class provides common functions to be inherited
+ * @brief This class provides common functions to be inherited
  * by the children TestCases
  */
 class RrcHeaderTestCase : public TestCase
@@ -104,19 +104,19 @@
   public:
     /**
      * Constructor
-     * \param s the reference name
+     * @param s the reference name
      */
     RrcHeaderTestCase(std::string s);
     void DoRun() override = 0;
     /**
-     * \brief Create radio resource config dedicated
-     * \returns LteRrcSap::RadioResourceConfigDedicated
+     * @brief Create radio resource config dedicated
+     * @returns LteRrcSap::RadioResourceConfigDedicated
      */
     LteRrcSap::RadioResourceConfigDedicated CreateRadioResourceConfigDedicated();
     /**
-     * \brief Assert equal radio resource config dedicated
-     * \param rrcd1 LteRrcSap::RadioResourceConfigDedicated # 1
-     * \param rrcd2 LteRrcSap::RadioResourceConfigDedicated # 2
+     * @brief Assert equal radio resource config dedicated
+     * @param rrcd1 LteRrcSap::RadioResourceConfigDedicated # 1
+     * @param rrcd2 LteRrcSap::RadioResourceConfigDedicated # 2
      */
     void AssertEqualRadioResourceConfigDedicated(LteRrcSap::RadioResourceConfigDedicated rrcd1,
                                                  LteRrcSap::RadioResourceConfigDedicated rrcd2);
@@ -311,9 +311,9 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Rrc Connection Request Test Case
+ * @brief Rrc Connection Request Test Case
  */
 class RrcConnectionRequestTestCase : public RrcHeaderTestCase
 {
@@ -363,9 +363,9 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Rrc Connection Setup Test Case
+ * @brief Rrc Connection Setup Test Case
  */
 class RrcConnectionSetupTestCase : public RrcHeaderTestCase
 {
@@ -420,9 +420,9 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Rrc Connection Setup Complete Test Case
+ * @brief Rrc Connection Setup Complete Test Case
  */
 class RrcConnectionSetupCompleteTestCase : public RrcHeaderTestCase
 {
@@ -473,9 +473,9 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Rrc Connection Reconfiguration Complete Test Case
+ * @brief Rrc Connection Reconfiguration Complete Test Case
  */
 class RrcConnectionReconfigurationCompleteTestCase : public RrcHeaderTestCase
 {
@@ -527,9 +527,9 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Rrc Connection Reconfiguration Test Case
+ * @brief Rrc Connection Reconfiguration Test Case
  */
 class RrcConnectionReconfigurationTestCase : public RrcHeaderTestCase
 {
@@ -765,9 +765,9 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Handover Preparation Info Test Case
+ * @brief Handover Preparation Info Test Case
  */
 class HandoverPreparationInfoTestCase : public RrcHeaderTestCase
 {
@@ -874,9 +874,9 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Rrc Connection Reestablishment Request Test Case
+ * @brief Rrc Connection Reestablishment Request Test Case
  */
 class RrcConnectionReestablishmentRequestTestCase : public RrcHeaderTestCase
 {
@@ -933,9 +933,9 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Rrc Connection Reestablishment Test Case
+ * @brief Rrc Connection Reestablishment Test Case
  */
 class RrcConnectionReestablishmentTestCase : public RrcHeaderTestCase
 {
@@ -989,9 +989,9 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Rrc Connection Reestablishment Complete Test Case
+ * @brief Rrc Connection Reestablishment Complete Test Case
  */
 class RrcConnectionReestablishmentCompleteTestCase : public RrcHeaderTestCase
 {
@@ -1043,9 +1043,9 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Rrc Connection Reject Test Case
+ * @brief Rrc Connection Reject Test Case
  */
 class RrcConnectionRejectTestCase : public RrcHeaderTestCase
 {
@@ -1096,9 +1096,9 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Measurement Report Test Case
+ * @brief Measurement Report Test Case
  */
 class MeasurementReportTestCase : public RrcHeaderTestCase
 {
@@ -1233,9 +1233,9 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Asn1Encoding Test Suite
+ * @brief Asn1Encoding Test Suite
  */
 class Asn1EncodingSuite : public TestSuite
 {
@@ -1261,7 +1261,7 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 Asn1EncodingSuite g_asn1EncodingSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/test-epc-tft-classifier.cc ns-3.44/src/lte/test/test-epc-tft-classifier.cc
--- ns-3.43/src/lte/test/test-epc-tft-classifier.cc	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/test-epc-tft-classifier.cc	2025-03-09 16:55:49.611372000 -0700
@@ -28,9 +28,9 @@
 NS_LOG_COMPONENT_DEFINE("TestEpcTftClassifier");
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test case to check the functionality of the Tft Classifier. Test
+ * @brief Test case to check the functionality of the Tft Classifier. Test
  * consist of defining different TFT configurations, i.e. direction, ports,
  * address, and it is checking if the clasiffication of UDP packets is
  * done correctly.
@@ -41,15 +41,15 @@
     /**
      * Constructor
      *
-     * \param c the EPC TFT classifier
-     * \param d the EPC TFT direction
-     * \param sa the source address (in IPv4 format)
-     * \param da the destination address (in IPv4 format)
-     * \param sp the source port
-     * \param dp the destination port
-     * \param tos the TOS
-     * \param tftId the TFT ID
-     * \param useIpv6 use IPv6 or IPv4 addresses. If set, addresses will be used as IPv4 mapped
+     * @param c the EPC TFT classifier
+     * @param d the EPC TFT direction
+     * @param sa the source address (in IPv4 format)
+     * @param da the destination address (in IPv4 format)
+     * @param sp the source port
+     * @param dp the destination port
+     * @param tos the TOS
+     * @param tftId the TFT ID
+     * @param useIpv6 use IPv6 or IPv4 addresses. If set, addresses will be used as IPv4 mapped
      * addresses
      */
     EpcTftClassifierTestCase(Ptr<EpcTftClassifier> c,
@@ -76,17 +76,17 @@
 
     /**
      * Build name string
-     * \param c the EPC TFT classifier
-     * \param d the EPC TFT direction
-     * \param sa the source address
-     * \param da the destination address
-     * \param sp the source port
-     * \param dp the destination port
-     * \param tos the TOS
-     * \param tftId the TFT ID
-     * \param useIpv6 use IPv6 or IPv4 addresses. If set, addresses will be used as IPv4
+     * @param c the EPC TFT classifier
+     * @param d the EPC TFT direction
+     * @param sa the source address
+     * @param da the destination address
+     * @param sp the source port
+     * @param dp the destination port
+     * @param tos the TOS
+     * @param tftId the TFT ID
+     * @param useIpv6 use IPv6 or IPv4 addresses. If set, addresses will be used as IPv4
      * mapped addresses
-     * \returns the name string
+     * @returns the name string
      */
     static std::string BuildNameString(Ptr<EpcTftClassifier> c,
                                        EpcTft::Direction d,
@@ -194,9 +194,9 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Epc Tft Classifier Test Suite
+ * @brief Epc Tft Classifier Test Suite
  */
 class EpcTftClassifierTestSuite : public TestSuite
 {
@@ -205,7 +205,7 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static EpcTftClassifierTestSuite g_lteTftClassifierTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/test-lte-antenna.cc ns-3.44/src/lte/test/test-lte-antenna.cc
--- ns-3.43/src/lte/test/test-lte-antenna.cc	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/test-lte-antenna.cc	2025-03-09 16:55:49.611372000 -0700
@@ -12,6 +12,7 @@
 #include "ns3/enum.h"
 #include "ns3/ff-mac-scheduler.h"
 #include "ns3/log.h"
+#include "ns3/lte-chunk-processor.h"
 #include "ns3/lte-enb-net-device.h"
 #include "ns3/lte-enb-phy.h"
 #include "ns3/lte-global-pathloss-database.h"
@@ -22,16 +23,15 @@
 #include "ns3/simulator.h"
 #include "ns3/string.h"
 #include "ns3/test.h"
-#include <ns3/lte-chunk-processor.h>
 
 using namespace ns3;
 
 NS_LOG_COMPONENT_DEFINE("LteAntennaTest");
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Tests that the propagation model and the antenna parameters are
+ * @brief Tests that the propagation model and the antenna parameters are
  * generate the correct values. Different test cases are created by specifying different
  * antenna configurations and it is tested if for the given information the pathloss
  * value is as expected.
@@ -41,11 +41,11 @@
   public:
     /**
      * Build name string
-     * \param orientationDegrees the orientation in degrees
-     * \param beamwidthDegrees the beam width in degrees
-     * \param x position of UE
-     * \param y position of UE
-     * \returns the name string
+     * @param orientationDegrees the orientation in degrees
+     * @param beamwidthDegrees the beam width in degrees
+     * @param x position of UE
+     * @param y position of UE
+     * @returns the name string
      */
     static std::string BuildNameString(double orientationDegrees,
                                        double beamwidthDegrees,
@@ -54,11 +54,11 @@
     /**
      * Constructor
      *
-     * \param orientationDegrees the orientation in degrees
-     * \param beamwidthDegrees the beam width in degrees
-     * \param x position of UE
-     * \param y position of UE
-     * \param antennaGainDb the antenna gain in dB
+     * @param orientationDegrees the orientation in degrees
+     * @param beamwidthDegrees the beam width in degrees
+     * @param x position of UE
+     * @param y position of UE
+     * @param antennaGainDb the antenna gain in dB
      */
     LteEnbAntennaTestCase(double orientationDegrees,
                           double beamwidthDegrees,
@@ -251,9 +251,9 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Lte Enb Antenna Test Suite
+ * @brief Lte Enb Antenna Test Suite
  */
 class LteAntennaTestSuite : public TestSuite
 {
@@ -310,7 +310,7 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LteAntennaTestSuite g_lteAntennaTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/test-lte-epc-e2e-data.cc ns-3.44/src/lte/test/test-lte-epc-e2e-data.cc
--- ns-3.43/src/lte/test/test-lte-epc-e2e-data.cc	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/test-lte-epc-e2e-data.cc	2025-03-09 16:55:49.611372000 -0700
@@ -12,6 +12,8 @@
 #include "ns3/inet-socket-address.h"
 #include "ns3/internet-stack-helper.h"
 #include "ns3/ipv4-address-helper.h"
+#include "ns3/ipv4-static-routing-helper.h"
+#include "ns3/ipv4-static-routing.h"
 #include "ns3/log.h"
 #include "ns3/lte-helper.h"
 #include "ns3/mobility-helper.h"
@@ -24,15 +26,13 @@
 #include "ns3/udp-client-server-helper.h"
 #include "ns3/udp-echo-helper.h"
 #include "ns3/uinteger.h"
-#include <ns3/ipv4-static-routing-helper.h>
-#include <ns3/ipv4-static-routing.h>
 
 using namespace ns3;
 
 NS_LOG_COMPONENT_DEFINE("LteEpcE2eData");
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  */
 
 /// BearerTestData structure
@@ -41,9 +41,9 @@
     /**
      * Constructor
      *
-     * \param n the number of packets
-     * \param s the packet size
-     * \param i the inter packet interval in seconds
+     * @param n the number of packets
+     * @param s the packet size
+     * @param i the inter packet interval in seconds
      */
     BearerTestData(uint32_t n, uint32_t s, double i);
 
@@ -78,9 +78,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test that e2e packet flow is correct. Compares the data send and the
+ * @brief Test that e2e packet flow is correct. Compares the data send and the
  * data received. Test uses mostly the PDCP stats to check the performance.
  */
 
@@ -90,8 +90,8 @@
     /**
      * Constructor
      *
-     * \param name the reference name
-     * \param v the ENB test data
+     * @param name the reference name
+     * @param v the ENB test data
      */
     LteEpcE2eDataTestCase(std::string name, std::vector<EnbTestData> v);
     ~LteEpcE2eDataTestCase() override;
@@ -357,9 +357,9 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test that the S1-U interface implementation works correctly
+ * @brief Test that the S1-U interface implementation works correctly
  */
 class LteEpcE2eDataTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/test-lte-handover-delay.cc ns-3.44/src/lte/test/test-lte-handover-delay.cc
--- ns-3.43/src/lte/test/test-lte-handover-delay.cc	2024-10-09 16:41:10.048656500 -0700
+++ ns-3.44/src/lte/test/test-lte-handover-delay.cc	2025-03-09 16:55:49.611372000 -0700
@@ -7,36 +7,36 @@
  *         Alexander Krotov <krotov@iitp.ru>
  */
 
-#include <ns3/boolean.h>
-#include <ns3/callback.h>
-#include <ns3/cc-helper.h>
-#include <ns3/config.h>
-#include <ns3/data-rate.h>
-#include <ns3/internet-stack-helper.h>
-#include <ns3/ipv4-address-helper.h>
-#include <ns3/ipv4-interface-container.h>
-#include <ns3/ipv4-static-routing-helper.h>
-#include <ns3/ipv4-static-routing.h>
-#include <ns3/log.h>
-#include <ns3/lte-helper.h>
-#include <ns3/mobility-helper.h>
-#include <ns3/net-device-container.h>
-#include <ns3/node-container.h>
-#include <ns3/nstime.h>
-#include <ns3/point-to-point-epc-helper.h>
-#include <ns3/point-to-point-helper.h>
-#include <ns3/position-allocator.h>
-#include <ns3/simulator.h>
-#include <ns3/test.h>
+#include "ns3/boolean.h"
+#include "ns3/callback.h"
+#include "ns3/cc-helper.h"
+#include "ns3/config.h"
+#include "ns3/data-rate.h"
+#include "ns3/internet-stack-helper.h"
+#include "ns3/ipv4-address-helper.h"
+#include "ns3/ipv4-interface-container.h"
+#include "ns3/ipv4-static-routing-helper.h"
+#include "ns3/ipv4-static-routing.h"
+#include "ns3/log.h"
+#include "ns3/lte-helper.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/net-device-container.h"
+#include "ns3/node-container.h"
+#include "ns3/nstime.h"
+#include "ns3/point-to-point-epc-helper.h"
+#include "ns3/point-to-point-helper.h"
+#include "ns3/position-allocator.h"
+#include "ns3/simulator.h"
+#include "ns3/test.h"
 
 using namespace ns3;
 
 NS_LOG_COMPONENT_DEFINE("LteHandoverDelayTest");
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Verifying that the time needed for handover is under a
+ * @brief Verifying that the time needed for handover is under a
  * specified threshold.
  */
 
@@ -46,11 +46,11 @@
     /**
      * Constructor
      *
-     * \param numberOfComponentCarriers number of component carriers
-     * \param useIdealRrc if true, use the ideal RRC
-     * \param handoverTime the time of handover
-     * \param delayThreshold the delay threshold
-     * \param simulationDuration duration of the simulation
+     * @param numberOfComponentCarriers number of component carriers
+     * @param useIdealRrc if true, use the ideal RRC
+     * @param handoverTime the time of handover
+     * @param delayThreshold the delay threshold
+     * @param simulationDuration duration of the simulation
      */
     LteHandoverDelayTestCase(uint8_t numberOfComponentCarriers,
                              bool useIdealRrc,
@@ -63,8 +63,8 @@
           m_handoverTime(handoverTime),
           m_delayThreshold(delayThreshold),
           m_simulationDuration(simulationDuration),
-          m_ueHandoverStart(Seconds(0)),
-          m_enbHandoverStart(Seconds(0))
+          m_ueHandoverStart(),
+          m_enbHandoverStart()
     {
     }
 
@@ -73,11 +73,11 @@
 
     /**
      * UE handover start callback function
-     * \param context the context string
-     * \param imsi the IMSI
-     * \param cellid the cell ID
-     * \param rnti the RNTI
-     * \param targetCellId the target cell ID
+     * @param context the context string
+     * @param imsi the IMSI
+     * @param cellid the cell ID
+     * @param rnti the RNTI
+     * @param targetCellId the target cell ID
      */
     void UeHandoverStartCallback(std::string context,
                                  uint64_t imsi,
@@ -86,10 +86,10 @@
                                  uint16_t targetCellId);
     /**
      * UE handover end OK callback function
-     * \param context the context string
-     * \param imsi the IMSI
-     * \param cellid the cell ID
-     * \param rnti the RNTI
+     * @param context the context string
+     * @param imsi the IMSI
+     * @param cellid the cell ID
+     * @param rnti the RNTI
      */
     void UeHandoverEndOkCallback(std::string context,
                                  uint64_t imsi,
@@ -97,11 +97,11 @@
                                  uint16_t rnti);
     /**
      * ENB handover start callback function
-     * \param context the context string
-     * \param imsi the IMSI
-     * \param cellid the cell ID
-     * \param rnti the RNTI
-     * \param targetCellId the target cell ID
+     * @param context the context string
+     * @param imsi the IMSI
+     * @param cellid the cell ID
+     * @param rnti the RNTI
+     * @param targetCellId the target cell ID
      */
     void EnbHandoverStartCallback(std::string context,
                                   uint64_t imsi,
@@ -110,10 +110,10 @@
                                   uint16_t targetCellId);
     /**
      * ENB handover end OK callback function
-     * \param context the context string
-     * \param imsi the IMSI
-     * \param cellid the cell ID
-     * \param rnti the RNTI
+     * @param context the context string
+     * @param imsi the IMSI
+     * @param cellid the cell ID
+     * @param rnti the RNTI
      */
     void EnbHandoverEndOkCallback(std::string context,
                                   uint64_t imsi,
@@ -234,7 +234,7 @@
                                                   uint16_t rnti)
 {
     NS_LOG_FUNCTION(this << context);
-    NS_ASSERT(m_ueHandoverStart > Seconds(0));
+    NS_ASSERT(m_ueHandoverStart.IsStrictlyPositive());
     Time delay = Simulator::Now() - m_ueHandoverStart;
 
     NS_LOG_DEBUG(this << " UE delay = " << delay.As(Time::S));
@@ -263,7 +263,7 @@
                                                    uint16_t rnti)
 {
     NS_LOG_FUNCTION(this << context);
-    NS_ASSERT(m_enbHandoverStart > Seconds(0));
+    NS_ASSERT(m_enbHandoverStart.IsStrictlyPositive());
     Time delay = Simulator::Now() - m_enbHandoverStart;
 
     NS_LOG_DEBUG(this << " eNodeB delay = " << delay.As(Time::S));
@@ -275,9 +275,9 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Lte Handover Delay Test Suite
+ * @brief Lte Handover Delay Test Suite
  */
 
 static class LteHandoverDelayTestSuite : public TestSuite
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/test-lte-handover-failure.cc ns-3.44/src/lte/test/test-lte-handover-failure.cc
--- ns-3.43/src/lte/test/test-lte-handover-failure.cc	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/lte/test/test-lte-handover-failure.cc	2025-03-09 16:55:49.611372000 -0700
@@ -7,37 +7,37 @@
  * Author: Sachin Nayak <sachinnn@uw.edu>
  */
 
-#include <ns3/boolean.h>
-#include <ns3/callback.h>
-#include <ns3/config.h>
-#include <ns3/data-rate.h>
-#include <ns3/internet-stack-helper.h>
-#include <ns3/ipv4-address-helper.h>
-#include <ns3/ipv4-interface-container.h>
-#include <ns3/ipv4-static-routing-helper.h>
-#include <ns3/ipv4-static-routing.h>
-#include <ns3/log.h>
-#include <ns3/lte-helper.h>
-#include <ns3/lte-ue-net-device.h>
-#include <ns3/mobility-helper.h>
-#include <ns3/net-device-container.h>
-#include <ns3/node-container.h>
-#include <ns3/nstime.h>
-#include <ns3/point-to-point-epc-helper.h>
-#include <ns3/point-to-point-helper.h>
-#include <ns3/position-allocator.h>
-#include <ns3/rng-seed-manager.h>
-#include <ns3/simulator.h>
-#include <ns3/test.h>
+#include "ns3/boolean.h"
+#include "ns3/callback.h"
+#include "ns3/config.h"
+#include "ns3/data-rate.h"
+#include "ns3/internet-stack-helper.h"
+#include "ns3/ipv4-address-helper.h"
+#include "ns3/ipv4-interface-container.h"
+#include "ns3/ipv4-static-routing-helper.h"
+#include "ns3/ipv4-static-routing.h"
+#include "ns3/log.h"
+#include "ns3/lte-helper.h"
+#include "ns3/lte-ue-net-device.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/net-device-container.h"
+#include "ns3/node-container.h"
+#include "ns3/nstime.h"
+#include "ns3/point-to-point-epc-helper.h"
+#include "ns3/point-to-point-helper.h"
+#include "ns3/position-allocator.h"
+#include "ns3/rng-seed-manager.h"
+#include "ns3/simulator.h"
+#include "ns3/test.h"
 
 using namespace ns3;
 
 NS_LOG_COMPONENT_DEFINE("LteHandoverFailureTest");
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Verifying that a handover failure occurs due to various causes
+ * @brief Verifying that a handover failure occurs due to various causes
  *
  * Handover failure cases dealt with in this test include the below.
  *
@@ -54,31 +54,31 @@
     /**
      * Constructor
      *
-     * \param name the name of the test case, to be displayed in the test result
-     * \param useIdealRrc if true, use the ideal RRC
-     * \param handoverTime the time of handover
-     * \param simulationDuration duration of the simulation
-     * \param numberOfRaPreambles number of random access preambles available for contention based
+     * @param name the name of the test case, to be displayed in the test result
+     * @param useIdealRrc if true, use the ideal RRC
+     * @param handoverTime the time of handover
+     * @param simulationDuration duration of the simulation
+     * @param numberOfRaPreambles number of random access preambles available for contention based
      RACH process
      *                            number of non-contention preambles available for handover = (64 -
      numberRaPreambles)
      *                            as numberOfRaPreambles out of the max 64 are reserved contention
      based RACH process
-     * \param preambleTransMax maximum number of random access preamble transmissions from UE to
+     * @param preambleTransMax maximum number of random access preamble transmissions from UE to
      eNodeB
-     * \param raResponseWindowSize window length for reception of random access response (RAR)
-     * \param handoverJoiningTimeout time before which RRC RECONFIGURATION COMPLETE must be received
+     * @param raResponseWindowSize window length for reception of random access response (RAR)
+     * @param handoverJoiningTimeout time before which RRC RECONFIGURATION COMPLETE must be received
                                      at target eNodeB after it receives a handover request
                                      Else, the UE context is destroyed in the RRC.
                                      Timeout can occur before different stages as below.
                                      i. Reception of RRC CONNECTION RECONFIGURATION at source eNodeB
                                      ii. Non-contention random access procedure from UE to target
      eNodeB iii. Reception of RRC CONNECTION RECONFIGURATION COMPLETE at target eNodeB
-     * \param handoverLeavingTimeout time before which source eNodeB must receive a UE context
+     * @param handoverLeavingTimeout time before which source eNodeB must receive a UE context
      release from target eNodeB or RRC CONNECTION RESTABLISHMENT from UE after issuing a handover
      request Else, the UE context is destroyed in the RRC. Timeout can occur before any of the cases
      in HANDOVER JOINING TIMEOUT
-     * \param targeteNodeBPosition position of the target eNodeB
+     * @param targeteNodeBPosition position of the target eNodeB
      */
     LteHandoverFailureTestCase(std::string name,
                                bool useIdealRrc,
@@ -106,24 +106,24 @@
 
   private:
     /**
-     * \brief Run a simulation of a two eNodeB network using the parameters
+     * @brief Run a simulation of a two eNodeB network using the parameters
      *        provided to the constructor function.
      */
     void DoRun() override;
 
     /**
-     * \brief Called at the end of simulation and verifies that a handover
+     * @brief Called at the end of simulation and verifies that a handover
      *        and a handover failure has occurred in the simulation.
      */
     void DoTeardown() override;
 
     /**
      * UE handover start callback function to indicate start of handover
-     * \param context the context string
-     * \param imsi the IMSI
-     * \param sourceCellId the source cell ID
-     * \param rnti the RNTI
-     * \param targetCellId the target cell ID
+     * @param context the context string
+     * @param imsi the IMSI
+     * @param sourceCellId the source cell ID
+     * @param rnti the RNTI
+     * @param targetCellId the target cell ID
      */
     void UeHandoverStartCallback(std::string context,
                                  uint64_t imsi,
@@ -133,10 +133,10 @@
 
     /**
      * Handover failure callback due to maximum RACH transmissions reached from UE to target eNodeB
-     * \param context the context string
-     * \param imsi the IMSI
-     * \param rnti the RNTI
-     * \param targetCellId the target cell ID
+     * @param context the context string
+     * @param imsi the IMSI
+     * @param rnti the RNTI
+     * @param targetCellId the target cell ID
      */
     void HandoverFailureMaxRach(std::string context,
                                 uint64_t imsi,
@@ -145,10 +145,10 @@
 
     /**
      * Handover failure callback due to non-allocation of non-contention preamble at target eNodeB
-     * \param context the context string
-     * \param imsi the IMSI
-     * \param rnti the RNTI
-     * \param targetCellId the target cell ID
+     * @param context the context string
+     * @param imsi the IMSI
+     * @param rnti the RNTI
+     * @param targetCellId the target cell ID
      */
     void HandoverFailureNoPreamble(std::string context,
                                    uint64_t imsi,
@@ -157,10 +157,10 @@
 
     /**
      * Handover failure callback due to handover joining timeout at target eNodeB
-     * \param context the context string
-     * \param imsi the IMSI
-     * \param rnti the RNTI
-     * \param targetCellId the target cell ID
+     * @param context the context string
+     * @param imsi the IMSI
+     * @param rnti the RNTI
+     * @param targetCellId the target cell ID
      */
     void HandoverFailureJoining(std::string context,
                                 uint64_t imsi,
@@ -169,10 +169,10 @@
 
     /**
      * Handover failure callback due to handover leaving timeout at source eNodeB
-     * \param context the context string
-     * \param imsi the IMSI
-     * \param rnti the RNTI
-     * \param targetCellId the target cell ID
+     * @param context the context string
+     * @param imsi the IMSI
+     * @param rnti the RNTI
+     * @param targetCellId the target cell ID
      */
     void HandoverFailureLeaving(std::string context,
                                 uint64_t imsi,
@@ -356,12 +356,12 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
  * The following log components can be used to debug this test's behavior:
  * LteHandoverFailureTest:LteEnbRrc:LteEnbMac:LteUeRrc:EpcX2
  *
- * \brief Lte Handover Failure Test Suite
+ * @brief Lte Handover Failure Test Suite
  */
 static class LteHandoverFailureTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/test-lte-handover-target.cc ns-3.44/src/lte/test/test-lte-handover-target.cc
--- ns-3.43/src/lte/test/test-lte-handover-target.cc	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/lte/test/test-lte-handover-target.cc	2025-03-09 16:55:49.611372000 -0700
@@ -7,39 +7,39 @@
  *
  */
 
-#include <ns3/boolean.h>
-#include <ns3/callback.h>
-#include <ns3/config.h>
-#include <ns3/data-rate.h>
-#include <ns3/double.h>
-#include <ns3/internet-stack-helper.h>
-#include <ns3/ipv4-address-helper.h>
-#include <ns3/ipv4-interface-container.h>
-#include <ns3/ipv4-static-routing-helper.h>
-#include <ns3/ipv4-static-routing.h>
-#include <ns3/log.h>
-#include <ns3/lte-enb-net-device.h>
-#include <ns3/lte-enb-phy.h>
-#include <ns3/lte-helper.h>
-#include <ns3/mobility-helper.h>
-#include <ns3/net-device-container.h>
-#include <ns3/node-container.h>
-#include <ns3/nstime.h>
-#include <ns3/point-to-point-epc-helper.h>
-#include <ns3/point-to-point-helper.h>
-#include <ns3/position-allocator.h>
-#include <ns3/simulator.h>
-#include <ns3/test.h>
-#include <ns3/uinteger.h>
+#include "ns3/boolean.h"
+#include "ns3/callback.h"
+#include "ns3/config.h"
+#include "ns3/data-rate.h"
+#include "ns3/double.h"
+#include "ns3/internet-stack-helper.h"
+#include "ns3/ipv4-address-helper.h"
+#include "ns3/ipv4-interface-container.h"
+#include "ns3/ipv4-static-routing-helper.h"
+#include "ns3/ipv4-static-routing.h"
+#include "ns3/log.h"
+#include "ns3/lte-enb-net-device.h"
+#include "ns3/lte-enb-phy.h"
+#include "ns3/lte-helper.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/net-device-container.h"
+#include "ns3/node-container.h"
+#include "ns3/nstime.h"
+#include "ns3/point-to-point-epc-helper.h"
+#include "ns3/point-to-point-helper.h"
+#include "ns3/position-allocator.h"
+#include "ns3/simulator.h"
+#include "ns3/test.h"
+#include "ns3/uinteger.h"
 
 using namespace ns3;
 
 NS_LOG_COMPONENT_DEFINE("LteHandoverTargetTest");
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Testing a handover algorithm, verifying that it selects the right
+ * @brief Testing a handover algorithm, verifying that it selects the right
  *        target cell when more than one options available.
  *
  * Part of the `lte-handover-target` test suite.
@@ -53,21 +53,21 @@
 {
   public:
     /**
-     * \brief Construct a new test case and providing input parameters for the
+     * @brief Construct a new test case and providing input parameters for the
      *        simulation.
-     * \param name the name of the test case, to be displayed in the test result
-     * \param uePosition the point in (x, y, z) coordinate where the UE will be
+     * @param name the name of the test case, to be displayed in the test result
+     * @param uePosition the point in (x, y, z) coordinate where the UE will be
      *                   placed in the simulation
-     * \param gridSizeX number of eNodeBs in a row
-     * \param gridSizeY number of eNodeBs in a column
-     * \param sourceCellId the cell ID of the eNodeB which the UE will be
+     * @param gridSizeX number of eNodeBs in a row
+     * @param gridSizeY number of eNodeBs in a column
+     * @param sourceCellId the cell ID of the eNodeB which the UE will be
      *                     initially attached to in the beginning of simulation,
      *                     and also the eNodeB which will "shutdown" in the
      *                     middle of simulation
-     * \param targetCellId the cell ID of the expected eNodeB where the UE will
+     * @param targetCellId the cell ID of the expected eNodeB where the UE will
      *                     perform handover to after the "shutdown" of the source
      *                     cell
-     * \param handoverAlgorithmType the type of handover algorithm to be used in
+     * @param handoverAlgorithmType the type of handover algorithm to be used in
      *                              all eNodeBs
      */
     LteHandoverTargetTestCase(std::string name,
@@ -81,17 +81,17 @@
     ~LteHandoverTargetTestCase() override;
 
     /**
-     * \brief Triggers when an eNodeB starts a handover and then verifies that
+     * @brief Triggers when an eNodeB starts a handover and then verifies that
      *        the handover has the right source and target cells.
      *
      * The trigger is set up beforehand by connecting to the
      * `LteEnbRrc::HandoverStart` trace source.
      *
-     * \param context the context string
-     * \param imsi the IMSI
-     * \param sourceCellId the source cell ID
-     * \param rnti the RNTI
-     * \param targetCellId the target cell ID
+     * @param context the context string
+     * @param imsi the IMSI
+     * @param sourceCellId the source cell ID
+     * @param rnti the RNTI
+     * @param targetCellId the target cell ID
      */
     void HandoverStartCallback(std::string context,
                                uint64_t imsi,
@@ -100,20 +100,20 @@
                                uint16_t targetCellId);
 
     /**
-     * \brief A trigger that can be scheduled to "shutdown" the cell pointed by
+     * @brief A trigger that can be scheduled to "shutdown" the cell pointed by
      *        `m_sourceCellId` by reducing its power to 1 dB.
      */
     void CellShutdownCallback();
 
   private:
     /**
-     * \brief Run a simulation of a micro-cell network using the parameters
+     * @brief Run a simulation of a micro-cell network using the parameters
      *        provided to the constructor function.
      */
     void DoRun() override;
 
     /**
-     * \brief Called at the end of simulation and verifies that a handover has
+     * @brief Called at the end of simulation and verifies that a handover has
      *        occurred in the simulation.
      */
     void DoTeardown() override;
@@ -366,7 +366,7 @@
 }
 
 /**
- * \brief Test suite ``lte-handover-target``, verifying that handover
+ * @brief Test suite ``lte-handover-target``, verifying that handover
  *        algorithms are able to select the right target cell.
  *
  * Handover algorithm tested in this test suite:
@@ -438,7 +438,7 @@
 } // end of LteHandoverTargetTestSuite ()
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LteHandoverTargetTestSuite g_lteHandoverTargetTestSuiteInstance;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/test-lte-rlc-header.cc ns-3.44/src/lte/test/test-lte-rlc-header.cc
--- ns-3.43/src/lte/test/test-lte-rlc-header.cc	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/lte/test/test-lte-rlc-header.cc	2025-03-09 16:55:49.611372000 -0700
@@ -24,17 +24,17 @@
 {
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test Utils
+ * @brief Test Utils
  */
 class TestUtils
 {
   public:
     /**
      * Function to convert packet contents in hex format
-     * \param pkt the packet
-     * \returns a text string
+     * @param pkt the packet
+     * @returns a text string
      */
     static std::string sprintPacketContentsHex(Ptr<Packet> pkt)
     {
@@ -50,8 +50,8 @@
 
     /**
      * Function to convert packet contents in binary format
-     * \param pkt the packet
-     * \returns a text string
+     * @param pkt the packet
+     * @returns a text string
      */
     static std::string sprintPacketContentsBin(Ptr<Packet> pkt)
     {
@@ -67,7 +67,7 @@
 
     /**
      * Function to log packet contents
-     * \param pkt the packet
+     * @param pkt the packet
      */
     static void LogPacketContents(Ptr<Packet> pkt)
     {
@@ -78,8 +78,8 @@
 
     /**
      * Log packet info function
-     * \param source T
-     * \param s text string to log
+     * @param source T
+     * @param s text string to log
      */
     template <class T>
     static void LogPacketInfo(T source, std::string s)
@@ -92,9 +92,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Rlc Am Status Pdu Test Case
+ * @brief Rlc Am Status Pdu Test Case
  */
 class RlcAmStatusPduTestCase : public TestCase
 {
@@ -102,9 +102,9 @@
     /**
      * Constructor
      *
-     * \param ackSn the sequence number
-     * \param nackSnList list of nack sequence numbers
-     * \param hex string
+     * @param ackSn the sequence number
+     * @param nackSnList list of nack sequence numbers
+     * @param hex string
      */
     RlcAmStatusPduTestCase(SequenceNumber10 ackSn,
                            std::list<SequenceNumber10> nackSnList,
@@ -170,9 +170,9 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Lte Rlc Header Test Suite
+ * @brief Lte Rlc Header Test Suite
  */
 class LteRlcHeaderTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/test-lte-rrc.cc ns-3.44/src/lte/test/test-lte-rrc.cc
--- ns-3.43/src/lte/test/test-lte-rrc.cc	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/lte/test/test-lte-rrc.cc	2025-03-09 16:55:49.611372000 -0700
@@ -7,10 +7,10 @@
  *         Budiarto Herman <budiarto.herman@magister.fi>
  */
 
-#include <ns3/core-module.h>
-#include <ns3/lte-module.h>
-#include <ns3/mobility-module.h>
-#include <ns3/network-module.h>
+#include "ns3/core-module.h"
+#include "ns3/lte-module.h"
+#include "ns3/mobility-module.h"
+#include "ns3/network-module.h"
 
 #include <cmath>
 
@@ -19,9 +19,9 @@
 NS_LOG_COMPONENT_DEFINE("LteRrcTest");
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test rrc connection establishment.
+ * @brief Test rrc connection establishment.
  */
 class LteRrcConnectionEstablishmentTestCase : public TestCase
 {
@@ -29,17 +29,17 @@
     /**
      *
      *
-     * \param nUes number of UEs in the test
-     * \param nBearers number of bearers to be setup in each connection
-     * \param tConnBase connection time base value for all UEs in ms
-     * \param tConnIncrPerUe additional connection time increment for each UE index (0...nUes-1) in
+     * @param nUes number of UEs in the test
+     * @param nBearers number of bearers to be setup in each connection
+     * @param tConnBase connection time base value for all UEs in ms
+     * @param tConnIncrPerUe additional connection time increment for each UE index (0...nUes-1) in
      * ms
-     * \param delayDiscStart expected duration to perform connection establishment in ms
-     * \param errorExpected if true, test case will wait a bit longer to accommodate for
+     * @param delayDiscStart expected duration to perform connection establishment in ms
+     * @param errorExpected if true, test case will wait a bit longer to accommodate for
      * transmission error
-     * \param useIdealRrc If set to false, real RRC protocol model will be used
-     * \param admitRrcConnectionRequest If set to false, eNb will not allow UE connections
-     * \param description additional description of the test case
+     * @param useIdealRrc If set to false, real RRC protocol model will be used
+     * @param admitRrcConnectionRequest If set to false, eNb will not allow UE connections
+     * @param description additional description of the test case
      */
     LteRrcConnectionEstablishmentTestCase(uint32_t nUes,
                                           uint32_t nBearers,
@@ -58,16 +58,16 @@
     /**
      * Build name string function
      *
-     * \param nUes number of UEs in the test
-     * \param nBearers number of bearers to be setup in each connection
-     * \param tConnBase connection time base value for all UEs in ms
-     * \param tConnIncrPerUe additional connection time increment for each UE index (0...nUes-1)
+     * @param nUes number of UEs in the test
+     * @param nBearers number of bearers to be setup in each connection
+     * @param tConnBase connection time base value for all UEs in ms
+     * @param tConnIncrPerUe additional connection time increment for each UE index (0...nUes-1)
      * in ms
-     * \param delayDiscStart expected duration to perform connection establishment in ms
-     * \param useIdealRrc If set to false, real RRC protocol model will be used
-     * \param admitRrcConnectionRequest If set to false, eNb will not allow UE connections
-     * \param description additional description of the test case
-     * \returns the name string
+     * @param delayDiscStart expected duration to perform connection establishment in ms
+     * @param useIdealRrc If set to false, real RRC protocol model will be used
+     * @param admitRrcConnectionRequest If set to false, eNb will not allow UE connections
+     * @param description additional description of the test case
+     * @returns the name string
      */
     static std::string BuildNameString(uint32_t nUes,
                                        uint32_t nBearers,
@@ -79,28 +79,28 @@
                                        std::string description = "");
     /**
      * Connect function
-     * \param ueDevice the UE device
-     * \param enbDevice the ENB device
+     * @param ueDevice the UE device
+     * @param enbDevice the ENB device
      */
     void Connect(Ptr<NetDevice> ueDevice, Ptr<NetDevice> enbDevice);
     /**
      * Check connected function
-     * \param ueDevice the UE device
-     * \param enbDevice the ENB device
+     * @param ueDevice the UE device
+     * @param enbDevice the ENB device
      */
     void CheckConnected(Ptr<NetDevice> ueDevice, Ptr<NetDevice> enbDevice);
     /**
      * Check not connected function
-     * \param ueDevice the UE device
-     * \param enbDevice the ENB device
+     * @param ueDevice the UE device
+     * @param enbDevice the ENB device
      */
     void CheckNotConnected(Ptr<NetDevice> ueDevice, Ptr<NetDevice> enbDevice);
     /**
      * Connection established callback function
-     * \param context the context string
-     * \param imsi the IMSI
-     * \param cellId the cell ID
-     * \param rnti the RNTI
+     * @param context the context string
+     * @param imsi the IMSI
+     * @param cellId the cell ID
+     * @param rnti the RNTI
      */
     void ConnectionEstablishedCallback(std::string context,
                                        uint64_t imsi,
@@ -108,11 +108,11 @@
                                        uint16_t rnti);
     /**
      * Connection timeout callback function
-     * \param context the context string
-     * \param imsi the IMSI
-     * \param cellId the cell ID
-     * \param rnti the RNTI
-     * \param connEstFailCount the T300 timer expiration counter value
+     * @param context the context string
+     * @param imsi the IMSI
+     * @param cellId the cell ID
+     * @param rnti the RNTI
+     * @param connEstFailCount the T300 timer expiration counter value
      */
     void ConnectionTimeoutCallback(std::string context,
                                    uint64_t imsi,
@@ -571,9 +571,9 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Lte Rrc Connection Establishment Error Test Case
+ * @brief Lte Rrc Connection Establishment Error Test Case
  */
 class LteRrcConnectionEstablishmentErrorTestCase : public LteRrcConnectionEstablishmentTestCase
 {
@@ -581,9 +581,9 @@
     /**
      *
      *
-     * \param jumpAwayTime the time when all the UEs 'teleport' to a pre-defined
+     * @param jumpAwayTime the time when all the UEs 'teleport' to a pre-defined
      *                     high-interference position and stay there for 100 ms
-     * \param description additional description of the test case
+     * @param description additional description of the test case
      */
     LteRrcConnectionEstablishmentErrorTestCase(Time jumpAwayTime, std::string description = "");
 
@@ -751,9 +751,9 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Lte Rrc Test Suite
+ * @brief Lte Rrc Test Suite
  */
 class LteRrcTestSuite : public TestSuite
 {
@@ -879,7 +879,7 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LteRrcTestSuite g_lteRrcTestSuiteInstance;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/test-lte-x2-handover.cc ns-3.44/src/lte/test/test-lte-x2-handover.cc
--- ns-3.43/src/lte/test/test-lte-x2-handover.cc	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/lte/test/test-lte-x2-handover.cc	2025-03-09 16:55:49.611372000 -0700
@@ -6,24 +6,24 @@
  * Author: Nicola Baldo <nbaldo@cttc.es>
  */
 
-#include <ns3/core-module.h>
-#include <ns3/internet-module.h>
-#include <ns3/lte-module.h>
-#include <ns3/mobility-module.h>
-#include <ns3/network-module.h>
-#include <ns3/packet-sink-helper.h>
-#include <ns3/packet-sink.h>
-#include <ns3/point-to-point-module.h>
-#include <ns3/udp-client-server-helper.h>
+#include "ns3/core-module.h"
+#include "ns3/internet-module.h"
+#include "ns3/lte-module.h"
+#include "ns3/mobility-module.h"
+#include "ns3/network-module.h"
+#include "ns3/packet-sink-helper.h"
+#include "ns3/packet-sink.h"
+#include "ns3/point-to-point-module.h"
+#include "ns3/udp-client-server-helper.h"
 
 using namespace ns3;
 
 NS_LOG_COMPONENT_DEFINE("LteX2HandoverTest");
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief HandoverEvent structure
+ * @brief HandoverEvent structure
  */
 struct HandoverEvent
 {
@@ -34,9 +34,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test X2 Handover. In this test is used NoOpHandoverAlgorithm and
+ * @brief Test X2 Handover. In this test is used NoOpHandoverAlgorithm and
  * the request for handover is generated manually, and it is not based on measurements.
  */
 class LteX2HandoverTestCase : public TestCase
@@ -45,13 +45,13 @@
     /**
      *
      *
-     * \param nUes number of UEs in the test
-     * \param nDedicatedBearers number of bearers to be activated per UE
-     * \param handoverEventList
-     * \param handoverEventListName
-     * \param schedulerType the scheduler type
-     * \param admitHo
-     * \param useIdealRrc true if the ideal RRC should be used
+     * @param nUes number of UEs in the test
+     * @param nDedicatedBearers number of bearers to be activated per UE
+     * @param handoverEventList
+     * @param handoverEventListName
+     * @param schedulerType the scheduler type
+     * @param admitHo
+     * @param useIdealRrc true if the ideal RRC should be used
      */
     LteX2HandoverTestCase(uint32_t nUes,
                           uint32_t nDedicatedBearers,
@@ -64,13 +64,13 @@
   private:
     /**
      * Build name string
-     * \param nUes number of UEs in the test
-     * \param nDedicatedBearers number of bearers to be activated per UE
-     * \param handoverEventListName
-     * \param schedulerType the scheduler type
-     * \param admitHo
-     * \param useIdealRrc true if the ideal RRC should be used
-     * \returns the name string
+     * @param nUes number of UEs in the test
+     * @param nDedicatedBearers number of bearers to be activated per UE
+     * @param handoverEventListName
+     * @param schedulerType the scheduler type
+     * @param admitHo
+     * @param useIdealRrc true if the ideal RRC should be used
+     * @returns the name string
      */
     static std::string BuildNameString(uint32_t nUes,
                                        uint32_t nDedicatedBearers,
@@ -81,21 +81,21 @@
     void DoRun() override;
     /**
      * Check connected function
-     * \param ueDevice the UE device
-     * \param enbDevice the ENB device
+     * @param ueDevice the UE device
+     * @param enbDevice the ENB device
      */
     void CheckConnected(Ptr<NetDevice> ueDevice, Ptr<NetDevice> enbDevice);
 
     /**
      * Teleport UE between both eNBs of the test
-     * \param ueNode the UE node
+     * @param ueNode the UE node
      */
     void TeleportUeToMiddle(Ptr<Node> ueNode);
 
     /**
      * Teleport UE near the target eNB of the handover
-     * \param ueNode the UE node
-     * \param enbNode the target eNB node
+     * @param ueNode the UE node
+     * @param enbNode the target eNB node
      */
     void TeleportUeNearTargetEnb(Ptr<Node> ueNode, Ptr<Node> enbNode);
 
@@ -111,9 +111,9 @@
     Ptr<PointToPointEpcHelper> m_epcHelper;       ///< EPC helper
 
     /**
-     * \ingroup lte-test
+     * @ingroup lte-test
      *
-     * \brief BearerData structure
+     * @brief BearerData structure
      */
     struct BearerData
     {
@@ -125,9 +125,9 @@
     };
 
     /**
-     * \ingroup lte-test
+     * @ingroup lte-test
      *
-     * \brief UeData structure
+     * @brief UeData structure
      */
     struct UeData
     {
@@ -136,13 +136,13 @@
     };
 
     /**
-     * \brief Save stats after handover function
-     * \param ueIndex the index of the UE
+     * @brief Save stats after handover function
+     * @param ueIndex the index of the UE
      */
     void SaveStatsAfterHandover(uint32_t ueIndex);
     /**
-     * \brief Check stats a while after handover function
-     * \param ueIndex the index of the UE
+     * @brief Check stats a while after handover function
+     * @param ueIndex the index of the UE
      */
     void CheckStatsAWhileAfterHandover(uint32_t ueIndex);
 
@@ -440,7 +440,7 @@
 
     // schedule handover events and corresponding checks
 
-    Time stopTime = Seconds(0);
+    Time stopTime;
     for (auto hoEventIt = m_handoverEventList.begin(); hoEventIt != m_handoverEventList.end();
          ++hoEventIt)
     {
@@ -642,9 +642,9 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief LTE X2 Handover Test Suite.
+ * @brief LTE X2 Handover Test Suite.
  *
  * In this test suite, we use NoOpHandoverAlgorithm, i.e. "handover algorithm which does nothing"
  * is used and handover is triggered manually. The automatic handover algorithms (A2A4, A3Rsrp)
@@ -1079,7 +1079,7 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LteX2HandoverTestSuite g_lteX2HandoverTestSuiteInstance;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/lte/test/test-lte-x2-handover-measures.cc ns-3.44/src/lte/test/test-lte-x2-handover-measures.cc
--- ns-3.43/src/lte/test/test-lte-x2-handover-measures.cc	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/lte/test/test-lte-x2-handover-measures.cc	2025-03-09 16:55:49.611372000 -0700
@@ -8,25 +8,25 @@
  *   Manuel Requena <manuel.requena@cttc.es>
  */
 
-#include <ns3/bulk-send-helper.h>
-#include <ns3/core-module.h>
-#include <ns3/internet-module.h>
-#include <ns3/lte-module.h>
-#include <ns3/mobility-module.h>
-#include <ns3/network-module.h>
-#include <ns3/packet-sink-helper.h>
-#include <ns3/packet-sink.h>
-#include <ns3/point-to-point-module.h>
-#include <ns3/udp-client-server-helper.h>
+#include "ns3/bulk-send-helper.h"
+#include "ns3/core-module.h"
+#include "ns3/internet-module.h"
+#include "ns3/lte-module.h"
+#include "ns3/mobility-module.h"
+#include "ns3/network-module.h"
+#include "ns3/packet-sink-helper.h"
+#include "ns3/packet-sink.h"
+#include "ns3/point-to-point-module.h"
+#include "ns3/udp-client-server-helper.h"
 
 using namespace ns3;
 
 NS_LOG_COMPONENT_DEFINE("LteX2HandoverMeasuresTest");
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief CheckPointEvent structure
+ * @brief CheckPointEvent structure
  */
 struct CheckPointEvent
 {
@@ -39,11 +39,11 @@
     /**
      *  Constructor
      *
-     * \param start the start time
-     * \param stop the stop time
-     * \param interval the interval time
-     * \param ueIndex the UE index
-     * \param enbIndex the ENB index
+     * @param start the start time
+     * @param stop the stop time
+     * @param interval the interval time
+     * @param ueIndex the UE index
+     * @param enbIndex the ENB index
      */
     CheckPointEvent(Time start, Time stop, Time interval, uint32_t ueIndex, uint32_t enbIndex)
         : checkStartTime(start),
@@ -56,9 +56,9 @@
 };
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Test different X2 handover measures and algorithms, e.g. A2A4RsrqHandoverAlgorithm and
+ * @brief Test different X2 handover measures and algorithms, e.g. A2A4RsrqHandoverAlgorithm and
  * A3RsrpHandoverAlgorithm. Test defines different handover parameters and scenario configurations.
  */
 class LteX2HandoverMeasuresTestCase : public TestCase
@@ -67,17 +67,17 @@
     /**
      * Constructor.
      *
-     * \param nEnbs number of eNBs in the test
-     * \param nUes number of UEs in the test
-     * \param nDedicatedBearers number of bearers to be activated per UE
-     * \param checkPointEventList list of check point events
-     * \param checkPointEventListName name of check point event list
-     * \param useUdp true if UDP is to be used, false if TCP is to be used
-     * \param schedulerType type of scheduler to be used (e.g. "ns3::PfFfMacScheduler")
-     * \param handoverAlgorithmType type of handover algorithm to be used (e.g.
+     * @param nEnbs number of eNBs in the test
+     * @param nUes number of UEs in the test
+     * @param nDedicatedBearers number of bearers to be activated per UE
+     * @param checkPointEventList list of check point events
+     * @param checkPointEventListName name of check point event list
+     * @param useUdp true if UDP is to be used, false if TCP is to be used
+     * @param schedulerType type of scheduler to be used (e.g. "ns3::PfFfMacScheduler")
+     * @param handoverAlgorithmType type of handover algorithm to be used (e.g.
      * "ns3::A3RsrpHandoverAlgorithm")
-     * \param admitHo true if Ho is admitted, false if it is not admitted
-     * \param useIdealRrc true if ideal RRC is to be used, false if real RRC is to be used
+     * @param admitHo true if Ho is admitted, false if it is not admitted
+     * @param useIdealRrc true if ideal RRC is to be used, false if real RRC is to be used
      */
     LteX2HandoverMeasuresTestCase(uint32_t nEnbs,
                                   uint32_t nUes,
@@ -93,17 +93,17 @@
   private:
     /**
      * Build name string
-     * \param nEnbs number of eNBs in the test
-     * \param nUes number of UEs in the test
-     * \param nDedicatedBearers number of bearers to be activated per UE
-     * \param checkPointEventListName name of check point event list
-     * \param useUdp true if UDP is to be used, false if TCP is to be used
-     * \param schedulerType the scheduler type
-     * \param handoverAlgorithmType type of handover algorithm to be used (e.g.
+     * @param nEnbs number of eNBs in the test
+     * @param nUes number of UEs in the test
+     * @param nDedicatedBearers number of bearers to be activated per UE
+     * @param checkPointEventListName name of check point event list
+     * @param useUdp true if UDP is to be used, false if TCP is to be used
+     * @param schedulerType the scheduler type
+     * @param handoverAlgorithmType type of handover algorithm to be used (e.g.
      * "ns3::A3RsrpHandoverAlgorithm")
-     * \param admitHo true if Ho is admitted, false if it is not admitted
-     * \param useIdealRrc true if the ideal RRC should be used
-     * \returns the name string
+     * @param admitHo true if Ho is admitted, false if it is not admitted
+     * @param useIdealRrc true if the ideal RRC should be used
+     * @returns the name string
      */
     static std::string BuildNameString(uint32_t nEnbs,
                                        uint32_t nUes,
@@ -117,8 +117,8 @@
     void DoRun() override;
     /**
      * Check connected function
-     * \param ueDevice the UE device
-     * \param enbDevice the ENB device
+     * @param ueDevice the UE device
+     * @param enbDevice the ENB device
      */
     void CheckConnected(Ptr<NetDevice> ueDevice, Ptr<NetDevice> enbDevice);
 
@@ -137,9 +137,9 @@
     Ptr<PointToPointEpcHelper> m_epcHelper;           ///< EPC helper
 
     /**
-     * \ingroup lte-test
+     * @ingroup lte-test
      *
-     * \brief BearerData structure
+     * @brief BearerData structure
      */
     struct BearerData
     {
@@ -151,9 +151,9 @@
     };
 
     /**
-     * \ingroup lte-test
+     * @ingroup lte-test
      *
-     * \brief UeData structure
+     * @brief UeData structure
      */
     struct UeData
     {
@@ -162,13 +162,13 @@
     };
 
     /**
-     * \brief Save stats  function
-     * \param ueIndex the index of the UE
+     * @brief Save stats  function
+     * @param ueIndex the index of the UE
      */
     void SaveStats(uint32_t ueIndex);
     /**
-     * \brief Check stats  function
-     * \param ueIndex the index of the UE
+     * @brief Check stats  function
+     * @param ueIndex the index of the UE
      */
     void CheckStats(uint32_t ueIndex);
 
@@ -543,7 +543,7 @@
 
     // schedule the checkpoint events
 
-    Time stopTime = Seconds(0);
+    Time stopTime;
     for (auto checkPointEventIt = m_checkPointEventList.begin();
          checkPointEventIt != m_checkPointEventList.end();
          ++checkPointEventIt)
@@ -727,9 +727,9 @@
 }
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  *
- * \brief Lte X2 Handover Measures Test Suite
+ * @brief Lte X2 Handover Measures Test Suite
  */
 class LteX2HandoverMeasuresTestSuite : public TestSuite
 {
@@ -990,7 +990,7 @@
 } // end of LteX2HandoverMeasuresTestSuite ()
 
 /**
- * \ingroup lte-test
+ * @ingroup lte-test
  * Static variable for test initialization
  */
 static LteX2HandoverMeasuresTestSuite g_lteX2HandoverMeasuresTestSuiteInstance;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/doc/mesh.h ns-3.44/src/mesh/doc/mesh.h
--- ns-3.43/src/mesh/doc/mesh.h	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/doc/mesh.h	2025-03-09 16:55:49.615372000 -0700
@@ -11,10 +11,10 @@
  */
 
 /**
- * \defgroup mesh Mesh Device
+ * @defgroup mesh Mesh Device
  *
- * \brief MAC-layer mobile mesh networking.
- * \section MeshOverview Overview of Layer-2 Mesh networking protocols
+ * @brief MAC-layer mobile mesh networking.
+ * @section MeshOverview Overview of Layer-2 Mesh networking protocols
  *
  * The main goal of this module is to provide MAC-layer routing functionality.
 
@@ -56,7 +56,7 @@
  support
  * 48-bit MAC-addressing scheme.
  *
- * \subsection Architecture Architecture of MAC-layer routing stack
+ * @subsection Architecture Architecture of MAC-layer routing stack
  * As already mentioned, MAC-layer routing consists of two tiers.
  * An ns3::MeshPointDevice which forwards frames by using an attached ns3::MeshL2RoutingProtocol
  forms
@@ -90,9 +90,9 @@
  * It handles all outgoing and incoming frames, fills headers and make decisions to drop a frame or
  not. Also, it
  * adds information elements to beacons specific to given L2Routing protocol, if needed.
- * \image html MeshArchitecture.png "Overview of the Mesh MAC-layer routing system"
+ * @image html MeshArchitecture.png "Overview of the Mesh MAC-layer routing system"
  *
- * \subsection NewProtocol Adding a new protocol
+ * @subsection NewProtocol Adding a new protocol
  * This module requires all the network devices operate with ns3::Mac48Address addressing scheme.
  *
  * To add a new L2Routing protocol, one needs to define the following:
@@ -107,9 +107,9 @@
  * you work with a frame without an LLC header, and when you are at plug-in tier using
  * ns3::MeshWifiInterfaceMacPlugin, an LLC header is already attached (by WifiNetDevice)
  *
- * \attention Note, when you use ns3::MeshWifiInterfaceMac, multiple plug-ins may be installed.
+ * @attention Note, when you use ns3::MeshWifiInterfaceMac, multiple plug-ins may be installed.
  *
- * \subsection Statistics
+ * @subsection Statistics
  * Each L2Routing protocol has a structure to capture statistics, Report and ResetStats methods.
  * This gives an opportunity to collect statistic to an *.xml file periodically.
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/doc/source/mesh-design.rst ns-3.44/src/mesh/doc/source/mesh-design.rst
--- ns-3.43/src/mesh/doc/source/mesh-design.rst	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/doc/source/mesh-design.rst	2025-03-09 16:55:49.615372000 -0700
@@ -78,25 +78,25 @@
 
 If a peer link between the sender and receiver does not exist, a frame will be
 dropped. So, the plug-in to the peer management protocol (PMP) is the first
-in the list of ``ns3::MeshWifiInterfaceMacPlugins`` to be used.
+in the list of ``ns3::MeshWifiInterfaceMacPlugins`` to be used.
 
 Peer management protocol
 ~~~~~~~~~~~~~~~~~~~~~~~~
 
 The peer management protocol consists of three main parts:
 
-* the protocol itself, ``ns3::dot11s::PeerManagementProtocol``, which keeps all active peer links on interfaces, handles all changes of their states and notifies the routing protocol about link failures.
-* the MAC plug-in, ``ns3::dot11s::PeerManagementProtocolMac``, which drops frames if there is no peer link, and peeks all needed information from management frames and information elements from beacons.
-* the peer link, ``ns3::dot11s::PeerLink``, which keeps finite state machine of each peer link, keeps beacon loss counter and counter of successive transmission failures.
+* the protocol itself, ``ns3::dot11s::PeerManagementProtocol``, which keeps all active peer links on interfaces, handles all changes of their states and notifies the routing protocol about link failures.
+* the MAC plug-in, ``ns3::dot11s::PeerManagementProtocolMac``, which drops frames if there is no peer link, and peeks all needed information from management frames and information elements from beacons.
+* the peer link, ``ns3::dot11s::PeerLink``, which keeps finite state machine of each peer link, keeps beacon loss counter and counter of successive transmission failures.
 
 The procedure of closing a peer link is not described in detail in the
 standard, so in the model the link may be closed by:
 
-* beacon loss (see an appropriate attribute of ns3::dot11s::PeerLink class)
+* beacon loss (see an appropriate attribute of ns3::dot11s::PeerLink class)
 * transmission failure – when a predefined number of successive packets have failed to transmit, the link will be closed.
 
-The peer management protocol is also responsible for beacon collision avoidance, because it keeps beacon timing elements from all neighbours. Note that the PeerManagementProtocol is not attached to the MeshPointDevice as a routing protocol, but the structure is similar: the upper tier of the protocol is
-``ns3::dot11s::PeerManagementProtocol`` and its plug-in is
+The peer management protocol is also responsible for beacon collision avoidance, because it keeps beacon timing elements from all neighbours. Note that the PeerManagementProtocol is not attached to the MeshPointDevice as a routing protocol, but the structure is similar: the upper tier of the protocol is
+``ns3::dot11s::PeerManagementProtocol`` and its plug-in is
 ``ns3::dot11s::PeerManagementProtocolMac``.
 
 Hybrid Wireless Mesh Protocol
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/examples/mesh-example.cc ns-3.44/src/mesh/examples/mesh-example.cc
--- ns-3.43/src/mesh/examples/mesh-example.cc	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/examples/mesh-example.cc	2025-03-09 16:55:49.615372000 -0700
@@ -82,7 +82,7 @@
 /**
  * Transmission trace sink.
  *
- * \param p The sent packet.
+ * @param p The sent packet.
  */
 void
 TxTrace(Ptr<const Packet> p)
@@ -94,7 +94,7 @@
 /**
  * Reception trace sink,
  *
- * \param p The received packet.
+ * @param p The received packet.
  */
 void
 RxTrace(Ptr<const Packet> p)
@@ -104,8 +104,8 @@
 }
 
 /**
- * \ingroup mesh
- * \brief MeshTest class
+ * @ingroup mesh
+ * @brief MeshTest class
  */
 class MeshTest
 {
@@ -115,13 +115,13 @@
     /**
      * Configure test from command line arguments
      *
-     * \param argc command line argument count
-     * \param argv command line arguments
+     * @param argc command line argument count
+     * @param argv command line arguments
      */
     void Configure(int argc, char** argv);
     /**
      * Run test
-     * \returns the test status
+     * @returns the test status
      */
     int Run();
 
@@ -291,7 +291,7 @@
     UdpEchoServerHelper echoServer(portNumber);
     uint16_t sinkNodeId = m_xSize * m_ySize - 1;
     ApplicationContainer serverApps = echoServer.Install(nodes.Get(sinkNodeId));
-    serverApps.Start(Seconds(1.0));
+    serverApps.Start(Seconds(1));
     serverApps.Stop(Seconds(m_totalTime + 1));
     UdpEchoClientHelper echoClient(interfaces.GetAddress(sinkNodeId), portNumber);
     echoClient.SetAttribute("MaxPackets",
@@ -302,7 +302,7 @@
     Ptr<UdpEchoClient> app = clientApps.Get(0)->GetObject<UdpEchoClient>();
     app->TraceConnectWithoutContext("Tx", MakeCallback(&TxTrace));
     app->TraceConnectWithoutContext("Rx", MakeCallback(&RxTrace));
-    clientApps.Start(Seconds(1.0));
+    clientApps.Start(Seconds(1));
     clientApps.Stop(Seconds(m_totalTime + 1.5));
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/helper/dot11s/dot11s-installer.h ns-3.44/src/mesh/helper/dot11s/dot11s-installer.h
--- ns-3.43/src/mesh/helper/dot11s/dot11s-installer.h	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/helper/dot11s/dot11s-installer.h	2025-03-09 16:55:49.623372000 -0700
@@ -15,15 +15,15 @@
 {
 
 /**
- * \ingroup dot11s
- * \brief Helper class to allow easy installation of 802.11s stack.
+ * @ingroup dot11s
+ * @brief Helper class to allow easy installation of 802.11s stack.
  */
 class Dot11sStack : public MeshStack
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -44,23 +44,23 @@
     void DoDispose() override;
 
     /**
-     * \brief Install an 802.11s stack.
-     * \param mp The Ptr<MeshPointDevice> to use when setting up the PMP.
-     * \return true if successful
+     * @brief Install an 802.11s stack.
+     * @param mp The Ptr<MeshPointDevice> to use when setting up the PMP.
+     * @return true if successful
      */
     bool InstallStack(Ptr<MeshPointDevice> mp) override;
 
     /**
-     * \brief Iterate through the referenced devices and protocols and print
+     * @brief Iterate through the referenced devices and protocols and print
      * their statistics
-     * \param mp The Ptr<MeshPointDevice> to use when setting up the PMP.
-     * \param os The output stream
+     * @param mp The Ptr<MeshPointDevice> to use when setting up the PMP.
+     * @param os The output stream
      */
     void Report(const Ptr<MeshPointDevice> mp, std::ostream&) override;
 
     /**
-     * \brief Reset the statistics on the referenced devices and protocols.
-     * \param mp The Ptr<MeshPointDevice> to use when setting up the PMP.
+     * @brief Reset the statistics on the referenced devices and protocols.
+     * @param mp The Ptr<MeshPointDevice> to use when setting up the PMP.
      */
     void ResetStats(const Ptr<MeshPointDevice> mp) override;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/helper/flame/flame-installer.cc ns-3.44/src/mesh/helper/flame/flame-installer.cc
--- ns-3.43/src/mesh/helper/flame/flame-installer.cc	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/helper/flame/flame-installer.cc	2025-03-09 16:55:49.623372000 -0700
@@ -50,7 +50,7 @@
 FlameStack::Report(const Ptr<MeshPointDevice> mp, std::ostream& os)
 {
     mp->Report(os);
-    /// \todo report flame counters
+    /// @todo report flame counters
     Ptr<FlameProtocol> flame = mp->GetObject<FlameProtocol>();
     NS_ASSERT(flame);
     flame->Report(os);
@@ -60,7 +60,7 @@
 FlameStack::ResetStats(const Ptr<MeshPointDevice> mp)
 {
     mp->ResetStats();
-    /// \todo reset flame counters
+    /// @todo reset flame counters
     Ptr<FlameProtocol> flame = mp->GetObject<FlameProtocol>();
     NS_ASSERT(flame);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/helper/flame/flame-installer.h ns-3.44/src/mesh/helper/flame/flame-installer.h
--- ns-3.43/src/mesh/helper/flame/flame-installer.h	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/helper/flame/flame-installer.h	2025-03-09 16:55:49.623372000 -0700
@@ -15,17 +15,17 @@
 {
 
 /**
- * \ingroup flame
+ * @ingroup flame
  *
- * \brief Helper class used to install FLAME mesh stack (actually single
+ * @brief Helper class used to install FLAME mesh stack (actually single
  * protocol in this stack)
  */
 class FlameStack : public MeshStack
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -46,22 +46,22 @@
     void DoDispose() override;
 
     /**
-     * \brief Install a flame stack on the given MeshPointDevice
-     * \param mp The Ptr<MeshPointDevice> to use.
-     * \return true if successful
+     * @brief Install a flame stack on the given MeshPointDevice
+     * @param mp The Ptr<MeshPointDevice> to use.
+     * @return true if successful
      */
     bool InstallStack(Ptr<MeshPointDevice> mp) override;
 
     /**
-     * \brief Print flame protocol statistics.
-     * \param mp The Ptr<MeshPointDevice> to use.
-     * \param os The output stream
+     * @brief Print flame protocol statistics.
+     * @param mp The Ptr<MeshPointDevice> to use.
+     * @param os The output stream
      */
     void Report(const Ptr<MeshPointDevice> mp, std::ostream&) override;
 
     /**
-     * \brief Reset the statistics.
-     * \param mp The Ptr<MeshPointDevice> to use.
+     * @brief Reset the statistics.
+     * @param mp The Ptr<MeshPointDevice> to use.
      */
     void ResetStats(const Ptr<MeshPointDevice> mp) override;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/helper/mesh-helper.h ns-3.44/src/mesh/helper/mesh-helper.h
--- ns-3.43/src/mesh/helper/mesh-helper.h	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/helper/mesh-helper.h	2025-03-09 16:55:49.635372000 -0700
@@ -25,9 +25,9 @@
 class NodeContainer;
 
 /**
- * \ingroup dot11s
+ * @ingroup dot11s
  *
- * \brief Helper to create IEEE 802.11s mesh networks
+ * @brief Helper to create IEEE 802.11s mesh networks
  */
 class MeshHelper
 {
@@ -43,45 +43,45 @@
     ~MeshHelper();
 
     /**
-     * \brief Set the helper to the default values for the MAC type,  remote
+     * @brief Set the helper to the default values for the MAC type,  remote
      * station manager and channel policy.
-     * \returns the default MeshHelper
+     * @returns the default MeshHelper
      */
     static MeshHelper Default();
 
     /**
-     * \brief Set the Mac Attributes.
+     * @brief Set the Mac Attributes.
      *
      * All the attributes specified in this method should exist
      * in the requested mac.
      *
-     * \tparam Ts \deduced Argument types
-     * \param [in] args Name and AttributeValue pairs to set.
+     * @tparam Ts \deduced Argument types
+     * @param [in] args Name and AttributeValue pairs to set.
      */
     template <typename... Ts>
     void SetMacType(Ts&&... args);
     /**
-     * \brief Set the remote station manager type and Attributes.
+     * @brief Set the remote station manager type and Attributes.
      *
      * All the attributes specified in this method should exist
      * in the requested station manager.
      *
-     * \tparam Ts \deduced Argument types
-     * \param type the type of remote station manager to use.
-     * \param [in] args Name and AttributeValue pairs to set.
+     * @tparam Ts \deduced Argument types
+     * @param type the type of remote station manager to use.
+     * @param [in] args Name and AttributeValue pairs to set.
      */
     template <typename... Ts>
     void SetRemoteStationManager(std::string type, Ts&&... args);
     /**
      * Set standard
-     * \param standard the wifi phy standard
+     * @param standard the wifi phy standard
      */
     void SetStandard(WifiStandard standard);
 
-    /// \todo SetMeshId
+    /// @todo SetMeshId
     // void SetMeshId (std::string s);
     /**
-     *  \brief Spread/not spread frequency channels of MP interfaces.
+     *  @brief Spread/not spread frequency channels of MP interfaces.
      *
      *  If set to true different non-overlapping 20MHz frequency
      *  channels will be assigned to different mesh point interfaces.
@@ -93,46 +93,46 @@
     };
 
     /**
-     * \brief set the channel policy
-     * \param policy the channel policy
+     * @brief set the channel policy
+     * @param policy the channel policy
      */
     void SetSpreadInterfaceChannels(ChannelPolicy policy);
     /**
-     * \brief Set a number of interfaces in a mesh network
-     * \param nInterfaces is the number of interfaces
+     * @brief Set a number of interfaces in a mesh network
+     * @param nInterfaces is the number of interfaces
      */
     void SetNumberOfInterfaces(uint32_t nInterfaces);
 
     /**
-     * \brief Install 802.11s mesh device & protocols on given node list
+     * @brief Install 802.11s mesh device & protocols on given node list
      *
-     * \param phyHelper           Wifi PHY helper
-     * \param c               List of nodes to install
+     * @param phyHelper           Wifi PHY helper
+     * @param c               List of nodes to install
      *
-     * \return list of created mesh point devices, see MeshPointDevice
+     * @return list of created mesh point devices, see MeshPointDevice
      */
     NetDeviceContainer Install(const WifiPhyHelper& phyHelper, NodeContainer c) const;
     /**
-     * \brief Set the MeshStack type to use.
+     * @brief Set the MeshStack type to use.
      *
-     * \tparam Ts \deduced Argument types
-     * \param type the type of ns3::MeshStack.
-     * \param [in] args Name and AttributeValue pairs to set.
+     * @tparam Ts \deduced Argument types
+     * @param type the type of ns3::MeshStack.
+     * @param [in] args Name and AttributeValue pairs to set.
      */
     template <typename... Ts>
     void SetStackInstaller(std::string type, Ts&&... args);
 
     /**
-     * \brief Print statistics.
+     * @brief Print statistics.
      *
-     * \param device the net device
-     * \param os the output stream
+     * @param device the net device
+     * @param os the output stream
      */
     void Report(const ns3::Ptr<ns3::NetDevice>& device, std::ostream& os);
 
     /**
-     * \brief Reset statistics.
-     * \param device the net device
+     * @brief Reset statistics.
+     * @param device the net device
      */
     void ResetStats(const ns3::Ptr<ns3::NetDevice>& device);
     /**
@@ -141,10 +141,10 @@
      * have been assigned.  The Install() method of this helper
      * should have previously been called by the user.
      *
-     * \param stream first stream index to use
-     * \param c NetDeviceContainer of the set of devices for which the mesh devices
+     * @param stream first stream index to use
+     * @param c NetDeviceContainer of the set of devices for which the mesh devices
      *          should be modified to use a fixed stream
-     * \return the number of stream indices assigned by this helper
+     * @return the number of stream indices assigned by this helper
      */
     int64_t AssignStreams(NetDeviceContainer c, int64_t stream);
 
@@ -155,10 +155,10 @@
 
   private:
     /**
-     * \param phyHelper
-     * \param node
-     * \param channelId
-     * \returns a WifiNetDevice with ready-to-use interface
+     * @param phyHelper
+     * @param node
+     * @param channelId
+     * @returns a WifiNetDevice with ready-to-use interface
      */
     Ptr<WifiNetDevice> CreateInterface(const WifiPhyHelper& phyHelper,
                                        Ptr<Node> node,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/helper/mesh-stack-installer.h ns-3.44/src/mesh/helper/mesh-stack-installer.h
--- ns-3.43/src/mesh/helper/mesh-stack-installer.h	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/helper/mesh-stack-installer.h	2025-03-09 16:55:49.635372000 -0700
@@ -13,9 +13,9 @@
 namespace ns3
 {
 /**
- * \ingroup mesh
+ * @ingroup mesh
  *
- * \brief Prototype for class, which helps to install MAC-layer
+ * @brief Prototype for class, which helps to install MAC-layer
  * routing stack to ns3::MeshPointDevice
  *
  * You need to create a MeshPointDevice and attach all
@@ -24,25 +24,25 @@
 class MeshStack : public Object
 {
   public:
-    /// \brief Register this type.
-    /// \return The TypeId.
+    /// @brief Register this type.
+    /// @return The TypeId.
     static TypeId GetTypeId();
 
     /**
-     * \brief Installs mesh stack. needed by helper only
-     * \param mp the mesh point device
-     * \returns true if successful
+     * @brief Installs mesh stack. needed by helper only
+     * @param mp the mesh point device
+     * @returns true if successful
      */
     virtual bool InstallStack(Ptr<MeshPointDevice> mp) = 0;
     /**
      * Report statistics of a given mesh point
-     * \param mp the mesh point device
-     * \param os the output stream
+     * @param mp the mesh point device
+     * @param os the output stream
      */
     virtual void Report(const Ptr<MeshPointDevice> mp, std::ostream& os) = 0;
     /**
      * Reset statistics of a given mesh point
-     * \param mp the mesh point device
+     * @param mp the mesh point device
      */
     virtual void ResetStats(const Ptr<MeshPointDevice> mp) = 0;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/model/dot11s/airtime-metric.cc ns-3.44/src/mesh/model/dot11s/airtime-metric.cc
--- ns-3.43/src/mesh/model/dot11s/airtime-metric.cc	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/model/dot11s/airtime-metric.cc	2025-03-09 16:55:49.635372000 -0700
@@ -93,9 +93,9 @@
                             // DIFS + SIFS + AckTxTime = 2 * SIFS + 2 * SLOT + AckTxTime
                             2 * mac->GetWifiPhy()->GetSifs() + 2 * mac->GetWifiPhy()->GetSlot() +
                             mac->GetWifiPhy()->GetAckTxTime() +
-                            mac->GetWifiPhy()->CalculateTxDuration(m_testFrame->GetSize(),
-                                                                   txVector,
-                                                                   mac->GetWifiPhy()->GetPhyBand()))
+                            WifiPhy::CalculateTxDuration(m_testFrame->GetSize(),
+                                                         txVector,
+                                                         mac->GetWifiPhy()->GetPhyBand()))
                        .GetMicroSeconds() /
                    (10.24 * (1.0 - failAvg)));
     return metric;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/model/dot11s/airtime-metric.h ns-3.44/src/mesh/model/dot11s/airtime-metric.h
--- ns-3.43/src/mesh/model/dot11s/airtime-metric.h	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/model/dot11s/airtime-metric.h	2025-03-09 16:55:49.635372000 -0700
@@ -17,9 +17,9 @@
 namespace dot11s
 {
 /**
- * \ingroup dot11s
+ * @ingroup dot11s
  *
- * \brief Airtime link metric calculator
+ * @brief Airtime link metric calculator
  *
  * Airtime link metric is defined in 11B.10 of 802.11s Draft D3.0 as:
  *
@@ -36,8 +36,8 @@
   public:
     AirtimeLinkMetricCalculator();
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     /**
@@ -52,21 +52,21 @@
      * Final result is expressed encoded as an unsigned integer in units of
      * 0.01 TU = 10.24 us
      *
-     * \param peerAddress The peer MAC address
-     * \param mac The MAC layer
-     * \returns the calculated metric in units of 0.01 TU
+     * @param peerAddress The peer MAC address
+     * @param mac The MAC layer
+     * @returns the calculated metric in units of 0.01 TU
      */
     uint32_t CalculateMetric(Mac48Address peerAddress, Ptr<MeshWifiInterfaceMac> mac);
 
   private:
     /**
      * Set number of bytes in test frame (a constant 1024 in the standard)
-     * \param testLength the test length in bits
+     * @param testLength the test length in bits
      */
     void SetTestLength(uint16_t testLength);
     /**
      * Set header TID from the Dot11MetricTid attribute
-     * \param tid the header TID to use to calculate data rate
+     * @param tid the header TID to use to calculate data rate
      */
     void SetHeaderTid(uint8_t tid);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/model/dot11s/dot11s.h ns-3.44/src/mesh/model/dot11s/dot11s.h
--- ns-3.43/src/mesh/model/dot11s/dot11s.h	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/model/dot11s/dot11s.h	2025-03-09 16:55:49.635372000 -0700
@@ -8,10 +8,10 @@
  * This is doxygen module description, don't include
  */
 /**
- * \ingroup mesh
- * \defgroup dot11s IEEE 802.11s draft
+ * @ingroup mesh
+ * @defgroup dot11s IEEE 802.11s draft
  *
- * \brief IEEE 802.11s (mesh) draft standard implementation
+ * @brief IEEE 802.11s (mesh) draft standard implementation
  *
  * Current model conforms IEEE 802.11s D3.0 draft version and includes
  * Peer Management Protocol and HWMP (routing) Protocol implementations.
@@ -19,7 +19,7 @@
  * The multi-interface mesh points are supported as an
  * extension of IEEE draft version 3.0. Note that corresponding helper
  * creates single interface station by default.
- * \section Dot11s Overview of IEEE 802.11s
+ * @section Dot11s Overview of IEEE 802.11s
  * Implementation of 802.11s draft standard consists of two main parts:
  * Peer management protocol and HWMP - Hybrid Wireless Mesh Protocol.
  *
@@ -31,7 +31,7 @@
  * If peer link between sender and receiver does not exist, the packet will be dropped.
  * So, the plug-in to peer management protocol is the first in the list of
  * ns3::MeshWifiInterfaceMacPlugin
- * \subsection PMP Peer management protocol
+ * @subsection PMP Peer management protocol
  * Peer management protocol consists of three main parts:
  *      - Protocol itself ns3::dot11s::PeerManagementProtocol, which keeps all active peer links on
  * interfaces, handles all changes of their states and notifies a routing protocol about link
@@ -54,7 +54,7 @@
  * but the structure is similar: the upper tier of protocol ns3::dot11s::PeerManagementProtocol
  * and its plug-in is  ns3::dot11s::PeerManagementProtocolMac.
  *
- * \subsection HWMP Hybrid Wireless Mesh Protocol
+ * @subsection HWMP Hybrid Wireless Mesh Protocol
  * HWMP is implemented in both modes -- reactive and proactive. Also we have implemented an ability
  * to transmit broadcast data and management frames as unicasts (see appropriate attributes).
  * This feature turns off at a station when the number of neighbours of the station is more than a
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/model/dot11s/dot11s-mac-header.h ns-3.44/src/mesh/model/dot11s/dot11s-mac-header.h
--- ns-3.43/src/mesh/model/dot11s/dot11s-mac-header.h	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/model/dot11s/dot11s-mac-header.h	2025-03-09 16:55:49.635372000 -0700
@@ -17,9 +17,9 @@
 namespace dot11s
 {
 /**
- * \ingroup dot11s
+ * @ingroup dot11s
  *
- * \brief Mesh Control field, see Section 8.2.4.7.3 IEEE 802.11-2012
+ * @brief Mesh Control field, see Section 8.2.4.7.3 IEEE 802.11-2012
  *
  * Header format: | Mesh flags: 1 | TTL: 1 | Sequence number: 4 | Address ext.: 0, 6, or 12 |
  */
@@ -29,8 +29,8 @@
     MeshHeader();
     ~MeshHeader() override;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -38,43 +38,43 @@
 
     /**
      * Set extended address 4
-     * \param address the MAC address to set
+     * @param address the MAC address to set
      */
     void SetAddr4(Mac48Address address);
     /**
      * Set extended address 5
-     * \param address the MAC address
+     * @param address the MAC address
      */
     void SetAddr5(Mac48Address address);
     /**
      * Set extended address 6
-     * \param address the MAC address
+     * @param address the MAC address
      */
     void SetAddr6(Mac48Address address);
     /**
      * Get extended address 4
-     * \returns the MAC address
+     * @returns the MAC address
      */
     Mac48Address GetAddr4() const;
     /**
      * Get extended address 5
-     * \returns the MAC address
+     * @returns the MAC address
      */
     Mac48Address GetAddr5() const;
     /**
      * Get extended address 6
-     * \returns the MAC address
+     * @returns the MAC address
      */
     Mac48Address GetAddr6() const;
 
     /**
      * Set four-byte mesh sequence number
-     * \param seqno the sequence number to set
+     * @param seqno the sequence number to set
      */
     void SetMeshSeqno(uint32_t seqno);
     /**
      * Get the four-byte mesh sequence number
-     * \returns the sequence number
+     * @returns the sequence number
      */
     uint32_t GetMeshSeqno() const;
 
@@ -82,23 +82,23 @@
      * Set mesh TTL subfield corresponding to the remaining number of hops
      * the MSDU/MMPDU is forwarded.
      *
-     * \param TTL the TTL value to set
+     * @param TTL the TTL value to set
      */
     void SetMeshTtl(uint8_t TTL);
     /**
      * Get mesh TTL function subfield value
-     * \returns the TTL value
+     * @returns the TTL value
      */
     uint8_t GetMeshTtl() const;
 
     /**
      * Set Address Extension Mode
-     * \param num_of_addresses value between 0 and 3 for the two-bit field
+     * @param num_of_addresses value between 0 and 3 for the two-bit field
      */
     void SetAddressExt(uint8_t num_of_addresses);
     /**
      * Get Address Extension Mode
-     * \returns the address extension mode value
+     * @returns the address extension mode value
      */
     uint8_t GetAddressExt() const;
 
@@ -116,9 +116,9 @@
     /**
      * equality operator
      *
-     * \param a left hand side
-     * \param b right hand side
-     * \returns true if equal
+     * @param a left hand side
+     * @param b right hand side
+     * @returns true if equal
      */
     friend bool operator==(const MeshHeader& a, const MeshHeader& b);
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/model/dot11s/hwmp-protocol.h ns-3.44/src/mesh/model/dot11s/hwmp-protocol.h
--- ns-3.43/src/mesh/model/dot11s/hwmp-protocol.h	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/model/dot11s/hwmp-protocol.h	2025-03-09 16:55:49.635372000 -0700
@@ -48,17 +48,17 @@
 };
 
 /**
- * \ingroup dot11s
+ * @ingroup dot11s
  *
- * \brief Hybrid wireless mesh protocol -- a mesh routing protocol defined
+ * @brief Hybrid wireless mesh protocol -- a mesh routing protocol defined
  * in IEEE 802.11-2012 standard.
  */
 class HwmpProtocol : public MeshL2RoutingProtocol
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -72,7 +72,7 @@
     void DoDispose() override;
 
     /**
-     * \brief structure of unreachable destination - address and sequence number
+     * @brief structure of unreachable destination - address and sequence number
      */
     struct FailedDestination
     {
@@ -83,13 +83,13 @@
     /**
      * Route request, inherited from MeshL2RoutingProtocol
      *
-     * \param sourceIface the source interface
-     * \param source the source address
-     * \param destination the destination address
-     * \param packet the packet to route
-     * \param protocolType the protocol type
-     * \param routeReply the route reply
-     * \returns true if route exists
+     * @param sourceIface the source interface
+     * @param source the source address
+     * @param destination the destination address
+     * @param packet the packet to route
+     * @param protocolType the protocol type
+     * @param routeReply the route reply
+     * @returns true if route exists
      */
     bool RequestRoute(uint32_t sourceIface,
                       const Mac48Address source,
@@ -100,12 +100,12 @@
     /**
      * Clean HWMP packet tag from packet; only the packet parameter is used
      *
-     * \param fromIface the from interface
-     * \param source the source address
-     * \param destination the destination address
-     * \param packet the packet to route
-     * \param protocolType the protocol type
-     * \returns true if successful
+     * @param fromIface the from interface
+     * @param source the source address
+     * @param destination the destination address
+     * @param packet the packet to route
+     * @param protocolType the protocol type
+     * @returns true if successful
      */
     bool RemoveRoutingStuff(uint32_t fromIface,
                             const Mac48Address source,
@@ -113,9 +113,9 @@
                             Ptr<Packet> packet,
                             uint16_t& protocolType) override;
     /**
-     * \brief Install HWMP on given mesh point.
-     * \param mp the MeshPointDevice
-     * \returns true if successful
+     * @brief Install HWMP on given mesh point.
+     * @param mp the MeshPointDevice
+     * @returns true if successful
      *
      * Installing protocol causes installation of its interface MAC plugins.
      *
@@ -125,21 +125,21 @@
     bool Install(Ptr<MeshPointDevice> mp);
     /**
      * Peer link status function
-     * \param meshPointAddress The MAC address of the mesh point
-     * \param peerAddress The MAC address of the peer
-     * \param interface The interface number
-     * \param status The status of the peer link
+     * @param meshPointAddress The MAC address of the mesh point
+     * @param peerAddress The MAC address of the peer
+     * @param interface The interface number
+     * @param status The status of the peer link
      */
     void PeerLinkStatus(Mac48Address meshPointAddress,
                         Mac48Address peerAddress,
                         uint32_t interface,
                         bool status);
     /**
-     * \brief This callback is used to obtain active neighbours on a given interface
-     * \param cb is a callback, which returns a list of addresses on given interface (uint32_t)
+     * @brief This callback is used to obtain active neighbours on a given interface
+     * @param cb is a callback, which returns a list of addresses on given interface (uint32_t)
      */
     void SetNeighboursCallback(Callback<std::vector<Mac48Address>, uint32_t> cb);
-    /// \name Proactive PREQ mechanism:
+    /// @name Proactive PREQ mechanism:
     ///@{
     /// Set the current node as root
     void SetRoot();
@@ -147,14 +147,14 @@
     void UnsetRoot();
     ///@}
 
-    /// \brief Statistics:
+    /// @brief Statistics:
     ///@{
     /**
      *  Print statistics counters
-     *  \param os the output stream
+     *  @param os the output stream
      */
     void Report(std::ostream& os) const;
-    /// \brief Reset Statistics:
+    /// @brief Reset Statistics:
     void ResetStats();
     ///@}
 
@@ -163,14 +163,14 @@
      * used by this model.  Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream);
 
     /**
-     * \brief Get pointer to HWMP routing table
-     * \return pointer to routing table
+     * @brief Get pointer to HWMP routing table
+     * @return pointer to routing table
      */
     Ptr<HwmpRtable> GetRoutingTable() const;
 
@@ -181,7 +181,7 @@
     void DoInitialize() override;
 
     /**
-     * \brief Structure of path error: IePerr and list of receivers:
+     * @brief Structure of path error: IePerr and list of receivers:
      * interfaces and MAC address
      */
     struct PathError
@@ -211,14 +211,14 @@
     /**
      * Like RequestRoute, but for unicast packets
      *
-     * \param sourceIface the source interface
-     * \param source the source address
-     * \param destination the destination address
-     * \param packet the packet to route
-     * \param protocolType the protocol type
-     * \param routeReply the route reply callback
-     * \param ttl the TTL
-     * \returns true if forwarded
+     * @param sourceIface the source interface
+     * @param source the source address
+     * @param destination the destination address
+     * @param packet the packet to route
+     * @param protocolType the protocol type
+     * @param routeReply the route reply callback
+     * @param ttl the TTL
+     * @returns true if forwarded
      */
     bool ForwardUnicast(uint32_t sourceIface,
                         const Mac48Address source,
@@ -228,16 +228,16 @@
                         RouteReplyCallback routeReply,
                         uint32_t ttl);
 
-    /// \name Interaction with HWMP MAC plugin
+    /// @name Interaction with HWMP MAC plugin
     ///@{
     /**
-     * \brief Handler for receiving Path Request
+     * @brief Handler for receiving Path Request
      *
-     * \param preq the IE preq
-     * \param from the from address
-     * \param interface the interface
-     * \param fromMp the 'from MP' address
-     * \param metric the metric
+     * @param preq the IE preq
+     * @param from the from address
+     * @param interface the interface
+     * @param fromMp the 'from MP' address
+     * @param metric the metric
      */
     void ReceivePreq(IePreq preq,
                      Mac48Address from,
@@ -245,13 +245,13 @@
                      Mac48Address fromMp,
                      uint32_t metric);
     /**
-     * \brief Handler for receiving Path Reply
+     * @brief Handler for receiving Path Reply
      *
-     * \param prep the IE prep
-     * \param from the from address
-     * \param interface the interface
-     * \param fromMp the 'from MP' address
-     * \param metric the metric
+     * @param prep the IE prep
+     * @param from the from address
+     * @param interface the interface
+     * @param fromMp the 'from MP' address
+     * @param metric the metric
      */
     void ReceivePrep(IePrep prep,
                      Mac48Address from,
@@ -259,27 +259,27 @@
                      Mac48Address fromMp,
                      uint32_t metric);
     /**
-     * \brief Handler for receiving Path Error
+     * @brief Handler for receiving Path Error
      *
-     * \param destinations the list of failed destinations
-     * \param from the from address
-     * \param interface the interface
-     * \param fromMp the from MP address
+     * @param destinations the list of failed destinations
+     * @param from the from address
+     * @param interface the interface
+     * @param fromMp the from MP address
      */
     void ReceivePerr(std::vector<FailedDestination> destinations,
                      Mac48Address from,
                      uint32_t interface,
                      Mac48Address fromMp);
     /**
-     * \brief Send Path Reply
-     * \param src the source address
-     * \param dst the destination address
-     * \param retransmitter the retransmitter address
-     * \param initMetric the initial metric
-     * \param originatorDsn the originator DSN
-     * \param destinationSN the destination DSN
-     * \param lifetime the lifetime
-     * \param interface the interface
+     * @brief Send Path Reply
+     * @param src the source address
+     * @param dst the destination address
+     * @param retransmitter the retransmitter address
+     * @param initMetric the initial metric
+     * @param originatorDsn the originator DSN
+     * @param destinationSN the destination DSN
+     * @param lifetime the lifetime
+     * @param interface the interface
      */
     void SendPrep(Mac48Address src,
                   Mac48Address dst,
@@ -290,28 +290,28 @@
                   uint32_t lifetime,
                   uint32_t interface);
     /**
-     * \brief forms a path error information element when list of destination fails on a given
+     * @brief forms a path error information element when list of destination fails on a given
      * interface \attention removes all entries from routing table!
      *
-     * \param destinations vector of failed destinations
-     * \return PathError
+     * @param destinations vector of failed destinations
+     * @return PathError
      */
     PathError MakePathError(std::vector<FailedDestination> destinations);
     /**
-     * \brief Forwards a received path error
-     * \param perr the path error
+     * @brief Forwards a received path error
+     * @param perr the path error
      */
     void ForwardPathError(PathError perr);
     /**
-     * \brief Passes a self-generated PERR to interface-plugin
-     * \param perr the path error
+     * @brief Passes a self-generated PERR to interface-plugin
+     * @param perr the path error
      */
     void InitiatePathError(PathError perr);
     /**
      * Get PERR receivers
      *
-     * \param failedDest
-     * \return list of addresses where a PERR should be sent to
+     * @param failedDest
+     * @return list of addresses where a PERR should be sent to
      */
     std::vector<std::pair<uint32_t, Mac48Address>> GetPerrReceivers(
         std::vector<FailedDestination> failedDest);
@@ -319,24 +319,24 @@
     /**
      * Get PREQ receivers
      *
-     * \param interface
-     * \return list of addresses where a PREQ should be sent to
+     * @param interface
+     * @return list of addresses where a PREQ should be sent to
      */
     std::vector<Mac48Address> GetPreqReceivers(uint32_t interface);
     /**
      * Get broadcast receivers
      *
-     * \param interface
-     * \return list of addresses where a broadcast should be retransmitted
+     * @param interface
+     * @return list of addresses where a broadcast should be retransmitted
      */
     std::vector<Mac48Address> GetBroadcastReceivers(uint32_t interface);
     /**
-     * \brief MAC-plugin asks whether the frame can be dropped. Protocol automatically updates
+     * @brief MAC-plugin asks whether the frame can be dropped. Protocol automatically updates
      * seqno.
      *
-     * \return true if frame can be dropped
-     * \param seqno is the sequence number of source
-     * \param source is the source address
+     * @return true if frame can be dropped
+     * @param seqno is the sequence number of source
+     * @param source is the source address
      */
     bool DropDataFrame(uint32_t seqno, Mac48Address source);
     ///@}
@@ -352,24 +352,24 @@
     ///@{
     /**
      * Queue a packet
-     * \param packet the packet to be queued
-     * \return true on success
+     * @param packet the packet to be queued
+     * @return true on success
      */
     bool QueuePacket(QueuedPacket packet);
     /**
      * Dequeue the first packet for a given destination
-     * \param dst the destination
-     * \return the dequeued packet
+     * @param dst the destination
+     * @return the dequeued packet
      */
     QueuedPacket DequeueFirstPacketByDst(Mac48Address dst);
     /**
      * Dequeue the first packet in the queue
-     * \return the dequeued packet
+     * @return the dequeued packet
      */
     QueuedPacket DequeueFirstPacket();
     /**
      * Signal the protocol that the reactive path toward a destination is now available
-     * \param dst the destination
+     * @param dst the destination
      */
     void ReactivePathResolved(Mac48Address dst);
     /**
@@ -378,21 +378,21 @@
     void ProactivePathResolved();
     ///@}
 
-    /// \name Methods responsible for path discovery retry procedure:
+    /// @name Methods responsible for path discovery retry procedure:
     ///@{
     /**
-     * \brief checks when the last path discovery procedure was started for a given destination.
-     * \return true if should send PREQ
-     * \param dst is the destination address
+     * @brief checks when the last path discovery procedure was started for a given destination.
+     * @return true if should send PREQ
+     * @param dst is the destination address
      *
      * If the retry counter has not achieved the maximum level - preq should not be sent
      */
     bool ShouldSendPreq(Mac48Address dst);
 
     /**
-     * \brief Generates PREQ retry when retry timeout has expired and route is still unresolved.
-     * \param dst is the destination address
-     * \param numOfRetry is the number of retries
+     * @brief Generates PREQ retry when retry timeout has expired and route is still unresolved.
+     * @param dst is the destination address
+     * @param numOfRetry is the number of retries
      *
      * When PREQ retry has achieved the maximum level - retry mechanism should be canceled
      */
@@ -401,53 +401,53 @@
     void SendProactivePreq();
     ///@}
 
-    /// \return address of MeshPointDevice
+    /// @return address of MeshPointDevice
     Mac48Address GetAddress();
-    /// \name Methods needed by HwmpMacLugin to access protocol parameters:
+    /// @name Methods needed by HwmpMacLugin to access protocol parameters:
     ///@{
     /**
      * Get do flag function
-     * \returns DO flag
+     * @returns DO flag
      */
     bool GetDoFlag() const;
     /**
      * Get rf flag function
-     * \returns the RF flag
+     * @returns the RF flag
      */
     bool GetRfFlag() const;
     /**
      * Get PREQ minimum interval function
-     * \returns the PREQ
+     * @returns the PREQ
      */
     Time GetPreqMinInterval();
     /**
      * Get PERR minimum interval function
-     * \returns the PERR minimum interval
+     * @returns the PERR minimum interval
      */
     Time GetPerrMinInterval();
     /**
      * Get maximum TTL function
-     * \returns the maximum TTL
+     * @returns the maximum TTL
      */
     uint8_t GetMaxTtl() const;
     /**
      * Get next period function
-     * \returns the next period
+     * @returns the next period
      */
     uint32_t GetNextPreqId();
     /**
      * Get next HWMP sequence no function
-     * \returns the next HWMP sequence number
+     * @returns the next HWMP sequence number
      */
     uint32_t GetNextHwmpSeqno();
     /**
      * Get active path lifetime function
-     * \returns the active path lifetime
+     * @returns the active path lifetime
      */
     uint32_t GetActivePathLifetime();
     /**
      * Get unicast PERR threshold function
-     * \returns the unicast PERR threshold
+     * @returns the unicast PERR threshold
      */
     uint8_t GetUnicastPerrThreshold() const;
     ///@}
@@ -468,7 +468,7 @@
 
         /**
          * Print function
-         * \param os The output stream
+         * @param os The output stream
          */
         void Print(std::ostream& os) const;
         /// constructor
@@ -482,7 +482,7 @@
     uint32_t m_dataSeqno;            ///< data sequence no
     uint32_t m_hwmpSeqno;            ///< HWMP sequence no
     uint32_t m_preqId;               ///< PREQ ID
-    /// \name Sequence number filters
+    /// @name Sequence number filters
     ///@{
     /// Data sequence number database
     std::map<Mac48Address, uint32_t> m_lastDataSeqno;
@@ -507,7 +507,7 @@
     /// Packet Queue
     std::vector<QueuedPacket> m_rqueue;
 
-    /// \name HWMP-protocol parameters
+    /// @name HWMP-protocol parameters
     /// These are all Attributes
     ///@{
     uint16_t m_maxQueueSize; //!< Maximum number of packets we can store when resolving route
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/model/dot11s/hwmp-protocol-mac.cc ns-3.44/src/mesh/model/dot11s/hwmp-protocol-mac.cc
--- ns-3.43/src/mesh/model/dot11s/hwmp-protocol-mac.cc	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/model/dot11s/hwmp-protocol-mac.cc	2025-03-09 16:55:49.635372000 -0700
@@ -66,7 +66,7 @@
     m_stats.rxData++;
     m_stats.rxDataBytes += packet->GetSize();
 
-    /// \todo address extension
+    /// @todo address extension
     Mac48Address destination;
     Mac48Address source;
     switch (meshHdr.GetAddressExt())
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/model/dot11s/hwmp-protocol-mac.h ns-3.44/src/mesh/model/dot11s/hwmp-protocol-mac.h
--- ns-3.43/src/mesh/model/dot11s/hwmp-protocol-mac.h	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/model/dot11s/hwmp-protocol-mac.h	2025-03-09 16:55:49.635372000 -0700
@@ -27,9 +27,9 @@
 class IePerr;
 
 /**
- * \ingroup dot11s
+ * @ingroup dot11s
  *
- * \brief Interface MAC plugin for HWMP -- 802.11s routing protocol
+ * @brief Interface MAC plugin for HWMP -- 802.11s routing protocol
  */
 class HwmpProtocolMac : public MeshWifiInterfaceMacPlugin
 {
@@ -37,8 +37,8 @@
     /**
      * Constructor
      *
-     * \param ifIndex interface index
-     * \param protocol pointer to HWMP protocol instance
+     * @param ifIndex interface index
+     * @param protocol pointer to HWMP protocol instance
      */
     HwmpProtocolMac(uint32_t ifIndex, Ptr<HwmpProtocol> protocol);
     ~HwmpProtocolMac() override;
@@ -50,55 +50,59 @@
                               WifiMacHeader& header,
                               Mac48Address from,
                               Mac48Address to) override;
+
     // Update beacon is empty, because HWMP does not know anything about beacons
-    void UpdateBeacon(MeshWifiBeacon& beacon) const override{};
+    void UpdateBeacon(MeshWifiBeacon& beacon) const override
+    {
+    }
+
     int64_t AssignStreams(int64_t stream) override;
 
   private:
     /// allow HwmpProtocol class friend access
     friend class HwmpProtocol;
     /**
-     * \returns a path selection action header
+     * @returns a path selection action header
      */
     static WifiActionHeader GetWifiActionHeader();
-    /// \name Interaction with HWMP:
+    /// @name Interaction with HWMP:
     ///@{
     /**
      * Send PREQ function
-     * \param preq the PREQ
+     * @param preq the PREQ
      */
     void SendPreq(IePreq preq);
     /**
      * Send PREQ function for vector of PREQ
-     * \param preq vector of PREQ information elements
+     * @param preq vector of PREQ information elements
      */
     void SendPreqVector(std::vector<IePreq> preq);
     /**
      * Send PREP function
-     * \param prep the PREP information element
-     * \param receiver the MAC address of the receiver
+     * @param prep the PREP information element
+     * @param receiver the MAC address of the receiver
      */
     void SendPrep(IePrep prep, Mac48Address receiver);
     /**
      * Forward a path error
-     * \param destinations vector of failed destinations
-     * \param receivers vector of receivers
+     * @param destinations vector of failed destinations
+     * @param receivers vector of receivers
      */
     void ForwardPerr(std::vector<HwmpProtocol::FailedDestination> destinations,
                      std::vector<Mac48Address> receivers);
     /**
      * initiate my own path error
-     * \param destinations vector of failed destinations
-     * \param receivers vector of receivers
+     * @param destinations vector of failed destinations
+     * @param receivers vector of receivers
      */
     void InitiatePerr(std::vector<HwmpProtocol::FailedDestination> destinations,
                       std::vector<Mac48Address> receivers);
     /**
      * Request a destination. If cannot send PREQ immediately, add a
      * destination to existing PREQ generated by me and stored in PREQ queue
-     * \param dest is the destination to be resolved
-     * \param originator_seqno is a sequence number that shall be preq originator sequenece number
-     * \param dst_seqno is a sequence number taken from routing table
+     * @param dest is the destination to be resolved
+     * @param originator_seqno is a sequence number that shall be preq originator sequenece number
+     * @param dst_seqno is a sequence number taken from routing table
      */
     void RequestDestination(Mac48Address dest, uint32_t originator_seqno, uint32_t dst_seqno);
     ///@}
@@ -109,18 +113,18 @@
     /// Send PERR function
     void SendMyPerr();
     /**
-     * \param peerAddress peer address
-     * \return metric to HWMP protocol, needed only by metrics to add peer as routing entry
+     * @param peerAddress peer address
+     * @return metric to HWMP protocol, needed only by metrics to add peer as routing entry
      */
     uint32_t GetLinkMetric(Mac48Address peerAddress) const;
     /**
      * Get the channel ID
-     * \returns the channel ID
+     * @returns the channel ID
      */
     uint16_t GetChannelId() const;
     /**
      * Report statistics
-     * \param os The output stream on which to report
+     * @param os The output stream on which to report
      */
     void Report(std::ostream& os) const;
     /// Reset statistics
@@ -131,13 +135,13 @@
     uint32_t m_ifIndex;                 ///< IF index
     Ptr<HwmpProtocol> m_protocol;       ///< protocol
 
-    /// \name my PREQ and PREQ timer:
+    /// @name my PREQ and PREQ timer:
     ///@{
     EventId m_preqTimer;          //!< Timer for PREQs
     std::vector<IePreq> m_myPreq; //!< container of PREQs
     ///@}
 
-    /// \name PERR timer and stored path error
+    /// @name PERR timer and stored path error
     ///@{
     EventId m_perrTimer;
 
@@ -152,7 +156,7 @@
 
     ///@}
 
-    /// \name Statistics
+    /// @name Statistics
     ///@{
 
     /**
@@ -176,7 +180,7 @@
         uint32_t rxDataBytes; ///< receive data bytes
         /**
          * Print function
-         * \param os the output stream
+         * @param os the output stream
          */
         void Print(std::ostream& os) const;
         Statistics();
@@ -189,17 +193,17 @@
     /**
      * Receive data frame
      *
-     * \param packet
-     * \param header
-     * \returns true if a packet was received
+     * @param packet
+     * @param header
+     * @returns true if a packet was received
      */
     bool ReceiveData(Ptr<Packet> packet, const WifiMacHeader& header);
     /**
      * Receive action management frame
      *
-     * \param packet
-     * \param header
-     * \returns true if a packet was received
+     * @param packet
+     * @param header
+     * @returns true if a packet was received
      */
     bool ReceiveAction(Ptr<Packet> packet, const WifiMacHeader& header);
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/model/dot11s/hwmp-rtable.cc ns-3.44/src/mesh/model/dot11s/hwmp-rtable.cc
--- ns-3.43/src/mesh/model/dot11s/hwmp-rtable.cc	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/model/dot11s/hwmp-rtable.cc	2025-03-09 16:55:49.635372000 -0700
@@ -166,7 +166,7 @@
     {
         return LookupResult();
     }
-    if ((i->second.whenExpire < Simulator::Now()) && (i->second.whenExpire != Seconds(0)))
+    if ((i->second.whenExpire < Simulator::Now()) && (!i->second.whenExpire.IsZero()))
     {
         NS_LOG_DEBUG("Reactive route has expired, sorry.");
         return LookupResult();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/model/dot11s/hwmp-rtable.h ns-3.44/src/mesh/model/dot11s/hwmp-rtable.h
--- ns-3.43/src/mesh/model/dot11s/hwmp-rtable.h	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/model/dot11s/hwmp-rtable.h	2025-03-09 16:55:49.635372000 -0700
@@ -21,9 +21,9 @@
 namespace dot11s
 {
 /**
- * \ingroup dot11s
+ * @ingroup dot11s
  *
- * \brief Routing table for HWMP -- 802.11s routing protocol
+ * @brief Routing table for HWMP -- 802.11s routing protocol
  */
 class HwmpRtable : public Object
 {
@@ -44,25 +44,25 @@
         /**
          * Lookup result function
          *
-         * \param r the result address
-         * \param i the interface
-         * \param m the metric
-         * \param s the sequence number
-         * \param l the lifetime
+         * @param r the result address
+         * @param i the interface
+         * @param m the metric
+         * @param s the sequence number
+         * @param l the lifetime
          */
         LookupResult(Mac48Address r = Mac48Address::GetBroadcast(),
                      uint32_t i = INTERFACE_ANY,
                      uint32_t m = MAX_METRIC,
                      uint32_t s = 0,
-                     Time l = Seconds(0.0));
+                     Time l = Seconds(0));
         /**
-         * \returns True for valid route
+         * @returns True for valid route
          */
         bool IsValid() const;
         /**
          * Compare route lookup results, used by tests
-         * \param o the lookup result to compare
-         * \returns true if equal
+         * @param o the lookup result to compare
+         * @returns true if equal
          */
         bool operator==(const LookupResult& o) const;
     };
@@ -72,25 +72,25 @@
 
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     HwmpRtable();
     ~HwmpRtable() override;
     void DoDispose() override;
 
-    /// \name Add/delete paths
+    /// @name Add/delete paths
     ///@{
 
     /**
      * Add a reactive path
-     * \param destination the destination address
-     * \param retransmitter the retransmitter address
-     * \param interface the interface
-     * \param metric  the metric
-     * \param lifetime  the lifetime
-     * \param seqnum  the sequence number
+     * @param destination the destination address
+     * @param retransmitter the retransmitter address
+     * @param interface the interface
+     * @param metric  the metric
+     * @param lifetime  the lifetime
+     * @param seqnum  the sequence number
      */
     void AddReactivePath(Mac48Address destination,
                          Mac48Address retransmitter,
@@ -100,12 +100,12 @@
                          uint32_t seqnum);
     /**
      * Add a proactive path
-     * \param metric  the metric
-     * \param root the address of the root
-     * \param retransmitter the retransmitter address
-     * \param interface the interface
-     * \param lifetime  the lifetime
-     * \param seqnum  the sequence number
+     * @param metric  the metric
+     * @param root the address of the root
+     * @param retransmitter the retransmitter address
+     * @param interface the interface
+     * @param lifetime  the lifetime
+     * @param seqnum  the sequence number
      */
     void AddProactivePath(uint32_t metric,
                           Mac48Address root,
@@ -115,10 +115,10 @@
                           uint32_t seqnum);
     /**
      * Add a precursor
-     * \param destination the destination address
-     * \param precursorInterface the precursor interface
-     * \param precursorAddress the address of the precursor
-     * \param lifetime the lifetime
+     * @param destination the destination address
+     * @param precursorInterface the precursor interface
+     * @param precursorAddress the address of the precursor
+     * @param lifetime the lifetime
      */
     void AddPrecursor(Mac48Address destination,
                       uint32_t precursorInterface,
@@ -127,8 +127,8 @@
 
     /**
      * Get the precursors list
-     * \param destination the destination
-     * \return the precursors list
+     * @param destination the destination
+     * @return the precursors list
      */
     PrecursorList GetPrecursors(Mac48Address destination);
 
@@ -138,39 +138,39 @@
     void DeleteProactivePath();
     /**
      * Delete all the proactive paths from a given root
-     * \param root the address of the root
+     * @param root the address of the root
      */
     void DeleteProactivePath(Mac48Address root);
     /**
      * Delete the reactive paths toward a destination
-     * \param destination the destination
+     * @param destination the destination
      */
     void DeleteReactivePath(Mac48Address destination);
     ///@}
 
-    /// \name Lookup
+    /// @name Lookup
     ///@{
     /**
      * Lookup path to destination
-     * \param destination the destination
-     * \return The lookup result
+     * @param destination the destination
+     * @return The lookup result
      */
     LookupResult LookupReactive(Mac48Address destination);
     /**
      * Return all reactive paths, including expired
-     * \param destination the destination
-     * \return The lookup result
+     * @param destination the destination
+     * @return The lookup result
      */
     LookupResult LookupReactiveExpired(Mac48Address destination);
     /**
      * Find proactive path to tree root. Note that calling this method has side effect of deleting
      * expired proactive path
-     * \return The lookup result
+     * @return The lookup result
      */
     LookupResult LookupProactive();
     /**
      * Return all proactive paths, including expired
-     * \return The lookup result
+     * @return The lookup result
      */
     LookupResult LookupProactiveExpired();
     ///@}
@@ -178,8 +178,8 @@
     /**
      * When peer link with a given MAC-address fails - it returns list of unreachable destination
      * addresses
-     * \param peerAddress the peer address
-     * \returns the list of unreachable destinations
+     * @param peerAddress the peer address
+     * @returns the list of unreachable destinations
      */
     std::vector<HwmpProtocol::FailedDestination> GetUnreachableDestinations(
         Mac48Address peerAddress);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/model/dot11s/hwmp-tag.cc ns-3.44/src/mesh/model/dot11s/hwmp-tag.cc
--- ns-3.43/src/mesh/model/dot11s/hwmp-tag.cc	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/model/dot11s/hwmp-tag.cc	2025-03-09 16:55:49.635372000 -0700
@@ -77,8 +77,8 @@
 }
 
 /**
- * \brief Get the type ID.
- * \return the object TypeId
+ * @brief Get the type ID.
+ * @return the object TypeId
  */
 TypeId
 HwmpTag::GetTypeId()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/model/dot11s/hwmp-tag.h ns-3.44/src/mesh/model/dot11s/hwmp-tag.h
--- ns-3.43/src/mesh/model/dot11s/hwmp-tag.h	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/model/dot11s/hwmp-tag.h	2025-03-09 16:55:49.635372000 -0700
@@ -20,9 +20,9 @@
 namespace dot11s
 {
 /**
- * \ingroup dot11s
+ * @ingroup dot11s
  *
- * \brief Hwmp tag implements interaction between HWMP
+ * @brief Hwmp tag implements interaction between HWMP
  * protocol and MeshWifiMac
  *
  * Hwmp tag keeps the following:
@@ -43,50 +43,50 @@
     ~HwmpTag() override;
     /**
      * Set address
-     * \param retransmitter the MAC address of the retransmitter
+     * @param retransmitter the MAC address of the retransmitter
      */
     void SetAddress(Mac48Address retransmitter);
     /**
      * Get address from tag
-     * \return the MAC address
+     * @return the MAC address
      */
     Mac48Address GetAddress();
     /**
      * Set the TTL value
-     * \param ttl
+     * @param ttl
      */
     void SetTtl(uint8_t ttl);
     /**
      * Get the TTL value
-     * \returns the TTL
+     * @returns the TTL
      */
     uint8_t GetTtl() const;
     /**
      * Set the metric value
-     * \param metric the metric
+     * @param metric the metric
      */
     void SetMetric(uint32_t metric);
     /**
      * Get the metric value
-     * \returns the metric
+     * @returns the metric
      */
     uint32_t GetMetric() const;
     /**
      * Set sequence number
-     * \param seqno the sequence number
+     * @param seqno the sequence number
      */
     void SetSeqno(uint32_t seqno);
     /**
      * Get the sequence number
-     * \returns the sequence number
+     * @returns the sequence number
      */
     uint32_t GetSeqno() const;
     /// Decrement TTL
     void DecrementTtl();
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/model/dot11s/ie-dot11s-beacon-timing.h ns-3.44/src/mesh/model/dot11s/ie-dot11s-beacon-timing.h
--- ns-3.43/src/mesh/model/dot11s/ie-dot11s-beacon-timing.h	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/model/dot11s/ie-dot11s-beacon-timing.h	2025-03-09 16:55:49.635372000 -0700
@@ -19,8 +19,8 @@
 namespace dot11s
 {
 /**
- * \ingroup dot11s
- * \brief Information element describing one unit of beacon timing element
+ * @ingroup dot11s
+ * @brief Information element describing one unit of beacon timing element
  */
 class IeBeaconTimingUnit : public SimpleRefCount<IeBeaconTimingUnit>
 {
@@ -28,33 +28,33 @@
     IeBeaconTimingUnit();
     /**
      * Set AID value
-     * \param aid the AID
+     * @param aid the AID
      */
     void SetAid(uint8_t aid);
     /**
      * Set last beacon value
-     * \param lastBeacon the last beacon
+     * @param lastBeacon the last beacon
      */
     void SetLastBeacon(uint16_t lastBeacon);
     /**
      * Set beacon interval value
-     * \param beaconInterval the beacon interval
+     * @param beaconInterval the beacon interval
      */
     void SetBeaconInterval(uint16_t beaconInterval);
 
     /**
      * Get AID value
-     * \returns the AID
+     * @returns the AID
      */
     uint8_t GetAid() const;
     /**
      * Get last beacon value
-     * \returns the last beacon
+     * @returns the last beacon
      */
     uint16_t GetLastBeacon() const;
     /**
      * Get beacon interval
-     * \returns the beacon interval
+     * @returns the beacon interval
      */
     uint16_t GetBeaconInterval() const;
 
@@ -69,22 +69,22 @@
     /**
      * equality operator
      *
-     * \param a lhs
-     * \param b rhs
-     * \returns true if equal
+     * @param a lhs
+     * @param b rhs
+     * @returns true if equal
      */
     friend bool operator==(const IeBeaconTimingUnit& a, const IeBeaconTimingUnit& b);
 };
 
 /**
- * \ingroup dot11s
- * \brief See 7.3.2.89 of 802.11s draft 2.07
+ * @ingroup dot11s
+ * @brief See 7.3.2.89 of 802.11s draft 2.07
  */
 class IeBeaconTiming : public WifiInformationElement
 {
   public:
     /**
-     * \ingroup dot11s
+     * @ingroup dot11s
      * This type is a list of timing elements obtained from neighbours with their beacons:
      */
     typedef std::vector<Ptr<IeBeaconTimingUnit>> NeighboursTimingUnitsList;
@@ -93,21 +93,21 @@
     /**
      * This methods are needed for beacon collision
      * avoidance module:
-     * \returns the neighbor timing elements list
+     * @returns the neighbor timing elements list
      */
     NeighboursTimingUnitsList GetNeighboursTimingElementsList();
     /**
      * Add neighbors timing element unit
-     * \param aid the AID
-     * \param last_beacon the last beacon time
-     * \param beacon_interval the beacon interval
+     * @param aid the AID
+     * @param last_beacon the last beacon time
+     * @param beacon_interval the beacon interval
      */
     void AddNeighboursTimingElementUnit(uint16_t aid, Time last_beacon, Time beacon_interval);
     /**
      * Delete neighbors timing element unit
-     * \param aid the AID
-     * \param last_beacon the last beacon time
-     * \param beacon_interval the beacon interval
+     * @param aid the AID
+     * @param last_beacon the last beacon time
+     * @param beacon_interval the beacon interval
      */
     void DelNeighboursTimingElementUnit(uint16_t aid, Time last_beacon, Time beacon_interval);
     /// Clear timing element
@@ -123,8 +123,8 @@
     /**
      * equality operator
      *
-     * \param a lhs
-     * \returns true if equal
+     * @param a lhs
+     * @returns true if equal
      */
     bool operator==(const WifiInformationElement& a) const override;
 
@@ -132,20 +132,20 @@
     // Converters:
     /**
      * Timestamp to U16 function
-     * \param x the timestamp
-     * \returns the U16
+     * @param x the timestamp
+     * @returns the U16
      */
     static uint16_t TimestampToU16(Time x);
     /**
      * Beacon interval to U16 function
-     * \param x the beacon interval
-     * \returns the U16
+     * @param x the beacon interval
+     * @returns the U16
      */
     static uint16_t BeaconIntervalToU16(Time x);
     /**
      * Aid to U8 function
-     * \param x the U16
-     * \returns the AID
+     * @param x the U16
+     * @returns the AID
      */
     static uint8_t AidToU8(uint16_t x);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/model/dot11s/ie-dot11s-configuration.h ns-3.44/src/mesh/model/dot11s/ie-dot11s-configuration.h
--- ns-3.43/src/mesh/model/dot11s/ie-dot11s-configuration.h	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/model/dot11s/ie-dot11s-configuration.h	2025-03-09 16:55:49.635372000 -0700
@@ -55,7 +55,7 @@
 };
 
 /**
- * \ingroup dot11s
+ * @ingroup dot11s
  * A set of values indicating whether a mesh STA is a possible candidate
  * for mesh peering establishment (Section 8.4.2.100.8 of IEEE 802.11-2012)
  */
@@ -65,25 +65,25 @@
     Dot11sMeshCapability();
     /**
      * Size of the field in bytes when serialized
-     * \returns the serialized size in bytes
+     * @returns the serialized size in bytes
      */
     uint8_t GetSerializedSize() const;
     /**
      * Serialize to a buffer
-     * \param i the iterator of the buffer to serialize to
-     * \returns new value of the iterator
+     * @param i the iterator of the buffer to serialize to
+     * @returns new value of the iterator
      */
     Buffer::Iterator Serialize(Buffer::Iterator i) const;
     /**
      * Deserialize from a buffer
-     * \param i the iterator from which to deserialize
-     * \returns new value of the iterator
+     * @param i the iterator from which to deserialize
+     * @returns new value of the iterator
      */
     Buffer::Iterator Deserialize(Buffer::Iterator i);
     /**
      * The Mesh Capability is expressed in terms of 8 single bit fields.
      * This method returns the whole byte.
-     * \returns the Mesh Capability byte
+     * @returns the Mesh Capability byte
      */
     uint8_t GetUint8() const;
     bool acceptPeerLinks;    ///< accept peer links
@@ -95,24 +95,24 @@
     bool powerSaveLevel;     ///< power save level
     /**
      * This is a utility function to test if the bit at position n is true
-     * \param cap byte to test
-     * \param n bit number to mask
-     * \returns true if bit n is set in cap
+     * @param cap byte to test
+     * @param n bit number to mask
+     * @returns true if bit n is set in cap
      */
     bool Is(uint8_t cap, uint8_t n) const;
     /**
      * equality operator
      *
-     * \param a lhs
-     * \param b rhs
-     * \returns true if equal
+     * @param a lhs
+     * @param b rhs
+     * @returns true if equal
      */
     friend bool operator==(const Dot11sMeshCapability& a, const Dot11sMeshCapability& b);
 };
 
 /**
- * \ingroup dot11s
- * \brief Describes Mesh Configuration Element
+ * @ingroup dot11s
+ * @brief Describes Mesh Configuration Element
  * see 7.3.2.86 of 802.11s draft 3.0
  */
 class IeConfiguration : public WifiInformationElement
@@ -121,39 +121,39 @@
     IeConfiguration();
     /**
      * Set routing value
-     * \param routingId the routing ID
+     * @param routingId the routing ID
      */
     void SetRouting(Dot11sPathSelectionProtocol routingId);
     /**
      * Set metric value
-     * \param metricId the path selection metric
+     * @param metricId the path selection metric
      */
     void SetMetric(Dot11sPathSelectionMetric metricId);
     /**
      * Is HWMP function
-     * \returns true if Active Path Selection Protocol Identifier field set
+     * @returns true if Active Path Selection Protocol Identifier field set
      *          to HWMP
      */
     bool IsHWMP();
     /**
      * Is airtime function
-     * \returns true if Active Path Selection Metric Identifier is set to
+     * @returns true if Active Path Selection Metric Identifier is set to
      *          airtime link metric
      */
     bool IsAirtime();
     /**
      * Set neighbor count
-     * \param neighbors the number of neighbors
+     * @param neighbors the number of neighbors
      */
     void SetNeighborCount(uint8_t neighbors);
     /**
      * Get neighbor count
-     * \returns the the neighbor count
+     * @returns the the neighbor count
      */
     uint8_t GetNeighborCount() const;
     /**
      * Mesh capability
-     * \returns the dot11s mesh capability
+     * @returns the dot11s mesh capability
      */
     const Dot11sMeshCapability& MeshCapability();
 
@@ -181,9 +181,9 @@
     /**
      * equality operator
      *
-     * \param a lhs
-     * \param b rhs
-     * \returns true if equal
+     * @param a lhs
+     * @param b rhs
+     * @returns true if equal
      */
     friend bool operator==(const IeConfiguration& a, const IeConfiguration& b);
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/model/dot11s/ie-dot11s-id.h ns-3.44/src/mesh/model/dot11s/ie-dot11s-id.h
--- ns-3.43/src/mesh/model/dot11s/ie-dot11s-id.h	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/model/dot11s/ie-dot11s-id.h	2025-03-09 16:55:49.639372000 -0700
@@ -20,7 +20,7 @@
 {
 
 /**
- * \brief a IEEE 802.11 Mesh ID element (Section 8.4.2.101 of IEEE 802.11-2012)
+ * @brief a IEEE 802.11 Mesh ID element (Section 8.4.2.101 of IEEE 802.11-2012)
  */
 class IeMeshId : public WifiInformationElement
 {
@@ -30,25 +30,25 @@
     /**
      * Constructor
      *
-     * \param s reference id
+     * @param s reference id
      */
     IeMeshId(std::string s);
 
     /**
      * Equality test
-     * \param o another IeMeshId
-     * \returns true if equal
+     * @param o another IeMeshId
+     * @returns true if equal
      */
     bool IsEqual(const IeMeshId& o) const;
     /**
      * Return true if broadcast (if first octet of Mesh ID is zero)
-     * \returns true if broadcast
+     * @returns true if broadcast
      */
     bool IsBroadcast() const;
     // uint32_t GetLength () const;
     /**
      * Peek the IeMeshId as a string value
-     * \returns the mesh ID as a string
+     * @returns the mesh ID as a string
      */
     char* PeekString() const;
 
@@ -64,19 +64,19 @@
     /**
      * equality operator
      *
-     * \param a lhs
-     * \param b lhs
-     * \returns true if equal
+     * @param a lhs
+     * @param b lhs
+     * @returns true if equal
      */
     friend bool operator==(const IeMeshId& a, const IeMeshId& b);
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param [in] os The reference to the output stream.
- * \param [in] meshId The IeMeshId object.
- * \returns The reference to the output stream.
+ * @param [in] os The reference to the output stream.
+ * @param [in] meshId The IeMeshId object.
+ * @returns The reference to the output stream.
  */
 std::ostream& operator<<(std::ostream& os, const IeMeshId& meshId);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/model/dot11s/ie-dot11s-metric-report.h ns-3.44/src/mesh/model/dot11s/ie-dot11s-metric-report.h
--- ns-3.43/src/mesh/model/dot11s/ie-dot11s-metric-report.h	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/model/dot11s/ie-dot11s-metric-report.h	2025-03-09 16:55:49.639372000 -0700
@@ -19,7 +19,7 @@
 namespace dot11s
 {
 /**
- * \brief a IEEE 802.11s Mesh ID 7.3.2.88 of 802.11s draft 3.0
+ * @brief a IEEE 802.11s Mesh ID 7.3.2.88 of 802.11s draft 3.0
  *
  */
 class IeLinkMetricReport : public WifiInformationElement
@@ -29,17 +29,17 @@
     /**
      * Constructor
      *
-     * \param metric the metric
+     * @param metric the metric
      */
     IeLinkMetricReport(uint32_t metric);
     /**
      * Set metric value
-     * \param metric the metric
+     * @param metric the metric
      */
     void SetMetric(uint32_t metric);
     /**
      * Get metric value
-     * \returns the metric
+     * @returns the metric
      */
     uint32_t GetMetric() const;
 
@@ -55,25 +55,25 @@
     /**
      * equality operator
      *
-     * \param a lhs
-     * \param b lhs
-     * \returns true if equal
+     * @param a lhs
+     * @param b lhs
+     * @returns true if equal
      */
     friend bool operator==(const IeLinkMetricReport& a, const IeLinkMetricReport& b);
     /**
      * greater than operator
      *
-     * \param a lhs
-     * \param b lhs
-     * \returns true if equal
+     * @param a lhs
+     * @param b lhs
+     * @returns true if equal
      */
     friend bool operator>(const IeLinkMetricReport& a, const IeLinkMetricReport& b);
     /**
      * less than operator
      *
-     * \param a lhs
-     * \param b lhs
-     * \returns true if equal
+     * @param a lhs
+     * @param b lhs
+     * @returns true if equal
      */
     friend bool operator<(const IeLinkMetricReport& a, const IeLinkMetricReport& b);
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/model/dot11s/ie-dot11s-peering-protocol.h ns-3.44/src/mesh/model/dot11s/ie-dot11s-peering-protocol.h
--- ns-3.43/src/mesh/model/dot11s/ie-dot11s-peering-protocol.h	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/model/dot11s/ie-dot11s-peering-protocol.h	2025-03-09 16:55:49.639372000 -0700
@@ -17,9 +17,9 @@
 {
 
 /**
- * \ingroup dot11s
+ * @ingroup dot11s
  *
- * \brief Mesh Peering Protocol Identifier information element
+ * @brief Mesh Peering Protocol Identifier information element
  * Note that it does not permit to set any value besides zero
  * (corresponding to mesh peering management protocol)
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/model/dot11s/ie-dot11s-peer-management.h ns-3.44/src/mesh/model/dot11s/ie-dot11s-peer-management.h
--- ns-3.43/src/mesh/model/dot11s/ie-dot11s-peer-management.h	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/model/dot11s/ie-dot11s-peer-management.h	2025-03-09 16:55:49.639372000 -0700
@@ -18,8 +18,8 @@
 {
 
 /**
- * \ingroup dot11s
- * \brief Codes used by 802.11s Peer Management Protocol
+ * @ingroup dot11s
+ * @brief Codes used by 802.11s Peer Management Protocol
  */
 enum PmpReasonCode
 {
@@ -51,56 +51,56 @@
 
     /**
      * Set peer open function
-     * \param localLinkId
+     * @param localLinkId
      */
     void SetPeerOpen(uint16_t localLinkId);
     /**
      * Set peer close function
-     * \param localLinkID the local link id
-     * \param peerLinkId the peer link id
-     * \param reasonCode the reason code
+     * @param localLinkID the local link id
+     * @param peerLinkId the peer link id
+     * @param reasonCode the reason code
      */
     void SetPeerClose(uint16_t localLinkID, uint16_t peerLinkId, PmpReasonCode reasonCode);
     /**
      * Set peer confirm function
-     * \param localLinkID the local link id
-     * \param peerLinkId the peer link id
+     * @param localLinkID the local link id
+     * @param peerLinkId the peer link id
      */
     void SetPeerConfirm(uint16_t localLinkID, uint16_t peerLinkId);
 
     /**
      * Get reason code function
-     * \returns the reason code
+     * @returns the reason code
      */
     PmpReasonCode GetReasonCode() const;
     /**
      * Get local link ID function
-     * \returns the local link id
+     * @returns the local link id
      */
     uint16_t GetLocalLinkId() const;
     /**
      * Get peer link ID function
-     * \returns the peer link ID
+     * @returns the peer link ID
      */
     uint16_t GetPeerLinkId() const;
     /**
      * Subtype is open function
-     * \returns true if open
+     * @returns true if open
      */
     bool SubtypeIsOpen() const;
     /**
      * Subtype is close function
-     * \returns true if closed
+     * @returns true if closed
      */
     bool SubtypeIsClose() const;
     /**
      * Subtype is confirm function
-     * \returns true if the subtype is confirm
+     * @returns true if the subtype is confirm
      */
     bool SubtypeIsConfirm() const;
     /**
      * Get subtype function
-     * \returns the subtype
+     * @returns the subtype
      */
     uint8_t GetSubtype() const;
 
@@ -126,9 +126,9 @@
     /**
      * equality operator
      *
-     * \param a lhs
-     * \param b rhs
-     * \returns true if equal
+     * @param a lhs
+     * @param b rhs
+     * @returns true if equal
      */
     friend bool operator==(const IePeerManagement& a, const IePeerManagement& b);
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/model/dot11s/ie-dot11s-perr.h ns-3.44/src/mesh/model/dot11s/ie-dot11s-perr.h
--- ns-3.43/src/mesh/model/dot11s/ie-dot11s-perr.h	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/model/dot11s/ie-dot11s-perr.h	2025-03-09 16:55:49.639372000 -0700
@@ -19,8 +19,8 @@
 namespace dot11s
 {
 /**
- * \ingroup dot11s
- * \brief See 7.3.2.98 of 802.11s draft 2.07
+ * @ingroup dot11s
+ * @brief See 7.3.2.98 of 802.11s draft 2.07
  */
 class IePerr : public WifiInformationElement
 {
@@ -29,27 +29,27 @@
     ~IePerr() override;
     /**
      * Get number of destination function
-     * \returns the number of destinations
+     * @returns the number of destinations
      */
     uint8_t GetNumOfDest() const;
     /**
      * Add address unit function
-     * \param unit the address of the failed destination
+     * @param unit the address of the failed destination
      */
     void AddAddressUnit(HwmpProtocol::FailedDestination unit);
     /**
      * Is full function
-     * \returns true if full
+     * @returns true if full
      */
     bool IsFull() const;
     /**
      * Get address unit vector function
-     * \returns the list of failed destinations
+     * @returns the list of failed destinations
      */
     std::vector<HwmpProtocol::FailedDestination> GetAddressUnitVector() const;
     /**
      * Delete address unit function
-     * \param address the MAC address of the deleted unit
+     * @param address the MAC address of the deleted unit
      */
     void DeleteAddressUnit(Mac48Address address);
     /// Reset PERR
@@ -67,9 +67,9 @@
     /**
      * equality operator
      *
-     * \param a lhs
-     * \param b rhs
-     * \returns true if equal
+     * @param a lhs
+     * @param b rhs
+     * @returns true if equal
      */
     friend bool operator==(const IePerr& a, const IePerr& b);
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/model/dot11s/ie-dot11s-prep.h ns-3.44/src/mesh/model/dot11s/ie-dot11s-prep.h
--- ns-3.43/src/mesh/model/dot11s/ie-dot11s-prep.h	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/model/dot11s/ie-dot11s-prep.h	2025-03-09 16:55:49.639372000 -0700
@@ -17,8 +17,8 @@
 namespace dot11s
 {
 /**
- * \ingroup dot11s
- * \brief See 7.3.2.97 of 802.11s draft 2.07
+ * @ingroup dot11s
+ * @brief See 7.3.2.97 of 802.11s draft 2.07
  */
 class IePrep : public WifiInformationElement
 {
@@ -27,93 +27,93 @@
     ~IePrep() override;
     /**
      * Set flags function
-     * \param flags the flags to set
+     * @param flags the flags to set
      */
     void SetFlags(uint8_t flags);
     /**
      * Set hop count function
-     * \param hopcount the hop count
+     * @param hopcount the hop count
      */
     void SetHopcount(uint8_t hopcount);
     /**
      * Set TTL function
-     * \param ttl the TTL
+     * @param ttl the TTL
      */
     void SetTtl(uint8_t ttl);
     /**
      * Set destination address function
-     * \param dest_address
+     * @param dest_address
      */
     void SetDestinationAddress(Mac48Address dest_address);
     /**
      * Set destination sequence number function
-     * \param dest_seq_number the destination sequence number
+     * @param dest_seq_number the destination sequence number
      */
     void SetDestinationSeqNumber(uint32_t dest_seq_number);
     /**
      * Set lifetime function
-     * \param lifetime the lifetime
+     * @param lifetime the lifetime
      */
     void SetLifetime(uint32_t lifetime);
     /**
      * Set metric function
-     * \param metric the metric to set
+     * @param metric the metric to set
      */
     void SetMetric(uint32_t metric);
     /**
      * Set originator address function
-     * \param originator_address the originator address
+     * @param originator_address the originator address
      */
     void SetOriginatorAddress(Mac48Address originator_address);
     /**
      * Set originator sequence number function
-     * \param originator_seq_number the originator sequence number
+     * @param originator_seq_number the originator sequence number
      */
     void SetOriginatorSeqNumber(uint32_t originator_seq_number);
 
     /**
      * Get flags function
-     * \returns the flags
+     * @returns the flags
      */
     uint8_t GetFlags() const;
     /**
      * Get hop count function
-     * \returns the hop count
+     * @returns the hop count
      */
     uint8_t GetHopcount() const;
     /**
      * Get TTL function
-     * \returns the TTL
+     * @returns the TTL
      */
     uint32_t GetTtl() const;
     /**
      * Get destination address function
-     * \returns the destination MAC address
+     * @returns the destination MAC address
      */
     Mac48Address GetDestinationAddress() const;
     /**
      * Get destination sequence number function
-     * \returns the destination sequence number
+     * @returns the destination sequence number
      */
     uint32_t GetDestinationSeqNumber() const;
     /**
      * Get lifetime function
-     * \returns the lifetime
+     * @returns the lifetime
      */
     uint32_t GetLifetime() const;
     /**
      * Get metric function
-     * \returns the metric
+     * @returns the metric
      */
     uint32_t GetMetric() const;
     /**
      * Get originator address function
-     * \returns the MAC address of the originator
+     * @returns the MAC address of the originator
      */
     Mac48Address GetOriginatorAddress() const;
     /**
      * Get originator sequence number
-     * \returns the originator sequence number
+     * @returns the originator sequence number
      */
     uint32_t GetOriginatorSeqNumber() const;
 
@@ -121,7 +121,7 @@
     void DecrementTtl();
     /**
      * Increment metric function
-     * \param metric the metric to increment
+     * @param metric the metric to increment
      */
     void IncrementMetric(uint32_t metric);
 
@@ -145,9 +145,9 @@
     /**
      * equality operator
      *
-     * \param a lhs
-     * \param b rhs
-     * \returns true if equal
+     * @param a lhs
+     * @param b rhs
+     * @returns true if equal
      */
     friend bool operator==(const IePrep& a, const IePrep& b);
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/model/dot11s/ie-dot11s-preq.cc ns-3.44/src/mesh/model/dot11s/ie-dot11s-preq.cc
--- ns-3.43/src/mesh/model/dot11s/ie-dot11s-preq.cc	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/model/dot11s/ie-dot11s-preq.cc	2025-03-09 16:55:49.639372000 -0700
@@ -380,7 +380,7 @@
             return;
         }
     }
-    /// \todo check overflow
+    /// @todo check overflow
     Ptr<DestinationAddressUnit> new_element = Create<DestinationAddressUnit>();
     new_element->SetFlags(doFlag, rfFlag, (dest_seq_number == 0));
     new_element->SetDestinationAddress(dest_address);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/model/dot11s/ie-dot11s-preq.h ns-3.44/src/mesh/model/dot11s/ie-dot11s-preq.h
--- ns-3.43/src/mesh/model/dot11s/ie-dot11s-preq.h	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/model/dot11s/ie-dot11s-preq.h	2025-03-09 16:55:49.639372000 -0700
@@ -19,8 +19,8 @@
 namespace dot11s
 {
 /**
- * \ingroup dot11s
- * \brief Describes an address unit in PREQ information element
+ * @ingroup dot11s
+ * @brief Describes an address unit in PREQ information element
  * See 7.3.2.96 for more details
  */
 class DestinationAddressUnit : public SimpleRefCount<DestinationAddressUnit>
@@ -29,44 +29,44 @@
     DestinationAddressUnit();
     /**
      * Set flags function
-     * \param doFlag the DO flag
-     * \param rfFlag the RF flag
-     * \param usnFlag the USN flag
+     * @param doFlag the DO flag
+     * @param rfFlag the RF flag
+     * @param usnFlag the USN flag
      */
     void SetFlags(bool doFlag, bool rfFlag, bool usnFlag);
     /**
      * Set destination address function
-     * \param dest_address the destination MAC address
+     * @param dest_address the destination MAC address
      */
     void SetDestinationAddress(Mac48Address dest_address);
     /**
      * Set destination sequence number
-     * \param dest_seq_number the destination sequence number
+     * @param dest_seq_number the destination sequence number
      */
     void SetDestSeqNumber(uint32_t dest_seq_number);
     /**
      * Is do function
-     * \returns true if DO flag is set
+     * @returns true if DO flag is set
      */
     bool IsDo() const;
     /**
      * is RF function
-     * \returns true if RF flag is set
+     * @returns true if RF flag is set
      */
     bool IsRf() const;
     /**
      * Is USN function
-     * \returns true if USN flag set
+     * @returns true if USN flag set
      */
     bool IsUsn() const;
     /**
      * Get destination address function
-     * \returns the MAC address
+     * @returns the MAC address
      */
     Mac48Address GetDestinationAddress() const;
     /**
      * Get destination sequence number
-     * \returns the destination sequence number
+     * @returns the destination sequence number
      */
     uint32_t GetDestSeqNumber() const;
 
@@ -80,16 +80,16 @@
     /**
      * equality operator
      *
-     * \param a lhs
-     * \param b rhs
-     * \returns true if equal
+     * @param a lhs
+     * @param b rhs
+     * @returns true if equal
      */
     friend bool operator==(const DestinationAddressUnit& a, const DestinationAddressUnit& b);
 };
 
 /**
- * \ingroup dot11s
- * \brief See 7.3.2.96 of 802.11s draft 2.07
+ * @ingroup dot11s
+ * @brief See 7.3.2.96 of 802.11s draft 2.07
  */
 class IePreq : public WifiInformationElement
 {
@@ -100,10 +100,10 @@
      * Add a destination address unit: flags, destination and sequence
      * number
      *
-     * \param doFlag
-     * \param rfFlag
-     * \param dest_address
-     * \param dest_seq_number
+     * @param doFlag
+     * @param rfFlag
+     * @param dest_address
+     * @param dest_seq_number
      */
     void AddDestinationAddressElement(bool doFlag,
                                       bool rfFlag,
@@ -111,20 +111,20 @@
                                       uint32_t dest_seq_number);
     /**
      * Delete a destination address unit by destination
-     * \param dest_address the destination address
+     * @param dest_address the destination address
      */
     void DelDestinationAddressElement(Mac48Address dest_address);
     /// Clear PREQ: remove all destinations
     void ClearDestinationAddressElements();
     /**
      * Get all destinations, which are stored in PREQ:
-     * \returns the list of destination addresses
+     * @returns the list of destination addresses
      */
     std::vector<Ptr<DestinationAddressUnit>> GetDestinationList();
     /// Set flag indicating that PREQ is unicast
     void SetUnicastPreq();
     /**
-     * \brief Set Proactive PREP subfield to off
+     * @brief Set Proactive PREP subfield to off
      */
     void SetNeedNotPrep();
 
@@ -132,94 +132,94 @@
     /**
      * Set number of hops from originator to mesh STA transmitting this
      * element
-     * \param hopcount the hop count
+     * @param hopcount the hop count
      */
     void SetHopcount(uint8_t hopcount);
     /**
      * Set remaining number of hops allowed for this element
-     * \param ttl the TTL
+     * @param ttl the TTL
      */
     void SetTTL(uint8_t ttl);
     /**
      * Set path discovery id field
-     * \param id some unique id for this path discovery
+     * @param id some unique id for this path discovery
      */
     void SetPreqID(uint32_t id);
     /**
      * Set originator address value
-     * \param originator_address the originator MAC address
+     * @param originator_address the originator MAC address
      */
     void SetOriginatorAddress(Mac48Address originator_address);
     /**
      * Set originator sequence number
-     * \param originator_seq_number
+     * @param originator_seq_number
      */
     void SetOriginatorSeqNumber(uint32_t originator_seq_number);
     /**
      * Set lifetime in TUs for the forwarding information to be considered valid
-     * \param lifetime the lifetime in TUs
+     * @param lifetime the lifetime in TUs
      */
     void SetLifetime(uint32_t lifetime);
     /**
      * Set metric value
-     * \param metric the metric
+     * @param metric the metric
      */
     void SetMetric(uint32_t metric);
     /**
      * Set destination count value
-     * \param dest_count the destination count
+     * @param dest_count the destination count
      */
     void SetDestCount(uint8_t dest_count);
 
     // Getters for fields:
     /**
      * Is unicast PREQ function
-     * \returns true if unicast PREQ
+     * @returns true if unicast PREQ
      */
     bool IsUnicastPreq() const;
     /**
      * Check whether Proactive PREP subfield to off
-     * \returns true if need not Proactive PREP subfield is off
+     * @returns true if need not Proactive PREP subfield is off
      */
     bool IsNeedNotPrep() const;
     /**
      * Get hop count value
-     * \returns the hop count
+     * @returns the hop count
      */
     uint8_t GetHopCount() const;
     /**
      * Get TTL value
-     * \returns the TTL
+     * @returns the TTL
      */
     uint8_t GetTtl() const;
     /**
      * Get path discovery id field
-     * \returns the path discovery ID
+     * @returns the path discovery ID
      */
     uint32_t GetPreqID() const;
     /**
      * Get originator address value
-     * \returns the originator MAC address
+     * @returns the originator MAC address
      */
     Mac48Address GetOriginatorAddress() const;
     /**
      * Get originator sequence number value
-     * \returns the originator sequence number
+     * @returns the originator sequence number
      */
     uint32_t GetOriginatorSeqNumber() const;
     /**
      * Get lifetime value
-     * \returns the lifetime in TUs
+     * @returns the lifetime in TUs
      */
     uint32_t GetLifetime() const;
     /**
      * Get metric value
-     * \returns the metric
+     * @returns the metric
      */
     uint32_t GetMetric() const;
     /**
      * Get destination count
-     * \returns the destination count
+     * @returns the destination count
      */
     uint8_t GetDestCount() const;
 
@@ -227,19 +227,19 @@
     void DecrementTtl();
     /**
      * Handle Metric:
-     * \param metric the mteric to increment
+     * @param metric the mteric to increment
      */
     void IncrementMetric(uint32_t metric);
     /**
-     * \brief Checks that preq's originator address equals to originator, and
+     * @brief Checks that preq's originator address equals to originator, and
      * this preq is not proactive
-     * \param originator the originator address
-     * \returns true if it may add
+     * @param originator the originator address
+     * @returns true if it may add
      */
     bool MayAddAddress(Mac48Address originator);
     /**
      * Is full function
-     * \returns true if full
+     * @returns true if full
      */
     bool IsFull() const;
 
@@ -253,7 +253,7 @@
   private:
     /**
      * how many destinations we support
-     * \todo make as an attribute
+     * @todo make as an attribute
      */
     uint8_t m_maxSize;
 
@@ -271,9 +271,9 @@
     /**
      * equality operator
      *
-     * \param a lhs
-     * \param b rhs
-     * \returns true if equal
+     * @param a lhs
+     * @param b rhs
+     * @returns true if equal
      */
     friend bool operator==(const IePreq& a, const IePreq& b);
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/model/dot11s/ie-dot11s-rann.h ns-3.44/src/mesh/model/dot11s/ie-dot11s-rann.h
--- ns-3.43/src/mesh/model/dot11s/ie-dot11s-rann.h	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/model/dot11s/ie-dot11s-rann.h	2025-03-09 16:55:49.639372000 -0700
@@ -17,8 +17,8 @@
 namespace dot11s
 {
 /**
- * \ingroup dot11s
- * \brief Root announcement (RANN) element
+ * @ingroup dot11s
+ * @brief Root announcement (RANN) element
  */
 class IeRann : public WifiInformationElement
 {
@@ -27,71 +27,71 @@
     ~IeRann() override;
     /**
      * Set flags field
-     * \param flags the flags value to set
+     * @param flags the flags value to set
      */
     void SetFlags(uint8_t flags);
     /**
      * Set hop count value to number of hops from the originating root mesh
      * STA to the mesh STA transmitting this element
-     * \param hopcount the hop count
+     * @param hopcount the hop count
      */
     void SetHopcount(uint8_t hopcount);
     /**
      * Set TTL value to the remaining number of hops allowed
-     * \param ttl the TTL
+     * @param ttl the TTL
      */
     void SetTTL(uint8_t ttl);
     /**
      * Set originator address value
-     * \param originator_address the originator MAC address
+     * @param originator_address the originator MAC address
      */
     void SetOriginatorAddress(Mac48Address originator_address);
     /**
      * Set destination sequence number value
-     * \param dest_seq_number the destination sequence number
+     * @param dest_seq_number the destination sequence number
      */
     void SetDestSeqNumber(uint32_t dest_seq_number);
     /**
      * Set metric value to cumulative metric from originating root mesh STA
      * to the mesh STA transmitting the announcement
-     * \param metric the metric to set
+     * @param metric the metric to set
      */
     void SetMetric(uint32_t metric);
     /**
      * Get flags value
-     * \returns the flags
+     * @returns the flags
      */
     uint8_t GetFlags() const;
     /**
      * Get hop count value
-     * \returns the hop count
+     * @returns the hop count
      */
     uint8_t GetHopcount() const;
     /**
      * Get TTL value
-     * \returns the TTL
+     * @returns the TTL
      */
     uint8_t GetTtl() const;
     /**
      * Get originator address value
-     * \returns the MAC address of the originator
+     * @returns the MAC address of the originator
      */
     Mac48Address GetOriginatorAddress();
     /**
      * Get destination sequence number value
-     * \returns the destination sequence number
+     * @returns the destination sequence number
      */
     uint32_t GetDestSeqNumber() const;
     /**
      * Get metric value
-     * \returns the metric
+     * @returns the metric
      */
     uint32_t GetMetric() const;
     /// Decrement TTL function
     void DecrementTtl();
     /**
      * Increment metric
-     * \param metric the value to increment
+     * @param metric the value to increment
      */
     void IncrementMetric(uint32_t metric);
 
@@ -113,9 +113,9 @@
     /**
      * equality operator
      *
-     * \param a lhs
-     * \param b rhs
-     * \returns true if equal
+     * @param a lhs
+     * @param b rhs
+     * @returns true if equal
      */
     friend bool operator==(const IeRann& a, const IeRann& b);
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/model/dot11s/peer-link.cc ns-3.44/src/mesh/model/dot11s/peer-link.cc
--- ns-3.43/src/mesh/model/dot11s/peer-link.cc	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/model/dot11s/peer-link.cc	2025-03-09 16:55:49.639372000 -0700
@@ -80,8 +80,8 @@
       m_peerLinkId(0),
       m_assocId(0),
       m_peerAssocId(0),
-      m_lastBeacon(Seconds(0)),
-      m_beaconInterval(Seconds(0)),
+      m_lastBeacon(),
+      m_beaconInterval(),
       m_packetFail(0),
       m_state(IDLE),
       m_retryCounter(0),
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/model/dot11s/peer-link-frame.cc ns-3.44/src/mesh/model/dot11s/peer-link-frame.cc
--- ns-3.43/src/mesh/model/dot11s/peer-link-frame.cc	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/model/dot11s/peer-link-frame.cc	2025-03-09 16:55:49.639372000 -0700
@@ -43,7 +43,7 @@
 PeerLinkOpenStart::GetFields() const
 {
     PlinkOpenStartFields retval;
-    /// \todo protocol version:
+    /// @todo protocol version:
     retval.capability = m_capability;
     retval.rates = m_rates;
     retval.extendedRates = m_extendedRates;
@@ -169,7 +169,7 @@
 PeerLinkCloseStart::GetFields() const
 {
     PlinkCloseStartFields retval;
-    /// \todo protocol version:
+    /// @todo protocol version:
     retval.meshId = m_meshId;
 
     return retval;
@@ -258,7 +258,7 @@
 PeerLinkConfirmStart::GetFields() const
 {
     PlinkConfirmStartFields retval;
-    /// \todo protocol version:
+    /// @todo protocol version:
     retval.capability = m_capability;
     retval.aid = m_aid;
     retval.rates = m_rates;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/model/dot11s/peer-link-frame.h ns-3.44/src/mesh/model/dot11s/peer-link-frame.h
--- ns-3.43/src/mesh/model/dot11s/peer-link-frame.h	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/model/dot11s/peer-link-frame.h	2025-03-09 16:55:49.639372000 -0700
@@ -23,9 +23,9 @@
 namespace dot11s
 {
 /**
- * \ingroup dot11s
+ * @ingroup dot11s
  *
- * \brief 802.11s Peer link open management frame
+ * @brief 802.11s Peer link open management frame
  *
  * Peer link open start frame includes the following:
  * - Capability
@@ -42,7 +42,7 @@
     PeerLinkOpenStart(const PeerLinkOpenStart&) = delete;
     PeerLinkOpenStart& operator=(const PeerLinkOpenStart&) = delete;
 
-    /// \brief fields:
+    /// @brief fields:
     struct PlinkOpenStartFields
     {
         IePeeringProtocol protocol; ///< Peering protocol version - 3 octets
@@ -55,18 +55,18 @@
 
     /**
      * Set peer link open start fields
-     * \param fields PlinkOpenStartFields to set
+     * @param fields PlinkOpenStartFields to set
      */
     void SetPlinkOpenStart(PlinkOpenStartFields fields);
     /**
      * Get peer link open start fields
-     * \return PlinkOpenStartFields
+     * @return PlinkOpenStartFields
      */
     PlinkOpenStartFields GetFields() const;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     // Inherited from header:
@@ -86,9 +86,9 @@
     /**
      * equality operator
      *
-     * \param a lhs
-     * \param b rhs
-     * \returns true if equal
+     * @param a lhs
+     * @param b rhs
+     * @returns true if equal
      */
     friend bool operator==(const PeerLinkOpenStart& a, const PeerLinkOpenStart& b);
 };
@@ -96,9 +96,9 @@
 bool operator==(const PeerLinkOpenStart& a, const PeerLinkOpenStart& b);
 
 /**
- * \ingroup dot11s
+ * @ingroup dot11s
  *
- * \brief 802.11s Peer link close management frame
+ * @brief 802.11s Peer link close management frame
  *
  * Peer link close frame includes the following:
  * - Mesh ID of mesh
@@ -112,7 +112,7 @@
     PeerLinkCloseStart(const PeerLinkCloseStart&) = delete;
     PeerLinkCloseStart& operator=(const PeerLinkCloseStart&) = delete;
 
-    /// \brief fields:
+    /// @brief fields:
     struct PlinkCloseStartFields
     {
         IePeeringProtocol protocol; ///< Peering protocol version - 3 octets
@@ -121,18 +121,18 @@
 
     /**
      * Set peer link close start fields
-     * \param fields PlinkCloseStartFields to set
+     * @param fields PlinkCloseStartFields to set
      */
     void SetPlinkCloseStart(PlinkCloseStartFields fields);
     /**
      * Get peer link close start fields
-     * \return PlinkOpenStartFields
+     * @return PlinkOpenStartFields
      */
     PlinkCloseStartFields GetFields() const;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     // Inherited from header:
@@ -148,9 +148,9 @@
     /**
      * equality operator
      *
-     * \param a lhs
-     * \param b rhs
-     * \returns true if equal
+     * @param a lhs
+     * @param b rhs
+     * @returns true if equal
      */
     friend bool operator==(const PeerLinkCloseStart& a, const PeerLinkCloseStart& b);
 };
@@ -158,9 +158,9 @@
 bool operator==(const PeerLinkCloseStart& a, const PeerLinkCloseStart& b);
 
 /**
- * \ingroup dot11s
+ * @ingroup dot11s
  *
- * \brief 802.11s Peer link confirm management frame
+ * @brief 802.11s Peer link confirm management frame
  *
  * Peer link confirm frame includes the following:
  * - Association ID field
@@ -176,7 +176,7 @@
     PeerLinkConfirmStart(const PeerLinkConfirmStart&) = delete;
     PeerLinkConfirmStart& operator=(const PeerLinkConfirmStart&) = delete;
 
-    /// \brief fields:
+    /// @brief fields:
     struct PlinkConfirmStartFields
     {
         IePeeringProtocol protocol; ///< Peering protocol version - 3 octets
@@ -189,18 +189,18 @@
 
     /**
      * Set peer link confirm start fields
-     * \param fields PlinkCloseStartFields to set
+     * @param fields PlinkCloseStartFields to set
      */
     void SetPlinkConfirmStart(PlinkConfirmStartFields fields);
     /**
      * Get peer link confirm start fields
-     * \return PlinkOpenStartFields
+     * @return PlinkOpenStartFields
      */
     PlinkConfirmStartFields GetFields() const;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     // Inherited from header:
@@ -220,9 +220,9 @@
     /**
      * equality operator
      *
-     * \param a lhs
-     * \param b rhs
-     * \returns true if equal
+     * @param a lhs
+     * @param b rhs
+     * @returns true if equal
      */
     friend bool operator==(const PeerLinkConfirmStart& a, const PeerLinkConfirmStart& b);
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/model/dot11s/peer-link.h ns-3.44/src/mesh/model/dot11s/peer-link.h
--- ns-3.43/src/mesh/model/dot11s/peer-link.h	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/model/dot11s/peer-link.h	2025-03-09 16:55:49.639372000 -0700
@@ -28,9 +28,9 @@
 class PeerManagementProtocolMac;
 
 /**
- * \ingroup dot11s
+ * @ingroup dot11s
  *
- * \brief Peer link model for 802.11s Peer Management protocol
+ * @brief Peer link model for 802.11s Peer Management protocol
  */
 class PeerLink : public Object
 {
@@ -38,8 +38,8 @@
     /// allow PeerManagementProtocol class friend access
     friend class PeerManagementProtocol;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     /// C-tor create empty link
@@ -64,93 +64,93 @@
     };
 
     /**
-     * \brief Literal names of Mesh Peer Management states for use in log messages
+     * @brief Literal names of Mesh Peer Management states for use in log messages
      */
     static const char* const PeerStateNames[6];
     /**
      * Process beacon received from peer
      *
-     * \param lastBeacon the last beacon
-     * \param BeaconInterval the beacon interval
+     * @param lastBeacon the last beacon
+     * @param BeaconInterval the beacon interval
      */
     void SetBeaconInformation(Time lastBeacon, Time BeaconInterval);
     /**
-     * \brief Method used to detect peer link changes
+     * @brief Method used to detect peer link changes
      *
-     * \param cb is a callback, which notifies, that on interface (uint32_t), peer link
+     * @param cb is a callback, which notifies, that on interface (uint32_t), peer link
      * with address (Mac48Address) was opened (bool is true) or closed (bool is false)
      */
     void SetLinkStatusCallback(Callback<void, uint32_t, Mac48Address, bool> cb);
-    /// \name Peer link getters/setters
+    /// @name Peer link getters/setters
     ///@{
     /**
      * Set the peer address
-     * \param macaddr the peer mac address
+     * @param macaddr the peer mac address
      */
     void SetPeerAddress(Mac48Address macaddr);
     /**
      * Set the peer mesh point address
-     * \param macaddr the peer mesh point address
+     * @param macaddr the peer mesh point address
      */
     void SetPeerMeshPointAddress(Mac48Address macaddr);
     /**
      * Set the interface
-     * \param interface the interface
+     * @param interface the interface
      */
     void SetInterface(uint32_t interface);
     /**
      * Set the local link ID
-     * \param id the local link ID
+     * @param id the local link ID
      */
     void SetLocalLinkId(uint16_t id);
     /**
      * Set the local association ID
-     * \param aid the local association ID
+     * @param aid the local association ID
      */
     void SetLocalAid(uint16_t aid);
     /**
      * Set the peer association ID
-     * \return The peer association ID
+     * @return The peer association ID
      */
     uint16_t GetPeerAid() const;
     /**
      * Set the beacon timing element
-     * \param beaconTiming the beacon timing element
+     * @param beaconTiming the beacon timing element
      */
     void SetBeaconTimingElement(IeBeaconTiming beaconTiming);
     /**
      * Get the peer address
-     * \return The peer address
+     * @return The peer address
      */
     Mac48Address GetPeerAddress() const;
     /**
      * Get the local association ID
-     * \return The local association ID
+     * @return The local association ID
      */
     uint16_t GetLocalAid() const;
     /**
      * Get the time of the last received beacon
-     * \return The time of the last received beacon
+     * @return The time of the last received beacon
      */
     Time GetLastBeacon() const;
     /**
      * Get the beacon interval
-     * \return The beacon interval
+     * @return The beacon interval
      */
     Time GetBeaconInterval() const;
     /**
      * Get the beacon timing element
-     * \return The beacon timing element
+     * @return The beacon timing element
      */
     IeBeaconTiming GetBeaconTimingElement() const;
     // IePeerManagement GetPeerLinkDescriptorElement ()const;
     ///@}
 
-    /// \name MLME
+    /// @name MLME
     ///@{
     /**
      * MLME-CancelPeerLink.request
-     * \param reason the reason for the request
+     * @param reason the reason for the request
      */
     void MLMECancelPeerLink(PmpReasonCode reason);
     /// MLME-ActivePeerLinkOpen.request
@@ -167,7 +167,7 @@
         SignalStatusCallback;
     /**
      * Set callback
-     * \param cb the callback function
+     * @param cb the callback function
      */
     void MLMESetSignalStatusCallback(SignalStatusCallback cb);
     /// Reports about transmission success/failure
@@ -176,8 +176,8 @@
     ///@}
 
     /**
-     * \brief Statistics
-     * \param os the output stream
+     * @brief Statistics
+     * @param os the output stream
      */
     void Report(std::ostream& os) const;
 
@@ -202,14 +202,14 @@
     /**
      * State transition
      *
-     * \param event the event to update the state machine
-     * \param reasoncode the reason for the state transition
+     * @param event the event to update the state machine
+     * @param reasoncode the reason for the state transition
      */
     void StateMachine(PeerEvent event, PmpReasonCode = REASON11S_RESERVED);
     /**
-     * \name Link response to received management frames
+     * @name Link response to received management frames
      *
-     * \attention In all this methods {local/peer}LinkID correspond to _peer_ station, as written in
+     * @attention In all this methods {local/peer}LinkID correspond to _peer_ station, as written in
      * received frame, e.g. I am peerLinkID and peer link is localLinkID .
      *
      */
@@ -217,26 +217,26 @@
     /**
      * Close link
      *
-     * \param localLinkID the local link ID
-     * \param peerLinkID the peer link ID
-     * \param reason the reason to close
+     * @param localLinkID the local link ID
+     * @param peerLinkID the peer link ID
+     * @param reason the reason to close
      */
     void Close(uint16_t localLinkID, uint16_t peerLinkID, PmpReasonCode reason);
     /**
      * Accept open link
      *
-     * \param localLinkId the local link ID
-     * \param conf the IE configuration
-     * \param peerMp the peer MP
+     * @param localLinkId the local link ID
+     * @param conf the IE configuration
+     * @param peerMp the peer MP
      */
     void OpenAccept(uint16_t localLinkId, IeConfiguration conf, Mac48Address peerMp);
     /**
      * Reject open link
      *
-     * \param localLinkId the local link ID
-     * \param conf the IE configuration
-     * \param peerMp the peer MP
-     * \param reason the reason to close
+     * @param localLinkId the local link ID
+     * @param conf the IE configuration
+     * @param peerMp the peer MP
+     * @param reason the reason to close
      */
     void OpenReject(uint16_t localLinkId,
                     IeConfiguration conf,
@@ -245,11 +245,11 @@
     /**
      * Confirm accept
      *
-     * \param localLinkId the local link ID
-     * \param peerLinkId the peer link ID
-     * \param peerAid the peer AID
-     * \param conf the IE configuration
-     * \param peerMp the peer MP
+     * @param localLinkId the local link ID
+     * @param peerLinkId the peer link ID
+     * @param peerAid the peer AID
+     * @param conf the IE configuration
+     * @param peerMp the peer MP
      */
     void ConfirmAccept(uint16_t localLinkId,
                        uint16_t peerLinkId,
@@ -259,11 +259,11 @@
     /**
      * Confirm reject
      *
-     * \param localLinkId the local link ID
-     * \param peerLinkId the peer link ID
-     * \param conf the IE configuration
-     * \param peerMp the peer MP
-     * \param reason the reason to close
+     * @param localLinkId the local link ID
+     * @param peerLinkId the peer link ID
+     * @param conf the IE configuration
+     * @param peerMp the peer MP
+     * @param reason the reason to close
      */
     void ConfirmReject(uint16_t localLinkId,
                        uint16_t peerLinkId,
@@ -273,21 +273,21 @@
     ///@}
 
     /**
-     * \returns True if link is established
+     * @returns True if link is established
      */
     bool LinkIsEstab() const;
     /**
-     * \returns True if link is idle. Link can be deleted in this state
+     * @returns True if link is idle. Link can be deleted in this state
      */
     bool LinkIsIdle() const;
     /**
      * Set pointer to MAC-plugin, which is responsible for sending peer
      * link management frames
-     * \param plugin the peer management protocol MAC
+     * @param plugin the peer management protocol MAC
      */
     void SetMacPlugin(Ptr<PeerManagementProtocolMac> plugin);
     /**
-     * \name Event handlers
+     * @name Event handlers
      */
     ///@{
     /// Clear the retry timer
@@ -305,12 +305,12 @@
     ///@}
 
     /**
-     * \name Work with management frames
+     * @name Work with management frames
      */
     ///@{
     /**
      * Send a peer link close
-     * \param reasoncode reason for closing the line
+     * @param reasoncode reason for closing the line
      */
     void SendPeerLinkClose(PmpReasonCode reasoncode);
     /// Send a peer link open
@@ -320,7 +320,7 @@
     ///@}
 
     /**
-     * \name Timeout handlers
+     * @name Timeout handlers
      */
     ///@{
     /// Holding Timeout event handler
@@ -363,15 +363,15 @@
     /// Current state
     PeerState m_state;
     /**
-     * \brief Mesh interface configuration
-     * \attention Is not used now, nothing to configure :)
+     * @brief Mesh interface configuration
+     * @attention Is not used now, nothing to configure :)
      */
     IeConfiguration m_configuration;
     /// Beacon timing element received from the peer. Needed by BCA
     IeBeaconTiming m_beaconTiming;
 
     /**
-     * \name Timers & counters used for internal state transitions
+     * @name Timers & counters used for internal state transitions
      */
     ///@{
     uint16_t m_dot11MeshMaxRetries; //!< Maximum number of retries
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/model/dot11s/peer-management-protocol.cc ns-3.44/src/mesh/model/dot11s/peer-management-protocol.cc
--- ns-3.43/src/mesh/model/dot11s/peer-management-protocol.cc	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/model/dot11s/peer-management-protocol.cc	2025-03-09 16:55:49.639372000 -0700
@@ -149,7 +149,7 @@
     {
         // If we do not know peer Assoc Id, we shall not add any info
         // to a beacon timing element
-        if ((*i)->GetBeaconInterval() == Seconds(0))
+        if ((*i)->GetBeaconInterval().IsZero())
         {
             // No beacon was received, do not include to the beacon timing element
             continue;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/model/dot11s/peer-management-protocol.h ns-3.44/src/mesh/model/dot11s/peer-management-protocol.h
--- ns-3.43/src/mesh/model/dot11s/peer-management-protocol.h	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/model/dot11s/peer-management-protocol.h	2025-03-09 16:55:49.639372000 -0700
@@ -36,9 +36,9 @@
 class IeConfiguration;
 
 /**
- * \ingroup dot11s
+ * @ingroup dot11s
  *
- * \brief 802.11s Peer Management Protocol model
+ * @brief 802.11s Peer Management Protocol model
  */
 class PeerManagementProtocol : public Object
 {
@@ -51,15 +51,15 @@
     PeerManagementProtocol& operator=(const PeerManagementProtocol&) = delete;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     void DoDispose() override;
     /**
-     * \brief Install PMP on given mesh point.
-     * \param mp the MeshPointDevice to install onto
-     * \return true if successful
+     * @brief Install PMP on given mesh point.
+     * @param mp the MeshPointDevice to install onto
+     * @return true if successful
      *
      * Installing protocol causes installation of its interface MAC plugins.
      *
@@ -68,24 +68,24 @@
      */
     bool Install(Ptr<MeshPointDevice> mp);
     /**
-     * \brief Methods that handle beacon sending/receiving procedure.
+     * @brief Methods that handle beacon sending/receiving procedure.
      *
-     * \name This methods interact with MAC_layer plug-in
+     * @name This methods interact with MAC_layer plug-in
      */
     ///@{
     /**
-     * \brief When we are sending a beacon - we fill beacon timing
+     * @brief When we are sending a beacon - we fill beacon timing
      * element
-     * \return IeBeaconTiming is a beacon timing element that should be present in beacon
-     * \param interface is a interface sending a beacon
+     * @return IeBeaconTiming is a beacon timing element that should be present in beacon
+     * @param interface is a interface sending a beacon
      */
     Ptr<IeBeaconTiming> GetBeaconTimingElement(uint32_t interface);
     /**
-     * \brief To initiate peer link we must notify about received beacon
-     * \param interface the interface where a beacon was received from
-     * \param peerAddress address of station, which sent a beacon
-     * \param beaconInterval beacon interval (needed by beacon loss counter)
-     * \param beaconTiming beacon timing element (needed by BCA)
+     * @brief To initiate peer link we must notify about received beacon
+     * @param interface the interface where a beacon was received from
+     * @param peerAddress address of station, which sent a beacon
+     * @param beaconInterval beacon interval (needed by beacon loss counter)
+     * @param beaconTiming beacon timing element (needed by BCA)
      */
     void ReceiveBeacon(uint32_t interface,
                        Mac48Address peerAddress,
@@ -94,19 +94,19 @@
     ///@}
 
     /**
-     * \name Methods that handle Peer link management frames interaction:
+     * @name Methods that handle Peer link management frames interaction:
      */
     ///@{
     /**
      * Deliver Peer link management information to the protocol-part
-     * \param interface is a interface ID of a given MAC (interfaceID rather than MAC address,
+     * @param interface is a interface ID of a given MAC (interfaceID rather than MAC address,
      * because many interfaces may have the same MAC)
-     * \param peerAddress is address of peer
-     * \param peerMeshPointAddress is address of peer mesh point device (equal to peer address when
+     * @param peerAddress is address of peer
+     * @param peerMeshPointAddress is address of peer mesh point device (equal to peer address when
      * only one interface)
-     * \param aid is association ID, which peer has assigned to us
-     * \param peerManagementElement is peer link management element
-     * \param meshConfig is mesh configuration element taken from the peer management frame
+     * @param aid is association ID, which peer has assigned to us
+     * @param peerManagementElement is peer link management element
+     * @param meshConfig is mesh configuration element taken from the peer management frame
      */
     void ReceivePeerLinkFrame(uint32_t interface,
                               Mac48Address peerAddress,
@@ -115,101 +115,101 @@
                               IePeerManagement peerManagementElement,
                               IeConfiguration meshConfig);
     /**
-     * \brief Cancels peer link due to broken configuration (Mesh ID or Supported
+     * @brief Cancels peer link due to broken configuration (Mesh ID or Supported
      * rates)
-     * \param interface interface of the link to cancel
-     * \param peerAddress peer address of the link to cancel
+     * @param interface interface of the link to cancel
+     * @param peerAddress peer address of the link to cancel
      */
     void ConfigurationMismatch(uint32_t interface, Mac48Address peerAddress);
     /**
-     * \brief Cancels peer link due to successive transmission failures
-     * \param interface interface of the link to cancel
-     * \param peerAddress peer address of the link to cancel
+     * @brief Cancels peer link due to successive transmission failures
+     * @param interface interface of the link to cancel
+     * @param peerAddress peer address of the link to cancel
      */
     void TransmissionFailure(uint32_t interface, const Mac48Address peerAddress);
     /**
-     * \brief resets transmission failure statistics
-     * \param interface interface of the link to reset
-     * \param peerAddress peer address of the link to reset
+     * @brief resets transmission failure statistics
+     * @param interface interface of the link to reset
+     * @param peerAddress peer address of the link to reset
      */
     void TransmissionSuccess(uint32_t interface, const Mac48Address peerAddress);
     /**
-     * \brief Checks if there is established link
-     * \param interface interface of the link to check
-     * \param peerAddress peer address of the link to check
-     * \return true if the link is active
+     * @brief Checks if there is established link
+     * @param interface interface of the link to check
+     * @param peerAddress peer address of the link to check
+     * @return true if the link is active
      */
     bool IsActiveLink(uint32_t interface, Mac48Address peerAddress);
     ///@}
 
-    /// \name Interface to other protocols (MLME)
+    /// @name Interface to other protocols (MLME)
     ///@{
     /**
      * Set peer link status change callback
-     * \param cb the callback
+     * @param cb the callback
      */
     void SetPeerLinkStatusCallback(Callback<void, Mac48Address, Mac48Address, uint32_t, bool> cb);
     /**
      * Find active peer link by my interface and peer interface MAC
-     * \param interface interface of the link to find
-     * \param peerAddress peer address of the link to find
-     * \return The peer link (null if not found)
+     * @param interface interface of the link to find
+     * @param peerAddress peer address of the link to find
+     * @return The peer link (null if not found)
      */
     Ptr<PeerLink> FindPeerLink(uint32_t interface, Mac48Address peerAddress);
     /**
      * Get list of all active peer links
-     * \return a list of all the active peer links
+     * @return a list of all the active peer links
      */
     std::vector<Ptr<PeerLink>> GetPeerLinks() const;
     /**
      * Get list of active peers of my given interface
-     * \param interface the interface
-     * \return a list of all the active peer links on an interface
+     * @param interface the interface
+     * @return a list of all the active peer links on an interface
      */
     std::vector<Mac48Address> GetPeers(uint32_t interface) const;
     /**
      * Get mesh point address. \todo this used by plugins only. Now MAC plugins can ask MP address
      * directly from main MAC
      *
-     * \return Mac48Address
+     * @return Mac48Address
      */
     Mac48Address GetAddress();
     /**
      * Get number of links
-     * \returns the number of links
+     * @returns the number of links
      */
     uint8_t GetNumberOfLinks() const;
     /**
      * Set mesh ID to a string value
-     * \param s the mesh ID string value
+     * @param s the mesh ID string value
      */
     void SetMeshId(std::string s);
     /**
      * Get mesh ID information element
-     * \returns the mesh ID information element
+     * @returns the mesh ID information element
      */
     Ptr<IeMeshId> GetMeshId() const;
     /**
      * Enable or disable beacon collision avoidance
-     * \param enable true to enable beacon collision avoidance
+     * @param enable true to enable beacon collision avoidance
      */
     void SetBeaconCollisionAvoidance(bool enable);
     /**
      * Get beacon collision avoidance
-     * \returns the beacon collision avoidance flag
+     * @returns the beacon collision avoidance flag
      */
     bool GetBeaconCollisionAvoidance() const;
     /**
      * Notify about beacon send event, needed to schedule BCA
-     * \param interface the interface to use
-     * \param beaconInterval the beacon interval
+     * @param interface the interface to use
+     * @param beaconInterval the beacon interval
      */
     void NotifyBeaconSent(uint32_t interface, Time beaconInterval);
     ///@}
 
     /**
-     * \brief Report statistics
-     * \param os the output stream
+     * @brief Report statistics
+     * @param os the output stream
      */
     void Report(std::ostream& os) const;
     /// Reset statistics function
@@ -219,16 +219,16 @@
      * used by this model.  Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream);
 
     /**
      * TracedCallback signature for link open/close events.
      *
-     * \param [in] src MAC address of source interface.
-     * \param [in] dst MAC address of destination interface.
+     * @param [in] src MAC address of source interface.
+     * @param [in] dst MAC address of destination interface.
      */
     typedef void (*LinkOpenCloseTracedCallback)(Mac48Address src, const Mac48Address dst);
 
@@ -252,46 +252,46 @@
     typedef std::map<uint32_t, PeerLinksOnInterface> PeerLinksMap;
     /// This map keeps relationship between peer address and its beacon information
     typedef std::map<Mac48Address, BeaconInfo> BeaconsOnInterface;
-    /// \brief This map keeps beacon information on all interfaces
+    /// @brief This map keeps beacon information on all interfaces
     typedef std::map<uint32_t, BeaconsOnInterface> BeaconInfoMap;
-    /// \brief this vector keeps pointers to MAC-plugins
+    /// @brief this vector keeps pointers to MAC-plugins
     typedef std::map<uint32_t, Ptr<PeerManagementProtocolMac>> PeerManagementProtocolMacMap;
 
     /**
      * Initiate link function
      *
-     * \param interface the interface to use
-     * \param peerAddress the peer address
-     * \param peerMeshPointAddress the peer mesh point address
-     * \returns the peer link
+     * @param interface the interface to use
+     * @param peerAddress the peer address
+     * @param peerMeshPointAddress the peer mesh point address
+     * @returns the peer link
      */
     Ptr<PeerLink> InitiateLink(uint32_t interface,
                                Mac48Address peerAddress,
                                Mac48Address peerMeshPointAddress);
     /**
-     * \brief External peer-chooser
-     * \param interface the interface to use
-     * \param peerAddress the peer address
-     * \returns true is should send an open
+     * @brief External peer-chooser
+     * @param interface the interface to use
+     * @param peerAddress the peer address
+     * @returns true is should send an open
      */
     bool ShouldSendOpen(uint32_t interface, Mac48Address peerAddress) const;
     /**
-     * \brief External peer-chooser
-     * \param interface the interface to use
-     * \param peerAddress the peer address
-     * \param reasonCode reason code
-     * \returns true is should send an open
+     * @brief External peer-chooser
+     * @param interface the interface to use
+     * @param peerAddress the peer address
+     * @param reasonCode reason code
+     * @returns true is should send an open
      */
     bool ShouldAcceptOpen(uint32_t interface,
                           Mac48Address peerAddress,
                           PmpReasonCode& reasonCode) const;
     /**
-     * \brief Indicates changes in peer links
-     * \param interface the interface
-     * \param peerAddress the peer address
-     * \param peerMeshPointAddress the peer mesh point address
-     * \param ostate old state
-     * \param nstate new state
+     * @brief Indicates changes in peer links
+     * @param interface the interface
+     * @param peerAddress the peer address
+     * @param peerMeshPointAddress the peer mesh point address
+     * @param ostate old state
+     * @param nstate new state
      */
     void PeerLinkStatus(uint32_t interface,
                         Mac48Address peerAddress,
@@ -299,34 +299,34 @@
                         PeerLink::PeerState ostate,
                         PeerLink::PeerState nstate);
     /**
-     * \brief BCA
-     * \param interface interface
+     * @brief BCA
+     * @param interface interface
      */
     void CheckBeaconCollisions(uint32_t interface);
     /**
      * Shift own beacon function
-     * \param interface interface
+     * @param interface interface
      */
     void ShiftOwnBeacon(uint32_t interface);
     /**
-     * \brief Time<-->TU converters:
-     * \param x TU
-     * \return Time
+     * @brief Time<-->TU converters:
+     * @param x TU
+     * @return Time
      */
     Time TuToTime(int x);
     /**
-     * \brief Time<-->TU converters:
-     * \param x Time
-     * \return TU
+     * @brief Time<-->TU converters:
+     * @param x Time
+     * @return TU
      */
     int TimeToTu(Time x);
 
     /**
      * Aux. method to register open links
-     * \param peerMp peer mesh point address
-     * \param peerIface peer address
-     * \param myIface my address
-     * \param interface interface
+     * @param peerMp peer mesh point address
+     * @param peerIface peer address
+     * @param myIface my address
+     * @param interface interface
      */
     void NotifyLinkOpen(Mac48Address peerMp,
                         Mac48Address peerIface,
@@ -334,10 +334,10 @@
                         uint32_t interface);
     /**
      * Aux. method to register closed links
-     * \param peerMp peer mesh point address
-     * \param peerIface peer address
-     * \param myIface my address
-     * \param interface interface
+     * @param peerMp peer mesh point address
+     * @param peerIface peer address
+     * @param myIface my address
+     * @param interface interface
      */
     void NotifyLinkClose(Mac48Address peerMp,
                          Mac48Address peerIface,
@@ -362,11 +362,11 @@
     std::map<uint32_t, Time> m_beaconInterval;
 
     /**
-     * \name Peer Links
+     * @name Peer Links
      */
     PeerLinksMap m_peerLinks;
     /**
-     * \brief Callback to notify about peer link changes:
+     * @brief Callback to notify about peer link changes:
      * Mac48Address is peer address of mesh point,
      * Mac48Address is peer address of interface,
      * uint32_t - interface ID,
@@ -391,12 +391,12 @@
         /**
          * Constructor
          *
-         * \param t
+         * @param t
          */
         Statistics(uint16_t t = 0);
         /**
          * Print function
-         * \param os the output stream to print to
+         * @param os the output stream to print to
          */
         void Print(std::ostream& os) const;
     };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/model/dot11s/peer-management-protocol-mac.cc ns-3.44/src/mesh/model/dot11s/peer-management-protocol-mac.cc
--- ns-3.43/src/mesh/model/dot11s/peer-management-protocol-mac.cc	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/model/dot11s/peer-management-protocol-mac.cc	2025-03-09 16:55:49.639372000 -0700
@@ -361,7 +361,7 @@
 void
 PeerManagementProtocolMac::SetBeaconShift(Time shift)
 {
-    if (shift != Seconds(0))
+    if (!shift.IsZero())
     {
         m_stats.beaconShift++;
     }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/model/dot11s/peer-management-protocol-mac.h ns-3.44/src/mesh/model/dot11s/peer-management-protocol-mac.h
--- ns-3.43/src/mesh/model/dot11s/peer-management-protocol-mac.h	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/model/dot11s/peer-management-protocol-mac.h	2025-03-09 16:55:49.639372000 -0700
@@ -25,9 +25,9 @@
 class PeerManagementProtocol;
 
 /**
- * \ingroup dot11s
+ * @ingroup dot11s
  *
- * \brief This is plugin to Mesh WiFi MAC, which implements the
+ * @brief This is plugin to Mesh WiFi MAC, which implements the
  * interface to dot11s peer management protocol: it takes proper
  * frames from MAC-layer, extracts peer link management information
  * element and mesh configuration element and passes it to main part
@@ -39,8 +39,8 @@
     /**
      * Constructor
      *
-     * \param interface interface index
-     * \param protocol peer management protocol
+     * @param interface interface index
+     * @param protocol peer management protocol
      */
     PeerManagementProtocolMac(uint32_t interface, Ptr<PeerManagementProtocol> protocol);
     ~PeerManagementProtocolMac() override;
@@ -48,14 +48,14 @@
     // Inherited from plugin abstract class
     /**
      * Set pointer to parent
-     * \param parent Ptr<MeshWifiInterfaceMac>
+     * @param parent Ptr<MeshWifiInterfaceMac>
      */
     void SetParent(Ptr<MeshWifiInterfaceMac> parent) override;
     /**
      * Receive and process a packet
-     * \param packet the packet received
-     * \param header the header
-     * \returns true if received
+     * @param packet the packet received
+     * @param header the header
+     * @returns true if received
      */
     bool Receive(Ptr<Packet> packet, const WifiMacHeader& header) override;
     /**
@@ -63,11 +63,11 @@
      * it returns true if SELF_PROTECTED.  It then checks if it is either
      * a broadcast or sent on an active link, and returns true if so.
      * Otherwise, it returns false (indicating it is to be dropped)
-     * \param packet the packet
-     * \param header the header
-     * \param from the MAC address of the sender
-     * \param to the MAC address of the receiver
-     * \returns true if successful, false if to be dropped
+     * @param packet the packet
+     * @param header the header
+     * @param from the MAC address of the sender
+     * @param to the MAC address of the receiver
+     * @returns true if successful, false if to be dropped
      */
     bool UpdateOutcomingFrame(Ptr<Packet> packet,
                               WifiMacHeader& header,
@@ -75,29 +75,29 @@
                               Mac48Address to) override;
     /**
      * Add beacon timing and mesh ID information elements, and notify beacon sent
-     * \param beacon the beacon
+     * @param beacon the beacon
      */
     void UpdateBeacon(MeshWifiBeacon& beacon) const override;
     /**
      * Assign the streams
-     * \param stream the stream to assign
-     * \return the assigned stream
+     * @param stream the stream to assign
+     * @return the assigned stream
      */
     int64_t AssignStreams(int64_t stream) override;
 
-    /// \name Statistics
+    /// @name Statistics
     ///@{
     /**
-     * \brief Report statistics
-     * \param os the output stream
+     * @brief Report statistics
+     * @param os the output stream
      */
     void Report(std::ostream&) const;
     /// Reset stats
     void ResetStats();
     /**
      * Get the link metric
-     * \param peerAddress the peer address
-     * \return The metric
+     * @param peerAddress the peer address
+     * @return The metric
      */
     uint32_t GetLinkMetric(Mac48Address peerAddress);
     ///@}
@@ -106,8 +106,8 @@
     /**
      * assignment operator
      *
-     * \param peer the object to assign
-     * \returns the assigned value
+     * @param peer the object to assign
+     * @returns the assigned value
      */
     PeerManagementProtocolMac& operator=(const PeerManagementProtocolMac& peer);
     /// type conversion operator
@@ -118,10 +118,10 @@
     /// allow PeerLink class access friend access
     friend class PeerLink;
 
-    /// \name Create peer link management frames
+    /// @name Create peer link management frames
     // \{
     /**
-     * \brief This structure keeps all fields in peer link management frame,
+     * @brief This structure keeps all fields in peer link management frame,
      * which are not subclasses of WifiInformationElement
      */
     struct PlinkFrameStart
@@ -134,55 +134,55 @@
 
     /**
      * Create peer link open frame function
-     * \returns the packet
+     * @returns the packet
      */
     Ptr<Packet> CreatePeerLinkOpenFrame();
     /**
      * Create peer link confirm frame function
-     * \returns the packet
+     * @returns the packet
      */
     Ptr<Packet> CreatePeerLinkConfirmFrame();
     /**
      * Create peer link clode frame function
-     * \returns the packet
+     * @returns the packet
      */
     Ptr<Packet> CreatePeerLinkCloseFrame();
     /**
      * Parses the start of the frame, where no WifiInformationElements exist
-     * \param packet the packet
-     * \returns PlinkFrameStart
+     * @param packet the packet
+     * @returns PlinkFrameStart
      */
     PlinkFrameStart ParsePlinkFrame(Ptr<const Packet> packet);
     // \}
     /**
      *  Closes link when a proper number of successive transmissions have failed
-     * \param reason the reason why the MPDU was dropped
-     * \param mpdu the dropped MPDU
+     * @param reason the reason why the MPDU was dropped
+     * @param mpdu the dropped MPDU
      */
     void TxError(WifiMacDropReason reason, Ptr<const WifiMpdu> mpdu);
     /**
      * Transmit OK function
-     * \param mpdu the MPDU
+     * @param mpdu the MPDU
      */
     void TxOk(Ptr<const WifiMpdu> mpdu);
     // BCA functionality
     /**
      * Set beacon shift function
-     * \param shift the beacon time shift
+     * @param shift the beacon time shift
      */
     void SetBeaconShift(Time shift);
     /**
      * Set peer manager protocol function
-     * \param protocol the peer manager protocol
+     * @param protocol the peer manager protocol
      */
     void SetPeerManagerProtocol(Ptr<PeerManagementProtocol> protocol);
     /**
      * Send peer link management frame function
-     * \param peerAddress the peer MAC address
-     * \param peerMpAddress the peer MP address
-     * \param aid the AID
-     * \param peerElement IePeerManagement
-     * \param meshConfig IeConfiguration
+     * @param peerAddress the peer MAC address
+     * @param peerMpAddress the peer MP address
+     * @param aid the AID
+     * @param peerElement IePeerManagement
+     * @param meshConfig IeConfiguration
      */
     void SendPeerLinkManagementFrame(Mac48Address peerAddress,
                                      Mac48Address peerMpAddress,
@@ -190,8 +190,8 @@
                                      IePeerManagement peerElement,
                                      IeConfiguration meshConfig);
     /**
-     * \brief debug only, used to print established links
-     * \returns the MAC address
+     * @brief debug only, used to print established links
+     * @returns the MAC address
      */
     Mac48Address GetAddress() const;
 
@@ -216,14 +216,14 @@
         Statistics();
         /**
          * Print function
-         * \param os the output stream
+         * @param os the output stream
          */
         void Print(std::ostream& os) const;
     };
 
   private:
     Statistics m_stats; ///< statistics
-    /// \name Information about MAC and protocol:
+    /// @name Information about MAC and protocol:
     Ptr<MeshWifiInterfaceMac> m_parent;     ///< parent
     uint32_t m_ifIndex;                     ///< IF index
     Ptr<PeerManagementProtocol> m_protocol; ///< protocol
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/model/flame/flame-header.h ns-3.44/src/mesh/model/flame/flame-header.h
--- ns-3.43/src/mesh/model/flame/flame-header.h	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/model/flame/flame-header.h	2025-03-09 16:55:49.639372000 -0700
@@ -17,9 +17,9 @@
 namespace flame
 {
 /**
- * \ingroup flame
+ * @ingroup flame
  *
- * \brief Flame header
+ * @brief Flame header
  *
  * Header format: | Reserved: 1 | cost: 1 | Sequence number: 2 | OrigDst: 6 | OrigSrc: 6 | Flame
  * port : 2 |
@@ -32,8 +32,8 @@
     ~FlameHeader() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     // Inherited from Header class:
@@ -46,52 +46,52 @@
     // Seeters/Getters for fields:
     /**
      * Add cost value
-     * \param cost the cost
+     * @param cost the cost
      */
     void AddCost(uint8_t cost);
     /**
      * Get cost value
-     * \returns the cost
+     * @returns the cost
      */
     uint8_t GetCost() const;
     /**
      * Set sequence number value
-     * \param seqno the sequence number
+     * @param seqno the sequence number
      */
     void SetSeqno(uint16_t seqno);
     /**
      * Get sequence number value
-     * \returns the sequence number
+     * @returns the sequence number
      */
     uint16_t GetSeqno() const;
     /**
      * Set origin destination address
-     * \param dst the MAC address of the destination
+     * @param dst the MAC address of the destination
      */
     void SetOrigDst(Mac48Address dst);
     /**
      * Get origin destination address
-     * \returns the MAC address of the destination
+     * @returns the MAC address of the destination
      */
     Mac48Address GetOrigDst() const;
     /**
      * Set origin source function
-     * \param OrigSrc the MAC address of the origina source
+     * @param OrigSrc the MAC address of the origina source
      */
     void SetOrigSrc(Mac48Address OrigSrc);
     /**
      * Get origin source address
-     * \returns the MAC address of the origin source
+     * @returns the MAC address of the origin source
      */
     Mac48Address GetOrigSrc() const;
     /**
      * Set protocol value
-     * \param protocol the protocol
+     * @param protocol the protocol
      */
     void SetProtocol(uint16_t protocol);
     /**
      * Get protocol value
-     * \returns the protocol
+     * @returns the protocol
      */
     uint16_t GetProtocol() const;
 
@@ -104,9 +104,9 @@
     /**
      * equality operator
      *
-     * \param a lhs
-     * \param b rhs
-     * \returns true if equal
+     * @param a lhs
+     * @param b rhs
+     * @returns true if equal
      */
     friend bool operator==(const FlameHeader& a, const FlameHeader& b);
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/model/flame/flame-protocol.cc ns-3.44/src/mesh/model/flame/flame-protocol.cc
--- ns-3.43/src/mesh/model/flame/flame-protocol.cc	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/model/flame/flame-protocol.cc	2025-03-09 16:55:49.643372000 -0700
@@ -120,7 +120,7 @@
 FlameProtocol::FlameProtocol()
     : m_address(Mac48Address()),
       m_broadcastInterval(Seconds(5)),
-      m_lastBroadcast(Seconds(0)),
+      m_lastBroadcast(),
       m_maxCost(32),
       m_myLastSeqno(1),
       m_rtable(CreateObject<FlameRtable>())
@@ -296,8 +296,7 @@
     // Start PATH_UPDATE procedure if destination is our own address and last broadcast was sent
     // more than broadcast interval ago or was not sent at all
     if ((destination == GetAddress()) &&
-        ((m_lastBroadcast + m_broadcastInterval < Simulator::Now()) ||
-         (m_lastBroadcast == Seconds(0))))
+        ((m_lastBroadcast + m_broadcastInterval < Simulator::Now()) || m_lastBroadcast.IsZero()))
     {
         Ptr<Packet> packet = Create<Packet>();
         m_mp->Send(packet, Mac48Address::GetBroadcast(), 0);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/model/flame/flame-protocol.h ns-3.44/src/mesh/model/flame/flame-protocol.h
--- ns-3.43/src/mesh/model/flame/flame-protocol.h	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/model/flame/flame-protocol.h	2025-03-09 16:55:49.643372000 -0700
@@ -16,10 +16,10 @@
 #include <map>
 
 /**
- * \ingroup mesh
- * \defgroup flame FLAME
+ * @ingroup mesh
+ * @defgroup flame FLAME
  *
- * \brief Forwarding LAyer for MEshing protocol
+ * @brief Forwarding LAyer for MEshing protocol
  *
  * Simple L2.5 mesh routing protocol developed by
  * Herman Elfrink <herman.elfrink@ti-wmc.nl> and presented in
@@ -39,8 +39,8 @@
 class FlameRtable;
 
 /**
- * \ingroup flame
- * \brief Transmitter and receiver addresses
+ * @ingroup flame
+ * @brief Transmitter and receiver addresses
  */
 class FlameTag : public Tag
 {
@@ -53,7 +53,7 @@
     /**
      * Constructor
      *
-     * \param a receiver MAC address
+     * @param a receiver MAC address
      */
     FlameTag(Mac48Address a = Mac48Address())
         : receiver(a)
@@ -61,8 +61,8 @@
     }
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     // Inherited from Tag
@@ -74,15 +74,15 @@
 };
 
 /**
- * \ingroup flame
- * \brief FLAME routing protocol
+ * @ingroup flame
+ * @brief FLAME routing protocol
  */
 class FlameProtocol : public MeshL2RoutingProtocol
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -98,13 +98,13 @@
     /**
      * Route request, inherited from MeshL2RoutingProtocol
      *
-     * \param sourceIface the source interface
-     * \param source the source address
-     * \param destination the destination address
-     * \param packet the packet to route
-     * \param protocolType the protocol type
-     * \param routeReply the route reply
-     * \returns if route exists
+     * @param sourceIface the source interface
+     * @param source the source address
+     * @param destination the destination address
+     * @param packet the packet to route
+     * @param protocolType the protocol type
+     * @param routeReply the route reply
+     * @returns if route exists
      */
     bool RequestRoute(uint32_t sourceIface,
                       const Mac48Address source,
@@ -115,12 +115,12 @@
     /**
      * Cleanup flame headers!
      *
-     * \param fromIface the from interface
-     * \param source the source address
-     * \param destination the destination address
-     * \param packet the packet
-     * \param protocolType the protocol type
-     * \returns if the route removed
+     * @param fromIface the from interface
+     * @param source the source address
+     * @param destination the destination address
+     * @param packet the packet
+     * @param protocolType the protocol type
+     * @returns if the route removed
      */
     bool RemoveRoutingStuff(uint32_t fromIface,
                             const Mac48Address source,
@@ -128,9 +128,9 @@
                             Ptr<Packet> packet,
                             uint16_t& protocolType) override;
     /**
-     * \brief Install FLAME on given mesh point.
-     * \param mp the MeshPointDevice
-     * \returns true if successful
+     * @brief Install FLAME on given mesh point.
+     * @param mp the MeshPointDevice
+     * @returns true if successful
      *
      * Installing protocol causes installation of its interface MAC plugins.
      *
@@ -140,12 +140,12 @@
     bool Install(Ptr<MeshPointDevice> mp);
     /**
      * Get address of this instance
-     * \returns the MAC address
+     * @returns the MAC address
      */
     Mac48Address GetAddress();
     /**
      * Statistics
-     * \param os the output stream
+     * @param os the output stream
      */
     void Report(std::ostream& os) const;
     /// Reset statistics function
@@ -155,14 +155,14 @@
     /// LLC protocol number reserved by flame
     static const uint16_t FLAME_PROTOCOL = 0x4040;
     /**
-     * \brief Handles a packet: adds a routing information and drops packets by TTL or Seqno
+     * @brief Handles a packet: adds a routing information and drops packets by TTL or Seqno
      *
-     * \param seqno
-     * \param source
-     * \param flameHdr
-     * \param receiver
-     * \param fromIface
-     * \return true if packet shall be dropped
+     * @param seqno
+     * @param source
+     * @param flameHdr
+     * @param receiver
+     * @param fromIface
+     * @return true if packet shall be dropped
      */
     bool HandleDataFrame(uint16_t seqno,
                          Mac48Address source,
@@ -170,7 +170,7 @@
                          Mac48Address receiver,
                          uint32_t fromIface);
     /**
-     * \name Information about MeshPointDeviceaddress, plugins
+     * @name Information about MeshPointDeviceaddress, plugins
      * \{
      */
     typedef std::map<uint32_t, Ptr<FlameProtocolMac>> FlamePluginMap;
@@ -178,7 +178,7 @@
     Mac48Address m_address;      ///< address
     //\}
     /**
-     * \name Broadcast timers:
+     * @name Broadcast timers:
      * \{
      */
     Time m_broadcastInterval;
@@ -201,7 +201,7 @@
         uint16_t totalDropped; ///< total dropped
         /**
          * Print function
-         * \param os the output stream to print to
+         * @param os the output stream to print to
          */
         void Print(std::ostream& os) const;
         /// constructor
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/model/flame/flame-protocol-mac.h ns-3.44/src/mesh/model/flame/flame-protocol-mac.h
--- ns-3.43/src/mesh/model/flame/flame-protocol-mac.h	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/model/flame/flame-protocol-mac.h	2025-03-09 16:55:49.639372000 -0700
@@ -18,9 +18,9 @@
 class FlameProtocol;
 
 /**
- * \ingroup flame
+ * @ingroup flame
  *
- * \brief Interface MAC plugin for FLAME routing protocol
+ * @brief Interface MAC plugin for FLAME routing protocol
  */
 class FlameProtocolMac : public MeshWifiInterfaceMacPlugin
 {
@@ -28,7 +28,7 @@
     /**
      * Constructor
      *
-     * \param protocol flame protocol object
+     * @param protocol flame protocol object
      */
     FlameProtocolMac(Ptr<FlameProtocol> protocol);
     ~FlameProtocolMac() override;
@@ -36,39 +36,42 @@
     // Inherited from MAC plugin
     /**
      * Set parent of this instance
-     * \param parent pointer to the parent MeshWifiInterfaceMac
+     * @param parent pointer to the parent MeshWifiInterfaceMac
      */
     void SetParent(Ptr<MeshWifiInterfaceMac> parent) override;
     /**
      * Receive and process a packet; packets are given a FlameTag packet tag
-     * \param packet the packet received
-     * \param header the header
-     * \returns true if successful
+     * @param packet the packet received
+     * @param header the header
+     * @returns true if successful
      */
     bool Receive(Ptr<Packet> packet, const WifiMacHeader& header) override;
     /**
      * Process an outgoing frame.  Remove the FlameTag and increment stats
      * counters.
-     * \param packet the packet received
-     * \param header the header
-     * \param from the MAC address of the sender
-     * \param to the MAC address of the receiver
-     * \returns true if successful
+     * @param packet the packet received
+     * @param header the header
+     * @param from the MAC address of the sender
+     * @param to the MAC address of the receiver
+     * @returns true if successful
      */
     bool UpdateOutcomingFrame(Ptr<Packet> packet,
                               WifiMacHeader& header,
                               Mac48Address from,
                               Mac48Address to) override;
+
     /**
      * Update beacon is empty, because FLAME does not know anything about beacons
-     * \param beacon the beacon
+     * @param beacon the beacon
      */
-    void UpdateBeacon(MeshWifiBeacon& beacon) const override{};
+    void UpdateBeacon(MeshWifiBeacon& beacon) const override
+    {
+    }
 
     /**
      * AssignStreams is empty, because this model doesn't use random variables
-     * \param stream
-     * \returns 0 (no streams used)
+     * @param stream
+     * @returns 0 (no streams used)
      */
     int64_t AssignStreams(int64_t stream) override
     {
@@ -77,12 +80,12 @@
 
     /**
      * Get channel ID function
-     * \returns the channel
+     * @returns the channel
      */
     uint16_t GetChannelId() const;
     /**
      * Report statistics
-     * \param os the output stream
+     * @param os the output stream
      */
     void Report(std::ostream& os) const;
     /// Reset statistics function
@@ -105,7 +108,7 @@
 
         /**
          * Print function
-         * \param os the output stream
+         * @param os the output stream
          */
         void Print(std::ostream& os) const;
         /// constructor
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/model/flame/flame-rtable.h ns-3.44/src/mesh/model/flame/flame-rtable.h
--- ns-3.43/src/mesh/model/flame/flame-rtable.h	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/model/flame/flame-rtable.h	2025-03-09 16:55:49.643372000 -0700
@@ -20,9 +20,9 @@
 namespace flame
 {
 /**
- * \ingroup flame
+ * @ingroup flame
  *
- * \brief Routing table for FLAME
+ * @brief Routing table for FLAME
  */
 class FlameRtable : public Object
 {
@@ -43,10 +43,10 @@
         /**
          * Constructor
          *
-         * \param r retransmitter MAC address
-         * \param i interfce index
-         * \param c cost
-         * \param s sequence number
+         * @param r retransmitter MAC address
+         * @param i interfce index
+         * @param c cost
+         * @param s sequence number
          */
         LookupResult(Mac48Address r = Mac48Address::GetBroadcast(),
                      uint32_t i = INTERFACE_ANY,
@@ -60,22 +60,22 @@
         }
 
         /**
-         * \returns True for valid route
+         * @returns True for valid route
          */
         bool IsValid() const;
         /**
          * Compare route lookup results, used by tests
          *
-         * \param o the object to compare
-         * \returns true if equal
+         * @param o the object to compare
+         * @returns true if equal
          */
         bool operator==(const LookupResult& o) const;
     };
 
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -91,11 +91,11 @@
     /**
      * Add path
      *
-     * \param destination the destination address
-     * \param retransmitter the retransmitter address
-     * \param interface the interface
-     * \param cost the cost
-     * \param seqnum the sequence number
+     * @param destination the destination address
+     * @param retransmitter the retransmitter address
+     * @param interface the interface
+     * @param cost the cost
+     * @param seqnum the sequence number
      */
     void AddPath(const Mac48Address destination,
                  const Mac48Address retransmitter,
@@ -103,9 +103,9 @@
                  const uint8_t cost,
                  const uint16_t seqnum);
     /**
-     * \brief Lookup path to destination
-     * \param destination
-     * \return Broadcast if not found
+     * @brief Lookup path to destination
+     * @param destination
+     * @return Broadcast if not found
      */
     LookupResult Lookup(Mac48Address destination);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/model/mesh-information-element-vector.h ns-3.44/src/mesh/model/mesh-information-element-vector.h
--- ns-3.43/src/mesh/model/mesh-information-element-vector.h	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/model/mesh-information-element-vector.h	2025-03-09 16:55:49.643372000 -0700
@@ -20,8 +20,8 @@
                                    // Management IE)
 
 /**
- * \brief Information element vector
- * \ingroup wifi
+ * @brief Information element vector
+ * @ingroup wifi
  *
  * Implements a vector of WifiInformationElements.
  * Information elements typically come in groups, and the
@@ -36,8 +36,8 @@
     ~MeshInformationElementVector() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -45,11 +45,11 @@
     uint32_t GetSerializedSize() const override;
     void Serialize(Buffer::Iterator start) const override;
     /**
-     * \attention This variant should not be used but is implemented due to
+     * @attention This variant should not be used but is implemented due to
      * backward compatibility reasons
      *
-     * \param start buffer location to start deserializing from
-     * \return number of bytes deserialized
+     * @param start buffer location to start deserializing from
+     * @return number of bytes deserialized
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
     /**
@@ -57,19 +57,19 @@
      *
      * The size of this Header should equal start.GetDistanceFrom (end).
      *
-     * \param start starting buffer location
-     * \param end ending buffer location
-     * \return number of bytes deserialized
+     * @param start starting buffer location
+     * @param end ending buffer location
+     * @return number of bytes deserialized
      */
     uint32_t Deserialize(Buffer::Iterator start, Buffer::Iterator end) override;
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Needed when you try to deserialize a lonely IE inside other header
+     * @brief Needed when you try to deserialize a lonely IE inside other header
      *
-     * \param start is the start of the buffer
+     * @param start is the start of the buffer
      *
-     * \return deserialized bytes
+     * @return deserialized bytes
      */
     uint32_t DeserializeSingleIe(Buffer::Iterator start);
 
@@ -77,35 +77,35 @@
     typedef std::vector<Ptr<WifiInformationElement>>::iterator Iterator;
     /**
      * Returns Begin of the vector
-     * \returns the begin of the vector
+     * @returns the begin of the vector
      */
     Iterator Begin();
     /**
      * Returns End of the vector
-     * \returns the end of the vector
+     * @returns the end of the vector
      */
     Iterator End();
     /**
      * add an IE, if maxSize has exceeded, returns false
      *
-     * \param element wifi information element to add
-     * \returns true is added
+     * @param element wifi information element to add
+     * @returns true is added
      */
     bool AddInformationElement(Ptr<WifiInformationElement> element);
     /**
      * vector of pointers to information elements is the body of IeVector
      *
-     * \param id the element id to find
-     * \returns the information element
+     * @param id the element id to find
+     * @returns the information element
      */
     Ptr<WifiInformationElement> FindFirst(WifiInformationElementId id) const;
 
     /**
      * Check if the given WifiInformationElementVectors are equivalent.
      *
-     * \param a another WifiInformationElementVector
+     * @param a another WifiInformationElementVector
      *
-     * \return true if the given WifiInformationElementVectors are equivalent,
+     * @return true if the given WifiInformationElementVectors are equivalent,
      *         false otherwise
      */
     virtual bool operator==(const MeshInformationElementVector& a) const;
@@ -117,7 +117,7 @@
     typedef std::vector<Ptr<WifiInformationElement>> IE_VECTOR;
     /**
      * Current number of bytes
-     * \returns the number of bytes
+     * @returns the number of bytes
      */
     uint32_t GetSize() const;
     IE_VECTOR m_elements; //!< Information element vector
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/model/mesh-l2-routing-protocol.h ns-3.44/src/mesh/model/mesh-l2-routing-protocol.h
--- ns-3.43/src/mesh/model/mesh-l2-routing-protocol.h	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/model/mesh-l2-routing-protocol.h	2025-03-09 16:55:49.643372000 -0700
@@ -21,9 +21,9 @@
 class MeshPointDevice;
 
 /**
- * \ingroup mesh
+ * @ingroup mesh
  *
- * \brief Interface for L2 mesh routing protocol and mesh point communication.
+ * @brief Interface for L2 mesh routing protocol and mesh point communication.
  *
  * Every mesh routing protocol must implement this interface. Each mesh point (MeshPointDevice) is
  * supposed to know single L2RoutingProtocol to work with, see MeshPointDevice::SetRoutingProtocol
@@ -35,8 +35,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     /// virtual D-tor for subclasses
@@ -44,10 +44,10 @@
     /**
      * Callback to be invoked when route discovery  procedure is completed.
      *
-     * \param flag        indicating whether a route was actually found and all needed information
+     * @param flag        indicating whether a route was actually found and all needed information
      * is added to the packet successfully
      *
-     * \param packet      for which the route was resolved. All routing information for MAC layer
+     * @param packet      for which the route was resolved. All routing information for MAC layer
      *                    must be stored in proper tags (like in case of HWMP, when WifiMacHeader
      *                    needs address of next hop), or must be added as a packet header (if MAC
      *                    does not need any additional information). So, the packet is returned back
@@ -55,13 +55,13 @@
      *                    (i.e data + src +dst + protocol). The only special information addressed
      *                    to MeshPointDevice is an outcoming interface ID.
      *
-     * \param src         source address of the packet
+     * @param src         source address of the packet
      *
-     * \param dst         destination address of the packet
+     * @param dst         destination address of the packet
      *
-     * \param protocol    ethernet 'Protocol' field, needed to form a proper MAC-layer header
+     * @param protocol    ethernet 'Protocol' field, needed to form a proper MAC-layer header
      *
-     * \param uint32_t    outcoming interface to use or 0xffffffff if packet should be sent by ALL
+     * @param uint32_t    outcoming interface to use or 0xffffffff if packet should be sent by ALL
      * interfaces
      */
     typedef Callback<void,         /* return type */
@@ -78,15 +78,15 @@
      *
      * Note that route discovery works async. -- RequestRoute returns immediately, while
      * reply callback will be called when routing information will be available.
-     * \return true if valid route is already known
-     * \param sourceIface the incoming interface of the packet
-     * \param source        source address
-     * \param destination   destination address
-     * \param packet        the packet to be resolved (needed the whole packet, because
+     * @return true if valid route is already known
+     * @param sourceIface the incoming interface of the packet
+     * @param source        source address
+     * @param destination   destination address
+     * @param packet        the packet to be resolved (needed the whole packet, because
      *                      routing information is added as tags or headers). The packet
      *                      will be returned to reply callback.
-     * \param protocolType  protocol ID, needed to form a proper MAC-layer header
-     * \param routeReply    callback to be invoked after route discovery procedure, supposed
+     * @param protocolType  protocol ID, needed to form a proper MAC-layer header
+     * @param routeReply    callback to be invoked after route discovery procedure, supposed
      *                      to really send packet using routing information.
      */
     virtual bool RequestRoute(uint32_t sourceIface,
@@ -96,17 +96,17 @@
                               uint16_t protocolType,
                               RouteReplyCallback routeReply) = 0;
     /**
-     * \brief When packet is ready to go to upper layer, protocol must
+     * @brief When packet is ready to go to upper layer, protocol must
      * remove all its information: tags, header, etc. So,
      * MeshPointDevice must call this method when passing a packet to
      * upper layer.
-     * \returns true if packet shall not be dropped, false otherwise.
-     * \param fromIface     the incoming interface of the packet
-     * \param source        source address
-     * \param destination   destination address
-     * \param packet        the packet to be handled
-     * \param protocolType  protocol ID, needed to form a proper MAC-layer header
-     * \attention protocol type is passed by reference, because may be
+     * @returns true if packet shall not be dropped, false otherwise.
+     * @param fromIface     the incoming interface of the packet
+     * @param source        source address
+     * @param destination   destination address
+     * @param packet        the packet to be handled
+     * @param protocolType  protocol ID, needed to form a proper MAC-layer header
+     * @attention protocol type is passed by reference, because may be
      * changed
      */
     virtual bool RemoveRoutingStuff(uint32_t fromIface,
@@ -117,13 +117,13 @@
     /**
      * Set host mesh point, analog of SetNode (...) methods for upper layer protocols.
      *
-     * \param mp the mesh point device
+     * @param mp the mesh point device
      */
     void SetMeshPoint(Ptr<MeshPointDevice> mp);
     /**
      * Each mesh protocol must be installed on the mesh point to work.
      *
-     * \returns the mesh point device
+     * @returns the mesh point device
      */
     Ptr<MeshPointDevice> GetMeshPoint() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/model/mesh-point-device.h ns-3.44/src/mesh/model/mesh-point-device.h
--- ns-3.43/src/mesh/model/mesh-point-device.h	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/model/mesh-point-device.h	2025-03-09 16:55:49.643372000 -0700
@@ -22,9 +22,9 @@
 {
 
 /**
- * \ingroup mesh
+ * @ingroup mesh
  *
- * \brief Virtual net device modeling mesh point.
+ * @brief Virtual net device modeling mesh point.
  *
  * Mesh point is a virtual net device which is responsible for
  *   - Aggregating and coordinating 1..* real devices -- mesh interfaces, see MeshInterfaceDevice
@@ -43,8 +43,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     /// C-tor create empty (without interfaces and protocols) mesh point
@@ -52,43 +52,43 @@
     /// D-tor
     ~MeshPointDevice() override;
 
-    /// \name Interfaces
+    /// @name Interfaces
     ///@{
     /**
-     * \brief Attach new interface to the station. Interface must support 48-bit MAC address and
+     * @brief Attach new interface to the station. Interface must support 48-bit MAC address and
      * SendFrom method.
-     * \param port the port used
+     * @param port the port used
      *
-     * \attention Only MeshPointDevice can have IP address, but not individual interfaces.
+     * @attention Only MeshPointDevice can have IP address, but not individual interfaces.
      */
     void AddInterface(Ptr<NetDevice> port);
     /**
-     * \return number of interfaces
+     * @return number of interfaces
      */
     uint32_t GetNInterfaces() const;
     /**
-     * \return interface device by its index (aka ID)
-     * \param id is interface id, 0 <= id < GetNInterfaces
+     * @return interface device by its index (aka ID)
+     * @param id is interface id, 0 <= id < GetNInterfaces
      */
     Ptr<NetDevice> GetInterface(uint32_t id) const;
     /**
-     * \return vector of interfaces
+     * @return vector of interfaces
      */
     std::vector<Ptr<NetDevice>> GetInterfaces() const;
     ///@}
 
-    /// \name Protocols
+    /// @name Protocols
     ///@{
     /**
      * Register routing protocol to be used. Protocol must be already installed on this mesh point.
      *
-     * \param protocol the routing protocol
+     * @param protocol the routing protocol
      */
     void SetRoutingProtocol(Ptr<MeshL2RoutingProtocol> protocol);
     /**
      * Access current routing protocol
      *
-     * \return the current routing protocol
+     * @return the current routing protocol
      */
     Ptr<MeshL2RoutingProtocol> GetRoutingProtocol() const;
     ///@}
@@ -123,11 +123,11 @@
     Address GetMulticast(Ipv6Address addr) const override;
     void DoDispose() override;
 
-    /// \name Statistics
+    /// @name Statistics
     ///@{
     /**
      *  Print statistics counters
-     *  \param os the output stream
+     *  @param os the output stream
      */
     void Report(std::ostream& os) const;
     /// Reset statistics counters
@@ -139,8 +139,8 @@
      * used by this model.  Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream);
 
@@ -148,7 +148,7 @@
      * Return a (random) forwarding delay value from the random variable
      * ForwardingDelay attribute.
      *
-     * \return A Time value from the ForwardingDelay random variable
+     * @return A Time value from the ForwardingDelay random variable
      */
     Time GetForwardingDelay() const;
 
@@ -156,12 +156,12 @@
     /**
      * Receive packet from interface
      *
-     * \param device the device to receive from
-     * \param packet the received packet
-     * \param protocol the protocol
-     * \param source the source address
-     * \param destination the destination address
-     * \param packetType the packet type
+     * @param device the device to receive from
+     * @param packet the received packet
+     * @param protocol the protocol
+     * @param source the source address
+     * @param destination the destination address
+     * @param packetType the packet type
      */
     void ReceiveFromDevice(Ptr<NetDevice> device,
                            Ptr<const Packet> packet,
@@ -172,11 +172,11 @@
     /**
      * Forward packet down to interfaces
      *
-     * \param incomingPort the incoming port
-     * \param packet the packet to forward
-     * \param protocol the protocol
-     * \param src the source MAC address
-     * \param dst the destination MAC address
+     * @param incomingPort the incoming port
+     * @param packet the packet to forward
+     * @param protocol the protocol
+     * @param src the source MAC address
+     * @param dst the destination MAC address
      */
     void Forward(Ptr<NetDevice> incomingPort,
                  Ptr<const Packet> packet,
@@ -184,15 +184,15 @@
                  const Mac48Address src,
                  const Mac48Address dst);
     /**
-     * \brief Response callback for L2 routing protocol. This will be executed when routing
+     * @brief Response callback for L2 routing protocol. This will be executed when routing
      * information is ready.
      *
-     * \param success     True is route found.
-     * \param packet      Packet to send
-     * \param src         Source MAC address
-     * \param dst         Destination MAC address
-     * \param protocol    Protocol ID
-     * \param iface       Interface to use (ID) for send (decided by routing protocol). All
+     * @param success     True is route found.
+     * @param packet      Packet to send
+     * @param src         Source MAC address
+     * @param dst         Destination MAC address
+     * @param protocol    Protocol ID
+     * @param iface       Interface to use (ID) for send (decided by routing protocol). All
      * interfaces will be used if outIface = 0xffffffff \todo diagnose routing errors
      */
     void DoSend(bool success,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/model/mesh-wifi-beacon.h ns-3.44/src/mesh/model/mesh-wifi-beacon.h
--- ns-3.43/src/mesh/model/mesh-wifi-beacon.h	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/model/mesh-wifi-beacon.h	2025-03-09 16:55:49.643372000 -0700
@@ -22,7 +22,7 @@
 class Time;
 
 /**
- * \brief Beacon is beacon header + list of arbitrary information elements
+ * @brief Beacon is beacon header + list of arbitrary information elements
  *
  * It is supposed that distinct mesh protocols can use beacons to transport
  * their own information elements.
@@ -33,16 +33,16 @@
     /**
      * C-tor
      *
-     * \param ssid is SSID for beacon header
-     * \param rates is a set of supported rates
-     * \param us beacon interval in microseconds
+     * @param ssid is SSID for beacon header
+     * @param rates is a set of supported rates
+     * @param us beacon interval in microseconds
      */
     MeshWifiBeacon(Ssid ssid, AllSupportedRates rates, uint64_t us);
 
     /**
      * Read standard Wifi beacon header
      *
-     * \returns the management beacon header
+     * @returns the management beacon header
      */
     MgtBeaconHeader BeaconHeader() const
     {
@@ -52,28 +52,28 @@
     /**
      * Add information element
      *
-     * \param ie the Wifi information element
+     * @param ie the Wifi information element
      */
     void AddInformationElement(Ptr<WifiInformationElement> ie);
 
     /**
      * Create Wifi header for beacon frame.
      *
-     * \param address is sender address
-     * \param mpAddress is mesh point address
-     * \returns the WifiMacHeader
+     * @param address is sender address
+     * @param mpAddress is mesh point address
+     * @returns the WifiMacHeader
      */
     WifiMacHeader CreateHeader(Mac48Address address, Mac48Address mpAddress);
     /**
      * Returns the beacon interval of Wifi beacon
      *
-     * \returns the beacon interval time
+     * @returns the beacon interval time
      */
     Time GetBeaconInterval() const;
     /**
      * Create frame = { beacon header + all information elements sorted by ElementId () }
      *
-     * \returns the frame
+     * @returns the frame
      */
     Ptr<Packet> CreatePacket();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/model/mesh-wifi-interface-mac.cc ns-3.44/src/mesh/model/mesh-wifi-interface-mac.cc
--- ns-3.43/src/mesh/model/mesh-wifi-interface-mac.cc	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/model/mesh-wifi-interface-mac.cc	2025-03-09 16:55:49.643372000 -0700
@@ -142,9 +142,9 @@
     NS_LOG_FUNCTION(this << stream);
     int64_t currentStream = stream + WifiMac::AssignStreams(stream);
     m_coefficient->SetStream(currentStream++);
-    for (auto i = m_plugins.begin(); i < m_plugins.end(); i++)
+    for (auto& plugin : m_plugins)
     {
-        currentStream += (*i)->AssignStreams(currentStream);
+        currentStream += plugin->AssignStreams(currentStream);
     }
     return (currentStream - stream);
 }
@@ -178,7 +178,7 @@
     NS_LOG_FUNCTION(this);
     NS_ASSERT(GetWifiPhy()); // need PHY to set/get channel
     /**
-     * \todo
+     * @todo
      * Correct channel switching is:
      *
      * 1. Interface down, e.g. to stop packets from layer 3
@@ -213,7 +213,7 @@
     // Address 1 is unknown here. Routing plugin is responsible to correctly set it.
     hdr.SetAddr1(Mac48Address());
     // Filter packet through all installed plugins
-    for (auto i = m_plugins.end() - 1; i != m_plugins.begin() - 1; i--)
+    for (auto i = m_plugins.rbegin(); i != m_plugins.rend(); ++i)
     {
         bool drop = !((*i)->UpdateOutcomingFrame(packet, hdr, from, to));
         if (drop)
@@ -247,7 +247,7 @@
 {
     // Filter management frames:
     WifiMacHeader header = hdr;
-    for (auto i = m_plugins.end() - 1; i != m_plugins.begin() - 1; i--)
+    for (auto i = m_plugins.rbegin(); i != m_plugins.rend(); ++i)
     {
         bool drop = !((*i)->UpdateOutcomingFrame(packet, header, Mac48Address(), Mac48Address()));
         if (drop)
@@ -519,7 +519,7 @@
 MeshWifiInterfaceMac::Statistics::Print(std::ostream& os) const
 {
     os << "<Statistics "
-          /// \todo txBeacons
+          /// @todo txBeacons
           "rxBeacons=\""
        << recvBeacons
        << "\" "
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/model/mesh-wifi-interface-mac.h ns-3.44/src/mesh/model/mesh-wifi-interface-mac.h
--- ns-3.43/src/mesh/model/mesh-wifi-interface-mac.h	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/model/mesh-wifi-interface-mac.h	2025-03-09 16:55:49.643372000 -0700
@@ -29,9 +29,9 @@
 class UniformRandomVariable;
 
 /**
- * \ingroup mesh
+ * @ingroup mesh
  *
- * \brief Basic MAC of mesh point Wi-Fi interface. Its function is extendable through plugins
+ * @brief Basic MAC of mesh point Wi-Fi interface. Its function is extendable through plugins
  * mechanism.
  *
  * Now only three output queues are used:
@@ -44,8 +44,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     /// C-tor
@@ -58,53 +58,53 @@
     void SetLinkUpCallback(Callback<void> linkUp) override;
     bool CanForwardPacketsTo(Mac48Address to) const override;
 
-    /// \name Each mesh point interface must know the mesh point address
+    /// @name Each mesh point interface must know the mesh point address
     ///@{
     /**
      * Set the mesh point address
-     * \param addr the mesh point address
+     * @param addr the mesh point address
      */
     void SetMeshPointAddress(Mac48Address addr);
     /**
      * Get the mesh point address
-     * \return The mesh point address
+     * @return The mesh point address
      */
     Mac48Address GetMeshPointAddress() const;
     ///@}
 
-    /// \name Beacons
+    /// @name Beacons
     ///@{
     /**
      * Set maximum initial random delay before first beacon
-     * \param interval maximum random interval
+     * @param interval maximum random interval
      */
     void SetRandomStartDelay(Time interval);
     /**
      * Set interval between two successive beacons
-     * \param interval beacon interval
+     * @param interval beacon interval
      */
     void SetBeaconInterval(Time interval);
     /**
      * Get beacon interval.
-     * \return interval between two beacons
+     * @return interval between two beacons
      */
     Time GetBeaconInterval() const;
     /**
-     * \brief Next beacon frame time
-     * \return TBTT time
+     * @brief Next beacon frame time
+     * @return TBTT time
      *
      * This is supposed to be used by any entity managing beacon collision avoidance (e.g. Peer
      * management protocol in 802.11s)
      */
     Time GetTbtt() const;
     /**
-     * \brief Shift TBTT.
-     * \param shift Shift
+     * @brief Shift TBTT.
+     * @param shift Shift
      *
      * This is supposed to be used by any entity managing beacon collision avoidance (e.g. Peer
      * management protocol in 802.11s)
      *
-     * \attention User of ShiftTbtt () must take care to not shift it to the past.
+     * @attention User of ShiftTbtt () must take care to not shift it to the past.
      */
     void ShiftTbtt(Time shift);
     ///@}
@@ -112,9 +112,9 @@
     /**
      * Install plugin.
      *
-     * \param plugin Plugin
+     * @param plugin Plugin
      *
-     * \todo return unique ID to allow user to unregister plugins
+     * @todo return unique ID to allow user to unregister plugins
      */
     void InstallPlugin(Ptr<MeshWifiInterfaceMacPlugin> plugin);
 
@@ -128,55 +128,55 @@
 
     /**
      * Current channel Id
-     * \returns the frequency channel
+     * @returns the frequency channel
      */
     uint16_t GetFrequencyChannel() const;
     /**
      * Switch frequency channel.
      *
-     * \param new_id New ID.
+     * @param new_id New ID.
      */
     void SwitchFrequencyChannel(uint16_t new_id);
 
     /**
      * To be used by plugins sending management frames.
      *
-     * \param frame the management frame
-     * \param hdr the wifi MAC header
+     * @param frame the management frame
+     * @param hdr the wifi MAC header
      */
     void SendManagementFrame(Ptr<Packet> frame, const WifiMacHeader& hdr);
     /**
      * Check supported rates.
      *
-     * \param rates Rates.
-     * \return true if rates are supported
+     * @param rates Rates.
+     * @return true if rates are supported
      */
     bool CheckSupportedRates(AllSupportedRates rates) const;
 
     /**
      * Get supported rates.
-     * \return list of supported bitrates
+     * @return list of supported bitrates
      */
     AllSupportedRates GetSupportedRates() const;
 
-    /// \name Metric Calculation routines:
+    /// @name Metric Calculation routines:
     ///@{
     /**
      * Set the link metric callback
-     * \param cb the callback
+     * @param cb the callback
      */
     void SetLinkMetricCallback(Callback<uint32_t, Mac48Address, Ptr<MeshWifiInterfaceMac>> cb);
     /**
      * Get the link metric
-     * \param peerAddress the peer address
-     * \return The metric
+     * @param peerAddress the peer address
+     * @return The metric
      */
     uint32_t GetLinkMetric(Mac48Address peerAddress);
     ///@}
 
     /**
-     * \brief Report statistics
-     * \param os the output stream
+     * @brief Report statistics
+     * @param os the output stream
      */
     void Report(std::ostream& os) const;
 
@@ -188,12 +188,12 @@
     /**
      * Enable/disable beacons
      *
-     * \param enable enable / disable flag
+     * @param enable enable / disable flag
      */
     void SetBeaconGeneration(bool enable);
     /**
-     * \param cwMin the minimum contention window size
-     * \param cwMax the maximum contention window size
+     * @param cwMin the minimum contention window size
+     * @param cwMax the maximum contention window size
      *
      * This method is called to set the minimum and the maximum
      * contention window size.
@@ -205,8 +205,8 @@
      * used by this model.  Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream) override;
 
@@ -216,8 +216,8 @@
     /**
      * Frame receive handler
      *
-     * \param mpdu the received MPDU
-     * \param linkId the ID of the link the frame was received over
+     * @param mpdu the received MPDU
+     * @param linkId the ID of the link the frame was received over
      */
     void Receive(Ptr<const WifiMpdu> mpdu, uint8_t linkId) override;
     /**
@@ -231,7 +231,7 @@
     /**
      * Get current beaconing status
      *
-     * \returns true if beacon active
+     * @returns true if beacon active
      */
     bool GetBeaconGeneration() const;
     /**
@@ -245,7 +245,7 @@
     void DoInitialize() override;
     void Enqueue(Ptr<WifiMpdu> mpdu, Mac48Address to, Mac48Address from) override;
 
-    /// \name Mesh timing intervals
+    /// @name Mesh timing intervals
     ///@{
     /// Whether beaconing is enabled
     bool m_beaconEnable;
@@ -278,7 +278,7 @@
         /**
          * Print statistics.
          *
-         * \param os Output stream
+         * @param os Output stream
          */
         void Print(std::ostream& os) const;
         /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/model/mesh-wifi-interface-mac-plugin.h ns-3.44/src/mesh/model/mesh-wifi-interface-mac-plugin.h
--- ns-3.43/src/mesh/model/mesh-wifi-interface-mac-plugin.h	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/model/mesh-wifi-interface-mac-plugin.h	2025-03-09 16:55:49.643372000 -0700
@@ -21,50 +21,53 @@
 class MeshWifiInterfaceMac;
 
 /**
- * \ingroup mesh
+ * @ingroup mesh
  *
- * \brief Common interface for mesh point interface MAC plugins
+ * @brief Common interface for mesh point interface MAC plugins
  *
- * \todo plugins description
+ * @todo plugins description
  */
 class MeshWifiInterfaceMacPlugin : public SimpleRefCount<MeshWifiInterfaceMacPlugin>
 {
   public:
     /// This is for subclasses
-    virtual ~MeshWifiInterfaceMacPlugin(){};
+    virtual ~MeshWifiInterfaceMacPlugin()
+    {
+    }
+
     /**
      * Each plugin must be installed on an interface to work
      *
-     * \param parent the parent object
+     * @param parent the parent object
      */
     virtual void SetParent(Ptr<MeshWifiInterfaceMac> parent) = 0;
     /**
-     * \brief Process received frame
-     * \param packet
-     * \param header
+     * @brief Process received frame
+     * @param packet
+     * @param header
      *
-     * \return false if (and only if) frame should be dropped
-     * \todo define when MAC call this
+     * @return false if (and only if) frame should be dropped
+     * @todo define when MAC call this
      */
     virtual bool Receive(Ptr<Packet> packet, const WifiMacHeader& header) = 0;
     /**
-     * \brief Update frame before it will be forwarded down
-     * \param packet
-     * \param header
-     * \param from
-     * \param to
-     * \return false if (and only if) frame should be dropped
-     * \todo define when MAC call this, preconditions & postconditions
+     * @brief Update frame before it will be forwarded down
+     * @param packet
+     * @param header
+     * @param from
+     * @param to
+     * @return false if (and only if) frame should be dropped
+     * @todo define when MAC call this, preconditions & postconditions
      */
     virtual bool UpdateOutcomingFrame(Ptr<Packet> packet,
                                       WifiMacHeader& header,
                                       Mac48Address from,
                                       Mac48Address to) = 0;
     /**
-     * \brief Update beacon before it will be formed and sent
-     * \param beacon
+     * @brief Update beacon before it will be formed and sent
+     * @param beacon
      *
-     * \todo define when MAC call this
+     * @todo define when MAC call this
      */
     virtual void UpdateBeacon(MeshWifiBeacon& beacon) const = 0;
     /**
@@ -72,8 +75,8 @@
      * used by this model.  Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     virtual int64_t AssignStreams(int64_t stream) = 0;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/test/dot11s/dot11s-test-suite.cc ns-3.44/src/mesh/test/dot11s/dot11s-test-suite.cc
--- ns-3.43/src/mesh/test/dot11s/dot11s-test-suite.cc	2024-10-09 16:41:10.052656400 -0700
+++ ns-3.44/src/mesh/test/dot11s/dot11s-test-suite.cc	2025-03-09 16:55:49.643372000 -0700
@@ -18,14 +18,14 @@
 using namespace dot11s;
 
 /**
- * \ingroup mesh-test
- * \defgroup dot11s-test dot11s sub-module tests
+ * @ingroup mesh-test
+ * @defgroup dot11s-test dot11s sub-module tests
  */
 
 /**
- * \ingroup dot11s-test
+ * @ingroup dot11s-test
  *
- * \brief Built-in self test for MeshHeader
+ * @brief Built-in self test for MeshHeader
  */
 struct MeshHeaderTest : public TestCase
 {
@@ -82,9 +82,9 @@
 }
 
 /**
- * \ingroup mesh-test
+ * @ingroup mesh-test
  *
- * \brief Unit test for HwmpRtable
+ * @brief Unit test for HwmpRtable
  */
 class HwmpRtableTest : public TestCase
 {
@@ -263,9 +263,9 @@
 }
 
 /**
- * \ingroup mesh-test
+ * @ingroup mesh-test
  *
- * \brief Dot11s Test Suite
+ * @brief Dot11s Test Suite
  */
 class Dot11sTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/test/dot11s/hwmp-proactive-regression.h ns-3.44/src/mesh/test/dot11s/hwmp-proactive-regression.h
--- ns-3.43/src/mesh/test/dot11s/hwmp-proactive-regression.h	2024-10-09 16:41:10.056656600 -0700
+++ ns-3.44/src/mesh/test/dot11s/hwmp-proactive-regression.h	2025-03-09 16:55:49.643372000 -0700
@@ -15,12 +15,12 @@
 using namespace ns3;
 
 /**
- * \ingroup dot11s-test
+ * @ingroup dot11s-test
  *
- * \brief There are 5 stations set into a row, the center station is root.
+ * @brief There are 5 stations set into a row, the center station is root.
  * Regression test indicates that traffic goes from the first to the
  * last stations without reactive route discovery procedure
- * \verbatim
+ * @verbatim
  *          Src                Root                 Dst
  * (node ID) 0         1         2         3         4
  * (MAC)   00:01     00:02     00:03     00:04     00:05
@@ -43,7 +43,7 @@
  *           |         |         |         |<--------|          DATA
  *                                             ^
  *               Further data is forwarded by proactive path
- * \endverbatim
+ * @endverbatim
  *
  */
 class HwmpProactiveRegressionTest : public TestCase
@@ -57,7 +57,7 @@
     void CheckResults();
 
   private:
-    /// \internal It is important to have pointers here
+    /// @internal It is important to have pointers here
     NodeContainer* m_nodes;
     /// Simulation time
     Time m_time;
@@ -82,25 +82,25 @@
 
     /**
      * Send data
-     * \param socket the sending socket
+     * @param socket the sending socket
      */
     void SendData(Ptr<Socket> socket);
 
     /**
-     * \brief Handle a packet reception.
+     * @brief Handle a packet reception.
      *
      * This function is called by lower layers.
      *
-     * \param socket the socket the packet was received to.
+     * @param socket the socket the packet was received to.
      */
     void HandleReadServer(Ptr<Socket> socket);
 
     /**
-     * \brief Handle a packet reception.
+     * @brief Handle a packet reception.
      *
      * This function is called by lower layers.
      *
-     * \param socket the socket the packet was received to.
+     * @param socket the socket the packet was received to.
      */
     void HandleReadClient(Ptr<Socket> socket);
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/test/dot11s/hwmp-reactive-regression.cc ns-3.44/src/mesh/test/dot11s/hwmp-reactive-regression.cc
--- ns-3.43/src/mesh/test/dot11s/hwmp-reactive-regression.cc	2024-10-09 16:41:10.056656600 -0700
+++ ns-3.44/src/mesh/test/dot11s/hwmp-reactive-regression.cc	2025-03-09 16:55:49.647372000 -0700
@@ -74,7 +74,7 @@
     mobility.SetPositionAllocator(positionAlloc);
     mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
     mobility.Install(*m_nodes);
-    Simulator::Schedule(Seconds(5.0), &HwmpReactiveRegressionTest::ResetPosition, this);
+    Simulator::Schedule(Seconds(5), &HwmpReactiveRegressionTest::ResetPosition, this);
 }
 
 void
@@ -88,7 +88,7 @@
     m_clientSocket->SetRecvCallback(
         MakeCallback(&HwmpReactiveRegressionTest::HandleReadClient, this));
     Simulator::ScheduleWithContext(m_clientSocket->GetNode()->GetId(),
-                                   Seconds(2.0),
+                                   Seconds(2),
                                    &HwmpReactiveRegressionTest::SendData,
                                    this,
                                    m_clientSocket);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/test/dot11s/hwmp-reactive-regression.h ns-3.44/src/mesh/test/dot11s/hwmp-reactive-regression.h
--- ns-3.43/src/mesh/test/dot11s/hwmp-reactive-regression.h	2024-10-09 16:41:10.056656600 -0700
+++ ns-3.44/src/mesh/test/dot11s/hwmp-reactive-regression.h	2025-03-09 16:55:49.647372000 -0700
@@ -14,13 +14,13 @@
 using namespace ns3;
 
 /**
- * \ingroup dot11s-test
+ * @ingroup dot11s-test
  *
- * \brief test for multihop path establishing and path error
+ * @brief test for multihop path establishing and path error
  * procedures
  * Initiate scenario with 6 stations. Procedure of opening peer link
  * is the following: (PMP routines are not shown)
- * \verbatim
+ * @verbatim
  *      0    1    2    3    4    5
  *      |    |    |    |    |<---|--->  ARP request (2.002s)
  *      |....|....|....|....|....|      ARP requests (continued)
@@ -54,7 +54,7 @@
  *      |    |    |         |<---|--->  PREQ
  *      |    |    |     <---|--->|      PREQ
  *      |....|....|.........|....|      Repeated attempts of PREQ
- * \endverbatim
+ * @endverbatim
  */
 
 class HwmpReactiveRegressionTest : public TestCase
@@ -68,7 +68,7 @@
     void CheckResults();
 
   private:
-    /// \internal It is important to have pointers here
+    /// @internal It is important to have pointers here
     NodeContainer* m_nodes;
     /// Simulation time
     Time m_time;
@@ -93,25 +93,25 @@
 
     /**
      * Send data
-     * \param socket the sending socket
+     * @param socket the sending socket
      */
     void SendData(Ptr<Socket> socket);
 
     /**
-     * \brief Handle a packet reception.
+     * @brief Handle a packet reception.
      *
      * This function is called by lower layers.
      *
-     * \param socket the socket the packet was received to.
+     * @param socket the socket the packet was received to.
      */
     void HandleReadServer(Ptr<Socket> socket);
 
     /**
-     * \brief Handle a packet reception.
+     * @brief Handle a packet reception.
      *
      * This function is called by lower layers.
      *
-     * \param socket the socket the packet was received to.
+     * @param socket the socket the packet was received to.
      */
     void HandleReadClient(Ptr<Socket> socket);
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/test/dot11s/hwmp-simplest-regression.cc ns-3.44/src/mesh/test/dot11s/hwmp-simplest-regression.cc
--- ns-3.43/src/mesh/test/dot11s/hwmp-simplest-regression.cc	2024-10-09 16:41:10.056656600 -0700
+++ ns-3.44/src/mesh/test/dot11s/hwmp-simplest-regression.cc	2025-03-09 16:55:49.651372200 -0700
@@ -82,7 +82,7 @@
                                   StringValue("RowFirst"));
     mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
     mobility.Install(*m_nodes);
-    Simulator::Schedule(Seconds(10.0), &HwmpSimplestRegressionTest::ResetPosition, this);
+    Simulator::Schedule(Seconds(10), &HwmpSimplestRegressionTest::ResetPosition, this);
 }
 
 void
@@ -108,7 +108,7 @@
     m_clientSocket->SetRecvCallback(
         MakeCallback(&HwmpSimplestRegressionTest::HandleReadClient, this));
     Simulator::ScheduleWithContext(m_clientSocket->GetNode()->GetId(),
-                                   Seconds(2.0),
+                                   Seconds(2),
                                    &HwmpSimplestRegressionTest::SendData,
                                    this,
                                    m_clientSocket);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/test/dot11s/hwmp-simplest-regression.h ns-3.44/src/mesh/test/dot11s/hwmp-simplest-regression.h
--- ns-3.43/src/mesh/test/dot11s/hwmp-simplest-regression.h	2024-10-09 16:41:10.056656600 -0700
+++ ns-3.44/src/mesh/test/dot11s/hwmp-simplest-regression.h	2025-03-09 16:55:49.651372200 -0700
@@ -15,12 +15,12 @@
 using namespace ns3;
 
 /**
- * \ingroup dot11s-test
+ * @ingroup dot11s-test
  *
- * \brief Peering Management & HWM Protocol regression test
+ * @brief Peering Management & HWM Protocol regression test
  * Initiate scenario with 2 stations. Procedure of opening peer link
  * is the following:
- * \verbatim
+ * @verbatim
  *           server       client
  * <-----------|----------->   Broadcast frame
  *             |----------->|  Unicast frame
@@ -52,7 +52,7 @@
  *             |<-----------|             Data
  *             |----------->|             Data
  *             |............|
- * \endverbatim
+ * @endverbatim
  * At 10 seconds stations become unreachable, so UDP client tries to
  * close peer link due to TX-fail, and UDP server tries to close peer link
  * due to beacon loss
@@ -68,7 +68,7 @@
     void CheckResults();
 
   private:
-    /// \internal It is important to have pointers here
+    /// @internal It is important to have pointers here
     NodeContainer* m_nodes;
     /// Simulation time
     Time m_time;
@@ -93,25 +93,25 @@
 
     /**
      * Send data
-     * \param socket the sending socket
+     * @param socket the sending socket
      */
     void SendData(Ptr<Socket> socket);
 
     /**
-     * \brief Handle a packet reception.
+     * @brief Handle a packet reception.
      *
      * This function is called by lower layers.
      *
-     * \param socket the socket the packet was received to.
+     * @param socket the socket the packet was received to.
      */
     void HandleReadServer(Ptr<Socket> socket);
 
     /**
-     * \brief Handle a packet reception.
+     * @brief Handle a packet reception.
      *
      * This function is called by lower layers.
      *
-     * \param socket the socket the packet was received to.
+     * @param socket the socket the packet was received to.
      */
     void HandleReadClient(Ptr<Socket> socket);
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/test/dot11s/hwmp-target-flags-regression.cc ns-3.44/src/mesh/test/dot11s/hwmp-target-flags-regression.cc
--- ns-3.43/src/mesh/test/dot11s/hwmp-target-flags-regression.cc	2024-10-09 16:41:10.056656600 -0700
+++ ns-3.44/src/mesh/test/dot11s/hwmp-target-flags-regression.cc	2025-03-09 16:55:49.651372200 -0700
@@ -121,7 +121,7 @@
     m_clientSocketB->Connect(InetSocketAddress(m_interfaces.GetAddress(0), 9));
     m_clientSocketB->SetRecvCallback(MakeCallback(&HwmpDoRfRegressionTest::HandleReadClient, this));
     Simulator::ScheduleWithContext(m_clientSocketB->GetNode()->GetId(),
-                                   Seconds(2.0),
+                                   Seconds(2),
                                    &HwmpDoRfRegressionTest::SendDataB,
                                    this,
                                    m_clientSocketB);
@@ -193,7 +193,7 @@
         socket->Send(Create<Packet>(100));
         m_sentPktsCounterA++;
         Simulator::ScheduleWithContext(socket->GetNode()->GetId(),
-                                       Seconds(1.0),
+                                       Seconds(1),
                                        &HwmpDoRfRegressionTest::SendDataA,
                                        this,
                                        socket);
@@ -208,7 +208,7 @@
         socket->Send(Create<Packet>(100));
         m_sentPktsCounterB++;
         Simulator::ScheduleWithContext(socket->GetNode()->GetId(),
-                                       Seconds(1.0),
+                                       Seconds(1),
                                        &HwmpDoRfRegressionTest::SendDataB,
                                        this,
                                        socket);
@@ -223,7 +223,7 @@
         socket->Send(Create<Packet>(100));
         m_sentPktsCounterC++;
         Simulator::ScheduleWithContext(socket->GetNode()->GetId(),
-                                       Seconds(1.0),
+                                       Seconds(1),
                                        &HwmpDoRfRegressionTest::SendDataC,
                                        this,
                                        socket);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/test/dot11s/hwmp-target-flags-regression.h ns-3.44/src/mesh/test/dot11s/hwmp-target-flags-regression.h
--- ns-3.43/src/mesh/test/dot11s/hwmp-target-flags-regression.h	2024-10-09 16:41:10.056656600 -0700
+++ ns-3.44/src/mesh/test/dot11s/hwmp-target-flags-regression.h	2025-03-09 16:55:49.651372200 -0700
@@ -15,9 +15,9 @@
 using namespace ns3;
 
 /**
- * \ingroup dot11s-test
+ * @ingroup dot11s-test
  *
- * \brief This is a test for intermediate reply and saving routing
+ * @brief This is a test for intermediate reply and saving routing
  * information about neighbour. 4 stations and 3 UDP ping streams are initiated.
  */
 // clang-format off
@@ -69,7 +69,7 @@
     void CheckResults();
 
   private:
-    /// \internal It is important to have pointers here
+    /// @internal It is important to have pointers here
     NodeContainer* m_nodes;
     /// Simulation time
     Time m_time;
@@ -104,37 +104,37 @@
 
     /**
      * Send data A
-     * \param socket the sending socket
+     * @param socket the sending socket
      */
     void SendDataA(Ptr<Socket> socket);
 
     /**
      * Send data B
-     * \param socket the sending socket
+     * @param socket the sending socket
      */
     void SendDataB(Ptr<Socket> socket);
 
     /**
      * Send data C
-     * \param socket the sending socket
+     * @param socket the sending socket
      */
     void SendDataC(Ptr<Socket> socket);
 
     /**
-     * \brief Handle a packet reception.
+     * @brief Handle a packet reception.
      *
      * This function is called by lower layers.
      *
-     * \param socket the socket the packet was received to.
+     * @param socket the socket the packet was received to.
      */
     void HandleReadServer(Ptr<Socket> socket);
 
     /**
-     * \brief Handle a packet reception.
+     * @brief Handle a packet reception.
      *
      * This function is called by lower layers.
      *
-     * \param socket the socket the packet was received to.
+     * @param socket the socket the packet was received to.
      */
     void HandleReadClient(Ptr<Socket> socket);
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/test/dot11s/pmp-regression.h ns-3.44/src/mesh/test/dot11s/pmp-regression.h
--- ns-3.43/src/mesh/test/dot11s/pmp-regression.h	2024-10-09 16:41:10.056656600 -0700
+++ ns-3.44/src/mesh/test/dot11s/pmp-regression.h	2025-03-09 16:55:49.651372200 -0700
@@ -15,13 +15,13 @@
 using namespace ns3;
 
 /**
- * \ingroup dot11s-test
+ * @ingroup dot11s-test
  *
- * \brief Peering Management Protocol regression test
+ * @brief Peering Management Protocol regression test
  *
  * Initiate scenario with 2 stations. Procedure of opening peer link
  * is the following:
- * \verbatim
+ * @verbatim
  * |----------->|  Beacon
  * |----------->|  Peer Link Open frame
  * |<-----------|  Peer Link Confirm frame
@@ -29,7 +29,7 @@
  * |----------->|  Peer Link Confirm frame
  * |............|
  * |<---------->|  Other beacons
- * \endverbatim
+ * @endverbatim
  */
 class PeerManagementProtocolRegressionTest : public TestCase
 {
@@ -38,7 +38,7 @@
     ~PeerManagementProtocolRegressionTest() override;
 
   private:
-    /// \internal It is important to have pointers here
+    /// @internal It is important to have pointers here
     NodeContainer* m_nodes;
     /// Simulation time
     Time m_time;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/test/dot11s/regression.cc ns-3.44/src/mesh/test/dot11s/regression.cc
--- ns-3.43/src/mesh/test/dot11s/regression.cc	2024-10-09 16:41:10.056656600 -0700
+++ ns-3.44/src/mesh/test/dot11s/regression.cc	2025-03-09 16:55:49.651372200 -0700
@@ -17,9 +17,9 @@
 using namespace ns3;
 
 /**
- * \ingroup dot11s-test
+ * @ingroup dot11s-test
  *
- * \brief Dot11s Regression Suite
+ * @brief Dot11s Regression Suite
  */
 class Dot11sRegressionSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/test/flame/flame-regression.cc ns-3.44/src/mesh/test/flame/flame-regression.cc
--- ns-3.43/src/mesh/test/flame/flame-regression.cc	2024-10-09 16:41:10.056656600 -0700
+++ ns-3.44/src/mesh/test/flame/flame-regression.cc	2025-03-09 16:55:49.651372200 -0700
@@ -134,7 +134,7 @@
     m_clientSocket->Connect(InetSocketAddress(m_interfaces.GetAddress(0), 9));
     m_clientSocket->SetRecvCallback(MakeCallback(&FlameRegressionTest::HandleReadClient, this));
     Simulator::ScheduleWithContext(m_clientSocket->GetNode()->GetId(),
-                                   Seconds(1.0),
+                                   Seconds(1),
                                    &FlameRegressionTest::SendData,
                                    this,
                                    m_clientSocket);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/test/flame/flame-regression.h ns-3.44/src/mesh/test/flame/flame-regression.h
--- ns-3.43/src/mesh/test/flame/flame-regression.h	2024-10-09 16:41:10.056656600 -0700
+++ ns-3.44/src/mesh/test/flame/flame-regression.h	2025-03-09 16:55:49.651372200 -0700
@@ -15,15 +15,15 @@
 using namespace ns3;
 
 /**
- * \ingroup mesh-test
- * \defgroup flame-test flame sub-module tests
+ * @ingroup mesh-test
+ * @defgroup flame-test flame sub-module tests
  */
 
 /**
- * \ingroup flame-test
+ * @ingroup flame-test
  *
- * \brief FLAME protocol regression test of three stations:
- * \verbatim
+ * @brief FLAME protocol regression test of three stations:
+ * @verbatim
  * <-----------|----------->   Broadcast frame
  *             |----------->|  Unicast frame
  *           Source                   Destination
@@ -47,7 +47,7 @@
  *             |............|............|
  *             After five seconds data is transmitted again as
  *             broadcast, and PATH_UPDATE is sent
- * \endverbatim
+ * @endverbatim
  */
 class FlameRegressionTest : public TestCase
 {
@@ -60,7 +60,7 @@
     void CheckResults();
 
   private:
-    /// \internal It is important to have pointers here
+    /// @internal It is important to have pointers here
     NodeContainer* m_nodes;
     /// Simulation time
     Time m_time;
@@ -84,25 +84,25 @@
 
     /**
      * Send data
-     * \param socket the sending socket
+     * @param socket the sending socket
      */
     void SendData(Ptr<Socket> socket);
 
     /**
-     * \brief Handle a packet reception.
+     * @brief Handle a packet reception.
      *
      * This function is called by lower layers.
      *
-     * \param socket the socket the packet was received to.
+     * @param socket the socket the packet was received to.
      */
     void HandleReadServer(Ptr<Socket> socket);
 
     /**
-     * \brief Handle a packet reception.
+     * @brief Handle a packet reception.
      *
      * This function is called by lower layers.
      *
-     * \param socket the socket the packet was received to.
+     * @param socket the socket the packet was received to.
      */
     void HandleReadClient(Ptr<Socket> socket);
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/test/flame/flame-test-suite.cc ns-3.44/src/mesh/test/flame/flame-test-suite.cc
--- ns-3.43/src/mesh/test/flame/flame-test-suite.cc	2024-10-09 16:41:10.056656600 -0700
+++ ns-3.44/src/mesh/test/flame/flame-test-suite.cc	2025-03-09 16:55:49.651372200 -0700
@@ -16,9 +16,9 @@
 using namespace flame;
 
 /**
- * \ingroup flame-test
+ * @ingroup flame-test
  *
- * \brief Built-in self test for FlameHeader
+ * @brief Built-in self test for FlameHeader
  */
 struct FlameHeaderTest : public TestCase
 {
@@ -49,9 +49,9 @@
 //-----------------------------------------------------------------------------
 
 /**
- * \ingroup flame-test
+ * @ingroup flame-test
  *
- * \brief Unit test for FlameRtable
+ * @brief Unit test for FlameRtable
  */
 class FlameRtableTest : public TestCase
 {
@@ -129,9 +129,9 @@
 }
 
 /**
- * \ingroup flame-test
+ * @ingroup flame-test
  *
- * \brief Flame Test Suite
+ * @brief Flame Test Suite
  */
 class FlameTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/test/flame/regression.cc ns-3.44/src/mesh/test/flame/regression.cc
--- ns-3.43/src/mesh/test/flame/regression.cc	2024-10-09 16:41:10.056656600 -0700
+++ ns-3.44/src/mesh/test/flame/regression.cc	2025-03-09 16:55:49.651372200 -0700
@@ -13,9 +13,9 @@
 using namespace ns3;
 
 /**
- * \ingroup flame-test
+ * @ingroup flame-test
  *
- * \brief Flame Regression Suite
+ * @brief Flame Regression Suite
  */
 class FlameRegressionSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mesh/test/mesh-information-element-vector-test-suite.cc ns-3.44/src/mesh/test/mesh-information-element-vector-test-suite.cc
--- ns-3.43/src/mesh/test/mesh-information-element-vector-test-suite.cc	2024-10-09 16:41:10.056656600 -0700
+++ ns-3.44/src/mesh/test/mesh-information-element-vector-test-suite.cc	2025-03-09 16:55:49.651372200 -0700
@@ -23,20 +23,23 @@
 using namespace ns3;
 
 /**
- * \ingroup mesh
- * \ingroup tests
- * \defgroup mesh-test mesh module tests
+ * @ingroup mesh
+ * @ingroup tests
+ * @defgroup mesh-test mesh module tests
  */
 
 /**
- * \ingroup mesh-test
+ * @ingroup mesh-test
  *
- * \brief Built-in self test for MeshInformationElementVector and all IE
+ * @brief Built-in self test for MeshInformationElementVector and all IE
  */
 struct MeshInformationElementVectorBist : public TestCase
 {
     MeshInformationElementVectorBist()
-        : TestCase("Serialization test for all mesh information elements"){};
+        : TestCase("Serialization test for all mesh information elements")
+    {
+    }
+
     void DoRun() override;
 };
 
@@ -70,10 +73,10 @@
     }
     {
         Ptr<dot11s::IeBeaconTiming> beaconTiming = Create<dot11s::IeBeaconTiming>();
-        beaconTiming->AddNeighboursTimingElementUnit(1, Seconds(1.0), Seconds(4.0));
-        beaconTiming->AddNeighboursTimingElementUnit(2, Seconds(2.0), Seconds(3.0));
-        beaconTiming->AddNeighboursTimingElementUnit(3, Seconds(3.0), Seconds(2.0));
-        beaconTiming->AddNeighboursTimingElementUnit(4, Seconds(4.0), Seconds(1.0));
+        beaconTiming->AddNeighboursTimingElementUnit(1, Seconds(1), Seconds(4));
+        beaconTiming->AddNeighboursTimingElementUnit(2, Seconds(2), Seconds(3));
+        beaconTiming->AddNeighboursTimingElementUnit(3, Seconds(3), Seconds(2));
+        beaconTiming->AddNeighboursTimingElementUnit(4, Seconds(4), Seconds(1));
         vector.AddInformationElement(beaconTiming);
     }
     {
@@ -140,9 +143,9 @@
 }
 
 /**
- * \ingroup mesh-test
+ * @ingroup mesh-test
  *
- * \brief Mesh Test Suite
+ * @brief Mesh Test Suite
  */
 class MeshTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mobility/examples/bonnmotion-ns2-example.cc ns-3.44/src/mobility/examples/bonnmotion-ns2-example.cc
--- ns-3.43/src/mobility/examples/bonnmotion-ns2-example.cc	2024-10-09 16:41:10.056656600 -0700
+++ ns-3.44/src/mobility/examples/bonnmotion-ns2-example.cc	2025-03-09 16:55:49.651372200 -0700
@@ -66,9 +66,9 @@
     Ns2MobilityHelper ns2 = Ns2MobilityHelper(traceFile);
     ns2.Install();
 
-    Simulator::Schedule(Seconds(0.0), &showPosition, n0, deltaTime);
+    Simulator::Schedule(Seconds(0), &showPosition, n0, deltaTime);
 
-    Simulator::Stop(Seconds(1000.0));
+    Simulator::Stop(Seconds(1000));
     Simulator::Run();
     Simulator::Destroy();
     return 0;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mobility/examples/constant-mobility-example.cc ns-3.44/src/mobility/examples/constant-mobility-example.cc
--- ns-3.43/src/mobility/examples/constant-mobility-example.cc	2024-10-09 16:41:10.056656600 -0700
+++ ns-3.44/src/mobility/examples/constant-mobility-example.cc	2025-03-09 16:55:49.651372200 -0700
@@ -21,9 +21,9 @@
   (0,0,0)     Move Right    (10,0,0)   Move Right   (20,0,0)   Move Right   (30,0,0)
 */
 
-#include <ns3/mobility-module.h>
-#include <ns3/node.h>
-#include <ns3/simulator.h>
+#include "ns3/mobility-module.h"
+#include "ns3/node.h"
+#include "ns3/simulator.h"
 
 using namespace ns3;
 
@@ -80,11 +80,11 @@
     mob1->TraceConnectWithoutContext("CourseChange", MakeBoundCallback(&CourseChangeCallback));
 
     // Schedule movements to node n1
-    Simulator::ScheduleWithContext(n1->GetId(), Seconds(2.0), &MoveNode, n1, Vector(10, 0, 0));
+    Simulator::ScheduleWithContext(n1->GetId(), Seconds(2), &MoveNode, n1, Vector(10, 0, 0));
 
-    Simulator::ScheduleWithContext(n1->GetId(), Seconds(4.0), &MoveNode, n1, Vector(20, 0, 0));
+    Simulator::ScheduleWithContext(n1->GetId(), Seconds(4), &MoveNode, n1, Vector(20, 0, 0));
 
-    Simulator::ScheduleWithContext(n1->GetId(), Seconds(6.0), &MoveNode, n1, Vector(30, 0, 0));
+    Simulator::ScheduleWithContext(n1->GetId(), Seconds(6), &MoveNode, n1, Vector(30, 0, 0));
 
     Simulator::Stop(Seconds(10));
     Simulator::Run();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mobility/examples/main-random-topology.cc ns-3.44/src/mobility/examples/main-random-topology.cc
--- ns-3.43/src/mobility/examples/main-random-topology.cc	2024-10-09 16:41:10.056656600 -0700
+++ ns-3.44/src/mobility/examples/main-random-topology.cc	2025-03-09 16:55:49.651372200 -0700
@@ -12,8 +12,8 @@
 
 /**
  * Function called when there is a course change
- * \param context event context
- * \param position a pointer to the mobility model
+ * @param context event context
+ * @param position a pointer to the mobility model
  */
 static void
 CourseChange(std::string context, Ptr<const MobilityModel> position)
@@ -45,7 +45,7 @@
 
     Config::Connect("/NodeList/*/$ns3::MobilityModel/CourseChange", MakeCallback(&CourseChange));
 
-    Simulator::Stop(Seconds(100.0));
+    Simulator::Stop(Seconds(100));
 
     Simulator::Run();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mobility/examples/main-random-walk.cc ns-3.44/src/mobility/examples/main-random-walk.cc
--- ns-3.43/src/mobility/examples/main-random-walk.cc	2024-10-09 16:41:10.056656600 -0700
+++ ns-3.44/src/mobility/examples/main-random-walk.cc	2025-03-09 16:55:49.651372200 -0700
@@ -11,8 +11,8 @@
 
 /**
  * Function called when there is a course change
- * \param context event context
- * \param mobility a pointer to the mobility model
+ * @param context event context
+ * @param mobility a pointer to the mobility model
  */
 static void
 CourseChange(std::string context, Ptr<const MobilityModel> mobility)
@@ -59,7 +59,7 @@
     mobility.InstallAll();
     Config::Connect("/NodeList/*/$ns3::MobilityModel/CourseChange", MakeCallback(&CourseChange));
 
-    Simulator::Stop(Seconds(100.0));
+    Simulator::Stop(Seconds(100));
 
     Simulator::Run();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mobility/examples/mobility-trace-example.cc ns-3.44/src/mobility/examples/mobility-trace-example.cc
--- ns-3.43/src/mobility/examples/mobility-trace-example.cc	2024-10-09 16:41:10.056656600 -0700
+++ ns-3.44/src/mobility/examples/mobility-trace-example.cc	2025-03-09 16:55:49.651372200 -0700
@@ -50,7 +50,7 @@
     AsciiTraceHelper ascii;
     MobilityHelper::EnableAsciiAll(ascii.CreateFileStream("mobility-trace-example.mob"));
 
-    Simulator::Stop(Seconds(5.0));
+    Simulator::Stop(Seconds(5));
     Simulator::Run();
     Simulator::Destroy();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mobility/examples/reference-point-group-mobility-example.cc ns-3.44/src/mobility/examples/reference-point-group-mobility-example.cc
--- ns-3.43/src/mobility/examples/reference-point-group-mobility-example.cc	2024-10-09 16:41:10.056656600 -0700
+++ ns-3.44/src/mobility/examples/reference-point-group-mobility-example.cc	2025-03-09 16:55:49.651372200 -0700
@@ -46,8 +46,8 @@
  */
 
 #include "ns3/core-module.h"
+#include "ns3/mobility-module.h"
 #include "ns3/network-module.h"
-#include <ns3/mobility-module.h>
 
 #include <iostream>
 
@@ -61,7 +61,7 @@
 /**
  * Print the node position to the time series file.
  *
- * \param node The node.
+ * @param node The node.
  */
 void
 PrintPosition(Ptr<Node> node)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mobility/helper/group-mobility-helper.h ns-3.44/src/mobility/helper/group-mobility-helper.h
--- ns-3.43/src/mobility/helper/group-mobility-helper.h	2024-10-09 16:41:10.056656600 -0700
+++ ns-3.44/src/mobility/helper/group-mobility-helper.h	2025-03-09 16:55:49.655372100 -0700
@@ -24,8 +24,8 @@
 class MobilityModel;
 
 /**
- * \ingroup mobility
- * \brief Helper class used to assign positions and mobility models to nodes
+ * @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
@@ -50,7 +50,7 @@
      * 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
+     * @param allocator allocate initial reference mobility model position
      */
     void SetReferencePositionAllocator(Ptr<PositionAllocator> allocator);
 
@@ -58,9 +58,9 @@
      * Configure the position allocator which will be used to allocate
      * the initial position of the reference mobility model.
      *
-     * \tparam Ts \deduced Argument types
-     * \param type the type of position allocator to use.
-     * \param [in] args Name and AttributeValue pairs to set.
+     * @tparam Ts \deduced Argument types
+     * @param type the type of position allocator to use.
+     * @param [in] args Name and AttributeValue pairs to set.
      */
     template <typename... Ts>
     void SetReferencePositionAllocator(std::string type, Ts&&... args);
@@ -69,7 +69,7 @@
      * 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
+     * @param allocator allocate initial member mobility model positions
      */
     void SetMemberPositionAllocator(Ptr<PositionAllocator> allocator);
 
@@ -77,9 +77,9 @@
      * Configure the position allocator which will be used to allocate the
      * initial position of the member mobility models.
      *
-     * \tparam Ts \deduced Argument types
-     * \param type the type of position allocator to use.
-     * \param [in] args Name and AttributeValue pairs to set.
+     * @tparam Ts \deduced Argument types
+     * @param type the type of position allocator to use.
+     * @param [in] args Name and AttributeValue pairs to set.
      */
     template <typename... Ts>
     void SetMemberPositionAllocator(std::string type, Ts&&... args);
@@ -88,7 +88,7 @@
      * Set the reference mobility model which will be installed as the parent
      * mobility model during GroupMobilityModel::Install.
      *
-     * \param mobility reference mobility model
+     * @param mobility reference mobility model
      */
     void SetReferenceMobilityModel(Ptr<MobilityModel> mobility);
 
@@ -96,9 +96,9 @@
      * Configure the reference mobility model which will be installed as the
      * parent mobility model during GroupMobilityModel::Install.
      *
-     * \tparam Ts \deduced Argument types
-     * \param type the type of mobility model to use.
-     * \param [in] args Name and AttributeValue pairs to set.
+     * @tparam Ts \deduced Argument types
+     * @param type the type of mobility model to use.
+     * @param [in] args Name and AttributeValue pairs to set.
      */
     template <typename... Ts>
     void SetReferenceMobilityModel(std::string type, Ts&&... args);
@@ -110,42 +110,42 @@
      * Calls to MobilityHelper::Install will create an instance of a matching
      * mobility model for each node.
      *
-     * \tparam Ts \deduced Argument types
-     * \param type the type of mobility model to use.
-     * \param [in] args Name and AttributeValue pairs to set.
+     * @tparam Ts \deduced Argument types
+     * @param type the type of mobility model to use.
+     * @param [in] args Name and AttributeValue pairs to set.
      */
     template <typename... Ts>
     void SetMemberMobilityModel(std::string type, Ts&&... args);
 
     /**
-     * \brief Install and configure a hierarchical mobility model to the
+     * @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
+     * @param node The node to configure
      */
     void Install(Ptr<Node> node);
     /**
-     * \brief Install and configure a hierarchical mobility model to the
+     * @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
+     * @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
+     * @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
+     * @param container The set of nodes to configure
      */
     void Install(NodeContainer container);
 
@@ -155,17 +155,17 @@
      * 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
+     * @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
+     * @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
+     * @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.43/src/mobility/helper/mobility-helper.cc ns-3.44/src/mobility/helper/mobility-helper.cc
--- ns-3.43/src/mobility/helper/mobility-helper.cc	2024-10-09 16:41:10.056656600 -0700
+++ ns-3.44/src/mobility/helper/mobility-helper.cc	2025-03-09 16:55:49.655372100 -0700
@@ -130,8 +130,8 @@
 /**
  * Utility function that rounds |1e-4| < input value < |1e-3| up to +/- 1e-3
  * and value <= |1e-4| to zero
- * \param v value to round
- * \return rounded value
+ * @param v value to round
+ * @return rounded value
  */
 static double
 DoRound(double v)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mobility/helper/mobility-helper.h ns-3.44/src/mobility/helper/mobility-helper.h
--- ns-3.43/src/mobility/helper/mobility-helper.h	2024-10-09 16:41:10.056656600 -0700
+++ ns-3.44/src/mobility/helper/mobility-helper.h	2025-03-09 16:55:49.655372100 -0700
@@ -24,8 +24,8 @@
 class MobilityModel;
 
 /**
- * \ingroup mobility
- * \brief Helper class used to assign positions and mobility models to nodes.
+ * @ingroup mobility
+ * @brief Helper class used to assign positions and mobility models to nodes.
  *
  * MobilityHelper::Install is the most important method here.
  */
@@ -47,22 +47,22 @@
      * Set the position allocator which will be used to allocate the initial
      * position of every node initialized during MobilityModel::Install.
      *
-     * \param allocator allocate initial node positions
+     * @param allocator allocate initial node positions
      */
     void SetPositionAllocator(Ptr<PositionAllocator> allocator);
 
     /**
-     * \tparam Ts \deduced Argument types
-     * \param type the type of mobility model to use.
-     * \param [in] args Name and AttributeValue pairs to set.
+     * @tparam Ts \deduced Argument types
+     * @param type the type of mobility model to use.
+     * @param [in] args Name and AttributeValue pairs to set.
      */
     template <typename... Ts>
     void SetPositionAllocator(std::string type, Ts&&... args);
 
     /**
-     * \tparam Ts \deduced Argument types
-     * \param type the type of mobility model to use.
-     * \param [in] args Name and AttributeValue pairs to set.
+     * @tparam Ts \deduced Argument types
+     * @param type the type of mobility model to use.
+     * @param [in] args Name and AttributeValue pairs to set.
      *
      * Calls to MobilityHelper::Install will create an instance of a matching
      * mobility model for each node.
@@ -71,7 +71,7 @@
     void SetMobilityModel(std::string type, Ts&&... args);
 
     /**
-     * \param reference item to push.
+     * @param reference item to push.
      *
      * Push an item on the top of the stack of "reference mobility models".
      * The input item should be a node instance to which a mobility model
@@ -90,7 +90,7 @@
      */
     void PushReferenceMobilityModel(Ptr<Object> reference);
     /**
-     * \param referenceName named item to push.
+     * @param referenceName named item to push.
      *
      * Push an item on the top of the stack of "reference mobility models".
      * The input item should be a node instance to which a mobility model
@@ -115,36 +115,36 @@
     void PopReferenceMobilityModel();
 
     /**
-     * \return a string which contains the TypeId of the currently-selected
+     * @return a string which contains the TypeId of the currently-selected
      *          mobility model.
      */
     std::string GetMobilityModelType() const;
 
     /**
-     * \brief "Layout" a single node according to the current position allocator type.
+     * @brief "Layout" a single node according to the current position allocator type.
      *
      * This method creates an instance of a ns3::MobilityModel subclass (the
      * type of which was set with MobilityHelper::SetMobilityModel), aggregates
      * it to the provided node, and sets an initial position based on the current
      * position allocator (set through MobilityHelper::SetPositionAllocator).
      *
-     * \param node The node to "layout."
+     * @param node The node to "layout."
      */
     void Install(Ptr<Node> node) const;
     /**
-     * \brief "Layout" a single node according to the current position allocator type.
+     * @brief "Layout" a single node according to the current position allocator type.
      *
      * This method creates an instance of a ns3::MobilityModel subclass (the
      * type of which was set with MobilityHelper::SetMobilityModel), aggregates
      * it to the provided node, and sets an initial position based on the current
      * position allocator (set through MobilityHelper::SetPositionAllocator).
      *
-     * \param nodeName The name of the node to "layout."
+     * @param nodeName The name of the node to "layout."
      */
     void Install(std::string nodeName) const;
 
     /**
-     * \brief Layout a collection of nodes according to the current position allocator type.
+     * @brief Layout a collection of nodes according to the current position allocator type.
      *
      * For each node in the provided NodeContainer, this method creates an instance
      * of a ns3::MobilityModel subclass (the type of which was set with
@@ -152,7 +152,7 @@
      * initial position based on the current position allocator (set through
      * MobilityHelper::SetPositionAllocator).
      *
-     * \param container The set of nodes to layout.
+     * @param container The set of nodes to layout.
      */
     void Install(NodeContainer container) const;
 
@@ -163,8 +163,8 @@
     void InstallAll() const;
 
     /**
-     * \param stream an output stream wrapper
-     * \param nodeid the id of the node to generate ascii output for.
+     * @param stream an output stream wrapper
+     * @param nodeid the id of the node to generate ascii output for.
      *
      * Enable ascii output to record course changes from the mobility model
      * associated with the specified nodeid and dump that to the specified output
@@ -173,8 +173,8 @@
      */
     static void EnableAscii(Ptr<OutputStreamWrapper> stream, uint32_t nodeid);
     /**
-     * \param stream an output stream wrapper
-     * \param n node container
+     * @param stream an output stream wrapper
+     * @param n node container
      *
      * Enable ascii output to record course changes from the mobility models
      * associated to the the nodes in the input container and dump that to the
@@ -183,7 +183,7 @@
      */
     static void EnableAscii(Ptr<OutputStreamWrapper> stream, NodeContainer n);
     /**
-     * \param stream an output stream wrapper
+     * @param stream an output stream wrapper
      *
      * Enable ascii output to record course changes from the mobility models
      * associated to every node in the system and dump that to the specified
@@ -197,32 +197,32 @@
      * 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
+     * @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
+     * @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
+     * @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);
 
     /**
-     * \param n1 node 1
-     * \param n2 node 2
-     * \return the distance (squared), in meters, between two nodes
+     * @param n1 node 1
+     * @param n2 node 2
+     * @return the distance (squared), in meters, between two nodes
      */
     static double GetDistanceSquaredBetween(Ptr<Node> n1, Ptr<Node> n2);
 
   private:
     /**
      * Output course change events from mobility model to output stream
-     * \param stream output stream
-     * \param mobility mobility model
+     * @param stream output stream
+     * @param mobility mobility model
      */
     static void CourseChanged(Ptr<OutputStreamWrapper> stream, Ptr<const MobilityModel> mobility);
     std::vector<Ptr<MobilityModel>> m_mobilityStack; //!< Internal stack of mobility models
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mobility/helper/ns2-mobility-helper.cc ns-3.44/src/mobility/helper/ns2-mobility-helper.cc
--- ns-3.43/src/mobility/helper/ns2-mobility-helper.cc	2024-10-09 16:41:10.056656600 -0700
+++ ns-3.44/src/mobility/helper/ns2-mobility-helper.cc	2025-03-09 16:55:49.655372100 -0700
@@ -82,111 +82,114 @@
     EventId m_stopEvent;    //!< Event scheduling node's stop. May be canceled if needed.
     double m_travelStartTime;   //!< Travel start time is needed to calculate actually traveled time
     double m_targetArrivalTime; //!< When a station arrives to a destination
+
     DestinationPoint()
         : m_startPosition(Vector(0, 0, 0)),
           m_speed(Vector(0, 0, 0)),
           m_finalPosition(Vector(0, 0, 0)),
           m_travelStartTime(0),
-          m_targetArrivalTime(0){};
+          m_targetArrivalTime(0)
+    {
+    }
 };
 
 /**
  * Parses a line of ns2 mobility
- * \param str the string to parse
- * \returns The parsed line
+ * @param str the string to parse
+ * @returns The parsed line
  */
 static ParseResult ParseNs2Line(const std::string& str);
 
 /**
  * Put out blank spaces at the start and end of a line
- * \param str input line
- * \returns the line trimmed
+ * @param str input line
+ * @returns the line trimmed
  */
 static std::string TrimNs2Line(const std::string& str);
 
 /**
  * Checks if a string represents a number or it has others characters than digits and point.
- * \param s the string to check
- * \returns true if the string represents a number
+ * @param s the string to check
+ * @returns true if the string represents a number
  */
 static bool IsNumber(const std::string& s);
 
 /**
  * Check if s string represents a numeric value
- * \param str string to check
- * \param ret numeric value to return
- * \return true if string represents a numeric value
+ * @param str string to check
+ * @param ret numeric value to return
+ * @return true if string represents a numeric value
  */
 template <class T>
 static bool IsVal(const std::string& str, T& ret);
 
 /**
  * Checks if the value between brackets is a correct nodeId number
- * \param str string to check
- * \returns true if the string represents a nodeId number
+ * @param str string to check
+ * @returns true if the string represents a nodeId number
  */
 static bool HasNodeIdNumber(std::string str);
 
 /**
  * Gets nodeId number in string format from the string like $node_(4)
- * \param str string to de-tokenize
- * \returns A string with the nodeId number
+ * @param str string to de-tokenize
+ * @returns A string with the nodeId number
  */
 static std::string GetNodeIdFromToken(std::string str);
 
 /**
  * Get node id number in int format
- * \param pr the ParseResult to analyze
- * \returns the node ID (as an int)
+ * @param pr the ParseResult to analyze
+ * @returns the node ID (as an int)
  */
 static int GetNodeIdInt(ParseResult pr);
 
 /**
  * Get node id number in string format
- * \param pr the ParseResult to analyze
- * \returns the node ID (as a string)
+ * @param pr the ParseResult to analyze
+ * @returns the node ID (as a string)
  */
 static std::string GetNodeIdString(ParseResult pr);
 
 /**
  * Add one coord to a vector position
- * \param actPos actual position (overwritten)
- * \param coord coordinate (x, y, or z)
- * \param value value of the coordinate
- * \return The vector of the position
+ * @param actPos actual position (overwritten)
+ * @param coord coordinate (x, y, or z)
+ * @param value value of the coordinate
+ * @return The vector of the position
  */
 static Vector SetOneInitialCoord(Vector actPos, std::string& coord, double value);
 
 /**
  * Check if this corresponds to a line like this: $node_(0) set X_ 123
- * \param pr the ParseResult to analyze
- * \returns true if the ParseResult looks like a coordinate without a scheduled time
+ * @param pr the ParseResult to analyze
+ * @returns true if the ParseResult looks like a coordinate without a scheduled time
  */
 static bool IsSetInitialPos(ParseResult pr);
 
 /**
  * Check if this corresponds to a line like this: $ns_ at 1 "$node_(0) setdest 2 3 4"
- * \param pr the ParseResult to analyze
- * \returns true if the ParseResult looks like a coordinate with a scheduled time and destination
+ * @param pr the ParseResult to analyze
+ * @returns true if the ParseResult looks like a coordinate with a scheduled time and destination
  */
 static bool IsSchedSetPos(ParseResult pr);
 
 /**
  * Check if this corresponds to a line like this: $ns_ at 1 "$node_(0) set X_ 2"
- * \param pr the ParseResult to analyze
- * \returns true if the ParseResult looks like a coordinate with a scheduled time
+ * @param pr the ParseResult to analyze
+ * @returns true if the ParseResult looks like a coordinate with a scheduled time
  */
 static bool IsSchedMobilityPos(ParseResult pr);
 
 /**
  * Set waypoints and speed for movement.
- * \param model mobility model
- * \param lastPos last position
- * \param at initial movement time
- * \param xFinalPosition final position (X axis)
- * \param yFinalPosition final position (Y axis)
- * \param speed movement speed
- * \returns A descriptor of the movement
+ * @param model mobility model
+ * @param lastPos last position
+ * @param at initial movement time
+ * @param xFinalPosition final position (X axis)
+ * @param yFinalPosition final position (Y axis)
+ * @param speed movement speed
+ * @returns A descriptor of the movement
  */
 static DestinationPoint SetMovement(Ptr<ConstantVelocityMobilityModel> model,
                                     Vector lastPos,
@@ -197,10 +200,10 @@
 
 /**
  * Set initial position for a node
- * \param model mobility model
- * \param coord coordinate (x, y, or z)
- * \param coordVal value of the coordinate
- * \return The vector of the position
+ * @param model mobility model
+ * @param coord coordinate (x, y, or z)
+ * @param coordVal value of the coordinate
+ * @return The vector of the position
  */
 static Vector SetInitialPosition(Ptr<ConstantVelocityMobilityModel> model,
                                  std::string coord,
@@ -208,11 +211,11 @@
 
 /**
  * Schedule a set of position for a node
- * \param model mobility model
- * \param at initial movement time
- * \param coord coordinate (x, y, or z)
- * \param coordVal value of the coordinate
- * \return The vector of the position at the given time
+ * @param model mobility model
+ * @param at initial movement time
+ * @param coord coordinate (x, y, or z)
+ * @param coordVal value of the coordinate
+ * @return The vector of the position at the given time
  */
 static Vector SetSchedPosition(Ptr<ConstantVelocityMobilityModel> model,
                                double at,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mobility/helper/ns2-mobility-helper.h ns-3.44/src/mobility/helper/ns2-mobility-helper.h
--- ns-3.43/src/mobility/helper/ns2-mobility-helper.h	2024-10-09 16:41:10.056656600 -0700
+++ ns-3.44/src/mobility/helper/ns2-mobility-helper.h	2025-03-09 16:55:49.655372100 -0700
@@ -23,8 +23,8 @@
 class ConstantVelocityMobilityModel;
 
 /**
- * \ingroup mobility
- * \brief Helper class which can read ns-2 movement files and configure nodes mobility.
+ * @ingroup mobility
+ * @brief Helper class which can read ns-2 movement files and configure nodes mobility.
  *
  * This implementation is based on the ns2 movement documentation of ns2
  * as described in http://www.isi.edu/nsnam/ns/doc/node172.html
@@ -59,7 +59,7 @@
  *
  *  See usage example in examples/mobility/ns2-mobility-trace.cc
  *
- * \bug Rounding errors may cause movement to diverge from the mobility
+ * @bug Rounding errors may cause movement to diverge from the mobility
  * pattern in ns-2 (using the same trace).
  * See https://www.nsnam.org/bugzilla/show_bug.cgi?id=1316
  */
@@ -67,7 +67,7 @@
 {
   public:
     /**
-     * \param filename filename of file which contains the
+     * @param filename filename of file which contains the
      *        ns2 movement trace.
      */
     Ns2MobilityHelper(std::string filename);
@@ -81,9 +81,9 @@
     void Install() const;
 
     /**
-     * \param begin an iterator which points to the start of the input
+     * @param begin an iterator which points to the start of the input
      *        object array.
-     * \param end an iterator which points to the end of the input
+     * @param end an iterator which points to the end of the input
      *        object array.
      *
      * Read the ns2 trace file and configure the movement
@@ -96,7 +96,7 @@
 
   private:
     /**
-     * \brief a class to hold input objects internally
+     * @brief a class to hold input objects internally
      */
     class ObjectStore
     {
@@ -107,22 +107,22 @@
 
         /**
          * Return ith object in store
-         * \param i index
-         * \return pointer to object
+         * @param i index
+         * @return pointer to object
          */
         virtual Ptr<Object> Get(uint32_t i) const = 0;
     };
 
     /**
      * Parses ns-2 mobility file to create ns-3 mobility events
-     * \param store Object store containing ns-3 mobility models
+     * @param store Object store containing ns-3 mobility models
      */
     void ConfigNodesMovements(const ObjectStore& store) const;
     /**
      * Get or create a ConstantVelocityMobilityModel corresponding to idString
-     * \param idString string name for a node
-     * \param store Object store containing ns-3 mobility models
-     * \return pointer to a ConstantVelocityMobilityModel
+     * @param idString string name for a node
+     * @param store Object store containing ns-3 mobility models
+     * @return pointer to a ConstantVelocityMobilityModel
      */
     Ptr<ConstantVelocityMobilityModel> GetMobilityModel(std::string idString,
                                                         const ObjectStore& store) const;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mobility/model/box.cc ns-3.44/src/mobility/model/box.cc
--- ns-3.43/src/mobility/model/box.cc	2024-10-09 16:41:10.056656600 -0700
+++ ns-3.44/src/mobility/model/box.cc	2025-03-09 16:55:49.655372100 -0700
@@ -191,11 +191,11 @@
 ATTRIBUTE_HELPER_CPP(Box);
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the stream
- * \param box the box
- * \returns a reference to the stream
+ * @param os the stream
+ * @param box the box
+ * @returns a reference to the stream
  */
 std::ostream&
 operator<<(std::ostream& os, const Box& box)
@@ -206,11 +206,11 @@
 }
 
 /**
- * \brief Stream extraction operator.
+ * @brief Stream extraction operator.
  *
- * \param is the stream
- * \param box the box
- * \returns a reference to the stream
+ * @param is the stream
+ * @param box the box
+ * @returns a reference to the stream
  */
 std::istream&
 operator>>(std::istream& is, Box& box)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mobility/model/box.h ns-3.44/src/mobility/model/box.h
--- ns-3.43/src/mobility/model/box.h	2024-10-09 16:41:10.056656600 -0700
+++ ns-3.44/src/mobility/model/box.h	2025-03-09 16:55:49.655372100 -0700
@@ -16,9 +16,9 @@
 {
 
 /**
- * \ingroup mobility
- * \brief a 3d box
- * \see attribute_Box
+ * @ingroup mobility
+ * @brief a 3d box
+ * @see attribute_Box
  */
 class Box
 {
@@ -37,12 +37,12 @@
     };
 
     /**
-     * \param _xMin x coordinates of left boundary.
-     * \param _xMax x coordinates of right boundary.
-     * \param _yMin y coordinates of bottom boundary.
-     * \param _yMax y coordinates of top boundary.
-     * \param _zMin z coordinates of down boundary.
-     * \param _zMax z coordinates of up boundary.
+     * @param _xMin x coordinates of left boundary.
+     * @param _xMax x coordinates of right boundary.
+     * @param _yMin y coordinates of bottom boundary.
+     * @param _yMax y coordinates of top boundary.
+     * @param _zMin z coordinates of down boundary.
+     * @param _zMax z coordinates of up boundary.
      *
      * Create a box.
      */
@@ -52,24 +52,24 @@
      */
     Box();
     /**
-     * \param position the position to test.
-     * \returns true if the input position is located within the box,
+     * @param position the position to test.
+     * @returns true if the input position is located within the box,
      *          false otherwise.
      *
      * This method compares the x, y, and z coordinates of the input position.
      */
     bool IsInside(const Vector& position) const;
     /**
-     * \param position the position to test.
-     * \returns the side of the cube the input position is closest to.
+     * @param position the position to test.
+     * @returns the side of the cube the input position is closest to.
      *
      * This method compares the x, y, and z coordinates of the input position.
      */
     Side GetClosestSide(const Vector& position) const;
     /**
-     * \param current the current position
-     * \param speed the current speed
-     * \returns the intersection point between the rectangle and the current+speed vector.
+     * @param current the current position
+     * @param speed the current speed
+     * @returns the intersection point between the rectangle and the current+speed vector.
      *
      * This method assumes that the current position is located _inside_
      * the cube and checks for this with an assert.
@@ -78,7 +78,7 @@
      */
     Vector CalculateIntersection(const Vector& current, const Vector& speed) const;
     /**
-     * \brief Checks if a line-segment between position l1 and position l2
+     * @brief Checks if a line-segment between position l1 and position l2
      *        intersects a box.
      *
      * This method considers all the three coordinates, i.e., x, y, and z.
@@ -89,9 +89,9 @@
      * Frequency Spectrum above 6 GHz". In Proceedings of the Workshop on ns-3
      * (WNS3 '17). 2017.
      *
-     * \param l1 position
-     * \param l2 position
-     * \return true if there is a intersection, false otherwise
+     * @param l1 position
+     * @param l2 position
+     * @return true if there is a intersection, false otherwise
      */
     bool IsIntersect(const Vector& l1, const Vector& l2) const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mobility/model/constant-acceleration-mobility-model.h ns-3.44/src/mobility/model/constant-acceleration-mobility-model.h
--- ns-3.43/src/mobility/model/constant-acceleration-mobility-model.h	2024-10-09 16:41:10.056656600 -0700
+++ ns-3.44/src/mobility/model/constant-acceleration-mobility-model.h	2025-03-09 16:55:49.655372100 -0700
@@ -14,9 +14,9 @@
 {
 
 /**
- * \ingroup mobility
+ * @ingroup mobility
  *
- * \brief Mobility model for which the current acceleration does not change once it has been set and
+ * @brief Mobility model for which the current acceleration does not change once it has been set and
  * until it is set again explicitly to a new value.
  */
 class ConstantAccelerationMobilityModel : public MobilityModel
@@ -24,7 +24,7 @@
   public:
     /**
      * Register this type with the TypeId system.
-     * \return the object TypeId
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     /**
@@ -35,8 +35,8 @@
     ~ConstantAccelerationMobilityModel() override;
     /**
      * Set the model's velocity and acceleration
-     * \param velocity the velocity (m/s)
-     * \param acceleration the acceleration (m/s^2)
+     * @param velocity the velocity (m/s)
+     * @param acceleration the acceleration (m/s^2)
      */
     void SetVelocityAndAcceleration(const Vector& velocity, const Vector& acceleration);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mobility/model/constant-position-mobility-model.h ns-3.44/src/mobility/model/constant-position-mobility-model.h
--- ns-3.43/src/mobility/model/constant-position-mobility-model.h	2024-10-09 16:41:10.056656600 -0700
+++ ns-3.44/src/mobility/model/constant-position-mobility-model.h	2025-03-09 16:55:49.655372100 -0700
@@ -14,9 +14,9 @@
 {
 
 /**
- * \ingroup mobility
+ * @ingroup mobility
  *
- * \brief Mobility model for which the current position does not change once it has been set and
+ * @brief Mobility model for which the current position does not change once it has been set and
  * until it is set again explicitly to a new value.
  */
 class ConstantPositionMobilityModel : public MobilityModel
@@ -24,7 +24,7 @@
   public:
     /**
      * Register this type with the TypeId system.
-     * \return the object TypeId
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mobility/model/constant-velocity-helper.h ns-3.44/src/mobility/model/constant-velocity-helper.h
--- ns-3.43/src/mobility/model/constant-velocity-helper.h	2024-10-09 16:41:10.056656600 -0700
+++ ns-3.44/src/mobility/model/constant-velocity-helper.h	2025-03-09 16:55:49.655372100 -0700
@@ -19,9 +19,9 @@
 class Rectangle;
 
 /**
- * \ingroup mobility
+ * @ingroup mobility
  *
- * \brief Utility class used to move node with constant velocity.
+ * @brief Utility class used to move node with constant velocity.
  */
 class ConstantVelocityHelper
 {
@@ -29,34 +29,34 @@
     ConstantVelocityHelper();
     /**
      * Create object and set position
-     * \param position the position vector
+     * @param position the position vector
      */
     ConstantVelocityHelper(const Vector& position);
     /**
      * Create object and set position and velocity
-     * \param position the position vector
-     * \param vel the velocity vector
+     * @param position the position vector
+     * @param vel the velocity vector
      */
     ConstantVelocityHelper(const Vector& position, const Vector& vel);
 
     /**
      * Set position vector
-     * \param position Position vector
+     * @param position Position vector
      */
     void SetPosition(const Vector& position);
     /**
      * Get current position vector
-     * \return Position vector
+     * @return Position vector
      */
     Vector GetCurrentPosition() const;
     /**
      * Get velocity; if paused, will return a zero vector
-     * \return Velocity vector
+     * @return Velocity vector
      */
     Vector GetVelocity() const;
     /**
      * Set new velocity vector
-     * \param vel Velocity vector
+     * @param vel Velocity vector
      */
     void SetVelocity(const Vector& vel);
     /**
@@ -70,13 +70,13 @@
 
     /**
      * Update position, if not paused, from last position and time of last update
-     * \param rectangle 2D bounding rectangle for resulting position; object will not move outside
+     * @param rectangle 2D bounding rectangle for resulting position; object will not move outside
      * the rectangle
      */
     void UpdateWithBounds(const Rectangle& rectangle) const;
     /**
      * Update position, if not paused, from last position and time of last update
-     * \param bounds 3D bounding box for resulting position; object will not move outside the box
+     * @param bounds 3D bounding box for resulting position; object will not move outside the box
      */
     void UpdateWithBounds(const Box& bounds) const;
     /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mobility/model/constant-velocity-mobility-model.h ns-3.44/src/mobility/model/constant-velocity-mobility-model.h
--- ns-3.43/src/mobility/model/constant-velocity-mobility-model.h	2024-10-09 16:41:10.056656600 -0700
+++ ns-3.44/src/mobility/model/constant-velocity-mobility-model.h	2025-03-09 16:55:49.655372100 -0700
@@ -19,9 +19,9 @@
 {
 
 /**
- * \ingroup mobility
+ * @ingroup mobility
  *
- * \brief Mobility model for which the current speed does not change once it has been set and until
+ * @brief Mobility model for which the current speed does not change once it has been set and until
  * it is set again explicitly to a new value.
  */
 class ConstantVelocityMobilityModel : public MobilityModel
@@ -29,7 +29,7 @@
   public:
     /**
      * Register this type with the TypeId system.
-     * \return the object TypeId
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     /**
@@ -40,7 +40,7 @@
     ~ConstantVelocityMobilityModel() override;
 
     /**
-     * \param speed the new speed to set.
+     * @param speed the new speed to set.
      *
      * Set the current speed now to (dx,dy,dz)
      * Unit is meters/s
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mobility/model/gauss-markov-mobility-model.cc ns-3.44/src/mobility/model/gauss-markov-mobility-model.cc
--- ns-3.43/src/mobility/model/gauss-markov-mobility-model.cc	2024-10-09 16:41:10.056656600 -0700
+++ ns-3.44/src/mobility/model/gauss-markov-mobility-model.cc	2025-03-09 16:55:49.655372100 -0700
@@ -36,7 +36,7 @@
                           MakeBoxChecker())
             .AddAttribute("TimeStep",
                           "Change current direction and speed after moving for this time.",
-                          TimeValue(Seconds(1.0)),
+                          TimeValue(Seconds(1)),
                           MakeTimeAccessor(&GaussMarkovMobilityModel::m_timeStep),
                           MakeTimeChecker())
             .AddAttribute(
@@ -161,7 +161,7 @@
     nextPosition.z += speed.z * delayLeft.GetSeconds();
     if (delayLeft.GetSeconds() < 0.0)
     {
-        delayLeft = Seconds(1.0);
+        delayLeft = Seconds(1);
     }
 
     // Make sure that the position by the next time step is still within the boundary.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mobility/model/gauss-markov-mobility-model.h ns-3.44/src/mobility/model/gauss-markov-mobility-model.h
--- ns-3.43/src/mobility/model/gauss-markov-mobility-model.h	2024-10-09 16:41:10.056656600 -0700
+++ ns-3.44/src/mobility/model/gauss-markov-mobility-model.h	2025-03-09 16:55:49.655372100 -0700
@@ -25,8 +25,8 @@
 {
 
 /**
- * \ingroup mobility
- * \brief Gauss-Markov mobility model
+ * @ingroup mobility
+ * @brief Gauss-Markov mobility model
  *
  * This is a 3D version of the Gauss-Markov mobility model described in [1].
  * Unlike the other mobility models in ns-3, which are memoryless, the Gauss
@@ -42,7 +42,7 @@
  * version of the "rectangle" field that is used in 2-dimensional ns-3 mobility models.
  *
  * Here is an example of how to implement the model and set the initial node positions:
- * \code
+ * @code
     MobilityHelper mobility;
 
     mobility.SetMobilityModel ("ns3::GaussMarkovMobilityModel",
@@ -62,7 +62,7 @@
       "Z", StringValue ("ns3::UniformRandomVariable[Min=0|Max=10000]"));
 
     mobility.Install (wifiStaNodes);
- * \endcode
+ * @endcode
  * [1] Tracy Camp, Jeff Boleng, Vanessa Davies, "A Survey of Mobility Models
  * for Ad Hoc Network Research", Wireless Communications and Mobile Computing,
  * Wiley, vol.2 iss.5, September 2002, pp.483-502
@@ -72,7 +72,7 @@
   public:
     /**
      * Register this type with the TypeId system.
-     * \return the object TypeId
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     GaussMarkovMobilityModel();
@@ -85,7 +85,7 @@
     void Start();
     /**
      * Perform a walk operation
-     * \param timeLeft time until Start method is called again
+     * @param timeLeft time until Start method is called again
      */
     void DoWalk(Time timeLeft);
     void DoDispose() override;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mobility/model/geocentric-constant-position-mobility-model.cc ns-3.44/src/mobility/model/geocentric-constant-position-mobility-model.cc
--- ns-3.43/src/mobility/model/geocentric-constant-position-mobility-model.cc	2024-10-09 16:41:10.056656600 -0700
+++ ns-3.44/src/mobility/model/geocentric-constant-position-mobility-model.cc	2025-03-09 16:55:49.655372100 -0700
@@ -7,13 +7,13 @@
  */
 #include "geocentric-constant-position-mobility-model.h"
 
-#include <ns3/angles.h>
+#include "ns3/angles.h"
 
 #include <math.h>
 
 /**
- *  \file
- *  \ingroup mobility
+ *  @file
+ *  @ingroup mobility
  *  Class GeocentricConstantPositionMobilityModel implementation.
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mobility/model/geocentric-constant-position-mobility-model.h ns-3.44/src/mobility/model/geocentric-constant-position-mobility-model.h
--- ns-3.43/src/mobility/model/geocentric-constant-position-mobility-model.h	2024-10-09 16:41:10.056656600 -0700
+++ ns-3.44/src/mobility/model/geocentric-constant-position-mobility-model.h	2025-03-09 16:55:49.655372100 -0700
@@ -12,8 +12,8 @@
 #include "mobility-model.h"
 
 /**
- * \file
- * \ingroup mobility
+ * @file
+ * @ingroup mobility
  * Class GeocentricConstantPositionMobilityModel declaration.
  */
 
@@ -21,14 +21,14 @@
 {
 
 /**
- * \brief Mobility model using geocentric euclidean coordinates, as defined in 38.811 chapter 6.3
+ * @brief Mobility model using geocentric euclidean coordinates, as defined in 38.811 chapter 6.3
  */
 class GeocentricConstantPositionMobilityModel : public MobilityModel
 {
   public:
     /**
      * Register this type with the TypeId system.
-     * \return the object TypeId
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     /**
@@ -38,31 +38,31 @@
     ~GeocentricConstantPositionMobilityModel() override = default;
 
     /**
-     * \brief Computes elevation angle between a ground terminal and a HAPS/Satellite.
+     * @brief Computes elevation angle between a ground terminal and a HAPS/Satellite.
      * After calculating the plane perpendicular to a cartesian position vector,
      * the elevation angle is calculated using
      * https://www.w3schools.blog/angle-between-a-line-and-a-plane.
      * The altitude of the position passed as a parameter must be higher than that of the reference
      * point.
-     * \param other pointer to the HAPS/satellite mobility model
-     * \return the elevation angle
+     * @param other pointer to the HAPS/satellite mobility model
+     * @return the elevation angle
      * in degrees
      */
     virtual double GetElevationAngle(Ptr<const GeocentricConstantPositionMobilityModel> other);
 
     /**
-     * \brief Get the position using geographic (geodetic) coordinates
-     * \return Vector containing (latitude (degree), longitude (degree), altitude (meter))
+     * @brief Get the position using geographic (geodetic) coordinates
+     * @return Vector containing (latitude (degree), longitude (degree), altitude (meter))
      */
     virtual Vector GetGeographicPosition() const;
 
     /**
-     * \brief Set the position using geographic coordinates
+     * @brief Set the position using geographic coordinates
      *
      * Sets the position, using geographic coordinates and asserting
      * that the provided parameter falls within the appropriate range.
      *
-     * \param latLonAlt pointer to a Vector containing (latitude (degree), longitude (degree),
+     * @param latLonAlt pointer to a Vector containing (latitude (degree), longitude (degree),
      * altitude (meter)). The values are expected to be in the ranges [-90, 90], [-180, 180], [0,
      * +inf[, respectively. These assumptions are enforced with an assert for the latitude and the
      * altitude, while the longitude is normalized to the expected range.
@@ -70,67 +70,67 @@
     virtual void SetGeographicPosition(const Vector& latLonAlt);
 
     /**
-     * \brief Get the position using Geocentric Cartesian coordinates
-     * \return Vector containing (x, y, z) (meter) coordinates
+     * @brief Get the position using Geocentric Cartesian coordinates
+     * @return Vector containing (x, y, z) (meter) coordinates
      */
     virtual Vector GetGeocentricPosition() const;
 
     /**
-     * \brief Set the position using Geocentric Cartesian coordinates
-     * \param position pointer to a Vector containing (x, y, z) (meter) coordinates
+     * @brief Set the position using Geocentric Cartesian coordinates
+     * @param position pointer to a Vector containing (x, y, z) (meter) coordinates
      */
     virtual void SetGeocentricPosition(const Vector& position);
 
     /**
-     * \brief Set the reference point for coordinate conversion
-     * \param refPoint vector containing the geographic reference point (meter)
+     * @brief Set the reference point for coordinate conversion
+     * @param refPoint vector containing the geographic reference point (meter)
      */
     virtual void SetCoordinateTranslationReferencePoint(const Vector& refPoint);
 
     /**
-     * \brief Get the reference point for coordinate conversion
-     * \return Vector containing geographic reference point (meter)
+     * @brief Get the reference point for coordinate conversion
+     * @return Vector containing geographic reference point (meter)
      */
     virtual Vector GetCoordinateTranslationReferencePoint() const;
 
     /**
-     * \return the current position
+     * @return the current position
      */
     virtual Vector GetPosition() const;
 
     /**
-     * \param position the position to set.
+     * @param position the position to set.
      */
     virtual void SetPosition(const Vector& position);
 
     /**
-     * \param other a reference to another mobility model
-     * \return the distance between the two objects. Unit is meters.
+     * @param other a reference to another mobility model
+     * @return the distance between the two objects. Unit is meters.
      */
     double GetDistanceFrom(Ptr<const GeocentricConstantPositionMobilityModel> other) const;
 
   private:
-    /** \copydoc GetPosition() */
+    /** @copydoc GetPosition() */
     Vector DoGetPosition() const override;
-    /** \copydoc SetPosition() */
+    /** @copydoc SetPosition() */
     void DoSetPosition(const Vector& position) override;
-    /** \copydoc GetVelocity() */
+    /** @copydoc GetVelocity() */
     Vector DoGetVelocity() const override;
-    /** \copydoc GetDistanceFrom() */
+    /** @copydoc GetDistanceFrom() */
     double DoGetDistanceFrom(Ptr<const GeocentricConstantPositionMobilityModel> other) const;
-    /** \copydoc GetGeographicPosition() */
+    /** @copydoc GetGeographicPosition() */
     virtual Vector DoGetGeographicPosition() const;
-    /** \copydoc SetGeographicPosition() */
+    /** @copydoc SetGeographicPosition() */
     virtual void DoSetGeographicPosition(const Vector& latLonAlt);
-    /** \copydoc GetGeocentricPosition() */
+    /** @copydoc GetGeocentricPosition() */
     virtual Vector DoGetGeocentricPosition() const;
-    /** \copydoc SetGeocentricPosition() */
+    /** @copydoc SetGeocentricPosition() */
     virtual void DoSetGeocentricPosition(const Vector& position);
-    /** \copydoc GetElevationAngle() */
+    /** @copydoc GetElevationAngle() */
     virtual double DoGetElevationAngle(Ptr<const GeocentricConstantPositionMobilityModel> other);
-    /** \copydoc SetCoordinateTranslationReferencePoint() */
+    /** @copydoc SetCoordinateTranslationReferencePoint() */
     virtual void DoSetCoordinateTranslationReferencePoint(const Vector& refPoint);
-    /** \copydoc GetCoordinateTranslationReferencePoint() */
+    /** @copydoc GetCoordinateTranslationReferencePoint() */
     virtual Vector DoGetCoordinateTranslationReferencePoint() const;
 
     /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mobility/model/geographic-positions.cc ns-3.44/src/mobility/model/geographic-positions.cc
--- ns-3.43/src/mobility/model/geographic-positions.cc	2024-10-09 16:41:10.056656600 -0700
+++ ns-3.44/src/mobility/model/geographic-positions.cc	2025-03-09 16:55:49.655372100 -0700
@@ -8,8 +8,8 @@
 
 #include "geographic-positions.h"
 
-#include <ns3/angles.h>
-#include <ns3/log.h>
+#include "ns3/angles.h"
+#include "ns3/log.h"
 
 #include <cmath>
 
@@ -29,7 +29,7 @@
  */
 
 /**
- * \brief  Lambda function for computing the curvature
+ * @brief  Lambda function for computing the curvature
  */
 auto curvature = [](double e, double ph) { return sqrt(1 - e * e * sin(ph) * sin(ph)); };
 } // namespace
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mobility/model/geographic-positions.h ns-3.44/src/mobility/model/geographic-positions.h
--- ns-3.43/src/mobility/model/geographic-positions.h	2024-10-09 16:41:10.056656600 -0700
+++ ns-3.44/src/mobility/model/geographic-positions.h	2025-03-09 16:55:49.655372100 -0700
@@ -6,8 +6,8 @@
  * Author: Benjamin Cizdziel <ben.cizdziel@gmail.com>
  */
 
-#include <ns3/random-variable-stream.h>
-#include <ns3/vector.h>
+#include "ns3/random-variable-stream.h"
+#include "ns3/vector.h"
 
 #ifndef GEOGRAPHIC_POSITIONS_H
 #define GEOGRAPHIC_POSITIONS_H
@@ -16,7 +16,7 @@
 {
 
 /**
- * \ingroup mobility
+ * @ingroup mobility
  *
  * Consists of methods dealing with Earth geographic coordinates and locations.
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mobility/model/hierarchical-mobility-model.h ns-3.44/src/mobility/model/hierarchical-mobility-model.h
--- ns-3.43/src/mobility/model/hierarchical-mobility-model.h	2024-10-09 16:41:10.056656600 -0700
+++ ns-3.44/src/mobility/model/hierarchical-mobility-model.h	2025-03-09 16:55:49.655372100 -0700
@@ -14,8 +14,8 @@
 {
 
 /**
- * \ingroup mobility
- * \brief Hierarchical mobility model.
+ * @ingroup mobility
+ * @brief Hierarchical mobility model.
  *
  * This model allows you to specify the position of a child object
  * relative to a parent object.
@@ -48,21 +48,21 @@
   public:
     /**
      * Register this type with the TypeId system.
-     * \return the object TypeId
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     HierarchicalMobilityModel();
 
     /**
-     * \return the child mobility model.
+     * @return the child mobility model.
      *
      * 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() const;
     /**
-     * \return the parent mobility model.
+     * @return the parent mobility model.
      *
      * Calling GetPosition() on the model returned by this method allows
      * one to access the position of the parent alone, which is used
@@ -75,7 +75,7 @@
      * 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
+     * @param model new mobility model child
      */
     void SetChild(Ptr<MobilityModel> model);
     /**
@@ -84,7 +84,7 @@
      * 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
+     * @param model new mobility model parent
      */
     void SetParent(Ptr<MobilityModel> model);
 
@@ -97,12 +97,12 @@
 
     /**
      * Callback for when parent mobility model course change occurs
-     * \param model mobility mode (unused)
+     * @param model mobility mode (unused)
      */
     void ParentChanged(Ptr<const MobilityModel> model);
     /**
      * Callback for when child mobility model course change occurs
-     * \param model mobility mode (unused)
+     * @param model mobility mode (unused)
      */
     void ChildChanged(Ptr<const MobilityModel> model);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mobility/model/mobility.h ns-3.44/src/mobility/model/mobility.h
--- ns-3.43/src/mobility/model/mobility.h	2024-10-09 16:41:10.056656600 -0700
+++ ns-3.44/src/mobility/model/mobility.h	2025-03-09 16:55:49.655372100 -0700
@@ -11,7 +11,7 @@
  */
 
 /**
- * \addtogroup mobility Mobility
+ * @addtogroup mobility Mobility
  *
  * The mobility support includes:
  *  - a set of mobility models which are used to track and maintain
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mobility/model/mobility-model.h ns-3.44/src/mobility/model/mobility-model.h
--- ns-3.43/src/mobility/model/mobility-model.h	2024-10-09 16:41:10.056656600 -0700
+++ ns-3.44/src/mobility/model/mobility-model.h	2025-03-09 16:55:49.655372100 -0700
@@ -16,8 +16,8 @@
 {
 
 /**
- * \ingroup mobility
- * \brief Keep track of the current position and velocity of an object.
+ * @ingroup mobility
+ * @brief Keep track of the current position and velocity of an object.
  *
  * All space coordinates in this class and its subclasses are
  * understood to be meters or meters/s. i.e., they are all
@@ -30,14 +30,14 @@
   public:
     /**
      * Register this type with the TypeId system.
-     * \return the object TypeId
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     MobilityModel();
     ~MobilityModel() override = 0;
 
     /**
-     * \return the current position
+     * @return the current position
      */
     Vector GetPosition() const;
     /**
@@ -47,27 +47,27 @@
      * 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
+     * @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.
+     * @param position the position to set.
      */
     void SetPosition(const Vector& position);
     /**
-     * \return the current velocity.
+     * @return the current velocity.
      */
     Vector GetVelocity() const;
     /**
-     * \param position a reference to another mobility model
-     * \return the distance between the two objects. Unit is meters.
+     * @param position a reference to another mobility model
+     * @return the distance between the two objects. Unit is meters.
      */
     double GetDistanceFrom(Ptr<const MobilityModel> position) const;
     /**
-     * \param other reference to another object's mobility model
-     * \return the relative speed between the two objects. Unit is meters/s.
+     * @param other reference to another object's mobility model
+     * @return the relative speed between the two objects. Unit is meters/s.
      */
     double GetRelativeSpeed(Ptr<const MobilityModel> other) const;
     /**
@@ -75,15 +75,15 @@
      * used by this model. Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream);
 
     /**
      *  TracedCallback signature.
      *
-     * \param [in] model Value of the MobilityModel.
+     * @param [in] model Value of the MobilityModel.
      */
     typedef void (*TracedCallback)(Ptr<const MobilityModel> model);
 
@@ -96,29 +96,29 @@
 
   private:
     /**
-     * \return the current position.
+     * @return the current position.
      *
      * Concrete subclasses of this base class must
      * implement this method.
      */
     virtual Vector DoGetPosition() const = 0;
     /**
-     * \param referencePosition the reference position to consider
-     * \return the current position.
+     * @param referencePosition the reference position to consider
+     * @return the current position.
      *
      * Unless subclasses override, this method will disregard the reference
      * position and return "DoGetPosition ()".
      */
     virtual Vector DoGetPositionWithReference(const Vector& referencePosition) const;
     /**
-     * \param position the position to set.
+     * @param position the position to set.
      *
      * Concrete subclasses of this base class must
      * implement this method.
      */
     virtual void DoSetPosition(const Vector& position) = 0;
     /**
-     * \return the current velocity.
+     * @return the current velocity.
      *
      * Concrete subclasses of this base class must
      * implement this method.
@@ -128,8 +128,8 @@
      * The default implementation does nothing but return the passed-in
      * parameter.  Subclasses using random variables are expected to
      * override this.
-     * \param start  starting stream index
-     * \return the number of streams used
+     * @param start  starting stream index
+     * @return the number of streams used
      */
     virtual int64_t DoAssignStreams(int64_t start);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mobility/model/position-allocator.h ns-3.44/src/mobility/model/position-allocator.h
--- ns-3.43/src/mobility/model/position-allocator.h	2024-10-09 16:41:10.056656600 -0700
+++ ns-3.44/src/mobility/model/position-allocator.h	2025-03-09 16:55:49.655372100 -0700
@@ -16,8 +16,8 @@
 {
 
 /**
- * \ingroup mobility
- * \brief Allocate a set of positions. The allocation strategy is implemented in subclasses.
+ * @ingroup mobility
+ * @brief Allocate a set of positions. The allocation strategy is implemented in subclasses.
  *
  * This is a pure abstract base class.
  */
@@ -26,13 +26,13 @@
   public:
     /**
      * Register this type with the TypeId system.
-     * \return the object TypeId
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     PositionAllocator();
     ~PositionAllocator() override;
     /**
-     * \return the next chosen position.
+     * @return the next chosen position.
      *
      * This method _must_ be implement in subclasses.
      */
@@ -44,15 +44,15 @@
      *
      * This method _must_ be implement in subclasses.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     virtual int64_t AssignStreams(int64_t stream) = 0;
 };
 
 /**
- * \ingroup mobility
- * \brief Allocate positions from a deterministic list specified by the user.
+ * @ingroup mobility
+ * @brief Allocate positions from a deterministic list specified by the user.
  *
  * The first call to ListPositionAllocator::GetNext  will return the
  * first element of the list, the second call, the second element, and so on.
@@ -62,19 +62,19 @@
   public:
     /**
      * Register this type with the TypeId system.
-     * \return the object TypeId
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     ListPositionAllocator();
 
     /**
-     * \brief Add a position to the list of positions
-     * \param v the position to append at the end of the list of positions to return from GetNext.
+     * @brief Add a position to the list of positions
+     * @param v the position to append at the end of the list of positions to return from GetNext.
      */
     void Add(Vector v);
 
     /**
-     * \brief Add the positions listed in a file.
+     * @brief Add the positions listed in a file.
      * The file should be a simple text file, with one position per line,
      * either X and Y, or X, Y and Z, in meters.  The delimiter can
      * be any character, such as ',' or '\\t'; the default is a comma ','.
@@ -82,10 +82,10 @@
      * The file is read using CsvReader, which explains how comments
      * and whitespace are handled.
      *
-     * \param [in] filePath The path to the input file.
-     * \param [in] defaultZ The default Z value to use when reading files
+     * @param [in] filePath The path to the input file.
+     * @param [in] defaultZ The default Z value to use when reading files
      *             with only X and Y positions.
-     * \param [in] delimiter The delimiter character; see CsvReader.
+     * @param [in] delimiter The delimiter character; see CsvReader.
      */
     void Add(const std::string filePath, double defaultZ = 0, char delimiter = ',');
 
@@ -94,7 +94,7 @@
      * based on calling GetNext(), as the number of positions is not altered
      * by calling GetNext ().
      *
-     * \return the number of positions stored
+     * @return the number of positions stored
      */
     uint32_t GetSize() const;
     Vector GetNext() const override;
@@ -106,15 +106,15 @@
 };
 
 /**
- * \ingroup mobility
- * \brief Allocate positions on a rectangular 2d grid.
+ * @ingroup mobility
+ * @brief Allocate positions on a rectangular 2d grid.
  */
 class GridPositionAllocator : public PositionAllocator
 {
   public:
     /**
      * Register this type with the TypeId system.
-     * \return the object TypeId
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -140,57 +140,57 @@
     GridPositionAllocator();
 
     /**
-     * \param xMin the x coordinate where layout will start.
+     * @param xMin the x coordinate where layout will start.
      */
     void SetMinX(double xMin);
     /**
-     * \param yMin the y coordinate where layout will start
+     * @param yMin the y coordinate where layout will start
      */
     void SetMinY(double yMin);
     /**
-     * \param z   the Z coordinate of all the positions allocated
+     * @param z   the Z coordinate of all the positions allocated
      */
     void SetZ(double z);
     /**
-     * \param deltaX the x interval between two x-consecutive positions.
+     * @param deltaX the x interval between two x-consecutive positions.
      */
     void SetDeltaX(double deltaX);
     /**
-     * \param deltaY the y interval between two y-consecutive positions.
+     * @param deltaY the y interval between two y-consecutive positions.
      */
     void SetDeltaY(double deltaY);
     /**
-     * \param n the number of positions allocated on each row (or each column)
+     * @param n the number of positions allocated on each row (or each column)
      *        before switching to the next column (or row).
      */
     void SetN(uint32_t n);
     /**
-     * \param layoutType the type of layout to use (row first or column first).
+     * @param layoutType the type of layout to use (row first or column first).
      */
     void SetLayoutType(LayoutType layoutType);
 
     /**
-     * \return the x coordinate of the first allocated position.
+     * @return the x coordinate of the first allocated position.
      */
     double GetMinX() const;
     /**
-     * \return the y coordinate of the first allocated position.
+     * @return the y coordinate of the first allocated position.
      */
     double GetMinY() const;
     /**
-     * \return the x interval between two consecutive x-positions.
+     * @return the x interval between two consecutive x-positions.
      */
     double GetDeltaX() const;
     /**
-     * \return the y interval between two consecutive y-positions.
+     * @return the y interval between two consecutive y-positions.
      */
     double GetDeltaY() const;
     /**
-     * \return the number of positions to allocate on each row or each column.
+     * @return the number of positions to allocate on each row or each column.
      */
     uint32_t GetN() const;
     /**
-     * \return the currently-selected layout type.
+     * @return the currently-selected layout type.
      */
     LayoutType GetLayoutType() const;
 
@@ -209,32 +209,32 @@
 };
 
 /**
- * \ingroup mobility
- * \brief Allocate random positions within a rectangle according to a pair of random variables.
+ * @ingroup mobility
+ * @brief Allocate random positions within a rectangle according to a pair of random variables.
  */
 class RandomRectanglePositionAllocator : public PositionAllocator
 {
   public:
     /**
      * Register this type with the TypeId system.
-     * \return the object TypeId
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     RandomRectanglePositionAllocator();
     ~RandomRectanglePositionAllocator() override;
 
     /**
-     * \brief Set the random variable stream object that generates x-positions
-     * \param x pointer to a RandomVariableStream object
+     * @brief Set the random variable stream object that generates x-positions
+     * @param x pointer to a RandomVariableStream object
      */
     void SetX(Ptr<RandomVariableStream> x);
     /**
-     * \brief Set the random variable stream object that generates y-positions
-     * \param y pointer to a RandomVariableStream object
+     * @brief Set the random variable stream object that generates y-positions
+     * @param y pointer to a RandomVariableStream object
      */
     void SetY(Ptr<RandomVariableStream> y);
     /**
-     * \param z   the Z coordinate of all the positions allocated
+     * @param z   the Z coordinate of all the positions allocated
      */
     void SetZ(double z);
 
@@ -248,33 +248,33 @@
 };
 
 /**
- * \ingroup mobility
- * \brief Allocate random positions within a 3D box according to a set of three random variables.
+ * @ingroup mobility
+ * @brief Allocate random positions within a 3D box according to a set of three random variables.
  */
 class RandomBoxPositionAllocator : public PositionAllocator
 {
   public:
     /**
      * Register this type with the TypeId system.
-     * \return the object TypeId
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     RandomBoxPositionAllocator();
     ~RandomBoxPositionAllocator() override;
 
     /**
-     * \brief Set the random variable stream object that generates x-positions
-     * \param x pointer to a RandomVariableStream object
+     * @brief Set the random variable stream object that generates x-positions
+     * @param x pointer to a RandomVariableStream object
      */
     void SetX(Ptr<RandomVariableStream> x);
     /**
-     * \brief Set the random variable stream object that generates y-positions
-     * \param y pointer to a RandomVariableStream object
+     * @brief Set the random variable stream object that generates y-positions
+     * @param y pointer to a RandomVariableStream object
      */
     void SetY(Ptr<RandomVariableStream> y);
     /**
-     * \brief Set the random variable stream object that generates z-positions
-     * \param z pointer to a RandomVariableStream object
+     * @brief Set the random variable stream object that generates z-positions
+     * @param z pointer to a RandomVariableStream object
      */
     void SetZ(Ptr<RandomVariableStream> z);
 
@@ -288,12 +288,12 @@
 };
 
 /**
- * \ingroup mobility
- * \brief Allocate random positions within a disc according to
+ * @ingroup mobility
+ * @brief Allocate random positions within a disc according to
  * a given distribution for the polar coordinates of each node
  * with respect to the provided center of the disc.
  *
- * \note With the default uniform distribution over \f$2 \pi\f$ in \c theta and a
+ * @note With the default uniform distribution over \f$2 \pi\f$ in \c theta and a
  * uniform distribution for \c rho this position allocator will *not*
  * uniformly populate the disc.  The radial distribution will be proportional
  * to \f$\frac{1}{r^2}\f$.
@@ -305,34 +305,34 @@
   public:
     /**
      * Register this type with the TypeId system.
-     * \return the object TypeId
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     RandomDiscPositionAllocator();
     ~RandomDiscPositionAllocator() override;
 
     /**
-     * \brief Set the random variable that generates position angle, in radians.
-     * \param theta Random variable that represents the angle in radians of a position in a random
+     * @brief Set the random variable that generates position angle, in radians.
+     * @param theta Random variable that represents the angle in radians of a position in a random
      * disc.
      */
     void SetTheta(Ptr<RandomVariableStream> theta);
     /**
-     * \brief Set the random variable that generates position radius, in meters
-     * \param rho Random variable that represents the radius of a position, in meters, in a random
+     * @brief Set the random variable that generates position radius, in meters
+     * @param rho Random variable that represents the radius of a position, in meters, in a random
      * disc.
      */
     void SetRho(Ptr<RandomVariableStream> rho);
     /**
-     * \param x  the X coordinate of the center of the disc
+     * @param x  the X coordinate of the center of the disc
      */
     void SetX(double x);
     /**
-     * \param y   the Y coordinate of the center of the disc
+     * @param y   the Y coordinate of the center of the disc
      */
     void SetY(double y);
     /**
-     * \param z   the Z coordinate of all the positions allocated
+     * @param z   the Z coordinate of all the positions allocated
      */
     void SetZ(double z);
 
@@ -348,8 +348,8 @@
 };
 
 /**
- * \ingroup mobility
- * \brief Allocate the positions uniformly (with constant density) randomly within a disc.
+ * @ingroup mobility
+ * @brief Allocate the positions uniformly (with constant density) randomly within a disc.
  *
  * UniformDiscPositionAllocator allocates the positions randomly within a disc \f$ D \f$ lying on
  * the plane \f$ z\f$ and having center at coordinates \f$ (x,y,z) \f$ and radius \f$ \rho \f$. The
@@ -357,7 +357,7 @@
  * the fraction of points which fall into \f$ S \subset D \f$ corresponds to \f$ \frac{|S|}{|D|}
  * \f$, i.e., to the ratio of the area of the subset to the area of the whole disc.
  *
- * \note using UniformDiscPositionAllocator is not equivalent to using
+ * @note using UniformDiscPositionAllocator is not equivalent to using
  * a RandomDiscPositionAllocator with a uniformly-distributed radius,
  * since doing that would result in a point distribution which is
  * more dense towards the center of the disc.
@@ -367,29 +367,29 @@
   public:
     /**
      * Register this type with the TypeId system.
-     * \return the object TypeId
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     UniformDiscPositionAllocator();
     ~UniformDiscPositionAllocator() override;
 
     /**
-     * \param rho the value of the radius of the disc
+     * @param rho the value of the radius of the disc
      */
     void SetRho(double rho);
 
     /**
-     * \param x  the X coordinate of the center of the disc
+     * @param x  the X coordinate of the center of the disc
      */
     void SetX(double x);
 
     /**
-     * \param y   the Y coordinate of the center of the disc
+     * @param y   the Y coordinate of the center of the disc
      */
     void SetY(double y);
 
     /**
-     * \param z   the Z coordinate of all the positions allocated
+     * @param z   the Z coordinate of all the positions allocated
      */
     void SetZ(double z);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mobility/model/random-direction-2d-mobility-model.h ns-3.44/src/mobility/model/random-direction-2d-mobility-model.h
--- ns-3.43/src/mobility/model/random-direction-2d-mobility-model.h	2024-10-09 16:41:10.056656600 -0700
+++ ns-3.44/src/mobility/model/random-direction-2d-mobility-model.h	2025-03-09 16:55:49.655372100 -0700
@@ -22,8 +22,8 @@
 {
 
 /**
- * \ingroup mobility
- * \brief Random direction mobility model.
+ * @ingroup mobility
+ * @brief Random direction mobility model.
  *
  * The movement of objects is based on random directions: each object
  * pauses for a specific delay, chooses a random direction and speed and
@@ -36,7 +36,7 @@
   public:
     /**
      * Register this type with the TypeId system.
-     * \return the object TypeId
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     RandomDirection2dMobilityModel();
@@ -53,7 +53,7 @@
     void BeginPause();
     /**
      * Set new velocity and direction, and schedule next pause event
-     * \param direction (radians)
+     * @param direction (radians)
      */
     void SetDirectionAndSpeed(double direction);
     /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mobility/model/random-walk-2d-mobility-model.cc ns-3.44/src/mobility/model/random-walk-2d-mobility-model.cc
--- ns-3.43/src/mobility/model/random-walk-2d-mobility-model.cc	2024-10-09 16:41:10.056656600 -0700
+++ ns-3.44/src/mobility/model/random-walk-2d-mobility-model.cc	2025-03-09 16:55:49.655372100 -0700
@@ -38,7 +38,7 @@
                           MakeRectangleChecker())
             .AddAttribute("Time",
                           "Change current direction and speed after moving for this delay.",
-                          TimeValue(Seconds(1.0)),
+                          TimeValue(Seconds(1)),
                           MakeTimeAccessor(&RandomWalk2dMobilityModel::m_modeTime),
                           MakeTimeChecker())
             .AddAttribute("Distance",
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mobility/model/random-walk-2d-mobility-model.h ns-3.44/src/mobility/model/random-walk-2d-mobility-model.h
--- ns-3.43/src/mobility/model/random-walk-2d-mobility-model.h	2024-10-09 16:41:10.056656600 -0700
+++ ns-3.44/src/mobility/model/random-walk-2d-mobility-model.h	2025-03-09 16:55:49.655372100 -0700
@@ -21,8 +21,8 @@
 {
 
 /**
- * \ingroup mobility
- * \brief 2D random walk mobility model.
+ * @ingroup mobility
+ * @brief 2D random walk mobility model.
  *
  * Each instance moves with a speed and direction chosen at random
  * with the user-provided random variables until
@@ -42,7 +42,7 @@
   public:
     /**
      * Register this type with the TypeId system.
-     * \return the object TypeId
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -57,14 +57,14 @@
 
   private:
     /**
-     * \brief Performs the rebound of the node if it reaches a boundary
-     * \param timeLeft The remaining time of the walk
+     * @brief Performs the rebound of the node if it reaches a boundary
+     * @param timeLeft The remaining time of the walk
      */
     void Rebound(Time timeLeft);
     /**
      * Walk according to position and velocity, until distance is reached,
      * time is reached, or intersection with the bounding box
-     * \param timeLeft The remaining time of the walk
+     * @param timeLeft The remaining time of the walk
      */
     void DoWalk(Time timeLeft);
     /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mobility/model/random-waypoint-mobility-model.h ns-3.44/src/mobility/model/random-waypoint-mobility-model.h
--- ns-3.43/src/mobility/model/random-waypoint-mobility-model.h	2024-10-09 16:41:10.060656500 -0700
+++ ns-3.44/src/mobility/model/random-waypoint-mobility-model.h	2025-03-09 16:55:49.655372100 -0700
@@ -19,8 +19,8 @@
 {
 
 /**
- * \ingroup mobility
- * \brief Random waypoint mobility model.
+ * @ingroup mobility
+ * @brief Random waypoint mobility model.
  *
  * Each object starts by pausing at time zero for the duration governed
  * by the random variable "Pause".  After pausing, the object will pick
@@ -44,7 +44,7 @@
   public:
     /**
      * Register this type with the TypeId system.
-     * \return the object TypeId
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mobility/model/rectangle.cc ns-3.44/src/mobility/model/rectangle.cc
--- ns-3.43/src/mobility/model/rectangle.cc	2024-10-09 16:41:10.060656500 -0700
+++ ns-3.44/src/mobility/model/rectangle.cc	2025-03-09 16:55:49.655372100 -0700
@@ -176,11 +176,11 @@
 ATTRIBUTE_HELPER_CPP(Rectangle);
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the stream
- * \param rectangle the rectangle
- * \returns a reference to the stream
+ * @param os the stream
+ * @param rectangle the rectangle
+ * @returns a reference to the stream
  */
 std::ostream&
 operator<<(std::ostream& os, const Rectangle& rectangle)
@@ -190,11 +190,11 @@
 }
 
 /**
- * \brief Stream extraction operator.
+ * @brief Stream extraction operator.
  *
- * \param is the stream
- * \param rectangle the rectangle
- * \returns a reference to the stream
+ * @param is the stream
+ * @param rectangle the rectangle
+ * @returns a reference to the stream
  */
 std::istream&
 operator>>(std::istream& is, Rectangle& rectangle)
@@ -211,11 +211,11 @@
 }
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the stream
- * \param side the rectangle side
- * \returns a reference to the stream
+ * @param os the stream
+ * @param side the rectangle side
+ * @returns a reference to the stream
  */
 std::ostream&
 operator<<(std::ostream& os, const Rectangle::Side& side)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mobility/model/rectangle.h ns-3.44/src/mobility/model/rectangle.h
--- ns-3.43/src/mobility/model/rectangle.h	2024-10-09 16:41:10.060656500 -0700
+++ ns-3.44/src/mobility/model/rectangle.h	2025-03-09 16:55:49.655372100 -0700
@@ -16,9 +16,9 @@
 {
 
 /**
- * \ingroup mobility
- * \brief a 2d rectangle
- * \see attribute_Rectangle
+ * @ingroup mobility
+ * @brief a 2d rectangle
+ * @see attribute_Rectangle
  */
 class Rectangle
 {
@@ -39,10 +39,10 @@
     };
 
     /**
-     * \param _xMin x coordinates of left boundary.
-     * \param _xMax x coordinates of right boundary.
-     * \param _yMin y coordinates of bottom boundary.
-     * \param _yMax y coordinates of top boundary.
+     * @param _xMin x coordinates of left boundary.
+     * @param _xMax x coordinates of right boundary.
+     * @param _yMin y coordinates of bottom boundary.
+     * @param _yMax y coordinates of top boundary.
      *
      * Create a rectangle.
      */
@@ -52,24 +52,24 @@
      */
     Rectangle();
     /**
-     * \param position the position to test.
-     * \return true if the input position is located within the rectangle, false otherwise.
+     * @param position the position to test.
+     * @return true if the input position is located within the rectangle, false otherwise.
      *
      * This method compares only the x and y coordinates of the input position.
      * It ignores the z coordinate.
      */
     bool IsInside(const Vector& position) const;
     /**
-     * \param position the position to test.
-     * \return true if the input position is located on the rectable border, false otherwise.
+     * @param position the position to test.
+     * @return true if the input position is located on the rectable border, false otherwise.
      *
      * This method compares only the x and y coordinates of the input position.
      * It ignores the z coordinate.
      */
     bool IsOnTheBorder(const Vector& position) const;
     /**
-     * \param position the position to test.
-     * \return the side of the rectangle the input position is closest to.
+     * @param position the position to test.
+     * @return the side of the rectangle the input position is closest to.
      *
      * This method compares only the x and y coordinates of the input position.
      * It ignores the z coordinate.
@@ -90,9 +90,9 @@
      */
     Side GetClosestSideOrCorner(const Vector& position) const;
     /**
-     * \param current the current position
-     * \param speed the current speed
-     * \return the intersection point between the rectangle and the current+speed vector.
+     * @param current the current position
+     * @param speed the current speed
+     * @return the intersection point between the rectangle and the current+speed vector.
      *
      * This method assumes that the current position is located _inside_
      * the rectangle and checks for this with an assert.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mobility/model/steady-state-random-waypoint-mobility-model.h ns-3.44/src/mobility/model/steady-state-random-waypoint-mobility-model.h
--- ns-3.43/src/mobility/model/steady-state-random-waypoint-mobility-model.h	2024-10-09 16:41:10.060656500 -0700
+++ ns-3.44/src/mobility/model/steady-state-random-waypoint-mobility-model.h	2025-03-09 16:55:49.655372100 -0700
@@ -19,8 +19,8 @@
 {
 
 /**
- * \ingroup mobility
- * \brief Steady-state random waypoint mobility model.
+ * @ingroup mobility
+ * @brief Steady-state random waypoint mobility model.
  *
  * This model based on random waypoint mobility (RWM) model for case when
  * speed, pause and position are uniformly distributed random variables.
@@ -47,7 +47,7 @@
   public:
     /**
      * Register this type with the TypeId system.
-     * \return the object TypeId
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     SteadyStateRandomWaypointMobilityModel();
@@ -66,7 +66,7 @@
     /**
      * Use provided destination to calculate travel delay, and schedule a
      * Start() event at that time.
-     * \param destination the destination to move to
+     * @param destination the destination to move to
      */
     void SteadyStateBeginWalk(const Vector& destination);
     /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mobility/model/waypoint.cc ns-3.44/src/mobility/model/waypoint.cc
--- ns-3.43/src/mobility/model/waypoint.cc	2024-10-09 16:41:10.060656500 -0700
+++ ns-3.44/src/mobility/model/waypoint.cc	2025-03-09 16:55:49.655372100 -0700
@@ -19,17 +19,17 @@
 }
 
 Waypoint::Waypoint()
-    : time(Seconds(0.0)),
+    : time(),
       position(0, 0, 0)
 {
 }
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the stream
- * \param waypoint the waypoint
- * \returns a reference to the stream
+ * @param os the stream
+ * @param waypoint the waypoint
+ * @returns a reference to the stream
  */
 std::ostream&
 operator<<(std::ostream& os, const Waypoint& waypoint)
@@ -39,11 +39,11 @@
 }
 
 /**
- * \brief Stream extraction operator.
+ * @brief Stream extraction operator.
  *
- * \param is the stream
- * \param waypoint the waypoint
- * \returns a reference to the stream
+ * @param is the stream
+ * @param waypoint the waypoint
+ * @returns a reference to the stream
  */
 std::istream&
 operator>>(std::istream& is, Waypoint& waypoint)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mobility/model/waypoint.h ns-3.44/src/mobility/model/waypoint.h
--- ns-3.43/src/mobility/model/waypoint.h	2024-10-09 16:41:10.060656500 -0700
+++ ns-3.44/src/mobility/model/waypoint.h	2025-03-09 16:55:49.655372100 -0700
@@ -17,16 +17,16 @@
 {
 
 /**
- * \ingroup mobility
- * \brief a (time, location) pair.
- * \see attribute_Waypoint
+ * @ingroup mobility
+ * @brief a (time, location) pair.
+ * @see attribute_Waypoint
  */
 class Waypoint
 {
   public:
     /**
-     * \param waypointTime time of waypoint.
-     * \param waypointPosition position of waypoint corresponding to the given time.
+     * @param waypointTime time of waypoint.
+     * @param waypointPosition position of waypoint corresponding to the given time.
      *
      * Create a waypoint.
      */
@@ -37,11 +37,11 @@
      */
     Waypoint();
     /**
-     * \brief The waypoint time
+     * @brief The waypoint time
      */
     Time time;
     /**
-     * \brief The position of the waypoint
+     * @brief The position of the waypoint
      */
     Vector position;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mobility/model/waypoint-mobility-model.h ns-3.44/src/mobility/model/waypoint-mobility-model.h
--- ns-3.43/src/mobility/model/waypoint-mobility-model.h	2024-10-09 16:41:10.060656500 -0700
+++ ns-3.44/src/mobility/model/waypoint-mobility-model.h	2025-03-09 16:55:49.655372100 -0700
@@ -22,8 +22,8 @@
 {
 
 /**
- * \ingroup mobility
- * \brief Waypoint-based mobility model.
+ * @ingroup mobility
+ * @brief Waypoint-based mobility model.
  *
  * Each object determines its velocity and position at a given time
  * from a set of ns3::Waypoint objects.  Past waypoints are discarded
@@ -79,7 +79,7 @@
   public:
     /**
      * Register this type with the TypeId system.
-     * \return the object TypeId
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -90,7 +90,7 @@
     ~WaypointMobilityModel() override;
 
     /**
-     * \param waypoint waypoint to append to the object path.
+     * @param waypoint waypoint to append to the object path.
      *
      * Add a waypoint to the path of the object. The time must
      * be greater than the previous waypoint added, otherwise
@@ -102,14 +102,14 @@
 
     /**
      * Get the waypoint that this object is traveling towards.
-     * \returns The waypoint
+     * @returns The waypoint
      */
     Waypoint GetNextWaypoint() const;
 
     /**
      * Get the number of waypoints left for this object, excluding
      * the next one.
-     * \returns The number of waypoints left
+     * @returns The number of waypoints left
      */
     uint32_t WaypointsLeft() const;
 
@@ -130,59 +130,59 @@
      */
     virtual void Update() const;
     /**
-     * \brief The dispose method.
+     * @brief The dispose method.
      *
      * Subclasses must override this method.
      */
     void DoDispose() override;
     /**
-     * \brief Get current position.
-     * \return A vector with the current position of the node.
+     * @brief Get current position.
+     * @return A vector with the current position of the node.
      */
     Vector DoGetPosition() const override;
     /**
-     * \brief Sets a new position for the node
-     * \param position A vector to be added as the new position
+     * @brief Sets a new position for the node
+     * @param position A vector to be added as the new position
      */
     void DoSetPosition(const Vector& position) override;
     /**
-     * \brief Returns the current velocity of a node
-     * \return The velocity vector of a node.
+     * @brief Returns the current velocity of a node
+     * @return The velocity vector of a node.
      */
     Vector DoGetVelocity() const override;
 
   protected:
     /**
-     * \brief This variable is set to true if there are no waypoints in the std::deque
+     * @brief This variable is set to true if there are no waypoints in the std::deque
      */
     bool m_first;
     /**
-     * \brief If true, course change updates are only notified when position
+     * @brief If true, course change updates are only notified when position
      * is calculated.
      */
     bool m_lazyNotify;
     /**
-     * \brief If true, calling SetPosition with no waypoints creates a waypoint
+     * @brief If true, calling SetPosition with no waypoints creates a waypoint
      */
     bool m_initialPositionIsWaypoint;
     /**
-     * \brief The double ended queue containing the ns3::Waypoint objects
+     * @brief The double ended queue containing the ns3::Waypoint objects
      */
     mutable std::deque<Waypoint> m_waypoints;
     /**
-     * \brief The ns3::Waypoint currently being used
+     * @brief The ns3::Waypoint currently being used
      */
     mutable Waypoint m_current;
     /**
-     * \brief The next ns3::Waypoint in the deque
+     * @brief The next ns3::Waypoint in the deque
      */
     mutable Waypoint m_next;
     /**
-     * \brief The current velocity vector
+     * @brief The current velocity vector
      */
     mutable Vector m_velocity;
     /**
-     * \brief Update event
+     * @brief Update event
      */
     EventId m_event;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mobility/test/box-line-intersection-test.cc ns-3.44/src/mobility/test/box-line-intersection-test.cc
--- ns-3.43/src/mobility/test/box-line-intersection-test.cc	2024-10-09 16:41:10.060656500 -0700
+++ ns-3.44/src/mobility/test/box-line-intersection-test.cc	2025-03-09 16:55:49.655372100 -0700
@@ -7,7 +7,7 @@
 
 #include "box-line-intersection-test.h"
 
-#include <ns3/simulator.h>
+#include "ns3/simulator.h"
 
 using namespace ns3;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mobility/test/box-line-intersection-test.h ns-3.44/src/mobility/test/box-line-intersection-test.h
--- ns-3.43/src/mobility/test/box-line-intersection-test.h	2024-10-09 16:41:10.060656500 -0700
+++ ns-3.44/src/mobility/test/box-line-intersection-test.h	2025-03-09 16:55:49.655372100 -0700
@@ -8,14 +8,14 @@
 #ifndef BOX_LINE_INTERSECTION_TEST_H
 #define BOX_LINE_INTERSECTION_TEST_H
 
-#include <ns3/box.h>
-#include <ns3/test.h>
-#include <ns3/vector.h>
+#include "ns3/box.h"
+#include "ns3/test.h"
+#include "ns3/vector.h"
 
 using namespace ns3;
 
 /**
- * \brief Test suite for
+ * @brief Test suite for
  *
  * \sa ns3::BoxLineIntersectionTestSuite
  */
@@ -29,29 +29,29 @@
 };
 
 /**
- * \brief TestCase to check the box line intersection
+ * @brief TestCase to check the box line intersection
  */
 class BoxLineIntersectionTestCase : public TestCase
 {
   public:
     /**
-     * \brief Create BoxLineIntersectionTestCase
-     * \param indexPos1 Index of the first position to generate
-     * \param indexPos2 Index of the second position to generate
-     * \param box The 3D box
-     * \param intersect The expected result of the test. True for intersection,
+     * @brief Create BoxLineIntersectionTestCase
+     * @param indexPos1 Index of the first position to generate
+     * @param indexPos2 Index of the second position to generate
+     * @param box The 3D box
+     * @param intersect The expected result of the test. True for intersection,
      *        false otherwise
      */
     BoxLineIntersectionTestCase(uint16_t indexPos1, uint16_t indexPos2, Box box, bool intersect);
     /**
-     * \brief Builds the test name string based on provided parameter values
-     * \param indexPos1 Index of the first position to generate
-     * \param indexPos2 Index of the second position to generate
-     * \param box The 3D box
-     * \param intersect The expected result of the test. True for intersection,
+     * @brief Builds the test name string based on provided parameter values
+     * @param indexPos1 Index of the first position to generate
+     * @param indexPos2 Index of the second position to generate
+     * @param box The 3D box
+     * @param intersect The expected result of the test. True for intersection,
      *        false otherwise
      *
-     * \return The name string
+     * @return The name string
      */
     std::string BuildNameString(uint16_t indexPos1, uint16_t indexPos2, Box box, bool intersect);
     /**
@@ -61,17 +61,17 @@
 
   private:
     /**
-     * \brief Setup the simulation according to the configuration set by the
+     * @brief Setup the simulation according to the configuration set by the
      *        class constructor, run it, and verify the result.
      */
     void DoRun() override;
     /**
-     * \brief Create the position as per the given index
+     * @brief Create the position as per the given index
      *
-     * \param index The index of the position to be created
-     * \param boxHeight The height if the box. It is used to place the position
+     * @param index The index of the position to be created
+     * @param boxHeight The height if the box. It is used to place the position
      *        above the height of the box
-     * \returns The ns-3 3D Vector specifying the position
+     * @returns The ns-3 3D Vector specifying the position
      */
     Vector CreatePosition(uint16_t index, double boxHeight);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mobility/test/geocentric-topocentric-conversion-test.cc ns-3.44/src/mobility/test/geocentric-topocentric-conversion-test.cc
--- ns-3.43/src/mobility/test/geocentric-topocentric-conversion-test.cc	2024-10-09 16:41:10.060656500 -0700
+++ ns-3.44/src/mobility/test/geocentric-topocentric-conversion-test.cc	2025-03-09 16:55:49.659372000 -0700
@@ -6,10 +6,10 @@
  * Author: Matteo Pagin <mattpagg@gmail.com>
  */
 
-#include <ns3/angles.h>
-#include <ns3/geographic-positions.h>
-#include <ns3/log.h>
-#include <ns3/test.h>
+#include "ns3/angles.h"
+#include "ns3/geographic-positions.h"
+#include "ns3/log.h"
+#include "ns3/test.h"
 
 NS_LOG_COMPONENT_DEFINE("GeocentricTopocentricConversionTest");
 
@@ -352,9 +352,9 @@
 using namespace ns3;
 
 /**
- * \ingroup mobility-test
+ * @ingroup mobility-test
  *
- * \brief Geographic to/from Topocentric Test Case
+ * @brief Geographic to/from Topocentric Test Case
  *
  * This test verifies the accuracy of the GeographicToTopocentricCoordinates and
  * TopocentricToGeographicCoordinates methods in the GeographicPositions class,
@@ -518,9 +518,9 @@
 }
 
 /**
- * \ingroup mobility-test
+ * @ingroup mobility-test
  *
- * \brief Geographic cartesian <--> Topocentric conversion test
+ * @brief Geographic cartesian <--> Topocentric conversion test
  */
 class GeoToAndFromTopocentricTestSuite : public TestSuite
 {
@@ -556,7 +556,7 @@
 }
 
 /**
- * \ingroup mobility-test
+ * @ingroup mobility-test
  * Static variable for test initialization
  */
 static GeoToAndFromTopocentricTestSuite g_GeoToAndFromTopocentricTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mobility/test/geo-to-cartesian-test.cc ns-3.44/src/mobility/test/geo-to-cartesian-test.cc
--- ns-3.43/src/mobility/test/geo-to-cartesian-test.cc	2024-10-09 16:41:10.060656500 -0700
+++ ns-3.44/src/mobility/test/geo-to-cartesian-test.cc	2025-03-09 16:55:49.659372000 -0700
@@ -6,9 +6,9 @@
  * Author: Benjamin Cizdziel <ben.cizdziel@gmail.com>
  */
 
-#include <ns3/geographic-positions.h>
-#include <ns3/log.h>
-#include <ns3/test.h>
+#include "ns3/geographic-positions.h"
+#include "ns3/log.h"
+#include "ns3/test.h"
 
 NS_LOG_COMPONENT_DEFINE("GeoToCartesianTest");
 
@@ -1474,15 +1474,15 @@
 };
 
 /**
- * \ingroup mobility
- * \ingroup tests
- * \defgroup mobility-test mobility module tests
+ * @ingroup mobility
+ * @ingroup tests
+ * @defgroup mobility-test mobility module tests
  */
 
 /**
- * \ingroup mobility-test
+ * @ingroup mobility-test
  *
- * \brief Geo To Cartesian Test Case
+ * @brief Geo To Cartesian Test Case
  *
  * This test verifies the accuracy of the GeographicToCartesianCoordinates()
  * method in the GeographicPositions class, which converts earth
@@ -1501,11 +1501,11 @@
     /**
      * Constructor
      *
-     * \param latitude latitude (deg)
-     * \param longitude longitude (deg)
-     * \param altitude altitude (m)
-     * \param sphType sphere type
-     * \param i index
+     * @param latitude latitude (deg)
+     * @param longitude longitude (deg)
+     * @param altitude altitude (m)
+     * @param sphType sphere type
+     * @param i index
      */
     GeoToCartesianTestCase(double latitude,
                            double longitude,
@@ -1519,11 +1519,11 @@
 
     /**
      * Name function
-     * \param latitude the latitude (deg)
-     * \param longitude the longitude (deg)
-     * \param altitude the altitude (m)
-     * \param sphType the sphere type
-     * \returns the name string
+     * @param latitude the latitude (deg)
+     * @param longitude the longitude (deg)
+     * @param altitude the altitude (m)
+     * @param sphType the sphere type
+     * @returns the name string
      */
     static std::string Name(double latitude,
                             double longitude,
@@ -1662,9 +1662,9 @@
 }
 
 /**
- * \ingroup mobility-test
+ * @ingroup mobility-test
  *
- * \brief Cartesian to Geo Test Case
+ * @brief Cartesian to Geo Test Case
  *
  * This test verifies the accuracy of the CartesianToGeographicCoordinates()
  * method in the GeographicPositions class, which converts earth
@@ -1679,11 +1679,11 @@
     /**
      * Constructor
      *
-     * \param latitude latitude (deg)
-     * \param longitude longitude (deg)
-     * \param altitude altitude (m)
-     * \param sphType sphere type
-     * \param i index
+     * @param latitude latitude (deg)
+     * @param longitude longitude (deg)
+     * @param altitude altitude (m)
+     * @param sphType sphere type
+     * @param i index
      */
     CartesianToGeoTestCase(double latitude,
                            double longitude,
@@ -1697,11 +1697,11 @@
 
     /**
      * Name function
-     * \param latitude the latitude (deg)
-     * \param longitude the longitude (deg)
-     * \param altitude the altitude (m)
-     * \param sphType the sphere type
-     * \returns the name string
+     * @param latitude the latitude (deg)
+     * @param longitude the longitude (deg)
+     * @param altitude the altitude (m)
+     * @param sphType the sphere type
+     * @returns the name string
      */
     static std::string Name(double latitude,
                             double longitude,
@@ -1778,9 +1778,9 @@
 }
 
 /**
- * \ingroup mobility-test
+ * @ingroup mobility-test
  *
- * \brief Geo To Cartesian Test Suite
+ * @brief Geo To Cartesian Test Suite
  */
 class GeoToCartesianTestSuite : public TestSuite
 {
@@ -1864,7 +1864,7 @@
 }
 
 /**
- * \ingroup mobility-test
+ * @ingroup mobility-test
  * Static variable for test initialization
  */
 static GeoToCartesianTestSuite g_GeoToCartesianTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mobility/test/mobility-test-suite.cc ns-3.44/src/mobility/test/mobility-test-suite.cc
--- ns-3.43/src/mobility/test/mobility-test-suite.cc	2024-10-09 16:41:10.060656500 -0700
+++ ns-3.44/src/mobility/test/mobility-test-suite.cc	2025-03-09 16:55:49.659372000 -0700
@@ -23,9 +23,9 @@
 using namespace ns3;
 
 /**
- * \ingroup mobility-test
+ * @ingroup mobility-test
  *
- * \brief Test whether course change notifications occur regardless of calls
+ * @brief Test whether course change notifications occur regardless of calls
  * to Update() position (which are triggered by calls to GetPosition())
  */
 class WaypointLazyNotifyFalse : public TestCase
@@ -37,13 +37,13 @@
   private:
     /**
      * Test X position function
-     * \param expectedXPos the expected X position
+     * @param expectedXPos the expected X position
      */
     void TestXPosition(double expectedXPos);
     /**
      * Course change callback
-     * \param path the path
-     * \param model the mobility model
+     * @param path the path
+     * @param model the mobility model
      */
     void CourseChangeCallback(std::string path, Ptr<const MobilityModel> model);
     void DoRun() override;
@@ -87,22 +87,22 @@
     m_mob = CreateObject<WaypointMobilityModel>();
     // LazyNotify should by default be false
     m_node->AggregateObject(m_mob);
-    Waypoint wpt(Seconds(0.0), Vector(0.0, 0.0, 0.0));
+    Waypoint wpt(Seconds(0), Vector(0.0, 0.0, 0.0));
     m_mob->AddWaypoint(wpt);
-    Waypoint wpt2(Seconds(10.0), Vector(10.0, 10.0, 10.0));
+    Waypoint wpt2(Seconds(10), Vector(10.0, 10.0, 10.0));
     m_mob->AddWaypoint(wpt2);
-    Waypoint wpt3(Seconds(20.0), Vector(20.0, 20.0, 20.0));
+    Waypoint wpt3(Seconds(20), Vector(20.0, 20.0, 20.0));
     m_mob->AddWaypoint(wpt3);
 
-    Simulator::Schedule(Seconds(5.0), &WaypointLazyNotifyFalse::TestXPosition, this, 5);
+    Simulator::Schedule(Seconds(5), &WaypointLazyNotifyFalse::TestXPosition, this, 5);
     Simulator::Run();
     Simulator::Destroy();
 }
 
 /**
- * \ingroup mobility-test
+ * @ingroup mobility-test
  *
- * \brief Waypoint Lazy Notify True
+ * @brief Waypoint Lazy Notify True
  */
 class WaypointLazyNotifyTrue : public TestCase
 {
@@ -113,13 +113,13 @@
   private:
     /**
      * Text X position function
-     * \param expectedXPos the expected X position
+     * @param expectedXPos the expected X position
      */
     void TestXPosition(double expectedXPos);
     /**
      * Course change callback
-     * \param path the path
-     * \param model the mobility model
+     * @param path the path
+     * @param model the mobility model
      */
     void CourseChangeCallback(std::string path, Ptr<const MobilityModel> model);
     void DoRun() override;
@@ -161,22 +161,22 @@
     m_mob = CreateObject<WaypointMobilityModel>();
     m_mob->SetAttributeFailSafe("LazyNotify", BooleanValue(true));
     m_node->AggregateObject(m_mob);
-    Waypoint wpt(Seconds(0.0), Vector(0.0, 0.0, 0.0));
+    Waypoint wpt(Seconds(0), Vector(0.0, 0.0, 0.0));
     m_mob->AddWaypoint(wpt);
-    Waypoint wpt2(Seconds(10.0), Vector(10.0, 10.0, 10.0));
+    Waypoint wpt2(Seconds(10), Vector(10.0, 10.0, 10.0));
     m_mob->AddWaypoint(wpt2);
-    Waypoint wpt3(Seconds(20.0), Vector(20.0, 20.0, 20.0));
+    Waypoint wpt3(Seconds(20), Vector(20.0, 20.0, 20.0));
     m_mob->AddWaypoint(wpt3);
 
-    Simulator::Schedule(Seconds(15.0), &WaypointLazyNotifyTrue::TestXPosition, this, 15);
+    Simulator::Schedule(Seconds(15), &WaypointLazyNotifyTrue::TestXPosition, this, 15);
     Simulator::Run();
     Simulator::Destroy();
 }
 
 /**
- * \ingroup mobility-test
+ * @ingroup mobility-test
  *
- * \brief Waypoint Initial Position Is Waypoint Test
+ * @brief Waypoint Initial Position Is Waypoint Test
  */
 class WaypointInitialPositionIsWaypoint : public TestCase
 {
@@ -187,14 +187,14 @@
   private:
     /**
      * Text X position function
-     * \param model the mobility model
-     * \param expectedXPos the expected X position
+     * @param model the mobility model
+     * @param expectedXPos the expected X position
      */
     void TestXPosition(Ptr<const WaypointMobilityModel> model, double expectedXPos);
     /**
      * Test number of way points
-     * \param model the mobility model
-     * \param num the number of way points
+     * @param model the mobility model
+     * @param num the number of way points
      */
     void TestNumWaypoints(Ptr<const WaypointMobilityModel> model, uint32_t num);
     void DoRun() override;
@@ -239,13 +239,13 @@
     m_mob1->SetAttributeFailSafe("InitialPositionIsWaypoint", BooleanValue(false));
     m_mob1->SetPosition(Vector(10.0, 10.0, 10.0));
     // At time 1s, there should be no waypoints
-    Simulator::Schedule(Seconds(1.0),
+    Simulator::Schedule(Seconds(1),
                         &WaypointInitialPositionIsWaypoint::TestNumWaypoints,
                         this,
                         m_mob1,
                         0);
     // At time 15s, the model should still be at x position 10.0
-    Simulator::Schedule(Seconds(15.0),
+    Simulator::Schedule(Seconds(15),
                         &WaypointInitialPositionIsWaypoint::TestXPosition,
                         this,
                         m_mob1,
@@ -255,19 +255,19 @@
     // after adding a waypoint.
     m_mob2 = CreateObject<WaypointMobilityModel>();
     m_mob2->SetAttributeFailSafe("InitialPositionIsWaypoint", BooleanValue(false));
-    Waypoint wpt21(Seconds(5.0), Vector(15.0, 15.0, 15.0));
+    Waypoint wpt21(Seconds(5), Vector(15.0, 15.0, 15.0));
     m_mob2->AddWaypoint(wpt21);
-    Waypoint wpt22(Seconds(10.0), Vector(20.0, 20.0, 20.0));
+    Waypoint wpt22(Seconds(10), Vector(20.0, 20.0, 20.0));
     m_mob2->AddWaypoint(wpt22);
     m_mob2->SetPosition(Vector(10.0, 10.0, 10.0));
     // At time 3, no waypoints have been hit, so position should be 10 and
     // numWaypoints should be 2, or 1 excluding the next one
-    Simulator::Schedule(Seconds(3.0),
+    Simulator::Schedule(Seconds(3),
                         &WaypointInitialPositionIsWaypoint::TestXPosition,
                         this,
                         m_mob2,
                         10.0);
-    Simulator::Schedule(Seconds(3.0),
+    Simulator::Schedule(Seconds(3),
                         &WaypointInitialPositionIsWaypoint::TestNumWaypoints,
                         this,
                         m_mob2,
@@ -275,12 +275,12 @@
     // At time 8, check that X position is 18 (i.e. position is interpolating
     // between 15 and 20) and there is one waypoint left, but we exclude
     // the next one so we test for zero waypoints
-    Simulator::Schedule(Seconds(8.0),
+    Simulator::Schedule(Seconds(8),
                         &WaypointInitialPositionIsWaypoint::TestXPosition,
                         this,
                         m_mob2,
                         18.0);
-    Simulator::Schedule(Seconds(8.0),
+    Simulator::Schedule(Seconds(8),
                         &WaypointInitialPositionIsWaypoint::TestNumWaypoints,
                         this,
                         m_mob2,
@@ -292,13 +292,13 @@
     m_mob3->SetAttributeFailSafe("InitialPositionIsWaypoint", BooleanValue(true));
     m_mob3->SetPosition(Vector(10.0, 10.0, 10.0));
     // At time 1s, there should be zero waypoints not counting the next one
-    Simulator::Schedule(Seconds(1.0),
+    Simulator::Schedule(Seconds(1),
                         &WaypointInitialPositionIsWaypoint::TestNumWaypoints,
                         this,
                         m_mob3,
                         0);
     // At time 15s, the model should still be at x position 10.0
-    Simulator::Schedule(Seconds(15.0),
+    Simulator::Schedule(Seconds(15),
                         &WaypointInitialPositionIsWaypoint::TestXPosition,
                         this,
                         m_mob3,
@@ -308,33 +308,33 @@
     // after adding a waypoint.
     m_mob4 = CreateObject<WaypointMobilityModel>();
     m_mob4->SetAttributeFailSafe("InitialPositionIsWaypoint", BooleanValue(true));
-    Waypoint wpt41(Seconds(5.0), Vector(15.0, 15.0, 15.0));
+    Waypoint wpt41(Seconds(5), Vector(15.0, 15.0, 15.0));
     m_mob4->AddWaypoint(wpt41);
-    Waypoint wpt42(Seconds(10.0), Vector(20.0, 20.0, 20.0));
+    Waypoint wpt42(Seconds(10), Vector(20.0, 20.0, 20.0));
     m_mob4->AddWaypoint(wpt42);
     // Here, SetPosition() is called after waypoints have been added.  In
     // this case, the initial position is set until the time of the first
     // waypoint, at which time it jumps to the waypoint and begins moving
     m_mob4->SetPosition(Vector(10.0, 10.0, 10.0));
     // At time 3, position should be fixed still at 10
-    Simulator::Schedule(Seconds(3.0),
+    Simulator::Schedule(Seconds(3),
                         &WaypointInitialPositionIsWaypoint::TestXPosition,
                         this,
                         m_mob4,
                         10.0);
-    Simulator::Schedule(Seconds(3.0),
+    Simulator::Schedule(Seconds(3),
                         &WaypointInitialPositionIsWaypoint::TestNumWaypoints,
                         this,
                         m_mob4,
                         1);
     // At time 6, we should be moving between 15 and 20
-    Simulator::Schedule(Seconds(6.0),
+    Simulator::Schedule(Seconds(6),
                         &WaypointInitialPositionIsWaypoint::TestXPosition,
                         this,
                         m_mob4,
                         16.0);
     // At time 15, we should be fixed at 20
-    Simulator::Schedule(Seconds(15.0),
+    Simulator::Schedule(Seconds(15),
                         &WaypointInitialPositionIsWaypoint::TestXPosition,
                         this,
                         m_mob4,
@@ -347,16 +347,16 @@
     // Note:  The below statement would result in a crash, because it would
     // violate the rule that waypoints must increase in start time
     // m_mob5->SetPosition (Vector (10.0, 10.0, 10.0));
-    Waypoint wpt51(Seconds(0.0), Vector(200.0, 200.0, 200.0));
+    Waypoint wpt51(Seconds(0), Vector(200.0, 200.0, 200.0));
     m_mob5->AddWaypoint(wpt51);
-    Waypoint wpt52(Seconds(5.0), Vector(15.0, 15.0, 15.0));
+    Waypoint wpt52(Seconds(5), Vector(15.0, 15.0, 15.0));
     m_mob5->AddWaypoint(wpt52);
-    Waypoint wpt53(Seconds(10.0), Vector(20.0, 20.0, 20.0));
+    Waypoint wpt53(Seconds(10), Vector(20.0, 20.0, 20.0));
     m_mob5->AddWaypoint(wpt53);
     // Here, since waypoints already exist, the below SetPosition will cancel
     // out wpt51 above, and model will stay at initial position until time 5
     m_mob5->SetPosition(Vector(10.0, 10.0, 10.0));
-    Simulator::Schedule(Seconds(3.0),
+    Simulator::Schedule(Seconds(3),
                         &WaypointInitialPositionIsWaypoint::TestXPosition,
                         this,
                         m_mob5,
@@ -367,9 +367,9 @@
 }
 
 /**
- * \ingroup mobility-test
+ * @ingroup mobility-test
  *
- * \brief Waypoint Mobility Model Via Helper Test
+ * @brief Waypoint Mobility Model Via Helper Test
  */
 class WaypointMobilityModelViaHelper : public TestCase
 {
@@ -380,8 +380,8 @@
   private:
     /**
      * Text X position function
-     * \param mob the mobility model
-     * \param expectedXPos the expected X position
+     * @param mob the mobility model
+     * @param expectedXPos the expected X position
      */
     void TestXPosition(Ptr<const WaypointMobilityModel> mob, double expectedXPos);
     void DoRun() override;
@@ -425,8 +425,8 @@
     // Get back a pointer to this
     Ptr<WaypointMobilityModel> mob = c.Get(0)->GetObject<WaypointMobilityModel>();
     // Waypoint added at time 0 will override initial position
-    Waypoint wpt(Seconds(5.0), Vector(20.0, 20.0, 20.0));
-    Waypoint wpt2(Seconds(10.0), Vector(10.0, 10.0, 10.0));
+    Waypoint wpt(Seconds(5), Vector(20.0, 20.0, 20.0));
+    Waypoint wpt2(Seconds(10), Vector(10.0, 10.0, 10.0));
     mob->AddWaypoint(wpt);
     mob->AddWaypoint(wpt2);
     // At time 3 (before first waypoint, position is 20
@@ -452,7 +452,7 @@
                                BooleanValue(true));
     mobility2.Install(c2);
     Ptr<WaypointMobilityModel> mob2 = c2.Get(0)->GetObject<WaypointMobilityModel>();
-    Waypoint wpt3(Seconds(5.0), Vector(20.0, 20.0, 20.0));
+    Waypoint wpt3(Seconds(5), Vector(20.0, 20.0, 20.0));
     mob2->AddWaypoint(wpt3);
     // Move to position 12 at 3 seconds
     Simulator::Schedule(Seconds(3), &WaypointMobilityModelViaHelper::TestXPosition, this, mob2, 12);
@@ -462,9 +462,9 @@
 }
 
 /**
- * \ingroup mobility-test
+ * @ingroup mobility-test
  *
- * \brief Mobility Test Suite
+ * @brief Mobility Test Suite
  */
 class MobilityTestSuite : public TestSuite
 {
@@ -482,7 +482,7 @@
 }
 
 /**
- * \ingroup mobility-test
+ * @ingroup mobility-test
  * Static variable for test initialization
  */
 static MobilityTestSuite mobilityTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mobility/test/mobility-trace-test-suite.cc ns-3.44/src/mobility/test/mobility-trace-test-suite.cc
--- ns-3.43/src/mobility/test/mobility-trace-test-suite.cc	2024-10-09 16:41:10.060656500 -0700
+++ ns-3.44/src/mobility/test/mobility-trace-test-suite.cc	2025-03-09 16:55:49.659372000 -0700
@@ -23,9 +23,9 @@
 using namespace ns3;
 
 /**
- * \ingroup mobility-test
+ * @ingroup mobility-test
  *
- * \brief Mobility Trace Test Case
+ * @brief Mobility Trace Test Case
  */
 
 class MobilityTraceTestCase : public TestCase
@@ -89,7 +89,7 @@
 
     AsciiTraceHelper ascii;
     MobilityHelper::EnableAsciiAll(ascii.CreateFileStream(testMobilityFilePath));
-    Simulator::Stop(Seconds(5.0));
+    Simulator::Stop(Seconds(5));
     Simulator::Run();
     Simulator::Destroy();
 
@@ -101,9 +101,9 @@
 }
 
 /**
- * \ingroup mobility-test
+ * @ingroup mobility-test
  *
- * \brief Mobility Trace Test Suite
+ * @brief Mobility Trace Test Suite
  */
 
 class MobilityTraceTestSuite : public TestSuite
@@ -119,7 +119,7 @@
 }
 
 /**
- * \ingroup mobility-test
+ * @ingroup mobility-test
  * Static variable for test initialization
  */
 static MobilityTraceTestSuite mobilityTraceTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mobility/test/ns2-mobility-helper-test-suite.cc ns-3.44/src/mobility/test/ns2-mobility-helper-test-suite.cc
--- ns-3.43/src/mobility/test/ns2-mobility-helper-test-suite.cc	2024-10-09 16:41:10.060656500 -0700
+++ ns-3.44/src/mobility/test/ns2-mobility-helper-test-suite.cc	2025-03-09 16:55:49.659372000 -0700
@@ -64,9 +64,9 @@
 }
 
 /**
- * \ingroup mobility-test
+ * @ingroup mobility-test
  *
- * \brief Every test case is supposed to:
+ * @brief Every test case is supposed to:
  *  1. Generate short mobility trace file
  *  2. Read it back using Ns2MobilityHelper
  *  3. Check initial node positions and speeds.
@@ -87,10 +87,10 @@
         /**
          * Constructor
          *
-         * \param id reference ID
-         * \param t time
-         * \param p position
-         * \param v velocity
+         * @param id reference ID
+         * @param t time
+         * @param p position
+         * @param v velocity
          */
         ReferencePoint(const std::string& id, Time t, const Vector& p, const Vector& v)
             : node(id),
@@ -102,8 +102,8 @@
 
         /**
          * Less-than operator - used to sort by timestamp
-         * \param o object to compare to
-         * \returns true if the timestamp of the 1st operand is less than the other one's
+         * @param o object to compare to
+         * @returns true if the timestamp of the 1st operand is less than the other one's
          */
         bool operator<(const ReferencePoint& o) const
         {
@@ -114,9 +114,9 @@
     /**
      * Create new test case. To make it useful SetTrace () and AddReferencePoint () must be called
      *
-     * \param name        Short description
-     * \param timeLimit   Test time limit
-     * \param nodes       Number of nodes used in the test trace, 1 by default
+     * @param name        Short description
+     * @param timeLimit   Test time limit
+     * @param nodes       Number of nodes used in the test trace, 1 by default
      */
     Ns2MobilityHelperTest(const std::string& name, Time timeLimit, uint32_t nodes = 1)
         : TestCase(name),
@@ -133,7 +133,7 @@
 
     /**
      * Set NS-2 trace to read as single large string (don't forget to add \\n and quote \"'s)
-     * \param trace the mobility trace
+     * @param trace the mobility trace
      */
     void SetTrace(const std::string& trace)
     {
@@ -142,7 +142,7 @@
 
     /**
      * Add next reference point
-     * \param r reference point to add
+     * @param r reference point to add
      */
     void AddReferencePoint(const ReferencePoint& r)
     {
@@ -151,10 +151,10 @@
 
     /**
      * Add next reference point
-     * \param id reference point id
-     * \param sec reference point ime (in seconds)
-     * \param p reference point position
-     * \param v reference point velocity
+     * @param id reference point id
+     * @param sec reference point ime (in seconds)
+     * @param p reference point position
+     * @param v reference point velocity
      */
     void AddReferencePoint(const char* id, double sec, const Vector& p, const Vector& v)
     {
@@ -178,7 +178,7 @@
   private:
     /**
      * Dump NS-2 trace to tmp file
-     * \return true on error.
+     * @return true on error.
      */
     bool WriteTrace()
     {
@@ -205,13 +205,12 @@
 
     /**
      * Check that all initial positions are correct
-     * \return true on error.
+     * @return true on error.
      */
     bool CheckInitialPositions()
     {
         std::stable_sort(m_reference.begin(), m_reference.end());
-        while (m_nextRefPoint < m_reference.size() &&
-               m_reference[m_nextRefPoint].time == Seconds(0))
+        while (m_nextRefPoint < m_reference.size() && m_reference[m_nextRefPoint].time.IsZero())
         {
             const ReferencePoint& rp = m_reference[m_nextRefPoint];
             Ptr<Node> node = Names::Find<Node>(rp.node);
@@ -238,8 +237,8 @@
 
     /**
      * Listen for course change events
-     * \param context event context
-     * \param mobility a pointer to the mobility model
+     * @param context event context
+     * @param mobility a pointer to the mobility model
      */
     void CourseChange(std::string context, Ptr<const MobilityModel> mobility)
     {
@@ -309,9 +308,9 @@
 };
 
 /**
- * \ingroup mobility-test
+ * @ingroup mobility-test
  *
- * \brief The test suite
+ * @brief The test suite
  */
 class Ns2MobilityHelperTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mobility/test/rand-cart-around-geo-test.cc ns-3.44/src/mobility/test/rand-cart-around-geo-test.cc
--- ns-3.43/src/mobility/test/rand-cart-around-geo-test.cc	2024-10-09 16:41:10.060656500 -0700
+++ ns-3.44/src/mobility/test/rand-cart-around-geo-test.cc	2025-03-09 16:55:49.659372000 -0700
@@ -6,9 +6,9 @@
  * Author: Benjamin Cizdziel <ben.cizdziel@gmail.com>
  */
 
-#include <ns3/geographic-positions.h>
-#include <ns3/log.h>
-#include <ns3/test.h>
+#include "ns3/geographic-positions.h"
+#include "ns3/log.h"
+#include "ns3/test.h"
 
 #include <cmath>
 
@@ -45,9 +45,9 @@
 static const double EARTH_RADIUS = 6371e3;
 
 /**
- * \ingroup mobility-test
+ * @ingroup mobility-test
  *
- * \brief Rand Cart Around Geo Test Case
+ * @brief Rand Cart Around Geo Test Case
  */
 class RandCartAroundGeoTestCase : public TestCase
 {
@@ -55,12 +55,12 @@
     /**
      * Constructor
      *
-     * \param originLatitude origin latitude
-     * \param originLongitude origin longitude
-     * \param maxAltitude maximum altitude
-     * \param numPoints number of points
-     * \param maxDistFromOrigin maximum distance from origin
-     * \param uniRand random variable
+     * @param originLatitude origin latitude
+     * @param originLongitude origin longitude
+     * @param maxAltitude maximum altitude
+     * @param numPoints number of points
+     * @param maxDistFromOrigin maximum distance from origin
+     * @param uniRand random variable
      */
     RandCartAroundGeoTestCase(double originLatitude,
                               double originLongitude,
@@ -74,10 +74,10 @@
     void DoRun() override;
     /**
      * name function
-     * \param originLatitude the origin latitude
-     * \param originLongitude the origin longitude
-     * \param maxDistFromOrigin the maximum distance from the origin
-     * \returns the name string
+     * @param originLatitude the origin latitude
+     * @param originLongitude the origin longitude
+     * @param maxDistFromOrigin the maximum distance from the origin
+     * @returns the name string
      */
     static std::string Name(double originLatitude,
                             double originLongitude,
@@ -161,9 +161,9 @@
 }
 
 /**
- * \ingroup mobility-test
+ * @ingroup mobility-test
  *
- * \brief Rand Cart Around Geo Test Suite
+ * @brief Rand Cart Around Geo Test Suite
  */
 class RandCartAroundGeoTestSuite : public TestSuite
 {
@@ -197,7 +197,7 @@
 }
 
 /**
- * \ingroup mobility-test
+ * @ingroup mobility-test
  * Static variable for test initialization
  */
 static RandCartAroundGeoTestSuite g_RandCartAroundGeoTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mobility/test/rectangle-closest-border-test.cc ns-3.44/src/mobility/test/rectangle-closest-border-test.cc
--- ns-3.43/src/mobility/test/rectangle-closest-border-test.cc	2024-10-09 16:41:10.060656500 -0700
+++ ns-3.44/src/mobility/test/rectangle-closest-border-test.cc	2025-03-09 16:55:49.659372000 -0700
@@ -4,16 +4,16 @@
  * Author: Gabriel Ferreira <gabrielcarvfer@gmail.com>
  */
 
-#include <ns3/rectangle.h>
-#include <ns3/simulator.h>
-#include <ns3/test.h>
+#include "ns3/rectangle.h"
+#include "ns3/simulator.h"
+#include "ns3/test.h"
 
 using namespace ns3;
 
 /**
- * \ingroup mobility-test
+ * @ingroup mobility-test
  *
- * \brief Rectangle detection of closest border to a point, inside or outside.
+ * @brief Rectangle detection of closest border to a point, inside or outside.
  */
 class RectangleClosestBorderTestSuite : public TestSuite
 {
@@ -25,29 +25,29 @@
 };
 
 /**
- * \ingroup mobility-test
+ * @ingroup mobility-test
  *
- * \brief TestCase to check the rectangle line intersection
+ * @brief TestCase to check the rectangle line intersection
  */
 class RectangleClosestBorderTestCase : public TestCase
 {
   public:
     /**
-     * \brief Create RectangleClosestBorderTestCase
-     * \param x Index of the first position to generate
-     * \param y Index of the second position to generate
-     * \param rectangle The 2D rectangle
-     * \param side The expected result of the test
+     * @brief Create RectangleClosestBorderTestCase
+     * @param x Index of the first position to generate
+     * @param y Index of the second position to generate
+     * @param rectangle The 2D rectangle
+     * @param side The expected result of the test
      */
     RectangleClosestBorderTestCase(double x, double y, Rectangle rectangle, Rectangle::Side side);
     /**
-     * \brief Builds the test name string based on provided parameter values
-     * \param x Index of the first position to generate
-     * \param y Index of the second position to generate
-     * \param rectangle The 2D rectangle
-     * \param side The expected result of the test
+     * @brief Builds the test name string based on provided parameter values
+     * @param x Index of the first position to generate
+     * @param y Index of the second position to generate
+     * @param rectangle The 2D rectangle
+     * @param side The expected result of the test
      *
-     * \return The name string
+     * @return The name string
      */
     std::string BuildNameString(double x, double y, Rectangle rectangle, Rectangle::Side side);
     /**
@@ -57,7 +57,7 @@
 
   private:
     /**
-     * \brief Setup the simulation according to the configuration set by the
+     * @brief Setup the simulation according to the configuration set by the
      *        class constructor, run it, and verify the result.
      */
     void DoRun() override;
@@ -150,7 +150,7 @@
 }
 
 /**
- * \ingroup mobility-test
+ * @ingroup mobility-test
  * Static variable for test initialization
  */
 static RectangleClosestBorderTestSuite rectangleClosestBorderTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mobility/test/steady-state-random-waypoint-mobility-model-test.cc ns-3.44/src/mobility/test/steady-state-random-waypoint-mobility-model-test.cc
--- ns-3.43/src/mobility/test/steady-state-random-waypoint-mobility-model-test.cc	2024-10-09 16:41:10.060656500 -0700
+++ ns-3.44/src/mobility/test/steady-state-random-waypoint-mobility-model-test.cc	2025-03-09 16:55:49.659372000 -0700
@@ -18,9 +18,9 @@
 using namespace ns3;
 
 /**
- * \ingroup mobility-test
+ * @ingroup mobility-test
  *
- * \brief Steady State Random Waypoint Test
+ * @brief Steady State Random Waypoint Test
  */
 class SteadyStateRandomWaypointTest : public TestCase
 {
@@ -78,7 +78,7 @@
         model->AssignStreams(100 * (i + 1));
         // Add this mobility model to the stack.
         mobilityStack.push_back(model);
-        Simulator::Schedule(Seconds(0.0), &Object::Initialize, model);
+        Simulator::Schedule(Seconds(0), &Object::Initialize, model);
     }
 
     Simulator::Schedule(Seconds(0.001), &SteadyStateRandomWaypointTest::DistribCompare, this);
@@ -138,9 +138,9 @@
 }
 
 /**
- * \ingroup mobility-test
+ * @ingroup mobility-test
  *
- * \brief Steady State Random Waypoint Test Suite
+ * @brief Steady State Random Waypoint Test Suite
  */
 struct SteadyStateRandomWaypointTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mobility/test/waypoint-mobility-model-test.cc ns-3.44/src/mobility/test/waypoint-mobility-model-test.cc
--- ns-3.43/src/mobility/test/waypoint-mobility-model-test.cc	2024-10-09 16:41:10.060656500 -0700
+++ ns-3.44/src/mobility/test/waypoint-mobility-model-test.cc	2025-03-09 16:55:49.659372000 -0700
@@ -15,9 +15,9 @@
 using namespace ns3;
 
 /**
- * \ingroup mobility-test
+ * @ingroup mobility-test
  *
- * \brief Waypoint Mobility Model Notify Test
+ * @brief Waypoint Mobility Model Notify Test
  */
 class WaypointMobilityModelNotifyTest : public TestCase
 {
@@ -25,7 +25,7 @@
     /**
      * Constructor
      *
-     * \param lazy lazy?
+     * @param lazy lazy?
      */
     WaypointMobilityModelNotifyTest(bool lazy)
         : TestCase(lazy ? "Check Waypoint Mobility Model LAZY notification accuracy"
@@ -51,7 +51,7 @@
     void ForceUpdates();
     /**
      * Course change callback
-     * \param model the mobility model
+     * @param model the mobility model
      */
     void CourseChangeCallback(Ptr<const MobilityModel> model);
 };
@@ -81,15 +81,15 @@
 
         // Add this mobility model to the stack.
         mobilityStack.push_back(model);
-        Simulator::Schedule(Seconds(0.0), &Object::Initialize, model);
+        Simulator::Schedule(Seconds(0), &Object::Initialize, model);
     }
 
-    Waypoint wpt(Seconds(0.0), Vector(0.0, 0.0, 0.0));
+    Waypoint wpt(Seconds(0), Vector(0.0, 0.0, 0.0));
 
     // Create waypoints
     for (uint32_t iw = 0; iw < waypointCount; ++iw)
     {
-        wpt.time += Seconds(1.0);
+        wpt.time += Seconds(1);
         waypoints.push_back(wpt);
     }
 
@@ -157,9 +157,9 @@
 }
 
 /**
- * \ingroup mobility-test
+ * @ingroup mobility-test
  *
- * \brief Waypoint Mobility Model Add Waypoint Test
+ * @brief Waypoint Mobility Model Add Waypoint Test
  */
 class WaypointMobilityModelAddWaypointTest : public TestCase
 {
@@ -183,7 +183,7 @@
     void DoTeardown() override;
     /**
      * Course change callback
-     * \param model the mobility model
+     * @param model the mobility model
      */
     void CourseChangeCallback(Ptr<const MobilityModel> model);
 };
@@ -211,7 +211,7 @@
         MakeCallback(&WaypointMobilityModelAddWaypointTest::CourseChangeCallback, this));
 
     // Add this mobility model to the stack.
-    Simulator::Schedule(Seconds(0.0), &Object::Initialize, m_mobilityModel);
+    Simulator::Schedule(Seconds(0), &Object::Initialize, m_mobilityModel);
 
     Ptr<WaypointMobilityModel> mob = DynamicCast<WaypointMobilityModel>(m_mobilityModel);
     Waypoint m_nextWaypoint(Seconds(m_waypointCounter), Vector(0.0, 0.0, 0.0));
@@ -241,9 +241,9 @@
 }
 
 /**
- * \ingroup mobility-test
+ * @ingroup mobility-test
  *
- * \brief Waypoint Mobility Model Test Suite
+ * @brief Waypoint Mobility Model Test Suite
  */
 static struct WaypointMobilityModelTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mpi/CMakeLists.txt ns-3.44/src/mpi/CMakeLists.txt
--- ns-3.43/src/mpi/CMakeLists.txt	2024-10-09 16:41:10.060656500 -0700
+++ ns-3.44/src/mpi/CMakeLists.txt	2025-03-09 16:55:49.659372000 -0700
@@ -22,6 +22,6 @@
     model/mpi-receiver.h
     model/parallel-communication-interface.h
   LIBRARIES_TO_LINK ${libnetwork}
-                    ${MPI_CXX_LIBRARIES}
+                    MPI::MPI_CXX
   TEST_SOURCES ${example_as_test_suite}
 )
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mpi/examples/CMakeLists.txt ns-3.44/src/mpi/examples/CMakeLists.txt
--- ns-3.43/src/mpi/examples/CMakeLists.txt	2024-10-09 16:41:10.060656500 -0700
+++ ns-3.44/src/mpi/examples/CMakeLists.txt	2025-03-09 16:55:49.659372000 -0700
@@ -1,5 +1,3 @@
-link_libraries(${MPI_CXX_LIBRARIES})
-
 set(base_examples
     simple-distributed
     simple-distributed-mpi-comm
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mpi/examples/mpi-test-fixtures.h ns-3.44/src/mpi/examples/mpi-test-fixtures.h
--- ns-3.43/src/mpi/examples/mpi-test-fixtures.h	2024-10-09 16:41:10.060656500 -0700
+++ ns-3.44/src/mpi/examples/mpi-test-fixtures.h	2025-03-09 16:55:49.659372000 -0700
@@ -14,8 +14,8 @@
 #include <sstream>
 
 /**
- * \file
- * \ingroup mpi
+ * @file
+ * @ingroup mpi
  *
  * Common methods for MPI examples.
  *
@@ -39,12 +39,12 @@
 class Packet;
 
 /**
- * \ingroup mpi
+ * @ingroup mpi
  *
  * Write to std::cout only from rank 0.
  * Number line for sorting output of parallel runs.
  *
- * \param x The output operators.
+ * @param x The output operators.
  */
 #define RANK0COUT(x)                                                                               \
     do                                                                                             \
@@ -59,12 +59,12 @@
     while (false)
 
 /**
- * \ingroup mpi
+ * @ingroup mpi
  *
  * Append to std::cout only from rank 0.
  * Number line for sorting output of parallel runs.
  *
- * \param x The output operators.
+ * @param x The output operators.
  */
 #define RANK0COUTAPPEND(x)                                                                         \
     do                                                                                             \
@@ -75,7 +75,7 @@
     while (false)
 
 /**
- * \ingroup mpi
+ * @ingroup mpi
  *
  * Collects data about incoming packets.
  */
@@ -89,7 +89,7 @@
 
     /**
      * PacketSink receive trace callback.
-     * \copydetails ns3::Packet::TwoAddressTracedCallback
+     * @copydetails ns3::Packet::TwoAddressTracedCallback
      */
     static void SinkTrace(const ns3::Ptr<const ns3::Packet> packet,
                           const ns3::Address& srcAddress,
@@ -99,22 +99,22 @@
      * Verify the sink trace count observed matches the expected count.
      * Prints message to std::cout indicating success or fail.
      *
-     * \param expectedCount Expected number of packet received.
+     * @param expectedCount Expected number of packet received.
      */
     static void Verify(unsigned long expectedCount);
 
     /**
      * Get the source address and port, as a formatted string.
      *
-     * \param [in] address The ns3::Address.
-     * \return A string with the formatted address and port number.
+     * @param [in] address The ns3::Address.
+     * @return A string with the formatted address and port number.
      */
     static std::string FormatAddress(const ns3::Address address);
 
     /**
      * Get the MPI rank in the world communicator.
      *
-     * \return MPI world rank.
+     * @return MPI world rank.
      */
     static int GetWorldRank()
     {
@@ -124,7 +124,7 @@
     /**
      * Get the MPI size of the world communicator.
      *
-     * \return MPI world size.
+     * @return MPI world size.
      */
     static int GetWorldSize()
     {
@@ -133,7 +133,7 @@
 
     /**
      * Get current line count and increment it.
-     * \return the line count.
+     * @return the line count.
      */
     static int GetLineCount()
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mpi/examples/nms-p2p-nix-distributed.cc ns-3.44/src/mpi/examples/nms-p2p-nix-distributed.cc
--- ns-3.43/src/mpi/examples/nms-p2p-nix-distributed.cc	2024-10-09 16:41:10.060656500 -0700
+++ ns-3.44/src/mpi/examples/nms-p2p-nix-distributed.cc	2025-03-09 16:55:49.659372000 -0700
@@ -5,8 +5,8 @@
  */
 
 /**
- * \file
- * \ingroup mpi
+ * @file
+ * @ingroup mpi
  *
  * DARPA NMS Campus Network Model
  *
@@ -432,7 +432,7 @@
             PacketSinkHelper sinkHelper("ns3::UdpSocketFactory",
                                         InetSocketAddress(Ipv4Address::GetAny(), 9999));
             ApplicationContainer sinkApp = sinkHelper.Install(nodes_net1[0][2].Get(0));
-            sinkApp.Start(Seconds(0.0));
+            sinkApp.Start(Seconds(0));
             if (testing)
             {
                 sinkApp.Get(0)->TraceConnectWithoutContext("RxWithAddresses",
@@ -453,7 +453,7 @@
             PacketSinkHelper sinkHelper("ns3::UdpSocketFactory",
                                         InetSocketAddress(Ipv4Address::GetAny(), 9999));
             ApplicationContainer sinkApp = sinkHelper.Install(nodes_net1[1][0].Get(0));
-            sinkApp.Start(Seconds(0.0));
+            sinkApp.Start(Seconds(0));
             if (testing)
             {
                 sinkApp.Get(0)->TraceConnectWithoutContext("RxWithAddresses",
@@ -500,7 +500,7 @@
                         ApplicationContainer sinkApp =
                             sinkHelper.Install(nodes_net2LAN[z][i][j].Get(0));
 
-                        sinkApp.Start(Seconds(0.0));
+                        sinkApp.Start(Seconds(0));
                         if (testing)
                         {
                             sinkApp.Get(0)->TraceConnectWithoutContext(
@@ -516,7 +516,7 @@
                         ApplicationContainer sinkApp =
                             sinkHelper.Install(nodes_net2LAN[z][i][j].Get(0));
 
-                        sinkApp.Start(Seconds(0.0));
+                        sinkApp.Start(Seconds(0));
                         if (testing)
                         {
                             sinkApp.Get(0)->TraceConnectWithoutContext(
@@ -569,7 +569,7 @@
 
                         ApplicationContainer sinkApp =
                             sinkHelper.Install(nodes_net3LAN[z][i][j].Get(0));
-                        sinkApp.Start(Seconds(0.0));
+                        sinkApp.Start(Seconds(0));
                         if (testing)
                         {
                             sinkApp.Get(0)->TraceConnectWithoutContext(
@@ -585,7 +585,7 @@
                         ApplicationContainer sinkApp =
                             sinkHelper.Install(nodes_net3LAN[z][i][j].Get(0));
 
-                        sinkApp.Start(Seconds(0.0));
+                        sinkApp.Start(Seconds(0));
                         if (testing)
                         {
                             sinkApp.Get(0)->TraceConnectWithoutContext(
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mpi/examples/simple-distributed.cc ns-3.44/src/mpi/examples/simple-distributed.cc
--- ns-3.43/src/mpi/examples/simple-distributed.cc	2024-10-09 16:41:10.060656500 -0700
+++ ns-3.44/src/mpi/examples/simple-distributed.cc	2025-03-09 16:55:49.659372000 -0700
@@ -3,8 +3,8 @@
  */
 
 /**
- * \file
- * \ingroup mpi
+ * @file
+ * @ingroup mpi
  *
  * TestDistributed creates a dumbbell topology and logically splits it in
  * half.  The left half is placed on logical processor 0 and the right half
@@ -247,7 +247,7 @@
                                                            MakeCallback(&SinkTracer::SinkTrace));
             }
         }
-        sinkApp.Start(Seconds(1.0));
+        sinkApp.Start(Seconds(1));
         sinkApp.Stop(Seconds(5));
     }
 
@@ -266,7 +266,7 @@
             clientHelper.SetAttribute("Remote", remoteAddress);
             clientApps.Add(clientHelper.Install(leftLeafNodes.Get(i)));
         }
-        clientApps.Start(Seconds(1.0));
+        clientApps.Start(Seconds(1));
         clientApps.Stop(Seconds(5));
     }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mpi/examples/simple-distributed-empty-node.cc ns-3.44/src/mpi/examples/simple-distributed-empty-node.cc
--- ns-3.43/src/mpi/examples/simple-distributed-empty-node.cc	2024-10-09 16:41:10.060656500 -0700
+++ ns-3.44/src/mpi/examples/simple-distributed-empty-node.cc	2025-03-09 16:55:49.659372000 -0700
@@ -7,8 +7,8 @@
  */
 
 /**
- * \file
- * \ingroup mpi
+ * @file
+ * @ingroup mpi
  *
  * This test is equivalent to simple-distributed but tests boundary cases
  * when one of the ranks has no Nodes on it.   When run on two tasks
@@ -273,7 +273,7 @@
                                                            MakeCallback(&SinkTracer::SinkTrace));
             }
         }
-        sinkApp.Start(Seconds(1.0));
+        sinkApp.Start(Seconds(1));
         sinkApp.Stop(Seconds(5));
     }
 
@@ -292,7 +292,7 @@
             clientHelper.SetAttribute("Remote", remoteAddress);
             clientApps.Add(clientHelper.Install(leftLeafNodes.Get(i)));
         }
-        clientApps.Start(Seconds(1.0));
+        clientApps.Start(Seconds(1));
         clientApps.Stop(Seconds(5));
     }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mpi/examples/simple-distributed-mpi-comm.cc ns-3.44/src/mpi/examples/simple-distributed-mpi-comm.cc
--- ns-3.43/src/mpi/examples/simple-distributed-mpi-comm.cc	2024-10-09 16:41:10.060656500 -0700
+++ ns-3.44/src/mpi/examples/simple-distributed-mpi-comm.cc	2025-03-09 16:55:49.659372000 -0700
@@ -7,8 +7,8 @@
  */
 
 /**
- * \file
- * \ingroup mpi
+ * @file
+ * @ingroup mpi
  *
  * This test is equivalent to simple-distributed with the addition of
  * initialization of MPI by user code (this script) and providing
@@ -78,8 +78,8 @@
 /**
  * Report my rank, in both MPI_COMM_WORLD and the split communicator.
  *
- * \param [in] color My role, either ns-3 rank or other rank.
- * \param [in] splitComm The split communicator.
+ * @param [in] color My role, either ns-3 rank or other rank.
+ * @param [in] splitComm The split communicator.
  */
 void
 ReportRank(int color, MPI_Comm splitComm)
@@ -459,7 +459,7 @@
             }
             sinkApp.Add(apps);
         }
-        sinkApp.Start(Seconds(1.0));
+        sinkApp.Start(Seconds(1));
         sinkApp.Stop(Seconds(5));
     }
 
@@ -478,7 +478,7 @@
             clientHelper.SetAttribute("Remote", remoteAddress);
             clientApps.Add(clientHelper.Install(leftLeafNodes.Get(i)));
         }
-        clientApps.Start(Seconds(1.0));
+        clientApps.Start(Seconds(1));
         clientApps.Stop(Seconds(5));
     }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mpi/examples/third-distributed.cc ns-3.44/src/mpi/examples/third-distributed.cc
--- ns-3.43/src/mpi/examples/third-distributed.cc	2024-10-09 16:41:10.060656500 -0700
+++ ns-3.44/src/mpi/examples/third-distributed.cc	2025-03-09 16:55:49.659372000 -0700
@@ -18,8 +18,8 @@
 #include <iomanip>
 
 /**
- * \file
- * \ingroup mpi
+ * @file
+ * @ingroup mpi
  *
  * Distributed version of third.cc from the tutorial.
  *
@@ -218,8 +218,8 @@
         UdpEchoServerHelper echoServer(9);
 
         ApplicationContainer serverApps = echoServer.Install(csmaNodes.Get(nCsma));
-        serverApps.Start(Seconds(1.0));
-        serverApps.Stop(Seconds(10.0));
+        serverApps.Start(Seconds(1));
+        serverApps.Stop(Seconds(10));
 
         if (testing)
         {
@@ -235,12 +235,12 @@
     {
         UdpEchoClientHelper echoClient(csmaInterfaces.GetAddress(nCsma), 9);
         echoClient.SetAttribute("MaxPackets", UintegerValue(1));
-        echoClient.SetAttribute("Interval", TimeValue(Seconds(1.0)));
+        echoClient.SetAttribute("Interval", TimeValue(Seconds(1)));
         echoClient.SetAttribute("PacketSize", UintegerValue(1024));
 
         ApplicationContainer clientApps = echoClient.Install(wifiStaNodes.Get(nWifi - 1));
-        clientApps.Start(Seconds(2.0));
-        clientApps.Stop(Seconds(10.0));
+        clientApps.Start(Seconds(2));
+        clientApps.Stop(Seconds(10));
 
         if (testing)
         {
@@ -251,7 +251,7 @@
 
     Ipv4GlobalRoutingHelper::PopulateRoutingTables();
 
-    Simulator::Stop(Seconds(10.0));
+    Simulator::Stop(Seconds(10));
 
     if (tracing)
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mpi/model/distributed-simulator-impl.cc ns-3.44/src/mpi/model/distributed-simulator-impl.cc
--- ns-3.43/src/mpi/model/distributed-simulator-impl.cc	2024-10-09 16:41:10.060656500 -0700
+++ ns-3.44/src/mpi/model/distributed-simulator-impl.cc	2025-03-09 16:55:49.659372000 -0700
@@ -6,8 +6,8 @@
  */
 
 /**
- * \file
- * \ingroup mpi
+ * @file
+ * @ingroup mpi
  *  Implementation of classes  ns3::LbtsMessage and ns3::DistributedSimulatorImpl.
  */
 
@@ -262,7 +262,7 @@
 void
 DistributedSimulatorImpl::BoundLookAhead(const Time lookAhead)
 {
-    if (lookAhead > Time(0))
+    if (lookAhead.IsStrictlyPositive())
     {
         NS_LOG_FUNCTION(this << lookAhead);
         m_lookAhead = Min(m_lookAhead, lookAhead);
@@ -605,7 +605,7 @@
 Time
 DistributedSimulatorImpl::GetMaximumSimulationTime() const
 {
-    /// \todo I am fairly certain other compilers use other non-standard
+    /// @todo I am fairly certain other compilers use other non-standard
     /// post-fixes to indicate 64 bit constants.
     return TimeStep(0x7fffffffffffffffLL);
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mpi/model/distributed-simulator-impl.h ns-3.44/src/mpi/model/distributed-simulator-impl.h
--- ns-3.43/src/mpi/model/distributed-simulator-impl.h	2024-10-09 16:41:10.060656500 -0700
+++ ns-3.44/src/mpi/model/distributed-simulator-impl.h	2025-03-09 16:55:49.659372000 -0700
@@ -6,8 +6,8 @@
  */
 
 /**
- * \file
- * \ingroup mpi
+ * @file
+ * @ingroup mpi
  *  Declaration of classes  ns3::LbtsMessage and ns3::DistributedSimulatorImpl.
  */
 
@@ -25,9 +25,9 @@
 {
 
 /**
- * \ingroup mpi
+ * @ingroup mpi
  *
- * \brief Structure used for all-reduce LBTS computation
+ * @brief Structure used for all-reduce LBTS computation
  */
 class LbtsMessage
 {
@@ -41,11 +41,11 @@
     }
 
     /**
-     * \param rxc received count
-     * \param txc transmitted count
-     * \param id mpi rank
-     * \param isFinished whether message is finished
-     * \param t smallest time
+     * @param rxc received count
+     * @param txc transmitted count
+     * @param id mpi rank
+     * @param isFinished whether message is finished
+     * @param t smallest time
      */
     LbtsMessage(uint32_t rxc, uint32_t txc, uint32_t id, bool isFinished, const Time& t)
         : m_txCount(txc),
@@ -59,23 +59,23 @@
     ~LbtsMessage();
 
     /**
-     * \return smallest time
+     * @return smallest time
      */
     Time GetSmallestTime();
     /**
-     * \return transmitted count
+     * @return transmitted count
      */
     uint32_t GetTxCount() const;
     /**
-     * \return received count
+     * @return received count
      */
     uint32_t GetRxCount() const;
     /**
-     * \return id which corresponds to mpi rank
+     * @return id which corresponds to mpi rank
      */
     uint32_t GetMyId() const;
     /**
-     * \return true if system is finished
+     * @return true if system is finished
      */
     bool IsFinished() const;
 
@@ -88,17 +88,17 @@
 };
 
 /**
- * \ingroup simulator
- * \ingroup mpi
+ * @ingroup simulator
+ * @ingroup mpi
  *
- * \brief Distributed simulator implementation using lookahead
+ * @brief Distributed simulator implementation using lookahead
  */
 class DistributedSimulatorImpl : public SimulatorImpl
 {
   public:
     /**
      *  Register this type.
-     *  \return The object TypeId.
+     *  @return The object TypeId.
      */
     static TypeId GetTypeId();
 
@@ -139,7 +139,7 @@
      * The method may be invoked more than once, the minimum time will
      * be used to constrain lookahead.
      *
-     * \param [in] lookAhead The maximum lookahead; must be > 0.
+     * @param [in] lookAhead The maximum lookahead; must be > 0.
      */
     virtual void BoundLookAhead(const Time lookAhead);
 
@@ -160,7 +160,7 @@
      * Check if this rank is finished.  It's finished when there are
      * no more events or stop has been requested.
      *
-     * \returns \c true when this rank is finished.
+     * @returns \c true when this rank is finished.
      */
     bool IsLocalFinished() const;
 
@@ -171,13 +171,13 @@
      *
      * If there are no more events the timestep is infinity.
      *
-     * \return The next event timestep.
+     * @return The next event timestep.
      */
     uint64_t NextTs() const;
     /**
      * Get the time of the next event, as returned by NextTs().
      *
-     * \return The next event time stamp.
+     * @return The next event time stamp.
      */
     Time Next() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mpi/model/granted-time-window-mpi-interface.cc ns-3.44/src/mpi/model/granted-time-window-mpi-interface.cc
--- ns-3.43/src/mpi/model/granted-time-window-mpi-interface.cc	2024-10-09 16:41:10.060656500 -0700
+++ ns-3.44/src/mpi/model/granted-time-window-mpi-interface.cc	2025-03-09 16:55:49.659372000 -0700
@@ -5,8 +5,8 @@
  */
 
 /**
- * \file
- * \ingroup mpi
+ * @file
+ * @ingroup mpi
  * Implementation of classes ns3::SentBuffer and ns3::GrantedTimeWindowMpiInterface.
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mpi/model/granted-time-window-mpi-interface.h ns-3.44/src/mpi/model/granted-time-window-mpi-interface.h
--- ns-3.43/src/mpi/model/granted-time-window-mpi-interface.h	2024-10-09 16:41:10.060656500 -0700
+++ ns-3.44/src/mpi/model/granted-time-window-mpi-interface.h	2025-03-09 16:55:49.659372000 -0700
@@ -5,8 +5,8 @@
  */
 
 /**
- * \file
- * \ingroup mpi
+ * @file
+ * @ingroup mpi
  * Declaration of classes ns3::SentBuffer and ns3::GrantedTimeWindowMpiInterface.
  */
 
@@ -35,9 +35,9 @@
 const uint32_t MAX_MPI_MSG_SIZE = 2000;
 
 /**
- * \ingroup mpi
+ * @ingroup mpi
  *
- * \brief Tracks non-blocking sends
+ * @brief Tracks non-blocking sends
  *
  * This class is used to keep track of the asynchronous non-blocking
  * sends that have been posted.
@@ -49,15 +49,15 @@
     ~SentBuffer();
 
     /**
-     * \return pointer to sent buffer
+     * @return pointer to sent buffer
      */
     uint8_t* GetBuffer();
     /**
-     * \param buffer pointer to sent buffer
+     * @param buffer pointer to sent buffer
      */
     void SetBuffer(uint8_t* buffer);
     /**
-     * \return MPI request
+     * @return MPI request
      */
     MPI_Request* GetRequest();
 
@@ -70,9 +70,9 @@
 class DistributedSimulatorImpl;
 
 /**
- * \ingroup mpi
+ * @ingroup mpi
  *
- * \brief Interface between ns-3 and MPI
+ * @brief Interface between ns-3 and MPI
  *
  * Implements the interface used by the singleton parallel controller
  * to interface between NS3 and the communications layer being
@@ -83,7 +83,7 @@
   public:
     /**
      * Register this type.
-     * \return The object TypeId.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
@@ -116,11 +116,11 @@
      */
     static void TestSendComplete();
     /**
-     * \return received count in packets
+     * @return received count in packets
      */
     static uint32_t GetRxCount();
     /**
-     * \return transmitted count in packets
+     * @return transmitted count in packets
      */
     static uint32_t GetTxCount();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mpi/model/mpi-interface.cc ns-3.44/src/mpi/model/mpi-interface.cc
--- ns-3.43/src/mpi/model/mpi-interface.cc	2024-10-09 16:41:10.060656500 -0700
+++ ns-3.44/src/mpi/model/mpi-interface.cc	2025-03-09 16:55:49.659372000 -0700
@@ -7,8 +7,8 @@
  */
 
 /**
- * \file
- * \ingroup mpi
+ * @file
+ * @ingroup mpi
  * Implementation of class ns3::MpiInterface.
  */
 
@@ -17,9 +17,9 @@
 #include "granted-time-window-mpi-interface.h"
 #include "null-message-mpi-interface.h"
 
-#include <ns3/global-value.h>
-#include <ns3/log.h>
-#include <ns3/string.h>
+#include "ns3/global-value.h"
+#include "ns3/log.h"
+#include "ns3/string.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mpi/model/mpi-interface.h ns-3.44/src/mpi/model/mpi-interface.h
--- ns-3.43/src/mpi/model/mpi-interface.h	2024-10-09 16:41:10.060656500 -0700
+++ ns-3.44/src/mpi/model/mpi-interface.h	2025-03-09 16:55:49.659372000 -0700
@@ -7,37 +7,37 @@
  */
 
 /**
- * \file
- * \ingroup mpi
+ * @file
+ * @ingroup mpi
  * Declaration of class ns3::MpiInterface.
  */
 
 #ifndef NS3_MPI_INTERFACE_H
 #define NS3_MPI_INTERFACE_H
 
-#include <ns3/nstime.h>
-#include <ns3/packet.h>
+#include "ns3/nstime.h"
+#include "ns3/packet.h"
 
 #include <mpi.h>
 
 namespace ns3
 {
 /**
- * \defgroup mpi MPI Distributed Simulation
+ * @defgroup mpi MPI Distributed Simulation
  */
 
 /**
- * \ingroup mpi
- * \ingroup tests
- * \defgroup mpi-tests MPI Distributed Simulation tests
+ * @ingroup mpi
+ * @ingroup tests
+ * @defgroup mpi-tests MPI Distributed Simulation tests
  */
 
 class ParallelCommunicationInterface;
 
 /**
- * \ingroup mpi
+ * @ingroup mpi
  *
- * \brief Singleton used to interface to the communications infrastructure
+ * @brief Singleton used to interface to the communications infrastructure
  * when running NS3 in parallel.
  *
  * Delegates the implementation to the specific parallel
@@ -52,35 +52,35 @@
 {
   public:
     /**
-     * \brief Deletes storage used by the parallel environment.
+     * @brief Deletes storage used by the parallel environment.
      */
     static void Destroy();
     /**
-     * \brief Get the id number of this rank.
+     * @brief Get the id number of this rank.
      *
      * When running a sequential simulation this will return a systemID of 0.
      *
-     * \return system identification
+     * @return system identification
      */
     static uint32_t GetSystemId();
     /**
-     * \brief Get the number of ranks used by ns-3.
+     * @brief Get the number of ranks used by ns-3.
      *
      * Returns the size (number of MPI ranks) of the communicator used by
      * ns-3.  When running a sequential simulation this will return a
      * size of 1.
      *
-     * \return number of parallel tasks
+     * @return number of parallel tasks
      */
     static uint32_t GetSize();
     /**
-     * \brief Returns enabled state of parallel environment.
+     * @brief Returns enabled state of parallel environment.
      *
-     * \return true if parallel communication is enabled
+     * @return true if parallel communication is enabled
      */
     static bool IsEnabled();
     /**
-     * \brief Setup the parallel communication interface.
+     * @brief Setup the parallel communication interface.
      *
      * There are two ways to setup the communications interface.  This
      * Enable method is the easiest method and should be used in most
@@ -99,48 +99,48 @@
      * parallel simulators and the goal is to run each simulator on a
      * different set of ranks.
      *
-     * \note The `SimulatorImplementationType attribute in
+     * @note The `SimulatorImplementationType attribute in
      * ns3::GlobalValues must be set before calling Enable()
      *
-     * \param pargc number of command line arguments
-     * \param pargv command line arguments
+     * @param pargc number of command line arguments
+     * @param pargv command line arguments
      */
     static void Enable(int* pargc, char*** pargv);
     /**
-     * \brief Setup the parallel communication interface using the specified communicator.
+     * @brief Setup the parallel communication interface using the specified communicator.
      *
      * See @ref Enable (int* pargc, char*** pargv) for additional information.
      *
-     * \param communicator MPI Communicator that should be used by ns-3
+     * @param communicator MPI Communicator that should be used by ns-3
      */
     static void Enable(MPI_Comm communicator);
     /**
-     * \brief Clean up the ns-3 parallel communications interface.
+     * @brief Clean up the ns-3 parallel communications interface.
      *
      * MPI_Finalize will be called only if Enable (int* pargc, char***
      * pargv) was called.
      */
     static void Disable();
     /**
-     * \brief Send a packet to a remote node.
+     * @brief Send a packet to a remote node.
      *
-     * \param p packet to send
-     * \param rxTime received time at destination node
-     * \param node destination node
-     * \param dev destination device
+     * @param p packet to send
+     * @param rxTime received time at destination node
+     * @param node destination node
+     * @param dev destination device
      *
      * Serialize and send a packet to the specified node and net device
      */
     static void SendPacket(Ptr<Packet> p, const Time& rxTime, uint32_t node, uint32_t dev);
 
     /**
-     * \brief Return the communicator used to run ns-3.
+     * @brief Return the communicator used to run ns-3.
      *
      * The communicator returned will be MPI_COMM_WORLD if Enable (int*
      * pargc, char*** pargv) is used to enable or the user specified
      * communicator if Enable (MPI_Comm communicator) is used.
      *
-     * \return The MPI Communicator.
+     * @return The MPI Communicator.
      */
     static MPI_Comm GetCommunicator();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mpi/model/mpi-receiver.cc ns-3.44/src/mpi/model/mpi-receiver.cc
--- ns-3.43/src/mpi/model/mpi-receiver.cc	2024-10-09 16:41:10.060656500 -0700
+++ ns-3.44/src/mpi/model/mpi-receiver.cc	2025-03-09 16:55:49.659372000 -0700
@@ -5,8 +5,8 @@
  */
 
 /**
- * \file
- * \ingroup mpi
+ * @file
+ * @ingroup mpi
  * ns3::MpiReceiver implementation,
  * provides an interface to aggregate to MPI-compatible NetDevices.
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mpi/model/mpi-receiver.h ns-3.44/src/mpi/model/mpi-receiver.h
--- ns-3.43/src/mpi/model/mpi-receiver.h	2024-10-09 16:41:10.060656500 -0700
+++ ns-3.44/src/mpi/model/mpi-receiver.h	2025-03-09 16:55:49.659372000 -0700
@@ -5,8 +5,8 @@
  */
 
 /**
- * \file
- * \ingroup mpi
+ * @file
+ * @ingroup mpi
  * ns3::MpiReceiver declaration,
  * provides an interface to aggregate to MPI-compatible NetDevices.
  */
@@ -21,9 +21,9 @@
 {
 
 /**
- * \ingroup mpi
+ * @ingroup mpi
  *
- * \brief Class to aggregate to a NetDevice if it supports MPI capability
+ * @brief Class to aggregate to a NetDevice if it supports MPI capability
  *
  * MpiInterface::ReceiveMessages () needs to send packets to a NetDevice
  * Receive() method.  Since each NetDevice's Receive() method is specific
@@ -38,19 +38,19 @@
   public:
     /**
      * Register this type.
-     * \return The object TypeId.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
     ~MpiReceiver() override;
 
     /**
-     * \brief Direct an incoming packet to the device Receive() method
-     * \param p Packet to receive
+     * @brief Direct an incoming packet to the device Receive() method
+     * @param p Packet to receive
      */
     void Receive(Ptr<Packet> p);
     /**
-     * \brief Set the receive callback to get packets to net devices
-     * \param callback the callback itself
+     * @brief Set the receive callback to get packets to net devices
+     * @param callback the callback itself
      */
     void SetReceiveCallback(Callback<void, Ptr<Packet>> callback);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mpi/model/null-message-mpi-interface.cc ns-3.44/src/mpi/model/null-message-mpi-interface.cc
--- ns-3.43/src/mpi/model/null-message-mpi-interface.cc	2024-10-09 16:41:10.060656500 -0700
+++ ns-3.44/src/mpi/model/null-message-mpi-interface.cc	2025-03-09 16:55:49.659372000 -0700
@@ -8,8 +8,8 @@
  */
 
 /**
- * \file
- * \ingroup mpi
+ * @file
+ * @ingroup mpi
  * Implementation of classes ns3::NullMessageSentBuffer and ns3::NullMessageMpiInterface.
  */
 
@@ -40,9 +40,9 @@
 NS_OBJECT_ENSURE_REGISTERED(NullMessageMpiInterface);
 
 /**
- * \ingroup mpi
+ * @ingroup mpi
  *
- * \brief Non-blocking send buffers for Null Message implementation.
+ * @brief Non-blocking send buffers for Null Message implementation.
  *
  * One buffer is allocated for each non-blocking send.
  */
@@ -53,15 +53,15 @@
     ~NullMessageSentBuffer();
 
     /**
-     * \return pointer to sent buffer
+     * @return pointer to sent buffer
      */
     uint8_t* GetBuffer();
     /**
-     * \param buffer pointer to sent buffer
+     * @param buffer pointer to sent buffer
      */
     void SetBuffer(uint8_t* buffer);
     /**
-     * \return MPI request
+     * @return MPI request
      */
     MPI_Request* GetRequest();
 
@@ -393,7 +393,7 @@
             Time rxTime(time);
 
             // rxtime == 0 means this is a Null Message
-            if (rxTime > Time(0))
+            if (rxTime.IsStrictlyPositive())
             {
                 count -= sizeof(time) + sizeof(guaranteeUpdate) + sizeof(node) + sizeof(dev);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mpi/model/null-message-mpi-interface.h ns-3.44/src/mpi/model/null-message-mpi-interface.h
--- ns-3.43/src/mpi/model/null-message-mpi-interface.h	2024-10-09 16:41:10.060656500 -0700
+++ ns-3.44/src/mpi/model/null-message-mpi-interface.h	2025-03-09 16:55:49.659372000 -0700
@@ -7,8 +7,8 @@
  */
 
 /**
- * \file
- * \ingroup mpi
+ * @file
+ * @ingroup mpi
  * Declaration of classes ns3::NullMessageSentBuffer and ns3::NullMessageMpiInterface.
  */
 
@@ -17,8 +17,8 @@
 
 #include "parallel-communication-interface.h"
 
-#include <ns3/buffer.h>
-#include <ns3/nstime.h>
+#include "ns3/buffer.h"
+#include "ns3/nstime.h"
 
 #include <list>
 #include <mpi.h>
@@ -32,9 +32,9 @@
 class Packet;
 
 /**
- * \ingroup mpi
+ * @ingroup mpi
  *
- * \brief Interface between ns-3 and MPI for the Null Message
+ * @brief Interface between ns-3 and MPI for the Null Message
  * distributed simulation implementation.
  */
 class NullMessageMpiInterface : public ParallelCommunicationInterface, Object
@@ -42,7 +42,7 @@
   public:
     /**
      * Register this type.
-     * \return The object TypeId.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
@@ -71,19 +71,19 @@
     friend ns3::NullMessageSimulatorImpl;
 
     /**
-     * \brief Send a Null Message to across the specified bundle.
+     * @brief Send a Null Message to across the specified bundle.
      *
      * Null Messages are sent when a packet has not been sent across
      * this bundle in order to allow time advancement on the remote
      * MPI task.
      *
-     * \param [in] guaranteeUpdate Lower bound time on the next
+     * @param [in] guaranteeUpdate Lower bound time on the next
      * possible event from this MPI task to the remote MPI task across
      * the bundle.  Remote task may execute events up to this time.
      *
-     * \param [in] bundle The bundle of links between two ranks.
+     * @param [in] bundle The bundle of links between two ranks.
      *
-     * \internal The Null Message MPI buffer format uses the same packet
+     * @internal The Null Message MPI buffer format uses the same packet
      * metadata format as sending a normal packet with the time,
      * destination node, and destination device set to zero.  Using the
      * same packet metadata simplifies receive logic.
@@ -105,7 +105,7 @@
     static void TestSendComplete();
 
     /**
-     * \brief Initialize send and receive buffers.
+     * @brief Initialize send and receive buffers.
      *
      * This method should be called after all links have been added to the RemoteChannelBundle
      * manager to setup any required send and receive buffers.
@@ -119,7 +119,7 @@
      * only check for received messages complete, and return
      * all messages that are queued up locally.
      *
-     * \param [in] blocking Whether this call should block.
+     * @param [in] blocking Whether this call should block.
      */
     static void ReceiveMessages(bool blocking = false);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mpi/model/null-message-simulator-impl.cc ns-3.44/src/mpi/model/null-message-simulator-impl.cc
--- ns-3.43/src/mpi/model/null-message-simulator-impl.cc	2024-10-09 16:41:10.060656500 -0700
+++ ns-3.44/src/mpi/model/null-message-simulator-impl.cc	2025-03-09 16:55:49.659372000 -0700
@@ -7,8 +7,8 @@
  */
 
 /**
- * \file
- * \ingroup mpi
+ * @file
+ * @ingroup mpi
  * Implementation of class ns3::NullMessageSimulatorImpl.
  */
 
@@ -19,16 +19,16 @@
 #include "remote-channel-bundle-manager.h"
 #include "remote-channel-bundle.h"
 
-#include <ns3/assert.h>
-#include <ns3/channel.h>
-#include <ns3/double.h>
-#include <ns3/event-impl.h>
-#include <ns3/log.h>
-#include <ns3/node-container.h>
-#include <ns3/pointer.h>
-#include <ns3/ptr.h>
-#include <ns3/scheduler.h>
-#include <ns3/simulator.h>
+#include "ns3/assert.h"
+#include "ns3/channel.h"
+#include "ns3/double.h"
+#include "ns3/event-impl.h"
+#include "ns3/log.h"
+#include "ns3/node-container.h"
+#include "ns3/pointer.h"
+#include "ns3/ptr.h"
+#include "ns3/scheduler.h"
+#include "ns3/simulator.h"
 
 #include <cmath>
 #include <fstream>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mpi/model/null-message-simulator-impl.h ns-3.44/src/mpi/model/null-message-simulator-impl.h
--- ns-3.43/src/mpi/model/null-message-simulator-impl.h	2024-10-09 16:41:10.060656500 -0700
+++ ns-3.44/src/mpi/model/null-message-simulator-impl.h	2025-03-09 16:55:49.659372000 -0700
@@ -7,18 +7,18 @@
  */
 
 /**
- * \file
- * \ingroup mpi
+ * @file
+ * @ingroup mpi
  * Declaration of class ns3::NullMessageSimulatorImpl.
  */
 
 #ifndef NULLMESSAGE_SIMULATOR_IMPL_H
 #define NULLMESSAGE_SIMULATOR_IMPL_H
 
-#include <ns3/event-impl.h>
-#include <ns3/ptr.h>
-#include <ns3/scheduler.h>
-#include <ns3/simulator-impl.h>
+#include "ns3/event-impl.h"
+#include "ns3/ptr.h"
+#include "ns3/scheduler.h"
+#include "ns3/simulator-impl.h"
 
 #include <fstream>
 #include <iostream>
@@ -32,16 +32,16 @@
 class RemoteChannelBundle;
 
 /**
- * \ingroup mpi
+ * @ingroup mpi
  *
- * \brief Simulator implementation using MPI and a Null Message algorithm.
+ * @brief Simulator implementation using MPI and a Null Message algorithm.
  */
 class NullMessageSimulatorImpl : public SimulatorImpl
 {
   public:
     /**
      *  Register this type.
-     *  \return The object TypeId.
+     *  @return The object TypeId.
      */
     static TypeId GetTypeId();
 
@@ -74,7 +74,7 @@
     uint64_t GetEventCount() const override;
 
     /**
-     * \return singleton instance
+     * @return singleton instance
      *
      * Singleton accessor.
      */
@@ -109,7 +109,7 @@
     void ProcessOneEvent();
 
     /**
-     * \return next local event time.
+     * @return next local event time.
      */
     Time Next() const;
 
@@ -122,19 +122,19 @@
      * Get the current SafeTime; the maximum time that events can
      * be processed based on information received from neighboring
      * MPI tasks.
-     * \return the current SafeTime
+     * @return the current SafeTime
      */
     Time GetSafeTime();
 
     /**
-     * \param bundle Bundle to schedule Null Message event for
+     * @param bundle Bundle to schedule Null Message event for
      *
      * Schedule Null Message event for the specified RemoteChannelBundle.
      */
     void ScheduleNullMessageEvent(Ptr<RemoteChannelBundle> bundle);
 
     /**
-     * \param bundle Bundle to reschedule Null Message event for
+     * @param bundle Bundle to reschedule Null Message event for
      *
      * Reschedule Null Message event for the specified
      * RemoteChannelBundle.  Existing event will be canceled.
@@ -142,7 +142,7 @@
     void RescheduleNullMessageEvent(Ptr<RemoteChannelBundle> bundle);
 
     /**
-     * \param nodeSysId SystemID to reschedule null event for
+     * @param nodeSysId SystemID to reschedule null event for
      *
      * Reschedule Null Message event for the RemoteChannelBundle to the
      * task nodeSysId.  Existing event will be canceled.
@@ -150,9 +150,9 @@
     void RescheduleNullMessageEvent(uint32_t nodeSysId);
 
     /**
-     * \param systemId SystemID to compute guarantee time for
+     * @param systemId SystemID to compute guarantee time for
      *
-     * \return Guarantee time
+     * @return Guarantee time
      *
      * Calculate the guarantee time for incoming RemoteChannelBundle
      * from task nodeSysId.  No message should arrive from task
@@ -161,7 +161,7 @@
     Time CalculateGuaranteeTime(uint32_t systemId);
 
     /**
-     * \param bundle remote channel bundle to schedule an event for.
+     * @param bundle remote channel bundle to schedule an event for.
      *
      * Null message event handler.   Scheduled to send a null message
      * for the specified bundle at regular intervals.   Will canceled
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mpi/model/parallel-communication-interface.h ns-3.44/src/mpi/model/parallel-communication-interface.h
--- ns-3.43/src/mpi/model/parallel-communication-interface.h	2024-10-09 16:41:10.060656500 -0700
+++ ns-3.44/src/mpi/model/parallel-communication-interface.h	2025-03-09 16:55:49.659372000 -0700
@@ -8,18 +8,18 @@
  */
 
 /**
- * \file
- * \ingroup mpi
+ * @file
+ * @ingroup mpi
  * Declaration of class ns3::ParallelCommunicationInterface.
  */
 
 #ifndef NS3_PARALLEL_COMMUNICATION_INTERFACE_H
 #define NS3_PARALLEL_COMMUNICATION_INTERFACE_H
 
-#include <ns3/buffer.h>
-#include <ns3/nstime.h>
-#include <ns3/object.h>
-#include <ns3/packet.h>
+#include "ns3/buffer.h"
+#include "ns3/nstime.h"
+#include "ns3/object.h"
+#include "ns3/packet.h"
 
 #include <list>
 #include <mpi.h>
@@ -29,9 +29,9 @@
 {
 
 /**
- * \ingroup mpi
+ * @ingroup mpi
  *
- * \brief Pure virtual base class for the interface between ns-3 and
+ * @brief Pure virtual base class for the interface between ns-3 and
  * the parallel communication layer being used.
  *
  * This class is implemented for each of the parallel versions of
@@ -55,39 +55,39 @@
     }
 
     /**
-     * \copydoc MpiInterface::Destroy
+     * @copydoc MpiInterface::Destroy
      */
     virtual void Destroy() = 0;
     /**
-     * \copydoc MpiInterface::GetSystemId
+     * @copydoc MpiInterface::GetSystemId
      */
     virtual uint32_t GetSystemId() = 0;
     /**
-     * \copydoc MpiInterface::GetSize
+     * @copydoc MpiInterface::GetSize
      */
     virtual uint32_t GetSize() = 0;
     /**
-     * \copydoc MpiInterface::IsEnabled
+     * @copydoc MpiInterface::IsEnabled
      */
     virtual bool IsEnabled() = 0;
     /**
-     * \copydoc MpiInterface::Enable(int* pargc,char*** pargv)
+     * @copydoc MpiInterface::Enable(int* pargc,char*** pargv)
      */
     virtual void Enable(int* pargc, char*** pargv) = 0;
     /**
-     * \copydoc MpiInterface::Enable(MPI_Comm communicator)
+     * @copydoc MpiInterface::Enable(MPI_Comm communicator)
      */
     virtual void Enable(MPI_Comm communicator) = 0;
     /**
-     * \copydoc MpiInterface::Disable
+     * @copydoc MpiInterface::Disable
      */
     virtual void Disable() = 0;
     /**
-     * \copydoc MpiInterface::SendPacket
+     * @copydoc MpiInterface::SendPacket
      */
     virtual void SendPacket(Ptr<Packet> p, const Time& rxTime, uint32_t node, uint32_t dev) = 0;
     /**
-     * \copydoc MpiInterface::GetCommunicator
+     * @copydoc MpiInterface::GetCommunicator
      */
     virtual MPI_Comm GetCommunicator() = 0;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mpi/model/remote-channel-bundle.cc ns-3.44/src/mpi/model/remote-channel-bundle.cc
--- ns-3.43/src/mpi/model/remote-channel-bundle.cc	2024-10-09 16:41:10.060656500 -0700
+++ ns-3.44/src/mpi/model/remote-channel-bundle.cc	2025-03-09 16:55:49.659372000 -0700
@@ -8,8 +8,8 @@
  */
 
 /**
- * \file
- * \ingroup mpi
+ * @file
+ * @ingroup mpi
  * Implementation of class ns3::RemoteChannelBundle.
  */
 
@@ -18,7 +18,7 @@
 #include "null-message-mpi-interface.h"
 #include "null-message-simulator-impl.h"
 
-#include <ns3/simulator.h>
+#include "ns3/simulator.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mpi/model/remote-channel-bundle.h ns-3.44/src/mpi/model/remote-channel-bundle.h
--- ns-3.43/src/mpi/model/remote-channel-bundle.h	2024-10-09 16:41:10.060656500 -0700
+++ ns-3.44/src/mpi/model/remote-channel-bundle.h	2025-03-09 16:55:49.659372000 -0700
@@ -8,8 +8,8 @@
  */
 
 /**
- * \file
- * \ingroup mpi
+ * @file
+ * @ingroup mpi
  * Declaration of class ns3::RemoteChannelBundle.
  */
 
@@ -18,9 +18,9 @@
 
 #include "null-message-simulator-impl.h"
 
-#include <ns3/channel.h>
-#include <ns3/pointer.h>
-#include <ns3/ptr.h>
+#include "ns3/channel.h"
+#include "ns3/pointer.h"
+#include "ns3/ptr.h"
 
 #include <unordered_map>
 
@@ -28,9 +28,9 @@
 {
 
 /**
- * \ingroup mpi
+ * @ingroup mpi
  *
- * \brief Collection of ns-3 channels between local and remote nodes.
+ * @brief Collection of ns-3 channels between local and remote nodes.
  *
  * An instance exists for each remote system that the local system is
  * in communication with.  These are created and managed by the
@@ -42,7 +42,7 @@
   public:
     /**
      *  Register this type.
-     *  \return The object TypeId.
+     *  @return The object TypeId.
      */
     static TypeId GetTypeId();
 
@@ -51,7 +51,7 @@
 
     /**
      *  Construct and assign system Id.
-     *  \param [in] remoteSystemId The system id.
+     *  @param [in] remoteSystemId The system id.
      */
     RemoteChannelBundle(const uint32_t remoteSystemId);
 
@@ -62,20 +62,20 @@
 
     /**
      * Add a channel to this bundle.
-     * \param channel to add to the bundle
-     * \param delay time for the channel (usually the latency)
+     * @param channel to add to the bundle
+     * @param delay time for the channel (usually the latency)
      */
     void AddChannel(Ptr<Channel> channel, Time delay);
 
     /**
      * Get the system Id for this side.
-     * \return SystemID for remote side of this bundle
+     * @return SystemID for remote side of this bundle
      */
     uint32_t GetSystemId() const;
 
     /**
      * Get the current guarantee time for this bundle.
-     * \return guarantee time
+     * @return guarantee time
      */
     Time GetGuaranteeTime() const;
 
@@ -83,13 +83,13 @@
      * Set the guarantee time for the bundle.  This should be called
      * after a packet or Null Message received.
      *
-     * \param time The guarantee time.
+     * @param time The guarantee time.
      */
     void SetGuaranteeTime(Time time);
 
     /**
      * Get the minimum delay along any channel in this bundle
-     * \return The minimum delay.
+     * @return The minimum delay.
      */
     Time GetDelay() const;
 
@@ -97,19 +97,19 @@
      * Set the event ID of the Null Message send event currently scheduled
      * for this channel.
      *
-     * \param [in] id The null message event id.
+     * @param [in] id The null message event id.
      */
     void SetEventId(EventId id);
 
     /**
      * Get the event ID of the Null Message send event for this bundle
-     * \return The null message event id.
+     * @return The null message event id.
      */
     EventId GetEventId() const;
 
     /**
      * Get the number of ns-3 channels in this bundle
-     * \return The number of channels.
+     * @return The number of channels.
      */
     std::size_t GetSize() const;
 
@@ -118,16 +118,16 @@
      * Message will be delivered at current simulation time + the time
      * passed in.
      *
-     * \param time The delay from now when the null message should be received.
+     * @param time The delay from now when the null message should be received.
      */
     void Send(Time time);
 
     /**
      * Output for debugging purposes.
      *
-     * \param [in,out] out The stream.
-     * \param [in] bundle The bundle to print.
-     * \return The stream.
+     * @param [in,out] out The stream.
+     * @param [in] bundle The bundle to print.
+     * @return The stream.
      */
     friend std::ostream& operator<<(std::ostream& out, ns3::RemoteChannelBundle& bundle);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mpi/model/remote-channel-bundle-manager.cc ns-3.44/src/mpi/model/remote-channel-bundle-manager.cc
--- ns-3.43/src/mpi/model/remote-channel-bundle-manager.cc	2024-10-09 16:41:10.060656500 -0700
+++ ns-3.44/src/mpi/model/remote-channel-bundle-manager.cc	2025-03-09 16:55:49.659372000 -0700
@@ -8,8 +8,8 @@
  */
 
 /**
- * \file
- * \ingroup mpi
+ * @file
+ * @ingroup mpi
  * Implementation of class ns3::RemoteChannelBundleManager.
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mpi/model/remote-channel-bundle-manager.h ns-3.44/src/mpi/model/remote-channel-bundle-manager.h
--- ns-3.43/src/mpi/model/remote-channel-bundle-manager.h	2024-10-09 16:41:10.060656500 -0700
+++ ns-3.44/src/mpi/model/remote-channel-bundle-manager.h	2025-03-09 16:55:49.659372000 -0700
@@ -8,16 +8,16 @@
  */
 
 /**
- * \file
- * \ingroup mpi
+ * @file
+ * @ingroup mpi
  * Declaration of class ns3::RemoteChannelBundleManager.
  */
 
 #ifndef NS3_REMOTE_CHANNEL_BUNDLE_MANAGER
 #define NS3_REMOTE_CHANNEL_BUNDLE_MANAGER
 
-#include <ns3/nstime.h>
-#include <ns3/ptr.h>
+#include "ns3/nstime.h"
+#include "ns3/ptr.h"
 
 #include <unordered_map>
 
@@ -27,9 +27,9 @@
 class RemoteChannelBundle;
 
 /**
- * \ingroup mpi
+ * @ingroup mpi
  *
- * \brief Singleton for managing the RemoteChannelBundles for each process.
+ * @brief Singleton for managing the RemoteChannelBundles for each process.
  *
  * Manages collective tasks associated with the bundle collection.
  */
@@ -39,8 +39,8 @@
     /**
      * Get the bundle corresponding to a remote rank.
      *
-     * \param [in] systemId The remote system id.
-     * \return The bundle for the specified system id.
+     * @param [in] systemId The remote system id.
+     * @return The bundle for the specified system id.
      */
     static Ptr<RemoteChannelBundle> Find(uint32_t systemId);
 
@@ -49,14 +49,14 @@
      * on other side of the link.
      * Can not be invoked after InitializeNullMessageEvents has been invoked.
      *
-     * \param [in] systemId The remote system id.
-     * \return The newly added bundle.
+     * @param [in] systemId The remote system id.
+     * @return The newly added bundle.
      */
     static Ptr<RemoteChannelBundle> Add(uint32_t systemId);
 
     /**
      * Get the number of ns-3 channels in this bundle
-     * \return The number of channels.
+     * @return The number of channels.
      */
     static std::size_t Size();
 
@@ -68,7 +68,7 @@
 
     /**
      * Get the safe time across all channels in this bundle.
-     * \return The safe time.
+     * @return The safe time.
      */
     static Time GetSafeTime();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/mpi/test/mpi-test-suite.cc ns-3.44/src/mpi/test/mpi-test-suite.cc
--- ns-3.43/src/mpi/test/mpi-test-suite.cc	2024-10-09 16:41:10.060656500 -0700
+++ ns-3.44/src/mpi/test/mpi-test-suite.cc	2025-03-09 16:55:49.659372000 -0700
@@ -13,7 +13,7 @@
 using namespace ns3;
 
 /**
- * \ingroup mpi-tests
+ * @ingroup mpi-tests
  *
  * This version of ns3::ExampleTestCase is specialized for MPI
  * by accepting the number of ranks as a parameter,
@@ -24,9 +24,9 @@
 {
   public:
     /**
-     * \copydoc ns3::ExampleAsTestCase::ExampleAsTestCase
+     * @copydoc ns3::ExampleAsTestCase::ExampleAsTestCase
      *
-     * \param [in] ranks The number of ranks to use
+     * @param [in] ranks The number of ranks to use
      */
     MpiTestCase(const std::string name,
                 const std::string program,
@@ -44,7 +44,7 @@
      * Produce the `--command-template` argument which will invoke
      * `mpiexec` with the requested number of ranks.
      *
-     * \returns The `--command-template` string.
+     * @returns The `--command-template` string.
      */
     std::string GetCommandTemplate() const override;
 
@@ -52,7 +52,7 @@
      * Sort the output from parallel execution.
      * stdout from multiple ranks is not ordered.
      *
-     * \returns Sort command
+     * @returns Sort command
      */
     std::string GetPostProcessingCommand() const override;
 
@@ -88,16 +88,16 @@
 }
 
 /**
- * \ingroup mpi-tests
+ * @ingroup mpi-tests
  * MPI specialization of ns3::ExampleTestSuite.
  */
 class MpiTestSuite : public TestSuite
 {
   public:
     /**
-     * \copydoc MpiTestCase::MpiTestCase
+     * @copydoc MpiTestCase::MpiTestCase
      *
-     * \param [in] duration Amount of time this test takes to execute
+     * @param [in] duration Amount of time this test takes to execute
      *             (defaults to QUICK).
      */
     MpiTestSuite(const std::string name,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/netanim/doc/animation.rst ns-3.44/src/netanim/doc/animation.rst
--- ns-3.43/src/netanim/doc/animation.rst	2024-10-09 16:41:10.060656500 -0700
+++ ns-3.44/src/netanim/doc/animation.rst	2025-03-09 16:55:49.663372000 -0700
@@ -123,7 +123,7 @@
 
 Step 1:Generate the animation XML trace file during simulation using "ns3::AnimationInterface" in the |ns3| code base.
 
-Step 2:Load the XML trace file generated in Step 1 with the offline Qt4-based animator named NetAnim.
+Step 2:Load the XML trace file generated in Step 1 with the offline Qt-based animator named NetAnim.
 
 Step 1: Generate XML animation trace file
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/netanim/examples/colors-link-description.cc ns-3.44/src/netanim/examples/colors-link-description.cc
--- ns-3.43/src/netanim/examples/colors-link-description.cc	2024-10-09 16:41:10.068656400 -0700
+++ ns-3.44/src/netanim/examples/colors-link-description.cc	2025-03-09 16:55:49.671372200 -0700
@@ -136,8 +136,8 @@
         clientApps.Add(clientHelper.Install(d.GetRight(i)));
     }
 
-    clientApps.Start(Seconds(0.0));
-    clientApps.Stop(Seconds(10.0));
+    clientApps.Start(Seconds(0));
+    clientApps.Stop(Seconds(10));
 
     // Set the bounding box for animation
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/netanim/examples/dumbbell-animation.cc ns-3.44/src/netanim/examples/dumbbell-animation.cc
--- ns-3.43/src/netanim/examples/dumbbell-animation.cc	2024-10-09 16:41:10.068656400 -0700
+++ ns-3.44/src/netanim/examples/dumbbell-animation.cc	2025-03-09 16:55:49.671372200 -0700
@@ -78,8 +78,8 @@
         clientApps.Add(clientHelper.Install(d.GetRight(i)));
     }
 
-    clientApps.Start(Seconds(0.0));
-    clientApps.Stop(Seconds(10.0));
+    clientApps.Start(Seconds(0));
+    clientApps.Stop(Seconds(10));
 
     // Set the bounding box for animation
     d.BoundingBox(1, 1, 100, 100);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/netanim/examples/grid-animation.cc ns-3.44/src/netanim/examples/grid-animation.cc
--- ns-3.43/src/netanim/examples/grid-animation.cc	2024-10-09 16:41:10.068656400 -0700
+++ ns-3.44/src/netanim/examples/grid-animation.cc	2025-03-09 16:55:49.671372200 -0700
@@ -62,7 +62,7 @@
     clientHelper.SetAttribute("Remote", remoteAddress);
     clientApps.Add(clientHelper.Install(grid.GetNode(0, 0)));
 
-    clientApps.Start(Seconds(0.0));
+    clientApps.Start(Seconds(0));
     clientApps.Stop(Seconds(1.5));
 
     // Set the bounding box for animation
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/netanim/examples/resources-counters.cc ns-3.44/src/netanim/examples/resources-counters.cc
--- ns-3.43/src/netanim/examples/resources-counters.cc	2024-10-09 16:41:10.068656400 -0700
+++ ns-3.44/src/netanim/examples/resources-counters.cc	2025-03-09 16:55:49.671372200 -0700
@@ -169,8 +169,8 @@
         clientApps.Add(clientHelper.Install(d.GetRight(i)));
     }
 
-    clientApps.Start(Seconds(0.0));
-    clientApps.Stop(Seconds(5.0));
+    clientApps.Start(Seconds(0));
+    clientApps.Stop(Seconds(5));
 
     // Set the bounding box for animation
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/netanim/examples/star-animation.cc ns-3.44/src/netanim/examples/star-animation.cc
--- ns-3.43/src/netanim/examples/star-animation.cc	2024-10-09 16:41:10.068656400 -0700
+++ ns-3.44/src/netanim/examples/star-animation.cc	2025-03-09 16:55:49.671372200 -0700
@@ -89,8 +89,8 @@
     }
     PacketSinkHelper packetSinkHelper("ns3::TcpSocketFactory", hubLocalAddress);
     ApplicationContainer hubApp = packetSinkHelper.Install(star.GetHub());
-    hubApp.Start(Seconds(1.0));
-    hubApp.Stop(Seconds(10.0));
+    hubApp.Start(Seconds(1));
+    hubApp.Stop(Seconds(10));
 
     //
     // Create OnOff applications to send TCP to the hub, one on each spoke node.
@@ -115,8 +115,8 @@
         onOffHelper.SetAttribute("Remote", remoteAddress);
         spokeApps.Add(onOffHelper.Install(star.GetSpokeNode(i)));
     }
-    spokeApps.Start(Seconds(1.0));
-    spokeApps.Stop(Seconds(10.0));
+    spokeApps.Start(Seconds(1));
+    spokeApps.Stop(Seconds(10));
 
     NS_LOG_INFO("Enable static global routing.");
     //
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/netanim/examples/uan-animation.cc ns-3.44/src/netanim/examples/uan-animation.cc
--- ns-3.43/src/netanim/examples/uan-animation.cc	2024-10-09 16:41:10.068656400 -0700
+++ ns-3.44/src/netanim/examples/uan-animation.cc	2025-03-09 16:55:49.671372200 -0700
@@ -7,8 +7,8 @@
  */
 
 /**
- * \file uan-animation.cc
- * \ingroup uan
+ * @file uan-animation.cc
+ * @ingroup uan
  *
  * This example showcases the "CW-MAC" described in System Design Considerations for Undersea
  * Networks article in the IEEE Journal on Selected Areas of Communications 2008 by Nathan Parrish,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/netanim/examples/uan-animation.h ns-3.44/src/netanim/examples/uan-animation.h
--- ns-3.43/src/netanim/examples/uan-animation.h	2024-10-09 16:41:10.068656400 -0700
+++ ns-3.44/src/netanim/examples/uan-animation.h	2025-03-09 16:55:49.671372200 -0700
@@ -15,8 +15,8 @@
 using namespace ns3;
 
 /**
- * \class NetAnimExperiment
- * \brief Helper class for UAN CW MAC example
+ * @class NetAnimExperiment
+ * @brief Helper class for UAN CW MAC example
  *
  */
 class NetAnimExperiment
@@ -24,24 +24,24 @@
   public:
     /**
      * Run function
-     * \param uan the UAN helper
+     * @param uan the UAN helper
      */
     void Run(UanHelper& uan);
     /**
      * Receive packet function
-     * \param socket the socket to receive from
+     * @param socket the socket to receive from
      */
     void ReceivePacket(Ptr<Socket> socket);
     /**
      * Update positions function
-     * \param nodes the collection of nodes
+     * @param nodes the collection of nodes
      */
     void UpdatePositions(NodeContainer& nodes) const;
     /// Reset data function
     void ResetData();
     /**
      * Increment CW function
-     * \param cw the CW
+     * @param cw the CW
      */
     void IncrementCw(uint32_t cw);
     uint32_t m_numNodes;   ///< number of nodes
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/netanim/examples/wireless-animation.cc ns-3.44/src/netanim/examples/wireless-animation.cc
--- ns-3.43/src/netanim/examples/wireless-animation.cc	2024-10-09 16:41:10.068656400 -0700
+++ ns-3.44/src/netanim/examples/wireless-animation.cc	2025-03-09 16:55:49.671372200 -0700
@@ -139,18 +139,18 @@
 
     UdpEchoServerHelper echoServer(9);
     ApplicationContainer serverApps = echoServer.Install(csmaNodes.Get(1));
-    serverApps.Start(Seconds(1.0));
-    serverApps.Stop(Seconds(15.0));
+    serverApps.Start(Seconds(1));
+    serverApps.Stop(Seconds(15));
     UdpEchoClientHelper echoClient(csmaInterfaces.GetAddress(1), 9);
     echoClient.SetAttribute("MaxPackets", UintegerValue(10));
     echoClient.SetAttribute("Interval", TimeValue(Seconds(1.)));
     echoClient.SetAttribute("PacketSize", UintegerValue(1024));
     ApplicationContainer clientApps = echoClient.Install(wifiStaNodes);
-    clientApps.Start(Seconds(2.0));
-    clientApps.Stop(Seconds(15.0));
+    clientApps.Start(Seconds(2));
+    clientApps.Stop(Seconds(15));
 
     Ipv4GlobalRoutingHelper::PopulateRoutingTables();
-    Simulator::Stop(Seconds(15.0));
+    Simulator::Stop(Seconds(15));
 
     AnimationInterface anim("wireless-animation.xml"); // Mandatory
     for (uint32_t i = 0; i < wifiStaNodes.GetN(); ++i)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/netanim/model/animation-interface.cc ns-3.44/src/netanim/model/animation-interface.cc
--- ns-3.43/src/netanim/model/animation-interface.cc	2024-10-09 16:41:10.068656400 -0700
+++ ns-3.44/src/netanim/model/animation-interface.cc	2025-03-09 16:55:49.671372200 -0700
@@ -71,11 +71,11 @@
       m_writeCallback(nullptr),
       m_started(false),
       m_enablePacketMetadata(false),
-      m_startTime(Seconds(0)),
+      m_startTime(),
       m_stopTime(Seconds(3600 * 1000)),
       m_maxPktsPerFile(MAX_PKTS_PER_TRACE_FILE),
       m_originalFileName(fn),
-      m_routingStopTime(Seconds(0)),
+      m_routingStopTime(),
       m_routingFileName(""),
       m_routingPollInterval(Seconds(5)),
       m_trackPackets(true)
@@ -984,7 +984,7 @@
         AddPendingPacket(AnimationInterface::WIFI, animUid, pktInfo);
         NS_LOG_WARN("WifiPhyRxBegin: unknown Uid, but we are adding a wifi packet");
     }
-    /// \todo NS_ASSERT (WifiPacketIsPending (animUid) == true);
+    /// @todo NS_ASSERT (WifiPacketIsPending (animUid) == true);
     m_pendingWifiPackets[animUid].ProcessRxBegin(ndev, Simulator::Now().GetSeconds());
     OutputWirelessPacketRxInfo(p, m_pendingWifiPackets[animUid], animUid);
 }
@@ -1190,7 +1190,7 @@
         AddPendingPacket(AnimationInterface::CSMA, animUid, pktInfo);
         NS_LOG_WARN("Unknown Uid, but adding Csma Packet anyway");
     }
-    /// \todo NS_ASSERT (IsPacketPending (AnimUid) == true);
+    /// @todo NS_ASSERT (IsPacketPending (AnimUid) == true);
     AnimPacketInfo& pktInfo = m_pendingCsmaPackets[animUid];
     pktInfo.m_lbTx = Simulator::Now().GetSeconds();
 }
@@ -1209,7 +1209,7 @@
         NS_LOG_WARN("CsmaPhyRxEndTrace: unknown Uid");
         return;
     }
-    /// \todo NS_ASSERT (CsmaPacketIsPending (AnimUid) == true);
+    /// @todo NS_ASSERT (CsmaPacketIsPending (AnimUid) == true);
     AnimPacketInfo& pktInfo = m_pendingCsmaPackets[animUid];
     pktInfo.ProcessRxBegin(ndev, Simulator::Now().GetSeconds());
     NS_LOG_INFO("CsmaPhyRxEndTrace for packet:" << animUid);
@@ -1230,7 +1230,7 @@
         NS_LOG_WARN("CsmaMacRxTrace: unknown Uid");
         return;
     }
-    /// \todo NS_ASSERT (CsmaPacketIsPending (AnimUid) == true);
+    /// @todo NS_ASSERT (CsmaPacketIsPending (AnimUid) == true);
     AnimPacketInfo& pktInfo = m_pendingCsmaPackets[animUid];
     NS_LOG_INFO("MacRxTrace for packet:" << animUid << " complete");
     OutputCsmaPacket(p, pktInfo);
@@ -1634,7 +1634,7 @@
                             MakeCallback(&AnimationInterface::UanPhyGenTxTrace, this));
     Config::ConnectFailSafe("/NodeList/*/DeviceList/*/$ns3::UanNetDevice/Phy/PhyRxBegin",
                             MakeCallback(&AnimationInterface::UanPhyGenRxTrace, this));
-    Config::ConnectFailSafe("/NodeList/*/$ns3::BasicEnergySource/RemainingEnergy",
+    Config::ConnectFailSafe("/NodeList/*/$ns3::energy::BasicEnergySource/RemainingEnergy",
                             MakeCallback(&AnimationInterface::RemainingEnergyTrace, this));
 
     ConnectLte();
@@ -1690,17 +1690,17 @@
                             MakeCallback(&AnimationInterface::WifiPhyRxDropTrace, this));
 
     // LrWpan
-    Config::ConnectFailSafe("NodeList/*/DeviceList/*/$ns3::LrWpanNetDevice/Phy/PhyTxBegin",
+    Config::ConnectFailSafe("NodeList/*/DeviceList/*/$ns3::lrwpan::LrWpanNetDevice/Phy/PhyTxBegin",
                             MakeCallback(&AnimationInterface::LrWpanPhyTxBeginTrace, this));
-    Config::ConnectFailSafe("NodeList/*/DeviceList/*/$ns3::LrWpanNetDevice/Phy/PhyRxBegin",
+    Config::ConnectFailSafe("NodeList/*/DeviceList/*/$ns3::lrwpan::LrWpanNetDevice/Phy/PhyRxBegin",
                             MakeCallback(&AnimationInterface::LrWpanPhyRxBeginTrace, this));
-    Config::ConnectFailSafe("/NodeList/*/DeviceList/*/$ns3::LrWpanNetDevice/Mac/MacTx",
+    Config::ConnectFailSafe("/NodeList/*/DeviceList/*/$ns3::lrwpan::LrWpanNetDevice/Mac/MacTx",
                             MakeCallback(&AnimationInterface::LrWpanMacTxTrace, this));
-    Config::ConnectFailSafe("/NodeList/*/DeviceList/*/$ns3::LrWpanNetDevice/Mac/MacTxDrop",
+    Config::ConnectFailSafe("/NodeList/*/DeviceList/*/$ns3::lrwpan::LrWpanNetDevice/Mac/MacTxDrop",
                             MakeCallback(&AnimationInterface::LrWpanMacTxDropTrace, this));
-    Config::ConnectFailSafe("/NodeList/*/DeviceList/*/$ns3::LrWpanNetDevice/Mac/MacRx",
+    Config::ConnectFailSafe("/NodeList/*/DeviceList/*/$ns3::lrwpan::LrWpanNetDevice/Mac/MacRx",
                             MakeCallback(&AnimationInterface::LrWpanMacRxTrace, this));
-    Config::ConnectFailSafe("/NodeList/*/DeviceList/*/$ns3::LrWpanNetDevice/Mac/MacRxDrop",
+    Config::ConnectFailSafe("/NodeList/*/DeviceList/*/$ns3::lrwpan::LrWpanNetDevice/Mac/MacRxDrop",
                             MakeCallback(&AnimationInterface::LrWpanMacRxDropTrace, this));
 }
 
@@ -2518,9 +2518,8 @@
     element.AddAttribute("id", nodeId);
     element.AddAttribute("d", destination.c_str());
     element.AddAttribute("c", rpElements.size());
-    for (auto i = rpElements.begin(); i != rpElements.end(); ++i)
+    for (const auto& rpElement : rpElements)
     {
-        Ipv4RoutePathElement rpElement = *i;
         AnimXmlElement rpeElement("rpe");
         rpeElement.AddAttribute("n", rpElement.nodeId);
         rpeElement.AddAttribute("nH", rpElement.nextHop.c_str());
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/netanim/model/animation-interface.h ns-3.44/src/netanim/model/animation-interface.h
--- ns-3.43/src/netanim/model/animation-interface.h	2024-10-09 16:41:10.068656400 -0700
+++ ns-3.44/src/netanim/model/animation-interface.h	2025-03-09 16:55:49.671372200 -0700
@@ -59,16 +59,16 @@
 class WifiPsdu;
 
 /**
- * \defgroup netanim Network Animation
+ * @defgroup netanim Network Animation
  *
  * This section documents the API of the ns-3 netanim module. For a generic functional description,
  * please refer to the ns-3 manual.
  */
 
 /**
- * \ingroup netanim
+ * @ingroup netanim
  *
- * \brief Interface to network animator
+ * @brief Interface to network animator
  *
  * Provides functions that facilitate communications with an
  * external or internal network animator.
@@ -77,8 +77,8 @@
 {
   public:
     /**
-     * \brief Constructor
-     * \param filename The Filename for the trace file used by the Animator
+     * @brief Constructor
+     * @param filename The Filename for the trace file used by the Animator
      *
      */
     AnimationInterface(const std::string filename);
@@ -93,24 +93,24 @@
     };
 
     /**
-     * \brief typedef for WriteCallBack used for listening to AnimationInterface
+     * @brief typedef for WriteCallBack used for listening to AnimationInterface
      * write messages
      *
      */
     typedef void (*AnimWriteCallback)(const char* str);
 
     /**
-     * \brief Destructor for the animator interface.
+     * @brief Destructor for the animator interface.
      *
      */
     ~AnimationInterface();
 
     /**
-     * \brief Enable tracking of Ipv4 L3 Protocol Counters such as Tx, Rx, Drop
+     * @brief Enable tracking of Ipv4 L3 Protocol Counters such as Tx, Rx, Drop
      *
-     * \param startTime Start Time for capturing values
-     * \param stopTime Stop Time for capturing values
-     * \param pollInterval The periodic interval at which the counters are written to the trace file
+     * @param startTime Start Time for capturing values
+     * @param stopTime Stop Time for capturing values
+     * @param pollInterval The periodic interval at which the counters are written to the trace file
      *        Default: 1s
      */
     void EnableIpv4L3ProtocolCounters(Time startTime,
@@ -118,45 +118,45 @@
                                       Time pollInterval = Seconds(1));
 
     /**
-     * \brief Enable tracking of Queue Counters such as Enqueue, Dequeue, Queue Drops
+     * @brief Enable tracking of Queue Counters such as Enqueue, Dequeue, Queue Drops
      *
-     * \param startTime Start Time for capturing values
-     * \param stopTime Stop Time for capturing values
-     * \param pollInterval The periodic interval at which the counters are written to the trace file
+     * @param startTime Start Time for capturing values
+     * @param stopTime Stop Time for capturing values
+     * @param pollInterval The periodic interval at which the counters are written to the trace file
      *        Default: 1s
      */
     void EnableQueueCounters(Time startTime, Time stopTime, Time pollInterval = Seconds(1));
 
     /**
-     * \brief Enable tracking of Wifi Mac Counters such as Tx, TxDrop, Rx, RxDrop
+     * @brief Enable tracking of Wifi Mac Counters such as Tx, TxDrop, Rx, RxDrop
      *
-     * \param startTime Start Time for capturing values
-     * \param stopTime Stop Time for capturing values
-     * \param pollInterval The periodic interval at which the counters are written to the trace file
+     * @param startTime Start Time for capturing values
+     * @param stopTime Stop Time for capturing values
+     * @param pollInterval The periodic interval at which the counters are written to the trace file
      *        Default: 1s
      */
     void EnableWifiMacCounters(Time startTime, Time stopTime, Time pollInterval = Seconds(1));
 
     /**
-     * \brief Enable tracking of Wifi Phy Counters such as TxDrop, RxDrop
+     * @brief Enable tracking of Wifi Phy Counters such as TxDrop, RxDrop
      *
-     * \param startTime Start Time for capturing values
-     * \param stopTime Stop Time for capturing values
-     * \param pollInterval The periodic interval at which the counters are written to the trace file
+     * @param startTime Start Time for capturing values
+     * @param stopTime Stop Time for capturing values
+     * @param pollInterval The periodic interval at which the counters are written to the trace file
      *        Default: 1s
      */
     void EnableWifiPhyCounters(Time startTime, Time stopTime, Time pollInterval = Seconds(1));
 
     /**
-     * \brief Enable tracking of the Ipv4 routing table for all Nodes
+     * @brief Enable tracking of the Ipv4 routing table for all Nodes
      *
-     * \param fileName Trace file for storing routing table information
-     * \param startTime Start time for capture
-     * \param stopTime  End time for capture
-     * \param pollInterval The periodic interval at which routing table information is polled
+     * @param fileName Trace file for storing routing table information
+     * @param startTime Start time for capture
+     * @param stopTime  End time for capture
+     * @param pollInterval The periodic interval at which routing table information is polled
      *        Default: 5s
      *
-     * \returns reference to this AnimationInterface object
+     * @returns reference to this AnimationInterface object
      */
     AnimationInterface& EnableIpv4RouteTracking(std::string fileName,
                                                 Time startTime,
@@ -164,16 +164,16 @@
                                                 Time pollInterval = Seconds(5));
 
     /**
-     * \brief Enable tracking of the Ipv4 routing table for a set of Nodes
+     * @brief Enable tracking of the Ipv4 routing table for a set of Nodes
      *
-     * \param fileName Trace file for storing routing table information
-     * \param startTime Start time for capture
-     * \param stopTime  End time for capture
-     * \param nc A NodeContainer containing nodes for which Routing table has to be tracked
-     * \param pollInterval The periodic interval at which routing table information is polled
+     * @param fileName Trace file for storing routing table information
+     * @param startTime Start time for capture
+     * @param stopTime  End time for capture
+     * @param nc A NodeContainer containing nodes for which Routing table has to be tracked
+     * @param pollInterval The periodic interval at which routing table information is polled
      *        Default: 5s
      *
-     * \returns reference to this AnimationInterface object
+     * @returns reference to this AnimationInterface object
      */
     AnimationInterface& EnableIpv4RouteTracking(std::string fileName,
                                                 Time startTime,
@@ -182,32 +182,32 @@
                                                 Time pollInterval = Seconds(5));
 
     /**
-     * \brief Check if AnimationInterface is initialized
+     * @brief Check if AnimationInterface is initialized
      *
-     * \returns true if AnimationInterface was already initialized
+     * @returns true if AnimationInterface was already initialized
      *
      */
     static bool IsInitialized();
 
     /**
-     * \brief Specify the time at which capture should start
+     * @brief Specify the time at which capture should start
      *
-     * \param t The time at which AnimationInterface should begin capture of traffic info
+     * @param t The time at which AnimationInterface should begin capture of traffic info
      *
      */
     void SetStartTime(Time t);
 
     /**
-     * \brief Specify the time at which capture should stop
+     * @brief Specify the time at which capture should stop
      *
-     * \param t The time at which AnimationInterface should stop capture of traffic info
+     * @param t The time at which AnimationInterface should stop capture of traffic info
      *
      */
     void SetStopTime(Time t);
 
     /**
-     * \brief Set Max packets per trace file
-     * \param maxPktsPerFile The maximum number of packets per trace file.
+     * @brief Set Max packets per trace file
+     * @param maxPktsPerFile The maximum number of packets per trace file.
               AnimationInterface will create trace files with the following
               filenames : filename, filename-1, filename-2..., filename-N
               where each file contains packet info for 'maxPktsPerFile' number of packets
@@ -216,118 +216,118 @@
     void SetMaxPktsPerTraceFile(uint64_t maxPktsPerFile);
 
     /**
-     * \brief Set mobility poll interval:WARNING: setting a low interval can
+     * @brief Set mobility poll interval:WARNING: setting a low interval can
      * cause slowness
      *
-     * \param t Time interval between fetching mobility/position information
+     * @param t Time interval between fetching mobility/position information
      * Default: 0.25s
      *
      */
     void SetMobilityPollInterval(Time t);
 
     /**
-     * \brief Set a callback function to listen to AnimationInterface write events
+     * @brief Set a callback function to listen to AnimationInterface write events
      *
-     * \param cb Address of callback function
+     * @param cb Address of callback function
      *
      */
     void SetAnimWriteCallback(AnimWriteCallback cb);
 
     /**
-     * \brief Reset the write callback function
+     * @brief Reset the write callback function
      *
      */
     void ResetAnimWriteCallback();
 
     /**
-     * \brief Helper function to set Constant Position for a given node
-     * \param n Ptr to the node
-     * \param x X coordinate of the node
-     * \param y Y coordinate of the node
-     * \param z Z coordinate of the node
+     * @brief Helper function to set Constant Position for a given node
+     * @param n Ptr to the node
+     * @param x X coordinate of the node
+     * @param y Y coordinate of the node
+     * @param z Z coordinate of the node
      *
      */
     static void SetConstantPosition(Ptr<Node> n, double x, double y, double z = 0);
 
     /**
-     * \brief Helper function to update the description for a given node
-     * \param n Ptr to the node
-     * \param descr A string to briefly describe the node
+     * @brief Helper function to update the description for a given node
+     * @param n Ptr to the node
+     * @param descr A string to briefly describe the node
      *
      */
     void UpdateNodeDescription(Ptr<Node> n, std::string descr);
 
     /**
-     * \brief Helper function to update the description for a given node
-     * \param nodeId Id of the node
-     * \param descr A string to briefly describe the node
+     * @brief Helper function to update the description for a given node
+     * @param nodeId Id of the node
+     * @param descr A string to briefly describe the node
      *
      */
     void UpdateNodeDescription(uint32_t nodeId, std::string descr);
 
     /**
-     * \brief Helper function to update the image of a node
-     * \param nodeId Id of the node
-     * \param resourceId Id of the image resource that was previously added
+     * @brief Helper function to update the image of a node
+     * @param nodeId Id of the node
+     * @param resourceId Id of the image resource that was previously added
      *
      */
     void UpdateNodeImage(uint32_t nodeId, uint32_t resourceId);
 
     /**
-     * \brief Helper function to update the size of a node
-     * \param n Ptr to the node
-     * \param width Width of the node
-     * \param height Height of the node
+     * @brief Helper function to update the size of a node
+     * @param n Ptr to the node
+     * @param width Width of the node
+     * @param height Height of the node
      *
      */
     void UpdateNodeSize(Ptr<Node> n, double width, double height);
 
     /**
-     * \brief Helper function to update the size of a node
-     * \param nodeId Id of the node
-     * \param width Width of the node
-     * \param height Height of the node
+     * @brief Helper function to update the size of a node
+     * @param nodeId Id of the node
+     * @param width Width of the node
+     * @param height Height of the node
      *
      */
     void UpdateNodeSize(uint32_t nodeId, double width, double height);
 
     /**
-     * \brief Helper function to update the node color
-     * \param n Ptr to the node
-     * \param r Red component value (0-255)
-     * \param g Green component value (0-255)
-     * \param b Blue component value (0-255)
+     * @brief Helper function to update the node color
+     * @param n Ptr to the node
+     * @param r Red component value (0-255)
+     * @param g Green component value (0-255)
+     * @param b Blue component value (0-255)
      *
      */
     void UpdateNodeColor(Ptr<Node> n, uint8_t r, uint8_t g, uint8_t b);
 
     /**
-     * \brief Helper function to update the node color
-     * \param nodeId Id of the node
-     * \param r Red component value (0-255)
-     * \param g Green component value (0-255)
-     * \param b Blue component value (0-255)
+     * @brief Helper function to update the node color
+     * @param nodeId Id of the node
+     * @param r Red component value (0-255)
+     * @param g Green component value (0-255)
+     * @param b Blue component value (0-255)
      *
      */
     void UpdateNodeColor(uint32_t nodeId, uint8_t r, uint8_t g, uint8_t b);
 
     /**
-     * \brief Helper function to update a node's counter referenced by the nodeCounterId
-     * \param nodeCounterId The counter Id obtained from AddNodeCounter
-     * \param nodeId Node Id of the node
-     * \param counter Current value of the counter
+     * @brief Helper function to update a node's counter referenced by the nodeCounterId
+     * @param nodeCounterId The counter Id obtained from AddNodeCounter
+     * @param nodeId Node Id of the node
+     * @param counter Current value of the counter
      *
      */
     void UpdateNodeCounter(uint32_t nodeCounterId, uint32_t nodeId, double counter);
 
     /**
-     * \brief Helper function to set the background image
-     * \param fileName File name of the background image
-     * \param x X coordinate of the image
-     * \param y Y coordinate of the image
-     * \param scaleX X scale of the image
-     * \param scaleY Y scale of the image
-     * \param opacity Opacity of the background: A value between 0.0 and 1.0. 0.0 is transparent,
+     * @brief Helper function to set the background image
+     * @param fileName File name of the background image
+     * @param x X coordinate of the image
+     * @param y Y coordinate of the image
+     * @param scaleX X scale of the image
+     * @param scaleY Y scale of the image
+     * @param opacity Opacity of the background: A value between 0.0 and 1.0. 0.0 is transparent,
      *        1.0 is opaque
      *
      */
@@ -339,50 +339,50 @@
                             double opacity);
 
     /**
-     * \brief Helper function to update the description for a link
-     * \param fromNode Node Id of the "from Node" of the p2p link
-     * \param toNode Node Id of the "to Node" of the p2p link
-     * \param linkDescription Description of the link such as link bandwidth
+     * @brief Helper function to update the description for a link
+     * @param fromNode Node Id of the "from Node" of the p2p link
+     * @param toNode Node Id of the "to Node" of the p2p link
+     * @param linkDescription Description of the link such as link bandwidth
      *
      */
     void UpdateLinkDescription(uint32_t fromNode, uint32_t toNode, std::string linkDescription);
 
     /**
-     * \brief Helper function to update the description for a link
-     * \param fromNode Ptr to the "from Node" of the p2p link
-     * \param toNode Ptr to the "to Node" of the p2p link
-     * \param linkDescription Description of the link such as link bandwidth
+     * @brief Helper function to update the description for a link
+     * @param fromNode Ptr to the "from Node" of the p2p link
+     * @param toNode Ptr to the "to Node" of the p2p link
+     * @param linkDescription Description of the link such as link bandwidth
      *
      */
     void UpdateLinkDescription(Ptr<Node> fromNode, Ptr<Node> toNode, std::string linkDescription);
 
     /**
-     * \brief Helper function to print the routing path from a source node to destination IP
-     * \param fromNodeId The source node
-     * \param destinationIpv4Address The destination Ipv4 Address
+     * @brief Helper function to print the routing path from a source node to destination IP
+     * @param fromNodeId The source node
+     * @param destinationIpv4Address The destination Ipv4 Address
      *
-     * \returns reference to this AnimationInterface object
+     * @returns reference to this AnimationInterface object
      */
     AnimationInterface& AddSourceDestination(uint32_t fromNodeId,
                                              std::string destinationIpv4Address);
 
     /**
-     * \brief Is AnimationInterface started
+     * @brief Is AnimationInterface started
      *
-     * \returns true if AnimationInterface was started
+     * @returns true if AnimationInterface was started
      */
     bool IsStarted() const;
 
     /**
-     * \brief Do not trace packets. This helps reduce the trace file size if AnimationInterface is
+     * @brief Do not trace packets. This helps reduce the trace file size if AnimationInterface is
      * solely used for tracking mobility, routing paths and counters
      */
     void SkipPacketTracing();
 
     /**
      *
-     * \brief Enable Packet metadata
-     * \param enable if true enables writing the packet metadata to the XML trace file
+     * @brief Enable Packet metadata
+     * @param enable if true enables writing the packet metadata to the XML trace file
      *        if false disables writing the packet metadata
      *
      */
@@ -390,37 +390,37 @@
 
     /**
      *
-     * \brief Get trace file packet count (This used only for testing)
+     * @brief Get trace file packet count (This used only for testing)
      *
-     * \returns Number of packets recorded in the current trace file
+     * @returns Number of packets recorded in the current trace file
      */
     uint64_t GetTracePktCount() const;
 
     /**
      *
-     * \brief Setup a node counter
-     * \param counterName A string to identify the counter
-     * \param counterType The type of the counter, such as uint32, double etc
+     * @brief Setup a node counter
+     * @param counterName A string to identify the counter
+     * @param counterType The type of the counter, such as uint32, double etc
      *
-     * \returns The id of the counter to be used as a reference for future
+     * @returns The id of the counter to be used as a reference for future
      */
     uint32_t AddNodeCounter(std::string counterName, CounterType counterType);
 
     /**
      *
-     * \brief Add a resource such as the path to an image file
-     * \param resourcePath Absolute Path to an image/resource
+     * @brief Add a resource such as the path to an image file
+     * @param resourcePath Absolute Path to an image/resource
      *
-     * \returns a number identifying the resource
+     * @returns a number identifying the resource
      */
     uint32_t AddResource(std::string resourcePath);
 
     /**
      *
-     * \brief Get node's energy fraction (This used only for testing)
-     * \param node
+     * @brief Get node's energy fraction (This used only for testing)
+     * @param node
      *
-     * \returns current node's remaining energy (between [0, 1])
+     * @returns current node's remaining energy (between [0, 1])
      */
     double GetNodeEnergyFraction(Ptr<const Node> node) const;
 
@@ -436,15 +436,15 @@
         /**
          * Constructor
          *
-         * \param pInfo anim packet info
+         * @param pInfo anim packet info
          */
         AnimPacketInfo(const AnimPacketInfo& pInfo);
         /**
          * Constructor
          *
-         * \param tx_nd transmit device
-         * \param fbTx fb transmit
-         * \param txNodeId transmit node ID
+         * @param tx_nd transmit device
+         * @param fbTx fb transmit
+         * @param txNodeId transmit node ID
          */
         AnimPacketInfo(Ptr<const NetDevice> tx_nd, const Time fbTx, uint32_t txNodeId = 0);
         Ptr<const NetDevice> m_txnd; ///< transmit device
@@ -456,8 +456,8 @@
         Ptr<const NetDevice> m_rxnd; ///< receive device
         /**
          * Process receive begin
-         * \param nd the device
-         * \param fbRx
+         * @param nd the device
+         * @param fbRx
          */
         void ProcessRxBegin(Ptr<const NetDevice> nd, const double fbRx);
     };
@@ -491,9 +491,9 @@
         /**
          * comparison operator
          *
-         * \param first
-         * \param second
-         * \return true if equal
+         * @param first
+         * @param second
+         * @return true if equal
          */
         bool operator()(P2pLinkNodeIdPair first, P2pLinkNodeIdPair second) const
         {
@@ -567,32 +567,32 @@
         /**
          * Constructor
          *
-         * \param tagName tag name
-         * \param emptyElement empty element?
+         * @param tagName tag name
+         * @param emptyElement empty element?
          */
         AnimXmlElement(std::string tagName, bool emptyElement = true);
         template <typename T>
         /**
          * Add attribute function
-         * \param attribute the attribute name
-         * \param value the attribute value
-         * \param xmlEscape true to escape
+         * @param attribute the attribute name
+         * @param value the attribute value
+         * @param xmlEscape true to escape
          */
         void AddAttribute(std::string attribute, T value, bool xmlEscape = false);
         /**
          * Set text function
-         * \param text the text for the element
+         * @param text the text for the element
          */
         void SetText(std::string text);
         /**
          * Append child function
-         * \param e the element to add as a child
+         * @param e the element to add as a child
          */
         void AppendChild(AnimXmlElement e);
         /**
          * Get text for the element function
-         * \param autoClose auto close the element
-         * \returns the text
+         * @param autoClose auto close the element
+         * @returns the text
          */
         std::string ToString(bool autoClose = true);
 
@@ -695,20 +695,20 @@
 
     /**
      * Get elements from context
-     * \param context the context string
-     * \returns the elements
+     * @param context the context string
+     * @returns the elements
      */
     const std::vector<std::string> GetElementsFromContext(const std::string& context) const;
     /**
      * Get node from context
-     * \param context the context string
-     * \returns the node
+     * @param context the context string
+     * @returns the node
      */
     Ptr<Node> GetNodeFromContext(const std::string& context) const;
     /**
      * Get net device from context
-     * \param context the context string
-     * \returns the device
+     * @param context the context string
+     * @returns the device
      */
     Ptr<NetDevice> GetNetDeviceFromContext(std::string context);
 
@@ -716,157 +716,157 @@
     /**
      * Start animation function
      *
-     * \param restart
+     * @param restart
      */
     void StartAnimation(bool restart = false);
     /**
      * Set output file function
      *
-     * \param fn the file name
-     * \param routing
+     * @param fn the file name
+     * @param routing
      */
     void SetOutputFile(const std::string& fn, bool routing = false);
     /**
      * Stop animation function
      *
-     * \param onlyAnimation
+     * @param onlyAnimation
      */
     void StopAnimation(bool onlyAnimation = false);
     /**
      * Counter type to string function
-     * \param counterType the counter type
-     * \returns the string
+     * @param counterType the counter type
+     * @returns the string
      */
     std::string CounterTypeToString(CounterType counterType);
     /**
      * Get packet metadata function
-     * \param p the packet
-     * \returns the meta data
+     * @param p the packet
+     * @returns the meta data
      */
     std::string GetPacketMetadata(Ptr<const Packet> p);
     /**
      * Add byte tag function
-     * \param animUid the UID
-     * \param p the packet
+     * @param animUid the UID
+     * @param p the packet
      */
     void AddByteTag(uint64_t animUid, Ptr<const Packet> p);
     /**
      * WriteN function
-     * \param data the data t write
-     * \param count the number of bytes to write
-     * \param f the file to write to
-     * \returns the number of bytes written
+     * @param data the data t write
+     * @param count the number of bytes to write
+     * @param f the file to write to
+     * @returns the number of bytes written
      */
     int WriteN(const char* data, uint32_t count, FILE* f);
     /**
      * WriteN function
-     * \param st the string to output
-     * \param f the file to write to
-     * \returns the number of bytes written
+     * @param st the string to output
+     * @param f the file to write to
+     * @returns the number of bytes written
      */
     int WriteN(const std::string& st, FILE* f);
     /**
      * Get MAC address function
-     * \param nd the device
-     * \returns the MAC address
+     * @param nd the device
+     * @returns the MAC address
      */
     std::string GetMacAddress(Ptr<NetDevice> nd);
     /**
      * Get IPv4 address
-     * \param nd the device
-     * \returns the IPv4 address
+     * @param nd the device
+     * @returns the IPv4 address
      */
     std::string GetIpv4Address(Ptr<NetDevice> nd);
     /**
      * Get IPv6 address
-     * \param nd the device
-     * \returns the IPv6 address
+     * @param nd the device
+     * @returns the IPv6 address
      */
     std::string GetIpv6Address(Ptr<NetDevice> nd);
     /**
      * Get IPv4 addresses
-     * \param nd the device
-     * \returns the IPv4 address list
+     * @param nd the device
+     * @returns the IPv4 address list
      */
     std::vector<std::string> GetIpv4Addresses(Ptr<NetDevice> nd);
     /**
      * Get IPv6 addresses
-     * \param nd the device
-     * \returns the IPv6 address list
+     * @param nd the device
+     * @returns the IPv6 address list
      */
     std::vector<std::string> GetIpv6Addresses(Ptr<NetDevice> nd);
 
     /**
      * Get netanim version function
-     * \returns the net anim version string
+     * @returns the net anim version string
      */
     std::string GetNetAnimVersion();
     /// Mobility auto check function
     void MobilityAutoCheck();
     /**
      * Is packet pending function
-     * \param animUid the UID
-     * \param protocolType the protocol type
-     * \returns true if a packet is pending
+     * @param animUid the UID
+     * @param protocolType the protocol type
+     * @returns true if a packet is pending
      */
     bool IsPacketPending(uint64_t animUid, ProtocolType protocolType);
     /**
      * Purge pending packets function
-     * \param protocolType the protocol type
+     * @param protocolType the protocol type
      */
     void PurgePendingPackets(ProtocolType protocolType);
     /**
      * Protocol type to pending packets function
-     * \param protocolType the protocol type
-     * \returns AnimUidPacketInfoMap *
+     * @param protocolType the protocol type
+     * @returns AnimUidPacketInfoMap *
      */
     AnimUidPacketInfoMap* ProtocolTypeToPendingPackets(ProtocolType protocolType);
     /**
      * Protocol type to string function
-     * \param protocolType the protocol type
-     * \returns the protocol type string
+     * @param protocolType the protocol type
+     * @returns the protocol type string
      */
     std::string ProtocolTypeToString(ProtocolType protocolType);
     /**
      * Add pending packet function
-     * \param protocolType the protocol type
-     * \param animUid the UID
-     * \param pktInfo the packet info
+     * @param protocolType the protocol type
+     * @param animUid the UID
+     * @param pktInfo the packet info
      */
     void AddPendingPacket(ProtocolType protocolType, uint64_t animUid, AnimPacketInfo pktInfo);
     /**
      * Get anim UID from packet function
-     * \param p the packet
-     * \returns the UID
+     * @param p the packet
+     * @returns the UID
      */
     uint64_t GetAnimUidFromPacket(Ptr<const Packet>);
     /**
      * Add to IPv4 address node ID table function
-     * \param ipv4Address the IPv4 address
-     * \param nodeId the node ID
+     * @param ipv4Address the IPv4 address
+     * @param nodeId the node ID
      */
     void AddToIpv4AddressNodeIdTable(std::string ipv4Address, uint32_t nodeId);
     /**
      * Add to IPv4 address node ID table function
-     * \param ipv4Addresses the list of IPv4 addresses
-     * \param nodeId the node ID
+     * @param ipv4Addresses the list of IPv4 addresses
+     * @param nodeId the node ID
      */
     void AddToIpv4AddressNodeIdTable(std::vector<std::string> ipv4Addresses, uint32_t nodeId);
     /**
      * Add to IPv6 address node ID table function
-     * \param ipv6Address the IPv6 address
-     * \param nodeId the node ID
+     * @param ipv6Address the IPv6 address
+     * @param nodeId the node ID
      */
     void AddToIpv6AddressNodeIdTable(std::string ipv6Address, uint32_t nodeId);
     /**
      * Add to IPv6 address node ID table function
-     * \param ipv6Addresses the list of IPv6 addresses
-     * \param nodeId the node ID
+     * @param ipv6Addresses the list of IPv6 addresses
+     * @param nodeId the node ID
      */
     void AddToIpv6AddressNodeIdTable(std::vector<std::string> ipv6Addresses, uint32_t nodeId);
     /**
      * Is in time window function
-     * \returns true if in the time window
+     * @returns true if in the time window
      */
     bool IsInTimeWindow();
     /// Check maximum packets per trace file function
@@ -887,52 +887,52 @@
     void TrackIpv4RoutePaths();
     /**
      * Get IPv4 routing table function
-     * \param n the node
-     * \returns the IPv4 routing table
+     * @param n the node
+     * @returns the IPv4 routing table
      */
     std::string GetIpv4RoutingTable(Ptr<Node> n);
     /**
      * Recursive IPv4 route path search function
-     * \param from the source node
-     * \param to the destination node
-     * \param rpElements the IPv4 routing path elements
+     * @param from the source node
+     * @param to the destination node
+     * @param rpElements the IPv4 routing path elements
      */
     void RecursiveIpv4RoutePathSearch(std::string from,
                                       std::string to,
                                       Ipv4RoutePathElements& rpElements);
     /**
      * Write route path function
-     * \param nodeId the node ID
-     * \param destination the destination
-     * \param rpElements the IPv4 routing path elements
+     * @param nodeId the node ID
+     * @param destination the destination
+     * @param rpElements the IPv4 routing path elements
      */
     void WriteRoutePath(uint32_t nodeId, std::string destination, Ipv4RoutePathElements rpElements);
 
     // ##### Trace #####
     /**
      * Enqueue trace function
-     * \param context the context
-     * \param p the packet
+     * @param context the context
+     * @param p the packet
      */
     void EnqueueTrace(std::string context, Ptr<const Packet>);
     /**
      * Dequeue trace function
-     * \param context the context
-     * \param p the packet
+     * @param context the context
+     * @param p the packet
      */
     void DequeueTrace(std::string context, Ptr<const Packet>);
     /**
      * Queue trace function
-     * \param context the context
-     * \param p the packet
+     * @param context the context
+     * @param p the packet
      */
     void QueueDropTrace(std::string context, Ptr<const Packet>);
     /**
      * IPv4 transmit trace function
-     * \param context the context
-     * \param p the packet
-     * \param ipv4 the IP
-     * \param interfaceIndex the interface index
+     * @param context the context
+     * @param p the packet
+     * @param ipv4 the IP
+     * @param interfaceIndex the interface index
      */
     void Ipv4TxTrace(std::string context,
                      Ptr<const Packet> p,
@@ -940,10 +940,10 @@
                      uint32_t interfaceIndex);
     /**
      * IPv4 receive trace function
-     * \param context the context
-     * \param p the packet
-     * \param ipv4 the IP
-     * \param interfaceIndex the interface index
+     * @param context the context
+     * @param p the packet
+     * @param ipv4 the IP
+     * @param interfaceIndex the interface index
      */
     void Ipv4RxTrace(std::string context,
                      Ptr<const Packet> p,
@@ -951,12 +951,12 @@
                      uint32_t interfaceIndex);
     /**
      * IPv4 drop trace function
-     * \param context the context
-     * \param ipv4Header the IPv4 header
-     * \param p the packet
-     * \param dropReason the reason for the drop
-     * \param ipv4 the IP
-     * \param interfaceIndex the interface index
+     * @param context the context
+     * @param ipv4Header the IPv4 header
+     * @param p the packet
+     * @param dropReason the reason for the drop
+     * @param ipv4 the IP
+     * @param interfaceIndex the interface index
      */
     void Ipv4DropTrace(std::string context,
                        const Ipv4Header& ipv4Header,
@@ -967,75 +967,75 @@
 
     /**
      * wifi MAC transmit trace function
-     * \param context the context
-     * \param p the packet
+     * @param context the context
+     * @param p the packet
      */
     void WifiMacTxTrace(std::string context, Ptr<const Packet> p);
     /**
      * wifi MAC transmit drop trace function
-     * \param context the context
-     * \param p the packet
+     * @param context the context
+     * @param p the packet
      */
     void WifiMacTxDropTrace(std::string context, Ptr<const Packet> p);
     /**
      * wifi MAC receive trace function
-     * \param context the context
-     * \param p the packet
+     * @param context the context
+     * @param p the packet
      */
     void WifiMacRxTrace(std::string context, Ptr<const Packet> p);
     /**
      * wifi MAC receive drop trace function
-     * \param context the context
-     * \param p the packet
+     * @param context the context
+     * @param p the packet
      */
     void WifiMacRxDropTrace(std::string context, Ptr<const Packet> p);
     /**
      * wifi Phy transmit drop trace function
-     * \param context the context
-     * \param p the packet
+     * @param context the context
+     * @param p the packet
      */
     void WifiPhyTxDropTrace(std::string context, Ptr<const Packet> p);
     /**
      * wifi Phy receive drop trace function
-     * \param context the context
-     * \param p the packet
-     * \param reason the reason
+     * @param context the context
+     * @param p the packet
+     * @param reason the reason
      */
     void WifiPhyRxDropTrace(std::string context,
                             Ptr<const Packet> p,
                             WifiPhyRxfailureReason reason);
     /**
      * LR-WPAN MAC transmit trace function
-     * \param context the context
-     * \param p the packet
+     * @param context the context
+     * @param p the packet
      */
     void LrWpanMacTxTrace(std::string context, Ptr<const Packet> p);
     /**
      * LR-WPAN MAC transmit drop trace function
-     * \param context the context
-     * \param p the packet
+     * @param context the context
+     * @param p the packet
      */
     void LrWpanMacTxDropTrace(std::string context, Ptr<const Packet> p);
     /**
      * LR-WPAN MAC receive trace function
-     * \param context the context
-     * \param p the packet
+     * @param context the context
+     * @param p the packet
      */
     void LrWpanMacRxTrace(std::string context, Ptr<const Packet> p);
     /**
      * LR-WPAN MAC receive drop trace function
-     * \param context the context
-     * \param p the packet
+     * @param context the context
+     * @param p the packet
      */
     void LrWpanMacRxDropTrace(std::string context, Ptr<const Packet> p);
     /**
      * Device transmit trace function
-     * \param context the context
-     * \param p the packet
-     * \param tx the transmit device
-     * \param rx the receive device
-     * \param txTime the transmit time
-     * \param rxTime the receive time
+     * @param context the context
+     * @param p the packet
+     * @param tx the transmit device
+     * @param rx the receive device
+     * @param txTime the transmit time
+     * @param rxTime the receive time
      */
     void DevTxTrace(std::string context,
                     Ptr<const Packet> p,
@@ -1045,10 +1045,10 @@
                     Time rxTime);
     /**
      * wifi Phy transmit PSDU begin trace function
-     * \param context the context
-     * \param psduMap the PSDU map
-     * \param txVector the TXVECTOR
-     * \param txPowerW the tx power in Watts
+     * @param context the context
+     * @param psduMap the PSDU map
+     * @param txVector the TXVECTOR
+     * @param txPowerW the tx power in Watts
      */
     void WifiPhyTxBeginTrace(std::string context,
                              WifiConstPsduMap psduMap,
@@ -1057,9 +1057,9 @@
     /**
      * wifi Phy receive begin trace function
      *
-     * \param context the context
-     * \param p the packet
-     * \param rxPowersW the receive power per channel band in Watts
+     * @param context the context
+     * @param p the packet
+     * @param rxPowersW the receive power per channel band in Watts
      */
     void WifiPhyRxBeginTrace(std::string context,
                              Ptr<const Packet> p,
@@ -1067,117 +1067,117 @@
     /**
      * LR-WPAN Phy receive begin trace function
      *
-     * \param context the context
-     * \param p the packet
+     * @param context the context
+     * @param p the packet
      */
     void LrWpanPhyTxBeginTrace(std::string context, Ptr<const Packet> p);
     /**
      * LR-WPAN Phy receive begin trace function
      *
-     * \param context the context
-     * \param p the packet
+     * @param context the context
+     * @param p the packet
      */
     void LrWpanPhyRxBeginTrace(std::string context, Ptr<const Packet> p);
     /**
      * WIMax transmit trace function
-     * \param context the context
-     * \param p the packet
-     * \param m the MAC address
+     * @param context the context
+     * @param p the packet
+     * @param m the MAC address
      */
     void WimaxTxTrace(std::string context, Ptr<const Packet> p, const Mac48Address& m);
     /**
      * WIMax receive trace function
-     * \param context the context
-     * \param p the packet
-     * \param m the MAC address
+     * @param context the context
+     * @param p the packet
+     * @param m the MAC address
      */
     void WimaxRxTrace(std::string context, Ptr<const Packet> p, const Mac48Address& m);
     /**
      * CSMA Phy transmit begin trace function
-     * \param context the context
-     * \param p the packet
+     * @param context the context
+     * @param p the packet
      */
     void CsmaPhyTxBeginTrace(std::string context, Ptr<const Packet> p);
     /**
      * CSMA Phy transmit end trace function
      *
-     * \param context the context
-     * \param p the packet
+     * @param context the context
+     * @param p the packet
      */
     void CsmaPhyTxEndTrace(std::string context, Ptr<const Packet> p);
     /**
      * CSMA Phy receive end trace function
      *
-     * \param context the context
-     * \param p the packet
+     * @param context the context
+     * @param p the packet
      */
     void CsmaPhyRxEndTrace(std::string context, Ptr<const Packet> p);
     /**
      * CSMA MAC receive trace function
      *
-     * \param context the context
-     * \param p the packet
+     * @param context the context
+     * @param p the packet
      */
     void CsmaMacRxTrace(std::string context, Ptr<const Packet> p);
     /**
      * LTE transmit trace function
-     * \param context the context
-     * \param p the packet
-     * \param m the MAC address
+     * @param context the context
+     * @param p the packet
+     * @param m the MAC address
      */
     void LteTxTrace(std::string context, Ptr<const Packet> p, const Mac48Address& m);
     /**
      * LTE receive trace function
-     * \param context the context
-     * \param p the packet
-     * \param m the MAC address
+     * @param context the context
+     * @param p the packet
+     * @param m the MAC address
      */
     void LteRxTrace(std::string context, Ptr<const Packet> p, const Mac48Address& m);
     /**
      * LTE Spectrum Phy transmit start function
-     * \param context the context
-     * \param pb the packet burst
+     * @param context the context
+     * @param pb the packet burst
      */
     void LteSpectrumPhyTxStart(std::string context, Ptr<const PacketBurst> pb);
     /**
      * LTE Spectrum Phy receive start function
-     * \param context the context
-     * \param pb the packet burst
+     * @param context the context
+     * @param pb the packet burst
      */
     void LteSpectrumPhyRxStart(std::string context, Ptr<const PacketBurst> pb);
     /**
      * UAN Phy gen transmit trace function
-     * \param context the context
-     * \param p the packet
+     * @param context the context
+     * @param p the packet
      */
     void UanPhyGenTxTrace(std::string context, Ptr<const Packet>);
     /**
      * UAN Phy gen receive trace function
-     * \param context the context
-     * \param p the packet
+     * @param context the context
+     * @param p the packet
      */
     void UanPhyGenRxTrace(std::string context, Ptr<const Packet>);
     /**
      * Remaining energy trace function
-     * \param context the context
-     * \param previousEnergy The previous energy
-     * \param currentEnergy The current energy
+     * @param context the context
+     * @param previousEnergy The previous energy
+     * @param currentEnergy The current energy
      */
     void RemainingEnergyTrace(std::string context, double previousEnergy, double currentEnergy);
     /**
      * Generic wireless transmit trace function
-     * \param context the context
-     * \param p the packet
-     * \param protocolType the protocol type
+     * @param context the context
+     * @param p the packet
+     * @param protocolType the protocol type
      */
     void GenericWirelessTxTrace(std::string context,
                                 Ptr<const Packet> p,
                                 ProtocolType protocolType);
     /**
      * Generic wireless receive trace function
-     * \param context the context
-     * \param p the packet
-     * \param protocolType the protocol type
+     * @param context the context
+     * @param p the packet
+     * @param protocolType the protocol type
      */
     void GenericWirelessRxTrace(std::string context,
                                 Ptr<const Packet> p,
@@ -1189,60 +1189,60 @@
     void ConnectLte();
     /**
      * Connect LTE ue function
-     * \param n the node
-     * \param nd the device
-     * \param devIndex the device index
+     * @param n the node
+     * @param nd the device
+     * @param devIndex the device index
      */
     void ConnectLteUe(Ptr<Node> n, Ptr<LteUeNetDevice> nd, uint32_t devIndex);
     /**
      * Connect LTE ENB function
-     * \param n the node
-     * \param nd the device
-     * \param devIndex the device index
+     * @param n the node
+     * @param nd the device
+     * @param devIndex the device index
      */
     void ConnectLteEnb(Ptr<Node> n, Ptr<LteEnbNetDevice> nd, uint32_t devIndex);
 
     // ##### Mobility #####
     /**
      * Get position function
-     * \param n the node
-     * \returns the position vector
+     * @param n the node
+     * @returns the position vector
      */
     Vector GetPosition(Ptr<Node> n);
     /**
      * Update position function
-     * \param n the node
-     * \returns the position vector
+     * @param n the node
+     * @returns the position vector
      */
     Vector UpdatePosition(Ptr<Node> n);
     /**
      * Update position function
-     * \param n the node
-     * \param v the vector
-     * \returns the position vector
+     * @param n the node
+     * @param v the vector
+     * @returns the position vector
      */
     Vector UpdatePosition(Ptr<Node> n, Vector v);
     /**
      * Update position function
-     * \param ndev the device
-     * \returns the position vector
+     * @param ndev the device
+     * @returns the position vector
      */
     Vector UpdatePosition(Ptr<NetDevice> ndev);
     /**
      * Node has moved function
-     * \param n the node
-     * \param newLocation the new location vector
-     * \returns true if the node has moved
+     * @param n the node
+     * @param newLocation the new location vector
+     * @returns true if the node has moved
      */
     bool NodeHasMoved(Ptr<Node> n, Vector newLocation);
     /**
      * Get moved nodes function
-     * \returns the list of moved nodes
+     * @returns the list of moved nodes
      */
     std::vector<Ptr<Node>> GetMovedNodes();
     /**
      * Mobility course change trace function
-     * \param mob the mobility model
+     * @param mob the mobility model
      */
     void MobilityCourseChangeTrace(Ptr<const MobilityModel> mob);
 
@@ -1250,34 +1250,34 @@
 
     /**
      * Write non P2P link properties function
-     * \param id the ID
-     * \param ipv4Address the IP address
-     * \param channelType the channel type
+     * @param id the ID
+     * @param ipv4Address the IP address
+     * @param channelType the channel type
      */
     void WriteNonP2pLinkProperties(uint32_t id, std::string ipv4Address, std::string channelType);
     /**
      * Write node update function
-     * \param nodeId the node ID
+     * @param nodeId the node ID
      */
     void WriteNodeUpdate(uint32_t nodeId);
     /**
      * Output wireless packet transmit info
-     * \param p the packet
-     * \param pktInfo the packet info
-     * \param animUid the UID
+     * @param p the packet
+     * @param pktInfo the packet info
+     * @param animUid the UID
      */
     void OutputWirelessPacketTxInfo(Ptr<const Packet> p, AnimPacketInfo& pktInfo, uint64_t animUid);
     /**
      * Output wireless packet receive info
-     * \param p the packet
-     * \param pktInfo the packet info
-     * \param animUid the UID
+     * @param p the packet
+     * @param pktInfo the packet info
+     * @param animUid the UID
      */
     void OutputWirelessPacketRxInfo(Ptr<const Packet> p, AnimPacketInfo& pktInfo, uint64_t animUid);
     /**
      * Output CSMA packet function
-     * \param p the packet
-     * \param pktInfo the packet info
+     * @param p the packet
+     * @param pktInfo the packet info
      */
     void OutputCsmaPacket(Ptr<const Packet> p, AnimPacketInfo& pktInfo);
     /// Write link properties function
@@ -1296,96 +1296,96 @@
     void WriteNodeEnergies();
     /**
      * Write XML anim function
-     * \param routing the routing
+     * @param routing the routing
      */
     void WriteXmlAnim(bool routing = false);
     /**
      * Write XML update node position function
-     * \param nodeId the node ID
-     * \param x the X position
-     * \param y the Y position
+     * @param nodeId the node ID
+     * @param x the X position
+     * @param y the Y position
      */
     void WriteXmlUpdateNodePosition(uint32_t nodeId, double x, double y);
     /**
      * Write XML update node color function
-     * \param nodeId the node ID
-     * \param r the red color
-     * \param g the green color
-     * \param b the blue color
+     * @param nodeId the node ID
+     * @param r the red color
+     * @param g the green color
+     * @param b the blue color
      */
     void WriteXmlUpdateNodeColor(uint32_t nodeId, uint8_t r, uint8_t g, uint8_t b);
     /**
      * Write XML update node description function
-     * \param nodeId the node ID
+     * @param nodeId the node ID
      */
     void WriteXmlUpdateNodeDescription(uint32_t nodeId);
     /**
      * Write XML update node size function
-     * \param nodeId the node ID
-     * \param width the width
-     * \param height the height
+     * @param nodeId the node ID
+     * @param width the width
+     * @param height the height
      */
     void WriteXmlUpdateNodeSize(uint32_t nodeId, double width, double height);
     /**
      * Write XML add resource function
-     * \param resourceId the resource ID
-     * \param resourcePath the resource path
+     * @param resourceId the resource ID
+     * @param resourcePath the resource path
      */
     void WriteXmlAddResource(uint32_t resourceId, std::string resourcePath);
     /**
      * Write XML add node counter function
-     * \param counterId the counter ID
-     * \param counterName the counter name
-     * \param counterType the counter type
+     * @param counterId the counter ID
+     * @param counterName the counter name
+     * @param counterType the counter type
      */
     void WriteXmlAddNodeCounter(uint32_t counterId,
                                 std::string counterName,
                                 CounterType counterType);
     /**
      * Write XML update node image function
-     * \param nodeId the node ID
-     * \param resourceId the resource ID
+     * @param nodeId the node ID
+     * @param resourceId the resource ID
      */
     void WriteXmlUpdateNodeImage(uint32_t nodeId, uint32_t resourceId);
     /**
      * Write XML update node counter function
-     * \param counterId the counter ID
-     * \param nodeId the node ID
-     * \param value the node counter value
+     * @param counterId the counter ID
+     * @param nodeId the node ID
+     * @param value the node counter value
      */
     void WriteXmlUpdateNodeCounter(uint32_t counterId, uint32_t nodeId, double value);
     /**
      * Write XML node function
-     * \param id the ID
-     * \param sysId the system ID
-     * \param locX the x location
-     * \param locY the y location
+     * @param id the ID
+     * @param sysId the system ID
+     * @param locX the x location
+     * @param locY the y location
      */
     void WriteXmlNode(uint32_t id, uint32_t sysId, double locX, double locY);
     /**
      * Write XML link counter function
-     * \param fromId the from device
-     * \param toLp the to device
-     * \param toId the to ID
+     * @param fromId the from device
+     * @param toLp the to device
+     * @param toId the to ID
      */
     void WriteXmlLink(uint32_t fromId, uint32_t toLp, uint32_t toId);
     /**
      * Write XML update link counter function
-     * \param fromId the from device
-     * \param toId the to device
-     * \param linkDescription the link description
+     * @param fromId the from device
+     * @param toId the to device
+     * @param linkDescription the link description
      */
     void WriteXmlUpdateLink(uint32_t fromId, uint32_t toId, std::string linkDescription);
     /**
      * Write XMLP function
-     * \param pktType the packet type
-     * \param fId the FID
-     * \param fbTx the FB transmit
-     * \param lbTx the LB transmit
-     * \param tId the TID
-     * \param fbRx the FB receive
-     * \param lbRx the LB receive
-     * \param metaInfo the meta info
+     * @param pktType the packet type
+     * @param fId the FID
+     * @param fbTx the FB transmit
+     * @param lbTx the LB transmit
+     * @param tId the TID
+     * @param fbRx the FB receive
+     * @param lbRx the LB receive
+     * @param metaInfo the meta info
      */
     void WriteXmlP(std::string pktType,
                    uint32_t fId,
@@ -1397,55 +1397,55 @@
                    std::string metaInfo = "");
     /**
      * Write XMLP function
-     * \param animUid the UID
-     * \param pktType the packet type
-     * \param fId the FID
-     * \param fbTx the FB transmit
-     * \param lbTx the LB transmit
+     * @param animUid the UID
+     * @param pktType the packet type
+     * @param fId the FID
+     * @param fbTx the FB transmit
+     * @param lbTx the LB transmit
      */
     void WriteXmlP(uint64_t animUid, std::string pktType, uint32_t fId, double fbTx, double lbTx);
     /**
      * Write XMLP Ref function
-     * \param animUid the UID
-     * \param fId the FID
-     * \param fbTx the FB transmit
-     * \param metaInfo the meta info
+     * @param animUid the UID
+     * @param fId the FID
+     * @param fbTx the FB transmit
+     * @param metaInfo the meta info
      */
     void WriteXmlPRef(uint64_t animUid, uint32_t fId, double fbTx, std::string metaInfo = "");
     /**
      * Write XML close function
-     * \param name the name
-     * \param routing true if routing
+     * @param name the name
+     * @param routing true if routing
      */
     void WriteXmlClose(std::string name, bool routing = false);
     /**
      * Write XML non P2P link properties function
-     * \param id the ID
-     * \param ipAddress the IP address
-     * \param channelType the channel type
+     * @param id the ID
+     * @param ipAddress the IP address
+     * @param channelType the channel type
      */
     void WriteXmlNonP2pLinkProperties(uint32_t id, std::string ipAddress, std::string channelType);
     /**
      * Write XML routing function
-     * \param id the ID
-     * \param routingInfo the routing info
+     * @param id the ID
+     * @param routingInfo the routing info
      */
     void WriteXmlRouting(uint32_t id, std::string routingInfo);
     /**
      * Write XMLRP function
-     * \param nodeId the node ID
-     * \param destination the destination
-     * \param rpElements the route path elements
+     * @param nodeId the node ID
+     * @param destination the destination
+     * @param rpElements the route path elements
      */
     void WriteXmlRp(uint32_t nodeId, std::string destination, Ipv4RoutePathElements rpElements);
     /**
      * Write XML update background function
-     * \param fileName the file name
-     * \param x the X value
-     * \param y the Y value
-     * \param scaleX the X scale
-     * \param scaleY the Y scale
-     * \param opacity the opacity
+     * @param fileName the file name
+     * @param x the X value
+     * @param y the Y value
+     * @param scaleX the X scale
+     * @param scaleY the Y scale
+     * @param opacity the opacity
      */
     void WriteXmlUpdateBackground(std::string fileName,
                                   double x,
@@ -1455,22 +1455,22 @@
                                   double opacity);
     /**
      * Write XML Ipv4 addresses function
-     * \param nodeId the node ID
-     * \param ipv4Addresses the list of Ipv4 addresses
+     * @param nodeId the node ID
+     * @param ipv4Addresses the list of Ipv4 addresses
      */
     void WriteXmlIpv4Addresses(uint32_t nodeId, std::vector<std::string> ipv4Addresses);
     /**
      * Write XML Ipv6 addresses function
-     * \param nodeId the node ID
-     * \param ipv6Addresses the list of Ipv6 addresses
+     * @param nodeId the node ID
+     * @param ipv6Addresses the list of Ipv6 addresses
      */
     void WriteXmlIpv6Addresses(uint32_t nodeId, std::vector<std::string> ipv6Addresses);
 };
 
 /**
- * \ingroup netanim
+ * @ingroup netanim
  *
- * \brief Byte tag using by Anim to uniquely identify packets
+ * @brief Byte tag using by Anim to uniquely identify packets
  *
  * When Anim receives a Tx Notification we tag the packet with a unique global uint64_t identifier
  * before recording Tx information
@@ -1481,50 +1481,50 @@
 {
   public:
     /**
-     * \brief Get Type Id
-     * \returns Type Id
+     * @brief Get Type Id
+     * @returns Type Id
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Get Instance Type Id
-     * \returns Type Id
+     * @brief Get Instance Type Id
+     * @returns Type Id
      */
     TypeId GetInstanceTypeId() const override;
 
     /**
-     * \brief Get Serialized Size
-     * \returns Serialized Size (i.e size of uint64_t)
+     * @brief Get Serialized Size
+     * @returns Serialized Size (i.e size of uint64_t)
      */
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Serialize function
-     * \param i Tag Buffer
+     * @brief Serialize function
+     * @param i Tag Buffer
      */
     void Serialize(TagBuffer i) const override;
 
     /**
-     * \brief Deserialize function
-     * \param i Tag Buffer
+     * @brief Deserialize function
+     * @param i Tag Buffer
      */
     void Deserialize(TagBuffer i) override;
 
     /**
-     * \brief Print tag info
-     * \param os Reference of ostream object
+     * @brief Print tag info
+     * @param os Reference of ostream object
      */
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Set global Uid in tag
-     * \param AnimUid global Uid
+     * @brief Set global Uid in tag
+     * @param AnimUid global Uid
      */
     void Set(uint64_t AnimUid);
 
     /**
-     * \brief Get Uid in tag
-     * \returns Uid in tag
+     * @brief Get Uid in tag
+     * @returns Uid in tag
      */
     uint64_t Get() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/netanim/test/netanim-test.cc ns-3.44/src/netanim/test/netanim-test.cc
--- ns-3.43/src/netanim/test/netanim-test.cc	2024-10-09 16:41:10.068656400 -0700
+++ ns-3.44/src/netanim/test/netanim-test.cc	2025-03-09 16:55:49.671372200 -0700
@@ -6,7 +6,9 @@
  * http://wiki.osll.ru/doku.php/start)
  */
 
+#ifndef __WIN32__
 #include "unistd.h"
+#endif
 
 #include "ns3/basic-energy-source.h"
 #include "ns3/core-module.h"
@@ -24,26 +26,26 @@
 using namespace ns3::energy;
 
 /**
- * \ingroup netanim
- * \ingroup tests
- * \defgroup netanim-test animation module tests
+ * @ingroup netanim
+ * @ingroup tests
+ * @defgroup netanim-test animation module tests
  */
 
 /**
- * \ingroup netanim-test
+ * @ingroup netanim-test
  *
- * \brief Abstract Animation Interface Test Case
+ * @brief Abstract Animation Interface Test Case
  */
 class AbstractAnimationInterfaceTestCase : public TestCase
 {
   public:
     /**
-     * \brief Constructor.
-     * \param name testcase name
+     * @brief Constructor.
+     * @param name testcase name
      */
     AbstractAnimationInterfaceTestCase(std::string name);
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
 
     ~AbstractAnimationInterfaceTestCase() override;
@@ -97,19 +99,19 @@
     FILE* fp = fopen(m_traceFileName, "r");
     NS_TEST_ASSERT_MSG_NE(fp, nullptr, "Trace file was not created");
     fclose(fp);
-    unlink(m_traceFileName);
+    remove(m_traceFileName);
 }
 
 /**
- * \ingroup netanim-test
+ * @ingroup netanim-test
  *
- * \brief Animation Interface Test Case
+ * @brief Animation Interface Test Case
  */
 class AnimationInterfaceTestCase : public AbstractAnimationInterfaceTestCase
 {
   public:
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     AnimationInterfaceTestCase();
 
@@ -149,17 +151,17 @@
     UdpEchoServerHelper echoServer(9);
 
     ApplicationContainer serverApps = echoServer.Install(m_nodes.Get(1));
-    serverApps.Start(Seconds(1.0));
-    serverApps.Stop(Seconds(10.0));
+    serverApps.Start(Seconds(1));
+    serverApps.Stop(Seconds(10));
 
     UdpEchoClientHelper echoClient(interfaces.GetAddress(1), 9);
     echoClient.SetAttribute("MaxPackets", UintegerValue(100));
-    echoClient.SetAttribute("Interval", TimeValue(Seconds(1.0)));
+    echoClient.SetAttribute("Interval", TimeValue(Seconds(1)));
     echoClient.SetAttribute("PacketSize", UintegerValue(1024));
 
     ApplicationContainer clientApps = echoClient.Install(m_nodes.Get(0));
-    clientApps.Start(Seconds(2.0));
-    clientApps.Stop(Seconds(10.0));
+    clientApps.Start(Seconds(2));
+    clientApps.Stop(Seconds(10));
 }
 
 void
@@ -169,15 +171,15 @@
 }
 
 /**
- * \ingroup netanim-test
+ * @ingroup netanim-test
  *
- * \brief Animation Remaining Energy Test Case
+ * @brief Animation Remaining Energy Test Case
  */
 class AnimationRemainingEnergyTestCase : public AbstractAnimationInterfaceTestCase
 {
   public:
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      */
     AnimationRemainingEnergyTestCase();
 
@@ -230,9 +232,9 @@
 }
 
 /**
- * \ingroup netanim-test
+ * @ingroup netanim-test
  *
- * \brief Animation Interface Test Suite
+ * @brief Animation Interface Test Suite
  */
 static class AnimationInterfaceTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/doc/error-model.rst ns-3.44/src/network/doc/error-model.rst
--- ns-3.43/src/network/doc/error-model.rst	2024-10-09 16:41:10.068656400 -0700
+++ ns-3.44/src/network/doc/error-model.rst	2025-03-09 16:55:49.671372200 -0700
@@ -15,6 +15,7 @@
 * ListErrorModel
 * ReceiveListErrorModel
 * BurstErrorModel
+* BinaryErrorModel
 
 Error models are used to indicate that a packet should be considered to
 be errored, according to the underlying (possibly stochastic or
@@ -23,15 +24,11 @@
 Model Description
 *****************
 
-The source code for error models live in the directory ``src/packet/utils``.
+The source code for error models live in the directory ``src/network/utils``.
 
 Two types of error models are generally provided.  The first are stochastic
 models.  In this case, packets are errored according to underlying
 random variable distributions.  An example of this is the ``RateErrorModel``.
-The other type of model is a deterministic or empirical model, in which
-packets are errored according to a particular prescribed pattern.
-An example is the ``ListErrorModel`` that allows users to specify
-the list of packets to be errored, by listing the specific packet UIDs.
 
 The ``ns3::RateErrorModel`` errors packets according to an underlying
 random variable distribution, which is by default a UniformRandomVariable
@@ -40,6 +37,17 @@
 to 0.1 and ErrorUnit to "Packet", in the long run, around 10% of the
 packets will be lost.
 
+Another stochastic error model is the ``BurstErrorModel`` which allows
+configuration of (random) burst error drop patterns.
+
+The other type of model is a deterministic model, in which
+packets are errored according to a particular prescribed pattern.
+An example is the ``ListErrorModel`` that allows users to specify
+the list of packets to be errored, by listing the specific packet UIDs.
+A variant of the ``ListErrorModel``, the ``ReceiveListErrorModel``, allows
+users to list packets to be errored by the order of their arrivals (without
+regard to their UIDs).
+The ``BinaryErrorModel`` alternates between errored and error-free packets.
 
 Design
 ======
@@ -59,8 +67,9 @@
 This type of operation will likely be performance-expensive, and existing
 Packet APIs may not easily support it.
 
-The |ns3| spectrum model and devices that derive from it (e.g. LTE) have
-their own error model base class, found in
+Most |ns3| wireless models have their own technology-specific error models
+and do not typically use these packet error models, although some (e.g.,
+Wi-Fi) support the addition of ``ErrorModel`` as an optional model.
 
 References
 ==========
@@ -81,8 +90,7 @@
   always return false.
 * ``bool ErrorModel::IsEnabled () const``:  Return the enabled state
 
-
-Many |ns3| NetDevices contain attributes holding pointers to error
+Several |ns3| NetDevices contain attributes holding pointers to error
 models.  The error model is applied in the notional physical layer
 processing chain of the device, and drops should show up on the ``PhyRxDrop``
 trace source of the device.  The following are known to include an attribute
@@ -100,18 +108,6 @@
 
 This model is typically not used with helpers.
 
-Attributes
-==========
-
-The ``RateErrorModel`` contains the following attributes:
-
-
-Output
-======
-
-What kind of data does the model generate?  What are the key trace
-sources?   What kind of logging output can be enabled?
-
 Examples
 ========
 
@@ -120,8 +116,6 @@
 The directory ``examples/error-model/`` contains an example
 ``simple-error-model.cc`` that exercises the Rate and List error models.
 
-The TCP example ``examples/tcp/tcp-nsc-lfn.cc`` uses the Rate error model.
-
 Troubleshooting
 ===============
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/doc/network.h ns-3.44/src/network/doc/network.h
--- ns-3.43/src/network/doc/network.h	2024-10-09 16:41:10.068656400 -0700
+++ ns-3.44/src/network/doc/network.h	2025-03-09 16:55:49.671372200 -0700
@@ -7,7 +7,7 @@
 #define NETWORK_H
 
 /**
- * \defgroup network Network
+ * @defgroup network Network
  *
  * This section documents the API of the ns-3 network module. For a generic functional description,
  * please refer to the ns-3 manual.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/examples/main-packet-header.cc ns-3.44/src/network/examples/main-packet-header.cc
--- ns-3.43/src/network/examples/main-packet-header.cc	2024-10-09 16:41:10.068656400 -0700
+++ ns-3.44/src/network/examples/main-packet-header.cc	2025-03-09 16:55:49.671372200 -0700
@@ -8,7 +8,7 @@
 using namespace ns3;
 
 /**
- * \ingroup network
+ * @ingroup network
  * A simple example of an Header implementation
  */
 class MyHeader : public Header
@@ -19,18 +19,18 @@
 
     /**
      * Set the header data.
-     * \param data The data.
+     * @param data The data.
      */
     void SetData(uint16_t data);
     /**
      * Get the header data.
-     * \return The data.
+     * @return The data.
      */
     uint16_t GetData() const;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/examples/main-packet-tag.cc ns-3.44/src/network/examples/main-packet-tag.cc
--- ns-3.43/src/network/examples/main-packet-tag.cc	2024-10-09 16:41:10.068656400 -0700
+++ ns-3.44/src/network/examples/main-packet-tag.cc	2025-03-09 16:55:49.671372200 -0700
@@ -15,15 +15,15 @@
 using namespace ns3;
 
 /**
- * \ingroup network
+ * @ingroup network
  * A simple example of an Tag implementation
  */
 class MyTag : public Tag
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -35,12 +35,12 @@
     // these are our accessors to our tag structure
     /**
      * Set the tag value
-     * \param value The tag value.
+     * @param value The tag value.
      */
     void SetSimpleValue(uint8_t value);
     /**
      * Get the tag value
-     * \return the tag value.
+     * @return the tag value.
      */
     uint8_t GetSimpleValue() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/helper/application-container.h ns-3.44/src/network/helper/application-container.h
--- ns-3.43/src/network/helper/application-container.h	2024-10-09 16:41:10.068656400 -0700
+++ ns-3.44/src/network/helper/application-container.h	2025-03-09 16:55:49.671372200 -0700
@@ -19,7 +19,7 @@
 {
 
 /**
- * \brief holds a vector of ns3::Application pointers.
+ * @brief holds a vector of ns3::Application pointers.
  *
  * Typically ns-3 Applications are installed on nodes using an Application
  * helper.  The helper Install method takes a NodeContainer which holds
@@ -42,7 +42,7 @@
      * been previously instantiated.  The single application is specified
      * by a smart pointer.
      *
-     * \param application The Ptr<Application> to add to the container.
+     * @param application The Ptr<Application> to add to the container.
      */
     ApplicationContainer(Ptr<Application> application);
 
@@ -51,7 +51,7 @@
      * been previously instantiated and assigned a name using the Object Name
      * Service.  This Application is then specified by its assigned name.
      *
-     * \param name The name of the Application Object to add to the container.
+     * @param name The name of the Application Object to add to the container.
      */
     ApplicationContainer(std::string name);
 
@@ -59,7 +59,7 @@
     typedef std::vector<Ptr<Application>>::const_iterator Iterator;
 
     /**
-     * \brief Get an iterator which refers to the first Application in the
+     * @brief Get an iterator which refers to the first Application in the
      * container.
      *
      * Applications can be retrieved from the container in two ways.  First,
@@ -67,20 +67,20 @@
      * This method is used in the iterator method and is typically used in a
      * for-loop to run through the Applications
      *
-     * \code
+     * @code
      *   ApplicationContainer::Iterator i;
      *   for (i = container.Begin (); i != container.End (); ++i)
      *     {
      *       (*i)->method ();  // some Application method
      *     }
-     * \endcode
+     * @endcode
      *
-     * \returns an iterator which refers to the first Application in the container.
+     * @returns an iterator which refers to the first Application in the container.
      */
     Iterator Begin() const;
 
     /**
-     * \brief Get an iterator which indicates past-the-last Application in the
+     * @brief Get an iterator which indicates past-the-last Application in the
      * container.
      *
      * Applications can be retrieved from the container in two ways.  First,
@@ -88,20 +88,20 @@
      * This method is used in the iterator method and is typically used in a
      * for-loop to run through the Applications
      *
-     * \code
+     * @code
      *   ApplicationContainer::Iterator i;
      *   for (i = container.Begin (); i != container.End (); ++i)
      *     {
      *       (*i)->method ();  // some Application method
      *     }
-     * \endcode
+     * @endcode
      *
-     * \returns an iterator which indicates an ending condition for a loop.
+     * @returns an iterator which indicates an ending condition for a loop.
      */
     Iterator End() const;
 
     /**
-     * \brief Get the number of Ptr<Application> stored in this container.
+     * @brief Get the number of Ptr<Application> stored in this container.
      *
      * Applications can be retrieved from the container in two ways.  First,
      * directly by an index into the container, and second, using an iterator.
@@ -109,21 +109,21 @@
      * define an ending condition in a for-loop that runs through the stored
      * Applications
      *
-     * \code
+     * @code
      *   uint32_t nApplications = container.GetN ();
      *   for (uint32_t i = 0 i < nApplications; ++i)
      *     {
      *       Ptr<Application> p = container.Get (i)
      *       i->method ();  // some Application method
      *     }
-     * \endcode
+     * @endcode
      *
-     * \returns the number of Ptr<Application> stored in this container.
+     * @returns the number of Ptr<Application> stored in this container.
      */
     uint32_t GetN() const;
 
     /**
-     * \brief Get the Ptr<Application> stored in this container at a given
+     * @brief Get the Ptr<Application> stored in this container at a given
      * index.
      *
      * Applications can be retrieved from the container in two ways.  First,
@@ -131,45 +131,45 @@
      * This method is used in the direct method and is used to retrieve the
      * indexed Ptr<Application>.
      *
-     * \code
+     * @code
      *   uint32_t nApplications = container.GetN ();
      *   for (uint32_t i = 0 i < nApplications; ++i)
      *     {
      *       Ptr<Application> p = container.Get (i)
      *       i->method ();  // some Application method
      *     }
-     * \endcode
+     * @endcode
      *
-     * \param i the index of the requested application pointer.
-     * \returns the requested application pointer.
+     * @param i the index of the requested application pointer.
+     * @returns the requested application pointer.
      */
     Ptr<Application> Get(uint32_t i) const;
 
     /**
-     * \brief Append the contents of another ApplicationContainer to the end of
+     * @brief Append the contents of another ApplicationContainer to the end of
      * this container.
      *
-     * \param other The ApplicationContainer to append.
+     * @param other The ApplicationContainer to append.
      */
     void Add(ApplicationContainer other);
 
     /**
-     * \brief Append a single Ptr<Application> to this container.
+     * @brief Append a single Ptr<Application> to this container.
      *
-     * \param application The Ptr<Application> to append.
+     * @param application The Ptr<Application> to append.
      */
     void Add(Ptr<Application> application);
 
     /**
-     * \brief Append to this container the single Ptr<Application> referred to
+     * @brief Append to this container the single Ptr<Application> referred to
      * via its object name service registered name.
      *
-     * \param name The name of the Application Object to add to the container.
+     * @param name The name of the Application Object to add to the container.
      */
     void Add(std::string name);
 
     /**
-     * \brief Start all of the Applications in this container at the start time
+     * @brief Start all of the Applications in this container at the start time
      * given as a parameter.
      *
      * All Applications need to be provided with a starting simulation time and
@@ -180,25 +180,25 @@
      * This method simply iterates through the contained Applications and calls
      * their Application::SetStartTime() methods with the provided Time.
      *
-     * \param start The Time at which each of the applications should start.
+     * @param start The Time at which each of the applications should start.
      */
     void Start(Time start) const;
 
     /**
-     * \brief Start all of the Applications in this container at the start time
+     * @brief Start all of the Applications in this container at the start time
      * given as a parameter, plus some jitter.
      *
      * This method iterates through the contained Applications and calls
      * their Application::SetStartTime() methods with the provided start Time, plus
      * a jitter value drawn from the provided random variable.
      *
-     * \param start The Time at which each of the applications should start.
-     * \param rv The random variable that adds jitter (units of seconds)
+     * @param start The Time at which each of the applications should start.
+     * @param rv The random variable that adds jitter (units of seconds)
      */
     void StartWithJitter(Time start, Ptr<RandomVariableStream> rv) const;
 
     /**
-     * \brief Arrange for all of the Applications in this container to Stop()
+     * @brief Arrange for all of the Applications in this container to Stop()
      * at the Time given as a parameter.
      *
      * All Applications need to be provided with a starting simulation time and
@@ -209,7 +209,7 @@
      * This method simply iterates through the contained Applications and calls
      * their Application::SetStopTime() methods with the provided Time.
      *
-     * \param stop The Time at which each of the applications should stop.
+     * @param stop The Time at which each of the applications should stop.
      */
     void Stop(Time stop) const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/helper/application-helper.cc ns-3.44/src/network/helper/application-helper.cc
--- ns-3.43/src/network/helper/application-helper.cc	2024-10-09 16:41:10.068656400 -0700
+++ ns-3.44/src/network/helper/application-helper.cc	2025-03-09 16:55:49.671372200 -0700
@@ -8,9 +8,9 @@
 
 #include "application-helper.h"
 
-#include <ns3/data-rate.h>
-#include <ns3/names.h>
-#include <ns3/string.h>
+#include "ns3/data-rate.h"
+#include "ns3/names.h"
+#include "ns3/string.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/helper/application-helper.h ns-3.44/src/network/helper/application-helper.h
--- ns-3.43/src/network/helper/application-helper.h	2024-10-09 16:41:10.068656400 -0700
+++ ns-3.44/src/network/helper/application-helper.h	2025-03-09 16:55:49.671372200 -0700
@@ -12,9 +12,9 @@
 #include "application-container.h"
 #include "node-container.h"
 
-#include <ns3/address.h>
-#include <ns3/attribute.h>
-#include <ns3/object-factory.h>
+#include "ns3/address.h"
+#include "ns3/attribute.h"
+#include "ns3/object-factory.h"
 
 #include <string>
 
@@ -22,7 +22,7 @@
 {
 
 /**
- * \brief A helper to make it easier to instantiate an application on a set of nodes.
+ * @brief A helper to make it easier to instantiate an application on a set of nodes.
  */
 class ApplicationHelper
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/helper/delay-jitter-estimation.h ns-3.44/src/network/helper/delay-jitter-estimation.h
--- ns-3.43/src/network/helper/delay-jitter-estimation.h	2024-10-09 16:41:10.068656400 -0700
+++ ns-3.44/src/network/helper/delay-jitter-estimation.h	2025-03-09 16:55:49.671372200 -0700
@@ -15,9 +15,9 @@
 {
 
 /**
- * \ingroup stats
+ * @ingroup stats
  *
- * \brief Quick and dirty delay and jitter estimation,
+ * @brief Quick and dirty delay and jitter estimation,
  * implementing the jitter algorithm originally from
  * \RFC{1889} (RTP), and unchanged in \RFC{3550}
  *
@@ -38,7 +38,7 @@
      * that it does not use any network resources and is not
      * taken into account in transmission delay calculations.
      *
-     * \param packet the packet to send over a wire
+     * @param packet the packet to send over a wire
      */
     static void PrepareTx(Ptr<const Packet> packet);
 
@@ -47,14 +47,14 @@
      * After a call to this method, \ref GetLastDelay and \ref GetLastJitter
      * will return an updated delay and jitter.
      *
-     * \param packet the packet received
+     * @param packet the packet received
      */
     void RecordRx(Ptr<const Packet> packet);
 
     /**
      * Get the Last Delay object.
      *
-     * \return the updated delay.
+     * @return the updated delay.
      */
     Time GetLastDelay() const;
 
@@ -62,7 +62,7 @@
      * The jitter is calculated using the \RFC{1889} (RTP) jitter
      * definition.
      *
-     * \return the updated jitter.
+     * @return the updated jitter.
      */
     uint64_t GetLastJitter() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/helper/net-device-container.h ns-3.44/src/network/helper/net-device-container.h
--- ns-3.43/src/network/helper/net-device-container.h	2024-10-09 16:41:10.068656400 -0700
+++ ns-3.44/src/network/helper/net-device-container.h	2025-03-09 16:55:49.671372200 -0700
@@ -17,7 +17,7 @@
 {
 
 /**
- * \brief holds a vector of ns3::NetDevice pointers
+ * @brief holds a vector of ns3::NetDevice pointers
  *
  * Typically ns-3 NetDevices are installed on nodes using a net device
  * helper.  The helper Install method takes a NodeContainer which holds
@@ -40,7 +40,7 @@
     NetDeviceContainer();
 
     /**
-     * \param dev a device to add to the container
+     * @param dev a device to add to the container
      *
      * Create a NetDeviceContainer with exactly one net device that has previously
      * been instantiated
@@ -52,20 +52,20 @@
      * previously instantiated and assigned a name using the Object name
      * service.  This NetDevice is specified by its assigned name.
      *
-     * \param devName The name of the device to add to the container
+     * @param devName The name of the device to add to the container
      *
      * Create a NetDeviceContainer with exactly one device
      */
     NetDeviceContainer(std::string devName);
 
     /**
-     * \param a a device container
-     * \param b another device container
+     * @param a a device container
+     * @param b another device container
      *
      * Create a device container which is a concatenation of the two input
      * NetDeviceContainers.
      *
-     * \note A frequently seen idiom that uses these constructors involves the
+     * @note A frequently seen idiom that uses these constructors involves the
      * implicit conversion by constructor of Ptr<NetDevice>.  When used, two
      * Ptr<NetDevice> will be passed to this constructor instead of NetDeviceContainer&.
      * C++ will notice the implicit conversion path that goes through the
@@ -76,7 +76,7 @@
     NetDeviceContainer(const NetDeviceContainer& a, const NetDeviceContainer& b);
 
     /**
-     * \brief Get an iterator which refers to the first NetDevice in the
+     * @brief Get an iterator which refers to the first NetDevice in the
      * container.
      *
      * NetDevices can be retrieved from the container in two ways.  First,
@@ -84,20 +84,20 @@
      * This method is used in the iterator method and is typically used in a
      * for-loop to run through the NetDevices
      *
-     * \code
+     * @code
      *   NetDeviceContainer::Iterator i;
      *   for (i = container.Begin (); i != container.End (); ++i)
      *     {
      *       (*i)->method ();  // some NetDevice method
      *     }
-     * \endcode
+     * @endcode
      *
-     * \returns an iterator which refers to the first NetDevice in the container.
+     * @returns an iterator which refers to the first NetDevice in the container.
      */
     Iterator Begin() const;
 
     /**
-     * \brief Get an iterator which indicates past-the-last NetDevice in the
+     * @brief Get an iterator which indicates past-the-last NetDevice in the
      * container.
      *
      * NetDevices can be retrieved from the container in two ways.  First,
@@ -105,20 +105,20 @@
      * This method is used in the iterator method and is typically used in a
      * for-loop to run through the NetDevices
      *
-     * \code
+     * @code
      *   NetDeviceContainer::Iterator i;
      *   for (i = container.Begin (); i != container.End (); ++i)
      *     {
      *       (*i)->method ();  // some NetDevice method
      *     }
-     * \endcode
+     * @endcode
      *
-     * \returns an iterator which indicates an ending condition for a loop.
+     * @returns an iterator which indicates an ending condition for a loop.
      */
     Iterator End() const;
 
     /**
-     * \brief Get the number of Ptr<NetDevice> stored in this container.
+     * @brief Get the number of Ptr<NetDevice> stored in this container.
      *
      * NetDevices can be retrieved from the container in two ways.  First,
      * directly by an index into the container, and second, using an iterator.
@@ -126,21 +126,21 @@
      * define an ending condition in a for-loop that runs through the stored
      * NetDevices
      *
-     * \code
+     * @code
      *   uint32_t nDevices = container.GetN ();
      *   for (uint32_t i = 0 i < nDevices; ++i)
      *     {
      *       Ptr<NetDevice> p = container.Get (i)
      *       i->method ();  // some NetDevice method
      *     }
-     * \endcode
+     * @endcode
      *
-     * \returns the number of Ptr<NetDevice> stored in this container.
+     * @returns the number of Ptr<NetDevice> stored in this container.
      */
     uint32_t GetN() const;
 
     /**
-     * \brief Get the Ptr<NetDevice> stored in this container at a given
+     * @brief Get the Ptr<NetDevice> stored in this container at a given
      * index.
      *
      * NetDevices can be retrieved from the container in two ways.  First,
@@ -148,40 +148,40 @@
      * This method is used in the direct method and is used to retrieve the
      * indexed Ptr<NetDevice>.
      *
-     * \code
+     * @code
      *   uint32_t nDevices = container.GetN ();
      *   for (uint32_t i = 0 i < nDevices; ++i)
      *     {
      *       Ptr<NetDevice> p = container.Get (i)
      *       i->method ();  // some NetDevice method
      *     }
-     * \endcode
+     * @endcode
      *
-     * \param i the index of the requested device pointer.
-     * \returns the requested device pointer.
+     * @param i the index of the requested device pointer.
+     * @returns the requested device pointer.
      */
     Ptr<NetDevice> Get(uint32_t i) const;
 
     /**
-     * \brief Append the contents of another NetDeviceContainer to the end of
+     * @brief Append the contents of another NetDeviceContainer to the end of
      * this container.
      *
-     * \param other The NetDeviceContainer to append.
+     * @param other The NetDeviceContainer to append.
      */
     void Add(NetDeviceContainer other);
 
     /**
-     * \brief Append a single Ptr<NetDevice> to this container.
+     * @brief Append a single Ptr<NetDevice> to this container.
      *
-     * \param device The Ptr<NetDevice> to append.
+     * @param device The Ptr<NetDevice> to append.
      */
     void Add(Ptr<NetDevice> device);
 
     /**
-     * \brief Append to this container the single Ptr<NetDevice> referred to
+     * @brief Append to this container the single Ptr<NetDevice> referred to
      * via its object name service registered name.
      *
-     * \param deviceName The name of the NetDevice Object to add to the container.
+     * @param deviceName The name of the NetDevice Object to add to the container.
      */
     void Add(std::string deviceName);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/helper/node-container.h ns-3.44/src/network/helper/node-container.h
--- ns-3.43/src/network/helper/node-container.h	2024-10-09 16:41:10.068656400 -0700
+++ ns-3.44/src/network/helper/node-container.h	2025-03-09 16:55:49.671372200 -0700
@@ -17,7 +17,7 @@
 {
 
 /**
- * \brief keep track of a set of node pointers.
+ * @brief keep track of a set of node pointers.
  *
  * Typically ns-3 helpers operate on more than one node at a time.  For example
  * a device helper may want to install devices on a large number of similar
@@ -32,7 +32,7 @@
     typedef std::vector<Ptr<Node>>::const_iterator Iterator;
 
     /**
-     * \brief Create a NodeContainer that contains a list of _all_ nodes
+     * @brief Create a NodeContainer that contains a list of _all_ nodes
      * created through NodeContainer::Create() and stored in the
      * ns3::NodeList.
      *
@@ -41,7 +41,7 @@
      * nodes in one place.  This method creates a NodeContainer that is
      * initialized to contain all of the simulation nodes,
      *
-     * \returns a NodeContainer which contains a list of all Nodes.
+     * @returns a NodeContainer which contains a list of all Nodes.
      */
     static NodeContainer GetGlobal();
 
@@ -54,7 +54,7 @@
      * Create a NodeContainer with exactly one node which has been previously
      * instantiated.  The single Node is specified by a smart pointer.
      *
-     * \param node The Ptr<Node> to add to the container.
+     * @param node The Ptr<Node> to add to the container.
      */
     NodeContainer(Ptr<Node> node);
 
@@ -63,7 +63,7 @@
      * instantiated and assigned a name using the Object Name Service.  This
      * Node is then specified by its assigned name.
      *
-     * \param nodeName The name of the Node Object to add to the container.
+     * @param nodeName The name of the Node Object to add to the container.
      */
     NodeContainer(std::string nodeName);
 
@@ -72,14 +72,14 @@
      *
      * This is syntactic sugar for
      *
-     * \code
+     * @code
      *   NodeContainer nodes;
      *   nodes.Create (size);
      *   // or nodes.Create (size, systemId);
-     * \endcode
+     * @endcode
      *
-     * \param [in] n The number of nodes to create.
-     * \param [in] systemId The system id or rank associated with this node
+     * @param [in] n The number of nodes to create.
+     * @param [in] systemId The system id or rank associated with this node
      */
     explicit NodeContainer(uint32_t n, uint32_t systemId = 0);
 
@@ -87,12 +87,12 @@
      * Create a node container which is a concatenation of multiple input
      * NodeContainers.
      *
-     * \tparam Ts \deduced Template type parameter pack for the multiple
+     * @tparam Ts \deduced Template type parameter pack for the multiple
      *         NodeContainers
-     * \param nc The first NodeContainer
-     * \param args The remaining NodeContainers
+     * @param nc The first NodeContainer
+     * @param args The remaining NodeContainers
      *
-     * \note A frequently seen idiom that uses these constructors involves the
+     * @note A frequently seen idiom that uses these constructors involves the
      * implicit conversion by constructor of Ptr<Node>.  When used, Ptr<Node>
      * will be passed to this constructor instead of NodeContainer&.
      * C++ will notice the implicit conversion path that goes through the
@@ -103,7 +103,7 @@
     NodeContainer(const NodeContainer& nc, Ts&&... args);
 
     /**
-     * \brief Get an iterator which refers to the first Node in the
+     * @brief Get an iterator which refers to the first Node in the
      * container.
      *
      * Nodes can be retrieved from the container in two ways.  First,
@@ -111,20 +111,20 @@
      * This method is used in the iterator method and is typically used in a
      * for-loop to run through the Nodes
      *
-     * \code
+     * @code
      *   NodeContainer::Iterator i;
      *   for (i = container.Begin (); i != container.End (); ++i)
      *     {
      *       (*i)->method ();  // some Node method
      *     }
-     * \endcode
+     * @endcode
      *
-     * \returns an iterator which refers to the first Node in the container.
+     * @returns an iterator which refers to the first Node in the container.
      */
     Iterator Begin() const;
 
     /**
-     * \brief Get an iterator which indicates past-the-last Node in the
+     * @brief Get an iterator which indicates past-the-last Node in the
      * container.
      *
      * Nodes can be retrieved from the container in two ways.  First,
@@ -132,20 +132,20 @@
      * This method is used in the iterator method and is typically used in a
      * for-loop to run through the Nodes
      *
-     * \code
+     * @code
      *   NodeContainer::Iterator i;
      *   for (i = container.Begin (); i != container.End (); ++i)
      *     {
      *       (*i)->method ();  // some Node method
      *     }
-     * \endcode
+     * @endcode
      *
-     * \returns an iterator which indicates an ending condition for a loop.
+     * @returns an iterator which indicates an ending condition for a loop.
      */
     Iterator End() const;
 
     /**
-     * \brief Get the number of Ptr<Node> stored in this container.
+     * @brief Get the number of Ptr<Node> stored in this container.
      *
      * Nodes can be retrieved from the container in two ways.  First,
      * directly by an index into the container, and second, using an iterator.
@@ -153,21 +153,21 @@
      * define an ending condition in a for-loop that runs through the stored
      * Nodes
      *
-     * \code
+     * @code
      *   uint32_t nNodes = container.GetN ();
      *   for (uint32_t i = 0; i < nNodes; ++i)
      *     {
      *       Ptr<Node> p = container.Get (i);
      *       i->method ();  // some Node method
      *     }
-     * \endcode
+     * @endcode
      *
-     * \returns the number of Ptr<Node> stored in this container.
+     * @returns the number of Ptr<Node> stored in this container.
      */
     uint32_t GetN() const;
 
     /**
-     * \brief Get the Ptr<Node> stored in this container at a given
+     * @brief Get the Ptr<Node> stored in this container at a given
      * index.
      *
      * Nodes can be retrieved from the container in two ways.  First,
@@ -175,34 +175,34 @@
      * This method is used in the direct method and is used to retrieve the
      * indexed Ptr<Node>.
      *
-     * \code
+     * @code
      *   uint32_t nNodes = container.GetN ();
      *   for (uint32_t i = 0; i < nNodes; ++i)
      *     {
      *       Ptr<Node> p = container.Get (i);
      *       i->method ();  // some Node method
      *     }
-     * \endcode
+     * @endcode
      *
-     * \param i the index of the requested node pointer.
-     * \returns the requested node pointer.
+     * @param i the index of the requested node pointer.
+     * @returns the requested node pointer.
      */
     Ptr<Node> Get(uint32_t i) const;
 
     /**
-     * \brief Create n nodes and append pointers to them to the end of this
+     * @brief Create n nodes and append pointers to them to the end of this
      * NodeContainer.
      *
      * Nodes are at the heart of any ns-3 simulation.  One of the first tasks that
      * any simulation needs to do is to create a number of nodes.  This method
      * automates that task.
      *
-     * \param n The number of Nodes to create
+     * @param n The number of Nodes to create
      */
     void Create(uint32_t n);
 
     /**
-     * \brief Create n nodes with specified systemId for distributed simulations
+     * @brief Create n nodes with specified systemId for distributed simulations
      * and append pointers to them to the end of this NodeContainer.
      *
      * Nodes are at the heart of any ns-3 simulation.  One of the first tasks that
@@ -210,51 +210,51 @@
      * automates that task, and adds the ability to specify systemId for
      * distributed simulations.
      *
-     * \param n The number of Nodes to create
-     * \param systemId The system id or rank associated with this node
+     * @param n The number of Nodes to create
+     * @param systemId The system id or rank associated with this node
      */
     void Create(uint32_t n, uint32_t systemId);
 
     /**
-     * \brief Append the contents of another NodeContainer to the end of
+     * @brief Append the contents of another NodeContainer to the end of
      * this container.
      *
-     * \param nc The NodeContainer to append.
+     * @param nc The NodeContainer to append.
      */
     void Add(const NodeContainer& nc);
 
     /**
-     * \brief Append the contents of another NodeContainer to the end of
+     * @brief Append the contents of another NodeContainer to the end of
      * this container.
      *
-     * \tparam Ts \deduced Template type parameter pack for the multiple
+     * @tparam Ts \deduced Template type parameter pack for the multiple
      *         NodeContainer
-     * \param nc The NodeContainer to append
-     * \param args The remaining NodeContainers to append
+     * @param nc The NodeContainer to append
+     * @param args The remaining NodeContainers to append
      */
     template <typename... Ts>
     void Add(const NodeContainer& nc, Ts&&... args);
 
     /**
-     * \brief Append a single Ptr<Node> to this container.
+     * @brief Append a single Ptr<Node> to this container.
      *
-     * \param node The Ptr<Node> to append.
+     * @param node The Ptr<Node> to append.
      */
     void Add(Ptr<Node> node);
 
     /**
-     * \brief Append to this container the single Ptr<Node> referred to
+     * @brief Append to this container the single Ptr<Node> referred to
      * via its object name service registered name.
      *
-     * \param nodeName The name of the Node Object to add to the container.
+     * @param nodeName The name of the Node Object to add to the container.
      */
     void Add(std::string nodeName);
 
     /**
-     * \brief Return true if container contains a Node with index id
+     * @brief Return true if container contains a Node with index id
      *
-     * \param id Node Id
-     * \return whether the NodeContainer contains a node with index id
+     * @param id Node Id
+     * @return whether the NodeContainer contains a node with index id
      */
     bool Contains(uint32_t id) const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/helper/packet-socket-helper.h ns-3.44/src/network/helper/packet-socket-helper.h
--- ns-3.43/src/network/helper/packet-socket-helper.h	2024-10-09 16:41:10.068656400 -0700
+++ ns-3.44/src/network/helper/packet-socket-helper.h	2025-03-09 16:55:49.671372200 -0700
@@ -15,7 +15,7 @@
 {
 
 /**
- * \brief Give ns3::PacketSocket powers to ns3::Node.
+ * @brief Give ns3::PacketSocket powers to ns3::Node.
  */
 class PacketSocketHelper
 {
@@ -24,7 +24,7 @@
      * Aggregate an instance of a ns3::PacketSocketFactory onto the provided
      * node.
      *
-     * \param node Node on which to aggregate the ns3::PacketSocketFactory.
+     * @param node Node on which to aggregate the ns3::PacketSocketFactory.
      */
     void Install(Ptr<Node> node) const;
 
@@ -32,7 +32,7 @@
      * Aggregate an instance of a ns3::PacketSocketFactory onto the provided
      * node.
      *
-     * \param nodeName The name of the node on which to aggregate the ns3::PacketSocketFactory.
+     * @param nodeName The name of the node on which to aggregate the ns3::PacketSocketFactory.
      */
     void Install(std::string nodeName) const;
 
@@ -40,7 +40,7 @@
      * For each node in the provided container, aggregate an instance of a
      * ns3::PacketSocketFactory.
      *
-     * \param c NodeContainer of the set of nodes to aggregate the
+     * @param c NodeContainer of the set of nodes to aggregate the
      * ns3::PacketSocketFactory on.
      */
     void Install(NodeContainer c) const;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/helper/simple-net-device-helper.h ns-3.44/src/network/helper/simple-net-device-helper.h
--- ns-3.43/src/network/helper/simple-net-device-helper.h	2024-10-09 16:41:10.068656400 -0700
+++ ns-3.44/src/network/helper/simple-net-device-helper.h	2025-03-09 16:55:49.671372200 -0700
@@ -22,7 +22,7 @@
 {
 
 /**
- * \brief build a set of SimpleNetDevice objects
+ * @brief build a set of SimpleNetDevice objects
  */
 class SimpleNetDeviceHelper
 {
@@ -41,9 +41,9 @@
      * This method allows one to set the type of the queue that is automatically
      * created when the device is created and attached to a node.
      *
-     * \tparam Ts \deduced Argument types
-     * \param type the type of queue
-     * \param [in] args Name and AttributeValue pairs to set.
+     * @tparam Ts \deduced Argument types
+     * @param type the type of queue
+     * @param [in] args Name and AttributeValue pairs to set.
      *
      * Set the type of queue to create and associated to each
      * SimpleNetDevice created through SimpleNetDeviceHelper::Install.
@@ -56,9 +56,9 @@
      * This method allows one to set the type of the channel that is automatically
      * created when the device is created and attached to a node.
      *
-     * \tparam Ts \deduced Argument types
-     * \param type the type of channel
-     * \param [in] args Name and AttributeValue pairs to set.
+     * @tparam Ts \deduced Argument types
+     * @param type the type of channel
+     * @param [in] args Name and AttributeValue pairs to set.
      *
      * Set the type of channel to create and associated to each
      * SimpleNetDevice created through SimpleNetDeviceHelper::Install.
@@ -67,8 +67,8 @@
     void SetChannel(std::string type, Ts&&... args);
 
     /**
-     * \param n1 the name of the attribute to set
-     * \param v1 the value of the attribute to set
+     * @param n1 the name of the attribute to set
+     * @param v1 the value of the attribute to set
      *
      * Set these attributes on each ns3::SimpleNetDevice created
      * by SimpleNetDeviceHelper::Install
@@ -76,8 +76,8 @@
     void SetDeviceAttribute(std::string n1, const AttributeValue& v1);
 
     /**
-     * \param n1 the name of the attribute to set
-     * \param v1 the value of the attribute to set
+     * @param n1 the name of the attribute to set
+     * @param v1 the value of the attribute to set
      *
      * Set these attributes on each ns3::CsmaChannel created
      * by SimpleNetDeviceHelper::Install
@@ -89,9 +89,9 @@
      * limits the number of SimpleNetDevices on one channel to two, disables
      * Broadcast and ARP and enables PointToPoint mode.
      *
-     * \warning It must be used before installing a NetDevice on a node.
+     * @warning It must be used before installing a NetDevice on a node.
      *
-     * \param pointToPointMode True for PointToPoint SimpleNetDevice
+     * @param pointToPointMode True for PointToPoint SimpleNetDevice
      */
     void SetNetDevicePointToPointMode(bool pointToPointMode);
 
@@ -111,8 +111,8 @@
      * configured by SimpleNetDeviceHelper::SetDeviceAttribute and then adds the device
      * to the node and attaches the channel to the device.
      *
-     * \param node The node to install the device in
-     * \returns A container holding the added net device.
+     * @param node The node to install the device in
+     * @returns A container holding the added net device.
      */
     NetDeviceContainer Install(Ptr<Node> node) const;
 
@@ -121,9 +121,9 @@
      * SimpleNetDeviceHelper::SetDeviceAttribute and then adds the device to the node and
      * attaches the provided channel to the device.
      *
-     * \param node The node to install the device in
-     * \param channel The channel to attach to the device.
-     * \returns A container holding the added net device.
+     * @param node The node to install the device in
+     * @param channel The channel to attach to the device.
+     * @returns A container holding the added net device.
      */
     NetDeviceContainer Install(Ptr<Node> node, Ptr<SimpleChannel> channel) const;
 
@@ -134,8 +134,8 @@
      * configured by SimpleNetDeviceHelper::SetDeviceAttribute); adds the device to the
      * node; and attaches the channel to the device.
      *
-     * \param c The NodeContainer holding the nodes to be changed.
-     * \returns A container holding the added net devices.
+     * @param c The NodeContainer holding the nodes to be changed.
+     * @returns A container holding the added net devices.
      */
     NetDeviceContainer Install(const NodeContainer& c) const;
 
@@ -145,9 +145,9 @@
      * SimpleNetDeviceHelper::SetDeviceAttribute); adds the device to the node; and attaches
      * the provided channel to the device.
      *
-     * \param c The NodeContainer holding the nodes to be changed.
-     * \param channel The channel to attach to the devices.
-     * \returns A container holding the added net devices.
+     * @param c The NodeContainer holding the nodes to be changed.
+     * @param channel The channel to attach to the devices.
+     * @returns A container holding the added net devices.
      */
     NetDeviceContainer Install(const NodeContainer& c, Ptr<SimpleChannel> channel) const;
 
@@ -157,9 +157,9 @@
      * SimpleNetDeviceHelper::SetDeviceAttribute and then adds the device to the node and
      * attaches the provided channel to the device.
      *
-     * \param node The node to install the device in
-     * \param channel The channel to attach to the device.
-     * \returns The new net device.
+     * @param node The node to install the device in
+     * @param channel The channel to attach to the device.
+     * @returns The new net device.
      */
     Ptr<NetDevice> InstallPriv(Ptr<Node> node, Ptr<SimpleChannel> channel) const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/helper/trace-helper.h ns-3.44/src/network/helper/trace-helper.h
--- ns-3.43/src/network/helper/trace-helper.h	2024-10-09 16:41:10.068656400 -0700
+++ ns-3.44/src/network/helper/trace-helper.h	2025-03-09 16:55:49.671372200 -0700
@@ -19,7 +19,7 @@
 {
 
 /**
- * \brief Manage pcap files for device models
+ * @brief Manage pcap files for device models
  *
  * Handling pcap files is a common operation for ns-3 devices.  It is useful to
  * provide a common base class for dealing with these ops.
@@ -153,7 +153,7 @@
 }
 
 /**
- * \brief Manage ASCII trace files for device models
+ * @brief Manage ASCII trace files for device models
  *
  * Handling ascii trace files is a common operation for ns-3 devices.  It is
  * useful to provide a common base class for dealing with these ops.
@@ -606,7 +606,7 @@
 }
 
 /**
- * \brief Base class providing common user-level pcap operations for helpers
+ * @brief Base class providing common user-level pcap operations for helpers
  * representing net devices.
  */
 class PcapHelperForDevice
@@ -680,9 +680,9 @@
      * @brief Enable pcap output on each device (which is of the appropriate type)
      * in the nodes provided in the container.
      *
-     * \param prefix Filename prefix to use for pcap files.
-     * \param n container of nodes.
-     * \param promiscuous If true capture all possible packets available at the device.
+     * @param prefix Filename prefix to use for pcap files.
+     * @param n container of nodes.
+     * @param promiscuous If true capture all possible packets available at the device.
      */
     void EnablePcap(std::string prefix, NodeContainer n, bool promiscuous = false);
 
@@ -711,7 +711,7 @@
 };
 
 /**
- * \brief Base class providing common user-level ascii trace operations for helpers
+ * @brief Base class providing common user-level ascii trace operations for helpers
  * representing net devices.
  */
 class AsciiTraceHelperForDevice
@@ -820,8 +820,8 @@
      * @brief Enable ascii trace output on each device (which is of the
      * appropriate type) in the nodes provided in the container.
      *
-     * \param prefix Filename prefix to use for ascii files.
-     * \param n container of nodes.
+     * @param prefix Filename prefix to use for ascii files.
+     * @param n container of nodes.
      */
     void EnableAscii(std::string prefix, NodeContainer n);
 
@@ -831,7 +831,7 @@
      *
      * @param stream An OutputStreamWrapper representing an existing file to use
      *               when writing trace data.
-     * \param n container of nodes.
+     * @param n container of nodes.
      */
     void EnableAscii(Ptr<OutputStreamWrapper> stream, NodeContainer n);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/model/address.cc ns-3.44/src/network/model/address.cc
--- ns-3.43/src/network/model/address.cc	2024-10-09 16:41:10.068656400 -0700
+++ ns-3.44/src/network/model/address.cc	2025-03-09 16:55:49.671372200 -0700
@@ -119,7 +119,7 @@
 {
     NS_LOG_FUNCTION(this << static_cast<uint32_t>(type) << static_cast<uint32_t>(len));
     NS_ASSERT(len <= MAX_SIZE);
-    /// \internal
+    /// @internal
     /// Mac address type/length detection is discussed in \bugid{1568}
     return (m_len == len && m_type == type) || (m_len >= len && m_type == 0);
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/model/address.h ns-3.44/src/network/model/address.h
--- ns-3.43/src/network/model/address.h	2024-10-09 16:41:10.068656400 -0700
+++ ns-3.44/src/network/model/address.h	2025-03-09 16:55:49.671372200 -0700
@@ -21,14 +21,14 @@
 {
 
 /**
- * \ingroup network
- * \defgroup address Address
+ * @ingroup network
+ * @defgroup address Address
  *
  * Network Address abstractions, including MAC, IPv4 and IPv6.
  */
 /**
- * \ingroup address
- * \brief a polymophic address class
+ * @ingroup address
+ * @brief a polymophic address class
  *
  * This class is very similar in design and spirit to the BSD sockaddr
  * structure: they are both used to hold multiple types of addresses
@@ -47,7 +47,7 @@
  *     input Address instance is compatible with its own type.
  *
  * Typical code to create a new class type looks like:
- * \code
+ * @code
  * // this class represents addresses which are 2 bytes long.
  * class MyAddress
  * {
@@ -74,17 +74,17 @@
  *   static uint8_t type = Address::Register ();
  *   return type;
  * }
- * \endcode
+ * @endcode
  *
  * To convert a specific Address T (e.g., Ipv6Address) to and from an Address type,
  * a class must implement three public functions:
- * \code
+ * @code
  * static T ConvertFrom(const Address& address);
  * Address ConvertTo() const;
  * operator Address() const;
- * \endcode
+ * @endcode
  *
- * \see attribute_Address
+ * @see attribute_Address
  */
 class Address
 {
@@ -100,33 +100,33 @@
      */
     Address();
     /**
-     * \brief Create an address from a type and a buffer.
+     * @brief Create an address from a type and a buffer.
      *
      * This constructor is typically invoked from the conversion
      * functions of various address types when they have to
      * convert themselves to an Address instance.
      *
-     * \param type the type of the Address to create
-     * \param buffer a pointer to a buffer of bytes which hold
+     * @param type the type of the Address to create
+     * @param buffer a pointer to a buffer of bytes which hold
      *        a serialized representation of the address in network
      *        byte order.
-     * \param len the length of the buffer.
+     * @param len the length of the buffer.
      */
     Address(uint8_t type, const uint8_t* buffer, uint8_t len);
     /**
-     * \brief Create an address from another address.
-     * \param address the address to copy
+     * @brief Create an address from another address.
+     * @param address the address to copy
      */
     Address(const Address& address);
     /**
-     * \brief Basic assignment operator.
-     * \param address the address to copy
-     * \returns the address
+     * @brief Basic assignment operator.
+     * @param address the address to copy
+     * @returns the address
      */
     Address& operator=(const Address& address);
 
     /**
-     * \returns true if this address is invalid, false otherwise.
+     * @returns true if this address is invalid, false otherwise.
      *
      * An address is invalid if and only if it was created
      * through the default constructor and it was never
@@ -134,20 +134,20 @@
      */
     bool IsInvalid() const;
     /**
-     * \brief Get the length of the underlying address.
-     * \returns the length of the underlying address.
+     * @brief Get the length of the underlying address.
+     * @returns the length of the underlying address.
      */
     uint8_t GetLength() const;
     /**
-     * \brief Copy the address bytes into a buffer.
-     * \param buffer buffer to copy the address bytes to.
-     * \returns the number of bytes copied.
+     * @brief Copy the address bytes into a buffer.
+     * @param buffer buffer to copy the address bytes to.
+     * @returns the number of bytes copied.
      */
     uint32_t CopyTo(uint8_t buffer[MAX_SIZE]) const;
     /**
-     * \param buffer buffer to copy the whole address data structure to
-     * \param len the size of the buffer
-     * \returns the number of bytes copied.
+     * @param buffer buffer to copy the whole address data structure to
+     * @param len the size of the buffer
+     * @returns the number of bytes copied.
      *
      * Copies the type to buffer[0], the length of the address internal buffer
      * to buffer[1] and copies the internal buffer starting at buffer[2].  len
@@ -156,38 +156,38 @@
      */
     uint32_t CopyAllTo(uint8_t* buffer, uint8_t len) const;
     /**
-     * \param buffer pointer to a buffer of bytes which contain
+     * @param buffer pointer to a buffer of bytes which contain
      *        a serialized representation of the address in network
      *        byte order.
-     * \param len length of buffer
-     * \returns the number of bytes copied.
+     * @param len length of buffer
+     * @returns the number of bytes copied.
      *
      * Copy the address bytes from buffer into to the internal buffer of this
      * address instance.
      */
     uint32_t CopyFrom(const uint8_t* buffer, uint8_t len);
     /**
-     * \param buffer pointer to a buffer of bytes which contain
+     * @param buffer pointer to a buffer of bytes which contain
      *        a copy of all the members of this Address class.
-     * \param len the length of the buffer
-     * \returns the number of bytes copied.
+     * @param len the length of the buffer
+     * @returns the number of bytes copied.
      *
      * The inverse of CopyAllTo().
      *
-     * \see CopyAllTo
+     * @see CopyAllTo
      */
     uint32_t CopyAllFrom(const uint8_t* buffer, uint8_t len);
     /**
-     * \param type a type id as returned by Address::Register
-     * \param len the length associated to this type id.
+     * @param type a type id as returned by Address::Register
+     * @param len the length associated to this type id.
      *
-     * \returns true if the type of the address stored internally
+     * @returns true if the type of the address stored internally
      * is compatible with the requested type, false otherwise.
      */
     bool CheckCompatible(uint8_t type, uint8_t len) const;
     /**
-     * \param type a type id as returned by Address::Register
-     * \returns true if the type of the address stored internally
+     * @param type a type id as returned by Address::Register
+     * @returns true if the type of the address stored internally
      * is compatible with the requested type, false otherwise.
      *
      * This method checks that the types are _exactly_ equal.
@@ -198,24 +198,24 @@
     bool IsMatchingType(uint8_t type) const;
     /**
      * Allocate a new type id for a new type of address.
-     * \returns a new type id.
+     * @returns a new type id.
      */
     static uint8_t Register();
     /**
      * Get the number of bytes needed to serialize the underlying Address
      * Typically, this is GetLength () + 2
      *
-     * \returns the number of bytes required for an Address in serialized form
+     * @returns the number of bytes required for an Address in serialized form
      */
     uint32_t GetSerializedSize() const;
     /**
      * Serialize this address in host byte order to a byte buffer
      *
-     * \param buffer output buffer that gets written with this Address
+     * @param buffer output buffer that gets written with this Address
      */
     void Serialize(TagBuffer buffer) const;
     /**
-     * \param buffer buffer to read address from
+     * @param buffer buffer to read address from
      *
      * The input address buffer is expected to be in host byte order format.
      */
@@ -223,47 +223,47 @@
 
   private:
     /**
-     * \brief Equal to operator.
+     * @brief Equal to operator.
      *
-     * \param a the first operand
-     * \param b the first operand
-     * \returns true if the operands are equal
+     * @param a the first operand
+     * @param b the first operand
+     * @returns true if the operands are equal
      */
     friend bool operator==(const Address& a, const Address& b);
 
     /**
-     * \brief Not equal to operator.
+     * @brief Not equal to operator.
      *
-     * \param a the first operand
-     * \param b the first operand
-     * \returns true if the operands are not equal
+     * @param a the first operand
+     * @param b the first operand
+     * @returns true if the operands are not equal
      */
     friend bool operator!=(const Address& a, const Address& b);
 
     /**
-     * \brief Less than operator.
+     * @brief Less than operator.
      *
-     * \param a the first operand
-     * \param b the first operand
-     * \returns true if the operand a is less than operand b
+     * @param a the first operand
+     * @param b the first operand
+     * @returns true if the operand a is less than operand b
      */
     friend bool operator<(const Address& a, const Address& b);
 
     /**
-     * \brief Stream insertion operator.
+     * @brief Stream insertion operator.
      *
-     * \param os the stream
-     * \param address the address
-     * \returns a reference to the stream
+     * @param os the stream
+     * @param address the address
+     * @returns a reference to the stream
      */
     friend std::ostream& operator<<(std::ostream& os, const Address& address);
 
     /**
-     * \brief Stream extraction operator.
+     * @brief Stream extraction operator.
      *
-     * \param is the stream
-     * \param address the address
-     * \returns a reference to the stream
+     * @param is the stream
+     * @param address the address
+     * @returns a reference to the stream
      */
     friend std::istream& operator>>(std::istream& is, Address& address);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/model/application.cc ns-3.44/src/network/model/application.cc
--- ns-3.43/src/network/model/application.cc	2024-10-09 16:41:10.068656400 -0700
+++ ns-3.44/src/network/model/application.cc	2025-03-09 16:55:49.671372200 -0700
@@ -34,7 +34,7 @@
                             .SetGroupName("Network")
                             .AddAttribute("StartTime",
                                           "Time at which the application will start",
-                                          TimeValue(Seconds(0.0)),
+                                          TimeValue(Seconds(0)),
                                           MakeTimeAccessor(&Application::m_startTime),
                                           MakeTimeChecker())
                             .AddAttribute("StopTime",
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/model/application.h ns-3.44/src/network/model/application.h
--- ns-3.43/src/network/model/application.h	2024-10-09 16:41:10.068656400 -0700
+++ ns-3.44/src/network/model/application.h	2025-03-09 16:55:49.671372200 -0700
@@ -22,7 +22,7 @@
 class Node;
 
 /**
- * \addtogroup applications Applications
+ * @addtogroup applications Applications
  *
  * Class ns3::Application can be used as a base class for ns3 applications.
  * Applications are associated with individual nodes.  Each node
@@ -44,23 +44,23 @@
  */
 
 /**
- * \brief The base class for all ns3 applications
+ * @brief The base class for all ns3 applications
  *
  */
 class Application : public Object
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     Application();
     ~Application() override;
 
     /**
-     * \brief Specify application start time
-     * \param start Start time for this application,
+     * @brief Specify application start time
+     * @param start Start time for this application,
      *        relative to the current simulation time.
      *
      * Applications start at various times in the simulation scenario.
@@ -72,8 +72,8 @@
     void SetStartTime(Time start);
 
     /**
-     * \brief Specify application stop time
-     * \param stop Stop time for this application, relative to the
+     * @brief Specify application stop time
+     * @param stop Stop time for this application, relative to the
      *        current simulation time.
      *
      * Once an application has started, it is sometimes useful
@@ -85,45 +85,45 @@
     void SetStopTime(Time stop);
 
     /**
-     * \returns the Node to which this Application object is attached.
+     * @returns the Node to which this Application object is attached.
      */
     Ptr<Node> GetNode() const;
 
     /**
-     * \param node the node to which this Application object is attached.
+     * @param node the node to which this Application object is attached.
      */
     void SetNode(Ptr<Node> node);
 
     /**
-     * \brief Assign a fixed random variable stream number to the random variables
+     * @brief Assign a fixed random variable stream number to the random variables
      * used by this Application object.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this Application object
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this Application object
      */
     virtual int64_t AssignStreams(int64_t stream);
 
     /**
-     * \brief Common callback signature for packet delay and address.
+     * @brief Common callback signature for packet delay and address.
      *
-     * \param delay The packet delay.
-     * \param from The source socket address associated with the packet,
+     * @param delay The packet delay.
+     * @param from The source socket address associated with the packet,
      *             indicating the packet's origin.
      */
     typedef void (*DelayAddressCallback)(const Time& delay, const Address& from);
 
     /**
-     * \brief Common signature used by callbacks to application's state
+     * @brief Common signature used by callbacks to application's state
      *        transition trace source.
-     * \param oldState The name of the previous state.
-     * \param newState The name of the current state.
+     * @param oldState The name of the previous state.
+     * @param newState The name of the current state.
      */
     typedef void (*StateTransitionCallback)(const std::string& oldState,
                                             const std::string& newState);
 
   private:
     /**
-     * \brief Application specific startup code
+     * @brief Application specific startup code
      *
      * The StartApplication method is called at the start time specified by Start
      * This method should be overridden by all or most application
@@ -132,7 +132,7 @@
     virtual void StartApplication();
 
     /**
-     * \brief Application specific shutdown code
+     * @brief Application specific shutdown code
      *
      * The StopApplication method is called at the stop time specified by Stop
      * This method should be overridden by all or most application
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/model/buffer.cc ns-3.44/src/network/model/buffer.cc
--- ns-3.43/src/network/model/buffer.cc	2024-10-09 16:41:10.068656400 -0700
+++ ns-3.44/src/network/model/buffer.cc	2025-03-09 16:55:49.671372200 -0700
@@ -21,8 +21,8 @@
 {
 
 /**
- * \ingroup packet
- * \brief Zero-filled buffer.
+ * @ingroup packet
+ * @brief Zero-filled buffer.
  */
 struct Zeroes
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/model/buffer.h ns-3.44/src/network/model/buffer.h
--- ns-3.43/src/network/model/buffer.h	2024-10-09 16:41:10.068656400 -0700
+++ ns-3.44/src/network/model/buffer.h	2025-03-09 16:55:49.671372200 -0700
@@ -20,9 +20,9 @@
 {
 
 /**
- * \ingroup packet
+ * @ingroup packet
  *
- * \brief automatically resized byte buffer
+ * @brief automatically resized byte buffer
  *
  * This represents a buffer of bytes. Its size is
  * automatically adjusted to hold any data prepended
@@ -32,7 +32,7 @@
  * The correct maximum size is learned at runtime during use by
  * recording the maximum size of each packet.
  *
- * \internal
+ * @internal
  * The implementation of the Buffer class uses a COW (Copy On Write)
  * technique to ensure that the underlying data buffer which holds
  * the data bytes is shared among a lot of Buffer instances despite
@@ -60,7 +60,7 @@
  * a pair of integers which describe where in the buffer content
  * the "virtual zero area" starts and ends.
  *
- * \verbatim
+ * @verbatim
  * ***: unused bytes
  * xxx: bytes "added" at the front of the zero area
  * ...: bytes "added" at the back of the zero area
@@ -75,7 +75,7 @@
  *                        |--------------------^ m_zeroAreaStart
  *                        |---------------------------------^ m_zeroAreaEnd
  *                        |------------------------------------------^ m_end
- * \endverbatim
+ * @endverbatim
  *
  * A simple state invariant is that m_start <= m_zeroStart <= m_zeroEnd <= m_end
  */
@@ -83,7 +83,7 @@
 {
   public:
     /**
-     * \brief iterator in a Buffer instance
+     * @brief iterator in a Buffer instance
      */
     class Iterator
     {
@@ -98,16 +98,16 @@
          */
         inline void Prev();
         /**
-         * \param delta number of bytes to go forward
+         * @param delta number of bytes to go forward
          */
         inline void Next(uint32_t delta);
         /**
-         * \param delta number of bytes to go backward
+         * @param delta number of bytes to go backward
          */
         inline void Prev(uint32_t delta);
         /**
-         * \param o the second iterator
-         * \return number of bytes included between the two iterators
+         * @param o the second iterator
+         * @return number of bytes included between the two iterators
          *
          * This method works only if the two iterators point
          * to the same underlying buffer. Debug builds ensure
@@ -116,33 +116,33 @@
         uint32_t GetDistanceFrom(const Iterator& o) const;
 
         /**
-         * \return true if this iterator points to the end of the byte array.
+         * @return true if this iterator points to the end of the byte array.
          *     false otherwise.
          */
         bool IsEnd() const;
         /**
-         * \return true if this iterator points to the start of the byte array.
+         * @return true if this iterator points to the start of the byte array.
          *     false otherwise.
          */
         bool IsStart() const;
 
         /**
-         * \param data data to write in buffer
+         * @param data data to write in buffer
          *
          * Write the data in buffer and advance the iterator position
          * by one byte.
          */
         inline void WriteU8(uint8_t data);
         /**
-         * \param data data to write in buffer
-         * \param len number of times data must be written in buffer
+         * @param data data to write in buffer
+         * @param len number of times data must be written in buffer
          *
          * Write the data in buffer len times and advance the iterator position
          * by len byte.
          */
         inline void WriteU8(uint8_t data, uint32_t len);
         /**
-         * \param data data to write in buffer
+         * @param data data to write in buffer
          *
          * Write the data in buffer and advance the iterator position
          * by two bytes. The format of the data written in the byte
@@ -152,7 +152,7 @@
          */
         void WriteU16(uint16_t data);
         /**
-         * \param data data to write in buffer
+         * @param data data to write in buffer
          *
          * Write the data in buffer and advance the iterator position
          * by four bytes. The format of the data written in the byte
@@ -162,7 +162,7 @@
          */
         void WriteU32(uint32_t data);
         /**
-         * \param data data to write in buffer
+         * @param data data to write in buffer
          *
          * Write the data in buffer and advance the iterator position
          * by eight bytes. The format of the data written in the byte
@@ -172,7 +172,7 @@
          */
         void WriteU64(uint64_t data);
         /**
-         * \param data data to write in buffer
+         * @param data data to write in buffer
          *
          * Write the data in buffer and advance the iterator position
          * by two bytes. The data is written in least significant byte order and the
@@ -180,7 +180,7 @@
          */
         void WriteHtolsbU16(uint16_t data);
         /**
-         * \param data data to write in buffer
+         * @param data data to write in buffer
          *
          * Write the data in buffer and advance the iterator position
          * by four bytes. The data is written in least significant byte order and the
@@ -188,7 +188,7 @@
          */
         void WriteHtolsbU32(uint32_t data);
         /**
-         * \param data data to write in buffer
+         * @param data data to write in buffer
          *
          * Write the data in buffer and advance the iterator position
          * by eight bytes. The data is written in least significant byte order and the
@@ -196,7 +196,7 @@
          */
         void WriteHtolsbU64(uint64_t data);
         /**
-         * \param data data to write in buffer
+         * @param data data to write in buffer
          *
          * Write the data in buffer and advance the iterator position
          * by two bytes. The data is written in network order and the
@@ -204,7 +204,7 @@
          */
         inline void WriteHtonU16(uint16_t data);
         /**
-         * \param data data to write in buffer
+         * @param data data to write in buffer
          *
          * Write the data in buffer and advance the iterator position
          * by four bytes. The data is written in network order and the
@@ -212,7 +212,7 @@
          */
         inline void WriteHtonU32(uint32_t data);
         /**
-         * \param data data to write in buffer
+         * @param data data to write in buffer
          *
          * Write the data in buffer and advance the iterator position
          * by eight bytes. The data is written in network order and the
@@ -220,16 +220,16 @@
          */
         void WriteHtonU64(uint64_t data);
         /**
-         * \param buffer a byte buffer to copy in the internal buffer.
-         * \param size number of bytes to copy.
+         * @param buffer a byte buffer to copy in the internal buffer.
+         * @param size number of bytes to copy.
          *
          * Write the data in buffer and advance the iterator position
          * by size bytes.
          */
         void Write(const uint8_t* buffer, uint32_t size);
         /**
-         * \param start the start of the data to copy
-         * \param end the end of the data to copy
+         * @param start the start of the data to copy
+         * @param end the end of the data to copy
          *
          * Write the data delimited by start and end in internal buffer
          * and advance the iterator position by the number of bytes
@@ -241,21 +241,21 @@
         void Write(Iterator start, Iterator end);
 
         /**
-         * \return the byte read in the buffer.
+         * @return the byte read in the buffer.
          *
          * Read data, but do not advance the Iterator read.
          */
         inline uint8_t PeekU8();
 
         /**
-         * \return the byte read in the buffer.
+         * @return the byte read in the buffer.
          *
          * Read data and advance the Iterator by the number of bytes
          * read.
          */
         inline uint8_t ReadU8();
         /**
-         * \return the two bytes read in the buffer.
+         * @return the two bytes read in the buffer.
          *
          * Read data and advance the Iterator by the number of bytes
          * read.
@@ -263,7 +263,7 @@
          */
         inline uint16_t ReadU16();
         /**
-         * \return the four bytes read in the buffer.
+         * @return the four bytes read in the buffer.
          *
          * Read data and advance the Iterator by the number of bytes
          * read.
@@ -271,7 +271,7 @@
          */
         uint32_t ReadU32();
         /**
-         * \return the eight bytes read in the buffer.
+         * @return the eight bytes read in the buffer.
          *
          * Read data and advance the Iterator by the number of bytes
          * read.
@@ -279,7 +279,7 @@
          */
         uint64_t ReadU64();
         /**
-         * \return the two bytes read in the buffer.
+         * @return the two bytes read in the buffer.
          *
          * Read data and advance the Iterator by the number of bytes
          * read.
@@ -287,7 +287,7 @@
          */
         inline uint16_t ReadNtohU16();
         /**
-         * \return the four bytes read in the buffer.
+         * @return the four bytes read in the buffer.
          *
          * Read data and advance the Iterator by the number of bytes
          * read.
@@ -295,7 +295,7 @@
          */
         inline uint32_t ReadNtohU32();
         /**
-         * \return the eight bytes read in the buffer.
+         * @return the eight bytes read in the buffer.
          *
          * Read data and advance the Iterator by the number of bytes
          * read.
@@ -303,7 +303,7 @@
          */
         uint64_t ReadNtohU64();
         /**
-         * \return the two bytes read in the buffer.
+         * @return the two bytes read in the buffer.
          *
          * Read data and advance the Iterator by the number of bytes
          * read.
@@ -311,7 +311,7 @@
          */
         uint16_t ReadLsbtohU16();
         /**
-         * \return the four bytes read in the buffer.
+         * @return the four bytes read in the buffer.
          *
          * Read data and advance the Iterator by the number of bytes
          * read.
@@ -319,7 +319,7 @@
          */
         uint32_t ReadLsbtohU32();
         /**
-         * \return the eight bytes read in the buffer.
+         * @return the eight bytes read in the buffer.
          *
          * Read data and advance the Iterator by the number of bytes
          * read.
@@ -327,8 +327,8 @@
          */
         uint64_t ReadLsbtohU64();
         /**
-         * \param buffer buffer to copy data into
-         * \param size number of bytes to copy
+         * @param buffer buffer to copy data into
+         * @param size number of bytes to copy
          *
          * Copy size bytes of data from the internal buffer to the
          * input buffer and advance the Iterator by the number of
@@ -337,8 +337,8 @@
         void Read(uint8_t* buffer, uint32_t size);
 
         /**
-         * \param start start iterator of the buffer to copy data into
-         * \param size  number of bytes to copy
+         * @param start start iterator of the buffer to copy data into
+         * @param size  number of bytes to copy
          *
          * Copy size bytes of data from the internal buffer to the input buffer via
          * the provided iterator and advance the Iterator by the number of bytes
@@ -347,27 +347,27 @@
         inline void Read(Iterator start, uint32_t size);
 
         /**
-         * \brief Calculate the checksum.
-         * \param size size of the buffer.
-         * \return checksum
+         * @brief Calculate the checksum.
+         * @param size size of the buffer.
+         * @return checksum
          */
         uint16_t CalculateIpChecksum(uint16_t size);
 
         /**
-         * \brief Calculate the checksum.
-         * \param size size of the buffer.
-         * \param initialChecksum initial value
-         * \return checksum
+         * @brief Calculate the checksum.
+         * @param size size of the buffer.
+         * @param initialChecksum initial value
+         * @return checksum
          */
         uint16_t CalculateIpChecksum(uint16_t size, uint32_t initialChecksum);
 
         /**
-         * \returns the size of the underlying buffer we are iterating
+         * @returns the size of the underlying buffer we are iterating
          */
         uint32_t GetSize() const;
 
         /**
-         * \returns the size left to read of the underlying buffer we are iterating
+         * @returns the size left to read of the underlying buffer we are iterating
          */
         uint32_t GetRemainingSize() const;
 
@@ -377,68 +377,68 @@
         /**
          * Constructor - initializes the iterator to point to the buffer start
          *
-         * \param buffer the buffer this iterator refers to
+         * @param buffer the buffer this iterator refers to
          */
         inline Iterator(const Buffer* buffer);
         /**
          * Constructor - initializes the iterator to point to the buffer end
          *
-         * \param buffer the buffer this iterator refers to
-         * \param dummy not used param
+         * @param buffer the buffer this iterator refers to
+         * @param dummy not used param
          */
         inline Iterator(const Buffer* buffer, bool dummy);
         /**
          * Initializes the iterator values
          *
-         * \param buffer the buffer this iterator refers to
+         * @param buffer the buffer this iterator refers to
          */
         inline void Construct(const Buffer* buffer);
         /**
          * Checks that the [start, end) is not in the "virtual zero area".
          *
-         * \param start start buffer position
-         * \param end end buffer position
-         * \returns true if [start, end) is not in the "virtual zero area".
+         * @param start start buffer position
+         * @param end end buffer position
+         * @returns true if [start, end) is not in the "virtual zero area".
          */
         bool CheckNoZero(uint32_t start, uint32_t end) const;
         /**
          * Checks that the buffer position is not in the "virtual zero area".
          *
-         * \param i buffer position
-         * \returns true if not in the "virtual zero area".
+         * @param i buffer position
+         * @returns true if not in the "virtual zero area".
          */
         bool Check(uint32_t i) const;
         /**
-         * \return the two bytes read in the buffer.
+         * @return the two bytes read in the buffer.
          *
          * Read data and advance the Iterator by the number of bytes
          * read.
          * The data is read in network format and returned in host format.
          *
-         * \warning this is the slow version, please use ReadNtohU16 ()
+         * @warning this is the slow version, please use ReadNtohU16 ()
          */
         uint16_t SlowReadNtohU16();
         /**
-         * \return the four bytes read in the buffer.
+         * @return the four bytes read in the buffer.
          *
          * Read data and advance the Iterator by the number of bytes
          * read.
          * The data is read in network format and returned in host format.
          *
-         * \warning this is the slow version, please use ReadNtohU32 ()
+         * @warning this is the slow version, please use ReadNtohU32 ()
          */
         uint32_t SlowReadNtohU32();
         /**
-         * \brief Returns an appropriate message indicating a read error
-         * \returns the error message
+         * @brief Returns an appropriate message indicating a read error
+         * @returns the error message
          */
         std::string GetReadErrorMessage() const;
         /**
-         * \brief Returns an appropriate message indicating a write error
+         * @brief Returns an appropriate message indicating a write error
          *
          * The message depends on the actual Buffer::Iterator status.
          *
-         * \returns the error message
+         * @returns the error message
          */
         std::string GetWriteErrorMessage() const;
 
@@ -475,12 +475,12 @@
     };
 
     /**
-     * \return the number of bytes stored in this buffer.
+     * @return the number of bytes stored in this buffer.
      */
     inline uint32_t GetSize() const;
 
     /**
-     * \return a pointer to the start of the internal
+     * @return a pointer to the start of the internal
      * byte buffer.
      *
      * The returned pointer points to an area of
@@ -491,7 +491,7 @@
     const uint8_t* PeekData() const;
 
     /**
-     * \param start size to reserve
+     * @param start size to reserve
      *
      * Add bytes at the start of the Buffer. The
      * content of these bytes is undefined but debugging
@@ -501,7 +501,7 @@
      */
     void AddAtStart(uint32_t start);
     /**
-     * \param end size to reserve
+     * @param end size to reserve
      *
      * Add bytes at the end of the Buffer. The
      * content of these bytes is undefined but debugging
@@ -512,7 +512,7 @@
     void AddAtEnd(uint32_t end);
 
     /**
-     * \param o the buffer to append to the end of this buffer.
+     * @param o the buffer to append to the end of this buffer.
      *
      * Add bytes at the end of the Buffer.
      * Any call to this method invalidates any Iterator
@@ -520,7 +520,7 @@
      */
     void AddAtEnd(const Buffer& o);
     /**
-     * \param start size to remove
+     * @param start size to remove
      *
      * Remove bytes at the start of the Buffer.
      * Any call to this method invalidates any Iterator
@@ -528,7 +528,7 @@
      */
     void RemoveAtStart(uint32_t start);
     /**
-     * \param end size to remove
+     * @param end size to remove
      *
      * Remove bytes at the end of the Buffer.
      * Any call to this method invalidates any Iterator
@@ -537,35 +537,35 @@
     void RemoveAtEnd(uint32_t end);
 
     /**
-     * \param start offset from start of packet
-     * \param length
+     * @param start offset from start of packet
+     * @param length
      *
-     * \return a fragment of size length starting at offset
+     * @return a fragment of size length starting at offset
      * start.
      */
     Buffer CreateFragment(uint32_t start, uint32_t length) const;
 
     /**
-     * \return an Iterator which points to the
+     * @return an Iterator which points to the
      * start of this Buffer.
      */
     inline Buffer::Iterator Begin() const;
     /**
-     * \return an Iterator which points to the
+     * @return an Iterator which points to the
      * end of this Buffer.
      */
     inline Buffer::Iterator End() const;
 
     /**
-     * \brief Return the number of bytes required for serialization.
-     * \return the number of bytes.
+     * @brief Return the number of bytes required for serialization.
+     * @return the number of bytes.
      */
     uint32_t GetSerializedSize() const;
 
     /**
-     * \return zero if buffer not large enough
-     * \param buffer points to serialization buffer
-     * \param maxSize max number of bytes to write
+     * @return zero if buffer not large enough
+     * @param buffer points to serialization buffer
+     * @param maxSize max number of bytes to write
      *
      * This buffer's contents are serialized into the raw
      * character buffer parameter. Note: The zero length
@@ -575,9 +575,9 @@
     uint32_t Serialize(uint8_t* buffer, uint32_t maxSize) const;
 
     /**
-     * \return zero if a complete buffer is not deserialized
-     * \param buffer points to buffer for deserialization
-     * \param size number of bytes to deserialize
+     * @return zero if a complete buffer is not deserialized
+     * @param buffer points to buffer for deserialization
+     * @param size number of bytes to deserialize
      *
      * The raw character buffer is deserialized and all the
      * data is placed into this buffer.
@@ -602,33 +602,33 @@
     uint32_t CopyData(uint8_t* buffer, uint32_t size) const;
 
     /**
-     * \brief Copy constructor
-     * \param o the buffer to copy
+     * @brief Copy constructor
+     * @param o the buffer to copy
      */
     inline Buffer(const Buffer& o);
     /**
-     * \brief Assignment operator
-     * \param o the buffer to copy
-     * \return a reference to the buffer
+     * @brief Assignment operator
+     * @param o the buffer to copy
+     * @return a reference to the buffer
      */
     Buffer& operator=(const Buffer& o);
     Buffer();
     /**
-     * \brief Constructor
+     * @brief Constructor
      *
      * The buffer will be initialized with zeroes up to its size.
      *
-     * \param dataSize the buffer size
+     * @param dataSize the buffer size
      */
     Buffer(uint32_t dataSize);
     /**
-     * \brief Constructor
+     * @brief Constructor
      *
      * If initialize is set to true, the buffer will be initialized
      * with zeroes up to its size.
      *
-     * \param dataSize the buffer size.
-     * \param initialize initialize the buffer with zeroes.
+     * @param dataSize the buffer size.
+     * @param initialize initialize the buffer with zeroes.
      */
     Buffer(uint32_t dataSize, bool initialize);
     ~Buffer();
@@ -677,66 +677,66 @@
     };
 
     /**
-     * \brief Create a full copy of the buffer, including
+     * @brief Create a full copy of the buffer, including
      * all the internal structures.
      *
-     * \returns a copy of the buffer
+     * @returns a copy of the buffer
      */
     Buffer CreateFullCopy() const;
 
     /**
-     * \brief Transform a "Virtual byte buffer" into a "Real byte buffer"
+     * @brief Transform a "Virtual byte buffer" into a "Real byte buffer"
      */
     void TransformIntoRealBuffer() const;
     /**
-     * \brief Checks the internal buffer structures consistency
+     * @brief Checks the internal buffer structures consistency
      *
      * Used only for debugging purposes.
      *
-     * \returns true if the buffer status is consistent.
+     * @returns true if the buffer status is consistent.
      */
     bool CheckInternalState() const;
 
     /**
-     * \brief Initializes the buffer with a number of zeroes.
+     * @brief Initializes the buffer with a number of zeroes.
      *
-     * \param zeroSize the zeroes size
+     * @param zeroSize the zeroes size
      */
     void Initialize(uint32_t zeroSize);
 
     /**
-     * \brief Get the buffer real size.
-     * \warning The real size is the actual memory used by the buffer.
-     * \returns the memory used by the buffer.
+     * @brief Get the buffer real size.
+     * @warning The real size is the actual memory used by the buffer.
+     * @returns the memory used by the buffer.
      */
     uint32_t GetInternalSize() const;
 
     /**
-     * \brief Get the buffer end position.
-     * \returns the buffer end index.
+     * @brief Get the buffer end position.
+     * @returns the buffer end index.
      */
     uint32_t GetInternalEnd() const;
 
     /**
-     * \brief Recycle the buffer memory
-     * \param data the buffer data storage
+     * @brief Recycle the buffer memory
+     * @param data the buffer data storage
      */
     static void Recycle(Buffer::Data* data);
     /**
-     * \brief Create a buffer data storage
-     * \param size the storage size to create
-     * \returns a pointer to the created buffer storage
+     * @brief Create a buffer data storage
+     * @param size the storage size to create
+     * @returns a pointer to the created buffer storage
      */
     static Buffer::Data* Create(uint32_t size);
     /**
-     * \brief Allocate a buffer data storage
-     * \param reqSize the storage size to create
-     * \returns a pointer to the allocated buffer storage
+     * @brief Allocate a buffer data storage
+     * @param reqSize the storage size to create
+     * @returns a pointer to the allocated buffer storage
      */
     static Buffer::Data* Allocate(uint32_t reqSize);
     /**
-     * \brief Deallocate the buffer memory
-     * \param data the buffer data storage
+     * @brief Deallocate the buffer memory
+     * @param data the buffer data storage
      */
     static void Deallocate(Buffer::Data* data);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/model/byte-tag-list.cc ns-3.44/src/network/model/byte-tag-list.cc
--- ns-3.43/src/network/model/byte-tag-list.cc	2024-10-09 16:41:10.068656400 -0700
+++ ns-3.44/src/network/model/byte-tag-list.cc	2025-03-09 16:55:49.671372200 -0700
@@ -23,9 +23,9 @@
 NS_LOG_COMPONENT_DEFINE("ByteTagList");
 
 /**
- * \ingroup packet
+ * @ingroup packet
  *
- * \brief Internal representation of the byte tags stored in a packet.
+ * @brief Internal representation of the byte tags stored in a packet.
  *
  * This structure is only used by ByteTagList and should not be accessed directly.
  */
@@ -39,9 +39,9 @@
 
 #ifdef USE_FREE_LIST
 /**
- * \ingroup packet
+ * @ingroup packet
  *
- * \brief Container class for struct ByteTagListData
+ * @brief Container class for struct ByteTagListData
  *
  * Internal use only.
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/model/byte-tag-list.h ns-3.44/src/network/model/byte-tag-list.h
--- ns-3.43/src/network/model/byte-tag-list.h	2024-10-09 16:41:10.068656400 -0700
+++ ns-3.44/src/network/model/byte-tag-list.h	2025-03-09 16:55:49.671372200 -0700
@@ -21,14 +21,14 @@
 struct ByteTagListData;
 
 /**
- * \ingroup packet
+ * @ingroup packet
  *
- * \brief keep track of the byte tags stored in a packet.
+ * @brief keep track of the byte tags stored in a packet.
  *
  * This class is mostly private to the Packet implementation and users
  * should never have to access it directly.
  *
- * \internal
+ * @internal
  * The implementation of this class is a bit tricky so, there are a couple
  * of things to keep in mind here:
  *
@@ -55,7 +55,7 @@
 {
   public:
     /**
-     * \brief An iterator for iterating through a byte tag list
+     * @brief An iterator for iterating through a byte tag list
      *
      * An iterator for iterating through a byte tag list
      *
@@ -64,7 +64,7 @@
     {
       public:
         /**
-         * \brief An item specifies an individual tag within a byte buffer
+         * @brief An item specifies an individual tag within a byte buffer
          *
          * An item specifies an individual tag within a byte buffer
          *
@@ -78,7 +78,7 @@
             TagBuffer buf; //!< the data for the tag as generated by Tag::Serialize
 
             /// Constructs an item with the given TagBuffer
-            /// \param buf The Tag Buffer
+            /// @param buf The Tag Buffer
             Item(TagBuffer buf);
 
           private:
@@ -89,23 +89,23 @@
         };
 
         /**
-         * \brief Used to determine if the iterator is at the end of the byteTagList
+         * @brief Used to determine if the iterator is at the end of the byteTagList
          *
-         * \returns true if there are more Items in the list
+         * @returns true if there are more Items in the list
          */
         bool HasNext() const;
 
         /**
-         * \brief Returns the next Item from the ByteTagList
+         * @brief Returns the next Item from the ByteTagList
          *
-         * \returns the next Item in the ByteTagList
+         * @returns the next Item in the ByteTagList
          */
         ByteTagList::Iterator::Item Next();
 
         /**
-         * \brief Returns the offset from the start of the virtual byte buffer to the ByteTagList
+         * @brief Returns the offset from the start of the virtual byte buffer to the ByteTagList
          *
-         * \returns offset to the start of this ByteTagList
+         * @returns offset to the start of this ByteTagList
          */
         uint32_t GetOffsetStart() const;
 
@@ -114,12 +114,12 @@
         friend class ByteTagList;
 
         /**
-         * \brief Constructor
-         * \param start Starting tag
-         * \param end End tag
-         * \param offsetStart offset to the start of the tag from the virtual byte buffer
-         * \param offsetEnd offset to the end of the tag from the virtual byte buffer
-         * \param adjustment adjustment to byte tag offsets
+         * @brief Constructor
+         * @param start Starting tag
+         * @param end End tag
+         * @param offsetStart offset to the start of the tag from the virtual byte buffer
+         * @param offsetEnd offset to the end of the tag from the virtual byte buffer
+         * @param adjustment adjustment to byte tag offsets
          */
         Iterator(uint8_t* start,
                  uint8_t* end,
@@ -128,7 +128,7 @@
                  int32_t adjustment);
 
         /**
-         * \brief Prepare the iterator for the next tag
+         * @brief Prepare the iterator for the next tag
          */
         void PrepareForNext();
         uint8_t* m_current;    //!< Current tag
@@ -148,7 +148,7 @@
      *
      * Copy constructor, copies the data and increases reference count
      *
-     * \param o The ByteTagList to copy
+     * @param o The ByteTagList to copy
      *
      */
     ByteTagList(const ByteTagList& o);
@@ -158,27 +158,27 @@
      * Assignment operator, deallocates current data and assigns
      * value of passed in ByteTagList.  Also increases reference count
      *
-     * \param o reference to the ByteTagList to copy
-     * \returns reference to the assignee
+     * @param o reference to the ByteTagList to copy
+     * @returns reference to the assignee
      *
      */
     ByteTagList& operator=(const ByteTagList& o);
     ~ByteTagList();
 
     /**
-     * \param tid the typeid of the tag added
-     * \param bufferSize the size of the tag when its serialization will
+     * @param tid the typeid of the tag added
+     * @param bufferSize the size of the tag when its serialization will
      *        be completed. Typically, the return value of Tag::GetSerializedSize
-     * \param start offset which uniquely identifies the first byte tagged by this tag.
-     * \param end offset which uniquely identifies the last byte tagged by this tag.
-     * \returns a buffer which can be used to write the tag data.
+     * @param start offset which uniquely identifies the first byte tagged by this tag.
+     * @param end offset which uniquely identifies the last byte tagged by this tag.
+     * @returns a buffer which can be used to write the tag data.
      *
      *
      */
     TagBuffer Add(TypeId tid, uint32_t bufferSize, int32_t start, int32_t end);
 
     /**
-     * \param o the other list of tags to aggregate.
+     * @param o the other list of tags to aggregate.
      *
      * Aggregate the two lists of tags.
      */
@@ -191,11 +191,11 @@
     void RemoveAll();
 
     /**
-     * \param offsetStart the offset which uniquely identifies the first data byte
+     * @param offsetStart the offset which uniquely identifies the first data byte
      *        present in the byte buffer associated to this ByteTagList.
-     * \param offsetEnd the offset which uniquely identifies the last data byte
+     * @param offsetEnd the offset which uniquely identifies the last data byte
      *        present in the byte buffer associated to this ByteTagList.
-     * \returns an iterator
+     * @returns an iterator
      *
      * The returned iterator will allow you to loop through the set of tags present
      * in this list: the boundaries of each tag as reported by their start and
@@ -206,7 +206,7 @@
     /**
      * Adjust the offsets stored internally by the adjustment delta.
      *
-     * \param adjustment value to change stored offsets by
+     * @param adjustment value to change stored offsets by
      */
     inline void Adjust(int32_t adjustment);
 
@@ -214,7 +214,7 @@
      * Make sure that all offsets are smaller than appendOffset which represents
      * the location where new bytes have been added to the byte buffer.
      *
-     * \param appendOffset maximum offset value
+     * @param appendOffset maximum offset value
      *
      */
     void AddAtEnd(int32_t appendOffset);
@@ -222,53 +222,53 @@
      * Make sure that all offsets are bigger than prependOffset which represents
      * the location where new bytes have been added to the byte buffer.
      *
-     * \param prependOffset minimum offset value
+     * @param prependOffset minimum offset value
      *
      */
     void AddAtStart(int32_t prependOffset);
     /**
      * Returns number of bytes required for packet serialization.
      *
-     * \returns number of bytes required for packet serialization
+     * @returns number of bytes required for packet serialization
      */
     uint32_t GetSerializedSize() const;
     /**
      * Serialize the tag list into a byte buffer.
      *
-     * \param [in,out] buffer The byte buffer to which the tag list will be serialized
-     * \param [in] maxSize Max The max size of the buffer for bounds checking
+     * @param [in,out] buffer The byte buffer to which the tag list will be serialized
+     * @param [in] maxSize Max The max size of the buffer for bounds checking
      *
-     * \returns zero if complete tag list is not serialized
+     * @returns zero if complete tag list is not serialized
      */
     uint32_t Serialize(uint32_t* buffer, uint32_t maxSize) const;
     /**
      * Deserialize tag list from the provided buffer.
      *
-     * \param [in] buffer The buffer to read from.
-     * \param [in] size The number of bytes to deserialize.
+     * @param [in] buffer The buffer to read from.
+     * @param [in] size The number of bytes to deserialize.
      *
-     * \returns zero if complete tag list is not deserialized
+     * @returns zero if complete tag list is not deserialized
      */
     uint32_t Deserialize(const uint32_t* buffer, uint32_t size);
 
   private:
     /**
-     * \brief Returns an iterator pointing to the very first tag in this list.
+     * @brief Returns an iterator pointing to the very first tag in this list.
      *
-     * \returns an iterator
+     * @returns an iterator
      */
     ByteTagList::Iterator BeginAll() const;
 
     /**
-     * \brief Allocate the memory for the ByteTagListData
-     * \param size the memory to allocate
-     * \returns the ByteTagListData structure
+     * @brief Allocate the memory for the ByteTagListData
+     * @param size the memory to allocate
+     * @returns the ByteTagListData structure
      */
     ByteTagListData* Allocate(uint32_t size);
 
     /**
-     * \brief Deallocates a ByteTagListData
-     * \param data the ByteTagListData to deallocate
+     * @brief Deallocates a ByteTagListData
+     * @param data the ByteTagListData to deallocate
      */
     void Deallocate(ByteTagListData* data);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/model/channel.h ns-3.44/src/network/model/channel.h
--- ns-3.43/src/network/model/channel.h	2024-10-09 16:41:10.068656400 -0700
+++ ns-3.44/src/network/model/channel.h	2025-03-09 16:55:49.671372200 -0700
@@ -17,12 +17,12 @@
 class NetDevice;
 
 /**
- * \ingroup network
- * \defgroup channel Channel
+ * @ingroup network
+ * @defgroup channel Channel
  */
 /**
- * \ingroup channel
- * \brief Abstract Channel Base Class.
+ * @ingroup channel
+ * @brief Abstract Channel Base Class.
  *
  * A channel is a logical path over which information flows.  The path can
  * be as simple as a short piece of wire, or as complicated as space-time.
@@ -34,8 +34,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -43,7 +43,7 @@
     ~Channel() override;
 
     /**
-     * \returns the unique id of this channel
+     * @returns the unique id of this channel
      *
      * This unique id happens to be also the index of the Channel into
      * the ChannelList.
@@ -51,14 +51,14 @@
     uint32_t GetId() const;
 
     /**
-     * \returns the number of NetDevices connected to this Channel.
+     * @returns the number of NetDevices connected to this Channel.
      *
      * This method must be implemented by subclasses.
      */
     virtual std::size_t GetNDevices() const = 0;
     /**
-     * \param i index of NetDevice to retrieve
-     * \returns one of the NetDevices connected to this channel.
+     * @param i index of NetDevice to retrieve
+     * @returns one of the NetDevices connected to this channel.
      *
      * This method must be implemented by subclasses.
      */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/model/channel-list.cc ns-3.44/src/network/model/channel-list.cc
--- ns-3.43/src/network/model/channel-list.cc	2024-10-09 16:41:10.068656400 -0700
+++ ns-3.44/src/network/model/channel-list.cc	2025-03-09 16:55:49.671372200 -0700
@@ -20,24 +20,24 @@
 NS_LOG_COMPONENT_DEFINE("ChannelList");
 
 /**
- * \ingroup network
+ * @ingroup network
  *
- * \brief private implementation detail of the ChannelList API.
+ * @brief private implementation detail of the ChannelList API.
  */
 class ChannelListPriv : public Object
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     ChannelListPriv();
     ~ChannelListPriv() override;
 
     /**
-     * \param channel channel to add
-     * \returns index of channel in list.
+     * @param channel channel to add
+     * @returns index of channel in list.
      *
      * This method is called automatically from Channel::Channel so
      * the user has little reason to call it himself.
@@ -45,47 +45,47 @@
     uint32_t Add(Ptr<Channel> channel);
 
     /**
-     * \returns a C++ iterator located at the beginning of this
+     * @returns a C++ iterator located at the beginning of this
      *          list.
      */
     ChannelList::Iterator Begin() const;
     /**
-     * \returns a C++ iterator located at the end of this
+     * @returns a C++ iterator located at the end of this
      *          list.
      */
     ChannelList::Iterator End() const;
 
     /**
-     * \param n index of requested channel.
-     * \returns the Channel associated to index n.
+     * @param n index of requested channel.
+     * @returns the Channel associated to index n.
      */
     Ptr<Channel> GetChannel(uint32_t n);
 
     /**
-     * \returns the number of channels currently in the list.
+     * @returns the number of channels currently in the list.
      */
     uint32_t GetNChannels();
 
     /**
-     * \brief Get the channel list object
-     * \returns the channel list
+     * @brief Get the channel list object
+     * @returns the channel list
      */
     static Ptr<ChannelListPriv> Get();
 
   private:
     /**
-     * \brief Get the channel list object
-     * \returns the channel list
+     * @brief Get the channel list object
+     * @returns the channel list
      */
     static Ptr<ChannelListPriv>* DoGet();
 
     /**
-     * \brief Delete the channel list object
+     * @brief Delete the channel list object
      */
     static void Delete();
 
     /**
-     * \brief Dispose the channels in the list
+     * @brief Dispose the channels in the list
      */
     void DoDispose() override;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/model/channel-list.h ns-3.44/src/network/model/channel-list.h
--- ns-3.43/src/network/model/channel-list.h	2024-10-09 16:41:10.068656400 -0700
+++ ns-3.44/src/network/model/channel-list.h	2025-03-09 16:55:49.671372200 -0700
@@ -18,9 +18,9 @@
 class CallbackBase;
 
 /**
- * \ingroup network
+ * @ingroup network
  *
- * \brief the list of simulation channels.
+ * @brief the list of simulation channels.
  *
  * Every Channel created is automatically added to this list.
  */
@@ -31,30 +31,30 @@
     typedef std::vector<Ptr<Channel>>::const_iterator Iterator;
 
     /**
-     * \param channel channel to add
-     * \returns index of channel in list.
+     * @param channel channel to add
+     * @returns index of channel in list.
      *
      * This method is called automatically from Channel::Channel so
      * the user has little reason to call it himself.
      */
     static uint32_t Add(Ptr<Channel> channel);
     /**
-     * \returns a C++ iterator located at the beginning of this
+     * @returns a C++ iterator located at the beginning of this
      *          list.
      */
     static Iterator Begin();
     /**
-     * \returns a C++ iterator located at the end of this
+     * @returns a C++ iterator located at the end of this
      *          list.
      */
     static Iterator End();
     /**
-     * \param n index of requested channel.
-     * \returns the Channel associated to index n.
+     * @param n index of requested channel.
+     * @returns the Channel associated to index n.
      */
     static Ptr<Channel> GetChannel(uint32_t n);
     /**
-     * \returns the number of channels currently in the list.
+     * @returns the number of channels currently in the list.
      */
     static uint32_t GetNChannels();
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/model/chunk.h ns-3.44/src/network/model/chunk.h
--- ns-3.43/src/network/model/chunk.h	2024-10-09 16:41:10.068656400 -0700
+++ ns-3.44/src/network/model/chunk.h	2025-03-09 16:55:49.675372100 -0700
@@ -17,33 +17,33 @@
 {
 
 /**
- * \ingroup packet
+ * @ingroup packet
  *
- * \brief abstract base class for ns3::Header and ns3::Trailer
+ * @brief abstract base class for ns3::Header and ns3::Trailer
  */
 class Chunk : public ObjectBase
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Deserialize the object from a buffer iterator
+     * @brief Deserialize the object from a buffer iterator
      *
      * This version of Deserialize can be used when the Chunk has a fixed
      * size.  It should not be called for variable-sized Chunk derived types
      * (but must be implemented, for historical reasons).
      *
-     * \param start the buffer iterator
-     * \returns the number of deserialized bytes
+     * @param start the buffer iterator
+     * @returns the number of deserialized bytes
      */
     virtual uint32_t Deserialize(Buffer::Iterator start) = 0;
 
     /**
-     * \brief Deserialize the object from a buffer iterator
+     * @brief Deserialize the object from a buffer iterator
      *
      * This version of Deserialize must be used when the Chunk has a variable
      * size, because the bounds of the Chunk may not be known at the point
@@ -51,15 +51,15 @@
      *
      * The size of the chunk should be start.GetDistanceFrom (end);
      *
-     * \param start the starting point
-     * \param end the ending point
-     * \returns the number of deserialized bytes
+     * @param start the starting point
+     * @param end the ending point
+     * @returns the number of deserialized bytes
      */
     virtual uint32_t Deserialize(Buffer::Iterator start, Buffer::Iterator end);
 
     /**
-     * \brief Print the object contents
-     * \param os the output stream
+     * @brief Print the object contents
+     * @param os the output stream
      */
     virtual void Print(std::ostream& os) const = 0;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/model/header.h ns-3.44/src/network/model/header.h
--- ns-3.43/src/network/model/header.h	2024-10-09 16:41:10.068656400 -0700
+++ ns-3.44/src/network/model/header.h	2025-03-09 16:55:49.675372100 -0700
@@ -18,9 +18,9 @@
 {
 
 /**
- * \ingroup packet
+ * @ingroup packet
  *
- * \brief Protocol header serialization and deserialization.
+ * @brief Protocol header serialization and deserialization.
  *
  * Every Protocol header which needs to be inserted or removed
  * from a Packet instance must derive from this base class and
@@ -33,15 +33,15 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     ~Header() override;
 
     using Chunk::Deserialize;
     /**
-     * \returns the expected size of the header.
+     * @returns the expected size of the header.
      *
      * This method is used by Packet::AddHeader
      * to store a header into the byte buffer of a packet. This method
@@ -50,7 +50,7 @@
      */
     virtual uint32_t GetSerializedSize() const = 0;
     /**
-     * \param start an iterator which points to where the header should
+     * @param start an iterator which points to where the header should
      *        be written.
      *
      * This method is used by Packet::AddHeader to
@@ -61,9 +61,9 @@
      */
     virtual void Serialize(Buffer::Iterator start) const = 0;
     /**
-     * \param start an iterator which points to where the header should
+     * @param start an iterator which points to where the header should
      *        read from.
-     * \returns the number of bytes read.
+     * @returns the number of bytes read.
      *
      * This method is used by Packet::RemoveHeader to
      * re-create a header from the byte buffer of a packet.
@@ -79,7 +79,7 @@
      */
     uint32_t Deserialize(Buffer::Iterator start) override = 0;
     /**
-     * \param os output stream
+     * @param os output stream
      * This method is used by Packet::Print to print the
      * content of a header as ascii data to a c++ output stream.
      * Although the header is free to format its output as it
@@ -94,11 +94,11 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the stream
- * \param header the header
- * \returns a reference to the stream
+ * @param os the stream
+ * @param header the header
+ * @returns a reference to the stream
  */
 std::ostream& operator<<(std::ostream& os, const Header& header);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/model/net-device.h ns-3.44/src/network/model/net-device.h
--- ns-3.43/src/network/model/net-device.h	2024-10-09 16:41:10.068656400 -0700
+++ ns-3.44/src/network/model/net-device.h	2025-03-09 16:55:49.675372100 -0700
@@ -27,14 +27,14 @@
 class Channel;
 
 /**
- * \ingroup network
- * \defgroup netdevice Network Device
+ * @ingroup network
+ * @defgroup netdevice Network Device
  */
 
 /**
- * \ingroup netdevice
+ * @ingroup netdevice
  *
- * \brief Network layer to device interface
+ * @brief Network layer to device interface
  *
  * This interface defines the API which the IP and ARP
  * layers need to access to manage an instance of a network device
@@ -87,23 +87,23 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     ~NetDevice() override;
 
     /**
-     * \param index ifIndex of the device
+     * @param index ifIndex of the device
      */
     virtual void SetIfIndex(const uint32_t index) = 0;
     /**
-     * \return index ifIndex of the device
+     * @return index ifIndex of the device
      */
     virtual uint32_t GetIfIndex() const = 0;
 
     /**
-     * \return the channel this NetDevice is connected to. The value
+     * @return the channel this NetDevice is connected to. The value
      *         returned can be zero if the NetDevice is not yet connected
      *         to any channel or if the underlying NetDevice has no
      *         concept of a channel. i.e., callers _must_ check for zero
@@ -113,31 +113,31 @@
 
     /**
      * Set the address of this interface
-     * \param address address to set
+     * @param address address to set
      */
     virtual void SetAddress(Address address) = 0;
 
     /**
-     * \return the current Address of this interface.
+     * @return the current Address of this interface.
      */
     virtual Address GetAddress() const = 0;
 
     /**
-     * \param mtu MTU value, in bytes, to set for the device
-     * \return whether the MTU value was within legal bounds
+     * @param mtu MTU value, in bytes, to set for the device
+     * @return whether the MTU value was within legal bounds
      *
      * Override for default MTU defined on a per-type basis.
      */
     virtual bool SetMtu(const uint16_t mtu) = 0;
     /**
-     * \return the link-level MTU in bytes for this interface.
+     * @return the link-level MTU in bytes for this interface.
      *
      * This value is typically used by the IP layer to perform
      * IP fragmentation when needed.
      */
     virtual uint16_t GetMtu() const = 0;
     /**
-     * \return true if link is up; false otherwise
+     * @return true if link is up; false otherwise
      */
     virtual bool IsLinkUp() const = 0;
     /**
@@ -145,7 +145,7 @@
      */
     typedef void (*LinkChangeTracedCallback)();
     /**
-     * \param callback the callback to invoke
+     * @param callback the callback to invoke
      *
      * Add a callback invoked whenever the link
      * status changes to UP. This callback is typically used
@@ -154,12 +154,12 @@
      */
     virtual void AddLinkChangeCallback(Callback<void> callback) = 0;
     /**
-     * \return true if this interface supports a broadcast address,
+     * @return true if this interface supports a broadcast address,
      *         false otherwise.
      */
     virtual bool IsBroadcast() const = 0;
     /**
-     * \return the broadcast address supported by
+     * @return the broadcast address supported by
      *         this netdevice.
      *
      * Calling this method is invalid if IsBroadcast returns
@@ -168,12 +168,12 @@
     virtual Address GetBroadcast() const = 0;
 
     /**
-     * \return value of m_isMulticast flag
+     * @return value of m_isMulticast flag
      */
     virtual bool IsMulticast() const = 0;
 
     /**
-     * \brief Make and return a MAC multicast address using the provided
+     * @brief Make and return a MAC multicast address using the provided
      *        multicast group
      *
      * \RFC{1112} says that an Ipv4 host group address is mapped to an Ethernet
@@ -191,70 +191,70 @@
      * support multicasting are expected to override this method and provide an
      * implementation appropriate to the particular device.
      *
-     * \param multicastGroup The IP address for the multicast group destination
+     * @param multicastGroup The IP address for the multicast group destination
      * of the packet.
-     * \return The MAC multicast Address used to send packets to the provided
+     * @return The MAC multicast Address used to send packets to the provided
      * multicast group.
      *
-     * \warning Calling this method is invalid if IsMulticast returns not true.
-     * \see IsMulticast()
+     * @warning Calling this method is invalid if IsMulticast returns not true.
+     * @see IsMulticast()
      */
     virtual Address GetMulticast(Ipv4Address multicastGroup) const = 0;
 
     /**
-     * \brief Get the MAC multicast address corresponding
+     * @brief Get the MAC multicast address corresponding
      * to the IPv6 address provided.
-     * \param addr IPv6 address
-     * \return the MAC multicast address
-     * \warning Calling this method is invalid if IsMulticast returns not true.
+     * @param addr IPv6 address
+     * @return the MAC multicast address
+     * @warning Calling this method is invalid if IsMulticast returns not true.
      */
     virtual Address GetMulticast(Ipv6Address addr) const = 0;
 
     /**
-     * \brief Return true if the net device is acting as a bridge.
+     * @brief Return true if the net device is acting as a bridge.
      *
-     * \return value of m_isBridge flag
+     * @return value of m_isBridge flag
      */
     virtual bool IsBridge() const = 0;
 
     /**
-     * \brief Return true if the net device is on a point-to-point link.
+     * @brief Return true if the net device is on a point-to-point link.
      *
-     * \return value of m_isPointToPoint flag
+     * @return value of m_isPointToPoint flag
      */
     virtual bool IsPointToPoint() const = 0;
     /**
-     * \param packet packet sent from above down to Network Device
-     * \param dest mac address of the destination (already resolved)
-     * \param protocolNumber identifies the type of payload contained in
+     * @param packet packet sent from above down to Network Device
+     * @param dest mac address of the destination (already resolved)
+     * @param protocolNumber identifies the type of payload contained in
      *        this packet. Used to call the right L3Protocol when the packet
      *        is received.
      *
      *  Called from higher layer to send packet into Network Device
      *  to the specified destination Address
      *
-     * \return whether the Send operation succeeded
+     * @return whether the Send operation succeeded
      */
     virtual bool Send(Ptr<Packet> packet, const Address& dest, uint16_t protocolNumber) = 0;
     /**
-     * \param packet packet sent from above down to Network Device
-     * \param source source mac address (so called "MAC spoofing")
-     * \param dest mac address of the destination (already resolved)
-     * \param protocolNumber identifies the type of payload contained in
+     * @param packet packet sent from above down to Network Device
+     * @param source source mac address (so called "MAC spoofing")
+     * @param dest mac address of the destination (already resolved)
+     * @param protocolNumber identifies the type of payload contained in
      *        this packet. Used to call the right L3Protocol when the packet
      *        is received.
      *
      *  Called from higher layer to send packet into Network Device
      *  with the specified source and destination Addresses.
      *
-     * \return whether the Send operation succeeded
+     * @return whether the Send operation succeeded
      */
     virtual bool SendFrom(Ptr<Packet> packet,
                           const Address& source,
                           const Address& dest,
                           uint16_t protocolNumber) = 0;
     /**
-     * \returns the node base class which contains this network
+     * @returns the node base class which contains this network
      *          interface.
      *
      * When a subclass needs to get access to the underlying node
@@ -264,14 +264,14 @@
     virtual Ptr<Node> GetNode() const = 0;
 
     /**
-     * \param node the node associated to this netdevice.
+     * @param node the node associated to this netdevice.
      *
      * This method is called from ns3::Node::AddDevice.
      */
     virtual void SetNode(Ptr<Node> node) = 0;
 
     /**
-     * \returns true if ARP is needed, false otherwise.
+     * @returns true if ARP is needed, false otherwise.
      *
      * Called by higher-layers to check if this NetDevice requires
      * ARP to be used.
@@ -298,20 +298,20 @@
     };
 
     /**
-     * \param device a pointer to the net device which is calling this callback
-     * \param packet the packet received
-     * \param protocol the 16 bit protocol number associated with this packet.
+     * @param device a pointer to the net device which is calling this callback
+     * @param packet the packet received
+     * @param protocol the 16 bit protocol number associated with this packet.
      *        This protocol number is expected to be the same protocol number
      *        given to the Send method by the user on the sender side.
-     * \param sender the address of the sender
-     * \returns true if the callback could handle the packet successfully, false
+     * @param sender the address of the sender
+     * @returns true if the callback could handle the packet successfully, false
      *          otherwise.
      */
     typedef Callback<bool, Ptr<NetDevice>, Ptr<const Packet>, uint16_t, const Address&>
         ReceiveCallback;
 
     /**
-     * \param cb callback to invoke whenever a packet has been received and must
+     * @param cb callback to invoke whenever a packet has been received and must
      *        be forwarded to the higher layers.
      *
      * Set the callback to be used to notify higher layers when a packet has been
@@ -320,15 +320,15 @@
     virtual void SetReceiveCallback(ReceiveCallback cb) = 0;
 
     /**
-     * \param device a pointer to the net device which is calling this callback
-     * \param packet the packet received
-     * \param protocol the 16 bit protocol number associated with this packet.
+     * @param device a pointer to the net device which is calling this callback
+     * @param packet the packet received
+     * @param protocol the 16 bit protocol number associated with this packet.
      *        This protocol number is expected to be the same protocol number
      *        given to the Send method by the user on the sender side.
-     * \param sender the address of the sender
-     * \param receiver the address of the receiver
-     * \param packetType type of packet received (broadcast/multicast/unicast/otherhost)
-     * \returns true if the callback could handle the packet successfully, false
+     * @param sender the address of the sender
+     * @param receiver the address of the receiver
+     * @param packetType type of packet received (broadcast/multicast/unicast/otherhost)
+     * @returns true if the callback could handle the packet successfully, false
      *          otherwise.
      */
     typedef Callback<bool,
@@ -341,7 +341,7 @@
         PromiscReceiveCallback;
 
     /**
-     * \param cb callback to invoke whenever a packet has been received in promiscuous mode and must
+     * @param cb callback to invoke whenever a packet has been received in promiscuous mode and must
      *        be forwarded to the higher layers.
      *
      * Enables netdevice promiscuous mode and sets the callback that
@@ -353,7 +353,7 @@
     virtual void SetPromiscReceiveCallback(PromiscReceiveCallback cb) = 0;
 
     /**
-     * \return true if this interface supports a bridging mode, false otherwise.
+     * @return true if this interface supports a bridging mode, false otherwise.
      */
     virtual bool SupportsSendFrom() const = 0;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/model/nix-vector.h ns-3.44/src/network/model/nix-vector.h
--- ns-3.43/src/network/model/nix-vector.h	2024-10-09 16:41:10.068656400 -0700
+++ ns-3.44/src/network/model/nix-vector.h	2025-03-09 16:55:49.675372100 -0700
@@ -18,9 +18,9 @@
 {
 
 /**
- * \ingroup packet
+ * @ingroup packet
  *
- * \brief Neighbor-index data structure for nix-vector routing
+ * @brief Neighbor-index data structure for nix-vector routing
  *
  * This data structure holds a vector of "neighbor-indexes" for
  * a simulation specific routing protocol, nix-vector routing.
@@ -31,7 +31,7 @@
  * route, the current node extracts the appropriate
  * neighbor-index and routes the packet.
  *
- * \internal
+ * @internal
  * The implementation of NixVector uses a vector to store
  * the neighbor-indexes.  Each entry in the vector is 32
  * bits long and can store multiple neighbor-indexes.  A
@@ -56,24 +56,24 @@
     NixVector();
     ~NixVector();
     /**
-     * \return a copy of this nix-vector
+     * @return a copy of this nix-vector
      */
     Ptr<NixVector> Copy() const;
     /**
-     * \param o the NixVector to copy to a new NixVector
+     * @param o the NixVector to copy to a new NixVector
      *          using a constructor
      */
     NixVector(const NixVector& o);
     /**
-     * \return a reference to the assignee
+     * @return a reference to the assignee
      *
-     * \param o the NixVector to copy to a new NixVector using the
+     * @param o the NixVector to copy to a new NixVector using the
      *          equals operator
      */
     NixVector& operator=(const NixVector& o);
     /**
-     * \param newBits the neighbor-index to be added to the vector
-     * \param numberOfBits the number of bits that newBits contains
+     * @param newBits the neighbor-index to be added to the vector
+     * @param numberOfBits the number of bits that newBits contains
      *
      * Adds the neighbor index to the vector using a fair amount of
      * bit manipulation to pack everything in efficiently.
@@ -85,9 +85,9 @@
      */
     void AddNeighborIndex(uint32_t newBits, uint32_t numberOfBits);
     /**
-     * \return the neighbor index
+     * @return the neighbor index
      *
-     * \param numberOfBits the number of bits to extract from the vector
+     * @param numberOfBits the number of bits to extract from the vector
      *
      * Extracts the number of bits specified from
      * the vector and returns the value extracted
@@ -99,40 +99,40 @@
      */
     uint32_t ExtractNeighborIndex(uint32_t numberOfBits);
     /**
-     * \return number of bits remaining in the
+     * @return number of bits remaining in the
      *         nix-vector (ie m_total - m_used)
      */
     uint32_t GetRemainingBits() const;
     /**
-     * \return the number of bytes required for serialization
+     * @return the number of bytes required for serialization
      */
     uint32_t GetSerializedSize() const;
     /**
-     * \return zero if buffer not large enough
+     * @return zero if buffer not large enough
      *
-     * \param buffer points to serialization buffer
+     * @param buffer points to serialization buffer
      *
-     * \param maxSize max number of bytes to write
+     * @param maxSize max number of bytes to write
      *
      * This nix-vector is serialized into the raw character
      * buffer parameter.
      */
     uint32_t Serialize(uint32_t* buffer, uint32_t maxSize) const;
     /**
-     * \return zero if a complete nix-vector is not deserialized
+     * @return zero if a complete nix-vector is not deserialized
      *
-     * \param buffer points to buffer for deserialization
+     * @param buffer points to buffer for deserialization
      *
-     * \param size number of bytes to deserialize
+     * @param size number of bytes to deserialize
      *
      * The raw character buffer containing all the nix-vector
      * information is deserialized into this nix-vector.
      */
     uint32_t Deserialize(const uint32_t* buffer, uint32_t size);
     /**
-     * \return number of bits of numberOfNeighbors
+     * @return number of bits of numberOfNeighbors
      *
-     * \param numberOfNeighbors the total number of neighbors
+     * @param numberOfNeighbors the total number of neighbors
      *
      * This function is used to determine the number of bits of
      * numberOfNeighbors so that this value can be passed in to
@@ -142,13 +142,13 @@
 
     /**
      * Set the NixVector Epoch
-     * \param epoch the NixVector Epoch
+     * @param epoch the NixVector Epoch
      */
     void SetEpoch(uint32_t epoch);
 
     /**
      * Get the NixVector Epoch
-     * \return the NixVector Epoch
+     * @return the NixVector Epoch
      */
     uint32_t GetEpoch() const;
 
@@ -157,20 +157,20 @@
     typedef std::vector<uint32_t> NixBits_t;
 
     /**
-     * \brief Print the NixVector.
+     * @brief Print the NixVector.
      *
-     * \param os the output stream
+     * @param os the output stream
      *
      * \note: this could be greatly simplified by using std::format (but it's C++20).
      */
     void DumpNixVector(std::ostream& os) const;
 
     /**
-     * \brief Stream insertion operator.
+     * @brief Stream insertion operator.
      *
-     * \param os the stream
-     * \param nix the Nixvector
-     * \returns a reference to the stream
+     * @param os the stream
+     * @param nix the Nixvector
+     * @returns a reference to the stream
      */
     friend std::ostream& operator<<(std::ostream& os, const NixVector& nix);
 
@@ -187,9 +187,9 @@
 
     /**
      * Internal for pretty printing of nix-vector (no fill)
-     * \param decimalNum decimal divider
-     * \param bitCount bit counter
-     * \param os output stream
+     * @param decimalNum decimal divider
+     * @param bitCount bit counter
+     * @param os output stream
      */
     void PrintDec2BinNix(uint32_t decimalNum, uint32_t bitCount, std::ostream& os) const;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/model/node.cc ns-3.44/src/network/model/node.cc
--- ns-3.43/src/network/model/node.cc	2024-10-09 16:41:10.068656400 -0700
+++ ns-3.44/src/network/model/node.cc	2025-03-09 16:55:49.675372100 -0700
@@ -30,9 +30,9 @@
 NS_OBJECT_ENSURE_REGISTERED(Node);
 
 /**
- * \relates Node
- * \anchor GlobalValueChecksumEnabled
- * \brief A global switch to enable all checksums for all protocols.
+ * @relates Node
+ * @anchor GlobalValueChecksumEnabled
+ * @brief A global switch to enable all checksums for all protocols.
  */
 static GlobalValue g_checksumEnabled =
     GlobalValue("ChecksumEnabled",
@@ -129,7 +129,7 @@
     device->SetNode(this);
     device->SetIfIndex(index);
     device->SetReceiveCallback(MakeCallback(&Node::NonPromiscReceiveFromDevice, this));
-    Simulator::ScheduleWithContext(GetId(), Seconds(0.0), &NetDevice::Initialize, device);
+    Simulator::ScheduleWithContext(GetId(), Seconds(0), &NetDevice::Initialize, device);
     NotifyDeviceAdded(device);
     return index;
 }
@@ -156,7 +156,7 @@
     uint32_t index = m_applications.size();
     m_applications.push_back(application);
     application->SetNode(this);
-    Simulator::ScheduleWithContext(GetId(), Seconds(0.0), &Application::Initialize, application);
+    Simulator::ScheduleWithContext(GetId(), Seconds(0), &Application::Initialize, application);
     return index;
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/model/node.h ns-3.44/src/network/model/node.h
--- ns-3.43/src/network/model/node.h	2024-10-09 16:41:10.068656400 -0700
+++ ns-3.44/src/network/model/node.h	2025-03-09 16:55:49.675372100 -0700
@@ -26,9 +26,9 @@
 class Time;
 
 /**
- * \ingroup network
+ * @ingroup network
  *
- * \brief A network Node.
+ * @brief A network Node.
  *
  * This class holds together:
  *   - a list of NetDevice objects which represent the network interfaces
@@ -46,21 +46,21 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     Node();
     /**
-     * \param systemId a unique integer used for parallel simulations.
+     * @param systemId a unique integer used for parallel simulations.
      */
     Node(uint32_t systemId);
 
     ~Node() override;
 
     /**
-     * \returns the unique id of this node.
+     * @returns the unique id of this node.
      *
      * This unique id happens to be also the index of the Node into
      * the NodeList.
@@ -73,73 +73,73 @@
      * This function is currently a placeholder to ease the development of this feature.
      * For now, it is only an alias to Simulator::Now()
      *
-     * \return The time as seen by this node
+     * @return The time as seen by this node
      */
     Time GetLocalTime() const;
 
     /**
-     * \returns the system id for parallel simulations associated
+     * @returns the system id for parallel simulations associated
      *          to this node.
      */
     uint32_t GetSystemId() const;
 
     /**
-     * \brief Associate a NetDevice to this node.
+     * @brief Associate a NetDevice to this node.
      *
-     * \param device NetDevice to associate to this node.
-     * \returns the index of the NetDevice into the Node's list of
+     * @param device NetDevice to associate to this node.
+     * @returns the index of the NetDevice into the Node's list of
      *          NetDevice.
      */
     uint32_t AddDevice(Ptr<NetDevice> device);
     /**
-     * \brief Retrieve the index-th NetDevice associated to this node.
+     * @brief Retrieve the index-th NetDevice associated to this node.
      *
-     * \param index the index of the requested NetDevice
-     * \returns the requested NetDevice.
+     * @param index the index of the requested NetDevice
+     * @returns the requested NetDevice.
      */
     Ptr<NetDevice> GetDevice(uint32_t index) const;
     /**
-     * \returns the number of NetDevice instances associated
+     * @returns the number of NetDevice instances associated
      *          to this Node.
      */
     uint32_t GetNDevices() const;
 
     /**
-     * \brief Associate an Application to this Node.
+     * @brief Associate an Application to this Node.
      *
-     * \param application Application to associate to this node.
-     * \returns the index of the Application within the Node's list
+     * @param application Application to associate to this node.
+     * @returns the index of the Application within the Node's list
      *          of Application.
      */
     uint32_t AddApplication(Ptr<Application> application);
     /**
-     * \brief Retrieve the index-th Application associated to this node.
+     * @brief Retrieve the index-th Application associated to this node.
      *
-     * \param index the index of the requested Application
-     * \returns the requested Application.
+     * @param index the index of the requested Application
+     * @returns the requested Application.
      */
     Ptr<Application> GetApplication(uint32_t index) const;
 
     /**
-     * \returns the number of Application instances associated to this Node.
+     * @returns the number of Application instances associated to this Node.
      */
     uint32_t GetNApplications() const;
 
     /**
      * A protocol handler
      *
-     * \param device a pointer to the net device which received the packet
-     * \param packet the packet received
-     * \param protocol the 16 bit protocol number associated with this packet.
+     * @param device a pointer to the net device which received the packet
+     * @param packet the packet received
+     * @param protocol the 16 bit protocol number associated with this packet.
      *        This protocol number is expected to be the same protocol number
      *        given to the Send method by the user on the sender side.
-     * \param sender the address of the sender
-     * \param receiver the address of the receiver; Note: this value is
+     * @param sender the address of the sender
+     * @param receiver the address of the receiver; Note: this value is
      *                 only valid for promiscuous mode protocol
      *                 handlers.  Note:  If the L2 protocol does not use L2
      *                 addresses, the address reported here is the value of
      *                 device->GetAddress().
-     * \param packetType type of packet received
+     * @param packetType type of packet received
      *                   (broadcast/multicast/unicast/otherhost); Note:
      *                   this value is only valid for promiscuous mode
      *                   protocol handlers.
@@ -153,24 +153,24 @@
                      NetDevice::PacketType>
         ProtocolHandler;
     /**
-     * \param handler the handler to register
-     * \param protocolType the type of protocol this handler is
+     * @param handler the handler to register
+     * @param protocolType the type of protocol this handler is
      *        interested in. This protocol type is a so-called
      *        EtherType, as registered here:
      *        http://standards.ieee.org/regauth/ethertype/eth.txt
      *        the value zero is interpreted as matching all
      *        protocols.
-     * \param device the device attached to this handler. If the
+     * @param device the device attached to this handler. If the
      *        value is zero, the handler is attached to all
      *        devices on this node.
-     * \param promiscuous whether to register a promiscuous mode handler
+     * @param promiscuous whether to register a promiscuous mode handler
      */
     void RegisterProtocolHandler(ProtocolHandler handler,
                                  uint16_t protocolType,
                                  Ptr<NetDevice> device,
                                  bool promiscuous = false);
     /**
-     * \param handler the handler to unregister
+     * @param handler the handler to unregister
      *
      * After this call returns, the input handler will never
      * be invoked anymore.
@@ -182,7 +182,7 @@
      */
     typedef Callback<void, Ptr<NetDevice>> DeviceAdditionListener;
     /**
-     * \param listener the listener to add
+     * @param listener the listener to add
      *
      * Add a new listener to the list of listeners for the device-added
      * event. When a new listener is added, it is notified of the existence
@@ -190,7 +190,7 @@
      */
     void RegisterDeviceAdditionListener(DeviceAdditionListener listener);
     /**
-     * \param listener the listener to remove
+     * @param listener the listener to remove
      *
      * Remove an existing listener from the list of listeners for the
      * device-added event.
@@ -198,7 +198,7 @@
     void UnregisterDeviceAdditionListener(DeviceAdditionListener listener);
 
     /**
-     * \returns true if checksums are enabled, false otherwise.
+     * @returns true if checksums are enabled, false otherwise.
      */
     static bool ChecksumEnabled();
 
@@ -213,32 +213,32 @@
 
   private:
     /**
-     * \brief Notifies all the DeviceAdditionListener about the new device added.
-     * \param device the added device to notify.
+     * @brief Notifies all the DeviceAdditionListener about the new device added.
+     * @param device the added device to notify.
      */
     void NotifyDeviceAdded(Ptr<NetDevice> device);
 
     /**
-     * \brief Receive a packet from a device in non-promiscuous mode.
-     * \param device the device
-     * \param packet the packet
-     * \param protocol the protocol
-     * \param from the sender
-     * \returns true if the packet has been delivered to a protocol handler.
+     * @brief Receive a packet from a device in non-promiscuous mode.
+     * @param device the device
+     * @param packet the packet
+     * @param protocol the protocol
+     * @param from the sender
+     * @returns true if the packet has been delivered to a protocol handler.
      */
     bool NonPromiscReceiveFromDevice(Ptr<NetDevice> device,
                                      Ptr<const Packet> packet,
                                      uint16_t protocol,
                                      const Address& from);
     /**
-     * \brief Receive a packet from a device in promiscuous mode.
-     * \param device the device
-     * \param packet the packet
-     * \param protocol the protocol
-     * \param from the sender
-     * \param to the destination
-     * \param packetType the packet type
-     * \returns true if the packet has been delivered to a protocol handler.
+     * @brief Receive a packet from a device in promiscuous mode.
+     * @param device the device
+     * @param packet the packet
+     * @param protocol the protocol
+     * @param from the sender
+     * @param to the destination
+     * @param packetType the packet type
+     * @returns true if the packet has been delivered to a protocol handler.
      */
     bool PromiscReceiveFromDevice(Ptr<NetDevice> device,
                                   Ptr<const Packet> packet,
@@ -247,15 +247,15 @@
                                   const Address& to,
                                   NetDevice::PacketType packetType);
     /**
-     * \brief Receive a packet from a device.
-     * \param device the device
-     * \param packet the packet
-     * \param protocol the protocol
-     * \param from the sender
-     * \param to the destination
-     * \param packetType the packet type
-     * \param promisc true if received in promiscuous mode
-     * \returns true if the packet has been delivered to a protocol handler.
+     * @brief Receive a packet from a device.
+     * @param device the device
+     * @param packet the packet
+     * @param protocol the protocol
+     * @param from the sender
+     * @param to the destination
+     * @param packetType the packet type
+     * @param promisc true if received in promiscuous mode
+     * @returns true if the packet has been delivered to a protocol handler.
      */
     bool ReceiveFromDevice(Ptr<NetDevice> device,
                            Ptr<const Packet>,
@@ -266,12 +266,12 @@
                            bool promisc);
 
     /**
-     * \brief Finish node's construction by setting the correct node ID.
+     * @brief Finish node's construction by setting the correct node ID.
      */
     void Construct();
 
     /**
-     * \brief Protocol handler entry.
+     * @brief Protocol handler entry.
      * This structure is used to demultiplex all the protocols.
      */
     struct ProtocolHandlerEntry
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/model/node-list.cc ns-3.44/src/network/model/node-list.cc
--- ns-3.43/src/network/model/node-list.cc	2024-10-09 16:41:10.068656400 -0700
+++ ns-3.44/src/network/model/node-list.cc	2025-03-09 16:55:49.675372100 -0700
@@ -23,23 +23,23 @@
 NS_LOG_COMPONENT_DEFINE("NodeList");
 
 /**
- * \ingroup network
- * \brief private implementation detail of the NodeList API.
+ * @ingroup network
+ * @brief private implementation detail of the NodeList API.
  */
 class NodeListPriv : public Object
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     NodeListPriv();
     ~NodeListPriv() override;
 
     /**
-     * \param node node to add
-     * \returns index of node in list.
+     * @param node node to add
+     * @returns index of node in list.
      *
      * This method is called automatically from Node::Node so
      * the user has little reason to call it himself.
@@ -47,48 +47,48 @@
     uint32_t Add(Ptr<Node> node);
 
     /**
-     * \returns a C++ iterator located at the beginning of this
+     * @returns a C++ iterator located at the beginning of this
      *          list.
      */
     NodeList::Iterator Begin() const;
 
     /**
-     * \returns a C++ iterator located at the end of this
+     * @returns a C++ iterator located at the end of this
      *          list.
      */
     NodeList::Iterator End() const;
 
     /**
-     * \param n index of requested node.
-     * \returns the Node associated to index n.
+     * @param n index of requested node.
+     * @returns the Node associated to index n.
      */
     Ptr<Node> GetNode(uint32_t n);
 
     /**
-     * \returns the number of nodes currently in the list.
+     * @returns the number of nodes currently in the list.
      */
     uint32_t GetNNodes();
 
     /**
-     * \brief Get the node list object
-     * \returns the node list
+     * @brief Get the node list object
+     * @returns the node list
      */
     static Ptr<NodeListPriv> Get();
 
   private:
     /**
-     * \brief Get the node list object
-     * \returns the node list
+     * @brief Get the node list object
+     * @returns the node list
      */
     static Ptr<NodeListPriv>* DoGet();
 
     /**
-     * \brief Delete the nodes list object
+     * @brief Delete the nodes list object
      */
     static void Delete();
 
     /**
-     * \brief Dispose the nodes in the list
+     * @brief Dispose the nodes in the list
      */
     void DoDispose() override;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/model/node-list.h ns-3.44/src/network/model/node-list.h
--- ns-3.43/src/network/model/node-list.h	2024-10-09 16:41:10.068656400 -0700
+++ ns-3.44/src/network/model/node-list.h	2025-03-09 16:55:49.675372100 -0700
@@ -20,9 +20,9 @@
 class CallbackBase;
 
 /**
- * \ingroup network
+ * @ingroup network
  *
- * \brief the list of simulation nodes.
+ * @brief the list of simulation nodes.
  *
  * Every Node created is automatically added to this list.
  */
@@ -33,30 +33,30 @@
     typedef std::vector<Ptr<Node>>::const_iterator Iterator;
 
     /**
-     * \param node node to add
-     * \returns index of node in list.
+     * @param node node to add
+     * @returns index of node in list.
      *
      * This method is called automatically from Node::Node so
      * the user has little reason to call it himself.
      */
     static uint32_t Add(Ptr<Node> node);
     /**
-     * \returns a C++ iterator located at the beginning of this
+     * @returns a C++ iterator located at the beginning of this
      *          list.
      */
     static Iterator Begin();
     /**
-     * \returns a C++ iterator located at the end of this
+     * @returns a C++ iterator located at the end of this
      *          list.
      */
     static Iterator End();
     /**
-     * \param n index of requested node.
-     * \returns the Node associated to index n.
+     * @param n index of requested node.
+     * @returns the Node associated to index n.
      */
     static Ptr<Node> GetNode(uint32_t n);
     /**
-     * \returns the number of nodes currently in the list.
+     * @returns the number of nodes currently in the list.
      */
     static uint32_t GetNNodes();
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/model/packet.h ns-3.44/src/network/model/packet.h
--- ns-3.43/src/network/model/packet.h	2024-10-09 16:41:10.068656400 -0700
+++ ns-3.44/src/network/model/packet.h	2025-03-09 16:55:49.675372100 -0700
@@ -31,13 +31,13 @@
 class Address;
 
 /**
- * \ingroup network
- * \defgroup packet Packet
+ * @ingroup network
+ * @defgroup packet Packet
  */
 
 /**
- * \ingroup packet
- * \brief Iterator over the set of byte tags in a packet
+ * @ingroup packet
+ * @brief Iterator over the set of byte tags in a packet
  *
  * This is a java-style iterator.
  */
@@ -45,32 +45,32 @@
 {
   public:
     /**
-     * \brief Identifies a byte tag and a set of bytes within a packet
+     * @brief Identifies a byte tag and a set of bytes within a packet
      * to which the tag applies.
      */
     class Item
     {
       public:
         /**
-         * \returns the ns3::TypeId associated to this tag.
+         * @returns the ns3::TypeId associated to this tag.
          */
         TypeId GetTypeId() const;
         /**
-         * \returns the index of the first byte tagged by this tag.
+         * @returns the index of the first byte tagged by this tag.
          *
-         * \brief The index is an offset from the start of the packet.
+         * @brief The index is an offset from the start of the packet.
          */
         uint32_t GetStart() const;
         /**
-         * \returns the index of the last byte tagged by this tag.
+         * @returns the index of the last byte tagged by this tag.
          *
-         * \brief The index is an offset from the start of the packet.
+         * @brief The index is an offset from the start of the packet.
          */
         uint32_t GetEnd() const;
         /**
-         * \brief Read the requested tag and store it in the user-provided tag instance.
+         * @brief Read the requested tag and store it in the user-provided tag instance.
          *
-         * \param tag the user tag to which the data should be copied.
+         * @param tag the user tag to which the data should be copied.
          *
          * This method will crash if the type of the tag provided
          * by the user does not match the type of the underlying tag.
@@ -81,11 +81,11 @@
         /// Friend class
         friend class ByteTagIterator;
         /**
-         * \brief Constructor
-         * \param tid the ns3::TypeId associated to this tag.
-         * \param start the index of the first byte tagged by this tag.
-         * \param end the index of the last byte tagged by this tag.
-         * \param buffer the buffer associated with this tag.
+         * @brief Constructor
+         * @param tid the ns3::TypeId associated to this tag.
+         * @param start the index of the first byte tagged by this tag.
+         * @param end the index of the last byte tagged by this tag.
+         * @param buffer the buffer associated with this tag.
          */
         Item(TypeId tid, uint32_t start, uint32_t end, TagBuffer buffer);
 
@@ -96,11 +96,11 @@
     };
 
     /**
-     * \returns true if calling Next is safe, false otherwise.
+     * @returns true if calling Next is safe, false otherwise.
      */
     bool HasNext() const;
     /**
-     * \returns the next item found and prepare for the next one.
+     * @returns the next item found and prepare for the next one.
      */
     Item Next();
 
@@ -109,15 +109,15 @@
     friend class Packet;
     /**
      * Copy Constructor
-     * \param i object to copy
+     * @param i object to copy
      */
     ByteTagIterator(ByteTagList::Iterator i);
     ByteTagList::Iterator m_current; //!< actual position over the set of byte tags in a packet
 };
 
 /**
- * \ingroup packet
- * \brief Iterator over the set of packet tags in a packet
+ * @ingroup packet
+ * @brief Iterator over the set of packet tags in a packet
  *
  * This is a java-style iterator.
  */
@@ -131,13 +131,13 @@
     {
       public:
         /**
-         * \returns the ns3::TypeId associated to this tag.
+         * @returns the ns3::TypeId associated to this tag.
          */
         TypeId GetTypeId() const;
         /**
          * Read the requested tag and store it in the user-provided tag instance.
          *
-         * \param tag the user tag to which the data should be copied.
+         * @param tag the user tag to which the data should be copied.
          *
          * This method will crash if the type of the tag provided
          * by the user does not match the type of the underlying tag.
@@ -149,18 +149,18 @@
         friend class PacketTagIterator;
         /**
          * Constructor
-         * \param data the data to copy.
+         * @param data the data to copy.
          */
         Item(const PacketTagList::TagData* data);
         const PacketTagList::TagData* m_data; //!< the tag data
     };
 
     /**
-     * \returns true if calling Next is safe, false otherwise.
+     * @returns true if calling Next is safe, false otherwise.
      */
     bool HasNext() const;
     /**
-     * \returns the next item found and prepare for the next one.
+     * @returns the next item found and prepare for the next one.
      */
     Item Next();
 
@@ -169,15 +169,15 @@
     friend class Packet;
     /**
      * Constructor
-     * \param head head of the items
+     * @param head head of the items
      */
     PacketTagIterator(const PacketTagList::TagData* head);
     const PacketTagList::TagData* m_current; //!< actual position over the set of tags in a packet
 };
 
 /**
- * \ingroup packet
- * \brief network packets
+ * @ingroup packet
+ * @brief network packets
  *
  * Each network packet contains a byte buffer, a set of byte tags, a set of
  * packet tags, and metadata.
@@ -228,23 +228,23 @@
 {
   public:
     /**
-     * \brief Create an empty packet with a new uid (as returned
+     * @brief Create an empty packet with a new uid (as returned
      * by getUid).
      */
     Packet();
     /**
-     * \brief Copy constructor
-     * \param o object to copy
+     * @brief Copy constructor
+     * @param o object to copy
      */
     Packet(const Packet& o);
     /**
-     * \brief Basic assignment
-     * \param o object to copy
-     * \return the copied object
+     * @brief Basic assignment
+     * @param o object to copy
+     * @return the copied object
      */
     Packet& operator=(const Packet& o);
     /**
-     * \brief Create a packet with a zero-filled payload.
+     * @brief Create a packet with a zero-filled payload.
      *
      * The memory necessary for the payload is not allocated:
      * it will be allocated at any later point if you attempt
@@ -252,195 +252,195 @@
      * bytes. The packet is allocated with a new uid (as
      * returned by getUid).
      *
-     * \param size the size of the zero-filled payload
+     * @param size the size of the zero-filled payload
      */
     Packet(uint32_t size);
     /**
-     * \brief Create a new packet from the serialized buffer.
+     * @brief Create a new packet from the serialized buffer.
      *
      * This new packet
      * is identical to the serialized packet contained in the buffer
      * and is magically deserialized for you
      *
-     * \param buffer the serialized packet to be created
-     * \param size the size of the packet for deserialization
-     * \param magic allows packet deserialization;
+     * @param buffer the serialized packet to be created
+     * @param size the size of the packet for deserialization
+     * @param magic allows packet deserialization;
      *        asserts when set to false
      */
     Packet(const uint8_t* buffer, uint32_t size, bool magic);
     /**
-     * \brief Create a packet with payload filled with the content
+     * @brief Create a packet with payload filled with the content
      * of this buffer.
      *
      * The input data is copied: the input
      * buffer is untouched.
      *
-     * \param buffer the data to store in the packet.
-     * \param size the size of the input buffer.
+     * @param buffer the data to store in the packet.
+     * @param size the size of the input buffer.
      */
     Packet(const uint8_t* buffer, uint32_t size);
     /**
-     * \brief Create a new packet which contains a fragment of the original
+     * @brief Create a new packet which contains a fragment of the original
      * packet.
      *
      * The returned packet shares the same uid as this packet.
      *
-     * \param start offset from start of packet to start of fragment to create
-     * \param length length of fragment to create
-     * \returns a fragment of the original packet
+     * @param start offset from start of packet to start of fragment to create
+     * @param length length of fragment to create
+     * @returns a fragment of the original packet
      */
     Ptr<Packet> CreateFragment(uint32_t start, uint32_t length) const;
     /**
-     * \brief Returns the the size in bytes of the packet (including the zero-filled
+     * @brief Returns the the size in bytes of the packet (including the zero-filled
      * initial payload).
      *
-     * \returns the size in bytes of the packet
+     * @returns the size in bytes of the packet
      */
     inline uint32_t GetSize() const;
     /**
-     * \brief Add header to this packet.
+     * @brief Add header to this packet.
      *
      * This method invokes the
      * Header::GetSerializedSize and Header::Serialize
      * methods to reserve space in the buffer and request the
      * header to serialize itself in the packet buffer.
      *
-     * \param header a reference to the header to add to this packet.
+     * @param header a reference to the header to add to this packet.
      */
     void AddHeader(const Header& header);
     /**
-     * \brief Deserialize and remove the header from the internal buffer.
+     * @brief Deserialize and remove the header from the internal buffer.
      *
      * This method invokes Header::Deserialize (begin) and should be used for
      * fixed-length headers.
      *
-     * \param header a reference to the header to remove from the internal buffer.
-     * \returns the number of bytes removed from the packet.
+     * @param header a reference to the header to remove from the internal buffer.
+     * @returns the number of bytes removed from the packet.
      */
     uint32_t RemoveHeader(Header& header);
     /**
-     * \brief Deserialize and remove the header from the internal buffer.
+     * @brief Deserialize and remove the header from the internal buffer.
      *
      * This method invokes Header::Deserialize (begin, end) and should be
      * used for variable-length headers (where the size is determined somehow
      * by the caller).
      *
-     * \param header a reference to the header to remove from the internal buffer.
-     * \param size number of bytes to deserialize
-     * \returns the number of bytes removed from the packet.
+     * @param header a reference to the header to remove from the internal buffer.
+     * @param size number of bytes to deserialize
+     * @returns the number of bytes removed from the packet.
      */
     uint32_t RemoveHeader(Header& header, uint32_t size);
     /**
-     * \brief Deserialize but does _not_ remove the header from the internal buffer.
+     * @brief Deserialize but does _not_ remove the header from the internal buffer.
      * s
      * This method invokes Header::Deserialize.
      *
-     * \param header a reference to the header to read from the internal buffer.
-     * \returns the number of bytes read from the packet.
+     * @param header a reference to the header to read from the internal buffer.
+     * @returns the number of bytes read from the packet.
      */
     uint32_t PeekHeader(Header& header) const;
     /**
-     * \brief Deserialize but does _not_ remove the header from the internal buffer.
+     * @brief Deserialize but does _not_ remove the header from the internal buffer.
      * s
      * This method invokes Header::Deserialize (begin, end) and should be used
      * for variable-length headers (where the size is determined somehow
      * by the caller).
      *
-     * \param header a reference to the header to read from the internal buffer.
-     * \param size number of bytes to deserialize
-     * \returns the number of bytes read from the packet.
+     * @param header a reference to the header to read from the internal buffer.
+     * @param size number of bytes to deserialize
+     * @returns the number of bytes read from the packet.
      */
     uint32_t PeekHeader(Header& header, uint32_t size) const;
     /**
-     * \brief Add trailer to this packet.
+     * @brief Add trailer to this packet.
      *
      * This method invokes the
      * Trailer::GetSerializedSize and Trailer::Serialize
      * methods to reserve space in the buffer and request the trailer
      * to serialize itself in the packet buffer.
      *
-     * \param trailer a reference to the trailer to add to this packet.
+     * @param trailer a reference to the trailer to add to this packet.
      */
     void AddTrailer(const Trailer& trailer);
     /**
-     * \brief Remove a deserialized trailer from the internal buffer.
+     * @brief Remove a deserialized trailer from the internal buffer.
      *
      * This method invokes the Deserialize method.
      *
-     * \param trailer a reference to the trailer to remove from the internal buffer.
-     * \returns the number of bytes removed from the end of the packet.
+     * @param trailer a reference to the trailer to remove from the internal buffer.
+     * @returns the number of bytes removed from the end of the packet.
      */
     uint32_t RemoveTrailer(Trailer& trailer);
     /**
-     * \brief Deserialize but does _not_ remove a trailer from the internal buffer.
+     * @brief Deserialize but does _not_ remove a trailer from the internal buffer.
      *
      * This method invokes the Trailer::Deserialize method.
      *
-     * \param trailer a reference to the trailer to read from the internal buffer.
-     * \returns the number of bytes read from the end of the packet.
+     * @param trailer a reference to the trailer to read from the internal buffer.
+     * @returns the number of bytes read from the end of the packet.
      */
     uint32_t PeekTrailer(Trailer& trailer);
 
     /**
-     * \brief Concatenate the input packet at the end of the current
+     * @brief Concatenate the input packet at the end of the current
      * packet.
      *
      * This does not alter the uid of either packet.
      *
-     * \param packet packet to concatenate
+     * @param packet packet to concatenate
      */
     void AddAtEnd(Ptr<const Packet> packet);
     /**
-     * \brief Add a zero-filled padding to the packet.
+     * @brief Add a zero-filled padding to the packet.
      *
-     * \param size number of padding bytes to add.
+     * @param size number of padding bytes to add.
      */
     void AddPaddingAtEnd(uint32_t size);
     /**
-     * \brief Remove size bytes from the end of the current packet.
+     * @brief Remove size bytes from the end of the current packet.
      *
      * It is safe to remove more bytes than are present in
      * the packet.
      *
-     * \param size number of bytes from remove
+     * @param size number of bytes from remove
      */
     void RemoveAtEnd(uint32_t size);
     /**
-     * \brief Remove size bytes from the start of the current packet.
+     * @brief Remove size bytes from the start of the current packet.
      *
      * It is safe to remove more bytes than are present in
      * the packet.
      *
-     * \param size number of bytes from remove
+     * @param size number of bytes from remove
      */
     void RemoveAtStart(uint32_t size);
 
     /**
-     * \brief Copy the packet contents to a byte buffer.
+     * @brief Copy the packet contents to a byte buffer.
      *
-     * \param buffer a pointer to a byte buffer where the packet data
+     * @param buffer a pointer to a byte buffer where the packet data
      *        should be copied.
-     * \param size the size of the byte buffer.
-     * \returns the number of bytes read from the packet
+     * @param size the size of the byte buffer.
+     * @returns the number of bytes read from the packet
      *
      * No more than \b size bytes will be copied by this function.
      */
     uint32_t CopyData(uint8_t* buffer, uint32_t size) const;
 
     /**
-     * \brief Copy the packet contents to an output stream.
+     * @brief Copy the packet contents to an output stream.
      *
-     * \param os pointer to output stream in which we want
+     * @param os pointer to output stream in which we want
      *        to write the packet data.
-     * \param size the maximum number of bytes we want to write
+     * @param size the maximum number of bytes we want to write
      *        in the output stream.
      */
     void CopyData(std::ostream* os, uint32_t size) const;
 
     /**
-     * \brief performs a COW copy of the packet.
+     * @brief performs a COW copy of the packet.
      *
-     * \returns a COW copy of the packet.
+     * @returns a COW copy of the packet.
      *
      * The returns packet will behave like an independent copy of
      * the original packet, even though they both share the
@@ -449,7 +449,7 @@
     Ptr<Packet> Copy() const;
 
     /**
-     * \brief Returns the packet's Uid.
+     * @brief Returns the packet's Uid.
      *
      * A packet is allocated a new uid when it is created
      * empty or with zero-filled payload.
@@ -464,15 +464,15 @@
      * sequence numbers, or other packet or frame counters at other
      * protocol layers.
      *
-     * \returns an integer identifier which uniquely
+     * @returns an integer identifier which uniquely
      *          identifies this packet.
      */
     uint64_t GetUid() const;
 
     /**
-     * \brief Print the packet contents.
+     * @brief Print the packet contents.
      *
-     * \param os output stream in which the data should be printed.
+     * @param os output stream in which the data should be printed.
      *
      * Iterate over the headers and trailers present in this packet,
      * from the first header to the last trailer and invoke, for
@@ -482,30 +482,30 @@
     void Print(std::ostream& os) const;
 
     /**
-     * \brief Return a string representation of the packet
+     * @brief Return a string representation of the packet
      *
      * An empty string is returned if you haven't called EnablePrinting ()
      *
-     * \return String representation
+     * @return String representation
      */
     std::string ToString() const;
 
     /**
-     * \brief Returns an iterator which points to the first 'item'
+     * @brief Returns an iterator which points to the first 'item'
      * stored in this buffer.
      *
      * Note that this iterator will point
      * to an empty array of items if you don't call EnablePrinting
      * or EnableChecking before.
      *
-     * \returns an iterator
+     * @returns an iterator
      *
      * \sa EnablePrinting EnableChecking
      */
     PacketMetadata::ItemIterator BeginItem() const;
 
     /**
-     * \brief Enable printing packets metadata.
+     * @brief Enable printing packets metadata.
      *
      * By default, packets do not keep around enough metadata to
      * perform the operations requested by the Print methods. If you
@@ -515,7 +515,7 @@
      */
     static void EnablePrinting();
     /**
-     * \brief Enable packets metadata checking.
+     * @brief Enable packets metadata checking.
      *
      * The packet metadata is also used to perform extensive
      * sanity checks at runtime when performing operations on a
@@ -527,10 +527,10 @@
     static void EnableChecking();
 
     /**
-     * \brief Returns number of bytes required for packet
+     * @brief Returns number of bytes required for packet
      * serialization.
      *
-     * \returns number of bytes required for packet
+     * @returns number of bytes required for packet
      * serialization
      *
      * For packet serialization, the total size is checked
@@ -540,19 +540,19 @@
     uint32_t GetSerializedSize() const;
 
     /**
-     * \brief Serialize a packet, tags, and metadata into a byte buffer.
+     * @brief Serialize a packet, tags, and metadata into a byte buffer.
      *
-     * \param buffer a raw byte buffer to which the packet will be serialized
-     * \param maxSize the max size of the buffer for bounds checking
+     * @param buffer a raw byte buffer to which the packet will be serialized
+     * @param maxSize the max size of the buffer for bounds checking
      *
-     * \returns one if all data were serialized, zero if buffer size was too small.
+     * @returns one if all data were serialized, zero if buffer size was too small.
      */
     uint32_t Serialize(uint8_t* buffer, uint32_t maxSize) const;
 
     /**
-     * \brief Tag each byte included in this packet with a new byte tag.
+     * @brief Tag each byte included in this packet with a new byte tag.
      *
-     * \param tag the new tag to add to this packet
+     * @param tag the new tag to add to this packet
      *
      * Note that adding a tag is a const operation which is pretty
      * un-intuitive. The rationale is that the content and behavior of
@@ -568,7 +568,7 @@
     void AddByteTag(const Tag& tag) const;
 
     /**
-     * \brief Tag the indicated byte range of this packet with a new byte tag.
+     * @brief Tag the indicated byte range of this packet with a new byte tag.
      *
      * As parameters for this method, we do not use indexes, but byte position.
      * Moreover, as there is no 0-th position, the first position is 1.
@@ -582,22 +582,22 @@
          p->AddByteTag (tag, 1, 10);
        \endcode
      *
-     * \param tag the new tag to add to this packet
-     * \param start the position of the first byte tagged by this tag
-     * \param end the position of the last byte tagged by this tag
+     * @param tag the new tag to add to this packet
+     * @param start the position of the first byte tagged by this tag
+     * @param end the position of the last byte tagged by this tag
      */
     void AddByteTag(const Tag& tag, uint32_t start, uint32_t end) const;
     /**
-     * \brief Returns an iterator over the set of byte tags included in this packet
+     * @brief Returns an iterator over the set of byte tags included in this packet
      *
-     * \returns an iterator over the set of byte tags included in this packet.
+     * @returns an iterator over the set of byte tags included in this packet.
      */
     ByteTagIterator GetByteTagIterator() const;
     /**
-     * \brief Finds the first tag matching the parameter Tag type
+     * @brief Finds the first tag matching the parameter Tag type
      *
-     * \param tag the byte tag type to search in this packet
-     * \returns true if the requested tag type was found, false otherwise.
+     * @param tag the byte tag type to search in this packet
+     * @returns true if the requested tag type was found, false otherwise.
      *
      * If the requested tag type is found, it is copied in the user's
      * provided tag instance.
@@ -605,22 +605,22 @@
     bool FindFirstMatchingByteTag(Tag& tag) const;
 
     /**
-     * \brief Remove all byte tags stored in this packet.
+     * @brief Remove all byte tags stored in this packet.
      */
     void RemoveAllByteTags();
 
     /**
-     * \param os output stream in which the data should be printed.
+     * @param os output stream in which the data should be printed.
      *
-     * \brief Iterate over the byte tags present in this packet, and
+     * @brief Iterate over the byte tags present in this packet, and
      * invoke the Print method of each tag stored in the packet.
      */
     void PrintByteTags(std::ostream& os) const;
 
     /**
-     * \brief Add a packet tag.
+     * @brief Add a packet tag.
      *
-     * \param tag the packet tag type to add.
+     * @param tag the packet tag type to add.
      *
      * Note that this method is const, that is, it does not
      * modify the state of this packet, which is fairly
@@ -628,42 +628,42 @@
      */
     void AddPacketTag(const Tag& tag) const;
     /**
-     * \brief Remove a packet tag.
+     * @brief Remove a packet tag.
      *
-     * \param tag the packet tag type to remove from this packet.
+     * @param tag the packet tag type to remove from this packet.
      *        The tag parameter is set to the value of the tag found.
-     * \returns true if the requested tag is found, false
+     * @returns true if the requested tag is found, false
      *          otherwise.
      */
     bool RemovePacketTag(Tag& tag);
     /**
-     * \brief Replace the value of a packet tag.
+     * @brief Replace the value of a packet tag.
      *
-     * \param tag the packet tag type to replace.  To get the old
+     * @param tag the packet tag type to replace.  To get the old
      *        value of the tag, use PeekPacketTag first.
-     * \returns true if the requested tag is found, false otherwise.
+     * @returns true if the requested tag is found, false otherwise.
      *        If the tag isn't found, Add is performed instead (so
      *        the packet is guaranteed to have the new tag value
      *        either way).
      */
     bool ReplacePacketTag(Tag& tag);
     /**
-     * \brief Search a matching tag and call Tag::Deserialize if it is found.
+     * @brief Search a matching tag and call Tag::Deserialize if it is found.
      *
-     * \param tag the tag to search in this packet
-     * \returns true if the requested tag is found, false
+     * @param tag the tag to search in this packet
+     * @returns true if the requested tag is found, false
      *          otherwise.
      */
     bool PeekPacketTag(Tag& tag) const;
     /**
-     * \brief Remove all packet tags.
+     * @brief Remove all packet tags.
      */
     void RemoveAllPacketTags();
 
     /**
-     * \brief Print the list of packet tags.
+     * @brief Print the list of packet tags.
      *
-     * \param os the stream on which to print the tags.
+     * @param os the stream on which to print the tags.
      *
      * \sa Packet::AddPacketTag, Packet::RemovePacketTag, Packet::PeekPacketTag,
      *  Packet::RemoveAllPacketTags
@@ -671,61 +671,61 @@
     void PrintPacketTags(std::ostream& os) const;
 
     /**
-     * \brief Returns an object which can be used to iterate over the list of
+     * @brief Returns an object which can be used to iterate over the list of
      *  packet tags.
      *
-     * \returns an object which can be used to iterate over the list of
+     * @returns an object which can be used to iterate over the list of
      *  packet tags.
      */
     PacketTagIterator GetPacketTagIterator() const;
 
     /**
-     * \brief Set the packet nix-vector.
+     * @brief Set the packet nix-vector.
      *
-     * \note Note: This function supports a temporary solution
+     * @note Note: This function supports a temporary solution
      * to a specific problem in this generic class, i.e.
      * how to associate something specific like nix-vector
      * with a packet.  This design methodology
      * should _not_ be followed, and is only here as an
      * impetus to fix this general issue.
      *
-     * \warning For real this function is not const, as it is the
+     * @warning For real this function is not const, as it is the
      * setter for a mutable variable member. The const qualifier
      * is needed to set a private mutable variable of const objects.
      *
-     * \param nixVector the nix vector
+     * @param nixVector the nix vector
      */
     void SetNixVector(Ptr<NixVector> nixVector) const;
     /**
-     * \brief Get the packet nix-vector.
+     * @brief Get the packet nix-vector.
      *
      * See the comment on SetNixVector
      *
-     * \returns the Nix vector
+     * @returns the Nix vector
      */
     Ptr<NixVector> GetNixVector() const;
 
     /**
      * TracedCallback signature for Ptr<Packet>
      *
-     * \param [in] packet The packet.
+     * @param [in] packet The packet.
      */
     typedef void (*TracedCallback)(Ptr<const Packet> packet);
 
     /**
      * TracedCallback signature for packet and Address.
      *
-     * \param [in] packet The packet.
-     * \param [in] address The address.
+     * @param [in] packet The packet.
+     * @param [in] address The address.
      */
     typedef void (*AddressTracedCallback)(Ptr<const Packet> packet, const Address& address);
 
     /**
      * TracedCallback signature for packet and source/destination addresses.
      *
-     * \param [in] packet The packet.
-     * \param [in] srcAddress The source address.
-     * \param [in] destAddress The destination address.
+     * @param [in] packet The packet.
+     * @param [in] srcAddress The source address.
+     * @param [in] destAddress The destination address.
      */
     typedef void (*TwoAddressTracedCallback)(const Ptr<const Packet> packet,
                                              const Address& srcAddress,
@@ -734,34 +734,34 @@
     /**
      * TracedCallback signature for packet and Mac48Address.
      *
-     * \param [in] packet The packet.
-     * \param [in] mac The Mac48Address.
+     * @param [in] packet The packet.
+     * @param [in] mac The Mac48Address.
      */
     typedef void (*Mac48AddressTracedCallback)(Ptr<const Packet> packet, Mac48Address mac);
 
     /**
      * TracedCallback signature for changes in packet size.
      *
-     * \param [in] oldSize The previous packet's size.
-     * \param [in] newSize The actual packet's size.
+     * @param [in] oldSize The previous packet's size.
+     * @param [in] newSize The actual packet's size.
      */
     typedef void (*SizeTracedCallback)(uint32_t oldSize, uint32_t newSize);
 
     /**
      * TracedCallback signature for packet and SINR.
      *
-     * \param [in] packet The packet.
-     * \param [in] sinr The received SINR.
+     * @param [in] packet The packet.
+     * @param [in] sinr The received SINR.
      */
     typedef void (*SinrTracedCallback)(Ptr<const Packet> packet, double sinr);
 
   private:
     /**
-     * \brief Constructor
-     * \param buffer the packet buffer
-     * \param byteTagList the ByteTag list
-     * \param packetTagList the packet's Tag list
-     * \param metadata the packet's metadata
+     * @brief Constructor
+     * @param buffer the packet buffer
+     * @param byteTagList the ByteTag list
+     * @param packetTagList the packet's Tag list
+     * @param metadata the packet's metadata
      */
     Packet(const Buffer& buffer,
            const ByteTagList& byteTagList,
@@ -769,10 +769,10 @@
            const PacketMetadata& metadata);
 
     /**
-     * \brief Deserializes a packet.
-     * \param [in] buffer the input buffer.
-     * \param [in] size the buffer size.
-     * \returns the number of deserialized bytes.
+     * @brief Deserializes a packet.
+     * @param [in] buffer the input buffer.
+     * @param [in] size the buffer size.
+     * @returns the number of deserialized bytes.
      */
     uint32_t Deserialize(const uint8_t* buffer, uint32_t size);
 
@@ -788,17 +788,17 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the stream
- * \param packet the packet
- * \returns a reference to the stream
+ * @param os the stream
+ * @param packet the packet
+ * @returns a reference to the stream
  */
 std::ostream& operator<<(std::ostream& os, const Packet& packet);
 
 /**
- * \ingroup network
- * \defgroup packetperf Packet Performance
+ * @ingroup network
+ * @defgroup packetperf Packet Performance
  * The current implementation of the byte buffers and tag list is based
  * on COW (Copy On Write. An introduction to COW can be found in Scott
  * Meyer's "More Effective C++", items 17 and 29). What this means is that
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/model/packet-metadata.h ns-3.44/src/network/model/packet-metadata.h
--- ns-3.43/src/network/model/packet-metadata.h	2024-10-09 16:41:10.068656400 -0700
+++ ns-3.44/src/network/model/packet-metadata.h	2025-03-09 16:55:49.675372100 -0700
@@ -27,8 +27,8 @@
 class Trailer;
 
 /**
- * \ingroup packet
- * \brief Handle packet metadata about packet headers and trailers
+ * @ingroup packet
+ * @brief Handle packet metadata about packet headers and trailers
  *
  * This class is used by the Packet class to record every operation
  * performed on the packet's buffer. This class also provides
@@ -70,7 +70,7 @@
 {
   public:
     /**
-     * \brief structure describing a packet metadata item
+     * @brief structure describing a packet metadata item
      */
     struct Item
     {
@@ -120,25 +120,25 @@
     };
 
     /**
-     * \brief Iterator class for metadata items.
+     * @brief Iterator class for metadata items.
      */
     class ItemIterator
     {
       public:
         /**
-         * \brief Constructor
-         * \param metadata a pointer to the metadata
-         * \param buffer the buffer the metadata refers to
+         * @brief Constructor
+         * @param metadata a pointer to the metadata
+         * @param buffer the buffer the metadata refers to
          */
         ItemIterator(const PacketMetadata* metadata, Buffer buffer);
         /**
-         * \brief Checks if there is another metadata item
-         * \returns true if there is another item
+         * @brief Checks if there is another metadata item
+         * @returns true if there is another item
          */
         bool HasNext() const;
         /**
-         * \brief Retrieve the next metadata item
-         * \returns the next metadata item
+         * @brief Retrieve the next metadata item
+         * @returns the next metadata item
          */
         Item Next();
 
@@ -151,29 +151,29 @@
     };
 
     /**
-     * \brief Enable the packet metadata
+     * @brief Enable the packet metadata
      */
     static void Enable();
     /**
-     * \brief Enable the packet metadata checking
+     * @brief Enable the packet metadata checking
      */
     static void EnableChecking();
 
     /**
-     * \brief Constructor
-     * \param uid packet uid
-     * \param size size of the header
+     * @brief Constructor
+     * @param uid packet uid
+     * @param size size of the header
      */
     inline PacketMetadata(uint64_t uid, uint32_t size);
     /**
-     * \brief Copy constructor
-     * \param o the object to copy
+     * @brief Copy constructor
+     * @param o the object to copy
      */
     inline PacketMetadata(const PacketMetadata& o);
     /**
-     * \brief Basic assignment
-     * \param o the object to copy
-     * \return a copied object
+     * @brief Basic assignment
+     * @param o the object to copy
+     * @return a copied object
      */
     inline PacketMetadata& operator=(const PacketMetadata& o);
     inline ~PacketMetadata();
@@ -182,37 +182,37 @@
     PacketMetadata() = delete;
 
     /**
-     * \brief Add an header
-     * \param header header to add
-     * \param size header serialized size
+     * @brief Add an header
+     * @param header header to add
+     * @param size header serialized size
      */
     void AddHeader(const Header& header, uint32_t size);
     /**
-     * \brief Remove an header
-     * \param header header to remove
-     * \param size header serialized size
+     * @brief Remove an header
+     * @param header header to remove
+     * @param size header serialized size
      */
     void RemoveHeader(const Header& header, uint32_t size);
 
     /**
      * Add a trailer
-     * \param trailer trailer to add
-     * \param size trailer serialized size
+     * @param trailer trailer to add
+     * @param size trailer serialized size
      */
     void AddTrailer(const Trailer& trailer, uint32_t size);
     /**
      * Remove a trailer
-     * \param trailer trailer to remove
-     * \param size trailer serialized size
+     * @param trailer trailer to remove
+     * @param size trailer serialized size
      */
     void RemoveTrailer(const Trailer& trailer, uint32_t size);
 
     /**
-     * \brief Creates a fragment.
+     * @brief Creates a fragment.
      *
-     * \param start the amount of stuff to remove from the start
-     * \param end the amount of stuff to remove from the end
-     * \return the fragment's metadata
+     * @param start the amount of stuff to remove from the start
+     * @param end the amount of stuff to remove from the end
+     * @return the fragment's metadata
      *
      * Calling this method is equivalent to calling RemoveAtStart (start)
      * and then, RemoveAtEnd (end).
@@ -220,69 +220,69 @@
     PacketMetadata CreateFragment(uint32_t start, uint32_t end) const;
 
     /**
-     * \brief Add a metadata at the metadata start
-     * \param o the metadata to add
+     * @brief Add a metadata at the metadata start
+     * @param o the metadata to add
      */
     void AddAtEnd(const PacketMetadata& o);
     /**
-     * \brief Add some padding at the end
-     * \param end size of padding
+     * @brief Add some padding at the end
+     * @param end size of padding
      */
     void AddPaddingAtEnd(uint32_t end);
     /**
-     * \brief Remove a chunk of metadata at the metadata start
-     * \param start the size of metadata to remove
+     * @brief Remove a chunk of metadata at the metadata start
+     * @param start the size of metadata to remove
      */
     void RemoveAtStart(uint32_t start);
     /**
-     * \brief Remove a chunk of metadata at the metadata end
-     * \param end the size of metadata to remove
+     * @brief Remove a chunk of metadata at the metadata end
+     * @param end the size of metadata to remove
      */
     void RemoveAtEnd(uint32_t end);
 
     /**
-     * \brief Get the packet Uid
-     * \return the packet Uid
+     * @brief Get the packet Uid
+     * @return the packet Uid
      */
     uint64_t GetUid() const;
 
     /**
-     * \brief Get the metadata serialized size
-     * \return the serialized size
+     * @brief Get the metadata serialized size
+     * @return the serialized size
      */
     uint32_t GetSerializedSize() const;
 
     /**
-     * \brief Initialize the item iterator to the buffer begin
-     * \param buffer buffer to initialize.
-     * \return the buffer iterator.
+     * @brief Initialize the item iterator to the buffer begin
+     * @param buffer buffer to initialize.
+     * @return the buffer iterator.
      */
     ItemIterator BeginItem(Buffer buffer) const;
 
     /**
-     * \brief Serialization to raw uint8_t*
-     * \param buffer the buffer to serialize to
-     * \param maxSize the maximum serialization size
-     * \return 1 on success, 0 on failure
+     * @brief Serialization to raw uint8_t*
+     * @param buffer the buffer to serialize to
+     * @param maxSize the maximum serialization size
+     * @return 1 on success, 0 on failure
      */
     uint32_t Serialize(uint8_t* buffer, uint32_t maxSize) const;
     /**
-     * \brief Deserialization from raw uint8_t*
-     * \param buffer the buffer to deserialize from
-     * \param size the size
-     * \return 1 on success, 0 on failure
+     * @brief Deserialization from raw uint8_t*
+     * @param buffer the buffer to deserialize from
+     * @param size the size
+     * @return 1 on success, 0 on failure
      */
     uint32_t Deserialize(const uint8_t* buffer, uint32_t size);
 
   private:
     /**
-     * \brief Helper for the raw serialization.
+     * @brief Helper for the raw serialization.
      *
-     * \param data the buffer to write to
-     * \param start start index
-     * \param current current index
-     * \param maxSize maximum size
-     * \return updated current index
+     * @param data the buffer to write to
+     * @param start start index
+     * @param current current index
+     * @param maxSize maximum size
+     * @return updated current index
      */
     static uint8_t* AddToRawU8(const uint8_t& data,
                                uint8_t* start,
@@ -290,13 +290,13 @@
                                uint32_t maxSize);
 
     /**
-     * \brief Helper for the raw serialization.
+     * @brief Helper for the raw serialization.
      *
-     * \param data the buffer to write to
-     * \param start start index
-     * \param current current index
-     * \param maxSize maximum size
-     * \return updated current index
+     * @param data the buffer to write to
+     * @param start start index
+     * @param current current index
+     * @param maxSize maximum size
+     * @return updated current index
      */
     static uint8_t* AddToRawU16(const uint16_t& data,
                                 uint8_t* start,
@@ -304,13 +304,13 @@
                                 uint32_t maxSize);
 
     /**
-     * \brief Helper for the raw serialization.
+     * @brief Helper for the raw serialization.
      *
-     * \param data the buffer to write to
-     * \param start start index
-     * \param current current index
-     * \param maxSize maximum size
-     * \return updated current index
+     * @param data the buffer to write to
+     * @param start start index
+     * @param current current index
+     * @param maxSize maximum size
+     * @return updated current index
      */
     static uint8_t* AddToRawU32(const uint32_t& data,
                                 uint8_t* start,
@@ -318,13 +318,13 @@
                                 uint32_t maxSize);
 
     /**
-     * \brief Helper for the raw serialization.
+     * @brief Helper for the raw serialization.
      *
-     * \param data the buffer to write to
-     * \param start start index
-     * \param current current index
-     * \param maxSize maximum size
-     * \return updated current index
+     * @param data the buffer to write to
+     * @param start start index
+     * @param current current index
+     * @param maxSize maximum size
+     * @return updated current index
      */
     static uint8_t* AddToRawU64(const uint64_t& data,
                                 uint8_t* start,
@@ -332,14 +332,14 @@
                                 uint32_t maxSize);
 
     /**
-     * \brief Helper for the raw serialization.
+     * @brief Helper for the raw serialization.
      *
-     * \param data the buffer to write to
-     * \param dataSize the data size to write to
-     * \param start start index
-     * \param current current index
-     * \param maxSize maximum size
-     * \return updated current index
+     * @param data the buffer to write to
+     * @param dataSize the data size to write to
+     * @param start start index
+     * @param current current index
+     * @param maxSize maximum size
+     * @return updated current index
      */
     static uint8_t* AddToRaw(const uint8_t* data,
                              uint32_t dataSize,
@@ -348,13 +348,13 @@
                              uint32_t maxSize);
 
     /**
-     * \brief Helper for the raw deserialization.
+     * @brief Helper for the raw deserialization.
      *
-     * \param data the buffer to read from
-     * \param start start index
-     * \param current current index
-     * \param maxSize maximum size
-     * \return updated current index
+     * @param data the buffer to read from
+     * @param start start index
+     * @param current current index
+     * @param maxSize maximum size
+     * @return updated current index
      */
     static uint8_t* ReadFromRawU8(uint8_t& data,
                                   const uint8_t* start,
@@ -362,13 +362,13 @@
                                   uint32_t maxSize);
 
     /**
-     * \brief Helper for the raw deserialization.
+     * @brief Helper for the raw deserialization.
      *
-     * \param data the buffer to read from
-     * \param start start index
-     * \param current current index
-     * \param maxSize maximum size
-     * \return updated current index
+     * @param data the buffer to read from
+     * @param start start index
+     * @param current current index
+     * @param maxSize maximum size
+     * @return updated current index
      */
     static uint8_t* ReadFromRawU16(uint16_t& data,
                                    const uint8_t* start,
@@ -376,13 +376,13 @@
                                    uint32_t maxSize);
 
     /**
-     * \brief Helper for the raw deserialization.
+     * @brief Helper for the raw deserialization.
      *
-     * \param data the buffer to read from
-     * \param start start index
-     * \param current current index
-     * \param maxSize maximum size
-     * \return updated current index
+     * @param data the buffer to read from
+     * @param start start index
+     * @param current current index
+     * @param maxSize maximum size
+     * @return updated current index
      */
     static uint8_t* ReadFromRawU32(uint32_t& data,
                                    const uint8_t* start,
@@ -390,13 +390,13 @@
                                    uint32_t maxSize);
 
     /**
-     * \brief Helper for the raw deserialization.
+     * @brief Helper for the raw deserialization.
      *
-     * \param data the buffer to read from
-     * \param start start index
-     * \param current current index
-     * \param maxSize maximum size
-     * \return updated current index
+     * @param data the buffer to read from
+     * @param start start index
+     * @param current current index
+     * @param maxSize maximum size
+     * @return updated current index
      */
     static uint8_t* ReadFromRawU64(uint64_t& data,
                                    const uint8_t* start,
@@ -431,7 +431,7 @@
        a m_data byte buffer.
      */
     /**
-     * \brief SmallItem structure
+     * @brief SmallItem structure
      */
     struct SmallItem
     {
@@ -476,7 +476,7 @@
     };
 
     /**
-     * \brief ExtraItem structure
+     * @brief ExtraItem structure
      */
     struct ExtraItem
     {
@@ -499,7 +499,7 @@
     };
 
     /**
-     * \brief Class to hold all the metadata
+     * @brief Class to hold all the metadata
      */
     class DataFreeList : public std::vector<Data*>
     {
@@ -512,155 +512,155 @@
     friend class ItemIterator;
 
     /**
-     * \brief Add a SmallItem
-     * \param item the SmallItem to add
-     * \return added size
+     * @brief Add a SmallItem
+     * @param item the SmallItem to add
+     * @return added size
      */
     inline uint16_t AddSmall(const PacketMetadata::SmallItem* item);
     /**
-     * \brief Add a "Big" Item (a SmallItem plus an ExtraItem)
-     * \param head the head
-     * \param tail the tail
-     * \param item the SmallItem to add
-     * \param extraItem the ExtraItem to add
-     * \return added size
+     * @brief Add a "Big" Item (a SmallItem plus an ExtraItem)
+     * @param head the head
+     * @param tail the tail
+     * @param item the SmallItem to add
+     * @param extraItem the ExtraItem to add
+     * @return added size
      */
     uint16_t AddBig(uint32_t head,
                     uint32_t tail,
                     const PacketMetadata::SmallItem* item,
                     const PacketMetadata::ExtraItem* extraItem);
     /**
-     * \brief Replace the tail
-     * \param item the item data to write
-     * \param extraItem the extra item data to write
-     * \param available the number of bytes which can
+     * @brief Replace the tail
+     * @param item the item data to write
+     * @param extraItem the extra item data to write
+     * @param available the number of bytes which can
      *        be written without having to rewrite the buffer entirely.
      */
     void ReplaceTail(PacketMetadata::SmallItem* item,
                      PacketMetadata::ExtraItem* extraItem,
                      uint32_t available);
     /**
-     * \brief Update the head
-     * \param written the used bytes
+     * @brief Update the head
+     * @param written the used bytes
      */
     inline void UpdateHead(uint16_t written);
     /**
-     * \brief Update the tail
-     * \param written the used bytes
+     * @brief Update the tail
+     * @param written the used bytes
      */
     inline void UpdateTail(uint16_t written);
 
     /**
-     * \brief Get the ULEB128 (Unsigned Little Endian Base 128) size
-     * \param value the value
-     * \returns the value's ULEB128 size
+     * @brief Get the ULEB128 (Unsigned Little Endian Base 128) size
+     * @param value the value
+     * @returns the value's ULEB128 size
      */
     inline uint32_t GetUleb128Size(uint32_t value) const;
     /**
-     * \brief Read a ULEB128 (Unsigned Little Endian Base 128) coded number
-     * \param pBuffer the buffer to read from
-     * \returns the value
+     * @brief Read a ULEB128 (Unsigned Little Endian Base 128) coded number
+     * @param pBuffer the buffer to read from
+     * @returns the value
      */
     uint32_t ReadUleb128(const uint8_t** pBuffer) const;
     /**
-     * \brief Append a 16-bit value to the buffer
-     * \param value the value to add
-     * \param buffer the buffer to write to
+     * @brief Append a 16-bit value to the buffer
+     * @param value the value to add
+     * @param buffer the buffer to write to
      */
     inline void Append16(uint16_t value, uint8_t* buffer);
     /**
-     * \brief Append a 32-bit value to the buffer
-     * \param value the value to add
-     * \param buffer the buffer to write to
+     * @brief Append a 32-bit value to the buffer
+     * @param value the value to add
+     * @param buffer the buffer to write to
      */
     inline void Append32(uint32_t value, uint8_t* buffer);
     /**
-     * \brief Append a value to the buffer
-     * \param value the value to add
-     * \param buffer the buffer to write to
+     * @brief Append a value to the buffer
+     * @param value the value to add
+     * @param buffer the buffer to write to
      */
     inline void AppendValue(uint32_t value, uint8_t* buffer);
     /**
-     * \brief Append a value to the buffer - extra
+     * @brief Append a value to the buffer - extra
      *
      * This function is called by AppendValue
      *
-     * \param value the value to add
-     * \param buffer the buffer to write to
+     * @param value the value to add
+     * @param buffer the buffer to write to
      */
     void AppendValueExtra(uint32_t value, uint8_t* buffer);
 
     /**
-     * \brief Reserve space
-     * \param n space to reserve
+     * @brief Reserve space
+     * @param n space to reserve
      */
     inline void Reserve(uint32_t n);
     /**
-     * \brief Reserve space and make a metadata copy
-     * \param n space to reserve
+     * @brief Reserve space and make a metadata copy
+     * @param n space to reserve
      */
     void ReserveCopy(uint32_t n);
 
     /**
-     * \brief Get the total size used by the metadata
-     * \return the metadata used size
+     * @brief Get the total size used by the metadata
+     * @return the metadata used size
      */
     uint32_t GetTotalSize() const;
 
     /**
-     * \brief Read items
-     * \param current the offset we should start reading the data from
-     * \param item pointer to where we should store the data to return to the caller
-     * \param extraItem pointer to where we should store the data to return to the caller
-     * \returns the number of bytes read.
+     * @brief Read items
+     * @param current the offset we should start reading the data from
+     * @param item pointer to where we should store the data to return to the caller
+     * @param extraItem pointer to where we should store the data to return to the caller
+     * @returns the number of bytes read.
      */
     uint32_t ReadItems(uint16_t current,
                        PacketMetadata::SmallItem* item,
                        PacketMetadata::ExtraItem* extraItem) const;
     /**
-     * \brief Add an header
-     * \param uid header's uid to add
-     * \param size header serialized size
+     * @brief Add an header
+     * @param uid header's uid to add
+     * @param size header serialized size
      */
     void DoAddHeader(uint32_t uid, uint32_t size);
     /**
-     * \brief Check if the metadata state is ok
-     * \returns true if the internal state is ok
+     * @brief Check if the metadata state is ok
+     * @returns true if the internal state is ok
      */
     bool IsStateOk() const;
     /**
-     * \brief Check if the position is valid
-     * \param pointer the position to check
-     * \returns true if the position is valid
+     * @brief Check if the position is valid
+     * @param pointer the position to check
+     * @returns true if the position is valid
      */
     bool IsPointerOk(uint16_t pointer) const;
     /**
-     * \brief Check if the position is valid
-     * \param pointer the position to check
-     * \returns true if the position is valid
+     * @brief Check if the position is valid
+     * @param pointer the position to check
+     * @returns true if the position is valid
      */
     bool IsSharedPointerOk(uint16_t pointer) const;
 
     /**
-     * \brief Recycle the buffer memory
-     * \param data the buffer data storage
+     * @brief Recycle the buffer memory
+     * @param data the buffer data storage
      */
     static void Recycle(PacketMetadata::Data* data);
     /**
-     * \brief Create a buffer data storage
-     * \param size the storage size to create
-     * \returns a pointer to the created buffer storage
+     * @brief Create a buffer data storage
+     * @param size the storage size to create
+     * @returns a pointer to the created buffer storage
      */
     static PacketMetadata::Data* Create(uint32_t size);
     /**
-     * \brief Allocate a buffer data storage
-     * \param n the storage size to create
-     * \returns a pointer to the allocated buffer storage
+     * @brief Allocate a buffer data storage
+     * @param n the storage size to create
+     * @returns a pointer to the allocated buffer storage
      */
     static PacketMetadata::Data* Allocate(uint32_t n);
     /**
-     * \brief Deallocate the buffer memory
-     * \param data the buffer data storage
+     * @brief Deallocate the buffer memory
+     * @param data the buffer data storage
      */
     static void Deallocate(PacketMetadata::Data* data);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/model/packet-tag-list.h ns-3.44/src/network/model/packet-tag-list.h
--- ns-3.43/src/network/model/packet-tag-list.h	2024-10-09 16:41:10.068656400 -0700
+++ ns-3.44/src/network/model/packet-tag-list.h	2025-03-09 16:55:49.675372100 -0700
@@ -24,19 +24,19 @@
 class Tag;
 
 /**
- * \ingroup packet
+ * @ingroup packet
  *
- * \brief List of the packet tags stored in a packet.
+ * @brief List of the packet tags stored in a packet.
  *
  * This class is mostly private to the Packet implementation and users
  * should never have to access it directly.
  *
- * \internal
+ * @internal
  *
  * The implementation of this class is a bit tricky.  Refer to this
  * diagram in the discussion that follows.
  *
- * \dot
+ * @dot
  *    digraph {
  *        rankdir = "LR";
  *        clusterrank = local;
@@ -66,7 +66,7 @@
  *          T1:n -> NULL ;
  *        };
  *      }
- * \enddot
+ * @enddot
  *
  *   - Tags are stored in serialized form in a tree of TagData
  *     structures. (<tt>T1-T7</tt> in the diagram)
@@ -85,7 +85,7 @@
  *   - Conceptually, therefore, each Packet has a PacketTagList which
  *     points to a singly-linked list of TagData.
  *
- * \par <b> Copy-on-write </b> is implemented as follows:
+ * @par <b> Copy-on-write </b> is implemented as follows:
  *
  *   - #Add prepends the new tag to the list (growing that branch of the tree,
  *     as \c T6). This is a constant time operation, and does not affect
@@ -118,7 +118,7 @@
      *
      * See PacketTagList for a discussion of the data structure.
      *
-     * \internal
+     * @internal
      * Unfortunately this has to be public, because
      * PacketTagIterator::Item::GetTag() needs the data and size values.
      * The Item nested class can't be forward declared, so friending isn't
@@ -144,7 +144,7 @@
     /**
      * Copy constructor
      *
-     * \param [in] o The PacketTagList to copy.
+     * @param [in] o The PacketTagList to copy.
      *
      * This makes a light-weight copy by #RemoveAll, then
      * pointing to the same \ref TagData as \pname{o}.
@@ -153,8 +153,8 @@
     /**
      * Assignment
      *
-     * \param [in] o The PacketTagList to copy.
-     * \returns the copied object
+     * @param [in] o The PacketTagList to copy.
+     * @returns the copied object
      *
      * This makes a light-weight copy by #RemoveAll, then
      * pointing to the same \ref TagData as \pname{o}.
@@ -170,23 +170,23 @@
     /**
      * Add a tag to the head of this branch.
      *
-     * \param [in] tag The tag to add
+     * @param [in] tag The tag to add
      */
     void Add(const Tag& tag) const;
     /**
      * Remove (the first instance of) tag from the list.
      *
-     * \param [in,out] tag The tag type to remove.  If found,
+     * @param [in,out] tag The tag type to remove.  If found,
      *          \pname{tag} is set to the value of the tag found.
-     * \returns True if \pname{tag} is found, false otherwise.
+     * @returns True if \pname{tag} is found, false otherwise.
      */
     bool Remove(Tag& tag);
     /**
      * Replace the value of a tag.
      *
-     * \param [in] tag The tag type to replace.  To get the old
+     * @param [in] tag The tag type to replace.  To get the old
      *        value of the tag, use #Peek first.
-     * \returns True if \pname{tag} is found, false otherwise.
+     * @returns True if \pname{tag} is found, false otherwise.
      *        If \pname{tag} wasn't found, Add is performed instead (so
      *        the list is guaranteed to have the new tag value either way).
      */
@@ -194,9 +194,9 @@
     /**
      * Find a tag and return its value.
      *
-     * \param [in,out] tag The tag type to find.  If found,
+     * @param [in,out] tag The tag type to find.  If found,
      *          \pname{tag} is set to the value of the tag found.
-     * \returns True if \pname{tag} is found, false otherwise.
+     * @returns True if \pname{tag} is found, false otherwise.
      */
     bool Peek(Tag& tag) const;
     /**
@@ -204,31 +204,31 @@
      */
     inline void RemoveAll();
     /**
-     * \returns pointer to head of tag list
+     * @returns pointer to head of tag list
      */
     const PacketTagList::TagData* Head() const;
     /**
      * Returns number of bytes required for packet serialization.
      *
-     * \returns number of bytes required for packet serialization
+     * @returns number of bytes required for packet serialization
      */
     uint32_t GetSerializedSize() const;
     /**
      * Serialize the tag list into a byte buffer.
      *
-     * \param [in,out] buffer The byte buffer to which the tag list will be serialized
-     * \param [in] maxSize Max The max size of the buffer for bounds checking
+     * @param [in,out] buffer The byte buffer to which the tag list will be serialized
+     * @param [in] maxSize Max The max size of the buffer for bounds checking
      *
-     * \returns zero if complete tag list is not serialized
+     * @returns zero if complete tag list is not serialized
      */
     uint32_t Serialize(uint32_t* buffer, uint32_t maxSize) const;
     /**
      * Deserialize tag list from the provided buffer.
      *
-     * \param [in] buffer The buffer to read from.
-     * \param [in] size The number of bytes to deserialize.
+     * @param [in] buffer The buffer to read from.
+     * @param [in] size The number of bytes to deserialize.
      *
-     * \returns zero if complete tag list is not deserialized
+     * @returns zero if complete tag list is not deserialized
      */
     uint32_t Deserialize(const uint32_t* buffer, uint32_t size);
 
@@ -237,21 +237,21 @@
      * Allocate and construct a TagData struct, sizing the data area
      * large enough to serialize dataSize bytes from a Tag.
      *
-     * \param [in] dataSize The serialized size of the Tag.
-     * \returns The newly constructed TagData object.
+     * @param [in] dataSize The serialized size of the Tag.
+     * @returns The newly constructed TagData object.
      */
     static TagData* CreateTagData(size_t dataSize);
 
     /**
      * Typedef of method function pointer for copy-on-write operations
      *
-     * \param [in] tag The tag type to operate on.
-     * \param [in] preMerge True if \pname{tag} was found before the first merge,
+     * @param [in] tag The tag type to operate on.
+     * @param [in] preMerge True if \pname{tag} was found before the first merge,
      *             false otherwise.
-     * \param [in] cur Pointer to the tag.
-     * \param [in] prevNext Pointer to the struct TagData.next pointer
+     * @param [in] cur Pointer to the tag.
+     * @param [in] prevNext Pointer to the struct TagData.next pointer
      *          pointing to \pname{cur}.
-     * \returns True if operation successful, false otherwise
+     * @returns True if operation successful, false otherwise
      */
     typedef bool (PacketTagList::*COWWriter)(Tag& tag,
                                              bool preMerge,
@@ -260,33 +260,33 @@
     /**
      * Traverse the list implementing copy-on-write, using \pname{Writer}.
      *
-     * \param [in] tag The tag type to operate on.
-     * \param [in] Writer The copy-on-write function to use.
-     * \returns True if \pname{tag} found, false otherwise.
+     * @param [in] tag The tag type to operate on.
+     * @param [in] Writer The copy-on-write function to use.
+     * @returns True if \pname{tag} found, false otherwise.
      */
     bool COWTraverse(Tag& tag, PacketTagList::COWWriter Writer);
     /**
      * Copy-on-write implementing Remove.
      *
-     * \param [in] tag The target tag type to remove.
-     * \param [in] preMerge True if \pname{tag} was found before the first merge,
+     * @param [in] tag The target tag type to remove.
+     * @param [in] preMerge True if \pname{tag} was found before the first merge,
      *             false otherwise.
-     * \param [in] cur Pointer to the tag.
-     * \param [in] prevNext Pointer to the struct TagData.next pointer
+     * @param [in] cur Pointer to the tag.
+     * @param [in] prevNext Pointer to the struct TagData.next pointer
      *          pointing to \pname{cur}.
-     * \returns True, since tag will definitely be removed.
+     * @returns True, since tag will definitely be removed.
      */
     bool RemoveWriter(Tag& tag, bool preMerge, TagData* cur, TagData** prevNext);
     /**
      * Copy-on-write implementing Replace
      *
-     * \param [in] tag The target tag type to replace
-     * \param [in] preMerge True if \pname{tag} was found before the first merge,
+     * @param [in] tag The target tag type to replace
+     * @param [in] preMerge True if \pname{tag} was found before the first merge,
      *          false otherwise.
-     * \param [in] cur Pointer to the tag
-     * \param [in] prevNext Pointer to the struct TagData.next pointer
+     * @param [in] cur Pointer to the tag
+     * @param [in] prevNext Pointer to the struct TagData.next pointer
      *          pointing to \pname{cur}.
-     * \returns True, since tag value will definitely be replaced.
+     * @returns True, since tag value will definitely be replaced.
      */
     bool ReplaceWriter(Tag& tag, bool preMerge, TagData* cur, TagData** prevNext);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/model/socket-factory.h ns-3.44/src/network/model/socket-factory.h
--- ns-3.43/src/network/model/socket-factory.h	2024-10-09 16:41:10.068656400 -0700
+++ ns-3.44/src/network/model/socket-factory.h	2025-03-09 16:55:49.675372100 -0700
@@ -17,9 +17,9 @@
 class Socket;
 
 /**
- * \ingroup socket
+ * @ingroup socket
  *
- * \brief Object to create transport layer instances that provide a
+ * @brief Object to create transport layer instances that provide a
  * socket API to applications.
  *
  * This base class defines the API for creating sockets.
@@ -31,22 +31,22 @@
  * sockets, you need to subclass this factory class, implement CreateSocket,
  * instantiate the object, and aggregate it to the node.
  *
- * \see Udp
- * \see UdpImpl
+ * @see Udp
+ * @see UdpImpl
  */
 class SocketFactory : public Object
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     SocketFactory();
 
     /**
-     * \return smart pointer to Socket
+     * @return smart pointer to Socket
      *
      * Base class method for creating socket instances.
      */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/model/socket.h ns-3.44/src/network/model/socket.h
--- ns-3.43/src/network/model/socket.h	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/model/socket.h	2025-03-09 16:55:49.675372100 -0700
@@ -30,13 +30,13 @@
 class Packet;
 
 /**
- * \ingroup network
- * \defgroup socket Socket
+ * @ingroup network
+ * @defgroup socket Socket
  */
 
 /**
- * \brief A low-level Socket API based loosely on the BSD Socket API.
- * \ingroup socket
+ * @brief A low-level Socket API based loosely on the BSD Socket API.
+ * @ingroup socket
  *
  * A few things to keep in mind about this type of socket:
  * - it uses ns-3 API constructs such as class ns3::Address instead of
@@ -57,8 +57,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -66,8 +66,8 @@
     ~Socket() override;
 
     /**
-     * \enum SocketErrno
-     * \brief Enumeration of the possible errors returned by a socket.
+     * @enum SocketErrno
+     * @brief Enumeration of the possible errors returned by a socket.
      */
     enum SocketErrno
     {
@@ -89,8 +89,8 @@
     };
 
     /**
-     * \enum SocketType
-     * \brief Enumeration of the possible socket types.
+     * @enum SocketType
+     * @brief Enumeration of the possible socket types.
      */
     enum SocketType
     {
@@ -101,8 +101,8 @@
     };
 
     /**
-     * \enum SocketPriority
-     * \brief Enumeration of the possible socket priorities.
+     * @enum SocketPriority
+     * @brief Enumeration of the possible socket priorities.
      *
      * Names and corresponding values are derived from
      * the Linux TC_PRIO_* macros
@@ -118,8 +118,8 @@
     };
 
     /**
-     * \enum Ipv6MulticastFilterMode
-     * \brief Enumeration of the possible filter of a socket.
+     * @enum Ipv6MulticastFilterMode
+     * @brief Enumeration of the possible filter of a socket.
      *
      * A socket can have filters on specific sources to include only
      * packets incoming from them, or to exclude packets incoming
@@ -138,37 +138,37 @@
      * This method wraps the creation of sockets that is performed
      * on a given node by a SocketFactory specified by TypeId.
      *
-     * \return A smart pointer to a newly created socket.
+     * @return A smart pointer to a newly created socket.
      *
-     * \param node The node on which to create the socket
-     * \param tid The TypeId of a SocketFactory class to use
+     * @param node The node on which to create the socket
+     * @param tid The TypeId of a SocketFactory class to use
      */
     static Ptr<Socket> CreateSocket(Ptr<Node> node, TypeId tid);
     /**
-     * \brief Get last error number.
+     * @brief Get last error number.
      *
-     * \return the errno associated to the last call which failed in this
+     * @return the errno associated to the last call which failed in this
      *         socket. Each socket's errno is initialized to zero
      *         when the socket is created.
      */
     virtual Socket::SocketErrno GetErrno() const = 0;
     /**
-     * \return the socket type, analogous to getsockopt (SO_TYPE)
+     * @return the socket type, analogous to getsockopt (SO_TYPE)
      */
     virtual Socket::SocketType GetSocketType() const = 0;
     /**
-     * \brief Return the node this socket is associated with.
-     * \returns the node
+     * @brief Return the node this socket is associated with.
+     * @returns the node
      */
     virtual Ptr<Node> GetNode() const = 0;
     /**
-     * \brief Specify callbacks to allow the caller to determine if
+     * @brief Specify callbacks to allow the caller to determine if
      * the connection succeeds of fails.
-     * \param connectionSucceeded this callback is invoked when the
+     * @param connectionSucceeded this callback is invoked when the
      *        connection request initiated by the user is successfully
      *        completed. The callback is passed  back a pointer to
      *        the same socket object.
-     * \param connectionFailed this callback is invoked when the
+     * @param connectionFailed this callback is invoked when the
      *        connection request initiated by the user is unsuccessfuly
      *        completed. The callback is passed back a pointer to the
      *        same socket object.
@@ -176,7 +176,7 @@
     void SetConnectCallback(Callback<void, Ptr<Socket>> connectionSucceeded,
                             Callback<void, Ptr<Socket>> connectionFailed);
     /**
-     * \brief Detect socket recv() events such as graceful shutdown or error.
+     * @brief Detect socket recv() events such as graceful shutdown or error.
      *
      * For connection-oriented sockets, the first callback is used to signal
      * that the remote side has gracefully shut down the connection, and the
@@ -185,16 +185,16 @@
      * as a connection reset.  For datagram sockets, these callbacks may
      * never be invoked.
      *
-     * \param normalClose this callback is invoked when the
+     * @param normalClose this callback is invoked when the
      *        peer closes the connection gracefully
-     * \param errorClose this callback is invoked when the
+     * @param errorClose this callback is invoked when the
      *        connection closes abnormally
      */
     void SetCloseCallbacks(Callback<void, Ptr<Socket>> normalClose,
                            Callback<void, Ptr<Socket>> errorClose);
     /**
-     * \brief Accept connection requests from remote hosts
-     * \param connectionRequest Callback for connection request from peer.
+     * @brief Accept connection requests from remote hosts
+     * @param connectionRequest Callback for connection request from peer.
      *        This user callback is passed a pointer to this socket, the
      *        ip address and the port number of the connection originator.
      *        This callback must return true to accept the incoming connection,
@@ -203,7 +203,7 @@
      *        give access to the user to the socket created to match
      *        this new connection. If the user does not explicitly
      *        specify this callback, all incoming  connections will be refused.
-     * \param newConnectionCreated Callback for new connection: when a new
+     * @param newConnectionCreated Callback for new connection: when a new
      *        is accepted, it is created and the corresponding socket is passed
      *        back to the user through this callback. This user callback is
      *        passed a pointer to the new socket, and the ip address and
@@ -212,22 +212,22 @@
     void SetAcceptCallback(Callback<bool, Ptr<Socket>, const Address&> connectionRequest,
                            Callback<void, Ptr<Socket>, const Address&> newConnectionCreated);
     /**
-     * \brief Notify application when a packet has been sent from transport
+     * @brief Notify application when a packet has been sent from transport
      *        protocol (non-standard socket call)
-     * \param dataSent Callback for the event that data is sent from the
+     * @param dataSent Callback for the event that data is sent from the
      *        underlying transport protocol.  This callback is passed a
      *        pointer to the socket, and the number of bytes sent.
      */
     void SetDataSentCallback(Callback<void, Ptr<Socket>, uint32_t> dataSent);
     /**
-     * \brief Notify application when space in transmit buffer is added
+     * @brief Notify application when space in transmit buffer is added
      *
      *        This callback is intended to notify a
      *        socket that would have been blocked in a blocking socket model
      *        that space is available in the transmit buffer and that it
      *        can call Send() again.
      *
-     * \param sendCb Callback for the event that the socket transmit buffer
+     * @param sendCb Callback for the event that the socket transmit buffer
      *        fill level has decreased.  This callback is passed a pointer to
      *        the socket, and the number of bytes available for writing
      *        into the buffer (an absolute value).  If there is no transmit
@@ -235,40 +235,40 @@
      */
     void SetSendCallback(Callback<void, Ptr<Socket>, uint32_t> sendCb);
     /**
-     * \brief Notify application when new data is available to be read.
+     * @brief Notify application when new data is available to be read.
      *
      *        This callback is intended to notify a socket that would
      *        have been blocked in a blocking socket model that data
      *        is available to be read.
-     * \param receivedData Callback for the event that data is received
+     * @param receivedData Callback for the event that data is received
      *        from the underlying transport protocol.  This callback
      *        is passed a pointer to the socket.
      */
     void SetRecvCallback(Callback<void, Ptr<Socket>> receivedData);
     /**
-     * \brief Allocate a local endpoint for this socket.
-     * \param address the address to try to allocate
-     * \returns 0 on success, -1 on failure.
+     * @brief Allocate a local endpoint for this socket.
+     * @param address the address to try to allocate
+     * @returns 0 on success, -1 on failure.
      */
     virtual int Bind(const Address& address) = 0;
 
     /**
-     * \brief Allocate a local IPv4 endpoint for this socket.
+     * @brief Allocate a local IPv4 endpoint for this socket.
      *
-     * \returns 0 on success, -1 on failure.
+     * @returns 0 on success, -1 on failure.
      */
     virtual int Bind() = 0;
 
     /**
-     * \brief Allocate a local IPv6 endpoint for this socket.
+     * @brief Allocate a local IPv6 endpoint for this socket.
      *
-     * \returns 0 on success, -1 on failure.
+     * @returns 0 on success, -1 on failure.
      */
     virtual int Bind6() = 0;
 
     /**
-     * \brief Close a socket.
-     * \returns zero on success, -1 on failure.
+     * @brief Close a socket.
+     * @returns zero on success, -1 on failure.
      *
      * After the Close call, the socket is no longer valid, and cannot
      * safely be used for subsequent operations.
@@ -276,7 +276,7 @@
     virtual int Close() = 0;
 
     /**
-     * \returns zero on success, -1 on failure.
+     * @returns zero on success, -1 on failure.
      *
      * Do not allow any further Send calls. This method is typically
      * implemented for Tcp sockets by a half close.
@@ -284,7 +284,7 @@
     virtual int ShutdownSend() = 0;
 
     /**
-     * \returns zero on success, -1 on failure.
+     * @returns zero on success, -1 on failure.
      *
      * Do not allow any further Recv calls. This method is typically
      * implemented for Tcp sockets by a half close.
@@ -292,20 +292,20 @@
     virtual int ShutdownRecv() = 0;
 
     /**
-     * \brief Initiate a connection to a remote host
-     * \param address Address of remote.
-     * \returns 0 on success, -1 on error (in which case errno is set).
+     * @brief Initiate a connection to a remote host
+     * @param address Address of remote.
+     * @returns 0 on success, -1 on error (in which case errno is set).
      */
     virtual int Connect(const Address& address) = 0;
 
     /**
-     * \brief Listen for incoming connections.
-     * \returns 0 on success, -1 on error (in which case errno is set).
+     * @brief Listen for incoming connections.
+     * @returns 0 on success, -1 on error (in which case errno is set).
      */
     virtual int Listen() = 0;
 
     /**
-     * \brief Returns the number of bytes which can be sent in a single call
+     * @brief Returns the number of bytes which can be sent in a single call
      * to Send.
      *
      * For datagram sockets, this returns the number of bytes that
@@ -314,12 +314,12 @@
      * For stream sockets, this returns the available space in bytes
      * left in the transmit buffer.
      *
-     * \returns The number of bytes which can be sent in a single Send call.
+     * @returns The number of bytes which can be sent in a single Send call.
      */
     virtual uint32_t GetTxAvailable() const = 0;
 
     /**
-     * \brief Send data (or dummy data) to the remote host
+     * @brief Send data (or dummy data) to the remote host
      *
      * This function matches closely in semantics to the send() function
      * call in the standard C library (libc):
@@ -356,26 +356,26 @@
      *        MSG_DONTROUTE  bypass routing, use direct interface
      * These flags are _unsupported_ as of ns-3.1.
      *
-     * \param p ns3::Packet to send
-     * \param flags Socket control flags
-     * \returns the number of bytes accepted for transmission if no error
+     * @param p ns3::Packet to send
+     * @param flags Socket control flags
+     * @returns the number of bytes accepted for transmission if no error
      *          occurs, and -1 otherwise.
      *
-     * \see SetSendCallback
+     * @see SetSendCallback
      */
     virtual int Send(Ptr<Packet> p, uint32_t flags) = 0;
 
     /**
-     * \brief Send data to a specified peer.
+     * @brief Send data to a specified peer.
      *
      * This method has similar semantics to Send () but subclasses may
      * want to provide checks on socket state, so the implementation is
      * pushed to subclasses.
      *
-     * \param p packet to send
-     * \param flags Socket control flags
-     * \param toAddress IP Address of remote host
-     * \returns -1 in case of error or the number of bytes copied in the
+     * @param p packet to send
+     * @param flags Socket control flags
+     * @param toAddress IP Address of remote host
+     * @returns -1 in case of error or the number of bytes copied in the
      *          internal buffer and accepted for transmission.
      */
     virtual int SendTo(Ptr<Packet> p, uint32_t flags, const Address& toAddress) = 0;
@@ -385,13 +385,13 @@
      * multiple calls to Recv.
      * Must be possible to call this method from the Recv callback.
      *
-     * \returns the number of bytes which can be returned from one or
+     * @returns the number of bytes which can be returned from one or
      *          multiple Recv calls.
      */
     virtual uint32_t GetRxAvailable() const = 0;
 
     /**
-     * \brief Read data from the socket
+     * @brief Read data from the socket
      *
      * This function matches closely in semantics to the recv() function
      * call in the standard C library (libc):
@@ -433,18 +433,18 @@
      * including RecvFrom(), overloaded Recv() without arguments,
      * and variants that use raw character buffers.
      *
-     * \param maxSize reader will accept packet up to maxSize
-     * \param flags Socket control flags
-     * \returns Ptr<Packet> of the next in-sequence packet.  Returns
+     * @param maxSize reader will accept packet up to maxSize
+     * @param flags Socket control flags
+     * @returns Ptr<Packet> of the next in-sequence packet.  Returns
      * 0 if the socket cannot return a next in-sequence packet conforming
      * to the maxSize and flags.
      *
-     * \see SetRecvCallback
+     * @see SetRecvCallback
      */
     virtual Ptr<Packet> Recv(uint32_t maxSize, uint32_t flags) = 0;
 
     /**
-     * \brief Read a single packet from the socket and retrieve the sender
+     * @brief Read a single packet from the socket and retrieve the sender
      * address.
      *
      * Calls Recv(maxSize, flags) with maxSize
@@ -454,12 +454,12 @@
      * want to provide checks on socket state, so the implementation is
      * pushed to subclasses.
      *
-     * \param maxSize reader will accept packet up to maxSize
-     * \param flags Socket control flags
-     * \param fromAddress output parameter that will return the
+     * @param maxSize reader will accept packet up to maxSize
+     * @param flags Socket control flags
+     * @param fromAddress output parameter that will return the
      * address of the sender of the received packet, if any.  Remains
      * untouched if no packet is received.
-     * \returns Ptr<Packet> of the next in-sequence packet.  Returns
+     * @returns Ptr<Packet> of the next in-sequence packet.  Returns
      * 0 if the socket cannot return a next in-sequence packet.
      */
     virtual Ptr<Packet> RecvFrom(uint32_t maxSize, uint32_t flags, Address& fromAddress) = 0;
@@ -470,126 +470,126 @@
     /////////////////////////////////////////////////////////////////////
 
     /**
-     * \brief Send data (or dummy data) to the remote host
+     * @brief Send data (or dummy data) to the remote host
      *
      * Overloaded version of Send(..., flags) with flags set to zero.
      *
-     * \param p ns3::Packet to send
-     * \returns the number of bytes accepted for transmission if no error
+     * @param p ns3::Packet to send
+     * @returns the number of bytes accepted for transmission if no error
      *          occurs, and -1 otherwise.
      */
     int Send(Ptr<Packet> p);
 
     /**
-     * \brief Send data (or dummy data) to the remote host
+     * @brief Send data (or dummy data) to the remote host
      *
      * This method is provided so as to have an API which is closer in
      * appearance to that of real network or BSD sockets.
      *
-     * \param buf A pointer to a raw byte buffer of some data to send.  If
+     * @param buf A pointer to a raw byte buffer of some data to send.  If
      * this buffer is 0, we send dummy data whose size is specified by the
      * second parameter
-     * \param size the number of bytes to copy from the buffer
-     * \param flags Socket control flags
-     * \returns the number of bytes accepted for transmission if no error
+     * @param size the number of bytes to copy from the buffer
+     * @param flags Socket control flags
+     * @returns the number of bytes accepted for transmission if no error
      *          occurs, and -1 otherwise.
      */
     int Send(const uint8_t* buf, uint32_t size, uint32_t flags);
 
     /**
-     * \brief Send data to a specified peer.
+     * @brief Send data to a specified peer.
      *
      * This method is provided so as to have an API which is closer in
      * appearance to that of real network or BSD sockets.
      *
-     * \param buf A pointer to a raw byte buffer of some data to send.
+     * @param buf A pointer to a raw byte buffer of some data to send.
      * If this is 0, we send dummy data whose size is specified by the
      * third parameter
-     * \param size the number of bytes to copy from the buffer
-     * \param flags Socket control flags
-     * \param address IP Address of remote host
-     * \returns -1 in case of error or the number of bytes copied in the
+     * @param size the number of bytes to copy from the buffer
+     * @param flags Socket control flags
+     * @param address IP Address of remote host
+     * @returns -1 in case of error or the number of bytes copied in the
      *          internal buffer and accepted for transmission.
      *
      */
     int SendTo(const uint8_t* buf, uint32_t size, uint32_t flags, const Address& address);
 
     /**
-     * \brief Read a single packet from the socket
+     * @brief Read a single packet from the socket
      *
      * Overloaded version of Recv(maxSize, flags) with maxSize
      * implicitly set to maximum sized integer, and flags set to zero.
      *
-     * \returns Ptr<Packet> of the next in-sequence packet.  Returns
+     * @returns Ptr<Packet> of the next in-sequence packet.  Returns
      * 0 if the socket cannot return a next in-sequence packet.
      */
     Ptr<Packet> Recv();
 
     /**
-     * \brief Recv data (or dummy data) from the remote host
+     * @brief Recv data (or dummy data) from the remote host
      *
      * This method is provided so as to have an API which is closer in
      * appearance to that of real network or BSD sockets.
      *
-     * If the underlying packet was carring null (fake) data, this buffer
+     * If the underlying packet was carrying null (fake) data, this buffer
      * will be zeroed up to the length specified by the return value.
      *
-     * \param buf A pointer to a raw byte buffer to write the data to.
-     * \param size Number of bytes (at most) to copy to buf
-     * \param flags any flags to pass to the socket
-     * \returns number of bytes copied into buf
+     * @param buf A pointer to a raw byte buffer to write the data to.
+     * @param size Number of bytes (at most) to copy to buf
+     * @param flags any flags to pass to the socket
+     * @returns number of bytes copied into buf
      */
     int Recv(uint8_t* buf, uint32_t size, uint32_t flags);
 
     /**
-     * \brief Read a single packet from the socket and retrieve the sender
+     * @brief Read a single packet from the socket and retrieve the sender
      * address.
      *
      * Calls RecvFrom (maxSize, flags, fromAddress) with maxSize
      * implicitly set to maximum sized integer, and flags set to zero.
      *
-     * \param fromAddress output parameter that will return the
+     * @param fromAddress output parameter that will return the
      * address of the sender of the received packet, if any.  Remains
      * untouched if no packet is received.
-     * \returns Ptr<Packet> of the next in-sequence packet.  Returns
+     * @returns Ptr<Packet> of the next in-sequence packet.  Returns
      * 0 if the socket cannot return a next in-sequence packet.
      */
     Ptr<Packet> RecvFrom(Address& fromAddress);
 
     /**
-     * \brief Read a single packet from the socket and retrieve the sender
+     * @brief Read a single packet from the socket and retrieve the sender
      * address.
      *
      * This method is provided so as to have an API which is closer in
      * appearance to that of real network or BSD sockets.
      *
-     * \param buf A pointer to a raw byte buffer to write the data to.
-     * If the underlying packet was carring null (fake) data, this buffer
+     * @param buf A pointer to a raw byte buffer to write the data to.
+     * If the underlying packet was carrying null (fake) data, this buffer
      * will be zeroed up to the length specified by the return value.
-     * \param size Number of bytes (at most) to copy to buf
-     * \param flags any flags to pass to the socket
-     * \param fromAddress output parameter that will return the
+     * @param size Number of bytes (at most) to copy to buf
+     * @param flags any flags to pass to the socket
+     * @param fromAddress output parameter that will return the
      * address of the sender of the received packet, if any.  Remains
      * untouched if no packet is received.
-     * \returns number of bytes copied into buf
+     * @returns number of bytes copied into buf
      */
     int RecvFrom(uint8_t* buf, uint32_t size, uint32_t flags, Address& fromAddress);
     /**
-     * \brief Get socket address.
-     * \param address the address name this socket is associated with.
-     * \returns 0 if success, -1 otherwise
+     * @brief Get socket address.
+     * @param address the address name this socket is associated with.
+     * @returns 0 if success, -1 otherwise
      */
     virtual int GetSockName(Address& address) const = 0;
 
     /**
-     * \brief Get the peer address of a connected socket.
-     * \param address the address this socket is connected to.
-     * \returns 0 if success, -1 otherwise
+     * @brief Get the peer address of a connected socket.
+     * @param address the address this socket is connected to.
+     * @returns 0 if success, -1 otherwise
      */
     virtual int GetPeerName(Address& address) const = 0;
 
     /**
-     * \brief Bind a socket to specific device.
+     * @brief Bind a socket to specific device.
      *
      * This method corresponds to using setsockopt() SO_BINDTODEVICE
      * of real network or BSD sockets.   If set on a socket, this option will
@@ -604,46 +604,46 @@
      * is also possible to bind to mismatching device and address, even if
      * the socket can not receive any packets as a result.
      *
-     * \param netdevice Pointer to NetDevice of desired interface
+     * @param netdevice Pointer to NetDevice of desired interface
      */
     virtual void BindToNetDevice(Ptr<NetDevice> netdevice);
 
     /**
-     * \brief Returns socket's bound NetDevice, if any.
+     * @brief Returns socket's bound NetDevice, if any.
      *
      * This method corresponds to using getsockopt() SO_BINDTODEVICE
      * of real network or BSD sockets.
      *
      *
-     * \returns Pointer to interface.
+     * @returns Pointer to interface.
      */
     Ptr<NetDevice> GetBoundNetDevice();
 
     /**
-     * \brief Configure whether broadcast datagram transmissions are allowed
+     * @brief Configure whether broadcast datagram transmissions are allowed
      *
      * This method corresponds to using setsockopt() SO_BROADCAST of
      * real network or BSD sockets.  If set on a socket, this option
      * will enable or disable packets to be transmitted to broadcast
      * destination addresses.
      *
-     * \param allowBroadcast Whether broadcast is allowed
-     * \return true if operation succeeds
+     * @param allowBroadcast Whether broadcast is allowed
+     * @return true if operation succeeds
      */
     virtual bool SetAllowBroadcast(bool allowBroadcast) = 0;
 
     /**
-     * \brief Query whether broadcast datagram transmissions are allowed
+     * @brief Query whether broadcast datagram transmissions are allowed
      *
      * This method corresponds to using getsockopt() SO_BROADCAST of
      * real network or BSD sockets.
      *
-     * \returns true if broadcast is allowed, false otherwise
+     * @returns true if broadcast is allowed, false otherwise
      */
     virtual bool GetAllowBroadcast() const = 0;
 
     /**
-     * \brief Enable/Disable receive packet information to socket.
+     * @brief Enable/Disable receive packet information to socket.
      *
      * For IP_PKTINFO/IP6_PKTINFO. This method is only usable for
      * Raw socket and Datagram Socket. Not supported for Stream socket.
@@ -651,19 +651,19 @@
      * Method doesn't make distinction between IPv4 and IPv6. If it is enabled,
      * it is enabled for all types of sockets that supports packet information
      *
-     * \param flag Enable/Disable receive information
+     * @param flag Enable/Disable receive information
      */
     void SetRecvPktInfo(bool flag);
 
     /**
-     * \brief Get status indicating whether enable/disable packet information to socket
+     * @brief Get status indicating whether enable/disable packet information to socket
      *
-     * \returns True if packet information should be sent to socket
+     * @returns True if packet information should be sent to socket
      */
     bool IsRecvPktInfo() const;
 
     /**
-     * \brief Manually set the socket priority
+     * @brief Manually set the socket priority
      *
      * This method corresponds to using setsockopt () SO_PRIORITY of
      * real network or BSD sockets. On Linux, the socket priority can be
@@ -672,22 +672,22 @@
      * users to set the socket priority to any 8-bit non-negative value,
      * which is equivalent to assuming that the CAP_NET_ADMIN capability is set.
      *
-     * \param priority The socket priority
+     * @param priority The socket priority
      */
     void SetPriority(uint8_t priority);
 
     /**
-     * \brief Query the priority value of this socket
+     * @brief Query the priority value of this socket
      *
      * This method corresponds to using getsockopt () SO_PRIORITY of real network
      * or BSD sockets.
      *
-     * \return The priority value
+     * @return The priority value
      */
     uint8_t GetPriority() const;
 
     /**
-     * \brief Return the priority corresponding to a given TOS value
+     * @brief Return the priority corresponding to a given TOS value
      *
      * This function is implemented after the Linux rt_tos2priority
      * function. The usage of the TOS byte has been originally defined by
@@ -759,13 +759,13 @@
      * CS6  | 0x30 |   110000xx   |   0-1    |  Best Effort (0)
      * CS7  | 0x38 |   111000xx   |   0-1    |  Best Effort (0)
      *
-     * \param ipTos the TOS value (in the range 0..255)
-     * \return The priority value corresponding to the given TOS value
+     * @param ipTos the TOS value (in the range 0..255)
+     * @return The priority value corresponding to the given TOS value
      */
     static uint8_t IpTos2Priority(uint8_t ipTos);
 
     /**
-     * \brief Manually set IP Type of Service field
+     * @brief Manually set IP Type of Service field
      *
      * This method corresponds to using setsockopt () IP_TOS of
      * real network or BSD sockets.
@@ -774,178 +774,178 @@
      * This option affects only IPv4 sockets, it has no effect
      * on IPv6 sockets.
      *
-     * \param ipTos The desired TOS value for IP headers
+     * @param ipTos The desired TOS value for IP headers
      */
     void SetIpTos(uint8_t ipTos);
 
     /**
-     * \brief Query the value of IP Type of Service of this socket
+     * @brief Query the value of IP Type of Service of this socket
      *
      * This method corresponds to using getsockopt () IP_TOS of real network
      * or BSD sockets.
      *
-     * \return The raw IP TOS value
+     * @return The raw IP TOS value
      */
     uint8_t GetIpTos() const;
 
     /**
-     * \brief Tells a socket to pass information about IP Type of Service up the stack
+     * @brief Tells a socket to pass information about IP Type of Service up the stack
      *
      * This method corresponds to using setsockopt () IP_RECVTOS of real
      * network or BSD sockets. In our implementation, the socket simply
      * adds a SocketIpTosTag tag to the packet before passing the
      * packet up the stack.
      *
-     * \param ipv4RecvTos Whether the socket should add SocketIpv4TosTag tag
+     * @param ipv4RecvTos Whether the socket should add SocketIpv4TosTag tag
      * to the packet
      */
     void SetIpRecvTos(bool ipv4RecvTos);
 
     /**
-     * \brief Ask if the socket is currently passing information about IP Type of Service up the
+     * @brief Ask if the socket is currently passing information about IP Type of Service up the
      * stack
      *
      * This method corresponds to using getsockopt () IP_RECVTOS of real
      * network or BSD sockets.
      *
-     * \return Whether the IP_RECVTOS is set
+     * @return Whether the IP_RECVTOS is set
      */
     bool IsIpRecvTos() const;
 
     /**
-     * \brief Manually set IPv6 Traffic Class field
+     * @brief Manually set IPv6 Traffic Class field
      *
      * This method corresponds to using setsockopt () IPV6_TCLASS of
      * real network or BSD sockets. This option is for IPv6 only.
      * Setting the IPV6_TCLASSS to -1 clears the option and let the socket
      * uses the default value.
      *
-     * \param ipTclass The desired TCLASS value for IPv6 headers
+     * @param ipTclass The desired TCLASS value for IPv6 headers
      */
     void SetIpv6Tclass(int ipTclass);
 
     /**
-     * \brief Query the value of IPv6 Traffic Class field of this socket
+     * @brief Query the value of IPv6 Traffic Class field of this socket
      *
      * This method corresponds to using getsockopt () IPV6_TCLASS of real network
      * or BSD sockets.
      *
-     * \return The raw IPV6_TCLASS value
+     * @return The raw IPV6_TCLASS value
      */
     uint8_t GetIpv6Tclass() const;
 
     /**
-     * \brief Tells a socket to pass information about IPv6 Traffic Class up the stack
+     * @brief Tells a socket to pass information about IPv6 Traffic Class up the stack
      *
      * This method corresponds to using setsockopt () IPV6_RECVTCLASS of real
      * network or BSD sockets. In our implementation, the socket simply
      * adds a SocketIpv6TclasssTag tag to the packet before passing the
      * packet up the stack.
      *
-     * \param ipv6RecvTclass Whether the socket should add SocketIpv6TclassTag tag
+     * @param ipv6RecvTclass Whether the socket should add SocketIpv6TclassTag tag
      * to the packet
      */
     void SetIpv6RecvTclass(bool ipv6RecvTclass);
 
     /**
-     * \brief Ask if the socket is currently passing information about IPv6 Traffic Class up the
+     * @brief Ask if the socket is currently passing information about IPv6 Traffic Class up the
      * stack
      *
      * This method corresponds to using getsockopt () IPV6_RECVTCLASS of real
      * network or BSD sockets.
      *
-     * \return Whether the IPV6_RECVTCLASS is set
+     * @return Whether the IPV6_RECVTCLASS is set
      */
     bool IsIpv6RecvTclass() const;
 
     /**
-     * \brief Manually set IP Time to Live field
+     * @brief Manually set IP Time to Live field
      *
      * This method corresponds to using setsockopt () IP_TTL of
      * real network or BSD sockets.
      *
-     * \param ipTtl The desired TTL value for IP headers
+     * @param ipTtl The desired TTL value for IP headers
      */
     virtual void SetIpTtl(uint8_t ipTtl);
 
     /**
-     * \brief Query the value of IP Time to Live field of this socket
+     * @brief Query the value of IP Time to Live field of this socket
      *
      * This method corresponds to using getsockopt () IP_TTL of real network
      * or BSD sockets.
      *
-     * \return The raw IP TTL value
+     * @return The raw IP TTL value
      */
     virtual uint8_t GetIpTtl() const;
 
     /**
-     * \brief Tells a socket to pass information about IP_TTL up the stack
+     * @brief Tells a socket to pass information about IP_TTL up the stack
      *
      * This method corresponds to using setsockopt () IP_RECVTTL of real
      * network or BSD sockets. In our implementation, the socket simply
      * adds a SocketIpTtlTag tag to the packet before passing the
      * packet up the stack.
      *
-     * \param ipv4RecvTtl Whether the socket should add SocketIpv4TtlTag tag
+     * @param ipv4RecvTtl Whether the socket should add SocketIpv4TtlTag tag
      * to the packet
      */
     void SetIpRecvTtl(bool ipv4RecvTtl);
 
     /**
-     * \brief Ask if the socket is currently passing information about IP_TTL up the stack
+     * @brief Ask if the socket is currently passing information about IP_TTL up the stack
      *
      * This method corresponds to using getsockopt () IP_RECVTTL of real
      * network or BSD sockets.
      *
-     * \return Whether the IP_RECVTTL is set
+     * @return Whether the IP_RECVTTL is set
      */
     bool IsIpRecvTtl() const;
 
     /**
-     * \brief Manually set IPv6 Hop Limit
+     * @brief Manually set IPv6 Hop Limit
      *
      * This method corresponds to using setsockopt () IPV6_HOPLIMIT of
      * real network or BSD sockets.
      *
-     * \param ipHopLimit The desired Hop Limit value for IPv6 headers
+     * @param ipHopLimit The desired Hop Limit value for IPv6 headers
      */
     virtual void SetIpv6HopLimit(uint8_t ipHopLimit);
 
     /**
-     * \brief Query the value of IP Hop Limit field of this socket
+     * @brief Query the value of IP Hop Limit field of this socket
      *
      * This method corresponds to using getsockopt () IPV6_HOPLIMIT of real network
      * or BSD sockets.
      *
-     * \return The raw IPv6 Hop Limit value
+     * @return The raw IPv6 Hop Limit value
      */
     virtual uint8_t GetIpv6HopLimit() const;
 
     /**
-     * \brief Tells a socket to pass information about IPv6 Hop Limit up the stack
+     * @brief Tells a socket to pass information about IPv6 Hop Limit up the stack
      *
      * This method corresponds to using setsockopt () IPV6_RECVHOPLIMIT of real
      * network or BSD sockets. In our implementation, the socket simply
      * adds a SocketIpv6HopLimitTag tag to the packet before passing the
      * packet up the stack.
      *
-     * \param ipv6RecvHopLimit Whether the socket should add SocketIpv6HopLimitTag tag
+     * @param ipv6RecvHopLimit Whether the socket should add SocketIpv6HopLimitTag tag
      * to the packet
      */
     void SetIpv6RecvHopLimit(bool ipv6RecvHopLimit);
 
     /**
-     * \brief Ask if the socket is currently passing information about IPv6 Hop Limit up the stack
+     * @brief Ask if the socket is currently passing information about IPv6 Hop Limit up the stack
      *
      * This method corresponds to using getsockopt () IPV6_RECVHOPLIMIT of real
      * network or BSD sockets.
      *
-     * \return Whether the IPV6_RECVHOPLIMIT is set
+     * @return Whether the IPV6_RECVHOPLIMIT is set
      */
     bool IsIpv6RecvHopLimit() const;
 
     /**
-     * \brief Joins a IPv6 multicast group.
+     * @brief Joins a IPv6 multicast group.
      *
      * Based on the filter mode and source addresses this can be interpreted as a
      * join, leave, or modification to source filtering on a multicast group.
@@ -954,9 +954,9 @@
      * remove the old one.
      *
      *
-     * \param address Requested multicast address.
-     * \param filterMode Socket filtering mode (INCLUDE | EXCLUDE).
-     * \param sourceAddresses All the source addresses on which socket is interested or not
+     * @param address Requested multicast address.
+     * @param filterMode Socket filtering mode (INCLUDE | EXCLUDE).
+     * @param sourceAddresses All the source addresses on which socket is interested or not
      * interested.
      */
     virtual void Ipv6JoinGroup(Ipv6Address address,
@@ -964,82 +964,82 @@
                                std::vector<Ipv6Address> sourceAddresses);
 
     /**
-     * \brief Joins a IPv6 multicast group without filters.
+     * @brief Joins a IPv6 multicast group without filters.
      *
      * A socket can join only one multicast group. Any attempt to join another group will remove the
      * old one.
      *
-     * \param address Group address on which socket wants to join.
+     * @param address Group address on which socket wants to join.
      */
     virtual void Ipv6JoinGroup(Ipv6Address address);
 
     /**
-     * \brief Leaves IPv6 multicast group this socket is joined to.
+     * @brief Leaves IPv6 multicast group this socket is joined to.
      */
     virtual void Ipv6LeaveGroup();
 
   protected:
     /**
-     * \brief Notify through the callback (if set) that the connection has been
+     * @brief Notify through the callback (if set) that the connection has been
      *        established.
      */
     void NotifyConnectionSucceeded();
 
     /**
-     * \brief Notify through the callback (if set) that the connection has not been
+     * @brief Notify through the callback (if set) that the connection has not been
      *        established due to an error.
      */
     void NotifyConnectionFailed();
 
     /**
-     * \brief Notify through the callback (if set) that the connection has been
+     * @brief Notify through the callback (if set) that the connection has been
      *        closed.
      */
     void NotifyNormalClose();
 
     /**
-     * \brief Notify through the callback (if set) that the connection has been
+     * @brief Notify through the callback (if set) that the connection has been
      *        closed due to an error.
      */
     void NotifyErrorClose();
 
     /**
-     * \brief Notify through the callback (if set) that an incoming connection
+     * @brief Notify through the callback (if set) that an incoming connection
      *        is being requested by a remote host.
      *
      * This function returns true by default (i.e., accept all the incoming connections).
      * The callback (if set) might restrict this behaviour by returning zero for a
      * connection that should be refused.
      *
-     * \param from the address the connection is incoming from
-     * \returns true if the connection must be accepted, false otherwise.
+     * @param from the address the connection is incoming from
+     * @returns true if the connection must be accepted, false otherwise.
      */
     bool NotifyConnectionRequest(const Address& from);
 
     /**
-     * \brief Notify through the callback (if set) that a new connection has been
+     * @brief Notify through the callback (if set) that a new connection has been
      *        created.
-     * \param socket The socket receiving the new connection.
-     * \param from The address of the node initiating the connection.
+     * @param socket The socket receiving the new connection.
+     * @param from The address of the node initiating the connection.
      */
     void NotifyNewConnectionCreated(Ptr<Socket> socket, const Address& from);
 
     /**
-     * \brief Notify through the callback (if set) that some data have been sent.
+     * @brief Notify through the callback (if set) that some data have been sent.
      *
-     * \param size number of sent bytes.
+     * @param size number of sent bytes.
      */
     void NotifyDataSent(uint32_t size);
 
     /**
-     * \brief Notify through the callback (if set) that some data have been sent.
+     * @brief Notify through the callback (if set) that some data have been sent.
      *
-     * \param spaceAvailable the number of bytes available in the transmission buffer.
+     * @param spaceAvailable the number of bytes available in the transmission buffer.
      */
     void NotifySend(uint32_t spaceAvailable);
 
     /**
-     * \brief Notify through the callback (if set) that some data have been received.
+     * @brief Notify through the callback (if set) that some data have been received.
      */
     void NotifyDataRecv();
 
@@ -1047,23 +1047,23 @@
     void DoDispose() override;
 
     /**
-     * \brief Checks if the socket has a specific IPv6 Tclass set
+     * @brief Checks if the socket has a specific IPv6 Tclass set
      *
-     * \returns true if the socket has a IPv6 Tclass set, false otherwise.
+     * @returns true if the socket has a IPv6 Tclass set, false otherwise.
      */
     bool IsManualIpv6Tclass() const;
 
     /**
-     * \brief Checks if the socket has a specific IPv4 TTL set
+     * @brief Checks if the socket has a specific IPv4 TTL set
      *
-     * \returns true if the socket has a IPv4 TTL set, false otherwise.
+     * @returns true if the socket has a IPv4 TTL set, false otherwise.
      */
     bool IsManualIpTtl() const;
 
     /**
-     * \brief Checks if the socket has a specific IPv6 Hop Limit set
+     * @brief Checks if the socket has a specific IPv6 Hop Limit set
      *
-     * \returns true if the socket has a IPv6 Hop Limit set, false otherwise.
+     * @returns true if the socket has a IPv6 Hop Limit set, false otherwise.
      */
     bool IsManualIpv6HopLimit() const;
 
@@ -1106,7 +1106,7 @@
 };
 
 /**
- * \brief This class implements a tag that carries the socket-specific
+ * @brief This class implements a tag that carries the socket-specific
  * TTL of a packet to the IP layer
  */
 class SocketIpTtlTag : public Tag
@@ -1115,22 +1115,22 @@
     SocketIpTtlTag();
 
     /**
-     * \brief Set the tag's TTL
+     * @brief Set the tag's TTL
      *
-     * \param ttl the TTL
+     * @param ttl the TTL
      */
     void SetTtl(uint8_t ttl);
 
     /**
-     * \brief Get the tag's TTL
+     * @brief Get the tag's TTL
      *
-     * \returns the TTL
+     * @returns the TTL
      */
     uint8_t GetTtl() const;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -1154,7 +1154,7 @@
 };
 
 /**
- * \brief This class implements a tag that carries the socket-specific
+ * @brief This class implements a tag that carries the socket-specific
  * HOPLIMIT of a packet to the IPv6 layer
  */
 class SocketIpv6HopLimitTag : public Tag
@@ -1163,22 +1163,22 @@
     SocketIpv6HopLimitTag();
 
     /**
-     * \brief Set the tag's Hop Limit
+     * @brief Set the tag's Hop Limit
      *
-     * \param hopLimit the Hop Limit
+     * @param hopLimit the Hop Limit
      */
     void SetHopLimit(uint8_t hopLimit);
 
     /**
-     * \brief Get the tag's Hop Limit
+     * @brief Get the tag's Hop Limit
      *
-     * \returns the Hop Limit
+     * @returns the Hop Limit
      */
     uint8_t GetHopLimit() const;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -1202,7 +1202,7 @@
 };
 
 /**
- * \brief indicates whether packets should be sent out with
+ * @brief indicates whether packets should be sent out with
  * the DF (Don't Fragment) flag set.
  */
 class SocketSetDontFragmentTag : public Tag
@@ -1211,25 +1211,25 @@
     SocketSetDontFragmentTag();
 
     /**
-     * \brief Enables the DF (Don't Fragment) flag
+     * @brief Enables the DF (Don't Fragment) flag
      */
     void Enable();
 
     /**
-     * \brief Disables the DF (Don't Fragment) flag
+     * @brief Disables the DF (Don't Fragment) flag
      */
     void Disable();
 
     /**
-     * \brief Checks if the DF (Don't Fragment) flag is set
+     * @brief Checks if the DF (Don't Fragment) flag is set
      *
-     * \returns true if DF is set.
+     * @returns true if DF is set.
      */
     bool IsEnabled() const;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -1253,7 +1253,7 @@
 };
 
 /**
- * \brief indicates whether the socket has IP_TOS set.
+ * @brief indicates whether the socket has IP_TOS set.
  * This tag is for IPv4 socket.
  */
 class SocketIpTosTag : public Tag
@@ -1262,22 +1262,22 @@
     SocketIpTosTag();
 
     /**
-     * \brief Set the tag's TOS
+     * @brief Set the tag's TOS
      *
-     * \param tos the TOS
+     * @param tos the TOS
      */
     void SetTos(uint8_t tos);
 
     /**
-     * \brief Get the tag's TOS
+     * @brief Get the tag's TOS
      *
-     * \returns the TOS
+     * @returns the TOS
      */
     uint8_t GetTos() const;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -1301,7 +1301,7 @@
 };
 
 /**
- * \brief indicates whether the socket has a priority set.
+ * @brief indicates whether the socket has a priority set.
  */
 class SocketPriorityTag : public Tag
 {
@@ -1309,22 +1309,22 @@
     SocketPriorityTag();
 
     /**
-     * \brief Set the tag's priority
+     * @brief Set the tag's priority
      *
-     * \param priority the priority
+     * @param priority the priority
      */
     void SetPriority(uint8_t priority);
 
     /**
-     * \brief Get the tag's priority
+     * @brief Get the tag's priority
      *
-     * \returns the priority
+     * @returns the priority
      */
     uint8_t GetPriority() const;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -1348,7 +1348,7 @@
 };
 
 /**
- * \brief indicates whether the socket has IPV6_TCLASS set.
+ * @brief indicates whether the socket has IPV6_TCLASS set.
  * This tag is for IPv6 socket.
  */
 class SocketIpv6TclassTag : public Tag
@@ -1357,22 +1357,22 @@
     SocketIpv6TclassTag();
 
     /**
-     * \brief Set the tag's Tclass
+     * @brief Set the tag's Tclass
      *
-     * \param tclass the Tclass
+     * @param tclass the Tclass
      */
     void SetTclass(uint8_t tclass);
 
     /**
-     * \brief Get the tag's Tclass
+     * @brief Get the tag's Tclass
      *
-     * \returns the Tclass
+     * @returns the Tclass
      */
     uint8_t GetTclass() const;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/model/tag-buffer.h ns-3.44/src/network/model/tag-buffer.h
--- ns-3.43/src/network/model/tag-buffer.h	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/model/tag-buffer.h	2025-03-09 16:55:49.675372100 -0700
@@ -22,9 +22,9 @@
 {
 
 /**
- * \ingroup packet
+ * @ingroup packet
  *
- * \brief read and write tag data
+ * @brief read and write tag data
  *
  * This class allows subclasses of the ns3::Tag base class
  * to serialize and deserialize their data through a stream-like
@@ -41,102 +41,102 @@
 {
   public:
     /**
-     * \brief Constructor
-     * \param start start position
-     * \param end end position
+     * @brief Constructor
+     * @param start start position
+     * @param end end position
      */
     TagBuffer(uint8_t* start, uint8_t* end);
 
     /**
-     * \brief Trim some space from the end
-     * \param trim space to remove
+     * @brief Trim some space from the end
+     * @param trim space to remove
      */
     void TrimAtEnd(uint32_t trim);
 
     /**
-     * \brief Copy the nternal structure of another TagBuffer
-     * \param o the TagBuffer to copy from
+     * @brief Copy the nternal structure of another TagBuffer
+     * @param o the TagBuffer to copy from
      */
     void CopyFrom(TagBuffer o);
 
     /**
-     * \param v the value to write
+     * @param v the value to write
      *
      * Write one byte and advance the "current" point by one.
      */
     TAG_BUFFER_INLINE void WriteU8(uint8_t v);
     /**
-     * \param v the value to write
+     * @param v the value to write
      *
      * Write two bytes and advance the "current" point by two.
      */
     TAG_BUFFER_INLINE void WriteU16(uint16_t v);
     /**
-     * \param v the value to write
+     * @param v the value to write
      *
      * Write four bytes and advance the "current" point by four.
      */
     TAG_BUFFER_INLINE void WriteU32(uint32_t v);
     /**
-     * \param v the value to write
+     * @param v the value to write
      *
      * Write eight bytes and advance the "current" point by eight.
      */
     void WriteU64(uint64_t v);
     /**
-     * \param v the value to write
+     * @param v the value to write
      *
      * Write a double and advance the "current" point by the size of the
      * data written.
      */
     void WriteDouble(double v);
     /**
-     * \param buffer a pointer to data to write
-     * \param size the size of the data to write
+     * @param buffer a pointer to data to write
+     * @param size the size of the data to write
      *
      * Write all the input data and advance the "current" point by the size of the
      * data written.
      */
     void Write(const uint8_t* buffer, uint32_t size);
     /**
-     * \returns the value read
+     * @returns the value read
      *
      * Read one byte, advance the "current" point by one,
      * and return the value read.
      */
     TAG_BUFFER_INLINE uint8_t ReadU8();
     /**
-     * \returns the value read
+     * @returns the value read
      *
      * Read two bytes, advance the "current" point by two,
      * and return the value read.
      */
     TAG_BUFFER_INLINE uint16_t ReadU16();
     /**
-     * \returns the value read
+     * @returns the value read
      *
      * Read four bytes, advance the "current" point by four,
      * and return the value read.
      */
     TAG_BUFFER_INLINE uint32_t ReadU32();
     /**
-     * \returns the value read
+     * @returns the value read
      *
      * Read eight bytes, advance the "current" point by eight,
      * and return the value read.
      */
     uint64_t ReadU64();
     /**
-     * \returns the value read
+     * @returns the value read
      *
      * Read a double, advance the "current" point by the size
      * of the data read, and, return the value read.
      */
     double ReadDouble();
     /**
-     * \param buffer a pointer to the buffer where data should be
+     * @param buffer a pointer to the buffer where data should be
      * written.
-     * \param size the number of bytes to read.
+     * @param size the number of bytes to read.
      *
      * Read the number of bytes requested, advance the "current"
      * point by the number of bytes read, return.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/model/tag.h ns-3.44/src/network/model/tag.h
--- ns-3.43/src/network/model/tag.h	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/model/tag.h	2025-03-09 16:55:49.675372100 -0700
@@ -18,9 +18,9 @@
 {
 
 /**
- * \ingroup packet
+ * @ingroup packet
  *
- * \brief tag a set of bytes in a packet
+ * @brief tag a set of bytes in a packet
  *
  * New kinds of tags can be created by subclassing from this abstract base class.
  */
@@ -28,20 +28,20 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \returns the number of bytes required to serialize the data of the tag.
+     * @returns the number of bytes required to serialize the data of the tag.
      *
      * This method is typically invoked by Packet::AddPacketTag or Packet::AddByteTag
      * just prior to calling Tag::Serialize.
      */
     virtual uint32_t GetSerializedSize() const = 0;
     /**
-     * \param i the buffer to write data into.
+     * @param i the buffer to write data into.
      *
      * Write the content of the tag in the provided tag buffer.
      * DO NOT attempt to write more bytes than you requested
@@ -49,7 +49,7 @@
      */
     virtual void Serialize(TagBuffer i) const = 0;
     /**
-     * \param i the buffer to read data from.
+     * @param i the buffer to read data from.
      *
      * Read the content of the tag from the provided tag buffer.
      * DO NOT attempt to read more bytes than you wrote with
@@ -58,7 +58,7 @@
     virtual void Deserialize(TagBuffer i) = 0;
 
     /**
-     * \param os the stream to print to
+     * @param os the stream to print to
      *
      * This method is typically invoked from the Packet::PrintByteTags
      * or Packet::PrintPacketTags methods.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/model/trailer.h ns-3.44/src/network/model/trailer.h
--- ns-3.43/src/network/model/trailer.h	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/model/trailer.h	2025-03-09 16:55:49.675372100 -0700
@@ -18,9 +18,9 @@
 {
 
 /**
- * \ingroup packet
+ * @ingroup packet
  *
- * \brief Protocol trailer serialization and deserialization.
+ * @brief Protocol trailer serialization and deserialization.
  *
  * Every Protocol trailer which needs to be inserted or removed
  * from a Packet instance must derive from this base class and
@@ -30,13 +30,13 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     ~Trailer() override;
     /**
-     * \returns the expected size of the trailer.
+     * @returns the expected size of the trailer.
      *
      * This method is used by Packet::AddTrailer
      * to store a trailer into the byte buffer of a packet. This method
@@ -45,7 +45,7 @@
      */
     virtual uint32_t GetSerializedSize() const = 0;
     /**
-     * \param start an iterator which points to where the trailer
+     * @param start an iterator which points to where the trailer
      *        should be written.
      *
      * This method is used by Packet::AddTrailer to
@@ -58,9 +58,9 @@
      */
     virtual void Serialize(Buffer::Iterator start) const = 0;
     /**
-     * \param end an iterator which points to the end of the buffer
+     * @param end an iterator which points to the end of the buffer
      *        where the trailer should be read from.
-     * \returns the number of bytes read.
+     * @returns the number of bytes read.
      *
      * This method is used by Packet::RemoveTrailer to
      * re-create a trailer from the byte buffer of a packet.
@@ -72,11 +72,11 @@
      */
     uint32_t Deserialize(Buffer::Iterator end) override = 0;
     /**
-     * \param start an iterator which points to the start of the buffer
+     * @param start an iterator which points to the start of the buffer
      *        where the trailer should be read from.
-     * \param end an iterator which points to the end of the buffer
+     * @param end an iterator which points to the end of the buffer
      *        where the trailer should be read from.
-     * \returns the number of bytes read.
+     * @returns the number of bytes read.
      *
      * This method is used by Packet::RemoveTrailer to
      * re-create a trailer from the byte buffer of a packet.
@@ -90,7 +90,7 @@
      */
     uint32_t Deserialize(Buffer::Iterator start, Buffer::Iterator end) override;
     /**
-     * \param os output stream
+     * @param os output stream
      * This method is used by Packet::Print to print the
      * content of a trailer as ascii data to a c++ output stream.
      * Although the trailer is free to format its output as it
@@ -105,11 +105,11 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the stream
- * \param trailer the trailer
- * \returns a reference to the stream
+ * @param os the stream
+ * @param trailer the trailer
+ * @returns a reference to the stream
  */
 std::ostream& operator<<(std::ostream& os, const Trailer& trailer);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/test/bit-serializer-test.cc ns-3.44/src/network/test/bit-serializer-test.cc
--- ns-3.43/src/network/test/bit-serializer-test.cc	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/test/bit-serializer-test.cc	2025-03-09 16:55:49.675372100 -0700
@@ -16,10 +16,10 @@
 using namespace ns3;
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
- * \brief Bit serialization test
+ * @brief Bit serialization test
  */
 class BitSerializerTest : public TestCase
 {
@@ -66,10 +66,10 @@
 }
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
- * \brief Bit deserialization test
+ * @brief Bit deserialization test
  */
 class BitDeserializerTest : public TestCase
 {
@@ -130,10 +130,10 @@
 }
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
- * \brief Packet Metadata TestSuite
+ * @brief Packet Metadata TestSuite
  */
 class BitSerializerTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/test/buffer-test.cc ns-3.44/src/network/test/buffer-test.cc
--- ns-3.43/src/network/test/buffer-test.cc	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/test/buffer-test.cc	2025-03-09 16:55:49.675372100 -0700
@@ -14,13 +14,13 @@
 using namespace ns3;
 
 /**
- * \ingroup network
- * \defgroup network-test Network module unit tests
+ * @ingroup network
+ * @defgroup network-test Network module unit tests
  */
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
  * Buffer unit tests.
  */
@@ -29,9 +29,9 @@
   private:
     /**
      * Checks the buffer content
-     * \param b The buffer to check
-     * \param n The number of bytes to check
-     * \param array The array of bytes that should be in the buffer
+     * @param b The buffer to check
+     * @param n The number of bytes to check
+     * @param array The array of bytes that should be in the buffer
      */
     void EnsureWrittenBytes(Buffer b, uint32_t n, uint8_t array[]);
 
@@ -385,10 +385,10 @@
 }
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
- * \brief Buffer TestSuite
+ * @brief Buffer TestSuite
  */
 class BufferTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/test/drop-tail-queue-test-suite.cc ns-3.44/src/network/test/drop-tail-queue-test-suite.cc
--- ns-3.43/src/network/test/drop-tail-queue-test-suite.cc	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/test/drop-tail-queue-test-suite.cc	2025-03-09 16:55:49.675372100 -0700
@@ -11,8 +11,8 @@
 using namespace ns3;
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
  * DropTailQueue unit tests.
  */
@@ -77,10 +77,10 @@
 }
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
- * \brief DropTail Queue TestSuite
+ * @brief DropTail Queue TestSuite
  */
 class DropTailQueueTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/test/error-model-test-suite.cc ns-3.44/src/network/test/error-model-test-suite.cc
--- ns-3.43/src/network/test/error-model-test-suite.cc	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/test/error-model-test-suite.cc	2025-03-09 16:55:49.675372100 -0700
@@ -68,8 +68,8 @@
 }
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
  * ErrorModel unit tests.
  */
@@ -83,16 +83,16 @@
     void DoRun() override;
     /**
      * Receive form a NetDevice
-     * \param nd The NetDevice.
-     * \param p The received packet.
-     * \param protocol The protocol received.
-     * \param addr The sender address.
-     * \return True on success.
+     * @param nd The NetDevice.
+     * @param p The received packet.
+     * @param protocol The protocol received.
+     * @param addr The sender address.
+     * @return True on success.
      */
     bool Receive(Ptr<NetDevice> nd, Ptr<const Packet> p, uint16_t protocol, const Address& addr);
     /**
      * Register a Drop
-     * \param p The dropped packet
+     * @param p The dropped packet
      */
     void DropEvent(Ptr<const Packet> p);
 
@@ -171,8 +171,8 @@
 }
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
  * BurstErrorModel unit tests.
  */
@@ -186,16 +186,16 @@
     void DoRun() override;
     /**
      * Receive form a NetDevice
-     * \param nd The NetDevice.
-     * \param p The received packet.
-     * \param protocol The protocol received.
-     * \param addr The sender address.
-     * \return True on success.
+     * @param nd The NetDevice.
+     * @param p The received packet.
+     * @param protocol The protocol received.
+     * @param addr The sender address.
+     * @return True on success.
      */
     bool Receive(Ptr<NetDevice> nd, Ptr<const Packet> p, uint16_t protocol, const Address& addr);
     /**
      * Register a Drop
-     * \param p The dropped packet
+     * @param p The dropped packet
      */
     void DropEvent(Ptr<const Packet> p);
 
@@ -278,10 +278,10 @@
 }
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
- * \brief ErrorModel TestSuite
+ * @brief ErrorModel TestSuite
  *
  *  This is the start of an error model test suite.  For starters, this is
  *  just testing that the SimpleNetDevice is working but this can be
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/test/header-serialization-test.h ns-3.44/src/network/test/header-serialization-test.h
--- ns-3.43/src/network/test/header-serialization-test.h	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/test/header-serialization-test.h	2025-03-09 16:55:49.675372100 -0700
@@ -24,9 +24,9 @@
 {
   protected:
     /**
-     * \brief Constructor.
+     * @brief Constructor.
      *
-     * \param [in] name The name of the new TestCase created
+     * @param [in] name The name of the new TestCase created
      */
     HeaderSerializationTestCase(std::string name)
         : TestCase(name)
@@ -39,10 +39,10 @@
      * deserializing from the buffer and serialize the new header into a new buffer.
      * Verify that the two buffers have the same size and the same content.
      *
-     * \tparam T \deduced Type of the given header
-     * \tparam Args \deduced Type of arguments to pass to the constructor of the header
-     * \param [in] hdr the header to test
-     * \param [in] args the arguments to construct the new header
+     * @tparam T \deduced Type of the given header
+     * @tparam Args \deduced Type of arguments to pass to the constructor of the header
+     * @param [in] hdr the header to test
+     * @param [in] args the arguments to construct the new header
      */
     template <typename T, typename... Args>
     void TestHeaderSerialization(const T& hdr, Args&&... args);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/test/ipv6-address-test-suite.cc ns-3.44/src/network/test/ipv6-address-test-suite.cc
--- ns-3.43/src/network/test/ipv6-address-test-suite.cc	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/test/ipv6-address-test-suite.cc	2025-03-09 16:55:49.675372100 -0700
@@ -8,8 +8,8 @@
 using namespace ns3;
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
  * Ipv6Address unit tests.
  */
@@ -85,10 +85,10 @@
 }
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
- * \brief Ipv6Address TestSuite
+ * @brief Ipv6Address TestSuite
  *
  */
 class Ipv6AddressTestSuite : public TestSuite
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/test/lollipop-counter-test.cc ns-3.44/src/network/test/lollipop-counter-test.cc
--- ns-3.43/src/network/test/lollipop-counter-test.cc	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/test/lollipop-counter-test.cc	2025-03-09 16:55:49.675372100 -0700
@@ -15,10 +15,10 @@
 using namespace ns3;
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
- * \brief Lollipop Counter Test
+ * @brief Lollipop Counter Test
  */
 class LollipopCounterTest : public TestCase
 {
@@ -134,10 +134,10 @@
 }
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
- * \brief Lollipop Counter TestSuite
+ * @brief Lollipop Counter TestSuite
  */
 class LollipopCounterTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/test/packetbb-test-suite.cc ns-3.44/src/network/test/packetbb-test-suite.cc
--- ns-3.43/src/network/test/packetbb-test-suite.cc	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/test/packetbb-test-suite.cc	2025-03-09 16:55:49.675372100 -0700
@@ -19,20 +19,20 @@
 using namespace ns3;
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
- * \brief PacketBb TestCase
+ * @brief PacketBb TestCase
  */
 class PbbTestCase : public TestCase
 {
   public:
     /**
      * Constructor
-     * \param name Test name.
-     * \param packet Packet to test.
-     * \param buffer Buffer to test.
-     * \param size Buffer size.
+     * @param name Test name.
+     * @param packet Packet to test.
+     * @param buffer Buffer to test.
+     * @param size Buffer size.
      */
     PbbTestCase(std::string name, Ptr<PbbPacket> packet, uint8_t* buffer, uint32_t size);
     ~PbbTestCase() override;
@@ -100,10 +100,10 @@
 }
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
- * \brief PacketBb TestSuite
+ * @brief PacketBb TestSuite
  */
 class PbbTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/test/packet-metadata-test.cc ns-3.44/src/network/test/packet-metadata-test.cc
--- ns-3.43/src/network/test/packet-metadata-test.cc	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/test/packet-metadata-test.cc	2025-03-09 16:55:49.675372100 -0700
@@ -21,25 +21,25 @@
 {
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
- * \brief Base header-type class to check the proper header concatenation
+ * @brief Base header-type class to check the proper header concatenation
  *
- * \note Class internal to packet-metadata-test.cc
+ * @note Class internal to packet-metadata-test.cc
  */
 class HistoryHeaderBase : public Header
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
     HistoryHeaderBase();
     /**
      * Checks if the header has deserialization errors
-     * \returns True if no error found.
+     * @returns True if no error found.
      */
     bool IsOk() const;
 
@@ -78,12 +78,12 @@
 }
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
- * \brief Template header-type class to check the proper header concatenation
+ * @brief Template header-type class to check the proper header concatenation
  *
- * \note Class internal to packet-metadata-test.cc
+ * @note Class internal to packet-metadata-test.cc
  */
 template <int N>
 class HistoryHeader : public HistoryHeaderBase
@@ -91,8 +91,8 @@
   public:
     HistoryHeader();
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -162,25 +162,25 @@
 }
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
- * \brief Base trailer-type class to check the proper trailer concatenation
+ * @brief Base trailer-type class to check the proper trailer concatenation
  *
- * \note Class internal to packet-metadata-test.cc
+ * @note Class internal to packet-metadata-test.cc
  */
 class HistoryTrailerBase : public Trailer
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
     HistoryTrailerBase();
     /**
      * Checks if the header has deserialization errors
-     * \returns True if no error found.
+     * @returns True if no error found.
      */
     bool IsOk() const;
 
@@ -219,12 +219,12 @@
 }
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
- * \brief Template trailer-type class to check the proper trailer concatenation
+ * @brief Template trailer-type class to check the proper trailer concatenation
  *
- * \note Class internal to packet-metadata-test.cc
+ * @note Class internal to packet-metadata-test.cc
  */
 template <int N>
 class HistoryTrailer : public HistoryTrailerBase
@@ -233,8 +233,8 @@
     HistoryTrailer();
 
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -307,8 +307,8 @@
 } // namespace
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
  * Packet Metadata unit tests.
  */
@@ -319,9 +319,9 @@
     ~PacketMetadataTest() override;
     /**
      * Checks the packet header and trailer history
-     * \param p The packet
-     * \param n The number of variable arguments
-     * \param ... The variable arguments
+     * @param p The packet
+     * @param n The number of variable arguments
+     * @param ... The variable arguments
      */
     void CheckHistory(Ptr<Packet> p, uint32_t n, ...);
     void DoRun() override;
@@ -329,8 +329,8 @@
   private:
     /**
      * Adds an header to the packet
-     * \param p The packet
-     * \return The packet with the header added.
+     * @param p The packet
+     * @return The packet with the header added.
      */
     Ptr<Packet> DoAddHeader(Ptr<Packet> p);
 };
@@ -744,7 +744,7 @@
     p = Create<Packet>(16383);
     p = Create<Packet>(16384);
 
-    /// \internal
+    /// @internal
     /// See \bugid{179}
     p = Create<Packet>(40);
     p2 = p->CreateFragment(5, 5);
@@ -815,7 +815,7 @@
     p->RemoveAtStart(10);
     CHECK_HISTORY(p, 1, 490);
 
-    /// \internal
+    /// @internal
     /// See \bugid{1072}
     p = Create<Packet>(500);
     ADD_HEADER(p, 10);
@@ -826,7 +826,7 @@
     p2 = p->CreateFragment(6, 535 - 6);
     p1->AddAtEnd(p2);
 
-    /// \internal
+    /// @internal
     /// See \bugid{1072}
     p = Create<Packet>(reinterpret_cast<const uint8_t*>("hello world"), 11);
     ADD_HEADER(p, 2);
@@ -871,10 +871,10 @@
 }
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
- * \brief Packet Metadata TestSuite
+ * @brief Packet Metadata TestSuite
  */
 class PacketMetadataTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/test/packet-socket-apps-test-suite.cc ns-3.44/src/network/test/packet-socket-apps-test-suite.cc
--- ns-3.43/src/network/test/packet-socket-apps-test-suite.cc	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/test/packet-socket-apps-test-suite.cc	2025-03-09 16:55:49.675372100 -0700
@@ -20,10 +20,10 @@
 using namespace ns3;
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
- * \brief PacketSocket apps Unit Test
+ * @brief PacketSocket apps Unit Test
  */
 class PacketSocketAppsTest : public TestCase
 {
@@ -36,8 +36,8 @@
 
     /**
      * Receive a packet
-     * \param packet The packet
-     * \param from Address of the sender
+     * @param packet The packet
+     * @param from Address of the sender
      */
     void ReceivePkt(Ptr<const Packet> packet, const Address& from);
 };
@@ -110,10 +110,10 @@
 }
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
- * \brief PacketSocket apps TestSuite
+ * @brief PacketSocket apps TestSuite
  */
 class PacketSocketAppsTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/test/packet-test-suite.cc ns-3.44/src/network/test/packet-test-suite.cc
--- ns-3.43/src/network/test/packet-test-suite.cc	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/test/packet-test-suite.cc	2025-03-09 16:55:49.675372100 -0700
@@ -25,12 +25,12 @@
 {
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
- * \brief Base class for Test tags
+ * @brief Base class for Test tags
  *
- * \note Class internal to packet-test-suite.cc
+ * @note Class internal to packet-test-suite.cc
  */
 class ATestTagBase : public Tag
 {
@@ -42,7 +42,7 @@
     }
 
     /// Constructor
-    /// \param data Tag data
+    /// @param data Tag data
     ATestTagBase(uint8_t data)
         : m_error(false),
           m_data(data)
@@ -51,7 +51,7 @@
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId()
     {
@@ -63,7 +63,7 @@
     }
 
     /// Get the tag data.
-    /// \return the tag data.
+    /// @return the tag data.
     int GetData() const
     {
         int result = (int)m_data;
@@ -75,12 +75,12 @@
 };
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
- * \brief Template class for Test tags
+ * @brief Template class for Test tags
  *
- * \note Class internal to packet-test-suite.cc
+ * @note Class internal to packet-test-suite.cc
  */
 template <int N>
 class ATestTag : public ATestTagBase
@@ -88,7 +88,7 @@
   public:
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId()
     {
@@ -145,7 +145,7 @@
     }
 
     /// Constructor
-    /// \param data Tag data
+    /// @param data Tag data
     ATestTag(uint8_t data)
         : ATestTagBase(data)
     {
@@ -157,14 +157,14 @@
 #define LARGE_TAG_BUFFER_SIZE 64
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
- * \brief Template class for Large Test tags
+ * @brief Template class for Large Test tags
  *
- * \see Bug 2221: Expanding packet tag maximum size
+ * @see Bug 2221: Expanding packet tag maximum size
  *
- * \note Class internal to packet-test-suite.cc
+ * @note Class internal to packet-test-suite.cc
  */
 class ALargeTestTag : public Tag
 {
@@ -180,7 +180,7 @@
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId()
     {
@@ -232,12 +232,12 @@
 };
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
- * \brief Base class for Test headers
+ * @brief Base class for Test headers
  *
- * \note Class internal to packet-test-suite.cc
+ * @note Class internal to packet-test-suite.cc
  */
 class ATestHeaderBase : public Header
 {
@@ -250,7 +250,7 @@
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId()
     {
@@ -267,12 +267,12 @@
 };
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
- * \brief Template class for Test headers
+ * @brief Template class for Test headers
  *
- * \note Class internal to packet-test-suite.cc
+ * @note Class internal to packet-test-suite.cc
  */
 template <int N>
 class ATestHeader : public ATestHeaderBase
@@ -280,7 +280,7 @@
   public:
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId()
     {
@@ -336,12 +336,12 @@
 };
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
- * \brief Base class for Test trailers
+ * @brief Base class for Test trailers
  *
- * \note Class internal to packet-test-suite.cc
+ * @note Class internal to packet-test-suite.cc
  */
 class ATestTrailerBase : public Trailer
 {
@@ -354,7 +354,7 @@
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId()
     {
@@ -371,12 +371,12 @@
 };
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
- * \brief Template class for Test trailers
+ * @brief Template class for Test trailers
  *
- * \note Class internal to packet-test-suite.cc
+ * @note Class internal to packet-test-suite.cc
  */
 template <int N>
 class ATestTrailer : public ATestTrailerBase
@@ -384,7 +384,7 @@
   public:
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId()
     {
@@ -442,20 +442,20 @@
 };
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
- * \brief Struct to hold the expected data in the packet
+ * @brief Struct to hold the expected data in the packet
  *
- * \note Class internal to packet-test-suite.cc
+ * @note Class internal to packet-test-suite.cc
  */
 struct Expected
 {
     /**
      * Constructor
-     * \param n_ Number of elements
-     * \param start_ Start
-     * \param end_ End
+     * @param n_ Number of elements
+     * @param start_ Start
+     * @param end_ End
      */
     Expected(uint32_t n_, uint32_t start_, uint32_t end_)
         : n(n_),
@@ -467,10 +467,10 @@
 
     /**
      * Constructor
-     * \param n_ Number of elements
-     * \param start_ Start
-     * \param end_ End
-     * \param data_ Data stored in tag
+     * @param n_ Number of elements
+     * @param start_ Start
+     * @param end_ End
+     * @param data_ Data stored in tag
      */
     Expected(uint32_t n_, uint32_t start_, uint32_t end_, uint8_t data_)
         : n(n_),
@@ -501,8 +501,8 @@
 #define CHECK_DATA(p, n, ...) DoCheckData(p, n, __VA_ARGS__)
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
  * Packet unit tests.
  */
@@ -515,16 +515,16 @@
   private:
     /**
      * Checks the packet
-     * \param p The packet
-     * \param n The number of variable arguments
-     * \param ... The variable arguments
+     * @param p The packet
+     * @param n The number of variable arguments
+     * @param ... The variable arguments
      */
     void DoCheck(Ptr<const Packet> p, uint32_t n, ...);
     /**
      * Checks the packet and its data
-     * \param p The packet
-     * \param n The number of variable arguments
-     * \param ... The variable arguments
+     * @param p The packet
+     * @param n The number of variable arguments
+     * @param ... The variable arguments
      */
     void DoCheckData(Ptr<const Packet> p, uint32_t n, ...);
 };
@@ -642,7 +642,7 @@
 
     {
         Packet c0 = *copy;
-        Packet c1 = *copy;
+        Packet c1 = *copy; // NOLINT(performance-unnecessary-copy-initialization)
         c0 = c1;
         CHECK(&c0, 1, E(1, 0, 1000));
         CHECK(&c1, 1, E(1, 0, 1000));
@@ -850,7 +850,7 @@
     }
 
     {
-        /// \internal
+        /// @internal
         /// See \bugid{572}
         Ptr<Packet> tmp = Create<Packet>(1000);
         tmp->AddByteTag(ATestTag<20>());
@@ -948,8 +948,8 @@
 }
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
  * Packet Tag list unit tests.
  */
@@ -963,33 +963,33 @@
     void DoRun() override;
     /**
      * Checks against a reference PacketTagList
-     * \param ref Reference
-     * \param t List to test
-     * \param msg Message
-     * \param miss Expected miss/hit
+     * @param ref Reference
+     * @param t List to test
+     * @param msg Message
+     * @param miss Expected miss/hit
      */
     void CheckRef(const PacketTagList& ref, ATestTagBase& t, const char* msg, bool miss = false);
     /**
      * Checks against a reference PacketTagList
-     * \param ref Reference
-     * \param msg Message
-     * \param miss Expected miss/hit
+     * @param ref Reference
+     * @param msg Message
+     * @param miss Expected miss/hit
      */
     void CheckRefList(const PacketTagList& ref, const char* msg, int miss = 0);
 
     /**
      * Prints the remove time
-     * \param ref Reference.
-     * \param t List to test.
-     * \param msg Message - prints on cout if msg is not null.
-     * \return the ticks to remove the tags.
+     * @param ref Reference.
+     * @param t List to test.
+     * @param msg Message - prints on cout if msg is not null.
+     * @return the ticks to remove the tags.
      */
     int RemoveTime(const PacketTagList& ref, ATestTagBase& t, const char* msg = nullptr);
 
     /**
      * Prints the remove time
-     * \param verbose prints on cout if verbose is true.
-     * \return the ticks to remove the tags.
+     * @param verbose prints on cout if verbose is true.
+     * @return the ticks to remove the tags.
      */
     int AddRemoveTime(const bool verbose = false);
 };
@@ -1258,10 +1258,10 @@
 }
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
- * \brief Packet TestSuite
+ * @brief Packet TestSuite
  */
 class PacketTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/test/pcap-file-test-suite.cc ns-3.44/src/network/test/pcap-file-test-suite.cc
--- ns-3.43/src/network/test/pcap-file-test-suite.cc	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/test/pcap-file-test-suite.cc	2025-03-09 16:55:49.675372100 -0700
@@ -66,10 +66,10 @@
 }
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
- * \brief Test case to make sure that the Pcap File Object can do its
+ * @brief Test case to make sure that the Pcap File Object can do its
  * most basic job and create an empty pcap file.
  */
 class WriteModeCreateTestCase : public TestCase
@@ -193,10 +193,10 @@
 }
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
- * \brief Test case to make sure that the Pcap File Object can open an
+ * @brief Test case to make sure that the Pcap File Object can open an
  * existing pcap file.
  */
 class ReadModeCreateTestCase : public TestCase
@@ -424,10 +424,10 @@
 #endif
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
- * \brief Test case to make sure that the Pcap File Object can
+ * @brief Test case to make sure that the Pcap File Object can
  * write out correct pcap file headers in both endian cases,
  * and then read them in correctly.
  */
@@ -702,10 +702,10 @@
 }
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
- * \brief Test case to make sure that the Pcap File Object can
+ * @brief Test case to make sure that the Pcap File Object can
  * write pcap packet records in both endian cases, and then read
  * them in correctly.
  */
@@ -1060,10 +1060,10 @@
 }
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
- * \brief Test case to make sure that the Pcap File Object can read
+ * @brief Test case to make sure that the Pcap File Object can read
  * out the contents of a known good pcap file.
  */
 class ReadFileTestCase : public TestCase
@@ -1302,10 +1302,10 @@
 }
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
- * \brief Test case to make sure that the Pcap::Diff method works as expected.
+ * @brief Test case to make sure that the Pcap::Diff method works as expected.
  */
 class DiffTestCase : public TestCase
 {
@@ -1365,10 +1365,10 @@
 }
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
- * \brief PCAP file utils TestSuite
+ * @brief PCAP file utils TestSuite
  */
 class PcapFileTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/test/sequence-number-test-suite.cc ns-3.44/src/network/test/sequence-number-test-suite.cc
--- ns-3.43/src/network/test/sequence-number-test-suite.cc	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/test/sequence-number-test-suite.cc	2025-03-09 16:55:49.675372100 -0700
@@ -18,12 +18,12 @@
 {
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
- * \brief Test object using sequence numbers
+ * @brief Test object using sequence numbers
  *
- * \note Class internal to sequence-number-test-suite.cc
+ * @note Class internal to sequence-number-test-suite.cc
  */
 class SequenceNumberTestObj : public Object
 {
@@ -37,8 +37,8 @@
     }
 
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId()
     {
@@ -69,10 +69,10 @@
 } // namespace
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
- * \brief Sequence Number Unit Test
+ * @brief Sequence Number Unit Test
  */
 class SequenceNumberTestCase : public TestCase
 {
@@ -81,8 +81,8 @@
 
     /**
      * Sequence number tracker
-     * \param oldval Old value
-     * \param newval New value
+     * @param oldval Old value
+     * @param newval New value
      */
     void SequenceNumberTracer(SequenceNumber32 oldval, SequenceNumber32 newval);
 
@@ -206,10 +206,10 @@
 }
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
- * \brief Sequence Number TestSuite
+ * @brief Sequence Number TestSuite
  */
 class SequenceNumberTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/test/test-data-rate.cc ns-3.44/src/network/test/test-data-rate.cc
--- ns-3.43/src/network/test/test-data-rate.cc	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/test/test-data-rate.cc	2025-03-09 16:55:49.675372100 -0700
@@ -10,14 +10,15 @@
 #include "ns3/log.h"
 #include "ns3/simulator.h"
 #include "ns3/test.h"
+#include "ns3/tuple.h"
 
 using namespace ns3;
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
- * \brief Test Data rate
+ * @brief Test Data rate
  *
  */
 class DataRateTestCase : public TestCase
@@ -25,23 +26,23 @@
   public:
     /**
      * Constructor
-     * \param name test name
+     * @param name test name
      */
     DataRateTestCase(std::string name);
     ~DataRateTestCase() override;
 
     /**
      * Checks if two time values are equal
-     * \param t1 first time to check
-     * \param t2 second time to check
-     * \param msg check output message
+     * @param t1 first time to check
+     * @param t2 second time to check
+     * @param msg check output message
      */
     void CheckTimesEqual(Time t1, Time t2, const std::string msg);
     /**
      * Checks if two data rates values are equal
-     * \param d1 first data rate to check
-     * \param d2 second data rate to check
-     * \param msg check output message
+     * @param d1 first data rate to check
+     * @param d2 second data rate to check
+     * @param msg check output message
      */
     void CheckDataRateEqual(DataRate d1, DataRate d2, const std::string msg);
 
@@ -73,10 +74,10 @@
 }
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
- * \brief Test Data rate
+ * @brief Test Data rate
  *
  */
 class DataRateTestCase1 : public DataRateTestCase
@@ -87,9 +88,9 @@
     /**
      * Checks that a given number of bits, at a specified datarate, are
      * corresponding to a given time
-     * \param rate the DataRate
-     * \param nBits number of bits
-     * \param correctTime expected time
+     * @param rate the DataRate
+     * @param nBits number of bits
+     * @param correctTime expected time
      */
     void SingleTest(std::string rate, size_t nBits, Time correctTime);
 
@@ -122,31 +123,31 @@
     {
         Time::SetResolution(Time::FS);
     }
-    SingleTest("1GB/s", 512, Time(NanoSeconds(64)));
-    SingleTest("8Gb/s", 512, Time(NanoSeconds(64)));
-    SingleTest("1Gb/s", 512, Time(NanoSeconds(512)));
-    SingleTest("8GB/s", 512, Time(NanoSeconds(8)));
+    SingleTest("1GB/s", 512, NanoSeconds(64));
+    SingleTest("8Gb/s", 512, NanoSeconds(64));
+    SingleTest("1Gb/s", 512, NanoSeconds(512));
+    SingleTest("8GB/s", 512, NanoSeconds(8));
     size_t nBits;
     for (nBits = 0; nBits <= 512; nBits++)
     {
-        SingleTest("1Mb/s", nBits, Time(MicroSeconds(nBits)));
-        SingleTest("10Mb/s", nBits, Time(NanoSeconds(nBits * 100)));
-        SingleTest("100Mb/s", nBits, Time(NanoSeconds(nBits * 10)));
-        SingleTest("1Gb/s", nBits, Time(NanoSeconds(nBits)));
-        SingleTest("10Gb/s", nBits, Time(PicoSeconds(nBits * 100)));
-        SingleTest("25Gb/s", nBits, Time(PicoSeconds(nBits * 40)));
-        SingleTest("40Gb/s", nBits, Time(PicoSeconds(nBits * 25)));
-        SingleTest("100Gb/s", nBits, Time(PicoSeconds(nBits * 10)));
-        SingleTest("200Gb/s", nBits, Time(PicoSeconds(nBits * 5)));
-        SingleTest("400Gb/s", nBits, Time(FemtoSeconds(nBits * 2500)));
+        SingleTest("1Mb/s", nBits, MicroSeconds(nBits));
+        SingleTest("10Mb/s", nBits, NanoSeconds(nBits * 100));
+        SingleTest("100Mb/s", nBits, NanoSeconds(nBits * 10));
+        SingleTest("1Gb/s", nBits, NanoSeconds(nBits));
+        SingleTest("10Gb/s", nBits, PicoSeconds(nBits * 100));
+        SingleTest("25Gb/s", nBits, PicoSeconds(nBits * 40));
+        SingleTest("40Gb/s", nBits, PicoSeconds(nBits * 25));
+        SingleTest("100Gb/s", nBits, PicoSeconds(nBits * 10));
+        SingleTest("200Gb/s", nBits, PicoSeconds(nBits * 5));
+        SingleTest("400Gb/s", nBits, FemtoSeconds(nBits * 2500));
     }
 }
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
- * \brief Test Data rate
+ * @brief Test Data rate
  *
  */
 class DataRateTestCase2 : public DataRateTestCase
@@ -155,30 +156,30 @@
     DataRateTestCase2();
     /**
      * Checks data rate addition
-     * \param rate1 first data rate
-     * \param rate2 second data rate
-     * \param rate3 third data rate (first plus second)
+     * @param rate1 first data rate
+     * @param rate2 second data rate
+     * @param rate3 third data rate (first plus second)
      */
     void AdditionTest(std::string rate1, std::string rate2, std::string rate3);
     /**
      * Checks data rate subtraction
-     * \param rate1 first data rate
-     * \param rate2 second data rate
-     * \param rate3 third data rate (first minus second)
+     * @param rate1 first data rate
+     * @param rate2 second data rate
+     * @param rate3 third data rate (first minus second)
      */
     void SubtractionTest(std::string rate1, std::string rate2, std::string rate3);
     /**
      * Checks data rate integer multiplication
-     * \param rate1 first data rate
-     * \param factor multiplication factor
-     * \param rate2 second data rate  (first multiplied by factor)
+     * @param rate1 first data rate
+     * @param factor multiplication factor
+     * @param rate2 second data rate  (first multiplied by factor)
      */
     void MultiplicationIntTest(std::string rate1, uint64_t factor, std::string rate2);
     /**
      * Checks data rate floating point multiplication
-     * \param rate1 first data rate
-     * \param factor multiplication factor
-     * \param rate2 second data rate  (first multiplied by factor)
+     * @param rate1 first data rate
+     * @param factor multiplication factor
+     * @param rate2 second data rate  (first multiplied by factor)
      */
     void MultiplicationDoubleTest(std::string rate1, double factor, std::string rate2);
 
@@ -259,10 +260,90 @@
 }
 
 /**
- * \ingroup network-test
- * \ingroup tests
+ * @ingroup network-test
+ * @ingroup tests
  *
- * \brief DataRate TestSuite
+ * Object with an attribute that is a tuple of data rates and a string.
+ */
+class DataRateTupleObject : public Object
+{
+  public:
+    ~DataRateTupleObject() override = default;
+
+    /**
+     * @brief Get the type ID.
+     * @return The object TypeId.
+     */
+    static TypeId GetTypeId();
+
+    std::tuple<DataRate, DataRate, std::string> m_tupleRatesString; //!< tuple of two data rates
+                                                                    //!< and a string
+};
+
+TypeId
+DataRateTupleObject::GetTypeId()
+{
+    static TypeId tid =
+        TypeId("ns3::DataRateTupleObject")
+            .SetParent<Object>()
+            .SetGroupName("Test")
+            .AddConstructor<DataRateTupleObject>()
+            .AddAttribute(
+                "TupleRatesString",
+                "An example of tuple of two data rates (comprising value and unit, possibly "
+                "separated by a white space) and a string (possibly containing a white space).",
+                StringValue("{1 Mb/s, 10kb/s, test string}"),
+                MakeTupleAccessor<DataRateValue, DataRateValue, StringValue>(
+                    &DataRateTupleObject::m_tupleRatesString),
+                MakeTupleChecker<DataRateValue, DataRateValue, StringValue>(MakeDataRateChecker(),
+                                                                            MakeDataRateChecker(),
+                                                                            MakeStringChecker()));
+    return tid;
+}
+
+/**
+ * @ingroup network-test
+ * @ingroup tests
+ *
+ * Attribute set and get TestCase.
+ */
+class DataRateTupleSetGetTestCase : public TestCase
+{
+  public:
+    DataRateTupleSetGetTestCase();
+    ~DataRateTupleSetGetTestCase() override = default;
+
+  private:
+    void DoRun() override;
+};
+
+DataRateTupleSetGetTestCase::DataRateTupleSetGetTestCase()
+    : TestCase("test attribute set and get")
+{
+}
+
+void
+DataRateTupleSetGetTestCase::DoRun()
+{
+    Ptr<DataRateTupleObject> obj = CreateObject<DataRateTupleObject>();
+
+    // check that the tuple of two data rates and a string was correctly initialized
+    NS_TEST_EXPECT_MSG_EQ(std::get<0>(obj->m_tupleRatesString),
+                          DataRate(1e6),
+                          "Unexpected value for the first data rate");
+    NS_TEST_EXPECT_MSG_EQ(std::get<1>(obj->m_tupleRatesString),
+                          DataRate(1e4),
+                          "Unexpected value for the second data rate");
+    NS_TEST_EXPECT_MSG_EQ(std::get<2>(obj->m_tupleRatesString),
+                          "test string",
+                          "Unexpected value for the string");
+}
+
+/**
+ * @ingroup network-test
+ * @ingroup tests
+ *
+ * @brief DataRate TestSuite
  */
 class DataRateTestSuite : public TestSuite
 {
@@ -275,6 +356,7 @@
 {
     AddTestCase(new DataRateTestCase1(), TestCase::Duration::QUICK);
     AddTestCase(new DataRateTestCase2(), TestCase::Duration::QUICK);
+    AddTestCase(new DataRateTupleSetGetTestCase(), TestCase::Duration::QUICK);
 }
 
 static DataRateTestSuite sDataRateTestSuite; //!< Static variable for test initialization
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/address-utils.cc ns-3.44/src/network/utils/address-utils.cc
--- ns-3.43/src/network/utils/address-utils.cc	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/address-utils.cc	2025-03-09 16:55:49.675372100 -0700
@@ -156,6 +156,28 @@
     return false;
 }
 
+Address
+ConvertToSocketAddress(const Address& address, uint16_t port)
+{
+    NS_LOG_FUNCTION(address << port);
+    Address convertedAddress;
+    if (Ipv4Address::IsMatchingType(address))
+    {
+        convertedAddress = InetSocketAddress(Ipv4Address::ConvertFrom(address), port);
+        NS_LOG_DEBUG("Address converted to " << convertedAddress);
+    }
+    else if (Ipv6Address::IsMatchingType(address))
+    {
+        convertedAddress = Inet6SocketAddress(Ipv6Address::ConvertFrom(address), port);
+        NS_LOG_DEBUG("Address converted to " << convertedAddress);
+    }
+    else
+    {
+        NS_FATAL_ERROR("This function should be called for an IPv4 or an IPv6 address");
+    }
+    return convertedAddress;
+}
+
 } // namespace addressUtils
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/address-utils.h ns-3.44/src/network/utils/address-utils.h
--- ns-3.43/src/network/utils/address-utils.h	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/address-utils.h	2025-03-09 16:55:49.675372100 -0700
@@ -21,87 +21,87 @@
 {
 
 /**
- * \brief Write an Ipv4Address to a Buffer
- * \param i a reference to the buffer to write to
- * \param ad the Ipv4Address
+ * @brief Write an Ipv4Address to a Buffer
+ * @param i a reference to the buffer to write to
+ * @param ad the Ipv4Address
  */
 void WriteTo(Buffer::Iterator& i, Ipv4Address ad);
 
 /**
- * \brief Write an Ipv4Address to a Buffer
- * \param i a reference to the buffer to write to
- * \param ad the Ipv6Address
+ * @brief Write an Ipv4Address to a Buffer
+ * @param i a reference to the buffer to write to
+ * @param ad the Ipv6Address
  */
 void WriteTo(Buffer::Iterator& i, Ipv6Address ad);
 
 /**
- * \brief Write an Address to a Buffer
- * \param i a reference to the buffer to write to
- * \param ad the Address
+ * @brief Write an Address to a Buffer
+ * @param i a reference to the buffer to write to
+ * @param ad the Address
  */
 void WriteTo(Buffer::Iterator& i, const Address& ad);
 
 /**
- * \brief Write an Mac64Address to a Buffer
- * \param i a reference to the buffer to write to
- * \param ad the Mac64Address
+ * @brief Write an Mac64Address to a Buffer
+ * @param i a reference to the buffer to write to
+ * @param ad the Mac64Address
  */
 void WriteTo(Buffer::Iterator& i, Mac64Address ad);
 
 /**
- * \brief Write an Mac48Address to a Buffer
- * \param i a reference to the buffer to write to
- * \param ad the Mac48Address
+ * @brief Write an Mac48Address to a Buffer
+ * @param i a reference to the buffer to write to
+ * @param ad the Mac48Address
  */
 void WriteTo(Buffer::Iterator& i, Mac48Address ad);
 
 /**
- * \brief Write an Mac16Address to a Buffer
- * \param i a reference to the buffer to write to
- * \param ad the Mac16Address
+ * @brief Write an Mac16Address to a Buffer
+ * @param i a reference to the buffer to write to
+ * @param ad the Mac16Address
  */
 void WriteTo(Buffer::Iterator& i, Mac16Address ad);
 
 /**
- * \brief Read an Ipv4Address from a Buffer
- * \param i a reference to the buffer to read from
- * \param ad a reference to the Ipv4Address to be read
+ * @brief Read an Ipv4Address from a Buffer
+ * @param i a reference to the buffer to read from
+ * @param ad a reference to the Ipv4Address to be read
  */
 void ReadFrom(Buffer::Iterator& i, Ipv4Address& ad);
 
 /**
- * \brief Read an Ipv6Address from a Buffer
- * \param i a reference to the buffer to read from
- * \param ad a reference to the Ipv6Address to be read
+ * @brief Read an Ipv6Address from a Buffer
+ * @param i a reference to the buffer to read from
+ * @param ad a reference to the Ipv6Address to be read
  */
 void ReadFrom(Buffer::Iterator& i, Ipv6Address& ad);
 
 /**
- * \brief Read an Address from a Buffer
- * \param i a reference to the buffer to read from
- * \param ad a reference to the Address to be read
- * \param len the length of the Address
+ * @brief Read an Address from a Buffer
+ * @param i a reference to the buffer to read from
+ * @param ad a reference to the Address to be read
+ * @param len the length of the Address
  */
 void ReadFrom(Buffer::Iterator& i, Address& ad, uint32_t len);
 
 /**
- * \brief Read a Mac64Address from a Buffer
- * \param i a reference to the buffer to read from
- * \param ad a reference to the Mac64Address to be read
+ * @brief Read a Mac64Address from a Buffer
+ * @param i a reference to the buffer to read from
+ * @param ad a reference to the Mac64Address to be read
  */
 void ReadFrom(Buffer::Iterator& i, Mac64Address& ad);
 
 /**
- * \brief Read a Mac48Address from a Buffer
- * \param i a reference to the buffer to read from
- * \param ad a reference to the Mac48Address to be read
+ * @brief Read a Mac48Address from a Buffer
+ * @param i a reference to the buffer to read from
+ * @param ad a reference to the Mac48Address to be read
  */
 void ReadFrom(Buffer::Iterator& i, Mac48Address& ad);
 
 /**
- * \brief Read a Mac16Address from a Buffer
- * \param i a reference to the buffer to read from
- * \param ad a reference to the Mac16Address to be read
+ * @brief Read a Mac16Address from a Buffer
+ * @param i a reference to the buffer to read from
+ * @param ad a reference to the Mac16Address to be read
  */
 void ReadFrom(Buffer::Iterator& i, Mac16Address& ad);
 
@@ -109,9 +109,20 @@
 {
 
 /**
- * \brief Address family-independent test for a multicast address
+ * @brief Address family-independent test for a multicast address
+ * @param ad the address to test
+ * @return true if the address is a multicast address, false otherwise
  */
 bool IsMulticast(const Address& ad);
+
+/**
+ * @brief Convert IPv4/IPv6 address with port to a socket address
+ * @param address the address to convert
+ * @param port the port
+ * @return the corresponding socket address
+ */
+Address ConvertToSocketAddress(const Address& address, uint16_t port);
+
 }; // namespace addressUtils
 
 }; // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/bit-deserializer.h ns-3.44/src/network/utils/bit-deserializer.h
--- ns-3.43/src/network/utils/bit-deserializer.h	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/bit-deserializer.h	2025-03-09 16:55:49.675372100 -0700
@@ -17,9 +17,9 @@
 {
 
 /**
- * \ingroup packet
+ * @ingroup packet
  *
- * \brief Bit deserializer. See also \sa ns3::BitSerializer
+ * @brief Bit deserializer. See also \sa ns3::BitSerializer
  *
  * This class helps converting a variable number, variable sized
  * number of bit-boundary fields stored as byte array representation
@@ -36,20 +36,20 @@
 
     /**
      * Pushes some bytes into the blob to be deserialized.
-     * \param bytes The bytes to add.
+     * @param bytes The bytes to add.
      */
     void PushBytes(std::vector<uint8_t> bytes);
 
     /**
      * Pushes some bytes into the blob to be deserialized.
-     * \param bytes The bytes to add.
-     * \param size The length of the array.
+     * @param bytes The bytes to add.
+     * @param size The length of the array.
      */
     void PushBytes(uint8_t* bytes, uint32_t size);
 
     /**
      * Pushes one byte into the blob to be deserialized.
-     * \param byte The byte to add.
+     * @param byte The byte to add.
      */
     void PushByte(uint8_t byte);
 
@@ -60,8 +60,8 @@
      *
      * The maximum number of bits to be deserialized in one single call is 64.
      *
-     * \param size The number of bits to pop.
-     * \return The popped bits value
+     * @param size The number of bits to pop.
+     * @return The popped bits value
      */
     uint64_t GetBits(uint8_t size);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/bit-serializer.h ns-3.44/src/network/utils/bit-serializer.h
--- ns-3.43/src/network/utils/bit-serializer.h	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/bit-serializer.h	2025-03-09 16:55:49.675372100 -0700
@@ -16,15 +16,15 @@
 {
 
 /**
- * \ingroup packet
+ * @ingroup packet
  *
- * \brief Bit serializer. See also \sa ns3::BitDeserializer
+ * @brief Bit serializer. See also \sa ns3::BitDeserializer
  *
  * This class helps converting a variable number, variable sized
  * number of bit-boundary fields to its final byte array representation.
  *
  * The typical use-case is:
- * \verbatim
+ * @verbatim
    aaa: A field
    bbb: B field
    ccc: C field
@@ -52,14 +52,14 @@
 
     /**
      * Toggles the padding insertion policy.
-     * \param padAtEnd true if the padding have to be inserted at the end of the bit blob.
+     * @param padAtEnd true if the padding have to be inserted at the end of the bit blob.
      */
     void InsertPaddingAtEnd(bool padAtEnd);
 
     /**
      * Pushes a number of bits in the blob.
-     * \param value the bits to be inserted.
-     * \param significantBits Number of bits to insert.
+     * @param value the bits to be inserted.
+     * @param significantBits Number of bits to insert.
      */
     void PushBits(uint64_t value, uint8_t significantBits);
 
@@ -68,9 +68,9 @@
      * Note that this operation  \b automatically add the
      * needed padding at the end (or start) of the blob.
      *
-     * \warning {This operation clears the stored data.}
+     * @warning {This operation clears the stored data.}
      *
-     * \returns The byte representation of the blob.
+     * @returns The byte representation of the blob.
      */
     std::vector<uint8_t> GetBytes();
 
@@ -79,11 +79,11 @@
      * Note that this operation  \b automatically add the
      * needed padding at the end (or start) of the blob.
      *
-     * \warning {This operation clears the stored data.}
+     * @warning {This operation clears the stored data.}
      *
-     * \param [out] buffer The buffer where to store the return data.
-     * \param [in] size The size of the buffer.
-     * \returns The number of bytes actually used in the buffer.
+     * @param [out] buffer The buffer where to store the return data.
+     * @param [in] size The size of the buffer.
+     * @returns The number of bytes actually used in the buffer.
      */
     uint8_t GetBytes(uint8_t* buffer, uint32_t size);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/crc32.h ns-3.44/src/network/utils/crc32.h
--- ns-3.43/src/network/utils/crc32.h	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/crc32.h	2025-03-09 16:55:49.675372100 -0700
@@ -15,9 +15,9 @@
 /**
  * Calculates the CRC-32 for a given input
  *
- * \param data buffer to calculate the checksum for
- * \param length the length of the buffer (bytes)
- * \returns the computed crc-32.
+ * @param data buffer to calculate the checksum for
+ * @param length the length of the buffer (bytes)
+ * @returns the computed crc-32.
  *
  */
 uint32_t CRC32Calculate(const uint8_t* data, int length);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/data-rate.cc ns-3.44/src/network/utils/data-rate.cc
--- ns-3.43/src/network/utils/data-rate.cc	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/data-rate.cc	2025-03-09 16:55:49.675372100 -0700
@@ -24,7 +24,7 @@
 DataRate::DoParse(const std::string s, uint64_t* v)
 {
     NS_LOG_FUNCTION(s << v);
-    std::string::size_type n = s.find_first_not_of("0123456789.");
+    std::string::size_type n = s.find_first_not_of("0123456789. ");
     if (n != std::string::npos)
     { // Found non-numeric
         std::istringstream iss;
@@ -260,7 +260,7 @@
 operator>>(std::istream& is, DataRate& rate)
 {
     std::string value;
-    is >> value;
+    std::getline(is, value);
     uint64_t v;
     bool ok = DataRate::DoParse(value, &v);
     if (!ok)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/data-rate.h ns-3.44/src/network/utils/data-rate.h
--- ns-3.43/src/network/utils/data-rate.h	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/data-rate.h	2025-03-09 16:55:49.675372100 -0700
@@ -21,21 +21,21 @@
 {
 
 /**
- * \ingroup network
- * \defgroup datarate Data Rate
+ * @ingroup network
+ * @defgroup datarate Data Rate
  */
 /**
- * \ingroup datarate
- * \brief Class for representing data rates
+ * @ingroup datarate
+ * @brief Class for representing data rates
  *
  * Allows for natural and familiar use of data rates.  Allows construction
  * from strings, natural multiplication e.g.:
- * \code
+ * @code
  *   DataRate x("56kbps");
  *   double nBits = x*ns3::Seconds (19.2);
  *   uint32_t nBytes = 20;
  *   Time txtime = x.CalculateBytesTxTime (nBytes);
- * \endcode
+ * @endcode
  * This class also supports the regular comparison operators \c <, \c >,
  * \c <=, \c >=, \c ==, and \c !=
  *
@@ -72,23 +72,23 @@
  * * "8Kib/s" = 1 KiB/s = 8192 bits/s
  * * "1kB/s" = 8000 bits/s
  *
- * \see attribute_DataRate
+ * @see attribute_DataRate
  */
 class DataRate
 {
   public:
     DataRate();
     /**
-     * \brief Integer constructor
+     * @brief Integer constructor
      *
      * Construct a data rate from an integer.  This class only supports positive
      * integer data rates in units of bits/s, meaning 1bit/s is the smallest
      * non-trivial bitrate available.
-     * \param bps bit/s value
+     * @param bps bit/s value
      */
     DataRate(uint64_t bps);
     /**
-     * \brief String constructor
+     * @brief String constructor
      *
      * Construct a data rate from a string.  Many different unit strings are supported
      * Supported unit strings:
@@ -103,147 +103,147 @@
      * "8Kib/s" = 1 KiB/s = 8192 bits/s \n
      * "1kB/s" = 8000 bits/s
      *
-     * \param rate string representing the desired rate
+     * @param rate string representing the desired rate
      */
     DataRate(std::string rate);
 
     /**
-     * \return the DataRate representing the sum of this object with rhs
+     * @return the DataRate representing the sum of this object with rhs
      *
-     * \param rhs the DataRate to add to this DataRate
+     * @param rhs the DataRate to add to this DataRate
      */
     DataRate operator+(DataRate rhs) const;
 
     /**
-     * \return the DataRate representing the sum of this object with rhs
+     * @return the DataRate representing the sum of this object with rhs
      *
-     * \param rhs the DataRate to add to this DataRate
+     * @param rhs the DataRate to add to this DataRate
      */
     DataRate& operator+=(DataRate rhs);
 
     /**
-     * \return the DataRate representing the difference of this object with rhs
+     * @return the DataRate representing the difference of this object with rhs
      *
-     * \param rhs the DataRate to subtract from this DataRate
+     * @param rhs the DataRate to subtract from this DataRate
      */
     DataRate operator-(DataRate rhs) const;
 
     /**
-     * \return the DataRate representing the difference of this object with rhs
+     * @return the DataRate representing the difference of this object with rhs
      *
-     * \param rhs the DataRate to subtract from this DataRate
+     * @param rhs the DataRate to subtract from this DataRate
      */
     DataRate& operator-=(DataRate rhs);
 
     /**
-     * \brief Scales the DataRate
+     * @brief Scales the DataRate
      *
      * Multiplies with double and is re-casted to an int
      *
-     * \return DataRate object representing the product of this object with rhs
+     * @return DataRate object representing the product of this object with rhs
      *
-     * \param rhs the double to multiply to this datarate
+     * @param rhs the double to multiply to this datarate
      */
     DataRate operator*(double rhs) const;
 
     /**
-     * \brief Scales the DataRate
+     * @brief Scales the DataRate
      *
      * Multiplies with double and is re-casted to an int
      *
-     * \return DataRate object representing the product of this object with rhs
+     * @return DataRate object representing the product of this object with rhs
      *
-     * \param rhs the double to multiply to this datarate
+     * @param rhs the double to multiply to this datarate
      */
     DataRate& operator*=(double rhs);
 
     /**
-     * \brief Scales the DataRate
+     * @brief Scales the DataRate
      *
-     * \return DataRate object representing the product of this object with rhs
+     * @return DataRate object representing the product of this object with rhs
      *
-     * \param rhs the uint64_t to multiply to this datarate
+     * @param rhs the uint64_t to multiply to this datarate
      */
     DataRate operator*(uint64_t rhs) const;
 
     /**
-     * \brief Scales the DataRate
+     * @brief Scales the DataRate
      *
-     * \return DataRate object representing the product of this object with rhs
+     * @return DataRate object representing the product of this object with rhs
      *
-     * \param rhs the uint64_t to multiply to this datarate
+     * @param rhs the uint64_t to multiply to this datarate
      */
     DataRate& operator*=(uint64_t rhs);
 
     /**
-     * \return true if this rate is less than rhs
+     * @return true if this rate is less than rhs
      *
-     * \param rhs the datarate to compare to this datarate
+     * @param rhs the datarate to compare to this datarate
      */
     bool operator<(const DataRate& rhs) const;
 
     /**
-     * \return true if this rate is less than or equal to rhs
+     * @return true if this rate is less than or equal to rhs
      *
-     * \param rhs the datarate to compare to this datarate
+     * @param rhs the datarate to compare to this datarate
      */
     bool operator<=(const DataRate& rhs) const;
 
     /**
-     * \return true if this rate is greater than rhs
+     * @return true if this rate is greater than rhs
      *
-     * \param rhs the datarate to compare to this datarate
+     * @param rhs the datarate to compare to this datarate
      */
     bool operator>(const DataRate& rhs) const;
 
     /**
-     * \return true if this rate is greater than or equal to rhs
+     * @return true if this rate is greater than or equal to rhs
      *
-     * \param rhs the datarate to compare to this datarate
+     * @param rhs the datarate to compare to this datarate
      */
     bool operator>=(const DataRate& rhs) const;
 
     /**
-     * \return true if this rate is equal to rhs
+     * @return true if this rate is equal to rhs
      *
-     * \param rhs the datarate to compare to this datarate
+     * @param rhs the datarate to compare to this datarate
      */
     bool operator==(const DataRate& rhs) const;
 
     /**
-     * \return true if this rate is not equal to rhs
+     * @return true if this rate is not equal to rhs
      *
-     * \param rhs the datarate to compare to this datarate
+     * @param rhs the datarate to compare to this datarate
      */
     bool operator!=(const DataRate& rhs) const;
 
     /**
-     * \brief Calculate transmission time
+     * @brief Calculate transmission time
      *
      * Calculates the transmission time at this data rate
-     * \param bytes The number of bytes (not bits) for which to calculate
-     * \return The transmission time for the number of bytes specified
+     * @param bytes The number of bytes (not bits) for which to calculate
+     * @return The transmission time for the number of bytes specified
      */
     Time CalculateBytesTxTime(uint32_t bytes) const;
 
     /**
-     * \brief Calculate transmission time
+     * @brief Calculate transmission time
      *
      * Calculates the transmission time at this data rate
-     * \param bits The number of bits (not bytes) for which to calculate
-     * \return The transmission time for the number of bits specified
+     * @param bits The number of bits (not bytes) for which to calculate
+     * @return The transmission time for the number of bits specified
      */
     Time CalculateBitsTxTime(uint32_t bits) const;
 
     /**
      * Get the underlying bitrate
-     * \return The underlying bitrate in bits per second
+     * @return The underlying bitrate in bits per second
      */
     uint64_t GetBitRate() const;
 
   private:
     /**
-     * \brief Parse a string representing a DataRate into an uint64_t
+     * @brief Parse a string representing a DataRate into an uint64_t
      *
      * Allowed unit representations include all combinations of
      *
@@ -252,9 +252,9 @@
      * * Bits or bytes (8 bits)
      * * "bps" or "/s"
      *
-     * \param [in] s The string representation, including unit
-     * \param [in,out] v The location to put the value, in bits/sec.
-     * \return true if parsing was successful.
+     * @param [in] s The string representation, including unit
+     * @param [in,out] v The location to put the value, in bits/sec.
+     * @return true if parsing was successful.
      */
     static bool DoParse(const std::string s, uint64_t* v);
 
@@ -265,41 +265,41 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the stream
- * \param rate the data rate
- * \returns a reference to the stream
+ * @param os the stream
+ * @param rate the data rate
+ * @returns a reference to the stream
  */
 std::ostream& operator<<(std::ostream& os, const DataRate& rate);
 
 /**
- * \brief Stream extraction operator.
+ * @brief Stream extraction operator.
  *
- * \param is the stream
- * \param rate the data rate
- * \returns a reference to the stream
+ * @param is the stream
+ * @param rate the data rate
+ * @returns a reference to the stream
  */
 std::istream& operator>>(std::istream& is, DataRate& rate);
 
 ATTRIBUTE_HELPER_HEADER(DataRate);
 
 /**
- * \brief Multiply datarate by a time value
+ * @brief Multiply datarate by a time value
  *
  * Calculates the number of bits that have been transmitted over a period of time
- * \param lhs rate
- * \param rhs time
- * \return the number of bits over the period of time
+ * @param lhs rate
+ * @param rhs time
+ * @return the number of bits over the period of time
  */
 double operator*(const DataRate& lhs, const Time& rhs);
 /**
- * \brief Multiply time value by a data rate
+ * @brief Multiply time value by a data rate
  *
  * Calculates the number of bits that have been transmitted over a period of time
- * \param lhs time
- * \param rhs rate
- * \return the number of bits over the period of time
+ * @param lhs time
+ * @param rhs rate
+ * @return the number of bits over the period of time
  */
 double operator*(const Time& lhs, const DataRate& rhs);
 
@@ -307,11 +307,11 @@
 {
 
 /**
- * \ingroup network
+ * @ingroup network
  * TracedValue callback signature for DataRate
  *
- * \param [in] oldValue original value of the traced variable
- * \param [in] newValue new value of the traced variable
+ * @param [in] oldValue original value of the traced variable
+ * @param [in] newValue new value of the traced variable
  */
 typedef void (*DataRate)(DataRate oldValue, DataRate newValue);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/drop-tail-queue.h ns-3.44/src/network/utils/drop-tail-queue.h
--- ns-3.43/src/network/utils/drop-tail-queue.h	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/drop-tail-queue.h	2025-03-09 16:55:49.675372100 -0700
@@ -13,21 +13,21 @@
 {
 
 /**
- * \ingroup queue
+ * @ingroup queue
  *
- * \brief A FIFO packet queue that drops tail-end packets on overflow
+ * @brief A FIFO packet queue that drops tail-end packets on overflow
  */
 template <typename Item>
 class DropTailQueue : public Queue<Item>
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     /**
-     * \brief DropTailQueue Constructor
+     * @brief DropTailQueue Constructor
      *
      * Creates a droptail queue with a maximum size of 100 packets by default
      */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/dynamic-queue-limits.h ns-3.44/src/network/utils/dynamic-queue-limits.h
--- ns-3.43/src/network/utils/dynamic-queue-limits.h	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/dynamic-queue-limits.h	2025-03-09 16:55:49.675372100 -0700
@@ -25,7 +25,7 @@
 {
 
 /**
- * \ingroup network
+ * @ingroup network
  *
  * DynamicQueueLimits would be used in conjunction with a producer/consumer
  * type queue (possibly a netdevice queue).
@@ -55,8 +55,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -72,9 +72,9 @@
     /**
      * Calculates the difference between the two operators and
      * returns the number if positive, zero otherwise.
-     * \param a First operator.
-     * \param b Second operator.
-     * \returns the difference between a and b if positive, zero otherwise.
+     * @param a First operator.
+     * @param b Second operator.
+     * @returns the difference between a and b if positive, zero otherwise.
      */
     int32_t Posdiff(int32_t a, int32_t b);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/error-channel.h ns-3.44/src/network/utils/error-channel.h
--- ns-3.43/src/network/utils/error-channel.h	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/error-channel.h	2025-03-09 16:55:49.675372100 -0700
@@ -24,15 +24,15 @@
 class Packet;
 
 /**
- * \ingroup channel
- * \brief A Error channel, introducing deterministic delays on even/odd packets. Used for testing
+ * @ingroup channel
+ * @brief A Error channel, introducing deterministic delays on even/odd packets. Used for testing
  */
 class ErrorChannel : public SimpleChannel
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     ErrorChannel();
@@ -51,26 +51,26 @@
     Ptr<NetDevice> GetDevice(std::size_t i) const override;
 
     /**
-     * \brief Set the delay for the odd packets (even ones are not delayed)
-     * \param delay Delay for the odd packets.
+     * @brief Set the delay for the odd packets (even ones are not delayed)
+     * @param delay Delay for the odd packets.
      */
     void SetJumpingTime(Time delay);
 
     /**
-     * \brief Set if the odd packets are delayed (even ones are not delayed ever)
-     * \param mode true if the odd packets should be delayed.
+     * @brief Set if the odd packets are delayed (even ones are not delayed ever)
+     * @param mode true if the odd packets should be delayed.
      */
     void SetJumpingMode(bool mode);
 
     /**
-     * \brief Set the delay for the odd duplicate packets (even ones are not duplicated)
-     * \param delay Delay for the odd packets.
+     * @brief Set the delay for the odd duplicate packets (even ones are not duplicated)
+     * @param delay Delay for the odd packets.
      */
     void SetDuplicateTime(Time delay);
 
     /**
-     * \brief Set if the odd packets are duplicated (even ones are not duplicated ever)
-     * \param mode true if the odd packets should be duplicated.
+     * @brief Set if the odd packets are duplicated (even ones are not duplicated ever)
+     * @param mode true if the odd packets should be duplicated.
      */
     void SetDuplicateMode(bool mode);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/error-model.h ns-3.44/src/network/utils/error-model.h
--- ns-3.43/src/network/utils/error-model.h	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/error-model.h	2025-03-09 16:55:49.675372100 -0700
@@ -62,12 +62,12 @@
 class Packet;
 
 /**
- * \ingroup network
- * \defgroup errormodel Error Model
+ * @ingroup network
+ * @defgroup errormodel Error Model
  */
 /**
- * \ingroup errormodel
- * \brief General error model that can be used to corrupt packets
+ * @ingroup errormodel
+ * @brief General error model that can be used to corrupt packets
  *
  * This object is used to flag packets as being lost/errored or not.
  * It is part of the Object framework and can be aggregated to
@@ -84,7 +84,7 @@
  *
  * Typical code (simplified) to use an ErrorModel may look something like
  * this:
- * \code
+ * @code
  * Ptr<ErrorModel> rem = CreateObject<RateErrorModel> ();
  * Ptr<UniformRandomVariable> uv = CreateObject<UniformRandomVariable> ();
  * rem->SetRandomVariable (uv);
@@ -97,7 +97,7 @@
  *   } else {
  *     Forward (p);
  *   }
- * \endcode
+ * @endcode
  *
  * Four practical error models, a RateErrorModel, a BurstErrorModel,
  * a ListErrorModel, and a ReceiveListErrorModel, are currently implemented.
@@ -106,8 +106,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -118,8 +118,8 @@
      * Note:  Depending on the error model, this function may or may not
      * alter the contents of the packet upon returning true.
      *
-     * \returns true if the Packet is to be considered as errored/corrupted
-     * \param pkt Packet to apply error model to
+     * @returns true if the Packet is to be considered as errored/corrupted
+     * @param pkt Packet to apply error model to
      */
     bool IsCorrupt(Ptr<Packet> pkt);
     /**
@@ -135,15 +135,15 @@
      */
     void Disable();
     /**
-     * \return true if error model is enabled; false otherwise
+     * @return true if error model is enabled; false otherwise
      */
     bool IsEnabled() const;
 
   private:
     /**
      * Corrupt a packet according to the specified model.
-     * \param p the packet to corrupt
-     * \returns true if the packet is corrupted
+     * @param p the packet to corrupt
+     * @returns true if the packet is corrupted
      */
     virtual bool DoCorrupt(Ptr<Packet> p) = 0;
     /**
@@ -155,7 +155,7 @@
 };
 
 /**
- * \brief Determine which packets are errored corresponding to an underlying
+ * @brief Determine which packets are errored corresponding to an underlying
  * distribution, rate, and unit.
  *
  * This object is used to flag packets as being lost/errored or not.
@@ -173,8 +173,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -192,25 +192,25 @@
     };
 
     /**
-     * \returns the ErrorUnit being used by the underlying model
+     * @returns the ErrorUnit being used by the underlying model
      */
     RateErrorModel::ErrorUnit GetUnit() const;
     /**
-     * \param error_unit the ErrorUnit to be used by the underlying model
+     * @param error_unit the ErrorUnit to be used by the underlying model
      */
     void SetUnit(ErrorUnit error_unit);
 
     /**
-     * \returns the error rate being applied by the model
+     * @returns the error rate being applied by the model
      */
     double GetRate() const;
     /**
-     * \param rate the error rate to be used by the model
+     * @param rate the error rate to be used by the model
      */
     void SetRate(double rate);
 
     /**
-     * \param ranvar A random variable distribution to generate random variates
+     * @param ranvar A random variable distribution to generate random variates
      */
     void SetRandomVariable(Ptr<RandomVariableStream>);
 
@@ -219,8 +219,8 @@
      * used by this model.  Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream);
 
@@ -228,20 +228,20 @@
     bool DoCorrupt(Ptr<Packet> p) override;
     /**
      * Corrupt a packet (packet unit).
-     * \param p the packet to corrupt
-     * \returns true if the packet is corrupted
+     * @param p the packet to corrupt
+     * @returns true if the packet is corrupted
      */
     virtual bool DoCorruptPkt(Ptr<Packet> p);
     /**
      * Corrupt a packet (Byte unit).
-     * \param p the packet to corrupt
-     * \returns true if the packet is corrupted
+     * @param p the packet to corrupt
+     * @returns true if the packet is corrupted
      */
     virtual bool DoCorruptByte(Ptr<Packet> p);
     /**
      * Corrupt a packet (bit unit).
-     * \param p the packet to corrupt
-     * \returns true if the packet is corrupted
+     * @param p the packet to corrupt
+     * @returns true if the packet is corrupted
      */
     virtual bool DoCorruptBit(Ptr<Packet> p);
     void DoReset() override;
@@ -253,7 +253,7 @@
 };
 
 /**
- * \brief Determine which bursts of packets are errored corresponding to
+ * @brief Determine which bursts of packets are errored corresponding to
  * an underlying distribution, burst rate, and burst size.
  *
  * This object is used to flag packets as being lost/errored or not.
@@ -288,8 +288,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -297,21 +297,21 @@
     ~BurstErrorModel() override;
 
     /**
-     * \returns the error rate being applied by the model
+     * @returns the error rate being applied by the model
      */
     double GetBurstRate() const;
     /**
-     * \param rate the error rate to be used by the model
+     * @param rate the error rate to be used by the model
      */
     void SetBurstRate(double rate);
 
     /**
-     * \param ranVar A random variable distribution to generate random variates
+     * @param ranVar A random variable distribution to generate random variates
      */
     void SetRandomVariable(Ptr<RandomVariableStream> ranVar);
 
     /**
-     * \param burstSz A random variable distribution to generate random burst size
+     * @param burstSz A random variable distribution to generate random burst size
      */
     void SetRandomBurstSize(Ptr<RandomVariableStream> burstSz);
 
@@ -320,8 +320,8 @@
      * used by this model.  Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream);
 
@@ -342,7 +342,7 @@
 };
 
 /**
- * \brief Provide a list of Packet uids to corrupt
+ * @brief Provide a list of Packet uids to corrupt
  *
  * This object is used to flag packets as being lost/errored or not.
  * A note on performance:  the list is assumed to be unordered, and
@@ -367,19 +367,19 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     ListErrorModel();
     ~ListErrorModel() override;
 
     /**
-     * \return a copy of the underlying list
+     * @return a copy of the underlying list
      */
     std::list<uint64_t> GetList() const;
     /**
-     * \param packetlist The list of packet uids to error.
+     * @param packetlist The list of packet uids to error.
      *
      * This method overwrites any previously provided list.
      */
@@ -398,7 +398,7 @@
 };
 
 /**
- * \brief Provide a list of Packets to corrupt
+ * @brief Provide a list of Packets to corrupt
  *
  * This model also processes a user-generated list of packets to
  * corrupt, except that the list corresponds to the sequence of
@@ -413,19 +413,19 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     ReceiveListErrorModel();
     ~ReceiveListErrorModel() override;
 
     /**
-     * \return a copy of the underlying list
+     * @return a copy of the underlying list
      */
     std::list<uint32_t> GetList() const;
     /**
-     * \param packetlist The list of packets to error.
+     * @param packetlist The list of packets to error.
      *
      * This method overwrites any previously provided list.
      */
@@ -445,14 +445,14 @@
 };
 
 /**
- * \brief The simplest error model, corrupts even packets and does not corrupt odd ones.
+ * @brief The simplest error model, corrupts even packets and does not corrupt odd ones.
  */
 class BinaryErrorModel : public ErrorModel
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/ethernet-header.h ns-3.44/src/network/utils/ethernet-header.h
--- ns-3.43/src/network/utils/ethernet-header.h	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/ethernet-header.h	2025-03-09 16:55:49.675372100 -0700
@@ -19,7 +19,7 @@
 {
 
 /**
- * \ingroup network
+ * @ingroup network
  *
  * Types of ethernet packets. Indicates the type of the current
  * header.
@@ -33,9 +33,9 @@
 };
 
 /**
- * \ingroup network
+ * @ingroup network
  *
- * \brief Packet header for Ethernet
+ * @brief Packet header for Ethernet
  *
  * This class can be used to add a header to an ethernet packet that
  * will specify the source and destination addresses and the length of
@@ -46,60 +46,60 @@
 {
   public:
     /**
-     * \brief Construct a null ethernet header
-     * \param hasPreamble if true, insert and remove an ethernet preamble from the
+     * @brief Construct a null ethernet header
+     * @param hasPreamble if true, insert and remove an ethernet preamble from the
      *       packet, if false, does not insert and remove it.
      */
     EthernetHeader(bool hasPreamble);
     /**
-     * \brief Construct a null ethernet header
+     * @brief Construct a null ethernet header
      * By default, does not add or remove an ethernet preamble
      */
     EthernetHeader();
     /**
-     * \param size The size of the payload in bytes
+     * @param size The size of the payload in bytes
      */
     void SetLengthType(uint16_t size);
     /**
-     * \param source The source address of this packet
+     * @param source The source address of this packet
      */
     void SetSource(Mac48Address source);
     /**
-     * \param destination The destination address of this packet.
+     * @param destination The destination address of this packet.
      */
     void SetDestination(Mac48Address destination);
     /**
-     * \param preambleSfd The value that the preambleSfd field should take
+     * @param preambleSfd The value that the preambleSfd field should take
      */
     void SetPreambleSfd(uint64_t preambleSfd);
     /**
-     * \return The size of the payload in bytes
+     * @return The size of the payload in bytes
      */
     uint16_t GetLengthType() const;
     /**
-     * \return The type of packet (only basic Ethernet is currently supported)
+     * @return The type of packet (only basic Ethernet is currently supported)
      */
     ethernet_header_t GetPacketType() const;
     /**
-     * \return The source address of this packet
+     * @return The source address of this packet
      */
     Mac48Address GetSource() const;
     /**
-     * \return The destination address of this packet
+     * @return The destination address of this packet
      */
     Mac48Address GetDestination() const;
     /**
-     * \return The value of the PreambleSfd field
+     * @return The value of the PreambleSfd field
      */
     uint64_t GetPreambleSfd() const;
     /**
-     * \return The size of the header
+     * @return The size of the header
      */
     uint32_t GetHeaderSize() const;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/ethernet-trailer.h ns-3.44/src/network/utils/ethernet-trailer.h
--- ns-3.43/src/network/utils/ethernet-trailer.h	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/ethernet-trailer.h	2025-03-09 16:55:49.675372100 -0700
@@ -18,9 +18,9 @@
 {
 
 /**
- * \ingroup network
+ * @ingroup network
  *
- * \brief Packet trailer for Ethernet
+ * @brief Packet trailer for Ethernet
  *
  * This class can be used to add and verify the FCS at the end of an
  * Ethernet packet.
@@ -29,32 +29,32 @@
 {
   public:
     /**
-     * \brief Construct a null ethernet trailer
+     * @brief Construct a null ethernet trailer
      */
     EthernetTrailer();
 
     /**
-     * \brief Enable or disable FCS checking and calculations
-     * \param enable If true, enables FCS calculations.
+     * @brief Enable or disable FCS checking and calculations
+     * @param enable If true, enables FCS calculations.
      */
     void EnableFcs(bool enable);
 
     /**
-     * \brief Updates the Fcs Field to the correct FCS
-     * \param p Reference to a packet on which the FCS should be
+     * @brief Updates the Fcs Field to the correct FCS
+     * @param p Reference to a packet on which the FCS should be
      * calculated. The packet should not currently contain an
      * EthernetTrailer.
      */
     void CalcFcs(Ptr<const Packet> p);
 
     /**
-     * \brief Sets the FCS to a new value
-     * \param fcs New FCS value
+     * @brief Sets the FCS to a new value
+     * @param fcs New FCS value
      */
     void SetFcs(uint32_t fcs);
 
     /**
-     * \return the FCS contained in this trailer
+     * @return the FCS contained in this trailer
      */
     uint32_t GetFcs() const;
 
@@ -66,22 +66,22 @@
      * If FCS checking is disabled, this method will always
      * return true.
      *
-     * \param p Reference to the packet on which the FCS should be
+     * @param p Reference to the packet on which the FCS should be
      * calculated. The packet should not contain an EthernetTrailer.
      *
-     * \return Returns true if the Packet FCS matches the FCS in the trailer,
+     * @return Returns true if the Packet FCS matches the FCS in the trailer,
      * false otherwise.
      */
     bool CheckFcs(Ptr<const Packet> p) const;
 
     /**
-     * \return Returns the size of the trailer
+     * @return Returns the size of the trailer
      */
     uint32_t GetTrailerSize() const;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/flow-id-tag.h ns-3.44/src/network/utils/flow-id-tag.h
--- ns-3.43/src/network/utils/flow-id-tag.h	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/flow-id-tag.h	2025-03-09 16:55:49.675372100 -0700
@@ -17,8 +17,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -31,22 +31,22 @@
     /**
      * Constructs a FlowIdTag with the given flow id
      *
-     * \param flowId Id to use for the tag
+     * @param flowId Id to use for the tag
      */
     FlowIdTag(uint32_t flowId);
     /**
      * Sets the flow id for the tag
-     * \param flowId Id to assign to the tag
+     * @param flowId Id to assign to the tag
      */
     void SetFlowId(uint32_t flowId);
     /**
      * Gets the flow id for the tag
-     * \returns current flow id for this tag
+     * @returns current flow id for this tag
      */
     uint32_t GetFlowId() const;
     /**
      * Uses a static variable to generate sequential flow id
-     * \returns flow id allocated
+     * @returns flow id allocated
      */
     static uint32_t AllocateFlowId();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/generic-phy.h ns-3.44/src/network/utils/generic-phy.h
--- ns-3.43/src/network/utils/generic-phy.h	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/generic-phy.h	2025-03-09 16:55:49.675372100 -0700
@@ -9,7 +9,7 @@
 #ifndef GENERIC_PHY_H
 #define GENERIC_PHY_H
 
-#include <ns3/callback.h>
+#include "ns3/callback.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/inet6-socket-address.h ns-3.44/src/network/utils/inet6-socket-address.h
--- ns-3.43/src/network/utils/inet6-socket-address.h	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/inet6-socket-address.h	2025-03-09 16:55:49.675372100 -0700
@@ -19,109 +19,109 @@
 {
 
 /**
- * \ingroup address
- * \class Inet6SocketAddress
- * \brief An Inet6 address class.
+ * @ingroup address
+ * @class Inet6SocketAddress
+ * @brief An Inet6 address class.
  */
 class Inet6SocketAddress
 {
   public:
     /**
-     * \brief Constructor.
-     * \param ipv6 the IPv6 address
-     * \param port the port
+     * @brief Constructor.
+     * @param ipv6 the IPv6 address
+     * @param port the port
      */
     Inet6SocketAddress(Ipv6Address ipv6, uint16_t port);
 
     /**
-     * \brief Constructor (the port is set to zero).
-     * \param ipv6 the IPv6 address
+     * @brief Constructor (the port is set to zero).
+     * @param ipv6 the IPv6 address
      */
     Inet6SocketAddress(Ipv6Address ipv6);
 
     /**
-     * \brief Constructor (the address is set to "any").
-     * \param port the port
+     * @brief Constructor (the address is set to "any").
+     * @param port the port
      */
     Inet6SocketAddress(uint16_t port);
 
     /**
-     * \brief Constructor.
-     * \param ipv6 string which represents an IPv6 address
-     * \param port the port
+     * @brief Constructor.
+     * @param ipv6 string which represents an IPv6 address
+     * @param port the port
      */
     Inet6SocketAddress(const char* ipv6, uint16_t port);
 
     /**
-     * \brief Constructor.
-     * \param ipv6 string which represents an IPv6 address
+     * @brief Constructor.
+     * @param ipv6 string which represents an IPv6 address
      */
     Inet6SocketAddress(const char* ipv6);
 
     /**
-     * \brief Get the port.
-     * \return the port
+     * @brief Get the port.
+     * @return the port
      */
     uint16_t GetPort() const;
 
     /**
-     * \brief Set the port
-     * \param port the port
+     * @brief Set the port
+     * @param port the port
      */
     void SetPort(uint16_t port);
 
     /**
-     * \brief Get the IPv6 address.
-     * \return the IPv6 address
+     * @brief Get the IPv6 address.
+     * @return the IPv6 address
      */
     Ipv6Address GetIpv6() const;
 
     /**
-     * \brief Set the IPv6 address.
-     * \param ipv6 the address
+     * @brief Set the IPv6 address.
+     * @param ipv6 the address
      */
     void SetIpv6(Ipv6Address ipv6);
 
     /**
-     * \brief If the address match.
-     * \param addr the address to test
-     * \return true if the address match, false otherwise
+     * @brief If the address match.
+     * @param addr the address to test
+     * @return true if the address match, false otherwise
      */
     static bool IsMatchingType(const Address& addr);
 
     /**
-     * \brief Get an Address instance which represents this
+     * @brief Get an Address instance which represents this
      * Inet6SocketAddress instance.
      */
     operator Address() const;
 
     /**
-     * \brief Convert the address to a InetSocketAddress.
-     * \param addr the address to convert
-     * \return an Inet6SocketAddress instance corresponding to address
+     * @brief Convert the address to a InetSocketAddress.
+     * @param addr the address to convert
+     * @return an Inet6SocketAddress instance corresponding to address
      */
     static Inet6SocketAddress ConvertFrom(const Address& addr);
 
     /**
-     * \brief Convert to Address.
-     * \return Address instance
+     * @brief Convert to Address.
+     * @return Address instance
      */
     Address ConvertTo() const;
 
   private:
     /**
-     * \brief Get the type.
-     * \return the type of Inet6SocketAddress
+     * @brief Get the type.
+     * @return the type of Inet6SocketAddress
      */
     static uint8_t GetType();
 
     /**
-     * \brief The IPv6 address.
+     * @brief The IPv6 address.
      */
     Ipv6Address m_ipv6;
 
     /**
-     * \brief The port.
+     * @brief The port.
      */
     uint16_t m_port;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/inet-socket-address.h ns-3.44/src/network/utils/inet-socket-address.h
--- ns-3.43/src/network/utils/inet-socket-address.h	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/inet-socket-address.h	2025-03-09 16:55:49.675372100 -0700
@@ -19,9 +19,9 @@
 {
 
 /**
- * \ingroup address
+ * @ingroup address
  *
- * \brief an Inet address class
+ * @brief an Inet address class
  *
  * This class is similar to inet_sockaddr in the BSD socket
  * API. i.e., this class holds an Ipv4Address and a port number
@@ -31,83 +31,83 @@
 {
   public:
     /**
-     * \param ipv4 the ipv4 address
-     * \param port the port number
+     * @param ipv4 the ipv4 address
+     * @param port the port number
      */
     InetSocketAddress(Ipv4Address ipv4, uint16_t port);
     /**
-     * \param ipv4 the ipv4 address
+     * @param ipv4 the ipv4 address
      *
      * The port number is set to zero by default.
      */
     InetSocketAddress(Ipv4Address ipv4);
     /**
-     * \param port the port number
+     * @param port the port number
      *
      * The ipv4 address is set to the "Any" address by default.
      */
     InetSocketAddress(uint16_t port);
     /**
-     * \param ipv4 string which represents an ipv4 address
-     * \param port the port number
+     * @param ipv4 string which represents an ipv4 address
+     * @param port the port number
      */
     InetSocketAddress(const char* ipv4, uint16_t port);
     /**
-     * \param ipv4 string which represents an ipv4 address
+     * @param ipv4 string which represents an ipv4 address
      *
      * The port number is set to zero.
      */
     InetSocketAddress(const char* ipv4);
     /**
-     * \returns the port number
+     * @returns the port number
      */
     uint16_t GetPort() const;
     /**
-     * \returns the ipv4 address
+     * @returns the ipv4 address
      */
     Ipv4Address GetIpv4() const;
 
     /**
-     * \param port the new port number.
+     * @param port the new port number.
      */
     void SetPort(uint16_t port);
     /**
-     * \param address the new ipv4 address
+     * @param address the new ipv4 address
      */
     void SetIpv4(Ipv4Address address);
 
     /**
-     * \param address address to test
-     * \returns true if the address matches, false otherwise.
+     * @param address address to test
+     * @returns true if the address matches, false otherwise.
      */
     static bool IsMatchingType(const Address& address);
 
     /**
-     * \returns an Address instance which represents this
+     * @returns an Address instance which represents this
      * InetSocketAddress instance.
      */
     operator Address() const;
 
     /**
-     * \brief Returns an InetSocketAddress which corresponds to the input
+     * @brief Returns an InetSocketAddress which corresponds to the input
      * Address.
      *
-     * \param address the Address instance to convert from.
-     * \returns an InetSocketAddress
+     * @param address the Address instance to convert from.
+     * @returns an InetSocketAddress
      */
     static InetSocketAddress ConvertFrom(const Address& address);
 
     /**
-     * \brief Convert to an Address type
-     * \return the Address corresponding to this object.
+     * @brief Convert to an Address type
+     * @return the Address corresponding to this object.
      */
     Address ConvertTo() const;
 
   private:
     /**
-     * \brief Get the underlying address type (automatically assigned).
+     * @brief Get the underlying address type (automatically assigned).
      *
-     * \returns the address type
+     * @returns the address type
      */
     static uint8_t GetType();
     Ipv4Address m_ipv4; //!< the IPv4 address
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/ipv4-address.h ns-3.44/src/network/utils/ipv4-address.h
--- ns-3.43/src/network/utils/ipv4-address.h	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/ipv4-address.h	2025-03-09 16:55:49.679372300 -0700
@@ -21,11 +21,11 @@
 class Ipv4Mask;
 
 /**
- * \ingroup address
+ * @ingroup address
  *
- * \brief Ipv4 addresses are stored in host order in this class.
+ * @brief Ipv4 addresses are stored in host order in this class.
  *
- * \see attribute_Ipv4Address
+ * @see attribute_Ipv4Address
  */
 class Ipv4Address
 {
@@ -33,137 +33,137 @@
     Ipv4Address();
     /**
      * input address is in host order.
-     * \param address The host order 32-bit address
+     * @param address The host order 32-bit address
      */
     explicit Ipv4Address(uint32_t address);
     /**
-     * \brief Constructs an Ipv4Address by parsing a the input C-string
+     * @brief Constructs an Ipv4Address by parsing a the input C-string
      *
      * Input address is in format:
      * \c hhh.xxx.xxx.lll
      * where \c h is the high byte and \c l the
      * low byte
-     * \param address C-string containing the address as described above
+     * @param address C-string containing the address as described above
      */
     Ipv4Address(const char* address);
     /**
      * Get the host-order 32-bit IP address
-     * \return the host-order 32-bit IP address
+     * @return the host-order 32-bit IP address
      */
     uint32_t Get() const;
     /**
      * input address is in host order.
-     * \param address The host order 32-bit address
+     * @param address The host order 32-bit address
      */
     void Set(uint32_t address);
     /**
-     * \brief Sets an Ipv4Address by parsing a the input C-string
+     * @brief Sets an Ipv4Address by parsing a the input C-string
      *
      * Input address is in format:
      * \c hhh.xxx.xxx.lll
      * where \c h is the high byte and \c l the
      * low byte
-     * \param address C-string containing the address as described above
+     * @param address C-string containing the address as described above
      */
     void Set(const char* address);
     /**
      * Serialize this address to a 4-byte buffer
      *
-     * \param buf output buffer to which this address gets overwritten with this
+     * @param buf output buffer to which this address gets overwritten with this
      * Ipv4Address
      */
     void Serialize(uint8_t buf[4]) const;
     /**
-     * \param buf buffer to read address from
-     * \return an Ipv4Address
+     * @param buf buffer to read address from
+     * @return an Ipv4Address
      *
      * The input address is expected to be in network byte order format.
      */
     static Ipv4Address Deserialize(const uint8_t buf[4]);
     /**
-     * \brief Print this address to the given output stream
+     * @brief Print this address to the given output stream
      *
      * The print format is in the typical "192.168.1.1"
-     * \param os The output stream to which this Ipv4Address is printed
+     * @param os The output stream to which this Ipv4Address is printed
      */
     void Print(std::ostream& os) const;
 
     /**
-     * \return true if address is initialized (i.e., set to something), false otherwise
+     * @return true if address is initialized (i.e., set to something), false otherwise
      */
     bool IsInitialized() const;
     /**
-     * \return true if address is 0.0.0.0; false otherwise
+     * @return true if address is 0.0.0.0; false otherwise
      */
     bool IsAny() const;
     /**
-     * \return true if address is 127.0.0.1; false otherwise
+     * @return true if address is 127.0.0.1; false otherwise
      */
     bool IsLocalhost() const;
     /**
-     * \return true if address is 255.255.255.255; false otherwise
+     * @return true if address is 255.255.255.255; false otherwise
      */
     bool IsBroadcast() const;
     /**
-     * \return true only if address is in the range 224.0.0.0 - 239.255.255.255
+     * @return true only if address is in the range 224.0.0.0 - 239.255.255.255
      */
     bool IsMulticast() const;
     /**
-     * \return true only if address is in local multicast address scope, 224.0.0.0/24
+     * @return true only if address is in local multicast address scope, 224.0.0.0/24
      */
     bool IsLocalMulticast() const;
     /**
-     * \brief Combine this address with a network mask
+     * @brief Combine this address with a network mask
      *
      * This method returns an IPv4 address that is this address combined
      * (bitwise and) with a network mask, yielding an IPv4 network
      * address.
      *
-     * \param mask a network mask
-     * \returns the address combined with the mask
+     * @param mask a network mask
+     * @returns the address combined with the mask
      */
     Ipv4Address CombineMask(const Ipv4Mask& mask) const;
     /**
-     * \brief Generate subnet-directed broadcast address corresponding to mask
+     * @brief Generate subnet-directed broadcast address corresponding to mask
      *
      * The subnet-directed broadcast address has the host bits set to all
      * ones.  If this method is called with a mask of 255.255.255.255,
      * (i.e., the address is a /32 address), the program will assert, since
      * there is no subnet associated with a /32 address.
      *
-     * \param mask a network mask
-     * \returns a broadcast address for the subnet.
+     * @param mask a network mask
+     * @returns a broadcast address for the subnet.
      */
     Ipv4Address GetSubnetDirectedBroadcast(const Ipv4Mask& mask) const;
     /**
-     * \brief Generate subnet-directed broadcast address corresponding to mask
+     * @brief Generate subnet-directed broadcast address corresponding to mask
      *
      * The subnet-directed broadcast address has the host bits set to all
      * ones.  If this method is called with a mask of 255.255.255.255,
      * (i.e., the address is a /32 address), the program will assert, since
      * there is no subnet associated with a /32 address.
      *
-     * \param mask a network mask
-     * \return true if the address, when combined with the input mask, has all
+     * @param mask a network mask
+     * @return true if the address, when combined with the input mask, has all
      * of its host bits set to one
      */
     bool IsSubnetDirectedBroadcast(const Ipv4Mask& mask) const;
     /**
-     * \param address an address to compare type with
+     * @param address an address to compare type with
      *
-     * \return true if the type of the address stored internally
+     * @return true if the type of the address stored internally
      * is compatible with the type of the input address, false otherwise.
      */
     static bool IsMatchingType(const Address& address);
     /**
      * Convert an instance of this class to a polymorphic Address instance.
      *
-     * \return a new Address instance
+     * @return a new Address instance
      */
     operator Address() const;
     /**
-     * \param address a polymorphic address
-     * \return a new Ipv4Address from the polymorphic address
+     * @param address a polymorphic address
+     * @return a new Ipv4Address from the polymorphic address
      *
      * This function performs a type check and asserts if the
      * type of the input address is not compatible with an
@@ -171,76 +171,76 @@
      */
     static Ipv4Address ConvertFrom(const Address& address);
     /**
-     * \brief Convert to an Address type
-     * \return the Address corresponding to this object.
+     * @brief Convert to an Address type
+     * @return the Address corresponding to this object.
      */
     Address ConvertTo() const;
 
     /**
-     * \return the 0.0.0.0 address
+     * @return the 0.0.0.0 address
      */
     static Ipv4Address GetZero();
     /**
-     * \return the 0.0.0.0 address
+     * @return the 0.0.0.0 address
      */
     static Ipv4Address GetAny();
     /**
-     * \return the 255.255.255.255 address
+     * @return the 255.255.255.255 address
      */
     static Ipv4Address GetBroadcast();
     /**
-     * \return the 127.0.0.1 address
+     * @return the 127.0.0.1 address
      */
     static Ipv4Address GetLoopback();
 
   private:
     /**
-     * \brief Get the underlying address type (automatically assigned).
+     * @brief Get the underlying address type (automatically assigned).
      *
-     * \returns the address type
+     * @returns the address type
      */
     static uint8_t GetType();
     uint32_t m_address; //!< IPv4 address
     bool m_initialized; //!< IPv4 address has been explicitly initialized to a valid value.
 
     /**
-     * \brief Equal to operator.
+     * @brief Equal to operator.
      *
-     * \param a the first operand.
-     * \param b the first operand.
-     * \returns true if the operands are equal.
+     * @param a the first operand.
+     * @param b the first operand.
+     * @returns true if the operands are equal.
      */
     friend bool operator==(const Ipv4Address& a, const Ipv4Address& b);
 
     /**
-     * \brief Not equal to operator.
+     * @brief Not equal to operator.
      *
-     * \param a the first operand.
-     * \param b the first operand.
-     * \returns true if the operands are not equal.
+     * @param a the first operand.
+     * @param b the first operand.
+     * @returns true if the operands are not equal.
      */
     friend bool operator!=(const Ipv4Address& a, const Ipv4Address& b);
 
     /**
-     * \brief Less than to operator.
+     * @brief Less than to operator.
      *
-     * \param a the first operand.
-     * \param b the first operand.
-     * \returns true if the first operand is less than the second.
+     * @param a the first operand.
+     * @param b the first operand.
+     * @returns true if the first operand is less than the second.
      */
     friend bool operator<(const Ipv4Address& a, const Ipv4Address& b);
 };
 
 /**
- * \ingroup address
+ * @ingroup address
  *
- * \brief a class to represent an Ipv4 address mask
+ * @brief a class to represent an Ipv4 address mask
  *
  * The constructor takes arguments according to a few formats.
  * Ipv4Mask ("255.255.255.255"), Ipv4Mask ("/32"), and Ipv4Mask (0xffffffff)
  * are all equivalent.
  *
- * \see attribute_Ipv4Mask
+ * @see attribute_Ipv4Mask
  */
 class Ipv4Mask
 {
@@ -250,76 +250,76 @@
      */
     Ipv4Mask();
     /**
-     * \param mask bitwise integer representation of the mask
+     * @param mask bitwise integer representation of the mask
      *
      * For example, the integer input 0xffffff00 yields a 24-bit mask
      */
     Ipv4Mask(uint32_t mask);
     /**
-     * \param mask String constant either in "255.255.255.0" or "/24" format
+     * @param mask String constant either in "255.255.255.0" or "/24" format
      */
     Ipv4Mask(const char* mask);
     /**
-     * \param a first address to compare
-     * \param b second address to compare
-     * \return true if both addresses are equal in their masked bits,
+     * @param a first address to compare
+     * @param b second address to compare
+     * @return true if both addresses are equal in their masked bits,
      * corresponding to this mask
      */
     bool IsMatch(Ipv4Address a, Ipv4Address b) const;
     /**
      * Get the host-order 32-bit IP mask
-     * \return the host-order 32-bit IP mask
+     * @return the host-order 32-bit IP mask
      */
     uint32_t Get() const;
     /**
      * input mask is in host order.
-     * \param mask The host order 32-bit mask
+     * @param mask The host order 32-bit mask
      */
     void Set(uint32_t mask);
     /**
-     * \brief Return the inverse mask in host order.
-     * \return The inverse mask
+     * @brief Return the inverse mask in host order.
+     * @return The inverse mask
      */
     uint32_t GetInverse() const;
     /**
-     * \brief Print this mask to the given output stream
+     * @brief Print this mask to the given output stream
      *
      * The print format is in the typical "255.255.255.0"
-     * \param os The output stream to which this Ipv4Address is printed
+     * @param os The output stream to which this Ipv4Address is printed
      */
     void Print(std::ostream& os) const;
     /**
-     * \return the prefix length of mask (the yy in x.x.x.x/yy notation)
+     * @return the prefix length of mask (the yy in x.x.x.x/yy notation)
      */
     uint16_t GetPrefixLength() const;
     /**
-     * \return the 255.0.0.0 mask corresponding to a typical loopback address
+     * @return the 255.0.0.0 mask corresponding to a typical loopback address
      */
     static Ipv4Mask GetLoopback();
     /**
-     * \return the 0.0.0.0 mask
+     * @return the 0.0.0.0 mask
      */
     static Ipv4Mask GetZero();
     /**
-     * \return the 255.255.255.255 mask
+     * @return the 255.255.255.255 mask
      */
     static Ipv4Mask GetOnes();
 
     /**
-     * \brief Equal to operator.
+     * @brief Equal to operator.
      *
-     * \param a the first operand.
-     * \param b the first operand.
-     * \returns true if the operands are equal.
+     * @param a the first operand.
+     * @param b the first operand.
+     * @returns true if the operands are equal.
      */
     friend bool operator==(const Ipv4Mask& a, const Ipv4Mask& b);
 
     /**
-     * \brief Not equal to operator.
+     * @brief Not equal to operator.
      *
-     * \param a the first operand.
-     * \param b the first operand.
-     * \returns true if the operands are not equal.
+     * @param a the first operand.
+     * @param b the first operand.
+     * @returns true if the operands are not equal.
      */
     friend bool operator!=(const Ipv4Mask& a, const Ipv4Mask& b);
 
@@ -331,35 +331,35 @@
 ATTRIBUTE_HELPER_HEADER(Ipv4Mask);
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the stream
- * \param address the address
- * \returns a reference to the stream
+ * @param os the stream
+ * @param address the address
+ * @returns a reference to the stream
  */
 std::ostream& operator<<(std::ostream& os, const Ipv4Address& address);
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the stream
- * \param mask the mask
- * \returns a reference to the stream
+ * @param os the stream
+ * @param mask the mask
+ * @returns a reference to the stream
  */
 std::ostream& operator<<(std::ostream& os, const Ipv4Mask& mask);
 /**
- * \brief Stream extraction operator.
+ * @brief Stream extraction operator.
  *
- * \param is the stream
- * \param address the address
- * \returns a reference to the stream
+ * @param is the stream
+ * @param address the address
+ * @returns a reference to the stream
  */
 std::istream& operator>>(std::istream& is, Ipv4Address& address);
 /**
- * \brief Stream extraction operator.
+ * @brief Stream extraction operator.
  *
- * \param is the stream
- * \param mask the mask
- * \returns a reference to the stream
+ * @param is the stream
+ * @param mask the mask
+ * @returns a reference to the stream
  */
 std::istream& operator>>(std::istream& is, Ipv4Mask& mask);
 
@@ -382,17 +382,17 @@
 }
 
 /**
- * \ingroup address
+ * @ingroup address
  *
- * \brief Class providing an hash for IPv4 addresses
+ * @brief Class providing an hash for IPv4 addresses
  */
 class Ipv4AddressHash
 {
   public:
     /**
-     * \brief Returns the hash of an IPv4 address.
-     * \param x the address
-     * \return the hash
+     * @brief Returns the hash of an IPv4 address.
+     * @param x the address
+     * @return the hash
      *
      * This method uses std::hash rather than class Hash
      * as speed is more important than cryptographic robustness.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/ipv6-address.cc ns-3.44/src/network/utils/ipv6-address.cc
--- ns-3.43/src/network/utils/ipv6-address.cc	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/ipv6-address.cc	2025-03-09 16:55:49.679372300 -0700
@@ -35,11 +35,11 @@
 { /* } */
 #endif
     /**
-     * \brief Mix hash keys in-place for lookuphash
+     * @brief Mix hash keys in-place for lookuphash
      *
-     * \param a first word of the hash key
-     * \param b second word of the hash key
-     * \param c third word of the hash key
+     * @param a first word of the hash key
+     * @param b second word of the hash key
+     * @param c third word of the hash key
      */
     void mixHashKey(uint32_t& a, uint32_t& b, uint32_t& c)
     {
@@ -73,12 +73,12 @@
     }
 
     /**
-     * \brief Get a hash key.
-     * \param k the key
-     * \param length the length of the key
-     * \param level the previous hash, or an arbitrary value
-     * \return hash
-     * \note Adapted from Jens Jakobsen implementation (chillispot).
+     * @brief Get a hash key.
+     * @param k the key
+     * @param length the length of the key
+     * @param level the previous hash, or an arbitrary value
+     * @return hash
+     * @note Adapted from Jens Jakobsen implementation (chillispot).
      */
     static uint32_t lookuphash(unsigned char* k, uint32_t length, uint32_t level)
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/ipv6-address.h ns-3.44/src/network/utils/ipv6-address.h
--- ns-3.43/src/network/utils/ipv6-address.h	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/ipv6-address.h	2025-03-09 16:55:49.679372300 -0700
@@ -28,575 +28,575 @@
 class Mac64Address;
 
 /**
- * \ingroup address
- * \class Ipv6Address
- * \brief Describes an IPv6 address.
- * \see Ipv6Prefix
- * \see attribute_Ipv6Address
+ * @ingroup address
+ * @class Ipv6Address
+ * @brief Describes an IPv6 address.
+ * @see Ipv6Prefix
+ * @see attribute_Ipv6Address
  */
 class Ipv6Address
 {
   public:
     /**
-     * \brief Default constructor.
+     * @brief Default constructor.
      */
     Ipv6Address();
 
     /**
-     * \brief Constructs an Ipv6Address by parsing the input C-string.
-     * \param address the C-string containing the IPv6 address (e.g. 2001:660:4701::1).
+     * @brief Constructs an Ipv6Address by parsing the input C-string.
+     * @param address the C-string containing the IPv6 address (e.g. 2001:660:4701::1).
      */
     Ipv6Address(const char* address);
 
     /**
-     * \brief Constructs an Ipv6Address by using the input 16 bytes.
-     * \param address the 128-bit address
-     * \warning the parameter must point on a 16 bytes integer array!
+     * @brief Constructs an Ipv6Address by using the input 16 bytes.
+     * @param address the 128-bit address
+     * @warning the parameter must point on a 16 bytes integer array!
      */
     Ipv6Address(uint8_t address[16]);
 
     /**
-     * \brief Copy constructor.
-     * \param addr Ipv6Address object
+     * @brief Copy constructor.
+     * @param addr Ipv6Address object
      */
     Ipv6Address(const Ipv6Address& addr);
 
     /**
-     * \brief Copy constructor.
-     * \param addr Ipv6Address pointer
+     * @brief Copy constructor.
+     * @param addr Ipv6Address pointer
      */
     Ipv6Address(const Ipv6Address* addr);
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Ipv6Address();
 
     /**
-     * \brief Sets an Ipv6Address by parsing the input C-string.
-     * \param address the C-string containing the IPv6 address (e.g. 2001:660:4701::1).
+     * @brief Sets an Ipv6Address by parsing the input C-string.
+     * @param address the C-string containing the IPv6 address (e.g. 2001:660:4701::1).
      */
     void Set(const char* address);
 
     /**
-     * \brief Set an Ipv6Address by using the input 16 bytes.
+     * @brief Set an Ipv6Address by using the input 16 bytes.
      *
-     * \param address the 128-bit address
-     * \warning the parameter must point on a 16 bytes integer array!
+     * @param address the 128-bit address
+     * @warning the parameter must point on a 16 bytes integer array!
      */
     void Set(uint8_t address[16]);
 
     /**
-     * \brief Serialize this address to a 16-byte buffer.
-     * \param buf the output buffer to which this address gets overwritten with this
+     * @brief Serialize this address to a 16-byte buffer.
+     * @param buf the output buffer to which this address gets overwritten with this
      * Ipv6Address
      */
     void Serialize(uint8_t buf[16]) const;
 
     /**
-     * \brief Deserialize this address.
-     * \param buf buffer to read address from
-     * \return an Ipv6Address
+     * @brief Deserialize this address.
+     * @param buf buffer to read address from
+     * @return an Ipv6Address
      */
     static Ipv6Address Deserialize(const uint8_t buf[16]);
 
     /**
-     * \brief Make the solicited IPv6 address.
-     * \param addr the IPv6 address
-     * \return Solicited IPv6 address
+     * @brief Make the solicited IPv6 address.
+     * @param addr the IPv6 address
+     * @return Solicited IPv6 address
      */
     static Ipv6Address MakeSolicitedAddress(Ipv6Address addr);
 
     /**
-     * \brief Make the Ipv4-mapped IPv6 address.
-     * \param addr the IPv4 address
-     * \return Ipv4-mapped IPv6 address
+     * @brief Make the Ipv4-mapped IPv6 address.
+     * @param addr the IPv4 address
+     * @return Ipv4-mapped IPv6 address
      */
     static Ipv6Address MakeIpv4MappedAddress(Ipv4Address addr);
 
     /**
-     * \brief Return the Ipv4 address.
-     * \return Ipv4 address
+     * @brief Return the Ipv4 address.
+     * @return Ipv4 address
      */
     Ipv4Address GetIpv4MappedAddress() const;
 
     /**
-     * \brief Make the autoconfigured IPv6 address from a Mac address.
+     * @brief Make the autoconfigured IPv6 address from a Mac address.
      *
      * Actually the MAC supported are: Mac8, Mac16, Mac48, and Mac64.
      *
-     * \param addr the MAC address.
-     * \param prefix the IPv6 prefix
-     * \return autoconfigured IPv6 address
+     * @param addr the MAC address.
+     * @param prefix the IPv6 prefix
+     * @return autoconfigured IPv6 address
      */
     static Ipv6Address MakeAutoconfiguredAddress(Address addr, Ipv6Address prefix);
 
     /**
-     * \brief Make the autoconfigured IPv6 address from a Mac address.
+     * @brief Make the autoconfigured IPv6 address from a Mac address.
      *
      * Actually the MAC supported are: Mac8, Mac16, Mac48, and Mac64.
      *
-     * \param addr the MAC address.
-     * \param prefix the IPv6 prefix
-     * \return autoconfigured IPv6 address
+     * @param addr the MAC address.
+     * @param prefix the IPv6 prefix
+     * @return autoconfigured IPv6 address
      */
 
     static Ipv6Address MakeAutoconfiguredAddress(Address addr, Ipv6Prefix prefix);
 
     /**
-     * \brief Make the autoconfigured IPv6 address with Mac16Address.
+     * @brief Make the autoconfigured IPv6 address with Mac16Address.
      *
      * The EUI-64 scheme used is based on the \RFC{4944}.
      *
-     * \param addr the MAC address (16 bits).
-     * \param prefix the IPv6 prefix
-     * \return autoconfigured IPv6 address
+     * @param addr the MAC address (16 bits).
+     * @param prefix the IPv6 prefix
+     * @return autoconfigured IPv6 address
      */
     static Ipv6Address MakeAutoconfiguredAddress(Mac16Address addr, Ipv6Address prefix);
 
     /**
-     * \brief Make the autoconfigured IPv6 address with Mac48Address.
+     * @brief Make the autoconfigured IPv6 address with Mac48Address.
      *
      * The EUI-64 scheme used is based on \RFC{2464}.
      *
-     * \param addr the MAC address (48 bits).
-     * \param prefix the IPv6 prefix
-     * \return autoconfigured IPv6 address
+     * @param addr the MAC address (48 bits).
+     * @param prefix the IPv6 prefix
+     * @return autoconfigured IPv6 address
      */
     static Ipv6Address MakeAutoconfiguredAddress(Mac48Address addr, Ipv6Address prefix);
 
     /**
-     * \brief Make the autoconfigured IPv6 address with Mac64Address.
-     * \param addr the MAC address (64 bits).
-     * \param prefix the IPv6 prefix
-     * \return autoconfigured IPv6 address
+     * @brief Make the autoconfigured IPv6 address with Mac64Address.
+     * @param addr the MAC address (64 bits).
+     * @param prefix the IPv6 prefix
+     * @return autoconfigured IPv6 address
      */
     static Ipv6Address MakeAutoconfiguredAddress(Mac64Address addr, Ipv6Address prefix);
 
     /**
-     * \brief Make the autoconfigured IPv6 address with Mac8Address.
+     * @brief Make the autoconfigured IPv6 address with Mac8Address.
      *
      * The EUI-64 scheme used is loosely based on the \RFC{2464}.
      *
-     * \param addr the Mac8Address address (8 bits).
-     * \param prefix the IPv6 prefix
-     * \return autoconfigured IPv6 address
+     * @param addr the Mac8Address address (8 bits).
+     * @param prefix the IPv6 prefix
+     * @return autoconfigured IPv6 address
      */
     static Ipv6Address MakeAutoconfiguredAddress(Mac8Address addr, Ipv6Address prefix);
 
     /**
-     * \brief Make the autoconfigured link-local IPv6 address from a Mac address.
+     * @brief Make the autoconfigured link-local IPv6 address from a Mac address.
      *
      * Actually the MAC supported are: Mac8, Mac16, Mac48, and Mac64.
      *
-     * \param mac the MAC address.
-     * \return autoconfigured link-local IPv6 address
+     * @param mac the MAC address.
+     * @return autoconfigured link-local IPv6 address
      */
     static Ipv6Address MakeAutoconfiguredLinkLocalAddress(Address mac);
 
     /**
-     * \brief Make the autoconfigured link-local IPv6 address with Mac16Address.
+     * @brief Make the autoconfigured link-local IPv6 address with Mac16Address.
      *
      * The EUI-64 scheme used is based on the \RFC{4944}.
      *
-     * \param mac the MAC address (16 bits).
-     * \return autoconfigured link-local IPv6 address
+     * @param mac the MAC address (16 bits).
+     * @return autoconfigured link-local IPv6 address
      */
     static Ipv6Address MakeAutoconfiguredLinkLocalAddress(Mac16Address mac);
 
     /**
-     * \brief Make the autoconfigured link-local IPv6 address with Mac48Address.
+     * @brief Make the autoconfigured link-local IPv6 address with Mac48Address.
      *
      * The EUI-64 scheme used is based on \RFC{2464}.
      *
-     * \param mac the MAC address (48 bits).
-     * \return autoconfigured link-local IPv6 address
+     * @param mac the MAC address (48 bits).
+     * @return autoconfigured link-local IPv6 address
      */
     static Ipv6Address MakeAutoconfiguredLinkLocalAddress(Mac48Address mac);
 
     /**
-     * \brief Make the autoconfigured link-local IPv6 address with Mac64Address.
-     * \param mac the MAC address (64 bits).
-     * \return autoconfigured link-local IPv6 address
+     * @brief Make the autoconfigured link-local IPv6 address with Mac64Address.
+     * @param mac the MAC address (64 bits).
+     * @return autoconfigured link-local IPv6 address
      */
     static Ipv6Address MakeAutoconfiguredLinkLocalAddress(Mac64Address mac);
 
     /**
-     * \brief Make the autoconfigured link-local IPv6 address with Mac8Address.
+     * @brief Make the autoconfigured link-local IPv6 address with Mac8Address.
      *
      * The EUI-64 scheme used is loosely based on the \RFC{2464}.
      *
-     * \param mac the MAC address (8 bits).
-     * \return autoconfigured link-local IPv6 address
+     * @param mac the MAC address (8 bits).
+     * @return autoconfigured link-local IPv6 address
      */
     static Ipv6Address MakeAutoconfiguredLinkLocalAddress(Mac8Address mac);
 
     /**
-     * \brief Print this address to the given output stream.
+     * @brief Print this address to the given output stream.
      *
      * The print format is in the typical "2001:660:4701::1".
-     * \param os the output stream to which this Ipv6Address is printed
+     * @param os the output stream to which this Ipv6Address is printed
      */
     void Print(std::ostream& os) const;
 
     /**
-     * \brief If the IPv6 address is localhost (::1).
-     * \return true if localhost, false otherwise
+     * @brief If the IPv6 address is localhost (::1).
+     * @return true if localhost, false otherwise
      */
     bool IsLocalhost() const;
 
     /**
-     * \brief If the IPv6 address is multicast (ff00::/8).
-     * \return true if multicast, false otherwise
+     * @brief If the IPv6 address is multicast (ff00::/8).
+     * @return true if multicast, false otherwise
      */
     bool IsMulticast() const;
 
     /**
-     * \brief If the IPv6 address is link-local multicast (ff02::/16).
-     * \return true if link-local multicast, false otherwise
+     * @brief If the IPv6 address is link-local multicast (ff02::/16).
+     * @return true if link-local multicast, false otherwise
      */
     bool IsLinkLocalMulticast() const;
 
     /**
-     * \brief If the IPv6 address is "all nodes multicast" (ff02::1/8).
-     * \return true if "all nodes multicast", false otherwise
+     * @brief If the IPv6 address is "all nodes multicast" (ff02::1/8).
+     * @return true if "all nodes multicast", false otherwise
      */
     bool IsAllNodesMulticast() const;
 
     /**
-     * \brief If the IPv6 address is "all routers multicast" (ff02::2/8).
-     * \return true if "all routers multicast", false otherwise
+     * @brief If the IPv6 address is "all routers multicast" (ff02::2/8).
+     * @return true if "all routers multicast", false otherwise
      */
     bool IsAllRoutersMulticast() const;
 
     /**
-     * \brief If the IPv6 address is a link-local address (fe80::/64).
-     * \return true if the address is link-local, false otherwise
+     * @brief If the IPv6 address is a link-local address (fe80::/64).
+     * @return true if the address is link-local, false otherwise
      */
     bool IsLinkLocal() const;
 
     /**
-     * \brief If the IPv6 address is a Solicited multicast address.
-     * \return true if it is, false otherwise
+     * @brief If the IPv6 address is a Solicited multicast address.
+     * @return true if it is, false otherwise
      */
     bool IsSolicitedMulticast() const;
 
     /**
-     * \brief If the IPv6 address is the "Any" address.
-     * \return true if it is, false otherwise
+     * @brief If the IPv6 address is the "Any" address.
+     * @return true if it is, false otherwise
      */
     bool IsAny() const;
 
     /**
-     * \brief If the IPv6 address is a documentation address (2001:DB8::/32).
-     * \return true if the address is documentation, false otherwise
+     * @brief If the IPv6 address is a documentation address (2001:DB8::/32).
+     * @return true if the address is documentation, false otherwise
      */
     bool IsDocumentation() const;
 
     /**
-     * \brief Compares an address and a prefix.
-     * \param prefix the prefix to compare with
-     * \return true if the address has the given prefix
+     * @brief Compares an address and a prefix.
+     * @param prefix the prefix to compare with
+     * @return true if the address has the given prefix
      */
     bool HasPrefix(const Ipv6Prefix& prefix) const;
 
     /**
-     * \brief Combine this address with a prefix.
-     * \param prefix a IPv6 prefix
-     * \return an IPv6 address that is this address combined
+     * @brief Combine this address with a prefix.
+     * @param prefix a IPv6 prefix
+     * @return an IPv6 address that is this address combined
      * (bitwise AND) with a prefix, yielding an IPv6 network address.
      */
     Ipv6Address CombinePrefix(const Ipv6Prefix& prefix) const;
 
     /**
-     * \brief If the Address matches the type.
-     * \param address other address
-     * \return true if the type matches, false otherwise
+     * @brief If the Address matches the type.
+     * @param address other address
+     * @return true if the type matches, false otherwise
      */
     static bool IsMatchingType(const Address& address);
 
     /**
-     * \brief If the address is an IPv4-mapped address
-     * \return true if address is an IPv4-mapped address, otherwise false.
+     * @brief If the address is an IPv4-mapped address
+     * @return true if address is an IPv4-mapped address, otherwise false.
      */
     bool IsIpv4MappedAddress() const;
 
     /**
-     * \brief Convert to Address object
+     * @brief Convert to Address object
      */
     operator Address() const;
 
     /**
-     * \brief Convert the Address object into an Ipv6Address ones.
-     * \param address address to convert
-     * \return an Ipv6Address
+     * @brief Convert the Address object into an Ipv6Address ones.
+     * @param address address to convert
+     * @return an Ipv6Address
      */
     static Ipv6Address ConvertFrom(const Address& address);
 
     /**
-     * \brief convert the IPv6Address object to an Address object.
-     * \return the Address object corresponding to this object.
+     * @brief convert the IPv6Address object to an Address object.
+     * @return the Address object corresponding to this object.
      */
     Address ConvertTo() const;
 
     /**
-     * \return true if address is initialized (i.e., set to something), false otherwise
+     * @return true if address is initialized (i.e., set to something), false otherwise
      */
     bool IsInitialized() const;
 
     /**
-     * \brief Get the 0 (::) Ipv6Address.
-     * \return the :: Ipv6Address representation
+     * @brief Get the 0 (::) Ipv6Address.
+     * @return the :: Ipv6Address representation
      */
     static Ipv6Address GetZero();
 
     /**
-     * \brief Get the "any" (::) Ipv6Address.
-     * \return the "any" (::) Ipv6Address
+     * @brief Get the "any" (::) Ipv6Address.
+     * @return the "any" (::) Ipv6Address
      */
     static Ipv6Address GetAny();
 
     /**
-     * \brief Get the "all nodes multicast" address.
-     * \return the "ff02::2/8" Ipv6Address representation
+     * @brief Get the "all nodes multicast" address.
+     * @return the "ff02::2/8" Ipv6Address representation
      */
     static Ipv6Address GetAllNodesMulticast();
 
     /**
-     * \brief Get the "all routers multicast" address.
-     * \return the "ff02::2/8" Ipv6Address representation
+     * @brief Get the "all routers multicast" address.
+     * @return the "ff02::2/8" Ipv6Address representation
      */
     static Ipv6Address GetAllRoutersMulticast();
 
     /**
-     * \brief Get the "all hosts multicast" address.
-     * \return the "ff02::3/8" Ipv6Address representation
+     * @brief Get the "all hosts multicast" address.
+     * @return the "ff02::3/8" Ipv6Address representation
      */
     static Ipv6Address GetAllHostsMulticast();
 
     /**
-     * \brief Get the loopback address.
-     * \return the "::1/128" Ipv6Address representation.
+     * @brief Get the loopback address.
+     * @return the "::1/128" Ipv6Address representation.
      */
     static Ipv6Address GetLoopback();
 
     /**
-     * \brief Get the "all-1" IPv6 address (ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff).
-     * \return all-1 Ipv6Address representation
+     * @brief Get the "all-1" IPv6 address (ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff).
+     * @return all-1 Ipv6Address representation
      */
     static Ipv6Address GetOnes();
 
     /**
-     * \brief Get the bytes corresponding to the address.
-     * \param buf buffer to store the data
+     * @brief Get the bytes corresponding to the address.
+     * @param buf buffer to store the data
      */
     void GetBytes(uint8_t buf[16]) const;
 
   private:
     /**
-     * \brief Return the Type of address.
-     * \return type of address
+     * @brief Return the Type of address.
+     * @return type of address
      */
     static uint8_t GetType();
 
     /**
-     * \brief The address representation on 128 bits (16 bytes).
+     * @brief The address representation on 128 bits (16 bytes).
      */
     uint8_t m_address[16];
     bool m_initialized; //!< IPv6 address has been explicitly initialized to a valid value.
 
     /**
-     * \brief Equal to operator.
+     * @brief Equal to operator.
      *
-     * \param a the first operand.
-     * \param b the first operand.
-     * \returns true if the operands are equal.
+     * @param a the first operand.
+     * @param b the first operand.
+     * @returns true if the operands are equal.
      */
     friend bool operator==(const Ipv6Address& a, const Ipv6Address& b);
 
     /**
-     * \brief Not equal to operator.
+     * @brief Not equal to operator.
      *
-     * \param a the first operand.
-     * \param b the first operand.
-     * \returns true if the operands are not equal.
+     * @param a the first operand.
+     * @param b the first operand.
+     * @returns true if the operands are not equal.
      */
     friend bool operator!=(const Ipv6Address& a, const Ipv6Address& b);
 
     /**
-     * \brief Less than to operator.
+     * @brief Less than to operator.
      *
-     * \param a the first operand.
-     * \param b the first operand.
-     * \returns true if the first operand is less than the second.
+     * @param a the first operand.
+     * @param b the first operand.
+     * @returns true if the first operand is less than the second.
      */
     friend bool operator<(const Ipv6Address& a, const Ipv6Address& b);
 };
 
 /**
- * \ingroup address
- * \class Ipv6Prefix
- * \brief Describes an IPv6 prefix. It is just a bitmask like Ipv4Mask.
- * \see Ipv6Address
- * \see attribute_Ipv6Prefix
+ * @ingroup address
+ * @class Ipv6Prefix
+ * @brief Describes an IPv6 prefix. It is just a bitmask like Ipv4Mask.
+ * @see Ipv6Address
+ * @see attribute_Ipv6Prefix
  */
 class Ipv6Prefix
 {
   public:
     /**
-     * \brief Default constructor.
+     * @brief Default constructor.
      */
     Ipv6Prefix();
 
     /**
-     * \brief Constructs an Ipv6Prefix by using the input 16 bytes.
+     * @brief Constructs an Ipv6Prefix by using the input 16 bytes.
      *
      * The prefix length is calculated as the minimum prefix length, i.e.,
      * 2001:db8:cafe:: will have a 47 bit prefix length.
      *
-     * \param prefix the 128-bit prefix
+     * @param prefix the 128-bit prefix
      */
     Ipv6Prefix(uint8_t prefix[16]);
 
     /**
-     * \brief Constructs an Ipv6Prefix by using the input string.
+     * @brief Constructs an Ipv6Prefix by using the input string.
      *
      * The prefix length is calculated as the minimum prefix length, i.e.,
      * 2001:db8:cafe:: will have a 47 bit prefix length.
      *
-     * \param prefix the 128-bit prefix
+     * @param prefix the 128-bit prefix
      */
     Ipv6Prefix(const char* prefix);
 
     /**
-     * \brief Constructs an Ipv6Prefix by using the input 16 bytes.
-     * \param prefix the 128-bit prefix
-     * \param prefixLength the prefix length
+     * @brief Constructs an Ipv6Prefix by using the input 16 bytes.
+     * @param prefix the 128-bit prefix
+     * @param prefixLength the prefix length
      */
     Ipv6Prefix(uint8_t prefix[16], uint8_t prefixLength);
 
     /**
-     * \brief Constructs an Ipv6Prefix by using the input string.
-     * \param prefix the 128-bit prefix
-     * \param prefixLength the prefix length
+     * @brief Constructs an Ipv6Prefix by using the input string.
+     * @param prefix the 128-bit prefix
+     * @param prefixLength the prefix length
      */
     Ipv6Prefix(const char* prefix, uint8_t prefixLength);
 
     /**
-     * \brief Constructs an Ipv6Prefix by using the input number of bits.
-     * \param prefix number of bits of the prefix (0 - 128)
-     * \note A valid number of bits is between 0 and 128).
+     * @brief Constructs an Ipv6Prefix by using the input number of bits.
+     * @param prefix number of bits of the prefix (0 - 128)
+     * @note A valid number of bits is between 0 and 128).
      */
     Ipv6Prefix(uint8_t prefix);
 
     /**
-     * \brief Copy constructor.
-     * \param prefix Ipv6Prefix object
+     * @brief Copy constructor.
+     * @param prefix Ipv6Prefix object
      */
     Ipv6Prefix(const Ipv6Prefix& prefix);
 
     /**
-     * \brief Copy constructor.
-     * \param prefix Ipv6Prefix pointer
+     * @brief Copy constructor.
+     * @param prefix Ipv6Prefix pointer
      */
     Ipv6Prefix(const Ipv6Prefix* prefix);
 
     /**
-     * \brief Destructor.
+     * @brief Destructor.
      */
     ~Ipv6Prefix();
 
     /**
-     * \brief If the Address match the type.
-     * \param a a first address
-     * \param b a second address
-     * \return true if the type match, false otherwise
+     * @brief If the Address match the type.
+     * @param a a first address
+     * @param b a second address
+     * @return true if the type match, false otherwise
      */
     bool IsMatch(Ipv6Address a, Ipv6Address b) const;
 
     /**
-     * \brief Get the bytes corresponding to the prefix.
-     * \param buf buffer to store the data
+     * @brief Get the bytes corresponding to the prefix.
+     * @param buf buffer to store the data
      */
     void GetBytes(uint8_t buf[16]) const;
 
     /**
-     * \brief Convert the Prefix into an IPv6 Address.
-     * \return an IPv6 address representing the prefix
+     * @brief Convert the Prefix into an IPv6 Address.
+     * @return an IPv6 address representing the prefix
      */
     Ipv6Address ConvertToIpv6Address() const;
 
     /**
-     * \brief Get prefix length.
-     * \return prefix length
+     * @brief Get prefix length.
+     * @return prefix length
      */
     uint8_t GetPrefixLength() const;
 
     /**
-     * \brief Set prefix length.
-     * \param prefixLength the prefix length
+     * @brief Set prefix length.
+     * @param prefixLength the prefix length
      */
     void SetPrefixLength(uint8_t prefixLength);
 
     /**
-     * \brief Get the minimum prefix length, i.e., 128 - the length of the largest sequence
+     * @brief Get the minimum prefix length, i.e., 128 - the length of the largest sequence
      * trailing zeroes.
-     * \return minimum prefix length
+     * @return minimum prefix length
      */
     uint8_t GetMinimumPrefixLength() const;
 
     /**
-     * \brief Print this address to the given output stream.
+     * @brief Print this address to the given output stream.
      *
      * The print format is in the typical "2001:660:4701::1".
-     * \param os the output stream to which this Ipv6Address is printed
+     * @param os the output stream to which this Ipv6Address is printed
      */
     void Print(std::ostream& os) const;
 
     /**
-     * \brief Get the loopback prefix ( /128).
-     * \return a Ipv6Prefix corresponding to loopback prefix
+     * @brief Get the loopback prefix ( /128).
+     * @return a Ipv6Prefix corresponding to loopback prefix
      */
     static Ipv6Prefix GetLoopback();
 
     /**
-     * \brief Get the "all-1" IPv6 mask (ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff).
-     * \return /128 Ipv6Prefix representation
+     * @brief Get the "all-1" IPv6 mask (ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff).
+     * @return /128 Ipv6Prefix representation
      */
     static Ipv6Prefix GetOnes();
 
     /**
-     * \brief Get the zero prefix ( /0).
-     * \return an Ipv6Prefix
+     * @brief Get the zero prefix ( /0).
+     * @return an Ipv6Prefix
      */
     static Ipv6Prefix GetZero();
 
   private:
     /**
-     * \brief The prefix representation.
+     * @brief The prefix representation.
      */
     uint8_t m_prefix[16];
 
     /**
-     * \brief The prefix length.
+     * @brief The prefix length.
      */
     uint8_t m_prefixLength;
 
     /**
-     * \brief Equal to operator.
+     * @brief Equal to operator.
      *
-     * \param a the first operand
-     * \param b the first operand
-     * \returns true if the operands are equal
+     * @param a the first operand
+     * @param b the first operand
+     * @returns true if the operands are equal
      */
     friend bool operator==(const Ipv6Prefix& a, const Ipv6Prefix& b);
 
     /**
-     * \brief Not equal to operator.
+     * @brief Not equal to operator.
      *
-     * \param a the first operand
-     * \param b the first operand
-     * \returns true if the operands are not equal
+     * @param a the first operand
+     * @param b the first operand
+     * @returns true if the operands are not equal
      */
     friend bool operator!=(const Ipv6Prefix& a, const Ipv6Prefix& b);
 };
@@ -605,38 +605,38 @@
 ATTRIBUTE_HELPER_HEADER(Ipv6Prefix);
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the reference to the output stream
- * \param address the Ipv6Address
- * \returns the reference to the output stream
+ * @param os the reference to the output stream
+ * @param address the Ipv6Address
+ * @returns the reference to the output stream
  */
 std::ostream& operator<<(std::ostream& os, const Ipv6Address& address);
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the reference to the output stream
- * \param prefix the Ipv6Prefix
- * \returns the reference to the output stream
+ * @param os the reference to the output stream
+ * @param prefix the Ipv6Prefix
+ * @returns the reference to the output stream
  */
 std::ostream& operator<<(std::ostream& os, const Ipv6Prefix& prefix);
 
 /**
- * \brief Stream extraction operator.
+ * @brief Stream extraction operator.
  *
- * \param is the reference to the input stream
- * \param address the Ipv6Address
- * \returns the reference to the input stream
+ * @param is the reference to the input stream
+ * @param address the Ipv6Address
+ * @returns the reference to the input stream
  */
 std::istream& operator>>(std::istream& is, Ipv6Address& address);
 
 /**
- * \brief Stream extraction operator.
+ * @brief Stream extraction operator.
  *
- * \param is the reference to the input stream
- * \param prefix the Ipv6Prefix
- * \returns the reference to the input stream
+ * @param is the reference to the input stream
+ * @param prefix the Ipv6Prefix
+ * @returns the reference to the input stream
  */
 std::istream& operator>>(std::istream& is, Ipv6Prefix& prefix);
 
@@ -671,16 +671,16 @@
 }
 
 /**
- * \class Ipv6AddressHash
- * \brief Hash function class for IPv6 addresses.
+ * @class Ipv6AddressHash
+ * @brief Hash function class for IPv6 addresses.
  */
 class Ipv6AddressHash
 {
   public:
     /**
-     * \brief Returns the hash of an IPv6 address.
-     * \param x IPv6 address to hash
-     * \returns the hash of the address
+     * @brief Returns the hash of an IPv6 address.
+     * @param x IPv6 address to hash
+     * @returns the hash of the address
      */
     size_t operator()(const Ipv6Address& x) const;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/llc-snap-header.h ns-3.44/src/network/utils/llc-snap-header.h
--- ns-3.43/src/network/utils/llc-snap-header.h	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/llc-snap-header.h	2025-03-09 16:55:49.679372300 -0700
@@ -23,9 +23,9 @@
 static const uint16_t LLC_SNAP_HEADER_LENGTH = 8;
 
 /**
- * \ingroup network
+ * @ingroup network
  *
- * \brief Header for the LLC/SNAP encapsulation
+ * @brief Header for the LLC/SNAP encapsulation
  *
  * For a list of EtherTypes, see
  * http://www.iana.org/assignments/ieee-802-numbers/ieee-802-numbers.xhtml
@@ -36,19 +36,19 @@
     LlcSnapHeader();
 
     /**
-     * \brief Set the Ethertype.
-     * \param type the Ethertype
+     * @brief Set the Ethertype.
+     * @param type the Ethertype
      */
     void SetType(uint16_t type);
     /**
-     * \brief Return the Ethertype.
-     * \return Ethertype
+     * @brief Return the Ethertype.
+     * @return Ethertype
      */
     uint16_t GetType();
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/lollipop-counter.h ns-3.44/src/network/utils/lollipop-counter.h
--- ns-3.43/src/network/utils/lollipop-counter.h	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/lollipop-counter.h	2025-03-09 16:55:49.679372300 -0700
@@ -17,10 +17,10 @@
 {
 
 /**
- * \ingroup seq-counters
- * \class LollipopCounter
+ * @ingroup seq-counters
+ * @class LollipopCounter
  *
- * \brief Template class implementing a Lollipop counter as defined in \RFC{8505}, \RFC{6550}, and
+ * @brief Template class implementing a Lollipop counter as defined in \RFC{8505}, \RFC{6550}, and
  * [Perlman83].
  *
  * A Lollipop counter is a counter that solves initialization and
@@ -50,7 +50,7 @@
  * Computer Networks 7: pp. 395-405, DOI 10.1016/0376-5075(83)90034-X, 1983,
  * <https://web.archive.org/web/20180723135334/http://pbg.cs.illinois.edu/courses/cs598fa09/readings/p83.pdf>.
  *
- * \tparam T \explicit The type being used for the counter.
+ * @tparam T \explicit The type being used for the counter.
  */
 template <class T>
 class LollipopCounter
@@ -64,7 +64,7 @@
      */
     LollipopCounter()
     {
-        NS_ABORT_MSG_UNLESS(std::is_unsigned<T>::value,
+        NS_ABORT_MSG_UNLESS(std::is_unsigned_v<T>,
                             "Lollipop counters must be defined on unsigned integer types");
 
         uint16_t numberofDigits = std::numeric_limits<T>::digits;
@@ -78,8 +78,8 @@
      *
      * The Sequence Window is set to the default value.
      *
-     * \param val the initial value of the Lollipop Counter
-     * \tparam T \deduced The type being used for the counter.
+     * @param val the initial value of the Lollipop Counter
+     * @tparam T \deduced The type being used for the counter.
      */
     LollipopCounter(T val)
     {
@@ -92,8 +92,8 @@
     /**
      * Assignment.
      *
-     * \param [in] o Value to assign to this LollipopCounter.
-     * \returns This LollipopCounter.
+     * @param [in] o Value to assign to this LollipopCounter.
+     * @returns This LollipopCounter.
      */
     inline LollipopCounter& operator=(const LollipopCounter& o)
     {
@@ -116,7 +116,7 @@
      * The counter is reset to maxValue - m_sequenceWindow +1, where
      * maxValue is the maximum number allowed by the underlying type.
      *
-     * \param numberOfBits number of bits to use in the Sequence Window
+     * @param numberOfBits number of bits to use in the Sequence Window
      */
     void SetSequenceWindowSize(uint16_t numberOfBits)
     {
@@ -143,8 +143,8 @@
      * Sequence Window is equal to 2^N where N is (by default) half the number
      * of digits of the underlying type.
      *
-     * \param val counter to compare
-     * \returns true if the counters are comparable.
+     * @param val counter to compare
+     * @returns true if the counters are comparable.
      */
     bool IsComparable(const LollipopCounter& val) const
     {
@@ -167,7 +167,7 @@
     /**
      * Checks if a counter is in its starting region.
      *
-     * \returns true if a counter is in its starting region.
+     * @returns true if a counter is in its starting region.
      */
     bool IsInit() const
     {
@@ -176,9 +176,9 @@
 
     /**
      * Arithmetic operator equal-to
-     * \param [in] lhs Left hand argument
-     * \param [in] rhs Right hand argument
-     * \return The result of the operator.
+     * @param [in] lhs Left hand argument
+     * @param [in] rhs Right hand argument
+     * @return The result of the operator.
      */
     friend bool operator==(const LollipopCounter& lhs, const LollipopCounter& rhs)
     {
@@ -190,9 +190,9 @@
 
     /**
      * Arithmetic operator greater-than
-     * \param [in] lhs Left hand argument
-     * \param [in] rhs Right hand argument
-     * \return The result of the operator.
+     * @param [in] lhs Left hand argument
+     * @param [in] rhs Right hand argument
+     * @return The result of the operator.
      */
     friend bool operator>(const LollipopCounter& lhs, const LollipopCounter& rhs)
     {
@@ -257,9 +257,9 @@
 
     /**
      * Arithmetic operator less-than
-     * \param [in] lhs Left hand argument
-     * \param [in] rhs Right hand argument
-     * \return The result of the operator.
+     * @param [in] lhs Left hand argument
+     * @param [in] rhs Right hand argument
+     * @return The result of the operator.
      */
     friend bool operator<(const LollipopCounter& lhs, const LollipopCounter& rhs)
     {
@@ -278,14 +278,14 @@
 
     /**
      * Prefix increment operator
-     * \param [in] val LollipopCounter to be incremented
-     * \return The result of the Prefix increment.
+     * @param [in] val LollipopCounter to be incremented
+     * @return The result of the Prefix increment.
      */
     friend LollipopCounter operator++(LollipopCounter& val) // prefix ++
     {
         val.m_value++;
 
-        if (val.m_value == val.m_circularRegion + 1)
+        if (val.m_value == m_circularRegion + 1)
         {
             val.m_value = 0;
         }
@@ -295,9 +295,9 @@
 
     /**
      * Postfix increment operator
-     * \param [in] val LollipopCounter to be incremented
-     * \param [in] noop ignored argument (used to mark it as a postfix, blame c++).
-     * \return The result of the Postfix increment.
+     * @param [in] val LollipopCounter to be incremented
+     * @param [in] noop ignored argument (used to mark it as a postfix, blame c++).
+     * @return The result of the Postfix increment.
      */
     friend LollipopCounter operator++(LollipopCounter& val, int noop) // postfix ++
     {
@@ -309,7 +309,7 @@
     /**
      * Get the counter value.
      *
-     * \return the counter value.
+     * @return the counter value.
      */
     T GetValue() const
     {
@@ -319,9 +319,9 @@
     /**
      * Output streamer for LollipopCounter.
      *
-     * \param [in,out] os The output stream.
-     * \param [in] counter The LollipopCounter to print.
-     * \returns The stream.
+     * @param [in,out] os The output stream.
+     * @param [in] counter The LollipopCounter to print.
+     * @returns The stream.
      */
     friend std::ostream& operator<<(std::ostream& os, const LollipopCounter& counter)
     {
@@ -338,8 +338,8 @@
      * the smallest circular distance between two numbers.
      *
      * Arithmetic operator.
-     * \param [in] val Counter to compute the difference against
-     * \return The result of the difference.
+     * @param [in] val Counter to compute the difference against
+     * @return The result of the difference.
      */
     T AbsoluteMagnitudeOfDifference(const LollipopCounter& val) const
     {
@@ -365,12 +365,12 @@
 };
 
 /**
- * \ingroup seq-counters
+ * @ingroup seq-counters
  * 8 bit Lollipop Counter.
  */
 typedef LollipopCounter<uint8_t> LollipopCounter8;
 /**
- * \ingroup seq-counters
+ * @ingroup seq-counters
  * 16 bit Lollipop Counter.
  */
 typedef LollipopCounter<uint16_t> LollipopCounter16;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/mac16-address.h ns-3.44/src/network/utils/mac16-address.h
--- ns-3.43/src/network/utils/mac16-address.h	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/mac16-address.h	2025-03-09 16:55:49.679372300 -0700
@@ -23,54 +23,54 @@
 class Address;
 
 /**
- * \ingroup address
+ * @ingroup address
  *
  * This class can contain 16 bit addresses.
  *
- * \see attribute_Mac16Address
+ * @see attribute_Mac16Address
  */
 class Mac16Address
 {
   public:
     Mac16Address() = default;
     /**
-     * \param str a string representing the new Mac16Address
+     * @param str a string representing the new Mac16Address
      *
      * The format of the string is "xx:xx"
      */
     Mac16Address(const char* str);
 
     /**
-     * \param addr The 16 bit unsigned integer used to create a Mac16Address object.
+     * @param addr The 16 bit unsigned integer used to create a Mac16Address object.
      *
      * Create a Mac16Address from an 16 bit unsigned integer.
      */
     Mac16Address(uint16_t addr);
 
     /**
-     * \param buffer address in network order
+     * @param buffer address in network order
      *
      * Copy the input address to our internal buffer.
      */
     void CopyFrom(const uint8_t buffer[2]);
 
     /**
-     * \param buffer address in network order
+     * @param buffer address in network order
      *
      * Copy the internal address to the input buffer.
      */
     void CopyTo(uint8_t buffer[2]) const;
 
     /**
-     * \returns a new Address instance
+     * @returns a new Address instance
      *
      * Convert an instance of this class to a polymorphic Address instance.
      */
     operator Address() const;
 
     /**
-     * \param address a polymorphic address
-     * \returns a new Mac16Address from the polymorphic address
+     * @param address a polymorphic address
+     * @returns a new Mac16Address from the polymorphic address
      *
      * This function performs a type check and asserts if the
      * type of the input address is not compatible with an
@@ -79,28 +79,28 @@
     static Mac16Address ConvertFrom(const Address& address);
 
     /**
-     * \returns a new Address instance
+     * @returns a new Address instance
      *
      * Convert an instance of this class to a polymorphic Address instance.
      */
     Address ConvertTo() const;
 
     /**
-     * \return the mac address in a 16 bit unsigned integer
+     * @return the mac address in a 16 bit unsigned integer
      *
      * Convert an instance of this class to a 16 bit unsigned integer.
      */
     uint16_t ConvertToInt() const;
 
     /**
-     * \param address address to test
-     * \returns true if the address matches, false otherwise.
+     * @param address address to test
+     * @returns true if the address matches, false otherwise.
      */
     static bool IsMatchingType(const Address& address);
 
     /**
      * Allocate a new Mac16Address.
-     * \returns newly allocated mac16Address
+     * @returns newly allocated mac16Address
      */
     static Mac16Address Allocate();
 
@@ -110,9 +110,9 @@
      * This function resets (to zero) the global integer
      * that is used for unique address allocation.
      * It is automatically called whenever
-     * \code
+     * @code
      * SimulatorDestroy ();
-     * \endcode
+     * @endcode
      * is called.  It may also be optionally called
      * by user code if there is a need to force a reset
      * of this allocation index.
@@ -120,7 +120,7 @@
     static void ResetAllocationIndex();
 
     /**
-     * \returns the broadcast address (0xFFFF)
+     * @returns the broadcast address (0xFFFF)
      */
     static Mac16Address GetBroadcast();
 
@@ -143,8 +143,8 @@
      * bits 3-7 within DST[15].  The initial 3-bit pattern of "100" follows
      * the 16-bit address format for multicast addresses (Section 12).
      *
-     * \param address base IPv6 address
-     * \returns the multicast 16-bit address.
+     * @param address base IPv6 address
+     * @returns the multicast 16-bit address.
      */
 
     static Mac16Address GetMulticast(Ipv6Address address);
@@ -153,7 +153,7 @@
      * Checks if the address is a broadcast address according
      * to 802.15.4 scheme (i.e., 0xFFFF).
      *
-     * \returns true if the address is 0xFFFF
+     * @returns true if the address is 0xFFFF
      */
     bool IsBroadcast() const;
 
@@ -161,59 +161,59 @@
      * Checks if the address is a multicast address according
      * to RFC 4944 Section 9 (i.e., if its first 3 bits are 100).
      *
-     * \returns true if the address is in the range 0x8000 - 0x9FFF
+     * @returns true if the address is in the range 0x8000 - 0x9FFF
      */
     bool IsMulticast() const;
 
   private:
     /**
-     * \brief Return the Type of address.
-     * \return type of address
+     * @brief Return the Type of address.
+     * @return type of address
      */
     static uint8_t GetType();
 
     /**
-     * \brief Equal to operator.
+     * @brief Equal to operator.
      *
-     * \param a the first operand
-     * \param b the first operand
-     * \returns true if the operands are equal
+     * @param a the first operand
+     * @param b the first operand
+     * @returns true if the operands are equal
      */
     friend bool operator==(const Mac16Address& a, const Mac16Address& b);
 
     /**
-     * \brief Not equal to operator.
+     * @brief Not equal to operator.
      *
-     * \param a the first operand
-     * \param b the first operand
-     * \returns true if the operands are not equal
+     * @param a the first operand
+     * @param b the first operand
+     * @returns true if the operands are not equal
      */
     friend bool operator!=(const Mac16Address& a, const Mac16Address& b);
 
     /**
-     * \brief Less than operator.
+     * @brief Less than operator.
      *
-     * \param a the first operand
-     * \param b the first operand
-     * \returns true if the operand a is less than operand b
+     * @param a the first operand
+     * @param b the first operand
+     * @returns true if the operand a is less than operand b
      */
     friend bool operator<(const Mac16Address& a, const Mac16Address& b);
 
     /**
-     * \brief Stream insertion operator.
+     * @brief Stream insertion operator.
      *
-     * \param os the stream
-     * \param address the address
-     * \returns a reference to the stream
+     * @param os the stream
+     * @param address the address
+     * @returns a reference to the stream
      */
     friend std::ostream& operator<<(std::ostream& os, const Mac16Address& address);
 
     /**
-     * \brief Stream extraction operator.
+     * @brief Stream extraction operator.
      *
-     * \param is the stream
-     * \param address the address
-     * \returns a reference to the stream
+     * @param is the stream
+     * @param address the address
+     * @returns a reference to the stream
      */
     friend std::istream& operator>>(std::istream& is, Mac16Address& address);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/mac48-address.h ns-3.44/src/network/utils/mac48-address.h
--- ns-3.43/src/network/utils/mac48-address.h	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/mac48-address.h	2025-03-09 16:55:49.679372300 -0700
@@ -23,47 +23,47 @@
 class Address;
 
 /**
- * \ingroup address
+ * @ingroup address
  *
- * \brief an EUI-48 address
+ * @brief an EUI-48 address
  *
  * This class can contain 48 bit IEEE addresses.
  *
- * \see attribute_Mac48Address
+ * @see attribute_Mac48Address
  */
 class Mac48Address
 {
   public:
     Mac48Address() = default;
     /**
-     * \param str a string representing the new Mac48Address
+     * @param str a string representing the new Mac48Address
      *
      * The format of the string is "xx:xx:xx:xx:xx:xx"
      */
     Mac48Address(const char* str);
 
     /**
-     * \param buffer address in network order
+     * @param buffer address in network order
      *
      * Copy the input address to our internal buffer.
      */
     void CopyFrom(const uint8_t buffer[6]);
     /**
-     * \param buffer address in network order
+     * @param buffer address in network order
      *
      * Copy the internal address to the input buffer.
      */
     void CopyTo(uint8_t buffer[6]) const;
 
     /**
-     * \returns a new Address instance
+     * @returns a new Address instance
      *
      * Convert an instance of this class to a polymorphic Address instance.
      */
     operator Address() const;
     /**
-     * \param address a polymorphic address
-     * \returns a new Mac48Address from the polymorphic address
+     * @param address a polymorphic address
+     * @returns a new Mac48Address from the polymorphic address
      *
      * This function performs a type check and asserts if the
      * type of the input address is not compatible with an
@@ -71,20 +71,20 @@
      */
     static Mac48Address ConvertFrom(const Address& address);
     /**
-     * \returns a new Address instance
+     * @returns a new Address instance
      *
      * Convert an instance of this class to a polymorphic Address instance.
      */
     Address ConvertTo() const;
 
     /**
-     * \param address address to test
-     * \returns true if the address matches, false otherwise.
+     * @param address address to test
+     * @returns true if the address matches, false otherwise.
      */
     static bool IsMatchingType(const Address& address);
     /**
      * Allocate a new Mac48Address.
-     * \returns newly allocated mac48Address
+     * @returns newly allocated mac48Address
      */
     static Mac48Address Allocate();
 
@@ -94,9 +94,9 @@
      * This function resets (to zero) the global integer
      * that is used for unique address allocation.
      * It is automatically called whenever
-     * \code
+     * @code
      * SimulatorDestroy ();
-     * \endcode
+     * @endcode
      * is called.  It may also be optionally called
      * by user code if there is a need to force a reset
      * of this allocation index.
@@ -104,100 +104,100 @@
     static void ResetAllocationIndex();
 
     /**
-     * \returns true if this is a broadcast address, false otherwise.
+     * @returns true if this is a broadcast address, false otherwise.
      */
     bool IsBroadcast() const;
 
     /**
-     * \returns true if the group bit is set, false otherwise.
+     * @returns true if the group bit is set, false otherwise.
      */
     bool IsGroup() const;
 
     /**
-     * \returns the broadcast address
+     * @returns the broadcast address
      */
     static Mac48Address GetBroadcast();
 
     /**
-     * \param address base IPv4 address
-     * \returns a multicast address
+     * @param address base IPv4 address
+     * @returns a multicast address
      */
     static Mac48Address GetMulticast(Ipv4Address address);
 
     /**
-     * \brief Get multicast address from IPv6 address.
-     * \param address base IPv6 address
-     * \returns a multicast address
+     * @brief Get multicast address from IPv6 address.
+     * @param address base IPv6 address
+     * @returns a multicast address
      */
     static Mac48Address GetMulticast(Ipv6Address address);
 
     /**
-     * \returns the multicast prefix (01:00:5e:00:00:00).
+     * @returns the multicast prefix (01:00:5e:00:00:00).
      */
     static Mac48Address GetMulticastPrefix();
 
     /**
-     * \brief Get the multicast prefix for IPv6 (33:33:00:00:00:00).
-     * \returns a multicast address.
+     * @brief Get the multicast prefix for IPv6 (33:33:00:00:00:00).
+     * @returns a multicast address.
      */
     static Mac48Address GetMulticast6Prefix();
 
     /**
      * TracedCallback signature for Mac48Address
      *
-     * \param [in] value Current value of the Mac48Address
+     * @param [in] value Current value of the Mac48Address
      */
     typedef void (*TracedCallback)(Mac48Address value);
 
   private:
     /**
-     * \brief Return the Type of address.
-     * \return type of address
+     * @brief Return the Type of address.
+     * @return type of address
      */
     static uint8_t GetType();
 
     /**
-     * \brief Equal to operator.
+     * @brief Equal to operator.
      *
-     * \param a the first operand
-     * \param b the first operand
-     * \returns true if the operands are equal
+     * @param a the first operand
+     * @param b the first operand
+     * @returns true if the operands are equal
      */
     friend bool operator==(const Mac48Address& a, const Mac48Address& b);
 
     /**
-     * \brief Not equal to operator.
+     * @brief Not equal to operator.
      *
-     * \param a the first operand
-     * \param b the first operand
-     * \returns true if the operands are not equal
+     * @param a the first operand
+     * @param b the first operand
+     * @returns true if the operands are not equal
      */
     friend bool operator!=(const Mac48Address& a, const Mac48Address& b);
 
     /**
-     * \brief Less than operator.
+     * @brief Less than operator.
      *
-     * \param a the first operand
-     * \param b the first operand
-     * \returns true if the operand a is less than operand b
+     * @param a the first operand
+     * @param b the first operand
+     * @returns true if the operand a is less than operand b
      */
     friend bool operator<(const Mac48Address& a, const Mac48Address& b);
 
     /**
-     * \brief Stream insertion operator.
+     * @brief Stream insertion operator.
      *
-     * \param os the stream
-     * \param address the address
-     * \returns a reference to the stream
+     * @param os the stream
+     * @param address the address
+     * @returns a reference to the stream
      */
     friend std::ostream& operator<<(std::ostream& os, const Mac48Address& address);
 
     /**
-     * \brief Stream extraction operator.
+     * @brief Stream extraction operator.
      *
-     * \param is the stream
-     * \param address the address
-     * \returns a reference to the stream
+     * @param is the stream
+     * @param address the address
+     * @returns a reference to the stream
      */
     friend std::istream& operator>>(std::istream& is, Mac48Address& address);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/mac64-address.h ns-3.44/src/network/utils/mac64-address.h
--- ns-3.43/src/network/utils/mac64-address.h	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/mac64-address.h	2025-03-09 16:55:49.679372300 -0700
@@ -23,53 +23,53 @@
 class Address;
 
 /**
- * \ingroup address
+ * @ingroup address
  *
- * \brief an EUI-64 address
+ * @brief an EUI-64 address
  *
  * This class can contain 64 bit IEEE addresses.
  *
- * \see attribute_Mac64Address
+ * @see attribute_Mac64Address
  */
 class Mac64Address
 {
   public:
     Mac64Address() = default;
     /**
-     * \param str a string representing the new Mac64Address
+     * @param str a string representing the new Mac64Address
      *
      * The format of the string is "xx:xx:xx:xx:xx:xx:xx:xx"
      */
     Mac64Address(const char* str);
 
     /**
-     * \param addr The 64 bit unsigned integer used to create a Mac64Address object.
+     * @param addr The 64 bit unsigned integer used to create a Mac64Address object.
      *
      * Create a Mac64Address from an 64 bit unsigned integer.
      */
     Mac64Address(uint64_t addr);
 
     /**
-     * \param buffer address in network order
+     * @param buffer address in network order
      *
      * Copy the input address to our internal buffer.
      */
     void CopyFrom(const uint8_t buffer[8]);
     /**
-     * \param buffer address in network order
+     * @param buffer address in network order
      *
      * Copy the internal address to the input buffer.
      */
     void CopyTo(uint8_t buffer[8]) const;
     /**
-     * \returns a new Address instance
+     * @returns a new Address instance
      *
      * Convert an instance of this class to a polymorphic Address instance.
      */
     operator Address() const;
     /**
-     * \param address a polymorphic address
-     * \returns a new Mac64Address from the polymorphic address
+     * @param address a polymorphic address
+     * @returns a new Mac64Address from the polymorphic address
      *
      * This function performs a type check and asserts if the
      * type of the input address is not compatible with an
@@ -77,27 +77,27 @@
      */
     static Mac64Address ConvertFrom(const Address& address);
     /**
-     * \returns a new Address instance
+     * @returns a new Address instance
      *
      * Convert an instance of this class to a polymorphic Address instance.
      */
     Address ConvertTo() const;
 
     /**
-     * \return the mac address in a 64 bit unsigned integer.
+     * @return the mac address in a 64 bit unsigned integer.
      *
      * Convert an instance of this class to a 64 bit unsigned integer.
      */
     uint64_t ConvertToInt() const;
 
     /**
-     * \param address address to test
-     * \returns true if the address matches, false otherwise.
+     * @param address address to test
+     * @returns true if the address matches, false otherwise.
      */
     static bool IsMatchingType(const Address& address);
     /**
      * Allocate a new Mac64Address.
-     * \returns newly allocated mac64Address
+     * @returns newly allocated mac64Address
      */
     static Mac64Address Allocate();
 
@@ -107,9 +107,9 @@
      * This function resets (to zero) the global integer
      * that is used for unique address allocation.
      * It is automatically called whenever
-     * \code
+     * @code
      * SimulatorDestroy ();
-     * \endcode
+     * @endcode
      * is called.  It may also be optionally called
      * by user code if there is a need to force a reset
      * of this allocation index.
@@ -118,53 +118,53 @@
 
   private:
     /**
-     * \brief Return the Type of address.
-     * \return type of address
+     * @brief Return the Type of address.
+     * @return type of address
      */
     static uint8_t GetType();
 
     /**
-     * \brief Equal to operator.
+     * @brief Equal to operator.
      *
-     * \param a the first operand
-     * \param b the first operand
-     * \returns true if the operands are equal
+     * @param a the first operand
+     * @param b the first operand
+     * @returns true if the operands are equal
      */
     friend bool operator==(const Mac64Address& a, const Mac64Address& b);
 
     /**
-     * \brief Not equal to operator.
+     * @brief Not equal to operator.
      *
-     * \param a the first operand
-     * \param b the first operand
-     * \returns true if the operands are not equal
+     * @param a the first operand
+     * @param b the first operand
+     * @returns true if the operands are not equal
      */
     friend bool operator!=(const Mac64Address& a, const Mac64Address& b);
 
     /**
-     * \brief Less than operator.
+     * @brief Less than operator.
      *
-     * \param a the first operand
-     * \param b the first operand
-     * \returns true if the operand a is less than operand b
+     * @param a the first operand
+     * @param b the first operand
+     * @returns true if the operand a is less than operand b
      */
     friend bool operator<(const Mac64Address& a, const Mac64Address& b);
 
     /**
-     * \brief Stream insertion operator.
+     * @brief Stream insertion operator.
      *
-     * \param os the stream
-     * \param address the address
-     * \returns a reference to the stream
+     * @param os the stream
+     * @param address the address
+     * @returns a reference to the stream
      */
     friend std::ostream& operator<<(std::ostream& os, const Mac64Address& address);
 
     /**
-     * \brief Stream extraction operator.
+     * @brief Stream extraction operator.
      *
-     * \param is the stream
-     * \param address the address
-     * \returns a reference to the stream
+     * @param is the stream
+     * @param address the address
+     * @returns a reference to the stream
      */
     friend std::istream& operator>>(std::istream& is, Mac64Address& address);
 
@@ -173,8 +173,8 @@
 };
 
 /**
- * \class ns3::Mac64AddressValue
- * \brief hold objects of type ns3::Mac64Address
+ * @class ns3::Mac64AddressValue
+ * @brief hold objects of type ns3::Mac64Address
  */
 
 ATTRIBUTE_HELPER_HEADER(Mac64Address);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/mac8-address.h ns-3.44/src/network/utils/mac8-address.h
--- ns-3.43/src/network/utils/mac8-address.h	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/mac8-address.h	2025-03-09 16:55:49.679372300 -0700
@@ -19,7 +19,7 @@
 class Address;
 
 /**
- * \ingroup network
+ * @ingroup network
  *
  * A class used for addressing MAC8 MAC's.
  *
@@ -36,7 +36,7 @@
     /**
      * Create Mac8Address object with address addr.
      *
-     * \param addr Byte address to assign to this address.
+     * @param addr Byte address to assign to this address.
      */
     Mac8Address(uint8_t addr);
     /** Destructor */
@@ -45,51 +45,51 @@
     /**
      * Convert a generic address to a Mac8Address.
      *
-     * \param address  Address to convert to Mac8Address address.
-     * \return Mac8Address from Address.
+     * @param address  Address to convert to Mac8Address address.
+     * @return Mac8Address from Address.
      */
     static Mac8Address ConvertFrom(const Address& address);
 
     /**
      * Convert to a generic Address.
      *
-     * \return The Address value.
+     * @return The Address value.
      */
     Address ConvertTo() const;
 
     /**
      * Check that a generic Address is compatible with Mac8Address.
      *
-     * \param address  Address to test.
-     * \return True if address given is consistent with Mac8Address.
+     * @param address  Address to test.
+     * @return True if address given is consistent with Mac8Address.
      */
     static bool IsMatchingType(const Address& address);
 
     /**
      * Create a generic Address.
      *
-     * \return The Address.
+     * @return The Address.
      */
     operator Address() const;
 
     /**
      * Sets address to address stored in parameter.
      *
-     * \param pBuffer Buffer to extract address from.
+     * @param pBuffer Buffer to extract address from.
      */
     void CopyFrom(const uint8_t* pBuffer);
 
     /**
      * Writes address to buffer parameter.
      *
-     * \param pBuffer
+     * @param pBuffer
      */
     void CopyTo(uint8_t* pBuffer) const;
 
     /**
      * Get the broadcast address (255).
      *
-     * \return Broadcast address.
+     * @return Broadcast address.
      */
     static Mac8Address GetBroadcast();
 
@@ -99,7 +99,7 @@
      * Will wrap back to 0 if more than 254 are allocated.
      * Excludes the broadcast address.
      *
-     * \return The next sequential Mac8Address.
+     * @return The next sequential Mac8Address.
      */
     static Mac8Address Allocate();
 
@@ -109,9 +109,9 @@
      * This function resets (to zero) the global integer
      * that is used for unique address allocation.
      * It is automatically called whenever
-     * \code
+     * @code
      * SimulatorDestroy ();
-     * \endcode
+     * @endcode
      * is called.  It may also be optionally called
      * by user code if there is a need to force a reset
      * of this allocation index.
@@ -125,7 +125,7 @@
     /**
      * Get the Mac8Address type.
      *
-     * \return The type value.
+     * @return The type value.
      */
     static uint8_t GetType();
 
@@ -140,45 +140,45 @@
 /**
  * Address comparison, less than.
  *
- * \param a First address to compare.
- * \param b Second address to compare.
- * \return True if a < b.
+ * @param a First address to compare.
+ * @param b Second address to compare.
+ * @return True if a < b.
  */
 bool operator<(const Mac8Address& a, const Mac8Address& b);
 
 /**
  * Address comparison, equality.
  *
- * \param a First address to compare.
- * \param b Second address to compare.
- * \return True if a == b.
+ * @param a First address to compare.
+ * @param b Second address to compare.
+ * @return True if a == b.
  */
 bool operator==(const Mac8Address& a, const Mac8Address& b);
 
 /**
  * Address comparison, unequal.
  *
- * \param a First address to compare.
- * \param b Second address to compare.
- * \return True if a != b.
+ * @param a First address to compare.
+ * @param b Second address to compare.
+ * @return True if a != b.
  */
 bool operator!=(const Mac8Address& a, const Mac8Address& b);
 
 /**
  * Write \pname{address} to stream \pname{os} as 8 bit integer.
  *
- * \param os The output stream.
- * \param address The address
- * \return The output stream.
+ * @param os The output stream.
+ * @param address The address
+ * @return The output stream.
  */
 std::ostream& operator<<(std::ostream& os, const Mac8Address& address);
 
 /**
  * Read \pname{address} from stream \pname{is} as 8 bit integer.
  *
- * \param is The input stream.
- * \param address The address variable to set.
- * \return The input stream.
+ * @param is The input stream.
+ * @param address The address variable to set.
+ * @return The input stream.
  */
 std::istream& operator>>(std::istream& is, Mac8Address& address);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/net-device-queue-interface.h ns-3.44/src/network/utils/net-device-queue-interface.h
--- ns-3.43/src/network/utils/net-device-queue-interface.h	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/net-device-queue-interface.h	2025-03-09 16:55:49.679372300 -0700
@@ -27,14 +27,14 @@
 class QueueItem;
 
 /**
- * \ingroup network
- * \defgroup netdevice Network Device
+ * @ingroup network
+ * @defgroup netdevice Network Device
  */
 
 /**
- * \ingroup netdevice
+ * @ingroup netdevice
  *
- * \brief Network device transmission queue
+ * @brief Network device transmission queue
  *
  * This class stores information about a single transmission queue
  * of a network device that is exposed to queue discs. Such information
@@ -47,8 +47,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -75,8 +75,8 @@
     virtual void Wake();
 
     /**
-     * \brief Get the status of the device transmission queue.
-     * \return true if the device transmission queue is stopped.
+     * @brief Get the status of the device transmission queue.
+     * @return true if the device transmission queue is stopped.
      *
      * Called by queue discs to enquire about the status of a given transmission queue.
      * This is the analogous to the netif_xmit_stopped function of the Linux kernel.
@@ -84,10 +84,10 @@
     virtual bool IsStopped() const;
 
     /**
-     * \brief Notify this NetDeviceQueue that the NetDeviceQueueInterface was
+     * @brief Notify this NetDeviceQueue that the NetDeviceQueueInterface was
      *        aggregated to an object.
      *
-     * \param ndqi the NetDeviceQueueInterface.
+     * @param ndqi the NetDeviceQueueInterface.
      *
      * This NetDeviceQueue stores a pointer to the NetDevice the NetDeviceQueueInterface
      * was aggregated to.
@@ -98,8 +98,8 @@
     typedef Callback<void> WakeCallback;
 
     /**
-     * \brief Set the wake callback
-     * \param cb the callback to set
+     * @brief Set the wake callback
+     * @param cb the callback to set
      *
      * Called by the traffic control layer to set the wake callback. The wake callback
      * is invoked by the device whenever it is needed to "wake" the upper layers (i.e.,
@@ -110,40 +110,40 @@
     virtual void SetWakeCallback(WakeCallback cb);
 
     /**
-     * \brief Called by the netdevice to report the number of bytes queued to the device queue
-     * \param bytes number of bytes queued to the device queue
+     * @brief Called by the netdevice to report the number of bytes queued to the device queue
+     * @param bytes number of bytes queued to the device queue
      */
     virtual void NotifyQueuedBytes(uint32_t bytes);
 
     /**
-     * \brief Called by the netdevice to report the number of bytes it is going to transmit
-     * \param bytes number of bytes the device is going to transmit
+     * @brief Called by the netdevice to report the number of bytes it is going to transmit
+     * @param bytes number of bytes the device is going to transmit
      */
     virtual void NotifyTransmittedBytes(uint32_t bytes);
 
     /**
-     * \brief Reset queue limits state
+     * @brief Reset queue limits state
      */
     void ResetQueueLimits();
 
     /**
-     * \brief Set queue limits to this queue
-     * \param ql the queue limits associated to this queue
+     * @brief Set queue limits to this queue
+     * @param ql the queue limits associated to this queue
      */
     void SetQueueLimits(Ptr<QueueLimits> ql);
 
     /**
-     * \brief Get queue limits to this queue
-     * \return the queue limits associated to this queue
+     * @brief Get queue limits to this queue
+     * @return the queue limits associated to this queue
      */
     Ptr<QueueLimits> GetQueueLimits();
 
     /**
-     * \brief Perform the actions required by flow control and dynamic queue
+     * @brief Perform the actions required by flow control and dynamic queue
      *        limits when a packet is enqueued in the queue of a netdevice
      *
-     * \param queue the device queue
-     * \param item the enqueued packet
+     * @param queue the device queue
+     * @param item the enqueued packet
      *
      * This method must be connected to the "Enqueue" traced callback of a Queue
      * object (through a bound callback) in order for a netdevice to support
@@ -153,12 +153,12 @@
     void PacketEnqueued(QueueType* queue, Ptr<const typename QueueType::ItemType> item);
 
     /**
-     * \brief Perform the actions required by flow control and dynamic queue
+     * @brief Perform the actions required by flow control and dynamic queue
      *        limits when a packet is dequeued (or dropped after dequeue) from
      *        the queue of a netdevice
      *
-     * \param queue the device queue
-     * \param item the dequeued packet
+     * @param queue the device queue
+     * @param item the dequeued packet
      *
      * This method must be connected to the "Dequeue" traced callback of a Queue
      * object (through a bound callback) in order for
@@ -168,12 +168,12 @@
     void PacketDequeued(QueueType* queue, Ptr<const typename QueueType::ItemType> item);
 
     /**
-     * \brief Perform the actions required by flow control and dynamic queue
+     * @brief Perform the actions required by flow control and dynamic queue
      *        limits when a packet is dropped before being enqueued in the queue
      *        of a netdevice (which likely indicates that the queue is full)
      *
-     * \param queue the device queue
-     * \param item the dropped packet
+     * @param queue the device queue
+     * @param item the dropped packet
      *
      * This method must be connected to the "DropBeforeEnqueue" traced callback
      * of a Queue object (through a bound callback) in order for a netdevice to
@@ -183,12 +183,12 @@
     void PacketDiscarded(QueueType* queue, Ptr<const typename QueueType::ItemType> item);
 
     /**
-     * \brief Connect the traced callbacks of a queue to the methods providing support
+     * @brief Connect the traced callbacks of a queue to the methods providing support
      *        for flow control and dynamic queue limits. A queue can be any object providing:
      *        - "Enqueue", "Dequeue", "DropBeforeEnqueue" traces
      *        - an ItemType typedef for the type of stored items
      *        - GetCurrentSize and GetMaxSize methods
-     * \param queue the queue
+     * @param queue the queue
      */
     template <typename QueueType>
     void ConnectQueueTraces(Ptr<QueueType> queue);
@@ -204,9 +204,9 @@
 };
 
 /**
- * \ingroup netdevice
+ * @ingroup netdevice
  *
- * \brief Network device transmission queue interface
+ * @brief Network device transmission queue interface
  *
  * This interface is used by the traffic control layer and by the aggregated
  * device to access the transmission queues of the device. Additionally, through
@@ -220,36 +220,36 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Constructor
+     * @brief Constructor
      */
     NetDeviceQueueInterface();
     ~NetDeviceQueueInterface() override;
 
     /**
-     * \brief Get the i-th transmission queue of the device.
+     * @brief Get the i-th transmission queue of the device.
      *
-     * \param i the index of the requested queue.
-     * \return the i-th transmission queue of the device.
+     * @param i the index of the requested queue.
+     * @return the i-th transmission queue of the device.
      *
      * The index of the first transmission queue is zero.
      */
     Ptr<NetDeviceQueue> GetTxQueue(std::size_t i) const;
 
     /**
-     * \brief Get the number of device transmission queues.
-     * \return the number of device transmission queues.
+     * @brief Get the number of device transmission queues.
+     * @return the number of device transmission queues.
      */
     std::size_t GetNTxQueues() const;
 
     /**
-     * \brief Set the type of device transmission queues to create.
-     * \param type type of device transmission queues to create.
+     * @brief Set the type of device transmission queues to create.
+     * @param type type of device transmission queues to create.
      *
      * This method is called when the TxQueuesType attribute is set to create
      * the corresponding type of device transmission queues. It cannot be
@@ -258,8 +258,8 @@
     void SetTxQueuesType(TypeId type);
 
     /**
-     * \brief Set the number of device transmission queues to create.
-     * \param numTxQueues number of device transmission queues to create.
+     * @brief Set the number of device transmission queues to create.
+     * @param numTxQueues number of device transmission queues to create.
      *
      * This method is called when the NTxQueues attribute is set to create
      * the corresponding number of device transmission queues. It cannot be
@@ -271,8 +271,8 @@
     typedef std::function<std::size_t(Ptr<QueueItem>)> SelectQueueCallback;
 
     /**
-     * \brief Set the select queue callback.
-     * \param cb the callback to set.
+     * @brief Set the select queue callback.
+     * @param cb the callback to set.
      *
      * This method is called to set the select queue callback, i.e., the
      * method used to select a device transmission queue for a given packet.
@@ -280,8 +280,8 @@
     void SetSelectQueueCallback(SelectQueueCallback cb);
 
     /**
-     * \brief Get the select queue callback.
-     * \return the select queue callback.
+     * @brief Get the select queue callback.
+     * @return the select queue callback.
      *
      * Called by the traffic control layer to get the select queue callback set
      * by a multi-queue device.
@@ -290,11 +290,11 @@
 
   protected:
     /**
-     * \brief Dispose of the object
+     * @brief Dispose of the object
      */
     void DoDispose() override;
     /**
-     * \brief Notify that an object was aggregated
+     * @brief Notify that an object was aggregated
      */
     void NotifyNewAggregate() override;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/output-stream-wrapper.h ns-3.44/src/network/utils/output-stream-wrapper.h
--- ns-3.43/src/network/utils/output-stream-wrapper.h	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/output-stream-wrapper.h	2025-03-09 16:55:49.679372300 -0700
@@ -51,7 +51,7 @@
  *     std::ostream *stream = streamWrapper->GetStream();
  *     *stream << "got packet" << std::endl;
  * }
- * \endcode
+ * @endcode
  *
  *
  * This class uses a basic ns-3 reference counting base class but is not
@@ -62,13 +62,13 @@
   public:
     /**
      * Constructor
-     * \param filename file name
-     * \param filemode std::ios::openmode flags
+     * @param filename file name
+     * @param filemode std::ios::openmode flags
      */
     OutputStreamWrapper(std::string filename, std::ios::openmode filemode);
     /**
      * Constructor
-     * \param os output stream
+     * @param os output stream
      */
     OutputStreamWrapper(std::ostream* os);
     ~OutputStreamWrapper();
@@ -76,9 +76,9 @@
     /**
      * Return a pointer to an ostream previously set in the wrapper.
      *
-     * \see SetStream
+     * @see SetStream
      *
-     * \returns a pointer to the encapsulated std::ostream
+     * @returns a pointer to the encapsulated std::ostream
      */
     std::ostream* GetStream();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/packetbb.h ns-3.44/src/network/utils/packetbb.h
--- ns-3.43/src/network/utils/packetbb.h	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/packetbb.h	2025-03-09 16:55:49.679372300 -0700
@@ -38,7 +38,7 @@
 };
 
 /**
- * \brief A block of packet or message TLVs (PbbTlv).
+ * @brief A block of packet or message TLVs (PbbTlv).
  *
  * Acts similar to a C++ STL container.  Should not be used for Address TLVs.
  */
@@ -54,105 +54,105 @@
     ~PbbTlvBlock();
 
     /**
-     * \return an iterator to the first TLV in this block.
+     * @return an iterator to the first TLV in this block.
      */
     Iterator Begin();
 
     /**
-     * \return a const iterator to the first TLV in this block.
+     * @return a const iterator to the first TLV in this block.
      */
     ConstIterator Begin() const;
 
     /**
-     * \return an iterator to the past-the-end element in this block.
+     * @return an iterator to the past-the-end element in this block.
      */
     Iterator End();
 
     /**
-     * \return a const iterator to the past-the-end element in this block.
+     * @return a const iterator to the past-the-end element in this block.
      */
     ConstIterator End() const;
 
     /**
-     * \return the number of TLVs in this block.
+     * @return the number of TLVs in this block.
      */
     int Size() const;
 
     /**
-     * \return true if there are no TLVs in this block, false otherwise.
+     * @return true if there are no TLVs in this block, false otherwise.
      */
     bool Empty() const;
 
     /**
-     * \return a smart pointer to the first TLV in this block.
+     * @return a smart pointer to the first TLV in this block.
      */
     Ptr<PbbTlv> Front() const;
 
     /**
-     * \return a smart pointer to the last TLV in this block.
+     * @return a smart pointer to the last TLV in this block.
      */
     Ptr<PbbTlv> Back() const;
 
     /**
-     * \brief Prepends a TLV to the front of this block.
-     * \param tlv a smart pointer to the TLV to prepend.
+     * @brief Prepends a TLV to the front of this block.
+     * @param tlv a smart pointer to the TLV to prepend.
      */
     void PushFront(Ptr<PbbTlv> tlv);
 
     /**
-     * \brief Removes a TLV from the front of this block.
+     * @brief Removes a TLV from the front of this block.
      */
     void PopFront();
 
     /**
-     * \brief Appends a TLV to the back of this block.
-     * \param tlv a smart pointer to the TLV to append.
+     * @brief Appends a TLV to the back of this block.
+     * @param tlv a smart pointer to the TLV to append.
      */
     void PushBack(Ptr<PbbTlv> tlv);
 
     /**
-     * \brief Removes a TLV from the back of this block.
+     * @brief Removes a TLV from the back of this block.
      */
     void PopBack();
 
     /**
-     * \brief Inserts a TLV at the specified position in this block.
-     * \param position an Iterator pointing to the position in this block to
+     * @brief Inserts a TLV at the specified position in this block.
+     * @param position an Iterator pointing to the position in this block to
      *        insert the TLV.
-     * \param tlv a smart pointer to the TLV to insert.
-     * \return An iterator pointing to the newly inserted TLV.
+     * @param tlv a smart pointer to the TLV to insert.
+     * @return An iterator pointing to the newly inserted TLV.
      */
     Iterator Insert(Iterator position, const Ptr<PbbTlv> tlv);
 
     /**
-     * \brief Removes the TLV at the specified position.
-     * \param position an Iterator pointing to the TLV to erase.
-     * \return an iterator pointing to the next TLV in the block.
+     * @brief Removes the TLV at the specified position.
+     * @param position an Iterator pointing to the TLV to erase.
+     * @return an iterator pointing to the next TLV in the block.
      */
     Iterator Erase(Iterator position);
 
     /**
-     * \brief Removes all TLVs from [first, last) (includes first, not includes
+     * @brief Removes all TLVs from [first, last) (includes first, not includes
      *        last).
-     * \param first an Iterator pointing to the first TLV to erase (inclusive).
-     * \param last an Iterator pointing to the element past the last TLV to erase.
-     * \return an iterator pointing to the next TLV in the block.
+     * @param first an Iterator pointing to the first TLV to erase (inclusive).
+     * @param last an Iterator pointing to the element past the last TLV to erase.
+     * @return an iterator pointing to the next TLV in the block.
      */
     Iterator Erase(Iterator first, Iterator last);
 
     /**
-     * \brief Removes all TLVs from this block.
+     * @brief Removes all TLVs from this block.
      */
     void Clear();
 
     /**
-     * \return The size (in bytes) needed to serialize this block.
+     * @return The size (in bytes) needed to serialize this block.
      */
     uint32_t GetSerializedSize() const;
 
     /**
-     * \brief Serializes this block into the specified buffer.
-     * \param start a reference to the point in a buffer to begin serializing.
+     * @brief Serializes this block into the specified buffer.
+     * @param start a reference to the point in a buffer to begin serializing.
      *
      * Users should not need to call this.  Blocks will be serialized by their
      * containing packet.
@@ -160,8 +160,8 @@
     void Serialize(Buffer::Iterator& start) const;
 
     /**
-     * \brief Deserializes a block from the specified buffer.
-     * \param start a reference to the point in a buffer to begin deserializing.
+     * @brief Deserializes a block from the specified buffer.
+     * @param start a reference to the point in a buffer to begin deserializing.
      *
      * Users should not need to call this.  Blocks will be deserialized by their
      * containing packet.
@@ -169,15 +169,15 @@
     void Deserialize(Buffer::Iterator& start);
 
     /**
-     * \brief Pretty-prints the contents of this block.
-     * \param os a stream object to print to.
+     * @brief Pretty-prints the contents of this block.
+     * @param os a stream object to print to.
      */
     void Print(std::ostream& os) const;
 
     /**
-     * \brief Pretty-prints the contents of this block, with specified indentation.
-     * \param os a stream object to print to.
-     * \param level level of indentation.
+     * @brief Pretty-prints the contents of this block, with specified indentation.
+     * @param os a stream object to print to.
+     * @param level level of indentation.
      *
      * This probably never needs to be called by users.  This is used when
      * recursively printing sub-objects.
@@ -185,15 +185,15 @@
     void Print(std::ostream& os, int level) const;
 
     /**
-     * \brief Equality operator for PbbTlvBlock
-     * \param other PbbTlvBlock to compare this one to
-     * \returns true if the blocks are equal
+     * @brief Equality operator for PbbTlvBlock
+     * @param other PbbTlvBlock to compare this one to
+     * @returns true if the blocks are equal
      */
     bool operator==(const PbbTlvBlock& other) const;
     /**
-     * \brief Inequality operator for PbbTlvBlock
-     * \param other PbbTlvBlock to compare this one to
-     * \returns true if the blocks are not equal
+     * @brief Inequality operator for PbbTlvBlock
+     * @param other PbbTlvBlock to compare this one to
+     * @returns true if the blocks are not equal
      */
     bool operator!=(const PbbTlvBlock& other) const;
 
@@ -202,7 +202,7 @@
 };
 
 /**
- * \brief A block of Address TLVs (PbbAddressTlv).
+ * @brief A block of Address TLVs (PbbAddressTlv).
  *
  * Acts similar to a C++ STL container.
  */
@@ -218,107 +218,107 @@
     ~PbbAddressTlvBlock();
 
     /**
-     * \return an iterator to the first Address TLV in this block.
+     * @return an iterator to the first Address TLV in this block.
      */
     Iterator Begin();
 
     /**
-     * \return a const iterator to the first Address TLV in this block.
+     * @return a const iterator to the first Address TLV in this block.
      */
     ConstIterator Begin() const;
 
     /**
-     * \return an iterator to the past-the-end element in this block.
+     * @return an iterator to the past-the-end element in this block.
      */
     Iterator End();
 
     /**
-     * \return a const iterator to the past-the-end element in this block.
+     * @return a const iterator to the past-the-end element in this block.
      */
     ConstIterator End() const;
 
     /**
-     * \return the number of Address TLVs in this block.
+     * @return the number of Address TLVs in this block.
      */
     int Size() const;
 
     /**
-     * \return true if there are no Address TLVs in this block, false otherwise.
+     * @return true if there are no Address TLVs in this block, false otherwise.
      */
     bool Empty() const;
 
     /**
-     * \return the first Address TLV in this block.
+     * @return the first Address TLV in this block.
      */
     Ptr<PbbAddressTlv> Front() const;
 
     /**
-     * \return the last AddressTLV in this block.
+     * @return the last AddressTLV in this block.
      */
     Ptr<PbbAddressTlv> Back() const;
 
     /**
-     * \brief Prepends an Address TLV to the front of this block.
-     * \param tlv a smart pointer to the Address TLV to prepend.
+     * @brief Prepends an Address TLV to the front of this block.
+     * @param tlv a smart pointer to the Address TLV to prepend.
      */
     void PushFront(Ptr<PbbAddressTlv> tlv);
 
     /**
-     * \brief Removes an AddressTLV from the front of this block.
+     * @brief Removes an AddressTLV from the front of this block.
      */
     void PopFront();
 
     /**
-     * \brief Appends an Address TLV to the back of this block.
-     * \param tlv a smart pointer to the Address TLV to append.
+     * @brief Appends an Address TLV to the back of this block.
+     * @param tlv a smart pointer to the Address TLV to append.
      */
     void PushBack(Ptr<PbbAddressTlv> tlv);
 
     /**
-     * \brief Removes an Address TLV from the back of this block.
+     * @brief Removes an Address TLV from the back of this block.
      */
     void PopBack();
 
     /**
-     * \brief Inserts an Address TLV at the specified position in this block.
-     * \param position an Iterator pointing to the position in this block to
+     * @brief Inserts an Address TLV at the specified position in this block.
+     * @param position an Iterator pointing to the position in this block to
      *        insert the Address TLV.
-     * \param tlv a smart pointer to the Address TLV to insert.
-     * \return An iterator pointing to the newly inserted Address TLV.
+     * @param tlv a smart pointer to the Address TLV to insert.
+     * @return An iterator pointing to the newly inserted Address TLV.
      */
     Iterator Insert(Iterator position, const Ptr<PbbAddressTlv> tlv);
 
     /**
-     * \brief Removes the Address TLV at the specified position.
-     * \param position an Iterator pointing to the Address TLV to erase.
-     * \return an iterator pointing to the next Address TLV in the block.
+     * @brief Removes the Address TLV at the specified position.
+     * @param position an Iterator pointing to the Address TLV to erase.
+     * @return an iterator pointing to the next Address TLV in the block.
      */
     Iterator Erase(Iterator position);
 
     /**
-     * \brief Removes all Address TLVs from [first, last) (includes first, not
+     * @brief Removes all Address TLVs from [first, last) (includes first, not
      *        includes last).
-     * \param first an Iterator pointing to the first Address TLV to erase
+     * @param first an Iterator pointing to the first Address TLV to erase
      *        (inclusive).
-     * \param last an Iterator pointing to the element past the last Address TLV
+     * @param last an Iterator pointing to the element past the last Address TLV
      *        to erase.
-     * \return an iterator pointing to the next Address TLV in the block.
+     * @return an iterator pointing to the next Address TLV in the block.
      */
     Iterator Erase(Iterator first, Iterator last);
 
     /**
-     * \brief Removes all Address TLVs from this block.
+     * @brief Removes all Address TLVs from this block.
      */
     void Clear();
 
     /**
-     * \return The size (in bytes) needed to serialize this block.
+     * @return The size (in bytes) needed to serialize this block.
      */
     uint32_t GetSerializedSize() const;
 
     /**
-     * \brief Serializes this block into the specified buffer.
-     * \param start a reference to the point in a buffer to begin serializing.
+     * @brief Serializes this block into the specified buffer.
+     * @param start a reference to the point in a buffer to begin serializing.
      *
      * Users should not need to call this.  Blocks will be serialized by their
      * containing packet.
@@ -326,8 +326,8 @@
     void Serialize(Buffer::Iterator& start) const;
 
     /**
-     * \brief Deserializes a block from the specified buffer.
-     * \param start a reference to the point in a buffer to begin deserializing.
+     * @brief Deserializes a block from the specified buffer.
+     * @param start a reference to the point in a buffer to begin deserializing.
      *
      * Users should not need to call this.  Blocks will be deserialized by their
      * containing packet.
@@ -335,15 +335,15 @@
     void Deserialize(Buffer::Iterator& start);
 
     /**
-     * \brief Pretty-prints the contents of this block.
-     * \param os a stream object to print to.
+     * @brief Pretty-prints the contents of this block.
+     * @param os a stream object to print to.
      */
     void Print(std::ostream& os) const;
 
     /**
-     * \brief Pretty-prints the contents of this block, with specified indentation.
-     * \param os a stream object to print to.
-     * \param level level of indentation.
+     * @brief Pretty-prints the contents of this block, with specified indentation.
+     * @param os a stream object to print to.
+     * @param level level of indentation.
      *
      * This probably never needs to be called by users.  This is used when
      * recursively printing sub-objects.
@@ -351,16 +351,16 @@
     void Print(std::ostream& os, int level) const;
 
     /**
-     * \brief Equality operator for PbbAddressTlvBlock
-     * \param other PbbAddressTlvBlock to compare to this one
-     * \returns true if PbbAddressTlvBlock are equal
+     * @brief Equality operator for PbbAddressTlvBlock
+     * @param other PbbAddressTlvBlock to compare to this one
+     * @returns true if PbbAddressTlvBlock are equal
      */
     bool operator==(const PbbAddressTlvBlock& other) const;
 
     /**
-     * \brief Inequality operator for PbbAddressTlvBlock
-     * \param other PbbAddressTlvBlock to compare to this one
-     * \returns true if PbbAddressTlvBlock are not equal
+     * @brief Inequality operator for PbbAddressTlvBlock
+     * @param other PbbAddressTlvBlock to compare to this one
+     * @returns true if PbbAddressTlvBlock are not equal
      */
     bool operator!=(const PbbAddressTlvBlock& other) const;
 
@@ -369,7 +369,7 @@
 };
 
 /**
- * \brief Main PacketBB Packet object.
+ * @brief Main PacketBB Packet object.
  *
  * A PacketBB packet is made up of zero or more packet TLVs (PbbTlv), and zero
  * or more messages (PbbMessage).
@@ -392,20 +392,20 @@
     ~PbbPacket() override;
 
     /**
-     * \return the version of PacketBB that constructed this packet.
+     * @return the version of PacketBB that constructed this packet.
      *
      * This will always return 0 for packets constructed using this API.
      */
     uint8_t GetVersion() const;
 
     /**
-     * \brief Sets the sequence number of this packet.
-     * \param number the sequence number.
+     * @brief Sets the sequence number of this packet.
+     * @param number the sequence number.
      */
     void SetSequenceNumber(uint16_t number);
 
     /**
-     * \return the sequence number of this packet.
+     * @return the sequence number of this packet.
      *
      * Calling this while HasSequenceNumber is False is undefined.  Make sure you
      * check it first.  This will be checked by an assert in debug builds.
@@ -413,8 +413,8 @@
     uint16_t GetSequenceNumber() const;
 
     /**
-     * \brief Tests whether or not this packet has a sequence number.
-     * \return true if this packet has a sequence number, false otherwise.
+     * @brief Tests whether or not this packet has a sequence number.
+     * @return true if this packet has a sequence number, false otherwise.
      *
      * This should be called before calling GetSequenceNumber to make sure there
      * actually is one.
@@ -422,232 +422,232 @@
     bool HasSequenceNumber() const;
 
     /**
-     * \brief Forces a packet to write a TLV list even if it's empty, ignoring
+     * @brief Forces a packet to write a TLV list even if it's empty, ignoring
      * the phastlv bit.
      *
      * This is mainly used to check the Deserialization of a questionable
      * but correct packet (see test 3).
      *
-     * \param forceTlv true will force TLV to be written even if no TLV is set.
+     * @param forceTlv true will force TLV to be written even if no TLV is set.
      */
     void ForceTlv(bool forceTlv);
 
     /* Manipulating Packet TLVs */
 
     /**
-     * \return an iterator to the first Packet TLV in this packet.
+     * @return an iterator to the first Packet TLV in this packet.
      */
     TlvIterator TlvBegin();
 
     /**
-     * \return a const iterator to the first Packet TLV in this packet.
+     * @return a const iterator to the first Packet TLV in this packet.
      */
     ConstTlvIterator TlvBegin() const;
 
     /**
-     * \return an iterator to the past-the-end element in this packet TLV block.
+     * @return an iterator to the past-the-end element in this packet TLV block.
      */
     TlvIterator TlvEnd();
 
     /**
-     * \return a const iterator to the past-the-end element in this packet TLV
+     * @return a const iterator to the past-the-end element in this packet TLV
      *         block.
      */
     ConstTlvIterator TlvEnd() const;
 
     /**
-     * \return the number of packet TLVs in this packet.
+     * @return the number of packet TLVs in this packet.
      */
     int TlvSize() const;
 
     /**
-     * \return true if there are no packet TLVs in this packet, false otherwise.
+     * @return true if there are no packet TLVs in this packet, false otherwise.
      */
     bool TlvEmpty() const;
 
     /**
-     * \return a smart pointer to the first packet TLV in this packet.
+     * @return a smart pointer to the first packet TLV in this packet.
      */
     Ptr<PbbTlv> TlvFront();
 
     /**
-     * \return a const smart pointer to the first packet TLV in this packet.
+     * @return a const smart pointer to the first packet TLV in this packet.
      */
     const Ptr<PbbTlv> TlvFront() const;
 
     /**
-     * \return a smart pointer to the last packet TLV in this packet.
+     * @return a smart pointer to the last packet TLV in this packet.
      */
     Ptr<PbbTlv> TlvBack();
 
     /**
-     * \return a const smart pointer to the last packet TLV in this packet.
+     * @return a const smart pointer to the last packet TLV in this packet.
      */
     const Ptr<PbbTlv> TlvBack() const;
 
     /**
-     * \brief Prepends a packet TLV to the front of this packet.
-     * \param tlv a smart pointer to the packet TLV to prepend.
+     * @brief Prepends a packet TLV to the front of this packet.
+     * @param tlv a smart pointer to the packet TLV to prepend.
      */
     void TlvPushFront(Ptr<PbbTlv> tlv);
 
     /**
-     * \brief Removes a packet TLV from the front of this packet.
+     * @brief Removes a packet TLV from the front of this packet.
      */
     void TlvPopFront();
 
     /**
-     * \brief Appends a packet TLV to the back of this packet.
-     * \param tlv a smart pointer to the packet TLV to append.
+     * @brief Appends a packet TLV to the back of this packet.
+     * @param tlv a smart pointer to the packet TLV to append.
      */
     void TlvPushBack(Ptr<PbbTlv> tlv);
 
     /**
-     * \brief Removes a packet TLV from the back of this block.
+     * @brief Removes a packet TLV from the back of this block.
      */
     void TlvPopBack();
 
     /**
-     * \brief Removes the packet TLV at the specified position.
-     * \param position an Iterator pointing to the packet TLV to erase.
-     * \return an iterator pointing to the next packet TLV in the block.
+     * @brief Removes the packet TLV at the specified position.
+     * @param position an Iterator pointing to the packet TLV to erase.
+     * @return an iterator pointing to the next packet TLV in the block.
      */
     TlvIterator Erase(TlvIterator position);
 
     /**
-     * \brief Removes all packet TLVs from [first, last) (includes first, not
+     * @brief Removes all packet TLVs from [first, last) (includes first, not
      *        includes last).
-     * \param first an Iterator pointing to the first packet TLV to erase
+     * @param first an Iterator pointing to the first packet TLV to erase
      *        (inclusive).
-     * \param last an Iterator pointing to the element past the last packet TLV
+     * @param last an Iterator pointing to the element past the last packet TLV
      *        to erase.
-     * \return an iterator pointing to the next packet TLV in the block.
+     * @return an iterator pointing to the next packet TLV in the block.
      */
     TlvIterator Erase(TlvIterator first, TlvIterator last);
 
     /**
-     * \brief Removes all packet TLVs from this packet.
+     * @brief Removes all packet TLVs from this packet.
      */
     void TlvClear();
 
     /* Manipulating Packet Messages */
 
     /**
-     * \return an iterator to the first message in this packet.
+     * @return an iterator to the first message in this packet.
      */
     MessageIterator MessageBegin();
 
     /**
-     * \return a const iterator to the first message in this packet.
+     * @return a const iterator to the first message in this packet.
      */
     ConstMessageIterator MessageBegin() const;
 
     /**
-     * \return an iterator to the past-the-end element in this message block.
+     * @return an iterator to the past-the-end element in this message block.
      */
     MessageIterator MessageEnd();
 
     /**
-     * \return a const iterator to the past-the-end element in this message
+     * @return a const iterator to the past-the-end element in this message
      *         block.
      */
     ConstMessageIterator MessageEnd() const;
 
     /**
-     * \return the number of messages in this packet.
+     * @return the number of messages in this packet.
      */
     int MessageSize() const;
 
     /**
-     * \return true if there are no messages in this packet, false otherwise.
+     * @return true if there are no messages in this packet, false otherwise.
      */
     bool MessageEmpty() const;
 
     /**
-     * \return a smart pointer to the first message in this packet.
+     * @return a smart pointer to the first message in this packet.
      */
     Ptr<PbbMessage> MessageFront();
 
     /**
-     * \return a const smart pointer to the first message in this packet.
+     * @return a const smart pointer to the first message in this packet.
      */
     const Ptr<PbbMessage> MessageFront() const;
 
     /**
-     * \return a smart pointer to the last message in this packet.
+     * @return a smart pointer to the last message in this packet.
      */
     Ptr<PbbMessage> MessageBack();
 
     /**
-     * \return a const smart pointer to the last message in this packet.
+     * @return a const smart pointer to the last message in this packet.
      */
     const Ptr<PbbMessage> MessageBack() const;
 
     /**
-     * \brief Prepends a message to the front of this packet.
-     * \param message a smart pointer to the message to prepend.
+     * @brief Prepends a message to the front of this packet.
+     * @param message a smart pointer to the message to prepend.
      */
     void MessagePushFront(Ptr<PbbMessage> message);
 
     /**
-     * \brief Removes a message from the front of this packet.
+     * @brief Removes a message from the front of this packet.
      */
     void MessagePopFront();
 
     /**
-     * \brief Appends a message to the back of this packet.
-     * \param message a smart pointer to the message to append.
+     * @brief Appends a message to the back of this packet.
+     * @param message a smart pointer to the message to append.
      */
     void MessagePushBack(Ptr<PbbMessage> message);
 
     /**
-     * \brief Removes a message from the back of this packet.
+     * @brief Removes a message from the back of this packet.
      */
     void MessagePopBack();
 
     /**
-     * \brief Removes the message at the specified position.
-     * \param position an Iterator pointing to the message to erase.
-     * \return an iterator pointing to the next message in the packet.
+     * @brief Removes the message at the specified position.
+     * @param position an Iterator pointing to the message to erase.
+     * @return an iterator pointing to the next message in the packet.
      */
     MessageIterator Erase(MessageIterator position);
 
     /**
-     * \brief Removes all messages from [first, last) (includes first, not
+     * @brief Removes all messages from [first, last) (includes first, not
      *        includes last).
-     * \param first an Iterator pointing to the first message to erase (inclusive).
-     * \param last an Iterator pointing to the element past the last message to erase.
-     * \return an iterator pointing to the next message in the block.
+     * @param first an Iterator pointing to the first message to erase (inclusive).
+     * @param last an Iterator pointing to the element past the last message to erase.
+     * @return an iterator pointing to the next message in the block.
      */
     MessageIterator Erase(MessageIterator first, MessageIterator last);
 
     /**
-     * \brief Removes all messages from this packet.
+     * @brief Removes all messages from this packet.
      */
     void MessageClear();
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
 
     /**
-     * \return The size (in bytes) needed to serialize this packet.
+     * @return The size (in bytes) needed to serialize this packet.
      */
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Serializes this packet into the specified buffer.
-     * \param start a reference to the point in a buffer to begin serializing.
+     * @brief Serializes this packet into the specified buffer.
+     * @param start a reference to the point in a buffer to begin serializing.
      */
     void Serialize(Buffer::Iterator start) const override;
 
     /**
-     * \brief Deserializes a packet from the specified buffer.
-     * \param start start offset
-     * \return the number of bytes deserialized
+     * @brief Deserializes a packet from the specified buffer.
+     * @param start start offset
+     * @return the number of bytes deserialized
      *
      * If this returns a number smaller than the total number of bytes in the
      * buffer, there was an error.
@@ -655,22 +655,22 @@
     uint32_t Deserialize(Buffer::Iterator start) override;
 
     /**
-     * \brief Pretty-prints the contents of this block.
-     * \param os a stream object to print to.
+     * @brief Pretty-prints the contents of this block.
+     * @param os a stream object to print to.
      */
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Equality operator for PbbPacket
-     * \param other PbbPacket to compare to this one
-     * \returns true if PbbPacket are equal
+     * @brief Equality operator for PbbPacket
+     * @param other PbbPacket to compare to this one
+     * @returns true if PbbPacket are equal
      */
     bool operator==(const PbbPacket& other) const;
 
     /**
-     * \brief Inequality operator for PbbPacket
-     * \param other PbbPacket to compare to this one
-     * \returns true if PbbPacket are not equal
+     * @brief Inequality operator for PbbPacket
+     * @param other PbbPacket to compare to this one
+     * @returns true if PbbPacket are not equal
      */
     bool operator!=(const PbbPacket& other) const;
 
@@ -687,7 +687,7 @@
 };
 
 /**
- * \brief A message within a PbbPacket packet.
+ * @brief A message within a PbbPacket packet.
  *
  * There may be any number of messages in one packet packet.  This is a pure
  * virtual base class, when creating a message, you should instantiate either
@@ -709,24 +709,24 @@
     virtual ~PbbMessage();
 
     /**
-     * \brief Sets the type for this message.
-     * \param type the type to set.
+     * @brief Sets the type for this message.
+     * @param type the type to set.
      */
     void SetType(uint8_t type);
 
     /**
-     * \return the type assigned to this packet
+     * @return the type assigned to this packet
      */
     uint8_t GetType() const;
 
     /**
-     * \brief Sets the address for the node that created this packet.
-     * \param address the originator address.
+     * @brief Sets the address for the node that created this packet.
+     * @param address the originator address.
      */
     void SetOriginatorAddress(Address address);
 
     /**
-     * \return the address of the node that created this packet.
+     * @return the address of the node that created this packet.
      *
      * Calling this while HasOriginatorAddress is False is undefined.  Make sure
      * you check it first.  This will be checked by an assert in debug builds.
@@ -734,19 +734,19 @@
     Address GetOriginatorAddress() const;
 
     /**
-     * \brief Tests whether or not this message has an originator address.
-     * \return true if this message has an originator address, false otherwise.
+     * @brief Tests whether or not this message has an originator address.
+     * @return true if this message has an originator address, false otherwise.
      */
     bool HasOriginatorAddress() const;
 
     /**
-     * \brief Sets the maximum number of hops this message should travel
-     * \param hoplimit the limit to set
+     * @brief Sets the maximum number of hops this message should travel
+     * @param hoplimit the limit to set
      */
     void SetHopLimit(uint8_t hoplimit);
 
     /**
-     * \return the maximum number of hops this message should travel.
+     * @return the maximum number of hops this message should travel.
      *
      * Calling this while HasHopLimit is False is undefined.  Make sure you check
      * it first.  This will be checked by an assert in debug builds.
@@ -754,21 +754,21 @@
     uint8_t GetHopLimit() const;
 
     /**
-     * \brief Tests whether or not this message has a hop limit.
-     * \return true if this message has a hop limit, false otherwise.
+     * @brief Tests whether or not this message has a hop limit.
+     * @return true if this message has a hop limit, false otherwise.
      *
      * If this is set, messages should not hop further than this limit.
      */
     bool HasHopLimit() const;
 
     /**
-     * \brief Sets the current number of hops this message has traveled.
-     * \param hopcount the current number of hops
+     * @brief Sets the current number of hops this message has traveled.
+     * @param hopcount the current number of hops
      */
     void SetHopCount(uint8_t hopcount);
 
     /**
-     * \return the current number of hops this message has traveled.
+     * @return the current number of hops this message has traveled.
      *
      * Calling this while HasHopCount is False is undefined.  Make sure you check
      * it first.  This will be checked by an assert in debug builds.
@@ -776,19 +776,19 @@
     uint8_t GetHopCount() const;
 
     /**
-     * \brief Tests whether or not this message has a hop count.
-     * \return true if this message has a hop limit, false otherwise.
+     * @brief Tests whether or not this message has a hop count.
+     * @return true if this message has a hop limit, false otherwise.
      */
     bool HasHopCount() const;
 
     /**
-     * \brief Sets the sequence number of this message.
-     * \param seqnum the sequence number to set.
+     * @brief Sets the sequence number of this message.
+     * @param seqnum the sequence number to set.
      */
     void SetSequenceNumber(uint16_t seqnum);
 
     /**
-     * \return the sequence number of this message.
+     * @return the sequence number of this message.
      *
      * Calling this while HasSequenceNumber is False is undefined.  Make sure you
      * check it first.  This will be checked by an assert in debug builds.
@@ -796,215 +796,215 @@
     uint16_t GetSequenceNumber() const;
 
     /**
-     * \brief Tests whether or not this message has a sequence number.
-     * \return true if this message has a sequence number, false otherwise.
+     * @brief Tests whether or not this message has a sequence number.
+     * @return true if this message has a sequence number, false otherwise.
      */
     bool HasSequenceNumber() const;
 
     /* Manipulating PbbMessage TLVs */
 
     /**
-     * \return an iterator to the first message TLV in this message.
+     * @return an iterator to the first message TLV in this message.
      */
     TlvIterator TlvBegin();
 
     /**
-     * \return a const iterator to the first message TLV in this message.
+     * @return a const iterator to the first message TLV in this message.
      */
     ConstTlvIterator TlvBegin() const;
 
     /**
-     * \return an iterator to the past-the-end message TLV element in this
+     * @return an iterator to the past-the-end message TLV element in this
      *         message.
      */
     TlvIterator TlvEnd();
 
     /**
-     * \return a const iterator to the past-the-end message TLV element in this
+     * @return a const iterator to the past-the-end message TLV element in this
      *         message.
      */
     ConstTlvIterator TlvEnd() const;
 
     /**
-     * \return the number of message TLVs in this message.
+     * @return the number of message TLVs in this message.
      */
     int TlvSize() const;
 
     /**
-     * \return true if there are no message TLVs in this message, false otherwise.
+     * @return true if there are no message TLVs in this message, false otherwise.
      */
     bool TlvEmpty() const;
 
     /**
-     * \return a smart pointer to the first message TLV in this message.
+     * @return a smart pointer to the first message TLV in this message.
      */
     Ptr<PbbTlv> TlvFront();
 
     /**
-     * \return a const smart pointer to the first message TLV in this message.
+     * @return a const smart pointer to the first message TLV in this message.
      */
     const Ptr<PbbTlv> TlvFront() const;
 
     /**
-     * \return a smart pointer to the last message TLV in this message.
+     * @return a smart pointer to the last message TLV in this message.
      */
     Ptr<PbbTlv> TlvBack();
 
     /**
-     * \return a const smart pointer to the last message TLV in this message.
+     * @return a const smart pointer to the last message TLV in this message.
      */
     const Ptr<PbbTlv> TlvBack() const;
 
     /**
-     * \brief Prepends a message TLV to the front of this message.
-     * \param tlv a smart pointer to the message TLV to prepend.
+     * @brief Prepends a message TLV to the front of this message.
+     * @param tlv a smart pointer to the message TLV to prepend.
      */
     void TlvPushFront(Ptr<PbbTlv> tlv);
 
     /**
-     * \brief Removes a message TLV from the front of this message.
+     * @brief Removes a message TLV from the front of this message.
      */
     void TlvPopFront();
 
     /**
-     * \brief Appends a message TLV to the back of this message.
-     * \param tlv a smart pointer to the message TLV to append.
+     * @brief Appends a message TLV to the back of this message.
+     * @param tlv a smart pointer to the message TLV to append.
      */
     void TlvPushBack(Ptr<PbbTlv> tlv);
 
     /**
-     * \brief Removes a message TLV from the back of this message.
+     * @brief Removes a message TLV from the back of this message.
      */
     void TlvPopBack();
 
     /**
-     * \brief Removes the message TLV at the specified position.
-     * \param position an Iterator pointing to the message TLV to erase.
-     * \return an iterator pointing to the next TLV in the block.
+     * @brief Removes the message TLV at the specified position.
+     * @param position an Iterator pointing to the message TLV to erase.
+     * @return an iterator pointing to the next TLV in the block.
      */
     TlvIterator TlvErase(TlvIterator position);
 
     /**
-     * \brief Removes all message TLVs from [first, last) (includes first, not
+     * @brief Removes all message TLVs from [first, last) (includes first, not
      *        includes last).
-     * \param first an Iterator pointing to the first message TLV to erase
+     * @param first an Iterator pointing to the first message TLV to erase
      *        (inclusive).
-     * \param last an Iterator pointing to the element past the last message TLV
+     * @param last an Iterator pointing to the element past the last message TLV
      *        to erase.
-     * \return an iterator pointing to the next message TLV in the message.
+     * @return an iterator pointing to the next message TLV in the message.
      */
     TlvIterator TlvErase(TlvIterator first, TlvIterator last);
 
     /**
-     * \brief Removes all message TLVs from this block.
+     * @brief Removes all message TLVs from this block.
      */
     void TlvClear();
 
     /* Manipulating Address Block and Address TLV pairs */
 
     /**
-     * \return an iterator to the first address block in this message.
+     * @return an iterator to the first address block in this message.
      */
     AddressBlockIterator AddressBlockBegin();
 
     /**
-     * \return a const iterator to the first address block in this message.
+     * @return a const iterator to the first address block in this message.
      */
     ConstAddressBlockIterator AddressBlockBegin() const;
 
     /**
-     * \return an iterator to the past-the-end address block element in this
+     * @return an iterator to the past-the-end address block element in this
      *         message.
      */
     AddressBlockIterator AddressBlockEnd();
 
     /**
-     * \return a const iterator to the past-the-end address block element in this
+     * @return a const iterator to the past-the-end address block element in this
      *         message.
      */
     ConstAddressBlockIterator AddressBlockEnd() const;
 
     /**
-     * \return the number of address blocks in this message.
+     * @return the number of address blocks in this message.
      */
     int AddressBlockSize() const;
 
     /**
-     * \return true if there are no address blocks in this message, false
+     * @return true if there are no address blocks in this message, false
      *         otherwise.
      */
     bool AddressBlockEmpty() const;
 
     /**
-     * \return a smart pointer to the first address block in this message.
+     * @return a smart pointer to the first address block in this message.
      */
     Ptr<PbbAddressBlock> AddressBlockFront();
 
     /**
-     * \return a const smart pointer to the first address block in this message.
+     * @return a const smart pointer to the first address block in this message.
      */
     const Ptr<PbbAddressBlock> AddressBlockFront() const;
 
     /**
-     * \return a smart pointer to the last address block in this message.
+     * @return a smart pointer to the last address block in this message.
      */
     Ptr<PbbAddressBlock> AddressBlockBack();
 
     /**
-     * \return a const smart pointer to the last address block in this message.
+     * @return a const smart pointer to the last address block in this message.
      */
     const Ptr<PbbAddressBlock> AddressBlockBack() const;
 
     /**
-     * \brief Prepends an address block to the front of this message.
-     * \param block a smart pointer to the address block to prepend.
+     * @brief Prepends an address block to the front of this message.
+     * @param block a smart pointer to the address block to prepend.
      */
     void AddressBlockPushFront(Ptr<PbbAddressBlock> block);
 
     /**
-     * \brief Removes an address block from the front of this message.
+     * @brief Removes an address block from the front of this message.
      */
     void AddressBlockPopFront();
 
     /**
-     * \brief Appends an address block to the front of this message.
-     * \param block a smart pointer to the address block to append.
+     * @brief Appends an address block to the front of this message.
+     * @param block a smart pointer to the address block to append.
      */
     void AddressBlockPushBack(Ptr<PbbAddressBlock> block);
 
     /**
-     * \brief Removes an address block from the back of this message.
+     * @brief Removes an address block from the back of this message.
      */
     void AddressBlockPopBack();
 
     /**
-     * \brief Removes the address block at the specified position.
-     * \param position an Iterator pointing to the address block to erase.
-     * \return an iterator pointing to the next address block in the message.
+     * @brief Removes the address block at the specified position.
+     * @param position an Iterator pointing to the address block to erase.
+     * @return an iterator pointing to the next address block in the message.
      */
     AddressBlockIterator AddressBlockErase(AddressBlockIterator position);
 
     /**
-     * \brief Removes all address blocks from [first, last) (includes first, not
+     * @brief Removes all address blocks from [first, last) (includes first, not
      *        includes last).
-     * \param first an Iterator pointing to the first address block to erase
+     * @param first an Iterator pointing to the first address block to erase
      *        (inclusive).
-     * \param last an Iterator pointing to the element past the last address
+     * @param last an Iterator pointing to the element past the last address
      *        block to erase.
-     * \return an iterator pointing to the next address block in the message.
+     * @return an iterator pointing to the next address block in the message.
      */
     AddressBlockIterator AddressBlockErase(AddressBlockIterator first, AddressBlockIterator last);
 
     /**
-     * \brief Removes all address blocks from this message.
+     * @brief Removes all address blocks from this message.
      */
     void AddressBlockClear();
 
     /**
-     * \brief Deserializes a message, returning the correct object depending on
+     * @brief Deserializes a message, returning the correct object depending on
      *        whether it is an IPv4 message or an IPv6 message.
-     * \param start a reference to the point in a buffer to begin deserializing.
-     * \return A pointer to the deserialized message, or 0 on error.
+     * @param start a reference to the point in a buffer to begin deserializing.
+     * @return A pointer to the deserialized message, or 0 on error.
      *
      * Users should not need to call this.  Blocks will be deserialized by their
      * containing packet.
@@ -1012,13 +1012,13 @@
     static Ptr<PbbMessage> DeserializeMessage(Buffer::Iterator& start);
 
     /**
-     * \return The size (in bytes) needed to serialize this message.
+     * @return The size (in bytes) needed to serialize this message.
      */
     uint32_t GetSerializedSize() const;
 
     /**
-     * \brief Serializes this message into the specified buffer.
-     * \param start a reference to the point in a buffer to begin serializing.
+     * @brief Serializes this message into the specified buffer.
+     * @param start a reference to the point in a buffer to begin serializing.
      *
      * Users should not need to call this.  Blocks will be deserialized by their
      * containing packet.
@@ -1026,8 +1026,8 @@
     void Serialize(Buffer::Iterator& start) const;
 
     /**
-     * \brief Deserializes a message from the specified buffer.
-     * \param start a reference to the point in a buffer to begin deserializing.
+     * @brief Deserializes a message from the specified buffer.
+     * @param start a reference to the point in a buffer to begin deserializing.
      *
      * Users should not need to call this.  Blocks will be deserialized by their
      * containing packet.
@@ -1035,16 +1035,16 @@
     void Deserialize(Buffer::Iterator& start);
 
     /**
-     * \brief Pretty-prints the contents of this message.
-     * \param os a stream object to print to.
+     * @brief Pretty-prints the contents of this message.
+     * @param os a stream object to print to.
      */
     void Print(std::ostream& os) const;
 
     /**
-     * \brief Pretty-prints the contents of this message, with specified
+     * @brief Pretty-prints the contents of this message, with specified
      *        indentation.
-     * \param os a stream object to print to.
-     * \param level level of indentation.
+     * @param os a stream object to print to.
+     * @param level level of indentation.
      *
      * This probably never needs to be called by users.  This is used when
      * recursively printing sub-objects.
@@ -1052,50 +1052,50 @@
     void Print(std::ostream& os, int level) const;
 
     /**
-     * \brief Equality operator for PbbMessage
-     * \param other PbbMessage to compare to this one
-     * \returns true if PbbMessages are equal
+     * @brief Equality operator for PbbMessage
+     * @param other PbbMessage to compare to this one
+     * @returns true if PbbMessages are equal
      */
     bool operator==(const PbbMessage& other) const;
     /**
-     * \brief Inequality operator for PbbMessage
-     * \param other PbbMessage to compare to this one
-     * \returns true if PbbMessages are not equal
+     * @brief Inequality operator for PbbMessage
+     * @param other PbbMessage to compare to this one
+     * @returns true if PbbMessages are not equal
      */
     bool operator!=(const PbbMessage& other) const;
 
   protected:
     /**
-     * \brief Returns address length (IPV4 3 or IPV6 15)
+     * @brief Returns address length (IPV4 3 or IPV6 15)
      *
      *  Returns message size in bytes - 1
      *  IPv4 = 4 - 1 = 3, IPv6 = 16 - 1 = 15
      *
-     * \returns Address length (IPV4 3 or IPV6 15)
+     * @returns Address length (IPV4 3 or IPV6 15)
      */
     virtual PbbAddressLength GetAddressLength() const = 0;
 
     /**
-     * \brief Serialize the originator address
-     * \param start the buffer iterator start
+     * @brief Serialize the originator address
+     * @param start the buffer iterator start
      */
     virtual void SerializeOriginatorAddress(Buffer::Iterator& start) const = 0;
     /**
-     * \brief Deserialize the originator address
-     * \param start the buffer iterator start
-     * \returns the deserialized address
+     * @brief Deserialize the originator address
+     * @param start the buffer iterator start
+     * @returns the deserialized address
      */
     virtual Address DeserializeOriginatorAddress(Buffer::Iterator& start) const = 0;
     /**
-     * \brief Print the originator address
-     * \param os the output stream
+     * @brief Print the originator address
+     * @param os the output stream
      */
     virtual void PrintOriginatorAddress(std::ostream& os) const = 0;
 
     /**
-     * \brief Deserialize an address block
-     * \param start the buffer iterator start
-     * \returns the deserialized address block
+     * @brief Deserialize an address block
+     * @param start the buffer iterator start
+     * @returns the deserialized address block
      */
     virtual Ptr<PbbAddressBlock> AddressBlockDeserialize(Buffer::Iterator& start) const = 0;
 
@@ -1120,7 +1120,7 @@
 };
 
 /**
- * \brief Concrete IPv4 specific PbbMessage.
+ * @brief Concrete IPv4 specific PbbMessage.
  *
  * This message will only contain IPv4 addresses.
  */
@@ -1131,12 +1131,12 @@
 
   protected:
     /**
-     * \brief Returns address length (IPV4 3 or IPV6 15)
+     * @brief Returns address length (IPV4 3 or IPV6 15)
      *
      *  Returns message size in bytes - 1
      *  IPv4 = 4 - 1 = 3, IPv6 = 16 - 1 = 15
      *
-     * \returns Address length (IPV4 3 or IPV6 15)
+     * @returns Address length (IPV4 3 or IPV6 15)
      */
     PbbAddressLength GetAddressLength() const override;
 
@@ -1148,7 +1148,7 @@
 };
 
 /**
- * \brief Concrete IPv6 specific PbbMessage class.
+ * @brief Concrete IPv6 specific PbbMessage class.
  *
  * This message will only contain IPv6 addresses.
  */
@@ -1159,12 +1159,12 @@
 
   protected:
     /**
-     * \brief Returns address length (IPV4 3 or IPV6 15)
+     * @brief Returns address length (IPV4 3 or IPV6 15)
      *
      *  Returns message size in bytes - 1
      *  IPv4 = 4 - 1 = 3, IPv6 = 16 - 1 = 15
      *
-     * \returns Address length (IPV4 3 or IPV6 15)
+     * @returns Address length (IPV4 3 or IPV6 15)
      */
     PbbAddressLength GetAddressLength() const override;
 
@@ -1176,7 +1176,7 @@
 };
 
 /**
- * \brief An Address Block and its associated Address TLV Blocks.
+ * @brief An Address Block and its associated Address TLV Blocks.
  *
  * This is a pure virtual base class, when creating address blocks, you should
  * instantiate either PbbAddressBlockIpv4 or PbbAddressBlockIpv6.
@@ -1205,309 +1205,309 @@
     /* Manipulating the address block */
 
     /**
-     * \return an iterator to the first address in this block.
+     * @return an iterator to the first address in this block.
      */
     AddressIterator AddressBegin();
 
     /**
-     * \return a const iterator to the first address in this block.
+     * @return a const iterator to the first address in this block.
      */
     ConstAddressIterator AddressBegin() const;
 
     /**
-     * \return an iterator to the last address in this block.
+     * @return an iterator to the last address in this block.
      */
     AddressIterator AddressEnd();
 
     /**
-     * \return a const iterator to the last address in this block.
+     * @return a const iterator to the last address in this block.
      */
     ConstAddressIterator AddressEnd() const;
 
     /**
-     * \return the number of addresses in this block.
+     * @return the number of addresses in this block.
      */
     int AddressSize() const;
 
     /**
-     * \return true if there are no addresses in this block, false otherwise.
+     * @return true if there are no addresses in this block, false otherwise.
      */
     bool AddressEmpty() const;
 
     /**
-     * \return the first address in this block.
+     * @return the first address in this block.
      */
     Address AddressFront() const;
 
     /**
-     * \return the last address in this block.
+     * @return the last address in this block.
      */
     Address AddressBack() const;
 
     /**
-     * \brief Prepends an address to the front of this block.
-     * \param address the address to prepend.
+     * @brief Prepends an address to the front of this block.
+     * @param address the address to prepend.
      */
     void AddressPushFront(Address address);
 
     /**
-     * \brief Removes an address from the front of this block.
+     * @brief Removes an address from the front of this block.
      */
     void AddressPopFront();
 
     /**
-     * \brief Appends an address to the back of this block.
-     * \param address the address to append.
+     * @brief Appends an address to the back of this block.
+     * @param address the address to append.
      */
     void AddressPushBack(Address address);
 
     /**
-     * \brief Removes an address from the back of this block.
+     * @brief Removes an address from the back of this block.
      */
     void AddressPopBack();
 
     /**
-     * \brief Inserts an address at the specified position in this block.
-     * \param position an Iterator pointing to the position in this block to
+     * @brief Inserts an address at the specified position in this block.
+     * @param position an Iterator pointing to the position in this block to
      *        insert the address.
-     * \param value the address to insert.
-     * \return An iterator pointing to the newly inserted address.
+     * @param value the address to insert.
+     * @return An iterator pointing to the newly inserted address.
      */
     AddressIterator AddressInsert(AddressIterator position, const Address value);
 
     /**
-     * \brief Removes the address at the specified position.
-     * \param position an Iterator pointing to the address to erase.
-     * \return an iterator pointing to the next address in the block.
+     * @brief Removes the address at the specified position.
+     * @param position an Iterator pointing to the address to erase.
+     * @return an iterator pointing to the next address in the block.
      */
     AddressIterator AddressErase(AddressIterator position);
 
     /**
-     * \brief Removes all addresses from [first, last) (includes first, not
+     * @brief Removes all addresses from [first, last) (includes first, not
      *        includes last).
-     * \param first an Iterator pointing to the first address to erase
+     * @param first an Iterator pointing to the first address to erase
      *        (inclusive).
-     * \param last an Iterator pointing to the element past the last address to
+     * @param last an Iterator pointing to the element past the last address to
      *        erase.
-     * \return an iterator pointing to the next address in the block.
+     * @return an iterator pointing to the next address in the block.
      */
     AddressIterator AddressErase(AddressIterator first, AddressIterator last);
 
     /**
-     * \brief Removes all addresses from this block.
+     * @brief Removes all addresses from this block.
      */
     void AddressClear();
 
     /* Prefix methods */
 
     /**
-     * \return an iterator to the first prefix in this block.
+     * @return an iterator to the first prefix in this block.
      */
     PrefixIterator PrefixBegin();
 
     /**
-     * \return a const iterator to the first prefix in this block.
+     * @return a const iterator to the first prefix in this block.
      */
     ConstPrefixIterator PrefixBegin() const;
 
     /**
-     * \return an iterator to the last prefix in this block.
+     * @return an iterator to the last prefix in this block.
      */
     PrefixIterator PrefixEnd();
 
     /**
-     * \return a const iterator to the last prefix in this block.
+     * @return a const iterator to the last prefix in this block.
      */
     ConstPrefixIterator PrefixEnd() const;
 
     /**
-     * \return the number of prefixes in this block.
+     * @return the number of prefixes in this block.
      */
     int PrefixSize() const;
 
     /**
-     * \return true if there are no prefixes in this block, false otherwise.
+     * @return true if there are no prefixes in this block, false otherwise.
      */
     bool PrefixEmpty() const;
 
     /**
-     * \return the first prefix in this block.
+     * @return the first prefix in this block.
      */
     uint8_t PrefixFront() const;
 
     /**
-     * \return the last prefix in this block.
+     * @return the last prefix in this block.
      */
     uint8_t PrefixBack() const;
 
     /**
-     * \brief Prepends a prefix to the front of this block.
-     * \param prefix the prefix to prepend.
+     * @brief Prepends a prefix to the front of this block.
+     * @param prefix the prefix to prepend.
      */
     void PrefixPushFront(uint8_t prefix);
 
     /**
-     * \brief Removes a prefix from the front of this block.
+     * @brief Removes a prefix from the front of this block.
      */
     void PrefixPopFront();
 
     /**
-     * \brief Appends a prefix to the back of this block.
-     * \param prefix the prefix to append.
+     * @brief Appends a prefix to the back of this block.
+     * @param prefix the prefix to append.
      */
     void PrefixPushBack(uint8_t prefix);
 
     /**
-     * \brief Removes a prefix from the back of this block.
+     * @brief Removes a prefix from the back of this block.
      */
     void PrefixPopBack();
 
     /**
-     * \brief Inserts a prefix at the specified position in this block.
-     * \param position an Iterator pointing to the position in this block to
+     * @brief Inserts a prefix at the specified position in this block.
+     * @param position an Iterator pointing to the position in this block to
      *        insert the prefix.
-     * \param value the prefix to insert.
-     * \return An iterator pointing to the newly inserted prefix.
+     * @param value the prefix to insert.
+     * @return An iterator pointing to the newly inserted prefix.
      */
     PrefixIterator PrefixInsert(PrefixIterator position, const uint8_t value);
 
     /**
-     * \brief Removes the prefix at the specified position.
-     * \param position an Iterator pointing to the prefix to erase.
-     * \return an iterator pointing to the next prefix in the block.
+     * @brief Removes the prefix at the specified position.
+     * @param position an Iterator pointing to the prefix to erase.
+     * @return an iterator pointing to the next prefix in the block.
      */
     PrefixIterator PrefixErase(PrefixIterator position);
 
     /**
-     * \brief Removes all prefixes from [first, last) (includes first, not
+     * @brief Removes all prefixes from [first, last) (includes first, not
      *        includes last).
-     * \param first an Iterator pointing to the first prefix to erase
+     * @param first an Iterator pointing to the first prefix to erase
      *        (inclusive).
-     * \param last an Iterator pointing to the element past the last prefix to
+     * @param last an Iterator pointing to the element past the last prefix to
      *        erase.
-     * \return an iterator pointing to the next prefix in the block.
+     * @return an iterator pointing to the next prefix in the block.
      */
     PrefixIterator PrefixErase(PrefixIterator first, PrefixIterator last);
 
     /**
-     * \brief Removes all prefixes from this block.
+     * @brief Removes all prefixes from this block.
      */
     void PrefixClear();
 
     /* Manipulating the TLV block */
 
     /**
-     * \return an iterator to the first address TLV in this block.
+     * @return an iterator to the first address TLV in this block.
      */
     TlvIterator TlvBegin();
 
     /**
-     * \return a const iterator to the first address TLV in this block.
+     * @return a const iterator to the first address TLV in this block.
      */
     ConstTlvIterator TlvBegin() const;
 
     /**
-     * \return an iterator to the last address TLV in this block.
+     * @return an iterator to the last address TLV in this block.
      */
     TlvIterator TlvEnd();
 
     /**
-     * \return a const iterator to the last address TLV in this block.
+     * @return a const iterator to the last address TLV in this block.
      */
     ConstTlvIterator TlvEnd() const;
 
     /**
-     * \return the number of address TLVs in this block.
+     * @return the number of address TLVs in this block.
      */
     int TlvSize() const;
 
     /**
-     * \return true if there are no address TLVs in this block, false otherwise.
+     * @return true if there are no address TLVs in this block, false otherwise.
      */
     bool TlvEmpty() const;
 
     /**
-     * \return a smart pointer to the first address TLV in this block.
+     * @return a smart pointer to the first address TLV in this block.
      */
     Ptr<PbbAddressTlv> TlvFront();
 
     /**
-     * \return a const smart pointer to the first address TLV in this message.
+     * @return a const smart pointer to the first address TLV in this message.
      */
     const Ptr<PbbAddressTlv> TlvFront() const;
 
     /**
-     * \return a smart pointer to the last address TLV in this message.
+     * @return a smart pointer to the last address TLV in this message.
      */
     Ptr<PbbAddressTlv> TlvBack();
 
     /**
-     * \return a const smart pointer to the last address TLV in this message.
+     * @return a const smart pointer to the last address TLV in this message.
      */
     const Ptr<PbbAddressTlv> TlvBack() const;
 
     /**
-     * \brief Prepends an address TLV to the front of this message.
-     * \param address a smart pointer to the address TLV to prepend.
+     * @brief Prepends an address TLV to the front of this message.
+     * @param address a smart pointer to the address TLV to prepend.
      */
     void TlvPushFront(Ptr<PbbAddressTlv> address);
 
     /**
-     * \brief Removes an address TLV from the front of this message.
+     * @brief Removes an address TLV from the front of this message.
      */
     void TlvPopFront();
 
     /**
-     * \brief Appends an address TLV to the back of this message.
-     * \param address a smart pointer to the address TLV to append.
+     * @brief Appends an address TLV to the back of this message.
+     * @param address a smart pointer to the address TLV to append.
      */
     void TlvPushBack(Ptr<PbbAddressTlv> address);
 
     /**
-     * \brief Removes an address TLV from the back of this message.
+     * @brief Removes an address TLV from the back of this message.
      */
     void TlvPopBack();
 
     /**
-     * \brief Inserts an address TLV at the specified position in this block.
-     * \param position an Iterator pointing to the position in this block to
+     * @brief Inserts an address TLV at the specified position in this block.
+     * @param position an Iterator pointing to the position in this block to
      *        insert the address TLV.
-     * \param value the prefix to insert.
-     * \return An iterator pointing to the newly inserted address TLV.
+     * @param value the prefix to insert.
+     * @return An iterator pointing to the newly inserted address TLV.
      */
     TlvIterator TlvInsert(TlvIterator position, const Ptr<PbbTlv> value);
 
     /**
-     * \brief Removes the address TLV at the specified position.
-     * \param position an Iterator pointing to the address TLV to erase.
-     * \return an iterator pointing to the next address TLV in the block.
+     * @brief Removes the address TLV at the specified position.
+     * @param position an Iterator pointing to the address TLV to erase.
+     * @return an iterator pointing to the next address TLV in the block.
      */
     TlvIterator TlvErase(TlvIterator position);
 
     /**
-     * \brief Removes all address TLVs from [first, last) (includes first, not
+     * @brief Removes all address TLVs from [first, last) (includes first, not
      *        includes last).
-     * \param first an Iterator pointing to the first address TLV to erase
+     * @param first an Iterator pointing to the first address TLV to erase
      *        (inclusive).
-     * \param last an Iterator pointing to the element past the last address TLV
+     * @param last an Iterator pointing to the element past the last address TLV
      *        to erase.
-     * \return an iterator pointing to the next address TLV in the message.
+     * @return an iterator pointing to the next address TLV in the message.
      */
     TlvIterator TlvErase(TlvIterator first, TlvIterator last);
 
     /**
-     * \brief Removes all address TLVs from this block.
+     * @brief Removes all address TLVs from this block.
      */
     void TlvClear();
 
     /**
-     * \return The size (in bytes) needed to serialize this address block.
+     * @return The size (in bytes) needed to serialize this address block.
      */
     uint32_t GetSerializedSize() const;
 
     /**
-     * \brief Serializes this address block into the specified buffer.
-     * \param start a reference to the point in a buffer to begin serializing.
+     * @brief Serializes this address block into the specified buffer.
+     * @param start a reference to the point in a buffer to begin serializing.
      *
      * Users should not need to call this.  Blocks will be deserialized by their
      * containing packet.
@@ -1515,8 +1515,8 @@
     void Serialize(Buffer::Iterator& start) const;
 
     /**
-     * \brief Deserializes an address block from the specified buffer.
-     * \param start a reference to the point in a buffer to begin deserializing.
+     * @brief Deserializes an address block from the specified buffer.
+     * @param start a reference to the point in a buffer to begin deserializing.
      *
      * Users should not need to call this.  Blocks will be deserialized by their
      * containing packet.
@@ -1524,16 +1524,16 @@
     void Deserialize(Buffer::Iterator& start);
 
     /**
-     * \brief Pretty-prints the contents of this address block.
-     * \param os a stream object to print to.
+     * @brief Pretty-prints the contents of this address block.
+     * @param os a stream object to print to.
      */
     void Print(std::ostream& os) const;
 
     /**
-     * \brief Pretty-prints the contents of this address block, with specified
+     * @brief Pretty-prints the contents of this address block, with specified
      *        indentation.
-     * \param os a stream object to print to.
-     * \param level level of indentation.
+     * @param os a stream object to print to.
+     * @param level level of indentation.
      *
      * This probably never needs to be called by users.  This is used when
      * recursively printing sub-objects.
@@ -1541,64 +1541,64 @@
     void Print(std::ostream& os, int level) const;
 
     /**
-     * \brief Equality operator for PbbAddressBlock
-     * \param other PbbAddressBlock to compare to this one
-     * \returns true if PbbMessages are equal
+     * @brief Equality operator for PbbAddressBlock
+     * @param other PbbAddressBlock to compare to this one
+     * @returns true if PbbMessages are equal
      */
     bool operator==(const PbbAddressBlock& other) const;
 
     /**
-     * \brief Inequality operator for PbbAddressBlock
-     * \param other PbbAddressBlock to compare to this one
-     * \returns true if PbbAddressBlock are not equal
+     * @brief Inequality operator for PbbAddressBlock
+     * @param other PbbAddressBlock to compare to this one
+     * @returns true if PbbAddressBlock are not equal
      */
     bool operator!=(const PbbAddressBlock& other) const;
 
   protected:
     /**
-     * \brief Returns address length
-     * \returns Address length
+     * @brief Returns address length
+     * @returns Address length
      */
     virtual uint8_t GetAddressLength() const = 0;
     /**
-     * \brief Serialize one or more addresses
-     * \param buffer the buffer to serialize to
-     * \param iter the iterator to the addresses
+     * @brief Serialize one or more addresses
+     * @param buffer the buffer to serialize to
+     * @param iter the iterator to the addresses
      */
     virtual void SerializeAddress(uint8_t* buffer, ConstAddressIterator iter) const = 0;
     /**
-     * \brief Deserialize one address
-     * \param buffer the buffer to deserialize from
-     * \returns the address
+     * @brief Deserialize one address
+     * @param buffer the buffer to deserialize from
+     * @returns the address
      */
     virtual Address DeserializeAddress(uint8_t* buffer) const = 0;
     /**
-     * \brief Print one or more addresses
-     * \param os the output stream
-     * \param iter the iterator to the addresses
+     * @brief Print one or more addresses
+     * @param os the output stream
+     * @param iter the iterator to the addresses
      */
     virtual void PrintAddress(std::ostream& os, ConstAddressIterator iter) const = 0;
 
   private:
     /**
-     * \brief Get the prefix flags
-     * \return the prefix flags
+     * @brief Get the prefix flags
+     * @return the prefix flags
      */
     uint8_t GetPrefixFlags() const;
     /**
-     * \brief Get head and tail
-     * \param head the head
-     * \param headlen the head length
-     * \param tail the tail
-     * \param taillen the tail length
+     * @brief Get head and tail
+     * @param head the head
+     * @param headlen the head length
+     * @param tail the tail
+     * @param taillen the tail length
      */
     void GetHeadTail(uint8_t* head, uint8_t& headlen, uint8_t* tail, uint8_t& taillen) const;
 
     /**
-     * \brief Check if the tail is empty
-     * \param tail the tail
-     * \param taillen the tail length
-     * \returns true if the tail is empty
+     * @brief Check if the tail is empty
+     * @param tail the tail
+     * @param taillen the tail length
+     * @returns true if the tail is empty
      */
     bool HasZeroTail(const uint8_t* tail, uint8_t taillen) const;
 
@@ -1608,7 +1608,7 @@
 };
 
 /**
- * \brief Concrete IPv4 specific PbbAddressBlock.
+ * @brief Concrete IPv4 specific PbbAddressBlock.
  *
  * This address block will only contain IPv4 addresses.
  */
@@ -1620,8 +1620,8 @@
 
   protected:
     /**
-     * \brief Returns address length
-     * \returns Address length
+     * @brief Returns address length
+     * @returns Address length
      */
     uint8_t GetAddressLength() const override;
     void SerializeAddress(uint8_t* buffer, ConstAddressIterator iter) const override;
@@ -1630,7 +1630,7 @@
 };
 
 /**
- * \brief Concrete IPv6 specific PbbAddressBlock.
+ * @brief Concrete IPv6 specific PbbAddressBlock.
  *
  * This address block will only contain IPv6 addresses.
  */
@@ -1642,8 +1642,8 @@
 
   protected:
     /**
-     * \brief Returns address length
-     * \returns Address length
+     * @brief Returns address length
+     * @returns Address length
      */
     uint8_t GetAddressLength() const override;
     void SerializeAddress(uint8_t* buffer, ConstAddressIterator iter) const override;
@@ -1652,7 +1652,7 @@
 };
 
 /**
- * \brief A packet or message TLV
+ * @brief A packet or message TLV
  */
 class PbbTlv : public SimpleRefCount<PbbTlv>
 {
@@ -1661,19 +1661,19 @@
     virtual ~PbbTlv();
 
     /**
-     * \brief Sets the type of this TLV.
-     * \param type the type value to set.
+     * @brief Sets the type of this TLV.
+     * @param type the type value to set.
      */
     void SetType(uint8_t type);
 
     /**
-     * \return the type of this TLV.
+     * @return the type of this TLV.
      */
     uint8_t GetType() const;
 
     /**
-     * \brief Sets the type extension of this TLV.
-     * \param type the type extension value to set.
+     * @brief Sets the type extension of this TLV.
+     * @param type the type extension value to set.
      *
      * The type extension is like a sub-type used to further distinguish between
      * TLVs of the same type.
@@ -1681,7 +1681,7 @@
     void SetTypeExt(uint8_t type);
 
     /**
-     * \return the type extension for this TLV.
+     * @return the type extension for this TLV.
      *
      * Calling this while HasTypeExt is False is undefined.  Make sure you check
      * it first.  This will be checked by an assert in debug builds.
@@ -1689,8 +1689,8 @@
     uint8_t GetTypeExt() const;
 
     /**
-     * \brief Tests whether or not this TLV has a type extension.
-     * \return true if this TLV has a type extension, false otherwise.
+     * @brief Tests whether or not this TLV has a type extension.
+     * @return true if this TLV has a type extension, false otherwise.
      *
      * This should be called before calling GetTypeExt to make sure there
      * actually is one.
@@ -1698,8 +1698,8 @@
     bool HasTypeExt() const;
 
     /**
-     * \brief Sets the value of this message to the specified buffer.
-     * \param start a buffer instance.
+     * @brief Sets the value of this message to the specified buffer.
+     * @param start a buffer instance.
      *
      * The buffer is _not_ copied until this TLV is serialized.  You should not
      * change the contents of the buffer you pass in to this function.
@@ -1707,9 +1707,9 @@
     void SetValue(Buffer start);
 
     /**
-     * \brief Sets the value of this message to a buffer with the specified data.
-     * \param buffer a pointer to data to put in the TLVs buffer.
-     * \param size the size of the buffer.
+     * @brief Sets the value of this message to a buffer with the specified data.
+     * @param buffer a pointer to data to put in the TLVs buffer.
+     * @param size the size of the buffer.
      *
      * The buffer *is copied* into a *new buffer instance*.  You can free the
      * data in the buffer provided anytime you wish.
@@ -1717,7 +1717,7 @@
     void SetValue(const uint8_t* buffer, uint32_t size);
 
     /**
-     * \return a Buffer pointing to the value of this TLV.
+     * @return a Buffer pointing to the value of this TLV.
      *
      * Calling this while HasValue is False is undefined.  Make sure you check it
      * first.  This will be checked by an assert in debug builds.
@@ -1725,8 +1725,8 @@
     Buffer GetValue() const;
 
     /**
-     * \brief Tests whether or not this TLV has a value.
-     * \return true if this tlv has a TLV, false otherwise.
+     * @brief Tests whether or not this TLV has a value.
+     * @return true if this tlv has a TLV, false otherwise.
      *
      * This should be called before calling GetTypeExt to make sure there
      * actually is one.
@@ -1734,13 +1734,13 @@
     bool HasValue() const;
 
     /**
-     * \return The size (in bytes) needed to serialize this TLV.
+     * @return The size (in bytes) needed to serialize this TLV.
      */
     uint32_t GetSerializedSize() const;
 
     /**
-     * \brief Serializes this TLV into the specified buffer.
-     * \param start a reference to the point in a buffer to begin serializing.
+     * @brief Serializes this TLV into the specified buffer.
+     * @param start a reference to the point in a buffer to begin serializing.
      *
      * Users should not need to call this.  TLVs will be serialized by their
      * containing blocks.
@@ -1748,8 +1748,8 @@
     void Serialize(Buffer::Iterator& start) const;
 
     /**
-     * \brief Deserializes a TLV from the specified buffer.
-     * \param start a reference to the point in a buffer to begin deserializing.
+     * @brief Deserializes a TLV from the specified buffer.
+     * @param start a reference to the point in a buffer to begin deserializing.
      *
      * Users should not need to call this.  TLVs will be deserialized by their
      * containing blocks.
@@ -1757,15 +1757,15 @@
     void Deserialize(Buffer::Iterator& start);
 
     /**
-     * \brief Pretty-prints the contents of this TLV.
-     * \param os a stream object to print to.
+     * @brief Pretty-prints the contents of this TLV.
+     * @param os a stream object to print to.
      */
     void Print(std::ostream& os) const;
 
     /**
-     * \brief Pretty-prints the contents of this TLV, with specified indentation.
-     * \param os a stream object to print to.
-     * \param level level of indentation.
+     * @brief Pretty-prints the contents of this TLV, with specified indentation.
+     * @param os a stream object to print to.
+     * @param level level of indentation.
      *
      * This probably never needs to be called by users.  This is used when
      * recursively printing sub-objects.
@@ -1773,60 +1773,60 @@
     void Print(std::ostream& os, int level) const;
 
     /**
-     * \brief Equality operator for PbbTlv
-     * \param other PbbTlv to compare to this one
-     * \returns true if PbbTlv are equal
+     * @brief Equality operator for PbbTlv
+     * @param other PbbTlv to compare to this one
+     * @returns true if PbbTlv are equal
      */
     bool operator==(const PbbTlv& other) const;
 
     /**
-     * \brief Inequality operator for PbbTlv
-     * \param other PbbTlv to compare to this one
-     * \returns true if PbbTlv are not equal
+     * @brief Inequality operator for PbbTlv
+     * @param other PbbTlv to compare to this one
+     * @returns true if PbbTlv are not equal
      */
     bool operator!=(const PbbTlv& other) const;
 
   protected:
     /**
-     * \brief Set an index as starting point
-     * \param index the starting index
+     * @brief Set an index as starting point
+     * @param index the starting index
      */
     void SetIndexStart(uint8_t index);
     /**
-     * \brief Get the starting point index
-     * \returns the starting index
+     * @brief Get the starting point index
+     * @returns the starting index
      */
     uint8_t GetIndexStart() const;
     /**
-     * \brief Checks if there is a starting index
-     * \returns true if the start index has been set
+     * @brief Checks if there is a starting index
+     * @returns true if the start index has been set
      */
     bool HasIndexStart() const;
 
     /**
-     * \brief Set an index as stop point
-     * \param index the stop index
+     * @brief Set an index as stop point
+     * @param index the stop index
      */
     void SetIndexStop(uint8_t index);
     /**
-     * \brief Get the stop point index
-     * \returns the stop index
+     * @brief Get the stop point index
+     * @returns the stop index
      */
     uint8_t GetIndexStop() const;
     /**
-     * \brief Checks if there is a stop index
-     * \returns true if the stop index has been set
+     * @brief Checks if there is a stop index
+     * @returns true if the stop index has been set
      */
     bool HasIndexStop() const;
 
     /**
-     * \brief Set the multivalue parameter
-     * \param isMultivalue the multivalue status
+     * @brief Set the multivalue parameter
+     * @param isMultivalue the multivalue status
      */
     void SetMultivalue(bool isMultivalue);
     /**
-     * \brief Check the multivalue parameter
-     * \returns the multivalue status
+     * @brief Check the multivalue parameter
+     * @returns the multivalue status
      */
     bool IsMultivalue() const;
 
@@ -1848,20 +1848,20 @@
 };
 
 /**
- * \brief An Address TLV
+ * @brief An Address TLV
  */
 class PbbAddressTlv : public PbbTlv
 {
   public:
     /**
-     * \brief Sets the index of the first address in the associated address block
+     * @brief Sets the index of the first address in the associated address block
      * that this address TLV applies to.
-     * \param index the index of the first address.
+     * @param index the index of the first address.
      */
     void SetIndexStart(uint8_t index);
 
     /**
-     * \return the first (inclusive) index of the address in the corresponding
+     * @return the first (inclusive) index of the address in the corresponding
      * address block that this TLV applies to.
      *
      * Calling this while HasIndexStart is False is undefined.  Make sure you
@@ -1870,8 +1870,8 @@
     uint8_t GetIndexStart() const;
 
     /**
-     * \brief Tests whether or not this address TLV has a start index.
-     * \return true if this address TLV has a start index, false otherwise.
+     * @brief Tests whether or not this address TLV has a start index.
+     * @return true if this address TLV has a start index, false otherwise.
      *
      * This should be called before calling GetIndexStart to make sure there
      * actually is one.
@@ -1879,14 +1879,14 @@
     bool HasIndexStart() const;
 
     /**
-     * \brief Sets the index of the last address in the associated address block
+     * @brief Sets the index of the last address in the associated address block
      * that this address TLV applies to.
-     * \param index the index of the last address.
+     * @param index the index of the last address.
      */
     void SetIndexStop(uint8_t index);
 
     /**
-     * \return the last (inclusive) index of the address in the corresponding
+     * @return the last (inclusive) index of the address in the corresponding
      * PbbAddressBlock that this TLV applies to.
      *
      * Calling this while HasIndexStop is False is undefined.  Make sure you
@@ -1895,8 +1895,8 @@
     uint8_t GetIndexStop() const;
 
     /**
-     * \brief Tests whether or not this address TLV has a stop index.
-     * \return true if this address TLV has a stop index, false otherwise.
+     * @brief Tests whether or not this address TLV has a stop index.
+     * @return true if this address TLV has a stop index, false otherwise.
      *
      * This should be called before calling GetIndexStop to make sure there
      * actually is one.
@@ -1904,8 +1904,8 @@
     bool HasIndexStop() const;
 
     /**
-     * \brief Sets whether or not this address TLV is "multivalue"
-     * \param isMultivalue whether or not this address TLV should be multivalue.
+     * @brief Sets whether or not this address TLV is "multivalue"
+     * @param isMultivalue whether or not this address TLV should be multivalue.
      *
      * If true, this means the value associated with this TLV should be divided
      * evenly into (GetIndexStop() - GetIndexStart() + 1) values.  Otherwise, the
@@ -1914,8 +1914,8 @@
     void SetMultivalue(bool isMultivalue);
 
     /**
-     * \brief Tests whether or not this address TLV is "multivalue"
-     * \return whether this address TLV is multivalue or not.
+     * @brief Tests whether or not this address TLV is "multivalue"
+     * @return whether this address TLV is multivalue or not.
      */
     bool IsMultivalue() const;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/packet-burst.h ns-3.44/src/network/utils/packet-burst.h
--- ns-3.43/src/network/utils/packet-burst.h	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/packet-burst.h	2025-03-09 16:55:49.679372300 -0700
@@ -20,55 +20,55 @@
 class Packet;
 
 /**
- * \brief this class implement a burst as a list of packets
+ * @brief this class implement a burst as a list of packets
  */
 class PacketBurst : public Object
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     PacketBurst();
     ~PacketBurst() override;
     /**
-     * \return a copy the packetBurst
+     * @return a copy the packetBurst
      */
     Ptr<PacketBurst> Copy() const;
     /**
-     * \brief add a packet to the list of packet
-     * \param packet the packet to add
+     * @brief add a packet to the list of packet
+     * @param packet the packet to add
      */
     void AddPacket(Ptr<Packet> packet);
     /**
-     * \return the list of packet of this burst
+     * @return the list of packet of this burst
      */
     std::list<Ptr<Packet>> GetPackets() const;
     /**
-     * \return the number of packet in the burst
+     * @return the number of packet in the burst
      */
     uint32_t GetNPackets() const;
     /**
-     * \return the size of the burst in byte (the size of all packets)
+     * @return the size of the burst in byte (the size of all packets)
      */
     uint32_t GetSize() const;
 
     /**
-     * \brief Returns an iterator to the begin of the burst
-     * \return iterator to the burst list start
+     * @brief Returns an iterator to the begin of the burst
+     * @return iterator to the burst list start
      */
     std::list<Ptr<Packet>>::const_iterator Begin() const;
     /**
-     * \brief Returns an iterator to the end of the burst
-     * \return iterator to the burst list end
+     * @brief Returns an iterator to the end of the burst
+     * @return iterator to the burst list end
      */
     std::list<Ptr<Packet>>::const_iterator End() const;
 
     /**
      * TracedCallback signature for Ptr<PacketBurst>
      *
-     * \param [in] burst The PacketBurst
+     * @param [in] burst The PacketBurst
      */
     typedef void (*TracedCallback)(Ptr<const PacketBurst> burst);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/packet-data-calculators.h ns-3.44/src/network/utils/packet-data-calculators.h
--- ns-3.43/src/network/utils/packet-data-calculators.h	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/packet-data-calculators.h	2025-03-09 16:55:49.679372300 -0700
@@ -19,7 +19,7 @@
 {
 
 /**
- * \ingroup stats
+ * @ingroup stats
  *
  *  A stat for counting packets
  *
@@ -32,24 +32,24 @@
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
     /**
      * Increments the packet counter by one
      *
-     * \param path not used in this method
-     * \param packet not used in this method
+     * @param path not used in this method
+     * @param packet not used in this method
      */
     void PacketUpdate(std::string path, Ptr<const Packet> packet);
 
     /**
      * Increments the packet counter by one
      *
-     * \param path not used in this method
-     * \param packet not used in this method
-     * \param realto not used in this method
+     * @param path not used in this method
+     * @param packet not used in this method
+     * @param realto not used in this method
      */
 
     void FrameUpdate(std::string path, Ptr<const Packet> packet, Mac48Address realto);
@@ -64,7 +64,7 @@
 };
 
 /**
- * \ingroup stats
+ * @ingroup stats
  *
  * A stat for collecting packet size statistics: min, max and average
  *
@@ -77,24 +77,24 @@
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
     /**
      * Increments the packet stats by the size of the packet
      *
-     * \param path not used in this method
-     * \param packet packet size used to update stats
+     * @param path not used in this method
+     * @param packet packet size used to update stats
      */
     void PacketUpdate(std::string path, Ptr<const Packet> packet);
 
     /**
      * Increments the packet stats by the size of the packet
      *
-     * \param path not used in this method
-     * \param packet packet size used to update stats
-     * \param realto not used in this method
+     * @param path not used in this method
+     * @param packet packet size used to update stats
+     * @param realto not used in this method
      */
     void FrameUpdate(std::string path, Ptr<const Packet> packet, Mac48Address realto);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/packet-probe.h ns-3.44/src/network/utils/packet-probe.h
--- ns-3.43/src/network/utils/packet-probe.h	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/packet-probe.h	2025-03-09 16:55:49.679372300 -0700
@@ -37,41 +37,41 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     PacketProbe();
     ~PacketProbe() override;
 
     /**
-     * \brief Set a probe value
+     * @brief Set a probe value
      *
-     * \param packet set the traced packet equal to this
+     * @param packet set the traced packet equal to this
      */
     void SetValue(Ptr<const Packet> packet);
 
     /**
-     * \brief Set a probe value by its name in the Config system
+     * @brief Set a probe value by its name in the Config system
      *
-     * \param path config path to access the probe
-     * \param packet set the traced packet equal to this
+     * @param path config path to access the probe
+     * @param packet set the traced packet equal to this
      */
     static void SetValueByPath(std::string path, Ptr<const Packet> packet);
 
     /**
-     * \brief connect to a trace source attribute provided by a given object
+     * @brief connect to a trace source attribute provided by a given object
      *
-     * \param traceSource the name of the attribute TraceSource to connect to
-     * \param obj ns3::Object to connect to
-     * \return true if the trace source was successfully connected
+     * @param traceSource the name of the attribute TraceSource to connect to
+     * @param obj ns3::Object to connect to
+     * @return true if the trace source was successfully connected
      */
     bool ConnectByObject(std::string traceSource, Ptr<Object> obj) override;
 
     /**
-     * \brief connect to a trace source provided by a config path
+     * @brief connect to a trace source provided by a config path
      *
-     * \param path Config path to bind to
+     * @param path Config path to bind to
      *
      * Note, if an invalid path is provided, the probe will not be connected
      * to anything.
@@ -80,10 +80,10 @@
 
   private:
     /**
-     * \brief Method to connect to an underlying ns3::TraceSource with
+     * @brief Method to connect to an underlying ns3::TraceSource with
      * arguments of type Ptr<const Packet>
      *
-     * \param packet the traced packet
+     * @param packet the traced packet
      */
     void TraceSink(Ptr<const Packet> packet);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/packet-socket-address.h ns-3.44/src/network/utils/packet-socket-address.h
--- ns-3.43/src/network/utils/packet-socket-address.h	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/packet-socket-address.h	2025-03-09 16:55:49.679372300 -0700
@@ -21,9 +21,9 @@
 class NetDevice;
 
 /**
- * \ingroup address
+ * @ingroup address
  *
- * \brief an address for a packet socket
+ * @brief an address for a packet socket
  */
 class PacketSocketAddress
 {
@@ -31,83 +31,83 @@
     PacketSocketAddress();
 
     /**
-     * \brief Set the protocol
-     * \param protocol the protocol
+     * @brief Set the protocol
+     * @param protocol the protocol
      */
     void SetProtocol(uint16_t protocol);
 
     /**
-     * \brief Set the address to match all the outgoing NetDevice
+     * @brief Set the address to match all the outgoing NetDevice
      */
     void SetAllDevices();
 
     /**
-     * \brief Set the address to match only a specified NetDevice
-     * \param device the NetDevice index
+     * @brief Set the address to match only a specified NetDevice
+     * @param device the NetDevice index
      */
     void SetSingleDevice(uint32_t device);
 
     /**
-     * \brief Set the destination address
-     * \param address the destination address
+     * @brief Set the destination address
+     * @param address the destination address
      */
     void SetPhysicalAddress(const Address address);
 
     /**
-     * \brief Get the protocol
-     * \return the protocol
+     * @brief Get the protocol
+     * @return the protocol
      */
     uint16_t GetProtocol() const;
 
     /**
-     * \brief Get the device this address is bound to
-     * \return the device index
+     * @brief Get the device this address is bound to
+     * @return the device index
      */
     uint32_t GetSingleDevice() const;
 
     /**
-     * \brief Checks if the address is bound to a specified NetDevice
-     * \return true if the address is bound to a NetDevice
+     * @brief Checks if the address is bound to a specified NetDevice
+     * @return true if the address is bound to a NetDevice
      */
     bool IsSingleDevice() const;
 
     /**
-     * \brief Get the destination address
-     * \returns The destination address
+     * @brief Get the destination address
+     * @returns The destination address
      */
     Address GetPhysicalAddress() const;
 
     /**
-     * \returns a new Address instance
+     * @returns a new Address instance
      *
      * Convert an instance of this class to a polymorphic Address instance.
      */
     operator Address() const;
 
     /**
-     * \param address a polymorphic address
-     * \returns an Address
+     * @param address a polymorphic address
+     * @returns an Address
      * Convert a polymorphic address to an Mac48Address instance.
      * The conversion performs a type check.
      */
     static PacketSocketAddress ConvertFrom(const Address& address);
 
     /**
-     * \brief Convert an instance of this class to a polymorphic Address instance.
-     * \returns a new Address instance
+     * @brief Convert an instance of this class to a polymorphic Address instance.
+     * @returns a new Address instance
      */
     Address ConvertTo() const;
 
     /**
-     * \param address address to test
-     * \returns true if the address matches, false otherwise.
+     * @param address address to test
+     * @returns true if the address matches, false otherwise.
      */
     static bool IsMatchingType(const Address& address);
 
   private:
     /**
-     * \brief Return the Type of address.
-     * \return type of address
+     * @brief Return the Type of address.
+     * @return type of address
      */
     static uint8_t GetType();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/packet-socket.cc ns-3.44/src/network/utils/packet-socket.cc
--- ns-3.43/src/network/utils/packet-socket.cc	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/packet-socket.cc	2025-03-09 16:55:49.679372300 -0700
@@ -397,7 +397,7 @@
     {
         Ptr<Packet> copy = packet->Copy();
         DeviceNameTag dnt;
-        dnt.SetDeviceName(device->GetTypeId().GetName());
+        dnt.SetDeviceName(NetDevice::GetTypeId().GetName());
         PacketSocketTag pst;
         pst.SetPacketType(packetType);
         pst.SetDestAddress(to);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/packet-socket-client.cc ns-3.44/src/network/utils/packet-socket-client.cc
--- ns-3.43/src/network/utils/packet-socket-client.cc	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/packet-socket-client.cc	2025-03-09 16:55:49.679372300 -0700
@@ -47,7 +47,7 @@
                 MakeUintegerChecker<uint32_t>())
             .AddAttribute("Interval",
                           "The time to wait between packets",
-                          TimeValue(Seconds(1.0)),
+                          TimeValue(Seconds(1)),
                           MakeTimeAccessor(&PacketSocketClient::m_interval),
                           MakeTimeChecker())
             .AddAttribute("PacketSize",
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/packet-socket-client.h ns-3.44/src/network/utils/packet-socket-client.h
--- ns-3.43/src/network/utils/packet-socket-client.h	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/packet-socket-client.h	2025-03-09 16:55:49.679372300 -0700
@@ -23,9 +23,9 @@
 class Packet;
 
 /**
- * \ingroup socket
+ * @ingroup socket
  *
- * \brief A simple client.
+ * @brief A simple client.
  *
  * Sends packets using PacketSocket. It does not require (or use) IP.
  *
@@ -44,8 +44,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -54,14 +54,14 @@
     ~PacketSocketClient() override;
 
     /**
-     * \brief set the remote address and protocol to be used
-     * \param addr remote address
+     * @brief set the remote address and protocol to be used
+     * @param addr remote address
      */
     void SetRemote(PacketSocketAddress addr);
 
     /**
-     * \brief Query the priority value of this socket
-     * \return The priority value
+     * @brief Query the priority value of this socket
+     * @return The priority value
      */
     uint8_t GetPriority() const;
 
@@ -73,13 +73,13 @@
     void StopApplication() override;
 
     /**
-     * \brief Manually set the socket priority
-     * \param priority The socket priority (in the range 0..6)
+     * @brief Manually set the socket priority
+     * @param priority The socket priority (in the range 0..6)
      */
     void SetPriority(uint8_t priority);
 
     /**
-     * \brief Send a packet
+     * @brief Send a packet
      *
      * Either <i>Interval</i> and <i>MaxPackets</i> may be zero, but not both.  If <i>Interval</i>
      * is zero, the PacketSocketClient will send <i>MaxPackets</i> packets without any delay into
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/packet-socket-factory.h ns-3.44/src/network/utils/packet-socket-factory.h
--- ns-3.43/src/network/utils/packet-socket-factory.h	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/packet-socket-factory.h	2025-03-09 16:55:49.679372300 -0700
@@ -16,7 +16,7 @@
 class Socket;
 
 /**
- * \ingroup socket
+ * @ingroup socket
  *
  * This can be used as an interface in a node in order for the node to
  * generate PacketSockets that can connect to net devices.
@@ -25,8 +25,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -35,7 +35,7 @@
     /**
      * Creates a PacketSocket and returns a pointer to it.
      *
-     * \return a pointer to the created socket
+     * @return a pointer to the created socket
      */
     Ptr<Socket> CreateSocket() override;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/packet-socket.h ns-3.44/src/network/utils/packet-socket.h
--- ns-3.43/src/network/utils/packet-socket.h	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/packet-socket.h	2025-03-09 16:55:49.679372300 -0700
@@ -27,9 +27,9 @@
 class PacketSocketAddress;
 
 /**
- * \ingroup socket
+ * @ingroup socket
  *
- * \brief A PacketSocket is a link between an application and a net device.
+ * @brief A PacketSocket is a link between an application and a net device.
  *
  * A PacketSocket can be used to connect an application to a net
  * device. The application provides the buffers of data, the socket
@@ -76,16 +76,16 @@
  *
  * - DeviceNameTag:  contains the TypeId string of the relevant NetDevice
  *
- * \see class PacketSocketTag
- * \see class DeviceNameTag
+ * @see class PacketSocketTag
+ * @see class DeviceNameTag
  */
 
 class PacketSocket : public Socket
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -93,8 +93,8 @@
     ~PacketSocket() override;
 
     /**
-     * \brief Set the associated node.
-     * \param node the node
+     * @brief Set the associated node.
+     * @param node the node
      */
     void SetNode(Ptr<Node> node);
 
@@ -102,27 +102,27 @@
     SocketType GetSocketType() const override;
     Ptr<Node> GetNode() const override;
     /**
-     * \brief Bind the socket to the NetDevice and register the protocol handler.
+     * @brief Bind the socket to the NetDevice and register the protocol handler.
      *
-     * \warning this will actually bind protocol "0".
+     * @warning this will actually bind protocol "0".
      *
-     * \returns 0 on success, -1 on failure.
+     * @returns 0 on success, -1 on failure.
      */
     int Bind() override;
     /**
-     * \brief Bind the socket to the NetDevice and register the protocol handler.
+     * @brief Bind the socket to the NetDevice and register the protocol handler.
      *
-     * \warning this will actually bind protocol "0".
+     * @warning this will actually bind protocol "0".
      *
-     * \returns 0 on success, -1 on failure.
+     * @returns 0 on success, -1 on failure.
      */
     int Bind6() override;
     /**
-     * \brief Bind the socket to the NetDevice and register the
+     * @brief Bind the socket to the NetDevice and register the
      *        protocol handler specified in the address.
      *
-     * \param address the packet socket address
-     * \returns 0 on success, -1 on failure.
+     * @param address the packet socket address
+     * @returns 0 on success, -1 on failure.
      */
     int Bind(const Address& address) override;
     int Close() override;
@@ -143,14 +143,14 @@
 
   private:
     /**
-     * \brief Called by the L3 protocol when it received a packet to pass on to TCP.
+     * @brief Called by the L3 protocol when it received a packet to pass on to TCP.
      *
-     * \param device the incoming NetDevice
-     * \param packet the incoming packet
-     * \param protocol the protocol
-     * \param from sender address
-     * \param to destination address
-     * \param packetType packet type
+     * @param device the incoming NetDevice
+     * @param packet the incoming packet
+     * @param protocol the protocol
+     * @param from sender address
+     * @param to destination address
+     * @param packetType packet type
      */
     void ForwardUp(Ptr<NetDevice> device,
                    Ptr<const Packet> packet,
@@ -159,23 +159,23 @@
                    const Address& to,
                    NetDevice::PacketType packetType);
     /**
-     * \brief Bind the socket to the NetDevice and register the
+     * @brief Bind the socket to the NetDevice and register the
      *        protocol handler specified in the address.
-     * \param address the packet socket address
-     * \returns 0 on success, -1 on failure.
+     * @param address the packet socket address
+     * @returns 0 on success, -1 on failure.
      */
     int DoBind(const PacketSocketAddress& address);
 
     /**
-     * \brief Get the minimum MTU supported by the NetDevices bound to a specific address
-     * \param ad the socket address to check for
-     * \returns The minimum MTU
+     * @brief Get the minimum MTU supported by the NetDevices bound to a specific address
+     * @param ad the socket address to check for
+     * @returns The minimum MTU
      */
     uint32_t GetMinMtu(PacketSocketAddress ad) const;
     void DoDispose() override;
 
     /**
-     * \brief States of the socket
+     * @brief States of the socket
      */
     enum State
     {
@@ -206,7 +206,7 @@
 };
 
 /**
- * \brief  This class implements a tag that carries the dest address of a packet and the packet
+ * @brief  This class implements a tag that carries the dest address of a packet and the packet
  * type.
  */
 class PacketSocketTag : public Tag
@@ -238,8 +238,8 @@
     Address GetDestAddress() const;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -254,7 +254,7 @@
 };
 
 /**
- * \brief  This class implements a tag that carries the ns3 device name from where a packet is
+ * @brief  This class implements a tag that carries the ns3 device name from where a packet is
  * coming.
  */
 class DeviceNameTag : public Tag
@@ -275,8 +275,8 @@
      */
     std::string GetDeviceName() const;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/packet-socket-server.h ns-3.44/src/network/utils/packet-socket-server.h
--- ns-3.43/src/network/utils/packet-socket-server.h	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/packet-socket-server.h	2025-03-09 16:55:49.679372300 -0700
@@ -23,9 +23,9 @@
 class Packet;
 
 /**
- * \ingroup socket
+ * @ingroup socket
  *
- * \brief A server using PacketSocket.
+ * @brief A server using PacketSocket.
  *
  * Receives packets using PacketSocket. It does not require (or use) IP.
  * The application has the same requirements as the PacketSocket for
@@ -38,8 +38,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -48,8 +48,8 @@
     ~PacketSocketServer() override;
 
     /**
-     * \brief set the local address and protocol to be used
-     * \param addr local address
+     * @brief set the local address and protocol to be used
+     * @param addr local address
      */
     void SetLocal(PacketSocketAddress addr);
 
@@ -61,8 +61,8 @@
     void StopApplication() override;
 
     /**
-     * \brief Handle a packet received by the application
-     * \param socket the receiving socket
+     * @brief Handle a packet received by the application
+     * @param socket the receiving socket
      */
     void HandleRead(Ptr<Socket> socket);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/pcap-file.h ns-3.44/src/network/utils/pcap-file.h
--- ns-3.43/src/network/utils/pcap-file.h	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/pcap-file.h	2025-03-09 16:55:49.679372300 -0700
@@ -22,7 +22,7 @@
 class Header;
 
 /**
- * \brief A class representing a pcap file
+ * @brief A class representing a pcap file
  *
  * A class representing a pcap file.  This allows easy creation, writing and
  * reading of files composed of stored packets; which may be viewed using
@@ -40,11 +40,11 @@
     ~PcapFile();
 
     /**
-     * \return true if the 'fail' bit is set in the underlying iostream, false otherwise.
+     * @return true if the 'fail' bit is set in the underlying iostream, false otherwise.
      */
     bool Fail() const;
     /**
-     * \return true if the 'eof' bit is set in the underlying iostream, false otherwise.
+     * @return true if the 'eof' bit is set in the underlying iostream, false otherwise.
      */
     bool Eof() const;
     /**
@@ -64,9 +64,9 @@
      * selected as a binary file (fstream::binary is automatically ored with the mode
      * field).
      *
-     * \param filename String containing the name of the file.
+     * @param filename String containing the name of the file.
      *
-     * \param mode the access mode for the file.
+     * @param mode the access mode for the file.
      */
     void Open(const std::string& filename, std::ios::openmode mode);
 
@@ -79,7 +79,7 @@
      * Initialize the pcap file associated with this object.  This file must have
      * been previously opened with write permissions.
      *
-     * \param dataLinkType A data link type as defined in the pcap library.  If
+     * @param dataLinkType A data link type as defined in the pcap library.  If
      * you want to make resulting pcap files visible in existing tools, the
      * data link type must match existing definitions, such as PCAP_ETHERNET,
      * PCAP_PPP, PCAP_80211, etc.  If you are storing different kinds of packet
@@ -88,20 +88,20 @@
      * pcap linktypes range from 0 to 263.  If you use a large random number for
      * your type, chances are small for a collision.
      *
-     * \param snapLen An optional maximum size for packets written to the file.
+     * @param snapLen An optional maximum size for packets written to the file.
      * Defaults to 65535.  If packets exceed this length they are truncated.
      *
-     * \param timeZoneCorrection An integer describing the offset of your local
+     * @param timeZoneCorrection An integer describing the offset of your local
      * time zone from UTC/GMT.  For example, Pacific Standard Time in the US is
      * GMT-8, so one would enter -8 for that correction.  Defaults to 0 (UTC).
      *
-     * \param swapMode Flag indicating a difference in endianness of the
+     * @param swapMode Flag indicating a difference in endianness of the
      * writing system. Defaults to false.
      *
-     * \param nanosecMode Flag indicating the time resolution of the writing
+     * @param nanosecMode Flag indicating the time resolution of the writing
      * system. Default to false.
      *
-     * \warning Calling this method on an existing file will result in the loss
+     * @warning Calling this method on an existing file will result in the loss
      * any existing data.
      */
     void Init(uint32_t dataLinkType,
@@ -111,46 +111,46 @@
               bool nanosecMode = false);
 
     /**
-     * \brief Write next packet to file
+     * @brief Write next packet to file
      *
-     * \param tsSec       Packet timestamp, seconds
-     * \param tsUsec      Packet timestamp, microseconds
-     * \param data        Data buffer
-     * \param totalLen    Total packet length
+     * @param tsSec       Packet timestamp, seconds
+     * @param tsUsec      Packet timestamp, microseconds
+     * @param data        Data buffer
+     * @param totalLen    Total packet length
      *
      */
     void Write(uint32_t tsSec, uint32_t tsUsec, const uint8_t* const data, uint32_t totalLen);
 
     /**
-     * \brief Write next packet to file
+     * @brief Write next packet to file
      *
-     * \param tsSec       Packet timestamp, seconds
-     * \param tsUsec      Packet timestamp, microseconds
-     * \param p           Packet to write
+     * @param tsSec       Packet timestamp, seconds
+     * @param tsUsec      Packet timestamp, microseconds
+     * @param p           Packet to write
      *
      */
     void Write(uint32_t tsSec, uint32_t tsUsec, Ptr<const Packet> p);
     /**
-     * \brief Write next packet to file
+     * @brief Write next packet to file
      *
-     * \param tsSec       Packet timestamp, seconds
-     * \param tsUsec      Packet timestamp, microseconds
-     * \param header      Header to write, in front of packet
-     * \param p           Packet to write
+     * @param tsSec       Packet timestamp, seconds
+     * @param tsUsec      Packet timestamp, microseconds
+     * @param header      Header to write, in front of packet
+     * @param p           Packet to write
      *
      */
     void Write(uint32_t tsSec, uint32_t tsUsec, const Header& header, Ptr<const Packet> p);
 
     /**
-     * \brief Read next packet from file
+     * @brief Read next packet from file
      *
-     * \param data        [out] Data buffer
-     * \param maxBytes    Allocated data buffer size
-     * \param tsSec       [out] Packet timestamp, seconds
-     * \param tsUsec      [out] Packet timestamp, microseconds
-     * \param inclLen     [out] Included length
-     * \param origLen     [out] Original length
-     * \param readLen     [out] Number of bytes read
+     * @param data        [out] Data buffer
+     * @param maxBytes    Allocated data buffer size
+     * @param tsSec       [out] Packet timestamp, seconds
+     * @param tsUsec      [out] Packet timestamp, microseconds
+     * @param inclLen     [out] Included length
+     * @param origLen     [out] Original length
+     * @param readLen     [out] Number of bytes read
      *
      */
     void Read(uint8_t* const data,
@@ -162,7 +162,7 @@
               uint32_t& readLen);
 
     /**
-     * \brief Get the swap mode of the file.
+     * @brief Get the swap mode of the file.
      *
      * Pcap files use a magic number that is overloaded to identify both the
      * format of the file itself and the byte ordering of the file.  The magic
@@ -178,101 +178,101 @@
      * useful as a flag indicating a difference in endianness of the writing
      * system.
      *
-     * \returns swap mode of the file
+     * @returns swap mode of the file
      */
     bool GetSwapMode();
 
     /**
-     * \brief Get the nanosecond mode of the file.
+     * @brief Get the nanosecond mode of the file.
      *
-     * \returns true if the packet timestamps in the PCAP
+     * @returns true if the packet timestamps in the PCAP
      * file have nanosecond resolution.
      */
     bool IsNanoSecMode();
 
     /**
-     * \brief Returns the magic number of the pcap file as defined by the magic_number
+     * @brief Returns the magic number of the pcap file as defined by the magic_number
      * field in the pcap global header.
      *
      * See http://wiki.wireshark.org/Development/LibpcapFileFormat
      *
-     * \returns magic number
+     * @returns magic number
      */
     uint32_t GetMagic();
 
     /**
-     * \brief Returns the major version of the pcap file as defined by the version_major
+     * @brief Returns the major version of the pcap file as defined by the version_major
      * field in the pcap global header.
      *
      * See http://wiki.wireshark.org/Development/LibpcapFileFormat
      *
-     * \returns major version
+     * @returns major version
      */
     uint16_t GetVersionMajor();
 
     /**
-     * \brief Returns the minor version of the pcap file as defined by the version_minor
+     * @brief Returns the minor version of the pcap file as defined by the version_minor
      * field in the pcap global header.
      *
      * See http://wiki.wireshark.org/Development/LibpcapFileFormat
      *
-     * \returns minor version
+     * @returns minor version
      */
     uint16_t GetVersionMinor();
 
     /**
-     * \brief Returns the time zone offset of the pcap file as defined by the thiszone
+     * @brief Returns the time zone offset of the pcap file as defined by the thiszone
      * field in the pcap global header.
      *
      * See http://wiki.wireshark.org/Development/LibpcapFileFormat
      *
-     * \returns time zone offset
+     * @returns time zone offset
      */
     int32_t GetTimeZoneOffset();
 
     /**
-     * \brief Returns the accuracy of timestamps field of the pcap file as defined
+     * @brief Returns the accuracy of timestamps field of the pcap file as defined
      * by the sigfigs field in the pcap global header.
      *
      * See http://wiki.wireshark.org/Development/LibpcapFileFormat
      *
-     * \returns accuracy of timestamps
+     * @returns accuracy of timestamps
      */
     uint32_t GetSigFigs();
 
     /**
-     * \brief Returns the max length of saved packets field of the pcap file as
+     * @brief Returns the max length of saved packets field of the pcap file as
      * defined by the snaplen field in the pcap global header.
      *
      * See http://wiki.wireshark.org/Development/LibpcapFileFormat
      *
-     * \returns max length of saved packets field
+     * @returns max length of saved packets field
      */
     uint32_t GetSnapLen();
 
     /**
-     * \brief Returns the data link type field of the pcap file as defined by the
+     * @brief Returns the data link type field of the pcap file as defined by the
      * network field in the pcap global header.
      *
      * See http://wiki.wireshark.org/Development/LibpcapFileFormat
      *
-     * \returns data link type field
+     * @returns data link type field
      */
     uint32_t GetDataLinkType();
 
     /**
-     * \brief Compare two PCAP files packet-by-packet
+     * @brief Compare two PCAP files packet-by-packet
      *
-     * \param f1 First PCAP file name
-     * \param f2 Second PCAP file name
-     * \param sec [out] Time stamp of first different packet, seconds. Undefined if files don't
+     * @param f1 First PCAP file name
+     * @param f2 Second PCAP file name
+     * @param sec [out] Time stamp of first different packet, seconds. Undefined if files don't
      * differ.
-     * \param usec [out] Time stamp of first different packet, microseconds. Undefined if files
+     * @param usec [out] Time stamp of first different packet, microseconds. Undefined if files
      * don't differ.
-     * \param packets [out] Number of first different packet. Total number of parsed packets if
+     * @param packets [out] Number of first different packet. Total number of parsed packets if
      * files don't differ.
-     * \param snapLen Snap length (if used)
-     * \return true if files are different, false otherwise
+     * @param snapLen Snap length (if used)
+     * @return true if files are different, false otherwise
      */
     static bool Diff(const std::string& f1,
                      const std::string& f2,
@@ -283,7 +283,7 @@
 
   private:
     /**
-     * \brief Pcap file header
+     * @brief Pcap file header
      */
     struct PcapFileHeader
     {
@@ -299,7 +299,7 @@
     };
 
     /**
-     * \brief Pcap record header
+     * @brief Pcap record header
      */
     struct PcapRecordHeader
     {
@@ -310,55 +310,55 @@
     };
 
     /**
-     * \brief Swap a value byte order
-     * \param val the value
-     * \returns the value with byte order swapped
+     * @brief Swap a value byte order
+     * @param val the value
+     * @returns the value with byte order swapped
      */
     uint8_t Swap(uint8_t val);
     /**
-     * \brief Swap a value byte order
-     * \param val the value
-     * \returns the value with byte order swapped
+     * @brief Swap a value byte order
+     * @param val the value
+     * @returns the value with byte order swapped
      */
     uint16_t Swap(uint16_t val);
     /**
-     * \brief Swap a value byte order
-     * \param val the value
-     * \returns the value with byte order swapped
+     * @brief Swap a value byte order
+     * @param val the value
+     * @returns the value with byte order swapped
      */
     uint32_t Swap(uint32_t val);
     /**
-     * \brief Swap the byte order of a Pcap file header
-     * \param from original file header
-     * \param to swapped file header
+     * @brief Swap the byte order of a Pcap file header
+     * @param from original file header
+     * @param to swapped file header
      */
     void Swap(PcapFileHeader* from, PcapFileHeader* to);
     /**
-     * \brief Swap the byte order of a Pcap record header
-     * \param from original record header
-     * \param to swapped record header
+     * @brief Swap the byte order of a Pcap record header
+     * @param from original record header
+     * @param to swapped record header
      */
     void Swap(PcapRecordHeader* from, PcapRecordHeader* to);
 
     /**
-     * \brief Write a Pcap file header
+     * @brief Write a Pcap file header
      */
     void WriteFileHeader();
     /**
-     * \brief Write a Pcap packet header
+     * @brief Write a Pcap packet header
      *
      * The pcap header has a fixed length of 24 bytes. The last 4 bytes
      * represent the link-layer type
      *
-     * \param tsSec Time stamp (seconds part)
-     * \param tsUsec Time stamp (microseconds part)
-     * \param totalLen total packet length
-     * \returns the length of the packet to write in the Pcap file
+     * @param tsSec Time stamp (seconds part)
+     * @param tsUsec Time stamp (microseconds part)
+     * @param totalLen total packet length
+     * @returns the length of the packet to write in the Pcap file
      */
     uint32_t WritePacketHeader(uint32_t tsSec, uint32_t tsUsec, uint32_t totalLen);
 
     /**
-     * \brief Read and verify a Pcap file header
+     * @brief Read and verify a Pcap file header
      */
     void ReadAndVerifyFileHeader();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/pcap-file-wrapper.h ns-3.44/src/network/utils/pcap-file-wrapper.h
--- ns-3.43/src/network/utils/pcap-file-wrapper.h	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/pcap-file-wrapper.h	2025-03-09 16:55:49.679372300 -0700
@@ -31,8 +31,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -40,11 +40,11 @@
     ~PcapFileWrapper() override;
 
     /**
-     * \return true if the 'fail' bit is set in the underlying iostream, false otherwise.
+     * @return true if the 'fail' bit is set in the underlying iostream, false otherwise.
      */
     bool Fail() const;
     /**
-     * \return true if the 'eof' bit is set in the underlying iostream, false otherwise.
+     * @return true if the 'eof' bit is set in the underlying iostream, false otherwise.
      */
     bool Eof() const;
     /**
@@ -60,9 +60,9 @@
      * selected as a binary file (fstream::binary is automatically ored with the mode
      * field).
      *
-     * \param filename String containing the name of the file.
+     * @param filename String containing the name of the file.
      *
-     * \param mode String containing the access mode for the file.
+     * @param mode String containing the access mode for the file.
      *
      */
     void Open(const std::string& filename, std::ios::openmode mode);
@@ -76,7 +76,7 @@
      * Initialize the pcap file associated with this wrapper.  This file must have
      * been previously opened with write permissions.
      *
-     * \param dataLinkType A data link type as defined in the pcap library.  If
+     * @param dataLinkType A data link type as defined in the pcap library.  If
      * you want to make resulting pcap files visible in existing tools, the
      * data link type must match existing definitions, such as PCAP_ETHERNET,
      * PCAP_PPP, PCAP_80211, etc.  If you are storing different kinds of packet
@@ -85,14 +85,14 @@
      * pcap linktypes range from 0 to 177.  If you use a large random number for
      * your type, chances are small for a collision.
      *
-     * \param snapLen An optional maximum size for packets written to the file.
+     * @param snapLen An optional maximum size for packets written to the file.
      * Defaults to 65535.  If packets exceed this length they are truncated.
      *
-     * \param tzCorrection An integer describing the offset of your local
+     * @param tzCorrection An integer describing the offset of your local
      * time zone from UTC/GMT.  For example, Pacific Standard Time in the US is
      * GMT-8, so one would enter -8 for that correction.  Defaults to 0 (UTC).
      *
-     * \warning Calling this method on an existing file will result in the loss
+     * @warning Calling this method on an existing file will result in the loss
      * any existing data.
      */
     void Init(uint32_t dataLinkType,
@@ -100,113 +100,113 @@
               int32_t tzCorrection = PcapFile::ZONE_DEFAULT);
 
     /**
-     * \brief Write the next packet to file
+     * @brief Write the next packet to file
      *
-     * \param t Packet timestamp as ns3::Time.
-     * \param p Packet to write to the pcap file.
+     * @param t Packet timestamp as ns3::Time.
+     * @param p Packet to write to the pcap file.
      *
      */
     void Write(Time t, Ptr<const Packet> p);
 
     /**
-     * \brief Write the provided header along with the packet to the pcap file.
+     * @brief Write the provided header along with the packet to the pcap file.
      *
      * It is the case that adding a header to a packet prior to writing it to a
      * file must trigger a deep copy in the Packet.  By providing the header
      * separately, we can avoid that copy.
      *
-     * \param t Packet timestamp as ns3::Time.
-     * \param header The Header to prepend to the packet.
-     * \param p Packet to write to the pcap file.
+     * @param t Packet timestamp as ns3::Time.
+     * @param header The Header to prepend to the packet.
+     * @param p Packet to write to the pcap file.
      *
      */
     void Write(Time t, const Header& header, Ptr<const Packet> p);
 
     /**
-     * \brief Write the provided data buffer to the pcap file.
+     * @brief Write the provided data buffer to the pcap file.
      *
-     * \param t Packet timestamp as ns3::Time.
-     * \param buffer The buffer to write.
-     * \param length The size of the buffer.
+     * @param t Packet timestamp as ns3::Time.
+     * @param buffer The buffer to write.
+     * @param length The size of the buffer.
      *
      */
     void Write(Time t, const uint8_t* buffer, uint32_t length);
 
     /**
-     * \brief Read the next packet from the file.
+     * @brief Read the next packet from the file.
      *
-     * \param t Reference to packet timestamp as ns3::Time.
-     * \returns a pointer to ns3::Packet.
+     * @param t Reference to packet timestamp as ns3::Time.
+     * @returns a pointer to ns3::Packet.
      */
     Ptr<Packet> Read(Time& t);
 
     /**
-     * \brief Returns the magic number of the pcap file as defined by the magic_number
+     * @brief Returns the magic number of the pcap file as defined by the magic_number
      * field in the pcap global header.
      *
      * See http://wiki.wireshark.org/Development/LibpcapFileFormat
      *
-     * \returns magic number
+     * @returns magic number
      */
     uint32_t GetMagic();
 
     /**
-     * \brief Returns the major version of the pcap file as defined by the version_major
+     * @brief Returns the major version of the pcap file as defined by the version_major
      * field in the pcap global header.
      *
      * See http://wiki.wireshark.org/Development/LibpcapFileFormat
      *
-     * \returns major version
+     * @returns major version
      */
     uint16_t GetVersionMajor();
 
     /**
-     * \brief Returns the minor version of the pcap file as defined by the version_minor
+     * @brief Returns the minor version of the pcap file as defined by the version_minor
      * field in the pcap global header.
      *
      * See http://wiki.wireshark.org/Development/LibpcapFileFormat
      *
-     * \returns minor version
+     * @returns minor version
      */
     uint16_t GetVersionMinor();
 
     /**
-     * \brief Returns the time zone offset of the pcap file as defined by the thiszone
+     * @brief Returns the time zone offset of the pcap file as defined by the thiszone
      * field in the pcap global header.
      *
      * See http://wiki.wireshark.org/Development/LibpcapFileFormat
      *
-     * \returns time zone offset
+     * @returns time zone offset
      */
     int32_t GetTimeZoneOffset();
 
     /**
-     * \brief Returns the accuracy of timestamps field of the pcap file as defined
+     * @brief Returns the accuracy of timestamps field of the pcap file as defined
      * by the sigfigs field in the pcap global header.
      *
      * See http://wiki.wireshark.org/Development/LibpcapFileFormat
      *
-     * \returns accuracy of timestamps
+     * @returns accuracy of timestamps
      */
     uint32_t GetSigFigs();
 
     /**
-     * \brief Returns the max length of saved packets field of the pcap file as
+     * @brief Returns the max length of saved packets field of the pcap file as
      * defined by the snaplen field in the pcap global header.
      *
      * See http://wiki.wireshark.org/Development/LibpcapFileFormat
      *
-     * \returns max length of saved packets field
+     * @returns max length of saved packets field
      */
     uint32_t GetSnapLen();
 
     /**
-     * \brief Returns the data link type field of the pcap file as defined by the
+     * @brief Returns the data link type field of the pcap file as defined by the
      * network field in the pcap global header.
      *
      * See http://wiki.wireshark.org/Development/LibpcapFileFormat
      *
-     * \returns data link type field
+     * @returns data link type field
      */
     uint32_t GetDataLinkType();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/pcap-test.h ns-3.44/src/network/utils/pcap-test.h
--- ns-3.43/src/network/utils/pcap-test.h	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/pcap-test.h	2025-03-09 16:55:49.679372300 -0700
@@ -18,11 +18,11 @@
 #include <string>
 
 /**
- * \brief Test that a pair of reference/new pcap files are equal
+ * @brief Test that a pair of reference/new pcap files are equal
  *
  * The filename is interpreted as a stream.
  *
- * \param filename The name of the file to read in the reference/temporary
+ * @param filename The name of the file to read in the reference/temporary
  *        directories
  */
 #define NS_PCAP_TEST_EXPECT_EQ(filename)                                                           \
@@ -35,7 +35,7 @@
         uint32_t sec{0};                                                                           \
         uint32_t usec{0};                                                                          \
         uint32_t packets{0};                                                                       \
-        /** \todo support default PcapWriter snap length here */                                   \
+        /** @todo support default PcapWriter snap length here */                                   \
         bool diff = PcapFile::Diff(got, expected, sec, usec, packets);                             \
         NS_TEST_EXPECT_MSG_EQ(diff,                                                                \
                               false,                                                               \
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/queue-fwd.h ns-3.44/src/network/utils/queue-fwd.h
--- ns-3.43/src/network/utils/queue-fwd.h	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/queue-fwd.h	2025-03-09 16:55:49.679372300 -0700
@@ -12,8 +12,8 @@
 #include <list>
 
 /**
- * \file
- * \ingroup queue
+ * @file
+ * @ingroup queue
  * Forward declaration of template class Queue.
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/queue.h ns-3.44/src/network/utils/queue.h
--- ns-3.43/src/network/utils/queue.h	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/queue.h	2025-03-09 16:55:49.679372300 -0700
@@ -29,13 +29,13 @@
 {
 
 /**
- * \ingroup network
- * \defgroup queue Queue
+ * @ingroup network
+ * @defgroup queue Queue
  */
 
 /**
- * \ingroup queue
- * \brief Abstract base class for packet Queues
+ * @ingroup queue
+ * @brief Abstract base class for packet Queues
  *
  * This class defines the subset of the base APIs for packet queues in the ns-3 system
  * that is independent of the type of enqueued objects
@@ -44,8 +44,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -53,19 +53,19 @@
     ~QueueBase() override;
 
     /**
-     * \brief Append the item type to the provided type ID if the latter does not
+     * @brief Append the item type to the provided type ID if the latter does not
      *        end with '>'
      *
-     * \param typeId the type ID
-     * \param itemType the item type
+     * @param typeId the type ID
+     * @param itemType the item type
      *
      * This method is meant to be invoked by helpers to save users from
      * specifying the type of items stored in a queue. For instance,
      * PointToPointHelper::SetQueue calls
      *
-     * \code
+     * @code
      *   QueueBase::AppendItemTypeIfNotPresent (type, "Packet");
-     * \endcode
+     * @endcode
      *
      * where type specifies the queue type (e.g., "ns3::DropTailQueue").
      * This allows users to call SetQueue ("ns3::DropTailQueue")
@@ -74,77 +74,77 @@
     static void AppendItemTypeIfNotPresent(std::string& typeId, const std::string& itemType);
 
     /**
-     * \return true if the queue is empty; false otherwise
+     * @return true if the queue is empty; false otherwise
      */
     bool IsEmpty() const;
 
     /**
-     * \return The number of packets currently stored in the Queue
+     * @return The number of packets currently stored in the Queue
      */
     uint32_t GetNPackets() const;
 
     /**
-     * \return The number of bytes currently occupied by the packets in the Queue
+     * @return The number of bytes currently occupied by the packets in the Queue
      */
     uint32_t GetNBytes() const;
 
     /**
-     * \return The current size of the Queue in terms of packets, if the maximum
+     * @return The current size of the Queue in terms of packets, if the maximum
      *         size is specified in packets, or bytes, otherwise
      */
     QueueSize GetCurrentSize() const;
 
     /**
-     * \return The total number of bytes received by this Queue since the
+     * @return The total number of bytes received by this Queue since the
      * simulation began, or since ResetStatistics was called, according to
      * whichever happened more recently
      */
     uint32_t GetTotalReceivedBytes() const;
 
     /**
-     * \return The total number of packets received by this Queue since the
+     * @return The total number of packets received by this Queue since the
      * simulation began, or since ResetStatistics was called, according to
      * whichever happened more recently
      */
     uint32_t GetTotalReceivedPackets() const;
 
     /**
-     * \return The total number of bytes dropped by this Queue since the
+     * @return The total number of bytes dropped by this Queue since the
      * simulation began, or since ResetStatistics was called, according to
      * whichever happened more recently
      */
     uint32_t GetTotalDroppedBytes() const;
 
     /**
-     * \return The total number of bytes dropped before enqueue by this Queue
+     * @return The total number of bytes dropped before enqueue by this Queue
      * since the simulation began, or since ResetStatistics was called, according
      * to whichever happened more recently
      */
     uint32_t GetTotalDroppedBytesBeforeEnqueue() const;
 
     /**
-     * \return The total number of bytes dropped after dequeue by this Queue
+     * @return The total number of bytes dropped after dequeue by this Queue
      * since the simulation began, or since ResetStatistics was called, according
      * to whichever happened more recently
      */
     uint32_t GetTotalDroppedBytesAfterDequeue() const;
 
     /**
-     * \return The total number of packets dropped by this Queue since the
+     * @return The total number of packets dropped by this Queue since the
      * simulation began, or since ResetStatistics was called, according to
      * whichever happened more recently
      */
     uint32_t GetTotalDroppedPackets() const;
 
     /**
-     * \return The total number of packets dropped before enqueue by this Queue
+     * @return The total number of packets dropped before enqueue by this Queue
      * since the simulation began, or since ResetStatistics was called, according
      * to whichever happened more recently
      */
     uint32_t GetTotalDroppedPacketsBeforeEnqueue() const;
 
     /**
-     * \return The total number of packets dropped after dequeue by this Queue
+     * @return The total number of packets dropped after dequeue by this Queue
      * since the simulation began, or since ResetStatistics was called, according
      * to whichever happened more recently
      */
@@ -157,25 +157,25 @@
     void ResetStatistics();
 
     /**
-     * \brief Set the maximum size of this queue
+     * @brief Set the maximum size of this queue
      *
      * Trying to set a null size has no effect.
      *
-     * \param size the maximum size
+     * @param size the maximum size
      */
     void SetMaxSize(QueueSize size);
 
     /**
-     * \return the maximum size of this queue
+     * @return the maximum size of this queue
      */
     QueueSize GetMaxSize() const;
 
     /**
-     * \brief Check if the queue would overflow with additional bytes or packets
+     * @brief Check if the queue would overflow with additional bytes or packets
      * Note: the check is performed according to the queue's operating mode (bytes or packets).
-     * \param nPackets number of additional packets
-     * \param nBytes number of additional bytes
-     * \return true if the queue should overflow, false otherwise.
+     * @param nPackets number of additional packets
+     * @param nBytes number of additional bytes
+     * @return true if the queue should overflow, false otherwise.
      */
     bool WouldOverflow(uint32_t nPackets, uint32_t nBytes) const;
 
@@ -219,8 +219,8 @@
 };
 
 /**
- * \ingroup queue
- * \brief Template class for packet Queues
+ * @ingroup queue
+ * @brief Template class for packet Queues
  *
  * This class defines the subset of the base APIs for packet queues in the ns-3 system
  * that is dependent on the type of enqueued objects.
@@ -249,16 +249,16 @@
  * value for the template template parameter, instead of queue.h in your .h file.
  * Then, include queue.h in the corresponding .cc file.
  *
- * \tparam Item \explicit Type of the objects stored within the queue
- * \tparam Container \explicit Type of the container that stores queue items
+ * @tparam Item \explicit Type of the objects stored within the queue
+ * @tparam Container \explicit Type of the container that stores queue items
  */
 template <typename Item, typename Container>
 class Queue : public QueueBase
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -267,29 +267,29 @@
 
     /**
      * Place an item into the Queue (each subclass defines the position)
-     * \param item item to enqueue
-     * \return True if the operation was successful; false otherwise
+     * @param item item to enqueue
+     * @return True if the operation was successful; false otherwise
      */
     virtual bool Enqueue(Ptr<Item> item) = 0;
 
     /**
      * Remove an item from the Queue (each subclass defines the position),
      * counting it and tracing it as dequeued
-     * \return 0 if the operation was not successful; the item otherwise.
+     * @return 0 if the operation was not successful; the item otherwise.
      */
     virtual Ptr<Item> Dequeue() = 0;
 
     /**
      * Remove an item from the Queue (each subclass defines the position),
      * counting it and tracing it as both dequeued and dropped
-     * \return 0 if the operation was not successful; the item otherwise.
+     * @return 0 if the operation was not successful; the item otherwise.
      */
     virtual Ptr<Item> Remove() = 0;
 
     /**
      * Get a copy of an item in the queue (each subclass defines the position)
      * without removing it
-     * \return 0 if the operation was not successful; the item otherwise.
+     * @return 0 if the operation was not successful; the item otherwise.
      */
     virtual Ptr<const Item> Peek() const = 0;
 
@@ -312,51 +312,51 @@
     /**
      * Get a const reference to the container of queue items.
      *
-     * \return a const reference to the container of queue items
+     * @return a const reference to the container of queue items
      */
     const Container& GetContainer() const;
 
     /**
      * Push an item in the queue
-     * \param pos the position before which the item will be inserted
-     * \param item the item to enqueue
-     * \return true if success, false if the packet has been dropped.
+     * @param pos the position before which the item will be inserted
+     * @param item the item to enqueue
+     * @return true if success, false if the packet has been dropped.
      */
     bool DoEnqueue(ConstIterator pos, Ptr<Item> item);
 
     /**
      * Push an item in the queue
-     * \param pos the position before which the item will be inserted
-     * \param item the item to enqueue
+     * @param pos the position before which the item will be inserted
+     * @param item the item to enqueue
      * \param[out] ret an iterator pointing to the inserted value
-     * \return true if success, false if the packet has been dropped.
+     * @return true if success, false if the packet has been dropped.
      */
     bool DoEnqueue(ConstIterator pos, Ptr<Item> item, Iterator& ret);
 
     /**
      * Pull the item to dequeue from the queue
-     * \param pos the position of the item to dequeue
-     * \return the item.
+     * @param pos the position of the item to dequeue
+     * @return the item.
      */
     Ptr<Item> DoDequeue(ConstIterator pos);
 
     /**
      * Pull the item to drop from the queue
-     * \param pos the position of the item to remove
-     * \return the item.
+     * @param pos the position of the item to remove
+     * @return the item.
      */
     Ptr<Item> DoRemove(ConstIterator pos);
 
     /**
      * Peek the front item in the queue
-     * \param pos the position of the item to peek
-     * \return the item.
+     * @param pos the position of the item to peek
+     * @return the item.
      */
     Ptr<const Item> DoPeek(ConstIterator pos) const;
 
     /**
-     * \brief Drop a packet before enqueue
-     * \param item item that was dropped
+     * @brief Drop a packet before enqueue
+     * @param item item that was dropped
      *
      * This method is called by the base class when a packet is dropped because
      * the queue is full and by the subclasses to notify parent (this class) that
@@ -365,8 +365,8 @@
     void DropBeforeEnqueue(Ptr<Item> item);
 
     /**
-     * \brief Drop a packet after dequeue
-     * \param item item that was dropped
+     * @brief Drop a packet after dequeue
+     * @param item item that was dropped
      *
      * This method is called by the base class when a Remove operation is requested
      * and by the subclasses to notify parent (this class) that a packet has been
@@ -374,7 +374,7 @@
      */
     void DropAfterDequeue(Ptr<Item> item);
 
-    /** \copydoc ns3::Object::DoDispose */
+    /** @copydoc ns3::Object::DoDispose */
     void DoDispose() override;
 
   private:
@@ -389,8 +389,8 @@
     struct MakeGetItem
     {
         /**
-         * \param it the given const iterator
-         * \return the item included in the element pointed to by the given iterator
+         * @param it the given const iterator
+         * @return the item included in the element pointed to by the given iterator
          */
         static Ptr<Item> GetItem(const Container&, const ConstIterator it)
         {
@@ -410,9 +410,9 @@
         std::void_t<decltype(std::declval<T>().GetItem(std::declval<ConstIterator>()))>>
     {
         /**
-         * \param container the container
-         * \param it the given const iterator
-         * \return the item included in the element pointed to by the given iterator
+         * @param container the container
+         * @param it the given const iterator
+         * @return the item included in the element pointed to by the given iterator
          */
         static Ptr<Item> GetItem(const Container& container, const ConstIterator it)
         {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/queue-item.h ns-3.44/src/network/utils/queue-item.h
--- ns-3.43/src/network/utils/queue-item.h	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/queue-item.h	2025-03-09 16:55:49.679372300 -0700
@@ -8,10 +8,10 @@
 #ifndef QUEUE_ITEM_H
 #define QUEUE_ITEM_H
 
+#include "ns3/address.h"
 #include "ns3/nstime.h"
 #include "ns3/ptr.h"
 #include "ns3/simple-ref-count.h"
-#include <ns3/address.h>
 
 namespace ns3
 {
@@ -19,13 +19,13 @@
 class Packet;
 
 /**
- * \ingroup network
- * \defgroup netdevice Network Device
+ * @ingroup network
+ * @defgroup netdevice Network Device
  */
 
 /**
- * \ingroup netdevice
- * \brief Base class to represent items of packet Queues
+ * @ingroup netdevice
+ * @brief Base class to represent items of packet Queues
  *
  * An item stored in an ns-3 packet Queue contains a packet and possibly other
  * information. An item of the base class only contains a packet. Subclasses
@@ -36,8 +36,8 @@
 {
   public:
     /**
-     * \brief Create a queue item containing a packet.
-     * \param p the packet included in the created item.
+     * @brief Create a queue item containing a packet.
+     * @param p the packet included in the created item.
      */
     QueueItem(Ptr<Packet> p);
 
@@ -49,23 +49,23 @@
     QueueItem& operator=(const QueueItem&) = delete;
 
     /**
-     * \return the packet included in this item.
+     * @return the packet included in this item.
      */
     Ptr<Packet> GetPacket() const;
 
     /**
-     * \brief Use this method (instead of GetPacket ()->GetSize ()) to get the packet size
+     * @brief Use this method (instead of GetPacket ()->GetSize ()) to get the packet size
      *
      * Subclasses may keep header and payload separate to allow manipulating the header,
      * so using this method ensures that the correct packet size is returned.
      *
-     * \return the size of the packet included in this item.
+     * @return the size of the packet included in this item.
      */
     virtual uint32_t GetSize() const;
 
     /**
-     * \enum Uint8Values
-     * \brief 1-byte fields of the packet whose value can be retrieved, if present
+     * @enum Uint8Values
+     * @brief 1-byte fields of the packet whose value can be retrieved, if present
      */
     enum Uint8Values
     {
@@ -73,24 +73,24 @@
     };
 
     /**
-     * \brief Retrieve the value of a given field from the packet, if present
-     * \param field the field whose value has to be retrieved
-     * \param value the output parameter to store the retrieved value
+     * @brief Retrieve the value of a given field from the packet, if present
+     * @param field the field whose value has to be retrieved
+     * @param value the output parameter to store the retrieved value
      *
-     * \return true if the requested field is present in the packet, false otherwise.
+     * @return true if the requested field is present in the packet, false otherwise.
      */
     virtual bool GetUint8Value(Uint8Values field, uint8_t& value) const;
 
     /**
-     * \brief Print the item contents.
-     * \param os output stream in which the data should be printed.
+     * @brief Print the item contents.
+     * @param os output stream in which the data should be printed.
      */
     virtual void Print(std::ostream& os) const;
 
     /**
      * TracedCallback signature for Ptr<QueueItem>
      *
-     * \param [in] item The queue item.
+     * @param [in] item The queue item.
      */
     typedef void (*TracedCallback)(Ptr<const QueueItem> item);
 
@@ -102,16 +102,16 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the stream
- * \param item the item
- * \returns a reference to the stream
+ * @param os the stream
+ * @param item the item
+ * @returns a reference to the stream
  */
 std::ostream& operator<<(std::ostream& os, const QueueItem& item);
 
 /**
- * \ingroup network
+ * @ingroup network
  *
  * QueueDiscItem is the abstract base class for items that are stored in a queue
  * disc. It is derived from QueueItem (which only consists of a Ptr<Packet>)
@@ -122,10 +122,10 @@
 {
   public:
     /**
-     * \brief Create a queue disc item.
-     * \param p the packet included in the created item.
-     * \param addr the destination MAC address
-     * \param protocol the L3 protocol number
+     * @brief Create a queue disc item.
+     * @param p the packet included in the created item.
+     * @param addr the destination MAC address
+     * @param protocol the L3 protocol number
      */
     QueueDiscItem(Ptr<Packet> p, const Address& addr, uint16_t protocol);
 
@@ -137,43 +137,43 @@
     QueueDiscItem& operator=(const QueueDiscItem&) = delete;
 
     /**
-     * \brief Get the MAC address included in this item
-     * \return the MAC address included in this item.
+     * @brief Get the MAC address included in this item
+     * @return the MAC address included in this item.
      */
     Address GetAddress() const;
 
     /**
-     * \brief Get the L3 protocol included in this item
-     * \return the L3 protocol included in this item.
+     * @brief Get the L3 protocol included in this item
+     * @return the L3 protocol included in this item.
      */
     uint16_t GetProtocol() const;
 
     /**
-     * \brief Get the transmission queue index included in this item
-     * \return the transmission queue index included in this item.
+     * @brief Get the transmission queue index included in this item
+     * @return the transmission queue index included in this item.
      */
     uint8_t GetTxQueueIndex() const;
 
     /**
-     * \brief Set the transmission queue index to store in this item
-     * \param txq the transmission queue index to store in this item.
+     * @brief Set the transmission queue index to store in this item
+     * @param txq the transmission queue index to store in this item.
      */
     void SetTxQueueIndex(uint8_t txq);
 
     /**
-     * \brief Get the timestamp included in this item
-     * \return the timestamp included in this item.
+     * @brief Get the timestamp included in this item
+     * @return the timestamp included in this item.
      */
     Time GetTimeStamp() const;
 
     /**
-     * \brief Set the timestamp included in this item
-     * \param t the timestamp to include in this item.
+     * @brief Set the timestamp included in this item
+     * @param t the timestamp to include in this item.
      */
     void SetTimeStamp(Time t);
 
     /**
-     * \brief Add the header to the packet
+     * @brief Add the header to the packet
      *
      * Subclasses may keep header and payload separate to allow manipulating the header,
      * so this method allows to add the header to the packet before sending the packet
@@ -182,27 +182,27 @@
     virtual void AddHeader() = 0;
 
     /**
-     * \brief Print the item contents.
-     * \param os output stream in which the data should be printed.
+     * @brief Print the item contents.
+     * @param os output stream in which the data should be printed.
      */
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Marks the packet as a substitute for dropping it, such as for Explicit Congestion
+     * @brief Marks the packet as a substitute for dropping it, such as for Explicit Congestion
      * Notification
      *
-     * \return true if the packet is marked by this method or is already marked, false otherwise
+     * @return true if the packet is marked by this method or is already marked, false otherwise
      */
     virtual bool Mark() = 0;
 
     /**
-     * \brief Computes the hash of various fields of the packet header
+     * @brief Computes the hash of various fields of the packet header
      *
      * This method just returns 0. Subclasses should implement a reasonable hash
      * for their protocol type, such as hashing on the TCP/IP 5-tuple.
      *
-     * \param perturbation hash perturbation value
-     * \return the hash of various fields of the packet header
+     * @param perturbation hash perturbation value
+     * @return the hash of various fields of the packet header
      */
     virtual uint32_t Hash(uint32_t perturbation = 0) const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/queue-limits.h ns-3.44/src/network/utils/queue-limits.h
--- ns-3.43/src/network/utils/queue-limits.h	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/queue-limits.h	2025-03-09 16:55:49.679372300 -0700
@@ -16,9 +16,9 @@
 {
 
 /**
- * \ingroup network
+ * @ingroup network
  *
- * \brief Abstract base class for NetDevice queue length controller
+ * @brief Abstract base class for NetDevice queue length controller
  *
  * QueueLimits is an abstract base class providing the interface to
  * the NetDevice queue length controller.
@@ -33,21 +33,21 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     ~QueueLimits() override;
 
     /**
-     * \brief Reset queue limits state
+     * @brief Reset queue limits state
      */
     virtual void Reset() = 0;
 
     /**
-     * \brief Record number of completed bytes and recalculate the limit
-     * \param count the number of completed bytes
+     * @brief Record number of completed bytes and recalculate the limit
+     * @param count the number of completed bytes
      */
     virtual void Completed(uint32_t count) = 0;
 
@@ -56,14 +56,14 @@
      * number of bytes that can be passed again to the NetDevice.
      * A negative value means that no packets can be passed to the NetDevice.
      * In this case, NotifyTransmittedBytes stops the transmission queue.
-     * \brief Returns how many bytes can be queued
-     * \return the number of bytes that can be queued
+     * @brief Returns how many bytes can be queued
+     * @return the number of bytes that can be queued
      */
     virtual int32_t Available() const = 0;
 
     /**
-     * \brief Record the number of bytes queued
-     * \param count the number of bytes queued
+     * @brief Record the number of bytes queued
+     * @param count the number of bytes queued
      */
     virtual void Queued(uint32_t count) = 0;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/queue-size.h ns-3.44/src/network/utils/queue-size.h
--- ns-3.43/src/network/utils/queue-size.h	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/queue-size.h	2025-03-09 16:55:49.679372300 -0700
@@ -20,13 +20,13 @@
 {
 
 /**
- * \ingroup network
- * \defgroup queuesize Queue size
+ * @ingroup network
+ * @defgroup queuesize Queue size
  */
 
 /**
- * \ingroup queuesize
- * \brief Enumeration of the operating modes of queues.
+ * @ingroup queuesize
+ * @brief Enumeration of the operating modes of queues.
  *
  */
 enum QueueSizeUnit
@@ -36,16 +36,16 @@
 };
 
 /**
- * \ingroup queuesize
- * \brief Class for representing queue sizes
+ * @ingroup queuesize
+ * @brief Class for representing queue sizes
  *
  * Allows for natural and familiar use of queue sizes.  Allows construction
  * from strings, natural sum e.g.:
- * \code
+ * @code
  *   QueueSize x("7kB");
  *   Ptr<Packet> p = Create<Packet> (1000);
  *   QueueSize y = x + p;    // 8kB
- * \endcode
+ * @endcode
  * This class also supports the regular comparison operators \c <, \c >,
  * \c <=, \c >=, \c ==, and \c !=
  *
@@ -79,22 +79,22 @@
  * * "8KiB" = 8,192 bytes
  * * "1000p" = 1,000 packets
  *
- * \see attribute_QueueSize
+ * @see attribute_QueueSize
  */
 class QueueSize
 {
   public:
     QueueSize();
     /**
-     * \brief Integer constructor
+     * @brief Integer constructor
      *
      * Construct a queue size from a mode and a value.
-     * \param unit whether the value is expressed in terms of packets or bytes
-     * \param value the value
+     * @param unit whether the value is expressed in terms of packets or bytes
+     * @param value the value
      */
     QueueSize(QueueSizeUnit unit, uint32_t value);
     /**
-     * \brief String constructor
+     * @brief String constructor
      *
      * Construct a queue size from a string.  Many different unit strings are supported
      * Supported unit strings:
@@ -108,77 +108,77 @@
      * "8KiB" = 8,192 bytes
      * "1000p" = 1,000 packets
      *
-     * \param size string representing the size
+     * @param size string representing the size
      */
     QueueSize(std::string size);
 
     /**
-     * \return true if this size is less than rhs
+     * @return true if this size is less than rhs
      *
-     * \param rhs the queue size to compare to this queue size
+     * @param rhs the queue size to compare to this queue size
      */
     bool operator<(const QueueSize& rhs) const;
 
     /**
-     * \return true if this size is less than or equal to rhs
+     * @return true if this size is less than or equal to rhs
      *
-     * \param rhs the queue size to compare to this queue size
+     * @param rhs the queue size to compare to this queue size
      */
     bool operator<=(const QueueSize& rhs) const;
 
     /**
-     * \return true if this size is greater than rhs
+     * @return true if this size is greater than rhs
      *
-     * \param rhs the queue size to compare to this queue size
+     * @param rhs the queue size to compare to this queue size
      */
     bool operator>(const QueueSize& rhs) const;
 
     /**
-     * \return true if this size is greater than or equal to rhs
+     * @return true if this size is greater than or equal to rhs
      *
-     * \param rhs the queue size to compare to this queue size
+     * @param rhs the queue size to compare to this queue size
      */
     bool operator>=(const QueueSize& rhs) const;
 
     /**
-     * \return true if this size is equal to rhs
+     * @return true if this size is equal to rhs
      *
-     * \param rhs the queue size to compare to this queue size
+     * @param rhs the queue size to compare to this queue size
      */
     bool operator==(const QueueSize& rhs) const;
 
     /**
-     * \return true if this size is not equal to rhs
+     * @return true if this size is not equal to rhs
      *
-     * \param rhs the queue size to compare to this queue size
+     * @param rhs the queue size to compare to this queue size
      */
     bool operator!=(const QueueSize& rhs) const;
 
     /**
      * Get the underlying unit
-     * \return The underlying unit
+     * @return The underlying unit
      */
     QueueSizeUnit GetUnit() const;
 
     /**
      * Get the underlying value
-     * \return The underlying value
+     * @return The underlying value
      */
     uint32_t GetValue() const;
 
   private:
     /**
-     * \brief Parse a string representing a QueueSize
+     * @brief Parse a string representing a QueueSize
      *
      * Allowed unit representations include all combinations of
      *
      * * An SI prefix: k, K, M
      * * Bytes (8 bits) or packets
      *
-     * \param [in] s The string representation, including unit
-     * \param [in,out] unit The location to put the unit.
-     * \param [in,out] value The location to put the value, in bytes or packets.
-     * \return true if parsing was successful.
+     * @param [in] s The string representation, including unit
+     * @param [in,out] unit The location to put the unit.
+     * @param [in,out] value The location to put the value, in bytes or packets.
+     * @return true if parsing was successful.
      */
     static bool DoParse(const std::string s, QueueSizeUnit* unit, uint32_t* value);
 
@@ -190,20 +190,20 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the stream
- * \param size the queue size
- * \returns a reference to the stream
+ * @param os the stream
+ * @param size the queue size
+ * @returns a reference to the stream
  */
 std::ostream& operator<<(std::ostream& os, const QueueSize& size);
 
 /**
- * \brief Stream extraction operator.
+ * @brief Stream extraction operator.
  *
- * \param is the stream
- * \param size the queue size
- * \returns a reference to the stream
+ * @param is the stream
+ * @param size the queue size
+ * @returns a reference to the stream
  */
 std::istream& operator>>(std::istream& is, QueueSize& size);
 
@@ -213,9 +213,9 @@
  * Increase the queue size by a packet size, if the queue size is in bytes,
  * or by one, otherwise.
  *
- * \param lhs queue size
- * \param rhs packet
- * \return the queue size increased by the packet size
+ * @param lhs queue size
+ * @param rhs packet
+ * @return the queue size increased by the packet size
  */
 template <typename Item>
 QueueSize operator+(const QueueSize& lhs, const Ptr<Item>& rhs);
@@ -223,9 +223,9 @@
  * Increase the queue size by a packet size, if the queue size is in bytes,
  * or by one, otherwise.
  *
- * \param lhs packet
- * \param rhs queue size
- * \return the queue size increased by the packet size
+ * @param lhs packet
+ * @param rhs queue size
+ * @return the queue size increased by the packet size
  */
 template <typename Item>
 QueueSize operator+(const Ptr<Item>& lhs, const QueueSize& rhs);
@@ -234,9 +234,9 @@
  * Decrease the queue size by a packet size, if the queue size is in bytes,
  * or by one, otherwise.
  *
- * \param lhs queue size
- * \param rhs packet
- * \return the queue size decreased by the packet size
+ * @param lhs queue size
+ * @param rhs packet
+ * @return the queue size decreased by the packet size
  */
 template <typename Item>
 QueueSize operator-(const QueueSize& lhs, const Ptr<Item>& rhs);
@@ -244,9 +244,9 @@
  * Decrease the queue size by a packet size, if the queue size is in bytes,
  * or by one, otherwise.
  *
- * \param lhs packet
- * \param rhs queue size
- * \return the queue size decreased by the packet size
+ * @param lhs packet
+ * @param rhs queue size
+ * @return the queue size decreased by the packet size
  */
 template <typename Item>
 QueueSize operator-(const Ptr<Item>& lhs, const QueueSize& rhs);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/radiotap-header.cc ns-3.44/src/network/utils/radiotap-header.cc
--- ns-3.43/src/network/utils/radiotap-header.cc	2024-10-09 16:41:10.072656600 -0700
+++ ns-3.44/src/network/utils/radiotap-header.cc	2025-03-09 16:55:49.679372300 -0700
@@ -11,6 +11,7 @@
 
 #include "ns3/log.h"
 
+#include <bit>
 #include <cmath>
 #include <iomanip>
 
@@ -22,40 +23,6 @@
 NS_OBJECT_ENSURE_REGISTERED(RadiotapHeader);
 
 RadiotapHeader::RadiotapHeader()
-    : m_length(8),
-      m_present(0),
-      m_tsft(0),
-      m_flags(FRAME_FLAG_NONE),
-      m_rate(0),
-      m_channelFreq(0),
-      m_channelFlags(CHANNEL_FLAG_NONE),
-      m_antennaSignal(0),
-      m_antennaNoise(0),
-      m_ampduStatusRef(0),
-      m_ampduStatusFlags(0),
-      m_ampduStatusCRC(0),
-      m_vhtPad(0),
-      m_vhtKnown(0),
-      m_vhtFlags(0),
-      m_vhtBandwidth(0),
-      m_vhtCoding(0),
-      m_vhtGroupId(0),
-      m_vhtPartialAid(0),
-      m_hePad(0),
-      m_heData1(0),
-      m_heData2(0),
-      m_heData3(0),
-      m_heData4(0),
-      m_heData5(0),
-      m_heData6(0),
-      m_heMuPad(0),
-      m_heMuFlags1(0),
-      m_heMuFlags2(0),
-      m_heMuOtherUserPad(0),
-      m_heMuPerUser1(0),
-      m_heMuPerUser2(0),
-      m_heMuPerUserPosition(0),
-      m_heMuPerUserKnown(0)
 {
     NS_LOG_FUNCTION(this);
 }
@@ -93,6 +60,10 @@
     start.WriteU8(0);          // pad field
     start.WriteU16(m_length);  // entire length of radiotap data + header
     start.WriteU32(m_present); // bits describing which fields follow header
+    if (m_presentExt)
+    {
+        start.WriteU32(*m_presentExt); // extended bitmasks
+    }
 
     //
     // Time Synchronization Function Timer (when the first bit of the MPDU
@@ -128,9 +99,7 @@
     //
     if (m_present & RADIOTAP_CHANNEL) // bit 3
     {
-        start.WriteU8(0, m_channelPad);
-        start.WriteU16(m_channelFreq);
-        start.WriteU16(m_channelFlags);
+        SerializeChannel(start);
     }
 
     //
@@ -245,9 +214,7 @@
     //
     if (m_present & RADIOTAP_MCS) // bit 19
     {
-        start.WriteU8(m_mcsKnown);
-        start.WriteU8(m_mcsFlags);
-        start.WriteU8(m_mcsRate);
+        SerializeMcs(start);
     }
 
     //
@@ -256,11 +223,7 @@
     //
     if (m_present & RADIOTAP_AMPDU_STATUS) // bit 20
     {
-        start.WriteU8(0, m_ampduStatusPad);
-        start.WriteU32(m_ampduStatusRef);
-        start.WriteU16(m_ampduStatusFlags);
-        start.WriteU8(m_ampduStatusCRC);
-        start.WriteU8(0);
+        SerializeAmpduStatus(start);
     }
 
     //
@@ -269,17 +232,7 @@
     //
     if (m_present & RADIOTAP_VHT) // bit 21
     {
-        start.WriteU8(0, m_vhtPad);
-        start.WriteU16(m_vhtKnown);
-        start.WriteU8(m_vhtFlags);
-        start.WriteU8(m_vhtBandwidth);
-        for (uint8_t i = 0; i < 4; i++)
-        {
-            start.WriteU8(m_vhtMcsNss[i]);
-        }
-        start.WriteU8(m_vhtCoding);
-        start.WriteU8(m_vhtGroupId);
-        start.WriteU16(m_vhtPartialAid);
+        SerializeVht(start);
     }
 
     //
@@ -288,13 +241,7 @@
     //
     if (m_present & RADIOTAP_HE) // bit 23
     {
-        start.WriteU8(0, m_hePad);
-        start.WriteU16(m_heData1);
-        start.WriteU16(m_heData2);
-        start.WriteU16(m_heData3);
-        start.WriteU16(m_heData4);
-        start.WriteU16(m_heData5);
-        start.WriteU16(m_heData6);
+        SerializeHe(start);
     }
 
     //
@@ -303,17 +250,7 @@
     //
     if (m_present & RADIOTAP_HE_MU) // bit 24
     {
-        start.WriteU8(0, m_heMuPad);
-        start.WriteU16(m_heMuFlags1);
-        start.WriteU16(m_heMuFlags2);
-        start.WriteU8(0);
-        start.WriteU8(0);
-        start.WriteU8(0);
-        start.WriteU8(0);
-        start.WriteU8(0);
-        start.WriteU8(0);
-        start.WriteU8(0);
-        start.WriteU8(0);
+        SerializeHeMu(start);
     }
 
     //
@@ -322,11 +259,25 @@
     //
     if (m_present & RADIOTAP_HE_MU_OTHER_USER) // bit 25
     {
-        start.WriteU8(0, m_heMuOtherUserPad);
-        start.WriteU16(m_heMuPerUser1);
-        start.WriteU16(m_heMuPerUser2);
-        start.WriteU8(m_heMuPerUserPosition);
-        start.WriteU8(m_heMuPerUserKnown);
+        SerializeHeMuOtherUser(start);
+    }
+
+    //
+    // U-SIG field.
+    // Reference: https://www.radiotap.org/fields/U-SIG.html
+    //
+    if (m_presentExt && (*m_presentExt & RADIOTAP_USIG)) // bit 33
+    {
+        SerializeUsig(start);
+    }
+
+    //
+    // EHT field.
+    // Reference: https://www.radiotap.org/fields/EHT.html
+    //
+    if (m_presentExt && (*m_presentExt & RADIOTAP_EHT_SIG)) // bit 34
+    {
+        SerializeEht(start);
     }
 }
 
@@ -341,9 +292,15 @@
 
     m_length = start.ReadU16();  // entire length of radiotap data + header
     m_present = start.ReadU32(); // bits describing which fields follow header
-
     uint32_t bytesRead = 8;
 
+    if (m_present & RADIOTAP_EXT)
+    {
+        // If bit 31 of the it_present field is set, an extended it_present bitmask is present.
+        m_presentExt = start.ReadU32();
+        bytesRead += 4;
+    }
+
     //
     // Time Synchronization Function Timer (when the first bit of the MPDU arrived at the MAC)
     // Reference: https://www.radiotap.org/fields/TSFT.html
@@ -380,11 +337,7 @@
     //
     if (m_present & RADIOTAP_CHANNEL) // bit 3
     {
-        m_channelPad = ((2 - bytesRead % 2) % 2);
-        start.Next(m_channelPad);
-        m_channelFreq = start.ReadU16();
-        m_channelFlags = start.ReadU16();
-        bytesRead += (4 + m_channelPad);
+        bytesRead += DeserializeChannel(start, bytesRead);
     }
 
     //
@@ -519,25 +472,16 @@
     //
     if (m_present & RADIOTAP_MCS) // bit 19
     {
-        m_mcsKnown = start.ReadU8();
-        m_mcsFlags = start.ReadU8();
-        m_mcsRate = start.ReadU8();
-        bytesRead += 3;
+        bytesRead += DeserializeMcs(start, bytesRead);
     }
 
     //
     // A-MPDU Status, information about the received or transmitted A-MPDU.
     // Reference: https://www.radiotap.org/fields/A-MPDU%20status.html
     //
-    if (m_present & RADIOTAP_AMPDU_STATUS) // bit 20
+    if (m_present & RADIOTAP_AMPDU_STATUS)
     {
-        m_ampduStatusPad = ((4 - bytesRead % 4) % 4);
-        start.Next(m_ampduStatusPad);
-        m_ampduStatusRef = start.ReadU32();
-        m_ampduStatusFlags = start.ReadU16();
-        m_ampduStatusCRC = start.ReadU8();
-        start.ReadU8();
-        bytesRead += (8 + m_ampduStatusPad);
+        bytesRead += DeserializeAmpduStatus(start, bytesRead);
     }
 
     //
@@ -546,19 +490,7 @@
     //
     if (m_present & RADIOTAP_VHT) // bit 21
     {
-        m_vhtPad = ((2 - bytesRead % 2) % 2);
-        start.Next(m_vhtPad);
-        m_vhtKnown = start.ReadU16();
-        m_vhtFlags = start.ReadU8();
-        m_vhtBandwidth = start.ReadU8();
-        for (uint8_t i = 0; i < 4; i++)
-        {
-            m_vhtMcsNss[i] = start.ReadU8();
-        }
-        m_vhtCoding = start.ReadU8();
-        m_vhtGroupId = start.ReadU8();
-        m_vhtPartialAid = start.ReadU16();
-        bytesRead += (12 + m_vhtPad);
+        bytesRead += DeserializeVht(start, bytesRead);
     }
 
     //
@@ -567,15 +499,7 @@
     //
     if (m_present & RADIOTAP_HE) // bit 23
     {
-        m_hePad = ((2 - bytesRead % 2) % 2);
-        start.Next(m_hePad);
-        m_heData1 = start.ReadU16();
-        m_heData2 = start.ReadU16();
-        m_heData3 = start.ReadU16();
-        m_heData4 = start.ReadU16();
-        m_heData5 = start.ReadU16();
-        m_heData6 = start.ReadU16();
-        bytesRead += (12 + m_hePad);
+        bytesRead += DeserializeHe(start, bytesRead);
     }
 
     //
@@ -584,18 +508,7 @@
     //
     if (m_present & RADIOTAP_HE_MU) // bit 24
     {
-        m_heMuPad = ((2 - bytesRead % 2) % 2);
-        m_heMuFlags1 = start.ReadU16();
-        m_heMuFlags2 = start.ReadU16();
-        start.ReadU8();
-        start.ReadU8();
-        start.ReadU8();
-        start.ReadU8();
-        start.ReadU8();
-        start.ReadU8();
-        start.ReadU8();
-        start.ReadU8();
-        bytesRead += (12 + m_heMuPad);
+        bytesRead += DeserializeHeMu(start, bytesRead);
     }
 
     //
@@ -604,12 +517,25 @@
     //
     if (m_present & RADIOTAP_HE_MU_OTHER_USER) // bit 25
     {
-        m_heMuOtherUserPad = ((2 - bytesRead % 2) % 2);
-        m_heMuPerUser1 = start.ReadU16();
-        m_heMuPerUser2 = start.ReadU16();
-        m_heMuPerUserPosition = start.ReadU8();
-        m_heMuPerUserKnown = start.ReadU8();
-        bytesRead += (6 + m_heMuOtherUserPad);
+        bytesRead += DeserializeHeMuOtherUser(start, bytesRead);
+    }
+
+    //
+    // U-SIG field.
+    // Reference: https://www.radiotap.org/fields/U-SIG.html
+    //
+    if (m_presentExt && (*m_presentExt & RADIOTAP_USIG)) // bit 33
+    {
+        bytesRead += DeserializeUsig(start, bytesRead);
+    }
+
+    //
+    // EHT field.
+    // Reference: https://www.radiotap.org/fields/EHT.html
+    //
+    if (m_presentExt && (*m_presentExt & RADIOTAP_EHT_SIG)) // bit 34
+    {
+        bytesRead += DeserializeEht(start, bytesRead);
     }
 
     NS_ASSERT_MSG(m_length == bytesRead,
@@ -621,34 +547,55 @@
 RadiotapHeader::Print(std::ostream& os) const
 {
     NS_LOG_FUNCTION(this << &os);
-    os << " tsft=" << m_tsft << " flags=" << std::hex << m_flags << std::dec << " rate=" << +m_rate
-       << " freq=" << m_channelFreq << " chflags=" << std::hex << +m_channelFlags << std::dec
-       << " signal=" << +m_antennaSignal << " noise=" << +m_antennaNoise
-       << " mcsKnown=" << m_mcsKnown << " mcsFlags=" << m_mcsFlags << " mcsRate=" << m_mcsRate
-       << " ampduStatusFlags=" << +m_ampduStatusFlags << " vhtKnown=" << m_vhtKnown
-       << " vhtFlags=" << m_vhtFlags << " vhtBandwidth=" << m_vhtBandwidth
-       << " vhtMcsNss for user 1=" << m_vhtMcsNss[0] << " vhtMcsNss for user 2=" << m_vhtMcsNss[1]
-       << " vhtMcsNss for user 3=" << m_vhtMcsNss[2] << " vhtMcsNss for user 4=" << m_vhtMcsNss[3]
-       << " vhtCoding=" << m_vhtCoding << " vhtGroupId=" << m_vhtGroupId
-       << " vhtPartialAid=" << m_vhtPartialAid << " heData1=" << m_heData1
-       << " heData2=" << m_heData2 << " heData3=" << m_heData3 << " heData4=" << m_heData4
-       << " heData5=" << m_heData5 << " heData6=" << m_heData6 << " heMuFlags1=" << m_heMuFlags1
-       << " heMuFlags2=" << m_heMuFlags2 << " heMuPerUser1=" << m_heMuPerUser1
-       << " heMuPerUser2=" << m_heMuPerUser2 << " heMuPerUserPosition=" << +m_heMuPerUserPosition
-       << " heMuPerUserKnown=" << +m_heMuPerUserKnown;
+    os << " tsft=" << m_tsft << " flags=" << std::hex << m_flags << std::dec << " rate=" << +m_rate;
+    if (m_present & RADIOTAP_CHANNEL)
+    {
+        PrintChannel(os);
+    }
+    os << std::dec << " signal=" << +m_antennaSignal << " noise=" << +m_antennaNoise;
+    if (m_present & RADIOTAP_MCS)
+    {
+        PrintMcs(os);
+    }
+    if (m_present & RADIOTAP_AMPDU_STATUS)
+    {
+        PrintAmpduStatus(os);
+    }
+    if (m_present & RADIOTAP_VHT)
+    {
+        PrintVht(os);
+    }
+    if (m_present & RADIOTAP_HE)
+    {
+        PrintHe(os);
+    }
+    if (m_present & RADIOTAP_HE_MU)
+    {
+        PrintHeMu(os);
+    }
+    if (m_present & RADIOTAP_HE_MU_OTHER_USER)
+    {
+        PrintHeMuOtherUser(os);
+    }
+    if (m_presentExt && (*m_presentExt & RADIOTAP_USIG))
+    {
+        PrintUsig(os);
+    }
+    if (m_presentExt && (*m_presentExt & RADIOTAP_EHT_SIG))
+    {
+        PrintEht(os);
+    }
 }
 
 void
 RadiotapHeader::SetTsft(uint64_t value)
 {
     NS_LOG_FUNCTION(this << value);
-    m_tsft = value;
 
-    if (!(m_present & RADIOTAP_TSFT))
-    {
-        m_present |= RADIOTAP_TSFT;
-        m_length += 8;
-    }
+    NS_ASSERT_MSG(!(m_present & RADIOTAP_TSFT), "TSFT radiotap field already present");
+    m_present |= RADIOTAP_TSFT;
+    m_length += 8;
+    m_tsft = value;
 
     NS_LOG_LOGIC(this << " m_length=" << m_length << " m_present=0x" << std::hex << m_present
                       << std::dec);
@@ -658,13 +605,11 @@
 RadiotapHeader::SetFrameFlags(uint8_t flags)
 {
     NS_LOG_FUNCTION(this << +flags);
-    m_flags = flags;
 
-    if (!(m_present & RADIOTAP_FLAGS))
-    {
-        m_present |= RADIOTAP_FLAGS;
-        m_length += 1;
-    }
+    NS_ASSERT_MSG(!(m_present & RADIOTAP_FLAGS), "Flags radiotap field already present");
+    m_present |= RADIOTAP_FLAGS;
+    m_length += 1;
+    m_flags = flags;
 
     NS_LOG_LOGIC(this << " m_length=" << m_length << " m_present=0x" << std::hex << m_present
                       << std::dec);
@@ -674,46 +619,66 @@
 RadiotapHeader::SetRate(uint8_t rate)
 {
     NS_LOG_FUNCTION(this << +rate);
-    m_rate = rate;
 
-    if (!(m_present & RADIOTAP_RATE))
-    {
-        m_present |= RADIOTAP_RATE;
-        m_length += 1;
-    }
+    NS_ASSERT_MSG(!(m_present & RADIOTAP_RATE), "Rate radiotap field already present");
+    m_present |= RADIOTAP_RATE;
+    m_length += 1;
+    m_rate = rate;
 
     NS_LOG_LOGIC(this << " m_length=" << m_length << " m_present=0x" << std::hex << m_present
                       << std::dec);
 }
 
 void
-RadiotapHeader::SetChannelFrequencyAndFlags(uint16_t frequency, uint16_t flags)
+RadiotapHeader::SetChannelFields(const ChannelFields& channelFields)
 {
-    NS_LOG_FUNCTION(this << frequency << flags);
-    m_channelFreq = frequency;
-    m_channelFlags = flags;
+    NS_LOG_FUNCTION(this << channelFields.frequency << channelFields.flags);
 
-    if (!(m_present & RADIOTAP_CHANNEL))
-    {
-        m_channelPad = ((2 - m_length % 2) % 2);
-        m_present |= RADIOTAP_CHANNEL;
-        m_length += (4 + m_channelPad);
-    }
+    NS_ASSERT_MSG(!(m_present & RADIOTAP_CHANNEL), "Channel radiotap field already present");
+    m_channelPad = ((2 - m_length % 2) % 2);
+    m_present |= RADIOTAP_CHANNEL;
+    m_length += (sizeof(ChannelFields) + m_channelPad);
+    m_channelFields = channelFields;
 
     NS_LOG_LOGIC(this << " m_length=" << m_length << " m_present=0x" << std::hex << m_present
                       << std::dec);
 }
 
 void
+RadiotapHeader::SerializeChannel(Buffer::Iterator& start) const
+{
+    start.WriteU8(0, m_channelPad);
+    start.WriteU16(m_channelFields.frequency);
+    start.WriteU16(m_channelFields.flags);
+}
+
+uint32_t
+RadiotapHeader::DeserializeChannel(Buffer::Iterator start, uint32_t bytesRead)
+{
+    m_channelPad = ((2 - bytesRead % 2) % 2);
+    start.Next(m_channelPad);
+    m_channelFields.frequency = start.ReadU16();
+    m_channelFields.flags = start.ReadU16();
+    return sizeof(ChannelFields) + m_channelPad;
+}
+
+void
+RadiotapHeader::PrintChannel(std::ostream& os) const
+{
+    os << " channel.frequency=" << m_channelFields.frequency << " channel.flags=0x" << std::hex
+       << m_channelFields.flags << std::dec;
+}
+
+void
 RadiotapHeader::SetAntennaSignalPower(double signal)
 {
     NS_LOG_FUNCTION(this << signal);
 
-    if (!(m_present & RADIOTAP_DBM_ANTSIGNAL))
-    {
-        m_present |= RADIOTAP_DBM_ANTSIGNAL;
-        m_length += 1;
-    }
+    NS_ASSERT_MSG(!(m_present & RADIOTAP_DBM_ANTSIGNAL),
+                  "Antenna signal radiotap field already present");
+    m_present |= RADIOTAP_DBM_ANTSIGNAL;
+    m_length += 1;
+
     if (signal > 127)
     {
         m_antennaSignal = 127;
@@ -736,11 +701,11 @@
 {
     NS_LOG_FUNCTION(this << noise);
 
-    if (!(m_present & RADIOTAP_DBM_ANTNOISE))
-    {
-        m_present |= RADIOTAP_DBM_ANTNOISE;
-        m_length += 1;
-    }
+    NS_ASSERT_MSG(!(m_present & RADIOTAP_DBM_ANTNOISE),
+                  "Antenna noise radiotap field already present");
+    m_present |= RADIOTAP_DBM_ANTNOISE;
+    m_length += 1;
+
     if (noise > 127.0)
     {
         m_antennaNoise = 127;
@@ -759,138 +724,468 @@
 }
 
 void
-RadiotapHeader::SetMcsFields(uint8_t known, uint8_t flags, uint8_t mcs)
+RadiotapHeader::SetMcsFields(const McsFields& mcsFields)
 {
-    NS_LOG_FUNCTION(this << known << +flags << +mcs);
-    m_mcsKnown = known;
-    m_mcsFlags = flags;
-    m_mcsRate = mcs;
-    if (!(m_present & RADIOTAP_MCS))
-    {
-        m_present |= RADIOTAP_MCS;
-        m_length += 3;
-    }
+    NS_LOG_FUNCTION(this << +mcsFields.known << +mcsFields.flags << +mcsFields.mcs);
+
+    NS_ASSERT_MSG(!(m_present & RADIOTAP_MCS), "MCS radiotap field already present");
+    m_present |= RADIOTAP_MCS;
+    m_length += sizeof(McsFields);
+    m_mcsFields = mcsFields;
 
     NS_LOG_LOGIC(this << " m_length=" << m_length << " m_present=0x" << std::hex << m_present
                       << std::dec);
 }
 
 void
-RadiotapHeader::SetAmpduStatus(uint32_t referenceNumber, uint16_t flags, uint8_t crc)
+RadiotapHeader::SerializeMcs(Buffer::Iterator& start) const
 {
-    NS_LOG_FUNCTION(this << referenceNumber << flags);
-    m_ampduStatusRef = referenceNumber;
-    m_ampduStatusFlags = flags;
-    m_ampduStatusCRC = crc;
-    if (!(m_present & RADIOTAP_AMPDU_STATUS))
-    {
-        m_ampduStatusPad = ((4 - m_length % 4) % 4);
-        m_present |= RADIOTAP_AMPDU_STATUS;
-        m_length += (8 + m_ampduStatusPad);
-    }
+    start.WriteU8(m_mcsFields.known);
+    start.WriteU8(m_mcsFields.flags);
+    start.WriteU8(m_mcsFields.mcs);
+}
+
+uint32_t
+RadiotapHeader::DeserializeMcs(Buffer::Iterator start, uint32_t bytesRead)
+{
+    m_mcsFields.known = start.ReadU8();
+    m_mcsFields.flags = start.ReadU8();
+    m_mcsFields.mcs = start.ReadU8();
+    return sizeof(McsFields);
+}
+
+void
+RadiotapHeader::PrintMcs(std::ostream& os) const
+{
+    os << " mcs.known=0x" << std::hex << +m_mcsFields.known << " mcs.flags0x=" << +m_mcsFields.flags
+       << " mcsRate=" << std::dec << +m_mcsFields.mcs;
+}
+
+void
+RadiotapHeader::SetAmpduStatus(const AmpduStatusFields& ampduStatusFields)
+{
+    NS_LOG_FUNCTION(this << ampduStatusFields.referenceNumber << ampduStatusFields.flags);
+
+    NS_ASSERT_MSG(!(m_present & RADIOTAP_AMPDU_STATUS),
+                  "A-MPDU status radiotap field already present");
+    m_ampduStatusPad = ((4 - m_length % 4) % 4);
+    m_present |= RADIOTAP_AMPDU_STATUS;
+    m_length += (sizeof(ampduStatusFields) + m_ampduStatusPad);
+    m_ampduStatusFields = ampduStatusFields;
+
+    NS_LOG_LOGIC(this << " m_length=" << m_length << " m_present=0x" << std::hex << m_present
+                      << std::dec);
+}
+
+void
+RadiotapHeader::SerializeAmpduStatus(Buffer::Iterator& start) const
+{
+    start.WriteU8(0, m_ampduStatusPad);
+    start.WriteU32(m_ampduStatusFields.referenceNumber);
+    start.WriteU16(m_ampduStatusFields.flags);
+    start.WriteU8(m_ampduStatusFields.crc);
+    start.WriteU8(m_ampduStatusFields.reserved);
+}
+
+uint32_t
+RadiotapHeader::DeserializeAmpduStatus(Buffer::Iterator start, uint32_t bytesRead)
+{
+    m_ampduStatusPad = ((4 - bytesRead % 4) % 4);
+    start.Next(m_ampduStatusPad);
+    m_ampduStatusFields.referenceNumber = start.ReadU32();
+    m_ampduStatusFields.flags = start.ReadU16();
+    m_ampduStatusFields.crc = start.ReadU8();
+    m_ampduStatusFields.reserved = start.ReadU8();
+    return sizeof(AmpduStatusFields) + m_ampduStatusPad;
+}
+
+void
+RadiotapHeader::PrintAmpduStatus(std::ostream& os) const
+{
+    os << " ampduStatus.flags=0x" << std::hex << m_ampduStatusFields.flags << std::dec;
+}
+
+void
+RadiotapHeader::SetVhtFields(const VhtFields& vhtFields)
+{
+    NS_LOG_FUNCTION(this << vhtFields.known << vhtFields.flags << +vhtFields.mcsNss.at(0)
+                         << +vhtFields.mcsNss.at(1) << +vhtFields.mcsNss.at(2)
+                         << +vhtFields.mcsNss.at(3) << +vhtFields.coding << +vhtFields.groupId
+                         << +vhtFields.partialAid);
+
+    NS_ASSERT_MSG(!(m_present & RADIOTAP_VHT), "VHT radiotap field already present");
+    m_vhtPad = ((2 - m_length % 2) % 2);
+    m_present |= RADIOTAP_VHT;
+    m_length += (sizeof(VhtFields) + m_vhtPad);
+    m_vhtFields = vhtFields;
+
+    NS_LOG_LOGIC(this << " m_length=" << m_length << " m_present=0x" << std::hex << m_present
+                      << std::dec);
+}
+
+void
+RadiotapHeader::SerializeVht(Buffer::Iterator& start) const
+{
+    start.WriteU8(0, m_vhtPad);
+    start.WriteU16(m_vhtFields.known);
+    start.WriteU8(m_vhtFields.flags);
+    start.WriteU8(m_vhtFields.bandwidth);
+    for (const auto mcsNss : m_vhtFields.mcsNss)
+    {
+        start.WriteU8(mcsNss);
+    }
+    start.WriteU8(m_vhtFields.coding);
+    start.WriteU8(m_vhtFields.groupId);
+    start.WriteU16(m_vhtFields.partialAid);
+}
+
+uint32_t
+RadiotapHeader::DeserializeVht(Buffer::Iterator start, uint32_t bytesRead)
+{
+    m_vhtPad = ((2 - bytesRead % 2) % 2);
+    start.Next(m_vhtPad);
+    m_vhtFields.known = start.ReadU16();
+    m_vhtFields.flags = start.ReadU8();
+    m_vhtFields.bandwidth = start.ReadU8();
+    for (auto& mcsNss : m_vhtFields.mcsNss)
+    {
+        mcsNss = start.ReadU8();
+    }
+    m_vhtFields.coding = start.ReadU8();
+    m_vhtFields.groupId = start.ReadU8();
+    m_vhtFields.partialAid = start.ReadU16();
+    return sizeof(VhtFields) + m_vhtPad;
+}
+
+void
+RadiotapHeader::PrintVht(std::ostream& os) const
+{
+    os << " vht.known=0x" << m_vhtFields.known << " vht.flags=0x" << m_vhtFields.flags
+       << " vht.bandwidth=" << std::dec << m_vhtFields.bandwidth
+       << " vht.mcsNss[0]=" << +m_vhtFields.mcsNss.at(0)
+       << " vht.mcsNss[1]=" << +m_vhtFields.mcsNss.at(1)
+       << " vht.mcsNss[2]=" << +m_vhtFields.mcsNss.at(2)
+       << " vht.mcsNss[3]=" << +m_vhtFields.mcsNss.at(3) << " vht.coding=" << m_vhtFields.coding
+       << " vht.groupId=" << m_vhtFields.groupId << " vht.partialAid=" << m_vhtFields.partialAid;
+}
+
+void
+RadiotapHeader::SetHeFields(const HeFields& heFields)
+{
+    NS_LOG_FUNCTION(this << heFields.data1 << heFields.data2 << heFields.data3 << heFields.data4
+                         << heFields.data5 << heFields.data6);
+
+    NS_ASSERT_MSG(!(m_present & RADIOTAP_HE), "HE radiotap field already present");
+    m_hePad = ((2 - m_length % 2) % 2);
+    m_present |= RADIOTAP_HE;
+    m_length += (sizeof(heFields) + m_hePad);
+    m_heFields = heFields;
+
+    NS_LOG_LOGIC(this << " m_length=" << m_length << " m_present=0x" << std::hex << m_present
+                      << std::dec);
+}
+
+void
+RadiotapHeader::SerializeHe(Buffer::Iterator& start) const
+{
+    start.WriteU8(0, m_hePad);
+    start.WriteU16(m_heFields.data1);
+    start.WriteU16(m_heFields.data2);
+    start.WriteU16(m_heFields.data3);
+    start.WriteU16(m_heFields.data4);
+    start.WriteU16(m_heFields.data5);
+    start.WriteU16(m_heFields.data6);
+}
+
+uint32_t
+RadiotapHeader::DeserializeHe(Buffer::Iterator start, uint32_t bytesRead)
+{
+    m_hePad = ((2 - bytesRead % 2) % 2);
+    start.Next(m_hePad);
+    m_heFields.data1 = start.ReadU16();
+    m_heFields.data2 = start.ReadU16();
+    m_heFields.data3 = start.ReadU16();
+    m_heFields.data4 = start.ReadU16();
+    m_heFields.data5 = start.ReadU16();
+    m_heFields.data6 = start.ReadU16();
+    return sizeof(HeFields) + m_hePad;
+}
+
+void
+RadiotapHeader::PrintHe(std::ostream& os) const
+{
+    os << " he.data1=0x" << std::hex << m_heFields.data1 << " he.data2=0x" << std::hex
+       << m_heFields.data2 << " he.data3=0x" << std::hex << m_heFields.data3 << " he.data4=0x"
+       << std::hex << m_heFields.data4 << " he.data5=0x" << std::hex << m_heFields.data5
+       << " he.data6=0x" << std::hex << m_heFields.data6 << std::dec;
+}
+
+void
+RadiotapHeader::SetHeMuFields(const HeMuFields& heMuFields)
+{
+    NS_LOG_FUNCTION(this << heMuFields.flags1 << heMuFields.flags2);
+
+    NS_ASSERT_MSG(!(m_present & RADIOTAP_HE_MU), "HE-MU radiotap field already present");
+    m_heMuPad = ((2 - m_length % 2) % 2);
+    m_present |= RADIOTAP_HE_MU;
+    m_length += (sizeof(heMuFields) + m_heMuPad);
+    m_heMuFields = heMuFields;
 
     NS_LOG_LOGIC(this << " m_length=" << m_length << " m_present=0x" << std::hex << m_present
                       << std::dec);
 }
 
 void
-RadiotapHeader::SetVhtFields(uint16_t known,
-                             uint8_t flags,
-                             uint8_t bandwidth,
-                             uint8_t mcs_nss[4],
-                             uint8_t coding,
-                             uint8_t group_id,
-                             uint16_t partial_aid)
+RadiotapHeader::SerializeHeMu(Buffer::Iterator& start) const
+{
+    start.WriteU8(0, m_heMuPad);
+    start.WriteU16(m_heMuFields.flags1);
+    start.WriteU16(m_heMuFields.flags2);
+    for (const auto ruChannel : m_heMuFields.ruChannel1)
+    {
+        start.WriteU8(ruChannel);
+    }
+    for (const auto ruChannel : m_heMuFields.ruChannel2)
+    {
+        start.WriteU8(ruChannel);
+    }
+}
+
+uint32_t
+RadiotapHeader::DeserializeHeMu(Buffer::Iterator start, uint32_t bytesRead)
 {
-    NS_LOG_FUNCTION(this << known << flags << +mcs_nss[0] << +mcs_nss[1] << +mcs_nss[2]
-                         << +mcs_nss[3] << +coding << +group_id << +partial_aid);
-    m_vhtKnown = known;
-    m_vhtFlags = flags;
-    m_vhtBandwidth = bandwidth;
-    for (uint8_t i = 0; i < 4; i++)
+    m_heMuPad = ((2 - bytesRead % 2) % 2);
+    start.Next(m_heMuPad);
+    m_heMuFields.flags1 = start.ReadU16();
+    m_heMuFields.flags2 = start.ReadU16();
+    for (auto& ruChannel : m_heMuFields.ruChannel1)
     {
-        m_vhtMcsNss[i] = mcs_nss[i];
+        ruChannel = start.ReadU8();
     }
-    m_vhtCoding = coding;
-    m_vhtGroupId = group_id;
-    m_vhtPartialAid = partial_aid;
-    if (!(m_present & RADIOTAP_VHT))
+    for (auto& ruChannel : m_heMuFields.ruChannel2)
     {
-        m_vhtPad = ((2 - m_length % 2) % 2);
-        m_present |= RADIOTAP_VHT;
-        m_length += (12 + m_vhtPad);
+        ruChannel = start.ReadU8();
     }
+    return sizeof(HeMuFields) + m_heMuPad;
+}
+
+void
+RadiotapHeader::PrintHeMu(std::ostream& os) const
+{
+    os << " heMu.flags1=0x" << std::hex << m_heMuFields.flags1 << " heMu.flags2=0x"
+       << m_heMuFields.flags2 << std::dec;
+}
+
+void
+RadiotapHeader::SetHeMuOtherUserFields(const HeMuOtherUserFields& heMuOtherUserFields)
+{
+    NS_LOG_FUNCTION(this << heMuOtherUserFields.perUser1 << heMuOtherUserFields.perUser2
+                         << +heMuOtherUserFields.perUserPosition
+                         << +heMuOtherUserFields.perUserKnown);
+
+    NS_ASSERT_MSG(!(m_present & RADIOTAP_HE_MU_OTHER_USER),
+                  "HE-MU-other-user radiotap field already present");
+    m_heMuOtherUserPad = ((2 - m_length % 2) % 2);
+    m_present |= RADIOTAP_HE_MU_OTHER_USER;
+    m_length += (sizeof(HeMuOtherUserFields) + m_heMuOtherUserPad);
+    m_heMuOtherUserFields = heMuOtherUserFields;
 
     NS_LOG_LOGIC(this << " m_length=" << m_length << " m_present=0x" << std::hex << m_present
                       << std::dec);
 }
 
 void
-RadiotapHeader::SetHeFields(uint16_t data1,
-                            uint16_t data2,
-                            uint16_t data3,
-                            uint16_t data4,
-                            uint16_t data5,
-                            uint16_t data6)
+RadiotapHeader::SerializeHeMuOtherUser(Buffer::Iterator& start) const
 {
-    NS_LOG_FUNCTION(this << data1 << data2 << data3 << data4 << data5 << data6);
-    m_heData1 = data1;
-    m_heData2 = data2;
-    m_heData3 = data3;
-    m_heData4 = data4;
-    m_heData5 = data5;
-    m_heData6 = data6;
-    if (!(m_present & RADIOTAP_HE))
+    start.WriteU8(0, m_heMuOtherUserPad);
+    start.WriteU16(m_heMuOtherUserFields.perUser1);
+    start.WriteU16(m_heMuOtherUserFields.perUser2);
+    start.WriteU8(m_heMuOtherUserFields.perUserPosition);
+    start.WriteU8(m_heMuOtherUserFields.perUserKnown);
+}
+
+uint32_t
+RadiotapHeader::DeserializeHeMuOtherUser(Buffer::Iterator start, uint32_t bytesRead)
+{
+    m_heMuOtherUserPad = ((2 - bytesRead % 2) % 2);
+    start.Next(m_heMuOtherUserPad);
+    m_heMuOtherUserFields.perUser1 = start.ReadU16();
+    m_heMuOtherUserFields.perUser2 = start.ReadU16();
+    m_heMuOtherUserFields.perUserPosition = start.ReadU8();
+    m_heMuOtherUserFields.perUserKnown = start.ReadU8();
+    return sizeof(HeMuOtherUserFields) + m_heMuOtherUserPad;
+}
+
+void
+RadiotapHeader::PrintHeMuOtherUser(std::ostream& os) const
+{
+    os << " heMuOtherUser.perUser1=" << m_heMuOtherUserFields.perUser1
+       << " heMuOtherUser.perUser2=" << m_heMuOtherUserFields.perUser2
+       << " heMuOtherUser.perUserPosition=" << m_heMuOtherUserFields.perUserPosition
+       << " heMuOtherUser.perUserKnown=0x" << std::hex << m_heMuOtherUserFields.perUserKnown
+       << std::dec;
+}
+
+void
+RadiotapHeader::SetUsigFields(const UsigFields& usigFields)
+{
+    NS_LOG_FUNCTION(this << usigFields.common << usigFields.mask << usigFields.value);
+    if (!m_presentExt)
     {
-        m_hePad = ((2 - m_length % 2) % 2);
-        m_present |= RADIOTAP_HE;
-        m_length += (12 + m_hePad);
+        m_present |= RADIOTAP_TLV | RADIOTAP_EXT;
+        m_presentExt = 0;
+        m_length += sizeof(RadiotapExtFlags);
     }
 
+    NS_ASSERT_MSG(!(*m_presentExt & RADIOTAP_USIG), "U-SIG radiotap field already present");
+    *m_presentExt |= RADIOTAP_USIG;
+
+    m_usigTlvPad = ((8 - m_length % 8) % 8);
+    m_usigTlv.type = 32 + std::countr_zero<uint16_t>(RADIOTAP_USIG);
+    m_usigTlv.length = sizeof(UsigFields);
+    m_length += sizeof(TlvFields) + m_usigTlvPad;
+
+    m_usigPad = ((4 - m_length % 4) % 4);
+    m_usigFields = usigFields;
+    m_length += m_usigTlv.length + m_usigPad;
+
     NS_LOG_LOGIC(this << " m_length=" << m_length << " m_present=0x" << std::hex << m_present
-                      << std::dec);
+                      << " m_presentExt=0x" << *m_presentExt << std::dec);
 }
 
 void
-RadiotapHeader::SetHeMuFields(uint16_t flags1,
-                              uint16_t flags2,
-                              const std::array<uint8_t, 4>& /*ruChannel1*/,
-                              const std::array<uint8_t, 4>& /*ruChannel2*/)
+RadiotapHeader::SerializeUsig(Buffer::Iterator& start) const
 {
-    NS_LOG_FUNCTION(this << flags1 << flags2);
-    m_heMuFlags1 = flags1;
-    m_heMuFlags2 = flags2;
-    if (!(m_present & RADIOTAP_HE_MU))
+    start.WriteU8(0, m_usigTlvPad);
+    start.WriteU16(m_usigTlv.type);
+    start.WriteU16(m_usigTlv.length);
+    start.WriteU8(0, m_usigPad);
+    start.WriteU32(m_usigFields.common);
+    start.WriteU32(m_usigFields.value);
+    start.WriteU32(m_usigFields.mask);
+}
+
+uint32_t
+RadiotapHeader::DeserializeUsig(Buffer::Iterator start, uint32_t bytesRead)
+{
+    const auto startBytesRead = bytesRead;
+    m_usigTlvPad = ((8 - bytesRead % 8) % 8);
+    start.Next(m_usigTlvPad);
+    bytesRead += m_usigTlvPad;
+    m_usigTlv.type = start.ReadU16();
+    m_usigTlv.length = start.ReadU16();
+    bytesRead += sizeof(TlvFields);
+    m_usigPad = ((4 - bytesRead % 4) % 4);
+    start.Next(m_usigPad);
+    bytesRead += m_usigPad;
+    m_usigFields.common = start.ReadU32();
+    m_usigFields.value = start.ReadU32();
+    m_usigFields.mask = start.ReadU32();
+    bytesRead += sizeof(UsigFields);
+    return bytesRead - startBytesRead;
+}
+
+void
+RadiotapHeader::PrintUsig(std::ostream& os) const
+{
+    os << " usig.common=0x" << std::hex << m_usigFields.common << " usig.value=0x"
+       << m_usigFields.value << " usig.mask=0x" << m_usigFields.mask << std::dec;
+}
+
+void
+RadiotapHeader::SetEhtFields(const EhtFields& ehtFields)
+{
+    NS_LOG_FUNCTION(this << ehtFields.known);
+    if (!m_presentExt)
     {
-        m_heMuPad = ((2 - m_length % 2) % 2);
-        m_present |= RADIOTAP_HE_MU;
-        m_length += (12 + m_heMuPad);
+        m_present |= RADIOTAP_TLV | RADIOTAP_EXT;
+        m_presentExt = 0;
+        m_length += sizeof(RadiotapExtFlags);
     }
 
+    NS_ASSERT_MSG(!(*m_presentExt & RADIOTAP_EHT_SIG), "EHT radiotap field already present");
+    *m_presentExt |= RADIOTAP_EHT_SIG;
+
+    m_ehtTlvPad = ((8 - m_length % 8) % 8);
+    m_ehtTlv.type = 32 + std::countr_zero<uint16_t>(RADIOTAP_EHT_SIG);
+    m_ehtTlv.length = (40 + ehtFields.userInfo.size() * 4);
+    m_length += sizeof(TlvFields) + m_ehtTlvPad;
+
+    m_ehtPad = ((4 - m_length % 4) % 4);
+    m_ehtFields = ehtFields;
+    m_length += m_ehtTlv.length + m_ehtPad;
+
     NS_LOG_LOGIC(this << " m_length=" << m_length << " m_present=0x" << std::hex << m_present
-                      << std::dec);
+                      << " m_presentExt=0x" << *m_presentExt << std::dec);
 }
 
 void
-RadiotapHeader::SetHeMuPerUserFields(uint16_t perUser1,
-                                     uint16_t perUser2,
-                                     uint8_t perUserPosition,
-                                     uint8_t perUserKnown)
+RadiotapHeader::SerializeEht(Buffer::Iterator& start) const
 {
-    NS_LOG_FUNCTION(this << perUser1 << perUser2 << +perUserPosition << +perUserKnown);
-    m_heMuPerUser1 = perUser1;
-    m_heMuPerUser2 = perUser2;
-    m_heMuPerUserPosition = perUserPosition;
-    m_heMuPerUserKnown = perUserKnown;
-    if (!(m_present & RADIOTAP_HE_MU_OTHER_USER))
+    start.WriteU8(0, m_ehtTlvPad);
+    start.WriteU16(m_ehtTlv.type);
+    start.WriteU16(m_ehtTlv.length);
+    start.WriteU8(0, m_ehtPad);
+    start.WriteU32(m_ehtFields.known);
+    for (const auto dataField : m_ehtFields.data)
+    {
+        start.WriteU32(dataField);
+    }
+    for (const auto userInfoField : m_ehtFields.userInfo)
     {
-        m_heMuOtherUserPad = ((2 - m_length % 2) % 2);
-        m_present |= RADIOTAP_HE_MU_OTHER_USER;
-        m_length += (6 + m_heMuOtherUserPad);
+        start.WriteU32(userInfoField);
     }
+}
 
-    NS_LOG_LOGIC(this << " m_length=" << m_length << " m_present=0x" << std::hex << m_present
-                      << std::dec);
+uint32_t
+RadiotapHeader::DeserializeEht(Buffer::Iterator start, uint32_t bytesRead)
+{
+    const auto startBytesRead = bytesRead;
+
+    m_ehtTlvPad = ((8 - bytesRead % 8) % 8);
+    start.Next(m_ehtTlvPad);
+    bytesRead += m_ehtTlvPad;
+    m_ehtTlv.type = start.ReadU16();
+    m_ehtTlv.length = start.ReadU16();
+    bytesRead += sizeof(TlvFields);
+
+    m_ehtPad = ((4 - bytesRead % 4) % 4);
+    start.Next(m_ehtPad);
+    bytesRead += m_ehtPad;
+    m_ehtFields.known = start.ReadU32();
+    bytesRead += 4;
+    for (auto& dataField : m_ehtFields.data)
+    {
+        dataField = start.ReadU32();
+        bytesRead += 4;
+    }
+    const auto userInfosBytes = m_ehtTlv.length - bytesRead - m_ehtTlvPad;
+    NS_ASSERT(userInfosBytes % 4 == 0);
+    const std::size_t numUsers = userInfosBytes / 4;
+    for (std::size_t i = 0; i < numUsers; ++i)
+    {
+        m_ehtFields.userInfo.push_back(start.ReadU32());
+        bytesRead += 4;
+    }
+
+    return bytesRead - startBytesRead;
+}
+
+void
+RadiotapHeader::PrintEht(std::ostream& os) const
+{
+    os << " eht.known=0x" << std::hex << m_ehtFields.known;
+    std::size_t index = 0;
+    for (const auto dataField : m_ehtFields.data)
+    {
+        os << " eht.data" << index++ << "=0x" << dataField;
+    }
+    index = 0;
+    for (const auto userInfoField : m_ehtFields.userInfo)
+    {
+        os << " eht.userInfo" << index++ << "=0x" << userInfoField;
+    }
+    os << std::dec;
 }
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/radiotap-header.h ns-3.44/src/network/utils/radiotap-header.h
--- ns-3.43/src/network/utils/radiotap-header.h	2024-10-09 16:41:10.076656600 -0700
+++ ns-3.44/src/network/utils/radiotap-header.h	2025-03-09 16:55:49.679372300 -0700
@@ -10,7 +10,11 @@
 #ifndef RADIOTAP_HEADER_H
 #define RADIOTAP_HEADER_H
 
-#include <ns3/header.h>
+#include "ns3/header.h"
+
+#include <array>
+#include <optional>
+#include <vector>
 
 namespace ns3
 {
@@ -58,8 +62,7 @@
      * byte buffer of a packet.  The data read is expected to match bit-for-bit
      * the representation of this header in real networks.
      *
-     * @param start An iterator which points to where the header should
-     *              written.
+     * @param start An iterator which points to where the header should be read.
      * @returns The number of bytes read.
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
@@ -92,7 +95,7 @@
     /**
      * @brief Frame flags.
      */
-    enum FrameFlag
+    enum FrameFlag : uint8_t
     {
         FRAME_FLAG_NONE = 0x00,           /**< No flags set */
         FRAME_FLAG_CFP = 0x01,            /**< Frame sent/received during CFP */
@@ -121,7 +124,7 @@
     /**
      * @brief Channel flags.
      */
-    enum ChannelFlags
+    enum ChannelFlags : uint16_t
     {
         CHANNEL_FLAG_NONE = 0x0000,          /**< No flags set */
         CHANNEL_FLAG_TURBO = 0x0010,         /**< Turbo Channel */
@@ -135,12 +138,20 @@
     };
 
     /**
-     * @brief Set the transmit/receive channel frequency and flags
-     * @param frequency The transmit/receive data rate in units of 500 kbps.
-     * @param flags The flags to set.
-     * @see ChannelFlags
+     * structure that contains the subfields of the Channel field.
      */
-    void SetChannelFrequencyAndFlags(uint16_t frequency, uint16_t flags);
+    struct ChannelFields
+    {
+        uint16_t frequency{0};             //!< Tx/Rx frequency in MHz
+        uint16_t flags{CHANNEL_FLAG_NONE}; //!< flags field (@see ChannelFlags)
+    };
+
+    /**
+     * @brief Set the subfields of the Channel field
+     *
+     * @param channelFields The subfields of the Channel field.
+     */
+    void SetChannelFields(const ChannelFields& channelFields);
 
     /**
      * @brief Set the RF signal power at the antenna as a decibel difference
@@ -163,7 +174,7 @@
     /**
      * @brief MCS known bits.
      */
-    enum McsKnown
+    enum McsKnown : uint8_t
     {
         MCS_KNOWN_NONE = 0x00,           /**< No flags set */
         MCS_KNOWN_BANDWIDTH = 0x01,      /**< Bandwidth */
@@ -180,7 +191,7 @@
     /**
      * @brief MCS flags.
      */
-    enum McsFlags
+    enum McsFlags : uint8_t
     {
         MCS_FLAGS_NONE =
             0x00, /**< Default: 20 MHz, long guard interval, mixed HT format and BCC FEC type */
@@ -196,18 +207,26 @@
     };
 
     /**
-     * @brief Set the MCS fields
+     * structure that contains the subfields of the MCS field.
+     */
+    struct McsFields
+    {
+        uint8_t known{MCS_KNOWN_NONE}; //!< known flags
+        uint8_t flags{MCS_FLAGS_NONE}; //!< flags field
+        uint8_t mcs{0};                //!< MCS index value
+    };
+
+    /**
+     * @brief Set the subfields of the MCS field
      *
-     * @param known The kwown flags.
-     * @param flags The flags to set.
-     * @param mcs The MCS index value.
+     * @param mcsFields The subfields of the MCS field.
      */
-    void SetMcsFields(uint8_t known, uint8_t flags, uint8_t mcs);
+    void SetMcsFields(const McsFields& mcsFields);
 
     /**
      * @brief A-MPDU status flags.
      */
-    enum AmpduFlags
+    enum AmpduFlags : uint8_t
     {
         A_MPDU_STATUS_NONE = 0x00,               /**< No flags set */
         A_MPDU_STATUS_REPORT_ZERO_LENGTH = 0x01, /**< Driver reports 0-length subframes */
@@ -222,19 +241,28 @@
     };
 
     /**
-     * @brief Set the A-MPDU status fields
+     * structure that contains the subfields of the A-MPDU status field.
+     */
+    struct AmpduStatusFields
+    {
+        uint32_t referenceNumber{
+            0}; //!< A-MPDU reference number to identify all subframes belonging to the same A-MPDU
+        uint16_t flags{A_MPDU_STATUS_NONE}; //!< flags field
+        uint8_t crc{1};                     //!< CRC field
+        uint8_t reserved{0};                //!< Reserved field
+    };
+
+    /**
+     * @brief Set the subfields of the A-MPDU status field
      *
-     * @param referenceNumber The A-MPDU reference number to identify all subframes belonging to the
-     * same A-MPDU.
-     * @param flags The flags to set.
-     * @param crc The CRC value value.
+     * @param ampduStatusFields The subfields of the A-MPDU status field.
      */
-    void SetAmpduStatus(uint32_t referenceNumber, uint16_t flags, uint8_t crc);
+    void SetAmpduStatus(const AmpduStatusFields& ampduStatusFields);
 
     /**
      * @brief VHT known bits.
      */
-    enum VhtKnown
+    enum VhtKnown : uint16_t
     {
         VHT_KNOWN_NONE = 0x0000, /**< No flags set */
         VHT_KNOWN_STBC = 0x0001, /**< Space-time block coding (1 if all spatial streams of all users
@@ -253,7 +281,7 @@
     /**
      * @brief VHT flags.
      */
-    enum VhtFlags
+    enum VhtFlags : uint8_t
     {
         VHT_FLAGS_NONE = 0x00, /**< No flags set */
         VHT_FLAGS_STBC =
@@ -270,29 +298,32 @@
     };
 
     /**
-     * @brief Set the VHT fields
+     * structure that contains the subfields of the VHT field.
+     */
+    struct VhtFields
+    {
+        uint16_t known{VHT_KNOWN_NONE};  //!< known flags field
+        uint8_t flags{VHT_FLAGS_NONE};   //!< flags field
+        uint8_t bandwidth{0};            //!< bandwidth field
+        std::array<uint8_t, 4> mcsNss{}; //!< mcs_nss field
+        uint8_t coding{0};               //!< coding field
+        uint8_t groupId{0};              //!< group_id field
+        uint16_t partialAid{0};          //!< partial_aid field
+    };
+
+    /**
+     * @brief Set the subfields of the VHT field
      *
-     * @param known The kwown flags.
-     * @param flags The flags to set.
-     * @param bandwidth The bandwidth value.
-     * @param mcs_nss The mcs_nss value.
-     * @param coding The coding value.
-     * @param group_id The group_id value.
-     * @param partial_aid The partial_aid value.
-     */
-    void SetVhtFields(uint16_t known,
-                      uint8_t flags,
-                      uint8_t bandwidth,
-                      uint8_t mcs_nss[4],
-                      uint8_t coding,
-                      uint8_t group_id,
-                      uint16_t partial_aid);
+     * @param vhtFields The subfields of the VHT field.
+     */
+    void SetVhtFields(const VhtFields& vhtFields);
 
     /**
-     * @brief HE data1.
+     * @brief bits of the HE data fields.
      */
-    enum HeData1
+    enum HeData : uint16_t
     {
+        /* Data 1 */
         HE_DATA1_FORMAT_EXT_SU = 0x0001,      /**< HE EXT SU PPDU format */
         HE_DATA1_FORMAT_MU = 0x0002,          /**< HE MU PPDU format */
         HE_DATA1_FORMAT_TRIG = 0x0003,        /**< HE TRIG PPDU format */
@@ -312,13 +343,7 @@
         HE_DATA1_SPTL_REUSE4_KNOWN = 0x2000, /**< Spatial Reuse 4 known (HE TRIG PPDU format) */
         HE_DATA1_BW_RU_ALLOC_KNOWN = 0x4000, /**< data BW/RU allocation known */
         HE_DATA1_DOPPLER_KNOWN = 0x8000,     /**< Doppler known */
-    };
-
-    /**
-     * @brief HE data2.
-     */
-    enum HeData2
-    {
+        /* Data 2 */
         HE_DATA2_PRISEC_80_KNOWN = 0x0001,    /**< pri/sec 80 MHz known */
         HE_DATA2_GI_KNOWN = 0x0002,           /**< GI known */
         HE_DATA2_NUM_LTF_SYMS_KNOWN = 0x0004, /**< number of LTF symbols known */
@@ -330,13 +355,23 @@
         HE_DATA2_RU_OFFSET = 0x3f00,          /**< RU allocation offset */
         HE_DATA2_RU_OFFSET_KNOWN = 0x4000,    /**< RU allocation offset known */
         HE_DATA2_PRISEC_80_SEC = 0x8000,      /**< pri/sec 80 MHz */
-    };
-
-    /**
-     * @brief HE data5.
-     */
-    enum HeData5
-    {
+        /* Data 3 */
+        HE_DATA3_BSS_COLOR = 0x003f,
+        HE_DATA3_BEAM_CHANGE = 0x0040,
+        HE_DATA3_UL_DL = 0x0080,
+        HE_DATA3_DATA_MCS = 0x0f00,
+        HE_DATA3_DATA_DCM = 0x1000,
+        HE_DATA3_CODING = 0x2000,
+        HE_DATA3_LDPC_XSYMSEG = 0x4000,
+        HE_DATA3_STBC = 0x8000,
+        /* Data 4 */
+        HE_DATA4_SU_MU_SPTL_REUSE = 0x000f,
+        HE_DATA4_MU_STA_ID = 0x7ff0,
+        HE_DATA4_TB_SPTL_REUSE1 = 0x000f,
+        HE_DATA4_TB_SPTL_REUSE2 = 0x00f0,
+        HE_DATA4_TB_SPTL_REUSE3 = 0x0f00,
+        HE_DATA4_TB_SPTL_REUSE4 = 0xf000,
+        /* Data 5 */
         HE_DATA5_DATA_BW_RU_ALLOC_40MHZ = 0x0001,  /**< 40 MHz data Bandwidth */
         HE_DATA5_DATA_BW_RU_ALLOC_80MHZ = 0x0002,  /**< 80 MHz data Bandwidth */
         HE_DATA5_DATA_BW_RU_ALLOC_160MHZ = 0x0003, /**< 160 MHz data Bandwidth */
@@ -357,26 +392,29 @@
     };
 
     /**
-     * @brief Set the HE fields
+     * structure that contains the subfields of the HE field.
+     */
+    struct HeFields
+    {
+        uint16_t data1{0}; //!< data1 field
+        uint16_t data2{0}; //!< data2 field
+        uint16_t data3{0}; //!< data3 field
+        uint16_t data4{0}; //!< data4 field
+        uint16_t data5{0}; //!< data5 field
+        uint16_t data6{0}; //!< data6 field
+    };
+
+    /**
+     * @brief Set the subfields of the HE field
      *
-     * @param data1 The data1 field.
-     * @param data2 The data2 field.
-     * @param data3 The data3 field.
-     * @param data4 The data4 field.
-     * @param data5 The data5 field.
-     * @param data6 The data6 field.
-     */
-    void SetHeFields(uint16_t data1,
-                     uint16_t data2,
-                     uint16_t data3,
-                     uint16_t data4,
-                     uint16_t data5,
-                     uint16_t data6);
+     * @param heFields The subfields of the HE field.
+     */
+    void SetHeFields(const HeFields& heFields);
 
     /**
      * @brief HE MU flags1.
      */
-    enum HeMuFlags1
+    enum HeMuFlags1 : uint16_t
     {
         HE_MU_FLAGS1_SIGB_MCS = 0x000f,                //!< SIG-B MCS (from SIG-A)
         HE_MU_FLAGS1_SIGB_MCS_KNOWN = 0x0010,          //!< SIG-B MCS known
@@ -394,7 +432,7 @@
     /**
      * @brief HE MU flags2.
      */
-    enum HeMuFlags2
+    enum HeMuFlags2 : uint16_t
     {
         HE_MU_FLAGS2_BW_FROM_SIGA = 0x0003, /**< Bandwidth from Bandwidth field in HE-SIG-A */
         HE_MU_FLAGS2_BW_FROM_SIGA_KNOWN =
@@ -410,22 +448,27 @@
     };
 
     /**
-     * @brief Set the HE MU fields
+     * structure that contains the subfields of the HE-MU field.
+     */
+    struct HeMuFields
+    {
+        uint16_t flags1{0};                  //!< flags1 field
+        uint16_t flags2{0};                  //!< flags2 field
+        std::array<uint8_t, 4> ruChannel1{}; //!< RU_channel1 field
+        std::array<uint8_t, 4> ruChannel2{}; //!< RU_channel2 field
+    };
+
+    /**
+     * @brief Set the subfields of the HE-MU field
      *
-     * @param flags1 The flags1 field.
-     * @param flags2 The flags2 field.
-     * @param ruChannel1 The RU_channel1 field.
-     * @param ruChannel2 The RU_channel2 field.
-     */
-    void SetHeMuFields(uint16_t flags1,
-                       uint16_t flags2,
-                       const std::array<uint8_t, 4>& ruChannel1,
-                       const std::array<uint8_t, 4>& ruChannel2);
+     * @param heMuFields The subfields of the HE-MU field.
+     */
+    void SetHeMuFields(const HeMuFields& heMuFields);
 
     /**
      * @brief HE MU per_user_known.
      */
-    enum HeMuPerUserKnown
+    enum HeMuPerUserKnown : uint8_t
     {
         HE_MU_PER_USER_POSITION_KNOWN = 0x01,              //!< User field position known
         HE_MU_PER_USER_STA_ID_KNOWN = 0x02,                //!< STA-ID known
@@ -438,23 +481,518 @@
     };
 
     /**
-     * @brief Set the HE MU per user fields
+     * structure that contains the subfields of the HE-MU-other-user field.
+     */
+    struct HeMuOtherUserFields
+    {
+        uint16_t perUser1{0};       //!< per_user_1 field
+        uint16_t perUser2{0};       //!< per_user_2 field
+        uint8_t perUserPosition{0}; //!< per_user_position field
+        uint8_t perUserKnown{0};    //!< per_user_known field
+    };
+
+    /**
+     * @brief Set the subfields of the HE-MU-other-user field
      *
-     * @param perUser1 The per_user_1 field.
-     * @param perUser2 The per_user_2 field.
-     * @param perUserPosition The per_user_position field.
-     * @param perUserKnown The per_user_known field.
-     */
-    void SetHeMuPerUserFields(uint16_t perUser1,
-                              uint16_t perUser2,
-                              uint8_t perUserPosition,
-                              uint8_t perUserKnown);
+     * @param heMuOtherUserFields The subfields of the HE-MU-other-user field.
+     */
+    void SetHeMuOtherUserFields(const HeMuOtherUserFields& heMuOtherUserFields);
+
+    /**
+     * structure that contains the subfields of the TLV fields.
+     */
+    struct TlvFields
+    {
+        uint16_t type{0};   //!< type field.
+        uint16_t length{0}; //!< length field.
+    };
+
+    /**
+     * structure that contains the subfields of the U-SIG field.
+     */
+    struct UsigFields
+    {
+        uint32_t common{0}; //!< common field.
+        uint32_t value{0};  //!< value field.
+        uint32_t mask{0};   //!< mask field.
+    };
+
+    /**
+     * @brief U-SIG common subfield.
+     */
+    enum UsigCommon : uint32_t
+    {
+        USIG_COMMON_PHY_VER_KNOWN = 0x00000001,
+        USIG_COMMON_BW_KNOWN = 0x00000002,
+        USIG_COMMON_UL_DL_KNOWN = 0x00000004,
+        USIG_COMMON_BSS_COLOR_KNOWN = 0x00000008,
+        USIG_COMMON_TXOP_KNOWN = 0x00000010,
+        USIG_COMMON_BAD_USIG_CRC = 0x00000020,
+        USIG_COMMON_VALIDATE_BITS_CHECKED = 0x00000040,
+        USIG_COMMON_VALIDATE_BITS_OK = 0x00000080,
+        USIG_COMMON_PHY_VER = 0x00007000,
+        USIG_COMMON_BW = 0x00038000,
+        USIG_COMMON_UL_DL = 0x00040000,
+        USIG_COMMON_BSS_COLOR = 0x01f80000,
+        USIG_COMMON_TXOP = 0xfe000000,
+    };
+
+    /**
+     * @brief Possible BW values in U-SIG common subfield.
+     */
+    enum UsigCommonBw : uint8_t
+    {
+        USIG_COMMON_BW_20MHZ = 0,
+        USIG_COMMON_BW_40MHZ = 1,
+        USIG_COMMON_BW_80MHZ = 2,
+        USIG_COMMON_BW_160MHZ = 3,
+        USIG_COMMON_BW_320MHZ_1 = 4,
+        USIG_COMMON_BW_320MHZ_2 = 5,
+    };
+
+    /**
+     * @brief EHT MU PPDU U-SIG contents.
+     */
+    enum UsigMu : uint32_t
+    {
+        /* MU-USIG-1 */
+        USIG1_MU_B20_B24_DISREGARD = 0x0000001f,
+        USIG1_MU_B25_VALIDATE = 0x00000020,
+        /* MU-USIG-2 */
+        USIG2_MU_B0_B1_PPDU_TYPE = 0x000000c0,
+        USIG2_MU_B2_VALIDATE = 0x00000100,
+        USIG2_MU_B3_B7_PUNCTURED_INFO = 0x00003e00,
+        USIG2_MU_B8_VALIDATE = 0x00004000,
+        USIG2_MU_B9_B10_SIG_MCS = 0x00018000,
+        USIG2_MU_B11_B15_EHT_SYMBOLS = 0x003e0000,
+        USIG2_MU_B16_B19_CRC = 0x03c00000,
+        USIG2_MU_B20_B25_TAIL = 0xfc000000,
+    };
+
+    /**
+     * @brief EHT TB PPDU U-SIG contents.
+     */
+    enum UsigTb : uint32_t
+    {
+        /* TB-USIG-1 */
+        USIG1_TB_B20_B25_DISREGARD = 0x0000001f,
+        /* TB-USIG-2 */
+        USIG2_TB_B0_B1_PPDU_TYPE = 0x000000c0,
+        USIG2_TB_B2_VALIDATE = 0x00000100,
+        USIG2_TB_B3_B6_SPATIAL_REUSE_1 = 0x00001e00,
+        USIG2_TB_B7_B10_SPATIAL_REUSE_2 = 0x0001e000,
+        USIG2_TB_B11_B15_DISREGARD = 0x003e0000,
+        USIG2_TB_B16_B19_CRC = 0x03c00000,
+        USIG2_TB_B20_B25_TAIL = 0xfc000000,
+    };
+
+    /**
+     * @brief Set the subfields of the U-SIG field
+     *
+     * @param usigFields The subfields of the U-SIG field.
+     */
+    void SetUsigFields(const UsigFields& usigFields);
+
+    /**
+     * structure that contains the subfields of the EHT field.
+     */
+    struct EhtFields
+    {
+        uint32_t known{0};                //!< known field.
+        std::array<uint32_t, 9> data{};   //!< data fields.
+        std::vector<uint32_t> userInfo{}; //!< user info fields.
+    };
+
+    /**
+     * @brief EHT known subfield.
+     */
+    enum EhtKnown : uint32_t
+    {
+        EHT_KNOWN_SPATIAL_REUSE = 0x00000002,
+        EHT_KNOWN_GI = 0x00000004,
+        EHT_KNOWN_EHT_LTF = 0x00000010,
+        EHT_KNOWN_LDPC_EXTRA_SYM_OM = 0x00000020,
+        EHT_KNOWN_PRE_PADD_FACOR_OM = 0x00000040,
+        EHT_KNOWN_PE_DISAMBIGUITY_OM = 0x00000080,
+        EHT_KNOWN_DISREGARD_O = 0x00000100,
+        EHT_KNOWN_DISREGARD_S = 0x00000200,
+        EHT_KNOWN_CRC1 = 0x00002000,
+        EHT_KNOWN_TAIL1 = 0x00004000,
+        EHT_KNOWN_CRC2_O = 0x00008000,
+        EHT_KNOWN_TAIL2_O = 0x00010000,
+        EHT_KNOWN_NSS_S = 0x00020000,
+        EHT_KNOWN_BEAMFORMED_S = 0x00040000,
+        EHT_KNOWN_NR_NON_OFDMA_USERS_M = 0x00080000,
+        EHT_KNOWN_ENCODING_BLOCK_CRC_M = 0x00100000,
+        EHT_KNOWN_ENCODING_BLOCK_TAIL_M = 0x00200000,
+        EHT_KNOWN_RU_MRU_SIZE_OM = 0x00400000,
+        EHT_KNOWN_RU_MRU_INDEX_OM = 0x00800000,
+        EHT_KNOWN_RU_ALLOC_TB_OM = 0x01000000,
+        EHT_KNOWN_PRIMARY_80 = 0x02000000,
+    };
+
+    /**
+     * @brief EHT data subfield.
+     */
+    enum EhtData : uint32_t
+    {
+        /* Data 0 */
+        EHT_DATA0_SPATIAL_REUSE = 0x00000078,
+        EHT_DATA0_GI = 0x00000180,
+        EHT_DATA0_LTF = 0x00000600,
+        EHT_DATA0_EHT_LTF = 0x00003800,
+        EHT_DATA0_LDPC_EXTRA_SYM_OM = 0x00004000,
+        EHT_DATA0_PRE_PADD_FACOR_OM = 0x00018000,
+        EHT_DATA0_PE_DISAMBIGUITY_OM = 0x00020000,
+        EHT_DATA0_DISREGARD_S = 0x000c0000,
+        EHT_DATA0_DISREGARD_O = 0x003c0000,
+        EHT_DATA0_CRC1_O = 0x03c00000,
+        EHT_DATA0_TAIL1_O = 0xfc000000,
+        /* Data 1 */
+        EHT_DATA1_RU_MRU_SIZE = 0x0000001f,
+        EHT_DATA1_RU_MRU_INDEX = 0x00001fe0,
+        EHT_DATA1_RU_ALLOC_CC_1_1_1 = 0x003fe000,
+        EHT_DATA1_RU_ALLOC_CC_1_1_1_KNOWN = 0x00400000,
+        EHT_DATA1_PRIMARY_80 = 0xc0000000,
+        /* Data 2 */
+        EHT_DATA2_RU_ALLOC_CC_2_1_1 = 0x000001ff,
+        EHT_DATA2_RU_ALLOC_CC_2_1_1_KNOWN = 0x00000200,
+        EHT_DATA2_RU_ALLOC_CC_1_1_2 = 0x0007fc00,
+        EHT_DATA2_RU_ALLOC_CC_1_1_2_KNOWN = 0x00080000,
+        EHT_DATA2_RU_ALLOC_CC_2_1_2 = 0x1ff00000,
+        EHT_DATA2_RU_ALLOC_CC_2_1_2_KNOWN = 0x20000000,
+        /* Data 3 */
+        EHT_DATA3_RU_ALLOC_CC_1_2_1 = 0x000001ff,
+        EHT_DATA3_RU_ALLOC_CC_1_2_1_KNOWN = 0x00000200,
+        EHT_DATA3_RU_ALLOC_CC_2_2_1 = 0x0007fc00,
+        EHT_DATA3_RU_ALLOC_CC_2_2_1_KNOWN = 0x00080000,
+        EHT_DATA3_RU_ALLOC_CC_1_2_2 = 0x1ff00000,
+        EHT_DATA3_RU_ALLOC_CC_1_2_2_KNOWN = 0x20000000,
+        /* Data 4 */
+        EHT_DATA4_RU_ALLOC_CC_2_2_2 = 0x000001ff,
+        EHT_DATA4_RU_ALLOC_CC_2_2_2_KNOWN = 0x00000200,
+        EHT_DATA4_RU_ALLOC_CC_1_2_3 = 0x0007fc00,
+        EHT_DATA4_RU_ALLOC_CC_1_2_3_KNOWN = 0x00080000,
+        EHT_DATA4_RU_ALLOC_CC_2_2_3 = 0x1ff00000,
+        EHT_DATA4_RU_ALLOC_CC_2_2_3_KNOWN = 0x20000000,
+        /* Data 5 */
+        EHT_DATA5_RU_ALLOC_CC_1_2_4 = 0x000001ff,
+        EHT_DATA5_RU_ALLOC_CC_1_2_4_KNOWN = 0x00000200,
+        EHT_DATA5_RU_ALLOC_CC_2_2_4 = 0x0007fc00,
+        EHT_DATA5_RU_ALLOC_CC_2_2_4_KNOWN = 0x00080000,
+        EHT_DATA5_RU_ALLOC_CC_1_2_5 = 0x1ff00000,
+        EHT_DATA5_RU_ALLOC_CC_1_2_5_KNOWN = 0x20000000,
+        /* Data 6 */
+        EHT_DATA6_RU_ALLOC_CC_2_2_5 = 0x000001ff,
+        EHT_DATA6_RU_ALLOC_CC_2_2_5_KNOWN = 0x00000200,
+        EHT_DATA6_RU_ALLOC_CC_1_2_6 = 0x0007fc00,
+        EHT_DATA6_RU_ALLOC_CC_1_2_6_KNOWN = 0x00080000,
+        EHT_DATA6_RU_ALLOC_CC_2_2_6 = 0x1ff00000,
+        EHT_DATA6_RU_ALLOC_CC_2_2_6_KNOWN = 0x20000000,
+        /* Data 7 */
+        EHT_DATA7_CRC2_O = 0x0000000f,
+        EHT_DATA7_TAIL_2_O = 0x000003f0,
+        EHT_DATA7_NSS_S = 0x0000f000,
+        EHT_DATA7_BEAMFORMED_S = 0x00010000,
+        EHT_DATA7_NUM_OF_NON_OFDMA_USERS = 0x000e0000,
+        EHT_DATA7_USER_ENCODING_BLOCK_CRC = 0x00f00000,
+        EHT_DATA7_USER_ENCODING_BLOCK_TAIL = 0x3f000000,
+        /* Data 8 */
+        EHT_DATA8_RU_ALLOC_TB_FMT_PS_160 = 0x00000001,
+        EHT_DATA8_RU_ALLOC_TB_FMT_B0 = 0x00000002,
+        EHT_DATA8_RU_ALLOC_TB_FMT_B7_B1 = 0x000001fc,
+    };
+
+    /**
+     * @brief Possible GI values in EHT data subfield.
+     */
+    enum EhtData0Gi : uint8_t
+    {
+        EHT_DATA0_GI_800_NS = 0,
+        EHT_DATA0_GI_1600_NS = 1,
+        EHT_DATA0_GI_3200_NS = 2,
+    };
+
+    /**
+     * @brief Possible Primary 80 MHz Channel Position values in EHT data subfield.
+     */
+    enum EhtData1Primary80 : uint8_t
+    {
+        EHT_DATA1_PRIMARY_80_LOWEST = 0,
+        EHT_DATA1_PRIMARY_80_HIGHEST = 3,
+    };
+
+    /**
+     * @brief Possible RU/MRU Size values in EHT data subfield.
+     */
+    enum EhtData1RuSize : uint8_t
+    {
+        EHT_DATA1_RU_MRU_SIZE_26 = 0,
+        EHT_DATA1_RU_MRU_SIZE_52 = 1,
+        EHT_DATA1_RU_MRU_SIZE_106 = 2,
+        EHT_DATA1_RU_MRU_SIZE_242 = 3,
+        EHT_DATA1_RU_MRU_SIZE_484 = 4,
+        EHT_DATA1_RU_MRU_SIZE_996 = 5,
+        EHT_DATA1_RU_MRU_SIZE_2x996 = 6,
+        EHT_DATA1_RU_MRU_SIZE_4x996 = 7,
+        EHT_DATA1_RU_MRU_SIZE_52_26 = 8,
+        EHT_DATA1_RU_MRU_SIZE_106_26 = 9,
+        EHT_DATA1_RU_MRU_SIZE_484_242 = 10,
+        EHT_DATA1_RU_MRU_SIZE_996_484 = 11,
+        EHT_DATA1_RU_MRU_SIZE_996_484_242 = 12,
+        EHT_DATA1_RU_MRU_SIZE_2x996_484 = 13,
+        EHT_DATA1_RU_MRU_SIZE_3x996 = 14,
+        EHT_DATA1_RU_MRU_SIZE_3x996_484 = 15,
+    };
+
+    /**
+     * @brief EHT user_info subfield.
+     */
+    enum EhtUserInfo : uint32_t
+    {
+        EHT_USER_INFO_STA_ID_KNOWN = 0x00000001,
+        EHT_USER_INFO_MCS_KNOWN = 0x00000002,
+        EHT_USER_INFO_CODING_KNOWN = 0x00000004,
+        EHT_USER_INFO_NSS_KNOWN_O = 0x00000010,
+        EHT_USER_INFO_BEAMFORMING_KNOWN_O = 0x00000020,
+        EHT_USER_INFO_SPATIAL_CONFIG_KNOWN_M = 0x00000040,
+        EHT_USER_INFO_DATA_FOR_USER = 0x00000080,
+        EHT_USER_INFO_STA_ID = 0x0007ff00,
+        EHT_USER_INFO_CODING = 0x00080000,
+        EHT_USER_INFO_MCS = 0x00f00000,
+        EHT_USER_INFO_NSS_O = 0x0f000000,
+        EHT_USER_INFO_BEAMFORMING_O = 0x20000000,
+        EHT_USER_INFO_SPATIAL_CONFIG_M = 0x3f000000,
+    };
+
+    /**
+     * @brief Set the subfields of the EHT-SIG field
+     *
+     * @param ehtFields The subfields of the EHT-SIG field.
+     */
+    void SetEhtFields(const EhtFields& ehtFields);
 
   private:
     /**
+     * Serialize the Channel radiotap header.
+     *
+     * @param start An iterator which points to where the header should be written.
+     */
+    void SerializeChannel(Buffer::Iterator& start) const;
+
+    /**
+     * Deserialize the Channel radiotap header.
+     *
+     * @param start An iterator which points to where the header should be read.
+     * @param bytesRead the number of bytes already read.
+
+     * @returns The number of bytes read.
+     */
+    uint32_t DeserializeChannel(Buffer::Iterator start, uint32_t bytesRead);
+
+    /**
+     * Add Channel subfield/value pairs to the output stream.
+     *
+     * @param os The output stream
+     */
+    void PrintChannel(std::ostream& os) const;
+
+    /**
+     * Serialize the MCS radiotap header.
+     *
+     * @param start An iterator which points to where the header should be written.
+     */
+    void SerializeMcs(Buffer::Iterator& start) const;
+
+    /**
+     * Deserialize the MCS radiotap header.
+     *
+     * @param start An iterator which points to where the header should be read.
+     * @param bytesRead the number of bytes already read.
+
+     * @returns The number of bytes read.
+     */
+    uint32_t DeserializeMcs(Buffer::Iterator start, uint32_t bytesRead);
+
+    /**
+     * Add MCS subfield/value pairs to the output stream.
+     *
+     * @param os The output stream
+     */
+    void PrintMcs(std::ostream& os) const;
+
+    /**
+     * Serialize the A-MPDU Status radiotap header.
+     *
+     * @param start An iterator which points to where the header should be written.
+     */
+    void SerializeAmpduStatus(Buffer::Iterator& start) const;
+
+    /**
+     * Deserialize the A-MPDU Status radiotap header.
+     *
+     * @param start An iterator which points to where the header should be read.
+     * @param bytesRead the number of bytes already read.
+
+     * @returns The number of bytes read.
+     */
+    uint32_t DeserializeAmpduStatus(Buffer::Iterator start, uint32_t bytesRead);
+
+    /**
+     * Add A-MPDU Status subfield/value pairs to the output stream.
+     *
+     * @param os The output stream
+     */
+    void PrintAmpduStatus(std::ostream& os) const;
+
+    /**
+     * Serialize the VHT radiotap header.
+     *
+     * @param start An iterator which points to where the header should be written.
+     */
+    void SerializeVht(Buffer::Iterator& start) const;
+
+    /**
+     * Deserialize the VHT radiotap header.
+     *
+     * @param start An iterator which points to where the header should be read.
+     * @param bytesRead the number of bytes already read.
+
+     * @returns The number of bytes read.
+     */
+    uint32_t DeserializeVht(Buffer::Iterator start, uint32_t bytesRead);
+
+    /**
+     * Add VHT subfield/value pairs to the output stream.
+     *
+     * @param os The output stream
+     */
+    void PrintVht(std::ostream& os) const;
+
+    /**
+     * Serialize the HE radiotap header.
+     *
+     * @param start An iterator which points to where the header should be written.
+     */
+    void SerializeHe(Buffer::Iterator& start) const;
+
+    /**
+     * Deserialize the HE radiotap header.
+     *
+     * @param start An iterator which points to where the header should be read.
+     * @param bytesRead the number of bytes already read.
+
+     * @returns The number of bytes read.
+     */
+    uint32_t DeserializeHe(Buffer::Iterator start, uint32_t bytesRead);
+
+    /**
+     * Add HE subfield/value pairs to the output stream.
+     *
+     * @param os The output stream
+     */
+    void PrintHe(std::ostream& os) const;
+
+    /**
+     * Serialize the HE-MU radiotap header.
+     *
+     * @param start An iterator which points to where the header should be written.
+     */
+    void SerializeHeMu(Buffer::Iterator& start) const;
+
+    /**
+     * Deserialize the HE-MU radiotap header.
+     *
+     * @param start An iterator which points to where the header should be read.
+     * @param bytesRead the number of bytes already read.
+
+     * @returns The number of bytes read.
+     */
+    uint32_t DeserializeHeMu(Buffer::Iterator start, uint32_t bytesRead);
+
+    /**
+     * Add HE-MU subfield/value pairs to the output stream.
+     *
+     * @param os The output stream
+     */
+    void PrintHeMu(std::ostream& os) const;
+
+    /**
+     * Serialize the HE-MU-other-user radiotap header.
+     *
+     * @param start An iterator which points to where the header should be written.
+     */
+    void SerializeHeMuOtherUser(Buffer::Iterator& start) const;
+
+    /**
+     * Deserialize the HE-MU-other-user radiotap header.
+     *
+     * @param start An iterator which points to where the header should be read.
+     * @param bytesRead the number of bytes already read.
+
+     * @returns The number of bytes read.
+     */
+    uint32_t DeserializeHeMuOtherUser(Buffer::Iterator start, uint32_t bytesRead);
+
+    /**
+     * Add HE-MU-other-user subfield/value pairs to the output stream.
+     *
+     * @param os The output stream
+     */
+    void PrintHeMuOtherUser(std::ostream& os) const;
+
+    /**
+     * Serialize the U-SIG radiotap header.
+     *
+     * @param start An iterator which points to where the header should be written.
+     */
+    void SerializeUsig(Buffer::Iterator& start) const;
+
+    /**
+     * Deserialize the U-SIG radiotap header.
+     *
+     * @param start An iterator which points to where the header should be read.
+     * @param bytesRead the number of bytes already read.
+
+     * @returns The number of bytes read.
+     */
+    uint32_t DeserializeUsig(Buffer::Iterator start, uint32_t bytesRead);
+
+    /**
+     * Add U-SIG subfield/value pairs to the output stream.
+     *
+     * @param os The output stream
+     */
+    void PrintUsig(std::ostream& os) const;
+
+    /**
+     * Serialize the EHT radiotap header.
+     *
+     * @param start An iterator which points to where the header should be written.
+     */
+    void SerializeEht(Buffer::Iterator& start) const;
+
+    /**
+     * Deserialize the EHT radiotap header.
+     *
+     * @param start An iterator which points to where the header should be read.
+     * @param bytesRead the number of bytes already read.
+
+     * @returns The number of bytes read.
+     */
+    uint32_t DeserializeEht(Buffer::Iterator start, uint32_t bytesRead);
+
+    /**
+     * Add EHT subfield/value pairs to the output stream.
+     *
+     * @param os The output stream
+     */
+    void PrintEht(std::ostream& os) const;
+
+    /**
      * @brief Radiotap flags.
      */
-    enum RadiotapFlags
+    enum RadiotapFlags : uint32_t
     {
         RADIOTAP_TSFT = 0x00000001,
         RADIOTAP_FLAGS = 0x00000002,
@@ -479,59 +1017,65 @@
         RADIOTAP_HE_MU_OTHER_USER = 0x02000000,
         RADIOTAP_ZERO_LEN_PSDU = 0x04000000,
         RADIOTAP_LSIG = 0x08000000,
+        RADIOTAP_TLV = 0x10000000,
         RADIOTAP_EXT = 0x80000000
     };
 
-    uint16_t m_length;  //!< entire length of radiotap data + header
-    uint32_t m_present; //!< bits describing which fields follow header
+    /**
+     * @brief Radiotap extended flags.
+     */
+    enum RadiotapExtFlags : uint32_t
+    {
+        RADIOTAP_S1G = 0x00000001,
+        RADIOTAP_USIG = 0x00000002,
+        RADIOTAP_EHT_SIG = 0x00000004
+    };
+
+    uint16_t m_length{8};                   //!< entire length of radiotap data + header
+    uint32_t m_present{0};                  //!< bits describing which fields follow header
+    std::optional<uint32_t> m_presentExt{}; //!< optional extended present bitmask
+
+    uint64_t m_tsft{0}; //!< Time Synchronization Function Timer (when the first bit of the MPDU
+                        //!< arrived at the MAC)
+
+    uint8_t m_flags{FRAME_FLAG_NONE}; //!< Properties of transmitted and received frames.
+
+    uint8_t m_rate{0}; //!< TX/RX data rate in units of 500 kbps
+
+    uint8_t m_channelPad{0};         //!< Channel padding.
+    ChannelFields m_channelFields{}; //!< Channel fields.
+
+    int8_t m_antennaSignal{
+        0}; //!< RF signal power at the antenna, dB difference from an arbitrary, fixed reference.
+    int8_t m_antennaNoise{
+        0}; //!< RF noise power at the antenna, dB difference from an arbitrary, fixed reference.
+
+    McsFields m_mcsFields{}; //!< MCS fields.
+
+    uint8_t m_ampduStatusPad{0}; //!< A-MPDU Status Flags, padding before A-MPDU Status Field.
+    AmpduStatusFields m_ampduStatusFields{}; //!< A-MPDU Status fields.
+
+    uint8_t m_vhtPad{0};     //!< VHT padding.
+    VhtFields m_vhtFields{}; //!< VHT fields.
+
+    uint8_t m_hePad{0};    //!< HE padding.
+    HeFields m_heFields{}; //!< HE fields.
+
+    uint8_t m_heMuPad{0};      //!< HE MU padding.
+    HeMuFields m_heMuFields{}; //!< HE MU fields.
+
+    uint8_t m_heMuOtherUserPad{0};               //!< HE MU other user padding.
+    HeMuOtherUserFields m_heMuOtherUserFields{}; //!< HE MU other user fields.
+
+    uint8_t m_usigTlvPad{0};   //!< U-SIG TLV padding.
+    TlvFields m_usigTlv{};     //!< U-SIG TLV fields.
+    uint8_t m_usigPad{0};      //!< U-SIG padding.
+    UsigFields m_usigFields{}; //!< U-SIG fields.
 
-    uint64_t m_tsft;        //!< Time Synchronization Function Timer (when the first bit of the MPDU
-                            //!< arrived at the MAC)
-    uint8_t m_flags;        //!< Properties of transmitted and received frames.
-    uint8_t m_rate;         //!< TX/RX data rate in units of 500 kbps
-    uint8_t m_channelPad;   //!< Tx/Rx channel padding.
-    uint16_t m_channelFreq; //!< Tx/Rx frequency in MHz.
-    uint16_t m_channelFlags; //!< Tx/Rx channel flags.
-    int8_t m_antennaSignal;  //!< RF signal power at the antenna, dB difference from an arbitrary,
-                             //!< fixed reference.
-    int8_t m_antennaNoise;   //!< RF noise power at the antenna, dB difference from an arbitrary,
-                             //!< fixed reference.
-
-    uint8_t m_mcsKnown; //!< MCS Flags, known information field.
-    uint8_t m_mcsFlags; //!< MCS Flags, flags field.
-    uint8_t m_mcsRate;  //!< MCS Flags, mcs rate index.
-
-    uint8_t m_ampduStatusPad;    //!< A-MPDU Status Flags, padding before A-MPDU Status Field.
-    uint32_t m_ampduStatusRef;   //!< A-MPDU Status Flags, reference number.
-    uint16_t m_ampduStatusFlags; //!< A-MPDU Status Flags, information about the received A-MPDU.
-    uint8_t m_ampduStatusCRC;    //!< A-MPDU Status Flags, delimiter CRC value.
-
-    uint8_t m_vhtPad;         //!< VHT padding.
-    uint16_t m_vhtKnown;      //!< VHT known field.
-    uint8_t m_vhtFlags;       //!< VHT flags field.
-    uint8_t m_vhtBandwidth;   //!< VHT bandwidth field.
-    uint8_t m_vhtMcsNss[4];   //!< VHT mcs_nss field.
-    uint8_t m_vhtCoding;      //!< VHT coding field.
-    uint8_t m_vhtGroupId;     //!< VHT group_id field.
-    uint16_t m_vhtPartialAid; //!< VHT partial_aid field.
-
-    uint8_t m_hePad;    //!< HE padding.
-    uint16_t m_heData1; //!< HE data1 field.
-    uint16_t m_heData2; //!< HE data2 field.
-    uint16_t m_heData3; //!< HE data3 field.
-    uint16_t m_heData4; //!< HE data4 field.
-    uint16_t m_heData5; //!< HE data5 field.
-    uint16_t m_heData6; //!< HE data6 field.
-
-    uint8_t m_heMuPad;     //!< HE MU padding.
-    uint16_t m_heMuFlags1; //!< HE MU flags1 field.
-    uint16_t m_heMuFlags2; //!< HE MU flags2 field.
-
-    uint8_t m_heMuOtherUserPad;    //!< HE MU other user padding.
-    uint16_t m_heMuPerUser1;       //!< HE MU per_user_1 field.
-    uint16_t m_heMuPerUser2;       //!< HE MU per_user_2 field.
-    uint8_t m_heMuPerUserPosition; //!< HE MU per_user_position field.
-    uint8_t m_heMuPerUserKnown;    //!< HE MU per_user_known field.
+    uint8_t m_ehtTlvPad{0};  //!< EHT TLV padding.
+    TlvFields m_ehtTlv{};    //!< EHT TLV fields.
+    uint8_t m_ehtPad{0};     //!< EHT padding.
+    EhtFields m_ehtFields{}; //!< EHT fields.
 };
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/sequence-number.h ns-3.44/src/network/utils/sequence-number.h
--- ns-3.43/src/network/utils/sequence-number.h	2024-10-09 16:41:10.076656600 -0700
+++ ns-3.44/src/network/utils/sequence-number.h	2025-03-09 16:55:49.679372300 -0700
@@ -19,14 +19,14 @@
 {
 
 /**
- * \ingroup network
- * \defgroup seq-counters Sequence Counter
- * \brief "sequence number" classes
+ * @ingroup network
+ * @defgroup seq-counters Sequence Counter
+ * @brief "sequence number" classes
  */
 
 /**
- * \ingroup seq-counters
- * \brief Generic "sequence number" class
+ * @ingroup seq-counters
+ * @brief Generic "sequence number" class
  *
  * This class can be used to handle sequence numbers.  In networking
  * protocols, sequence numbers are fixed precision integer numbers
@@ -56,8 +56,8 @@
     }
 
     /**
-     * \brief Constructs a SequenceNumber with the given value
-     * \param value the sequence number value
+     * @brief Constructs a SequenceNumber with the given value
+     * @param value the sequence number value
      */
     explicit SequenceNumber(NUMERIC_TYPE value)
         : m_value(value)
@@ -65,8 +65,8 @@
     }
 
     /**
-     * \brief Constructs a SequenceNumber from a copy
-     * \param value sequence number to copy
+     * @brief Constructs a SequenceNumber from a copy
+     * @param value sequence number to copy
      */
     SequenceNumber(const SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE>& value)
         : m_value(value.m_value)
@@ -74,9 +74,9 @@
     }
 
     /**
-     * \brief Constructs a SequenceNumber from an assignment of given value
-     * \param value sequence number to copy
-     * \returns reference to the assignee
+     * @brief Constructs a SequenceNumber from an assignment of given value
+     * @param value sequence number to copy
+     * @returns reference to the assignee
      */
     SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE>& operator=(NUMERIC_TYPE value)
     {
@@ -85,9 +85,9 @@
     }
 
     /**
-     * \brief Constructs a SequenceNumber from an assignment of another sequence number
-     * \param value sequence number to copy
-     * \returns reference to the assignee
+     * @brief Constructs a SequenceNumber from an assignment of another sequence number
+     * @param value sequence number to copy
+     * @returns reference to the assignee
      */
     SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE>& operator=(
         const SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE>& value)
@@ -105,8 +105,8 @@
 #endif
 
     /**
-     * \brief Extracts the numeric value of the sequence number
-     * \returns the sequence number value
+     * @brief Extracts the numeric value of the sequence number
+     * @returns the sequence number value
      */
     NUMERIC_TYPE GetValue() const
     {
@@ -114,8 +114,8 @@
     }
 
     /**
-     * \brief Prefix increment operator
-     * \returns incremented sequence number
+     * @brief Prefix increment operator
+     * @returns incremented sequence number
      */
     SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE> operator++()
     {
@@ -124,8 +124,8 @@
     }
 
     /**
-     * \brief Postfix increment operator
-     * \returns incremented sequence number
+     * @brief Postfix increment operator
+     * @returns incremented sequence number
      */
     SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE> operator++(int)
     {
@@ -135,8 +135,8 @@
     }
 
     /**
-     * \brief Prefix decrement operator
-     * \returns decremented sequence number
+     * @brief Prefix decrement operator
+     * @returns decremented sequence number
      */
     SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE> operator--()
     {
@@ -145,8 +145,8 @@
     }
 
     /**
-     * \brief Postfix decrement operator
-     * \returns decremented sequence number
+     * @brief Postfix decrement operator
+     * @returns decremented sequence number
      */
     SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE> operator--(int)
     {
@@ -156,9 +156,9 @@
     }
 
     /**
-     * \brief Plus equals operator
-     * \param value value to add to sequence number
-     * \returns incremented sequence number
+     * @brief Plus equals operator
+     * @param value value to add to sequence number
+     * @returns incremented sequence number
      */
     SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE>& operator+=(SIGNED_TYPE value)
     {
@@ -167,9 +167,9 @@
     }
 
     /**
-     * \brief Minus equals operator
-     * \param value value to subtract from sequence number
-     * \returns decremented sequence number
+     * @brief Minus equals operator
+     * @param value value to subtract from sequence number
+     * @returns decremented sequence number
      */
     SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE>& operator-=(SIGNED_TYPE value)
     {
@@ -178,9 +178,9 @@
     }
 
     /**
-     * \brief Operator defining addition of two sequence numbers
-     * \param other sequence number added to this
-     * \returns sequence number representing sum
+     * @brief Operator defining addition of two sequence numbers
+     * @param other sequence number added to this
+     * @returns sequence number representing sum
      */
     SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE> operator+(
         const SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE>& other) const
@@ -189,9 +189,9 @@
     }
 
     /**
-     * \brief Addition operator for adding numeric value to sequence number
-     * \param delta value to add to sequence number
-     * \returns sequence number representing sum
+     * @brief Addition operator for adding numeric value to sequence number
+     * @param delta value to add to sequence number
+     * @returns sequence number representing sum
      */
     SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE> operator+(SIGNED_TYPE delta) const
     {
@@ -199,9 +199,9 @@
     }
 
     /**
-     * \brief Subtraction operator for subtracting numeric value from sequence number
-     * \param delta value to subtract from sequence number
-     * \returns sequence number representing difference
+     * @brief Subtraction operator for subtracting numeric value from sequence number
+     * @param delta value to subtract from sequence number
+     * @returns sequence number representing difference
      */
     SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE> operator-(SIGNED_TYPE delta) const
     {
@@ -209,9 +209,9 @@
     }
 
     /**
-     * \brief Subtraction operator for subtracting sequence number from sequence number
-     * \param other sequence number to subtract from this sequence number
-     * \returns numeric value representing the difference
+     * @brief Subtraction operator for subtracting sequence number from sequence number
+     * @param other sequence number to subtract from this sequence number
+     * @returns numeric value representing the difference
      */
     SIGNED_TYPE operator-(const SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE>& other) const
     {
@@ -264,8 +264,8 @@
      *      S1 > S2 AND S1 - S2 <= MAXVALUE/2 OR
      *      S2 > S1 AND S2 - S1 > MAXVALUE/2
      *
-     * \param other sequence number to compare to this one
-     * \returns true if this sequence number is greater than other
+     * @param other sequence number to compare to this one
+     * @returns true if this sequence number is greater than other
      */
     bool operator>(const SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE>& other) const
     {
@@ -276,9 +276,9 @@
     }
 
     /**
-     * \brief Equality operator for comparing sequence number
-     * \param other sequence number to compare to this sequence number
-     * \returns true if the sequence numbers are equal
+     * @brief Equality operator for comparing sequence number
+     * @param other sequence number to compare to this sequence number
+     * @returns true if the sequence numbers are equal
      */
     bool operator==(const SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE>& other) const
     {
@@ -286,9 +286,9 @@
     }
 
     /**
-     * \brief Inequality operator for comparing sequence numbers
-     * \param other sequence number to compare to this sequence number
-     * \returns true if the sequence numbers are not equal
+     * @brief Inequality operator for comparing sequence numbers
+     * @param other sequence number to compare to this sequence number
+     * @returns true if the sequence numbers are not equal
      */
     bool operator!=(const SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE>& other) const
     {
@@ -296,9 +296,9 @@
     }
 
     /**
-     * \brief Less than or equal operator for comparing sequence numbers
-     * \param other sequence number to compare to this sequence number
-     * \returns true if this sequence number is less than or equal to other
+     * @brief Less than or equal operator for comparing sequence numbers
+     * @param other sequence number to compare to this sequence number
+     * @returns true if this sequence number is less than or equal to other
      */
     bool operator<=(const SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE>& other) const
     {
@@ -306,9 +306,9 @@
     }
 
     /**
-     * \brief Greater than or equal operator for comparing sequence numbers
-     * \param other sequence number to compare to this sequence number
-     * \returns true if this sequence number is greater than or equal to other
+     * @brief Greater than or equal operator for comparing sequence numbers
+     * @param other sequence number to compare to this sequence number
+     * @returns true if this sequence number is greater than or equal to other
      */
     bool operator>=(const SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE>& other) const
     {
@@ -316,9 +316,9 @@
     }
 
     /**
-     * \brief Less than operator for comparing sequence numbers
-     * \param other sequence number to compare to this sequence number
-     * \returns true if this sequence number is less than other
+     * @brief Less than operator for comparing sequence numbers
+     * @param other sequence number to compare to this sequence number
+     * @returns true if this sequence number is less than other
      */
     bool operator<(const SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE>& other) const
     {
@@ -326,20 +326,20 @@
     }
 
     /**
-     * \brief For printing sequence number
-     * \param os output stream
-     * \param val sequence number to display
-     * \returns output stream os
+     * @brief For printing sequence number
+     * @param os output stream
+     * @param val sequence number to display
+     * @returns output stream os
      */
     template <typename NUMERIC_TYPE2, typename SIGNED_TYPE2>
     friend std::ostream& operator<<(std::ostream& os,
                                     const SequenceNumber<NUMERIC_TYPE2, SIGNED_TYPE2>& val);
 
     /**
-     * \brief For loading sequence number from input streams
-     * \param is input stream
-     * \param val sequence number to load
-     * \returns input stream is
+     * @brief For loading sequence number from input streams
+     * @param is input stream
+     * @param val sequence number to load
+     * @returns input stream is
      */
     template <typename NUMERIC_TYPE2, typename SIGNED_TYPE2>
     friend std::istream& operator>>(std::istream& is,
@@ -379,11 +379,11 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the stream
- * \param val the value
- * \returns a reference to the stream
+ * @param os the stream
+ * @param val the value
+ * @returns a reference to the stream
  */
 template <typename NUMERIC_TYPE, typename SIGNED_TYPE>
 std::ostream&
@@ -394,11 +394,11 @@
 }
 
 /**
- * \brief Stream extraction operator.
+ * @brief Stream extraction operator.
  *
- * \param is the stream
- * \param val the value
- * \returns a reference to the stream
+ * @param is the stream
+ * @param val the value
+ * @returns a reference to the stream
  */
 template <typename NUMERIC_TYPE, typename SIGNED_TYPE>
 std::istream&
@@ -409,17 +409,17 @@
 }
 
 /**
- * \ingroup seq-counters
+ * @ingroup seq-counters
  * 32 bit Sequence number.
  */
 typedef SequenceNumber<uint32_t, int32_t> SequenceNumber32;
 /**
- * \ingroup seq-counters
+ * @ingroup seq-counters
  * 16 bit Sequence number.
  */
 typedef SequenceNumber<uint16_t, int16_t> SequenceNumber16;
 /**
- * \ingroup seq-counters
+ * @ingroup seq-counters
  * 8 bit Sequence number.
  */
 typedef SequenceNumber<uint8_t, int8_t> SequenceNumber8;
@@ -428,21 +428,21 @@
 {
 
 /**
- * \ingroup seq-counters
+ * @ingroup seq-counters
  * TracedValue callback signature for SequenceNumber32
  *
- * \param [in] oldValue original value of the traced variable
- * \param [in] newValue new value of the traced variable
+ * @param [in] oldValue original value of the traced variable
+ * @param [in] newValue new value of the traced variable
  */
 typedef void (*SequenceNumber32)(SequenceNumber32 oldValue, SequenceNumber32 newValue);
 
 } // namespace TracedValueCallback
 
 /**
- * \ingroup seq-counters
+ * @ingroup seq-counters
  *
  * ns3::TypeNameGet<SequenceNumber32>() specialization.
- * \returns The type name as a string.
+ * @returns The type name as a string.
  */
 TYPENAMEGET_DEFINE(SequenceNumber32);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/simple-channel.h ns-3.44/src/network/utils/simple-channel.h
--- ns-3.43/src/network/utils/simple-channel.h	2024-10-09 16:41:10.076656600 -0700
+++ ns-3.44/src/network/utils/simple-channel.h	2025-03-09 16:55:49.679372300 -0700
@@ -23,8 +23,8 @@
 class Packet;
 
 /**
- * \ingroup channel
- * \brief A simple channel, for simple things and testing.
+ * @ingroup channel
+ * @brief A simple channel, for simple things and testing.
  *
  * This channel doesn't check for packet collisions and it
  * does not introduce any error.
@@ -38,8 +38,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     SimpleChannel();
@@ -49,11 +49,11 @@
      * scheduled for all net device connected to the channel other
      * than the net device who sent the packet
      *
-     * \param p packet to be sent
-     * \param protocol protocol number
-     * \param to address to send packet to
-     * \param from address the packet is coming from
-     * \param sender netdevice who sent the packet
+     * @param p packet to be sent
+     * @param protocol protocol number
+     * @param to address to send packet to
+     * @param from address the packet is coming from
+     * @param sender netdevice who sent the packet
      *
      */
     virtual void Send(Ptr<Packet> p,
@@ -65,7 +65,7 @@
     /**
      * Attached a net device to the channel.
      *
-     * \param device the device to attach to the channel
+     * @param device the device to attach to the channel
      */
     virtual void Add(Ptr<SimpleNetDevice> device);
 
@@ -73,8 +73,8 @@
      * Blocks the communications from a NetDevice to another NetDevice.
      * The block is unidirectional
      *
-     * \param from the device to BlackList
-     * \param to the device wanting to block the other one
+     * @param from the device to BlackList
+     * @param to the device wanting to block the other one
      */
     virtual void BlackList(Ptr<SimpleNetDevice> from, Ptr<SimpleNetDevice> to);
 
@@ -82,8 +82,8 @@
      * Un-Blocks the communications from a NetDevice to another NetDevice.
      * The block is unidirectional
      *
-     * \param from the device to BlackList
-     * \param to the device wanting to block the other one
+     * @param from the device to BlackList
+     * @param to the device wanting to block the other one
      */
     virtual void UnBlackList(Ptr<SimpleNetDevice> from, Ptr<SimpleNetDevice> to);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/simple-net-device.cc ns-3.44/src/network/utils/simple-net-device.cc
--- ns-3.43/src/network/utils/simple-net-device.cc	2024-10-09 16:41:10.076656600 -0700
+++ ns-3.44/src/network/utils/simple-net-device.cc	2025-03-09 16:55:49.679372300 -0700
@@ -27,14 +27,14 @@
 NS_LOG_COMPONENT_DEFINE("SimpleNetDevice");
 
 /**
- * \brief SimpleNetDevice tag to store source, destination and protocol of each packet.
+ * @brief SimpleNetDevice tag to store source, destination and protocol of each packet.
  */
 class SimpleTag : public Tag
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -45,34 +45,34 @@
 
     /**
      * Set the source address
-     * \param src source address
+     * @param src source address
      */
     void SetSrc(Mac48Address src);
     /**
      * Get the source address
-     * \return the source address
+     * @return the source address
      */
     Mac48Address GetSrc() const;
 
     /**
      * Set the destination address
-     * \param dst destination address
+     * @param dst destination address
      */
     void SetDst(Mac48Address dst);
     /**
      * Get the destination address
-     * \return the destination address
+     * @return the destination address
      */
     Mac48Address GetDst() const;
 
     /**
      * Set the protocol number
-     * \param proto protocol number
+     * @param proto protocol number
      */
     void SetProto(uint16_t proto);
     /**
      * Get the protocol number
-     * \return the protocol number
+     * @return the protocol number
      */
     uint16_t GetProto() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/simple-net-device.h ns-3.44/src/network/utils/simple-net-device.h
--- ns-3.43/src/network/utils/simple-net-device.h	2024-10-09 16:41:10.076656600 -0700
+++ ns-3.44/src/network/utils/simple-net-device.h	2025-03-09 16:55:49.679372300 -0700
@@ -27,7 +27,7 @@
 class ErrorModel;
 
 /**
- * \ingroup netdevice
+ * @ingroup netdevice
  *
  * This device assumes 48-bit mac addressing; there is also the possibility to
  * add an ErrorModel if you want to force losses on the device.
@@ -38,14 +38,14 @@
  *
  * By default the device is in Broadcast mode, with infinite bandwidth.
  *
- * \brief simple net device for simple things and testing
+ * @brief simple net device for simple things and testing
  */
 class SimpleNetDevice : public NetDevice
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     SimpleNetDevice();
@@ -55,10 +55,10 @@
      * SimpleNetDevice receives packets from its connected channel
      * and then forwards them by calling its rx callback method
      *
-     * \param packet Packet received on the channel
-     * \param protocol protocol number
-     * \param to address packet should be sent to
-     * \param from address packet was sent from
+     * @param packet Packet received on the channel
+     * @param protocol protocol number
+     * @param to address packet should be sent to
+     * @param from address packet was sent from
      */
     void Receive(Ptr<Packet> packet, uint16_t protocol, Mac48Address to, Mac48Address from);
 
@@ -66,7 +66,7 @@
      * Attach a channel to this net device.  This will be the
      * channel the net device sends on
      *
-     * \param channel channel to assign to this net device
+     * @param channel channel to assign to this net device
      *
      */
     void SetChannel(Ptr<SimpleChannel> channel);
@@ -74,14 +74,14 @@
     /**
      * Attach a queue to the SimpleNetDevice.
      *
-     * \param queue Ptr to the new queue.
+     * @param queue Ptr to the new queue.
      */
     void SetQueue(Ptr<Queue<Packet>> queue);
 
     /**
      * Get a copy of the attached Queue.
      *
-     * \returns Ptr to the queue.
+     * @returns Ptr to the queue.
      */
     Ptr<Queue<Packet>> GetQueue() const;
 
@@ -91,8 +91,8 @@
      * The SimpleNetDevice may optionally include an ErrorModel in
      * the packet receive chain.
      *
-     * \see ErrorModel
-     * \param em Ptr to the ErrorModel.
+     * @see ErrorModel
+     * @param em Ptr to the ErrorModel.
      */
     void SetReceiveErrorModel(Ptr<ErrorModel> em);
 
@@ -146,7 +146,7 @@
      * really have a Phy model, we choose this trace source name for alignment
      * with other trace sources.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_phyRxDropTrace;
 
@@ -161,7 +161,7 @@
     /**
      * The FinishTransmission method is used internally to finish the process
      * of sending a packet out on the channel.
-     * \param packet The packet to send on the channel
+     * @param packet The packet to send on the channel
      */
     void FinishTransmission(Ptr<Packet> packet);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/sll-header.h ns-3.44/src/network/utils/sll-header.h
--- ns-3.43/src/network/utils/sll-header.h	2024-10-09 16:41:10.076656600 -0700
+++ ns-3.44/src/network/utils/sll-header.h	2025-03-09 16:55:49.679372300 -0700
@@ -17,16 +17,16 @@
 {
 
 /**
-  * \ingroup packet
+  * @ingroup packet
   *
-  * \brief Protocol header serialization and deserialization.
+  * @brief Protocol header serialization and deserialization.
   *
   * Libpcap sometimes add an additional header to provide information that would be
   * lost otherwise due to the link-layer/capture mechanism, for instance when capturing from
   * "nlmon" device on linux
   *
-  * \see http://www.tcpdump.org/linktypes/LINKTYPE_LINUX_SLL.html
-  * \see https://wiki.wireshark.org/SLL
+  * @see http://www.tcpdump.org/linktypes/LINKTYPE_LINUX_SLL.html
+  * @see https://wiki.wireshark.org/SLL
   *
   \verbatim
     +---------------------------+
@@ -67,8 +67,8 @@
     };
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -76,24 +76,24 @@
     ~SllHeader() override;
 
     /**
-     * \return ARP header type field in network byte order
+     * @return ARP header type field in network byte order
      *  The ARPHRD_ type field is in network byte order; it contains a Linux ARPHRD_ value for the
      * link-layer device type.
      */
     uint16_t GetArpType() const;
 
     /**
-     * \param arphdType ARP protocol hardware identifier
+     * @param arphdType ARP protocol hardware identifier
      */
     void SetArpType(uint16_t arphdType);
 
     /**
-     * \return Packet type
+     * @return Packet type
      */
     PacketType GetPacketType() const;
 
     /**
-     * \param type Depends on source and address of the packet
+     * @param type Depends on source and address of the packet
      */
     void SetPacketType(PacketType type);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/network/utils/timestamp-tag.h ns-3.44/src/network/utils/timestamp-tag.h
--- ns-3.43/src/network/utils/timestamp-tag.h	2024-10-09 16:41:10.076656600 -0700
+++ ns-3.44/src/network/utils/timestamp-tag.h	2025-03-09 16:55:49.679372300 -0700
@@ -28,20 +28,20 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
 
     /**
-     * \brief Construct a new TimestampTag object
+     * @brief Construct a new TimestampTag object
      */
     TimestampTag();
 
     /**
-     * \brief Construct a new TimestampTag object with the given timestamp
-     * \param timestamp The timestamp
+     * @brief Construct a new TimestampTag object with the given timestamp
+     * @param timestamp The timestamp
      */
     TimestampTag(Time timestamp);
 
@@ -51,14 +51,14 @@
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Get the Timestamp object
-     * \return Time for this tag
+     * @brief Get the Timestamp object
+     * @return Time for this tag
      */
     Time GetTimestamp() const;
 
     /**
-     * \brief Set the Timestamp object
-     * \param timestamp Timestamp to assign to tag
+     * @brief Set the Timestamp object
+     * @param timestamp Timestamp to assign to tag
      */
     void SetTimestamp(Time timestamp);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/nix-vector-routing/examples/nix-double-wifi.cc ns-3.44/src/nix-vector-routing/examples/nix-double-wifi.cc
--- ns-3.43/src/nix-vector-routing/examples/nix-double-wifi.cc	2024-10-09 16:41:10.076656600 -0700
+++ ns-3.44/src/nix-vector-routing/examples/nix-double-wifi.cc	2025-03-09 16:55:49.679372300 -0700
@@ -25,7 +25,7 @@
  * two Wifi networks on the same channel.
  *
  * IPv4 Network Topology
- * \verbatim
+ * @verbatim
     Wifi 10.1.1.0/24
                    AP
     *    *    *    *
@@ -37,7 +37,7 @@
                                       Wifi 10.1.3.0/24
    \endverbatim
  *
- * \verbatim
+ * @verbatim
     Wifi 2001:1::/64
                    AP
     *    *    *    *
@@ -51,7 +51,7 @@
  *
  * Expected Outputs:
  * IPv4:
- * \verbatim
+ * @verbatim
    Time: +7s, Nix Routing
    Route path from Node 4 to Node 7, Nix Vector: 100011 (6 bits left)
    10.1.1.3                 (Node 4)  ---->   10.1.1.4                 (Node 0)
@@ -60,7 +60,7 @@
    \endverbatim
  *
  * IPv6:
- * \verbatim
+ * @verbatim
    Time: +7s, Nix Routing
    Route path from Node 4 to Node 7, Nix Vector: 100011 (6 bits left)
    2001:1::200:ff:fe00:5    (Node 4)  ---->   fe80::200:ff:fe00:6      (Node 0)
@@ -238,19 +238,19 @@
     UdpEchoServerHelper echoServer(9);
 
     ApplicationContainer serverApps = echoServer.Install(wifiStaNodes2.Get(2));
-    serverApps.Start(Seconds(1.0));
-    serverApps.Stop(Seconds(10.0));
+    serverApps.Start(Seconds(1));
+    serverApps.Stop(Seconds(10));
 
     UdpEchoClientHelper echoClient(udpServerAddress, 9);
     echoClient.SetAttribute("MaxPackets", UintegerValue(1));
-    echoClient.SetAttribute("Interval", TimeValue(Seconds(1.0)));
+    echoClient.SetAttribute("Interval", TimeValue(Seconds(1)));
     echoClient.SetAttribute("PacketSize", UintegerValue(1024));
 
     ApplicationContainer clientApps = echoClient.Install(wifiStaNodes1.Get(2));
-    clientApps.Start(Seconds(2.0));
-    clientApps.Stop(Seconds(10.0));
+    clientApps.Start(Seconds(2));
+    clientApps.Stop(Seconds(10));
 
-    Simulator::Stop(Seconds(10.0));
+    Simulator::Stop(Seconds(10));
 
     Simulator::Run();
     Simulator::Destroy();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/nix-vector-routing/examples/nix-simple.cc ns-3.44/src/nix-vector-routing/examples/nix-simple.cc
--- ns-3.43/src/nix-vector-routing/examples/nix-simple.cc	2024-10-09 16:41:10.076656600 -0700
+++ ns-3.44/src/nix-vector-routing/examples/nix-simple.cc	2025-03-09 16:55:49.679372300 -0700
@@ -25,7 +25,7 @@
  * 2) Print Routing Path, given source and destination.
  *
  * Simple point to point links:
- * \verbatim
+ * @verbatim
        ________
       /        \
     n0 -- n1 -- n2 -- n3
@@ -69,7 +69,7 @@
  *
  * Expected IPv4 Routing Path output for above
  * cases (in the output stream):
- * \verbatim
+ * @verbatim
   Time: +3s, Nix Routing
   Route path from Node 0 to Node 3, Nix Vector: 101 (3 bits left)
   10.1.4.1                 (Node 0)  ---->   10.1.4.2                 (Node 2)
@@ -117,7 +117,7 @@
  *
  * Expected IPv6 Routing Path output for above
  * cases (in the output stream):
- * \verbatim
+ * @verbatim
   Time: +3s, Nix Routing
   Route path from Node 0 to Node 3, Nix Vector: 101 (3 bits left)
   2001:4::200:ff:fe00:7    (Node 0)  ---->   fe80::200:ff:fe00:8      (Node 2)
@@ -297,8 +297,8 @@
     UdpEchoServerHelper echoServer(9);
 
     ApplicationContainer serverApps = echoServer.Install(nodes.Get(3));
-    serverApps.Start(Seconds(1.0));
-    serverApps.Stop(Seconds(10.0));
+    serverApps.Start(Seconds(1));
+    serverApps.Stop(Seconds(10));
 
     UdpEchoClientHelper echoClient(udpServerAddress, 9);
     echoClient.SetAttribute("MaxPackets", UintegerValue(1));
@@ -306,8 +306,8 @@
     echoClient.SetAttribute("PacketSize", UintegerValue(1024));
 
     ApplicationContainer clientApps = echoClient.Install(nodes.Get(0));
-    clientApps.Start(Seconds(2.0));
-    clientApps.Stop(Seconds(10.0));
+    clientApps.Start(Seconds(2));
+    clientApps.Stop(Seconds(10));
 
     Simulator::Run();
     Simulator::Destroy();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/nix-vector-routing/examples/nix-simple-multi-address.cc ns-3.44/src/nix-vector-routing/examples/nix-simple-multi-address.cc
--- ns-3.43/src/nix-vector-routing/examples/nix-simple-multi-address.cc	2024-10-09 16:41:10.076656600 -0700
+++ ns-3.44/src/nix-vector-routing/examples/nix-simple-multi-address.cc	2025-03-09 16:55:49.679372300 -0700
@@ -22,7 +22,7 @@
  * addresses.
  *
  * Simple point-to-point links:
- * \verbatim
+ * @verbatim
     n0 -- n1 -- n2 -- n3
 
     From t = 0s onwards,
@@ -51,7 +51,7 @@
  *  - At t = +7s, Path from n0 to n3 (10.2.3.2).
  *
  * Logging output:
- * \verbatim
+ * @verbatim
    At time +2s client sent 1024 bytes to 10.1.3.2 port 9
    At time +2.01106s server received 1024 bytes from 10.1.1.1 port 49153
    At time +2.01106s server sent 1024 bytes to 10.1.1.1 port 49153
@@ -59,7 +59,7 @@
   \endverbatim
  *
  * Output in nix-simple-multi-address.routes:
- * \verbatim
+ * @verbatim
   Time: +3s, Nix Routing
   Route path from Node 0 to Node 1, Nix Vector: 0 (1 bits left)
   10.2.1.1                 (Node 0)  ---->   10.2.1.2                 (Node 1)
@@ -181,8 +181,8 @@
     UdpEchoServerHelper echoServer(9);
 
     ApplicationContainer serverApps = echoServer.Install(nodes34.Get(1));
-    serverApps.Start(Seconds(1.0));
-    serverApps.Stop(Seconds(10.0));
+    serverApps.Start(Seconds(1));
+    serverApps.Stop(Seconds(10));
 
     // Set the destination address as 10.1.3.2
     UdpEchoClientHelper echoClient(interfaces34.GetAddress(1), 9);
@@ -191,8 +191,8 @@
     echoClient.SetAttribute("PacketSize", UintegerValue(1024));
 
     ApplicationContainer clientApps = echoClient.Install(nodes12.Get(0));
-    clientApps.Start(Seconds(2.0));
-    clientApps.Stop(Seconds(10.0));
+    clientApps.Start(Seconds(2));
+    clientApps.Stop(Seconds(10));
 
     // Trace routing paths for different source and destinations.
     Ptr<OutputStreamWrapper> routingStream =
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/nix-vector-routing/examples/nms-p2p-nix.cc ns-3.44/src/nix-vector-routing/examples/nms-p2p-nix.cc
--- ns-3.43/src/nix-vector-routing/examples/nms-p2p-nix.cc	2024-10-09 16:41:10.076656600 -0700
+++ ns-3.44/src/nix-vector-routing/examples/nms-p2p-nix.cc	2025-03-09 16:55:49.679372300 -0700
@@ -50,7 +50,7 @@
 }
 
 /**
- * \ingroup nix-vector-routing
+ * @ingroup nix-vector-routing
  * 2D array used in nix-vector-routing example "nms-p2p-nix.cc"
  */
 template <typename T>
@@ -59,8 +59,8 @@
   public:
     /**
      * Constructor
-     * \param x number of rows
-     * \param y number of columns
+     * @param x number of rows
+     * @param y number of columns
      */
     Array2D(const size_t x, const size_t y)
         : p(new T*[x]),
@@ -84,8 +84,8 @@
 
     /**
      * Accessor operator
-     * \param i index to be retrieved
-     * \return a pointer to the indexed element
+     * @param i index to be retrieved
+     * @return a pointer to the indexed element
      */
     T* operator[](const size_t i)
     {
@@ -98,7 +98,7 @@
 };
 
 /**
- * \ingroup nix-vector-routing
+ * @ingroup nix-vector-routing
  * 3D array used in nix-vector-routing example "nms-p2p-nix.cc"
  */
 template <typename T>
@@ -107,9 +107,9 @@
   public:
     /**
      * Constructor
-     * \param x number of rows
-     * \param y number of columns
-     * \param z number of layers
+     * @param x number of rows
+     * @param y number of columns
+     * @param z number of layers
      */
     Array3D(const size_t x, const size_t y, const size_t z)
         : p(new Array2D<T>*[x]),
@@ -134,8 +134,8 @@
 
     /**
      * Accessor operator
-     * \param i index to be retrieved
-     * \return a reference to an Array2D of the indexed element
+     * @param i index to be retrieved
+     * @return a reference to an Array2D of the indexed element
      */
     Array2D<T>& operator[](const size_t i)
     {
@@ -657,7 +657,7 @@
                 // Sinks
                 PacketSinkHelper sinkHelper("ns3::TcpSocketFactory", sinkAddress);
                 ApplicationContainer sinkApp = sinkHelper.Install(nodes_net2LAN[z][i][j].Get(0));
-                sinkApp.Start(Seconds(0.0));
+                sinkApp.Start(Seconds(0));
                 // Sources
                 r1 = 2 + (int)(4 * urng->GetValue());
                 r2 = 10 * urng->GetValue();
@@ -678,7 +678,7 @@
                 // Sinks
                 PacketSinkHelper sinkHelper("ns3::TcpSocketFactory", sinkAddress);
                 ApplicationContainer sinkApp = sinkHelper.Install(nodes_net3LAN[z][i][j].Get(0));
-                sinkApp.Start(Seconds(0.0));
+                sinkApp.Start(Seconds(0));
                 // Sources
                 r1 = 2 + (int)(4 * urng->GetValue());
                 r2 = 10 * urng->GetValue();
@@ -716,7 +716,7 @@
     Simulator::ScheduleNow(Progress);
     std::cout << "Running simulator..." << std::endl;
     auto t1 = std::chrono::steady_clock::now();
-    Simulator::Stop(Seconds(100.0));
+    Simulator::Stop(Seconds(100));
     Simulator::Run();
     auto t2 = std::chrono::steady_clock::now();
     std::cout << "Simulator finished." << std::endl;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/nix-vector-routing/helper/nix-vector-helper.h ns-3.44/src/nix-vector-routing/helper/nix-vector-helper.h
--- ns-3.43/src/nix-vector-routing/helper/nix-vector-helper.h	2024-10-09 16:41:10.076656600 -0700
+++ ns-3.44/src/nix-vector-routing/helper/nix-vector-helper.h	2025-03-09 16:55:49.679372300 -0700
@@ -22,14 +22,14 @@
 {
 
 /**
- * \ingroup nix-vector-routing
+ * @ingroup nix-vector-routing
  *
- * \brief Helper class that adds Nix-vector routing to nodes.
+ * @brief Helper class that adds Nix-vector routing to nodes.
  *
  * This class is expected to be used in conjunction with
  * ns3::InternetStackHelper::SetRoutingHelper
  *
- * \internal
+ * @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.
@@ -58,10 +58,10 @@
     NixVectorHelper();
 
     /**
-     * \brief Construct an NixVectorHelper from another previously
+     * @brief Construct an NixVectorHelper from another previously
      * initialized instance (Copy Constructor).
      *
-     * \param o object to copy
+     * @param o object to copy
      */
     NixVectorHelper(const NixVectorHelper<T>& o);
 
@@ -69,7 +69,7 @@
     NixVectorHelper& operator=(const NixVectorHelper&) = delete;
 
     /**
-     * \returns pointer to clone of this NixVectorHelper
+     * @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
@@ -77,22 +77,22 @@
     NixVectorHelper<T>* Copy() const override;
 
     /**
-     * \param node the node on which the routing protocol will run
-     * \returns a newly-created routing protocol
+     * @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
      */
     Ptr<IpRoutingProtocol> Create(Ptr<Node> node) const override;
 
     /**
-     * \brief prints the routing path for a source and destination at a particular time.
+     * @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
+     * @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
@@ -108,12 +108,12 @@
     ObjectFactory m_agentFactory; //!< Object factory
 
     /**
-     * \brief prints the routing path for the source and destination. If the routing path
+     * @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
+     * @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
@@ -126,7 +126,7 @@
 };
 
 /**
- * \ingroup nix-vector-routing
+ * @ingroup nix-vector-routing
  * Create the typedef Ipv4NixVectorHelper with T as Ipv4RoutingHelper
  *
  * Note: This typedef enables also backwards compatibility with original Ipv4RoutingHelper.
@@ -134,7 +134,7 @@
 typedef NixVectorHelper<Ipv4RoutingHelper> Ipv4NixVectorHelper;
 
 /**
- * \ingroup nix-vector-routing
+ * @ingroup nix-vector-routing
  * Create the typedef Ipv6NixVectorHelper with T as Ipv6RoutingHelper
  */
 typedef NixVectorHelper<Ipv6RoutingHelper> Ipv6NixVectorHelper;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/nix-vector-routing/model/nix-vector-routing.cc ns-3.44/src/nix-vector-routing/model/nix-vector-routing.cc
--- ns-3.43/src/nix-vector-routing/model/nix-vector-routing.cc	2024-10-09 16:41:10.076656600 -0700
+++ ns-3.44/src/nix-vector-routing/model/nix-vector-routing.cc	2025-03-09 16:55:49.679372300 -0700
@@ -195,7 +195,7 @@
     }
 
     // if source == dest, then we have a special case
-    /// \internal
+    /// @internal
     /// Do not process packets to self (see \bugid{1308})
     if (source == destNode)
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/nix-vector-routing/model/nix-vector-routing.h ns-3.44/src/nix-vector-routing/model/nix-vector-routing.h
--- ns-3.43/src/nix-vector-routing/model/nix-vector-routing.h	2024-10-09 16:41:10.076656600 -0700
+++ ns-3.44/src/nix-vector-routing/model/nix-vector-routing.h	2025-03-09 16:55:49.683372300 -0700
@@ -39,17 +39,17 @@
 {
 
 /**
- * \defgroup nix-vector-routing Nix-Vector Routing
+ * @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
+ * @ingroup nix-vector-routing
  * Nix-vector routing protocol
  *
- * \internal
+ * @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.
@@ -109,7 +109,7 @@
      * which iterates through the node list and flushes any
      * nix vector caches
      *
-     * \internal
+     * @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.
@@ -118,12 +118,12 @@
 
     /**
      * @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
+     * @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
+     * @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,
@@ -156,34 +156,34 @@
      * 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.
+     * @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.
+     * @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.
+     * @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.
+     * @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,
@@ -192,26 +192,26 @@
     /**
      * 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.
+     * @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.
+     * @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.
+     * @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,
@@ -221,38 +221,38 @@
     /**
      * 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.
+     * @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)
+     * @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.
+     * @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.
+     * @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,
@@ -314,15 +314,15 @@
 
     /* 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.
+     * @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
+     * @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
+     * @param sockerr Output parameter; socket errno
      *
-     * \returns a code that indicates what happened in the lookup
+     * @returns a code that indicates what happened in the lookup
      *
      * \sa Ipv4RoutingProtocol::RouteOutput
      * \sa Ipv6RoutingProtocol::RouteOutput
@@ -333,19 +333,19 @@
                                      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
+     * @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
+     * @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
+     * @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
+     * @param ecb Callback to call if there is an error in forwarding
      *
-     * \returns true if NixVectorRouting class takes responsibility for
+     * @returns true if NixVectorRouting class takes responsibility for
      *          forwarding or delivering the packet, false otherwise
      *
      * \sa Ipv4RoutingProtocol::RouteInput
@@ -360,7 +360,7 @@
                             const ErrorCallback& ecb);
 
     /**
-     * \param interface the index of the interface we are being notified about
+     * @param interface the index of the interface we are being notified about
      *
      * \sa Ipv4RoutingProtocol::NotifyInterfaceUp
      * \sa Ipv6RoutingProtocol::NotifyInterfaceUp
@@ -368,7 +368,7 @@
     virtual void NotifyInterfaceUp(uint32_t interface);
 
     /**
-     * \param interface the index of the interface we are being notified about
+     * @param interface the index of the interface we are being notified about
      *
      * \sa Ipv4RoutingProtocol::NotifyInterfaceDown
      * \sa Ipv6RoutingProtocol::NotifyInterfaceDown
@@ -376,8 +376,8 @@
     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
+     * @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
@@ -385,8 +385,8 @@
     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
+     * @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
@@ -394,10 +394,10 @@
     virtual void NotifyRemoveAddress(uint32_t interface, IpInterfaceAddress address);
 
     /**
-     * \brief Print the Routing Table entries
+     * @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
+     * @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
@@ -407,9 +407,9 @@
 
     /* From IPv4RoutingProtocol */
     /**
-     * \brief Typically, invoked directly or indirectly from ns3::Ipv4::SetRoutingProtocol
+     * @brief Typically, invoked directly or indirectly from ns3::Ipv4::SetRoutingProtocol
      *
-     * \param ipv4 the ipv4 object this routing protocol is being associated with
+     * @param ipv4 the ipv4 object this routing protocol is being associated with
      *
      * \sa Ipv4RoutingProtocol::SetIpv4
      */
@@ -417,22 +417,22 @@
 
     /* From IPv6RoutingProtocol */
     /**
-     * \brief Typically, invoked directly or indirectly from ns3::Ipv6::SetRoutingProtocol
+     * @brief Typically, invoked directly or indirectly from ns3::Ipv6::SetRoutingProtocol
      *
-     * \param ipv6 the ipv6 object this routing protocol is being associated with
+     * @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.
+     * @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
+     * @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
      */
@@ -443,13 +443,13 @@
                                 IpAddress prefixToUse = IpAddress::GetZero());
 
     /**
-     * \brief Notify route removing.
+     * @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
+     * @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
      */
@@ -509,7 +509,7 @@
 };
 
 /**
- * \ingroup nix-vector-routing
+ * @ingroup nix-vector-routing
  * Create the typedef Ipv4NixVectorRouting with T as Ipv4RoutingProtocol
  *
  * Note: This typedef enables also backwards compatibility with original Ipv4NixVectorRouting.
@@ -517,7 +517,7 @@
 typedef NixVectorRouting<Ipv4RoutingProtocol> Ipv4NixVectorRouting;
 
 /**
- * \ingroup nix-vector-routing
+ * @ingroup nix-vector-routing
  * Create the typedef Ipv6NixVectorRouting with T as Ipv6RoutingProtocol
  */
 typedef NixVectorRouting<Ipv6RoutingProtocol> Ipv6NixVectorRouting;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/nix-vector-routing/test/nix-test.cc ns-3.44/src/nix-vector-routing/test/nix-test.cc
--- ns-3.43/src/nix-vector-routing/test/nix-test.cc	2024-10-09 16:41:10.076656600 -0700
+++ ns-3.44/src/nix-vector-routing/test/nix-test.cc	2025-03-09 16:55:49.683372300 -0700
@@ -25,15 +25,15 @@
 using namespace ns3;
 
 /**
- * \defgroup nix-vector-routing-test Nix-Vector Routing Tests
+ * @defgroup nix-vector-routing-test Nix-Vector Routing Tests
  */
 
 /**
- * \ingroup nix-vector-routing-test
- * \ingroup tests
+ * @ingroup nix-vector-routing-test
+ * @ingroup tests
  *
  * The topology is of the form:
- * \verbatim
+ * @verbatim
               __________
              /          \
     nSrc -- nA -- nB -- nC -- nDst
@@ -49,39 +49,39 @@
  * (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
+ * @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.
+     * @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.
+     * @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.
+     * @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.
+     * @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);
 
@@ -90,8 +90,8 @@
     NixVectorRoutingTest();
 
     /**
-     * \brief Receive data.
-     * \param socket The receiving socket.
+     * @brief Receive data.
+     * @param socket The receiving socket.
      */
     void ReceivePkt(Ptr<Socket> socket);
 
@@ -383,10 +383,10 @@
 }
 
 /**
- * \ingroup nix-vector-routing-test
- * \ingroup tests
+ * @ingroup nix-vector-routing-test
+ * @ingroup tests
  *
- * \brief IPv4 Nix-Vector Routing TestSuite
+ * @brief IPv4 Nix-Vector Routing TestSuite
  */
 class NixVectorRoutingTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/olsr/doc/olsr.rst ns-3.44/src/olsr/doc/olsr.rst
--- ns-3.43/src/olsr/doc/olsr.rst	2024-10-09 16:41:10.076656600 -0700
+++ ns-3.44/src/olsr/doc/olsr.rst	2025-03-09 16:55:49.683372300 -0700
@@ -77,8 +77,8 @@
 interface index. The loopback address of 127.0.0.1 is not selected. In addition,
 a number of protocol constants are defined in olsr-routing-protocol.cc.
 
-Olsr is started at time zero of the simulation, based on a call to
-Object::Start() that eventually calls OlsrRoutingProtocol::DoStart(). Note:  a
+Olsr is automatically started at time zero of the simulation, based on the ns-3 Node initialization sequence that eventually leads to
+``olsr::RoutingProtocol::DoInitialize()``. Note:  a
 patch to allow the user to start and stop the protocol at other times would be
 welcome.
 
@@ -88,7 +88,7 @@
 The examples are in the ``src/olsr/examples/`` directory. However, many other examples exists in the
 general examples directory, e.g., ``examples/routing/manet-routing-compare.cc``.
 
-For specific examples of the HNA feature, see the examples in ``src/olsr/examples/``.
+For a specific example of the HNA feature, see the program ``src/olsr/examples/olsr-hna.cc``.
 
 Helpers
 +++++++
@@ -139,4 +139,4 @@
 Validation
 **********
 
-The code validationhas been done through Wireshark message compliance and unit testings.
+The code validation has been done through Wireshark message compliance and unit testings.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/olsr/examples/olsr-hna.cc ns-3.44/src/olsr/examples/olsr-hna.cc
--- ns-3.43/src/olsr/examples/olsr-hna.cc	2024-10-09 16:41:10.076656600 -0700
+++ ns-3.44/src/olsr/examples/olsr-hna.cc	2025-03-09 16:55:49.683372300 -0700
@@ -273,7 +273,7 @@
     csma.EnableAsciiAll(ascii.CreateFileStream("olsr-hna-csma.tr"));
 
     Simulator::ScheduleWithContext(source->GetNode()->GetId(),
-                                   Seconds(15.0),
+                                   Seconds(15),
                                    &GenerateTraffic,
                                    source,
                                    packetSize,
@@ -284,7 +284,7 @@
         Create<OutputStreamWrapper>("olsr-hna.routes", std::ios::out);
     Ipv4RoutingHelper::PrintRoutingTableAllAt(Seconds(15), routingStream);
 
-    Simulator::Stop(Seconds(20.0));
+    Simulator::Stop(Seconds(20));
     Simulator::Run();
     Simulator::Destroy();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/olsr/examples/simple-point-to-point-olsr.cc ns-3.44/src/olsr/examples/simple-point-to-point-olsr.cc
--- ns-3.43/src/olsr/examples/simple-point-to-point-olsr.cc	2024-10-09 16:41:10.076656600 -0700
+++ ns-3.44/src/olsr/examples/simple-point-to-point-olsr.cc	2025-03-09 16:55:49.683372300 -0700
@@ -122,8 +122,8 @@
     onoff1.SetConstantRate(DataRate("448kb/s"));
 
     ApplicationContainer onOffApp1 = onoff1.Install(c.Get(0));
-    onOffApp1.Start(Seconds(10.0));
-    onOffApp1.Stop(Seconds(20.0));
+    onOffApp1.Start(Seconds(10));
+    onOffApp1.Stop(Seconds(20));
 
     // Create a similar flow from n3 to n1, starting at time 1.1 seconds
     OnOffHelper onoff2("ns3::UdpSocketFactory", InetSocketAddress(i12.GetAddress(0), port));
@@ -131,14 +131,14 @@
 
     ApplicationContainer onOffApp2 = onoff2.Install(c.Get(3));
     onOffApp2.Start(Seconds(10.1));
-    onOffApp2.Stop(Seconds(20.0));
+    onOffApp2.Stop(Seconds(20));
 
     // Create packet sinks to receive these packets
     PacketSinkHelper sink("ns3::UdpSocketFactory", InetSocketAddress(Ipv4Address::GetAny(), port));
     NodeContainer sinks = NodeContainer(c.Get(4), c.Get(1));
     ApplicationContainer sinkApps = sink.Install(sinks);
-    sinkApps.Start(Seconds(0.0));
-    sinkApps.Stop(Seconds(21.0));
+    sinkApps.Start(Seconds(0));
+    sinkApps.Stop(Seconds(21));
 
     AsciiTraceHelper ascii;
     p2p.EnableAsciiAll(ascii.CreateFileStream("simple-point-to-point-olsr.tr"));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/olsr/helper/olsr-helper.h ns-3.44/src/olsr/helper/olsr-helper.h
--- ns-3.43/src/olsr/helper/olsr-helper.h	2024-10-09 16:41:10.076656600 -0700
+++ ns-3.44/src/olsr/helper/olsr-helper.h	2025-03-09 16:55:49.683372300 -0700
@@ -20,9 +20,9 @@
 {
 
 /**
- * \ingroup olsr
+ * @ingroup olsr
  *
- * \brief Helper class that adds OLSR routing to nodes.
+ * @brief Helper class that adds OLSR routing to nodes.
  *
  * This class is expected to be used in conjunction with
  * ns3::InternetStackHelper::SetRoutingHelper
@@ -37,10 +37,10 @@
     OlsrHelper();
 
     /**
-     * \brief Construct an OlsrHelper from another previously initialized instance
+     * @brief Construct an OlsrHelper from another previously initialized instance
      * (Copy Constructor).
      *
-     * \param o object to copy
+     * @param o object to copy
      */
     OlsrHelper(const OlsrHelper& o);
 
@@ -48,7 +48,7 @@
     OlsrHelper& operator=(const OlsrHelper&) = delete;
 
     /**
-     * \returns pointer to clone of this OlsrHelper
+     * @returns pointer to clone of this OlsrHelper
      *
      * This method is mainly for internal use by the other helpers;
      * clients are expected to free the dynamic memory allocated by this method
@@ -56,24 +56,24 @@
     OlsrHelper* Copy() const override;
 
     /**
-     * \param node the node for which an exception is to be defined
-     * \param interface an interface of node on which OLSR is not to be installed
+     * @param node the node for which an exception is to be defined
+     * @param interface an interface of node on which OLSR is not to be installed
      *
      * This method allows the user to specify an interface on which OLSR is not to be installed on
      */
     void ExcludeInterface(Ptr<Node> node, uint32_t interface);
 
     /**
-     * \param node the node on which the routing protocol will run
-     * \returns a newly-created routing protocol
+     * @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
      */
     Ptr<Ipv4RoutingProtocol> Create(Ptr<Node> node) const override;
 
     /**
-     * \param name the name of the attribute to set
-     * \param value the value of the attribute to set.
+     * @param name the name of the attribute to set
+     * @param value the value of the attribute to set.
      *
      * This method controls the attributes of ns3::olsr::RoutingProtocol
      */
@@ -85,10 +85,10 @@
      * have been assigned.  The Install() method of the InternetStackHelper
      * should have previously been called by the user.
      *
-     * \param stream first stream index to use
-     * \param c NodeContainer of the set of nodes for which the OlsrRoutingProtocol
+     * @param stream first stream index to use
+     * @param c NodeContainer of the set of nodes for which the OlsrRoutingProtocol
      *          should be modified to use a fixed stream
-     * \return the number of stream indices assigned by this helper
+     * @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.43/src/olsr/model/olsr-header.cc ns-3.44/src/olsr/model/olsr-header.cc
--- ns-3.43/src/olsr/model/olsr-header.cc	2024-10-09 16:41:10.076656600 -0700
+++ ns-3.44/src/olsr/model/olsr-header.cc	2025-03-09 16:55:49.683372300 -0700
@@ -29,10 +29,10 @@
 #define OLSR_C 0.0625
 
 ///
-/// \brief Converts a decimal number of seconds to the mantissa/exponent format.
+/// @brief Converts a decimal number of seconds to the mantissa/exponent format.
 ///
-/// \param seconds decimal number of seconds we want to convert.
-/// \return the number of seconds in mantissa/exponent format.
+/// @param seconds decimal number of seconds we want to convert.
+/// @return the number of seconds in mantissa/exponent format.
 ///
 uint8_t
 SecondsToEmf(double seconds)
@@ -72,10 +72,10 @@
 }
 
 ///
-/// \brief Converts a number of seconds in the mantissa/exponent format to a decimal number.
+/// @brief Converts a number of seconds in the mantissa/exponent format to a decimal number.
 ///
-/// \param olsrFormat number of seconds in mantissa/exponent format.
-/// \return the decimal number of seconds.
+/// @param olsrFormat number of seconds in mantissa/exponent format.
+/// @return the decimal number of seconds.
 ///
 double
 EmfToSeconds(uint8_t olsrFormat)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/olsr/model/olsr-header.h ns-3.44/src/olsr/model/olsr-header.h
--- ns-3.43/src/olsr/model/olsr-header.h	2024-10-09 16:41:10.076656600 -0700
+++ ns-3.44/src/olsr/model/olsr-header.h	2025-03-09 16:55:49.683372300 -0700
@@ -27,7 +27,7 @@
 uint8_t SecondsToEmf(double seconds);
 
 /**
- * \ingroup olsr
+ * @ingroup olsr
  *
  * The basic layout of any packet in OLSR is as follows (omitting IP and
  * UDP headers):
@@ -72,7 +72,7 @@
 
     /**
      * Set the packet total length.
-     * \param length The packet length.
+     * @param length The packet length.
      */
     void SetPacketLength(uint16_t length)
     {
@@ -81,7 +81,7 @@
 
     /**
      * Get the packet total length.
-     * \return The packet length.
+     * @return The packet length.
      */
     uint16_t GetPacketLength() const
     {
@@ -90,7 +90,7 @@
 
     /**
      * Set the packet sequence number.
-     * \param seqnum The packet sequence number.
+     * @param seqnum The packet sequence number.
      */
     void SetPacketSequenceNumber(uint16_t seqnum)
     {
@@ -99,7 +99,7 @@
 
     /**
      * Get the packet sequence number.
-     * \returns The packet sequence number.
+     * @returns The packet sequence number.
      */
     uint16_t GetPacketSequenceNumber() const
     {
@@ -112,8 +112,8 @@
 
   public:
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -124,7 +124,7 @@
 };
 
 /**
- * \ingroup olsr
+ * @ingroup olsr
  *
  * This header can store HELP, TC, MID and HNA messages.
  * The header size is variable, and depends on the
@@ -165,7 +165,7 @@
 
     /**
      * Set the message type.
-     * \param messageType The message type.
+     * @param messageType The message type.
      */
     void SetMessageType(MessageType messageType)
     {
@@ -174,7 +174,7 @@
 
     /**
      * Get the message type.
-     * \return The message type.
+     * @return The message type.
      */
     MessageType GetMessageType() const
     {
@@ -183,7 +183,7 @@
 
     /**
      * Set the validity time.
-     * \param time The validity time.
+     * @param time The validity time.
      */
     void SetVTime(Time time)
     {
@@ -192,7 +192,7 @@
 
     /**
      * Get the validity time.
-     * \return The validity time.
+     * @return The validity time.
      */
     Time GetVTime() const
     {
@@ -201,7 +201,7 @@
 
     /**
      * Set the originator address.
-     * \param originatorAddress The originator address.
+     * @param originatorAddress The originator address.
      */
     void SetOriginatorAddress(Ipv4Address originatorAddress)
     {
@@ -210,7 +210,7 @@
 
     /**
      * Get the originator address.
-     * \return The originator address.
+     * @return The originator address.
      */
     Ipv4Address GetOriginatorAddress() const
     {
@@ -219,7 +219,7 @@
 
     /**
      * Set the time to live.
-     * \param timeToLive The time to live.
+     * @param timeToLive The time to live.
      */
     void SetTimeToLive(uint8_t timeToLive)
     {
@@ -228,7 +228,7 @@
 
     /**
      * Get the time to live.
-     * \return The time to live.
+     * @return The time to live.
      */
     uint8_t GetTimeToLive() const
     {
@@ -237,7 +237,7 @@
 
     /**
      * Set the hop count.
-     * \param hopCount The hop count.
+     * @param hopCount The hop count.
      */
     void SetHopCount(uint8_t hopCount)
     {
@@ -246,7 +246,7 @@
 
     /**
      * Get the hop count.
-     * \return The hop count.
+     * @return The hop count.
      */
     uint8_t GetHopCount() const
     {
@@ -255,7 +255,7 @@
 
     /**
      * Set the message sequence number.
-     * \param messageSequenceNumber The message sequence number.
+     * @param messageSequenceNumber The message sequence number.
      */
     void SetMessageSequenceNumber(uint16_t messageSequenceNumber)
     {
@@ -264,7 +264,7 @@
 
     /**
      * Get the message sequence number.
-     * \return The message sequence number.
+     * @return The message sequence number.
      */
     uint16_t GetMessageSequenceNumber() const
     {
@@ -282,8 +282,8 @@
 
   public:
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -293,7 +293,7 @@
     uint32_t Deserialize(Buffer::Iterator start) override;
 
     /**
-     * \ingroup olsr
+     * @ingroup olsr
      * MID Message Format
      *
     \verbatim
@@ -313,19 +313,19 @@
         std::vector<Ipv4Address> interfaceAddresses; //!< Interface Address container.
         /**
          * This method is used to print the content of a MID message.
-         * \param os output stream
+         * @param os output stream
          */
         void Print(std::ostream& os) const;
         /**
          * Returns the expected size of the header.
-         * \returns the expected size of the header.
+         * @returns the expected size of the header.
          */
         uint32_t GetSerializedSize() const;
         /**
          * This method is used by Packet::AddHeader to
          * store a header into the byte buffer of a packet.
          *
-         * \param start an iterator which points to where the header should
+         * @param start an iterator which points to where the header should
          *        be written.
          */
         void Serialize(Buffer::Iterator start) const;
@@ -333,16 +333,16 @@
          * This method is used by Packet::RemoveHeader to
          * re-create a header from the byte buffer of a packet.
          *
-         * \param start an iterator which points to where the header should
+         * @param start an iterator which points to where the header should
          *        read from.
-         * \param messageSize the message size.
-         * \returns the number of bytes read.
+         * @param messageSize the message size.
+         * @returns the number of bytes read.
          */
         uint32_t Deserialize(Buffer::Iterator start, uint32_t messageSize);
     };
 
     /**
-     * \ingroup olsr
+     * @ingroup olsr
      * HELLO Message Format
      *
     \verbatim
@@ -387,7 +387,7 @@
 
         /**
          * Set the HELLO emission interval.
-         * \param time The HELLO emission interval.
+         * @param time The HELLO emission interval.
          */
         void SetHTime(Time time)
         {
@@ -396,7 +396,7 @@
 
         /**
          * Get the HELLO emission interval.
-         * \return The HELLO emission interval.
+         * @return The HELLO emission interval.
          */
         Time GetHTime() const
         {
@@ -409,19 +409,19 @@
 
         /**
          * This method is used to print the content of a Hello message.
-         * \param os output stream
+         * @param os output stream
          */
         void Print(std::ostream& os) const;
         /**
          * Returns the expected size of the header.
-         * \returns the expected size of the header.
+         * @returns the expected size of the header.
          */
         uint32_t GetSerializedSize() const;
         /**
          * This method is used by Packet::AddHeader to
          * store a header into the byte buffer of a packet.
          *
-         * \param start an iterator which points to where the header should
+         * @param start an iterator which points to where the header should
          *        be written.
          */
         void Serialize(Buffer::Iterator start) const;
@@ -429,16 +429,16 @@
          * This method is used by Packet::RemoveHeader to
          * re-create a header from the byte buffer of a packet.
          *
-         * \param start an iterator which points to where the header should
+         * @param start an iterator which points to where the header should
          *        read from.
-         * \param messageSize the message size.
-         * \returns the number of bytes read.
+         * @param messageSize the message size.
+         * @returns the number of bytes read.
          */
         uint32_t Deserialize(Buffer::Iterator start, uint32_t messageSize);
     };
 
     /**
-     * \ingroup olsr
+     * @ingroup olsr
      * TC Message Format
      *
      \verbatim
@@ -462,19 +462,19 @@
 
         /**
          * This method is used to print the content of a Tc message.
-         * \param os output stream
+         * @param os output stream
          */
         void Print(std::ostream& os) const;
         /**
          * Returns the expected size of the header.
-         * \returns the expected size of the header.
+         * @returns the expected size of the header.
          */
         uint32_t GetSerializedSize() const;
         /**
          * This method is used by Packet::AddHeader to
          * store a header into the byte buffer of a packet.
          *
-         * \param start an iterator which points to where the header should
+         * @param start an iterator which points to where the header should
          *        be written.
          */
         void Serialize(Buffer::Iterator start) const;
@@ -482,16 +482,16 @@
          * This method is used by Packet::RemoveHeader to
          * re-create a header from the byte buffer of a packet.
          *
-         * \param start an iterator which points to where the header should
+         * @param start an iterator which points to where the header should
          *        read from.
-         * \param messageSize the message size.
-         * \returns the number of bytes read.
+         * @param messageSize the message size.
+         * @returns the number of bytes read.
          */
         uint32_t Deserialize(Buffer::Iterator start, uint32_t messageSize);
     };
 
     /**
-     * \ingroup olsr
+     * @ingroup olsr
      * HNA (Host Network Association) Message Format
      *
      \verbatim
@@ -525,19 +525,19 @@
 
         /**
          * This method is used to print the content of a Hna message.
-         * \param os output stream
+         * @param os output stream
          */
         void Print(std::ostream& os) const;
         /**
          * Returns the expected size of the header.
-         * \returns the expected size of the header.
+         * @returns the expected size of the header.
          */
         uint32_t GetSerializedSize() const;
         /**
          * This method is used by Packet::AddHeader to
          * store a header into the byte buffer of a packet.
          *
-         * \param start an iterator which points to where the header should
+         * @param start an iterator which points to where the header should
          *        be written.
          */
         void Serialize(Buffer::Iterator start) const;
@@ -545,10 +545,10 @@
          * This method is used by Packet::RemoveHeader to
          * re-create a header from the byte buffer of a packet.
          *
-         * \param start an iterator which points to where the header should
+         * @param start an iterator which points to where the header should
          *        read from.
-         * \param messageSize the message size.
-         * \returns the number of bytes read.
+         * @param messageSize the message size.
+         * @returns the number of bytes read.
          */
         uint32_t Deserialize(Buffer::Iterator start, uint32_t messageSize);
     };
@@ -568,7 +568,7 @@
   public:
     /**
      * Set the message type to MID and return the message content.
-     * \returns The MID message.
+     * @returns The MID message.
      */
     Mid& GetMid()
     {
@@ -585,7 +585,7 @@
 
     /**
      * Set the message type to HELLO and return the message content.
-     * \returns The HELLO message.
+     * @returns The HELLO message.
      */
     Hello& GetHello()
     {
@@ -602,7 +602,7 @@
 
     /**
      * Set the message type to TC and return the message content.
-     * \returns The TC message.
+     * @returns The TC message.
      */
     Tc& GetTc()
     {
@@ -619,7 +619,7 @@
 
     /**
      * Set the message type to HNA and return the message content.
-     * \returns The HNA message.
+     * @returns The HNA message.
      */
     Hna& GetHna()
     {
@@ -636,7 +636,7 @@
 
     /**
      * Get the MID message.
-     * \returns The MID message.
+     * @returns The MID message.
      */
     const Mid& GetMid() const
     {
@@ -646,7 +646,7 @@
 
     /**
      * Get the HELLO message.
-     * \returns The HELLO message.
+     * @returns The HELLO message.
      */
     const Hello& GetHello() const
     {
@@ -656,7 +656,7 @@
 
     /**
      * Get the TC message.
-     * \returns The TC message.
+     * @returns The TC message.
      */
     const Tc& GetTc() const
     {
@@ -666,7 +666,7 @@
 
     /**
      * Get the HNA message.
-     * \returns The HNA message.
+     * @returns The HNA message.
      */
     const Hna& GetHna() const
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/olsr/model/olsr-repositories.h ns-3.44/src/olsr/model/olsr-repositories.h
--- ns-3.43/src/olsr/model/olsr-repositories.h	2024-10-09 16:41:10.076656600 -0700
+++ ns-3.44/src/olsr/model/olsr-repositories.h	2025-03-09 16:55:49.683372300 -0700
@@ -24,7 +24,7 @@
 {
 
 /**
- * \ingroup olsr
+ * @ingroup olsr
  *
  * Willingness for forwarding packets from other nodes.
  * The standard defines the following set of values.
@@ -44,9 +44,9 @@
 /**
  * Stream insertion operator for OLSR willingness.
  *
- * \param os Output stream.
- * \param willingness Willingness.
- * \return A reference to the output stream.
+ * @param os Output stream.
+ * @param willingness Willingness.
+ * @return A reference to the output stream.
  */
 inline std::ostream&
 operator<<(std::ostream& os, Willingness willingness)
@@ -69,7 +69,7 @@
     return os;
 }
 
-/// \ingroup olsr
+/// @ingroup olsr
 /// An Interface Association Tuple.
 struct IfaceAssocTuple
 {
@@ -95,7 +95,7 @@
     return os;
 }
 
-/// \ingroup olsr
+/// @ingroup olsr
 /// A Link Tuple.
 struct LinkTuple
 {
@@ -126,7 +126,7 @@
     return os;
 }
 
-/// \ingroup olsr
+/// @ingroup olsr
 /// A Neighbor Tuple.
 struct NeighborTuple
 {
@@ -164,7 +164,7 @@
     return os;
 }
 
-/// \ingroup olsr
+/// @ingroup olsr
 /// A 2-hop Tuple.
 struct TwoHopNeighborTuple
 {
@@ -192,7 +192,7 @@
             a.twoHopNeighborAddr == b.twoHopNeighborAddr);
 }
 
-/// \ingroup olsr
+/// @ingroup olsr
 /// An MPR-Selector Tuple.
 struct MprSelectorTuple
 {
@@ -211,7 +211,7 @@
 // The type "list of interface addresses"
 // typedef std::vector<nsaddr_t> addr_list_t;
 
-/// \ingroup olsr
+/// @ingroup olsr
 /// A Duplicate Tuple
 struct DuplicateTuple
 {
@@ -233,7 +233,7 @@
     return (a.address == b.address && a.sequenceNumber == b.sequenceNumber);
 }
 
-/// \ingroup olsr
+/// @ingroup olsr
 /// A Topology Tuple
 struct TopologyTuple
 {
@@ -263,7 +263,7 @@
     return os;
 }
 
-/// \ingroup olsr
+/// @ingroup olsr
 /// Association
 struct Association
 {
@@ -284,7 +284,7 @@
     return os;
 }
 
-/// \ingroup olsr
+/// @ingroup olsr
 /// An Association Tuple
 struct AssociationTuple
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/olsr/model/olsr-routing-protocol.cc ns-3.44/src/olsr/model/olsr-routing-protocol.cc
--- ns-3.43/src/olsr/model/olsr-routing-protocol.cc	2024-10-09 16:41:10.076656600 -0700
+++ ns-3.44/src/olsr/model/olsr-routing-protocol.cc	2025-03-09 16:55:49.683372300 -0700
@@ -9,7 +9,7 @@
  */
 
 ///
-/// \brief Implementation of OLSR agent and related classes.
+/// @brief Implementation of OLSR agent and related classes.
 ///
 /// This is the main file of this software because OLSR's behaviour is
 /// implemented here.
@@ -47,7 +47,7 @@
 /********** Useful macros **********/
 
 ///
-/// \brief Gets the delay between a given time and the current time.
+/// @brief Gets the delay between a given time and the current time.
 ///
 /// If given time is previous to the current one, then this macro returns
 /// a number close to 0. This is used for scheduling events at a certain moment.
@@ -57,7 +57,7 @@
                                    : (time - Simulator::Now() + Seconds(0.000001)))
 
 ///
-/// \brief Period at which a node must cite every link and every neighbor.
+/// @brief Period at which a node must cite every link and every neighbor.
 ///
 /// We only use this value in order to define OLSR_NEIGHB_HOLD_TIME.
 ///
@@ -103,7 +103,7 @@
 {
 
 /**
- * \ingroup olsr
+ * @ingroup olsr
  *
  * OLSR link types.
  * See \RFC{3626} section 18.5.
@@ -119,9 +119,9 @@
 /**
  * Stream insertion operator for OLSR link type.
  *
- * \param os Output stream.
- * \param linkType OLSR link type.
- * \return A reference to the output stream.
+ * @param os Output stream.
+ * @param linkType OLSR link type.
+ * @return A reference to the output stream.
  */
 inline std::ostream&
 operator<<(std::ostream& os, LinkType linkType)
@@ -142,7 +142,7 @@
 }
 
 /**
- * \ingroup olsr
+ * @ingroup olsr
  *
  * OLSR neighbor types.
  * See \RFC{3626} section 18.6.
@@ -157,9 +157,9 @@
 /**
  * Stream insertion operator for OLSR link type.
  *
- * \param os Output stream.
- * \param neighborType OLSR neighbor type.
- * \return A reference to the output stream.
+ * @param os Output stream.
+ * @param neighborType OLSR neighbor type.
+ * @return A reference to the output stream.
  */
 inline std::ostream&
 operator<<(std::ostream& os, NeighborType neighborType)
@@ -638,11 +638,11 @@
 }
 
 ///
-/// \brief This auxiliary function (defined in \RFC{3626}) is used for calculating the MPR Set.
+/// @brief This auxiliary function (defined in \RFC{3626}) is used for calculating the MPR Set.
 ///
-/// \param tuple the neighbor tuple which has the main address of the node we are going to calculate
+/// @param tuple the neighbor tuple which has the main address of the node we are going to calculate
 /// its degree to.
-/// \return the degree of the node.
+/// @return the degree of the node.
 ///
 int
 RoutingProtocol::Degree(const NeighborTuple& tuple)
@@ -668,11 +668,11 @@
 namespace
 {
 ///
-/// \brief Remove all covered 2-hop neighbors from N2 set.
+/// @brief Remove all covered 2-hop neighbors from N2 set.
 /// This is a helper function used by MprComputation algorithm.
 ///
-/// \param neighborMainAddr Neighbor main address.
-/// \param N2 Reference to the 2-hop neighbor set.
+/// @param neighborMainAddr Neighbor main address.
+/// @param N2 Reference to the 2-hop neighbor set.
 ///
 void
 CoverTwoHopNeighbors(Ipv4Address neighborMainAddr, TwoHopNeighborSet& N2)
@@ -2020,7 +2020,7 @@
                      << ": LinkSensing(receiverIface=" << receiverIface
                      << ", senderIface=" << senderIface << ") BEGIN");
 
-    NS_ASSERT(msg.GetVTime() > Seconds(0));
+    NS_ASSERT(msg.GetVTime().IsStrictlyPositive());
     LinkTuple* link_tuple = m_state.FindLinkTuple(senderIface);
     if (link_tuple == nullptr)
     {
@@ -2286,11 +2286,11 @@
 
 #if 0
 ///
-/// \brief Drops a given packet because it couldn't be delivered to the corresponding
+/// @brief Drops a given packet because it couldn't be delivered to the corresponding
 /// destination by the MAC layer. This may cause a neighbor loss, and appropriate
 /// actions are then taken.
 ///
-/// \param p the packet which couldn't be delivered by the MAC layer.
+/// @param p the packet which couldn't be delivered by the MAC layer.
 ///
 void
 OLSR::mac_failed(Ptr<Packet> p)
@@ -2902,7 +2902,7 @@
         }
         else
         {
-            /// \todo Implement IP aliasing and OLSR
+            /// @todo Implement IP aliasing and OLSR
             NS_FATAL_ERROR("XXX Not implemented yet:  IP aliasing and OLSR");
         }
         rtentry->SetSource(ifAddr.GetLocal());
@@ -3013,7 +3013,7 @@
         }
         else
         {
-            /// \todo Implement IP aliasing and OLSR
+            /// @todo Implement IP aliasing and OLSR
             NS_FATAL_ERROR("XXX Not implemented yet:  IP aliasing and OLSR");
         }
         rtentry->SetSource(ifAddr.GetLocal());
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/olsr/model/olsr-routing-protocol.h ns-3.44/src/olsr/model/olsr-routing-protocol.h
--- ns-3.43/src/olsr/model/olsr-routing-protocol.h	2024-10-09 16:41:10.076656600 -0700
+++ ns-3.44/src/olsr/model/olsr-routing-protocol.h	2025-03-09 16:55:49.683372300 -0700
@@ -40,11 +40,11 @@
 {
 
 ///
-/// \defgroup olsr OLSR Routing
+/// @defgroup olsr OLSR Routing
 /// This section documents the API of the ns-3 OLSR module. For a generic
 /// functional description, please refer to the ns-3 manual.
 
-/// \ingroup olsr
+/// @ingroup olsr
 /// An OLSR's routing table entry.
 struct RoutingTableEntry
 {
@@ -66,9 +66,9 @@
 class RoutingProtocol;
 
 ///
-/// \ingroup olsr
+/// @ingroup olsr
 ///
-/// \brief OLSR routing protocol for IPv4
+/// @brief OLSR routing protocol for IPv4
 ///
 class RoutingProtocol : public Ipv4RoutingProtocol
 {
@@ -81,8 +81,8 @@
     static const uint16_t OLSR_PORT_NUMBER; //!< port number (698)
 
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
@@ -90,9 +90,9 @@
     ~RoutingProtocol() override;
 
     /**
-     * \brief Set the OLSR main address to the first address on the indicated interface.
+     * @brief Set the OLSR main address to the first address on the indicated interface.
      *
-     * \param interface IPv4 interface index
+     * @param interface IPv4 interface index
      */
     void SetMainInterface(uint32_t interface);
 
@@ -105,43 +105,43 @@
 
     /**
      * Get the routing table entries.
-     * \return the list of routing table entries discovered by OLSR
+     * @return the list of routing table entries discovered by OLSR
      */
     std::vector<RoutingTableEntry> GetRoutingTableEntries() const;
 
     /**
      * Gets the MPR set.
-     * \return The MPR set.
+     * @return The MPR set.
      */
     MprSet GetMprSet() const;
 
     /**
      * Gets the MPR selectors.
-     * \returns The MPR selectors.
+     * @returns The MPR selectors.
      */
     const MprSelectorSet& GetMprSelectors() const;
 
     /**
      * Get the one hop neighbors.
-     * \return the set of neighbors discovered by OLSR
+     * @return the set of neighbors discovered by OLSR
      */
     const NeighborSet& GetNeighbors() const;
 
     /**
      * Get the two hop neighbors.
-     * \return the set of two hop neighbors discovered by OLSR
+     * @return the set of two hop neighbors discovered by OLSR
      */
     const TwoHopNeighborSet& GetTwoHopNeighbors() const;
 
     /**
      * Gets the topology set.
-     * \returns The topology set discovery by OLSR
+     * @returns The topology set discovery by OLSR
      */
     const TopologySet& GetTopologySet() const;
 
     /**
      * Gets the underlying OLSR state object
-     * \returns The OLSR state object
+     * @returns The OLSR state object
      */
     const OlsrState& GetOlsrState() const;
 
@@ -150,16 +150,16 @@
      * used by this model.  Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream);
 
     /**
      * TracedCallback signature for Packet transmit and receive events.
      *
-     * \param [in] header
-     * \param [in] messages
+     * @param [in] header
+     * @param [in] messages
      */
     typedef void (*PacketTxRxTracedCallback)(const PacketHeader& header,
                                              const MessageList& messages);
@@ -167,7 +167,7 @@
     /**
      * TracedCallback signature for routing table computation.
      *
-     * \param [in] size Final routing table size.
+     * @param [in] size Final routing table size.
      */
     typedef void (*TableChangeTracedCallback)(uint32_t size);
 
@@ -179,7 +179,7 @@
   public:
     /**
      * Get the excluded interfaces.
-     * \returns Container of excluded interfaces.
+     * @returns Container of excluded interfaces.
      */
     std::set<uint32_t> GetInterfaceExclusions() const
     {
@@ -188,45 +188,45 @@
 
     /**
      * Set the interfaces to be excluded.
-     * \param exceptions Container of excluded interfaces.
+     * @param exceptions Container of excluded interfaces.
      */
     void SetInterfaceExclusions(std::set<uint32_t> exceptions);
 
     /**
-     *  \brief Injects the specified (networkAddr, netmask) tuple in the list of
+     *  @brief Injects the specified (networkAddr, netmask) tuple in the list of
      *  local HNA associations to be sent by the node via HNA messages.
      *  If this tuple already exists, nothing is done.
      *
-     * \param networkAddr The network address.
-     * \param netmask The network mask.
+     * @param networkAddr The network address.
+     * @param netmask The network mask.
      */
     void AddHostNetworkAssociation(Ipv4Address networkAddr, Ipv4Mask netmask);
 
     /**
-     * \brief Removes the specified (networkAddr, netmask) tuple from the list of
+     * @brief Removes the specified (networkAddr, netmask) tuple from the list of
      * local HNA associations to be sent by the node via HNA messages.
      * If this tuple does not exist, nothing is done (see "OlsrState::EraseAssociation()").
      *
-     * \param networkAddr The network address.
-     * \param netmask The network mask.
+     * @param networkAddr The network address.
+     * @param netmask The network mask.
      */
     void RemoveHostNetworkAssociation(Ipv4Address networkAddr, Ipv4Mask netmask);
 
     /**
-     * \brief Associates the specified Ipv4StaticRouting routing table
+     * @brief Associates the specified Ipv4StaticRouting routing table
      *        to the OLSR routing protocol. Entries from this associated
      *        routing table that use non-olsr outgoing interfaces are added
      *        to the list of local HNA associations so that they are included
      *        in HNA messages sent by the node.
      *        If this method is called more than once, entries from the old
      *        association are deleted before entries from the new one are added.
-     * \param routingTable the Ipv4StaticRouting routing table to be associated.
+     * @param routingTable the Ipv4StaticRouting routing table to be associated.
      */
     void SetRoutingTableAssociation(Ptr<Ipv4StaticRouting> routingTable);
 
     /**
-     * \brief Returns the internal HNA table
-     * \returns the internal HNA table
+     * @brief Returns the internal HNA table
+     * @returns the internal HNA table
      */
     Ptr<const Ipv4StaticRouting> GetRoutingTableAssociation() const;
 
@@ -255,13 +255,13 @@
     Ptr<Ipv4> m_ipv4;  //!< IPv4 object the routing is linked to.
 
     /**
-     * \brief Clears the routing table and frees the memory assigned to each one of its entries.
+     * @brief Clears the routing table and frees the memory assigned to each one of its entries.
      */
     void Clear();
 
     /**
      * Returns the routing table size.
-     * \return The routing table size.
+     * @return The routing table size.
      */
     uint32_t GetSize() const
     {
@@ -269,33 +269,33 @@
     }
 
     /**
-     * \brief Deletes the entry whose destination address is given.
-     * \param dest address of the destination node.
+     * @brief Deletes the entry whose destination address is given.
+     * @param dest address of the destination node.
      */
     void RemoveEntry(const Ipv4Address& dest);
     /**
-     * \brief Adds a new entry into the routing table.
+     * @brief Adds a new entry into the routing table.
      *
      * If an entry for the given destination existed, it is deleted and freed.
      *
-     * \param dest address of the destination node.
-     * \param next address of the next hop node.
-     * \param interface address of the local interface.
-     * \param distance distance to the destination node.
+     * @param dest address of the destination node.
+     * @param next address of the next hop node.
+     * @param interface address of the local interface.
+     * @param distance distance to the destination node.
      */
     void AddEntry(const Ipv4Address& dest,
                   const Ipv4Address& next,
                   uint32_t interface,
                   uint32_t distance);
     /**
-     * \brief Adds a new entry into the routing table.
+     * @brief Adds a new entry into the routing table.
      *
      * If an entry for the given destination existed, an error is thrown.
      *
-     * \param dest address of the destination node.
-     * \param next address of the next hop node.
-     * \param interfaceAddress address of the local interface.
-     * \param distance distance to the destination node.
+     * @param dest address of the destination node.
+     * @param next address of the next hop node.
+     * @param interfaceAddress address of the local interface.
+     * @param distance distance to the destination node.
      */
     void AddEntry(const Ipv4Address& dest,
                   const Ipv4Address& next,
@@ -303,15 +303,15 @@
                   uint32_t distance);
 
     /**
-     * \brief Looks up an entry for the specified destination address.
-     * \param [in] dest Destination address.
-     * \param [out] outEntry Holds the routing entry result, if found.
-     * \return true if found, false if not found.
+     * @brief Looks up an entry for the specified destination address.
+     * @param [in] dest Destination address.
+     * @param [out] outEntry Holds the routing entry result, if found.
+     * @return true if found, false if not found.
      */
     bool Lookup(const Ipv4Address& dest, RoutingTableEntry& outEntry) const;
 
     /**
-     * \brief Finds the appropriate entry which must be used in order to forward
+     * @brief Finds the appropriate entry which must be used in order to forward
      * a data packet to a next hop (given a destination).
      *
      * Imagine a routing table like this: [A,B] [B,C] [C,C]; being each pair of the
@@ -326,7 +326,7 @@
      * \param[out] outEntry The appropriate routing table entry which indicates the next
      * hop which must be used for forwarding a data packet, or NULL if there is no such entry.
      *
-     * \return True if an entry was found, false otherwise.
+     * @return True if an entry was found, false otherwise.
      */
     bool FindSendEntry(const RoutingTableEntry& entry, RoutingTableEntry& outEntry) const;
 
@@ -356,52 +356,52 @@
 
     /**
      * Send an OLSR message.
-     * \param packet The packet to be sent.
-     * \param containedMessages The messages contained in the packet.
+     * @param packet The packet to be sent.
+     * @param containedMessages The messages contained in the packet.
      */
     void SendPacket(Ptr<Packet> packet, const MessageList& containedMessages);
 
     /**
      * Increments packet sequence number and returns the new value.
-     * \return The packet sequence number.
+     * @return The packet sequence number.
      */
     inline uint16_t GetPacketSequenceNumber();
 
     /**
      * Increments message sequence number and returns the new value.
-     * \return The message sequence number.
+     * @return The message sequence number.
      */
     inline uint16_t GetMessageSequenceNumber();
 
     /**
      * Receive an OLSR message.
-     * \param socket The receiving socket.
+     * @param socket The receiving socket.
      */
     void RecvOlsr(Ptr<Socket> socket);
 
     /**
-     * \brief Computes MPR set of a node following \RFC{3626} hints.
+     * @brief Computes MPR set of a node following \RFC{3626} hints.
      */
     void MprComputation();
 
     /**
-     * \brief Creates the routing table of the node following \RFC{3626} hints.
+     * @brief Creates the routing table of the node following \RFC{3626} hints.
      */
     void RoutingTableComputation();
 
   public:
     /**
-     * \brief Gets the main address associated with a given interface address.
-     * \param iface_addr the interface address.
-     * \return the corresponding main address.
+     * @brief Gets the main address associated with a given interface address.
+     * @param iface_addr the interface address.
+     * @return the corresponding main address.
      */
     Ipv4Address GetMainAddress(Ipv4Address iface_addr) const;
 
   private:
     /**
-     * \brief Tests whether or not the specified route uses a non-OLSR outgoing interface.
-     * \param route The route to be tested.
-     * \returns True if the outgoing interface of the specified route is a non-OLSR interface,
+     * @brief Tests whether or not the specified route uses a non-OLSR outgoing interface.
+     * @param route The route to be tested.
+     * @returns True if the outgoing interface of the specified route is a non-OLSR interface,
      * false otherwise.
      */
     bool UsesNonOlsrOutgoingInterface(const Ipv4RoutingTableEntry& route);
@@ -409,44 +409,44 @@
     // Timer handlers
     Timer m_helloTimer; //!< Timer for the HELLO message.
     /**
-     * \brief Sends a HELLO message and reschedules the HELLO timer.
+     * @brief Sends a HELLO message and reschedules the HELLO timer.
      */
     void HelloTimerExpire();
 
     Timer m_tcTimer; //!< Timer for the TC message.
     /**
-     * \brief Sends a TC message (if there exists any MPR selector) and reschedules the TC timer.
+     * @brief Sends a TC message (if there exists any MPR selector) and reschedules the TC timer.
      */
     void TcTimerExpire();
 
     Timer m_midTimer; //!< Timer for the MID message.
     /**
-     * \brief \brief Sends a MID message (if the node has more than one interface) and resets the
+     * @brief @brief Sends a MID message (if the node has more than one interface) and resets the
      * MID timer.
      */
     void MidTimerExpire();
 
     Timer m_hnaTimer; //!< Timer for the HNA message.
     /**
-     * \brief Sends an HNA message (if the node has associated hosts/networks) and reschedules the
+     * @brief Sends an HNA message (if the node has associated hosts/networks) and reschedules the
      * HNA timer.
      */
     void HnaTimerExpire();
 
     /**
-     * \brief Removes tuple if expired. Else timer is rescheduled to expire at tuple.expirationTime.
+     * @brief Removes tuple if expired. Else timer is rescheduled to expire at tuple.expirationTime.
      *
      * The task of actually removing the tuple is left to the OLSR agent.
      *
-     * \param address The address of the tuple.
-     * \param sequenceNumber The sequence number of the tuple.
+     * @param address The address of the tuple.
+     * @param sequenceNumber The sequence number of the tuple.
      */
     void DupTupleTimerExpire(Ipv4Address address, uint16_t sequenceNumber);
 
     bool m_linkTupleTimerFirstTime; //!< Flag to indicate if it is the first time the LinkTupleTimer
                                     //!< fires.
     /**
-     * \brief Removes tuple_ if expired. Else if symmetric time
+     * @brief Removes tuple_ if expired. Else if symmetric time
      * has expired then it is assumed a neighbor loss and agent_->nb_loss()
      * is called. In this case the timer is rescheduled to expire at
      * tuple_->time(). Otherwise the timer is rescheduled to expire at
@@ -454,57 +454,57 @@
      *
      * The task of actually removing the tuple is left to the OLSR agent.
      *
-     * \param neighborIfaceAddr The tuple neighbor interface address.
+     * @param neighborIfaceAddr The tuple neighbor interface address.
      */
     void LinkTupleTimerExpire(Ipv4Address neighborIfaceAddr);
 
     /**
-     * \brief Removes 2_hop neighbor tuple_ if expired. Else the timer is rescheduled to expire at
+     * @brief Removes 2_hop neighbor tuple_ if expired. Else the timer is rescheduled to expire at
      * tuple_->time().
      *
      * The task of actually removing the tuple is left to the OLSR agent.
      *
-     * \param neighborMainAddr The neighbor main address.
-     * \param twoHopNeighborAddr The 2-hop neighbor address.
+     * @param neighborMainAddr The neighbor main address.
+     * @param twoHopNeighborAddr The 2-hop neighbor address.
      */
     void Nb2hopTupleTimerExpire(Ipv4Address neighborMainAddr, Ipv4Address twoHopNeighborAddr);
 
     /**
-     * \brief Removes MPR selector tuple_ if expired. Else the timer is rescheduled to expire at
+     * @brief Removes MPR selector tuple_ if expired. Else the timer is rescheduled to expire at
      * tuple_->time().
      *
      * The task of actually removing the tuple is left to the OLSR agent.
      *
-     * \param mainAddr The tuple IPv4 address.
+     * @param mainAddr The tuple IPv4 address.
      */
     void MprSelTupleTimerExpire(Ipv4Address mainAddr);
 
     /**
-     * \brief Removes topology tuple_ if expired. Else the timer is rescheduled to expire at
+     * @brief Removes topology tuple_ if expired. Else the timer is rescheduled to expire at
      * tuple_->time().
      *
      * The task of actually removing the tuple is left to the OLSR agent.
      *
-     * \param destAddr The destination address.
-     * \param lastAddr The last address.
+     * @param destAddr The destination address.
+     * @param lastAddr The last address.
      */
     void TopologyTupleTimerExpire(Ipv4Address destAddr, Ipv4Address lastAddr);
 
     /**
-     * \brief Removes interface association tuple_ if expired. Else the timer is rescheduled to
+     * @brief Removes interface association tuple_ if expired. Else the timer is rescheduled to
      * expire at tuple_->time().
      *
-     * \param ifaceAddr The interface address.
+     * @param ifaceAddr The interface address.
      */
     void IfaceAssocTupleTimerExpire(Ipv4Address ifaceAddr);
 
     /**
-     * \brief Removes association tuple_ if expired. Else timer is rescheduled to expire at
+     * @brief Removes association tuple_ if expired. Else timer is rescheduled to expire at
      * tuple_->time().
      *
-     * \param gatewayAddr The gateway address.
-     * \param networkAddr The network address.
-     * \param netmask  The network mask.
+     * @param gatewayAddr The gateway address.
+     * @param networkAddr The network address.
+     * @param netmask  The network mask.
      */
     void AssociationTupleTimerExpire(Ipv4Address gatewayAddr,
                                      Ipv4Address networkAddr,
@@ -520,15 +520,15 @@
     Timer m_queuedMessagesTimer; //!< timer for throttling outgoing messages
 
     /**
-     * \brief OLSR's default forwarding algorithm.
+     * @brief OLSR's default forwarding algorithm.
      *
      * See \RFC{3626} for details.
      *
-     * \param olsrMessage The %OLSR message which must be forwarded.
-     * \param duplicated NULL if the message has never been considered for forwarding, or a
+     * @param olsrMessage The %OLSR message which must be forwarded.
+     * @param duplicated NULL if the message has never been considered for forwarding, or a
      * duplicate tuple in other case.
-     * \param localIface The address of the interface where the message was received from.
-     * \param senderAddress The sender IPv4 address.
+     * @param localIface The address of the interface where the message was received from.
+     * @param senderAddress The sender IPv4 address.
      */
     void ForwardDefault(olsr::MessageHeader olsrMessage,
                         DuplicateTuple* duplicated,
@@ -536,18 +536,18 @@
                         const Ipv4Address& senderAddress);
 
     /**
-     * \brief Enqueues an %OLSR message which will be sent with a delay of (0, delay].
+     * @brief Enqueues an %OLSR message which will be sent with a delay of (0, delay].
      *
      * This buffering system is used in order to piggyback several %OLSR messages in
      * a same %OLSR packet.
      *
-     * \param message the %OLSR message which must be sent.
-     * \param delay maximum delay the %OLSR message is going to be buffered.
+     * @param message the %OLSR message which must be sent.
+     * @param delay maximum delay the %OLSR message is going to be buffered.
      */
     void QueueMessage(const olsr::MessageHeader& message, Time delay);
 
     /**
-     * \brief Creates as many %OLSR packets as needed in order to send all buffered
+     * @brief Creates as many %OLSR packets as needed in order to send all buffered
      * %OLSR messages.
      *
      * Maximum number of messages which can be contained in an %OLSR packet is
@@ -556,214 +556,214 @@
     void SendQueuedMessages();
 
     /**
-     * \brief Creates a new %OLSR HELLO message which is buffered for being sent later on.
+     * @brief Creates a new %OLSR HELLO message which is buffered for being sent later on.
      */
     void SendHello();
 
     /**
-     * \brief Creates a new %OLSR TC message which is buffered for being sent later on.
+     * @brief Creates a new %OLSR TC message which is buffered for being sent later on.
      */
     void SendTc();
 
     /**
-     * \brief Creates a new %OLSR MID message which is buffered for being sent later on.
+     * @brief Creates a new %OLSR MID message which is buffered for being sent later on.
      */
     void SendMid();
 
     /**
-     * \brief Creates a new %OLSR HNA message which is buffered for being sent later on.
+     * @brief Creates a new %OLSR HNA message which is buffered for being sent later on.
      */
     void SendHna();
 
     /**
-     * \brief Performs all actions needed when a neighbor loss occurs.
+     * @brief Performs all actions needed when a neighbor loss occurs.
      *
      * Neighbor Set, 2-hop Neighbor Set, MPR Set and MPR Selector Set are updated.
      *
-     * \param tuple link tuple with the information of the link to the neighbor which has been lost.
+     * @param tuple link tuple with the information of the link to the neighbor which has been lost.
      */
     void NeighborLoss(const LinkTuple& tuple);
 
     /**
-     * \brief Adds a duplicate tuple to the Duplicate Set.
+     * @brief Adds a duplicate tuple to the Duplicate Set.
      *
-     * \param tuple The duplicate tuple to be added.
+     * @param tuple The duplicate tuple to be added.
      */
     void AddDuplicateTuple(const DuplicateTuple& tuple);
 
     /**
-     * \brief Removes a duplicate tuple from the Duplicate Set.
+     * @brief Removes a duplicate tuple from the Duplicate Set.
      *
-     * \param tuple The duplicate tuple to be removed.
+     * @param tuple The duplicate tuple to be removed.
      */
     void RemoveDuplicateTuple(const DuplicateTuple& tuple);
 
     /**
      * Adds a link tuple.
-     * \param tuple The tuple to be added.
-     * \param willingness The tuple willingness.
+     * @param tuple The tuple to be added.
+     * @param willingness The tuple willingness.
      */
     void LinkTupleAdded(const LinkTuple& tuple, Willingness willingness);
 
     /**
-     * \brief Removes a link tuple from the Link Set.
+     * @brief Removes a link tuple from the Link Set.
      *
-     * \param tuple The link tuple to be removed.
+     * @param tuple The link tuple to be removed.
      */
     void RemoveLinkTuple(const LinkTuple& tuple);
 
     /**
-     * \brief This function is invoked when a link tuple is updated. Its aim is to
+     * @brief This function is invoked when a link tuple is updated. Its aim is to
      * also update the corresponding neighbor tuple if it is needed.
      *
-     * \param tuple The link tuple which has been updated.
-     * \param willingness The tuple willingness.
+     * @param tuple The link tuple which has been updated.
+     * @param willingness The tuple willingness.
      */
     void LinkTupleUpdated(const LinkTuple& tuple, Willingness willingness);
 
     /**
-     * \brief Adds a neighbor tuple to the Neighbor Set.
+     * @brief Adds a neighbor tuple to the Neighbor Set.
      *
-     * \param tuple The neighbor tuple to be added.
+     * @param tuple The neighbor tuple to be added.
      */
     void AddNeighborTuple(const NeighborTuple& tuple);
 
     /**
-     * \brief Removes a neighbor tuple from the Neighbor Set.
+     * @brief Removes a neighbor tuple from the Neighbor Set.
      *
-     * \param tuple The neighbor tuple to be removed.
+     * @param tuple The neighbor tuple to be removed.
      */
     void RemoveNeighborTuple(const NeighborTuple& tuple);
 
     /**
-     * \brief Adds a 2-hop neighbor tuple to the 2-hop Neighbor Set.
+     * @brief Adds a 2-hop neighbor tuple to the 2-hop Neighbor Set.
      *
-     * \param tuple The 2-hop neighbor tuple to be added.
+     * @param tuple The 2-hop neighbor tuple to be added.
      */
     void AddTwoHopNeighborTuple(const TwoHopNeighborTuple& tuple);
 
     /**
-     * \brief Removes a 2-hop neighbor tuple from the 2-hop Neighbor Set.
+     * @brief Removes a 2-hop neighbor tuple from the 2-hop Neighbor Set.
      *
-     * \param tuple The 2-hop neighbor tuple to be removed.
+     * @param tuple The 2-hop neighbor tuple to be removed.
      */
     void RemoveTwoHopNeighborTuple(const TwoHopNeighborTuple& tuple);
 
     /**
-     * \brief Adds an MPR selector tuple to the MPR Selector Set.
+     * @brief Adds an MPR selector tuple to the MPR Selector Set.
      * Advertised Neighbor Sequence Number (ANSN) is also updated.
      *
-     * \param tuple The MPR selector tuple to be added.
+     * @param tuple The MPR selector tuple to be added.
      */
     void AddMprSelectorTuple(const MprSelectorTuple& tuple);
 
     /**
-     * \brief Removes an MPR selector tuple from the MPR Selector Set.
+     * @brief Removes an MPR selector tuple from the MPR Selector Set.
      * Advertised Neighbor Sequence Number (ANSN) is also updated.
      *
-     * \param tuple The MPR selector tuple to be removed.
+     * @param tuple The MPR selector tuple to be removed.
      */
     void RemoveMprSelectorTuple(const MprSelectorTuple& tuple);
 
     /**
-     * \brief Adds a topology tuple to the Topology Set.
+     * @brief Adds a topology tuple to the Topology Set.
      *
-     * \param tuple The topology tuple to be added.
+     * @param tuple The topology tuple to be added.
      */
     void AddTopologyTuple(const TopologyTuple& tuple);
 
     /**
-     * \brief Removes a topology tuple to the Topology Set.
+     * @brief Removes a topology tuple to the Topology Set.
      *
-     * \param tuple The topology tuple to be removed.
+     * @param tuple The topology tuple to be removed.
      */
     void RemoveTopologyTuple(const TopologyTuple& tuple);
 
     /**
-     * \brief Adds an interface association tuple to the Interface Association Set.
+     * @brief Adds an interface association tuple to the Interface Association Set.
      *
-     * \param tuple The interface association tuple to be added.
+     * @param tuple The interface association tuple to be added.
      */
     void AddIfaceAssocTuple(const IfaceAssocTuple& tuple);
 
     /**
-     * \brief Removed an interface association tuple to the Interface Association Set.
+     * @brief Removed an interface association tuple to the Interface Association Set.
      *
-     * \param tuple The interface association tuple to be removed.
+     * @param tuple The interface association tuple to be removed.
      */
     void RemoveIfaceAssocTuple(const IfaceAssocTuple& tuple);
 
     /**
-     * \brief Adds a host network association tuple to the Association Set.
+     * @brief Adds a host network association tuple to the Association Set.
      *
-     * \param tuple The host network association tuple to be added.
+     * @param tuple The host network association tuple to be added.
      */
     void AddAssociationTuple(const AssociationTuple& tuple);
 
     /**
-     * \brief Removes a host network association tuple to the Association Set.
+     * @brief Removes a host network association tuple to the Association Set.
      *
-     * \param tuple The host network association tuple to be removed.
+     * @param tuple The host network association tuple to be removed.
      */
     void RemoveAssociationTuple(const AssociationTuple& tuple);
 
     /**
-     * \brief Processes a HELLO message following \RFC{3626} specification.
+     * @brief Processes a HELLO message following \RFC{3626} specification.
      *
      * Link sensing and population of the Neighbor Set, 2-hop Neighbor Set and MPR
      * Selector Set are performed.
      *
-     * \param msg the %OLSR message which contains the HELLO message.
-     * \param receiverIface the address of the interface where the message was received from.
-     * \param senderIface the address of the interface where the message was sent from.
+     * @param msg the %OLSR message which contains the HELLO message.
+     * @param receiverIface the address of the interface where the message was received from.
+     * @param senderIface the address of the interface where the message was sent from.
      */
     void ProcessHello(const olsr::MessageHeader& msg,
                       const Ipv4Address& receiverIface,
                       const Ipv4Address& senderIface);
 
     /**
-     * \brief Processes a TC message following \RFC{3626} specification.
+     * @brief Processes a TC message following \RFC{3626} specification.
      *
      * The Topology Set is updated (if needed) with the information of
      * the received TC message.
      *
-     * \param msg The %OLSR message which contains the TC message.
-     * \param senderIface The address of the interface where the message was sent from.
+     * @param msg The %OLSR message which contains the TC message.
+     * @param senderIface The address of the interface where the message was sent from.
      *
      */
     void ProcessTc(const olsr::MessageHeader& msg, const Ipv4Address& senderIface);
 
     /**
-     * \brief Processes a MID message following \RFC{3626} specification.
+     * @brief Processes a MID message following \RFC{3626} specification.
      *
      * The Interface Association Set is updated (if needed) with the information
      * of the received MID message.
      *
-     * \param msg the %OLSR message which contains the MID message.
-     * \param senderIface the address of the interface where the message was sent from.
+     * @param msg the %OLSR message which contains the MID message.
+     * @param senderIface the address of the interface where the message was sent from.
      */
     void ProcessMid(const olsr::MessageHeader& msg, const Ipv4Address& senderIface);
 
     /**
      *
-     * \brief Processes a HNA message following \RFC{3626} specification.
+     * @brief Processes a HNA message following \RFC{3626} specification.
      *
      * The Host Network Association Set is updated (if needed) with the information
      * of the received HNA message.
      *
-     * \param msg the %OLSR message which contains the HNA message.
-     * \param senderIface the address of the interface where the message was sent from.
+     * @param msg the %OLSR message which contains the HNA message.
+     * @param senderIface the address of the interface where the message was sent from.
      *
      */
     void ProcessHna(const olsr::MessageHeader& msg, const Ipv4Address& senderIface);
 
     /**
-     * \brief Updates Link Set according to a new received HELLO message
+     * @brief Updates Link Set according to a new received HELLO message
      * (following \RFC{3626} specification). Neighbor Set is also updated if needed.
-     * \param msg The received message.
-     * \param hello The received HELLO sub-message.
-     * \param receiverIface The interface that received the message.
-     * \param senderIface The sender interface.
+     * @param msg The received message.
+     * @param hello The received HELLO sub-message.
+     * @param receiverIface The interface that received the message.
+     * @param senderIface The sender interface.
      */
     void LinkSensing(const olsr::MessageHeader& msg,
                      const olsr::MessageHeader::Hello& hello,
@@ -771,28 +771,28 @@
                      const Ipv4Address& senderIface);
 
     /**
-     * \brief Updates the Neighbor Set according to the information contained in
+     * @brief Updates the Neighbor Set according to the information contained in
      * a new received HELLO message (following \RFC{3626}).
-     * \param msg The received message.
-     * \param hello The received HELLO sub-message.
+     * @param msg The received message.
+     * @param hello The received HELLO sub-message.
      */
     void PopulateNeighborSet(const olsr::MessageHeader& msg,
                              const olsr::MessageHeader::Hello& hello);
 
     /**
-     * \brief Updates the 2-hop Neighbor Set according to the information contained
+     * @brief Updates the 2-hop Neighbor Set according to the information contained
      * in a new received HELLO message (following \RFC{3626}).
-     * \param msg The received message.
-     * \param hello The received HELLO sub-message.
+     * @param msg The received message.
+     * @param hello The received HELLO sub-message.
      */
     void PopulateTwoHopNeighborSet(const olsr::MessageHeader& msg,
                                    const olsr::MessageHeader::Hello& hello);
 
     /**
-     * \brief Updates the MPR Selector Set according to the information contained in
+     * @brief Updates the MPR Selector Set according to the information contained in
      * a new received HELLO message (following \RFC{3626}).
-     * \param msg The received message.
-     * \param hello The received HELLO sub-message.
+     * @param msg The received message.
+     * @param hello The received HELLO sub-message.
      */
     void PopulateMprSelectorSet(const olsr::MessageHeader& msg,
                                 const olsr::MessageHeader::Hello& hello);
@@ -801,8 +801,8 @@
 
     /**
      * Check that address is one of my interfaces.
-     * \param a the address to check.
-     * \return true if the address is own by the node.
+     * @param a the address to check.
+     * @return true if the address is own by the node.
      */
     bool IsMyOwnAddress(const Ipv4Address& a) const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/olsr/model/olsr-state.cc ns-3.44/src/olsr/model/olsr-state.cc
--- ns-3.43/src/olsr/model/olsr-state.cc	2024-10-09 16:41:10.076656600 -0700
+++ ns-3.44/src/olsr/model/olsr-state.cc	2025-03-09 16:55:49.683372300 -0700
@@ -9,8 +9,8 @@
  */
 
 ///
-/// \file olsr-state.cc
-/// \brief Implementation of all functions needed for manipulating the internal
+/// @file olsr-state.cc
+/// @brief Implementation of all functions needed for manipulating the internal
 ///        state of an OLSR node.
 ///
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/olsr/model/olsr-state.h ns-3.44/src/olsr/model/olsr-state.h
--- ns-3.43/src/olsr/model/olsr-state.h	2024-10-09 16:41:10.076656600 -0700
+++ ns-3.44/src/olsr/model/olsr-state.h	2025-03-09 16:55:49.683372300 -0700
@@ -18,7 +18,7 @@
 namespace olsr
 {
 
-/// \ingroup olsr
+/// @ingroup olsr
 /// This class encapsulates all data structures needed for maintaining internal state of an OLSR
 /// node.
 class OlsrState
@@ -48,7 +48,7 @@
 
     /**
      * Gets the MPR selectors.
-     * \returns The MPR selectors.
+     * @returns The MPR selectors.
      */
     const MprSelectorSet& GetMprSelectors() const
     {
@@ -57,32 +57,32 @@
 
     /**
      * Finds a MPR selector tuple.
-     * \param mainAddr The MPR selector main address.
-     * \returns The MPR selector, if found. Else it returns a null pointer.
+     * @param mainAddr The MPR selector main address.
+     * @returns The MPR selector, if found. Else it returns a null pointer.
      */
     MprSelectorTuple* FindMprSelectorTuple(const Ipv4Address& mainAddr);
 
     /**
      * Erases a MPR selector tuple.
-     * \param tuple The MPR selector tuple.
+     * @param tuple The MPR selector tuple.
      */
     void EraseMprSelectorTuple(const MprSelectorTuple& tuple);
 
     /**
      * Erases all MPR selector tuples belonging to the same address.
-     * \param mainAddr The MPR selector main address.
+     * @param mainAddr The MPR selector main address.
      */
     void EraseMprSelectorTuples(const Ipv4Address& mainAddr);
 
     /**
      * Inserts a MPR selector tuple
-     * \param tuple The MPR selector tuple.
+     * @param tuple The MPR selector tuple.
      */
     void InsertMprSelectorTuple(const MprSelectorTuple& tuple);
 
     /**
      * Prints the MPR selector sets.
-     * \return a string with the output data.
+     * @return a string with the output data.
      */
     std::string PrintMprSelectorSet() const;
 
@@ -90,7 +90,7 @@
 
     /**
      * Gets the neighbor set.
-     * \returns The neighbor set.
+     * @returns The neighbor set.
      */
     const NeighborSet& GetNeighbors() const
     {
@@ -99,7 +99,7 @@
 
     /**
      * Gets the neighbor set.
-     * \returns The neighbor set.
+     * @returns The neighbor set.
      */
     NeighborSet& GetNeighbors()
     {
@@ -108,40 +108,40 @@
 
     /**
      * Finds a neighbor tuple.
-     * \param mainAddr The neighbor tuple main address.
-     * \returns The neighbor tuple, if found. Else it returns a null pointer.
+     * @param mainAddr The neighbor tuple main address.
+     * @returns The neighbor tuple, if found. Else it returns a null pointer.
      */
     NeighborTuple* FindNeighborTuple(const Ipv4Address& mainAddr);
 
     /**
      * Finds a symmetrical neighbor tuple.
-     * \param mainAddr The neighbor tuple main address.
-     * \returns The neighbor tuple, if found. Else it returns a null pointer.
+     * @param mainAddr The neighbor tuple main address.
+     * @returns The neighbor tuple, if found. Else it returns a null pointer.
      */
     const NeighborTuple* FindSymNeighborTuple(const Ipv4Address& mainAddr) const;
 
     /**
      * Finds a neighbor tuple.
-     * \param mainAddr The neighbor tuple main address.
-     * \param willingness The neighbor willingness.
-     * \returns The neighbor tuple, if found. Else it returns a null pointer.
+     * @param mainAddr The neighbor tuple main address.
+     * @param willingness The neighbor willingness.
+     * @returns The neighbor tuple, if found. Else it returns a null pointer.
      */
     NeighborTuple* FindNeighborTuple(const Ipv4Address& mainAddr, Willingness willingness);
 
     /**
      * Erases a neighbor tuple.
-     * \param neighborTuple The neighbor tuple.
+     * @param neighborTuple The neighbor tuple.
      */
     void EraseNeighborTuple(const NeighborTuple& neighborTuple);
     /**
      * Erases a neighbor tuple.
-     * \param mainAddr The neighbor tuple main address.
+     * @param mainAddr The neighbor tuple main address.
      */
     void EraseNeighborTuple(const Ipv4Address& mainAddr);
 
     /**
      * Inserts a neighbor tuple.
-     * \param tuple The neighbor tuple.
+     * @param tuple The neighbor tuple.
      */
     void InsertNeighborTuple(const NeighborTuple& tuple);
 
@@ -149,7 +149,7 @@
 
     /**
      * Gets the 2-hop neighbor set.
-     * \returns The 2-hop neighbor set.
+     * @returns The 2-hop neighbor set.
      */
     const TwoHopNeighborSet& GetTwoHopNeighbors() const
     {
@@ -158,7 +158,7 @@
 
     /**
      * Gets the 2-hop neighbor set.
-     * \returns The 2-hop neighbor set.
+     * @returns The 2-hop neighbor set.
      */
     TwoHopNeighborSet& GetTwoHopNeighbors()
     {
@@ -167,32 +167,32 @@
 
     /**
      * Finds a 2-hop neighbor tuple.
-     * \param neighbor The neighbor main address.
-     * \param twoHopNeighbor The 2-hop neighbor main address.
-     * \returns The 2-hop neighbor tuple, if found. Else it returns a null pointer.
+     * @param neighbor The neighbor main address.
+     * @param twoHopNeighbor The 2-hop neighbor main address.
+     * @returns The 2-hop neighbor tuple, if found. Else it returns a null pointer.
      */
     TwoHopNeighborTuple* FindTwoHopNeighborTuple(const Ipv4Address& neighbor,
                                                  const Ipv4Address& twoHopNeighbor);
 
     /**
      * Erases a 2-hop neighbor tuple.
-     * \param tuple The 2-hop neighbor tuple.
+     * @param tuple The 2-hop neighbor tuple.
      */
     void EraseTwoHopNeighborTuple(const TwoHopNeighborTuple& tuple);
     /**
      * Erases the 2-hop neighbor tuples with the same 1-hop neighbor.
-     * \param neighbor The neighbor address.
+     * @param neighbor The neighbor address.
      */
     void EraseTwoHopNeighborTuples(const Ipv4Address& neighbor);
     /**
      * Erases the 2-hop neighbor tuples with matching predicates.
-     * \param neighbor The neighbor address.
-     * \param twoHopNeighbor The 2-hop neighbor main address.
+     * @param neighbor The neighbor address.
+     * @param twoHopNeighbor The 2-hop neighbor main address.
      */
     void EraseTwoHopNeighborTuples(const Ipv4Address& neighbor, const Ipv4Address& twoHopNeighbor);
     /**
      * Inserts a 2-hop neighbor tuple.
-     * \param tuple The 2-hop neighbor tuple.
+     * @param tuple The 2-hop neighbor tuple.
      */
     void InsertTwoHopNeighborTuple(const TwoHopNeighborTuple& tuple);
 
@@ -200,20 +200,20 @@
 
     /**
      * Checks if there's an MPR with a specific address.
-     * \param address The address to test.
-     * \return True if a MPR with the specified address exists.
+     * @param address The address to test.
+     * @return True if a MPR with the specified address exists.
      */
     bool FindMprAddress(const Ipv4Address& address);
 
     /**
      * Sets the MPR set to the one specified.
-     * \param mprSet The new MPR set.
+     * @param mprSet The new MPR set.
      */
     void SetMprSet(MprSet mprSet);
 
     /**
      * Gets the MPR set.
-     * \return The MPR set.
+     * @return The MPR set.
      */
     MprSet GetMprSet() const;
 
@@ -221,20 +221,20 @@
 
     /**
      * Finds a duplicate tuple.
-     * \param address The duplicate tuple address.
-     * \param sequenceNumber The duplicate tuple sequence number.
-     * \returns The duplicate tuple, or a null pointer if no match.
+     * @param address The duplicate tuple address.
+     * @param sequenceNumber The duplicate tuple sequence number.
+     * @returns The duplicate tuple, or a null pointer if no match.
      */
     DuplicateTuple* FindDuplicateTuple(const Ipv4Address& address, uint16_t sequenceNumber);
 
     /**
      * Erases a duplicate tuple.
-     * \param tuple The tuple to erase.
+     * @param tuple The tuple to erase.
      */
     void EraseDuplicateTuple(const DuplicateTuple& tuple);
     /**
      * Inserts a duplicate tuple.
-     * \param tuple The tuple to insert.
+     * @param tuple The tuple to insert.
      */
     void InsertDuplicateTuple(const DuplicateTuple& tuple);
 
@@ -242,7 +242,7 @@
 
     /**
      * Gets the Link set.
-     * \return The Link set.
+     * @return The Link set.
      */
     const LinkSet& GetLinks() const
     {
@@ -251,26 +251,26 @@
 
     /**
      * Finds a link tuple.
-     * \param ifaceAddr The interface address of the link.
-     * \returns The link tuple, or a null pointer if no match.
+     * @param ifaceAddr The interface address of the link.
+     * @returns The link tuple, or a null pointer if no match.
      */
     LinkTuple* FindLinkTuple(const Ipv4Address& ifaceAddr);
     /**
      * Finds a symmetrical link tuple.
-     * \param ifaceAddr The interface address of the link.
-     * \param time The time at which the link should be considered symmetrical.
-     * \returns The link tuple, or a null pointer if no match.
+     * @param ifaceAddr The interface address of the link.
+     * @param time The time at which the link should be considered symmetrical.
+     * @returns The link tuple, or a null pointer if no match.
      */
     LinkTuple* FindSymLinkTuple(const Ipv4Address& ifaceAddr, Time time);
     /**
      * Erases a link tuple.
-     * \param tuple The tuple to erase.
+     * @param tuple The tuple to erase.
      */
     void EraseLinkTuple(const LinkTuple& tuple);
     /**
      * Inserts a link tuple.
-     * \param tuple The tuple to insert.
-     * \returns A reference to the inserted tuple.
+     * @param tuple The tuple to insert.
+     * @returns A reference to the inserted tuple.
      */
     LinkTuple& InsertLinkTuple(const LinkTuple& tuple);
 
@@ -278,7 +278,7 @@
 
     /**
      * Gets the topology set.
-     * \returns The topology set.
+     * @returns The topology set.
      */
     const TopologySet& GetTopologySet() const
     {
@@ -287,32 +287,32 @@
 
     /**
      * Finds a topology tuple.
-     * \param destAddr The destination address.
-     * \param lastAddr The address of the node previous to the destination.
-     * \returns The topology tuple, or a null pointer if no match.
+     * @param destAddr The destination address.
+     * @param lastAddr The address of the node previous to the destination.
+     * @returns The topology tuple, or a null pointer if no match.
      */
     TopologyTuple* FindTopologyTuple(const Ipv4Address& destAddr, const Ipv4Address& lastAddr);
     /**
      * Finds a topology tuple.
-     * \param lastAddr The address of the node previous to the destination.
-     * \param ansn The Advertised Neighbor Sequence Number.
-     * \returns The topology tuple, or a null pointer if no match.
+     * @param lastAddr The address of the node previous to the destination.
+     * @param ansn The Advertised Neighbor Sequence Number.
+     * @returns The topology tuple, or a null pointer if no match.
      */
     TopologyTuple* FindNewerTopologyTuple(const Ipv4Address& lastAddr, uint16_t ansn);
     /**
      * Erases a topology tuple.
-     * \param tuple The tuple to erase.
+     * @param tuple The tuple to erase.
      */
     void EraseTopologyTuple(const TopologyTuple& tuple);
     /**
      * Erases a topology tuple.
-     * \param lastAddr The address of the node previous to the destination.
-     * \param ansn The Advertised Neighbor Sequence Number.
+     * @param lastAddr The address of the node previous to the destination.
+     * @param ansn The Advertised Neighbor Sequence Number.
      */
     void EraseOlderTopologyTuples(const Ipv4Address& lastAddr, uint16_t ansn);
     /**
      * Inserts a topology tuple.
-     * \param tuple The tuple to insert.
+     * @param tuple The tuple to insert.
      */
     void InsertTopologyTuple(const TopologyTuple& tuple);
 
@@ -320,7 +320,7 @@
 
     /**
      * Gets the interface association set.
-     * \returns The interface association set.
+     * @returns The interface association set.
      */
     const IfaceAssocSet& GetIfaceAssocSet() const
     {
@@ -329,7 +329,7 @@
 
     /**
      * Gets a mutable reference to the interface association set.
-     * \returns The interface association set.
+     * @returns The interface association set.
      */
     IfaceAssocSet& GetIfaceAssocSetMutable()
     {
@@ -338,31 +338,31 @@
 
     /**
      * Finds a interface association tuple.
-     * \param ifaceAddr The interface address.
-     * \returns The interface association  tuple, or a null pointer if no match.
+     * @param ifaceAddr The interface address.
+     * @returns The interface association  tuple, or a null pointer if no match.
      */
     IfaceAssocTuple* FindIfaceAssocTuple(const Ipv4Address& ifaceAddr);
     /**
      * Finds a interface association tuple.
-     * \param ifaceAddr The interface address.
-     * \returns The interface association  tuple, or a null pointer if no match.
+     * @param ifaceAddr The interface address.
+     * @returns The interface association  tuple, or a null pointer if no match.
      */
     const IfaceAssocTuple* FindIfaceAssocTuple(const Ipv4Address& ifaceAddr) const;
     /**
      * Erases a interface association tuple.
-     * \param tuple The tuple to erase.
+     * @param tuple The tuple to erase.
      */
     void EraseIfaceAssocTuple(const IfaceAssocTuple& tuple);
     /**
      * Inserts a interface association tuple.
-     * \param tuple The tuple to insert.
+     * @param tuple The tuple to insert.
      */
     void InsertIfaceAssocTuple(const IfaceAssocTuple& tuple);
 
     // Host-Network Association
     /**
      * Gets the association set known to the node.
-     * \returns The association set known to the node.
+     * @returns The association set known to the node.
      */
     const AssociationSet& GetAssociationSet() const // Associations known to the node
     {
@@ -371,7 +371,7 @@
 
     /**
      * Gets the association set the node has.
-     * \returns The association set the node has.
+     * @returns The association set the node has.
      */
     const Associations& GetAssociations() const // Set of associations that the node has
     {
@@ -380,40 +380,40 @@
 
     /**
      * Finds an association tuple.
-     * \param gatewayAddr The gateway address.
-     * \param networkAddr The network address.
-     * \param netmask The network mask.
-     * \returns The association  tuple, or a null pointer if no match.
+     * @param gatewayAddr The gateway address.
+     * @param networkAddr The network address.
+     * @param netmask The network mask.
+     * @returns The association  tuple, or a null pointer if no match.
      */
     AssociationTuple* FindAssociationTuple(const Ipv4Address& gatewayAddr,
                                            const Ipv4Address& networkAddr,
                                            const Ipv4Mask& netmask);
     /**
      * Erases a known association tuple.
-     * \param tuple The tuple to erase.
+     * @param tuple The tuple to erase.
      */
     void EraseAssociationTuple(const AssociationTuple& tuple);
     /**
      * Inserts a known association tuple.
-     * \param tuple The tuple to insert.
+     * @param tuple The tuple to insert.
      */
     void InsertAssociationTuple(const AssociationTuple& tuple);
     /**
      * Erases an association.
-     * \param tuple The tuple to erase.
+     * @param tuple The tuple to erase.
      */
     void EraseAssociation(const Association& tuple);
     /**
      * Inserts an association tuple.
-     * \param tuple The tuple to insert.
+     * @param tuple The tuple to insert.
      */
     void InsertAssociation(const Association& tuple);
 
     /**
      * Returns a vector of all interfaces of a given neighbor, with the
      * exception of the "main" one.
-     * \param neighborMainAddr The neighbor main address
-     * \returns A container of the neighbor addresses (excluding the main one).
+     * @param neighborMainAddr The neighbor main address
+     * @returns A container of the neighbor addresses (excluding the main one).
      */
     std::vector<Ipv4Address> FindNeighborInterfaces(const Ipv4Address& neighborMainAddr) const;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/olsr/test/bug780-test.cc ns-3.44/src/olsr/test/bug780-test.cc
--- ns-3.43/src/olsr/test/bug780-test.cc	2024-10-09 16:41:10.076656600 -0700
+++ ns-3.44/src/olsr/test/bug780-test.cc	2025-03-09 16:55:49.683372300 -0700
@@ -34,7 +34,7 @@
 
 Bug780Test::Bug780Test()
     : TestCase("Test OLSR bug 780"),
-      m_time(Seconds(200.0)),
+      m_time(Seconds(200)),
       m_seq(0),
       m_recvCount(0)
 {
@@ -89,8 +89,8 @@
     Ptr<SimpleNetDevice> nd2 = DynamicCast<SimpleNetDevice>(nd.Get(2));
     Ptr<SimpleChannel> ch = DynamicCast<SimpleChannel>(nd.Get(0)->GetChannel());
 
-    Simulator::Schedule(Seconds(100.0), &SimpleChannel::BlackList, ch, nd0, nd2);
-    Simulator::Schedule(Seconds(100.0), &SimpleChannel::BlackList, ch, nd2, nd0);
+    Simulator::Schedule(Seconds(100), &SimpleChannel::BlackList, ch, nd0, nd2);
+    Simulator::Schedule(Seconds(100), &SimpleChannel::BlackList, ch, nd2, nd0);
 
     // 3. Setup ping
     m_socket = Socket::CreateSocket(c.Get(0), TypeId::LookupByName("ns3::Ipv4RawSocketFactory"));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/olsr/test/bug780-test.h ns-3.44/src/olsr/test/bug780-test.h
--- ns-3.43/src/olsr/test/bug780-test.h	2024-10-09 16:41:10.076656600 -0700
+++ ns-3.44/src/olsr/test/bug780-test.h	2025-03-09 16:55:49.683372300 -0700
@@ -21,8 +21,8 @@
 {
 
 /**
- * \ingroup olsr-test
- * \ingroup tests
+ * @ingroup olsr-test
+ * @ingroup tests
  *
  * See \bugid{780}
  */
@@ -42,7 +42,7 @@
     void SendPing();
     /**
      * Receive echo reply
-     * \param socket the socket
+     * @param socket the socket
      */
     void Receive(Ptr<Socket> socket);
     /// Socket
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/olsr/test/hello-regression-test.h ns-3.44/src/olsr/test/hello-regression-test.h
--- ns-3.43/src/olsr/test/hello-regression-test.h	2024-10-09 16:41:10.076656600 -0700
+++ ns-3.44/src/olsr/test/hello-regression-test.h	2025-03-09 16:55:49.683372300 -0700
@@ -20,10 +20,10 @@
 namespace olsr
 {
 /**
- * \ingroup olsr-test
- * \ingroup tests
+ * @ingroup olsr-test
+ * @ingroup tests
  *
- * \brief Trivial (still useful) test of OLSR operation
+ * @brief Trivial (still useful) test of OLSR operation
  *
  * This test creates 2 stations with point-to-point link and runs OLSR without any extra traffic.
  * It is expected that only HELLO messages will be sent.
@@ -54,7 +54,7 @@
 
     /**
      * Receive raw data on node A
-     * \param socket receiving socket
+     * @param socket receiving socket
      */
     void ReceivePktProbeA(Ptr<Socket> socket);
     /// Packet counter on node A
@@ -63,7 +63,7 @@
     Ptr<Ipv4RawSocketImpl> m_rxSocketA;
     /**
      * Receive raw data on node B
-     * \param socket receiving socket
+     * @param socket receiving socket
      */
     void ReceivePktProbeB(Ptr<Socket> socket);
     /// Packet counter on node B
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/olsr/test/olsr-header-test-suite.cc ns-3.44/src/olsr/test/olsr-header-test-suite.cc
--- ns-3.43/src/olsr/test/olsr-header-test-suite.cc	2024-10-09 16:41:10.076656600 -0700
+++ ns-3.44/src/olsr/test/olsr-header-test-suite.cc	2025-03-09 16:55:49.683372300 -0700
@@ -14,8 +14,8 @@
 using namespace ns3;
 
 /**
- * \ingroup olsr-test
- * \ingroup tests
+ * @ingroup olsr-test
+ * @ingroup tests
  *
  * Check Emf olsr time conversion
  */
@@ -43,8 +43,8 @@
 }
 
 /**
- * \ingroup olsr-test
- * \ingroup tests
+ * @ingroup olsr-test
+ * @ingroup tests
  *
  * Check Mid olsr messages
  */
@@ -156,8 +156,8 @@
 }
 
 /**
- * \ingroup olsr-test
- * \ingroup tests
+ * @ingroup olsr-test
+ * @ingroup tests
  *
  * Check Hello olsr messages
  */
@@ -227,8 +227,8 @@
 }
 
 /**
- * \ingroup olsr-test
- * \ingroup tests
+ * @ingroup olsr-test
+ * @ingroup tests
  *
  * Check Tc olsr messages
  */
@@ -270,8 +270,8 @@
 }
 
 /**
- * \ingroup olsr-test
- * \ingroup tests
+ * @ingroup olsr-test
+ * @ingroup tests
  *
  * Check Hna olsr messages
  */
@@ -316,8 +316,8 @@
 }
 
 /**
- * \ingroup olsr-test
- * \ingroup tests
+ * @ingroup olsr-test
+ * @ingroup tests
  *
  * Check olsr header messages
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/olsr/test/olsr-routing-protocol-test-suite.cc ns-3.44/src/olsr/test/olsr-routing-protocol-test-suite.cc
--- ns-3.43/src/olsr/test/olsr-routing-protocol-test-suite.cc	2024-10-09 16:41:10.076656600 -0700
+++ ns-3.44/src/olsr/test/olsr-routing-protocol-test-suite.cc	2025-03-09 16:55:49.683372300 -0700
@@ -14,16 +14,16 @@
 #include "ns3/test.h"
 
 /**
- * \ingroup olsr
- * \defgroup olsr-test olsr module tests
+ * @ingroup olsr
+ * @defgroup olsr-test olsr module tests
  */
 
 using namespace ns3;
 using namespace olsr;
 
 /**
- * \ingroup olsr-test
- * \ingroup tests
+ * @ingroup olsr-test
+ * @ingroup tests
  *
  * Testcase for MPR computation mechanism
  */
@@ -164,8 +164,8 @@
 }
 
 /**
- * \ingroup olsr-test
- * \ingroup tests
+ * @ingroup olsr-test
+ * @ingroup tests
  *
  * OLSR protocol test suite
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/olsr/test/regression-test-suite.cc ns-3.44/src/olsr/test/regression-test-suite.cc
--- ns-3.43/src/olsr/test/regression-test-suite.cc	2024-10-09 16:41:10.076656600 -0700
+++ ns-3.44/src/olsr/test/regression-test-suite.cc	2025-03-09 16:55:49.683372300 -0700
@@ -14,8 +14,8 @@
 using namespace olsr;
 
 /**
- * \ingroup olsr-test
- * \ingroup tests
+ * @ingroup olsr-test
+ * @ingroup tests
  *
  * Various olsr regression tests
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/olsr/test/tc-regression-test.h ns-3.44/src/olsr/test/tc-regression-test.h
--- ns-3.43/src/olsr/test/tc-regression-test.h	2024-10-09 16:41:10.076656600 -0700
+++ ns-3.44/src/olsr/test/tc-regression-test.h	2025-03-09 16:55:49.683372300 -0700
@@ -20,10 +20,10 @@
 namespace olsr
 {
 /**
- * \ingroup olsr-test
- * \ingroup tests
+ * @ingroup olsr-test
+ * @ingroup tests
  *
- * \brief Less trivial test of OLSR Topology Control message generation
+ * @brief Less trivial test of OLSR Topology Control message generation
  *
  * This test simulates 3 Wi-Fi stations with chain topology and runs OLSR without any extra traffic.
  * It is expected that only second station will send TC messages.
@@ -83,7 +83,7 @@
 
     /**
      * Receive raw data on node A
-     * \param socket receiving socket
+     * @param socket receiving socket
      */
     void ReceivePktProbeA(Ptr<Socket> socket);
     /// Packet counter on node A
@@ -93,7 +93,7 @@
 
     /**
      * Receive raw data on node B
-     * \param socket receiving socket
+     * @param socket receiving socket
      */
     void ReceivePktProbeB(Ptr<Socket> socket);
     /// Packet counter on node B
@@ -103,7 +103,7 @@
 
     /**
      * Receive raw data on node C
-     * \param socket receiving socket
+     * @param socket receiving socket
      */
     void ReceivePktProbeC(Ptr<Socket> socket);
     /// Packet counter on node C
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/openflow/examples/openflow-switch.cc ns-3.44/src/openflow/examples/openflow-switch.cc
--- ns-3.43/src/openflow/examples/openflow-switch.cc	2024-10-09 16:41:10.076656600 -0700
+++ ns-3.44/src/openflow/examples/openflow-switch.cc	2025-03-09 16:55:49.683372300 -0700
@@ -41,7 +41,7 @@
 
 bool verbose = false;
 bool use_drop = false;
-ns3::Time timeout = ns3::Seconds(0);
+ns3::Time timeout;
 
 bool
 SetVerbose(const std::string& value)
@@ -166,14 +166,14 @@
 
     ApplicationContainer app = onoff.Install(terminals.Get(0));
     // Start the application
-    app.Start(Seconds(1.0));
-    app.Stop(Seconds(10.0));
+    app.Start(Seconds(1));
+    app.Stop(Seconds(10));
 
     // Create an optional packet sink to receive these packets
     PacketSinkHelper sink("ns3::UdpSocketFactory",
                           Address(InetSocketAddress(Ipv4Address::GetAny(), port)));
     app = sink.Install(terminals.Get(1));
-    app.Start(Seconds(0.0));
+    app.Start(Seconds(0));
 
     //
     // Create a similar flow from n3 to n0, starting at time 1.1 seconds
@@ -181,10 +181,10 @@
     onoff.SetAttribute("Remote", AddressValue(InetSocketAddress(Ipv4Address("10.1.1.1"), port)));
     app = onoff.Install(terminals.Get(3));
     app.Start(Seconds(1.1));
-    app.Stop(Seconds(10.0));
+    app.Stop(Seconds(10));
 
     app = sink.Install(terminals.Get(0));
-    app.Start(Seconds(0.0));
+    app.Start(Seconds(0));
 
     NS_LOG_INFO("Configure Tracing.");
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/openflow/examples/openflow-switch.py ns-3.44/src/openflow/examples/openflow-switch.py
--- ns-3.43/src/openflow/examples/openflow-switch.py	2024-10-09 16:41:10.076656600 -0700
+++ ns-3.44/src/openflow/examples/openflow-switch.py	2025-03-09 16:55:49.683372300 -0700
@@ -63,24 +63,24 @@
 
 app = onoff.Install(terminals.Get(0))
 
-app.Start(ns.Seconds(1.0))
-app.Stop(ns.Seconds(10.0))
+app.Start(ns.Seconds(1))
+app.Stop(ns.Seconds(10))
 
 sink = ns.PacketSinkHelper(
     "ns3::UdpSocketFactory", ns.InetSocketAddress(ns.Ipv4Address.GetAny(), port).ConvertTo()
 )
 app = sink.Install(terminals.Get(1))
-app.Start(ns.Seconds(0.0))
+app.Start(ns.Seconds(0))
 
 onoff.SetAttribute(
     "Remote", ns.AddressValue(ns.InetSocketAddress(ns.Ipv4Address("10.1.1.1"), port).ConvertTo())
 )
 app = onoff.Install(terminals.Get(3))
 app.Start(ns.Seconds(1.1))
-app.Stop(ns.Seconds(10.0))
+app.Stop(ns.Seconds(10))
 
 app = sink.Install(terminals.Get(0))
-app.Start(ns.Seconds(0.0))
+app.Start(ns.Seconds(0))
 
 ns.Simulator.Run()
 ns.Simulator.Destroy()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/openflow/helper/openflow-switch-helper.h ns-3.44/src/openflow/helper/openflow-switch-helper.h
--- ns-3.43/src/openflow/helper/openflow-switch-helper.h	2024-10-09 16:41:10.076656600 -0700
+++ ns-3.44/src/openflow/helper/openflow-switch-helper.h	2025-03-09 16:55:49.683372300 -0700
@@ -22,7 +22,7 @@
 class Controller;
 
 /**
- * \brief Add capability to switch multiple LAN segments (IEEE 802.1D bridging)
+ * @brief Add capability to switch multiple LAN segments (IEEE 802.1D bridging)
  */
 class OpenFlowSwitchHelper
 {
@@ -36,8 +36,8 @@
      * Set an attribute on each ns3::OpenFlowSwitchNetDevice created by
      * OpenFlowSwitchHelper::Install
      *
-     * \param n1 the name of the attribute to set
-     * \param v1 the value of the attribute to set
+     * @param n1 the name of the attribute to set
+     * @param v1 the value of the attribute to set
      */
     void SetDeviceAttribute(std::string n1, const AttributeValue& v1);
 
@@ -48,10 +48,10 @@
      * switch, and sets up a controller connection using the provided
      * Controller.
      *
-     * \param node The node to install the device in
-     * \param c Container of NetDevices to add as switch ports
-     * \param controller The controller connection.
-     * \returns A container holding the added net device.
+     * @param node The node to install the device in
+     * @param c Container of NetDevices to add as switch ports
+     * @param controller The controller connection.
+     * @returns A container holding the added net device.
      */
     NetDeviceContainer Install(Ptr<Node> node,
                                NetDeviceContainer c,
@@ -63,9 +63,9 @@
      * to the node, and attaches the given NetDevices as ports of the
      * switch.
      *
-     * \param node The node to install the device in
-     * \param c Container of NetDevices to add as switch ports
-     * \returns A container holding the added net device.
+     * @param node The node to install the device in
+     * @param c Container of NetDevices to add as switch ports
+     * @returns A container holding the added net device.
      */
     NetDeviceContainer Install(Ptr<Node> node, NetDeviceContainer c);
 
@@ -75,9 +75,9 @@
      * to the node, and attaches the given NetDevices as ports of the
      * switch.
      *
-     * \param nodeName The name of the node to install the device in
-     * \param c Container of NetDevices to add as switch ports
-     * \returns A container holding the added net device.
+     * @param nodeName The name of the node to install the device in
+     * @param c Container of NetDevices to add as switch ports
+     * @returns A container holding the added net device.
      */
     NetDeviceContainer Install(std::string nodeName, NetDeviceContainer c);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/openflow/model/openflow-interface.h ns-3.44/src/openflow/model/openflow-interface.h
--- ns-3.43/src/openflow/model/openflow-interface.h	2024-10-09 16:41:10.076656600 -0700
+++ ns-3.44/src/openflow/model/openflow-interface.h	2025-03-09 16:55:49.683372300 -0700
@@ -95,8 +95,8 @@
 {
 
 /**
- * \ingroup openflow
- * \brief Port and its metadata.
+ * @ingroup openflow
+ * @brief Port and its metadata.
  *
  * We need to store port metadata, because OpenFlow dictates that there
  * exists a type of request where the Controller asks for data about a
@@ -130,7 +130,7 @@
 };
 
 /**
- * \ingroup openflow
+ * @ingroup openflow
  * OpenFlow statistics
  */
 class Stats
@@ -138,43 +138,43 @@
   public:
     /**
      * Constructor
-     * \param _type OpenFlow stats type.
-     * \param body_len Stat body length.
+     * @param _type OpenFlow stats type.
+     * @param body_len Stat body length.
      */
     Stats(ofp_stats_types _type, size_t body_len);
 
     /**
-     * \brief Prepares to dump some kind of statistics on the connected OpenFlowSwitchNetDevice.
+     * @brief Prepares to dump some kind of statistics on the connected OpenFlowSwitchNetDevice.
      *
-     * \param body Body member of the struct ofp_stats_request.
-     * \param body_len Length of the body member.
-     * \param state State information.
-     * \return 0 if successful, otherwise a negative error code.
+     * @param body Body member of the struct ofp_stats_request.
+     * @param body_len Length of the body member.
+     * @param state State information.
+     * @return 0 if successful, otherwise a negative error code.
      */
     int DoInit(const void* body, int body_len, void** state);
 
     /**
-     * \brief Appends statistics for OpenFlowSwitchNetDevice to 'buffer'.
+     * @brief Appends statistics for OpenFlowSwitchNetDevice to 'buffer'.
      *
-     * \param swtch The OpenFlowSwitchNetDevice this callback is associated with.
-     * \param state State information.
-     * \param buffer Buffer to append stats reply to.
-     * \return 1 if it should be called again later with another buffer, 0 if it is done, or a
+     * @param swtch The OpenFlowSwitchNetDevice this callback is associated with.
+     * @param state State information.
+     * @param buffer Buffer to append stats reply to.
+     * @return 1 if it should be called again later with another buffer, 0 if it is done, or a
      * negative errno value on failure.
      */
     int DoDump(Ptr<OpenFlowSwitchNetDevice> swtch, void* state, ofpbuf* buffer);
 
     /**
-     * \brief Cleans any state created by the init or dump functions.
+     * @brief Cleans any state created by the init or dump functions.
      *
      * May not be implemented if no cleanup is required.
      *
-     * \param state State information to clear.
+     * @param state State information to clear.
      */
     void DoCleanup(void* state);
 
     /**
-     * \brief State of the FlowStats request/reply.
+     * @brief State of the FlowStats request/reply.
      */
     struct FlowStatsState
     {
@@ -187,8 +187,8 @@
     };
 
     /**
-     * \ingroup openflow
-     * \brief State of the PortStats request/reply.
+     * @ingroup openflow
+     * @brief State of the PortStats request/reply.
      */
     struct PortStatsState
     {
@@ -200,19 +200,19 @@
   private:
     /**
      * Dumps the stats description
-     * \param [in] state The state.
-     * \param [out] buffer Output buffer.
-     * \return zero on success
+     * @param [in] state The state.
+     * @param [out] buffer Output buffer.
+     * @return zero on success
      */
     int DescStatsDump(void* state, ofpbuf* buffer);
 
     /**
      * @{
      * Initialize the stats.
-     * \param body Body member of the struct ofp_stats_request.
-     * \param body_len Length of the body member.
-     * \param state State information.
-     * \return 0 if successful, otherwise a negative error code.
+     * @param body Body member of the struct ofp_stats_request.
+     * @param body_len Length of the body member.
+     * @param state State information.
+     * @return 0 if successful, otherwise a negative error code.
      */
     int FlowStatsInit(const void* body, int body_len, void** state);
     int AggregateStatsInit(const void* body, int body_len, void** state);
@@ -227,10 +227,10 @@
     /**
      * @{
      * Dump the stats.
-     * \param dp OpenFlow NetDevice.
-     * \param state State.
-     * \param [out] buffer output buffer.
-     * \return 0 if successful
+     * @param dp OpenFlow NetDevice.
+     * @param state State.
+     * @param [out] buffer output buffer.
+     * @return 0 if successful
      */
     int FlowStatsDump(Ptr<OpenFlowSwitchNetDevice> dp, FlowStatsState* state, ofpbuf* buffer);
     int AggregateStatsDump(Ptr<OpenFlowSwitchNetDevice> dp,
@@ -243,25 +243,25 @@
 };
 
 /**
- * \ingroup openflow
- * \brief Class for handling flow table actions.
+ * @ingroup openflow
+ * @brief Class for handling flow table actions.
  */
 struct Action
 {
     /**
-     * \param type Type of Flow Table Action.
-     * \return true if the provided type is a type of flow table action.
+     * @param type Type of Flow Table Action.
+     * @return true if the provided type is a type of flow table action.
      */
     static bool IsValidType(ofp_action_type type);
 
     /**
-     * \brief Validates the action on whether its data is valid or not.
+     * @brief Validates the action on whether its data is valid or not.
      *
-     * \param type Type of action to validate.
-     * \param len Length of the action data.
-     * \param key Matching key for the flow that is tied to this action.
-     * \param ah Action's data header.
-     * \return ACT_VALIDATION_OK if the action checks out, otherwise an error type.
+     * @param type Type of action to validate.
+     * @param len Length of the action data.
+     * @param key Matching key for the flow that is tied to this action.
+     * @param ah Action's data header.
+     * @return ACT_VALIDATION_OK if the action checks out, otherwise an error type.
      */
     static uint16_t Validate(ofp_action_type type,
                              size_t len,
@@ -269,12 +269,12 @@
                              const ofp_action_header* ah);
 
     /**
-     * \brief Executes the action.
+     * @brief Executes the action.
      *
-     * \param type Type of action to execute.
-     * \param buffer Buffer of the Packet if it's needed for the action.
-     * \param key Matching key for the flow that is tied to this action.
-     * \param ah Action's data header.
+     * @param type Type of action to execute.
+     * @param buffer Buffer of the Packet if it's needed for the action.
+     * @param key Matching key for the flow that is tied to this action.
+     * @param ah Action's data header.
      */
     static void Execute(ofp_action_type type,
                         ofpbuf* buffer,
@@ -283,34 +283,34 @@
 };
 
 /**
- * \ingroup openflow
- * \brief Class for handling virtual port table actions.
+ * @ingroup openflow
+ * @brief Class for handling virtual port table actions.
  */
 struct VPortAction
 {
     /**
-     * \param type Type of virtual port table Action.
-     * \return true if the provided type is a type of virtual port table action.
+     * @param type Type of virtual port table Action.
+     * @return true if the provided type is a type of virtual port table action.
      */
     static bool IsValidType(ofp_vport_action_type type);
 
     /**
-     * \brief Validates the action on whether its data is valid or not.
+     * @brief Validates the action on whether its data is valid or not.
      *
-     * \param type Type of action to validate.
-     * \param len Length of the action data.
-     * \param ah Action's data header.
-     * \return ACT_VALIDATION_OK if the action checks out, otherwise an error type.
+     * @param type Type of action to validate.
+     * @param len Length of the action data.
+     * @param ah Action's data header.
+     * @return ACT_VALIDATION_OK if the action checks out, otherwise an error type.
      */
     static uint16_t Validate(ofp_vport_action_type type, size_t len, const ofp_action_header* ah);
 
     /**
-     * \brief Executes the action.
+     * @brief Executes the action.
      *
-     * \param type Type of action to execute.
-     * \param buffer Buffer of the Packet if it's needed for the action.
-     * \param key Matching key for the flow that is tied to this action.
-     * \param ah Action's data header.
+     * @param type Type of action to execute.
+     * @param buffer Buffer of the Packet if it's needed for the action.
+     * @param key Matching key for the flow that is tied to this action.
+     * @param ah Action's data header.
      */
     static void Execute(ofp_vport_action_type type,
                         ofpbuf* buffer,
@@ -319,33 +319,33 @@
 };
 
 /**
- * \ingroup openflow
- * \brief Class for handling Ericsson Vendor-defined actions.
+ * @ingroup openflow
+ * @brief Class for handling Ericsson Vendor-defined actions.
  */
 struct EricssonAction
 {
     /**
-     * \param type Type of Ericsson Vendor-defined Action.
-     * \return true if the provided type is a type of Ericsson Vendor-defined action.
+     * @param type Type of Ericsson Vendor-defined Action.
+     * @return true if the provided type is a type of Ericsson Vendor-defined action.
      */
     static bool IsValidType(er_action_type type);
 
     /**
-     * \brief Validates the action on whether its data is valid or not.
+     * @brief Validates the action on whether its data is valid or not.
      *
-     * \param type Type of action to validate.
-     * \param len Length of the action data.
-     * \return ACT_VALIDATION_OK if the action checks out, otherwise an error type.
+     * @param type Type of action to validate.
+     * @param len Length of the action data.
+     * @return ACT_VALIDATION_OK if the action checks out, otherwise an error type.
      */
     static uint16_t Validate(er_action_type type, size_t len);
 
     /**
-     * \brief Executes the action.
+     * @brief Executes the action.
      *
-     * \param type Type of action to execute.
-     * \param buffer Buffer of the Packet if it's needed for the action.
-     * \param key Matching key for the flow that is tied to this action.
-     * \param ah Action's data header.
+     * @param type Type of action to execute.
+     * @param buffer Buffer of the Packet if it's needed for the action.
+     * @param key Matching key for the flow that is tied to this action.
+     * @param ah Action's data header.
      */
     static void Execute(er_action_type type,
                         ofpbuf* buffer,
@@ -354,8 +354,8 @@
 };
 
 /**
- * \ingroup openflow
- * \brief Callback for a stats dump request.
+ * @ingroup openflow
+ * @brief Callback for a stats dump request.
  */
 struct StatsDumpCallback
 {
@@ -367,8 +367,8 @@
 };
 
 /**
- * \ingroup openflow
- * \brief Packet Metadata, allows us to track the packet's metadata as it passes through the switch.
+ * @ingroup openflow
+ * @brief Packet Metadata, allows us to track the packet's metadata as it passes through the switch.
  */
 struct SwitchPacketMetadata
 {
@@ -380,8 +380,8 @@
 };
 
 /**
- * \ingroup openflow
- * \brief An interface for a Controller of OpenFlowSwitchNetDevices
+ * @ingroup openflow
+ * @brief An interface for a Controller of OpenFlowSwitchNetDevices
  *
  * Follows the OpenFlow specification for a controller.
  */
@@ -390,7 +390,7 @@
   public:
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
     /** Destructor. */
@@ -399,22 +399,22 @@
     /**
      * Adds a switch to the controller.
      *
-     * \param swtch The switch to register.
+     * @param swtch The switch to register.
      */
     virtual void AddSwitch(Ptr<OpenFlowSwitchNetDevice> swtch);
 
     /**
      * A switch calls this method to pass a message on to the Controller.
      *
-     * \param swtch The switch the message was received from.
-     * \param buffer The message.
+     * @param swtch The switch the message was received from.
+     * @param buffer The message.
      */
     virtual void ReceiveFromSwitch(Ptr<OpenFlowSwitchNetDevice> swtch, ofpbuf* buffer)
     {
     }
 
     /**
-     * \brief Starts a callback-based, reliable, possibly multi-message reply to a request made by
+     * @brief Starts a callback-based, reliable, possibly multi-message reply to a request made by
      * the controller.
      *
      * If an incoming request needs to have a reliable reply that might
@@ -429,7 +429,7 @@
      * generated by the switch, or otherwise the status reply messages will be sent
      * and discarded.
      *
-     * \param cb The callback data.
+     * @param cb The callback data.
      */
     void StartDump(StatsDumpCallback* cb);
 
@@ -438,9 +438,9 @@
      * However the controller is implemented, this method is to
      * be used to pass a message on to a switch.
      *
-     * \param swtch The switch to receive the message.
-     * \param msg The message to send.
-     * \param length The length of the message.
+     * @param swtch The switch to receive the message.
+     * @param msg The message to send.
+     * @param length The length of the message.
      */
     virtual void SendToSwitch(Ptr<OpenFlowSwitchNetDevice> swtch, void* msg, size_t length);
 
@@ -448,17 +448,17 @@
      * Construct flow data from a matching key to build a flow
      * entry for adding, modifying, or deleting a flow.
      *
-     * \param key The matching key data; used to create a flow that matches the packet.
-     * \param buffer_id The OpenFlow Buffer ID; used to run the actions on the packet if we add or
+     * @param key The matching key data; used to create a flow that matches the packet.
+     * @param buffer_id The OpenFlow Buffer ID; used to run the actions on the packet if we add or
      * modify the flow.
-     * \param command Whether to add, modify, or delete this flow.
-     * \param acts List of actions to execute.
-     * \param actions_len Length of the actions buffer.
-     * \param idle_timeout Flow expires if left inactive for this amount of time (specify
+     * @param command Whether to add, modify, or delete this flow.
+     * @param acts List of actions to execute.
+     * @param actions_len Length of the actions buffer.
+     * @param idle_timeout Flow expires if left inactive for this amount of time (specify
      * OFP_FLOW_PERMANENT to disable feature).
-     * \param hard_timeout Flow expires after this amount of time (specify OFP_FLOW_PERMANENT to
+     * @param hard_timeout Flow expires after this amount of time (specify OFP_FLOW_PERMANENT to
      * disable feature).
-     * \return Flow data that when passed to SetFlow will add, modify, or delete a flow it defines.
+     * @return Flow data that when passed to SetFlow will add, modify, or delete a flow it defines.
      */
     ofp_flow_mod* BuildFlow(sw_flow_key key,
                             uint32_t buffer_id,
@@ -472,8 +472,8 @@
      * Get the packet type on the buffer, which can then be used
      * to determine how to handle the buffer.
      *
-     * \param buffer The packet in OpenFlow buffer format.
-     * \return The packet type, as defined in the ofp_type struct.
+     * @param buffer The packet in OpenFlow buffer format.
+     * @return The packet type, as defined in the ofp_type struct.
      */
     uint8_t GetPacketType(ofpbuf* buffer);
 
@@ -483,7 +483,7 @@
 };
 
 /**
- * \ingroup openflow
+ * @ingroup openflow
  * Demonstration of a Drop controller. When a connected switch
  * passes it a packet the switch doesn't recognize, the controller
  * configures the switch to make a flow that drops alike packets.
@@ -493,7 +493,7 @@
   public:
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
@@ -501,7 +501,7 @@
 };
 
 /**
- * \ingroup openflow
+ * @ingroup openflow
  * Demonstration of a Learning controller. When a connected switch
  * passes it a packet the switch doesn't recognize, the controller
  * delves into its learned states and figures out if we know what
@@ -513,7 +513,7 @@
   public:
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
@@ -538,15 +538,15 @@
 };
 
 /**
- * \brief Executes a list of flow table actions.
+ * @brief Executes a list of flow table actions.
  *
- * \param swtch OpenFlowSwitchNetDevice these actions are being executed on.
- * \param packet_uid Packet UID; used to fetch the packet and its metadata.
- * \param buffer The Packet OpenFlow buffer.
- * \param key The matching key for the flow tied to this list of actions.
- * \param actions A buffer of actions.
- * \param actions_len Length of actions buffer.
- * \param ignore_no_fwd If true, during port forwarding actions, ports that are set to not forward
+ * @param swtch OpenFlowSwitchNetDevice these actions are being executed on.
+ * @param packet_uid Packet UID; used to fetch the packet and its metadata.
+ * @param buffer The Packet OpenFlow buffer.
+ * @param key The matching key for the flow tied to this list of actions.
+ * @param actions A buffer of actions.
+ * @param actions_len Length of actions buffer.
+ * @param ignore_no_fwd If true, during port forwarding actions, ports that are set to not forward
  * are forced to forward.
  */
 void ExecuteActions(Ptr<OpenFlowSwitchNetDevice> swtch,
@@ -558,12 +558,12 @@
                     int ignore_no_fwd);
 
 /**
- * \brief Validates a list of flow table actions.
+ * @brief Validates a list of flow table actions.
  *
- * \param key The matching key for the flow tied to this list of actions.
- * \param actions A buffer of actions.
- * \param actions_len Length of actions buffer.
- * \return If the action list validates, ACT_VALIDATION_OK is returned. Otherwise, a code for the
+ * @param key The matching key for the flow tied to this list of actions.
+ * @param actions A buffer of actions.
+ * @param actions_len Length of actions buffer.
+ * @return If the action list validates, ACT_VALIDATION_OK is returned. Otherwise, a code for the
  * OFPET_BAD_ACTION error type is returned.
  */
 uint16_t ValidateActions(const sw_flow_key* key,
@@ -571,14 +571,14 @@
                          size_t actions_len);
 
 /**
- * \brief Executes a list of virtual port table entry actions.
+ * @brief Executes a list of virtual port table entry actions.
  *
- * \param swtch OpenFlowSwitchNetDevice these actions are being executed on.
- * \param packet_uid Packet UID; used to fetch the packet and its metadata.
- * \param buffer The Packet OpenFlow buffer.
- * \param key The matching key for the flow tied to this list of actions.
- * \param actions A buffer of actions.
- * \param actions_len Length of actions buffer.
+ * @param swtch OpenFlowSwitchNetDevice these actions are being executed on.
+ * @param packet_uid Packet UID; used to fetch the packet and its metadata.
+ * @param buffer The Packet OpenFlow buffer.
+ * @param key The matching key for the flow tied to this list of actions.
+ * @param actions A buffer of actions.
+ * @param actions_len Length of actions buffer.
  */
 void ExecuteVPortActions(Ptr<OpenFlowSwitchNetDevice> swtch,
                          uint64_t packet_uid,
@@ -588,31 +588,31 @@
                          size_t actions_len);
 
 /**
- * \brief Validates a list of virtual port table entry actions.
+ * @brief Validates a list of virtual port table entry actions.
  *
- * \param actions A buffer of actions.
- * \param actions_len Length of actions buffer.
- * \return If the action list validates, ACT_VALIDATION_OK is returned. Otherwise, a code for the
+ * @param actions A buffer of actions.
+ * @param actions_len Length of actions buffer.
+ * @return If the action list validates, ACT_VALIDATION_OK is returned. Otherwise, a code for the
  * OFPET_BAD_ACTION error type is returned.
  */
 uint16_t ValidateVPortActions(const ofp_action_header* actions, size_t actions_len);
 
 /**
- * \brief Executes a vendor-defined action.
+ * @brief Executes a vendor-defined action.
  *
- * \param buffer The Packet OpenFlow buffer.
- * \param key The matching key for the flow tied to this list of actions.
- * \param ah Header of the action.
+ * @param buffer The Packet OpenFlow buffer.
+ * @param key The matching key for the flow tied to this list of actions.
+ * @param ah Header of the action.
  */
 void ExecuteVendor(ofpbuf* buffer, const sw_flow_key* key, const ofp_action_header* ah);
 
 /**
- * \brief Validates a vendor-defined action.
+ * @brief Validates a vendor-defined action.
  *
- * \param key The matching key for the flow tied to this list of actions.
- * \param ah Header of the action.
- * \param len Length of the action.
- * \return If the action list validates, ACT_VALIDATION_OK is returned. Otherwise, a code for the
+ * @param key The matching key for the flow tied to this list of actions.
+ * @param ah Header of the action.
+ * @param len Length of the action.
+ * @return If the action list validates, ACT_VALIDATION_OK is returned. Otherwise, a code for the
  * OFPET_BAD_ACTION error type is returned.
  */
 uint16_t ValidateVendor(const sw_flow_key* key, const ofp_action_header* ah, uint16_t len);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/openflow/model/openflow-switch-net-device.cc ns-3.44/src/openflow/model/openflow-switch-net-device.cc
--- ns-3.43/src/openflow/model/openflow-switch-net-device.cc	2024-10-09 16:41:10.076656600 -0700
+++ ns-3.44/src/openflow/model/openflow-switch-net-device.cc	2025-03-09 16:55:49.683372300 -0700
@@ -19,7 +19,7 @@
 /**
  * Generate an ID.
  *
- * \return Generated ID.
+ * @return Generated ID.
  */
 static uint64_t
 GenerateId()
@@ -898,7 +898,7 @@
     desc->config = htonl(p.config);
     desc->state = htonl(p.state);
 
-    /// \todo This should probably be fixed eventually to specify different available features.
+    /// @todo This should probably be fixed eventually to specify different available features.
     desc->curr = 0;       // htonl(netdev_get_features(p->netdev, NETDEV_FEAT_CURRENT));
     desc->supported = 0;  // htonl(netdev_get_features(p->netdev, NETDEV_FEAT_SUPPORTED));
     desc->advertised = 0; // htonl(netdev_get_features(p->netdev, NETDEV_FEAT_ADVERTISED));
@@ -1184,12 +1184,12 @@
             if ((opm->config & htonl(OFPPC_PORT_DOWN)) && (p.config & OFPPC_PORT_DOWN) == 0)
             {
                 p.config |= OFPPC_PORT_DOWN;
-                /// \todo Possibly disable the Port's Net Device via the appropriate interface.
+                /// @todo Possibly disable the Port's Net Device via the appropriate interface.
             }
             else if ((opm->config & htonl(OFPPC_PORT_DOWN)) == 0 && (p.config & OFPPC_PORT_DOWN))
             {
                 p.config &= ~OFPPC_PORT_DOWN;
-                /// \todo Possibly enable the Port's Net Device via the appropriate interface.
+                /// @todo Possibly enable the Port's Net Device via the appropriate interface.
             }
         }
     }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/openflow/model/openflow-switch-net-device.h ns-3.44/src/openflow/model/openflow-switch-net-device.h
--- ns-3.43/src/openflow/model/openflow-switch-net-device.h	2024-10-09 16:41:10.076656600 -0700
+++ ns-3.44/src/openflow/model/openflow-switch-net-device.h	2025-03-09 16:55:49.683372300 -0700
@@ -5,7 +5,7 @@
  */
 
 /**
- * \defgroup openflow OpenFlow Switch Device
+ * @defgroup openflow OpenFlow Switch Device
  * This section documents the API of the ns-3 OpenFlow module. For a generic functional description,
  * please refer to the ns-3 manual.
  */
@@ -38,8 +38,8 @@
 {
 
 /**
- * \ingroup openflow
- * \brief A net device that switches multiple LAN segments via an OpenFlow-compatible flow table
+ * @ingroup openflow
+ * @brief A net device that switches multiple LAN segments via an OpenFlow-compatible flow table
  *
  * The OpenFlowSwitchNetDevice object aggregates multiple netdevices as ports
  * and acts like a switch. It implements OpenFlow-compatibility,
@@ -57,37 +57,37 @@
  * frames from one port may occasionally be forwarded throughout all other ports,
  * but usually they are forwarded only to a single correct output port.
  *
- * \attention The Spanning Tree Protocol part of 802.1D is not
+ * @attention The Spanning Tree Protocol part of 802.1D is not
  * implemented.  Therefore, you have to be careful not to create
  * bridging loops, or else the network will collapse.
  *
- * \attention Each NetDevice used must only be assigned a Mac Address, adding it
+ * @attention Each NetDevice used must only be assigned a Mac Address, adding it
  * to an Ipv4 or Ipv6 layer will cause an error. It also must support a SendFrom
  * call.
  */
 
 /**
- * \ingroup openflow
- * \ingroup tests
- * \defgroup openflow-tests OpenFlow module tests
+ * @ingroup openflow
+ * @ingroup tests
+ * @defgroup openflow-tests OpenFlow module tests
  */
 
 /**
- * \ingroup openflow
- * \brief A net device that switches multiple LAN segments via an OpenFlow-compatible flow table
+ * @ingroup openflow
+ * @brief A net device that switches multiple LAN segments via an OpenFlow-compatible flow table
  */
 class OpenFlowSwitchNetDevice : public NetDevice
 {
   public:
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
     /**
-     * \name Descriptive Data
-     * \brief OpenFlowSwitchNetDevice Description Data
+     * @name Descriptive Data
+     * @brief OpenFlowSwitchNetDevice Description Data
      *
      * These four data describe the OpenFlowSwitchNetDevice as if it were
      * a real OpenFlow switch.
@@ -98,7 +98,7 @@
      * OpenFlow Switch", and the other two are "N/A".
      * @{
      */
-    /** \returns The descriptive string. */
+    /** @returns The descriptive string. */
     static const char* GetManufacturerDescription();
     static const char* GetHardwareDescription();
     static const char* GetSoftwareDescription();
@@ -109,32 +109,32 @@
     ~OpenFlowSwitchNetDevice() override;
 
     /**
-     * \brief Set up the Switch's controller connection.
+     * @brief Set up the Switch's controller connection.
      *
-     * \param c Pointer to a Controller.
+     * @param c Pointer to a Controller.
      */
     void SetController(Ptr<ofi::Controller> c);
 
     /**
-     * \brief Add a 'port' to a switch device
+     * @brief Add a 'port' to a switch device
      *
      * This method adds a new switch port to a OpenFlowSwitchNetDevice, so that
      * the new switch port NetDevice becomes part of the switch and L2
      * frames start being forwarded to/from this NetDevice.
      *
-     * \note The netdevice that is being added as switch port must
+     * @note The netdevice that is being added as switch port must
      * _not_ have an IP address.  In order to add IP connectivity to a
      * bridging node you must enable IP on the OpenFlowSwitchNetDevice itself,
      * never on its port netdevices.
      *
-     * \param switchPort The port to add.
-     * \return 0 if everything's ok, otherwise an error number.
+     * @param switchPort The port to add.
+     * @return 0 if everything's ok, otherwise an error number.
      * Possible error numbers: EXFULL
      */
     int AddSwitchPort(Ptr<NetDevice> switchPort);
 
     /**
-     * \brief Add a virtual port to a switch device
+     * @brief Add a virtual port to a switch device
      *
      * The Ericsson OFSID has the concept of virtual ports and virtual
      * port tables. These are implemented in the OpenFlowSwitchNetDevice, but
@@ -143,40 +143,40 @@
      *
      * Possible error numbers: EINVAL
      *
-     * \param ovpm The data for adding a virtual port.
-     * \return 0 if everything's ok, otherwise an error number.
+     * @param ovpm The data for adding a virtual port.
+     * @return 0 if everything's ok, otherwise an error number.
      */
     int AddVPort(const ofp_vport_mod* ovpm);
 
     /**
-     * \brief Stats callback is ready for a dump.
+     * @brief Stats callback is ready for a dump.
      *
      * Controllers have a callback system for status requests which calls this function.
      *
-     * \param cb_ The callback data.
-     * \return 0 if everything's ok, otherwise an error number.
+     * @param cb_ The callback data.
+     * @return 0 if everything's ok, otherwise an error number.
      */
     int StatsDump(ofi::StatsDumpCallback* cb_);
 
     /**
-     * \brief Stats callback is done.
+     * @brief Stats callback is done.
      *
      * Controllers have a callback system for status requests which calls this function.
      *
-     * \param cb_ The callback data.
+     * @param cb_ The callback data.
      */
     void StatsDone(ofi::StatsDumpCallback* cb_);
 
     /**
-     * \brief Called from the OpenFlow Interface to output the Packet on either a Port or the
+     * @brief Called from the OpenFlow Interface to output the Packet on either a Port or the
      * Controller
      *
-     * \param packet_uid Packet UID; used to fetch the packet and its metadata.
-     * \param in_port The index of the port the Packet was initially received on.
-     * \param max_len The maximum number of bytes the caller wants to be sent; a value of 0
+     * @param packet_uid Packet UID; used to fetch the packet and its metadata.
+     * @param in_port The index of the port the Packet was initially received on.
+     * @param max_len The maximum number of bytes the caller wants to be sent; a value of 0
      * indicates the entire packet should be sent. Used when outputting to controller.
-     * \param out_port The port we want to output on.
-     * \param ignore_no_fwd If true, Ports that are set to not forward are forced to forward.
+     * @param out_port The port we want to output on.
+     * @param ignore_no_fwd If true, Ports that are set to not forward are forced to forward.
      */
     void DoOutput(uint32_t packet_uid,
                   int in_port,
@@ -185,38 +185,38 @@
                   bool ignore_no_fwd);
 
     /**
-     * \brief The registered controller calls this method when sending a message to the switch.
+     * @brief The registered controller calls this method when sending a message to the switch.
      *
-     * \param msg The message received from the controller.
-     * \param length Length of the message.
-     * \return 0 if everything's ok, otherwise an error number.
+     * @param msg The message received from the controller.
+     * @param length Length of the message.
+     * @return 0 if everything's ok, otherwise an error number.
      */
     int ForwardControlInput(const void* msg, size_t length);
 
     /**
-     * \return The flow table chain.
+     * @return The flow table chain.
      */
     sw_chain* GetChain();
 
     /**
-     * \return Number of switch ports attached to this switch.
+     * @return Number of switch ports attached to this switch.
      */
     uint32_t GetNSwitchPorts() const;
 
     /**
-     * \param p The Port to get the index of.
-     * \return The index of the provided Port.
+     * @param p The Port to get the index of.
+     * @return The index of the provided Port.
      */
     int GetSwitchPortIndex(ofi::Port p);
 
     /**
-     * \param n index of the Port.
-     * \return The Port.
+     * @param n index of the Port.
+     * @return The Port.
      */
     ofi::Port GetSwitchPort(uint32_t n) const;
 
     /**
-     * \return The virtual port table.
+     * @return The virtual port table.
      */
     vport_table_t GetVPortTable();
 
@@ -255,12 +255,12 @@
     /**
      * Called when a packet is received on one of the switch's ports.
      *
-     * \param netdev The port the packet was received on.
-     * \param packet The Packet itself.
-     * \param protocol The protocol defining the Packet.
-     * \param src The source address of the Packet.
-     * \param dst The destination address of the Packet.
-     * \param packetType Type of the packet.
+     * @param netdev The port the packet was received on.
+     * @param packet The Packet itself.
+     * @param protocol The protocol defining the Packet.
+     * @param src The source address of the Packet.
+     * @param dst The destination address of the Packet.
+     * @param packetType Type of the packet.
      */
     void ReceiveFromDevice(Ptr<NetDevice> netdev,
                            Ptr<const Packet> packet,
@@ -273,12 +273,12 @@
      * Takes a packet and generates an OpenFlow buffer from it, loading the packet data as well as
      * its headers.
      *
-     * \param packet The packet.
-     * \param src The source address.
-     * \param dst The destination address.
-     * \param mtu The Maximum Transmission Unit.
-     * \param protocol The protocol defining the packet.
-     * \return The OpenFlow Buffer created from the packet.
+     * @param packet The packet.
+     * @param src The source address.
+     * @param dst The destination address.
+     * @param mtu The Maximum Transmission Unit.
+     * @param protocol The protocol defining the packet.
+     * @return The OpenFlow Buffer created from the packet.
      */
     ofpbuf* BufferFromPacket(Ptr<const Packet> packet,
                              Address src,
@@ -292,35 +292,35 @@
      *
      * Possible error numbers: ENOMEM, ENOBUFS, ESRCH
      *
-     * \param ofm The flow data to add.
-     * \return 0 if everything's ok, otherwise an error number.
+     * @param ofm The flow data to add.
+     * @return 0 if everything's ok, otherwise an error number.
      */
     int AddFlow(const ofp_flow_mod* ofm);
 
     /**
      * Modify a flow.
      *
-     * \param ofm The flow data to modify.
-     * \return 0 if everything's ok, otherwise an error number.
+     * @param ofm The flow data to modify.
+     * @return 0 if everything's ok, otherwise an error number.
      */
     int ModFlow(const ofp_flow_mod* ofm);
 
     /**
      * Send packets out all the ports except the originating one
      *
-     * \param packet_uid Packet UID; used to fetch the packet and its metadata.
-     * \param in_port The index of the port the Packet was initially received on. This port doesn't
+     * @param packet_uid Packet UID; used to fetch the packet and its metadata.
+     * @param in_port The index of the port the Packet was initially received on. This port doesn't
      * forward when flooding.
-     * \param flood If true, don't send out on the ports with flooding disabled.
-     * \return 0 if everything's ok, otherwise an error number.
+     * @param flood If true, don't send out on the ports with flooding disabled.
+     * @return 0 if everything's ok, otherwise an error number.
      */
     int OutputAll(uint32_t packet_uid, int in_port, bool flood);
 
     /**
      * Sends a copy of the Packet over the provided output port
      *
-     * \param packet_uid Packet UID; used to fetch the packet and its metadata.
-     * \param out_port Output port.
+     * @param packet_uid Packet UID; used to fetch the packet and its metadata.
+     * @param out_port Output port.
      */
     void OutputPacket(uint32_t packet_uid, int out_port);
 
@@ -330,10 +330,10 @@
      * pre-set types of port options besides a Port that's hooked to our OpenFlowSwitchNetDevice.
      * For example, it could be outputting as a flood, or seeking to output to the controller.
      *
-     * \param packet_uid Packet UID; used to fetch the packet and its metadata.
-     * \param in_port The index of the port the Packet was initially received on.
-     * \param out_port The port we want to output on.
-     * \param ignore_no_fwd If true, Ports that are set to not forward are forced to forward.
+     * @param packet_uid Packet UID; used to fetch the packet and its metadata.
+     * @param in_port The index of the port the Packet was initially received on.
+     * @param out_port The port we want to output on.
+     * @param ignore_no_fwd If true, Ports that are set to not forward are forced to forward.
      */
     void OutputPort(uint32_t packet_uid, int in_port, int out_port, bool ignore_no_fwd);
 
@@ -342,21 +342,21 @@
      * in an OpenFlow buffer, then only the first 'max_len' bytes of the packet
      * are sent; otherwise, all of the packet is sent.
      *
-     * \param packet_uid Packet UID; used to fetch the packet and its metadata.
-     * \param in_port The index of the port the Packet was initially received on.
-     * \param max_len The maximum number of bytes that the caller wants to be sent; a value of 0
+     * @param packet_uid Packet UID; used to fetch the packet and its metadata.
+     * @param in_port The index of the port the Packet was initially received on.
+     * @param max_len The maximum number of bytes that the caller wants to be sent; a value of 0
      * indicates the entire packet should be sent.
-     * \param reason Why the packet is being sent.
+     * @param reason Why the packet is being sent.
      */
     void OutputControl(uint32_t packet_uid, int in_port, size_t max_len, int reason);
 
     /**
      * If an error message happened during the controller's request, send it to the controller.
      *
-     * \param type The type of error.
-     * \param code The error code.
-     * \param data The faulty data that lead to the error.
-     * \param len The length of the faulty data.
+     * @param type The type of error.
+     * @param code The error code.
+     * @param data The faulty data that lead to the error.
+     * @param len The length of the faulty data.
      */
     void SendErrorMsg(uint16_t type, uint16_t code, const void* data, size_t len);
 
@@ -377,7 +377,7 @@
      * setting the IP source address and destination, setting the TCP/UDP source address
      * and destination, and setting the MPLS label and EXP bits.
      *
-     * \attention Capabilities STP (Spanning Tree Protocol) and IP packet
+     * @attention Capabilities STP (Spanning Tree Protocol) and IP packet
      * reassembly are not currently supported.
      *
      */
@@ -386,16 +386,16 @@
     /**
      * Send a reply to the controller that a specific flow has expired.
      *
-     * \param flow The flow that expired.
-     * \param reason The reason for sending this expiration notification.
+     * @param flow The flow that expired.
+     * @param reason The reason for sending this expiration notification.
      */
     void SendFlowExpired(sw_flow* flow, ofp_flow_expired_reason reason);
 
     /**
      * Send a reply about a Port's status to the controller.
      *
-     * \param p The port to get status from.
-     * \param status The reason for sending this reply.
+     * @param p The port to get status from.
+     * @param status The reason for sending this reply.
      */
     void SendPortStatus(ofi::Port p, uint8_t status);
 
@@ -410,8 +410,8 @@
      * sending. The other Send methods call this one when they
      * are ready to send a message.
      *
-     * \param buffer Buffer of the message to send out.
-     * \return 0 if successful, otherwise an error number.
+     * @param buffer Buffer of the message to send out.
+     * @return 0 if successful, otherwise an error number.
      */
     int SendOpenflowBuffer(ofpbuf* buffer);
 
@@ -419,9 +419,9 @@
      * Run the packet through the flow table. Looks up in the flow table for a match.
      * If it doesn't match, it forwards the packet to the registered controller, if the flag is set.
      *
-     * \param packet_uid Packet UID; used to fetch the packet and its metadata.
-     * \param port The port this packet was received over.
-     * \param send_to_controller If set, sends to the controller if the packet isn't matched.
+     * @param packet_uid Packet UID; used to fetch the packet and its metadata.
+     * @param port The port this packet was received over.
+     * @param send_to_controller If set, sends to the controller if the packet isn't matched.
      */
     void RunThroughFlowTable(uint32_t packet_uid, int port, bool send_to_controller = true);
 
@@ -429,10 +429,10 @@
      * Run the packet through the vport table. As with AddVPort,
      * this doesn't have an understood use yet.
      *
-     * \param packet_uid Packet UID; used to fetch the packet and its metadata.
-     * \param port The port this packet was received over.
-     * \param vport The virtual port this packet identifies itself by.
-     * \return 0 if everything's ok, otherwise an error number.
+     * @param packet_uid Packet UID; used to fetch the packet and its metadata.
+     * @param port The port this packet was received over.
+     * @param vport The virtual port this packet identifies itself by.
+     * @return 0 if everything's ok, otherwise an error number.
      */
     int RunThroughVPortTable(uint32_t packet_uid, int port, uint32_t vport);
 
@@ -440,11 +440,11 @@
      * Called by RunThroughFlowTable on a scheduled delay
      * to account for the flow table lookup overhead.
      *
-     * \param key Matching key to look up in the flow table.
-     * \param buffer Buffer of the packet received.
-     * \param packet_uid Packet UID; used to fetch the packet and its metadata.
-     * \param port The port the packet was received over.
-     * \param send_to_controller
+     * @param key Matching key to look up in the flow table.
+     * @param buffer Buffer of the packet received.
+     * @param packet_uid Packet UID; used to fetch the packet and its metadata.
+     * @param port The port the packet was received over.
+     * @param send_to_controller
      */
     void FlowTableLookup(sw_flow_key key,
                          ofpbuf* buffer,
@@ -456,8 +456,8 @@
      * Update the port status field of the switch port.
      * A non-zero return value indicates some field has changed.
      *
-     * \param p A reference to a Port; used to change its config and flag fields.
-     * \return true if the status of the Port is changed, false if unchanged (was already the right
+     * @param p A reference to a Port; used to change its config and flag fields.
+     * @return true if the status of the Port is changed, false if unchanged (was already the right
      * status).
      */
     int UpdatePortStatus(ofi::Port& p);
@@ -465,8 +465,8 @@
     /**
      * Fill out a description of the switch port.
      *
-     * \param p The port to get the description from.
-     * \param desc A pointer to the description message; used to fill the description message with
+     * @param p The port to get the description from.
+     * @param desc A pointer to the description message; used to fill the description message with
      * the data from the port.
      */
     void FillPortDesc(ofi::Port p, ofp_phy_port* desc);
@@ -474,23 +474,23 @@
     /**
      * Generates an OpenFlow reply message based on the type.
      *
-     * \param openflow_len Length of the reply to make.
-     * \param type Type of reply message to make.
-     * \param bufferp Message buffer; used to make the reply.
-     * \return The OpenFlow reply message.
+     * @param openflow_len Length of the reply to make.
+     * @param type Type of reply message to make.
+     * @param bufferp Message buffer; used to make the reply.
+     * @return The OpenFlow reply message.
      */
     void* MakeOpenflowReply(size_t openflow_len, uint8_t type, ofpbuf** bufferp);
 
     /**
-     * \name Receive Methods
+     * @name Receive Methods
      *
      * Actions to do when a specific OpenFlow message/packet is received
      *
      * @{
      */
     /**
-     * \param msg The OpenFlow message received.
-     * \return 0 if everything's ok, otherwise an error number.
+     * @param msg The OpenFlow message received.
+     * @return 0 if everything's ok, otherwise an error number.
      */
     int ReceivePortMod(const void* msg);
     int ReceiveFeaturesRequest(const void* msg);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/openflow/test/openflow-switch-test-suite.cc ns-3.44/src/openflow/test/openflow-switch-test-suite.cc
--- ns-3.43/src/openflow/test/openflow-switch-test-suite.cc	2024-10-09 16:41:10.076656600 -0700
+++ ns-3.44/src/openflow/test/openflow-switch-test-suite.cc	2025-03-09 16:55:49.683372300 -0700
@@ -16,9 +16,9 @@
 using namespace ns3;
 
 /**
- * \ingroup openflow-tests
+ * @ingroup openflow-tests
  *
- * \brief OpenFlow Test
+ * @brief OpenFlow Test
  */
 class SwitchFlowTableTestCase : public TestCase
 {
@@ -182,9 +182,9 @@
 }
 
 /**
- * \ingroup openflow-tests
+ * @ingroup openflow-tests
  *
- * \brief OpenFlow TestSuite
+ * @brief OpenFlow TestSuite
  */
 class SwitchTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/point-to-point/CMakeLists.txt ns-3.44/src/point-to-point/CMakeLists.txt
--- ns-3.43/src/point-to-point/CMakeLists.txt	2024-10-09 16:41:10.076656600 -0700
+++ ns-3.44/src/point-to-point/CMakeLists.txt	2025-03-09 16:55:49.683372300 -0700
@@ -11,7 +11,7 @@
   )
   set(mpi_libraries
       ${libmpi}
-      ${MPI_CXX_LIBRARIES}
+      MPI::MPI_CXX
   )
 endif()
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/point-to-point/helper/point-to-point-helper.h ns-3.44/src/point-to-point/helper/point-to-point-helper.h
--- ns-3.43/src/point-to-point/helper/point-to-point-helper.h	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/point-to-point/helper/point-to-point-helper.h	2025-03-09 16:55:49.683372300 -0700
@@ -23,7 +23,7 @@
 class Node;
 
 /**
- * \brief Build a set of PointToPointNetDevice objects
+ * @brief Build a set of PointToPointNetDevice objects
  *
  * Normally we eschew multiple inheritance, however, the classes
  * PcapUserHelperForDevice and AsciiTraceUserHelperForDevice are
@@ -47,9 +47,9 @@
      * This method allows one to set the type of the queue that is automatically
      * created when the device is created and attached to a node.
      *
-     * \tparam Ts \deduced Argument types
-     * \param type the type of queue
-     * \param [in] args Name and AttributeValue pairs to set.
+     * @tparam Ts \deduced Argument types
+     * @param type the type of queue
+     * @param [in] args Name and AttributeValue pairs to set.
      *
      * Set the type of queue to create and associated to each
      * PointToPointNetDevice created through PointToPointHelper::Install.
@@ -61,8 +61,8 @@
      * Set an attribute value to be propagated to each NetDevice created by the
      * helper.
      *
-     * \param name the name of the attribute to set
-     * \param value the value of the attribute to set
+     * @param name the name of the attribute to set
+     * @param value the value of the attribute to set
      *
      * Set these attributes on each ns3::PointToPointNetDevice created
      * by PointToPointHelper::Install
@@ -73,8 +73,8 @@
      * Set an attribute value to be propagated to each Channel created by the
      * helper.
      *
-     * \param name the name of the attribute to set
-     * \param value the value of the attribute to set
+     * @param name the name of the attribute to set
+     * @param value the value of the attribute to set
      *
      * Set these attribute on each ns3::PointToPointChannel created
      * by PointToPointHelper::Install
@@ -92,8 +92,8 @@
     void DisableFlowControl();
 
     /**
-     * \param c a set of nodes
-     * \return a NetDeviceContainer for nodes
+     * @param c a set of nodes
+     * @return a NetDeviceContainer for nodes
      *
      * This method creates a ns3::PointToPointChannel with the
      * attributes configured by PointToPointHelper::SetChannelAttribute,
@@ -105,9 +105,9 @@
     NetDeviceContainer Install(NodeContainer c);
 
     /**
-     * \param a first node
-     * \param b second node
-     * \return a NetDeviceContainer for nodes
+     * @param a first node
+     * @param b second node
+     * @return a NetDeviceContainer for nodes
      *
      * Saves you from having to construct a temporary NodeContainer.
      * Also, if MPI is enabled, for distributed simulations,
@@ -116,27 +116,27 @@
     NetDeviceContainer Install(Ptr<Node> a, Ptr<Node> b);
 
     /**
-     * \param a first node
-     * \param bName name of second node
-     * \return a NetDeviceContainer for nodes
+     * @param a first node
+     * @param bName name of second node
+     * @return a NetDeviceContainer for nodes
      *
      * Saves you from having to construct a temporary NodeContainer.
      */
     NetDeviceContainer Install(Ptr<Node> a, std::string bName);
 
     /**
-     * \param aName Name of first node
-     * \param b second node
-     * \return a NetDeviceContainer for nodes
+     * @param aName Name of first node
+     * @param b second node
+     * @return a NetDeviceContainer for nodes
      *
      * Saves you from having to construct a temporary NodeContainer.
      */
     NetDeviceContainer Install(std::string aName, Ptr<Node> b);
 
     /**
-     * \param aNode Name of first node
-     * \param bNode Name of second node
-     * \return a NetDeviceContainer for nodes
+     * @param aNode Name of first node
+     * @param bNode Name of second node
+     * @return a NetDeviceContainer for nodes
      *
      * Saves you from having to construct a temporary NodeContainer.
      */
@@ -144,15 +144,15 @@
 
   private:
     /**
-     * \brief Enable pcap output the indicated net device.
+     * @brief Enable pcap output the indicated net device.
      *
      * NetDevice-specific implementation mechanism for hooking the trace and
      * writing to the trace file.
      *
-     * \param prefix Filename prefix to use for pcap files.
-     * \param nd Net device for which you want to enable tracing.
-     * \param promiscuous If true capture all possible packets available at the device.
-     * \param explicitFilename Treat the prefix as an explicit filename if true
+     * @param prefix Filename prefix to use for pcap files.
+     * @param nd Net device for which you want to enable tracing.
+     * @param promiscuous If true capture all possible packets available at the device.
+     * @param explicitFilename Treat the prefix as an explicit filename if true
      */
     void EnablePcapInternal(std::string prefix,
                             Ptr<NetDevice> nd,
@@ -160,15 +160,15 @@
                             bool explicitFilename) override;
 
     /**
-     * \brief Enable ascii trace output on the indicated net device.
+     * @brief Enable ascii trace output on the indicated net device.
      *
      * NetDevice-specific implementation mechanism for hooking the trace and
      * writing to the trace file.
      *
-     * \param stream The output stream object to use when logging ascii traces.
-     * \param prefix Filename prefix to use for ascii trace files.
-     * \param nd Net device for which you want to enable tracing.
-     * \param explicitFilename Treat the prefix as an explicit filename if true
+     * @param stream The output stream object to use when logging ascii traces.
+     * @param prefix Filename prefix to use for ascii trace files.
+     * @param nd Net device for which you want to enable tracing.
+     * @param explicitFilename Treat the prefix as an explicit filename if true
      */
     void EnableAsciiInternal(Ptr<OutputStreamWrapper> stream,
                              std::string prefix,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/point-to-point/model/point-to-point-channel.cc ns-3.44/src/point-to-point/model/point-to-point-channel.cc
--- ns-3.43/src/point-to-point/model/point-to-point-channel.cc	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/point-to-point/model/point-to-point-channel.cc	2025-03-09 16:55:49.683372300 -0700
@@ -47,7 +47,7 @@
 // has an "infitely" fast transmission speed and zero delay.
 PointToPointChannel::PointToPointChannel()
     : Channel(),
-      m_delay(Seconds(0.)),
+      m_delay(),
       m_nDevices(0)
 {
     NS_LOG_FUNCTION_NOARGS();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/point-to-point/model/point-to-point-channel.h ns-3.44/src/point-to-point/model/point-to-point-channel.h
--- ns-3.43/src/point-to-point/model/point-to-point-channel.h	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/point-to-point/model/point-to-point-channel.h	2025-03-09 16:55:49.683372300 -0700
@@ -22,8 +22,8 @@
 class Packet;
 
 /**
- * \ingroup point-to-point
- * \brief Simple Point To Point Channel.
+ * @ingroup point-to-point
+ * @brief Simple Point To Point Channel.
  *
  * This class represents a very simple point to point channel.  Think full
  * duplex RS-232 or RS-422 with null modem and no handshaking.  There is no
@@ -34,21 +34,21 @@
  * [0] wire to transmit on.  The second device gets the [1] wire.  There is a
  * state (IDLE, TRANSMITTING) associated with each wire.
  *
- * \see Attach
- * \see TransmitStart
+ * @see Attach
+ * @see TransmitStart
  */
 class PointToPointChannel : public Channel
 {
   public:
     /**
-     * \brief Get the TypeId
+     * @brief Get the TypeId
      *
-     * \return The TypeId for this class
+     * @return The TypeId for this class
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Create a PointToPointChannel
+     * @brief Create a PointToPointChannel
      *
      * By default, you get a channel that has an "infinitely" fast
      * transmission speed and zero delay.
@@ -56,65 +56,65 @@
     PointToPointChannel();
 
     /**
-     * \brief Attach a given netdevice to this channel
-     * \param device pointer to the netdevice to attach to the channel
+     * @brief Attach a given netdevice to this channel
+     * @param device pointer to the netdevice to attach to the channel
      */
     void Attach(Ptr<PointToPointNetDevice> device);
 
     /**
-     * \brief Transmit a packet over this channel
-     * \param p Packet to transmit
-     * \param src Source PointToPointNetDevice
-     * \param txTime Transmit time to apply
-     * \returns true if successful (currently always true)
+     * @brief Transmit a packet over this channel
+     * @param p Packet to transmit
+     * @param src Source PointToPointNetDevice
+     * @param txTime Transmit time to apply
+     * @returns true if successful (currently always true)
      */
     virtual bool TransmitStart(Ptr<const Packet> p, Ptr<PointToPointNetDevice> src, Time txTime);
 
     /**
-     * \brief Get number of devices on this channel
-     * \returns number of devices on this channel
+     * @brief Get number of devices on this channel
+     * @returns number of devices on this channel
      */
     std::size_t GetNDevices() const override;
 
     /**
-     * \brief Get PointToPointNetDevice corresponding to index i on this channel
-     * \param i Index number of the device requested
-     * \returns Ptr to PointToPointNetDevice requested
+     * @brief Get PointToPointNetDevice corresponding to index i on this channel
+     * @param i Index number of the device requested
+     * @returns Ptr to PointToPointNetDevice requested
      */
     Ptr<PointToPointNetDevice> GetPointToPointDevice(std::size_t i) const;
 
     /**
-     * \brief Get NetDevice corresponding to index i on this channel
-     * \param i Index number of the device requested
-     * \returns Ptr to NetDevice requested
+     * @brief Get NetDevice corresponding to index i on this channel
+     * @param i Index number of the device requested
+     * @returns Ptr to NetDevice requested
      */
     Ptr<NetDevice> GetDevice(std::size_t i) const override;
 
   protected:
     /**
-     * \brief Get the delay associated with this channel
-     * \returns Time delay
+     * @brief Get the delay associated with this channel
+     * @returns Time delay
      */
     Time GetDelay() const;
 
     /**
-     * \brief Check to make sure the link is initialized
-     * \returns true if initialized, asserts otherwise
+     * @brief Check to make sure the link is initialized
+     * @returns true if initialized, asserts otherwise
      */
     bool IsInitialized() const;
 
     /**
-     * \brief Get the net-device source
-     * \param i the link requested
-     * \returns Ptr to PointToPointNetDevice source for the
+     * @brief Get the net-device source
+     * @param i the link requested
+     * @returns Ptr to PointToPointNetDevice source for the
      * specified link
      */
     Ptr<PointToPointNetDevice> GetSource(uint32_t i) const;
 
     /**
-     * \brief Get the net-device destination
-     * \param i the link requested
-     * \returns Ptr to PointToPointNetDevice destination for
+     * @brief Get the net-device destination
+     * @param i the link requested
+     * @returns Ptr to PointToPointNetDevice destination for
      * the specified link
      */
     Ptr<PointToPointNetDevice> GetDestination(uint32_t i) const;
@@ -122,12 +122,12 @@
     /**
      * TracedCallback signature for packet transmission animation events.
      *
-     * \param [in] packet The packet being transmitted.
-     * \param [in] txDevice the TransmitTing NetDevice.
-     * \param [in] rxDevice the Receiving NetDevice.
-     * \param [in] duration The amount of time to transmit the packet.
-     * \param [in] lastBitTime Last bit receive time (relative to now)
-     * \deprecated The non-const \c Ptr<NetDevice> argument is deprecated
+     * @param [in] packet The packet being transmitted.
+     * @param [in] txDevice the TransmitTing NetDevice.
+     * @param [in] rxDevice the Receiving NetDevice.
+     * @param [in] duration The amount of time to transmit the packet.
+     * @param [in] lastBitTime Last bit receive time (relative to now)
+     * @deprecated The non-const \c Ptr<NetDevice> argument is deprecated
      * and will be changed to \c Ptr<const NetDevice> in a future release.
      */
     // NS_DEPRECATED() - tag for future removal
@@ -151,8 +151,8 @@
      * net device, receiving net device, transmission time and
      * packet receipt time.
      *
-     * \see class CallBackTraceSource
-     * \deprecated The non-const \c Ptr<NetDevice> argument is deprecated
+     * @see class CallBackTraceSource
+     * @deprecated The non-const \c Ptr<NetDevice> argument is deprecated
      * and will be changed to \c Ptr<const NetDevice> in a future release.
      */
     // NS_DEPRECATED() - tag for future removal
@@ -164,7 +164,7 @@
                    >
         m_txrxPointToPoint;
 
-    /** \brief Wire states
+    /** @brief Wire states
      *
      */
     enum WireState
@@ -180,12 +180,12 @@
     };
 
     /**
-     * \brief Wire model for the PointToPointChannel
+     * @brief Wire model for the PointToPointChannel
      */
     class Link
     {
       public:
-        /** \brief Create the link, it will be in INITIALIZING state
+        /** @brief Create the link, it will be in INITIALIZING state
          *
          */
         Link() = default;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/point-to-point/model/point-to-point-net-device.cc ns-3.44/src/point-to-point/model/point-to-point-net-device.cc
--- ns-3.43/src/point-to-point/model/point-to-point-net-device.cc	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/point-to-point/model/point-to-point-net-device.cc	2025-03-09 16:55:49.683372300 -0700
@@ -57,7 +57,7 @@
                           MakePointerChecker<ErrorModel>())
             .AddAttribute("InterframeGap",
                           "The time to wait between packet (frame) transmissions",
-                          TimeValue(Seconds(0.0)),
+                          TimeValue(Seconds(0)),
                           MakeTimeAccessor(&PointToPointNetDevice::m_tInterframeGap),
                           MakeTimeChecker())
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/point-to-point/model/point-to-point-net-device.h ns-3.44/src/point-to-point/model/point-to-point-net-device.h
--- ns-3.43/src/point-to-point/model/point-to-point-net-device.h	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/point-to-point/model/point-to-point-net-device.h	2025-03-09 16:55:49.683372300 -0700
@@ -28,7 +28,7 @@
 class ErrorModel;
 
 /**
- * \defgroup point-to-point Point-To-Point Network Device
+ * @defgroup point-to-point Point-To-Point Network Device
  * This section documents the API of the ns-3 point-to-point module. For a
  * functional description, please refer to the ns-3 manual here:
  * http://www.nsnam.org/docs/models/html/point-to-point.html
@@ -37,9 +37,9 @@
  */
 
 /**
- * \ingroup point-to-point
- * \class PointToPointNetDevice
- * \brief A Device for a Point to Point Network Link.
+ * @ingroup point-to-point
+ * @class PointToPointNetDevice
+ * @brief A Device for a Point to Point Network Link.
  *
  * This PointToPointNetDevice class specializes the NetDevice abstract
  * base class.  Together with a PointToPointChannel (and a peer
@@ -53,9 +53,9 @@
 {
   public:
     /**
-     * \brief Get the TypeId
+     * @brief Get the TypeId
      *
-     * \return The TypeId for this class
+     * @return The TypeId for this class
      */
     static TypeId GetTypeId();
 
@@ -84,7 +84,7 @@
      * set in the Attach () method from the corresponding field in the channel
      * to which the device is attached.  It can be overridden using this method.
      *
-     * \param bps the data rate at which this object operates
+     * @param bps the data rate at which this object operates
      */
     void SetDataRate(DataRate bps);
 
@@ -92,15 +92,15 @@
      * Set the interframe gap used to separate packets.  The interframe gap
      * defines the minimum space required between packets sent by this device.
      *
-     * \param t the interframe gap time
+     * @param t the interframe gap time
      */
     void SetInterframeGap(Time t);
 
     /**
      * Attach the device to a channel.
      *
-     * \param ch Ptr to the channel to which this object is being attached.
-     * \return true if the operation was successful (always true actually)
+     * @param ch Ptr to the channel to which this object is being attached.
+     * @return true if the operation was successful (always true actually)
      */
     bool Attach(Ptr<PointToPointChannel> ch);
 
@@ -110,14 +110,14 @@
      * The PointToPointNetDevice "owns" a queue that implements a queueing
      * method such as DropTailQueue or RedQueue
      *
-     * \param queue Ptr to the new queue.
+     * @param queue Ptr to the new queue.
      */
     void SetQueue(Ptr<Queue<Packet>> queue);
 
     /**
      * Get a copy of the attached Queue.
      *
-     * \returns Ptr to the queue.
+     * @returns Ptr to the queue.
      */
     Ptr<Queue<Packet>> GetQueue() const;
 
@@ -127,7 +127,7 @@
      * The PointToPointNetDevice may optionally include an ErrorModel in
      * the packet receive chain.
      *
-     * \param em Ptr to the ErrorModel.
+     * @param em Ptr to the ErrorModel.
      */
     void SetReceiveErrorModel(Ptr<ErrorModel> em);
 
@@ -139,7 +139,7 @@
      * used by the channel to indicate that the last bit of a packet has
      * arrived at the device.
      *
-     * \param p Ptr to the received packet.
+     * @param p Ptr to the received packet.
      */
     void Receive(Ptr<Packet> p);
 
@@ -189,20 +189,20 @@
 
   protected:
     /**
-     * \brief Handler for MPI receive event
+     * @brief Handler for MPI receive event
      *
-     * \param p Packet received
+     * @param p Packet received
      */
     void DoMpiReceive(Ptr<Packet> p);
 
   private:
     /**
-     * \brief Dispose of the object
+     * @brief Dispose of the object
      */
     void DoDispose() override;
 
     /**
-     * \returns the address of the remote device connected to this device
+     * @returns the address of the remote device connected to this device
      * through the point to point channel.
      */
     Address GetRemote() const;
@@ -210,17 +210,17 @@
     /**
      * Adds the necessary headers and trailers to a packet of data in order to
      * respect the protocol implemented by the agent.
-     * \param p packet
-     * \param protocolNumber protocol number
+     * @param p packet
+     * @param protocolNumber protocol number
      */
     void AddHeader(Ptr<Packet> p, uint16_t protocolNumber);
 
     /**
      * Removes, from a packet of data, all headers and trailers that
      * relate to the protocol implemented by the agent
-     * \param p Packet whose headers need to be processed
-     * \param param An integer parameter that can be set by the function
-     * \return Returns true if the packet should be forwarded up the
+     * @param p Packet whose headers need to be processed
+     * @param param An integer parameter that can be set by the function
+     * @return Returns true if the packet should be forwarded up the
      * protocol stack.
      */
     bool ProcessHeader(Ptr<Packet> p, uint16_t& param);
@@ -235,10 +235,10 @@
      * started sending signals.  An event is scheduled for the time at which
      * the bits have been completely transmitted.
      *
-     * \see PointToPointChannel::TransmitStart ()
-     * \see TransmitComplete()
-     * \param p a reference to the packet to send
-     * \returns true if success, false on failure
+     * @see PointToPointChannel::TransmitStart ()
+     * @see TransmitComplete()
+     * @param p a reference to the packet to send
+     * @returns true if success, false on failure
      */
     bool TransmitStart(Ptr<Packet> p);
 
@@ -251,7 +251,7 @@
     void TransmitComplete();
 
     /**
-     * \brief Make the link up and running
+     * @brief Make the link up and running
      *
      * It calls also the linkChange callback.
      */
@@ -293,7 +293,7 @@
      * The Queue which this PointToPointNetDevice uses as a packet source.
      * Management of this Queue has been delegated to the PointToPointNetDevice
      * and it has the responsibility for deletion.
-     * \see class DropTailQueue
+     * @see class DropTailQueue
      */
     Ptr<Queue<Packet>> m_queue;
 
@@ -422,7 +422,7 @@
     static const uint16_t DEFAULT_MTU = 1500; //!< Default MTU
 
     /**
-     * \brief The Maximum Transmission Unit
+     * @brief The Maximum Transmission Unit
      *
      * This corresponds to the maximum
      * number of bytes that can be transmitted as seen from higher layers.
@@ -434,16 +434,16 @@
     Ptr<Packet> m_currentPkt; //!< Current packet processed
 
     /**
-     * \brief PPP to Ethernet protocol number mapping
-     * \param protocol A PPP protocol number
-     * \return The corresponding Ethernet protocol number
+     * @brief PPP to Ethernet protocol number mapping
+     * @param protocol A PPP protocol number
+     * @return The corresponding Ethernet protocol number
      */
     static uint16_t PppToEther(uint16_t protocol);
 
     /**
-     * \brief Ethernet to PPP protocol number mapping
-     * \param protocol An Ethernet protocol number
-     * \return The corresponding PPP protocol number
+     * @brief Ethernet to PPP protocol number mapping
+     * @param protocol An Ethernet protocol number
+     * @return The corresponding PPP protocol number
      */
     static uint16_t EtherToPpp(uint16_t protocol);
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/point-to-point/model/point-to-point-remote-channel.h ns-3.44/src/point-to-point/model/point-to-point-remote-channel.h
--- ns-3.43/src/point-to-point/model/point-to-point-remote-channel.h	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/point-to-point/model/point-to-point-remote-channel.h	2025-03-09 16:55:49.683372300 -0700
@@ -19,9 +19,9 @@
 {
 
 /**
- * \ingroup point-to-point
+ * @ingroup point-to-point
  *
- * \brief A Remote Point-To-Point Channel
+ * @brief A Remote Point-To-Point Channel
  *
  * This object connects two point-to-point net devices where at least one
  * is not local to this simulator object. It simply override the transmit
@@ -31,29 +31,29 @@
 {
   public:
     /**
-     * \brief Get the TypeId
+     * @brief Get the TypeId
      *
-     * \return The TypeId for this class
+     * @return The TypeId for this class
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Constructor
+     * @brief Constructor
      */
     PointToPointRemoteChannel();
 
     /**
-     * \brief Deconstructor
+     * @brief Deconstructor
      */
     ~PointToPointRemoteChannel() override;
 
     /**
-     * \brief Transmit the packet
+     * @brief Transmit the packet
      *
-     * \param p Packet to transmit
-     * \param src Source PointToPointNetDevice
-     * \param txTime Transmit time to apply
-     * \returns true if successful (currently always true)
+     * @param p Packet to transmit
+     * @param src Source PointToPointNetDevice
+     * @param txTime Transmit time to apply
+     * @returns true if successful (currently always true)
      */
     bool TransmitStart(Ptr<const Packet> p, Ptr<PointToPointNetDevice> src, Time txTime) override;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/point-to-point/model/ppp-header.h ns-3.44/src/point-to-point/model/ppp-header.h
--- ns-3.43/src/point-to-point/model/ppp-header.h	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/point-to-point/model/ppp-header.h	2025-03-09 16:55:49.683372300 -0700
@@ -13,8 +13,8 @@
 {
 
 /**
- * \ingroup point-to-point
- * \brief Packet header for PPP
+ * @ingroup point-to-point
+ * @brief Packet header for PPP
  *
  * This class can be used to add a header to PPP packet.  Currently we do not
  * implement any of the state machine in \RFC{1661}, we just encapsulate the
@@ -38,26 +38,26 @@
 {
   public:
     /**
-     * \brief Construct a PPP header.
+     * @brief Construct a PPP header.
      */
     PppHeader();
 
     /**
-     * \brief Destroy a PPP header.
+     * @brief Destroy a PPP header.
      */
     ~PppHeader() override;
 
     /**
-     * \brief Get the TypeId
+     * @brief Get the TypeId
      *
-     * \return The TypeId for this class
+     * @return The TypeId for this class
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Get the TypeId of the instance
+     * @brief Get the TypeId of the instance
      *
-     * \return The TypeId for this instance
+     * @return The TypeId for this instance
      */
     TypeId GetInstanceTypeId() const override;
 
@@ -67,26 +67,26 @@
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Set the protocol type carried by this PPP packet
+     * @brief Set the protocol type carried by this PPP packet
      *
      * The type numbers to be used are defined in \RFC{3818}
      *
-     * \param protocol the protocol type being carried
+     * @param protocol the protocol type being carried
      */
     void SetProtocol(uint16_t protocol);
 
     /**
-     * \brief Get the protocol type carried by this PPP packet
+     * @brief Get the protocol type carried by this PPP packet
      *
      * The type numbers to be used are defined in \RFC{3818}
      *
-     * \return the protocol type being carried
+     * @return the protocol type being carried
      */
     uint16_t GetProtocol() const;
 
   private:
     /**
-     * \brief The PPP protocol type of the payload packet
+     * @brief The PPP protocol type of the payload packet
      */
     uint16_t m_protocol;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/point-to-point/test/point-to-point-test.cc ns-3.44/src/point-to-point/test/point-to-point-test.cc
--- ns-3.43/src/point-to-point/test/point-to-point-test.cc	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/point-to-point/test/point-to-point-test.cc	2025-03-09 16:55:49.683372300 -0700
@@ -18,7 +18,7 @@
 using namespace ns3;
 
 /**
- * \brief Test class for PointToPoint model
+ * @brief Test class for PointToPoint model
  *
  * It tries to send one packet from one NetDevice to another, over a
  * PointToPointChannel.
@@ -27,34 +27,34 @@
 {
   public:
     /**
-     * \brief Create the test
+     * @brief Create the test
      */
     PointToPointTest();
 
     /**
-     * \brief Run the test
+     * @brief Run the test
      */
     void DoRun() override;
 
   private:
     Ptr<const Packet> m_recvdPacket; //!< received packet
     /**
-     * \brief Send one packet to the device specified
+     * @brief Send one packet to the device specified
      *
-     * \param device NetDevice to send to.
-     * \param buffer Payload content of the packet.
-     * \param size Size of the payload.
+     * @param device NetDevice to send to.
+     * @param buffer Payload content of the packet.
+     * @param size Size of the payload.
      */
     void SendOnePacket(Ptr<PointToPointNetDevice> device, const uint8_t* buffer, uint32_t size);
     /**
-     * \brief Callback function which sets the recvdPacket parameter
+     * @brief Callback function which sets the recvdPacket parameter
      *
-     * \param dev The receiving device.
-     * \param pkt The received packet.
-     * \param mode The protocol mode used.
-     * \param sender The sender address.
+     * @param dev The receiving device.
+     * @param pkt The received packet.
+     * @param mode The protocol mode used.
+     * @param sender The sender address.
      *
-     * \return A boolean indicating packet handled properly.
+     * @return A boolean indicating packet handled properly.
      */
     bool RxPacket(Ptr<NetDevice> dev, Ptr<const Packet> pkt, uint16_t mode, const Address& sender);
 };
@@ -108,7 +108,7 @@
                          "for her merchandise, he traded in his prize.";
     size_t txBufferSize = sizeof(txBuffer);
 
-    Simulator::Schedule(Seconds(1.0),
+    Simulator::Schedule(Seconds(1),
                         &PointToPointTest::SendOnePacket,
                         this,
                         devA,
@@ -129,13 +129,13 @@
 }
 
 /**
- * \brief TestSuite for PointToPoint module
+ * @brief TestSuite for PointToPoint module
  */
 class PointToPointTestSuite : public TestSuite
 {
   public:
     /**
-     * \brief Constructor
+     * @brief Constructor
      */
     PointToPointTestSuite();
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/point-to-point-layout/model/point-to-point-dumbbell.h ns-3.44/src/point-to-point-layout/model/point-to-point-dumbbell.h
--- ns-3.43/src/point-to-point-layout/model/point-to-point-dumbbell.h	2024-10-09 16:41:10.076656600 -0700
+++ ns-3.44/src/point-to-point-layout/model/point-to-point-dumbbell.h	2025-03-09 16:55:49.683372300 -0700
@@ -22,9 +22,9 @@
 {
 
 /**
- * \ingroup point-to-point-layout
+ * @ingroup point-to-point-layout
  *
- * \brief A helper to make it easier to create a dumbbell topology
+ * @brief A helper to make it easier to create a dumbbell topology
  * with p2p links
  */
 class PointToPointDumbbellHelper
@@ -34,19 +34,19 @@
      * Create a PointToPointDumbbellHelper in order to easily create
      * dumbbell topologies using p2p links
      *
-     * \param nLeftLeaf number of left side leaf nodes in the dumbbell
+     * @param nLeftLeaf number of left side leaf nodes in the dumbbell
      *
-     * \param leftHelper PointToPointHelper used to install the links
+     * @param leftHelper PointToPointHelper used to install the links
      *                   between the left leaf nodes and the left-most
      *                   router
      *
-     * \param nRightLeaf number of right side leaf nodes in the dumbbell
+     * @param nRightLeaf number of right side leaf nodes in the dumbbell
      *
-     * \param rightHelper PointToPointHelper used to install the links
+     * @param rightHelper PointToPointHelper used to install the links
      *                    between the right leaf nodes and the right-most
      *                    router
      *
-     * \param bottleneckHelper PointToPointHelper used to install the link
+     * @param bottleneckHelper PointToPointHelper used to install the link
      *                         between the inner-routers, usually known as
      *                         the bottleneck link
      */
@@ -60,77 +60,77 @@
 
   public:
     /**
-     * \returns pointer to the node of the left side bottleneck
+     * @returns pointer to the node of the left side bottleneck
      *          router
      */
     Ptr<Node> GetLeft() const;
 
     /**
-     * \returns pointer to the i'th left side leaf node
-     * \param i node number
+     * @returns pointer to the i'th left side leaf node
+     * @param i node number
      */
     Ptr<Node> GetLeft(uint32_t i) const;
 
     /**
-     * \returns pointer to the node of the right side bottleneck
+     * @returns pointer to the node of the right side bottleneck
      *          router
      */
     Ptr<Node> GetRight() const;
 
     /**
-     * \returns pointer to the i'th right side leaf node
-     * \param i node number
+     * @returns pointer to the i'th right side leaf node
+     * @param i node number
      */
     Ptr<Node> GetRight(uint32_t i) const;
 
     /**
-     * \returns an Ipv4Address of the i'th left leaf
-     * \param i node number
+     * @returns an Ipv4Address of the i'th left leaf
+     * @param i node number
      */
     Ipv4Address GetLeftIpv4Address(uint32_t i) const; // Get left leaf address
 
     /**
-     * \returns an Ipv4Address of the i'th right leaf
-     * \param i node number
+     * @returns an Ipv4Address of the i'th right leaf
+     * @param i node number
      */
     Ipv4Address GetRightIpv4Address(uint32_t i) const; // Get right leaf address
 
     /**
-     * \returns an Ipv6Address of the i'th left leaf
-     * \param i node number
+     * @returns an Ipv6Address of the i'th left leaf
+     * @param i node number
      */
     Ipv6Address GetLeftIpv6Address(uint32_t i) const; // Get left leaf address
 
     /**
-     * \returns an Ipv6Address of the i'th right leaf
-     * \param i node number
+     * @returns an Ipv6Address of the i'th right leaf
+     * @param i node number
      */
     Ipv6Address GetRightIpv6Address(uint32_t i) const; // Get right leaf address
 
     /**
-     * \returns total number of left side leaf nodes
+     * @returns total number of left side leaf nodes
      */
     uint32_t LeftCount() const;
 
     /**
-     * \returns total number of right side leaf nodes
+     * @returns total number of right side leaf nodes
      */
     uint32_t RightCount() const;
 
     /**
-     * \param stack an InternetStackHelper which is used to install
+     * @param stack an InternetStackHelper which is used to install
      *              on every node in the dumbbell
      */
     void InstallStack(InternetStackHelper stack);
 
     /**
-     * \param leftIp Ipv4AddressHelper to assign Ipv4 addresses to the
+     * @param leftIp Ipv4AddressHelper to assign Ipv4 addresses to the
      *               interfaces on the left side of the dumbbell
      *
-     * \param rightIp Ipv4AddressHelper to assign Ipv4 addresses to the
+     * @param rightIp Ipv4AddressHelper to assign Ipv4 addresses to the
      *                interfaces on the right side of the dumbbell
      *
-     * \param routerIp Ipv4AddressHelper to assign Ipv4 addresses to the
+     * @param routerIp Ipv4AddressHelper to assign Ipv4 addresses to the
      *                 interfaces on the bottleneck link
      */
     void AssignIpv4Addresses(Ipv4AddressHelper leftIp,
@@ -138,9 +138,9 @@
                              Ipv4AddressHelper routerIp);
 
     /**
-     * \param network an IPv6 address representing the network portion
+     * @param network an IPv6 address representing the network portion
      *                of the IPv6 Address
-     * \param prefix the prefix length
+     * @param prefix the prefix length
      */
     void AssignIpv6Addresses(Ipv6Address network, Ipv6Prefix prefix);
 
@@ -148,10 +148,10 @@
      * Sets up the node canvas locations for every node in the dumbbell.
      * This is needed for use with the animation interface
      *
-     * \param ulx upper left x value
-     * \param uly upper left y value
-     * \param lrx lower right x value
-     * \param lry lower right y value
+     * @param ulx upper left x value
+     * @param uly upper left y value
+     * @param lrx lower right x value
+     * @param lry lower right y value
      */
     void BoundingBox(double ulx, double uly, double lrx, double lry) const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/point-to-point-layout/model/point-to-point-grid.h ns-3.44/src/point-to-point-layout/model/point-to-point-grid.h
--- ns-3.43/src/point-to-point-layout/model/point-to-point-grid.h	2024-10-09 16:41:10.076656600 -0700
+++ ns-3.44/src/point-to-point-layout/model/point-to-point-grid.h	2025-03-09 16:55:49.683372300 -0700
@@ -23,9 +23,9 @@
 {
 
 /**
- * \ingroup point-to-point-layout
+ * @ingroup point-to-point-layout
  *
- * \brief A helper to make it easier to create a grid topology
+ * @brief A helper to make it easier to create a grid topology
  * with p2p links
  */
 class PointToPointGridHelper
@@ -35,11 +35,11 @@
      * Create a PointToPointGridHelper in order to easily create
      * grid topologies using p2p links
      *
-     * \param nRows total number of rows in the grid
+     * @param nRows total number of rows in the grid
      *
-     * \param nCols total number of columns in the grid
+     * @param nCols total number of columns in the grid
      *
-     * \param pointToPoint the PointToPointHelper which is used
+     * @param pointToPoint the PointToPointHelper which is used
      *                     to connect all of the nodes together
      *                     in the grid
      */
@@ -48,11 +48,11 @@
     ~PointToPointGridHelper();
 
     /**
-     * \param row the row address of the node desired
+     * @param row the row address of the node desired
      *
-     * \param col the column address of the node desired
+     * @param col the column address of the node desired
      *
-     * \returns a pointer to the node specified by the
+     * @returns a pointer to the node specified by the
      *          (row, col) address
      */
     Ptr<Node> GetNode(uint32_t row, uint32_t col);
@@ -66,11 +66,11 @@
      * is the left row device of all the nodes, except the left-most
      * grid nodes, which returns the right row device.
      *
-     * \param row the row address of the node desired
+     * @param row the row address of the node desired
      *
-     * \param col the column address of the node desired
+     * @param col the column address of the node desired
      *
-     * \returns Ipv4Address of one of the interfaces of the node
+     * @returns Ipv4Address of one of the interfaces of the node
      *          specified by the (row, col) address
      */
     Ipv4Address GetIpv4Address(uint32_t row, uint32_t col);
@@ -84,17 +84,17 @@
      * is the left row device of all the nodes, except the left-most
      * grid nodes, which returns the right row device.
      *
-     * \param row the row address of the node desired
+     * @param row the row address of the node desired
      *
-     * \param col the column address of the node desired
+     * @param col the column address of the node desired
      *
-     * \returns Ipv6Address of one of the interfaces of the node
+     * @returns Ipv6Address of one of the interfaces of the node
      *          specified by the (row, col) address
      */
     Ipv6Address GetIpv6Address(uint32_t row, uint32_t col);
 
     /**
-     * \param stack an InternetStackHelper which is used to install
+     * @param stack an InternetStackHelper which is used to install
      *              on every node in the grid
      */
     void InstallStack(InternetStackHelper stack);
@@ -102,10 +102,10 @@
     /**
      * Assigns Ipv4 addresses to all the row and column interfaces
      *
-     * \param rowIp the Ipv4AddressHelper used to assign Ipv4 addresses
+     * @param rowIp the Ipv4AddressHelper used to assign Ipv4 addresses
      *              to all of the row interfaces in the grid
      *
-     * \param colIp the Ipv4AddressHelper used to assign Ipv4 addresses
+     * @param colIp the Ipv4AddressHelper used to assign Ipv4 addresses
      *              to all of the column interfaces in the grid
      */
     void AssignIpv4Addresses(Ipv4AddressHelper rowIp, Ipv4AddressHelper colIp);
@@ -113,9 +113,9 @@
     /**
      * Assigns Ipv6 addresses to all the row and column interfaces
      *
-     * \param network an IPv6 address representing the network portion
+     * @param network an IPv6 address representing the network portion
      *                of the IPv6 Address
-     * \param prefix the prefix length
+     * @param prefix the prefix length
      */
     void AssignIpv6Addresses(Ipv6Address network, Ipv6Prefix prefix);
 
@@ -123,10 +123,10 @@
      * Sets up the node canvas locations for every node in the grid.
      * This is needed for use with the animation interface
      *
-     * \param ulx upper left x value
-     * \param uly upper left y value
-     * \param lrx lower right x value
-     * \param lry lower right y value
+     * @param ulx upper left x value
+     * @param uly upper left y value
+     * @param lrx lower right x value
+     * @param lry lower right y value
      */
     void BoundingBox(double ulx, double uly, double lrx, double lry);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/point-to-point-layout/model/point-to-point-star.h ns-3.44/src/point-to-point-layout/model/point-to-point-star.h
--- ns-3.43/src/point-to-point-layout/model/point-to-point-star.h	2024-10-09 16:41:10.076656600 -0700
+++ ns-3.44/src/point-to-point-layout/model/point-to-point-star.h	2025-03-09 16:55:49.683372300 -0700
@@ -20,14 +20,14 @@
 {
 
 /**
- * \defgroup point-to-point-layout Point-to-Point Layout Helpers
+ * @defgroup point-to-point-layout Point-to-Point Layout Helpers
  *
  */
 
 /**
- * \ingroup point-to-point-layout
+ * @ingroup point-to-point-layout
  *
- * \brief A helper to make it easier to create a star topology
+ * @brief A helper to make it easier to create a star topology
  * with PointToPoint links
  */
 class PointToPointStarHelper
@@ -37,11 +37,11 @@
      * Create a PointToPointStarHelper in order to easily create
      * star topologies using p2p links
      *
-     * \param numSpokes the number of links attached to
+     * @param numSpokes the number of links attached to
      *        the hub node, creating a total of
      *        numSpokes + 1 nodes
      *
-     * \param p2pHelper the link helper for p2p links,
+     * @param p2pHelper the link helper for p2p links,
      *        used to link nodes together
      */
     PointToPointStarHelper(uint32_t numSpokes, PointToPointHelper p2pHelper);
@@ -50,68 +50,68 @@
 
   public:
     /**
-     * \returns a node pointer to the hub node in the
+     * @returns a node pointer to the hub node in the
      *          star, i.e., the center node
      */
     Ptr<Node> GetHub() const;
 
     /**
-     * \param i an index into the spokes of the star
+     * @param i an index into the spokes of the star
      *
-     * \returns a node pointer to the node at the indexed spoke
+     * @returns a node pointer to the node at the indexed spoke
      */
     Ptr<Node> GetSpokeNode(uint32_t i) const;
 
     /**
-     * \param i index into the hub interfaces
+     * @param i index into the hub interfaces
      *
-     * \returns Ipv4Address according to indexed hub interface
+     * @returns Ipv4Address according to indexed hub interface
      */
     Ipv4Address GetHubIpv4Address(uint32_t i) const;
 
     /**
-     * \param i index into the spoke interfaces
+     * @param i index into the spoke interfaces
      *
-     * \returns Ipv4Address according to indexed spoke interface
+     * @returns Ipv4Address according to indexed spoke interface
      */
     Ipv4Address GetSpokeIpv4Address(uint32_t i) const;
 
     /**
-     * \param i index into the hub interfaces
+     * @param i index into the hub interfaces
      *
-     * \returns Ipv6Address according to indexed hub interface
+     * @returns Ipv6Address according to indexed hub interface
      */
     Ipv6Address GetHubIpv6Address(uint32_t i) const;
 
     /**
-     * \param i index into the spoke interfaces
+     * @param i index into the spoke interfaces
      *
-     * \returns Ipv6Address according to indexed spoke interface
+     * @returns Ipv6Address according to indexed spoke interface
      */
     Ipv6Address GetSpokeIpv6Address(uint32_t i) const;
 
     /**
-     * \returns the total number of spokes in the star
+     * @returns the total number of spokes in the star
      */
     uint32_t SpokeCount() const;
 
     /**
-     * \param stack an InternetStackHelper which is used to install
+     * @param stack an InternetStackHelper which is used to install
      *              on every node in the star
      */
     void InstallStack(InternetStackHelper stack);
 
     /**
-     * \param address an Ipv4AddressHelper which is used to install
+     * @param address an Ipv4AddressHelper which is used to install
      *                Ipv4 addresses on all the node interfaces in
      *                the star
      */
     void AssignIpv4Addresses(Ipv4AddressHelper address);
 
     /**
-     * \param network an IPv6 address representing the network portion
+     * @param network an IPv6 address representing the network portion
      *                of the IPv6 Address
-     * \param prefix the prefix length
+     * @param prefix the prefix length
      */
     void AssignIpv6Addresses(Ipv6Address network, Ipv6Prefix prefix);
 
@@ -119,10 +119,10 @@
      * Sets up the node canvas locations for every node in the star.
      * This is needed for use with the animation interface
      *
-     * \param ulx upper left x value
-     * \param uly upper left y value
-     * \param lrx lower right x value
-     * \param lry lower right y value
+     * @param ulx upper left x value
+     * @param uly upper left y value
+     * @param lrx lower right x value
+     * @param lry lower right y value
      */
     void BoundingBox(double ulx, double uly, double lrx, double lry);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/propagation/doc/propagation.rst ns-3.44/src/propagation/doc/propagation.rst
--- ns-3.43/src/propagation/doc/propagation.rst	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/propagation/doc/propagation.rst	2025-03-09 16:55:49.683372300 -0700
@@ -410,7 +410,7 @@
 
 .. math::
 
-  L_\mathrm{O} = L_\mathrm{U} - 4.70 (\log{f})^2 + 18.33\log{f} - 40.94
+  L_\mathrm{O} = L_\mathrm{U} - 4.78 (\log{f})^2 + 18.33\log{f} - 40.94
 
 
 The literature lacks of extensions of the COST231 to open area (for suburban it seems that
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/propagation/examples/jakes-propagation-model-example.cc ns-3.44/src/propagation/examples/jakes-propagation-model-example.cc
--- ns-3.43/src/propagation/examples/jakes-propagation-model-example.cc	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/propagation/examples/jakes-propagation-model-example.cc	2025-03-09 16:55:49.683372300 -0700
@@ -15,8 +15,8 @@
 using namespace ns3;
 
 /**
- * \ingroup propagation
- * \brief Constructs a JakesPropagationlossModel and print the loss value as a function of time into
+ * @ingroup propagation
+ * @brief Constructs a JakesPropagationlossModel and print the loss value as a function of time into
  * std::cout. Distribution and correlation statistics is compared with a theoretical ones using R
  * package (http://www.r-project.org/). Scripts are presented within comments.
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/propagation/examples/main-propagation-loss.cc ns-3.44/src/propagation/examples/main-propagation-loss.cc
--- ns-3.43/src/propagation/examples/main-propagation-loss.cc	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/propagation/examples/main-propagation-loss.cc	2025-03-09 16:55:49.683372300 -0700
@@ -26,9 +26,9 @@
  * Round a double number to the given precision. e.g. dround(0.234, 0.1) = 0.2
  * and dround(0.257, 0.1) = 0.3
  *
- * \param number The number to round.
- * \param precision The precision.
- * \return the rounded number
+ * @param number The number to round.
+ * @param precision The precision.
+ * @return the rounded number
  */
 static double
 dround(double number, double precision)
@@ -49,10 +49,10 @@
 /**
  * Test the model by sampling over a distance.
  *
- * \param model The model to test.
- * \param targetDistance The target distance.
- * \param step The step.
- * \return a Gnuplot object to be plotted.
+ * @param model The model to test.
+ * @param targetDistance The target distance.
+ * @param step The step.
+ * @return a Gnuplot object to be plotted.
  */
 static Gnuplot
 TestDeterministic(Ptr<PropagationLossModel> model, double targetDistance, double step)
@@ -84,7 +84,7 @@
 
             dataset.Add(distance, rxPowerDbm);
 
-            Simulator::Stop(Seconds(1.0));
+            Simulator::Stop(Seconds(1));
             Simulator::Run();
         }
     }
@@ -103,11 +103,11 @@
 /**
  * Test the model by sampling over a distance.
  *
- * \param model The model to test.
- * \param targetDistance The target distance.
- * \param step The step.
- * \param samples Number of samples.
- * \return a Gnuplot object to be plotted.
+ * @param model The model to test.
+ * @param targetDistance The target distance.
+ * @param step The step.
+ * @param samples Number of samples.
+ * @return a Gnuplot object to be plotted.
  */
 static Gnuplot
 TestProbabilistic(Ptr<PropagationLossModel> model,
@@ -183,11 +183,11 @@
 /**
  * Test the model by sampling over time.
  *
- * \param model The model to test.
- * \param timeStep The time step.
- * \param timeTotal The total time.
- * \param distance The distance.
- * \return a Gnuplot object to be plotted.
+ * @param model The model to test.
+ * @param timeStep The time step.
+ * @param timeTotal The total time.
+ * @param distance The distance.
+ * @return a Gnuplot object to be plotted.
  */
 static Gnuplot
 TestDeterministicByTime(Ptr<PropagationLossModel> model,
@@ -250,7 +250,7 @@
     double testDeterministicDistance = 2500.0;
     double testProbabilisticDistance = 2500.0;
     unsigned int testProbabilisticSamples = 100000;
-    Time testJakesTimeOneMsRes = Seconds(1.0);
+    Time testJakesTimeOneMsRes = Seconds(1);
     Time testJakesTimeZeroDotOneMsRes = Seconds(0.1);
 
     if (test)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/propagation/model/channel-condition-model.cc ns-3.44/src/propagation/model/channel-condition-model.cc
--- ns-3.43/src/propagation/model/channel-condition-model.cc	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/propagation/model/channel-condition-model.cc	2025-03-09 16:55:49.687372200 -0700
@@ -24,41 +24,41 @@
 
 /// NTN Dense Urban LOS probabilities from table 6.6.1-1 of 3GPP 38.811
 const std::map<int, double> DenseUrbanLOSProb{
-    {10, {28.2}},
-    {20, {33.1}},
-    {30, {39.8}},
-    {40, {46.8}},
-    {50, {53.7}},
-    {60, {61.2}},
-    {70, {73.8}},
-    {80, {82.0}},
-    {90, {98.1}},
+    {10, {0.282}},
+    {20, {0.331}},
+    {30, {0.398}},
+    {40, {0.468}},
+    {50, {0.537}},
+    {60, {0.612}},
+    {70, {0.738}},
+    {80, {0.820}},
+    {90, {0.981}},
 };
 
 /// NTN Urban LOS probabilities from table 6.6.1-1 of 3GPP 38.811
 const std::map<int, double> UrbanLOSProb{
-    {10, {24.6}},
-    {20, {38.6}},
-    {30, {49.3}},
-    {40, {61.3}},
-    {50, {72.6}},
-    {60, {80.5}},
-    {70, {91.9}},
-    {80, {96.8}},
-    {90, {99.2}},
+    {10, {0.246}},
+    {20, {0.386}},
+    {30, {0.493}},
+    {40, {0.613}},
+    {50, {0.726}},
+    {60, {0.805}},
+    {70, {0.919}},
+    {80, {0.968}},
+    {90, {0.992}},
 };
 
 /// NTN Suburban LOS probabilities from table 6.6.1-1 of 3GPP 38.811
 const std::map<int, double> SuburbanRuralLOSProb{
-    {10, {78.2}},
-    {20, {86.9}},
-    {30, {91.9}},
-    {40, {92.9}},
-    {50, {93.5}},
-    {60, {94.0}},
-    {70, {94.9}},
-    {80, {95.2}},
-    {90, {99.8}},
+    {10, {0.782}},
+    {20, {0.869}},
+    {30, {0.919}},
+    {40, {0.929}},
+    {50, {0.935}},
+    {60, {0.940}},
+    {70, {0.949}},
+    {80, {0.952}},
+    {90, {0.998}},
 };
 
 } // namespace
@@ -388,7 +388,7 @@
 ThreeGppChannelConditionModel::DoDispose()
 {
     m_channelConditionMap.clear();
-    m_updatePeriod = Seconds(0.0);
+    m_updatePeriod = Seconds(0);
 }
 
 Ptr<ChannelCondition>
@@ -593,7 +593,7 @@
                   "Invalid elevation angle!");
 
     return std::make_tuple(elevAngle, elevAngleQuantized);
-};
+}
 
 // ------------------------------------------------------------------------- //
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/propagation/model/channel-condition-model.h ns-3.44/src/propagation/model/channel-condition-model.h
--- ns-3.43/src/propagation/model/channel-condition-model.h	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/propagation/model/channel-condition-model.h	2025-03-09 16:55:49.687372200 -0700
@@ -22,9 +22,9 @@
 class MobilityModel;
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- * \brief Carries information about the LOS/NLOS channel state
+ * @brief Carries information about the LOS/NLOS channel state
  *
  * Additional information about the channel condition can be aggregated to instances of
  * this class.
@@ -66,8 +66,8 @@
 
     /**
      * Get the type ID.
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -78,9 +78,9 @@
 
     /**
      * Constructor for the ChannelCondition class
-     * \param losCondition the LOS condition value
-     * \param o2iCondition the O2I condition value (by default is set to O2O)
-     * \param o2iLowHighCondition the O2I Low-High Building Penetration loss condition value (by
+     * @param losCondition the LOS condition value
+     * @param o2iCondition the O2I condition value (by default is set to O2O)
+     * @param o2iLowHighCondition the O2I Low-High Building Penetration loss condition value (by
      * default is set to LOW)
      */
     ChannelCondition(LosConditionValue losCondition,
@@ -96,7 +96,7 @@
      * Get the LosConditionValue containing the information about the LOS/NLOS
      * state of the channel
      *
-     * \return the LosConditionValue
+     * @return the LosConditionValue
      */
     LosConditionValue GetLosCondition() const;
 
@@ -104,7 +104,7 @@
      * Set the LosConditionValue with the information about the LOS/NLOS
      * state of the channel
      *
-     * \param losCondition the LosConditionValue
+     * @param losCondition the LosConditionValue
      */
     void SetLosCondition(LosConditionValue losCondition);
 
@@ -112,7 +112,7 @@
      * Get the O2iConditionValue containing the information about the O2I
      * state of the channel
      *
-     * \return the O2iConditionValue
+     * @return the O2iConditionValue
      */
     O2iConditionValue GetO2iCondition() const;
 
@@ -120,7 +120,7 @@
      * Set the O2iConditionValue containing the information about the O2I
      * state of the channel
      *
-     * \param o2iCondition the O2iConditionValue
+     * @param o2iCondition the O2iConditionValue
      */
     void SetO2iCondition(O2iConditionValue o2iCondition);
 
@@ -128,7 +128,7 @@
      * Get the O2iLowHighConditionValue containing the information about the O2I
      * building penetration losses (low or high)
      *
-     * \return the O2iLowHighConditionValue
+     * @return the O2iLowHighConditionValue
      */
     O2iLowHighConditionValue GetO2iLowHighCondition() const;
 
@@ -136,14 +136,14 @@
      * Set the O2iLowHighConditionValue containing the information about the O2I
      * building penetration losses (low or high)
      *
-     * \param o2iLowHighCondition the O2iLowHighConditionValue
+     * @param o2iLowHighCondition the O2iLowHighConditionValue
      */
     void SetO2iLowHighCondition(O2iLowHighConditionValue o2iLowHighCondition);
 
     /**
      * Return true if the channel condition is LOS
      *
-     * \return true if the channel condition is LOS
+     * @return true if the channel condition is LOS
      */
     bool IsLos() const;
 
@@ -154,44 +154,44 @@
      * vehicle. This case is represented as a separate channel condition (NLOSv),
      * use the method IsNlosv instead.
      *
-     * \return true if the channel condition is NLOS
+     * @return true if the channel condition is NLOS
      */
     bool IsNlos() const;
 
     /**
      * Return true if the channel condition is NLOSv
      *
-     * \return true if the channel condition is NLOSv
+     * @return true if the channel condition is NLOSv
      */
     bool IsNlosv() const;
 
     /**
      * Return true if the channel is outdoor-to-indoor
      *
-     * \return true if the channel is outdoor-to-indoor
+     * @return true if the channel is outdoor-to-indoor
      */
     bool IsO2i() const;
 
     /**
      * Return true if the channel is outdoor-to-outdoor
      *
-     * \return true if the channel is outdoor-to-outdoor
+     * @return true if the channel is outdoor-to-outdoor
      */
     bool IsO2o() const;
 
     /**
      * Return true if the channel is indoor-to-indoor
      *
-     * \return true if the channel is indoor-to-indoor
+     * @return true if the channel is indoor-to-indoor
      */
     bool IsI2i() const;
 
     /**
      * Return true if this instance is equivalent to the one passed as argument
      *
-     * \param losCondition the LOS condition of the other channel condition instance
-     * \param o2iCondition the 02I condition of the other channel condition instance
-     * \return true if the channel LOS and O2i conditions of the instance are equivalent to those
+     * @param losCondition the LOS condition of the other channel condition instance
+     * @param o2iCondition the 02I condition of the other channel condition instance
+     * @return true if the channel LOS and O2i conditions of the instance are equivalent to those
      * passed as arguments
      */
     bool IsEqual(LosConditionValue losCondition, O2iConditionValue o2iCondition) const;
@@ -206,18 +206,18 @@
 
     /**
      * Prints a LosConditionValue to output
-     * \param os the output stream
-     * \param cond the LosConditionValue
+     * @param os the output stream
+     * @param cond the LosConditionValue
      *
-     * \return a reference to the output stream
+     * @return a reference to the output stream
      */
     friend std::ostream& operator<<(std::ostream& os, LosConditionValue cond);
 };
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- * \brief Models the channel condition
+ * @brief Models the channel condition
  *
  * Computes the condition of the channel between the transmitter and the
  * receiver
@@ -227,8 +227,8 @@
   public:
     /**
      * Get the type ID.
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -249,9 +249,9 @@
     /**
      * Computes the condition of the channel between a and b
      *
-     * \param a mobility model
-     * \param b mobility model
-     * \return the condition of the channel between a and b
+     * @param a mobility model
+     * @param b mobility model
+     * @return the condition of the channel between a and b
      */
     virtual Ptr<ChannelCondition> GetChannelCondition(Ptr<const MobilityModel> a,
                                                       Ptr<const MobilityModel> b) const = 0;
@@ -262,24 +262,24 @@
      * 'stream'. Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream the offset used to set the stream numbers
-     * \return the number of stream indices assigned by this model
+     * @param stream the offset used to set the stream numbers
+     * @return the number of stream indices assigned by this model
      */
     virtual int64_t AssignStreams(int64_t stream) = 0;
 };
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- * \brief Models an always in-LoS condition model
+ * @brief Models an always in-LoS condition model
  */
 class AlwaysLosChannelConditionModel : public ChannelConditionModel
 {
   public:
     /**
      * Get the type ID.
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -300,9 +300,9 @@
     /**
      * Computes the condition of the channel between a and b, that will be always LoS
      *
-     * \param a mobility model
-     * \param b mobility model
-     * \return the condition of the channel between a and b, that will be always LoS
+     * @param a mobility model
+     * @param b mobility model
+     * @return the condition of the channel between a and b, that will be always LoS
      */
     Ptr<ChannelCondition> GetChannelCondition(Ptr<const MobilityModel> a,
                                               Ptr<const MobilityModel> b) const override;
@@ -313,24 +313,24 @@
      * 'stream'. Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream the offset used to set the stream numbers
-     * \return the number of stream indices assigned by this model
+     * @param stream the offset used to set the stream numbers
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream) override;
 };
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- * \brief Models a never in-LoS condition model
+ * @brief Models a never in-LoS condition model
  */
 class NeverLosChannelConditionModel : public ChannelConditionModel
 {
   public:
     /**
      * Get the type ID.
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -351,9 +351,9 @@
     /**
      * Computes the condition of the channel between a and b, that will be always non-LoS
      *
-     * \param a mobility model
-     * \param b mobility model
-     * \return the condition of the channel between a and b, that will be always non-LoS
+     * @param a mobility model
+     * @param b mobility model
+     * @return the condition of the channel between a and b, that will be always non-LoS
      */
     Ptr<ChannelCondition> GetChannelCondition(Ptr<const MobilityModel> a,
                                               Ptr<const MobilityModel> b) const override;
@@ -364,24 +364,24 @@
      * 'stream'. Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream the offset used to set the stream numbers
-     * \return the number of stream indices assigned by this model
+     * @param stream the offset used to set the stream numbers
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream) override;
 };
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- * \brief Models a never in-LoS condition model caused by a blocking vehicle
+ * @brief Models a never in-LoS condition model caused by a blocking vehicle
  */
 class NeverLosVehicleChannelConditionModel : public ChannelConditionModel
 {
   public:
     /**
      * Get the type ID.
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -403,9 +403,9 @@
     /**
      * Computes the condition of the channel between a and b, that will be always NLOSv
      *
-     * \param a mobility model
-     * \param b mobility model
-     * \return the condition of the channel between a and b, that will be always NLOSv
+     * @param a mobility model
+     * @param b mobility model
+     * @return the condition of the channel between a and b, that will be always NLOSv
      */
     Ptr<ChannelCondition> GetChannelCondition(Ptr<const MobilityModel> a,
                                               Ptr<const MobilityModel> b) const override;
@@ -416,16 +416,16 @@
      * 'stream'. Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream the offset used to set the stream numbers
-     * \return the number of stream indices assigned by this model
+     * @param stream the offset used to set the stream numbers
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream) override;
 };
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- * \brief Base class for the 3GPP channel condition models
+ * @brief Base class for the 3GPP channel condition models
  *
  */
 class ThreeGppChannelConditionModel : public ChannelConditionModel
@@ -433,8 +433,8 @@
   public:
     /**
      * Get the type ID.
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -449,15 +449,15 @@
     ~ThreeGppChannelConditionModel() override;
 
     /**
-     * \brief Retrieve the condition of the channel between a and b.
+     * @brief Retrieve the condition of the channel between a and b.
      *
      * If the channel condition does not exists, the method computes it by calling
      * ComputeChannelCondition and stores it in a local cache, that will be updated
      * following the "UpdatePeriod" parameter.
      *
-     * \param a mobility model
-     * \param b mobility model
-     * \return the condition of the channel between a and b
+     * @param a mobility model
+     * @param b mobility model
+     * @return the condition of the channel between a and b
      */
     Ptr<ChannelCondition> GetChannelCondition(Ptr<const MobilityModel> a,
                                               Ptr<const MobilityModel> b) const override;
@@ -468,8 +468,8 @@
      * 'stream'. Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream the offset used to set the stream numbers
-     * \return the number of stream indices assigned by this model
+     * @param stream the offset used to set the stream numbers
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream) override;
 
@@ -479,18 +479,18 @@
      * GeocentricConstantPositionMobilityModel, and that the quantized
      * angle is in the expected range [10, 90].
      *
-     * \param a mobility model
-     * \param b mobility model
-     * \return the tuple [elevation angle, quantized elevation angle] between a and b
+     * @param a mobility model
+     * @param b mobility model
+     * @return the tuple [elevation angle, quantized elevation angle] between a and b
      */
     static std::tuple<double, double> GetQuantizedElevationAngle(Ptr<const MobilityModel> a,
                                                                  Ptr<const MobilityModel> b);
 
     /**
-     * \brief Computes the 2D distance between two 3D vectors
-     * \param a the first 3D vector
-     * \param b the second 3D vector
-     * \return the 2D distance between a and b
+     * @brief Computes the 2D distance between two 3D vectors
+     * @param a the first 3D vector
+     * @param b the second 3D vector
+     * @return the 2D distance between a and b
      */
     static double Calculate2dDistance(const Vector& a, const Vector& b);
 
@@ -515,9 +515,9 @@
      * This method computes the channel condition based on a probabilistic model
      * that is specific for the scenario of interest
      *
-     * \param a tx mobility model
-     * \param b rx mobility model
-     * \return the channel condition
+     * @param a tx mobility model
+     * @param b rx mobility model
+     * @return the channel condition
      */
     Ptr<ChannelCondition> ComputeChannelCondition(Ptr<const MobilityModel> a,
                                                   Ptr<const MobilityModel> b) const;
@@ -525,18 +525,18 @@
     /**
      * Compute the LOS probability.
      *
-     * \param a tx mobility model
-     * \param b rx mobility model
-     * \return the LOS probability
+     * @param a tx mobility model
+     * @param b rx mobility model
+     * @return the LOS probability
      */
     virtual double ComputePlos(Ptr<const MobilityModel> a, Ptr<const MobilityModel> b) const = 0;
 
     /**
      * Determines whether the channel condition is O2I or O2O
      *
-     * \param a tx mobility model
-     * \param b rx mobility model
-     * \return the O2I channelcondition
+     * @param a tx mobility model
+     * @param b rx mobility model
+     * @return the O2I channelcondition
      */
     virtual ChannelCondition::O2iConditionValue ComputeO2i(Ptr<const MobilityModel> a,
                                                            Ptr<const MobilityModel> b) const;
@@ -544,17 +544,17 @@
     /**
      * Compute the NLOS probability. By default returns 1 - PLOS
      *
-     * \param a tx mobility model
-     * \param b rx mobility model
-     * \return the LOS probability
+     * @param a tx mobility model
+     * @param b rx mobility model
+     * @return the LOS probability
      */
     virtual double ComputePnlos(Ptr<const MobilityModel> a, Ptr<const MobilityModel> b) const;
 
     /**
-     * \brief Returns a unique and reciprocal key for the channel between a and b.
-     * \param a tx mobility model
-     * \param b rx mobility model
-     * \return channel key
+     * @brief Returns a unique and reciprocal key for the channel between a and b.
+     * @param a tx mobility model
+     * @param b rx mobility model
+     * @return channel key
      */
     static uint32_t GetKey(Ptr<const MobilityModel> a, Ptr<const MobilityModel> b);
 
@@ -586,9 +586,9 @@
 };
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- * \brief Computes the channel condition for the RMa scenario
+ * @brief Computes the channel condition for the RMa scenario
  *
  * Computes the channel condition following the specifications for the RMa
  * scenario reported in Table 7.4.2-1 of 3GPP TR 38.901
@@ -598,8 +598,8 @@
   public:
     /**
      * Get the type ID.
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -618,17 +618,17 @@
      * Compute the LOS probability as specified in Table 7.4.2-1 of 3GPP TR 38.901
      * for the RMa scenario.
      *
-     * \param a tx mobility model
-     * \param b rx mobility model
-     * \return the LOS probability
+     * @param a tx mobility model
+     * @param b rx mobility model
+     * @return the LOS probability
      */
     double ComputePlos(Ptr<const MobilityModel> a, Ptr<const MobilityModel> b) const override;
 };
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- * \brief Computes the channel condition for the UMa scenario
+ * @brief Computes the channel condition for the UMa scenario
  *
  * Computes the channel condition following the specifications for the UMa
  * scenario reported in Table 7.4.2-1 of 3GPP TR 38.901
@@ -638,8 +638,8 @@
   public:
     /**
      * Get the type ID.
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -658,17 +658,17 @@
      * Compute the LOS probability as specified in Table 7.4.2-1 of 3GPP TR 38.901
      * for the UMa scenario.
      *
-     * \param a tx mobility model
-     * \param b rx mobility model
-     * \return the LOS probability
+     * @param a tx mobility model
+     * @param b rx mobility model
+     * @return the LOS probability
      */
     double ComputePlos(Ptr<const MobilityModel> a, Ptr<const MobilityModel> b) const override;
 };
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- * \brief Computes the channel condition for the UMi-Street canyon scenario
+ * @brief Computes the channel condition for the UMi-Street canyon scenario
  *
  * Computes the channel condition following the specifications for the
  * UMi-Street canyon scenario reported in Table 7.4.2-1 of 3GPP TR 38.901
@@ -678,8 +678,8 @@
   public:
     /**
      * Get the type ID.
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -698,17 +698,17 @@
      * Compute the LOS probability as specified in Table 7.4.2-1 of 3GPP TR 38.901
      * for the UMi-Street Canyon scenario.
      *
-     * \param a tx mobility model
-     * \param b rx mobility model
-     * \return the LOS probability
+     * @param a tx mobility model
+     * @param b rx mobility model
+     * @return the LOS probability
      */
     double ComputePlos(Ptr<const MobilityModel> a, Ptr<const MobilityModel> b) const override;
 };
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- * \brief Computes the channel condition for the Indoor Mixed Office scenario
+ * @brief Computes the channel condition for the Indoor Mixed Office scenario
  *
  * Computes the channel condition following the specifications for the
  * Indoor Mixed Office scenario reported in Table 7.4.2-1 of 3GPP TR 38.901
@@ -718,8 +718,8 @@
   public:
     /**
      * Get the type ID.
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -738,17 +738,17 @@
      * Compute the LOS probability as specified in Table 7.4.2-1 of 3GPP TR 38.901
      * for the Indoor Mixed Office scenario.
      *
-     * \param a tx mobility model
-     * \param b rx mobility model
-     * \return the LOS probability
+     * @param a tx mobility model
+     * @param b rx mobility model
+     * @return the LOS probability
      */
     double ComputePlos(Ptr<const MobilityModel> a, Ptr<const MobilityModel> b) const override;
 };
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- * \brief Computes the channel condition for the Indoor Open Office scenario
+ * @brief Computes the channel condition for the Indoor Open Office scenario
  *
  * Computes the channel condition following the specifications for the
  * Indoor Open Office scenario reported in Table 7.4.2-1 of 3GPP TR 38.901
@@ -758,8 +758,8 @@
   public:
     /**
      * Get the type ID.
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -778,17 +778,17 @@
      * Compute the LOS probability as specified in Table 7.4.2-1 of 3GPP TR 38.901
      * for the Indoor Open Office scenario.
      *
-     * \param a tx mobility model
-     * \param b rx mobility model
-     * \return the LOS probability
+     * @param a tx mobility model
+     * @param b rx mobility model
+     * @return the LOS probability
      */
     double ComputePlos(Ptr<const MobilityModel> a, Ptr<const MobilityModel> b) const override;
 };
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- * \brief Computes the channel condition for the NTN Dense Urban Scenario
+ * @brief Computes the channel condition for the NTN Dense Urban Scenario
  *
  * Computes the channel condition following the specifications for the
  * Indoor Mixed Office scenario reported in Table 6.6.1-1 of 3GPP TR 38.811
@@ -798,7 +798,7 @@
   public:
     /**
      *  Register this type.
-     *  \return The object TypeId.
+     *  @return The object TypeId.
      */
     static TypeId GetTypeId();
 
@@ -814,7 +814,7 @@
 
   private:
     /**
-     * \copydoc ThreeGppChannelConditionModel::ComputePlos
+     * @copydoc ThreeGppChannelConditionModel::ComputePlos
      *
      * Compute the LOS probability as specified in Table 6.6.1-1 of 3GPP TR 38.811
      * for the NTN Dense Urban scenario.
@@ -823,9 +823,9 @@
 };
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- * \brief Computes the channel condition for the NTN Urban Scenario
+ * @brief Computes the channel condition for the NTN Urban Scenario
  *
  * Computes the channel condition following the specifications for the
  * Indoor Mixed Office scenario reported in Table 6.6.1-1 of 3GPP TR 38.811
@@ -835,7 +835,7 @@
   public:
     /**
      *  Register this type.
-     *  \return The object TypeId.
+     *  @return The object TypeId.
      */
     static TypeId GetTypeId();
 
@@ -851,7 +851,7 @@
 
   private:
     /**
-     * \copydoc ThreeGppChannelConditionModel::ComputePlos
+     * @copydoc ThreeGppChannelConditionModel::ComputePlos
      *
      * Compute the LOS probability as specified in Table 6.6.1-1 of 3GPP TR 38.811
      * for the NTN Urban scenario.
@@ -860,9 +860,9 @@
 };
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- * \brief Computes the channel condition for the NTN Suburban Scenario
+ * @brief Computes the channel condition for the NTN Suburban Scenario
  *
  * Computes the channel condition following the specifications for the
  * Indoor Mixed Office scenario reported in Table 6.6.1-1 of 3GPP TR 38.811
@@ -872,7 +872,7 @@
   public:
     /**
      *  Register this type.
-     *  \return The object TypeId.
+     *  @return The object TypeId.
      */
     static TypeId GetTypeId();
 
@@ -888,7 +888,7 @@
 
   private:
     /**
-     * \copydoc ThreeGppChannelConditionModel::ComputePlos
+     * @copydoc ThreeGppChannelConditionModel::ComputePlos
      *
      * Compute the LOS probability as specified in Table 6.6.1-1 of 3GPP TR 38.811
      * for the NTN Suburban scenario.
@@ -897,9 +897,9 @@
 };
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- * \brief Computes the channel condition for the NTN Rural Scenario
+ * @brief Computes the channel condition for the NTN Rural Scenario
  *
  * Computes the channel condition following the specifications for the
  * Indoor Mixed Office scenario reported in Table 6.6.1-1 of 3GPP TR 38.811
@@ -909,7 +909,7 @@
   public:
     /**
      *  Register this type.
-     *  \return The object TypeId.
+     *  @return The object TypeId.
      */
     static TypeId GetTypeId();
 
@@ -925,7 +925,7 @@
 
   private:
     /**
-     * \copydoc ThreeGppChannelConditionModel::ComputePlos
+     * @copydoc ThreeGppChannelConditionModel::ComputePlos
      *
      * Compute the LOS probability as specified in Table 6.6.1-1 of 3GPP TR 38.811
      * for the NTN Rural scenario.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/propagation/model/cost231-propagation-loss-model.h ns-3.44/src/propagation/model/cost231-propagation-loss-model.h
--- ns-3.43/src/propagation/model/cost231-propagation-loss-model.h	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/propagation/model/cost231-propagation-loss-model.h	2025-03-09 16:55:49.687372200 -0700
@@ -18,9 +18,9 @@
 {
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- *  \brief The COST-Hata-Model is the most often cited of the COST 231 models.
+ *  @brief The COST-Hata-Model is the most often cited of the COST 231 models.
  *
  *  Also called the Hata Model PCS Extension, it is a radio propagation model
  *  that extends the Hata Model (which in turn is based on the Okumura Model)
@@ -41,8 +41,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     Cost231PropagationLossModel();
@@ -53,67 +53,67 @@
 
     /**
      * Get the propagation loss
-     * \param a the mobility model of the source
-     * \param b the mobility model of the destination
-     * \returns the propagation loss (in dBm)
+     * @param a the mobility model of the source
+     * @param b the mobility model of the destination
+     * @returns the propagation loss (in dBm)
      */
     double GetLoss(Ptr<MobilityModel> a, Ptr<MobilityModel> b) const;
 
     /**
      * Set the BS antenna height
-     * \param height BS antenna height [m]
+     * @param height BS antenna height [m]
      */
     void SetBSAntennaHeight(double height);
     /**
      * Set the SS antenna height
-     * \param height SS antenna height [m]
+     * @param height SS antenna height [m]
      */
     void SetSSAntennaHeight(double height);
 
     /**
      * Set the wavelength
-     * \param lambda the wavelength
+     * @param lambda the wavelength
      */
     void SetLambda(double lambda);
     /**
      * Set the wavelength
-     * \param frequency the signal frequency [Hz]
-     * \param speed the signal speed [m/s]
+     * @param frequency the signal frequency [Hz]
+     * @param speed the signal speed [m/s]
      */
     void SetLambda(double frequency, double speed);
     /**
      * Set the minimum model distance
-     * \param minDistance the minimum model distance
+     * @param minDistance the minimum model distance
      */
     void SetMinDistance(double minDistance);
     /**
      * Get the BS antenna height
-     * \returns BS antenna height [m]
+     * @returns BS antenna height [m]
      */
     double GetBSAntennaHeight() const;
     /**
      * Get the SS antenna height
-     * \returns SS antenna height [m]
+     * @returns SS antenna height [m]
      */
     double GetSSAntennaHeight() const;
     /**
      * Get the minimum model distance
-     * \returns the minimum model distance
+     * @returns the minimum model distance
      */
     double GetMinDistance() const;
     /**
      * Get the wavelength
-     * \returns the wavelength
+     * @returns the wavelength
      */
     double GetLambda() const;
     /**
      * Get the shadowing value
-     * \returns the shadowing value
+     * @returns the shadowing value
      */
     double GetShadowing() const;
     /**
      * Set the shadowing value
-     * \param shadowing the shadowing value
+     * @param shadowing the shadowing value
      */
     void SetShadowing(double shadowing);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/propagation/model/itu-r-1411-los-propagation-loss-model.h ns-3.44/src/propagation/model/itu-r-1411-los-propagation-loss-model.h
--- ns-3.43/src/propagation/model/itu-r-1411-los-propagation-loss-model.h	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/propagation/model/itu-r-1411-los-propagation-loss-model.h	2025-03-09 16:55:49.687372200 -0700
@@ -17,9 +17,9 @@
 {
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- * \brief the ITU-R 1411 LOS propagation model
+ * @brief the ITU-R 1411 LOS propagation model
  *
  * This class implements the ITU-R 1411 LOS propagation model for
  * Line-of-Sight (LoS) short range outdoor communication in the
@@ -31,8 +31,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -46,17 +46,17 @@
     /**
      * Set the operating frequency
      *
-     * \param freq the frequency in Hz
+     * @param freq the frequency in Hz
      */
     void SetFrequency(double freq);
 
     /**
      *
      *
-     * \param a the first mobility model
-     * \param b the second mobility model
+     * @param a the first mobility model
+     * @param b the second mobility model
      *
-     * \return the loss in dBm for the propagation between
+     * @return the loss in dBm for the propagation between
      * the two given mobility models
      */
     double GetLoss(Ptr<MobilityModel> a, Ptr<MobilityModel> b) const;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/propagation/model/itu-r-1411-nlos-over-rooftop-propagation-loss-model.h ns-3.44/src/propagation/model/itu-r-1411-nlos-over-rooftop-propagation-loss-model.h
--- ns-3.43/src/propagation/model/itu-r-1411-nlos-over-rooftop-propagation-loss-model.h	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/propagation/model/itu-r-1411-nlos-over-rooftop-propagation-loss-model.h	2025-03-09 16:55:49.687372200 -0700
@@ -18,9 +18,9 @@
 {
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- * \brief the ITU-R 1411 NLOS over rooftop propagation model
+ * @brief the ITU-R 1411 NLOS over rooftop propagation model
  *
  * This class implements the ITU-R 1411 LOS propagation model for
  * Non-Line-of-Sight (NLoS) short range outdoor communication over
@@ -32,8 +32,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -49,17 +49,17 @@
     /**
      * Set the operating frequency
      *
-     * \param freq the frequency in Hz
+     * @param freq the frequency in Hz
      */
     void SetFrequency(double freq);
 
     /**
      *
      *
-     * \param a the first mobility model
-     * \param b the second mobility model
+     * @param a the first mobility model
+     * @param b the second mobility model
      *
-     * \return the loss in dBm for the propagation between
+     * @return the loss in dBm for the propagation between
      * the two given mobility models
      */
     double GetLoss(Ptr<MobilityModel> a, Ptr<MobilityModel> b) const;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/propagation/model/jakes-process.h ns-3.44/src/propagation/model/jakes-process.h
--- ns-3.43/src/propagation/model/jakes-process.h	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/propagation/model/jakes-process.h	2025-03-09 16:55:49.687372200 -0700
@@ -20,9 +20,9 @@
 class JakesPropagationLossModel;
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- * \brief Implementation for a single path Stationary Jakes propagation loss model.
+ * @brief Implementation for a single path Stationary Jakes propagation loss model.
  *
  * The Jakes propagation loss model implemented here is
  * described in [1].
@@ -46,8 +46,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     JakesProcess();
@@ -55,18 +55,18 @@
 
     /**
      * Get the channel complex gain
-     * \return the channel complex gain
+     * @return the channel complex gain
      */
     std::complex<double> GetComplexGain() const;
     /**
      * Get the channel gain in dB
-     * \return the channel gain [dB]
+     * @return the channel gain [dB]
      */
     double GetChannelGainDb() const;
 
     /**
      * Set the propagation model using this class
-     * \param model the propagation model using this class
+     * @param model the propagation model using this class
      */
     void SetPropagationLossModel(Ptr<const PropagationLossModel> model);
 
@@ -81,15 +81,15 @@
     {
         /**
          * Initiate oscillator with complex amplitude, initial phase and rotation speed
-         * \param amplitude initial complex amplitude
-         * \param initialPhase initial phase
-         * \param omega rotation speed
+         * @param amplitude initial complex amplitude
+         * @param initialPhase initial phase
+         * @param omega rotation speed
          */
         Oscillator(std::complex<double> amplitude, double initialPhase, double omega);
         /**
          * Get the complex amplitude at a given moment
-         * \param t time instant
-         * \returns the complex amplitude
+         * @param t time instant
+         * @returns the complex amplitude
          */
         std::complex<double> GetValueAt(Time t) const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/propagation/model/jakes-propagation-loss-model.h ns-3.44/src/propagation/model/jakes-propagation-loss-model.h
--- ns-3.43/src/propagation/model/jakes-propagation-loss-model.h	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/propagation/model/jakes-propagation-loss-model.h	2025-03-09 16:55:49.687372200 -0700
@@ -15,9 +15,9 @@
 namespace ns3
 {
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- * \brief a  Jakes narrowband propagation model.
+ * @brief a  Jakes narrowband propagation model.
  * Symmetrical cache for JakesProcess
  */
 
@@ -25,8 +25,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     JakesPropagationLossModel();
@@ -50,7 +50,7 @@
 
     /**
      * Get the underlying RNG stream
-     * \return the RNG stream
+     * @return the RNG stream
      */
     Ptr<UniformRandomVariable> GetUniformRandomVariable() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/propagation/model/kun-2600-mhz-propagation-loss-model.h ns-3.44/src/propagation/model/kun-2600-mhz-propagation-loss-model.h
--- ns-3.43/src/propagation/model/kun-2600-mhz-propagation-loss-model.h	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/propagation/model/kun-2600-mhz-propagation-loss-model.h	2025-03-09 16:55:49.687372200 -0700
@@ -17,9 +17,9 @@
 {
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- * \brief Empirical propagation model for the 2.6 GHz frequency
+ * @brief Empirical propagation model for the 2.6 GHz frequency
  *
  * This class implements the empirical model for 2.6 GHz taken from this paper:
  * Sun Kun, Wang Ping, Li Yingze
@@ -30,8 +30,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -43,10 +43,10 @@
     Kun2600MhzPropagationLossModel& operator=(const Kun2600MhzPropagationLossModel&) = delete;
 
     /**
-     * \param a the first mobility model
-     * \param b the second mobility model
+     * @param a the first mobility model
+     * @param b the second mobility model
      *
-     * \return the loss in dBm for the propagation between
+     * @return the loss in dBm for the propagation between
      * the two given mobility models
      */
     double GetLoss(Ptr<MobilityModel> a, Ptr<MobilityModel> b) const;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/propagation/model/okumura-hata-propagation-loss-model.cc ns-3.44/src/propagation/model/okumura-hata-propagation-loss-model.cc
--- ns-3.43/src/propagation/model/okumura-hata-propagation-loss-model.cc	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/propagation/model/okumura-hata-propagation-loss-model.cc	2025-03-09 16:55:49.687372200 -0700
@@ -120,7 +120,7 @@
         }
         else if (m_environment == OpenAreasEnvironment)
         {
-            loss += -4.70 * std::pow(log_fMhz, 2) + 18.33 * log_fMhz - 40.94;
+            loss += -4.78 * std::pow(log_fMhz, 2) + 18.33 * log_fMhz - 40.94;
         }
     }
     else
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/propagation/model/okumura-hata-propagation-loss-model.h ns-3.44/src/propagation/model/okumura-hata-propagation-loss-model.h
--- ns-3.43/src/propagation/model/okumura-hata-propagation-loss-model.h	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/propagation/model/okumura-hata-propagation-loss-model.h	2025-03-09 16:55:49.687372200 -0700
@@ -18,9 +18,9 @@
 {
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- * \brief this class implements the Okumura Hata propagation loss model
+ * @brief this class implements the Okumura Hata propagation loss model
  *
  * this class implements the Okumura Hata propagation loss model,
  * which is used to model open area pathloss for distances > 1 Km
@@ -32,8 +32,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -45,10 +45,10 @@
     OkumuraHataPropagationLossModel& operator=(const OkumuraHataPropagationLossModel&) = delete;
 
     /**
-     * \param a the first mobility model
-     * \param b the second mobility model
+     * @param a the first mobility model
+     * @param b the second mobility model
      *
-     * \return the loss in dBm for the propagation between
+     * @return the loss in dBm for the propagation between
      * the two given mobility models
      */
     double GetLoss(Ptr<MobilityModel> a, Ptr<MobilityModel> b) const;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/propagation/model/probabilistic-v2v-channel-condition-model.h ns-3.44/src/propagation/model/probabilistic-v2v-channel-condition-model.h
--- ns-3.43/src/propagation/model/probabilistic-v2v-channel-condition-model.h	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/propagation/model/probabilistic-v2v-channel-condition-model.h	2025-03-09 16:55:49.687372200 -0700
@@ -16,9 +16,9 @@
 class MobilityModel;
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- * \brief Computes the channel condition for the V2V Urban scenario
+ * @brief Computes the channel condition for the V2V Urban scenario
  *
  * Computes the channel condition following the probabilistic model described in
  * M. Boban,  X.Gong, and  W. Xu, “Modeling the evolution of line-of-sight
@@ -30,8 +30,8 @@
   public:
     /**
      * Get the type ID.
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -49,18 +49,18 @@
     /**
      * Compute the LOS probability
      *
-     * \param a tx mobility model
-     * \param b rx mobility model
-     * \return the LOS probability
+     * @param a tx mobility model
+     * @param b rx mobility model
+     * @return the LOS probability
      */
     double ComputePlos(Ptr<const MobilityModel> a, Ptr<const MobilityModel> b) const override;
 
     /**
      * Compute the NLOS probability
      *
-     * \param a tx mobility model
-     * \param b rx mobility model
-     * \return the NLOS probability
+     * @param a tx mobility model
+     * @param b rx mobility model
+     * @return the NLOS probability
      */
     double ComputePnlos(Ptr<const MobilityModel> a, Ptr<const MobilityModel> b) const override;
 
@@ -68,9 +68,9 @@
 };
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- * \brief Computes the channel condition for the V2V Highway scenario
+ * @brief Computes the channel condition for the V2V Highway scenario
  *
  * Computes the channel condition following the probabilistic model described in
  * M. Boban,  X.Gong, and  W. Xu, “Modeling the evolution of line-of-sight
@@ -82,8 +82,8 @@
   public:
     /**
      * Get the type ID.
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -101,18 +101,18 @@
     /**
      * Compute the LOS probability
      *
-     * \param a tx mobility model
-     * \param b rx mobility model
-     * \return the LOS probability
+     * @param a tx mobility model
+     * @param b rx mobility model
+     * @return the LOS probability
      */
     double ComputePlos(Ptr<const MobilityModel> a, Ptr<const MobilityModel> b) const override;
 
     /**
      * Compute the NLOS probability
      *
-     * \param a tx mobility model
-     * \param b rx mobility model
-     * \return the NLOS probability
+     * @param a tx mobility model
+     * @param b rx mobility model
+     * @return the NLOS probability
      */
     double ComputePnlos(Ptr<const MobilityModel> a, Ptr<const MobilityModel> b) const override;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/propagation/model/propagation-cache.h ns-3.44/src/propagation/model/propagation-cache.h
--- ns-3.43/src/propagation/model/propagation-cache.h	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/propagation/model/propagation-cache.h	2025-03-09 16:55:49.687372200 -0700
@@ -15,8 +15,8 @@
 namespace ns3
 {
 /**
- * \ingroup propagation
- * \brief Constructs a cache of objects, where each object is responsible for a single propagation
+ * @ingroup propagation
+ * @brief Constructs a cache of objects, where each object is responsible for a single propagation
  * path loss calculations. Propagation path a-->b and b-->a is the same thing. Propagation path is
  * identified by a couple of MobilityModels and a spectrum model UID
  */
@@ -24,15 +24,20 @@
 class PropagationCache
 {
   public:
-    PropagationCache(){};
-    ~PropagationCache(){};
+    PropagationCache()
+    {
+    }
+
+    ~PropagationCache()
+    {
+    }
 
     /**
      * Get the model associated with the path
-     * \param a 1st node mobility model
-     * \param b 2nd node mobility model
-     * \param modelUid model UID
-     * \return the model
+     * @param a 1st node mobility model
+     * @param b 2nd node mobility model
+     * @param modelUid model UID
+     * @return the model
      */
     Ptr<T> GetPathData(Ptr<const MobilityModel> a, Ptr<const MobilityModel> b, uint32_t modelUid)
     {
@@ -47,10 +52,10 @@
 
     /**
      * Add a model to the path
-     * \param data the model to associate to the path
-     * \param a 1st node mobility model
-     * \param b 2nd node mobility model
-     * \param modelUid model UID
+     * @param data the model to associate to the path
+     * @param a 1st node mobility model
+     * @param b 2nd node mobility model
+     * @param modelUid model UID
      */
     void AddPathData(Ptr<T> data,
                      Ptr<const MobilityModel> a,
@@ -89,7 +94,10 @@
                                   uint32_t modelUid)
             : m_srcMobility(a),
               m_dstMobility(b),
-              m_spectrumModelUid(modelUid){};
+              m_spectrumModelUid(modelUid)
+        {
+        }
+
         Ptr<const MobilityModel> m_srcMobility; //!< 1st node mobility model
         Ptr<const MobilityModel> m_dstMobility; //!< 2nd node mobility model
         uint32_t m_spectrumModelUid;            //!< model UID
@@ -103,8 +111,8 @@
          * If the models are different, the comparison is based on their Uid.
          * Otherwise, the comparison is based on the pointers of the Mobility models.
          *
-         * \param other Right value of the operator.
-         * \returns True if the Left value is less than the Right value.
+         * @param other Right value of the operator.
+         * @returns True if the Left value is less than the Right value.
          */
         bool operator<(const PropagationPathIdentifier& other) const
         {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/propagation/model/propagation-delay-model.h ns-3.44/src/propagation/model/propagation-delay-model.h
--- ns-3.43/src/propagation/model/propagation-delay-model.h	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/propagation/model/propagation-delay-model.h	2025-03-09 16:55:49.687372200 -0700
@@ -19,23 +19,23 @@
 class MobilityModel;
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- * \brief calculate a propagation delay.
+ * @brief calculate a propagation delay.
  */
 class PropagationDelayModel : public Object
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     ~PropagationDelayModel() override;
     /**
-     * \param a the source
-     * \param b the destination
-     * \returns the calculated propagation delay
+     * @param a the source
+     * @param b the destination
+     * @returns the calculated propagation delay
      *
      * Calculate the propagation delay between the specified
      * source and destination.
@@ -47,8 +47,8 @@
      * 'stream'.  Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream);
 
@@ -59,23 +59,23 @@
      * Subclasses must implement this; those not using random variables
      * can return zero.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     virtual int64_t DoAssignStreams(int64_t stream) = 0;
 };
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- * \brief the propagation delay is random
+ * @brief the propagation delay is random
  */
 class RandomPropagationDelayModel : public PropagationDelayModel
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -92,16 +92,16 @@
 };
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- * \brief the propagation speed is constant
+ * @brief the propagation speed is constant
  */
 class ConstantSpeedPropagationDelayModel : public PropagationDelayModel
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -111,11 +111,11 @@
     ConstantSpeedPropagationDelayModel();
     Time GetDelay(Ptr<MobilityModel> a, Ptr<MobilityModel> b) const override;
     /**
-     * \param speed the new speed (m/s)
+     * @param speed the new speed (m/s)
      */
     void SetSpeed(double speed);
     /**
-     * \returns the current propagation speed (m/s).
+     * @returns the current propagation speed (m/s).
      */
     double GetSpeed() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/propagation/model/propagation-environment.h ns-3.44/src/propagation/model/propagation-environment.h
--- ns-3.43/src/propagation/model/propagation-environment.h	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/propagation/model/propagation-environment.h	2025-03-09 16:55:49.687372200 -0700
@@ -15,7 +15,7 @@
 {
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
  * The type of propagation environment
  *
@@ -28,7 +28,7 @@
 };
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
  * The size of the city in which propagation takes place
  *
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/propagation/model/propagation-loss-model.h ns-3.44/src/propagation/model/propagation-loss-model.h
--- ns-3.43/src/propagation/model/propagation-loss-model.h	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/propagation/model/propagation-loss-model.h	2025-03-09 16:55:49.687372200 -0700
@@ -22,21 +22,21 @@
 {
 
 /**
- * \defgroup propagation Propagation Models
+ * @defgroup propagation Propagation Models
  */
 
 /**
- * \ingroup propagation
- * \ingroup tests
- * \defgroup propagation-tests Propagation module tests
+ * @ingroup propagation
+ * @ingroup tests
+ * @defgroup propagation-tests Propagation module tests
  */
 
 class MobilityModel;
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- * \brief Models the propagation loss through a transmission medium
+ * @brief Models the propagation loss through a transmission medium
  *
  * Calculate the receive power (dbm) from a transmit power (dbm)
  * and a mobility model for the source and destination positions.
@@ -46,8 +46,8 @@
   public:
     /**
      * Get the type ID.
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -59,8 +59,8 @@
     PropagationLossModel& operator=(const PropagationLossModel&) = delete;
 
     /**
-     * \brief Enables a chain of loss models to act on the signal
-     * \param next The next PropagationLossModel to add to the chain
+     * @brief Enables a chain of loss models to act on the signal
+     * @param next The next PropagationLossModel to add to the chain
      *
      * This method of chaining propagation loss models only works commutatively
      * if the propagation loss of all models in the chain are independent
@@ -69,9 +69,9 @@
     void SetNext(Ptr<PropagationLossModel> next);
 
     /**
-     * \brief Gets the next PropagationLossModel in the chain of loss models
+     * @brief Gets the next PropagationLossModel in the chain of loss models
      * that act on the signal.
-     * \returns The next PropagationLossModel in the chain
+     * @returns The next PropagationLossModel in the chain
      *
      * This method of chaining propagation loss models only works commutatively
      * if the propagation loss of all models in the chain are independent
@@ -83,10 +83,10 @@
      * Returns the Rx Power taking into account all the PropagationLossModel(s)
      * chained to the current one.
      *
-     * \param txPowerDbm current transmission power (in dBm)
-     * \param a the mobility model of the source
-     * \param b the mobility model of the destination
-     * \returns the reception power after adding/multiplying propagation loss (in dBm)
+     * @param txPowerDbm current transmission power (in dBm)
+     * @param a the mobility model of the source
+     * @param b the mobility model of the destination
+     * @returns the reception power after adding/multiplying propagation loss (in dBm)
      */
     double CalcRxPower(double txPowerDbm, Ptr<MobilityModel> a, Ptr<MobilityModel> b) const;
 
@@ -98,8 +98,8 @@
      * together, this method will also assign streams to the
      * downstream models.
      *
-     * \param stream the stream index offset start
-     * \return the number of stream indices assigned by this model
+     * @param stream the stream index offset start
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream);
 
@@ -110,8 +110,8 @@
      * Subclasses must implement this; those not using random variables
      * can return zero.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     virtual int64_t DoAssignStreams(int64_t stream) = 0;
 
@@ -119,10 +119,10 @@
     /**
      * PropagationLossModel.
      *
-     * \param txPowerDbm current transmission power (in dBm)
-     * \param a the mobility model of the source
-     * \param b the mobility model of the destination
-     * \returns the reception power after adding/multiplying propagation loss (in dBm)
+     * @param txPowerDbm current transmission power (in dBm)
+     * @param a the mobility model of the source
+     * @param b the mobility model of the destination
+     * @returns the reception power after adding/multiplying propagation loss (in dBm)
      */
     virtual double DoCalcRxPower(double txPowerDbm,
                                  Ptr<MobilityModel> a,
@@ -132,16 +132,16 @@
 };
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- * \brief The propagation loss follows a random distribution.
+ * @brief The propagation loss follows a random distribution.
  */
 class RandomPropagationLossModel : public PropagationLossModel
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -162,9 +162,9 @@
 };
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- * \brief a Friis propagation loss model
+ * @brief a Friis propagation loss model
  *
  * The Friis propagation loss model was first described in
  * "A Note on a Simple Transmission Formula", by
@@ -242,8 +242,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     FriisPropagationLossModel();
@@ -253,14 +253,14 @@
     FriisPropagationLossModel& operator=(const FriisPropagationLossModel&) = delete;
 
     /**
-     * \param frequency (Hz)
+     * @param frequency (Hz)
      *
      * Set the carrier frequency used in the Friis model
      * calculation.
      */
     void SetFrequency(double frequency);
     /**
-     * \param systemLoss (linear factor, dimension-less)
+     * @param systemLoss (linear factor, dimension-less)
      *
      * Set the system loss used by the Friis propagation model.
      * Value should be greater than or equal to 1; the default of 1
@@ -269,7 +269,7 @@
     void SetSystemLoss(double systemLoss);
 
     /**
-     * \param minLoss the minimum loss (dB)
+     * @param minLoss the minimum loss (dB)
      *
      * no matter how short the distance, the total propagation loss (in
      * dB) will always be greater or equal than this value
@@ -277,16 +277,16 @@
     void SetMinLoss(double minLoss);
 
     /**
-     * \return the minimum loss.
+     * @return the minimum loss.
      */
     double GetMinLoss() const;
 
     /**
-     * \returns the current frequency (Hz)
+     * @returns the current frequency (Hz)
      */
     double GetFrequency() const;
     /**
-     * \returns the current system loss (linear factor, dimension-less)
+     * @returns the current system loss (linear factor, dimension-less)
      */
     double GetSystemLoss() const;
 
@@ -298,15 +298,15 @@
 
     /**
      * Transforms a Dbm value to Watt
-     * \param dbm the Dbm value
-     * \return the Watts
+     * @param dbm the Dbm value
+     * @return the Watts
      */
     double DbmToW(double dbm) const;
 
     /**
      * Transforms a Watt value to Dbm
-     * \param w the Watt value
-     * \return the Dbm
+     * @param w the Watt value
+     * @return the Dbm
      */
     double DbmFromW(double w) const;
 
@@ -317,9 +317,9 @@
 };
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- * \brief a Two-Ray Ground propagation loss model ported from NS2
+ * @brief a Two-Ray Ground propagation loss model ported from NS2
  *
  * Two-ray ground reflection model.
  *
@@ -348,8 +348,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TwoRayGroundPropagationLossModel();
@@ -359,7 +359,7 @@
     TwoRayGroundPropagationLossModel& operator=(const TwoRayGroundPropagationLossModel&) = delete;
 
     /**
-     * \param frequency (Hz)
+     * @param frequency (Hz)
      *
      * Set the carrier frequency used in the TwoRayGround model
      * calculation.
@@ -367,7 +367,7 @@
     void SetFrequency(double frequency);
 
     /**
-     * \param systemLoss (linear factor, dimension-less)
+     * @param systemLoss (linear factor, dimension-less)
      *
      * Set the system loss used by the TwoRayGround propagation model.
      * Value should be greater than or equal to 1; the default of 1
@@ -375,28 +375,28 @@
      */
     void SetSystemLoss(double systemLoss);
     /**
-     * \param minDistance the minimum distance
+     * @param minDistance the minimum distance
      *
      * Below this distance, the txpower is returned
      * unmodified as the rxpower.
      */
     void SetMinDistance(double minDistance);
     /**
-     * \returns the minimum distance.
+     * @returns the minimum distance.
      */
     double GetMinDistance() const;
 
     /**
-     * \returns the current frequency (Hz)
+     * @returns the current frequency (Hz)
      */
     double GetFrequency() const;
 
     /**
-     * \returns the current system loss (linear factor, dimension-less)
+     * @returns the current system loss (linear factor, dimension-less)
      */
     double GetSystemLoss() const;
     /**
-     * \param heightAboveZ the model antenna height above the node's Z coordinate
+     * @param heightAboveZ the model antenna height above the node's Z coordinate
      *
      * Set the model antenna height above the node's Z coordinate
      */
@@ -410,15 +410,15 @@
 
     /**
      * Transforms a Dbm value to Watt
-     * \param dbm the Dbm value
-     * \return the Watts
+     * @param dbm the Dbm value
+     * @return the Watts
      */
     double DbmToW(double dbm) const;
 
     /**
      * Transforms a Watt value to Dbm
-     * \param w the Watt value
-     * \return the Dbm
+     * @param w the Watt value
+     * @return the Dbm
      */
     double DbmFromW(double w) const;
 
@@ -430,9 +430,9 @@
 };
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- * \brief a log distance propagation model.
+ * @brief a log distance propagation model.
  *
  * This model calculates the reception power with a so-called
  * log-distance propagation model:
@@ -453,8 +453,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     LogDistancePropagationLossModel();
@@ -464,19 +464,19 @@
     LogDistancePropagationLossModel& operator=(const LogDistancePropagationLossModel&) = delete;
 
     /**
-     * \param n the path loss exponent.
+     * @param n the path loss exponent.
      * Set the path loss exponent.
      */
     void SetPathLossExponent(double n);
     /**
-     * \returns the current path loss exponent.
+     * @returns the current path loss exponent.
      */
     double GetPathLossExponent() const;
 
     /**
      * Set the reference path loss at a given distance
-     * \param referenceDistance reference distance
-     * \param referenceLoss reference path loss
+     * @param referenceDistance reference distance
+     * @param referenceLoss reference path loss
      */
     void SetReference(double referenceDistance, double referenceLoss);
 
@@ -489,7 +489,7 @@
 
     /**
      *  Creates a default reference loss model
-     * \return a default reference loss model
+     * @return a default reference loss model
      */
     static Ptr<PropagationLossModel> CreateDefaultReference();
 
@@ -499,9 +499,9 @@
 };
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- * \brief A log distance path loss propagation model with three distance
+ * @brief A log distance path loss propagation model with three distance
  * fields. This model is the same as ns3::LogDistancePropagationLossModel
  * except that it has three distance fields: near, middle and far with
  * different exponents.
@@ -543,8 +543,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     ThreeLogDistancePropagationLossModel();
@@ -575,9 +575,9 @@
 };
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- * \brief Nakagami-m fast fading propagation loss model.
+ * @brief Nakagami-m fast fading propagation loss model.
  *
  * This propagation loss model implements the Nakagami-m fast fading
  * model, which accounts for the variations in signal strength due to multipath
@@ -597,7 +597,7 @@
  * The implementation of the model allows to specify different values of the m parameter (and hence
  * different fading profiles) for three different distance ranges: \f[ \underbrace{0
  * \cdots\cdots}_{m_0} \underbrace{d_1 \cdots\cdots}_{m_1} \underbrace{d_2 \cdots\cdots}_{m_2}
- * \infty \f]
+ * @infty \f]
  *
  * For m = 1 the Nakagami-m distribution equals the Rayleigh distribution. Thus
  * this model also implements Rayleigh distribution based fast fading.
@@ -606,8 +606,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -638,9 +638,9 @@
 };
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- * \brief Return a constant received power level independent of the transmit
+ * @brief Return a constant received power level independent of the transmit
  *  power
  *
  * The received power is constant independent of the transmit power.  The user
@@ -654,8 +654,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -667,7 +667,7 @@
     FixedRssLossModel& operator=(const FixedRssLossModel&) = delete;
 
     /**
-     * \param rss (dBm) the received signal strength
+     * @param rss (dBm) the received signal strength
      *
      * Set the received signal strength (RSS) in dBm.
      */
@@ -684,9 +684,9 @@
 };
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- * \brief The propagation loss is fixed for each pair of nodes and doesn't depend on their actual
+ * @brief The propagation loss is fixed for each pair of nodes and doesn't depend on their actual
  * positions.
  *
  * This is supposed to be used by synthetic tests. Note that by default propagation loss is assumed
@@ -696,8 +696,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -709,19 +709,19 @@
     MatrixPropagationLossModel& operator=(const MatrixPropagationLossModel&) = delete;
 
     /**
-     * \brief Set loss (in dB, positive) between pair of ns-3 objects
+     * @brief Set loss (in dB, positive) between pair of ns-3 objects
      * (typically, nodes).
      *
-     * \param a ma          Source mobility model
-     * \param b mb          Destination mobility model
-     * \param loss        a -> b path loss, positive in dB
-     * \param symmetric   If true (default), both a->b and b->a paths will be affected
+     * @param a ma          Source mobility model
+     * @param b mb          Destination mobility model
+     * @param loss        a -> b path loss, positive in dB
+     * @param symmetric   If true (default), both a->b and b->a paths will be affected
      */
     void SetLoss(Ptr<MobilityModel> a, Ptr<MobilityModel> b, double loss, bool symmetric = true);
 
     /**
      * Set the default propagation loss (in dB, positive) to be used, infinity if not set
-     * \param defaultLoss the default proagation loss
+     * @param defaultLoss the default proagation loss
      */
     void SetDefaultLoss(double defaultLoss);
 
@@ -738,17 +738,17 @@
     typedef std::pair<const Ptr<MobilityModel>, const Ptr<MobilityModel>> MobilityPair;
 
     /**
-     * \ingroup propagation
+     * @ingroup propagation
      *
-     * \brief Hasher for a pair of mobility models.
+     * @brief Hasher for a pair of mobility models.
      */
     class MobilityPairHasher
     {
       public:
         /**
-         * \brief Get the hash for a MobilityPair.
-         * \param key MobilityPair reference to hash
-         * \return the MobilityPair hash
+         * @brief Get the hash for a MobilityPair.
+         * @param key MobilityPair reference to hash
+         * @return the MobilityPair hash
          */
         size_t operator()(const MobilityPair& key) const
         {
@@ -761,9 +761,9 @@
 };
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- * \brief The propagation loss depends only on the distance (range) between transmitter and
+ * @brief The propagation loss depends only on the distance (range) between transmitter and
  * receiver.
  *
  * The single MaxRange attribute (units of meters) determines path loss.
@@ -775,8 +775,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     RangePropagationLossModel();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/propagation/model/three-gpp-propagation-loss-model.cc ns-3.44/src/propagation/model/three-gpp-propagation-loss-model.cc
--- ns-3.43/src/propagation/model/three-gpp-propagation-loss-model.cc	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/propagation/model/three-gpp-propagation-loss-model.cc	2025-03-09 16:55:49.687372200 -0700
@@ -140,7 +140,7 @@
     double hBs = std::max(aPos.z, bPos.z);
     double hUt = std::min(aPos.z, bPos.z);
     return std::make_tuple(distance2D, distance3D, hBs, hUt);
-};
+}
 
 /**
  * @brief Get the base station and user terminal heights for the UmiStreetCanyon scenario
@@ -156,7 +156,7 @@
     double hBs = (heightA == 10) ? heightA : heightB;
     double hUt = (heightA == 10) ? heightB : heightA;
     return std::make_tuple(hBs, hUt);
-};
+}
 
 /**
  * @brief Computes the free-space path loss using the formula described in 3GPP TR 38.811,
@@ -171,7 +171,7 @@
 ComputeNtnPathloss(double freq, double dist3d)
 {
     return 32.45 + 20 * log10(freq / 1e9) + 20 * log10(dist3d);
-};
+}
 
 /**
  * @brief Computes the atmospheric absorption loss using the formula described in 3GPP TR 38.811,
@@ -193,7 +193,7 @@
     }
 
     return loss;
-};
+}
 
 /**
  * @brief Computes the ionospheric plus tropospheric scintillation loss using the formulas
@@ -219,7 +219,7 @@
         loss = troposphericScintillationLoss.at(elevAngleQuantized);
     }
     return loss;
-};
+}
 
 /**
  * @brief Computes the clutter loss using the formula
@@ -250,7 +250,7 @@
     }
 
     return loss;
-};
+}
 
 constexpr double M_C = 3.0e8; //!< propagation velocity in free space
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/propagation/model/three-gpp-propagation-loss-model.h ns-3.44/src/propagation/model/three-gpp-propagation-loss-model.h
--- ns-3.43/src/propagation/model/three-gpp-propagation-loss-model.h	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/propagation/model/three-gpp-propagation-loss-model.h	2025-03-09 16:55:49.687372200 -0700
@@ -15,16 +15,16 @@
 {
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- * \brief Base class for the 3GPP propagation models
+ * @brief Base class for the 3GPP propagation models
  */
 class ThreeGppPropagationLossModel : public PropagationLossModel
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -43,35 +43,35 @@
     ThreeGppPropagationLossModel& operator=(const ThreeGppPropagationLossModel&) = delete;
 
     /**
-     * \brief Set the channel condition model used to determine the channel
+     * @brief Set the channel condition model used to determine the channel
      *        state (e.g., the LOS/NLOS condition)
-     * \param model pointer to the channel condition model
+     * @param model pointer to the channel condition model
      */
     void SetChannelConditionModel(Ptr<ChannelConditionModel> model);
 
     /**
-     * \brief Returns the associated channel condition model
-     * \return the channel condition model
+     * @brief Returns the associated channel condition model
+     * @return the channel condition model
      */
     Ptr<ChannelConditionModel> GetChannelConditionModel() const;
 
     /**
-     * \brief Set the central frequency of the model
-     * \param f the central frequency in the range in Hz, between 500.0e6 and 100.0e9 Hz
+     * @brief Set the central frequency of the model
+     * @param f the central frequency in the range in Hz, between 500.0e6 and 100.0e9 Hz
      */
     void SetFrequency(double f);
 
     /**
-     * \brief Return the current central frequency
-     * \return The current central frequency
+     * @brief Return the current central frequency
+     * @return The current central frequency
      */
     double GetFrequency() const;
 
     /**
-     * \brief Return true if the O2I Building Penetration loss
+     * @brief Return true if the O2I Building Penetration loss
      *        corresponds to a low loss condition.
-     * \param cond The ptr to the channel condition model
-     * \return True for low loss, false for high
+     * @param cond The ptr to the channel condition model
+     * @return True for low loss, false for high
      */
     bool IsO2iLowPenetrationLoss(Ptr<const ChannelCondition> cond) const;
 
@@ -80,10 +80,10 @@
      * Computes the received power by applying the pathloss model described in
      * 3GPP TR 38.901
      *
-     * \param txPowerDbm tx power in dBm
-     * \param a tx mobility model
-     * \param b rx mobility model
-     * \return the rx power in dBm
+     * @param txPowerDbm tx power in dBm
+     * @param a tx mobility model
+     * @param b rx mobility model
+     * @return the rx power in dBm
      */
     double DoCalcRxPower(double txPowerDbm,
                          Ptr<MobilityModel> a,
@@ -92,34 +92,34 @@
     int64_t DoAssignStreams(int64_t stream) override;
 
     /**
-     * \brief Computes the pathloss between a and b
-     * \param cond the channel condition
-     * \param a tx mobility model
-     * \param b rx mobility model
-     * \return pathloss value in dB
+     * @brief Computes the pathloss between a and b
+     * @param cond the channel condition
+     * @param a tx mobility model
+     * @param b rx mobility model
+     * @return pathloss value in dB
      */
     double GetLoss(Ptr<ChannelCondition> cond, Ptr<MobilityModel> a, Ptr<MobilityModel> b) const;
 
     /**
-     * \brief Computes the pathloss between a and b considering that the line of
+     * @brief Computes the pathloss between a and b considering that the line of
      *        sight is not obstructed
-     * \param a tx mobility model
-     * \param b rx mobility model
-     * \return pathloss value in dB
+     * @param a tx mobility model
+     * @param b rx mobility model
+     * @return pathloss value in dB
      */
     virtual double GetLossLos(Ptr<MobilityModel> a, Ptr<MobilityModel> b) const = 0;
 
     /**
-     * \brief Computes the pathloss between a and b considering that the line of
+     * @brief Computes the pathloss between a and b considering that the line of
      *        sight is obstructed
-     * \param a tx mobility model
-     * \param b rx mobility model
-     * \return pathloss value in dB
+     * @param a tx mobility model
+     * @param b rx mobility model
+     * @return pathloss value in dB
      */
     virtual double GetLossNlos(Ptr<MobilityModel> a, Ptr<MobilityModel> b) const = 0;
 
     /**
-     * \brief Returns the minimum of the two independently generated distances
+     * @brief Returns the minimum of the two independently generated distances
      *        according to the uniform distribution between the minimum and the maximum
      *        value depending on the specific 3GPP scenario (UMa, UMi-Street Canyon, RMa),
      *        i.e., between 0 and 25 m for UMa and UMi-Street Canyon, and between 0 and 10 m
@@ -128,12 +128,12 @@
      *        generated. 2D−in distance is used for the O2I penetration losses
      *        calculation according to 3GPP TR 38.901 7.4.3.
      *        See GetO2iLowPenetrationLoss/GetO2iHighPenetrationLoss functions.
-     * \return Returns 02i 2D distance (in meters) used to calculate low/high losses.
+     * @return Returns 02i 2D distance (in meters) used to calculate low/high losses.
      */
     virtual double GetO2iDistance2dIn() const = 0;
 
     /**
-     * \brief Retrieves the o2i building penetration loss value by looking at m_o2iLossMap.
+     * @brief Retrieves the o2i building penetration loss value by looking at m_o2iLossMap.
      *        If not found or if the channel condition changed it generates a new
      *        independent realization and stores it in the map, otherwise it calculates
      *        a new value as defined in 3GPP TR 38.901 7.4.3.1.
@@ -141,17 +141,17 @@
      *        Note that all child classes should implement this function to support
      *        low losses calculation. As such, this function should be purely virtual.
      *
-     * \param a tx mobility model (used for the key calculation)
-     * \param b rx mobility model (used for the key calculation)
-     * \param cond the LOS/NLOS channel condition
-     * \return o2iLoss
+     * @param a tx mobility model (used for the key calculation)
+     * @param b rx mobility model (used for the key calculation)
+     * @param cond the LOS/NLOS channel condition
+     * @return o2iLoss
      */
     virtual double GetO2iLowPenetrationLoss(Ptr<MobilityModel> a,
                                             Ptr<MobilityModel> b,
                                             ChannelCondition::LosConditionValue cond) const;
 
     /**
-     * \brief Retrieves the o2i building penetration loss value by looking at m_o2iLossMap.
+     * @brief Retrieves the o2i building penetration loss value by looking at m_o2iLossMap.
      *        If not found or if the channel condition changed it generates a new
      *        independent realization and stores it in the map, otherwise it calculates
      *        a new value as defined in 3GPP TR 38.901 7.4.3.1.
@@ -159,17 +159,17 @@
      *        Note that all child classes should implement this function to support
      *        high losses calculation. As such, this function should be purely virtual.
      *
-     * \param a tx mobility model (used for the key calculation)
-     * \param b rx mobility model (used for the key calculation)
-     * \param cond the LOS/NLOS channel condition
-     * \return o2iLoss
+     * @param a tx mobility model (used for the key calculation)
+     * @param b rx mobility model (used for the key calculation)
+     * @param cond the LOS/NLOS channel condition
+     * @return o2iLoss
      */
     virtual double GetO2iHighPenetrationLoss(Ptr<MobilityModel> a,
                                              Ptr<MobilityModel> b,
                                              ChannelCondition::LosConditionValue cond) const;
 
     /**
-     * \brief Indicates the condition of the o2i building penetration loss
+     * @brief Indicates the condition of the o2i building penetration loss
      *        (defined in 3GPP TR 38.901 7.4.3.1).
      *        The default implementation returns the condition as set
      *        (either based on the buildings materials, or if the probabilistic
@@ -177,77 +177,77 @@
      *        based on the result of a random variable).
      *        The derived classes can change the default behavior by overriding
      *        this method.
-     * \param cond the ptr to the channel condition model
-     * \return True for low losses, false for high losses
+     * @param cond the ptr to the channel condition model
+     * @return True for low losses, false for high losses
      */
     virtual bool DoIsO2iLowPenetrationLoss(Ptr<const ChannelCondition> cond) const;
 
     /**
-     * \brief Computes the pathloss between a and b considering that the line of
+     * @brief Computes the pathloss between a and b considering that the line of
      *        sight is obstructed by a vehicle. By default it raises an error to
      *        avoid misuse.
-     * \param a tx mobility model
-     * \param b rx mobility model
-     * \return pathloss value in dB
+     * @param a tx mobility model
+     * @param b rx mobility model
+     * @return pathloss value in dB
      */
     virtual double GetLossNlosv(Ptr<MobilityModel> a, Ptr<MobilityModel> b) const;
 
     /**
-     * \brief Retrieves the shadowing value by looking at m_shadowingMap.
+     * @brief Retrieves the shadowing value by looking at m_shadowingMap.
      *        If not found or if the channel condition changed it generates a new
      *        independent realization and stores it in the map, otherwise it correlates
      *        the new value with the previous one using the autocorrelation function
      *        defined in 3GPP TR 38.901, Sec. 7.4.4.
-     * \param a tx mobility model
-     * \param b rx mobility model
-     * \param cond the LOS/NLOS channel condition
-     * \return shadowing loss in dB
+     * @param a tx mobility model
+     * @param b rx mobility model
+     * @param cond the LOS/NLOS channel condition
+     * @return shadowing loss in dB
      */
     double GetShadowing(Ptr<MobilityModel> a,
                         Ptr<MobilityModel> b,
                         ChannelCondition::LosConditionValue cond) const;
 
     /**
-     * \brief Returns the shadow fading standard deviation
-     * \param a tx mobility model
-     * \param b rx mobility model
-     * \param cond the LOS/NLOS channel condition
-     * \return shadowing std in dB
+     * @brief Returns the shadow fading standard deviation
+     * @param a tx mobility model
+     * @param b rx mobility model
+     * @param cond the LOS/NLOS channel condition
+     * @return shadowing std in dB
      */
     virtual double GetShadowingStd(Ptr<MobilityModel> a,
                                    Ptr<MobilityModel> b,
                                    ChannelCondition::LosConditionValue cond) const = 0;
 
     /**
-     * \brief Returns the shadow fading correlation distance
-     * \param cond the LOS/NLOS channel condition
-     * \return shadowing correlation distance in meters
+     * @brief Returns the shadow fading correlation distance
+     * @param cond the LOS/NLOS channel condition
+     * @return shadowing correlation distance in meters
      */
     virtual double GetShadowingCorrelationDistance(
         ChannelCondition::LosConditionValue cond) const = 0;
 
     /**
-     * \brief Returns an unique key for the channel between a and b.
+     * @brief Returns an unique key for the channel between a and b.
      *
      * The key is the value of the Cantor function calculated by using as
      * first parameter the lowest node ID, and as a second parameter the highest
      * node ID.
      *
-     * \param a tx mobility model
-     * \param b rx mobility model
-     * \return channel key
+     * @param a tx mobility model
+     * @param b rx mobility model
+     * @return channel key
      */
     static uint32_t GetKey(Ptr<MobilityModel> a, Ptr<MobilityModel> b);
 
     /**
-     * \brief Get the difference between the node position
+     * @brief Get the difference between the node position
      *
      * The difference is calculated as (b-a) if Id(a) < Id (b), or
      * (a-b) if Id(b) <= Id(a).
      *
-     * \param a First node
-     * \param b Second node
-     * \return the difference between the node vector position
+     * @param a First node
+     * @param b Second node
+     * @return the difference between the node vector position
      */
     static Vector GetVectorDifference(Ptr<MobilityModel> a, Ptr<MobilityModel> b);
 
@@ -255,10 +255,10 @@
     void DoDispose() override;
 
     /**
-     * \brief Computes the 2D distance between two 3D vectors
-     * \param a the first 3D vector
-     * \param b the second 3D vector
-     * \return the 2D distance between a and b
+     * @brief Computes the 2D distance between two 3D vectors
+     * @param a the first 3D vector
+     * @param b the second 3D vector
+     * @return the 2D distance between a and b
      */
     static double Calculate2dDistance(Vector a, Vector b);
 
@@ -303,17 +303,17 @@
 };
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- * \brief Implements the pathloss model defined in 3GPP TR 38.901, Table 7.4.1-1
+ * @brief Implements the pathloss model defined in 3GPP TR 38.901, Table 7.4.1-1
  *        for the RMa scenario.
  */
 class ThreeGppRmaPropagationLossModel : public ThreeGppPropagationLossModel
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -333,16 +333,16 @@
 
   private:
     /**
-     * \brief Computes the pathloss between a and b considering that the line of
+     * @brief Computes the pathloss between a and b considering that the line of
      *        sight is not obstructed
-     * \param a tx mobility model
-     * \param b rx mobility model
-     * \return pathloss value in dB
+     * @param a tx mobility model
+     * @param b rx mobility model
+     * @return pathloss value in dB
      */
     double GetLossLos(Ptr<MobilityModel> a, Ptr<MobilityModel> b) const override;
 
     /**
-     * \brief Returns the minimum of the two independently generated distances
+     * @brief Returns the minimum of the two independently generated distances
      *        according to the uniform distribution between the minimum and the maximum
      *        value depending on the specific 3GPP scenario (UMa, UMi-Street Canyon, RMa),
      *        i.e., between 0 and 25 m for UMa and UMi-Street Canyon, and between 0 and 10 m
@@ -351,61 +351,61 @@
      *        generated. 2D−in distance is used for the O2I penetration losses
      *        calculation according to 3GPP TR 38.901 7.4.3.
      *        See GetO2iLowPenetrationLoss/GetO2iHighPenetrationLoss functions.
-     * \return Returns 02i 2D distance (in meters) used to calculate low/high losses.
+     * @return Returns 02i 2D distance (in meters) used to calculate low/high losses.
      */
     double GetO2iDistance2dIn() const override;
 
     /**
-     * \brief Indicates the condition of the o2i building penetration loss
+     * @brief Indicates the condition of the o2i building penetration loss
      *        (defined in 3GPP TR 38.901 7.4.3.1).
-     * \param cond the ptr to the channel condition model
-     * \return True for low losses, false for high losses
+     * @param cond the ptr to the channel condition model
+     * @return True for low losses, false for high losses
      */
     bool DoIsO2iLowPenetrationLoss(Ptr<const ChannelCondition> cond) const override;
 
     /**
-     * \brief Computes the pathloss between a and b considering that the line of
+     * @brief Computes the pathloss between a and b considering that the line of
      *        sight is obstructed
-     * \param a tx mobility model
-     * \param b rx mobility model
-     * \return pathloss value in dB
+     * @param a tx mobility model
+     * @param b rx mobility model
+     * @return pathloss value in dB
      */
     double GetLossNlos(Ptr<MobilityModel> a, Ptr<MobilityModel> b) const override;
 
     /**
-     * \brief Returns the shadow fading standard deviation
-     * \param a tx mobility model
-     * \param b rx mobility model
-     * \param cond the LOS/NLOS channel condition
-     * \return shadowing std in dB
+     * @brief Returns the shadow fading standard deviation
+     * @param a tx mobility model
+     * @param b rx mobility model
+     * @param cond the LOS/NLOS channel condition
+     * @return shadowing std in dB
      */
     double GetShadowingStd(Ptr<MobilityModel> a,
                            Ptr<MobilityModel> b,
                            ChannelCondition::LosConditionValue cond) const override;
 
     /**
-     * \brief Returns the shadow fading correlation distance
-     * \param cond the LOS/NLOS channel condition
-     * \return shadowing correlation distance in meters
+     * @brief Returns the shadow fading correlation distance
+     * @param cond the LOS/NLOS channel condition
+     * @return shadowing correlation distance in meters
      */
     double GetShadowingCorrelationDistance(ChannelCondition::LosConditionValue cond) const override;
 
     /**
-     * \brief Computes the PL1 formula for the RMa scenario
-     * \param frequency the operating frequency in Hz
-     * \param distance3D the 3D distance between the tx and the rx nodes in meters
-     * \param h the average building height in meters
-     * \param w the average street width in meters
-     * \return result of the PL1 formula
+     * @brief Computes the PL1 formula for the RMa scenario
+     * @param frequency the operating frequency in Hz
+     * @param distance3D the 3D distance between the tx and the rx nodes in meters
+     * @param h the average building height in meters
+     * @param w the average street width in meters
+     * @return result of the PL1 formula
      */
     static double Pl1(double frequency, double distance3D, double h, double w);
 
     /**
-     * \brief Computes the breakpoint distance for the RMa scenario
-     * \param frequency the operating frequency in Hz
-     * \param hA height of the tx node in meters
-     * \param hB height of the rx node in meters
-     * \return the breakpoint distance in meters
+     * @brief Computes the breakpoint distance for the RMa scenario
+     * @param frequency the operating frequency in Hz
+     * @param hA height of the tx node in meters
+     * @param hB height of the rx node in meters
+     * @return the breakpoint distance in meters
      */
     static double GetBpDistance(double frequency, double hA, double hB);
 
@@ -414,17 +414,17 @@
 };
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- * \brief Implements the pathloss model defined in 3GPP TR 38.901, Table 7.4.1-1
+ * @brief Implements the pathloss model defined in 3GPP TR 38.901, Table 7.4.1-1
  *        for the UMa scenario.
  */
 class ThreeGppUmaPropagationLossModel : public ThreeGppPropagationLossModel
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -446,16 +446,16 @@
     int64_t DoAssignStreams(int64_t stream) override;
 
     /**
-     * \brief Computes the pathloss between a and b considering that the line of
+     * @brief Computes the pathloss between a and b considering that the line of
      *        sight is not obstructed
-     * \param a tx mobility model
-     * \param b rx mobility model
-     * \return pathloss value in dB
+     * @param a tx mobility model
+     * @param b rx mobility model
+     * @return pathloss value in dB
      */
     double GetLossLos(Ptr<MobilityModel> a, Ptr<MobilityModel> b) const override;
 
     /**
-     * \brief Returns the minimum of the two independently generated distances
+     * @brief Returns the minimum of the two independently generated distances
      *        according to the uniform distribution between the minimum and the maximum
      *        value depending on the specific 3GPP scenario (UMa, UMi-Street Canyon, RMa),
      *        i.e., between 0 and 25 m for UMa and UMi-Street Canyon, and between 0 and 10 m
@@ -464,43 +464,43 @@
      *        generated. 2D−in distance is used for the O2I penetration losses
      *        calculation according to 3GPP TR 38.901 7.4.3.
      *        See GetO2iLowPenetrationLoss/GetO2iHighPenetrationLoss functions.
-     * \return Returns 02i 2D distance (in meters) used to calculate low/high losses.
+     * @return Returns 02i 2D distance (in meters) used to calculate low/high losses.
      */
     double GetO2iDistance2dIn() const override;
 
     /**
-     * \brief Computes the pathloss between a and b considering that the line of
+     * @brief Computes the pathloss between a and b considering that the line of
      *        sight is obstructed.
-     * \param a tx mobility model
-     * \param b rx mobility model
-     * \return pathloss value in dB
+     * @param a tx mobility model
+     * @param b rx mobility model
+     * @return pathloss value in dB
      */
     double GetLossNlos(Ptr<MobilityModel> a, Ptr<MobilityModel> b) const override;
 
     /**
-     * \brief Returns the shadow fading standard deviation
-     * \param a tx mobility model
-     * \param b rx mobility model
-     * \param cond the LOS/NLOS channel condition
-     * \return shadowing std in dB
+     * @brief Returns the shadow fading standard deviation
+     * @param a tx mobility model
+     * @param b rx mobility model
+     * @param cond the LOS/NLOS channel condition
+     * @return shadowing std in dB
      */
     double GetShadowingStd(Ptr<MobilityModel> a,
                            Ptr<MobilityModel> b,
                            ChannelCondition::LosConditionValue cond) const override;
 
     /**
-     * \brief Returns the shadow fading correlation distance
-     * \param cond the LOS/NLOS channel condition
-     * \return shadowing correlation distance in meters
+     * @brief Returns the shadow fading correlation distance
+     * @param cond the LOS/NLOS channel condition
+     * @return shadowing correlation distance in meters
      */
     double GetShadowingCorrelationDistance(ChannelCondition::LosConditionValue cond) const override;
 
     /**
-     * \brief Computes the breakpoint distance
-     * \param hUt height of the UT in meters
-     * \param hBs height of the BS in meters
-     * \param distance2D distance between the two nodes in meters
-     * \return the breakpoint distance in meters
+     * @brief Computes the breakpoint distance
+     * @param hUt height of the UT in meters
+     * @param hBs height of the BS in meters
+     * @param distance2D distance between the two nodes in meters
+     * @return the breakpoint distance in meters
      */
     double GetBpDistance(double hUt, double hBs, double distance2D) const;
 
@@ -509,17 +509,17 @@
 };
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- * \brief Implements the pathloss model defined in 3GPP TR 38.901, Table 7.4.1-1
+ * @brief Implements the pathloss model defined in 3GPP TR 38.901, Table 7.4.1-1
  *        for the UMi-Street Canyon scenario.
  */
 class ThreeGppUmiStreetCanyonPropagationLossModel : public ThreeGppPropagationLossModel
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -541,16 +541,16 @@
 
   private:
     /**
-     * \brief Computes the pathloss between a and b considering that the line of
+     * @brief Computes the pathloss between a and b considering that the line of
      *        sight is not obstructed
-     * \param a tx mobility model
-     * \param b rx mobility model
-     * \return pathloss value in dB
+     * @param a tx mobility model
+     * @param b rx mobility model
+     * @return pathloss value in dB
      */
     double GetLossLos(Ptr<MobilityModel> a, Ptr<MobilityModel> b) const override;
 
     /**
-     * \brief Returns the minimum of the two independently generated distances
+     * @brief Returns the minimum of the two independently generated distances
      *        according to the uniform distribution between the minimum and the maximum
      *        value depending on the specific 3GPP scenario (UMa, UMi-Street Canyon, RMa),
      *        i.e., between 0 and 25 m for UMa and UMi-Street Canyon, and between 0 and 10 m
@@ -559,59 +559,59 @@
      *        generated. 2D−in distance is used for the O2I penetration losses
      *        calculation according to 3GPP TR 38.901 7.4.3.
      *        See GetO2iLowPenetrationLoss/GetO2iHighPenetrationLoss functions.
-     * \return Returns 02i 2D distance (in meters) used to calculate low/high losses.
+     * @return Returns 02i 2D distance (in meters) used to calculate low/high losses.
      */
     double GetO2iDistance2dIn() const override;
 
     /**
-     * \brief Computes the pathloss between a and b considering that the line of
+     * @brief Computes the pathloss between a and b considering that the line of
      *        sight is obstructed.
-     * \param a tx mobility model
-     * \param b rx mobility model
-     * \return pathloss value in dB
+     * @param a tx mobility model
+     * @param b rx mobility model
+     * @return pathloss value in dB
      */
     double GetLossNlos(Ptr<MobilityModel> a, Ptr<MobilityModel> b) const override;
 
     /**
-     * \brief Returns the shadow fading standard deviation
-     * \param a tx mobility model
-     * \param b rx mobility model
-     * \param cond the LOS/NLOS channel condition
-     * \return shadowing std in dB
+     * @brief Returns the shadow fading standard deviation
+     * @param a tx mobility model
+     * @param b rx mobility model
+     * @param cond the LOS/NLOS channel condition
+     * @return shadowing std in dB
      */
     double GetShadowingStd(Ptr<MobilityModel> a,
                            Ptr<MobilityModel> b,
                            ChannelCondition::LosConditionValue cond) const override;
 
     /**
-     * \brief Returns the shadow fading correlation distance
-     * \param cond the LOS/NLOS channel condition
-     * \return shadowing correlation distance in meters
+     * @brief Returns the shadow fading correlation distance
+     * @param cond the LOS/NLOS channel condition
+     * @return shadowing correlation distance in meters
      */
     double GetShadowingCorrelationDistance(ChannelCondition::LosConditionValue cond) const override;
 
     /**
-     * \brief Computes the breakpoint distance
-     * \param hUt height of the UT node in meters
-     * \param hBs height of the BS node in meters
-     * \param distance2D distance between the two nodes in meters
-     * \return the breakpoint distance in meters
+     * @brief Computes the breakpoint distance
+     * @param hUt height of the UT node in meters
+     * @param hBs height of the BS node in meters
+     * @param distance2D distance between the two nodes in meters
+     * @return the breakpoint distance in meters
      */
     double GetBpDistance(double hUt, double hBs, double distance2D) const;
 };
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- * \brief Implements the pathloss model defined in 3GPP TR 38.901, Table 7.4.1-1
+ * @brief Implements the pathloss model defined in 3GPP TR 38.901, Table 7.4.1-1
  *        for the Indoor Office scenario.
  */
 class ThreeGppIndoorOfficePropagationLossModel : public ThreeGppPropagationLossModel
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -633,16 +633,16 @@
 
   private:
     /**
-     * \brief Computes the pathloss between a and b considering that the line of
+     * @brief Computes the pathloss between a and b considering that the line of
      *        sight is not obstructed
-     * \param a tx mobility model
-     * \param b rx mobility model
-     * \return pathloss value in dB
+     * @param a tx mobility model
+     * @param b rx mobility model
+     * @return pathloss value in dB
      */
     double GetLossLos(Ptr<MobilityModel> a, Ptr<MobilityModel> b) const override;
 
     /**
-     * \brief Returns the minimum of the two independently generated distances
+     * @brief Returns the minimum of the two independently generated distances
      *        according to the uniform distribution between the minimum and the maximum
      *        value depending on the specific 3GPP scenario (UMa, UMi-Street Canyon, RMa),
      *        i.e., between 0 and 25 m for UMa and UMi-Street Canyon, and between 0 and 10 m
@@ -651,50 +651,50 @@
      *        generated. 2D−in distance is used for the O2I penetration losses
      *        calculation according to 3GPP TR 38.901 7.4.3.
      *        See GetO2iLowPenetrationLoss/GetO2iHighPenetrationLoss functions.
-     * \return Returns 02i 2D distance (in meters) used to calculate low/high losses.
+     * @return Returns 02i 2D distance (in meters) used to calculate low/high losses.
      */
     double GetO2iDistance2dIn() const override;
 
     /**
-     * \brief Computes the pathloss between a and b considering that the line of
+     * @brief Computes the pathloss between a and b considering that the line of
      *        sight is obstructed
-     * \param a tx mobility model
-     * \param b rx mobility model
-     * \return pathloss value in dB
+     * @param a tx mobility model
+     * @param b rx mobility model
+     * @return pathloss value in dB
      */
     double GetLossNlos(Ptr<MobilityModel> a, Ptr<MobilityModel> b) const override;
 
     /**
-     * \brief Returns the shadow fading standard deviation
-     * \param a tx mobility model
-     * \param b rx mobility model
-     * \param cond the LOS/NLOS channel condition
-     * \return shadowing std in dB
+     * @brief Returns the shadow fading standard deviation
+     * @param a tx mobility model
+     * @param b rx mobility model
+     * @param cond the LOS/NLOS channel condition
+     * @return shadowing std in dB
      */
     double GetShadowingStd(Ptr<MobilityModel> a,
                            Ptr<MobilityModel> b,
                            ChannelCondition::LosConditionValue cond) const override;
 
     /**
-     * \brief Returns the shadow fading correlation distance
-     * \param cond the LOS/NLOS channel condition
-     * \return shadowing correlation distance in meters
+     * @brief Returns the shadow fading correlation distance
+     * @param cond the LOS/NLOS channel condition
+     * @return shadowing correlation distance in meters
      */
     double GetShadowingCorrelationDistance(ChannelCondition::LosConditionValue cond) const override;
 };
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- * \brief Implements the pathloss model defined in 3GPP TR 38.811, Table ????
+ * @brief Implements the pathloss model defined in 3GPP TR 38.811, Table ????
  *        for the NTN Dense Urban scenario.
  */
 class ThreeGppNTNDenseUrbanPropagationLossModel : public ThreeGppPropagationLossModel
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -709,13 +709,13 @@
     ~ThreeGppNTNDenseUrbanPropagationLossModel() override;
 
     /**
-     * \copydoc ThreeGppPropagationLossModel::GetO2iDistance2dIn
+     * @copydoc ThreeGppPropagationLossModel::GetO2iDistance2dIn
      *  Does nothing in NTN scenarios.
      */
     double GetO2iDistance2dIn() const override;
 
     /**
-     * \brief Copy constructor
+     * @brief Copy constructor
      *
      * Deleted in base class
      */
@@ -723,10 +723,10 @@
         delete;
 
     /**
-     * \brief Copy constructor
+     * @brief Copy constructor
      *
      * Deleted in base class
-     * \returns the ThreeGppNTNDenseUrbanPropagationLossModel instance
+     * @returns the ThreeGppNTNDenseUrbanPropagationLossModel instance
      */
     ThreeGppNTNDenseUrbanPropagationLossModel& operator=(
         const ThreeGppNTNDenseUrbanPropagationLossModel&) = delete;
@@ -741,24 +741,24 @@
     double GetShadowingCorrelationDistance(ChannelCondition::LosConditionValue cond) const override;
 
     /**
-     * \brief The nested map containing the Shadow Fading and
+     * @brief The nested map containing the Shadow Fading and
      *        Clutter Loss values for the NTN Dense Urban scenario
      */
     const std::map<int, std::vector<float>>* m_SFCL_DenseUrban;
 };
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- * \brief Implements the pathloss model defined in 3GPP TR 38.811, Table ????
+ * @brief Implements the pathloss model defined in 3GPP TR 38.811, Table ????
  *        for the NTN Urban scenario.
  */
 class ThreeGppNTNUrbanPropagationLossModel : public ThreeGppPropagationLossModel
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -773,23 +773,23 @@
     ~ThreeGppNTNUrbanPropagationLossModel() override;
 
     /**
-     * \copydoc ThreeGppPropagationLossModel::GetO2iDistance2dIn
+     * @copydoc ThreeGppPropagationLossModel::GetO2iDistance2dIn
      *  Does nothing in NTN scenarios.
      */
     double GetO2iDistance2dIn() const override;
 
     /**
-     * \brief Copy constructor
+     * @brief Copy constructor
      *
      * Deleted in base class
      */
     ThreeGppNTNUrbanPropagationLossModel(const ThreeGppNTNUrbanPropagationLossModel&) = delete;
 
     /**
-     * \brief Copy constructor
+     * @brief Copy constructor
      *
      * Deleted in base class
-     * \returns the ThreeGppNTNUrbanPropagationLossModel instance
+     * @returns the ThreeGppNTNUrbanPropagationLossModel instance
      */
     ThreeGppNTNUrbanPropagationLossModel& operator=(const ThreeGppNTNUrbanPropagationLossModel&) =
         delete;
@@ -804,24 +804,24 @@
     double GetShadowingCorrelationDistance(ChannelCondition::LosConditionValue cond) const override;
 
     /**
-     * \brief The nested map containing the Shadow Fading and
+     * @brief The nested map containing the Shadow Fading and
      *        Clutter Loss values for the NTN Urban scenario
      */
     const std::map<int, std::vector<float>>* m_SFCL_Urban;
 };
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- * \brief Implements the pathloss model defined in 3GPP TR 38.811, Table ????
+ * @brief Implements the pathloss model defined in 3GPP TR 38.811, Table ????
  *        for the NTN Suburban scenario.
  */
 class ThreeGppNTNSuburbanPropagationLossModel : public ThreeGppPropagationLossModel
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -836,13 +836,13 @@
     ~ThreeGppNTNSuburbanPropagationLossModel() override;
 
     /**
-     * \copydoc ThreeGppPropagationLossModel::GetO2iDistance2dIn
+     * @copydoc ThreeGppPropagationLossModel::GetO2iDistance2dIn
      *  Does nothing in NTN scenarios.
      */
     double GetO2iDistance2dIn() const override;
 
     /**
-     * \brief Copy constructor
+     * @brief Copy constructor
      *
      * Deleted in base class
      */
@@ -850,10 +850,10 @@
         delete;
 
     /**
-     * \brief Copy constructor
+     * @brief Copy constructor
      *
      * Deleted in base class
-     * \returns the ThreeGppNTNSuburbanPropagationLossModel instance
+     * @returns the ThreeGppNTNSuburbanPropagationLossModel instance
      */
     ThreeGppNTNSuburbanPropagationLossModel& operator=(
         const ThreeGppNTNSuburbanPropagationLossModel&) = delete;
@@ -868,24 +868,24 @@
     double GetShadowingCorrelationDistance(ChannelCondition::LosConditionValue cond) const override;
 
     /**
-     * \brief The nested map containing the Shadow Fading and
+     * @brief The nested map containing the Shadow Fading and
      *        Clutter Loss values for the NTN Suburban and Rural scenario
      */
     const std::map<int, std::vector<float>>* m_SFCL_SuburbanRural;
 };
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- * \brief Implements the pathloss model defined in 3GPP TR 38.811, Table ????
+ * @brief Implements the pathloss model defined in 3GPP TR 38.811, Table ????
  *        for the NTN Rural scenario.
  */
 class ThreeGppNTNRuralPropagationLossModel : public ThreeGppPropagationLossModel
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -900,23 +900,23 @@
     ~ThreeGppNTNRuralPropagationLossModel() override;
 
     /**
-     * \copydoc ThreeGppPropagationLossModel::GetO2iDistance2dIn
+     * @copydoc ThreeGppPropagationLossModel::GetO2iDistance2dIn
      *  Does nothing in NTN scenarios.
      */
     double GetO2iDistance2dIn() const override;
 
     /**
-     * \brief Copy constructor
+     * @brief Copy constructor
      *
      * Deleted in base class
      */
     ThreeGppNTNRuralPropagationLossModel(const ThreeGppNTNRuralPropagationLossModel&) = delete;
 
     /**
-     * \brief Copy constructor
+     * @brief Copy constructor
      *
      * Deleted in base class
-     * \returns the ThreeGppNTNRuralPropagationLossModel instance
+     * @returns the ThreeGppNTNRuralPropagationLossModel instance
      */
     ThreeGppNTNRuralPropagationLossModel& operator=(const ThreeGppNTNRuralPropagationLossModel&) =
         delete;
@@ -931,7 +931,7 @@
     double GetShadowingCorrelationDistance(ChannelCondition::LosConditionValue cond) const override;
 
     /**
-     * \brief The nested map containing the Shadow Fading and
+     * @brief The nested map containing the Shadow Fading and
      *        Clutter Loss values for the NTN Suburban and Rural scenario
      */
     const std::map<int, std::vector<float>>* m_SFCL_SuburbanRural;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/propagation/model/three-gpp-v2v-propagation-loss-model.h ns-3.44/src/propagation/model/three-gpp-v2v-propagation-loss-model.h
--- ns-3.43/src/propagation/model/three-gpp-v2v-propagation-loss-model.h	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/propagation/model/three-gpp-v2v-propagation-loss-model.h	2025-03-09 16:55:49.687372200 -0700
@@ -11,23 +11,23 @@
 #include "three-gpp-propagation-loss-model.h"
 
 #include "ns3/deprecated.h"
-#include <ns3/mobility-model.h>
+#include "ns3/mobility-model.h"
 
 namespace ns3
 {
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- * \brief Implements the pathloss model defined in 3GPP TR 37.885, Table 6.2.1-1
+ * @brief Implements the pathloss model defined in 3GPP TR 37.885, Table 6.2.1-1
  *        for the Urban scenario.
  */
 class ThreeGppV2vUrbanPropagationLossModel : public ThreeGppPropagationLossModel
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -47,16 +47,16 @@
 
   private:
     /**
-     * \brief Computes the pathloss between a and b considering that the line of
+     * @brief Computes the pathloss between a and b considering that the line of
      *        sight is not obstructed
-     * \param a mobility model of one of the two communicating nodes
-     * \param b mobility model of one of the two communicating nodes
-     * \return pathloss value in dB
+     * @param a mobility model of one of the two communicating nodes
+     * @param b mobility model of one of the two communicating nodes
+     * @return pathloss value in dB
      */
     double GetLossLos(Ptr<MobilityModel> a, Ptr<MobilityModel> b) const override;
 
     /**
-     * \brief Returns the minimum of the two independently generated distances
+     * @brief Returns the minimum of the two independently generated distances
      *        according to the uniform distribution between the minimum and the maximum
      *        value depending on the specific 3GPP scenario (UMa, UMi-Street Canyon, RMa),
      *        i.e., between 0 and 25 m for UMa and UMi-Street Canyon, and between 0 and 10 m
@@ -68,51 +68,51 @@
      *
      *        TODO O2I car penetration loss (TR 38.901 7.4.3.2) not considered
      *
-     * \return Returns 02i 2D distance (in meters) used to calculate low/high losses.
+     * @return Returns 02i 2D distance (in meters) used to calculate low/high losses.
      */
     double GetO2iDistance2dIn() const override;
 
     /**
-     * \brief Computes the pathloss between a and b considering that the line of
+     * @brief Computes the pathloss between a and b considering that the line of
      *        sight is obstructed by a vehicle
-     * \param a mobility model of one of the two communicating nodes
-     * \param b mobility model of one of the two communicating nodes
-     * \return pathloss value in dB
+     * @param a mobility model of one of the two communicating nodes
+     * @param b mobility model of one of the two communicating nodes
+     * @return pathloss value in dB
      */
     double GetLossNlosv(Ptr<MobilityModel> a, Ptr<MobilityModel> b) const override;
 
     /**
-     * \brief Computes the pathloss between a and b considering that the line of
+     * @brief Computes the pathloss between a and b considering that the line of
      *        sight is obstructed by a building
-     * \param a mobility model of one of the two communicating nodes
-     * \param b mobility model of one of the two communicating nodes
-     * \return pathloss value in dB
+     * @param a mobility model of one of the two communicating nodes
+     * @param b mobility model of one of the two communicating nodes
+     * @return pathloss value in dB
      */
     double GetLossNlos(Ptr<MobilityModel> a, Ptr<MobilityModel> b) const override;
 
     /**
-     * \brief Computes the additional loss due to an obstruction caused by a vehicle
-     * \param a mobility model of one of the two communicating nodes
-     * \param b mobility model of one of the two communicating nodes
-     * \return pathloss value in dB
+     * @brief Computes the additional loss due to an obstruction caused by a vehicle
+     * @param a mobility model of one of the two communicating nodes
+     * @param b mobility model of one of the two communicating nodes
+     * @return pathloss value in dB
      */
     double GetAdditionalNlosvLoss(Ptr<MobilityModel> a, Ptr<MobilityModel> b) const;
 
     /**
-     * \brief Returns the shadow fading standard deviation
-     * \param a mobility model of one of the two communicating nodes
-     * \param b mobility model of one of the two communicating nodes
-     * \param cond the LOS/NLOS channel condition
-     * \return shadowing std in dB
+     * @brief Returns the shadow fading standard deviation
+     * @param a mobility model of one of the two communicating nodes
+     * @param b mobility model of one of the two communicating nodes
+     * @param cond the LOS/NLOS channel condition
+     * @return shadowing std in dB
      */
     double GetShadowingStd(Ptr<MobilityModel> a,
                            Ptr<MobilityModel> b,
                            ChannelCondition::LosConditionValue cond) const override;
 
     /**
-     * \brief Returns the shadow fading correlation distance
-     * \param cond the LOS/NLOS channel condition
-     * \return shadowing correlation distance in meters
+     * @brief Returns the shadow fading correlation distance
+     * @param cond the LOS/NLOS channel condition
+     * @return shadowing correlation distance in meters
      */
     double GetShadowingCorrelationDistance(ChannelCondition::LosConditionValue cond) const override;
 
@@ -124,17 +124,17 @@
 };
 
 /**
- * \ingroup propagation
+ * @ingroup propagation
  *
- * \brief Implements the pathloss model defined in 3GPP TR 37.885, Table 6.2.1-1
+ * @brief Implements the pathloss model defined in 3GPP TR 37.885, Table 6.2.1-1
  *        for the Highway scenario.
  */
 class ThreeGppV2vHighwayPropagationLossModel : public ThreeGppV2vUrbanPropagationLossModel
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -150,11 +150,11 @@
 
   private:
     /**
-     * \brief Computes the pathloss between a and b considering that the line of
+     * @brief Computes the pathloss between a and b considering that the line of
      *        sight is not obstructed
-     * \param a mobility model of one of the two communicating nodes
-     * \param b mobility model of one of the two communicating nodes
-     * \return pathloss value in dB
+     * @param a mobility model of one of the two communicating nodes
+     * @param b mobility model of one of the two communicating nodes
+     * @return pathloss value in dB
      */
     double GetLossLos(Ptr<MobilityModel> a, Ptr<MobilityModel> b) const override;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/propagation/test/channel-condition-model-test-suite.cc ns-3.44/src/propagation/test/channel-condition-model-test-suite.cc
--- ns-3.43/src/propagation/test/channel-condition-model-test-suite.cc	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/propagation/test/channel-condition-model-test-suite.cc	2025-03-09 16:55:49.687372200 -0700
@@ -20,7 +20,7 @@
 NS_LOG_COMPONENT_DEFINE("ChannelConditionModelsTest");
 
 /**
- * \ingroup propagation-tests
+ * @ingroup propagation-tests
  *
  * Test case for the 3GPP channel condition models. It determines the
  * channel condition multiple times, estimates the LOS probability and
@@ -50,8 +50,8 @@
      * Evaluates the channel condition between two nodes by calling the method
      * GetChannelCondition on m_condModel. If the channel condition is LOS it
      * increments m_numLos
-     * \param a the mobility model of the first node
-     * \param b the mobility model of the second node
+     * @param a the mobility model of the first node
+     * @param b the mobility model of the second node
      */
     void EvaluateChannelCondition(Ptr<MobilityModel> a, Ptr<MobilityModel> b);
 
@@ -267,7 +267,7 @@
 }
 
 /**
- * \ingroup propagation-tests
+ * @ingroup propagation-tests
  *
  * Test suite for the channel condition models
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/propagation/test/itu-r-1411-los-test-suite.cc ns-3.44/src/propagation/test/itu-r-1411-los-test-suite.cc
--- ns-3.43/src/propagation/test/itu-r-1411-los-test-suite.cc	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/propagation/test/itu-r-1411-los-test-suite.cc	2025-03-09 16:55:49.687372200 -0700
@@ -7,22 +7,22 @@
  *         Nicola Baldo <nbaldo@cttc.es>
  */
 
-#include <ns3/constant-position-mobility-model.h>
-#include <ns3/double.h>
-#include <ns3/enum.h>
-#include <ns3/itu-r-1411-los-propagation-loss-model.h>
-#include <ns3/log.h>
-#include <ns3/string.h>
-#include <ns3/test.h>
+#include "ns3/constant-position-mobility-model.h"
+#include "ns3/double.h"
+#include "ns3/enum.h"
+#include "ns3/itu-r-1411-los-propagation-loss-model.h"
+#include "ns3/log.h"
+#include "ns3/string.h"
+#include "ns3/test.h"
 
 using namespace ns3;
 
 NS_LOG_COMPONENT_DEFINE("ItuR1411LosPropagationLossModelTest");
 
 /**
- * \ingroup propagation-tests
+ * @ingroup propagation-tests
  *
- * \brief ItuR1411LosPropagationLossModel Test Case
+ * @brief ItuR1411LosPropagationLossModel Test Case
  *
  */
 class ItuR1411LosPropagationLossModelTestCase : public TestCase
@@ -31,12 +31,12 @@
     /**
      * Constructor
      *
-     * \param freq carrier frequency in Hz
-     * \param dist 2D distance between UT and BS in meters
-     * \param hb height of BS in meters
-     * \param hm height of UT in meters
-     * \param refValue reference loss value
-     * \param name TestCase name
+     * @param freq carrier frequency in Hz
+     * @param dist 2D distance between UT and BS in meters
+     * @param hb height of BS in meters
+     * @param hm height of UT in meters
+     * @param refValue reference loss value
+     * @param name TestCase name
      */
     ItuR1411LosPropagationLossModelTestCase(double freq,
                                             double dist,
@@ -51,8 +51,8 @@
 
     /**
      * Create a MobilityModel
-     * \param index mobility model index
-     * \return a new MobilityModel
+     * @param index mobility model index
+     * @return a new MobilityModel
      */
     Ptr<MobilityModel> CreateMobilityModel(uint16_t index);
 
@@ -106,9 +106,9 @@
 }
 
 /**
- * \ingroup propagation-tests
+ * @ingroup propagation-tests
  *
- * \brief ItuR1411LosPropagationLossModel TestSuite
+ * @brief ItuR1411LosPropagationLossModel TestSuite
  *
  */
 class ItuR1411LosPropagationLossModelTestSuite : public TestSuite
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/propagation/test/itu-r-1411-nlos-over-rooftop-test-suite.cc ns-3.44/src/propagation/test/itu-r-1411-nlos-over-rooftop-test-suite.cc
--- ns-3.43/src/propagation/test/itu-r-1411-nlos-over-rooftop-test-suite.cc	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/propagation/test/itu-r-1411-nlos-over-rooftop-test-suite.cc	2025-03-09 16:55:49.687372200 -0700
@@ -7,22 +7,22 @@
  *         Nicola Baldo <nbaldo@cttc.es>
  */
 
-#include <ns3/constant-position-mobility-model.h>
-#include <ns3/double.h>
-#include <ns3/enum.h>
-#include <ns3/itu-r-1411-nlos-over-rooftop-propagation-loss-model.h>
-#include <ns3/log.h>
-#include <ns3/string.h>
-#include <ns3/test.h>
+#include "ns3/constant-position-mobility-model.h"
+#include "ns3/double.h"
+#include "ns3/enum.h"
+#include "ns3/itu-r-1411-nlos-over-rooftop-propagation-loss-model.h"
+#include "ns3/log.h"
+#include "ns3/string.h"
+#include "ns3/test.h"
 
 using namespace ns3;
 
 NS_LOG_COMPONENT_DEFINE("ItuR1411NlosOverRooftopPropagationLossModelTest");
 
 /**
- * \ingroup propagation-tests
+ * @ingroup propagation-tests
  *
- * \brief ItuR1411NlosOverRooftopPropagationLossModel Test Case
+ * @brief ItuR1411NlosOverRooftopPropagationLossModel Test Case
  *
  */
 class ItuR1411NlosOverRooftopPropagationLossModelTestCase : public TestCase
@@ -31,14 +31,14 @@
     /**
      * Constructor
      *
-     * \param freq carrier frequency in Hz
-     * \param dist 2D distance between UT and BS in meters
-     * \param hb height of BS in meters
-     * \param hm height of UT in meters
-     * \param env environment type
-     * \param city city type
-     * \param refValue reference loss value
-     * \param name TestCase name
+     * @param freq carrier frequency in Hz
+     * @param dist 2D distance between UT and BS in meters
+     * @param hb height of BS in meters
+     * @param hm height of UT in meters
+     * @param env environment type
+     * @param city city type
+     * @param refValue reference loss value
+     * @param name TestCase name
      */
     ItuR1411NlosOverRooftopPropagationLossModelTestCase(double freq,
                                                         double dist,
@@ -55,8 +55,8 @@
 
     /**
      * Create a MobilityModel
-     * \param index mobility model index
-     * \return a new MobilityModel
+     * @param index mobility model index
+     * @return a new MobilityModel
      */
     Ptr<MobilityModel> CreateMobilityModel(uint16_t index);
 
@@ -120,9 +120,9 @@
 }
 
 /**
- * \ingroup propagation-tests
+ * @ingroup propagation-tests
  *
- * \brief ItuR1411NlosOverRooftopPropagationLossModel TestSuite
+ * @brief ItuR1411NlosOverRooftopPropagationLossModel TestSuite
  *
  */
 class ItuR1411NlosOverRooftopPropagationLossModelTestSuite : public TestSuite
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/propagation/test/kun-2600-mhz-test-suite.cc ns-3.44/src/propagation/test/kun-2600-mhz-test-suite.cc
--- ns-3.43/src/propagation/test/kun-2600-mhz-test-suite.cc	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/propagation/test/kun-2600-mhz-test-suite.cc	2025-03-09 16:55:49.687372200 -0700
@@ -7,22 +7,22 @@
  *         Nicola Baldo <nbaldo@cttc.es>
  */
 
-#include <ns3/constant-position-mobility-model.h>
-#include <ns3/double.h>
-#include <ns3/enum.h>
-#include <ns3/kun-2600-mhz-propagation-loss-model.h>
-#include <ns3/log.h>
-#include <ns3/string.h>
-#include <ns3/test.h>
+#include "ns3/constant-position-mobility-model.h"
+#include "ns3/double.h"
+#include "ns3/enum.h"
+#include "ns3/kun-2600-mhz-propagation-loss-model.h"
+#include "ns3/log.h"
+#include "ns3/string.h"
+#include "ns3/test.h"
 
 using namespace ns3;
 
 NS_LOG_COMPONENT_DEFINE("Kun2600MhzPropagationLossModelTest");
 
 /**
- * \ingroup propagation-tests
+ * @ingroup propagation-tests
  *
- * \brief Kun2600MhzPropagationLossModel Test Case
+ * @brief Kun2600MhzPropagationLossModel Test Case
  *
  */
 class Kun2600MhzPropagationLossModelTestCase : public TestCase
@@ -31,11 +31,11 @@
     /**
      * Constructor
      *
-     * \param dist 2D distance between UT and BS in meters
-     * \param hb height of BS in meters
-     * \param hm height of UT in meters
-     * \param refValue reference loss value
-     * \param name TestCase name
+     * @param dist 2D distance between UT and BS in meters
+     * @param hb height of BS in meters
+     * @param hm height of UT in meters
+     * @param refValue reference loss value
+     * @param name TestCase name
      */
     Kun2600MhzPropagationLossModelTestCase(double dist,
                                            double hb,
@@ -49,8 +49,8 @@
 
     /**
      * Create a MobilityModel
-     * \param index mobility model index
-     * \return a new MobilityModel
+     * @param index mobility model index
+     * @return a new MobilityModel
      */
     Ptr<MobilityModel> CreateMobilityModel(uint16_t index);
 
@@ -100,9 +100,9 @@
 }
 
 /**
- * \ingroup propagation-tests
+ * @ingroup propagation-tests
  *
- * \brief Kun2600MhzPropagationLossModel TestSuite
+ * @brief Kun2600MhzPropagationLossModel TestSuite
  *
  */
 class Kun2600MhzPropagationLossModelTestSuite : public TestSuite
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/propagation/test/okumura-hata-test-suite.cc ns-3.44/src/propagation/test/okumura-hata-test-suite.cc
--- ns-3.43/src/propagation/test/okumura-hata-test-suite.cc	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/propagation/test/okumura-hata-test-suite.cc	2025-03-09 16:55:49.687372200 -0700
@@ -7,22 +7,22 @@
  *         Nicola Baldo <nbaldo@cttc.es>
  */
 
-#include <ns3/constant-position-mobility-model.h>
-#include <ns3/double.h>
-#include <ns3/enum.h>
-#include <ns3/log.h>
-#include <ns3/okumura-hata-propagation-loss-model.h>
-#include <ns3/string.h>
-#include <ns3/test.h>
+#include "ns3/constant-position-mobility-model.h"
+#include "ns3/double.h"
+#include "ns3/enum.h"
+#include "ns3/log.h"
+#include "ns3/okumura-hata-propagation-loss-model.h"
+#include "ns3/string.h"
+#include "ns3/test.h"
 
 using namespace ns3;
 
 NS_LOG_COMPONENT_DEFINE("OkumuraHataPropagationLossModelTest");
 
 /**
- * \ingroup propagation-tests
+ * @ingroup propagation-tests
  *
- * \brief OkumuraHataPropagationLossModel Test Case
+ * @brief OkumuraHataPropagationLossModel Test Case
  */
 class OkumuraHataPropagationLossModelTestCase : public TestCase
 {
@@ -30,14 +30,14 @@
     /**
      * Constructor
      *
-     * \param freq carrier frequency in Hz
-     * \param dist 2D distance between UT and BS in meters
-     * \param hb height of BS in meters
-     * \param hm height of UT in meters
-     * \param env environment type
-     * \param city city type
-     * \param refValue reference loss value
-     * \param name TestCase name
+     * @param freq carrier frequency in Hz
+     * @param dist 2D distance between UT and BS in meters
+     * @param hb height of BS in meters
+     * @param hm height of UT in meters
+     * @param env environment type
+     * @param city city type
+     * @param refValue reference loss value
+     * @param name TestCase name
      */
     OkumuraHataPropagationLossModelTestCase(double freq,
                                             double dist,
@@ -54,8 +54,8 @@
 
     /**
      * Create a MobilityModel
-     * \param index mobility model index
-     * \return a new MobilityModel
+     * @param index mobility model index
+     * @return a new MobilityModel
      */
     Ptr<MobilityModel> CreateMobilityModel(uint16_t index);
 
@@ -118,9 +118,9 @@
 }
 
 /**
- * \ingroup propagation-tests
+ * @ingroup propagation-tests
  *
- * \brief OkumuraHataPropagationLossModel TestSuite
+ * @brief OkumuraHataPropagationLossModel TestSuite
  *
  * This TestSuite tests the following cases:
  *   - UrbanEnvironment - Large City (original OH and COST231 OH)
@@ -174,7 +174,7 @@
                                                             1,
                                                             OpenAreasEnvironment,
                                                             LargeCity,
-                                                            110.21,
+                                                            109.66,
                                                             "original OH OpenAreas"),
                 TestCase::Duration::QUICK);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/propagation/test/probabilistic-v2v-channel-condition-model-test.cc ns-3.44/src/propagation/test/probabilistic-v2v-channel-condition-model-test.cc
--- ns-3.43/src/propagation/test/probabilistic-v2v-channel-condition-model-test.cc	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/propagation/test/probabilistic-v2v-channel-condition-model-test.cc	2025-03-09 16:55:49.687372200 -0700
@@ -24,7 +24,7 @@
 NS_LOG_COMPONENT_DEFINE("ProbabilisticV2vChannelConditionModelsTest");
 
 /**
- * \ingroup propagation-tests
+ * @ingroup propagation-tests
  *
  * Test case for the V2V Urban channel condition models using a fully
  * probabilistic model to determine LOS, NLOS and NLOSv states. The test
@@ -58,8 +58,8 @@
      * Evaluates the channel condition between two nodes by calling the method
      * GetChannelCondition on m_condModel. If the channel condition is LOS it
      * increments m_numLos, if NLOSv it increments m_numNlosv
-     * \param a the mobility model of the first node
-     * \param b the mobility model of the second node
+     * @param a the mobility model of the first node
+     * @param b the mobility model of the second node
      */
     void EvaluateChannelCondition(Ptr<MobilityModel> a, Ptr<MobilityModel> b);
 
@@ -256,7 +256,7 @@
 }
 
 /**
- * \ingroup propagation-tests
+ * @ingroup propagation-tests
  *
  * Test case for the V2V Highway channel condition models using a fully
  * probabilistic model to determine LOS, NLOS and NLOSv states. The test
@@ -290,8 +290,8 @@
      * Evaluates the channel condition between two nodes by calling the method
      * GetChannelCondition on m_condModel. If the channel condition is LOS it
      * increments m_numLos, if NLOS it increments m_numNlos
-     * \param a the mobility model of the first node
-     * \param b the mobility model of the second node
+     * @param a the mobility model of the first node
+     * @param b the mobility model of the second node
      */
     void EvaluateChannelCondition(Ptr<MobilityModel> a, Ptr<MobilityModel> b);
 
@@ -488,7 +488,7 @@
 }
 
 /**
- * \ingroup propagation-tests
+ * @ingroup propagation-tests
  *
  * Test suite for the probabilistic V2V channel condition model
  *
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/propagation/test/propagation-loss-model-test-suite.cc ns-3.44/src/propagation/test/propagation-loss-model-test-suite.cc
--- ns-3.43/src/propagation/test/propagation-loss-model-test-suite.cc	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/propagation/test/propagation-loss-model-test-suite.cc	2025-03-09 16:55:49.687372200 -0700
@@ -23,14 +23,14 @@
 // ===========================================================================
 
 /**
- * \ingroup propagation
- * \defgroup propagation-test Propagation module tests
+ * @ingroup propagation
+ * @defgroup propagation-test Propagation module tests
  */
 
 /**
- * \ingroup propagation-tests
+ * @ingroup propagation-tests
  *
- * \brief FriisPropagationLossModel Test
+ * @brief FriisPropagationLossModel Test
  */
 class FriisPropagationLossModelTestCase : public TestCase
 {
@@ -139,9 +139,9 @@
 // Added for Two-Ray Ground Model - tomhewer@mac.com
 
 /**
- * \ingroup propagation-tests
+ * @ingroup propagation-tests
  *
- * \brief TwoRayGroundPropagationLossModel Test
+ * @brief TwoRayGroundPropagationLossModel Test
  */
 class TwoRayGroundPropagationLossModelTestCase : public TestCase
 {
@@ -279,9 +279,9 @@
 }
 
 /**
- * \ingroup propagation-tests
+ * @ingroup propagation-tests
  *
- * \brief LogDistancePropagationLossModel Test
+ * @brief LogDistancePropagationLossModel Test
  */
 class LogDistancePropagationLossModelTestCase : public TestCase
 {
@@ -381,9 +381,9 @@
 }
 
 /**
- * \ingroup propagation-tests
+ * @ingroup propagation-tests
  *
- * \brief MatrixPropagationLossModel Test
+ * @brief MatrixPropagationLossModel Test
  */
 class MatrixPropagationLossModelTestCase : public TestCase
 {
@@ -434,9 +434,9 @@
 }
 
 /**
- * \ingroup propagation-tests
+ * @ingroup propagation-tests
  *
- * \brief RangePropagationLossModel Test
+ * @brief RangePropagationLossModel Test
  */
 class RangePropagationLossModelTestCase : public TestCase
 {
@@ -479,9 +479,9 @@
 }
 
 /**
- * \ingroup propagation-tests
+ * @ingroup propagation-tests
  *
- * \brief Propagation models TestSuite
+ * @brief Propagation models TestSuite
  *
  * This TestSuite tests the following models:
  *   - FriisPropagationLossModel
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/propagation/test/three-gpp-ntn-propagation-loss-model-test-suite.cc ns-3.44/src/propagation/test/three-gpp-ntn-propagation-loss-model-test-suite.cc
--- ns-3.43/src/propagation/test/three-gpp-ntn-propagation-loss-model-test-suite.cc	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/propagation/test/three-gpp-ntn-propagation-loss-model-test-suite.cc	2025-03-09 16:55:49.687372200 -0700
@@ -25,7 +25,7 @@
 NS_LOG_COMPONENT_DEFINE("ThreeGppNTNPropagationLossModelsTest");
 
 /**
- * \ingroup propagation-tests
+ * @ingroup propagation-tests
  *
  * Test case for the ThreeGppNTNPropagationLossModel classes.
  * It computes the path loss between two nodes and compares it with the value
@@ -204,9 +204,9 @@
 }
 
 /**
- * \ingroup propagation-tests
+ * @ingroup propagation-tests
  *
- * \brief 3GPP NTN Propagation models TestSuite
+ * @brief 3GPP NTN Propagation models TestSuite
  *
  * This TestSuite tests the following models:
  *   - ThreeGppNTNDenseUrbanPropagationLossModel
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/propagation/test/three-gpp-propagation-loss-model-test-suite.cc ns-3.44/src/propagation/test/three-gpp-propagation-loss-model-test-suite.cc
--- ns-3.43/src/propagation/test/three-gpp-propagation-loss-model-test-suite.cc	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/propagation/test/three-gpp-propagation-loss-model-test-suite.cc	2025-03-09 16:55:49.687372200 -0700
@@ -24,7 +24,7 @@
 NS_LOG_COMPONENT_DEFINE("ThreeGppPropagationLossModelsTest");
 
 /**
- * \ingroup propagation-tests
+ * @ingroup propagation-tests
  *
  * Test case for the class ThreeGppRmaPropagationLossModel.
  * It computes the pathloss between two nodes and compares it with the value
@@ -185,7 +185,7 @@
 }
 
 /**
- * \ingroup propagation-tests
+ * @ingroup propagation-tests
  *
  * Test case for the class ThreeGppUmaPropagationLossModel.
  * It computes the pathloss between two nodes and compares it with the value
@@ -348,7 +348,7 @@
 }
 
 /**
- * \ingroup propagation-tests
+ * @ingroup propagation-tests
  *
  * Test case for the class ThreeGppUmiStreetCanyonPropagationLossModel.
  * It computes the pathloss between two nodes and compares it with the value
@@ -505,7 +505,7 @@
 }
 
 /**
- * \ingroup propagation-tests
+ * @ingroup propagation-tests
  *
  * Test case for the class ThreeGppIndoorOfficePropagationLossModel.
  * It computes the pathloss between two nodes and compares it with the value
@@ -669,7 +669,7 @@
 }
 
 /**
- * \ingroup propagation-tests
+ * @ingroup propagation-tests
  *
  * Test case for the class ThreeGppV2vUrbanPropagationLossModel.
  * It computes the pathloss between two nodes and compares it with the value
@@ -828,7 +828,7 @@
 }
 
 /**
- * \ingroup propagation-tests
+ * @ingroup propagation-tests
  *
  * Test case for the class ThreeGppV2vHighwayPropagationLossModel.
  * It computes the pathloss between two nodes and compares it with the value
@@ -987,7 +987,7 @@
 }
 
 /**
- * \ingroup propagation-tests
+ * @ingroup propagation-tests
  *
  * Test to check if the shadowing fading is correctly computed
  */
@@ -1002,13 +1002,13 @@
 
     /**
      * Run the experiment
-     * \param testNum the index of the experiment
-     * \param propagationLossModelType the type id of the propagation loss model
+     * @param testNum the index of the experiment
+     * @param propagationLossModelType the type id of the propagation loss model
      *        to be used
-     * \param hBs the BS height in meters
-     * \param hUt the UT height in meters
-     * \param distance the initial distance between the BS and the UT
-     * \param shadowingEnabled true if shadowging must be enabled
+     * @param hBs the BS height in meters
+     * @param hUt the UT height in meters
+     * @param distance the initial distance between the BS and the UT
+     * @param shadowingEnabled true if shadowging must be enabled
      */
     void RunTest(uint16_t testNum,
                  std::string propagationLossModelType,
@@ -1019,15 +1019,15 @@
 
     /**
      * Compute the propagation loss
-     * \param a the first mobility model
-     * \param b the second mobility model
-     * \param testNum the index of the experiment
+     * @param a the first mobility model
+     * @param b the second mobility model
+     * @param testNum the index of the experiment
      */
     void EvaluateLoss(Ptr<MobilityModel> a, Ptr<MobilityModel> b, uint8_t testNum);
 
     /**
      * Change the channel condition model
-     * \param ccm the new ChannelConditionModel
+     * @param ccm the new ChannelConditionModel
      */
     void ChangeChannelCondition(Ptr<ChannelConditionModel> ccm);
 
@@ -1292,9 +1292,9 @@
 }
 
 /**
- * \ingroup propagation-tests
+ * @ingroup propagation-tests
  *
- * \brief 3GPP Propagation models TestSuite
+ * @brief 3GPP Propagation models TestSuite
  *
  * This TestSuite tests the following models:
  *   - ThreeGppRmaPropagationLossModel
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/sixlowpan/examples/example-ping-lr-wpan-beacon.cc ns-3.44/src/sixlowpan/examples/example-ping-lr-wpan-beacon.cc
--- ns-3.43/src/sixlowpan/examples/example-ping-lr-wpan-beacon.cc	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/sixlowpan/examples/example-ping-lr-wpan-beacon.cc	2025-03-09 16:55:49.687372200 -0700
@@ -143,8 +143,8 @@
     ping.SetAttribute("Size", UintegerValue(packetSize));
     ApplicationContainer apps = ping.Install(nodes.Get(0));
 
-    apps.Start(Seconds(2.0));
-    apps.Stop(Seconds(7.0));
+    apps.Start(Seconds(2));
+    apps.Stop(Seconds(7));
 
     AsciiTraceHelper ascii;
     lrWpanHelper.EnableAsciiAll(ascii.CreateFileStream("Ping-6LoW-lr-wpan-beacon.tr"));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/sixlowpan/examples/example-ping-lr-wpan.cc ns-3.44/src/sixlowpan/examples/example-ping-lr-wpan.cc
--- ns-3.43/src/sixlowpan/examples/example-ping-lr-wpan.cc	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/sixlowpan/examples/example-ping-lr-wpan.cc	2025-03-09 16:55:49.687372200 -0700
@@ -107,8 +107,8 @@
     ping.SetAttribute("Size", UintegerValue(packetSize));
     ApplicationContainer apps = ping.Install(nodes.Get(0));
 
-    apps.Start(Seconds(2.0));
-    apps.Stop(Seconds(20.0));
+    apps.Start(Seconds(2));
+    apps.Stop(Seconds(20));
 
     if (!disableAsciiTrace)
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/sixlowpan/examples/example-ping-lr-wpan-mesh-under.cc ns-3.44/src/sixlowpan/examples/example-ping-lr-wpan-mesh-under.cc
--- ns-3.43/src/sixlowpan/examples/example-ping-lr-wpan-mesh-under.cc	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/sixlowpan/examples/example-ping-lr-wpan-mesh-under.cc	2025-03-09 16:55:49.687372200 -0700
@@ -116,8 +116,8 @@
     ping.SetAttribute("Size", UintegerValue(packetSize));
     ApplicationContainer apps = ping.Install(wsnNodes.Get(nWsnNodes - 1));
 
-    apps.Start(Seconds(2.0));
-    apps.Stop(Seconds(20.0));
+    apps.Start(Seconds(2));
+    apps.Stop(Seconds(20));
 
     AsciiTraceHelper ascii;
     lrWpanHelper.EnableAsciiAll(ascii.CreateFileStream("Ping-6LoW-lr-wpan-meshunder-lr-wpan.tr"));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/sixlowpan/examples/example-sixlowpan.cc ns-3.44/src/sixlowpan/examples/example-sixlowpan.cc
--- ns-3.43/src/sixlowpan/examples/example-sixlowpan.cc	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/sixlowpan/examples/example-sixlowpan.cc	2025-03-09 16:55:49.687372200 -0700
@@ -102,8 +102,8 @@
     ping.SetAttribute("Size", UintegerValue(packetSize));
     ApplicationContainer apps = ping.Install(net1.Get(0));
 
-    apps.Start(Seconds(5.0));
-    apps.Stop(Seconds(15.0));
+    apps.Start(Seconds(5));
+    apps.Stop(Seconds(15));
 
     AsciiTraceHelper ascii;
     csma.EnableAsciiAll(ascii.CreateFileStream("example-sixlowpan.tr"));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/sixlowpan/helper/sixlowpan-helper.h ns-3.44/src/sixlowpan/helper/sixlowpan-helper.h
--- ns-3.43/src/sixlowpan/helper/sixlowpan-helper.h	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/sixlowpan/helper/sixlowpan-helper.h	2025-03-09 16:55:49.687372200 -0700
@@ -22,9 +22,9 @@
 class Time;
 
 /**
- * \ingroup sixlowpan
+ * @ingroup sixlowpan
  *
- * \brief Setup a sixlowpan stack to be used as a shim between IPv6 and a generic NetDevice.
+ * @brief Setup a sixlowpan stack to be used as a shim between IPv6 and a generic NetDevice.
  */
 class SixLowPanHelper
 {
@@ -37,13 +37,13 @@
      * Set an attribute on each ns3::SixlowpanNetDevice created by
      * SixlowpanHelper::Install.
      *
-     * \param n1 [in] The name of the attribute to set.
-     * \param v1 [in] The value of the attribute to set.
+     * @param n1 [in] The name of the attribute to set.
+     * @param v1 [in] The value of the attribute to set.
      */
     void SetDeviceAttribute(std::string n1, const AttributeValue& v1);
 
     /**
-     * \brief Install the SixLoWPAN stack on top of an existing NetDevice.
+     * @brief Install the SixLoWPAN stack on top of an existing NetDevice.
      *
      * This function requires a set of properly configured NetDevices
      * passed in as the parameter "c". The new NetDevices will have to
@@ -59,42 +59,42 @@
      * with some limitations.
      * See the manual for a complete discussion.
      *
-     * \note IPv6 stack must be installed \a after SixLoWPAN,
+     * @note IPv6 stack must be installed \a after SixLoWPAN,
      * using the SixLoWPAN NetDevices. See the example in the
      * examples directory.
      *
      *
-     * \param [in] c The NetDevice container.
-     * \return A container with the newly created SixLowPanNetDevices.
+     * @param [in] c The NetDevice container.
+     * @return A container with the newly created SixLowPanNetDevices.
      */
     NetDeviceContainer Install(NetDeviceContainer c);
 
     /**
-     * \brief Adds a compression Context to a set of NetDevices.
+     * @brief Adds a compression Context to a set of NetDevices.
      *
      * This function installs one Compression Context on a set of NetDevices.
      * The context is used only in IPHC compression and decompression.
      *
-     * \param [in] c The NetDevice container.
-     * \param [in] contextId The context id (must be less than 16).
-     * \param [in] context The context prefix.
-     * \param [in] validity the context validity time (relative to the actual time).
+     * @param [in] c The NetDevice container.
+     * @param [in] contextId The context id (must be less than 16).
+     * @param [in] context The context prefix.
+     * @param [in] validity the context validity time (relative to the actual time).
      */
     void AddContext(NetDeviceContainer c, uint8_t contextId, Ipv6Prefix context, Time validity);
 
     /**
-     * \brief Renew a compression Context in a set of NetDevices.
+     * @brief Renew a compression Context in a set of NetDevices.
      *
      * The context will have its lifetime extended and its validity for compression re-enabled.
      *
-     * \param [in] c The NetDevice container.
-     * \param [in] contextId The context id (must be less than 16).
-     * \param [in] validity the context validity time (relative to the actual time).
+     * @param [in] c The NetDevice container.
+     * @param [in] contextId The context id (must be less than 16).
+     * @param [in] validity the context validity time (relative to the actual time).
      */
     void RenewContext(NetDeviceContainer c, uint8_t contextId, Time validity);
 
     /**
-     * \brief Invalidates a compression Context in a set of NetDevices.
+     * @brief Invalidates a compression Context in a set of NetDevices.
      *
      * An invalid context is used only in IPHC decompression and not
      * in IPHC compression.
@@ -102,18 +102,18 @@
      * This is necessary to avoid that a context reaching its validity lifetime
      * can not be used for decompression whie packets are traveling the network.
      *
-     * \param [in] c The NetDevice container.
-     * \param [in] contextId The context id (must be less than 16).
+     * @param [in] c The NetDevice container.
+     * @param [in] contextId The context id (must be less than 16).
      */
     void InvalidateContext(NetDeviceContainer c, uint8_t contextId);
 
     /**
-     * \brief Remove a compression Context in a set of NetDevices.
+     * @brief Remove a compression Context in a set of NetDevices.
      *
      * The context is removed immediately from the contexts in the devices.
      *
-     * \param [in] c The NetDevice container.
-     * \param [in] contextId The context id (must be less than 16).
+     * @param [in] c The NetDevice container.
+     * @param [in] contextId The context id (must be less than 16).
      */
     void RemoveContext(NetDeviceContainer c, uint8_t contextId);
 
@@ -123,10 +123,10 @@
      * have been assigned. The Install() method should have previously been
      * called by the user.
      *
-     * \param [in] c NetDeviceContainer of the set of net devices for which the
+     * @param [in] c NetDeviceContainer of the set of net devices for which the
      *          SixLowPanNetDevice should be modified to use a fixed stream.
-     * \param [in] stream First stream index to use.
-     * \return The number of stream indices assigned by this helper.
+     * @param [in] stream First stream index to use.
+     * @return The number of stream indices assigned by this helper.
      */
     int64_t AssignStreams(NetDeviceContainer c, int64_t stream);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/sixlowpan/model/sixlowpan-header.h ns-3.44/src/sixlowpan/model/sixlowpan-header.h
--- ns-3.43/src/sixlowpan/model/sixlowpan-header.h	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/sixlowpan/model/sixlowpan-header.h	2025-03-09 16:55:49.687372200 -0700
@@ -17,8 +17,8 @@
 {
 
 /**
-* \ingroup sixlowpan
-* \brief   Dispatch header helper. This class only purpose is to interpret
+* @ingroup sixlowpan
+* @brief   Dispatch header helper. This class only purpose is to interpret
 * the Dispatch header into its correct type.
 *
 * The dispatch type is defined by a zero bit as the first bit and a one
@@ -35,7 +35,7 @@
 {
   public:
     /**
-     * \brief Dispatch values, as defined in \RFC{4944} and \RFC{6282}
+     * @brief Dispatch values, as defined in \RFC{4944} and \RFC{6282}
      \verbatim
        Pattern    Header Type
      +------------+------------------------------------------------+
@@ -81,7 +81,7 @@
     };
 
     /**
-     *  \brief Dispatch values for Next Header compression.
+     *  @brief Dispatch values for Next Header compression.
      *
      *  The dispatch values reflect the dispatch use, since
      *  some dispatch bits carry actual header compression bits.
@@ -98,29 +98,29 @@
     SixLowPanDispatch();
 
     /**
-     * \brief Get the Dispatch type.
-     * \param [in] dispatch The dispatch value.
-     * \return The Dispatch type.
+     * @brief Get the Dispatch type.
+     * @param [in] dispatch The dispatch value.
+     * @return The Dispatch type.
      */
     static Dispatch_e GetDispatchType(uint8_t dispatch);
 
     /**
-     * \brief Get the NhcDispatch type.
-     * \param [in] dispatch The dispatch value.
-     * \return The NhcDispatch type.
+     * @brief Get the NhcDispatch type.
+     * @param [in] dispatch The dispatch value.
+     * @return The NhcDispatch type.
      */
     static NhcDispatch_e GetNhcDispatchType(uint8_t dispatch);
 };
 
 /**
- * \ingroup sixlowpan
- * \brief 6LoWPAN HC1 header - see \RFC{4944}.
+ * @ingroup sixlowpan
+ * @brief 6LoWPAN HC1 header - see \RFC{4944}.
  */
 class SixLowPanHc1 : public Header
 {
   public:
     /**
-     * \brief Kind of address compression.
+     * @brief Kind of address compression.
      *
      * The address compression is handled in 4 bits and might mean:
      * PI: Prefix inline, PC: Prefix Compressed,
@@ -135,7 +135,7 @@
     };
 
     /**
-     * \brief Next header information.
+     * @brief Next header information.
      *
      * The Next header compression is handled in 4 bits and might mean:
      * NC: Not Compressed, UDP, ICMP or TCP.
@@ -151,14 +151,14 @@
     SixLowPanHc1();
 
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Return the instance type identifier.
-     * \return Instance type ID.
+     * @brief Return the instance type identifier.
+     * @return Instance type ID.
      */
 
     TypeId GetInstanceTypeId() const override;
@@ -166,165 +166,165 @@
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Get the serialized size of the packet.
-     * \return Size.
+     * @brief Get the serialized size of the packet.
+     * @return Size.
      */
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Serialize the packet.
-     * \param [in] start Buffer iterator.
+     * @brief Serialize the packet.
+     * @param [in] start Buffer iterator.
      */
     void Serialize(Buffer::Iterator start) const override;
 
     /**
-     * \brief Deserialize the packet.
-     * \param [in] start Buffer iterator.
-     * \return Size of the packet.
+     * @brief Deserialize the packet.
+     * @param [in] start Buffer iterator.
+     * @return Size of the packet.
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
 
     /**
-     * \brief Set the "Hop limit" field (TTL).
-     * \param [in] limit The hop limit value.
+     * @brief Set the "Hop limit" field (TTL).
+     * @param [in] limit The hop limit value.
      */
     void SetHopLimit(uint8_t limit);
 
     /**
-     * \brief Get the "Hop limit" field (TTL).
-     * \return The hop limit value.
+     * @brief Get the "Hop limit" field (TTL).
+     * @return The hop limit value.
      */
     uint8_t GetHopLimit() const;
 
     /**
-     * \brief Get Destination Compression type.
-     * \returns The kind of address compression.
+     * @brief Get Destination Compression type.
+     * @returns The kind of address compression.
      */
     LowPanHc1Addr_e GetDstCompression() const;
 
     /**
-     * \brief Get the destination interface.
-     * \returns The destination interface.
+     * @brief Get the destination interface.
+     * @returns The destination interface.
      */
     const uint8_t* GetDstInterface() const;
 
     /**
-     * \brief Get the destination prefix.
-     * \returns The destination prefix.
+     * @brief Get the destination prefix.
+     * @returns The destination prefix.
      */
     const uint8_t* GetDstPrefix() const;
 
     /**
-     * \brief Get the Flow Label value.
-     * \returns The Flow Label.
+     * @brief Get the Flow Label value.
+     * @returns The Flow Label.
      */
     uint32_t GetFlowLabel() const;
 
     /**
-     * \brief Get the Next Header value.
-     * \returns The Next Header value.
+     * @brief Get the Next Header value.
+     * @returns The Next Header value.
      */
     uint8_t GetNextHeader() const;
 
     /**
-     * \brief Get Source Compression type.
-     * \returns The kind of address compression.
+     * @brief Get Source Compression type.
+     * @returns The kind of address compression.
      */
     LowPanHc1Addr_e GetSrcCompression() const;
 
     /**
-     * \brief Get the source interface.
-     * \returns The source interface.
+     * @brief Get the source interface.
+     * @returns The source interface.
      */
     const uint8_t* GetSrcInterface() const;
 
     /**
-     * \brief Get the source prefix.
-     * \returns The source prefix.
+     * @brief Get the source prefix.
+     * @returns The source prefix.
      */
     const uint8_t* GetSrcPrefix() const;
 
     /**
-     * \brief Get the Traffic Class value.
-     * \returns The Traffic Class value.
+     * @brief Get the Traffic Class value.
+     * @returns The Traffic Class value.
      */
     uint8_t GetTrafficClass() const;
 
     /**
-     * \brief Check if the Traffic Class and Flow Labels are compressed.
-     * \returns True if TC and FL are compressed.
+     * @brief Check if the Traffic Class and Flow Labels are compressed.
+     * @returns True if TC and FL are compressed.
      */
     bool IsTcflCompression() const;
 
     /**
-     * \brief Check if there is a HC2 compressed header.
-     * \returns True if next header is HC2 compressed.
+     * @brief Check if there is a HC2 compressed header.
+     * @returns True if next header is HC2 compressed.
      */
     bool IsHc2HeaderPresent() const;
 
     /**
-     * \brief Set Destination Compression type.
-     * \param [in] dstCompression The kind of address compression.
+     * @brief Set Destination Compression type.
+     * @param [in] dstCompression The kind of address compression.
      */
     void SetDstCompression(LowPanHc1Addr_e dstCompression);
 
     /**
-     * \brief Set the destination interface.
-     * \param [in] dstInterface The destination interface.
+     * @brief Set the destination interface.
+     * @param [in] dstInterface The destination interface.
      */
     void SetDstInterface(const uint8_t* dstInterface);
 
     /**
-     * \brief Set the destination prefix.
-     * \param [in] dstPrefix The destination prefix.
+     * @brief Set the destination prefix.
+     * @param [in] dstPrefix The destination prefix.
      */
     void SetDstPrefix(const uint8_t* dstPrefix);
 
     /**
-     * \brief Set the Flow Label value.
-     * \param [in] flowLabel The Flow Label.
+     * @brief Set the Flow Label value.
+     * @param [in] flowLabel The Flow Label.
      */
     void SetFlowLabel(uint32_t flowLabel);
 
     /**
-     * \brief Set the Next Header value.
-     * \param [in] nextHeader The Next Header value.
+     * @brief Set the Next Header value.
+     * @param [in] nextHeader The Next Header value.
      */
     void SetNextHeader(uint8_t nextHeader);
 
     /**
-     * \brief Set Source Compression type.
-     * \param [in] srcCompression The kind of address compression.
+     * @brief Set Source Compression type.
+     * @param [in] srcCompression The kind of address compression.
      */
     void SetSrcCompression(LowPanHc1Addr_e srcCompression);
 
     /**
-     * \brief Set the source interface.
-     * \param [in] srcInterface The source interface.
+     * @brief Set the source interface.
+     * @param [in] srcInterface The source interface.
      */
     void SetSrcInterface(const uint8_t* srcInterface);
 
     /**
-     * \brief Set the source prefix.
-     * \param [in] srcPrefix The source prefix.
+     * @brief Set the source prefix.
+     * @param [in] srcPrefix The source prefix.
      */
     void SetSrcPrefix(const uint8_t* srcPrefix);
 
     /**
-     * \brief Set the Traffic Class and Flow Labels as compressed.
-     * \param [in] tcflCompression True if TC and FL are compressed.
+     * @brief Set the Traffic Class and Flow Labels as compressed.
+     * @param [in] tcflCompression True if TC and FL are compressed.
      */
     void SetTcflCompression(bool tcflCompression);
 
     /**
-     * \brief Set the next header a HC2 compressed header.
-     * \param [in] hc2HeaderPresent True if next header is HC2 compressed.
+     * @brief Set the next header a HC2 compressed header.
+     * @param [in] hc2HeaderPresent True if next header is HC2 compressed.
      */
     void SetHc2HeaderPresent(bool hc2HeaderPresent);
 
     /**
-     * \brief Set the Traffic Class value.
-     * \param [in] trafficClass The Traffic Class value.
+     * @brief Set the Traffic Class value.
+     * @param [in] trafficClass The Traffic Class value.
      */
     void SetTrafficClass(uint8_t trafficClass);
 
@@ -345,17 +345,17 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param [in] os The reference to the output stream.
- * \param [in] header The HC1 Header.
- * \returns The reference to the output stream.
+ * @param [in] os The reference to the output stream.
+ * @param [in] header The HC1 Header.
+ * @returns The reference to the output stream.
  */
 std::ostream& operator<<(std::ostream& os, const SixLowPanHc1& header);
 
 /**
- * \ingroup sixlowpan
- * \brief 6LoWPAN FRAG1 header - see \RFC{4944}.
+ * @ingroup sixlowpan
+ * @brief 6LoWPAN FRAG1 header - see \RFC{4944}.
  */
 class SixLowPanFrag1 : public Header
 {
@@ -363,59 +363,59 @@
     SixLowPanFrag1();
 
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Return the instance type identifier.
-     * \return Instance type ID.
+     * @brief Return the instance type identifier.
+     * @return Instance type ID.
      */
     TypeId GetInstanceTypeId() const override;
 
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Get the serialized size of the packet.
-     * \return Size.
+     * @brief Get the serialized size of the packet.
+     * @return Size.
      */
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Serialize the packet.
-     * \param [in] start Buffer iterator.
+     * @brief Serialize the packet.
+     * @param [in] start Buffer iterator.
      */
     void Serialize(Buffer::Iterator start) const override;
 
     /**
-     * \brief Deserialize the packet.
-     * \param [in] start Buffer iterator.
-     * \return Size of the packet.
+     * @brief Deserialize the packet.
+     * @param [in] start Buffer iterator.
+     * @return Size of the packet.
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
 
     /**
-     * \brief Set the datagram size.
-     * \param [in] datagramSize The datagram size.
+     * @brief Set the datagram size.
+     * @param [in] datagramSize The datagram size.
      */
     void SetDatagramSize(uint16_t datagramSize);
 
     /**
-     * \brief Get the datagram size.
-     * \returns The datagram size.
+     * @brief Get the datagram size.
+     * @returns The datagram size.
      */
     uint16_t GetDatagramSize() const;
 
     /**
-     * \brief Set the datagram tag.
-     * \param [in] datagramTag The datagram tag.
+     * @brief Set the datagram tag.
+     * @param [in] datagramTag The datagram tag.
      */
     void SetDatagramTag(uint16_t datagramTag);
 
     /**
-     * \brief Get the datagram tag.
-     * \returns The datagram tag.
+     * @brief Get the datagram tag.
+     * @returns The datagram tag.
      */
     uint16_t GetDatagramTag() const;
 
@@ -425,17 +425,17 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param [in] os The reference to the output stream.
- * \param [in] header The Frag1 Header.
- * \returns The reference to the output stream.
+ * @param [in] os The reference to the output stream.
+ * @param [in] header The Frag1 Header.
+ * @returns The reference to the output stream.
  */
 std::ostream& operator<<(std::ostream& os, const SixLowPanFrag1& header);
 
 /**
- * \ingroup sixlowpan
- * \brief 6LoWPAN FRAGN header - see \RFC{4944}.
+ * @ingroup sixlowpan
+ * @brief 6LoWPAN FRAGN header - see \RFC{4944}.
  */
 class SixLowPanFragN : public Header
 {
@@ -443,71 +443,71 @@
     SixLowPanFragN();
 
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Return the instance type identifier.
-     * \return Instance type ID.
+     * @brief Return the instance type identifier.
+     * @return Instance type ID.
      */
     TypeId GetInstanceTypeId() const override;
 
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Get the serialized size of the packet.
-     * \return Size.
+     * @brief Get the serialized size of the packet.
+     * @return Size.
      */
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Serialize the packet.
-     * \param [in] start Buffer iterator.
+     * @brief Serialize the packet.
+     * @param [in] start Buffer iterator.
      */
     void Serialize(Buffer::Iterator start) const override;
 
     /**
-     * \brief Deserialize the packet.
-     * \param [in] start Buffer iterator.
-     * \return Size of the packet.
+     * @brief Deserialize the packet.
+     * @param [in] start Buffer iterator.
+     * @return Size of the packet.
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
 
     /**
-     * \brief Set the datagram size.
-     * \param [in] datagramSize The datagram size.
+     * @brief Set the datagram size.
+     * @param [in] datagramSize The datagram size.
      */
     void SetDatagramSize(uint16_t datagramSize);
 
     /**
-     * \brief Get the datagram size.
-     * \returns The datagram size.
+     * @brief Get the datagram size.
+     * @returns The datagram size.
      */
     uint16_t GetDatagramSize() const;
 
     /**
-     * \brief Set the datagram tag.
-     * \param [in] datagramTag The datagram tag.
+     * @brief Set the datagram tag.
+     * @param [in] datagramTag The datagram tag.
      */
     void SetDatagramTag(uint16_t datagramTag);
 
     /**
-     * \brief Get the datagram tag.
-     * \returns The datagram tag.
+     * @brief Get the datagram tag.
+     * @returns The datagram tag.
      */
     uint16_t GetDatagramTag() const;
 
     /**
-     * \brief Set the datagram offset.
-     * \param [in] datagramOffset The datagram offset.
+     * @brief Set the datagram offset.
+     * @param [in] datagramOffset The datagram offset.
      */
     void SetDatagramOffset(uint8_t datagramOffset);
 
     /**
-     * \brief Get the datagram offset.
-     * \returns The datagram offset.
+     * @brief Get the datagram offset.
+     * @returns The datagram offset.
      */
     uint8_t GetDatagramOffset() const;
 
@@ -518,17 +518,17 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param [in] os The reference to the output stream.
- * \param [in] header The FragN Header.
- * \returns The reference to the output stream.
+ * @param [in] os The reference to the output stream.
+ * @param [in] header The FragN Header.
+ * @returns The reference to the output stream.
  */
 std::ostream& operator<<(std::ostream& os, const SixLowPanFragN& header);
 
 /**
- * \ingroup sixlowpan
- * \brief 6LoWPAN IPv6 uncompressed header - see \RFC{4944}.
+ * @ingroup sixlowpan
+ * @brief 6LoWPAN IPv6 uncompressed header - see \RFC{4944}.
  */
 class SixLowPanIpv6 : public Header
 {
@@ -536,51 +536,51 @@
     SixLowPanIpv6();
 
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Return the instance type identifier.
-     * \return Instance type ID.
+     * @brief Return the instance type identifier.
+     * @return Instance type ID.
      */
     TypeId GetInstanceTypeId() const override;
 
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Get the serialized size of the packet.
-     * \return Size.
+     * @brief Get the serialized size of the packet.
+     * @return Size.
      */
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Serialize the packet.
-     * \param [in] start Buffer iterator.
+     * @brief Serialize the packet.
+     * @param [in] start Buffer iterator.
      */
     void Serialize(Buffer::Iterator start) const override;
 
     /**
-     * \brief Deserialize the packet.
-     * \param [in] start Buffer iterator.
-     * \return Size of the packet.
+     * @brief Deserialize the packet.
+     * @param [in] start Buffer iterator.
+     * @return Size of the packet.
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param [in] os The reference to the output stream.
- * \param [in] header The Frag1 Header.
- * \returns The reference to the output stream.
+ * @param [in] os The reference to the output stream.
+ * @param [in] header The Frag1 Header.
+ * @returns The reference to the output stream.
  */
 std::ostream& operator<<(std::ostream& os, const SixLowPanIpv6& header);
 
 /**
-* \ingroup sixlowpan
-* \brief   LOWPAN_IPHC base Encoding - see \RFC{6282}.
+* @ingroup sixlowpan
+* @brief   LOWPAN_IPHC base Encoding - see \RFC{6282}.
   \verbatim
        0                                       1
        0   1   2   3   4   5   6   7   8   9   0   1   2   3   4   5
@@ -593,7 +593,7 @@
 {
   public:
     /**
-     *  \brief TF: Traffic Class, Flow Label.
+     *  @brief TF: Traffic Class, Flow Label.
      *
      *  00:  ECN + DSCP + 4-bit Pad + Flow Label (4 bytes)
      *  01:  ECN + 2-bit Pad + Flow Label (3 bytes), DSCP is elided.
@@ -610,7 +610,7 @@
     };
 
     /**
-     *  \brief HLIM: Hop Limit.
+     *  @brief HLIM: Hop Limit.
      *
      *  00:  The Hop Limit field is carried in-line.
      *  01:  The Hop Limit field is compressed and the hop limit is 1.
@@ -626,7 +626,7 @@
     };
 
     /**
-     *  \brief Source or Destination Address Mode.
+     *  @brief Source or Destination Address Mode.
      *
      *  00:  128 bits.
      *  01:  64 bits (or 48 bits if multicast).
@@ -643,259 +643,259 @@
 
     SixLowPanIphc();
     /**
-     * \brief Constructor.
-     * \param [in] dispatch Dispatch value.
+     * @brief Constructor.
+     * @param [in] dispatch Dispatch value.
      */
     SixLowPanIphc(uint8_t dispatch);
 
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Return the instance type identifier.
-     * \return Instance type ID.
+     * @brief Return the instance type identifier.
+     * @return Instance type ID.
      */
     TypeId GetInstanceTypeId() const override;
 
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Get the serialized size of the packet.
-     * \return Size.
+     * @brief Get the serialized size of the packet.
+     * @return Size.
      */
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Serialize the packet.
-     * \param [in] start Buffer iterator.
+     * @brief Serialize the packet.
+     * @param [in] start Buffer iterator.
      */
     void Serialize(Buffer::Iterator start) const override;
 
     /**
-     * \brief Deserialize the packet.
-     * \param [in] start Buffer iterator.
-     * \return Size of the packet.
+     * @brief Deserialize the packet.
+     * @param [in] start Buffer iterator.
+     * @return Size of the packet.
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
 
     /**
-     * \brief Set the TF (Traffic Class, Flow Label) compression.
-     * \param [in] tfField ECN, DSCP, Flow Label compression type.
+     * @brief Set the TF (Traffic Class, Flow Label) compression.
+     * @param [in] tfField ECN, DSCP, Flow Label compression type.
      */
     void SetTf(TrafficClassFlowLabel_e tfField);
 
     /**
-     * \brief Get the TF (Traffic Class, Flow Label) compression.
-     * \return The ECN, DSCP, Flow Label compression type.
+     * @brief Get the TF (Traffic Class, Flow Label) compression.
+     * @return The ECN, DSCP, Flow Label compression type.
      */
     TrafficClassFlowLabel_e GetTf() const;
 
     /**
-     * \brief Set the NH (Next Header) compression.
-     * \param [in] nhField False (Next Header carried in-line), true (compressed NH).
+     * @brief Set the NH (Next Header) compression.
+     * @param [in] nhField False (Next Header carried in-line), true (compressed NH).
      */
     void SetNh(bool nhField);
 
     /**
-     * \brief Get the NH (Next Header) compression.
-     * \return False (Next Header carried in-line), true (compressed NH).
+     * @brief Get the NH (Next Header) compression.
+     * @return False (Next Header carried in-line), true (compressed NH).
      */
     bool GetNh() const;
 
     /**
-     * \brief Set the HLIM (Hop Limit) compression.
-     * \param [in] hlimField Hop Limit compression type
+     * @brief Set the HLIM (Hop Limit) compression.
+     * @param [in] hlimField Hop Limit compression type
      */
     void SetHlim(Hlim_e hlimField);
 
     /**
-     * \brief Get the HLIM (Hop Limit) compression.
-     * \return Hop Limit compression type.
+     * @brief Get the HLIM (Hop Limit) compression.
+     * @return Hop Limit compression type.
      */
     Hlim_e GetHlim() const;
 
     /**
-     * \brief Set the CID (Context Identifier Extension) compression.
-     * \param [in] cidField False (no CID present), true (CID follows).
+     * @brief Set the CID (Context Identifier Extension) compression.
+     * @param [in] cidField False (no CID present), true (CID follows).
      */
     void SetCid(bool cidField);
 
     /**
-     * \brief Get the CID (Context Identifier Extension) compression.
-     * \return False (no CID present), true (CID follows).
+     * @brief Get the CID (Context Identifier Extension) compression.
+     * @return False (no CID present), true (CID follows).
      */
     bool GetCid() const;
 
     /**
-     * \brief Set the SAC (Source Address Compression) compression.
-     * \param [in] sacField False (stateless), true (stateful).
+     * @brief Set the SAC (Source Address Compression) compression.
+     * @param [in] sacField False (stateless), true (stateful).
      */
     void SetSac(bool sacField);
 
     /**
-     * \brief Get the SAC (Source Address Compression) compression.
-     * \return False (stateless), true (stateful).
+     * @brief Get the SAC (Source Address Compression) compression.
+     * @return False (stateless), true (stateful).
      */
     bool GetSac() const;
 
     /**
-     * \brief Set the SAM (Source Address Mode) compression.
-     * \param [in] samField Depends on the SAC.
+     * @brief Set the SAM (Source Address Mode) compression.
+     * @param [in] samField Depends on the SAC.
      */
     void SetSam(HeaderCompression_e samField);
 
     /**
-     * \brief Get the SAM (Source Address Mode) compression.
-     * \return Depends on the SAC field.
+     * @brief Get the SAM (Source Address Mode) compression.
+     * @return Depends on the SAC field.
      */
     HeaderCompression_e GetSam() const;
 
     /**
      * brief Set the source address inline part
-     * \param srcInlinePart The inline portion of the compressed source address (16 bytes)
-     * \param size The number of inline bytes
+     * @param srcInlinePart The inline portion of the compressed source address (16 bytes)
+     * @param size The number of inline bytes
      */
     void SetSrcInlinePart(uint8_t srcInlinePart[16], uint8_t size);
 
     /**
      * brief Get the source address inline part
-     * \return The inline portion of the compressed source address (16 bytes)
+     * @return The inline portion of the compressed source address (16 bytes)
      */
     const uint8_t* GetSrcInlinePart() const;
 
     /**
-     * \brief Set the M (Multicast) compression.
-     * \param [in] mField True if destination is multicast.
+     * @brief Set the M (Multicast) compression.
+     * @param [in] mField True if destination is multicast.
      */
     void SetM(bool mField);
 
     /**
-     * \brief Get the M (Multicast) compression.
-     * \return True if destination is multicast.
+     * @brief Get the M (Multicast) compression.
+     * @return True if destination is multicast.
      */
     bool GetM() const;
 
     /**
-     * \brief Set the DAC (Destination Address Compression) compression.
-     * \param [in] dacField False (stateless), true (stateful).
+     * @brief Set the DAC (Destination Address Compression) compression.
+     * @param [in] dacField False (stateless), true (stateful).
      */
     void SetDac(bool dacField);
 
     /**
-     * \brief Get the DAC (Destination Address Compression) compression.
-     * \return False (stateless), true (stateful).
+     * @brief Get the DAC (Destination Address Compression) compression.
+     * @return False (stateless), true (stateful).
      */
     bool GetDac() const;
 
     /**
-     * \brief Set the DAM (Destination Address Mode) compression.
-     * \param [in] damField Depends on the DAC and M fields.
+     * @brief Set the DAM (Destination Address Mode) compression.
+     * @param [in] damField Depends on the DAC and M fields.
      */
     void SetDam(HeaderCompression_e damField);
 
     /**
-     * \brief Get the DAM (Destination Address Mode) compression.
-     * \return Depends on the DAC and M fields.
+     * @brief Get the DAM (Destination Address Mode) compression.
+     * @return Depends on the DAC and M fields.
      */
     HeaderCompression_e GetDam() const;
 
     /**
      * brief Set the destination address inline part
-     * \param dstInlinePart The inline portion of the compressed destination address (16 bytes)
-     * \param size The number of inline bytes
+     * @param dstInlinePart The inline portion of the compressed destination address (16 bytes)
+     * @param size The number of inline bytes
      */
     void SetDstInlinePart(uint8_t dstInlinePart[16], uint8_t size);
 
     /**
      * brief Get the destination address inline part
-     * \return The inline portion of the compressed destination address (16 bytes)
+     * @return The inline portion of the compressed destination address (16 bytes)
      */
     const uint8_t* GetDstInlinePart() const;
 
     /**
-     * \brief Set the SrcContextId.
-     * \param [in] srcContextId Valid values are [0:15].
+     * @brief Set the SrcContextId.
+     * @param [in] srcContextId Valid values are [0:15].
      */
     void SetSrcContextId(uint8_t srcContextId);
 
     /**
-     * \brief Get the SrcContextId.
-     * \return The SrcContextId.
+     * @brief Get the SrcContextId.
+     * @return The SrcContextId.
      */
     uint8_t GetSrcContextId() const;
 
     /**
-     * \brief Set the DstContextId.
-     * \param [in] dstContextId Valid values are [0:15].
+     * @brief Set the DstContextId.
+     * @param [in] dstContextId Valid values are [0:15].
      */
     void SetDstContextId(uint8_t dstContextId);
 
     /**
-     * \brief Get the DstContextId.
-     * \return The DstContextId.
+     * @brief Get the DstContextId.
+     * @return The DstContextId.
      */
     uint8_t GetDstContextId() const;
 
     /**
-     * \brief Set the ECN (2bits).
-     * \param [in] ecn Valid values are [0:3].
+     * @brief Set the ECN (2bits).
+     * @param [in] ecn Valid values are [0:3].
      */
     void SetEcn(uint8_t ecn);
 
     /**
-     * \brief Get the ECN.
-     * \return The ECN.
+     * @brief Get the ECN.
+     * @return The ECN.
      */
     uint8_t GetEcn() const;
 
     /**
-     * \brief Set the DSCP (6bits).
-     * \param [in] dscp Valid values are [0:63].
+     * @brief Set the DSCP (6bits).
+     * @param [in] dscp Valid values are [0:63].
      */
     void SetDscp(uint8_t dscp);
 
     /**
-     * \brief Get the DSCP.
-     * \return The DSCP.
+     * @brief Get the DSCP.
+     * @return The DSCP.
      */
     uint8_t GetDscp() const;
 
     /**
-     * \brief Set the Flow Label (20bits).
-     * \param [in] flowLabel Valid values are 20 bits long.
+     * @brief Set the Flow Label (20bits).
+     * @param [in] flowLabel Valid values are 20 bits long.
      */
     void SetFlowLabel(uint32_t flowLabel);
 
     /**
-     * \brief Get the Flow Label.
-     * \return The Flow Label.
+     * @brief Get the Flow Label.
+     * @return The Flow Label.
      */
     uint32_t GetFlowLabel() const;
 
     /**
-     * \brief Set the Next Header field.
-     * \param [in] nextHeader Next Header field.
+     * @brief Set the Next Header field.
+     * @param [in] nextHeader Next Header field.
      */
     void SetNextHeader(uint8_t nextHeader);
 
     /**
-     * \brief Get the Next Header field.
-     * \return The Next Header field.
+     * @brief Get the Next Header field.
+     * @return The Next Header field.
      */
     uint8_t GetNextHeader() const;
 
     /**
-     * \brief Set the Hop Limit field.
-     * \param [in] hopLimit Hop Limit field.
+     * @brief Set the Hop Limit field.
+     * @param [in] hopLimit Hop Limit field.
      */
     void SetHopLimit(uint8_t hopLimit);
 
     /**
-     * \brief Get the Hop Limit field.
-     * \return The Hop Limit field.
+     * @brief Get the Hop Limit field.
+     * @return The Hop Limit field.
      */
     uint8_t GetHopLimit() const;
 
@@ -912,17 +912,17 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param [in] os The reference to the output stream.
- * \param [in] header The IPHC Header.
- * \returns The reference to the output stream.
+ * @param [in] os The reference to the output stream.
+ * @param [in] header The IPHC Header.
+ * @returns The reference to the output stream.
  */
 std::ostream& operator<<(std::ostream& os, const SixLowPanIphc& header);
 
 /**
-* \ingroup sixlowpan
-* \brief   LOWPAN_NHC Extension Header Encoding - see \RFC{6282}.
+* @ingroup sixlowpan
+* @brief   LOWPAN_NHC Extension Header Encoding - see \RFC{6282}.
   \verbatim
      0   1   2   3   4   5   6   7
    +---+---+---+---+---+---+---+---+
@@ -934,7 +934,7 @@
 {
   public:
     /**
-     *  \brief EID: IPv6 Extension Header ID.
+     *  @brief EID: IPv6 Extension Header ID.
      *
      *   EID: IPv6 Extension Header ID:
      *      0: IPv6 Hop-by-Hop Options Header [\RFC{2460}]
@@ -959,92 +959,92 @@
     SixLowPanNhcExtension();
 
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Return the instance type identifier.
-     * \return Instance type ID.
+     * @brief Return the instance type identifier.
+     * @return Instance type ID.
      */
     TypeId GetInstanceTypeId() const override;
 
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Get the serialized size of the packet.
-     * \return Size.
+     * @brief Get the serialized size of the packet.
+     * @return Size.
      */
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Serialize the packet.
-     * \param [in] start Buffer iterator.
+     * @brief Serialize the packet.
+     * @param [in] start Buffer iterator.
      */
     void Serialize(Buffer::Iterator start) const override;
 
     /**
-     * \brief Deserialize the packet.
-     * \param [in] start Buffer iterator.
-     * \return Size of the packet.
+     * @brief Deserialize the packet.
+     * @param [in] start Buffer iterator.
+     * @return Size of the packet.
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
 
     /**
-     * \brief Get the NhcDispatch type.
-     * \return The NhcDispatch type.
+     * @brief Get the NhcDispatch type.
+     * @return The NhcDispatch type.
      */
     virtual SixLowPanDispatch::NhcDispatch_e GetNhcDispatchType() const;
 
     /**
-     * \brief Set the Extension Header Type.
-     * \param [in] extensionHeaderType The Extension Header Type.
+     * @brief Set the Extension Header Type.
+     * @param [in] extensionHeaderType The Extension Header Type.
      */
     void SetEid(Eid_e extensionHeaderType);
 
     /**
-     * \brief Get the Extension Header Type.
-     * \return The Extension Header Type.
+     * @brief Get the Extension Header Type.
+     * @return The Extension Header Type.
      */
     Eid_e GetEid() const;
 
     /**
-     * \brief Set the Next Header field values.
-     * \param [in] nextHeader The Next Header field value.
+     * @brief Set the Next Header field values.
+     * @param [in] nextHeader The Next Header field value.
      */
     void SetNextHeader(uint8_t nextHeader);
 
     /**
-     * \brief Get the Next Header field value.
-     * \return The Next Header field value.
+     * @brief Get the Next Header field value.
+     * @return The Next Header field value.
      */
     uint8_t GetNextHeader() const;
 
     /**
-     * \brief Set the NH field values.
-     * \param [in] nhField The NH field value.
+     * @brief Set the NH field values.
+     * @param [in] nhField The NH field value.
      */
     void SetNh(bool nhField);
 
     /**
-     * \brief Get the Next Header field value.
-     * \return The NH field value.
+     * @brief Get the Next Header field value.
+     * @return The NH field value.
      */
     bool GetNh() const;
 
     /**
-     * \brief Set the option header data blob.
-     * \param [in] blob A buffer holding the blob data.
-     * \param [in] size The data blob size.
+     * @brief Set the option header data blob.
+     * @param [in] blob A buffer holding the blob data.
+     * @param [in] size The data blob size.
      */
     void SetBlob(const uint8_t* blob, uint32_t size);
 
     /**
-     * \brief Get the option header data blob.
-     * \param [in] blob A buffer to copy the blob data into.
-     * \param [in] size The size of the buffer.
-     * \return The length of the copied data.
+     * @brief Get the option header data blob.
+     * @param [in] blob A buffer to copy the blob data into.
+     * @param [in] size The size of the buffer.
+     * @return The length of the copied data.
      */
     uint32_t CopyBlob(uint8_t* blob, uint32_t size) const;
 
@@ -1056,17 +1056,17 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param [in] os The reference to the output stream.
- * \param [in] header The NHC Extension Header.
- * \returns The reference to the output stream.
+ * @param [in] os The reference to the output stream.
+ * @param [in] header The NHC Extension Header.
+ * @returns The reference to the output stream.
  */
 std::ostream& operator<<(std::ostream& os, const SixLowPanNhcExtension& header);
 
 /**
-* \ingroup sixlowpan
-* \brief   UDP LOWPAN_NHC Extension Header Encoding - see \RFC{6282}.
+* @ingroup sixlowpan
+* @brief   UDP LOWPAN_NHC Extension Header Encoding - see \RFC{6282}.
   \verbatim
      0   1   2   3   4   5   6   7
    +---+---+---+---+---+---+---+---+
@@ -1078,7 +1078,7 @@
 {
   public:
     /**
-     *  \brief Ports:
+     *  @brief Ports:
      *
      *  00: 16 bits for both Source Port and Destination Port
      *  01: 16 bits for Source Port. Last 8 bits for Destination Port
@@ -1096,101 +1096,101 @@
     SixLowPanUdpNhcExtension();
 
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Return the instance type identifier.
-     * \return Instance type ID.
+     * @brief Return the instance type identifier.
+     * @return Instance type ID.
      */
     TypeId GetInstanceTypeId() const override;
 
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Get the serialized size of the packet.
-     * \return Size.
+     * @brief Get the serialized size of the packet.
+     * @return Size.
      */
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Serialize the packet.
-     * \param [in] start Buffer iterator.
+     * @brief Serialize the packet.
+     * @param [in] start Buffer iterator.
      */
     void Serialize(Buffer::Iterator start) const override;
 
     /**
-     * \brief Deserialize the packet.
-     * \param [in] start Buffer iterator.
-     * \return Size of the packet.
+     * @brief Deserialize the packet.
+     * @param [in] start Buffer iterator.
+     * @return Size of the packet.
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
 
     /**
-     * \brief Get the NhcDispatch type.
-     * \return The NhcDispatch type.
+     * @brief Get the NhcDispatch type.
+     * @return The NhcDispatch type.
      */
     virtual SixLowPanDispatch::NhcDispatch_e GetNhcDispatchType() const;
 
     /**
-     * \brief Set the compressed Src and Dst Ports.
-     * \param [in] port Src and Dst Ports.
+     * @brief Set the compressed Src and Dst Ports.
+     * @param [in] port Src and Dst Ports.
      */
     void SetPorts(Ports_e port);
 
     /**
-     * \brief Get the compressed Src and Dst Ports.
-     * \return The Src and Dst Ports.
+     * @brief Get the compressed Src and Dst Ports.
+     * @return The Src and Dst Ports.
      */
     Ports_e GetPorts() const;
 
     /**
-     * \brief Set the Source Port.
-     * \param [in] port The Source Port.
+     * @brief Set the Source Port.
+     * @param [in] port The Source Port.
      */
     void SetSrcPort(uint16_t port);
 
     /**
-     * \brief Get the Source Port.
-     * \return The Source Port.
+     * @brief Get the Source Port.
+     * @return The Source Port.
      */
     uint16_t GetSrcPort() const;
 
     /**
-     * \brief Set the Destination Port.
-     * \param [in] port The Destination Port.
+     * @brief Set the Destination Port.
+     * @param [in] port The Destination Port.
      */
     void SetDstPort(uint16_t port);
 
     /**
-     * \brief Get the Destination Port.
-     * \return The Destination Port.
+     * @brief Get the Destination Port.
+     * @return The Destination Port.
      */
     uint16_t GetDstPort() const;
 
     /**
-     * \brief Set the C (Checksum).
-     * \param [in] cField False (All checksum carried in-line), true (Checksum elided).
+     * @brief Set the C (Checksum).
+     * @param [in] cField False (All checksum carried in-line), true (Checksum elided).
      */
     void SetC(bool cField);
 
     /**
-     * \brief Get the C (Checksum).
-     * \return False (All checksum carried in-line), true (Checksum elided).
+     * @brief Get the C (Checksum).
+     * @return False (All checksum carried in-line), true (Checksum elided).
      */
     bool GetC() const;
 
     /**
-     * \brief Set the Checksum field values.
-     * \param [in] checksum The Checksum field value.
+     * @brief Set the Checksum field values.
+     * @param [in] checksum The Checksum field value.
      */
     void SetChecksum(uint16_t checksum);
 
     /**
-     * \brief Get the Checksum field value.
-     * \return The Checksum field value.
+     * @brief Get the Checksum field value.
+     * @return The Checksum field value.
      */
     uint16_t GetChecksum() const;
 
@@ -1202,17 +1202,17 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param [in] os The reference to the output stream.
- * \param [in] header The UDP NHC Extension Header.
- * \returns The reference to the output stream.
+ * @param [in] os The reference to the output stream.
+ * @param [in] header The UDP NHC Extension Header.
+ * @returns The reference to the output stream.
  */
 std::ostream& operator<<(std::ostream& os, const SixLowPanUdpNhcExtension& header);
 
 /**
- * \ingroup sixlowpan
- * \brief 6LoWPAN BC0 header - see \RFC{4944}.
+ * @ingroup sixlowpan
+ * @brief 6LoWPAN BC0 header - see \RFC{4944}.
  */
 class SixLowPanBc0 : public Header
 {
@@ -1220,47 +1220,47 @@
     SixLowPanBc0();
 
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Return the instance type identifier.
-     * \return Instance type ID.
+     * @brief Return the instance type identifier.
+     * @return Instance type ID.
      */
     TypeId GetInstanceTypeId() const override;
 
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Get the serialized size of the packet.
-     * \return Size.
+     * @brief Get the serialized size of the packet.
+     * @return Size.
      */
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Serialize the packet.
-     * \param [in] start Buffer iterator.
+     * @brief Serialize the packet.
+     * @param [in] start Buffer iterator.
      */
     void Serialize(Buffer::Iterator start) const override;
 
     /**
-     * \brief Deserialize the packet.
-     * \param [in] start Buffer iterator.
-     * \return Size of the packet.
+     * @brief Deserialize the packet.
+     * @param [in] start Buffer iterator.
+     * @return Size of the packet.
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
 
     /**
-     * \brief Set the "Sequence Number" field.
-     * \param [in] seqNumber The sequence number value.
+     * @brief Set the "Sequence Number" field.
+     * @param [in] seqNumber The sequence number value.
      */
     void SetSequenceNumber(uint8_t seqNumber);
 
     /**
-     * \brief Get the "Sequence Number" field.
-     * \return The sequence number value.
+     * @brief Get the "Sequence Number" field.
+     * @return The sequence number value.
      */
     uint8_t GetSequenceNumber() const;
 
@@ -1269,17 +1269,17 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param [in] os The reference to the output stream.
- * \param [in] header The BC0 Extension Header.
- * \returns The reference to the output stream.
+ * @param [in] os The reference to the output stream.
+ * @param [in] header The BC0 Extension Header.
+ * @returns The reference to the output stream.
  */
 std::ostream& operator<<(std::ostream& os, const SixLowPanBc0& header);
 
 /**
- * \ingroup sixlowpan
- * \brief 6LoWPAN Mesh header - see \RFC{4944}.
+ * @ingroup sixlowpan
+ * @brief 6LoWPAN Mesh header - see \RFC{4944}.
  */
 class SixLowPanMesh : public Header
 {
@@ -1287,71 +1287,71 @@
     SixLowPanMesh();
 
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Return the instance type identifier.
-     * \return Instance type ID.
+     * @brief Return the instance type identifier.
+     * @return Instance type ID.
      */
     TypeId GetInstanceTypeId() const override;
 
     void Print(std::ostream& os) const override;
 
     /**
-     * \brief Get the serialized size of the packet.
-     * \return Size.
+     * @brief Get the serialized size of the packet.
+     * @return Size.
      */
     uint32_t GetSerializedSize() const override;
 
     /**
-     * \brief Serialize the packet.
-     * \param [in] start Buffer iterator.
+     * @brief Serialize the packet.
+     * @param [in] start Buffer iterator.
      */
     void Serialize(Buffer::Iterator start) const override;
 
     /**
-     * \brief Deserialize the packet.
-     * \param [in] start Buffer iterator.
-     * \return Size of the packet.
+     * @brief Deserialize the packet.
+     * @param [in] start Buffer iterator.
+     * @return Size of the packet.
      */
     uint32_t Deserialize(Buffer::Iterator start) override;
 
     /**
-     * \brief Set the "Hops Left" field.
-     * \param [in] hopsLeft The number of hops left.
+     * @brief Set the "Hops Left" field.
+     * @param [in] hopsLeft The number of hops left.
      */
     void SetHopsLeft(uint8_t hopsLeft);
 
     /**
-     * \brief Get the "Hops Left" field.
-     * \return The number of hops left.
+     * @brief Get the "Hops Left" field.
+     * @return The number of hops left.
      */
     uint8_t GetHopsLeft() const;
 
     /**
-     * \brief Set the "Originator" address.
-     * \param [in] originator The Originator address (Mac64Address or Mac16Address).
+     * @brief Set the "Originator" address.
+     * @param [in] originator The Originator address (Mac64Address or Mac16Address).
      */
     void SetOriginator(Address originator);
 
     /**
-     * \brief Get the "Originator" address.
-     * \return The Originator address (Mac64Address or Mac16Address).
+     * @brief Get the "Originator" address.
+     * @return The Originator address (Mac64Address or Mac16Address).
      */
     Address GetOriginator() const;
 
     /**
-     * \brief Set the "Final Destination" address.
-     * \param [in] finalDst The Final Destination address (Mac64Address or Mac16Address).
+     * @brief Set the "Final Destination" address.
+     * @param [in] finalDst The Final Destination address (Mac64Address or Mac16Address).
      */
     void SetFinalDst(Address finalDst);
 
     /**
-     * \brief Get the "Final Destination" address.
-     * \return The Final Destination address (Mac64Address or Mac16Address).
+     * @brief Get the "Final Destination" address.
+     * @return The Final Destination address (Mac64Address or Mac16Address).
      */
     Address GetFinalDst() const;
 
@@ -1364,11 +1364,11 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param [in] os The reference to the output stream.
- * \param [in] header The Mesh Extension Header.
- * \returns The reference to the output stream.
+ * @param [in] os The reference to the output stream.
+ * @param [in] header The Mesh Extension Header.
+ * @returns The reference to the output stream.
  */
 std::ostream& operator<<(std::ostream& os, const SixLowPanMesh& header);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/sixlowpan/model/sixlowpan-net-device.cc ns-3.44/src/sixlowpan/model/sixlowpan-net-device.cc
--- ns-3.43/src/sixlowpan/model/sixlowpan-net-device.cc	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/sixlowpan/model/sixlowpan-net-device.cc	2025-03-09 16:55:49.687372200 -0700
@@ -282,7 +282,7 @@
                 Ptr<Packet> sendPkt = copyPkt->Copy();
                 sendPkt->AddHeader(bc0Hdr);
                 sendPkt->AddHeader(meshHdr);
-                Simulator::Schedule(Time(MilliSeconds(m_meshUnderJitter->GetValue())),
+                Simulator::Schedule(MilliSeconds(m_meshUnderJitter->GetValue()),
                                     &NetDevice::Send,
                                     m_netDevice,
                                     sendPkt,
@@ -2732,7 +2732,7 @@
         return;
     }
 
-    if (validLifetime == Time(0))
+    if (validLifetime.IsZero())
     {
         NS_LOG_LOGIC("Context (" << +contextId << "), removed (validity time is zero)");
         m_contextTable.erase(contextId);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/sixlowpan/model/sixlowpan-net-device.h ns-3.44/src/sixlowpan/model/sixlowpan-net-device.h
--- ns-3.43/src/sixlowpan/model/sixlowpan-net-device.h	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/sixlowpan/model/sixlowpan-net-device.h	2025-03-09 16:55:49.687372200 -0700
@@ -29,8 +29,8 @@
 class EventId;
 
 /**
- * \defgroup sixlowpan 6LoWPAN
- * \brief Performs 6LoWPAN compression of IPv6 packets as specified by \RFC{4944} and \RFC{6282}
+ * @defgroup sixlowpan 6LoWPAN
+ * @brief Performs 6LoWPAN compression of IPv6 packets as specified by \RFC{4944} and \RFC{6282}
  *
  * This module acts as a shim between IPv6 and a generic NetDevice.
  *
@@ -43,15 +43,15 @@
  */
 
 /**
- * \ingroup sixlowpan
- * \ingroup tests
- * \defgroup sixlowpan-tests 6LoWPAN module tests
+ * @ingroup sixlowpan
+ * @ingroup tests
+ * @defgroup sixlowpan-tests 6LoWPAN module tests
  */
 
 /**
- * \ingroup sixlowpan
+ * @ingroup sixlowpan
  *
- * \brief Shim performing 6LoWPAN compression, decompression and fragmentation.
+ * @brief Shim performing 6LoWPAN compression, decompression and fragmentation.
  *
  * This class implements the shim between IPv6 and a generic NetDevice,
  * performing packet compression, decompression and fragmentation in a transparent way.
@@ -75,13 +75,13 @@
     };
 
     /**
-     * \brief The protocol number for 6LoWPAN (0xA0ED) - see \RFC{7973}.
+     * @brief The protocol number for 6LoWPAN (0xA0ED) - see \RFC{7973}.
      */
     static constexpr uint16_t PROT_NUMBER{0xA0ED};
 
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
@@ -103,11 +103,11 @@
     bool SetMtu(const uint16_t mtu) override;
 
     /**
-     * \brief Returns the link-layer MTU for this interface.
+     * @brief Returns the link-layer MTU for this interface.
      * If the link-layer MTU is smaller than IPv6's minimum MTU (\RFC{4944}),
      * 1280 will be returned.
      *
-     * \return The link-level MTU in bytes for this interface.
+     * @return The link-level MTU in bytes for this interface.
      */
     uint16_t GetMtu() const override;
     bool IsLinkUp() const override;
@@ -132,18 +132,18 @@
     Address GetMulticast(Ipv6Address addr) const override;
 
     /**
-     * \brief Returns a smart pointer to the underlying NetDevice.
+     * @brief Returns a smart pointer to the underlying NetDevice.
      *
-     * \return A smart pointer to the underlying NetDevice.
+     * @return A smart pointer to the underlying NetDevice.
      */
     Ptr<NetDevice> GetNetDevice() const;
 
     /**
-     * \brief Setup SixLowPan to be a proxy for the specified NetDevice.
+     * @brief Setup SixLowPan to be a proxy for the specified NetDevice.
      * All the packets incoming and outgoing from the NetDevice will be
      * processed by SixLowPanNetDevice.
      *
-     * \param [in] device A smart pointer to the NetDevice to be proxied.
+     * @param [in] device A smart pointer to the NetDevice to be proxied.
      */
     void SetNetDevice(Ptr<NetDevice> device);
 
@@ -152,18 +152,18 @@
      * used by this model.  Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param [in] stream First stream index to use.
-     * \return the number of stream indices assigned by this model.
+     * @param [in] stream First stream index to use.
+     * @return the number of stream indices assigned by this model.
      */
     int64_t AssignStreams(int64_t stream);
 
     /**
      * TracedCallback signature for packet send/receive events.
      *
-     * \param [in] packet The packet.
-     * \param [in] sixNetDevice The SixLowPanNetDevice.
-     * \param [in] ifindex The ifindex of the device.
-     * \deprecated The non-const \c Ptr<SixLowPanNetDevice> argument
+     * @param [in] packet The packet.
+     * @param [in] sixNetDevice The SixLowPanNetDevice.
+     * @param [in] ifindex The ifindex of the device.
+     * @deprecated The non-const \c Ptr<SixLowPanNetDevice> argument
      * is deprecated and will be changed to \c Ptr<const SixLowPanNetDevice>
      * in a future release.
      */
@@ -175,11 +175,11 @@
     /**
      * TracedCallback signature for packet drop events
      *
-     * \param [in] reason The reason for the drop.
-     * \param [in] packet The packet.
-     * \param [in] sixNetDevice The SixLowPanNetDevice.
-     * \param [in] ifindex The ifindex of the device.
-     * \deprecated The non-const \c Ptr<SixLowPanNetDevice> argument
+     * @param [in] reason The reason for the drop.
+     * @param [in] packet The packet.
+     * @param [in] sixNetDevice The SixLowPanNetDevice.
+     * @param [in] ifindex The ifindex of the device.
+     * @deprecated The non-const \c Ptr<SixLowPanNetDevice> argument
      * is deprecated and will be changed to \c Ptr<const SixLowPanNetDevice>
      * in a future release.
      */
@@ -194,11 +194,11 @@
      *
      * A context with a zero validLifetime will be immediately removed.
      *
-     * \param [in] contextId context id (most be between 0 and 15 included).
-     * \param [in] contextPrefix context prefix to be used in compression/decompression.
-     * \param [in] compressionAllowed compression and decompression allowed (true), decompression
+     * @param [in] contextId context id (most be between 0 and 15 included).
+     * @param [in] contextPrefix context prefix to be used in compression/decompression.
+     * @param [in] compressionAllowed compression and decompression allowed (true), decompression
      * only (false).
-     * \param [in] validLifetime validity time (relative to the actual time).
+     * @param [in] validLifetime validity time (relative to the actual time).
      *
      */
     void AddContext(uint8_t contextId,
@@ -209,13 +209,13 @@
     /**
      * Get a context used in IPHC stateful compression.
      *
-     * \param [in] contextId context id (most be between 0 and 15 included).
-     * \param [out] contextPrefix context prefix to be used in compression/decompression.
-     * \param [out] compressionAllowed compression and decompression allowed (true), decompression
+     * @param [in] contextId context id (most be between 0 and 15 included).
+     * @param [out] contextPrefix context prefix to be used in compression/decompression.
+     * @param [out] compressionAllowed compression and decompression allowed (true), decompression
      * only (false).
-     * \param [out] validLifetime validity time (relative to the actual time).
+     * @param [out] validLifetime validity time (relative to the actual time).
      *
-     * \return false if the context has not been found.
+     * @return false if the context has not been found.
      *
      */
     bool GetContext(uint8_t contextId,
@@ -228,8 +228,8 @@
      *
      * The context will have its lifetime extended and its validity for compression re-enabled.
      *
-     * \param [in] contextId context id (most be between 0 and 15 included).
-     * \param [in] validLifetime validity time (relative to the actual time).
+     * @param [in] contextId context id (most be between 0 and 15 included).
+     * @param [in] validLifetime validity time (relative to the actual time).
      */
     void RenewContext(uint8_t contextId, Time validLifetime);
 
@@ -238,14 +238,14 @@
      *
      * An invalid context will not be used for compression but it will be used for decompression.
      *
-     * \param [in] contextId context id (most be between 0 and 15 included).
+     * @param [in] contextId context id (most be between 0 and 15 included).
      */
     void InvalidateContext(uint8_t contextId);
 
     /**
      * Remove a context used in IPHC stateful compression.
      *
-     * \param [in] contextId context id (most be between 0 and 15 included).
+     * @param [in] contextId context id (most be between 0 and 15 included).
      */
     void RemoveContext(uint8_t contextId);
 
@@ -254,13 +254,13 @@
 
   private:
     /**
-     * \brief Receives all the packets from a NetDevice for further processing.
-     * \param [in] device The NetDevice the packet ws received from.
-     * \param [in] packet The received packet.
-     * \param [in] protocol The protocol (if known).
-     * \param [in] source The source address.
-     * \param [in] destination The destination address.
-     * \param [in] packetType The packet kind (e.g., HOST, BROADCAST, etc.).
+     * @brief Receives all the packets from a NetDevice for further processing.
+     * @param [in] device The NetDevice the packet ws received from.
+     * @param [in] packet The received packet.
+     * @param [in] protocol The protocol (if known).
+     * @param [in] source The source address.
+     * @param [in] destination The destination address.
+     * @param [in] packetType The packet kind (e.g., HOST, BROADCAST, etc.).
      */
     void ReceiveFromDevice(Ptr<NetDevice> device,
                            Ptr<const Packet> packet,
@@ -270,18 +270,18 @@
                            PacketType packetType);
 
     /**
-     * \param [in] packet Packet sent from above down to Network Device.
-     * \param [in] source Source mac address (only used if doSendFrom is true, i.e., "MAC
+     * @param [in] packet Packet sent from above down to Network Device.
+     * @param [in] source Source mac address (only used if doSendFrom is true, i.e., "MAC
      * spoofing").
-     * \param [in] dest Mac address of the destination (already resolved).
-     * \param [in] protocolNumber Identifies the type of payload contained in this packet. Used to
+     * @param [in] dest Mac address of the destination (already resolved).
+     * @param [in] protocolNumber Identifies the type of payload contained in this packet. Used to
      * call the right L3Protocol when the packet is received.
-     * \param [in] doSendFrom Perform a SendFrom instead of a Send.
+     * @param [in] doSendFrom Perform a SendFrom instead of a Send.
      *
      *  Called from higher layer to send packet into Network Device
      *  with the specified source and destination Addresses.
      *
-     * \return Whether the Send operation succeeded.
+     * @return Whether the Send operation succeeded.
      */
     bool DoSend(Ptr<Packet> packet,
                 const Address& source,
@@ -301,13 +301,13 @@
     NetDevice::PromiscReceiveCallback m_promiscRxCallback;
 
     /**
-     * \brief Callback to trace TX (transmission) packets.
+     * @brief Callback to trace TX (transmission) packets.
      *
      * Data passed:
      * \li Packet received (including 6LoWPAN header)
      * \li Ptr to SixLowPanNetDevice
      * \li interface index
-     * \deprecated The non-const \c Ptr<SixLowPanNetDevice> argument
+     * @deprecated The non-const \c Ptr<SixLowPanNetDevice> argument
      * is deprecated and will be changed to \c Ptr<const SixLowPanNetDevice>
      * in a future release.
      */
@@ -315,13 +315,13 @@
     TracedCallback<Ptr<const Packet>, Ptr<SixLowPanNetDevice>, uint32_t> m_txTrace;
 
     /**
-     * \brief Callback to trace RX (reception) packets.
+     * @brief Callback to trace RX (reception) packets.
      *
      * Data passed:
      * \li Packet received (including 6LoWPAN header)
      * \li Ptr to SixLowPanNetDevice
      * \li interface index
-     * \deprecated The non-const \c Ptr<SixLowPanNetDevice> argument
+     * @deprecated The non-const \c Ptr<SixLowPanNetDevice> argument
      * is deprecated and will be changed to \c Ptr<const SixLowPanNetDevice>
      * in a future release.
      */
@@ -329,14 +329,14 @@
     TracedCallback<Ptr<const Packet>, Ptr<SixLowPanNetDevice>, uint32_t> m_rxTrace;
 
     /**
-     * \brief Callback to trace drop packets.
+     * @brief Callback to trace drop packets.
      *
      * Data passed:
      * \li DropReason
      * \li Packet dropped (including 6LoWPAN header)
      * \li Ptr to SixLowPanNetDevice
      * \li interface index
-     * \deprecated The non-const \c Ptr<SixLowPanNetDevice> argument
+     * @deprecated The non-const \c Ptr<SixLowPanNetDevice> argument
      * is deprecated and will be changed to \c Ptr<const SixLowPanNetDevice>
      * in a future release.
      */
@@ -344,54 +344,54 @@
     TracedCallback<DropReason, Ptr<const Packet>, Ptr<SixLowPanNetDevice>, uint32_t> m_dropTrace;
 
     /**
-     * \brief Compress the headers according to HC1 compression.
-     * \param [in] packet The packet to be compressed.
-     * \param [in] src The MAC source address.
-     * \param [in] dst The MAC destination address.
-     * \return The size of the removed headers.
+     * @brief Compress the headers according to HC1 compression.
+     * @param [in] packet The packet to be compressed.
+     * @param [in] src The MAC source address.
+     * @param [in] dst The MAC destination address.
+     * @return The size of the removed headers.
      */
     uint32_t CompressLowPanHc1(Ptr<Packet> packet, const Address& src, const Address& dst);
 
     /**
-     * \brief Decompress the headers according to HC1 compression.
-     * \param [in] packet the packet to be compressed.
-     * \param [in] src the MAC source address.
-     * \param [in] dst the MAC destination address.
+     * @brief Decompress the headers according to HC1 compression.
+     * @param [in] packet the packet to be compressed.
+     * @param [in] src the MAC source address.
+     * @param [in] dst the MAC destination address.
      */
     void DecompressLowPanHc1(Ptr<Packet> packet, const Address& src, const Address& dst);
 
     /**
-     * \brief Compress the headers according to IPHC compression.
-     * \param [in] packet The packet to be compressed.
-     * \param [in] src The MAC source address.
-     * \param [in] dst The MAC destination address.
-     * \return The size of the removed headers.
+     * @brief Compress the headers according to IPHC compression.
+     * @param [in] packet The packet to be compressed.
+     * @param [in] src The MAC source address.
+     * @param [in] dst The MAC destination address.
+     * @return The size of the removed headers.
      */
     uint32_t CompressLowPanIphc(Ptr<Packet> packet, const Address& src, const Address& dst);
 
     /**
-     * \brief Checks if the next header can be compressed using NHC.
-     * \param [in] headerType The header kind to be compressed.
-     * \return True if the header can be compressed.
+     * @brief Checks if the next header can be compressed using NHC.
+     * @param [in] headerType The header kind to be compressed.
+     * @return True if the header can be compressed.
      */
     bool CanCompressLowPanNhc(uint8_t headerType);
 
     /**
-     * \brief Decompress the headers according to IPHC compression.
-     * \param [in] packet The packet to be compressed.
-     * \param [in] src The MAC source address.
-     * \param [in] dst The MAC destination address.
-     * \return true if the packet can not be decompressed due to wrong context information.
+     * @brief Decompress the headers according to IPHC compression.
+     * @param [in] packet The packet to be compressed.
+     * @param [in] src The MAC source address.
+     * @param [in] dst The MAC destination address.
+     * @return true if the packet can not be decompressed due to wrong context information.
      */
     bool DecompressLowPanIphc(Ptr<Packet> packet, const Address& src, const Address& dst);
 
     /**
-     * \brief Compress the headers according to NHC compression.
-     * \param [in] packet The packet to be compressed.
-     * \param [in] headerType The header type.
-     * \param [in] src The MAC source address.
-     * \param [in] dst The MAC destination address.
-     * \return The size of the removed headers.
+     * @brief Compress the headers according to NHC compression.
+     * @param [in] packet The packet to be compressed.
+     * @param [in] headerType The header type.
+     * @param [in] src The MAC source address.
+     * @param [in] dst The MAC destination address.
+     * @return The size of the removed headers.
      */
     uint32_t CompressLowPanNhc(Ptr<Packet> packet,
                                uint8_t headerType,
@@ -399,13 +399,13 @@
                                const Address& dst);
 
     /**
-     * \brief Decompress the headers according to NHC compression.
-     * \param [in] packet The packet to be compressed.
-     * \param [in] src The MAC source address.
-     * \param [in] dst The MAC destination address.
-     * \param [in] srcAddress The IPv6 source address.
-     * \param [in] dstAddress The IPv6 destination address.
-     * \return A std::pair containing the decompressed header type and a flag - true if the packet
+     * @brief Decompress the headers according to NHC compression.
+     * @param [in] packet The packet to be compressed.
+     * @param [in] src The MAC source address.
+     * @param [in] dst The MAC destination address.
+     * @param [in] srcAddress The IPv6 source address.
+     * @param [in] dstAddress The IPv6 destination address.
+     * @return A std::pair containing the decompressed header type and a flag - true if the packet
      * can not be decompressed due to wrong context information.
      */
     std::pair<uint8_t, bool> DecompressLowPanNhc(Ptr<Packet> packet,
@@ -415,18 +415,18 @@
                                                  Ipv6Address dstAddress);
 
     /**
-     * \brief Compress the headers according to NHC compression.
-     * \param [in] packet The packet to be compressed.
-     * \param [in] omitChecksum Omit UDP checksum (if true).
-     * \return The size of the removed headers.
+     * @brief Compress the headers according to NHC compression.
+     * @param [in] packet The packet to be compressed.
+     * @param [in] omitChecksum Omit UDP checksum (if true).
+     * @return The size of the removed headers.
      */
     uint32_t CompressLowPanUdpNhc(Ptr<Packet> packet, bool omitChecksum);
 
     /**
-     * \brief Decompress the headers according to NHC compression.
-     * \param [in] packet The packet to be compressed.
-     * \param [in] saddr The IPv6 source address.
-     * \param [in] daddr The IPv6 destination address.
+     * @brief Decompress the headers according to NHC compression.
+     * @param [in] packet The packet to be compressed.
+     * @param [in] saddr The IPv6 source address.
+     * @param [in] daddr The IPv6 destination address.
      */
     void DecompressLowPanUdpNhc(Ptr<Packet> packet, Ipv6Address saddr, Ipv6Address daddr);
 
@@ -441,15 +441,15 @@
     typedef std::list<std::tuple<Time, FragmentKey_t, uint32_t>>::iterator FragmentsTimeoutsListI_t;
 
     /**
-     * \brief Set a new timeout "event" for a fragmented packet
-     * \param key the fragment identification
-     * \param iif input interface of the packet
-     * \return an iterator to the inserted "event"
+     * @brief Set a new timeout "event" for a fragmented packet
+     * @param key the fragment identification
+     * @param iif input interface of the packet
+     * @return an iterator to the inserted "event"
      */
     FragmentsTimeoutsListI_t SetTimeout(FragmentKey_t key, uint32_t iif);
 
     /**
-     * \brief Handles a fragmented packet timeout
+     * @brief Handles a fragmented packet timeout
      */
     void HandleTimeout();
 
@@ -458,103 +458,103 @@
     EventId m_timeoutEvent; //!< Event for the next scheduled timeout
 
     /**
-     * \brief A Set of Fragments.
+     * @brief A Set of Fragments.
      */
     class Fragments : public SimpleRefCount<Fragments>
     {
       public:
         /**
-         * \brief Constructor.
+         * @brief Constructor.
          */
         Fragments();
 
         /**
-         * \brief Destructor.
+         * @brief Destructor.
          */
         ~Fragments();
 
         /**
-         * \brief Add a fragment to the pool.
-         * \param [in] fragment the fragment.
-         * \param [in] fragmentOffset the offset of the fragment.
+         * @brief Add a fragment to the pool.
+         * @param [in] fragment the fragment.
+         * @param [in] fragmentOffset the offset of the fragment.
          */
         void AddFragment(Ptr<Packet> fragment, uint16_t fragmentOffset);
 
         /**
-         * \brief Add the first packet fragment. The first fragment is needed to
+         * @brief Add the first packet fragment. The first fragment is needed to
          * allow the post-defragmentation decompression.
-         * \param [in] fragment The fragment.
+         * @param [in] fragment The fragment.
          */
         void AddFirstFragment(Ptr<Packet> fragment);
 
         /**
-         * \brief If all fragments have been added.
-         * \returns True if the packet is entire.
+         * @brief If all fragments have been added.
+         * @returns True if the packet is entire.
          */
         bool IsEntire() const;
 
         /**
-         * \brief Get the entire packet.
-         * \return The entire packet.
+         * @brief Get the entire packet.
+         * @return The entire packet.
          */
         Ptr<Packet> GetPacket() const;
 
         /**
-         * \brief Set the packet-to-be-defragmented size.
-         * \param [in] packetSize The packet size (bytes).
+         * @brief Set the packet-to-be-defragmented size.
+         * @param [in] packetSize The packet size (bytes).
          */
         void SetPacketSize(uint32_t packetSize);
 
         /**
-         * \brief Get a list of the current stored fragments.
-         * \returns The current stored fragments.
+         * @brief Get a list of the current stored fragments.
+         * @returns The current stored fragments.
          */
         std::list<Ptr<Packet>> GetFragments() const;
 
         /**
-         * \brief Set the Timeout iterator.
-         * \param iter The iterator.
+         * @brief Set the Timeout iterator.
+         * @param iter The iterator.
          */
         void SetTimeoutIter(FragmentsTimeoutsListI_t iter);
 
         /**
-         * \brief Get the Timeout iterator.
-         * \returns The iterator.
+         * @brief Get the Timeout iterator.
+         * @returns The iterator.
          */
         FragmentsTimeoutsListI_t GetTimeoutIter();
 
       private:
         /**
-         * \brief The size of the reconstructed packet (bytes).
+         * @brief The size of the reconstructed packet (bytes).
          */
         uint32_t m_packetSize;
 
         /**
-         * \brief The current fragments.
+         * @brief The current fragments.
          */
         std::list<std::pair<Ptr<Packet>, uint16_t>> m_fragments;
 
         /**
-         * \brief The very first fragment.
+         * @brief The very first fragment.
          */
         Ptr<Packet> m_firstFragment;
 
         /**
-         * \brief Timeout iterator to "event" handler
+         * @brief Timeout iterator to "event" handler
          */
         FragmentsTimeoutsListI_t m_timeoutIter;
     };
 
     /**
-     * \brief Performs a packet fragmentation.
-     * \param [in] packet the packet to be fragmented (with headers already compressed with
+     * @brief Performs a packet fragmentation.
+     * @param [in] packet the packet to be fragmented (with headers already compressed with
      * 6LoWPAN).
-     * \param [in] origPacketSize the size of the IP packet before the 6LoWPAN header compression,
+     * @param [in] origPacketSize the size of the IP packet before the 6LoWPAN header compression,
      * including the IP/L4 headers.
-     * \param [in] origHdrSize the size of the IP header before the 6LoWPAN header compression.
-     * \param [in] extraHdrSize the sum of the sizes of BC0 header and MESH header if mesh routing
+     * @param [in] origHdrSize the size of the IP header before the 6LoWPAN header compression.
+     * @param [in] extraHdrSize the sum of the sizes of BC0 header and MESH header if mesh routing
      * is used or 0.
-     * \param [out] listFragments A reference to the list of the resulting packets, all with the
+     * @param [out] listFragments A reference to the list of the resulting packets, all with the
      * proper headers in place.
      */
     void DoFragmentation(Ptr<Packet> packet,
@@ -564,31 +564,31 @@
                          std::list<Ptr<Packet>>& listFragments);
 
     /**
-     * \brief Process a packet fragment.
-     * \param [in] packet The packet.
-     * \param [in] src The source MAC address.
-     * \param [in] dst The destination MAC address.
-     * \param [in] isFirst True if it is the first fragment, false otherwise.
-     * \return True is the fragment completed the packet.
+     * @brief Process a packet fragment.
+     * @param [in] packet The packet.
+     * @param [in] src The source MAC address.
+     * @param [in] dst The destination MAC address.
+     * @param [in] isFirst True if it is the first fragment, false otherwise.
+     * @return True is the fragment completed the packet.
      */
     bool ProcessFragment(Ptr<Packet>& packet, const Address& src, const Address& dst, bool isFirst);
 
     /**
-     * \brief Process the timeout for packet fragments.
-     * \param [in] key A key representing the packet fragments.
-     * \param [in] iif Input Interface.
+     * @brief Process the timeout for packet fragments.
+     * @param [in] key A key representing the packet fragments.
+     * @param [in] iif Input Interface.
      */
     void HandleFragmentsTimeout(FragmentKey_t key, uint32_t iif);
 
     /**
-     * \brief Drops the oldest fragment set.
+     * @brief Drops the oldest fragment set.
      */
     void DropOldestFragmentSet();
 
     /**
      * Get a Mac16 from its Mac48 pseudo-MAC
-     * \param addr the PseudoMac address
-     * \return the Mac16Address
+     * @param addr the PseudoMac address
+     * @return the Mac16Address
      */
     Address Get16MacFrom48Mac(Address addr);
 
@@ -605,7 +605,7 @@
     Time m_fragmentExpirationTimeout; //!< Time limit for fragment rebuilding.
 
     /**
-     * \brief How many packets can be rebuilt at the same time.
+     * @brief How many packets can be rebuilt at the same time.
      * Some real implementation do limit this. Zero means no limit.
      */
     uint16_t m_fragmentReassemblyListSize;
@@ -646,32 +646,32 @@
         m_contextTable; //!< Table of the contexts used in compression/decompression
 
     /**
-     * \brief Finds if the given unicast address matches a context for compression
+     * @brief Finds if the given unicast address matches a context for compression
      *
      * \param[in] address the address to check
      * \param[out] contextId the context found
-     * \return true if a valid context has been found
+     * @return true if a valid context has been found
      */
     bool FindUnicastCompressionContext(Ipv6Address address, uint8_t& contextId);
 
     /**
-     * \brief Finds if the given multicast address matches a context for compression
+     * @brief Finds if the given multicast address matches a context for compression
      *
      * \param[in] address the address to check
      * \param[out] contextId the context found
-     * \return true if a valid context has been found
+     * @return true if a valid context has been found
      */
     bool FindMulticastCompressionContext(Ipv6Address address, uint8_t& contextId);
 
     /**
-     * \brief Clean an address from its prefix.
+     * @brief Clean an address from its prefix.
      *
      * This function is used to find the relevant bits to be sent in stateful IPHC compression.
      * Only the prefix length is used - the address prefix is assumed to be matching the prefix.
      *
-     * \param address the address to be cleaned
-     * \param prefix the prefix to remove
-     * \return An address with the prefix zeroed.
+     * @param address the address to be cleaned
+     * @param prefix the prefix to remove
+     * @return An address with the prefix zeroed.
      */
     Ipv6Address CleanPrefix(Ipv6Address address, Ipv6Prefix prefix);
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/sixlowpan/test/mock-net-device.h ns-3.44/src/sixlowpan/test/mock-net-device.h
--- ns-3.43/src/sixlowpan/test/mock-net-device.h	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/sixlowpan/test/mock-net-device.h	2025-03-09 16:55:49.687372200 -0700
@@ -20,7 +20,7 @@
 class Node;
 
 /**
- * \ingroup netdevice
+ * @ingroup netdevice
  *
  * This device assumes 48-bit mac addressing; there is also the possibility to
  * add an ErrorModel if you want to force losses on the device.
@@ -31,14 +31,14 @@
  *
  * By default the device is in Broadcast mode, with infinite bandwidth.
  *
- * \brief simple net device for simple things and testing
+ * @brief simple net device for simple things and testing
  */
 class MockNetDevice : public NetDevice
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     MockNetDevice();
@@ -49,11 +49,11 @@
      * Note that no analysis is performed on the addresses, and the
      * packet is forwarded to the callbacks according to the packetType.
      *
-     * \param packet Packet received on the channel
-     * \param protocol protocol number
-     * \param to address packet should be sent to
-     * \param from address packet was sent from
-     * \param packetType type of the packet (e.g., NetDevice::PACKET_HOST,
+     * @param packet Packet received on the channel
+     * @param protocol protocol number
+     * @param to address packet should be sent to
+     * @param from address packet was sent from
+     * @param packetType type of the packet (e.g., NetDevice::PACKET_HOST,
      * NetDevice::PACKET_OTHERHOST, etc.)
      */
     void Receive(Ptr<Packet> packet,
@@ -97,7 +97,7 @@
      *
      * In the callback the PacketType is always set to NetDevice::PACKET_HOST.
      *
-     * \param cb callback to invoke whenever the MockNetDevice has one packet to "send".
+     * @param cb callback to invoke whenever the MockNetDevice has one packet to "send".
      *
      */
     void SetSendCallback(PromiscReceiveCallback cb);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/sixlowpan/test/sixlowpan-example-ping-lr-wpan.reflog ns-3.44/src/sixlowpan/test/sixlowpan-example-ping-lr-wpan.reflog
--- ns-3.43/src/sixlowpan/test/sixlowpan-example-ping-lr-wpan.reflog	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/sixlowpan/test/sixlowpan-example-ping-lr-wpan.reflog	2025-03-09 16:55:49.687372200 -0700
@@ -1,16 +1,16 @@
 Device 0: pseudo-Mac-48 02:00:00:00:00:01, IPv6 Address 2001:2::ff:fe00:1
 Device 1: pseudo-Mac-48 02:00:00:00:00:02, IPv6 Address 2001:2::ff:fe00:2
 PING 2001:2::ff:fe00:2 - 16 bytes of data; 64 bytes including ICMP and IPv6 headers.
-24 bytes from (2001:2::ff:fe00:2): icmp_seq=0 ttl=64 time=21.536 ms
-24 bytes from (2001:2::ff:fe00:2): icmp_seq=1 ttl=64 time=9.312 ms
-24 bytes from (2001:2::ff:fe00:2): icmp_seq=2 ttl=64 time=8.992 ms
-24 bytes from (2001:2::ff:fe00:2): icmp_seq=3 ttl=64 time=9.952 ms
-24 bytes from (2001:2::ff:fe00:2): icmp_seq=4 ttl=64 time=6.752 ms
+24 bytes from (2001:2::ff:fe00:2): icmp_seq=0 ttl=64 time=21.216 ms
+24 bytes from (2001:2::ff:fe00:2): icmp_seq=1 ttl=64 time=7.712 ms
+24 bytes from (2001:2::ff:fe00:2): icmp_seq=2 ttl=64 time=7.712 ms
+24 bytes from (2001:2::ff:fe00:2): icmp_seq=3 ttl=64 time=7.392 ms
+24 bytes from (2001:2::ff:fe00:2): icmp_seq=4 ttl=64 time=10.592 ms
 
 --- 2001:2::ff:fe00:2 ping statistics ---
-5 packets transmitted, 5 received, 0% packet loss, time 4006ms
-rtt min/avg/max/mdev = 6/10.6/21/5.941 ms
+5 packets transmitted, 5 received, 0% packet loss, time 4010ms
+rtt min/avg/max/mdev = 7/10.4/21/6.066 ms
 NDISC Cache of node 0 at time +9s
 2001:2::ff:fe00:2 dev 2 lladdr 00-06-02:00:00:00:00:02 REACHABLE
 NDISC Cache of node 1 at time +9s
-2001:2::ff:fe00:1 dev 2 lladdr 00-06-02:00:00:00:00:01 REACHABLE
\ No newline at end of file
+2001:2::ff:fe00:1 dev 2 lladdr 00-06-02:00:00:00:00:01 REACHABLE
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/sixlowpan/test/sixlowpan-fragmentation-test.cc ns-3.44/src/sixlowpan/test/sixlowpan-fragmentation-test.cc
--- ns-3.43/src/sixlowpan/test/sixlowpan-fragmentation-test.cc	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/sixlowpan/test/sixlowpan-fragmentation-test.cc	2025-03-09 16:55:49.687372200 -0700
@@ -36,9 +36,9 @@
 using namespace ns3;
 
 /**
- * \ingroup sixlowpan-tests
+ * @ingroup sixlowpan-tests
  *
- * \brief 6LoWPAN Fragmentation Test
+ * @brief 6LoWPAN Fragmentation Test
  */
 class SixlowpanFragmentationTest : public TestCase
 {
@@ -63,12 +63,12 @@
 
     /**
      * Start the server node.
-     * \param serverNode The server node.
+     * @param serverNode The server node.
      */
     void StartServer(Ptr<Node> serverNode);
     /**
      * Handles incoming packets in the server.
-     * \param socket The receiving socket.
+     * @param socket The receiving socket.
      */
     void HandleReadServer(Ptr<Socket> socket);
 
@@ -76,21 +76,21 @@
 
     /**
      * Start the client node.
-     * \param clientNode The client node.
+     * @param clientNode The client node.
      */
     void StartClient(Ptr<Node> clientNode);
     /**
      * Handles incoming packets in the client.
-     * \param socket The receiving socket.
+     * @param socket The receiving socket.
      */
     void HandleReadClient(Ptr<Socket> socket);
     /**
      * Handles incoming ICMP packets in the client.
-     * \param icmpSource ICMP sender address.
-     * \param icmpTtl ICMP TTL.
-     * \param icmpType ICMP type.
-     * \param icmpCode ICMP code.
-     * \param icmpInfo ICMP info.
+     * @param icmpSource ICMP sender address.
+     * @param icmpTtl ICMP TTL.
+     * @param icmpType ICMP type.
+     * @param icmpCode ICMP code.
+     * @param icmpInfo ICMP info.
      */
     void HandleReadIcmpClient(Ipv6Address icmpSource,
                               uint8_t icmpTtl,
@@ -99,14 +99,14 @@
                               uint32_t icmpInfo);
     /**
      * Set the packet optional content.
-     * \param fill Pointer to an array of data.
-     * \param fillSize Size of the array of data.
-     * \param dataSize Size of the packet - if fillSize is less than dataSize, the data is repeated.
+     * @param fill Pointer to an array of data.
+     * @param fillSize Size of the array of data.
+     * @param dataSize Size of the packet - if fillSize is less than dataSize, the data is repeated.
      */
     void SetFill(uint8_t* fill, uint32_t fillSize, uint32_t dataSize);
     /**
      * Send a packet to the server.
-     * \returns The packet sent.
+     * @returns The packet sent.
      */
     Ptr<Packet> SendClient();
 };
@@ -468,9 +468,9 @@
 }
 
 /**
- * \ingroup sixlowpan-tests
+ * @ingroup sixlowpan-tests
  *
- * \brief 6LoWPAN Fragmentation TestSuite
+ * @brief 6LoWPAN Fragmentation TestSuite
  */
 class SixlowpanFragmentationTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/sixlowpan/test/sixlowpan-hc1-test.cc ns-3.44/src/sixlowpan/test/sixlowpan-hc1-test.cc
--- ns-3.43/src/sixlowpan/test/sixlowpan-hc1-test.cc	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/sixlowpan/test/sixlowpan-hc1-test.cc	2025-03-09 16:55:49.687372200 -0700
@@ -26,9 +26,9 @@
 using namespace ns3;
 
 /**
- * \ingroup sixlowpan-tests
+ * @ingroup sixlowpan-tests
  *
- * \brief 6LoWPAN HC1 Test
+ * @brief 6LoWPAN HC1 Test
  */
 class SixlowpanHc1ImplTest : public TestCase
 {
@@ -37,16 +37,16 @@
     /**
      * Send data function.
      *
-     * \param socket The sending socket.
-     * \param to The destination.
+     * @param socket The sending socket.
+     * @param to The destination.
      */
     void DoSendData(Ptr<Socket> socket, std::string to);
 
     /**
      * Send data function.
      *
-     * \param socket The sending socket.
-     * \param to The destination.
+     * @param socket The sending socket.
+     * @param to The destination.
      */
     void SendData(Ptr<Socket> socket, std::string to);
 
@@ -57,15 +57,15 @@
     /**
      * Packet receive function.
      *
-     * \param socket The receiving socket.
-     * \param packet The received packet.
-     * \param from The sender.
+     * @param socket The receiving socket.
+     * @param packet The received packet.
+     * @param from The sender.
      */
     void ReceivePacket(Ptr<Socket> socket, Ptr<Packet> packet, const Address& from);
     /**
      * Packet receive function.
      *
-     * \param socket The receiving socket.
+     * @param socket The receiving socket.
      */
     void ReceivePkt(Ptr<Socket> socket);
 };
@@ -201,9 +201,9 @@
 }
 
 /**
- * \ingroup sixlowpan-tests
+ * @ingroup sixlowpan-tests
  *
- * \brief 6LoWPAN HC1 TestSuite
+ * @brief 6LoWPAN HC1 TestSuite
  */
 class SixlowpanHc1TestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/sixlowpan/test/sixlowpan-iphc-stateful-test.cc ns-3.44/src/sixlowpan/test/sixlowpan-iphc-stateful-test.cc
--- ns-3.43/src/sixlowpan/test/sixlowpan-iphc-stateful-test.cc	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/sixlowpan/test/sixlowpan-iphc-stateful-test.cc	2025-03-09 16:55:49.687372200 -0700
@@ -30,14 +30,14 @@
 using namespace ns3;
 
 /**
- * \ingroup sixlowpan-tests
+ * @ingroup sixlowpan-tests
  *
- * \brief 6LoWPAN IPHC stateful compression Test
+ * @brief 6LoWPAN IPHC stateful compression Test
  */
 class SixlowpanIphcStatefulImplTest : public TestCase
 {
     /**
-     * \brief Structure to hold the Rx/Tx packets.
+     * @brief Structure to hold the Rx/Tx packets.
      */
     struct Data
     {
@@ -51,13 +51,13 @@
 
     /**
      * Receive from a MockDevice.
-     * \param device a pointer to the net device which is calling this function
-     * \param packet the packet received
-     * \param protocol the 16 bit protocol number associated with this packet.
-     * \param source the address of the sender
-     * \param destination the address of the receiver
-     * \param packetType type of packet received (broadcast/multicast/unicast/otherhost)
-     * \returns true.
+     * @param device a pointer to the net device which is calling this function
+     * @param packet the packet received
+     * @param protocol the 16 bit protocol number associated with this packet.
+     * @param source the address of the sender
+     * @param destination the address of the receiver
+     * @param packetType type of packet received (broadcast/multicast/unicast/otherhost)
+     * @returns true.
      */
     bool ReceiveFromMockDevice(Ptr<NetDevice> device,
                                Ptr<const Packet> packet,
@@ -68,13 +68,13 @@
 
     /**
      * Promiscuous receive from a SixLowPanNetDevice.
-     * \param device a pointer to the net device which is calling this function
-     * \param packet the packet received
-     * \param protocol the 16 bit protocol number associated with this packet.
-     * \param source the address of the sender
-     * \param destination the address of the receiver
-     * \param packetType type of packet received (broadcast/multicast/unicast/otherhost)
-     * \returns true.
+     * @param device a pointer to the net device which is calling this function
+     * @param packet the packet received
+     * @param protocol the 16 bit protocol number associated with this packet.
+     * @param source the address of the sender
+     * @param destination the address of the receiver
+     * @param packetType type of packet received (broadcast/multicast/unicast/otherhost)
+     * @returns true.
      */
     bool PromiscReceiveFromSixLowPanDevice(Ptr<NetDevice> device,
                                            Ptr<const Packet> packet,
@@ -85,9 +85,9 @@
 
     /**
      * Send one packet.
-     * \param device the device to send from
-     * \param from sender address
-     * \param to destination address
+     * @param device the device to send from
+     * @param from sender address
+     * @param to destination address
      */
     void SendOnePacket(Ptr<NetDevice> device, Ipv6Address from, Ipv6Address to);
 
@@ -366,9 +366,9 @@
 }
 
 /**
- * \ingroup sixlowpan-tests
+ * @ingroup sixlowpan-tests
  *
- * \brief 6LoWPAN IPHC TestSuite
+ * @brief 6LoWPAN IPHC TestSuite
  */
 class SixlowpanIphcStatefulTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/sixlowpan/test/sixlowpan-iphc-test.cc ns-3.44/src/sixlowpan/test/sixlowpan-iphc-test.cc
--- ns-3.43/src/sixlowpan/test/sixlowpan-iphc-test.cc	2024-10-09 16:41:10.080656500 -0700
+++ ns-3.44/src/sixlowpan/test/sixlowpan-iphc-test.cc	2025-03-09 16:55:49.687372200 -0700
@@ -26,9 +26,9 @@
 using namespace ns3;
 
 /**
- * \ingroup sixlowpan-tests
+ * @ingroup sixlowpan-tests
  *
- * \brief 6LoWPAN IPHC Test
+ * @brief 6LoWPAN IPHC Test
  */
 class SixlowpanIphcImplTest : public TestCase
 {
@@ -37,16 +37,16 @@
     /**
      * Send data function.
      *
-     * \param socket The sending socket.
-     * \param to The destination.
+     * @param socket The sending socket.
+     * @param to The destination.
      */
     void DoSendData(Ptr<Socket> socket, std::string to);
 
     /**
      * Send data function.
      *
-     * \param socket The sending socket.
-     * \param to The destination.
+     * @param socket The sending socket.
+     * @param to The destination.
      */
     void SendData(Ptr<Socket> socket, std::string to);
 
@@ -57,15 +57,15 @@
     /**
      * Packet receive function.
      *
-     * \param socket The receiving socket.
-     * \param packet The received packet.
-     * \param from The sender.
+     * @param socket The receiving socket.
+     * @param packet The received packet.
+     * @param from The sender.
      */
     void ReceivePacket(Ptr<Socket> socket, Ptr<Packet> packet, const Address& from);
     /**
      * Packet receive function.
      *
-     * \param socket The receiving socket.
+     * @param socket The receiving socket.
      */
     void ReceivePkt(Ptr<Socket> socket);
 };
@@ -199,9 +199,9 @@
 }
 
 /**
- * \ingroup sixlowpan-tests
+ * @ingroup sixlowpan-tests
  *
- * \brief 6LoWPAN IPHC TestSuite
+ * @brief 6LoWPAN IPHC TestSuite
  */
 class SixlowpanIphcTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/doc/spectrum.rst ns-3.44/src/spectrum/doc/spectrum.rst
--- ns-3.43/src/spectrum/doc/spectrum.rst	2024-10-09 16:41:10.084656700 -0700
+++ ns-3.44/src/spectrum/doc/spectrum.rst	2025-03-09 16:55:49.691372200 -0700
@@ -506,7 +506,7 @@
 notably used in the DVB-T and ISDB-T digital television standards adopted by
 various countries around the world, and analog modulation which is a legacy
 technology but is still being used by some countries today. To accomplish
-realistic PSD models for these modulation types, the signals’ PSDs were
+realistic PSD models for these modulation types, the signals' PSDs were
 approximated from real standards and developed into models that are scalable by
 frequency and power. The COFDM PSD is approximated from Figure 12 (8k mode) of
 [KoppCOFDM]_, the 8-VSB PSD is approximated from Figure 3 of [Baron8VSB]_, and the
@@ -560,13 +560,13 @@
    :align: center
 
    Plot from MATLAB implementation of CreateRegionalTvTransmitters method in
-   ``TvSpectrumTransmitterHelper``. Shows 100 random points on Earth’s surface
+   ``TvSpectrumTransmitterHelper``. Shows 100 random points on Earth's surface
    (with altitude 0) corresponding to TV transmitter locations within a 2000 km
    radius of 35° latitude and -100° longitude.
 
 A method (CreateRegionalTvTransmitters) is provided that enables users to
 randomly generate multiple TV transmitters from a specified region with a given
-density within a chosen radius around a point on Earth’s surface. The region,
+density within a chosen radius around a point on Earth's surface. The region,
 which determines the channel frequencies of the generated TV transmitters, can
 be specified to be one of the three provided, while the density determines the
 amount of transmitters generated. The TV transmitters' antenna heights
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/examples/adhoc-aloha-ideal-phy.cc ns-3.44/src/spectrum/examples/adhoc-aloha-ideal-phy.cc
--- ns-3.43/src/spectrum/examples/adhoc-aloha-ideal-phy.cc	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/examples/adhoc-aloha-ideal-phy.cc	2025-03-09 16:55:49.695372300 -0700
@@ -6,21 +6,21 @@
  * Author: Nicola Baldo <nbaldo@cttc.es>
  */
 
-#include <ns3/adhoc-aloha-noack-ideal-phy-helper.h>
-#include <ns3/applications-module.h>
-#include <ns3/core-module.h>
-#include <ns3/friis-spectrum-propagation-loss.h>
-#include <ns3/ism-spectrum-value-helper.h>
-#include <ns3/log.h>
-#include <ns3/mobility-module.h>
-#include <ns3/network-module.h>
-#include <ns3/propagation-delay-model.h>
-#include <ns3/single-model-spectrum-channel.h>
-#include <ns3/spectrum-analyzer.h>
-#include <ns3/spectrum-helper.h>
-#include <ns3/spectrum-model-300kHz-300GHz-log.h>
-#include <ns3/spectrum-model-ism2400MHz-res1MHz.h>
-#include <ns3/waveform-generator.h>
+#include "ns3/adhoc-aloha-noack-ideal-phy-helper.h"
+#include "ns3/applications-module.h"
+#include "ns3/core-module.h"
+#include "ns3/friis-spectrum-propagation-loss.h"
+#include "ns3/ism-spectrum-value-helper.h"
+#include "ns3/log.h"
+#include "ns3/mobility-module.h"
+#include "ns3/network-module.h"
+#include "ns3/propagation-delay-model.h"
+#include "ns3/single-model-spectrum-channel.h"
+#include "ns3/spectrum-analyzer.h"
+#include "ns3/spectrum-helper.h"
+#include "ns3/spectrum-model-300kHz-300GHz-log.h"
+#include "ns3/spectrum-model-ism2400MHz-res1MHz.h"
+#include "ns3/waveform-generator.h"
 
 #include <iostream>
 #include <string>
@@ -35,8 +35,8 @@
 /**
  * PHY start TX trace.
  *
- * \param context The context.
- * \param p The packet.
+ * @param context The context.
+ * @param p The packet.
  */
 void
 PhyTxStartTrace(std::string context, Ptr<const Packet> p)
@@ -50,8 +50,8 @@
 /**
  * PHY end TX trace.
  *
- * \param context The context.
- * \param p The packet.
+ * @param context The context.
+ * @param p The packet.
  */
 void
 PhyTxEndTrace(std::string context, Ptr<const Packet> p)
@@ -65,8 +65,8 @@
 /**
  * PHY start RX trace.
  *
- * \param context The context.
- * \param p The packet.
+ * @param context The context.
+ * @param p The packet.
  */
 void
 PhyRxStartTrace(std::string context, Ptr<const Packet> p)
@@ -80,8 +80,8 @@
 /**
  * PHY end OK RX trace.
  *
- * \param context The context.
- * \param p The packet.
+ * @param context The context.
+ * @param p The packet.
  */
 void
 PhyRxEndOkTrace(std::string context, Ptr<const Packet> p)
@@ -95,8 +95,8 @@
 /**
  * PHY end error RX trace.
  *
- * \param context The context.
- * \param p The packet.
+ * @param context The context.
+ * @param p The packet.
  */
 void
 PhyRxEndErrorTrace(std::string context, Ptr<const Packet> p)
@@ -110,7 +110,7 @@
 /**
  * Receive callback.
  *
- * \param socket The receiving socket.
+ * @param socket The receiving socket.
  */
 void
 ReceivePacket(Ptr<Socket> socket)
@@ -130,8 +130,8 @@
 /**
  * Create a socket and prepare it for packet reception.
  *
- * \param node The node.
- * \return a new socket
+ * @param node The node.
+ * @return a new socket
  */
 Ptr<Socket>
 SetupPacketReceive(Ptr<Node> node)
@@ -203,7 +203,7 @@
 
     Ptr<Socket> recvSink = SetupPacketReceive(c.Get(1));
 
-    Simulator::Stop(Seconds(10.0));
+    Simulator::Stop(Seconds(10));
 
     Config::Connect("/NodeList/*/DeviceList/*/Phy/TxStart", MakeCallback(&PhyTxStartTrace));
     Config::Connect("/NodeList/*/DeviceList/*/Phy/TxEnd", MakeCallback(&PhyTxEndTrace));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/examples/adhoc-aloha-ideal-phy-matrix-propagation-loss-model.cc ns-3.44/src/spectrum/examples/adhoc-aloha-ideal-phy-matrix-propagation-loss-model.cc
--- ns-3.43/src/spectrum/examples/adhoc-aloha-ideal-phy-matrix-propagation-loss-model.cc	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/examples/adhoc-aloha-ideal-phy-matrix-propagation-loss-model.cc	2025-03-09 16:55:49.695372300 -0700
@@ -6,21 +6,21 @@
  * Author: Nicola Baldo <nbaldo@cttc.es>
  */
 
-#include <ns3/adhoc-aloha-noack-ideal-phy-helper.h>
-#include <ns3/applications-module.h>
-#include <ns3/core-module.h>
-#include <ns3/friis-spectrum-propagation-loss.h>
-#include <ns3/ism-spectrum-value-helper.h>
-#include <ns3/log.h>
-#include <ns3/mobility-module.h>
-#include <ns3/network-module.h>
-#include <ns3/propagation-delay-model.h>
-#include <ns3/single-model-spectrum-channel.h>
-#include <ns3/spectrum-analyzer.h>
-#include <ns3/spectrum-helper.h>
-#include <ns3/spectrum-model-300kHz-300GHz-log.h>
-#include <ns3/spectrum-model-ism2400MHz-res1MHz.h>
-#include <ns3/waveform-generator.h>
+#include "ns3/adhoc-aloha-noack-ideal-phy-helper.h"
+#include "ns3/applications-module.h"
+#include "ns3/core-module.h"
+#include "ns3/friis-spectrum-propagation-loss.h"
+#include "ns3/ism-spectrum-value-helper.h"
+#include "ns3/log.h"
+#include "ns3/mobility-module.h"
+#include "ns3/network-module.h"
+#include "ns3/propagation-delay-model.h"
+#include "ns3/single-model-spectrum-channel.h"
+#include "ns3/spectrum-analyzer.h"
+#include "ns3/spectrum-helper.h"
+#include "ns3/spectrum-model-300kHz-300GHz-log.h"
+#include "ns3/spectrum-model-ism2400MHz-res1MHz.h"
+#include "ns3/waveform-generator.h"
 
 #include <iomanip>
 #include <iostream>
@@ -36,8 +36,8 @@
 /**
  * Trace for PHY Rx successful end.
  *
- * \param context The context.
- * \param p The packet.
+ * @param context The context.
+ * @param p The packet.
  */
 void
 PhyRxEndOkTrace(std::string context, Ptr<const Packet> p)
@@ -50,7 +50,7 @@
 }
 
 /**
- * \ingroup spectrum
+ * @ingroup spectrum
  *
  * Store the last pathloss value for each TX-RX pair. This is an
  * example of how the PathlossTrace (provided by some SpectrumChannel
@@ -63,10 +63,10 @@
     /**
      * update the pathloss value
      *
-     * \param context
-     * \param txPhy the transmitting PHY
-     * \param rxPhy the receiving PHY
-     * \param lossDb the loss in dB
+     * @param context
+     * @param txPhy the transmitting PHY
+     * @param rxPhy the receiving PHY
+     * @param lossDb the loss in dB
      */
     void UpdatePathloss(std::string context,
                         Ptr<const SpectrumPhy> txPhy,
@@ -179,7 +179,7 @@
     onoff.SetAttribute("PacketSize", UintegerValue(pktSize));
 
     ApplicationContainer apps = onoff.Install(c.Get(0));
-    apps.Start(Seconds(0.0));
+    apps.Start(Seconds(0));
     apps.Stop(Seconds(simDuration));
 
     Config::Connect("/NodeList/*/DeviceList/*/Phy/RxEndOk", MakeCallback(&PhyRxEndOkTrace));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/examples/adhoc-aloha-ideal-phy-with-microwave-oven.cc ns-3.44/src/spectrum/examples/adhoc-aloha-ideal-phy-with-microwave-oven.cc
--- ns-3.43/src/spectrum/examples/adhoc-aloha-ideal-phy-with-microwave-oven.cc	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/examples/adhoc-aloha-ideal-phy-with-microwave-oven.cc	2025-03-09 16:55:49.695372300 -0700
@@ -6,25 +6,25 @@
  * Author: Nicola Baldo <nbaldo@cttc.es>
  */
 
-#include <ns3/adhoc-aloha-noack-ideal-phy-helper.h>
-#include <ns3/applications-module.h>
-#include <ns3/core-module.h>
-#include <ns3/friis-spectrum-propagation-loss.h>
-#include <ns3/ism-spectrum-value-helper.h>
-#include <ns3/log.h>
-#include <ns3/microwave-oven-spectrum-value-helper.h>
-#include <ns3/mobility-module.h>
-#include <ns3/multi-model-spectrum-channel.h>
-#include <ns3/network-module.h>
-#include <ns3/non-communicating-net-device.h>
-#include <ns3/propagation-delay-model.h>
-#include <ns3/spectrum-analyzer-helper.h>
-#include <ns3/spectrum-analyzer.h>
-#include <ns3/spectrum-helper.h>
-#include <ns3/spectrum-model-300kHz-300GHz-log.h>
-#include <ns3/spectrum-model-ism2400MHz-res1MHz.h>
-#include <ns3/waveform-generator-helper.h>
-#include <ns3/waveform-generator.h>
+#include "ns3/adhoc-aloha-noack-ideal-phy-helper.h"
+#include "ns3/applications-module.h"
+#include "ns3/core-module.h"
+#include "ns3/friis-spectrum-propagation-loss.h"
+#include "ns3/ism-spectrum-value-helper.h"
+#include "ns3/log.h"
+#include "ns3/microwave-oven-spectrum-value-helper.h"
+#include "ns3/mobility-module.h"
+#include "ns3/multi-model-spectrum-channel.h"
+#include "ns3/network-module.h"
+#include "ns3/non-communicating-net-device.h"
+#include "ns3/propagation-delay-model.h"
+#include "ns3/spectrum-analyzer-helper.h"
+#include "ns3/spectrum-analyzer.h"
+#include "ns3/spectrum-helper.h"
+#include "ns3/spectrum-model-300kHz-300GHz-log.h"
+#include "ns3/spectrum-model-ism2400MHz-res1MHz.h"
+#include "ns3/waveform-generator-helper.h"
+#include "ns3/waveform-generator.h"
 
 #include <iostream>
 #include <string>
@@ -39,8 +39,8 @@
 /**
  *
  *
- * \param context
- * \param p
+ * @param context
+ * @param p
  */
 void
 PhyTxStartTrace(std::string context, Ptr<const Packet> p)
@@ -54,8 +54,8 @@
 /**
  * PHY start TX trace.
  *
- * \param context The context.
- * \param p The packet.
+ * @param context The context.
+ * @param p The packet.
  */
 void
 PhyTxEndTrace(std::string context, Ptr<const Packet> p)
@@ -69,8 +69,8 @@
 /**
  * PHY end TX trace.
  *
- * \param context The context.
- * \param p The packet.
+ * @param context The context.
+ * @param p The packet.
  */
 void
 PhyRxStartTrace(std::string context, Ptr<const Packet> p)
@@ -84,8 +84,8 @@
 /**
  * PHY end OK RX trace.
  *
- * \param context The context.
- * \param p The packet.
+ * @param context The context.
+ * @param p The packet.
  */
 void
 PhyRxEndOkTrace(std::string context, Ptr<const Packet> p)
@@ -99,8 +99,8 @@
 /**
  * PHY end error RX trace.
  *
- * \param context The context.
- * \param p The packet.
+ * @param context The context.
+ * @param p The packet.
  */
 void
 PhyRxEndErrorTrace(std::string context, Ptr<const Packet> p)
@@ -114,7 +114,7 @@
 /**
  * Receive callback.
  *
- * \param socket The receiving socket.
+ * @param socket The receiving socket.
  */
 void
 ReceivePacket(Ptr<Socket> socket)
@@ -134,8 +134,8 @@
 /**
  * Create a socket and prepare it for packet reception.
  *
- * \param node The node.
- * \return a new socket
+ * @param node The node.
+ * @return a new socket
  */
 Ptr<Socket>
 SetupPacketReceive(Ptr<Node> node)
@@ -220,7 +220,7 @@
     onoff.SetAttribute("PacketSize", UintegerValue(1500));
 
     ApplicationContainer apps = onoff.Install(ofdmNodes.Get(0));
-    apps.Start(Seconds(0.0));
+    apps.Start(Seconds(0));
     apps.Stop(Seconds(1));
 
     Ptr<Socket> recvSink = SetupPacketReceive(ofdmNodes.Get(1));
@@ -255,7 +255,7 @@
 
     SpectrumAnalyzerHelper spectrumAnalyzerHelper;
     spectrumAnalyzerHelper.SetChannel(channel);
-    spectrumAnalyzerHelper.SetRxSpectrumModel(SpectrumModelIsm2400MhzRes1Mhz);
+    spectrumAnalyzerHelper.SetRxSpectrumModel(SpectrumModelIsm2400MhzRes1Mhz());
     spectrumAnalyzerHelper.SetPhyAttribute("Resolution", TimeValue(MilliSeconds(2)));
     spectrumAnalyzerHelper.SetPhyAttribute("NoisePowerSpectralDensity",
                                            DoubleValue(1e-15)); // -120 dBm/Hz
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/examples/three-gpp-channel-example.cc ns-3.44/src/spectrum/examples/three-gpp-channel-example.cc
--- ns-3.43/src/spectrum/examples/three-gpp-channel-example.cc	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/examples/three-gpp-channel-example.cc	2025-03-09 16:55:49.695372300 -0700
@@ -43,7 +43,7 @@
     m_spectrumLossModel; //!< the SpectrumPropagationLossModel object
 
 /**
- * \brief A structure that holds the parameters for the
+ * @brief A structure that holds the parameters for the
  * ComputeSnr function. In this way the problem with the limited
  * number of parameters of method Schedule is avoided.
  */
@@ -59,9 +59,9 @@
 
 /**
  * Perform the beamforming using the DFT beamforming method
- * \param thisDevice the device performing the beamforming
- * \param thisAntenna the antenna object associated to thisDevice
- * \param otherDevice the device towards which point the beam
+ * @param thisDevice the device performing the beamforming
+ * @param thisAntenna the antenna object associated to thisDevice
+ * @param otherDevice the device towards which point the beam
  */
 static void
 DoBeamforming(Ptr<NetDevice> thisDevice,
@@ -106,7 +106,7 @@
 
 /**
  * Compute the average SNR
- * \param params A structure that holds the parameters that are needed to perform calculations in
+ * @param params A structure that holds the parameters that are needed to perform calculations in
  * ComputeSnr
  */
 static void
@@ -174,7 +174,7 @@
     Config::SetDefault("ns3::ThreeGppChannelModel::UpdatePeriod",
                        TimeValue(MilliSeconds(1))); // update the channel at each iteration
     Config::SetDefault("ns3::ThreeGppChannelConditionModel::UpdatePeriod",
-                       TimeValue(MilliSeconds(0.0))); // do not update the channel condition
+                       TimeValue(MilliSeconds(0))); // do not update the channel condition
 
     RngSeedManager::SetSeed(1);
     RngSeedManager::SetRun(1);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/examples/three-gpp-ntn-channel-example.cc ns-3.44/src/spectrum/examples/three-gpp-ntn-channel-example.cc
--- ns-3.43/src/spectrum/examples/three-gpp-ntn-channel-example.cc	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/examples/three-gpp-ntn-channel-example.cc	2025-03-09 16:55:49.695372300 -0700
@@ -6,7 +6,7 @@
  */
 
 /**
- * \file
+ * @file
  * This example is a modified version of "three-gpp-channel-example", to include
  * the 3GPP NTN channel model.
  * Specifically, most changes (which are also highlighted throughout the code)
@@ -20,6 +20,7 @@
  * The result is the SNR of the signal and the path loss, saved in the ntn-snr-trace.txt file.
  */
 
+#include "ns3/antenna-model.h"
 #include "ns3/channel-condition-model.h"
 #include "ns3/constant-position-mobility-model.h"
 #include "ns3/core-module.h"
@@ -36,7 +37,6 @@
 #include "ns3/three-gpp-propagation-loss-model.h"
 #include "ns3/three-gpp-spectrum-propagation-loss-model.h"
 #include "ns3/uniform-planar-array.h"
-#include <ns3/antenna-model.h>
 
 #include <fstream>
 
@@ -143,7 +143,7 @@
 }
 
 /**
- * \brief A structure that holds the parameters for the
+ * @brief A structure that holds the parameters for the
  * ComputeSnr function. In this way the problem with the limited
  * number of parameters of method Schedule is avoided.
  */
@@ -160,16 +160,16 @@
     double resourceBlockBandwidth;   //!< the Resource Block bandwidth in Hz
 
     /**
-     * \brief Constructor
-     * \param pTxMob the tx mobility model
-     * \param pRxMob the rx mobility model
-     * \param pTxPow the tx power in dBm
-     * \param pNoiseFigure the noise figure in dB
-     * \param pTxAntenna the tx antenna array
-     * \param pRxAntenna the rx antenna array
-     * \param pFrequency the carrier frequency in Hz
-     * \param pBandwidth the total bandwidth in Hz
-     * \param pResourceBlockBandwidth the Resource Block bandwidth in Hz
+     * @brief Constructor
+     * @param pTxMob the tx mobility model
+     * @param pRxMob the rx mobility model
+     * @param pTxPow the tx power in dBm
+     * @param pNoiseFigure the noise figure in dB
+     * @param pTxAntenna the tx antenna array
+     * @param pRxAntenna the rx antenna array
+     * @param pFrequency the carrier frequency in Hz
+     * @param pBandwidth the total bandwidth in Hz
+     * @param pResourceBlockBandwidth the Resource Block bandwidth in Hz
      */
     ComputeSnrParams(Ptr<MobilityModel> pTxMob,
                      Ptr<MobilityModel> pRxMob,
@@ -195,9 +195,9 @@
 
 /**
  * Perform the beamforming using the DFT beamforming method
- * \param thisDevice the device performing the beamforming
- * \param thisAntenna the antenna object associated to thisDevice
- * \param otherDevice the device towards which point the beam
+ * @param thisDevice the device performing the beamforming
+ * @param thisAntenna the antenna object associated to thisDevice
+ * @param otherDevice the device towards which point the beam
  */
 static void
 DoBeamforming(Ptr<NetDevice> thisDevice,
@@ -241,7 +241,7 @@
 
 /**
  * Compute the average SNR
- * \param params A structure that holds the parameters that are needed to perform calculations in
+ * @param params A structure that holds the parameters that are needed to perform calculations in
  * ComputeSnr
  */
 static void
@@ -345,7 +345,7 @@
     Config::SetDefault("ns3::ThreeGppChannelModel::UpdatePeriod",
                        TimeValue(MilliSeconds(10))); // update the channel at every 10 ms
     Config::SetDefault("ns3::ThreeGppChannelConditionModel::UpdatePeriod",
-                       TimeValue(MilliSeconds(0.0))); // do not update the channel condition
+                       TimeValue(MilliSeconds(0))); // do not update the channel condition
 
     RngSeedManager::SetSeed(1);
     RngSeedManager::SetRun(1);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/examples/three-gpp-two-ray-channel-calibration.cc ns-3.44/src/spectrum/examples/three-gpp-two-ray-channel-calibration.cc
--- ns-3.43/src/spectrum/examples/three-gpp-two-ray-channel-calibration.cc	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/examples/three-gpp-two-ray-channel-calibration.cc	2025-03-09 16:55:49.695372300 -0700
@@ -6,21 +6,21 @@
  *
  */
 
-#include <ns3/command-line.h>
-#include <ns3/core-module.h>
-#include <ns3/double.h>
-#include <ns3/isotropic-antenna-model.h>
-#include <ns3/mobility-helper.h>
-#include <ns3/node-container.h>
-#include <ns3/object-factory.h>
-#include <ns3/pointer.h>
-#include <ns3/string.h>
-#include <ns3/three-gpp-channel-model.h>
-#include <ns3/three-gpp-propagation-loss-model.h>
-#include <ns3/three-gpp-spectrum-propagation-loss-model.h>
-#include <ns3/two-ray-spectrum-propagation-loss-model.h>
-#include <ns3/uinteger.h>
-#include <ns3/uniform-planar-array.h>
+#include "ns3/command-line.h"
+#include "ns3/core-module.h"
+#include "ns3/double.h"
+#include "ns3/isotropic-antenna-model.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/node-container.h"
+#include "ns3/object-factory.h"
+#include "ns3/pointer.h"
+#include "ns3/string.h"
+#include "ns3/three-gpp-channel-model.h"
+#include "ns3/three-gpp-propagation-loss-model.h"
+#include "ns3/three-gpp-spectrum-propagation-loss-model.h"
+#include "ns3/two-ray-spectrum-propagation-loss-model.h"
+#include "ns3/uinteger.h"
+#include "ns3/uniform-planar-array.h"
 
 NS_LOG_COMPONENT_DEFINE("ThreeGppTwoRayChannelCalibration");
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/examples/tv-trans-example.cc ns-3.44/src/spectrum/examples/tv-trans-example.cc
--- ns-3.43/src/spectrum/examples/tv-trans-example.cc	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/examples/tv-trans-example.cc	2025-03-09 16:55:49.695372300 -0700
@@ -6,11 +6,11 @@
  * Author: Benjamin Cizdziel <ben.cizdziel@gmail.com>
  */
 
-#include <ns3/core-module.h>
-#include <ns3/mobility-module.h>
-#include <ns3/spectrum-analyzer-helper.h>
-#include <ns3/spectrum-helper.h>
-#include <ns3/tv-spectrum-transmitter-helper.h>
+#include "ns3/core-module.h"
+#include "ns3/mobility-module.h"
+#include "ns3/spectrum-analyzer-helper.h"
+#include "ns3/spectrum-helper.h"
+#include "ns3/tv-spectrum-transmitter-helper.h"
 
 #include <iostream>
 #include <stdlib.h>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/examples/tv-trans-regional-example.cc ns-3.44/src/spectrum/examples/tv-trans-regional-example.cc
--- ns-3.43/src/spectrum/examples/tv-trans-regional-example.cc	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/examples/tv-trans-regional-example.cc	2025-03-09 16:55:49.695372300 -0700
@@ -6,11 +6,11 @@
  * Author: Benjamin Cizdziel <ben.cizdziel@gmail.com>
  */
 
-#include <ns3/core-module.h>
-#include <ns3/mobility-module.h>
-#include <ns3/spectrum-analyzer-helper.h>
-#include <ns3/spectrum-helper.h>
-#include <ns3/tv-spectrum-transmitter-helper.h>
+#include "ns3/core-module.h"
+#include "ns3/mobility-module.h"
+#include "ns3/spectrum-analyzer-helper.h"
+#include "ns3/spectrum-helper.h"
+#include "ns3/tv-spectrum-transmitter-helper.h"
 
 #include <iostream>
 #include <stdlib.h>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/helper/adhoc-aloha-noack-ideal-phy-helper.h ns-3.44/src/spectrum/helper/adhoc-aloha-noack-ideal-phy-helper.h
--- ns-3.43/src/spectrum/helper/adhoc-aloha-noack-ideal-phy-helper.h	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/helper/adhoc-aloha-noack-ideal-phy-helper.h	2025-03-09 16:55:49.695372300 -0700
@@ -9,11 +9,11 @@
 #ifndef ADHOC_ALOHA_NOACK_IDEAL_PHY_HELPER_H
 #define ADHOC_ALOHA_NOACK_IDEAL_PHY_HELPER_H
 
-#include <ns3/attribute.h>
-#include <ns3/net-device-container.h>
-#include <ns3/node-container.h>
-#include <ns3/object-factory.h>
-#include <ns3/queue.h>
+#include "ns3/attribute.h"
+#include "ns3/net-device-container.h"
+#include "ns3/node-container.h"
+#include "ns3/object-factory.h"
+#include "ns3/queue.h"
 
 #include <string>
 
@@ -24,8 +24,8 @@
 class SpectrumChannel;
 
 /**
- * \ingroup spectrum
- * \brief create the AlohaNoackNetDevice
+ * @ingroup spectrum
+ * @brief create the AlohaNoackNetDevice
  */
 class AdhocAlohaNoackIdealPhyHelper
 {
@@ -78,9 +78,9 @@
     void SetDeviceAttribute(std::string n1, const AttributeValue& v1);
 
     /**
-     * \tparam Ts \deduced Argument types
-     * \param type the type of the model to set
-     * \param [in] args Name and AttributeValue pairs to set.
+     * @tparam Ts \deduced Argument types
+     * @param type the type of the model to set
+     * @param [in] args Name and AttributeValue pairs to set.
      *
      * Configure the AntennaModel instance for each new device to be created
      */
@@ -94,7 +94,7 @@
     NetDeviceContainer Install(NodeContainer c) const;
     /**
      * @param node the node on which a device must be created
-     * \returns a device container which contains all the devices created by this method.
+     * @returns a device container which contains all the devices created by this method.
      */
     NetDeviceContainer Install(Ptr<Node> node) const;
     /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/helper/spectrum-analyzer-helper.cc ns-3.44/src/spectrum/helper/spectrum-analyzer-helper.cc
--- ns-3.43/src/spectrum/helper/spectrum-analyzer-helper.cc	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/helper/spectrum-analyzer-helper.cc	2025-03-09 16:55:49.695372300 -0700
@@ -27,10 +27,10 @@
 NS_LOG_COMPONENT_DEFINE("SpectrumAnalyzerHelper");
 
 /**
- * \ingroup spectrum
- * \brief Writes a report of the Average Power Spectral Density
- * \param streamWrapper the wrapper to the output stream
- * \param avgPowerSpectralDensity Average Power Spectral Density
+ * @ingroup spectrum
+ * @brief Writes a report of the Average Power Spectral Density
+ * @param streamWrapper the wrapper to the output stream
+ * @param avgPowerSpectralDensity Average Power Spectral Density
  */
 static void
 WriteAveragePowerSpectralDensityReport(Ptr<OutputStreamWrapper> streamWrapper,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/helper/spectrum-analyzer-helper.h ns-3.44/src/spectrum/helper/spectrum-analyzer-helper.h
--- ns-3.43/src/spectrum/helper/spectrum-analyzer-helper.h	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/helper/spectrum-analyzer-helper.h	2025-03-09 16:55:49.695372300 -0700
@@ -9,11 +9,11 @@
 #ifndef SPECTRUM_ANALYZER_HELPER_H
 #define SPECTRUM_ANALYZER_HELPER_H
 
-#include <ns3/attribute.h>
-#include <ns3/net-device-container.h>
-#include <ns3/node-container.h>
-#include <ns3/object-factory.h>
-#include <ns3/queue.h>
+#include "ns3/attribute.h"
+#include "ns3/net-device-container.h"
+#include "ns3/node-container.h"
+#include "ns3/object-factory.h"
+#include "ns3/queue.h"
 
 #include <string>
 
@@ -25,8 +25,8 @@
 class SpectrumModel;
 
 /**
- * \ingroup spectrum
- * \brief Class to allow the Spectrum Analysis
+ * @ingroup spectrum
+ * @brief Class to allow the Spectrum Analysis
  */
 class SpectrumAnalyzerHelper
 {
@@ -65,9 +65,9 @@
     void SetDeviceAttribute(std::string n1, const AttributeValue& v1);
 
     /**
-     * \tparam Ts \deduced Argument types
-     * \param type the type of the model to set
-     * \param [in] args Name and AttributeValue pairs to set.
+     * @tparam Ts \deduced Argument types
+     * @param type the type of the model to set
+     * @param [in] args Name and AttributeValue pairs to set.
      *
      * Configure the AntennaModel instance for each new device to be created
      */
@@ -97,7 +97,7 @@
     NetDeviceContainer Install(NodeContainer c) const;
     /**
      * @param node the node on which a device must be created
-     * \returns a device container which contains all the devices created by this method.
+     * @returns a device container which contains all the devices created by this method.
      */
     NetDeviceContainer Install(Ptr<Node> node) const;
     /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/helper/spectrum-helper.cc ns-3.44/src/spectrum/helper/spectrum-helper.cc
--- ns-3.43/src/spectrum/helper/spectrum-helper.cc	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/helper/spectrum-helper.cc	2025-03-09 16:55:49.695372300 -0700
@@ -7,14 +7,14 @@
  */
 #include "spectrum-helper.h"
 
-#include <ns3/config.h>
-#include <ns3/half-duplex-ideal-phy.h>
-#include <ns3/multi-model-spectrum-channel.h>
-#include <ns3/names.h>
-#include <ns3/simulator.h>
-#include <ns3/single-model-spectrum-channel.h>
-#include <ns3/spectrum-channel.h>
-#include <ns3/spectrum-phy.h>
+#include "ns3/config.h"
+#include "ns3/half-duplex-ideal-phy.h"
+#include "ns3/multi-model-spectrum-channel.h"
+#include "ns3/names.h"
+#include "ns3/simulator.h"
+#include "ns3/single-model-spectrum-channel.h"
+#include "ns3/spectrum-channel.h"
+#include "ns3/spectrum-phy.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/helper/spectrum-helper.h ns-3.44/src/spectrum/helper/spectrum-helper.h
--- ns-3.43/src/spectrum/helper/spectrum-helper.h	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/helper/spectrum-helper.h	2025-03-09 16:55:49.695372300 -0700
@@ -9,12 +9,12 @@
 #ifndef SPECTRUM_HELPER_H
 #define SPECTRUM_HELPER_H
 
-#include <ns3/attribute.h>
-#include <ns3/net-device-container.h>
-#include <ns3/node-container.h>
-#include <ns3/object-factory.h>
-#include <ns3/propagation-loss-model.h>
-#include <ns3/spectrum-propagation-loss-model.h>
+#include "ns3/attribute.h"
+#include "ns3/net-device-container.h"
+#include "ns3/node-container.h"
+#include "ns3/object-factory.h"
+#include "ns3/propagation-loss-model.h"
+#include "ns3/spectrum-propagation-loss-model.h"
 
 #include <string>
 
@@ -27,33 +27,33 @@
 class NetDevice;
 
 /**
- * \ingroup spectrum
- * \brief Setup a SpectrumChannel
+ * @ingroup spectrum
+ * @brief Setup a SpectrumChannel
  */
 class SpectrumChannelHelper
 {
   public:
     /**
-     * \brief Setup a default SpectrumChannel. The Default mode is:
+     * @brief Setup a default SpectrumChannel. The Default mode is:
      * Channel: "ns3::SingleModelSpectrumChannel",
      * PropagationDelay: "ns3::ConstantSpeedPropagationDelayModel", and
      * SpectrumPropagationLoss: "ns3::FriisSpectrumPropagationLossModel".
      *
-     * \returns a Default-configured SpectrumChannelHelper
+     * @returns a Default-configured SpectrumChannelHelper
      */
     static SpectrumChannelHelper Default();
 
     /**
-     * \tparam Ts \deduced Argument types
-     * \param type the type of the SpectrumChannel to use
-     * \param [in] args Name and AttributeValue pairs to set.
+     * @tparam Ts \deduced Argument types
+     * @param type the type of the SpectrumChannel to use
+     * @param [in] args Name and AttributeValue pairs to set.
      */
     template <typename... Ts>
     void SetChannel(std::string type, Ts&&... args);
     /**
-     * \tparam Ts \deduced Argument types
-     * \param name the name of the model to set
-     * \param [in] args Name and AttributeValue pairs to set.
+     * @tparam Ts \deduced Argument types
+     * @param name the name of the model to set
+     * @param [in] args Name and AttributeValue pairs to set.
      *
      * Add a new single-frequency propagation loss model to this channel helper.
      */
@@ -63,14 +63,14 @@
     /**
      * Add a new single-frequency propagation loss model instance to this channel helper.
      *
-     * \param m a pointer to the instance of the propagation loss model
+     * @param m a pointer to the instance of the propagation loss model
      */
     void AddPropagationLoss(Ptr<PropagationLossModel> m);
 
     /**
-     * \tparam Ts \deduced Argument types
-     * \param name the name of the model to set
-     * \param [in] args Name and AttributeValue pairs to set.
+     * @tparam Ts \deduced Argument types
+     * @param name the name of the model to set
+     * @param [in] args Name and AttributeValue pairs to set.
      *
      * Add a new frequency-dependent propagation loss model to this channel helper.
      */
@@ -80,14 +80,14 @@
     /**
      * Add a new frequency-dependent propagation loss model instance to this channel helper.
      *
-     * \param m a pointer to the instance of the propagation loss model
+     * @param m a pointer to the instance of the propagation loss model
      */
     void AddSpectrumPropagationLoss(Ptr<SpectrumPropagationLossModel> m);
 
     /**
-     * \tparam Ts \deduced Argument types
-     * \param name the name of the model to set
-     * \param [in] args Name and AttributeValue pairs to set.
+     * @tparam Ts \deduced Argument types
+     * @param name the name of the model to set
+     * @param [in] args Name and AttributeValue pairs to set.
      *
      * Configure a propagation delay for this channel.
      */
@@ -95,7 +95,7 @@
     void SetPropagationDelay(std::string name, Ts&&... args);
 
     /**
-     * \returns a new channel
+     * @returns a new channel
      *
      * Create a channel based on the configuration parameters set previously.
      */
@@ -110,7 +110,7 @@
 };
 
 /**
- * \ingroup spectrum
+ * @ingroup spectrum
  *
  * Create and configure several SpectrumPhy instances and connect them to a channel.
  */
@@ -118,9 +118,9 @@
 {
   public:
     /**
-     * \tparam Ts \deduced Argument types
-     * \param name the type of SpectrumPhy to use
-     * \param [in] args Name and AttributeValue pairs to set.
+     * @tparam Ts \deduced Argument types
+     * @param name the type of SpectrumPhy to use
+     * @param [in] args Name and AttributeValue pairs to set.
      */
     template <typename... Ts>
     void SetPhy(std::string name, Ts&&... args);
@@ -140,8 +140,8 @@
     void SetChannel(std::string channelName);
 
     /**
-     * \param name the name of the attribute to set
-     * \param v the value of the attribute
+     * @param name the name of the attribute to set
+     * @param v the value of the attribute
      *
      * Set an attribute of the SpectrumPhy instances to be created
      */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/helper/tv-spectrum-transmitter-helper.cc ns-3.44/src/spectrum/helper/tv-spectrum-transmitter-helper.cc
--- ns-3.43/src/spectrum/helper/tv-spectrum-transmitter-helper.cc	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/helper/tv-spectrum-transmitter-helper.cc	2025-03-09 16:55:49.695372300 -0700
@@ -8,13 +8,13 @@
 
 #include "tv-spectrum-transmitter-helper.h"
 
-#include <ns3/double.h>
-#include <ns3/geographic-positions.h>
-#include <ns3/isotropic-antenna-model.h>
-#include <ns3/log.h>
-#include <ns3/mobility-helper.h>
-#include <ns3/position-allocator.h>
-#include <ns3/uinteger.h>
+#include "ns3/double.h"
+#include "ns3/geographic-positions.h"
+#include "ns3/isotropic-antenna-model.h"
+#include "ns3/log.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/position-allocator.h"
+#include "ns3/uinteger.h"
 
 #include <cmath>
 #include <list>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/helper/tv-spectrum-transmitter-helper.h ns-3.44/src/spectrum/helper/tv-spectrum-transmitter-helper.h
--- ns-3.43/src/spectrum/helper/tv-spectrum-transmitter-helper.h	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/helper/tv-spectrum-transmitter-helper.h	2025-03-09 16:55:49.695372300 -0700
@@ -9,19 +9,19 @@
 #ifndef TV_SPECTRUM_TRANSMITTER_HELPER_H
 #define TV_SPECTRUM_TRANSMITTER_HELPER_H
 
+#include "ns3/antenna-model.h"
+#include "ns3/mobility-model.h"
+#include "ns3/net-device-container.h"
+#include "ns3/net-device.h"
+#include "ns3/node-container.h"
+#include "ns3/non-communicating-net-device.h"
 #include "ns3/object-factory.h"
-#include <ns3/antenna-model.h>
-#include <ns3/mobility-model.h>
-#include <ns3/net-device-container.h>
-#include <ns3/net-device.h>
-#include <ns3/node-container.h>
-#include <ns3/non-communicating-net-device.h>
-#include <ns3/random-variable-stream.h>
-#include <ns3/spectrum-channel.h>
-#include <ns3/spectrum-phy.h>
-#include <ns3/spectrum-signal-parameters.h>
-#include <ns3/spectrum-value.h>
-#include <ns3/tv-spectrum-transmitter.h>
+#include "ns3/random-variable-stream.h"
+#include "ns3/spectrum-channel.h"
+#include "ns3/spectrum-phy.h"
+#include "ns3/spectrum-signal-parameters.h"
+#include "ns3/spectrum-value.h"
+#include "ns3/tv-spectrum-transmitter.h"
 
 class TvHelperDistributionTestCase;
 
@@ -29,7 +29,7 @@
 {
 
 /**
- * \ingroup spectrum
+ * @ingroup spectrum
  *
  * Helper class which uses TvSpectrumTransmitter class to create customizable
  * TV transmitter(s) that transmit PSD spectrum specified by user-set attributes.
@@ -39,7 +39,7 @@
  * and location.
  *
  * Here is an example of how to use this class:
- * \code
+ * @code
    TvSpectrumTransmitterHelper tvTransHelper;
    tvTransHelper.SetChannel (channel); // provided that user has a Ptr<SpectrumChannel> ready.
    tvTransHelper.SetAttribute ("StartFrequency", DoubleValue (524e6));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/helper/waveform-generator-helper.h ns-3.44/src/spectrum/helper/waveform-generator-helper.h
--- ns-3.43/src/spectrum/helper/waveform-generator-helper.h	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/helper/waveform-generator-helper.h	2025-03-09 16:55:49.695372300 -0700
@@ -9,11 +9,11 @@
 #ifndef WAVEFORM_GENERATOR_HELPER_H
 #define WAVEFORM_GENERATOR_HELPER_H
 
-#include <ns3/attribute.h>
-#include <ns3/net-device-container.h>
-#include <ns3/node-container.h>
-#include <ns3/object-factory.h>
-#include <ns3/queue.h>
+#include "ns3/attribute.h"
+#include "ns3/net-device-container.h"
+#include "ns3/node-container.h"
+#include "ns3/object-factory.h"
+#include "ns3/queue.h"
 
 #include <string>
 
@@ -24,7 +24,7 @@
 class SpectrumChannel;
 
 /**
- * \ingroup spectrum
+ * @ingroup spectrum
  *
  * Create a Waveform generator, which can be used to inject specific noise in the channel.
  */
@@ -72,9 +72,9 @@
     void SetDeviceAttribute(std::string n1, const AttributeValue& v1);
 
     /**
-     * \tparam Ts \deduced Argument types
-     * \param type the type of the model to set
-     * \param [in] args Name and AttributeValue pairs to set.
+     * @tparam Ts \deduced Argument types
+     * @param type the type of the model to set
+     * @param [in] args Name and AttributeValue pairs to set.
      *
      * Configure the AntennaModel instance for each new device to be created
      */
@@ -88,7 +88,7 @@
     NetDeviceContainer Install(NodeContainer c) const;
     /**
      * @param node the node on which a device must be created
-     * \returns a device container which contains all the devices created by this method.
+     * @returns a device container which contains all the devices created by this method.
      */
     NetDeviceContainer Install(Ptr<Node> node) const;
     /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/aloha-noack-mac-header.cc ns-3.44/src/spectrum/model/aloha-noack-mac-header.cc
--- ns-3.43/src/spectrum/model/aloha-noack-mac-header.cc	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/aloha-noack-mac-header.cc	2025-03-09 16:55:49.695372300 -0700
@@ -8,7 +8,7 @@
 
 #include "aloha-noack-mac-header.h"
 
-#include <ns3/log.h>
+#include "ns3/log.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/aloha-noack-mac-header.h ns-3.44/src/spectrum/model/aloha-noack-mac-header.h
--- ns-3.43/src/spectrum/model/aloha-noack-mac-header.h	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/aloha-noack-mac-header.h	2025-03-09 16:55:49.695372300 -0700
@@ -9,15 +9,15 @@
 #ifndef ALOHA_NOACK_MAC_HEADER_H
 #define ALOHA_NOACK_MAC_HEADER_H
 
-#include <ns3/address-utils.h>
-#include <ns3/header.h>
-#include <ns3/mac48-address.h>
+#include "ns3/address-utils.h"
+#include "ns3/header.h"
+#include "ns3/mac48-address.h"
 
 namespace ns3
 {
 
 /**
- * \ingroup spectrum
+ * @ingroup spectrum
  *  Header for the AlohaNoack NetDevice
  *
  */
@@ -25,8 +25,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -37,23 +37,23 @@
 
     /**
      * Set the source address
-     * \param source the source address
+     * @param source the source address
      */
     void SetSource(Mac48Address source);
     /**
      * Set the destination address
-     * \param destination the destination address
+     * @param destination the destination address
      */
     void SetDestination(Mac48Address destination);
 
     /**
      * Get the source address
-     * \returns the source address
+     * @returns the source address
      */
     Mac48Address GetSource() const;
     /**
      * Get the destination address
-     * \returns the destination address
+     * @returns the destination address
      */
     Mac48Address GetDestination() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/aloha-noack-net-device.cc ns-3.44/src/spectrum/model/aloha-noack-net-device.cc
--- ns-3.43/src/spectrum/model/aloha-noack-net-device.cc	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/aloha-noack-net-device.cc	2025-03-09 16:55:49.695372300 -0700
@@ -27,10 +27,10 @@
 NS_LOG_COMPONENT_DEFINE("AlohaNoackNetDevice");
 
 /**
- * \brief Output stream operator
- * \param os output stream
- * \param state the state to print
- * \return an output stream
+ * @brief Output stream operator
+ * @param os output stream
+ * @param state the state to print
+ * @return an output stream
  */
 std::ostream&
 operator<<(std::ostream& os, AlohaNoackNetDevice::State state)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/aloha-noack-net-device.h ns-3.44/src/spectrum/model/aloha-noack-net-device.h
--- ns-3.43/src/spectrum/model/aloha-noack-net-device.h	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/aloha-noack-net-device.h	2025-03-09 16:55:49.695372300 -0700
@@ -9,17 +9,17 @@
 #ifndef ALOHA_NOACK_NET_DEVICE_H
 #define ALOHA_NOACK_NET_DEVICE_H
 
+#include "ns3/address.h"
+#include "ns3/callback.h"
+#include "ns3/generic-phy.h"
+#include "ns3/mac48-address.h"
+#include "ns3/net-device.h"
+#include "ns3/node.h"
+#include "ns3/nstime.h"
+#include "ns3/packet.h"
+#include "ns3/ptr.h"
 #include "ns3/queue-fwd.h"
-#include <ns3/address.h>
-#include <ns3/callback.h>
-#include <ns3/generic-phy.h>
-#include <ns3/mac48-address.h>
-#include <ns3/net-device.h>
-#include <ns3/node.h>
-#include <ns3/nstime.h>
-#include <ns3/packet.h>
-#include <ns3/ptr.h>
-#include <ns3/traced-callback.h>
+#include "ns3/traced-callback.h"
 
 #include <cstring>
 
@@ -31,7 +31,7 @@
 class SpectrumErrorModel;
 
 /**
- * \ingroup spectrum
+ * @ingroup spectrum
  *
  * This devices implements the following features:
  *  - layer 3 protocol multiplexing
@@ -57,8 +57,8 @@
     };
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/constant-spectrum-propagation-loss.h ns-3.44/src/spectrum/model/constant-spectrum-propagation-loss.h
--- ns-3.43/src/spectrum/model/constant-spectrum-propagation-loss.h	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/constant-spectrum-propagation-loss.h	2025-03-09 16:55:49.695372300 -0700
@@ -15,7 +15,7 @@
 {
 
 /**
- * \ingroup spectrum
+ * @ingroup spectrum
  *
  * A Constant (fixed) propagation loss. The loss is not dependent on the distance.
  */
@@ -26,8 +26,8 @@
     ~ConstantSpectrumPropagationLossModel() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -36,12 +36,12 @@
                                                     Ptr<const MobilityModel> b) const override;
     /**
      * Set the propagation loss
-     * \param lossDb the propagation loss [dB]
+     * @param lossDb the propagation loss [dB]
      */
     void SetLossDb(double lossDb);
     /**
      * Get the propagation loss
-     * \returns the propagation loss [dB]
+     * @returns the propagation loss [dB]
      */
     double GetLossDb() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/friis-spectrum-propagation-loss.cc ns-3.44/src/spectrum/model/friis-spectrum-propagation-loss.cc
--- ns-3.43/src/spectrum/model/friis-spectrum-propagation-loss.cc	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/friis-spectrum-propagation-loss.cc	2025-03-09 16:55:49.695372300 -0700
@@ -10,7 +10,7 @@
 
 #include "spectrum-signal-parameters.h"
 
-#include <ns3/mobility-model.h>
+#include "ns3/mobility-model.h"
 
 #include <cmath> // for M_PI
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/friis-spectrum-propagation-loss.h ns-3.44/src/spectrum/model/friis-spectrum-propagation-loss.h
--- ns-3.43/src/spectrum/model/friis-spectrum-propagation-loss.h	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/friis-spectrum-propagation-loss.h	2025-03-09 16:55:49.695372300 -0700
@@ -17,8 +17,8 @@
 class MobilityModel;
 
 /**
- * \ingroup spectrum
- * \brief Friis spectrum propagation loss model
+ * @ingroup spectrum
+ * @brief Friis spectrum propagation loss model
  *
  * The propagation loss is calculated according to a simplified version of Friis'
  * formula in which antenna gains are unitary:
@@ -35,8 +35,8 @@
     ~FriisSpectrumPropagationLossModel() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/half-duplex-ideal-phy.cc ns-3.44/src/spectrum/model/half-duplex-ideal-phy.cc
--- ns-3.43/src/spectrum/model/half-duplex-ideal-phy.cc	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/half-duplex-ideal-phy.cc	2025-03-09 16:55:49.695372300 -0700
@@ -11,13 +11,13 @@
 #include "half-duplex-ideal-phy-signal-parameters.h"
 #include "spectrum-error-model.h"
 
-#include <ns3/antenna-model.h>
-#include <ns3/callback.h>
-#include <ns3/log.h>
-#include <ns3/object-factory.h>
-#include <ns3/packet-burst.h>
-#include <ns3/simulator.h>
-#include <ns3/trace-source-accessor.h>
+#include "ns3/antenna-model.h"
+#include "ns3/callback.h"
+#include "ns3/log.h"
+#include "ns3/object-factory.h"
+#include "ns3/packet-burst.h"
+#include "ns3/simulator.h"
+#include "ns3/trace-source-accessor.h"
 
 #include <cmath>
 
@@ -61,10 +61,10 @@
 }
 
 /**
- * \brief Output stream operator
- * \param os output stream
- * \param s the state to print
- * \return an output stream
+ * @brief Output stream operator
+ * @param os output stream
+ * @param s the state to print
+ * @return an output stream
  */
 std::ostream&
 operator<<(std::ostream& os, HalfDuplexIdealPhy::State s)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/half-duplex-ideal-phy.h ns-3.44/src/spectrum/model/half-duplex-ideal-phy.h
--- ns-3.43/src/spectrum/model/half-duplex-ideal-phy.h	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/half-duplex-ideal-phy.h	2025-03-09 16:55:49.695372300 -0700
@@ -15,19 +15,19 @@
 #include "spectrum-signal-parameters.h"
 #include "spectrum-value.h"
 
-#include <ns3/data-rate.h>
-#include <ns3/event-id.h>
-#include <ns3/generic-phy.h>
-#include <ns3/mobility-model.h>
-#include <ns3/net-device.h>
-#include <ns3/nstime.h>
-#include <ns3/packet.h>
+#include "ns3/data-rate.h"
+#include "ns3/event-id.h"
+#include "ns3/generic-phy.h"
+#include "ns3/mobility-model.h"
+#include "ns3/net-device.h"
+#include "ns3/nstime.h"
+#include "ns3/packet.h"
 
 namespace ns3
 {
 
 /**
- * \ingroup spectrum
+ * @ingroup spectrum
  *
  * This PHY layer implementation realizes an ideal OFDM PHY which
  * transmits half-duplex (i.e., it can either receive or transmit at a
@@ -81,8 +81,8 @@
     };
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -97,7 +97,7 @@
     void StartRx(Ptr<SpectrumSignalParameters> params) override;
 
     /**
-     * \brief Set the Power Spectral Density of outgoing signals in power units
+     * @brief Set the Power Spectral Density of outgoing signals in power units
      * (Watt, Pascal...) per Hz.
      *
      * @param txPsd Tx Power Spectral Density
@@ -105,7 +105,7 @@
     void SetTxPowerSpectralDensity(Ptr<SpectrumValue> txPsd);
 
     /**
-     * \brief Set the Noise Power Spectral Density in power units
+     * @brief Set the Noise Power Spectral Density in power units
      * (Watt, Pascal...) per Hz.
      * @param noisePsd the Noise Power Spectral Density
      */
@@ -171,7 +171,7 @@
     /**
      * set the AntennaModel to be used
      *
-     * \param a the Antenna Model
+     * @param a the Antenna Model
      */
     void SetAntenna(Ptr<AntennaModel> a);
 
@@ -180,7 +180,7 @@
 
     /**
      * Change the PHY state
-     * \param newState new state
+     * @param newState new state
      */
     void ChangeState(State newState);
     /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/half-duplex-ideal-phy-signal-parameters.cc ns-3.44/src/spectrum/model/half-duplex-ideal-phy-signal-parameters.cc
--- ns-3.43/src/spectrum/model/half-duplex-ideal-phy-signal-parameters.cc	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/half-duplex-ideal-phy-signal-parameters.cc	2025-03-09 16:55:49.695372300 -0700
@@ -8,8 +8,8 @@
 
 #include "half-duplex-ideal-phy-signal-parameters.h"
 
-#include <ns3/log.h>
-#include <ns3/packet.h>
+#include "ns3/log.h"
+#include "ns3/packet.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/half-duplex-ideal-phy-signal-parameters.h ns-3.44/src/spectrum/model/half-duplex-ideal-phy-signal-parameters.h
--- ns-3.43/src/spectrum/model/half-duplex-ideal-phy-signal-parameters.h	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/half-duplex-ideal-phy-signal-parameters.h	2025-03-09 16:55:49.695372300 -0700
@@ -17,7 +17,7 @@
 class Packet;
 
 /**
- * \ingroup spectrum
+ * @ingroup spectrum
  *
  * Signal parameters for HalfDuplexIdealPhy
  */
@@ -32,7 +32,7 @@
 
     /**
      * copy constructor
-     * \param p object to copy
+     * @param p object to copy
      */
     HalfDuplexIdealPhySignalParameters(const HalfDuplexIdealPhySignalParameters& p);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/ism-spectrum-value-helper.h ns-3.44/src/spectrum/model/ism-spectrum-value-helper.h
--- ns-3.43/src/spectrum/model/ism-spectrum-value-helper.h	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/ism-spectrum-value-helper.h	2025-03-09 16:55:49.695372300 -0700
@@ -17,7 +17,7 @@
 {
 
 /**
- * \ingroup spectrum
+ * @ingroup spectrum
  *
  * Implements Wifi SpectrumValue for the 2.4 GHz ISM band only, with a
  * 5 MHz spectrum resolution.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/matrix-based-channel-model.h ns-3.44/src/spectrum/model/matrix-based-channel-model.h
--- ns-3.43/src/spectrum/model/matrix-based-channel-model.h	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/matrix-based-channel-model.h	2025-03-09 16:55:49.695372300 -0700
@@ -11,11 +11,11 @@
 #define MATRIX_BASED_CHANNEL_H
 
 // #include <complex>
-#include <ns3/matrix-array.h>
-#include <ns3/nstime.h>
-#include <ns3/object.h>
-#include <ns3/phased-array-model.h>
-#include <ns3/vector.h>
+#include "ns3/matrix-array.h"
+#include "ns3/nstime.h"
+#include "ns3/object.h"
+#include "ns3/phased-array-model.h"
+#include "ns3/vector.h"
 
 #include <tuple>
 
@@ -25,7 +25,7 @@
 class MobilityModel;
 
 /**
- * \ingroup spectrum
+ * @ingroup spectrum
  *
  * This is an interface for a channel model that can be described
  * by a channel matrix, e.g., the 3GPP Spatial Channel Models,
@@ -84,9 +84,9 @@
         /**
          * Returns true if the ChannelMatrix object was generated
          * considering node b as transmitter and node a as receiver.
-         * \param aAntennaId the ID of the antenna array of the a node
-         * \param bAntennaId the ID of the antenna array of the b node
-         * \return true if b is the rx and a is the tx, false otherwise
+         * @param aAntennaId the ID of the antenna array of the a node
+         * @param bAntennaId the ID of the antenna array of the b node
+         * @return true if b is the rx and a is the tx, false otherwise
          */
         bool IsReverse(uint32_t aAntennaId, uint32_t bAntennaId) const
         {
@@ -178,11 +178,11 @@
      * matrix corresponds to H_ab, a call to IsReverse (idA, idB) will return
      * false, conversely, IsReverse (idB, idA) will return true.
      *
-     * \param aMob mobility model of the a device
-     * \param bMob mobility model of the b device
-     * \param aAntenna antenna of the a device
-     * \param bAntenna antenna of the b device
-     * \return the channel matrix
+     * @param aMob mobility model of the a device
+     * @param bMob mobility model of the b device
+     * @param aAntenna antenna of the a device
+     * @param bAntenna antenna of the b device
+     * @return the channel matrix
      */
     virtual Ptr<const ChannelMatrix> GetChannel(Ptr<const MobilityModel> aMob,
                                                 Ptr<const MobilityModel> bMob,
@@ -193,9 +193,9 @@
      * Returns a channel parameters structure used to obtain the channel between
      * the nodes with mobility objects passed as input parameters.
      *
-     * \param aMob mobility model of the a device
-     * \param bMob mobility model of the b device
-     * \return the channel matrix
+     * @param aMob mobility model of the a device
+     * @param bMob mobility model of the b device
+     * @return the channel matrix
      */
     virtual Ptr<const ChannelParams> GetParams(Ptr<const MobilityModel> aMob,
                                                Ptr<const MobilityModel> bMob) const = 0;
@@ -203,9 +203,9 @@
     /**
      * Generate a unique value for the pair of unsigned integer of 32 bits,
      * where the order does not matter, i.e., the same value will be returned for (a,b) and (b,a).
-     * \param a the first value
-     * \param b the second value
-     * \return return an integer representing a unique value for the pair of values
+     * @param a the first value
+     * @param b the second value
+     * @return return an integer representing a unique value for the pair of values
      */
     static uint64_t GetKey(uint32_t a, uint32_t b)
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/microwave-oven-spectrum-value-helper.cc ns-3.44/src/spectrum/model/microwave-oven-spectrum-value-helper.cc
--- ns-3.43/src/spectrum/model/microwave-oven-spectrum-value-helper.cc	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/microwave-oven-spectrum-value-helper.cc	2025-03-09 16:55:49.695372300 -0700
@@ -21,7 +21,7 @@
 static Ptr<SpectrumModel> g_MicrowaveOvenSpectrumModel6Mhz;
 
 /**
- * \ingroup spectrum
+ * @ingroup spectrum
  * Init a static class containing the MWO #2 model (5Mhz)
  */
 static class MicrowaveOvenSpectrumModel5MhzInitializer
@@ -45,7 +45,7 @@
 } g_MicrowaveOvenSpectrumModel5MhzInitializerInstance; //!< MWO model #2
 
 /**
- * \ingroup spectrum
+ * @ingroup spectrum
  * Init a static class containing the MWO #1 model (6Mhz)
  */
 static class MicrowaveOvenSpectrumModel6MhzInitializer
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/microwave-oven-spectrum-value-helper.h ns-3.44/src/spectrum/model/microwave-oven-spectrum-value-helper.h
--- ns-3.43/src/spectrum/model/microwave-oven-spectrum-value-helper.h	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/microwave-oven-spectrum-value-helper.h	2025-03-09 16:55:49.695372300 -0700
@@ -15,7 +15,7 @@
 {
 
 /**
- * \ingroup spectrum
+ * @ingroup spectrum
  *
  * This class provides methods for the creation of SpectrumValue
  * instances that mimic the Power Spectral Density of commercial
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/multi-model-spectrum-channel.cc ns-3.44/src/spectrum/model/multi-model-spectrum-channel.cc
--- ns-3.43/src/spectrum/model/multi-model-spectrum-channel.cc	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/multi-model-spectrum-channel.cc	2025-03-09 16:55:49.695372300 -0700
@@ -13,19 +13,19 @@
 #include "spectrum-propagation-loss-model.h"
 #include "spectrum-transmit-filter.h"
 
-#include <ns3/angles.h>
-#include <ns3/antenna-model.h>
-#include <ns3/double.h>
-#include <ns3/log.h>
-#include <ns3/mobility-model.h>
-#include <ns3/net-device.h>
-#include <ns3/node.h>
-#include <ns3/object.h>
-#include <ns3/packet-burst.h>
-#include <ns3/packet.h>
-#include <ns3/propagation-delay-model.h>
-#include <ns3/propagation-loss-model.h>
-#include <ns3/simulator.h>
+#include "ns3/angles.h"
+#include "ns3/antenna-model.h"
+#include "ns3/double.h"
+#include "ns3/log.h"
+#include "ns3/mobility-model.h"
+#include "ns3/net-device.h"
+#include "ns3/node.h"
+#include "ns3/object.h"
+#include "ns3/packet-burst.h"
+#include "ns3/packet.h"
+#include "ns3/propagation-delay-model.h"
+#include "ns3/propagation-loss-model.h"
+#include "ns3/simulator.h"
 
 #include <algorithm>
 #include <iostream>
@@ -39,10 +39,10 @@
 NS_OBJECT_ENSURE_REGISTERED(MultiModelSpectrumChannel);
 
 /**
- * \brief Output stream operator
- * \param lhs output stream
- * \param rhs the TxSpectrumModelInfoMap to print
- * \return an output stream
+ * @brief Output stream operator
+ * @param lhs output stream
+ * @param rhs the TxSpectrumModelInfoMap to print
+ * @return an output stream
  */
 std::ostream&
 operator<<(std::ostream& lhs, TxSpectrumModelInfoMap_t& rhs)
@@ -132,7 +132,7 @@
                   "phy->GetRxSpectrumModel () returned 0. Please check that the RxSpectrumModel is "
                   "already set for the phy before calling MultiModelSpectrumChannel::AddRx (phy)");
 
-    SpectrumModelUid_t rxSpectrumModelUid = rxSpectrumModel->GetUid();
+    const auto rxSpectrumModelUid = rxSpectrumModel->GetUid();
 
     RemoveRx(phy);
 
@@ -152,8 +152,8 @@
              txInfoIterator != m_txSpectrumModelInfoMap.end();
              ++txInfoIterator)
         {
-            Ptr<const SpectrumModel> txSpectrumModel = txInfoIterator->second.m_txSpectrumModel;
-            SpectrumModelUid_t txSpectrumModelUid = txSpectrumModel->GetUid();
+            auto txSpectrumModel = txInfoIterator->second.m_txSpectrumModel;
+            const auto txSpectrumModelUid = txSpectrumModel->GetUid();
 
             if (rxSpectrumModelUid != txSpectrumModelUid &&
                 !txSpectrumModel->IsOrthogonal(*rxSpectrumModel))
@@ -174,7 +174,7 @@
     Ptr<const SpectrumModel> txSpectrumModel)
 {
     NS_LOG_FUNCTION(this << txSpectrumModel);
-    SpectrumModelUid_t txSpectrumModelUid = txSpectrumModel->GetUid();
+    const auto txSpectrumModelUid = txSpectrumModel->GetUid();
     auto txInfoIterator = m_txSpectrumModelInfoMap.find(txSpectrumModelUid);
 
     if (txInfoIterator == m_txSpectrumModelInfoMap.end())
@@ -191,14 +191,15 @@
              rxInfoIterator != m_rxSpectrumModelInfoMap.end();
              ++rxInfoIterator)
         {
-            Ptr<const SpectrumModel> rxSpectrumModel = rxInfoIterator->second.m_rxSpectrumModel;
-            SpectrumModelUid_t rxSpectrumModelUid = rxSpectrumModel->GetUid();
+            auto rxSpectrumModel = rxInfoIterator->second.m_rxSpectrumModel;
+            const auto rxSpectrumModelUid = rxSpectrumModel->GetUid();
 
             if (rxSpectrumModelUid != txSpectrumModelUid &&
                 !txSpectrumModel->IsOrthogonal(*rxSpectrumModel))
             {
                 NS_LOG_LOGIC("Creating converter between SpectrumModelUid "
                              << txSpectrumModelUid << " and " << rxSpectrumModelUid);
+
                 SpectrumConverter converter(txSpectrumModel, rxSpectrumModel);
                 auto ret2 = txInfoIterator->second.m_spectrumConverterMap.insert(
                     std::make_pair(rxSpectrumModelUid, converter));
@@ -220,22 +221,66 @@
 
     NS_ASSERT(txParams->txPhy);
     NS_ASSERT(txParams->psd);
-    Ptr<SpectrumSignalParameters> txParamsTrace =
-        txParams->Copy(); // copy it since traced value cannot be const (because of potential
-                          // underlying DynamicCasts)
+    auto txParamsTrace = txParams->Copy(); // copy it since traced value cannot be const (because of
+                                           // potential underlying DynamicCasts)
     m_txSigParamsTrace(txParamsTrace);
 
     auto txMobility = txParams->txPhy->GetMobility();
-    auto txSpectrumModelUid = txParams->psd->GetSpectrumModelUid();
+    const auto txSpectrumModelUid = txParams->psd->GetSpectrumModelUid();
     NS_LOG_LOGIC("txSpectrumModelUid " << txSpectrumModelUid);
 
+    const auto txInfoIterator =
+        FindAndEventuallyAddTxSpectrumModel(txParams->psd->GetSpectrumModel());
+    NS_ASSERT(txInfoIterator != m_txSpectrumModelInfoMap.cend());
+
+    NS_LOG_LOGIC("converter map for TX SpectrumModel with Uid " << txInfoIterator->first);
+    NS_LOG_LOGIC("converter map size: " << txInfoIterator->second.m_spectrumConverterMap.size());
+    NS_LOG_LOGIC("converter map first element: "
+                 << txInfoIterator->second.m_spectrumConverterMap.begin()->first);
+
+    std::map<SpectrumModelUid_t, Ptr<SpectrumValue>> convertedPsds{};
     for (auto rxInfoIterator = m_rxSpectrumModelInfoMap.begin();
          rxInfoIterator != m_rxSpectrumModelInfoMap.end();
          ++rxInfoIterator)
     {
-        SpectrumModelUid_t rxSpectrumModelUid = rxInfoIterator->second.m_rxSpectrumModel->GetUid();
+        const auto rxSpectrumModelUid = rxInfoIterator->second.m_rxSpectrumModel->GetUid();
         NS_LOG_LOGIC("rxSpectrumModelUids " << rxSpectrumModelUid);
 
+        Ptr<SpectrumValue> convertedTxPowerSpectrum;
+        if (txSpectrumModelUid == rxSpectrumModelUid)
+        {
+            NS_LOG_LOGIC("no spectrum conversion needed");
+            convertedTxPowerSpectrum = txParams->psd;
+        }
+        else
+        {
+            NS_LOG_LOGIC("converting txPowerSpectrum SpectrumModelUids "
+                         << txSpectrumModelUid << " --> " << rxSpectrumModelUid);
+            auto rxConverterIterator =
+                txInfoIterator->second.m_spectrumConverterMap.find(rxSpectrumModelUid);
+            if (rxConverterIterator == txInfoIterator->second.m_spectrumConverterMap.end())
+            {
+                // No converter means TX SpectrumModel is orthogonal to RX SpectrumModel
+                continue;
+            }
+            convertedTxPowerSpectrum = rxConverterIterator->second.Convert(txParams->psd);
+        }
+        convertedPsds.emplace(rxSpectrumModelUid, convertedTxPowerSpectrum);
+    }
+
+    for (auto rxInfoIterator = m_rxSpectrumModelInfoMap.begin();
+         rxInfoIterator != m_rxSpectrumModelInfoMap.end();
+         ++rxInfoIterator)
+    {
+        const auto rxSpectrumModelUid = rxInfoIterator->second.m_rxSpectrumModel->GetUid();
+
+        if ((txSpectrumModelUid != rxSpectrumModelUid) &&
+            !txInfoIterator->second.m_spectrumConverterMap.contains(rxSpectrumModelUid))
+        {
+            // No converter means TX SpectrumModel is orthogonal to RX SpectrumModel
+            continue;
+        }
+
         for (auto rxPhyIterator = rxInfoIterator->second.m_rxPhys.begin();
              rxPhyIterator != rxInfoIterator->second.m_rxPhys.end();
              ++rxPhyIterator)
@@ -244,6 +289,7 @@
                           "SpectrumModel change was not notified to MultiModelSpectrumChannel "
                           "(i.e., AddRx should be called again after model is changed)");
 
+            auto txAntennaGain{0.0};
             if ((*rxPhyIterator) != txParams->txPhy)
             {
                 auto rxNetDevice = (*rxPhyIterator)->GetDevice();
@@ -268,64 +314,19 @@
 
                 NS_LOG_LOGIC("copying signal parameters " << txParams);
                 auto rxParams = txParams->Copy();
-                rxParams->psd = Copy<SpectrumValue>(txParams->psd);
+                rxParams->psd = Copy<SpectrumValue>(convertedPsds.at(rxSpectrumModelUid));
                 Time delay{0};
 
                 auto receiverMobility = (*rxPhyIterator)->GetMobility();
 
                 if (txMobility && receiverMobility)
                 {
-                    auto txAntennaGain{0.0};
-                    auto rxAntennaGain{0.0};
-                    auto propagationGainDb{0.0};
-                    auto pathLossDb{0.0};
                     if (rxParams->txAntenna)
                     {
                         Angles txAngles(receiverMobility->GetPosition(), txMobility->GetPosition());
                         txAntennaGain = rxParams->txAntenna->GetGainDb(txAngles);
                         NS_LOG_LOGIC("txAntennaGain = " << txAntennaGain << " dB");
-                        pathLossDb -= txAntennaGain;
-                    }
-                    auto rxAntenna = DynamicCast<AntennaModel>((*rxPhyIterator)->GetAntenna());
-                    if (rxAntenna)
-                    {
-                        Angles rxAngles(txMobility->GetPosition(), receiverMobility->GetPosition());
-                        rxAntennaGain = rxAntenna->GetGainDb(rxAngles);
-                        NS_LOG_LOGIC("rxAntennaGain = " << rxAntennaGain << " dB");
-                        pathLossDb -= rxAntennaGain;
-                    }
-                    if (m_propagationLoss)
-                    {
-                        if (txMobility->GetPosition() == receiverMobility->GetPosition())
-                        {
-                            propagationGainDb = 0; // Assume no propagation loss when co-located
-                        }
-                        else
-                        {
-                            propagationGainDb =
-                                m_propagationLoss->CalcRxPower(0, txMobility, receiverMobility);
-                        }
-                        NS_LOG_LOGIC("propagationGainDb = " << propagationGainDb << " dB");
-                        pathLossDb -= propagationGainDb;
-                    }
-                    NS_LOG_LOGIC("total pathLoss = " << pathLossDb << " dB");
-                    // Gain trace
-                    m_gainTrace(txMobility,
-                                receiverMobility,
-                                txAntennaGain,
-                                rxAntennaGain,
-                                propagationGainDb,
-                                pathLossDb);
-                    // Pathloss trace
-                    m_pathLossTrace(txParams->txPhy, *rxPhyIterator, pathLossDb);
-                    if (pathLossDb > m_maxLossDb)
-                    {
-                        // beyond range
-                        continue;
                     }
-                    auto pathGainLinear = std::pow(10.0, (-pathLossDb) / 10.0);
-                    *(rxParams->psd) *= pathGainLinear;
-
                     if (m_propagationDelay)
                     {
                         delay = m_propagationDelay->GetDelay(txMobility, receiverMobility);
@@ -340,8 +341,11 @@
                                                    delay,
                                                    &MultiModelSpectrumChannel::StartRx,
                                                    this,
+                                                   txParams->psd,
+                                                   txAntennaGain,
                                                    rxParams,
-                                                   *rxPhyIterator);
+                                                   *rxPhyIterator,
+                                                   convertedPsds);
                 }
                 else
                 {
@@ -350,8 +354,11 @@
                     Simulator::Schedule(delay,
                                         &MultiModelSpectrumChannel::StartRx,
                                         this,
+                                        txParams->psd,
+                                        txAntennaGain,
                                         rxParams,
-                                        *rxPhyIterator);
+                                        *rxPhyIterator,
+                                        convertedPsds);
                 }
             }
         }
@@ -359,66 +366,122 @@
 }
 
 void
-MultiModelSpectrumChannel::StartRx(Ptr<SpectrumSignalParameters> params, Ptr<SpectrumPhy> receiver)
+MultiModelSpectrumChannel::StartRx(
+    Ptr<SpectrumValue> txPsd,
+    double txAntennaGain,
+    Ptr<SpectrumSignalParameters> params,
+    Ptr<SpectrumPhy> receiver,
+    const std::map<SpectrumModelUid_t, Ptr<SpectrumValue>>& availableConvertedPsds)
 {
     NS_LOG_FUNCTION(this);
-    const auto txSpectrumModelUid = params->psd->GetSpectrumModelUid();
-    const auto rxSpectrumModelUid = receiver->GetRxSpectrumModel()->GetUid();
 
-    auto txInfoIteratorerator =
-        FindAndEventuallyAddTxSpectrumModel(params->psd->GetSpectrumModel());
-    NS_ASSERT(txInfoIteratorerator != m_txSpectrumModelInfoMap.end());
-
-    NS_LOG_LOGIC("converter map for TX SpectrumModel with Uid " << txInfoIteratorerator->first);
-    NS_LOG_LOGIC(
-        "converter map size: " << txInfoIteratorerator->second.m_spectrumConverterMap.size());
-    NS_LOG_LOGIC("converter map first element: "
-                 << txInfoIteratorerator->second.m_spectrumConverterMap.begin()->first);
+    const auto rxSpectrumModelUid = params->psd->GetSpectrumModelUid();
+    const auto phySpectrumModelUid = receiver->GetRxSpectrumModel()->GetUid();
+    NS_LOG_LOGIC("rxSpectrumModelUid " << rxSpectrumModelUid << " phySpectrumModelUid "
+                                       << phySpectrumModelUid);
 
-    Ptr<SpectrumValue> convertedPsd;
-    if (txSpectrumModelUid == rxSpectrumModelUid)
+    if (rxSpectrumModelUid != phySpectrumModelUid)
     {
-        NS_LOG_LOGIC("no spectrum conversion needed");
-        convertedPsd = params->psd;
+        NS_LOG_LOGIC("SpectrumModelUid changed since TX started");
+
+        const auto itConvertedPsd = availableConvertedPsds.find(phySpectrumModelUid);
+        if (itConvertedPsd != availableConvertedPsds.cend())
+        {
+            NS_LOG_LOGIC("converted PSD already exists for " << phySpectrumModelUid);
+            params->psd = itConvertedPsd->second;
+        }
+        else
+        {
+            const auto txInfoIterator =
+                FindAndEventuallyAddTxSpectrumModel(txPsd->GetSpectrumModel());
+            NS_ASSERT(txInfoIterator != m_txSpectrumModelInfoMap.cend());
+
+            const auto txSpectrumModelUid = txPsd->GetSpectrumModelUid();
+            NS_LOG_LOGIC("converting txPowerSpectrum SpectrumModelUids "
+                         << txSpectrumModelUid << " --> " << phySpectrumModelUid);
+            const auto rxConverterIterator =
+                txInfoIterator->second.m_spectrumConverterMap.find(phySpectrumModelUid);
+            if (rxConverterIterator == txInfoIterator->second.m_spectrumConverterMap.cend())
+            {
+                // No converter means TX SpectrumModel is orthogonal to current PHY SpectrumModel
+                params->psd = txPsd;
+            }
+            else
+            {
+                params->psd = rxConverterIterator->second.Convert(txPsd);
+            }
+        }
     }
-    else
+
+    auto txMobility = params->txPhy->GetMobility();
+    auto rxMobility = receiver->GetMobility();
+    if (txMobility && rxMobility)
     {
-        NS_LOG_LOGIC("converting txPowerSpectrum SpectrumModelUids "
-                     << txSpectrumModelUid << " --> " << rxSpectrumModelUid);
-        auto rxConverterIterator =
-            txInfoIteratorerator->second.m_spectrumConverterMap.find(rxSpectrumModelUid);
-        if (rxConverterIterator == txInfoIteratorerator->second.m_spectrumConverterMap.end())
+        auto pathLossDb{-txAntennaGain};
+        auto rxAntennaGain{0.0};
+        auto propagationGainDb{0.0};
+
+        if (auto rxAntenna = DynamicCast<AntennaModel>(receiver->GetAntenna()))
         {
-            // No converter means TX SpectrumModel is orthogonal to RX SpectrumModel
+            Angles rxAngles(txMobility->GetPosition(), rxMobility->GetPosition());
+            rxAntennaGain = rxAntenna->GetGainDb(rxAngles);
+            NS_LOG_LOGIC("rxAntennaGain = " << rxAntennaGain << " dB");
+            pathLossDb -= rxAntennaGain;
+        }
+
+        if (m_propagationLoss && (txMobility->GetPosition() != rxMobility->GetPosition()))
+        {
+            propagationGainDb = m_propagationLoss->CalcRxPower(0, txMobility, rxMobility);
+            NS_LOG_LOGIC("propagationGainDb = " << propagationGainDb << " dB");
+            pathLossDb -= propagationGainDb;
+        }
+
+        NS_LOG_LOGIC("total pathLoss = " << pathLossDb << " dB");
+
+        // Gain trace
+        m_gainTrace(txMobility,
+                    rxMobility,
+                    txAntennaGain,
+                    rxAntennaGain,
+                    propagationGainDb,
+                    pathLossDb);
+
+        // Pathloss trace
+        m_pathLossTrace(params->txPhy, receiver, pathLossDb);
+
+        if (pathLossDb > m_maxLossDb)
+        {
+            // beyond range
             return;
         }
-        convertedPsd = rxConverterIterator->second.Convert(params->psd);
-        NS_LOG_LOGIC("convertedPsd " << convertedPsd->GetValuesN());
-    }
-    params->psd = convertedPsd;
-    if (m_spectrumPropagationLoss)
-    {
-        params->psd =
-            m_spectrumPropagationLoss->CalcRxPowerSpectralDensity(params,
-                                                                  params->txPhy->GetMobility(),
-                                                                  receiver->GetMobility());
-    }
-    else if (m_phasedArraySpectrumPropagationLoss)
-    {
-        auto txPhasedArrayModel = DynamicCast<PhasedArrayModel>(params->txPhy->GetAntenna());
-        auto rxPhasedArrayModel = DynamicCast<PhasedArrayModel>(receiver->GetAntenna());
 
-        NS_ASSERT_MSG(txPhasedArrayModel && rxPhasedArrayModel,
-                      "PhasedArrayModel instances should be installed at both TX and RX "
-                      "SpectrumPhy in order to use PhasedArraySpectrumPropagationLoss.");
-
-        params = m_phasedArraySpectrumPropagationLoss->CalcRxPowerSpectralDensity(
-            params,
-            params->txPhy->GetMobility(),
-            receiver->GetMobility(),
-            txPhasedArrayModel,
-            rxPhasedArrayModel);
+        const auto pathLossLinear = std::pow(10.0, (-pathLossDb) / 10.0);
+        *(params->psd) *= pathLossLinear;
+
+        if (m_spectrumPropagationLoss)
+        {
+            params->psd = m_spectrumPropagationLoss->CalcRxPowerSpectralDensity(params,
+                                                                                txMobility,
+                                                                                rxMobility);
+        }
+        else if (m_phasedArraySpectrumPropagationLoss)
+        {
+            auto txPhasedArrayModel = DynamicCast<PhasedArrayModel>(params->txPhy->GetAntenna());
+            auto rxPhasedArrayModel = DynamicCast<PhasedArrayModel>(receiver->GetAntenna());
+
+            NS_ASSERT_MSG(txPhasedArrayModel && rxPhasedArrayModel,
+                          "PhasedArrayModel instances should be installed at both TX and RX "
+                          "SpectrumPhy in order to use PhasedArraySpectrumPropagationLoss.");
+
+            params = m_phasedArraySpectrumPropagationLoss->CalcRxPowerSpectralDensity(
+                params,
+                txMobility,
+                rxMobility,
+                txPhasedArrayModel,
+                rxPhasedArrayModel);
+        }
     }
+
     receiver->StartRx(params);
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/multi-model-spectrum-channel.h ns-3.44/src/spectrum/model/multi-model-spectrum-channel.h
--- ns-3.43/src/spectrum/model/multi-model-spectrum-channel.h	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/multi-model-spectrum-channel.h	2025-03-09 16:55:49.695372300 -0700
@@ -14,7 +14,7 @@
 #include "spectrum-propagation-loss-model.h"
 #include "spectrum-value.h"
 
-#include <ns3/propagation-delay-model.h>
+#include "ns3/propagation-delay-model.h"
 
 #include <map>
 #include <set>
@@ -23,13 +23,13 @@
 {
 
 /**
- * \ingroup spectrum
+ * @ingroup spectrum
  * Container: SpectrumModelUid_t, SpectrumConverter
  */
 typedef std::map<SpectrumModelUid_t, SpectrumConverter> SpectrumConverterMap_t;
 
 /**
- * \ingroup spectrum
+ * @ingroup spectrum
  * The Tx spectrum model information. This class is used to convert
  * one spectrum model into another one.
  */
@@ -38,7 +38,7 @@
   public:
     /**
      * Constructor.
-     * \param txSpectrumModel the Tx Spectrum model.
+     * @param txSpectrumModel the Tx Spectrum model.
      */
     TxSpectrumModelInfo(Ptr<const SpectrumModel> txSpectrumModel);
 
@@ -47,13 +47,13 @@
 };
 
 /**
- * \ingroup spectrum
+ * @ingroup spectrum
  * Container: SpectrumModelUid_t, TxSpectrumModelInfo
  */
 typedef std::map<SpectrumModelUid_t, TxSpectrumModelInfo> TxSpectrumModelInfoMap_t;
 
 /**
- * \ingroup spectrum
+ * @ingroup spectrum
  * The Rx spectrum model information. This class is used to convert
  * one spectrum model into another one.
  */
@@ -62,7 +62,7 @@
   public:
     /**
      * Constructor.
-     * \param rxSpectrumModel the Rx Spectrum model.
+     * @param rxSpectrumModel the Rx Spectrum model.
      */
     RxSpectrumModelInfo(Ptr<const SpectrumModel> rxSpectrumModel);
 
@@ -71,19 +71,19 @@
 };
 
 /**
- * \ingroup spectrum
+ * @ingroup spectrum
  * Container: SpectrumModelUid_t, RxSpectrumModelInfo
  */
 typedef std::map<SpectrumModelUid_t, RxSpectrumModelInfo> RxSpectrumModelInfoMap_t;
 
 /**
- * \ingroup spectrum
+ * @ingroup spectrum
  *
  * This SpectrumChannel implementation can handle the presence of
  * SpectrumPhy instances which can use
  * different spectrum models, i.e.,  different SpectrumModel.
  *
- * \note It is allowed for a receiving SpectrumPhy to switch to a
+ * @note It is allowed for a receiving SpectrumPhy to switch to a
  * different SpectrumModel during the simulation. The requirement
  * for this to work is that, after the SpectrumPhy switched its
  * SpectrumModel,  MultiModelSpectrumChannel::AddRx () is
@@ -95,8 +95,8 @@
     MultiModelSpectrumChannel();
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -119,9 +119,9 @@
      * an iterator pointing to it. If not, it creates a new entry in
      * m_txSpectrumModelInfoMap, and returns an iterator to it.
      *
-     * \param txSpectrumModel The TX SpectrumModel  being considered
+     * @param txSpectrumModel The TX SpectrumModel  being considered
      *
-     * \return An iterator pointing to the corresponding entry in m_txSpectrumModelInfoMap
+     * @return An iterator pointing to the corresponding entry in m_txSpectrumModelInfoMap
      */
     TxSpectrumModelInfoMap_t::const_iterator FindAndEventuallyAddTxSpectrumModel(
         Ptr<const SpectrumModel> txSpectrumModel);
@@ -129,10 +129,18 @@
     /**
      * Used internally to reschedule transmission after the propagation delay.
      *
-     * \param params The signal parameters.
-     * \param receiver A pointer to the receiver SpectrumPhy.
+     * @param txPsd The transmitted PSD.
+     * @param txAntennaGain The antenna gain at the transmitter.
+     * @param params The signal parameters.
+     * @param receiver A pointer to the receiver SpectrumPhy.
+     * @param availableConvertedPsds available converted PSDs from the TX PSD.
      */
-    virtual void StartRx(Ptr<SpectrumSignalParameters> params, Ptr<SpectrumPhy> receiver);
+    virtual void StartRx(
+        Ptr<SpectrumValue> txPsd,
+        double txAntennaGain,
+        Ptr<SpectrumSignalParameters> params,
+        Ptr<SpectrumPhy> receiver,
+        const std::map<SpectrumModelUid_t, Ptr<SpectrumValue>>& availableConvertedPsds);
 
     /**
      * Data structure holding, for each TX SpectrumModel,  all the
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/non-communicating-net-device.h ns-3.44/src/spectrum/model/non-communicating-net-device.h
--- ns-3.43/src/spectrum/model/non-communicating-net-device.h	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/non-communicating-net-device.h	2025-03-09 16:55:49.695372300 -0700
@@ -9,13 +9,13 @@
 #ifndef NON_COMMUNICATING_NET_DEVICE_H
 #define NON_COMMUNICATING_NET_DEVICE_H
 
-#include <ns3/address.h>
-#include <ns3/callback.h>
-#include <ns3/net-device.h>
-#include <ns3/node.h>
-#include <ns3/packet.h>
-#include <ns3/ptr.h>
-#include <ns3/traced-callback.h>
+#include "ns3/address.h"
+#include "ns3/callback.h"
+#include "ns3/net-device.h"
+#include "ns3/node.h"
+#include "ns3/packet.h"
+#include "ns3/ptr.h"
+#include "ns3/traced-callback.h"
 
 #include <cstring>
 
@@ -27,7 +27,7 @@
 class SpectrumErrorModel;
 
 /**
- * \ingroup spectrum
+ * @ingroup spectrum
  *
  * This class implements a device which does not communicate, in the
  * sense that it does not interact with the above protocol stack. The
@@ -41,8 +41,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/phased-array-spectrum-propagation-loss-model.cc ns-3.44/src/spectrum/model/phased-array-spectrum-propagation-loss-model.cc
--- ns-3.43/src/spectrum/model/phased-array-spectrum-propagation-loss-model.cc	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/phased-array-spectrum-propagation-loss-model.cc	2025-03-09 16:55:49.695372300 -0700
@@ -9,8 +9,8 @@
 
 #include "spectrum-signal-parameters.h"
 
-#include <ns3/log.h>
-#include <ns3/phased-array-model.h>
+#include "ns3/log.h"
+#include "ns3/phased-array-model.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/phased-array-spectrum-propagation-loss-model.h ns-3.44/src/spectrum/model/phased-array-spectrum-propagation-loss-model.h
--- ns-3.43/src/spectrum/model/phased-array-spectrum-propagation-loss-model.h	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/phased-array-spectrum-propagation-loss-model.h	2025-03-09 16:55:49.695372300 -0700
@@ -10,9 +10,9 @@
 
 #include "spectrum-value.h"
 
-#include <ns3/mobility-model.h>
-#include <ns3/object.h>
-#include <ns3/phased-array-model.h>
+#include "ns3/mobility-model.h"
+#include "ns3/object.h"
+#include "ns3/phased-array-model.h"
 
 namespace ns3
 {
@@ -20,9 +20,9 @@
 struct SpectrumSignalParameters;
 
 /**
- * \ingroup spectrum
+ * @ingroup spectrum
  *
- * \brief spectrum-aware propagation loss model that is
+ * @brief spectrum-aware propagation loss model that is
  * compatible with PhasedArrayModel type of ns-3 antenna
  *
  * Interface for propagation loss models to be adopted when
@@ -38,8 +38,8 @@
     ~PhasedArraySpectrumPropagationLossModel() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -86,8 +86,8 @@
      * chained together, this method will also assign streams to the
      * downstream models.
      *
-     * \param stream the stream index offset start
-     * \return the number of stream indices assigned by this model
+     * @param stream the stream index offset start
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream);
 
@@ -98,8 +98,8 @@
      *
      * Subclasses must implement this; those not using random variables can return zero.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     virtual int64_t DoAssignStreams(int64_t stream) = 0;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/single-model-spectrum-channel.cc ns-3.44/src/spectrum/model/single-model-spectrum-channel.cc
--- ns-3.43/src/spectrum/model/single-model-spectrum-channel.cc	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/single-model-spectrum-channel.cc	2025-03-09 16:55:49.695372300 -0700
@@ -12,19 +12,19 @@
 #include "spectrum-propagation-loss-model.h"
 #include "spectrum-transmit-filter.h"
 
-#include <ns3/angles.h>
-#include <ns3/antenna-model.h>
-#include <ns3/double.h>
-#include <ns3/log.h>
-#include <ns3/mobility-model.h>
-#include <ns3/net-device.h>
-#include <ns3/node.h>
-#include <ns3/object.h>
-#include <ns3/packet-burst.h>
-#include <ns3/packet.h>
-#include <ns3/propagation-delay-model.h>
-#include <ns3/propagation-loss-model.h>
-#include <ns3/simulator.h>
+#include "ns3/angles.h"
+#include "ns3/antenna-model.h"
+#include "ns3/double.h"
+#include "ns3/log.h"
+#include "ns3/mobility-model.h"
+#include "ns3/net-device.h"
+#include "ns3/node.h"
+#include "ns3/object.h"
+#include "ns3/packet-burst.h"
+#include "ns3/packet.h"
+#include "ns3/propagation-delay-model.h"
+#include "ns3/propagation-loss-model.h"
+#include "ns3/simulator.h"
 
 #include <algorithm>
 
@@ -136,7 +136,7 @@
 
         if ((*rxPhyIterator) != txParams->txPhy)
         {
-            Time delay = MicroSeconds(0);
+            Time delay;
 
             Ptr<MobilityModel> receiverMobility = (*rxPhyIterator)->GetMobility();
             NS_LOG_LOGIC("copying signal parameters " << txParams);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/single-model-spectrum-channel.h ns-3.44/src/spectrum/model/single-model-spectrum-channel.h
--- ns-3.43/src/spectrum/model/single-model-spectrum-channel.h	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/single-model-spectrum-channel.h	2025-03-09 16:55:49.695372300 -0700
@@ -12,15 +12,15 @@
 #include "spectrum-channel.h"
 #include "spectrum-model.h"
 
-#include <ns3/traced-callback.h>
+#include "ns3/traced-callback.h"
 
 namespace ns3
 {
 
 /**
- * \ingroup spectrum
+ * @ingroup spectrum
  *
- * \brief SpectrumChannel implementation which handles a single spectrum model
+ * @brief SpectrumChannel implementation which handles a single spectrum model
  *
  * All SpectrumPhy layers attached to this SpectrumChannel
  */
@@ -30,8 +30,8 @@
     SingleModelSpectrumChannel();
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -53,8 +53,8 @@
     /**
      * Used internally to reschedule transmission after the propagation delay.
      *
-     * \param params
-     * \param receiver
+     * @param params
+     * @param receiver
      */
     void StartRx(Ptr<SpectrumSignalParameters> params, Ptr<SpectrumPhy> receiver);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/spectrum-analyzer.cc ns-3.44/src/spectrum/model/spectrum-analyzer.cc
--- ns-3.43/src/spectrum/model/spectrum-analyzer.cc	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/spectrum-analyzer.cc	2025-03-09 16:55:49.695372300 -0700
@@ -8,12 +8,12 @@
 
 #include "spectrum-analyzer.h"
 
-#include <ns3/antenna-model.h>
-#include <ns3/double.h>
-#include <ns3/log.h>
-#include <ns3/object-factory.h>
-#include <ns3/simulator.h>
-#include <ns3/trace-source-accessor.h>
+#include "ns3/antenna-model.h"
+#include "ns3/double.h"
+#include "ns3/log.h"
+#include "ns3/object-factory.h"
+#include "ns3/simulator.h"
+#include "ns3/trace-source-accessor.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/spectrum-analyzer.h ns-3.44/src/spectrum/model/spectrum-analyzer.h
--- ns-3.43/src/spectrum/model/spectrum-analyzer.h	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/spectrum-analyzer.h	2025-03-09 16:55:49.695372300 -0700
@@ -13,10 +13,10 @@
 #include "spectrum-phy.h"
 #include "spectrum-value.h"
 
-#include <ns3/mobility-model.h>
-#include <ns3/net-device.h>
-#include <ns3/nstime.h>
-#include <ns3/packet.h>
+#include "ns3/mobility-model.h"
+#include "ns3/net-device.h"
+#include "ns3/nstime.h"
+#include "ns3/packet.h"
 
 #include <fstream>
 #include <string>
@@ -25,7 +25,7 @@
 {
 
 /**
- * \ingroup spectrum
+ * @ingroup spectrum
  *
  * Simple SpectrumPhy implementation that averages the spectrum power
  * density of incoming transmissions to produce a spectrogram.
@@ -41,8 +41,8 @@
     ~SpectrumAnalyzer() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -66,7 +66,7 @@
     /**
      * Set the AntennaModel to be used
      *
-     * \param a the Antenna Model
+     * @param a the Antenna Model
      */
     void SetAntenna(Ptr<AntennaModel> a);
 
@@ -100,12 +100,12 @@
 
     /**
      * Adds a signal to the data collected.
-     * \param psd signal to add
+     * @param psd signal to add
      */
     void AddSignal(Ptr<const SpectrumValue> psd);
     /**
      * Removes a signal to the data collected.
-     * \param psd signal to subtract
+     * @param psd signal to subtract
      */
     void SubtractSignal(Ptr<const SpectrumValue> psd);
     /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/spectrum-channel.cc ns-3.44/src/spectrum/model/spectrum-channel.cc
--- ns-3.43/src/spectrum/model/spectrum-channel.cc	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/spectrum-channel.cc	2025-03-09 16:55:49.695372300 -0700
@@ -8,10 +8,10 @@
 
 #include "spectrum-channel.h"
 
-#include <ns3/abort.h>
-#include <ns3/double.h>
-#include <ns3/log.h>
-#include <ns3/pointer.h>
+#include "ns3/abort.h"
+#include "ns3/double.h"
+#include "ns3/log.h"
+#include "ns3/pointer.h"
 
 namespace ns3
 {
@@ -33,9 +33,18 @@
 SpectrumChannel::DoDispose()
 {
     NS_LOG_FUNCTION(this);
+
+    // Any propagation model that holds a pointer
+    // back to the spectrum channel should not call Dispose()
+    // of its channel pointer, or else a loop may occur.
     m_propagationLoss = nullptr;
     m_propagationDelay = nullptr;
     m_spectrumPropagationLoss = nullptr;
+    if (m_phasedArraySpectrumPropagationLoss)
+    {
+        m_phasedArraySpectrumPropagationLoss->Dispose();
+    }
+    m_phasedArraySpectrumPropagationLoss = nullptr;
 }
 
 TypeId
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/spectrum-channel.h ns-3.44/src/spectrum/model/spectrum-channel.h
--- ns-3.43/src/spectrum/model/spectrum-channel.h	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/spectrum-channel.h	2025-03-09 16:55:49.695372300 -0700
@@ -15,13 +15,13 @@
 #include "spectrum-signal-parameters.h"
 #include "spectrum-transmit-filter.h"
 
-#include <ns3/channel.h>
-#include <ns3/mobility-model.h>
-#include <ns3/nstime.h>
-#include <ns3/object.h>
-#include <ns3/propagation-delay-model.h>
-#include <ns3/propagation-loss-model.h>
-#include <ns3/traced-callback.h>
+#include "ns3/channel.h"
+#include "ns3/mobility-model.h"
+#include "ns3/nstime.h"
+#include "ns3/object.h"
+#include "ns3/propagation-delay-model.h"
+#include "ns3/propagation-loss-model.h"
+#include "ns3/traced-callback.h"
 
 namespace ns3
 {
@@ -30,7 +30,7 @@
 class SpectrumValue;
 
 /**
- * \ingroup spectrum
+ * @ingroup spectrum
  *
  * Defines the interface for spectrum-aware channel implementations
  *
@@ -53,29 +53,29 @@
     void DoDispose() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
      * Add the single-frequency propagation loss model to be used
-     * \warning only models that do not depend on the TX power should be used.
+     * @warning only models that do not depend on the TX power should be used.
      *
-     * \param loss a pointer to the propagation loss model to be used.
+     * @param loss a pointer to the propagation loss model to be used.
      */
     void AddPropagationLossModel(Ptr<PropagationLossModel> loss);
 
     /**
      * Add the frequency-dependent propagation loss model to be used
-     * \param loss a pointer to the propagation loss model to be used.
+     * @param loss a pointer to the propagation loss model to be used.
      */
     void AddSpectrumPropagationLossModel(Ptr<SpectrumPropagationLossModel> loss);
 
     /**
      * Add the frequency-dependent propagation loss model
      * that is compapatible with the phased antenna arrays at the TX and RX
-     * \param loss a pointer to the propagation loss model to be used.
+     * @param loss a pointer to the propagation loss model to be used.
      */
     void AddPhasedArraySpectrumPropagationLossModel(
         Ptr<PhasedArraySpectrumPropagationLossModel> loss);
@@ -85,32 +85,32 @@
      * the simulation if there exists a previously set propagation delay model
      * (i.e., unlike propagation loss models, multiple of which can be chained
      * together, there is only one propagation delay model).
-     * \param delay Ptr to the propagation delay model to be used.
+     * @param delay Ptr to the propagation delay model to be used.
      */
     void SetPropagationDelayModel(Ptr<PropagationDelayModel> delay);
 
     /**
      * Get the frequency-dependent propagation loss model.
-     * \returns a pointer to the propagation loss model.
+     * @returns a pointer to the propagation loss model.
      */
     Ptr<SpectrumPropagationLossModel> GetSpectrumPropagationLossModel() const;
 
     /**
      * Get the frequency-dependent propagation loss model that is
      * compatible with the phased antenna arrays at TX and RX
-     * \returns a pointer to the propagation loss model.
+     * @returns a pointer to the propagation loss model.
      */
     Ptr<PhasedArraySpectrumPropagationLossModel> GetPhasedArraySpectrumPropagationLossModel() const;
 
     /**
      * Get the propagation loss model.
-     * \returns a pointer to the propagation loss model.
+     * @returns a pointer to the propagation loss model.
      */
     Ptr<PropagationLossModel> GetPropagationLossModel() const;
 
     /**
      * Get the propagation delay model that has been set on the channel.
-     * \returns a pointer to the propagation delay model.
+     * @returns a pointer to the propagation delay model.
      */
     Ptr<PropagationDelayModel> GetPropagationDelayModel() const;
 
@@ -120,21 +120,21 @@
      * times to chain multiple filters together; the last filter added will
      * be the first one used in the chain.
      *
-     * \param filter an instance of a SpectrumTransmitFilter
+     * @param filter an instance of a SpectrumTransmitFilter
      */
     void AddSpectrumTransmitFilter(Ptr<SpectrumTransmitFilter> filter);
 
     /**
      * Get the transmit filter, or first in a chain of transmit filters
      * if more than one is present.
-     * \returns a pointer to the transmit filter.
+     * @returns a pointer to the transmit filter.
      */
     Ptr<SpectrumTransmitFilter> GetSpectrumTransmitFilter() const;
 
     /**
      * Used by attached PHY instances to transmit signals on the channel
      *
-     * \param params the parameters of the signals being transmitted
+     * @param params the parameters of the signals being transmitted
      */
     virtual void StartTx(Ptr<SpectrumSignalParameters> params) = 0;
 
@@ -147,13 +147,13 @@
      * objects), the base class of that object is responsible for ensuring
      * that all models in the chain have AssignStreams recursively called.
      *
-     * \param stream the stream index offset start
-     * \return the number of stream indices assigned by this model
+     * @param stream the stream index offset start
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream);
 
     /**
-     * \brief Remove a SpectrumPhy from a channel
+     * @brief Remove a SpectrumPhy from a channel
      *
      * This method is used to detach a SpectrumPhy instance from a
      * SpectrumChannel instance, so that the SpectrumPhy does not receive
@@ -168,7 +168,7 @@
     virtual void RemoveRx(Ptr<SpectrumPhy> phy) = 0;
 
     /**
-     * \brief Add a SpectrumPhy to a channel, so it can receive packets
+     * @brief Add a SpectrumPhy to a channel, so it can receive packets
      *
      * This method is used to attach a SpectrumPhy instance to a
      * SpectrumChannel instance, so that the SpectrumPhy can receive
@@ -179,7 +179,7 @@
      * This method is to be implemented by all classes inheriting from
      * SpectrumChannel.
      *
-     * \param phy the SpectrumPhy instance to be added to the channel as
+     * @param phy the SpectrumPhy instance to be added to the channel as
      * a receiver.
      */
     virtual void AddRx(Ptr<SpectrumPhy> phy) = 0;
@@ -187,9 +187,9 @@
     /**
      * TracedCallback signature for path loss calculation events.
      *
-     * \param [in] txPhy The TX SpectrumPhy instance.
-     * \param [in] rxPhy The RX SpectrumPhy instance.
-     * \param [in] lossDb The loss value, in dB.
+     * @param [in] txPhy The TX SpectrumPhy instance.
+     * @param [in] rxPhy The RX SpectrumPhy instance.
+     * @param [in] lossDb The loss value, in dB.
      */
     typedef void (*LossTracedCallback)(Ptr<const SpectrumPhy> txPhy,
                                        Ptr<const SpectrumPhy> rxPhy,
@@ -197,12 +197,12 @@
     /**
      * TracedCallback signature for path loss calculation events.
      *
-     * \param [in] txMobility The mobility model of the transmitter.
-     * \param [in] rxMobility The mobility model of the receiver.
-     * \param [in] txAntennaGain The transmitter antenna gain, in dB.
-     * \param [in] rxAntennaGain The receiver antenna gain, in dB.
-     * \param [in] propagationGain The propagation gain, in dB.
-     * \param [in] pathloss The path loss value, in dB.
+     * @param [in] txMobility The mobility model of the transmitter.
+     * @param [in] rxMobility The mobility model of the receiver.
+     * @param [in] txAntennaGain The transmitter antenna gain, in dB.
+     * @param [in] rxAntennaGain The receiver antenna gain, in dB.
+     * @param [in] propagationGain The propagation gain, in dB.
+     * @param [in] pathloss The path loss value, in dB.
      */
     typedef void (*GainTracedCallback)(Ptr<const MobilityModel> txMobility,
                                        Ptr<const MobilityModel> rxMobility,
@@ -213,7 +213,7 @@
     /**
      * TracedCallback signature for Ptr<const SpectrumSignalParameters>.
      *
-     * \param [in] params SpectrumSignalParameters instance.
+     * @param [in] params SpectrumSignalParameters instance.
      */
     typedef void (*SignalParametersTracedCallback)(Ptr<SpectrumSignalParameters> params);
 
@@ -222,8 +222,8 @@
      * This provides a base class implementation that may be subclassed
      * if needed by subclasses that might need additional stream assignments.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     virtual int64_t DoAssignStreams(int64_t stream);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/spectrum-converter.cc ns-3.44/src/spectrum/model/spectrum-converter.cc
--- ns-3.43/src/spectrum/model/spectrum-converter.cc	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/spectrum-converter.cc	2025-03-09 16:55:49.695372300 -0700
@@ -8,8 +8,8 @@
 
 #include "spectrum-converter.h"
 
-#include <ns3/assert.h>
-#include <ns3/log.h>
+#include "ns3/assert.h"
+#include "ns3/log.h"
 
 #include <algorithm>
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/spectrum-converter.h ns-3.44/src/spectrum/model/spectrum-converter.h
--- ns-3.43/src/spectrum/model/spectrum-converter.h	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/spectrum-converter.h	2025-03-09 16:55:49.695372300 -0700
@@ -15,7 +15,7 @@
 {
 
 /**
- * \ingroup spectrum
+ * @ingroup spectrum
  *
  * Class which implements a converter between SpectrumValue which are
  * defined over different SpectrumModel. In more formal terms, this class
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/spectrum-error-model.cc ns-3.44/src/spectrum/model/spectrum-error-model.cc
--- ns-3.43/src/spectrum/model/spectrum-error-model.cc	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/spectrum-error-model.cc	2025-03-09 16:55:49.695372300 -0700
@@ -8,8 +8,8 @@
 
 #include "spectrum-error-model.h"
 
-#include <ns3/log.h>
-#include <ns3/nstime.h>
+#include "ns3/log.h"
+#include "ns3/nstime.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/spectrum-error-model.h ns-3.44/src/spectrum/model/spectrum-error-model.h
--- ns-3.43/src/spectrum/model/spectrum-error-model.h	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/spectrum-error-model.h	2025-03-09 16:55:49.695372300 -0700
@@ -11,16 +11,16 @@
 
 #include "spectrum-value.h"
 
-#include <ns3/nstime.h>
-#include <ns3/object.h>
-#include <ns3/packet.h>
-#include <ns3/ptr.h>
+#include "ns3/nstime.h"
+#include "ns3/object.h"
+#include "ns3/packet.h"
+#include "ns3/ptr.h"
 
 namespace ns3
 {
 
 /**
- * \ingroup spectrum
+ * @ingroup spectrum
  *
  */
 class SpectrumErrorModel : public Object
@@ -28,33 +28,33 @@
   public:
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
     ~SpectrumErrorModel() override;
 
     /**
      * Start a packet reception
-     * \param p the packet
+     * @param p the packet
      */
     virtual void StartRx(Ptr<const Packet> p) = 0;
 
     /**
      * Evaluates a chunk
-     * \param sinr the SpectrumValue experienced by the Chunk
-     * \param duration the Chunk length
+     * @param sinr the SpectrumValue experienced by the Chunk
+     * @param duration the Chunk length
      */
     virtual void EvaluateChunk(const SpectrumValue& sinr, Time duration) = 0;
 
     /**
      * Checks if the packet being received is correct
-     * \returns true if the packet is correct.
+     * @returns true if the packet is correct.
      */
     virtual bool IsRxCorrect() = 0;
 };
 
 /**
- * \ingroup spectrum
+ * @ingroup spectrum
  *
  * This class implements the error model described in this paper:
  * N. Baldo and M. Miozzo, "Spectrum-aware Channel and PHY layer modeling
@@ -69,7 +69,7 @@
   public:
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
     // inherited from SpectrumErrorModel
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/spectrum-interference.cc ns-3.44/src/spectrum/model/spectrum-interference.cc
--- ns-3.43/src/spectrum/model/spectrum-interference.cc	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/spectrum-interference.cc	2025-03-09 16:55:49.695372300 -0700
@@ -10,8 +10,8 @@
 
 #include "spectrum-error-model.h"
 
-#include <ns3/log.h>
-#include <ns3/simulator.h>
+#include "ns3/log.h"
+#include "ns3/simulator.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/spectrum-interference.h ns-3.44/src/spectrum/model/spectrum-interference.h
--- ns-3.43/src/spectrum/model/spectrum-interference.h	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/spectrum-interference.h	2025-03-09 16:55:49.695372300 -0700
@@ -11,9 +11,9 @@
 
 #include "spectrum-value.h"
 
-#include <ns3/nstime.h>
-#include <ns3/object.h>
-#include <ns3/packet.h>
+#include "ns3/nstime.h"
+#include "ns3/object.h"
+#include "ns3/packet.h"
 
 namespace ns3
 {
@@ -21,7 +21,7 @@
 class SpectrumErrorModel;
 
 /**
- * \ingroup spectrum
+ * @ingroup spectrum
  *
  * This class implements a gaussian interference model, i.e., all
  * incoming signals are added to the total interference.
@@ -35,7 +35,7 @@
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/spectrum-model-300kHz-300GHz-log.cc ns-3.44/src/spectrum/model/spectrum-model-300kHz-300GHz-log.cc
--- ns-3.43/src/spectrum/model/spectrum-model-300kHz-300GHz-log.cc	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/spectrum-model-300kHz-300GHz-log.cc	2025-03-09 16:55:49.695372300 -0700
@@ -12,36 +12,19 @@
 {
 
 /**
- * \ingroup spectrum
- * Spectrum model logger for frequencies between 300 Khz 300 Ghz
+ * @ingroup spectrum
+ * Spectrum model logger for frequencies between 300 KHz 300 GHz
  */
-Ptr<SpectrumModel> SpectrumModel300Khz300GhzLog;
-
-/**
- * \ingroup spectrum
- *
- * Static initializer class for Spectrum model logger
- * for frequencies between 300 Khz 300 Ghz
- */
-class static_SpectrumModel300Khz300GhzLog_initializer
+Ptr<SpectrumModel>
+SpectrumModel300Khz300GhzLog()
 {
-  public:
-    static_SpectrumModel300Khz300GhzLog_initializer()
+    std::vector<double> freqs;
+    for (double f = 3e5; f < 3e11; f = f * 2)
     {
-        std::vector<double> freqs;
-        for (double f = 3e5; f < 3e11; f = f * 2)
-        {
-            freqs.push_back(f);
-        }
-        SpectrumModel300Khz300GhzLog = Create<SpectrumModel>(freqs);
+        freqs.push_back(f);
     }
-};
-
-/**
- * \ingroup spectrum
- * Static variable for analyzer initialization
- */
-static_SpectrumModel300Khz300GhzLog_initializer
-    g_static_SpectrumModel300Khz300GhzLog_initializer_instance;
+    static Ptr<SpectrumModel> model = Create<SpectrumModel>(freqs);
+    return model;
+}
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/spectrum-model-300kHz-300GHz-log.h ns-3.44/src/spectrum/model/spectrum-model-300kHz-300GHz-log.h
--- ns-3.43/src/spectrum/model/spectrum-model-300kHz-300GHz-log.h	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/spectrum-model-300kHz-300GHz-log.h	2025-03-09 16:55:49.695372300 -0700
@@ -14,8 +14,12 @@
 namespace ns3
 {
 
-extern Ptr<SpectrumModel> SpectrumModel300Khz300GhzLog;
+/**
+ * @brief Spectrum model logger for frequencies between 300 KHz 300 GHz
+ * @return Spectrum model with a range of 300 KHz to 300 GHz for center frequencies
+ */
+Ptr<SpectrumModel> SpectrumModel300Khz300GhzLog();
 
-}
+} // namespace ns3
 
 #endif /*  FREQS_300KHZ_300GHZ_LOG_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/spectrum-model.cc ns-3.44/src/spectrum/model/spectrum-model.cc
--- ns-3.43/src/spectrum/model/spectrum-model.cc	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/spectrum-model.cc	2025-03-09 16:55:49.695372300 -0700
@@ -9,8 +9,8 @@
 
 #include "spectrum-model.h"
 
-#include <ns3/assert.h>
-#include <ns3/log.h>
+#include "ns3/assert.h"
+#include "ns3/log.h"
 
 #include <cmath>
 #include <cstddef>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/spectrum-model.h ns-3.44/src/spectrum/model/spectrum-model.h
--- ns-3.43/src/spectrum/model/spectrum-model.h	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/spectrum-model.h	2025-03-09 16:55:49.695372300 -0700
@@ -9,7 +9,7 @@
 #ifndef SPECTRUM_MODEL_H
 #define SPECTRUM_MODEL_H
 
-#include <ns3/simple-ref-count.h>
+#include "ns3/simple-ref-count.h"
 
 #include <cstddef>
 #include <vector>
@@ -18,17 +18,17 @@
 {
 
 /**
- * \defgroup spectrum Spectrum Models
+ * @defgroup spectrum Spectrum Models
  */
 
 /**
- * \ingroup spectrum
- * \ingroup tests
- * \defgroup spectrum-tests Spectrum Models tests
+ * @ingroup spectrum
+ * @ingroup tests
+ * @defgroup spectrum-tests Spectrum Models tests
  */
 
 /**
- * \ingroup spectrum
+ * @ingroup spectrum
  *
  * The building block of a SpectrumModel. This struct models
  * a frequency band defined by the frequency interval [fl, fc] and
@@ -63,9 +63,9 @@
   public:
     /**
      * Comparison operator. Returns true if the two SpectrumModels are identical
-     * \param lhs left operand
-     * \param rhs right operand
-     * \returns true if the two operands are identical
+     * @param lhs left operand
+     * @param rhs right operand
+     * @returns true if the two operands are identical
      */
     friend bool operator==(const SpectrumModel& lhs, const SpectrumModel& rhs);
 
@@ -125,8 +125,8 @@
     /**
      * Check if another SpectrumModels has bands orthogonal to our bands.
      *
-     * \param other another SpectrumModel
-     * \returns true if bands are orthogonal
+     * @param other another SpectrumModel
+     * @returns true if bands are orthogonal
      */
     bool IsOrthogonal(const SpectrumModel& other) const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/spectrum-model-ism2400MHz-res1MHz.cc ns-3.44/src/spectrum/model/spectrum-model-ism2400MHz-res1MHz.cc
--- ns-3.43/src/spectrum/model/spectrum-model-ism2400MHz-res1MHz.cc	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/spectrum-model-ism2400MHz-res1MHz.cc	2025-03-09 16:55:49.695372300 -0700
@@ -12,39 +12,20 @@
 {
 
 /**
- * \ingroup spectrum
+ * @ingroup spectrum
  * Spectrum model logger for frequencies in the 2.4 GHz ISM band
  * with 1 MHz resolution.
  */
-Ptr<SpectrumModel> SpectrumModelIsm2400MhzRes1Mhz;
-
-/**
- * \ingroup spectrum
- *
- * Static initializer class for Spectrum model logger for
- * frequencies in the 2.4 GHz ISM band with 1 MHz resolution.
- */
-class static_SpectrumModelIsm2400MhzRes1Mhz_initializer
+Ptr<SpectrumModel>
+SpectrumModelIsm2400MhzRes1Mhz()
 {
-  public:
-    static_SpectrumModelIsm2400MhzRes1Mhz_initializer()
+    std::vector<double> freqs(100);
+    for (int i = 0; i < 100; ++i)
     {
-        std::vector<double> freqs;
-        freqs.reserve(100);
-        for (int i = 0; i < 100; ++i)
-        {
-            freqs.push_back((i + 2400) * 1e6);
-        }
-
-        SpectrumModelIsm2400MhzRes1Mhz = Create<SpectrumModel>(freqs);
+        freqs[i] = ((i + 2400) * 1e6);
     }
-};
-
-/**
- * \ingroup spectrum
- * Static variable for analyzer initialization
- */
-static_SpectrumModelIsm2400MhzRes1Mhz_initializer
-    g_static_SpectrumModelIsm2400MhzRes1Mhz_initializer_instance;
+    static Ptr<SpectrumModel> model = Create<SpectrumModel>(freqs);
+    return model;
+}
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/spectrum-model-ism2400MHz-res1MHz.h ns-3.44/src/spectrum/model/spectrum-model-ism2400MHz-res1MHz.h
--- ns-3.43/src/spectrum/model/spectrum-model-ism2400MHz-res1MHz.h	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/spectrum-model-ism2400MHz-res1MHz.h	2025-03-09 16:55:49.695372300 -0700
@@ -14,8 +14,13 @@
 namespace ns3
 {
 
-extern Ptr<SpectrumModel> SpectrumModelIsm2400MhzRes1Mhz;
+/**
+ * @brief Spectrum model logger for frequencies in the 2.4 GHz ISM band
+ * with 1 MHz resolution.
+ * @return Spectrum model for 2.4 GHz ISM band
+ */
+Ptr<SpectrumModel> SpectrumModelIsm2400MhzRes1Mhz();
 
-}
+} // namespace ns3
 
 #endif /* FREQS_ISM2400MHZ_RES1MHZ_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/spectrum-phy.cc ns-3.44/src/spectrum/model/spectrum-phy.cc
--- ns-3.43/src/spectrum/model/spectrum-phy.cc	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/spectrum-phy.cc	2025-03-09 16:55:49.695372300 -0700
@@ -11,9 +11,9 @@
 #include "spectrum-channel.h"
 #include "spectrum-value.h"
 
-#include <ns3/log.h>
-#include <ns3/mobility-model.h>
-#include <ns3/net-device.h>
+#include "ns3/log.h"
+#include "ns3/mobility-model.h"
+#include "ns3/net-device.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/spectrum-phy.h ns-3.44/src/spectrum/model/spectrum-phy.h
--- ns-3.43/src/spectrum/model/spectrum-phy.h	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/spectrum-phy.h	2025-03-09 16:55:49.695372300 -0700
@@ -9,8 +9,8 @@
 #ifndef SPECTRUM_PHY_H
 #define SPECTRUM_PHY_H
 
-#include <ns3/nstime.h>
-#include <ns3/object.h>
+#include "ns3/nstime.h"
+#include "ns3/object.h"
 
 namespace ns3
 {
@@ -26,7 +26,7 @@
 struct SpectrumSignalParameters;
 
 /**
- * \ingroup spectrum
+ * @ingroup spectrum
  *
  * Abstract base class for Spectrum-aware PHY layers
  *
@@ -42,8 +42,8 @@
     SpectrumPhy& operator=(const SpectrumPhy&) = delete;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -91,7 +91,7 @@
     virtual Ptr<const SpectrumModel> GetRxSpectrumModel() const = 0;
 
     /**
-     * \brief Get the AntennaModel used by this SpectrumPhy instance for
+     * @brief Get the AntennaModel used by this SpectrumPhy instance for
      * transmission and/or reception
      *
      * Note that in general and depending on each module design, there can be
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/spectrum-propagation-loss-model.cc ns-3.44/src/spectrum/model/spectrum-propagation-loss-model.cc
--- ns-3.43/src/spectrum/model/spectrum-propagation-loss-model.cc	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/spectrum-propagation-loss-model.cc	2025-03-09 16:55:49.695372300 -0700
@@ -10,7 +10,7 @@
 
 #include "spectrum-signal-parameters.h"
 
-#include <ns3/log.h>
+#include "ns3/log.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/spectrum-propagation-loss-model.h ns-3.44/src/spectrum/model/spectrum-propagation-loss-model.h
--- ns-3.43/src/spectrum/model/spectrum-propagation-loss-model.h	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/spectrum-propagation-loss-model.h	2025-03-09 16:55:49.695372300 -0700
@@ -11,8 +11,8 @@
 
 #include "spectrum-value.h"
 
-#include <ns3/mobility-model.h>
-#include <ns3/object.h>
+#include "ns3/mobility-model.h"
+#include "ns3/object.h"
 
 namespace ns3
 {
@@ -20,9 +20,9 @@
 struct SpectrumSignalParameters;
 
 /**
- * \ingroup spectrum
+ * @ingroup spectrum
  *
- * \brief spectrum-aware propagation loss model
+ * @brief spectrum-aware propagation loss model
  *
  * Interface for propagation loss models to be adopted when
  * transmissions are modeled with a power spectral density by means of
@@ -36,8 +36,8 @@
     ~SpectrumPropagationLossModel() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -77,8 +77,8 @@
      * together, this method will also assign streams to the
      * downstream models.
      *
-     * \param stream the stream index offset start
-     * \return the number of stream indices assigned by this model
+     * @param stream the stream index offset start
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream);
 
@@ -89,8 +89,8 @@
      *
      * Subclasses must implement this; those not using random variables can return zero.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     virtual int64_t DoAssignStreams(int64_t stream) = 0;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/spectrum-signal-parameters.cc ns-3.44/src/spectrum/model/spectrum-signal-parameters.cc
--- ns-3.43/src/spectrum/model/spectrum-signal-parameters.cc	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/spectrum-signal-parameters.cc	2025-03-09 16:55:49.695372300 -0700
@@ -11,8 +11,8 @@
 #include "spectrum-phy.h"
 #include "spectrum-value.h"
 
-#include <ns3/antenna-model.h>
-#include <ns3/log.h>
+#include "ns3/antenna-model.h"
+#include "ns3/log.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/spectrum-signal-parameters.h ns-3.44/src/spectrum/model/spectrum-signal-parameters.h
--- ns-3.43/src/spectrum/model/spectrum-signal-parameters.h	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/spectrum-signal-parameters.h	2025-03-09 16:55:49.695372300 -0700
@@ -9,8 +9,8 @@
 #ifndef SPECTRUM_SIGNAL_PARAMETERS_H
 #define SPECTRUM_SIGNAL_PARAMETERS_H
 
-#include <ns3/matrix-array.h>
-#include <ns3/nstime.h>
+#include "ns3/matrix-array.h"
+#include "ns3/nstime.h"
 
 namespace ns3
 {
@@ -20,7 +20,7 @@
 class AntennaModel;
 
 /**
- * \ingroup spectrum
+ * @ingroup spectrum
  *
  * This struct provides the generic signal representation to be used by
  * all wireless technologies. Any specific wireless technology is
@@ -35,7 +35,7 @@
  * directly from this struct, each PHY can test (by using a dynamic
  * cast) if a signal being received belongs to a given technology or not.
  *
- * \note when inheriting from this class, make sure that the assignment operator and the copy
+ * @note when inheriting from this class, make sure that the assignment operator and the copy
  * constructor work properly, making deep copies if needed.
  */
 struct SpectrumSignalParameters : public SimpleRefCount<SpectrumSignalParameters>
@@ -52,7 +52,7 @@
 
     /**
      * copy constructor
-     * \param p object to copy
+     * @param p object to copy
      */
     SpectrumSignalParameters(const SpectrumSignalParameters& p);
 
@@ -65,7 +65,7 @@
      * SpectrumSignalParameters should override this method and use it
      * to call the copy constructor of the derived class.
      *
-     * \return a copy of the (possibly derived) class
+     * @return a copy of the (possibly derived) class
      */
     virtual Ptr<SpectrumSignalParameters> Copy() const;
 
@@ -76,7 +76,7 @@
      * underwater acoustic communications. Other transmission media to
      * be defined.
      *
-     * \note when SpectrumSignalParameters is copied, only the pointer to the PSD will be copied.
+     * @note when SpectrumSignalParameters is copied, only the pointer to the PSD will be copied.
      * This is because SpectrumChannel objects normally overwrite the psd anyway, so there is no
      * point in making a copy.
      */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/spectrum-transmit-filter.cc ns-3.44/src/spectrum/model/spectrum-transmit-filter.cc
--- ns-3.43/src/spectrum/model/spectrum-transmit-filter.cc	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/spectrum-transmit-filter.cc	2025-03-09 16:55:49.695372300 -0700
@@ -10,7 +10,7 @@
 #include "spectrum-phy.h"
 #include "spectrum-signal-parameters.h"
 
-#include <ns3/log.h>
+#include "ns3/log.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/spectrum-transmit-filter.h ns-3.44/src/spectrum/model/spectrum-transmit-filter.h
--- ns-3.43/src/spectrum/model/spectrum-transmit-filter.h	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/spectrum-transmit-filter.h	2025-03-09 16:55:49.695372300 -0700
@@ -7,7 +7,7 @@
 #ifndef SPECTRUM_TRANSMIT_FILTER_H
 #define SPECTRUM_TRANSMIT_FILTER_H
 
-#include <ns3/object.h>
+#include "ns3/object.h"
 
 namespace ns3
 {
@@ -16,9 +16,9 @@
 class SpectrumPhy;
 
 /**
- * \ingroup spectrum
+ * @ingroup spectrum
  *
- * \brief spectrum-aware transmit filter object
+ * @brief spectrum-aware transmit filter object
  *
  * Interface for transmit filters that permit an early discard of signal
  * reception before propagation loss models or receiving Phy objects have
@@ -31,8 +31,8 @@
     SpectrumTransmitFilter();
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -40,14 +40,14 @@
      * Add a transmit filter to be consulted next if this filter does not
      * filter the signal
      *
-     * \param next next transmit filter to add to the chain
+     * @param next next transmit filter to add to the chain
      */
     void SetNext(Ptr<SpectrumTransmitFilter> next);
 
     /**
      * Return the next transmit filter in the chain
      *
-     * \return next transmit filter in the chain
+     * @return next transmit filter in the chain
      */
     Ptr<const SpectrumTransmitFilter> GetNext() const;
 
@@ -56,10 +56,10 @@
      * instead be filtered (discarded) before being processed in this channel
      * and on the receiving Phy.
      *
-     * \param params the spectrum signal parameters.
-     * \param receiverPhy pointer to the receiving SpectrumPhy
+     * @param params the spectrum signal parameters.
+     * @param receiverPhy pointer to the receiving SpectrumPhy
      *
-     * \return whether to perform filtering of the signal
+     * @return whether to perform filtering of the signal
      */
     bool Filter(Ptr<const SpectrumSignalParameters> params, Ptr<const SpectrumPhy> receiverPhy);
 
@@ -71,8 +71,8 @@
      * together, this method will also assign streams to the
      * downstream models.
      *
-     * \param stream the stream index offset start
-     * \return the number of stream indices assigned by this model
+     * @param stream the stream index offset start
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream);
 
@@ -83,8 +83,8 @@
      *
      * Subclasses must implement this; those not using random variables can return zero.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     virtual int64_t DoAssignStreams(int64_t stream) = 0;
 
@@ -94,10 +94,10 @@
      * instead be filtered (discarded) before being processed in this channel
      * and on the receiving Phy.
      *
-     * \param params the spectrum signal parameters.
-     * \param receiverPhy pointer to the receiving SpectrumPhy
+     * @param params the spectrum signal parameters.
+     * @param receiverPhy pointer to the receiving SpectrumPhy
      *
-     * \return whether to perform filtering of the signal
+     * @return whether to perform filtering of the signal
      */
     virtual bool DoFilter(Ptr<const SpectrumSignalParameters> params,
                           Ptr<const SpectrumPhy> receiverPhy) = 0;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/spectrum-value.cc ns-3.44/src/spectrum/model/spectrum-value.cc
--- ns-3.43/src/spectrum/model/spectrum-value.cc	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/spectrum-value.cc	2025-03-09 16:55:49.695372300 -0700
@@ -9,8 +9,8 @@
 
 #include "spectrum-value.h"
 
-#include <ns3/log.h>
-#include <ns3/math.h>
+#include "ns3/log.h"
+#include "ns3/math.h"
 
 namespace ns3
 {
@@ -374,10 +374,10 @@
 }
 
 /**
- * \brief Output stream operator
- * \param os output stream
- * \param pvf the SpectrumValue to print
- * \return an output stream
+ * @brief Output stream operator
+ * @param os output stream
+ * @param pvf the SpectrumValue to print
+ * @return an output stream
  */
 std::ostream&
 operator<<(std::ostream& os, const SpectrumValue& pvf)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/spectrum-value.h ns-3.44/src/spectrum/model/spectrum-value.h
--- ns-3.43/src/spectrum/model/spectrum-value.h	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/spectrum-value.h	2025-03-09 16:55:49.695372300 -0700
@@ -11,8 +11,8 @@
 
 #include "spectrum-model.h"
 
-#include <ns3/ptr.h>
-#include <ns3/simple-ref-count.h>
+#include "ns3/ptr.h"
+#include "ns3/simple-ref-count.h"
 
 #include <ostream>
 #include <vector>
@@ -24,9 +24,9 @@
 typedef std::vector<double> Values;
 
 /**
- * \ingroup spectrum
+ * @ingroup spectrum
  *
- * \brief Set of values corresponding to a given SpectrumModel
+ * @brief Set of values corresponding to a given SpectrumModel
  *
  * This class implements a Function Space which can represent any
  * function \f$ g: F \in {\sf
@@ -143,14 +143,14 @@
     Values::iterator ValuesEnd();
 
     /**
-     * \brief Get the number of values stored in the array
-     * \return the values array size
+     * @brief Get the number of values stored in the array
+     * @return the values array size
      */
     uint32_t GetValuesN() const;
 
     /**
      * Directly set the values using the std::vector<double>
-     * \param values a reference to the std::vector<double>
+     * @param values a reference to the std::vector<double>
      */
     inline void SetValues(Values& values)
     {
@@ -162,7 +162,7 @@
 
     /**
      * Directly set the values by moving the values from the input std::vector<double>
-     * \param values a reference to the std::vector<double> to be moved
+     * @param values a reference to the std::vector<double> to be moved
      */
     inline void SetValues(Values&& values)
     {
@@ -173,9 +173,9 @@
     }
 
     /**
-     * \brief Provides the direct access to the underlying std::vector<double>
+     * @brief Provides the direct access to the underlying std::vector<double>
      * that stores the spectrum values.
-     * \return a reference to the stored values
+     * @return a reference to the stored values
      */
     inline Values& GetValues()
     {
@@ -183,9 +183,9 @@
     }
 
     /**
-     * \brief Provides the direct read-only access to the underlying std::vector<double>
+     * @brief Provides the direct read-only access to the underlying std::vector<double>
      * that stores the spectrum values.
-     * \return a const reference to the stored values
+     * @return a const reference to the stored values
      */
     inline const Values& GetValues() const
     {
@@ -193,9 +193,9 @@
     }
 
     /**
-     * \brief Get the value element at the position
-     * \param pos position
-     * \return the value element in that position (with bounds checking)
+     * @brief Get the value element at the position
+     * @param pos position
+     * @return the value element in that position (with bounds checking)
      */
     const double& ValuesAt(uint32_t pos) const;
 
@@ -553,8 +553,8 @@
     /**
      *  TracedCallback signature for SpectrumValue.
      *
-     * \param [in] value Value of the traced variable.
-     * \deprecated The non-const \c Ptr<SpectrumPhy> argument
+     * @param [in] value Value of the traced variable.
+     * @deprecated The non-const \c Ptr<SpectrumPhy> argument
      * is deprecated and will be changed to \c Ptr<const SpectrumPhy>
      * in a future release.
      */
@@ -564,42 +564,42 @@
   private:
     /**
      * Add a SpectrumValue (element to element addition)
-     * \param x SpectrumValue
+     * @param x SpectrumValue
      */
     void Add(const SpectrumValue& x);
     /**
      * Add a flat value to all the current elements
-     * \param s flat value
+     * @param s flat value
      */
     void Add(double s);
     /**
      * Subtracts a SpectrumValue (element by element subtraction)
-     * \param x SpectrumValue
+     * @param x SpectrumValue
      */
     void Subtract(const SpectrumValue& x);
     /**
      * Subtracts a flat value to all the current elements
-     * \param s flat value
+     * @param s flat value
      */
     void Subtract(double s);
     /**
      * Multiplies for a SpectrumValue (element to element multiplication)
-     * \param x SpectrumValue
+     * @param x SpectrumValue
      */
     void Multiply(const SpectrumValue& x);
     /**
      * Multiplies for a flat value to all the current elements
-     * \param s flat value
+     * @param s flat value
      */
     void Multiply(double s);
     /**
      * Divides by a SpectrumValue (element to element division)
-     * \param x SpectrumValue
+     * @param x SpectrumValue
      */
     void Divide(const SpectrumValue& x);
     /**
      * Divides by a flat value to all the current elements
-     * \param s flat value
+     * @param s flat value
      */
     void Divide(double s);
     /**
@@ -608,25 +608,25 @@
     void ChangeSign();
     /**
      * Shift the values to the left
-     * \param n number of positions to shift
+     * @param n number of positions to shift
      */
     void ShiftLeft(int n);
     /**
      * Shift the values to the right
-     * \param n number of positions to shift
+     * @param n number of positions to shift
      */
     void ShiftRight(int n);
     /**
      * Modifies each element so that it each element is raised to the exponent
      *
-     * \param exp the exponent
+     * @param exp the exponent
      */
     void Pow(double exp);
     /**
      * Modifies each element so that it is
      * the base raised to each element value
      *
-     * \param base the base
+     * @param base the base
      */
     void Exp(double base);
     /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/three-gpp-channel-model.cc ns-3.44/src/spectrum/model/three-gpp-channel-model.cc
--- ns-3.43/src/spectrum/model/three-gpp-channel-model.cc	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/three-gpp-channel-model.cc	2025-03-09 16:55:49.695372300 -0700
@@ -18,8 +18,9 @@
 #include "ns3/node.h"
 #include "ns3/phased-array-model.h"
 #include "ns3/pointer.h"
+#include "ns3/shuffle.h"
+#include "ns3/simulator.h"
 #include "ns3/string.h"
-#include <ns3/simulator.h>
 
 #include <algorithm>
 #include <array>
@@ -713,48 +714,48 @@
  * the quantized elevation angle.
  * The inner vector collects the table3gpp values.
  */
-static const std::map<std::string, std::map<int, std::array<float, 20>>> NTNDenseUrbanNLOS{
+static const std::map<std::string, std::map<int, std::array<float, 22>>> NTNDenseUrbanNLOS{
     {"S",
      {
-         {10, {-6.84, 0.82, -2.08, 0.87, 1.0,  1.6, 1.0, 0.63, -2.08, 0.58,
-               2.3,   23.8, 4.4,   4.0,  20.0, 3.9, 0.0, 15.0, 7.0,   3.0}},
-         {20, {-6.81, 0.61, -1.68, 0.73, 1.44, 0.87, 0.94, 0.65, -1.66, 0.5,
-               2.3,   21.9, 6.3,   4.0,  20.0, 3.9,  0.0,  15.0, 7.0,   3.0}},
-         {30, {-6.94, 0.49, -1.46, 0.53, 1.54, 0.64, 1.15, 0.42, -1.48, 0.4,
-               2.3,   19.7, 8.1,   4.0,  20.0, 3.9,  0.0,  15.0, 7.0,   3.0}},
-         {40, {-7.14, 0.49, -1.43, 0.5, 1.53, 0.56, 1.35, 0.28, -1.46, 0.37,
-               2.3,   18.1, 9.3,   4.0, 20.0, 3.9,  0.0,  15.0, 7.0,   3.0}},
-         {50, {-7.34, 0.51, -1.44, 0.58, 1.48, 0.54, 1.44, 0.25, -1.53, 0.47,
-               2.3,   16.3, 11.5,  4.0,  20.0, 3.9,  0.0,  15.0, 7.0,   3.0}},
-         {60, {-7.53, 0.47, -1.33, 0.49, 1.39, 0.68, 1.56, 0.16, -1.61, 0.43,
-               2.3,   14.0, 13.3,  4.0,  20.0, 3.9,  0.0,  15.0, 7.0,   3.0}},
-         {70, {-7.67, 0.44, -1.31, 0.65, 1.42, 0.55, 1.64, 0.18, -1.77, 0.5,
-               2.3,   12.1, 14.9,  4.0,  20.0, 3.9,  0.0,  15.0, 7.0,   3.0}},
-         {80, {-7.82, 0.42, -1.11, 0.69, 1.38, 0.6, 1.7, 0.09, -1.9, 0.42,
-               2.3,   8.7,  17.0,  4.0,  20.0, 3.9, 0.0, 15.0, 7.0,  3.0}},
-         {90, {-7.84, 0.55, -0.11, 0.53, 1.23, 0.6, 1.7, 0.17, -1.99, 0.5,
-               2.3,   6.4,  12.3,  4.0,  20.0, 3.9, 0.0, 15.0, 7.0,   3.0}},
+         {10, {-6.84, 0.82, -2.08, 0.87, 1.0, 1.6,  1.0, 0.63, -2.08, 0.58, 0.0,
+               0.0,   2.3,  23.8,  4.4,  4.0, 20.0, 3.9, 0.0,  15.0,  7.0,  3.0}},
+         {20, {-6.81, 0.61, -1.68, 0.73, 1.44, 0.87, 0.94, 0.65, -1.66, 0.5, 0.0,
+               0.0,   2.3,  21.9,  6.3,  4.0,  20.0, 3.9,  0.0,  15.0,  7.0, 3.0}},
+         {30, {-6.94, 0.49, -1.46, 0.53, 1.54, 0.64, 1.15, 0.42, -1.48, 0.4, 0.0,
+               0.0,   2.3,  19.7,  8.1,  4.0,  20.0, 3.9,  0.0,  15.0,  7.0, 3.0}},
+         {40, {-7.14, 0.49, -1.43, 0.5, 1.53, 0.56, 1.35, 0.28, -1.46, 0.37, 0.0,
+               0.0,   2.3,  18.1,  9.3, 4.0,  20.0, 3.9,  0.0,  15.0,  7.0,  3.0}},
+         {50, {-7.34, 0.51, -1.44, 0.58, 1.48, 0.54, 1.44, 0.25, -1.53, 0.47, 0.0,
+               0.0,   2.3,  16.3,  11.5, 4.0,  20.0, 3.9,  0.0,  15.0,  7.0,  3.0}},
+         {60, {-7.53, 0.47, -1.33, 0.49, 1.39, 0.68, 1.56, 0.16, -1.61, 0.43, 0.0,
+               0.0,   2.3,  14.0,  13.3, 4.0,  20.0, 3.9,  0.0,  15.0,  7.0,  3.0}},
+         {70, {-7.67, 0.44, -1.31, 0.65, 1.42, 0.55, 1.64, 0.18, -1.77, 0.5, 0.0,
+               0.0,   2.3,  12.1,  14.9, 4.0,  20.0, 3.9,  0.0,  15.0,  7.0, 3.0}},
+         {80, {-7.82, 0.42, -1.11, 0.69, 1.38, 0.6,  1.7, 0.09, -1.9, 0.42, 0.0,
+               0.0,   2.3,  8.7,   17.0, 4.0,  20.0, 3.9, 0.0,  15.0, 7.0,  3.0}},
+         {90, {-7.84, 0.55, -0.11, 0.53, 1.23, 0.6,  1.7, 0.17, -1.99, 0.5, 0.0,
+               0.0,   2.3,  6.4,   12.3, 4.0,  20.0, 3.9, 0.0,  15.0,  7.0, 3.0}},
      }},
     {"Ka",
      {
-         {10, {-6.86, 0.81, -2.12, 0.94, 1.02, 1.44, 1.01, 0.56, -2.11, 0.59,
-               2.3,   23.7, 4.5,   4.0,  20.0, 3.9,  0.0,  15.0, 7.0,   3.0}},
-         {20, {-6.84, 0.61, -1.74, 0.79, 1.44, 0.77, 0.96, 0.55, -1.69, 0.51,
-               2.3,   21.8, 6.3,   4.0,  20.0, 3.9,  0.0,  15.0, 7.0,   3.0}},
-         {30, {-7.0, 0.56, -1.56, 0.66, 1.48, 0.7, 1.13, 0.43, -1.52, 0.46,
-               2.3,  19.6, 8.2,   4.0,  20.0, 3.9, 0.0,  15.0, 7.0,   3.0}},
-         {40, {-7.21, 0.56, -1.54, 0.63, 1.46, 0.6, 1.3, 0.37, -1.51, 0.43,
-               2.3,   18.0, 9.4,   4.0,  20.0, 3.9, 0.0, 15.0, 7.0,   3.0}},
-         {50, {-7.42, 0.57, -1.45, 0.56, 1.4,  0.59, 1.4, 0.32, -1.54, 0.45,
-               2.3,   16.3, 11.5,  4.0,  20.0, 3.9,  0.0, 15.0, 7.0,   3.0}},
-         {60, {-7.86, 0.55, -1.64, 0.78, 0.97, 1.27, 1.41, 0.45, -1.84, 0.63,
-               2.3,   15.9, 12.4,  4.0,  20.0, 3.9,  0.0,  15.0, 7.0,   3.0}},
-         {70, {-7.76, 0.47, -1.37, 0.56, 1.33, 0.56, 1.63, 0.17, -1.86, 0.51,
-               2.3,   12.3, 15.0,  4.0,  20.0, 3.9,  0.0,  15.0, 7.0,   3.0}},
-         {80, {-8.07, 0.42, -1.29, 0.76, 1.12, 1.04, 1.68, 0.14, -2.16, 0.74,
-               2.3,   10.5, 15.7,  4.0,  20.0, 3.9,  0.0,  15.0, 7.0,   3.0}},
-         {90, {-7.95, 0.59, -0.41, 0.59, 1.04, 0.63, 1.7, 0.17, -2.21, 0.61,
-               2.3,   10.5, 15.7,  4.0,  20.0, 3.9,  0.0, 15.0, 7.0,   3.0}},
+         {10, {-6.86, 0.81, -2.12, 0.94, 1.02, 1.44, 1.01, 0.56, -2.11, 0.59, 0.0,
+               0.0,   2.3,  23.7,  4.5,  4.0,  20.0, 3.9,  0.0,  15.0,  7.0,  3.0}},
+         {20, {-6.84, 0.61, -1.74, 0.79, 1.44, 0.77, 0.96, 0.55, -1.69, 0.51, 0.0,
+               0.0,   2.3,  21.8,  6.3,  4.0,  20.0, 3.9,  0.0,  15.0,  7.0,  3.0}},
+         {30, {-7.0, 0.56, -1.56, 0.66, 1.48, 0.7,  1.13, 0.43, -1.52, 0.46, 0.0,
+               0.0,  2.3,  19.6,  8.2,  4.0,  20.0, 3.9,  0.0,  15.0,  7.0,  3.0}},
+         {40, {-7.21, 0.56, -1.54, 0.63, 1.46, 0.6,  1.3, 0.37, -1.51, 0.43, 0.0,
+               0.0,   2.3,  18.0,  9.4,  4.0,  20.0, 3.9, 0.0,  15.0,  7.0,  3.0}},
+         {50, {-7.42, 0.57, -1.45, 0.56, 1.4, 0.59, 1.4, 0.32, -1.54, 0.45, 0.0,
+               0.0,   2.3,  16.3,  11.5, 4.0, 20.0, 3.9, 0.0,  15.0,  7.0,  3.0}},
+         {60, {-7.86, 0.55, -1.64, 0.78, 0.97, 1.27, 1.41, 0.45, -1.84, 0.63, 0.0,
+               0.0,   2.3,  15.9,  12.4, 4.0,  20.0, 3.9,  0.0,  15.0,  7.0,  3.0}},
+         {70, {-7.76, 0.47, -1.37, 0.56, 1.33, 0.56, 1.63, 0.17, -1.86, 0.51, 0.0,
+               0.0,   2.3,  12.3,  15.0, 4.0,  20.0, 3.9,  0.0,  15.0,  7.0,  3.0}},
+         {80, {-8.07, 0.42, -1.29, 0.76, 1.12, 1.04, 1.68, 0.14, -2.16, 0.74, 0.0,
+               0.0,   2.3,  10.5,  15.7, 4.0,  20.0, 3.9,  0.0,  15.0,  7.0,  3.0}},
+         {90, {-7.95, 0.59, -0.41, 0.59, 1.04, 0.63, 1.7, 0.17, -2.21, 0.61, 0.0,
+               0.0,   2.3,  10.5,  15.7, 4.0,  20.0, 3.9, 0.0,  15.0,  7.0,  3.0}},
      }},
 };
 
@@ -1670,7 +1671,7 @@
             table3gpp->m_uLgZSD = -0.1 * log10(1 + fcGHz) + 0.73;
             table3gpp->m_sigLgZSD = -0.04 * log10(1 + fcGHz) + 0.34;
             table3gpp->m_offsetZOD = 0;
-            table3gpp->m_cDS = 5;
+            table3gpp->m_cDS = 5 * 1e-9;
             table3gpp->m_cASD = 17;
             table3gpp->m_cASA = 17;
             table3gpp->m_cZSA = 7;
@@ -1704,7 +1705,7 @@
             table3gpp->m_uLgZSD = -0.04 * log10(1 + fcGHz) + 0.92;
             table3gpp->m_sigLgZSD = -0.07 * log10(1 + fcGHz) + 0.41;
             table3gpp->m_offsetZOD = 0;
-            table3gpp->m_cDS = 11;
+            table3gpp->m_cDS = 11 * 1e-9;
             table3gpp->m_cASD = 22;
             table3gpp->m_cASA = 22;
             table3gpp->m_cZSA = 7;
@@ -1738,7 +1739,7 @@
             table3gpp->m_uLgZSD = -0.04 * log10(1 + fcGHz) + 0.92;
             table3gpp->m_sigLgZSD = -0.07 * log10(1 + fcGHz) + 0.41;
             table3gpp->m_offsetZOD = 0;
-            table3gpp->m_cDS = 11;
+            table3gpp->m_cDS = 11 * 1e-9;
             table3gpp->m_cASD = 22;
             table3gpp->m_cASA = 22;
             table3gpp->m_cZSA = 7;
@@ -1779,7 +1780,7 @@
             table3gpp->m_uLgZSD = -0.1 * log10(1 + fcGHz) + 0.73;
             table3gpp->m_sigLgZSD = -0.04 * log10(1 + fcGHz) + 0.34;
             table3gpp->m_offsetZOD = 0;
-            table3gpp->m_cDS = 5;
+            table3gpp->m_cDS = 5 * 1e-9;
             table3gpp->m_cASD = 17;
             table3gpp->m_cASA = 17;
             table3gpp->m_cZSA = 7;
@@ -1813,7 +1814,7 @@
             table3gpp->m_uLgZSD = -0.04 * log10(1 + fcGHz) + 0.92;
             table3gpp->m_sigLgZSD = -0.07 * log10(1 + fcGHz) + 0.41;
             table3gpp->m_offsetZOD = 0;
-            table3gpp->m_cDS = 11;
+            table3gpp->m_cDS = 11 * 1e-9;
             table3gpp->m_cASD = 22;
             table3gpp->m_cASA = 22;
             table3gpp->m_cZSA = 7;
@@ -1851,7 +1852,7 @@
             table3gpp->m_uLgZSD = -0.04 * log10(1 + fcGHz) + 0.92;
             table3gpp->m_sigLgZSD = -0.07 * log10(1 + fcGHz) + 0.41;
             table3gpp->m_offsetZOD = 0;
-            table3gpp->m_cDS = 11;
+            table3gpp->m_cDS = 11 * 1e-9;
             table3gpp->m_cASD = 22;
             table3gpp->m_cASA = 22;
             table3gpp->m_cZSA = 7;
@@ -1971,7 +1972,8 @@
                 table3gpp->m_raysPerCluster = NTNDenseUrbanLOS.at(freqBand).at(
                     elevAngleQuantized)[Table3gppParams::raysPerCluster];
                 table3gpp->m_cDS =
-                    NTNDenseUrbanLOS.at(freqBand).at(elevAngleQuantized)[Table3gppParams::cDS];
+                    NTNDenseUrbanLOS.at(freqBand).at(elevAngleQuantized)[Table3gppParams::cDS] *
+                    1e-9;
                 table3gpp->m_cASD =
                     NTNDenseUrbanLOS.at(freqBand).at(elevAngleQuantized)[Table3gppParams::cASD];
                 table3gpp->m_cASA =
@@ -2023,7 +2025,8 @@
                 table3gpp->m_raysPerCluster = NTNDenseUrbanNLOS.at(freqBand).at(
                     elevAngleQuantized)[Table3gppParams::raysPerCluster];
                 table3gpp->m_cDS =
-                    NTNDenseUrbanNLOS.at(freqBand).at(elevAngleQuantized)[Table3gppParams::cDS];
+                    NTNDenseUrbanNLOS.at(freqBand).at(elevAngleQuantized)[Table3gppParams::cDS] *
+                    1e-9;
                 table3gpp->m_cASD =
                     NTNDenseUrbanNLOS.at(freqBand).at(elevAngleQuantized)[Table3gppParams::cASD];
                 table3gpp->m_cASA =
@@ -2081,7 +2084,7 @@
                 table3gpp->m_raysPerCluster = NTNUrbanLOS.at(freqBand).at(
                     elevAngleQuantized)[Table3gppParams::raysPerCluster];
                 table3gpp->m_cDS =
-                    NTNUrbanLOS.at(freqBand).at(elevAngleQuantized)[Table3gppParams::cDS];
+                    NTNUrbanLOS.at(freqBand).at(elevAngleQuantized)[Table3gppParams::cDS] * 1e-9;
                 table3gpp->m_cASD =
                     NTNUrbanLOS.at(freqBand).at(elevAngleQuantized)[Table3gppParams::cASD];
                 table3gpp->m_cASA =
@@ -2136,7 +2139,7 @@
                 table3gpp->m_raysPerCluster = NTNUrbanNLOS.at(freqBand).at(
                     elevAngleQuantized)[Table3gppParams::raysPerCluster];
                 table3gpp->m_cDS =
-                    NTNUrbanNLOS.at(freqBand).at(elevAngleQuantized)[Table3gppParams::cDS];
+                    NTNUrbanNLOS.at(freqBand).at(elevAngleQuantized)[Table3gppParams::cDS] * 1e-9;
                 table3gpp->m_cASD =
                     NTNUrbanNLOS.at(freqBand).at(elevAngleQuantized)[Table3gppParams::cASD];
                 table3gpp->m_cASA =
@@ -2195,7 +2198,7 @@
                 table3gpp->m_raysPerCluster = NTNSuburbanLOS.at(freqBand).at(
                     elevAngleQuantized)[Table3gppParams::raysPerCluster];
                 table3gpp->m_cDS =
-                    NTNSuburbanLOS.at(freqBand).at(elevAngleQuantized)[Table3gppParams::cDS];
+                    NTNSuburbanLOS.at(freqBand).at(elevAngleQuantized)[Table3gppParams::cDS] * 1e-9;
                 table3gpp->m_cASD =
                     NTNSuburbanLOS.at(freqBand).at(elevAngleQuantized)[Table3gppParams::cASD];
                 table3gpp->m_cASA =
@@ -2250,7 +2253,8 @@
                 table3gpp->m_raysPerCluster = NTNSuburbanNLOS.at(freqBand).at(
                     elevAngleQuantized)[Table3gppParams::raysPerCluster];
                 table3gpp->m_cDS =
-                    NTNSuburbanNLOS.at(freqBand).at(elevAngleQuantized)[Table3gppParams::cDS];
+                    NTNSuburbanNLOS.at(freqBand).at(elevAngleQuantized)[Table3gppParams::cDS] *
+                    1e-9;
                 table3gpp->m_cASD =
                     NTNSuburbanNLOS.at(freqBand).at(elevAngleQuantized)[Table3gppParams::cASD];
                 table3gpp->m_cASA =
@@ -2308,7 +2312,7 @@
                 table3gpp->m_raysPerCluster = NTNRuralLOS.at(freqBand).at(
                     elevAngleQuantized)[Table3gppParams::raysPerCluster];
                 table3gpp->m_cDS =
-                    NTNRuralLOS.at(freqBand).at(elevAngleQuantized)[Table3gppParams::cDS];
+                    NTNRuralLOS.at(freqBand).at(elevAngleQuantized)[Table3gppParams::cDS] * 1e-9;
                 table3gpp->m_cASD =
                     NTNRuralLOS.at(freqBand).at(elevAngleQuantized)[Table3gppParams::cASD];
                 table3gpp->m_cASA =
@@ -2363,7 +2367,7 @@
                 table3gpp->m_raysPerCluster = NTNRuralNLOS.at(freqBand).at(
                     elevAngleQuantized)[Table3gppParams::raysPerCluster];
                 table3gpp->m_cDS =
-                    NTNRuralNLOS.at(freqBand).at(elevAngleQuantized)[Table3gppParams::cDS];
+                    NTNRuralNLOS.at(freqBand).at(elevAngleQuantized)[Table3gppParams::cDS] * 1e-9;
                 table3gpp->m_cASD =
                     NTNRuralNLOS.at(freqBand).at(elevAngleQuantized)[Table3gppParams::cASD];
                 table3gpp->m_cASA =
@@ -2460,8 +2464,9 @@
     size_t uAntNumElems = bAntenna->GetNumElems();
     size_t chanNumRows = channelMatrix->m_channel.GetNumRows();
     size_t chanNumCols = channelMatrix->m_channel.GetNumCols();
-    return ((uAntNumElems != chanNumRows) || (sAntNumElems != chanNumCols)) &&
-           ((uAntNumElems != chanNumCols) || (sAntNumElems != chanNumRows));
+    return (((uAntNumElems != chanNumRows) || (sAntNumElems != chanNumCols)) &&
+            ((uAntNumElems != chanNumCols) || (sAntNumElems != chanNumRows))) ||
+           aAntenna->IsChannelOutOfDate(bAntenna);
 }
 
 Ptr<const MatrixBasedChannelModel::ChannelMatrix>
@@ -3036,10 +3041,10 @@
 
     for (uint8_t cIndex = 0; cIndex < channelParams->m_reducedClusterNumber; cIndex++)
     {
-        Shuffle(&rayAodRadian[cIndex][0], &rayAodRadian[cIndex][table3gpp->m_raysPerCluster]);
-        Shuffle(&rayAoaRadian[cIndex][0], &rayAoaRadian[cIndex][table3gpp->m_raysPerCluster]);
-        Shuffle(&rayZodRadian[cIndex][0], &rayZodRadian[cIndex][table3gpp->m_raysPerCluster]);
-        Shuffle(&rayZoaRadian[cIndex][0], &rayZoaRadian[cIndex][table3gpp->m_raysPerCluster]);
+        Shuffle(rayAodRadian[cIndex].begin(), rayAodRadian[cIndex].end(), m_uniformRvShuffle);
+        Shuffle(rayAoaRadian[cIndex].begin(), rayAoaRadian[cIndex].end(), m_uniformRvShuffle);
+        Shuffle(rayZodRadian[cIndex].begin(), rayZodRadian[cIndex].end(), m_uniformRvShuffle);
+        Shuffle(rayZoaRadian[cIndex].begin(), rayZoaRadian[cIndex].end(), m_uniformRvShuffle);
     }
 
     // store values
@@ -3865,15 +3870,6 @@
     return powerAttenuation;
 }
 
-void
-ThreeGppChannelModel::Shuffle(double* first, double* last) const
-{
-    for (auto i = (last - first) - 1; i > 0; --i)
-    {
-        std::swap(first[i], first[m_uniformRvShuffle->GetInteger(0, i)]);
-    }
-}
-
 int64_t
 ThreeGppChannelModel::AssignStreams(int64_t stream)
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/three-gpp-channel-model.h ns-3.44/src/spectrum/model/three-gpp-channel-model.h
--- ns-3.43/src/spectrum/model/three-gpp-channel-model.h	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/three-gpp-channel-model.h	2025-03-09 16:55:49.695372300 -0700
@@ -13,9 +13,9 @@
 #include "matrix-based-channel-model.h"
 
 #include "ns3/angles.h"
+#include "ns3/boolean.h"
+#include "ns3/channel-condition-model.h"
 #include "ns3/deprecated.h"
-#include <ns3/boolean.h>
-#include <ns3/channel-condition-model.h>
 
 #include <complex.h>
 #include <unordered_map>
@@ -26,13 +26,13 @@
 class MobilityModel;
 
 /**
- * \ingroup spectrum
- * \brief Channel Matrix Generation following 3GPP TR 38.901
+ * @ingroup spectrum
+ * @brief Channel Matrix Generation following 3GPP TR 38.901
  *
  * The class implements the channel matrix generation procedure
  * described in 3GPP TR 38.901.
  *
- * \see GetChannel
+ * @see GetChannel
  */
 class ThreeGppChannelModel : public MatrixBasedChannelModel
 {
@@ -51,43 +51,43 @@
 
     /**
      * Get the type ID
-     * \return the object TypeId
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
      * Set the channel condition model
-     * \param model a pointer to the ChannelConditionModel object
+     * @param model a pointer to the ChannelConditionModel object
      */
     void SetChannelConditionModel(Ptr<ChannelConditionModel> model);
 
     /**
      * Get the associated channel condition model
-     * \return a pointer to the ChannelConditionModel object
+     * @return a pointer to the ChannelConditionModel object
      */
     Ptr<ChannelConditionModel> GetChannelConditionModel() const;
 
     /**
      * Sets the center frequency of the model
-     * \param f the center frequency in Hz
+     * @param f the center frequency in Hz
      */
     void SetFrequency(double f);
 
     /**
      * Returns the center frequency
-     * \return the center frequency in Hz
+     * @return the center frequency in Hz
      */
     double GetFrequency() const;
 
     /**
      * Sets the propagation scenario
-     * \param scenario the propagation scenario
+     * @param scenario the propagation scenario
      */
     void SetScenario(const std::string& scenario);
 
     /**
      * Returns the propagation scenario
-     * \return the propagation scenario
+     * @return the propagation scenario
      */
     std::string GetScenario() const;
 
@@ -97,11 +97,11 @@
      * be updated, it generates a new uncorrelated channel matrix using the
      * method GetNewChannel and updates m_channelMap.
      *
-     * \param aMob mobility model of the a device
-     * \param bMob mobility model of the b device
-     * \param aAntenna antenna of the a device
-     * \param bAntenna antenna of the b device
-     * \return the channel matrix
+     * @param aMob mobility model of the a device
+     * @param bMob mobility model of the b device
+     * @param aAntenna antenna of the a device
+     * @param bAntenna antenna of the b device
+     * @return the channel matrix
      */
     Ptr<const ChannelMatrix> GetChannel(Ptr<const MobilityModel> aMob,
                                         Ptr<const MobilityModel> bMob,
@@ -112,18 +112,18 @@
      * Looks for the channel params associated to the aMob and bMob pair in
      * m_channelParamsMap. If not found it will return a nullptr.
      *
-     * \param aMob mobility model of the a device
-     * \param bMob mobility model of the b device
-     * \return the channel params
+     * @param aMob mobility model of the a device
+     * @param bMob mobility model of the b device
+     * @return the channel params
      */
     Ptr<const ChannelParams> GetParams(Ptr<const MobilityModel> aMob,
                                        Ptr<const MobilityModel> bMob) const override;
     /**
-     * \brief Assign a fixed random variable stream number to the random variables
+     * @brief Assign a fixed random variable stream number to the random variables
      * used by this model.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream);
 
@@ -137,20 +137,13 @@
      * the boundaries of the angle domain, specifically, generating angle distributions
      * close to inclinationRad=0 and inclinationRad=M_PI.
      *
-     * \param azimuthRad the azimuth angle in radians
-     * \param inclinationRad the inclination angle in radians
-     * \return the wrapped (azimuth, inclination) angle pair in radians
+     * @param azimuthRad the azimuth angle in radians
+     * @param inclinationRad the inclination angle in radians
+     * @return the wrapped (azimuth, inclination) angle pair in radians
      */
     static std::pair<double, double> WrapAngles(double azimuthRad, double inclinationRad);
 
     /**
-     * \brief Shuffle the elements of a simple sequence container of type double
-     * \param first Pointer to the first element among the elements to be shuffled
-     * \param last Pointer to the last element among the elements to be shuffled
-     */
-    void Shuffle(double* first, double* last) const;
-
-    /**
      * Extends the struct ChannelParams by including information that is used
      * within the ThreeGppChannelModel class
      */
@@ -235,11 +228,11 @@
 
     /**
      * Get the parameters needed to apply the channel generation procedure
-     * \param channelCondition the channel condition
-     * \param hBS the height of the BS
-     * \param hUT the height of the UT
-     * \param distance2D the 2D distance between tx and rx
-     * \return the parameters table
+     * @param channelCondition the channel condition
+     * @param hBS the height of the BS
+     * @param hUT the height of the UT
+     * @param distance2D the 2D distance between tx and rx
+     * @return the parameters table
      */
     NS_DEPRECATED_3_41("Use GetThreeGppTable(const Ptr<const MobilityModel>, const Ptr<const "
                        "MobilityModel>, Ptr<const ChannelCondition>) instead")
@@ -250,10 +243,10 @@
 
     /**
      * Get the parameters needed to apply the channel generation procedure
-     * \param aMob the mobility model of node A
-     * \param bMob the mobility model of node B
-     * \param channelCondition the channel condition
-     * \return the parameters table
+     * @param aMob the mobility model of node A
+     * @param bMob the mobility model of node B
+     * @param channelCondition the channel condition
+     * @return the parameters table
      */
     virtual Ptr<const ParamsTable> GetThreeGppTable(
         const Ptr<const MobilityModel> aMob,
@@ -275,11 +268,11 @@
      *
      * All relevant generated parameters are added then to ThreeGppChannelParams
      * which is the return value of this function.
-     * \param channelCondition the channel condition
-     * \param table3gpp the 3gpp parameters from the table
-     * \param aMob the a node mobility model
-     * \param bMob the b node mobility model
-     * \return ThreeGppChannelParams structure with all the channel parameters generated
+     * @param channelCondition the channel condition
+     * @param table3gpp the 3gpp parameters from the table
+     * @param aMob the a node mobility model
+     * @param bMob the b node mobility model
+     * @return ThreeGppChannelParams structure with all the channel parameters generated
      * according 38.901 steps from 4 to 10.
      */
     Ptr<ThreeGppChannelParams> GenerateChannelParameters(
@@ -292,14 +285,14 @@
      * Compute the channel matrix between two nodes a and b, and their
      * antenna arrays aAntenna and bAntenna using the procedure
      * described in 3GPP TR 38.901
-     * \param channelParams the channel parameters previously generated for the pair of
+     * @param channelParams the channel parameters previously generated for the pair of
      * nodes a and b
-     * \param table3gpp the 3gpp parameters table
-     * \param sMob the mobility model of node s
-     * \param uMob the mobility model of node u
-     * \param sAntenna the antenna array of node s
-     * \param uAntenna the antenna array of node u
-     * \return the channel realization
+     * @param table3gpp the 3gpp parameters table
+     * @param sMob the mobility model of node s
+     * @param uMob the mobility model of node u
+     * @param sAntenna the antenna array of node s
+     * @param uAntenna the antenna array of node u
+     * @return the channel realization
      */
 
     virtual Ptr<ChannelMatrix> GetNewChannel(Ptr<const ThreeGppChannelParams> channelParams,
@@ -310,10 +303,10 @@
                                              Ptr<const PhasedArrayModel> uAntenna) const;
     /**
      * Applies the blockage model A described in 3GPP TR 38.901
-     * \param channelParams the channel parameters structure
-     * \param clusterAOA vector containing the azimuth angle of arrival for each cluster
-     * \param clusterZOA vector containing the zenith angle of arrival for each cluster
-     * \return vector containing the power attenuation for each cluster
+     * @param channelParams the channel parameters structure
+     * @param clusterAOA vector containing the azimuth angle of arrival for each cluster
+     * @param clusterZOA vector containing the zenith angle of arrival for each cluster
+     * @return vector containing the power attenuation for each cluster
      */
     DoubleVector CalcAttenuationOfBlockage(
         const Ptr<ThreeGppChannelModel::ThreeGppChannelParams> channelParams,
@@ -322,9 +315,9 @@
 
     /**
      * Check if the channel params has to be updated
-     * \param channelParams channel params
-     * \param channelCondition the channel condition
-     * \return true if the channel params has to be updated, false otherwise
+     * @param channelParams channel params
+     * @param channelCondition the channel condition
+     * @return true if the channel params has to be updated, false otherwise
      */
     bool ChannelParamsNeedsUpdate(Ptr<const ThreeGppChannelParams> channelParams,
                                   Ptr<const ChannelCondition> channelCondition) const;
@@ -332,9 +325,9 @@
     /**
      * Check if the channel matrix has to be updated (it needs update when the channel params
      * generation time is more recent than channel matrix generation time
-     * \param channelParams channel params structure
-     * \param channelMatrix channel matrix structure
-     * \return true if the channel matrix has to be updated, false otherwise
+     * @param channelParams channel params structure
+     * @param channelMatrix channel matrix structure
+     * @return true if the channel matrix has to be updated, false otherwise
      */
     bool ChannelMatrixNeedsUpdate(Ptr<const ThreeGppChannelParams> channelParams,
                                   Ptr<const ChannelMatrix> channelMatrix);
@@ -342,10 +335,10 @@
     /**
      * Check if the channel matrix has to be updated due to
      * changes in the number of antenna ports
-     * \param aAntenna the antenna array of node a
-     * \param bAntenna the antenna array of node b
-     * \param channelMatrix channel matrix structure
-     * \return true if the channel matrix has to be updated, false otherwise
+     * @param aAntenna the antenna array of node a
+     * @param bAntenna the antenna array of node b
+     * @param channelMatrix channel matrix structure
+     * @return true if the channel matrix has to be updated, false otherwise
      */
     bool AntennaSetupChanged(Ptr<const PhasedArrayModel> aAntenna,
                              Ptr<const PhasedArrayModel> bAntenna,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/three-gpp-spectrum-propagation-loss-model.cc ns-3.44/src/spectrum/model/three-gpp-spectrum-propagation-loss-model.cc
--- ns-3.43/src/spectrum/model/three-gpp-spectrum-propagation-loss-model.cc	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/three-gpp-spectrum-propagation-loss-model.cc	2025-03-09 16:55:49.699372300 -0700
@@ -44,7 +44,6 @@
 ThreeGppSpectrumPropagationLossModel::DoDispose()
 {
     m_longTermMap.clear();
-    m_channelModel->Dispose();
     m_channelModel = nullptr;
 }
 
@@ -281,46 +280,52 @@
                                                                numRxPorts,
                                                                isReverse);
 
-    // The precoding matrix is not set
+    NS_ASSERT_MSG(rxParams->psd->GetValuesN() == rxParams->spectrumChannelMatrix->GetNumPages(),
+                  "RX PSD and the spectrum channel matrix should have the same number of RBs ");
+
+    // Calculate RX PSD from the spectrum channel matrix H and
+    // the precoding matrix P as: PSD = (H*P)^h * (H*P)
+    Ptr<const ComplexMatrixArray> p;
     if (!rxParams->precodingMatrix)
     {
-        // Update rxParams->Psd.
-        // Compute RX PSD from the channel matrix
-        auto vit = rxParams->psd->ValuesBegin(); // psd iterator
-        size_t rbIdx = 0;
-        while (vit != rxParams->psd->ValuesEnd())
+        // When the precoding matrix P is not set, we create one with a single column
+        ComplexMatrixArray page =
+            ComplexMatrixArray(rxParams->spectrumChannelMatrix->GetNumCols(), 1, 1);
+        // Initialize it to the inverse square of the number of txPorts
+        page.Elem(0, 0, 0) = 1.0 / sqrt(rxParams->spectrumChannelMatrix->GetNumCols());
+        for (size_t rowI = 0; rowI < rxParams->spectrumChannelMatrix->GetNumCols(); rowI++)
         {
-            // Calculate PSD for the first antenna port (correct for SISO)
-            *vit = std::norm(rxParams->spectrumChannelMatrix->Elem(0, 0, rbIdx));
-            vit++;
-            rbIdx++;
+            page.Elem(rowI, 0, 0) = page.Elem(0, 0, 0);
         }
+        // Replicate vector to match the number of RBGs
+        p = Create<const ComplexMatrixArray>(
+            page.MakeNCopies(rxParams->spectrumChannelMatrix->GetNumPages()));
     }
     else
     {
-        NS_ASSERT_MSG(rxParams->psd->GetValuesN() == rxParams->spectrumChannelMatrix->GetNumPages(),
-                      "RX PSD and the spectrum channel matrix should have the same number of RBs ");
-        // Calculate RX PSD from the spectrum channel matrix, H and
-        // the precoding matrix, P as:
-        // PSD = (H*P)^h * (H*P),
-        // where the dimensions are:
-        // H (rxPorts,txPorts,numRbs) x P (txPorts,txStreams, numRbs) =
-        // HxP (rxPorts,txStreams, numRbs)
-        MatrixBasedChannelModel::Complex3DVector hP =
-            *rxParams->spectrumChannelMatrix * (*rxParams->precodingMatrix);
-        // (HxP)^h dimensions are (txStreams, rxPorts, numRbs)
-        MatrixBasedChannelModel::Complex3DVector hPHerm = hP.HermitianTranspose();
-
-        // Finally, (HxP)^h x (HxP) = PSD (txStreams, txStreams, numRbs)
-        MatrixBasedChannelModel::Complex3DVector psd = hPHerm * hP;
-        // Update rxParams->Psd
-        for (uint32_t rbIdx = 0; rbIdx < rxParams->psd->GetValuesN(); ++rbIdx)
+        p = rxParams->precodingMatrix;
+    }
+    // When we have the precoding matrix P, we first do
+    // H(rxPorts,txPorts,numRbs) x P(txPorts,txStreams,numRbs) = HxP(rxPorts,txStreams,numRbs)
+    MatrixBasedChannelModel::Complex3DVector hP = *rxParams->spectrumChannelMatrix * *p;
+
+    // Then (HxP)^h dimensions are (txStreams, rxPorts, numRbs)
+    // MatrixBasedChannelModel::Complex3DVector hPHerm = hP.HermitianTranspose();
+
+    // Finally, (HxP)^h x (HxP) = PSD(txStreams, txStreams, numRbs)
+    // MatrixBasedChannelModel::Complex3DVector psd = hPHerm * hP;
+
+    // And the received psd is the Trace(PSD).
+    // To avoid wasting computations, we only compute the main diagonal of hPHerm*hP
+    for (uint32_t rbIdx = 0; rbIdx < rxParams->psd->GetValuesN(); ++rbIdx)
+    {
+        (*rxParams->psd)[rbIdx] = 0.0;
+        for (size_t rxPort = 0; rxPort < hP.GetNumRows(); ++rxPort)
         {
-            (*rxParams->psd)[rbIdx] = 0.0;
-
-            for (size_t txStream = 0; txStream < psd.GetNumRows(); ++txStream)
+            for (size_t txStream = 0; txStream < hP.GetNumCols(); ++txStream)
             {
-                (*rxParams->psd)[rbIdx] += std::real(psd(txStream, txStream, rbIdx));
+                (*rxParams->psd)[rbIdx] +=
+                    std::real(std::conj(hP(rxPort, txStream, rbIdx)) * hP(rxPort, txStream, rbIdx));
             }
         }
     }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/three-gpp-spectrum-propagation-loss-model.h ns-3.44/src/spectrum/model/three-gpp-spectrum-propagation-loss-model.h
--- ns-3.43/src/spectrum/model/three-gpp-spectrum-propagation-loss-model.h	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/three-gpp-spectrum-propagation-loss-model.h	2025-03-09 16:55:49.699372300 -0700
@@ -28,8 +28,8 @@
 class NetDevice;
 
 /**
- * \ingroup spectrum
- * \brief 3GPP Spectrum Propagation Loss Model
+ * @ingroup spectrum
+ * @brief 3GPP Spectrum Propagation Loss Model
  *
  * This class models the frequency dependent propagation phenomena in the way
  * described by 3GPP TR 38.901 document. The main method is DoCalcRxPowerSpectralDensity,
@@ -37,9 +37,9 @@
  * the mobility models of the transmitting node and receiving node, and
  * returns the PSD of the received signal.
  *
- * \see MatrixBasedChannelModel
- * \see PhasedArrayModel
- * \see ChannelCondition
+ * @see MatrixBasedChannelModel
+ * @see PhasedArrayModel
+ * @see ChannelCondition
  */
 class ThreeGppSpectrumPropagationLossModel : public PhasedArraySpectrumPropagationLossModel
 {
@@ -61,40 +61,40 @@
 
     /**
      * Get the type ID.
-     * \return the object TypeId
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
      * Set the channel model object
-     * \param channel a pointer to an object implementing the MatrixBasedChannelModel interface
+     * @param channel a pointer to an object implementing the MatrixBasedChannelModel interface
      */
     void SetChannelModel(Ptr<MatrixBasedChannelModel> channel);
 
     /**
      * Get the channel model object
-     * \return a pointer to the object implementing the MatrixBasedChannelModel interface
+     * @return a pointer to the object implementing the MatrixBasedChannelModel interface
      */
     Ptr<MatrixBasedChannelModel> GetChannelModel() const;
 
     /**
      * Sets the value of an attribute belonging to the associated
      * MatrixBasedChannelModel instance
-     * \param name name of the attribute
-     * \param value the attribute value
+     * @param name name of the attribute
+     * @param value the attribute value
      */
     void SetChannelModelAttribute(const std::string& name, const AttributeValue& value);
 
     /**
      * Returns the value of an attribute belonging to the associated
      * MatrixBasedChannelModel instance
-     * \param name name of the attribute
-     * \param value where the result should be stored
+     * @param name name of the attribute
+     * @param value where the result should be stored
      */
     void GetChannelModelAttribute(const std::string& name, AttributeValue& value) const;
 
     /**
-     * \brief Computes the received PSD.
+     * @brief Computes the received PSD.
      *
      * This function computes the received PSD by applying the 3GPP fast fading
      * model and the beamforming gain.
@@ -107,12 +107,12 @@
      * a certain channel is cached and recomputed only when the channel realization
      * is updated, or when the beamforming vectors change.
      *
-     * \param spectrumSignalParams spectrum signal tx parameters
-     * \param a first node mobility model
-     * \param b second node mobility model
-     * \param aPhasedArrayModel the antenna array of the first node
-     * \param bPhasedArrayModel the antenna array of the second node
-     * \return the received PSD
+     * @param spectrumSignalParams spectrum signal tx parameters
+     * @param a first node mobility model
+     * @param b second node mobility model
+     * @param aPhasedArrayModel the antenna array of the first node
+     * @param bPhasedArrayModel the antenna array of the second node
+     * @return the received PSD
      */
     Ptr<SpectrumSignalParameters> DoCalcRxPowerSpectralDensity(
         Ptr<const SpectrumSignalParameters> spectrumSignalParams,
@@ -139,15 +139,15 @@
 
     /**
      * Computes the frequency-domain channel matrix with the dimensions numRxPorts*numTxPorts*numRBs
-     * \param inPsd the input PSD
-     * \param longTerm the long term component
-     * \param channelMatrix the channel matrix structure
-     * \param channelParams the channel parameters, including delays
-     * \param doppler the doppler for each cluster
-     * \param numTxPorts the number of antenna ports at the transmitter
-     * \param numRxPorts the number of antenna ports at the receiver
-     * \param isReverse true if params and longTerm were computed with RX->TX switched
-     * \return 3D spectrum channel matrix with dimensions numRxPorts * numTxPorts * numRBs
+     * @param inPsd the input PSD
+     * @param longTerm the long term component
+     * @param channelMatrix the channel matrix structure
+     * @param channelParams the channel parameters, including delays
+     * @param doppler the doppler for each cluster
+     * @param numTxPorts the number of antenna ports at the transmitter
+     * @param numRxPorts the number of antenna ports at the receiver
+     * @param isReverse true if params and longTerm were computed with RX->TX switched
+     * @return 3D spectrum channel matrix with dimensions numRxPorts * numTxPorts * numRBs
      */
     Ptr<MatrixBasedChannelModel::Complex3DVector> GenSpectrumChannelMatrix(
         Ptr<SpectrumValue> inPsd,
@@ -161,7 +161,7 @@
 
     /**
      * Get the operating frequency
-     * \return the operating frequency in Hz
+     * @return the operating frequency in Hz
      */
     double GetFrequency() const;
 
@@ -169,10 +169,10 @@
      * Looks for the long term component in m_longTermMap. If found, checks
      * whether it has to be updated. If not found or if it has to be updated,
      * calls the method CalcLongTerm to compute it.
-     * \param channelMatrix the channel matrix
-     * \param aPhasedArrayModel the antenna array of the tx device
-     * \param bPhasedArrayModel the antenna array of the rx device
-     * \return vector containing the long term component for each cluster
+     * @param channelMatrix the channel matrix
+     * @param aPhasedArrayModel the antenna array of the tx device
+     * @param bPhasedArrayModel the antenna array of the rx device
+     * @return vector containing the long term component for each cluster
      */
     Ptr<const MatrixBasedChannelModel::Complex3DVector> GetLongTerm(
         Ptr<const MatrixBasedChannelModel::ChannelMatrix> channelMatrix,
@@ -180,10 +180,10 @@
         Ptr<const PhasedArrayModel> bPhasedArrayModel) const;
     /**
      * Computes the long term component
-     * \param channelMatrix the channel matrix H
-     * \param sAnt the pointer to the antenna of the s device
-     * \param uAnt the pointer to the antenna of the u device
-     * \return the long term component
+     * @param channelMatrix the channel matrix H
+     * @param sAnt the pointer to the antenna of the s device
+     * @param uAnt the pointer to the antenna of the u device
+     * @return the long term component
      */
     Ptr<const MatrixBasedChannelModel::Complex3DVector> CalcLongTerm(
         Ptr<const MatrixBasedChannelModel::ChannelMatrix> channelMatrix,
@@ -191,15 +191,15 @@
         Ptr<const PhasedArrayModel> uAnt) const;
 
     /**
-     * \brief Computes a longTerm component from a specific port of s device to the
+     * @brief Computes a longTerm component from a specific port of s device to the
      * specific port of u device and for a specific cluster index
-     * \param params The params that include the channel matrix
-     * \param sAnt pointer to first antenna
-     * \param uAnt uAnt pointer to second antenna
-     * \param sPortIdx the port index of the s device
-     * \param uPortIdx the port index of the u device
-     * \param cIndex the cluster index
-     * \return longTerm component for port pair and for a specific cluster index
+     * @param params The params that include the channel matrix
+     * @param sAnt pointer to first antenna
+     * @param uAnt uAnt pointer to second antenna
+     * @param sPortIdx the port index of the s device
+     * @param uPortIdx the port index of the u device
+     * @param cIndex the cluster index
+     * @return longTerm component for port pair and for a specific cluster index
      */
     std::complex<double> CalculateLongTermComponent(
         Ptr<const MatrixBasedChannelModel::ChannelMatrix> params,
@@ -210,17 +210,17 @@
         uint16_t cIndex) const;
 
     /**
-     * \brief Computes the beamforming gain and applies it to the TX PSD
-     * \param params SpectrumSignalParameters holding TX PSD
-     * \param longTerm the long term component
-     * \param channelMatrix the channel matrix structure
-     * \param channelParams the channel params structure
-     * \param sSpeed the speed of the first node
-     * \param uSpeed the speed of the second node
-     * \param numTxPorts the number of the ports of the first node
-     * \param numRxPorts the number of the porst of the second node
-     * \param isReverse indicator that tells whether the channel matrix is reverse
-     * \return
+     * @brief Computes the beamforming gain and applies it to the TX PSD
+     * @param params SpectrumSignalParameters holding TX PSD
+     * @param longTerm the long term component
+     * @param channelMatrix the channel matrix structure
+     * @param channelParams the channel params structure
+     * @param sSpeed the speed of the first node
+     * @param uSpeed the speed of the second node
+     * @param numTxPorts the number of the ports of the first node
+     * @param numRxPorts the number of the porst of the second node
+     * @param isReverse indicator that tells whether the channel matrix is reverse
+     * @return
      */
     Ptr<SpectrumSignalParameters> CalcBeamformingGain(
         Ptr<const SpectrumSignalParameters> params,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/trace-fading-loss-model.cc ns-3.44/src/spectrum/model/trace-fading-loss-model.cc
--- ns-3.43/src/spectrum/model/trace-fading-loss-model.cc	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/trace-fading-loss-model.cc	2025-03-09 16:55:49.699372300 -0700
@@ -12,12 +12,12 @@
 #include "spectrum-signal-parameters.h"
 #include "spectrum-value.h"
 
+#include "ns3/double.h"
+#include "ns3/log.h"
+#include "ns3/mobility-model.h"
+#include "ns3/simulator.h"
+#include "ns3/string.h"
 #include "ns3/uinteger.h"
-#include <ns3/double.h>
-#include <ns3/log.h>
-#include <ns3/mobility-model.h>
-#include <ns3/simulator.h>
-#include <ns3/string.h>
 
 #include <fstream>
 
@@ -57,7 +57,7 @@
                           MakeStringChecker())
             .AddAttribute("TraceLength",
                           "The total length of the fading trace (default value 10 s.)",
-                          TimeValue(Seconds(10.0)),
+                          TimeValue(Seconds(10)),
                           MakeTimeAccessor(&TraceFadingLossModel::SetTraceLength),
                           MakeTimeChecker())
             .AddAttribute("SamplesNum",
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/trace-fading-loss-model.h ns-3.44/src/spectrum/model/trace-fading-loss-model.h
--- ns-3.43/src/spectrum/model/trace-fading-loss-model.h	2024-10-09 16:41:10.088656700 -0700
+++ ns-3.44/src/spectrum/model/trace-fading-loss-model.h	2025-03-09 16:55:49.699372300 -0700
@@ -12,9 +12,9 @@
 
 #include "spectrum-propagation-loss-model.h"
 
+#include "ns3/nstime.h"
+#include "ns3/object.h"
 #include "ns3/random-variable-stream.h"
-#include <ns3/nstime.h>
-#include <ns3/object.h>
 
 #include <map>
 
@@ -24,9 +24,9 @@
 class MobilityModel;
 
 /**
- * \ingroup spectrum
+ * @ingroup spectrum
  *
- * \brief fading loss model based on precalculated fading traces
+ * @brief fading loss model based on precalculated fading traces
  */
 class TraceFadingLossModel : public SpectrumPropagationLossModel
 {
@@ -35,15 +35,15 @@
     ~TraceFadingLossModel() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     void DoInitialize() override;
 
     /**
-     * \brief The couple of mobility node that form a fading channel realization
+     * @brief The couple of mobility node that form a fading channel realization
      */
     typedef std::pair<Ptr<const MobilityModel>, Ptr<const MobilityModel>> ChannelRealizationId_t;
 
@@ -53,9 +53,9 @@
   private:
     /**
      * @param params the spectrum signal parameters.
-     * \param a sender mobility
-     * \param b receiver mobility
-     * \return set of values vs frequency representing the received
+     * @param a sender mobility
+     * @param b receiver mobility
+     * @return set of values vs frequency representing the received
      *         power in the same units used for the txPsd parameter.
      */
     Ptr<SpectrumValue> DoCalcRxPowerSpectralDensity(Ptr<const SpectrumSignalParameters> params,
@@ -63,21 +63,21 @@
                                                     Ptr<const MobilityModel> b) const override;
 
     /**
-     * \brief Get the value for a particular sub channel and a given speed
-     * \param subChannel the sub channel for which a value is requested
-     * \param speed the relative speed of the two devices
-     * \return the loss for a particular sub channel
+     * @brief Get the value for a particular sub channel and a given speed
+     * @param subChannel the sub channel for which a value is requested
+     * @param speed the relative speed of the two devices
+     * @return the loss for a particular sub channel
      */
     double GetValue(int subChannel, double speed);
 
     /**
-     * \brief Set the trace file name
-     * \param fileName the trace file
+     * @brief Set the trace file name
+     * @param fileName the trace file
      */
     void SetTraceFileName(std::string fileName);
     /**
-     * \brief Set the trace time
-     * \param t the trace time
+     * @brief Set the trace time
+     * @param t the trace time
      */
     void SetTraceLength(Time t);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/tv-spectrum-transmitter.cc ns-3.44/src/spectrum/model/tv-spectrum-transmitter.cc
--- ns-3.43/src/spectrum/model/tv-spectrum-transmitter.cc	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/spectrum/model/tv-spectrum-transmitter.cc	2025-03-09 16:55:49.699372300 -0700
@@ -8,16 +8,16 @@
 
 #include "tv-spectrum-transmitter.h"
 
-#include <ns3/antenna-model.h>
-#include <ns3/double.h>
-#include <ns3/enum.h>
-#include <ns3/integer.h>
-#include <ns3/isotropic-antenna-model.h>
-#include <ns3/log.h>
-#include <ns3/pointer.h>
-#include <ns3/simulator.h>
-#include <ns3/string.h>
-#include <ns3/uinteger.h>
+#include "ns3/antenna-model.h"
+#include "ns3/double.h"
+#include "ns3/enum.h"
+#include "ns3/integer.h"
+#include "ns3/isotropic-antenna-model.h"
+#include "ns3/log.h"
+#include "ns3/pointer.h"
+#include "ns3/simulator.h"
+#include "ns3/string.h"
+#include "ns3/uinteger.h"
 
 #include <cmath>
 
@@ -38,7 +38,7 @@
       m_channelBandwidth(6e6),
       m_basePsd(20),
       m_txPsd(nullptr),
-      m_startingTime(Seconds(0)),
+      m_startingTime(),
       m_transmitDuration(Seconds(0.2)),
       m_active(false)
 {
@@ -184,8 +184,8 @@
 {
     /**
      * Constructor
-     * \param stFreq Start frequency [Hz]
-     * \param bwidth Bandwidth [Hz]
+     * @param stFreq Start frequency [Hz]
+     * @param bwidth Bandwidth [Hz]
      */
     TvSpectrumModelId(double stFreq, double bwidth);
     double startFrequency; //!< Start frequency [Hz]
@@ -200,9 +200,9 @@
 
 /**
  * Minus-than operator
- * \param a left operand
- * \param b right operand
- * \returns true if the left operand has a lower starting frequency
+ * @param a left operand
+ * @param b right operand
+ * @returns true if the left operand has a lower starting frequency
  *          or a smaller bandwidth (if both have the same starting freq.)
  */
 bool
@@ -222,7 +222,7 @@
  * <http://www.ieeeghn.org/wiki/index.php/First-Hand:Digital_Television:_The_Digital_Terrestrial_Television_Broadcasting_(DTTB)_Standard>.
  *
  * COFDM PSD approximated from Figure 12 (8k mode) of the following article:
- * Kopp, Carlo. "High Definition Television." High Definition Television. Air
+ * Kopp, Carlo. "High Definition Television." High Definition Television. Air
  * Power Australia. <http://www.ausairpower.net/AC-1100.html>.
  *
  * Analog PSD approximated from Figure 4 of the following paper:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/tv-spectrum-transmitter.h ns-3.44/src/spectrum/model/tv-spectrum-transmitter.h
--- ns-3.43/src/spectrum/model/tv-spectrum-transmitter.h	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/spectrum/model/tv-spectrum-transmitter.h	2025-03-09 16:55:49.699372300 -0700
@@ -14,15 +14,15 @@
 #include "spectrum-signal-parameters.h"
 #include "spectrum-value.h"
 
-#include <ns3/antenna-model.h>
-#include <ns3/mobility-model.h>
-#include <ns3/net-device.h>
+#include "ns3/antenna-model.h"
+#include "ns3/mobility-model.h"
+#include "ns3/net-device.h"
 
 namespace ns3
 {
 
 /**
- * \ingroup spectrum
+ * @ingroup spectrum
  *
  * SpectrumPhy implementation that creates a customizable TV transmitter which
  * transmits a PSD spectrum specified by user-set attributes.
@@ -49,7 +49,7 @@
 
     /**
      * Register this type.
-     * \return The object TypeId.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
@@ -84,7 +84,7 @@
      * Digital_Terrestrial_Television_Broadcasting_(DTTB)_Standard>.
      *
      * COFDM PSD approximated from Figure 12 (8k mode) of the following article:
-     * Kopp, Carlo. "High Definition Television." High Definition Television. Air
+     * Kopp, Carlo. "High Definition Television." High Definition Television. Air
      * Power Australia. <http://www.ausairpower.net/AC-1100.html>.
      *
      * Analog PSD approximated from Figure 4 of the following paper:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/two-ray-spectrum-propagation-loss-model.cc ns-3.44/src/spectrum/model/two-ray-spectrum-propagation-loss-model.cc
--- ns-3.43/src/spectrum/model/two-ray-spectrum-propagation-loss-model.cc	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/spectrum/model/two-ray-spectrum-propagation-loss-model.cc	2025-03-09 16:55:49.699372300 -0700
@@ -8,13 +8,13 @@
 
 #include "two-ray-spectrum-propagation-loss-model.h"
 
-#include <ns3/double.h>
-#include <ns3/log.h>
-#include <ns3/node.h>
-#include <ns3/object-factory.h>
-#include <ns3/pointer.h>
-#include <ns3/random-variable-stream.h>
-#include <ns3/string.h>
+#include "ns3/double.h"
+#include "ns3/log.h"
+#include "ns3/node.h"
+#include "ns3/object-factory.h"
+#include "ns3/pointer.h"
+#include "ns3/random-variable-stream.h"
+#include "ns3/string.h"
 
 #include <algorithm>
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/two-ray-spectrum-propagation-loss-model.h ns-3.44/src/spectrum/model/two-ray-spectrum-propagation-loss-model.h
--- ns-3.43/src/spectrum/model/two-ray-spectrum-propagation-loss-model.h	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/spectrum/model/two-ray-spectrum-propagation-loss-model.h	2025-03-09 16:55:49.699372300 -0700
@@ -25,8 +25,8 @@
 class NetDevice;
 
 /**
- * \ingroup spectrum
- * \brief Two Ray Spectrum Propagation Loss Model
+ * @ingroup spectrum
+ * @brief Two Ray Spectrum Propagation Loss Model
  *
  * This class implements a performance-oriented channel and beamforming models alternative to the
  * ThreeGppSpectrumPropagationLossModel and ThreeGppChannelModel. The main method is
@@ -40,8 +40,8 @@
  * ThreeGppChannelModel would prove too computationally intensive. The target applicability of this
  * model, in terms of frequency range, is 0.5-100 GHz.
  *
- * \see PhasedArrayModel
- * \see ChannelCondition
+ * @see PhasedArrayModel
+ * @see ChannelCondition
  */
 class TwoRaySpectrumPropagationLossModel : public PhasedArraySpectrumPropagationLossModel
 {
@@ -60,7 +60,7 @@
          * Default constructor, requiring the Fluctuating Two Ray fading model parameters as
          * arguments.
          *
-         * \param m the m parameter of the FTR fading model, which represents the "Alpha" and "Beta"
+         * @param m the m parameter of the FTR fading model, which represents the "Alpha" and "Beta"
          * parameters of the Gamma-distributed random variable used to sample the power of the
          * reflected components \param sigma the sigma parameter of the FTR fading model, which
          * expresses the power of the diffuse real and imaginary components \param k the k parameter
@@ -135,24 +135,24 @@
 
     /**
      * Get the type ID.
-     * \return the object TypeId
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
      * Sets the propagation scenario
-     * \param scenario the propagation scenario
+     * @param scenario the propagation scenario
      */
     void SetScenario(const std::string& scenario);
 
     /**
      * Sets the center frequency of the model
-     * \param f the center frequency in Hz
+     * @param f the center frequency in Hz
      */
     void SetFrequency(double f);
 
     /**
-     * \brief Compute the received PSD.
+     * @brief Compute the received PSD.
      *
      * This function computes the received PSD by applying the Fluctuating Two-Ray (FTR)
      * fast fading model and the beamforming gain.
@@ -161,12 +161,12 @@
      * The path loss and shadowing are to be computed separately, using the
      * ThreeGppPropagationLossModel class.
      *
-     * \param txPsd the PSD of the transmitted signal
-     * \param a first node mobility model
-     * \param b second node mobility model
-     * \param aPhasedArrayModel the antenna array of the first node
-     * \param bPhasedArrayModel the antenna array of the second node
-     * \return SpectrumSignalParameters including the PSD of the received signal
+     * @param txPsd the PSD of the transmitted signal
+     * @param a first node mobility model
+     * @param b second node mobility model
+     * @param aPhasedArrayModel the antenna array of the first node
+     * @param bPhasedArrayModel the antenna array of the second node
+     * @return SpectrumSignalParameters including the PSD of the received signal
      */
     Ptr<SpectrumSignalParameters> DoCalcRxPowerSpectralDensity(
         Ptr<const SpectrumSignalParameters> txPsd,
@@ -182,9 +182,9 @@
     /**
      * Retrieves the LOS condition associated to the specified mobility models
      *
-     * \param a the mobility model of the first node
-     * \param b the mobility model of the second node
-     * \return the LOS condition of the link between a and b
+     * @param a the mobility model of the first node
+     * @param b the mobility model of the second node
+     * @return the LOS condition of the link between a and b
      */
     ChannelCondition::LosConditionValue GetLosCondition(Ptr<const MobilityModel> a,
                                                         Ptr<const MobilityModel> b) const;
@@ -214,9 +214,9 @@
      * reference curves and then estimate the FTR parameters based on the reference data,
      * respectively.
      *
-     * \param a first node mobility model
-     * \param b second node mobility model
-     * \return the corresponding FTR model parameters
+     * @param a first node mobility model
+     * @param b second node mobility model
+     * @return the corresponding FTR model parameters
      */
     FtrParams GetFtrParameters(Ptr<const MobilityModel> a, Ptr<const MobilityModel> b) const;
 
@@ -239,8 +239,8 @@
      * Two-Ray Fading Model for mmWave Communications," 2016 IEEE Globecom Workshops (GC Wkshps) for
      * further details on such model.
      *
-     * \param params the FTR fading model parameters
-     * \return the stochastic power gain due to the fast fading
+     * @param params the FTR fading model parameters
+     * @return the stochastic power gain due to the fast fading
      */
     double GetFtrFastFading(const FtrParams& params) const;
 
@@ -260,11 +260,11 @@
      * beamforming." IEEE Wireless Communications Letters 7.5 (2018) for further details on this
      * approach.
      *
-     * \param a first node mobility model
-     * \param b second node mobility model
-     * \param aPhasedArrayModel the antenna array of the first node
-     * \param bPhasedArrayModel the antenna array of the second node
-     * \return the beamforming gain
+     * @param a first node mobility model
+     * @param b second node mobility model
+     * @param aPhasedArrayModel the antenna array of the first node
+     * @param bPhasedArrayModel the antenna array of the second node
+     * @return the beamforming gain
      */
     double CalcBeamformingGain(Ptr<const MobilityModel> a,
                                Ptr<const MobilityModel> b,
@@ -275,9 +275,9 @@
      * Get the index of the closest carrier frequency for which the FTR estimated parameters are
      * available.
      *
-     * \param frequencies the vector of carrier frequencies which have been calibrated
-     * \param targetFc  the carrier frequency of the current simulation
-     * \return the index of frequencies representing the argmin over frequencies of
+     * @param frequencies the vector of carrier frequencies which have been calibrated
+     * @param targetFc  the carrier frequency of the current simulation
+     * @return the index of frequencies representing the argmin over frequencies of
      * abs(frequencies[index] - targetFc)
      */
     std::size_t SearchClosestFc(const std::vector<double>& frequencies, double targetFc) const;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/waveform-generator.cc ns-3.44/src/spectrum/model/waveform-generator.cc
--- ns-3.43/src/spectrum/model/waveform-generator.cc	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/spectrum/model/waveform-generator.cc	2025-03-09 16:55:49.699372300 -0700
@@ -8,12 +8,12 @@
 
 #include "waveform-generator.h"
 
-#include <ns3/antenna-model.h>
-#include <ns3/double.h>
-#include <ns3/log.h>
-#include <ns3/object-factory.h>
-#include <ns3/packet-burst.h>
-#include <ns3/simulator.h>
+#include "ns3/antenna-model.h"
+#include "ns3/double.h"
+#include "ns3/log.h"
+#include "ns3/object-factory.h"
+#include "ns3/packet-burst.h"
+#include "ns3/simulator.h"
 
 namespace ns3
 {
@@ -27,7 +27,7 @@
       m_netDevice(nullptr),
       m_channel(nullptr),
       m_txPowerSpectralDensity(nullptr),
-      m_startTime(Seconds(0))
+      m_startTime()
 {
 }
 
@@ -59,7 +59,7 @@
             .AddAttribute(
                 "Period",
                 "the period (=1/frequency)",
-                TimeValue(Seconds(1.0)),
+                TimeValue(Seconds(1)),
                 MakeTimeAccessor(&WaveformGenerator::SetPeriod, &WaveformGenerator::GetPeriod),
                 MakeTimeChecker())
             .AddAttribute("DutyCycle",
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/model/waveform-generator.h ns-3.44/src/spectrum/model/waveform-generator.h
--- ns-3.43/src/spectrum/model/waveform-generator.h	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/spectrum/model/waveform-generator.h	2025-03-09 16:55:49.699372300 -0700
@@ -13,12 +13,12 @@
 #include "spectrum-phy.h"
 #include "spectrum-value.h"
 
-#include <ns3/event-id.h>
-#include <ns3/mobility-model.h>
-#include <ns3/net-device.h>
-#include <ns3/nstime.h>
-#include <ns3/packet.h>
-#include <ns3/trace-source-accessor.h>
+#include "ns3/event-id.h"
+#include "ns3/mobility-model.h"
+#include "ns3/net-device.h"
+#include "ns3/nstime.h"
+#include "ns3/packet.h"
+#include "ns3/trace-source-accessor.h"
 
 namespace ns3
 {
@@ -26,7 +26,7 @@
 class AntennaModel;
 
 /**
- * \ingroup spectrum
+ * @ingroup spectrum
  *
  * Simple SpectrumPhy implementation that sends customizable waveform.
  * The generated waveforms have a given Spectrum Power Density and
@@ -45,8 +45,8 @@
     ~WaveformGenerator() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -97,7 +97,7 @@
     /**
      * set the AntennaModel to be used
      *
-     * \param a the Antenna Model
+     * @param a the Antenna Model
      */
     void SetAntenna(Ptr<AntennaModel> a);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/test/spectrum-ideal-phy-test.cc ns-3.44/src/spectrum/test/spectrum-ideal-phy-test.cc
--- ns-3.43/src/spectrum/test/spectrum-ideal-phy-test.cc	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/spectrum/test/spectrum-ideal-phy-test.cc	2025-03-09 16:55:49.699372300 -0700
@@ -6,33 +6,33 @@
  * Author: Nicola Baldo <nbaldo@cttc.es>
  */
 
-#include <ns3/adhoc-aloha-noack-ideal-phy-helper.h>
-#include <ns3/config.h>
-#include <ns3/data-rate.h>
-#include <ns3/friis-spectrum-propagation-loss.h>
-#include <ns3/ism-spectrum-value-helper.h>
-#include <ns3/log.h>
-#include <ns3/math.h>
-#include <ns3/mobility-helper.h>
-#include <ns3/object.h>
-#include <ns3/packet-socket-address.h>
-#include <ns3/packet-socket-client.h>
-#include <ns3/packet-socket-helper.h>
-#include <ns3/packet.h>
-#include <ns3/propagation-delay-model.h>
-#include <ns3/ptr.h>
-#include <ns3/simulator.h>
-#include <ns3/single-model-spectrum-channel.h>
-#include <ns3/spectrum-analyzer.h>
-#include <ns3/spectrum-error-model.h>
-#include <ns3/spectrum-helper.h>
-#include <ns3/spectrum-interference.h>
-#include <ns3/spectrum-model-300kHz-300GHz-log.h>
-#include <ns3/spectrum-model-ism2400MHz-res1MHz.h>
-#include <ns3/string.h>
-#include <ns3/test.h>
-#include <ns3/uinteger.h>
-#include <ns3/waveform-generator.h>
+#include "ns3/adhoc-aloha-noack-ideal-phy-helper.h"
+#include "ns3/config.h"
+#include "ns3/data-rate.h"
+#include "ns3/friis-spectrum-propagation-loss.h"
+#include "ns3/ism-spectrum-value-helper.h"
+#include "ns3/log.h"
+#include "ns3/math.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/object.h"
+#include "ns3/packet-socket-address.h"
+#include "ns3/packet-socket-client.h"
+#include "ns3/packet-socket-helper.h"
+#include "ns3/packet.h"
+#include "ns3/propagation-delay-model.h"
+#include "ns3/ptr.h"
+#include "ns3/simulator.h"
+#include "ns3/single-model-spectrum-channel.h"
+#include "ns3/spectrum-analyzer.h"
+#include "ns3/spectrum-error-model.h"
+#include "ns3/spectrum-helper.h"
+#include "ns3/spectrum-interference.h"
+#include "ns3/spectrum-model-300kHz-300GHz-log.h"
+#include "ns3/spectrum-model-ism2400MHz-res1MHz.h"
+#include "ns3/string.h"
+#include "ns3/test.h"
+#include "ns3/uinteger.h"
+#include "ns3/waveform-generator.h"
 
 #include <iomanip>
 #include <iostream>
@@ -52,19 +52,19 @@
 }
 
 /**
- * \ingroup spectrum-tests
+ * @ingroup spectrum-tests
  *
- * \brief Ideal Spectrum PHY Test
+ * @brief Ideal Spectrum PHY Test
  */
 class SpectrumIdealPhyTestCase : public TestCase
 {
   public:
     /**
      * Constructor
-     * \param snrLinear SNR (linear)
-     * \param phyRate PHY rate (bps)
-     * \param rateIsAchievable Check if the rate is achievable
-     * \param channelType Channel type
+     * @param snrLinear SNR (linear)
+     * @param phyRate PHY rate (bps)
+     * @param rateIsAchievable Check if the rate is achievable
+     * @param channelType Channel type
      */
     SpectrumIdealPhyTestCase(double snrLinear,
                              uint64_t phyRate,
@@ -76,10 +76,10 @@
     void DoRun() override;
     /**
      * Get the test name
-     * \param channelType Channel type
-     * \param snrLinear SNR (linear)
-     * \param phyRate PHY rate (bps)
-     * \return the test name
+     * @param channelType Channel type
+     * @param snrLinear SNR (linear)
+     * @param phyRate PHY rate (bps)
+     * @return the test name
      */
     static std::string Name(std::string channelType, double snrLinear, uint64_t phyRate);
 
@@ -187,7 +187,7 @@
                          TimeValue(Seconds(double(pktSize * 8) / (1.2 * double(phyRate)))));
     client->SetAttribute("PacketSize", UintegerValue(pktSize));
     client->SetAttribute("MaxPackets", UintegerValue(0));
-    client->SetStartTime(Seconds(0.0));
+    client->SetStartTime(Seconds(0));
     client->SetStopTime(Seconds(testDuration));
     c.Get(0)->AddApplication(client);
 
@@ -218,9 +218,9 @@
 }
 
 /**
- * \ingroup spectrum-tests
+ * @ingroup spectrum-tests
  *
- * \brief Ideal Spectrum PHY TestSuite
+ * @brief Ideal Spectrum PHY TestSuite
  */
 class SpectrumIdealPhyTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/test/spectrum-interference-test.cc ns-3.44/src/spectrum/test/spectrum-interference-test.cc
--- ns-3.43/src/spectrum/test/spectrum-interference-test.cc	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/spectrum/test/spectrum-interference-test.cc	2025-03-09 16:55:49.699372300 -0700
@@ -6,14 +6,14 @@
  * Author: Nicola Baldo <nbaldo@cttc.es>
  */
 
-#include <ns3/log.h>
-#include <ns3/object.h>
-#include <ns3/packet.h>
-#include <ns3/ptr.h>
-#include <ns3/simulator.h>
-#include <ns3/spectrum-error-model.h>
-#include <ns3/spectrum-interference.h>
-#include <ns3/test.h>
+#include "ns3/log.h"
+#include "ns3/object.h"
+#include "ns3/packet.h"
+#include "ns3/ptr.h"
+#include "ns3/simulator.h"
+#include "ns3/spectrum-error-model.h"
+#include "ns3/spectrum-interference.h"
+#include "ns3/test.h"
 
 #include <iostream>
 
@@ -22,19 +22,19 @@
 NS_LOG_COMPONENT_DEFINE("SpectrumInterferenceTest");
 
 /**
- * \ingroup spectrum-tests
+ * @ingroup spectrum-tests
  *
- * \brief Spectrum Interference Test
+ * @brief Spectrum Interference Test
  */
 class SpectrumInterferenceTestCase : public TestCase
 {
   public:
     /**
      * Constructor
-     * \param s Spectrum value
-     * \param txBytes number of bytes to transmit
-     * \param rxCorrect expected Rx bytes
-     * \param name test name
+     * @param s Spectrum value
+     * @param txBytes number of bytes to transmit
+     * @param rxCorrect expected Rx bytes
+     * @param name test name
      */
     SpectrumInterferenceTestCase(Ptr<SpectrumValue> s,
                                  uint32_t txBytes,
@@ -44,7 +44,7 @@
     void DoRun() override;
     /**
      * Retrieve the test results
-     * \param si SpectrumInterference instance
+     * @param si SpectrumInterference instance
      */
     void RetrieveTestResult(SpectrumInterference* si);
 
@@ -130,9 +130,9 @@
 }
 
 /**
- * \ingroup spectrum-tests
+ * @ingroup spectrum-tests
  *
- * \brief Spectrum Interference TestSuite
+ * @brief Spectrum Interference TestSuite
  */
 class SpectrumInterferenceTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/test/spectrum-test.h ns-3.44/src/spectrum/test/spectrum-test.h
--- ns-3.43/src/spectrum/test/spectrum-test.h	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/spectrum/test/spectrum-test.h	2025-03-09 16:55:49.699372300 -0700
@@ -11,27 +11,27 @@
 #ifndef SPECTRUM_TEST_H
 #define SPECTRUM_TEST_H
 
-#include <ns3/spectrum-value.h>
-#include <ns3/test.h>
+#include "ns3/spectrum-value.h"
+#include "ns3/test.h"
 
 /**
- * \ingroup spectrum
- * \defgroup spectrum-test Spectrum module tests
+ * @ingroup spectrum
+ * @defgroup spectrum-test Spectrum module tests
  */
 
 /**
- * \ingroup spectrum-tests
+ * @ingroup spectrum-tests
  *
- * \brief Test if two SpectrumModel instances are equal within a given tolerance.
+ * @brief Test if two SpectrumModel instances are equal within a given tolerance.
  *
  * This test compares component-by-component the two SpectrumModel
  * instances; if any pair of components differs by more than the given
  * tolerance, the test fails.
  *
- * \param actual the actual value obtained by the simulator
- * \param expected the expected value obtained by off-line calculations
- * \param tol the tolerance
- * \param msg the message to print if the test fails
+ * @param actual the actual value obtained by the simulator
+ * @param expected the expected value obtained by off-line calculations
+ * @param tol the tolerance
+ * @param msg the message to print if the test fails
  *
  */
 #define NS_TEST_ASSERT_MSG_SPECTRUM_MODEL_EQ_TOL(actual, expected, tol, msg)                       \
@@ -85,18 +85,18 @@
     } while (false);
 
 /**
- * \ingroup spectrum-tests
+ * @ingroup spectrum-tests
  *
- * \brief Test if two SpectrumValue instances are equal within a given tolerance.
+ * @brief Test if two SpectrumValue instances are equal within a given tolerance.
  *
  * This test compares component-by-component the two SpectrumValue
  * instances; if any pair of components differs by more than the given
  * tolerance, the test fails.
  *
- * \param actual the actual value obtained by the simulator
- * \param expected the expected value obtained by off-line calculations
- * \param tol the tolerance
- * \param msg the message to print if the test fails
+ * @param actual the actual value obtained by the simulator
+ * @param expected the expected value obtained by off-line calculations
+ * @param tol the tolerance
+ * @param msg the message to print if the test fails
  *
  */
 #define NS_TEST_ASSERT_MSG_SPECTRUM_VALUE_EQ_TOL(actual, expected, tol, msg)                       \
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/test/spectrum-value-test.cc ns-3.44/src/spectrum/test/spectrum-value-test.cc
--- ns-3.43/src/spectrum/test/spectrum-value-test.cc	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/spectrum/test/spectrum-value-test.cc	2025-03-09 16:55:49.699372300 -0700
@@ -8,11 +8,11 @@
 
 #include "spectrum-test.h"
 
-#include <ns3/log.h>
-#include <ns3/object.h>
-#include <ns3/spectrum-converter.h>
-#include <ns3/spectrum-value.h>
-#include <ns3/test.h>
+#include "ns3/log.h"
+#include "ns3/object.h"
+#include "ns3/spectrum-converter.h"
+#include "ns3/spectrum-value.h"
+#include "ns3/test.h"
 
 #include <cmath>
 #include <iostream>
@@ -24,18 +24,18 @@
 #define TOLERANCE 1e-6
 
 /**
- * \ingroup spectrum-tests
+ * @ingroup spectrum-tests
  *
- * \brief Spectrum Value Test
+ * @brief Spectrum Value Test
  */
 class SpectrumValueTestCase : public TestCase
 {
   public:
     /**
      * Constructor
-     * \param a first SpectrumValue
-     * \param b second SpectrumValue
-     * \param name test name
+     * @param a first SpectrumValue
+     * @param b second SpectrumValue
+     * @param name test name
      */
     SpectrumValueTestCase(SpectrumValue a, SpectrumValue b, std::string name);
     ~SpectrumValueTestCase() override;
@@ -44,9 +44,9 @@
   private:
     /**
      * Check that two SpectrumValue are equal within a tolerance
-     * \param x first SpectrumValue
-     * \param y second SpectrumValue
-     * \return true if the two values are within the tolerance
+     * @param x first SpectrumValue
+     * @param y second SpectrumValue
+     * @return true if the two values are within the tolerance
      */
     bool MoreOrLessEqual(SpectrumValue x, SpectrumValue y);
 
@@ -83,9 +83,9 @@
 }
 
 /**
- * \ingroup spectrum-tests
+ * @ingroup spectrum-tests
  *
- * \brief Spectrum Value TestSuite
+ * @brief Spectrum Value TestSuite
  */
 class SpectrumValueTestSuite : public TestSuite
 {
@@ -268,9 +268,9 @@
 }
 
 /**
- * \ingroup spectrum-tests
+ * @ingroup spectrum-tests
  *
- * \brief Spectrum Converter TestSuite
+ * @brief Spectrum Converter TestSuite
  */
 class SpectrumConverterTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/test/spectrum-waveform-generator-test.cc ns-3.44/src/spectrum/test/spectrum-waveform-generator-test.cc
--- ns-3.43/src/spectrum/test/spectrum-waveform-generator-test.cc	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/spectrum/test/spectrum-waveform-generator-test.cc	2025-03-09 16:55:49.699372300 -0700
@@ -5,18 +5,18 @@
  *
  * Author: Luis Pacheco <luisbelem@gmail.com>
  */
-#include <ns3/core-module.h>
-#include <ns3/spectrum-module.h>
-#include <ns3/test.h>
+#include "ns3/core-module.h"
+#include "ns3/spectrum-module.h"
+#include "ns3/test.h"
 
 NS_LOG_COMPONENT_DEFINE("WaveformGeneratorTest");
 
 using namespace ns3;
 
 /**
- * \ingroup spectrum-tests
+ * @ingroup spectrum-tests
  *
- * \brief Waveform generator Test
+ * @brief Waveform generator Test
  */
 class WaveformGeneratorTestCase : public TestCase
 {
@@ -24,9 +24,9 @@
     /**
      * Constructor
      *
-     * \param period waveform period (seconds)
-     * \param dutyCycle waveform duty cycle
-     * \param stop stop time (seconds)
+     * @param period waveform period (seconds)
+     * @param dutyCycle waveform duty cycle
+     * @param stop stop time (seconds)
      */
     WaveformGeneratorTestCase(double period, double dutyCycle, double stop);
     ~WaveformGeneratorTestCase() override;
@@ -36,7 +36,7 @@
 
     /**
      * Trace if the waveform is active
-     * \param newPkt unused.
+     * @param newPkt unused.
      */
     void TraceWave(Ptr<const Packet> newPkt);
     double m_period;    //!< waveform period (seconds)
@@ -93,10 +93,10 @@
     wave->TraceConnectWithoutContext("TxStart",
                                      MakeCallback(&WaveformGeneratorTestCase::TraceWave, this));
 
-    Simulator::Schedule(Seconds(1.0), &WaveformGenerator::Start, wave);
+    Simulator::Schedule(Seconds(1), &WaveformGenerator::Start, wave);
     Simulator::Schedule(Seconds(m_stop), &WaveformGenerator::Stop, wave);
 
-    Simulator::Stop(Seconds(3.0));
+    Simulator::Stop(Seconds(3));
     Simulator::Run();
 
     NS_TEST_ASSERT_MSG_EQ(m_fails, 0, "Wave started after the stop method was called");
@@ -105,9 +105,9 @@
 }
 
 /**
- * \ingroup spectrum-tests
+ * @ingroup spectrum-tests
  *
- * \brief Waveform generator TestSuite
+ * @brief Waveform generator TestSuite
  */
 class WaveformGeneratorTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/test/three-gpp-channel-test-suite.cc ns-3.44/src/spectrum/test/three-gpp-channel-test-suite.cc
--- ns-3.43/src/spectrum/test/three-gpp-channel-test-suite.cc	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/spectrum/test/three-gpp-channel-test-suite.cc	2025-03-09 16:55:49.699372300 -0700
@@ -34,7 +34,7 @@
 NS_LOG_COMPONENT_DEFINE("ThreeGppChannelTestSuite");
 
 /**
- * \ingroup spectrum-tests
+ * @ingroup spectrum-tests
  *
  * Test case for the ThreeGppChannelModel class.
  * 1) check if the channel matrix has the correct dimensions
@@ -45,12 +45,12 @@
   public:
     /**
      *Constructor
-     * \param txAntennaElements the number of rows and columns of the antenna array of the
+     * @param txAntennaElements the number of rows and columns of the antenna array of the
      * transmitter
-     * \param rxAntennaElements the number of rows and columns of the antenna array of
-     * \param txPorts the number of vertical and horizontal ports of the antenna array
+     * @param rxAntennaElements the number of rows and columns of the antenna array of
+     * @param txPorts the number of vertical and horizontal ports of the antenna array
      * of the transmitter
-     * \param rxPorts the number of vertical and horizontal ports of the antenna
+     * @param rxPorts the number of vertical and horizontal ports of the antenna
      * array of the receiver
      */
     ThreeGppChannelMatrixComputationTest(uint32_t txAntennaElements = 2,
@@ -71,11 +71,11 @@
 
     /**
      * Compute the Frobenius norm of the channel matrix and stores it in m_normVector
-     * \param channelModel the ThreeGppChannelModel object used to generate the channel matrix
-     * \param txMob the mobility model of the first node
-     * \param rxMob the mobility model of the second node
-     * \param txAntenna the antenna object associated to the first node
-     * \param rxAntenna the antenna object associated to the second node
+     * @param channelModel the ThreeGppChannelModel object used to generate the channel matrix
+     * @param txMob the mobility model of the first node
+     * @param rxMob the mobility model of the second node
+     * @param txAntenna the antenna object associated to the first node
+     * @param rxAntenna the antenna object associated to the second node
      */
     void DoComputeNorm(Ptr<ThreeGppChannelModel> channelModel,
                        Ptr<MobilityModel> txMob,
@@ -272,7 +272,7 @@
 }
 
 /**
- * \ingroup spectrum-tests
+ * @ingroup spectrum-tests
  *
  * Test case for the ThreeGppChannelModel class.
  * It checks if the channel realizations are correctly updated during the
@@ -283,12 +283,12 @@
   public:
     /**
      *Constructor
-     * \param txAntennaElements the number of rows and columns of the antenna array of the
+     * @param txAntennaElements the number of rows and columns of the antenna array of the
      * transmitter
-     * \param rxAntennaElements the number of rows and columns of the antenna array of
-     * \param txPorts the number of vertical and horizontal ports of the antenna array
+     * @param rxAntennaElements the number of rows and columns of the antenna array of
+     * @param txPorts the number of vertical and horizontal ports of the antenna array
      * of the transmitter
-     * \param rxPorts the number of vertical and horizontal ports of the antenna
+     * @param rxPorts the number of vertical and horizontal ports of the antenna
      * array of the receiver
      */
     ThreeGppChannelMatrixUpdateTest(uint32_t txAntennaElements = 2,
@@ -310,12 +310,12 @@
     /**
      * This method is used to schedule the channel matrix computation at different
      * time instants and to check if it correctly updated
-     * \param channelModel the ThreeGppChannelModel object used to generate the channel matrix
-     * \param txMob the mobility model of the first node
-     * \param rxMob the mobility model of the second node
-     * \param txAntenna the antenna object associated to the first node
-     * \param rxAntenna the antenna object associated to the second node
-     * \param update whether if the channel matrix should be updated or not
+     * @param channelModel the ThreeGppChannelModel object used to generate the channel matrix
+     * @param txMob the mobility model of the first node
+     * @param rxMob the mobility model of the second node
+     * @param txAntenna the antenna object associated to the first node
+     * @param rxAntenna the antenna object associated to the second node
+     * @param update whether if the channel matrix should be updated or not
      */
     void DoGetChannel(Ptr<ThreeGppChannelModel> channelModel,
                       Ptr<MobilityModel> txMob,
@@ -486,7 +486,7 @@
 }
 
 /**
- * \ingroup spectrum-tests
+ * @ingroup spectrum-tests
  *
  * Test case for the ThreeGppChannelModel class.
  * It checks if the channel realizations are correctly
@@ -514,12 +514,12 @@
     /**
      * This method is used to schedule the channel matrix computation at different
      * time instants and to check if it correctly updated
-     * \param channelModel the ThreeGppChannelModel object used to generate the channel matrix
-     * \param txMob the mobility model of the first node
-     * \param rxMob the mobility model of the second node
-     * \param txAntenna the antenna object associated to the first node
-     * \param rxAntenna the antenna object associated to the second node
-     * \param update whether if the channel matrix should be updated or not
+     * @param channelModel the ThreeGppChannelModel object used to generate the channel matrix
+     * @param txMob the mobility model of the first node
+     * @param rxMob the mobility model of the second node
+     * @param txAntenna the antenna object associated to the first node
+     * @param rxAntenna the antenna object associated to the second node
+     * @param update whether if the channel matrix should be updated or not
      */
     void DoGetChannel(Ptr<ThreeGppChannelModel> channelModel,
                       Ptr<MobilityModel> txMob,
@@ -714,8 +714,8 @@
 }
 
 /**
- * \ingroup spectrum-tests
- * \brief A structure that holds the parameters for the function
+ * @ingroup spectrum-tests
+ * @brief A structure that holds the parameters for the function
  * CheckLongTermUpdate. In this way the problem with the limited
  * number of parameters of method Schedule is avoided.
  */
@@ -732,7 +732,7 @@
 };
 
 /**
- * \ingroup spectrum-tests
+ * @ingroup spectrum-tests
  *
  * Test case for the ThreeGppSpectrumPropagationLossModelTest class.
  * 1) checks if the long term components for the direct and the reverse link
@@ -746,13 +746,13 @@
   public:
     /**
      * Constructor
-     * \param txAntennaElements the number of rows and columns of the antenna array of the
+     * @param txAntennaElements the number of rows and columns of the antenna array of the
      * transmitter
-     * \param rxAntennaElements the number of rows and columns of the antenna array of
+     * @param rxAntennaElements the number of rows and columns of the antenna array of
      * the receiver
-     * \param txPorts the number of vertical and horizontal ports of the antenna array
+     * @param txPorts the number of vertical and horizontal ports of the antenna array
      * of the transmitter
-     * \param rxPorts the number of vertical and horizontal ports of the antenna
+     * @param rxPorts the number of vertical and horizontal ports of the antenna
      * array of the receiver
      */
     ThreeGppSpectrumPropagationLossModelTest(uint32_t txAntennaElements = 4,
@@ -772,10 +772,10 @@
 
     /**
      * Points the beam of thisDevice towards otherDevice
-     * \param thisDevice the device to configure
-     * \param thisAntenna the antenna object associated to thisDevice
-     * \param otherDevice the device to communicate with
-     * \param otherAntenna the antenna object associated to otherDevice
+     * @param thisDevice the device to configure
+     * @param thisAntenna the antenna object associated to thisDevice
+     * @param otherDevice the device to communicate with
+     * @param otherAntenna the antenna object associated to otherDevice
      */
     void DoBeamforming(Ptr<NetDevice> thisDevice,
                        Ptr<PhasedArrayModel> thisAntenna,
@@ -785,7 +785,7 @@
     /**
      * Test of the long term component is correctly updated when the channel
      * matrix is recomputed
-     * \param params a structure that contains the set of parameters needed by CheckLongTermUpdate
+     * @param params a structure that contains the set of parameters needed by CheckLongTermUpdate
      * in order to perform calculations
      */
     void CheckLongTermUpdate(const CheckLongTermUpdateParams& params);
@@ -934,9 +934,29 @@
     // 1) check that the rx PSD is equal for both the direct and the reverse channel
     auto rxParamsNew =
         lossModel->DoCalcRxPowerSpectralDensity(txParams, rxMob, txMob, rxAntenna, txAntenna);
-    NS_TEST_ASSERT_MSG_EQ((*rxParamsOld->psd == *rxParamsNew->psd),
-                          true,
-                          "The long term for the direct and the reverse channel are different");
+    if ((rxParamsOld->spectrumChannelMatrix->GetNumCols() ==
+         rxParamsNew->spectrumChannelMatrix->GetNumCols()) &&
+        (rxParamsOld->spectrumChannelMatrix->GetNumRows() ==
+         rxParamsNew->spectrumChannelMatrix->GetNumRows()) &&
+        (rxParamsOld->spectrumChannelMatrix->GetNumCols() == 1) &&
+        (rxParamsOld->spectrumChannelMatrix->GetNumRows() == 1))
+    {
+        // this is only really true in case of SISO (1x1 non-polarized port array)
+        const auto& oldValues = rxParamsOld->psd->GetValues();
+        const auto& newValues = rxParamsNew->psd->GetValues();
+
+        NS_TEST_ASSERT_MSG_EQ(oldValues.size(),
+                              newValues.size(),
+                              "The long term for the direct and the reverse channel are different");
+        for (size_t i = 0; i < oldValues.size(); i++)
+        {
+            NS_TEST_ASSERT_MSG_EQ_TOL(
+                oldValues.at(i),
+                newValues.at(i),
+                1e-9,
+                "The long term for the direct and the reverse channel are different");
+        }
+    }
 
     // 2) check if the long term is updated when changing the BF vector
     // change the position of the rx device and recompute the beamforming vectors
@@ -972,7 +992,7 @@
 }
 
 /**
- * \ingroup spectrum-tests
+ * @ingroup spectrum-tests
  *
  * Test case that test the correct use of the multi-port antennas in spectrum.
  * The test does the following:
@@ -1203,9 +1223,9 @@
     /**
      * Constructor
      * Currently only configurable through constructor are polSlantAngle and bearingAngle.
-     * \param isotropic whether the antenna elements are isotropic, or 3GPP
-     * \param polSlantAngle the polarization slant angle
-     * \param bearingAngle the bearing angle
+     * @param isotropic whether the antenna elements are isotropic, or 3GPP
+     * @param polSlantAngle the polarization slant angle
+     * @param bearingAngle the bearing angle
      */
     MimoPolarizationAntennaParams(bool isotropic, double polSlantAngle = 0, double bearingAngle = 0)
         : m_isotropic(isotropic),
@@ -1216,7 +1236,7 @@
 };
 
 /**
- * \ingroup spectrum-tests
+ * @ingroup spectrum-tests
  * This test tests that the channel matrix is correctly generated when dual-polarized
  * antennas are being used at TX and RX. In the conditions in which the channel between
  * the TX and Rx device is LOS channel, and the beams of the transmitter and the
@@ -1249,13 +1269,13 @@
     /**
      * Constructor that receives MIMO polarization parameters of TX and RX
      * devices
-     * \param testCaseName the test case name
-     * \param txLoc the position of the transmitter
-     * \param txAntennaParams the antenna parameters of the transmitter
-     * \param rxLoc the position of the receiver
-     * \param rxAntennaParams the antenna parameters of the receiver
-     * \param testChannel the test matrix that represent the strongest cluster
-     * \param tolerance the tolerance to be used when testing
+     * @param testCaseName the test case name
+     * @param txLoc the position of the transmitter
+     * @param txAntennaParams the antenna parameters of the transmitter
+     * @param rxLoc the position of the receiver
+     * @param rxAntennaParams the antenna parameters of the receiver
+     * @param testChannel the test matrix that represent the strongest cluster
+     * @param tolerance the tolerance to be used when testing
      */
     ThreeGppMimoPolarizationTest(std::string testCaseName,
                                  Vector txLoc,
@@ -1431,7 +1451,7 @@
 }
 
 /**
- * \ingroup spectrum-tests
+ * @ingroup spectrum-tests
  *
  * Test suite for the ThreeGppChannelModel class
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/test/tv-helper-distribution-test.cc ns-3.44/src/spectrum/test/tv-helper-distribution-test.cc
--- ns-3.43/src/spectrum/test/tv-helper-distribution-test.cc	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/spectrum/test/tv-helper-distribution-test.cc	2025-03-09 16:55:49.699372300 -0700
@@ -6,16 +6,16 @@
  * Author: Benjamin Cizdziel <ben.cizdziel@gmail.com>
  */
 
-#include <ns3/log.h>
-#include <ns3/test.h>
-#include <ns3/tv-spectrum-transmitter-helper.h>
+#include "ns3/log.h"
+#include "ns3/test.h"
+#include "ns3/tv-spectrum-transmitter-helper.h"
 
 NS_LOG_COMPONENT_DEFINE("TvHelperDistributionTest");
 
 using namespace ns3;
 
 /**
- * \ingroup spectrum-tests
+ * @ingroup spectrum-tests
  *
  * This test verifies the accuracy of the private GetRandomNumTransmitters()
  * method in the TvSpectrumTransmitterHelper class. The method generates a
@@ -40,7 +40,7 @@
     /**
      * Constructor
      *
-     * \param maxNumTransmitters maximum number of transmitters.
+     * @param maxNumTransmitters maximum number of transmitters.
      */
     TvHelperDistributionTestCase(uint32_t maxNumTransmitters);
     ~TvHelperDistributionTestCase() override;
@@ -49,8 +49,8 @@
     void DoRun() override;
     /**
      * Build the test name
-     * \param maxNumTransmitters maximum number of transmitters.
-     * \return The test name
+     * @param maxNumTransmitters maximum number of transmitters.
+     * @return The test name
      */
     static std::string Name(uint32_t maxNumTransmitters);
     uint32_t m_maxNumTransmitters; //!< Maximum number of transmitters.
@@ -122,7 +122,7 @@
 }
 
 /**
- * \ingroup spectrum-tests
+ * @ingroup spectrum-tests
  *
  * Test suite for the TvSpectrumTransmitterHelper class
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/test/tv-spectrum-transmitter-test.cc ns-3.44/src/spectrum/test/tv-spectrum-transmitter-test.cc
--- ns-3.43/src/spectrum/test/tv-spectrum-transmitter-test.cc	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/spectrum/test/tv-spectrum-transmitter-test.cc	2025-03-09 16:55:49.699372300 -0700
@@ -6,12 +6,12 @@
  * Author: Benjamin Cizdziel <ben.cizdziel@gmail.com>
  */
 
-#include <ns3/double.h>
-#include <ns3/enum.h>
-#include <ns3/log.h>
-#include <ns3/spectrum-value.h>
-#include <ns3/test.h>
-#include <ns3/tv-spectrum-transmitter.h>
+#include "ns3/double.h"
+#include "ns3/enum.h"
+#include "ns3/log.h"
+#include "ns3/spectrum-value.h"
+#include "ns3/test.h"
+#include "ns3/tv-spectrum-transmitter.h"
 
 NS_LOG_COMPONENT_DEFINE("TvSpectrumTransmitterTest");
 
@@ -23,7 +23,7 @@
 double epsilon;
 
 /**
- * \ingroup spectrum-tests
+ * @ingroup spectrum-tests
  *
  * This test verifies the accuracy of the spectrum/PSD model in the
  * TvSpectrumTransmitter class. To do so, it tests if the max power spectral
@@ -36,10 +36,10 @@
   public:
     /**
      * Constructor
-     * \param startFrequency Start frequency.
-     * \param channelBandwidth Channel Bandwidth.
-     * \param basePsd Base Power Spectral Density (PSD).
-     * \param tvType TV type.
+     * @param startFrequency Start frequency.
+     * @param channelBandwidth Channel Bandwidth.
+     * @param basePsd Base Power Spectral Density (PSD).
+     * @param tvType TV type.
      */
     TvSpectrumTransmitterTestCase(double startFrequency,
                                   double channelBandwidth,
@@ -51,11 +51,11 @@
     void DoRun() override;
     /**
      * Build the test name
-     * \param tvType TV type.
-     * \param startFrequency Start frequency.
-     * \param channelBandwidth Channel Bandwidth.
-     * \param basePsd Base Power Spectral Density (PSD).
-     * \return The test name
+     * @param tvType TV type.
+     * @param startFrequency Start frequency.
+     * @param channelBandwidth Channel Bandwidth.
+     * @param basePsd Base Power Spectral Density (PSD).
+     * @return The test name
      */
     static std::string Name(TvSpectrumTransmitter::TvType tvType,
                             double startFrequency,
@@ -159,7 +159,7 @@
 }
 
 /**
- * \ingroup spectrum-tests
+ * @ingroup spectrum-tests
  *
  * Test suite for the TvSpectrumTransmitter class
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/spectrum/test/two-ray-splm-test-suite.cc ns-3.44/src/spectrum/test/two-ray-splm-test-suite.cc
--- ns-3.43/src/spectrum/test/two-ray-splm-test-suite.cc	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/spectrum/test/two-ray-splm-test-suite.cc	2025-03-09 16:55:49.699372300 -0700
@@ -4,24 +4,24 @@
  * SPDX-License-Identifier: GPL-2.0-only
  */
 
-#include <ns3/abort.h>
-#include <ns3/config.h>
-#include <ns3/constant-position-mobility-model.h>
-#include <ns3/double.h>
-#include <ns3/isotropic-antenna-model.h>
-#include <ns3/log.h>
-#include <ns3/mobility-helper.h>
-#include <ns3/node-container.h>
-#include <ns3/pointer.h>
-#include <ns3/simulator.h>
-#include <ns3/string.h>
-#include <ns3/test.h>
-#include <ns3/three-gpp-antenna-model.h>
-#include <ns3/three-gpp-channel-model.h>
-#include <ns3/three-gpp-spectrum-propagation-loss-model.h>
-#include <ns3/two-ray-spectrum-propagation-loss-model.h>
-#include <ns3/uinteger.h>
-#include <ns3/uniform-planar-array.h>
+#include "ns3/abort.h"
+#include "ns3/config.h"
+#include "ns3/constant-position-mobility-model.h"
+#include "ns3/double.h"
+#include "ns3/isotropic-antenna-model.h"
+#include "ns3/log.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/node-container.h"
+#include "ns3/pointer.h"
+#include "ns3/simulator.h"
+#include "ns3/string.h"
+#include "ns3/test.h"
+#include "ns3/three-gpp-antenna-model.h"
+#include "ns3/three-gpp-channel-model.h"
+#include "ns3/three-gpp-spectrum-propagation-loss-model.h"
+#include "ns3/two-ray-spectrum-propagation-loss-model.h"
+#include "ns3/uinteger.h"
+#include "ns3/uniform-planar-array.h"
 
 #include <array>
 
@@ -30,7 +30,7 @@
 NS_LOG_COMPONENT_DEFINE("TwoRaySplmTestSuite");
 
 /**
- * \ingroup spectrum-tests
+ * @ingroup spectrum-tests
  *
  * Test case for the TwoRaySpectrumPropagationLossModel class.
  *
@@ -58,8 +58,8 @@
 
     /**
      * Compute the average of the FTR squared norm.
-     * \param [in] ftrParams The FTR parameters.
-     * \returns The average of \c N_MEASUREMENTS FTR samples.
+     * @param [in] ftrParams The FTR parameters.
+     * @returns The average of \c N_MEASUREMENTS FTR samples.
      */
     double FtrSquaredNormAverage(
         const TwoRaySpectrumPropagationLossModel::FtrParams& ftrParams) const;
@@ -78,9 +78,9 @@
      * Two-Ray Fading Model for mmWave Communications," 2016 IEEE Globecom Workshops (GC Wkshps) for
      * further details.
      *
-     * \param [in] sigma The sigma parameter of the FTR model.
-     * \param [in] k The k parameter of the FTR model.
-     * \returns The expected mean.
+     * @param [in] sigma The sigma parameter of the FTR model.
+     * @param [in] k The k parameter of the FTR model.
+     * @returns The expected mean.
      */
     constexpr double FtrSquaredNormExpectedMean(double sigma, double k) const;
 
@@ -177,7 +177,7 @@
 }
 
 /**
- * \ingroup spectrum-tests
+ * @ingroup spectrum-tests
  *
  * Test case for the TwoRaySpectrumPropagationLossModel class.
  *
@@ -189,15 +189,15 @@
   public:
     /**
      * The constructor of the test case
-     * \param txAntElem the antenna element of the TX antenna panel
-     * \param rxAntElem the antenna element of the RX antenna panel
-     * \param txNumAntennas the number of antenna elements of the TX antenna panel
-     * \param rxNumAntennas the number of antenna elements of the RX antenna panel
-     * \param txPosVec the position of the TX
-     * \param rxPosVec the position of the RX
-     * \param txBearing the bearing angle of the TX antenna panel
-     * \param rxBearing the bearing angle of the RX antenna panel
-     * \param expectedGain the theoretically expected gain for the above parameters
+     * @param txAntElem the antenna element of the TX antenna panel
+     * @param rxAntElem the antenna element of the RX antenna panel
+     * @param txNumAntennas the number of antenna elements of the TX antenna panel
+     * @param rxNumAntennas the number of antenna elements of the RX antenna panel
+     * @param txPosVec the position of the TX
+     * @param rxPosVec the position of the RX
+     * @param txBearing the bearing angle of the TX antenna panel
+     * @param rxBearing the bearing angle of the RX antenna panel
+     * @param expectedGain the theoretically expected gain for the above parameters
      */
     ArrayResponseTest(Ptr<AntennaModel> txAntElem,
                       Ptr<AntennaModel> rxAntElem,
@@ -316,7 +316,7 @@
 }
 
 /**
- * \ingroup spectrum-tests
+ * @ingroup spectrum-tests
  *
  * Test case for the TwoRaySpectrumPropagationLossModel class.
  *
@@ -330,12 +330,12 @@
   public:
     /**
      * The constructor of the test case
-     * \param txAntElem the antenna element of the TX antenna panel
-     * \param rxAntElem the antenna element of the RX antenna panel
-     * \param txNumAntennas the number of antenna elements of the TX antenna panel
-     * \param rxNumAntennas the number of antenna elements of the RX antenna panel
-     * \param fc the carrier frequency
-     * \param threeGppScenario the 3GPP scenario
+     * @param txAntElem the antenna element of the TX antenna panel
+     * @param rxAntElem the antenna element of the RX antenna panel
+     * @param txNumAntennas the number of antenna elements of the TX antenna panel
+     * @param rxNumAntennas the number of antenna elements of the RX antenna panel
+     * @param fc the carrier frequency
+     * @param threeGppScenario the 3GPP scenario
      */
     OverallGainAverageTest(Ptr<AntennaModel> txAntElem,
                            Ptr<AntennaModel> rxAntElem,
@@ -347,8 +347,8 @@
     /**
      * Computes the overall power of a PSD
      *
-     * \param psd the PSD
-     * \returns the overall power of the PSD, obtained as the integral of the
+     * @param psd the PSD
+     * @returns the overall power of the PSD, obtained as the integral of the
      *          sub-bands power over the PSD domain
      */
     double ComputePowerSpectralDensityOverallPower(Ptr<const SpectrumValue> psd);
@@ -357,8 +357,8 @@
      * Creates a PSD centered at fc, of bandwidth bw and sub-bands of
      * width rbWidth
      *
-     * \param fc the central frequency of the PSD
-     * \returns a PSD centered at fc, of bandwidth bw and sub-bands of
+     * @param fc the central frequency of the PSD
+     * @returns a PSD centered at fc, of bandwidth bw and sub-bands of
      *          width rbWidths
      */
     Ptr<SpectrumValue> CreateTxPowerSpectralDensity(double fc);
@@ -572,7 +572,7 @@
 }
 
 /**
- * \ingroup spectrum-tests
+ * @ingroup spectrum-tests
  *
  * Test suite for the TwoRaySpectrumPropagationLossModel class
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/stats/doc/probe.rst ns-3.44/src/stats/doc/probe.rst
--- ns-3.43/src/stats/doc/probe.rst	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/stats/doc/probe.rst	2025-03-09 16:55:49.699372300 -0700
@@ -93,8 +93,8 @@
   Ptr<DoubleProbe> myprobe = CreateObjectWithAttributes<DoubleProbe>(
       "Name", StringValue("myprobe"),
       "Enabled", BooleanValue(false),
-      "Start", TimeValue(Seconds(100.0)),
-      "Stop", TimeValue(Seconds(1000.0)));
+      "Start", TimeValue(Seconds(100)),
+      "Stop", TimeValue(Seconds(1000)));
 
 Start and Stop are Time variables which determine the interval of action
 of the Probe. The Probe will only output data if the current time of the
@@ -301,7 +301,7 @@
 
     // The Emitter object is not associated with an ns-3 node, so
     // it won't get started automatically, so we need to do this ourselves
-    Simulator::Schedule(Seconds(0.0), &Emitter::Start, emitter);
+    Simulator::Schedule(Seconds(0), &Emitter::Start, emitter);
 
 The various DoubleProbes interact with the emitter in the example as
 shown below.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/stats/examples/double-probe-example.cc ns-3.44/src/stats/examples/double-probe-example.cc
--- ns-3.43/src/stats/examples/double-probe-example.cc	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/stats/examples/double-probe-example.cc	2025-03-09 16:55:49.699372300 -0700
@@ -28,7 +28,7 @@
   public:
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
     Emitter();
@@ -97,9 +97,9 @@
 /**
  * This is a function to test hooking a raw function to the trace source,
  *
- * \param context The trace context.
- * \param oldVal Old value.
- * \param newVal New value.
+ * @param context The trace context.
+ * @param oldVal Old value.
+ * @param newVal New value.
  */
 void
 NotifyViaTraceSource(std::string context, double oldVal, double newVal)
@@ -110,9 +110,9 @@
 /**
  * This is a function to test hooking it to the probe output
  *
- * \param context The trace context.
- * \param oldVal Old value.
- * \param newVal New value.
+ * @param context The trace context.
+ * @param oldVal Old value.
+ * @param newVal New value.
  */
 void
 NotifyViaProbe(std::string context, double oldVal, double newVal)
@@ -201,9 +201,9 @@
 
     // The Emitter object is not associated with an ns-3 node, so
     // it won't get started automatically, so we need to do this ourselves
-    Simulator::Schedule(Seconds(0.0), &Emitter::Initialize, emitter);
+    Simulator::Schedule(Seconds(0), &Emitter::Initialize, emitter);
 
-    Simulator::Stop(Seconds(100.0));
+    Simulator::Stop(Seconds(100));
     Simulator::Run();
     Simulator::Destroy();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/stats/examples/file-helper-example.cc ns-3.44/src/stats/examples/file-helper-example.cc
--- ns-3.43/src/stats/examples/file-helper-example.cc	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/stats/examples/file-helper-example.cc	2025-03-09 16:55:49.699372300 -0700
@@ -32,7 +32,7 @@
   public:
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
     Emitter();
@@ -118,9 +118,9 @@
 
     // The Emitter object is not associated with an ns-3 node, so
     // it won't get started automatically, so we need to do this ourselves
-    Simulator::Schedule(Seconds(0.0), &Emitter::Initialize, emitter);
+    Simulator::Schedule(Seconds(0), &Emitter::Initialize, emitter);
 
-    Simulator::Stop(Seconds(100.0));
+    Simulator::Stop(Seconds(100));
     Simulator::Run();
     Simulator::Destroy();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/stats/examples/gnuplot-helper-example.cc ns-3.44/src/stats/examples/gnuplot-helper-example.cc
--- ns-3.43/src/stats/examples/gnuplot-helper-example.cc	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/stats/examples/gnuplot-helper-example.cc	2025-03-09 16:55:49.699372300 -0700
@@ -32,7 +32,7 @@
   public:
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
     Emitter();
@@ -126,9 +126,9 @@
 
     // The Emitter object is not associated with an ns-3 node, so
     // it won't get started automatically, so we need to do this ourselves
-    Simulator::Schedule(Seconds(0.0), &Emitter::Initialize, emitter);
+    Simulator::Schedule(Seconds(0), &Emitter::Initialize, emitter);
 
-    Simulator::Stop(Seconds(100.0));
+    Simulator::Stop(Seconds(100));
     Simulator::Run();
     Simulator::Destroy();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/stats/examples/time-probe-example.cc ns-3.44/src/stats/examples/time-probe-example.cc
--- ns-3.43/src/stats/examples/time-probe-example.cc	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/stats/examples/time-probe-example.cc	2025-03-09 16:55:49.699372300 -0700
@@ -43,7 +43,7 @@
   public:
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
     Emitter();
@@ -75,8 +75,8 @@
 }
 
 Emitter::Emitter()
-    : m_interval(Seconds(0)),
-      m_last(Seconds(0))
+    : m_interval(),
+      m_last()
 {
     m_var = CreateObject<ExponentialRandomVariable>();
 }
@@ -234,7 +234,7 @@
 
     // The Emitter object is not associated with an ns-3 node, so
     // it won't get started automatically, so we need to do this ourselves
-    Simulator::Schedule(Seconds(0.0), &Emitter::Initialize, emitter);
+    Simulator::Schedule(Seconds(0), &Emitter::Initialize, emitter);
 
     Simulator::Stop(Seconds(stopTime));
     Simulator::Run();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/stats/helper/file-helper.h ns-3.44/src/stats/helper/file-helper.h
--- ns-3.43/src/stats/helper/file-helper.h	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/stats/helper/file-helper.h	2025-03-09 16:55:49.699372300 -0700
@@ -22,8 +22,8 @@
 {
 
 /**
- * \ingroup stats
- * \brief Helper class used to put data values into a file.
+ * @ingroup stats
+ * @brief Helper class used to put data values into a file.
  **/
 class FileHelper
 {
@@ -35,9 +35,9 @@
     FileHelper();
 
     /**
-     * \param outputFileNameWithoutExtension name of output file to
+     * @param outputFileNameWithoutExtension name of output file to
      * write with no extension
-     * \param fileType type of file to write.
+     * @param fileType type of file to write.
      *
      * Constructs a file helper that will create a file named
      * outputFileNameWithoutExtension plus possible extra information
@@ -50,9 +50,9 @@
     virtual ~FileHelper();
 
     /**
-     * \param outputFileNameWithoutExtension name of output file to
+     * @param outputFileNameWithoutExtension name of output file to
      * write with no extension
-     * \param fileType type of file to write.
+     * @param fileType type of file to write.
      *
      * Configures file related parameters for this file helper so that
      * it will create a file named outputFileNameWithoutExtension plus
@@ -64,9 +64,9 @@
                        FileAggregator::FileType fileType = FileAggregator::SPACE_SEPARATED);
 
     /**
-     * \param typeId the type ID for the probe used when it is created.
-     * \param path Config path for underlying trace source to be probed
-     * \param probeTraceSource the probe trace source to access.
+     * @param typeId the type ID for the probe used when it is created.
+     * @param path Config path for underlying trace source to be probed
+     * @param probeTraceSource the probe trace source to access.
      *
      * Creates output files generated by hooking the ns-3 trace source
      * with a probe, and then writing the values from the
@@ -98,34 +98,34 @@
                     const std::string& probeTraceSource);
 
     /**
-     * \param adaptorName the timeSeriesAdaptor's name.
+     * @param adaptorName the timeSeriesAdaptor's name.
      *
-     * \brief Adds a time series adaptor to be used to write the file.
+     * @brief Adds a time series adaptor to be used to write the file.
      */
     void AddTimeSeriesAdaptor(const std::string& adaptorName);
 
     /**
-     * \param aggregatorName the aggregator's name.
-     * \param outputFileName name of the file to write.
-     * \param onlyOneAggregator indicates if more than one aggregator
+     * @param aggregatorName the aggregator's name.
+     * @param outputFileName name of the file to write.
+     * @param onlyOneAggregator indicates if more than one aggregator
      * should be created or not.
      *
-     * \brief Adds an aggregator to be used to write values to files.
+     * @brief Adds an aggregator to be used to write values to files.
      */
     void AddAggregator(const std::string& aggregatorName,
                        const std::string& outputFileName,
                        bool onlyOneAggregator);
 
     /**
-     * \param probeName the probe's name.
-     * \return Ptr to the probe
-     * \brief Gets the specified probe.
+     * @param probeName the probe's name.
+     * @return Ptr to the probe
+     * @brief Gets the specified probe.
      */
     Ptr<Probe> GetProbe(std::string probeName) const;
 
     /**
-     * \return Ptr to a FileAggregator object
-     * \brief Gets the single aggregator that is always constructed.
+     * @return Ptr to a FileAggregator object
+     * @brief Gets the single aggregator that is always constructed.
      *
      * This function is non-const because an aggregator may be lazily
      * created by this method.
@@ -133,10 +133,10 @@
     Ptr<FileAggregator> GetAggregatorSingle();
 
     /**
-     * \param aggregatorName name for aggregator.
-     * \param outputFileName name of output file to write.
-     * \return Ptr to a FileAggregator object
-     * \brief Gets one of the multiple aggregators from the map.
+     * @param aggregatorName name for aggregator.
+     * @param outputFileName name of output file to write.
+     * @return Ptr to a FileAggregator object
+     * @brief Gets one of the multiple aggregators from the map.
      *
      * This function is non-const because an aggregator may be lazily
      * created by this method.
@@ -145,9 +145,9 @@
                                               const std::string& outputFileName);
 
     /**
-     * \param heading the heading string.
+     * @param heading the heading string.
      *
-     * \brief Sets the heading string that will be printed on the first
+     * @brief Sets the heading string that will be printed on the first
      * line of the file.
      *
      * Note that the heading string will only be printed if it has been
@@ -156,107 +156,107 @@
     void SetHeading(const std::string& heading);
 
     /**
-     * \param format the 1D format string.
+     * @param format the 1D format string.
      *
-     * \brief Sets the 1D format string for the C-style sprintf()
+     * @brief Sets the 1D format string for the C-style sprintf()
      * function.
      */
     void Set1dFormat(const std::string& format);
 
     /**
-     * \param format the 2D format string.
+     * @param format the 2D format string.
      *
-     * \brief Sets the 2D format string for the C-style sprintf()
+     * @brief Sets the 2D format string for the C-style sprintf()
      * function.
      */
     void Set2dFormat(const std::string& format);
 
     /**
-     * \param format the 3D format string.
+     * @param format the 3D format string.
      *
-     * \brief Sets the 3D format string for the C-style sprintf()
+     * @brief Sets the 3D format string for the C-style sprintf()
      * function.
      */
     void Set3dFormat(const std::string& format);
 
     /**
-     * \param format the 4D format string.
+     * @param format the 4D format string.
      *
-     * \brief Sets the 4D format string for the C-style sprintf()
+     * @brief Sets the 4D format string for the C-style sprintf()
      * function.
      */
     void Set4dFormat(const std::string& format);
 
     /**
-     * \param format the 5D format string.
+     * @param format the 5D format string.
      *
-     * \brief Sets the 5D format string for the C-style sprintf()
+     * @brief Sets the 5D format string for the C-style sprintf()
      * function.
      */
     void Set5dFormat(const std::string& format);
 
     /**
-     * \param format the 6D format string.
+     * @param format the 6D format string.
      *
-     * \brief Sets the 6D format string for the C-style sprintf()
+     * @brief Sets the 6D format string for the C-style sprintf()
      * function.
      */
     void Set6dFormat(const std::string& format);
 
     /**
-     * \param format the 7D format string.
+     * @param format the 7D format string.
      *
-     * \brief Sets the 7D format string for the C-style sprintf()
+     * @brief Sets the 7D format string for the C-style sprintf()
      * function.
      */
     void Set7dFormat(const std::string& format);
 
     /**
-     * \param format the 8D format string.
+     * @param format the 8D format string.
      *
-     * \brief Sets the 8D format string for the C-style sprintf()
+     * @brief Sets the 8D format string for the C-style sprintf()
      * function.
      */
     void Set8dFormat(const std::string& format);
 
     /**
-     * \param format the 9D format string.
+     * @param format the 9D format string.
      *
-     * \brief Sets the 9D format string for the C-style sprintf()
+     * @brief Sets the 9D format string for the C-style sprintf()
      * function.
      */
     void Set9dFormat(const std::string& format);
 
     /**
-     * \param format the 10D format string.
+     * @param format the 10D format string.
      *
-     * \brief Sets the 10D format string for the C-style sprintf()
+     * @brief Sets the 10D format string for the C-style sprintf()
      * function.
      */
     void Set10dFormat(const std::string& format);
 
   private:
     /**
-     * \param typeId the type ID for the probe used when it is created.
-     * \param probeName the probe's name.
-     * \param path Config path to access the probe
+     * @param typeId the type ID for the probe used when it is created.
+     * @param probeName the probe's name.
+     * @param path Config path to access the probe
      *
-     * \brief Adds a probe to be used to write values to files.
+     * @brief Adds a probe to be used to write values to files.
      */
     void AddProbe(const std::string& typeId, const std::string& probeName, const std::string& path);
 
     /**
-     * \param typeId the type ID for the probe used when it is created.
-     * \param matchIdentifier this string is used to make the probe's
+     * @param typeId the type ID for the probe used when it is created.
+     * @param matchIdentifier this string is used to make the probe's
      * context be unique.
-     * \param path Config path to access the probe.
-     * \param probeTraceSource the probe trace source to access.
-     * \param outputFileNameWithoutExtension name of output file to
+     * @param path Config path to access the probe.
+     * @param probeTraceSource the probe trace source to access.
+     * @param outputFileNameWithoutExtension name of output file to
      * write with no extension
-     * \param onlyOneAggregator indicates if more than one aggregator
+     * @param onlyOneAggregator indicates if more than one aggregator
      * should be created or not.
      *
-     * \brief Connects the probe to the aggregator.
+     * @brief Connects the probe to the aggregator.
      *
      * A fatal error will result if an unknown probe type is used.
      */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/stats/helper/gnuplot-helper.cc ns-3.44/src/stats/helper/gnuplot-helper.cc
--- ns-3.43/src/stats/helper/gnuplot-helper.cc	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/stats/helper/gnuplot-helper.cc	2025-03-09 16:55:49.699372300 -0700
@@ -107,7 +107,7 @@
     aggregator->SetTitle(m_title + " \\n\\nTrace Source Path: " + path);
 
     // Set the default dataset plotting style for the values.
-    aggregator->Set2dDatasetDefaultStyle(Gnuplot2dDataset::LINES_POINTS);
+    GnuplotAggregator::Set2dDatasetDefaultStyle(Gnuplot2dDataset::LINES_POINTS);
 
     // Set the location of the key in the plot.
     aggregator->SetKeyLocation(keyLocation);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/stats/helper/gnuplot-helper.h ns-3.44/src/stats/helper/gnuplot-helper.h
--- ns-3.43/src/stats/helper/gnuplot-helper.h	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/stats/helper/gnuplot-helper.h	2025-03-09 16:55:49.699372300 -0700
@@ -23,8 +23,8 @@
 {
 
 /**
- * \ingroup gnuplot
- * \brief Helper class used to make gnuplot plots.
+ * @ingroup gnuplot
+ * @brief Helper class used to make gnuplot plots.
  **/
 class GnuplotHelper
 {
@@ -39,12 +39,12 @@
     GnuplotHelper();
 
     /**
-     * \param outputFileNameWithoutExtension name of gnuplot related files to
+     * @param outputFileNameWithoutExtension name of gnuplot related files to
      * write with no extension
-     * \param title plot title string to use for this plot.
-     * \param xLegend the legend for the x horizontal axis.
-     * \param yLegend the legend for the y vertical axis.
-     * \param terminalType terminal type setting string for output. The
+     * @param title plot title string to use for this plot.
+     * @param xLegend the legend for the x horizontal axis.
+     * @param yLegend the legend for the y vertical axis.
+     * @param terminalType terminal type setting string for output. The
      * default terminal type is "png"
      *
      * Constructs a gnuplot helper that will create a space separated
@@ -62,12 +62,12 @@
     virtual ~GnuplotHelper();
 
     /**
-     * \param outputFileNameWithoutExtension name of gnuplot related files to
+     * @param outputFileNameWithoutExtension name of gnuplot related files to
      * write with no extension
-     * \param title plot title string to use for this plot.
-     * \param xLegend the legend for the x horizontal axis.
-     * \param yLegend the legend for the y vertical axis.
-     * \param terminalType terminal type setting string for output. The
+     * @param title plot title string to use for this plot.
+     * @param xLegend the legend for the x horizontal axis.
+     * @param yLegend the legend for the y vertical axis.
+     * @param terminalType terminal type setting string for output. The
      * default terminal type is "png"
      *
      * Configures plot related parameters for this gnuplot helper so
@@ -84,11 +84,11 @@
                        const std::string& terminalType = "png");
 
     /**
-     * \param typeId the type ID for the probe used when it is created.
-     * \param path Config path for underlying trace source to be probed
-     * \param probeTraceSource the probe trace source to access.
-     * \param title the title to be associated to this dataset
-     * \param keyLocation the location of the key in the plot.
+     * @param typeId the type ID for the probe used when it is created.
+     * @param path Config path for underlying trace source to be probed
+     * @param probeTraceSource the probe trace source to access.
+     * @param title the title to be associated to this dataset
+     * @param keyLocation the location of the key in the plot.
      *
      * Plots a dataset generated by hooking the ns-3 trace source with a
      * probe, and then plot the values from the probeTraceSource. The dataset
@@ -116,22 +116,22 @@
                    GnuplotAggregator::KeyLocation keyLocation = GnuplotAggregator::KEY_INSIDE);
 
     /**
-     * \param adaptorName the timeSeriesAdaptor's name.
+     * @param adaptorName the timeSeriesAdaptor's name.
      *
-     * \brief Adds a time series adaptor to be used to make the plot.
+     * @brief Adds a time series adaptor to be used to make the plot.
      */
     void AddTimeSeriesAdaptor(const std::string& adaptorName);
 
     /**
-     * \param probeName the probe's name.
-     * \return Ptr to probe
-     * \brief Gets the specified probe.
+     * @param probeName the probe's name.
+     * @return Ptr to probe
+     * @brief Gets the specified probe.
      */
     Ptr<Probe> GetProbe(std::string probeName) const;
 
     /**
-     * \return Ptr to GnuplotAggregator object
-     * \brief Gets the aggregator.
+     * @return Ptr to GnuplotAggregator object
+     * @brief Gets the aggregator.
      *
      * This function is non-const because an aggregator may be lazily
      * created by this method.
@@ -140,28 +140,28 @@
 
   private:
     /**
-     * \param typeId the type ID for the probe used when it is created.
-     * \param probeName the probe's name.
-     * \param path Config path to access the probe.
+     * @param typeId the type ID for the probe used when it is created.
+     * @param probeName the probe's name.
+     * @param path Config path to access the probe.
      *
-     * \brief Adds a probe to be used to make the plot.
+     * @brief Adds a probe to be used to make the plot.
      */
     void AddProbe(const std::string& typeId, const std::string& probeName, const std::string& path);
 
     /**
-     * \brief Constructs the aggregator.
+     * @brief Constructs the aggregator.
      */
     void ConstructAggregator();
 
     /**
-     * \param typeId the type ID for the probe used when it is created.
-     * \param matchIdentifier this string is used to make the probe's
+     * @param typeId the type ID for the probe used when it is created.
+     * @param matchIdentifier this string is used to make the probe's
      * context be unique.
-     * \param path Config path to access the probe.
-     * \param probeTraceSource the probe trace source to access.
-     * \param title the title to be associated to this dataset.
+     * @param path Config path to access the probe.
+     * @param probeTraceSource the probe trace source to access.
+     * @param title the title to be associated to this dataset.
      *
-     * \brief Connects the probe to the aggregator.
+     * @brief Connects the probe to the aggregator.
      */
     void ConnectProbeToAggregator(const std::string& typeId,
                                   const std::string& matchIdentifier,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/stats/model/average.h ns-3.44/src/stats/model/average.h
--- ns-3.43/src/stats/model/average.h	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/stats/model/average.h	2025-03-09 16:55:49.699372300 -0700
@@ -21,7 +21,7 @@
 {
 
 /**
- * \ingroup stats
+ * @ingroup stats
  *
  * Simple average, min, max and std. deviation calculator
  *
@@ -40,7 +40,7 @@
 
     /**
      * Add new sample
-     * \param x The sample
+     * @param x The sample
      */
     void Update(const T& x)
     {
@@ -65,7 +65,7 @@
     // Sample statistics
     /**
      * Sample size
-     * \return the sample size
+     * @return the sample size
      */
     uint32_t Count() const
     {
@@ -74,7 +74,7 @@
 
     /**
      * Sample minimum
-     * \return the minimum of the sample
+     * @return the minimum of the sample
      */
     T Min() const
     {
@@ -83,7 +83,7 @@
 
     /**
      * Sample maximum
-     * \return the maximum of the sample
+     * @return the maximum of the sample
      */
     T Max() const
     {
@@ -92,7 +92,7 @@
 
     /**
      * Sample average
-     * \return the average of the sample
+     * @return the average of the sample
      */
     double Avg() const
     {
@@ -101,7 +101,7 @@
 
     /**
      * Sample estimate of mean, alias to Avg
-     * \return the average of the sample
+     * @return the average of the sample
      */
     double Mean() const
     {
@@ -110,7 +110,7 @@
 
     /**
      * Sample unbiased nbiased estimate of variance
-     * \return the unbiased nbiased estimate of variance
+     * @return the unbiased nbiased estimate of variance
      */
     double Var() const
     {
@@ -119,7 +119,7 @@
 
     /**
      * Sample standard deviation
-     * \return the standard deviation
+     * @return the standard deviation
      */
     double Stddev() const
     {
@@ -127,19 +127,19 @@
     }
 
     /**
-     * \name Error of the mean estimates
+     * @name Error of the mean estimates
      *
      * @{
      */
     /**
-     * \brief Margin of error of the mean for 90% confidence level
+     * @brief Margin of error of the mean for 90% confidence level
      *
      * Note that estimates are valid for
      *   - uncorrelated measurements,
      *   - normal distribution and
      *   - large enough sample size.
      *
-     * \returns Margin of error of the mean for 90% confidence level
+     * @returns Margin of error of the mean for 90% confidence level
      */
     double Error90() const
     {
@@ -147,14 +147,14 @@
     }
 
     /**
-     * \brief Margin of error of the mean for 95% confidence level
+     * @brief Margin of error of the mean for 95% confidence level
      *
      * Note that estimates are valid for
      *   - uncorrelated measurements,
      *   - normal distribution and
      *   - large enough sample size.
      *
-     * \returns Margin of error of the mean for 95% confidence level
+     * @returns Margin of error of the mean for 95% confidence level
      */
     double Error95() const
     {
@@ -162,14 +162,14 @@
     }
 
     /**
-     * \brief Margin of error of the mean for 99% confidence level
+     * @brief Margin of error of the mean for 99% confidence level
      *
      * Note that estimates are valid for
      *   - uncorrelated measurements,
      *   - normal distribution and
      *   - large enough sample size.
      *
-     * \returns Margin of error of the mean for 99% confidence level
+     * @returns Margin of error of the mean for 99% confidence level
      *
      */
     double Error99() const
@@ -188,9 +188,9 @@
 
 /**
  * Print avg (err) [min, max]
- * \param os The output stream
- * \param x The Average value to print
- * \return the output stream.
+ * @param os The output stream
+ * @param x The Average value to print
+ * @return the output stream.
  */
 template <typename T>
 std::ostream&
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/stats/model/basic-data-calculators.h ns-3.44/src/stats/model/basic-data-calculators.h
--- ns-3.43/src/stats/model/basic-data-calculators.h	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/stats/model/basic-data-calculators.h	2025-03-09 16:55:49.699372300 -0700
@@ -18,9 +18,9 @@
 {
 
 /**
- * \ingroup stats
- * \class MinMaxAvgTotalCalculator
- * \brief Template class MinMaxAvgTotalCalculator
+ * @ingroup stats
+ * @class MinMaxAvgTotalCalculator
+ * @brief Template class MinMaxAvgTotalCalculator
  *
  */
 //------------------------------------------------------------
@@ -34,13 +34,13 @@
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
     /**
      * Updates all variables of MinMaxAvgTotalCalculator
-     * \param i value of type T to use for updating the calculator
+     * @param i value of type T to use for updating the calculator
      */
     void Update(const T i);
     /**
@@ -50,13 +50,13 @@
 
     /**
      * Outputs the data based on the provided callback
-     * \param callback
+     * @param callback
      */
     void Output(DataOutputCallback& callback) const override;
 
     /**
      * Returns the count
-     * \return Count
+     * @return Count
      */
     long getCount() const override
     {
@@ -65,7 +65,7 @@
 
     /**
      * Returns the sum
-     * \return Total
+     * @return Total
      */
     double getSum() const override
     {
@@ -74,7 +74,7 @@
 
     /**
      * Returns the minimum value
-     * \return Min
+     * @return Min
      */
     double getMin() const override
     {
@@ -83,7 +83,7 @@
 
     /**
      * Returns the maximum value
-     * \return Max
+     * @return Max
      */
     double getMax() const override
     {
@@ -92,7 +92,7 @@
 
     /**
      * Returns the mean value
-     * \return Mean
+     * @return Mean
      */
     double getMean() const override
     {
@@ -101,7 +101,7 @@
 
     /**
      * Returns the standard deviation
-     * \return Standard deviation
+     * @return Standard deviation
      */
     double getStddev() const override
     {
@@ -110,7 +110,7 @@
 
     /**
      * Returns the current variance
-     * \return Variance
+     * @return Variance
      */
     double getVariance() const override
     {
@@ -119,7 +119,7 @@
 
     /**
      * Returns the sum of squares
-     * \return Sum of squares
+     * @return Sum of squares
      */
     double getSqrSum() const override
     {
@@ -158,12 +158,12 @@
     m_total = 0;
     m_squareTotal = 0;
 
-    m_meanCurr = NaN;
-    m_sCurr = NaN;
-    m_varianceCurr = NaN;
+    m_meanCurr = std::nan("");
+    m_sCurr = std::nan("");
+    m_varianceCurr = std::nan("");
 
-    m_meanPrev = NaN;
-    m_sPrev = NaN;
+    m_meanPrev = std::nan("");
+    m_sPrev = std::nan("");
 }
 
 template <typename T>
@@ -261,12 +261,12 @@
     m_total = 0;
     m_squareTotal = 0;
 
-    m_meanCurr = NaN;
-    m_sCurr = NaN;
-    m_varianceCurr = NaN;
+    m_meanCurr = std::nan("");
+    m_sCurr = std::nan("");
+    m_varianceCurr = std::nan("");
 
-    m_meanPrev = NaN;
-    m_sPrev = NaN;
+    m_meanPrev = std::nan("");
+    m_sPrev = std::nan("");
     // end MinMaxAvgTotalCalculator::Reset
 }
 
@@ -278,9 +278,9 @@
 }
 
 /**
- * \ingroup stats
- * \class CounterCalculator
- * \brief Template class CounterCalculator
+ * @ingroup stats
+ * @class CounterCalculator
+ * @brief Template class CounterCalculator
  *
  */
 //------------------------------------------------------------
@@ -294,7 +294,7 @@
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
@@ -304,19 +304,19 @@
     void Update();
     /**
      * Increments count by i
-     * \param i value of type T to increment count
+     * @param i value of type T to increment count
      */
     void Update(const T i);
 
     /**
      * Returns the count of the CounterCalculator
-     * \return Count as a value of type T
+     * @return Count as a value of type T
      */
     T GetCount() const;
 
     /**
      * Outputs the data based on the provided callback
-     * \param callback
+     * @param callback
      */
     void Output(DataOutputCallback& callback) const override;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/stats/model/boolean-probe.h ns-3.44/src/stats/model/boolean-probe.h
--- ns-3.43/src/stats/model/boolean-probe.h	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/stats/model/boolean-probe.h	2025-03-09 16:55:49.699372300 -0700
@@ -24,7 +24,7 @@
 {
 
 /**
- * \ingroup probes
+ * @ingroup probes
  *
  * This class is designed to probe an underlying ns3 TraceSource exporting
  * a bool.  This probe exports a trace source "Output" of type bool.
@@ -38,44 +38,44 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     BooleanProbe();
     ~BooleanProbe() override;
 
     /**
-     * \return the most recent value
+     * @return the most recent value
      */
     bool GetValue() const;
 
     /**
-     * \param value set the traced bool to a new value
+     * @param value set the traced bool to a new value
      */
     void SetValue(bool value);
 
     /**
-     * \brief Set a probe value by its name in the Config system
+     * @brief Set a probe value by its name in the Config system
      *
-     * \param path Config path to access the probe
-     * \param value set the traced bool to a new value
+     * @param path Config path to access the probe
+     * @param value set the traced bool to a new value
      */
     static void SetValueByPath(std::string path, bool value);
 
     /**
-     * \brief connect to a trace source attribute provided by a given object
+     * @brief connect to a trace source attribute provided by a given object
      *
-     * \param traceSource the name of the attribute TraceSource to connect to
-     * \param obj ns3::Object to connect to
-     * \return true if the trace source was successfully connected
+     * @param traceSource the name of the attribute TraceSource to connect to
+     * @param obj ns3::Object to connect to
+     * @return true if the trace source was successfully connected
      */
     bool ConnectByObject(std::string traceSource, Ptr<Object> obj) override;
 
     /**
-     * \brief connect to a trace source provided by a config path
+     * @brief connect to a trace source provided by a config path
      *
-     * \param path Config path to bind to
+     * @param path Config path to bind to
      *
      * Note, if an invalid path is provided, the probe will not be connected
      * to anything.
@@ -84,10 +84,10 @@
 
   private:
     /**
-     * \brief Method to connect to an underlying ns3::TraceSource of type bool
+     * @brief Method to connect to an underlying ns3::TraceSource of type bool
      *
-     * \param oldData previous value of the bool
-     * \param newData new value of the bool
+     * @param oldData previous value of the bool
+     * @param newData new value of the bool
      */
     void TraceSink(bool oldData, bool newData);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/stats/model/data-calculator.cc ns-3.44/src/stats/model/data-calculator.cc
--- ns-3.43/src/stats/model/data-calculator.cc	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/stats/model/data-calculator.cc	2025-03-09 16:55:49.699372300 -0700
@@ -15,8 +15,8 @@
 
 NS_LOG_COMPONENT_DEFINE("DataCalculator");
 
-static double zero = 0;
-const double ns3::NaN = zero / zero;
+// NS_DEPRECATED_3_44
+const double ns3::NaN = std::nan("");
 
 //--------------------------------------------------------------
 //----------------------------------------------
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/stats/model/data-calculator.h ns-3.44/src/stats/model/data-calculator.h
--- ns-3.43/src/stats/model/data-calculator.h	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/stats/model/data-calculator.h	2025-03-09 16:55:49.699372300 -0700
@@ -9,31 +9,35 @@
 #ifndef DATA_CALCULATOR_H
 #define DATA_CALCULATOR_H
 
+#include "ns3/deprecated.h"
 #include "ns3/nstime.h"
 #include "ns3/object.h"
 #include "ns3/simulator.h"
 
 namespace ns3
 {
+NS_DEPRECATED_3_44("Use std::nan(\"\") instead")
 extern const double NaN; //!< Stored representation of NaN
 
 /**
- * \brief true if x is NaN
- * \param x
- * \return whether x is NaN
+ * @brief true if x is NaN
+ * @param x
+ * @return whether x is NaN
  */
+NS_DEPRECATED_3_44("Use std::isnan() instead")
+
 inline bool
 isNaN(double x)
 {
-    return x != x;
+    return std::isnan(x);
 }
 
 class DataOutputCallback;
 
 /**
- * \ingroup stats
- * \class StatisticalSummary
- * \brief Abstract class for calculating statistical data
+ * @ingroup stats
+ * @class StatisticalSummary
+ * @brief Abstract class for calculating statistical data
  *
  */
 class StatisticalSummary
@@ -48,49 +52,49 @@
 
     /**
      * Returns the number of observations.
-     * \return Number of observations
+     * @return Number of observations
      */
     virtual long getCount() const = 0;
 
     /**
-     * \return Sum of values
+     * @return Sum of values
      * @see getWeightedSum()
      */
     virtual double getSum() const = 0;
 
     /**
-     * \return Sum of squared values
+     * @return Sum of squared values
      * @see getWeightedSqrSum()
      */
     virtual double getSqrSum() const = 0;
 
     /**
      * Returns the minimum of the values.
-     * \return Minimum of values
+     * @return Minimum of values
      */
     virtual double getMin() const = 0;
 
     /**
      * Returns the maximum of the values.
-     * \return Maximum of values
+     * @return Maximum of values
      */
     virtual double getMax() const = 0;
 
     /**
      * Returns the mean of the (weighted) observations.
-     * \return Mean of (weighted) observations
+     * @return Mean of (weighted) observations
      */
     virtual double getMean() const = 0;
 
     /**
      * Returns the standard deviation of the (weighted) observations.
-     * \return Standard deviation of (weighted) observations
+     * @return Standard deviation of (weighted) observations
      */
     virtual double getStddev() const = 0;
 
     /**
      * Returns the variance of the (weighted) observations.
-     * \return Variance of (weighted) observations
+     * @return Variance of (weighted) observations
      */
     virtual double getVariance() const = 0;
 };
@@ -98,9 +102,9 @@
 //------------------------------------------------------------
 //--------------------------------------------
 /**
- * \ingroup stats
- * \class DataCalculator
- * \brief Calculates data during a simulation
+ * @ingroup stats
+ * @class DataCalculator
+ * @brief Calculates data during a simulation
  *
  */
 class DataCalculator : public Object
@@ -111,13 +115,13 @@
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
     /**
      * Returns whether the DataCalculator is enabled
-     * \return true if DataCalculator is enabled
+     * @return true if DataCalculator is enabled
      */
     bool GetEnabled() const;
     /**
@@ -130,40 +134,40 @@
     void Disable();
     /**
      * Sets the DataCalculator key to the provided key
-     * \param key Key value as a string
+     * @param key Key value as a string
      */
     void SetKey(const std::string key);
     /**
      * Gets the DataCalculator key
-     * \return Key value as a string
+     * @return Key value as a string
      */
     std::string GetKey() const;
 
     /**
      * Sets the DataCalculator context to the provided context
-     * \param context Context value as a string
+     * @param context Context value as a string
      */
     void SetContext(const std::string context);
     /**
      * Gets the DataCalculator context
-     * \return Context value as a string
+     * @return Context value as a string
      */
     std::string GetContext() const;
 
     /**
      * Starts DataCalculator at a given time in the simulation
-     * \param startTime
+     * @param startTime
      */
     virtual void Start(const Time& startTime);
     /**
      * Stops DataCalculator at a given time in the simulation
-     * \param stopTime
+     * @param stopTime
      */
     virtual void Stop(const Time& stopTime);
 
     /**
      * Outputs data based on the provided callback
-     * \param callback
+     * @param callback
      */
     virtual void Output(DataOutputCallback& callback) const = 0;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/stats/model/data-collection-object.h ns-3.44/src/stats/model/data-collection-object.h
--- ns-3.43/src/stats/model/data-collection-object.h	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/stats/model/data-collection-object.h	2025-03-09 16:55:49.699372300 -0700
@@ -17,7 +17,7 @@
 {
 
 /**
- * \ingroup aggregator
+ * @ingroup aggregator
  *
  * Base class for data collection framework objects.
  *
@@ -28,8 +28,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -43,19 +43,19 @@
 
     /**
      * Check the status of an individual object.
-     * \return true if the object is enabled
+     * @return true if the object is enabled
      */
     virtual bool IsEnabled() const;
 
     /**
      * Get the object's name.
-     * \return the object's name
+     * @return the object's name
      */
     std::string GetName() const;
 
     /**
      * Set the object's name.
-     * \param name the object's name
+     * @param name the object's name
      */
     void SetName(std::string name);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/stats/model/data-collector.h ns-3.44/src/stats/model/data-collector.h
--- ns-3.43/src/stats/model/data-collector.h	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/stats/model/data-collector.h	2025-03-09 16:55:49.699372300 -0700
@@ -31,9 +31,9 @@
 typedef std::list<std::pair<std::string, std::string>> MetadataList;
 
 /**
- * \ingroup dataoutput
- * \class DataCollector
- * \brief Collects data
+ * @ingroup dataoutput
+ * @class DataCollector
+ * @brief Collects data
  */
 class DataCollector : public Object
 {
@@ -43,17 +43,17 @@
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
     /**
      * Provide specific parameters to the DataCollector
-     * \param experiment Label for the experiment
-     * \param strategy Label for the strategy
-     * \param input Label for the input
-     * \param runID Label for the runID
-     * \param description Description
+     * @param experiment Label for the experiment
+     * @param strategy Label for the strategy
+     * @param input Label for the input
+     * @param runID Label for the runID
+     * @param description Description
      */
     void DescribeRun(std::string experiment,
                      std::string strategy,
@@ -63,7 +63,7 @@
 
     /**
      * Return the experiment label
-     * \return Experiment label
+     * @return Experiment label
      */
     std::string GetExperimentLabel() const
     {
@@ -72,7 +72,7 @@
 
     /**
      * Return the strategy label
-     * \return Strategy label
+     * @return Strategy label
      */
     std::string GetStrategyLabel() const
     {
@@ -81,7 +81,7 @@
 
     /**
      * Return the input label
-     * \return Input label
+     * @return Input label
      */
     std::string GetInputLabel() const
     {
@@ -90,7 +90,7 @@
 
     /**
      * Return the runID label
-     * \return Run label
+     * @return Run label
      */
     std::string GetRunLabel() const
     {
@@ -99,7 +99,7 @@
 
     /**
      * Return the description label
-     * \return Description label
+     * @return Description label
      */
     std::string GetDescription() const
     {
@@ -108,46 +108,46 @@
 
     /**
      * Add the key and the value as a pair of strings to the metadata list
-     * \param key Key value to include
-     * \param value Value to include of type string
+     * @param key Key value to include
+     * @param value Value to include of type string
      */
     void AddMetadata(std::string key, std::string value);
     /**
      * Add the key and the value as a pair of strings to the metadata list
-     * \param key Key value to include
-     * \param value Value to include of type double
+     * @param key Key value to include
+     * @param value Value to include of type double
      */
     void AddMetadata(std::string key, double value);
     /**
      * Add the key and the value as a pair of strings to the metadata list
-     * \param key Key value to include
-     * \param value Value to include of type uint32_t
+     * @param key Key value to include
+     * @param value Value to include of type uint32_t
      */
     void AddMetadata(std::string key, uint32_t value);
     /**
      * Returns an iterator to the beginning of the metadata list
-     * \return Iterator pointing to the first value of the metadata list
+     * @return Iterator pointing to the first value of the metadata list
      */
     MetadataList::iterator MetadataBegin();
     /**
      * Returns an iterator to the past-the-end of the metadata list
-     * \return Iterator pointing to the past-the-end element of the metadata list
+     * @return Iterator pointing to the past-the-end element of the metadata list
      */
     MetadataList::iterator MetadataEnd();
 
     /**
      * Add a DataCalculator object to the DataCollector
-     * \param datac DataCalculator object to be added
+     * @param datac DataCalculator object to be added
      */
     void AddDataCalculator(Ptr<DataCalculator> datac);
     /**
      * Returns an iterator to the beginning of the DataCalculator list
-     * \return Iterator pointing to the first value of the DataCalculator list
+     * @return Iterator pointing to the first value of the DataCalculator list
      */
     DataCalculatorList::iterator DataCalculatorBegin();
     /**
      * Returns an iterator to the past-the-end of the DataCalculator list
-     * \return Iterator pointing to the past-the-end element of the DataCalculator list
+     * @return Iterator pointing to the past-the-end element of the DataCalculator list
      */
     DataCalculatorList::iterator DataCalculatorEnd();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/stats/model/data-output-interface.h ns-3.44/src/stats/model/data-output-interface.h
--- ns-3.43/src/stats/model/data-output-interface.h	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/stats/model/data-output-interface.h	2025-03-09 16:55:49.699372300 -0700
@@ -22,9 +22,9 @@
 //------------------------------------------------------------
 //--------------------------------------------
 /**
- * \ingroup dataoutput
+ * @ingroup dataoutput
  *
- * \brief Abstract Data Output Interface class
+ * @brief Abstract Data Output Interface class
 s */
 class DataOutputInterface : public Object
 {
@@ -34,24 +34,24 @@
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
     /**
      * Outputs information from the provided DataCollector
-     * \param dc DataCollector object
+     * @param dc DataCollector object
      */
     virtual void Output(DataCollector& dc) = 0;
 
     /**
      * Sets the DataOutputInterface prefix to the provided prefix
-     * \param prefix prefix as a string
+     * @param prefix prefix as a string
      */
     void SetFilePrefix(const std::string prefix);
     /**
      * Gets the file prefix of the DataOutputInterface
-     * \return File prefix as a string
+     * @return File prefix as a string
      */
     std::string GetFilePrefix() const;
 
@@ -64,9 +64,9 @@
 };
 
 /**
- * \ingroup dataoutput
+ * @ingroup dataoutput
  *
- * \brief Callback class for the DataOutput classes
+ * @brief Callback class for the DataOutput classes
  *
  */
 class DataOutputCallback
@@ -81,9 +81,9 @@
 
     /**
      * Outputs the data from the specified StatisticalSummary
-     * \param key Key value of a DataCalculator
-     * \param variable Name of the variable for which statistics are being provided
-     * \param statSum Pointer to a StatisticalSummary object
+     * @param key Key value of a DataCalculator
+     * @param variable Name of the variable for which statistics are being provided
+     * @param statSum Pointer to a StatisticalSummary object
      */
     virtual void OutputStatistic(std::string key,
                                  std::string variable,
@@ -91,41 +91,41 @@
 
     /**
      * Associates the integer value with the variable name for a specific output format
-     * \param key Key value of a DataCalculator
-     * \param variable Name of the variable for which statistics are being provided
-     * \param val Value to be stored
+     * @param key Key value of a DataCalculator
+     * @param variable Name of the variable for which statistics are being provided
+     * @param val Value to be stored
      */
     virtual void OutputSingleton(std::string key, std::string variable, int val) = 0;
 
     /**
      * Associates the uint32_t value with the variable name for a specific output format
-     * \param key Key value of a DataCalculator
-     * \param variable Name of the variable for which statistics are being provided
-     * \param val Value to be stored
+     * @param key Key value of a DataCalculator
+     * @param variable Name of the variable for which statistics are being provided
+     * @param val Value to be stored
      */
     virtual void OutputSingleton(std::string key, std::string variable, uint32_t val) = 0;
 
     /**
      * Associates the double value with the variable name for a specific output format
-     * \param key Key value of a DataCalculator
-     * \param variable Name of the variable for which statistics are being provided
-     * \param val Value to be stored
+     * @param key Key value of a DataCalculator
+     * @param variable Name of the variable for which statistics are being provided
+     * @param val Value to be stored
      */
     virtual void OutputSingleton(std::string key, std::string variable, double val) = 0;
 
     /**
      * Associates the string value with the variable name for a specific output format
-     * \param key Key value of a DataCalculator
-     * \param variable Name of the variable for which statistics are being provided
-     * \param val Value to be stored
+     * @param key Key value of a DataCalculator
+     * @param variable Name of the variable for which statistics are being provided
+     * @param val Value to be stored
      */
     virtual void OutputSingleton(std::string key, std::string variable, std::string val) = 0;
 
     /**
      * Associates the Time value with the variable name for a specific output format
-     * \param key Key value of a DataCalculator
-     * \param variable Name of the variable for which statistics are being provided
-     * \param val Value to be stored
+     * @param key Key value of a DataCalculator
+     * @param variable Name of the variable for which statistics are being provided
+     * @param val Value to be stored
      */
     virtual void OutputSingleton(std::string key, std::string variable, Time val) = 0;
     // end class DataOutputCallback
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/stats/model/double-probe.h ns-3.44/src/stats/model/double-probe.h
--- ns-3.43/src/stats/model/double-probe.h	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/stats/model/double-probe.h	2025-03-09 16:55:49.699372300 -0700
@@ -24,7 +24,7 @@
 {
 
 /**
- * \ingroup probes
+ * @ingroup probes
  *
  * This class is designed to probe an underlying ns3 TraceSource exporting
  * a double.  This probe exports a trace source "Output" of type double.
@@ -38,44 +38,44 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     DoubleProbe();
     ~DoubleProbe() override;
 
     /**
-     * \return the most recent value
+     * @return the most recent value
      */
     double GetValue() const;
 
     /**
-     * \param value set the traced double to a new value
+     * @param value set the traced double to a new value
      */
     void SetValue(double value);
 
     /**
-     * \brief Set a probe value by its name in the Config system
+     * @brief Set a probe value by its name in the Config system
      *
-     * \param path Config path to access the probe
-     * \param value set the traced double to a new value
+     * @param path Config path to access the probe
+     * @param value set the traced double to a new value
      */
     static void SetValueByPath(std::string path, double value);
 
     /**
-     * \brief connect to a trace source attribute provided by a given object
+     * @brief connect to a trace source attribute provided by a given object
      *
-     * \param traceSource the name of the attribute TraceSource to connect to
-     * \param obj ns3::Object to connect to
-     * \return true if the trace source was successfully connected
+     * @param traceSource the name of the attribute TraceSource to connect to
+     * @param obj ns3::Object to connect to
+     * @return true if the trace source was successfully connected
      */
     bool ConnectByObject(std::string traceSource, Ptr<Object> obj) override;
 
     /**
-     * \brief connect to a trace source provided by a config path
+     * @brief connect to a trace source provided by a config path
      *
-     * \param path Config path to bind to
+     * @param path Config path to bind to
      *
      * Note, if an invalid path is provided, the probe will not be connected
      * to anything.
@@ -84,10 +84,10 @@
 
   private:
     /**
-     * \brief Method to connect to an underlying ns3::TraceSource of type double
+     * @brief Method to connect to an underlying ns3::TraceSource of type double
      *
-     * \param oldData previous value of the double
-     * \param newData new value of the double
+     * @param oldData previous value of the double
+     * @param newData new value of the double
      */
     void TraceSink(double oldData, double newData);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/stats/model/file-aggregator.h ns-3.44/src/stats/model/file-aggregator.h
--- ns-3.43/src/stats/model/file-aggregator.h	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/stats/model/file-aggregator.h	2025-03-09 16:55:49.699372300 -0700
@@ -22,7 +22,7 @@
 {
 
 /**
- * \ingroup aggregator
+ * @ingroup aggregator
  *
  * This aggregator sends values it receives to a file.
  **/
@@ -39,14 +39,14 @@
     };
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \param outputFileName name of the file to write.
-     * \param fileType type of file to write.
+     * @param outputFileName name of the file to write.
+     * @param fileType type of file to write.
      *
      * Constructs a file aggregator that will create a file named
      * outputFileName with values printed as specified by fileType.  The
@@ -57,18 +57,18 @@
     ~FileAggregator() override;
 
     /**
-     * \param fileType file type specifies the separator to use in
+     * @param fileType file type specifies the separator to use in
      * printing the file.
      *
-     * \brief Set the file type to create, which determines the
+     * @brief Set the file type to create, which determines the
      * separator to use when printing values to the file.
      */
     void SetFileType(FileType fileType);
 
     /**
-     * \param heading the heading string.
+     * @param heading the heading string.
      *
-     * \brief Sets the heading string that will be printed on the first
+     * @brief Sets the heading string that will be printed on the first
      * line of the file.
      *
      * Note that the heading string will only be printed if it has been
@@ -77,81 +77,81 @@
     void SetHeading(const std::string& heading);
 
     /**
-     * \param format the 1D format string.
+     * @param format the 1D format string.
      *
-     * \brief Sets the 1D format string for the C-style sprintf()
+     * @brief Sets the 1D format string for the C-style sprintf()
      * function.
      */
     void Set1dFormat(const std::string& format);
 
     /**
-     * \param format the 2D format string.
+     * @param format the 2D format string.
      *
-     * \brief Sets the 2D format string for the C-style sprintf()
+     * @brief Sets the 2D format string for the C-style sprintf()
      * function.
      */
     void Set2dFormat(const std::string& format);
 
     /**
-     * \param format the 3D format string.
+     * @param format the 3D format string.
      *
-     * \brief Sets the 3D format string for the C-style sprintf()
+     * @brief Sets the 3D format string for the C-style sprintf()
      * function.
      */
     void Set3dFormat(const std::string& format);
 
     /**
-     * \param format the 4D format string.
+     * @param format the 4D format string.
      *
-     * \brief Sets the 4D format string for the C-style sprintf()
+     * @brief Sets the 4D format string for the C-style sprintf()
      * function.
      */
     void Set4dFormat(const std::string& format);
 
     /**
-     * \param format the 5D format string.
+     * @param format the 5D format string.
      *
-     * \brief Sets the 5D format string for the C-style sprintf()
+     * @brief Sets the 5D format string for the C-style sprintf()
      * function.
      */
     void Set5dFormat(const std::string& format);
 
     /**
-     * \param format the 6D format string.
+     * @param format the 6D format string.
      *
-     * \brief Sets the 6D format string for the C-style sprintf()
+     * @brief Sets the 6D format string for the C-style sprintf()
      * function.
      */
     void Set6dFormat(const std::string& format);
 
     /**
-     * \param format the 7D format string.
+     * @param format the 7D format string.
      *
-     * \brief Sets the 7D format string for the C-style sprintf()
+     * @brief Sets the 7D format string for the C-style sprintf()
      * function.
      */
     void Set7dFormat(const std::string& format);
 
     /**
-     * \param format the 8D format string.
+     * @param format the 8D format string.
      *
-     * \brief Sets the 8D format string for the C-style sprintf()
+     * @brief Sets the 8D format string for the C-style sprintf()
      * function.
      */
     void Set8dFormat(const std::string& format);
 
     /**
-     * \param format the 9D format string.
+     * @param format the 9D format string.
      *
-     * \brief Sets the 9D format string for the C-style sprintf()
+     * @brief Sets the 9D format string for the C-style sprintf()
      * function.
      */
     void Set9dFormat(const std::string& format);
 
     /**
-     * \param format the 10D format string.
+     * @param format the 10D format string.
      *
-     * \brief Sets the 10D format string for the C-style sprintf()
+     * @brief Sets the 10D format string for the C-style sprintf()
      * function.
      */
     void Set10dFormat(const std::string& format);
@@ -161,65 +161,65 @@
     // into callbacks
 
     /**
-     * \param context specifies the 1D dataset these values came from.
-     * \param v1 value for the new data point.
+     * @param context specifies the 1D dataset these values came from.
+     * @param v1 value for the new data point.
      *
-     * \brief Writes 1 value to the file.
+     * @brief Writes 1 value to the file.
      */
     void Write1d(std::string context, double v1);
 
     /**
-     * \param context specifies the 2D dataset these values came from.
-     * \param v1 first value for the new data point.
-     * \param v2 second value for the new data point.
+     * @param context specifies the 2D dataset these values came from.
+     * @param v1 first value for the new data point.
+     * @param v2 second value for the new data point.
      *
-     * \brief Writes 2 values to the file.
+     * @brief Writes 2 values to the file.
      */
     void Write2d(std::string context, double v1, double v2);
 
     /**
-     * \param context specifies the 3D dataset these values came from.
-     * \param v1 first value for the new data point.
-     * \param v2 second value for the new data point.
-     * \param v3 third value for the new data point.
+     * @param context specifies the 3D dataset these values came from.
+     * @param v1 first value for the new data point.
+     * @param v2 second value for the new data point.
+     * @param v3 third value for the new data point.
      *
-     * \brief Writes 3 values to the file.
+     * @brief Writes 3 values to the file.
      */
     void Write3d(std::string context, double v1, double v2, double v3);
 
     /**
-     * \param context specifies the 4D dataset these values came from.
-     * \param v1 first value for the new data point.
-     * \param v2 second value for the new data point.
-     * \param v3 third value for the new data point.
-     * \param v4 fourth value for the new data point.
+     * @param context specifies the 4D dataset these values came from.
+     * @param v1 first value for the new data point.
+     * @param v2 second value for the new data point.
+     * @param v3 third value for the new data point.
+     * @param v4 fourth value for the new data point.
      *
-     * \brief Writes 4 values to the file.
+     * @brief Writes 4 values to the file.
      */
     void Write4d(std::string context, double v1, double v2, double v3, double v4);
 
     /**
-     * \param context specifies the 5D dataset these values came from.
-     * \param v1 first value for the new data point.
-     * \param v2 second value for the new data point.
-     * \param v3 third value for the new data point.
-     * \param v4 fourth value for the new data point.
-     * \param v5 fifth value for the new data point.
+     * @param context specifies the 5D dataset these values came from.
+     * @param v1 first value for the new data point.
+     * @param v2 second value for the new data point.
+     * @param v3 third value for the new data point.
+     * @param v4 fourth value for the new data point.
+     * @param v5 fifth value for the new data point.
      *
-     * \brief Writes 5 values to the file.
+     * @brief Writes 5 values to the file.
      */
     void Write5d(std::string context, double v1, double v2, double v3, double v4, double v5);
 
     /**
-     * \param context specifies the 6D dataset these values came from.
-     * \param v1 first value for the new data point.
-     * \param v2 second value for the new data point.
-     * \param v3 third value for the new data point.
-     * \param v4 fourth value for the new data point.
-     * \param v5 fifth value for the new data point.
-     * \param v6 sixth value for the new data point.
+     * @param context specifies the 6D dataset these values came from.
+     * @param v1 first value for the new data point.
+     * @param v2 second value for the new data point.
+     * @param v3 third value for the new data point.
+     * @param v4 fourth value for the new data point.
+     * @param v5 fifth value for the new data point.
+     * @param v6 sixth value for the new data point.
      *
-     * \brief Writes 6 values to the file.
+     * @brief Writes 6 values to the file.
      */
     void Write6d(std::string context,
                  double v1,
@@ -230,16 +230,16 @@
                  double v6);
 
     /**
-     * \param context specifies the 7D dataset these values came from.
-     * \param v1 first value for the new data point.
-     * \param v2 second value for the new data point.
-     * \param v3 third value for the new data point.
-     * \param v4 fourth value for the new data point.
-     * \param v5 fifth value for the new data point.
-     * \param v6 sixth value for the new data point.
-     * \param v7 seventh value for the new data point.
+     * @param context specifies the 7D dataset these values came from.
+     * @param v1 first value for the new data point.
+     * @param v2 second value for the new data point.
+     * @param v3 third value for the new data point.
+     * @param v4 fourth value for the new data point.
+     * @param v5 fifth value for the new data point.
+     * @param v6 sixth value for the new data point.
+     * @param v7 seventh value for the new data point.
      *
-     * \brief Writes 7 values to the file.
+     * @brief Writes 7 values to the file.
      */
     void Write7d(std::string context,
                  double v1,
@@ -251,17 +251,17 @@
                  double v7);
 
     /**
-     * \param context specifies the 8D dataset these values came from.
-     * \param v1 first value for the new data point.
-     * \param v2 second value for the new data point.
-     * \param v3 third value for the new data point.
-     * \param v4 fourth value for the new data point.
-     * \param v5 fifth value for the new data point.
-     * \param v6 sixth value for the new data point.
-     * \param v7 seventh value for the new data point.
-     * \param v8 eighth value for the new data point.
+     * @param context specifies the 8D dataset these values came from.
+     * @param v1 first value for the new data point.
+     * @param v2 second value for the new data point.
+     * @param v3 third value for the new data point.
+     * @param v4 fourth value for the new data point.
+     * @param v5 fifth value for the new data point.
+     * @param v6 sixth value for the new data point.
+     * @param v7 seventh value for the new data point.
+     * @param v8 eighth value for the new data point.
      *
-     * \brief Writes 8 values to the file.
+     * @brief Writes 8 values to the file.
      */
     void Write8d(std::string context,
                  double v1,
@@ -274,18 +274,18 @@
                  double v8);
 
     /**
-     * \param context specifies the 9D dataset these values came from.
-     * \param v1 first value for the new data point.
-     * \param v2 second value for the new data point.
-     * \param v3 third value for the new data point.
-     * \param v4 fourth value for the new data point.
-     * \param v5 fifth value for the new data point.
-     * \param v6 sixth value for the new data point.
-     * \param v7 seventh value for the new data point.
-     * \param v8 eighth value for the new data point.
-     * \param v9 ninth value for the new data point.
+     * @param context specifies the 9D dataset these values came from.
+     * @param v1 first value for the new data point.
+     * @param v2 second value for the new data point.
+     * @param v3 third value for the new data point.
+     * @param v4 fourth value for the new data point.
+     * @param v5 fifth value for the new data point.
+     * @param v6 sixth value for the new data point.
+     * @param v7 seventh value for the new data point.
+     * @param v8 eighth value for the new data point.
+     * @param v9 ninth value for the new data point.
      *
-     * \brief Writes 9 values to the file.
+     * @brief Writes 9 values to the file.
      */
     void Write9d(std::string context,
                  double v1,
@@ -299,19 +299,19 @@
                  double v9);
 
     /**
-     * \param context specifies the 10D dataset these values came from.
-     * \param v1 first value for the new data point.
-     * \param v2 second value for the new data point.
-     * \param v3 third value for the new data point.
-     * \param v4 fourth value for the new data point.
-     * \param v5 fifth value for the new data point.
-     * \param v6 sixth value for the new data point.
-     * \param v7 seventh value for the new data point.
-     * \param v8 eighth value for the new data point.
-     * \param v9 ninth value for the new data point.
-     * \param v10 tenth value for the new data point.
+     * @param context specifies the 10D dataset these values came from.
+     * @param v1 first value for the new data point.
+     * @param v2 second value for the new data point.
+     * @param v3 third value for the new data point.
+     * @param v4 fourth value for the new data point.
+     * @param v5 fifth value for the new data point.
+     * @param v6 sixth value for the new data point.
+     * @param v7 seventh value for the new data point.
+     * @param v8 eighth value for the new data point.
+     * @param v9 ninth value for the new data point.
+     * @param v10 tenth value for the new data point.
      *
-     * \brief Writes 10 values to the file.
+     * @brief Writes 10 values to the file.
      */
     void Write10d(std::string context,
                   double v1,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/stats/model/get-wildcard-matches.h ns-3.44/src/stats/model/get-wildcard-matches.h
--- ns-3.43/src/stats/model/get-wildcard-matches.h	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/stats/model/get-wildcard-matches.h	2025-03-09 16:55:49.699372300 -0700
@@ -15,13 +15,13 @@
 {
 
 /**
- * \param configPath Config path to access the probe.
- * \param matchedPath the path that matched the Config path.
- * \param wildcardSeparator the text to put between the wildcard
+ * @param configPath Config path to access the probe.
+ * @param matchedPath the path that matched the Config path.
+ * @param wildcardSeparator the text to put between the wildcard
  * matches.  By default, a space is used.
- * \return String value of text matches
+ * @return String value of text matches
  *
- * \brief Returns the text matches from the matched path for each of
+ * @brief Returns the text matches from the matched path for each of
  * the wildcards in the Config path, separated by the wild card
  * separator.
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/stats/model/gnuplot-aggregator.h ns-3.44/src/stats/model/gnuplot-aggregator.h
--- ns-3.43/src/stats/model/gnuplot-aggregator.h	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/stats/model/gnuplot-aggregator.h	2025-03-09 16:55:49.699372300 -0700
@@ -22,7 +22,7 @@
 {
 
 /**
- * \ingroup aggregator
+ * @ingroup aggregator
  * This aggregator produces output used to make gnuplot plots.
  **/
 class GnuplotAggregator : public DataCollectionObject
@@ -38,13 +38,13 @@
     };
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \param outputFileNameWithoutExtension name of gnuplot related
+     * @param outputFileNameWithoutExtension name of gnuplot related
      * files to write with no extension
      *
      * Constructs a gnuplot file aggregator that will create a space
@@ -63,23 +63,23 @@
     // into callbacks
 
     /**
-     * \param context specifies the gnuplot 2D dataset for these values
-     * \param x x coordinate for the new data point
-     * \param y y coordinate for the new data point
+     * @param context specifies the gnuplot 2D dataset for these values
+     * @param x x coordinate for the new data point
+     * @param y y coordinate for the new data point
      *
-     * \brief Writes a 2D value to a 2D gnuplot dataset.
+     * @brief Writes a 2D value to a 2D gnuplot dataset.
      *
      * Use this method with error bar style NONE.
      */
     void Write2d(std::string context, double x, double y);
 
     /**
-     * \param context specifies the gnuplot 2D dataset for these values
-     * \param x x coordinate for the new data point
-     * \param y y coordinate for the new data point
-     * \param errorDelta x data point uncertainty
+     * @param context specifies the gnuplot 2D dataset for these values
+     * @param x x coordinate for the new data point
+     * @param y y coordinate for the new data point
+     * @param errorDelta x data point uncertainty
      *
-     * \brief Writes a 2D value to a 2D gnuplot dataset with error bars
+     * @brief Writes a 2D value to a 2D gnuplot dataset with error bars
      * in the x direction.
      *
      * Use this method with error bar style X.
@@ -87,12 +87,12 @@
     void Write2dWithXErrorDelta(std::string context, double x, double y, double errorDelta);
 
     /**
-     * \param context specifies the gnuplot 2D dataset for these values
-     * \param x x coordinate for the new data point
-     * \param y y coordinate for the new data point
-     * \param errorDelta y data point uncertainty
+     * @param context specifies the gnuplot 2D dataset for these values
+     * @param x x coordinate for the new data point
+     * @param y y coordinate for the new data point
+     * @param errorDelta y data point uncertainty
      *
-     * \brief Writes a 2D value to a 2D gnuplot dataset with error bars
+     * @brief Writes a 2D value to a 2D gnuplot dataset with error bars
      * in the y direction.
      *
      * Use this method with error bar style Y.
@@ -100,13 +100,13 @@
     void Write2dWithYErrorDelta(std::string context, double x, double y, double errorDelta);
 
     /**
-     * \param context specifies the gnuplot 2D dataset for these values
-     * \param x x coordinate for the new data point
-     * \param y y coordinate for the new data point
-     * \param xErrorDelta x data point uncertainty
-     * \param yErrorDelta y data point uncertainty
+     * @param context specifies the gnuplot 2D dataset for these values
+     * @param x x coordinate for the new data point
+     * @param y y coordinate for the new data point
+     * @param xErrorDelta x data point uncertainty
+     * @param yErrorDelta y data point uncertainty
      *
-     * \brief Writes a 2D value to a 2D gnuplot dataset with error bars
+     * @brief Writes a 2D value to a 2D gnuplot dataset with error bars
      * in the x and y directions.
      *
      * Use this method with error bar style XY.
@@ -120,39 +120,39 @@
     // Methods to configure the plot
 
     /**
-     * \param terminal terminal setting string for output. The default terminal
+     * @param terminal terminal setting string for output. The default terminal
      * string is "png"
      */
     void SetTerminal(const std::string& terminal);
 
     /**
-     * \param title set new plot title string to use for this plot.
+     * @param title set new plot title string to use for this plot.
      */
     void SetTitle(const std::string& title);
 
     /**
-     * \param xLegend the legend for the x horizontal axis
-     * \param yLegend the legend for the y vertical axis
+     * @param xLegend the legend for the x horizontal axis
+     * @param yLegend the legend for the y vertical axis
      */
     void SetLegend(const std::string& xLegend, const std::string& yLegend);
 
     /**
-     * \param extra set extra gnuplot directive for output.
+     * @param extra set extra gnuplot directive for output.
      */
     void SetExtra(const std::string& extra);
 
     /**
-     * \param extra append extra gnuplot directive for output.
+     * @param extra append extra gnuplot directive for output.
      */
     void AppendExtra(const std::string& extra);
 
     // Methods for datasets
 
     /**
-     * \param dataset the gnuplot 2D dataset to be plotted.
-     * \param title the title to be associated to this dataset.
+     * @param dataset the gnuplot 2D dataset to be plotted.
+     * @param title the title to be associated to this dataset.
      *
-     * \brief Adds a 2D dataset to the plot.
+     * @brief Adds a 2D dataset to the plot.
      *
      * Creates an empty dataset. Usually, the dataset's title is
      * displayed in the legend box.
@@ -163,18 +163,18 @@
     void Add2dDataset(const std::string& dataset, const std::string& title);
 
     /**
-     * \param extra       extra formatting
+     * @param extra       extra formatting
      *
-     * \brief Change extra formatting style parameters for newly created
+     * @brief Change extra formatting style parameters for newly created
      * objects.
      */
     static void Set2dDatasetDefaultExtra(const std::string& extra);
 
     /**
-     * \param dataset the gnuplot 2D dataset to be plotted.
-     * \param extra       extra formatting
+     * @param dataset the gnuplot 2D dataset to be plotted.
+     * @param extra       extra formatting
      *
-     * \brief Add extra formatting parameters to this dataset.
+     * @brief Add extra formatting parameters to this dataset.
      *
      * The string in dataset should match the context for the Collector
      * it is connected to.
@@ -182,9 +182,9 @@
     void Set2dDatasetExtra(const std::string& dataset, const std::string& extra);
 
     /**
-     * \param dataset the gnuplot 2D dataset to be plotted.
+     * @param dataset the gnuplot 2D dataset to be plotted.
      *
-     * \brief Add an empty line in the data output sequence.
+     * @brief Add an empty line in the data output sequence.
      *
      * Writes an empty line in the plot data, which breaks continuous
      * lines and does other things in the output.
@@ -195,17 +195,17 @@
     void Write2dDatasetEmptyLine(const std::string& dataset);
 
     /**
-     * \param style the style of plotting to use for newly created datasets.
+     * @param style the style of plotting to use for newly created datasets.
      *
-     * \brief Change default style for all newly created objects.
+     * @brief Change default style for all newly created objects.
      */
     static void Set2dDatasetDefaultStyle(Gnuplot2dDataset::Style style);
 
     /**
-     * \param dataset the gnuplot 2D dataset to be plotted.
-     * \param style the style of plotting to use for this dataset.
+     * @param dataset the gnuplot 2D dataset to be plotted.
+     * @param style the style of plotting to use for this dataset.
      *
-     * \brief Set the style of plotting to use for this dataset.
+     * @brief Set the style of plotting to use for this dataset.
      *
      * The string in dataset should match the context for the Collector
      * it is connected to.
@@ -213,17 +213,17 @@
     void Set2dDatasetStyle(const std::string& dataset, Gnuplot2dDataset::Style style);
 
     /**
-     * \param errorBars the style of errorbars to use for newly created datasets.
+     * @param errorBars the style of errorbars to use for newly created datasets.
      *
-     * \brief Change default errorbars style for all newly created objects.
+     * @brief Change default errorbars style for all newly created objects.
      */
     static void Set2dDatasetDefaultErrorBars(Gnuplot2dDataset::ErrorBars errorBars);
 
     /**
-     * \param dataset the gnuplot 2D dataset to be plotted.
-     * \param errorBars the style of errorbars to display.
+     * @param dataset the gnuplot 2D dataset to be plotted.
+     * @param errorBars the style of errorbars to display.
      *
-     * \brief Set the error bars to use for this dataset.
+     * @brief Set the error bars to use for this dataset.
      *
      * If you use any style other than none, you need
      * to make sure you store the delta information in
@@ -236,9 +236,9 @@
     void Set2dDatasetErrorBars(const std::string& dataset, Gnuplot2dDataset::ErrorBars errorBars);
 
     /**
-     * \param keyLocation the location of the key in the plot.
+     * @param keyLocation the location of the key in the plot.
      *
-     * \brief Set the location of the key in the plot.
+     * @brief Set the location of the key in the plot.
      */
     void SetKeyLocation(KeyLocation keyLocation);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/stats/model/gnuplot.cc ns-3.44/src/stats/model/gnuplot.cc
--- ns-3.43/src/stats/model/gnuplot.cc	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/stats/model/gnuplot.cc	2025-03-09 16:55:49.699372300 -0700
@@ -19,7 +19,7 @@
 // --- GnuplotDataset::Data ------------------------------------------------ //
 
 /**
- * \ingroup gnuplot
+ * @ingroup gnuplot
  *
  * Structure storing the data to plot.
  * Derived classes subclass this struct and add their own data fields.
@@ -35,7 +35,7 @@
 
     /**
      * Initializes the reference counter to 1 and sets m_title and m_extra.
-     * \param title Dataset title
+     * @param title Dataset title
      */
     Data(const std::string& title);
 
@@ -43,8 +43,8 @@
     virtual ~Data();
 
     /**
-     * \brief Returns the plot type ("plot" or "splot").
-     * \returns the plot type ("plot" or "splot").
+     * @brief Returns the plot type ("plot" or "splot").
+     * @returns the plot type ("plot" or "splot").
      */
     virtual std::string GetCommand() const = 0;
 
@@ -57,10 +57,10 @@
      * data and control files, then the index for the current dataset
      * and the name for the data file are also included.
      *
-     * \param os Output stream
-     * \param generateOneOutputFile If true, generate only one output file.
-     * \param dataFileDatasetIndex Dataset Index
-     * \param dataFileName Dataset file name
+     * @param os Output stream
+     * @param generateOneOutputFile If true, generate only one output file.
+     * @param dataFileDatasetIndex Dataset Index
+     * @param dataFileName Dataset file name
      */
     virtual void PrintExpression(std::ostream& os,
                                  bool generateOneOutputFile,
@@ -71,14 +71,14 @@
      * Print the inline data file contents trailing the plot command. Empty for
      * functions.
      *
-     * \param os Output stream
-     * \param generateOneOutputFile If true, generate only one output file.
+     * @param os Output stream
+     * @param generateOneOutputFile If true, generate only one output file.
      */
     virtual void PrintDataFile(std::ostream& os, bool generateOneOutputFile) const = 0;
 
     /**
      * Checks to see if this GnuplotDataset is empty.
-     * \return    indicates if this GnuplotDataset is empty.
+     * @return    indicates if this GnuplotDataset is empty.
      */
     virtual bool IsEmpty() const = 0;
 };
@@ -154,7 +154,7 @@
 // --- Gnuplot2dDataset::Data2d -------------------------------------------- //
 
 /**
- * \ingroup gnuplot
+ * @ingroup gnuplot
  *
  * Structure storing the data to for a 2D plot.
  */
@@ -169,7 +169,7 @@
 
     /**
      * Initializes with the values from m_defaultStyle and m_defaultErrorBars.
-     * \param title Dataset title
+     * @param title Dataset title
      */
     Data2d(const std::string& title);
 
@@ -416,7 +416,7 @@
 // --- Gnuplot2dFunction::Function2d --------------------------------------- //
 
 /**
- * \ingroup gnuplot
+ * @ingroup gnuplot
  *
  * Structure storing the function to be used for a 2D plot.
  */
@@ -429,8 +429,8 @@
     /**
      * Initializes with the function and title.
      *
-     * \param title Title of the plot
-     * \param function Function to plot
+     * @param title Title of the plot
+     * @param function Function to plot
      */
     Function2d(const std::string& title, const std::string& function);
 
@@ -501,7 +501,7 @@
 // --- Gnuplot3dDataset::Data3d -------------------------------------------- //
 
 /**
- * \ingroup gnuplot
+ * @ingroup gnuplot
  *
  * Structure storing the data for a 3D plot.
  */
@@ -515,7 +515,7 @@
 
     /**
      * Initializes with value from m_defaultStyle.
-     * \param title Dataset title
+     * @param title Dataset title
      */
     Data3d(const std::string& title);
 
@@ -629,7 +629,7 @@
 // --- Gnuplot3dFunction::Function3d --------------------------------------- //
 
 /**
- * \ingroup gnuplot
+ * @ingroup gnuplot
  *
  * Structure storing the function to be used for a 3D plot.
  */
@@ -642,8 +642,8 @@
     /**
      * Initializes with the function and title.
      *
-     * \param title Title of the plot
-     * \param function Function to plot
+     * @param title Title of the plot
+     * @param function Function to plot
      */
     Function3d(const std::string& title, const std::string& function);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/stats/model/gnuplot.h ns-3.44/src/stats/model/gnuplot.h
--- ns-3.43/src/stats/model/gnuplot.h	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/stats/model/gnuplot.h	2025-03-09 16:55:49.699372300 -0700
@@ -17,9 +17,9 @@
 {
 
 /**
- * \ingroup gnuplot
+ * @ingroup gnuplot
  *
- * \brief Abstract class to store a plot line to be used by ns3::Gnuplot.
+ * @brief Abstract class to store a plot line to be used by ns3::Gnuplot.
  *
  * This class contains a reference counted data object in m_data. The data
  * object contains different structs derived from struct Data by subclasses.
@@ -29,7 +29,7 @@
   public:
     /**
      * Reference-counting copy constructor.
-     * \param original Original GnuPlotDataset
+     * @param original Original GnuPlotDataset
      */
     GnuplotDataset(const GnuplotDataset& original);
 
@@ -40,30 +40,30 @@
 
     /**
      * Reference-counting assignment operator.
-     * \param original Right-hand side of assignment operator
-     * \return Copy of original GnuplotDataset
+     * @param original Right-hand side of assignment operator
+     * @return Copy of original GnuplotDataset
      */
     GnuplotDataset& operator=(const GnuplotDataset& original);
 
     /**
-     * \brief Change line title.
-     * \param title the new title string to use for this dataset.
+     * @brief Change line title.
+     * @param title the new title string to use for this dataset.
      *
-     * \note If you want your title to contain a newline character,
+     * @note If you want your title to contain a newline character,
      *       escape it like this:  "First line\\nSecond line" so that
      *       it is converted to "First line\nSecond line" in the plot file.
      */
     void SetTitle(const std::string& title);
 
     /**
-     * \brief Change extra formatting style parameters for newly created objects.
-     * \param extra       extra formatting
+     * @brief Change extra formatting style parameters for newly created objects.
+     * @param extra       extra formatting
      */
     static void SetDefaultExtra(const std::string& extra);
 
     /**
-     * \brief Add extra formatting parameters to this dataset.
-     * \param extra       extra formatting
+     * @brief Add extra formatting parameters to this dataset.
+     * @param extra       extra formatting
      */
     void SetExtra(const std::string& extra);
 
@@ -73,18 +73,18 @@
     friend class Gnuplot;
 
     /**
-     * \brief Extra gnuplot parameters set on every newly created dataset.
+     * @brief Extra gnuplot parameters set on every newly created dataset.
      */
     static std::string m_defaultExtra;
 
     /**
-     * \brief Derived classes subclass this struct and add their own data fields.
+     * @brief Derived classes subclass this struct and add their own data fields.
      */
     struct Data;
 
     /**
      * Called by constructors of derived classes.
-     * \param data the reference counted data object representing this dataset.
+     * @param data the reference counted data object representing this dataset.
      */
     GnuplotDataset(Data* data);
 
@@ -95,10 +95,10 @@
 };
 
 /**
- * \ingroup gnuplot
+ * @ingroup gnuplot
  *
- * \class Gnuplot2dDataset
- * \brief Class to represent a 2D points plot. Set the line or points style
+ * @class Gnuplot2dDataset
+ * @brief Class to represent a 2D points plot. Set the line or points style
  * using SetStyle() and set points using Add().
  */
 class Gnuplot2dDataset : public GnuplotDataset
@@ -131,7 +131,7 @@
     };
 
     /**
-     * \param title the title to be associated to this dataset (default "Untitled").
+     * @param title the title to be associated to this dataset (default "Untitled").
      *
      * Create an empty dataset. Usually, the dataset's title is
      * displayed in the legend box.
@@ -140,23 +140,23 @@
 
     /**
      * Change default style for all newly created objects.
-     * \param style the style of plotting to use for newly created datasets.
+     * @param style the style of plotting to use for newly created datasets.
      */
     static void SetDefaultStyle(Style style);
 
     /**
-     * \param style the style of plotting to use for this dataset.
+     * @param style the style of plotting to use for this dataset.
      */
     void SetStyle(Style style);
 
     /**
      * Change default errorbars style for all newly created objects.
-     * \param errorBars the style of errorbars to use for newly created datasets.
+     * @param errorBars the style of errorbars to use for newly created datasets.
      */
     static void SetDefaultErrorBars(ErrorBars errorBars);
 
     /**
-     * \param errorBars the style of errorbars to display.
+     * @param errorBars the style of errorbars to display.
      *
      * If you use any style other than none, you need
      * to make sure you store the delta information in
@@ -166,27 +166,27 @@
     void SetErrorBars(ErrorBars errorBars);
 
     /**
-     * \param x x coord to new data point
-     * \param y y coord to new data point
+     * @param x x coord to new data point
+     * @param y y coord to new data point
      *
      * Use this method with error bar style NONE.
      */
     void Add(double x, double y);
 
     /**
-     * \param x x coord to new data point
-     * \param y y coord to new data point
-     * \param errorDelta x and y data point uncertainty
+     * @param x x coord to new data point
+     * @param y y coord to new data point
+     * @param errorDelta x and y data point uncertainty
      *
      * Use this method with error bar style X or Y.
      */
     void Add(double x, double y, double errorDelta);
 
     /**
-     * \param x x coord to new data point
-     * \param y y coord to new data point
-     * \param xErrorDelta x data point uncertainty
-     * \param yErrorDelta y data point uncertainty
+     * @param x x coord to new data point
+     * @param y y coord to new data point
+     * @param xErrorDelta x data point uncertainty
+     * @param yErrorDelta y data point uncertainty
      *
      * Use this method with error bar style XY.
      */
@@ -222,9 +222,9 @@
 };
 
 /**
- * \ingroup gnuplot
+ * @ingroup gnuplot
  *
- * \brief Class to represent a 2D function expression plot.
+ * @brief Class to represent a 2D function expression plot.
  *
  * Since the function expression is not escaped, styles and extras could just
  * as well be included in the expression string.
@@ -233,8 +233,8 @@
 {
   public:
     /**
-     * \param title the title to be associated to this dataset.
-     * \param function function to plot
+     * @param title the title to be associated to this dataset.
+     * @param function function to plot
      *
      * Create an function dataset. Usually, the dataset's title is displayed in
      * the legend box.
@@ -242,7 +242,7 @@
     Gnuplot2dFunction(const std::string& title = "Untitled", const std::string& function = "");
 
     /**
-     * \param function new function string to set
+     * @param function new function string to set
      */
     void SetFunction(const std::string& function);
 
@@ -252,16 +252,16 @@
 };
 
 /**
- * \ingroup gnuplot
+ * @ingroup gnuplot
  *
- * \brief Class to represent a 3D points plot. Set the line or points style
+ * @brief Class to represent a 3D points plot. Set the line or points style
  * using SetStyle() and set points using Add().
  */
 class Gnuplot3dDataset : public GnuplotDataset
 {
   public:
     /**
-     * \param title the title to be associated to this dataset.
+     * @param title the title to be associated to this dataset.
      *
      * Create an empty dataset. Usually, the dataset's title is
      * displayed in the legend box.
@@ -270,19 +270,19 @@
 
     /**
      * Change default style for all newly created objects.
-     * \param style the style of plotting to use for newly created datasets.
+     * @param style the style of plotting to use for newly created datasets.
      */
     static void SetDefaultStyle(const std::string& style);
 
     /**
-     * \param style the style of plotting to use for this dataset.
+     * @param style the style of plotting to use for this dataset.
      */
     void SetStyle(const std::string& style);
 
     /**
-     * \param x x coord to new data point
-     * \param y y coord to new data point
-     * \param z z coord to new data point
+     * @param x x coord to new data point
+     * @param y y coord to new data point
+     * @param z z coord to new data point
      *
      * Use this method to add a new 3D point
      */
@@ -316,9 +316,9 @@
 };
 
 /**
- * \ingroup gnuplot
+ * @ingroup gnuplot
  *
- * \brief Class to represent a 3D function expression plot.
+ * @brief Class to represent a 3D function expression plot.
  *
  * Since the function expression is not escaped, styles and extras could just as
  * well be included in the expression string. The only difference to
@@ -328,8 +328,8 @@
 {
   public:
     /**
-     * \param title the title to be associated to this dataset.
-     * \param function function to plot
+     * @param title the title to be associated to this dataset.
+     * @param function function to plot
      *
      * Create an function dataset. Usually, the dataset's title is displayed in
      * the legend box.
@@ -337,7 +337,7 @@
     Gnuplot3dFunction(const std::string& title = "Untitled", const std::string& function = "");
 
     /**
-     * \param function new function string to set
+     * @param function new function string to set
      */
     void SetFunction(const std::string& function);
 
@@ -347,9 +347,9 @@
 };
 
 /**
- * \ingroup gnuplot
+ * @ingroup gnuplot
  *
- * \brief a simple class to generate gnuplot-ready plotting commands
+ * @brief a simple class to generate gnuplot-ready plotting commands
  *        from a set of datasets.
  *
  * This class really represents a single graph on which multiple datasets
@@ -359,15 +359,15 @@
 {
   public:
     /**
-     * \param outputFilename the name of the file where the rendering of the
+     * @param outputFilename the name of the file where the rendering of the
      *        graph will be generated if you feed the command stream output by
      *        Gnuplot::GenerateOutput to the gnuplot program.
-     * \param title title line of the plot page
+     * @param title title line of the plot page
      */
     Gnuplot(const std::string& outputFilename = "", const std::string& title = "");
 
     /**
-     * \param outputFilename the name of the file where the rendering of the
+     * @param outputFilename the name of the file where the rendering of the
      *        graph will be generated if you feed the command stream output by
      *        Gnuplot::GenerateOutput to the gnuplot program.
      */
@@ -376,71 +376,71 @@
     /**
      * Crude attempt to auto-detect the correct terminal setting by inspecting
      * the filename's extension.
-     * \param filename output filename
-     * \return File extension of the provided filename
+     * @param filename output filename
+     * @return File extension of the provided filename
      */
     static std::string DetectTerminal(const std::string& filename);
 
     /**
-     * \param terminal terminal setting string for output. The default terminal
+     * @param terminal terminal setting string for output. The default terminal
      * string is "png"
      */
     void SetTerminal(const std::string& terminal);
 
     /**
-     * \param title set new plot title string to use for this plot.
+     * @param title set new plot title string to use for this plot.
      */
     void SetTitle(const std::string& title);
 
     /**
-     * \param xLegend the legend for the x horizontal axis
-     * \param yLegend the legend for the y vertical axis
+     * @param xLegend the legend for the x horizontal axis
+     * @param yLegend the legend for the y vertical axis
      */
     void SetLegend(const std::string& xLegend, const std::string& yLegend);
 
     /**
-     * \param extra set extra gnuplot directive for output.
+     * @param extra set extra gnuplot directive for output.
      */
     void SetExtra(const std::string& extra);
 
     /**
-     * \param extra append extra gnuplot directive for output.
+     * @param extra append extra gnuplot directive for output.
      */
     void AppendExtra(const std::string& extra);
 
     /**
-     * \param dataset add a dataset to the graph to be plotted.
+     * @param dataset add a dataset to the graph to be plotted.
      */
     void AddDataset(const GnuplotDataset& dataset);
 
     /**
-     * \param os the output stream on which the relevant gnuplot
+     * @param os the output stream on which the relevant gnuplot
      * commands should be generated. Including output file and terminal
      * headers.
      *
-     * \brief Writes gnuplot commands and data values to a single
+     * @brief Writes gnuplot commands and data values to a single
      * output stream.
      */
     void GenerateOutput(std::ostream& os);
 
     /**
-     * \param osControl the output stream on which the relevant gnuplot
+     * @param osControl the output stream on which the relevant gnuplot
      * control commands should be generated. Including output file and
      * terminal headers.
-     * \param osData the output stream on which the relevant gnuplot
+     * @param osData the output stream on which the relevant gnuplot
      * data values should be generated.
-     * \param dataFileName the name for the data file that will be
+     * @param dataFileName the name for the data file that will be
      * written.
      *
-     * \brief Writes gnuplot commands and data values to two
+     * @brief Writes gnuplot commands and data values to two
      * different outputs streams.
      */
     void GenerateOutput(std::ostream& osControl, std::ostream& osData, std::string dataFileName);
 
     /**
-     * \param index the index for the data stream in the data file.
+     * @param index the index for the data stream in the data file.
      *
-     * \brief Sets the current data stream index in the data file.
+     * @brief Sets the current data stream index in the data file.
      */
     void SetDataFileDatasetIndex(unsigned int index);
 
@@ -464,52 +464,52 @@
 };
 
 /**
- * \ingroup gnuplot
+ * @ingroup gnuplot
  *
- * \brief a simple class to group together multiple gnuplots into one file,
+ * @brief a simple class to group together multiple gnuplots into one file,
  * e.g. for PDF multi-page output terminals.
  */
 class GnuplotCollection
 {
   public:
     /**
-     * \param outputFilename the name of the file where the rendering of the
+     * @param outputFilename the name of the file where the rendering of the
      *        graph will be generated if you feed the command stream output by
      *        GnuplotCollection::GenerateOutput to the gnuplot program.
      */
     GnuplotCollection(const std::string& outputFilename);
 
     /**
-     * \param terminal terminal setting string for output. The default terminal
+     * @param terminal terminal setting string for output. The default terminal
      * string is guessed from the output filename's extension.
      */
     void SetTerminal(const std::string& terminal);
 
     /**
-     * \param plot add a plot to the collection to be plotted.
+     * @param plot add a plot to the collection to be plotted.
      */
     void AddPlot(const Gnuplot& plot);
 
     /**
      * Return a pointer to one of the added plots.
-     * \param id  index of plot to return
-     * \return    reference to plot, throws std::range_error if it does not exist.
+     * @param id  index of plot to return
+     * @return    reference to plot, throws std::range_error if it does not exist.
      */
     Gnuplot& GetPlot(unsigned int id);
 
     /**
-     * \param os the output stream on which the relevant gnuplot commands should
+     * @param os the output stream on which the relevant gnuplot commands should
      * be generated.
      */
     void GenerateOutput(std::ostream& os);
 
     /**
-     * \param osControl the output stream on which the relevant gnuplot
+     * @param osControl the output stream on which the relevant gnuplot
      * control commands should be generated. Including output file and
      * terminal headers.
-     * \param osData the output stream on which the relevant gnuplot
+     * @param osData the output stream on which the relevant gnuplot
      * data values should be generated.
-     * \param dataFileName the name for the data file that will be
+     * @param dataFileName the name for the data file that will be
      * written.
      */
     void GenerateOutput(std::ostream& osControl, std::ostream& osData, std::string dataFileName);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/stats/model/histogram.h ns-3.44/src/stats/model/histogram.h
--- ns-3.43/src/stats/model/histogram.h	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/stats/model/histogram.h	2025-03-09 16:55:49.699372300 -0700
@@ -17,7 +17,7 @@
 {
 
 /**
- * \brief Class used to store data and make an histogram of the data frequency.
+ * @brief Class used to store data and make an histogram of the data frequency.
  *
  * Data are grouped in "bins", i.e., intervals. Each value is assigned to the
  * bin according to the following formula: floor(value/binWidth).
@@ -25,9 +25,9 @@
  *
  * This class only handles \a positive bins, i.e., it does \a not handles negative data.
  *
- * \todo Add support for negative data.
+ * @todo Add support for negative data.
  *
- * \todo Add method(s) to estimate parameters from the histogram,
+ * @todo Add method(s) to estimate parameters from the histogram,
  * see http://www.dspguide.com/ch2/4.htm
  *
  */
@@ -36,58 +36,58 @@
   public:
     // --- basic methods ---
     /**
-     * \brief Constructor
-     * \param binWidth width of the histogram "bin".
+     * @brief Constructor
+     * @param binWidth width of the histogram "bin".
      */
     Histogram(double binWidth);
     Histogram();
 
     // Methods for Getting the Histogram Results
     /**
-     * \brief Returns the number of bins in the histogram.
-     * \return the number of bins in the histogram
+     * @brief Returns the number of bins in the histogram.
+     * @return the number of bins in the histogram
      */
     uint32_t GetNBins() const;
     /**
-     * \brief Returns the bin start, i.e., index*binWidth
-     * \param index the bin index
-     * \return the bin start
+     * @brief Returns the bin start, i.e., index*binWidth
+     * @param index the bin index
+     * @return the bin start
      */
     double GetBinStart(uint32_t index) const;
     /**
-     * \brief Returns the bin end, i.e., (index+1)*binWidth
-     * \param index the bin index
-     * \return the bin start
+     * @brief Returns the bin end, i.e., (index+1)*binWidth
+     * @param index the bin index
+     * @return the bin start
      */
     double GetBinEnd(uint32_t index) const;
     /**
-     * \brief Returns the bin width.
+     * @brief Returns the bin width.
      *
      * Note that all the bins have the same width.
      *
-     * \param index the bin index
-     * \return the bin width
+     * @param index the bin index
+     * @return the bin width
      */
     double GetBinWidth(uint32_t index) const;
     /**
-     * \brief Set the bin width.
+     * @brief Set the bin width.
      *
      * Note that you can change the bin width only if the histogram is empty.
      *
-     * \param binWidth the bin width
+     * @param binWidth the bin width
      */
     void SetDefaultBinWidth(double binWidth);
     /**
-     * \brief Get the number of data added to the bin.
-     * \param index the bin index
-     * \return the number of data added to the bin
+     * @brief Get the number of data added to the bin.
+     * @param index the bin index
+     * @return the number of data added to the bin
      */
     uint32_t GetBinCount(uint32_t index) const;
 
     // Method for adding values
     /**
-     * \brief Add a value to the histogram
-     * \param value the value to add
+     * @brief Add a value to the histogram
+     * @param value the value to add
      */
     void AddValue(double value);
 
@@ -97,10 +97,10 @@
     void Clear();
 
     /**
-     * \brief Serializes the results to an std::ostream in XML format.
-     * \param os the output stream
-     * \param indent number of spaces to use as base indentation level
-     * \param elementName name of the element to serialize.
+     * @brief Serializes the results to an std::ostream in XML format.
+     * @param os the output stream
+     * @param indent number of spaces to use as base indentation level
+     * @param elementName name of the element to serialize.
      */
     void SerializeToXmlStream(std::ostream& os, uint16_t indent, std::string elementName) const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/stats/model/omnet-data-output.cc ns-3.44/src/stats/model/omnet-data-output.cc
--- ns-3.43/src/stats/model/omnet-data-output.cc	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/stats/model/omnet-data-output.cc	2025-03-09 16:55:49.699372300 -0700
@@ -95,7 +95,7 @@
     std::string fn = m_filePrefix + "-" + dc.GetRunLabel() + ".sca";
     scalarFile.open(fn, std::ios_base::out);
 
-    /// \todo add timestamp to the runlevel
+    /// @todo add timestamp to the runlevel
     scalarFile << "run " << dc.GetRunLabel() << std::endl;
     scalarFile << "attr experiment \"" << dc.GetExperimentLabel() << "\"" << std::endl;
     scalarFile << "attr strategy \"" << dc.GetStrategyLabel() << "\"" << std::endl;
@@ -104,7 +104,7 @@
 
     for (auto i = dc.MetadataBegin(); i != dc.MetadataEnd(); i++)
     {
-        std::pair<std::string, std::string> blob = (*i);
+        const auto& blob = (*i);
         scalarFile << "attr \"" << blob.first << "\" \"" << blob.second << "\"" << std::endl;
     }
 
@@ -115,7 +115,7 @@
     }
     for (auto i = dc.MetadataBegin(); i != dc.MetadataEnd(); i++)
     {
-        std::pair<std::string, std::string> blob = (*i);
+        const auto& blob = (*i);
         if (isNumeric(blob.second))
         {
             scalarFile << "scalar . \"" << blob.first << "\" \"" << blob.second << "\""
@@ -157,31 +157,31 @@
         name = "\"\"";
     }
     (*m_scalar) << "statistic " << context << " " << name << std::endl;
-    if (!isNaN(statSum->getCount()))
+    if (!std::isnan(statSum->getCount()))
     {
         (*m_scalar) << "field count " << statSum->getCount() << std::endl;
     }
-    if (!isNaN(statSum->getSum()))
+    if (!std::isnan(statSum->getSum()))
     {
         (*m_scalar) << "field sum " << statSum->getSum() << std::endl;
     }
-    if (!isNaN(statSum->getMean()))
+    if (!std::isnan(statSum->getMean()))
     {
         (*m_scalar) << "field mean " << statSum->getMean() << std::endl;
     }
-    if (!isNaN(statSum->getMin()))
+    if (!std::isnan(statSum->getMin()))
     {
         (*m_scalar) << "field min " << statSum->getMin() << std::endl;
     }
-    if (!isNaN(statSum->getMax()))
+    if (!std::isnan(statSum->getMax()))
     {
         (*m_scalar) << "field max " << statSum->getMax() << std::endl;
     }
-    if (!isNaN(statSum->getSqrSum()))
+    if (!std::isnan(statSum->getSqrSum()))
     {
         (*m_scalar) << "field sqrsum " << statSum->getSqrSum() << std::endl;
     }
-    if (!isNaN(statSum->getStddev()))
+    if (!std::isnan(statSum->getStddev()))
     {
         (*m_scalar) << "field stddev " << statSum->getStddev() << std::endl;
     }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/stats/model/omnet-data-output.h ns-3.44/src/stats/model/omnet-data-output.h
--- ns-3.43/src/stats/model/omnet-data-output.h	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/stats/model/omnet-data-output.h	2025-03-09 16:55:49.699372300 -0700
@@ -19,9 +19,9 @@
 //------------------------------------------------------------
 //--------------------------------------------
 /**
- * \ingroup dataoutput
- * \class OmnetDataOutput
- * \brief Outputs data in a format compatible with OMNeT library and framework
+ * @ingroup dataoutput
+ * @class OmnetDataOutput
+ * @brief Outputs data in a format compatible with OMNeT library and framework
  *
  */
 class OmnetDataOutput : public DataOutputInterface
@@ -32,7 +32,7 @@
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
@@ -43,66 +43,66 @@
 
   private:
     /**
-     * \ingroup dataoutput
+     * @ingroup dataoutput
      *
-     * \brief Class to generate OMNeT output
+     * @brief Class to generate OMNeT output
      */
     class OmnetOutputCallback : public DataOutputCallback
     {
       public:
         /**
          * Constructor
-         * \param scalar the output stream
+         * @param scalar the output stream
          */
         OmnetOutputCallback(std::ostream* scalar);
 
         /**
-         * \brief Generates data statistics
-         * \param context the output context
-         * \param name the output name
-         * \param statSum the stats to print
+         * @brief Generates data statistics
+         * @param context the output context
+         * @param name the output name
+         * @param statSum the stats to print
          */
         void OutputStatistic(std::string context,
                              std::string name,
                              const StatisticalSummary* statSum) override;
 
         /**
-         * \brief Generates a single data output
-         * \param context the output context
-         * \param name the output name
-         * \param val the value
+         * @brief Generates a single data output
+         * @param context the output context
+         * @param name the output name
+         * @param val the value
          */
         void OutputSingleton(std::string context, std::string name, int val) override;
 
         /**
-         * \brief Generates a single data output
-         * \param context the output context
-         * \param name the output name
-         * \param val the value
+         * @brief Generates a single data output
+         * @param context the output context
+         * @param name the output name
+         * @param val the value
          */
         void OutputSingleton(std::string context, std::string name, uint32_t val) override;
 
         /**
-         * \brief Generates a single data output
-         * \param context the output context
-         * \param name the output name
-         * \param val the value
+         * @brief Generates a single data output
+         * @param context the output context
+         * @param name the output name
+         * @param val the value
          */
         void OutputSingleton(std::string context, std::string name, double val) override;
 
         /**
-         * \brief Generates a single data output
-         * \param context the output context
-         * \param name the output name
-         * \param val the value
+         * @brief Generates a single data output
+         * @param context the output context
+         * @param name the output name
+         * @param val the value
          */
         void OutputSingleton(std::string context, std::string name, std::string val) override;
 
         /**
-         * \brief Generates a single data output
-         * \param context the output context
-         * \param name the output name
-         * \param val the value
+         * @brief Generates a single data output
+         * @param context the output context
+         * @param name the output name
+         * @param val the value
          */
         void OutputSingleton(std::string context, std::string name, Time val) override;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/stats/model/probe.cc ns-3.44/src/stats/model/probe.cc
--- ns-3.43/src/stats/model/probe.cc	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/stats/model/probe.cc	2025-03-09 16:55:49.699372300 -0700
@@ -54,7 +54,7 @@
 Probe::IsEnabled() const
 {
     return (DataCollectionObject::IsEnabled() && Simulator::Now() >= m_start &&
-            (m_stop == Seconds(0) || Simulator::Now() < m_stop));
+            (m_stop.IsZero() || Simulator::Now() < m_stop));
 }
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/stats/model/probe.h ns-3.44/src/stats/model/probe.h
--- ns-3.43/src/stats/model/probe.h	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/stats/model/probe.h	2025-03-09 16:55:49.699372300 -0700
@@ -18,7 +18,7 @@
 {
 
 /**
- * \ingroup probes
+ * @ingroup probes
  *
  * Base class for probes.
  *
@@ -30,31 +30,31 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     Probe();
     ~Probe() override;
 
     /**
-     * \return true if Probe is currently enabled
+     * @return true if Probe is currently enabled
      */
     bool IsEnabled() const override;
 
     /**
-     * \brief connect to a trace source attribute provided by a given object
+     * @brief connect to a trace source attribute provided by a given object
      *
-     * \param traceSource the name of the attribute TraceSource to connect to
-     * \param obj ns3::Object to connect to
-     * \return true if the trace source was successfully connected
+     * @param traceSource the name of the attribute TraceSource to connect to
+     * @param obj ns3::Object to connect to
+     * @return true if the trace source was successfully connected
      */
     virtual bool ConnectByObject(std::string traceSource, Ptr<Object> obj) = 0;
 
     /**
-     * \brief connect to a trace source provided by a config path
+     * @brief connect to a trace source provided by a config path
      *
-     * \param path Config path to bind to
+     * @param path Config path to bind to
      *
      * Note, if an invalid path is provided, the probe will not be connected
      * to anything.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/stats/model/sqlite-data-output.cc ns-3.44/src/stats/model/sqlite-data-output.cc
--- ns-3.43/src/stats/model/sqlite-data-output.cc	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/stats/model/sqlite-data-output.cc	2025-03-09 16:55:49.699372300 -0700
@@ -90,9 +90,9 @@
     res = m_sqliteOut->Bind(stmt, 5, description);
     NS_ASSERT(res);
 
-    res = m_sqliteOut->SpinStep(stmt);
+    res = SQLiteOutput::SpinStep(stmt);
     NS_ASSERT(res);
-    res = m_sqliteOut->SpinFinalize(stmt);
+    res = SQLiteOutput::SpinFinalize(stmt);
     NS_ASSERT(res == 0);
 
     res = m_sqliteOut->WaitExec("CREATE TABLE IF NOT EXISTS "
@@ -107,15 +107,15 @@
 
     for (auto i = dc.MetadataBegin(); i != dc.MetadataEnd(); i++)
     {
-        std::pair<std::string, std::string> blob = (*i);
-        m_sqliteOut->SpinReset(stmt);
+        const auto& blob = (*i);
+        SQLiteOutput::SpinReset(stmt);
         m_sqliteOut->Bind(stmt, 1, run);
         m_sqliteOut->Bind(stmt, 2, blob.first);
         m_sqliteOut->Bind(stmt, 3, blob.second);
-        m_sqliteOut->SpinStep(stmt);
+        SQLiteOutput::SpinStep(stmt);
     }
 
-    m_sqliteOut->SpinFinalize(stmt);
+    SQLiteOutput::SpinFinalize(stmt);
 
     m_sqliteOut->SpinExec("BEGIN");
     SqliteOutputCallback callback(m_sqliteOut, run);
@@ -147,7 +147,7 @@
 
 SqliteDataOutput::SqliteOutputCallback::~SqliteOutputCallback()
 {
-    m_db->SpinFinalize(m_insertSingletonStatement);
+    SQLiteOutput::SpinFinalize(m_insertSingletonStatement);
 }
 
 void
@@ -158,23 +158,23 @@
     NS_LOG_FUNCTION(this << key << variable << statSum);
 
     OutputSingleton(key, variable + "-count", static_cast<double>(statSum->getCount()));
-    if (!isNaN(statSum->getSum()))
+    if (!std::isnan(statSum->getSum()))
     {
         OutputSingleton(key, variable + "-total", statSum->getSum());
     }
-    if (!isNaN(statSum->getMax()))
+    if (!std::isnan(statSum->getMax()))
     {
         OutputSingleton(key, variable + "-max", statSum->getMax());
     }
-    if (!isNaN(statSum->getMin()))
+    if (!std::isnan(statSum->getMin()))
     {
         OutputSingleton(key, variable + "-min", statSum->getMin());
     }
-    if (!isNaN(statSum->getSqrSum()))
+    if (!std::isnan(statSum->getSqrSum()))
     {
         OutputSingleton(key, variable + "-sqrsum", statSum->getSqrSum());
     }
-    if (!isNaN(statSum->getStddev()))
+    if (!std::isnan(statSum->getStddev()))
     {
         OutputSingleton(key, variable + "-stddev", statSum->getStddev());
     }
@@ -187,11 +187,11 @@
 {
     NS_LOG_FUNCTION(this << key << variable << val);
 
-    m_db->SpinReset(m_insertSingletonStatement);
+    SQLiteOutput::SpinReset(m_insertSingletonStatement);
     m_db->Bind(m_insertSingletonStatement, 2, key);
     m_db->Bind(m_insertSingletonStatement, 3, variable);
     m_db->Bind(m_insertSingletonStatement, 4, val);
-    m_db->SpinStep(m_insertSingletonStatement);
+    SQLiteOutput::SpinStep(m_insertSingletonStatement);
 }
 
 void
@@ -201,11 +201,11 @@
 {
     NS_LOG_FUNCTION(this << key << variable << val);
 
-    m_db->SpinReset(m_insertSingletonStatement);
+    SQLiteOutput::SpinReset(m_insertSingletonStatement);
     m_db->Bind(m_insertSingletonStatement, 2, key);
     m_db->Bind(m_insertSingletonStatement, 3, variable);
     m_db->Bind(m_insertSingletonStatement, 4, val);
-    m_db->SpinStep(m_insertSingletonStatement);
+    SQLiteOutput::SpinStep(m_insertSingletonStatement);
 }
 
 void
@@ -215,11 +215,11 @@
 {
     NS_LOG_FUNCTION(this << key << variable << val);
 
-    m_db->SpinReset(m_insertSingletonStatement);
+    SQLiteOutput::SpinReset(m_insertSingletonStatement);
     m_db->Bind(m_insertSingletonStatement, 2, key);
     m_db->Bind(m_insertSingletonStatement, 3, variable);
     m_db->Bind(m_insertSingletonStatement, 4, val);
-    m_db->SpinStep(m_insertSingletonStatement);
+    SQLiteOutput::SpinStep(m_insertSingletonStatement);
 }
 
 void
@@ -229,11 +229,11 @@
 {
     NS_LOG_FUNCTION(this << key << variable << val);
 
-    m_db->SpinReset(m_insertSingletonStatement);
+    SQLiteOutput::SpinReset(m_insertSingletonStatement);
     m_db->Bind(m_insertSingletonStatement, 2, key);
     m_db->Bind(m_insertSingletonStatement, 3, variable);
     m_db->Bind(m_insertSingletonStatement, 4, val);
-    m_db->SpinStep(m_insertSingletonStatement);
+    SQLiteOutput::SpinStep(m_insertSingletonStatement);
 }
 
 void
@@ -243,11 +243,11 @@
 {
     NS_LOG_FUNCTION(this << key << variable << val);
 
-    m_db->SpinReset(m_insertSingletonStatement);
+    SQLiteOutput::SpinReset(m_insertSingletonStatement);
     m_db->Bind(m_insertSingletonStatement, 2, key);
     m_db->Bind(m_insertSingletonStatement, 3, variable);
     m_db->Bind(m_insertSingletonStatement, 4, val.GetTimeStep());
-    m_db->SpinStep(m_insertSingletonStatement);
+    SQLiteOutput::SpinStep(m_insertSingletonStatement);
 }
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/stats/model/sqlite-data-output.h ns-3.44/src/stats/model/sqlite-data-output.h
--- ns-3.43/src/stats/model/sqlite-data-output.h	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/stats/model/sqlite-data-output.h	2025-03-09 16:55:49.699372300 -0700
@@ -23,9 +23,9 @@
 //------------------------------------------------------------
 //--------------------------------------------
 /**
- * \ingroup dataoutput
- * \class SqliteDataOutput
- * \brief Outputs data in a format compatible with SQLite
+ * @ingroup dataoutput
+ * @class SqliteDataOutput
+ * @brief Outputs data in a format compatible with SQLite
  */
 class SqliteDataOutput : public DataOutputInterface
 {
@@ -35,7 +35,7 @@
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
@@ -43,17 +43,17 @@
 
   private:
     /**
-     * \ingroup dataoutput
+     * @ingroup dataoutput
      *
-     * \brief Class to generate OMNeT output
+     * @brief Class to generate OMNeT output
      */
     class SqliteOutputCallback : public DataOutputCallback
     {
       public:
         /**
          * Constructor
-         * \param db pointer to the instance this object belongs to
-         * \param run experiment descriptor
+         * @param db pointer to the instance this object belongs to
+         * @param run experiment descriptor
          */
         SqliteOutputCallback(const Ptr<SQLiteOutput>& db, std::string run);
 
@@ -63,52 +63,52 @@
         ~SqliteOutputCallback() override;
 
         /**
-         * \brief Generates data statistics
-         * \param key the SQL key to use
-         * \param variable the variable name
-         * \param statSum the stats to print
+         * @brief Generates data statistics
+         * @param key the SQL key to use
+         * @param variable the variable name
+         * @param statSum the stats to print
          */
         void OutputStatistic(std::string key,
                              std::string variable,
                              const StatisticalSummary* statSum) override;
 
         /**
-         * \brief Generates a single data output
-         * \param key the SQL key to use
-         * \param variable the variable name
-         * \param val the value
+         * @brief Generates a single data output
+         * @param key the SQL key to use
+         * @param variable the variable name
+         * @param val the value
          */
         void OutputSingleton(std::string key, std::string variable, int val) override;
 
         /**
-         * \brief Generates a single data output
-         * \param key the SQL key to use
-         * \param variable the variable name
-         * \param val the value
+         * @brief Generates a single data output
+         * @param key the SQL key to use
+         * @param variable the variable name
+         * @param val the value
          */
         void OutputSingleton(std::string key, std::string variable, uint32_t val) override;
 
         /**
-         * \brief Generates a single data output
-         * \param key the SQL key to use
-         * \param variable the variable name
-         * \param val the value
+         * @brief Generates a single data output
+         * @param key the SQL key to use
+         * @param variable the variable name
+         * @param val the value
          */
         void OutputSingleton(std::string key, std::string variable, double val) override;
 
         /**
-         * \brief Generates a single data output
-         * \param key the SQL key to use
-         * \param variable the variable name
-         * \param val the value
+         * @brief Generates a single data output
+         * @param key the SQL key to use
+         * @param variable the variable name
+         * @param val the value
          */
         void OutputSingleton(std::string key, std::string variable, std::string val) override;
 
         /**
-         * \brief Generates a single data output
-         * \param key the SQL key to use
-         * \param variable the variable name
-         * \param val the value
+         * @brief Generates a single data output
+         * @param key the SQL key to use
+         * @param variable the variable name
+         * @param val the value
          */
         void OutputSingleton(std::string key, std::string variable, Time val) override;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/stats/model/sqlite-output.cc ns-3.44/src/stats/model/sqlite-output.cc
--- ns-3.43/src/stats/model/sqlite-output.cc	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/stats/model/sqlite-output.cc	2025-03-09 16:55:49.703372200 -0700
@@ -84,7 +84,7 @@
     NS_FATAL_ERROR("Can't call generic fn");
 }
 
-/// \copydoc SQLiteOutput::RetrieveColumn
+/// @copydoc SQLiteOutput::RetrieveColumn
 template <>
 int
 SQLiteOutput::RetrieveColumn(sqlite3_stmt* stmt, int pos) const
@@ -92,7 +92,7 @@
     return sqlite3_column_int(stmt, pos);
 }
 
-/// \copydoc SQLiteOutput::RetrieveColumn
+/// @copydoc SQLiteOutput::RetrieveColumn
 template <>
 uint32_t
 SQLiteOutput::RetrieveColumn(sqlite3_stmt* stmt, int pos) const
@@ -100,7 +100,7 @@
     return static_cast<uint32_t>(sqlite3_column_int(stmt, pos));
 }
 
-/// \copydoc SQLiteOutput::RetrieveColumn
+/// @copydoc SQLiteOutput::RetrieveColumn
 template <>
 double
 SQLiteOutput::RetrieveColumn(sqlite3_stmt* stmt, int pos) const
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/stats/model/sqlite-output.h ns-3.44/src/stats/model/sqlite-output.h
--- ns-3.43/src/stats/model/sqlite-output.h	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/stats/model/sqlite-output.h	2025-03-09 16:55:49.703372200 -0700
@@ -17,9 +17,9 @@
 {
 
 /**
- * \ingroup stats
+ * @ingroup stats
  *
- * \brief A C++ interface towards an SQLITE database
+ * @brief A C++ interface towards an SQLITE database
  *
  * The class is able to execute commands, and retrieve results, from an SQLITE
  * database. The methods with the "Spin" prefix, in case of concurrent access
@@ -36,8 +36,8 @@
 {
   public:
     /**
-     * \brief SQLiteOutput constructor
-     * \param name database name
+     * @brief SQLiteOutput constructor
+     * @param name database name
      */
     SQLiteOutput(const std::string& name);
 
@@ -47,171 +47,171 @@
     ~SQLiteOutput();
 
     /**
-     * \brief Instruct SQLite to store the journal in memory. May lead to data losses
+     * @brief Instruct SQLite to store the journal in memory. May lead to data losses
      * in case of unexpected program exits.
      */
     void SetJournalInMemory();
 
     /**
-     * \brief Execute a command until the return value is OK or an ERROR
+     * @brief Execute a command until the return value is OK or an ERROR
      *
      * Ignore errors due to concurrency, the method will repeat the command instead
      *
-     * \param cmd Command
-     * \return true in case of success
+     * @param cmd Command
+     * @return true in case of success
      */
     bool SpinExec(const std::string& cmd) const;
 
     /**
-     * \brief Execute a command until the return value is OK or an ERROR
-     * \param stmt SQLite statement
-     * \return true in case of success
+     * @brief Execute a command until the return value is OK or an ERROR
+     * @param stmt SQLite statement
+     * @return true in case of success
      */
     bool SpinExec(sqlite3_stmt* stmt) const;
 
     /**
-     * \brief Execute a command, waiting on a mutex
-     * \param cmd Command to be executed
-     * \return true in case of success
+     * @brief Execute a command, waiting on a mutex
+     * @param cmd Command to be executed
+     * @return true in case of success
      */
     bool WaitExec(const std::string& cmd) const;
 
     /**
-     * \brief Execute a command, waiting on a mutex
-     * \param stmt Sqlite3 statement to be executed
-     * \return true in case of success
+     * @brief Execute a command, waiting on a mutex
+     * @param stmt Sqlite3 statement to be executed
+     * @return true in case of success
      */
     bool WaitExec(sqlite3_stmt* stmt) const;
 
     /**
-     * \brief Prepare a statement, waiting on a mutex
-     * \param stmt Sqlite statement
-     * \param cmd Command to prepare inside the statement
-     * \return true in case of success
+     * @brief Prepare a statement, waiting on a mutex
+     * @param stmt Sqlite statement
+     * @param cmd Command to prepare inside the statement
+     * @return true in case of success
      */
     bool WaitPrepare(sqlite3_stmt** stmt, const std::string& cmd) const;
 
     /**
-     * \brief Prepare a statement
-     * \param stmt Sqlite statement
-     * \param cmd Command to prepare inside the statement
-     * \return true in case of success
+     * @brief Prepare a statement
+     * @param stmt Sqlite statement
+     * @param cmd Command to prepare inside the statement
+     * @return true in case of success
      */
     bool SpinPrepare(sqlite3_stmt** stmt, const std::string& cmd) const;
 
     /**
-     * \brief Bind a value to a sqlite statement
-     * \param stmt Sqlite statement
-     * \param pos Position of the bind argument inside the statement
-     * \param value Value to bind
-     * \return true on success, false otherwise
+     * @brief Bind a value to a sqlite statement
+     * @param stmt Sqlite statement
+     * @param pos Position of the bind argument inside the statement
+     * @param value Value to bind
+     * @return true on success, false otherwise
      */
     template <typename T>
     bool Bind(sqlite3_stmt* stmt, int pos, const T& value) const;
 
     /**
-     * \brief Retrieve a value from an executed statement
-     * \param stmt sqlite statement
-     * \param pos Column position
-     * \return the value from the executed statement
+     * @brief Retrieve a value from an executed statement
+     * @param stmt sqlite statement
+     * @param pos Column position
+     * @return the value from the executed statement
      */
     template <typename T>
     T RetrieveColumn(sqlite3_stmt* stmt, int pos) const;
 
     /**
-     * \brief Execute a step operation on a statement until the result is ok or an error
+     * @brief Execute a step operation on a statement until the result is ok or an error
      *
      * Ignores concurrency errors; it will retry instead of failing.
      *
-     * \param stmt Statement
-     * \return Sqlite error core
+     * @param stmt Statement
+     * @return Sqlite error core
      */
 
     static int SpinStep(sqlite3_stmt* stmt);
     /**
-     * \brief Finalize a statement until the result is ok or an error
+     * @brief Finalize a statement until the result is ok or an error
      *
      * Ignores concurrency errors; it will retry instead of failing.
      *
-     * \param stmt Statement
-     * \return Sqlite error code
+     * @param stmt Statement
+     * @return Sqlite error code
      */
     static int SpinFinalize(sqlite3_stmt* stmt);
 
     /**
-     * \brief Reset a statement until the result is ok or an error
+     * @brief Reset a statement until the result is ok or an error
      *
      * Ignores concurrency errors: it will retry instead of failing.
-     * \param stmt Statement
-     * \return the return code of reset
+     * @param stmt Statement
+     * @return the return code of reset
      */
     static int SpinReset(sqlite3_stmt* stmt);
 
   protected:
     /**
-     * \brief Execute a command, waiting on a mutex
-     * \param db Database
-     * \param cmd Command
-     * \return Sqlite error code
+     * @brief Execute a command, waiting on a mutex
+     * @param db Database
+     * @param cmd Command
+     * @return Sqlite error code
      */
     int WaitExec(sqlite3* db, const std::string& cmd) const;
 
     /**
-     * \brief Execute a statement, waiting on a mutex
-     * \param db Database
-     * \param stmt Statement
-     * \return Sqlite error code
+     * @brief Execute a statement, waiting on a mutex
+     * @param db Database
+     * @param stmt Statement
+     * @return Sqlite error code
      */
     int WaitExec(sqlite3* db, sqlite3_stmt* stmt) const;
 
     /**
-     * \brief Prepare a statement, waiting on a mutex
-     * \param db Database
-     * \param stmt Statement
-     * \param cmd Command to prepare
-     * \return Sqlite error code
+     * @brief Prepare a statement, waiting on a mutex
+     * @param db Database
+     * @param stmt Statement
+     * @param cmd Command to prepare
+     * @return Sqlite error code
      */
     int WaitPrepare(sqlite3* db, sqlite3_stmt** stmt, const std::string& cmd) const;
 
     /**
-     * \brief Execute a command ignoring concurrency problems, retrying instead
-     * \param db Database
-     * \param cmd Command
-     * \return Sqlite error code
+     * @brief Execute a command ignoring concurrency problems, retrying instead
+     * @param db Database
+     * @param cmd Command
+     * @return Sqlite error code
      */
     static int SpinExec(sqlite3* db, const std::string& cmd);
 
     /**
-     * \brief Execute a Prepared Statement Object ignoring concurrency problems, retrying instead
-     * \param db Database
-     * \param stmt Prepared Statement Object
-     * \return Sqlite error code
+     * @brief Execute a Prepared Statement Object ignoring concurrency problems, retrying instead
+     * @param db Database
+     * @param stmt Prepared Statement Object
+     * @return Sqlite error code
      */
     static int SpinExec(sqlite3* db, sqlite3_stmt* stmt);
 
     /**
-     * \brief Preparing a command ignoring concurrency problems, retrying instead
-     * \param db Database
-     * \param stmt Statement
-     * \param cmd Command to prepare
-     * \return Sqlite error code
+     * @brief Preparing a command ignoring concurrency problems, retrying instead
+     * @param db Database
+     * @param stmt Statement
+     * @param cmd Command to prepare
+     * @return Sqlite error code
      */
     static int SpinPrepare(sqlite3* db, sqlite3_stmt** stmt, const std::string& cmd);
 
     /**
-     * \brief Fail, printing an error message from sqlite
-     * \param db Database
-     * \param cmd Command
+     * @brief Fail, printing an error message from sqlite
+     * @param db Database
+     * @param cmd Command
      */
     [[noreturn]] static void Error(sqlite3* db, const std::string& cmd);
 
     /**
-     * \brief Check any error in the db
-     * \param db Database
-     * \param rc Sqlite return code
-     * \param cmd Command
-     * \param hardExit if true, will exit the program
-     * \return true in case of error, false otherwise
+     * @brief Check any error in the db
+     * @param db Database
+     * @param rc Sqlite return code
+     * @param cmd Command
+     * @param hardExit if true, will exit the program
+     * @return true in case of error, false otherwise
      */
     static bool CheckError(sqlite3* db, int rc, const std::string& cmd, bool hardExit);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/stats/model/stats.h ns-3.44/src/stats/model/stats.h
--- ns-3.43/src/stats/model/stats.h	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/stats/model/stats.h	2025-03-09 16:55:49.703372200 -0700
@@ -12,7 +12,7 @@
 // Header file used only to define the stats group in Doxygen
 
 /**
- * \defgroup stats Statistics
+ * @defgroup stats Statistics
  *
  * The statistics module includes some useful features to ease data collection from experiments.
  * In particular the following features are included:
@@ -28,16 +28,16 @@
  */
 
 /**
- * \ingroup stats
- * \defgroup aggregator Data Aggregators
+ * @ingroup stats
+ * @defgroup aggregator Data Aggregators
  *
  * Data aggregators are classes used to collect data and produce output
  * specialized for various purpose, e.g., Gnuplot, file output, etc.
  */
 
 /**
- * \ingroup stats
- * \defgroup probes Probes
+ * @ingroup stats
+ * @defgroup probes Probes
  *
  * Probes are used to probe an underlying ns3 TraceSource exporting
  * its value.  This probe usually exports a trace source "Output".
@@ -48,25 +48,25 @@
  */
 
 /**
- * \ingroup stats
- * \defgroup gnuplot Gnuplot
+ * @ingroup stats
+ * @defgroup gnuplot Gnuplot
  *
  * Classes in Gnuplot group are used to collect and prepare and output data
  * for subsequent processing by Gnuplot.
  */
 
 /**
- * \ingroup stats
- * \defgroup dataoutput Data Output
+ * @ingroup stats
+ * @defgroup dataoutput Data Output
  *
  * Classes in Data Output group are used to collect and prepare and output data
  * for subsequent output in a specific format, e.g., Omnet++, SQLite, etc.
  */
 
 /**
- * \ingroup stats
- * \ingroup tests
- * \defgroup stats-tests Statistics module tests
+ * @ingroup stats
+ * @ingroup tests
+ * @defgroup stats-tests Statistics module tests
  */
 
 #endif /* STATS_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/stats/model/time-data-calculators.h ns-3.44/src/stats/model/time-data-calculators.h
--- ns-3.43/src/stats/model/time-data-calculators.h	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/stats/model/time-data-calculators.h	2025-03-09 16:55:49.703372200 -0700
@@ -20,7 +20,7 @@
 //------------------------------------------------------------
 //--------------------------------------------
 /**
- * \ingroup stats
+ * @ingroup stats
  *
  * Unfortunately, templating the base MinMaxAvgTotalCalculator to
  * operate over Time values isn't straightforward.  The main issues
@@ -36,19 +36,19 @@
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
     /**
      * Updates all variables of TimeMinMaxAvgTotalCalculator
-     * \param i value of type Time to use for updating the calculator
+     * @param i value of type Time to use for updating the calculator
      */
     void Update(const Time i);
 
     /**
      * Outputs data based on the provided callback
-     * \param callback
+     * @param callback
      */
     void Output(DataOutputCallback& callback) const override;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/stats/model/time-probe.h ns-3.44/src/stats/model/time-probe.h
--- ns-3.43/src/stats/model/time-probe.h	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/stats/model/time-probe.h	2025-03-09 16:55:49.703372200 -0700
@@ -25,7 +25,7 @@
 {
 
 /**
- * \ingroup probes
+ * @ingroup probes
  *
  * This class is designed to probe an underlying ns3 TraceSource exporting
  * an ns3::Time.  This probe exports a trace source "Output" of type
@@ -39,44 +39,44 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TimeProbe();
     ~TimeProbe() override;
 
     /**
-     * \return the most recent value (units of seconds)
+     * @return the most recent value (units of seconds)
      */
     double GetValue() const;
 
     /**
-     * \param value set the traced Time to a new value
+     * @param value set the traced Time to a new value
      */
     void SetValue(Time value);
 
     /**
-     * \brief Set a probe value by its name in the Config system
+     * @brief Set a probe value by its name in the Config system
      *
-     * \param path Config path to access the probe
-     * \param value set the traced Time to a new value
+     * @param path Config path to access the probe
+     * @param value set the traced Time to a new value
      */
     static void SetValueByPath(std::string path, Time value);
 
     /**
-     * \brief connect to a trace source attribute provided by a given object
+     * @brief connect to a trace source attribute provided by a given object
      *
-     * \param traceSource the name of the attribute TraceSource to connect to
-     * \param obj ns3::Object to connect to
-     * \return true if the trace source was successfully connected
+     * @param traceSource the name of the attribute TraceSource to connect to
+     * @param obj ns3::Object to connect to
+     * @return true if the trace source was successfully connected
      */
     bool ConnectByObject(std::string traceSource, Ptr<Object> obj) override;
 
     /**
-     * \brief connect to a trace source provided by a config path
+     * @brief connect to a trace source provided by a config path
      *
-     * \param path Config path to bind to
+     * @param path Config path to bind to
      *
      * Note, if an invalid path is provided, the probe will not be connected
      * to anything.
@@ -85,10 +85,10 @@
 
   private:
     /**
-     * \brief Method to connect to an underlying ns3::TraceSource of type Time
+     * @brief Method to connect to an underlying ns3::TraceSource of type Time
      *
-     * \param oldData previous value of the Time
-     * \param newData new value of the Time
+     * @param oldData previous value of the Time
+     * @param newData new value of the Time
      */
     void TraceSink(Time oldData, Time newData);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/stats/model/time-series-adaptor.h ns-3.44/src/stats/model/time-series-adaptor.h
--- ns-3.43/src/stats/model/time-series-adaptor.h	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/stats/model/time-series-adaptor.h	2025-03-09 16:55:49.703372200 -0700
@@ -19,9 +19,9 @@
 {
 
 /**
- * \ingroup aggregator
+ * @ingroup aggregator
  *
- * \brief Takes probed values of different types and outputs the
+ * @brief Takes probed values of different types and outputs the
  * current time plus the value with both converted to doubles.
  *
  * The role of the TimeSeriesAdaptor class is that of an adaptor
@@ -39,8 +39,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -48,10 +48,10 @@
     ~TimeSeriesAdaptor() override;
 
     /**
-     * \brief Trace sink for receiving data from double valued trace
+     * @brief Trace sink for receiving data from double valued trace
      * sources.
-     * \param oldData the original value.
-     * \param newData the new value.
+     * @param oldData the original value.
+     * @param newData the new value.
      *
      * This method serves as a trace sink to double valued trace
      * sources.
@@ -59,10 +59,10 @@
     void TraceSinkDouble(double oldData, double newData);
 
     /**
-     * \brief Trace sink for receiving data from bool valued trace
+     * @brief Trace sink for receiving data from bool valued trace
      * sources.
-     * \param oldData the original value.
-     * \param newData the new value.
+     * @param oldData the original value.
+     * @param newData the new value.
      *
      * This method serves as a trace sink to bool valued trace
      * sources.
@@ -70,10 +70,10 @@
     void TraceSinkBoolean(bool oldData, bool newData);
 
     /**
-     * \brief Trace sink for receiving data from uint8_t valued trace
+     * @brief Trace sink for receiving data from uint8_t valued trace
      * sources.
-     * \param oldData the original value.
-     * \param newData the new value.
+     * @param oldData the original value.
+     * @param newData the new value.
      *
      * This method serves as a trace sink to uint8_t valued trace
      * sources.
@@ -81,10 +81,10 @@
     void TraceSinkUinteger8(uint8_t oldData, uint8_t newData);
 
     /**
-     * \brief Trace sink for receiving data from uint16_t valued trace
+     * @brief Trace sink for receiving data from uint16_t valued trace
      * sources.
-     * \param oldData the original value.
-     * \param newData the new value.
+     * @param oldData the original value.
+     * @param newData the new value.
      *
      * This method serves as a trace sink to uint16_t valued trace
      * sources.
@@ -92,10 +92,10 @@
     void TraceSinkUinteger16(uint16_t oldData, uint16_t newData);
 
     /**
-     * \brief Trace sink for receiving data from uint32_t valued trace
+     * @brief Trace sink for receiving data from uint32_t valued trace
      * sources.
-     * \param oldData the original value.
-     * \param newData the new value.
+     * @param oldData the original value.
+     * @param newData the new value.
      *
      * This method serves as a trace sink to uint32_t valued trace
      * sources.
@@ -105,8 +105,8 @@
     /**
      * TracedCallback signature for output trace.
      *
-     * \param [in] now The current time, in seconds.
-     * \param [in] data The new data value.
+     * @param [in] now The current time, in seconds.
+     * @param [in] data The new data value.
      */
     typedef void (*OutputTracedCallback)(const double now, const double data);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/stats/model/uinteger-16-probe.h ns-3.44/src/stats/model/uinteger-16-probe.h
--- ns-3.43/src/stats/model/uinteger-16-probe.h	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/stats/model/uinteger-16-probe.h	2025-03-09 16:55:49.703372200 -0700
@@ -21,7 +21,7 @@
 {
 
 /**
- * \ingroup probes
+ * @ingroup probes
  *
  * This class is designed to probe an underlying ns3 TraceSource exporting
  * an uint16_t.  This probe exports a trace source "Output" of type uint16_t.
@@ -34,44 +34,44 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     Uinteger16Probe();
     ~Uinteger16Probe() override;
 
     /**
-     * \return the most recent value
+     * @return the most recent value
      */
     uint16_t GetValue() const;
 
     /**
-     * \param value set the traced uint16_t to a new value
+     * @param value set the traced uint16_t to a new value
      */
     void SetValue(uint16_t value);
 
     /**
-     * \brief Set a probe value by its name in the Config system
+     * @brief Set a probe value by its name in the Config system
      *
-     * \param path Config path to access the probe
-     * \param value set the traced uint16_t to a new value
+     * @param path Config path to access the probe
+     * @param value set the traced uint16_t to a new value
      */
     static void SetValueByPath(std::string path, uint16_t value);
 
     /**
-     * \brief connect to a trace source attribute provided by a given object
+     * @brief connect to a trace source attribute provided by a given object
      *
-     * \param traceSource the name of the attribute TraceSource to connect to
-     * \param obj ns3::Object to connect to
-     * \return true if the trace source was successfully connected
+     * @param traceSource the name of the attribute TraceSource to connect to
+     * @param obj ns3::Object to connect to
+     * @return true if the trace source was successfully connected
      */
     bool ConnectByObject(std::string traceSource, Ptr<Object> obj) override;
 
     /**
-     * \brief connect to a trace source provided by a config path
+     * @brief connect to a trace source provided by a config path
      *
-     * \param path Config path to bind to
+     * @param path Config path to bind to
      *
      * Note, if an invalid path is provided, the probe will not be connected
      * to anything.
@@ -80,10 +80,10 @@
 
   private:
     /**
-     * \brief Method to connect to an underlying ns3::TraceSource of type uint16_t
+     * @brief Method to connect to an underlying ns3::TraceSource of type uint16_t
      *
-     * \param oldData previous value of the uint16_t
-     * \param newData new value of the uint16_t
+     * @param oldData previous value of the uint16_t
+     * @param newData new value of the uint16_t
      */
     void TraceSink(uint16_t oldData, uint16_t newData);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/stats/model/uinteger-32-probe.h ns-3.44/src/stats/model/uinteger-32-probe.h
--- ns-3.43/src/stats/model/uinteger-32-probe.h	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/stats/model/uinteger-32-probe.h	2025-03-09 16:55:49.703372200 -0700
@@ -21,7 +21,7 @@
 {
 
 /**
- * \ingroup probes
+ * @ingroup probes
  *
  * This class is designed to probe an underlying ns3 TraceSource exporting
  * an uint32_t.  This probe exports a trace source "Output" of type uint32_t.
@@ -34,44 +34,44 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     Uinteger32Probe();
     ~Uinteger32Probe() override;
 
     /**
-     * \return the most recent value
+     * @return the most recent value
      */
     uint32_t GetValue() const;
 
     /**
-     * \param value set the traced uint32_t to a new value
+     * @param value set the traced uint32_t to a new value
      */
     void SetValue(uint32_t value);
 
     /**
-     * \brief Set a probe value by its name in the Config system
+     * @brief Set a probe value by its name in the Config system
      *
-     * \param path Config path to access the probe
-     * \param value set the traced uint32_t to a new value
+     * @param path Config path to access the probe
+     * @param value set the traced uint32_t to a new value
      */
     static void SetValueByPath(std::string path, uint32_t value);
 
     /**
-     * \brief connect to a trace source attribute provided by a given object
+     * @brief connect to a trace source attribute provided by a given object
      *
-     * \param traceSource the name of the attribute TraceSource to connect to
-     * \param obj ns3::Object to connect to
-     * \return true if the trace source was successfully connected
+     * @param traceSource the name of the attribute TraceSource to connect to
+     * @param obj ns3::Object to connect to
+     * @return true if the trace source was successfully connected
      */
     bool ConnectByObject(std::string traceSource, Ptr<Object> obj) override;
 
     /**
-     * \brief connect to a trace source provided by a config path
+     * @brief connect to a trace source provided by a config path
      *
-     * \param path Config path to bind to
+     * @param path Config path to bind to
      *
      * Note, if an invalid path is provided, the probe will not be connected
      * to anything.
@@ -80,10 +80,10 @@
 
   private:
     /**
-     * \brief Method to connect to an underlying ns3::TraceSource of type uint32_t
+     * @brief Method to connect to an underlying ns3::TraceSource of type uint32_t
      *
-     * \param oldData previous value of the uint32_t
-     * \param newData new value of the uint32_t
+     * @param oldData previous value of the uint32_t
+     * @param newData new value of the uint32_t
      */
     void TraceSink(uint32_t oldData, uint32_t newData);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/stats/model/uinteger-8-probe.h ns-3.44/src/stats/model/uinteger-8-probe.h
--- ns-3.43/src/stats/model/uinteger-8-probe.h	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/stats/model/uinteger-8-probe.h	2025-03-09 16:55:49.703372200 -0700
@@ -21,7 +21,7 @@
 {
 
 /**
- * \ingroup probes
+ * @ingroup probes
  *
  * This class is designed to probe an underlying ns3 TraceSource exporting
  * an uint8_t.  This probe exports a trace source "Output" of type uint8_t.
@@ -34,44 +34,44 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     Uinteger8Probe();
     ~Uinteger8Probe() override;
 
     /**
-     * \return the most recent value
+     * @return the most recent value
      */
     uint8_t GetValue() const;
 
     /**
-     * \param value set the traced uint8_t to a new value
+     * @param value set the traced uint8_t to a new value
      */
     void SetValue(uint8_t value);
 
     /**
-     * \brief Set a probe value by its name in the Config system
+     * @brief Set a probe value by its name in the Config system
      *
-     * \param path Config path to access the probe
-     * \param value set the traced uint8_t to a new value
+     * @param path Config path to access the probe
+     * @param value set the traced uint8_t to a new value
      */
     static void SetValueByPath(std::string path, uint8_t value);
 
     /**
-     * \brief connect to a trace source attribute provided by a given object
+     * @brief connect to a trace source attribute provided by a given object
      *
-     * \param traceSource the name of the attribute TraceSource to connect to
-     * \param obj ns3::Object to connect to
-     * \return true if the trace source was successfully connected
+     * @param traceSource the name of the attribute TraceSource to connect to
+     * @param obj ns3::Object to connect to
+     * @return true if the trace source was successfully connected
      */
     bool ConnectByObject(std::string traceSource, Ptr<Object> obj) override;
 
     /**
-     * \brief connect to a trace source provided by a config path
+     * @brief connect to a trace source provided by a config path
      *
-     * \param path Config path to bind to
+     * @param path Config path to bind to
      *
      * Note, if an invalid path is provided, the probe will not be connected
      * to anything.
@@ -80,10 +80,10 @@
 
   private:
     /**
-     * \brief Method to connect to an underlying ns3::TraceSource of type uint8_t
+     * @brief Method to connect to an underlying ns3::TraceSource of type uint8_t
      *
-     * \param oldData previous value of the uint8_t
-     * \param newData new value of the uint8_t
+     * @param oldData previous value of the uint8_t
+     * @param newData new value of the uint8_t
      */
     void TraceSink(uint8_t oldData, uint8_t newData);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/stats/test/average-test-suite.cc ns-3.44/src/stats/test/average-test-suite.cc
--- ns-3.43/src/stats/test/average-test-suite.cc	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/stats/test/average-test-suite.cc	2025-03-09 16:55:49.703372200 -0700
@@ -18,9 +18,9 @@
 const double TOLERANCE = 2e-14;
 
 /**
- * \ingroup stats-tests
+ * @ingroup stats-tests
  *
- * \brief Average class - Test case for a single integer.
+ * @brief Average class - Test case for a single integer.
  */
 class OneIntegerAverageTestCase : public TestCase
 {
@@ -109,9 +109,9 @@
 }
 
 /**
- * \ingroup stats-tests
+ * @ingroup stats-tests
  *
- * \brief Average class - Test case for five integers.
+ * @brief Average class - Test case for five integers.
  */
 class FiveIntegersAverageTestCase : public TestCase
 {
@@ -202,9 +202,9 @@
 }
 
 /**
- * \ingroup stats-tests
+ * @ingroup stats-tests
  *
- * \brief Average class - Test case for five double values.
+ * @brief Average class - Test case for five double values.
  */
 class FiveDoublesAverageTestCase : public TestCase
 {
@@ -295,9 +295,9 @@
 }
 
 /**
- * \ingroup stats-tests
+ * @ingroup stats-tests
  *
- * \brief Average class TestSuite
+ * @brief Average class TestSuite
  */
 class AverageTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/stats/test/basic-data-calculators-test-suite.cc ns-3.44/src/stats/test/basic-data-calculators-test-suite.cc
--- ns-3.43/src/stats/test/basic-data-calculators-test-suite.cc	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/stats/test/basic-data-calculators-test-suite.cc	2025-03-09 16:55:49.703372200 -0700
@@ -17,9 +17,9 @@
 const double TOLERANCE = 1e-13;
 
 /**
- * \ingroup stats-tests
+ * @ingroup stats-tests
  *
- * \brief MinMaxAvgTotalCalculator class - Test case for a single integer.
+ * @brief MinMaxAvgTotalCalculator class - Test case for a single integer.
  */
 class OneIntegerTestCase : public TestCase
 {
@@ -91,9 +91,9 @@
 }
 
 /**
- * \ingroup stats-tests
+ * @ingroup stats-tests
  *
- * \brief MinMaxAvgTotalCalculator class - Test case for five integers.
+ * @brief MinMaxAvgTotalCalculator class - Test case for five integers.
  */
 class FiveIntegersTestCase : public TestCase
 {
@@ -165,9 +165,9 @@
 }
 
 /**
- * \ingroup stats-tests
+ * @ingroup stats-tests
  *
- * \brief MinMaxAvgTotalCalculator class - Test case for five double values.
+ * @brief MinMaxAvgTotalCalculator class - Test case for five double values.
  */
 class FiveDoublesTestCase : public TestCase
 {
@@ -239,9 +239,9 @@
 }
 
 /**
- * \ingroup stats-tests
+ * @ingroup stats-tests
  *
- * \brief MinMaxAvgTotalCalculator class TestSuite
+ * @brief MinMaxAvgTotalCalculator class TestSuite
  */
 class BasicDataCalculatorsTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/stats/test/double-probe-test-suite.cc ns-3.44/src/stats/test/double-probe-test-suite.cc
--- ns-3.43/src/stats/test/double-probe-test-suite.cc	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/stats/test/double-probe-test-suite.cc	2025-03-09 16:55:49.703372200 -0700
@@ -14,16 +14,16 @@
 using namespace ns3;
 
 /**
- * \ingroup stats-tests
+ * @ingroup stats-tests
  *
- * \brief Simple data emitter to check that a probe receives data.
+ * @brief Simple data emitter to check that a probe receives data.
  */
 class SampleEmitter : public Object
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
@@ -50,13 +50,13 @@
         m_time += Simulator::Now().GetSeconds();
     }
 
-    /// \return the time delta of the next report.
+    /// @return the time delta of the next report.
     double GetTime() const
     {
         return m_time;
     }
 
-    /// \return a random variable, different for each reschedule.
+    /// @return a random variable, different for each reschedule.
     double GetValue() const
     {
         return aux;
@@ -90,9 +90,9 @@
 }
 
 /**
- * \ingroup stats-tests
+ * @ingroup stats-tests
  *
- * \brief DoubleProbe class - Test case for connecting and receiving data.
+ * @brief DoubleProbe class - Test case for connecting and receiving data.
  */
 class ProbeTestCase1 : public TestCase
 {
@@ -105,9 +105,9 @@
 
     /**
      * Trace sink.
-     * \param context Trace context
-     * \param oldValue Old value
-     * \param newValue New value
+     * @param context Trace context
+     * @param oldValue Old value
+     * @param newValue New value
      */
     void TraceSink(std::string context, double oldValue, double newValue);
     uint32_t m_objectProbed; //!< Number of probes by Object
@@ -163,8 +163,8 @@
     p->SetName("testProbe");
 
     Simulator::Schedule(Seconds(1), &SampleEmitter::Start, m_s);
-    p->SetAttribute("Start", TimeValue(Seconds(100.0)));
-    p->SetAttribute("Stop", TimeValue(Seconds(200.0)));
+    p->SetAttribute("Start", TimeValue(Seconds(100)));
+    p->SetAttribute("Stop", TimeValue(Seconds(200)));
     Simulator::Stop(Seconds(300));
 
     // Register our emitter object so we can fetch it by using the Config
@@ -181,8 +181,8 @@
     // name set above
     Ptr<DoubleProbe> p2 = CreateObject<DoubleProbe>();
     p2->SetName("testProbe2");
-    p2->SetAttribute("Start", TimeValue(Seconds(100.0)));
-    p2->SetAttribute("Stop", TimeValue(Seconds(200.0)));
+    p2->SetAttribute("Start", TimeValue(Seconds(100)));
+    p2->SetAttribute("Stop", TimeValue(Seconds(200)));
 
     // Hook probe to the emitter.
     p2->ConnectByPath("/Names/SampleEmitter/Emitter");
@@ -199,9 +199,9 @@
 }
 
 /**
- * \ingroup stats-tests
+ * @ingroup stats-tests
  *
- * \brief DoubleProbe class TestSuite
+ * @brief DoubleProbe class TestSuite
  */
 class ProbeTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/stats/test/histogram-test-suite.cc ns-3.44/src/stats/test/histogram-test-suite.cc
--- ns-3.43/src/stats/test/histogram-test-suite.cc	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/stats/test/histogram-test-suite.cc	2025-03-09 16:55:49.703372200 -0700
@@ -12,9 +12,9 @@
 using namespace ns3;
 
 /**
- * \ingroup stats-tests
+ * @ingroup stats-tests
  *
- * \brief Histogram Test
+ * @brief Histogram Test
  */
 class HistogramTestCase : public ns3::TestCase
 {
@@ -61,9 +61,9 @@
 }
 
 /**
- * \ingroup stats-tests
+ * @ingroup stats-tests
  *
- * \brief Histogram TestSuite
+ * @brief Histogram TestSuite
  */
 class HistogramTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/tap-bridge/CMakeLists.txt ns-3.44/src/tap-bridge/CMakeLists.txt
--- ns-3.43/src/tap-bridge/CMakeLists.txt	2024-10-09 16:41:10.092656600 -0700
+++ ns-3.44/src/tap-bridge/CMakeLists.txt	2025-03-09 16:55:49.703372200 -0700
@@ -44,3 +44,8 @@
   INSTALL_DIRECTORY_PATH ${CMAKE_INSTALL_LIBEXECDIR}/ns3
   STANDALONE
 )
+
+add_dependencies(
+  tap-bridge
+  tap-creator
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/tap-bridge/doc/tap.h ns-3.44/src/tap-bridge/doc/tap.h
--- ns-3.43/src/tap-bridge/doc/tap.h	2024-10-09 16:41:10.096656600 -0700
+++ ns-3.44/src/tap-bridge/doc/tap.h	2025-03-09 16:55:49.703372200 -0700
@@ -1,5 +1,5 @@
 /**
- * \defgroup tap-bridge Tap Bridge Network Device
+ * @defgroup tap-bridge Tap Bridge Network Device
  *
  * This section documents the API of the ns-3 tap-bridge module. For a
  * generic functional description, please refer to the ns-3 manual.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/tap-bridge/examples/tap-wifi-dumbbell.cc ns-3.44/src/tap-bridge/examples/tap-wifi-dumbbell.cc
--- ns-3.43/src/tap-bridge/examples/tap-wifi-dumbbell.cc	2024-10-09 16:41:10.096656600 -0700
+++ ns-3.44/src/tap-bridge/examples/tap-wifi-dumbbell.cc	2025-03-09 16:55:49.703372200 -0700
@@ -158,7 +158,7 @@
     ipv4Left.SetBase("10.1.1.0", "255.255.255.0");
     Ipv4InterfaceContainer interfacesLeft = ipv4Left.Assign(devicesLeft);
 
-    TapBridgeHelper tapBridge(interfacesLeft.GetAddress(1));
+    TapBridgeHelper tapBridge;
     tapBridge.SetAttribute("Mode", StringValue(mode));
     tapBridge.SetAttribute("DeviceName", StringValue(tapName));
     tapBridge.Install(nodesLeft.Get(0), devicesLeft.Get(0));
@@ -204,13 +204,13 @@
     onoff.SetConstantRate(DataRate("500kb/s"));
 
     ApplicationContainer apps = onoff.Install(nodesLeft.Get(3));
-    apps.Start(Seconds(1.0));
+    apps.Start(Seconds(1));
 
     // Create a packet sink to receive these packets
     PacketSinkHelper sink("ns3::UdpSocketFactory", InetSocketAddress(Ipv4Address::GetAny(), port));
 
     apps = sink.Install(nodesRight.Get(0));
-    apps.Start(Seconds(1.0));
+    apps.Start(Seconds(1));
 
     wifiPhy.EnablePcapAll("tap-wifi-dumbbell");
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/tap-bridge/helper/tap-bridge-helper.cc ns-3.44/src/tap-bridge/helper/tap-bridge-helper.cc
--- ns-3.43/src/tap-bridge/helper/tap-bridge-helper.cc	2024-10-09 16:41:10.096656600 -0700
+++ ns-3.44/src/tap-bridge/helper/tap-bridge-helper.cc	2025-03-09 16:55:49.703372200 -0700
@@ -27,7 +27,6 @@
 {
     NS_LOG_FUNCTION_NOARGS();
     m_deviceFactory.SetTypeId("ns3::TapBridge");
-    SetAttribute("Gateway", Ipv4AddressValue(gateway));
     SetAttribute("Mode", EnumValue(TapBridge::CONFIGURE_LOCAL));
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/tap-bridge/helper/tap-bridge-helper.h ns-3.44/src/tap-bridge/helper/tap-bridge-helper.h
--- ns-3.43/src/tap-bridge/helper/tap-bridge-helper.h	2024-10-09 16:41:10.096656600 -0700
+++ ns-3.44/src/tap-bridge/helper/tap-bridge-helper.h	2025-03-09 16:55:49.703372200 -0700
@@ -20,7 +20,7 @@
 class AttributeValue;
 
 /**
- * \brief build TapBridge to allow ns-3 simulations to interact with Linux
+ * @brief build TapBridge to allow ns-3 simulations to interact with Linux
  * tap devices and processes on the Linux host.
  */
 class TapBridgeHelper
@@ -38,17 +38,18 @@
      * have their simulations interact with Linux tap devices and processes
      * on the Linux host.
      *
-     * \param gateway An Ipv4Address to be used as the default gateway for
+     * @param gateway An Ipv4Address to be used as the default gateway for
      * the created bridges,
      */
+    NS_DEPRECATED_3_44("Use TapBridgeHelper()")
     TapBridgeHelper(Ipv4Address gateway);
 
     /**
      * Set an attribute in the underlying TapBridge net device when these
      * devices are automatically created.
      *
-     * \param n1 the name of the attribute to set
-     * \param v1 the value of the attribute to set
+     * @param n1 the name of the attribute to set
+     * @param v1 the value of the attribute to set
      */
     void SetAttribute(std::string n1, const AttributeValue& v1);
 
@@ -57,9 +58,9 @@
      * bridge with the NetDevice specified.  The Node is specified using
      * a Ptr<Node> and the NetDevice is specified using a Ptr<NetDevice>
      *
-     * \param node The Ptr<Node> to install the TapBridge in
-     * \param nd The Ptr<NetDevice> to attach to the bridge.
-     * \returns A pointer to the new TapBridge NetDevice.
+     * @param node The Ptr<Node> to install the TapBridge in
+     * @param nd The Ptr<NetDevice> to attach to the bridge.
+     * @returns A pointer to the new TapBridge NetDevice.
      */
     Ptr<NetDevice> Install(Ptr<Node> node, Ptr<NetDevice> nd);
 
@@ -69,9 +70,9 @@
      * name string that has previously been associated with the Node using
      * the Object Name Service.  The NetDevice is specified by a Ptr<NetDevice>.
      *
-     * \param nodeName The name of the Node to install the TapBridge in
-     * \param nd The Ptr<NetDevice> to attach to the bridge.
-     * \returns A pointer to the new TapBridge NetDevice.
+     * @param nodeName The name of the Node to install the TapBridge in
+     * @param nd The Ptr<NetDevice> to attach to the bridge.
+     * @returns A pointer to the new TapBridge NetDevice.
      */
     Ptr<NetDevice> Install(std::string nodeName, Ptr<NetDevice> nd);
 
@@ -81,9 +82,9 @@
      * name string that has previously been associated with the NetDevice
      * using the Object Name Service.
      *
-     * \param node The Ptr<Node> to install the TapBridge in
-     * \param ndName The name of the NetDevice to attach to the bridge.
-     * \returns A pointer to the new TapBridge NetDevice.
+     * @param node The Ptr<Node> to install the TapBridge in
+     * @param ndName The name of the NetDevice to attach to the bridge.
+     * @returns A pointer to the new TapBridge NetDevice.
      */
     Ptr<NetDevice> Install(Ptr<Node> node, std::string ndName);
 
@@ -95,9 +96,9 @@
      * string that has previously been associated with the Object Name
      * Service.
      *
-     * \param nodeName The name of the Node to install the TapBridge in
-     * \param ndName The name of the NetDevice to attach to the bridge.
-     * \returns A pointer to the new TapBridge NetDevice.
+     * @param nodeName The name of the Node to install the TapBridge in
+     * @param ndName The name of the NetDevice to attach to the bridge.
+     * @returns A pointer to the new TapBridge NetDevice.
      */
     Ptr<NetDevice> Install(std::string nodeName, std::string ndName);
 
@@ -108,11 +109,11 @@
      * The type of the actual Bridge device is specified with the
      * provided AttributeValue (typically "ns3::TapBridge").
      *
-     * \param node The Ptr<Node> to install the TapBridge in
-     * \param nd The Ptr<NetDevice> to attach to the bridge.
-     * \param bridgeType The TypeId of the bridge that will be automatically
+     * @param node The Ptr<Node> to install the TapBridge in
+     * @param nd The Ptr<NetDevice> to attach to the bridge.
+     * @param bridgeType The TypeId of the bridge that will be automatically
      *                   created.
-     * \returns A pointer to the new TapBridge NetDevice.
+     * @returns A pointer to the new TapBridge NetDevice.
      */
     Ptr<NetDevice> Install(Ptr<Node> node, Ptr<NetDevice> nd, const AttributeValue& bridgeType);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/tap-bridge/model/tap-bridge.cc ns-3.44/src/tap-bridge/model/tap-bridge.cc
--- ns-3.43/src/tap-bridge/model/tap-bridge.cc	2024-10-09 16:41:10.096656600 -0700
+++ ns-3.44/src/tap-bridge/model/tap-bridge.cc	2025-03-09 16:55:49.703372200 -0700
@@ -89,7 +89,8 @@
                           "when in ConfigureLocal mode.",
                           Ipv4AddressValue("255.255.255.255"),
                           MakeIpv4AddressAccessor(&TapBridge::m_tapGateway),
-                          MakeIpv4AddressChecker())
+                          MakeIpv4AddressChecker(),
+                          TypeId::SupportLevel::OBSOLETE)
             .AddAttribute(
                 "IpAddress",
                 "The IP address to assign to the tap device, when in ConfigureLocal mode.  "
@@ -374,7 +375,6 @@
         // quite a bit of information.
         //
         // -d<device-name> The name of the tap device we want to create;
-        // -g<gateway-address> The IP address to use as the default gateway;
         // -i<IP-address> The IP address to assign to the new tap device;
         // -m<MAC-address> The MAC-48 address to assign to the new tap device;
         // -n<network-mask> The network mask to assign to the new tap device;
@@ -440,13 +440,6 @@
         ossDeviceName << "-d" << m_tapDeviceName;
 
         //
-        // The gateway-address is something we can't derive, so we rely on it
-        // being configured via an Attribute through the helper.
-        //
-        std::ostringstream ossGateway;
-        ossGateway << "-g" << m_tapGateway;
-
-        //
         // For flexibility, we do allow a client to override any of the values
         // above via attributes, so only use our found values if the Attribute
         // is not equal to its default value (empty string or broadcast address).
@@ -506,9 +499,9 @@
         ossPath << "-p" << path;
 
         NS_LOG_DEBUG("Executing: " << TAP_CREATOR << " " << ossDeviceName.str() << " "
-                                   << ossGateway.str() << " " << ossIp.str() << " " << ossMac.str()
-                                   << " " << ossNetmask.str() << " " << ossMode.str() << " "
-                                   << ossPath.str() << " " << ossVerbose.str());
+                                   << ossIp.str() << " " << ossMac.str() << " " << ossNetmask.str()
+                                   << " " << ossMode.str() << " " << ossPath.str() << " "
+                                   << ossVerbose.str());
 
         //
         // Execute the socket creation process image.
@@ -516,13 +509,12 @@
         status = ::execlp(TAP_CREATOR,
                           TAP_CREATOR,                 // argv[0] (filename)
                           ossDeviceName.str().c_str(), // argv[1] (-d<device name>)
-                          ossGateway.str().c_str(),    // argv[2] (-g<gateway>)
-                          ossIp.str().c_str(),         // argv[3] (-i<IP address>)
-                          ossMac.str().c_str(),        // argv[4] (-m<MAC address>)
-                          ossNetmask.str().c_str(),    // argv[5] (-n<net mask>)
-                          ossMode.str().c_str(),       // argv[6] (-o<operating mode>)
-                          ossPath.str().c_str(),       // argv[7] (-p<path>)
-                          ossVerbose.str().c_str(),    // argv[8] (-v)
+                          ossIp.str().c_str(),         // argv[2] (-i<IP address>)
+                          ossMac.str().c_str(),        // argv[3] (-m<MAC address>)
+                          ossNetmask.str().c_str(),    // argv[4] (-n<net mask>)
+                          ossMode.str().c_str(),       // argv[5] (-o<operating mode>)
+                          ossPath.str().c_str(),       // argv[6] (-p<path>)
+                          ossVerbose.str().c_str(),    // argv[7] (-v)
                           (char*)nullptr);
 
         //
@@ -720,7 +712,7 @@
     NS_LOG_INFO("TapBridge::ReadCallback(): Received packet on node " << m_nodeId);
     NS_LOG_INFO("TapBridge::ReadCallback(): Scheduling handler");
     Simulator::ScheduleWithContext(m_nodeId,
-                                   Seconds(0.0),
+                                   Seconds(0),
                                    MakeEvent(&TapBridge::ForwardToBridgedDevice, this, buf, len));
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/tap-bridge/model/tap-bridge.h ns-3.44/src/tap-bridge/model/tap-bridge.h
--- ns-3.43/src/tap-bridge/model/tap-bridge.h	2024-10-09 16:41:10.096656600 -0700
+++ ns-3.44/src/tap-bridge/model/tap-bridge.h	2025-03-09 16:55:49.703372200 -0700
@@ -26,7 +26,7 @@
 {
 
 /**
- * \ingroup tap-bridge
+ * @ingroup tap-bridge
  * Class to perform the actual reading from a socket
  */
 class TapBridgeFdReader : public FdReader
@@ -38,9 +38,9 @@
 class Node;
 
 /**
- * \ingroup tap-bridge
+ * @ingroup tap-bridge
  *
- * \brief A bridge to make it appear that a real host process is connected to
+ * @brief A bridge to make it appear that a real host process is connected to
  * an ns-3 net device.
  *
  * The Tap Bridge lives in a kind of a gray world somewhere between a
@@ -98,8 +98,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -119,30 +119,30 @@
     ~TapBridge() override;
 
     /**
-     * \brief Get the bridged net device.
+     * @brief Get the bridged net device.
      *
      * The bridged net device is the ns-3 device to which this bridge is connected,
      *
-     * \returns the bridged net device.
+     * @returns the bridged net device.
      */
     Ptr<NetDevice> GetBridgedNetDevice();
 
     /**
-     * \brief Set the ns-3 net device to bridge.
+     * @brief Set the ns-3 net device to bridge.
      *
      * This method tells the bridge which ns-3 net device it should use to connect
      * the simulation side of the bridge.
      *
-     * \param bridgedDevice device to set
+     * @param bridgedDevice device to set
      *
-     * \attention The ns-3 net device that is being set as the device must have an
+     * @attention The ns-3 net device that is being set as the device must have an
      * an IP address assigned to it before the simulation is run.  This address
      * will be used to set the hardware address of the host Linux device.
      */
     void SetBridgedNetDevice(Ptr<NetDevice> bridgedDevice);
 
     /**
-     * \brief Set a start time for the device.
+     * @brief Set a start time for the device.
      *
      * The tap bridge consumes a non-trivial amount of time to start.  It starts
      * up in the context of a scheduled event to ensure that all configuration
@@ -151,7 +151,7 @@
      * herd of devices, the time at which each device starts is also configurable
      * bot via the Attribute system and via this call.
      *
-     * \param tStart the start time
+     * @param tStart the start time
      */
     void Start(Time tStart);
 
@@ -160,21 +160,21 @@
      *
      * @param tStop the stop time
      *
-     * \see TapBridge::Start
+     * @see TapBridge::Start
      */
     void Stop(Time tStop);
 
     /**
      * Set the operating mode of this device.
      *
-     * \param mode The operating mode of this device.
+     * @param mode The operating mode of this device.
      */
     void SetMode(TapBridge::Mode mode);
 
     /**
      * Get the operating mode of this device.
      *
-     * \returns The operating mode of this device.
+     * @returns The operating mode of this device.
      */
     TapBridge::Mode GetMode();
 
@@ -221,13 +221,13 @@
 
     /**
      * Receives a packet from a bridged Device
-     * \param device the originating port
-     * \param packet the received packet
-     * \param protocol the packet protocol (e.g., Ethertype)
-     * \param src the packet source
-     * \param dst the packet destination
-     * \param packetType the packet type (e.g., host, broadcast, etc.)
-     * \returns true on success
+     * @param device the originating port
+     * @param packet the received packet
+     * @param protocol the packet protocol (e.g., Ethertype)
+     * @param src the packet source
+     * @param dst the packet destination
+     * @param packetType the packet type (e.g., host, broadcast, etc.)
+     * @returns true on success
      */
     bool ReceiveFromBridgedDevice(Ptr<NetDevice> device,
                                   Ptr<const Packet> packet,
@@ -238,11 +238,11 @@
 
     /**
      * Receives a packet from a bridged Device
-     * \param device the originating port
-     * \param packet the received packet
-     * \param protocol the packet protocol (e.g., Ethertype)
-     * \param src the packet source
-     * \returns true on success
+     * @param device the originating port
+     * @param packet the received packet
+     * @param protocol the packet protocol (e.g., Ethertype)
+     * @param src the packet source
+     * @returns true on success
      */
     bool DiscardFromBridgedDevice(Ptr<NetDevice> device,
                                   Ptr<const Packet> packet,
@@ -270,8 +270,8 @@
 
     /**
      * Callback to process packets that are read
-     * \param buf input buffer
-     * \param len input buffer length
+     * @param buf input buffer
+     * @param len input buffer length
      */
     void ReadCallback(uint8_t* buf, ssize_t len);
 
@@ -279,9 +279,9 @@
      * Forward a packet received from the tap device to the bridged ns-3
      * device
      *
-     * \param buf A character buffer containing the actual packet bits that were
+     * @param buf A character buffer containing the actual packet bits that were
      *            received from the host.
-     * \param len The length of the buffer.
+     * @param len The length of the buffer.
      */
     void ForwardToBridgedDevice(uint8_t* buf, ssize_t len);
 
@@ -290,19 +290,19 @@
      * checking on a received packet to make sure it isn't too evil for our
      * poor naive virginal simulator to handle.
      *
-     * \param packet The packet we received from the host, and which we need
+     * @param packet The packet we received from the host, and which we need
      *               to check.
-     * \param src    A pointer to the data structure that will get the source
+     * @param src    A pointer to the data structure that will get the source
      *               MAC address of the packet (extracted from the packet Ethernet
      *               header).
-     * \param dst    A pointer to the data structure that will get the destination
+     * @param dst    A pointer to the data structure that will get the destination
      *               MAC address of the packet (extracted from the packet Ethernet
      *               header).
-     * \param type   A pointer to the variable that will get the packet type from
+     * @param type   A pointer to the variable that will get the packet type from
      *               either the Ethernet header in the case of type interpretation
      *               (DIX framing) or from the 802.2 LLC header in the case of
      *               length interpretation (802.3 framing).
-     * \returns the packet, or null if the packet has been filtered.
+     * @returns the packet, or null if the packet has been filtered.
      */
     Ptr<Packet> Filter(Ptr<Packet> packet, Address* src, Address* dst, uint16_t* type);
 
@@ -401,7 +401,7 @@
     /**
      * The IP address to use as the device default gateway on the host.
      */
-    Ipv4Address m_tapGateway;
+    Ipv4Address m_tapGateway; // NS_DEPRECATED_3_44
 
     /**
      * The IP address to use as the device IP on the host.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/tap-bridge/model/tap-creator.cc ns-3.44/src/tap-bridge/model/tap-creator.cc
--- ns-3.43/src/tap-bridge/model/tap-creator.cc	2024-10-09 16:41:10.096656600 -0700
+++ ns-3.44/src/tap-bridge/model/tap-creator.cc	2025-03-09 16:55:49.703372200 -0700
@@ -189,12 +189,7 @@
 }
 
 static int
-CreateTap(const char* dev,
-          const char* gw,
-          const char* ip,
-          const char* mac,
-          const char* mode,
-          const char* netmask)
+CreateTap(const char* dev, const char* ip, const char* mac, const char* mode, const char* netmask)
 {
     //
     // Creation and management of Tap devices is done via the tun device
@@ -275,7 +270,6 @@
 {
     int c;
     char* dev = (char*)"";
-    char* gw = nullptr;
     char* ip = nullptr;
     char* mac = nullptr;
     char* netmask = nullptr;
@@ -284,16 +278,13 @@
 
     opterr = 0;
 
-    while ((c = getopt(argc, argv, "vd:g:i:m:n:o:p:")) != -1)
+    while ((c = getopt(argc, argv, "vd:i:m:n:o:p:")) != -1)
     {
         switch (c)
         {
         case 'd':
             dev = optarg; // name of the new tap device
             break;
-        case 'g':
-            gw = optarg; // gateway address for the new device
-            break;
         case 'i':
             ip = optarg; // ip address of the new device
             break;
@@ -324,14 +315,6 @@
     LOG("Provided Device Name is \"" << dev << "\"");
 
     //
-    // We have got to be able to provide a gateway to the external Linux host
-    // so it can talk to the ns-3 network.  This ip address is provided in
-    // gw.
-    //
-    ABORT_IF(gw == nullptr, "Gateway Address is a required argument", 0);
-    LOG("Provided Gateway Address is \"" << gw << "\"");
-
-    //
     // We have got to be able to assign an IP address to the tap device we are
     // allocating.  This address is allocated in the simulation and assigned to
     // the tap bridge.  This address is given in ip.
@@ -385,7 +368,7 @@
     // us to execute the following code:
     //
     LOG("Creating Tap");
-    int sock = CreateTap(dev, gw, ip, mac, operatingMode, netmask);
+    int sock = CreateTap(dev, ip, mac, operatingMode, netmask);
     ABORT_IF(sock == -1, "main(): Unable to create tap socket", 1);
 
     //
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/tap-bridge/model/tap-encode-decode.cc ns-3.44/src/tap-bridge/model/tap-encode-decode.cc
--- ns-3.43/src/tap-bridge/model/tap-encode-decode.cc	2024-10-09 16:41:10.096656600 -0700
+++ ns-3.44/src/tap-bridge/model/tap-encode-decode.cc	2025-03-09 16:55:49.703372200 -0700
@@ -14,13 +14,13 @@
 {
 
 /**
- * \brief Convert a byte buffer to a string containing a hex representation
+ * @brief Convert a byte buffer to a string containing a hex representation
  * of the buffer.  Make the string pretty by adding a colon (':') between
  * the hex.
  *
- * \param buffer The input buffer to be converted.
- * \param len The length of the input buffer.
- * \returns A string containing a hex representation of the data in buffer.
+ * @param buffer The input buffer to be converted.
+ * @param len The length of the input buffer.
+ * @returns A string containing a hex representation of the data in buffer.
  */
 std::string
 TapBufferToString(uint8_t* buffer, uint32_t len)
@@ -44,13 +44,13 @@
 }
 
 /**
- * \brief Convert string encoded by the inverse function (TapBufferToString)
+ * @brief Convert string encoded by the inverse function (TapBufferToString)
  * back into a byte buffer.
  *
- * \param s The input string.
- * \param buffer The buffer to initialize with the converted bits.
- * \param len The length of the data that is valid in the buffer.
- * \returns True indicates a successful conversion.
+ * @param s The input string.
+ * @param buffer The buffer to initialize with the converted bits.
+ * @param len The length of the data that is valid in the buffer.
+ * @returns True indicates a successful conversion.
  */
 bool
 TapStringToBuffer(std::string s, uint8_t* buffer, uint32_t* len)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/test/csma-system-test-suite.cc ns-3.44/src/test/csma-system-test-suite.cc
--- ns-3.43/src/test/csma-system-test-suite.cc	2024-10-09 16:41:10.096656600 -0700
+++ ns-3.44/src/test/csma-system-test-suite.cc	2025-03-09 16:55:49.703372200 -0700
@@ -40,9 +40,9 @@
 using namespace ns3;
 
 /**
- * \ingroup system-tests-csma
+ * @ingroup system-tests-csma
  *
- * \brief CSMA Bridge mode test.
+ * @brief CSMA Bridge mode test.
  */
 class CsmaBridgeTestCase : public TestCase
 {
@@ -55,8 +55,8 @@
 
     /**
      * Sink called when a packet is received.
-     * \param p Received packet (unused).
-     * \param ad Sender's address (uused).
+     * @param p Received packet (unused).
+     * @param ad Sender's address (uused).
      */
     void SinkRx(Ptr<const Packet> p, const Address& ad);
     uint32_t m_count; //!< Counter of received packets.
@@ -137,13 +137,13 @@
     onoff.SetConstantRate(DataRate(5000));
 
     ApplicationContainer app = onoff.Install(terminals.Get(0));
-    app.Start(Seconds(1.0));
-    app.Stop(Seconds(10.0));
+    app.Start(Seconds(1));
+    app.Stop(Seconds(10));
 
     PacketSinkHelper sink("ns3::UdpSocketFactory",
                           Address(InetSocketAddress(Ipv4Address::GetAny(), port)));
     app = sink.Install(terminals.Get(1));
-    app.Start(Seconds(0.0));
+    app.Start(Seconds(0));
 
     // Trace receptions
     Config::ConnectWithoutContext("/NodeList/1/ApplicationList/0/$ns3::PacketSink/Rx",
@@ -157,9 +157,9 @@
 }
 
 /**
- * \ingroup system-tests-csma
+ * @ingroup system-tests-csma
  *
- * \brief CSMA Broadcast mode test.
+ * @brief CSMA Broadcast mode test.
  */
 class CsmaBroadcastTestCase : public TestCase
 {
@@ -172,8 +172,8 @@
 
     /**
      * Sink called when a packet is received by a node.
-     * \param p Received packet (unused).
-     * \param ad Sender's address (uused).
+     * @param p Received packet (unused).
+     * @param ad Sender's address (uused).
      * @{
      */
     void SinkRxNode1(Ptr<const Packet> p, const Address& ad);
@@ -182,7 +182,7 @@
 
     /**
      * Sink called when a packet is dropped.
-     * \param p Received packet (unused).
+     * @param p Received packet (unused).
      */
     void DropEvent(Ptr<const Packet> p);
 
@@ -274,16 +274,16 @@
 
     ApplicationContainer app = onoff.Install(c0.Get(0));
     // Start the application
-    app.Start(Seconds(1.0));
-    app.Stop(Seconds(10.0));
+    app.Start(Seconds(1));
+    app.Stop(Seconds(10));
 
     // Create an optional packet sink to receive these packets
     PacketSinkHelper sink("ns3::UdpSocketFactory",
                           Address(InetSocketAddress(Ipv4Address::GetAny(), port)));
     app = sink.Install(c0.Get(1));
     app.Add(sink.Install(c1.Get(1)));
-    app.Start(Seconds(1.0));
-    app.Stop(Seconds(10.0));
+    app.Start(Seconds(1));
+    app.Stop(Seconds(10));
 
     // Trace receptions
     Config::ConnectWithoutContext("/NodeList/1/ApplicationList/0/$ns3::PacketSink/Rx",
@@ -300,9 +300,9 @@
 }
 
 /**
- * \ingroup system-tests-csma
+ * @ingroup system-tests-csma
  *
- * \brief CSMA Multicast mode test.
+ * @brief CSMA Multicast mode test.
  */
 class CsmaMulticastTestCase : public TestCase
 {
@@ -315,14 +315,14 @@
 
     /**
      * Sink called when a packet is received by a node.
-     * \param p Received packet (unused).
-     * \param ad Sender's address (uused).
+     * @param p Received packet (unused).
+     * @param ad Sender's address (uused).
      */
     void SinkRx(Ptr<const Packet> p, const Address& ad);
 
     /**
      * Sink called when a packet is dropped.
-     * \param p Received packet (unused).
+     * @param p Received packet (unused).
      */
     void DropEvent(Ptr<const Packet> p);
 
@@ -465,8 +465,8 @@
 
     ApplicationContainer sinkC = sink.Install(c1.Get(2)); // Node n4
     // Start the sink
-    sinkC.Start(Seconds(1.0));
-    sinkC.Stop(Seconds(10.0));
+    sinkC.Start(Seconds(1));
+    sinkC.Stop(Seconds(10));
 
     // Trace receptions
     Config::ConnectWithoutContext("/NodeList/4/ApplicationList/0/$ns3::PacketSink/Rx",
@@ -483,9 +483,9 @@
 }
 
 /**
- * \ingroup system-tests-csma
+ * @ingroup system-tests-csma
  *
- * \brief CSMA One Subnet mode test.
+ * @brief CSMA One Subnet mode test.
  */
 class CsmaOneSubnetTestCase : public TestCase
 {
@@ -498,8 +498,8 @@
 
     /**
      * Sink called when a packet is received by a node.
-     * \param p Received packet (unused).
-     * \param ad Sender's address (uused).
+     * @param p Received packet (unused).
+     * @param ad Sender's address (uused).
      * @{
      */
     void SinkRxNode0(Ptr<const Packet> p, const Address& ad);
@@ -508,7 +508,7 @@
 
     /**
      * Sink called when a packet is dropped.
-     * \param p Received packet (unused).
+     * @param p Received packet (unused).
      */
     void DropEvent(Ptr<const Packet> p);
     uint32_t m_countNode0; //!< Counter of received packets on node 0.
@@ -595,14 +595,14 @@
 
     ApplicationContainer app = onoff.Install(nodes.Get(0));
     // Start the application
-    app.Start(Seconds(1.0));
-    app.Stop(Seconds(10.0));
+    app.Start(Seconds(1));
+    app.Stop(Seconds(10));
 
     // Create an optional packet sink to receive these packets
     PacketSinkHelper sink("ns3::UdpSocketFactory",
                           Address(InetSocketAddress(Ipv4Address::GetAny(), port)));
     app = sink.Install(nodes.Get(1));
-    app.Start(Seconds(0.0));
+    app.Start(Seconds(0));
 
     //
     // Create a similar flow from n3 to n0, starting at time 1.1 seconds
@@ -610,10 +610,10 @@
     onoff.SetAttribute("Remote", AddressValue(InetSocketAddress(interfaces.GetAddress(0), port)));
     app = onoff.Install(nodes.Get(3));
     app.Start(Seconds(1.1));
-    app.Stop(Seconds(10.0));
+    app.Stop(Seconds(10));
 
     app = sink.Install(nodes.Get(0));
-    app.Start(Seconds(0.0));
+    app.Start(Seconds(0));
 
     // Trace receptions
     Config::ConnectWithoutContext("/NodeList/0/ApplicationList/1/$ns3::PacketSink/Rx",
@@ -633,9 +633,9 @@
 }
 
 /**
- * \ingroup system-tests-csma
+ * @ingroup system-tests-csma
  *
- * \brief CSMA PacketSocket test.
+ * @brief CSMA PacketSocket test.
  */
 class CsmaPacketSocketTestCase : public TestCase
 {
@@ -647,15 +647,15 @@
     void DoRun() override;
     /**
      * Sink called when a packet is received by a node.
-     * \param path Sink path.
-     * \param p Received packet (unused).
-     * \param ad Sender's address (uused).
+     * @param path Sink path.
+     * @param p Received packet (unused).
+     * @param ad Sender's address (uused).
      */
     void SinkRx(std::string path, Ptr<const Packet> p, const Address& ad);
 
     /**
      * Sink called when a packet is dropped.
-     * \param p Received packet (unused).
+     * @param p Received packet (unused).
      */
     void DropEvent(Ptr<const Packet> p);
 
@@ -731,21 +731,21 @@
     OnOffHelper onoff("ns3::PacketSocketFactory", Address(socket));
     onoff.SetConstantRate(DataRate(5000));
     ApplicationContainer apps = onoff.Install(nodes.Get(0));
-    apps.Start(Seconds(1.0));
-    apps.Stop(Seconds(10.0));
+    apps.Start(Seconds(1));
+    apps.Stop(Seconds(10));
 
     socket.SetSingleDevice(devs.Get(3)->GetIfIndex());
     socket.SetPhysicalAddress(devs.Get(0)->GetAddress());
     socket.SetProtocol(3);
     onoff.SetAttribute("Remote", AddressValue(socket));
     apps = onoff.Install(nodes.Get(3));
-    apps.Start(Seconds(1.0));
-    apps.Stop(Seconds(10.0));
+    apps.Start(Seconds(1));
+    apps.Stop(Seconds(10));
 
     PacketSinkHelper sink = PacketSinkHelper("ns3::PacketSocketFactory", socket);
     apps = sink.Install(nodes.Get(0));
-    apps.Start(Seconds(0.0));
-    apps.Stop(Seconds(20.0));
+    apps.Start(Seconds(0));
+    apps.Stop(Seconds(20));
 
     // Trace receptions
     Config::Connect("/NodeList/0/ApplicationList/*/$ns3::PacketSink/Rx",
@@ -759,9 +759,9 @@
 }
 
 /**
- * \ingroup system-tests-csma
+ * @ingroup system-tests-csma
  *
- * \brief CSMA PING test.
+ * @brief CSMA PING test.
  */
 class CsmaPingTestCase : public TestCase
 {
@@ -864,13 +864,13 @@
     onoff.SetConstantRate(DataRate(5000));
 
     ApplicationContainer apps = onoff.Install(c.Get(0));
-    apps.Start(Seconds(1.0));
-    apps.Stop(Seconds(10.0));
+    apps.Start(Seconds(1));
+    apps.Stop(Seconds(10));
 
     PacketSinkHelper sink = PacketSinkHelper("ns3::Ipv4RawSocketFactory", dst);
     apps = sink.Install(c.Get(3));
-    apps.Start(Seconds(0.0));
-    apps.Stop(Seconds(11.0));
+    apps.Start(Seconds(0));
+    apps.Stop(Seconds(11));
 
     PingHelper ping(addresses.GetAddress(2));
     NodeContainer pingers;
@@ -878,8 +878,8 @@
     pingers.Add(c.Get(1));
     pingers.Add(c.Get(3));
     apps = ping.Install(pingers);
-    apps.Start(Seconds(2.0));
-    apps.Stop(Seconds(5.0));
+    apps.Start(Seconds(2));
+    apps.Stop(Seconds(5));
 
     // Trace receptions
     Config::ConnectWithoutContext("/NodeList/3/ApplicationList/0/$ns3::PacketSink/Rx",
@@ -900,9 +900,9 @@
 }
 
 /**
- * \ingroup system-tests-csma
+ * @ingroup system-tests-csma
  *
- * \brief CSMA Raw IP test.
+ * @brief CSMA Raw IP test.
  */
 class CsmaRawIpSocketTestCase : public TestCase
 {
@@ -915,14 +915,14 @@
 
     /**
      * Sink called when a packet is received by a node.
-     * \param p Received packet (unused).
-     * \param ad Sender's address (uused).
+     * @param p Received packet (unused).
+     * @param ad Sender's address (uused).
      */
     void SinkRx(Ptr<const Packet> p, const Address& ad);
 
     /**
      * Sink called when a packet is dropped.
-     * \param p Received packet (unused).
+     * @param p Received packet (unused).
      */
     void DropEvent(Ptr<const Packet> p);
 
@@ -998,13 +998,13 @@
     onoff.SetConstantRate(DataRate(5000));
 
     ApplicationContainer apps = onoff.Install(c.Get(0));
-    apps.Start(Seconds(1.0));
-    apps.Stop(Seconds(10.0));
+    apps.Start(Seconds(1));
+    apps.Stop(Seconds(10));
 
     PacketSinkHelper sink = PacketSinkHelper("ns3::Ipv4RawSocketFactory", dst);
     apps = sink.Install(c.Get(3));
-    apps.Start(Seconds(0.0));
-    apps.Stop(Seconds(12.0));
+    apps.Start(Seconds(0));
+    apps.Stop(Seconds(12));
 
     // Trace receptions
     Config::ConnectWithoutContext("/NodeList/3/ApplicationList/0/$ns3::PacketSink/Rx",
@@ -1018,9 +1018,9 @@
 }
 
 /**
- * \ingroup system-tests-csma
+ * @ingroup system-tests-csma
  *
- * \brief CSMA star mode test.
+ * @brief CSMA star mode test.
  */
 class CsmaStarTestCase : public TestCase
 {
@@ -1033,14 +1033,14 @@
 
     /**
      * Sink called when a packet is received by a node.
-     * \param p Received packet (unused).
-     * \param ad Sender's address (uused).
+     * @param p Received packet (unused).
+     * @param ad Sender's address (uused).
      */
     void SinkRx(Ptr<const Packet> p, const Address& ad);
 
     /**
      * Sink called when a packet is dropped.
-     * \param p Received packet (unused).
+     * @param p Received packet (unused).
      */
     void DropEvent(Ptr<const Packet> p);
 
@@ -1158,8 +1158,8 @@
     Address hubLocalAddress(InetSocketAddress(Ipv4Address::GetAny(), port));
     PacketSinkHelper packetSinkHelper("ns3::TcpSocketFactory", hubLocalAddress);
     ApplicationContainer hubApp = packetSinkHelper.Install(star.GetHub());
-    hubApp.Start(Seconds(1.0));
-    hubApp.Stop(Seconds(10.0));
+    hubApp.Start(Seconds(1));
+    hubApp.Stop(Seconds(10));
 
     //
     // Create OnOff applications to send TCP to the hub, one on each spoke node.
@@ -1178,8 +1178,8 @@
         spokeApps.Add(onOffHelper.Install(star.GetSpokeNode(i)));
     }
 
-    spokeApps.Start(Seconds(1.0));
-    spokeApps.Stop(Seconds(10.0));
+    spokeApps.Start(Seconds(1));
+    spokeApps.Stop(Seconds(10));
 
     //
     // Because we are evil, we also add OnOff applications to send TCP to the hub
@@ -1198,8 +1198,8 @@
         fillApps.Add(onOffHelper.Install(fillNodes.Get(i)));
     }
 
-    fillApps.Start(Seconds(1.0));
-    fillApps.Stop(Seconds(10.0));
+    fillApps.Start(Seconds(1));
+    fillApps.Stop(Seconds(10));
 
     //
     // Turn on global static routing so we can actually be routed across the star.
@@ -1221,9 +1221,9 @@
 }
 
 /**
- * \ingroup system-tests-csma
+ * @ingroup system-tests-csma
  *
- * \brief CSMA TestSuite.
+ * @brief CSMA TestSuite.
  */
 class CsmaSystemTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/test/doc/tests.h ns-3.44/src/test/doc/tests.h
--- ns-3.43/src/test/doc/tests.h	2024-10-09 16:41:10.096656600 -0700
+++ ns-3.44/src/test/doc/tests.h	2025-03-09 16:55:49.703372200 -0700
@@ -3,16 +3,16 @@
  */
 
 /**
- * \file
- * \ingroup tests
+ * @file
+ * @ingroup tests
  * This file provides some doxygen documentation for the tests module.
  */
 
 /**
- * \ingroup tests
- * \defgroup system-tests System Tests
+ * @ingroup tests
+ * @defgroup system-tests System Tests
  *
- * \brief The "tests" module contains the System Tests, i.e., tests that
+ * @brief The "tests" module contains the System Tests, i.e., tests that
  * dependss on multiple modules. Due to their dependencies, the System Tests
  * are in this module.
  *
@@ -20,34 +20,34 @@
  */
 
 /**
- * \ingroup system-tests
- * \ingroup traffic-control-test
- * \defgroup system-tests-tc TrafficControl System Tests
+ * @ingroup system-tests
+ * @ingroup traffic-control-test
+ * @defgroup system-tests-tc TrafficControl System Tests
  *
- * \brief TrafficControl System Tests
+ * @brief TrafficControl System Tests
  */
 
 /**
- * \ingroup system-tests
- * \ingroup internet-test
- * \defgroup system-tests-tcp TCP System Tests
+ * @ingroup system-tests
+ * @ingroup internet-test
+ * @defgroup system-tests-tcp TCP System Tests
  *
- * \brief TCP System Tests
+ * @brief TCP System Tests
  */
 
 /**
- * \ingroup system-tests
- * \ingroup wifi-test
- * \defgroup system-tests-wifi WiFi System Tests
+ * @ingroup system-tests
+ * @ingroup wifi-test
+ * @defgroup system-tests-wifi WiFi System Tests
  *
- * \brief WiFi System Tests
+ * @brief WiFi System Tests
  */
 
 /**
- * \ingroup system-tests
- * \defgroup system-tests-perf Performance System Tests
+ * @ingroup system-tests
+ * @defgroup system-tests-perf Performance System Tests
  *
- * \brief Performance System Tests
+ * @brief Performance System Tests
  *
  * Note: these tests are (for real) scripts to be run.
  * The output is the time (in nanoseconds) that the test
@@ -55,17 +55,17 @@
  */
 
 /**
- * \ingroup system-tests
- * \ingroup core-tests
- * \defgroup system-tests-traced TracedCallback System Tests
+ * @ingroup system-tests
+ * @ingroup core-tests
+ * @defgroup system-tests-traced TracedCallback System Tests
  *
- * \brief TracedCallback System Tests
+ * @brief TracedCallback System Tests
  */
 
 /**
- * \ingroup system-tests
- * \ingroup csma
- * \defgroup system-tests-csma CSMA System Tests
+ * @ingroup system-tests
+ * @ingroup csma
+ * @defgroup system-tests-csma CSMA System Tests
  *
- * \brief CSMA System Tests
+ * @brief CSMA System Tests
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/test/ns3tc/fq-cobalt-queue-disc-test-suite.cc ns-3.44/src/test/ns3tc/fq-cobalt-queue-disc-test-suite.cc
--- ns-3.43/src/test/ns3tc/fq-cobalt-queue-disc-test-suite.cc	2024-10-09 16:41:10.096656600 -0700
+++ ns-3.44/src/test/ns3tc/fq-cobalt-queue-disc-test-suite.cc	2025-03-09 16:55:49.703372200 -0700
@@ -31,7 +31,7 @@
 static int32_t g_hash;
 
 /**
- * \ingroup system-tests-tc
+ * @ingroup system-tests-tc
  *
  * Simple test packet filter able to classify IPv4 packets.
  */
@@ -39,8 +39,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -50,15 +50,15 @@
   private:
     /**
      * Classify a QueueDiscItem
-     * \param item The item to classify (unused).
-     * \return a pre-set hash value.
+     * @param item The item to classify (unused).
+     * @return a pre-set hash value.
      */
     int32_t DoClassify(Ptr<QueueDiscItem> item) const override;
 
     /**
      * Check the protocol.
-     * \param item The item to check (unused).
-     * \return true.
+     * @param item The item to check (unused).
+     * @return true.
      */
     bool CheckProtocol(Ptr<QueueDiscItem> item) const override;
 };
@@ -94,7 +94,7 @@
 }
 
 /**
- * \ingroup system-tests-tc
+ * @ingroup system-tests-tc
  *
  * This class tests packets for which there is no suitable filter.
  */
@@ -152,7 +152,7 @@
 }
 
 /**
- * \ingroup system-tests-tc
+ * @ingroup system-tests-tc
  *
  * This class tests the IP flows separation and the packet limit.
  */
@@ -166,8 +166,8 @@
     void DoRun() override;
     /**
      * Enqueue a packet.
-     * \param queue The queue disc.
-     * \param hdr The IPv4 header.
+     * @param queue The queue disc.
+     * @param hdr The IPv4 header.
      */
     void AddPacket(Ptr<FqCobaltQueueDisc> queue, Ipv4Header hdr);
 };
@@ -248,7 +248,7 @@
 }
 
 /**
- * \ingroup system-tests-tc
+ * @ingroup system-tests-tc
  *
  * This class tests the deficit per flow.
  */
@@ -262,8 +262,8 @@
     void DoRun() override;
     /**
      * Enqueue a packet.
-     * \param queue The queue disc.
-     * \param hdr The IPv4 header.
+     * @param queue The queue disc.
+     * @param hdr The IPv4 header.
      */
     void AddPacket(Ptr<FqCobaltQueueDisc> queue, Ipv4Header hdr);
 };
@@ -474,7 +474,7 @@
 }
 
 /**
- * \ingroup system-tests-tc
+ * @ingroup system-tests-tc
  *
  * This class tests the TCP flows separation.
  */
@@ -488,9 +488,9 @@
     void DoRun() override;
     /**
      * Enqueue a packet.
-     * \param queue The queue disc.
-     * \param ipHdr The IPv4 header.
-     * \param tcpHdr The TCP header.
+     * @param queue The queue disc.
+     * @param ipHdr The IPv4 header.
+     * @param tcpHdr The TCP header.
      */
     void AddPacket(Ptr<FqCobaltQueueDisc> queue, Ipv4Header ipHdr, TcpHeader tcpHdr);
 };
@@ -599,7 +599,7 @@
 }
 
 /**
- * \ingroup system-tests-tc
+ * @ingroup system-tests-tc
  *
  * This class tests the UDP flows separation
  */
@@ -613,9 +613,9 @@
     void DoRun() override;
     /**
      * Enqueue a packet.
-     * \param queue the queue disc
-     * \param ipHdr the IPv4 header
-     * \param udpHdr the UDP header
+     * @param queue the queue disc
+     * @param ipHdr the IPv4 header
+     * @param udpHdr the UDP header
      */
     void AddPacket(Ptr<FqCobaltQueueDisc> queue, Ipv4Header ipHdr, UdpHeader udpHdr);
 };
@@ -724,9 +724,9 @@
 }
 
 /**
- * \ingroup system-tests-tc
+ * @ingroup system-tests-tc
  *
- * \brief This class tests ECN marking.
+ * @brief This class tests ECN marking.
  *
  * The test is divided into 3 sub test cases.
  * 1) CE threshold disabled
@@ -753,11 +753,11 @@
     void DoRun() override;
     /**
      * Enqueue the given number of packets.
-     * \param queue The queue disc.
-     * \param hdr The IPv4 header.
-     * \param nPkt The number of packets.
-     * \param nPktEnqueued The expected number of enqueued packets.
-     * \param nQueueFlows The expected number of flow queues.
+     * @param queue The queue disc.
+     * @param hdr The IPv4 header.
+     * @param nPkt The number of packets.
+     * @param nPktEnqueued The expected number of enqueued packets.
+     * @param nQueueFlows The expected number of flow queues.
      */
     void AddPacket(Ptr<FqCobaltQueueDisc> queue,
                    Ipv4Header hdr,
@@ -766,21 +766,21 @@
                    uint32_t nQueueFlows);
     /**
      * Dequeue the given number of packets.
-     * \param queue The queue disc.
-     * \param nPkt The number of packets.
+     * @param queue The queue disc.
+     * @param nPkt The number of packets.
      */
     void Dequeue(Ptr<FqCobaltQueueDisc> queue, uint32_t nPkt);
     /**
      * Dequeue the given number of packets at different times.
-     * \param queue The queue disc.
-     * \param delay The time between two consecutive dequeue operations.
-     * \param nPkt The number of packets.
+     * @param queue The queue disc.
+     * @param delay The time between two consecutive dequeue operations.
+     * @param nPkt The number of packets.
      */
     void DequeueWithDelay(Ptr<FqCobaltQueueDisc> queue, double delay, uint32_t nPkt);
     /**
      * Tracer for the DropNext attribute
-     * \param oldVal Old value.
-     * \param newVal New value.
+     * @param oldVal Old value.
+     * @param newVal New value.
      */
     void DropNextTracer(int64_t oldVal, int64_t newVal);
     uint32_t m_dropNextCount; ///< count the number of times m_dropNext is recalculated
@@ -845,7 +845,7 @@
 {
     for (uint32_t i = 0; i < nPkt; i++)
     {
-        Simulator::Schedule(Time(Seconds((i + 1) * delay)),
+        Simulator::Schedule(Seconds((i + 1) * delay),
                             &FqCobaltQueueDiscEcnMarking::Dequeue,
                             this,
                             queue,
@@ -888,7 +888,7 @@
     hdr.SetEcn(Ipv4Header::ECN_ECT0);
 
     // Add 20 ECT0 (ECN capable) packets from the first flow
-    Simulator::Schedule(Time(Seconds(0)),
+    Simulator::Schedule(Seconds(0),
                         &FqCobaltQueueDiscEcnMarking::AddPacket,
                         this,
                         queueDisc,
@@ -899,7 +899,7 @@
 
     // Add 20 ECT0 (ECN capable) packets from second flow
     hdr.SetDestination(Ipv4Address("10.10.1.10"));
-    Simulator::Schedule(Time(Seconds(0)),
+    Simulator::Schedule(Seconds(0),
                         &FqCobaltQueueDiscEcnMarking::AddPacket,
                         this,
                         queueDisc,
@@ -910,7 +910,7 @@
 
     // Add 20 ECT0 (ECN capable) packets from third flow
     hdr.SetDestination(Ipv4Address("10.10.1.20"));
-    Simulator::Schedule(Time(Seconds(0)),
+    Simulator::Schedule(Seconds(0),
                         &FqCobaltQueueDiscEcnMarking::AddPacket,
                         this,
                         queueDisc,
@@ -922,7 +922,7 @@
     // Add 20 NotECT packets from fourth flow
     hdr.SetDestination(Ipv4Address("10.10.1.30"));
     hdr.SetEcn(Ipv4Header::ECN_NotECT);
-    Simulator::Schedule(Time(Seconds(0)),
+    Simulator::Schedule(Seconds(0),
                         &FqCobaltQueueDiscEcnMarking::AddPacket,
                         this,
                         queueDisc,
@@ -933,7 +933,7 @@
 
     // Add 20 NotECT packets from fifth flow
     hdr.SetDestination(Ipv4Address("10.10.1.40"));
-    Simulator::Schedule(Time(Seconds(0)),
+    Simulator::Schedule(Seconds(0),
                         &FqCobaltQueueDiscEcnMarking::AddPacket,
                         this,
                         queueDisc,
@@ -946,7 +946,7 @@
     // each queue
     DequeueWithDelay(queueDisc, 0.11, 60);
     Simulator::Run();
-    Simulator::Stop(Seconds(8.0));
+    Simulator::Stop(Seconds(8));
     Ptr<CobaltQueueDisc> q0 =
         queueDisc->GetQueueDiscClass(0)->GetQueueDisc()->GetObject<CobaltQueueDisc>();
     Ptr<CobaltQueueDisc> q1 =
@@ -1020,7 +1020,7 @@
     // Add 20 ECT0 (ECN capable) packets from first flow
     hdr.SetDestination(Ipv4Address("10.10.1.2"));
     hdr.SetEcn(Ipv4Header::ECN_ECT0);
-    Simulator::Schedule(Time(Seconds(0)),
+    Simulator::Schedule(Seconds(0),
                         &FqCobaltQueueDiscEcnMarking::AddPacket,
                         this,
                         queueDisc,
@@ -1031,7 +1031,7 @@
 
     // Add 20 ECT0 (ECN capable) packets from second flow
     hdr.SetDestination(Ipv4Address("10.10.1.10"));
-    Simulator::Schedule(Time(Seconds(0)),
+    Simulator::Schedule(Seconds(0),
                         &FqCobaltQueueDiscEcnMarking::AddPacket,
                         this,
                         queueDisc,
@@ -1042,7 +1042,7 @@
 
     // Add 20 ECT0 (ECN capable) packets from third flow
     hdr.SetDestination(Ipv4Address("10.10.1.20"));
-    Simulator::Schedule(Time(Seconds(0)),
+    Simulator::Schedule(Seconds(0),
                         &FqCobaltQueueDiscEcnMarking::AddPacket,
                         this,
                         queueDisc,
@@ -1054,7 +1054,7 @@
     // Add 20 NotECT packets from fourth flow
     hdr.SetDestination(Ipv4Address("10.10.1.30"));
     hdr.SetEcn(Ipv4Header::ECN_NotECT);
-    Simulator::Schedule(Time(Seconds(0)),
+    Simulator::Schedule(Seconds(0),
                         &FqCobaltQueueDiscEcnMarking::AddPacket,
                         this,
                         queueDisc,
@@ -1065,7 +1065,7 @@
 
     // Add 20 NotECT packets from fifth flow
     hdr.SetDestination(Ipv4Address("10.10.1.40"));
-    Simulator::Schedule(Time(Seconds(0)),
+    Simulator::Schedule(Seconds(0),
                         &FqCobaltQueueDiscEcnMarking::AddPacket,
                         this,
                         queueDisc,
@@ -1078,7 +1078,7 @@
     // each queue
     DequeueWithDelay(queueDisc, 0.0001, 60);
     Simulator::Run();
-    Simulator::Stop(Seconds(8.0));
+    Simulator::Stop(Seconds(8));
     q0 = queueDisc->GetQueueDiscClass(0)->GetQueueDisc()->GetObject<CobaltQueueDisc>();
     q1 = queueDisc->GetQueueDiscClass(1)->GetQueueDisc()->GetObject<CobaltQueueDisc>();
     q2 = queueDisc->GetQueueDiscClass(2)->GetQueueDisc()->GetObject<CobaltQueueDisc>();
@@ -1155,7 +1155,7 @@
     // Add 20 ECT0 (ECN capable) packets from first flow
     hdr.SetDestination(Ipv4Address("10.10.1.2"));
     hdr.SetEcn(Ipv4Header::ECN_ECT0);
-    Simulator::Schedule(Time(Seconds(0)),
+    Simulator::Schedule(Seconds(0),
                         &FqCobaltQueueDiscEcnMarking::AddPacket,
                         this,
                         queueDisc,
@@ -1166,7 +1166,7 @@
 
     // Add 20 ECT0 (ECN capable) packets from second flow
     hdr.SetDestination(Ipv4Address("10.10.1.10"));
-    Simulator::Schedule(Time(Seconds(0)),
+    Simulator::Schedule(Seconds(0),
                         &FqCobaltQueueDiscEcnMarking::AddPacket,
                         this,
                         queueDisc,
@@ -1177,7 +1177,7 @@
 
     // Add 20 ECT0 (ECN capable) packets from third flow
     hdr.SetDestination(Ipv4Address("10.10.1.20"));
-    Simulator::Schedule(Time(Seconds(0)),
+    Simulator::Schedule(Seconds(0),
                         &FqCobaltQueueDiscEcnMarking::AddPacket,
                         this,
                         queueDisc,
@@ -1189,7 +1189,7 @@
     // Add 20 NotECT packets from fourth flow
     hdr.SetDestination(Ipv4Address("10.10.1.30"));
     hdr.SetEcn(Ipv4Header::ECN_NotECT);
-    Simulator::Schedule(Time(Seconds(0)),
+    Simulator::Schedule(Seconds(0),
                         &FqCobaltQueueDiscEcnMarking::AddPacket,
                         this,
                         queueDisc,
@@ -1200,7 +1200,7 @@
 
     // Add 20 NotECT packets from fifth flow
     hdr.SetDestination(Ipv4Address("10.10.1.40"));
-    Simulator::Schedule(Time(Seconds(0)),
+    Simulator::Schedule(Seconds(0),
                         &FqCobaltQueueDiscEcnMarking::AddPacket,
                         this,
                         queueDisc,
@@ -1216,7 +1216,7 @@
     // each queue
     DequeueWithDelay(queueDisc, 0.110, 60);
     Simulator::Run();
-    Simulator::Stop(Seconds(8.0));
+    Simulator::Stop(Seconds(8));
     q0 = queueDisc->GetQueueDiscClass(0)->GetQueueDisc()->GetObject<CobaltQueueDisc>();
     q1 = queueDisc->GetQueueDiscClass(1)->GetQueueDisc()->GetObject<CobaltQueueDisc>();
     q2 = queueDisc->GetQueueDiscClass(2)->GetQueueDisc()->GetObject<CobaltQueueDisc>();
@@ -1277,9 +1277,9 @@
 }
 
 /**
- * \ingroup system-tests-tc
+ * @ingroup system-tests-tc
  *
- * \brief This class tests linear probing, collision response, and set
+ * @brief This class tests linear probing, collision response, and set
  * creation capability of set associative hashing in FqCobalt.
  *
  * We modified DoClassify () and CheckProtocol () so that we could control
@@ -1310,8 +1310,8 @@
     void DoRun() override;
     /**
      * Enqueue a packet.
-     * \param queue The queue disc.
-     * \param hdr The IPv4 header.
+     * @param queue The queue disc.
+     * @param hdr The IPv4 header.
      */
     void AddPacket(Ptr<FqCobaltQueueDisc> queue, Ipv4Header hdr);
 };
@@ -1414,9 +1414,9 @@
 }
 
 /**
- * \ingroup system-tests-tc
+ * @ingroup system-tests-tc
  *
- * \brief This class tests L4S mode.
+ * @brief This class tests L4S mode.
  *
  * This test is divided to sub test one without hash collisions and so ECT0 and ECT1 flows are
  * classified into different flows.
@@ -1438,17 +1438,17 @@
     void DoRun() override;
     /**
      * Enqueue the given number of packets.
-     * \param queue The queue disc.
-     * \param hdr The IPv4 header.
-     * \param nPkt The number of packets.
+     * @param queue The queue disc.
+     * @param hdr The IPv4 header.
+     * @param nPkt The number of packets.
      */
     void AddPacket(Ptr<FqCobaltQueueDisc> queue, Ipv4Header hdr, uint32_t nPkt);
     /**
      * Enqueue the given number of packets at different times.
-     * \param queue The queue disc.
-     * \param hdr The IPv4 header.
-     * \param delay The time between two consecutive enqueue operations.
-     * \param nPkt The number of packets.
+     * @param queue The queue disc.
+     * @param hdr The IPv4 header.
+     * @param delay The time between two consecutive enqueue operations.
+     * @param nPkt The number of packets.
      */
     void AddPacketWithDelay(Ptr<FqCobaltQueueDisc> queue,
                             Ipv4Header hdr,
@@ -1456,15 +1456,15 @@
                             uint32_t nPkt);
     /**
      * Dequeue the given number of packets.
-     * \param queue The queue disc.
-     * \param nPkt The number of packets.
+     * @param queue The queue disc.
+     * @param nPkt The number of packets.
      */
     void Dequeue(Ptr<FqCobaltQueueDisc> queue, uint32_t nPkt);
     /**
      * Dequeue the given number of packets at different times.
-     * \param queue The queue disc.
-     * \param delay The time between two consecutive dequeue operations.
-     * \param nPkt The number of packets.
+     * @param queue The queue disc.
+     * @param delay The time between two consecutive dequeue operations.
+     * @param nPkt The number of packets.
      */
     void DequeueWithDelay(Ptr<FqCobaltQueueDisc> queue, double delay, uint32_t nPkt);
 };
@@ -1498,7 +1498,7 @@
 {
     for (uint32_t i = 0; i < nPkt; i++)
     {
-        Simulator::Schedule(Time(Seconds((i + 1) * delay)),
+        Simulator::Schedule(Seconds((i + 1) * delay),
                             &FqCobaltQueueDiscL4sMode::AddPacket,
                             this,
                             queue,
@@ -1523,7 +1523,7 @@
 {
     for (uint32_t i = 0; i < nPkt; i++)
     {
-        Simulator::Schedule(Time(Seconds((i + 1) * delay)),
+        Simulator::Schedule(Seconds((i + 1) * delay),
                             &FqCobaltQueueDiscL4sMode::Dequeue,
                             this,
                             queue,
@@ -1563,7 +1563,7 @@
     // Add 70 ECT1 (ECN capable) packets from the first flow
     // Set delay = 0.5ms
     double delay = 0.0005;
-    Simulator::Schedule(Time(Seconds(0)),
+    Simulator::Schedule(Seconds(0),
                         &FqCobaltQueueDiscL4sMode::AddPacketWithDelay,
                         this,
                         queueDisc,
@@ -1574,7 +1574,7 @@
     // Add 70 ECT0 (ECN capable) packets from second flow
     hdr.SetEcn(Ipv4Header::ECN_ECT0);
     hdr.SetDestination(Ipv4Address("10.10.1.10"));
-    Simulator::Schedule(Time(Seconds(0)),
+    Simulator::Schedule(Seconds(0),
                         &FqCobaltQueueDiscL4sMode::AddPacketWithDelay,
                         this,
                         queueDisc,
@@ -1586,7 +1586,7 @@
     delay = 0.001;
     DequeueWithDelay(queueDisc, delay, 140);
     Simulator::Run();
-    Simulator::Stop(Seconds(8.0));
+    Simulator::Stop(Seconds(8));
     Ptr<CobaltQueueDisc> q0 =
         queueDisc->GetQueueDiscClass(0)->GetQueueDisc()->GetObject<CobaltQueueDisc>();
     Ptr<CobaltQueueDisc> q1 =
@@ -1645,13 +1645,13 @@
     // Add 70 ECT1 (ECN capable) packets from the first flow
     // Set delay = 1ms
     delay = 0.001;
-    Simulator::Schedule(Time(Seconds(0.0005)),
+    Simulator::Schedule(Seconds(0.0005),
                         &FqCobaltQueueDiscL4sMode::AddPacket,
                         this,
                         queueDisc,
                         hdr,
                         1);
-    Simulator::Schedule(Time(Seconds(0.0005)),
+    Simulator::Schedule(Seconds(0.0005),
                         &FqCobaltQueueDiscL4sMode::AddPacketWithDelay,
                         this,
                         queueDisc,
@@ -1661,7 +1661,7 @@
 
     // Add 70 ECT0 (ECN capable) packets from first flow
     hdr.SetEcn(Ipv4Header::ECN_ECT0);
-    Simulator::Schedule(Time(Seconds(0)),
+    Simulator::Schedule(Seconds(0),
                         &FqCobaltQueueDiscL4sMode::AddPacketWithDelay,
                         this,
                         queueDisc,
@@ -1672,7 +1672,7 @@
     // Dequeue 140 packets with delay 1ms
     DequeueWithDelay(queueDisc, delay, 140);
     Simulator::Run();
-    Simulator::Stop(Seconds(8.0));
+    Simulator::Stop(Seconds(8));
     q0 = queueDisc->GetQueueDiscClass(0)->GetQueueDisc()->GetObject<CobaltQueueDisc>();
     q0 = queueDisc->GetQueueDiscClass(0)->GetQueueDisc()->GetObject<CobaltQueueDisc>();
 
@@ -1696,7 +1696,7 @@
 }
 
 /**
- * \ingroup system-tests-tc
+ * @ingroup system-tests-tc
  *
  * FQ-COBALT queue disc test suite.
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/test/ns3tc/fq-codel-queue-disc-test-suite.cc ns-3.44/src/test/ns3tc/fq-codel-queue-disc-test-suite.cc
--- ns-3.43/src/test/ns3tc/fq-codel-queue-disc-test-suite.cc	2024-10-09 16:41:10.096656600 -0700
+++ ns-3.44/src/test/ns3tc/fq-codel-queue-disc-test-suite.cc	2025-03-09 16:55:49.703372200 -0700
@@ -29,7 +29,7 @@
 static int32_t g_hash;
 
 /**
- * \ingroup system-tests-tc
+ * @ingroup system-tests-tc
  *
  * Simple test packet filter able to classify IPv4 packets.
  */
@@ -37,8 +37,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -48,15 +48,15 @@
   private:
     /**
      * Classify a QueueDiscItem
-     * \param item The item to classify (unused).
-     * \return a pre-set hash value.
+     * @param item The item to classify (unused).
+     * @return a pre-set hash value.
      */
     int32_t DoClassify(Ptr<QueueDiscItem> item) const override;
 
     /**
      * Check the protocol.
-     * \param item The item to check (unused).
-     * \return true.
+     * @param item The item to check (unused).
+     * @return true.
      */
     bool CheckProtocol(Ptr<QueueDiscItem> item) const override;
 };
@@ -92,7 +92,7 @@
 }
 
 /**
- * \ingroup system-tests-tc
+ * @ingroup system-tests-tc
  *
  * This class tests packets for which there is no suitable filter.
  */
@@ -150,7 +150,7 @@
 }
 
 /**
- * \ingroup system-tests-tc
+ * @ingroup system-tests-tc
  *
  * This class tests the IP flows separation and the packet limit.
  */
@@ -164,8 +164,8 @@
     void DoRun() override;
     /**
      * Enqueue a packet.
-     * \param queue The queue disc.
-     * \param hdr The IPv4 header.
+     * @param queue The queue disc.
+     * @param hdr The IPv4 header.
      */
     void AddPacket(Ptr<FqCoDelQueueDisc> queue, Ipv4Header hdr);
 };
@@ -245,7 +245,7 @@
 }
 
 /**
- * \ingroup system-tests-tc
+ * @ingroup system-tests-tc
  *
  * This class tests the deficit per flow.
  */
@@ -259,8 +259,8 @@
     void DoRun() override;
     /**
      * Enqueue a packet.
-     * \param queue The queue disc.
-     * \param hdr The IPv4 header.
+     * @param queue The queue disc.
+     * @param hdr The IPv4 header.
      */
     void AddPacket(Ptr<FqCoDelQueueDisc> queue, Ipv4Header hdr);
 };
@@ -471,7 +471,7 @@
 }
 
 /**
- * \ingroup system-tests-tc
+ * @ingroup system-tests-tc
  *
  * This class tests the TCP flows separation.
  */
@@ -485,9 +485,9 @@
     void DoRun() override;
     /**
      * Enqueue a packet.
-     * \param queue The queue disc.
-     * \param ipHdr The IPv4 header.
-     * \param tcpHdr The TCP header.
+     * @param queue The queue disc.
+     * @param ipHdr The IPv4 header.
+     * @param tcpHdr The TCP header.
      */
     void AddPacket(Ptr<FqCoDelQueueDisc> queue, Ipv4Header ipHdr, TcpHeader tcpHdr);
 };
@@ -596,7 +596,7 @@
 }
 
 /**
- * \ingroup system-tests-tc
+ * @ingroup system-tests-tc
  *
  * This class tests the UDP flows separation
  */
@@ -610,9 +610,9 @@
     void DoRun() override;
     /**
      * Enqueue a packet.
-     * \param queue The queue disc.
-     * \param ipHdr The IPv4 header.
-     * \param udpHdr The UDP header.
+     * @param queue The queue disc.
+     * @param ipHdr The IPv4 header.
+     * @param udpHdr The UDP header.
      */
     void AddPacket(Ptr<FqCoDelQueueDisc> queue, Ipv4Header ipHdr, UdpHeader udpHdr);
 };
@@ -721,9 +721,9 @@
 }
 
 /**
- * \ingroup system-tests-tc
+ * @ingroup system-tests-tc
  *
- * \brief This class tests ECN marking.
+ * @brief This class tests ECN marking.
  *
  * Any future classifier options (e.g. SetAssociativeHash) should be
  * disabled to prevent a hash collision on this test case.
@@ -738,11 +738,11 @@
     void DoRun() override;
     /**
      * Enqueue some packets.
-     * \param queue The queue disc.
-     * \param hdr The IPv4 header.
-     * \param nPkt The number of packets to enqueue.
-     * \param nPktEnqueued The expected number of queue disc classes.
-     * \param nQueueFlows The expected number of flows in the queue.
+     * @param queue The queue disc.
+     * @param hdr The IPv4 header.
+     * @param nPkt The number of packets to enqueue.
+     * @param nPktEnqueued The expected number of queue disc classes.
+     * @param nQueueFlows The expected number of flows in the queue.
      */
     void AddPacket(Ptr<FqCoDelQueueDisc> queue,
                    Ipv4Header hdr,
@@ -751,15 +751,15 @@
                    uint32_t nQueueFlows);
     /**
      * Dequeue some packets.
-     * \param queue The queue disc.
-     * \param nPkt The number of packets to dequeue.
+     * @param queue The queue disc.
+     * @param nPkt The number of packets to dequeue.
      */
     void Dequeue(Ptr<FqCoDelQueueDisc> queue, uint32_t nPkt);
     /**
      * Dequeue some packets with delay.
-     * \param queue The queue disc.
-     * \param delay Delay [seconds].
-     * \param nPkt The number of packets to dequeue.
+     * @param queue The queue disc.
+     * @param delay Delay [seconds].
+     * @param nPkt The number of packets to dequeue.
      */
     void DequeueWithDelay(Ptr<FqCoDelQueueDisc> queue, double delay, uint32_t nPkt);
 };
@@ -811,7 +811,7 @@
 {
     for (uint32_t i = 0; i < nPkt; i++)
     {
-        Simulator::Schedule(Time(Seconds((i + 1) * delay)),
+        Simulator::Schedule(Seconds((i + 1) * delay),
                             &FqCoDelQueueDiscECNMarking::Dequeue,
                             this,
                             queue,
@@ -847,7 +847,7 @@
     hdr.SetEcn(Ipv4Header::ECN_ECT0);
 
     // Add 20 ECT0 (ECN capable) packets from the first flow
-    Simulator::Schedule(Time(Seconds(0)),
+    Simulator::Schedule(Seconds(0),
                         &FqCoDelQueueDiscECNMarking::AddPacket,
                         this,
                         queueDisc,
@@ -858,7 +858,7 @@
 
     // Add 20 ECT0 (ECN capable) packets from second flow
     hdr.SetDestination(Ipv4Address("10.10.1.10"));
-    Simulator::Schedule(Time(Seconds(0)),
+    Simulator::Schedule(Seconds(0),
                         &FqCoDelQueueDiscECNMarking::AddPacket,
                         this,
                         queueDisc,
@@ -869,7 +869,7 @@
 
     // Add 20 ECT0 (ECN capable) packets from third flow
     hdr.SetDestination(Ipv4Address("10.10.1.20"));
-    Simulator::Schedule(Time(Seconds(0)),
+    Simulator::Schedule(Seconds(0),
                         &FqCoDelQueueDiscECNMarking::AddPacket,
                         this,
                         queueDisc,
@@ -881,7 +881,7 @@
     // Add 20 NotECT packets from fourth flow
     hdr.SetDestination(Ipv4Address("10.10.1.30"));
     hdr.SetEcn(Ipv4Header::ECN_NotECT);
-    Simulator::Schedule(Time(Seconds(0)),
+    Simulator::Schedule(Seconds(0),
                         &FqCoDelQueueDiscECNMarking::AddPacket,
                         this,
                         queueDisc,
@@ -892,7 +892,7 @@
 
     // Add 20 NotECT packets from fifth flow
     hdr.SetDestination(Ipv4Address("10.10.1.40"));
-    Simulator::Schedule(Time(Seconds(0)),
+    Simulator::Schedule(Seconds(0),
                         &FqCoDelQueueDiscECNMarking::AddPacket,
                         this,
                         queueDisc,
@@ -905,7 +905,7 @@
     // each queue
     DequeueWithDelay(queueDisc, 0.11, 60);
     Simulator::Run();
-    Simulator::Stop(Seconds(8.0));
+    Simulator::Stop(Seconds(8));
     Ptr<CoDelQueueDisc> q0 =
         queueDisc->GetQueueDiscClass(0)->GetQueueDisc()->GetObject<CoDelQueueDisc>();
     Ptr<CoDelQueueDisc> q1 =
@@ -1028,7 +1028,7 @@
     // Add 20 ECT0 (ECN capable) packets from first flow
     hdr.SetDestination(Ipv4Address("10.10.1.2"));
     hdr.SetEcn(Ipv4Header::ECN_ECT0);
-    Simulator::Schedule(Time(Seconds(0)),
+    Simulator::Schedule(Seconds(0),
                         &FqCoDelQueueDiscECNMarking::AddPacket,
                         this,
                         queueDisc,
@@ -1039,7 +1039,7 @@
 
     // Add 20 ECT0 (ECN capable) packets from second flow
     hdr.SetDestination(Ipv4Address("10.10.1.10"));
-    Simulator::Schedule(Time(Seconds(0)),
+    Simulator::Schedule(Seconds(0),
                         &FqCoDelQueueDiscECNMarking::AddPacket,
                         this,
                         queueDisc,
@@ -1050,7 +1050,7 @@
 
     // Add 20 ECT0 (ECN capable) packets from third flow
     hdr.SetDestination(Ipv4Address("10.10.1.20"));
-    Simulator::Schedule(Time(Seconds(0)),
+    Simulator::Schedule(Seconds(0),
                         &FqCoDelQueueDiscECNMarking::AddPacket,
                         this,
                         queueDisc,
@@ -1062,7 +1062,7 @@
     // Add 20 NotECT packets from fourth flow
     hdr.SetDestination(Ipv4Address("10.10.1.30"));
     hdr.SetEcn(Ipv4Header::ECN_NotECT);
-    Simulator::Schedule(Time(Seconds(0)),
+    Simulator::Schedule(Seconds(0),
                         &FqCoDelQueueDiscECNMarking::AddPacket,
                         this,
                         queueDisc,
@@ -1073,7 +1073,7 @@
 
     // Add 20 NotECT packets from fifth flow
     hdr.SetDestination(Ipv4Address("10.10.1.40"));
-    Simulator::Schedule(Time(Seconds(0)),
+    Simulator::Schedule(Seconds(0),
                         &FqCoDelQueueDiscECNMarking::AddPacket,
                         this,
                         queueDisc,
@@ -1086,7 +1086,7 @@
     // each queue
     DequeueWithDelay(queueDisc, 0.0001, 60);
     Simulator::Run();
-    Simulator::Stop(Seconds(8.0));
+    Simulator::Stop(Seconds(8));
     q0 = queueDisc->GetQueueDiscClass(0)->GetQueueDisc()->GetObject<CoDelQueueDisc>();
     q1 = queueDisc->GetQueueDiscClass(1)->GetQueueDisc()->GetObject<CoDelQueueDisc>();
     q2 = queueDisc->GetQueueDiscClass(2)->GetQueueDisc()->GetObject<CoDelQueueDisc>();
@@ -1189,7 +1189,7 @@
     // Add 20 ECT0 (ECN capable) packets from first flow
     hdr.SetDestination(Ipv4Address("10.10.1.2"));
     hdr.SetEcn(Ipv4Header::ECN_ECT0);
-    Simulator::Schedule(Time(Seconds(0)),
+    Simulator::Schedule(Seconds(0),
                         &FqCoDelQueueDiscECNMarking::AddPacket,
                         this,
                         queueDisc,
@@ -1200,7 +1200,7 @@
 
     // Add 20 ECT0 (ECN capable) packets from second flow
     hdr.SetDestination(Ipv4Address("10.10.1.10"));
-    Simulator::Schedule(Time(Seconds(0)),
+    Simulator::Schedule(Seconds(0),
                         &FqCoDelQueueDiscECNMarking::AddPacket,
                         this,
                         queueDisc,
@@ -1211,7 +1211,7 @@
 
     // Add 20 ECT0 (ECN capable) packets from third flow
     hdr.SetDestination(Ipv4Address("10.10.1.20"));
-    Simulator::Schedule(Time(Seconds(0)),
+    Simulator::Schedule(Seconds(0),
                         &FqCoDelQueueDiscECNMarking::AddPacket,
                         this,
                         queueDisc,
@@ -1223,7 +1223,7 @@
     // Add 20 NotECT packets from fourth flow
     hdr.SetDestination(Ipv4Address("10.10.1.30"));
     hdr.SetEcn(Ipv4Header::ECN_NotECT);
-    Simulator::Schedule(Time(Seconds(0)),
+    Simulator::Schedule(Seconds(0),
                         &FqCoDelQueueDiscECNMarking::AddPacket,
                         this,
                         queueDisc,
@@ -1234,7 +1234,7 @@
 
     // Add 20 NotECT packets from fifth flow
     hdr.SetDestination(Ipv4Address("10.10.1.40"));
-    Simulator::Schedule(Time(Seconds(0)),
+    Simulator::Schedule(Seconds(0),
                         &FqCoDelQueueDiscECNMarking::AddPacket,
                         this,
                         queueDisc,
@@ -1247,7 +1247,7 @@
     // each queue
     DequeueWithDelay(queueDisc, 0.110, 60);
     Simulator::Run();
-    Simulator::Stop(Seconds(8.0));
+    Simulator::Stop(Seconds(8));
     q0 = queueDisc->GetQueueDiscClass(0)->GetQueueDisc()->GetObject<CoDelQueueDisc>();
     q1 = queueDisc->GetQueueDiscClass(1)->GetQueueDisc()->GetObject<CoDelQueueDisc>();
     q2 = queueDisc->GetQueueDiscClass(2)->GetQueueDisc()->GetObject<CoDelQueueDisc>();
@@ -1341,9 +1341,9 @@
 }
 
 /**
- * \ingroup system-tests-tc
+ * @ingroup system-tests-tc
  *
- * \brief This class tests linear probing, collision response, and set
+ * @brief This class tests linear probing, collision response, and set
  * creation capability of set associative hashing in FqCodel.
  *
  * We modified DoClassify () and CheckProtocol () so that we could control
@@ -1374,8 +1374,8 @@
     void DoRun() override;
     /**
      * Enqueue a packet.
-     * \param queue The queue disc.
-     * \param hdr The IPv4 header.
+     * @param queue The queue disc.
+     * @param hdr The IPv4 header.
      */
     void AddPacket(Ptr<FqCoDelQueueDisc> queue, Ipv4Header hdr);
 };
@@ -1478,9 +1478,9 @@
 }
 
 /**
- * \ingroup system-tests-tc
+ * @ingroup system-tests-tc
  *
- * \brief This class tests L4S mode.
+ * @brief This class tests L4S mode.
  * Any future classifier options (e.g. SetAssociativeHash) should be
  * disabled to prevent a hash collision on this test case.
  */
@@ -1495,18 +1495,18 @@
 
     /**
      * Enqueue some packets.
-     * \param queue The queue disc.
-     * \param hdr The IPv4 header.
-     * \param nPkt The number of packets to enqueue.
+     * @param queue The queue disc.
+     * @param hdr The IPv4 header.
+     * @param nPkt The number of packets to enqueue.
      */
     void AddPacket(Ptr<FqCoDelQueueDisc> queue, Ipv4Header hdr, uint32_t nPkt);
 
     /**
      * Enqueue some packets with delay.
-     * \param queue The queue disc.
-     * \param hdr The IPv4 header.
-     * \param delay Delay [seconds].
-     * \param nPkt The number of packets to enqueue.
+     * @param queue The queue disc.
+     * @param hdr The IPv4 header.
+     * @param delay Delay [seconds].
+     * @param nPkt The number of packets to enqueue.
      */
     void AddPacketWithDelay(Ptr<FqCoDelQueueDisc> queue,
                             Ipv4Header hdr,
@@ -1515,15 +1515,15 @@
 
     /**
      * Dequeue some packets.
-     * \param queue The queue disc.
-     * \param nPkt The number of packets to dequeue.
+     * @param queue The queue disc.
+     * @param nPkt The number of packets to dequeue.
      */
     void Dequeue(Ptr<FqCoDelQueueDisc> queue, uint32_t nPkt);
     /**
      * Dequeue some packets with delay.
-     * \param queue The queue disc.
-     * \param delay Delay [seconds].
-     * \param nPkt The number of packets to dequeue.
+     * @param queue The queue disc.
+     * @param delay Delay [seconds].
+     * @param nPkt The number of packets to dequeue.
      */
     void DequeueWithDelay(Ptr<FqCoDelQueueDisc> queue, double delay, uint32_t nPkt);
 };
@@ -1557,7 +1557,7 @@
 {
     for (uint32_t i = 0; i < nPkt; i++)
     {
-        Simulator::Schedule(Time(Seconds((i + 1) * delay)),
+        Simulator::Schedule(Seconds((i + 1) * delay),
                             &FqCoDelQueueDiscL4sMode::AddPacket,
                             this,
                             queue,
@@ -1580,7 +1580,7 @@
 {
     for (uint32_t i = 0; i < nPkt; i++)
     {
-        Simulator::Schedule(Time(Seconds((i + 1) * delay)),
+        Simulator::Schedule(Seconds((i + 1) * delay),
                             &FqCoDelQueueDiscL4sMode::Dequeue,
                             this,
                             queue,
@@ -1620,7 +1620,7 @@
     // Add 70 ECT1 (ECN capable) packets from the first flow
     // Set delay = 0.5ms
     double delay = 0.0005;
-    Simulator::Schedule(Time(Seconds(0)),
+    Simulator::Schedule(Seconds(0),
                         &FqCoDelQueueDiscL4sMode::AddPacketWithDelay,
                         this,
                         queueDisc,
@@ -1631,7 +1631,7 @@
     // Add 70 ECT0 (ECN capable) packets from second flow
     hdr.SetEcn(Ipv4Header::ECN_ECT0);
     hdr.SetDestination(Ipv4Address("10.10.1.10"));
-    Simulator::Schedule(Time(Seconds(0)),
+    Simulator::Schedule(Seconds(0),
                         &FqCoDelQueueDiscL4sMode::AddPacketWithDelay,
                         this,
                         queueDisc,
@@ -1643,7 +1643,7 @@
     delay = 0.001;
     DequeueWithDelay(queueDisc, delay, 140);
     Simulator::Run();
-    Simulator::Stop(Seconds(8.0));
+    Simulator::Stop(Seconds(8));
     Ptr<CoDelQueueDisc> q0 =
         queueDisc->GetQueueDiscClass(0)->GetQueueDisc()->GetObject<CoDelQueueDisc>();
     Ptr<CoDelQueueDisc> q1 =
@@ -1696,13 +1696,13 @@
     // Add 70 ECT1 (ECN capable) packets from the first flow
     // Set delay = 1ms
     delay = 0.001;
-    Simulator::Schedule(Time(Seconds(0.0005)),
+    Simulator::Schedule(Seconds(0.0005),
                         &FqCoDelQueueDiscL4sMode::AddPacket,
                         this,
                         queueDisc,
                         hdr,
                         1);
-    Simulator::Schedule(Time(Seconds(0.0005)),
+    Simulator::Schedule(Seconds(0.0005),
                         &FqCoDelQueueDiscL4sMode::AddPacketWithDelay,
                         this,
                         queueDisc,
@@ -1712,7 +1712,7 @@
 
     // Add 70 ECT0 (ECN capable) packets from first flow
     hdr.SetEcn(Ipv4Header::ECN_ECT0);
-    Simulator::Schedule(Time(Seconds(0)),
+    Simulator::Schedule(Seconds(0),
                         &FqCoDelQueueDiscL4sMode::AddPacketWithDelay,
                         this,
                         queueDisc,
@@ -1723,7 +1723,7 @@
     // Dequeue 140 packets with delay 1ms
     DequeueWithDelay(queueDisc, delay, 140);
     Simulator::Run();
-    Simulator::Stop(Seconds(8.0));
+    Simulator::Stop(Seconds(8));
     q0 = queueDisc->GetQueueDiscClass(0)->GetQueueDisc()->GetObject<CoDelQueueDisc>();
 
     NS_TEST_EXPECT_MSG_EQ(
@@ -1746,7 +1746,7 @@
 }
 
 /**
- * \ingroup system-tests-tc
+ * @ingroup system-tests-tc
  *
  * FQ-CoDel queue disc test suite.
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/test/ns3tc/fq-pie-queue-disc-test-suite.cc ns-3.44/src/test/ns3tc/fq-pie-queue-disc-test-suite.cc
--- ns-3.43/src/test/ns3tc/fq-pie-queue-disc-test-suite.cc	2024-10-09 16:41:10.096656600 -0700
+++ ns-3.44/src/test/ns3tc/fq-pie-queue-disc-test-suite.cc	2025-03-09 16:55:49.703372200 -0700
@@ -36,7 +36,7 @@
 static int32_t g_hash;
 
 /**
- * \ingroup system-tests-tc
+ * @ingroup system-tests-tc
  *
  * Simple test packet filter able to classify IPv4 packets.
  */
@@ -44,8 +44,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -55,15 +55,15 @@
   private:
     /**
      * Classify a QueueDiscItem
-     * \param item The item to classify (unused).
-     * \return a pre-set hash value.
+     * @param item The item to classify (unused).
+     * @return a pre-set hash value.
      */
     int32_t DoClassify(Ptr<QueueDiscItem> item) const override;
 
     /**
      * Check the protocol.
-     * \param item The item to check (unused).
-     * \return true.
+     * @param item The item to check (unused).
+     * @return true.
      */
     bool CheckProtocol(Ptr<QueueDiscItem> item) const override;
 };
@@ -99,7 +99,7 @@
 }
 
 /**
- * \ingroup system-tests-tc
+ * @ingroup system-tests-tc
  *
  * This class tests packets for which there is no suitable filter.
  */
@@ -157,7 +157,7 @@
 }
 
 /**
- * \ingroup system-tests-tc
+ * @ingroup system-tests-tc
  *
  * This class tests the IP flows separation and the packet limit.
  */
@@ -171,8 +171,8 @@
     void DoRun() override;
     /**
      * Enqueue a packet.
-     * \param queue the queue disc
-     * \param hdr the IPv4 header
+     * @param queue the queue disc
+     * @param hdr the IPv4 header
      */
     void AddPacket(Ptr<FqPieQueueDisc> queue, Ipv4Header hdr);
 };
@@ -251,7 +251,7 @@
 }
 
 /**
- * \ingroup system-tests-tc
+ * @ingroup system-tests-tc
  *
  * This class tests the deficit per flow.
  */
@@ -265,8 +265,8 @@
     void DoRun() override;
     /**
      * Enqueue a packet.
-     * \param queue The queue disc.
-     * \param hdr The IPv4 header.
+     * @param queue The queue disc.
+     * @param hdr The IPv4 header.
      */
     void AddPacket(Ptr<FqPieQueueDisc> queue, Ipv4Header hdr);
 };
@@ -477,7 +477,7 @@
 }
 
 /**
- * \ingroup system-tests-tc
+ * @ingroup system-tests-tc
  *
  * This class tests the TCP flows separation.
  */
@@ -491,9 +491,9 @@
     void DoRun() override;
     /**
      * Enqueue a packet.
-     * \param queue The queue disc.
-     * \param ipHdr The IPv4 header.
-     * \param tcpHdr The TCP header.
+     * @param queue The queue disc.
+     * @param ipHdr The IPv4 header.
+     * @param tcpHdr The TCP header.
      */
     void AddPacket(Ptr<FqPieQueueDisc> queue, Ipv4Header ipHdr, TcpHeader tcpHdr);
 };
@@ -602,7 +602,7 @@
 }
 
 /**
- * \ingroup system-tests-tc
+ * @ingroup system-tests-tc
  *
  * This class tests the UDP flows separation
  */
@@ -616,9 +616,9 @@
     void DoRun() override;
     /**
      * Enqueue a packet.
-     * \param queue The queue disc.
-     * \param ipHdr The IPv4 header.
-     * \param udpHdr The UDP header.
+     * @param queue The queue disc.
+     * @param ipHdr The IPv4 header.
+     * @param udpHdr The UDP header.
      */
     void AddPacket(Ptr<FqPieQueueDisc> queue, Ipv4Header ipHdr, UdpHeader udpHdr);
 };
@@ -727,9 +727,9 @@
 }
 
 /**
- * \ingroup system-tests-tc
+ * @ingroup system-tests-tc
  *
- * \brief This class tests linear probing, collision response, and set
+ * @brief This class tests linear probing, collision response, and set
  * creation capability of set associative hashing in FqPIE.
  *
  * This class tests linear probing, collision response, and set
@@ -762,8 +762,8 @@
     void DoRun() override;
     /**
      * Enqueue a packet.
-     * \param queue The queue disc.
-     * \param hdr The IPv4 header.
+     * @param queue The queue disc.
+     * @param hdr The IPv4 header.
      */
     void AddPacket(Ptr<FqPieQueueDisc> queue, Ipv4Header hdr);
 };
@@ -865,9 +865,9 @@
 }
 
 /**
- * \ingroup system-tests-tc
+ * @ingroup system-tests-tc
  *
- * \brief This class tests L4S mode.
+ * @brief This class tests L4S mode.
  *
  * This test is divided to sub test one without hash collisions and so ECT0 and ECT1 flows are
  * classified into different flows.
@@ -888,30 +888,30 @@
     void DoRun() override;
     /**
      * Enqueue the given number of packets.
-     * \param queue The queue disc.
-     * \param hdr The IPv4 header.
-     * \param nPkt The number of packets.
+     * @param queue The queue disc.
+     * @param hdr The IPv4 header.
+     * @param nPkt The number of packets.
      */
     void AddPacket(Ptr<FqPieQueueDisc> queue, Ipv4Header hdr, uint32_t nPkt);
     /**
      * Enqueue the given number of packets at different times.
-     * \param queue The queue disc.
-     * \param hdr The IPv4 header.
-     * \param delay The time between two consecutive enqueue operations.
-     * \param nPkt The number of packets.
+     * @param queue The queue disc.
+     * @param hdr The IPv4 header.
+     * @param delay The time between two consecutive enqueue operations.
+     * @param nPkt The number of packets.
      */
     void AddPacketWithDelay(Ptr<FqPieQueueDisc> queue, Ipv4Header hdr, double delay, uint32_t nPkt);
     /**
      * Dequeue the given number of packets.
-     * \param queue The queue disc.
-     * \param nPkt The number of packets.
+     * @param queue The queue disc.
+     * @param nPkt The number of packets.
      */
     void Dequeue(Ptr<FqPieQueueDisc> queue, uint32_t nPkt);
     /**
      * Dequeue the given number of packets at different times.
-     * \param queue The queue disc.
-     * \param delay The time between two consecutive dequeue operations.
-     * \param nPkt The number of packets.
+     * @param queue The queue disc.
+     * @param delay The time between two consecutive dequeue operations.
+     * @param nPkt The number of packets.
      */
     void DequeueWithDelay(Ptr<FqPieQueueDisc> queue, double delay, uint32_t nPkt);
 };
@@ -945,7 +945,7 @@
 {
     for (uint32_t i = 0; i < nPkt; i++)
     {
-        Simulator::Schedule(Time(Seconds((i + 1) * delay)),
+        Simulator::Schedule(Seconds((i + 1) * delay),
                             &FqPieQueueDiscL4sMode::AddPacket,
                             this,
                             queue,
@@ -968,7 +968,7 @@
 {
     for (uint32_t i = 0; i < nPkt; i++)
     {
-        Simulator::Schedule(Time(Seconds((i + 1) * delay)),
+        Simulator::Schedule(Seconds((i + 1) * delay),
                             &FqPieQueueDiscL4sMode::Dequeue,
                             this,
                             queue,
@@ -1008,7 +1008,7 @@
     // Add 70 ECT1 (ECN capable) packets from the first flow
     // Set delay = 0.5ms
     double delay = 0.0005;
-    Simulator::Schedule(Time(Seconds(0)),
+    Simulator::Schedule(Seconds(0),
                         &FqPieQueueDiscL4sMode::AddPacketWithDelay,
                         this,
                         queueDisc,
@@ -1019,7 +1019,7 @@
     // Add 70 ECT0 (ECN capable) packets from second flow
     hdr.SetEcn(Ipv4Header::ECN_ECT0);
     hdr.SetDestination(Ipv4Address("10.10.1.10"));
-    Simulator::Schedule(Time(Seconds(0)),
+    Simulator::Schedule(Seconds(0),
                         &FqPieQueueDiscL4sMode::AddPacketWithDelay,
                         this,
                         queueDisc,
@@ -1030,7 +1030,7 @@
     // Dequeue 140 packets with delay 1ms
     delay = 0.001;
     DequeueWithDelay(queueDisc, delay, 140);
-    Simulator::Stop(Seconds(10.0));
+    Simulator::Stop(Seconds(10));
     Simulator::Run();
 
     Ptr<PieQueueDisc> q0 =
@@ -1086,13 +1086,13 @@
     // Add 70 ECT1 (ECN capable) packets from the first flow
     // Set delay = 1ms
     delay = 0.001;
-    Simulator::Schedule(Time(Seconds(0.0005)),
+    Simulator::Schedule(Seconds(0.0005),
                         &FqPieQueueDiscL4sMode::AddPacket,
                         this,
                         queueDisc,
                         hdr,
                         1);
-    Simulator::Schedule(Time(Seconds(0.0005)),
+    Simulator::Schedule(Seconds(0.0005),
                         &FqPieQueueDiscL4sMode::AddPacketWithDelay,
                         this,
                         queueDisc,
@@ -1102,7 +1102,7 @@
 
     // Add 70 ECT0 (ECN capable) packets from first flow
     hdr.SetEcn(Ipv4Header::ECN_ECT0);
-    Simulator::Schedule(Time(Seconds(0)),
+    Simulator::Schedule(Seconds(0),
                         &FqPieQueueDiscL4sMode::AddPacketWithDelay,
                         this,
                         queueDisc,
@@ -1112,7 +1112,7 @@
 
     // Dequeue 140 packets with delay 1ms
     DequeueWithDelay(queueDisc, delay, 140);
-    Simulator::Stop(Seconds(1.0));
+    Simulator::Stop(Seconds(1));
     Simulator::Run();
     q0 = queueDisc->GetQueueDiscClass(0)->GetQueueDisc()->GetObject<PieQueueDisc>();
     q0 = queueDisc->GetQueueDiscClass(0)->GetQueueDisc()->GetObject<PieQueueDisc>();
@@ -1138,7 +1138,7 @@
 }
 
 /**
- * \ingroup system-tests-tc
+ * @ingroup system-tests-tc
  *
  * FQ-PIE queue disc test suite.
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/test/ns3tc/pfifo-fast-queue-disc-test-suite.cc ns-3.44/src/test/ns3tc/pfifo-fast-queue-disc-test-suite.cc
--- ns-3.43/src/test/ns3tc/pfifo-fast-queue-disc-test-suite.cc	2024-10-09 16:41:10.096656600 -0700
+++ ns-3.44/src/test/ns3tc/pfifo-fast-queue-disc-test-suite.cc	2025-03-09 16:55:49.703372200 -0700
@@ -20,7 +20,7 @@
 using namespace ns3;
 
 /**
- * \ingroup system-tests-tc
+ * @ingroup system-tests-tc
  *
  * This class tests that each possible TOS is enqueued in the right band
  */
@@ -35,9 +35,9 @@
     /**
      * Enqueue a packet and checks that it's added to the proper band.
      *
-     * \param queue The queue disc.
-     * \param tos The TOS of the packet.
-     * \param band Expected band.
+     * @param queue The queue disc.
+     * @param tos The TOS of the packet.
+     * @param band Expected band.
      */
     void TestTosValue(Ptr<PfifoFastQueueDisc> queue, uint8_t tos, uint32_t band);
 };
@@ -110,7 +110,7 @@
 }
 
 /**
- * \ingroup system-tests-tc
+ * @ingroup system-tests-tc
  *
  * This class tests that each possible DSCP is enqueued in the right band.
  */
@@ -125,9 +125,9 @@
     /**
      * Enqueue a packet and checks that it's added to the proper band.
      *
-     * \param queue The queue disc.
-     * \param dscp The DSCP of the packet.
-     * \param band Expected band.
+     * @param queue The queue disc.
+     * @param dscp The DSCP of the packet.
+     * @param band Expected band.
      */
     void TestDscpValue(Ptr<PfifoFastQueueDisc> queue, Ipv4Header::DscpType dscp, uint32_t band);
 };
@@ -205,7 +205,7 @@
 }
 
 /**
- * \ingroup system-tests-tc
+ * @ingroup system-tests-tc
  *
  * This class tests that each band is txqueuelen deep.
  */
@@ -220,8 +220,8 @@
     /**
      * Enqueue a packet.
      *
-     * \param queue The queue disc.
-     * \param dscp The DSCP of the packet.
+     * @param queue The queue disc.
+     * @param dscp The DSCP of the packet.
      */
     void AddPacket(Ptr<PfifoFastQueueDisc> queue, Ipv4Header::DscpType dscp);
 };
@@ -302,7 +302,7 @@
 }
 
 /**
- * \ingroup system-tests-tc
+ * @ingroup system-tests-tc
  *
  * This class tests that packets without a priority tag are handled by placing
  * them into band 1.
@@ -375,7 +375,7 @@
 }
 
 /**
- * \ingroup system-tests-tc
+ * @ingroup system-tests-tc
  *
  * PfifoFast queue disc test suite.
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/test/ns3tcp/ns3tcp-cubic-test-suite.cc ns-3.44/src/test/ns3tcp/ns3tcp-cubic-test-suite.cc
--- ns-3.43/src/test/ns3tcp/ns3tcp-cubic-test-suite.cc	2024-10-09 16:41:10.096656600 -0700
+++ ns-3.44/src/test/ns3tcp/ns3tcp-cubic-test-suite.cc	2025-03-09 16:55:49.703372200 -0700
@@ -67,13 +67,13 @@
 static constexpr bool WRITE_GNUPLOT = false; //!< Set to true to write out gnuplot.
 
 /**
- * \ingroup system-tests-tcp
+ * @ingroup system-tests-tcp
  *
  * Add sample trace values to data structures
- * \param gnuplotTimeSeries Gnuplot data structure
- * \param timeSeries time series of cwnd changes
- * \param oldval old value of cwnd
- * \param newval new value of cwnd
+ * @param gnuplotTimeSeries Gnuplot data structure
+ * @param timeSeries time series of cwnd changes
+ * @param oldval old value of cwnd
+ * @param newval new value of cwnd
  */
 void
 CubicCwndTracer(Gnuplot2dDataset* gnuplotTimeSeries,
@@ -88,7 +88,7 @@
 }
 
 /**
- * \ingroup system-tests-tcp
+ * @ingroup system-tests-tcp
  * Test Cubic response
  */
 class Ns3TcpCubicTestCase : public TestCase
@@ -97,12 +97,12 @@
     /**
      * Constructor.
      *
-     * \param testCase testcase name
-     * \param prefix filename prefix if writing output files
-     * \param fastConvergence whether to enable fast convergence
-     * \param tcpFriendliness whether to enable TCP friendliness
-     * \param baseRtt base RTT to use for test case
-     * \param capacityIncrease whether to trigger a sudden capacity increase
+     * @param testCase testcase name
+     * @param prefix filename prefix if writing output files
+     * @param fastConvergence whether to enable fast convergence
+     * @param tcpFriendliness whether to enable TCP friendliness
+     * @param baseRtt base RTT to use for test case
+     * @param capacityIncrease whether to trigger a sudden capacity increase
      */
     Ns3TcpCubicTestCase(std::string testCase,
                         std::string prefix,
@@ -118,24 +118,24 @@
     /**
      * Connect TCP cwnd trace after socket is instantiated
      *
-     * \param nodeId node ID to connect to
-     * \param socketId socket ID to connect to
+     * @param nodeId node ID to connect to
+     * @param socketId socket ID to connect to
      */
     void ConnectCwndTrace(uint32_t nodeId, uint32_t socketId);
 
     /**
      * Increases the device bandwidth to 100 Mbps
-     * \param device device to modify
+     * @param device device to modify
      */
     void IncreaseBandwidth(Ptr<PointToPointNetDevice> device);
 
     /**
      * Check that time series values within a time range are within a value range.
-     * \param start start of time range
-     * \param end end of time range
-     * \param lowerBound lower bound of acceptable values
-     * \param upperBound upper bound of acceptable values
-     * \return true if values are within range
+     * @param start start of time range
+     * @param end end of time range
+     * @param lowerBound lower bound of acceptable values
+     * @param upperBound upper bound of acceptable values
+     * @return true if values are within range
      */
     bool CheckValues(Time start, Time end, double lowerBound, double upperBound);
 
@@ -299,7 +299,7 @@
     // Install application on the receiver
     PacketSinkHelper sink("ns3::TcpSocketFactory", InetSocketAddress(Ipv4Address::GetAny(), port));
     ApplicationContainer sinkApps = sink.Install(receiver.Get(0));
-    sinkApps.Start(Seconds(0.0));
+    sinkApps.Start(Seconds(0));
     sinkApps.Stop(stopTime);
 
     if (m_capacityIncrease)
@@ -391,7 +391,7 @@
 }
 
 /**
- * \ingroup system-tests-tcp
+ * @ingroup system-tests-tcp
  * TestSuite for module tcp-cubic
  */
 class Ns3TcpCubicTestSuite : public TestSuite
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/test/ns3tcp/ns3tcp-loss-test-suite.cc ns-3.44/src/test/ns3tcp/ns3tcp-loss-test-suite.cc
--- ns-3.43/src/test/ns3tcp/ns3tcp-loss-test-suite.cc	2024-10-09 16:41:10.096656600 -0700
+++ ns-3.44/src/test/ns3tcp/ns3tcp-loss-test-suite.cc	2025-03-09 16:55:49.703372200 -0700
@@ -51,9 +51,9 @@
 const uint32_t PCAP_SNAPLEN = 64; //!< Don't bother to save much data.
 
 /**
- * \ingroup system-tests-tcp
+ * @ingroup system-tests-tcp
  *
- * \brief Tests of TCP implementation loss behavior.
+ * @brief Tests of TCP implementation loss behavior.
  */
 class Ns3TcpLossTestCase : public TestCase
 {
@@ -63,8 +63,8 @@
     /**
      * Constructor.
      *
-     * \param tcpModel The TCP model name.
-     * \param testCase Testcase number.
+     * @param tcpModel The TCP model name.
+     * @param testCase Testcase number.
      */
     Ns3TcpLossTestCase(std::string tcpModel, uint32_t testCase);
 
@@ -93,10 +93,10 @@
      * Check that the transmitted packets are consistent with the trace.
      * This callback is hooked to ns3::Ipv4L3Protocol/Tx.
      *
-     * \param context The callback context (unused).
-     * \param packet The transmitted packet.
-     * \param ipv4 The IPv4 object that did send the packet (unused).
-     * \param interface The IPv4 interface that did send the packet (unused).
+     * @param context The callback context (unused).
+     * @param packet The transmitted packet.
+     * @param ipv4 The IPv4 object that did send the packet (unused).
+     * @param interface The IPv4 interface that did send the packet (unused).
      */
     void Ipv4L3Tx(std::string context,
                   Ptr<const Packet> packet,
@@ -105,23 +105,23 @@
     /**
      * CWND trace.
      *
-     * \param oldval The old value.
-     * \param newval The new value.
+     * @param oldval The old value.
+     * @param newval The new value.
      */
     void CwndTracer(uint32_t oldval, uint32_t newval);
     /**
      * Write to the socket until the buffer is full.
      *
-     * \param localSocket The output socket.
-     * \param txSpace The space left on the socket (unused).
+     * @param localSocket The output socket.
+     * @param txSpace The space left on the socket (unused).
      */
     void WriteUntilBufferFull(Ptr<Socket> localSocket, uint32_t txSpace);
     /**
      * Start transmitting a TCP flow.
      *
-     * \param localSocket The sending socket.
-     * \param servAddress The IPv4 address of the server (i.e., the destination address).
-     * \param servPort The TCP port of the server (i.e., the destination port).
+     * @param localSocket The sending socket.
+     * @param servAddress The IPv4 address of the server (i.e., the destination address).
+     * @param servPort The TCP port of the server (i.e., the destination port).
      */
     void StartFlow(Ptr<Socket> localSocket, Ipv4Address servAddress, uint16_t servPort);
 };
@@ -400,8 +400,8 @@
     PacketSinkHelper sink("ns3::TcpSocketFactory",
                           InetSocketAddress(Ipv4Address::GetAny(), servPort));
     ApplicationContainer apps = sink.Install(r1k1.Get(1));
-    apps.Start(Seconds(0.0));
-    apps.Stop(Seconds(100.0));
+    apps.Start(Seconds(0));
+    apps.Stop(Seconds(100));
 
     // Create a data source to send packets on node s0.
     // Instead of full application, here use the socket directly by
@@ -488,7 +488,7 @@
 }
 
 /**
- * \ingroup system-tests-tcp
+ * @ingroup system-tests-tcp
  *
  * TCP implementation loss behavior TestSuite.
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/test/ns3tcp/ns3tcp-no-delay-test-suite.cc ns-3.44/src/test/ns3tcp/ns3tcp-no-delay-test-suite.cc
--- ns-3.43/src/test/ns3tcp/ns3tcp-no-delay-test-suite.cc	2024-10-09 16:41:10.096656600 -0700
+++ ns-3.44/src/test/ns3tcp/ns3tcp-no-delay-test-suite.cc	2025-03-09 16:55:49.703372200 -0700
@@ -29,9 +29,9 @@
 NS_LOG_COMPONENT_DEFINE("Ns3TcpNoDelayTest");
 
 /**
- * \ingroup system-tests-tcp
+ * @ingroup system-tests-tcp
  *
- * \brief Tests of Nagle's algorithm and the TCP no delay option.
+ * @brief Tests of Nagle's algorithm and the TCP no delay option.
  */
 class Ns3TcpNoDelayTestCase : public TestCase
 {
@@ -39,7 +39,7 @@
     /**
      * Constructor.
      *
-     * \param noDelay Enable or disable TCP no delay option.
+     * @param noDelay Enable or disable TCP no delay option.
      */
     Ns3TcpNoDelayTestCase(bool noDelay);
 
@@ -54,9 +54,9 @@
 
     /**
      * Receive a TCP packet.
-     * \param path The callback context (unused).
-     * \param p The received packet.
-     * \param address The sender's address (unused).
+     * @param path The callback context (unused).
+     * @param p The received packet.
+     * @param address The sender's address (unused).
      */
     void SinkRx(std::string path, Ptr<const Packet> p, const Address& address);
 
@@ -117,7 +117,7 @@
                           InetSocketAddress(Ipv4Address::GetAny(), sinkPort));
     ApplicationContainer apps = sink.Install(n1);
     // Start the sink application at time zero, and stop it at sinkStopTime
-    apps.Start(Seconds(0.0));
+    apps.Start(Seconds(0));
     apps.Stop(sinkStopTimeObj);
 
     Config::Connect("/NodeList/*/ApplicationList/*/$ns3::PacketSink/Rx",
@@ -201,7 +201,7 @@
 }
 
 /**
- * \ingroup system-tests-tcp
+ * @ingroup system-tests-tcp
  *
  * TCP Nagle's algorithm and the TCP no delay option TestSuite.
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/test/ns3tcp/ns3tcp-socket-test-suite.cc ns-3.44/src/test/ns3tcp/ns3tcp-socket-test-suite.cc
--- ns-3.43/src/test/ns3tcp/ns3tcp-socket-test-suite.cc	2024-10-09 16:41:10.096656600 -0700
+++ ns-3.44/src/test/ns3tcp/ns3tcp-socket-test-suite.cc	2025-03-09 16:55:49.703372200 -0700
@@ -30,9 +30,9 @@
 NS_LOG_COMPONENT_DEFINE("Ns3SocketTest");
 
 /**
- * \ingroup system-tests-tcp
+ * @ingroup system-tests-tcp
  *
- * \brief Tests of TCP implementations from the application/socket perspective
+ * @brief Tests of TCP implementations from the application/socket perspective
  * using point-to-point links.
  */
 class Ns3TcpSocketTestCaseP2P : public TestCase
@@ -50,9 +50,9 @@
 
     /**
      * Receive a TCP packet.
-     * \param path The callback context (unused).
-     * \param p The received packet.
-     * \param address The sender's address (unused).
+     * @param path The callback context (unused).
+     * @param p The received packet.
+     * @param address The sender's address (unused).
      */
     void SinkRx(std::string path, Ptr<const Packet> p, const Address& address);
 
@@ -112,7 +112,7 @@
                           InetSocketAddress(Ipv4Address::GetAny(), sinkPort));
     ApplicationContainer apps = sink.Install(n1);
     // Start the sink application at time zero, and stop it at sinkStopTime
-    apps.Start(Seconds(0.0));
+    apps.Start(Seconds(0));
     apps.Stop(sinkStopTimeObj);
 
     Config::Connect("/NodeList/*/ApplicationList/*/$ns3::PacketSink/Rx",
@@ -155,9 +155,9 @@
 }
 
 /**
- * \ingroup system-tests-tcp
+ * @ingroup system-tests-tcp
  *
- * \brief Tests of TCP implementations from the application/socket perspective
+ * @brief Tests of TCP implementations from the application/socket perspective
  * using CSMA links.
  */
 class Ns3TcpSocketTestCaseCsma : public TestCase
@@ -175,9 +175,9 @@
 
     /**
      * Receive a TCP packet.
-     * \param path The callback context (unused).
-     * \param p The received packet.
-     * \param address The sender's address (unused).
+     * @param path The callback context (unused).
+     * @param p The received packet.
+     * @param address The sender's address (unused).
      */
     void SinkRx(std::string path, Ptr<const Packet> p, const Address& address);
 
@@ -241,7 +241,7 @@
                           InetSocketAddress(Ipv4Address::GetAny(), sinkPort));
     ApplicationContainer apps = sink.Install(n1);
     // Start the sink application at time zero, and stop it at sinkStopTime
-    apps.Start(Seconds(0.0));
+    apps.Start(Seconds(0));
     apps.Stop(sinkStopTimeObj);
 
     Config::Connect("/NodeList/*/ApplicationList/*/$ns3::PacketSink/Rx",
@@ -287,7 +287,7 @@
 }
 
 /**
- * \ingroup system-tests-tcp
+ * @ingroup system-tests-tcp
  *
  * TCP implementations from the application/socket perspective TestSuite.
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/test/ns3tcp/ns3tcp-socket-writer.h ns-3.44/src/test/ns3tcp/ns3tcp-socket-writer.h
--- ns-3.43/src/test/ns3tcp/ns3tcp-socket-writer.h	2024-10-09 16:41:10.096656600 -0700
+++ ns-3.44/src/test/ns3tcp/ns3tcp-socket-writer.h	2025-03-09 16:55:49.703372200 -0700
@@ -14,9 +14,9 @@
 {
 
 /**
- * \ingroup system-tests-tcp
+ * @ingroup system-tests-tcp
  *
- * \brief Simple class to write data to sockets.
+ * @brief Simple class to write data to sockets.
  */
 class SocketWriter : public Application
 {
@@ -25,14 +25,14 @@
     ~SocketWriter() override;
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
     /**
      * Setup the socket.
-     * \param node The node owning the socket.
-     * \param peer The destination address.
+     * @param node The node owning the socket.
+     * @param peer The destination address.
      */
     void Setup(Ptr<Node> node, Address peer);
     /**
@@ -41,7 +41,7 @@
     void Connect();
     /**
      * Write to the socket.
-     * \param numBytes The number of bytes to write.
+     * @param numBytes The number of bytes to write.
      */
     void Write(uint32_t numBytes);
     /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/test/ns3tcp/ns3tcp-state-test-suite.cc ns-3.44/src/test/ns3tcp/ns3tcp-state-test-suite.cc
--- ns-3.43/src/test/ns3tcp/ns3tcp-state-test-suite.cc	2024-10-09 16:41:10.096656600 -0700
+++ ns-3.44/src/test/ns3tcp/ns3tcp-state-test-suite.cc	2025-03-09 16:55:49.703372200 -0700
@@ -53,9 +53,9 @@
 const uint32_t PCAP_SNAPLEN = 64; //!< Don't bother to save much data.
 
 /**
- * \ingroup system-tests-tcp
+ * @ingroup system-tests-tcp
  *
- * \brief Tests of TCP implementation state machine behavior
+ * @brief Tests of TCP implementation state machine behavior
  */
 class Ns3TcpStateTestCase : public TestCase
 {
@@ -63,7 +63,7 @@
     Ns3TcpStateTestCase();
     /**
      * Constructor.
-     * \param testCase Testcase number.
+     * @param testCase Testcase number.
      */
     Ns3TcpStateTestCase(uint32_t testCase);
 
@@ -90,10 +90,10 @@
      * Check that the transmitted packets are consistent with the trace.
      * This callback is hooked to ns3::Ipv4L3Protocol/Tx.
      *
-     * \param context The callback context (unused).
-     * \param packet The transmitted packet.
-     * \param ipv4 The IPv4 object that did send the packet (unused).
-     * \param interface The IPv4 interface that did send the packet (unused).
+     * @param context The callback context (unused).
+     * @param packet The transmitted packet.
+     * @param ipv4 The IPv4 object that did send the packet (unused).
+     * @param interface The IPv4 interface that did send the packet (unused).
      */
     void Ipv4L3Tx(std::string context,
                   Ptr<const Packet> packet,
@@ -103,10 +103,10 @@
      * Check that the received packets are consistent with the trace.
      * This callback is hooked to ns3::Ipv4L3Protocol/Tx.
      *
-     * \param context The callback context (unused).
-     * \param packet The transmitted packet.
-     * \param ipv4 The IPv4 object that did send the packet (unused).
-     * \param interface The IPv4 interface that did send the packet (unused).
+     * @param context The callback context (unused).
+     * @param packet The transmitted packet.
+     * @param ipv4 The IPv4 object that did send the packet (unused).
+     * @param interface The IPv4 interface that did send the packet (unused).
      */
     void Ipv4L3Rx(std::string context,
                   Ptr<const Packet> packet,
@@ -115,16 +115,16 @@
     /**
      * Write to the socket until the buffer is full.
      *
-     * \param localSocket The output socket.
-     * \param txSpace The space left on the socket (unused).
+     * @param localSocket The output socket.
+     * @param txSpace The space left on the socket (unused).
      */
     void WriteUntilBufferFull(Ptr<Socket> localSocket, uint32_t txSpace);
     /**
      * Start transmitting a TCP flow.
      *
-     * \param localSocket The sending socket.
-     * \param servAddress The IPv4 address of the server (i.e., the destination address).
-     * \param servPort The TCP port of the server (i.e., the destination port).
+     * @param localSocket The sending socket.
+     * @param servAddress The IPv4 address of the server (i.e., the destination address).
+     * @param servPort The TCP port of the server (i.e., the destination port).
      */
     void StartFlow(Ptr<Socket> localSocket, Ipv4Address servAddress, uint16_t servPort);
 };
@@ -393,8 +393,8 @@
     PacketSinkHelper sink("ns3::TcpSocketFactory",
                           InetSocketAddress(Ipv4Address::GetAny(), servPort));
     ApplicationContainer sinkApps = sink.Install(n1n2.Get(1));
-    sinkApps.Start(Seconds(0.0));
-    sinkApps.Stop(Seconds(100.0));
+    sinkApps.Start(Seconds(0));
+    sinkApps.Stop(Seconds(100));
 
     // Create a data source to send packets on node n0
     // Instead of full application, here use the socket directly by
@@ -509,7 +509,7 @@
 }
 
 /**
- * \ingroup system-tests-tcp
+ * @ingroup system-tests-tcp
  *
  * TCP implementation state machine behavior TestSuite.
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/test/ns3wifi/wifi-ac-mapping-test-suite.cc ns-3.44/src/test/ns3wifi/wifi-ac-mapping-test-suite.cc
--- ns-3.43/src/test/ns3wifi/wifi-ac-mapping-test-suite.cc	2024-10-09 16:41:10.096656600 -0700
+++ ns-3.44/src/test/ns3wifi/wifi-ac-mapping-test-suite.cc	2025-03-09 16:55:49.703372200 -0700
@@ -30,10 +30,10 @@
 NS_LOG_COMPONENT_DEFINE("WifiAcMappingTest");
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test for User priority to Access Category mapping
+ * @brief Test for User priority to Access Category mapping
  */
 class WifiAcMappingTest : public TestCase
 {
@@ -41,8 +41,8 @@
     /**
      * Constructor for WifiAcMappingTest
      *
-     * \param tos the type of service
-     * \param expectedQueue the expected queue disc index
+     * @param tos the type of service
+     * @param expectedQueue the expected queue disc index
      */
     WifiAcMappingTest(uint8_t tos, uint8_t expectedQueue);
     void DoRun() override;
@@ -52,9 +52,9 @@
      * Function called whenever a packet is enqueued in
      * a queue disc.
      *
-     * \param tos the type of service
-     * \param count the pointer to the packet counter
-     * \param item the enqueued item
+     * @param tos the type of service
+     * @param count the pointer to the packet counter
+     * @param item the enqueued item
      */
     static void PacketEnqueuedInQueueDisc(uint8_t tos,
                                           uint16_t* count,
@@ -63,9 +63,9 @@
      * Function called whenever a packet is enqueued in
      * a Wi-Fi MAC queue.
      *
-     * \param tos the type of service
-     * \param count the pointer to the packet counter
-     * \param item the enqueued item
+     * @param tos the type of service
+     * @param count the pointer to the packet counter
+     * @param item the enqueued item
      */
     static void PacketEnqueuedInWifiMacQueue(uint8_t tos,
                                              uint16_t* count,
@@ -191,7 +191,7 @@
                                 InetSocketAddress(Ipv4Address::GetAny(), udpPort));
     ApplicationContainer sinkApp = packetSink.Install(sta.Get(0));
     sinkApp.Start(Seconds(0));
-    sinkApp.Stop(Seconds(4.0));
+    sinkApp.Stop(Seconds(4));
 
     // The packet source is an on-off application on the AP device
     InetSocketAddress dest(staNodeInterface.GetAddress(0), udpPort);
@@ -199,14 +199,14 @@
     onoff.SetConstantRate(DataRate("5kbps"), 500);
     onoff.SetAttribute("Tos", UintegerValue(m_tos));
     ApplicationContainer sourceApp = onoff.Install(ap.Get(0));
-    sourceApp.Start(Seconds(1.0));
-    sourceApp.Stop(Seconds(4.0));
+    sourceApp.Start(Seconds(1));
+    sourceApp.Stop(Seconds(4));
 
     // The first packet will be transmitted at time 1+(500*8)/5000 = 1.8s.
     // The second packet will be transmitted at time 1.8+(500*8)/5000 = 2.6s.
     // The third packet will be transmitted at time 2.6+(500*8)/5000 = 3.4s.
 
-    Simulator::Stop(Seconds(5.0));
+    Simulator::Stop(Seconds(5));
 
     Ptr<QueueDisc> root =
         ap.Get(0)->GetObject<TrafficControlLayer>()->GetRootQueueDiscOnDevice(apDev.Get(0));
@@ -310,10 +310,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Access category mapping Test Suite
+ * @brief Access category mapping Test Suite
  */
 class WifiAcMappingTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/test/ns3wifi/wifi-issue-211-test-suite.cc ns-3.44/src/test/ns3wifi/wifi-issue-211-test-suite.cc
--- ns-3.43/src/test/ns3wifi/wifi-issue-211-test-suite.cc	2024-10-09 16:41:10.096656600 -0700
+++ ns-3.44/src/test/ns3wifi/wifi-issue-211-test-suite.cc	2025-03-09 16:55:49.703372200 -0700
@@ -28,10 +28,10 @@
 using namespace ns3;
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test for issue 211 (https://gitlab.com/nsnam/ns-3-dev/-/issues/211)
+ * @brief Test for issue 211 (https://gitlab.com/nsnam/ns-3-dev/-/issues/211)
  *
  * This test aims to check that the transmission of data frames (under a
  * Block Ack agreement) resumes after a period in which the connectivity
@@ -48,7 +48,7 @@
 {
   public:
     /**
-     * \brief Constructor
+     * @brief Constructor
      */
     Issue211Test();
     ~Issue211Test() override;
@@ -58,7 +58,7 @@
   private:
     /**
      * Compute the average throughput since the last check-point
-     * \param server the UDP server
+     * @param server the UDP server
      */
     void CalcThroughput(Ptr<UdpServer> server);
 
@@ -71,7 +71,7 @@
 Issue211Test::Issue211Test()
     : TestCase("Test case for resuming data transmission when the recipient moves back"),
       m_lastRxBytes(0),
-      m_lastCheckPointTime(Seconds(0)),
+      m_lastCheckPointTime(),
       m_payloadSize(2000)
 {
 }
@@ -94,9 +94,9 @@
 void
 Issue211Test::DoRun()
 {
-    Time simulationTime(Seconds(6.0));
-    Time moveAwayTime(Seconds(2.0));
-    Time moveBackTime(Seconds(4.0));
+    Time simulationTime(Seconds(6));
+    Time moveAwayTime(Seconds(2));
+    Time moveBackTime(Seconds(4));
 
     RngSeedManager::SetSeed(1);
     RngSeedManager::SetRun(40);
@@ -169,12 +169,12 @@
     apNodeInterface = address.Assign(apDevices.Get(0));
 
     ApplicationContainer serverApp;
-    Time warmup(Seconds(1.0)); // to account for association
+    Time warmup(Seconds(1)); // to account for association
 
     uint16_t port = 9;
     UdpServerHelper server(port);
     serverApp = server.Install(wifiStaNode.Get(0));
-    serverApp.Start(Seconds(0.0));
+    serverApp.Start(Seconds(0));
     serverApp.Stop(warmup + simulationTime);
 
     UdpClientHelper client(staNodeInterface.GetAddress(0), port);
@@ -235,10 +235,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Block Ack Test Suite
+ * @brief Block Ack Test Suite
  */
 class Issue211TestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/test/ns3wifi/wifi-msdu-aggregator-test-suite.cc ns-3.44/src/test/ns3wifi/wifi-msdu-aggregator-test-suite.cc
--- ns-3.43/src/test/ns3wifi/wifi-msdu-aggregator-test-suite.cc	2024-10-09 16:41:10.096656600 -0700
+++ ns-3.44/src/test/ns3wifi/wifi-msdu-aggregator-test-suite.cc	2025-03-09 16:55:49.703372200 -0700
@@ -23,10 +23,10 @@
 using namespace ns3;
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Throughput test for MsduAggregator
+ * @brief Throughput test for MsduAggregator
  */
 class WifiMsduAggregatorThroughputTest : public TestCase
 {
@@ -140,7 +140,7 @@
                                 InetSocketAddress(Ipv4Address::GetAny(), udpPort));
     ApplicationContainer sinkApp = packetSink.Install(sta.Get(0));
     sinkApp.Start(Seconds(0));
-    sinkApp.Stop(Seconds(9.0));
+    sinkApp.Stop(Seconds(9));
 
     // The packet source is an on-off application on the AP
     // device. Given that we have fixed the transmit rate at 1 Mbps
@@ -153,8 +153,8 @@
     onoff.SetAttribute("PacketSize", UintegerValue(100));
     onoff.SetConstantRate(DataRate("1Mbps"));
     ApplicationContainer sourceApp = onoff.Install(ap.Get(0));
-    sourceApp.Start(Seconds(1.0));
-    sourceApp.Stop(Seconds(9.0));
+    sourceApp.Start(Seconds(1));
+    sourceApp.Stop(Seconds(9));
 
     // Enable tracing at the AP
     if (m_writeResults)
@@ -163,7 +163,7 @@
         wifiPhy.EnablePcap("wifi-amsdu-throughput", sta.Get(0)->GetId(), 0);
     }
 
-    Simulator::Stop(Seconds(10.0));
+    Simulator::Stop(Seconds(10));
     Simulator::Run();
     Simulator::Destroy();
 
@@ -191,10 +191,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief MsduAggregator Test Suite
+ * @brief MsduAggregator Test Suite
  *
  * For now the MSDU Aggregator Test Suite contains only the one test
  * that is defined in this file, so it's class definition and
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/test/traced/traced-callback-typedef-test-suite.cc ns-3.44/src/test/traced/traced-callback-typedef-test-suite.cc
--- ns-3.43/src/test/traced/traced-callback-typedef-test-suite.cc	2024-10-09 16:41:10.096656600 -0700
+++ ns-3.44/src/test/traced/traced-callback-typedef-test-suite.cc	2025-03-09 16:55:49.703372200 -0700
@@ -35,15 +35,15 @@
 using namespace ns3;
 
 /**
- * \file
- * \ingroup system-tests-traced
+ * @file
+ * @ingroup system-tests-traced
  *
  * TracedCallback tests to verify if they are called with
  * the right type and number of arguments.
  */
 
 /**
- * \ingroup system-tests-traced
+ * @ingroup system-tests-traced
  *
  * TracedCallback Testcase.
  *
@@ -88,10 +88,10 @@
 {
 
 /**
- * \ingroup system-tests-traced
+ * @ingroup system-tests-traced
  *
  * Record typedefs which are identical to previously declared.
- * \return a container of strings representing the duplicates.
+ * @return a container of strings representing the duplicates.
  */
 std::set<std::string>
 Duplicates()
@@ -108,20 +108,20 @@
 }
 
 /**
- * \ingroup system-tests-traced
+ * @ingroup system-tests-traced
  *
  * Container for duplicate types.
  */
 std::set<std::string> g_dupes = Duplicates();
 
 /**
- * \ingroup system-tests-traced
+ * @ingroup system-tests-traced
  *
  * Stringify the known TracedCallback type names.
  *
- * \tparam T \explicit The typedef name.
- * \param [in] N The number of arguments expected.
- * \returns The \c TracedCallback type name.
+ * @tparam T \explicit The typedef name.
+ * @param [in] N The number of arguments expected.
+ * @returns The \c TracedCallback type name.
  */
 template <typename T>
 inline std::string
@@ -131,7 +131,7 @@
 }
 
 /**
- * \ingroup system-tests-traced
+ * @ingroup system-tests-traced
  *
  * Returns a string representing the type of a class.
  */
@@ -145,13 +145,13 @@
     }
 
 /**
- * \ingroup system-tests-traced
+ * @ingroup system-tests-traced
  *
- * \name Stringify known typename.
+ * @name Stringify known typename.
  */
 /**
  * @{
- * \brief Stringify a known typename
+ * @brief Stringify a known typename
  */
 TYPENAME(dsr::DsrOptionSRHeader::TracedCallback);
 TYPENAME(EpcUeNas::StateTracedCallback);
@@ -212,14 +212,14 @@
 #undef TYPENAME
 
 /**
- * \ingroup system-tests-traced
+ * @ingroup system-tests-traced
  *
  * Log that a callback was invoked.
  *
  * We can't actually do anything with any of the arguments,
  * but the fact we got called is what's important.
  *
- * \param [in] N The number of arguments passed to the callback.
+ * @param [in] N The number of arguments passed to the callback.
  */
 void
 SinkIt(std::size_t N)
@@ -229,7 +229,7 @@
 }
 
 /**
- * \ingroup system-tests-traced
+ * @ingroup system-tests-traced
  *
  * Sink functions.
  */
@@ -238,8 +238,8 @@
 {
   public:
     /**
-     * \brief Sink function, called by a TracedCallback.
-     * \tparam Ts parameters of the TracedCallback.
+     * @brief Sink function, called by a TracedCallback.
+     * @tparam Ts parameters of the TracedCallback.
      */
     static void Sink(Ts...)
     {
@@ -268,8 +268,13 @@
     TracedCallback<Ts...> m_cb;
 
   public:
-    Checker(){};
-    ~Checker() override{};
+    Checker()
+    {
+    }
+
+    ~Checker() override
+    {
+    }
 
     /// Arguments of the TracedCallback.
     std::tuple<std::remove_pointer_t<std::remove_cvref_t<Ts>>...> m_items;
@@ -313,7 +318,7 @@
 }
 
 /**
- * \ingroup system-tests-traced
+ * @ingroup system-tests-traced
  *
  * Check the TracedCallback duplicate by checking if it matches the TracedCallback
  * it is supposed to be equal to.
@@ -337,7 +342,7 @@
     }
 
 /**
- * \ingroup system-tests-traced
+ * @ingroup system-tests-traced
  *
  * Check the TracedCallback by calling its Invoke function.
  */
@@ -519,9 +524,9 @@
 }
 
 /**
- * \ingroup system-tests-traced
+ * @ingroup system-tests-traced
  *
- * \brief TracedCallback typedef TestSuite
+ * @brief TracedCallback typedef TestSuite
  */
 class TracedCallbackTypedefTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/test/traced/traced-value-callback-typedef-test-suite.cc ns-3.44/src/test/traced/traced-value-callback-typedef-test-suite.cc
--- ns-3.43/src/test/traced/traced-value-callback-typedef-test-suite.cc	2024-10-09 16:41:10.096656600 -0700
+++ ns-3.44/src/test/traced/traced-value-callback-typedef-test-suite.cc	2025-03-09 16:55:49.703372200 -0700
@@ -19,8 +19,8 @@
 using namespace ns3;
 
 /**
- * \file
- * \ingroup system-tests-traced
+ * @file
+ * @ingroup system-tests-traced
  *
  * TracedValueCallback tests to verify that they work with different types
  * of classes - it tests bool, double, various types of integers types,
@@ -31,7 +31,7 @@
 {
 
 /**
- * \ingroup system-tests-traced
+ * @ingroup system-tests-traced
  *
  * Result of callback test.
  *
@@ -44,17 +44,17 @@
 std::string g_Result = "";
 
 /**
- * \ingroup system-tests-traced
+ * @ingroup system-tests-traced
  *
  * Template for TracedValue sink functions.
  *
  * This generates a sink function for any underlying type.
  *
- * \tparam T \explicit The type of the value being traced.
+ * @tparam T \explicit The type of the value being traced.
  *        Since the point of this template is to create a
  *        sink function, the template type must be given explicitly.
- * \param [in] oldValue The original value
- * \param [in] newValue The new value
+ * @param [in] oldValue The original value
+ * @param [in] newValue The new value
  */
 template <typename T>
 void
@@ -75,11 +75,11 @@
 } // TracedValueCbSink<>()
 
 /**
- * \ingroup system-tests-traced
+ * @ingroup system-tests-traced
  *
  * TracedValueCbSink specialization for Time.
- * \param oldValue The old value
- * \param newValue The new value
+ * @param oldValue The old value
+ * @param newValue The new value
  */
 template <>
 void
@@ -89,11 +89,11 @@
 }
 
 /**
- * \ingroup system-tests-traced
+ * @ingroup system-tests-traced
  *
  * TracedValueCbSink specialization for SequenceNumber32.
- * \param oldValue The old value
- * \param newValue The new value
+ * @param oldValue The old value
+ * @param newValue The new value
  */
 template <>
 void
@@ -105,9 +105,9 @@
 } // unnamed namespace
 
 /**
- * \ingroup system-tests-traced
+ * @ingroup system-tests-traced
  *
- * \brief TracedValueCallback Test Case
+ * @brief TracedValueCallback Test Case
  */
 class TracedValueCallbackTestCase : public TestCase
 {
@@ -137,8 +137,8 @@
         }
 
         /**
-         * \brief Register this type.
-         * \return The object TypeId.
+         * @brief Register this type.
+         * @return The object TypeId.
          */
         static TypeId GetTypeId()
         {
@@ -161,7 +161,7 @@
          * Just to make sure, we increment the TracedValue,
          * which calls the sink.
          *
-         * \param cb Callback.
+         * @param cb Callback.
          */
         template <typename U>
         void Invoke(U cb)
@@ -197,8 +197,8 @@
      * TracedValueCbSink<T>.  If this compiles, we've proved the
      * sink function and the typedef agree.
      *
-     * \tparam T \explicit The base type.
-     * \tparam U \explicit The TracedValueCallback sink typedef type.
+     * @tparam T \explicit The base type.
+     * @tparam U \explicit The TracedValueCallback sink typedef type.
      */
     template <typename T, typename U>
     void CheckType()
@@ -237,9 +237,9 @@
 }
 
 /**
- * \ingroup system-tests-traced
+ * @ingroup system-tests-traced
  *
- * \brief TracedValueCallback TestSuite
+ * @brief TracedValueCallback TestSuite
  */
 class TracedValueCallbackTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/topology-read/doc/topology.h ns-3.44/src/topology-read/doc/topology.h
--- ns-3.43/src/topology-read/doc/topology.h	2024-10-09 16:41:10.096656600 -0700
+++ ns-3.44/src/topology-read/doc/topology.h	2025-03-09 16:55:49.703372200 -0700
@@ -1,7 +1,7 @@
 /**
- * \defgroup topology Topology Input Readers
+ * @defgroup topology Topology Input Readers
  *
- * \section topologyOverview Topology Input Readers Overview
+ * @section topologyOverview Topology Input Readers Overview
  *
  * The topology modules aim at reading a topology file generated by an automatic topology generator.
  *
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/topology-read/examples/topology-example-sim.cc ns-3.44/src/topology-read/examples/topology-example-sim.cc
--- ns-3.43/src/topology-read/examples/topology-example-sim.cc	2024-10-09 16:41:10.096656600 -0700
+++ ns-3.44/src/topology-read/examples/topology-example-sim.cc	2025-03-09 16:55:49.707372200 -0700
@@ -23,7 +23,7 @@
 #include <sstream>
 
 /**
- * \ingroup topology
+ * @ingroup topology
  * Example of TopologyReader: read in a topology in a specified format.
  *
  * This example can be used with the following parameters:
@@ -42,8 +42,8 @@
 
 /**
  * Print the TTL of received packet
- * \param p received packet
- * \param ad sender address
+ * @param p received packet
+ * @param ad sender address
  */
 static void
 SinkRx(Ptr<const Packet> p, const Address& ad)
@@ -172,13 +172,13 @@
     }
 
     ApplicationContainer apps = onoff.Install(clientNodes);
-    apps.Start(Seconds(1.0));
-    apps.Stop(Seconds(2.0));
+    apps.Start(Seconds(1));
+    apps.Stop(Seconds(2));
 
     PacketSinkHelper sink = PacketSinkHelper("ns3::Ipv4RawSocketFactory", dst);
     apps = sink.Install(randomServerNode);
-    apps.Start(Seconds(0.0));
-    apps.Stop(Seconds(3.0));
+    apps.Start(Seconds(0));
+    apps.Stop(Seconds(3));
 
     // we trap the packet sink receiver to extract the TTL.
     Config::ConnectWithoutContext("/NodeList/*/ApplicationList/*/$ns3::PacketSink/Rx",
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/topology-read/helper/topology-reader-helper.cc ns-3.44/src/topology-read/helper/topology-reader-helper.cc
--- ns-3.43/src/topology-read/helper/topology-reader-helper.cc	2024-10-09 16:41:10.096656600 -0700
+++ ns-3.44/src/topology-read/helper/topology-reader-helper.cc	2025-03-09 16:55:49.707372200 -0700
@@ -16,8 +16,8 @@
 #include "ns3/rocketfuel-topology-reader.h"
 
 /**
- * \file
- * \ingroup topology
+ * @file
+ * @ingroup topology
  * ns3::TopologyHelper implementation.
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/topology-read/helper/topology-reader-helper.h ns-3.44/src/topology-read/helper/topology-reader-helper.h
--- ns-3.43/src/topology-read/helper/topology-reader-helper.h	2024-10-09 16:41:10.096656600 -0700
+++ ns-3.44/src/topology-read/helper/topology-reader-helper.h	2025-03-09 16:55:49.707372200 -0700
@@ -15,8 +15,8 @@
 #include <string>
 
 /**
- * \file
- * \ingroup topology
+ * @file
+ * @ingroup topology
  * ns3::TopologyHelper declaration.
  */
 
@@ -24,9 +24,9 @@
 {
 
 /**
- * \ingroup topology
+ * @ingroup topology
  *
- * \brief Helper class which makes it easier to configure and use a generic TopologyReader.
+ * @brief Helper class which makes it easier to configure and use a generic TopologyReader.
  */
 class TopologyReaderHelper
 {
@@ -34,20 +34,20 @@
     TopologyReaderHelper();
 
     /**
-     * \brief Sets the input file name.
-     * \param [in] fileName The input file name.
+     * @brief Sets the input file name.
+     * @param [in] fileName The input file name.
      */
     void SetFileName(const std::string fileName);
 
     /**
-     * \brief Sets the input file type. Supported file types are "Orbis", "Inet", "Rocketfuel".
-     * \param [in] fileType The input file type.
+     * @brief Sets the input file type. Supported file types are "Orbis", "Inet", "Rocketfuel".
+     * @param [in] fileType The input file type.
      */
     void SetFileType(const std::string fileType);
 
     /**
-     * \brief Gets a Ptr<TopologyReader> to the actual TopologyReader.
-     * \return The created Topology Reader (or null if there was an error).
+     * @brief Gets a Ptr<TopologyReader> to the actual TopologyReader.
+     * @return The created Topology Reader (or null if there was an error).
      */
     Ptr<TopologyReader> GetTopologyReader();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/topology-read/model/inet-topology-reader.cc ns-3.44/src/topology-read/model/inet-topology-reader.cc
--- ns-3.43/src/topology-read/model/inet-topology-reader.cc	2024-10-09 16:41:10.096656600 -0700
+++ ns-3.44/src/topology-read/model/inet-topology-reader.cc	2025-03-09 16:55:49.707372200 -0700
@@ -18,8 +18,8 @@
 #include <sstream>
 
 /**
- * \file
- * \ingroup topology
+ * @file
+ * @ingroup topology
  * ns3::InetTopologyReader implementation.
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/topology-read/model/inet-topology-reader.h ns-3.44/src/topology-read/model/inet-topology-reader.h
--- ns-3.43/src/topology-read/model/inet-topology-reader.h	2024-10-09 16:41:10.096656600 -0700
+++ ns-3.44/src/topology-read/model/inet-topology-reader.h	2025-03-09 16:55:49.707372200 -0700
@@ -13,8 +13,8 @@
 #include "topology-reader.h"
 
 /**
- * \file
- * \ingroup topology
+ * @file
+ * @ingroup topology
  * ns3::InetTopologyReader declaration.
  */
 
@@ -24,9 +24,9 @@
 // ------------------------------------------------------------
 // --------------------------------------------
 /**
- * \ingroup topology
+ * @ingroup topology
  *
- * \brief Topology file reader (Inet-format type).
+ * @brief Topology file reader (Inet-format type).
  *
  * This class takes an input file in Inet format and extracts all
  * the information needed to build the topology
@@ -41,8 +41,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId.
+     * @brief Get the type ID.
+     * @return the object TypeId.
      */
     static TypeId GetTypeId();
 
@@ -54,7 +54,7 @@
     InetTopologyReader& operator=(const InetTopologyReader&) = delete;
 
     /**
-     * \brief Main topology reading function.
+     * @brief Main topology reading function.
      *
      * This method opens an input stream and reads the Inet-format file.
      * From the first line it takes the total number of nodes and links.
@@ -63,7 +63,7 @@
      * Then reads until the end of the file (total links number rows) and saves
      * the structure of every single link in the topology.
      *
-     * \return The container of the nodes created (or empty container if there was an error)
+     * @return The container of the nodes created (or empty container if there was an error)
      */
     NodeContainer Read() override;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/topology-read/model/orbis-topology-reader.cc ns-3.44/src/topology-read/model/orbis-topology-reader.cc
--- ns-3.43/src/topology-read/model/orbis-topology-reader.cc	2024-10-09 16:41:10.096656600 -0700
+++ ns-3.44/src/topology-read/model/orbis-topology-reader.cc	2025-03-09 16:55:49.707372200 -0700
@@ -18,8 +18,8 @@
 #include <sstream>
 
 /**
- * \file
- * \ingroup topology
+ * @file
+ * @ingroup topology
  * ns3::OrbisTopologyReader implementation.
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/topology-read/model/orbis-topology-reader.h ns-3.44/src/topology-read/model/orbis-topology-reader.h
--- ns-3.43/src/topology-read/model/orbis-topology-reader.h	2024-10-09 16:41:10.096656600 -0700
+++ ns-3.44/src/topology-read/model/orbis-topology-reader.h	2025-03-09 16:55:49.707372200 -0700
@@ -13,8 +13,8 @@
 #include "topology-reader.h"
 
 /**
- * \file
- * \ingroup topology
+ * @file
+ * @ingroup topology
  * ns3::OrbisTopologyReader declaration.
  */
 
@@ -24,9 +24,9 @@
 // ------------------------------------------------------------
 // --------------------------------------------
 /**
- * \ingroup topology
+ * @ingroup topology
  *
- * \brief Topology file reader (Orbis-format type).
+ * @brief Topology file reader (Orbis-format type).
  *
  * This class takes an input file in Orbis format and extracts all
  * the information needed to build the topology
@@ -38,8 +38,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId.
+     * @brief Get the type ID.
+     * @return the object TypeId.
      */
     static TypeId GetTypeId();
 
@@ -51,14 +51,14 @@
     OrbisTopologyReader& operator=(const OrbisTopologyReader&) = delete;
 
     /**
-     * \brief Main topology reading function.
+     * @brief Main topology reading function.
      *
      * This method opens an input stream and reads the Orbis-format file.
      * Every row represents a topology link (the ids of a couple of nodes),
      * so the input file is read line by line to figure out how many links
      * and nodes are in the topology.
      *
-     * \return The container of the nodes created (or empty container if there was an error)
+     * @return The container of the nodes created (or empty container if there was an error)
      */
     NodeContainer Read() override;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/topology-read/model/rocketfuel-topology-reader.cc ns-3.44/src/topology-read/model/rocketfuel-topology-reader.cc
--- ns-3.43/src/topology-read/model/rocketfuel-topology-reader.cc	2024-10-09 16:41:10.096656600 -0700
+++ ns-3.44/src/topology-read/model/rocketfuel-topology-reader.cc	2025-03-09 16:55:49.707372200 -0700
@@ -19,8 +19,8 @@
 #include <string>
 
 /**
- * \file
- * \ingroup topology
+ * @file
+ * @ingroup topology
  * ns3::RocketfuelTopologyReader implementation.
  */
 
@@ -75,25 +75,25 @@
 
 /**
  * Build a Regex object for RocketFuel topology maps file type
- * \return a static regex object for maps file type
+ * @return a static regex object for maps file type
  */
 static const std::regex rocketfuel_maps_regex(ROCKETFUEL_MAPS_LINE);
 
 /**
  * Build a Regex object for RocketFuel topology weights file type
- * \return a static regex object for weights file type
+ * @return a static regex object for weights file type
  */
 static const std::regex rocketfuel_weights_regex(ROCKETFUEL_WEIGHTS_LINE);
 
 /**
- * \brief Print node info
- * \param uid node ID
- * \param loc node location
- * \param dns is a DNS node ?
- * \param bb is a BB node ?
- * \param neighListSize size of neighbor list
- * \param name node name
- * \param radius node radius
+ * @brief Print node info
+ * @param uid node ID
+ * @param loc node location
+ * @param dns is a DNS node ?
+ * @param bb is a BB node ?
+ * @param neighListSize size of neighbor list
+ * @param name node name
+ * @param radius node radius
  */
 static inline void
 PrintNodeInfo(std::string& uid,
@@ -250,7 +250,7 @@
 
     sname = argv[0];
     tname = argv[1];
-    std::stod(argv[2], &endptr); // weight
+    double weight [[maybe_unused]] = std::stod(argv[2], &endptr);
 
     if (argv[2].size() != endptr)
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/topology-read/model/rocketfuel-topology-reader.h ns-3.44/src/topology-read/model/rocketfuel-topology-reader.h
--- ns-3.43/src/topology-read/model/rocketfuel-topology-reader.h	2024-10-09 16:41:10.096656600 -0700
+++ ns-3.44/src/topology-read/model/rocketfuel-topology-reader.h	2025-03-09 16:55:49.707372200 -0700
@@ -12,8 +12,8 @@
 #include "topology-reader.h"
 
 /**
- * \file
- * \ingroup topology
+ * @file
+ * @ingroup topology
  * ns3::RocketfuelTopologyReader declaration.
  */
 
@@ -23,9 +23,9 @@
 // ------------------------------------------------------------
 // --------------------------------------------
 /**
- * \ingroup topology
+ * @ingroup topology
  *
- * \brief Topology file reader (Rocketfuel-format type).
+ * @brief Topology file reader (Rocketfuel-format type).
  *
  * http://www.cs.washington.edu/research/networking/rocketfuel/
  *
@@ -37,8 +37,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId
+     * @brief Get the type ID.
+     * @return The object TypeId
      */
     static TypeId GetTypeId();
 
@@ -50,42 +50,42 @@
     RocketfuelTopologyReader& operator=(const RocketfuelTopologyReader&) = delete;
 
     /**
-     * \brief Main topology reading function.
+     * @brief Main topology reading function.
      *
      * This method opens an input stream and reads the Rocketfuel-format file.
      * Every row represents a topology link (the ids of a couple of nodes),
      * so the input file is read line by line to figure out how many links
      * and nodes are in the topology.
      *
-     * \return The container of the nodes created (or empty container if there was an error)
+     * @return The container of the nodes created (or empty container if there was an error)
      */
     NodeContainer Read() override;
 
   private:
     /**
-     * \brief Topology read function from a file containing the nodes map.
+     * @brief Topology read function from a file containing the nodes map.
      *
      * Parser for the *.cch file available at:
      * http://www.cs.washington.edu/research/networking/rocketfuel/maps/rocketfuel_maps_cch.tar.gz
      *
-     * \param [in] argv Argument vector.
-     * \return The container of the nodes created (or empty container if there was an error).
+     * @param [in] argv Argument vector.
+     * @return The container of the nodes created (or empty container if there was an error).
      */
     NodeContainer GenerateFromMapsFile(const std::vector<std::string>& argv);
 
     /**
-     * \brief Topology read function from a file containing the nodes weights.
+     * @brief Topology read function from a file containing the nodes weights.
      *
      * Parser for the weights.* file available at:
      * http://www.cs.washington.edu/research/networking/rocketfuel/maps/weights-dist.tar.gz
      *
-     * \param [in] argv Argument vector.
-     * \return The container of the nodes created (or empty container if there was an error).
+     * @param [in] argv Argument vector.
+     * @return The container of the nodes created (or empty container if there was an error).
      */
     NodeContainer GenerateFromWeightsFile(const std::vector<std::string>& argv);
 
     /**
-     * \brief Enum of the possible file types.
+     * @brief Enum of the possible file types.
      */
     enum RF_FileType
     {
@@ -95,10 +95,10 @@
     };
 
     /**
-     * \brief Classifies the file type according to its content.
+     * @brief Classifies the file type according to its content.
      *
-     * \param buf the first line of the file being read
-     * \return The file type (RF_MAPS, RF_WEIGHTS, or RF_UNKNOWN)
+     * @param buf the first line of the file being read
+     * @return The file type (RF_MAPS, RF_WEIGHTS, or RF_UNKNOWN)
      */
     RF_FileType GetFileType(const std::string& buf);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/topology-read/model/topology-reader.cc ns-3.44/src/topology-read/model/topology-reader.cc
--- ns-3.43/src/topology-read/model/topology-reader.cc	2024-10-09 16:41:10.096656600 -0700
+++ ns-3.44/src/topology-read/model/topology-reader.cc	2025-03-09 16:55:49.707372200 -0700
@@ -12,8 +12,8 @@
 #include "ns3/log.h"
 
 /**
- * \file
- * \ingroup topology
+ * @file
+ * @ingroup topology
  * ns3::TopologyReader implementation.
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/topology-read/model/topology-reader.h ns-3.44/src/topology-read/model/topology-reader.h
--- ns-3.43/src/topology-read/model/topology-reader.h	2024-10-09 16:41:10.096656600 -0700
+++ ns-3.44/src/topology-read/model/topology-reader.h	2025-03-09 16:55:49.707372200 -0700
@@ -18,8 +18,8 @@
 #include <string>
 
 /**
- * \file
- * \ingroup topology
+ * @file
+ * @ingroup topology
  * ns3::TopologyReader declaration.
  */
 
@@ -29,9 +29,9 @@
 class NodeContainer;
 
 /**
- * \ingroup topology
+ * @ingroup topology
  *
- * \brief Interface for input file readers management.
+ * @brief Interface for input file readers management.
  *
  * This interface perform the shared tasks among all possible input file readers.
  * Each different file format is handled by its own topology reader.
@@ -40,7 +40,7 @@
 {
   public:
     /**
-     * \brief Inner class holding the details about a link between two nodes.
+     * @brief Inner class holding the details about a link between two nodes.
      *
      * The link is not described in terms of technology. Rather it is only stating
      * an association between two nodes. The nodes are characterized also with names
@@ -50,16 +50,16 @@
     {
       public:
         /**
-         * \brief Constant iterator to scan the map of link attributes.
+         * @brief Constant iterator to scan the map of link attributes.
          */
         typedef std::map<std::string, std::string>::const_iterator ConstAttributesIterator;
 
         /**
-         * \brief Constructor.
-         * \param [in] fromPtr Ptr to the node the link is originating from.
-         * \param [in] fromName Name of the node the link is originating from.
-         * \param [in] toPtr Ptr to the node the link is directed to.
-         * \param [in] toName Name of the node the link is directed to.
+         * @brief Constructor.
+         * @param [in] fromPtr Ptr to the node the link is originating from.
+         * @param [in] fromName Name of the node the link is originating from.
+         * @param [in] toPtr Ptr to the node the link is directed to.
+         * @param [in] toName Name of the node the link is directed to.
          */
         Link(Ptr<Node> fromPtr,
              const std::string& fromName,
@@ -67,53 +67,53 @@
              const std::string& toName);
 
         /**
-         * \brief Returns a Ptr<Node> to the "from" node of the link.
-         * \return A Ptr<Node> to the "from" node of the link.
+         * @brief Returns a Ptr<Node> to the "from" node of the link.
+         * @return A Ptr<Node> to the "from" node of the link.
          */
         Ptr<Node> GetFromNode() const;
         /**
-         * \brief Returns the name of the "from" node of the link.
-         * \return The name of the "from" node of the link.
+         * @brief Returns the name of the "from" node of the link.
+         * @return The name of the "from" node of the link.
          */
         std::string GetFromNodeName() const;
         /**
-         * \brief Returns a Ptr<Node> to the "to" node of the link.
-         * \return A Ptr<Node> to the "to" node of the link.
+         * @brief Returns a Ptr<Node> to the "to" node of the link.
+         * @return A Ptr<Node> to the "to" node of the link.
          */
         Ptr<Node> GetToNode() const;
         /**
-         * \brief Returns the name of the "to" node of the link.
-         * \return The name of the "to" node of the link.
+         * @brief Returns the name of the "to" node of the link.
+         * @return The name of the "to" node of the link.
          */
         std::string GetToNodeName() const;
         /**
-         * \brief Returns the value of a link attribute. The attribute must exist.
-         * \param [in] name the name of the attribute.
-         * \return The value of the attribute.
+         * @brief Returns the value of a link attribute. The attribute must exist.
+         * @param [in] name the name of the attribute.
+         * @return The value of the attribute.
          */
         std::string GetAttribute(const std::string& name) const;
         /**
-         * \brief Returns the value of a link attribute.
-         * \param [in] name The name of the attribute.
-         * \param [out] value The value of the attribute.
+         * @brief Returns the value of a link attribute.
+         * @param [in] name The name of the attribute.
+         * @param [out] value The value of the attribute.
          *
-         * \return True if the attribute was defined, false otherwise.
+         * @return True if the attribute was defined, false otherwise.
          */
         bool GetAttributeFailSafe(const std::string& name, std::string& value) const;
         /**
-         * \brief Sets an arbitrary link attribute.
-         * \param [in] name The name of the attribute.
-         * \param [in] value The value of the attribute.
+         * @brief Sets an arbitrary link attribute.
+         * @param [in] name The name of the attribute.
+         * @param [in] value The value of the attribute.
          */
         void SetAttribute(const std::string& name, const std::string& value);
         /**
-         * \brief Returns an iterator to the begin of the attributes.
-         * \return A const iterator to the first attribute of a link.
+         * @brief Returns an iterator to the begin of the attributes.
+         * @return A const iterator to the first attribute of a link.
          */
         ConstAttributesIterator AttributesBegin() const;
         /**
-         * \brief Returns an iterator to the end of the attributes.
-         * \return A const iterator to the last attribute of a link.
+         * @brief Returns an iterator to the end of the attributes.
+         * @return A const iterator to the last attribute of a link.
          */
         ConstAttributesIterator AttributesEnd() const;
 
@@ -128,13 +128,13 @@
     };
 
     /**
-     * \brief Constant iterator to the list of the links.
+     * @brief Constant iterator to the list of the links.
      */
     typedef std::list<Link>::const_iterator ConstLinksIterator;
 
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
@@ -146,7 +146,7 @@
     TopologyReader& operator=(const TopologyReader&) = delete;
 
     /**
-     * \brief Main topology reading function.
+     * @brief Main topology reading function.
      *
      * The data is parsed and the results are returned in the passed lists.
      * The rationale behind this choice is to allow non-progressive node IDs
@@ -154,49 +154,49 @@
      * reader from the choices about actual IP number assignment and
      * kind of links between nodes.
      *
-     * \return The container of the nodes created (or null if there was an error).
+     * @return The container of the nodes created (or null if there was an error).
      */
     virtual NodeContainer Read() = 0;
 
     /**
-     * \brief Sets the input file name.
-     * \param [in] fileName The input file name.
+     * @brief Sets the input file name.
+     * @param [in] fileName The input file name.
      */
     void SetFileName(const std::string& fileName);
 
     /**
-     * \brief Returns the input file name.
-     * \return The input file name.
+     * @brief Returns the input file name.
+     * @return The input file name.
      */
     std::string GetFileName() const;
 
     /**
-     * \brief Returns an iterator to the the first link in this block.
-     * \return A const iterator to the first link in this block.
+     * @brief Returns an iterator to the the first link in this block.
+     * @return A const iterator to the first link in this block.
      */
     ConstLinksIterator LinksBegin() const;
 
     /**
-     * \brief Returns an iterator to the the last link in this block.
-     * \return A const iterator to the last link in this block.
+     * @brief Returns an iterator to the the last link in this block.
+     * @return A const iterator to the last link in this block.
      */
     ConstLinksIterator LinksEnd() const;
 
     /**
-     * \brief Returns the number of links in this block.
-     * \return The number of links in this block.
+     * @brief Returns the number of links in this block.
+     * @return The number of links in this block.
      */
     int LinksSize() const;
 
     /**
-     * \brief Checks if the block contains any links.
-     * \return True if there are no links in this block, false otherwise.
+     * @brief Checks if the block contains any links.
+     * @return True if there are no links in this block, false otherwise.
      */
     bool LinksEmpty() const;
 
     /**
-     * \brief Adds a link to the topology.
-     * \param link [in] The link to be added.
+     * @brief Adds a link to the topology.
+     * @param link [in] The link to be added.
      */
     void AddLink(Link link);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/topology-read/test/rocketfuel-topology-reader-test-suite.cc ns-3.44/src/topology-read/test/rocketfuel-topology-reader-test-suite.cc
--- ns-3.43/src/topology-read/test/rocketfuel-topology-reader-test-suite.cc	2024-10-09 16:41:10.096656600 -0700
+++ ns-3.44/src/topology-read/test/rocketfuel-topology-reader-test-suite.cc	2025-03-09 16:55:49.707372200 -0700
@@ -22,21 +22,21 @@
 using namespace ns3;
 
 /**
- * \defgroup topology-test Topology module tests
- * \ingroup topology
- * \ingroup tests
+ * @defgroup topology-test Topology module tests
+ * @ingroup topology
+ * @ingroup tests
  */
 
 /**
- * \file
- * \ingroup topology-test
+ * @file
+ * @ingroup topology-test
  * ns3::RockefuelTopologyReader test suite.
  */
 
 /**
- * \ingroup topology-test
+ * @ingroup topology-test
 
- * \brief Rocketfuel Topology Reader Weights Test
+ * @brief Rocketfuel Topology Reader Weights Test
  */
 class RocketfuelTopologyReaderWeightsTest : public TestCase
 {
@@ -78,8 +78,8 @@
 }
 
 /**
- * \ingroup topology-test
- * \brief Rocketfuel Topology Reader Maps Test
+ * @ingroup topology-test
+ * @brief Rocketfuel Topology Reader Maps Test
  */
 class RocketfuelTopologyReaderMapsTest : public TestCase
 {
@@ -121,9 +121,9 @@
 }
 
 /**
- * \ingroup topology-test
+ * @ingroup topology-test
  *
- * \brief Rocketfuel Topology Reader TestSuite
+ * @brief Rocketfuel Topology Reader TestSuite
  */
 class RocketfuelTopologyReaderTestSuite : public TestSuite
 {
@@ -141,7 +141,7 @@
 }
 
 /**
- * \ingroup topology-test
+ * @ingroup topology-test
  * Static variable for test initialization
  */
 static RocketfuelTopologyReaderTestSuite g_rocketfuelTopologyReaderTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/traffic-control/doc/fq-codel.rst ns-3.44/src/traffic-control/doc/fq-codel.rst
--- ns-3.43/src/traffic-control/doc/fq-codel.rst	2024-10-09 16:41:10.100656700 -0700
+++ ns-3.44/src/traffic-control/doc/fq-codel.rst	2025-03-09 16:55:49.707372200 -0700
@@ -48,7 +48,7 @@
 
   * ``FqCoDelQueueDisc::DoEnqueue()``: If no packet filter has been configured, this routine calls the QueueDiscItem::Hash() method to classify the given packet into an appropriate queue. Otherwise, the configured filters are used to classify the packet. If the filters are unable to classify the packet, the packet is dropped. Otherwise, an option is provided if set associative hashing is to be used.The packet is now handed over to the CoDel algorithm for timestamping. Then, if the queue is not currently active (i.e., if it is not in either the list of new or the list of old queues), it is added to the end of the list of new queues, and its deficit is initiated to the configured quantum. Otherwise,  the queue is left in its current queue list. Finally, the total number of enqueued packets is compared with the configured limit, and if it is above this value (which can happen since a packet was just enqueued), packets are dropped from the head of the queue with the largest current byte count until the number of dropped packets reaches the configured drop batch size or the backlog of the queue has been halved. Note that this in most cases means that the packet that was just enqueued is not among the packets that get dropped, which may even be from a different queue.
 
-  * ``FqCoDelQueueDisc::SetAssociativeHash()``: An outer hash is identified for the given packet. This corresponds to the set into which the packet is to be enqueued. A set consists of a group of queues. The set determined by outer hash is enumerated; if a queue corresponding to this packet's flow is found (we use per-queue tags to achieve this), or in case of an inactive queue, or if a new queue can be created for this set without exceeding the maximum limit, the index of this queue is returned. Otherwise, all queues of this full set are active and correspond to flows different from the current packet's flow. In such cases, the index of first queue of this set is returned. We don’t consider creating new queues for the packet in these cases, since this approach may waste resources in the long run. The situation highlighted is a guaranteed collision and cannot be avoided without increasing the overall number of queues.
+  * ``FqCoDelQueueDisc::SetAssociativeHash()``: An outer hash is identified for the given packet. This corresponds to the set into which the packet is to be enqueued. A set consists of a group of queues. The set determined by outer hash is enumerated; if a queue corresponding to this packet's flow is found (we use per-queue tags to achieve this), or in case of an inactive queue, or if a new queue can be created for this set without exceeding the maximum limit, the index of this queue is returned. Otherwise, all queues of this full set are active and correspond to flows different from the current packet's flow. In such cases, the index of first queue of this set is returned. We don't consider creating new queues for the packet in these cases, since this approach may waste resources in the long run. The situation highlighted is a guaranteed collision and cannot be avoided without increasing the overall number of queues.
 
   * ``FqCoDelQueueDisc::DoDequeue()``: The first task performed by this routine is selecting a queue from which to dequeue a packet. To this end, the scheduler first looks at the list of new queues; for the queue at the head of that list, if that queue has a negative deficit (i.e., it has already dequeued at least a quantum of bytes), it is given an additional amount of deficit, the queue is put onto the end of the list of old queues, and the routine selects the next queue and starts again. Otherwise, that queue is selected for dequeue. If the list of new queues is empty, the scheduler proceeds down the list of old queues in the same fashion (checking the deficit, and either selecting the queue for dequeuing, or increasing deficit and putting the queue back at the end of the list). After having selected a queue from which to dequeue a packet, the CoDel algorithm is invoked on that queue. As a result of this, one or more packets may be discarded from the head of the selected queue, before the packet that should be dequeued is returned (or nothing is returned if the queue is or becomes empty while being handled by the CoDel algorithm). Finally, if the CoDel algorithm does not return a packet, then the queue must be empty, and the scheduler does one of two things: if the queue selected for dequeue came from the list of new queues, it is moved to the end of the list of old queues.  If instead it came from the list of old queues, that queue is removed from the list, to be added back (as a new queue) the next time a packet for that queue arrives. Then (since no packet was available for dequeue), the whole dequeue process is restarted from the beginning. If, instead, the scheduler did get a packet back from the CoDel algorithm, it subtracts the size of the packet from the byte deficit for the selected queue and returns the packet as the result of the dequeue operation.
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/traffic-control/doc/traffic-control-layer.rst ns-3.44/src/traffic-control/doc/traffic-control-layer.rst
--- ns-3.43/src/traffic-control/doc/traffic-control-layer.rst	2024-10-09 16:41:10.100656700 -0700
+++ ns-3.44/src/traffic-control/doc/traffic-control-layer.rst	2025-03-09 16:55:49.707372200 -0700
@@ -70,7 +70,7 @@
 Node::AddDevice (network/model/node.cc:128) assigns an interface index to the
 device, calls NetDevice::SetNode, sets the receive callback of the device to
 Node::NonPromiscReceiveFromDevice. Then, it schedules NetDevice::Initialize() method at
-Seconds(0.0), then notify the registered DeviceAdditionListener handlers (not used BY ANYONE).
+Seconds(0), then notify the registered DeviceAdditionListener handlers (not used BY ANYONE).
 
 Node::NonPromiscReceiveFromDevice calls Node::ReceiveFromDevice.
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/traffic-control/examples/adaptive-red-tests.cc ns-3.44/src/traffic-control/examples/adaptive-red-tests.cc
--- ns-3.43/src/traffic-control/examples/adaptive-red-tests.cc	2024-10-09 16:41:10.100656700 -0700
+++ ns-3.44/src/traffic-control/examples/adaptive-red-tests.cc	2025-03-09 16:55:49.707372200 -0700
@@ -93,7 +93,7 @@
 /**
  * Check the queue disc size and write its stats to the output files.
  *
- * \param queue The queue to check.
+ * @param queue The queue to check.
  */
 void
 CheckQueueDiscSize(Ptr<QueueDisc> queue)
@@ -119,7 +119,7 @@
 /**
  * Setup the apps.
  *
- * \param test The test number.
+ * @param test The test number.
  */
 void
 BuildAppsTest(uint32_t test)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/traffic-control/examples/codel-vs-pfifo-asymmetric.cc ns-3.44/src/traffic-control/examples/codel-vs-pfifo-asymmetric.cc
--- ns-3.43/src/traffic-control/examples/codel-vs-pfifo-asymmetric.cc	2024-10-09 16:41:10.100656700 -0700
+++ ns-3.44/src/traffic-control/examples/codel-vs-pfifo-asymmetric.cc	2025-03-09 16:55:49.707372200 -0700
@@ -60,9 +60,9 @@
 /**
  * TCP Congestion window tracker.
  *
- * \param stream The output stream.
- * \param oldval Old value.
- * \param newval New value.
+ * @param stream The output stream.
+ * @param oldval Old value.
+ * @param newval New value.
  */
 static void
 CwndTracer(Ptr<OutputStreamWrapper> stream, uint32_t oldval, uint32_t newval)
@@ -73,7 +73,7 @@
 /**
  * Setup for TCP congestion window tracking.
  *
- * \param cwndTrFileName Congestion window output file name.
+ * @param cwndTrFileName Congestion window output file name.
  */
 static void
 TraceCwnd(std::string cwndTrFileName)
@@ -96,8 +96,8 @@
 /**
  * Traffic Control Sojourn tracker.
  *
- * \param stream The output stream.
- * \param newval New value.
+ * @param stream The output stream.
+ * @param newval New value.
  */
 static void
 SojournTracer(Ptr<OutputStreamWrapper> stream, Time newval)
@@ -108,7 +108,7 @@
 /**
  * Setup for Traffic Control Sojourn time tracking.
  *
- * \param sojournTrFileName Sojourn time output file name.
+ * @param sojournTrFileName Sojourn time output file name.
  */
 static void
 TraceSojourn(std::string sojournTrFileName)
@@ -131,9 +131,9 @@
 /**
  * Traffic Control Queue length tracker.
  *
- * \param stream The output stream.
- * \param oldval Old value.
- * \param newval New value.
+ * @param stream The output stream.
+ * @param oldval Old value.
+ * @param newval New value.
  */
 static void
 QueueLengthTracer(Ptr<OutputStreamWrapper> stream, uint32_t oldval, uint32_t newval)
@@ -144,7 +144,7 @@
 /**
  * Setup for Traffic Control Queue length tracking.
  *
- * \param queueLengthTrFileName Queue length output file name.
+ * @param queueLengthTrFileName Queue length output file name.
  */
 static void
 TraceQueueLength(std::string queueLengthTrFileName)
@@ -167,8 +167,8 @@
 /**
  * Traffic control drop trace.
  *
- * \param stream The output stream.
- * \param item The dropped item.
+ * @param stream The output stream.
+ * @param item The dropped item.
  */
 static void
 EveryDropTracer(Ptr<OutputStreamWrapper> stream, Ptr<const QueueDiscItem> item)
@@ -179,7 +179,7 @@
 /**
  * Setup for Traffic Control drop tracking.
  *
- * \param everyDropTrFileName TC drop output file name.
+ * @param everyDropTrFileName TC drop output file name.
  */
 static void
 TraceEveryDrop(std::string everyDropTrFileName)
@@ -202,9 +202,9 @@
 /**
  * Traffic Control Dropping state trace.
  *
- * \param stream The output stream.
- * \param oldVal Old value.
- * \param newVal New value.
+ * @param stream The output stream.
+ * @param oldVal Old value.
+ * @param newVal New value.
  */
 static void
 DroppingStateTracer(Ptr<OutputStreamWrapper> stream, bool oldVal, bool newVal)
@@ -224,7 +224,7 @@
 /**
  * Setup for Traffic Control dropping tracking.
  *
- * \param dropStateTrFileName TC drop state output file name.
+ * @param dropStateTrFileName TC drop state output file name.
  */
 static void
 TraceDroppingState(std::string dropStateTrFileName)
@@ -247,10 +247,10 @@
 /**
  * Create a Bulk Flow application
  *
- * \param remoteAddress Remote address.
- * \param sender Sender node.
- * \param pktSize Packet size.
- * \param stopTime Stop time.
+ * @param remoteAddress Remote address.
+ * @param sender Sender node.
+ * @param pktSize Packet size.
+ * @param stopTime Stop time.
  */
 void
 CreateBulkFlow(AddressValue remoteAddress, Ptr<Node> sender, uint32_t pktSize, float stopTime)
@@ -267,9 +267,9 @@
 /**
  * Create a On Off Flow application.
  *
- * \param remoteAddress Remote address.
- * \param sender Sender node.
- * \param stopTime Stop time.
+ * @param remoteAddress Remote address.
+ * @param sender Sender node.
+ * @param stopTime Stop time.
  */
 void
 CreateOnOffFlow(AddressValue remoteAddress, Ptr<Node> sender, float stopTime)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/traffic-control/examples/codel-vs-pfifo-basic-test.cc ns-3.44/src/traffic-control/examples/codel-vs-pfifo-basic-test.cc
--- ns-3.43/src/traffic-control/examples/codel-vs-pfifo-basic-test.cc	2024-10-09 16:41:10.100656700 -0700
+++ ns-3.44/src/traffic-control/examples/codel-vs-pfifo-basic-test.cc	2025-03-09 16:55:49.707372200 -0700
@@ -46,9 +46,9 @@
 /**
  * Function called when Congestion Window is changed.
  *
- * \param stream Output stream.
- * \param oldval Old value.
- * \param newval New value.
+ * @param stream Output stream.
+ * @param oldval Old value.
+ * @param newval New value.
  */
 static void
 CwndTracer(Ptr<OutputStreamWrapper> stream, uint32_t oldval, uint32_t newval)
@@ -61,7 +61,7 @@
  *
  * Note that you can not hook to the trace before the socket is created.
  *
- * \param cwndTrFileName Name of the output file.
+ * @param cwndTrFileName Name of the output file.
  */
 static void
 TraceCwnd(std::string cwndTrFileName)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/traffic-control/examples/pfifo-vs-red.cc ns-3.44/src/traffic-control/examples/pfifo-vs-red.cc
--- ns-3.43/src/traffic-control/examples/pfifo-vs-red.cc	2024-10-09 16:41:10.100656700 -0700
+++ ns-3.44/src/traffic-control/examples/pfifo-vs-red.cc	2025-03-09 16:55:49.707372200 -0700
@@ -139,8 +139,8 @@
     {
         sinkApps.Add(packetSinkHelper.Install(d.GetLeft(i)));
     }
-    sinkApps.Start(Seconds(0.0));
-    sinkApps.Stop(Seconds(30.0));
+    sinkApps.Start(Seconds(0));
+    sinkApps.Stop(Seconds(30));
 
     ApplicationContainer clientApps;
     for (uint32_t i = 0; i < d.RightCount(); ++i)
@@ -150,8 +150,8 @@
         clientHelper.SetAttribute("Remote", remoteAddress);
         clientApps.Add(clientHelper.Install(d.GetRight(i)));
     }
-    clientApps.Start(Seconds(1.0)); // Start 1 second after sink
-    clientApps.Stop(Seconds(15.0)); // Stop before the sink
+    clientApps.Start(Seconds(1)); // Start 1 second after sink
+    clientApps.Stop(Seconds(15)); // Stop before the sink
 
     Ipv4GlobalRoutingHelper::PopulateRoutingTables();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/traffic-control/examples/red-tests.cc ns-3.44/src/traffic-control/examples/red-tests.cc
--- ns-3.43/src/traffic-control/examples/red-tests.cc	2024-10-09 16:41:10.100656700 -0700
+++ ns-3.44/src/traffic-control/examples/red-tests.cc	2025-03-09 16:55:49.707372200 -0700
@@ -67,7 +67,7 @@
 /**
  * Check the queue size and write its stats to the output files.
  *
- * \param queue The queue to check.
+ * @param queue The queue to check.
  */
 void
 CheckQueueSize(Ptr<QueueDisc> queue)
@@ -92,7 +92,7 @@
 /**
  * Setup the apps.
  *
- * \param test The test number.
+ * @param test The test number.
  */
 void
 BuildAppsTest(uint32_t test)
@@ -140,7 +140,7 @@
         ApplicationContainer clientApps2;
         clientHelper2.SetAttribute("Remote", remoteAddress);
         clientApps2.Add(clientHelper2.Install(n1n2.Get(0)));
-        clientApps2.Start(Seconds(3.0));
+        clientApps2.Start(Seconds(3));
         clientApps2.Stop(Seconds(client_stop_time));
     }
     else // 4 or 5
@@ -208,7 +208,7 @@
         AddressValue remoteAddress2(InetSocketAddress(i3i5.GetAddress(1), port2));
         clientHelper2.SetAttribute("Remote", remoteAddress2);
         clientApps2.Add(clientHelper2.Install(n1n2.Get(0)));
-        clientApps2.Start(Seconds(2.0));
+        clientApps2.Start(Seconds(2));
         clientApps2.Stop(Seconds(client_stop_time));
 
         // Connection #3
@@ -240,7 +240,7 @@
         AddressValue remoteAddress4(InetSocketAddress(i1i2.GetAddress(0), port4));
         clientHelper4.SetAttribute("Remote", remoteAddress4);
         clientApps4.Add(clientHelper4.Install(n3n5.Get(1)));
-        clientApps4.Start(Seconds(1.0));
+        clientApps4.Start(Seconds(1));
         clientApps4.Stop(Seconds(client_stop_time));
     }
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/traffic-control/examples/red-vs-ared.cc ns-3.44/src/traffic-control/examples/red-vs-ared.cc
--- ns-3.43/src/traffic-control/examples/red-vs-ared.cc	2024-10-09 16:41:10.100656700 -0700
+++ ns-3.44/src/traffic-control/examples/red-vs-ared.cc	2025-03-09 16:55:49.707372200 -0700
@@ -139,8 +139,8 @@
     {
         sinkApps.Add(packetSinkHelper.Install(d.GetLeft(i)));
     }
-    sinkApps.Start(Seconds(0.0));
-    sinkApps.Stop(Seconds(30.0));
+    sinkApps.Start(Seconds(0));
+    sinkApps.Stop(Seconds(30));
 
     ApplicationContainer clientApps;
     for (uint32_t i = 0; i < d.RightCount(); ++i)
@@ -150,8 +150,8 @@
         clientHelper.SetAttribute("Remote", remoteAddress);
         clientApps.Add(clientHelper.Install(d.GetRight(i)));
     }
-    clientApps.Start(Seconds(1.0)); // Start 1 second after sink
-    clientApps.Stop(Seconds(15.0)); // Stop before the sink
+    clientApps.Start(Seconds(1)); // Start 1 second after sink
+    clientApps.Stop(Seconds(15)); // Stop before the sink
 
     Ipv4GlobalRoutingHelper::PopulateRoutingTables();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/traffic-control/helper/queue-disc-container.h ns-3.44/src/traffic-control/helper/queue-disc-container.h
--- ns-3.43/src/traffic-control/helper/queue-disc-container.h	2024-10-09 16:41:10.100656700 -0700
+++ ns-3.44/src/traffic-control/helper/queue-disc-container.h	2025-03-09 16:55:49.707372200 -0700
@@ -18,9 +18,9 @@
 {
 
 /**
- * \ingroup traffic-control
+ * @ingroup traffic-control
  *
- * \brief Holds a vector of ns3::QueueDisc pointers.
+ * @brief Holds a vector of ns3::QueueDisc pointers.
  *
  * Typically ns-3 QueueDiscs are installed on net devices using a traffic control
  * helper. The helper Install method takes a NetDeviceContainer which holds
@@ -43,7 +43,7 @@
     QueueDiscContainer();
 
     /**
-     * \param qDisc a queue disc to add to the container
+     * @param qDisc a queue disc to add to the container
      *
      * Create a QueueDiscContainer with exactly one queue disc that has previously
      * been instantiated
@@ -51,7 +51,7 @@
     QueueDiscContainer(Ptr<QueueDisc> qDisc);
 
     /**
-     * \brief Get a const iterator which refers to the first QueueDisc in the
+     * @brief Get a const iterator which refers to the first QueueDisc in the
      * container.
      *
      * QueueDiscs can be retrieved from the container in two ways. First,
@@ -59,20 +59,20 @@
      * This method is used in the iterator method and is typically used in a
      * for-loop to run through the QueueDiscs
      *
-     * \code
+     * @code
      *   QueueDiscContainer::ConstIterator i;
      *   for (i = container.Begin (); i != container.End (); ++i)
      *     {
      *       (*i)->method ();  // some QueueDisc method
      *     }
-     * \endcode
+     * @endcode
      *
-     * \returns a const iterator which refers to the first QueueDisc in the container.
+     * @returns a const iterator which refers to the first QueueDisc in the container.
      */
     ConstIterator Begin() const;
 
     /**
-     * \brief Get a const iterator which indicates past-the-last QueueDisc in the
+     * @brief Get a const iterator which indicates past-the-last QueueDisc in the
      * container.
      *
      * QueueDiscs can be retrieved from the container in two ways. First,
@@ -80,20 +80,20 @@
      * This method is used in the iterator method and is typically used in a
      * for-loop to run through the QueueDiscs
      *
-     * \code
+     * @code
      *   QueueDiscContainer::ConstIterator i;
      *   for (i = container.Begin (); i != container.End (); ++i)
      *     {
      *       (*i)->method ();  // some QueueDisc method
      *     }
-     * \endcode
+     * @endcode
      *
-     * \returns a const iterator which indicates an ending condition for a loop.
+     * @returns a const iterator which indicates an ending condition for a loop.
      */
     ConstIterator End() const;
 
     /**
-     * \brief Get the number of Ptr<QueueDisc> stored in this container.
+     * @brief Get the number of Ptr<QueueDisc> stored in this container.
      *
      * QueueDiscs can be retrieved from the container in two ways. First,
      * directly by an index into the container, and second, using an iterator.
@@ -101,21 +101,21 @@
      * define an ending condition in a for-loop that runs through the stored
      * QueueDiscs
      *
-     * \code
+     * @code
      *   uint32_t nQueueDiscs = container.GetN ();
      *   for (uint32_t i = 0 i < nQueueDiscs; ++i)
      *     {
      *       Ptr<QueueDisc> p = container.Get (i)
      *       i->method ();  // some QueueDisc method
      *     }
-     * \endcode
+     * @endcode
      *
-     * \returns the number of Ptr<QueueDisc> stored in this container.
+     * @returns the number of Ptr<QueueDisc> stored in this container.
      */
     std::size_t GetN() const;
 
     /**
-     * \brief Get the Ptr<QueueDisc> stored in this container at a given
+     * @brief Get the Ptr<QueueDisc> stored in this container at a given
      * index.
      *
      * QueueDiscs can be retrieved from the container in two ways. First,
@@ -123,32 +123,32 @@
      * This method is used in the direct method and is used to retrieve the
      * indexed Ptr<QueueDisc>.
      *
-     * \code
+     * @code
      *   uint32_t nQueueDiscs = container.GetN ();
      *   for (uint32_t i = 0 i < nQueueDiscs; ++i)
      *     {
      *       Ptr<QueueDisc> p = container.Get (i)
      *       i->method ();  // some QueueDisc method
      *     }
-     * \endcode
+     * @endcode
      *
-     * \param i the index of the requested queue disc pointer.
-     * \returns the requested queue disc pointer.
+     * @param i the index of the requested queue disc pointer.
+     * @returns the requested queue disc pointer.
      */
     Ptr<QueueDisc> Get(std::size_t i) const;
 
     /**
-     * \brief Append the contents of another QueueDiscContainer to the end of
+     * @brief Append the contents of another QueueDiscContainer to the end of
      * this container.
      *
-     * \param other The QueueDiscContainer to append.
+     * @param other The QueueDiscContainer to append.
      */
     void Add(QueueDiscContainer other);
 
     /**
-     * \brief Append a single Ptr<QueueDisc> to this container.
+     * @brief Append a single Ptr<QueueDisc> to this container.
      *
-     * \param qDisc The Ptr<QueueDisc> to append.
+     * @param qDisc The Ptr<QueueDisc> to append.
      */
     void Add(Ptr<QueueDisc> qDisc);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/traffic-control/helper/traffic-control-helper.h ns-3.44/src/traffic-control/helper/traffic-control-helper.h
--- ns-3.43/src/traffic-control/helper/traffic-control-helper.h	2024-10-09 16:41:10.100656700 -0700
+++ ns-3.44/src/traffic-control/helper/traffic-control-helper.h	2025-03-09 16:55:49.707372200 -0700
@@ -22,7 +22,7 @@
 {
 
 /**
- * \ingroup traffic-control
+ * @ingroup traffic-control
  *
  * This class stores object factories required to create a queue disc and all of
  * its components (packet filters, internal queues, classes).
@@ -31,9 +31,9 @@
 {
   public:
     /**
-     * \brief Constructor
+     * @brief Constructor
      *
-     * \param factory the factory used to create this queue disc
+     * @param factory the factory used to create this queue disc
      */
     QueueDiscFactory(ObjectFactory factory);
 
@@ -45,40 +45,40 @@
     QueueDiscFactory() = delete;
 
     /**
-     * \brief Add a factory to create an internal queue
+     * @brief Add a factory to create an internal queue
      *
-     * \param factory the factory used to create an internal queue
+     * @param factory the factory used to create an internal queue
      */
     void AddInternalQueue(ObjectFactory factory);
 
     /**
-     * \brief Add a factory to create a packet filter
+     * @brief Add a factory to create a packet filter
      *
-     * \param factory the factory used to create a packet filter
+     * @param factory the factory used to create a packet filter
      */
     void AddPacketFilter(ObjectFactory factory);
 
     /**
-     * \brief Add a factory to create a queue disc class
+     * @brief Add a factory to create a queue disc class
      *
-     * \param factory the factory used to create a queue disc class
-     * \return the class ID of the created queue disc class
+     * @param factory the factory used to create a queue disc class
+     * @return the class ID of the created queue disc class
      */
     uint16_t AddQueueDiscClass(ObjectFactory factory);
 
     /**
-     * \brief Set the (child) queue disc to attach to a class
+     * @brief Set the (child) queue disc to attach to a class
      *
-     * \param classId the id of the class to attach a child queue disc to
-     * \param handle the handle of the child queue disc to attach to the class
+     * @param classId the id of the class to attach a child queue disc to
+     * @param handle the handle of the child queue disc to attach to the class
      */
     void SetChildQueueDisc(uint16_t classId, uint16_t handle);
 
     /**
-     * \brief Create a queue disc with the currently stored configuration.
+     * @brief Create a queue disc with the currently stored configuration.
      *
-     * \param queueDiscs the vector of queue discs held by the helper
-     * \return the created queue disc
+     * @param queueDiscs the vector of queue discs held by the helper
+     * @return the created queue disc
      */
     Ptr<QueueDisc> CreateQueueDisc(const std::vector<Ptr<QueueDisc>>& queueDiscs);
 
@@ -96,9 +96,9 @@
 };
 
 /**
- * \ingroup traffic-control
+ * @ingroup traffic-control
  *
- * \brief Build a set of QueueDisc objects
+ * @brief Build a set of QueueDisc objects
  *
  * This class can help to create QueueDisc objects and map them to
  * the corresponding devices. This map is stored at the Traffic Control
@@ -118,8 +118,8 @@
     }
 
     /**
-     * \param nTxQueues the number of Tx queue disc classes
-     * \returns a new TrafficControlHelper with a default configuration
+     * @param nTxQueues the number of Tx queue disc classes
+     * @returns a new TrafficControlHelper with a default configuration
      *
      * The default configuration is an FqCoDelQueueDisc, if the device has a single
      * queue, or an MqQueueDisc with as many FqCoDelQueueDiscs as the number of
@@ -132,10 +132,10 @@
      * given attributes. To set the InternalQueueList, PacketFilterList and ChildQueueDiscList
      * attributes, use the AddInternalQueue, AddPacketFilter and AddChildQueueDisc methods.
      *
-     * \tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
-     * \param type the type of queue disc
-     * \param args A sequence of name-value pairs of the attributes to set.
-     * \return the handle of the root queue disc (zero)
+     * @tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
+     * @param type the type of queue disc
+     * @param args A sequence of name-value pairs of the attributes to set.
+     * @return the handle of the root queue disc (zero)
      */
     template <typename... Args>
     uint16_t SetRootQueueDisc(const std::string& type, Args&&... args);
@@ -144,11 +144,11 @@
      * Helper function used to add the given number of internal queues (of the given
      * type and with the given attributes) to the queue disc having the given handle.
      *
-     * \tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
-     * \param handle the handle of the parent queue disc
-     * \param count the number of queues to add
-     * \param type the type of queue
-     * \param args A sequence of name-value pairs of the attributes to set.
+     * @tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
+     * @param handle the handle of the parent queue disc
+     * @param count the number of queues to add
+     * @param type the type of queue
+     * @param args A sequence of name-value pairs of the attributes to set.
      */
     template <typename... Args>
     void AddInternalQueues(uint16_t handle, uint16_t count, std::string type, Args&&... args);
@@ -157,10 +157,10 @@
      * Helper function used to add a packet filter (of the given type and with
      * the given attributes) to the queue disc having the given handle.
      *
-     * \tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
-     * \param handle the handle of the parent queue disc
-     * \param type the type of packet filter
-     * \param args A sequence of name-value pairs of the attributes to set.
+     * @tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
+     * @param handle the handle of the parent queue disc
+     * @param type the type of packet filter
+     * @param args A sequence of name-value pairs of the attributes to set.
      */
     template <typename... Args>
     void AddPacketFilter(uint16_t handle, const std::string& type, Args&&... args);
@@ -174,12 +174,12 @@
      * Helper function used to add the given number of queue disc classes (of the given
      * type and with the given attributes) to the queue disc having the given handle.
      *
-     * \tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
-     * \param handle the handle of the parent queue disc
-     * \param count the number of queue disc classes to add
-     * \param type the type of queue disc class
-     * \param args A sequence of name-value pairs of the attributes to set.
-     * \return the list of class IDs
+     * @tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
+     * @param handle the handle of the parent queue disc
+     * @param count the number of queue disc classes to add
+     * @param type the type of queue disc class
+     * @param args A sequence of name-value pairs of the attributes to set.
+     * @return the list of class IDs
      */
     template <typename... Args>
     ClassIdList AddQueueDiscClasses(uint16_t handle,
@@ -192,12 +192,12 @@
      * the given attributes) to a given class (included in the queue disc
      * having the given handle).
      *
-     * \tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
-     * \param handle the handle of the parent queue disc
-     * \param classId the class ID of the class to attach the queue disc to
-     * \param type the type of queue disc
-     * \param args A sequence of name-value pairs of the attributes to set.
-     * \return the handle of the created child queue disc
+     * @tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
+     * @param handle the handle of the parent queue disc
+     * @param classId the class ID of the class to attach the queue disc to
+     * @param type the type of queue disc
+     * @param args A sequence of name-value pairs of the attributes to set.
+     * @return the handle of the created child queue disc
      */
     template <typename... Args>
     uint16_t AddChildQueueDisc(uint16_t handle,
@@ -215,12 +215,12 @@
      * the given attributes) to each of the given classes (included in the queue disc
      * having the given handle).
      *
-     * \tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
-     * \param handle the handle of the parent queue disc
-     * \param classes the class IDs of the classes to attach a queue disc to
-     * \param type the type of queue disc
-     * \param args A sequence of name-value pairs of the attributes to set.
-     * \return the list of handles of the created child queue discs
+     * @tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
+     * @param handle the handle of the parent queue disc
+     * @param classes the class IDs of the classes to attach a queue disc to
+     * @param type the type of queue disc
+     * @param args A sequence of name-value pairs of the attributes to set.
+     * @return the list of handles of the created child queue discs
      */
     template <typename... Args>
     HandleList AddChildQueueDiscs(uint16_t handle,
@@ -232,16 +232,16 @@
      * Helper function used to add a queue limits object to the transmission
      * queues of the devices
      *
-     * \tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
-     * \param type the type of queue
-     * \param args A sequence of name-value pairs of the attributes to set.
+     * @tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
+     * @param type the type of queue
+     * @param args A sequence of name-value pairs of the attributes to set.
      */
     template <typename... Args>
     void SetQueueLimits(std::string type, Args&&... args);
 
     /**
-     * \param c set of devices
-     * \returns a QueueDisc container with the root queue discs installed on the devices
+     * @param c set of devices
+     * @returns a QueueDisc container with the root queue discs installed on the devices
      *
      * This method creates a QueueDisc object of the type and with the
      * attributes configured by TrafficControlHelper::SetQueueDisc for
@@ -257,8 +257,8 @@
     QueueDiscContainer Install(NetDeviceContainer c);
 
     /**
-     * \param d device
-     * \returns a QueueDisc container with the root queue disc installed on the device
+     * @param d device
+     * @returns a QueueDisc container with the root queue disc installed on the device
      *
      * This method creates the queue discs (along with their packet filters,
      * internal queues, classes) configured with the methods provided by this
@@ -268,7 +268,7 @@
     QueueDiscContainer Install(Ptr<NetDevice> d);
 
     /**
-     * \param c set of devices
+     * @param c set of devices
      *
      * This method removes the root queue discs (and associated filters, classes
      * and queues) installed on the given devices.
@@ -282,7 +282,7 @@
     void Uninstall(NetDeviceContainer c);
 
     /**
-     * \param d device
+     * @param d device
      *
      * This method removes the root queue disc (and associated filters, classes
      * and queues) installed on the given device.
@@ -299,55 +299,55 @@
     /**
      * Actual implementation of the SetRootQueueDisc method.
      *
-     * \param factory the factory used to create the root queue disc
-     * \returns zero on success
+     * @param factory the factory used to create the root queue disc
+     * @returns zero on success
      */
     uint16_t DoSetRootQueueDisc(ObjectFactory factory);
 
     /**
      * Actual implementation of the AddInternalQueues method.
      *
-     * \param handle the handle of the parent queue disc
-     * \param count the number of queues to add
-     * \param factory the factory used to add internal queues
+     * @param handle the handle of the parent queue disc
+     * @param count the number of queues to add
+     * @param factory the factory used to add internal queues
      */
     void DoAddInternalQueues(uint16_t handle, uint16_t count, ObjectFactory factory);
 
     /**
      * Actual implementation of the AddPacketFilter method.
      *
-     * \param handle the handle of the parent queue disc
-     * \param factory the factory used to add a packet filter
+     * @param handle the handle of the parent queue disc
+     * @param factory the factory used to add a packet filter
      */
     void DoAddPacketFilter(uint16_t handle, ObjectFactory factory);
 
     /**
      * Actual implementation of the AddQueueDiscClasses method.
      *
-     * \param handle the handle of the parent queue disc
-     * \param count the number of queue disc classes to add
-     * \param factory the factory used to add queue disc classes
-     * \return the list of class IDs
+     * @param handle the handle of the parent queue disc
+     * @param count the number of queue disc classes to add
+     * @param factory the factory used to add queue disc classes
+     * @return the list of class IDs
      */
     ClassIdList DoAddQueueDiscClasses(uint16_t handle, uint16_t count, ObjectFactory factory);
 
     /**
      * Actual implementation of the AddChildQueueDisc method.
      *
-     * \param handle the handle of the parent queue disc
-     * \param classId the class ID of the class to attach the queue disc to
-     * \param factory the factory used to add a child queue disc
-     * \return the handle of the created child queue disc
+     * @param handle the handle of the parent queue disc
+     * @param classId the class ID of the class to attach the queue disc to
+     * @param factory the factory used to add a child queue disc
+     * @return the handle of the created child queue disc
      */
     uint16_t DoAddChildQueueDisc(uint16_t handle, uint16_t classId, ObjectFactory factory);
 
     /**
      * Actual implementation of the AddChildQueueDiscs method.
      *
-     * \param handle the handle of the parent queue disc
-     * \param classes the class IDs of the classes to attach a queue disc to
-     * \param factory the factory used to add child queue discs
-     * \return the list of handles of the created child queue discs
+     * @param handle the handle of the parent queue disc
+     * @param classes the class IDs of the classes to attach a queue disc to
+     * @param factory the factory used to add child queue discs
+     * @return the list of handles of the created child queue discs
      */
     HandleList DoAddChildQueueDiscs(uint16_t handle,
                                     const ClassIdList& classes,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/traffic-control/model/cobalt-queue-disc.cc ns-3.44/src/traffic-control/model/cobalt-queue-disc.cc
--- ns-3.43/src/traffic-control/model/cobalt-queue-disc.cc	2024-10-09 16:41:10.100656700 -0700
+++ ns-3.44/src/traffic-control/model/cobalt-queue-disc.cc	2025-03-09 16:55:49.707372200 -0700
@@ -110,9 +110,9 @@
 /**
  * Performs a reciprocal divide, similar to the
  * Linux kernel reciprocal_divide function
- * \param A numerator
- * \param R reciprocal of the denominator B
- * \return the value of A/B
+ * @param A numerator
+ * @param R reciprocal of the denominator B
+ * @return the value of A/B
  */
 /* borrowed from the linux kernel */
 static inline uint32_t
@@ -123,7 +123,7 @@
 
 /**
  * Returns the current time translated in CoDel time representation
- * \return the current time
+ * @return the current time
  */
 static int64_t
 CoDelGetTime()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/traffic-control/model/cobalt-queue-disc.h ns-3.44/src/traffic-control/model/cobalt-queue-disc.h
--- ns-3.43/src/traffic-control/model/cobalt-queue-disc.h	2024-10-09 16:41:10.100656700 -0700
+++ ns-3.44/src/traffic-control/model/cobalt-queue-disc.h	2025-03-09 16:55:49.707372200 -0700
@@ -37,9 +37,9 @@
 class TraceContainer;
 
 /**
- * \ingroup traffic-control
+ * @ingroup traffic-control
  *
- * \brief Cobalt packet queue disc
+ * @brief Cobalt packet queue disc
  *
  * Cobalt uses CoDel and BLUE algorithms in parallel, in order
  * to obtain the best features of each. CoDel is excellent on flows
@@ -50,43 +50,43 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief CobaltQueueDisc Constructor
+     * @brief CobaltQueueDisc Constructor
      *
      * Create a Cobalt queue disc
      */
     CobaltQueueDisc();
 
     /**
-     * \brief Destructor
+     * @brief Destructor
      *
      * Destructor
      */
     ~CobaltQueueDisc() override;
 
     /**
-     * \brief Get the target queue delay
+     * @brief Get the target queue delay
      *
-     * \returns The target queue delay
+     * @returns The target queue delay
      */
     Time GetTarget() const;
 
     /**
-     * \brief Get the interval
+     * @brief Get the interval
      *
-     * \returns The interval
+     * @returns The interval
      */
     Time GetInterval() const;
 
     /**
-     * \brief Get the time for next packet drop while in the dropping state
+     * @brief Get the time for next packet drop while in the dropping state
      *
-     * \returns The time (in microseconds) for next packet drop
+     * @returns The time (in microseconds) for next packet drop
      */
     int64_t GetDropNext() const;
 
@@ -99,9 +99,9 @@
         "CE threshold exceeded mark"; //!< Sojourn time above CE threshold
 
     /**
-     * \brief Get the drop probability of Blue
+     * @brief Get the drop probability of Blue
      *
-     * \returns The current value of Blue's drop probability
+     * @returns The current value of Blue's drop probability
      */
     double GetPdrop() const;
 
@@ -110,8 +110,8 @@
      * used by this model.  Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream);
 
@@ -125,7 +125,7 @@
 
   protected:
     /**
-     * \brief Dispose of the object
+     * @brief Dispose of the object
      */
     void DoDispose() override;
 
@@ -136,30 +136,30 @@
     bool CheckConfig() override;
 
     /**
-     * \brief Initialize the queue parameters.
+     * @brief Initialize the queue parameters.
      */
     void InitializeParams() override;
 
     /**
-     * \brief Calculate the reciprocal square root of m_count by using Newton's method
+     * @brief Calculate the reciprocal square root of m_count by using Newton's method
      *  http://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Iterative_methods_for_reciprocal_square_roots
      * m_recInvSqrt (new) = (m_recInvSqrt (old) / 2) * (3 - m_count * m_recInvSqrt^2)
      */
     void NewtonStep();
 
     /**
-     * \brief Determine the time for next drop
+     * @brief Determine the time for next drop
      * CoDel control law is t + m_interval/sqrt(m_count).
      * Here, we use m_recInvSqrt calculated by Newton's method in NewtonStep() to avoid
      * both sqrt() and divide operations
      *
-     * \param t Current next drop time
-     * \returns The new next drop time:
+     * @param t Current next drop time
+     * @returns The new next drop time:
      */
     int64_t ControlLaw(int64_t t);
 
     /**
-     * \brief Updates the inverse square root
+     * @brief Updates the inverse square root
      */
     void InvSqrt();
 
@@ -194,13 +194,13 @@
 
     /**
      * Called when the queue becomes full to alter the drop probabilities of Blue
-     * \param now time in CoDel time units (microseconds)
+     * @param now time in CoDel time units (microseconds)
      */
     void CobaltQueueFull(int64_t now);
 
     /**
      * Called when the queue becomes empty to alter the drop probabilities of Blue
-     * \param now time in CoDel time units (microseconds)
+     * @param now time in CoDel time units (microseconds)
      */
     void CobaltQueueEmpty(int64_t now);
 
@@ -208,9 +208,9 @@
      * Called to decide whether the current packet should be dropped based on decisions taken by
      * Blue and Codel working parallelly
      *
-     * \return true if the packet should be dropped, false otherwise
-     * \param item current packet
-     * \param now time in CoDel time units (microseconds)
+     * @return true if the packet should be dropped, false otherwise
+     * @param item current packet
+     * @param now time in CoDel time units (microseconds)
      */
     bool CobaltShouldDrop(Ptr<QueueDiscItem> item, int64_t now);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/traffic-control/model/codel-queue-disc.cc ns-3.44/src/traffic-control/model/codel-queue-disc.cc
--- ns-3.43/src/traffic-control/model/codel-queue-disc.cc	2024-10-09 16:41:10.100656700 -0700
+++ ns-3.44/src/traffic-control/model/codel-queue-disc.cc	2025-03-09 16:55:49.707372200 -0700
@@ -31,9 +31,9 @@
 /**
  * Performs a reciprocal divide, similar to the
  * Linux kernel reciprocal_divide function
- * \param A numerator
- * \param R reciprocal of the denominator B
- * \return the value of A/B
+ * @param A numerator
+ * @param R reciprocal of the denominator B
+ * @return the value of A/B
  */
 /* borrowed from the linux kernel */
 static inline uint32_t
@@ -46,7 +46,7 @@
 
 /**
  * Returns the current time translated in CoDel time representation
- * \return the current time
+ * @return the current time
  */
 static uint32_t
 CoDelGetTime()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/traffic-control/model/codel-queue-disc.h ns-3.44/src/traffic-control/model/codel-queue-disc.h
--- ns-3.43/src/traffic-control/model/codel-queue-disc.h	2024-10-09 16:41:10.100656700 -0700
+++ ns-3.44/src/traffic-control/model/codel-queue-disc.h	2025-03-09 16:55:49.707372200 -0700
@@ -44,9 +44,9 @@
 class TraceContainer;
 
 /**
- * \ingroup traffic-control
+ * @ingroup traffic-control
  *
- * \brief A CoDel packet queue disc
+ * @brief A CoDel packet queue disc
  */
 
 class CoDelQueueDisc : public QueueDisc
@@ -54,13 +54,13 @@
   public:
     /**
      * Get the type ID.
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief CoDelQueueDisc Constructor
+     * @brief CoDelQueueDisc Constructor
      *
      * Creates a CoDel queue
      */
@@ -69,23 +69,23 @@
     ~CoDelQueueDisc() override;
 
     /**
-     * \brief Get the target queue delay
+     * @brief Get the target queue delay
      *
-     * \returns The target queue delay
+     * @returns The target queue delay
      */
     Time GetTarget();
 
     /**
-     * \brief Get the interval
+     * @brief Get the interval
      *
-     * \returns The interval
+     * @returns The interval
      */
     Time GetInterval();
 
     /**
-     * \brief Get the time for next packet drop while in the dropping state
+     * @brief Get the time for next packet drop while in the dropping state
      *
-     * \returns The time for next packet drop
+     * @returns The time for next packet drop
      */
     uint32_t GetDropNext();
 
@@ -103,56 +103,56 @@
     friend class ::CoDelQueueDiscNewtonStepTest; // Test code
     friend class ::CoDelQueueDiscControlLawTest; // Test code
     /**
-     * \brief Add a packet to the queue
+     * @brief Add a packet to the queue
      *
-     * \param item The item to be added
-     * \returns True if the packet can be added, False if the packet is dropped due to full queue
+     * @param item The item to be added
+     * @returns True if the packet can be added, False if the packet is dropped due to full queue
      */
     bool DoEnqueue(Ptr<QueueDiscItem> item) override;
 
     /**
-     * \brief Remove a packet from queue based on the current state
+     * @brief Remove a packet from queue based on the current state
      * If we are in dropping state, check if we could leave the dropping state
      * or if we should perform next drop
      * If we are not currently in dropping state, check if we need to enter the state
      * and drop the first packet
      *
-     * \returns The packet that is examined
+     * @returns The packet that is examined
      */
     Ptr<QueueDiscItem> DoDequeue() override;
 
     bool CheckConfig() override;
 
     /**
-     * \brief Calculate the reciprocal square root of m_count by using Newton's method
+     * @brief Calculate the reciprocal square root of m_count by using Newton's method
      *  http://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Iterative_methods_for_reciprocal_square_roots
      * m_recInvSqrt (new) = (m_recInvSqrt (old) / 2) * (3 - m_count * m_recInvSqrt^2)
-     * \param recInvSqrt reciprocal value of sqrt (count)
-     * \param count count value
-     * \return The new recInvSqrt value
+     * @param recInvSqrt reciprocal value of sqrt (count)
+     * @param count count value
+     * @return The new recInvSqrt value
      */
     static uint16_t NewtonStep(uint16_t recInvSqrt, uint32_t count);
 
     /**
-     * \brief Determine the time for next drop
+     * @brief Determine the time for next drop
      * CoDel control law is t + m_interval/sqrt(m_count).
      * Here, we use m_recInvSqrt calculated by Newton's method in NewtonStep() to avoid
      * both sqrt() and divide operations
      *
-     * \param t Current next drop time (in units of CoDel time)
-     * \param interval interval (in units of CoDel time)
-     * \param recInvSqrt reciprocal value of sqrt (count)
-     * \return The new next drop time (in units of CoDel time)
+     * @param t Current next drop time (in units of CoDel time)
+     * @param interval interval (in units of CoDel time)
+     * @param recInvSqrt reciprocal value of sqrt (count)
+     * @return The new next drop time (in units of CoDel time)
      */
     static uint32_t ControlLaw(uint32_t t, uint32_t interval, uint32_t recInvSqrt);
 
     /**
-     * \brief Determine whether a packet is OK to be dropped. The packet
+     * @brief Determine whether a packet is OK to be dropped. The packet
      * may not be actually dropped (depending on the drop state)
      *
-     * \param item The packet that is considered
-     * \param now The current time represented as 32-bit unsigned integer (us)
-     * \returns True if it is OK to drop the packet (sojourn time above target for at least
+     * @param item The packet that is considered
+     * @param now The current time represented as 32-bit unsigned integer (us)
+     * @returns True if it is OK to drop the packet (sojourn time above target for at least
      * interval)
      */
     bool OkToDrop(Ptr<QueueDiscItem> item, uint32_t now);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/traffic-control/model/fifo-queue-disc.h ns-3.44/src/traffic-control/model/fifo-queue-disc.h
--- ns-3.43/src/traffic-control/model/fifo-queue-disc.h	2024-10-09 16:41:10.100656700 -0700
+++ ns-3.44/src/traffic-control/model/fifo-queue-disc.h	2025-03-09 16:55:49.707372200 -0700
@@ -15,7 +15,7 @@
 {
 
 /**
- * \ingroup traffic-control
+ * @ingroup traffic-control
  *
  * Simple queue disc implementing the FIFO (First-In First-Out) policy.
  *
@@ -24,12 +24,12 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     /**
-     * \brief FifoQueueDisc constructor
+     * @brief FifoQueueDisc constructor
      *
      * Creates a queue with a depth of 1000 packets by default
      */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/traffic-control/model/fq-cobalt-queue-disc.h ns-3.44/src/traffic-control/model/fq-cobalt-queue-disc.h
--- ns-3.43/src/traffic-control/model/fq-cobalt-queue-disc.h	2024-10-09 16:41:10.100656700 -0700
+++ ns-3.44/src/traffic-control/model/fq-cobalt-queue-disc.h	2025-03-09 16:55:49.707372200 -0700
@@ -27,29 +27,29 @@
 {
 
 /**
- * \ingroup traffic-control
+ * @ingroup traffic-control
  *
- * \brief A flow queue used by the FqCobalt queue disc
+ * @brief A flow queue used by the FqCobalt queue disc
  */
 
 class FqCobaltFlow : public QueueDiscClass
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     /**
-     * \brief FqCobaltFlow constructor
+     * @brief FqCobaltFlow constructor
      */
     FqCobaltFlow();
 
     ~FqCobaltFlow() override;
 
     /**
-     * \enum FlowStatus
-     * \brief Used to determine the status of this flow queue
+     * @enum FlowStatus
+     * @brief Used to determine the status of this flow queue
      */
     enum FlowStatus
     {
@@ -59,38 +59,38 @@
     };
 
     /**
-     * \brief Set the deficit for this flow
-     * \param deficit the deficit for this flow
+     * @brief Set the deficit for this flow
+     * @param deficit the deficit for this flow
      */
     void SetDeficit(uint32_t deficit);
     /**
-     * \brief Get the deficit for this flow
-     * \return the deficit for this flow
+     * @brief Get the deficit for this flow
+     * @return the deficit for this flow
      */
     int32_t GetDeficit() const;
     /**
-     * \brief Increase the deficit for this flow
-     * \param deficit the amount by which the deficit is to be increased
+     * @brief Increase the deficit for this flow
+     * @param deficit the amount by which the deficit is to be increased
      */
     void IncreaseDeficit(int32_t deficit);
     /**
-     * \brief Set the status for this flow
-     * \param status the status for this flow
+     * @brief Set the status for this flow
+     * @param status the status for this flow
      */
     void SetStatus(FlowStatus status);
     /**
-     * \brief Get the status of this flow
-     * \return the status of this flow
+     * @brief Get the status of this flow
+     * @return the status of this flow
      */
     FlowStatus GetStatus() const;
     /**
-     * \brief Set the index for this flow
-     * \param index the index for this flow
+     * @brief Set the index for this flow
+     * @param index the index for this flow
      */
     void SetIndex(uint32_t index);
     /**
-     * \brief Get the index of this flow
-     * \return the index of this flow
+     * @brief Get the index of this flow
+     * @return the index of this flow
      */
     uint32_t GetIndex() const;
 
@@ -101,38 +101,38 @@
 };
 
 /**
- * \ingroup traffic-control
+ * @ingroup traffic-control
  *
- * \brief A FqCobalt packet queue disc
+ * @brief A FqCobalt packet queue disc
  */
 
 class FqCobaltQueueDisc : public QueueDisc
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     /**
-     * \brief FqCobaltQueueDisc constructor
+     * @brief FqCobaltQueueDisc constructor
      */
     FqCobaltQueueDisc();
 
     ~FqCobaltQueueDisc() override;
 
     /**
-     * \brief Set the quantum value.
+     * @brief Set the quantum value.
      *
-     * \param quantum The number of bytes each queue gets to dequeue on each round of the scheduling
+     * @param quantum The number of bytes each queue gets to dequeue on each round of the scheduling
      * algorithm
      */
     void SetQuantum(uint32_t quantum);
 
     /**
-     * \brief Get the quantum value.
+     * @brief Get the quantum value.
      *
-     * \returns The number of bytes each queue gets to dequeue on each round of the scheduling
+     * @returns The number of bytes each queue gets to dequeue on each round of the scheduling
      * algorithm
      */
     uint32_t GetQuantum() const;
@@ -149,8 +149,8 @@
     void InitializeParams() override;
 
     /**
-     * \brief Drop a packet from the head of the queue with the largest current byte count
-     * \return the index of the queue with the largest current byte count
+     * @brief Drop a packet from the head of the queue with the largest current byte count
+     * @return the index of the queue with the largest current byte count
      */
     uint32_t FqCobaltDrop();
 
@@ -158,8 +158,8 @@
      * Compute the index of the queue for the flow having the given flowHash,
      * according to the set associative hash approach.
      *
-     * \param flowHash the hash of the flow 5-tuple
-     * \return the index of the queue for the given flow
+     * @param flowHash the hash of the flow 5-tuple
+     * @return the index of the queue for the given flow
      */
     uint32_t SetAssociativeHash(uint32_t flowHash);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/traffic-control/model/fq-codel-queue-disc.h ns-3.44/src/traffic-control/model/fq-codel-queue-disc.h
--- ns-3.43/src/traffic-control/model/fq-codel-queue-disc.h	2024-10-09 16:41:10.100656700 -0700
+++ ns-3.44/src/traffic-control/model/fq-codel-queue-disc.h	2025-03-09 16:55:49.707372200 -0700
@@ -21,29 +21,29 @@
 {
 
 /**
- * \ingroup traffic-control
+ * @ingroup traffic-control
  *
- * \brief A flow queue used by the FqCoDel queue disc
+ * @brief A flow queue used by the FqCoDel queue disc
  */
 
 class FqCoDelFlow : public QueueDiscClass
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     /**
-     * \brief FqCoDelFlow constructor
+     * @brief FqCoDelFlow constructor
      */
     FqCoDelFlow();
 
     ~FqCoDelFlow() override;
 
     /**
-     * \enum FlowStatus
-     * \brief Used to determine the status of this flow queue
+     * @enum FlowStatus
+     * @brief Used to determine the status of this flow queue
      */
     enum FlowStatus
     {
@@ -53,38 +53,38 @@
     };
 
     /**
-     * \brief Set the deficit for this flow
-     * \param deficit the deficit for this flow
+     * @brief Set the deficit for this flow
+     * @param deficit the deficit for this flow
      */
     void SetDeficit(uint32_t deficit);
     /**
-     * \brief Get the deficit for this flow
-     * \return the deficit for this flow
+     * @brief Get the deficit for this flow
+     * @return the deficit for this flow
      */
     int32_t GetDeficit() const;
     /**
-     * \brief Increase the deficit for this flow
-     * \param deficit the amount by which the deficit is to be increased
+     * @brief Increase the deficit for this flow
+     * @param deficit the amount by which the deficit is to be increased
      */
     void IncreaseDeficit(int32_t deficit);
     /**
-     * \brief Set the status for this flow
-     * \param status the status for this flow
+     * @brief Set the status for this flow
+     * @param status the status for this flow
      */
     void SetStatus(FlowStatus status);
     /**
-     * \brief Get the status of this flow
-     * \return the status of this flow
+     * @brief Get the status of this flow
+     * @return the status of this flow
      */
     FlowStatus GetStatus() const;
     /**
-     * \brief Set the index for this flow
-     * \param index the index for this flow
+     * @brief Set the index for this flow
+     * @param index the index for this flow
      */
     void SetIndex(uint32_t index);
     /**
-     * \brief Get the index of this flow
-     * \return the index of this flow
+     * @brief Get the index of this flow
+     * @return the index of this flow
      */
     uint32_t GetIndex() const;
 
@@ -95,38 +95,38 @@
 };
 
 /**
- * \ingroup traffic-control
+ * @ingroup traffic-control
  *
- * \brief A FqCoDel packet queue disc
+ * @brief A FqCoDel packet queue disc
  */
 
 class FqCoDelQueueDisc : public QueueDisc
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     /**
-     * \brief FqCoDelQueueDisc constructor
+     * @brief FqCoDelQueueDisc constructor
      */
     FqCoDelQueueDisc();
 
     ~FqCoDelQueueDisc() override;
 
     /**
-     * \brief Set the quantum value.
+     * @brief Set the quantum value.
      *
-     * \param quantum The number of bytes each queue gets to dequeue on each round of the scheduling
+     * @param quantum The number of bytes each queue gets to dequeue on each round of the scheduling
      * algorithm
      */
     void SetQuantum(uint32_t quantum);
 
     /**
-     * \brief Get the quantum value.
+     * @brief Get the quantum value.
      *
-     * \returns The number of bytes each queue gets to dequeue on each round of the scheduling
+     * @returns The number of bytes each queue gets to dequeue on each round of the scheduling
      * algorithm
      */
     uint32_t GetQuantum() const;
@@ -143,8 +143,8 @@
     void InitializeParams() override;
 
     /**
-     * \brief Drop a packet from the head of the queue with the largest current byte count
-     * \return the index of the queue with the largest current byte count
+     * @brief Drop a packet from the head of the queue with the largest current byte count
+     * @return the index of the queue with the largest current byte count
      */
     uint32_t FqCoDelDrop();
 
@@ -153,8 +153,8 @@
      * Compute the index of the queue for the flow having the given flowHash,
      * according to the set associative hash approach.
      *
-     * \param flowHash the hash of the flow 5-tuple
-     * \return the index of the queue for the given flow
+     * @param flowHash the hash of the flow 5-tuple
+     * @return the index of the queue for the given flow
      */
     uint32_t SetAssociativeHash(uint32_t flowHash);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/traffic-control/model/fq-pie-queue-disc.h ns-3.44/src/traffic-control/model/fq-pie-queue-disc.h
--- ns-3.43/src/traffic-control/model/fq-pie-queue-disc.h	2024-10-09 16:41:10.100656700 -0700
+++ ns-3.44/src/traffic-control/model/fq-pie-queue-disc.h	2025-03-09 16:55:49.707372200 -0700
@@ -26,29 +26,29 @@
 {
 
 /**
- * \ingroup traffic-control
+ * @ingroup traffic-control
  *
- * \brief A flow queue used by the FqPie queue disc
+ * @brief A flow queue used by the FqPie queue disc
  */
 
 class FqPieFlow : public QueueDiscClass
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     /**
-     * \brief FqPieFlow constructor
+     * @brief FqPieFlow constructor
      */
     FqPieFlow();
 
     ~FqPieFlow() override;
 
     /**
-     * \enum FlowStatus
-     * \brief Used to determine the status of this flow queue
+     * @enum FlowStatus
+     * @brief Used to determine the status of this flow queue
      */
     enum FlowStatus
     {
@@ -58,38 +58,38 @@
     };
 
     /**
-     * \brief Set the deficit for this flow
-     * \param deficit the deficit for this flow
+     * @brief Set the deficit for this flow
+     * @param deficit the deficit for this flow
      */
     void SetDeficit(uint32_t deficit);
     /**
-     * \brief Get the deficit for this flow
-     * \return the deficit for this flow
+     * @brief Get the deficit for this flow
+     * @return the deficit for this flow
      */
     int32_t GetDeficit() const;
     /**
-     * \brief Increase the deficit for this flow
-     * \param deficit the amount by which the deficit is to be increased
+     * @brief Increase the deficit for this flow
+     * @param deficit the amount by which the deficit is to be increased
      */
     void IncreaseDeficit(int32_t deficit);
     /**
-     * \brief Set the status for this flow
-     * \param status the status for this flow
+     * @brief Set the status for this flow
+     * @param status the status for this flow
      */
     void SetStatus(FlowStatus status);
     /**
-     * \brief Get the status of this flow
-     * \return the status of this flow
+     * @brief Get the status of this flow
+     * @return the status of this flow
      */
     FlowStatus GetStatus() const;
     /**
-     * \brief Set the index for this flow
-     * \param index the index for this flow
+     * @brief Set the index for this flow
+     * @param index the index for this flow
      */
     void SetIndex(uint32_t index);
     /**
-     * \brief Get the index of this flow
-     * \return the index of this flow
+     * @brief Get the index of this flow
+     * @return the index of this flow
      */
     uint32_t GetIndex() const;
 
@@ -100,38 +100,38 @@
 };
 
 /**
- * \ingroup traffic-control
+ * @ingroup traffic-control
  *
- * \brief A FqPie packet queue disc
+ * @brief A FqPie packet queue disc
  */
 
 class FqPieQueueDisc : public QueueDisc
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     /**
-     * \brief FqPieQueueDisc constructor
+     * @brief FqPieQueueDisc constructor
      */
     FqPieQueueDisc();
 
     ~FqPieQueueDisc() override;
 
     /**
-     * \brief Set the quantum value.
+     * @brief Set the quantum value.
      *
-     * \param quantum The number of bytes each queue gets to dequeue on each round of the scheduling
+     * @param quantum The number of bytes each queue gets to dequeue on each round of the scheduling
      * algorithm
      */
     void SetQuantum(uint32_t quantum);
 
     /**
-     * \brief Get the quantum value.
+     * @brief Get the quantum value.
      *
-     * \returns The number of bytes each queue gets to dequeue on each round of the scheduling
+     * @returns The number of bytes each queue gets to dequeue on each round of the scheduling
      * algorithm
      */
     uint32_t GetQuantum() const;
@@ -148,8 +148,8 @@
     void InitializeParams() override;
 
     /**
-     * \brief Drop a packet from the head of the queue with the largest current byte count
-     * \return the index of the queue with the largest current byte count
+     * @brief Drop a packet from the head of the queue with the largest current byte count
+     * @return the index of the queue with the largest current byte count
      */
     uint32_t FqPieDrop();
 
@@ -157,8 +157,8 @@
      * Compute the index of the queue for the flow having the given flowHash,
      * according to the set associative hash approach.
      *
-     * \param flowHash the hash of the flow 5-tuple
-     * \return the index of the queue for the given flow
+     * @param flowHash the hash of the flow 5-tuple
+     * @return the index of the queue for the given flow
      */
     uint32_t SetAssociativeHash(uint32_t flowHash);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/traffic-control/model/mq-queue-disc.h ns-3.44/src/traffic-control/model/mq-queue-disc.h
--- ns-3.43/src/traffic-control/model/mq-queue-disc.h	2024-10-09 16:41:10.100656700 -0700
+++ ns-3.44/src/traffic-control/model/mq-queue-disc.h	2025-03-09 16:55:49.719372300 -0700
@@ -16,7 +16,7 @@
 {
 
 /**
- * \ingroup traffic-control
+ * @ingroup traffic-control
  *
  * mq is a classful multi-queue aware dummy scheduler. It has as many child
  * queue discs as the number of device transmission queues. Packets are
@@ -26,20 +26,20 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     /**
-     * \brief MqQueueDisc constructor
+     * @brief MqQueueDisc constructor
      */
     MqQueueDisc();
 
     ~MqQueueDisc() override;
 
     /**
-     * \brief Return the wake mode adopted by this queue disc.
-     * \return the wake mode adopted by this queue disc.
+     * @brief Return the wake mode adopted by this queue disc.
+     * @return the wake mode adopted by this queue disc.
      */
     WakeMode GetWakeMode() const override;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/traffic-control/model/packet-filter.h ns-3.44/src/traffic-control/model/packet-filter.h
--- ns-3.43/src/traffic-control/model/packet-filter.h	2024-10-09 16:41:10.100656700 -0700
+++ ns-3.44/src/traffic-control/model/packet-filter.h	2025-03-09 16:55:49.719372300 -0700
@@ -15,7 +15,7 @@
 class QueueDiscItem;
 
 /**
- * \ingroup traffic-control
+ * @ingroup traffic-control
  *
  * PacketFilter is the abstract base class for filters used by queue discs
  * to classify packets.
@@ -24,8 +24,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -38,11 +38,11 @@
     static const int PF_NO_MATCH = -1;
 
     /**
-     * \brief Classify a packet.
+     * @brief Classify a packet.
      *
-     * \param item the packet to classify.
+     * @param item the packet to classify.
      *
-     * \return -1 if this filter is not able to classify packets of the same protocol
+     * @return -1 if this filter is not able to classify packets of the same protocol
      * as item or the item does not match the filter conditions, the configured return
      * value otherwise.
      */
@@ -50,19 +50,19 @@
 
   private:
     /**
-     * \brief Checks if the filter is able to classify a kind of items.
+     * @brief Checks if the filter is able to classify a kind of items.
      *
-     * \param item an example item to check.
-     * \return true if this filter is able to classify packets.
+     * @param item an example item to check.
+     * @return true if this filter is able to classify packets.
      */
     virtual bool CheckProtocol(Ptr<QueueDiscItem> item) const = 0;
 
     /**
-     * \brief Classify a packet.
+     * @brief Classify a packet.
      *
-     * \param item the packet to classify.
+     * @param item the packet to classify.
      *
-     * \return -1 if the item does not match the filter conditions, or the configured
+     * @return -1 if the item does not match the filter conditions, or the configured
      * return value otherwise.
      */
     virtual int32_t DoClassify(Ptr<QueueDiscItem> item) const = 0;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/traffic-control/model/pfifo-fast-queue-disc.h ns-3.44/src/traffic-control/model/pfifo-fast-queue-disc.h
--- ns-3.43/src/traffic-control/model/pfifo-fast-queue-disc.h	2024-10-09 16:41:10.100656700 -0700
+++ ns-3.44/src/traffic-control/model/pfifo-fast-queue-disc.h	2025-03-09 16:55:49.719372300 -0700
@@ -17,7 +17,7 @@
 {
 
 /**
- * \ingroup traffic-control
+ * @ingroup traffic-control
  *
  * Linux pfifo_fast is the default priority queue enabled on Linux
  * systems. Packets are enqueued in three FIFO droptail queues according
@@ -39,12 +39,12 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     /**
-     * \brief PfifoFastQueueDisc constructor
+     * @brief PfifoFastQueueDisc constructor
      *
      * Creates a queue with a depth of 1000 packets per band by default
      */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/traffic-control/model/pie-queue-disc.cc ns-3.44/src/traffic-control/model/pie-queue-disc.cc
--- ns-3.43/src/traffic-control/model/pie-queue-disc.cc	2024-10-09 16:41:10.100656700 -0700
+++ ns-3.44/src/traffic-control/model/pie-queue-disc.cc	2025-03-09 16:55:49.719372300 -0700
@@ -515,7 +515,7 @@
             if (m_dqCount >= m_dqThreshold)
             {
                 Time dqTime = Now() - m_dqStart;
-                if (dqTime > Seconds(0))
+                if (dqTime.IsStrictlyPositive())
                 {
                     if (m_avgDqRate == 0)
                     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/traffic-control/model/pie-queue-disc.h ns-3.44/src/traffic-control/model/pie-queue-disc.h
--- ns-3.43/src/traffic-control/model/pie-queue-disc.h	2024-10-09 16:41:10.100656700 -0700
+++ ns-3.44/src/traffic-control/model/pie-queue-disc.h	2025-03-09 16:55:49.719372300 -0700
@@ -36,31 +36,31 @@
 class UniformRandomVariable;
 
 /**
- * \ingroup traffic-control
+ * @ingroup traffic-control
  *
- * \brief Implements PIE Active Queue Management discipline
+ * @brief Implements PIE Active Queue Management discipline
  */
 class PieQueueDisc : public QueueDisc
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief PieQueueDisc Constructor
+     * @brief PieQueueDisc Constructor
      */
     PieQueueDisc();
 
     /**
-     * \brief PieQueueDisc Destructor
+     * @brief PieQueueDisc Destructor
      */
     ~PieQueueDisc() override;
 
     /**
-     * \brief Burst types
+     * @brief Burst types
      */
     enum BurstStateT
     {
@@ -70,9 +70,9 @@
     };
 
     /**
-     * \brief Get queue delay.
+     * @brief Get queue delay.
      *
-     * \returns The current queue delay.
+     * @returns The current queue delay.
      */
     Time GetQueueDelay();
     /**
@@ -80,8 +80,8 @@
      * used by this model.  Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream);
 
@@ -97,7 +97,7 @@
 
   protected:
     /**
-     * \brief Dispose of the object
+     * @brief Dispose of the object
      */
     void DoDispose() override;
 
@@ -108,15 +108,15 @@
     bool CheckConfig() override;
 
     /**
-     * \brief Initialize the queue parameters.
+     * @brief Initialize the queue parameters.
      */
     void InitializeParams() override;
 
     /**
-     * \brief Check if a packet needs to be dropped due to probability drop
-     * \param item queue item
-     * \param qSize queue size
-     * \returns 0 for no drop, 1 for drop
+     * @brief Check if a packet needs to be dropped due to probability drop
+     * @param item queue item
+     * @param qSize queue size
+     * @returns 0 for no drop, 1 for drop
      */
     bool DropEarly(Ptr<QueueDiscItem> item, uint32_t qSize);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/traffic-control/model/prio-queue-disc.h ns-3.44/src/traffic-control/model/prio-queue-disc.h
--- ns-3.43/src/traffic-control/model/prio-queue-disc.h	2024-10-09 16:41:10.100656700 -0700
+++ ns-3.44/src/traffic-control/model/prio-queue-disc.h	2025-03-09 16:55:49.719372300 -0700
@@ -20,7 +20,7 @@
 typedef std::array<uint16_t, 16> Priomap;
 
 /**
- * \ingroup traffic-control
+ * @ingroup traffic-control
  *
  * The Prio qdisc is a simple classful queueing discipline that contains an
  * arbitrary number of classes of differing priority. The classes are dequeued
@@ -41,12 +41,12 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     /**
-     * \brief PrioQueueDisc constructor
+     * @brief PrioQueueDisc constructor
      */
     PrioQueueDisc();
 
@@ -55,16 +55,16 @@
     /**
      * Set the band (class) assigned to packets with specified priority.
      *
-     * \param prio the priority of packets (a value between 0 and 15).
-     * \param band the band assigned to packets.
+     * @param prio the priority of packets (a value between 0 and 15).
+     * @param band the band assigned to packets.
      */
     void SetBandForPriority(uint8_t prio, uint16_t band);
 
     /**
      * Get the band (class) assigned to packets with specified priority.
      *
-     * \param prio the priority of packets (a value between 0 and 15).
-     * \returns the band assigned to packets.
+     * @param prio the priority of packets (a value between 0 and 15).
+     * @returns the band assigned to packets.
      */
     uint16_t GetBandForPriority(uint8_t prio) const;
 
@@ -81,20 +81,20 @@
 /**
  * Serialize the priomap to the given ostream
  *
- * \param os
- * \param priomap
+ * @param os
+ * @param priomap
  *
- * \return std::ostream
+ * @return std::ostream
  */
 std::ostream& operator<<(std::ostream& os, const Priomap& priomap);
 
 /**
  * Serialize from the given istream to this priomap.
  *
- * \param is
- * \param priomap
+ * @param is
+ * @param priomap
  *
- * \return std::istream
+ * @return std::istream
  */
 std::istream& operator>>(std::istream& is, Priomap& priomap);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/traffic-control/model/queue-disc.cc ns-3.44/src/traffic-control/model/queue-disc.cc
--- ns-3.43/src/traffic-control/model/queue-disc.cc	2024-10-09 16:41:10.100656700 -0700
+++ ns-3.44/src/traffic-control/model/queue-disc.cc	2025-03-09 16:55:49.719372300 -0700
@@ -943,7 +943,7 @@
             quota -= 1;
             if (quota <= 0)
             {
-                /// \todo netif_schedule (q);
+                /// @todo netif_schedule (q);
                 break;
             }
         }
@@ -1040,7 +1040,7 @@
 {
     NS_LOG_FUNCTION(this << item);
     m_requeued = item;
-    /// \todo netif_schedule (q);
+    /// @todo netif_schedule (q);
 
     m_stats.nTotalRequeuedPackets++;
     m_stats.nTotalRequeuedBytes += item->GetSize();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/traffic-control/model/queue-disc.h ns-3.44/src/traffic-control/model/queue-disc.h
--- ns-3.43/src/traffic-control/model/queue-disc.h	2024-10-09 16:41:10.100656700 -0700
+++ ns-3.44/src/traffic-control/model/queue-disc.h	2025-03-09 16:55:49.719372300 -0700
@@ -29,7 +29,7 @@
 class NetDeviceQueueInterface;
 
 /**
- * \ingroup traffic-control
+ * @ingroup traffic-control
  *
  * QueueDiscClass is the base class for classes that are included in a queue
  * disc. It has a single attribute, QueueDisc, used to set the child queue disc
@@ -41,8 +41,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -50,20 +50,20 @@
     ~QueueDiscClass() override;
 
     /**
-     * \brief Get the queue disc attached to this class
-     * \return the queue disc attached to this class.
+     * @brief Get the queue disc attached to this class
+     * @return the queue disc attached to this class.
      */
     Ptr<QueueDisc> GetQueueDisc() const;
 
     /**
-     * \brief Set the queue disc attached to this class
-     * \param qd The queue disc to attach to this class
+     * @brief Set the queue disc attached to this class
+     * @param qd The queue disc to attach to this class
      */
     void SetQueueDisc(Ptr<QueueDisc> qd);
 
   protected:
     /**
-     * \brief Dispose of the object
+     * @brief Dispose of the object
      */
     void DoDispose() override;
 
@@ -72,8 +72,8 @@
 };
 
 /**
- * \ingroup traffic-control
- * \brief Enumeration of the available policies to handle the queue disc size.
+ * @ingroup traffic-control
+ * @brief Enumeration of the available policies to handle the queue disc size.
  *
  * - SINGLE_INTERNAL_QUEUE is intended to handle the maxSize attribute
  * of queue discs having a single internal queue. If no internal queue is
@@ -101,7 +101,7 @@
 };
 
 /**
- * \ingroup traffic-control
+ * @ingroup traffic-control
  *
  * QueueDisc is an abstract base class providing the interface and implementing
  * the operations common to all the queueing disciplines. Child classes
@@ -172,7 +172,7 @@
 class QueueDisc : public Object
 {
   public:
-    /// \brief Structure that keeps the queue disc statistics
+    /// @brief Structure that keeps the queue disc statistics
     struct Stats
     {
         /// Total received packets
@@ -228,52 +228,52 @@
         Stats();
 
         /**
-         * \brief Get the number of packets dropped for the given reason
-         * \param reason the reason why packets were dropped
-         * \return the number of packets dropped for the given reason
+         * @brief Get the number of packets dropped for the given reason
+         * @param reason the reason why packets were dropped
+         * @return the number of packets dropped for the given reason
          */
         uint32_t GetNDroppedPackets(std::string reason) const;
         /**
-         * \brief Get the amount of bytes dropped for the given reason
-         * \param reason the reason why packets were dropped
-         * \return the amount of bytes dropped for the given reason
+         * @brief Get the amount of bytes dropped for the given reason
+         * @param reason the reason why packets were dropped
+         * @return the amount of bytes dropped for the given reason
          */
         uint64_t GetNDroppedBytes(std::string reason) const;
         /**
-         * \brief Get the number of packets marked for the given reason
-         * \param reason the reason why packets were marked
-         * \return the number of packets marked for the given reason
+         * @brief Get the number of packets marked for the given reason
+         * @param reason the reason why packets were marked
+         * @return the number of packets marked for the given reason
          */
         uint32_t GetNMarkedPackets(std::string reason) const;
         /**
-         * \brief Get the amount of bytes marked for the given reason
-         * \param reason the reason why packets were marked
-         * \return the amount of bytes marked for the given reason
+         * @brief Get the amount of bytes marked for the given reason
+         * @param reason the reason why packets were marked
+         * @return the amount of bytes marked for the given reason
          */
         uint64_t GetNMarkedBytes(std::string reason) const;
         /**
-         * \brief Print the statistics.
-         * \param os output stream in which the data should be printed.
+         * @brief Print the statistics.
+         * @param os output stream in which the data should be printed.
          */
         void Print(std::ostream& os) const;
     };
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Constructor
-     * \param policy the policy to handle the queue disc size
+     * @brief Constructor
+     * @param policy the policy to handle the queue disc size
      */
     QueueDisc(QueueDiscSizePolicy policy = QueueDiscSizePolicy::SINGLE_INTERNAL_QUEUE);
 
     /**
-     * \brief Constructor
-     * \param policy the policy to handle the queue disc size
-     * \param unit The fixed operating mode of this queue disc
+     * @brief Constructor
+     * @param policy the policy to handle the queue disc size
+     * @param unit The fixed operating mode of this queue disc
      */
     QueueDisc(QueueDiscSizePolicy policy, QueueSizeUnit unit);
 
@@ -284,56 +284,56 @@
     QueueDisc& operator=(const QueueDisc&) = delete;
 
     /**
-     * \brief Get the number of packets stored by the queue disc
-     * \return the number of packets stored by the queue disc.
+     * @brief Get the number of packets stored by the queue disc
+     * @return the number of packets stored by the queue disc.
      *
      * The requeued packet, if any, is counted.
      */
     uint32_t GetNPackets() const;
 
     /**
-     * \brief Get the amount of bytes stored by the queue disc
-     * \return the amount of bytes stored by the queue disc.
+     * @brief Get the amount of bytes stored by the queue disc
+     * @return the amount of bytes stored by the queue disc.
      *
      * The requeued packet, if any, is counted.
      */
     uint32_t GetNBytes() const;
 
     /**
-     * \brief Get the maximum size of the queue disc.
+     * @brief Get the maximum size of the queue disc.
      *
-     * \returns the maximum size of the queue disc.
+     * @returns the maximum size of the queue disc.
      */
     QueueSize GetMaxSize() const;
 
     /**
-     * \brief Set the maximum size of the queue disc.
+     * @brief Set the maximum size of the queue disc.
      *
      * Trying to set a null size has no effect.
      *
-     * \param size the maximum size.
-     * \returns true if setting the size succeeded, false otherwise.
+     * @param size the maximum size.
+     * @returns true if setting the size succeeded, false otherwise.
      */
     bool SetMaxSize(QueueSize size);
 
     /**
-     * \brief Get the current size of the queue disc in bytes, if
+     * @brief Get the current size of the queue disc in bytes, if
      *        operating in bytes mode, or packets, otherwise.
      *
      * Do not call this method if the queue disc size is not limited.
      *
-     * \returns The queue disc size in bytes or packets.
+     * @returns The queue disc size in bytes or packets.
      */
     QueueSize GetCurrentSize() const;
 
     /**
-     * \brief Retrieve all the collected statistics.
-     * \return the collected statistics.
+     * @brief Retrieve all the collected statistics.
+     * @return the collected statistics.
      */
     const Stats& GetStats();
 
     /**
-     * \param ndqi the NetDeviceQueueInterface aggregated to the receiving object.
+     * @param ndqi the NetDeviceQueueInterface aggregated to the receiving object.
      *
      * Set the pointer to the NetDeviceQueueInterface object aggregated to the
      * object receiving the packets dequeued from this queue disc.
@@ -341,7 +341,7 @@
     void SetNetDeviceQueueInterface(Ptr<NetDeviceQueueInterface> ndqi);
 
     /**
-     * \return the NetDeviceQueueInterface aggregated to the receiving object.
+     * @return the NetDeviceQueueInterface aggregated to the receiving object.
      *
      * Get the pointer to the NetDeviceQueueInterface object aggregated to the
      * object receiving the packets dequeued from this queue disc.
@@ -352,7 +352,7 @@
     typedef std::function<void(Ptr<QueueDiscItem>)> SendCallback;
 
     /**
-     * \param func the callback to send a packet to the receiving object.
+     * @param func the callback to send a packet to the receiving object.
      *
      * Set the callback used by the Transmit method (called eventually by the Run
      * method) to send a packet to the receiving object.
@@ -360,7 +360,7 @@
     void SetSendCallback(SendCallback func);
 
     /**
-     * \return the callback to send a packet to the receiving object.
+     * @return the callback to send a packet to the receiving object.
      *
      * Get the callback used by the Transmit method (called eventually by the Run
      * method) to send a packet to the receiving object.
@@ -368,14 +368,14 @@
     SendCallback GetSendCallback() const;
 
     /**
-     * \brief Set the maximum number of dequeue operations following a packet enqueue
-     * \param quota the maximum number of dequeue operations following a packet enqueue.
+     * @brief Set the maximum number of dequeue operations following a packet enqueue
+     * @param quota the maximum number of dequeue operations following a packet enqueue.
      */
     virtual void SetQuota(const uint32_t quota);
 
     /**
-     * \brief Get the maximum number of dequeue operations following a packet enqueue
-     * \return the maximum number of dequeue operations following a packet enqueue.
+     * @brief Get the maximum number of dequeue operations following a packet enqueue
+     * @return the maximum number of dequeue operations following a packet enqueue.
      */
     virtual uint32_t GetQuota() const;
 
@@ -383,8 +383,8 @@
      * Pass a packet to store to the queue discipline. This function only updates
      * the statistics and calls the (private) DoEnqueue function, which must be
      * implemented by derived classes.
-     * \param item item to enqueue
-     * \return True if the operation was successful; false otherwise
+     * @param item item to enqueue
+     * @return True if the operation was successful; false otherwise
      */
     bool Enqueue(Ptr<QueueDiscItem> item);
 
@@ -393,7 +393,7 @@
      * Peek, if any, or call the private DoDequeue method (which must be
      * implemented by derived classes) to dequeue a packet, otherwise.
      *
-     * \return 0 if the operation was not successful; the item otherwise.
+     * @return 0 if the operation was not successful; the item otherwise.
      */
     Ptr<QueueDiscItem> Dequeue();
 
@@ -402,7 +402,7 @@
      * function only calls the (private) DoPeek function. This base class provides
      * a default implementation of DoPeek, which dequeues the next packet but
      * retains it into the queue disc.
-     * \return 0 if the operation was not successful; the item otherwise.
+     * @return 0 if the operation was not successful; the item otherwise.
      */
     Ptr<const QueueDiscItem> Peek();
 
@@ -417,59 +417,59 @@
     typedef Queue<QueueDiscItem> InternalQueue;
 
     /**
-     * \brief Add an internal queue to the tail of the list of queues.
-     * \param queue the queue to be added
+     * @brief Add an internal queue to the tail of the list of queues.
+     * @param queue the queue to be added
      */
     void AddInternalQueue(Ptr<InternalQueue> queue);
 
     /**
-     * \brief Get the i-th internal queue
-     * \param i the index of the queue
-     * \return the i-th internal queue.
+     * @brief Get the i-th internal queue
+     * @param i the index of the queue
+     * @return the i-th internal queue.
      */
     Ptr<InternalQueue> GetInternalQueue(std::size_t i) const;
 
     /**
-     * \brief Get the number of internal queues
-     * \return the number of internal queues.
+     * @brief Get the number of internal queues
+     * @return the number of internal queues.
      */
     std::size_t GetNInternalQueues() const;
 
     /**
-     * \brief Add a packet filter to the tail of the list of filters used to classify packets.
-     * \param filter the packet filter to be added
+     * @brief Add a packet filter to the tail of the list of filters used to classify packets.
+     * @param filter the packet filter to be added
      */
     void AddPacketFilter(Ptr<PacketFilter> filter);
 
     /**
-     * \brief Get the i-th packet filter
-     * \param i the index of the packet filter
-     * \return the i-th packet filter.
+     * @brief Get the i-th packet filter
+     * @param i the index of the packet filter
+     * @return the i-th packet filter.
      */
     Ptr<PacketFilter> GetPacketFilter(std::size_t i) const;
 
     /**
-     * \brief Get the number of packet filters
-     * \return the number of packet filters.
+     * @brief Get the number of packet filters
+     * @return the number of packet filters.
      */
     std::size_t GetNPacketFilters() const;
 
     /**
-     * \brief Add a queue disc class to the tail of the list of classes.
-     * \param qdClass the queue disc class to be added
+     * @brief Add a queue disc class to the tail of the list of classes.
+     * @param qdClass the queue disc class to be added
      */
     void AddQueueDiscClass(Ptr<QueueDiscClass> qdClass);
 
     /**
-     * \brief Get the i-th queue disc class
-     * \param i the index of the queue disc class
-     * \return the i-th queue disc class.
+     * @brief Get the i-th queue disc class
+     * @param i the index of the queue disc class
+     * @return the i-th queue disc class.
      */
     Ptr<QueueDiscClass> GetQueueDiscClass(std::size_t i) const;
 
     /**
-     * \brief Get the number of queue disc classes
-     * \return the number of queue disc classes.
+     * @brief Get the number of queue disc classes
+     * @return the number of queue disc classes.
      */
     std::size_t GetNQueueDiscClasses() const;
 
@@ -477,15 +477,15 @@
      * Classify a packet by calling the packet filters, one at a time, until either
      * a filter able to classify the packet is found or all the filters have been
      * processed.
-     * \param item item to classify
-     * \return -1 if no filter able to classify the packet has been found, the value
+     * @param item item to classify
+     * @return -1 if no filter able to classify the packet has been found, the value
      * returned by first filter found to be able to classify the packet otherwise.
      */
     int32_t Classify(Ptr<QueueDiscItem> item);
 
     /**
-     * \enum WakeMode
-     * \brief Used to determine whether the queue disc itself or its children must
+     * @enum WakeMode
+     * @brief Used to determine whether the queue disc itself or its children must
      *        be activated when a netdevice wakes a transmission queue
      */
     enum WakeMode
@@ -503,7 +503,7 @@
      * a different strategy (e.g., multi-queue aware queue discs such as mq) have
      * to redefine this method.
      *
-     * \return the wake mode adopted by this queue disc.
+     * @return the wake mode adopted by this queue disc.
      */
     virtual WakeMode GetWakeMode() const;
 
@@ -517,12 +517,12 @@
 
   protected:
     /**
-     * \brief Dispose of the object
+     * @brief Dispose of the object
      */
     void DoDispose() override;
 
     /**
-     * \brief Check whether the configuration is correct and initialize parameters
+     * @brief Check whether the configuration is correct and initialize parameters
      *
      * This method is not virtual to prevent subclasses from redefining it.
      * Subclasses must instead provide the implementation of the CheckConfig
@@ -533,50 +533,50 @@
     void DoInitialize() override;
 
     /**
-     * \brief Perform the actions required when the queue disc is notified of
+     * @brief Perform the actions required when the queue disc is notified of
      *        a packet dropped before enqueue
-     * \param item item that was dropped
-     * \param reason the reason why the item was dropped
+     * @param item item that was dropped
+     * @param reason the reason why the item was dropped
      * This method must be called by subclasses to record that a packet was
      * dropped before enqueue for the specified reason
      */
     void DropBeforeEnqueue(Ptr<const QueueDiscItem> item, const char* reason);
 
     /**
-     * \brief Perform the actions required when the queue disc is notified of
+     * @brief Perform the actions required when the queue disc is notified of
      *        a packet dropped after dequeue
-     * \param item item that was dropped
-     * \param reason the reason why the item was dropped
+     * @param item item that was dropped
+     * @param reason the reason why the item was dropped
      * This method must be called by subclasses to record that a packet was
      * dropped after dequeue for the specified reason
      */
     void DropAfterDequeue(Ptr<const QueueDiscItem> item, const char* reason);
 
     /**
-     * \brief Marks the given packet and, if successful, updates the counters
+     * @brief Marks the given packet and, if successful, updates the counters
      *        associated with the given reason
-     * \param item item that has to be marked
-     * \param reason the reason why the item has to be marked
-     * \return true if the item was successfully marked, false otherwise
+     * @param item item that has to be marked
+     * @param reason the reason why the item has to be marked
+     * @return true if the item was successfully marked, false otherwise
      */
     bool Mark(Ptr<QueueDiscItem> item, const char* reason);
 
   private:
     /**
      * This function actually enqueues a packet into the queue disc.
-     * \param item item to enqueue
-     * \return True if the operation was successful; false otherwise
+     * @param item item to enqueue
+     * @return True if the operation was successful; false otherwise
      */
     virtual bool DoEnqueue(Ptr<QueueDiscItem> item) = 0;
 
     /**
      * This function actually extracts a packet from the queue disc.
-     * \return 0 if the operation was not successful; the item otherwise.
+     * @return 0 if the operation was not successful; the item otherwise.
      */
     virtual Ptr<QueueDiscItem> DoDequeue() = 0;
 
     /**
-     * \brief Return a copy of the next packet the queue disc will extract.
+     * @brief Return a copy of the next packet the queue disc will extract.
      *
      * The implementation of this method is based on the qdisc_peek_dequeued
      * function of the Linux kernel, which dequeues a packet and retains it in the
@@ -592,7 +592,7 @@
      * drop packets after dequeue). Subclasses can however provide their own
      * implementation of this method that overrides the default one.
      *
-     * \return 0 if the operation was not successful; the packet otherwise.
+     * @return 0 if the operation was not successful; the packet otherwise.
      */
     virtual Ptr<const QueueDiscItem> DoPeek();
 
@@ -605,7 +605,7 @@
      * initialization to this method if it aids in checking for correct
      * configuration.
      * \sa QueueDisc::InitializeParams
-     * \return true if the configuration is correct, false otherwise
+     * @return true if the configuration is correct, false otherwise
      */
     virtual bool CheckConfig() = 0;
 
@@ -619,7 +619,7 @@
 
     /**
      * Modelled after the Linux function qdisc_run_begin (include/net/sch_generic.h).
-     * \return false if the qdisc is already running; otherwise, set the qdisc as running and return
+     * @return false if the qdisc is already running; otherwise, set the qdisc as running and return
      * true.
      */
     bool RunBegin();
@@ -633,20 +633,20 @@
     /**
      * Modelled after the Linux function qdisc_restart (net/sched/sch_generic.c)
      * Dequeue a packet (by calling DequeuePacket) and send it to the device (by calling Transmit).
-     * \return true if a packet is successfully sent to the device.
+     * @return true if a packet is successfully sent to the device.
      */
     bool Restart();
 
     /**
      * Modelled after the Linux function dequeue_skb (net/sched/sch_generic.c)
-     * \return the requeued packet, if any, or the packet dequeued by the queue disc, otherwise.
+     * @return the requeued packet, if any, or the packet dequeued by the queue disc, otherwise.
      */
     Ptr<QueueDiscItem> DequeuePacket();
 
     /**
      * Modelled after the Linux function dev_requeue_skb (net/sched/sch_generic.c)
      * Requeues a packet whose transmission failed.
-     * \param item the packet to requeue
+     * @param item the packet to requeue
      */
     void Requeue(Ptr<QueueDiscItem> item);
 
@@ -654,22 +654,22 @@
      * Modelled after the Linux function sch_direct_xmit (net/sched/sch_generic.c)
      * Sends a packet to the device if the device queue is not stopped, and requeues
      * it otherwise.
-     * \param item the packet to transmit
-     * \return true if the device queue is not stopped and the queue disc is not empty
+     * @param item the packet to transmit
+     * @return true if the device queue is not stopped and the queue disc is not empty
      */
     bool Transmit(Ptr<QueueDiscItem> item);
 
     /**
-     * \brief Perform the actions required when the queue disc is notified of
+     * @brief Perform the actions required when the queue disc is notified of
      *        a packet enqueue
-     * \param item item that was enqueued
+     * @param item item that was enqueued
      */
     void PacketEnqueued(Ptr<const QueueDiscItem> item);
 
     /**
-     * \brief Perform the actions required when the queue disc is notified of
+     * @brief Perform the actions required when the queue disc is notified of
      *        a packet dequeue
-     * \param item item that was dequeued
+     * @param item item that was dequeued
      */
     void PacketDequeued(Ptr<const QueueDiscItem> item);
 
@@ -732,11 +732,11 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the stream
- * \param stats the queue disc statistics
- * \returns a reference to the stream
+ * @param os the stream
+ * @param stats the queue disc statistics
+ * @returns a reference to the stream
  */
 std::ostream& operator<<(std::ostream& os, const QueueDisc::Stats& stats);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/traffic-control/model/red-queue-disc.cc ns-3.44/src/traffic-control/model/red-queue-disc.cc
--- ns-3.43/src/traffic-control/model/red-queue-disc.cc	2024-10-09 16:41:10.100656700 -0700
+++ ns-3.44/src/traffic-control/model/red-queue-disc.cc	2025-03-09 16:55:49.719372300 -0700
@@ -177,7 +177,7 @@
                           MakeDoubleChecker<double>())
             .AddAttribute("LastSet",
                           "Store the last time m_curMaxP was updated",
-                          TimeValue(Seconds(0.0)),
+                          TimeValue(Seconds(0)),
                           MakeTimeAccessor(&RedQueueDisc::m_lastSet),
                           MakeTimeChecker())
             .AddAttribute("Rtt",
@@ -693,7 +693,7 @@
         // DROP or MARK
         m_count = 0;
         m_countBytes = 0;
-        /// \todo Implement set bit to mark
+        /// @todo Implement set bit to mark
 
         return true; // drop
     }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/traffic-control/model/red-queue-disc.h ns-3.44/src/traffic-control/model/red-queue-disc.h
--- ns-3.43/src/traffic-control/model/red-queue-disc.h	2024-10-09 16:41:10.100656700 -0700
+++ ns-3.44/src/traffic-control/model/red-queue-disc.h	2025-03-09 16:55:49.719372300 -0700
@@ -62,34 +62,34 @@
 class TraceContainer;
 
 /**
- * \ingroup traffic-control
+ * @ingroup traffic-control
  *
- * \brief A RED packet queue disc
+ * @brief A RED packet queue disc
  */
 class RedQueueDisc : public QueueDisc
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     /**
-     * \brief RedQueueDisc Constructor
+     * @brief RedQueueDisc Constructor
      *
      * Create a RED queue disc
      */
     RedQueueDisc();
 
     /**
-     * \brief Destructor
+     * @brief Destructor
      *
      * Destructor
      */
     ~RedQueueDisc() override;
 
     /**
-     * \brief Used in Feng's Adaptive RED
+     * @brief Used in Feng's Adaptive RED
      */
     enum FengStatus
     {
@@ -99,7 +99,7 @@
     };
 
     /**
-     * \brief Drop types
+     * @brief Drop types
      */
     enum
     {
@@ -109,66 +109,66 @@
     };
 
     /**
-     * \brief Set the alpha value to adapt m_curMaxP.
+     * @brief Set the alpha value to adapt m_curMaxP.
      *
-     * \param alpha The value of alpha to adapt m_curMaxP.
+     * @param alpha The value of alpha to adapt m_curMaxP.
      */
     void SetAredAlpha(double alpha);
 
     /**
-     * \brief Get the alpha value to adapt m_curMaxP.
+     * @brief Get the alpha value to adapt m_curMaxP.
      *
-     * \returns The alpha value to adapt m_curMaxP.
+     * @returns The alpha value to adapt m_curMaxP.
      */
     double GetAredAlpha();
 
     /**
-     * \brief Set the beta value to adapt m_curMaxP.
+     * @brief Set the beta value to adapt m_curMaxP.
      *
-     * \param beta The value of beta to adapt m_curMaxP.
+     * @param beta The value of beta to adapt m_curMaxP.
      */
     void SetAredBeta(double beta);
 
     /**
-     * \brief Get the beta value to adapt m_curMaxP.
+     * @brief Get the beta value to adapt m_curMaxP.
      *
-     * \returns The beta value to adapt m_curMaxP.
+     * @returns The beta value to adapt m_curMaxP.
      */
     double GetAredBeta();
 
     /**
-     * \brief Set the alpha value to adapt m_curMaxP in Feng's Adaptive RED.
+     * @brief Set the alpha value to adapt m_curMaxP in Feng's Adaptive RED.
      *
-     * \param a The value of alpha to adapt m_curMaxP in Feng's Adaptive RED.
+     * @param a The value of alpha to adapt m_curMaxP in Feng's Adaptive RED.
      */
     void SetFengAdaptiveA(double a);
 
     /**
-     * \brief Get the alpha value to adapt m_curMaxP in Feng's Adaptive RED.
+     * @brief Get the alpha value to adapt m_curMaxP in Feng's Adaptive RED.
      *
-     * \returns The alpha value to adapt m_curMaxP in Feng's Adaptive RED.
+     * @returns The alpha value to adapt m_curMaxP in Feng's Adaptive RED.
      */
     double GetFengAdaptiveA();
 
     /**
-     * \brief Set the beta value to adapt m_curMaxP in Feng's Adaptive RED.
+     * @brief Set the beta value to adapt m_curMaxP in Feng's Adaptive RED.
      *
-     * \param b The value of beta to adapt m_curMaxP in Feng's Adaptive RED.
+     * @param b The value of beta to adapt m_curMaxP in Feng's Adaptive RED.
      */
     void SetFengAdaptiveB(double b);
 
     /**
-     * \brief Get the beta value to adapt m_curMaxP in Feng's Adaptive RED.
+     * @brief Get the beta value to adapt m_curMaxP in Feng's Adaptive RED.
      *
-     * \returns The beta value to adapt m_curMaxP in Feng's Adaptive RED.
+     * @returns The beta value to adapt m_curMaxP in Feng's Adaptive RED.
      */
     double GetFengAdaptiveB();
 
     /**
-     * \brief Set the thresh limits of RED.
+     * @brief Set the thresh limits of RED.
      *
-     * \param minTh Minimum thresh in bytes or packets.
-     * \param maxTh Maximum thresh in bytes or packets.
+     * @param minTh Minimum thresh in bytes or packets.
+     * @param maxTh Maximum thresh in bytes or packets.
      */
     void SetTh(double minTh, double maxTh);
 
@@ -177,8 +177,8 @@
      * used by this model.  Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream);
 
@@ -191,7 +191,7 @@
 
   protected:
     /**
-     * \brief Dispose of the object
+     * @brief Dispose of the object
      */
     void DoDispose() override;
 
@@ -202,7 +202,7 @@
     bool CheckConfig() override;
 
     /**
-     * \brief Initialize the queue parameters.
+     * @brief Initialize the queue parameters.
      *
      * Note: if the link bandwidth changes in the course of the
      * simulation, the bandwidth-dependent RED parameters do not change.
@@ -211,41 +211,41 @@
      */
     void InitializeParams() override;
     /**
-     * \brief Compute the average queue size
-     * \param nQueued number of queued packets
-     * \param m simulated number of packets arrival during idle period
-     * \param qAvg average queue size
-     * \param qW queue weight given to cur q size sample
-     * \returns new average queue size
+     * @brief Compute the average queue size
+     * @param nQueued number of queued packets
+     * @param m simulated number of packets arrival during idle period
+     * @param qAvg average queue size
+     * @param qW queue weight given to cur q size sample
+     * @returns new average queue size
      */
     double Estimator(uint32_t nQueued, uint32_t m, double qAvg, double qW);
     /**
-     * \brief Update m_curMaxP
-     * \param newAve new average queue length
+     * @brief Update m_curMaxP
+     * @param newAve new average queue length
      */
     void UpdateMaxP(double newAve);
     /**
-     * \brief Update m_curMaxP based on Feng's Adaptive RED
-     * \param newAve new average queue length
+     * @brief Update m_curMaxP based on Feng's Adaptive RED
+     * @param newAve new average queue length
      */
     void UpdateMaxPFeng(double newAve);
     /**
-     * \brief Check if a packet needs to be dropped due to probability mark
-     * \param item queue item
-     * \param qSize queue size
-     * \returns false for no drop/mark, true for drop
+     * @brief Check if a packet needs to be dropped due to probability mark
+     * @param item queue item
+     * @param qSize queue size
+     * @returns false for no drop/mark, true for drop
      */
     bool DropEarly(Ptr<QueueDiscItem> item, uint32_t qSize);
     /**
-     * \brief Returns a probability using these function parameters for the DropEarly function
-     * \returns Prob. of packet drop before "count"
+     * @brief Returns a probability using these function parameters for the DropEarly function
+     * @returns Prob. of packet drop before "count"
      */
     double CalculatePNew();
     /**
-     * \brief Returns a probability using these function parameters for the DropEarly function
-     * \param p Prob. of packet drop before "count"
-     * \param size packet size
-     * \returns Prob. of packet drop
+     * @brief Returns a probability using these function parameters for the DropEarly function
+     * @param p Prob. of packet drop before "count"
+     * @param size packet size
+     * @returns Prob. of packet drop
      */
     double ModifyP(double p, uint32_t size);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/traffic-control/model/tbf-queue-disc.h ns-3.44/src/traffic-control/model/tbf-queue-disc.h
--- ns-3.43/src/traffic-control/model/tbf-queue-disc.h	2024-10-09 16:41:10.100656700 -0700
+++ ns-3.44/src/traffic-control/model/tbf-queue-disc.h	2025-03-09 16:55:49.719372300 -0700
@@ -31,106 +31,106 @@
 {
 
 /**
- * \ingroup traffic-control
+ * @ingroup traffic-control
  *
- * \brief A TBF packet queue disc
+ * @brief A TBF packet queue disc
  */
 class TbfQueueDisc : public QueueDisc
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief TbfQueueDisc Constructor
+     * @brief TbfQueueDisc Constructor
      *
      * Create a TBF queue disc
      */
     TbfQueueDisc();
 
     /**
-     * \brief Destructor
+     * @brief Destructor
      *
      * Destructor
      */
     ~TbfQueueDisc() override;
 
     /**
-     * \brief Set the size of the first bucket in bytes.
+     * @brief Set the size of the first bucket in bytes.
      *
-     * \param burst The size of first bucket in bytes.
+     * @param burst The size of first bucket in bytes.
      */
     void SetBurst(uint32_t burst);
 
     /**
-     * \brief Get the size of the first bucket in bytes.
+     * @brief Get the size of the first bucket in bytes.
      *
-     * \returns The size of the first bucket in bytes.
+     * @returns The size of the first bucket in bytes.
      */
     uint32_t GetBurst() const;
 
     /**
-     * \brief Set the size of the second bucket in bytes.
+     * @brief Set the size of the second bucket in bytes.
      *
-     * \param mtu The size of second bucket in bytes.
+     * @param mtu The size of second bucket in bytes.
      */
     void SetMtu(uint32_t mtu);
 
     /**
-     * \brief Get the size of the second bucket in bytes.
+     * @brief Get the size of the second bucket in bytes.
      *
-     * \returns The size of the second bucket in bytes.
+     * @returns The size of the second bucket in bytes.
      */
     uint32_t GetMtu() const;
 
     /**
-     * \brief Set the rate of the tokens entering the first bucket.
+     * @brief Set the rate of the tokens entering the first bucket.
      *
-     * \param rate The rate of first bucket tokens.
+     * @param rate The rate of first bucket tokens.
      */
     void SetRate(DataRate rate);
 
     /**
-     * \brief Get the rate of the tokens entering the first bucket.
+     * @brief Get the rate of the tokens entering the first bucket.
      *
-     * \returns The rate of first bucket tokens.
+     * @returns The rate of first bucket tokens.
      */
     DataRate GetRate() const;
 
     /**
-     * \brief Set the rate of the tokens entering the second bucket.
+     * @brief Set the rate of the tokens entering the second bucket.
      *
-     * \param peakRate The rate of second bucket tokens.
+     * @param peakRate The rate of second bucket tokens.
      */
     void SetPeakRate(DataRate peakRate);
 
     /**
-     * \brief Get the rate of the tokens entering the second bucket.
+     * @brief Get the rate of the tokens entering the second bucket.
      *
-     * \returns The rate of second bucket tokens.
+     * @returns The rate of second bucket tokens.
      */
     DataRate GetPeakRate() const;
 
     /**
-     * \brief Get the current number of tokens inside the first bucket in bytes.
+     * @brief Get the current number of tokens inside the first bucket in bytes.
      *
-     * \returns The number of first bucket tokens in bytes.
+     * @returns The number of first bucket tokens in bytes.
      */
     uint32_t GetFirstBucketTokens() const;
 
     /**
-     * \brief Get the current number of tokens inside the second bucket in bytes.
+     * @brief Get the current number of tokens inside the second bucket in bytes.
      *
-     * \returns The number of second bucket tokens in bytes.
+     * @returns The number of second bucket tokens in bytes.
      */
     uint32_t GetSecondBucketTokens() const;
 
   protected:
     /**
-     * \brief Dispose of the object
+     * @brief Dispose of the object
      */
     void DoDispose() override;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/traffic-control/model/traffic-control-layer.h ns-3.44/src/traffic-control/model/traffic-control-layer.h
--- ns-3.43/src/traffic-control/model/traffic-control-layer.h	2024-10-09 16:41:10.100656700 -0700
+++ ns-3.44/src/traffic-control/model/traffic-control-layer.h	2025-03-09 16:55:49.719372300 -0700
@@ -25,7 +25,7 @@
 class NetDeviceQueueInterface;
 
 /**
- * \defgroup traffic-control Traffic Control model
+ * @defgroup traffic-control Traffic Control model
  */
 
 /**
@@ -35,9 +35,9 @@
  * processing packets and performing actions on them: scheduling, dropping,
  * marking, policing, etc.
  *
- * \ingroup traffic-control
+ * @ingroup traffic-control
  *
- * \brief Traffic control layer class
+ * @brief Traffic control layer class
  *
  * This object represents the main interface of the Traffic Control Module.
  * Basically, we manage both IN and OUT directions (sometimes called RX and TX,
@@ -88,19 +88,19 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Get the type ID for the instance
-     * \return the instance TypeId
+     * @brief Get the type ID for the instance
+     * @return the instance TypeId
      */
     TypeId GetInstanceTypeId() const override;
 
     /**
-     * \brief Constructor
+     * @brief Constructor
      */
     TrafficControlLayer();
 
@@ -111,19 +111,19 @@
     TrafficControlLayer& operator=(const TrafficControlLayer&) = delete;
 
     /**
-     * \brief Register an IN handler
+     * @brief Register an IN handler
      *
      * The handler will be invoked when a packet is received to pass it to
      * upper  layers.
      *
-     * \param handler the handler to register
-     * \param protocolType the type of protocol this handler is
+     * @param handler the handler to register
+     * @param protocolType the type of protocol this handler is
      *        interested in. This protocol type is a so-called
      *        EtherType, as registered here:
      *        http://standards.ieee.org/regauth/ethertype/eth.txt
      *        the value zero is interpreted as matching all
      *        protocols.
-     * \param device the device attached to this handler. If the
+     * @param device the device attached to this handler. If the
      *        value is zero, the handler is attached to all
      *        devices.
      */
@@ -135,7 +135,7 @@
     typedef std::vector<Ptr<QueueDisc>> QueueDiscVector;
 
     /**
-     * \brief Collect information needed to determine how to handle packets
+     * @brief Collect information needed to determine how to handle packets
      *        destined to each of the NetDevices of this node
      *
      * Checks whether a NetDeviceQueueInterface objects is aggregated to each of
@@ -144,47 +144,47 @@
     virtual void ScanDevices();
 
     /**
-     * \brief This method can be used to set the root queue disc installed on a device
+     * @brief This method can be used to set the root queue disc installed on a device
      *
-     * \param device the device on which the provided queue disc will be installed
-     * \param qDisc the queue disc to be installed as root queue disc on device
+     * @param device the device on which the provided queue disc will be installed
+     * @param qDisc the queue disc to be installed as root queue disc on device
      */
     virtual void SetRootQueueDiscOnDevice(Ptr<NetDevice> device, Ptr<QueueDisc> qDisc);
 
     /**
-     * \brief This method can be used to get the root queue disc installed on a device
+     * @brief This method can be used to get the root queue disc installed on a device
      *
-     * \param device the device on which the requested root queue disc is installed
-     * \return the root queue disc installed on the given device
+     * @param device the device on which the requested root queue disc is installed
+     * @return the root queue disc installed on the given device
      */
     virtual Ptr<QueueDisc> GetRootQueueDiscOnDevice(Ptr<NetDevice> device) const;
 
     /**
-     * \brief This method can be used to remove the root queue disc (and associated
+     * @brief This method can be used to remove the root queue disc (and associated
      *        filters, classes and queues) installed on a device
      *
-     * \param device the device on which the installed queue disc will be deleted
+     * @param device the device on which the installed queue disc will be deleted
      */
     virtual void DeleteRootQueueDiscOnDevice(Ptr<NetDevice> device);
 
     /**
-     * \brief Set node associated with this stack.
-     * \param node node to set
+     * @brief Set node associated with this stack.
+     * @param node node to set
      */
     void SetNode(Ptr<Node> node);
 
     /**
-     * \brief Called by NetDevices, incoming packet
+     * @brief Called by NetDevices, incoming packet
      *
      * After analyses and scheduling, this method will call the right handler
      * to pass the packet up in the stack.
      *
-     * \param device network device
-     * \param p the packet
-     * \param protocol next header value
-     * \param from address of the correspondent
-     * \param to address of the destination
-     * \param packetType type of the packet
+     * @param device network device
+     * @param p the packet
+     * @param protocol next header value
+     * @param from address of the correspondent
+     * @param to address of the destination
+     * @param packetType type of the packet
      */
     virtual void Receive(Ptr<NetDevice> device,
                          Ptr<const Packet> p,
@@ -193,10 +193,10 @@
                          const Address& to,
                          NetDevice::PacketType packetType);
     /**
-     * \brief Called from upper layer to queue a packet for the transmission.
+     * @brief Called from upper layer to queue a packet for the transmission.
      *
-     * \param device the device the packet must be sent to
-     * \param item a queue item including a packet and additional information
+     * @param device the device the packet must be sent to
+     * @param item a queue item including a packet and additional information
      */
     virtual void Send(Ptr<NetDevice> device, Ptr<QueueDiscItem> item);
 
@@ -207,7 +207,7 @@
 
   private:
     /**
-     * \brief Protocol handler entry.
+     * @brief Protocol handler entry.
      * This structure is used to demultiplex all the protocols.
      */
     struct ProtocolHandlerEntry
@@ -219,7 +219,7 @@
     };
 
     /**
-     * \brief Information to store for each device
+     * @brief Information to store for each device
      */
     struct NetDeviceInfo
     {
@@ -232,14 +232,14 @@
     typedef std::vector<ProtocolHandlerEntry> ProtocolHandlerList;
 
     /**
-     * \brief Required by the object map accessor
-     * \return the number of devices in the m_netDevices map
+     * @brief Required by the object map accessor
+     * @return the number of devices in the m_netDevices map
      */
     uint32_t GetNDevices() const;
     /**
-     * \brief Required by the object map accessor
-     * \param index the index of the device in the node's device list
-     * \return the root queue disc installed on the specified device
+     * @brief Required by the object map accessor
+     * @param index the index of the device in the node's device list
+     * @return the root queue disc installed on the specified device
      */
     Ptr<QueueDisc> GetRootQueueDiscOnDeviceByIndex(uint32_t index) const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/traffic-control/test/adaptive-red-queue-disc-test-suite.cc ns-3.44/src/traffic-control/test/adaptive-red-queue-disc-test-suite.cc
--- ns-3.43/src/traffic-control/test/adaptive-red-queue-disc-test-suite.cc	2024-10-09 16:41:10.100656700 -0700
+++ ns-3.44/src/traffic-control/test/adaptive-red-queue-disc-test-suite.cc	2025-03-09 16:55:49.727372400 -0700
@@ -19,15 +19,15 @@
 using namespace ns3;
 
 /**
- * \ingroup traffic-control
- * \ingroup tests
- * \defgroup traffic-control-test traffic-control module tests
+ * @ingroup traffic-control
+ * @ingroup tests
+ * @defgroup traffic-control-test traffic-control module tests
  */
 
 /**
- * \ingroup traffic-control-test
+ * @ingroup traffic-control-test
  *
- * \brief Ared Queue Disc Test Item
+ * @brief Ared Queue Disc Test Item
  */
 class AredQueueDiscTestItem : public QueueDiscItem
 {
@@ -35,8 +35,8 @@
     /**
      * Constructor
      *
-     * \param p packet
-     * \param addr address
+     * @param p packet
+     * @param addr address
      */
     AredQueueDiscTestItem(Ptr<Packet> p, const Address& addr);
     ~AredQueueDiscTestItem() override;
@@ -71,9 +71,9 @@
 }
 
 /**
- * \ingroup traffic-control-test
+ * @ingroup traffic-control-test
  *
- * \brief Ared Queue Disc Test Case
+ * @brief Ared Queue Disc Test Case
  */
 class AredQueueDiscTestCase : public TestCase
 {
@@ -84,21 +84,21 @@
   private:
     /**
      * Enqueue function
-     * \param queue the queue disc
-     * \param size the size
-     * \param nPkt the number of packets
+     * @param queue the queue disc
+     * @param size the size
+     * @param nPkt the number of packets
      */
     void Enqueue(Ptr<RedQueueDisc> queue, uint32_t size, uint32_t nPkt);
     /**
      * Enqueue with delay function
-     * \param queue the queue disc
-     * \param size the size
-     * \param nPkt the number of packets
+     * @param queue the queue disc
+     * @param size the size
+     * @param nPkt the number of packets
      */
     void EnqueueWithDelay(Ptr<RedQueueDisc> queue, uint32_t size, uint32_t nPkt);
     /**
      * Run ARED queue disc test function
-     * \param mode the test mode
+     * @param mode the test mode
      */
     void RunAredDiscTest(QueueSizeUnit mode);
 };
@@ -382,7 +382,7 @@
     double delay = 0.01; // enqueue packets with delay to allow m_curMaxP to adapt
     for (uint32_t i = 0; i < nPkt; i++)
     {
-        Simulator::Schedule(Time(Seconds((i + 1) * delay)),
+        Simulator::Schedule(Seconds((i + 1) * delay),
                             &AredQueueDiscTestCase::Enqueue,
                             this,
                             queue,
@@ -400,9 +400,9 @@
 }
 
 /**
- * \ingroup traffic-control-test
+ * @ingroup traffic-control-test
  *
- * \brief Ared Queue Disc Test Suite
+ * @brief Ared Queue Disc Test Suite
  */
 static class AredQueueDiscTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/traffic-control/test/cobalt-queue-disc-test-suite.cc ns-3.44/src/traffic-control/test/cobalt-queue-disc-test-suite.cc
--- ns-3.43/src/traffic-control/test/cobalt-queue-disc-test-suite.cc	2024-10-09 16:41:10.100656700 -0700
+++ ns-3.44/src/traffic-control/test/cobalt-queue-disc-test-suite.cc	2025-03-09 16:55:49.727372400 -0700
@@ -22,9 +22,9 @@
 using namespace ns3;
 
 /**
- * \ingroup traffic-control-test
+ * @ingroup traffic-control-test
  *
- * \brief Cobalt Queue Disc Test Item
+ * @brief Cobalt Queue Disc Test Item
  */
 class CobaltQueueDiscTestItem : public QueueDiscItem
 {
@@ -32,9 +32,9 @@
     /**
      * Constructor
      *
-     * \param p packet
-     * \param addr address
-     * \param ecnCapable ECN capable
+     * @param p packet
+     * @param addr address
+     * @param ecnCapable ECN capable
      */
     CobaltQueueDiscTestItem(Ptr<Packet> p, const Address& addr, bool ecnCapable);
     ~CobaltQueueDiscTestItem() override;
@@ -75,9 +75,9 @@
 }
 
 /**
- * \ingroup traffic-control-test
+ * @ingroup traffic-control-test
  *
- * \brief Test 1: simple enqueue/dequeue with no drops
+ * @brief Test 1: simple enqueue/dequeue with no drops
  */
 class CobaltQueueDiscBasicEnqueueDequeue : public TestCase
 {
@@ -85,16 +85,16 @@
     /**
      * Constructor
      *
-     * \param mode the mode
+     * @param mode the mode
      */
     CobaltQueueDiscBasicEnqueueDequeue(QueueSizeUnit mode);
     void DoRun() override;
 
     /**
      * Queue test size function
-     * \param queue the queue disc
-     * \param size the size
-     * \param error the error string
+     * @param queue the queue disc
+     * @param size the size
+     * @param error the error string
      *
      */
 
@@ -245,9 +245,9 @@
 }
 
 /**
- * \ingroup traffic-control-test
+ * @ingroup traffic-control-test
  *
- * \brief Test 2: Cobalt Queue Disc Drop Test Item
+ * @brief Test 2: Cobalt Queue Disc Drop Test Item
  */
 class CobaltQueueDiscDropTest : public TestCase
 {
@@ -256,23 +256,23 @@
     void DoRun() override;
     /**
      * Enqueue function
-     * \param queue the queue disc
-     * \param size the size
-     * \param nPkt the number of packets
+     * @param queue the queue disc
+     * @param size the size
+     * @param nPkt the number of packets
      */
     void Enqueue(Ptr<CobaltQueueDisc> queue, uint32_t size, uint32_t nPkt);
     /**
      * Run Cobalt test function
-     * \param mode the mode
+     * @param mode the mode
      */
     void RunDropTest(QueueSizeUnit mode);
     /**
      * Enqueue the given number of packets, each of the given size,
      * at different times.
      *
-     * \param queue the queue disc
-     * \param size the packet size in bytes
-     * \param nPkt the number of packets
+     * @param queue the queue disc
+     * @param size the packet size in bytes
+     * @param nPkt the number of packets
      */
     void EnqueueWithDelay(Ptr<CobaltQueueDisc> queue, uint32_t size, uint32_t nPkt);
 };
@@ -318,7 +318,7 @@
         EnqueueWithDelay(queue, 1, 200);
     }
 
-    Simulator::Stop(Seconds(8.0));
+    Simulator::Stop(Seconds(8));
     Simulator::Run();
 
     QueueDisc::Stats st = queue->GetStats();
@@ -337,7 +337,7 @@
     double delay = 0.01; // enqueue packets with delay
     for (uint32_t i = 0; i < nPkt; i++)
     {
-        Simulator::Schedule(Time(Seconds((i + 1) * delay)),
+        Simulator::Schedule(Seconds((i + 1) * delay),
                             &CobaltQueueDiscDropTest::Enqueue,
                             this,
                             queue,
@@ -365,9 +365,9 @@
 }
 
 /**
- * \ingroup traffic-control-test
+ * @ingroup traffic-control-test
  *
- * \brief Test 3: Cobalt Queue Disc ECN marking Test Item
+ * @brief Test 3: Cobalt Queue Disc ECN marking Test Item
  */
 class CobaltQueueDiscMarkTest : public TestCase
 {
@@ -375,31 +375,31 @@
     /**
      * Constructor
      *
-     * \param mode the mode
+     * @param mode the mode
      */
     CobaltQueueDiscMarkTest(QueueSizeUnit mode);
     void DoRun() override;
 
   private:
     /**
-     * \brief Enqueue function
-     * \param queue the queue disc
-     * \param size the size
-     * \param nPkt the number of packets
-     * \param ecnCapable ECN capable traffic
+     * @brief Enqueue function
+     * @param queue the queue disc
+     * @param size the size
+     * @param nPkt the number of packets
+     * @param ecnCapable ECN capable traffic
      */
     void Enqueue(Ptr<CobaltQueueDisc> queue, uint32_t size, uint32_t nPkt, bool ecnCapable);
     /**
-     * \brief Dequeue function
-     * \param queue the queue disc
-     * \param modeSize the mode size
-     * \param testCase the test case number
+     * @brief Dequeue function
+     * @param queue the queue disc
+     * @param modeSize the mode size
+     * @param testCase the test case number
      */
     void Dequeue(Ptr<CobaltQueueDisc> queue, uint32_t modeSize, uint32_t testCase);
     /**
-     * \brief Drop next tracer function
-     * \param oldVal the old value of m_dropNext
-     * \param newVal the new value of m_dropNext
+     * @brief Drop next tracer function
+     * @param oldVal the old value of m_dropNext
+     * @param newVal the new value of m_dropNext
      */
     void DropNextTracer(int64_t oldVal, int64_t newVal);
     QueueSizeUnit m_mode;             ///< mode
@@ -818,9 +818,9 @@
 }
 
 /**
- * \ingroup traffic-control-test
+ * @ingroup traffic-control-test
  *
- * \brief Test 4: Cobalt Queue Disc CE Threshold marking Test Item
+ * @brief Test 4: Cobalt Queue Disc CE Threshold marking Test Item
  */
 class CobaltQueueDiscCeThresholdTest : public TestCase
 {
@@ -828,7 +828,7 @@
     /**
      * Constructor
      *
-     * \param mode the queue size unit mode
+     * @param mode the queue size unit mode
      */
     CobaltQueueDiscCeThresholdTest(QueueSizeUnit mode);
     ~CobaltQueueDiscCeThresholdTest() override;
@@ -836,32 +836,32 @@
   private:
     void DoRun() override;
     /**
-     * \brief Enqueue function
-     * \param queue the queue disc
-     * \param size the size
-     * \param nPkt the number of packets
+     * @brief Enqueue function
+     * @param queue the queue disc
+     * @param size the size
+     * @param nPkt the number of packets
      */
     void Enqueue(Ptr<CobaltQueueDisc> queue, uint32_t size, uint32_t nPkt);
     /**
-     * \brief Enqueue with delay function
-     * \param queue the queue disc
-     * \param size the size
-     * \param nPkt the number of packets
-     * \param delay the delay between the enqueueing of the packets
+     * @brief Enqueue with delay function
+     * @param queue the queue disc
+     * @param size the size
+     * @param nPkt the number of packets
+     * @param delay the delay between the enqueueing of the packets
      */
     void EnqueueWithDelay(Ptr<CobaltQueueDisc> queue, uint32_t size, uint32_t nPkt, Time delay);
     /**
-     * \brief Dequeue function
-     * \param queue the queue disc
-     * \param modeSize the mode size
+     * @brief Dequeue function
+     * @param queue the queue disc
+     * @param modeSize the mode size
      */
     void Dequeue(Ptr<CobaltQueueDisc> queue, uint32_t modeSize);
     /**
-     * \brief Dequeue with delay function
-     * \param queue the queue disc
-     * \param modeSize the mode size
-     * \param nPkt the number of packets
-     * \param delay the delay between the enqueueing of the packets
+     * @brief Dequeue with delay function
+     * @param queue the queue disc
+     * @param modeSize the mode size
+     * @param nPkt the number of packets
+     * @param delay the delay between the enqueueing of the packets
      */
     void DequeueWithDelay(Ptr<CobaltQueueDisc> queue, uint32_t modeSize, uint32_t nPkt, Time delay);
     QueueSizeUnit m_mode; ///< mode
@@ -895,7 +895,7 @@
 {
     for (uint32_t i = 0; i < nPkt; i++)
     {
-        Simulator::Schedule(Time(Seconds((i + 1) * delay.GetSeconds())),
+        Simulator::Schedule(Seconds((i + 1) * delay.GetSeconds()),
                             &CobaltQueueDiscCeThresholdTest::Enqueue,
                             this,
                             queue,
@@ -940,7 +940,7 @@
 {
     for (uint32_t i = 0; i < nPkt; i++)
     {
-        Simulator::Schedule(Time(Seconds((i + 1) * delay.GetSeconds())),
+        Simulator::Schedule(Seconds((i + 1) * delay.GetSeconds()),
                             &CobaltQueueDiscCeThresholdTest::Dequeue,
                             this,
                             queue,
@@ -1029,9 +1029,9 @@
 }
 
 /**
- * \ingroup traffic-control-test
+ * @ingroup traffic-control-test
  *
- * \brief Test 5: Cobalt Queue Disc Enhanced Blue Test Item
+ * @brief Test 5: Cobalt Queue Disc Enhanced Blue Test Item
  * This test checks that the Blue Enhancement is working correctly. This test checks that Pdrop
  * should increase as expected with a certain number of dropped packets which is fixed by assigning
  * a stream to the uniform random variable. This test case is divided into 2 sub test cases 1) With
@@ -1046,7 +1046,7 @@
     /**
      * Constructor
      *
-     * \param mode the queue size unit mode
+     * @param mode the queue size unit mode
      */
     CobaltQueueDiscEnhancedBlueTest(QueueSizeUnit mode);
     ~CobaltQueueDiscEnhancedBlueTest() override;
@@ -1055,21 +1055,21 @@
     void DoRun() override;
     /**
      * Enqueue function
-     * \param queue the queue disc
-     * \param size the size
-     * \param nPkt the number of packets
+     * @param queue the queue disc
+     * @param size the size
+     * @param nPkt the number of packets
      */
     void Enqueue(Ptr<CobaltQueueDisc> queue, uint32_t size, uint32_t nPkt);
     /**
-     * \brief Dequeue function
-     * \param queue the queue disc
+     * @brief Dequeue function
+     * @param queue the queue disc
      */
     void Dequeue(Ptr<CobaltQueueDisc> queue);
     /**
-     * \brief Dequeue with delay function
-     * \param queue the queue disc
-     * \param nPkt the number of packets
-     * \param delay the delay between the enqueueing of the packets
+     * @brief Dequeue with delay function
+     * @param queue the queue disc
+     * @param nPkt the number of packets
+     * @param delay the delay between the enqueueing of the packets
      */
     void DequeueWithDelay(Ptr<CobaltQueueDisc> queue, uint32_t nPkt, Time delay);
     QueueSizeUnit m_mode; ///< mode
@@ -1106,7 +1106,7 @@
     Enqueue(queue, modeSize, 200);
     DequeueWithDelay(queue, 100, MilliSeconds(10));
 
-    Simulator::Stop(Seconds(8.0));
+    Simulator::Stop(Seconds(8));
     Simulator::Run();
 
     QueueDisc::Stats st = queue->GetStats();
@@ -1135,7 +1135,7 @@
     Enqueue(queue, modeSize, 200);
     DequeueWithDelay(queue, 100, MilliSeconds(10));
 
-    Simulator::Stop(Seconds(8.0));
+    Simulator::Stop(Seconds(8));
     Simulator::Run();
 
     st = queue->GetStats();
@@ -1170,7 +1170,7 @@
 {
     for (uint32_t i = 0; i < nPkt; i++)
     {
-        Simulator::Schedule(Time(Seconds((i + 1) * delay.GetSeconds())),
+        Simulator::Schedule(Seconds((i + 1) * delay.GetSeconds()),
                             &CobaltQueueDiscEnhancedBlueTest::Dequeue,
                             this,
                             queue);
@@ -1178,7 +1178,7 @@
 }
 
 /**
- * \ingroup traffic-control-test
+ * @ingroup traffic-control-test
  * The COBALT queue disc test suite.
  */
 static class CobaltQueueDiscTestSuite : public TestSuite
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/traffic-control/test/codel-queue-disc-test-suite.cc ns-3.44/src/traffic-control/test/codel-queue-disc-test-suite.cc
--- ns-3.43/src/traffic-control/test/codel-queue-disc-test-suite.cc	2024-10-09 16:41:10.100656700 -0700
+++ ns-3.44/src/traffic-control/test/codel-queue-disc-test-suite.cc	2025-03-09 16:55:49.727372400 -0700
@@ -46,9 +46,9 @@
 // End Linux borrow
 
 /**
- * \ingroup traffic-control-test
+ * @ingroup traffic-control-test
  *
- * \brief Codel Queue Disc Test Item
+ * @brief Codel Queue Disc Test Item
  */
 class CodelQueueDiscTestItem : public QueueDiscItem
 {
@@ -56,9 +56,9 @@
     /**
      * Constructor
      *
-     * \param p packet
-     * \param addr address
-     * \param ecnCapable ECN capable
+     * @param p packet
+     * @param addr address
+     * @param ecnCapable ECN capable
      */
     CodelQueueDiscTestItem(Ptr<Packet> p, const Address& addr, bool ecnCapable);
     ~CodelQueueDiscTestItem() override;
@@ -97,9 +97,9 @@
 }
 
 /**
- * \ingroup traffic-control-test
+ * @ingroup traffic-control-test
  *
- * \brief Test 1: simple enqueue/dequeue with no drops
+ * @brief Test 1: simple enqueue/dequeue with no drops
  */
 class CoDelQueueDiscBasicEnqueueDequeue : public TestCase
 {
@@ -107,7 +107,7 @@
     /**
      * Constructor
      *
-     * \param mode the mode
+     * @param mode the mode
      */
     CoDelQueueDiscBasicEnqueueDequeue(QueueSizeUnit mode);
     void DoRun() override;
@@ -259,9 +259,9 @@
 }
 
 /**
- * \ingroup traffic-control-test
+ * @ingroup traffic-control-test
  *
- * \brief Test 2: enqueue with drops due to queue overflow
+ * @brief Test 2: enqueue with drops due to queue overflow
  */
 class CoDelQueueDiscBasicOverflow : public TestCase
 {
@@ -269,7 +269,7 @@
     /**
      * Constructor
      *
-     * \param mode the mode
+     * @param mode the mode
      */
     CoDelQueueDiscBasicOverflow(QueueSizeUnit mode);
     void DoRun() override;
@@ -277,9 +277,9 @@
   private:
     /**
      * Enqueue function
-     * \param queue the queue disc
-     * \param size the size
-     * \param nPkt the number of packets
+     * @param queue the queue disc
+     * @param size the size
+     * @param nPkt the number of packets
      */
     void Enqueue(Ptr<CoDelQueueDisc> queue, uint32_t size, uint32_t nPkt);
     QueueSizeUnit m_mode; ///< mode
@@ -350,9 +350,9 @@
 }
 
 /**
- * \ingroup traffic-control-test
+ * @ingroup traffic-control-test
  *
- * \brief Test 3: NewtonStep unit test - test against explicit port of Linux implementation
+ * @brief Test 3: NewtonStep unit test - test against explicit port of Linux implementation
  */
 class CoDelQueueDiscNewtonStepTest : public TestCase
 {
@@ -378,7 +378,7 @@
     {
         for (uint32_t count = 1; count < 0xff; count *= 2)
         {
-            result = queue->NewtonStep(recInvSqrt, count);
+            result = CoDelQueueDisc::NewtonStep(recInvSqrt, count);
             // Test that ns-3 value is exactly the same as the Linux value
             NS_TEST_ASSERT_MSG_EQ(_codel_Newton_step(recInvSqrt, count),
                                   result,
@@ -388,9 +388,9 @@
 }
 
 /**
- * \ingroup traffic-control-test
+ * @ingroup traffic-control-test
  *
- * \brief Test 4: ControlLaw unit test - test against explicit port of Linux implementation
+ * @brief Test 4: ControlLaw unit test - test against explicit port of Linux implementation
  */
 class CoDelQueueDiscControlLawTest : public TestCase
 {
@@ -399,10 +399,10 @@
     void DoRun() override;
     /**
      * Codel control law function
-     * \param t
-     * \param interval
-     * \param recInvSqrt
-     * \returns the codel control law
+     * @param t
+     * @param interval
+     * @param recInvSqrt
+     * @returns the codel control law
      */
     uint32_t _codel_control_law(uint32_t t, uint32_t interval, uint32_t recInvSqrt);
 };
@@ -436,7 +436,7 @@
         for (uint16_t recInvSqrt = 0xff; recInvSqrt > 0; recInvSqrt /= 2)
         {
             codelTimeVal = queue->Time2CoDel(timeVal);
-            uint32_t ns3Result = queue->ControlLaw(codelTimeVal, interval, recInvSqrt);
+            uint32_t ns3Result = CoDelQueueDisc::ControlLaw(codelTimeVal, interval, recInvSqrt);
             uint32_t linuxResult = _codel_control_law(codelTimeVal, interval, recInvSqrt);
             NS_TEST_ASSERT_MSG_EQ(ns3Result,
                                   linuxResult,
@@ -446,9 +446,9 @@
 }
 
 /**
- * \ingroup traffic-control-test
+ * @ingroup traffic-control-test
  *
- * \brief Test 5: enqueue/dequeue with drops according to CoDel algorithm
+ * @brief Test 5: enqueue/dequeue with drops according to CoDel algorithm
  */
 class CoDelQueueDiscBasicDrop : public TestCase
 {
@@ -456,7 +456,7 @@
     /**
      * Constructor
      *
-     * \param mode the mode
+     * @param mode the mode
      */
     CoDelQueueDiscBasicDrop(QueueSizeUnit mode);
     void DoRun() override;
@@ -464,20 +464,20 @@
   private:
     /**
      * Enqueue function
-     * \param queue the queue disc
-     * \param size the size
-     * \param nPkt the number of packets
+     * @param queue the queue disc
+     * @param size the size
+     * @param nPkt the number of packets
      */
     void Enqueue(Ptr<CoDelQueueDisc> queue, uint32_t size, uint32_t nPkt);
     /** Dequeue function
-     * \param queue the queue disc
-     * \param modeSize the mode size
+     * @param queue the queue disc
+     * @param modeSize the mode size
      */
     void Dequeue(Ptr<CoDelQueueDisc> queue, uint32_t modeSize);
     /**
      * Drop next tracer function
-     * \param oldVal the old value
-     * \param newVal the new value
+     * @param oldVal the old value
+     * @param newVal the new value
      */
     void DropNextTracer(uint32_t oldVal, uint32_t newVal);
     QueueSizeUnit m_mode;     ///< mode
@@ -658,9 +658,9 @@
 }
 
 /**
- * \ingroup traffic-control-test
+ * @ingroup traffic-control-test
  *
- * \brief Test 6: enqueue/dequeue with marks according to CoDel algorithm
+ * @brief Test 6: enqueue/dequeue with marks according to CoDel algorithm
  */
 class CoDelQueueDiscBasicMark : public TestCase
 {
@@ -668,7 +668,7 @@
     /**
      * Constructor
      *
-     * \param mode the mode
+     * @param mode the mode
      */
     CoDelQueueDiscBasicMark(QueueSizeUnit mode);
     void DoRun() override;
@@ -676,22 +676,22 @@
   private:
     /**
      * Enqueue function
-     * \param queue the queue disc
-     * \param size the size
-     * \param nPkt the number of packets
-     * \param ecnCapable ECN capable traffic
+     * @param queue the queue disc
+     * @param size the size
+     * @param nPkt the number of packets
+     * @param ecnCapable ECN capable traffic
      */
     void Enqueue(Ptr<CoDelQueueDisc> queue, uint32_t size, uint32_t nPkt, bool ecnCapable);
     /** Dequeue function
-     * \param queue the queue disc
-     * \param modeSize the mode size
-     * \param testCase the test case number
+     * @param queue the queue disc
+     * @param modeSize the mode size
+     * @param testCase the test case number
      */
     void Dequeue(Ptr<CoDelQueueDisc> queue, uint32_t modeSize, uint32_t testCase);
     /**
      * Drop next tracer function
-     * \param oldVal the old value
-     * \param newVal the new value
+     * @param oldVal the old value
+     * @param newVal the new value
      */
     void DropNextTracer(uint32_t oldVal, uint32_t newVal);
     QueueSizeUnit m_mode;             ///< mode
@@ -1310,9 +1310,9 @@
 }
 
 /**
- * \ingroup traffic-control-test
+ * @ingroup traffic-control-test
  *
- * \brief CoDel Queue Disc Test Suite
+ * @brief CoDel Queue Disc Test Suite
  */
 static class CoDelQueueDiscTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/traffic-control/test/fifo-queue-disc-test-suite.cc ns-3.44/src/traffic-control/test/fifo-queue-disc-test-suite.cc
--- ns-3.43/src/traffic-control/test/fifo-queue-disc-test-suite.cc	2024-10-09 16:41:10.100656700 -0700
+++ ns-3.44/src/traffic-control/test/fifo-queue-disc-test-suite.cc	2025-03-09 16:55:49.727372400 -0700
@@ -23,9 +23,9 @@
 using namespace ns3;
 
 /**
- * \ingroup traffic-control-test
+ * @ingroup traffic-control-test
  *
- * \brief Fifo Queue Disc Test Item
+ * @brief Fifo Queue Disc Test Item
  */
 class FifoQueueDiscTestItem : public QueueDiscItem
 {
@@ -33,8 +33,8 @@
     /**
      * Constructor
      *
-     * \param p the packet
-     * \param addr the address
+     * @param p the packet
+     * @param addr the address
      */
     FifoQueueDiscTestItem(Ptr<Packet> p, const Address& addr);
     ~FifoQueueDiscTestItem() override;
@@ -69,9 +69,9 @@
 }
 
 /**
- * \ingroup traffic-control-test
+ * @ingroup traffic-control-test
  *
- * \brief Fifo Queue Disc Test Case
+ * @brief Fifo Queue Disc Test Case
  */
 class FifoQueueDiscTestCase : public TestCase
 {
@@ -82,14 +82,14 @@
   private:
     /**
      * Run test function
-     * \param mode the test mode
+     * @param mode the test mode
      */
     void RunFifoTest(QueueSizeUnit mode);
     /**
      * Run test function
-     * \param q the queue disc
-     * \param qSize the expected size of the queue disc
-     * \param pktSize the packet size
+     * @param q the queue disc
+     * @param qSize the expected size of the queue disc
+     * @param pktSize the packet size
      */
     void DoRunFifoTest(Ptr<FifoQueueDisc> q, uint32_t qSize, uint32_t pktSize);
 };
@@ -255,9 +255,9 @@
 }
 
 /**
- * \ingroup traffic-control-test
+ * @ingroup traffic-control-test
  *
- * \brief Fifo Queue Disc Test Suite
+ * @brief Fifo Queue Disc Test Suite
  */
 static class FifoQueueDiscTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/traffic-control/test/pie-queue-disc-test-suite.cc ns-3.44/src/traffic-control/test/pie-queue-disc-test-suite.cc
--- ns-3.43/src/traffic-control/test/pie-queue-disc-test-suite.cc	2024-10-09 16:41:10.100656700 -0700
+++ ns-3.44/src/traffic-control/test/pie-queue-disc-test-suite.cc	2025-03-09 16:55:49.727372400 -0700
@@ -21,9 +21,9 @@
 using namespace ns3;
 
 /**
- * \ingroup traffic-control-test
+ * @ingroup traffic-control-test
  *
- * \brief Pie Queue Disc Test Item
+ * @brief Pie Queue Disc Test Item
  */
 class PieQueueDiscTestItem : public QueueDiscItem
 {
@@ -31,9 +31,9 @@
     /**
      * Constructor
      *
-     * \param p the packet
-     * \param addr the address
-     * \param ecnCapable ECN capable flag
+     * @param p the packet
+     * @param addr the address
+     * @param ecnCapable ECN capable flag
      */
     PieQueueDiscTestItem(Ptr<Packet> p, const Address& addr, bool ecnCapable);
 
@@ -86,9 +86,9 @@
 }
 
 /**
- * \ingroup traffic-control-test
+ * @ingroup traffic-control-test
  *
- * \brief Pie Queue Disc Test Case
+ * @brief Pie Queue Disc Test Case
  */
 class PieQueueDiscTestCase : public TestCase
 {
@@ -99,10 +99,10 @@
   private:
     /**
      * Enqueue function
-     * \param queue the queue disc
-     * \param size the size
-     * \param nPkt the number of packets
-     * \param testAttributes attributes for testing
+     * @param queue the queue disc
+     * @param size the size
+     * @param nPkt the number of packets
+     * @param testAttributes attributes for testing
      */
     void Enqueue(Ptr<PieQueueDisc> queue,
                  uint32_t size,
@@ -110,10 +110,10 @@
                  Ptr<PieQueueDiscTestItem> testAttributes);
     /**
      * Enqueue with delay function
-     * \param queue the queue disc
-     * \param size the size
-     * \param nPkt the number of packets
-     * \param testAttributes attributes for testing
+     * @param queue the queue disc
+     * @param size the size
+     * @param nPkt the number of packets
+     * @param testAttributes attributes for testing
      */
     void EnqueueWithDelay(Ptr<PieQueueDisc> queue,
                           uint32_t size,
@@ -121,38 +121,38 @@
                           Ptr<PieQueueDiscTestItem> testAttributes);
     /**
      * Dequeue function
-     * \param queue the queue disc
-     * \param nPkt the number of packets
+     * @param queue the queue disc
+     * @param nPkt the number of packets
      */
     void Dequeue(Ptr<PieQueueDisc> queue, uint32_t nPkt);
     /**
      * Dequeue with delay function
-     * \param queue the queue disc
-     * \param delay the delay
-     * \param nPkt the number of packets
+     * @param queue the queue disc
+     * @param delay the delay
+     * @param nPkt the number of packets
      */
     void DequeueWithDelay(Ptr<PieQueueDisc> queue, double delay, uint32_t nPkt);
     /**
      * Run test function
-     * \param mode the test mode
+     * @param mode the test mode
      */
     void RunPieTest(QueueSizeUnit mode);
     /**
-     * \brief Check Drop Probability
-     * \param queue the queue disc
-     * \param testAttributes attributes for testing
+     * @brief Check Drop Probability
+     * @param queue the queue disc
+     * @param testAttributes attributes for testing
      */
     void CheckDropProb(Ptr<PieQueueDisc> queue, Ptr<PieQueueDiscTestItem> testAttributes);
     /**
-     * \brief Check Accumulated Drop Probability
-     * \param queue the queue disc
-     * \param testAttributes attributes for testing
+     * @brief Check Accumulated Drop Probability
+     * @param queue the queue disc
+     * @param testAttributes attributes for testing
      */
     void CheckAccuProb(Ptr<PieQueueDisc> queue, Ptr<PieQueueDiscTestItem> testAttributes);
     /**
-     * \brief Check Maximum Accumulated Drop Probability
-     * \param queue the queue disc
-     * \param testAttributes attributes for testing
+     * @brief Check Maximum Accumulated Drop Probability
+     * @param queue the queue disc
+     * @param testAttributes attributes for testing
      */
     void CheckMaxAccuProb(Ptr<PieQueueDisc> queue, Ptr<PieQueueDiscTestItem> testAttributes);
 };
@@ -291,7 +291,7 @@
     queue->Initialize();
     EnqueueWithDelay(queue, pktSize, 400, testAttributes);
     DequeueWithDelay(queue, 0.012, 400);
-    Simulator::Stop(Seconds(8.0));
+    Simulator::Stop(Seconds(8));
     Simulator::Run();
     QueueDisc::Stats st = queue->GetStats();
     uint32_t test2 = st.GetNDroppedPackets(PieQueueDisc::UNFORCED_DROP);
@@ -324,7 +324,7 @@
     queue->Initialize();
     EnqueueWithDelay(queue, pktSize, 400, testAttributes);
     DequeueWithDelay(queue, 0.012, 400);
-    Simulator::Stop(Seconds(8.0));
+    Simulator::Stop(Seconds(8));
     Simulator::Run();
     st = queue->GetStats();
     uint32_t test3 = st.GetNDroppedPackets(PieQueueDisc::UNFORCED_DROP);
@@ -357,7 +357,7 @@
     queue->Initialize();
     EnqueueWithDelay(queue, pktSize, 400, testAttributes);
     DequeueWithDelay(queue, 0.015, 400); // delay between two successive dequeue events is increased
-    Simulator::Stop(Seconds(8.0));
+    Simulator::Stop(Seconds(8));
     Simulator::Run();
     st = queue->GetStats();
     uint32_t test4 = st.GetNDroppedPackets(PieQueueDisc::UNFORCED_DROP);
@@ -390,7 +390,7 @@
     queue->Initialize();
     EnqueueWithDelay(queue, pktSize, 400, testAttributes);
     DequeueWithDelay(queue, 0.015, 400);
-    Simulator::Stop(Seconds(8.0));
+    Simulator::Stop(Seconds(8));
     Simulator::Run();
     st = queue->GetStats();
     uint32_t test5 = st.GetNDroppedPackets(PieQueueDisc::UNFORCED_DROP);
@@ -414,7 +414,7 @@
     queue->Initialize();
     EnqueueWithDelay(queue, pktSize, 400, testAttributes);
     DequeueWithDelay(queue, 0.014, 400);
-    Simulator::Stop(Seconds(8.0));
+    Simulator::Stop(Seconds(8));
     Simulator::Run();
     st = queue->GetStats();
     uint32_t test6 = st.GetNDroppedPackets(PieQueueDisc::UNFORCED_DROP);
@@ -438,7 +438,7 @@
     testAttributes->m_checkProb = true;
     EnqueueWithDelay(queue, pktSize, 400, testAttributes);
     DequeueWithDelay(queue, 0.014, 400);
-    Simulator::Stop(Seconds(8.0));
+    Simulator::Stop(Seconds(8));
     Simulator::Run();
     st = queue->GetStats();
     uint32_t test7 = st.GetNDroppedPackets(PieQueueDisc::UNFORCED_DROP);
@@ -465,7 +465,7 @@
     testAttributes->m_checkProb = true;
     EnqueueWithDelay(queue, pktSize, 400, testAttributes);
     DequeueWithDelay(queue, 0.014, 400);
-    Simulator::Stop(Seconds(8.0));
+    Simulator::Stop(Seconds(8));
     Simulator::Run();
     st = queue->GetStats();
     uint32_t test8 = st.GetNDroppedPackets(PieQueueDisc::UNFORCED_DROP);
@@ -495,7 +495,7 @@
     queue->Initialize();
     EnqueueWithDelay(queue, pktSize, 400, testAttributes);
     DequeueWithDelay(queue, 0.014, 400);
-    Simulator::Stop(Seconds(8.0));
+    Simulator::Stop(Seconds(8));
     Simulator::Run();
     st = queue->GetStats();
     uint32_t test9 = st.GetNMarkedPackets(PieQueueDisc::UNFORCED_MARK);
@@ -525,7 +525,7 @@
     testAttributes->m_ecnCapable = true;
     EnqueueWithDelay(queue, pktSize, 400, testAttributes);
     DequeueWithDelay(queue, 0.014, 400);
-    Simulator::Stop(Seconds(8.0));
+    Simulator::Stop(Seconds(8));
     Simulator::Run();
     st = queue->GetStats();
     uint32_t test10 = st.GetNMarkedPackets(PieQueueDisc::UNFORCED_MARK);
@@ -556,7 +556,7 @@
     testAttributes->m_checkProb = true;
     EnqueueWithDelay(queue, pktSize, 400, testAttributes);
     DequeueWithDelay(queue, 0.014, 400);
-    Simulator::Stop(Seconds(8.0));
+    Simulator::Stop(Seconds(8));
     Simulator::Run();
     st = queue->GetStats();
     uint32_t test11 = st.GetNMarkedPackets(PieQueueDisc::UNFORCED_MARK);
@@ -589,7 +589,7 @@
     testAttributes->m_checkAccuProb = true;
     EnqueueWithDelay(queue, pktSize, 400, testAttributes);
     DequeueWithDelay(queue, 0.014, 400);
-    Simulator::Stop(Seconds(8.0));
+    Simulator::Stop(Seconds(8));
     Simulator::Run();
     st = queue->GetStats();
     uint32_t test12 = st.GetNDroppedPackets(PieQueueDisc::UNFORCED_DROP);
@@ -619,7 +619,7 @@
     testAttributes->m_setAccuProb = -0.16;
     EnqueueWithDelay(queue, pktSize, 400, testAttributes);
     DequeueWithDelay(queue, 0.014, 400);
-    Simulator::Stop(Seconds(8.0));
+    Simulator::Stop(Seconds(8));
     Simulator::Run();
     st = queue->GetStats();
     uint32_t test13 = st.GetNDroppedPackets(PieQueueDisc::UNFORCED_DROP);
@@ -636,7 +636,7 @@
         queue->SetAttributeFailSafe("MaxSize", QueueSizeValue(QueueSize(mode, qSize))),
         true,
         "Verify that we can actually set the attribute MaxSize");
-    NS_TEST_ASSERT_MSG_EQ(queue->SetAttributeFailSafe("MaxBurstAllowance", TimeValue(Seconds(0.0))),
+    NS_TEST_ASSERT_MSG_EQ(queue->SetAttributeFailSafe("MaxBurstAllowance", TimeValue(Seconds(0))),
                           true,
                           "Verify that we can actually set the attribute MaxBurstAllowance");
     NS_TEST_ASSERT_MSG_EQ(queue->SetAttributeFailSafe("UseDerandomization", BooleanValue(true)),
@@ -650,7 +650,7 @@
     testAttributes->m_setAccuProb = 8.6;
     EnqueueWithDelay(queue, pktSize, 400, testAttributes);
     DequeueWithDelay(queue, 0.014, 400);
-    Simulator::Stop(Seconds(8.0));
+    Simulator::Stop(Seconds(8));
     Simulator::Run();
     st = queue->GetStats();
     uint32_t test14 = st.GetNDroppedPackets(PieQueueDisc::UNFORCED_DROP);
@@ -673,7 +673,7 @@
 
     EnqueueWithDelay(queue, pktSize, 100, testAttributes);
     DequeueWithDelay(queue, 0.02, 100);
-    Simulator::Stop(Seconds(8.0));
+    Simulator::Stop(Seconds(8));
     Simulator::Run();
     st = queue->GetStats();
     uint32_t test15 = st.GetNDroppedPackets(PieQueueDisc::UNFORCED_DROP);
@@ -693,7 +693,7 @@
 
     EnqueueWithDelay(queue, pktSize, 100, testAttributes);
     DequeueWithDelay(queue, 0.02, 100);
-    Simulator::Stop(Seconds(8.0));
+    Simulator::Stop(Seconds(8));
     Simulator::Run();
     st = queue->GetStats();
     uint32_t test16 = st.GetNDroppedPackets(PieQueueDisc::UNFORCED_DROP);
@@ -790,7 +790,7 @@
     double delay = 0.01; // enqueue packets with delay
     for (uint32_t i = 0; i < nPkt; i++)
     {
-        Simulator::Schedule(Time(Seconds((i + 1) * delay)),
+        Simulator::Schedule(Seconds((i + 1) * delay),
                             &PieQueueDiscTestCase::Enqueue,
                             this,
                             queue,
@@ -814,7 +814,7 @@
 {
     for (uint32_t i = 0; i < nPkt; i++)
     {
-        Simulator::Schedule(Time(Seconds((i + 1) * delay)),
+        Simulator::Schedule(Seconds((i + 1) * delay),
                             &PieQueueDiscTestCase::Dequeue,
                             this,
                             queue,
@@ -831,9 +831,9 @@
 }
 
 /**
- * \ingroup traffic-control-test
+ * @ingroup traffic-control-test
  *
- * \brief Pie Queue Disc Test Suite
+ * @brief Pie Queue Disc Test Suite
  */
 static class PieQueueDiscTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/traffic-control/test/prio-queue-disc-test-suite.cc ns-3.44/src/traffic-control/test/prio-queue-disc-test-suite.cc
--- ns-3.43/src/traffic-control/test/prio-queue-disc-test-suite.cc	2024-10-09 16:41:10.100656700 -0700
+++ ns-3.44/src/traffic-control/test/prio-queue-disc-test-suite.cc	2025-03-09 16:55:49.727372400 -0700
@@ -23,9 +23,9 @@
 using namespace ns3;
 
 /**
- * \ingroup traffic-control-test
+ * @ingroup traffic-control-test
  *
- * \brief Prio Queue Disc Test Item
+ * @brief Prio Queue Disc Test Item
  */
 class PrioQueueDiscTestItem : public QueueDiscItem
 {
@@ -33,9 +33,9 @@
     /**
      * Constructor
      *
-     * \param p the packet
-     * \param addr the address
-     * \param priority the packet priority
+     * @param p the packet
+     * @param addr the address
+     * @param priority the packet priority
      */
     PrioQueueDiscTestItem(Ptr<Packet> p, const Address& addr, uint8_t priority);
     void AddHeader() override;
@@ -62,9 +62,9 @@
 }
 
 /**
- * \ingroup traffic-control-test
+ * @ingroup traffic-control-test
  *
- * \brief Prio Queue Disc Test Packet Filter
+ * @brief Prio Queue Disc Test Packet Filter
  */
 class PrioQueueDiscTestFilter : public PacketFilter
 {
@@ -72,14 +72,14 @@
     /**
      * Constructor
      *
-     * \param cls whether this filter is able to classify a PrioQueueDiscTestItem
+     * @param cls whether this filter is able to classify a PrioQueueDiscTestItem
      */
     PrioQueueDiscTestFilter(bool cls);
     ~PrioQueueDiscTestFilter() override;
     /**
-     * \brief Set the value returned by DoClassify
+     * @brief Set the value returned by DoClassify
      *
-     * \param ret the value that DoClassify returns
+     * @param ret the value that DoClassify returns
      */
     void SetReturnValue(int32_t ret);
 
@@ -120,9 +120,9 @@
 }
 
 /**
- * \ingroup traffic-control-test
+ * @ingroup traffic-control-test
  *
- * \brief Prio Queue Disc Test Case
+ * @brief Prio Queue Disc Test Case
  */
 class PrioQueueDiscTestCase : public TestCase
 {
@@ -303,9 +303,9 @@
 }
 
 /**
- * \ingroup traffic-control-test
+ * @ingroup traffic-control-test
  *
- * \brief Prio Queue Disc Test Suite
+ * @brief Prio Queue Disc Test Suite
  */
 static class PrioQueueDiscTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/traffic-control/test/queue-disc-traces-test-suite.cc ns-3.44/src/traffic-control/test/queue-disc-traces-test-suite.cc
--- ns-3.43/src/traffic-control/test/queue-disc-traces-test-suite.cc	2024-10-09 16:41:10.100656700 -0700
+++ ns-3.44/src/traffic-control/test/queue-disc-traces-test-suite.cc	2025-03-09 16:55:49.727372400 -0700
@@ -18,9 +18,9 @@
 using namespace ns3;
 
 /**
- * \ingroup traffic-control-test
+ * @ingroup traffic-control-test
  *
- * \brief Queue Disc Test Item
+ * @brief Queue Disc Test Item
  */
 class QdTestItem : public QueueDiscItem
 {
@@ -28,8 +28,8 @@
     /**
      * Constructor
      *
-     * \param p the packet
-     * \param addr the address
+     * @param p the packet
+     * @param addr the address
      */
     QdTestItem(Ptr<Packet> p, const Address& addr);
     ~QdTestItem() override;
@@ -58,9 +58,9 @@
 }
 
 /**
- * \ingroup traffic-control-test
+ * @ingroup traffic-control-test
  *
- * \brief Test Child Queue Disc that may drop packets before enqueue or after dequeue
+ * @brief Test Child Queue Disc that may drop packets before enqueue or after dequeue
  */
 class TestChildQueueDisc : public QueueDisc
 {
@@ -128,9 +128,9 @@
 }
 
 /**
- * \ingroup traffic-control-test
+ * @ingroup traffic-control-test
  *
- * \brief Test Parent Queue Disc having a child of type TestChildQueueDisc
+ * @brief Test Parent Queue Disc having a child of type TestChildQueueDisc
  */
 class TestParentQueueDisc : public QueueDisc
 {
@@ -182,9 +182,9 @@
 }
 
 /**
- * \ingroup traffic-control-test
+ * @ingroup traffic-control-test
  *
- * \brief Keep statistics based on traces
+ * @brief Keep statistics based on traces
  */
 class TestCounter
 {
@@ -197,31 +197,31 @@
 
     /**
      * Connect private methods to the queue disc traces
-     * \param qd the queue disc
+     * @param qd the queue disc
      */
     void ConnectTraces(Ptr<QueueDisc> qd);
 
   private:
     /**
      * Update statistics after a packet has been enqueued
-     * \param item the enqueued packet
+     * @param item the enqueued packet
      */
     void PacketEnqueued(Ptr<const QueueDiscItem> item);
     /**
      * Update statistics after a packet has been dequeued
-     * \param item the dequeued packet
+     * @param item the dequeued packet
      */
     void PacketDequeued(Ptr<const QueueDiscItem> item);
     /**
      * Update statistics after a packet has been dropped before enqueue
-     * \param item the dropped packet
-     * \param reason the reason why the packet was dropped
+     * @param item the dropped packet
+     * @param reason the reason why the packet was dropped
      */
     void PacketDbe(Ptr<const QueueDiscItem> item, const char* reason);
     /**
      * Update statistics after a packet has been dropped after dequeue
-     * \param item the dropped packet
-     * \param reason the reason why the packet was dropped
+     * @param item the dropped packet
+     * @param reason the reason why the packet was dropped
      */
     void PacketDad(Ptr<const QueueDiscItem> item, const char* reason);
 
@@ -288,9 +288,9 @@
 }
 
 /**
- * \ingroup traffic-control-test
+ * @ingroup traffic-control-test
  *
- * \brief Queue Disc Traces Test Case
+ * @brief Queue Disc Traces Test Case
  *
  * This test case makes use of a test queue disc acting as root queue disc and
  * having a single child queue disc, which has a single DropTail queue. The
@@ -310,23 +310,23 @@
 
     /**
      * Check that queued packets/bytes are consistent with what is expected
-     * \param qd the queue disc
-     * \param nPackets the expected number of packets
-     * \param nBytes the expected number of bytes
+     * @param qd the queue disc
+     * @param nPackets the expected number of packets
+     * @param nBytes the expected number of bytes
      */
     void CheckQueued(Ptr<QueueDisc> qd, uint32_t nPackets, uint32_t nBytes);
     /**
      * Check that packets/bytes dropped before enqueue are consistent with what is expected
-     * \param qd the queue disc
-     * \param nDbePackets the expected number of packets
-     * \param nDbeBytes the expected number of bytes
+     * @param qd the queue disc
+     * @param nDbePackets the expected number of packets
+     * @param nDbeBytes the expected number of bytes
      */
     void CheckDroppedBeforeEnqueue(Ptr<QueueDisc> qd, uint32_t nDbePackets, uint32_t nDbeBytes);
     /**
      * Check that packets/bytes dropped after dequeue are consistent with what is expected
-     * \param qd the queue disc
-     * \param nDadPackets the expected number of packets
-     * \param nDadBytes the expected number of bytes
+     * @param qd the queue disc
+     * @param nDadPackets the expected number of packets
+     * @param nDadBytes the expected number of bytes
      */
     void CheckDroppedAfterDequeue(Ptr<QueueDisc> qd, uint32_t nDadPackets, uint32_t nDadBytes);
 
@@ -573,9 +573,9 @@
 }
 
 /**
- * \ingroup traffic-control-test
+ * @ingroup traffic-control-test
  *
- * \brief Queue Disc Traces Test Suite
+ * @brief Queue Disc Traces Test Suite
  */
 static class QueueDiscTracesTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/traffic-control/test/red-queue-disc-test-suite.cc ns-3.44/src/traffic-control/test/red-queue-disc-test-suite.cc
--- ns-3.43/src/traffic-control/test/red-queue-disc-test-suite.cc	2024-10-09 16:41:10.100656700 -0700
+++ ns-3.44/src/traffic-control/test/red-queue-disc-test-suite.cc	2025-03-09 16:55:49.727372400 -0700
@@ -20,9 +20,9 @@
 using namespace ns3;
 
 /**
- * \ingroup traffic-control-test
+ * @ingroup traffic-control-test
  *
- * \brief Red Queue Disc Test Item
+ * @brief Red Queue Disc Test Item
  */
 class RedQueueDiscTestItem : public QueueDiscItem
 {
@@ -30,9 +30,9 @@
     /**
      * Constructor
      *
-     * \param p packet
-     * \param addr address
-     * \param ecnCapable ECN capable flag
+     * @param p packet
+     * @param addr address
+     * @param ecnCapable ECN capable flag
      */
     RedQueueDiscTestItem(Ptr<Packet> p, const Address& addr, bool ecnCapable);
 
@@ -66,9 +66,9 @@
 }
 
 /**
- * \ingroup traffic-control-test
+ * @ingroup traffic-control-test
  *
- * \brief Red Queue Disc Test Case
+ * @brief Red Queue Disc Test Case
  */
 class RedQueueDiscTestCase : public TestCase
 {
@@ -79,15 +79,15 @@
   private:
     /**
      * Enqueue function
-     * \param queue the queue disc
-     * \param size the size
-     * \param nPkt the number of packets
-     * \param ecnCapable ECN capable flag
+     * @param queue the queue disc
+     * @param size the size
+     * @param nPkt the number of packets
+     * @param ecnCapable ECN capable flag
      */
     void Enqueue(Ptr<RedQueueDisc> queue, uint32_t size, uint32_t nPkt, bool ecnCapable);
     /**
      * Run RED test function
-     * \param mode the mode
+     * @param mode the mode
      */
     void RunRedTest(QueueSizeUnit mode);
 };
@@ -603,9 +603,9 @@
 }
 
 /**
- * \ingroup traffic-control-test
+ * @ingroup traffic-control-test
  *
- * \brief Red Queue Disc Test Suite
+ * @brief Red Queue Disc Test Suite
  */
 static class RedQueueDiscTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/traffic-control/test/tbf-queue-disc-test-suite.cc ns-3.44/src/traffic-control/test/tbf-queue-disc-test-suite.cc
--- ns-3.43/src/traffic-control/test/tbf-queue-disc-test-suite.cc	2024-10-09 16:41:10.100656700 -0700
+++ ns-3.44/src/traffic-control/test/tbf-queue-disc-test-suite.cc	2025-03-09 16:55:49.727372400 -0700
@@ -25,9 +25,9 @@
 using namespace ns3;
 
 /**
- * \ingroup traffic-control-test
+ * @ingroup traffic-control-test
  *
- * \brief Tbf Queue Disc Test Item
+ * @brief Tbf Queue Disc Test Item
  */
 class TbfQueueDiscTestItem : public QueueDiscItem
 {
@@ -35,8 +35,8 @@
     /**
      * Constructor
      *
-     * \param p the packet
-     * \param addr the address
+     * @param p the packet
+     * @param addr the address
      */
     TbfQueueDiscTestItem(Ptr<Packet> p, const Address& addr);
     ~TbfQueueDiscTestItem() override;
@@ -71,9 +71,9 @@
 }
 
 /**
- * \ingroup traffic-control-test
+ * @ingroup traffic-control-test
  *
- * \brief Tbf Queue Disc Test Case
+ * @brief Tbf Queue Disc Test Case
  */
 class TbfQueueDiscTestCase : public TestCase
 {
@@ -84,23 +84,23 @@
   private:
     /**
      * Enqueue function
-     * \param queue the queue disc into which enqueue needs to be done
-     * \param dest the destination address
-     * \param size the size of the packet in bytes to be enqueued
+     * @param queue the queue disc into which enqueue needs to be done
+     * @param dest the destination address
+     * @param size the size of the packet in bytes to be enqueued
      */
     void Enqueue(Ptr<TbfQueueDisc> queue, Address dest, uint32_t size);
     /**
      * DequeueAndCheck function to check if a packet is blocked or not after dequeuing and verify
      * against expected result
-     * \param queue the queue disc on which DequeueAndCheck needs to be done
-     * \param flag the boolean value against which the return value of dequeue ()
+     * @param queue the queue disc on which DequeueAndCheck needs to be done
+     * @param flag the boolean value against which the return value of dequeue ()
      * has to be compared with
-     * \param printStatement the string to be printed in the NS_TEST_EXPECT_MSG_EQ
+     * @param printStatement the string to be printed in the NS_TEST_EXPECT_MSG_EQ
      */
     void DequeueAndCheck(Ptr<TbfQueueDisc> queue, bool flag, std::string printStatement);
     /**
      * Run TBF test function
-     * \param mode the mode
+     * @param mode the mode
      */
     void RunTbfTest(QueueSizeUnit mode);
 };
@@ -283,7 +283,7 @@
     double delay = 0.09;
     for (uint32_t i = 1; i <= nPkt; i++)
     {
-        Simulator::Schedule(Time(Seconds((i + 1) * delay)),
+        Simulator::Schedule(Seconds((i + 1) * delay),
                             &TbfQueueDiscTestCase::Enqueue,
                             this,
                             queue,
@@ -293,7 +293,7 @@
     delay = 0.1;
     for (uint32_t i = 1; i <= nPkt; i++)
     {
-        Simulator::Schedule(Time(Seconds((i + 1) * delay)),
+        Simulator::Schedule(Seconds((i + 1) * delay),
                             &TbfQueueDiscTestCase::DequeueAndCheck,
                             this,
                             queue,
@@ -361,7 +361,7 @@
     delay = 0.09;
     for (uint32_t i = 1; i <= nPkt; i++)
     {
-        Simulator::Schedule(Time(Seconds((i + 1) * delay)),
+        Simulator::Schedule(Seconds((i + 1) * delay),
                             &TbfQueueDiscTestCase::Enqueue,
                             this,
                             queue,
@@ -373,7 +373,7 @@
     {
         if (i == 10)
         {
-            Simulator::Schedule(Time(Seconds((i + 1) * delay)),
+            Simulator::Schedule(Seconds((i + 1) * delay),
                                 &TbfQueueDiscTestCase::DequeueAndCheck,
                                 this,
                                 queue,
@@ -382,7 +382,7 @@
         }
         else
         {
-            Simulator::Schedule(Time(Seconds((i + 1) * delay)),
+            Simulator::Schedule(Seconds((i + 1) * delay),
                                 &TbfQueueDiscTestCase::DequeueAndCheck,
                                 this,
                                 queue,
@@ -457,7 +457,7 @@
     delay = 0.04;
     for (uint32_t i = 1; i <= nPkt; i++)
     {
-        Simulator::Schedule(Time(Seconds((i + 1) * delay)),
+        Simulator::Schedule(Seconds((i + 1) * delay),
                             &TbfQueueDiscTestCase::Enqueue,
                             this,
                             queue,
@@ -527,9 +527,9 @@
 }
 
 /**
- * \ingroup traffic-control-test
+ * @ingroup traffic-control-test
  *
- * \brief Tbf Queue Disc Test Suite
+ * @brief Tbf Queue Disc Test Suite
  */
 static class TbfQueueDiscTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/traffic-control/test/tc-flow-control-test-suite.cc ns-3.44/src/traffic-control/test/tc-flow-control-test-suite.cc
--- ns-3.43/src/traffic-control/test/tc-flow-control-test-suite.cc	2024-10-09 16:41:10.100656700 -0700
+++ ns-3.44/src/traffic-control/test/tc-flow-control-test-suite.cc	2025-03-09 16:55:49.727372400 -0700
@@ -29,9 +29,9 @@
 using namespace ns3;
 
 /**
- * \ingroup traffic-control-test
+ * @ingroup traffic-control-test
  *
- * \brief Queue Disc Test Item
+ * @brief Queue Disc Test Item
  */
 class QueueDiscTestItem : public QueueDiscItem
 {
@@ -39,7 +39,7 @@
     /**
      * Constructor
      *
-     * \param p the packet stored in this item
+     * @param p the packet stored in this item
      */
     QueueDiscTestItem(Ptr<Packet> p);
     ~QueueDiscTestItem() override;
@@ -74,9 +74,9 @@
 }
 
 /**
- * \ingroup traffic-control-test
+ * @ingroup traffic-control-test
  *
- * \brief Traffic Control Flow Control Test Case
+ * @brief Traffic Control Flow Control Test Case
  */
 class TcFlowControlTestCase : public TestCase
 {
@@ -84,9 +84,9 @@
     /**
      * Constructor
      *
-     * \param tt the test type
-     * \param deviceQueueLength the queue length of the device
-     * \param totalTxPackets the total number of packets to transmit
+     * @param tt the test type
+     * @param deviceQueueLength the queue length of the device
+     * @param totalTxPackets the total number of packets to transmit
      */
     TcFlowControlTestCase(QueueSizeUnit tt, uint32_t deviceQueueLength, uint32_t totalTxPackets);
     ~TcFlowControlTestCase() override;
@@ -95,29 +95,29 @@
     void DoRun() override;
     /**
      * Instruct a node to send a specified number of packets
-     * \param n the node
-     * \param nPackets the number of packets to send
+     * @param n the node
+     * @param nPackets the number of packets to send
      */
     void SendPackets(Ptr<Node> n, uint16_t nPackets);
     /**
      * Check if the device queue stores the expected number of packets
-     * \param dev the device
-     * \param nPackets the expected number of packets stored in the device queue
-     * \param msg the message to print if a different number of packets are stored
+     * @param dev the device
+     * @param nPackets the expected number of packets stored in the device queue
+     * @param msg the message to print if a different number of packets are stored
      */
     void CheckPacketsInDeviceQueue(Ptr<NetDevice> dev, uint16_t nPackets, const std::string msg);
     /**
      * Check if the device queue is in the expected status (stopped or not)
-     * \param dev the device
-     * \param value the expected status of the queue (true means stopped)
-     * \param msg the message to print if the status of the device queue is different
+     * @param dev the device
+     * @param value the expected status of the queue (true means stopped)
+     * @param msg the message to print if the status of the device queue is different
      */
     void CheckDeviceQueueStopped(Ptr<NetDevice> dev, bool value, const std::string msg);
     /**
      * Check if the queue disc stores the expected number of packets
-     * \param dev the device the queue disc is installed on
-     * \param nPackets the expected number of packets stored in the queue disc
-     * \param msg the message to print if a different number of packets are stored
+     * @param dev the device the queue disc is installed on
+     * @param nPackets the expected number of packets stored in the queue disc
+     * @param msg the message to print if a different number of packets are stored
      */
     void CheckPacketsInQueueDisc(Ptr<NetDevice> dev, uint16_t nPackets, const std::string msg);
     QueueSizeUnit m_type;         //!< the test type
@@ -209,7 +209,7 @@
     tch.Install(txDev);
 
     // transmit 10 packets at time 0
-    Simulator::Schedule(Time(Seconds(0)),
+    Simulator::Schedule(Seconds(0),
                         &TcFlowControlTestCase::SendPackets,
                         this,
                         n.Get(0),
@@ -246,7 +246,7 @@
             qdiscPackets = std::max(m_totalTxPackets - txPackets - deviceQueuePackets, (uint32_t)0);
             if (deviceQueuePackets == m_deviceQueueLength)
             {
-                Simulator::Schedule(Time(MilliSeconds(checkTimeMs)),
+                Simulator::Schedule(MilliSeconds(checkTimeMs),
                                     &TcFlowControlTestCase::CheckDeviceQueueStopped,
                                     this,
                                     txDev,
@@ -256,7 +256,7 @@
             }
             else
             {
-                Simulator::Schedule(Time(MilliSeconds(checkTimeMs)),
+                Simulator::Schedule(MilliSeconds(checkTimeMs),
                                     &TcFlowControlTestCase::CheckDeviceQueueStopped,
                                     this,
                                     txDev,
@@ -265,7 +265,7 @@
                                         std::to_string(checkTimeMs) + "ms");
             }
 
-            Simulator::Schedule(Time(MilliSeconds(checkTimeMs)),
+            Simulator::Schedule(MilliSeconds(checkTimeMs),
                                 &TcFlowControlTestCase::CheckPacketsInDeviceQueue,
                                 this,
                                 txDev,
@@ -274,7 +274,7 @@
                                     " packets in the device after " + std::to_string(checkTimeMs) +
                                     "ms");
 
-            Simulator::Schedule(Time(MilliSeconds(checkTimeMs)),
+            Simulator::Schedule(MilliSeconds(checkTimeMs),
                                 &TcFlowControlTestCase::CheckPacketsInQueueDisc,
                                 this,
                                 txDev,
@@ -295,19 +295,19 @@
 
         // The transmission of each packet takes 1000B/1Mbps = 8ms
         // After 1ms, we have 3 packets in the device queue (stopped) and 6 in the queue disc
-        Simulator::Schedule(Time(MilliSeconds(1)),
+        Simulator::Schedule(MilliSeconds(1),
                             &TcFlowControlTestCase::CheckPacketsInDeviceQueue,
                             this,
                             txDev,
                             3,
                             "There must be 3 packets in the device queue after 1ms");
-        Simulator::Schedule(Time(MilliSeconds(1)),
+        Simulator::Schedule(MilliSeconds(1),
                             &TcFlowControlTestCase::CheckDeviceQueueStopped,
                             this,
                             txDev,
                             true,
                             "The device queue must be stopped after 1ms");
-        Simulator::Schedule(Time(MilliSeconds(1)),
+        Simulator::Schedule(MilliSeconds(1),
                             &TcFlowControlTestCase::CheckPacketsInQueueDisc,
                             this,
                             txDev,
@@ -315,19 +315,19 @@
                             "There must be 6 packets in the queue disc after 1ms");
 
         // After 9ms, we have 3 packets in the device queue (stopped) and 5 in the queue disc
-        Simulator::Schedule(Time(MilliSeconds(9)),
+        Simulator::Schedule(MilliSeconds(9),
                             &TcFlowControlTestCase::CheckPacketsInDeviceQueue,
                             this,
                             txDev,
                             3,
                             "There must be 3 packets in the device queue after 9ms");
-        Simulator::Schedule(Time(MilliSeconds(9)),
+        Simulator::Schedule(MilliSeconds(9),
                             &TcFlowControlTestCase::CheckDeviceQueueStopped,
                             this,
                             txDev,
                             true,
                             "The device queue must be stopped after 9ms");
-        Simulator::Schedule(Time(MilliSeconds(9)),
+        Simulator::Schedule(MilliSeconds(9),
                             &TcFlowControlTestCase::CheckPacketsInQueueDisc,
                             this,
                             txDev,
@@ -335,19 +335,19 @@
                             "There must be 5 packets in the queue disc after 9ms");
 
         // After 17ms, we have 3 packets in the device queue (stopped) and 4 in the queue disc
-        Simulator::Schedule(Time(MilliSeconds(17)),
+        Simulator::Schedule(MilliSeconds(17),
                             &TcFlowControlTestCase::CheckPacketsInDeviceQueue,
                             this,
                             txDev,
                             3,
                             "There must be 3 packets in the device queue after 17ms");
-        Simulator::Schedule(Time(MilliSeconds(17)),
+        Simulator::Schedule(MilliSeconds(17),
                             &TcFlowControlTestCase::CheckDeviceQueueStopped,
                             this,
                             txDev,
                             true,
                             "The device queue must be stopped after 17ms");
-        Simulator::Schedule(Time(MilliSeconds(17)),
+        Simulator::Schedule(MilliSeconds(17),
                             &TcFlowControlTestCase::CheckPacketsInQueueDisc,
                             this,
                             txDev,
@@ -355,19 +355,19 @@
                             "There must be 4 packets in the queue disc after 17ms");
 
         // After 25ms, we have 3 packets in the device queue (stopped) and 3 in the queue disc
-        Simulator::Schedule(Time(MilliSeconds(25)),
+        Simulator::Schedule(MilliSeconds(25),
                             &TcFlowControlTestCase::CheckPacketsInDeviceQueue,
                             this,
                             txDev,
                             3,
                             "There must be 3 packets in the device queue after 25ms");
-        Simulator::Schedule(Time(MilliSeconds(25)),
+        Simulator::Schedule(MilliSeconds(25),
                             &TcFlowControlTestCase::CheckDeviceQueueStopped,
                             this,
                             txDev,
                             true,
                             "The device queue must be stopped after 25ms");
-        Simulator::Schedule(Time(MilliSeconds(25)),
+        Simulator::Schedule(MilliSeconds(25),
                             &TcFlowControlTestCase::CheckPacketsInQueueDisc,
                             this,
                             txDev,
@@ -375,19 +375,19 @@
                             "There must be 3 packets in the queue disc after 25ms");
 
         // After 33ms, we have 3 packets in the device queue (stopped) and 2 in the queue disc
-        Simulator::Schedule(Time(MilliSeconds(33)),
+        Simulator::Schedule(MilliSeconds(33),
                             &TcFlowControlTestCase::CheckPacketsInDeviceQueue,
                             this,
                             txDev,
                             3,
                             "There must be 3 packets in the device queue after 33ms");
-        Simulator::Schedule(Time(MilliSeconds(33)),
+        Simulator::Schedule(MilliSeconds(33),
                             &TcFlowControlTestCase::CheckDeviceQueueStopped,
                             this,
                             txDev,
                             true,
                             "The device queue must be stopped after 33ms");
-        Simulator::Schedule(Time(MilliSeconds(33)),
+        Simulator::Schedule(MilliSeconds(33),
                             &TcFlowControlTestCase::CheckPacketsInQueueDisc,
                             this,
                             txDev,
@@ -395,19 +395,19 @@
                             "There must be 2 packets in the queue disc after 33ms");
 
         // After 41ms, we have 3 packets in the device queue (stopped) and 1 in the queue disc
-        Simulator::Schedule(Time(MilliSeconds(41)),
+        Simulator::Schedule(MilliSeconds(41),
                             &TcFlowControlTestCase::CheckPacketsInDeviceQueue,
                             this,
                             txDev,
                             3,
                             "There must be 3 packets in the device queue after 41ms");
-        Simulator::Schedule(Time(MilliSeconds(41)),
+        Simulator::Schedule(MilliSeconds(41),
                             &TcFlowControlTestCase::CheckDeviceQueueStopped,
                             this,
                             txDev,
                             true,
                             "The device queue must be stopped after 41ms");
-        Simulator::Schedule(Time(MilliSeconds(41)),
+        Simulator::Schedule(MilliSeconds(41),
                             &TcFlowControlTestCase::CheckPacketsInQueueDisc,
                             this,
                             txDev,
@@ -415,19 +415,19 @@
                             "There must be 1 packet in the queue disc after 41ms");
 
         // After 49ms, we have 3 packets in the device queue (stopped) and the queue disc is empty
-        Simulator::Schedule(Time(MilliSeconds(49)),
+        Simulator::Schedule(MilliSeconds(49),
                             &TcFlowControlTestCase::CheckPacketsInDeviceQueue,
                             this,
                             txDev,
                             3,
                             "There must be 3 packets in the device queue after 49ms");
-        Simulator::Schedule(Time(MilliSeconds(49)),
+        Simulator::Schedule(MilliSeconds(49),
                             &TcFlowControlTestCase::CheckDeviceQueueStopped,
                             this,
                             txDev,
                             true,
                             "The device queue must be stopped after 49ms");
-        Simulator::Schedule(Time(MilliSeconds(49)),
+        Simulator::Schedule(MilliSeconds(49),
                             &TcFlowControlTestCase::CheckPacketsInQueueDisc,
                             this,
                             txDev,
@@ -436,19 +436,19 @@
 
         // After 57ms, we have 2 packets in the device queue (not stopped) and the queue disc is
         // empty
-        Simulator::Schedule(Time(MilliSeconds(57)),
+        Simulator::Schedule(MilliSeconds(57),
                             &TcFlowControlTestCase::CheckPacketsInDeviceQueue,
                             this,
                             txDev,
                             2,
                             "There must be 2 packets in the device queue after 57ms");
-        Simulator::Schedule(Time(MilliSeconds(57)),
+        Simulator::Schedule(MilliSeconds(57),
                             &TcFlowControlTestCase::CheckDeviceQueueStopped,
                             this,
                             txDev,
                             false,
                             "The device queue must not be stopped after 57ms");
-        Simulator::Schedule(Time(MilliSeconds(57)),
+        Simulator::Schedule(MilliSeconds(57),
                             &TcFlowControlTestCase::CheckPacketsInQueueDisc,
                             this,
                             txDev,
@@ -457,19 +457,19 @@
 
         // After 81ms, all packets must have been transmitted (the device queue and the queue disc
         // are empty)
-        Simulator::Schedule(Time(MilliSeconds(81)),
+        Simulator::Schedule(MilliSeconds(81),
                             &TcFlowControlTestCase::CheckPacketsInDeviceQueue,
                             this,
                             txDev,
                             0,
                             "The device queue must be empty after 81ms");
-        Simulator::Schedule(Time(MilliSeconds(81)),
+        Simulator::Schedule(MilliSeconds(81),
                             &TcFlowControlTestCase::CheckDeviceQueueStopped,
                             this,
                             txDev,
                             false,
                             "The device queue must not be stopped after 81ms");
-        Simulator::Schedule(Time(MilliSeconds(81)),
+        Simulator::Schedule(MilliSeconds(81),
                             &TcFlowControlTestCase::CheckPacketsInQueueDisc,
                             this,
                             txDev,
@@ -482,9 +482,9 @@
 }
 
 /**
- * \ingroup traffic-control-test
+ * @ingroup traffic-control-test
  *
- * \brief Traffic Control Flow Control Test Suite
+ * @brief Traffic Control Flow Control Test Suite
  */
 static class TcFlowControlTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/uan/examples/uan-6lowpan-example.cc ns-3.44/src/uan/examples/uan-6lowpan-example.cc
--- ns-3.43/src/uan/examples/uan-6lowpan-example.cc	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/uan/examples/uan-6lowpan-example.cc	2025-03-09 16:55:49.727372400 -0700
@@ -22,7 +22,7 @@
 using namespace ns3::energy;
 
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  * This example shows the usage of UDP over 6LoWPAN to transfer data.
  * Two nodes are sending their remaining energy percentage (1 byte)
@@ -65,15 +65,15 @@
 
     /**
      * Send a packet from one of the nodes
-     * \param node The sending node
-     * \param pkt The packet
-     * \param dst the destination
+     * @param node The sending node
+     * @param pkt The packet
+     * @param dst the destination
      */
     void SendSinglePacket(Ptr<Node> node, Ptr<Packet> pkt, Ipv6Address dst);
 
     /**
      * Print the received packet
-     * \param socket The receiving socket
+     * @param socket The receiving socket
      */
     void PrintReceivedPacket(Ptr<Socket> socket);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/uan/examples/uan-cw-example.cc ns-3.44/src/uan/examples/uan-cw-example.cc
--- ns-3.43/src/uan/examples/uan-cw-example.cc	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/uan/examples/uan-cw-example.cc	2025-03-09 16:55:49.727372400 -0700
@@ -7,8 +7,8 @@
  */
 
 /**
- * \file uan-cw-example.cc
- * \ingroup uan
+ * @file uan-cw-example.cc
+ * @ingroup uan
  *
  * This example showcases the "CW-MAC" described in System Design Considerations
  * for Undersea Networks article in the IEEE Journal on Selected Areas of
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/uan/examples/uan-cw-example.h ns-3.44/src/uan/examples/uan-cw-example.h
--- ns-3.43/src/uan/examples/uan-cw-example.h	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/uan/examples/uan-cw-example.h	2025-03-09 16:55:49.731372400 -0700
@@ -16,12 +16,12 @@
 using namespace ns3;
 
 /**
- * \ingroup uan
- * \brief Helper class for UAN CW MAC example.
+ * @ingroup uan
+ * @brief Helper class for UAN CW MAC example.
  *
  * An experiment measures the average throughput for a series of CW values.
  *
- * \see uan-cw-example.cc
+ * @see uan-cw-example.cc
  */
 class Experiment
 {
@@ -29,21 +29,21 @@
     /**
      * Run an experiment across a range of congestion window values.
      *
-     * \param uan The Uan stack helper to configure nodes in the model.
-     * \return The data set of CW values and measured throughput
+     * @param uan The Uan stack helper to configure nodes in the model.
+     * @return The data set of CW values and measured throughput
      */
     Gnuplot2dDataset Run(UanHelper& uan);
     /**
      * Receive all available packets from a socket.
      *
-     * \param socket The receive socket.
+     * @param socket The receive socket.
      */
     void ReceivePacket(Ptr<Socket> socket);
     /**
      * Assign new random positions to a set of nodes.  New positions
      * are randomly assigned within the bounding box.
      *
-     * \param nodes The nodes to reposition.
+     * @param nodes The nodes to reposition.
      */
     void UpdatePositions(NodeContainer& nodes) const;
     /** Save the throughput from a single run. */
@@ -51,7 +51,7 @@
     /**
      * Compute average throughput for a set of runs, then increment CW.
      *
-     * \param cw CW value for completed runs.
+     * @param cw CW value for completed runs.
      */
     void IncrementCw(uint32_t cw);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/uan/examples/uan-ipv4-example.cc ns-3.44/src/uan/examples/uan-ipv4-example.cc
--- ns-3.43/src/uan/examples/uan-ipv4-example.cc	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/uan/examples/uan-ipv4-example.cc	2025-03-09 16:55:49.731372400 -0700
@@ -20,7 +20,7 @@
 using namespace ns3::energy;
 
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  * This example shows the usage of UDP over IPv4 to transfer data.
  * Two nodes are sending their remaining energy percentage (1 byte)
@@ -63,15 +63,15 @@
 
     /**
      * Send a packet from one of the nodes
-     * \param node The sending node
-     * \param pkt The packet
-     * \param dst the destination
+     * @param node The sending node
+     * @param pkt The packet
+     * @param dst the destination
      */
     void SendSinglePacket(Ptr<Node> node, Ptr<Packet> pkt, Ipv4Address dst);
 
     /**
      * Print the received packet
-     * \param socket The receiving socket
+     * @param socket The receiving socket
      */
     void PrintReceivedPacket(Ptr<Socket> socket);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/uan/examples/uan-ipv6-example.cc ns-3.44/src/uan/examples/uan-ipv6-example.cc
--- ns-3.43/src/uan/examples/uan-ipv6-example.cc	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/uan/examples/uan-ipv6-example.cc	2025-03-09 16:55:49.731372400 -0700
@@ -20,7 +20,7 @@
 using namespace ns3::energy;
 
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  * This example shows the usage of UDP over IPv6 to transfer data.
  * Two nodes are sending their remaining energy percentage (1 byte)
@@ -63,15 +63,15 @@
 
     /**
      * Send a packet from one of the nodes
-     * \param node The sending node
-     * \param pkt The packet
-     * \param dst the destination
+     * @param node The sending node
+     * @param pkt The packet
+     * @param dst the destination
      */
     void SendSinglePacket(Ptr<Node> node, Ptr<Packet> pkt, Ipv6Address dst);
 
     /**
      * Print the received packet
-     * \param socket The receiving socket
+     * @param socket The receiving socket
      */
     void PrintReceivedPacket(Ptr<Socket> socket);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/uan/examples/uan-raw-example.cc ns-3.44/src/uan/examples/uan-raw-example.cc
--- ns-3.43/src/uan/examples/uan-raw-example.cc	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/uan/examples/uan-raw-example.cc	2025-03-09 16:55:49.731372400 -0700
@@ -21,7 +21,7 @@
 using namespace ns3;
 
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  * This example shows the usage of raw packets transfer data.
  * Two nodes are sending their remaining energy percentage (1 byte)
@@ -64,15 +64,15 @@
 
     /**
      * Send a packet from one of the nodes
-     * \param node The sending node
-     * \param pkt The packet
-     * \param dst the destination
+     * @param node The sending node
+     * @param pkt The packet
+     * @param dst the destination
      */
     void SendSinglePacket(Ptr<Node> node, Ptr<Packet> pkt, Mac8Address dst);
 
     /**
      * Print the received packet
-     * \param socket The receiving socket
+     * @param socket The receiving socket
      */
     void PrintReceivedPacket(Ptr<Socket> socket);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/uan/examples/uan-rc-example.cc ns-3.44/src/uan/examples/uan-rc-example.cc
--- ns-3.43/src/uan/examples/uan-rc-example.cc	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/uan/examples/uan-rc-example.cc	2025-03-09 16:55:49.731372400 -0700
@@ -7,8 +7,8 @@
  */
 
 /**
- * \file uan-rc-example.cc
- * \ingroup uan
+ * @file uan-rc-example.cc
+ * @ingroup uan
  *
  * This example uses UanMacRc and UanMacRcGw which combined form a system
  * using what is referred to as RC-MAC.  Details of RC-MAC will be published
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/uan/examples/uan-rc-example.h ns-3.44/src/uan/examples/uan-rc-example.h
--- ns-3.43/src/uan/examples/uan-rc-example.h	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/uan/examples/uan-rc-example.h	2025-03-09 16:55:49.731372400 -0700
@@ -16,7 +16,7 @@
 using namespace ns3;
 
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  * Container for the parameters describing a single experiment.
  *
@@ -24,7 +24,7 @@
  * controls the number of nodes (if m_doNode is true), or the
  * UanMacRcGw MaxReservations attribute.
  *
- * \see uan-rc-example.cc
+ * @see uan-rc-example.cc
  *
  */
 class Experiment
@@ -52,7 +52,7 @@
     /**
      * Callback to receive a packet.
      *
-     * \param socket The socket receiving packets.
+     * @param socket The socket receiving packets.
      */
     void ReceivePacket(Ptr<Socket> socket);
     /**
@@ -70,17 +70,17 @@
      *
      * where the upper sign is taken if upperblock is true.
      *
-     * \param kass Fraction of total bandwidth assigned to mode.
-     * \param fc Mode center frequency offset.
-     * \param upperblock Sign choice in setting the center frequency.
-     * \param name Mode name.
-     * \return The new mode.
+     * @param kass Fraction of total bandwidth assigned to mode.
+     * @param fc Mode center frequency offset.
+     * @param upperblock Sign choice in setting the center frequency.
+     * @param name Mode name.
+     * @return The new mode.
      */
     UanTxMode CreateMode(uint32_t kass, uint32_t fc, bool upperblock, std::string name) const;
     /**
      * Create m_numRates matching control and data modes.
      *
-     * \param fc Mode center frequency offset.
+     * @param fc Mode center frequency offset.
      */
     void CreateDualModes(uint32_t fc);
     /**
@@ -90,8 +90,8 @@
      * or the \"a\" parameter, which controls the UanMacRcGw MaxReservations
      * attribute.
      *
-     * \param param The parameter value.
-     * \return The total number of bytes delivered.
+     * @param param The parameter value.
+     * @return The total number of bytes delivered.
      */
     uint32_t Run(uint32_t param);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/uan/helper/acoustic-modem-energy-model-helper.h ns-3.44/src/uan/helper/acoustic-modem-energy-model-helper.h
--- ns-3.43/src/uan/helper/acoustic-modem-energy-model-helper.h	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/uan/helper/acoustic-modem-energy-model-helper.h	2025-03-09 16:55:49.731372400 -0700
@@ -16,7 +16,7 @@
 {
 
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  * Assign AcousticModemEnergyModel to uan devices.
  *
@@ -39,15 +39,15 @@
     /**
      * Sets an attribute of the underlying energy model object.
      *
-     * \param name The name of the attribute to set.
-     * \param v The value of the attribute.
+     * @param name The name of the attribute to set.
+     * @param v The value of the attribute.
      */
     void Set(std::string name, const AttributeValue& v) override;
 
     /**
      * Sets the callback to be invoked when energy is depleted.
      *
-     * \param callback Callback function for energy depletion handling.
+     * @param callback Callback function for energy depletion handling.
      */
     void SetDepletionCallback(
         AcousticModemEnergyModel::AcousticModemEnergyDepletionCallback callback);
@@ -56,9 +56,9 @@
     /**
      * Implements DeviceEnergyModel::Install.
      *
-     * \param device Pointer to the NetDevice to install DeviceEnergyModel.
-     * \param source Pointer to EnergySource installed on node.
-     * \return The energy model.
+     * @param device Pointer to the NetDevice to install DeviceEnergyModel.
+     * @param source Pointer to EnergySource installed on node.
+     * @return The energy model.
      */
     Ptr<energy::DeviceEnergyModel> DoInstall(Ptr<NetDevice> device,
                                              Ptr<energy::EnergySource> source) const override;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/uan/helper/uan-helper.cc ns-3.44/src/uan/helper/uan-helper.cc
--- ns-3.43/src/uan/helper/uan-helper.cc	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/uan/helper/uan-helper.cc	2025-03-09 16:55:49.731372400 -0700
@@ -38,11 +38,11 @@
 /**
  * Ascii trace callback on Phy transmit events.
  *
- * \param os The output stream.
- * \param context The node and device ids.
- * \param packet The transmitted packet.
- * \param txPowerDb The transmission power.
- * \param mode The transmission mode.
+ * @param os The output stream.
+ * @param context The node and device ids.
+ * @param packet The transmitted packet.
+ * @param txPowerDb The transmission power.
+ * @param mode The transmission mode.
  */
 static void
 AsciiPhyTxEvent(std::ostream* os,
@@ -57,11 +57,11 @@
 /**
  * Ascii trace callback on successful packet reception.
  *
- * \param os The output stream.
- * \param context The node and device ids.
- * \param packet The received packet.
- * \param snr The received signal to noise ratio.
- * \param mode The channel transmission mode.
+ * @param os The output stream.
+ * @param context The node and device ids.
+ * @param packet The received packet.
+ * @param snr The received signal to noise ratio.
+ * @param mode The channel transmission mode.
  */
 static void
 AsciiPhyRxOkEvent(std::ostream* os,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/uan/helper/uan-helper.h ns-3.44/src/uan/helper/uan-helper.h
--- ns-3.43/src/uan/helper/uan-helper.h	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/uan/helper/uan-helper.h	2025-03-09 16:55:49.731372400 -0700
@@ -23,7 +23,7 @@
 class UanChannel;
 
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  * UAN configuration helper.
  */
@@ -36,9 +36,9 @@
     /**
      * Set MAC attributes.
      *
-     * \tparam Ts \deduced Argument types
-     * \param type The type of ns3::UanMac to create.
-     * \param [in] args Name and AttributeValue pairs to set.
+     * @tparam Ts \deduced Argument types
+     * @param type The type of ns3::UanMac to create.
+     * @param [in] args Name and AttributeValue pairs to set.
      *
      * All the attributes specified in this method should exist
      * in the requested mac.
@@ -49,9 +49,9 @@
     /**
      * Set PHY attributes.
      *
-     * \tparam Ts \deduced Argument types
-     * \param phyType The type of ns3::UanPhy to create.
-     * \param [in] args Name and AttributeValue pairs to set.
+     * @tparam Ts \deduced Argument types
+     * @param phyType The type of ns3::UanPhy to create.
+     * @param [in] args Name and AttributeValue pairs to set.
      *
      * All the attributes specified in this method should exist
      * in the requested Phy.
@@ -62,9 +62,9 @@
     /**
      * Set the transducer attributes.
      *
-     * \tparam Ts \deduced Argument types
-     * \param type The type of ns3::Transducer to create.
-     * \param [in] args Name and AttributeValue pairs to set.
+     * @tparam Ts \deduced Argument types
+     * @param type The type of ns3::Transducer to create.
+     * @param [in] args Name and AttributeValue pairs to set.
      *
      * All the attributes specified in this method should exist
      * in the requested transducer.
@@ -76,9 +76,9 @@
      * specified nodeid if it is of type ns3::UanNetDevice and dump
      * that to the specified stdc++ output stream.
      *
-     * \param os Output stream.
-     * \param nodeid The id of the node to generate ascii output for.
-     * \param deviceid The id of the device to generate ascii output for.
+     * @param os Output stream.
+     * @param nodeid The id of the node to generate ascii output for.
+     * @param deviceid The id of the device to generate ascii output for.
      */
     static void EnableAscii(std::ostream& os, uint32_t nodeid, uint32_t deviceid);
     /**
@@ -87,8 +87,8 @@
      * device container and dump that to the specified
      * stdc++ output stream.
      *
-     * \param os Output stream.
-     * \param d Device container.
+     * @param os Output stream.
+     * @param d Device container.
      */
     static void EnableAscii(std::ostream& os, NetDeviceContainer d);
     /**
@@ -97,8 +97,8 @@
      * of the input node and dump that to the specified
      * stdc++ output stream.
      *
-     * \param os Output stream.
-     * \param n Node container.
+     * @param os Output stream.
+     * @param n Node container.
      */
     static void EnableAscii(std::ostream& os, NodeContainer n);
     /**
@@ -106,7 +106,7 @@
      * ns3::UanNetDevice type and dump that to the specified
      * stdc++ output stream.
      *
-     * \param os Output stream.
+     * @param os Output stream.
      */
     static void EnableAsciiAll(std::ostream& os);
 
@@ -120,8 +120,8 @@
      * attributes specified in UanHelper::SetTransducer,
      * UanHelper::SetMac, and, UanHelper::SetPhy.
      *
-     * \param c A set of nodes.
-     * \return The installed netdevices.
+     * @param c A set of nodes.
+     * @return The installed netdevices.
      */
     NetDeviceContainer Install(NodeContainer c) const;
 
@@ -133,9 +133,9 @@
      * specified in UanHelper::SetTransducer, UanHelper::SetMac, and
      * UanHelper::SetPhy.
      *
-     * \param c A set of nodes.
-     * \param channel A channel to use.
-     * \return The installed netdevices.
+     * @param c A set of nodes.
+     * @param channel A channel to use.
+     * @return The installed netdevices.
      */
     NetDeviceContainer Install(NodeContainer c, Ptr<UanChannel> channel) const;
 
@@ -151,9 +151,9 @@
      * Channel, physical layer, transducer and mac layer are added to the
      * UanNetDevice and then added to the node.
      *
-     * \param node A node where to install the uan components.
-     * \param channel A channel to use.
-     * \return The installed UanNetDevice.
+     * @param node A node where to install the uan components.
+     * @param channel A channel to use.
+     * @return The installed UanNetDevice.
      */
     Ptr<UanNetDevice> Install(Ptr<Node> node, Ptr<UanChannel> channel) const;
 
@@ -163,10 +163,10 @@
      * have been assigned. The Install() method should have previously been
      * called by the user.
      *
-     * \param c NetDeviceContainer of the set of net devices for which the
+     * @param c NetDeviceContainer of the set of net devices for which the
      *          UanNetDevice 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.
+     * @param stream First stream index to use.
+     * @return The number of stream indices assigned by this helper.
      */
     int64_t AssignStreams(NetDeviceContainer c, int64_t stream);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/uan/model/acoustic-modem-energy-model.cc ns-3.44/src/uan/model/acoustic-modem-energy-model.cc
--- ns-3.43/src/uan/model/acoustic-modem-energy-model.cc	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/uan/model/acoustic-modem-energy-model.cc	2025-03-09 16:55:49.731372400 -0700
@@ -67,7 +67,7 @@
 {
     NS_LOG_FUNCTION(this);
     m_currentState = UanPhy::IDLE; // initially IDLE
-    m_lastUpdateTime = Seconds(0.0);
+    m_lastUpdateTime = Seconds(0);
     m_energyDepletionCallback.Nullify();
     m_node = nullptr;
     m_source = nullptr;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/uan/model/acoustic-modem-energy-model.h ns-3.44/src/uan/model/acoustic-modem-energy-model.h
--- ns-3.43/src/uan/model/acoustic-modem-energy-model.h	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/uan/model/acoustic-modem-energy-model.h	2025-03-09 16:55:49.731372400 -0700
@@ -18,7 +18,7 @@
 {
 
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  * WHOI micro-modem energy model.
  *
@@ -53,7 +53,7 @@
   public:
     /**
      * Register this type.
-     * \return The object TypeId.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
     /** Constructor. */
@@ -64,14 +64,14 @@
     /**
      * Sets pointer to node.
      *
-     * \param node Pointer to node.
+     * @param node Pointer to node.
      */
     virtual void SetNode(Ptr<Node> node);
 
     /**
      * Gets pointer to node.
      *
-     * \return Pointer to node.
+     * @return Pointer to node.
      */
     virtual Ptr<Node> GetNode() const;
 
@@ -82,75 +82,75 @@
     /**
      * Get the transmission power of the modem.
      *
-     * \return The transmission power in Watts.
+     * @return The transmission power in Watts.
      */
     double GetTxPowerW() const;
 
     /**
      * Set the transmission power of the modem.
      *
-     * \param txPowerW Transmission power in watts.
+     * @param txPowerW Transmission power in watts.
      */
     void SetTxPowerW(double txPowerW);
 
     /**
      * Get the receiving power.
      *
-     * \return The receiving power in Watts
+     * @return The receiving power in Watts
      */
     double GetRxPowerW() const;
 
     /**
      * Set the receiving power of the modem.
      *
-     * \param rxPowerW Receiving power in watts
+     * @param rxPowerW Receiving power in watts
      */
     void SetRxPowerW(double rxPowerW);
 
     /**
      *Get the idle power of the modem.
      *
-     * \return The idle power in Watts
+     * @return The idle power in Watts
      */
     double GetIdlePowerW() const;
 
     /**
      * Set the idle state power of the modem.
      *
-     * \param idlePowerW Idle power of the modem in watts.
+     * @param idlePowerW Idle power of the modem in watts.
      */
     void SetIdlePowerW(double idlePowerW);
 
     /**
      * Get the sleep state power of the modem.
      *
-     * \return Sleep power of the modem in Watts
+     * @return Sleep power of the modem in Watts
      */
     double GetSleepPowerW() const;
 
     /**
      * Set the sleep power of the modem.
      *
-     * \param sleepPowerW Sleep power of the modem in watts.
+     * @param sleepPowerW Sleep power of the modem in watts.
      */
     void SetSleepPowerW(double sleepPowerW);
 
     /**
      * Get the current state of the modem.
      *
-     * \return Current state.
+     * @return Current state.
      */
     int GetCurrentState() const;
 
     /**
-     * \param callback Callback function.
+     * @param callback Callback function.
      *
      * Sets callback for energy depletion handling.
      */
     void SetEnergyDepletionCallback(AcousticModemEnergyDepletionCallback callback);
 
     /**
-     * \param callback Callback function.
+     * @param callback Callback function.
      *
      * Sets callback for energy recharge handling.
      */
@@ -159,22 +159,22 @@
     /**
      * Changes state of the AcousticModemEnergyModel.
      *
-     * \param newState New state the modem is in.
+     * @param newState New state the modem is in.
      */
     void ChangeState(int newState) override;
 
     /**
-     * \brief Handles energy depletion.
+     * @brief Handles energy depletion.
      */
     void HandleEnergyDepletion() override;
 
     /**
-     * \brief Handles energy recharged.
+     * @brief Handles energy recharged.
      */
     void HandleEnergyRecharged() override;
 
     /**
-     * \brief Handles energy changed.
+     * @brief Handles energy changed.
      *
      * Not implemented
      */
@@ -184,20 +184,20 @@
     void DoDispose() override;
 
     /**
-     * \return Current draw of device, at current state.
+     * @return Current draw of device, at current state.
      */
     double DoGetCurrentA() const override;
 
     /**
-     * \param destState Modem state to switch to.
-     * \return True if the transition is allowed.
+     * @param destState Modem state to switch to.
+     * @return True if the transition is allowed.
      *
      * This function checks if a given modem state transition is allowed.
      */
     bool IsStateTransitionValid(const int destState);
 
     /**
-     * \param state New state the modem is currently in.
+     * @param state New state the modem is currently in.
      *
      * Sets current state. This function is private so that only the energy model
      * can change its own state.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/uan/model/uan-channel.h ns-3.44/src/uan/model/uan-channel.h
--- ns-3.43/src/uan/model/uan-channel.h	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/uan/model/uan-channel.h	2025-03-09 16:55:49.731372400 -0700
@@ -28,7 +28,7 @@
 class UanTxMode;
 
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  * Channel class used by UAN devices.
  */
@@ -46,7 +46,7 @@
 
     /**
      * Register this type.
-     * \return The object TypeId.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
@@ -57,10 +57,10 @@
     /**
      * Send a packet out on the channel.
      *
-     * \param src Transducer transmitting packet.
-     * \param packet Packet to be transmitted.
-     * \param txPowerDb Transmission power in dB.
-     * \param txmode UanTxMode defining modulation of transmitted packet.
+     * @param src Transducer transmitting packet.
+     * @param packet Packet to be transmitted.
+     * @param txPowerDb Transmission power in dB.
+     * @param txmode UanTxMode defining modulation of transmitted packet.
      */
     virtual void TxPacket(Ptr<UanTransducer> src,
                           Ptr<Packet> packet,
@@ -70,8 +70,8 @@
     /**
      * Adds device to receiver list for this channel.
      *
-     * \param dev Net Device of node.
-     * \param trans Transducer of net device attached to this channel.
+     * @param dev Net Device of node.
+     * @param trans Transducer of net device attached to this channel.
      */
     void AddDevice(Ptr<UanNetDevice> dev, Ptr<UanTransducer> trans);
 
@@ -79,7 +79,7 @@
      * Set the propagation model this channel will use
      * for path loss/propagation delay.
      *
-     * \param prop The propagation model.
+     * @param prop The propagation model.
      */
     void SetPropagationModel(Ptr<UanPropModel> prop);
 
@@ -87,15 +87,15 @@
      * Set the noise model this channel will use
      * to determine ambient channel noise.
      *
-     * \param noise The noise model.
+     * @param noise The noise model.
      */
     void SetNoiseModel(Ptr<UanNoiseModel> noise);
 
     /**
      * Get the noise level on the channel.
      *
-     * \param fKhz Frequency in kHz.
-     * \return Ambient noise in dB/Hz on channel at a frequency.
+     * @param fKhz Frequency in kHz.
+     * @return Ambient noise in dB/Hz on channel at a frequency.
      */
     double GetNoiseDbHz(double fKhz);
 
@@ -113,11 +113,11 @@
     /**
      * Send a packet up to the receiving UanTransducer.
      *
-     * \param i Device number.
-     * \param packet The received packet.
-     * \param rxPowerDb Signal power in dB of arriving packet.
-     * \param txMode Mode arriving packet is using.
-     * \param pdp PDP of arriving signal.
+     * @param i Device number.
+     * @param packet The received packet.
+     * @param rxPowerDb Signal power in dB of arriving packet.
+     * @param txMode Mode arriving packet is using.
+     * @param pdp PDP of arriving signal.
      */
     void SendUp(uint32_t i, Ptr<Packet> packet, double rxPowerDb, UanTxMode txMode, UanPdp pdp);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/uan/model/uan-header-common.h ns-3.44/src/uan/model/uan-header-common.h
--- ns-3.43/src/uan/model/uan-header-common.h	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/uan/model/uan-header-common.h	2025-03-09 16:55:49.731372400 -0700
@@ -18,7 +18,7 @@
 {
 
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  *  UAN protocol descriptor
  */
@@ -29,7 +29,7 @@
 };
 
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  * Common packet header fields.
  *
@@ -60,10 +60,10 @@
      * Create UanHeaderCommon object with given source and destination
      * address and header type
      *
-     * \param src Source address defined in header.
-     * \param dest Destination address defined in header.
-     * \param type Header type.
-     * \param protocolNumber the layer 3 protocol number
+     * @param src Source address defined in header.
+     * @param dest Destination address defined in header.
+     * @param type Header type.
+     * @param protocolNumber the layer 3 protocol number
      */
     UanHeaderCommon(const Mac8Address src,
                     const Mac8Address dest,
@@ -74,59 +74,59 @@
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
     /**
      * Set the destination address.
      *
-     * \param dest Address of destination node.
+     * @param dest Address of destination node.
      */
     void SetDest(Mac8Address dest);
     /**
      * Set the source address.
      *
-     * \param src Address of packet source node.
+     * @param src Address of packet source node.
      */
     void SetSrc(Mac8Address src);
     /**
      * Set the header type.
      *
      * Use of this value is protocol specific.
-     * \param type The type value.
+     * @param type The type value.
      */
     void SetType(uint8_t type);
     /**
      * Set the packet type.
      *
      * Used to indicate the layer 3 protocol
-     * \param protocolNumber The layer 3 protocol number value.
+     * @param protocolNumber The layer 3 protocol number value.
      */
     void SetProtocolNumber(uint16_t protocolNumber);
 
     /**
      * Get the destination address.
      *
-     * \return Mac8Address in destination field.
+     * @return Mac8Address in destination field.
      */
     Mac8Address GetDest() const;
     /**
      * Get the source address
      *
-     * \return Mac8Address in source field.
+     * @return Mac8Address in source field.
      */
     Mac8Address GetSrc() const;
     /**
      * Get the header type value.
      *
-     * \return value of type field.
+     * @return value of type field.
      */
     uint8_t GetType() const;
     /**
      * Get the packet type value.
      *
-     * \return value of protocolNumber field.
+     * @return value of protocolNumber field.
      */
     uint16_t GetProtocolNumber() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/uan/model/uan-header-rc.cc ns-3.44/src/uan/model/uan-header-rc.cc
--- ns-3.43/src/uan/model/uan-header-rc.cc	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/uan/model/uan-header-rc.cc	2025-03-09 16:55:49.731372400 -0700
@@ -24,7 +24,7 @@
 UanHeaderRcData::UanHeaderRcData()
     : Header(),
       m_frameNo(0),
-      m_propDelay(Seconds(0))
+      m_propDelay()
 {
 }
 
@@ -120,7 +120,7 @@
       m_frameNo(0),
       m_noFrames(0),
       m_length(0),
-      m_timeStamp(Seconds(0)),
+      m_timeStamp(),
       m_retryNo(0)
 {
 }
@@ -389,9 +389,9 @@
 UanHeaderRcCts::UanHeaderRcCts()
     : Header(),
       m_frameNo(0),
-      m_timeStampRts(Seconds(0)),
+      m_timeStampRts(),
       m_retryNo(0),
-      m_delay(Seconds(0)),
+      m_delay(),
       m_address(Mac8Address::GetBroadcast())
 {
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/uan/model/uan-header-rc.h ns-3.44/src/uan/model/uan-header-rc.h
--- ns-3.43/src/uan/model/uan-header-rc.h	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/uan/model/uan-header-rc.h	2025-03-09 16:55:49.731372400 -0700
@@ -19,7 +19,7 @@
 {
 
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  * Extra data header information.
  *
@@ -34,9 +34,9 @@
     /**
      * Constructor.
      *
-     * \param frameNum Data frame # of reservation being transmitted.
-     * \param propDelay  Measured propagation delay found in handshaking.
-     * \note Prop. delay is transmitted with 16 bits and ms accuracy.
+     * @param frameNum Data frame # of reservation being transmitted.
+     * @param propDelay  Measured propagation delay found in handshaking.
+     * @note Prop. delay is transmitted with 16 bits and ms accuracy.
      */
     UanHeaderRcData(uint8_t frameNum, Time propDelay);
     /** Destructor */
@@ -44,41 +44,41 @@
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
     /**
      * Set the frame number of the reservation being transmitted.
      *
-     * \param frameNum The data frame number.
+     * @param frameNum The data frame number.
      */
     void SetFrameNo(uint8_t frameNum);
     /**
      * Set the propagation delay as found in handshaking.
      *
-     * \param propDelay The measured propagation delay.
-     * \note Prop. delay is transmitted with 16 bits and ms accuracy.
+     * @param propDelay The measured propagation delay.
+     * @note Prop. delay is transmitted with 16 bits and ms accuracy.
      */
     void SetPropDelay(Time propDelay);
     /**
      * Get the frame number of the reservation being transmitted.
      *
-     * \return The data frame number.
+     * @return The data frame number.
      */
     uint8_t GetFrameNo() const;
     /**
      * Get the propagation delay found in handshaking.
      *
-     * \return The measured propagation delay.
-     * \note Prop. delay is transmitted with 16 bits and ms accuracy
+     * @return The measured propagation delay.
+     * @note Prop. delay is transmitted with 16 bits and ms accuracy
      */
     Time GetPropDelay() const;
     /**
      * Specialized Print with Time::Unit declared.
      *
-     * \param os ostream.
-     * \param unit Time unit.
+     * @param os ostream.
+     * @param unit Time unit.
      */
     void Print(std::ostream& os, Time::Unit unit) const;
 
@@ -96,7 +96,7 @@
 }; // class UanHeaderRcData
 
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  * RTS header.
  *
@@ -110,12 +110,12 @@
     /**
      * Constructor.
      *
-     * \param frameNo Reservation frame number.
-     * \param retryNo Retry number of RTS packet.
-     * \param noFrames Number of data frames in reservation.
-     * \param length Number of bytes (including headers) in data.
-     * \param ts RTS TX timestamp.
-     * \note Timestamp is serialized into 32 bits with ms accuracy.
+     * @param frameNo Reservation frame number.
+     * @param retryNo Retry number of RTS packet.
+     * @param noFrames Number of data frames in reservation.
+     * @param length Number of bytes (including headers) in data.
+     * @param ts RTS TX timestamp.
+     * @note Timestamp is serialized into 32 bits with ms accuracy.
      */
     UanHeaderRcRts(uint8_t frameNo, uint8_t retryNo, uint8_t noFrames, uint16_t length, Time ts);
     /** Destructor */
@@ -123,33 +123,33 @@
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
     /**
      * Set the frame number.
      *
-     * \param fno TX frame number
+     * @param fno TX frame number
      */
     void SetFrameNo(uint8_t fno);
     /**
      * Set the number of data frames included in this reservation request.
      *
-     * \param no Number of frames.
+     * @param no Number of frames.
      */
     void SetNoFrames(uint8_t no);
     /**
      * Set RTS transmission time.
      *
-     * \param timeStamp The RTS transmission time.
+     * @param timeStamp The RTS transmission time.
      */
     void SetTimeStamp(Time timeStamp);
     /**
      * Set the number of data bytes in the reservation.
      *
-     * \param length Total number of data bytes in reservation (including headers).
-     * \note Timestamp is serialized with 32 bits in ms precision.
+     * @param length Total number of data bytes in reservation (including headers).
+     * @note Timestamp is serialized with 32 bits in ms precision.
      */
     void SetLength(uint16_t length);
     /**
@@ -157,46 +157,46 @@
      *
      * This is used to match timestamp to correctly received RTS.
      *
-     * \param no Retry number.
+     * @param no Retry number.
      */
     void SetRetryNo(uint8_t no);
 
     /**
      * Get the frame number.
      *
-     * \return The frame number.
+     * @return The frame number.
      */
     uint8_t GetFrameNo() const;
     /**
      * Get the number of data frames in the reservation.
      *
-     * \return The number of data frames.
+     * @return The number of data frames.
      */
     uint8_t GetNoFrames() const;
     /**
      * Get the transmit timestamp of this RTS packet.
      *
-     * \return The TX time.
-     * \note Timestamp is serialized with 32 bits in ms precision.
+     * @return The TX time.
+     * @note Timestamp is serialized with 32 bits in ms precision.
      */
     Time GetTimeStamp() const;
     /**
      * Get the total number of bytes in the reservation, including headers.
      *
-     * \return Total number of bytes in data packets for reservation.
+     * @return Total number of bytes in data packets for reservation.
      */
     uint16_t GetLength() const;
     /**
      * Get the retry number of this RTS packet.
      *
-     * \return The retry number.
+     * @return The retry number.
      */
     uint8_t GetRetryNo() const;
     /**
      * Specialized Print with Time::Unit declared.
      *
-     * \param os ostream.
-     * \param unit Time unit.
+     * @param os ostream.
+     * @param unit Time unit.
      */
     void Print(std::ostream& os, Time::Unit unit) const;
 
@@ -217,7 +217,7 @@
 }; // class UanHeaderRcRts
 
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  * Cycle broadcast information.
  *
@@ -231,10 +231,10 @@
     /**
      * Constructor
      *
-     * \param wt Window time.
-     * \param ts Timestamp.
-     * \param rate Rate number.
-     * \param retryRate  Retry rate value.
+     * @param wt Window time.
+     * @param ts Timestamp.
+     * @param rate Rate number.
+     * @param retryRate  Retry rate value.
      */
     UanHeaderRcCtsGlobal(Time wt, Time ts, uint16_t rate, uint16_t retryRate);
     /** Destructor */
@@ -242,65 +242,65 @@
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
     /**
      * Set the rate number corresponding to data rate of current cycle.
-     * \param rate The rate number.
+     * @param rate The rate number.
      */
     void SetRateNum(uint16_t rate);
     /**
      * Set the retry rate number for the current cycle.
-     * \param rate The retry rate number
+     * @param rate The retry rate number
      */
     void SetRetryRate(uint16_t rate);
     /**
      * Set the window time (time duration following blocking time
      * to allow RTS transmissions).
      *
-     * \param t The window time.
+     * @param t The window time.
      */
     void SetWindowTime(Time t);
 
     /**
      * Set the CTS timestamp.
      *
-     * \param timeStamp The time of CTS transmission.
+     * @param timeStamp The time of CTS transmission.
      */
     void SetTxTimeStamp(Time timeStamp);
 
     /**
      * Get the data rate number.
      *
-     * \return The rate number.
+     * @return The rate number.
      */
     uint16_t GetRateNum() const;
     /**
      * Get the retry rate number.
      *
-     * \return The retry rate number.
+     * @return The retry rate number.
      */
     uint16_t GetRetryRate() const;
     /**
      * Get the window time (time duration following blocking time
      * to allow RTS transmissions).
      *
-     * \return The window time.
+     * @return The window time.
      */
     Time GetWindowTime() const;
     /**
      * Get the CTS transmit timestamp.
      *
-     * \return The timestamp.
+     * @return The timestamp.
      */
     Time GetTxTimeStamp() const;
     /**
      * Specialized Print with Time::Unit declared.
      *
-     * \param os ostream.
-     * \param unit Time unit.
+     * @param os ostream.
+     * @param unit Time unit.
      */
     void Print(std::ostream& os, Time::Unit unit) const;
 
@@ -320,7 +320,7 @@
 }; // class UanHeaderRcCtsGlobal
 
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  * CTS header
  *
@@ -335,12 +335,12 @@
     /**
      * Constructor
      *
-     * \param frameNo Reservation frame # being cleared.
-     * \param retryNo Retry # of received RTS packet.
-     * \param rtsTs RX time of RTS packet at gateway.
-     * \param delay Delay until transmission.
-     * \param addr Destination of CTS packet.
-     * \note Times are serialized, with ms precision, into 32 bit fields.
+     * @param frameNo Reservation frame # being cleared.
+     * @param retryNo Retry # of received RTS packet.
+     * @param rtsTs RX time of RTS packet at gateway.
+     * @param delay Delay until transmission.
+     * @param addr Destination of CTS packet.
+     * @note Times are serialized, with ms precision, into 32 bit fields.
      */
     UanHeaderRcCts(uint8_t frameNo, uint8_t retryNo, Time rtsTs, Time delay, Mac8Address addr);
     /** Destructor */
@@ -348,77 +348,77 @@
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
     /**
      * Set the RTS frame number being cleared.
      *
-     * \param frameNo The frame number.
+     * @param frameNo The frame number.
      */
     void SetFrameNo(uint8_t frameNo);
     /**
      * Set the timestamp for RTS reception.
      *
-     * \param timeStamp The timestamp.
+     * @param timeStamp The timestamp.
      */
     void SetRtsTimeStamp(Time timeStamp);
     /**
      * Set the time delay from CTS transmission to first data frame arrival.
      *
-     * \param delay The delay time.
+     * @param delay The delay time.
      */
     void SetDelayToTx(Time delay);
     /**
      * Set the retry number of the RTS frame being cleared.
      *
-     * \param no The retry number.
+     * @param no The retry number.
      */
     void SetRetryNo(uint8_t no);
     /**
      * Set the destination address, for scheduling info.
      *
-     * \param addr The destination address.
+     * @param addr The destination address.
      */
     void SetAddress(Mac8Address addr);
 
     /**
      * Get the frame number of the RTS being cleared.
      *
-     * \return The frame number.
+     * @return The frame number.
      */
     uint8_t GetFrameNo() const;
     /**
      * Get the receive time of the RTS being cleared.
      *
-     * \return The RX time.
+     * @return The RX time.
      */
     Time GetRtsTimeStamp() const;
     /**
      * Get the time delay from TX time of CTS packet until
      * arrival of first data frame.
      *
-     * \return The delay time.
+     * @return The delay time.
      */
     Time GetDelayToTx() const;
     /**
      * Get the retry number of the RTS packet being cleared.
      *
-     * \return The retry number
+     * @return The retry number
      */
     uint8_t GetRetryNo() const;
     /**
      * Get the destination address, for scheduling info.
      *
-     * \return The destination address.
+     * @return The destination address.
      */
     Mac8Address GetAddress() const;
     /**
      * Specialized Print with Time::Unit declared.
      *
-     * \param os ostream.
-     * \param unit Time unit.
+     * @param os ostream.
+     * @param unit Time unit.
      */
     void Print(std::ostream& os, Time::Unit unit) const;
 
@@ -439,7 +439,7 @@
 }; // class UanHeaderRcCts
 
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  * Header used for ACK packets by protocol UanMacRc
  */
@@ -453,39 +453,39 @@
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
     /**
      * Set the frame number of the reservation being acknowledged.
      *
-     * \param frameNo The frame number.
+     * @param frameNo The frame number.
      */
     void SetFrameNo(uint8_t frameNo);
     /**
      * NACK a frame.
      *
-     * \param frame The data frame number being NACKed.
+     * @param frame The data frame number being NACKed.
      */
     void AddNackedFrame(uint8_t frame);
 
     /**
      * Get the set of NACK'ed frames.
      *
-     * \return The set of NACK'ed frames.
+     * @return The set of NACK'ed frames.
      */
     const std::set<uint8_t>& GetNackedFrames() const;
     /**
      * Get the reservation frame number being ACKed.
      *
-     * \return The frame number.
+     * @return The frame number.
      */
     uint8_t GetFrameNo() const;
     /**
      * Get the number of data frames being NACKed.
      *
-     * \return The number of NACKed frames.
+     * @return The number of NACKed frames.
      */
     uint8_t GetNoNacks() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/uan/model/uan-mac-aloha.h ns-3.44/src/uan/model/uan-mac-aloha.h
--- ns-3.43/src/uan/model/uan-mac-aloha.h	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/uan/model/uan-mac-aloha.h	2025-03-09 16:55:49.731372400 -0700
@@ -20,7 +20,7 @@
 class UanTxMode;
 
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  * ALOHA MAC Protocol, the simplest MAC protocol for wireless networks.
  *
@@ -37,7 +37,7 @@
     ~UanMacAloha() override;
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
@@ -59,17 +59,17 @@
     /**
      * Receive packet from lower layer (passed to PHY as callback).
      *
-     * \param pkt Packet being received.
-     * \param sinr SINR of received packet.
-     * \param txMode Mode of received packet.
+     * @param pkt Packet being received.
+     * @param sinr SINR of received packet.
+     * @param txMode Mode of received packet.
      */
     void RxPacketGood(Ptr<Packet> pkt, double sinr, UanTxMode txMode);
 
     /**
      * Packet received at lower layer in error.
      *
-     * \param pkt Packet received in error.
-     * \param sinr SINR of received packet.
+     * @param pkt Packet received in error.
+     * @param sinr SINR of received packet.
      */
     void RxPacketError(Ptr<Packet> pkt, double sinr);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/uan/model/uan-mac-cw.h ns-3.44/src/uan/model/uan-mac-cw.h
--- ns-3.43/src/uan/model/uan-mac-cw.h	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/uan/model/uan-mac-cw.h	2025-03-09 16:55:49.731372400 -0700
@@ -22,7 +22,7 @@
 {
 
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  * CW-MAC protocol, similar in idea to the 802.11 DCF with
  * constant backoff window
@@ -42,32 +42,32 @@
     ~UanMacCw() override;
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
     /**
      * Set the contention window size.
      *
-     * \param cw Contention window size.
+     * @param cw Contention window size.
      */
     virtual void SetCw(uint32_t cw);
     /**
      * Set the slot time duration.
      *
-     * \param duration Slot time duration.
+     * @param duration Slot time duration.
      */
     virtual void SetSlotTime(Time duration);
     /**
      * Get the contention window size.
      *
-     * \return Contention window size.
+     * @return Contention window size.
      */
     virtual uint32_t GetCw();
     /**
      * Get the slot time duration.
      *
-     * \return Slot time duration.
+     * @return Slot time duration.
      */
     virtual Time GetSlotTime();
 
@@ -90,8 +90,8 @@
     /**
      *  TracedCallback signature for enqueue/dequeue of a packet.
      *
-     * \param [in] packet The Packet being received.
-     * \param [in] proto The protocol number.
+     * @param [in] packet The Packet being received.
+     * @param [in] proto The protocol number.
      */
     typedef void (*QueueTracedCallback)(Ptr<const Packet> packet, uint16_t proto);
 
@@ -145,16 +145,16 @@
     /**
      * Receive packet from lower layer (passed to PHY as callback).
      *
-     * \param packet Packet being received.
-     * \param sinr SINR of received packet.
-     * \param mode Mode of received packet.
+     * @param packet Packet being received.
+     * @param sinr SINR of received packet.
+     * @param mode Mode of received packet.
      */
     void PhyRxPacketGood(Ptr<Packet> packet, double sinr, UanTxMode mode);
     /**
      * Packet received at lower layer in error.
      *
-     * \param packet Packet received in error.
-     * \param sinr SINR of received packet.
+     * @param packet Packet received in error.
+     * @param sinr SINR of received packet.
      */
     void PhyRxPacketError(Ptr<Packet> packet, double sinr);
     /** Cancel SendEvent and save remaining delay. */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/uan/model/uan-mac.h ns-3.44/src/uan/model/uan-mac.h
--- ns-3.43/src/uan/model/uan-mac.h	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/uan/model/uan-mac.h	2025-03-09 16:55:49.731372400 -0700
@@ -27,7 +27,7 @@
 class Mac8Address;
 
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  * Virtual base class for all UAN MAC protocols.
  */
@@ -38,37 +38,37 @@
     UanMac();
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
     /**
      * Get the MAC Address.
      *
-     * \return MAC Address.
+     * @return MAC Address.
      */
     virtual Address GetAddress();
 
     /**
      * Set the address.
      *
-     * \param addr Mac8Address for this MAC.
+     * @param addr Mac8Address for this MAC.
      */
     virtual void SetAddress(Mac8Address addr);
 
     /**
      * Enqueue packet to be transmitted.
      *
-     * \param pkt Packet to be transmitted.
-     * \param dest Destination address.
-     * \param protocolNumber The type of the packet.
-     * \return True if packet was successfully enqueued.
+     * @param pkt Packet to be transmitted.
+     * @param dest Destination address.
+     * @param protocolNumber The type of the packet.
+     * @return True if packet was successfully enqueued.
      */
     virtual bool Enqueue(Ptr<Packet> pkt, uint16_t protocolNumber, const Address& dest) = 0;
     /**
      * Set the callback to forward packets up to higher layers.
      *
-     * \param cb The callback.
+     * @param cb The callback.
      * \pname{packet} The packet.
      * \pname{address} The source address.
      */
@@ -80,14 +80,14 @@
      * Some MACs may be designed to work with multiple PHY
      * layers.  Others may only work with one.
      *
-     * \param phy Phy layer to attach to this MAC.
+     * @param phy Phy layer to attach to this MAC.
      */
     virtual void AttachPhy(Ptr<UanPhy> phy) = 0;
 
     /**
      * Get the broadcast address.
      *
-     * \return The broadcast address.
+     * @return The broadcast address.
      */
     virtual Address GetBroadcast() const;
 
@@ -99,28 +99,28 @@
      * used by this model.  Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream First stream index to use.
-     * \return The number of stream indices assigned by this model.
+     * @param stream First stream index to use.
+     * @return The number of stream indices assigned by this model.
      */
     virtual int64_t AssignStreams(int64_t stream) = 0;
 
     /**
      *  TracedCallback signature for packet reception/enqueue/dequeue events.
      *
-     * \param [in] packet The Packet.
-     * \param [in] mode The UanTxMode.
+     * @param [in] packet The Packet.
+     * @param [in] mode The UanTxMode.
      */
     typedef void (*PacketModeTracedCallback)(Ptr<const Packet> packet, UanTxMode mode);
 
     /**
      * Get the Tx mode index (Modulation type).
-     * \return the Tx mode index
+     * @return the Tx mode index
      */
     uint32_t GetTxModeIndex() const;
 
     /**
      * Set the Tx mode index (Modulation type).
-     * \param txModeIndex the Tx mode index
+     * @param txModeIndex the Tx mode index
      */
     void SetTxModeIndex(uint32_t txModeIndex);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/uan/model/uan-mac-rc.cc ns-3.44/src/uan/model/uan-mac-rc.cc
--- ns-3.43/src/uan/model/uan-mac-rc.cc	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/uan/model/uan-mac-rc.cc	2025-03-09 16:55:49.731372400 -0700
@@ -350,7 +350,7 @@
 
         Time winDelay = ctsg.GetWindowTime();
 
-        if (winDelay > Time(0))
+        if (winDelay.IsStrictlyPositive())
         {
             m_rtsBlocked = false;
             Simulator::Schedule(winDelay, &UanMacRc::BlockRtsing, this);
@@ -439,7 +439,7 @@
 
     Time startDelay = txTime - Simulator::Now();
 
-    Time frameDelay = Seconds(0);
+    Time frameDelay;
 
     const std::list<std::pair<Ptr<Packet>, Mac8Address>> l = it->GetPktList();
     auto pit = l.begin();
@@ -460,7 +460,7 @@
 
         pkt->AddHeader(ch);
         Time eventTime = startDelay + frameDelay;
-        if (eventTime < Time(0))
+        if (eventTime.IsStrictlyNegative())
         {
             NS_FATAL_ERROR(
                 "Scheduling error resulted in very negative data transmission time! eventTime = "
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/uan/model/uan-mac-rc-gw.cc ns-3.44/src/uan/model/uan-mac-rc-gw.cc
--- ns-3.43/src/uan/model/uan-mac-rc-gw.cc	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/uan/model/uan-mac-rc-gw.cc	2025-03-09 16:55:49.731372400 -0700
@@ -295,7 +295,7 @@
     // Calculate dataRate
     uint32_t totalBytes = 0;
     uint32_t totalFrames = 0;
-    Time pDelay = Seconds(0);
+    Time pDelay;
     if (numRts > 0)
     {
         auto rit = m_requests.begin();
@@ -472,7 +472,7 @@
 {
     NS_LOG_DEBUG(Now().As(Time::S) << " GW Ending cycle");
 
-    Time nextAck = Seconds(0);
+    Time nextAck;
 
     Time ackTime = Seconds(m_ackSize * 8.0 / m_phy->GetMode(m_currentRateNum).GetDataRateBps());
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/uan/model/uan-mac-rc-gw.h ns-3.44/src/uan/model/uan-mac-rc-gw.h
--- ns-3.43/src/uan/model/uan-mac-rc-gw.h	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/uan/model/uan-mac-rc-gw.h	2025-03-09 16:55:49.731372400 -0700
@@ -24,7 +24,7 @@
 class UanTxMode;
 
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  * Gateway side of RC-MAC.
  *
@@ -48,7 +48,7 @@
 
     /**
      * Register this type.
-     * \return The type ID.
+     * @return The type ID.
      */
     static TypeId GetTypeId();
 
@@ -62,14 +62,14 @@
     /**
      * TracedCallback signature for
      *
-     * \param [in] now, The current simulation time.
-     * \param [in] delay Minimum path delay of first RTS.
-     * \param [in] numRts Number of pending RTS.
-     * \param [in] totalBytes Length of RTS header.
-     * \param [in] secs Effective window size for RcCtsGlobal message, or
+     * @param [in] now, The current simulation time.
+     * @param [in] delay Minimum path delay of first RTS.
+     * @param [in] numRts Number of pending RTS.
+     * @param [in] totalBytes Length of RTS header.
+     * @param [in] secs Effective window size for RcCtsGlobal message, or
      *             time to next cycle, both in seconds.
-     * \param [in] ctlRate CTL rate in Bps.
-     * \param [in] actualX Current retry rate.
+     * @param [in] ctlRate CTL rate in Bps.
+     * @param [in] actualX Current retry rate.
      */
     typedef void (*CycleCallback)(Time now,
                                   Time delay,
@@ -91,7 +91,7 @@
     State m_state; //!< Gateway processing state.
 
     /**
-     * \ingroup uan
+     * @ingroup uan
      * Reservation request.
      */
     struct Request
@@ -104,7 +104,7 @@
     };
 
     /**
-     * \ingroup uan
+     * @ingroup uan
      * Packet ACK data.
      */
     struct AckData
@@ -171,9 +171,9 @@
     /**
      * PHY receive ok callback.
      *
-     * \param pkt The Packet to receive
-     * \param sinr The SINR on the channel
-     * \param mode The transmission mode
+     * @param pkt The Packet to receive
+     * @param sinr The SINR on the channel
+     * @param mode The transmission mode
      */
     void ReceivePacket(Ptr<Packet> pkt, double sinr, UanTxMode mode);
 
@@ -184,8 +184,8 @@
     /**
      * Send packet on PHY.
      *
-     * \param pkt The Packet.
-     * \param rate The UanTxMode number, m_currentRateNum.
+     * @param pkt The Packet.
+     * @param rate The UanTxMode number, m_currentRateNum.
      */
     void SendPacket(Ptr<Packet> pkt, uint32_t rate);
     /** Set state to INCYCLE. */
@@ -193,8 +193,8 @@
     /**
      * PHY receive error callback.
      *
-     * \param pkt The failed packet.
-     * \param sinr The SINR value on the channel.
+     * @param pkt The failed packet.
+     * @param sinr The SINR value on the channel.
      */
     void ReceiveError(Ptr<Packet> pkt, double sinr);
 
@@ -202,12 +202,12 @@
     /**
      * Compute alpha parameter.
      *
-     * \param totalFrames Total number of frames in m_requests.
-     * \param totalBytes Total number of bytes in m_requests.
-     * \param n Number of nodes.
-     * \param a m_maxRes, or optimal A value.
-     * \param deltaK Propagation delay.
-     * \return Alpha parameter.
+     * @param totalFrames Total number of frames in m_requests.
+     * @param totalBytes Total number of bytes in m_requests.
+     * @param n Number of nodes.
+     * @param a m_maxRes, or optimal A value.
+     * @param deltaK Propagation delay.
+     * @return Alpha parameter.
      */
     double ComputeAlpha(uint32_t totalFrames,
                         uint32_t totalBytes,
@@ -217,66 +217,66 @@
     /**
      * Get the expected propagation delay to each node.
      *
-     * \return Vector of expected propagation delays.
+     * @return Vector of expected propagation delays.
      */
     std::vector<double> GetExpPdk();
     /**
      * Throughput for \pname{a} reservations with framesize \pname{ld},
      * given expected delays exppdk.
      *
-     * \param a Number of reservations.
-     * \param ld Frame size.
-     * \param exppdk Expected delays, given by GetExpPdk.
-     * \return Expected throughput.
+     * @param a Number of reservations.
+     * @param ld Frame size.
+     * @param exppdk Expected delays, given by GetExpPdk.
+     * @return Expected throughput.
      */
     double ComputeExpS(uint32_t a, uint32_t ld, std::vector<double> exppdk);
     /**
      * Throughput for \pname{a} reservations with framesize \pname{ld}.
      *
-     * \param a Number of reservations.
-     * \param ld Frame size.
-     * \return Expected throughput.
+     * @param a Number of reservations.
+     * @param ld Frame size.
+     * @return Expected throughput.
      */
     double ComputeExpS(uint32_t a, uint32_t ld);
     /**
      * Index to the k'th expected delay among n nodes.
      *
-     * \param n Number of nodes.
-     * \param k Target index.
-     * \return The expected index.
+     * @param n Number of nodes.
+     * @param k Target index.
+     * @return The expected index.
      */
     uint32_t CompExpMinIndex(uint32_t n, uint32_t k);
     /**
      * Numeric function.
      *
-     * \param a Number of reservations.
-     * \param n number of nodes.
-     * \param k K'th node.
-     * \return Value.
+     * @param a Number of reservations.
+     * @param n number of nodes.
+     * @param k K'th node.
+     * @return Value.
      */
     double ComputePiK(uint32_t a, uint32_t n, uint32_t k);
     /**
      * Numeric function.
      *
-     * \param n Number of nodes.
-     * \param a Number of reservations.
-     * \param ldlh Sum of common header length and frame size.
-     * \param deltaK Result of GetExpPdk
-     * \return value.
+     * @param n Number of nodes.
+     * @param a Number of reservations.
+     * @param ldlh Sum of common header length and frame size.
+     * @param deltaK Result of GetExpPdk
+     * @return value.
      */
     double ComputeExpBOverA(uint32_t n, uint32_t a, uint32_t ldlh, std::vector<double> deltaK);
     /**
      * Binomial coefficient.
      *
-     * \param n Pool size.
-     * \param k Selection size.
-     * \return Binomial coefficient n choose k.
+     * @param n Pool size.
+     * @param k Selection size.
+     * @return Binomial coefficient n choose k.
      */
     uint64_t NchooseK(uint32_t n, uint32_t k);
     /**
      * Compute the optimum maximum number of reservations to accept per cycle.
      *
-     * \return Optimum number.
+     * @return Optimum number.
      */
     uint32_t FindOptA();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/uan/model/uan-mac-rc.h ns-3.44/src/uan/model/uan-mac-rc.h
--- ns-3.43/src/uan/model/uan-mac-rc.h	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/uan/model/uan-mac-rc.h	2025-03-09 16:55:49.731372400 -0700
@@ -45,9 +45,9 @@
      * Create Reservation object with given packet list,
      * frame number and max packets.
      *
-     * \param list List of packets for assigned to reservation.
-     * \param frameNo Frame number of reservation transmission.
-     * \param maxPkts Maximum number of packets to assign to reservation
+     * @param list List of packets for assigned to reservation.
+     * @param frameNo Frame number of reservation transmission.
+     * @param maxPkts Maximum number of packets to assign to reservation
      *   from packet list (0 = no maximum).
      */
     Reservation(std::list<std::pair<Ptr<Packet>, Mac8Address>>& list,
@@ -58,7 +58,7 @@
     /**
      * Get the number of frames in this Reservation.
      *
-     * \return Number of frames.
+     * @return Number of frames.
      */
     uint32_t GetNoFrames() const;
     /**
@@ -66,47 +66,47 @@
      *
      * This is the sum of packets with headers.
      *
-     * \return Total length, in bytes.
+     * @return Total length, in bytes.
      */
     uint32_t GetLength() const;
     /**
      * Get the list of packets.
      *
-     * \return The list of packets.
+     * @return The list of packets.
      */
     const std::list<std::pair<Ptr<Packet>, Mac8Address>>& GetPktList() const;
     /**
      * Get the frame number.
      *
-     * \return The frame number.
+     * @return The frame number.
      */
     uint8_t GetFrameNo() const;
     /**
      * Get the retry number.
      *
-     * \return The retry number.
+     * @return The retry number.
      */
     uint8_t GetRetryNo() const;
     /**
      * Get the timestamp for the n'th RTS.
      *
-     * \param n Which retry number.
-     * \return N'th timestamp.
+     * @param n Which retry number.
+     * @return N'th timestamp.
      */
     Time GetTimestamp(uint8_t n) const;
 
-    /** \return True if reservation packets have been transmitted. */
+    /** @return True if reservation packets have been transmitted. */
     bool IsTransmitted() const;
     /**
      * Set the frame number.
      *
-     * \param fn The frame number.
+     * @param fn The frame number.
      */
     void SetFrameNo(uint8_t fn);
     /**
      * Set the time of the latest RTS sent.
      *
-     * \param t RTS timestamp.
+     * @param t RTS timestamp.
      */
     void AddTimestamp(Time t);
     /** Increment the retry count. */
@@ -114,7 +114,7 @@
     /**
      * Set the reservation transmitted state.
      *
-     * \param t True if reservation has been transmitted.
+     * @param t True if reservation has been transmitted.
      */
     void SetTransmitted(bool t = true);
 
@@ -135,7 +135,7 @@
 }; // class Reservation
 
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  * Non-gateway node MAC for reservation channel MAC protocol.
  *
@@ -168,7 +168,7 @@
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
@@ -182,8 +182,8 @@
     /**
      *  TracedCallback signature for dequeue of a packet.
      *
-     * \param [in] packet The Packet being received.
-     * \param [in] proto The protocol number.
+     * @param [in] packet The Packet being received.
+     * @param [in] proto The protocol number.
      */
     typedef void (*QueueTracedCallback)(Ptr<const Packet> packet, uint32_t proto);
 
@@ -241,9 +241,9 @@
     /**
      * PHY receive ok Callback.
      *
-     * \param pkt The received packet.
-     * \param sinr (Unused).
-     * \param mode Modulation mode.
+     * @param pkt The received packet.
+     * @param sinr (Unused).
+     * @param mode Modulation mode.
      */
     void ReceiveOkFromPhy(Ptr<Packet> pkt, double sinr, UanTxMode mode);
     /** Associate with a gateway by sending the first GWPING. */
@@ -257,16 +257,16 @@
     /**
      * Create the RTS header from a Reservation.
      *
-     * \param res The Reservation.
-     * \return A RTS header.
+     * @param res The Reservation.
+     * @return A RTS header.
      */
     UanHeaderRcRts CreateRtsHeader(const Reservation& res);
     /**
      * Schedule Packet sends.
      *
-     * \param ctsh The CTS header identifying the frame number and delay.
-     * \param ctsg The CTS global header giving the transmit time stamp base.
-     * \param ctsBytes Number of bytes total in CTS packet.
+     * @param ctsh The CTS header identifying the frame number and delay.
+     * @param ctsg The CTS global header giving the transmit time stamp base.
+     * @param ctsBytes Number of bytes total in CTS packet.
      */
     void ScheduleData(const UanHeaderRcCts& ctsh,
                       const UanHeaderRcCtsGlobal& ctsg,
@@ -274,21 +274,21 @@
     /**
      * Process a received ACK.
      *
-     * \param ack The ACK packet.
+     * @param ack The ACK packet.
      */
     void ProcessAck(Ptr<Packet> ack);
     /**
      * Send on packet on the PHY.
      *
-     * \param pkt The packet.
-     * \param rate The transmission rate.
+     * @param pkt The packet.
+     * @param rate The transmission rate.
      */
     void SendPacket(Ptr<Packet> pkt, uint32_t rate);
     /**
      * Check that PHY is ok:
      *   not CTS or ACK
      *   not to my address
-     * \return True if PHY is ok.
+     * @return True if PHY is ok.
      */
     bool IsPhy1Ok();
     /** Callback to block RST. */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/uan/model/uan-net-device.cc ns-3.44/src/uan/model/uan-net-device.cc
--- ns-3.43/src/uan/model/uan-net-device.cc	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/uan/model/uan-net-device.cc	2025-03-09 16:55:49.731372400 -0700
@@ -233,7 +233,7 @@
 bool
 UanNetDevice::SetMtu(uint16_t mtu)
 {
-    /// \todo  Check this in MAC
+    /// @todo  Check this in MAC
     NS_LOG_WARN("UanNetDevice:  MTU is not implemented");
     m_mtu = mtu;
     return true;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/uan/model/uan-net-device.h ns-3.44/src/uan/model/uan-net-device.h
--- ns-3.43/src/uan/model/uan-net-device.h	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/uan/model/uan-net-device.h	2025-03-09 16:55:49.731372400 -0700
@@ -25,13 +25,13 @@
 class UanTransducer;
 
 /**
- * \defgroup uan UAN Models
+ * @defgroup uan UAN Models
  * This section documents the API of the ns-3 UAN module. For a generic functional description,
  * please refer to the ns-3 manual.
  */
 
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  * Net device for UAN models.
  */
@@ -45,7 +45,7 @@
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
@@ -57,48 +57,48 @@
     /**
      * Set the MAC layer for this device.
      *
-     * \param mac The MAC layer.
+     * @param mac The MAC layer.
      */
     void SetMac(Ptr<UanMac> mac);
 
     /**
      * Set the Phy layer for this device.
      *
-     * \param phy The PHY layer.
+     * @param phy The PHY layer.
      */
     void SetPhy(Ptr<UanPhy> phy);
 
     /**
      * Attach a channel.
      *
-     * \param channel The channel.
+     * @param channel The channel.
      */
     void SetChannel(Ptr<UanChannel> channel);
 
     /**
      * Get the MAC used by this device.
      *
-     * \return The MAC.
+     * @return The MAC.
      */
     Ptr<UanMac> GetMac() const;
 
     /**
      * Get the Phy used by this device.
      *
-     * \return The Phy.
+     * @return The Phy.
      */
     Ptr<UanPhy> GetPhy() const;
 
     /**
      * Get the transducer associated with this device.
      *
-     * \return The transducer.
+     * @return The transducer.
      */
     Ptr<UanTransducer> GetTransducer() const;
     /**
      * Set the transdcuer used by this device.
      *
-     * \param trans The transducer.
+     * @param trans The transducer.
      */
     void SetTransducer(Ptr<UanTransducer> trans);
 
@@ -108,7 +108,7 @@
     /**
      * Set the Phy SLEEP mode.
      *
-     * \param sleep SLEEP on or off.
+     * @param sleep SLEEP on or off.
      */
     void SetSleepMode(bool sleep);
 
@@ -143,21 +143,21 @@
 
     /**
      * Get the Tx mode index (Modulation type).
-     * \return the Tx mode index
+     * @return the Tx mode index
      */
     uint32_t GetTxModeIndex();
 
     /**
      * Set the Tx mode index (Modulation type).
-     * \param txModeIndex the Tx mode index
+     * @param txModeIndex the Tx mode index
      */
     void SetTxModeIndex(uint32_t txModeIndex);
 
     /**
      * TracedCallback signature for MAC send/receive events.
      *
-     * \param [in] packet The Packet.
-     * \param [in] address The source address.
+     * @param [in] packet The Packet.
+     * @param [in] address The source address.
      */
     typedef void (*RxTxTracedCallback)(Ptr<const Packet> packet, Mac8Address address);
 
@@ -165,13 +165,13 @@
     /**
      * Forward the packet to a higher level, set with SetReceiveCallback.
      *
-     * \param pkt The packet.
-     * \param src The source address.
-     * \param protocolNumber The layer 3 protocol number.
+     * @param pkt The packet.
+     * @param src The source address.
+     * @param protocolNumber The layer 3 protocol number.
      */
     virtual void ForwardUp(Ptr<Packet> pkt, uint16_t protocolNumber, const Mac8Address& src);
 
-    /** \return The channel attached to this device. */
+    /** @return The channel attached to this device. */
     Ptr<UanChannel> DoGetChannel() const;
 
     Ptr<UanTransducer> m_trans; //!< The Transducer attached to this device.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/uan/model/uan-noise-model-default.h ns-3.44/src/uan/model/uan-noise-model-default.h
--- ns-3.43/src/uan/model/uan-noise-model-default.h	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/uan/model/uan-noise-model-default.h	2025-03-09 16:55:49.731372400 -0700
@@ -18,7 +18,7 @@
 {
 
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  * Standard ambient acoustic noise model.
  *
@@ -43,7 +43,7 @@
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/uan/model/uan-noise-model.h ns-3.44/src/uan/model/uan-noise-model.h
--- ns-3.43/src/uan/model/uan-noise-model.h	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/uan/model/uan-noise-model.h	2025-03-09 16:55:49.731372400 -0700
@@ -15,7 +15,7 @@
 {
 
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  * UAN Noise Model base class.
  */
@@ -24,15 +24,15 @@
   public:
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
     /**
      * Compute the noise power at a given frequency.
      *
-     * \param fKhz Frequency in kHz.
-     * \return Noise power in dB re 1uPa/Hz.
+     * @param fKhz Frequency in kHz.
+     * @return Noise power in dB re 1uPa/Hz.
      */
     virtual double GetNoiseDbHz(double fKhz) const = 0;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/uan/model/uan-phy-dual.h ns-3.44/src/uan/model/uan-phy-dual.h
--- ns-3.43/src/uan/model/uan-phy-dual.h	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/uan/model/uan-phy-dual.h	2025-03-09 16:55:49.731372400 -0700
@@ -35,7 +35,7 @@
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
@@ -50,7 +50,7 @@
 }; // class UanPhyCalcSinrDual
 
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  * Two channel Phy.
  *
@@ -74,7 +74,7 @@
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
@@ -87,9 +87,9 @@
     /**
      * Register a UanPhyListener to be notified of common UanPhy events.
      *
-     * \param listener New listener to register.
+     * @param listener New listener to register.
      *
-     * \note You may receive duplicate
+     * @note You may receive duplicate
      * messages as underneath there are two generic phys here.
      * Each will notify of state changes independently.
      */
@@ -124,101 +124,101 @@
 
     void SetSleepMode(bool /* sleep */) override
     {
-        /// \todo This method has to be implemented
+        /// @todo This method has to be implemented
     }
 
     int64_t AssignStreams(int64_t stream) override;
     Ptr<Packet> GetPacketRx() const override;
 
-    /** \copydoc UanPhy::IsStateIdle */
+    /** @copydoc UanPhy::IsStateIdle */
     bool IsPhy1Idle();
-    /** \copydoc UanPhy::IsStateIdle */
+    /** @copydoc UanPhy::IsStateIdle */
     bool IsPhy2Idle();
-    /** \copydoc UanPhy::IsStateRx */
+    /** @copydoc UanPhy::IsStateRx */
     bool IsPhy1Rx();
-    /** \copydoc UanPhy::IsStateRx */
+    /** @copydoc UanPhy::IsStateRx */
     bool IsPhy2Rx();
-    /** \copydoc UanPhy::IsStateTx */
+    /** @copydoc UanPhy::IsStateTx */
     bool IsPhy1Tx();
-    /** \copydoc UanPhy::IsStateTx */
+    /** @copydoc UanPhy::IsStateTx */
     bool IsPhy2Tx();
 
     // Attribute getters and setters
-    /** \copydoc ns3::UanPhy::GetCcaThresholdDb() */
+    /** @copydoc ns3::UanPhy::GetCcaThresholdDb() */
     double GetCcaThresholdPhy1() const;
-    /** \copydoc UanPhy::GetCcaThresholdDb() */
+    /** @copydoc UanPhy::GetCcaThresholdDb() */
     double GetCcaThresholdPhy2() const;
-    /** \copydoc UanPhy::SetCcaThresholdDb */
+    /** @copydoc UanPhy::SetCcaThresholdDb */
     void SetCcaThresholdPhy1(double thresh);
-    /** \copydoc UanPhy::SetCcaThresholdDb */
+    /** @copydoc UanPhy::SetCcaThresholdDb */
     void SetCcaThresholdPhy2(double thresh);
 
-    /** \copydoc UanPhy::GetTxPowerDb */
+    /** @copydoc UanPhy::GetTxPowerDb */
     double GetTxPowerDbPhy1() const;
-    /** \copydoc UanPhy::GetTxPowerDb */
+    /** @copydoc UanPhy::GetTxPowerDb */
     double GetTxPowerDbPhy2() const;
-    /** \copydoc UanPhy::SetTxPowerDb */
+    /** @copydoc UanPhy::SetTxPowerDb */
     void SetTxPowerDbPhy1(double txpwr);
-    /** \copydoc UanPhy::SetTxPowerDb */
+    /** @copydoc UanPhy::SetTxPowerDb */
     void SetTxPowerDbPhy2(double txpwr);
 
     /**
      * Get the list of available modes.
      *
-     * \return The mode list.
+     * @return The mode list.
      */
     UanModesList GetModesPhy1() const;
-    /** \copydoc GetModesPhy1 */
+    /** @copydoc GetModesPhy1 */
     UanModesList GetModesPhy2() const;
 
     /**
      * Set the available modes.
      *
-     * \param modes List of modes.
+     * @param modes List of modes.
      */
     void SetModesPhy1(UanModesList modes);
-    /** \copydoc SetModesPhy1 */
+    /** @copydoc SetModesPhy1 */
     void SetModesPhy2(UanModesList modes);
 
     /**
      * Get the error probability model.
      *
-     * \return The error model.
+     * @return The error model.
      */
     Ptr<UanPhyPer> GetPerModelPhy1() const;
-    /** \copydoc GetPerModelPhy1() */
+    /** @copydoc GetPerModelPhy1() */
     Ptr<UanPhyPer> GetPerModelPhy2() const;
 
     /**
      * Set the error probability model.
      *
-     * \param per The error model.
+     * @param per The error model.
      */
     void SetPerModelPhy1(Ptr<UanPhyPer> per);
-    /** \copydoc SetPerModelPhy1 */
+    /** @copydoc SetPerModelPhy1 */
     void SetPerModelPhy2(Ptr<UanPhyPer> per);
 
     /**
      * Get the SINR calculator.
      *
-     * \return The SINR calculator.
+     * @return The SINR calculator.
      */
     Ptr<UanPhyCalcSinr> GetSinrModelPhy1() const;
-    /** \copydoc GetSinrModelPhy1 */
+    /** @copydoc GetSinrModelPhy1 */
     Ptr<UanPhyCalcSinr> GetSinrModelPhy2() const;
 
     /**
      * Set the SINR calculator.
      *
-     * \param calcSinr The SINR calculator.
+     * @param calcSinr The SINR calculator.
      */
     void SetSinrModelPhy1(Ptr<UanPhyCalcSinr> calcSinr);
-    /** \copydoc SetSinrModelPhy1 */
+    /** @copydoc SetSinrModelPhy1 */
     void SetSinrModelPhy2(Ptr<UanPhyCalcSinr> calcSinr);
 
-    /** \copydoc UanPhy::GetPacketRx */
+    /** @copydoc UanPhy::GetPacketRx */
     Ptr<Packet> GetPhy1PacketRx() const;
-    /** \copydoc UanPhy::GetPacketRx */
+    /** @copydoc UanPhy::GetPacketRx */
     Ptr<Packet> GetPhy2PacketRx() const;
 
   private:
@@ -241,16 +241,16 @@
     /**
      * Handle callback and logger for packets received without error.
      *
-     * \param pkt The packet.
-     * \param sinr The SINR.
-     * \param mode The channel mode.
+     * @param pkt The packet.
+     * @param sinr The SINR.
+     * @param mode The channel mode.
      */
     void RxOkFromSubPhy(Ptr<Packet> pkt, double sinr, UanTxMode mode);
     /**
      * Handle callback and logger for packets received with error.
      *
-     * \param pkt The packet.
-     * \param sinr The SINR.
+     * @param pkt The packet.
+     * @param sinr The SINR.
      */
     void RxErrFromSubPhy(Ptr<Packet> pkt, double sinr);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/uan/model/uan-phy-gen.h ns-3.44/src/uan/model/uan-phy-gen.h
--- ns-3.43/src/uan/model/uan-phy-gen.h	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/uan/model/uan-phy-gen.h	2025-03-09 16:55:49.731372400 -0700
@@ -24,7 +24,7 @@
 {
 
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  * Default Packet Error Rate calculator for UanPhyGen
  *
@@ -41,7 +41,7 @@
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
@@ -53,7 +53,7 @@
 }; // class UanPhyPerGenDefault
 
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  * Packet error rate calculation assuming WHOI Micromodem-like PHY (FH-FSK)
  *
@@ -71,7 +71,7 @@
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
@@ -85,10 +85,10 @@
      * of correcting one bit error.  These equations can be found in
      * the book, Digital Communications, by Proakis (any version I think).
      *
-     * \param pkt Packet which is under consideration.
-     * \param sinrDb SINR at receiver.
-     * \param mode TX mode used to transmit packet.
-     * \return Probability of packet error.
+     * @param pkt Packet which is under consideration.
+     * @param sinrDb SINR at receiver.
+     * @param mode TX mode used to transmit packet.
+     * @return Probability of packet error.
      */
     double CalcPer(Ptr<Packet> pkt, double sinrDb, UanTxMode mode) override;
 
@@ -96,16 +96,16 @@
     /**
      * Binomial coefficient
      *
-     * \param n Pool size.
-     * \param k Number of draws.
-     * \return Binomial coefficient n choose k.
+     * @param n Pool size.
+     * @param k Number of draws.
+     * @return Binomial coefficient n choose k.
      */
     double NChooseK(uint32_t n, uint32_t k);
 
 }; // class UanPhyPerUmodem
 
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  * Packet error rate calculation for common tx modes based on UanPhyPerUmodem
  *
@@ -122,7 +122,7 @@
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
@@ -133,17 +133,17 @@
      * This implementation calculates PER for common UanTxMode modulations,
      * by deriving PER from the BER taken from literature's formulas.
      *
-     * \param pkt Packet which is under consideration.
-     * \param sinrDb SINR at receiver.
-     * \param mode TX mode used to transmit packet.
-     * \return Probability of packet error.
+     * @param pkt Packet which is under consideration.
+     * @param sinrDb SINR at receiver.
+     * @param mode TX mode used to transmit packet.
+     * @return Probability of packet error.
      */
     double CalcPer(Ptr<Packet> pkt, double sinrDb, UanTxMode mode) override;
 
 }; // class UanPhyPerCommonModes
 
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  * Default SINR calculator for UanPhyGen.
  *
@@ -161,7 +161,7 @@
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
@@ -171,14 +171,14 @@
      * This implementation simply adds all arriving signal power
      * and assumes it acts identically to additional noise.
      *
-     * \param pkt Packet to calculate SINR for.
-     * \param arrTime Arrival time of pkt.
-     * \param rxPowerDb The received signal strength of the packet in dB re 1 uPa.
-     * \param ambNoiseDb Ambient channel noise in dB re 1 uPa.
-     * \param mode TX Mode of pkt.
-     * \param pdp  Power delay profile of pkt.
-     * \param arrivalList  List of interfering arrivals given from Transducer.
-     * \return The SINR in dB re 1 uPa.
+     * @param pkt Packet to calculate SINR for.
+     * @param arrTime Arrival time of pkt.
+     * @param rxPowerDb The received signal strength of the packet in dB re 1 uPa.
+     * @param ambNoiseDb Ambient channel noise in dB re 1 uPa.
+     * @param mode TX Mode of pkt.
+     * @param pdp  Power delay profile of pkt.
+     * @param arrivalList  List of interfering arrivals given from Transducer.
+     * @return The SINR in dB re 1 uPa.
      */
     double CalcSinrDb(Ptr<Packet> pkt,
                       Time arrTime,
@@ -191,7 +191,7 @@
 }; // class UanPhyCalcSinrDefault
 
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  * WHOI Micromodem like FH-FSK model.
  *
@@ -219,7 +219,7 @@
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
@@ -237,7 +237,7 @@
 }; // class UanPhyCalcSinrFhFsk
 
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  * Generic PHY model.
  *
@@ -256,13 +256,13 @@
     /**
      * Get the default transmission modes.
      *
-     * \return The default mode list.
+     * @return The default mode list.
      */
     static UanModesList GetDefaultModes();
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
@@ -352,12 +352,12 @@
     /**
      * Calculate the SINR value for a packet.
      *
-     * \param pkt Packet to calculate SINR for.
-     * \param arrTime Arrival time of pkt.
-     * \param rxPowerDb The received signal strength of the packet in dB re 1 uPa.
-     * \param mode TX Mode of pkt.
-     * \param pdp  Power delay profile of pkt.
-     * \return The SINR in dB re 1 uPa.
+     * @param pkt Packet to calculate SINR for.
+     * @param arrTime Arrival time of pkt.
+     * @param rxPowerDb The received signal strength of the packet in dB re 1 uPa.
+     * @param mode TX Mode of pkt.
+     * @param pdp  Power delay profile of pkt.
+     * @return The SINR in dB re 1 uPa.
      */
     double CalculateSinrDb(Ptr<Packet> pkt,
                            Time arrTime,
@@ -372,8 +372,8 @@
      * GetInterferenceDb ( (Ptr<Packet>) 0) to treat all signals as
      * interference, for instance in calculating the CCA busy.
      *
-     * \param pkt The arriving (signal) packet.
-     * \return The total interference power, in dB.
+     * @param pkt The arriving (signal) packet.
+     * @return The total interference power, in dB.
      */
     double GetInterferenceDb(Ptr<Packet> pkt);
     /**
@@ -381,8 +381,8 @@
      *
      *   \f[{\rm{kPa}} = {10^{\frac{{{\rm{dB}}}}{{10}}}}\f]
      *
-     * \param db Signal level in dB.
-     * \return Sound pressure in kPa.
+     * @param db Signal level in dB.
+     * @return Sound pressure in kPa.
      */
     double DbToKp(double db);
     /**
@@ -390,16 +390,16 @@
      *
      *   \f[{\rm{dB}} = 10{\log _{10}}{\rm{kPa}}\f]
      *
-     * \param kp Sound pressure in kPa.
-     * \return Signal level in dB.
+     * @param kp Sound pressure in kPa.
+     * @return Signal level in dB.
      */
     double KpToDb(double kp);
     /**
      * Event to process end of packet reception.
      *
-     * \param pkt The packet.
-     * \param rxPowerDb Received signal power.
-     * \param txMode Transmission mode.
+     * @param pkt The packet.
+     * @param rxPowerDb Received signal power.
+     * @param txMode Transmission mode.
      */
     void RxEndEvent(Ptr<Packet> pkt, double rxPowerDb, UanTxMode txMode);
     /** Event to process end of packet transmission. */
@@ -407,7 +407,7 @@
     /**
      * Update energy source with new state.
      *
-     * \param state The new Phy state.
+     * @param state The new Phy state.
      */
     void UpdatePowerConsumption(const State state);
 
@@ -424,7 +424,7 @@
     /**
      * Call UanListener::NotifyTxStart on all listeners.
      *
-     * \param duration Duration of transmission.
+     * @param duration Duration of transmission.
      */
     void NotifyListenersTxStart(Time duration);
     /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/uan/model/uan-phy.h ns-3.44/src/uan/model/uan-phy.h
--- ns-3.43/src/uan/model/uan-phy.h	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/uan/model/uan-phy.h	2025-03-09 16:55:49.731372400 -0700
@@ -22,7 +22,7 @@
 {
 
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  * Class used for calculating SINR of packet in UanPhy.
  *
@@ -35,14 +35,14 @@
     /**
      * Calculate the SINR value for a packet.
      *
-     * \param pkt Packet to calculate SINR for.
-     * \param arrTime Arrival time of pkt.
-     * \param rxPowerDb The received signal strength of the packet in dB re 1 uPa.
-     * \param ambNoiseDb Ambient channel noise in dB re 1 uPa.
-     * \param mode TX Mode of pkt.
-     * \param pdp  Power delay profile of pkt.
-     * \param arrivalList  List of interfering arrivals given from Transducer.
-     * \return The SINR in dB re 1 uPa.
+     * @param pkt Packet to calculate SINR for.
+     * @param arrTime Arrival time of pkt.
+     * @param rxPowerDb The received signal strength of the packet in dB re 1 uPa.
+     * @param ambNoiseDb Ambient channel noise in dB re 1 uPa.
+     * @param mode TX Mode of pkt.
+     * @param pdp  Power delay profile of pkt.
+     * @param arrivalList  List of interfering arrivals given from Transducer.
+     * @return The SINR in dB re 1 uPa.
      */
     virtual double CalcSinrDb(Ptr<Packet> pkt,
                               Time arrTime,
@@ -53,7 +53,7 @@
                               const UanTransducer::ArrivalList& arrivalList) const = 0;
     /**
      * Register this type.
-     * \return The object TypeId.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
@@ -63,8 +63,8 @@
     /**
      * Convert dB re 1 uPa to kilopascals.
      *
-     * \param db dB value.
-     * \return Value in kilopascals.
+     * @param db dB value.
+     * @return Value in kilopascals.
      */
     inline double DbToKp(double db) const
     {
@@ -74,8 +74,8 @@
     /**
      * Convert kilopascals to dB re 1 uPa.
      *
-     * \param kp Value in kilopascals.
-     * \return Value in dB re 1 uPa
+     * @param kp Value in kilopascals.
+     * @return Value in dB re 1 uPa
      */
     inline double KpToDb(double kp) const
     {
@@ -88,7 +88,7 @@
 }; // class UanPhyCalcSinr
 
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  * Calculate packet error probability, based on received SINR
  * and modulation (mode).
@@ -102,16 +102,16 @@
      * Calculate the packet error probability based on
      * SINR at the receiver and a tx mode.
      *
-     * \param pkt Packet which is under consideration.
-     * \param sinrDb SINR at receiver.
-     * \param mode TX mode used to transmit packet.
-     * \return Probability of packet error.
+     * @param pkt Packet which is under consideration.
+     * @param sinrDb SINR at receiver.
+     * @param mode TX mode used to transmit packet.
+     * @return Probability of packet error.
      */
     virtual double CalcPer(Ptr<Packet> pkt, double sinrDb, UanTxMode mode) = 0;
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
     /** Clear all pointer references. */
@@ -123,7 +123,7 @@
 }; // class UanPhyPer
 
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  * Interface for PHY event listener.
  *
@@ -151,7 +151,7 @@
     /**
      * Called when transmission starts from Phy object.
      *
-     * \param duration Duration of transmission.
+     * @param duration Duration of transmission.
      */
     virtual void NotifyTxStart(Time duration) = 0;
     /** Function called when Phy object finishes transmitting packet */
@@ -159,7 +159,7 @@
 }; // class UanPhyListener
 
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  * Base class for UAN Phy models.
  */
@@ -197,16 +197,16 @@
     /**
      * TracedCallback signature for UanPhy packet send/receive events.
      *
-     * \param [in] pkt The packet.
-     * \param [in] sinr The SINR.
-     * \param [in] mode The channel mode.
+     * @param [in] pkt The packet.
+     * @param [in] sinr The SINR.
+     * @param [in] mode The channel mode.
      */
     typedef void (*TracedCallback)(Ptr<const Packet> pkt, double sinr, UanTxMode mode);
 
     /**
      * Set the DeviceEnergyModel callback for UanPhy device.
      *
-     * \param callback The DeviceEnergyModel change state callback.
+     * @param callback The DeviceEnergyModel change state callback.
      */
     virtual void SetEnergyModelCallback(
         energy::DeviceEnergyModel::ChangeStateCallback callback) = 0;
@@ -221,55 +221,55 @@
     /**
      * Send a packet using a specific transmission mode.
      *
-     * \param pkt  Packet to transmit.
-     * \param modeNum  Index of mode in SupportedModes list to use for transmission.
+     * @param pkt  Packet to transmit.
+     * @param modeNum  Index of mode in SupportedModes list to use for transmission.
      */
     virtual void SendPacket(Ptr<Packet> pkt, uint32_t modeNum) = 0;
 
     /**
      * Register a UanPhyListener to be notified of common UanPhy events.
      *
-     * \param listener New listener to register.
+     * @param listener New listener to register.
      */
     virtual void RegisterListener(UanPhyListener* listener) = 0;
 
     /**
      * Packet arriving from channel:  i.e.  leading bit of packet has arrived.
      *
-     * \param pkt Packet which is arriving.
-     * \param rxPowerDb Signal power of incoming packet in dB re 1 uPa.
-     * \param txMode Transmission mode defining modulation of incoming packet.
-     * \param pdp Power delay profile of incoming packet.
+     * @param pkt Packet which is arriving.
+     * @param rxPowerDb Signal power of incoming packet in dB re 1 uPa.
+     * @param txMode Transmission mode defining modulation of incoming packet.
+     * @param pdp Power delay profile of incoming packet.
      */
     virtual void StartRxPacket(Ptr<Packet> pkt, double rxPowerDb, UanTxMode txMode, UanPdp pdp) = 0;
 
     /**
      * Set the callback to be used when a packet is received without error.
      *
-     * \param cb The callback.
+     * @param cb The callback.
      */
     virtual void SetReceiveOkCallback(RxOkCallback cb) = 0;
 
     /**
      * Set the callback to be used when a packet is received with errors.
      *
-     * \param cb The callback.
+     * @param cb The callback.
      */
     virtual void SetReceiveErrorCallback(RxErrCallback cb) = 0;
 
     /**
      * Set the transmit power.
      *
-     * \param txpwr Final output transmission power, in dB.
+     * @param txpwr Final output transmission power, in dB.
      */
     virtual void SetTxPowerDb(double txpwr) = 0;
 
     /**
      * Set the minimum SINR threshold to receive a packet without errors.
      *
-     * \deprecated See UanPhyPer.
+     * @deprecated See UanPhyPer.
      *
-     * \param thresh Threshold SINR for proper reception in dB re 1 uPa.
+     * @param thresh Threshold SINR for proper reception in dB re 1 uPa.
      */
     // NS_DEPRECATED() - tag for future removal
     virtual void SetRxThresholdDb(double thresh) = 0;
@@ -277,14 +277,14 @@
     /**
      * Set the threshold for detecting channel busy.
      *
-     * \param thresh Signal power threshold at receiver.
+     * @param thresh Signal power threshold at receiver.
      */
     virtual void SetCcaThresholdDb(double thresh) = 0;
 
     /**
      * Get the current transmit power, in dB.
      *
-     * \return The transmit power.
+     * @return The transmit power.
      */
     virtual double GetTxPowerDb() = 0;
 
@@ -292,61 +292,61 @@
      * Get the minimum received signal strength required
      * to receive a packet without errors.
      *
-     * \return The minimum required signal strength, in dB.
+     * @return The minimum required signal strength, in dB.
      */
     virtual double GetRxThresholdDb() = 0;
 
     /**
      * Get the CCA threshold signal strength required to detect channel busy.
      *
-     * \return The CCA threshold signal strength in dB.
+     * @return The CCA threshold signal strength in dB.
      */
     virtual double GetCcaThresholdDb() = 0;
-    /** \return True if Phy is in SLEEP state. */
+    /** @return True if Phy is in SLEEP state. */
     virtual bool IsStateSleep() = 0;
-    /** \return True if Phy is in IDLE state. */
+    /** @return True if Phy is in IDLE state. */
     virtual bool IsStateIdle() = 0;
-    /** \return True if Phy is neither IDLE nor SLEEP. */
+    /** @return True if Phy is neither IDLE nor SLEEP. */
     virtual bool IsStateBusy() = 0;
-    /** \return True if Phy is currently in receive mode. */
+    /** @return True if Phy is currently in receive mode. */
     virtual bool IsStateRx() = 0;
-    /** \return True if Phy is busy transmitting. */
+    /** @return True if Phy is busy transmitting. */
     virtual bool IsStateTx() = 0;
-    /** \return True if Phy is in CCABUSY state. */
+    /** @return True if Phy is in CCABUSY state. */
     virtual bool IsStateCcaBusy() = 0;
 
     /**
      * Get the attached channel.
      *
-     * \return The channel.
+     * @return The channel.
      */
     virtual Ptr<UanChannel> GetChannel() const = 0;
 
     /**
      * Get the device hosting this Phy.
      *
-     * \return The net device.
+     * @return The net device.
      */
     virtual Ptr<UanNetDevice> GetDevice() const = 0;
 
     /**
      * Attach to a channel.
      *
-     * \param channel The channel to attach to.
+     * @param channel The channel to attach to.
      */
     virtual void SetChannel(Ptr<UanChannel> channel) = 0;
 
     /**
      * Set the device hosting this Phy.
      *
-     * \param device The device.
+     * @param device The device.
      */
     virtual void SetDevice(Ptr<UanNetDevice> device) = 0;
 
     /**
      * Set the MAC forwarding messages to this Phy.
      *
-     * \param mac The MAC.
+     * @param mac The MAC.
      */
     virtual void SetMac(Ptr<UanMac> mac) = 0;
 
@@ -354,9 +354,9 @@
      * Called when a transmission is beginning
      * on the attached transducer.
      *
-     * \param packet Packet that is beginning transmission.
-     * \param txPowerDb Transmit power of packet.
-     * \param txMode  Transmission mode of packet.
+     * @param packet Packet that is beginning transmission.
+     * @param txPowerDb Transmit power of packet.
+     * @param txMode  Transmission mode of packet.
      */
     virtual void NotifyTransStartTx(Ptr<Packet> packet, double txPowerDb, UanTxMode txMode) = 0;
 
@@ -370,37 +370,37 @@
     /**
      * Attach a transducer to this Phy.
      *
-     * \param trans The transducer.
+     * @param trans The transducer.
      */
     virtual void SetTransducer(Ptr<UanTransducer> trans) = 0;
 
     /**
      * Get the attached transducer.
      *
-     * \return The transducer.
+     * @return The transducer.
      */
     virtual Ptr<UanTransducer> GetTransducer() = 0;
 
     /**
      * Get the number of transmission modes supported by this Phy.
      *
-     * \return The number modes.
+     * @return The number modes.
      */
     virtual uint32_t GetNModes() = 0;
 
     /**
      * Get a specific transmission mode.
      *
-     * \param n The mode number.
-     * \return The mode.
+     * @param n The mode number.
+     * @return The mode.
      */
     virtual UanTxMode GetMode(uint32_t n) = 0;
 
     /**
      * Get the packet currently being received.
      *
-     * \warning Returns non-valid pointer if IsStateRx == false.
-     * \return The packet.
+     * @warning Returns non-valid pointer if IsStateRx == false.
+     * @return The packet.
      */
     virtual Ptr<Packet> GetPacketRx() const = 0;
 
@@ -410,7 +410,7 @@
     /**
      * Set the Phy SLEEP mode.
      *
-     * \param sleep SLEEP on or off.
+     * @param sleep SLEEP on or off.
      */
     virtual void SetSleepMode(bool sleep) = 0;
 
@@ -420,7 +420,7 @@
      * This fires a PhyTxBegin trace.  Implemented for encapsulation
      * purposes.
      *
-     * \param packet The packet.
+     * @param packet The packet.
      */
     void NotifyTxBegin(Ptr<const Packet> packet);
 
@@ -430,7 +430,7 @@
      * This fires a PhyTxEnd trace.  Implemented for encapsulation
      * purposes.
      *
-     * \param packet The packet.
+     * @param packet The packet.
      */
     void NotifyTxEnd(Ptr<const Packet> packet);
 
@@ -441,7 +441,7 @@
      * This fires a PhyTxDrop trace.  Implemented for encapsulation
      * purposes.
      *
-     * \param packet The packet.
+     * @param packet The packet.
      */
     void NotifyTxDrop(Ptr<const Packet> packet);
 
@@ -451,7 +451,7 @@
      * This fires a PhyRxBegin trace.  Implemented for encapsulation
      * purposes.
      *
-     * \param packet The packet.
+     * @param packet The packet.
      */
     void NotifyRxBegin(Ptr<const Packet> packet);
 
@@ -461,7 +461,7 @@
      * This fires a PhyRxEnd trace.  Implemented for encapsulation
      * purposes.
      *
-     * \param packet The packet.
+     * @param packet The packet.
      */
     void NotifyRxEnd(Ptr<const Packet> packet);
 
@@ -471,7 +471,7 @@
      * This fires a PhyRxDrop trace.  Implemented for encapsulation
      * purposes.
      *
-     * \param packet The packet.
+     * @param packet The packet.
      */
     void NotifyRxDrop(Ptr<const Packet> packet);
 
@@ -480,14 +480,14 @@
      * used by this model.  Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream First stream index to use.
-     * \return The number of stream indices assigned by this model.
+     * @param stream First stream index to use.
+     * @return The number of stream indices assigned by this model.
      */
     virtual int64_t AssignStreams(int64_t stream) = 0;
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
@@ -496,7 +496,7 @@
      * Trace source indicating a packet has begun transmitting
      * over the channel medium.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     ns3::TracedCallback<Ptr<const Packet>> m_phyTxBeginTrace;
 
@@ -504,7 +504,7 @@
      * Trace source indicating a packet has been completely transmitted
      * over the channel.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     ns3::TracedCallback<Ptr<const Packet>> m_phyTxEndTrace;
 
@@ -512,7 +512,7 @@
      * Trace source indicating a packet has been dropped by the device
      * during transmission.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     ns3::TracedCallback<Ptr<const Packet>> m_phyTxDropTrace;
 
@@ -520,7 +520,7 @@
      * Trace source indicating a packet has begun being received
      * from the channel medium by the device.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     ns3::TracedCallback<Ptr<const Packet>> m_phyRxBeginTrace;
 
@@ -528,7 +528,7 @@
      * Trace source indicating a packet has been completely received
      * from the channel medium by the device.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     ns3::TracedCallback<Ptr<const Packet>> m_phyRxEndTrace;
 
@@ -536,7 +536,7 @@
      * Trace source indicating a packet has been dropped by the device
      * during reception.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     ns3::TracedCallback<Ptr<const Packet>> m_phyRxDropTrace;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/uan/model/uan-prop-model.cc ns-3.44/src/uan/model/uan-prop-model.cc
--- ns-3.43/src/uan/model/uan-prop-model.cc	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/uan/model/uan-prop-model.cc	2025-03-09 16:55:49.735372300 -0700
@@ -68,7 +68,7 @@
 
 Tap::Tap()
     : m_amplitude(0.0),
-      m_delay(Seconds(0))
+      m_delay()
 {
 }
 
@@ -104,7 +104,7 @@
     : m_resolution(resolution)
 {
     m_taps.resize(amps.size());
-    Time arrTime = Seconds(0);
+    Time arrTime;
     for (uint32_t index = 0; index < amps.size(); index++)
     {
         m_taps[index] = Tap(arrTime, amps[index]);
@@ -116,7 +116,7 @@
     : m_resolution(resolution)
 {
     m_taps.resize(amps.size());
-    Time arrTime = Seconds(0);
+    Time arrTime;
     for (uint32_t index = 0; index < amps.size(); index++)
     {
         m_taps[index] = Tap(arrTime, amps[index]);
@@ -187,7 +187,7 @@
 std::complex<double>
 UanPdp::SumTapsFromMaxC(Time delay, Time duration) const
 {
-    if (m_resolution <= Seconds(0))
+    if (m_resolution.IsNegative())
     {
         NS_ASSERT_MSG(GetNTaps() == 1,
                       "Attempted to sum taps over time interval in "
@@ -225,7 +225,7 @@
 double
 UanPdp::SumTapsFromMaxNc(Time delay, Time duration) const
 {
-    if (m_resolution <= Seconds(0))
+    if (m_resolution.IsNegative())
     {
         NS_ASSERT_MSG(GetNTaps() == 1,
                       "Attempted to sum taps over time interval in "
@@ -265,13 +265,13 @@
 double
 UanPdp::SumTapsNc(Time begin, Time end) const
 {
-    if (m_resolution <= Seconds(0))
+    if (m_resolution.IsNegative())
     {
         NS_ASSERT_MSG(GetNTaps() == 1,
                       "Attempted to sum taps over time interval in "
                       "UanPdp with resolution 0 and multiple taps");
 
-        if (begin <= Seconds(0.0) && end >= Seconds(0.0))
+        if (begin.IsNegative() && end.IsPositive())
         {
             return std::abs(m_taps[0].GetAmp());
         }
@@ -296,13 +296,13 @@
 std::complex<double>
 UanPdp::SumTapsC(Time begin, Time end) const
 {
-    if (m_resolution <= Seconds(0))
+    if (m_resolution.IsNegative())
     {
         NS_ASSERT_MSG(GetNTaps() == 1,
                       "Attempted to sum taps over time interval in "
                       "UanPdp with resolution 0 and multiple taps");
 
-        if (begin <= Seconds(0.0) && end >= Seconds(0.0))
+        if (begin.IsNegative() && end.IsPositive())
         {
             return m_taps[0].GetAmp();
         }
@@ -330,6 +330,7 @@
 {
     double sumNc = 0.0;
     std::vector<Tap> newTaps;
+    newTaps.reserve(GetNTaps());
 
     for (uint32_t i = 0; i < GetNTaps(); i++)
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/uan/model/uan-prop-model.h ns-3.44/src/uan/model/uan-prop-model.h
--- ns-3.43/src/uan/model/uan-prop-model.h	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/uan/model/uan-prop-model.h	2025-03-09 16:55:49.735372300 -0700
@@ -23,7 +23,7 @@
 class UanTxMode;
 
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  * Holds PDP Tap information (amplitude and delay)
  */
@@ -37,19 +37,19 @@
     /**
      * Constructor
      *
-     * \param delay Time delay (usually from first arrival) of signal
-     * \param amp Complex amplitude of arrival
+     * @param delay Time delay (usually from first arrival) of signal
+     * @param amp Complex amplitude of arrival
      */
     Tap(Time delay, std::complex<double> amp);
     /**
      * Get the complex amplitude of arrival.
      *
-     * \return The amplitude.
+     * @return The amplitude.
      */
     std::complex<double> GetAmp() const;
     /**
      * Get the delay time, usually from first arrival of signal.
-     * \return The time delay.
+     * @return The time delay.
      */
     Time GetDelay() const;
 
@@ -60,7 +60,7 @@
 }; // class Tap
 
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  * The power delay profile returned by propagation models.
  *
@@ -89,22 +89,22 @@
     /**
      * Create PDP object from a vector of Tap objects.
      *
-     * \param taps Taps to include in this PDP.
-     * \param resolution Resolution of PDP object.
+     * @param taps Taps to include in this PDP.
+     * @param resolution Resolution of PDP object.
      */
     UanPdp(std::vector<Tap> taps, Time resolution);
     /**
      * Create PDP object from vector of arrival amplitudes.
      *
-     * \param arrivals  Vector of complex amplitude arrivals.
-     * \param resolution Time duration between arrivals in vector.
+     * @param arrivals  Vector of complex amplitude arrivals.
+     * @param resolution Time duration between arrivals in vector.
      */
     UanPdp(std::vector<std::complex<double>> arrivals, Time resolution);
     /**
      * Create PDP object from real valued arrival amplitudes.
      *
-     * \param arrivals Vector of real valued arrivals.
-     * \param resolution Time duration between arrivals in vector.
+     * @param arrivals Vector of real valued arrivals.
+     * @param resolution Time duration between arrivals in vector.
      */
     UanPdp(std::vector<double> arrivals, Time resolution);
     /** Dummy destructor, see DoDispose. */
@@ -117,51 +117,51 @@
      * The tap vector will be expanded to accommodate the requested
      * index.
      *
-     * \param arrival Complex arrival value.
-     * \param index Index of arrival.
+     * @param arrival Complex arrival value.
+     * @param index Index of arrival.
      */
     void SetTap(std::complex<double> arrival, uint32_t index);
     /**
      * Resize the tap vector.
      *
-     * \param nTaps Number of taps in this PDP
+     * @param nTaps Number of taps in this PDP
      */
     void SetNTaps(uint32_t nTaps);
     /**
      * Set the time duration (resolution) between arrivals.
      *
-     * \param resolution The resolution.
+     * @param resolution The resolution.
      */
     void SetResolution(Time resolution);
     /**
      * Get the beginning of the tap vector.
      *
-     * \return Iterator positioned at first arrival.
+     * @return Iterator positioned at first arrival.
      */
     Iterator GetBegin() const;
     /**
      * Get the end of the tap list (one beyond the last entry).
      *
-     * \return Iterator positioned after last arrival
+     * @return Iterator positioned after last arrival
      */
     Iterator GetEnd() const;
     /**
      * Get the number of taps.
      *
-     * \return Number of taps in PDP.
+     * @return Number of taps in PDP.
      */
     uint32_t GetNTaps() const;
     /**
      * Get the Tap at the specified delay index.
      *
-     * \param i Index number of tap to return (0 based).
-     * \return Tap object at index i.
+     * @param i Index number of tap to return (0 based).
+     * @return Tap object at index i.
      */
     const Tap& GetTap(uint32_t i) const;
     /**
      * Get the delay time resolution (time duration between arrivals).
      *
-     * \return Resolution of PDP.
+     * @return Resolution of PDP.
      */
     Time GetResolution() const;
     /**
@@ -173,9 +173,9 @@
      * ignoring phase difference) all arrivals between a start
      * and end time.
      *
-     * \param begin Time value to begin summing arrivals.
-     * \param end Time value to end summing arrivals.
-     * \return Non-coherent sum of arrivals between two time values.
+     * @param begin Time value to begin summing arrivals.
+     * @param end Time value to end summing arrivals.
+     * @return Non-coherent sum of arrivals between two time values.
      */
     double SumTapsNc(Time begin, Time end) const;
     /**
@@ -187,9 +187,9 @@
      * considering phase difference) all arrivals between a start
      * and end time.
      *
-     * \param begin Time value to begin summing arrivals.
-     * \param end Time value to end summing arrivals.
-     * \return Coherent sum of arrivals between two time values.
+     * @param begin Time value to begin summing arrivals.
+     * @param end Time value to end summing arrivals.
+     * @return Coherent sum of arrivals between two time values.
      */
     std::complex<double> SumTapsC(Time begin, Time end) const;
     /**
@@ -201,9 +201,9 @@
      * ignoring phase difference) all arrivals in a given duration
      * starting the given time after the maximum amplitude arrival received.
      *
-     * \param delay Time duratation after max to begin summing arrivals.
-     * \param duration Time duration to sum arrivals for.
-     * \return Non-coherent sum of arrivals after max in given window.
+     * @param delay Time duratation after max to begin summing arrivals.
+     * @param duration Time duration to sum arrivals for.
+     * @return Non-coherent sum of arrivals after max in given window.
      */
     double SumTapsFromMaxNc(Time delay, Time duration) const;
     /**
@@ -215,21 +215,21 @@
      * considering phase difference) all arrivals in a given duration
      * starting the given time after the maximum amplitude arrival received
      *
-     * \param delay Time duratation after max to begin summing arrivals.
-     * \param duration Time duration to sum arrivals for.
-     * \return Coherent sum of arrivals after max in given window.
+     * @param delay Time duratation after max to begin summing arrivals.
+     * @param duration Time duration to sum arrivals for.
+     * @return Coherent sum of arrivals after max in given window.
      */
     std::complex<double> SumTapsFromMaxC(Time delay, Time duration) const;
     /**
      * Creates a new UanPdp normalized to its non coherent sum.
-     * \see SumTapsNc
-     * \returns the new PDP
+     * @see SumTapsNc
+     * @returns the new PDP
      */
     UanPdp NormalizeToSumNc() const;
     /**
      * Get a unit impulse PDP at time 0.
      *
-     * \return The unit impulse.
+     * @return The unit impulse.
      */
     static UanPdp CreateImpulsePdp();
 
@@ -243,28 +243,28 @@
 }; // class UanPdp
 
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  * Writes PDP to stream as list of arrivals
  *
- * \param os The output stream.
- * \param pdp The PDP.
- * \return The output stream.
+ * @param os The output stream.
+ * @param pdp The PDP.
+ * @return The output stream.
  */
 std::ostream& operator<<(std::ostream& os, const UanPdp& pdp);
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  * Reads in list of arrivals from stream is
  *
- * \param is The input stream.
- * \param pdp The PDP variable to set.
- * \return The input stream.
+ * @param is The input stream.
+ * @param pdp The PDP variable to set.
+ * @return The input stream.
  */
 std::istream& operator>>(std::istream& is, UanPdp& pdp);
 
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  * Base class for implemented underwater propagation models
  */
@@ -273,36 +273,36 @@
   public:
     /**
      * Register this type.
-     * \return The object TypeId.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
     /**
      * Computes pathloss between nodes a and b.
      *
-     * \param a Ptr to mobility model of node a
-     * \param b Ptr to mobility model of node b
-     * \param txMode TX mode of transmission between a and b
-     * \return Pathloss in dB re 1 uPa
+     * @param a Ptr to mobility model of node a
+     * @param b Ptr to mobility model of node b
+     * @param txMode TX mode of transmission between a and b
+     * @return Pathloss in dB re 1 uPa
      */
     virtual double GetPathLossDb(Ptr<MobilityModel> a, Ptr<MobilityModel> b, UanTxMode txMode) = 0;
 
     /**
      * Get the PDP for the path between two nodes.
      *
-     * \param a Ptr to mobility model of node a.
-     * \param b Ptr to mobility model of node b.
-     * \param mode TX mode of transmission from a to b.
-     * \return PDP for link between nodes a and b.
+     * @param a Ptr to mobility model of node a.
+     * @param b Ptr to mobility model of node b.
+     * @param mode TX mode of transmission from a to b.
+     * @return PDP for link between nodes a and b.
      */
     virtual UanPdp GetPdp(Ptr<MobilityModel> a, Ptr<MobilityModel> b, UanTxMode mode) = 0;
     /**
      * Finds propagation delay between nodes a and b.
      *
-     * \param a Ptr to mobility model of node a.
-     * \param b Ptr to mobility model of node b.
-     * \param mode TX mode of transmission.
-     * \return Propagation delay.
+     * @param a Ptr to mobility model of node a.
+     * @param b Ptr to mobility model of node b.
+     * @param mode TX mode of transmission.
+     * @return Propagation delay.
      */
     virtual Time GetDelay(Ptr<MobilityModel> a, Ptr<MobilityModel> b, UanTxMode mode) = 0;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/uan/model/uan-prop-model-ideal.h ns-3.44/src/uan/model/uan-prop-model-ideal.h
--- ns-3.43/src/uan/model/uan-prop-model-ideal.h	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/uan/model/uan-prop-model-ideal.h	2025-03-09 16:55:49.731372400 -0700
@@ -18,7 +18,7 @@
 {
 
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  * Ideal propagation model (no pathloss, impulse PDP).
  */
@@ -32,7 +32,7 @@
 
     /**
      * Register this type.
-     * \return The object TypeId.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/uan/model/uan-prop-model-thorp.h ns-3.44/src/uan/model/uan-prop-model-thorp.h
--- ns-3.43/src/uan/model/uan-prop-model-thorp.h	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/uan/model/uan-prop-model-thorp.h	2025-03-09 16:55:49.735372300 -0700
@@ -17,7 +17,7 @@
 class UanTxMode;
 
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  * Uses Thorp's approximation to compute pathloss.  Assumes implulse PDP.
  */
@@ -31,7 +31,7 @@
 
     /**
      * Register this type.
-     * \return The object TypeId.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
@@ -43,14 +43,14 @@
   private:
     /**
      * Get the attenuation in dB / 1000 yards.
-     * \param freqKhz The channel center frequency, in kHz.
-     * \return The attenuation, in dB / 1000 yards.
+     * @param freqKhz The channel center frequency, in kHz.
+     * @return The attenuation, in dB / 1000 yards.
      */
     double GetAttenDbKyd(double freqKhz);
     /**
      * Get the attenuation in dB / km.
-     * \param freqKhz The channel center frequency, in kHz.
-     * \return The attenuation, in dB/km.
+     * @param freqKhz The channel center frequency, in kHz.
+     * @return The attenuation, in dB/km.
      */
     double GetAttenDbKm(double freqKhz);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/uan/model/uan-transducer.h ns-3.44/src/uan/model/uan-transducer.h
--- ns-3.43/src/uan/model/uan-transducer.h	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/uan/model/uan-transducer.h	2025-03-09 16:55:49.755372500 -0700
@@ -24,7 +24,7 @@
 class UanChannel;
 
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  * Class consisting of packet arrival information (Time, RxPower, mode, PDP).
  */
@@ -39,11 +39,11 @@
     /**
      * Constructor.
      *
-     * \param packet Packet arriving.
-     * \param rxPowerDb RX signal power in dB of arriving packet.
-     * \param txMode TX mode of arriving packet.
-     * \param pdp Power delay profile of arriving packet.
-     * \param arrTime Arrival time of packet.
+     * @param packet Packet arriving.
+     * @param rxPowerDb RX signal power in dB of arriving packet.
+     * @param txMode TX mode of arriving packet.
+     * @param pdp Power delay profile of arriving packet.
+     * @param arrTime Arrival time of packet.
      */
     UanPacketArrival(Ptr<Packet> packet,
                      double rxPowerDb,
@@ -67,7 +67,7 @@
     /**
      * Get the arriving packet.
      *
-     * \return Pointer to packet.
+     * @return Pointer to packet.
      */
     inline Ptr<Packet> GetPacket() const
     {
@@ -77,7 +77,7 @@
     /**
      * Get the received signal strength.
      *
-     * \return Received signal strength in dB re 1uPa
+     * @return Received signal strength in dB re 1uPa
      */
     inline double GetRxPowerDb() const
     {
@@ -87,7 +87,7 @@
     /**
      * Get the transmission mode of the packet.
      *
-     * \return UanTxMode.
+     * @return UanTxMode.
      */
     inline const UanTxMode& GetTxMode() const
     {
@@ -97,7 +97,7 @@
     /**
      * Get the packet arrival time.
      *
-     * \return Arrival time.
+     * @return Arrival time.
      */
     inline Time GetArrivalTime() const
     {
@@ -107,7 +107,7 @@
     /**
      * Get the propagation delay profile.
      *
-     * \return PDP of arriving signal.
+     * @return PDP of arriving signal.
      */
     inline UanPdp GetPdp() const
     {
@@ -124,7 +124,7 @@
 }; // class UanPacketArrival
 
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  * Virtual base for Transducer objects.
  *
@@ -137,7 +137,7 @@
   public:
     /**
      * Register this type.
-     * \return The object TypeId.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
@@ -156,65 +156,65 @@
     /**
      * Get the transducer state.
      *
-     * \return State (TX or RX) of this transducer.
+     * @return State (TX or RX) of this transducer.
      */
     virtual State GetState() const = 0;
 
     /**
      * Is the state receiving (or available for reception)?
      *
-     * \return True if this transducer is available for receiving
+     * @return True if this transducer is available for receiving
      *   an incoming packet.
      */
     virtual bool IsRx() const = 0;
     /**
      * Is the state transmitting?
      *
-     * \return True if there is a packet being transmitted from this transducer.
+     * @return True if there is a packet being transmitted from this transducer.
      */
     virtual bool IsTx() const = 0;
     /**
      * Get the list of overlapped (in time) packets at this transducer.
      *
-     * \return List of all packets currently crossing this node in the water.
+     * @return List of all packets currently crossing this node in the water.
      */
     virtual const ArrivalList& GetArrivalList() const = 0;
     /**
      * Set the receiver gain.
      *
-     * \param gainDb Gain added at receiver, in dB.
+     * @param gainDb Gain added at receiver, in dB.
      */
     virtual void SetRxGainDb(double gainDb) = 0;
     /**
      * Get the receiver gain added to signal at receiver in dB.
      *
-     * \return The gain (in dB).
+     * @return The gain (in dB).
      */
     virtual double GetRxGainDb() = 0;
     /**
      * Apply receiver gain in dB to the received power.
-     * \param rxPowerDb Signal power in dB of arriving packet.
-     * \param mode Mode arriving packet is using.
+     * @param rxPowerDb Signal power in dB of arriving packet.
+     * @param mode Mode arriving packet is using.
      *
-     * \return Updated receive power (in dB) with gain applied.
+     * @return Updated receive power (in dB) with gain applied.
      */
     virtual double ApplyRxGainDb(double rxPowerDb, UanTxMode mode) = 0;
     /**
      * Notify this object that a new packet has arrived at this nodes location
      *
-     * \param packet Packet arriving.
-     * \param rxPowerDb Signal power in dB of arriving packet.
-     * \param txMode Mode arriving packet is using.
-     * \param pdp PDP of arriving signal.
+     * @param packet Packet arriving.
+     * @param rxPowerDb Signal power in dB of arriving packet.
+     * @param txMode Mode arriving packet is using.
+     * @param pdp PDP of arriving signal.
      */
     virtual void Receive(Ptr<Packet> packet, double rxPowerDb, UanTxMode txMode, UanPdp pdp) = 0;
     /**
      * Transmit a packet from this transducer.
      *
-     * \param src Source PHY.
-     * \param packet Packet to transmit.
-     * \param txPowerDb Outgoing Tx power of packet.
-     * \param txMode Mode to transmit packet with.
+     * @param src Source PHY.
+     * @param packet Packet to transmit.
+     * @param txPowerDb Outgoing Tx power of packet.
+     * @param txMode Mode to transmit packet with.
      */
     virtual void Transmit(Ptr<UanPhy> src,
                           Ptr<Packet> packet,
@@ -223,13 +223,13 @@
     /**
      * Attach this transducer to a channel.
      *
-     * \param chan The channel
+     * @param chan The channel
      */
     virtual void SetChannel(Ptr<UanChannel> chan) = 0;
     /**
      * Get the attached channel.
      *
-     * \return The channel.
+     * @return The channel.
      */
     virtual Ptr<UanChannel> GetChannel() const = 0;
     /**
@@ -237,13 +237,13 @@
      *
      * More than one physical layer may be attached.
      *
-     * \param phy The physical layer.
+     * @param phy The physical layer.
      */
     virtual void AddPhy(Ptr<UanPhy> phy) = 0;
     /**
      * Get the list of physical layer above this transducer.
      *
-     * \return List of attached physical layers.
+     * @return List of attached physical layers.
      */
     virtual const UanPhyList& GetPhyList() const = 0;
     /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/uan/model/uan-transducer-hd.cc ns-3.44/src/uan/model/uan-transducer-hd.cc
--- ns-3.43/src/uan/model/uan-transducer-hd.cc	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/uan/model/uan-transducer-hd.cc	2025-03-09 16:55:49.751372600 -0700
@@ -27,7 +27,7 @@
 UanTransducerHd::UanTransducerHd()
     : UanTransducer(),
       m_state(RX),
-      m_endTxTime(Seconds(0)),
+      m_endTxTime(),
       m_cleared(false),
       m_rxGainDb(0)
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/uan/model/uan-transducer-hd.h ns-3.44/src/uan/model/uan-transducer-hd.h
--- ns-3.43/src/uan/model/uan-transducer-hd.h	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/uan/model/uan-transducer-hd.h	2025-03-09 16:55:49.751372600 -0700
@@ -17,7 +17,7 @@
 {
 
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  * Half duplex implementation of transducer object
  *
@@ -34,7 +34,7 @@
 
     /**
      * Register this type.
-     * \return The object TypeId.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
 
@@ -57,7 +57,7 @@
   private:
     State m_state;             //!< Transducer state.
     ArrivalList m_arrivalList; //!< List of arriving packets which overlap in time.
-    UanPhyList m_phyList;      //!< List of physical layers attached above this tranducer.
+    UanPhyList m_phyList;      //!< List of physical layers attached above this transducer.
     Ptr<UanChannel> m_channel; //!< The attached channel.
     EventId m_endTxEvent;      //!< Event scheduled for end of transmission.
     Time m_endTxTime;          //!< Time at which transmission will be completed.
@@ -67,7 +67,7 @@
     /**
      * Remove an entry from the arrival list.
      *
-     * \param arrival The packet arrival to remove.
+     * @param arrival The packet arrival to remove.
      */
     void RemoveArrival(UanPacketArrival arrival);
     /** Handle end of transmission event. */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/uan/model/uan-tx-mode.h ns-3.44/src/uan/model/uan-tx-mode.h
--- ns-3.43/src/uan/model/uan-tx-mode.h	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/uan/model/uan-tx-mode.h	2025-03-09 16:55:49.755372500 -0700
@@ -20,7 +20,7 @@
 class UanTxMode;
 
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  * Abstraction of packet modulation information.
  *
@@ -48,49 +48,49 @@
     /**
      * Get the modulation type of the mode.
      *
-     * \return The modulation type.
+     * @return The modulation type.
      */
     ModulationType GetModType() const;
     /**
      * Get the data rate of the transmit mode.
      *
-     * \return Data rate of the TX mode, in bits per second.
+     * @return Data rate of the TX mode, in bits per second.
      */
     uint32_t GetDataRateBps() const;
     /**
      * Get the physical signaling rate.
      *
-     * \return PHY rate in symbols per second.
+     * @return PHY rate in symbols per second.
      */
     uint32_t GetPhyRateSps() const;
     /**
      * Get the transmission center frequency.
      *
-     * \return Center frequency, in Hz.
+     * @return Center frequency, in Hz.
      */
     uint32_t GetCenterFreqHz() const;
     /**
      * Get the transmission signal bandwidth.
      *
-     * \return Bandwidth in Hz.
+     * @return Bandwidth in Hz.
      */
     uint32_t GetBandwidthHz() const;
     /**
      * Get the number of constellation points in the modulation scheme.
      *
-     * \return Number of constellation points.
+     * @return Number of constellation points.
      */
     uint32_t GetConstellationSize() const;
     /**
      * Get the mode name.
      *
-     * \return Name
+     * @return Name
      */
     std::string GetName() const;
     /**
      * Get a unique id for the mode.
      *
-     * \return Unique ID.
+     * @return Unique ID.
      */
     uint32_t GetUid() const;
 
@@ -106,22 +106,22 @@
 /**
  * Writes tx mode entry to stream os.
  *
- * \param os The output stream.
- * \param mode The mode.
- * \return The stream.
+ * @param os The output stream.
+ * @param mode The mode.
+ * @return The stream.
  */
 std::ostream& operator<<(std::ostream& os, const UanTxMode& mode);
 /**
  * Reads tx mode entry from stream is
  *
- * \param is The input stream.
- * \param mode The mode.
- * \return The stream.
+ * @param is The input stream.
+ * @param mode The mode.
+ * @return The stream.
  */
 std::istream& operator>>(std::istream& is, UanTxMode& mode);
 
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  * Global database of UanTxMode objects, retrievable by id or name.
  */
@@ -133,15 +133,15 @@
 
     /**
      *
-     * \param type Modulation type.
-     * \param dataRateBps Data rate in BPS.
-     * \param phyRateSps  Symbol rate in symbols per second.
-     * \param cfHz Center frequency in Hz.
-     * \param bwHz Bandwidth in Hz.
-     * \param constSize Modulation constellation size (2 for BPSK, 4 for QPSK).
-     * \param name Unique string name for this transmission mode.
+     * @param type Modulation type.
+     * @param dataRateBps Data rate in BPS.
+     * @param phyRateSps  Symbol rate in symbols per second.
+     * @param cfHz Center frequency in Hz.
+     * @param bwHz Bandwidth in Hz.
+     * @param constSize Modulation constellation size (2 for BPSK, 4 for QPSK).
+     * @param name Unique string name for this transmission mode.
      *
-     * \return the transmit mode object
+     * @return the transmit mode object
      */
     static UanTxMode CreateMode(UanTxMode::ModulationType type,
                                 uint32_t dataRateBps,
@@ -154,15 +154,15 @@
     /**
      * Get a mode by name.
      *
-     * \param name String name of mode.
-     * \return Mode with given name.
+     * @param name String name of mode.
+     * @return Mode with given name.
      */
     static UanTxMode GetMode(std::string name);
     /**
      * Get a mode by id.
      *
-     * \param uid Unique ID of mode.
-     * \return The mode with given uid.
+     * @param uid Unique ID of mode.
+     * @return The mode with given uid.
      */
     static UanTxMode GetMode(uint32_t uid);
 
@@ -171,7 +171,7 @@
     uint32_t m_nextUid; //!< next id number
 
     /**
-     * \ingroup uan
+     * @ingroup uan
      * Container for the UanTxMode properties.
      */
     struct UanTxModeItem
@@ -189,7 +189,7 @@
     /**
      * Container for modes
      *
-     * \internal
+     * @internal
      *   Accessed internally by uid and name, so a multimap might be more
      *   appropriate.  If name accesses are predominant, perhaps a map
      *   indexed by name, with a find for uid.  If accesses by uid dominate
@@ -200,49 +200,49 @@
     /**
      * Check if the mode \pname{name} already exists.
      *
-     * \param name The mode name to test.
-     * \return True if \pname{name} exists.
+     * @param name The mode name to test.
+     * @return True if \pname{name} exists.
      */
     bool NameUsed(std::string name);
 
     /**
      * Construct and get the static global factory instance.
      *
-     * \return The global instance.
+     * @return The global instance.
      */
     static UanTxModeFactory& GetFactory();
 
     /**
      * Get a mode by id.
      *
-     * \param uid The unique id to find.
-     * \return The corresponding mode.
+     * @param uid The unique id to find.
+     * @return The corresponding mode.
      */
     UanTxModeItem& GetModeItem(uint32_t uid);
 
     /**
      * Get a mode by name.
-     * \param name The mode name to find.
-     * \return The corresponding mode.
+     * @param name The mode name to find.
+     * @return The corresponding mode.
      */
     UanTxModeItem& GetModeItem(std::string name);
 
     /**
      * Create a public UanTxMode from an internal UanTxModeItem.
      *
-     * \param item The UanTxModeItem to reference.
-     * \return A public UanTxMode.
+     * @param item The UanTxModeItem to reference.
+     * @return A public UanTxMode.
      */
     UanTxMode MakeModeFromItem(const UanTxModeItem& item);
 
 }; // class UanTxModeFactory
 
 /**
- * \ingroup uan
+ * @ingroup uan
  *
  * Container for UanTxModes.
  *
- * \see attribute_UanModesList
+ * @see attribute_UanModesList
  */
 class UanModesList
 {
@@ -252,25 +252,25 @@
 
     /**
      * Add mode to this list.
-     * \param mode The mode to add.
+     * @param mode The mode to add.
      */
     void AppendMode(UanTxMode mode);
     /**
      * Delete the mode at given index.
-     * \param num Index of mode to delete.
+     * @param num Index of mode to delete.
      */
     void DeleteMode(uint32_t num);
     /**
      * Retrieve a mode by index.
      *
-     * \param index Mode index.
-     * \return Mode at given index.
+     * @param index Mode index.
+     * @return Mode at given index.
      */
     UanTxMode operator[](uint32_t index) const;
     /**
      * Get the number of modes in this list.
      *
-     * \return Number of modes.
+     * @return Number of modes.
      */
     uint32_t GetNModes() const;
 
@@ -286,17 +286,17 @@
 /**
  * Write UanModesList to stream os
  *
- * \param os The output stream.
- * \param ml The mode list.
- * \return The stream.
+ * @param os The output stream.
+ * @param ml The mode list.
+ * @return The stream.
  */
 std::ostream& operator<<(std::ostream& os, const UanModesList& ml);
 /**
  * Read UanModesList from stream is.
  *
- * \param is The input stream.
- * \param ml The mode list to fill.
- * \return The stream.
+ * @param is The input stream.
+ * @param ml The mode list to fill.
+ * @return The stream.
  */
 std::istream& operator>>(std::istream& is, UanModesList& ml);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/uan/test/uan-energy-model-test.cc ns-3.44/src/uan/test/uan-energy-model-test.cc
--- ns-3.43/src/uan/test/uan-energy-model-test.cc	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/uan/test/uan-energy-model-test.cc	2025-03-09 16:55:49.755372500 -0700
@@ -30,15 +30,15 @@
 NS_LOG_COMPONENT_DEFINE("UanEnergyModelTestSuite");
 
 /**
- * \ingroup uan
- * \defgroup uan-test uan module tests
+ * @ingroup uan
+ * @defgroup uan-test uan module tests
  */
 
 /**
- * \ingroup uan-test
- * \ingroup tests
+ * @ingroup uan-test
+ * @ingroup tests
  *
- * \brief Acoustic Modem Energy Test Case
+ * @brief Acoustic Modem Energy Test Case
  */
 class AcousticModemEnergyTestCase : public TestCase
 {
@@ -48,16 +48,16 @@
 
     /**
      * Receive packet function
-     * \param dev the device
-     * \param pkt the packet
-     * \param mode the mode
-     * \param sender the address of the sender
-     * \returns true if successful
+     * @param dev the device
+     * @param pkt the packet
+     * @param mode the mode
+     * @param sender the address of the sender
+     * @returns true if successful
      */
     bool RxPacket(Ptr<NetDevice> dev, Ptr<const Packet> pkt, uint16_t mode, const Address& sender);
     /**
      * Send one packet function
-     * \param node the node to send to
+     * @param node the node to send to
      */
     void SendOnePacket(Ptr<Node> node);
 
@@ -201,10 +201,10 @@
 }
 
 /**
- * \ingroup uan-test
- * \ingroup tests
+ * @ingroup uan-test
+ * @ingroup tests
  *
- * \brief Acoustic Modem Energy Depletion Test Case
+ * @brief Acoustic Modem Energy Depletion Test Case
  */
 class AcousticModemEnergyDepletionTestCase : public TestCase
 {
@@ -216,7 +216,7 @@
     void DepletionHandler();
     /**
      * Send one packet function
-     * \param node the node to send to
+     * @param node the node to send to
      */
     void SendOnePacket(Ptr<Node> node);
 
@@ -311,10 +311,10 @@
 // -------------------------------------------------------------------------- //
 
 /**
- * \ingroup uan-test
- * \ingroup tests
+ * @ingroup uan-test
+ * @ingroup tests
  *
- * \brief Unit test suite for underwater energy model. Include test on acoustic modem,
+ * @brief Unit test suite for underwater energy model. Include test on acoustic modem,
  * acoustic modem energy depletion.
  */
 class UanEnergyModelTestSuite : public TestSuite
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/uan/test/uan-test.cc ns-3.44/src/uan/test/uan-test.cc
--- ns-3.43/src/uan/test/uan-test.cc	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/uan/test/uan-test.cc	2025-03-09 16:55:49.755372500 -0700
@@ -23,10 +23,10 @@
 using namespace ns3;
 
 /**
- * \ingroup uan-test
- * \ingroup tests
+ * @ingroup uan-test
+ * @ingroup tests
  *
- * \brief Uan Test
+ * @brief Uan Test
  */
 class UanTest : public TestCase
 {
@@ -38,26 +38,26 @@
   private:
     /**
      * Create node function
-     * \param pos the position of the device
-     * \param chan the communication channel
-     * \returns the UAN device
+     * @param pos the position of the device
+     * @param chan the communication channel
+     * @returns the UAN device
      */
     Ptr<UanNetDevice> CreateNode(Vector pos, Ptr<UanChannel> chan);
     /**
      * Phy test function
-     * \returns true if successful
+     * @returns true if successful
      */
     bool DoPhyTests();
     /**
      * Do one Phy test function
-     * \param t1 the time to send first packet
-     * \param t2 the time to send the second packet
-     * \param r1 first distance constant
-     * \param r2 second distance constant
-     * \param prop the propagation model
-     * \param mode1 the send mode for device 1
-     * \param mode2 the send mode for device 2
-     * \returns number of bytes received
+     * @param t1 the time to send first packet
+     * @param t2 the time to send the second packet
+     * @param r1 first distance constant
+     * @param r2 second distance constant
+     * @param prop the propagation model
+     * @param mode1 the send mode for device 1
+     * @param mode2 the send mode for device 2
+     * @returns number of bytes received
      */
     uint32_t DoOnePhyTest(Time t1,
                           Time t2,
@@ -68,17 +68,17 @@
                           uint16_t mode2 = 0);
     /**
      * Receive packet function
-     * \param dev the device
-     * \param pkt the packet
-     * \param mode the receive mode
-     * \param sender the address of the sender
-     * \returns true if successful
+     * @param dev the device
+     * @param pkt the packet
+     * @param mode the receive mode
+     * @param sender the address of the sender
+     * @returns true if successful
      */
     bool RxPacket(Ptr<NetDevice> dev, Ptr<const Packet> pkt, uint16_t mode, const Address& sender);
     /**
      * Send one packet function
-     * \param dev the device
-     * \param mode the transmit mode
+     * @param dev the device
+     * @param mode the transmit mode
      */
     void SendOnePacket(Ptr<UanNetDevice> dev, uint16_t mode);
     ObjectFactory m_phyFac; ///< Phy
@@ -154,7 +154,7 @@
     Simulator::Schedule(txTime2, &UanTest::SendOnePacket, this, dev2, mode2);
 
     m_bytesRx = 0;
-    Simulator::Stop(Seconds(20.0));
+    Simulator::Stop(Seconds(20));
     Simulator::Run();
     Simulator::Destroy();
 
@@ -179,12 +179,12 @@
     Ptr<UanPropModelIdeal> prop = CreateObject<UanPropModelIdeal>();
 
     // No collision (Get 2 packets)
-    NS_TEST_ASSERT_MSG_EQ_RETURNS_BOOL(DoOnePhyTest(Seconds(1.0), Seconds(3.001), 50, 50, prop),
+    NS_TEST_ASSERT_MSG_EQ_RETURNS_BOOL(DoOnePhyTest(Seconds(1), Seconds(3.001), 50, 50, prop),
                                        34,
                                        "Should have received 34 bytes from 2 disjoint packets");
 
     // Collision (Lose both packets)
-    NS_TEST_ASSERT_MSG_EQ_RETURNS_BOOL(DoOnePhyTest(Seconds(1.0), Seconds(2.99), 50, 50, prop),
+    NS_TEST_ASSERT_MSG_EQ_RETURNS_BOOL(DoOnePhyTest(Seconds(1), Seconds(2.99), 50, 50, prop),
                                        0,
                                        "Expected collision resulting in loss of both packets");
 
@@ -200,18 +200,18 @@
 #endif // UAN_PROP_BH_INSTALLED
 
     //  No collision (Get 2 packets)
-    NS_TEST_ASSERT_MSG_EQ_RETURNS_BOOL(DoOnePhyTest(Seconds(1.0), Seconds(3.001), 50, 50, prop),
+    NS_TEST_ASSERT_MSG_EQ_RETURNS_BOOL(DoOnePhyTest(Seconds(1), Seconds(3.001), 50, 50, prop),
                                        34,
                                        "Should have received 34 bytes from 2 disjoint packets");
 
     // Should correctly receive first arriving packet
-    NS_TEST_ASSERT_MSG_EQ_RETURNS_BOOL(DoOnePhyTest(Seconds(1.0), Seconds(1.0126), 50, 50, prop),
+    NS_TEST_ASSERT_MSG_EQ_RETURNS_BOOL(DoOnePhyTest(Seconds(1), Seconds(1.0126), 50, 50, prop),
                                        17,
                                        "Should have received 17 bytes from first arriving packet");
 
     // Packets should collide and both be lost
     NS_TEST_ASSERT_MSG_EQ_RETURNS_BOOL(
-        DoOnePhyTest(Seconds(1.0), Seconds(1.0 + 7.01 * (13.0 / 80.0)), 50, 50, prop),
+        DoOnePhyTest(Seconds(1), Seconds(1.0 + 7.01 * (13.0 / 80.0)), 50, 50, prop),
         0,
         "Packets should collide, but received data");
 
@@ -244,29 +244,25 @@
     m_phyFac.Set("SupportedModesPhy2", UanModesListValue(m1));
 
     // No collision (Get 2 packets)
-    NS_TEST_ASSERT_MSG_EQ_RETURNS_BOOL(DoOnePhyTest(Seconds(1.0), Seconds(3.01), 50, 50, prop),
+    NS_TEST_ASSERT_MSG_EQ_RETURNS_BOOL(DoOnePhyTest(Seconds(1), Seconds(3.01), 50, 50, prop),
                                        34,
                                        "Expected no collision");
 
-    NS_TEST_ASSERT_MSG_EQ_RETURNS_BOOL(
-        DoOnePhyTest(Seconds(1.0), Seconds(2.99), 50, 50, prop, 0, 0),
-        0,
-        "Expected collision with both packets lost");
+    NS_TEST_ASSERT_MSG_EQ_RETURNS_BOOL(DoOnePhyTest(Seconds(1), Seconds(2.99), 50, 50, prop, 0, 0),
+                                       0,
+                                       "Expected collision with both packets lost");
 
-    NS_TEST_ASSERT_MSG_EQ_RETURNS_BOOL(
-        DoOnePhyTest(Seconds(1.0), Seconds(2.99), 50, 50, prop, 0, 2),
-        17,
-        "Expected collision with only one packets lost");
+    NS_TEST_ASSERT_MSG_EQ_RETURNS_BOOL(DoOnePhyTest(Seconds(1), Seconds(2.99), 50, 50, prop, 0, 2),
+                                       17,
+                                       "Expected collision with only one packets lost");
 
-    NS_TEST_ASSERT_MSG_EQ_RETURNS_BOOL(
-        DoOnePhyTest(Seconds(1.0), Seconds(2.99), 50, 50, prop, 0, 5),
-        34,
-        "Expected no collision");
+    NS_TEST_ASSERT_MSG_EQ_RETURNS_BOOL(DoOnePhyTest(Seconds(1), Seconds(2.99), 50, 50, prop, 0, 5),
+                                       34,
+                                       "Expected no collision");
 
-    NS_TEST_ASSERT_MSG_EQ_RETURNS_BOOL(
-        DoOnePhyTest(Seconds(1.0), Seconds(2.99), 50, 50, prop, 2, 3),
-        34,
-        "Expected no collision");
+    NS_TEST_ASSERT_MSG_EQ_RETURNS_BOOL(DoOnePhyTest(Seconds(1), Seconds(2.99), 50, 50, prop, 2, 3),
+                                       34,
+                                       "Expected no collision");
 
     return false;
 }
@@ -300,10 +296,10 @@
 }
 
 /**
- * \ingroup uan-test
- * \ingroup tests
+ * @ingroup uan-test
+ * @ingroup tests
  *
- * \brief UanModesList Test
+ * @brief UanModesList Test
  */
 class UanModesListTest : public TestCase
 {
@@ -385,10 +381,10 @@
 }
 
 /**
- * \ingroup uan-test
- * \ingroup tests
+ * @ingroup uan-test
+ * @ingroup tests
  *
- * \brief Uan Test Suite
+ * @brief Uan Test Suite
  */
 class UanTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/virtual-net-device/examples/virtual-net-device-example.cc ns-3.44/src/virtual-net-device/examples/virtual-net-device-example.cc
--- ns-3.43/src/virtual-net-device/examples/virtual-net-device-example.cc	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/virtual-net-device/examples/virtual-net-device-example.cc	2025-03-09 16:55:49.755372500 -0700
@@ -47,7 +47,7 @@
 NS_LOG_COMPONENT_DEFINE("VirtualNetDeviceExample");
 
 /**
- * \ingroup virtual-net-device
+ * @ingroup virtual-net-device
  *
  * Tunnel class - its goal is to create and manage the tunnels between endpoints.
  */
@@ -66,11 +66,11 @@
 
     /**
      * Send a packet through the N0 VirtualNetDevice
-     * \param packet Packet to send
-     * \param source Source IPv4 address
-     * \param dest Destination IPv4 address
-     * \param protocolNumber Protocol number
-     * \return true (always)
+     * @param packet Packet to send
+     * @param source Source IPv4 address
+     * @param dest Destination IPv4 address
+     * @param protocolNumber Protocol number
+     * @return true (always)
      */
     bool N0VirtualSend(Ptr<Packet> packet,
                        const Address& source,
@@ -84,11 +84,11 @@
 
     /**
      * Send a packet through the N1 VirtualNetDevice
-     * \param packet Packet to send
-     * \param source Source IPv4 address
-     * \param dest Destination IPv4 address
-     * \param protocolNumber Protocol number
-     * \return true (always)
+     * @param packet Packet to send
+     * @param source Source IPv4 address
+     * @param dest Destination IPv4 address
+     * @param protocolNumber Protocol number
+     * @return true (always)
      */
     bool N1VirtualSend(Ptr<Packet> packet,
                        const Address& source,
@@ -102,11 +102,11 @@
 
     /**
      * Send a packet through the N3 VirtualNetDevice
-     * \param packet Packet to send
-     * \param source Source IPv4 address
-     * \param dest Destination IPv4 address
-     * \param protocolNumber Protocol number
-     * \return true (always)
+     * @param packet Packet to send
+     * @param source Source IPv4 address
+     * @param dest Destination IPv4 address
+     * @param protocolNumber Protocol number
+     * @return true (always)
      */
     bool N3VirtualSend(Ptr<Packet> packet,
                        const Address& source,
@@ -128,7 +128,7 @@
 
     /**
      * Receive a packet on the N3 VirtualNetDevice
-     * \param socket Receiving socket
+     * @param socket Receiving socket
      */
     void N3SocketRecv(Ptr<Socket> socket)
     {
@@ -143,7 +143,7 @@
 
     /**
      * Receive a packet on the N0 VirtualNetDevice
-     * \param socket Receiving socket
+     * @param socket Receiving socket
      */
     void N0SocketRecv(Ptr<Socket> socket)
     {
@@ -158,7 +158,7 @@
 
     /**
      * Receive a packet on the N1 VirtualNetDevice
-     * \param socket Receiving socket
+     * @param socket Receiving socket
      */
     void N1SocketRecv(Ptr<Socket> socket)
     {
@@ -174,12 +174,12 @@
   public:
     /**
      * Constructor
-     * \param n3 Pointer of Node 3
-     * \param n0 Pointer of Node 0
-     * \param n1 Pointer of Node 1
-     * \param n3Addr IPv4 address of Node 3
-     * \param n0Addr IPv4 address of Node 0
-     * \param n1Addr IPv4 address of Node 1
+     * @param n3 Pointer of Node 3
+     * @param n0 Pointer of Node 0
+     * @param n1 Pointer of Node 1
+     * @param n3Addr IPv4 address of Node 3
+     * @param n0Addr IPv4 address of Node 0
+     * @param n1Addr IPv4 address of Node 1
      */
     Tunnel(Ptr<Node> n3,
            Ptr<Node> n0,
@@ -314,21 +314,21 @@
                       Address(InetSocketAddress(Ipv4Address("11.0.0.254"), port)));
     onoff.SetConstantRate(DataRate("448kb/s"));
     ApplicationContainer apps = onoff.Install(c.Get(0));
-    apps.Start(Seconds(1.0));
-    apps.Stop(Seconds(10.0));
+    apps.Start(Seconds(1));
+    apps.Stop(Seconds(10));
 
     // Create a packet sink to receive these packets
     PacketSinkHelper sink("ns3::UdpSocketFactory",
                           Address(InetSocketAddress(Ipv4Address::GetAny(), port)));
     apps = sink.Install(c.Get(3));
-    apps.Start(Seconds(1.0));
+    apps.Start(Seconds(1));
     // apps.Stop (Seconds (10.0));
 
     // Create a similar flow from n3 to n1, starting at time 1.1 seconds
     onoff.SetAttribute("Remote", AddressValue(InetSocketAddress(Ipv4Address("11.0.0.1"), port)));
     apps = onoff.Install(c.Get(3));
     apps.Start(Seconds(1.1));
-    apps.Stop(Seconds(10.0));
+    apps.Stop(Seconds(10));
 
     // Create a packet sink to receive these packets
     apps = sink.Install(c.Get(1));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/virtual-net-device/model/virtual-net-device.h ns-3.44/src/virtual-net-device/model/virtual-net-device.h
--- ns-3.43/src/virtual-net-device/model/virtual-net-device.h	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/virtual-net-device/model/virtual-net-device.h	2025-03-09 16:55:49.755372500 -0700
@@ -21,15 +21,15 @@
 {
 
 /**
- * \defgroup virtual-net-device Virtual Device
+ * @defgroup virtual-net-device Virtual Device
  *
  */
 
 /**
- * \ingroup virtual-net-device
+ * @ingroup virtual-net-device
  *
- * \class VirtualNetDevice
- * \brief A virtual device, similar to Linux TUN/TAP interfaces.
+ * @class VirtualNetDevice
+ * @brief A virtual device, similar to Linux TUN/TAP interfaces.
  *
  * A VirtualNetDevice is a "virtual" NetDevice implementation which
  * delegates to a user callback (see method SetSendCallback()) the
@@ -53,8 +53,8 @@
     typedef Callback<bool, Ptr<Packet>, const Address&, const Address&, uint16_t> SendCallback;
 
     /**
-     * \brief Get the type ID.
-     * \return The object TypeId.
+     * @brief Get the type ID.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
     VirtualNetDevice();
@@ -62,48 +62,48 @@
     ~VirtualNetDevice() override;
 
     /**
-     * \brief Set the user callback to be called when a L2 packet is to be transmitted
-     * \param transmitCb the new transmit callback
+     * @brief Set the user callback to be called when a L2 packet is to be transmitted
+     * @param transmitCb the new transmit callback
      */
     void SetSendCallback(SendCallback transmitCb);
 
     /**
-     * \brief Configure whether the virtual device needs ARP
+     * @brief Configure whether the virtual device needs ARP
      *
-     * \param needsArp the the 'needs arp' value that will be returned
+     * @param needsArp the the 'needs arp' value that will be returned
      * by the NeedsArp() method.  The method IsBroadcast() will also
      * return this value.
      */
     void SetNeedsArp(bool needsArp);
 
     /**
-     * \brief Configure whether the virtual device is point-to-point
+     * @brief Configure whether the virtual device is point-to-point
      *
-     * \param isPointToPoint the value that should be returned by the
+     * @param isPointToPoint the value that should be returned by the
      * IsPointToPoint method for this instance.
      */
     void SetIsPointToPoint(bool isPointToPoint);
 
     /**
-     * \brief Configure whether the virtual device supports SendFrom
-     * \param supportsSendFrom true if the device supports SendFrom
+     * @brief Configure whether the virtual device supports SendFrom
+     * @param supportsSendFrom true if the device supports SendFrom
      */
     void SetSupportsSendFrom(bool supportsSendFrom);
 
     /**
-     * \brief Configure the reported MTU for the virtual device.
-     * \param mtu MTU value to set
-     * \return whether the MTU value was within legal bounds
+     * @brief Configure the reported MTU for the virtual device.
+     * @param mtu MTU value to set
+     * @return whether the MTU value was within legal bounds
      */
     bool SetMtu(const uint16_t mtu) override;
 
     /**
-     * \param packet packet sent from below up to Network Device
-     * \param protocol Protocol type
-     * \param source the address of the sender of this packet.
-     * \param destination the address of the receiver of this packet.
-     * \param packetType type of packet received (broadcast/multicast/unicast/otherhost)
-     * \returns true if the packet was forwarded successfully, false otherwise.
+     * @param packet packet sent from below up to Network Device
+     * @param protocol Protocol type
+     * @param source the address of the sender of this packet.
+     * @param destination the address of the receiver of this packet.
+     * @param packetType type of packet received (broadcast/multicast/unicast/otherhost)
+     * @returns true if the packet was forwarded successfully, false otherwise.
      *
      * Forward a "virtually received" packet up
      * the node's protocol stack.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/visualizer/model/pyviz.cc ns-3.44/src/visualizer/model/pyviz.cc
--- ns-3.43/src/visualizer/model/pyviz.cc	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/visualizer/model/pyviz.cc	2025-03-09 16:55:49.755372500 -0700
@@ -69,8 +69,8 @@
 };
 
 /**
- * \brief Get the type ID.
- * \return the object TypeId
+ * @brief Get the type ID.
+ * @return the object TypeId
  */
 TypeId
 PyVizPacketTag::GetTypeId()
@@ -930,7 +930,7 @@
   private:
     /**
      * Clip start top function
-     * \param line the clip line
+     * @param line the clip line
      */
     void ClipStartTop(Line& line) const
     {
@@ -940,7 +940,7 @@
 
     /**
      * Clip start bottom function
-     * \param line the clip line
+     * @param line the clip line
      */
     void ClipStartBottom(Line& line) const
     {
@@ -950,7 +950,7 @@
 
     /**
      * Clip start right function
-     * \param line the clip line
+     * @param line the clip line
      */
     void ClipStartRight(Line& line) const
     {
@@ -960,7 +960,7 @@
 
     /**
      * Clip start left function
-     * \param line the clip line
+     * @param line the clip line
      */
     void ClipStartLeft(Line& line) const
     {
@@ -970,7 +970,7 @@
 
     /**
      * Clip end top function
-     * \param line the clip line
+     * @param line the clip line
      */
     void ClipEndTop(Line& line) const
     {
@@ -980,7 +980,7 @@
 
     /**
      * Clip end bottom function
-     * \param line the clip line
+     * @param line the clip line
      */
     void ClipEndBottom(Line& line) const
     {
@@ -990,7 +990,7 @@
 
     /**
      * Clip end right function
-     * \param line the clip line
+     * @param line the clip line
      */
     void ClipEndRight(Line& line) const
     {
@@ -1000,7 +1000,7 @@
 
     /**
      * Clip end left function
-     * \param line the clip line
+     * @param line the clip line
      */
     void ClipEndLeft(Line& line) const
     {
@@ -1012,8 +1012,8 @@
     /**
      * Constructor
      *
-     * \param clipMin minimum clipping vector
-     * \param clipMax maximum clipping vector
+     * @param clipMin minimum clipping vector
+     * @param clipMax maximum clipping vector
      */
     FastClipping(Vector2 clipMin, Vector2 clipMax)
         : m_clipMin(clipMin),
@@ -1023,8 +1023,8 @@
 
     /**
      * Clip line function
-     * \param line the clip line
-     * \returns true if clipped
+     * @param line the clip line
+     * @returns true if clipped
      */
     bool ClipLine(Line& line)
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/visualizer/model/pyviz.h ns-3.44/src/visualizer/model/pyviz.h
--- ns-3.43/src/visualizer/model/pyviz.h	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/visualizer/model/pyviz.h	2025-03-09 16:55:49.755372500 -0700
@@ -27,10 +27,10 @@
 {
 
 /**
- * \ingroup visualizer
+ * @ingroup visualizer
  *
- * \brief helper class to be used by the visualizer
- * \internal
+ * @brief helper class to be used by the visualizer
+ * @internal
  *
  * This class is not meant to be used by simulations.  It is only
  * meant to be used by the visualizer tool (PyViz).  The only reason
@@ -45,40 +45,40 @@
 
     /**
      * Register drop trace path function
-     * \param tracePath the path to trace
+     * @param tracePath the path to trace
      */
     void RegisterDropTracePath(const std::string& tracePath);
 
     /**
      * Register CSMA like device function
-     * \param deviceTypeName the device type name
+     * @param deviceTypeName the device type name
      */
     void RegisterCsmaLikeDevice(const std::string& deviceTypeName);
     /**
      * Register WIFI like device function
-     * \param deviceTypeName the device type name
+     * @param deviceTypeName the device type name
      */
     void RegisterWifiLikeDevice(const std::string& deviceTypeName);
     /**
      * Register point to point like device function
-     * \param deviceTypeName the device type name
+     * @param deviceTypeName the device type name
      */
     void RegisterPointToPointLikeDevice(const std::string& deviceTypeName);
 
     /**
      * Run simulation until a given (simulated, absolute) time is reached
-     * \param time the run time
+     * @param time the run time
      */
     void SimulatorRunUntil(Time time);
 
     /**
      * Pause function
-     * \param message the pause message
+     * @param message the pause message
      */
     static void Pause(const std::string& message);
     /**
      * Get pause message function
-     * \returns the pause message
+     * @returns the pause message
      */
     std::vector<std::string> GetPauseMessages() const;
 
@@ -95,7 +95,7 @@
         TransmissionSampleList; ///< TransmissionSampleList typedef
     /**
      * Get transmission samples
-     * \returns the transmission sample list
+     * @returns the transmission sample list
      */
     TransmissionSampleList GetTransmissionSamples() const;
 
@@ -109,7 +109,7 @@
     typedef std::vector<PacketDropSample> PacketDropSampleList; ///< PacketDropSampleList typedef
     /**
      * Get packet drop samples
-     * \returns the packet drop sample list
+     * @returns the packet drop sample list
      */
     PacketDropSampleList GetPacketDropSamples() const;
 
@@ -143,14 +143,14 @@
 
     /**
      * Get last packets function
-     * \param nodeId the node ID
-     * \returns the last packets
+     * @param nodeId the node ID
+     * @returns the last packets
      */
     LastPacketsSample GetLastPackets(uint32_t nodeId) const;
 
     /**
      * Set nodes of interest function
-     * \param nodes the collection of nodes
+     * @param nodes the collection of nodes
      */
     void SetNodesOfInterest(std::set<uint32_t> nodes);
 
@@ -181,7 +181,7 @@
 
     /**
      * Get node statistics
-     * \returns the node statistics
+     * @returns the node statistics
      */
     std::vector<NodeStatistics> GetNodesStatistics() const;
 
@@ -205,25 +205,25 @@
 
     /**
      * Set packet capture options function
-     * \param nodeId the node ID
-     * \param options the capture options
+     * @param nodeId the node ID
+     * @param options the capture options
      */
     void SetPacketCaptureOptions(uint32_t nodeId, PacketCaptureOptions options);
 
     // Yes, I know, this is just a utility function, not really related to the class in any way.
     /**
      * Utility function - clips a line to a bounding box.
-     * \param [in] boundsX1 Bounding box, minimum X coord
-     * \param [in] boundsY1 Bounding box, minimum Y coord
-     * \param [in] boundsX2 Bounding box, maximum X coord
-     * \param [in] boundsY2 Bounding box, maximum Y coord
-     * \param [in,out] lineX1 Line, minimum X coord (any on input, clipped to the bounding box
+     * @param [in] boundsX1 Bounding box, minimum X coord
+     * @param [in] boundsY1 Bounding box, minimum Y coord
+     * @param [in] boundsX2 Bounding box, maximum X coord
+     * @param [in] boundsY2 Bounding box, maximum Y coord
+     * @param [in,out] lineX1 Line, minimum X coord (any on input, clipped to the bounding box
      * on output)
-     * \param [in,out] lineY1 Line, minimum Y coord (any on input, clipped to the bounding box
+     * @param [in,out] lineY1 Line, minimum Y coord (any on input, clipped to the bounding box
      * on output)
-     * \param [in,out] lineX2 Line, maximum X coord (any on input, clipped to the bounding box
+     * @param [in,out] lineX2 Line, maximum X coord (any on input, clipped to the bounding box
      * on output)
-     * \param [in,out] lineY2 Line, maximum Y coord (any on input, clipped to the bounding box
+     * @param [in,out] lineY2 Line, maximum Y coord (any on input, clipped to the bounding box
      * on output)
      */
     // -#- @lineX1(direction=inout); @lineY1(direction=inout); @lineX2(direction=inout);
@@ -241,16 +241,16 @@
   private:
     /**
      * Get packet capture options function
-     * \param nodeId the node ID
-     * \param outOptions the packet capture options
-     * \returns true if successful
+     * @param nodeId the node ID
+     * @param outOptions the packet capture options
+     * @returns true if successful
      */
     bool GetPacketCaptureOptions(uint32_t nodeId, const PacketCaptureOptions** outOptions) const;
     /**
      * Filter packet function
-     * \param packet the packet
-     * \param options the capture options
-     * \returns true if successful
+     * @param packet the packet
+     * @param options the capture options
+     * @returns true if successful
      */
     static bool FilterPacket(Ptr<const Packet> packet, const PacketCaptureOptions& options);
 
@@ -270,15 +270,15 @@
         /**
          * Less than operator
          *
-         * \param other object to compare
-         * \return true if less than
+         * @param other object to compare
+         * @return true if less than
          */
         bool operator<(const TransmissionSampleKey& other) const;
         /**
          * Equality operator
          *
-         * \param other object to compare
-         * \return true if equal
+         * @param other object to compare
+         * @return true if equal
          */
         bool operator==(const TransmissionSampleKey& other) const;
         Ptr<Node> transmitter; ///< transmitter
@@ -308,18 +308,18 @@
     // Trace callbacks
     /**
      * Network transmit common trace callback function
-     * \param context the context
-     * \param packet the packet
-     * \param destination the destination MAC address
+     * @param context the context
+     * @param packet the packet
+     * @param destination the destination MAC address
      */
     void TraceNetDevTxCommon(const std::string& context,
                              Ptr<const Packet> packet,
                              const Mac48Address& destination);
     /**
      * Network receive common trace callback function
-     * \param context the context
-     * \param packet the packet
-     * \param source the source MAC address
+     * @param context the context
+     * @param packet the packet
+     * @param source the source MAC address
      */
     void TraceNetDevRxCommon(const std::string& context,
                              Ptr<const Packet> packet,
@@ -327,31 +327,31 @@
 
     /**
      * Wi-Fi transmit trace callback function
-     * \param context the context
-     * \param packet the packet
+     * @param context the context
+     * @param packet the packet
      */
     void TraceNetDevTxWifi(std::string context, Ptr<const Packet> packet);
     /**
      * Wi-Fi receive trace callback function
-     * \param context the context
-     * \param packet the packet
+     * @param context the context
+     * @param packet the packet
      */
     void TraceNetDevRxWifi(std::string context, Ptr<const Packet> packet);
 
     /**
      * Queue drop trace callback function
-     * \param context the context
-     * \param packet the packet
+     * @param context the context
+     * @param packet the packet
      */
     void TraceDevQueueDrop(std::string context, Ptr<const Packet> packet);
     /**
      * Ipv4 drop trace callback function
-     * \param context the context
-     * \param hdr the header
-     * \param packet the packet
-     * \param reason the drop reason
-     * \param dummy_ipv4 the dummy Ipv4
-     * \param interface the interface
+     * @param context the context
+     * @param hdr the header
+     * @param packet the packet
+     * @param reason the drop reason
+     * @param dummy_ipv4 the dummy Ipv4
+     * @param interface the interface
      */
     void TraceIpv4Drop(std::string context,
                        const ns3::Ipv4Header& hdr,
@@ -362,50 +362,50 @@
 
     /**
      * CSMA transmit trace callback function
-     * \param context the context
-     * \param packet the packet
+     * @param context the context
+     * @param packet the packet
      */
     void TraceNetDevTxCsma(std::string context, Ptr<const Packet> packet);
     /**
      * CSMA receive trace callback function
-     * \param context the context
-     * \param packet the packet
+     * @param context the context
+     * @param packet the packet
      */
     void TraceNetDevRxCsma(std::string context, Ptr<const Packet> packet);
     /**
      * CSMA promiscuous receive function
-     * \param context the context
-     * \param packet the packet
+     * @param context the context
+     * @param packet the packet
      */
     void TraceNetDevPromiscRxCsma(std::string context, Ptr<const Packet> packet);
 
     /**
      * Point to point transmit trace callback function
-     * \param context the context
-     * \param packet the packet
+     * @param context the context
+     * @param packet the packet
      */
     void TraceNetDevTxPointToPoint(std::string context, Ptr<const Packet> packet);
     /**
      * Point to point receive trace callback function
-     * \param context the context
-     * \param packet the packet
+     * @param context the context
+     * @param packet the packet
      */
     void TraceNetDevRxPointToPoint(std::string context, Ptr<const Packet> packet);
 
     /**
      * WiMax transmit trace callback function
-     * \param context the context
-     * \param packet the packet
-     * \param destination the destination MAC address
+     * @param context the context
+     * @param packet the packet
+     * @param destination the destination MAC address
      */
     void TraceNetDevTxWimax(std::string context,
                             Ptr<const Packet> packet,
                             const Mac48Address& destination);
     /**
      * WiMax transmit trace callback function
-     * \param context the context
-     * \param packet the packet
-     * \param source the source MAC address
+     * @param context the context
+     * @param packet the packet
+     * @param source the source MAC address
      */
     void TraceNetDevRxWimax(std::string context,
                             Ptr<const Packet> packet,
@@ -413,18 +413,18 @@
 
     /**
      * LTE transmit trace callback function
-     * \param context the context
-     * \param packet the packet
-     * \param destination the destination MAC address
+     * @param context the context
+     * @param packet the packet
+     * @param destination the destination MAC address
      */
     void TraceNetDevTxLte(std::string context,
                           Ptr<const Packet> packet,
                           const Mac48Address& destination);
     /**
      * LTE receive trace callback function
-     * \param context the context
-     * \param packet the packet
-     * \param source the MAC address of the source
+     * @param context the context
+     * @param packet the packet
+     * @param source the MAC address of the source
      */
     void TraceNetDevRxLte(std::string context,
                           Ptr<const Packet> packet,
@@ -432,15 +432,15 @@
 
     /**
      * Find net device statistics function
-     * \param node the node
-     * \param interface the interface number
-     * \returns the device statistics
+     * @param node the node
+     * @param interface the interface number
+     * @returns the device statistics
      */
     inline NetDeviceStatistics& FindNetDeviceStatistics(int node, int interface);
 
     /**
      * Do pause function
-     * \param message the pause message
+     * @param message the pause message
      */
     void DoPause(const std::string& message);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/visualizer/model/visual-simulator-impl.cc ns-3.44/src/visualizer/model/visual-simulator-impl.cc
--- ns-3.43/src/visualizer/model/visual-simulator-impl.cc	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/visualizer/model/visual-simulator-impl.cc	2025-03-09 16:55:49.755372500 -0700
@@ -24,7 +24,7 @@
 {
 /**
  * Get an object factory configured to the default simulator implementation
- * \return an object factory.
+ * @return an object factory.
  */
 ObjectFactory
 GetDefaultSimulatorImplFactory()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/visualizer/model/visual-simulator-impl.h ns-3.44/src/visualizer/model/visual-simulator-impl.h
--- ns-3.43/src/visualizer/model/visual-simulator-impl.h	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/visualizer/model/visual-simulator-impl.h	2025-03-09 16:55:49.755372500 -0700
@@ -15,15 +15,15 @@
 {
 
 /**
- * \defgroup  visualizer Visualizer
+ * @defgroup  visualizer Visualizer
  *
  */
 
 /**
- * \ingroup visualizer
- * \ingroup simulator
+ * @ingroup visualizer
+ * @ingroup simulator
  *
- * \brief A replacement simulator that starts the visualizer
+ * @brief A replacement simulator that starts the visualizer
  *
  * To use this class, run any ns-3 simulation with the command-line
  * argument --SimulatorImplementationType=ns3::VisualSimulatorImpl.
@@ -33,8 +33,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/visualizer/visualizer/ipython_view.py ns-3.44/src/visualizer/visualizer/ipython_view.py
--- ns-3.43/src/visualizer/visualizer/ipython_view.py	2024-10-09 16:41:10.104656700 -0700
+++ ns-3.44/src/visualizer/visualizer/ipython_view.py	2025-03-09 16:55:49.755372500 -0700
@@ -16,6 +16,7 @@
 
 import gi
 
+gi.require_version("Gdk", "3.0")
 gi.require_version("Gtk", "3.0")
 import os
 import re
@@ -24,7 +25,7 @@
 from io import StringIO
 
 from gi.repository import Gdk, GLib, Gtk, Pango
-from pkg_resources import parse_version
+from packaging.version import Version
 
 ## Try to import IPython
 try:
@@ -138,7 +139,7 @@
         sys.excepthook = excepthook
         self.iter_more = 0
         self.history_level = 0
-        self.complete_sep = re.compile("[\s\{\}\[\]\(\)]")
+        self.complete_sep = re.compile(r"[\s\{\}\[\]\(\)]")
         self.updateNamespace({"exit": lambda: None})
         self.updateNamespace({"quit": lambda: None})
         # Workaround for updating namespace with sys.modules
@@ -148,7 +149,7 @@
         # Avoid using input splitter when not really needed.
         # Perhaps it could work even before 5.8.0
         # But it definitely does not work any more with >= 7.0.0
-        self.no_input_splitter = parse_version(IPython.release.version) >= parse_version("5.8.0")
+        self.no_input_splitter = Version(IPython.release.version) >= Version("5.8.0")
         self.lines = []
         self.indent_spaces = ""
 
@@ -418,7 +419,7 @@
         Initialize console view.
         """
         Gtk.TextView.__init__(self)
-        self.modify_font(Pango.FontDescription("Mono"))
+        self.set_monospace(True)
         self.set_cursor_visible(True)
         self.text_buffer = self.get_buffer()
         self.mark = self.text_buffer.create_mark(
@@ -433,7 +434,7 @@
             )
         self.text_buffer.create_tag("0")
         self.text_buffer.create_tag("notouch", editable=False)
-        self.color_pat = re.compile("\x01?\x1b\[(.*?)m\x02?")
+        self.color_pat = re.compile(r"\x01?\x1b\[(.*?)m\x02?")
         self.line_start = self.text_buffer.create_mark(
             "line_start", self.text_buffer.get_end_iter(), True
         )
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/visualizer/visualizer/ipython_view.py.license ns-3.44/src/visualizer/visualizer/ipython_view.py.license
--- ns-3.43/src/visualizer/visualizer/ipython_view.py.license	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/visualizer/visualizer/ipython_view.py.license	2025-03-09 16:55:49.755372500 -0700
@@ -0,0 +1,2 @@
+Copyright (c) 2007 IBM Corporation
+SPDX-License-Identifier: BSD-3-Clause
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/CMakeLists.txt ns-3.44/src/wifi/CMakeLists.txt
--- ns-3.43/src/wifi/CMakeLists.txt	2024-10-09 16:41:10.108656600 -0700
+++ ns-3.44/src/wifi/CMakeLists.txt	2025-03-09 16:55:49.755372500 -0700
@@ -8,11 +8,13 @@
 set(source_files
     helper/athstats-helper.cc
     helper/spectrum-wifi-helper.cc
+    helper/wifi-co-trace-helper.cc
     helper/wifi-helper.cc
     helper/wifi-mac-helper.cc
     helper/wifi-radio-energy-model-helper.cc
     helper/yans-wifi-helper.cc
     helper/wifi-phy-rx-trace-helper.cc
+    helper/wifi-tx-stats-helper.cc
     model/addba-extension.cc
     model/adhoc-wifi-mac.cc
     model/ampdu-subframe-header.cc
@@ -30,6 +32,9 @@
     model/eht/advanced-ap-emlsr-manager.cc
     model/eht/advanced-emlsr-manager.cc
     model/eht/ap-emlsr-manager.cc
+    model/eht/advanced-ap-emlsr-manager.cc
+    model/eht/common-info-basic-mle.cc
+    model/eht/common-info-probe-req-mle.cc
     model/eht/default-ap-emlsr-manager.cc
     model/eht/default-emlsr-manager.cc
     model/eht/eht-capabilities.cc
@@ -46,6 +51,8 @@
     model/fcfs-wifi-queue-scheduler.cc
     model/frame-capture-model.cc
     model/frame-exchange-manager.cc
+    model/gcr-group-address.cc
+    model/gcr-manager.cc
     model/he/constant-obss-pd-algorithm.cc
     model/he/he-6ghz-band-capabilities.cc
     model/he/he-capabilities.cc
@@ -131,6 +138,7 @@
     model/wifi-bandwidth-filter.cc
     model/wifi-default-ack-manager.cc
     model/wifi-default-assoc-manager.cc
+    model/wifi-default-gcr-manager.cc
     model/wifi-default-protection-manager.cc
     model/wifi-information-element.cc
     model/wifi-mac-header.cc
@@ -171,11 +179,13 @@
 set(header_files
     helper/athstats-helper.h
     helper/spectrum-wifi-helper.h
+    helper/wifi-co-trace-helper.h
     helper/wifi-helper.h
     helper/wifi-mac-helper.h
     helper/wifi-radio-energy-model-helper.h
     helper/yans-wifi-helper.h
     helper/wifi-phy-rx-trace-helper.h
+    helper/wifi-tx-stats-helper.h
     model/addba-extension.h
     model/adhoc-wifi-mac.h
     model/ampdu-subframe-header.h
@@ -193,6 +203,8 @@
     model/eht/advanced-ap-emlsr-manager.h
     model/eht/advanced-emlsr-manager.h
     model/eht/ap-emlsr-manager.h
+    model/eht/common-info-basic-mle.h
+    model/eht/common-info-probe-req-mle.h
     model/eht/default-ap-emlsr-manager.h
     model/eht/default-emlsr-manager.h
     model/eht/eht-capabilities.h
@@ -209,6 +221,8 @@
     model/fcfs-wifi-queue-scheduler.h
     model/frame-capture-model.h
     model/frame-exchange-manager.h
+    model/gcr-group-address.h
+    model/gcr-manager.h
     model/he/constant-obss-pd-algorithm.h
     model/he/he-6ghz-band-capabilities.h
     model/he/he-capabilities.h
@@ -294,6 +308,7 @@
     model/wifi-bandwidth-filter.h
     model/wifi-default-ack-manager.h
     model/wifi-default-assoc-manager.h
+    model/wifi-default-gcr-manager.h
     model/wifi-default-protection-manager.h
     model/wifi-information-element.h
     model/wifi-mac-header.h
@@ -357,11 +372,13 @@
     test/spectrum-wifi-phy-test.cc
     test/tx-duration-test.cc
     test/wifi-aggregation-test.cc
+    test/wifi-co-trace-helper-test.cc
     test/wifi-dynamic-bw-op-test.cc
     test/wifi-eht-info-elems-test.cc
     test/wifi-emlsr-test.cc
     test/wifi-error-rate-models-test.cc
     test/wifi-fils-frame-test.cc
+    test/wifi-gcr-test.cc
     test/wifi-he-info-elems-test.cc
     test/wifi-ie-fragment-test.cc
     test/wifi-mac-ofdma-test.cc
@@ -372,6 +389,8 @@
     test/wifi-phy-rx-trace-helper-test.cc
     test/wifi-phy-thresholds-test.cc
     test/wifi-primary-channels-test.cc
+    test/wifi-probe-exchange-test.cc
+    test/wifi-retransmit-test.cc
     test/wifi-ru-allocation-test.cc
     test/wifi-channel-switching-test.cc
     test/wifi-test.cc
@@ -381,4 +400,5 @@
     test/wifi-non-ht-dup-test.cc
     test/wifi-phy-mu-mimo-test.cc
     test/wifi-operating-channel-test.cc
+    test/wifi-tx-stats-helper-test.cc
 )
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/doc/Makefile ns-3.44/src/wifi/doc/Makefile
--- ns-3.43/src/wifi/doc/Makefile	2024-10-09 16:41:10.108656600 -0700
+++ ns-3.44/src/wifi/doc/Makefile	2025-03-09 16:55:49.755372500 -0700
@@ -28,6 +28,7 @@
         $(FIGURES)/assoc-manager.eps \
         $(FIGURES)/clear-channel.eps \
         $(FIGURES)/emlsr-dl-txop.eps \
+        $(FIGURES)/emlsr-txop-ended-trace.eps \
         $(FIGURES)/emlsr-ul-txop.eps \
         $(FIGURES)/nist-frame-success-rate.eps \
         $(FIGURES)/nist-frame-success-rate-n.eps \
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/doc/source/figures/emlsr-txop-ended-trace.eps ns-3.44/src/wifi/doc/source/figures/emlsr-txop-ended-trace.eps
--- ns-3.43/src/wifi/doc/source/figures/emlsr-txop-ended-trace.eps	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/wifi/doc/source/figures/emlsr-txop-ended-trace.eps	2025-03-09 16:55:49.763372400 -0700
@@ -0,0 +1,1569 @@
+%!PS-Adobe-3.0 EPSF-3.0 
+%%BoundingBox: 0 0 720 276
+%%Pages: 0
+%%Creator: LibreOffice 24.8
+%%Title: none
+%%CreationDate: none
+%%LanguageLevel: 2
+%%EndComments
+%%BeginProlog
+%%BeginResource: procset SDRes-Prolog 1.0 0
+/b4_inc_state save def
+/dict_count countdictstack def
+/op_count count 1 sub def
+userdict begin
+0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit[] 0 setdash newpath
+/languagelevel where {pop languagelevel 1 ne {false setstrokeadjust false setoverprint} if} if
+/bdef {bind def} bind def
+/c {setrgbcolor} bdef
+/l {neg lineto} bdef
+/rl {neg rlineto} bdef
+/lc {setlinecap} bdef
+/lj {setlinejoin} bdef
+/lw {setlinewidth} bdef
+/ml {setmiterlimit} bdef
+/ld {setdash} bdef
+/m {neg moveto} bdef
+/ct {6 2 roll neg 6 2 roll neg 6 2 roll neg curveto} bdef
+/r {rotate} bdef
+/t {neg translate} bdef
+/s {scale} bdef
+/sw {show} bdef
+/gs {gsave} bdef
+/gr {grestore} bdef
+/f {findfont dup length dict begin
+{1 index /FID ne {def} {pop pop} ifelse} forall /Encoding ISOLatin1Encoding def
+currentdict end /NFont exch definefont pop /NFont findfont} bdef
+/p {closepath} bdef
+/sf {scalefont setfont} bdef
+/ef {eofill}bdef
+/pc {closepath stroke}bdef
+/ps {stroke}bdef
+/pum {matrix currentmatrix}bdef
+/pom {setmatrix}bdef
+/bs {/aString exch def /nXOfs exch def /nWidth exch def currentpoint nXOfs 0 rmoveto pum nWidth aString stringwidth pop div 1 scale aString show pom moveto} bdef
+%%EndResource
+%%EndProlog
+%%BeginSetup
+%%EndSetup
+%%Page: 1 1
+%%BeginPageSetup
+%%EndPageSetup
+pum
+0.02834 0.02829 s 
+0 -9754 t
+/tm matrix currentmatrix def
+gs
+0 0 m 25399 0 l 25399 9753 l 0 9753 l 0 0 l eoclip newpath
+gs
+0 0 m 25399 0 l 25399 9753 l 0 9753 l 0 0 l eoclip newpath
+gs
+0 lw 1 lj 0.007 0.007 0.007 c 0 5245 m  25400 5245 l  ps
+gr
+gs
+0.007 0.007 0.007 c 267 4942 m  267 4503 l  326 4503 l  326 4894 l  548 4894 l 
+548 4942 l  267 4942 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 608 4534 m  608 4481 l  665 4481 l  665 4534 l  608 4534 l 
+p
+608 4943 m  608 4606 l  665 4606 l  665 4943 l  608 4943 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 963 4942 m  963 4728 l  963 4706 961 4689 956 4677 ct 952 4664 945 4656 936 4650 ct 
+926 4645 912 4642 894 4642 ct 867 4642 846 4651 830 4670 ct 815 4688 807 4714 807 4746 ct 
+807 4942 l  750 4942 l  750 4677 l  750 4638 749 4614 748 4605 ct 802 4605 l 
+802 4606 802 4609 803 4614 ct 803 4618 803 4623 803 4629 ct 804 4635 804 4646 804 4663 ct 
+805 4663 l  818 4639 833 4623 850 4613 ct 867 4604 888 4599 913 4599 ct 949 4599 976 4608 993 4626 ct 
+1010 4645 1019 4675 1019 4717 ct 1019 4942 l  963 4942 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 1311 4943 m  1197 4788 l  1156 4823 l  1156 4943 l  1100 4943 l 
+1100 4481 l  1156 4481 l  1156 4769 l  1303 4606 l  1369 4606 l  1232 4750 l 
+1376 4943 l  1311 4943 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 1882 4723 m  1882 4796 1869 4852 1844 4890 ct 1818 4929 1779 4948 1729 4948 ct 
+1679 4948 1641 4929 1616 4891 ct 1590 4852 1578 4796 1578 4723 ct 1578 4647 1590 4591 1615 4553 ct 
+1639 4516 1678 4497 1731 4497 ct 1783 4497 1821 4516 1846 4554 ct 1870 4592 1882 4648 1882 4723 ct 
+p
+1826 4723 m  1826 4659 1818 4613 1804 4585 ct 1789 4556 1764 4542 1731 4542 ct 
+1696 4542 1672 4556 1657 4584 ct 1642 4612 1634 4658 1634 4723 ct 1634 4785 1642 4830 1657 4859 ct 
+1672 4888 1696 4902 1729 4902 ct 1762 4902 1787 4888 1803 4858 ct 1818 4829 1826 4784 1826 4723 ct 
+p ef
+gr
+gs
+0.507 0.832 0.109 c 16807 6618 m  15706 6618 l  15706 5348 l  17906 5348 l 
+17906 6618 l  16807 6618 l  p ef
+gr
+gs
+0 lw 1 lj 0.210 0.398 0.644 c 16807 6618 m  15706 6618 l  15706 5348 l 
+17906 5348 l  17906 6618 l  16807 6618 l  pc
+gr
+gs
+0.007 0.007 0.007 c 16536 6202 m  16421 6022 l  16285 6022 l  16285 6202 l 
+16226 6202 l  16226 5766 l  16432 5766 l  16481 5766 16519 5777 16547 5799 ct 
+16573 5821 16587 5851 16587 5890 ct 16587 5923 16577 5951 16558 5973 ct 16539 5995 16512 6009 16479 6015 ct 
+16604 6202 l  16536 6202 l  p
+16526 5891 m  16526 5866 16518 5846 16500 5833 ct 16483 5820 16458 5813 16426 5813 ct 
+16285 5813 l  16285 5975 l  16428 5975 l  16459 5975 16484 5968 16501 5953 ct 
+16518 5938 16526 5917 16526 5891 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 16847 5814 m  16847 6203 l  16788 6203 l  16788 5814 l 
+16637 5814 l  16637 5766 l  16997 5766 l  16997 5814 l  16847 5814 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 17407 6081 m  17407 6122 17392 6154 17360 6176 ct 17329 6198 17284 6209 17226 6209 ct 
+17119 6209 17058 6172 17041 6097 ct 17098 6085 l  17105 6112 17119 6132 17140 6144 ct 
+17162 6157 17191 6163 17228 6163 ct 17267 6163 17297 6156 17318 6143 ct 17338 6130 17349 6110 17349 6084 ct 
+17349 6070 17346 6059 17339 6050 ct 17333 6041 17323 6034 17312 6028 ct 17300 6023 17286 6018 17269 6014 ct 
+17253 6010 17234 6006 17214 6001 ct 17180 5993 17153 5986 17136 5978 ct 17118 5970 17104 5962 17093 5953 ct 
+17083 5943 17075 5932 17070 5919 ct 17064 5907 17061 5892 17061 5876 ct 17061 5839 17076 5810 17104 5789 ct 
+17133 5769 17174 5759 17227 5759 ct 17278 5759 17316 5767 17342 5782 ct 17368 5797 17387 5823 17396 5860 ct 
+17339 5870 l  17332 5847 17320 5830 17302 5819 ct 17284 5809 17259 5804 17227 5804 ct 
+17192 5804 17165 5809 17147 5821 ct 17128 5833 17119 5850 17119 5873 ct 17119 5886 17123 5897 17130 5906 ct 
+17137 5915 17147 5922 17161 5929 ct 17174 5935 17201 5942 17242 5951 ct 17255 5954 17269 5957 17282 5961 ct 
+17295 5964 17308 5968 17320 5972 ct 17332 5977 17344 5982 17355 5988 ct 17365 5994 17374 6001 17382 6010 ct 
+17390 6018 17396 6029 17401 6040 ct 17405 6052 17407 6065 17407 6081 ct p ef
+gr
+gs
+1.000 0.714 0.425 c 19506 5119 m  18405 5119 l  18405 3850 l  20606 3850 l 
+20606 5119 l  19506 5119 l  p ef
+gr
+gs
+0 lw 1 lj 0.210 0.398 0.644 c 19506 5119 m  18405 5119 l  18405 3850 l 
+20606 3850 l  20606 5119 l  19506 5119 l  pc
+gr
+gs
+0.007 0.007 0.007 c 19116 4308 m  19067 4308 19030 4325 19003 4356 ct 18976 4387 18962 4430 18962 4484 ct 
+18962 4538 18976 4581 19004 4613 ct 19032 4646 19070 4662 19118 4662 ct 19179 4662 19225 4632 19256 4571 ct 
+19304 4596 l  19286 4633 19261 4662 19229 4682 ct 19196 4701 19158 4711 19115 4711 ct 
+19071 4711 19033 4702 19001 4684 ct 18969 4665 18943 4639 18927 4605 ct 18910 4571 18901 4531 18901 4484 ct 
+18901 4414 18920 4360 18959 4319 ct 18996 4280 19048 4260 19115 4260 ct 19161 4260 19200 4269 19232 4287 ct 
+19263 4306 19286 4334 19300 4369 ct 19244 4388 l  19234 4362 19218 4343 19195 4330 ct 
+19173 4315 19146 4308 19116 4308 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 19550 4315 m  19550 4705 l  19490 4705 l  19490 4315 l 
+19340 4315 l  19340 4267 l  19700 4267 l  19700 4315 l  19550 4315 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 20111 4584 m  20111 4624 20096 4656 20064 4678 ct 20033 4700 19988 4711 19931 4711 ct 
+19824 4711 19762 4674 19745 4600 ct 19803 4588 l  19810 4615 19824 4634 19845 4646 ct 
+19867 4659 19896 4665 19933 4665 ct 19971 4665 20001 4658 20022 4645 ct 20042 4632 20053 4613 20053 4587 ct 
+20053 4573 20050 4561 20043 4552 ct 20037 4544 20027 4536 20016 4530 ct 20004 4525 19990 4520 19973 4516 ct 
+19957 4512 19939 4508 19919 4503 ct 19885 4495 19858 4488 19841 4480 ct 19823 4472 19809 4464 19798 4455 ct 
+19788 4445 19779 4434 19774 4421 ct 19768 4409 19765 4394 19765 4378 ct 19765 4341 19780 4311 19809 4290 ct 
+19838 4270 19879 4260 19932 4260 ct 19982 4260 20020 4268 20046 4283 ct 20072 4298 20091 4325 20101 4362 ct 
+20043 4372 l  20036 4349 20024 4332 20006 4321 ct 19988 4310 19963 4305 19932 4305 ct 
+19897 4305 19870 4310 19852 4323 ct 19833 4335 19824 4352 19824 4375 ct 19824 4388 19828 4399 19835 4408 ct 
+19842 4417 19852 4424 19866 4431 ct 19879 4437 19906 4444 19946 4453 ct 19959 4456 19973 4459 19986 4463 ct 
+19999 4466 20012 4470 20024 4474 ct 20036 4479 20048 4484 20059 4490 ct 20069 4496 20078 4503 20086 4512 ct 
+20094 4520 20100 4531 20105 4542 ct 20109 4554 20111 4568 20111 4584 ct p ef
+gr
+gs
+1.000 0.003 0.003 c 18404 4944 m  18526 4821 l  18689 4985 l  18853 4821 l 
+18976 4943 l  18812 5107 l  18976 5271 l  18853 5393 l  18689 5229 l  18526 5393 l 
+18404 5270 l  18567 5107 l  18404 4944 l  18404 4944 l  p ef
+gr
+gs
+0 lw 1 lj 0.750 0.003 0.257 c 18404 4944 m  18526 4821 l  18689 4985 l  18853 4821 l 
+18976 4943 l  18812 5107 l  18976 5271 l  18853 5393 l  18689 5229 l  18526 5393 l 
+18404 5270 l  18567 5107 l  18404 4944 l  18404 4944 l  pc
+gr
+gs
+0 lw 1 lj [ 215.6 80.85 ] 0 ld
+0.003 0.003 0.003 c 19250 5253 m  19250 8428 l  ps
+gr
+pum
+17685 8996 t
+0.003 0.003 0.003 c 218 -351 m  175 -351 142 -337 118 -309 ct 94 -282 82 -244 82 -196 ct 
+82 -148 95 -110 119 -81 ct 144 -52 178 -37 220 -37 ct 275 -37 316 -64 343 -118 ct 
+386 -97 l  370 -63 347 -38 318 -20 ct 290 -3 256 6 218 6 ct 179 6 145 -2 116 -18 ct 
+88 -35 66 -58 51 -88 ct 36 -118 29 -154 29 -196 ct 29 -258 45 -306 79 -341 ct 112 -376 158 -394 218 -394 ct 
+259 -394 293 -386 321 -370 ct 349 -354 369 -330 382 -298 ct 332 -281 l  323 -304 309 -321 289 -333 ct 
+269 -345 245 -351 218 -351 ct p ef
+605 -346 m  605 -1 l  553 -1 l  553 -346 l  420 -346 l  420 -389 l  739 -389 l 
+739 -346 l  605 -346 l  p ef
+1101 -107 m  1101 -71 1087 -43 1059 -24 ct 1031 -4 992 6 941 6 ct 846 6 792 -27 777 -93 ct 
+828 -103 l  833 -80 846 -62 865 -52 ct 884 -41 910 -35 943 -35 ct 977 -35 1003 -41 1022 -53 ct 
+1040 -64 1049 -81 1049 -104 ct 1049 -117 1046 -127 1041 -135 ct 1035 -143 1027 -149 1016 -155 ct 
+1006 -160 993 -164 979 -168 ct 964 -171 948 -175 931 -179 ct 900 -186 877 -192 861 -199 ct 
+845 -206 832 -214 823 -222 ct 814 -230 807 -240 802 -251 ct 797 -263 795 -275 795 -290 ct 
+795 -323 808 -349 833 -367 ct 858 -385 895 -394 942 -394 ct 986 -394 1020 -387 1043 -374 ct 
+1067 -360 1083 -337 1092 -305 ct 1040 -296 l  1035 -316 1024 -331 1008 -340 ct 
+992 -350 970 -354 942 -354 ct 911 -354 887 -349 871 -339 ct 854 -329 846 -313 846 -293 ct 
+846 -281 849 -271 856 -263 ct 862 -255 871 -249 883 -243 ct 895 -238 919 -231 954 -223 ct 
+966 -220 978 -218 990 -215 ct 1002 -212 1013 -209 1024 -205 ct 1035 -201 1045 -196 1054 -191 ct 
+1064 -185 1072 -179 1079 -171 ct 1086 -163 1091 -154 1095 -144 ct 1099 -133 1101 -121 1101 -107 ct 
+p ef
+1435 -3 m  1418 2 1402 4 1384 4 ct 1345 4 1325 -19 1325 -64 ct 1325 -263 l  1291 -263 l 
+1291 -299 l  1327 -299 l  1341 -366 l  1375 -366 l  1375 -299 l  1430 -299 l 
+1430 -263 l  1375 -263 l  1375 -74 l  1375 -60 1377 -50 1382 -44 ct 1386 -38 1394 -35 1406 -35 ct 
+1413 -35 1422 -37 1435 -39 ct 1435 -3 l  p ef
+1477 -362 m  1477 -409 l  1526 -409 l  1526 -362 l  1477 -362 l  p
+1477 0 m  1477 -298 l  1526 -298 l  1526 0 l  1477 0 l  p ef
+1776 0 m  1776 -189 l  1776 -218 1772 -238 1764 -249 ct 1756 -260 1742 -266 1721 -266 ct 
+1700 -266 1683 -258 1671 -241 ct 1659 -225 1652 -202 1652 -173 ct 1652 0 l  1603 0 l 
+1603 -235 l  1603 -270 1603 -291 1601 -298 ct 1648 -298 l  1648 -298 1649 -295 1649 -291 ct 
+1649 -287 1649 -282 1650 -277 ct 1650 -272 1650 -262 1650 -247 ct 1651 -247 l 
+1662 -269 1674 -283 1688 -292 ct 1702 -300 1719 -304 1738 -304 ct 1761 -304 1779 -300 1792 -290 ct 
+1805 -281 1814 -267 1819 -247 ct 1820 -247 l  1830 -268 1843 -282 1857 -291 ct 
+1872 -300 1890 -304 1910 -304 ct 1941 -304 1962 -296 1976 -279 ct 1990 -263 1997 -236 1997 -199 ct 
+1997 0 l  1948 0 l  1948 -189 l  1948 -218 1944 -238 1936 -249 ct 1928 -260 1914 -266 1893 -266 ct 
+1871 -266 1855 -258 1843 -242 ct 1831 -225 1825 -203 1825 -173 ct 1825 0 l  1776 0 l 
+p ef
+2109 -138 m  2109 -104 2116 -78 2130 -59 ct 2144 -41 2165 -31 2192 -31 ct 2214 -31 2231 -36 2244 -44 ct 
+2257 -53 2266 -64 2270 -77 ct 2314 -65 l  2296 -18 2255 6 2192 6 ct 2148 6 2115 -7 2092 -33 ct 
+2068 -60 2057 -99 2057 -151 ct 2057 -200 2068 -238 2092 -264 ct 2115 -291 2147 -304 2190 -304 ct 
+2278 -304 2322 -251 2322 -145 ct 2322 -138 l  2109 -138 l  p
+2270 -176 m  2268 -208 2260 -231 2246 -245 ct 2233 -260 2214 -267 2189 -267 ct 
+2165 -267 2146 -259 2132 -243 ct 2118 -227 2111 -204 2110 -176 ct 2270 -176 l 
+p ef
+2636 -149 m  2636 -97 2625 -58 2602 -32 ct 2579 -7 2545 6 2502 6 ct 2458 6 2425 -7 2403 -34 ct 
+2381 -60 2370 -99 2370 -149 ct 2370 -252 2414 -304 2503 -304 ct 2549 -304 2582 -291 2604 -266 ct 
+2625 -241 2636 -202 2636 -149 ct p
+2584 -149 m  2584 -190 2578 -220 2566 -239 ct 2553 -258 2533 -267 2504 -267 ct 
+2475 -267 2454 -257 2441 -238 ct 2428 -219 2422 -190 2422 -149 ct 2422 -110 2428 -80 2441 -60 ct 
+2454 -41 2474 -31 2501 -31 ct 2531 -31 2552 -40 2565 -59 ct 2578 -79 2584 -108 2584 -149 ct 
+p ef
+2745 -298 m  2745 -109 l  2745 -89 2747 -74 2751 -63 ct 2755 -52 2761 -44 2770 -40 ct 
+2778 -35 2791 -32 2807 -32 ct 2831 -32 2850 -41 2863 -57 ct 2877 -73 2884 -96 2884 -125 ct 
+2884 -298 l  2934 -298 l  2934 -63 l  2934 -28 2934 -7 2935 0 ct 2888 0 l 
+2888 0 2888 -3 2888 -7 ct 2888 -11 2887 -16 2887 -21 ct 2887 -26 2887 -36 2886 -51 ct 
+2885 -51 l  2874 -30 2861 -15 2846 -7 ct 2831 2 2812 6 2790 6 ct 2757 6 2733 -2 2718 -18 ct 
+2703 -35 2696 -62 2696 -99 ct 2696 -298 l  2745 -298 l  p ef
+3125 -3 m  3108 2 3092 4 3074 4 ct 3035 4 3015 -19 3015 -64 ct 3015 -263 l  2981 -263 l 
+2981 -299 l  3017 -299 l  3031 -366 l  3065 -366 l  3065 -299 l  3120 -299 l 
+3120 -263 l  3065 -263 l  3065 -74 l  3065 -60 3067 -50 3072 -44 ct 3076 -38 3084 -35 3096 -35 ct 
+3103 -35 3112 -37 3125 -39 ct 3125 -3 l  p ef
+pom
+gs
+1 lj 19548 5971 m  20263 5971 l  ps
+gr
+gs
+19261 5971 m  19561 6071 l  19561 5871 l  19261 5971 l  p ef
+gr
+gs
+20550 5971 m  20250 5871 l  20250 6071 l  20550 5971 l  p ef
+gr
+gs
+0 lw 1 lj 19261 6671 m  19261 5771 l  ps
+gr
+gs
+0 lw 1 lj 20550 6671 m  20550 5771 l  ps
+gr
+pum
+19385 5796 t
+39 0 m  39 -229 l  39 -250 39 -273 37 -298 ct 84 -298 l  86 -265 86 -244 86 -238 ct 
+88 -238 l  95 -263 105 -281 115 -290 ct 125 -299 140 -304 158 -304 ct 165 -304 172 -303 178 -301 ct 
+178 -256 l  172 -258 163 -258 152 -258 ct 131 -258 116 -250 105 -232 ct 94 -214 89 -189 89 -156 ct 
+89 0 l  39 0 l  p ef
+263 -138 m  263 -104 270 -78 284 -59 ct 298 -41 319 -31 346 -31 ct 368 -31 385 -36 398 -44 ct 
+411 -53 420 -64 424 -77 ct 468 -65 l  450 -18 409 6 346 6 ct 302 6 269 -7 246 -33 ct 
+222 -60 211 -99 211 -151 ct 211 -200 222 -238 246 -264 ct 269 -291 301 -304 344 -304 ct 
+432 -304 476 -251 476 -145 ct 476 -138 l  263 -138 l  p
+424 -176 m  422 -208 414 -231 400 -245 ct 387 -260 368 -267 343 -267 ct 319 -267 300 -259 286 -243 ct 
+272 -227 265 -204 264 -176 ct 424 -176 l  p ef
+713 0 m  713 -189 l  713 -218 709 -238 701 -249 ct 693 -260 679 -266 658 -266 ct 
+637 -266 620 -258 608 -241 ct 596 -225 589 -202 589 -173 ct 589 0 l  540 0 l 
+540 -235 l  540 -270 540 -291 538 -298 ct 585 -298 l  585 -298 586 -295 586 -291 ct 
+586 -287 586 -282 587 -277 ct 587 -272 587 -262 587 -247 ct 588 -247 l  599 -269 611 -283 625 -292 ct 
+639 -300 656 -304 675 -304 ct 698 -304 716 -300 729 -290 ct 742 -281 751 -267 756 -247 ct 
+757 -247 l  767 -268 780 -282 794 -291 ct 809 -300 827 -304 847 -304 ct 878 -304 899 -296 913 -279 ct 
+927 -263 934 -236 934 -199 ct 934 0 l  885 0 l  885 -189 l  885 -218 881 -238 873 -249 ct 
+865 -260 851 -266 830 -266 ct 808 -266 792 -258 780 -242 ct 768 -225 762 -203 762 -173 ct 
+762 0 l  713 0 l  p ef
+1168 -346 m  1168 -1 l  1116 -1 l  1116 -346 l  983 -346 l  983 -389 l 
+1302 -389 l  1302 -346 l  1168 -346 l  p ef
+1352 -362 m  1352 -409 l  1401 -409 l  1401 -362 l  1352 -362 l  p
+1352 0 m  1352 -298 l  1401 -298 l  1401 0 l  1352 0 l  p ef
+1651 0 m  1651 -189 l  1651 -218 1647 -238 1639 -249 ct 1631 -260 1617 -266 1596 -266 ct 
+1575 -266 1558 -258 1546 -241 ct 1534 -225 1527 -202 1527 -173 ct 1527 0 l  1478 0 l 
+1478 -235 l  1478 -270 1478 -291 1476 -298 ct 1523 -298 l  1523 -298 1524 -295 1524 -291 ct 
+1524 -287 1524 -282 1525 -277 ct 1525 -272 1525 -262 1525 -247 ct 1526 -247 l 
+1537 -269 1549 -283 1563 -292 ct 1577 -300 1594 -304 1613 -304 ct 1636 -304 1654 -300 1667 -290 ct 
+1680 -281 1689 -267 1694 -247 ct 1695 -247 l  1705 -268 1718 -282 1732 -291 ct 
+1747 -300 1765 -304 1785 -304 ct 1816 -304 1837 -296 1851 -279 ct 1865 -263 1872 -236 1872 -199 ct 
+1872 0 l  1823 0 l  1823 -189 l  1823 -218 1819 -238 1811 -249 ct 1803 -260 1789 -266 1768 -266 ct 
+1746 -266 1730 -258 1718 -242 ct 1706 -225 1700 -203 1700 -173 ct 1700 0 l  1651 0 l 
+p ef
+1984 -138 m  1984 -104 1991 -78 2005 -59 ct 2019 -41 2040 -31 2067 -31 ct 2089 -31 2106 -36 2119 -44 ct 
+2132 -53 2141 -64 2145 -77 ct 2189 -65 l  2171 -18 2130 6 2067 6 ct 2023 6 1990 -7 1967 -33 ct 
+1943 -60 1932 -99 1932 -151 ct 1932 -200 1943 -238 1967 -264 ct 1990 -291 2022 -304 2065 -304 ct 
+2153 -304 2197 -251 2197 -145 ct 2197 -138 l  1984 -138 l  p
+2145 -176 m  2143 -208 2135 -231 2121 -245 ct 2108 -260 2089 -267 2064 -267 ct 
+2040 -267 2021 -259 2007 -243 ct 1993 -227 1986 -204 1985 -176 ct 2145 -176 l 
+p ef
+pom
+gs
+1 lj 17084 2943 m  20320 2943 l  ps
+gr
+gs
+16797 2943 m  17097 3043 l  17097 2843 l  16797 2943 l  p ef
+gr
+gs
+20607 2943 m  20307 2843 l  20307 3043 l  20607 2943 l  p ef
+gr
+gs
+0 lw 1 lj 16797 3643 m  16797 2743 l  ps
+gr
+gs
+0 lw 1 lj 20607 3643 m  20607 2743 l  ps
+gr
+pum
+16603 2066 t
+353 0 m  353 -243 l  353 -270 354 -296 355 -321 ct 347 -290 339 -266 332 -248 ct 
+238 0 l  204 0 l  108 -248 l  94 -292 l  86 -321 l  86 -292 l  87 -243 l 
+87 0 l  43 0 l  43 -365 l  108 -365 l  205 -112 l  209 -102 212 -91 215 -79 ct 
+218 -67 220 -59 221 -54 ct 223 -61 226 -71 230 -85 ct 234 -99 237 -108 239 -112 ct 
+334 -365 l  397 -365 l  397 0 l  353 0 l  p ef
+548 5 m  520 5 499 -2 485 -17 ct 471 -32 463 -52 463 -78 ct 463 -107 473 -129 492 -145 ct 
+511 -160 542 -169 584 -170 ct 647 -171 l  647 -186 l  647 -209 642 -225 632 -235 ct 
+623 -245 608 -250 587 -250 ct 566 -250 551 -246 541 -239 ct 532 -232 526 -221 524 -205 ct 
+476 -210 l  484 -260 521 -285 588 -285 ct 623 -285 650 -277 667 -261 ct 685 -245 694 -221 694 -191 ct 
+694 -71 l  694 -57 696 -46 699 -39 ct 703 -32 710 -29 720 -29 ct 724 -29 730 -30 735 -31 ct 
+735 -2 l  724 1 712 2 699 2 ct 682 2 670 -2 662 -11 ct 654 -20 649 -34 648 -54 ct 
+647 -54 l  635 -32 621 -17 605 -8 ct 590 1 571 5 548 5 ct p
+559 -30 m  576 -30 591 -34 604 -42 ct 617 -49 628 -60 635 -73 ct 643 -87 647 -101 647 -115 ct 
+647 -138 l  596 -137 l  574 -137 558 -135 546 -130 ct 535 -126 526 -120 520 -111 ct 
+514 -103 511 -91 511 -77 ct 511 -62 515 -51 524 -42 ct 532 -34 543 -30 559 -30 ct 
+p ef
+770 -340 m  770 -384 l  817 -384 l  817 -340 l  770 -340 l  p
+770 0 m  770 -280 l  817 -280 l  817 0 l  770 0 l  p ef
+1066 0 m  1066 -177 l  1066 -196 1064 -210 1061 -220 ct 1057 -231 1051 -238 1043 -242 ct 
+1035 -247 1024 -249 1009 -249 ct 986 -249 968 -241 956 -226 ct 943 -211 936 -189 936 -162 ct 
+936 0 l  890 0 l  890 -220 l  890 -253 889 -273 888 -280 ct 932 -280 l  932 -279 932 -277 933 -273 ct 
+933 -269 933 -265 933 -260 ct 933 -255 934 -246 934 -232 ct 935 -232 l  946 -251 958 -265 972 -273 ct 
+986 -281 1003 -285 1024 -285 ct 1055 -285 1077 -277 1092 -262 ct 1106 -247 1113 -222 1113 -186 ct 
+1113 0 l  1066 0 l  p ef
+1619 -255 m  1619 -220 1608 -193 1585 -173 ct 1563 -152 1532 -142 1494 -142 ct 
+1387 -142 l  1387 0 l  1337 0 l  1337 -365 l  1491 -365 l  1531 -365 1563 -355 1585 -336 ct 
+1608 -317 1619 -290 1619 -255 ct p
+1569 -254 m  1569 -301 1541 -325 1485 -325 ct 1387 -325 l  1387 -181 l  1487 -181 l 
+1542 -181 1569 -205 1569 -254 ct p ef
+1937 0 m  1937 -169 l  1740 -169 l  1740 0 l  1690 0 l  1690 -365 l  1740 -365 l 
+1740 -210 l  1937 -210 l  1937 -365 l  1986 -365 l  1986 0 l  1937 0 l 
+p ef
+2230 -151 m  2230 0 l  2181 0 l  2181 -151 l  2041 -365 l  2095 -365 l 
+2206 -191 l  2316 -365 l  2370 -365 l  2230 -151 l  p ef
+2774 -77 m  2774 -51 2764 -31 2745 -16 ct 2725 -2 2697 5 2661 5 ct 2626 5 2599 -1 2581 -12 ct 
+2562 -24 2549 -42 2544 -66 ct 2585 -74 l  2589 -59 2597 -48 2609 -41 ct 2622 -34 2639 -30 2661 -30 ct 
+2685 -30 2702 -34 2713 -41 ct 2724 -49 2729 -59 2729 -74 ct 2729 -85 2725 -94 2718 -101 ct 
+2710 -108 2698 -113 2681 -118 ct 2648 -127 l  2621 -133 2602 -140 2591 -147 ct 
+2580 -153 2571 -162 2564 -171 ct 2558 -180 2555 -192 2555 -206 ct 2555 -231 2564 -251 2582 -264 ct 
+2600 -278 2627 -284 2662 -284 ct 2692 -284 2717 -279 2735 -268 ct 2753 -257 2765 -240 2769 -216 ct 
+2728 -211 l  2725 -223 2718 -232 2707 -239 ct 2696 -246 2680 -249 2662 -249 ct 
+2641 -249 2625 -246 2615 -239 ct 2605 -233 2600 -223 2600 -210 ct 2600 -203 2602 -196 2606 -191 ct 
+2610 -186 2616 -181 2625 -178 ct 2633 -174 2650 -169 2676 -163 ct 2700 -156 2718 -151 2729 -146 ct 
+2740 -140 2748 -134 2755 -128 ct 2761 -122 2766 -114 2769 -106 ct 2773 -98 2774 -88 2774 -77 ct 
+p ef
+3097 0 m  3043 0 l  2994 -198 l  2985 -242 l  2984 -234 2981 -223 2978 -208 ct 
+2975 -194 2957 -124 2925 0 ct 2871 0 l  2793 -280 l  2839 -280 l  2886 -90 l 
+2888 -86 2891 -69 2898 -39 ct 2902 -58 l  2960 -280 l  3010 -280 l  3059 -88 l 
+3071 -39 l  3079 -75 l  3132 -280 l  3177 -280 l  3097 0 l  p ef
+3211 -340 m  3211 -384 l  3258 -384 l  3258 -340 l  3211 -340 l  p
+3211 0 m  3211 -280 l  3258 -280 l  3258 0 l  3211 0 l  p ef
+3436 -2 m  3421 2 3405 4 3389 4 ct 3352 4 3333 -17 3333 -59 ct 3333 -246 l  3301 -246 l 
+3301 -280 l  3335 -280 l  3349 -343 l  3380 -343 l  3380 -280 l  3431 -280 l 
+3431 -246 l  3380 -246 l  3380 -69 l  3380 -56 3382 -47 3386 -41 ct 3391 -36 3398 -33 3409 -33 ct 
+3415 -33 3424 -34 3436 -37 ct 3436 -2 l  p ef
+3511 -141 m  3511 -104 3517 -77 3529 -59 ct 3540 -41 3558 -32 3582 -32 ct 3598 -32 3612 -36 3623 -45 ct 
+3634 -54 3641 -68 3644 -87 ct 3691 -83 l  3687 -57 3675 -35 3656 -19 ct 3637 -3 3612 5 3583 5 ct 
+3544 5 3514 -7 3493 -32 ct 3473 -57 3462 -93 3462 -140 ct 3462 -187 3473 -223 3493 -248 ct 
+3514 -273 3544 -285 3582 -285 ct 3611 -285 3635 -278 3653 -263 ct 3672 -248 3684 -228 3689 -202 ct 
+3641 -198 l  3639 -213 3633 -226 3623 -235 ct 3613 -244 3599 -249 3581 -249 ct 
+3556 -249 3539 -240 3528 -224 ct 3517 -208 3511 -180 3511 -141 ct p ef
+3787 -232 m  3797 -250 3809 -264 3823 -272 ct 3837 -281 3855 -285 3876 -285 ct 
+3907 -285 3929 -277 3943 -262 ct 3958 -247 3965 -222 3965 -186 ct 3965 0 l  3918 0 l 
+3918 -177 l  3918 -197 3916 -212 3913 -221 ct 3909 -231 3903 -238 3895 -242 ct 
+3887 -247 3875 -249 3861 -249 ct 3839 -249 3821 -241 3808 -226 ct 3795 -211 3788 -191 3788 -165 ct 
+3788 0 l  3742 0 l  3742 -384 l  3788 -384 l  3788 -284 l  3788 -273 3788 -263 3787 -251 ct 
+3787 -240 3786 -234 3786 -232 ct 3787 -232 l  p ef
+pom
+pum
+17691 2654 t
+143 -2 m  128 2 112 4 96 4 ct 59 4 40 -17 40 -59 ct 40 -246 l  8 -246 l  8 -280 l 
+42 -280 l  56 -343 l  87 -343 l  87 -280 l  138 -280 l  138 -246 l  87 -246 l 
+87 -69 l  87 -56 89 -47 93 -41 ct 98 -36 105 -33 116 -33 ct 122 -33 131 -34 143 -37 ct 
+143 -2 l  p ef
+419 -140 m  419 -91 408 -55 387 -31 ct 365 -7 334 5 293 5 ct 252 5 221 -7 200 -32 ct 
+180 -57 169 -93 169 -140 ct 169 -237 211 -285 294 -285 ct 337 -285 369 -273 389 -250 ct 
+409 -226 419 -190 419 -140 ct p
+370 -140 m  370 -179 364 -207 353 -224 ct 342 -242 322 -251 295 -251 ct 268 -251 248 -242 236 -224 ct 
+224 -206 218 -178 218 -140 ct 218 -103 224 -76 236 -57 ct 248 -39 267 -29 292 -29 ct 
+320 -29 340 -38 352 -56 ct 364 -74 370 -102 370 -140 ct p ef
+624 0 m  624 -384 l  670 -384 l  670 0 l  624 0 l  p ef
+741 -340 m  741 -384 l  788 -384 l  788 -340 l  741 -340 l  p
+741 0 m  741 -280 l  788 -280 l  788 0 l  741 0 l  p ef
+1036 0 m  1036 -177 l  1036 -196 1034 -210 1031 -220 ct 1027 -231 1021 -238 1013 -242 ct 
+1005 -247 994 -249 979 -249 ct 956 -249 938 -241 926 -226 ct 913 -211 906 -189 906 -162 ct 
+906 0 l  860 0 l  860 -220 l  860 -253 859 -273 858 -280 ct 902 -280 l  902 -279 902 -277 903 -273 ct 
+903 -269 903 -265 903 -260 ct 903 -255 904 -246 904 -232 ct 905 -232 l  916 -251 928 -265 942 -273 ct 
+956 -281 973 -285 994 -285 ct 1025 -285 1047 -277 1062 -262 ct 1076 -247 1083 -222 1083 -186 ct 
+1083 0 l  1036 0 l  p ef
+1329 0 m  1234 -128 l  1200 -100 l  1200 0 l  1154 0 l  1154 -384 l  1200 -384 l 
+1200 -144 l  1323 -280 l  1377 -280 l  1264 -160 l  1383 0 l  1329 0 l 
+p ef
+1803 -182 m  1803 -122 1792 -75 1770 -43 ct 1749 -11 1717 5 1675 5 ct 1634 5 1602 -11 1581 -43 ct 
+1560 -75 1550 -121 1550 -182 ct 1550 -245 1560 -292 1580 -323 ct 1601 -354 1633 -370 1677 -370 ct 
+1720 -370 1752 -354 1772 -323 ct 1792 -291 1803 -244 1803 -182 ct p
+1755 -183 m  1755 -235 1749 -273 1737 -297 ct 1725 -320 1705 -332 1677 -332 ct 
+1648 -332 1628 -321 1615 -297 ct 1603 -274 1597 -236 1597 -183 ct 1597 -131 1603 -93 1616 -69 ct 
+1628 -45 1648 -33 1676 -33 ct 1703 -33 1723 -45 1736 -70 ct 1749 -94 1755 -132 1755 -183 ct 
+p ef
+pom
+gs
+1 lj 19537 6844 m  22773 6844 l  ps
+gr
+gs
+19250 6844 m  19550 6944 l  19550 6744 l  19250 6844 l  p ef
+gr
+gs
+23060 6844 m  22760 6744 l  22760 6944 l  23060 6844 l  p ef
+gr
+gs
+0 lw 1 lj 19250 7544 m  19250 6644 l  ps
+gr
+gs
+0 lw 1 lj 23060 7544 m  23060 6644 l  ps
+gr
+pum
+19304 7467 t
+353 0 m  353 -243 l  353 -270 354 -296 355 -321 ct 347 -290 339 -266 332 -248 ct 
+238 0 l  204 0 l  108 -248 l  94 -292 l  86 -321 l  86 -292 l  87 -243 l 
+87 0 l  43 0 l  43 -365 l  108 -365 l  205 -112 l  209 -102 212 -91 215 -79 ct 
+218 -67 220 -59 221 -54 ct 223 -61 226 -71 230 -85 ct 234 -99 237 -108 239 -112 ct 
+334 -365 l  397 -365 l  397 0 l  353 0 l  p ef
+548 5 m  520 5 499 -2 485 -17 ct 471 -32 463 -52 463 -78 ct 463 -107 473 -129 492 -145 ct 
+511 -160 542 -169 584 -170 ct 647 -171 l  647 -186 l  647 -209 642 -225 632 -235 ct 
+623 -245 608 -250 587 -250 ct 566 -250 551 -246 541 -239 ct 532 -232 526 -221 524 -205 ct 
+476 -210 l  484 -260 521 -285 588 -285 ct 623 -285 650 -277 667 -261 ct 685 -245 694 -221 694 -191 ct 
+694 -71 l  694 -57 696 -46 699 -39 ct 703 -32 710 -29 720 -29 ct 724 -29 730 -30 735 -31 ct 
+735 -2 l  724 1 712 2 699 2 ct 682 2 670 -2 662 -11 ct 654 -20 649 -34 648 -54 ct 
+647 -54 l  635 -32 621 -17 605 -8 ct 590 1 571 5 548 5 ct p
+559 -30 m  576 -30 591 -34 604 -42 ct 617 -49 628 -60 635 -73 ct 643 -87 647 -101 647 -115 ct 
+647 -138 l  596 -137 l  574 -137 558 -135 546 -130 ct 535 -126 526 -120 520 -111 ct 
+514 -103 511 -91 511 -77 ct 511 -62 515 -51 524 -42 ct 532 -34 543 -30 559 -30 ct 
+p ef
+770 -340 m  770 -384 l  817 -384 l  817 -340 l  770 -340 l  p
+770 0 m  770 -280 l  817 -280 l  817 0 l  770 0 l  p ef
+1066 0 m  1066 -177 l  1066 -196 1064 -210 1061 -220 ct 1057 -231 1051 -238 1043 -242 ct 
+1035 -247 1024 -249 1009 -249 ct 986 -249 968 -241 956 -226 ct 943 -211 936 -189 936 -162 ct 
+936 0 l  890 0 l  890 -220 l  890 -253 889 -273 888 -280 ct 932 -280 l  932 -279 932 -277 933 -273 ct 
+933 -269 933 -265 933 -260 ct 933 -255 934 -246 934 -232 ct 935 -232 l  946 -251 958 -265 972 -273 ct 
+986 -281 1003 -285 1024 -285 ct 1055 -285 1077 -277 1092 -262 ct 1106 -247 1113 -222 1113 -186 ct 
+1113 0 l  1066 0 l  p ef
+1619 -255 m  1619 -220 1608 -193 1585 -173 ct 1563 -152 1532 -142 1494 -142 ct 
+1387 -142 l  1387 0 l  1337 0 l  1337 -365 l  1491 -365 l  1531 -365 1563 -355 1585 -336 ct 
+1608 -317 1619 -290 1619 -255 ct p
+1569 -254 m  1569 -301 1541 -325 1485 -325 ct 1387 -325 l  1387 -181 l  1487 -181 l 
+1542 -181 1569 -205 1569 -254 ct p ef
+1937 0 m  1937 -169 l  1740 -169 l  1740 0 l  1690 0 l  1690 -365 l  1740 -365 l 
+1740 -210 l  1937 -210 l  1937 -365 l  1986 -365 l  1986 0 l  1937 0 l 
+p ef
+2230 -151 m  2230 0 l  2181 0 l  2181 -151 l  2041 -365 l  2095 -365 l 
+2206 -191 l  2316 -365 l  2370 -365 l  2230 -151 l  p ef
+2774 -77 m  2774 -51 2764 -31 2745 -16 ct 2725 -2 2697 5 2661 5 ct 2626 5 2599 -1 2581 -12 ct 
+2562 -24 2549 -42 2544 -66 ct 2585 -74 l  2589 -59 2597 -48 2609 -41 ct 2622 -34 2639 -30 2661 -30 ct 
+2685 -30 2702 -34 2713 -41 ct 2724 -49 2729 -59 2729 -74 ct 2729 -85 2725 -94 2718 -101 ct 
+2710 -108 2698 -113 2681 -118 ct 2648 -127 l  2621 -133 2602 -140 2591 -147 ct 
+2580 -153 2571 -162 2564 -171 ct 2558 -180 2555 -192 2555 -206 ct 2555 -231 2564 -251 2582 -264 ct 
+2600 -278 2627 -284 2662 -284 ct 2692 -284 2717 -279 2735 -268 ct 2753 -257 2765 -240 2769 -216 ct 
+2728 -211 l  2725 -223 2718 -232 2707 -239 ct 2696 -246 2680 -249 2662 -249 ct 
+2641 -249 2625 -246 2615 -239 ct 2605 -233 2600 -223 2600 -210 ct 2600 -203 2602 -196 2606 -191 ct 
+2610 -186 2616 -181 2625 -178 ct 2633 -174 2650 -169 2676 -163 ct 2700 -156 2718 -151 2729 -146 ct 
+2740 -140 2748 -134 2755 -128 ct 2761 -122 2766 -114 2769 -106 ct 2773 -98 2774 -88 2774 -77 ct 
+p ef
+3097 0 m  3043 0 l  2994 -198 l  2985 -242 l  2984 -234 2981 -223 2978 -208 ct 
+2975 -194 2957 -124 2925 0 ct 2871 0 l  2793 -280 l  2839 -280 l  2886 -90 l 
+2888 -86 2891 -69 2898 -39 ct 2902 -58 l  2960 -280 l  3010 -280 l  3059 -88 l 
+3071 -39 l  3079 -75 l  3132 -280 l  3177 -280 l  3097 0 l  p ef
+3211 -340 m  3211 -384 l  3258 -384 l  3258 -340 l  3211 -340 l  p
+3211 0 m  3211 -280 l  3258 -280 l  3258 0 l  3211 0 l  p ef
+3436 -2 m  3421 2 3405 4 3389 4 ct 3352 4 3333 -17 3333 -59 ct 3333 -246 l  3301 -246 l 
+3301 -280 l  3335 -280 l  3349 -343 l  3380 -343 l  3380 -280 l  3431 -280 l 
+3431 -246 l  3380 -246 l  3380 -69 l  3380 -56 3382 -47 3386 -41 ct 3391 -36 3398 -33 3409 -33 ct 
+3415 -33 3424 -34 3436 -37 ct 3436 -2 l  p ef
+3511 -141 m  3511 -104 3517 -77 3529 -59 ct 3540 -41 3558 -32 3582 -32 ct 3598 -32 3612 -36 3623 -45 ct 
+3634 -54 3641 -68 3644 -87 ct 3691 -83 l  3687 -57 3675 -35 3656 -19 ct 3637 -3 3612 5 3583 5 ct 
+3544 5 3514 -7 3493 -32 ct 3473 -57 3462 -93 3462 -140 ct 3462 -187 3473 -223 3493 -248 ct 
+3514 -273 3544 -285 3582 -285 ct 3611 -285 3635 -278 3653 -263 ct 3672 -248 3684 -228 3689 -202 ct 
+3641 -198 l  3639 -213 3633 -226 3623 -235 ct 3613 -244 3599 -249 3581 -249 ct 
+3556 -249 3539 -240 3528 -224 ct 3517 -208 3511 -180 3511 -141 ct p ef
+3787 -232 m  3797 -250 3809 -264 3823 -272 ct 3837 -281 3855 -285 3876 -285 ct 
+3907 -285 3929 -277 3943 -262 ct 3958 -247 3965 -222 3965 -186 ct 3965 0 l  3918 0 l 
+3918 -177 l  3918 -197 3916 -212 3913 -221 ct 3909 -231 3903 -238 3895 -242 ct 
+3887 -247 3875 -249 3861 -249 ct 3839 -249 3821 -241 3808 -226 ct 3795 -211 3788 -191 3788 -165 ct 
+3788 0 l  3742 0 l  3742 -384 l  3788 -384 l  3788 -284 l  3788 -273 3788 -263 3787 -251 ct 
+3787 -240 3786 -234 3786 -232 ct 3787 -232 l  p ef
+pom
+pum
+19465 8055 t
+143 -2 m  128 2 112 4 96 4 ct 59 4 40 -17 40 -59 ct 40 -246 l  8 -246 l  8 -280 l 
+42 -280 l  56 -343 l  87 -343 l  87 -280 l  138 -280 l  138 -246 l  87 -246 l 
+87 -69 l  87 -56 89 -47 93 -41 ct 98 -36 105 -33 116 -33 ct 122 -33 131 -34 143 -37 ct 
+143 -2 l  p ef
+419 -140 m  419 -91 408 -55 387 -31 ct 365 -7 334 5 293 5 ct 252 5 221 -7 200 -32 ct 
+180 -57 169 -93 169 -140 ct 169 -237 211 -285 294 -285 ct 337 -285 369 -273 389 -250 ct 
+409 -226 419 -190 419 -140 ct p
+370 -140 m  370 -179 364 -207 353 -224 ct 342 -242 322 -251 295 -251 ct 268 -251 248 -242 236 -224 ct 
+224 -206 218 -178 218 -140 ct 218 -103 224 -76 236 -57 ct 248 -39 267 -29 292 -29 ct 
+320 -29 340 -38 352 -56 ct 364 -74 370 -102 370 -140 ct p ef
+860 -141 m  860 -43 826 5 757 5 ct 714 5 685 -11 670 -43 ct 669 -43 l  670 -42 670 -27 670 1 ct 
+670 110 l  624 110 l  624 -223 l  624 -252 623 -271 622 -280 ct 667 -280 l 
+667 -279 667 -277 668 -273 ct 668 -268 669 -262 669 -253 ct 669 -244 670 -238 670 -235 ct 
+671 -235 l  679 -252 690 -265 703 -273 ct 717 -281 735 -285 757 -285 ct 792 -285 817 -273 834 -250 ct 
+851 -227 860 -191 860 -141 ct p
+811 -140 m  811 -179 806 -207 795 -224 ct 785 -241 768 -249 745 -249 ct 727 -249 712 -245 702 -237 ct 
+692 -230 684 -217 678 -201 ct 673 -184 670 -163 670 -137 ct 670 -100 676 -73 688 -55 ct 
+699 -38 718 -29 745 -29 ct 768 -29 785 -38 795 -55 ct 806 -72 811 -100 811 -140 ct 
+p ef
+920 0 m  920 -215 l  920 -234 919 -256 918 -280 ct 962 -280 l  963 -248 964 -229 964 -223 ct 
+965 -223 l  973 -247 981 -263 991 -272 ct 1000 -281 1014 -285 1032 -285 ct 1038 -285 1044 -284 1050 -282 ct 
+1050 -240 l  1044 -241 1036 -242 1026 -242 ct 1006 -242 992 -234 981 -217 ct 
+971 -201 966 -177 966 -146 ct 966 0 l  920 0 l  p ef
+1130 -130 m  1130 -98 1137 -73 1150 -56 ct 1163 -39 1183 -30 1208 -30 ct 1228 -30 1245 -34 1257 -42 ct 
+1269 -50 1277 -60 1281 -73 ct 1322 -61 l  1306 -17 1268 5 1208 5 ct 1167 5 1136 -7 1114 -32 ct 
+1092 -57 1081 -93 1081 -142 ct 1081 -188 1092 -223 1114 -248 ct 1136 -273 1166 -285 1206 -285 ct 
+1289 -285 1330 -236 1330 -137 ct 1330 -130 l  1130 -130 l  p
+1282 -166 m  1279 -195 1272 -217 1259 -230 ct 1247 -244 1229 -251 1206 -251 ct 
+1183 -251 1165 -243 1152 -228 ct 1139 -213 1132 -192 1131 -166 ct 1282 -166 l 
+p ef
+1446 -247 m  1446 -1 l  1400 -1 l  1400 -247 l  1360 -247 l  1360 -281 l 
+1400 -281 l  1400 -312 l  1400 -338 1405 -356 1417 -367 ct 1428 -378 1445 -384 1468 -384 ct 
+1481 -384 1492 -383 1501 -381 ct 1501 -345 l  1493 -347 1486 -348 1480 -348 ct 
+1468 -348 1460 -345 1454 -339 ct 1449 -333 1446 -322 1446 -306 ct 1446 -281 l 
+1501 -281 l  1501 -247 l  1446 -247 l  p ef
+1571 -130 m  1571 -98 1578 -73 1591 -56 ct 1604 -39 1624 -30 1649 -30 ct 1669 -30 1686 -34 1698 -42 ct 
+1710 -50 1718 -60 1722 -73 ct 1763 -61 l  1747 -17 1709 5 1649 5 ct 1608 5 1577 -7 1555 -32 ct 
+1533 -57 1522 -93 1522 -142 ct 1522 -188 1533 -223 1555 -248 ct 1577 -273 1607 -285 1647 -285 ct 
+1730 -285 1771 -236 1771 -137 ct 1771 -130 l  1571 -130 l  p
+1723 -166 m  1720 -195 1713 -217 1700 -230 ct 1688 -244 1670 -251 1647 -251 ct 
+1624 -251 1606 -243 1593 -228 ct 1580 -213 1573 -192 1572 -166 ct 1723 -166 l 
+p ef
+1831 0 m  1831 -215 l  1831 -234 1830 -256 1829 -280 ct 1873 -280 l  1874 -248 1875 -229 1875 -223 ct 
+1876 -223 l  1884 -247 1892 -263 1902 -272 ct 1911 -281 1925 -285 1943 -285 ct 
+1949 -285 1955 -284 1961 -282 ct 1961 -240 l  1955 -241 1947 -242 1937 -242 ct 
+1917 -242 1903 -234 1892 -217 ct 1882 -201 1877 -177 1877 -146 ct 1877 0 l  1831 0 l 
+p ef
+2008 0 m  2008 -215 l  2008 -234 2007 -256 2006 -280 ct 2050 -280 l  2051 -248 2052 -229 2052 -223 ct 
+2053 -223 l  2061 -247 2069 -263 2079 -272 ct 2088 -281 2102 -285 2120 -285 ct 
+2126 -285 2132 -284 2138 -282 ct 2138 -240 l  2132 -241 2124 -242 2114 -242 ct 
+2094 -242 2080 -234 2069 -217 ct 2059 -201 2054 -177 2054 -146 ct 2054 0 l  2008 0 l 
+p ef
+2218 -130 m  2218 -98 2225 -73 2238 -56 ct 2251 -39 2271 -30 2296 -30 ct 2316 -30 2333 -34 2345 -42 ct 
+2357 -50 2365 -60 2369 -73 ct 2410 -61 l  2394 -17 2356 5 2296 5 ct 2255 5 2224 -7 2202 -32 ct 
+2180 -57 2169 -93 2169 -142 ct 2169 -188 2180 -223 2202 -248 ct 2224 -273 2254 -285 2294 -285 ct 
+2377 -285 2418 -236 2418 -137 ct 2418 -130 l  2218 -130 l  p
+2370 -166 m  2367 -195 2360 -217 2347 -230 ct 2335 -244 2317 -251 2294 -251 ct 
+2271 -251 2253 -243 2240 -228 ct 2227 -213 2220 -192 2219 -166 ct 2370 -166 l 
+p ef
+2653 -45 m  2644 -27 2633 -14 2619 -7 ct 2605 1 2587 5 2566 5 ct 2531 5 2505 -7 2488 -31 ct 
+2472 -55 2463 -91 2463 -139 ct 2463 -237 2497 -285 2566 -285 ct 2587 -285 2605 -282 2619 -274 ct 
+2633 -266 2644 -254 2653 -237 ct 2654 -237 l  2653 -268 l  2653 -384 l  2700 -384 l 
+2700 -58 l  2700 -29 2700 -10 2701 0 ct 2657 0 l  2656 -3 2656 -9 2655 -19 ct 
+2654 -29 2654 -38 2654 -45 ct 2653 -45 l  p
+2512 -140 m  2512 -101 2517 -73 2528 -56 ct 2538 -39 2555 -31 2578 -31 ct 2604 -31 2623 -40 2635 -58 ct 
+2647 -77 2653 -105 2653 -144 ct 2653 -181 2647 -208 2635 -225 ct 2623 -242 2604 -251 2578 -251 ct 
+2555 -251 2538 -242 2528 -225 ct 2517 -208 2512 -179 2512 -140 ct p ef
+2919 0 m  2919 -384 l  2965 -384 l  2965 0 l  2919 0 l  p ef
+3035 -340 m  3035 -384 l  3082 -384 l  3082 -340 l  3035 -340 l  p
+3035 0 m  3035 -280 l  3082 -280 l  3082 0 l  3035 0 l  p ef
+3331 0 m  3331 -177 l  3331 -196 3329 -210 3326 -220 ct 3322 -231 3316 -238 3308 -242 ct 
+3300 -247 3289 -249 3274 -249 ct 3251 -249 3233 -241 3221 -226 ct 3208 -211 3201 -189 3201 -162 ct 
+3201 0 l  3155 0 l  3155 -220 l  3155 -253 3154 -273 3153 -280 ct 3197 -280 l 
+3197 -279 3197 -277 3198 -273 ct 3198 -269 3198 -265 3198 -260 ct 3198 -255 3199 -246 3199 -232 ct 
+3200 -232 l  3211 -251 3223 -265 3237 -273 ct 3251 -281 3268 -285 3289 -285 ct 
+3320 -285 3342 -277 3357 -262 ct 3371 -247 3378 -222 3378 -186 ct 3378 0 l  3331 0 l 
+p ef
+3623 0 m  3528 -128 l  3494 -100 l  3494 0 l  3448 0 l  3448 -384 l  3494 -384 l 
+3494 -144 l  3617 -280 l  3671 -280 l  3558 -160 l  3677 0 l  3623 0 l 
+p ef
+pom
+gs
+0.507 0.832 0.109 c 4307 6618 m  3206 6618 l  3206 5348 l  5406 5348 l 
+5406 6618 l  4307 6618 l  p ef
+gr
+gs
+0 lw 1 lj 0.210 0.398 0.644 c 4307 6618 m  3206 6618 l  3206 5348 l  5406 5348 l 
+5406 6618 l  4307 6618 l  pc
+gr
+gs
+0.007 0.007 0.007 c 4036 6202 m  3921 6022 l  3785 6022 l  3785 6202 l  3726 6202 l 
+3726 5766 l  3932 5766 l  3981 5766 4019 5777 4047 5799 ct 4073 5821 4087 5851 4087 5890 ct 
+4087 5923 4077 5951 4058 5973 ct 4039 5995 4012 6009 3979 6015 ct 4104 6202 l 
+4036 6202 l  p
+4026 5891 m  4026 5866 4018 5846 4000 5833 ct 3983 5820 3958 5813 3926 5813 ct 
+3785 5813 l  3785 5975 l  3928 5975 l  3959 5975 3984 5968 4001 5953 ct 4018 5938 4026 5917 4026 5891 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 4347 5814 m  4347 6203 l  4288 6203 l  4288 5814 l  4137 5814 l 
+4137 5766 l  4497 5766 l  4497 5814 l  4347 5814 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 4907 6081 m  4907 6122 4892 6154 4860 6176 ct 4829 6198 4784 6209 4726 6209 ct 
+4619 6209 4558 6172 4541 6097 ct 4598 6085 l  4605 6112 4619 6132 4640 6144 ct 
+4662 6157 4691 6163 4728 6163 ct 4767 6163 4797 6156 4818 6143 ct 4838 6130 4849 6110 4849 6084 ct 
+4849 6070 4846 6059 4839 6050 ct 4833 6041 4823 6034 4812 6028 ct 4800 6023 4786 6018 4769 6014 ct 
+4753 6010 4734 6006 4714 6001 ct 4680 5993 4653 5986 4636 5978 ct 4618 5970 4604 5962 4593 5953 ct 
+4583 5943 4575 5932 4570 5919 ct 4564 5907 4561 5892 4561 5876 ct 4561 5839 4576 5810 4604 5789 ct 
+4633 5769 4674 5759 4727 5759 ct 4778 5759 4816 5767 4842 5782 ct 4868 5797 4887 5823 4896 5860 ct 
+4839 5870 l  4832 5847 4820 5830 4802 5819 ct 4784 5809 4759 5804 4727 5804 ct 
+4692 5804 4665 5809 4647 5821 ct 4628 5833 4619 5850 4619 5873 ct 4619 5886 4623 5897 4630 5906 ct 
+4637 5915 4647 5922 4661 5929 ct 4674 5935 4701 5942 4742 5951 ct 4755 5954 4769 5957 4782 5961 ct 
+4795 5964 4808 5968 4820 5972 ct 4832 5977 4844 5982 4855 5988 ct 4865 5994 4874 6001 4882 6010 ct 
+4890 6018 4896 6029 4901 6040 ct 4905 6052 4907 6065 4907 6081 ct p ef
+gr
+gs
+1.000 0.714 0.425 c 7006 5119 m  5905 5119 l  5905 3850 l  8106 3850 l 
+8106 5119 l  7006 5119 l  p ef
+gr
+gs
+0 lw 1 lj 0.210 0.398 0.644 c 7006 5119 m  5905 5119 l  5905 3850 l  8106 3850 l 
+8106 5119 l  7006 5119 l  pc
+gr
+gs
+0.007 0.007 0.007 c 6616 4308 m  6567 4308 6530 4325 6503 4356 ct 6476 4387 6462 4430 6462 4484 ct 
+6462 4538 6476 4581 6504 4613 ct 6532 4646 6570 4662 6618 4662 ct 6679 4662 6725 4632 6756 4571 ct 
+6804 4596 l  6786 4633 6761 4662 6729 4682 ct 6696 4701 6658 4711 6615 4711 ct 
+6571 4711 6533 4702 6501 4684 ct 6469 4665 6443 4639 6427 4605 ct 6410 4571 6401 4531 6401 4484 ct 
+6401 4414 6420 4360 6459 4319 ct 6496 4280 6548 4260 6615 4260 ct 6661 4260 6700 4269 6732 4287 ct 
+6763 4306 6786 4334 6800 4369 ct 6744 4388 l  6734 4362 6718 4343 6695 4330 ct 
+6673 4315 6646 4308 6616 4308 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 7050 4315 m  7050 4705 l  6990 4705 l  6990 4315 l  6840 4315 l 
+6840 4267 l  7200 4267 l  7200 4315 l  7050 4315 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 7611 4584 m  7611 4624 7596 4656 7564 4678 ct 7533 4700 7488 4711 7431 4711 ct 
+7324 4711 7262 4674 7245 4600 ct 7303 4588 l  7310 4615 7324 4634 7345 4646 ct 
+7367 4659 7396 4665 7433 4665 ct 7471 4665 7501 4658 7522 4645 ct 7542 4632 7553 4613 7553 4587 ct 
+7553 4573 7550 4561 7543 4552 ct 7537 4544 7527 4536 7516 4530 ct 7504 4525 7490 4520 7473 4516 ct 
+7457 4512 7439 4508 7419 4503 ct 7385 4495 7358 4488 7341 4480 ct 7323 4472 7309 4464 7298 4455 ct 
+7288 4445 7279 4434 7274 4421 ct 7268 4409 7265 4394 7265 4378 ct 7265 4341 7280 4311 7309 4290 ct 
+7338 4270 7379 4260 7432 4260 ct 7482 4260 7520 4268 7546 4283 ct 7572 4298 7591 4325 7601 4362 ct 
+7543 4372 l  7536 4349 7524 4332 7506 4321 ct 7488 4310 7463 4305 7432 4305 ct 
+7397 4305 7370 4310 7352 4323 ct 7333 4335 7324 4352 7324 4375 ct 7324 4388 7328 4399 7335 4408 ct 
+7342 4417 7352 4424 7366 4431 ct 7379 4437 7406 4444 7446 4453 ct 7459 4456 7473 4459 7486 4463 ct 
+7499 4466 7512 4470 7524 4474 ct 7536 4479 7548 4484 7559 4490 ct 7569 4496 7578 4503 7586 4512 ct 
+7594 4520 7600 4531 7605 4542 ct 7609 4554 7611 4568 7611 4584 ct p ef
+gr
+gs
+1.000 0.003 0.003 c 5904 4944 m  6026 4821 l  6189 4985 l  6353 4821 l  6476 4943 l 
+6312 5107 l  6476 5271 l  6353 5393 l  6189 5229 l  6026 5393 l  5904 5270 l 
+6067 5107 l  5904 4944 l  5904 4944 l  p ef
+gr
+gs
+0 lw 1 lj 0.750 0.003 0.257 c 5904 4944 m  6026 4821 l  6189 4985 l  6353 4821 l 
+6476 4943 l  6312 5107 l  6476 5271 l  6353 5393 l  6189 5229 l  6026 5393 l 
+5904 5270 l  6067 5107 l  5904 4944 l  5904 4944 l  pc
+gr
+gs
+0 lw 1 lj [ 215.6 80.85 ] 0 ld
+6750 5253 m  6750 8428 l  ps
+gr
+pum
+5185 8996 t
+218 -351 m  175 -351 142 -337 118 -309 ct 94 -282 82 -244 82 -196 ct 82 -148 95 -110 119 -81 ct 
+144 -52 178 -37 220 -37 ct 275 -37 316 -64 343 -118 ct 386 -97 l  370 -63 347 -38 318 -20 ct 
+290 -3 256 6 218 6 ct 179 6 145 -2 116 -18 ct 88 -35 66 -58 51 -88 ct 36 -118 29 -154 29 -196 ct 
+29 -258 45 -306 79 -341 ct 112 -376 158 -394 218 -394 ct 259 -394 293 -386 321 -370 ct 
+349 -354 369 -330 382 -298 ct 332 -281 l  323 -304 309 -321 289 -333 ct 269 -345 245 -351 218 -351 ct 
+p ef
+605 -346 m  605 -1 l  553 -1 l  553 -346 l  420 -346 l  420 -389 l  739 -389 l 
+739 -346 l  605 -346 l  p ef
+1101 -107 m  1101 -71 1087 -43 1059 -24 ct 1031 -4 992 6 941 6 ct 846 6 792 -27 777 -93 ct 
+828 -103 l  833 -80 846 -62 865 -52 ct 884 -41 910 -35 943 -35 ct 977 -35 1003 -41 1022 -53 ct 
+1040 -64 1049 -81 1049 -104 ct 1049 -117 1046 -127 1041 -135 ct 1035 -143 1027 -149 1016 -155 ct 
+1006 -160 993 -164 979 -168 ct 964 -171 948 -175 931 -179 ct 900 -186 877 -192 861 -199 ct 
+845 -206 832 -214 823 -222 ct 814 -230 807 -240 802 -251 ct 797 -263 795 -275 795 -290 ct 
+795 -323 808 -349 833 -367 ct 858 -385 895 -394 942 -394 ct 986 -394 1020 -387 1043 -374 ct 
+1067 -360 1083 -337 1092 -305 ct 1040 -296 l  1035 -316 1024 -331 1008 -340 ct 
+992 -350 970 -354 942 -354 ct 911 -354 887 -349 871 -339 ct 854 -329 846 -313 846 -293 ct 
+846 -281 849 -271 856 -263 ct 862 -255 871 -249 883 -243 ct 895 -238 919 -231 954 -223 ct 
+966 -220 978 -218 990 -215 ct 1002 -212 1013 -209 1024 -205 ct 1035 -201 1045 -196 1054 -191 ct 
+1064 -185 1072 -179 1079 -171 ct 1086 -163 1091 -154 1095 -144 ct 1099 -133 1101 -121 1101 -107 ct 
+p ef
+1435 -3 m  1418 2 1402 4 1384 4 ct 1345 4 1325 -19 1325 -64 ct 1325 -263 l  1291 -263 l 
+1291 -299 l  1327 -299 l  1341 -366 l  1375 -366 l  1375 -299 l  1430 -299 l 
+1430 -263 l  1375 -263 l  1375 -74 l  1375 -60 1377 -50 1382 -44 ct 1386 -38 1394 -35 1406 -35 ct 
+1413 -35 1422 -37 1435 -39 ct 1435 -3 l  p ef
+1477 -362 m  1477 -409 l  1526 -409 l  1526 -362 l  1477 -362 l  p
+1477 0 m  1477 -298 l  1526 -298 l  1526 0 l  1477 0 l  p ef
+1776 0 m  1776 -189 l  1776 -218 1772 -238 1764 -249 ct 1756 -260 1742 -266 1721 -266 ct 
+1700 -266 1683 -258 1671 -241 ct 1659 -225 1652 -202 1652 -173 ct 1652 0 l  1603 0 l 
+1603 -235 l  1603 -270 1603 -291 1601 -298 ct 1648 -298 l  1648 -298 1649 -295 1649 -291 ct 
+1649 -287 1649 -282 1650 -277 ct 1650 -272 1650 -262 1650 -247 ct 1651 -247 l 
+1662 -269 1674 -283 1688 -292 ct 1702 -300 1719 -304 1738 -304 ct 1761 -304 1779 -300 1792 -290 ct 
+1805 -281 1814 -267 1819 -247 ct 1820 -247 l  1830 -268 1843 -282 1857 -291 ct 
+1872 -300 1890 -304 1910 -304 ct 1941 -304 1962 -296 1976 -279 ct 1990 -263 1997 -236 1997 -199 ct 
+1997 0 l  1948 0 l  1948 -189 l  1948 -218 1944 -238 1936 -249 ct 1928 -260 1914 -266 1893 -266 ct 
+1871 -266 1855 -258 1843 -242 ct 1831 -225 1825 -203 1825 -173 ct 1825 0 l  1776 0 l 
+p ef
+2109 -138 m  2109 -104 2116 -78 2130 -59 ct 2144 -41 2165 -31 2192 -31 ct 2214 -31 2231 -36 2244 -44 ct 
+2257 -53 2266 -64 2270 -77 ct 2314 -65 l  2296 -18 2255 6 2192 6 ct 2148 6 2115 -7 2092 -33 ct 
+2068 -60 2057 -99 2057 -151 ct 2057 -200 2068 -238 2092 -264 ct 2115 -291 2147 -304 2190 -304 ct 
+2278 -304 2322 -251 2322 -145 ct 2322 -138 l  2109 -138 l  p
+2270 -176 m  2268 -208 2260 -231 2246 -245 ct 2233 -260 2214 -267 2189 -267 ct 
+2165 -267 2146 -259 2132 -243 ct 2118 -227 2111 -204 2110 -176 ct 2270 -176 l 
+p ef
+2636 -149 m  2636 -97 2625 -58 2602 -32 ct 2579 -7 2545 6 2502 6 ct 2458 6 2425 -7 2403 -34 ct 
+2381 -60 2370 -99 2370 -149 ct 2370 -252 2414 -304 2503 -304 ct 2549 -304 2582 -291 2604 -266 ct 
+2625 -241 2636 -202 2636 -149 ct p
+2584 -149 m  2584 -190 2578 -220 2566 -239 ct 2553 -258 2533 -267 2504 -267 ct 
+2475 -267 2454 -257 2441 -238 ct 2428 -219 2422 -190 2422 -149 ct 2422 -110 2428 -80 2441 -60 ct 
+2454 -41 2474 -31 2501 -31 ct 2531 -31 2552 -40 2565 -59 ct 2578 -79 2584 -108 2584 -149 ct 
+p ef
+2745 -298 m  2745 -109 l  2745 -89 2747 -74 2751 -63 ct 2755 -52 2761 -44 2770 -40 ct 
+2778 -35 2791 -32 2807 -32 ct 2831 -32 2850 -41 2863 -57 ct 2877 -73 2884 -96 2884 -125 ct 
+2884 -298 l  2934 -298 l  2934 -63 l  2934 -28 2934 -7 2935 0 ct 2888 0 l 
+2888 0 2888 -3 2888 -7 ct 2888 -11 2887 -16 2887 -21 ct 2887 -26 2887 -36 2886 -51 ct 
+2885 -51 l  2874 -30 2861 -15 2846 -7 ct 2831 2 2812 6 2790 6 ct 2757 6 2733 -2 2718 -18 ct 
+2703 -35 2696 -62 2696 -99 ct 2696 -298 l  2745 -298 l  p ef
+3125 -3 m  3108 2 3092 4 3074 4 ct 3035 4 3015 -19 3015 -64 ct 3015 -263 l  2981 -263 l 
+2981 -299 l  3017 -299 l  3031 -366 l  3065 -366 l  3065 -299 l  3120 -299 l 
+3120 -263 l  3065 -263 l  3065 -74 l  3065 -60 3067 -50 3072 -44 ct 3076 -38 3084 -35 3096 -35 ct 
+3103 -35 3112 -37 3125 -39 ct 3125 -3 l  p ef
+pom
+gs
+1 lj 7048 5971 m  7763 5971 l  ps
+gr
+gs
+6761 5971 m  7061 6071 l  7061 5871 l  6761 5971 l  p ef
+gr
+gs
+8050 5971 m  7750 5871 l  7750 6071 l  8050 5971 l  p ef
+gr
+gs
+0 lw 1 lj 6761 6671 m  6761 5771 l  ps
+gr
+gs
+0 lw 1 lj 8050 6671 m  8050 5771 l  ps
+gr
+pum
+6885 5796 t
+39 0 m  39 -229 l  39 -250 39 -273 37 -298 ct 84 -298 l  86 -265 86 -244 86 -238 ct 
+88 -238 l  95 -263 105 -281 115 -290 ct 125 -299 140 -304 158 -304 ct 165 -304 172 -303 178 -301 ct 
+178 -256 l  172 -258 163 -258 152 -258 ct 131 -258 116 -250 105 -232 ct 94 -214 89 -189 89 -156 ct 
+89 0 l  39 0 l  p ef
+263 -138 m  263 -104 270 -78 284 -59 ct 298 -41 319 -31 346 -31 ct 368 -31 385 -36 398 -44 ct 
+411 -53 420 -64 424 -77 ct 468 -65 l  450 -18 409 6 346 6 ct 302 6 269 -7 246 -33 ct 
+222 -60 211 -99 211 -151 ct 211 -200 222 -238 246 -264 ct 269 -291 301 -304 344 -304 ct 
+432 -304 476 -251 476 -145 ct 476 -138 l  263 -138 l  p
+424 -176 m  422 -208 414 -231 400 -245 ct 387 -260 368 -267 343 -267 ct 319 -267 300 -259 286 -243 ct 
+272 -227 265 -204 264 -176 ct 424 -176 l  p ef
+713 0 m  713 -189 l  713 -218 709 -238 701 -249 ct 693 -260 679 -266 658 -266 ct 
+637 -266 620 -258 608 -241 ct 596 -225 589 -202 589 -173 ct 589 0 l  540 0 l 
+540 -235 l  540 -270 540 -291 538 -298 ct 585 -298 l  585 -298 586 -295 586 -291 ct 
+586 -287 586 -282 587 -277 ct 587 -272 587 -262 587 -247 ct 588 -247 l  599 -269 611 -283 625 -292 ct 
+639 -300 656 -304 675 -304 ct 698 -304 716 -300 729 -290 ct 742 -281 751 -267 756 -247 ct 
+757 -247 l  767 -268 780 -282 794 -291 ct 809 -300 827 -304 847 -304 ct 878 -304 899 -296 913 -279 ct 
+927 -263 934 -236 934 -199 ct 934 0 l  885 0 l  885 -189 l  885 -218 881 -238 873 -249 ct 
+865 -260 851 -266 830 -266 ct 808 -266 792 -258 780 -242 ct 768 -225 762 -203 762 -173 ct 
+762 0 l  713 0 l  p ef
+1168 -346 m  1168 -1 l  1116 -1 l  1116 -346 l  983 -346 l  983 -389 l 
+1302 -389 l  1302 -346 l  1168 -346 l  p ef
+1352 -362 m  1352 -409 l  1401 -409 l  1401 -362 l  1352 -362 l  p
+1352 0 m  1352 -298 l  1401 -298 l  1401 0 l  1352 0 l  p ef
+1651 0 m  1651 -189 l  1651 -218 1647 -238 1639 -249 ct 1631 -260 1617 -266 1596 -266 ct 
+1575 -266 1558 -258 1546 -241 ct 1534 -225 1527 -202 1527 -173 ct 1527 0 l  1478 0 l 
+1478 -235 l  1478 -270 1478 -291 1476 -298 ct 1523 -298 l  1523 -298 1524 -295 1524 -291 ct 
+1524 -287 1524 -282 1525 -277 ct 1525 -272 1525 -262 1525 -247 ct 1526 -247 l 
+1537 -269 1549 -283 1563 -292 ct 1577 -300 1594 -304 1613 -304 ct 1636 -304 1654 -300 1667 -290 ct 
+1680 -281 1689 -267 1694 -247 ct 1695 -247 l  1705 -268 1718 -282 1732 -291 ct 
+1747 -300 1765 -304 1785 -304 ct 1816 -304 1837 -296 1851 -279 ct 1865 -263 1872 -236 1872 -199 ct 
+1872 0 l  1823 0 l  1823 -189 l  1823 -218 1819 -238 1811 -249 ct 1803 -260 1789 -266 1768 -266 ct 
+1746 -266 1730 -258 1718 -242 ct 1706 -225 1700 -203 1700 -173 ct 1700 0 l  1651 0 l 
+p ef
+1984 -138 m  1984 -104 1991 -78 2005 -59 ct 2019 -41 2040 -31 2067 -31 ct 2089 -31 2106 -36 2119 -44 ct 
+2132 -53 2141 -64 2145 -77 ct 2189 -65 l  2171 -18 2130 6 2067 6 ct 2023 6 1990 -7 1967 -33 ct 
+1943 -60 1932 -99 1932 -151 ct 1932 -200 1943 -238 1967 -264 ct 1990 -291 2022 -304 2065 -304 ct 
+2153 -304 2197 -251 2197 -145 ct 2197 -138 l  1984 -138 l  p
+2145 -176 m  2143 -208 2135 -231 2121 -245 ct 2108 -260 2089 -267 2064 -267 ct 
+2040 -267 2021 -259 2007 -243 ct 1993 -227 1986 -204 1985 -176 ct 2145 -176 l 
+p ef
+pom
+gs
+1 lj 4584 2943 m  7820 2943 l  ps
+gr
+gs
+4297 2943 m  4597 3043 l  4597 2843 l  4297 2943 l  p ef
+gr
+gs
+8107 2943 m  7807 2843 l  7807 3043 l  8107 2943 l  p ef
+gr
+gs
+0 lw 1 lj 4297 3643 m  4297 2743 l  ps
+gr
+gs
+0 lw 1 lj 8107 3643 m  8107 2743 l  ps
+gr
+pum
+4103 2066 t
+353 0 m  353 -243 l  353 -270 354 -296 355 -321 ct 347 -290 339 -266 332 -248 ct 
+238 0 l  204 0 l  108 -248 l  94 -292 l  86 -321 l  86 -292 l  87 -243 l 
+87 0 l  43 0 l  43 -365 l  108 -365 l  205 -112 l  209 -102 212 -91 215 -79 ct 
+218 -67 220 -59 221 -54 ct 223 -61 226 -71 230 -85 ct 234 -99 237 -108 239 -112 ct 
+334 -365 l  397 -365 l  397 0 l  353 0 l  p ef
+548 5 m  520 5 499 -2 485 -17 ct 471 -32 463 -52 463 -78 ct 463 -107 473 -129 492 -145 ct 
+511 -160 542 -169 584 -170 ct 647 -171 l  647 -186 l  647 -209 642 -225 632 -235 ct 
+623 -245 608 -250 587 -250 ct 566 -250 551 -246 541 -239 ct 532 -232 526 -221 524 -205 ct 
+476 -210 l  484 -260 521 -285 588 -285 ct 623 -285 650 -277 667 -261 ct 685 -245 694 -221 694 -191 ct 
+694 -71 l  694 -57 696 -46 699 -39 ct 703 -32 710 -29 720 -29 ct 724 -29 730 -30 735 -31 ct 
+735 -2 l  724 1 712 2 699 2 ct 682 2 670 -2 662 -11 ct 654 -20 649 -34 648 -54 ct 
+647 -54 l  635 -32 621 -17 605 -8 ct 590 1 571 5 548 5 ct p
+559 -30 m  576 -30 591 -34 604 -42 ct 617 -49 628 -60 635 -73 ct 643 -87 647 -101 647 -115 ct 
+647 -138 l  596 -137 l  574 -137 558 -135 546 -130 ct 535 -126 526 -120 520 -111 ct 
+514 -103 511 -91 511 -77 ct 511 -62 515 -51 524 -42 ct 532 -34 543 -30 559 -30 ct 
+p ef
+770 -340 m  770 -384 l  817 -384 l  817 -340 l  770 -340 l  p
+770 0 m  770 -280 l  817 -280 l  817 0 l  770 0 l  p ef
+1066 0 m  1066 -177 l  1066 -196 1064 -210 1061 -220 ct 1057 -231 1051 -238 1043 -242 ct 
+1035 -247 1024 -249 1009 -249 ct 986 -249 968 -241 956 -226 ct 943 -211 936 -189 936 -162 ct 
+936 0 l  890 0 l  890 -220 l  890 -253 889 -273 888 -280 ct 932 -280 l  932 -279 932 -277 933 -273 ct 
+933 -269 933 -265 933 -260 ct 933 -255 934 -246 934 -232 ct 935 -232 l  946 -251 958 -265 972 -273 ct 
+986 -281 1003 -285 1024 -285 ct 1055 -285 1077 -277 1092 -262 ct 1106 -247 1113 -222 1113 -186 ct 
+1113 0 l  1066 0 l  p ef
+1619 -255 m  1619 -220 1608 -193 1585 -173 ct 1563 -152 1532 -142 1494 -142 ct 
+1387 -142 l  1387 0 l  1337 0 l  1337 -365 l  1491 -365 l  1531 -365 1563 -355 1585 -336 ct 
+1608 -317 1619 -290 1619 -255 ct p
+1569 -254 m  1569 -301 1541 -325 1485 -325 ct 1387 -325 l  1387 -181 l  1487 -181 l 
+1542 -181 1569 -205 1569 -254 ct p ef
+1937 0 m  1937 -169 l  1740 -169 l  1740 0 l  1690 0 l  1690 -365 l  1740 -365 l 
+1740 -210 l  1937 -210 l  1937 -365 l  1986 -365 l  1986 0 l  1937 0 l 
+p ef
+2230 -151 m  2230 0 l  2181 0 l  2181 -151 l  2041 -365 l  2095 -365 l 
+2206 -191 l  2316 -365 l  2370 -365 l  2230 -151 l  p ef
+2774 -77 m  2774 -51 2764 -31 2745 -16 ct 2725 -2 2697 5 2661 5 ct 2626 5 2599 -1 2581 -12 ct 
+2562 -24 2549 -42 2544 -66 ct 2585 -74 l  2589 -59 2597 -48 2609 -41 ct 2622 -34 2639 -30 2661 -30 ct 
+2685 -30 2702 -34 2713 -41 ct 2724 -49 2729 -59 2729 -74 ct 2729 -85 2725 -94 2718 -101 ct 
+2710 -108 2698 -113 2681 -118 ct 2648 -127 l  2621 -133 2602 -140 2591 -147 ct 
+2580 -153 2571 -162 2564 -171 ct 2558 -180 2555 -192 2555 -206 ct 2555 -231 2564 -251 2582 -264 ct 
+2600 -278 2627 -284 2662 -284 ct 2692 -284 2717 -279 2735 -268 ct 2753 -257 2765 -240 2769 -216 ct 
+2728 -211 l  2725 -223 2718 -232 2707 -239 ct 2696 -246 2680 -249 2662 -249 ct 
+2641 -249 2625 -246 2615 -239 ct 2605 -233 2600 -223 2600 -210 ct 2600 -203 2602 -196 2606 -191 ct 
+2610 -186 2616 -181 2625 -178 ct 2633 -174 2650 -169 2676 -163 ct 2700 -156 2718 -151 2729 -146 ct 
+2740 -140 2748 -134 2755 -128 ct 2761 -122 2766 -114 2769 -106 ct 2773 -98 2774 -88 2774 -77 ct 
+p ef
+3097 0 m  3043 0 l  2994 -198 l  2985 -242 l  2984 -234 2981 -223 2978 -208 ct 
+2975 -194 2957 -124 2925 0 ct 2871 0 l  2793 -280 l  2839 -280 l  2886 -90 l 
+2888 -86 2891 -69 2898 -39 ct 2902 -58 l  2960 -280 l  3010 -280 l  3059 -88 l 
+3071 -39 l  3079 -75 l  3132 -280 l  3177 -280 l  3097 0 l  p ef
+3211 -340 m  3211 -384 l  3258 -384 l  3258 -340 l  3211 -340 l  p
+3211 0 m  3211 -280 l  3258 -280 l  3258 0 l  3211 0 l  p ef
+3436 -2 m  3421 2 3405 4 3389 4 ct 3352 4 3333 -17 3333 -59 ct 3333 -246 l  3301 -246 l 
+3301 -280 l  3335 -280 l  3349 -343 l  3380 -343 l  3380 -280 l  3431 -280 l 
+3431 -246 l  3380 -246 l  3380 -69 l  3380 -56 3382 -47 3386 -41 ct 3391 -36 3398 -33 3409 -33 ct 
+3415 -33 3424 -34 3436 -37 ct 3436 -2 l  p ef
+3511 -141 m  3511 -104 3517 -77 3529 -59 ct 3540 -41 3558 -32 3582 -32 ct 3598 -32 3612 -36 3623 -45 ct 
+3634 -54 3641 -68 3644 -87 ct 3691 -83 l  3687 -57 3675 -35 3656 -19 ct 3637 -3 3612 5 3583 5 ct 
+3544 5 3514 -7 3493 -32 ct 3473 -57 3462 -93 3462 -140 ct 3462 -187 3473 -223 3493 -248 ct 
+3514 -273 3544 -285 3582 -285 ct 3611 -285 3635 -278 3653 -263 ct 3672 -248 3684 -228 3689 -202 ct 
+3641 -198 l  3639 -213 3633 -226 3623 -235 ct 3613 -244 3599 -249 3581 -249 ct 
+3556 -249 3539 -240 3528 -224 ct 3517 -208 3511 -180 3511 -141 ct p ef
+3787 -232 m  3797 -250 3809 -264 3823 -272 ct 3837 -281 3855 -285 3876 -285 ct 
+3907 -285 3929 -277 3943 -262 ct 3958 -247 3965 -222 3965 -186 ct 3965 0 l  3918 0 l 
+3918 -177 l  3918 -197 3916 -212 3913 -221 ct 3909 -231 3903 -238 3895 -242 ct 
+3887 -247 3875 -249 3861 -249 ct 3839 -249 3821 -241 3808 -226 ct 3795 -211 3788 -191 3788 -165 ct 
+3788 0 l  3742 0 l  3742 -384 l  3788 -384 l  3788 -284 l  3788 -273 3788 -263 3787 -251 ct 
+3787 -240 3786 -234 3786 -232 ct 3787 -232 l  p ef
+pom
+pum
+5191 2654 t
+143 -2 m  128 2 112 4 96 4 ct 59 4 40 -17 40 -59 ct 40 -246 l  8 -246 l  8 -280 l 
+42 -280 l  56 -343 l  87 -343 l  87 -280 l  138 -280 l  138 -246 l  87 -246 l 
+87 -69 l  87 -56 89 -47 93 -41 ct 98 -36 105 -33 116 -33 ct 122 -33 131 -34 143 -37 ct 
+143 -2 l  p ef
+419 -140 m  419 -91 408 -55 387 -31 ct 365 -7 334 5 293 5 ct 252 5 221 -7 200 -32 ct 
+180 -57 169 -93 169 -140 ct 169 -237 211 -285 294 -285 ct 337 -285 369 -273 389 -250 ct 
+409 -226 419 -190 419 -140 ct p
+370 -140 m  370 -179 364 -207 353 -224 ct 342 -242 322 -251 295 -251 ct 268 -251 248 -242 236 -224 ct 
+224 -206 218 -178 218 -140 ct 218 -103 224 -76 236 -57 ct 248 -39 267 -29 292 -29 ct 
+320 -29 340 -38 352 -56 ct 364 -74 370 -102 370 -140 ct p ef
+624 0 m  624 -384 l  670 -384 l  670 0 l  624 0 l  p ef
+741 -340 m  741 -384 l  788 -384 l  788 -340 l  741 -340 l  p
+741 0 m  741 -280 l  788 -280 l  788 0 l  741 0 l  p ef
+1036 0 m  1036 -177 l  1036 -196 1034 -210 1031 -220 ct 1027 -231 1021 -238 1013 -242 ct 
+1005 -247 994 -249 979 -249 ct 956 -249 938 -241 926 -226 ct 913 -211 906 -189 906 -162 ct 
+906 0 l  860 0 l  860 -220 l  860 -253 859 -273 858 -280 ct 902 -280 l  902 -279 902 -277 903 -273 ct 
+903 -269 903 -265 903 -260 ct 903 -255 904 -246 904 -232 ct 905 -232 l  916 -251 928 -265 942 -273 ct 
+956 -281 973 -285 994 -285 ct 1025 -285 1047 -277 1062 -262 ct 1076 -247 1083 -222 1083 -186 ct 
+1083 0 l  1036 0 l  p ef
+1329 0 m  1234 -128 l  1200 -100 l  1200 0 l  1154 0 l  1154 -384 l  1200 -384 l 
+1200 -144 l  1323 -280 l  1377 -280 l  1264 -160 l  1383 0 l  1329 0 l 
+p ef
+1803 -182 m  1803 -122 1792 -75 1770 -43 ct 1749 -11 1717 5 1675 5 ct 1634 5 1602 -11 1581 -43 ct 
+1560 -75 1550 -121 1550 -182 ct 1550 -245 1560 -292 1580 -323 ct 1601 -354 1633 -370 1677 -370 ct 
+1720 -370 1752 -354 1772 -323 ct 1792 -291 1803 -244 1803 -182 ct p
+1755 -183 m  1755 -235 1749 -273 1737 -297 ct 1725 -320 1705 -332 1677 -332 ct 
+1648 -332 1628 -321 1615 -297 ct 1603 -274 1597 -236 1597 -183 ct 1597 -131 1603 -93 1616 -69 ct 
+1628 -45 1648 -33 1676 -33 ct 1703 -33 1723 -45 1736 -70 ct 1749 -94 1755 -132 1755 -183 ct 
+p ef
+pom
+gs
+1 lj 8337 6844 m  11573 6844 l  ps
+gr
+gs
+8050 6844 m  8350 6944 l  8350 6744 l  8050 6844 l  p ef
+gr
+gs
+11860 6844 m  11560 6744 l  11560 6944 l  11860 6844 l  p ef
+gr
+gs
+0 lw 1 lj 8050 7544 m  8050 6644 l  ps
+gr
+gs
+0 lw 1 lj 11860 7544 m  11860 6644 l  ps
+gr
+pum
+8104 7467 t
+353 0 m  353 -243 l  353 -270 354 -296 355 -321 ct 347 -290 339 -266 332 -248 ct 
+238 0 l  204 0 l  108 -248 l  94 -292 l  86 -321 l  86 -292 l  87 -243 l 
+87 0 l  43 0 l  43 -365 l  108 -365 l  205 -112 l  209 -102 212 -91 215 -79 ct 
+218 -67 220 -59 221 -54 ct 223 -61 226 -71 230 -85 ct 234 -99 237 -108 239 -112 ct 
+334 -365 l  397 -365 l  397 0 l  353 0 l  p ef
+548 5 m  520 5 499 -2 485 -17 ct 471 -32 463 -52 463 -78 ct 463 -107 473 -129 492 -145 ct 
+511 -160 542 -169 584 -170 ct 647 -171 l  647 -186 l  647 -209 642 -225 632 -235 ct 
+623 -245 608 -250 587 -250 ct 566 -250 551 -246 541 -239 ct 532 -232 526 -221 524 -205 ct 
+476 -210 l  484 -260 521 -285 588 -285 ct 623 -285 650 -277 667 -261 ct 685 -245 694 -221 694 -191 ct 
+694 -71 l  694 -57 696 -46 699 -39 ct 703 -32 710 -29 720 -29 ct 724 -29 730 -30 735 -31 ct 
+735 -2 l  724 1 712 2 699 2 ct 682 2 670 -2 662 -11 ct 654 -20 649 -34 648 -54 ct 
+647 -54 l  635 -32 621 -17 605 -8 ct 590 1 571 5 548 5 ct p
+559 -30 m  576 -30 591 -34 604 -42 ct 617 -49 628 -60 635 -73 ct 643 -87 647 -101 647 -115 ct 
+647 -138 l  596 -137 l  574 -137 558 -135 546 -130 ct 535 -126 526 -120 520 -111 ct 
+514 -103 511 -91 511 -77 ct 511 -62 515 -51 524 -42 ct 532 -34 543 -30 559 -30 ct 
+p ef
+770 -340 m  770 -384 l  817 -384 l  817 -340 l  770 -340 l  p
+770 0 m  770 -280 l  817 -280 l  817 0 l  770 0 l  p ef
+1066 0 m  1066 -177 l  1066 -196 1064 -210 1061 -220 ct 1057 -231 1051 -238 1043 -242 ct 
+1035 -247 1024 -249 1009 -249 ct 986 -249 968 -241 956 -226 ct 943 -211 936 -189 936 -162 ct 
+936 0 l  890 0 l  890 -220 l  890 -253 889 -273 888 -280 ct 932 -280 l  932 -279 932 -277 933 -273 ct 
+933 -269 933 -265 933 -260 ct 933 -255 934 -246 934 -232 ct 935 -232 l  946 -251 958 -265 972 -273 ct 
+986 -281 1003 -285 1024 -285 ct 1055 -285 1077 -277 1092 -262 ct 1106 -247 1113 -222 1113 -186 ct 
+1113 0 l  1066 0 l  p ef
+1619 -255 m  1619 -220 1608 -193 1585 -173 ct 1563 -152 1532 -142 1494 -142 ct 
+1387 -142 l  1387 0 l  1337 0 l  1337 -365 l  1491 -365 l  1531 -365 1563 -355 1585 -336 ct 
+1608 -317 1619 -290 1619 -255 ct p
+1569 -254 m  1569 -301 1541 -325 1485 -325 ct 1387 -325 l  1387 -181 l  1487 -181 l 
+1542 -181 1569 -205 1569 -254 ct p ef
+1937 0 m  1937 -169 l  1740 -169 l  1740 0 l  1690 0 l  1690 -365 l  1740 -365 l 
+1740 -210 l  1937 -210 l  1937 -365 l  1986 -365 l  1986 0 l  1937 0 l 
+p ef
+2230 -151 m  2230 0 l  2181 0 l  2181 -151 l  2041 -365 l  2095 -365 l 
+2206 -191 l  2316 -365 l  2370 -365 l  2230 -151 l  p ef
+2774 -77 m  2774 -51 2764 -31 2745 -16 ct 2725 -2 2697 5 2661 5 ct 2626 5 2599 -1 2581 -12 ct 
+2562 -24 2549 -42 2544 -66 ct 2585 -74 l  2589 -59 2597 -48 2609 -41 ct 2622 -34 2639 -30 2661 -30 ct 
+2685 -30 2702 -34 2713 -41 ct 2724 -49 2729 -59 2729 -74 ct 2729 -85 2725 -94 2718 -101 ct 
+2710 -108 2698 -113 2681 -118 ct 2648 -127 l  2621 -133 2602 -140 2591 -147 ct 
+2580 -153 2571 -162 2564 -171 ct 2558 -180 2555 -192 2555 -206 ct 2555 -231 2564 -251 2582 -264 ct 
+2600 -278 2627 -284 2662 -284 ct 2692 -284 2717 -279 2735 -268 ct 2753 -257 2765 -240 2769 -216 ct 
+2728 -211 l  2725 -223 2718 -232 2707 -239 ct 2696 -246 2680 -249 2662 -249 ct 
+2641 -249 2625 -246 2615 -239 ct 2605 -233 2600 -223 2600 -210 ct 2600 -203 2602 -196 2606 -191 ct 
+2610 -186 2616 -181 2625 -178 ct 2633 -174 2650 -169 2676 -163 ct 2700 -156 2718 -151 2729 -146 ct 
+2740 -140 2748 -134 2755 -128 ct 2761 -122 2766 -114 2769 -106 ct 2773 -98 2774 -88 2774 -77 ct 
+p ef
+3097 0 m  3043 0 l  2994 -198 l  2985 -242 l  2984 -234 2981 -223 2978 -208 ct 
+2975 -194 2957 -124 2925 0 ct 2871 0 l  2793 -280 l  2839 -280 l  2886 -90 l 
+2888 -86 2891 -69 2898 -39 ct 2902 -58 l  2960 -280 l  3010 -280 l  3059 -88 l 
+3071 -39 l  3079 -75 l  3132 -280 l  3177 -280 l  3097 0 l  p ef
+3211 -340 m  3211 -384 l  3258 -384 l  3258 -340 l  3211 -340 l  p
+3211 0 m  3211 -280 l  3258 -280 l  3258 0 l  3211 0 l  p ef
+3436 -2 m  3421 2 3405 4 3389 4 ct 3352 4 3333 -17 3333 -59 ct 3333 -246 l  3301 -246 l 
+3301 -280 l  3335 -280 l  3349 -343 l  3380 -343 l  3380 -280 l  3431 -280 l 
+3431 -246 l  3380 -246 l  3380 -69 l  3380 -56 3382 -47 3386 -41 ct 3391 -36 3398 -33 3409 -33 ct 
+3415 -33 3424 -34 3436 -37 ct 3436 -2 l  p ef
+3511 -141 m  3511 -104 3517 -77 3529 -59 ct 3540 -41 3558 -32 3582 -32 ct 3598 -32 3612 -36 3623 -45 ct 
+3634 -54 3641 -68 3644 -87 ct 3691 -83 l  3687 -57 3675 -35 3656 -19 ct 3637 -3 3612 5 3583 5 ct 
+3544 5 3514 -7 3493 -32 ct 3473 -57 3462 -93 3462 -140 ct 3462 -187 3473 -223 3493 -248 ct 
+3514 -273 3544 -285 3582 -285 ct 3611 -285 3635 -278 3653 -263 ct 3672 -248 3684 -228 3689 -202 ct 
+3641 -198 l  3639 -213 3633 -226 3623 -235 ct 3613 -244 3599 -249 3581 -249 ct 
+3556 -249 3539 -240 3528 -224 ct 3517 -208 3511 -180 3511 -141 ct p ef
+3787 -232 m  3797 -250 3809 -264 3823 -272 ct 3837 -281 3855 -285 3876 -285 ct 
+3907 -285 3929 -277 3943 -262 ct 3958 -247 3965 -222 3965 -186 ct 3965 0 l  3918 0 l 
+3918 -177 l  3918 -197 3916 -212 3913 -221 ct 3909 -231 3903 -238 3895 -242 ct 
+3887 -247 3875 -249 3861 -249 ct 3839 -249 3821 -241 3808 -226 ct 3795 -211 3788 -191 3788 -165 ct 
+3788 0 l  3742 0 l  3742 -384 l  3788 -384 l  3788 -284 l  3788 -273 3788 -263 3787 -251 ct 
+3787 -240 3786 -234 3786 -232 ct 3787 -232 l  p ef
+pom
+pum
+8265 8055 t
+143 -2 m  128 2 112 4 96 4 ct 59 4 40 -17 40 -59 ct 40 -246 l  8 -246 l  8 -280 l 
+42 -280 l  56 -343 l  87 -343 l  87 -280 l  138 -280 l  138 -246 l  87 -246 l 
+87 -69 l  87 -56 89 -47 93 -41 ct 98 -36 105 -33 116 -33 ct 122 -33 131 -34 143 -37 ct 
+143 -2 l  p ef
+419 -140 m  419 -91 408 -55 387 -31 ct 365 -7 334 5 293 5 ct 252 5 221 -7 200 -32 ct 
+180 -57 169 -93 169 -140 ct 169 -237 211 -285 294 -285 ct 337 -285 369 -273 389 -250 ct 
+409 -226 419 -190 419 -140 ct p
+370 -140 m  370 -179 364 -207 353 -224 ct 342 -242 322 -251 295 -251 ct 268 -251 248 -242 236 -224 ct 
+224 -206 218 -178 218 -140 ct 218 -103 224 -76 236 -57 ct 248 -39 267 -29 292 -29 ct 
+320 -29 340 -38 352 -56 ct 364 -74 370 -102 370 -140 ct p ef
+860 -141 m  860 -43 826 5 757 5 ct 714 5 685 -11 670 -43 ct 669 -43 l  670 -42 670 -27 670 1 ct 
+670 110 l  624 110 l  624 -223 l  624 -252 623 -271 622 -280 ct 667 -280 l 
+667 -279 667 -277 668 -273 ct 668 -268 669 -262 669 -253 ct 669 -244 670 -238 670 -235 ct 
+671 -235 l  679 -252 690 -265 703 -273 ct 717 -281 735 -285 757 -285 ct 792 -285 817 -273 834 -250 ct 
+851 -227 860 -191 860 -141 ct p
+811 -140 m  811 -179 806 -207 795 -224 ct 785 -241 768 -249 745 -249 ct 727 -249 712 -245 702 -237 ct 
+692 -230 684 -217 678 -201 ct 673 -184 670 -163 670 -137 ct 670 -100 676 -73 688 -55 ct 
+699 -38 718 -29 745 -29 ct 768 -29 785 -38 795 -55 ct 806 -72 811 -100 811 -140 ct 
+p ef
+920 0 m  920 -215 l  920 -234 919 -256 918 -280 ct 962 -280 l  963 -248 964 -229 964 -223 ct 
+965 -223 l  973 -247 981 -263 991 -272 ct 1000 -281 1014 -285 1032 -285 ct 1038 -285 1044 -284 1050 -282 ct 
+1050 -240 l  1044 -241 1036 -242 1026 -242 ct 1006 -242 992 -234 981 -217 ct 
+971 -201 966 -177 966 -146 ct 966 0 l  920 0 l  p ef
+1130 -130 m  1130 -98 1137 -73 1150 -56 ct 1163 -39 1183 -30 1208 -30 ct 1228 -30 1245 -34 1257 -42 ct 
+1269 -50 1277 -60 1281 -73 ct 1322 -61 l  1306 -17 1268 5 1208 5 ct 1167 5 1136 -7 1114 -32 ct 
+1092 -57 1081 -93 1081 -142 ct 1081 -188 1092 -223 1114 -248 ct 1136 -273 1166 -285 1206 -285 ct 
+1289 -285 1330 -236 1330 -137 ct 1330 -130 l  1130 -130 l  p
+1282 -166 m  1279 -195 1272 -217 1259 -230 ct 1247 -244 1229 -251 1206 -251 ct 
+1183 -251 1165 -243 1152 -228 ct 1139 -213 1132 -192 1131 -166 ct 1282 -166 l 
+p ef
+1446 -247 m  1446 -1 l  1400 -1 l  1400 -247 l  1360 -247 l  1360 -281 l 
+1400 -281 l  1400 -312 l  1400 -338 1405 -356 1417 -367 ct 1428 -378 1445 -384 1468 -384 ct 
+1481 -384 1492 -383 1501 -381 ct 1501 -345 l  1493 -347 1486 -348 1480 -348 ct 
+1468 -348 1460 -345 1454 -339 ct 1449 -333 1446 -322 1446 -306 ct 1446 -281 l 
+1501 -281 l  1501 -247 l  1446 -247 l  p ef
+1571 -130 m  1571 -98 1578 -73 1591 -56 ct 1604 -39 1624 -30 1649 -30 ct 1669 -30 1686 -34 1698 -42 ct 
+1710 -50 1718 -60 1722 -73 ct 1763 -61 l  1747 -17 1709 5 1649 5 ct 1608 5 1577 -7 1555 -32 ct 
+1533 -57 1522 -93 1522 -142 ct 1522 -188 1533 -223 1555 -248 ct 1577 -273 1607 -285 1647 -285 ct 
+1730 -285 1771 -236 1771 -137 ct 1771 -130 l  1571 -130 l  p
+1723 -166 m  1720 -195 1713 -217 1700 -230 ct 1688 -244 1670 -251 1647 -251 ct 
+1624 -251 1606 -243 1593 -228 ct 1580 -213 1573 -192 1572 -166 ct 1723 -166 l 
+p ef
+1831 0 m  1831 -215 l  1831 -234 1830 -256 1829 -280 ct 1873 -280 l  1874 -248 1875 -229 1875 -223 ct 
+1876 -223 l  1884 -247 1892 -263 1902 -272 ct 1911 -281 1925 -285 1943 -285 ct 
+1949 -285 1955 -284 1961 -282 ct 1961 -240 l  1955 -241 1947 -242 1937 -242 ct 
+1917 -242 1903 -234 1892 -217 ct 1882 -201 1877 -177 1877 -146 ct 1877 0 l  1831 0 l 
+p ef
+2008 0 m  2008 -215 l  2008 -234 2007 -256 2006 -280 ct 2050 -280 l  2051 -248 2052 -229 2052 -223 ct 
+2053 -223 l  2061 -247 2069 -263 2079 -272 ct 2088 -281 2102 -285 2120 -285 ct 
+2126 -285 2132 -284 2138 -282 ct 2138 -240 l  2132 -241 2124 -242 2114 -242 ct 
+2094 -242 2080 -234 2069 -217 ct 2059 -201 2054 -177 2054 -146 ct 2054 0 l  2008 0 l 
+p ef
+2218 -130 m  2218 -98 2225 -73 2238 -56 ct 2251 -39 2271 -30 2296 -30 ct 2316 -30 2333 -34 2345 -42 ct 
+2357 -50 2365 -60 2369 -73 ct 2410 -61 l  2394 -17 2356 5 2296 5 ct 2255 5 2224 -7 2202 -32 ct 
+2180 -57 2169 -93 2169 -142 ct 2169 -188 2180 -223 2202 -248 ct 2224 -273 2254 -285 2294 -285 ct 
+2377 -285 2418 -236 2418 -137 ct 2418 -130 l  2218 -130 l  p
+2370 -166 m  2367 -195 2360 -217 2347 -230 ct 2335 -244 2317 -251 2294 -251 ct 
+2271 -251 2253 -243 2240 -228 ct 2227 -213 2220 -192 2219 -166 ct 2370 -166 l 
+p ef
+2653 -45 m  2644 -27 2633 -14 2619 -7 ct 2605 1 2587 5 2566 5 ct 2531 5 2505 -7 2488 -31 ct 
+2472 -55 2463 -91 2463 -139 ct 2463 -237 2497 -285 2566 -285 ct 2587 -285 2605 -282 2619 -274 ct 
+2633 -266 2644 -254 2653 -237 ct 2654 -237 l  2653 -268 l  2653 -384 l  2700 -384 l 
+2700 -58 l  2700 -29 2700 -10 2701 0 ct 2657 0 l  2656 -3 2656 -9 2655 -19 ct 
+2654 -29 2654 -38 2654 -45 ct 2653 -45 l  p
+2512 -140 m  2512 -101 2517 -73 2528 -56 ct 2538 -39 2555 -31 2578 -31 ct 2604 -31 2623 -40 2635 -58 ct 
+2647 -77 2653 -105 2653 -144 ct 2653 -181 2647 -208 2635 -225 ct 2623 -242 2604 -251 2578 -251 ct 
+2555 -251 2538 -242 2528 -225 ct 2517 -208 2512 -179 2512 -140 ct p ef
+2919 0 m  2919 -384 l  2965 -384 l  2965 0 l  2919 0 l  p ef
+3035 -340 m  3035 -384 l  3082 -384 l  3082 -340 l  3035 -340 l  p
+3035 0 m  3035 -280 l  3082 -280 l  3082 0 l  3035 0 l  p ef
+3331 0 m  3331 -177 l  3331 -196 3329 -210 3326 -220 ct 3322 -231 3316 -238 3308 -242 ct 
+3300 -247 3289 -249 3274 -249 ct 3251 -249 3233 -241 3221 -226 ct 3208 -211 3201 -189 3201 -162 ct 
+3201 0 l  3155 0 l  3155 -220 l  3155 -253 3154 -273 3153 -280 ct 3197 -280 l 
+3197 -279 3197 -277 3198 -273 ct 3198 -269 3198 -265 3198 -260 ct 3198 -255 3199 -246 3199 -232 ct 
+3200 -232 l  3211 -251 3223 -265 3237 -273 ct 3251 -281 3268 -285 3289 -285 ct 
+3320 -285 3342 -277 3357 -262 ct 3371 -247 3378 -222 3378 -186 ct 3378 0 l  3331 0 l 
+p ef
+3623 0 m  3528 -128 l  3494 -100 l  3494 0 l  3448 0 l  3448 -384 l  3494 -384 l 
+3494 -144 l  3617 -280 l  3671 -280 l  3558 -160 l  3677 0 l  3623 0 l 
+p ef
+pom
+pum
+2914 478 t
+102 5 m  74 5 53 -2 38 -17 ct 23 -32 16 -53 16 -79 ct 16 -108 25 -130 44 -145 ct 
+63 -161 90 -168 126 -169 ct 186 -170 l  186 -184 l  186 -202 183 -216 176 -225 ct 
+170 -234 160 -238 145 -238 ct 132 -238 122 -235 116 -229 ct 109 -223 105 -213 104 -198 ct 
+28 -202 l  33 -229 45 -250 65 -264 ct 86 -278 113 -285 148 -285 ct 184 -285 211 -276 230 -259 ct 
+249 -242 259 -217 259 -185 ct 259 -83 l  259 -67 260 -56 264 -50 ct 267 -45 273 -42 282 -42 ct 
+287 -42 292 -42 298 -43 ct 298 -4 l  293 -3 289 -2 286 -1 ct 282 0 279 1 276 1 ct 
+272 2 269 2 265 2 ct 261 3 256 3 251 3 ct 233 3 219 -2 211 -11 ct 202 -19 197 -33 195 -50 ct 
+193 -50 l  173 -13 143 5 102 5 ct p
+186 -130 m  149 -129 l  132 -128 120 -127 113 -124 ct 106 -121 100 -116 97 -110 ct 
+93 -104 91 -95 91 -85 ct 91 -72 94 -62 100 -55 ct 106 -49 115 -46 125 -46 ct 136 -46 147 -49 156 -55 ct 
+165 -61 173 -70 178 -81 ct 183 -92 186 -103 186 -115 ct 186 -130 l  p ef
+295 110 m  322 70 342 30 354 -8 ct 366 -47 372 -90 372 -137 ct 372 -185 366 -228 354 -267 ct 
+341 -306 322 -345 295 -384 ct 367 -384 l  394 -345 414 -306 426 -267 ct 438 -228 444 -185 444 -137 ct 
+444 -89 438 -46 426 -7 ct 414 32 394 71 367 110 ct 295 110 l  p ef
+823 -55 m  869 -55 901 -78 919 -124 ct 986 -99 l  971 -64 950 -38 923 -21 ct 
+895 -4 862 5 823 5 ct 765 5 720 -12 688 -45 ct 656 -78 640 -124 640 -184 ct 640 -244 655 -290 686 -322 ct 
+717 -354 761 -370 820 -370 ct 863 -370 897 -361 924 -344 ct 951 -327 970 -302 981 -269 ct 
+914 -250 l  908 -269 897 -283 880 -294 ct 864 -305 844 -310 822 -310 ct 787 -310 761 -299 743 -278 ct 
+725 -257 716 -225 716 -184 ct 716 -142 726 -110 744 -88 ct 762 -66 789 -55 823 -55 ct 
+p ef
+1108 -224 m  1118 -245 1131 -261 1145 -271 ct 1160 -280 1178 -285 1198 -285 ct 
+1228 -285 1251 -276 1267 -258 ct 1282 -239 1290 -213 1290 -178 ct 1290 0 l  1218 0 l 
+1218 -157 l  1218 -206 1201 -230 1168 -230 ct 1151 -230 1136 -223 1126 -208 ct 
+1115 -193 1110 -173 1110 -150 ct 1110 0 l  1037 0 l  1037 -384 l  1110 -384 l 
+1110 -279 l  1110 -260 1109 -242 1107 -224 ct 1108 -224 l  p ef
+1425 5 m  1397 5 1376 -2 1361 -17 ct 1346 -32 1339 -53 1339 -79 ct 1339 -108 1348 -130 1367 -145 ct 
+1386 -161 1413 -168 1449 -169 ct 1509 -170 l  1509 -184 l  1509 -202 1506 -216 1499 -225 ct 
+1493 -234 1483 -238 1468 -238 ct 1455 -238 1445 -235 1439 -229 ct 1432 -223 1428 -213 1427 -198 ct 
+1351 -202 l  1356 -229 1368 -250 1388 -264 ct 1409 -278 1436 -285 1471 -285 ct 
+1507 -285 1534 -276 1553 -259 ct 1572 -242 1582 -217 1582 -185 ct 1582 -83 l 
+1582 -67 1583 -56 1587 -50 ct 1590 -45 1596 -42 1605 -42 ct 1610 -42 1615 -42 1621 -43 ct 
+1621 -4 l  1616 -3 1612 -2 1609 -1 ct 1605 0 1602 1 1599 1 ct 1595 2 1592 2 1588 2 ct 
+1584 3 1579 3 1574 3 ct 1556 3 1542 -2 1534 -11 ct 1525 -19 1520 -33 1518 -50 ct 
+1516 -50 l  1496 -13 1466 5 1425 5 ct p
+1509 -130 m  1472 -129 l  1455 -128 1443 -127 1436 -124 ct 1429 -121 1423 -116 1420 -110 ct 
+1416 -104 1414 -95 1414 -85 ct 1414 -72 1417 -62 1423 -55 ct 1429 -49 1438 -46 1448 -46 ct 
+1459 -46 1470 -49 1479 -55 ct 1488 -61 1496 -70 1501 -81 ct 1506 -92 1509 -103 1509 -115 ct 
+1509 -130 l  p ef
+1835 0 m  1835 -157 l  1835 -206 1818 -230 1785 -230 ct 1768 -230 1753 -223 1743 -208 ct 
+1732 -193 1727 -173 1727 -150 ct 1727 0 l  1654 0 l  1654 -217 l  1654 -232 1654 -245 1653 -254 ct 
+1653 -264 1652 -272 1652 -280 ct 1721 -280 l  1722 -277 1722 -268 1723 -253 ct 
+1724 -239 1724 -229 1724 -224 ct 1725 -224 l  1735 -245 1748 -261 1762 -271 ct 
+1777 -280 1795 -285 1815 -285 ct 1845 -285 1868 -276 1884 -258 ct 1899 -239 1907 -213 1907 -178 ct 
+1907 0 l  1835 0 l  p ef
+2158 0 m  2158 -157 l  2158 -206 2141 -230 2108 -230 ct 2091 -230 2076 -223 2066 -208 ct 
+2055 -193 2050 -173 2050 -150 ct 2050 0 l  1977 0 l  1977 -217 l  1977 -232 1977 -245 1976 -254 ct 
+1976 -264 1975 -272 1975 -280 ct 2044 -280 l  2045 -277 2045 -268 2046 -253 ct 
+2047 -239 2047 -229 2047 -224 ct 2048 -224 l  2058 -245 2071 -261 2085 -271 ct 
+2100 -280 2118 -285 2138 -285 ct 2168 -285 2191 -276 2207 -258 ct 2222 -239 2230 -213 2230 -178 ct 
+2230 0 l  2158 0 l  p ef
+2415 5 m  2373 5 2341 -7 2319 -32 ct 2296 -57 2285 -94 2285 -141 ct 2285 -187 2296 -223 2319 -248 ct 
+2342 -273 2374 -285 2416 -285 ct 2457 -285 2487 -272 2508 -245 ct 2530 -218 2540 -179 2540 -128 ct 
+2540 -126 l  2361 -126 l  2361 -99 2366 -78 2376 -64 ct 2386 -51 2400 -44 2419 -44 ct 
+2445 -44 2461 -55 2468 -77 ct 2536 -71 l  2516 -20 2476 5 2415 5 ct p
+2415 -239 m  2398 -239 2385 -233 2376 -221 ct 2367 -210 2362 -193 2361 -172 ct 
+2470 -172 l  2468 -194 2463 -211 2454 -222 ct 2444 -234 2431 -239 2415 -239 ct 
+p ef
+2595 0 m  2595 -384 l  2668 -384 l  2668 0 l  2595 0 l  p ef
+3125 -82 m  3125 -55 3113 -34 3091 -18 ct 3069 -3 3039 5 2999 5 ct 2961 5 2932 -1 2911 -13 ct 
+2891 -25 2877 -44 2871 -70 ct 2934 -80 l  2938 -66 2944 -57 2953 -51 ct 2962 -46 2977 -43 2999 -43 ct 
+3020 -43 3035 -46 3044 -51 ct 3053 -56 3058 -64 3058 -75 ct 3058 -84 3054 -91 3047 -97 ct 
+3039 -102 3026 -106 3009 -110 ct 2968 -118 2940 -125 2926 -132 ct 2911 -139 2900 -148 2893 -160 ct 
+2885 -171 2882 -184 2882 -201 ct 2882 -227 2892 -248 2913 -263 ct 2933 -278 2962 -285 3000 -285 ct 
+3033 -285 3060 -279 3080 -266 ct 3100 -253 3113 -234 3118 -210 ct 3054 -203 l 
+3052 -215 3047 -223 3039 -229 ct 3030 -234 3018 -237 3000 -237 ct 2983 -237 2970 -235 2961 -230 ct 
+2953 -226 2948 -219 2948 -208 ct 2948 -200 2952 -194 2958 -189 ct 2965 -184 2976 -180 2992 -177 ct 
+3014 -173 3033 -168 3050 -163 ct 3067 -159 3081 -153 3091 -147 ct 3101 -140 3109 -132 3115 -121 ct 
+3121 -111 3125 -98 3125 -82 ct p ef
+3485 0 m  3408 0 l  3364 -171 l  3362 -179 3358 -198 3352 -228 ct 3338 -170 l 
+3293 0 l  3217 0 l  3144 -280 l  3213 -280 l  3259 -66 l  3262 -85 l  3269 -115 l 
+3313 -280 l  3390 -280 l  3433 -115 l  3436 -106 3439 -90 3444 -66 ct 3451 -100 l 
+3491 -280 l  3559 -280 l  3485 0 l  p ef
+3595 -330 m  3595 -384 l  3668 -384 l  3668 -330 l  3595 -330 l  p
+3595 0 m  3595 -280 l  3668 -280 l  3668 0 l  3595 0 l  p ef
+3813 5 m  3792 5 3776 -1 3764 -12 ct 3753 -24 3747 -42 3747 -65 ct 3747 -230 l 
+3711 -230 l  3711 -279 l  3750 -279 l  3773 -345 l  3819 -345 l  3819 -279 l 
+3872 -279 l  3872 -230 l  3819 -230 l  3819 -85 l  3819 -71 3821 -61 3826 -55 ct 
+3832 -48 3840 -45 3850 -45 ct 3856 -45 3864 -46 3875 -49 ct 3875 -4 l  3857 2 3836 5 3813 5 ct 
+p ef
+4034 5 m  3992 5 3959 -8 3936 -33 ct 3913 -58 3902 -93 3902 -138 ct 3902 -185 3913 -221 3937 -246 ct 
+3960 -272 3993 -285 4035 -285 ct 4068 -285 4096 -277 4117 -260 ct 4139 -244 4152 -221 4158 -192 ct 
+4085 -188 l  4082 -202 4077 -214 4069 -222 ct 4061 -231 4049 -235 4034 -235 ct 
+3997 -235 3978 -204 3978 -141 ct 3978 -77 3997 -45 4035 -45 ct 4049 -45 4060 -49 4070 -58 ct 
+4079 -66 4085 -79 4087 -97 ct 4160 -93 l  4157 -74 4150 -57 4139 -42 ct 4128 -27 4113 -15 4095 -7 ct 
+4077 1 4057 5 4034 5 ct p ef
+4283 -224 m  4293 -245 4306 -261 4320 -271 ct 4335 -280 4353 -285 4373 -285 ct 
+4403 -285 4426 -276 4442 -258 ct 4457 -239 4465 -213 4465 -178 ct 4465 0 l  4393 0 l 
+4393 -157 l  4393 -206 4376 -230 4343 -230 ct 4326 -230 4311 -223 4301 -208 ct 
+4290 -193 4285 -173 4285 -150 ct 4285 0 l  4212 0 l  4212 -384 l  4285 -384 l 
+4285 -279 l  4285 -260 4284 -242 4282 -224 ct 4283 -224 l  p ef
+4799 5 m  4757 5 4724 -8 4701 -33 ct 4678 -58 4667 -93 4667 -138 ct 4667 -185 4678 -221 4702 -246 ct 
+4725 -272 4758 -285 4800 -285 ct 4833 -285 4861 -277 4882 -260 ct 4904 -244 4917 -221 4923 -192 ct 
+4850 -188 l  4847 -202 4842 -214 4834 -222 ct 4826 -231 4814 -235 4799 -235 ct 
+4762 -235 4743 -204 4743 -141 ct 4743 -77 4762 -45 4800 -45 ct 4814 -45 4825 -49 4835 -58 ct 
+4844 -66 4850 -79 4852 -97 ct 4925 -93 l  4922 -74 4915 -57 4904 -42 ct 4893 -27 4878 -15 4860 -7 ct 
+4842 1 4822 5 4799 5 ct p ef
+5042 5 m  5014 5 4993 -2 4978 -17 ct 4963 -32 4956 -53 4956 -79 ct 4956 -108 4965 -130 4984 -145 ct 
+5003 -161 5030 -168 5066 -169 ct 5126 -170 l  5126 -184 l  5126 -202 5123 -216 5116 -225 ct 
+5110 -234 5100 -238 5085 -238 ct 5072 -238 5062 -235 5056 -229 ct 5049 -223 5045 -213 5044 -198 ct 
+4968 -202 l  4973 -229 4985 -250 5005 -264 ct 5026 -278 5053 -285 5088 -285 ct 
+5124 -285 5151 -276 5170 -259 ct 5189 -242 5199 -217 5199 -185 ct 5199 -83 l 
+5199 -67 5200 -56 5204 -50 ct 5207 -45 5213 -42 5222 -42 ct 5227 -42 5232 -42 5238 -43 ct 
+5238 -4 l  5233 -3 5229 -2 5226 -1 ct 5222 0 5219 1 5216 1 ct 5212 2 5209 2 5205 2 ct 
+5201 3 5196 3 5191 3 ct 5173 3 5159 -2 5151 -11 ct 5142 -19 5137 -33 5135 -50 ct 
+5133 -50 l  5113 -13 5083 5 5042 5 ct p
+5126 -130 m  5089 -129 l  5072 -128 5060 -127 5053 -124 ct 5046 -121 5040 -116 5037 -110 ct 
+5033 -104 5031 -95 5031 -85 ct 5031 -72 5034 -62 5040 -55 ct 5046 -49 5055 -46 5065 -46 ct 
+5076 -46 5087 -49 5096 -55 ct 5105 -61 5113 -70 5118 -81 ct 5123 -92 5126 -103 5126 -115 ct 
+5126 -130 l  p ef
+5452 0 m  5452 -157 l  5452 -206 5435 -230 5402 -230 ct 5385 -230 5370 -223 5360 -208 ct 
+5349 -193 5344 -173 5344 -150 ct 5344 0 l  5271 0 l  5271 -217 l  5271 -232 5271 -245 5270 -254 ct 
+5270 -264 5269 -272 5269 -280 ct 5338 -280 l  5339 -277 5339 -268 5340 -253 ct 
+5341 -239 5341 -229 5341 -224 ct 5342 -224 l  5352 -245 5365 -261 5379 -271 ct 
+5394 -280 5412 -285 5432 -285 ct 5462 -285 5485 -276 5501 -258 ct 5516 -239 5524 -213 5524 -178 ct 
+5524 0 l  5452 0 l  p ef
+5776 0 m  5776 -157 l  5776 -206 5759 -230 5726 -230 ct 5709 -230 5694 -223 5684 -208 ct 
+5673 -193 5668 -173 5668 -150 ct 5668 0 l  5595 0 l  5595 -217 l  5595 -232 5595 -245 5594 -254 ct 
+5594 -264 5593 -272 5593 -280 ct 5662 -280 l  5663 -277 5663 -268 5664 -253 ct 
+5665 -239 5665 -229 5665 -224 ct 5666 -224 l  5676 -245 5689 -261 5703 -271 ct 
+5718 -280 5736 -285 5756 -285 ct 5786 -285 5809 -276 5825 -258 ct 5840 -239 5848 -213 5848 -178 ct 
+5848 0 l  5776 0 l  p ef
+6183 -140 m  6183 -95 6171 -59 6146 -34 ct 6121 -8 6086 5 6041 5 ct 5998 5 5964 -8 5939 -34 ct 
+5914 -60 5902 -95 5902 -140 ct 5902 -185 5914 -221 5939 -246 ct 5964 -272 5998 -285 6043 -285 ct 
+6089 -285 6123 -273 6147 -248 ct 6171 -223 6183 -187 6183 -140 ct p
+6108 -140 m  6108 -174 6102 -198 6091 -213 ct 6080 -228 6065 -235 6044 -235 ct 
+6000 -235 5978 -203 5978 -140 ct 5978 -109 5983 -85 5994 -69 ct 6005 -53 6020 -45 6041 -45 ct 
+6085 -45 6108 -77 6108 -140 ct p ef
+6312 5 m  6291 5 6275 -1 6263 -12 ct 6252 -24 6246 -42 6246 -65 ct 6246 -230 l 
+6210 -230 l  6210 -279 l  6249 -279 l  6272 -345 l  6318 -345 l  6318 -279 l 
+6371 -279 l  6371 -230 l  6318 -230 l  6318 -85 l  6318 -71 6320 -61 6325 -55 ct 
+6331 -48 6339 -45 6349 -45 ct 6355 -45 6363 -46 6374 -49 ct 6374 -4 l  6356 2 6335 5 6312 5 ct 
+p ef
+pom
+pum
+4326 1066 t
+301 -141 m  301 -95 292 -59 274 -33 ct 255 -8 229 5 194 5 ct 174 5 157 1 143 -8 ct 
+128 -17 117 -29 110 -45 ct 109 -45 l  109 -39 109 -31 108 -20 ct 107 -10 106 -3 105 0 ct 
+35 0 l  36 -16 37 -38 37 -64 ct 37 -384 l  110 -384 l  110 -277 l  108 -231 l 
+110 -231 l  126 -267 156 -285 199 -285 ct 232 -285 257 -272 275 -247 ct 293 -222 301 -187 301 -141 ct 
+p
+226 -141 m  226 -173 221 -196 212 -212 ct 203 -227 188 -235 169 -235 ct 149 -235 134 -226 124 -210 ct 
+114 -193 108 -170 108 -139 ct 108 -109 114 -86 124 -69 ct 134 -53 149 -45 168 -45 ct 
+207 -45 226 -77 226 -141 ct p ef
+474 5 m  432 5 400 -7 378 -32 ct 355 -57 344 -94 344 -141 ct 344 -187 355 -223 378 -248 ct 
+401 -273 433 -285 475 -285 ct 516 -285 546 -272 567 -245 ct 589 -218 599 -179 599 -128 ct 
+599 -126 l  420 -126 l  420 -99 425 -78 435 -64 ct 445 -51 459 -44 478 -44 ct 
+504 -44 520 -55 527 -77 ct 595 -71 l  575 -20 535 5 474 5 ct p
+474 -239 m  457 -239 444 -233 435 -221 ct 426 -210 421 -193 420 -172 ct 529 -172 l 
+527 -194 522 -211 513 -222 ct 503 -234 490 -239 474 -239 ct p ef
+802 -330 m  802 -384 l  875 -384 l  875 -330 l  802 -330 l  p
+802 0 m  802 -280 l  875 -280 l  875 0 l  802 0 l  p ef
+1130 0 m  1130 -157 l  1130 -206 1113 -230 1080 -230 ct 1063 -230 1048 -223 1038 -208 ct 
+1027 -193 1022 -173 1022 -150 ct 1022 0 l  949 0 l  949 -217 l  949 -232 949 -245 948 -254 ct 
+948 -264 947 -272 947 -280 ct 1016 -280 l  1017 -277 1017 -268 1018 -253 ct 
+1019 -239 1019 -229 1019 -224 ct 1020 -224 l  1030 -245 1043 -261 1057 -271 ct 
+1072 -280 1090 -285 1110 -285 ct 1140 -285 1163 -276 1179 -258 ct 1194 -239 1202 -213 1202 -178 ct 
+1202 0 l  1130 0 l  p ef
+1343 5 m  1322 5 1306 -1 1294 -12 ct 1283 -24 1277 -42 1277 -65 ct 1277 -230 l 
+1241 -230 l  1241 -279 l  1280 -279 l  1303 -345 l  1349 -345 l  1349 -279 l 
+1402 -279 l  1402 -230 l  1349 -230 l  1349 -85 l  1349 -71 1351 -61 1356 -55 ct 
+1362 -48 1370 -45 1380 -45 ct 1386 -45 1394 -46 1405 -49 ct 1405 -4 l  1387 2 1366 5 1343 5 ct 
+p ef
+1562 5 m  1520 5 1488 -7 1466 -32 ct 1443 -57 1432 -94 1432 -141 ct 1432 -187 1443 -223 1466 -248 ct 
+1489 -273 1521 -285 1563 -285 ct 1604 -285 1634 -272 1655 -245 ct 1677 -218 1687 -179 1687 -128 ct 
+1687 -126 l  1508 -126 l  1508 -99 1513 -78 1523 -64 ct 1533 -51 1547 -44 1566 -44 ct 
+1592 -44 1608 -55 1615 -77 ct 1683 -71 l  1663 -20 1623 5 1562 5 ct p
+1562 -239 m  1545 -239 1532 -233 1523 -221 ct 1514 -210 1509 -193 1508 -172 ct 
+1617 -172 l  1615 -194 1610 -211 1601 -222 ct 1591 -234 1578 -239 1562 -239 ct 
+p ef
+1742 0 m  1742 -214 l  1742 -229 1742 -242 1741 -253 ct 1741 -263 1740 -272 1740 -280 ct 
+1809 -280 l  1810 -277 1810 -267 1811 -251 ct 1812 -236 1812 -225 1812 -220 ct 
+1813 -220 l  1821 -239 1827 -253 1832 -261 ct 1838 -269 1844 -275 1852 -279 ct 
+1860 -283 1869 -285 1880 -285 ct 1890 -285 1897 -284 1903 -281 ct 1903 -220 l 
+1891 -223 1881 -224 1872 -224 ct 1854 -224 1840 -217 1830 -202 ct 1820 -188 1815 -166 1815 -137 ct 
+1815 0 l  1742 0 l  p ef
+1948 0 m  1948 -214 l  1948 -229 1948 -242 1947 -253 ct 1947 -263 1946 -272 1946 -280 ct 
+2015 -280 l  2016 -277 2016 -267 2017 -251 ct 2018 -236 2018 -225 2018 -220 ct 
+2019 -220 l  2027 -239 2033 -253 2038 -261 ct 2044 -269 2050 -275 2058 -279 ct 
+2066 -283 2075 -285 2086 -285 ct 2096 -285 2103 -284 2109 -281 ct 2109 -220 l 
+2097 -223 2087 -224 2078 -224 ct 2060 -224 2046 -217 2036 -202 ct 2026 -188 2021 -166 2021 -137 ct 
+2021 0 l  1948 0 l  p ef
+2222 -280 m  2222 -123 l  2222 -74 2239 -49 2272 -49 ct 2290 -49 2304 -57 2314 -72 ct 
+2325 -87 2331 -106 2331 -130 ct 2331 -280 l  2403 -280 l  2403 -63 l  2403 -39 2404 -18 2405 0 ct 
+2336 0 l  2334 -25 2333 -44 2333 -56 ct 2332 -56 l  2322 -35 2310 -19 2295 -9 ct 
+2280 0 2262 5 2242 5 ct 2212 5 2189 -4 2174 -22 ct 2158 -40 2150 -67 2150 -102 ct 
+2150 -280 l  2222 -280 l  p ef
+2741 -141 m  2741 -94 2732 -58 2713 -33 ct 2695 -8 2668 5 2634 5 ct 2615 5 2598 1 2583 -8 ct 
+2568 -16 2557 -29 2550 -45 ct 2548 -45 l  2549 -39 2550 -24 2550 3 ct 2550 110 l 
+2477 110 l  2477 -215 l  2477 -242 2476 -263 2475 -280 ct 2545 -280 l  2546 -277 2547 -270 2548 -261 ct 
+2548 -252 2548 -243 2548 -234 ct 2550 -234 l  2566 -268 2596 -285 2639 -285 ct 
+2671 -285 2697 -273 2715 -248 ct 2732 -223 2741 -187 2741 -141 ct p
+2666 -141 m  2666 -204 2647 -235 2608 -235 ct 2589 -235 2574 -227 2564 -210 ct 
+2554 -193 2548 -169 2548 -139 ct 2548 -109 2554 -86 2564 -69 ct 2574 -53 2589 -45 2608 -45 ct 
+2646 -45 2666 -77 2666 -141 ct p ef
+2872 5 m  2851 5 2835 -1 2823 -12 ct 2812 -24 2806 -42 2806 -65 ct 2806 -230 l 
+2770 -230 l  2770 -279 l  2809 -279 l  2832 -345 l  2878 -345 l  2878 -279 l 
+2931 -279 l  2931 -230 l  2878 -230 l  2878 -85 l  2878 -71 2880 -61 2885 -55 ct 
+2891 -48 2899 -45 2909 -45 ct 2915 -45 2923 -46 2934 -49 ct 2934 -4 l  2916 2 2895 5 2872 5 ct 
+p ef
+3091 5 m  3049 5 3017 -7 2995 -32 ct 2972 -57 2961 -94 2961 -141 ct 2961 -187 2972 -223 2995 -248 ct 
+3018 -273 3050 -285 3092 -285 ct 3133 -285 3163 -272 3184 -245 ct 3206 -218 3216 -179 3216 -128 ct 
+3216 -126 l  3037 -126 l  3037 -99 3042 -78 3052 -64 ct 3062 -51 3076 -44 3095 -44 ct 
+3121 -44 3137 -55 3144 -77 ct 3212 -71 l  3192 -20 3152 5 3091 5 ct p
+3091 -239 m  3074 -239 3061 -233 3052 -221 ct 3043 -210 3038 -193 3037 -172 ct 
+3146 -172 l  3144 -194 3139 -211 3130 -222 ct 3120 -234 3107 -239 3091 -239 ct 
+p ef
+3452 0 m  3451 -3 3451 -9 3450 -20 ct 3449 -30 3448 -39 3448 -46 ct 3447 -46 l 
+3431 -12 3402 5 3358 5 ct 3325 5 3300 -8 3282 -33 ct 3265 -59 3256 -94 3256 -140 ct 
+3256 -186 3265 -222 3284 -247 ct 3302 -273 3329 -285 3363 -285 ct 3383 -285 3400 -281 3414 -273 ct 
+3429 -265 3440 -252 3448 -236 ct 3448 -236 l  3448 -282 l  3448 -384 l  3520 -384 l 
+3520 -61 l  3520 -44 3521 -24 3522 0 ct 3452 0 l  p
+3449 -142 m  3449 -172 3444 -195 3434 -212 ct 3423 -228 3409 -236 3389 -236 ct 
+3370 -236 3355 -228 3346 -212 ct 3336 -197 3331 -172 3331 -140 ct 3331 -76 3350 -45 3388 -45 ct 
+3408 -45 3422 -53 3433 -70 ct 3443 -87 3449 -111 3449 -142 ct p ef
+pom
+pum
+15584 479 t
+301 -141 m  301 -95 292 -59 274 -33 ct 255 -8 229 5 194 5 ct 174 5 157 1 143 -8 ct 
+128 -17 117 -29 110 -45 ct 109 -45 l  109 -39 109 -31 108 -20 ct 107 -10 106 -3 105 0 ct 
+35 0 l  36 -16 37 -38 37 -64 ct 37 -384 l  110 -384 l  110 -277 l  108 -231 l 
+110 -231 l  126 -267 156 -285 199 -285 ct 232 -285 257 -272 275 -247 ct 293 -222 301 -187 301 -141 ct 
+p
+226 -141 m  226 -173 221 -196 212 -212 ct 203 -227 188 -235 169 -235 ct 149 -235 134 -226 124 -210 ct 
+114 -193 108 -170 108 -139 ct 108 -109 114 -86 124 -69 ct 134 -53 149 -45 168 -45 ct 
+207 -45 226 -77 226 -141 ct p ef
+324 110 m  351 70 371 30 383 -8 ct 395 -47 401 -90 401 -137 ct 401 -185 395 -228 383 -267 ct 
+370 -306 351 -345 324 -384 ct 396 -384 l  423 -345 443 -306 455 -267 ct 467 -228 473 -185 473 -137 ct 
+473 -89 467 -46 455 -7 ct 443 32 423 71 396 110 ct 324 110 l  p ef
+851 -55 m  897 -55 929 -78 947 -124 ct 1014 -99 l  999 -64 978 -38 951 -21 ct 
+923 -4 890 5 851 5 ct 793 5 748 -12 716 -45 ct 684 -78 668 -124 668 -184 ct 668 -244 683 -290 714 -322 ct 
+745 -354 789 -370 848 -370 ct 891 -370 925 -361 952 -344 ct 979 -327 998 -302 1009 -269 ct 
+942 -250 l  936 -269 925 -283 908 -294 ct 892 -305 872 -310 850 -310 ct 815 -310 789 -299 771 -278 ct 
+753 -257 744 -225 744 -184 ct 744 -142 754 -110 772 -88 ct 790 -66 817 -55 851 -55 ct 
+p ef
+1137 -224 m  1147 -245 1160 -261 1174 -271 ct 1189 -280 1207 -285 1227 -285 ct 
+1257 -285 1280 -276 1296 -258 ct 1311 -239 1319 -213 1319 -178 ct 1319 0 l  1247 0 l 
+1247 -157 l  1247 -206 1230 -230 1197 -230 ct 1180 -230 1165 -223 1155 -208 ct 
+1144 -193 1139 -173 1139 -150 ct 1139 0 l  1066 0 l  1066 -384 l  1139 -384 l 
+1139 -279 l  1139 -260 1138 -242 1136 -224 ct 1137 -224 l  p ef
+1454 5 m  1426 5 1405 -2 1390 -17 ct 1375 -32 1368 -53 1368 -79 ct 1368 -108 1377 -130 1396 -145 ct 
+1415 -161 1442 -168 1478 -169 ct 1538 -170 l  1538 -184 l  1538 -202 1535 -216 1528 -225 ct 
+1522 -234 1512 -238 1497 -238 ct 1484 -238 1474 -235 1468 -229 ct 1461 -223 1457 -213 1456 -198 ct 
+1380 -202 l  1385 -229 1397 -250 1417 -264 ct 1438 -278 1465 -285 1500 -285 ct 
+1536 -285 1563 -276 1582 -259 ct 1601 -242 1611 -217 1611 -185 ct 1611 -83 l 
+1611 -67 1612 -56 1616 -50 ct 1619 -45 1625 -42 1634 -42 ct 1639 -42 1644 -42 1650 -43 ct 
+1650 -4 l  1645 -3 1641 -2 1638 -1 ct 1634 0 1631 1 1628 1 ct 1624 2 1621 2 1617 2 ct 
+1613 3 1608 3 1603 3 ct 1585 3 1571 -2 1563 -11 ct 1554 -19 1549 -33 1547 -50 ct 
+1545 -50 l  1525 -13 1495 5 1454 5 ct p
+1538 -130 m  1501 -129 l  1484 -128 1472 -127 1465 -124 ct 1458 -121 1452 -116 1449 -110 ct 
+1445 -104 1443 -95 1443 -85 ct 1443 -72 1446 -62 1452 -55 ct 1458 -49 1467 -46 1477 -46 ct 
+1488 -46 1499 -49 1508 -55 ct 1517 -61 1525 -70 1530 -81 ct 1535 -92 1538 -103 1538 -115 ct 
+1538 -130 l  p ef
+1864 0 m  1864 -157 l  1864 -206 1847 -230 1814 -230 ct 1797 -230 1782 -223 1772 -208 ct 
+1761 -193 1756 -173 1756 -150 ct 1756 0 l  1683 0 l  1683 -217 l  1683 -232 1683 -245 1682 -254 ct 
+1682 -264 1681 -272 1681 -280 ct 1750 -280 l  1751 -277 1751 -268 1752 -253 ct 
+1753 -239 1753 -229 1753 -224 ct 1754 -224 l  1764 -245 1777 -261 1791 -271 ct 
+1806 -280 1824 -285 1844 -285 ct 1874 -285 1897 -276 1913 -258 ct 1928 -239 1936 -213 1936 -178 ct 
+1936 0 l  1864 0 l  p ef
+2187 0 m  2187 -157 l  2187 -206 2170 -230 2137 -230 ct 2120 -230 2105 -223 2095 -208 ct 
+2084 -193 2079 -173 2079 -150 ct 2079 0 l  2006 0 l  2006 -217 l  2006 -232 2006 -245 2005 -254 ct 
+2005 -264 2004 -272 2004 -280 ct 2073 -280 l  2074 -277 2074 -268 2075 -253 ct 
+2076 -239 2076 -229 2076 -224 ct 2077 -224 l  2087 -245 2100 -261 2114 -271 ct 
+2129 -280 2147 -285 2167 -285 ct 2197 -285 2220 -276 2236 -258 ct 2251 -239 2259 -213 2259 -178 ct 
+2259 0 l  2187 0 l  p ef
+2444 5 m  2402 5 2370 -7 2348 -32 ct 2325 -57 2314 -94 2314 -141 ct 2314 -187 2325 -223 2348 -248 ct 
+2371 -273 2403 -285 2445 -285 ct 2486 -285 2516 -272 2537 -245 ct 2559 -218 2569 -179 2569 -128 ct 
+2569 -126 l  2390 -126 l  2390 -99 2395 -78 2405 -64 ct 2415 -51 2429 -44 2448 -44 ct 
+2474 -44 2490 -55 2497 -77 ct 2565 -71 l  2545 -20 2505 5 2444 5 ct p
+2444 -239 m  2427 -239 2414 -233 2405 -221 ct 2396 -210 2391 -193 2390 -172 ct 
+2499 -172 l  2497 -194 2492 -211 2483 -222 ct 2473 -234 2460 -239 2444 -239 ct 
+p ef
+2624 0 m  2624 -384 l  2697 -384 l  2697 0 l  2624 0 l  p ef
+3154 -82 m  3154 -55 3142 -34 3120 -18 ct 3098 -3 3068 5 3028 5 ct 2990 5 2961 -1 2940 -13 ct 
+2920 -25 2906 -44 2900 -70 ct 2963 -80 l  2967 -66 2973 -57 2982 -51 ct 2991 -46 3006 -43 3028 -43 ct 
+3049 -43 3064 -46 3073 -51 ct 3082 -56 3087 -64 3087 -75 ct 3087 -84 3083 -91 3076 -97 ct 
+3068 -102 3055 -106 3038 -110 ct 2997 -118 2969 -125 2955 -132 ct 2940 -139 2929 -148 2922 -160 ct 
+2914 -171 2911 -184 2911 -201 ct 2911 -227 2921 -248 2942 -263 ct 2962 -278 2991 -285 3029 -285 ct 
+3062 -285 3089 -279 3109 -266 ct 3129 -253 3142 -234 3147 -210 ct 3083 -203 l 
+3081 -215 3076 -223 3068 -229 ct 3059 -234 3047 -237 3029 -237 ct 3012 -237 2999 -235 2990 -230 ct 
+2982 -226 2977 -219 2977 -208 ct 2977 -200 2981 -194 2987 -189 ct 2994 -184 3005 -180 3021 -177 ct 
+3043 -173 3062 -168 3079 -163 ct 3096 -159 3110 -153 3120 -147 ct 3130 -140 3138 -132 3144 -121 ct 
+3150 -111 3154 -98 3154 -82 ct p ef
+3514 0 m  3437 0 l  3393 -171 l  3391 -179 3387 -198 3381 -228 ct 3367 -170 l 
+3322 0 l  3246 0 l  3173 -280 l  3242 -280 l  3288 -66 l  3291 -85 l  3298 -115 l 
+3342 -280 l  3419 -280 l  3462 -115 l  3465 -106 3468 -90 3473 -66 ct 3480 -100 l 
+3520 -280 l  3588 -280 l  3514 0 l  p ef
+3624 -330 m  3624 -384 l  3697 -384 l  3697 -330 l  3624 -330 l  p
+3624 0 m  3624 -280 l  3697 -280 l  3697 0 l  3624 0 l  p ef
+3842 5 m  3821 5 3805 -1 3793 -12 ct 3782 -24 3776 -42 3776 -65 ct 3776 -230 l 
+3740 -230 l  3740 -279 l  3779 -279 l  3802 -345 l  3848 -345 l  3848 -279 l 
+3901 -279 l  3901 -230 l  3848 -230 l  3848 -85 l  3848 -71 3850 -61 3855 -55 ct 
+3861 -48 3869 -45 3879 -45 ct 3885 -45 3893 -46 3904 -49 ct 3904 -4 l  3886 2 3865 5 3842 5 ct 
+p ef
+4063 5 m  4021 5 3988 -8 3965 -33 ct 3942 -58 3931 -93 3931 -138 ct 3931 -185 3942 -221 3966 -246 ct 
+3989 -272 4022 -285 4064 -285 ct 4097 -285 4125 -277 4146 -260 ct 4168 -244 4181 -221 4187 -192 ct 
+4114 -188 l  4111 -202 4106 -214 4098 -222 ct 4090 -231 4078 -235 4063 -235 ct 
+4026 -235 4007 -204 4007 -141 ct 4007 -77 4026 -45 4064 -45 ct 4078 -45 4089 -49 4099 -58 ct 
+4108 -66 4114 -79 4116 -97 ct 4189 -93 l  4186 -74 4179 -57 4168 -42 ct 4157 -27 4142 -15 4124 -7 ct 
+4106 1 4086 5 4063 5 ct p ef
+4312 -224 m  4322 -245 4335 -261 4349 -271 ct 4364 -280 4382 -285 4402 -285 ct 
+4432 -285 4455 -276 4471 -258 ct 4486 -239 4494 -213 4494 -178 ct 4494 0 l  4422 0 l 
+4422 -157 l  4422 -206 4405 -230 4372 -230 ct 4355 -230 4340 -223 4330 -208 ct 
+4319 -193 4314 -173 4314 -150 ct 4314 0 l  4241 0 l  4241 -384 l  4314 -384 l 
+4314 -279 l  4314 -260 4313 -242 4311 -224 ct 4312 -224 l  p ef
+4828 5 m  4786 5 4753 -8 4730 -33 ct 4707 -58 4696 -93 4696 -138 ct 4696 -185 4707 -221 4731 -246 ct 
+4754 -272 4787 -285 4829 -285 ct 4862 -285 4890 -277 4911 -260 ct 4933 -244 4946 -221 4952 -192 ct 
+4879 -188 l  4876 -202 4871 -214 4863 -222 ct 4855 -231 4843 -235 4828 -235 ct 
+4791 -235 4772 -204 4772 -141 ct 4772 -77 4791 -45 4829 -45 ct 4843 -45 4854 -49 4864 -58 ct 
+4873 -66 4879 -79 4881 -97 ct 4954 -93 l  4951 -74 4944 -57 4933 -42 ct 4922 -27 4907 -15 4889 -7 ct 
+4871 1 4851 5 4828 5 ct p ef
+5071 5 m  5043 5 5022 -2 5007 -17 ct 4992 -32 4985 -53 4985 -79 ct 4985 -108 4994 -130 5013 -145 ct 
+5032 -161 5059 -168 5095 -169 ct 5155 -170 l  5155 -184 l  5155 -202 5152 -216 5145 -225 ct 
+5139 -234 5129 -238 5114 -238 ct 5101 -238 5091 -235 5085 -229 ct 5078 -223 5074 -213 5073 -198 ct 
+4997 -202 l  5002 -229 5014 -250 5034 -264 ct 5055 -278 5082 -285 5117 -285 ct 
+5153 -285 5180 -276 5199 -259 ct 5218 -242 5228 -217 5228 -185 ct 5228 -83 l 
+5228 -67 5229 -56 5233 -50 ct 5236 -45 5242 -42 5251 -42 ct 5256 -42 5261 -42 5267 -43 ct 
+5267 -4 l  5262 -3 5258 -2 5255 -1 ct 5251 0 5248 1 5245 1 ct 5241 2 5238 2 5234 2 ct 
+5230 3 5225 3 5220 3 ct 5202 3 5188 -2 5180 -11 ct 5171 -19 5166 -33 5164 -50 ct 
+5162 -50 l  5142 -13 5112 5 5071 5 ct p
+5155 -130 m  5118 -129 l  5101 -128 5089 -127 5082 -124 ct 5075 -121 5069 -116 5066 -110 ct 
+5062 -104 5060 -95 5060 -85 ct 5060 -72 5063 -62 5069 -55 ct 5075 -49 5084 -46 5094 -46 ct 
+5105 -46 5116 -49 5125 -55 ct 5134 -61 5142 -70 5147 -81 ct 5152 -92 5155 -103 5155 -115 ct 
+5155 -130 l  p ef
+5481 0 m  5481 -157 l  5481 -206 5464 -230 5431 -230 ct 5414 -230 5399 -223 5389 -208 ct 
+5378 -193 5373 -173 5373 -150 ct 5373 0 l  5300 0 l  5300 -217 l  5300 -232 5300 -245 5299 -254 ct 
+5299 -264 5298 -272 5298 -280 ct 5367 -280 l  5368 -277 5368 -268 5369 -253 ct 
+5370 -239 5370 -229 5370 -224 ct 5371 -224 l  5381 -245 5394 -261 5408 -271 ct 
+5423 -280 5441 -285 5461 -285 ct 5491 -285 5514 -276 5530 -258 ct 5545 -239 5553 -213 5553 -178 ct 
+5553 0 l  5481 0 l  p ef
+pom
+pum
+16599 1067 t
+301 -141 m  301 -95 292 -59 274 -33 ct 255 -8 229 5 194 5 ct 174 5 157 1 143 -8 ct 
+128 -17 117 -29 110 -45 ct 109 -45 l  109 -39 109 -31 108 -20 ct 107 -10 106 -3 105 0 ct 
+35 0 l  36 -16 37 -38 37 -64 ct 37 -384 l  110 -384 l  110 -277 l  108 -231 l 
+110 -231 l  126 -267 156 -285 199 -285 ct 232 -285 257 -272 275 -247 ct 293 -222 301 -187 301 -141 ct 
+p
+226 -141 m  226 -173 221 -196 212 -212 ct 203 -227 188 -235 169 -235 ct 149 -235 134 -226 124 -210 ct 
+114 -193 108 -170 108 -139 ct 108 -109 114 -86 124 -69 ct 134 -53 149 -45 168 -45 ct 
+207 -45 226 -77 226 -141 ct p ef
+474 5 m  432 5 400 -7 378 -32 ct 355 -57 344 -94 344 -141 ct 344 -187 355 -223 378 -248 ct 
+401 -273 433 -285 475 -285 ct 516 -285 546 -272 567 -245 ct 589 -218 599 -179 599 -128 ct 
+599 -126 l  420 -126 l  420 -99 425 -78 435 -64 ct 445 -51 459 -44 478 -44 ct 
+504 -44 520 -55 527 -77 ct 595 -71 l  575 -20 535 5 474 5 ct p
+474 -239 m  457 -239 444 -233 435 -221 ct 426 -210 421 -193 420 -172 ct 529 -172 l 
+527 -194 522 -211 513 -222 ct 503 -234 490 -239 474 -239 ct p ef
+802 -330 m  802 -384 l  875 -384 l  875 -330 l  802 -330 l  p
+802 0 m  802 -280 l  875 -280 l  875 0 l  802 0 l  p ef
+1130 0 m  1130 -157 l  1130 -206 1113 -230 1080 -230 ct 1063 -230 1048 -223 1038 -208 ct 
+1027 -193 1022 -173 1022 -150 ct 1022 0 l  949 0 l  949 -217 l  949 -232 949 -245 948 -254 ct 
+948 -264 947 -272 947 -280 ct 1016 -280 l  1017 -277 1017 -268 1018 -253 ct 
+1019 -239 1019 -229 1019 -224 ct 1020 -224 l  1030 -245 1043 -261 1057 -271 ct 
+1072 -280 1090 -285 1110 -285 ct 1140 -285 1163 -276 1179 -258 ct 1194 -239 1202 -213 1202 -178 ct 
+1202 0 l  1130 0 l  p ef
+1343 5 m  1322 5 1306 -1 1294 -12 ct 1283 -24 1277 -42 1277 -65 ct 1277 -230 l 
+1241 -230 l  1241 -279 l  1280 -279 l  1303 -345 l  1349 -345 l  1349 -279 l 
+1402 -279 l  1402 -230 l  1349 -230 l  1349 -85 l  1349 -71 1351 -61 1356 -55 ct 
+1362 -48 1370 -45 1380 -45 ct 1386 -45 1394 -46 1405 -49 ct 1405 -4 l  1387 2 1366 5 1343 5 ct 
+p ef
+1562 5 m  1520 5 1488 -7 1466 -32 ct 1443 -57 1432 -94 1432 -141 ct 1432 -187 1443 -223 1466 -248 ct 
+1489 -273 1521 -285 1563 -285 ct 1604 -285 1634 -272 1655 -245 ct 1677 -218 1687 -179 1687 -128 ct 
+1687 -126 l  1508 -126 l  1508 -99 1513 -78 1523 -64 ct 1533 -51 1547 -44 1566 -44 ct 
+1592 -44 1608 -55 1615 -77 ct 1683 -71 l  1663 -20 1623 5 1562 5 ct p
+1562 -239 m  1545 -239 1532 -233 1523 -221 ct 1514 -210 1509 -193 1508 -172 ct 
+1617 -172 l  1615 -194 1610 -211 1601 -222 ct 1591 -234 1578 -239 1562 -239 ct 
+p ef
+1742 0 m  1742 -214 l  1742 -229 1742 -242 1741 -253 ct 1741 -263 1740 -272 1740 -280 ct 
+1809 -280 l  1810 -277 1810 -267 1811 -251 ct 1812 -236 1812 -225 1812 -220 ct 
+1813 -220 l  1821 -239 1827 -253 1832 -261 ct 1838 -269 1844 -275 1852 -279 ct 
+1860 -283 1869 -285 1880 -285 ct 1890 -285 1897 -284 1903 -281 ct 1903 -220 l 
+1891 -223 1881 -224 1872 -224 ct 1854 -224 1840 -217 1830 -202 ct 1820 -188 1815 -166 1815 -137 ct 
+1815 0 l  1742 0 l  p ef
+1948 0 m  1948 -214 l  1948 -229 1948 -242 1947 -253 ct 1947 -263 1946 -272 1946 -280 ct 
+2015 -280 l  2016 -277 2016 -267 2017 -251 ct 2018 -236 2018 -225 2018 -220 ct 
+2019 -220 l  2027 -239 2033 -253 2038 -261 ct 2044 -269 2050 -275 2058 -279 ct 
+2066 -283 2075 -285 2086 -285 ct 2096 -285 2103 -284 2109 -281 ct 2109 -220 l 
+2097 -223 2087 -224 2078 -224 ct 2060 -224 2046 -217 2036 -202 ct 2026 -188 2021 -166 2021 -137 ct 
+2021 0 l  1948 0 l  p ef
+2222 -280 m  2222 -123 l  2222 -74 2239 -49 2272 -49 ct 2290 -49 2304 -57 2314 -72 ct 
+2325 -87 2331 -106 2331 -130 ct 2331 -280 l  2403 -280 l  2403 -63 l  2403 -39 2404 -18 2405 0 ct 
+2336 0 l  2334 -25 2333 -44 2333 -56 ct 2332 -56 l  2322 -35 2310 -19 2295 -9 ct 
+2280 0 2262 5 2242 5 ct 2212 5 2189 -4 2174 -22 ct 2158 -40 2150 -67 2150 -102 ct 
+2150 -280 l  2222 -280 l  p ef
+2741 -141 m  2741 -94 2732 -58 2713 -33 ct 2695 -8 2668 5 2634 5 ct 2615 5 2598 1 2583 -8 ct 
+2568 -16 2557 -29 2550 -45 ct 2548 -45 l  2549 -39 2550 -24 2550 3 ct 2550 110 l 
+2477 110 l  2477 -215 l  2477 -242 2476 -263 2475 -280 ct 2545 -280 l  2546 -277 2547 -270 2548 -261 ct 
+2548 -252 2548 -243 2548 -234 ct 2550 -234 l  2566 -268 2596 -285 2639 -285 ct 
+2671 -285 2697 -273 2715 -248 ct 2732 -223 2741 -187 2741 -141 ct p
+2666 -141 m  2666 -204 2647 -235 2608 -235 ct 2589 -235 2574 -227 2564 -210 ct 
+2554 -193 2548 -169 2548 -139 ct 2548 -109 2554 -86 2564 -69 ct 2574 -53 2589 -45 2608 -45 ct 
+2646 -45 2666 -77 2666 -141 ct p ef
+2872 5 m  2851 5 2835 -1 2823 -12 ct 2812 -24 2806 -42 2806 -65 ct 2806 -230 l 
+2770 -230 l  2770 -279 l  2809 -279 l  2832 -345 l  2878 -345 l  2878 -279 l 
+2931 -279 l  2931 -230 l  2878 -230 l  2878 -85 l  2878 -71 2880 -61 2885 -55 ct 
+2891 -48 2899 -45 2909 -45 ct 2915 -45 2923 -46 2934 -49 ct 2934 -4 l  2916 2 2895 5 2872 5 ct 
+p ef
+3091 5 m  3049 5 3017 -7 2995 -32 ct 2972 -57 2961 -94 2961 -141 ct 2961 -187 2972 -223 2995 -248 ct 
+3018 -273 3050 -285 3092 -285 ct 3133 -285 3163 -272 3184 -245 ct 3206 -218 3216 -179 3216 -128 ct 
+3216 -126 l  3037 -126 l  3037 -99 3042 -78 3052 -64 ct 3062 -51 3076 -44 3095 -44 ct 
+3121 -44 3137 -55 3144 -77 ct 3212 -71 l  3192 -20 3152 5 3091 5 ct p
+3091 -239 m  3074 -239 3061 -233 3052 -221 ct 3043 -210 3038 -193 3037 -172 ct 
+3146 -172 l  3144 -194 3139 -211 3130 -222 ct 3120 -234 3107 -239 3091 -239 ct 
+p ef
+3452 0 m  3451 -3 3451 -9 3450 -20 ct 3449 -30 3448 -39 3448 -46 ct 3447 -46 l 
+3431 -12 3402 5 3358 5 ct 3325 5 3300 -8 3282 -33 ct 3265 -59 3256 -94 3256 -140 ct 
+3256 -186 3265 -222 3284 -247 ct 3302 -273 3329 -285 3363 -285 ct 3383 -285 3400 -281 3414 -273 ct 
+3429 -265 3440 -252 3448 -236 ct 3448 -236 l  3448 -282 l  3448 -384 l  3520 -384 l 
+3520 -61 l  3520 -44 3521 -24 3522 0 ct 3452 0 l  p
+3449 -142 m  3449 -172 3444 -195 3434 -212 ct 3423 -228 3409 -236 3389 -236 ct 
+3370 -236 3355 -228 3346 -212 ct 3336 -197 3331 -172 3331 -140 ct 3331 -76 3350 -45 3388 -45 ct 
+3408 -45 3422 -53 3433 -70 ct 3443 -87 3449 -111 3449 -142 ct p ef
+pom
+gs
+0 lw 1 lj [ 215.6 80.85 ] 0 ld
+19250 2754 m  19250 3516 l  ps
+gr
+pum
+19285 3433 t
+0.750 0.003 0.257 c 33 -316 m  33 -357 l  76 -357 l  76 -316 l  33 -316 l 
+p
+33 0 m  33 -260 l  76 -260 l  76 0 l  33 0 l  p ef
+308 0 m  308 -165 l  308 -182 306 -195 303 -205 ct 299 -214 294 -221 286 -225 ct 
+279 -229 268 -232 254 -232 ct 233 -232 217 -224 205 -210 ct 193 -196 187 -176 187 -151 ct 
+187 0 l  143 0 l  143 -205 l  143 -235 143 -253 142 -260 ct 183 -260 l  183 -259 183 -257 183 -254 ct 
+183 -250 184 -246 184 -242 ct 184 -237 184 -228 185 -216 ct 185 -216 l  195 -234 207 -246 220 -254 ct 
+233 -261 249 -265 269 -265 ct 297 -265 318 -258 331 -244 ct 345 -230 351 -206 351 -173 ct 
+351 0 l  308 0 l  p ef
+515 -2 m  501 2 486 4 472 4 ct 437 4 420 -16 420 -55 ct 420 -229 l  389 -229 l 
+389 -260 l  421 -260 l  434 -318 l  463 -318 l  463 -260 l  511 -260 l 
+511 -229 l  463 -229 l  463 -64 l  463 -52 465 -43 469 -38 ct 473 -33 480 -30 490 -30 ct 
+496 -30 504 -32 515 -34 ct 515 -2 l  p ef
+585 -121 m  585 -91 592 -68 604 -52 ct 616 -36 634 -27 658 -27 ct 677 -27 692 -31 703 -39 ct 
+715 -46 722 -56 726 -67 ct 764 -57 l  749 -16 713 5 658 5 ct 620 5 590 -6 570 -29 ct 
+550 -52 540 -86 540 -132 ct 540 -175 550 -208 570 -231 ct 590 -254 619 -265 656 -265 ct 
+733 -265 771 -219 771 -127 ct 771 -121 l  585 -121 l  p
+727 -154 m  724 -181 717 -201 706 -214 ct 694 -227 677 -233 656 -233 ct 635 -233 618 -226 606 -212 ct 
+594 -198 587 -179 586 -154 ct 727 -154 l  p ef
+826 0 m  826 -200 l  826 -218 826 -238 825 -260 ct 866 -260 l  867 -231 868 -213 868 -207 ct 
+869 -207 l  875 -229 883 -245 892 -253 ct 901 -261 914 -265 930 -265 ct 936 -265 942 -264 948 -263 ct 
+948 -223 l  942 -225 935 -225 925 -225 ct 907 -225 893 -218 884 -202 ct 874 -187 870 -164 870 -136 ct 
+870 0 l  826 0 l  p ef
+989 0 m  989 -200 l  989 -218 989 -238 988 -260 ct 1029 -260 l  1030 -231 1031 -213 1031 -207 ct 
+1032 -207 l  1038 -229 1046 -245 1055 -253 ct 1064 -261 1077 -265 1093 -265 ct 
+1099 -265 1105 -264 1111 -263 ct 1111 -223 l  1105 -225 1098 -225 1088 -225 ct 
+1070 -225 1056 -218 1047 -202 ct 1037 -187 1033 -164 1033 -136 ct 1033 0 l  989 0 l 
+p ef
+1195 -260 m  1195 -95 l  1195 -78 1196 -65 1200 -55 ct 1203 -46 1208 -39 1216 -35 ct 
+1223 -31 1234 -28 1248 -28 ct 1269 -28 1286 -36 1298 -50 ct 1310 -64 1316 -84 1316 -109 ct 
+1316 -260 l  1359 -260 l  1359 -55 l  1359 -25 1359 -7 1360 0 ct 1320 0 l 
+1319 -1 1319 -3 1319 -6 ct 1319 -10 1319 -14 1318 -18 ct 1318 -23 1318 -32 1318 -44 ct 
+1317 -44 l  1307 -26 1295 -14 1282 -6 ct 1269 1 1253 5 1234 5 ct 1205 5 1184 -2 1171 -16 ct 
+1158 -30 1151 -54 1151 -87 ct 1151 -260 l  1195 -260 l  p ef
+1645 -131 m  1645 -40 1614 5 1550 5 ct 1510 5 1483 -10 1469 -40 ct 1468 -40 l 
+1468 -39 1469 -25 1469 1 ct 1469 102 l  1425 102 l  1425 -207 l  1425 -234 1425 -252 1424 -260 ct 
+1466 -260 l  1466 -260 1466 -258 1466 -254 ct 1467 -250 1467 -244 1467 -235 ct 
+1468 -227 1468 -222 1468 -219 ct 1469 -219 l  1477 -235 1487 -246 1500 -254 ct 
+1512 -261 1529 -265 1550 -265 ct 1582 -265 1606 -254 1622 -233 ct 1638 -211 1645 -177 1645 -131 ct 
+p
+1600 -130 m  1600 -167 1595 -193 1585 -208 ct 1576 -224 1560 -232 1539 -232 ct 
+1521 -232 1508 -228 1498 -221 ct 1489 -214 1481 -202 1476 -187 ct 1471 -172 1469 -152 1469 -127 ct 
+1469 -93 1474 -68 1485 -51 ct 1496 -35 1514 -27 1538 -27 ct 1560 -27 1575 -35 1585 -51 ct 
+1595 -67 1600 -93 1600 -130 ct p ef
+1798 -2 m  1784 2 1769 4 1755 4 ct 1720 4 1703 -16 1703 -55 ct 1703 -229 l  1672 -229 l 
+1672 -260 l  1704 -260 l  1717 -318 l  1746 -318 l  1746 -260 l  1794 -260 l 
+1794 -229 l  1746 -229 l  1746 -64 l  1746 -52 1748 -43 1752 -38 ct 1756 -33 1763 -30 1773 -30 ct 
+1779 -30 1787 -32 1798 -34 ct 1798 -2 l  p ef
+1867 -121 m  1867 -91 1874 -68 1886 -52 ct 1898 -36 1916 -27 1940 -27 ct 1959 -27 1974 -31 1985 -39 ct 
+1997 -46 2004 -56 2008 -67 ct 2046 -57 l  2031 -16 1995 5 1940 5 ct 1902 5 1872 -6 1852 -29 ct 
+1832 -52 1822 -86 1822 -132 ct 1822 -175 1832 -208 1852 -231 ct 1872 -254 1901 -265 1938 -265 ct 
+2015 -265 2053 -219 2053 -127 ct 2053 -121 l  1867 -121 l  p
+2009 -154 m  2006 -181 1999 -201 1988 -214 ct 1976 -227 1959 -233 1938 -233 ct 
+1917 -233 1900 -226 1888 -212 ct 1876 -198 1869 -179 1868 -154 ct 2009 -154 l 
+p ef
+2273 -42 m  2265 -26 2254 -14 2241 -6 ct 2228 1 2211 4 2192 4 ct 2159 4 2134 -7 2119 -29 ct 
+2103 -51 2096 -84 2096 -129 ct 2096 -220 2128 -265 2192 -265 ct 2211 -265 2228 -261 2241 -254 ct 
+2254 -247 2265 -236 2273 -220 ct 2273 -220 l  2273 -249 l  2273 -357 l  2316 -357 l 
+2316 -54 l  2316 -27 2316 -9 2317 0 ct 2276 0 l  2276 -3 2275 -9 2274 -18 ct 
+2274 -27 2274 -35 2274 -42 ct 2273 -42 l  p
+2141 -131 m  2141 -94 2146 -68 2156 -53 ct 2165 -37 2181 -29 2203 -29 ct 2227 -29 2245 -37 2256 -54 ct 
+2267 -71 2273 -98 2273 -133 ct 2273 -168 2267 -193 2256 -209 ct 2245 -225 2227 -233 2203 -233 ct 
+2181 -233 2165 -225 2156 -209 ct 2146 -193 2141 -167 2141 -131 ct p ef
+pom
+gr
+gs
+0 0 m 25399 0 l 25399 9753 l 0 9753 l 0 0 l eoclip newpath
+gr
+gr
+0 9754 t 
+pom
+count op_count sub {pop} repeat countdictstack dict_count sub {end} repeat b4_inc_state restore
+%%PageTrailer
+%%Trailer
+%%EOF
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/doc/source/figures/emlsr-ul-txop.eps ns-3.44/src/wifi/doc/source/figures/emlsr-ul-txop.eps
--- ns-3.43/src/wifi/doc/source/figures/emlsr-ul-txop.eps	2024-10-09 16:41:10.108656600 -0700
+++ ns-3.44/src/wifi/doc/source/figures/emlsr-ul-txop.eps	2025-03-09 16:55:49.767372600 -0700
@@ -1,7 +1,7 @@
 %!PS-Adobe-3.0 EPSF-3.0 
 %%BoundingBox: 0 0 1077 567
 %%Pages: 0
-%%Creator: LibreOffice 7.5
+%%Creator: LibreOffice 24.8
 %%Title: none
 %%CreationDate: none
 %%LanguageLevel: 2
@@ -50,3300 +50,4994 @@
 %%BeginPageSetup
 %%EndPageSetup
 pum
-0.02834 0.02832 s 
-0 -20018 t
+0.02834 0.02834 s 
+0 -20002 t
 /tm matrix currentmatrix def
-tm setmatrix
--2305 -2322 t 
-1 1 s 
 gs
-0 lw 1 lj 0.003 0.003 0.003 c 2291 7066 m  37533 7066 l  ps
+0 0 m 37993 0 l 37993 20001 l 0 20001 l 0 0 l eoclip newpath
+gs
+0 0 m 37993 0 l 37993 20001 l 0 20001 l 0 0 l eoclip newpath
+gs
+0 lw 1 lj 0.007 0.007 0.007 c -15 4991 m  35219 4991 l  ps
 gr
-pum
-2542 6732 t
-0.003 0.003 0.003 c 362 0 m  312 -128 l  113 -128 l  63 0 l  1 0 l  180 -438 l 
-247 -438 l  422 0 l  362 0 l  p
-212 -393 m  210 -384 l  204 -367 197 -345 187 -318 ct 131 -174 l  294 -174 l 
-238 -319 l  232 -333 227 -349 221 -367 ct 212 -393 l  p ef
-813 -305 m  813 -264 800 -231 773 -207 ct 746 -182 709 -170 663 -170 ct 534 -170 l 
-534 1 l  475 1 l  475 -437 l  659 -437 l  708 -437 746 -426 773 -403 ct 800 -380 813 -347 813 -305 ct 
-p
-754 -305 m  754 -361 720 -390 652 -390 ct 534 -390 l  534 -217 l  654 -217 l 
-720 -217 754 -246 754 -305 ct p ef
-1436 0 m  1436 -292 l  1436 -324 1436 -355 1438 -385 ct 1428 -348 1419 -319 1411 -298 ct 
-1298 0 l  1257 0 l  1142 -298 l  1125 -351 l  1115 -385 l  1116 -351 l 
-1117 -292 l  1117 0 l  1064 0 l  1064 -438 l  1142 -438 l  1258 -134 l 
-1262 -122 1266 -109 1270 -95 ct 1274 -81 1276 -71 1278 -65 ct 1279 -73 1283 -85 1288 -102 ct 
-1293 -119 1297 -130 1299 -134 ct 1413 -438 l  1489 -438 l  1489 0 l  1436 0 l 
-p ef
-1593 0 m  1593 -438 l  1652 -438 l  1652 -48 l  1873 -48 l  1873 0 l  1593 0 l 
-p ef
-2320 -223 m  2320 -178 2311 -139 2294 -105 ct 2276 -71 2251 -45 2219 -27 ct 
-2187 -9 2150 0 2107 0 ct 1944 0 l  1944 -437 l  2089 -437 l  2163 -437 2220 -419 2260 -382 ct 
-2300 -345 2320 -292 2320 -223 ct p
-2261 -223 m  2261 -277 2246 -319 2216 -347 ct 2187 -376 2144 -390 2087 -390 ct 
-2003 -390 l  2003 -47 l  2101 -47 l  2133 -47 2161 -55 2185 -69 ct 2209 -83 2228 -103 2241 -129 ct 
-2254 -156 2261 -187 2261 -223 ct p ef
-pom
-pum
-2542 8032 t
-52 0 m  52 -437 l  384 -437 l  384 -389 l  111 -389 l  111 -249 l  365 -249 l 
-365 -201 l  111 -201 l  111 -48 l  396 -48 l  396 0 l  52 0 l  p ef
-847 0 m  847 -292 l  847 -324 847 -355 849 -385 ct 839 -348 830 -319 822 -298 ct 
-709 0 l  668 0 l  553 -298 l  536 -351 l  526 -385 l  527 -351 l  528 -292 l 
-528 0 l  475 0 l  475 -438 l  553 -438 l  669 -134 l  673 -122 677 -109 681 -95 ct 
-685 -81 687 -71 689 -65 ct 690 -73 694 -85 699 -102 ct 704 -119 708 -130 710 -134 ct 
-824 -438 l  900 -438 l  900 0 l  847 0 l  p ef
-1005 0 m  1005 -438 l  1064 -438 l  1064 -48 l  1285 -48 l  1285 0 l  1005 0 l 
-p ef
-1698 -121 m  1698 -81 1683 -49 1651 -27 ct 1620 -5 1575 6 1518 6 ct 1411 6 1350 -31 1333 -105 ct 
-1390 -117 l  1397 -90 1411 -71 1432 -59 ct 1454 -46 1483 -40 1520 -40 ct 1558 -40 1588 -47 1609 -60 ct 
-1629 -73 1640 -92 1640 -118 ct 1640 -132 1637 -144 1630 -153 ct 1624 -161 1614 -169 1603 -175 ct 
-1591 -180 1577 -185 1560 -189 ct 1544 -193 1526 -197 1506 -202 ct 1472 -210 1445 -217 1428 -225 ct 
-1410 -233 1396 -241 1385 -250 ct 1375 -260 1367 -271 1362 -284 ct 1356 -296 1353 -311 1353 -327 ct 
-1353 -364 1368 -393 1396 -414 ct 1425 -434 1466 -444 1519 -444 ct 1569 -444 1607 -436 1633 -421 ct 
-1659 -406 1678 -380 1688 -343 ct 1630 -333 l  1623 -356 1611 -373 1593 -384 ct 
-1575 -394 1550 -399 1519 -399 ct 1484 -399 1457 -394 1439 -382 ct 1420 -370 1411 -353 1411 -330 ct 
-1411 -317 1415 -306 1422 -297 ct 1429 -288 1439 -281 1453 -274 ct 1466 -268 1493 -261 1533 -252 ct 
-1546 -249 1560 -246 1573 -242 ct 1586 -239 1599 -235 1611 -231 ct 1623 -226 1635 -221 1646 -215 ct 
-1656 -209 1665 -202 1673 -193 ct 1681 -185 1687 -174 1692 -163 ct 1696 -151 1698 -137 1698 -121 ct 
-p ef
-2088 -1 m  1974 -182 l  1838 -182 l  1838 -1 l  1779 -1 l  1779 -437 l 
-1985 -437 l  2034 -437 2072 -426 2099 -404 ct 2125 -382 2139 -352 2139 -313 ct 
-2139 -280 2129 -253 2110 -231 ct 2091 -209 2065 -195 2032 -189 ct 2156 -1 l 
-2088 -1 l  p
-2079 -312 m  2079 -337 2071 -357 2053 -370 ct 2036 -383 2011 -390 1979 -390 ct 
-1838 -390 l  1838 -229 l  1981 -229 l  2012 -229 2037 -236 2054 -251 ct 2071 -265 2079 -286 2079 -312 ct 
+gs
+0.007 0.007 0.007 c 598 4642 m  548 4507 l  349 4507 l  299 4642 l  237 4642 l 
+416 4180 l  483 4180 l  659 4642 l  598 4642 l  p
+448 4227 m  446 4237 l  440 4255 433 4278 423 4306 ct 367 4459 l  530 4459 l 
+474 4305 l  468 4291 463 4274 457 4255 ct 448 4227 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 1050 4320 m  1050 4363 1037 4399 1010 4424 ct 983 4451 946 4463 900 4463 ct 
+770 4463 l  770 4643 l  711 4643 l  711 4181 l  896 4181 l  945 4181 983 4193 1010 4217 ct 
+1037 4241 1050 4276 1050 4320 ct p
+991 4320 m  991 4261 957 4231 889 4231 ct 770 4231 l  770 4414 l  891 4414 l 
+957 4414 991 4383 991 4320 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 1673 4642 m  1673 4334 l  1673 4300 1673 4267 1675 4236 ct 
+1665 4275 1656 4305 1648 4327 ct 1535 4642 l  1494 4642 l  1378 4327 l  1361 4272 l 
+1351 4236 l  1352 4272 l  1353 4334 l  1353 4642 l  1300 4642 l  1300 4180 l 
+1378 4180 l  1495 4501 l  1499 4514 1503 4527 1507 4542 ct 1511 4557 1513 4567 1515 4574 ct 
+1516 4565 1520 4553 1525 4535 ct 1530 4517 1534 4505 1536 4501 ct 1650 4180 l 
+1726 4180 l  1726 4642 l  1673 4642 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 1829 4642 m  1829 4180 l  1888 4180 l  1888 4592 l  2110 4592 l 
+2110 4642 l  1829 4642 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 2557 4407 m  2557 4455 2548 4496 2531 4532 ct 2513 4567 2488 4595 2456 4614 ct 
+2423 4633 2386 4642 2343 4642 ct 2180 4642 l  2180 4181 l  2325 4181 l  2399 4181 2457 4200 2497 4239 ct 
+2537 4278 2557 4334 2557 4407 ct p
+2498 4407 m  2498 4349 2483 4305 2453 4276 ct 2423 4245 2380 4231 2323 4231 ct 
+2239 4231 l  2239 4593 l  2337 4593 l  2369 4593 2397 4584 2421 4569 ct 2446 4555 2465 4534 2478 4506 ct 
+2491 4478 2498 4445 2498 4407 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 288 6008 m  288 5548 l  621 5548 l  621 5599 l  347 5599 l 
+347 5747 l  602 5747 l  602 5798 l  347 5798 l  347 5958 l  633 5958 l 
+633 6008 l  288 6008 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 1084 6008 m  1084 5701 l  1084 5667 1084 5635 1086 5603 ct 
+1076 5642 1067 5673 1058 5695 ct 945 6008 l  904 6008 l  789 5695 l  772 5639 l 
+762 5603 l  763 5639 l  764 5701 l  764 6008 l  711 6008 l  711 5547 l 
+789 5547 l  905 5867 l  909 5880 913 5894 917 5908 ct 921 5923 923 5934 925 5940 ct 
+926 5932 930 5919 935 5901 ct 940 5883 944 5872 946 5867 ct 1061 5547 l  1137 5547 l 
+1137 6008 l  1084 6008 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 1241 6008 m  1241 5547 l  1301 5547 l  1301 5958 l  1522 5958 l 
+1522 6008 l  1241 6008 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 1935 5880 m  1935 5923 1920 5957 1888 5980 ct 1857 6003 1812 6015 1755 6015 ct 
+1648 6015 1586 5976 1569 5897 ct 1626 5884 l  1633 5914 1648 5934 1669 5946 ct 
+1691 5960 1720 5966 1757 5966 ct 1795 5966 1825 5959 1846 5945 ct 1866 5932 1877 5912 1877 5883 ct 
+1877 5868 1874 5857 1867 5846 ct 1861 5839 1851 5829 1840 5824 ct 1828 5819 1814 5814 1797 5809 ct 
+1781 5805 1763 5801 1743 5796 ct 1709 5787 1682 5780 1665 5772 ct 1647 5763 1632 5755 1621 5745 ct 
+1611 5735 1603 5723 1598 5709 ct 1592 5697 1589 5681 1589 5664 ct 1589 5625 1604 5595 1632 5573 ct 
+1662 5552 1703 5541 1756 5541 ct 1806 5541 1844 5549 1870 5565 ct 1896 5581 1915 5608 1925 5647 ct 
+1867 5658 l  1860 5634 1848 5616 1830 5604 ct 1812 5594 1787 5588 1756 5588 ct 
+1721 5588 1694 5594 1676 5606 ct 1657 5619 1648 5637 1648 5661 ct 1648 5675 1652 5686 1659 5696 ct 
+1666 5705 1676 5713 1690 5720 ct 1703 5726 1730 5734 1770 5743 ct 1783 5746 1797 5749 1810 5754 ct 
+1823 5757 1836 5761 1848 5765 ct 1860 5770 1872 5776 1883 5782 ct 1893 5788 1902 5796 1910 5805 ct 
+1918 5814 1924 5825 1929 5836 ct 1933 5848 1935 5863 1935 5880 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 2325 6007 m  2211 5818 l  2075 5818 l  2075 6007 l  2015 6007 l 
+2015 5548 l  2222 5548 l  2271 5548 2309 5560 2336 5583 ct 2362 5606 2376 5638 2376 5679 ct 
+2376 5714 2366 5743 2347 5766 ct 2328 5789 2302 5804 2269 5810 ct 2393 6007 l 
+2325 6007 l  p
+2316 5680 m  2316 5654 2308 5633 2290 5619 ct 2273 5605 2248 5598 2216 5598 ct 
+2075 5598 l  2075 5768 l  2218 5768 l  2249 5768 2274 5761 2291 5745 ct 2308 5730 2316 5707 2316 5680 ct 
 p ef
-pom
-pum
-2896 8743 t
-85 -170 m  85 -125 92 -92 106 -70 ct 120 -49 142 -38 170 -38 ct 190 -38 206 -43 220 -54 ct 
-233 -65 241 -81 244 -104 ct 301 -100 l  296 -68 283 -42 260 -23 ct 236 -4 207 6 171 6 ct 
-125 6 89 -9 64 -39 ct 39 -68 27 -111 27 -168 ct 27 -225 39 -268 64 -297 ct 89 -327 125 -342 171 -342 ct 
-205 -342 234 -333 256 -315 ct 279 -298 293 -273 299 -242 ct 242 -237 l  239 -256 231 -271 220 -282 ct 
-208 -293 191 -298 169 -298 ct 140 -298 118 -288 105 -269 ct 92 -249 85 -216 85 -170 ct 
-p ef
-361 1 m  361 -460 l  417 -460 l  417 1 l  361 1 l  p ef
-499 -407 m  499 -460 l  555 -460 l  555 -407 l  499 -407 l  p
-499 1 m  499 -335 l  555 -335 l  555 1 l  499 1 l  p ef
-683 -156 m  683 -118 691 -88 706 -67 ct 722 -46 746 -36 776 -36 ct 800 -36 820 -41 834 -50 ct 
-849 -60 859 -72 864 -87 ct 913 -73 l  893 -20 847 6 776 6 ct 727 6 689 -9 663 -38 ct 
-637 -68 624 -112 624 -170 ct 624 -226 637 -268 663 -298 ct 689 -327 726 -342 774 -342 ct 
-873 -342 922 -283 922 -164 ct 922 -156 l  683 -156 l  p
-864 -199 m  861 -234 852 -260 837 -277 ct 822 -293 801 -301 773 -301 ct 746 -301 725 -292 709 -274 ct 
-693 -256 684 -231 683 -199 ct 864 -199 l  p ef
-1204 0 m  1204 -213 l  1204 -235 1202 -252 1197 -264 ct 1193 -277 1186 -285 1177 -291 ct 
-1167 -296 1153 -299 1135 -299 ct 1108 -299 1087 -290 1071 -271 ct 1056 -253 1048 -227 1048 -195 ct 
-1048 0 l  992 0 l  992 -264 l  992 -303 991 -327 990 -336 ct 1043 -336 l 
-1043 -335 1043 -332 1044 -327 ct 1044 -323 1044 -318 1044 -312 ct 1045 -306 1045 -295 1045 -278 ct 
-1046 -278 l  1059 -302 1074 -318 1091 -328 ct 1108 -337 1129 -342 1154 -342 ct 
-1190 -342 1217 -333 1234 -315 ct 1251 -296 1260 -266 1260 -224 ct 1260 0 l  1204 0 l 
-p ef
-1472 -2 m  1453 3 1435 5 1415 5 ct 1371 5 1348 -20 1348 -71 ct 1348 -295 l  1310 -295 l 
-1310 -336 l  1351 -336 l  1367 -411 l  1404 -411 l  1404 -336 l  1466 -336 l 
-1466 -295 l  1404 -295 l  1404 -83 l  1404 -67 1407 -56 1412 -49 ct 1417 -43 1427 -39 1440 -39 ct 
-1447 -39 1458 -41 1472 -44 ct 1472 -2 l  p ef
-pom
-pum
-2542 14233 t
-362 0 m  312 -128 l  113 -128 l  63 0 l  1 0 l  180 -438 l  247 -438 l 
-422 0 l  362 0 l  p
-212 -393 m  210 -384 l  204 -367 197 -345 187 -318 ct 131 -174 l  294 -174 l 
-238 -319 l  232 -333 227 -349 221 -367 ct 212 -393 l  p ef
-813 -305 m  813 -264 800 -231 773 -207 ct 746 -182 709 -170 663 -170 ct 534 -170 l 
-534 1 l  475 1 l  475 -437 l  659 -437 l  708 -437 746 -426 773 -403 ct 800 -380 813 -347 813 -305 ct 
-p
-754 -305 m  754 -361 720 -390 652 -390 ct 534 -390 l  534 -217 l  654 -217 l 
-720 -217 754 -246 754 -305 ct p ef
-1436 0 m  1436 -292 l  1436 -324 1436 -355 1438 -385 ct 1428 -348 1419 -319 1411 -298 ct 
-1298 0 l  1257 0 l  1142 -298 l  1125 -351 l  1115 -385 l  1116 -351 l 
-1117 -292 l  1117 0 l  1064 0 l  1064 -438 l  1142 -438 l  1258 -134 l 
-1262 -122 1266 -109 1270 -95 ct 1274 -81 1276 -71 1278 -65 ct 1279 -73 1283 -85 1288 -102 ct 
-1293 -119 1297 -130 1299 -134 ct 1413 -438 l  1489 -438 l  1489 0 l  1436 0 l 
-p ef
-1593 0 m  1593 -438 l  1652 -438 l  1652 -48 l  1873 -48 l  1873 0 l  1593 0 l 
-p ef
-2320 -223 m  2320 -178 2311 -139 2294 -105 ct 2276 -71 2251 -45 2219 -27 ct 
-2187 -9 2150 0 2107 0 ct 1944 0 l  1944 -437 l  2089 -437 l  2163 -437 2220 -419 2260 -382 ct 
-2300 -345 2320 -292 2320 -223 ct p
-2261 -223 m  2261 -277 2246 -319 2216 -347 ct 2187 -376 2144 -390 2087 -390 ct 
-2003 -390 l  2003 -47 l  2101 -47 l  2133 -47 2161 -55 2185 -69 ct 2209 -83 2228 -103 2241 -129 ct 
-2254 -156 2261 -187 2261 -223 ct p ef
-pom
-pum
-2542 15532 t
-52 0 m  52 -437 l  384 -437 l  384 -389 l  111 -389 l  111 -249 l  365 -249 l 
-365 -201 l  111 -201 l  111 -48 l  396 -48 l  396 0 l  52 0 l  p ef
-847 0 m  847 -292 l  847 -324 847 -355 849 -385 ct 839 -348 830 -319 822 -298 ct 
-709 0 l  668 0 l  553 -298 l  536 -351 l  526 -385 l  527 -351 l  528 -292 l 
-528 0 l  475 0 l  475 -438 l  553 -438 l  669 -134 l  673 -122 677 -109 681 -95 ct 
-685 -81 687 -71 689 -65 ct 690 -73 694 -85 699 -102 ct 704 -119 708 -130 710 -134 ct 
-824 -438 l  900 -438 l  900 0 l  847 0 l  p ef
-1005 0 m  1005 -438 l  1064 -438 l  1064 -48 l  1285 -48 l  1285 0 l  1005 0 l 
-p ef
-1698 -121 m  1698 -81 1683 -49 1651 -27 ct 1620 -5 1575 6 1518 6 ct 1411 6 1350 -31 1333 -105 ct 
-1390 -117 l  1397 -90 1411 -71 1432 -59 ct 1454 -46 1483 -40 1520 -40 ct 1558 -40 1588 -47 1609 -60 ct 
-1629 -73 1640 -92 1640 -118 ct 1640 -132 1637 -144 1630 -153 ct 1624 -161 1614 -169 1603 -175 ct 
-1591 -180 1577 -185 1560 -189 ct 1544 -193 1526 -197 1506 -202 ct 1472 -210 1445 -217 1428 -225 ct 
-1410 -233 1396 -241 1385 -250 ct 1375 -260 1367 -271 1362 -284 ct 1356 -296 1353 -311 1353 -327 ct 
-1353 -364 1368 -393 1396 -414 ct 1425 -434 1466 -444 1519 -444 ct 1569 -444 1607 -436 1633 -421 ct 
-1659 -406 1678 -380 1688 -343 ct 1630 -333 l  1623 -356 1611 -373 1593 -384 ct 
-1575 -394 1550 -399 1519 -399 ct 1484 -399 1457 -394 1439 -382 ct 1420 -370 1411 -353 1411 -330 ct 
-1411 -317 1415 -306 1422 -297 ct 1429 -288 1439 -281 1453 -274 ct 1466 -268 1493 -261 1533 -252 ct 
-1546 -249 1560 -246 1573 -242 ct 1586 -239 1599 -235 1611 -231 ct 1623 -226 1635 -221 1646 -215 ct 
-1656 -209 1665 -202 1673 -193 ct 1681 -185 1687 -174 1692 -163 ct 1696 -151 1698 -137 1698 -121 ct 
-p ef
-2088 -1 m  1974 -182 l  1838 -182 l  1838 -1 l  1779 -1 l  1779 -437 l 
-1985 -437 l  2034 -437 2072 -426 2099 -404 ct 2125 -382 2139 -352 2139 -313 ct 
-2139 -280 2129 -253 2110 -231 ct 2091 -209 2065 -195 2032 -189 ct 2156 -1 l 
-2088 -1 l  p
-2079 -312 m  2079 -337 2071 -357 2053 -370 ct 2036 -383 2011 -390 1979 -390 ct 
-1838 -390 l  1838 -229 l  1981 -229 l  2012 -229 2037 -236 2054 -251 ct 2071 -265 2079 -286 2079 -312 ct 
+gr
+gs
+0.007 0.007 0.007 c 675 6577 m  675 6624 682 6659 697 6682 ct 711 6704 733 6716 761 6716 ct 
+781 6716 797 6710 811 6699 ct 824 6687 832 6670 835 6646 ct 892 6650 l  887 6684 874 6712 851 6732 ct 
+827 6752 798 6763 762 6763 ct 716 6763 679 6746 654 6715 ct 629 6684 617 6639 617 6579 ct 
+617 6519 629 6474 654 6443 ct 679 6412 716 6396 762 6396 ct 796 6396 825 6405 847 6424 ct 
+870 6442 884 6468 890 6501 ct 833 6506 l  830 6486 822 6470 811 6459 ct 799 6447 782 6442 760 6442 ct 
+731 6442 709 6453 696 6473 ct 682 6494 675 6528 675 6577 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 951 6758 m  951 6272 l  1008 6272 l  1008 6758 l  951 6758 l 
 p ef
-pom
-pum
-2896 16243 t
-85 -170 m  85 -125 92 -92 106 -70 ct 120 -49 142 -38 170 -38 ct 190 -38 206 -43 220 -54 ct 
-233 -65 241 -81 244 -104 ct 301 -100 l  296 -68 283 -42 260 -23 ct 236 -4 207 6 171 6 ct 
-125 6 89 -9 64 -39 ct 39 -68 27 -111 27 -168 ct 27 -225 39 -268 64 -297 ct 89 -327 125 -342 171 -342 ct 
-205 -342 234 -333 256 -315 ct 279 -298 293 -273 299 -242 ct 242 -237 l  239 -256 231 -271 220 -282 ct 
-208 -293 191 -298 169 -298 ct 140 -298 118 -288 105 -269 ct 92 -249 85 -216 85 -170 ct 
-p ef
-361 1 m  361 -460 l  417 -460 l  417 1 l  361 1 l  p ef
-499 -407 m  499 -460 l  555 -460 l  555 -407 l  499 -407 l  p
-499 1 m  499 -335 l  555 -335 l  555 1 l  499 1 l  p ef
-683 -156 m  683 -118 691 -88 706 -67 ct 722 -46 746 -36 776 -36 ct 800 -36 820 -41 834 -50 ct 
-849 -60 859 -72 864 -87 ct 913 -73 l  893 -20 847 6 776 6 ct 727 6 689 -9 663 -38 ct 
-637 -68 624 -112 624 -170 ct 624 -226 637 -268 663 -298 ct 689 -327 726 -342 774 -342 ct 
-873 -342 922 -283 922 -164 ct 922 -156 l  683 -156 l  p
-864 -199 m  861 -234 852 -260 837 -277 ct 822 -293 801 -301 773 -301 ct 746 -301 725 -292 709 -274 ct 
-693 -256 684 -231 683 -199 ct 864 -199 l  p ef
-1204 0 m  1204 -213 l  1204 -235 1202 -252 1197 -264 ct 1193 -277 1186 -285 1177 -291 ct 
-1167 -296 1153 -299 1135 -299 ct 1108 -299 1087 -290 1071 -271 ct 1056 -253 1048 -227 1048 -195 ct 
-1048 0 l  992 0 l  992 -264 l  992 -303 991 -327 990 -336 ct 1043 -336 l 
-1043 -335 1043 -332 1044 -327 ct 1044 -323 1044 -318 1044 -312 ct 1045 -306 1045 -295 1045 -278 ct 
-1046 -278 l  1059 -302 1074 -318 1091 -328 ct 1108 -337 1129 -342 1154 -342 ct 
-1190 -342 1217 -333 1234 -315 ct 1251 -296 1260 -266 1260 -224 ct 1260 0 l  1204 0 l 
-p ef
-1472 -2 m  1453 3 1435 5 1415 5 ct 1371 5 1348 -20 1348 -71 ct 1348 -295 l  1310 -295 l 
-1310 -336 l  1351 -336 l  1367 -411 l  1404 -411 l  1404 -336 l  1466 -336 l 
-1466 -295 l  1404 -295 l  1404 -83 l  1404 -67 1407 -56 1412 -49 ct 1417 -43 1427 -39 1440 -39 ct 
-1447 -39 1458 -41 1472 -44 ct 1472 -2 l  p ef
-pom
-pum
-38348 7285 t
-52 0 m  52 -438 l  111 -438 l  111 -48 l  332 -48 l  332 0 l  52 0 l  p ef
-393 -407 m  393 -460 l  449 -460 l  449 -407 l  393 -407 l  p
-393 1 m  393 -335 l  449 -335 l  449 1 l  393 1 l  p ef
-747 0 m  747 -213 l  747 -235 745 -252 740 -264 ct 736 -277 729 -285 720 -291 ct 
-710 -296 696 -299 678 -299 ct 651 -299 630 -290 614 -271 ct 599 -253 591 -227 591 -195 ct 
-591 0 l  535 0 l  535 -264 l  535 -303 534 -327 533 -336 ct 586 -336 l  586 -335 586 -332 587 -327 ct 
-587 -323 587 -318 587 -312 ct 588 -306 588 -295 588 -278 ct 589 -278 l  602 -302 617 -318 634 -328 ct 
-651 -337 672 -342 697 -342 ct 733 -342 760 -333 777 -315 ct 794 -296 803 -266 803 -224 ct 
-803 0 l  747 0 l  p ef
-1095 1 m  982 -153 l  941 -119 l  941 1 l  885 1 l  885 -460 l  941 -460 l 
-941 -172 l  1088 -335 l  1153 -335 l  1017 -191 l  1160 1 l  1095 1 l 
-p ef
-1666 -219 m  1666 -146 1653 -90 1628 -52 ct 1602 -13 1564 6 1514 6 ct 1464 6 1426 -13 1401 -51 ct 
-1375 -90 1363 -146 1363 -219 ct 1363 -294 1375 -350 1400 -388 ct 1424 -425 1463 -444 1516 -444 ct 
-1567 -444 1605 -425 1630 -387 ct 1654 -349 1666 -293 1666 -219 ct p
-1610 -219 m  1610 -282 1602 -328 1588 -356 ct 1573 -385 1549 -399 1516 -399 ct 
-1481 -399 1457 -385 1442 -357 ct 1427 -329 1419 -283 1419 -219 ct 1419 -157 1427 -112 1442 -83 ct 
-1457 -54 1481 -40 1514 -40 ct 1547 -40 1571 -54 1587 -84 ct 1602 -113 1610 -158 1610 -219 ct 
+gr
+gs
+0.007 0.007 0.007 c 1089 6327 m  1089 6272 l  1146 6272 l  1146 6327 l  1089 6327 l 
+p
+1089 6758 m  1089 6403 l  1146 6403 l  1146 6758 l  1089 6758 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 1273 6592 m  1273 6632 1281 6663 1296 6685 ct 1312 6707 1336 6718 1367 6718 ct 
+1391 6718 1411 6713 1425 6703 ct 1440 6693 1450 6680 1455 6664 ct 1504 6679 l 
+1484 6735 1438 6763 1367 6763 ct 1317 6763 1279 6746 1253 6716 ct 1227 6684 1214 6638 1214 6577 ct 
+1214 6518 1227 6474 1253 6442 ct 1279 6412 1316 6396 1365 6396 ct 1464 6396 1513 6458 1513 6583 ct 
+1513 6592 l  1273 6592 l  p
+1455 6546 m  1452 6509 1443 6482 1428 6464 ct 1413 6447 1392 6439 1364 6439 ct 
+1336 6439 1315 6448 1299 6467 ct 1283 6486 1274 6513 1273 6546 ct 1455 6546 l 
 p ef
-pom
-pum
-38349 14885 t
-52 0 m  52 -438 l  111 -438 l  111 -48 l  332 -48 l  332 0 l  52 0 l  p ef
-393 -407 m  393 -460 l  449 -460 l  449 -407 l  393 -407 l  p
-393 1 m  393 -335 l  449 -335 l  449 1 l  393 1 l  p ef
-747 0 m  747 -213 l  747 -235 745 -252 740 -264 ct 736 -277 729 -285 720 -291 ct 
-710 -296 696 -299 678 -299 ct 651 -299 630 -290 614 -271 ct 599 -253 591 -227 591 -195 ct 
-591 0 l  535 0 l  535 -264 l  535 -303 534 -327 533 -336 ct 586 -336 l  586 -335 586 -332 587 -327 ct 
-587 -323 587 -318 587 -312 ct 588 -306 588 -295 588 -278 ct 589 -278 l  602 -302 617 -318 634 -328 ct 
-651 -337 672 -342 697 -342 ct 733 -342 760 -333 777 -315 ct 794 -296 803 -266 803 -224 ct 
-803 0 l  747 0 l  p ef
-1095 1 m  982 -153 l  941 -119 l  941 1 l  885 1 l  885 -460 l  941 -460 l 
-941 -172 l  1088 -335 l  1153 -335 l  1017 -191 l  1160 1 l  1095 1 l 
+gr
+gs
+0.007 0.007 0.007 c 1795 6757 m  1795 6532 l  1795 6508 1793 6490 1788 6478 ct 
+1784 6464 1777 6456 1768 6449 ct 1758 6444 1743 6441 1725 6441 ct 1698 6441 1677 6450 1661 6470 ct 
+1646 6489 1638 6517 1638 6550 ct 1638 6757 l  1582 6757 l  1582 6478 l  1582 6437 1581 6412 1580 6402 ct 
+1633 6402 l  1633 6403 1633 6406 1634 6412 ct 1634 6416 1634 6421 1634 6427 ct 
+1635 6434 1635 6445 1635 6463 ct 1636 6463 l  1649 6438 1664 6421 1681 6410 ct 
+1698 6401 1719 6396 1744 6396 ct 1781 6396 1808 6405 1825 6424 ct 1842 6444 1851 6476 1851 6520 ct 
+1851 6757 l  1795 6757 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 2063 6755 m  2044 6760 2026 6762 2005 6762 ct 1961 6762 1938 6736 1938 6682 ct 
+1938 6446 l  1900 6446 l  1900 6403 l  1941 6403 l  1957 6323 l  1994 6323 l 
+1994 6403 l  2057 6403 l  2057 6446 l  1994 6446 l  1994 6669 l  1994 6686 1997 6698 2002 6705 ct 
+2007 6712 2018 6716 2031 6716 ct 2038 6716 2049 6714 2063 6710 ct 2063 6755 l 
 p ef
-1386 0 m  1386 -47 l  1498 -47 l  1498 -384 l  1399 -314 l  1399 -366 l 
-1502 -438 l  1554 -438 l  1554 -47 l  1660 -47 l  1660 0 l  1386 0 l  p ef
-pom
+gr
 gs
-1.000 1.000 0.843 c 3968 22179 m  2856 22179 l  2856 21544 l  5079 21544 l 
-5079 22179 l  3968 22179 l  p ef
+0.007 0.007 0.007 c 598 12530 m  548 12396 l  349 12396 l  299 12530 l  237 12530 l 
+416 12068 l  483 12068 l  659 12530 l  598 12530 l  p
+448 12116 m  446 12125 l  440 12143 433 12166 423 12196 ct 367 12347 l  530 12347 l 
+474 12195 l  468 12179 463 12162 457 12143 ct 448 12116 l  p ef
 gr
 gs
-0 lw 1 lj 0.207 0.398 0.644 c 3967 22178 m  2855 22178 l  2855 21543 l 
-5078 21543 l  5078 22178 l  3967 22178 l  pc
+0.007 0.007 0.007 c 1050 12209 m  1050 12253 1037 12287 1010 12313 ct 983 12339 946 12352 900 12352 ct 
+770 12352 l  770 12532 l  711 12532 l  711 12069 l  896 12069 l  945 12069 983 12081 1010 12105 ct 
+1037 12129 1050 12164 1050 12209 ct p
+991 12209 m  991 12149 957 12119 889 12119 ct 770 12119 l  770 12302 l  891 12302 l 
+957 12302 991 12272 991 12209 ct p ef
 gr
-pum
-5665 22064 t
-238 0 m  238 -213 l  238 -245 234 -268 225 -280 ct 216 -293 200 -299 177 -299 ct 
-153 -299 134 -290 120 -272 ct 106 -253 100 -228 100 -195 ct 100 0 l  44 0 l 
-44 -264 l  44 -303 43 -327 42 -336 ct 95 -336 l  95 -335 95 -332 96 -327 ct 
-96 -323 96 -318 96 -312 ct 97 -306 97 -295 97 -278 ct 98 -278 l  110 -302 124 -319 140 -328 ct 
-155 -337 174 -342 196 -342 ct 222 -342 242 -337 257 -327 ct 271 -317 282 -301 287 -278 ct 
-288 -278 l  300 -301 314 -317 330 -327 ct 347 -337 367 -342 390 -342 ct 424 -342 449 -333 464 -314 ct 
-479 -296 487 -266 487 -224 ct 487 0 l  432 0 l  432 -213 l  432 -245 427 -268 419 -280 ct 
-410 -293 394 -299 371 -299 ct 346 -299 327 -290 314 -272 ct 300 -254 293 -228 293 -195 ct 
-293 0 l  238 0 l  p ef
-657 6 m  624 6 598 -3 581 -21 ct 564 -38 556 -63 556 -94 ct 556 -129 567 -155 590 -174 ct 
-613 -192 650 -202 701 -204 ct 776 -205 l  776 -223 l  776 -250 770 -270 759 -282 ct 
-747 -294 729 -299 704 -299 ct 679 -299 661 -295 650 -287 ct 638 -278 631 -265 629 -246 ct 
-571 -251 l  580 -312 625 -342 705 -342 ct 748 -342 779 -332 801 -313 ct 822 -294 833 -266 833 -229 ct 
-833 -85 l  833 -68 835 -55 839 -47 ct 843 -39 852 -35 864 -35 ct 869 -35 875 -35 882 -37 ct 
-882 -2 l  868 1 854 3 839 3 ct 818 3 803 -2 794 -13 ct 785 -24 779 -41 778 -64 ct 
-776 -64 l  762 -39 745 -21 726 -10 ct 707 1 684 6 657 6 ct p
-670 -36 m  691 -36 709 -41 725 -50 ct 741 -59 753 -72 762 -88 ct 772 -104 776 -121 776 -138 ct 
-776 -166 l  715 -165 l  689 -164 669 -161 655 -157 ct 642 -152 631 -144 624 -134 ct 
-617 -123 613 -110 613 -93 ct 613 -75 618 -61 628 -51 ct 638 -41 652 -36 670 -36 ct 
-p ef
-923 -407 m  923 -460 l  979 -460 l  979 -407 l  923 -407 l  p
-923 1 m  923 -335 l  979 -335 l  979 1 l  923 1 l  p ef
-1276 0 m  1276 -213 l  1276 -235 1274 -252 1269 -264 ct 1265 -277 1258 -285 1249 -291 ct 
-1239 -296 1225 -299 1207 -299 ct 1180 -299 1159 -290 1143 -271 ct 1128 -253 1120 -227 1120 -195 ct 
-1120 0 l  1064 0 l  1064 -264 l  1064 -303 1063 -327 1062 -336 ct 1115 -336 l 
-1115 -335 1115 -332 1116 -327 ct 1116 -323 1116 -318 1116 -312 ct 1117 -306 1117 -295 1117 -278 ct 
-1118 -278 l  1131 -302 1146 -318 1163 -328 ct 1180 -337 1201 -342 1226 -342 ct 
-1262 -342 1289 -333 1306 -315 ct 1323 -296 1332 -266 1332 -224 ct 1332 0 l  1276 0 l 
-p ef
-1939 -305 m  1939 -264 1926 -231 1899 -207 ct 1872 -182 1835 -170 1789 -170 ct 
-1660 -170 l  1660 1 l  1601 1 l  1601 -437 l  1785 -437 l  1834 -437 1872 -426 1899 -403 ct 
-1926 -380 1939 -347 1939 -305 ct p
-1880 -305 m  1880 -361 1846 -390 1778 -390 ct 1660 -390 l  1660 -217 l  1780 -217 l 
-1846 -217 1880 -246 1880 -305 ct p ef
-2321 -1 m  2321 -203 l  2084 -203 l  2084 -1 l  2025 -1 l  2025 -438 l 
-2084 -438 l  2084 -253 l  2321 -253 l  2321 -438 l  2380 -438 l  2380 -1 l 
-2321 -1 l  p ef
-2671 -181 m  2671 0 l  2612 0 l  2612 -181 l  2444 -438 l  2509 -438 l 
-2642 -229 l  2774 -438 l  2840 -438 l  2671 -181 l  p ef
-pom
 gs
-0.871 0.902 0.937 c 13067 22179 m  11955 22179 l  11955 21544 l  14178 21544 l 
-14178 22179 l  13067 22179 l  p ef
+0.007 0.007 0.007 c 1673 12530 m  1673 12223 l  1673 12188 1673 12156 1675 12124 ct 
+1665 12163 1656 12195 1648 12217 ct 1535 12530 l  1494 12530 l  1378 12217 l 
+1361 12160 l  1351 12124 l  1352 12160 l  1353 12223 l  1353 12530 l  1300 12530 l 
+1300 12068 l  1378 12068 l  1495 12389 l  1499 12402 1503 12416 1507 12430 ct 
+1511 12445 1513 12456 1515 12462 ct 1516 12454 1520 12441 1525 12423 ct 1530 12405 1534 12394 1536 12389 ct 
+1650 12068 l  1726 12068 l  1726 12530 l  1673 12530 l  p ef
 gr
 gs
-0 lw 1 lj 0.207 0.398 0.644 c 13067 22178 m  11955 22178 l  11955 21543 l 
-14178 21543 l  14178 22178 l  13067 22178 l  pc
+0.007 0.007 0.007 c 1829 12530 m  1829 12068 l  1888 12068 l  1888 12480 l 
+2110 12480 l  2110 12530 l  1829 12530 l  p ef
 gr
-pum
-14764 22064 t
-128 6 m  95 6 69 -3 52 -21 ct 35 -38 27 -63 27 -94 ct 27 -129 38 -155 61 -174 ct 
-84 -192 121 -202 172 -204 ct 247 -205 l  247 -223 l  247 -250 241 -270 230 -282 ct 
-218 -294 200 -299 175 -299 ct 150 -299 132 -295 121 -287 ct 109 -278 102 -265 100 -246 ct 
-42 -251 l  51 -312 96 -342 176 -342 ct 219 -342 250 -332 272 -313 ct 293 -294 304 -266 304 -229 ct 
-304 -85 l  304 -68 306 -55 310 -47 ct 314 -39 323 -35 335 -35 ct 340 -35 346 -35 353 -37 ct 
-353 -2 l  339 1 325 3 310 3 ct 289 3 274 -2 265 -13 ct 256 -24 250 -41 249 -64 ct 
-247 -64 l  233 -39 216 -21 197 -10 ct 178 1 155 6 128 6 ct p
-141 -36 m  162 -36 180 -41 196 -50 ct 212 -59 224 -72 233 -88 ct 243 -104 247 -121 247 -138 ct 
-247 -166 l  186 -165 l  160 -164 140 -161 126 -157 ct 113 -152 102 -144 95 -134 ct 
-88 -123 84 -110 84 -93 ct 84 -75 89 -61 99 -51 ct 109 -41 123 -36 141 -36 ct p ef
-448 -336 m  448 -123 l  448 -101 451 -84 455 -72 ct 459 -59 466 -51 476 -45 ct 
-485 -40 499 -37 518 -37 ct 544 -37 566 -46 581 -65 ct 597 -83 604 -109 604 -141 ct 
-604 -336 l  660 -336 l  660 -72 l  660 -33 661 -9 662 0 ct 609 0 l  609 -1 609 -4 609 -9 ct 
-608 -13 608 -18 608 -24 ct 608 -30 607 -41 607 -58 ct 606 -58 l  593 -34 578 -18 561 -8 ct 
-545 1 524 6 499 6 ct 462 6 435 -3 418 -21 ct 401 -40 392 -70 392 -112 ct 392 -336 l 
-448 -336 l  p ef
-951 0 m  861 -138 l  770 0 l  710 0 l  830 -173 l  716 -336 l  777 -336 l 
-861 -205 l  944 -336 l  1007 -336 l  893 -173 l  1014 0 l  951 0 l  p ef
-1588 -305 m  1588 -264 1575 -231 1548 -207 ct 1521 -182 1484 -170 1438 -170 ct 
-1309 -170 l  1309 1 l  1250 1 l  1250 -437 l  1434 -437 l  1483 -437 1521 -426 1548 -403 ct 
-1575 -380 1588 -347 1588 -305 ct p
-1529 -305 m  1529 -361 1495 -390 1427 -390 ct 1309 -390 l  1309 -217 l  1429 -217 l 
-1495 -217 1529 -246 1529 -305 ct p ef
-1969 -1 m  1969 -203 l  1732 -203 l  1732 -1 l  1673 -1 l  1673 -438 l 
-1732 -438 l  1732 -253 l  1969 -253 l  1969 -438 l  2028 -438 l  2028 -1 l 
-1969 -1 l  p ef
-2320 -181 m  2320 0 l  2261 0 l  2261 -181 l  2093 -438 l  2158 -438 l 
-2291 -229 l  2423 -438 l  2489 -438 l  2320 -181 l  p ef
-pom
 gs
-0.871 0.902 0.937 c 10489 8119 m  5080 8119 l  5080 7169 l  15899 7169 l 
-15899 8119 l  10489 8119 l  p ef
+0.007 0.007 0.007 c 2557 12296 m  2557 12343 2548 12384 2531 12420 ct 2513 12456 2488 12483 2456 12502 ct 
+2423 12521 2386 12530 2343 12530 ct 2180 12530 l  2180 12069 l  2325 12069 l 
+2399 12069 2457 12088 2497 12127 ct 2537 12167 2557 12223 2557 12296 ct p
+2498 12296 m  2498 12239 2483 12195 2453 12165 ct 2423 12134 2380 12119 2323 12119 ct 
+2239 12119 l  2239 12481 l  2337 12481 l  2369 12481 2397 12473 2421 12458 ct 
+2446 12443 2465 12422 2478 12395 ct 2491 12366 2498 12334 2498 12296 ct p ef
 gr
 gs
-1.000 1.000 0.843 c 10489 15718 m  5080 15718 l  5080 14769 l  15899 14769 l 
-15899 15718 l  10489 15718 l  p ef
+0.007 0.007 0.007 c 288 13896 m  288 13436 l  621 13436 l  621 13486 l  347 13486 l 
+347 13635 l  602 13635 l  602 13685 l  347 13685 l  347 13845 l  633 13845 l 
+633 13896 l  288 13896 l  p ef
 gr
 gs
-0.933 0.933 0.933 c 7306 2309 m  7306 2309 l  7133 2309 6963 2326 6813 2359 ct 
-6663 2391 6538 2438 6451 2494 ct 6365 2550 6319 2614 6319 2679 ct 6319 2955 l 
-6319 3232 l  6319 3609 l  6319 3886 l  6319 4163 l  6319 4163 l  6319 4228 6365 4292 6451 4348 ct 
-6538 4404 6663 4451 6813 4483 ct 6963 4516 7133 4533 7306 4533 ct 8046 4533 l 
-8785 4533 l  9791 4533 l  11499 5392 l  11270 4533 l  11271 4533 l  11444 4533 11614 4516 11764 4483 ct 
-11914 4451 12039 4404 12126 4348 ct 12212 4292 12258 4228 12258 4163 ct 12258 3886 l 
-12258 3609 l  12258 3232 l  12258 2955 l  12258 2678 l  12258 2679 l  12258 2679 l 
-12258 2614 12212 2550 12126 2494 ct 12039 2438 11914 2391 11764 2359 ct 11614 2326 11444 2309 11271 2309 ct 
-10531 2309 l  9791 2309 l  8785 2309 l  8046 2309 l  7306 2309 l  p ef
-gr
-gs
-0 lw 1 lj 7305 2308 m  7305 2308 l  7132 2308 6962 2325 6812 2358 ct 6662 2390 6537 2437 6450 2493 ct 
-6364 2549 6318 2613 6318 2678 ct 6318 2954 l  6318 3231 l  6318 3608 l  6318 3885 l 
-6318 4162 l  6318 4162 l  6318 4227 6364 4291 6450 4347 ct 6537 4403 6662 4450 6812 4482 ct 
-6962 4515 7132 4532 7305 4532 ct 8045 4532 l  8784 4532 l  9791 4532 l  11499 5392 l 
-11270 4532 l  11271 4532 l  11444 4532 11614 4515 11764 4482 ct 11914 4450 12039 4403 12126 4347 ct 
-12212 4291 12258 4227 12258 4162 ct 12258 3885 l  12258 3608 l  12258 3231 l 
-12258 2954 l  12258 2677 l  12258 2678 l  12258 2678 l  12258 2613 12212 2549 12126 2493 ct 
-12039 2437 11914 2390 11764 2358 ct 11614 2325 11444 2308 11271 2308 ct 10531 2308 l 
-9791 2308 l  8784 2308 l  8045 2308 l  7305 2308 l  pc
+0.007 0.007 0.007 c 1084 13896 m  1084 13589 l  1084 13555 1084 13522 1086 13490 ct 
+1076 13529 1067 13560 1058 13583 ct 945 13896 l  904 13896 l  789 13583 l 
+772 13526 l  762 13490 l  763 13526 l  764 13589 l  764 13896 l  711 13896 l 
+711 13435 l  789 13435 l  905 13755 l  909 13767 913 13781 917 13796 ct 921 13810 923 13821 925 13827 ct 
+926 13819 930 13806 935 13788 ct 940 13770 944 13759 946 13755 ct 1061 13435 l 
+1137 13435 l  1137 13896 l  1084 13896 l  p ef
 gr
-pum
-6816 2988 t
-198 -346 m  198 -1 l  146 -1 l  146 -346 l  13 -346 l  13 -389 l  332 -389 l 
-332 -346 l  198 -346 l  p ef
-430 -247 m  441 -266 454 -281 469 -290 ct 484 -299 503 -303 526 -303 ct 558 -303 582 -295 597 -279 ct 
-612 -263 620 -236 620 -198 ct 620 1 l  570 1 l  570 -189 l  570 -210 568 -225 564 -235 ct 
-561 -246 554 -253 545 -258 ct 537 -263 524 -265 509 -265 ct 485 -265 467 -257 453 -241 ct 
-439 -225 432 -203 432 -175 ct 432 1 l  382 1 l  382 -409 l  432 -409 l  432 -302 l 
-432 -291 431 -279 431 -267 ct 430 -256 430 -249 429 -247 ct 430 -247 l  p ef
-732 -138 m  732 -104 739 -78 753 -59 ct 767 -41 788 -31 815 -31 ct 837 -31 854 -36 867 -44 ct 
-880 -53 889 -64 893 -77 ct 937 -65 l  919 -18 878 6 815 6 ct 771 6 738 -7 715 -33 ct 
-691 -60 680 -99 680 -151 ct 680 -200 691 -238 715 -264 ct 738 -291 770 -304 813 -304 ct 
-901 -304 945 -251 945 -145 ct 945 -138 l  732 -138 l  p
-893 -176 m  891 -208 883 -231 869 -245 ct 856 -260 837 -267 812 -267 ct 788 -267 769 -259 755 -243 ct 
-741 -227 734 -204 733 -176 ct 893 -176 l  p ef
-1417 -1 m  1373 -114 l  1196 -114 l  1152 -1 l  1097 -1 l  1255 -389 l 
-1315 -389 l  1471 -1 l  1417 -1 l  p
-1285 -349 m  1282 -342 l  1278 -326 1271 -307 1262 -283 ct 1212 -155 l  1357 -155 l 
-1308 -283 l  1302 -296 1297 -310 1292 -326 ct 1285 -349 l  p ef
-1819 -271 m  1819 -234 1807 -205 1784 -184 ct 1760 -162 1727 -151 1686 -151 ct 
-1572 -151 l  1572 1 l  1519 1 l  1519 -388 l  1683 -388 l  1726 -388 1760 -378 1784 -358 ct 
-1808 -337 1819 -308 1819 -271 ct p
-1767 -271 m  1767 -321 1736 -346 1676 -346 ct 1572 -346 l  1572 -193 l  1678 -193 l 
-1737 -193 1767 -219 1767 -271 ct p ef
-2370 0 m  2370 -259 l  2370 -288 2371 -315 2373 -342 ct 2364 -309 2356 -283 2348 -265 ct 
-2248 0 l  2211 0 l  2110 -265 l  2094 -312 l  2085 -342 l  2086 -311 l 
-2087 -259 l  2087 0 l  2040 0 l  2040 -389 l  2109 -389 l  2213 -119 l 
-2216 -108 2220 -97 2223 -84 ct 2227 -72 2229 -63 2230 -57 ct 2231 -65 2235 -76 2239 -91 ct 
-2244 -106 2247 -115 2249 -119 ct 2350 -389 l  2418 -389 l  2418 0 l  2370 0 l 
+gs
+0.007 0.007 0.007 c 1241 13896 m  1241 13435 l  1301 13435 l  1301 13845 l 
+1522 13845 l  1522 13896 l  1241 13896 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 1935 13768 m  1935 13810 1920 13844 1888 13867 ct 1857 13890 1812 13902 1755 13902 ct 
+1648 13902 1586 13863 1569 13785 ct 1626 13773 l  1633 13801 1648 13821 1669 13834 ct 
+1691 13847 1720 13854 1757 13854 ct 1795 13854 1825 13846 1846 13833 ct 1866 13819 1877 13799 1877 13772 ct 
+1877 13757 1874 13744 1867 13735 ct 1861 13727 1851 13718 1840 13713 ct 1828 13707 1814 13702 1797 13698 ct 
+1781 13694 1763 13689 1743 13684 ct 1709 13676 1682 13668 1665 13660 ct 1647 13652 1632 13643 1621 13634 ct 
+1611 13623 1603 13612 1598 13598 ct 1592 13585 1589 13569 1589 13553 ct 1589 13514 1604 13483 1632 13460 ct 
+1662 13439 1703 13428 1756 13428 ct 1806 13428 1844 13437 1870 13453 ct 1896 13468 1915 13497 1925 13536 ct 
+1867 13546 l  1860 13522 1848 13504 1830 13493 ct 1812 13482 1787 13477 1756 13477 ct 
+1721 13477 1694 13482 1676 13495 ct 1657 13507 1648 13525 1648 13549 ct 1648 13563 1652 13575 1659 13584 ct 
+1666 13594 1676 13601 1690 13608 ct 1703 13615 1730 13622 1770 13632 ct 1783 13635 1797 13638 1810 13642 ct 
+1823 13645 1836 13649 1848 13654 ct 1860 13659 1872 13664 1883 13670 ct 1893 13677 1902 13684 1910 13694 ct 
+1918 13702 1924 13714 1929 13724 ct 1933 13737 1935 13752 1935 13768 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 2325 13895 m  2211 13705 l  2075 13705 l  2075 13895 l 
+2015 13895 l  2015 13436 l  2222 13436 l  2271 13436 2309 13447 2336 13470 ct 
+2362 13494 2376 13526 2376 13567 ct 2376 13602 2366 13630 2347 13654 ct 2328 13677 2302 13692 2269 13698 ct 
+2393 13895 l  2325 13895 l  p
+2316 13568 m  2316 13542 2308 13521 2290 13506 ct 2273 13493 2248 13485 2216 13485 ct 
+2075 13485 l  2075 13656 l  2218 13656 l  2249 13656 2274 13648 2291 13633 ct 
+2308 13618 2316 13596 2316 13568 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 675 14465 m  675 14513 682 14547 697 14570 ct 711 14593 733 14604 761 14604 ct 
+781 14604 797 14599 811 14587 ct 824 14576 832 14559 835 14535 ct 892 14539 l 
+887 14573 874 14600 851 14620 ct 827 14640 798 14650 762 14650 ct 716 14650 679 14635 654 14603 ct 
+629 14573 617 14527 617 14467 ct 617 14406 629 14361 654 14330 ct 679 14299 716 14283 762 14283 ct 
+796 14283 825 14293 847 14312 ct 870 14329 884 14356 890 14388 ct 833 14394 l 
+830 14374 822 14358 811 14346 ct 799 14335 782 14329 760 14329 ct 731 14329 709 14340 696 14360 ct 
+682 14381 675 14416 675 14465 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 951 14645 m  951 14159 l  1008 14159 l  1008 14645 l  951 14645 l 
 p ef
-2510 0 m  2510 -389 l  2563 -389 l  2563 -43 l  2759 -43 l  2759 0 l  2510 0 l 
+gr
+gs
+0.007 0.007 0.007 c 1089 14215 m  1089 14159 l  1146 14159 l  1146 14215 l 
+1089 14215 l  p
+1089 14645 m  1089 14292 l  1146 14292 l  1146 14645 l  1089 14645 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 1273 14480 m  1273 14520 1281 14552 1296 14574 ct 1312 14596 1336 14606 1367 14606 ct 
+1391 14606 1411 14601 1425 14592 ct 1440 14581 1450 14568 1455 14553 ct 1504 14567 l 
+1484 14623 1438 14650 1367 14650 ct 1317 14650 1279 14635 1253 14604 ct 1227 14573 1214 14526 1214 14465 ct 
+1214 14405 1227 14361 1253 14329 ct 1279 14299 1316 14283 1365 14283 ct 1464 14283 1513 14345 1513 14472 ct 
+1513 14480 l  1273 14480 l  p
+1455 14435 m  1452 14397 1443 14369 1428 14352 ct 1413 14335 1392 14326 1364 14326 ct 
+1336 14326 1315 14336 1299 14355 ct 1283 14374 1274 14400 1273 14435 ct 1455 14435 l 
 p ef
-3157 -199 m  3157 -158 3150 -123 3134 -93 ct 3118 -63 3096 -40 3068 -24 ct 3039 -8 3006 0 2968 0 ct 
-2823 0 l  2823 -389 l  2952 -389 l  3017 -389 3068 -372 3104 -339 ct 3139 -306 3157 -259 3157 -199 ct 
-p
-3104 -199 m  3104 -247 3091 -284 3065 -309 ct 3039 -334 3000 -347 2951 -347 ct 
-2876 -347 l  2876 -42 l  2962 -42 l  2991 -42 3016 -48 3037 -61 ct 3059 -73 3076 -92 3087 -115 ct 
-3099 -139 3104 -166 3104 -199 ct p ef
-3630 -150 m  3630 -46 3593 6 3520 6 ct 3498 6 3479 2 3464 -6 ct 3449 -14 3437 -28 3428 -46 ct 
-3427 -46 l  3427 -40 3427 -31 3426 -20 ct 3425 -8 3425 -1 3424 0 ct 3376 0 l 
-3377 -9 3378 -30 3378 -61 ct 3378 -409 l  3428 -409 l  3428 -292 l  3428 -280 3427 -266 3426 -250 ct 
-3428 -250 l  3437 -269 3449 -283 3464 -291 ct 3479 -299 3498 -303 3520 -303 ct 
-3558 -303 3586 -291 3603 -265 ct 3621 -240 3630 -202 3630 -150 ct p
-3578 -148 m  3578 -190 3572 -220 3561 -238 ct 3550 -256 3533 -265 3508 -265 ct 
-3480 -265 3459 -255 3447 -236 ct 3434 -217 3428 -187 3428 -145 ct 3428 -106 3434 -77 3446 -59 ct 
-3459 -40 3479 -31 3507 -31 ct 3532 -31 3550 -40 3561 -58 ct 3572 -77 3578 -107 3578 -148 ct 
-p ef
-3691 1 m  3691 -409 l  3741 -409 l  3741 1 l  3691 1 l  p ef
-4070 -149 m  4070 -97 4059 -58 4036 -32 ct 4013 -7 3979 6 3936 6 ct 3892 6 3859 -7 3837 -34 ct 
-3815 -60 3804 -99 3804 -149 ct 3804 -252 3848 -304 3937 -304 ct 3983 -304 4016 -291 4038 -266 ct 
-4059 -241 4070 -202 4070 -149 ct p
-4018 -149 m  4018 -190 4012 -220 4000 -239 ct 3987 -258 3967 -267 3938 -267 ct 
-3909 -267 3888 -257 3875 -238 ct 3862 -219 3856 -190 3856 -149 ct 3856 -110 3862 -80 3875 -60 ct 
-3888 -41 3908 -31 3935 -31 ct 3965 -31 3986 -40 3999 -59 ct 4012 -79 4018 -108 4018 -149 ct 
-p ef
-4170 -150 m  4170 -111 4176 -81 4188 -62 ct 4201 -43 4220 -33 4245 -33 ct 4263 -33 4277 -38 4289 -48 ct 
-4301 -57 4308 -72 4311 -92 ct 4361 -88 l  4357 -60 4345 -37 4325 -20 ct 4304 -3 4278 6 4246 6 ct 
-4205 6 4173 -7 4151 -34 ct 4129 -60 4118 -99 4118 -149 ct 4118 -200 4129 -238 4151 -264 ct 
-4173 -291 4205 -304 4246 -304 ct 4276 -304 4302 -296 4322 -280 ct 4342 -264 4354 -243 4359 -215 ct 
-4309 -211 l  4306 -227 4299 -241 4289 -250 ct 4279 -260 4264 -265 4244 -265 ct 
-4218 -265 4199 -256 4187 -239 ct 4176 -221 4170 -192 4170 -150 ct p ef
-4602 0 m  4501 -136 l  4465 -106 l  4465 0 l  4415 0 l  4415 -409 l  4465 -409 l 
-4465 -153 l  4595 -298 l  4654 -298 l  4533 -170 l  4660 0 l  4602 0 l 
-p ef
-4923 -82 m  4923 -54 4912 -32 4891 -17 ct 4870 -2 4840 6 4802 6 ct 4765 6 4736 0 4716 -12 ct 
-4696 -25 4683 -44 4677 -70 ct 4720 -78 l  4725 -62 4733 -50 4747 -43 ct 4760 -36 4778 -32 4802 -32 ct 
-4827 -32 4845 -36 4857 -43 ct 4869 -51 4874 -63 4874 -78 ct 4874 -90 4870 -99 4862 -107 ct 
-4854 -114 4841 -120 4823 -125 ct 4788 -134 l  4759 -142 4739 -149 4727 -156 ct 
-4715 -163 4706 -172 4699 -182 ct 4692 -192 4689 -204 4689 -219 ct 4689 -246 4698 -267 4718 -281 ct 
-4737 -295 4765 -303 4802 -303 ct 4835 -303 4861 -297 4881 -285 ct 4900 -274 4912 -255 4917 -229 ct 
-4873 -224 l  4870 -237 4863 -247 4851 -254 ct 4839 -261 4822 -265 4802 -265 ct 
-4780 -265 4763 -262 4753 -255 ct 4742 -248 4737 -238 4737 -224 ct 4737 -215 4739 -208 4743 -203 ct 
-4748 -197 4754 -193 4763 -189 ct 4772 -185 4790 -180 4817 -173 ct 4844 -166 4863 -160 4874 -155 ct 
-4886 -149 4895 -143 4902 -136 ct 4908 -129 4913 -121 4917 -112 ct 4921 -103 4923 -93 4923 -82 ct 
+gr
+gs
+0.007 0.007 0.007 c 1795 14644 m  1795 14419 l  1795 14396 1793 14378 1788 14365 ct 
+1784 14352 1777 14343 1768 14337 ct 1758 14332 1743 14328 1725 14328 ct 1698 14328 1677 14338 1661 14358 ct 
+1646 14377 1638 14404 1638 14438 ct 1638 14644 l  1582 14644 l  1582 14365 l 
+1582 14324 1581 14299 1580 14289 ct 1633 14289 l  1633 14290 1633 14294 1634 14299 ct 
+1634 14303 1634 14308 1634 14315 ct 1635 14321 1635 14333 1635 14350 ct 1636 14350 l 
+1649 14325 1664 14308 1681 14298 ct 1698 14288 1719 14283 1744 14283 ct 1781 14283 1808 14293 1825 14312 ct 
+1842 14332 1851 14363 1851 14407 ct 1851 14644 l  1795 14644 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 2063 14642 m  2044 14647 2026 14649 2005 14649 ct 1961 14649 1938 14622 1938 14568 ct 
+1938 14333 l  1900 14333 l  1900 14289 l  1941 14289 l  1957 14210 l  1994 14210 l 
+1994 14289 l  2057 14289 l  2057 14333 l  1994 14333 l  1994 14556 l  1994 14573 1997 14584 2002 14592 ct 
+2007 14598 2018 14602 2031 14602 ct 2038 14602 2049 14600 2063 14597 ct 2063 14642 l 
 p ef
-pom
-pum
-6808 3615 t
-153 -3 m  136 2 120 4 102 4 ct 63 4 43 -19 43 -64 ct 43 -263 l  9 -263 l  9 -299 l 
-45 -299 l  59 -366 l  93 -366 l  93 -299 l  148 -299 l  148 -263 l  93 -263 l 
-93 -74 l  93 -60 95 -50 100 -44 ct 104 -38 112 -35 124 -35 ct 131 -35 140 -37 153 -39 ct 
-153 -3 l  p ef
-196 0 m  196 -229 l  196 -250 196 -273 194 -298 ct 241 -298 l  243 -265 243 -244 243 -238 ct 
-245 -238 l  252 -263 262 -281 272 -290 ct 282 -299 297 -304 315 -304 ct 322 -304 329 -303 335 -301 ct 
-335 -256 l  329 -258 320 -258 309 -258 ct 288 -258 273 -250 262 -232 ct 251 -214 246 -189 246 -156 ct 
-246 0 l  196 0 l  p ef
-457 6 m  427 6 405 -2 390 -18 ct 374 -34 367 -55 367 -83 ct 367 -114 377 -138 397 -154 ct 
-418 -171 450 -180 496 -181 ct 562 -182 l  562 -198 l  562 -222 557 -240 547 -250 ct 
-537 -261 521 -266 499 -266 ct 476 -266 460 -262 450 -255 ct 440 -247 434 -235 432 -219 ct 
-380 -223 l  389 -277 428 -304 500 -304 ct 537 -304 565 -295 584 -278 ct 603 -261 613 -236 613 -203 ct 
-613 -74 l  613 -60 615 -49 618 -41 ct 622 -34 630 -30 640 -30 ct 645 -30 651 -31 657 -32 ct 
-657 -1 l  644 2 631 3 618 3 ct 600 3 587 -1 578 -11 ct 570 -21 565 -36 564 -57 ct 
-562 -57 l  550 -34 535 -18 518 -8 ct 501 1 481 6 457 6 ct p
-468 -31 m  486 -31 503 -35 517 -44 ct 531 -52 542 -63 550 -78 ct 558 -92 562 -107 562 -122 ct 
-562 -147 l  508 -146 l  485 -145 467 -143 455 -139 ct 443 -134 434 -127 428 -118 ct 
-421 -109 418 -97 418 -82 ct 418 -66 422 -53 431 -44 ct 440 -36 452 -31 468 -31 ct 
-p ef
-883 0 m  883 -189 l  883 -209 881 -224 877 -235 ct 874 -246 867 -254 859 -258 ct 
-851 -263 838 -266 822 -266 ct 798 -266 779 -257 765 -241 ct 752 -225 745 -202 745 -173 ct 
-745 0 l  695 0 l  695 -235 l  695 -270 695 -291 693 -298 ct 740 -298 l  740 -298 741 -295 741 -291 ct 
-741 -287 741 -282 742 -277 ct 742 -272 742 -262 742 -247 ct 743 -247 l  755 -268 768 -283 783 -291 ct 
-798 -300 816 -304 839 -304 ct 871 -304 895 -296 910 -280 ct 925 -263 933 -236 933 -199 ct 
-933 0 l  883 0 l  p ef
-1231 -82 m  1231 -54 1220 -32 1199 -17 ct 1178 -2 1148 6 1110 6 ct 1073 6 1044 0 1024 -12 ct 
-1004 -25 991 -44 985 -70 ct 1028 -78 l  1033 -62 1041 -50 1055 -43 ct 1068 -36 1086 -32 1110 -32 ct 
-1135 -32 1153 -36 1165 -43 ct 1177 -51 1182 -63 1182 -78 ct 1182 -90 1178 -99 1170 -107 ct 
-1162 -114 1149 -120 1131 -125 ct 1096 -134 l  1067 -142 1047 -149 1035 -156 ct 
-1023 -163 1014 -172 1007 -182 ct 1000 -192 997 -204 997 -219 ct 997 -246 1006 -267 1026 -281 ct 
-1045 -295 1073 -303 1110 -303 ct 1143 -303 1169 -297 1189 -285 ct 1208 -274 1220 -255 1225 -229 ct 
-1181 -224 l  1178 -237 1171 -247 1159 -254 ct 1147 -261 1130 -265 1110 -265 ct 
-1088 -265 1071 -262 1061 -255 ct 1050 -248 1045 -238 1045 -224 ct 1045 -215 1047 -208 1051 -203 ct 
-1056 -197 1062 -193 1071 -189 ct 1080 -185 1098 -180 1125 -173 ct 1152 -166 1171 -160 1182 -155 ct 
-1194 -149 1203 -143 1210 -136 ct 1216 -129 1221 -121 1225 -112 ct 1229 -103 1231 -93 1231 -82 ct 
-p ef
-1465 0 m  1465 -189 l  1465 -218 1461 -238 1453 -249 ct 1445 -260 1431 -266 1410 -266 ct 
-1389 -266 1372 -258 1360 -241 ct 1348 -225 1341 -202 1341 -173 ct 1341 0 l  1292 0 l 
-1292 -235 l  1292 -270 1292 -291 1290 -298 ct 1337 -298 l  1337 -298 1338 -295 1338 -291 ct 
-1338 -287 1338 -282 1339 -277 ct 1339 -272 1339 -262 1339 -247 ct 1340 -247 l 
-1351 -269 1363 -283 1377 -292 ct 1391 -300 1408 -304 1427 -304 ct 1450 -304 1468 -300 1481 -290 ct 
-1494 -281 1503 -267 1508 -247 ct 1509 -247 l  1519 -268 1532 -282 1546 -291 ct 
-1561 -300 1579 -304 1599 -304 ct 1630 -304 1651 -296 1665 -279 ct 1679 -263 1686 -236 1686 -199 ct 
-1686 0 l  1637 0 l  1637 -189 l  1637 -218 1633 -238 1625 -249 ct 1617 -260 1603 -266 1582 -266 ct 
-1560 -266 1544 -258 1532 -242 ct 1520 -225 1514 -203 1514 -173 ct 1514 0 l  1465 0 l 
-p ef
-1761 -362 m  1761 -409 l  1810 -409 l  1810 -362 l  1761 -362 l  p
-1761 0 m  1761 -298 l  1810 -298 l  1810 0 l  1761 0 l  p ef
-2112 -82 m  2112 -54 2101 -32 2080 -17 ct 2059 -2 2029 6 1991 6 ct 1954 6 1925 0 1905 -12 ct 
-1885 -25 1872 -44 1866 -70 ct 1909 -78 l  1914 -62 1922 -50 1936 -43 ct 1949 -36 1967 -32 1991 -32 ct 
-2016 -32 2034 -36 2046 -43 ct 2058 -51 2063 -63 2063 -78 ct 2063 -90 2059 -99 2051 -107 ct 
-2043 -114 2030 -120 2012 -125 ct 1977 -134 l  1948 -142 1928 -149 1916 -156 ct 
-1904 -163 1895 -172 1888 -182 ct 1881 -192 1878 -204 1878 -219 ct 1878 -246 1887 -267 1907 -281 ct 
-1926 -295 1954 -303 1991 -303 ct 2024 -303 2050 -297 2070 -285 ct 2089 -274 2101 -255 2106 -229 ct 
-2062 -224 l  2059 -237 2052 -247 2040 -254 ct 2028 -261 2011 -265 1991 -265 ct 
-1969 -265 1952 -262 1942 -255 ct 1931 -248 1926 -238 1926 -224 ct 1926 -215 1928 -208 1932 -203 ct 
-1937 -197 1943 -193 1952 -189 ct 1961 -185 1979 -180 2006 -173 ct 2033 -166 2052 -160 2063 -155 ct 
-2075 -149 2084 -143 2091 -136 ct 2097 -129 2102 -121 2106 -112 ct 2110 -103 2112 -93 2112 -82 ct 
-p ef
-2396 -82 m  2396 -54 2385 -32 2364 -17 ct 2343 -2 2313 6 2275 6 ct 2238 6 2209 0 2189 -12 ct 
-2169 -25 2156 -44 2150 -70 ct 2193 -78 l  2198 -62 2206 -50 2220 -43 ct 2233 -36 2251 -32 2275 -32 ct 
-2300 -32 2318 -36 2330 -43 ct 2342 -51 2347 -63 2347 -78 ct 2347 -90 2343 -99 2335 -107 ct 
-2327 -114 2314 -120 2296 -125 ct 2261 -134 l  2232 -142 2212 -149 2200 -156 ct 
-2188 -163 2179 -172 2172 -182 ct 2165 -192 2162 -204 2162 -219 ct 2162 -246 2171 -267 2191 -281 ct 
-2210 -295 2238 -303 2275 -303 ct 2308 -303 2334 -297 2354 -285 ct 2373 -274 2385 -255 2390 -229 ct 
-2346 -224 l  2343 -237 2336 -247 2324 -254 ct 2312 -261 2295 -265 2275 -265 ct 
-2253 -265 2236 -262 2226 -255 ct 2215 -248 2210 -238 2210 -224 ct 2210 -215 2212 -208 2216 -203 ct 
-2221 -197 2227 -193 2236 -189 ct 2245 -185 2263 -180 2290 -173 ct 2317 -166 2336 -160 2347 -155 ct 
-2359 -149 2368 -143 2375 -136 ct 2381 -129 2386 -121 2390 -112 ct 2394 -103 2396 -93 2396 -82 ct 
-p ef
-2455 -362 m  2455 -409 l  2504 -409 l  2504 -362 l  2455 -362 l  p
-2455 0 m  2455 -298 l  2504 -298 l  2504 0 l  2455 0 l  p ef
-2834 -149 m  2834 -97 2823 -58 2800 -32 ct 2777 -7 2743 6 2700 6 ct 2656 6 2623 -7 2601 -34 ct 
-2579 -60 2568 -99 2568 -149 ct 2568 -252 2612 -304 2701 -304 ct 2747 -304 2780 -291 2802 -266 ct 
-2823 -241 2834 -202 2834 -149 ct p
-2782 -149 m  2782 -190 2776 -220 2764 -239 ct 2751 -258 2731 -267 2702 -267 ct 
-2673 -267 2652 -257 2639 -238 ct 2626 -219 2620 -190 2620 -149 ct 2620 -110 2626 -80 2639 -60 ct 
-2652 -41 2672 -31 2699 -31 ct 2729 -31 2750 -40 2763 -59 ct 2776 -79 2782 -108 2782 -149 ct 
-p ef
-3085 0 m  3085 -189 l  3085 -209 3083 -224 3079 -235 ct 3076 -246 3069 -254 3061 -258 ct 
-3053 -263 3040 -266 3024 -266 ct 3000 -266 2981 -257 2967 -241 ct 2954 -225 2947 -202 2947 -173 ct 
-2947 0 l  2897 0 l  2897 -235 l  2897 -270 2897 -291 2895 -298 ct 2942 -298 l 
-2942 -298 2943 -295 2943 -291 ct 2943 -287 2943 -282 2944 -277 ct 2944 -272 2944 -262 2944 -247 ct 
-2945 -247 l  2957 -268 2970 -283 2985 -291 ct 3000 -300 3018 -304 3041 -304 ct 
-3073 -304 3097 -296 3112 -280 ct 3127 -263 3135 -236 3135 -199 ct 3135 0 l  3085 0 l 
-p ef
-3433 -82 m  3433 -54 3422 -32 3401 -17 ct 3380 -2 3350 6 3312 6 ct 3275 6 3246 0 3226 -12 ct 
-3206 -25 3193 -44 3187 -70 ct 3230 -78 l  3235 -62 3243 -50 3257 -43 ct 3270 -36 3288 -32 3312 -32 ct 
-3337 -32 3355 -36 3367 -43 ct 3379 -51 3384 -63 3384 -78 ct 3384 -90 3380 -99 3372 -107 ct 
-3364 -114 3351 -120 3333 -125 ct 3298 -134 l  3269 -142 3249 -149 3237 -156 ct 
-3225 -163 3216 -172 3209 -182 ct 3202 -192 3199 -204 3199 -219 ct 3199 -246 3208 -267 3228 -281 ct 
-3247 -295 3275 -303 3312 -303 ct 3345 -303 3371 -297 3391 -285 ct 3410 -274 3422 -255 3427 -229 ct 
-3383 -224 l  3380 -237 3373 -247 3361 -254 ct 3349 -261 3332 -265 3312 -265 ct 
-3290 -265 3273 -262 3263 -255 ct 3252 -248 3247 -238 3247 -224 ct 3247 -215 3249 -208 3253 -203 ct 
-3258 -197 3264 -193 3273 -189 ct 3282 -185 3300 -180 3327 -173 ct 3354 -166 3373 -160 3384 -155 ct 
-3396 -149 3405 -143 3412 -136 ct 3418 -129 3423 -121 3427 -112 ct 3431 -103 3433 -93 3433 -82 ct 
-p ef
-3901 -149 m  3901 -97 3890 -58 3867 -32 ct 3844 -7 3810 6 3767 6 ct 3723 6 3690 -7 3668 -34 ct 
-3646 -60 3635 -99 3635 -149 ct 3635 -252 3679 -304 3768 -304 ct 3814 -304 3847 -291 3869 -266 ct 
-3890 -241 3901 -202 3901 -149 ct p
-3849 -149 m  3849 -190 3843 -220 3831 -239 ct 3818 -258 3798 -267 3769 -267 ct 
-3740 -267 3719 -257 3706 -238 ct 3693 -219 3687 -190 3687 -149 ct 3687 -110 3693 -80 3706 -60 ct 
-3719 -41 3739 -31 3766 -31 ct 3796 -31 3817 -40 3830 -59 ct 3843 -79 3849 -108 3849 -149 ct 
-p ef
-4151 0 m  4151 -189 l  4151 -209 4149 -224 4145 -235 ct 4142 -246 4135 -254 4127 -258 ct 
-4119 -263 4106 -266 4090 -266 ct 4066 -266 4047 -257 4033 -241 ct 4020 -225 4013 -202 4013 -173 ct 
-4013 0 l  3963 0 l  3963 -235 l  3963 -270 3963 -291 3961 -298 ct 4008 -298 l 
-4008 -298 4009 -295 4009 -291 ct 4009 -287 4009 -282 4010 -277 ct 4010 -272 4010 -262 4010 -247 ct 
-4011 -247 l  4023 -268 4036 -283 4051 -291 ct 4066 -300 4084 -304 4107 -304 ct 
-4139 -304 4163 -296 4178 -280 ct 4193 -263 4201 -236 4201 -199 ct 4201 0 l  4151 0 l 
-p ef
-4508 6 m  4478 6 4456 -2 4441 -18 ct 4425 -34 4418 -55 4418 -83 ct 4418 -114 4428 -138 4448 -154 ct 
-4469 -171 4501 -180 4547 -181 ct 4613 -182 l  4613 -198 l  4613 -222 4608 -240 4598 -250 ct 
-4588 -261 4572 -266 4550 -266 ct 4527 -266 4511 -262 4501 -255 ct 4491 -247 4485 -235 4483 -219 ct 
-4431 -223 l  4440 -277 4479 -304 4551 -304 ct 4588 -304 4616 -295 4635 -278 ct 
-4654 -261 4664 -236 4664 -203 ct 4664 -74 l  4664 -60 4666 -49 4669 -41 ct 4673 -34 4681 -30 4691 -30 ct 
-4696 -30 4702 -31 4708 -32 ct 4708 -1 l  4695 2 4682 3 4669 3 ct 4651 3 4638 -1 4629 -11 ct 
-4621 -21 4616 -36 4615 -57 ct 4613 -57 l  4601 -34 4586 -18 4569 -8 ct 4552 1 4532 6 4508 6 ct 
+gr
+gs
+0.007 0.007 0.007 c 36086 5223 m  36086 4761 l  36145 4761 l  36145 5173 l 
+36367 5173 l  36367 5223 l  36086 5223 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 36427 4794 m  36427 4738 l  36484 4738 l  36484 4794 l 
+36427 4794 l  p
+36427 5224 m  36427 4869 l  36484 4869 l  36484 5224 l  36427 5224 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 36782 5223 m  36782 4998 l  36782 4975 36780 4957 36775 4944 ct 
+36771 4931 36764 4922 36755 4916 ct 36745 4911 36731 4907 36713 4907 ct 36686 4907 36665 4917 36649 4937 ct 
+36634 4956 36626 4983 36626 5017 ct 36626 5223 l  36569 5223 l  36569 4944 l 
+36569 4903 36568 4878 36567 4868 ct 36621 4868 l  36621 4869 36621 4873 36622 4878 ct 
+36622 4882 36622 4887 36622 4894 ct 36623 4900 36623 4912 36623 4929 ct 36624 4929 l 
+36637 4904 36652 4887 36669 4877 ct 36686 4867 36707 4862 36732 4862 ct 36768 4862 36795 4872 36812 4891 ct 
+36829 4911 36838 4942 36838 4986 ct 36838 5223 l  36782 5223 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 37130 5224 m  37016 5061 l  36975 5098 l  36975 5224 l 
+36919 5224 l  36919 4738 l  36975 4738 l  36975 5041 l  37122 4869 l  37188 4869 l 
+37051 5021 l  37195 5224 l  37130 5224 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 37701 4993 m  37701 5069 37688 5128 37663 5168 ct 37637 5209 37598 5229 37548 5229 ct 
+37498 5229 37460 5209 37435 5169 ct 37409 5128 37397 5069 37397 4993 ct 37397 4913 37409 4854 37434 4814 ct 
+37458 4775 37497 4755 37550 4755 ct 37602 4755 37640 4775 37665 4815 ct 37689 4855 37701 4914 37701 4993 ct 
 p
-4519 -31 m  4537 -31 4554 -35 4568 -44 ct 4582 -52 4593 -63 4601 -78 ct 4609 -92 4613 -107 4613 -122 ct 
-4613 -147 l  4559 -146 l  4536 -145 4518 -143 4506 -139 ct 4494 -134 4485 -127 4479 -118 ct 
-4472 -109 4469 -97 4469 -82 ct 4469 -66 4473 -53 4482 -44 ct 4491 -36 4503 -31 4519 -31 ct 
+37645 4993 m  37645 4925 37637 4877 37623 4847 ct 37608 4817 37583 4802 37550 4802 ct 
+37515 4802 37491 4817 37476 4846 ct 37461 4876 37453 4924 37453 4993 ct 37453 5058 37461 5105 37476 5136 ct 
+37491 5166 37515 5181 37548 5181 ct 37581 5181 37606 5166 37622 5135 ct 37637 5104 37645 5057 37645 4993 ct 
 p ef
-4745 1 m  4745 -409 l  4795 -409 l  4795 1 l  4745 1 l  p ef
-4872 1 m  4872 -409 l  4922 -409 l  4922 1 l  4872 1 l  p ef
-pom
-pum
-7671 4242 t
-46 0 m  46 -389 l  341 -389 l  341 -346 l  99 -346 l  99 -221 l  324 -221 l 
-324 -179 l  99 -179 l  99 -43 l  352 -43 l  352 0 l  46 0 l  p ef
-753 0 m  753 -259 l  753 -288 754 -315 756 -342 ct 747 -309 739 -283 731 -265 ct 
-631 0 l  594 0 l  493 -265 l  477 -312 l  468 -342 l  469 -311 l  470 -259 l 
-470 0 l  423 0 l  423 -389 l  492 -389 l  596 -119 l  599 -108 603 -97 606 -84 ct 
-610 -72 612 -63 613 -57 ct 614 -65 618 -76 622 -91 ct 627 -106 630 -115 632 -119 ct 
-733 -389 l  801 -389 l  801 0 l  753 0 l  p ef
-893 0 m  893 -389 l  946 -389 l  946 -43 l  1142 -43 l  1142 0 l  893 0 l 
-p ef
-1510 -107 m  1510 -71 1496 -43 1468 -24 ct 1440 -4 1401 6 1350 6 ct 1255 6 1201 -27 1186 -93 ct 
-1237 -103 l  1242 -80 1255 -62 1274 -52 ct 1293 -41 1319 -35 1352 -35 ct 1386 -35 1412 -41 1431 -53 ct 
-1449 -64 1458 -81 1458 -104 ct 1458 -117 1455 -127 1450 -135 ct 1444 -143 1436 -149 1425 -155 ct 
-1415 -160 1402 -164 1388 -168 ct 1373 -171 1357 -175 1340 -179 ct 1309 -186 1286 -192 1270 -199 ct 
-1254 -206 1241 -214 1232 -222 ct 1223 -230 1216 -240 1211 -251 ct 1206 -263 1204 -275 1204 -290 ct 
-1204 -323 1217 -349 1242 -367 ct 1267 -385 1304 -394 1351 -394 ct 1395 -394 1429 -387 1452 -374 ct 
-1476 -360 1492 -337 1501 -305 ct 1449 -296 l  1444 -316 1433 -331 1417 -340 ct 
-1401 -350 1379 -354 1351 -354 ct 1320 -354 1296 -349 1280 -339 ct 1263 -329 1255 -313 1255 -293 ct 
-1255 -281 1258 -271 1265 -263 ct 1271 -255 1280 -249 1292 -243 ct 1304 -238 1328 -231 1363 -223 ct 
-1375 -220 1387 -218 1399 -215 ct 1411 -212 1422 -209 1433 -205 ct 1444 -201 1454 -196 1463 -191 ct 
-1473 -185 1481 -179 1488 -171 ct 1495 -163 1500 -154 1504 -144 ct 1508 -133 1510 -121 1510 -107 ct 
-p ef
-1858 1 m  1757 -161 l  1636 -161 l  1636 1 l  1583 1 l  1583 -388 l  1766 -388 l 
-1810 -388 1843 -378 1867 -359 ct 1891 -339 1903 -312 1903 -277 ct 1903 -248 1894 -224 1878 -204 ct 
-1861 -185 1838 -172 1808 -167 ct 1918 1 l  1858 1 l  p
-1850 -277 m  1850 -299 1842 -316 1827 -328 ct 1812 -340 1789 -346 1761 -346 ct 
-1636 -346 l  1636 -203 l  1763 -203 l  1791 -203 1812 -209 1827 -222 ct 1842 -235 1850 -253 1850 -277 ct 
-p ef
-2138 1 m  2138 -409 l  2188 -409 l  2188 1 l  2138 1 l  p ef
-2265 -362 m  2265 -409 l  2314 -409 l  2314 -362 l  2265 -362 l  p
-2265 0 m  2265 -298 l  2314 -298 l  2314 0 l  2265 0 l  p ef
-2581 0 m  2581 -189 l  2581 -209 2579 -224 2575 -235 ct 2572 -246 2565 -254 2557 -258 ct 
-2549 -263 2536 -266 2520 -266 ct 2496 -266 2477 -257 2463 -241 ct 2450 -225 2443 -202 2443 -173 ct 
-2443 0 l  2393 0 l  2393 -235 l  2393 -270 2393 -291 2391 -298 ct 2438 -298 l 
-2438 -298 2439 -295 2439 -291 ct 2439 -287 2439 -282 2440 -277 ct 2440 -272 2440 -262 2440 -247 ct 
-2441 -247 l  2453 -268 2466 -283 2481 -291 ct 2496 -300 2514 -304 2537 -304 ct 
-2569 -304 2593 -296 2608 -280 ct 2623 -263 2631 -236 2631 -199 ct 2631 0 l  2581 0 l 
-p ef
-2892 0 m  2791 -136 l  2755 -106 l  2755 0 l  2705 0 l  2705 -409 l  2755 -409 l 
-2755 -153 l  2885 -298 l  2944 -298 l  2823 -170 l  2950 0 l  2892 0 l 
-p ef
-3213 -82 m  3213 -54 3202 -32 3181 -17 ct 3160 -2 3130 6 3092 6 ct 3055 6 3026 0 3006 -12 ct 
-2986 -25 2973 -44 2967 -70 ct 3010 -78 l  3015 -62 3023 -50 3037 -43 ct 3050 -36 3068 -32 3092 -32 ct 
-3117 -32 3135 -36 3147 -43 ct 3159 -51 3164 -63 3164 -78 ct 3164 -90 3160 -99 3152 -107 ct 
-3144 -114 3131 -120 3113 -125 ct 3078 -134 l  3049 -142 3029 -149 3017 -156 ct 
-3005 -163 2996 -172 2989 -182 ct 2982 -192 2979 -204 2979 -219 ct 2979 -246 2988 -267 3008 -281 ct 
-3027 -295 3055 -303 3092 -303 ct 3125 -303 3151 -297 3171 -285 ct 3190 -274 3202 -255 3207 -229 ct 
-3163 -224 l  3160 -237 3153 -247 3141 -254 ct 3129 -261 3112 -265 3092 -265 ct 
-3070 -265 3053 -262 3043 -255 ct 3032 -248 3027 -238 3027 -224 ct 3027 -215 3029 -208 3033 -203 ct 
-3038 -197 3044 -193 3053 -189 ct 3062 -185 3080 -180 3107 -173 ct 3134 -166 3153 -160 3164 -155 ct 
-3176 -149 3185 -143 3192 -136 ct 3198 -129 3203 -121 3207 -112 ct 3211 -103 3213 -93 3213 -82 ct 
+gr
+gs
+0.007 0.007 0.007 c 36087 13216 m  36087 12754 l  36146 12754 l  36146 13165 l 
+36368 13165 l  36368 13216 l  36087 13216 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 36428 12786 m  36428 12730 l  36485 12730 l  36485 12786 l 
+36428 12786 l  p
+36428 13217 m  36428 12863 l  36485 12863 l  36485 13217 l  36428 13217 l 
 p ef
-pom
+gr
 gs
-1.000 1.000 0.843 c 20399 8119 m  15899 8119 l  15899 7169 l  24899 7169 l 
-24899 8119 l  20399 8119 l  p ef
+0.007 0.007 0.007 c 36783 13216 m  36783 12990 l  36783 12967 36781 12949 36776 12937 ct 
+36772 12923 36765 12915 36756 12908 ct 36746 12903 36732 12900 36713 12900 ct 
+36686 12900 36665 12909 36649 12929 ct 36634 12948 36626 12976 36626 13009 ct 
+36626 13216 l  36570 13216 l  36570 12937 l  36570 12896 36569 12870 36568 12861 ct 
+36621 12861 l  36621 12862 36621 12865 36622 12870 ct 36622 12875 36622 12880 36622 12886 ct 
+36623 12893 36623 12904 36623 12922 ct 36624 12922 l  36637 12897 36652 12880 36669 12869 ct 
+36686 12860 36707 12855 36733 12855 ct 36769 12855 36796 12864 36813 12883 ct 
+36830 12903 36839 12935 36839 12979 ct 36839 13216 l  36783 13216 l  p ef
 gr
 gs
-0.507 0.832 0.105 c 14799 8439 m  13699 8439 l  13699 7169 l  15899 7169 l 
-15899 8439 l  14799 8439 l  p ef
+0.007 0.007 0.007 c 37131 13217 m  37017 13055 l  36976 13090 l  36976 13217 l 
+36920 13217 l  36920 12730 l  36976 12730 l  36976 13035 l  37123 12863 l 
+37189 12863 l  37052 13015 l  37196 13217 l  37131 13217 l  p ef
 gr
 gs
-0 lw 1 lj 0.207 0.398 0.644 c 14799 8439 m  13699 8439 l  13699 7169 l 
-15899 7169 l  15899 8439 l  14799 8439 l  pc
+0.007 0.007 0.007 c 37421 13216 m  37421 13166 l  37533 13166 l  37533 12810 l 
+37434 12884 l  37434 12829 l  37537 12754 l  37590 12754 l  37590 13166 l 
+37696 13166 l  37696 13216 l  37421 13216 l  p ef
 gr
-pum
-14167 8024 t
-361 -1 m  247 -182 l  111 -182 l  111 -1 l  52 -1 l  52 -437 l  258 -437 l 
-307 -437 345 -426 372 -404 ct 398 -382 412 -352 412 -313 ct 412 -280 402 -253 383 -231 ct 
-364 -209 338 -195 305 -189 ct 429 -1 l  361 -1 l  p
-352 -312 m  352 -337 344 -357 326 -370 ct 309 -383 284 -390 252 -390 ct 111 -390 l 
-111 -229 l  254 -229 l  285 -229 310 -236 327 -251 ct 344 -265 352 -286 352 -312 ct 
-p ef
-672 -389 m  672 0 l  613 0 l  613 -389 l  463 -389 l  463 -437 l  822 -437 l 
-822 -389 l  672 -389 l  p ef
-1232 -121 m  1232 -81 1217 -49 1185 -27 ct 1154 -5 1109 6 1052 6 ct 945 6 884 -31 867 -105 ct 
-924 -117 l  931 -90 945 -71 966 -59 ct 988 -46 1017 -40 1054 -40 ct 1092 -40 1122 -47 1143 -60 ct 
-1163 -73 1174 -92 1174 -118 ct 1174 -132 1171 -144 1164 -153 ct 1158 -161 1148 -169 1137 -175 ct 
-1125 -180 1111 -185 1094 -189 ct 1078 -193 1060 -197 1040 -202 ct 1006 -210 979 -217 962 -225 ct 
-944 -233 930 -241 919 -250 ct 909 -260 901 -271 896 -284 ct 890 -296 887 -311 887 -327 ct 
-887 -364 902 -393 930 -414 ct 959 -434 1000 -444 1053 -444 ct 1103 -444 1141 -436 1167 -421 ct 
-1193 -406 1212 -380 1222 -343 ct 1164 -333 l  1157 -356 1145 -373 1127 -384 ct 
-1109 -394 1084 -399 1053 -399 ct 1018 -399 991 -394 973 -382 ct 954 -370 945 -353 945 -330 ct 
-945 -317 949 -306 956 -297 ct 963 -288 973 -281 987 -274 ct 1000 -268 1027 -261 1067 -252 ct 
-1080 -249 1094 -246 1107 -242 ct 1120 -239 1133 -235 1145 -231 ct 1157 -226 1169 -221 1180 -215 ct 
-1190 -209 1199 -202 1207 -193 ct 1215 -185 1221 -174 1226 -163 ct 1230 -151 1232 -137 1232 -121 ct 
+gs
+0.871 0.902 0.937 c 9542 6069 m  2772 6069 l  2772 5080 l  16310 5080 l 
+16310 6069 l  9542 6069 l  p ef
+gr
+gs
+1.000 1.000 0.843 c 8297 14064 m  2772 14064 l  2772 13075 l  13821 13075 l 
+13821 14064 l  8297 14064 l  p ef
+gr
+gs
+0.933 0.933 0.933 c 4999 -11 m  4826 -11 4656 7 4506 42 ct 4357 76 4232 125 4145 184 ct 
+4059 242 4013 309 4013 378 ct 4013 668 l  4013 960 l  4013 1356 l  4013 1648 l 
+4013 1940 l  4013 2008 4059 2076 4145 2135 ct 4232 2194 4357 2243 4506 2277 ct 
+4656 2312 4826 2329 4999 2329 ct 5739 2329 l  6478 2329 l  7484 2329 l  9192 3233 l 
+8963 2329 l  8964 2329 l  9137 2329 9307 2312 9457 2277 ct 9607 2243 9732 2194 9819 2135 ct 
+9905 2076 9951 2008 9951 1940 ct 9951 1648 l  9951 1356 l  9951 960 l  9951 668 l 
+9951 377 l  9951 378 l  9951 309 9905 242 9819 184 ct 9732 125 9607 76 9457 42 ct 
+9307 7 9137 -11 8964 -11 ct 8224 -11 l  7484 -11 l  6478 -11 l  5739 -11 l 
+4999 -11 l  p ef
+gr
+gs
+0 lw 1 lj 0.007 0.007 0.007 c 4998 -11 m  4825 -11 4655 6 4505 41 ct 4356 74 4231 124 4144 183 ct 
+4058 241 4012 308 4012 376 ct 4012 667 l  4012 958 l  4012 1354 l  4012 1647 l 
+4012 1938 l  4012 2007 4058 2074 4144 2133 ct 4231 2192 4356 2242 4505 2275 ct 
+4655 2310 4825 2328 4998 2328 ct 5738 2328 l  6477 2328 l  7484 2328 l  9192 3232 l 
+8963 2328 l  8964 2328 l  9137 2328 9307 2310 9457 2275 ct 9607 2242 9732 2192 9819 2133 ct 
+9905 2074 9951 2007 9951 1938 ct 9951 1647 l  9951 1354 l  9951 958 l  9951 667 l 
+9951 375 l  9951 376 l  9951 308 9905 241 9819 183 ct 9732 124 9607 74 9457 41 ct 
+9307 6 9137 -11 8964 -11 ct 8224 -11 l  7484 -11 l  6477 -11 l  5738 -11 l 
+4998 -11 l  pc
+gr
+gs
+0.007 0.007 0.007 c 4708 339 m  4708 703 l  4656 703 l  4656 339 l  4522 339 l 
+4522 294 l  4842 294 l  4842 339 l  4708 339 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 4939 443 m  4950 423 4963 407 4978 398 ct 4993 388 5012 384 5035 384 ct 
+5067 384 5091 393 5107 409 ct 5122 426 5130 455 5130 495 ct 5130 705 l  5079 705 l 
+5079 504 l  5079 482 5077 466 5073 456 ct 5070 444 5063 437 5054 432 ct 5046 426 5033 424 5018 424 ct 
+4994 424 4976 433 4962 449 ct 4948 466 4941 489 4941 519 ct 4941 705 l  4891 705 l 
+4891 273 l  4941 273 l  4941 385 l  4941 397 4940 409 4940 422 ct 4939 434 4939 441 4938 443 ct 
+4939 443 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 5241 559 m  5241 595 5248 622 5262 642 ct 5276 661 5297 672 5324 672 ct 
+5346 672 5363 666 5376 658 ct 5389 648 5398 637 5402 623 ct 5447 636 l  5429 685 5387 711 5324 711 ct 
+5280 711 5247 697 5224 669 ct 5200 641 5189 600 5189 545 ct 5189 494 5200 453 5224 425 ct 
+5247 397 5279 383 5322 383 ct 5410 383 5455 439 5455 552 ct 5455 559 l  5241 559 l 
+p
+5402 519 m  5400 484 5392 460 5378 445 ct 5365 429 5346 422 5321 422 ct 5297 422 5278 431 5264 447 ct 
+5250 464 5243 489 5242 519 ct 5402 519 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 5927 703 m  5883 583 l  5705 583 l  5661 703 l  5606 703 l 
+5764 294 l  5825 294 l  5981 703 l  5927 703 l  p
+5795 336 m  5792 343 l  5788 360 5780 380 5771 405 ct 5721 540 l  5867 540 l 
+5818 405 l  5812 392 5807 377 5802 360 ct 5795 336 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 6329 418 m  6329 457 6317 487 6294 509 ct 6270 533 6237 544 6196 544 ct 
+6081 544 l  6081 705 l  6028 705 l  6028 295 l  6193 295 l  6236 295 6270 305 6294 326 ct 
+6318 348 6329 379 6329 418 ct p
+6277 418 m  6277 365 6246 339 6186 339 ct 6081 339 l  6081 500 l  6188 500 l 
+6247 500 6277 473 6277 418 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 6880 704 m  6880 431 l  6880 400 6881 372 6883 343 ct 6874 378 6866 405 6858 424 ct 
+6758 704 l  6721 704 l  6620 424 l  6604 375 l  6594 343 l  6595 376 l 
+6596 431 l  6596 704 l  6549 704 l  6549 294 l  6619 294 l  6723 578 l 
+6726 589 6730 601 6733 616 ct 6737 628 6739 638 6740 644 ct 6741 636 6745 624 6749 607 ct 
+6754 592 6757 582 6759 578 ct 6860 294 l  6928 294 l  6928 704 l  6880 704 l 
 p ef
-pom
+gr
+gs
+0.007 0.007 0.007 c 7019 704 m  7019 294 l  7073 294 l  7073 659 l  7269 659 l 
+7269 704 l  7019 704 l  p ef
+gr
 gs
-0.871 0.902 0.937 c 32418 8119 m  27439 8119 l  27439 7169 l  37398 7169 l 
-37398 8119 l  32418 8119 l  p ef
+0.007 0.007 0.007 c 7667 494 m  7667 537 7660 574 7644 605 ct 7628 638 7606 662 7578 679 ct 
+7549 696 7516 704 7477 704 ct 7332 704 l  7332 294 l  7461 294 l  7527 294 7578 312 7614 346 ct 
+7649 381 7667 431 7667 494 ct p
+7614 494 m  7614 443 7601 404 7575 378 ct 7549 352 7510 338 7460 338 ct 7385 338 l 
+7385 660 l  7471 660 l  7501 660 7526 654 7547 640 ct 7569 627 7586 606 7597 582 ct 
+7609 557 7614 528 7614 494 ct p ef
 gr
 gs
-1.000 1.000 0.843 c 32410 15720 m  27423 15720 l  27423 14769 l  37397 14769 l 
-37397 15720 l  32410 15720 l  p ef
+0.007 0.007 0.007 c 8140 545 m  8140 656 8103 711 8030 711 ct 8008 711 7989 706 7974 698 ct 
+7958 689 7946 675 7937 656 ct 7936 656 l  7936 662 7936 672 7935 683 ct 7934 696 7934 703 7933 704 ct 
+7885 704 l  7886 695 7887 673 7887 639 ct 7887 273 l  7937 273 l  7937 396 l 
+7937 408 7936 423 7935 440 ct 7937 440 l  7946 420 7958 405 7974 397 ct 7989 388 8008 384 8030 384 ct 
+8068 384 8096 397 8113 424 ct 8131 451 8140 491 8140 545 ct p
+8088 547 m  8088 503 8082 472 8071 453 ct 8060 434 8043 424 8018 424 ct 7990 424 7968 435 7956 455 ct 
+7943 475 7937 506 7937 551 ct 7937 592 7943 622 7955 641 ct 7968 662 7989 672 8017 672 ct 
+8042 672 8060 662 8071 642 ct 8082 622 8088 591 8088 547 ct p ef
 gr
 gs
-0.933 0.933 0.933 c 7145 17407 m  7145 17407 l  6950 17407 6758 17422 6589 17451 ct 
-6419 17479 6279 17520 6181 17570 ct 6083 17619 6032 17675 6032 17733 ct 6032 17976 l 
-6032 18220 l  6032 18552 l  6032 18796 l  6032 19040 l  6032 19040 l  6032 19098 6083 19154 6181 19203 ct 
-6279 19253 6419 19294 6589 19322 ct 6758 19351 6950 19366 7145 19366 ct 7979 19365 l 
-8813 19365 l  9948 19365 l  10782 19365 l  11616 19365 l  11617 19366 l 
-11812 19366 12004 19351 12173 19322 ct 12343 19294 12483 19253 12581 19203 ct 
-12679 19154 12730 19098 12730 19040 ct 12730 18796 l  12730 18552 l  12730 18220 l 
-12730 17976 l  12730 17732 l  12730 17733 l  12730 17733 l  12730 17675 12679 17619 12581 17570 ct 
-12483 17520 12343 17479 12173 17451 ct 12004 17422 11812 17407 11617 17407 ct 
-10782 17407 l  9948 17407 l  8813 17407 l  8684 16110 l  7145 17407 l 
+0.007 0.007 0.007 c 8200 705 m  8200 273 l  8251 273 l  8251 705 l  8200 705 l 
 p ef
 gr
 gs
-0 lw 1 lj 7144 17407 m  7144 17407 l  6949 17407 6757 17422 6588 17451 ct 
-6418 17479 6278 17520 6180 17570 ct 6082 17619 6031 17675 6031 17733 ct 6031 17976 l 
-6031 18220 l  6031 18552 l  6031 18796 l  6031 19040 l  6031 19040 l  6031 19098 6082 19154 6180 19203 ct 
-6278 19253 6418 19294 6588 19322 ct 6757 19351 6949 19366 7144 19366 ct 7978 19365 l 
-8812 19365 l  9948 19365 l  10782 19365 l  11616 19365 l  11617 19366 l 
-11812 19366 12004 19351 12173 19322 ct 12343 19294 12483 19253 12581 19203 ct 
-12679 19154 12730 19098 12730 19040 ct 12730 18796 l  12730 18552 l  12730 18220 l 
-12730 17976 l  12730 17732 l  12730 17733 l  12730 17733 l  12730 17675 12679 17619 12581 17570 ct 
-12483 17520 12343 17479 12173 17451 ct 12004 17422 11812 17407 11617 17407 ct 
-10782 17407 l  9948 17407 l  8812 17407 l  8683 16110 l  7144 17407 l 
-pc
+0.007 0.007 0.007 c 8580 547 m  8580 602 8569 643 8546 671 ct 8523 697 8489 711 8446 711 ct 
+8402 711 8369 697 8346 668 ct 8324 641 8313 600 8313 547 ct 8313 438 8358 383 8447 383 ct 
+8493 383 8526 397 8548 423 ct 8569 449 8580 492 8580 547 ct p
+8528 547 m  8528 504 8522 472 8510 452 ct 8497 432 8477 422 8448 422 ct 8419 422 8398 433 8385 453 ct 
+8372 473 8366 504 8366 547 ct 8366 588 8372 620 8385 641 ct 8398 661 8418 672 8445 672 ct 
+8475 672 8496 662 8509 642 ct 8522 621 8528 591 8528 547 ct p ef
 gr
-pum
-6529 18267 t
-376 0 m  376 -259 l  376 -288 377 -315 379 -342 ct 370 -309 362 -283 354 -265 ct 
-254 0 l  217 0 l  116 -265 l  100 -312 l  91 -342 l  92 -311 l  93 -259 l 
-93 0 l  46 0 l  46 -389 l  115 -389 l  219 -119 l  222 -108 226 -97 229 -84 ct 
-233 -72 235 -63 236 -57 ct 237 -65 241 -76 245 -91 ct 250 -106 253 -115 255 -119 ct 
-356 -389 l  424 -389 l  424 0 l  376 0 l  p ef
-584 6 m  554 6 532 -2 517 -18 ct 501 -34 494 -55 494 -83 ct 494 -114 504 -138 524 -154 ct 
-545 -171 577 -180 623 -181 ct 689 -182 l  689 -198 l  689 -222 684 -240 674 -250 ct 
-664 -261 648 -266 626 -266 ct 603 -266 587 -262 577 -255 ct 567 -247 561 -235 559 -219 ct 
-507 -223 l  516 -277 555 -304 627 -304 ct 664 -304 692 -295 711 -278 ct 730 -261 740 -236 740 -203 ct 
-740 -74 l  740 -60 742 -49 745 -41 ct 749 -34 757 -30 767 -30 ct 772 -30 778 -31 784 -32 ct 
-784 -1 l  771 2 758 3 745 3 ct 727 3 714 -1 705 -11 ct 697 -21 692 -36 691 -57 ct 
-689 -57 l  677 -34 662 -18 645 -8 ct 628 1 608 6 584 6 ct p
-595 -31 m  613 -31 630 -35 644 -44 ct 658 -52 669 -63 677 -78 ct 685 -92 689 -107 689 -122 ct 
-689 -147 l  635 -146 l  612 -145 594 -143 582 -139 ct 570 -134 561 -127 555 -118 ct 
-548 -109 545 -97 545 -82 ct 545 -66 549 -53 558 -44 ct 567 -36 579 -31 595 -31 ct 
-p ef
-821 -362 m  821 -409 l  870 -409 l  870 -362 l  821 -362 l  p
-821 0 m  821 -298 l  870 -298 l  870 0 l  821 0 l  p ef
-1137 0 m  1137 -189 l  1137 -209 1135 -224 1131 -235 ct 1128 -246 1121 -254 1113 -258 ct 
-1105 -263 1092 -266 1076 -266 ct 1052 -266 1033 -257 1019 -241 ct 1006 -225 999 -202 999 -173 ct 
-999 0 l  949 0 l  949 -235 l  949 -270 949 -291 947 -298 ct 994 -298 l  994 -298 995 -295 995 -291 ct 
-995 -287 995 -282 996 -277 ct 996 -272 996 -262 996 -247 ct 997 -247 l  1009 -268 1022 -283 1037 -291 ct 
-1052 -300 1070 -304 1093 -304 ct 1125 -304 1149 -296 1164 -280 ct 1179 -263 1187 -236 1187 -199 ct 
-1187 0 l  1137 0 l  p ef
-1726 -271 m  1726 -234 1714 -205 1691 -184 ct 1667 -162 1634 -151 1593 -151 ct 
-1479 -151 l  1479 1 l  1426 1 l  1426 -388 l  1590 -388 l  1633 -388 1667 -378 1691 -358 ct 
-1715 -337 1726 -308 1726 -271 ct p
-1674 -271 m  1674 -321 1643 -346 1583 -346 ct 1479 -346 l  1479 -193 l  1585 -193 l 
-1644 -193 1674 -219 1674 -271 ct p ef
-2066 0 m  2066 -180 l  1856 -180 l  1856 0 l  1803 0 l  1803 -389 l  1856 -389 l 
-1856 -224 l  2066 -224 l  2066 -389 l  2118 -389 l  2118 0 l  2066 0 l 
-p ef
-2377 -161 m  2377 0 l  2325 0 l  2325 -161 l  2175 -389 l  2233 -389 l 
-2351 -203 l  2469 -389 l  2527 -389 l  2377 -161 l  p ef
-2760 -150 m  2760 -111 2766 -81 2778 -62 ct 2791 -43 2810 -33 2835 -33 ct 2853 -33 2867 -38 2879 -48 ct 
-2891 -57 2898 -72 2901 -92 ct 2951 -88 l  2947 -60 2935 -37 2915 -20 ct 2894 -3 2868 6 2836 6 ct 
-2795 6 2763 -7 2741 -34 ct 2719 -60 2708 -99 2708 -149 ct 2708 -200 2719 -238 2741 -264 ct 
-2763 -291 2795 -304 2836 -304 ct 2866 -304 2892 -296 2912 -280 ct 2932 -264 2944 -243 2949 -215 ct 
-2899 -211 l  2896 -227 2889 -241 2879 -250 ct 2869 -260 2854 -265 2834 -265 ct 
-2808 -265 2789 -256 2777 -239 ct 2766 -221 2760 -192 2760 -150 ct p ef
-3082 6 m  3052 6 3030 -2 3015 -18 ct 2999 -34 2992 -55 2992 -83 ct 2992 -114 3002 -138 3022 -154 ct 
-3043 -171 3075 -180 3121 -181 ct 3187 -182 l  3187 -198 l  3187 -222 3182 -240 3172 -250 ct 
-3162 -261 3146 -266 3124 -266 ct 3101 -266 3085 -262 3075 -255 ct 3065 -247 3059 -235 3057 -219 ct 
-3005 -223 l  3014 -277 3053 -304 3125 -304 ct 3162 -304 3190 -295 3209 -278 ct 
-3228 -261 3238 -236 3238 -203 ct 3238 -74 l  3238 -60 3240 -49 3243 -41 ct 3247 -34 3255 -30 3265 -30 ct 
-3270 -30 3276 -31 3282 -32 ct 3282 -1 l  3269 2 3256 3 3243 3 ct 3225 3 3212 -1 3203 -11 ct 
-3195 -21 3190 -36 3189 -57 ct 3187 -57 l  3175 -34 3160 -18 3143 -8 ct 3126 1 3106 6 3082 6 ct 
+gs
+0.007 0.007 0.007 c 8679 546 m  8679 587 8685 619 8697 639 ct 8710 659 8729 669 8754 669 ct 
+8771 669 8786 664 8797 654 ct 8809 644 8816 628 8820 607 ct 8870 612 l  8866 641 8854 665 8834 683 ct 
+8812 701 8786 711 8754 711 ct 8713 711 8682 697 8660 668 ct 8638 641 8627 600 8627 547 ct 
+8627 494 8638 453 8660 425 ct 8682 397 8713 383 8754 383 ct 8784 383 8811 392 8830 408 ct 
+8851 425 8863 447 8868 477 ct 8817 481 l  8814 464 8807 449 8797 440 ct 8788 429 8773 424 8753 424 ct 
+8727 424 8708 434 8696 452 ct 8685 471 8679 502 8679 546 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 9110 704 m  9009 560 l  8973 592 l  8973 704 l  8923 704 l 
+8923 273 l  8973 273 l  8973 542 l  9103 389 l  9163 389 l  9041 524 l 
+9169 704 l  9110 704 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 9432 618 m  9432 647 9421 671 9400 686 ct 9379 702 9349 711 9311 711 ct 
+9274 711 9245 704 9225 692 ct 9205 678 9192 658 9185 631 ct 9229 622 l  9234 639 9242 652 9256 659 ct 
+9269 666 9287 671 9311 671 ct 9336 671 9354 666 9366 659 ct 9378 651 9383 638 9383 622 ct 
+9383 609 9379 600 9371 592 ct 9363 584 9350 578 9332 573 ct 9297 563 l  9268 555 9248 547 9236 540 ct 
+9224 533 9215 523 9208 513 ct 9201 502 9198 489 9198 473 ct 9198 444 9207 422 9227 407 ct 
+9246 393 9274 384 9311 384 ct 9344 384 9370 391 9390 403 ct 9409 415 9421 435 9426 462 ct 
+9382 467 l  9379 454 9372 443 9360 436 ct 9348 428 9331 424 9311 424 ct 9289 424 9272 427 9262 435 ct 
+9251 442 9246 453 9246 467 ct 9246 477 9248 484 9252 491 ct 9257 497 9263 501 9272 505 ct 
+9281 509 9299 515 9326 522 ct 9353 529 9372 536 9383 541 ct 9395 547 9404 554 9411 561 ct 
+9417 568 9422 577 9426 586 ct 9430 596 9432 606 9432 618 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 4655 1359 m  4637 1365 4621 1367 4603 1367 ct 4564 1367 4544 1342 4544 1296 ct 
+4544 1086 l  4510 1086 l  4510 1048 l  4546 1048 l  4560 978 l  4594 978 l 
+4594 1048 l  4650 1048 l  4650 1086 l  4594 1086 l  4594 1285 l  4594 1300 4596 1311 4601 1317 ct 
+4605 1323 4613 1326 4625 1326 ct 4632 1326 4641 1324 4655 1322 ct 4655 1359 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 4697 1363 m  4697 1123 l  4697 1100 4697 1076 4695 1049 ct 
+4742 1049 l  4744 1084 4744 1106 4744 1113 ct 4746 1113 l  4753 1086 4763 1067 4773 1058 ct 
+4783 1048 4798 1043 4816 1043 ct 4823 1043 4831 1044 4837 1046 ct 4837 1094 l 
+4831 1092 4821 1092 4810 1092 ct 4789 1092 4774 1100 4763 1120 ct 4752 1139 4747 1165 4747 1200 ct 
+4747 1363 l  4697 1363 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 4958 1369 m  4928 1369 4906 1361 4891 1344 ct 4875 1328 4868 1306 4868 1277 ct 
+4868 1244 4878 1219 4898 1202 ct 4919 1184 4951 1175 4997 1174 ct 5064 1173 l 
+5064 1156 l  5064 1129 5059 1111 5048 1100 ct 5038 1088 5022 1083 5000 1083 ct 
+4977 1083 4961 1087 4951 1095 ct 4941 1103 4935 1116 4933 1133 ct 4881 1128 l 
+4890 1072 4929 1043 5001 1043 ct 5038 1043 5067 1053 5086 1071 ct 5105 1088 5115 1115 5115 1151 ct 
+5115 1286 l  5115 1301 5117 1313 5120 1321 ct 5124 1328 5132 1332 5142 1332 ct 
+5147 1332 5153 1332 5159 1331 ct 5159 1362 l  5146 1365 5133 1366 5120 1366 ct 
+5102 1366 5089 1362 5080 1352 ct 5072 1341 5067 1325 5066 1304 ct 5064 1304 l 
+5051 1328 5036 1344 5019 1355 ct 5002 1364 4982 1369 4958 1369 ct p
+4969 1332 m  4987 1332 5004 1327 5018 1318 ct 5032 1309 5043 1298 5051 1282 ct 
+5060 1267 5064 1252 5064 1236 ct 5064 1209 l  5009 1211 l  4986 1212 4968 1214 4956 1218 ct 
+4944 1223 4935 1231 4929 1240 ct 4922 1249 4919 1262 4919 1278 ct 4919 1295 4923 1308 4932 1318 ct 
+4941 1325 4953 1332 4969 1332 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 5385 1363 m  5385 1165 l  5385 1144 5383 1128 5379 1116 ct 
+5375 1104 5368 1096 5360 1092 ct 5352 1086 5339 1083 5323 1083 ct 5299 1083 5280 1093 5266 1109 ct 
+5253 1127 5246 1152 5246 1182 ct 5246 1363 l  5196 1363 l  5196 1116 l  5196 1079 5196 1057 5194 1049 ct 
+5241 1049 l  5241 1049 5242 1053 5242 1057 ct 5242 1061 5242 1066 5243 1072 ct 
+5243 1077 5243 1087 5243 1103 ct 5244 1103 l  5256 1081 5269 1065 5284 1057 ct 
+5299 1047 5317 1043 5340 1043 ct 5372 1043 5397 1052 5412 1068 ct 5427 1086 5435 1115 5435 1155 ct 
+5435 1363 l  5385 1363 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 5733 1278 m  5733 1307 5722 1331 5701 1346 ct 5680 1361 5650 1369 5612 1369 ct 
+5575 1369 5546 1363 5526 1351 ct 5505 1337 5492 1318 5486 1291 ct 5530 1282 l 
+5535 1299 5543 1312 5557 1319 ct 5570 1325 5588 1331 5612 1331 ct 5637 1331 5655 1325 5667 1319 ct 
+5679 1311 5684 1298 5684 1282 ct 5684 1269 5680 1260 5672 1252 ct 5664 1244 5651 1238 5633 1233 ct 
+5598 1223 l  5569 1215 5549 1207 5537 1200 ct 5525 1193 5516 1183 5508 1173 ct 
+5501 1162 5498 1149 5498 1133 ct 5498 1104 5507 1082 5528 1067 ct 5547 1053 5575 1044 5612 1044 ct 
+5645 1044 5671 1051 5691 1063 ct 5710 1075 5722 1095 5727 1122 ct 5683 1127 l 
+5680 1114 5673 1103 5661 1096 ct 5649 1088 5632 1084 5612 1084 ct 5590 1084 5573 1087 5563 1095 ct 
+5552 1102 5547 1113 5547 1127 ct 5547 1138 5549 1145 5553 1151 ct 5558 1157 5564 1161 5573 1165 ct 
+5582 1169 5600 1175 5627 1182 ct 5654 1189 5673 1196 5684 1201 ct 5696 1207 5705 1214 5712 1221 ct 
+5718 1228 5723 1237 5727 1246 ct 5731 1256 5733 1266 5733 1278 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 5966 1363 m  5966 1165 l  5966 1135 5962 1113 5954 1101 ct 
+5946 1089 5932 1083 5911 1083 ct 5890 1083 5873 1092 5861 1109 ct 5849 1127 5842 1152 5842 1182 ct 
+5842 1363 l  5793 1363 l  5793 1116 l  5793 1079 5793 1057 5791 1049 ct 5838 1049 l 
+5838 1049 5839 1053 5839 1057 ct 5839 1061 5839 1066 5840 1072 ct 5840 1077 5840 1087 5840 1103 ct 
+5841 1103 l  5852 1080 5864 1065 5878 1056 ct 5892 1047 5909 1043 5928 1043 ct 
+5951 1043 5969 1047 5982 1058 ct 5995 1067 6004 1082 6009 1103 ct 6010 1103 l 
+6020 1081 6033 1066 6047 1057 ct 6062 1047 6080 1043 6100 1043 ct 6132 1043 6153 1052 6167 1069 ct 
+6181 1086 6188 1115 6188 1155 ct 6188 1363 l  6139 1363 l  6139 1165 l  6139 1135 6135 1113 6127 1101 ct 
+6118 1089 6104 1083 6083 1083 ct 6061 1083 6045 1092 6033 1108 ct 6021 1127 6015 1151 6015 1182 ct 
+6015 1363 l  5966 1363 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 6262 982 m  6262 933 l  6312 933 l  6312 982 l  6262 982 l 
 p
-3093 -31 m  3111 -31 3128 -35 3142 -44 ct 3156 -52 3167 -63 3175 -78 ct 3183 -92 3187 -107 3187 -122 ct 
-3187 -147 l  3133 -146 l  3110 -145 3092 -143 3080 -139 ct 3068 -134 3059 -127 3053 -118 ct 
-3046 -109 3043 -97 3043 -82 ct 3043 -66 3047 -53 3056 -44 ct 3065 -36 3077 -31 3093 -31 ct 
-p ef
-3508 0 m  3508 -189 l  3508 -209 3506 -224 3502 -235 ct 3499 -246 3492 -254 3484 -258 ct 
-3476 -263 3463 -266 3447 -266 ct 3423 -266 3404 -257 3390 -241 ct 3377 -225 3370 -202 3370 -173 ct 
-3370 0 l  3320 0 l  3320 -235 l  3320 -270 3320 -291 3318 -298 ct 3365 -298 l 
-3365 -298 3366 -295 3366 -291 ct 3366 -287 3366 -282 3367 -277 ct 3367 -272 3367 -262 3367 -247 ct 
-3368 -247 l  3380 -268 3393 -283 3408 -291 ct 3423 -300 3441 -304 3464 -304 ct 
-3496 -304 3520 -296 3535 -280 ct 3550 -263 3558 -236 3558 -199 ct 3558 0 l  3508 0 l 
-p ef
-4013 -82 m  4013 -54 4002 -32 3981 -17 ct 3960 -2 3930 6 3892 6 ct 3855 6 3826 0 3806 -12 ct 
-3786 -25 3773 -44 3767 -70 ct 3810 -78 l  3815 -62 3823 -50 3837 -43 ct 3850 -36 3868 -32 3892 -32 ct 
-3917 -32 3935 -36 3947 -43 ct 3959 -51 3964 -63 3964 -78 ct 3964 -90 3960 -99 3952 -107 ct 
-3944 -114 3931 -120 3913 -125 ct 3878 -134 l  3849 -142 3829 -149 3817 -156 ct 
-3805 -163 3796 -172 3789 -182 ct 3782 -192 3779 -204 3779 -219 ct 3779 -246 3788 -267 3808 -281 ct 
-3827 -295 3855 -303 3892 -303 ct 3925 -303 3951 -297 3971 -285 ct 3990 -274 4002 -255 4007 -229 ct 
-3963 -224 l  3960 -237 3953 -247 3941 -254 ct 3929 -261 3912 -265 3892 -265 ct 
-3870 -265 3853 -262 3843 -255 ct 3832 -248 3827 -238 3827 -224 ct 3827 -215 3829 -208 3833 -203 ct 
-3838 -197 3844 -193 3853 -189 ct 3862 -185 3880 -180 3907 -173 ct 3934 -166 3953 -160 3964 -155 ct 
-3976 -149 3985 -143 3992 -136 ct 3998 -129 4003 -121 4007 -112 ct 4011 -103 4013 -93 4013 -82 ct 
-p ef
-4187 -3 m  4170 2 4154 4 4136 4 ct 4097 4 4077 -19 4077 -64 ct 4077 -263 l  4043 -263 l 
-4043 -299 l  4079 -299 l  4093 -366 l  4127 -366 l  4127 -299 l  4182 -299 l 
-4182 -263 l  4127 -263 l  4127 -74 l  4127 -60 4129 -50 4134 -44 ct 4138 -38 4146 -35 4158 -35 ct 
-4165 -35 4174 -37 4187 -39 ct 4187 -3 l  p ef
-4305 6 m  4275 6 4253 -2 4238 -18 ct 4222 -34 4215 -55 4215 -83 ct 4215 -114 4225 -138 4245 -154 ct 
-4266 -171 4298 -180 4344 -181 ct 4410 -182 l  4410 -198 l  4410 -222 4405 -240 4395 -250 ct 
-4385 -261 4369 -266 4347 -266 ct 4324 -266 4308 -262 4298 -255 ct 4288 -247 4282 -235 4280 -219 ct 
-4228 -223 l  4237 -277 4276 -304 4348 -304 ct 4385 -304 4413 -295 4432 -278 ct 
-4451 -261 4461 -236 4461 -203 ct 4461 -74 l  4461 -60 4463 -49 4466 -41 ct 4470 -34 4478 -30 4488 -30 ct 
-4493 -30 4499 -31 4505 -32 ct 4505 -1 l  4492 2 4479 3 4466 3 ct 4448 3 4435 -1 4426 -11 ct 
-4418 -21 4413 -36 4412 -57 ct 4410 -57 l  4398 -34 4383 -18 4366 -8 ct 4349 1 4329 6 4305 6 ct 
+6262 1363 m  6262 1049 l  6312 1049 l  6312 1363 l  6262 1363 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 6614 1278 m  6614 1307 6603 1331 6582 1346 ct 6561 1361 6531 1369 6492 1369 ct 
+6455 1369 6426 1363 6406 1351 ct 6386 1337 6373 1318 6367 1291 ct 6410 1282 l 
+6415 1299 6423 1312 6437 1319 ct 6450 1325 6468 1331 6492 1331 ct 6518 1331 6536 1325 6548 1319 ct 
+6560 1311 6565 1298 6565 1282 ct 6565 1269 6561 1260 6553 1252 ct 6545 1244 6532 1238 6514 1233 ct 
+6478 1223 l  6449 1215 6429 1207 6417 1200 ct 6405 1193 6396 1183 6389 1173 ct 
+6382 1162 6379 1149 6379 1133 ct 6379 1104 6388 1082 6408 1067 ct 6427 1053 6455 1044 6492 1044 ct 
+6526 1044 6552 1051 6572 1063 ct 6591 1075 6603 1095 6608 1122 ct 6564 1127 l 
+6561 1114 6554 1103 6542 1096 ct 6530 1088 6513 1084 6492 1084 ct 6470 1084 6453 1087 6443 1095 ct 
+6432 1102 6427 1113 6427 1127 ct 6427 1138 6429 1145 6433 1151 ct 6438 1157 6444 1161 6453 1165 ct 
+6462 1169 6480 1175 6508 1182 ct 6535 1189 6554 1196 6565 1201 ct 6577 1207 6586 1214 6593 1221 ct 
+6599 1228 6604 1237 6608 1246 ct 6612 1256 6614 1266 6614 1278 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 6898 1278 m  6898 1307 6887 1331 6866 1346 ct 6845 1361 6815 1369 6777 1369 ct 
+6740 1369 6710 1363 6690 1351 ct 6670 1337 6657 1318 6651 1291 ct 6694 1282 l 
+6699 1299 6707 1312 6721 1319 ct 6734 1325 6753 1331 6777 1331 ct 6802 1331 6820 1325 6832 1319 ct 
+6844 1311 6849 1298 6849 1282 ct 6849 1269 6845 1260 6837 1252 ct 6829 1244 6816 1238 6798 1233 ct 
+6763 1223 l  6733 1215 6713 1207 6701 1200 ct 6689 1193 6680 1183 6673 1173 ct 
+6666 1162 6663 1149 6663 1133 ct 6663 1104 6672 1082 6692 1067 ct 6711 1053 6740 1044 6777 1044 ct 
+6810 1044 6836 1051 6856 1063 ct 6875 1075 6887 1095 6892 1122 ct 6848 1127 l 
+6845 1114 6838 1103 6826 1096 ct 6814 1088 6797 1084 6777 1084 ct 6755 1084 6737 1087 6727 1095 ct 
+6716 1102 6711 1113 6711 1127 ct 6711 1138 6713 1145 6717 1151 ct 6722 1157 6728 1161 6737 1165 ct 
+6747 1169 6765 1175 6792 1182 ct 6819 1189 6838 1196 6849 1201 ct 6861 1207 6870 1214 6877 1221 ct 
+6883 1228 6888 1237 6892 1246 ct 6896 1256 6898 1266 6898 1278 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 6956 982 m  6956 933 l  7006 933 l  7006 982 l  6956 982 l 
 p
-4316 -31 m  4334 -31 4351 -35 4365 -44 ct 4379 -52 4390 -63 4398 -78 ct 4406 -92 4410 -107 4410 -122 ct 
-4410 -147 l  4356 -146 l  4333 -145 4315 -143 4303 -139 ct 4291 -134 4282 -127 4276 -118 ct 
-4269 -109 4266 -97 4266 -82 ct 4266 -66 4270 -53 4279 -44 ct 4288 -36 4300 -31 4316 -31 ct 
-p ef
-4543 0 m  4543 -229 l  4543 -250 4543 -273 4541 -298 ct 4588 -298 l  4590 -265 4590 -244 4590 -238 ct 
-4592 -238 l  4599 -263 4609 -281 4619 -290 ct 4629 -299 4644 -304 4662 -304 ct 
-4669 -304 4676 -303 4682 -301 ct 4682 -256 l  4676 -258 4667 -258 4656 -258 ct 
-4635 -258 4620 -250 4609 -232 ct 4598 -214 4593 -189 4593 -156 ct 4593 0 l  4543 0 l 
-p ef
-4844 -3 m  4827 2 4811 4 4793 4 ct 4754 4 4734 -19 4734 -64 ct 4734 -263 l  4700 -263 l 
-4700 -299 l  4736 -299 l  4750 -366 l  4784 -366 l  4784 -299 l  4839 -299 l 
-4839 -263 l  4784 -263 l  4784 -74 l  4784 -60 4786 -50 4791 -44 ct 4795 -38 4803 -35 4815 -35 ct 
-4822 -35 4831 -37 4844 -39 ct 4844 -3 l  p ef
-5205 6 m  5174 6 5146 0 5122 -11 ct 5098 -23 5080 -40 5067 -62 ct 5054 -84 5048 -110 5048 -141 ct 
-5048 -388 l  5100 -388 l  5100 -145 l  5100 -110 5109 -83 5127 -64 ct 5145 -46 5171 -37 5205 -37 ct 
-5240 -37 5267 -46 5286 -65 ct 5306 -84 5315 -112 5315 -149 ct 5315 -388 l  5368 -388 l 
-5368 -146 l  5368 -114 5361 -87 5348 -64 ct 5335 -42 5316 -24 5291 -12 ct 5267 0 5238 6 5205 6 ct 
+6956 1363 m  6956 1049 l  7006 1049 l  7006 1363 l  6956 1363 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 7336 1207 m  7336 1262 7325 1303 7302 1331 ct 7278 1356 7244 1369 7201 1369 ct 
+7157 1369 7124 1356 7102 1328 ct 7080 1301 7069 1260 7069 1207 ct 7069 1098 7113 1043 7202 1043 ct 
+7248 1043 7281 1057 7304 1083 ct 7325 1109 7336 1152 7336 1207 ct p
+7283 1207 m  7283 1164 7277 1132 7265 1112 ct 7252 1092 7232 1082 7203 1082 ct 
+7174 1082 7153 1093 7140 1113 ct 7127 1133 7121 1164 7121 1207 ct 7121 1248 7127 1280 7140 1301 ct 
+7153 1321 7173 1332 7200 1332 ct 7230 1332 7251 1322 7264 1302 ct 7277 1281 7283 1251 7283 1207 ct 
 p ef
-5456 0 m  5456 -389 l  5509 -389 l  5509 -43 l  5705 -43 l  5705 0 l  5456 0 l 
+gr
+gs
+0.007 0.007 0.007 c 7587 1363 m  7587 1165 l  7587 1144 7585 1128 7581 1116 ct 
+7578 1104 7571 1096 7563 1092 ct 7555 1086 7542 1083 7525 1083 ct 7501 1083 7482 1093 7468 1109 ct 
+7455 1127 7448 1152 7448 1182 ct 7448 1363 l  7398 1363 l  7398 1116 l  7398 1079 7398 1057 7396 1049 ct 
+7443 1049 l  7443 1049 7444 1053 7444 1057 ct 7444 1061 7444 1066 7445 1072 ct 
+7445 1077 7445 1087 7445 1103 ct 7446 1103 l  7458 1081 7471 1065 7486 1057 ct 
+7501 1047 7519 1043 7543 1043 ct 7575 1043 7599 1052 7614 1068 ct 7629 1086 7637 1115 7637 1155 ct 
+7637 1363 l  7587 1363 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 7935 1278 m  7935 1307 7924 1331 7903 1346 ct 7882 1361 7852 1369 7814 1369 ct 
+7777 1369 7748 1363 7728 1351 ct 7707 1337 7694 1318 7688 1291 ct 7732 1282 l 
+7737 1299 7745 1312 7759 1319 ct 7772 1325 7790 1331 7814 1331 ct 7839 1331 7857 1325 7869 1319 ct 
+7881 1311 7886 1298 7886 1282 ct 7886 1269 7882 1260 7874 1252 ct 7866 1244 7853 1238 7835 1233 ct 
+7800 1223 l  7771 1215 7751 1207 7739 1200 ct 7727 1193 7717 1183 7710 1173 ct 
+7703 1162 7700 1149 7700 1133 ct 7700 1104 7709 1082 7730 1067 ct 7749 1053 7777 1044 7814 1044 ct 
+7847 1044 7873 1051 7893 1063 ct 7912 1075 7924 1095 7929 1122 ct 7885 1127 l 
+7882 1114 7875 1103 7863 1096 ct 7851 1088 7834 1084 7814 1084 ct 7792 1084 7775 1087 7765 1095 ct 
+7754 1102 7749 1113 7749 1127 ct 7749 1138 7751 1145 7755 1151 ct 7760 1157 7766 1161 7775 1165 ct 
+7784 1169 7802 1175 7829 1182 ct 7856 1189 7875 1196 7886 1201 ct 7898 1207 7907 1214 7914 1221 ct 
+7920 1228 7925 1237 7929 1246 ct 7933 1256 7935 1266 7935 1278 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 8403 1207 m  8403 1262 8392 1303 8369 1331 ct 8345 1356 8311 1369 8268 1369 ct 
+8224 1369 8191 1356 8169 1328 ct 8147 1301 8136 1260 8136 1207 ct 8136 1098 8180 1043 8269 1043 ct 
+8315 1043 8349 1057 8371 1083 ct 8392 1109 8403 1152 8403 1207 ct p
+8351 1207 m  8351 1164 8344 1132 8332 1112 ct 8319 1092 8299 1082 8270 1082 ct 
+8241 1082 8220 1093 8207 1113 ct 8194 1133 8188 1164 8188 1207 ct 8188 1248 8194 1280 8207 1301 ct 
+8220 1321 8240 1332 8267 1332 ct 8297 1332 8318 1322 8331 1302 ct 8344 1281 8351 1251 8351 1207 ct 
 p ef
-pom
-pum
-7012 18894 t
-198 -346 m  198 -1 l  146 -1 l  146 -346 l  13 -346 l  13 -389 l  332 -389 l 
-332 -346 l  198 -346 l  p ef
-649 0 m  533 -170 l  414 0 l  356 0 l  503 -202 l  367 -389 l  425 -389 l 
-533 -236 l  638 -389 l  696 -389 l  563 -204 l  707 0 l  649 0 l  p ef
-1132 -196 m  1132 -155 1124 -119 1108 -89 ct 1093 -58 1071 -35 1042 -19 ct 1013 -2 978 6 939 6 ct 
-899 6 865 -2 836 -18 ct 807 -34 785 -58 770 -88 ct 754 -119 747 -155 747 -196 ct 
-747 -258 764 -306 798 -341 ct 832 -376 879 -394 939 -394 ct 979 -394 1013 -386 1042 -370 ct 
-1071 -355 1093 -332 1109 -302 ct 1124 -272 1132 -236 1132 -196 ct p
-1078 -196 m  1078 -244 1066 -282 1042 -310 ct 1018 -337 984 -351 939 -351 ct 
-895 -351 861 -337 836 -310 ct 812 -283 800 -245 800 -196 ct 800 -147 812 -108 837 -80 ct 
-861 -51 895 -37 939 -37 ct 984 -37 1018 -51 1042 -78 ct 1066 -106 1078 -145 1078 -196 ct 
-p ef
-1502 -271 m  1502 -234 1490 -205 1467 -184 ct 1443 -162 1410 -151 1369 -151 ct 
-1255 -151 l  1255 1 l  1202 1 l  1202 -388 l  1366 -388 l  1409 -388 1443 -378 1467 -358 ct 
-1491 -337 1502 -308 1502 -271 ct p
-1450 -271 m  1450 -321 1419 -346 1359 -346 ct 1255 -346 l  1255 -193 l  1361 -193 l 
-1420 -193 1450 -219 1450 -271 ct p ef
-1999 0 m  1942 0 l  1890 -211 l  1880 -258 l  1878 -249 1876 -237 1872 -222 ct 
-1869 -206 1850 -132 1816 0 ct 1759 0 l  1675 -299 l  1724 -299 l  1775 -96 l 
-1776 -91 1780 -73 1786 -41 ct 1791 -62 l  1853 -299 l  1907 -299 l  1959 -94 l 
-1971 -41 l  1980 -79 l  2036 -299 l  2085 -299 l  1999 0 l  p ef
-2121 -362 m  2121 -409 l  2170 -409 l  2170 -362 l  2121 -362 l  p
-2121 0 m  2121 -298 l  2170 -298 l  2170 0 l  2121 0 l  p ef
-2363 -3 m  2346 2 2330 4 2312 4 ct 2273 4 2253 -19 2253 -64 ct 2253 -263 l  2219 -263 l 
-2219 -299 l  2255 -299 l  2269 -366 l  2303 -366 l  2303 -299 l  2358 -299 l 
-2358 -263 l  2303 -263 l  2303 -74 l  2303 -60 2305 -50 2310 -44 ct 2314 -38 2322 -35 2334 -35 ct 
-2341 -35 2350 -37 2363 -39 ct 2363 -3 l  p ef
-2453 -247 m  2464 -266 2477 -281 2492 -290 ct 2507 -299 2526 -303 2549 -303 ct 
-2581 -303 2605 -295 2620 -279 ct 2635 -263 2643 -236 2643 -198 ct 2643 1 l  2593 1 l 
-2593 -189 l  2593 -210 2591 -225 2587 -235 ct 2584 -246 2577 -253 2568 -258 ct 
-2560 -263 2547 -265 2532 -265 ct 2508 -265 2490 -257 2476 -241 ct 2462 -225 2455 -203 2455 -175 ct 
-2455 1 l  2405 1 l  2405 -409 l  2455 -409 l  2455 -302 l  2455 -291 2454 -279 2454 -267 ct 
-2453 -256 2453 -249 2452 -247 ct 2453 -247 l  p ef
-3063 0 m  3063 -189 l  3063 -209 3061 -224 3057 -235 ct 3054 -246 3047 -254 3039 -258 ct 
-3031 -263 3018 -266 3002 -266 ct 2978 -266 2959 -257 2945 -241 ct 2932 -225 2925 -202 2925 -173 ct 
-2925 0 l  2875 0 l  2875 -235 l  2875 -270 2875 -291 2873 -298 ct 2920 -298 l 
-2920 -298 2921 -295 2921 -291 ct 2921 -287 2921 -282 2922 -277 ct 2922 -272 2922 -262 2922 -247 ct 
-2923 -247 l  2935 -268 2948 -283 2963 -291 ct 2978 -300 2996 -304 3019 -304 ct 
-3051 -304 3075 -296 3090 -280 ct 3105 -263 3113 -236 3113 -199 ct 3113 0 l  3063 0 l 
-p ef
-3440 -149 m  3440 -97 3429 -58 3406 -32 ct 3383 -7 3349 6 3306 6 ct 3262 6 3229 -7 3207 -34 ct 
-3185 -60 3174 -99 3174 -149 ct 3174 -252 3218 -304 3307 -304 ct 3353 -304 3386 -291 3408 -266 ct 
-3429 -241 3440 -202 3440 -149 ct p
-3388 -149 m  3388 -190 3382 -220 3370 -239 ct 3357 -258 3337 -267 3308 -267 ct 
-3279 -267 3258 -257 3245 -238 ct 3232 -219 3226 -190 3226 -149 ct 3226 -110 3232 -80 3245 -60 ct 
-3258 -41 3278 -31 3305 -31 ct 3335 -31 3356 -40 3369 -59 ct 3382 -79 3388 -108 3388 -149 ct 
-p ef
-3941 1 m  3840 -161 l  3719 -161 l  3719 1 l  3666 1 l  3666 -388 l  3849 -388 l 
-3893 -388 3926 -378 3950 -359 ct 3974 -339 3986 -312 3986 -277 ct 3986 -248 3977 -224 3961 -204 ct 
-3944 -185 3921 -172 3891 -167 ct 4001 1 l  3941 1 l  p
-3933 -277 m  3933 -299 3925 -316 3910 -328 ct 3895 -340 3872 -346 3844 -346 ct 
-3719 -346 l  3719 -203 l  3846 -203 l  3874 -203 3895 -209 3910 -222 ct 3925 -235 3933 -253 3933 -277 ct 
-p ef
-4215 -346 m  4215 -1 l  4163 -1 l  4163 -346 l  4030 -346 l  4030 -389 l 
-4349 -389 l  4349 -346 l  4215 -346 l  p ef
-4710 -107 m  4710 -71 4696 -43 4668 -24 ct 4640 -4 4601 6 4550 6 ct 4455 6 4401 -27 4386 -93 ct 
-4437 -103 l  4442 -80 4455 -62 4474 -52 ct 4493 -41 4519 -35 4552 -35 ct 4586 -35 4612 -41 4631 -53 ct 
-4649 -64 4658 -81 4658 -104 ct 4658 -117 4655 -127 4650 -135 ct 4644 -143 4636 -149 4625 -155 ct 
-4615 -160 4602 -164 4588 -168 ct 4573 -171 4557 -175 4540 -179 ct 4509 -186 4486 -192 4470 -199 ct 
-4454 -206 4441 -214 4432 -222 ct 4423 -230 4416 -240 4411 -251 ct 4406 -263 4404 -275 4404 -290 ct 
-4404 -323 4417 -349 4442 -367 ct 4467 -385 4504 -394 4551 -394 ct 4595 -394 4629 -387 4652 -374 ct 
-4676 -360 4692 -337 4701 -305 ct 4649 -296 l  4644 -316 4633 -331 4617 -340 ct 
-4601 -350 4579 -354 4551 -354 ct 4520 -354 4496 -349 4480 -339 ct 4463 -329 4455 -313 4455 -293 ct 
-4455 -281 4458 -271 4465 -263 ct 4471 -255 4480 -249 4492 -243 ct 4504 -238 4528 -231 4563 -223 ct 
-4575 -220 4587 -218 4599 -215 ct 4611 -212 4622 -209 4633 -205 ct 4644 -201 4654 -196 4663 -191 ct 
-4673 -185 4681 -179 4688 -171 ct 4695 -163 4700 -154 4704 -144 ct 4708 -133 4710 -121 4710 -107 ct 
+gr
+gs
+0.007 0.007 0.007 c 8653 1363 m  8653 1165 l  8653 1144 8651 1128 8647 1116 ct 
+8644 1104 8637 1096 8629 1092 ct 8621 1086 8608 1083 8592 1083 ct 8568 1083 8549 1093 8535 1109 ct 
+8522 1127 8515 1152 8515 1182 ct 8515 1363 l  8464 1363 l  8464 1116 l  8464 1079 8464 1057 8462 1049 ct 
+8510 1049 l  8510 1049 8511 1053 8511 1057 ct 8511 1061 8511 1066 8512 1072 ct 
+8512 1077 8512 1087 8512 1103 ct 8513 1103 l  8525 1081 8538 1065 8553 1057 ct 
+8568 1047 8586 1043 8609 1043 ct 8641 1043 8665 1052 8680 1068 ct 8695 1086 8703 1115 8703 1155 ct 
+8703 1363 l  8653 1363 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 9008 1369 m  8978 1369 8956 1361 8941 1344 ct 8925 1328 8918 1306 8918 1277 ct 
+8918 1244 8928 1219 8948 1202 ct 8969 1184 9001 1175 9047 1174 ct 9114 1173 l 
+9114 1156 l  9114 1129 9109 1111 9098 1100 ct 9088 1088 9072 1083 9050 1083 ct 
+9027 1083 9011 1087 9001 1095 ct 8991 1103 8985 1116 8983 1133 ct 8931 1128 l 
+8940 1072 8979 1043 9051 1043 ct 9088 1043 9117 1053 9136 1071 ct 9155 1088 9165 1115 9165 1151 ct 
+9165 1286 l  9165 1301 9167 1313 9170 1321 ct 9174 1328 9182 1332 9192 1332 ct 
+9197 1332 9203 1332 9209 1331 ct 9209 1362 l  9196 1365 9183 1366 9170 1366 ct 
+9152 1366 9139 1362 9130 1352 ct 9122 1341 9117 1325 9116 1304 ct 9114 1304 l 
+9101 1328 9086 1344 9069 1355 ct 9052 1364 9032 1369 9008 1369 ct p
+9019 1332 m  9037 1332 9054 1327 9068 1318 ct 9082 1309 9093 1298 9101 1282 ct 
+9110 1267 9114 1252 9114 1236 ct 9114 1209 l  9059 1211 l  9036 1212 9018 1214 9006 1218 ct 
+8994 1223 8985 1231 8979 1240 ct 8972 1249 8969 1262 8969 1278 ct 8969 1295 8973 1308 8982 1318 ct 
+8991 1325 9003 1332 9019 1332 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 9245 1364 m  9245 933 l  9296 933 l  9296 1364 l  9245 1364 l 
 p ef
-pom
+gr
 gs
-0.507 0.832 0.105 c 7320 16038 m  5720 16038 l  5720 14769 l  8920 14769 l 
-8920 16038 l  7320 16038 l  p ef
+0.007 0.007 0.007 c 9372 1364 m  9372 933 l  9423 933 l  9423 1364 l  9372 1364 l 
+p ef
 gr
 gs
-0 lw 1 lj 0.207 0.398 0.644 c 7319 16038 m  5719 16038 l  5719 14768 l 
-8919 14768 l  8919 16038 l  7319 16038 l  pc
+0.007 0.007 0.007 c 5410 2023 m  5410 1613 l  5706 1613 l  5706 1658 l  5463 1658 l 
+5463 1789 l  5689 1789 l  5689 1834 l  5463 1834 l  5463 1978 l  5717 1978 l 
+5717 2023 l  5410 2023 l  p ef
 gr
-pum
-6650 15623 t
-428 -223 m  428 -178 419 -139 402 -105 ct 384 -71 359 -45 327 -27 ct 295 -9 258 0 215 0 ct 
-52 0 l  52 -437 l  197 -437 l  271 -437 328 -419 368 -382 ct 408 -345 428 -292 428 -223 ct 
-p
-369 -223 m  369 -277 354 -319 324 -347 ct 295 -376 252 -390 195 -390 ct 111 -390 l 
-111 -47 l  209 -47 l  241 -47 269 -55 293 -69 ct 317 -83 336 -103 349 -129 ct 
-362 -156 369 -187 369 -223 ct p ef
-585 6 m  552 6 526 -3 509 -21 ct 492 -38 484 -63 484 -94 ct 484 -129 495 -155 518 -174 ct 
-541 -192 578 -202 629 -204 ct 704 -205 l  704 -223 l  704 -250 698 -270 687 -282 ct 
-675 -294 657 -299 632 -299 ct 607 -299 589 -295 578 -287 ct 566 -278 559 -265 557 -246 ct 
-499 -251 l  508 -312 553 -342 633 -342 ct 676 -342 707 -332 729 -313 ct 750 -294 761 -266 761 -229 ct 
-761 -85 l  761 -68 763 -55 767 -47 ct 771 -39 780 -35 792 -35 ct 797 -35 803 -35 810 -37 ct 
-810 -2 l  796 1 782 3 767 3 ct 746 3 731 -2 722 -13 ct 713 -24 707 -41 706 -64 ct 
-704 -64 l  690 -39 673 -21 654 -10 ct 635 1 612 6 585 6 ct p
-598 -36 m  619 -36 637 -41 653 -50 ct 669 -59 681 -72 690 -88 ct 700 -104 704 -121 704 -138 ct 
-704 -166 l  643 -165 l  617 -164 597 -161 583 -157 ct 570 -152 559 -144 552 -134 ct 
-545 -123 541 -110 541 -93 ct 541 -75 546 -61 556 -51 ct 566 -41 580 -36 598 -36 ct 
-p ef
-981 -2 m  962 3 944 5 924 5 ct 880 5 857 -20 857 -71 ct 857 -295 l  819 -295 l 
-819 -336 l  860 -336 l  876 -411 l  913 -411 l  913 -336 l  975 -336 l 
-975 -295 l  913 -295 l  913 -83 l  913 -67 916 -56 921 -49 ct 926 -43 936 -39 949 -39 ct 
-956 -39 967 -41 981 -44 ct 981 -2 l  p ef
-1114 6 m  1081 6 1055 -3 1038 -21 ct 1021 -38 1013 -63 1013 -94 ct 1013 -129 1024 -155 1047 -174 ct 
-1070 -192 1107 -202 1158 -204 ct 1233 -205 l  1233 -223 l  1233 -250 1227 -270 1216 -282 ct 
-1204 -294 1186 -299 1161 -299 ct 1136 -299 1118 -295 1107 -287 ct 1095 -278 1088 -265 1086 -246 ct 
-1028 -251 l  1037 -312 1082 -342 1162 -342 ct 1205 -342 1236 -332 1258 -313 ct 
-1279 -294 1290 -266 1290 -229 ct 1290 -85 l  1290 -68 1292 -55 1296 -47 ct 1300 -39 1309 -35 1321 -35 ct 
-1326 -35 1332 -35 1339 -37 ct 1339 -2 l  1325 1 1311 3 1296 3 ct 1275 3 1260 -2 1251 -13 ct 
-1242 -24 1236 -41 1235 -64 ct 1233 -64 l  1219 -39 1202 -21 1183 -10 ct 1164 1 1141 6 1114 6 ct 
+gs
+0.007 0.007 0.007 c 6118 2023 m  6118 1749 l  6118 1719 6119 1691 6121 1662 ct 
+6112 1697 6104 1724 6096 1743 ct 5996 2023 l  5959 2023 l  5858 1743 l  5841 1694 l 
+5832 1662 l  5833 1695 l  5834 1749 l  5834 2023 l  5787 2023 l  5787 1613 l 
+5857 1613 l  5961 1898 l  5964 1909 5968 1921 5971 1935 ct 5975 1947 5977 1957 5978 1963 ct 
+5979 1955 5983 1943 5987 1927 ct 5992 1912 5995 1902 5997 1898 ct 6098 1613 l 
+6166 1613 l  6166 2023 l  6118 2023 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 6257 2023 m  6257 1613 l  6310 1613 l  6310 1978 l  6507 1978 l 
+6507 2023 l  6257 2023 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 6875 1911 m  6875 1948 6861 1978 6833 1998 ct 6805 2019 6766 2029 6715 2029 ct 
+6619 2029 6565 1995 6550 1925 ct 6601 1915 l  6606 1939 6619 1958 6639 1968 ct 
+6658 1980 6684 1986 6717 1986 ct 6751 1986 6777 1980 6796 1967 ct 6814 1956 6823 1938 6823 1914 ct 
+6823 1900 6820 1888 6815 1880 ct 6809 1872 6801 1865 6790 1859 ct 6780 1854 6767 1849 6753 1845 ct 
+6738 1842 6722 1838 6705 1834 ct 6674 1826 6651 1820 6635 1813 ct 6618 1805 6605 1797 6596 1788 ct 
+6587 1780 6580 1769 6575 1758 ct 6570 1745 6568 1733 6568 1717 ct 6568 1682 6581 1655 6606 1636 ct 
+6632 1617 6669 1607 6716 1607 ct 6760 1607 6794 1615 6817 1628 ct 6841 1643 6857 1667 6866 1701 ct 
+6814 1711 l  6809 1689 6798 1674 6782 1664 ct 6766 1654 6744 1649 6716 1649 ct 
+6685 1649 6661 1655 6645 1665 ct 6628 1676 6619 1693 6619 1714 ct 6619 1726 6623 1737 6630 1745 ct 
+6636 1754 6645 1760 6657 1766 ct 6669 1772 6693 1779 6728 1787 ct 6740 1791 6752 1793 6764 1796 ct 
+6776 1799 6787 1802 6798 1806 ct 6809 1811 6819 1816 6828 1821 ct 6838 1827 6846 1834 6853 1842 ct 
+6860 1851 6865 1860 6869 1871 ct 6873 1882 6875 1896 6875 1911 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 7223 2024 m  7121 1854 l  7000 1854 l  7000 2024 l  6947 2024 l 
+6947 1614 l  7130 1614 l  7174 1614 7208 1624 7232 1644 ct 7256 1665 7268 1694 7268 1731 ct 
+7268 1761 7259 1786 7243 1807 ct 7226 1827 7203 1842 7172 1847 ct 7283 2024 l 
+7223 2024 l  p
+7215 1731 m  7215 1707 7207 1689 7192 1677 ct 7176 1664 7153 1658 7125 1658 ct 
+7000 1658 l  7000 1808 l  7127 1808 l  7155 1808 7176 1802 7192 1788 ct 7207 1775 7215 1756 7215 1731 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 7502 2024 m  7502 1592 l  7553 1592 l  7553 2024 l  7502 2024 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 7629 1641 m  7629 1592 l  7679 1592 l  7679 1641 l  7629 1641 l 
 p
-1127 -36 m  1148 -36 1166 -41 1182 -50 ct 1198 -59 1210 -72 1219 -88 ct 1229 -104 1233 -121 1233 -138 ct 
-1233 -166 l  1172 -165 l  1146 -164 1126 -161 1112 -157 ct 1099 -152 1088 -144 1081 -134 ct 
-1074 -123 1070 -110 1070 -93 ct 1070 -75 1075 -61 1085 -51 ct 1095 -41 1109 -36 1127 -36 ct 
+7629 2023 m  7629 1708 l  7679 1708 l  7679 2023 l  7629 2023 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 7946 2023 m  7946 1824 l  7946 1803 7944 1787 7940 1776 ct 
+7937 1764 7930 1756 7922 1751 ct 7914 1745 7901 1742 7885 1742 ct 7861 1742 7842 1752 7828 1769 ct 
+7815 1786 7808 1811 7808 1841 ct 7808 2023 l  7757 2023 l  7757 1776 l  7757 1738 7757 1716 7755 1708 ct 
+7803 1708 l  7803 1708 7804 1712 7804 1716 ct 7804 1720 7804 1725 7805 1731 ct 
+7805 1736 7805 1746 7805 1763 ct 7806 1763 l  7818 1740 7831 1724 7846 1716 ct 
+7861 1706 7879 1702 7902 1702 ct 7934 1702 7958 1711 7973 1727 ct 7988 1745 7996 1775 7996 1814 ct 
+7996 2023 l  7946 2023 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 8257 2023 m  8155 1879 l  8119 1911 l  8119 2023 l  8069 2023 l 
+8069 1592 l  8119 1592 l  8119 1861 l  8250 1708 l  8309 1708 l  8188 1843 l 
+8315 2023 l  8257 2023 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 8578 1937 m  8578 1966 8567 1989 8546 2005 ct 8525 2021 8495 2029 8457 2029 ct 
+8419 2029 8390 2023 8370 2011 ct 8350 1997 8337 1977 8331 1949 ct 8374 1941 l 
+8379 1958 8387 1971 8401 1978 ct 8414 1985 8432 1989 8457 1989 ct 8482 1989 8500 1985 8512 1978 ct 
+8524 1969 8529 1957 8529 1941 ct 8529 1928 8525 1919 8517 1911 ct 8509 1903 8496 1897 8478 1892 ct 
+8442 1882 l  8413 1874 8393 1866 8381 1859 ct 8369 1852 8360 1842 8353 1832 ct 
+8346 1821 8343 1808 8343 1793 ct 8343 1763 8352 1741 8372 1726 ct 8391 1712 8419 1703 8457 1703 ct 
+8490 1703 8516 1709 8536 1722 ct 8555 1734 8567 1754 8572 1781 ct 8528 1787 l 
+8525 1773 8518 1762 8506 1755 ct 8494 1747 8477 1743 8457 1743 ct 8434 1743 8417 1746 8407 1754 ct 
+8396 1761 8391 1772 8391 1787 ct 8391 1797 8393 1804 8397 1809 ct 8402 1816 8408 1820 8417 1824 ct 
+8426 1828 8444 1834 8472 1841 ct 8499 1848 8518 1855 8529 1860 ct 8541 1866 8550 1873 8557 1880 ct 
+8563 1887 8568 1896 8572 1905 ct 8576 1915 8578 1925 8578 1937 ct p ef
+gr
+gs
+1.000 1.000 0.843 c 19444 6096 m  16307 6096 l  16307 5106 l  22581 5106 l 
+22581 6096 l  19444 6096 l  p ef
+gr
+gs
+0.507 0.832 0.109 c 12492 6437 m  11391 6437 l  11391 5100 l  13591 5100 l 
+13591 6437 l  12492 6437 l  p ef
+gr
+gs
+0 lw 1 lj 0.210 0.398 0.644 c 12492 6436 m  11391 6436 l  11391 5099 l 
+13591 5099 l  13591 6436 l  12492 6436 l  pc
+gr
+gs
+0.007 0.007 0.007 c 12221 5999 m  12106 5809 l  11970 5809 l  11970 5999 l 
+11911 5999 l  11911 5540 l  12117 5540 l  12166 5540 12204 5552 12232 5575 ct 
+12258 5598 12272 5629 12272 5670 ct 12272 5705 12262 5735 12243 5758 ct 12224 5781 12197 5796 12164 5802 ct 
+12289 5999 l  12221 5999 l  p
+12211 5672 m  12211 5645 12203 5624 12185 5610 ct 12168 5597 12143 5589 12111 5589 ct 
+11970 5589 l  11970 5760 l  12113 5760 l  12144 5760 12169 5753 12186 5737 ct 
+12203 5721 12211 5699 12211 5672 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 12532 5590 m  12532 6000 l  12473 6000 l  12473 5590 l 
+12322 5590 l  12322 5540 l  12682 5540 l  12682 5590 l  12532 5590 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 13092 5872 m  13092 5915 13077 5948 13045 5972 ct 13014 5995 12969 6006 12911 6006 ct 
+12804 6006 12743 5967 12726 5888 ct 12783 5876 l  12790 5904 12804 5925 12825 5938 ct 
+12847 5952 12876 5958 12913 5958 ct 12952 5958 12982 5950 13003 5937 ct 13023 5923 13034 5902 13034 5875 ct 
+13034 5860 13031 5848 13024 5839 ct 13018 5829 13008 5822 12997 5816 ct 12985 5810 12971 5805 12954 5801 ct 
+12938 5797 12919 5793 12899 5787 ct 12865 5779 12838 5772 12821 5763 ct 12803 5755 12789 5746 12778 5737 ct 
+12768 5726 12760 5715 12755 5701 ct 12749 5688 12746 5673 12746 5656 ct 12746 5617 12761 5586 12789 5564 ct 
+12818 5543 12859 5533 12912 5533 ct 12963 5533 13001 5541 13027 5557 ct 13053 5573 13072 5600 13081 5639 ct 
+13024 5649 l  13017 5625 13005 5607 12987 5596 ct 12969 5585 12944 5580 12912 5580 ct 
+12877 5580 12850 5585 12832 5598 ct 12813 5610 12804 5628 12804 5653 ct 12804 5666 12808 5678 12815 5687 ct 
+12822 5697 12832 5704 12846 5712 ct 12859 5718 12886 5725 12927 5735 ct 12940 5738 12954 5741 12967 5745 ct 
+12980 5748 12993 5753 13005 5757 ct 13017 5762 13029 5767 13040 5774 ct 13050 5780 13059 5787 13067 5797 ct 
+13075 5805 13081 5817 13086 5828 ct 13090 5841 13092 5855 13092 5872 ct p ef
+gr
+gs
+0.871 0.902 0.937 c 28828 6096 m  22581 6096 l  22581 5106 l  35078 5106 l 
+35078 6096 l  28828 6096 l  p ef
+gr
+gs
+1.000 1.000 0.843 c 30098 14094 m  25112 14094 l  25112 13093 l  35084 13093 l 
+35084 14094 l  30098 14094 l  p ef
+gr
+gs
+0.933 0.933 0.933 c 4838 15868 m  4643 15868 4451 15884 4283 15915 ct 4113 15944 3973 15987 3875 16039 ct 
+3777 16090 3726 16149 3726 16210 ct 3726 16466 l  3726 16723 l  3726 17073 l 
+3726 17328 l  3726 17585 l  3726 17646 3777 17705 3875 17757 ct 3973 17809 4113 17853 4283 17882 ct 
+4451 17913 4643 17928 4838 17928 ct 5672 17927 l  6506 17927 l  7641 17927 l 
+8475 17927 l  9308 17927 l  9309 17928 l  9504 17928 9696 17913 9865 17882 ct 
+10035 17853 10176 17809 10274 17757 ct 10372 17705 10423 17646 10423 17585 ct 
+10423 17328 l  10423 17073 l  10423 16723 l  10423 16466 l  10423 16209 l 
+10423 16210 l  10423 16149 10372 16090 10274 16039 ct 10176 15987 10035 15944 9865 15915 ct 
+9696 15884 9504 15868 9309 15868 ct 8475 15868 l  7641 15868 l  6506 15868 l 
+6377 14503 l  4838 15868 l  p ef
+gr
+gs
+0 lw 1 lj 0.007 0.007 0.007 c 4837 15868 m  4642 15868 4450 15884 4281 15914 ct 
+4112 15944 3972 15986 3874 16038 ct 3776 16090 3725 16149 3725 16210 ct 3725 16466 l 
+3725 16723 l  3725 17072 l  3725 17328 l  3725 17585 l  3725 17646 3776 17705 3874 17756 ct 
+3972 17809 4112 17852 4281 17882 ct 4450 17912 4642 17928 4837 17928 ct 5671 17927 l 
+6505 17927 l  7641 17927 l  8475 17927 l  9308 17927 l  9309 17928 l  9504 17928 9696 17912 9865 17882 ct 
+10035 17852 10176 17809 10274 17756 ct 10372 17705 10423 17646 10423 17585 ct 
+10423 17328 l  10423 17072 l  10423 16723 l  10423 16466 l  10423 16209 l 
+10423 16210 l  10423 16149 10372 16090 10274 16038 ct 10176 15986 10035 15944 9865 15914 ct 
+9696 15884 9504 15868 9309 15868 ct 8475 15868 l  7641 15868 l  6505 15868 l 
+6376 14503 l  4837 15868 l  pc
+gr
+gs
+0.007 0.007 0.007 c 4599 16773 m  4599 16499 l  4599 16468 4600 16440 4602 16411 ct 
+4593 16446 4585 16474 4577 16493 ct 4477 16773 l  4440 16773 l  4340 16493 l 
+4323 16443 l  4314 16411 l  4315 16444 l  4316 16499 l  4316 16773 l  4269 16773 l 
+4269 16362 l  4339 16362 l  4442 16647 l  4446 16659 4449 16670 4452 16684 ct 
+4456 16697 4458 16706 4459 16713 ct 4460 16704 4464 16693 4469 16677 ct 4473 16661 4476 16651 4478 16647 ct 
+4579 16362 l  4647 16362 l  4647 16773 l  4599 16773 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 4807 16779 m  4777 16779 4754 16770 4739 16754 ct 4723 16736 4716 16714 4716 16684 ct 
+4716 16651 4726 16626 4746 16609 ct 4767 16591 4800 16582 4846 16581 ct 4912 16580 l 
+4912 16563 l  4912 16538 4907 16519 4897 16508 ct 4887 16497 4871 16491 4849 16491 ct 
+4826 16491 4810 16496 4800 16503 ct 4790 16511 4784 16524 4782 16541 ct 4729 16537 l 
+4738 16480 4778 16451 4850 16451 ct 4887 16451 4915 16461 4934 16479 ct 4953 16497 4963 16523 4963 16558 ct 
+4963 16694 l  4963 16708 4965 16720 4968 16728 ct 4972 16736 4980 16740 4990 16740 ct 
+4995 16740 5001 16739 5007 16738 ct 5007 16771 l  4994 16775 4981 16776 4968 16776 ct 
+4950 16776 4937 16771 4928 16761 ct 4920 16749 4915 16734 4914 16711 ct 4912 16711 l 
+4900 16736 4885 16754 4868 16764 ct 4851 16774 4831 16779 4807 16779 ct p
+4818 16739 m  4836 16739 4853 16735 4867 16725 ct 4881 16717 4892 16705 4900 16689 ct 
+4908 16675 4912 16659 4912 16643 ct 4912 16617 l  4858 16618 l  4835 16619 4817 16621 4805 16625 ct 
+4793 16630 4784 16638 4778 16647 ct 4771 16657 4767 16669 4767 16685 ct 4767 16702 4772 16716 4781 16725 ct 
+4790 16734 4802 16739 4818 16739 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 5043 16390 m  5043 16341 l  5093 16341 l  5093 16390 l 
+5043 16390 l  p
+5043 16773 m  5043 16458 l  5093 16458 l  5093 16773 l  5043 16773 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 5359 16773 m  5359 16573 l  5359 16551 5357 16536 5353 16524 ct 
+5350 16513 5343 16504 5335 16500 ct 5327 16495 5314 16491 5298 16491 ct 5274 16491 5255 16501 5241 16518 ct 
+5228 16535 5221 16559 5221 16589 ct 5221 16773 l  5171 16773 l  5171 16524 l 
+5171 16487 5171 16465 5169 16458 ct 5216 16458 l  5216 16458 5217 16461 5217 16465 ct 
+5217 16469 5217 16475 5218 16480 ct 5218 16485 5218 16496 5218 16511 ct 5219 16511 l 
+5231 16489 5244 16474 5259 16465 ct 5274 16456 5292 16451 5315 16451 ct 5347 16451 5371 16460 5387 16477 ct 
+5402 16495 5410 16523 5410 16562 ct 5410 16773 l  5359 16773 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 5949 16486 m  5949 16525 5937 16557 5914 16579 ct 5890 16602 5857 16614 5815 16614 ct 
+5701 16614 l  5701 16774 l  5648 16774 l  5648 16363 l  5812 16363 l  5856 16363 5890 16374 5914 16395 ct 
+5938 16417 5949 16447 5949 16486 ct p
+5897 16486 m  5897 16434 5866 16407 5805 16407 ct 5701 16407 l  5701 16569 l 
+5807 16569 l  5867 16569 5897 16542 5897 16486 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 6289 16773 m  6289 16583 l  6078 16583 l  6078 16773 l 
+6025 16773 l  6025 16362 l  6078 16362 l  6078 16536 l  6289 16536 l  6289 16362 l 
+6341 16362 l  6341 16773 l  6289 16773 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 6600 16603 m  6600 16773 l  6548 16773 l  6548 16603 l 
+6397 16362 l  6455 16362 l  6574 16559 l  6692 16362 l  6750 16362 l  6600 16603 l 
 p ef
-pom
+gr
 gs
-1.000 0.714 0.425 c 10469 14549 m  9420 14549 l  9420 13279 l  11519 13279 l 
-11519 14549 l  10469 14549 l  p ef
+0.007 0.007 0.007 c 6982 16614 m  6982 16655 6988 16686 7000 16706 ct 7013 16726 7032 16737 7057 16737 ct 
+7075 16737 7089 16731 7101 16721 ct 7113 16711 7120 16696 7123 16675 ct 7174 16679 l 
+7170 16708 7158 16733 7137 16750 ct 7116 16769 7090 16779 7058 16779 ct 7017 16779 6985 16765 6963 16736 ct 
+6941 16708 6930 16667 6930 16615 ct 6930 16561 6941 16521 6963 16494 ct 6985 16465 7017 16451 7058 16451 ct 
+7088 16451 7114 16460 7134 16477 ct 7155 16494 7167 16516 7172 16545 ct 7121 16549 l 
+7118 16533 7111 16518 7101 16508 ct 7091 16498 7076 16493 7056 16493 ct 7030 16493 7011 16502 6999 16520 ct 
+6988 16539 6982 16569 6982 16614 ct p ef
 gr
 gs
-0 lw 1 lj 0.207 0.398 0.644 c 10469 14548 m  9419 14548 l  9419 13278 l 
-11519 13278 l  11519 14548 l  10469 14548 l  pc
+0.007 0.007 0.007 c 7304 16779 m  7274 16779 7252 16770 7237 16754 ct 7221 16736 7214 16714 7214 16684 ct 
+7214 16651 7224 16626 7244 16609 ct 7265 16591 7297 16582 7343 16581 ct 7410 16580 l 
+7410 16563 l  7410 16538 7405 16519 7395 16508 ct 7385 16497 7368 16491 7346 16491 ct 
+7323 16491 7307 16496 7297 16503 ct 7287 16511 7281 16524 7279 16541 ct 7227 16537 l 
+7236 16480 7275 16451 7347 16451 ct 7385 16451 7413 16461 7432 16479 ct 7451 16497 7461 16523 7461 16558 ct 
+7461 16694 l  7461 16708 7463 16720 7466 16728 ct 7470 16736 7478 16740 7488 16740 ct 
+7493 16740 7499 16739 7505 16738 ct 7505 16771 l  7492 16775 7479 16776 7466 16776 ct 
+7448 16776 7435 16771 7426 16761 ct 7418 16749 7413 16734 7412 16711 ct 7410 16711 l 
+7398 16736 7383 16754 7365 16764 ct 7348 16774 7328 16779 7304 16779 ct p
+7315 16739 m  7333 16739 7350 16735 7364 16725 ct 7379 16717 7390 16705 7398 16689 ct 
+7406 16675 7410 16659 7410 16643 ct 7410 16617 l  7355 16618 l  7332 16619 7314 16621 7302 16625 ct 
+7290 16630 7281 16638 7275 16647 ct 7268 16657 7265 16669 7265 16685 ct 7265 16702 7269 16716 7278 16725 ct 
+7287 16734 7299 16739 7315 16739 ct p ef
 gr
-pum
-9939 14134 t
-362 0 m  312 -128 l  113 -128 l  63 0 l  1 0 l  180 -438 l  247 -438 l 
-422 0 l  362 0 l  p
-212 -393 m  210 -384 l  204 -367 197 -345 187 -318 ct 131 -174 l  294 -174 l 
-238 -319 l  232 -333 227 -349 221 -367 ct 212 -393 l  p ef
-508 -170 m  508 -125 515 -92 529 -70 ct 543 -49 565 -38 593 -38 ct 613 -38 629 -43 643 -54 ct 
-656 -65 664 -81 667 -104 ct 724 -100 l  719 -68 706 -42 683 -23 ct 659 -4 630 6 594 6 ct 
-548 6 512 -9 487 -39 ct 462 -68 450 -111 450 -168 ct 450 -225 462 -268 487 -297 ct 
-512 -327 548 -342 594 -342 ct 628 -342 657 -333 679 -315 ct 702 -298 716 -273 722 -242 ct 
-665 -237 l  662 -256 654 -271 643 -282 ct 631 -293 614 -298 592 -298 ct 563 -298 541 -288 528 -269 ct 
-515 -249 508 -216 508 -170 ct p ef
-994 1 m  881 -153 l  840 -119 l  840 1 l  784 1 l  784 -460 l  840 -460 l 
-840 -172 l  987 -335 l  1052 -335 l  916 -191 l  1059 1 l  994 1 l  p ef
-pom
 gs
-1 lj 11806 13349 m  15042 13349 l  ps
+0.007 0.007 0.007 c 7730 16773 m  7730 16573 l  7730 16551 7728 16536 7724 16524 ct 
+7721 16513 7714 16504 7706 16500 ct 7698 16495 7685 16491 7669 16491 ct 7645 16491 7626 16501 7612 16518 ct 
+7599 16535 7592 16559 7592 16589 ct 7592 16773 l  7542 16773 l  7542 16524 l 
+7542 16487 7542 16465 7540 16458 ct 7587 16458 l  7587 16458 7588 16461 7588 16465 ct 
+7588 16469 7588 16475 7589 16480 ct 7589 16485 7589 16496 7589 16511 ct 7590 16511 l 
+7602 16489 7615 16474 7630 16465 ct 7645 16456 7663 16451 7686 16451 ct 7718 16451 7742 16460 7757 16477 ct 
+7773 16495 7781 16523 7781 16562 ct 7781 16773 l  7730 16773 l  p ef
 gr
 gs
-11519 13349 m  11819 13449 l  11819 13249 l  11519 13349 l  p ef
+0.007 0.007 0.007 c 8236 16685 m  8236 16716 8225 16739 8203 16755 ct 8182 16770 8152 16779 8114 16779 ct 
+8077 16779 8048 16773 8028 16760 ct 8008 16746 7995 16726 7989 16699 ct 8032 16689 l 
+8037 16707 8045 16720 8059 16727 ct 8072 16735 8090 16739 8114 16739 ct 8139 16739 8157 16735 8169 16727 ct 
+8181 16719 8186 16706 8186 16689 ct 8186 16677 8182 16667 8174 16659 ct 8166 16651 8153 16645 8135 16640 ct 
+8100 16630 l  8071 16622 8051 16615 8039 16607 ct 8027 16600 8018 16590 8011 16580 ct 
+8004 16569 8001 16557 8001 16541 ct 8001 16513 8010 16490 8030 16476 ct 8049 16461 8077 16453 8114 16453 ct 
+8147 16453 8173 16459 8193 16471 ct 8213 16483 8225 16503 8230 16530 ct 8185 16536 l 
+8182 16522 8175 16511 8163 16504 ct 8151 16497 8134 16493 8114 16493 ct 8092 16493 8075 16496 8065 16503 ct 
+8054 16510 8049 16521 8049 16536 ct 8049 16545 8051 16553 8055 16558 ct 8060 16564 8066 16568 8075 16573 ct 
+8084 16577 8102 16582 8129 16589 ct 8156 16597 8175 16603 8186 16608 ct 8198 16615 8207 16621 8215 16628 ct 
+8221 16636 8226 16644 8230 16654 ct 8234 16663 8236 16674 8236 16685 ct p ef
 gr
 gs
-15329 13349 m  15029 13249 l  15029 13449 l  15329 13349 l  p ef
+0.007 0.007 0.007 c 8410 16769 m  8393 16775 8377 16777 8358 16777 ct 8319 16777 8299 16753 8299 16705 ct 
+8299 16495 l  8265 16495 l  8265 16457 l  8301 16457 l  8315 16386 l  8349 16386 l 
+8349 16457 l  8405 16457 l  8405 16495 l  8349 16495 l  8349 16695 l  8349 16709 8351 16720 8356 16726 ct 
+8360 16733 8369 16736 8381 16736 ct 8388 16736 8397 16734 8410 16731 ct 8410 16769 l 
+p ef
 gr
 gs
-0 lw 1 lj 11519 14048 m  11519 13148 l  ps
+0.007 0.007 0.007 c 8528 16779 m  8497 16779 8475 16770 8460 16754 ct 8444 16736 8437 16714 8437 16684 ct 
+8437 16651 8447 16626 8467 16609 ct 8488 16591 8520 16582 8567 16581 ct 8633 16580 l 
+8633 16563 l  8633 16538 8628 16519 8618 16508 ct 8608 16497 8592 16491 8570 16491 ct 
+8547 16491 8531 16496 8520 16503 ct 8510 16511 8504 16524 8502 16541 ct 8450 16537 l 
+8459 16480 8498 16451 8571 16451 ct 8608 16451 8636 16461 8655 16479 ct 8674 16497 8684 16523 8684 16558 ct 
+8684 16694 l  8684 16708 8686 16720 8689 16728 ct 8693 16736 8701 16740 8711 16740 ct 
+8716 16740 8722 16739 8728 16738 ct 8728 16771 l  8714 16775 8702 16776 8689 16776 ct 
+8671 16776 8658 16771 8649 16761 ct 8641 16749 8636 16734 8635 16711 ct 8633 16711 l 
+8621 16736 8606 16754 8589 16764 ct 8572 16774 8552 16779 8528 16779 ct p
+8539 16739 m  8557 16739 8574 16735 8588 16725 ct 8602 16717 8613 16705 8621 16689 ct 
+8629 16675 8633 16659 8633 16643 ct 8633 16617 l  8579 16618 l  8556 16619 8538 16621 8525 16625 ct 
+8513 16630 8504 16638 8498 16647 ct 8491 16657 8488 16669 8488 16685 ct 8488 16702 8492 16716 8501 16725 ct 
+8510 16734 8522 16739 8539 16739 ct p ef
 gr
 gs
-0 lw 1 lj 15329 14048 m  15329 13148 l  ps
+0.007 0.007 0.007 c 8765 16773 m  8765 16530 l  8765 16508 8765 16484 8763 16458 ct 
+8809 16458 l  8812 16493 8812 16515 8812 16521 ct 8813 16521 l  8820 16495 8830 16476 8840 16466 ct 
+8850 16457 8865 16451 8883 16451 ct 8890 16451 8898 16453 8904 16455 ct 8904 16502 l 
+8898 16500 8888 16500 8877 16500 ct 8856 16500 8841 16508 8830 16527 ct 8820 16546 8814 16573 8814 16607 ct 
+8814 16773 l  8765 16773 l  p ef
 gr
-pum
-12152 12456 t
-172 -2 m  153 3 135 5 115 5 ct 71 5 48 -20 48 -71 ct 48 -295 l  10 -295 l  10 -336 l 
-51 -336 l  67 -411 l  104 -411 l  104 -336 l  166 -336 l  166 -295 l  104 -295 l 
-104 -83 l  104 -67 107 -56 112 -49 ct 117 -43 127 -39 140 -39 ct 147 -39 158 -41 172 -44 ct 
-172 -2 l  p ef
-222 0 m  222 -258 l  222 -281 221 -307 220 -336 ct 273 -336 l  275 -298 275 -275 275 -267 ct 
-277 -267 l  285 -296 296 -316 307 -326 ct 319 -337 335 -342 356 -342 ct 364 -342 371 -341 379 -339 ct 
-379 -288 l  371 -290 362 -291 349 -291 ct 326 -291 308 -281 296 -261 ct 284 -241 278 -212 278 -175 ct 
-278 0 l  222 0 l  p ef
-517 6 m  484 6 458 -3 441 -21 ct 424 -38 416 -63 416 -94 ct 416 -129 427 -155 450 -174 ct 
-473 -192 510 -202 561 -204 ct 636 -205 l  636 -223 l  636 -250 630 -270 619 -282 ct 
-607 -294 589 -299 564 -299 ct 539 -299 521 -295 510 -287 ct 498 -278 491 -265 489 -246 ct 
-431 -251 l  440 -312 485 -342 565 -342 ct 608 -342 639 -332 661 -313 ct 682 -294 693 -266 693 -229 ct 
-693 -85 l  693 -68 695 -55 699 -47 ct 703 -39 712 -35 724 -35 ct 729 -35 735 -35 742 -37 ct 
-742 -2 l  728 1 714 3 699 3 ct 678 3 663 -2 654 -13 ct 645 -24 639 -41 638 -64 ct 
-636 -64 l  622 -39 605 -21 586 -10 ct 567 1 544 6 517 6 ct p
-530 -36 m  551 -36 569 -41 585 -50 ct 601 -59 613 -72 622 -88 ct 632 -104 636 -121 636 -138 ct 
-636 -166 l  575 -165 l  549 -164 529 -161 515 -157 ct 502 -152 491 -144 484 -134 ct 
-477 -123 473 -110 473 -93 ct 473 -75 478 -61 488 -51 ct 498 -41 512 -36 530 -36 ct 
-p ef
-997 0 m  997 -213 l  997 -235 995 -252 990 -264 ct 986 -277 979 -285 970 -291 ct 
-960 -296 946 -299 928 -299 ct 901 -299 880 -290 864 -271 ct 849 -253 841 -227 841 -195 ct 
-841 0 l  785 0 l  785 -264 l  785 -303 784 -327 783 -336 ct 836 -336 l  836 -335 836 -332 837 -327 ct 
-837 -323 837 -318 837 -312 ct 838 -306 838 -295 838 -278 ct 839 -278 l  852 -302 867 -318 884 -328 ct 
-901 -337 922 -342 947 -342 ct 983 -342 1010 -333 1027 -315 ct 1044 -296 1053 -266 1053 -224 ct 
-1053 0 l  997 0 l  p ef
-1387 -93 m  1387 -61 1375 -37 1351 -20 ct 1327 -3 1293 6 1250 6 ct 1209 6 1177 -1 1154 -15 ct 
-1131 -28 1117 -50 1110 -79 ct 1159 -89 l  1164 -71 1174 -57 1188 -49 ct 1203 -41 1224 -37 1250 -37 ct 
-1279 -37 1299 -41 1313 -50 ct 1326 -58 1332 -71 1332 -89 ct 1332 -102 1328 -113 1319 -121 ct 
-1310 -129 1295 -136 1275 -141 ct 1235 -152 l  1203 -160 1180 -168 1166 -176 ct 
-1153 -184 1142 -194 1134 -205 ct 1127 -217 1123 -231 1123 -247 ct 1123 -278 1134 -301 1156 -317 ct 
-1178 -333 1209 -341 1251 -341 ct 1288 -341 1317 -335 1339 -322 ct 1361 -309 1375 -288 1381 -259 ct 
-1330 -253 l  1327 -268 1319 -279 1305 -287 ct 1292 -295 1274 -299 1251 -299 ct 
-1226 -299 1207 -295 1195 -288 ct 1183 -280 1177 -268 1177 -253 ct 1177 -243 1180 -235 1185 -229 ct 
-1190 -223 1197 -218 1207 -213 ct 1216 -209 1237 -203 1268 -195 ct 1298 -188 1319 -181 1332 -175 ct 
-1345 -168 1355 -161 1363 -154 ct 1370 -146 1376 -137 1380 -127 ct 1385 -117 1387 -106 1387 -93 ct 
-p ef
-1452 -407 m  1452 -460 l  1508 -460 l  1508 -407 l  1452 -407 l  p
-1452 1 m  1452 -335 l  1508 -335 l  1508 1 l  1452 1 l  p ef
-1721 -2 m  1702 3 1684 5 1664 5 ct 1620 5 1597 -20 1597 -71 ct 1597 -295 l  1559 -295 l 
-1559 -336 l  1600 -336 l  1616 -411 l  1653 -411 l  1653 -336 l  1715 -336 l 
-1715 -295 l  1653 -295 l  1653 -83 l  1653 -67 1656 -56 1661 -49 ct 1666 -43 1676 -39 1689 -39 ct 
-1696 -39 1707 -41 1721 -44 ct 1721 -2 l  p ef
-1769 -407 m  1769 -460 l  1825 -460 l  1825 -407 l  1769 -407 l  p
-1769 1 m  1769 -335 l  1825 -335 l  1825 1 l  1769 1 l  p ef
-2193 -168 m  2193 -110 2181 -66 2155 -37 ct 2129 -8 2091 6 2042 6 ct 1993 6 1956 -9 1931 -39 ct 
-1906 -69 1894 -112 1894 -168 ct 1894 -284 1944 -342 2044 -342 ct 2095 -342 2133 -328 2157 -300 ct 
-2181 -272 2193 -228 2193 -168 ct p
-2135 -168 m  2135 -215 2128 -248 2114 -269 ct 2101 -291 2077 -301 2045 -301 ct 
-2012 -301 1989 -290 1974 -269 ct 1960 -247 1952 -214 1952 -168 ct 1952 -124 1959 -91 1974 -69 ct 
-1988 -46 2011 -35 2042 -35 ct 2075 -35 2099 -46 2113 -68 ct 2128 -89 2135 -123 2135 -168 ct 
-p ef
-2474 0 m  2474 -213 l  2474 -235 2472 -252 2467 -264 ct 2463 -277 2456 -285 2447 -291 ct 
-2437 -296 2423 -299 2405 -299 ct 2378 -299 2357 -290 2341 -271 ct 2326 -253 2318 -227 2318 -195 ct 
-2318 0 l  2262 0 l  2262 -264 l  2262 -303 2261 -327 2260 -336 ct 2313 -336 l 
-2313 -335 2313 -332 2314 -327 ct 2314 -323 2314 -318 2314 -312 ct 2315 -306 2315 -295 2315 -278 ct 
-2316 -278 l  2329 -302 2344 -318 2361 -328 ct 2378 -337 2399 -342 2424 -342 ct 
-2460 -342 2487 -333 2504 -315 ct 2521 -296 2530 -266 2530 -224 ct 2530 0 l  2474 0 l 
+gs
+0.007 0.007 0.007 c 9066 16769 m  9049 16775 9033 16777 9015 16777 ct 8976 16777 8956 16753 8956 16705 ct 
+8956 16495 l  8921 16495 l  8921 16457 l  8958 16457 l  8972 16386 l  9006 16386 l 
+9006 16457 l  9061 16457 l  9061 16495 l  9006 16495 l  9006 16695 l  9006 16709 9008 16720 9013 16726 ct 
+9017 16733 9025 16736 9037 16736 ct 9044 16736 9053 16734 9066 16731 ct 9066 16769 l 
 p ef
-pom
-pum
-12593 13167 t
-255 -53 m  244 -32 231 -16 213 -7 ct 196 2 175 7 150 7 ct 108 7 77 -7 57 -36 ct 
-37 -64 27 -108 27 -166 ct 27 -283 68 -341 150 -341 ct 175 -341 197 -337 214 -327 ct 
-231 -318 244 -303 255 -283 ct 255 -283 l  255 -321 l  255 -460 l  310 -460 l 
-310 -68 l  310 -33 311 -10 312 1 ct 259 1 l  258 -3 258 -10 257 -22 ct 256 -34 256 -45 256 -53 ct 
-255 -53 l  p
-85 -167 m  85 -120 91 -87 104 -67 ct 116 -46 136 -36 164 -36 ct 196 -36 219 -47 233 -69 ct 
-247 -91 255 -125 255 -171 ct 255 -216 247 -248 233 -269 ct 219 -290 196 -300 165 -300 ct 
-137 -300 117 -290 104 -269 ct 92 -248 85 -214 85 -167 ct p ef
-437 -156 m  437 -118 445 -88 460 -67 ct 476 -46 500 -36 530 -36 ct 554 -36 574 -41 588 -50 ct 
-603 -60 613 -72 618 -87 ct 667 -73 l  647 -20 601 6 530 6 ct 481 6 443 -9 417 -38 ct 
-391 -68 378 -112 378 -170 ct 378 -226 391 -268 417 -298 ct 443 -327 480 -342 528 -342 ct 
-627 -342 676 -283 676 -164 ct 676 -156 l  437 -156 l  p
-618 -199 m  615 -234 606 -260 591 -277 ct 576 -293 555 -301 527 -301 ct 500 -301 479 -292 463 -274 ct 
-447 -256 438 -231 437 -199 ct 618 -199 l  p ef
-746 1 m  746 -460 l  802 -460 l  802 1 l  746 1 l  p ef
-970 6 m  937 6 911 -3 894 -21 ct 877 -38 869 -63 869 -94 ct 869 -129 880 -155 903 -174 ct 
-926 -192 963 -202 1014 -204 ct 1089 -205 l  1089 -223 l  1089 -250 1083 -270 1072 -282 ct 
-1060 -294 1042 -299 1017 -299 ct 992 -299 974 -295 963 -287 ct 951 -278 944 -265 942 -246 ct 
-884 -251 l  893 -312 938 -342 1018 -342 ct 1061 -342 1092 -332 1114 -313 ct 
-1135 -294 1146 -266 1146 -229 ct 1146 -85 l  1146 -68 1148 -55 1152 -47 ct 1156 -39 1165 -35 1177 -35 ct 
-1182 -35 1188 -35 1195 -37 ct 1195 -2 l  1181 1 1167 3 1152 3 ct 1131 3 1116 -2 1107 -13 ct 
-1098 -24 1092 -41 1091 -64 ct 1089 -64 l  1075 -39 1058 -21 1039 -10 ct 1020 1 997 6 970 6 ct 
+gr
+gs
+0.007 0.007 0.007 c 9427 16779 m  9395 16779 9367 16773 9343 16761 ct 9319 16747 9301 16729 9288 16706 ct 
+9275 16683 9269 16656 9269 16623 ct 9269 16363 l  9321 16363 l  9321 16619 l 
+9321 16656 9330 16684 9348 16704 ct 9366 16723 9392 16733 9427 16733 ct 9462 16733 9489 16723 9508 16703 ct 
+9528 16683 9537 16654 9537 16615 ct 9537 16363 l  9590 16363 l  9590 16618 l 
+9590 16651 9583 16680 9570 16704 ct 9557 16727 9538 16746 9513 16760 ct 9489 16773 9460 16779 9427 16779 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 9677 16773 m  9677 16362 l  9730 16362 l  9730 16727 l 
+9927 16727 l  9927 16773 l  9677 16773 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 4903 17067 m  4903 17430 l  4851 17430 l  4851 17067 l 
+4718 17067 l  4718 17022 l  5038 17022 l  5038 17067 l  4903 17067 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 5355 17431 m  5239 17251 l  5120 17431 l  5061 17431 l 
+5209 17218 l  5072 17022 l  5131 17022 l  5239 17182 l  5344 17022 l  5402 17022 l 
+5269 17216 l  5413 17431 l  5355 17431 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 5838 17224 m  5838 17267 5830 17305 5814 17337 ct 5799 17369 5777 17394 5748 17410 ct 
+5719 17428 5684 17438 5645 17438 ct 5605 17438 5571 17428 5541 17411 ct 5512 17395 5490 17369 5475 17338 ct 
+5459 17305 5452 17267 5452 17224 ct 5452 17159 5469 17108 5503 17073 ct 5537 17036 5585 17017 5645 17017 ct 
+5685 17017 5719 17025 5748 17042 ct 5777 17058 5799 17082 5815 17114 ct 5830 17144 5838 17182 5838 17224 ct 
 p
-983 -36 m  1004 -36 1022 -41 1038 -50 ct 1054 -59 1066 -72 1075 -88 ct 1085 -104 1089 -121 1089 -138 ct 
-1089 -166 l  1028 -165 l  1002 -164 982 -161 968 -157 ct 955 -152 944 -144 937 -134 ct 
-930 -123 926 -110 926 -93 ct 926 -75 931 -61 941 -51 ct 951 -41 965 -36 983 -36 ct 
-p ef
-1253 132 m  1238 132 1225 131 1215 129 ct 1215 87 l  1223 88 1231 89 1241 89 ct 
-1276 89 1303 63 1323 12 ct 1329 -1 l  1196 -336 l  1255 -336 l  1326 -150 l 
-1327 -147 1328 -144 1330 -140 ct 1331 -135 1336 -122 1343 -99 ct 1351 -76 1356 -63 1356 -61 ct 
-1378 -122 l  1451 -336 l  1510 -336 l  1381 0 l  1367 36 1355 63 1343 80 ct 
-1331 98 1317 111 1303 119 ct 1288 128 1272 132 1253 132 ct p ef
-pom
+5784 17224 m  5784 17174 5772 17134 5748 17105 ct 5724 17077 5690 17062 5645 17062 ct 
+5601 17062 5566 17077 5541 17105 ct 5517 17133 5505 17173 5505 17224 ct 5505 17276 5517 17317 5542 17346 ct 
+5566 17377 5601 17391 5645 17391 ct 5690 17391 5724 17377 5748 17348 ct 5772 17319 5784 17278 5784 17224 ct 
+p ef
+gr
 gs
-1 lj 0.699 0.699 0.699 c 11512 14108 m  12021 13599 l  ps
-11632 14549 m  12582 13599 l  ps
-12193 14549 m  13143 13599 l  ps
-12754 14549 m  13704 13599 l  ps
-13315 14549 m  14265 13599 l  ps
-13876 14549 m  14826 13599 l  ps
-14437 14549 m  15387 13599 l  ps
-14998 14549 m  15948 13599 l  ps
-15559 14549 m  16509 13599 l  ps
-16120 14549 m  17070 13599 l  ps
-16681 14549 m  17631 13599 l  ps
-17242 14549 m  18192 13599 l  ps
-17803 14549 m  18753 13599 l  ps
-18364 14549 m  19314 13599 l  ps
-18925 14549 m  19875 13599 l  ps
-19486 14549 m  20436 13599 l  ps
-20047 14549 m  20997 13599 l  ps
-20608 14549 m  21558 13599 l  ps
-21169 14549 m  22119 13599 l  ps
-21730 14549 m  22680 13599 l  ps
-22291 14549 m  23241 13599 l  ps
-22852 14549 m  23802 13599 l  ps
-23413 14549 m  24363 13599 l  ps
-23974 14549 m  24924 13599 l  ps
-24535 14549 m  25485 13599 l  ps
-25096 14549 m  26046 13599 l  ps
-25657 14549 m  26607 13599 l  ps
-26218 14549 m  27168 13599 l  ps
-26779 14549 m  27729 13599 l  ps
-27340 14549 m  28290 13599 l  ps
-27901 14549 m  28681 13769 l  ps
-28462 14549 m  28681 14330 l  ps
-28342 13599 m  28681 13938 l  ps
-27781 13599 m  28681 14499 l  ps
-27220 13599 m  28170 14549 l  ps
-26659 13599 m  27609 14549 l  ps
-26098 13599 m  27048 14549 l  ps
-25537 13599 m  26487 14549 l  ps
-24976 13599 m  25926 14549 l  ps
-24415 13599 m  25365 14549 l  ps
-23854 13599 m  24804 14549 l  ps
-23293 13599 m  24243 14549 l  ps
-22732 13599 m  23682 14549 l  ps
-22171 13599 m  23121 14549 l  ps
-21610 13599 m  22560 14549 l  ps
-21049 13599 m  21999 14549 l  ps
-20488 13599 m  21438 14549 l  ps
-19927 13599 m  20877 14549 l  ps
-19366 13599 m  20316 14549 l  ps
-18805 13599 m  19755 14549 l  ps
-18244 13599 m  19194 14549 l  ps
-17683 13599 m  18633 14549 l  ps
-17122 13599 m  18072 14549 l  ps
-16561 13599 m  17511 14549 l  ps
-16000 13599 m  16950 14549 l  ps
-15439 13599 m  16389 14549 l  ps
-14878 13599 m  15828 14549 l  ps
-14317 13599 m  15267 14549 l  ps
-13756 13599 m  14706 14549 l  ps
-13195 13599 m  14145 14549 l  ps
-12634 13599 m  13584 14549 l  ps
-12073 13599 m  13023 14549 l  ps
-11512 13599 m  12462 14549 l  ps
-11512 14160 m  11901 14549 l  ps
+0.007 0.007 0.007 c 6208 17145 m  6208 17184 6196 17215 6173 17237 ct 6149 17260 6115 17271 6074 17271 ct 
+5960 17271 l  5960 17433 l  5907 17433 l  5907 17023 l  6071 17023 l  6114 17023 6149 17034 6173 17055 ct 
+6197 17077 6208 17107 6208 17145 ct p
+6156 17145 m  6156 17093 6124 17067 6064 17067 ct 5960 17067 l  5960 17227 l 
+6066 17227 l  6125 17227 6156 17200 6156 17145 ct p ef
 gr
 gs
-0 lw 1 lj 20096 14548 m  11512 14548 l  11512 13598 l  28681 13598 l  28681 14548 l 
-20096 14548 l  pc
+0.007 0.007 0.007 c 6704 17431 m  6647 17431 l  6595 17208 l  6585 17159 l 
+6583 17168 6581 17181 6577 17197 ct 6574 17214 6555 17291 6521 17431 ct 6464 17431 l 
+6380 17116 l  6429 17116 l  6480 17329 l  6481 17335 6485 17354 6491 17387 ct 
+6496 17365 l  6558 17116 l  6612 17116 l  6664 17331 l  6676 17387 l  6685 17347 l 
+6741 17116 l  6791 17116 l  6704 17431 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 6826 17050 m  6826 17001 l  6876 17001 l  6876 17050 l 
+6826 17050 l  p
+6826 17431 m  6826 17117 l  6876 17117 l  6876 17431 l  6826 17431 l  p ef
 gr
-pum
-18511 14294 t
-223 -389 m  223 0 l  164 0 l  164 -389 l  14 -389 l  14 -437 l  373 -437 l 
-373 -389 l  223 -389 l  p ef
-734 0 m  603 -191 l  469 0 l  403 0 l  569 -227 l  416 -438 l  481 -438 l 
-603 -266 l  721 -438 l  787 -438 l  637 -229 l  799 0 l  734 0 l  p ef
-1317 -169 m  1317 -52 1276 7 1194 7 ct 1169 7 1148 2 1131 -7 ct 1114 -16 1100 -31 1090 -51 ct 
-1089 -51 l  1089 -45 1089 -35 1088 -22 ct 1087 -9 1086 -1 1086 1 ct 1032 1 l 
-1033 -10 1034 -33 1034 -68 ct 1034 -460 l  1090 -460 l  1090 -328 l  1090 -315 1089 -299 1088 -281 ct 
-1090 -281 l  1100 -302 1114 -318 1131 -327 ct 1148 -336 1169 -341 1194 -341 ct 
-1236 -341 1268 -327 1288 -298 ct 1308 -270 1317 -227 1317 -169 ct p
-1259 -167 m  1259 -214 1253 -247 1240 -268 ct 1228 -288 1208 -298 1180 -298 ct 
-1148 -298 1126 -287 1111 -266 ct 1097 -244 1090 -210 1090 -163 ct 1090 -119 1097 -87 1111 -66 ct 
-1125 -45 1148 -34 1179 -34 ct 1207 -34 1228 -45 1240 -65 ct 1253 -86 1259 -120 1259 -167 ct 
-p ef
-1385 1 m  1385 -460 l  1441 -460 l  1441 1 l  1385 1 l  p ef
-1808 -168 m  1808 -110 1796 -66 1770 -37 ct 1744 -8 1706 6 1657 6 ct 1608 6 1571 -9 1546 -39 ct 
-1521 -69 1509 -112 1509 -168 ct 1509 -284 1559 -342 1659 -342 ct 1710 -342 1748 -328 1772 -300 ct 
-1796 -272 1808 -228 1808 -168 ct p
-1750 -168 m  1750 -215 1743 -248 1729 -269 ct 1716 -291 1692 -301 1660 -301 ct 
-1627 -301 1604 -290 1589 -269 ct 1575 -247 1567 -214 1567 -168 ct 1567 -124 1574 -91 1589 -69 ct 
-1603 -46 1626 -35 1657 -35 ct 1690 -35 1714 -46 1728 -68 ct 1743 -89 1750 -123 1750 -168 ct 
-p ef
-1918 -170 m  1918 -125 1925 -92 1939 -70 ct 1953 -49 1975 -38 2003 -38 ct 2023 -38 2039 -43 2053 -54 ct 
-2066 -65 2074 -81 2077 -104 ct 2134 -100 l  2129 -68 2116 -42 2093 -23 ct 2069 -4 2040 6 2004 6 ct 
-1958 6 1922 -9 1897 -39 ct 1872 -68 1860 -111 1860 -168 ct 1860 -225 1872 -268 1897 -297 ct 
-1922 -327 1958 -342 2004 -342 ct 2038 -342 2067 -333 2089 -315 ct 2112 -298 2126 -273 2132 -242 ct 
-2075 -237 l  2072 -256 2064 -271 2053 -282 ct 2041 -293 2024 -298 2002 -298 ct 
-1973 -298 1951 -288 1938 -269 ct 1925 -249 1918 -216 1918 -170 ct p ef
-2404 1 m  2291 -153 l  2250 -119 l  2250 1 l  2194 1 l  2194 -460 l  2250 -460 l 
-2250 -172 l  2397 -335 l  2462 -335 l  2326 -191 l  2469 1 l  2404 1 l 
-p ef
-2554 -156 m  2554 -118 2562 -88 2577 -67 ct 2593 -46 2617 -36 2647 -36 ct 2671 -36 2691 -41 2705 -50 ct 
-2720 -60 2730 -72 2735 -87 ct 2784 -73 l  2764 -20 2718 6 2647 6 ct 2598 6 2560 -9 2534 -38 ct 
-2508 -68 2495 -112 2495 -170 ct 2495 -226 2508 -268 2534 -298 ct 2560 -327 2597 -342 2645 -342 ct 
-2744 -342 2793 -283 2793 -164 ct 2793 -156 l  2554 -156 l  p
-2735 -199 m  2732 -234 2723 -260 2708 -277 ct 2693 -293 2672 -301 2644 -301 ct 
-2617 -301 2596 -292 2580 -274 ct 2564 -256 2555 -231 2554 -199 ct 2735 -199 l 
-p ef
-3074 -53 m  3063 -32 3050 -16 3032 -7 ct 3015 2 2994 7 2969 7 ct 2927 7 2896 -7 2876 -36 ct 
-2856 -64 2846 -108 2846 -166 ct 2846 -283 2887 -341 2969 -341 ct 2994 -341 3016 -337 3033 -327 ct 
-3050 -318 3063 -303 3074 -283 ct 3074 -283 l  3074 -321 l  3074 -460 l  3129 -460 l 
-3129 -68 l  3129 -33 3130 -10 3131 1 ct 3078 1 l  3077 -3 3077 -10 3076 -22 ct 
-3075 -34 3075 -45 3075 -53 ct 3074 -53 l  p
-2904 -167 m  2904 -120 2910 -87 2923 -67 ct 2935 -46 2955 -36 2983 -36 ct 3015 -36 3038 -47 3052 -69 ct 
-3066 -91 3074 -125 3074 -171 ct 3074 -216 3066 -248 3052 -269 ct 3038 -290 3015 -300 2984 -300 ct 
-2956 -300 2936 -290 2923 -269 ct 2911 -248 2904 -214 2904 -167 ct p ef
-pom
 gs
-1 lj 11806 5769 m  15042 5769 l  ps
+0.007 0.007 0.007 c 7069 17428 m  7052 17434 7036 17436 7018 17436 ct 6979 17436 6959 17411 6959 17364 ct 
+6959 17154 l  6924 17154 l  6924 17116 l  6961 17116 l  6975 17046 l  7009 17046 l 
+7009 17116 l  7064 17116 l  7064 17154 l  7009 17154 l  7009 17354 l  7009 17368 7011 17379 7016 17385 ct 
+7020 17391 7028 17395 7040 17395 ct 7047 17395 7056 17393 7069 17390 ct 7069 17428 l 
+p ef
 gr
 gs
-11519 5769 m  11819 5869 l  11819 5669 l  11519 5769 l  p ef
+0.007 0.007 0.007 c 7158 17171 m  7169 17151 7182 17136 7197 17126 ct 7212 17117 7232 17113 7255 17113 ct 
+7287 17113 7311 17121 7326 17138 ct 7341 17155 7349 17183 7349 17223 ct 7349 17433 l 
+7299 17433 l  7299 17233 l  7299 17210 7297 17195 7293 17184 ct 7290 17173 7283 17165 7274 17160 ct 
+7266 17155 7253 17153 7238 17153 ct 7213 17153 7195 17161 7181 17178 ct 7167 17195 7160 17218 7160 17247 ct 
+7160 17433 l  7110 17433 l  7110 17001 l  7160 17001 l  7160 17115 l  7160 17125 7159 17138 7159 17150 ct 
+7158 17162 7158 17169 7157 17171 ct 7158 17171 l  p ef
 gr
 gs
-15329 5769 m  15029 5669 l  15029 5869 l  15329 5769 l  p ef
+0.007 0.007 0.007 c 7769 17433 m  7769 17233 l  7769 17211 7766 17196 7762 17184 ct 
+7759 17173 7752 17164 7744 17160 ct 7736 17155 7723 17151 7707 17151 ct 7683 17151 7664 17161 7650 17178 ct 
+7637 17195 7630 17219 7630 17249 ct 7630 17433 l  7580 17433 l  7580 17184 l 
+7580 17147 7580 17125 7578 17118 ct 7625 17118 l  7625 17118 7626 17121 7626 17125 ct 
+7626 17129 7626 17135 7627 17140 ct 7627 17145 7627 17156 7627 17171 ct 7628 17171 l 
+7640 17149 7653 17134 7668 17125 ct 7683 17116 7701 17111 7724 17111 ct 7756 17111 7781 17121 7796 17137 ct 
+7811 17155 7819 17183 7819 17222 ct 7819 17433 l  7769 17433 l  p ef
 gr
 gs
-0 lw 1 lj 11519 6469 m  11519 5569 l  ps
+0.007 0.007 0.007 c 8146 17275 m  8146 17329 8135 17370 8112 17398 ct 8089 17425 8054 17439 8011 17439 ct 
+7967 17439 7934 17425 7912 17396 ct 7890 17368 7879 17327 7879 17275 ct 7879 17166 7923 17111 8012 17111 ct 
+8058 17111 8092 17125 8114 17151 ct 8135 17178 8146 17219 8146 17275 ct p
+8094 17275 m  8094 17231 8088 17200 8075 17180 ct 8062 17160 8042 17150 8013 17150 ct 
+7984 17150 7963 17161 7950 17181 ct 7937 17201 7931 17231 7931 17275 ct 7931 17316 7937 17347 7950 17368 ct 
+7963 17388 7983 17399 8010 17399 ct 8040 17399 8061 17389 8074 17369 ct 8088 17348 8094 17318 8094 17275 ct 
+p ef
 gr
 gs
-0 lw 1 lj 15329 6469 m  15329 5569 l  ps
+0.007 0.007 0.007 c 8647 17433 m  8546 17261 l  8424 17261 l  8424 17433 l 
+8371 17433 l  8371 17023 l  8555 17023 l  8599 17023 8632 17034 8656 17054 ct 
+8680 17075 8692 17102 8692 17139 ct 8692 17169 8683 17195 8667 17216 ct 8650 17236 8627 17249 8597 17255 ct 
+8707 17433 l  8647 17433 l  p
+8639 17139 m  8639 17116 8631 17099 8616 17086 ct 8601 17074 8578 17067 8550 17067 ct 
+8424 17067 l  8424 17217 l  8552 17217 l  8580 17217 8601 17210 8616 17197 ct 
+8631 17183 8639 17164 8639 17139 ct p ef
 gr
-pum
-12152 4877 t
-172 -2 m  153 3 135 5 115 5 ct 71 5 48 -20 48 -71 ct 48 -295 l  10 -295 l  10 -336 l 
-51 -336 l  67 -411 l  104 -411 l  104 -336 l  166 -336 l  166 -295 l  104 -295 l 
-104 -83 l  104 -67 107 -56 112 -49 ct 117 -43 127 -39 140 -39 ct 147 -39 158 -41 172 -44 ct 
-172 -2 l  p ef
-222 0 m  222 -258 l  222 -281 221 -307 220 -336 ct 273 -336 l  275 -298 275 -275 275 -267 ct 
-277 -267 l  285 -296 296 -316 307 -326 ct 319 -337 335 -342 356 -342 ct 364 -342 371 -341 379 -339 ct 
-379 -288 l  371 -290 362 -291 349 -291 ct 326 -291 308 -281 296 -261 ct 284 -241 278 -212 278 -175 ct 
-278 0 l  222 0 l  p ef
-517 6 m  484 6 458 -3 441 -21 ct 424 -38 416 -63 416 -94 ct 416 -129 427 -155 450 -174 ct 
-473 -192 510 -202 561 -204 ct 636 -205 l  636 -223 l  636 -250 630 -270 619 -282 ct 
-607 -294 589 -299 564 -299 ct 539 -299 521 -295 510 -287 ct 498 -278 491 -265 489 -246 ct 
-431 -251 l  440 -312 485 -342 565 -342 ct 608 -342 639 -332 661 -313 ct 682 -294 693 -266 693 -229 ct 
-693 -85 l  693 -68 695 -55 699 -47 ct 703 -39 712 -35 724 -35 ct 729 -35 735 -35 742 -37 ct 
-742 -2 l  728 1 714 3 699 3 ct 678 3 663 -2 654 -13 ct 645 -24 639 -41 638 -64 ct 
-636 -64 l  622 -39 605 -21 586 -10 ct 567 1 544 6 517 6 ct p
-530 -36 m  551 -36 569 -41 585 -50 ct 601 -59 613 -72 622 -88 ct 632 -104 636 -121 636 -138 ct 
-636 -166 l  575 -165 l  549 -164 529 -161 515 -157 ct 502 -152 491 -144 484 -134 ct 
-477 -123 473 -110 473 -93 ct 473 -75 478 -61 488 -51 ct 498 -41 512 -36 530 -36 ct 
-p ef
-997 0 m  997 -213 l  997 -235 995 -252 990 -264 ct 986 -277 979 -285 970 -291 ct 
-960 -296 946 -299 928 -299 ct 901 -299 880 -290 864 -271 ct 849 -253 841 -227 841 -195 ct 
-841 0 l  785 0 l  785 -264 l  785 -303 784 -327 783 -336 ct 836 -336 l  836 -335 836 -332 837 -327 ct 
-837 -323 837 -318 837 -312 ct 838 -306 838 -295 838 -278 ct 839 -278 l  852 -302 867 -318 884 -328 ct 
-901 -337 922 -342 947 -342 ct 983 -342 1010 -333 1027 -315 ct 1044 -296 1053 -266 1053 -224 ct 
-1053 0 l  997 0 l  p ef
-1387 -93 m  1387 -61 1375 -37 1351 -20 ct 1327 -3 1293 6 1250 6 ct 1209 6 1177 -1 1154 -15 ct 
-1131 -28 1117 -50 1110 -79 ct 1159 -89 l  1164 -71 1174 -57 1188 -49 ct 1203 -41 1224 -37 1250 -37 ct 
-1279 -37 1299 -41 1313 -50 ct 1326 -58 1332 -71 1332 -89 ct 1332 -102 1328 -113 1319 -121 ct 
-1310 -129 1295 -136 1275 -141 ct 1235 -152 l  1203 -160 1180 -168 1166 -176 ct 
-1153 -184 1142 -194 1134 -205 ct 1127 -217 1123 -231 1123 -247 ct 1123 -278 1134 -301 1156 -317 ct 
-1178 -333 1209 -341 1251 -341 ct 1288 -341 1317 -335 1339 -322 ct 1361 -309 1375 -288 1381 -259 ct 
-1330 -253 l  1327 -268 1319 -279 1305 -287 ct 1292 -295 1274 -299 1251 -299 ct 
-1226 -299 1207 -295 1195 -288 ct 1183 -280 1177 -268 1177 -253 ct 1177 -243 1180 -235 1185 -229 ct 
-1190 -223 1197 -218 1207 -213 ct 1216 -209 1237 -203 1268 -195 ct 1298 -188 1319 -181 1332 -175 ct 
-1345 -168 1355 -161 1363 -154 ct 1370 -146 1376 -137 1380 -127 ct 1385 -117 1387 -106 1387 -93 ct 
-p ef
-1452 -407 m  1452 -460 l  1508 -460 l  1508 -407 l  1452 -407 l  p
-1452 1 m  1452 -335 l  1508 -335 l  1508 1 l  1452 1 l  p ef
-1721 -2 m  1702 3 1684 5 1664 5 ct 1620 5 1597 -20 1597 -71 ct 1597 -295 l  1559 -295 l 
-1559 -336 l  1600 -336 l  1616 -411 l  1653 -411 l  1653 -336 l  1715 -336 l 
-1715 -295 l  1653 -295 l  1653 -83 l  1653 -67 1656 -56 1661 -49 ct 1666 -43 1676 -39 1689 -39 ct 
-1696 -39 1707 -41 1721 -44 ct 1721 -2 l  p ef
-1769 -407 m  1769 -460 l  1825 -460 l  1825 -407 l  1769 -407 l  p
-1769 1 m  1769 -335 l  1825 -335 l  1825 1 l  1769 1 l  p ef
-2193 -168 m  2193 -110 2181 -66 2155 -37 ct 2129 -8 2091 6 2042 6 ct 1993 6 1956 -9 1931 -39 ct 
-1906 -69 1894 -112 1894 -168 ct 1894 -284 1944 -342 2044 -342 ct 2095 -342 2133 -328 2157 -300 ct 
-2181 -272 2193 -228 2193 -168 ct p
-2135 -168 m  2135 -215 2128 -248 2114 -269 ct 2101 -291 2077 -301 2045 -301 ct 
-2012 -301 1989 -290 1974 -269 ct 1960 -247 1952 -214 1952 -168 ct 1952 -124 1959 -91 1974 -69 ct 
-1988 -46 2011 -35 2042 -35 ct 2075 -35 2099 -46 2113 -68 ct 2128 -89 2135 -123 2135 -168 ct 
-p ef
-2474 0 m  2474 -213 l  2474 -235 2472 -252 2467 -264 ct 2463 -277 2456 -285 2447 -291 ct 
-2437 -296 2423 -299 2405 -299 ct 2378 -299 2357 -290 2341 -271 ct 2326 -253 2318 -227 2318 -195 ct 
-2318 0 l  2262 0 l  2262 -264 l  2262 -303 2261 -327 2260 -336 ct 2313 -336 l 
-2313 -335 2313 -332 2314 -327 ct 2314 -323 2314 -318 2314 -312 ct 2315 -306 2315 -295 2315 -278 ct 
-2316 -278 l  2329 -302 2344 -318 2361 -328 ct 2378 -337 2399 -342 2424 -342 ct 
-2460 -342 2487 -333 2504 -315 ct 2521 -296 2530 -266 2530 -224 ct 2530 0 l  2474 0 l 
+gs
+0.007 0.007 0.007 c 8920 17067 m  8920 17430 l  8868 17430 l  8868 17067 l 
+8735 17067 l  8735 17022 l  9054 17022 l  9054 17067 l  8920 17067 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 9415 17318 m  9415 17356 9401 17385 9373 17405 ct 9345 17426 9306 17438 9255 17438 ct 
+9159 17438 9105 17402 9090 17333 ct 9141 17322 l  9146 17346 9159 17365 9178 17376 ct 
+9197 17387 9224 17394 9257 17394 ct 9291 17394 9317 17387 9336 17375 ct 9354 17363 9363 17345 9363 17321 ct 
+9363 17307 9360 17297 9355 17288 ct 9349 17280 9341 17274 9330 17267 ct 9320 17262 9307 17258 9293 17254 ct 
+9278 17250 9262 17246 9245 17242 ct 9214 17235 9190 17228 9174 17221 ct 9158 17214 9145 17205 9136 17197 ct 
+9127 17188 9120 17178 9115 17166 ct 9110 17154 9108 17141 9108 17125 ct 9108 17091 9121 17064 9146 17045 ct 
+9171 17026 9209 17017 9256 17017 ct 9300 17017 9334 17024 9357 17038 ct 9381 17053 9397 17077 9406 17109 ct 
+9354 17120 l  9349 17099 9338 17083 9322 17074 ct 9306 17063 9284 17059 9256 17059 ct 
+9225 17059 9200 17064 9184 17075 ct 9167 17085 9159 17102 9159 17122 ct 9159 17135 9162 17145 9169 17154 ct 
+9175 17162 9184 17168 9196 17175 ct 9209 17180 9233 17187 9268 17196 ct 9280 17199 9292 17201 9304 17204 ct 
+9316 17207 9327 17210 9338 17215 ct 9349 17219 9359 17224 9368 17229 ct 9378 17236 9386 17242 9393 17250 ct 
+9400 17259 9405 17268 9409 17279 ct 9413 17290 9415 17303 9415 17318 ct p ef
+gr
+gs
+0.507 0.832 0.109 c 5014 14428 m  3414 14428 l  3414 13093 l  6614 13093 l 
+6614 14428 l  5014 14428 l  p ef
+gr
+gs
+0 lw 1 lj 0.210 0.398 0.644 c 5013 14428 m  3413 14428 l  3413 13091 l 
+6613 13091 l  6613 14428 l  5013 14428 l  pc
+gr
+gs
+0.007 0.007 0.007 c 4772 13757 m  4772 13804 4763 13845 4746 13881 ct 4728 13917 4703 13944 4670 13963 ct 
+4638 13982 4601 13992 4558 13992 ct 4395 13992 l  4395 13532 l  4540 13532 l 
+4614 13532 4671 13552 4712 13590 ct 4752 13629 4772 13685 4772 13757 ct p
+4713 13757 m  4713 13701 4698 13657 4667 13627 ct 4638 13597 4595 13582 4538 13582 ct 
+4454 13582 l  4454 13942 l  4552 13942 l  4584 13942 4612 13934 4636 13919 ct 
+4660 13904 4679 13883 4693 13856 ct 4706 13827 4713 13795 4713 13757 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 4928 13998 m  4895 13998 4869 13988 4852 13969 ct 4835 13952 4827 13925 4827 13893 ct 
+4827 13856 4838 13828 4861 13808 ct 4884 13789 4921 13779 4972 13777 ct 5048 13776 l 
+5048 13757 l  5048 13729 5042 13708 5030 13695 ct 5018 13682 5000 13677 4975 13677 ct 
+4950 13677 4932 13681 4921 13689 ct 4909 13700 4902 13714 4900 13734 ct 4842 13727 l 
+4851 13663 4896 13632 4976 13632 ct 5019 13632 5051 13642 5073 13662 ct 5094 13682 5105 13713 5105 13750 ct 
+5105 13902 l  5105 13920 5107 13934 5111 13942 ct 5115 13950 5124 13955 5136 13955 ct 
+5141 13955 5147 13955 5154 13953 ct 5154 13989 l  5140 13993 5126 13995 5111 13995 ct 
+5090 13995 5075 13989 5066 13978 ct 5057 13966 5051 13948 5050 13924 ct 5048 13924 l 
+5033 13950 5016 13969 4997 13981 ct 4978 13993 4955 13998 4928 13998 ct p
+4941 13954 m  4962 13954 4980 13948 4996 13939 ct 5012 13929 5024 13916 5033 13899 ct 
+5044 13882 5048 13864 5048 13846 ct 5048 13817 l  4986 13818 l  4960 13819 4940 13822 4926 13826 ct 
+4913 13832 4902 13840 4895 13850 ct 4888 13862 4884 13876 4884 13894 ct 4884 13913 4889 13927 4899 13938 ct 
+4909 13948 4923 13954 4941 13954 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 5325 13989 m  5306 13995 5288 13997 5268 13997 ct 5223 13997 5200 13970 5200 13917 ct 
+5200 13681 l  5162 13681 l  5162 13638 l  5203 13638 l  5219 13559 l  5257 13559 l 
+5257 13638 l  5319 13638 l  5319 13681 l  5257 13681 l  5257 13904 l  5257 13921 5260 13933 5265 13940 ct 
+5270 13946 5280 13950 5293 13950 ct 5300 13950 5311 13948 5325 13945 ct 5325 13989 l 
 p ef
-pom
-pum
-12593 5587 t
-255 -53 m  244 -32 231 -16 213 -7 ct 196 2 175 7 150 7 ct 108 7 77 -7 57 -36 ct 
-37 -64 27 -108 27 -166 ct 27 -283 68 -341 150 -341 ct 175 -341 197 -337 214 -327 ct 
-231 -318 244 -303 255 -283 ct 255 -283 l  255 -321 l  255 -460 l  310 -460 l 
-310 -68 l  310 -33 311 -10 312 1 ct 259 1 l  258 -3 258 -10 257 -22 ct 256 -34 256 -45 256 -53 ct 
-255 -53 l  p
-85 -167 m  85 -120 91 -87 104 -67 ct 116 -46 136 -36 164 -36 ct 196 -36 219 -47 233 -69 ct 
-247 -91 255 -125 255 -171 ct 255 -216 247 -248 233 -269 ct 219 -290 196 -300 165 -300 ct 
-137 -300 117 -290 104 -269 ct 92 -248 85 -214 85 -167 ct p ef
-437 -156 m  437 -118 445 -88 460 -67 ct 476 -46 500 -36 530 -36 ct 554 -36 574 -41 588 -50 ct 
-603 -60 613 -72 618 -87 ct 667 -73 l  647 -20 601 6 530 6 ct 481 6 443 -9 417 -38 ct 
-391 -68 378 -112 378 -170 ct 378 -226 391 -268 417 -298 ct 443 -327 480 -342 528 -342 ct 
-627 -342 676 -283 676 -164 ct 676 -156 l  437 -156 l  p
-618 -199 m  615 -234 606 -260 591 -277 ct 576 -293 555 -301 527 -301 ct 500 -301 479 -292 463 -274 ct 
-447 -256 438 -231 437 -199 ct 618 -199 l  p ef
-746 1 m  746 -460 l  802 -460 l  802 1 l  746 1 l  p ef
-970 6 m  937 6 911 -3 894 -21 ct 877 -38 869 -63 869 -94 ct 869 -129 880 -155 903 -174 ct 
-926 -192 963 -202 1014 -204 ct 1089 -205 l  1089 -223 l  1089 -250 1083 -270 1072 -282 ct 
-1060 -294 1042 -299 1017 -299 ct 992 -299 974 -295 963 -287 ct 951 -278 944 -265 942 -246 ct 
-884 -251 l  893 -312 938 -342 1018 -342 ct 1061 -342 1092 -332 1114 -313 ct 
-1135 -294 1146 -266 1146 -229 ct 1146 -85 l  1146 -68 1148 -55 1152 -47 ct 1156 -39 1165 -35 1177 -35 ct 
-1182 -35 1188 -35 1195 -37 ct 1195 -2 l  1181 1 1167 3 1152 3 ct 1131 3 1116 -2 1107 -13 ct 
-1098 -24 1092 -41 1091 -64 ct 1089 -64 l  1075 -39 1058 -21 1039 -10 ct 1020 1 997 6 970 6 ct 
+gr
+gs
+0.007 0.007 0.007 c 5458 13998 m  5425 13998 5399 13988 5382 13969 ct 5365 13952 5356 13925 5356 13893 ct 
+5356 13856 5368 13828 5391 13808 ct 5414 13789 5451 13779 5502 13777 ct 5577 13776 l 
+5577 13757 l  5577 13729 5571 13708 5560 13695 ct 5548 13682 5530 13677 5505 13677 ct 
+5480 13677 5462 13681 5451 13689 ct 5439 13700 5432 13714 5430 13734 ct 5372 13727 l 
+5381 13663 5426 13632 5506 13632 ct 5549 13632 5580 13642 5602 13662 ct 5623 13682 5634 13713 5634 13750 ct 
+5634 13902 l  5634 13920 5636 13934 5640 13942 ct 5644 13950 5653 13955 5665 13955 ct 
+5670 13955 5676 13955 5683 13953 ct 5683 13989 l  5669 13993 5655 13995 5640 13995 ct 
+5619 13995 5604 13989 5595 13978 ct 5586 13966 5580 13948 5579 13924 ct 5577 13924 l 
+5563 13950 5546 13969 5527 13981 ct 5508 13993 5485 13998 5458 13998 ct p
+5471 13954 m  5492 13954 5510 13948 5526 13939 ct 5542 13929 5554 13916 5563 13899 ct 
+5573 13882 5577 13864 5577 13846 ct 5577 13817 l  5516 13818 l  5490 13819 5470 13822 5456 13826 ct 
+5443 13832 5432 13840 5425 13850 ct 5418 13862 5414 13876 5414 13894 ct 5414 13913 5419 13927 5429 13938 ct 
+5439 13948 5453 13954 5471 13954 ct p ef
+gr
+gs
+1.000 0.714 0.425 c 8163 12862 m  7113 12862 l  7113 11525 l  9212 11525 l 
+9212 12862 l  8163 12862 l  p ef
+gr
+gs
+0 lw 1 lj 0.210 0.398 0.644 c 8163 12860 m  7112 12860 l  7112 11524 l 
+9212 11524 l  9212 12860 l  8163 12860 l  pc
+gr
+gs
+0.007 0.007 0.007 c 7995 12426 m  7945 12292 l  7745 12292 l  7695 12426 l 
+7633 12426 l  7813 11964 l  7880 11964 l  8055 12426 l  7995 12426 l  p
+7845 12012 m  7843 12021 l  7837 12039 7830 12062 7820 12090 ct 7763 12243 l 
+7927 12243 l  7871 12089 l  7865 12075 7860 12058 7854 12039 ct 7845 12012 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 8140 12247 m  8140 12295 8147 12329 8161 12353 ct 8175 12375 8197 12386 8225 12386 ct 
+8245 12386 8261 12381 8275 12369 ct 8288 12358 8296 12341 8299 12317 ct 8357 12321 l 
+8352 12355 8339 12382 8315 12402 ct 8291 12422 8262 12433 8226 12433 ct 8180 12433 8144 12417 8119 12385 ct 
+8094 12355 8082 12309 8082 12249 ct 8082 12188 8094 12143 8119 12113 ct 8144 12081 8180 12065 8226 12065 ct 
+8260 12065 8289 12075 8311 12094 ct 8335 12112 8349 12138 8355 12170 ct 8297 12176 l 
+8294 12156 8286 12140 8275 12128 ct 8263 12117 8246 12112 8224 12112 ct 8195 12112 8173 12122 8160 12142 ct 
+8147 12163 8140 12198 8140 12247 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 8626 12427 m  8513 12264 l  8472 12300 l  8472 12427 l 
+8416 12427 l  8416 11941 l  8472 11941 l  8472 12244 l  8619 12073 l  8685 12073 l 
+8548 12224 l  8692 12427 l  8626 12427 l  p ef
+gr
+gs
+0 lw 1 lj 0.007 0.007 0.007 c 9498 11598 m  12734 11598 l  ps
+gr
+gs
+0.007 0.007 0.007 c 9211 11599 m  9512 11705 l  9512 11494 l  9211 11599 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 13022 11599 m  12721 11494 l  12721 11705 l  13022 11599 l 
+p ef
+gr
+gs
+0 lw 1 lj 0.007 0.007 0.007 c 9211 12334 m  9211 11388 l  ps
+gr
+gs
+0 lw 1 lj 0.007 0.007 0.007 c 13020 12334 m  13020 11388 l  ps
+gr
+gs
+0.007 0.007 0.007 c 10017 10659 m  9998 10664 9980 10666 9960 10666 ct 9916 10666 9892 10640 9892 10586 ct 
+9892 10352 l  9854 10352 l  9854 10308 l  9895 10308 l  9912 10228 l  9949 10228 l 
+9949 10308 l  10011 10308 l  10011 10352 l  9949 10352 l  9949 10574 l 
+9949 10590 9952 10602 9957 10609 ct 9962 10616 9972 10620 9985 10620 ct 9992 10620 10003 10618 10017 10615 ct 
+10017 10659 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 10066 10661 m  10066 10388 l  10066 10364 10065 10338 10064 10307 ct 
+10117 10307 l  10119 10347 10119 10370 10119 10379 ct 10121 10379 l  10129 10348 10140 10328 10151 10318 ct 
+10163 10306 10179 10301 10201 10301 ct 10209 10301 10216 10302 10224 10304 ct 
+10224 10357 l  10216 10355 10207 10354 10194 10354 ct 10170 10354 10152 10364 10140 10385 ct 
+10128 10406 10122 10437 10122 10476 ct 10122 10661 l  10066 10661 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 10361 10667 m  10328 10667 10302 10658 10285 10639 ct 10268 10621 10260 10595 10260 10562 ct 
+10260 10525 10271 10498 10294 10478 ct 10317 10459 10354 10448 10405 10446 ct 
+10480 10445 l  10480 10426 l  10480 10397 10474 10376 10463 10363 ct 10451 10350 10433 10346 10408 10346 ct 
+10383 10346 10365 10350 10354 10358 ct 10342 10367 10335 10381 10333 10401 ct 
+10275 10396 l  10284 10333 10329 10301 10409 10301 ct 10452 10301 10483 10312 10505 10332 ct 
+10526 10350 10537 10380 10537 10420 ct 10537 10572 l  10537 10589 10539 10603 10543 10612 ct 
+10547 10620 10556 10624 10569 10624 ct 10574 10624 10580 10624 10587 10622 ct 
+10587 10659 l  10573 10662 10558 10664 10543 10664 ct 10522 10664 10507 10659 10498 10647 ct 
+10489 10636 10483 10618 10482 10594 ct 10480 10594 l  10466 10620 10449 10639 10430 10650 ct 
+10411 10662 10388 10667 10361 10667 ct p
+10374 10623 m  10395 10623 10413 10618 10429 10608 ct 10445 10599 10457 10585 10466 10568 ct 
+10476 10552 10480 10534 10480 10516 ct 10480 10486 l  10419 10487 l  10393 10488 10373 10492 10359 10496 ct 
+10346 10501 10335 10509 10328 10520 ct 10321 10532 10317 10545 10317 10563 ct 
+10317 10582 10322 10597 10332 10607 ct 10342 10618 10356 10623 10374 10623 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 10841 10661 m  10841 10436 l  10841 10413 10839 10395 10834 10382 ct 
+10830 10369 10823 10360 10814 10354 ct 10804 10348 10790 10346 10772 10346 ct 
+10745 10346 10724 10355 10708 10375 ct 10693 10394 10685 10421 10685 10455 ct 
+10685 10661 l  10629 10661 l  10629 10382 l  10629 10342 10628 10317 10627 10307 ct 
+10680 10307 l  10680 10308 10680 10312 10681 10317 ct 10681 10321 10681 10326 10681 10333 ct 
+10682 10339 10682 10350 10682 10367 ct 10683 10367 l  10696 10342 10711 10326 10728 10316 ct 
+10745 10306 10766 10301 10791 10301 ct 10827 10301 10854 10310 10871 10329 ct 
+10888 10348 10898 10380 10898 10424 ct 10898 10661 l  10841 10661 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 11232 10563 m  11232 10597 11220 10622 11196 10640 ct 11171 10658 11137 10667 11094 10667 ct 
+11053 10667 11021 10660 10998 10645 ct 10975 10632 10961 10608 10954 10578 ct 
+11003 10567 l  11008 10586 11018 10601 11032 10609 ct 11047 10618 11068 10622 11094 10622 ct 
+11123 10622 11143 10618 11157 10608 ct 11170 10600 11176 10586 11176 10567 ct 
+11176 10554 11172 10542 11163 10534 ct 11154 10525 11139 10518 11119 10513 ct 
+11079 10501 l  11047 10493 11024 10484 11010 10476 ct 10997 10467 10986 10457 10978 10445 ct 
+10971 10433 10967 10418 10967 10401 ct 10967 10367 10978 10344 11000 10327 ct 
+11022 10310 11053 10302 11095 10302 ct 11132 10302 11161 10308 11184 10322 ct 
+11206 10336 11220 10357 11226 10388 ct 11174 10395 l  11171 10378 11163 10366 11149 10358 ct 
+11136 10350 11118 10346 11095 10346 ct 11070 10346 11051 10350 11039 10357 ct 
+11027 10365 11021 10378 11021 10395 ct 11021 10405 11024 10414 11029 10420 ct 
+11034 10426 11041 10432 11051 10437 ct 11060 10441 11081 10447 11112 10456 ct 
+11142 10463 11163 10470 11176 10477 ct 11190 10484 11200 10492 11208 10499 ct 
+11215 10507 11221 10517 11225 10527 ct 11230 10538 11232 10549 11232 10563 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 11296 10233 m  11296 10177 l  11353 10177 l  11353 10233 l 
+11296 10233 l  p
+11296 10662 m  11296 10308 l  11353 10308 l  11353 10662 l  11296 10662 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 11566 10659 m  11547 10664 11529 10666 11508 10666 ct 11464 10666 11441 10640 11441 10586 ct 
+11441 10352 l  11403 10352 l  11403 10308 l  11444 10308 l  11460 10228 l 
+11497 10228 l  11497 10308 l  11560 10308 l  11560 10352 l  11497 10352 l 
+11497 10574 l  11497 10590 11500 10602 11505 10609 ct 11510 10616 11521 10620 11534 10620 ct 
+11541 10620 11552 10618 11566 10615 ct 11566 10659 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 11613 10233 m  11613 10177 l  11670 10177 l  11670 10233 l 
+11613 10233 l  p
+11613 10662 m  11613 10308 l  11670 10308 l  11670 10662 l  11613 10662 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 12038 10484 m  12038 10545 12026 10592 12000 10622 ct 11974 10653 11936 10667 11887 10667 ct 
+11838 10667 11801 10652 11776 10620 ct 11750 10588 11738 10543 11738 10484 ct 
+11738 10361 11789 10301 11889 10301 ct 11940 10301 11978 10316 12002 10345 ct 
+12026 10374 12038 10421 12038 10484 ct p
+11980 10484 m  11980 10435 11973 10399 11959 10377 ct 11946 10354 11922 10344 11890 10344 ct 
+11857 10344 11834 10355 11819 10377 ct 11805 10400 11797 10436 11797 10484 ct 
+11797 10530 11804 10565 11819 10588 ct 11833 10613 11856 10624 11887 10624 ct 
+11920 10624 11944 10613 11958 10589 ct 11973 10567 11980 10532 11980 10484 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 12319 10661 m  12319 10436 l  12319 10413 12317 10395 12312 10382 ct 
+12308 10369 12301 10360 12292 10354 ct 12282 10348 12268 10346 12250 10346 ct 
+12222 10346 12201 10355 12185 10375 ct 12170 10394 12162 10421 12162 10455 ct 
+12162 10661 l  12106 10661 l  12106 10382 l  12106 10342 12105 10317 12104 10307 ct 
+12157 10307 l  12157 10308 12157 10312 12158 10317 ct 12158 10321 12158 10326 12158 10333 ct 
+12159 10339 12159 10350 12159 10367 ct 12160 10367 l  12173 10342 12188 10326 12205 10316 ct 
+12222 10306 12244 10301 12269 10301 ct 12305 10301 12332 10310 12349 10329 ct 
+12366 10348 12375 10380 12375 10424 ct 12375 10661 l  12319 10661 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 10541 11354 m  10530 11376 10517 11393 10499 11402 ct 10482 11412 10461 11417 10436 11417 ct 
+10394 11417 10362 11402 10342 11372 ct 10322 11342 10312 11296 10312 11235 ct 
+10312 11112 10353 11050 10436 11050 ct 10461 11050 10483 11055 10500 11065 ct 
+10517 11075 10530 11090 10541 11112 ct 10541 11072 l  10541 10924 l  10596 10924 l 
+10596 11338 l  10596 11375 10597 11399 10598 11410 ct 10545 11410 l  10544 11406 10544 11399 10543 11386 ct 
+10542 11374 10542 11362 10542 11354 ct 10541 11354 l  p
+10371 11234 m  10371 11283 10377 11318 10390 11339 ct 10402 11361 10422 11372 10450 11372 ct 
+10482 11372 10505 11360 10519 11337 ct 10533 11314 10541 11278 10541 11229 ct 
+10541 11182 10533 11148 10519 11126 ct 10505 11104 10482 11094 10451 11094 ct 
+10423 11094 10403 11104 10390 11126 ct 10378 11148 10371 11184 10371 11234 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 10722 11245 m  10722 11285 10730 11317 10745 11339 ct 10761 11361 10785 11372 10815 11372 ct 
+10839 11372 10860 11366 10874 11357 ct 10889 11346 10899 11334 10904 11318 ct 
+10953 11333 l  10933 11388 10887 11416 10815 11416 ct 10766 11416 10728 11400 10702 11369 ct 
+10676 11338 10663 11292 10663 11230 ct 10663 11172 10676 11126 10702 11095 ct 
+10728 11064 10765 11048 10813 11048 ct 10913 11048 10962 11110 10962 11237 ct 
+10962 11245 l  10722 11245 l  p
+10904 11200 m  10901 11163 10892 11135 10877 11117 ct 10862 11100 10840 11092 10812 11092 ct 
+10785 11092 10764 11101 10748 11120 ct 10732 11139 10723 11166 10722 11200 ct 
+10904 11200 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 11031 11410 m  11031 10924 l  11088 10924 l  11088 11410 l 
+11031 11410 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 11256 11416 m  11223 11416 11196 11406 11179 11387 ct 11162 11369 11154 11343 11154 11310 ct 
+11154 11274 11165 11246 11188 11226 ct 11211 11207 11249 11197 11300 11195 ct 
+11375 11194 l  11375 11175 l  11375 11146 11369 11124 11358 11112 ct 11346 11099 11328 11094 11303 11094 ct 
+11278 11094 11260 11098 11249 11106 ct 11237 11116 11230 11129 11228 11150 ct 
+11169 11145 l  11178 11080 11224 11048 11304 11048 ct 11347 11048 11378 11059 11400 11079 ct 
+11421 11099 11432 11128 11432 11168 ct 11432 11320 l  11432 11338 11434 11352 11438 11360 ct 
+11442 11368 11451 11373 11463 11373 ct 11468 11373 11474 11373 11481 11370 ct 
+11481 11407 l  11467 11410 11453 11413 11438 11413 ct 11417 11413 11402 11407 11393 11396 ct 
+11384 11384 11378 11366 11377 11342 ct 11375 11342 l  11361 11368 11344 11387 11325 11399 ct 
+11306 11410 11283 11416 11256 11416 ct p
+11269 11372 m  11290 11372 11308 11366 11324 11357 ct 11340 11347 11352 11334 11361 11317 ct 
+11371 11300 11375 11282 11375 11264 ct 11375 11235 l  11314 11236 l  11288 11237 11268 11240 11254 11244 ct 
+11241 11249 11230 11258 11223 11268 ct 11216 11280 11211 11294 11211 11312 ct 
+11211 11330 11217 11345 11227 11356 ct 11237 11366 11251 11372 11269 11372 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 11538 11547 m  11523 11547 11510 11546 11500 11544 ct 11500 11500 l 
+11508 11501 11516 11502 11526 11502 ct 11561 11502 11588 11476 11608 11422 ct 
+11614 11408 l  11481 11055 l  11540 11055 l  11611 11252 l  11612 11255 11613 11258 11615 11262 ct 
+11616 11267 11621 11281 11628 11305 ct 11636 11329 11641 11343 11641 11345 ct 
+11663 11281 l  11736 11055 l  11796 11055 l  11666 11409 l  11652 11447 11640 11476 11628 11493 ct 
+11616 11512 11602 11525 11588 11534 ct 11573 11543 11557 11547 11538 11547 ct 
+p ef
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 9204 12398 m  9714 11862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 9324 12862 m  10275 11862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 9885 12862 m  10836 11862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 10446 12862 m  11397 11862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 11007 12862 m  11958 11862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 11568 12862 m  12519 11862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 12129 12862 m  13079 11862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 12690 12862 m  13640 11862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 13250 12862 m  14201 11862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 13811 12862 m  14762 11862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 14372 12862 m  15323 11862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 14933 12862 m  15884 11862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 15494 12862 m  16445 11862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 16055 12862 m  17006 11862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 16616 12862 m  17566 11862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 17177 12862 m  18127 11862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 17737 12862 m  18688 11862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 18298 12862 m  19249 11862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 18859 12862 m  19810 11862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 19420 12862 m  20371 11862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 19981 12862 m  20932 11862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 20542 12862 m  21493 11862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 21103 12862 m  22053 11862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 21664 12862 m  22614 11862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 22224 12862 m  23175 11862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 22785 12862 m  23736 11862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 23346 12862 m  24297 11862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 23907 12862 m  24858 11862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 24468 12862 m  25419 11862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 25029 12862 m  25980 11862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 25590 12862 m  26370 12040 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 26150 12862 m  26370 12630 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 26030 11862 m  26370 12219 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 25470 11862 m  26370 12809 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 24909 11862 m  25860 12862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 24348 11862 m  25299 12862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 23787 11862 m  24738 12862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 23226 11862 m  24177 12862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 22665 11862 m  23616 12862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 22104 11862 m  23055 12862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 21544 11862 m  22494 12862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 20983 11862 m  21933 12862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 20422 11862 m  21373 12862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 19861 11862 m  20812 12862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 19300 11862 m  20251 12862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 18739 11862 m  19690 12862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 18178 11862 m  19129 12862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 17617 11862 m  18568 12862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 17057 11862 m  18007 12862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 16496 11862 m  17446 12862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 15935 11862 m  16886 12862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 15374 11862 m  16325 12862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 14813 11862 m  15764 12862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 14252 11862 m  15203 12862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 13691 11862 m  14642 12862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 13130 11862 m  14081 12862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 12570 11862 m  13520 12862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 12009 11862 m  12959 12862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 11448 11862 m  12399 12862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 10887 11862 m  11838 12862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 10326 11862 m  11277 12862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 9765 11862 m  10716 12862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 9204 11862 m  10155 12862 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 9204 12452 m  9594 12862 l  ps
+gr
+gs
+0 lw 1 lj 0.007 0.007 0.007 c 17786 12860 m  9204 12860 l  9204 11860 l  26370 11860 l 
+26370 12860 l  17786 12860 l  pc
+gr
+gs
+0.007 0.007 0.007 c 16426 12185 m  16426 12594 l  16367 12594 l  16367 12185 l 
+16216 12185 l  16216 12134 l  16576 12134 l  16576 12185 l  16426 12185 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 16937 12594 m  16806 12394 l  16671 12594 l  16605 12594 l 
+16771 12356 l  16618 12133 l  16683 12133 l  16806 12315 l  16924 12133 l 
+16990 12133 l  16840 12354 l  17002 12594 l  16937 12594 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 17520 12416 m  17520 12540 17479 12602 17396 12602 ct 17371 12602 17350 12597 17333 12587 ct 
+17316 12578 17302 12562 17292 12541 ct 17291 12541 l  17291 12547 17291 12558 17290 12572 ct 
+17289 12585 17288 12594 17288 12596 ct 17234 12596 l  17235 12584 17236 12560 17236 12523 ct 
+17236 12109 l  17292 12109 l  17292 12248 l  17292 12262 17291 12279 17290 12298 ct 
+17292 12298 l  17302 12276 17316 12259 17333 12249 ct 17350 12240 17371 12235 17396 12235 ct 
+17438 12235 17471 12249 17491 12280 ct 17511 12309 17520 12355 17520 12416 ct 
 p
-983 -36 m  1004 -36 1022 -41 1038 -50 ct 1054 -59 1066 -72 1075 -88 ct 1085 -104 1089 -121 1089 -138 ct 
-1089 -166 l  1028 -165 l  1002 -164 982 -161 968 -157 ct 955 -152 944 -144 937 -134 ct 
-930 -123 926 -110 926 -93 ct 926 -75 931 -61 941 -51 ct 951 -41 965 -36 983 -36 ct 
-p ef
-1253 132 m  1238 132 1225 131 1215 129 ct 1215 87 l  1223 88 1231 89 1241 89 ct 
-1276 89 1303 63 1323 12 ct 1329 -1 l  1196 -336 l  1255 -336 l  1326 -150 l 
-1327 -147 1328 -144 1330 -140 ct 1331 -135 1336 -122 1343 -99 ct 1351 -76 1356 -63 1356 -61 ct 
-1378 -122 l  1451 -336 l  1510 -336 l  1381 0 l  1367 36 1355 63 1343 80 ct 
-1331 98 1317 111 1303 119 ct 1288 128 1272 132 1253 132 ct p ef
-pom
+17461 12418 m  17461 12368 17455 12334 17442 12312 ct 17430 12290 17410 12280 17382 12280 ct 
+17350 12280 17328 12292 17313 12314 ct 17299 12337 17292 12373 17292 12422 ct 
+17292 12468 17299 12502 17313 12525 ct 17327 12547 17350 12559 17381 12559 ct 
+17409 12559 17430 12547 17442 12526 ct 17455 12503 17461 12467 17461 12418 ct 
+p ef
+gr
 gs
-1 lj 0.699 0.699 0.699 c 8920 6528 m  9429 6019 l  ps
-9040 6969 m  9990 6019 l  ps
-9601 6969 m  10551 6019 l  ps
-10162 6969 m  11112 6019 l  ps
-10723 6969 m  11673 6019 l  ps
-11284 6969 m  12234 6019 l  ps
-11845 6969 m  12795 6019 l  ps
-12406 6969 m  13356 6019 l  ps
-12967 6969 m  13917 6019 l  ps
-13528 6969 m  14478 6019 l  ps
-14089 6969 m  15039 6019 l  ps
-14650 6969 m  15329 6290 l  ps
-15211 6969 m  15329 6851 l  ps
-15091 6019 m  15329 6257 l  ps
-14530 6019 m  15329 6818 l  ps
-13969 6019 m  14919 6969 l  ps
-13408 6019 m  14358 6969 l  ps
-12847 6019 m  13797 6969 l  ps
-12286 6019 m  13236 6969 l  ps
-11725 6019 m  12675 6969 l  ps
-11164 6019 m  12114 6969 l  ps
-10603 6019 m  11553 6969 l  ps
-10042 6019 m  10992 6969 l  ps
-9481 6019 m  10431 6969 l  ps
-8920 6019 m  9870 6969 l  ps
-8920 6580 m  9309 6969 l  ps
+0.007 0.007 0.007 c 17586 12596 m  17586 12109 l  17643 12109 l  17643 12596 l 
+17586 12596 l  p ef
 gr
 gs
-0 lw 1 lj 12124 6969 m  8919 6969 l  8919 6019 l  15329 6019 l  15329 6969 l 
-12124 6969 l  pc
+0.007 0.007 0.007 c 18010 12418 m  18010 12479 17998 12525 17972 12556 ct 17946 12586 17908 12600 17859 12600 ct 
+17810 12600 17773 12585 17748 12554 ct 17722 12522 17710 12477 17710 12418 ct 
+17710 12296 17761 12234 17861 12234 ct 17912 12234 17950 12249 17974 12279 ct 
+17998 12308 18010 12355 18010 12418 ct p
+17952 12418 m  17952 12368 17945 12334 17931 12312 ct 17918 12288 17894 12278 17862 12278 ct 
+17829 12278 17806 12289 17791 12312 ct 17777 12335 17769 12369 17769 12418 ct 
+17769 12464 17776 12499 17791 12522 ct 17805 12546 17828 12558 17859 12558 ct 
+17892 12558 17916 12546 17930 12523 ct 17945 12501 17952 12465 17952 12418 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 18119 12416 m  18119 12463 18126 12498 18140 12521 ct 18154 12543 18177 12555 18205 12555 ct 
+18225 12555 18241 12549 18255 12538 ct 18268 12526 18276 12509 18279 12485 ct 
+18336 12489 l  18331 12523 18318 12550 18295 12570 ct 18271 12590 18242 12600 18206 12600 ct 
+18160 12600 18123 12585 18098 12554 ct 18073 12523 18061 12478 18061 12418 ct 
+18061 12358 18073 12313 18098 12282 ct 18123 12250 18160 12234 18206 12234 ct 
+18240 12234 18269 12244 18291 12263 ct 18314 12281 18328 12307 18334 12340 ct 
+18277 12345 l  18274 12325 18266 12309 18255 12298 ct 18243 12286 18226 12281 18204 12281 ct 
+18175 12281 18152 12292 18139 12312 ct 18126 12333 18119 12367 18119 12416 ct 
+p ef
 gr
-pum
-10538 6714 t
-223 -389 m  223 0 l  164 0 l  164 -389 l  14 -389 l  14 -437 l  373 -437 l 
-373 -389 l  223 -389 l  p ef
-734 0 m  603 -191 l  469 0 l  403 0 l  569 -227 l  416 -438 l  481 -438 l 
-603 -266 l  721 -438 l  787 -438 l  637 -229 l  799 0 l  734 0 l  p ef
-1317 -169 m  1317 -52 1276 7 1194 7 ct 1169 7 1148 2 1131 -7 ct 1114 -16 1100 -31 1090 -51 ct 
-1089 -51 l  1089 -45 1089 -35 1088 -22 ct 1087 -9 1086 -1 1086 1 ct 1032 1 l 
-1033 -10 1034 -33 1034 -68 ct 1034 -460 l  1090 -460 l  1090 -328 l  1090 -315 1089 -299 1088 -281 ct 
-1090 -281 l  1100 -302 1114 -318 1131 -327 ct 1148 -336 1169 -341 1194 -341 ct 
-1236 -341 1268 -327 1288 -298 ct 1308 -270 1317 -227 1317 -169 ct p
-1259 -167 m  1259 -214 1253 -247 1240 -268 ct 1228 -288 1208 -298 1180 -298 ct 
-1148 -298 1126 -287 1111 -266 ct 1097 -244 1090 -210 1090 -163 ct 1090 -119 1097 -87 1111 -66 ct 
-1125 -45 1148 -34 1179 -34 ct 1207 -34 1228 -45 1240 -65 ct 1253 -86 1259 -120 1259 -167 ct 
-p ef
-1385 1 m  1385 -460 l  1441 -460 l  1441 1 l  1385 1 l  p ef
-1808 -168 m  1808 -110 1796 -66 1770 -37 ct 1744 -8 1706 6 1657 6 ct 1608 6 1571 -9 1546 -39 ct 
-1521 -69 1509 -112 1509 -168 ct 1509 -284 1559 -342 1659 -342 ct 1710 -342 1748 -328 1772 -300 ct 
-1796 -272 1808 -228 1808 -168 ct p
-1750 -168 m  1750 -215 1743 -248 1729 -269 ct 1716 -291 1692 -301 1660 -301 ct 
-1627 -301 1604 -290 1589 -269 ct 1575 -247 1567 -214 1567 -168 ct 1567 -124 1574 -91 1589 -69 ct 
-1603 -46 1626 -35 1657 -35 ct 1690 -35 1714 -46 1728 -68 ct 1743 -89 1750 -123 1750 -168 ct 
-p ef
-1918 -170 m  1918 -125 1925 -92 1939 -70 ct 1953 -49 1975 -38 2003 -38 ct 2023 -38 2039 -43 2053 -54 ct 
-2066 -65 2074 -81 2077 -104 ct 2134 -100 l  2129 -68 2116 -42 2093 -23 ct 2069 -4 2040 6 2004 6 ct 
-1958 6 1922 -9 1897 -39 ct 1872 -68 1860 -111 1860 -168 ct 1860 -225 1872 -268 1897 -297 ct 
-1922 -327 1958 -342 2004 -342 ct 2038 -342 2067 -333 2089 -315 ct 2112 -298 2126 -273 2132 -242 ct 
-2075 -237 l  2072 -256 2064 -271 2053 -282 ct 2041 -293 2024 -298 2002 -298 ct 
-1973 -298 1951 -288 1938 -269 ct 1925 -249 1918 -216 1918 -170 ct p ef
-2404 1 m  2291 -153 l  2250 -119 l  2250 1 l  2194 1 l  2194 -460 l  2250 -460 l 
-2250 -172 l  2397 -335 l  2462 -335 l  2326 -191 l  2469 1 l  2404 1 l 
-p ef
-2554 -156 m  2554 -118 2562 -88 2577 -67 ct 2593 -46 2617 -36 2647 -36 ct 2671 -36 2691 -41 2705 -50 ct 
-2720 -60 2730 -72 2735 -87 ct 2784 -73 l  2764 -20 2718 6 2647 6 ct 2598 6 2560 -9 2534 -38 ct 
-2508 -68 2495 -112 2495 -170 ct 2495 -226 2508 -268 2534 -298 ct 2560 -327 2597 -342 2645 -342 ct 
-2744 -342 2793 -283 2793 -164 ct 2793 -156 l  2554 -156 l  p
-2735 -199 m  2732 -234 2723 -260 2708 -277 ct 2693 -293 2672 -301 2644 -301 ct 
-2617 -301 2596 -292 2580 -274 ct 2564 -256 2555 -231 2554 -199 ct 2735 -199 l 
-p ef
-3074 -53 m  3063 -32 3050 -16 3032 -7 ct 3015 2 2994 7 2969 7 ct 2927 7 2896 -7 2876 -36 ct 
-2856 -64 2846 -108 2846 -166 ct 2846 -283 2887 -341 2969 -341 ct 2994 -341 3016 -337 3033 -327 ct 
-3050 -318 3063 -303 3074 -283 ct 3074 -283 l  3074 -321 l  3074 -460 l  3129 -460 l 
-3129 -68 l  3129 -33 3130 -10 3131 1 ct 3078 1 l  3077 -3 3077 -10 3076 -22 ct 
-3075 -34 3075 -45 3075 -53 ct 3074 -53 l  p
-2904 -167 m  2904 -120 2910 -87 2923 -67 ct 2935 -46 2955 -36 2983 -36 ct 3015 -36 3038 -47 3052 -69 ct 
-3066 -91 3074 -125 3074 -171 ct 3074 -216 3066 -248 3052 -269 ct 3038 -290 3015 -300 2984 -300 ct 
-2956 -300 2936 -290 2923 -269 ct 2911 -248 2904 -214 2904 -167 ct p ef
-pom
 gs
-1.000 0.714 0.425 c 17499 6939 m  16399 6939 l  16399 5669 l  18599 5669 l 
-18599 6939 l  17499 6939 l  p ef
+0.007 0.007 0.007 c 18606 12596 m  18492 12434 l  18451 12469 l  18451 12596 l 
+18395 12596 l  18395 12109 l  18451 12109 l  18451 12414 l  18599 12241 l 
+18664 12241 l  18528 12394 l  18671 12596 l  18606 12596 l  p ef
 gr
 gs
-0 lw 1 lj 0.207 0.398 0.644 c 17499 6939 m  16399 6939 l  16399 5669 l 
-18599 5669 l  18599 6939 l  17499 6939 l  pc
+0.007 0.007 0.007 c 18755 12430 m  18755 12470 18763 12502 18778 12524 ct 18794 12546 18818 12557 18848 12557 ct 
+18873 12557 18893 12552 18907 12542 ct 18922 12532 18932 12519 18937 12503 ct 
+18986 12518 l  18966 12574 18920 12600 18848 12600 ct 18799 12600 18761 12585 18735 12555 ct 
+18709 12523 18696 12477 18696 12416 ct 18696 12357 18709 12313 18735 12281 ct 
+18761 12250 18798 12234 18846 12234 ct 18946 12234 18995 12297 18995 12422 ct 
+18995 12430 l  18755 12430 l  p
+18937 12385 m  18934 12348 18925 12321 18910 12303 ct 18895 12286 18874 12278 18845 12278 ct 
+18818 12278 18797 12287 18781 12306 ct 18765 12325 18756 12352 18755 12385 ct 
+18937 12385 l  p ef
 gr
-pum
-16863 6524 t
-246 -396 m  197 -396 160 -380 133 -349 ct 106 -318 92 -275 92 -221 ct 92 -167 106 -124 134 -92 ct 
-162 -59 200 -43 248 -43 ct 309 -43 355 -73 386 -134 ct 434 -109 l  416 -72 391 -43 359 -23 ct 
-326 -4 288 6 245 6 ct 201 6 163 -3 131 -21 ct 99 -40 74 -66 58 -100 ct 41 -134 32 -174 32 -221 ct 
-32 -291 51 -345 89 -385 ct 126 -424 178 -444 245 -444 ct 291 -444 330 -435 362 -417 ct 
-393 -398 416 -371 430 -336 ct 374 -317 l  364 -343 348 -362 325 -375 ct 303 -389 276 -396 246 -396 ct 
-p ef
-680 -389 m  680 0 l  621 0 l  621 -389 l  471 -389 l  471 -437 l  830 -437 l 
-830 -389 l  680 -389 l  p ef
-1241 -121 m  1241 -81 1226 -49 1194 -27 ct 1163 -5 1118 6 1061 6 ct 954 6 893 -31 876 -105 ct 
-933 -117 l  940 -90 954 -71 975 -59 ct 997 -46 1026 -40 1063 -40 ct 1101 -40 1131 -47 1152 -60 ct 
-1172 -73 1183 -92 1183 -118 ct 1183 -132 1180 -144 1173 -153 ct 1167 -161 1157 -169 1146 -175 ct 
-1134 -180 1120 -185 1103 -189 ct 1087 -193 1069 -197 1049 -202 ct 1015 -210 988 -217 971 -225 ct 
-953 -233 939 -241 928 -250 ct 918 -260 910 -271 905 -284 ct 899 -296 896 -311 896 -327 ct 
-896 -364 911 -393 939 -414 ct 968 -434 1009 -444 1062 -444 ct 1112 -444 1150 -436 1176 -421 ct 
-1202 -406 1221 -380 1231 -343 ct 1173 -333 l  1166 -356 1154 -373 1136 -384 ct 
-1118 -394 1093 -399 1062 -399 ct 1027 -399 1000 -394 982 -382 ct 963 -370 954 -353 954 -330 ct 
-954 -317 958 -306 965 -297 ct 972 -288 982 -281 996 -274 ct 1009 -268 1036 -261 1076 -252 ct 
-1089 -249 1103 -246 1116 -242 ct 1129 -239 1142 -235 1154 -231 ct 1166 -226 1178 -221 1189 -215 ct 
-1199 -209 1208 -202 1216 -193 ct 1224 -185 1230 -174 1235 -163 ct 1239 -151 1241 -137 1241 -121 ct 
+gs
+0.007 0.007 0.007 c 19276 12539 m  19265 12561 19252 12578 19234 12587 ct 19217 12597 19196 12602 19171 12602 ct 
+19128 12602 19097 12587 19077 12557 ct 19057 12527 19047 12480 19047 12419 ct 
+19047 12296 19088 12235 19171 12235 ct 19196 12235 19218 12239 19235 12249 ct 
+19252 12259 19265 12275 19276 12296 ct 19276 12256 l  19276 12109 l  19331 12109 l 
+19331 12523 l  19331 12560 19332 12584 19333 12596 ct 19280 12596 l  19279 12592 19279 12584 19278 12572 ct 
+19277 12559 19277 12547 19277 12539 ct 19276 12539 l  p
+19105 12418 m  19105 12467 19111 12502 19124 12524 ct 19136 12546 19156 12557 19185 12557 ct 
+19217 12557 19240 12545 19254 12522 ct 19268 12498 19276 12462 19276 12414 ct 
+19276 12366 19268 12333 19254 12310 ct 19240 12288 19217 12278 19186 12278 ct 
+19157 12278 19137 12288 19124 12310 ct 19112 12333 19105 12368 19105 12418 ct 
 p ef
-pom
+gr
 gs
-0.507 0.832 0.105 c 20699 8439 m  19099 8439 l  19099 7169 l  22299 7169 l 
-22299 8439 l  20699 8439 l  p ef
+0 lw 1 lj 0.007 0.007 0.007 c 9498 3627 m  12734 3627 l  ps
 gr
 gs
-0 lw 1 lj 0.207 0.398 0.644 c 20698 8439 m  19098 8439 l  19098 7169 l 
-22298 7169 l  22298 8439 l  20698 8439 l  pc
+0.007 0.007 0.007 c 9211 3627 m  9512 3734 l  9512 3523 l  9211 3627 l  p ef
 gr
-pum
-20029 8024 t
-428 -223 m  428 -178 419 -139 402 -105 ct 384 -71 359 -45 327 -27 ct 295 -9 258 0 215 0 ct 
-52 0 l  52 -437 l  197 -437 l  271 -437 328 -419 368 -382 ct 408 -345 428 -292 428 -223 ct 
+gs
+0.007 0.007 0.007 c 13022 3627 m  12721 3523 l  12721 3734 l  13022 3627 l 
+p ef
+gr
+gs
+0 lw 1 lj 0.007 0.007 0.007 c 9211 4364 m  9211 3417 l  ps
+gr
+gs
+0 lw 1 lj 0.007 0.007 0.007 c 13020 4364 m  13020 3417 l  ps
+gr
+gs
+0.007 0.007 0.007 c 10017 2688 m  9998 2694 9980 2696 9960 2696 ct 9916 2696 9892 2669 9892 2616 ct 
+9892 2380 l  9854 2380 l  9854 2337 l  9895 2337 l  9912 2258 l  9949 2258 l 
+9949 2337 l  10011 2337 l  10011 2380 l  9949 2380 l  9949 2603 l  9949 2620 9952 2632 9957 2639 ct 
+9962 2645 9972 2649 9985 2649 ct 9992 2649 10003 2647 10017 2644 ct 10017 2688 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 10066 2691 m  10066 2420 l  10066 2396 10065 2368 10064 2338 ct 
+10117 2338 l  10119 2378 10119 2402 10119 2411 ct 10121 2411 l  10129 2380 10140 2359 10151 2348 ct 
+10163 2337 10179 2331 10201 2331 ct 10209 2331 10216 2332 10224 2335 ct 10224 2388 l 
+10216 2386 10207 2385 10194 2385 ct 10170 2385 10152 2396 10140 2417 ct 10128 2438 10122 2467 10122 2506 ct 
+10122 2691 l  10066 2691 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 10361 2697 m  10328 2697 10302 2687 10285 2668 ct 10268 2651 10260 2624 10260 2592 ct 
+10260 2555 10271 2527 10294 2507 ct 10317 2488 10354 2478 10405 2477 ct 10480 2475 l 
+10480 2456 l  10480 2428 10474 2407 10463 2395 ct 10451 2382 10433 2377 10408 2377 ct 
+10383 2377 10365 2381 10354 2389 ct 10342 2399 10335 2413 10333 2433 ct 10275 2427 l 
+10284 2362 10329 2331 10409 2331 ct 10452 2331 10483 2341 10505 2361 ct 10526 2382 10537 2412 10537 2449 ct 
+10537 2601 l  10537 2619 10539 2633 10543 2641 ct 10547 2649 10556 2654 10569 2654 ct 
+10574 2654 10580 2654 10587 2652 ct 10587 2688 l  10573 2692 10558 2694 10543 2694 ct 
+10522 2694 10507 2688 10498 2677 ct 10489 2665 10483 2647 10482 2623 ct 10480 2623 l 
+10466 2649 10449 2668 10430 2680 ct 10411 2692 10388 2697 10361 2697 ct p
+10374 2653 m  10395 2653 10413 2647 10429 2638 ct 10445 2628 10457 2615 10466 2598 ct 
+10476 2581 10480 2563 10480 2545 ct 10480 2516 l  10419 2517 l  10393 2518 10373 2521 10359 2525 ct 
+10346 2531 10335 2539 10328 2549 ct 10321 2561 10317 2575 10317 2593 ct 10317 2612 10322 2626 10332 2637 ct 
+10342 2647 10356 2653 10374 2653 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 10841 2691 m  10841 2467 l  10841 2444 10839 2426 10834 2414 ct 
+10830 2400 10823 2392 10814 2385 ct 10804 2380 10790 2377 10772 2377 ct 10745 2377 10724 2386 10708 2406 ct 
+10693 2425 10685 2453 10685 2485 ct 10685 2691 l  10629 2691 l  10629 2414 l 
+10629 2373 10628 2347 10627 2338 ct 10680 2338 l  10680 2339 10680 2342 10681 2347 ct 
+10681 2352 10681 2357 10681 2363 ct 10682 2369 10682 2381 10682 2399 ct 10683 2399 l 
+10696 2374 10711 2357 10728 2346 ct 10745 2337 10766 2331 10791 2331 ct 10827 2331 10854 2341 10871 2360 ct 
+10888 2380 10898 2412 10898 2456 ct 10898 2691 l  10841 2691 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 11232 2593 m  11232 2626 11220 2652 11196 2669 ct 11171 2687 11137 2697 11094 2697 ct 
+11053 2697 11021 2689 10998 2675 ct 10975 2661 10961 2638 10954 2607 ct 11003 2597 l 
+11008 2616 11018 2631 11032 2639 ct 11047 2647 11068 2652 11094 2652 ct 11123 2652 11143 2647 11157 2638 ct 
+11170 2629 11176 2616 11176 2597 ct 11176 2583 11172 2572 11163 2563 ct 11154 2555 11139 2547 11119 2542 ct 
+11079 2531 l  11047 2522 11024 2514 11010 2505 ct 10997 2497 10986 2486 10978 2475 ct 
+10971 2462 10967 2448 10967 2432 ct 10967 2399 10978 2375 11000 2357 ct 11022 2340 11053 2332 11095 2332 ct 
+11132 2332 11161 2338 11184 2352 ct 11206 2365 11220 2388 11226 2419 ct 11174 2425 l 
+11171 2409 11163 2398 11149 2389 ct 11136 2381 11118 2377 11095 2377 ct 11070 2377 11051 2381 11039 2388 ct 
+11027 2397 11021 2409 11021 2425 ct 11021 2436 11024 2444 11029 2449 ct 11034 2456 11041 2461 11051 2467 ct 
+11060 2471 11081 2477 11112 2485 ct 11142 2493 11163 2500 11176 2506 ct 11190 2514 11200 2521 11208 2528 ct 
+11215 2537 11221 2546 11225 2557 ct 11230 2567 11232 2579 11232 2593 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 11296 2262 m  11296 2206 l  11353 2206 l  11353 2262 l 
+11296 2262 l  p
+11296 2692 m  11296 2338 l  11353 2338 l  11353 2692 l  11296 2692 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 11566 2688 m  11547 2694 11529 2696 11508 2696 ct 11464 2696 11441 2669 11441 2616 ct 
+11441 2380 l  11403 2380 l  11403 2337 l  11444 2337 l  11460 2258 l  11497 2258 l 
+11497 2337 l  11560 2337 l  11560 2380 l  11497 2380 l  11497 2603 l  11497 2620 11500 2632 11505 2639 ct 
+11510 2645 11521 2649 11534 2649 ct 11541 2649 11552 2647 11566 2644 ct 11566 2688 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 11613 2262 m  11613 2206 l  11670 2206 l  11670 2262 l 
+11613 2262 l  p
+11613 2692 m  11613 2338 l  11670 2338 l  11670 2692 l  11613 2692 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 12038 2514 m  12038 2575 12026 2621 12000 2652 ct 11974 2682 11936 2697 11887 2697 ct 
+11838 2697 11801 2681 11776 2649 ct 11750 2618 11738 2573 11738 2514 ct 11738 2393 11789 2331 11889 2331 ct 
+11940 2331 11978 2345 12002 2376 ct 12026 2405 12038 2452 12038 2514 ct p
+11980 2514 m  11980 2464 11973 2431 11959 2408 ct 11946 2385 11922 2374 11890 2374 ct 
+11857 2374 11834 2386 11819 2408 ct 11805 2432 11797 2465 11797 2514 ct 11797 2560 11804 2595 11819 2618 ct 
+11833 2642 11856 2654 11887 2654 ct 11920 2654 11944 2642 11958 2619 ct 11973 2597 11980 2561 11980 2514 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 12319 2691 m  12319 2467 l  12319 2444 12317 2426 12312 2414 ct 
+12308 2400 12301 2392 12292 2385 ct 12282 2380 12268 2377 12250 2377 ct 12222 2377 12201 2386 12185 2406 ct 
+12170 2425 12162 2453 12162 2485 ct 12162 2691 l  12106 2691 l  12106 2414 l 
+12106 2373 12105 2347 12104 2338 ct 12157 2338 l  12157 2339 12157 2342 12158 2347 ct 
+12158 2352 12158 2357 12158 2363 ct 12159 2369 12159 2381 12159 2399 ct 12160 2399 l 
+12173 2374 12188 2357 12205 2346 ct 12222 2337 12244 2331 12269 2331 ct 12305 2331 12332 2341 12349 2360 ct 
+12366 2380 12375 2412 12375 2456 ct 12375 2691 l  12319 2691 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 10541 3382 m  10530 3404 10517 3421 10499 3431 ct 10482 3440 10461 3445 10436 3445 ct 
+10394 3445 10362 3431 10342 3400 ct 10322 3371 10312 3324 10312 3263 ct 10312 3139 10353 3078 10436 3078 ct 
+10461 3078 10483 3082 10500 3093 ct 10517 3102 10530 3118 10541 3139 ct 10541 3099 l 
+10541 2953 l  10596 2953 l  10596 3366 l  10596 3403 10597 3427 10598 3439 ct 
+10545 3439 l  10544 3435 10544 3427 10543 3415 ct 10542 3402 10542 3391 10542 3382 ct 
+10541 3382 l  p
+10371 3262 m  10371 3312 10377 3346 10390 3367 ct 10402 3389 10422 3400 10450 3400 ct 
+10482 3400 10505 3388 10519 3365 ct 10533 3342 10541 3306 10541 3258 ct 10541 3211 10533 3176 10519 3154 ct 
+10505 3132 10482 3121 10451 3121 ct 10423 3121 10403 3132 10390 3154 ct 10378 3176 10371 3213 10371 3262 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 10722 3274 m  10722 3314 10730 3345 10745 3367 ct 10761 3389 10785 3400 10815 3400 ct 
+10839 3400 10860 3395 10874 3385 ct 10889 3375 10899 3362 10904 3346 ct 10953 3361 l 
+10933 3417 10887 3444 10815 3444 ct 10766 3444 10728 3428 10702 3398 ct 10676 3366 10663 3320 10663 3259 ct 
+10663 3200 10676 3156 10702 3124 ct 10728 3093 10765 3077 10813 3077 ct 10913 3077 10962 3140 10962 3265 ct 
+10962 3274 l  10722 3274 l  p
+10904 3228 m  10901 3192 10892 3164 10877 3146 ct 10862 3129 10840 3121 10812 3121 ct 
+10785 3121 10764 3131 10748 3149 ct 10732 3168 10723 3195 10722 3228 ct 10904 3228 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 11031 3439 m  11031 2953 l  11088 2953 l  11088 3439 l 
+11031 3439 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 11256 3444 m  11223 3444 11196 3435 11179 3416 ct 11162 3398 11154 3372 11154 3339 ct 
+11154 3302 11165 3275 11188 3255 ct 11211 3236 11249 3225 11300 3223 ct 11375 3222 l 
+11375 3203 l  11375 3175 11369 3154 11358 3141 ct 11346 3128 11328 3123 11303 3123 ct 
+11278 3123 11260 3127 11249 3136 ct 11237 3145 11230 3159 11228 3179 ct 11169 3174 l 
+11178 3109 11224 3077 11304 3077 ct 11347 3077 11378 3087 11400 3108 ct 11421 3128 11432 3158 11432 3197 ct 
+11432 3348 l  11432 3366 11434 3380 11438 3388 ct 11442 3397 11451 3401 11463 3401 ct 
+11468 3401 11474 3401 11481 3399 ct 11481 3436 l  11467 3439 11453 3441 11438 3441 ct 
+11417 3441 11402 3436 11393 3424 ct 11384 3413 11378 3395 11377 3371 ct 11375 3371 l 
+11361 3397 11344 3416 11325 3427 ct 11306 3439 11283 3444 11256 3444 ct p
+11269 3400 m  11290 3400 11308 3395 11324 3385 ct 11340 3376 11352 3362 11361 3345 ct 
+11371 3328 11375 3311 11375 3293 ct 11375 3263 l  11314 3264 l  11288 3265 11268 3268 11254 3273 ct 
+11241 3278 11230 3286 11223 3297 ct 11216 3308 11211 3322 11211 3340 ct 11211 3359 11217 3374 11227 3384 ct 
+11237 3395 11251 3400 11269 3400 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 11538 3577 m  11523 3577 11510 3576 11500 3574 ct 11500 3529 l 
+11508 3531 11516 3532 11526 3532 ct 11561 3532 11588 3504 11608 3451 ct 11614 3437 l 
+11481 3083 l  11540 3083 l  11611 3280 l  11612 3283 11613 3286 11615 3291 ct 
+11616 3296 11621 3309 11628 3334 ct 11636 3358 11641 3372 11641 3374 ct 11663 3309 l 
+11736 3083 l  11796 3083 l  11666 3438 l  11652 3476 11640 3504 11628 3522 ct 
+11616 3541 11602 3555 11588 3563 ct 11573 3573 11557 3577 11538 3577 ct p ef
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 6613 4427 m  7123 3890 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 6733 4890 m  7684 3890 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 7294 4890 m  8245 3890 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 7855 4890 m  8805 3890 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 8416 4890 m  9366 3890 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 8976 4890 m  9927 3890 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 9537 4890 m  10488 3890 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 10098 4890 m  11049 3890 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 10659 4890 m  11610 3890 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 11220 4890 m  12171 3890 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 11781 4890 m  12732 3890 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 12342 4890 m  13021 4175 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 12903 4890 m  13021 4765 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 12783 3890 m  13021 4142 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 12222 3890 m  13021 4731 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 11661 3890 m  12612 4890 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 11100 3890 m  12051 4890 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 10539 3890 m  11490 4890 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 9978 3890 m  10929 4890 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 9417 3890 m  10368 4890 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 8856 3890 m  9807 4890 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 8296 3890 m  9246 4890 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 7735 3890 m  8686 4890 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 7174 3890 m  8125 4890 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 6613 3890 m  7564 4890 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 6613 4481 m  7003 4890 l  ps
+gr
+gs
+0 lw 1 lj 0.007 0.007 0.007 c 9817 4890 m  6612 4890 l  6612 3890 l  13021 3890 l 
+13021 4890 l  9817 4890 l  pc
+gr
+gs
+0.007 0.007 0.007 c 8455 4213 m  8455 4623 l  8395 4623 l  8395 4213 l  8245 4213 l 
+8245 4162 l  8605 4162 l  8605 4213 l  8455 4213 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 8965 4623 m  8833 4422 l  8700 4623 l  8634 4623 l  8800 4384 l 
+8647 4161 l  8712 4161 l  8833 4342 l  8952 4161 l  9018 4161 l  8867 4382 l 
+9030 4623 l  8965 4623 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 9548 4445 m  9548 4568 9506 4631 9424 4631 ct 9399 4631 9378 4625 9361 4616 ct 
+9344 4606 9330 4591 9320 4569 ct 9319 4569 l  9319 4576 9319 4586 9318 4600 ct 
+9317 4614 9316 4622 9316 4624 ct 9262 4624 l  9263 4613 9264 4588 9264 4552 ct 
+9264 4138 l  9320 4138 l  9320 4278 l  9320 4292 9319 4308 9318 4327 ct 9320 4327 l 
+9330 4305 9344 4288 9361 4279 ct 9378 4269 9399 4264 9424 4264 ct 9466 4264 9498 4279 9519 4309 ct 
+9539 4339 9548 4384 9548 4445 ct p
+9489 4447 m  9489 4398 9483 4363 9470 4341 ct 9458 4320 9438 4309 9410 4309 ct 
+9378 4309 9356 4321 9341 4343 ct 9327 4366 9320 4402 9320 4452 ct 9320 4498 9327 4532 9341 4554 ct 
+9355 4576 9378 4587 9409 4587 ct 9437 4587 9458 4576 9470 4555 ct 9483 4533 9489 4497 9489 4447 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 9615 4624 m  9615 4138 l  9672 4138 l  9672 4624 l  9615 4624 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 10039 4445 m  10039 4506 10027 4553 10001 4584 ct 9974 4615 9936 4629 9887 4629 ct 
+9838 4629 9801 4614 9776 4582 ct 9751 4549 9739 4504 9739 4445 ct 9739 4323 9789 4262 9889 4262 ct 
+9940 4262 9978 4277 10003 4306 ct 10027 4336 10039 4382 10039 4445 ct p
+9980 4445 m  9980 4396 9973 4361 9959 4339 ct 9946 4316 9922 4305 9890 4305 ct 
+9857 4305 9834 4317 9819 4339 ct 9805 4362 9797 4397 9797 4445 ct 9797 4492 9804 4526 9819 4549 ct 
+9833 4575 9856 4586 9887 4586 ct 9920 4586 9944 4575 9958 4551 ct 9973 4528 9980 4493 9980 4445 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 10148 4443 m  10148 4491 10155 4525 10169 4548 ct 10183 4572 10205 4583 10233 4583 ct 
+10254 4583 10270 4578 10284 4565 ct 10297 4554 10305 4537 10308 4513 ct 10365 4517 l 
+10360 4551 10347 4579 10324 4599 ct 10300 4619 10271 4629 10234 4629 ct 10188 4629 10152 4614 10127 4582 ct 
+10102 4551 10090 4505 10090 4445 ct 10090 4385 10102 4340 10127 4309 ct 10152 4278 10188 4262 10234 4262 ct 
+10269 4262 10298 4272 10320 4291 ct 10343 4308 10357 4335 10363 4367 ct 10306 4373 l 
+10303 4353 10295 4337 10284 4325 ct 10272 4314 10255 4308 10232 4308 ct 10203 4308 10181 4319 10168 4339 ct 
+10155 4360 10148 4395 10148 4443 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 10635 4624 m  10521 4461 l  10480 4497 l  10480 4624 l 
+10424 4624 l  10424 4138 l  10480 4138 l  10480 4441 l  10628 4269 l  10693 4269 l 
+10557 4421 l  10700 4624 l  10635 4624 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 10784 4458 m  10784 4498 10792 4529 10807 4552 ct 10823 4575 10848 4585 10878 4585 ct 
+10902 4585 10922 4580 10936 4571 ct 10951 4559 10961 4546 10966 4531 ct 11015 4545 l 
+10995 4602 10949 4629 10878 4629 ct 10828 4629 10790 4614 10764 4583 ct 10738 4551 10725 4504 10725 4443 ct 
+10725 4384 10738 4340 10764 4308 ct 10790 4278 10827 4262 10876 4262 ct 10975 4262 11024 4324 11024 4449 ct 
+11024 4458 l  10784 4458 l  p
+10966 4413 m  10963 4376 10954 4348 10939 4331 ct 10924 4314 10903 4305 10875 4305 ct 
+10848 4305 10826 4315 10810 4334 ct 10794 4353 10785 4379 10784 4413 ct 10966 4413 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 11305 4567 m  11294 4589 11281 4606 11263 4616 ct 11246 4625 11225 4631 11199 4631 ct 
+11157 4631 11126 4616 11106 4585 ct 11086 4556 11076 4509 11076 4448 ct 11076 4325 11117 4264 11199 4264 ct 
+11225 4264 11247 4268 11264 4279 ct 11281 4288 11294 4304 11305 4325 ct 11305 4285 l 
+11305 4138 l  11360 4138 l  11360 4552 l  11360 4588 11361 4613 11362 4624 ct 
+11309 4624 l  11308 4620 11308 4613 11307 4600 ct 11306 4587 11306 4576 11306 4567 ct 
+11305 4567 l  p
+11134 4447 m  11134 4497 11140 4532 11153 4553 ct 11165 4575 11185 4585 11213 4585 ct 
+11246 4585 11269 4574 11283 4551 ct 11297 4527 11305 4492 11305 4443 ct 11305 4396 11297 4362 11283 4340 ct 
+11269 4318 11246 4307 11214 4307 ct 11186 4307 11166 4318 11153 4340 ct 11141 4362 11134 4398 11134 4447 ct 
+p ef
+gr
+gs
+1.000 0.714 0.425 c 15191 4859 m  14090 4859 l  14090 3523 l  16291 3523 l 
+16291 4859 l  15191 4859 l  p ef
+gr
+gs
+0 lw 1 lj 0.210 0.398 0.644 c 15191 4858 m  14090 4858 l  14090 3523 l 
+16291 3523 l  16291 4858 l  15191 4858 l  pc
+gr
+gs
+0.007 0.007 0.007 c 14801 4005 m  14752 4005 14715 4023 14688 4056 ct 14661 4088 14647 4134 14647 4191 ct 
+14647 4247 14661 4293 14689 4326 ct 14717 4361 14755 4378 14803 4378 ct 14864 4378 14910 4346 14941 4282 ct 
+14989 4308 l  14971 4347 14946 4378 14914 4399 ct 14881 4419 14843 4429 14800 4429 ct 
+14756 4429 14718 4420 14686 4401 ct 14654 4381 14628 4354 14612 4318 ct 14595 4282 14586 4240 14586 4191 ct 
+14586 4117 14605 4060 14644 4017 ct 14681 3976 14733 3955 14800 3955 ct 14846 3955 14885 3964 14917 3983 ct 
+14948 4003 14971 4033 14985 4069 ct 14929 4089 l  14919 4062 14903 4042 14880 4028 ct 
+14858 4013 14831 4005 14801 4005 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 15235 4013 m  15235 4423 l  15175 4423 l  15175 4013 l 
+15025 4013 l  15025 3962 l  15385 3962 l  15385 4013 l  15235 4013 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 15796 4296 m  15796 4338 15781 4372 15749 4395 ct 15718 4418 15673 4429 15616 4429 ct 
+15509 4429 15447 4391 15430 4313 ct 15488 4300 l  15495 4328 15509 4348 15530 4361 ct 
+15552 4375 15581 4381 15618 4381 ct 15656 4381 15686 4374 15707 4360 ct 15727 4346 15738 4326 15738 4299 ct 
+15738 4284 15735 4272 15728 4262 ct 15722 4254 15712 4245 15701 4239 ct 15689 4234 15675 4228 15658 4224 ct 
+15642 4220 15624 4216 15604 4211 ct 15570 4202 15543 4195 15526 4186 ct 15508 4178 15494 4169 15483 4160 ct 
+15473 4149 15464 4138 15459 4124 ct 15453 4112 15450 4096 15450 4079 ct 15450 4040 15465 4008 15494 3986 ct 
+15523 3965 15564 3955 15617 3955 ct 15667 3955 15705 3963 15731 3979 ct 15757 3995 15776 4023 15786 4062 ct 
+15728 4073 l  15721 4048 15709 4031 15691 4019 ct 15673 4007 15648 4002 15617 4002 ct 
+15582 4002 15555 4007 15537 4021 ct 15518 4034 15509 4052 15509 4076 ct 15509 4089 15513 4101 15520 4111 ct 
+15527 4120 15537 4127 15551 4135 ct 15564 4141 15591 4148 15631 4158 ct 15644 4161 15658 4164 15671 4168 ct 
+15684 4172 15697 4176 15709 4180 ct 15721 4185 15733 4191 15744 4197 ct 15754 4203 15763 4211 15771 4220 ct 
+15779 4228 15785 4240 15790 4252 ct 15794 4264 15796 4279 15796 4296 ct p ef
+gr
+gs
+0.507 0.832 0.109 c 18390 6437 m  16790 6437 l  16790 5100 l  19990 5100 l 
+19990 6437 l  18390 6437 l  p ef
+gr
+gs
+0 lw 1 lj 0.210 0.398 0.644 c 18389 6436 m  16789 6436 l  16789 5099 l 
+19989 5099 l  19989 6436 l  18389 6436 l  pc
+gr
+gs
+0.007 0.007 0.007 c 18148 5766 m  18148 5814 18139 5854 18122 5889 ct 18104 5925 18079 5953 18047 5972 ct 
+18015 5990 17978 6000 17935 6000 ct 17771 6000 l  17771 5540 l  17917 5540 l 
+17991 5540 18048 5559 18088 5598 ct 18128 5637 18148 5693 18148 5766 ct p
+18089 5766 m  18089 5708 18074 5664 18044 5635 ct 18015 5604 17972 5589 17915 5589 ct 
+17831 5589 l  17831 5950 l  17929 5950 l  17961 5950 17989 5942 18013 5927 ct 
+18037 5913 18056 5892 18069 5864 ct 18082 5837 18089 5804 18089 5766 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 18304 6006 m  18271 6006 18245 5997 18228 5978 ct 18211 5960 18203 5934 18203 5901 ct 
+18203 5864 18214 5837 18237 5818 ct 18260 5799 18297 5788 18348 5786 ct 18424 5785 l 
+18424 5766 l  18424 5738 18418 5717 18407 5704 ct 18395 5692 18377 5686 18351 5686 ct 
+18326 5686 18308 5690 18297 5699 ct 18285 5708 18278 5722 18276 5742 ct 18218 5737 l 
+18227 5673 18272 5640 18352 5640 ct 18396 5640 18427 5650 18449 5672 ct 18470 5692 18481 5721 18481 5760 ct 
+18481 5910 l  18481 5928 18483 5942 18487 5950 ct 18491 5959 18500 5963 18512 5963 ct 
+18517 5963 18523 5963 18530 5961 ct 18530 5998 l  18516 6001 18502 6003 18487 6003 ct 
+18466 6003 18451 5998 18442 5986 ct 18433 5975 18427 5957 18426 5933 ct 18424 5933 l 
+18410 5959 18393 5978 18374 5989 ct 18354 6001 18331 6006 18304 6006 ct p
+18317 5962 m  18338 5962 18356 5957 18373 5947 ct 18389 5938 18401 5924 18410 5907 ct 
+18420 5890 18424 5873 18424 5856 ct 18424 5826 l  18362 5827 l  18336 5828 18316 5830 18302 5836 ct 
+18289 5840 18278 5849 18271 5859 ct 18264 5870 18260 5884 18260 5902 ct 18260 5921 18265 5936 18275 5946 ct 
+18285 5957 18299 5962 18317 5962 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 18701 5998 m  18682 6003 18664 6005 18644 6005 ct 18600 6005 18576 5979 18576 5925 ct 
+18576 5689 l  18538 5689 l  18538 5646 l  18579 5646 l  18595 5567 l  18633 5567 l 
+18633 5646 l  18695 5646 l  18695 5689 l  18633 5689 l  18633 5913 l  18633 5929 18636 5941 18641 5948 ct 
+18646 5955 18656 5959 18669 5959 ct 18676 5959 18687 5957 18701 5954 ct 18701 5998 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 18833 6006 m  18800 6006 18774 5997 18757 5978 ct 18740 5960 18732 5934 18732 5901 ct 
+18732 5864 18743 5837 18766 5818 ct 18789 5799 18826 5788 18877 5786 ct 18952 5785 l 
+18952 5766 l  18952 5738 18946 5717 18935 5704 ct 18923 5692 18905 5686 18880 5686 ct 
+18855 5686 18837 5690 18826 5699 ct 18814 5708 18807 5722 18805 5742 ct 18747 5737 l 
+18756 5673 18801 5640 18881 5640 ct 18924 5640 18955 5650 18977 5672 ct 18998 5692 19009 5721 19009 5760 ct 
+19009 5910 l  19009 5928 19011 5942 19016 5950 ct 19020 5959 19029 5963 19041 5963 ct 
+19046 5963 19052 5963 19059 5961 ct 19059 5998 l  19045 6001 19031 6003 19016 6003 ct 
+18994 6003 18979 5998 18970 5986 ct 18961 5975 18955 5957 18954 5933 ct 18952 5933 l 
+18938 5959 18921 5978 18902 5989 ct 18883 6001 18860 6006 18833 6006 ct p
+18846 5962 m  18867 5962 18885 5957 18901 5947 ct 18917 5938 18929 5924 18938 5907 ct 
+18948 5890 18952 5873 18952 5856 ct 18952 5826 l  18891 5827 l  18865 5828 18845 5830 18831 5836 ct 
+18818 5840 18807 5849 18800 5859 ct 18793 5870 18789 5884 18789 5902 ct 18789 5921 18794 5936 18804 5946 ct 
+18814 5957 18828 5962 18846 5962 ct p ef
+gr
+gs
+1.000 0.714 0.425 c 21539 4891 m  20489 4891 l  20489 3555 l  22589 3555 l 
+22589 4891 l  21539 4891 l  p ef
+gr
+gs
+0 lw 1 lj 0.210 0.398 0.644 c 21538 4890 m  20488 4890 l  20488 3554 l 
+22588 3554 l  22588 4890 l  21538 4890 l  pc
+gr
+gs
+0.007 0.007 0.007 c 21372 4455 m  21322 4319 l  21122 4319 l  21072 4455 l 
+21010 4455 l  21189 3993 l  21257 3993 l  21432 4455 l  21372 4455 l  p
+21222 4040 m  21220 4049 l  21214 4067 21206 4091 21196 4119 ct 21140 4271 l 
+21304 4271 l  21248 4118 l  21242 4103 21237 4086 21231 4067 ct 21222 4040 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 21517 4276 m  21517 4323 21524 4358 21538 4381 ct 21552 4403 21574 4415 21602 4415 ct 
+21622 4415 21638 4409 21652 4398 ct 21665 4386 21673 4369 21676 4345 ct 21734 4349 l 
+21729 4383 21716 4411 21692 4431 ct 21668 4451 21639 4461 21603 4461 ct 21557 4461 21521 4445 21496 4414 ct 
+21471 4383 21459 4338 21459 4278 ct 21459 4218 21471 4172 21496 4141 ct 21521 4109 21557 4094 21603 4094 ct 
+21637 4094 21666 4103 21688 4122 ct 21712 4140 21726 4166 21732 4199 ct 21674 4205 l 
+21671 4184 21663 4168 21652 4157 ct 21640 4145 21623 4140 21601 4140 ct 21572 4140 21550 4151 21537 4171 ct 
+21524 4192 21517 4227 21517 4276 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 22002 4456 m  21890 4294 l  21849 4329 l  21849 4456 l 
+21793 4456 l  21793 3969 l  21849 3969 l  21849 4274 l  21995 4101 l  22061 4101 l 
+21924 4254 l  22068 4456 l  22002 4456 l  p ef
+gr
+gs
+0 lw 1 lj 0.007 0.007 0.007 c 6909 6684 m  15977 6684 l  ps
+gr
+gs
+0.007 0.007 0.007 c 6604 6710 m  6905 6817 l  6905 6604 l  6604 6710 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 16252 6710 m  15951 6604 l  15951 6817 l  16252 6710 l 
+p ef
+gr
+gs
+0 lw 1 lj 0.007 0.007 0.007 c 6604 7443 m  6604 6496 l  ps
+gr
+gs
+0 lw 1 lj 0.007 0.007 0.007 c 16256 7443 m  16256 6496 l  ps
+gr
+gs
+0.007 0.007 0.007 c 7285 7384 m  7285 7076 l  7285 7042 7285 7009 7288 6978 ct 
+7277 7017 7268 7047 7260 7069 ct 7148 7384 l  7107 7384 l  6991 7069 l  6974 7014 l 
+6964 6978 l  6965 7014 l  6966 7076 l  6966 7384 l  6913 7384 l  6913 6923 l 
+6991 6923 l  7108 7243 l  7112 7256 7116 7269 7120 7284 ct 7124 7299 7126 7309 7128 7316 ct 
+7129 7307 7133 7295 7138 7277 ct 7143 7259 7147 7247 7149 7243 ct 7262 6923 l 
+7338 6923 l  7338 7384 l  7285 7384 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 7475 7220 m  7475 7260 7483 7292 7498 7314 ct 7514 7336 7538 7346 7568 7346 ct 
+7592 7346 7612 7341 7627 7332 ct 7642 7321 7652 7308 7657 7293 ct 7706 7307 l 
+7686 7363 7640 7390 7568 7390 ct 7519 7390 7481 7375 7455 7344 ct 7429 7313 7416 7266 7416 7205 ct 
+7416 7146 7429 7101 7455 7069 ct 7481 7039 7518 7023 7566 7023 ct 7666 7023 7715 7085 7715 7212 ct 
+7715 7220 l  7475 7220 l  p
+7657 7175 m  7654 7138 7645 7109 7630 7092 ct 7615 7075 7593 7066 7565 7066 ct 
+7538 7066 7517 7076 7501 7095 ct 7485 7114 7476 7141 7475 7175 ct 7657 7175 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 7997 7328 m  7986 7350 7973 7367 7955 7377 ct 7938 7386 7917 7392 7892 7392 ct 
+7849 7392 7818 7377 7798 7346 ct 7778 7317 7768 7270 7768 7209 ct 7768 7085 7809 7024 7892 7024 ct 
+7917 7024 7939 7028 7956 7039 ct 7973 7048 7986 7064 7997 7085 ct 7997 7045 l 
+7997 6900 l  8052 6900 l  8052 7313 l  8052 7349 8053 7374 8054 7385 ct 8001 7385 l 
+8000 7381 8000 7374 7999 7361 ct 7998 7348 7998 7337 7998 7328 ct 7997 7328 l 
 p
-369 -223 m  369 -277 354 -319 324 -347 ct 295 -376 252 -390 195 -390 ct 111 -390 l 
-111 -47 l  209 -47 l  241 -47 269 -55 293 -69 ct 317 -83 336 -103 349 -129 ct 
-362 -156 369 -187 369 -223 ct p ef
-585 6 m  552 6 526 -3 509 -21 ct 492 -38 484 -63 484 -94 ct 484 -129 495 -155 518 -174 ct 
-541 -192 578 -202 629 -204 ct 704 -205 l  704 -223 l  704 -250 698 -270 687 -282 ct 
-675 -294 657 -299 632 -299 ct 607 -299 589 -295 578 -287 ct 566 -278 559 -265 557 -246 ct 
-499 -251 l  508 -312 553 -342 633 -342 ct 676 -342 707 -332 729 -313 ct 750 -294 761 -266 761 -229 ct 
-761 -85 l  761 -68 763 -55 767 -47 ct 771 -39 780 -35 792 -35 ct 797 -35 803 -35 810 -37 ct 
-810 -2 l  796 1 782 3 767 3 ct 746 3 731 -2 722 -13 ct 713 -24 707 -41 706 -64 ct 
-704 -64 l  690 -39 673 -21 654 -10 ct 635 1 612 6 585 6 ct p
-598 -36 m  619 -36 637 -41 653 -50 ct 669 -59 681 -72 690 -88 ct 700 -104 704 -121 704 -138 ct 
-704 -166 l  643 -165 l  617 -164 597 -161 583 -157 ct 570 -152 559 -144 552 -134 ct 
-545 -123 541 -110 541 -93 ct 541 -75 546 -61 556 -51 ct 566 -41 580 -36 598 -36 ct 
-p ef
-981 -2 m  962 3 944 5 924 5 ct 880 5 857 -20 857 -71 ct 857 -295 l  819 -295 l 
-819 -336 l  860 -336 l  876 -411 l  913 -411 l  913 -336 l  975 -336 l 
-975 -295 l  913 -295 l  913 -83 l  913 -67 916 -56 921 -49 ct 926 -43 936 -39 949 -39 ct 
-956 -39 967 -41 981 -44 ct 981 -2 l  p ef
-1114 6 m  1081 6 1055 -3 1038 -21 ct 1021 -38 1013 -63 1013 -94 ct 1013 -129 1024 -155 1047 -174 ct 
-1070 -192 1107 -202 1158 -204 ct 1233 -205 l  1233 -223 l  1233 -250 1227 -270 1216 -282 ct 
-1204 -294 1186 -299 1161 -299 ct 1136 -299 1118 -295 1107 -287 ct 1095 -278 1088 -265 1086 -246 ct 
-1028 -251 l  1037 -312 1082 -342 1162 -342 ct 1205 -342 1236 -332 1258 -313 ct 
-1279 -294 1290 -266 1290 -229 ct 1290 -85 l  1290 -68 1292 -55 1296 -47 ct 1300 -39 1309 -35 1321 -35 ct 
-1326 -35 1332 -35 1339 -37 ct 1339 -2 l  1325 1 1311 3 1296 3 ct 1275 3 1260 -2 1251 -13 ct 
-1242 -24 1236 -41 1235 -64 ct 1233 -64 l  1219 -39 1202 -21 1183 -10 ct 1164 1 1141 6 1114 6 ct 
+7826 7208 m  7826 7258 7832 7293 7845 7314 ct 7857 7336 7878 7346 7906 7346 ct 
+7938 7346 7961 7335 7975 7312 ct 7989 7288 7997 7253 7997 7204 ct 7997 7157 7989 7123 7975 7100 ct 
+7961 7078 7938 7067 7907 7067 ct 7879 7067 7858 7078 7845 7100 ct 7833 7123 7826 7159 7826 7208 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 8134 6956 m  8134 6900 l  8191 6900 l  8191 6956 l  8134 6956 l 
 p
-1127 -36 m  1148 -36 1166 -41 1182 -50 ct 1198 -59 1210 -72 1219 -88 ct 1229 -104 1233 -121 1233 -138 ct 
-1233 -166 l  1172 -165 l  1146 -164 1126 -161 1112 -157 ct 1099 -152 1088 -144 1081 -134 ct 
-1074 -123 1070 -110 1070 -93 ct 1070 -75 1075 -61 1085 -51 ct 1095 -41 1109 -36 1127 -36 ct 
+8134 7385 m  8134 7032 l  8191 7032 l  8191 7385 l  8134 7385 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 8329 7029 m  8329 7254 l  8329 7277 8332 7295 8336 7307 ct 
+8340 7321 8347 7329 8357 7336 ct 8366 7341 8380 7344 8399 7344 ct 8425 7344 8447 7335 8462 7315 ct 
+8478 7296 8485 7268 8485 7235 ct 8485 7029 l  8542 7029 l  8542 7307 l  8542 7348 8543 7375 8544 7384 ct 
+8490 7384 l  8490 7383 8490 7380 8490 7375 ct 8489 7370 8489 7365 8489 7358 ct 
+8489 7352 8488 7340 8488 7322 ct 8487 7322 l  8474 7347 8459 7365 8442 7376 ct 
+8426 7385 8405 7390 8380 7390 ct 8343 7390 8316 7381 8299 7362 ct 8282 7341 8273 7309 8273 7265 ct 
+8273 7029 l  8329 7029 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 8821 7384 m  8821 7159 l  8821 7125 8817 7101 8808 7088 ct 
+8799 7075 8783 7068 8760 7068 ct 8736 7068 8717 7078 8703 7097 ct 8689 7117 8683 7143 8683 7178 ct 
+8683 7384 l  8627 7384 l  8627 7105 l  8627 7064 8626 7039 8625 7029 ct 8678 7029 l 
+8678 7030 8678 7034 8679 7039 ct 8679 7043 8679 7048 8679 7055 ct 8680 7061 8680 7073 8680 7090 ct 
+8681 7090 l  8693 7065 8707 7047 8723 7038 ct 8738 7028 8757 7023 8779 7023 ct 
+8805 7023 8825 7028 8840 7039 ct 8854 7049 8865 7066 8870 7090 ct 8871 7090 l 
+8883 7066 8897 7049 8913 7039 ct 8930 7028 8950 7023 8973 7023 ct 9008 7023 9033 7033 9048 7053 ct 
+9063 7072 9071 7103 9071 7147 ct 9071 7384 l  9016 7384 l  9016 7159 l  9016 7125 9011 7101 9003 7088 ct 
+8994 7075 8978 7068 8954 7068 ct 8929 7068 8910 7078 8897 7097 ct 8883 7116 8876 7143 8876 7178 ct 
+8876 7384 l  8821 7384 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 9507 7256 m  9507 7298 9492 7333 9460 7356 ct 9429 7379 9384 7390 9327 7390 ct 
+9220 7390 9158 7352 9141 7273 ct 9198 7260 l  9205 7288 9220 7308 9241 7321 ct 
+9263 7336 9292 7342 9329 7342 ct 9367 7342 9397 7335 9418 7320 ct 9438 7306 9449 7286 9449 7259 ct 
+9449 7244 9446 7232 9439 7222 ct 9433 7214 9423 7205 9412 7199 ct 9400 7194 9386 7188 9369 7184 ct 
+9353 7180 9335 7176 9315 7170 ct 9281 7162 9254 7155 9237 7146 ct 9219 7138 9204 7129 9193 7120 ct 
+9183 7109 9175 7098 9170 7084 ct 9164 7072 9161 7056 9161 7039 ct 9161 7000 9176 6969 9204 6948 ct 
+9234 6927 9275 6917 9328 6917 ct 9378 6917 9416 6925 9442 6941 ct 9468 6957 9487 6984 9497 7022 ct 
+9439 7033 l  9432 7008 9420 6990 9402 6979 ct 9384 6969 9359 6963 9328 6963 ct 
+9293 6963 9266 6969 9248 6981 ct 9229 6994 9220 7012 9220 7036 ct 9220 7049 9224 7061 9231 7070 ct 
+9238 7080 9248 7087 9262 7095 ct 9275 7101 9302 7108 9342 7118 ct 9355 7121 9369 7124 9382 7128 ct 
+9395 7132 9408 7136 9420 7140 ct 9432 7145 9444 7150 9455 7157 ct 9465 7163 9474 7170 9482 7180 ct 
+9490 7188 9496 7200 9501 7212 ct 9505 7224 9507 7239 9507 7256 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 9595 7523 m  9579 7523 9566 7522 9556 7520 ct 9556 7476 l 
+9564 7477 9572 7478 9582 7478 ct 9618 7478 9645 7450 9665 7397 ct 9671 7383 l 
+9537 7029 l  9597 7029 l  9668 7226 l  9669 7229 9670 7233 9672 7237 ct 9673 7242 9678 7256 9685 7280 ct 
+9693 7304 9698 7318 9698 7320 ct 9720 7256 l  9793 7029 l  9852 7029 l  9723 7384 l 
+9709 7422 9697 7450 9685 7468 ct 9673 7487 9659 7501 9645 7509 ct 9630 7519 9614 7523 9595 7523 ct 
 p ef
-pom
+gr
 gs
-1.000 0.714 0.425 c 23849 6969 m  22799 6969 l  22799 5699 l  24899 5699 l 
-24899 6969 l  23849 6969 l  p ef
+0.007 0.007 0.007 c 10110 7384 m  10110 7159 l  10110 7136 10108 7118 10102 7105 ct 
+10098 7092 10091 7083 10082 7077 ct 10072 7072 10058 7068 10040 7068 ct 10013 7068 9992 7078 9976 7098 ct 
+9961 7117 9953 7144 9953 7178 ct 9953 7384 l  9897 7384 l  9897 7105 l  9897 7064 9896 7039 9895 7029 ct 
+9948 7029 l  9948 7030 9948 7034 9949 7039 ct 9949 7043 9949 7048 9949 7055 ct 
+9950 7061 9950 7073 9950 7090 ct 9951 7090 l  9964 7065 9979 7048 9996 7038 ct 
+10013 7028 10034 7023 10059 7023 ct 10095 7023 10123 7033 10140 7052 ct 10157 7072 10166 7103 10166 7147 ct 
+10166 7384 l  10110 7384 l  p ef
 gr
 gs
-0 lw 1 lj 0.207 0.398 0.644 c 23848 6969 m  22798 6969 l  22798 5699 l 
-24898 5699 l  24898 6969 l  23848 6969 l  pc
+0.007 0.007 0.007 c 10289 7205 m  10289 7253 10296 7287 10310 7310 ct 10324 7333 10347 7344 10375 7344 ct 
+10395 7344 10411 7339 10425 7327 ct 10438 7316 10446 7299 10449 7275 ct 10506 7279 l 
+10501 7313 10488 7340 10465 7360 ct 10441 7380 10412 7390 10376 7390 ct 10329 7390 10293 7375 10268 7343 ct 
+10243 7313 10231 7267 10231 7207 ct 10231 7147 10243 7101 10268 7070 ct 10293 7039 10329 7023 10376 7023 ct 
+10410 7023 10439 7033 10461 7052 ct 10484 7069 10498 7096 10504 7129 ct 10447 7135 l 
+10444 7114 10436 7098 10425 7086 ct 10413 7075 10396 7069 10374 7069 ct 10345 7069 10322 7080 10309 7100 ct 
+10296 7121 10289 7157 10289 7205 ct p ef
 gr
-pum
-23319 6554 t
-362 0 m  312 -128 l  113 -128 l  63 0 l  1 0 l  180 -438 l  247 -438 l 
-422 0 l  362 0 l  p
-212 -393 m  210 -384 l  204 -367 197 -345 187 -318 ct 131 -174 l  294 -174 l 
-238 -319 l  232 -333 227 -349 221 -367 ct 212 -393 l  p ef
-508 -170 m  508 -125 515 -92 529 -70 ct 543 -49 565 -38 593 -38 ct 613 -38 629 -43 643 -54 ct 
-656 -65 664 -81 667 -104 ct 724 -100 l  719 -68 706 -42 683 -23 ct 659 -4 630 6 594 6 ct 
-548 6 512 -9 487 -39 ct 462 -68 450 -111 450 -168 ct 450 -225 462 -268 487 -297 ct 
-512 -327 548 -342 594 -342 ct 628 -342 657 -333 679 -315 ct 702 -298 716 -273 722 -242 ct 
-665 -237 l  662 -256 654 -271 643 -282 ct 631 -293 614 -298 592 -298 ct 563 -298 541 -288 528 -269 ct 
-515 -249 508 -216 508 -170 ct p ef
-994 1 m  881 -153 l  840 -119 l  840 1 l  784 1 l  784 -460 l  840 -460 l 
-840 -172 l  987 -335 l  1052 -335 l  916 -191 l  1059 1 l  994 1 l  p ef
-pom
 gs
-1 lj 11746 8693 m  23672 8693 l  ps
+0.007 0.007 0.007 c 10951 7149 m  10951 7197 10942 7238 10925 7274 ct 10907 7309 10882 7337 10850 7356 ct 
+10818 7375 10780 7384 10737 7384 ct 10574 7384 l  10574 6924 l  10719 6924 l 
+10794 6924 10851 6943 10891 6981 ct 10931 7020 10951 7076 10951 7149 ct p
+10892 7149 m  10892 7092 10877 7047 10847 7018 ct 10818 6987 10774 6973 10717 6973 ct 
+10633 6973 l  10633 7335 l  10731 7335 l  10763 7335 10792 7326 10816 7312 ct 
+10840 7297 10859 7276 10872 7248 ct 10885 7220 10892 7187 10892 7149 ct p ef
 gr
 gs
-11459 8693 m  11759 8793 l  11759 8593 l  11459 8693 l  p ef
+0.007 0.007 0.007 c 11065 7220 m  11065 7260 11073 7292 11088 7314 ct 11104 7336 11128 7346 11158 7346 ct 
+11183 7346 11203 7341 11217 7332 ct 11232 7321 11242 7308 11247 7293 ct 11296 7307 l 
+11276 7363 11230 7390 11158 7390 ct 11109 7390 11071 7375 11045 7344 ct 11019 7313 11006 7266 11006 7205 ct 
+11006 7146 11019 7101 11045 7069 ct 11071 7039 11108 7023 11156 7023 ct 11256 7023 11305 7085 11305 7212 ct 
+11305 7220 l  11065 7220 l  p
+11247 7175 m  11244 7138 11235 7109 11220 7092 ct 11205 7075 11184 7066 11155 7066 ct 
+11128 7066 11107 7076 11091 7095 ct 11075 7114 11066 7141 11065 7175 ct 11247 7175 l 
+p ef
 gr
 gs
-23959 8693 m  23659 8593 l  23659 8793 l  23959 8693 l  p ef
+0.007 0.007 0.007 c 11373 7385 m  11373 6900 l  11430 6900 l  11430 7385 l 
+11373 7385 l  p ef
 gr
 gs
-0 lw 1 lj 11459 9393 m  11459 8493 l  ps
+0.007 0.007 0.007 c 11598 7390 m  11565 7390 11539 7381 11522 7362 ct 11505 7344 11497 7318 11497 7285 ct 
+11497 7248 11508 7221 11531 7201 ct 11554 7182 11591 7172 11642 7169 ct 11716 7168 l 
+11716 7149 l  11716 7120 11710 7099 11699 7086 ct 11687 7074 11669 7068 11645 7068 ct 
+11620 7068 11602 7073 11591 7081 ct 11579 7090 11572 7104 11570 7125 ct 11512 7119 l 
+11521 7055 11566 7023 11646 7023 ct 11689 7023 11719 7034 11741 7054 ct 11762 7074 11773 7103 11773 7143 ct 
+11773 7295 l  11773 7313 11775 7326 11779 7335 ct 11783 7343 11792 7347 11804 7347 ct 
+11809 7347 11816 7347 11823 7345 ct 11823 7382 l  11808 7385 11794 7387 11779 7387 ct 
+11758 7387 11744 7382 11734 7370 ct 11725 7359 11719 7341 11718 7317 ct 11716 7317 l 
+11702 7343 11686 7362 11666 7374 ct 11648 7385 11625 7390 11598 7390 ct p
+11611 7346 m  11631 7346 11649 7341 11666 7332 ct 11681 7322 11693 7308 11702 7292 ct 
+11712 7275 11716 7257 11716 7239 ct 11716 7209 l  11655 7210 l  11630 7212 11610 7215 11596 7219 ct 
+11583 7224 11572 7233 11565 7243 ct 11558 7255 11554 7268 11554 7286 ct 11554 7305 11559 7320 11569 7330 ct 
+11579 7341 11593 7346 11611 7346 ct p ef
 gr
 gs
-0 lw 1 lj 23958 9393 m  23958 8493 l  ps
+0.007 0.007 0.007 c 11879 7523 m  11864 7523 11851 7522 11841 7520 ct 11841 7476 l 
+11849 7477 11857 7478 11867 7478 ct 11902 7478 11929 7450 11949 7397 ct 11955 7383 l 
+11822 7029 l  11881 7029 l  11952 7226 l  11953 7229 11954 7233 11956 7237 ct 
+11957 7242 11962 7256 11969 7280 ct 11977 7304 11982 7318 11982 7320 ct 12004 7256 l 
+12077 7029 l  12137 7029 l  12007 7384 l  11993 7422 11981 7450 11969 7468 ct 
+11957 7487 11943 7501 11929 7509 ct 11914 7519 11898 7523 11879 7523 ct p ef
 gr
-pum
-15069 9340 t
-424 0 m  424 -292 l  424 -324 424 -355 426 -385 ct 416 -348 407 -319 399 -298 ct 
-286 0 l  245 0 l  130 -298 l  113 -351 l  103 -385 l  104 -351 l  105 -292 l 
-105 0 l  52 0 l  52 -438 l  130 -438 l  246 -134 l  250 -122 254 -109 258 -95 ct 
-262 -81 264 -71 266 -65 ct 267 -73 271 -85 276 -102 ct 281 -119 285 -130 287 -134 ct 
-401 -438 l  477 -438 l  477 0 l  424 0 l  p ef
-615 -156 m  615 -118 623 -88 638 -67 ct 654 -46 678 -36 708 -36 ct 732 -36 752 -41 766 -50 ct 
-781 -60 791 -72 796 -87 ct 845 -73 l  825 -20 779 6 708 6 ct 659 6 621 -9 595 -38 ct 
-569 -68 556 -112 556 -170 ct 556 -226 569 -268 595 -298 ct 621 -327 658 -342 706 -342 ct 
-805 -342 854 -283 854 -164 ct 854 -156 l  615 -156 l  p
-796 -199 m  793 -234 784 -260 769 -277 ct 754 -293 733 -301 705 -301 ct 678 -301 657 -292 641 -274 ct 
-625 -256 616 -231 615 -199 ct 796 -199 l  p ef
-1136 -53 m  1125 -32 1112 -16 1094 -7 ct 1077 2 1056 7 1031 7 ct 989 7 958 -7 938 -36 ct 
-918 -64 908 -108 908 -166 ct 908 -283 949 -341 1031 -341 ct 1056 -341 1078 -337 1095 -327 ct 
-1112 -318 1125 -303 1136 -283 ct 1136 -283 l  1136 -321 l  1136 -460 l  1191 -460 l 
-1191 -68 l  1191 -33 1192 -10 1193 1 ct 1140 1 l  1139 -3 1139 -10 1138 -22 ct 
-1137 -34 1137 -45 1137 -53 ct 1136 -53 l  p
-966 -167 m  966 -120 972 -87 985 -67 ct 997 -46 1017 -36 1045 -36 ct 1077 -36 1100 -47 1114 -69 ct 
-1128 -91 1136 -125 1136 -171 ct 1136 -216 1128 -248 1114 -269 ct 1100 -290 1077 -300 1046 -300 ct 
-1018 -300 998 -290 985 -269 ct 973 -248 966 -214 966 -167 ct p ef
-1274 -407 m  1274 -460 l  1330 -460 l  1330 -407 l  1274 -407 l  p
-1274 1 m  1274 -335 l  1330 -335 l  1330 1 l  1274 1 l  p ef
-1469 -336 m  1469 -123 l  1469 -101 1472 -84 1476 -72 ct 1480 -59 1487 -51 1497 -45 ct 
-1506 -40 1520 -37 1539 -37 ct 1565 -37 1587 -46 1602 -65 ct 1618 -83 1625 -109 1625 -141 ct 
-1625 -336 l  1681 -336 l  1681 -72 l  1681 -33 1682 -9 1683 0 ct 1630 0 l 
-1630 -1 1630 -4 1630 -9 ct 1629 -13 1629 -18 1629 -24 ct 1629 -30 1628 -41 1628 -58 ct 
-1627 -58 l  1614 -34 1599 -18 1582 -8 ct 1566 1 1545 6 1520 6 ct 1483 6 1456 -3 1439 -21 ct 
-1422 -40 1413 -70 1413 -112 ct 1413 -336 l  1469 -336 l  p ef
-1961 0 m  1961 -213 l  1961 -245 1957 -268 1948 -280 ct 1939 -293 1923 -299 1900 -299 ct 
-1876 -299 1857 -290 1843 -272 ct 1829 -253 1823 -228 1823 -195 ct 1823 0 l  1767 0 l 
-1767 -264 l  1767 -303 1766 -327 1765 -336 ct 1818 -336 l  1818 -335 1818 -332 1819 -327 ct 
-1819 -323 1819 -318 1819 -312 ct 1820 -306 1820 -295 1820 -278 ct 1821 -278 l 
-1833 -302 1847 -319 1863 -328 ct 1878 -337 1897 -342 1919 -342 ct 1945 -342 1965 -337 1980 -327 ct 
-1994 -317 2005 -301 2010 -278 ct 2011 -278 l  2023 -301 2037 -317 2053 -327 ct 
-2070 -337 2090 -342 2113 -342 ct 2147 -342 2172 -333 2187 -314 ct 2202 -296 2210 -266 2210 -224 ct 
-2210 0 l  2155 0 l  2155 -213 l  2155 -245 2150 -268 2142 -280 ct 2133 -293 2117 -299 2094 -299 ct 
-2069 -299 2050 -290 2037 -272 ct 2023 -254 2016 -228 2016 -195 ct 2016 0 l  1961 0 l 
-p ef
-2646 -121 m  2646 -81 2631 -49 2599 -27 ct 2568 -5 2523 6 2466 6 ct 2359 6 2298 -31 2281 -105 ct 
-2338 -117 l  2345 -90 2359 -71 2380 -59 ct 2402 -46 2431 -40 2468 -40 ct 2506 -40 2536 -47 2557 -60 ct 
-2577 -73 2588 -92 2588 -118 ct 2588 -132 2585 -144 2578 -153 ct 2572 -161 2562 -169 2551 -175 ct 
-2539 -180 2525 -185 2508 -189 ct 2492 -193 2474 -197 2454 -202 ct 2420 -210 2393 -217 2376 -225 ct 
-2358 -233 2344 -241 2333 -250 ct 2323 -260 2315 -271 2310 -284 ct 2304 -296 2301 -311 2301 -327 ct 
-2301 -364 2316 -393 2344 -414 ct 2373 -434 2414 -444 2467 -444 ct 2517 -444 2555 -436 2581 -421 ct 
-2607 -406 2626 -380 2636 -343 ct 2578 -333 l  2571 -356 2559 -373 2541 -384 ct 
-2523 -394 2498 -399 2467 -399 ct 2432 -399 2405 -394 2387 -382 ct 2368 -370 2359 -353 2359 -330 ct 
-2359 -317 2363 -306 2370 -297 ct 2377 -288 2387 -281 2401 -274 ct 2414 -268 2441 -261 2481 -252 ct 
-2494 -249 2508 -246 2521 -242 ct 2534 -239 2547 -235 2559 -231 ct 2571 -226 2583 -221 2594 -215 ct 
-2604 -209 2613 -202 2621 -193 ct 2629 -185 2635 -174 2640 -163 ct 2644 -151 2646 -137 2646 -121 ct 
-p ef
-2734 132 m  2719 132 2706 131 2696 129 ct 2696 87 l  2704 88 2712 89 2722 89 ct 
-2757 89 2784 63 2804 12 ct 2810 -1 l  2677 -336 l  2736 -336 l  2807 -150 l 
-2808 -147 2809 -144 2811 -140 ct 2812 -135 2817 -122 2824 -99 ct 2832 -76 2837 -63 2837 -61 ct 
-2859 -122 l  2932 -336 l  2991 -336 l  2862 0 l  2848 36 2836 63 2824 80 ct 
-2812 98 2798 111 2784 119 ct 2769 128 2753 132 2734 132 ct p ef
-3249 0 m  3249 -213 l  3249 -235 3247 -252 3242 -264 ct 3238 -277 3231 -285 3222 -291 ct 
-3212 -296 3198 -299 3180 -299 ct 3153 -299 3132 -290 3116 -271 ct 3101 -253 3093 -227 3093 -195 ct 
-3093 0 l  3037 0 l  3037 -264 l  3037 -303 3036 -327 3035 -336 ct 3088 -336 l 
-3088 -335 3088 -332 3089 -327 ct 3089 -323 3089 -318 3089 -312 ct 3090 -306 3090 -295 3090 -278 ct 
-3091 -278 l  3104 -302 3119 -318 3136 -328 ct 3153 -337 3174 -342 3199 -342 ct 
-3235 -342 3262 -333 3279 -315 ct 3296 -296 3305 -266 3305 -224 ct 3305 0 l  3249 0 l 
-p ef
-3429 -170 m  3429 -125 3436 -92 3450 -70 ct 3464 -49 3486 -38 3514 -38 ct 3534 -38 3550 -43 3564 -54 ct 
-3577 -65 3585 -81 3588 -104 ct 3645 -100 l  3640 -68 3627 -42 3604 -23 ct 3580 -4 3551 6 3515 6 ct 
-3469 6 3433 -9 3408 -39 ct 3383 -68 3371 -111 3371 -168 ct 3371 -225 3383 -268 3408 -297 ct 
-3433 -327 3469 -342 3515 -342 ct 3549 -342 3578 -333 3600 -315 ct 3623 -298 3637 -273 3643 -242 ct 
-3586 -237 l  3583 -256 3575 -271 3564 -282 ct 3552 -293 3535 -298 3513 -298 ct 
-3484 -298 3462 -288 3449 -269 ct 3436 -249 3429 -216 3429 -170 ct p ef
-4090 -223 m  4090 -178 4081 -139 4064 -105 ct 4046 -71 4021 -45 3989 -27 ct 
-3957 -9 3920 0 3877 0 ct 3714 0 l  3714 -437 l  3859 -437 l  3933 -437 3990 -419 4030 -382 ct 
-4070 -345 4090 -292 4090 -223 ct p
-4031 -223 m  4031 -277 4016 -319 3986 -347 ct 3957 -376 3914 -390 3857 -390 ct 
-3773 -390 l  3773 -47 l  3871 -47 l  3903 -47 3931 -55 3955 -69 ct 3979 -83 3998 -103 4011 -129 ct 
-4024 -156 4031 -187 4031 -223 ct p ef
-4205 -156 m  4205 -118 4213 -88 4228 -67 ct 4244 -46 4268 -36 4298 -36 ct 4322 -36 4342 -41 4356 -50 ct 
-4371 -60 4381 -72 4386 -87 ct 4435 -73 l  4415 -20 4369 6 4298 6 ct 4249 6 4211 -9 4185 -38 ct 
-4159 -68 4146 -112 4146 -170 ct 4146 -226 4159 -268 4185 -298 ct 4211 -327 4248 -342 4296 -342 ct 
-4395 -342 4444 -283 4444 -164 ct 4444 -156 l  4205 -156 l  p
-4386 -199 m  4383 -234 4374 -260 4359 -277 ct 4344 -293 4323 -301 4295 -301 ct 
-4268 -301 4247 -292 4231 -274 ct 4215 -256 4206 -231 4205 -199 ct 4386 -199 l 
-p ef
-4513 1 m  4513 -460 l  4569 -460 l  4569 1 l  4513 1 l  p ef
-4738 6 m  4705 6 4679 -3 4662 -21 ct 4645 -38 4637 -63 4637 -94 ct 4637 -129 4648 -155 4671 -174 ct 
-4694 -192 4731 -202 4782 -204 ct 4857 -205 l  4857 -223 l  4857 -250 4851 -270 4840 -282 ct 
-4828 -294 4810 -299 4785 -299 ct 4760 -299 4742 -295 4731 -287 ct 4719 -278 4712 -265 4710 -246 ct 
-4652 -251 l  4661 -312 4706 -342 4786 -342 ct 4829 -342 4860 -332 4882 -313 ct 
-4903 -294 4914 -266 4914 -229 ct 4914 -85 l  4914 -68 4916 -55 4920 -47 ct 4924 -39 4933 -35 4945 -35 ct 
-4950 -35 4956 -35 4963 -37 ct 4963 -2 l  4949 1 4935 3 4920 3 ct 4899 3 4884 -2 4875 -13 ct 
-4866 -24 4860 -41 4859 -64 ct 4857 -64 l  4843 -39 4826 -21 4807 -10 ct 4788 1 4765 6 4738 6 ct 
-p
-4751 -36 m  4772 -36 4790 -41 4806 -50 ct 4822 -59 4834 -72 4843 -88 ct 4853 -104 4857 -121 4857 -138 ct 
-4857 -166 l  4796 -165 l  4770 -164 4750 -161 4736 -157 ct 4723 -152 4712 -144 4705 -134 ct 
-4698 -123 4694 -110 4694 -93 ct 4694 -75 4699 -61 4709 -51 ct 4719 -41 4733 -36 4751 -36 ct 
-p ef
-5020 132 m  5005 132 4992 131 4982 129 ct 4982 87 l  4990 88 4998 89 5008 89 ct 
-5043 89 5070 63 5090 12 ct 5096 -1 l  4963 -336 l  5022 -336 l  5093 -150 l 
-5094 -147 5095 -144 5097 -140 ct 5098 -135 5103 -122 5110 -99 ct 5118 -76 5123 -63 5123 -61 ct 
-5145 -122 l  5218 -336 l  5277 -336 l  5148 0 l  5134 36 5122 63 5110 80 ct 
-5098 98 5084 111 5070 119 ct 5055 128 5039 132 5020 132 ct p ef
-pom
 gs
-1.000 0.843 0.843 c 26180 8121 m  24921 8121 l  24921 7169 l  27438 7169 l 
-27438 8121 l  26180 8121 l  p ef
+1.000 0.843 0.843 c 23869 14102 m  22610 14102 l  22610 13100 l  25128 13100 l 
+25128 14102 l  23869 14102 l  p ef
 gr
 gs
-1 lj 0.167 0.378 0.601 c 24921 7417 m  25169 7169 l  ps
-24921 7717 m  25469 7169 l  ps
-24921 8017 m  25769 7169 l  ps
-25117 8121 m  26069 7169 l  ps
-25417 8121 m  26369 7169 l  ps
-25717 8121 m  26669 7169 l  ps
-26017 8121 m  26969 7169 l  ps
-26317 8121 m  27269 7169 l  ps
-26617 8121 m  27438 7300 l  ps
-26917 8121 m  27438 7600 l  ps
-27217 8121 m  27438 7900 l  ps
+0 lw 1 lj 0.171 0.378 0.601 c 22610 13362 m  22859 13099 l  ps
 gr
 gs
-1 lj 25254 8438 m  27200 8438 l  ps
+0 lw 1 lj 0.171 0.378 0.601 c 22610 13677 m  23159 13099 l  ps
 gr
 gs
-24967 8438 m  25267 8538 l  25267 8338 l  24967 8438 l  p ef
+0 lw 1 lj 0.171 0.378 0.601 c 22610 13992 m  23459 13099 l  ps
 gr
 gs
-27487 8438 m  27187 8338 l  27187 8538 l  27487 8438 l  p ef
+0 lw 1 lj 0.171 0.378 0.601 c 22806 14102 m  23759 13099 l  ps
 gr
 gs
-0 lw 1 lj 24966 9138 m  24966 8238 l  ps
+0 lw 1 lj 0.171 0.378 0.601 c 23106 14102 m  24059 13099 l  ps
 gr
 gs
-0 lw 1 lj 27486 9138 m  27486 8238 l  ps
+0 lw 1 lj 0.171 0.378 0.601 c 23406 14102 m  24359 13099 l  ps
 gr
-pum
-25149 9325 t
-85 -170 m  85 -125 92 -92 106 -70 ct 120 -49 142 -38 170 -38 ct 190 -38 206 -43 220 -54 ct 
-233 -65 241 -81 244 -104 ct 301 -100 l  296 -68 283 -42 260 -23 ct 236 -4 207 6 171 6 ct 
-125 6 89 -9 64 -39 ct 39 -68 27 -111 27 -168 ct 27 -225 39 -268 64 -297 ct 89 -327 125 -342 171 -342 ct 
-205 -342 234 -333 256 -315 ct 279 -298 293 -273 299 -242 ct 242 -237 l  239 -256 231 -271 220 -282 ct 
-208 -293 191 -298 169 -298 ct 140 -298 118 -288 105 -269 ct 92 -249 85 -216 85 -170 ct 
-p ef
-416 -278 m  428 -299 443 -316 460 -326 ct 476 -336 498 -341 524 -341 ct 560 -341 587 -332 604 -314 ct 
-621 -296 630 -266 630 -223 ct 630 1 l  574 1 l  574 -212 l  574 -236 572 -253 567 -265 ct 
-563 -276 556 -285 546 -290 ct 536 -295 522 -298 505 -298 ct 478 -298 457 -289 442 -271 ct 
-426 -253 418 -228 418 -197 ct 418 1 l  362 1 l  362 -460 l  418 -460 l  418 -340 l 
-418 -327 417 -314 417 -301 ct 416 -287 416 -280 415 -278 ct 416 -278 l  p ef
-797 6 m  764 6 738 -3 721 -21 ct 704 -38 696 -63 696 -94 ct 696 -129 707 -155 730 -174 ct 
-753 -192 790 -202 841 -204 ct 916 -205 l  916 -223 l  916 -250 910 -270 899 -282 ct 
-887 -294 869 -299 844 -299 ct 819 -299 801 -295 790 -287 ct 778 -278 771 -265 769 -246 ct 
-711 -251 l  720 -312 765 -342 845 -342 ct 888 -342 919 -332 941 -313 ct 962 -294 973 -266 973 -229 ct 
-973 -85 l  973 -68 975 -55 979 -47 ct 983 -39 992 -35 1004 -35 ct 1009 -35 1015 -35 1022 -37 ct 
-1022 -2 l  1008 1 994 3 979 3 ct 958 3 943 -2 934 -13 ct 925 -24 919 -41 918 -64 ct 
-916 -64 l  902 -39 885 -21 866 -10 ct 847 1 824 6 797 6 ct p
-810 -36 m  831 -36 849 -41 865 -50 ct 881 -59 893 -72 902 -88 ct 912 -104 916 -121 916 -138 ct 
-916 -166 l  855 -165 l  829 -164 809 -161 795 -157 ct 782 -152 771 -144 764 -134 ct 
-757 -123 753 -110 753 -93 ct 753 -75 758 -61 768 -51 ct 778 -41 792 -36 810 -36 ct 
-p ef
-1276 0 m  1276 -213 l  1276 -235 1274 -252 1269 -264 ct 1265 -277 1258 -285 1249 -291 ct 
-1239 -296 1225 -299 1207 -299 ct 1180 -299 1159 -290 1143 -271 ct 1128 -253 1120 -227 1120 -195 ct 
-1120 0 l  1064 0 l  1064 -264 l  1064 -303 1063 -327 1062 -336 ct 1115 -336 l 
-1115 -335 1115 -332 1116 -327 ct 1116 -323 1116 -318 1116 -312 ct 1117 -306 1117 -295 1117 -278 ct 
-1118 -278 l  1131 -302 1146 -318 1163 -328 ct 1180 -337 1201 -342 1226 -342 ct 
-1262 -342 1289 -333 1306 -315 ct 1323 -296 1332 -266 1332 -224 ct 1332 0 l  1276 0 l 
-p ef
-1628 0 m  1628 -213 l  1628 -235 1626 -252 1621 -264 ct 1617 -277 1610 -285 1601 -291 ct 
-1591 -296 1577 -299 1559 -299 ct 1532 -299 1511 -290 1495 -271 ct 1480 -253 1472 -227 1472 -195 ct 
-1472 0 l  1416 0 l  1416 -264 l  1416 -303 1415 -327 1414 -336 ct 1467 -336 l 
-1467 -335 1467 -332 1468 -327 ct 1468 -323 1468 -318 1468 -312 ct 1469 -306 1469 -295 1469 -278 ct 
-1470 -278 l  1483 -302 1498 -318 1515 -328 ct 1532 -337 1553 -342 1578 -342 ct 
-1614 -342 1641 -333 1658 -315 ct 1675 -296 1684 -266 1684 -224 ct 1684 0 l  1628 0 l 
-p ef
-1809 -156 m  1809 -118 1817 -88 1832 -67 ct 1848 -46 1872 -36 1902 -36 ct 1926 -36 1946 -41 1960 -50 ct 
-1975 -60 1985 -72 1990 -87 ct 2039 -73 l  2019 -20 1973 6 1902 6 ct 1853 6 1815 -9 1789 -38 ct 
-1763 -68 1750 -112 1750 -170 ct 1750 -226 1763 -268 1789 -298 ct 1815 -327 1852 -342 1900 -342 ct 
-1999 -342 2048 -283 2048 -164 ct 2048 -156 l  1809 -156 l  p
-1990 -199 m  1987 -234 1978 -260 1963 -277 ct 1948 -293 1927 -301 1899 -301 ct 
-1872 -301 1851 -292 1835 -274 ct 1819 -256 1810 -231 1809 -199 ct 1990 -199 l 
+gs
+0 lw 1 lj 0.171 0.378 0.601 c 23706 14102 m  24659 13099 l  ps
+gr
+gs
+0 lw 1 lj 0.171 0.378 0.601 c 24006 14102 m  24959 13099 l  ps
+gr
+gs
+0 lw 1 lj 0.171 0.378 0.601 c 24306 14102 m  25128 13237 l  ps
+gr
+gs
+0 lw 1 lj 0.171 0.378 0.601 c 24606 14102 m  25128 13553 l  ps
+gr
+gs
+0 lw 1 lj 0.171 0.378 0.601 c 24906 14102 m  25128 13868 l  ps
+gr
+gs
+0 lw 1 lj 0.007 0.007 0.007 c 22943 14434 m  24889 14434 l  ps
+gr
+gs
+0.007 0.007 0.007 c 22656 14436 m  22957 14541 l  22957 14329 l  22656 14436 l 
 p ef
-2117 1 m  2117 -460 l  2173 -460 l  2173 1 l  2117 1 l  p ef
-pom
-pum
-25376 10036 t
-295 -93 m  295 -61 283 -37 259 -20 ct 235 -3 201 6 158 6 ct 117 6 85 -1 62 -15 ct 
-39 -28 25 -50 18 -79 ct 67 -89 l  72 -71 82 -57 96 -49 ct 111 -41 132 -37 158 -37 ct 
-187 -37 207 -41 221 -50 ct 234 -58 240 -71 240 -89 ct 240 -102 236 -113 227 -121 ct 
-218 -129 203 -136 183 -141 ct 143 -152 l  111 -160 88 -168 74 -176 ct 61 -184 50 -194 42 -205 ct 
-35 -217 31 -231 31 -247 ct 31 -278 42 -301 64 -317 ct 86 -333 117 -341 159 -341 ct 
-196 -341 225 -335 247 -322 ct 269 -309 283 -288 289 -259 ct 238 -253 l  235 -268 227 -279 213 -287 ct 
-200 -295 182 -299 159 -299 ct 134 -299 115 -295 103 -288 ct 91 -280 85 -268 85 -253 ct 
-85 -243 88 -235 93 -229 ct 98 -223 105 -218 115 -213 ct 124 -209 145 -203 176 -195 ct 
-206 -188 227 -181 240 -175 ct 253 -168 263 -161 271 -154 ct 278 -146 284 -137 288 -127 ct 
-293 -117 295 -106 295 -93 ct p ef
-682 0 m  617 0 l  559 -238 l  547 -290 l  546 -281 543 -267 539 -250 ct 535 -232 514 -149 476 0 ct 
-411 0 l  317 -336 l  372 -336 l  429 -108 l  430 -103 435 -82 442 -46 ct 
-448 -69 l  518 -336 l  578 -336 l  636 -105 l  650 -46 l  660 -89 l  724 -336 l 
-778 -336 l  682 0 l  p ef
-817 -407 m  817 -460 l  873 -460 l  873 -407 l  817 -407 l  p
-817 1 m  817 -335 l  873 -335 l  873 1 l  817 1 l  p ef
-1086 -2 m  1067 3 1049 5 1029 5 ct 985 5 962 -20 962 -71 ct 962 -295 l  924 -295 l 
-924 -336 l  965 -336 l  981 -411 l  1018 -411 l  1018 -336 l  1080 -336 l 
-1080 -295 l  1018 -295 l  1018 -83 l  1018 -67 1021 -56 1026 -49 ct 1031 -43 1041 -39 1054 -39 ct 
-1061 -39 1072 -41 1086 -44 ct 1086 -2 l  p ef
-1177 -170 m  1177 -125 1184 -92 1198 -70 ct 1212 -49 1234 -38 1262 -38 ct 1282 -38 1298 -43 1312 -54 ct 
-1325 -65 1333 -81 1336 -104 ct 1393 -100 l  1388 -68 1375 -42 1352 -23 ct 1328 -4 1299 6 1263 6 ct 
-1217 6 1181 -9 1156 -39 ct 1131 -68 1119 -111 1119 -168 ct 1119 -225 1131 -268 1156 -297 ct 
-1181 -327 1217 -342 1263 -342 ct 1297 -342 1326 -333 1348 -315 ct 1371 -298 1385 -273 1391 -242 ct 
-1334 -237 l  1331 -256 1323 -271 1312 -282 ct 1300 -293 1283 -298 1261 -298 ct 
-1232 -298 1210 -288 1197 -269 ct 1184 -249 1177 -216 1177 -170 ct p ef
-1508 -278 m  1520 -299 1535 -316 1552 -326 ct 1568 -336 1590 -341 1616 -341 ct 
-1652 -341 1679 -332 1696 -314 ct 1713 -296 1722 -266 1722 -223 ct 1722 1 l  1666 1 l 
-1666 -212 l  1666 -236 1664 -253 1659 -265 ct 1655 -276 1648 -285 1638 -290 ct 
-1628 -295 1614 -298 1597 -298 ct 1570 -298 1549 -289 1534 -271 ct 1518 -253 1510 -228 1510 -197 ct 
-1510 1 l  1454 1 l  1454 -460 l  1510 -460 l  1510 -340 l  1510 -327 1509 -314 1509 -301 ct 
-1508 -287 1508 -280 1507 -278 ct 1508 -278 l  p ef
-pom
+gr
 gs
-1 lj 25186 5769 m  28422 5769 l  ps
+0.007 0.007 0.007 c 25177 14436 m  24876 14329 l  24876 14541 l  25177 14436 l 
+p ef
 gr
 gs
-24899 5769 m  25199 5869 l  25199 5669 l  24899 5769 l  p ef
+0 lw 1 lj 0.007 0.007 0.007 c 22655 15170 m  22655 14224 l  ps
 gr
 gs
-28708 5769 m  28409 5669 l  28409 5869 l  28708 5769 l  p ef
+0 lw 1 lj 0.007 0.007 0.007 c 25146 15170 m  25146 14224 l  ps
 gr
 gs
-0 lw 1 lj 24898 6469 m  24898 5569 l  ps
+0.007 0.007 0.007 c 22923 15189 m  22923 15237 22930 15271 22944 15295 ct 22958 15317 22980 15328 23008 15328 ct 
+23028 15328 23044 15323 23058 15311 ct 23072 15300 23080 15283 23083 15259 ct 
+23140 15263 l  23135 15297 23122 15324 23099 15344 ct 23075 15364 23045 15375 23009 15375 ct 
+22963 15375 22927 15359 22902 15327 ct 22877 15297 22865 15251 22865 15191 ct 
+22865 15131 22877 15085 22902 15055 ct 22927 15023 22963 15007 23009 15007 ct 
+23043 15007 23073 15017 23095 15036 ct 23118 15054 23132 15080 23138 15113 ct 
+23081 15118 l  23078 15098 23070 15082 23058 15070 ct 23046 15059 23029 15054 23007 15054 ct 
+22978 15054 22956 15064 22943 15084 ct 22930 15105 22923 15141 22923 15189 ct 
+p ef
 gr
 gs
-0 lw 1 lj 28708 6469 m  28708 5569 l  ps
+0.007 0.007 0.007 c 23254 15076 m  23266 15054 23281 15036 23298 15025 ct 23314 15014 23336 15008 23362 15008 ct 
+23399 15008 23426 15018 23443 15038 ct 23460 15057 23469 15088 23469 15134 ct 
+23469 15369 l  23413 15369 l  23413 15145 l  23413 15120 23411 15102 23406 15089 ct 
+23402 15078 23395 15068 23385 15063 ct 23375 15058 23360 15055 23343 15055 ct 
+23316 15055 23295 15064 23280 15083 ct 23264 15102 23256 15128 23256 15161 ct 
+23256 15369 l  23200 15369 l  23200 14884 l  23256 14884 l  23256 15009 l 
+23256 15024 23255 15038 23255 15051 ct 23254 15066 23254 15074 23253 15076 ct 
+23254 15076 l  p ef
 gr
-pum
-25532 4877 t
-172 -2 m  153 3 135 5 115 5 ct 71 5 48 -20 48 -71 ct 48 -295 l  10 -295 l  10 -336 l 
-51 -336 l  67 -411 l  104 -411 l  104 -336 l  166 -336 l  166 -295 l  104 -295 l 
-104 -83 l  104 -67 107 -56 112 -49 ct 117 -43 127 -39 140 -39 ct 147 -39 158 -41 172 -44 ct 
-172 -2 l  p ef
-222 0 m  222 -258 l  222 -281 221 -307 220 -336 ct 273 -336 l  275 -298 275 -275 275 -267 ct 
-277 -267 l  285 -296 296 -316 307 -326 ct 319 -337 335 -342 356 -342 ct 364 -342 371 -341 379 -339 ct 
-379 -288 l  371 -290 362 -291 349 -291 ct 326 -291 308 -281 296 -261 ct 284 -241 278 -212 278 -175 ct 
-278 0 l  222 0 l  p ef
-517 6 m  484 6 458 -3 441 -21 ct 424 -38 416 -63 416 -94 ct 416 -129 427 -155 450 -174 ct 
-473 -192 510 -202 561 -204 ct 636 -205 l  636 -223 l  636 -250 630 -270 619 -282 ct 
-607 -294 589 -299 564 -299 ct 539 -299 521 -295 510 -287 ct 498 -278 491 -265 489 -246 ct 
-431 -251 l  440 -312 485 -342 565 -342 ct 608 -342 639 -332 661 -313 ct 682 -294 693 -266 693 -229 ct 
-693 -85 l  693 -68 695 -55 699 -47 ct 703 -39 712 -35 724 -35 ct 729 -35 735 -35 742 -37 ct 
-742 -2 l  728 1 714 3 699 3 ct 678 3 663 -2 654 -13 ct 645 -24 639 -41 638 -64 ct 
-636 -64 l  622 -39 605 -21 586 -10 ct 567 1 544 6 517 6 ct p
-530 -36 m  551 -36 569 -41 585 -50 ct 601 -59 613 -72 622 -88 ct 632 -104 636 -121 636 -138 ct 
-636 -166 l  575 -165 l  549 -164 529 -161 515 -157 ct 502 -152 491 -144 484 -134 ct 
-477 -123 473 -110 473 -93 ct 473 -75 478 -61 488 -51 ct 498 -41 512 -36 530 -36 ct 
-p ef
-997 0 m  997 -213 l  997 -235 995 -252 990 -264 ct 986 -277 979 -285 970 -291 ct 
-960 -296 946 -299 928 -299 ct 901 -299 880 -290 864 -271 ct 849 -253 841 -227 841 -195 ct 
-841 0 l  785 0 l  785 -264 l  785 -303 784 -327 783 -336 ct 836 -336 l  836 -335 836 -332 837 -327 ct 
-837 -323 837 -318 837 -312 ct 838 -306 838 -295 838 -278 ct 839 -278 l  852 -302 867 -318 884 -328 ct 
-901 -337 922 -342 947 -342 ct 983 -342 1010 -333 1027 -315 ct 1044 -296 1053 -266 1053 -224 ct 
-1053 0 l  997 0 l  p ef
-1387 -93 m  1387 -61 1375 -37 1351 -20 ct 1327 -3 1293 6 1250 6 ct 1209 6 1177 -1 1154 -15 ct 
-1131 -28 1117 -50 1110 -79 ct 1159 -89 l  1164 -71 1174 -57 1188 -49 ct 1203 -41 1224 -37 1250 -37 ct 
-1279 -37 1299 -41 1313 -50 ct 1326 -58 1332 -71 1332 -89 ct 1332 -102 1328 -113 1319 -121 ct 
-1310 -129 1295 -136 1275 -141 ct 1235 -152 l  1203 -160 1180 -168 1166 -176 ct 
-1153 -184 1142 -194 1134 -205 ct 1127 -217 1123 -231 1123 -247 ct 1123 -278 1134 -301 1156 -317 ct 
-1178 -333 1209 -341 1251 -341 ct 1288 -341 1317 -335 1339 -322 ct 1361 -309 1375 -288 1381 -259 ct 
-1330 -253 l  1327 -268 1319 -279 1305 -287 ct 1292 -295 1274 -299 1251 -299 ct 
-1226 -299 1207 -295 1195 -288 ct 1183 -280 1177 -268 1177 -253 ct 1177 -243 1180 -235 1185 -229 ct 
-1190 -223 1197 -218 1207 -213 ct 1216 -209 1237 -203 1268 -195 ct 1298 -188 1319 -181 1332 -175 ct 
-1345 -168 1355 -161 1363 -154 ct 1370 -146 1376 -137 1380 -127 ct 1385 -117 1387 -106 1387 -93 ct 
-p ef
-1452 -407 m  1452 -460 l  1508 -460 l  1508 -407 l  1452 -407 l  p
-1452 1 m  1452 -335 l  1508 -335 l  1508 1 l  1452 1 l  p ef
-1721 -2 m  1702 3 1684 5 1664 5 ct 1620 5 1597 -20 1597 -71 ct 1597 -295 l  1559 -295 l 
-1559 -336 l  1600 -336 l  1616 -411 l  1653 -411 l  1653 -336 l  1715 -336 l 
-1715 -295 l  1653 -295 l  1653 -83 l  1653 -67 1656 -56 1661 -49 ct 1666 -43 1676 -39 1689 -39 ct 
-1696 -39 1707 -41 1721 -44 ct 1721 -2 l  p ef
-1769 -407 m  1769 -460 l  1825 -460 l  1825 -407 l  1769 -407 l  p
-1769 1 m  1769 -335 l  1825 -335 l  1825 1 l  1769 1 l  p ef
-2193 -168 m  2193 -110 2181 -66 2155 -37 ct 2129 -8 2091 6 2042 6 ct 1993 6 1956 -9 1931 -39 ct 
-1906 -69 1894 -112 1894 -168 ct 1894 -284 1944 -342 2044 -342 ct 2095 -342 2133 -328 2157 -300 ct 
-2181 -272 2193 -228 2193 -168 ct p
-2135 -168 m  2135 -215 2128 -248 2114 -269 ct 2101 -291 2077 -301 2045 -301 ct 
-2012 -301 1989 -290 1974 -269 ct 1960 -247 1952 -214 1952 -168 ct 1952 -124 1959 -91 1974 -69 ct 
-1988 -46 2011 -35 2042 -35 ct 2075 -35 2099 -46 2113 -68 ct 2128 -89 2135 -123 2135 -168 ct 
-p ef
-2474 0 m  2474 -213 l  2474 -235 2472 -252 2467 -264 ct 2463 -277 2456 -285 2447 -291 ct 
-2437 -296 2423 -299 2405 -299 ct 2378 -299 2357 -290 2341 -271 ct 2326 -253 2318 -227 2318 -195 ct 
-2318 0 l  2262 0 l  2262 -264 l  2262 -303 2261 -327 2260 -336 ct 2313 -336 l 
-2313 -335 2313 -332 2314 -327 ct 2314 -323 2314 -318 2314 -312 ct 2315 -306 2315 -295 2315 -278 ct 
-2316 -278 l  2329 -302 2344 -318 2361 -328 ct 2378 -337 2399 -342 2424 -342 ct 
-2460 -342 2487 -333 2504 -315 ct 2521 -296 2530 -266 2530 -224 ct 2530 0 l  2474 0 l 
+gs
+0.007 0.007 0.007 c 23636 15375 m  23603 15375 23577 15365 23559 15346 ct 23542 15328 23534 15302 23534 15269 ct 
+23534 15233 23545 15205 23569 15185 ct 23592 15166 23629 15156 23680 15154 ct 
+23755 15153 l  23755 15134 l  23755 15104 23749 15083 23738 15070 ct 23726 15058 23708 15053 23683 15053 ct 
+23658 15053 23640 15057 23629 15065 ct 23617 15075 23610 15088 23608 15108 ct 
+23549 15103 l  23558 15039 23604 15007 23684 15007 ct 23727 15007 23758 15018 23780 15038 ct 
+23801 15058 23812 15087 23812 15127 ct 23812 15279 l  23812 15297 23814 15310 23818 15319 ct 
+23822 15327 23831 15331 23843 15331 ct 23848 15331 23854 15331 23861 15329 ct 
+23861 15366 l  23847 15369 23833 15371 23818 15371 ct 23797 15371 23782 15366 23773 15355 ct 
+23764 15343 23758 15325 23757 15301 ct 23755 15301 l  23741 15327 23724 15346 23705 15358 ct 
+23686 15369 23663 15375 23636 15375 ct p
+23649 15330 m  23670 15330 23688 15325 23704 15316 ct 23720 15306 23732 15293 23741 15276 ct 
+23751 15259 23755 15241 23755 15223 ct 23755 15194 l  23694 15195 l  23668 15196 23648 15199 23634 15203 ct 
+23621 15208 23610 15217 23603 15227 ct 23596 15239 23592 15253 23592 15270 ct 
+23592 15289 23597 15304 23607 15315 ct 23617 15325 23631 15330 23649 15330 ct 
 p ef
-pom
-pum
-25973 5587 t
-255 -53 m  244 -32 231 -16 213 -7 ct 196 2 175 7 150 7 ct 108 7 77 -7 57 -36 ct 
-37 -64 27 -108 27 -166 ct 27 -283 68 -341 150 -341 ct 175 -341 197 -337 214 -327 ct 
-231 -318 244 -303 255 -283 ct 255 -283 l  255 -321 l  255 -460 l  310 -460 l 
-310 -68 l  310 -33 311 -10 312 1 ct 259 1 l  258 -3 258 -10 257 -22 ct 256 -34 256 -45 256 -53 ct 
-255 -53 l  p
-85 -167 m  85 -120 91 -87 104 -67 ct 116 -46 136 -36 164 -36 ct 196 -36 219 -47 233 -69 ct 
-247 -91 255 -125 255 -171 ct 255 -216 247 -248 233 -269 ct 219 -290 196 -300 165 -300 ct 
-137 -300 117 -290 104 -269 ct 92 -248 85 -214 85 -167 ct p ef
-437 -156 m  437 -118 445 -88 460 -67 ct 476 -46 500 -36 530 -36 ct 554 -36 574 -41 588 -50 ct 
-603 -60 613 -72 618 -87 ct 667 -73 l  647 -20 601 6 530 6 ct 481 6 443 -9 417 -38 ct 
-391 -68 378 -112 378 -170 ct 378 -226 391 -268 417 -298 ct 443 -327 480 -342 528 -342 ct 
-627 -342 676 -283 676 -164 ct 676 -156 l  437 -156 l  p
-618 -199 m  615 -234 606 -260 591 -277 ct 576 -293 555 -301 527 -301 ct 500 -301 479 -292 463 -274 ct 
-447 -256 438 -231 437 -199 ct 618 -199 l  p ef
-746 1 m  746 -460 l  802 -460 l  802 1 l  746 1 l  p ef
-970 6 m  937 6 911 -3 894 -21 ct 877 -38 869 -63 869 -94 ct 869 -129 880 -155 903 -174 ct 
-926 -192 963 -202 1014 -204 ct 1089 -205 l  1089 -223 l  1089 -250 1083 -270 1072 -282 ct 
-1060 -294 1042 -299 1017 -299 ct 992 -299 974 -295 963 -287 ct 951 -278 944 -265 942 -246 ct 
-884 -251 l  893 -312 938 -342 1018 -342 ct 1061 -342 1092 -332 1114 -313 ct 
-1135 -294 1146 -266 1146 -229 ct 1146 -85 l  1146 -68 1148 -55 1152 -47 ct 1156 -39 1165 -35 1177 -35 ct 
-1182 -35 1188 -35 1195 -37 ct 1195 -2 l  1181 1 1167 3 1152 3 ct 1131 3 1116 -2 1107 -13 ct 
-1098 -24 1092 -41 1091 -64 ct 1089 -64 l  1075 -39 1058 -21 1039 -10 ct 1020 1 997 6 970 6 ct 
-p
-983 -36 m  1004 -36 1022 -41 1038 -50 ct 1054 -59 1066 -72 1075 -88 ct 1085 -104 1089 -121 1089 -138 ct 
-1089 -166 l  1028 -165 l  1002 -164 982 -161 968 -157 ct 955 -152 944 -144 937 -134 ct 
-930 -123 926 -110 926 -93 ct 926 -75 931 -61 941 -51 ct 951 -41 965 -36 983 -36 ct 
-p ef
-1253 132 m  1238 132 1225 131 1215 129 ct 1215 87 l  1223 88 1231 89 1241 89 ct 
-1276 89 1303 63 1323 12 ct 1329 -1 l  1196 -336 l  1255 -336 l  1326 -150 l 
-1327 -147 1328 -144 1330 -140 ct 1331 -135 1336 -122 1343 -99 ct 1351 -76 1356 -63 1356 -61 ct 
-1378 -122 l  1451 -336 l  1510 -336 l  1381 0 l  1367 36 1355 63 1343 80 ct 
-1331 98 1317 111 1303 119 ct 1288 128 1272 132 1253 132 ct p ef
-pom
+gr
 gs
-1 lj 0.699 0.699 0.699 c 24898 6528 m  25407 6019 l  ps
-25018 6969 m  25968 6019 l  ps
-25579 6969 m  26529 6019 l  ps
-26140 6969 m  27090 6019 l  ps
-26701 6969 m  27651 6019 l  ps
-27262 6969 m  28212 6019 l  ps
-27823 6969 m  28684 6108 l  ps
-28384 6969 m  28684 6669 l  ps
-28264 6019 m  28684 6439 l  ps
-27703 6019 m  28653 6969 l  ps
-27142 6019 m  28092 6969 l  ps
-26581 6019 m  27531 6969 l  ps
-26020 6019 m  26970 6969 l  ps
-25459 6019 m  26409 6969 l  ps
-24898 6019 m  25848 6969 l  ps
-24898 6580 m  25287 6969 l  ps
+0.007 0.007 0.007 c 24115 15368 m  24115 15143 l  24115 15120 24113 15102 24108 15089 ct 
+24104 15076 24097 15067 24088 15061 ct 24078 15056 24063 15053 24045 15053 ct 
+24018 15053 23997 15062 23981 15082 ct 23966 15101 23958 15128 23958 15162 ct 
+23958 15368 l  23902 15368 l  23902 15089 l  23902 15048 23901 15023 23900 15014 ct 
+23953 15014 l  23953 15015 23953 15018 23954 15023 ct 23954 15027 23954 15033 23954 15039 ct 
+23955 15045 23955 15057 23955 15075 ct 23956 15075 l  23969 15049 23984 15033 24001 15022 ct 
+24018 15013 24039 15007 24064 15007 ct 24101 15007 24128 15017 24145 15036 ct 
+24162 15056 24171 15087 24171 15131 ct 24171 15368 l  24115 15368 l  p ef
 gr
 gs
-0 lw 1 lj 26791 6969 m  24897 6969 l  24897 6019 l  28684 6019 l  28684 6969 l 
-26791 6969 l  pc
+0.007 0.007 0.007 c 24467 15368 m  24467 15143 l  24467 15120 24465 15102 24460 15089 ct 
+24456 15076 24449 15067 24440 15061 ct 24430 15056 24416 15053 24398 15053 ct 
+24371 15053 24350 15062 24333 15082 ct 24318 15101 24310 15128 24310 15162 ct 
+24310 15368 l  24254 15368 l  24254 15089 l  24254 15048 24253 15023 24252 15014 ct 
+24305 15014 l  24305 15015 24305 15018 24306 15023 ct 24306 15027 24306 15033 24306 15039 ct 
+24307 15045 24307 15057 24307 15075 ct 24308 15075 l  24321 15049 24336 15033 24354 15022 ct 
+24371 15013 24392 15007 24417 15007 ct 24453 15007 24480 15017 24497 15036 ct 
+24514 15056 24523 15087 24523 15131 ct 24523 15368 l  24467 15368 l  p ef
 gr
-pum
-25205 6714 t
-223 -389 m  223 0 l  164 0 l  164 -389 l  14 -389 l  14 -437 l  373 -437 l 
-373 -389 l  223 -389 l  p ef
-734 0 m  603 -191 l  469 0 l  403 0 l  569 -227 l  416 -438 l  481 -438 l 
-603 -266 l  721 -438 l  787 -438 l  637 -229 l  799 0 l  734 0 l  p ef
-1317 -169 m  1317 -52 1276 7 1194 7 ct 1169 7 1148 2 1131 -7 ct 1114 -16 1100 -31 1090 -51 ct 
-1089 -51 l  1089 -45 1089 -35 1088 -22 ct 1087 -9 1086 -1 1086 1 ct 1032 1 l 
-1033 -10 1034 -33 1034 -68 ct 1034 -460 l  1090 -460 l  1090 -328 l  1090 -315 1089 -299 1088 -281 ct 
-1090 -281 l  1100 -302 1114 -318 1131 -327 ct 1148 -336 1169 -341 1194 -341 ct 
-1236 -341 1268 -327 1288 -298 ct 1308 -270 1317 -227 1317 -169 ct p
-1259 -167 m  1259 -214 1253 -247 1240 -268 ct 1228 -288 1208 -298 1180 -298 ct 
-1148 -298 1126 -287 1111 -266 ct 1097 -244 1090 -210 1090 -163 ct 1090 -119 1097 -87 1111 -66 ct 
-1125 -45 1148 -34 1179 -34 ct 1207 -34 1228 -45 1240 -65 ct 1253 -86 1259 -120 1259 -167 ct 
-p ef
-1385 1 m  1385 -460 l  1441 -460 l  1441 1 l  1385 1 l  p ef
-1808 -168 m  1808 -110 1796 -66 1770 -37 ct 1744 -8 1706 6 1657 6 ct 1608 6 1571 -9 1546 -39 ct 
-1521 -69 1509 -112 1509 -168 ct 1509 -284 1559 -342 1659 -342 ct 1710 -342 1748 -328 1772 -300 ct 
-1796 -272 1808 -228 1808 -168 ct p
-1750 -168 m  1750 -215 1743 -248 1729 -269 ct 1716 -291 1692 -301 1660 -301 ct 
-1627 -301 1604 -290 1589 -269 ct 1575 -247 1567 -214 1567 -168 ct 1567 -124 1574 -91 1589 -69 ct 
-1603 -46 1626 -35 1657 -35 ct 1690 -35 1714 -46 1728 -68 ct 1743 -89 1750 -123 1750 -168 ct 
-p ef
-1918 -170 m  1918 -125 1925 -92 1939 -70 ct 1953 -49 1975 -38 2003 -38 ct 2023 -38 2039 -43 2053 -54 ct 
-2066 -65 2074 -81 2077 -104 ct 2134 -100 l  2129 -68 2116 -42 2093 -23 ct 2069 -4 2040 6 2004 6 ct 
-1958 6 1922 -9 1897 -39 ct 1872 -68 1860 -111 1860 -168 ct 1860 -225 1872 -268 1897 -297 ct 
-1922 -327 1958 -342 2004 -342 ct 2038 -342 2067 -333 2089 -315 ct 2112 -298 2126 -273 2132 -242 ct 
-2075 -237 l  2072 -256 2064 -271 2053 -282 ct 2041 -293 2024 -298 2002 -298 ct 
-1973 -298 1951 -288 1938 -269 ct 1925 -249 1918 -216 1918 -170 ct p ef
-2404 1 m  2291 -153 l  2250 -119 l  2250 1 l  2194 1 l  2194 -460 l  2250 -460 l 
-2250 -172 l  2397 -335 l  2462 -335 l  2326 -191 l  2469 1 l  2404 1 l 
-p ef
-2554 -156 m  2554 -118 2562 -88 2577 -67 ct 2593 -46 2617 -36 2647 -36 ct 2671 -36 2691 -41 2705 -50 ct 
-2720 -60 2730 -72 2735 -87 ct 2784 -73 l  2764 -20 2718 6 2647 6 ct 2598 6 2560 -9 2534 -38 ct 
-2508 -68 2495 -112 2495 -170 ct 2495 -226 2508 -268 2534 -298 ct 2560 -327 2597 -342 2645 -342 ct 
-2744 -342 2793 -283 2793 -164 ct 2793 -156 l  2554 -156 l  p
-2735 -199 m  2732 -234 2723 -260 2708 -277 ct 2693 -293 2672 -301 2644 -301 ct 
-2617 -301 2596 -292 2580 -274 ct 2564 -256 2555 -231 2554 -199 ct 2735 -199 l 
-p ef
-3074 -53 m  3063 -32 3050 -16 3032 -7 ct 3015 2 2994 7 2969 7 ct 2927 7 2896 -7 2876 -36 ct 
-2856 -64 2846 -108 2846 -166 ct 2846 -283 2887 -341 2969 -341 ct 2994 -341 3016 -337 3033 -327 ct 
-3050 -318 3063 -303 3074 -283 ct 3074 -283 l  3074 -321 l  3074 -460 l  3129 -460 l 
-3129 -68 l  3129 -33 3130 -10 3131 1 ct 3078 1 l  3077 -3 3077 -10 3076 -22 ct 
-3075 -34 3075 -45 3075 -53 ct 3074 -53 l  p
-2904 -167 m  2904 -120 2910 -87 2923 -67 ct 2935 -46 2955 -36 2983 -36 ct 3015 -36 3038 -47 3052 -69 ct 
-3066 -91 3074 -125 3074 -171 ct 3074 -216 3066 -248 3052 -269 ct 3038 -290 3015 -300 2984 -300 ct 
-2956 -300 2936 -290 2923 -269 ct 2911 -248 2904 -214 2904 -167 ct p ef
-pom
 gs
-1 lj 25186 13349 m  28422 13349 l  ps
+0.007 0.007 0.007 c 24647 15204 m  24647 15244 24655 15276 24670 15298 ct 24686 15320 24710 15330 24740 15330 ct 
+24764 15330 24784 15325 24798 15316 ct 24814 15305 24824 15293 24829 15277 ct 
+24878 15291 l  24858 15347 24812 15375 24740 15375 ct 24691 15375 24653 15359 24627 15328 ct 
+24601 15297 24588 15250 24588 15189 ct 24588 15130 24601 15085 24627 15054 ct 
+24653 15023 24690 15007 24738 15007 ct 24838 15007 24887 15069 24887 15196 ct 
+24887 15204 l  24647 15204 l  p
+24829 15159 m  24826 15121 24817 15094 24802 15076 ct 24786 15059 24765 15050 24737 15050 ct 
+24710 15050 24689 15060 24673 15079 ct 24657 15098 24648 15125 24647 15159 ct 
+24829 15159 l  p ef
 gr
 gs
-24899 13349 m  25199 13449 l  25199 13249 l  24899 13349 l  p ef
+0.007 0.007 0.007 c 24955 15369 m  24955 14884 l  25012 14884 l  25012 15369 l 
+24955 15369 l  p ef
 gr
 gs
-28708 13349 m  28409 13249 l  28409 13449 l  28708 13349 l  p ef
+0.007 0.007 0.007 c 23361 16019 m  23361 16053 23349 16078 23325 16095 ct 23300 16113 23266 16122 23223 16122 ct 
+23182 16122 23150 16115 23127 16101 ct 23104 16087 23090 16064 23083 16034 ct 
+23132 16023 l  23137 16042 23147 16057 23161 16065 ct 23176 16074 23197 16078 23223 16078 ct 
+23252 16078 23272 16074 23286 16064 ct 23299 16056 23305 16042 23305 16023 ct 
+23305 16009 23301 15998 23292 15989 ct 23283 15981 23268 15974 23248 15968 ct 
+23208 15957 l  23176 15948 23153 15940 23139 15931 ct 23126 15923 23115 15913 23107 15901 ct 
+23100 15888 23096 15874 23096 15857 ct 23096 15823 23107 15799 23129 15782 ct 
+23151 15765 23182 15757 23224 15757 ct 23261 15757 23290 15763 23312 15777 ct 
+23335 15790 23349 15813 23355 15844 ct 23303 15850 l  23300 15835 23292 15822 23278 15814 ct 
+23265 15805 23247 15801 23224 15801 ct 23199 15801 23180 15805 23168 15813 ct 
+23156 15821 23150 15835 23150 15850 ct 23150 15861 23153 15869 23158 15876 ct 
+23163 15882 23170 15887 23180 15893 ct 23189 15897 23210 15903 23241 15911 ct 
+23271 15919 23292 15926 23305 15933 ct 23318 15940 23329 15947 23337 15955 ct 
+23344 15963 23350 15973 23354 15983 ct 23359 15994 23361 16005 23361 16019 ct 
+p ef
 gr
 gs
-0 lw 1 lj 24898 14048 m  24898 13148 l  ps
+0.007 0.007 0.007 c 23748 16116 m  23682 16116 l  23624 15865 l  23612 15810 l 
+23611 15820 23608 15835 23604 15853 ct 23600 15871 23579 15960 23541 16116 ct 
+23476 16116 l  23382 15762 l  23437 15762 l  23494 16003 l  23495 16008 23500 16030 23507 16068 ct 
+23513 16044 l  23583 15762 l  23643 15762 l  23702 16006 l  23716 16068 l 
+23726 16023 l  23790 15762 l  23844 15762 l  23748 16116 l  p ef
 gr
 gs
-0 lw 1 lj 28708 14048 m  28708 13148 l  ps
+0.007 0.007 0.007 c 23882 15687 m  23882 15631 l  23939 15631 l  23939 15687 l 
+23882 15687 l  p
+23882 16117 m  23882 15763 l  23939 15763 l  23939 16117 l  23882 16117 l 
+p ef
 gr
-pum
-25532 12456 t
-172 -2 m  153 3 135 5 115 5 ct 71 5 48 -20 48 -71 ct 48 -295 l  10 -295 l  10 -336 l 
-51 -336 l  67 -411 l  104 -411 l  104 -336 l  166 -336 l  166 -295 l  104 -295 l 
-104 -83 l  104 -67 107 -56 112 -49 ct 117 -43 127 -39 140 -39 ct 147 -39 158 -41 172 -44 ct 
-172 -2 l  p ef
-222 0 m  222 -258 l  222 -281 221 -307 220 -336 ct 273 -336 l  275 -298 275 -275 275 -267 ct 
-277 -267 l  285 -296 296 -316 307 -326 ct 319 -337 335 -342 356 -342 ct 364 -342 371 -341 379 -339 ct 
-379 -288 l  371 -290 362 -291 349 -291 ct 326 -291 308 -281 296 -261 ct 284 -241 278 -212 278 -175 ct 
-278 0 l  222 0 l  p ef
-517 6 m  484 6 458 -3 441 -21 ct 424 -38 416 -63 416 -94 ct 416 -129 427 -155 450 -174 ct 
-473 -192 510 -202 561 -204 ct 636 -205 l  636 -223 l  636 -250 630 -270 619 -282 ct 
-607 -294 589 -299 564 -299 ct 539 -299 521 -295 510 -287 ct 498 -278 491 -265 489 -246 ct 
-431 -251 l  440 -312 485 -342 565 -342 ct 608 -342 639 -332 661 -313 ct 682 -294 693 -266 693 -229 ct 
-693 -85 l  693 -68 695 -55 699 -47 ct 703 -39 712 -35 724 -35 ct 729 -35 735 -35 742 -37 ct 
-742 -2 l  728 1 714 3 699 3 ct 678 3 663 -2 654 -13 ct 645 -24 639 -41 638 -64 ct 
-636 -64 l  622 -39 605 -21 586 -10 ct 567 1 544 6 517 6 ct p
-530 -36 m  551 -36 569 -41 585 -50 ct 601 -59 613 -72 622 -88 ct 632 -104 636 -121 636 -138 ct 
-636 -166 l  575 -165 l  549 -164 529 -161 515 -157 ct 502 -152 491 -144 484 -134 ct 
-477 -123 473 -110 473 -93 ct 473 -75 478 -61 488 -51 ct 498 -41 512 -36 530 -36 ct 
-p ef
-997 0 m  997 -213 l  997 -235 995 -252 990 -264 ct 986 -277 979 -285 970 -291 ct 
-960 -296 946 -299 928 -299 ct 901 -299 880 -290 864 -271 ct 849 -253 841 -227 841 -195 ct 
-841 0 l  785 0 l  785 -264 l  785 -303 784 -327 783 -336 ct 836 -336 l  836 -335 836 -332 837 -327 ct 
-837 -323 837 -318 837 -312 ct 838 -306 838 -295 838 -278 ct 839 -278 l  852 -302 867 -318 884 -328 ct 
-901 -337 922 -342 947 -342 ct 983 -342 1010 -333 1027 -315 ct 1044 -296 1053 -266 1053 -224 ct 
-1053 0 l  997 0 l  p ef
-1387 -93 m  1387 -61 1375 -37 1351 -20 ct 1327 -3 1293 6 1250 6 ct 1209 6 1177 -1 1154 -15 ct 
-1131 -28 1117 -50 1110 -79 ct 1159 -89 l  1164 -71 1174 -57 1188 -49 ct 1203 -41 1224 -37 1250 -37 ct 
-1279 -37 1299 -41 1313 -50 ct 1326 -58 1332 -71 1332 -89 ct 1332 -102 1328 -113 1319 -121 ct 
-1310 -129 1295 -136 1275 -141 ct 1235 -152 l  1203 -160 1180 -168 1166 -176 ct 
-1153 -184 1142 -194 1134 -205 ct 1127 -217 1123 -231 1123 -247 ct 1123 -278 1134 -301 1156 -317 ct 
-1178 -333 1209 -341 1251 -341 ct 1288 -341 1317 -335 1339 -322 ct 1361 -309 1375 -288 1381 -259 ct 
-1330 -253 l  1327 -268 1319 -279 1305 -287 ct 1292 -295 1274 -299 1251 -299 ct 
-1226 -299 1207 -295 1195 -288 ct 1183 -280 1177 -268 1177 -253 ct 1177 -243 1180 -235 1185 -229 ct 
-1190 -223 1197 -218 1207 -213 ct 1216 -209 1237 -203 1268 -195 ct 1298 -188 1319 -181 1332 -175 ct 
-1345 -168 1355 -161 1363 -154 ct 1370 -146 1376 -137 1380 -127 ct 1385 -117 1387 -106 1387 -93 ct 
-p ef
-1452 -407 m  1452 -460 l  1508 -460 l  1508 -407 l  1452 -407 l  p
-1452 1 m  1452 -335 l  1508 -335 l  1508 1 l  1452 1 l  p ef
-1721 -2 m  1702 3 1684 5 1664 5 ct 1620 5 1597 -20 1597 -71 ct 1597 -295 l  1559 -295 l 
-1559 -336 l  1600 -336 l  1616 -411 l  1653 -411 l  1653 -336 l  1715 -336 l 
-1715 -295 l  1653 -295 l  1653 -83 l  1653 -67 1656 -56 1661 -49 ct 1666 -43 1676 -39 1689 -39 ct 
-1696 -39 1707 -41 1721 -44 ct 1721 -2 l  p ef
-1769 -407 m  1769 -460 l  1825 -460 l  1825 -407 l  1769 -407 l  p
-1769 1 m  1769 -335 l  1825 -335 l  1825 1 l  1769 1 l  p ef
-2193 -168 m  2193 -110 2181 -66 2155 -37 ct 2129 -8 2091 6 2042 6 ct 1993 6 1956 -9 1931 -39 ct 
-1906 -69 1894 -112 1894 -168 ct 1894 -284 1944 -342 2044 -342 ct 2095 -342 2133 -328 2157 -300 ct 
-2181 -272 2193 -228 2193 -168 ct p
-2135 -168 m  2135 -215 2128 -248 2114 -269 ct 2101 -291 2077 -301 2045 -301 ct 
-2012 -301 1989 -290 1974 -269 ct 1960 -247 1952 -214 1952 -168 ct 1952 -124 1959 -91 1974 -69 ct 
-1988 -46 2011 -35 2042 -35 ct 2075 -35 2099 -46 2113 -68 ct 2128 -89 2135 -123 2135 -168 ct 
-p ef
-2474 0 m  2474 -213 l  2474 -235 2472 -252 2467 -264 ct 2463 -277 2456 -285 2447 -291 ct 
-2437 -296 2423 -299 2405 -299 ct 2378 -299 2357 -290 2341 -271 ct 2326 -253 2318 -227 2318 -195 ct 
-2318 0 l  2262 0 l  2262 -264 l  2262 -303 2261 -327 2260 -336 ct 2313 -336 l 
-2313 -335 2313 -332 2314 -327 ct 2314 -323 2314 -318 2314 -312 ct 2315 -306 2315 -295 2315 -278 ct 
-2316 -278 l  2329 -302 2344 -318 2361 -328 ct 2378 -337 2399 -342 2424 -342 ct 
-2460 -342 2487 -333 2504 -315 ct 2521 -296 2530 -266 2530 -224 ct 2530 0 l  2474 0 l 
+gs
+0.007 0.007 0.007 c 24152 16114 m  24133 16119 24115 16121 24095 16121 ct 24050 16121 24027 16095 24027 16041 ct 
+24027 15805 l  23989 15805 l  23989 15762 l  24030 15762 l  24046 15683 l 
+24084 15683 l  24084 15762 l  24146 15762 l  24146 15805 l  24084 15805 l 
+24084 16028 l  24084 16045 24087 16057 24092 16064 ct 24097 16070 24107 16075 24120 16075 ct 
+24127 16075 24138 16073 24152 16069 ct 24152 16114 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 24242 15938 m  24242 15985 24249 16020 24263 16043 ct 24277 16065 24299 16077 24327 16077 ct 
+24347 16077 24363 16071 24377 16060 ct 24390 16048 24398 16031 24401 16007 ct 
+24459 16011 l  24454 16045 24441 16073 24417 16091 ct 24393 16111 24364 16122 24328 16122 ct 
+24282 16122 24246 16106 24221 16076 ct 24196 16045 24184 16000 24184 15940 ct 
+24184 15880 24196 15834 24221 15803 ct 24246 15771 24282 15756 24328 15756 ct 
+24362 15756 24391 15765 24413 15784 ct 24437 15802 24451 15828 24457 15862 ct 
+24399 15867 l  24396 15846 24388 15830 24377 15819 ct 24365 15807 24348 15802 24326 15802 ct 
+24297 15802 24275 15813 24262 15833 ct 24249 15855 24242 15889 24242 15938 ct 
 p ef
-pom
-pum
-25973 13167 t
-255 -53 m  244 -32 231 -16 213 -7 ct 196 2 175 7 150 7 ct 108 7 77 -7 57 -36 ct 
-37 -64 27 -108 27 -166 ct 27 -283 68 -341 150 -341 ct 175 -341 197 -337 214 -327 ct 
-231 -318 244 -303 255 -283 ct 255 -283 l  255 -321 l  255 -460 l  310 -460 l 
-310 -68 l  310 -33 311 -10 312 1 ct 259 1 l  258 -3 258 -10 257 -22 ct 256 -34 256 -45 256 -53 ct 
-255 -53 l  p
-85 -167 m  85 -120 91 -87 104 -67 ct 116 -46 136 -36 164 -36 ct 196 -36 219 -47 233 -69 ct 
-247 -91 255 -125 255 -171 ct 255 -216 247 -248 233 -269 ct 219 -290 196 -300 165 -300 ct 
-137 -300 117 -290 104 -269 ct 92 -248 85 -214 85 -167 ct p ef
-437 -156 m  437 -118 445 -88 460 -67 ct 476 -46 500 -36 530 -36 ct 554 -36 574 -41 588 -50 ct 
-603 -60 613 -72 618 -87 ct 667 -73 l  647 -20 601 6 530 6 ct 481 6 443 -9 417 -38 ct 
-391 -68 378 -112 378 -170 ct 378 -226 391 -268 417 -298 ct 443 -327 480 -342 528 -342 ct 
-627 -342 676 -283 676 -164 ct 676 -156 l  437 -156 l  p
-618 -199 m  615 -234 606 -260 591 -277 ct 576 -293 555 -301 527 -301 ct 500 -301 479 -292 463 -274 ct 
-447 -256 438 -231 437 -199 ct 618 -199 l  p ef
-746 1 m  746 -460 l  802 -460 l  802 1 l  746 1 l  p ef
-970 6 m  937 6 911 -3 894 -21 ct 877 -38 869 -63 869 -94 ct 869 -129 880 -155 903 -174 ct 
-926 -192 963 -202 1014 -204 ct 1089 -205 l  1089 -223 l  1089 -250 1083 -270 1072 -282 ct 
-1060 -294 1042 -299 1017 -299 ct 992 -299 974 -295 963 -287 ct 951 -278 944 -265 942 -246 ct 
-884 -251 l  893 -312 938 -342 1018 -342 ct 1061 -342 1092 -332 1114 -313 ct 
-1135 -294 1146 -266 1146 -229 ct 1146 -85 l  1146 -68 1148 -55 1152 -47 ct 1156 -39 1165 -35 1177 -35 ct 
-1182 -35 1188 -35 1195 -37 ct 1195 -2 l  1181 1 1167 3 1152 3 ct 1131 3 1116 -2 1107 -13 ct 
-1098 -24 1092 -41 1091 -64 ct 1089 -64 l  1075 -39 1058 -21 1039 -10 ct 1020 1 997 6 970 6 ct 
-p
-983 -36 m  1004 -36 1022 -41 1038 -50 ct 1054 -59 1066 -72 1075 -88 ct 1085 -104 1089 -121 1089 -138 ct 
-1089 -166 l  1028 -165 l  1002 -164 982 -161 968 -157 ct 955 -152 944 -144 937 -134 ct 
-930 -123 926 -110 926 -93 ct 926 -75 931 -61 941 -51 ct 951 -41 965 -36 983 -36 ct 
-p ef
-1253 132 m  1238 132 1225 131 1215 129 ct 1215 87 l  1223 88 1231 89 1241 89 ct 
-1276 89 1303 63 1323 12 ct 1329 -1 l  1196 -336 l  1255 -336 l  1326 -150 l 
-1327 -147 1328 -144 1330 -140 ct 1331 -135 1336 -122 1343 -99 ct 1351 -76 1356 -63 1356 -61 ct 
-1378 -122 l  1451 -336 l  1510 -336 l  1381 0 l  1367 36 1355 63 1343 80 ct 
-1331 98 1317 111 1303 119 ct 1288 128 1272 132 1253 132 ct p ef
-pom
+gr
 gs
-1 lj 0.699 0.699 0.699 c 13699 15278 m  14208 14769 l  ps
-13820 15718 m  14769 14769 l  ps
-14381 15718 m  15330 14769 l  ps
-14942 15718 m  15891 14769 l  ps
-15503 15718 m  16452 14769 l  ps
-16064 15718 m  17013 14769 l  ps
-16625 15718 m  17574 14769 l  ps
-17186 15718 m  18135 14769 l  ps
-17747 15718 m  18696 14769 l  ps
-18308 15718 m  19257 14769 l  ps
-18869 15718 m  19818 14769 l  ps
-19430 15718 m  20379 14769 l  ps
-19991 15718 m  20940 14769 l  ps
-20552 15718 m  21501 14769 l  ps
-21113 15718 m  22062 14769 l  ps
-21674 15718 m  22623 14769 l  ps
-22235 15718 m  23184 14769 l  ps
-22796 15718 m  23745 14769 l  ps
-23357 15718 m  24306 14769 l  ps
-23918 15718 m  24867 14769 l  ps
-24479 15718 m  24899 15298 l  ps
-24358 14769 m  24899 15310 l  ps
-23797 14769 m  24746 15718 l  ps
-23236 14769 m  24185 15718 l  ps
-22675 14769 m  23624 15718 l  ps
-22114 14769 m  23063 15718 l  ps
-21553 14769 m  22502 15718 l  ps
-20992 14769 m  21941 15718 l  ps
-20431 14769 m  21380 15718 l  ps
-19870 14769 m  20819 15718 l  ps
-19309 14769 m  20258 15718 l  ps
-18748 14769 m  19697 15718 l  ps
-18187 14769 m  19136 15718 l  ps
-17626 14769 m  18575 15718 l  ps
-17065 14769 m  18014 15718 l  ps
-16504 14769 m  17453 15718 l  ps
-15943 14769 m  16892 15718 l  ps
-15382 14769 m  16331 15718 l  ps
-14821 14769 m  15770 15718 l  ps
-14260 14769 m  15209 15718 l  ps
-13699 14769 m  14648 15718 l  ps
-13699 15330 m  14087 15718 l  ps
+0.007 0.007 0.007 c 24573 15823 m  24585 15801 24600 15783 24617 15773 ct 24633 15762 24655 15757 24681 15757 ct 
+24718 15757 24745 15766 24762 15785 ct 24779 15804 24788 15836 24788 15881 ct 
+24788 16117 l  24732 16117 l  24732 15893 l  24732 15867 24730 15849 24725 15837 ct 
+24721 15825 24714 15816 24704 15810 ct 24693 15805 24679 15802 24662 15802 ct 
+24635 15802 24614 15811 24599 15830 ct 24583 15849 24575 15876 24575 15908 ct 
+24575 16117 l  24519 16117 l  24519 15631 l  24575 15631 l  24575 15758 l 
+24575 15771 24574 15785 24574 15799 ct 24573 15814 24573 15821 24572 15823 ct 
+24573 15823 l  p ef
 gr
 gs
-0 lw 1 lj 19298 15718 m  13699 15718 l  13699 14768 l  24898 14768 l  24898 15718 l 
-19298 15718 l  pc
+0 lw 1 lj 0.007 0.007 0.007 c 22875 3627 m  26110 3627 l  ps
 gr
-pum
-17713 15463 t
-223 -389 m  223 0 l  164 0 l  164 -389 l  14 -389 l  14 -437 l  373 -437 l 
-373 -389 l  223 -389 l  p ef
-734 0 m  603 -191 l  469 0 l  403 0 l  569 -227 l  416 -438 l  481 -438 l 
-603 -266 l  721 -438 l  787 -438 l  637 -229 l  799 0 l  734 0 l  p ef
-1317 -169 m  1317 -52 1276 7 1194 7 ct 1169 7 1148 2 1131 -7 ct 1114 -16 1100 -31 1090 -51 ct 
-1089 -51 l  1089 -45 1089 -35 1088 -22 ct 1087 -9 1086 -1 1086 1 ct 1032 1 l 
-1033 -10 1034 -33 1034 -68 ct 1034 -460 l  1090 -460 l  1090 -328 l  1090 -315 1089 -299 1088 -281 ct 
-1090 -281 l  1100 -302 1114 -318 1131 -327 ct 1148 -336 1169 -341 1194 -341 ct 
-1236 -341 1268 -327 1288 -298 ct 1308 -270 1317 -227 1317 -169 ct p
-1259 -167 m  1259 -214 1253 -247 1240 -268 ct 1228 -288 1208 -298 1180 -298 ct 
-1148 -298 1126 -287 1111 -266 ct 1097 -244 1090 -210 1090 -163 ct 1090 -119 1097 -87 1111 -66 ct 
-1125 -45 1148 -34 1179 -34 ct 1207 -34 1228 -45 1240 -65 ct 1253 -86 1259 -120 1259 -167 ct 
-p ef
-1385 1 m  1385 -460 l  1441 -460 l  1441 1 l  1385 1 l  p ef
-1808 -168 m  1808 -110 1796 -66 1770 -37 ct 1744 -8 1706 6 1657 6 ct 1608 6 1571 -9 1546 -39 ct 
-1521 -69 1509 -112 1509 -168 ct 1509 -284 1559 -342 1659 -342 ct 1710 -342 1748 -328 1772 -300 ct 
-1796 -272 1808 -228 1808 -168 ct p
-1750 -168 m  1750 -215 1743 -248 1729 -269 ct 1716 -291 1692 -301 1660 -301 ct 
-1627 -301 1604 -290 1589 -269 ct 1575 -247 1567 -214 1567 -168 ct 1567 -124 1574 -91 1589 -69 ct 
-1603 -46 1626 -35 1657 -35 ct 1690 -35 1714 -46 1728 -68 ct 1743 -89 1750 -123 1750 -168 ct 
-p ef
-1918 -170 m  1918 -125 1925 -92 1939 -70 ct 1953 -49 1975 -38 2003 -38 ct 2023 -38 2039 -43 2053 -54 ct 
-2066 -65 2074 -81 2077 -104 ct 2134 -100 l  2129 -68 2116 -42 2093 -23 ct 2069 -4 2040 6 2004 6 ct 
-1958 6 1922 -9 1897 -39 ct 1872 -68 1860 -111 1860 -168 ct 1860 -225 1872 -268 1897 -297 ct 
-1922 -327 1958 -342 2004 -342 ct 2038 -342 2067 -333 2089 -315 ct 2112 -298 2126 -273 2132 -242 ct 
-2075 -237 l  2072 -256 2064 -271 2053 -282 ct 2041 -293 2024 -298 2002 -298 ct 
-1973 -298 1951 -288 1938 -269 ct 1925 -249 1918 -216 1918 -170 ct p ef
-2404 1 m  2291 -153 l  2250 -119 l  2250 1 l  2194 1 l  2194 -460 l  2250 -460 l 
-2250 -172 l  2397 -335 l  2462 -335 l  2326 -191 l  2469 1 l  2404 1 l 
-p ef
-2554 -156 m  2554 -118 2562 -88 2577 -67 ct 2593 -46 2617 -36 2647 -36 ct 2671 -36 2691 -41 2705 -50 ct 
-2720 -60 2730 -72 2735 -87 ct 2784 -73 l  2764 -20 2718 6 2647 6 ct 2598 6 2560 -9 2534 -38 ct 
-2508 -68 2495 -112 2495 -170 ct 2495 -226 2508 -268 2534 -298 ct 2560 -327 2597 -342 2645 -342 ct 
-2744 -342 2793 -283 2793 -164 ct 2793 -156 l  2554 -156 l  p
-2735 -199 m  2732 -234 2723 -260 2708 -277 ct 2693 -293 2672 -301 2644 -301 ct 
-2617 -301 2596 -292 2580 -274 ct 2564 -256 2555 -231 2554 -199 ct 2735 -199 l 
-p ef
-3074 -53 m  3063 -32 3050 -16 3032 -7 ct 3015 2 2994 7 2969 7 ct 2927 7 2896 -7 2876 -36 ct 
-2856 -64 2846 -108 2846 -166 ct 2846 -283 2887 -341 2969 -341 ct 2994 -341 3016 -337 3033 -327 ct 
-3050 -318 3063 -303 3074 -283 ct 3074 -283 l  3074 -321 l  3074 -460 l  3129 -460 l 
-3129 -68 l  3129 -33 3130 -10 3131 1 ct 3078 1 l  3077 -3 3077 -10 3076 -22 ct 
-3075 -34 3075 -45 3075 -53 ct 3074 -53 l  p
-2904 -167 m  2904 -120 2910 -87 2923 -67 ct 2935 -46 2955 -36 2983 -36 ct 3015 -36 3038 -47 3052 -69 ct 
-3066 -91 3074 -125 3074 -171 ct 3074 -216 3066 -248 3052 -269 ct 3038 -290 3015 -300 2984 -300 ct 
-2956 -300 2936 -290 2923 -269 ct 2911 -248 2904 -214 2904 -167 ct p ef
-pom
 gs
-1 lj 0.699 0.699 0.699 c 5720 7678 m  6229 7169 l  ps
-5840 8119 m  6790 7169 l  ps
-6401 8119 m  7351 7169 l  ps
-6962 8119 m  7912 7169 l  ps
-7523 8119 m  8473 7169 l  ps
-8084 8119 m  9034 7169 l  ps
-8645 8119 m  9595 7169 l  ps
-9206 8119 m  10156 7169 l  ps
-9767 8119 m  10717 7169 l  ps
-10328 8119 m  11278 7169 l  ps
-10889 8119 m  11519 7489 l  ps
-11450 8119 m  11519 8050 l  ps
-11330 7169 m  11519 7358 l  ps
-10769 7169 m  11519 7919 l  ps
-10208 7169 m  11158 8119 l  ps
-9647 7169 m  10597 8119 l  ps
-9086 7169 m  10036 8119 l  ps
-8525 7169 m  9475 8119 l  ps
-7964 7169 m  8914 8119 l  ps
-7403 7169 m  8353 8119 l  ps
-6842 7169 m  7792 8119 l  ps
-6281 7169 m  7231 8119 l  ps
-5720 7169 m  6670 8119 l  ps
-5720 7730 m  6109 8119 l  ps
+0.007 0.007 0.007 c 22588 3627 m  22889 3734 l  22889 3523 l  22588 3627 l 
+p ef
 gr
 gs
-0 lw 1 lj 8619 8119 m  5719 8119 l  5719 7169 l  11519 7169 l  11519 8119 l 
-8619 8119 l  pc
+0.007 0.007 0.007 c 26397 3627 m  26098 3523 l  26098 3734 l  26397 3627 l 
+p ef
 gr
-pum
-7034 7864 t
-223 -389 m  223 0 l  164 0 l  164 -389 l  14 -389 l  14 -437 l  373 -437 l 
-373 -389 l  223 -389 l  p ef
-734 0 m  603 -191 l  469 0 l  403 0 l  569 -227 l  416 -438 l  481 -438 l 
-603 -266 l  721 -438 l  787 -438 l  637 -229 l  799 0 l  734 0 l  p ef
-1317 -169 m  1317 -52 1276 7 1194 7 ct 1169 7 1148 2 1131 -7 ct 1114 -16 1100 -31 1090 -51 ct 
-1089 -51 l  1089 -45 1089 -35 1088 -22 ct 1087 -9 1086 -1 1086 1 ct 1032 1 l 
-1033 -10 1034 -33 1034 -68 ct 1034 -460 l  1090 -460 l  1090 -328 l  1090 -315 1089 -299 1088 -281 ct 
-1090 -281 l  1100 -302 1114 -318 1131 -327 ct 1148 -336 1169 -341 1194 -341 ct 
-1236 -341 1268 -327 1288 -298 ct 1308 -270 1317 -227 1317 -169 ct p
-1259 -167 m  1259 -214 1253 -247 1240 -268 ct 1228 -288 1208 -298 1180 -298 ct 
-1148 -298 1126 -287 1111 -266 ct 1097 -244 1090 -210 1090 -163 ct 1090 -119 1097 -87 1111 -66 ct 
-1125 -45 1148 -34 1179 -34 ct 1207 -34 1228 -45 1240 -65 ct 1253 -86 1259 -120 1259 -167 ct 
-p ef
-1385 1 m  1385 -460 l  1441 -460 l  1441 1 l  1385 1 l  p ef
-1808 -168 m  1808 -110 1796 -66 1770 -37 ct 1744 -8 1706 6 1657 6 ct 1608 6 1571 -9 1546 -39 ct 
-1521 -69 1509 -112 1509 -168 ct 1509 -284 1559 -342 1659 -342 ct 1710 -342 1748 -328 1772 -300 ct 
-1796 -272 1808 -228 1808 -168 ct p
-1750 -168 m  1750 -215 1743 -248 1729 -269 ct 1716 -291 1692 -301 1660 -301 ct 
-1627 -301 1604 -290 1589 -269 ct 1575 -247 1567 -214 1567 -168 ct 1567 -124 1574 -91 1589 -69 ct 
-1603 -46 1626 -35 1657 -35 ct 1690 -35 1714 -46 1728 -68 ct 1743 -89 1750 -123 1750 -168 ct 
-p ef
-1918 -170 m  1918 -125 1925 -92 1939 -70 ct 1953 -49 1975 -38 2003 -38 ct 2023 -38 2039 -43 2053 -54 ct 
-2066 -65 2074 -81 2077 -104 ct 2134 -100 l  2129 -68 2116 -42 2093 -23 ct 2069 -4 2040 6 2004 6 ct 
-1958 6 1922 -9 1897 -39 ct 1872 -68 1860 -111 1860 -168 ct 1860 -225 1872 -268 1897 -297 ct 
-1922 -327 1958 -342 2004 -342 ct 2038 -342 2067 -333 2089 -315 ct 2112 -298 2126 -273 2132 -242 ct 
-2075 -237 l  2072 -256 2064 -271 2053 -282 ct 2041 -293 2024 -298 2002 -298 ct 
-1973 -298 1951 -288 1938 -269 ct 1925 -249 1918 -216 1918 -170 ct p ef
-2404 1 m  2291 -153 l  2250 -119 l  2250 1 l  2194 1 l  2194 -460 l  2250 -460 l 
-2250 -172 l  2397 -335 l  2462 -335 l  2326 -191 l  2469 1 l  2404 1 l 
-p ef
-2554 -156 m  2554 -118 2562 -88 2577 -67 ct 2593 -46 2617 -36 2647 -36 ct 2671 -36 2691 -41 2705 -50 ct 
-2720 -60 2730 -72 2735 -87 ct 2784 -73 l  2764 -20 2718 6 2647 6 ct 2598 6 2560 -9 2534 -38 ct 
-2508 -68 2495 -112 2495 -170 ct 2495 -226 2508 -268 2534 -298 ct 2560 -327 2597 -342 2645 -342 ct 
-2744 -342 2793 -283 2793 -164 ct 2793 -156 l  2554 -156 l  p
-2735 -199 m  2732 -234 2723 -260 2708 -277 ct 2693 -293 2672 -301 2644 -301 ct 
-2617 -301 2596 -292 2580 -274 ct 2564 -256 2555 -231 2554 -199 ct 2735 -199 l 
-p ef
-3074 -53 m  3063 -32 3050 -16 3032 -7 ct 3015 2 2994 7 2969 7 ct 2927 7 2896 -7 2876 -36 ct 
-2856 -64 2846 -108 2846 -166 ct 2846 -283 2887 -341 2969 -341 ct 2994 -341 3016 -337 3033 -327 ct 
-3050 -318 3063 -303 3074 -283 ct 3074 -283 l  3074 -321 l  3074 -460 l  3129 -460 l 
-3129 -68 l  3129 -33 3130 -10 3131 1 ct 3078 1 l  3077 -3 3077 -10 3076 -22 ct 
-3075 -34 3075 -45 3075 -53 ct 3074 -53 l  p
-2904 -167 m  2904 -120 2910 -87 2923 -67 ct 2935 -46 2955 -36 2983 -36 ct 3015 -36 3038 -47 3052 -69 ct 
-3066 -91 3074 -125 3074 -171 ct 3074 -216 3066 -248 3052 -269 ct 3038 -290 3015 -300 2984 -300 ct 
-2956 -300 2936 -290 2923 -269 ct 2911 -248 2904 -214 2904 -167 ct p ef
-pom
 gs
-0.507 0.832 0.105 c 30399 16038 m  29299 16038 l  29299 14769 l  31499 14769 l 
-31499 16038 l  30399 16038 l  p ef
+0 lw 1 lj 0.007 0.007 0.007 c 22587 4364 m  22587 3417 l  ps
 gr
 gs
-0 lw 1 lj 0.207 0.398 0.644 c 30399 16038 m  29299 16038 l  29299 14768 l 
-31499 14768 l  31499 16038 l  30399 16038 l  pc
+0 lw 1 lj 0.007 0.007 0.007 c 26396 4364 m  26396 3417 l  ps
 gr
-pum
-29767 15623 t
-361 -1 m  247 -182 l  111 -182 l  111 -1 l  52 -1 l  52 -437 l  258 -437 l 
-307 -437 345 -426 372 -404 ct 398 -382 412 -352 412 -313 ct 412 -280 402 -253 383 -231 ct 
-364 -209 338 -195 305 -189 ct 429 -1 l  361 -1 l  p
-352 -312 m  352 -337 344 -357 326 -370 ct 309 -383 284 -390 252 -390 ct 111 -390 l 
-111 -229 l  254 -229 l  285 -229 310 -236 327 -251 ct 344 -265 352 -286 352 -312 ct 
-p ef
-672 -389 m  672 0 l  613 0 l  613 -389 l  463 -389 l  463 -437 l  822 -437 l 
-822 -389 l  672 -389 l  p ef
-1232 -121 m  1232 -81 1217 -49 1185 -27 ct 1154 -5 1109 6 1052 6 ct 945 6 884 -31 867 -105 ct 
-924 -117 l  931 -90 945 -71 966 -59 ct 988 -46 1017 -40 1054 -40 ct 1092 -40 1122 -47 1143 -60 ct 
-1163 -73 1174 -92 1174 -118 ct 1174 -132 1171 -144 1164 -153 ct 1158 -161 1148 -169 1137 -175 ct 
-1125 -180 1111 -185 1094 -189 ct 1078 -193 1060 -197 1040 -202 ct 1006 -210 979 -217 962 -225 ct 
-944 -233 930 -241 919 -250 ct 909 -260 901 -271 896 -284 ct 890 -296 887 -311 887 -327 ct 
-887 -364 902 -393 930 -414 ct 959 -434 1000 -444 1053 -444 ct 1103 -444 1141 -436 1167 -421 ct 
-1193 -406 1212 -380 1222 -343 ct 1164 -333 l  1157 -356 1145 -373 1127 -384 ct 
-1109 -394 1084 -399 1053 -399 ct 1018 -399 991 -394 973 -382 ct 954 -370 945 -353 945 -330 ct 
-945 -317 949 -306 956 -297 ct 963 -288 973 -281 987 -274 ct 1000 -268 1027 -261 1067 -252 ct 
-1080 -249 1094 -246 1107 -242 ct 1120 -239 1133 -235 1145 -231 ct 1157 -226 1169 -221 1180 -215 ct 
-1190 -209 1199 -202 1207 -193 ct 1215 -185 1221 -174 1226 -163 ct 1230 -151 1232 -137 1232 -121 ct 
+gs
+0.007 0.007 0.007 c 23394 2688 m  23375 2694 23357 2696 23337 2696 ct 23293 2696 23270 2669 23270 2616 ct 
+23270 2380 l  23231 2380 l  23231 2337 l  23273 2337 l  23289 2258 l  23326 2258 l 
+23326 2337 l  23388 2337 l  23388 2380 l  23326 2380 l  23326 2603 l  23326 2620 23329 2632 23334 2639 ct 
+23339 2645 23349 2649 23362 2649 ct 23369 2649 23380 2647 23394 2644 ct 23394 2688 l 
 p ef
-pom
+gr
 gs
-1 lj 25126 16288 m  37051 16288 l  ps
+0.007 0.007 0.007 c 23443 2691 m  23443 2420 l  23443 2396 23442 2368 23441 2338 ct 
+23495 2338 l  23497 2378 23497 2402 23497 2411 ct 23499 2411 l  23507 2380 23518 2359 23529 2348 ct 
+23541 2337 23557 2331 23578 2331 ct 23586 2331 23593 2332 23601 2335 ct 23601 2388 l 
+23593 2386 23584 2385 23571 2385 ct 23548 2385 23530 2396 23518 2417 ct 23506 2438 23500 2467 23500 2506 ct 
+23500 2691 l  23443 2691 l  p ef
 gr
 gs
-24839 16288 m  25139 16388 l  25139 16188 l  24839 16288 l  p ef
+0.007 0.007 0.007 c 23738 2697 m  23705 2697 23679 2687 23662 2668 ct 23645 2651 23637 2624 23637 2592 ct 
+23637 2555 23648 2527 23671 2507 ct 23694 2488 23731 2478 23782 2477 ct 23857 2475 l 
+23857 2456 l  23857 2428 23851 2407 23840 2395 ct 23828 2382 23810 2377 23785 2377 ct 
+23760 2377 23742 2381 23731 2389 ct 23719 2399 23712 2413 23710 2433 ct 23652 2427 l 
+23661 2362 23706 2331 23786 2331 ct 23829 2331 23860 2341 23882 2361 ct 23904 2382 23915 2412 23915 2449 ct 
+23915 2601 l  23915 2619 23917 2633 23921 2641 ct 23925 2649 23934 2654 23946 2654 ct 
+23951 2654 23957 2654 23964 2652 ct 23964 2688 l  23950 2692 23936 2694 23921 2694 ct 
+23900 2694 23884 2688 23875 2677 ct 23866 2665 23860 2647 23859 2623 ct 23857 2623 l 
+23843 2649 23826 2668 23807 2680 ct 23788 2692 23765 2697 23738 2697 ct p
+23751 2653 m  23772 2653 23790 2647 23806 2638 ct 23822 2628 23834 2615 23843 2598 ct 
+23853 2581 23857 2563 23857 2545 ct 23857 2516 l  23796 2517 l  23770 2518 23750 2521 23736 2525 ct 
+23723 2531 23712 2539 23705 2549 ct 23698 2561 23694 2575 23694 2593 ct 23694 2612 23699 2626 23709 2637 ct 
+23719 2647 23733 2653 23751 2653 ct p ef
 gr
 gs
-37338 16288 m  37038 16188 l  37038 16388 l  37338 16288 l  p ef
+0.007 0.007 0.007 c 24219 2691 m  24219 2467 l  24219 2444 24217 2426 24212 2414 ct 
+24208 2400 24201 2392 24192 2385 ct 24182 2380 24168 2377 24150 2377 ct 24123 2377 24102 2386 24086 2406 ct 
+24070 2425 24062 2453 24062 2485 ct 24062 2691 l  24006 2691 l  24006 2414 l 
+24006 2373 24005 2347 24004 2338 ct 24057 2338 l  24057 2339 24057 2342 24058 2347 ct 
+24058 2352 24058 2357 24058 2363 ct 24059 2369 24059 2381 24059 2399 ct 24060 2399 l 
+24073 2374 24089 2357 24106 2346 ct 24123 2337 24144 2331 24169 2331 ct 24205 2331 24232 2341 24249 2360 ct 
+24266 2380 24275 2412 24275 2456 ct 24275 2691 l  24219 2691 l  p ef
 gr
 gs
-0 lw 1 lj 24838 16988 m  24838 16088 l  ps
+0.007 0.007 0.007 c 24609 2593 m  24609 2626 24597 2652 24573 2669 ct 24549 2687 24515 2697 24472 2697 ct 
+24431 2697 24398 2689 24375 2675 ct 24352 2661 24338 2638 24331 2607 ct 24380 2597 l 
+24385 2616 24395 2631 24409 2639 ct 24424 2647 24446 2652 24472 2652 ct 24501 2652 24521 2647 24535 2638 ct 
+24548 2629 24554 2616 24554 2597 ct 24554 2583 24550 2572 24541 2563 ct 24532 2555 24517 2547 24497 2542 ct 
+24457 2531 l  24424 2522 24401 2514 24387 2505 ct 24374 2497 24363 2486 24355 2475 ct 
+24348 2462 24344 2448 24344 2432 ct 24344 2399 24355 2375 24377 2357 ct 24399 2340 24431 2332 24473 2332 ct 
+24510 2332 24539 2338 24561 2352 ct 24583 2365 24597 2388 24603 2419 ct 24552 2425 l 
+24549 2409 24541 2398 24527 2389 ct 24514 2381 24496 2377 24473 2377 ct 24448 2377 24429 2381 24416 2388 ct 
+24404 2397 24398 2409 24398 2425 ct 24398 2436 24401 2444 24406 2449 ct 24411 2456 24418 2461 24429 2467 ct 
+24438 2471 24459 2477 24490 2485 ct 24520 2493 24541 2500 24554 2506 ct 24567 2514 24577 2521 24585 2528 ct 
+24592 2537 24598 2546 24602 2557 ct 24607 2567 24609 2579 24609 2593 ct p ef
 gr
 gs
-0 lw 1 lj 37338 16988 m  37338 16088 l  ps
+0.007 0.007 0.007 c 24673 2262 m  24673 2206 l  24730 2206 l  24730 2262 l 
+24673 2262 l  p
+24673 2692 m  24673 2338 l  24730 2338 l  24730 2692 l  24673 2692 l  p ef
 gr
-pum
-28449 16935 t
-424 0 m  424 -292 l  424 -324 424 -355 426 -385 ct 416 -348 407 -319 399 -298 ct 
-286 0 l  245 0 l  130 -298 l  113 -351 l  103 -385 l  104 -351 l  105 -292 l 
-105 0 l  52 0 l  52 -438 l  130 -438 l  246 -134 l  250 -122 254 -109 258 -95 ct 
-262 -81 264 -71 266 -65 ct 267 -73 271 -85 276 -102 ct 281 -119 285 -130 287 -134 ct 
-401 -438 l  477 -438 l  477 0 l  424 0 l  p ef
-615 -156 m  615 -118 623 -88 638 -67 ct 654 -46 678 -36 708 -36 ct 732 -36 752 -41 766 -50 ct 
-781 -60 791 -72 796 -87 ct 845 -73 l  825 -20 779 6 708 6 ct 659 6 621 -9 595 -38 ct 
-569 -68 556 -112 556 -170 ct 556 -226 569 -268 595 -298 ct 621 -327 658 -342 706 -342 ct 
-805 -342 854 -283 854 -164 ct 854 -156 l  615 -156 l  p
-796 -199 m  793 -234 784 -260 769 -277 ct 754 -293 733 -301 705 -301 ct 678 -301 657 -292 641 -274 ct 
-625 -256 616 -231 615 -199 ct 796 -199 l  p ef
-1136 -53 m  1125 -32 1112 -16 1094 -7 ct 1077 2 1056 7 1031 7 ct 989 7 958 -7 938 -36 ct 
-918 -64 908 -108 908 -166 ct 908 -283 949 -341 1031 -341 ct 1056 -341 1078 -337 1095 -327 ct 
-1112 -318 1125 -303 1136 -283 ct 1136 -283 l  1136 -321 l  1136 -460 l  1191 -460 l 
-1191 -68 l  1191 -33 1192 -10 1193 1 ct 1140 1 l  1139 -3 1139 -10 1138 -22 ct 
-1137 -34 1137 -45 1137 -53 ct 1136 -53 l  p
-966 -167 m  966 -120 972 -87 985 -67 ct 997 -46 1017 -36 1045 -36 ct 1077 -36 1100 -47 1114 -69 ct 
-1128 -91 1136 -125 1136 -171 ct 1136 -216 1128 -248 1114 -269 ct 1100 -290 1077 -300 1046 -300 ct 
-1018 -300 998 -290 985 -269 ct 973 -248 966 -214 966 -167 ct p ef
-1274 -407 m  1274 -460 l  1330 -460 l  1330 -407 l  1274 -407 l  p
-1274 1 m  1274 -335 l  1330 -335 l  1330 1 l  1274 1 l  p ef
-1469 -336 m  1469 -123 l  1469 -101 1472 -84 1476 -72 ct 1480 -59 1487 -51 1497 -45 ct 
-1506 -40 1520 -37 1539 -37 ct 1565 -37 1587 -46 1602 -65 ct 1618 -83 1625 -109 1625 -141 ct 
-1625 -336 l  1681 -336 l  1681 -72 l  1681 -33 1682 -9 1683 0 ct 1630 0 l 
-1630 -1 1630 -4 1630 -9 ct 1629 -13 1629 -18 1629 -24 ct 1629 -30 1628 -41 1628 -58 ct 
-1627 -58 l  1614 -34 1599 -18 1582 -8 ct 1566 1 1545 6 1520 6 ct 1483 6 1456 -3 1439 -21 ct 
-1422 -40 1413 -70 1413 -112 ct 1413 -336 l  1469 -336 l  p ef
-1961 0 m  1961 -213 l  1961 -245 1957 -268 1948 -280 ct 1939 -293 1923 -299 1900 -299 ct 
-1876 -299 1857 -290 1843 -272 ct 1829 -253 1823 -228 1823 -195 ct 1823 0 l  1767 0 l 
-1767 -264 l  1767 -303 1766 -327 1765 -336 ct 1818 -336 l  1818 -335 1818 -332 1819 -327 ct 
-1819 -323 1819 -318 1819 -312 ct 1820 -306 1820 -295 1820 -278 ct 1821 -278 l 
-1833 -302 1847 -319 1863 -328 ct 1878 -337 1897 -342 1919 -342 ct 1945 -342 1965 -337 1980 -327 ct 
-1994 -317 2005 -301 2010 -278 ct 2011 -278 l  2023 -301 2037 -317 2053 -327 ct 
-2070 -337 2090 -342 2113 -342 ct 2147 -342 2172 -333 2187 -314 ct 2202 -296 2210 -266 2210 -224 ct 
-2210 0 l  2155 0 l  2155 -213 l  2155 -245 2150 -268 2142 -280 ct 2133 -293 2117 -299 2094 -299 ct 
-2069 -299 2050 -290 2037 -272 ct 2023 -254 2016 -228 2016 -195 ct 2016 0 l  1961 0 l 
-p ef
-2646 -121 m  2646 -81 2631 -49 2599 -27 ct 2568 -5 2523 6 2466 6 ct 2359 6 2298 -31 2281 -105 ct 
-2338 -117 l  2345 -90 2359 -71 2380 -59 ct 2402 -46 2431 -40 2468 -40 ct 2506 -40 2536 -47 2557 -60 ct 
-2577 -73 2588 -92 2588 -118 ct 2588 -132 2585 -144 2578 -153 ct 2572 -161 2562 -169 2551 -175 ct 
-2539 -180 2525 -185 2508 -189 ct 2492 -193 2474 -197 2454 -202 ct 2420 -210 2393 -217 2376 -225 ct 
-2358 -233 2344 -241 2333 -250 ct 2323 -260 2315 -271 2310 -284 ct 2304 -296 2301 -311 2301 -327 ct 
-2301 -364 2316 -393 2344 -414 ct 2373 -434 2414 -444 2467 -444 ct 2517 -444 2555 -436 2581 -421 ct 
-2607 -406 2626 -380 2636 -343 ct 2578 -333 l  2571 -356 2559 -373 2541 -384 ct 
-2523 -394 2498 -399 2467 -399 ct 2432 -399 2405 -394 2387 -382 ct 2368 -370 2359 -353 2359 -330 ct 
-2359 -317 2363 -306 2370 -297 ct 2377 -288 2387 -281 2401 -274 ct 2414 -268 2441 -261 2481 -252 ct 
-2494 -249 2508 -246 2521 -242 ct 2534 -239 2547 -235 2559 -231 ct 2571 -226 2583 -221 2594 -215 ct 
-2604 -209 2613 -202 2621 -193 ct 2629 -185 2635 -174 2640 -163 ct 2644 -151 2646 -137 2646 -121 ct 
-p ef
-2734 132 m  2719 132 2706 131 2696 129 ct 2696 87 l  2704 88 2712 89 2722 89 ct 
-2757 89 2784 63 2804 12 ct 2810 -1 l  2677 -336 l  2736 -336 l  2807 -150 l 
-2808 -147 2809 -144 2811 -140 ct 2812 -135 2817 -122 2824 -99 ct 2832 -76 2837 -63 2837 -61 ct 
-2859 -122 l  2932 -336 l  2991 -336 l  2862 0 l  2848 36 2836 63 2824 80 ct 
-2812 98 2798 111 2784 119 ct 2769 128 2753 132 2734 132 ct p ef
-3249 0 m  3249 -213 l  3249 -235 3247 -252 3242 -264 ct 3238 -277 3231 -285 3222 -291 ct 
-3212 -296 3198 -299 3180 -299 ct 3153 -299 3132 -290 3116 -271 ct 3101 -253 3093 -227 3093 -195 ct 
-3093 0 l  3037 0 l  3037 -264 l  3037 -303 3036 -327 3035 -336 ct 3088 -336 l 
-3088 -335 3088 -332 3089 -327 ct 3089 -323 3089 -318 3089 -312 ct 3090 -306 3090 -295 3090 -278 ct 
-3091 -278 l  3104 -302 3119 -318 3136 -328 ct 3153 -337 3174 -342 3199 -342 ct 
-3235 -342 3262 -333 3279 -315 ct 3296 -296 3305 -266 3305 -224 ct 3305 0 l  3249 0 l 
-p ef
-3429 -170 m  3429 -125 3436 -92 3450 -70 ct 3464 -49 3486 -38 3514 -38 ct 3534 -38 3550 -43 3564 -54 ct 
-3577 -65 3585 -81 3588 -104 ct 3645 -100 l  3640 -68 3627 -42 3604 -23 ct 3580 -4 3551 6 3515 6 ct 
-3469 6 3433 -9 3408 -39 ct 3383 -68 3371 -111 3371 -168 ct 3371 -225 3383 -268 3408 -297 ct 
-3433 -327 3469 -342 3515 -342 ct 3549 -342 3578 -333 3600 -315 ct 3623 -298 3637 -273 3643 -242 ct 
-3586 -237 l  3583 -256 3575 -271 3564 -282 ct 3552 -293 3535 -298 3513 -298 ct 
-3484 -298 3462 -288 3449 -269 ct 3436 -249 3429 -216 3429 -170 ct p ef
-4090 -223 m  4090 -178 4081 -139 4064 -105 ct 4046 -71 4021 -45 3989 -27 ct 
-3957 -9 3920 0 3877 0 ct 3714 0 l  3714 -437 l  3859 -437 l  3933 -437 3990 -419 4030 -382 ct 
-4070 -345 4090 -292 4090 -223 ct p
-4031 -223 m  4031 -277 4016 -319 3986 -347 ct 3957 -376 3914 -390 3857 -390 ct 
-3773 -390 l  3773 -47 l  3871 -47 l  3903 -47 3931 -55 3955 -69 ct 3979 -83 3998 -103 4011 -129 ct 
-4024 -156 4031 -187 4031 -223 ct p ef
-4205 -156 m  4205 -118 4213 -88 4228 -67 ct 4244 -46 4268 -36 4298 -36 ct 4322 -36 4342 -41 4356 -50 ct 
-4371 -60 4381 -72 4386 -87 ct 4435 -73 l  4415 -20 4369 6 4298 6 ct 4249 6 4211 -9 4185 -38 ct 
-4159 -68 4146 -112 4146 -170 ct 4146 -226 4159 -268 4185 -298 ct 4211 -327 4248 -342 4296 -342 ct 
-4395 -342 4444 -283 4444 -164 ct 4444 -156 l  4205 -156 l  p
-4386 -199 m  4383 -234 4374 -260 4359 -277 ct 4344 -293 4323 -301 4295 -301 ct 
-4268 -301 4247 -292 4231 -274 ct 4215 -256 4206 -231 4205 -199 ct 4386 -199 l 
-p ef
-4513 1 m  4513 -460 l  4569 -460 l  4569 1 l  4513 1 l  p ef
-4738 6 m  4705 6 4679 -3 4662 -21 ct 4645 -38 4637 -63 4637 -94 ct 4637 -129 4648 -155 4671 -174 ct 
-4694 -192 4731 -202 4782 -204 ct 4857 -205 l  4857 -223 l  4857 -250 4851 -270 4840 -282 ct 
-4828 -294 4810 -299 4785 -299 ct 4760 -299 4742 -295 4731 -287 ct 4719 -278 4712 -265 4710 -246 ct 
-4652 -251 l  4661 -312 4706 -342 4786 -342 ct 4829 -342 4860 -332 4882 -313 ct 
-4903 -294 4914 -266 4914 -229 ct 4914 -85 l  4914 -68 4916 -55 4920 -47 ct 4924 -39 4933 -35 4945 -35 ct 
-4950 -35 4956 -35 4963 -37 ct 4963 -2 l  4949 1 4935 3 4920 3 ct 4899 3 4884 -2 4875 -13 ct 
-4866 -24 4860 -41 4859 -64 ct 4857 -64 l  4843 -39 4826 -21 4807 -10 ct 4788 1 4765 6 4738 6 ct 
-p
-4751 -36 m  4772 -36 4790 -41 4806 -50 ct 4822 -59 4834 -72 4843 -88 ct 4853 -104 4857 -121 4857 -138 ct 
-4857 -166 l  4796 -165 l  4770 -164 4750 -161 4736 -157 ct 4723 -152 4712 -144 4705 -134 ct 
-4698 -123 4694 -110 4694 -93 ct 4694 -75 4699 -61 4709 -51 ct 4719 -41 4733 -36 4751 -36 ct 
-p ef
-5020 132 m  5005 132 4992 131 4982 129 ct 4982 87 l  4990 88 4998 89 5008 89 ct 
-5043 89 5070 63 5090 12 ct 5096 -1 l  4963 -336 l  5022 -336 l  5093 -150 l 
-5094 -147 5095 -144 5097 -140 ct 5098 -135 5103 -122 5110 -99 ct 5118 -76 5123 -63 5123 -61 ct 
-5145 -122 l  5218 -336 l  5277 -336 l  5148 0 l  5134 36 5122 63 5110 80 ct 
-5098 98 5084 111 5070 119 ct 5055 128 5039 132 5020 132 ct p ef
-pom
 gs
-0.507 0.832 0.105 c 33250 16038 m  32150 16038 l  32150 14769 l  34350 14769 l 
-34350 16038 l  33250 16038 l  p ef
+0.007 0.007 0.007 c 24943 2688 m  24924 2694 24906 2696 24886 2696 ct 24841 2696 24818 2669 24818 2616 ct 
+24818 2380 l  24780 2380 l  24780 2337 l  24821 2337 l  24837 2258 l  24874 2258 l 
+24874 2337 l  24937 2337 l  24937 2380 l  24874 2380 l  24874 2603 l  24874 2620 24878 2632 24883 2639 ct 
+24888 2645 24898 2649 24911 2649 ct 24918 2649 24929 2647 24943 2644 ct 24943 2688 l 
+p ef
 gr
 gs
-0 lw 1 lj 0.207 0.398 0.644 c 33250 16038 m  32150 16038 l  32150 14768 l 
-34350 14768 l  34350 16038 l  33250 16038 l  pc
+0.007 0.007 0.007 c 24990 2262 m  24990 2206 l  25047 2206 l  25047 2262 l 
+24990 2262 l  p
+24990 2692 m  24990 2338 l  25047 2338 l  25047 2692 l  24990 2692 l  p ef
 gr
-pum
-32618 15623 t
-361 -1 m  247 -182 l  111 -182 l  111 -1 l  52 -1 l  52 -437 l  258 -437 l 
-307 -437 345 -426 372 -404 ct 398 -382 412 -352 412 -313 ct 412 -280 402 -253 383 -231 ct 
-364 -209 338 -195 305 -189 ct 429 -1 l  361 -1 l  p
-352 -312 m  352 -337 344 -357 326 -370 ct 309 -383 284 -390 252 -390 ct 111 -390 l 
-111 -229 l  254 -229 l  285 -229 310 -236 327 -251 ct 344 -265 352 -286 352 -312 ct 
-p ef
-672 -389 m  672 0 l  613 0 l  613 -389 l  463 -389 l  463 -437 l  822 -437 l 
-822 -389 l  672 -389 l  p ef
-1232 -121 m  1232 -81 1217 -49 1185 -27 ct 1154 -5 1109 6 1052 6 ct 945 6 884 -31 867 -105 ct 
-924 -117 l  931 -90 945 -71 966 -59 ct 988 -46 1017 -40 1054 -40 ct 1092 -40 1122 -47 1143 -60 ct 
-1163 -73 1174 -92 1174 -118 ct 1174 -132 1171 -144 1164 -153 ct 1158 -161 1148 -169 1137 -175 ct 
-1125 -180 1111 -185 1094 -189 ct 1078 -193 1060 -197 1040 -202 ct 1006 -210 979 -217 962 -225 ct 
-944 -233 930 -241 919 -250 ct 909 -260 901 -271 896 -284 ct 890 -296 887 -311 887 -327 ct 
-887 -364 902 -393 930 -414 ct 959 -434 1000 -444 1053 -444 ct 1103 -444 1141 -436 1167 -421 ct 
-1193 -406 1212 -380 1222 -343 ct 1164 -333 l  1157 -356 1145 -373 1127 -384 ct 
-1109 -394 1084 -399 1053 -399 ct 1018 -399 991 -394 973 -382 ct 954 -370 945 -353 945 -330 ct 
-945 -317 949 -306 956 -297 ct 963 -288 973 -281 987 -274 ct 1000 -268 1027 -261 1067 -252 ct 
-1080 -249 1094 -246 1107 -242 ct 1120 -239 1133 -235 1145 -231 ct 1157 -226 1169 -221 1180 -215 ct 
-1190 -209 1199 -202 1207 -193 ct 1215 -185 1221 -174 1226 -163 ct 1230 -151 1232 -137 1232 -121 ct 
+gs
+0.007 0.007 0.007 c 25415 2514 m  25415 2575 25403 2621 25377 2652 ct 25351 2682 25313 2697 25264 2697 ct 
+25215 2697 25177 2681 25152 2649 ct 25127 2618 25115 2573 25115 2514 ct 25115 2393 25165 2331 25266 2331 ct 
+25317 2331 25355 2345 25379 2376 ct 25403 2405 25415 2452 25415 2514 ct p
+25357 2514 m  25357 2464 25350 2431 25336 2408 ct 25323 2385 25299 2374 25267 2374 ct 
+25234 2374 25211 2386 25196 2408 ct 25182 2432 25173 2465 25173 2514 ct 25173 2560 25180 2595 25196 2618 ct 
+25210 2642 25233 2654 25264 2654 ct 25297 2654 25321 2642 25335 2619 ct 25350 2597 25357 2561 25357 2514 ct 
 p ef
-pom
+gr
 gs
-0.507 0.832 0.105 c 36099 16038 m  34999 16038 l  34999 14769 l  37199 14769 l 
-37199 16038 l  36099 16038 l  p ef
+0.007 0.007 0.007 c 25696 2691 m  25696 2467 l  25696 2444 25694 2426 25688 2414 ct 
+25684 2400 25677 2392 25668 2385 ct 25658 2380 25644 2377 25626 2377 ct 25599 2377 25578 2386 25562 2406 ct 
+25547 2425 25539 2453 25539 2485 ct 25539 2691 l  25483 2691 l  25483 2414 l 
+25483 2373 25482 2347 25481 2338 ct 25534 2338 l  25534 2339 25534 2342 25535 2347 ct 
+25535 2352 25535 2357 25535 2363 ct 25536 2369 25536 2381 25536 2399 ct 25537 2399 l 
+25550 2374 25565 2357 25582 2346 ct 25599 2337 25620 2331 25645 2331 ct 25681 2331 25709 2341 25726 2360 ct 
+25743 2380 25752 2412 25752 2456 ct 25752 2691 l  25696 2691 l  p ef
 gr
 gs
-0 lw 1 lj 0.207 0.398 0.644 c 36099 16038 m  34999 16038 l  34999 14768 l 
-37199 14768 l  37199 16038 l  36099 16038 l  pc
+0.007 0.007 0.007 c 23918 3382 m  23907 3404 23894 3421 23876 3431 ct 23859 3440 23838 3445 23813 3445 ct 
+23771 3445 23740 3431 23720 3400 ct 23699 3371 23689 3324 23689 3263 ct 23689 3139 23731 3078 23813 3078 ct 
+23838 3078 23860 3082 23877 3093 ct 23894 3102 23907 3118 23918 3139 ct 23918 3099 l 
+23918 2953 l  23973 2953 l  23973 3366 l  23973 3403 23974 3427 23975 3439 ct 
+23922 3439 l  23921 3435 23921 3427 23920 3415 ct 23919 3402 23919 3391 23919 3382 ct 
+23918 3382 l  p
+23748 3262 m  23748 3312 23754 3346 23767 3367 ct 23779 3389 23799 3400 23827 3400 ct 
+23859 3400 23882 3388 23896 3365 ct 23910 3342 23918 3306 23918 3258 ct 23918 3211 23910 3176 23896 3154 ct 
+23882 3132 23859 3121 23828 3121 ct 23800 3121 23780 3132 23767 3154 ct 23755 3176 23748 3213 23748 3262 ct 
+p ef
 gr
-pum
-35467 15623 t
-361 -1 m  247 -182 l  111 -182 l  111 -1 l  52 -1 l  52 -437 l  258 -437 l 
-307 -437 345 -426 372 -404 ct 398 -382 412 -352 412 -313 ct 412 -280 402 -253 383 -231 ct 
-364 -209 338 -195 305 -189 ct 429 -1 l  361 -1 l  p
-352 -312 m  352 -337 344 -357 326 -370 ct 309 -383 284 -390 252 -390 ct 111 -390 l 
-111 -229 l  254 -229 l  285 -229 310 -236 327 -251 ct 344 -265 352 -286 352 -312 ct 
-p ef
-672 -389 m  672 0 l  613 0 l  613 -389 l  463 -389 l  463 -437 l  822 -437 l 
-822 -389 l  672 -389 l  p ef
-1232 -121 m  1232 -81 1217 -49 1185 -27 ct 1154 -5 1109 6 1052 6 ct 945 6 884 -31 867 -105 ct 
-924 -117 l  931 -90 945 -71 966 -59 ct 988 -46 1017 -40 1054 -40 ct 1092 -40 1122 -47 1143 -60 ct 
-1163 -73 1174 -92 1174 -118 ct 1174 -132 1171 -144 1164 -153 ct 1158 -161 1148 -169 1137 -175 ct 
-1125 -180 1111 -185 1094 -189 ct 1078 -193 1060 -197 1040 -202 ct 1006 -210 979 -217 962 -225 ct 
-944 -233 930 -241 919 -250 ct 909 -260 901 -271 896 -284 ct 890 -296 887 -311 887 -327 ct 
-887 -364 902 -393 930 -414 ct 959 -434 1000 -444 1053 -444 ct 1103 -444 1141 -436 1167 -421 ct 
-1193 -406 1212 -380 1222 -343 ct 1164 -333 l  1157 -356 1145 -373 1127 -384 ct 
-1109 -394 1084 -399 1053 -399 ct 1018 -399 991 -394 973 -382 ct 954 -370 945 -353 945 -330 ct 
-945 -317 949 -306 956 -297 ct 963 -288 973 -281 987 -274 ct 1000 -268 1027 -261 1067 -252 ct 
-1080 -249 1094 -246 1107 -242 ct 1120 -239 1133 -235 1145 -231 ct 1157 -226 1169 -221 1180 -215 ct 
-1190 -209 1199 -202 1207 -193 ct 1215 -185 1221 -174 1226 -163 ct 1230 -151 1232 -137 1232 -121 ct 
+gs
+0.007 0.007 0.007 c 24099 3274 m  24099 3314 24107 3345 24122 3367 ct 24138 3389 24162 3400 24192 3400 ct 
+24217 3400 24237 3395 24251 3385 ct 24266 3375 24276 3362 24281 3346 ct 24330 3361 l 
+24310 3417 24264 3444 24192 3444 ct 24143 3444 24105 3428 24079 3398 ct 24053 3366 24040 3320 24040 3259 ct 
+24040 3200 24053 3156 24079 3124 ct 24105 3093 24142 3077 24190 3077 ct 24290 3077 24339 3140 24339 3265 ct 
+24339 3274 l  24099 3274 l  p
+24281 3228 m  24278 3192 24269 3164 24254 3146 ct 24239 3129 24218 3121 24189 3121 ct 
+24162 3121 24141 3131 24125 3149 ct 24109 3168 24100 3195 24099 3228 ct 24281 3228 l 
 p ef
-pom
+gr
 gs
-0 lw 1 lj 2292 14665 m  37534 14665 l  ps
+0.007 0.007 0.007 c 24408 3439 m  24408 2953 l  24465 2953 l  24465 3439 l 
+24408 3439 l  p ef
 gr
 gs
-0.933 0.933 0.933 c 9859 9844 m  9860 9844 l  9679 9844 9501 9857 9345 9882 ct 
-9189 9907 9059 9944 8968 9987 ct 8878 10031 8830 10080 8830 10130 ct 8830 10344 l 
-8830 10559 l  8830 10850 l  8830 11065 l  8830 11279 l  8830 11280 l  8830 11330 8878 11379 8968 11423 ct 
-9059 11466 9189 11503 9345 11528 ct 9501 11553 9679 11566 9860 11566 ct 10631 11566 l 
-11404 11566 l  12454 11566 l  13227 11566 l  13999 11566 l  13999 11566 l 
-14180 11566 14358 11553 14515 11528 ct 14671 11503 14801 11466 14892 11423 ct 
-14982 11379 15030 11330 15030 11280 ct 15030 11065 l  15030 10850 l  15030 10559 l 
-15030 10344 l  15030 10130 l  15030 10130 l  15030 10130 l  15030 10080 14982 10031 14892 9987 ct 
-14801 9944 14671 9907 14515 9882 ct 14358 9857 14180 9844 13999 9844 ct 13703 8954 l 
-12454 9844 l  11404 9844 l  10631 9844 l  9859 9844 l  p ef
-gr
-gs
-0 lw 1 lj 9859 9844 m  9860 9844 l  9679 9844 9501 9857 9344 9882 ct 9188 9907 9058 9944 8967 9987 ct 
-8877 10030 8829 10079 8829 10129 ct 8829 10343 l  8829 10558 l  8829 10849 l 
-8829 11064 l  8829 11278 l  8829 11279 l  8829 11329 8877 11378 8967 11422 ct 
-9058 11465 9188 11502 9344 11527 ct 9501 11552 9679 11565 9860 11565 ct 10631 11565 l 
-11404 11565 l  12454 11565 l  13227 11565 l  13999 11565 l  13999 11565 l 
-14180 11565 14358 11552 14515 11527 ct 14671 11502 14801 11465 14892 11422 ct 
-14982 11378 15030 11329 15030 11279 ct 15030 11064 l  15030 10849 l  15030 10558 l 
-15030 10343 l  15030 10129 l  15030 10129 l  15030 10129 l  15030 10079 14982 10030 14892 9987 ct 
-14801 9944 14671 9907 14515 9882 ct 14358 9857 14180 9844 13999 9844 ct 13703 8954 l 
-12454 9844 l  11404 9844 l  10631 9844 l  9859 9844 l  pc
+0.007 0.007 0.007 c 24633 3444 m  24600 3444 24574 3435 24557 3416 ct 24540 3398 24531 3372 24531 3339 ct 
+24531 3302 24543 3275 24566 3255 ct 24589 3236 24626 3225 24677 3223 ct 24752 3222 l 
+24752 3203 l  24752 3175 24746 3154 24735 3141 ct 24723 3128 24705 3123 24680 3123 ct 
+24655 3123 24637 3127 24626 3136 ct 24614 3145 24607 3159 24605 3179 ct 24547 3174 l 
+24556 3109 24601 3077 24681 3077 ct 24724 3077 24755 3087 24777 3108 ct 24798 3128 24809 3158 24809 3197 ct 
+24809 3348 l  24809 3366 24811 3380 24815 3388 ct 24819 3397 24828 3401 24840 3401 ct 
+24845 3401 24851 3401 24858 3399 ct 24858 3436 l  24844 3439 24830 3441 24815 3441 ct 
+24794 3441 24779 3436 24770 3424 ct 24761 3413 24755 3395 24754 3371 ct 24752 3371 l 
+24738 3397 24721 3416 24702 3427 ct 24683 3439 24660 3444 24633 3444 ct p
+24646 3400 m  24667 3400 24685 3395 24701 3385 ct 24717 3376 24729 3362 24738 3345 ct 
+24748 3328 24752 3311 24752 3293 ct 24752 3263 l  24691 3264 l  24665 3265 24645 3268 24631 3273 ct 
+24618 3278 24607 3286 24600 3297 ct 24593 3308 24589 3322 24589 3340 ct 24589 3359 24594 3374 24604 3384 ct 
+24614 3395 24628 3400 24646 3400 ct p ef
 gr
-pum
-9322 10585 t
-321 -1 m  277 -114 l  100 -114 l  56 -1 l  1 -1 l  159 -389 l  219 -389 l 
-375 -1 l  321 -1 l  p
-189 -349 m  186 -342 l  182 -326 175 -307 166 -283 ct 116 -155 l  261 -155 l 
-212 -283 l  206 -296 201 -310 196 -326 ct 189 -349 l  p ef
-463 -298 m  463 -109 l  463 -89 465 -74 469 -63 ct 473 -52 479 -44 488 -40 ct 
-496 -35 509 -32 525 -32 ct 549 -32 568 -41 581 -57 ct 595 -73 602 -96 602 -125 ct 
-602 -298 l  652 -298 l  652 -63 l  652 -28 652 -7 653 0 ct 606 0 l  606 0 606 -3 606 -7 ct 
-606 -11 605 -16 605 -21 ct 605 -26 605 -36 604 -51 ct 603 -51 l  592 -30 579 -15 564 -7 ct 
-549 2 530 6 508 6 ct 475 6 451 -2 436 -18 ct 421 -35 414 -62 414 -99 ct 414 -298 l 
-463 -298 l  p ef
-911 0 m  830 -122 l  750 0 l  696 0 l  802 -153 l  701 -298 l  756 -298 l 
-830 -182 l  904 -298 l  960 -298 l  859 -154 l  966 0 l  911 0 l  p ef
-1476 -271 m  1476 -234 1464 -205 1441 -184 ct 1417 -162 1384 -151 1343 -151 ct 
-1229 -151 l  1229 1 l  1176 1 l  1176 -388 l  1340 -388 l  1383 -388 1417 -378 1441 -358 ct 
-1465 -337 1476 -308 1476 -271 ct p
-1424 -271 m  1424 -321 1393 -346 1333 -346 ct 1229 -346 l  1229 -193 l  1335 -193 l 
-1394 -193 1424 -219 1424 -271 ct p ef
-1816 0 m  1816 -180 l  1606 -180 l  1606 0 l  1553 0 l  1553 -389 l  1606 -389 l 
-1606 -224 l  1816 -224 l  1816 -389 l  1868 -389 l  1868 0 l  1816 0 l 
-p ef
-2127 -161 m  2127 0 l  2075 0 l  2075 -161 l  1925 -389 l  1983 -389 l 
-2101 -203 l  2219 -389 l  2277 -389 l  2127 -161 l  p ef
-2696 -82 m  2696 -54 2685 -32 2664 -17 ct 2643 -2 2613 6 2575 6 ct 2538 6 2509 0 2489 -12 ct 
-2469 -25 2456 -44 2450 -70 ct 2493 -78 l  2498 -62 2506 -50 2520 -43 ct 2533 -36 2551 -32 2575 -32 ct 
-2600 -32 2618 -36 2630 -43 ct 2642 -51 2647 -63 2647 -78 ct 2647 -90 2643 -99 2635 -107 ct 
-2627 -114 2614 -120 2596 -125 ct 2561 -134 l  2532 -142 2512 -149 2500 -156 ct 
-2488 -163 2479 -172 2472 -182 ct 2465 -192 2462 -204 2462 -219 ct 2462 -246 2471 -267 2491 -281 ct 
-2510 -295 2538 -303 2575 -303 ct 2608 -303 2634 -297 2654 -285 ct 2673 -274 2685 -255 2690 -229 ct 
-2646 -224 l  2643 -237 2636 -247 2624 -254 ct 2612 -261 2595 -265 2575 -265 ct 
-2553 -265 2536 -262 2526 -255 ct 2515 -248 2510 -238 2510 -224 ct 2510 -215 2512 -208 2516 -203 ct 
-2521 -197 2527 -193 2536 -189 ct 2545 -185 2563 -180 2590 -173 ct 2617 -166 2636 -160 2647 -155 ct 
-2659 -149 2668 -143 2675 -136 ct 2681 -129 2686 -121 2690 -112 ct 2694 -103 2696 -93 2696 -82 ct 
-p ef
-2794 -138 m  2794 -104 2801 -78 2815 -59 ct 2829 -41 2850 -31 2877 -31 ct 2899 -31 2916 -36 2929 -44 ct 
-2942 -53 2951 -64 2955 -77 ct 2999 -65 l  2981 -18 2940 6 2877 6 ct 2833 6 2800 -7 2777 -33 ct 
-2753 -60 2742 -99 2742 -151 ct 2742 -200 2753 -238 2777 -264 ct 2800 -291 2832 -304 2875 -304 ct 
-2963 -304 3007 -251 3007 -145 ct 3007 -138 l  2794 -138 l  p
-2955 -176 m  2953 -208 2945 -231 2931 -245 ct 2918 -260 2899 -267 2874 -267 ct 
-2850 -267 2831 -259 2817 -243 ct 2803 -227 2796 -204 2795 -176 ct 2955 -176 l 
-p ef
-3258 0 m  3258 -189 l  3258 -209 3256 -224 3252 -235 ct 3249 -246 3242 -254 3234 -258 ct 
-3226 -263 3213 -266 3197 -266 ct 3173 -266 3154 -257 3140 -241 ct 3127 -225 3120 -202 3120 -173 ct 
-3120 0 l  3070 0 l  3070 -235 l  3070 -270 3070 -291 3068 -298 ct 3115 -298 l 
-3115 -298 3116 -295 3116 -291 ct 3116 -287 3116 -282 3117 -277 ct 3117 -272 3117 -262 3117 -247 ct 
-3118 -247 l  3130 -268 3143 -283 3158 -291 ct 3173 -300 3191 -304 3214 -304 ct 
-3246 -304 3270 -296 3285 -280 ct 3300 -263 3308 -236 3308 -199 ct 3308 0 l  3258 0 l 
-p ef
-3570 -48 m  3561 -28 3549 -15 3534 -6 ct 3518 2 3500 6 3477 6 ct 3440 6 3412 -7 3394 -32 ct 
-3377 -57 3368 -96 3368 -147 ct 3368 -252 3404 -304 3477 -304 ct 3500 -304 3519 -300 3534 -291 ct 
-3549 -283 3561 -270 3570 -252 ct 3571 -252 l  3570 -285 l  3570 -409 l  3620 -409 l 
-3620 -61 l  3620 -30 3620 -9 3621 0 ct 3574 0 l  3573 -2 3573 -9 3572 -20 ct 
-3572 -31 3571 -40 3571 -48 ct 3570 -48 l  p
-3420 -149 m  3420 -107 3425 -77 3436 -59 ct 3447 -41 3465 -32 3490 -32 ct 3518 -32 3538 -42 3551 -62 ct 
-3564 -81 3570 -111 3570 -152 ct 3570 -192 3564 -221 3551 -239 ct 3538 -258 3518 -267 3491 -267 ct 
-3466 -267 3448 -258 3436 -239 ct 3425 -221 3420 -191 3420 -149 ct p ef
-3920 -82 m  3920 -54 3909 -32 3888 -17 ct 3867 -2 3837 6 3799 6 ct 3762 6 3733 0 3713 -12 ct 
-3693 -25 3680 -44 3674 -70 ct 3717 -78 l  3722 -62 3730 -50 3744 -43 ct 3757 -36 3775 -32 3799 -32 ct 
-3824 -32 3842 -36 3854 -43 ct 3866 -51 3871 -63 3871 -78 ct 3871 -90 3867 -99 3859 -107 ct 
-3851 -114 3838 -120 3820 -125 ct 3785 -134 l  3756 -142 3736 -149 3724 -156 ct 
-3712 -163 3703 -172 3696 -182 ct 3689 -192 3686 -204 3686 -219 ct 3686 -246 3695 -267 3715 -281 ct 
-3734 -295 3762 -303 3799 -303 ct 3832 -303 3858 -297 3878 -285 ct 3897 -274 3909 -255 3914 -229 ct 
-3870 -224 l  3867 -237 3860 -247 3848 -254 ct 3836 -261 3819 -265 3799 -265 ct 
-3777 -265 3760 -262 3750 -255 ct 3739 -248 3734 -238 3734 -224 ct 3734 -215 3736 -208 3740 -203 ct 
-3745 -197 3751 -193 3760 -189 ct 3769 -185 3787 -180 3814 -173 ct 3841 -166 3860 -160 3871 -155 ct 
-3883 -149 3892 -143 3899 -136 ct 3905 -129 3910 -121 3914 -112 ct 3918 -103 3920 -93 3920 -82 ct 
-p ef
-4419 1 m  4318 -161 l  4197 -161 l  4197 1 l  4144 1 l  4144 -388 l  4327 -388 l 
-4371 -388 4404 -378 4428 -359 ct 4452 -339 4464 -312 4464 -277 ct 4464 -248 4455 -224 4439 -204 ct 
-4422 -185 4399 -172 4369 -167 ct 4479 1 l  4419 1 l  p
-4411 -277 m  4411 -299 4403 -316 4388 -328 ct 4373 -340 4350 -346 4322 -346 ct 
-4197 -346 l  4197 -203 l  4324 -203 l  4352 -203 4373 -209 4388 -222 ct 4403 -235 4411 -253 4411 -277 ct 
-p ef
-4694 -346 m  4694 -1 l  4642 -1 l  4642 -346 l  4509 -346 l  4509 -389 l 
-4828 -389 l  4828 -346 l  4694 -346 l  p ef
-5189 -107 m  5189 -71 5175 -43 5147 -24 ct 5119 -4 5080 6 5029 6 ct 4934 6 4880 -27 4865 -93 ct 
-4916 -103 l  4921 -80 4934 -62 4953 -52 ct 4972 -41 4998 -35 5031 -35 ct 5065 -35 5091 -41 5110 -53 ct 
-5128 -64 5137 -81 5137 -104 ct 5137 -117 5134 -127 5129 -135 ct 5123 -143 5115 -149 5104 -155 ct 
-5094 -160 5081 -164 5067 -168 ct 5052 -171 5036 -175 5019 -179 ct 4988 -186 4965 -192 4949 -199 ct 
-4933 -206 4920 -214 4911 -222 ct 4902 -230 4895 -240 4890 -251 ct 4885 -263 4883 -275 4883 -290 ct 
-4883 -323 4896 -349 4921 -367 ct 4946 -385 4983 -394 5030 -394 ct 5074 -394 5108 -387 5131 -374 ct 
-5155 -360 5171 -337 5180 -305 ct 5128 -296 l  5123 -316 5112 -331 5096 -340 ct 
-5080 -350 5058 -354 5030 -354 ct 4999 -354 4975 -349 4959 -339 ct 4942 -329 4934 -313 4934 -293 ct 
-4934 -281 4937 -271 4944 -263 ct 4950 -255 4959 -249 4971 -243 ct 4983 -238 5007 -231 5042 -223 ct 
-5054 -220 5066 -218 5078 -215 ct 5090 -212 5101 -209 5112 -205 ct 5123 -201 5133 -196 5142 -191 ct 
-5152 -185 5160 -179 5167 -171 ct 5174 -163 5179 -154 5183 -144 ct 5187 -133 5189 -121 5189 -107 ct 
+gs
+0.007 0.007 0.007 c 24916 3577 m  24901 3577 24888 3576 24877 3574 ct 24877 3529 l 
+24886 3531 24894 3532 24904 3532 ct 24939 3532 24966 3504 24986 3451 ct 24992 3437 l 
+24858 3083 l  24918 3083 l  24989 3280 l  24990 3283 24991 3286 24993 3291 ct 
+24994 3296 24999 3309 25006 3334 ct 25014 3358 25019 3372 25019 3374 ct 25041 3309 l 
+25114 3083 l  25173 3083 l  25044 3438 l  25030 3476 25018 3504 25006 3522 ct 
+24994 3541 24980 3555 24966 3563 ct 24951 3573 24935 3577 24916 3577 ct p ef
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 22587 4427 m  23097 3890 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 22707 4890 m  23658 3890 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 23268 4890 m  24219 3890 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 23829 4890 m  24780 3890 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 24390 4890 m  25341 3890 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 24951 4890 m  25902 3890 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 25512 4890 m  26373 3984 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 26072 4890 m  26373 4574 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 25953 3890 m  26373 4333 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 25392 3890 m  26342 4890 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 24831 3890 m  25782 4890 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 24270 3890 m  25221 4890 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 23709 3890 m  24660 4890 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 23148 3890 m  24099 4890 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 22587 3890 m  23538 4890 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 22587 4481 m  22977 4890 l  ps
+gr
+gs
+0 lw 1 lj 0.007 0.007 0.007 c 24480 4890 m  22586 4890 l  22586 3890 l  26373 3890 l 
+26373 4890 l  24480 4890 l  pc
+gr
+gs
+0.007 0.007 0.007 c 23118 4213 m  23118 4623 l  23058 4623 l  23058 4213 l 
+22908 4213 l  22908 4162 l  23268 4162 l  23268 4213 l  23118 4213 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 23629 4623 m  23497 4422 l  23363 4623 l  23297 4623 l 
+23463 4384 l  23310 4161 l  23375 4161 l  23497 4342 l  23616 4161 l  23682 4161 l 
+23532 4382 l  23694 4623 l  23629 4623 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 24212 4445 m  24212 4568 24171 4631 24089 4631 ct 24064 4631 24043 4625 24026 4616 ct 
+24009 4606 23994 4591 23984 4569 ct 23983 4569 l  23983 4576 23983 4586 23982 4600 ct 
+23981 4614 23980 4622 23980 4624 ct 23926 4624 l  23927 4613 23928 4588 23928 4552 ct 
+23928 4138 l  23984 4138 l  23984 4278 l  23984 4292 23983 4308 23982 4327 ct 
+23984 4327 l  23994 4305 24009 4288 24026 4279 ct 24043 4269 24064 4264 24089 4264 ct 
+24131 4264 24163 4279 24183 4309 ct 24203 4339 24212 4384 24212 4445 ct p
+24154 4447 m  24154 4398 24148 4363 24135 4341 ct 24123 4320 24103 4309 24075 4309 ct 
+24043 4309 24021 4321 24006 4343 ct 23991 4366 23984 4402 23984 4452 ct 23984 4498 23991 4532 24006 4554 ct 
+24020 4576 24043 4587 24074 4587 ct 24102 4587 24123 4576 24135 4555 ct 24148 4533 24154 4497 24154 4447 ct 
 p ef
-pom
-pum
-9799 11212 t
-153 -3 m  136 2 120 4 102 4 ct 63 4 43 -19 43 -64 ct 43 -263 l  9 -263 l  9 -299 l 
-45 -299 l  59 -366 l  93 -366 l  93 -299 l  148 -299 l  148 -263 l  93 -263 l 
-93 -74 l  93 -60 95 -50 100 -44 ct 104 -38 112 -35 124 -35 ct 131 -35 140 -37 153 -39 ct 
-153 -3 l  p ef
-447 -149 m  447 -97 436 -58 413 -32 ct 390 -7 356 6 313 6 ct 269 6 236 -7 214 -34 ct 
-192 -60 181 -99 181 -149 ct 181 -252 225 -304 314 -304 ct 360 -304 393 -291 415 -266 ct 
-436 -241 447 -202 447 -149 ct p
-395 -149 m  395 -190 389 -220 377 -239 ct 364 -258 344 -267 315 -267 ct 286 -267 265 -257 252 -238 ct 
-239 -219 233 -190 233 -149 ct 233 -110 239 -80 252 -60 ct 265 -41 285 -31 312 -31 ct 
-342 -31 363 -40 376 -59 ct 389 -79 395 -108 395 -149 ct p ef
-889 -82 m  889 -54 878 -32 857 -17 ct 836 -2 806 6 768 6 ct 731 6 702 0 682 -12 ct 
-662 -25 649 -44 643 -70 ct 686 -78 l  691 -62 699 -50 713 -43 ct 726 -36 744 -32 768 -32 ct 
-793 -32 811 -36 823 -43 ct 835 -51 840 -63 840 -78 ct 840 -90 836 -99 828 -107 ct 
-820 -114 807 -120 789 -125 ct 754 -134 l  725 -142 705 -149 693 -156 ct 681 -163 672 -172 665 -182 ct 
-658 -192 655 -204 655 -219 ct 655 -246 664 -267 684 -281 ct 703 -295 731 -303 768 -303 ct 
-801 -303 827 -297 847 -285 ct 866 -274 878 -255 883 -229 ct 839 -224 l  836 -237 829 -247 817 -254 ct 
-805 -261 788 -265 768 -265 ct 746 -265 729 -262 719 -255 ct 708 -248 703 -238 703 -224 ct 
-703 -215 705 -208 709 -203 ct 714 -197 720 -193 729 -189 ct 738 -185 756 -180 783 -173 ct 
-810 -166 829 -160 840 -155 ct 852 -149 861 -143 868 -136 ct 874 -129 879 -121 883 -112 ct 
-887 -103 889 -93 889 -82 ct p ef
-1063 -3 m  1046 2 1030 4 1012 4 ct 973 4 953 -19 953 -64 ct 953 -263 l  919 -263 l 
-919 -299 l  955 -299 l  969 -366 l  1003 -366 l  1003 -299 l  1058 -299 l 
-1058 -263 l  1003 -263 l  1003 -74 l  1003 -60 1005 -50 1010 -44 ct 1014 -38 1022 -35 1034 -35 ct 
-1041 -35 1050 -37 1063 -39 ct 1063 -3 l  p ef
-1181 6 m  1151 6 1129 -2 1114 -18 ct 1098 -34 1091 -55 1091 -83 ct 1091 -114 1101 -138 1121 -154 ct 
-1142 -171 1174 -180 1220 -181 ct 1286 -182 l  1286 -198 l  1286 -222 1281 -240 1271 -250 ct 
-1261 -261 1245 -266 1223 -266 ct 1200 -266 1184 -262 1174 -255 ct 1164 -247 1158 -235 1156 -219 ct 
-1104 -223 l  1113 -277 1152 -304 1224 -304 ct 1261 -304 1289 -295 1308 -278 ct 
-1327 -261 1337 -236 1337 -203 ct 1337 -74 l  1337 -60 1339 -49 1342 -41 ct 1346 -34 1354 -30 1364 -30 ct 
-1369 -30 1375 -31 1381 -32 ct 1381 -1 l  1368 2 1355 3 1342 3 ct 1324 3 1311 -1 1302 -11 ct 
-1294 -21 1289 -36 1288 -57 ct 1286 -57 l  1274 -34 1259 -18 1242 -8 ct 1225 1 1205 6 1181 6 ct 
-p
-1192 -31 m  1210 -31 1227 -35 1241 -44 ct 1255 -52 1266 -63 1274 -78 ct 1282 -92 1286 -107 1286 -122 ct 
-1286 -147 l  1232 -146 l  1209 -145 1191 -143 1179 -139 ct 1167 -134 1158 -127 1152 -118 ct 
-1145 -109 1142 -97 1142 -82 ct 1142 -66 1146 -53 1155 -44 ct 1164 -36 1176 -31 1192 -31 ct 
-p ef
-1419 0 m  1419 -229 l  1419 -250 1419 -273 1417 -298 ct 1464 -298 l  1466 -265 1466 -244 1466 -238 ct 
-1468 -238 l  1475 -263 1485 -281 1495 -290 ct 1505 -299 1520 -304 1538 -304 ct 
-1545 -304 1552 -303 1558 -301 ct 1558 -256 l  1552 -258 1543 -258 1532 -258 ct 
-1511 -258 1496 -250 1485 -232 ct 1474 -214 1469 -189 1469 -156 ct 1469 0 l  1419 0 l 
-p ef
-1719 -3 m  1702 2 1686 4 1668 4 ct 1629 4 1609 -19 1609 -64 ct 1609 -263 l  1575 -263 l 
-1575 -299 l  1611 -299 l  1625 -366 l  1659 -366 l  1659 -299 l  1714 -299 l 
-1714 -263 l  1659 -263 l  1659 -74 l  1659 -60 1661 -50 1666 -44 ct 1670 -38 1678 -35 1690 -35 ct 
-1697 -35 1706 -37 1719 -39 ct 1719 -3 l  p ef
-2081 6 m  2050 6 2022 0 1998 -11 ct 1974 -23 1956 -40 1943 -62 ct 1930 -84 1924 -110 1924 -141 ct 
-1924 -388 l  1976 -388 l  1976 -145 l  1976 -110 1985 -83 2003 -64 ct 2021 -46 2047 -37 2081 -37 ct 
-2116 -37 2143 -46 2162 -65 ct 2182 -84 2191 -112 2191 -149 ct 2191 -388 l  2244 -388 l 
-2244 -146 l  2244 -114 2237 -87 2224 -64 ct 2211 -42 2192 -24 2167 -12 ct 2143 0 2114 6 2081 6 ct 
-p ef
-2332 0 m  2332 -389 l  2385 -389 l  2385 -43 l  2581 -43 l  2581 0 l  2332 0 l 
-p ef
-2924 -346 m  2924 -1 l  2872 -1 l  2872 -346 l  2739 -346 l  2739 -389 l 
-3058 -389 l  3058 -346 l  2924 -346 l  p ef
-3375 0 m  3259 -170 l  3140 0 l  3082 0 l  3229 -202 l  3093 -389 l  3151 -389 l 
-3259 -236 l  3364 -389 l  3422 -389 l  3289 -204 l  3433 0 l  3375 0 l 
-p ef
-3858 -196 m  3858 -155 3850 -119 3834 -89 ct 3819 -58 3797 -35 3768 -19 ct 3739 -2 3704 6 3665 6 ct 
-3625 6 3591 -2 3562 -18 ct 3533 -34 3511 -58 3496 -88 ct 3480 -119 3473 -155 3473 -196 ct 
-3473 -258 3490 -306 3524 -341 ct 3558 -376 3605 -394 3665 -394 ct 3705 -394 3739 -386 3768 -370 ct 
-3797 -355 3819 -332 3835 -302 ct 3850 -272 3858 -236 3858 -196 ct p
-3804 -196 m  3804 -244 3792 -282 3768 -310 ct 3744 -337 3710 -351 3665 -351 ct 
-3621 -351 3587 -337 3562 -310 ct 3538 -283 3526 -245 3526 -196 ct 3526 -147 3538 -108 3563 -80 ct 
-3587 -51 3621 -37 3665 -37 ct 3710 -37 3744 -51 3768 -78 ct 3792 -106 3804 -145 3804 -196 ct 
-p ef
-4228 -271 m  4228 -234 4216 -205 4193 -184 ct 4169 -162 4136 -151 4095 -151 ct 
-3981 -151 l  3981 1 l  3928 1 l  3928 -388 l  4092 -388 l  4135 -388 4169 -378 4193 -358 ct 
-4217 -337 4228 -308 4228 -271 ct p
-4176 -271 m  4176 -321 4145 -346 4085 -346 ct 3981 -346 l  3981 -193 l  4087 -193 l 
-4146 -193 4176 -219 4176 -271 ct p ef
-pom
+gr
 gs
-0.933 0.933 0.933 c 20512 10249 m  20512 10249 l  20298 10249 20087 10262 19902 10287 ct 
-19716 10312 19562 10349 19455 10392 ct 19347 10436 19291 10485 19291 10535 ct 
-19291 10749 l  19291 10963 l  19291 11255 l  19291 11469 l  19291 11683 l 
-19291 11684 l  19291 11734 19347 11783 19455 11827 ct 19562 11870 19716 11907 19902 11932 ct 
-20087 11957 20298 11970 20512 11970 ct 21427 11970 l  22342 11970 l  23588 11970 l 
-24503 11970 l  25418 11970 l  25419 11970 l  25633 11970 25844 11957 26029 11932 ct 
-26215 11907 26369 11870 26476 11827 ct 26584 11783 26640 11734 26640 11684 ct 
-26640 11469 l  26640 11255 l  26640 10963 l  26640 10749 l  26640 10535 l 
-26640 10535 l  26640 10535 l  26640 10485 26584 10436 26476 10392 ct 26369 10349 26215 10312 26029 10287 ct 
-25844 10262 25633 10249 25419 10249 ct 24863 9327 l  23588 10249 l  22342 10249 l 
-21427 10249 l  20512 10249 l  p ef
-gr
-gs
-0 lw 1 lj 20511 10248 m  20511 10248 l  20297 10248 20086 10261 19901 10286 ct 
-19715 10311 19561 10348 19454 10391 ct 19346 10435 19290 10484 19290 10534 ct 
-19290 10748 l  19290 10962 l  19290 11254 l  19290 11468 l  19290 11682 l 
-19290 11683 l  19290 11733 19346 11782 19454 11826 ct 19561 11869 19715 11906 19901 11931 ct 
-20086 11956 20297 11969 20511 11969 ct 21426 11969 l  22341 11969 l  23587 11969 l 
-24502 11969 l  25417 11969 l  25418 11969 l  25632 11969 25843 11956 26028 11931 ct 
-26214 11906 26368 11869 26475 11826 ct 26583 11782 26639 11733 26639 11683 ct 
-26639 11468 l  26639 11254 l  26639 10962 l  26639 10748 l  26639 10534 l 
-26639 10534 l  26639 10534 l  26639 10484 26583 10435 26475 10391 ct 26368 10348 26214 10311 26028 10286 ct 
-25843 10261 25632 10248 25418 10248 ct 24862 9327 l  23587 10248 l  22341 10248 l 
-21426 10248 l  20511 10248 l  pc
+0.007 0.007 0.007 c 24279 4624 m  24279 4138 l  24336 4138 l  24336 4624 l 
+24279 4624 l  p ef
 gr
-pum
-19863 10990 t
-376 0 m  376 -259 l  376 -288 377 -315 379 -342 ct 370 -309 362 -283 354 -265 ct 
-254 0 l  217 0 l  116 -265 l  100 -312 l  91 -342 l  92 -311 l  93 -259 l 
-93 0 l  46 0 l  46 -389 l  115 -389 l  219 -119 l  222 -108 226 -97 229 -84 ct 
-233 -72 235 -63 236 -57 ct 237 -65 241 -76 245 -91 ct 250 -106 253 -115 255 -119 ct 
-356 -389 l  424 -389 l  424 0 l  376 0 l  p ef
-584 6 m  554 6 532 -2 517 -18 ct 501 -34 494 -55 494 -83 ct 494 -114 504 -138 524 -154 ct 
-545 -171 577 -180 623 -181 ct 689 -182 l  689 -198 l  689 -222 684 -240 674 -250 ct 
-664 -261 648 -266 626 -266 ct 603 -266 587 -262 577 -255 ct 567 -247 561 -235 559 -219 ct 
-507 -223 l  516 -277 555 -304 627 -304 ct 664 -304 692 -295 711 -278 ct 730 -261 740 -236 740 -203 ct 
-740 -74 l  740 -60 742 -49 745 -41 ct 749 -34 757 -30 767 -30 ct 772 -30 778 -31 784 -32 ct 
-784 -1 l  771 2 758 3 745 3 ct 727 3 714 -1 705 -11 ct 697 -21 692 -36 691 -57 ct 
-689 -57 l  677 -34 662 -18 645 -8 ct 628 1 608 6 584 6 ct p
-595 -31 m  613 -31 630 -35 644 -44 ct 658 -52 669 -63 677 -78 ct 685 -92 689 -107 689 -122 ct 
-689 -147 l  635 -146 l  612 -145 594 -143 582 -139 ct 570 -134 561 -127 555 -118 ct 
-548 -109 545 -97 545 -82 ct 545 -66 549 -53 558 -44 ct 567 -36 579 -31 595 -31 ct 
-p ef
-821 -362 m  821 -409 l  870 -409 l  870 -362 l  821 -362 l  p
-821 0 m  821 -298 l  870 -298 l  870 0 l  821 0 l  p ef
-1137 0 m  1137 -189 l  1137 -209 1135 -224 1131 -235 ct 1128 -246 1121 -254 1113 -258 ct 
-1105 -263 1092 -266 1076 -266 ct 1052 -266 1033 -257 1019 -241 ct 1006 -225 999 -202 999 -173 ct 
-999 0 l  949 0 l  949 -235 l  949 -270 949 -291 947 -298 ct 994 -298 l  994 -298 995 -295 995 -291 ct 
-995 -287 995 -282 996 -277 ct 996 -272 996 -262 996 -247 ct 997 -247 l  1009 -268 1022 -283 1037 -291 ct 
-1052 -300 1070 -304 1093 -304 ct 1125 -304 1149 -296 1164 -280 ct 1179 -263 1187 -236 1187 -199 ct 
-1187 0 l  1137 0 l  p ef
-1726 -271 m  1726 -234 1714 -205 1691 -184 ct 1667 -162 1634 -151 1593 -151 ct 
-1479 -151 l  1479 1 l  1426 1 l  1426 -388 l  1590 -388 l  1633 -388 1667 -378 1691 -358 ct 
-1715 -337 1726 -308 1726 -271 ct p
-1674 -271 m  1674 -321 1643 -346 1583 -346 ct 1479 -346 l  1479 -193 l  1585 -193 l 
-1644 -193 1674 -219 1674 -271 ct p ef
-2066 0 m  2066 -180 l  1856 -180 l  1856 0 l  1803 0 l  1803 -389 l  1856 -389 l 
-1856 -224 l  2066 -224 l  2066 -389 l  2118 -389 l  2118 0 l  2066 0 l 
-p ef
-2377 -161 m  2377 0 l  2325 0 l  2325 -161 l  2175 -389 l  2233 -389 l 
-2351 -203 l  2469 -389 l  2527 -389 l  2377 -161 l  p ef
-2946 -82 m  2946 -54 2935 -32 2914 -17 ct 2893 -2 2863 6 2825 6 ct 2788 6 2759 0 2739 -12 ct 
-2719 -25 2706 -44 2700 -70 ct 2743 -78 l  2748 -62 2756 -50 2770 -43 ct 2783 -36 2801 -32 2825 -32 ct 
-2850 -32 2868 -36 2880 -43 ct 2892 -51 2897 -63 2897 -78 ct 2897 -90 2893 -99 2885 -107 ct 
-2877 -114 2864 -120 2846 -125 ct 2811 -134 l  2782 -142 2762 -149 2750 -156 ct 
-2738 -163 2729 -172 2722 -182 ct 2715 -192 2712 -204 2712 -219 ct 2712 -246 2721 -267 2741 -281 ct 
-2760 -295 2788 -303 2825 -303 ct 2858 -303 2884 -297 2904 -285 ct 2923 -274 2935 -255 2940 -229 ct 
-2896 -224 l  2893 -237 2886 -247 2874 -254 ct 2862 -261 2845 -265 2825 -265 ct 
-2803 -265 2786 -262 2776 -255 ct 2765 -248 2760 -238 2760 -224 ct 2760 -215 2762 -208 2766 -203 ct 
-2771 -197 2777 -193 2786 -189 ct 2795 -185 2813 -180 2840 -173 ct 2867 -166 2886 -160 2897 -155 ct 
-2909 -149 2918 -143 2925 -136 ct 2931 -129 2936 -121 2940 -112 ct 2944 -103 2946 -93 2946 -82 ct 
-p ef
-3291 0 m  3234 0 l  3182 -211 l  3172 -258 l  3170 -249 3168 -237 3164 -222 ct 
-3161 -206 3142 -132 3108 0 ct 3051 0 l  2967 -299 l  3016 -299 l  3067 -96 l 
-3068 -91 3072 -73 3078 -41 ct 3083 -62 l  3145 -299 l  3199 -299 l  3251 -94 l 
-3263 -41 l  3272 -79 l  3328 -299 l  3377 -299 l  3291 0 l  p ef
-3412 -362 m  3412 -409 l  3461 -409 l  3461 -362 l  3412 -362 l  p
-3412 0 m  3412 -298 l  3461 -298 l  3461 0 l  3412 0 l  p ef
-3654 -3 m  3637 2 3621 4 3603 4 ct 3564 4 3544 -19 3544 -64 ct 3544 -263 l  3510 -263 l 
-3510 -299 l  3546 -299 l  3560 -366 l  3594 -366 l  3594 -299 l  3649 -299 l 
-3649 -263 l  3594 -263 l  3594 -74 l  3594 -60 3596 -50 3601 -44 ct 3605 -38 3613 -35 3625 -35 ct 
-3632 -35 3641 -37 3654 -39 ct 3654 -3 l  p ef
-3734 -150 m  3734 -111 3740 -81 3752 -62 ct 3765 -43 3784 -33 3809 -33 ct 3827 -33 3841 -38 3853 -48 ct 
-3865 -57 3872 -72 3875 -92 ct 3925 -88 l  3921 -60 3909 -37 3889 -20 ct 3868 -3 3842 6 3810 6 ct 
-3769 6 3737 -7 3715 -34 ct 3693 -60 3682 -99 3682 -149 ct 3682 -200 3693 -238 3715 -264 ct 
-3737 -291 3769 -304 3810 -304 ct 3840 -304 3866 -296 3886 -280 ct 3906 -264 3918 -243 3923 -215 ct 
-3873 -211 l  3870 -227 3863 -241 3853 -250 ct 3843 -260 3828 -265 3808 -265 ct 
-3782 -265 3763 -256 3751 -239 ct 3740 -221 3734 -192 3734 -150 ct p ef
-4028 -247 m  4039 -266 4052 -281 4067 -290 ct 4082 -299 4101 -303 4124 -303 ct 
-4156 -303 4180 -295 4195 -279 ct 4210 -263 4218 -236 4218 -198 ct 4218 1 l  4168 1 l 
-4168 -189 l  4168 -210 4166 -225 4162 -235 ct 4159 -246 4152 -253 4143 -258 ct 
-4135 -263 4122 -265 4107 -265 ct 4083 -265 4065 -257 4051 -241 ct 4037 -225 4030 -203 4030 -175 ct 
-4030 1 l  3980 1 l  3980 -409 l  4030 -409 l  4030 -302 l  4030 -291 4029 -279 4029 -267 ct 
-4028 -256 4028 -249 4027 -247 ct 4028 -247 l  p ef
-4331 -138 m  4331 -104 4338 -78 4352 -59 ct 4366 -41 4387 -31 4414 -31 ct 4436 -31 4453 -36 4466 -44 ct 
-4479 -53 4488 -64 4492 -77 ct 4536 -65 l  4518 -18 4477 6 4414 6 ct 4370 6 4337 -7 4314 -33 ct 
-4290 -60 4279 -99 4279 -151 ct 4279 -200 4290 -238 4314 -264 ct 4337 -291 4369 -304 4412 -304 ct 
-4500 -304 4544 -251 4544 -145 ct 4544 -138 l  4331 -138 l  p
-4492 -176 m  4490 -208 4482 -231 4468 -245 ct 4455 -260 4436 -267 4411 -267 ct 
-4387 -267 4368 -259 4354 -243 ct 4340 -227 4333 -204 4332 -176 ct 4492 -176 l 
-p ef
-4830 -82 m  4830 -54 4819 -32 4798 -17 ct 4777 -2 4747 6 4709 6 ct 4672 6 4643 0 4623 -12 ct 
-4603 -25 4590 -44 4584 -70 ct 4627 -78 l  4632 -62 4640 -50 4654 -43 ct 4667 -36 4685 -32 4709 -32 ct 
-4734 -32 4752 -36 4764 -43 ct 4776 -51 4781 -63 4781 -78 ct 4781 -90 4777 -99 4769 -107 ct 
-4761 -114 4748 -120 4730 -125 ct 4695 -134 l  4666 -142 4646 -149 4634 -156 ct 
-4622 -163 4613 -172 4606 -182 ct 4599 -192 4596 -204 4596 -219 ct 4596 -246 4605 -267 4625 -281 ct 
-4644 -295 4672 -303 4709 -303 ct 4742 -303 4768 -297 4788 -285 ct 4807 -274 4819 -255 4824 -229 ct 
-4780 -224 l  4777 -237 4770 -247 4758 -254 ct 4746 -261 4729 -265 4709 -265 ct 
-4687 -265 4670 -262 4660 -255 ct 4649 -248 4644 -238 4644 -224 ct 4644 -215 4646 -208 4650 -203 ct 
-4655 -197 4661 -193 4670 -189 ct 4679 -185 4697 -180 4724 -173 ct 4751 -166 4770 -160 4781 -155 ct 
-4793 -149 4802 -143 4809 -136 ct 4815 -129 4820 -121 4824 -112 ct 4828 -103 4830 -93 4830 -82 ct 
-p ef
-5298 -150 m  5298 -46 5261 6 5188 6 ct 5166 6 5147 2 5132 -6 ct 5117 -14 5105 -28 5096 -46 ct 
-5095 -46 l  5095 -40 5095 -31 5094 -20 ct 5093 -8 5093 -1 5092 0 ct 5044 0 l 
-5045 -9 5046 -30 5046 -61 ct 5046 -409 l  5096 -409 l  5096 -292 l  5096 -280 5095 -266 5094 -250 ct 
-5096 -250 l  5105 -269 5117 -283 5132 -291 ct 5147 -299 5166 -303 5188 -303 ct 
-5226 -303 5254 -291 5271 -265 ct 5289 -240 5298 -202 5298 -150 ct p
-5246 -148 m  5246 -190 5240 -220 5229 -238 ct 5218 -256 5201 -265 5176 -265 ct 
-5148 -265 5127 -255 5115 -236 ct 5102 -217 5096 -187 5096 -145 ct 5096 -106 5102 -77 5114 -59 ct 
-5127 -40 5147 -31 5175 -31 ct 5200 -31 5218 -40 5229 -58 ct 5240 -77 5246 -107 5246 -148 ct 
-p ef
-5435 6 m  5405 6 5383 -2 5368 -18 ct 5352 -34 5345 -55 5345 -83 ct 5345 -114 5355 -138 5375 -154 ct 
-5396 -171 5428 -180 5474 -181 ct 5540 -182 l  5540 -198 l  5540 -222 5535 -240 5525 -250 ct 
-5515 -261 5499 -266 5477 -266 ct 5454 -266 5438 -262 5428 -255 ct 5418 -247 5412 -235 5410 -219 ct 
-5358 -223 l  5367 -277 5406 -304 5478 -304 ct 5515 -304 5543 -295 5562 -278 ct 
-5581 -261 5591 -236 5591 -203 ct 5591 -74 l  5591 -60 5593 -49 5596 -41 ct 5600 -34 5608 -30 5618 -30 ct 
-5623 -30 5629 -31 5635 -32 ct 5635 -1 l  5622 2 5609 3 5596 3 ct 5578 3 5565 -1 5556 -11 ct 
-5548 -21 5543 -36 5542 -57 ct 5540 -57 l  5528 -34 5513 -18 5496 -8 ct 5479 1 5459 6 5435 6 ct 
-p
-5446 -31 m  5464 -31 5481 -35 5495 -44 ct 5509 -52 5520 -63 5528 -78 ct 5536 -92 5540 -107 5540 -122 ct 
-5540 -147 l  5486 -146 l  5463 -145 5445 -143 5433 -139 ct 5421 -134 5412 -127 5406 -118 ct 
-5399 -109 5396 -97 5396 -82 ct 5396 -66 5400 -53 5409 -44 ct 5418 -36 5430 -31 5446 -31 ct 
-p ef
-5711 -150 m  5711 -111 5717 -81 5729 -62 ct 5742 -43 5761 -33 5786 -33 ct 5804 -33 5818 -38 5830 -48 ct 
-5842 -57 5849 -72 5852 -92 ct 5902 -88 l  5898 -60 5886 -37 5866 -20 ct 5845 -3 5819 6 5787 6 ct 
-5746 6 5714 -7 5692 -34 ct 5670 -60 5659 -99 5659 -149 ct 5659 -200 5670 -238 5692 -264 ct 
-5714 -291 5746 -304 5787 -304 ct 5817 -304 5843 -296 5863 -280 ct 5883 -264 5895 -243 5900 -215 ct 
-5850 -211 l  5847 -227 5840 -241 5830 -250 ct 5820 -260 5805 -265 5785 -265 ct 
-5759 -265 5740 -256 5728 -239 ct 5717 -221 5711 -192 5711 -150 ct p ef
-6143 0 m  6042 -136 l  6006 -106 l  6006 0 l  5956 0 l  5956 -409 l  6006 -409 l 
-6006 -153 l  6136 -298 l  6195 -298 l  6074 -170 l  6201 0 l  6143 0 l 
+gs
+0.007 0.007 0.007 c 24703 4445 m  24703 4506 24691 4553 24665 4584 ct 24639 4615 24601 4629 24551 4629 ct 
+24502 4629 24465 4614 24440 4582 ct 24415 4549 24403 4504 24403 4445 ct 24403 4323 24453 4262 24553 4262 ct 
+24605 4262 24643 4277 24667 4306 ct 24691 4336 24703 4382 24703 4445 ct p
+24645 4445 m  24645 4396 24638 4361 24624 4339 ct 24611 4316 24587 4305 24554 4305 ct 
+24521 4305 24498 4317 24483 4339 ct 24469 4362 24461 4397 24461 4445 ct 24461 4492 24468 4526 24483 4549 ct 
+24497 4575 24520 4586 24551 4586 ct 24584 4586 24609 4575 24623 4551 ct 24638 4528 24645 4493 24645 4445 ct 
 p ef
-pom
-pum
-20268 11617 t
-153 -3 m  136 2 120 4 102 4 ct 63 4 43 -19 43 -64 ct 43 -263 l  9 -263 l  9 -299 l 
-45 -299 l  59 -366 l  93 -366 l  93 -299 l  148 -299 l  148 -263 l  93 -263 l 
-93 -74 l  93 -60 95 -50 100 -44 ct 104 -38 112 -35 124 -35 ct 131 -35 140 -37 153 -39 ct 
-153 -3 l  p ef
-447 -149 m  447 -97 436 -58 413 -32 ct 390 -7 356 6 313 6 ct 269 6 236 -7 214 -34 ct 
-192 -60 181 -99 181 -149 ct 181 -252 225 -304 314 -304 ct 360 -304 393 -291 415 -266 ct 
-436 -241 447 -202 447 -149 ct p
-395 -149 m  395 -190 389 -220 377 -239 ct 364 -258 344 -267 315 -267 ct 286 -267 265 -257 252 -238 ct 
-239 -219 233 -190 233 -149 ct 233 -110 239 -80 252 -60 ct 265 -41 285 -31 312 -31 ct 
-342 -31 363 -40 376 -59 ct 389 -79 395 -108 395 -149 ct p ef
-917 -149 m  917 -97 906 -58 883 -32 ct 860 -7 826 6 783 6 ct 739 6 706 -7 684 -34 ct 
-662 -60 651 -99 651 -149 ct 651 -252 695 -304 784 -304 ct 830 -304 863 -291 885 -266 ct 
-906 -241 917 -202 917 -149 ct p
-865 -149 m  865 -190 859 -220 847 -239 ct 834 -258 814 -267 785 -267 ct 756 -267 735 -257 722 -238 ct 
-709 -219 703 -190 703 -149 ct 703 -110 709 -80 722 -60 ct 735 -41 755 -31 782 -31 ct 
-812 -31 833 -40 846 -59 ct 859 -79 865 -108 865 -149 ct p ef
-1230 -151 m  1230 -47 1193 5 1120 5 ct 1074 5 1044 -12 1028 -47 ct 1026 -47 l 
-1027 -45 1028 -30 1028 0 ct 1028 117 l  978 117 l  978 -238 l  978 -269 977 -289 976 -299 ct 
-1024 -299 l  1024 -298 1025 -295 1025 -291 ct 1025 -286 1026 -279 1026 -270 ct 
-1027 -261 1027 -254 1027 -251 ct 1028 -251 l  1037 -269 1049 -283 1063 -291 ct 
-1078 -300 1097 -304 1120 -304 ct 1157 -304 1185 -292 1203 -267 ct 1221 -242 1230 -204 1230 -151 ct 
+gr
+gs
+0.007 0.007 0.007 c 24812 4443 m  24812 4491 24819 4525 24833 4548 ct 24847 4572 24869 4583 24897 4583 ct 
+24917 4583 24933 4578 24947 4565 ct 24960 4554 24968 4537 24971 4513 ct 25029 4517 l 
+25024 4551 25011 4579 24988 4599 ct 24963 4619 24934 4629 24898 4629 ct 24852 4629 24816 4614 24791 4582 ct 
+24766 4551 24754 4505 24754 4445 ct 24754 4385 24766 4340 24791 4309 ct 24816 4278 24852 4262 24898 4262 ct 
+24932 4262 24961 4272 24984 4291 ct 25007 4308 25021 4335 25027 4367 ct 24969 4373 l 
+24966 4353 24958 4337 24947 4325 ct 24935 4314 24918 4308 24896 4308 ct 24867 4308 24845 4319 24832 4339 ct 
+24819 4360 24812 4395 24812 4443 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 25298 4624 m  25185 4461 l  25144 4497 l  25144 4624 l 
+25088 4624 l  25088 4138 l  25144 4138 l  25144 4441 l  25291 4269 l  25357 4269 l 
+25220 4421 l  25364 4624 l  25298 4624 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 25449 4458 m  25449 4498 25457 4529 25472 4552 ct 25488 4575 25512 4585 25542 4585 ct 
+25566 4585 25586 4580 25600 4571 ct 25615 4559 25625 4546 25630 4531 ct 25679 4545 l 
+25659 4602 25613 4629 25542 4629 ct 25493 4629 25455 4614 25429 4583 ct 25403 4551 25389 4504 25389 4443 ct 
+25389 4384 25403 4340 25429 4308 ct 25455 4278 25492 4262 25540 4262 ct 25639 4262 25688 4324 25688 4449 ct 
+25688 4458 l  25449 4458 l  p
+25630 4413 m  25627 4376 25618 4348 25603 4331 ct 25588 4314 25567 4305 25539 4305 ct 
+25512 4305 25491 4315 25475 4334 ct 25459 4353 25450 4379 25449 4413 ct 25630 4413 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 25968 4567 m  25957 4589 25944 4606 25926 4616 ct 25909 4625 25888 4631 25863 4631 ct 
+25821 4631 25790 4616 25770 4585 ct 25750 4556 25740 4509 25740 4448 ct 25740 4325 25781 4264 25863 4264 ct 
+25888 4264 25910 4268 25927 4279 ct 25944 4288 25957 4304 25968 4325 ct 25968 4285 l 
+25968 4138 l  26024 4138 l  26024 4552 l  26024 4588 26025 4613 26026 4624 ct 
+25972 4624 l  25971 4620 25971 4613 25970 4600 ct 25969 4587 25969 4576 25969 4567 ct 
+25968 4567 l  p
+25798 4447 m  25798 4497 25804 4532 25817 4553 ct 25829 4575 25849 4585 25877 4585 ct 
+25909 4585 25932 4574 25946 4551 ct 25960 4527 25968 4492 25968 4443 ct 25968 4396 25960 4362 25946 4340 ct 
+25932 4318 25909 4307 25878 4307 ct 25850 4307 25830 4318 25817 4340 ct 25805 4362 25798 4398 25798 4447 ct 
+p ef
+gr
+gs
+0 lw 1 lj 0.007 0.007 0.007 c 22875 11598 m  26110 11598 l  ps
+gr
+gs
+0.007 0.007 0.007 c 22588 11599 m  22889 11705 l  22889 11494 l  22588 11599 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 26397 11599 m  26098 11494 l  26098 11705 l  26397 11599 l 
+p ef
+gr
+gs
+0 lw 1 lj 0.007 0.007 0.007 c 22587 12334 m  22587 11388 l  ps
+gr
+gs
+0 lw 1 lj 0.007 0.007 0.007 c 26396 12334 m  26396 11388 l  ps
+gr
+gs
+0.007 0.007 0.007 c 23394 10659 m  23375 10664 23357 10666 23337 10666 ct 23293 10666 23270 10640 23270 10586 ct 
+23270 10352 l  23231 10352 l  23231 10308 l  23273 10308 l  23289 10228 l 
+23326 10228 l  23326 10308 l  23388 10308 l  23388 10352 l  23326 10352 l 
+23326 10574 l  23326 10590 23329 10602 23334 10609 ct 23339 10616 23349 10620 23362 10620 ct 
+23369 10620 23380 10618 23394 10615 ct 23394 10659 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 23443 10661 m  23443 10388 l  23443 10364 23442 10338 23441 10307 ct 
+23495 10307 l  23497 10347 23497 10370 23497 10379 ct 23499 10379 l  23507 10348 23518 10328 23529 10318 ct 
+23541 10306 23557 10301 23578 10301 ct 23586 10301 23593 10302 23601 10304 ct 
+23601 10357 l  23593 10355 23584 10354 23571 10354 ct 23548 10354 23530 10364 23518 10385 ct 
+23506 10406 23500 10437 23500 10476 ct 23500 10661 l  23443 10661 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 23738 10667 m  23705 10667 23679 10658 23662 10639 ct 23645 10621 23637 10595 23637 10562 ct 
+23637 10525 23648 10498 23671 10478 ct 23694 10459 23731 10448 23782 10446 ct 
+23857 10445 l  23857 10426 l  23857 10397 23851 10376 23840 10363 ct 23828 10350 23810 10346 23785 10346 ct 
+23760 10346 23742 10350 23731 10358 ct 23719 10367 23712 10381 23710 10401 ct 
+23652 10396 l  23661 10333 23706 10301 23786 10301 ct 23829 10301 23860 10312 23882 10332 ct 
+23904 10350 23915 10380 23915 10420 ct 23915 10572 l  23915 10589 23917 10603 23921 10612 ct 
+23925 10620 23934 10624 23946 10624 ct 23951 10624 23957 10624 23964 10622 ct 
+23964 10659 l  23950 10662 23936 10664 23921 10664 ct 23900 10664 23884 10659 23875 10647 ct 
+23866 10636 23860 10618 23859 10594 ct 23857 10594 l  23843 10620 23826 10639 23807 10650 ct 
+23788 10662 23765 10667 23738 10667 ct p
+23751 10623 m  23772 10623 23790 10618 23806 10608 ct 23822 10599 23834 10585 23843 10568 ct 
+23853 10552 23857 10534 23857 10516 ct 23857 10486 l  23796 10487 l  23770 10488 23750 10492 23736 10496 ct 
+23723 10501 23712 10509 23705 10520 ct 23698 10532 23694 10545 23694 10563 ct 
+23694 10582 23699 10597 23709 10607 ct 23719 10618 23733 10623 23751 10623 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 24219 10661 m  24219 10436 l  24219 10413 24217 10395 24212 10382 ct 
+24208 10369 24201 10360 24192 10354 ct 24182 10348 24168 10346 24150 10346 ct 
+24123 10346 24102 10355 24086 10375 ct 24070 10394 24062 10421 24062 10455 ct 
+24062 10661 l  24006 10661 l  24006 10382 l  24006 10342 24005 10317 24004 10307 ct 
+24057 10307 l  24057 10308 24057 10312 24058 10317 ct 24058 10321 24058 10326 24058 10333 ct 
+24059 10339 24059 10350 24059 10367 ct 24060 10367 l  24073 10342 24089 10326 24106 10316 ct 
+24123 10306 24144 10301 24169 10301 ct 24205 10301 24232 10310 24249 10329 ct 
+24266 10348 24275 10380 24275 10424 ct 24275 10661 l  24219 10661 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 24609 10563 m  24609 10597 24597 10622 24573 10640 ct 24549 10658 24515 10667 24472 10667 ct 
+24431 10667 24398 10660 24375 10645 ct 24352 10632 24338 10608 24331 10578 ct 
+24380 10567 l  24385 10586 24395 10601 24409 10609 ct 24424 10618 24446 10622 24472 10622 ct 
+24501 10622 24521 10618 24535 10608 ct 24548 10600 24554 10586 24554 10567 ct 
+24554 10554 24550 10542 24541 10534 ct 24532 10525 24517 10518 24497 10513 ct 
+24457 10501 l  24424 10493 24401 10484 24387 10476 ct 24374 10467 24363 10457 24355 10445 ct 
+24348 10433 24344 10418 24344 10401 ct 24344 10367 24355 10344 24377 10327 ct 
+24399 10310 24431 10302 24473 10302 ct 24510 10302 24539 10308 24561 10322 ct 
+24583 10336 24597 10357 24603 10388 ct 24552 10395 l  24549 10378 24541 10366 24527 10358 ct 
+24514 10350 24496 10346 24473 10346 ct 24448 10346 24429 10350 24416 10357 ct 
+24404 10365 24398 10378 24398 10395 ct 24398 10405 24401 10414 24406 10420 ct 
+24411 10426 24418 10432 24429 10437 ct 24438 10441 24459 10447 24490 10456 ct 
+24520 10463 24541 10470 24554 10477 ct 24567 10484 24577 10492 24585 10499 ct 
+24592 10507 24598 10517 24602 10527 ct 24607 10538 24609 10549 24609 10563 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 24673 10233 m  24673 10177 l  24730 10177 l  24730 10233 l 
+24673 10233 l  p
+24673 10662 m  24673 10308 l  24730 10308 l  24730 10662 l  24673 10662 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 24943 10659 m  24924 10664 24906 10666 24886 10666 ct 24841 10666 24818 10640 24818 10586 ct 
+24818 10352 l  24780 10352 l  24780 10308 l  24821 10308 l  24837 10228 l 
+24874 10228 l  24874 10308 l  24937 10308 l  24937 10352 l  24874 10352 l 
+24874 10574 l  24874 10590 24878 10602 24883 10609 ct 24888 10616 24898 10620 24911 10620 ct 
+24918 10620 24929 10618 24943 10615 ct 24943 10659 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 24990 10233 m  24990 10177 l  25047 10177 l  25047 10233 l 
+24990 10233 l  p
+24990 10662 m  24990 10308 l  25047 10308 l  25047 10662 l  24990 10662 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 25415 10484 m  25415 10545 25403 10592 25377 10622 ct 25351 10653 25313 10667 25264 10667 ct 
+25215 10667 25177 10652 25152 10620 ct 25127 10588 25115 10543 25115 10484 ct 
+25115 10361 25165 10301 25266 10301 ct 25317 10301 25355 10316 25379 10345 ct 
+25403 10374 25415 10421 25415 10484 ct p
+25357 10484 m  25357 10435 25350 10399 25336 10377 ct 25323 10354 25299 10344 25267 10344 ct 
+25234 10344 25211 10355 25196 10377 ct 25182 10400 25173 10436 25173 10484 ct 
+25173 10530 25180 10565 25196 10588 ct 25210 10613 25233 10624 25264 10624 ct 
+25297 10624 25321 10613 25335 10589 ct 25350 10567 25357 10532 25357 10484 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 25696 10661 m  25696 10436 l  25696 10413 25694 10395 25688 10382 ct 
+25684 10369 25677 10360 25668 10354 ct 25658 10348 25644 10346 25626 10346 ct 
+25599 10346 25578 10355 25562 10375 ct 25547 10394 25539 10421 25539 10455 ct 
+25539 10661 l  25483 10661 l  25483 10382 l  25483 10342 25482 10317 25481 10307 ct 
+25534 10307 l  25534 10308 25534 10312 25535 10317 ct 25535 10321 25535 10326 25535 10333 ct 
+25536 10339 25536 10350 25536 10367 ct 25537 10367 l  25550 10342 25565 10326 25582 10316 ct 
+25599 10306 25620 10301 25645 10301 ct 25681 10301 25709 10310 25726 10329 ct 
+25743 10348 25752 10380 25752 10424 ct 25752 10661 l  25696 10661 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 23918 11354 m  23907 11376 23894 11393 23876 11402 ct 23859 11412 23838 11417 23813 11417 ct 
+23771 11417 23740 11402 23720 11372 ct 23699 11342 23689 11296 23689 11235 ct 
+23689 11112 23731 11050 23813 11050 ct 23838 11050 23860 11055 23877 11065 ct 
+23894 11075 23907 11090 23918 11112 ct 23918 11072 l  23918 10924 l  23973 10924 l 
+23973 11338 l  23973 11375 23974 11399 23975 11410 ct 23922 11410 l  23921 11406 23921 11399 23920 11386 ct 
+23919 11374 23919 11362 23919 11354 ct 23918 11354 l  p
+23748 11234 m  23748 11283 23754 11318 23767 11339 ct 23779 11361 23799 11372 23827 11372 ct 
+23859 11372 23882 11360 23896 11337 ct 23910 11314 23918 11278 23918 11229 ct 
+23918 11182 23910 11148 23896 11126 ct 23882 11104 23859 11094 23828 11094 ct 
+23800 11094 23780 11104 23767 11126 ct 23755 11148 23748 11184 23748 11234 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 24099 11245 m  24099 11285 24107 11317 24122 11339 ct 24138 11361 24162 11372 24192 11372 ct 
+24217 11372 24237 11366 24251 11357 ct 24266 11346 24276 11334 24281 11318 ct 
+24330 11333 l  24310 11388 24264 11416 24192 11416 ct 24143 11416 24105 11400 24079 11369 ct 
+24053 11338 24040 11292 24040 11230 ct 24040 11172 24053 11126 24079 11095 ct 
+24105 11064 24142 11048 24190 11048 ct 24290 11048 24339 11110 24339 11237 ct 
+24339 11245 l  24099 11245 l  p
+24281 11200 m  24278 11163 24269 11135 24254 11117 ct 24239 11100 24218 11092 24189 11092 ct 
+24162 11092 24141 11101 24125 11120 ct 24109 11139 24100 11166 24099 11200 ct 
+24281 11200 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 24408 11410 m  24408 10924 l  24465 10924 l  24465 11410 l 
+24408 11410 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 24633 11416 m  24600 11416 24574 11406 24557 11387 ct 24540 11369 24531 11343 24531 11310 ct 
+24531 11274 24543 11246 24566 11226 ct 24589 11207 24626 11197 24677 11195 ct 
+24752 11194 l  24752 11175 l  24752 11146 24746 11124 24735 11112 ct 24723 11099 24705 11094 24680 11094 ct 
+24655 11094 24637 11098 24626 11106 ct 24614 11116 24607 11129 24605 11150 ct 
+24547 11145 l  24556 11080 24601 11048 24681 11048 ct 24724 11048 24755 11059 24777 11079 ct 
+24798 11099 24809 11128 24809 11168 ct 24809 11320 l  24809 11338 24811 11352 24815 11360 ct 
+24819 11368 24828 11373 24840 11373 ct 24845 11373 24851 11373 24858 11370 ct 
+24858 11407 l  24844 11410 24830 11413 24815 11413 ct 24794 11413 24779 11407 24770 11396 ct 
+24761 11384 24755 11366 24754 11342 ct 24752 11342 l  24738 11368 24721 11387 24702 11399 ct 
+24683 11410 24660 11416 24633 11416 ct p
+24646 11372 m  24667 11372 24685 11366 24701 11357 ct 24717 11347 24729 11334 24738 11317 ct 
+24748 11300 24752 11282 24752 11264 ct 24752 11235 l  24691 11236 l  24665 11237 24645 11240 24631 11244 ct 
+24618 11249 24607 11258 24600 11268 ct 24593 11280 24589 11294 24589 11312 ct 
+24589 11330 24594 11345 24604 11356 ct 24614 11366 24628 11372 24646 11372 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 24916 11547 m  24901 11547 24888 11546 24877 11544 ct 24877 11500 l 
+24886 11501 24894 11502 24904 11502 ct 24939 11502 24966 11476 24986 11422 ct 
+24992 11408 l  24858 11055 l  24918 11055 l  24989 11252 l  24990 11255 24991 11258 24993 11262 ct 
+24994 11267 24999 11281 25006 11305 ct 25014 11329 25019 11343 25019 11345 ct 
+25041 11281 l  25114 11055 l  25173 11055 l  25044 11409 l  25030 11447 25018 11476 25006 11493 ct 
+24994 11512 24980 11525 24966 11534 ct 24951 11543 24935 11547 24916 11547 ct 
+p ef
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 11391 13629 m  11901 13092 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 11512 14091 m  12462 13092 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 12073 14091 m  13022 13092 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 12634 14091 m  13583 13092 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 13194 14091 m  14144 13092 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 13755 14091 m  14705 13092 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 14316 14091 m  15266 13092 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 14877 14091 m  15827 13092 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 15438 14091 m  16388 13092 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 15999 14091 m  16949 13092 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 16560 14091 m  17509 13092 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 17121 14091 m  18070 13092 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 17681 14091 m  18631 13092 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 18242 14091 m  19192 13092 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 18803 14091 m  19753 13092 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 19364 14091 m  20314 13092 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 19925 14091 m  20875 13092 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 20486 14091 m  21436 13092 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 21047 14091 m  21996 13092 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 21608 14091 m  22557 13092 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 22168 14091 m  22589 13649 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 22047 13092 m  22589 13663 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 21487 13092 m  22436 14091 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 20926 13092 m  21875 14091 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 20365 13092 m  21315 14091 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 19804 13092 m  20754 14091 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 19243 13092 m  20193 14091 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 18682 13092 m  19632 14091 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 18121 13092 m  19071 14091 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 17560 13092 m  18510 14091 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 17000 13092 m  17949 14091 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 16439 13092 m  17389 14091 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 15878 13092 m  16828 14091 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 15317 13092 m  16267 14091 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 14756 13092 m  15706 14091 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 14195 13092 m  15145 14091 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 13634 13092 m  14584 14091 l  ps
+gr
+gs
+1.000 0.843 0.843 c 15069 14102 m  13810 14102 l  13810 13100 l  16328 13100 l 
+16328 14102 l  15069 14102 l  p ef
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 13074 13092 m  14023 14091 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 12513 13092 m  13462 14091 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 11952 13092 m  12902 14091 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 11391 13092 m  12341 14091 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 11391 13683 m  11780 14091 l  ps
+gr
+gs
+0 lw 1 lj 0.007 0.007 0.007 c 16990 14091 m  11391 14091 l  11391 13091 l 
+22588 13091 l  22588 14091 l  16990 14091 l  pc
+gr
+gs
+0.007 0.007 0.007 c 15628 13414 m  15628 13823 l  15568 13823 l  15568 13414 l 
+15418 13414 l  15418 13363 l  15778 13363 l  15778 13414 l  15628 13414 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 16139 13823 m  16008 13623 l  15873 13823 l  15807 13823 l 
+15973 13585 l  15820 13362 l  15885 13362 l  16008 13543 l  16126 13362 l 
+16192 13362 l  16042 13583 l  16204 13823 l  16139 13823 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 16722 13646 m  16722 13768 16681 13830 16598 13830 ct 16573 13830 16552 13825 16535 13816 ct 
+16518 13806 16504 13790 16494 13769 ct 16493 13769 l  16493 13776 16493 13786 16492 13800 ct 
+16491 13814 16490 13822 16490 13824 ct 16436 13824 l  16437 13813 16438 13788 16438 13752 ct 
+16438 13339 l  16494 13339 l  16494 13478 l  16494 13493 16493 13509 16492 13528 ct 
+16494 13528 l  16504 13506 16518 13488 16535 13479 ct 16552 13469 16573 13464 16598 13464 ct 
+16641 13464 16673 13479 16693 13510 ct 16713 13540 16722 13585 16722 13646 ct 
 p
-1178 -150 m  1178 -191 1172 -221 1161 -239 ct 1150 -257 1132 -266 1108 -266 ct 
-1088 -266 1073 -262 1062 -253 ct 1050 -245 1042 -232 1036 -215 ct 1030 -197 1028 -174 1028 -146 ct 
-1028 -107 1034 -78 1046 -60 ct 1059 -41 1079 -32 1107 -32 ct 1132 -32 1150 -41 1161 -59 ct 
-1172 -77 1178 -107 1178 -150 ct p ef
-1329 -138 m  1329 -104 1336 -78 1350 -59 ct 1364 -41 1385 -31 1412 -31 ct 1434 -31 1451 -36 1464 -44 ct 
-1477 -53 1486 -64 1490 -77 ct 1534 -65 l  1516 -18 1475 6 1412 6 ct 1368 6 1335 -7 1312 -33 ct 
-1288 -60 1277 -99 1277 -151 ct 1277 -200 1288 -238 1312 -264 ct 1335 -291 1367 -304 1410 -304 ct 
-1498 -304 1542 -251 1542 -145 ct 1542 -138 l  1329 -138 l  p
-1490 -176 m  1488 -208 1480 -231 1466 -245 ct 1453 -260 1434 -267 1409 -267 ct 
-1385 -267 1366 -259 1352 -243 ct 1338 -227 1331 -204 1330 -176 ct 1490 -176 l 
-p ef
-1605 0 m  1605 -229 l  1605 -250 1605 -273 1603 -298 ct 1650 -298 l  1652 -265 1652 -244 1652 -238 ct 
-1654 -238 l  1661 -263 1671 -281 1681 -290 ct 1691 -299 1706 -304 1724 -304 ct 
-1731 -304 1738 -303 1744 -301 ct 1744 -256 l  1738 -258 1729 -258 1718 -258 ct 
-1697 -258 1682 -250 1671 -232 ct 1660 -214 1655 -189 1655 -156 ct 1655 0 l  1605 0 l 
-p ef
-1867 6 m  1837 6 1815 -2 1800 -18 ct 1784 -34 1777 -55 1777 -83 ct 1777 -114 1787 -138 1807 -154 ct 
-1828 -171 1860 -180 1906 -181 ct 1972 -182 l  1972 -198 l  1972 -222 1967 -240 1957 -250 ct 
-1947 -261 1931 -266 1909 -266 ct 1886 -266 1870 -262 1860 -255 ct 1850 -247 1844 -235 1842 -219 ct 
-1790 -223 l  1799 -277 1838 -304 1910 -304 ct 1947 -304 1975 -295 1994 -278 ct 
-2013 -261 2023 -236 2023 -203 ct 2023 -74 l  2023 -60 2025 -49 2028 -41 ct 2032 -34 2040 -30 2050 -30 ct 
-2055 -30 2061 -31 2067 -32 ct 2067 -1 l  2054 2 2041 3 2028 3 ct 2010 3 1997 -1 1988 -11 ct 
-1980 -21 1975 -36 1974 -57 ct 1972 -57 l  1960 -34 1945 -18 1928 -8 ct 1911 1 1891 6 1867 6 ct 
+16664 13648 m  16664 13599 16658 13564 16645 13542 ct 16633 13521 16612 13510 16584 13510 ct 
+16552 13510 16530 13522 16515 13544 ct 16501 13567 16494 13603 16494 13653 ct 
+16494 13699 16501 13733 16515 13754 ct 16529 13776 16552 13787 16583 13787 ct 
+16611 13787 16633 13776 16645 13755 ct 16658 13734 16664 13698 16664 13648 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 16789 13824 m  16789 13339 l  16846 13339 l  16846 13824 l 
+16789 13824 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 17213 13646 m  17213 13708 17201 13754 17175 13784 ct 17149 13815 17110 13829 17061 13829 ct 
+17012 13829 16975 13814 16950 13782 ct 16925 13750 16913 13706 16913 13646 ct 
+16913 13524 16963 13463 17063 13463 ct 17114 13463 17153 13478 17177 13507 ct 
+17201 13537 17213 13583 17213 13646 ct p
+17155 13646 m  17155 13597 17148 13562 17133 13540 ct 17120 13517 17096 13506 17064 13506 ct 
+17031 13506 17008 13518 16993 13540 ct 16979 13563 16971 13598 16971 13646 ct 
+16971 13693 16978 13727 16993 13750 ct 17007 13775 17030 13786 17061 13786 ct 
+17094 13786 17118 13775 17132 13752 ct 17148 13730 17155 13694 17155 13646 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 17322 13644 m  17322 13692 17329 13727 17344 13749 ct 17358 13772 17380 13783 17408 13783 ct 
+17428 13783 17444 13778 17458 13766 ct 17471 13755 17479 13739 17482 13715 ct 
+17538 13718 l  17533 13752 17521 13779 17498 13799 ct 17474 13819 17445 13829 17409 13829 ct 
+17363 13829 17326 13814 17301 13782 ct 17276 13752 17264 13707 17264 13646 ct 
+17264 13586 17276 13541 17301 13510 ct 17326 13479 17363 13463 17409 13463 ct 
+17443 13463 17472 13473 17494 13492 ct 17517 13509 17531 13536 17537 13568 ct 
+17480 13574 l  17477 13554 17469 13538 17458 13526 ct 17446 13515 17429 13509 17407 13509 ct 
+17378 13509 17356 13520 17343 13540 ct 17329 13561 17322 13596 17322 13644 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 17808 13824 m  17695 13662 l  17653 13698 l  17653 13824 l 
+17598 13824 l  17598 13339 l  17653 13339 l  17653 13642 l  17801 13470 l 
+17866 13470 l  17730 13622 l  17873 13824 l  17808 13824 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 17957 13659 m  17957 13700 17965 13730 17981 13753 ct 17997 13775 18021 13785 18051 13785 ct 
+18075 13785 18095 13780 18109 13770 ct 18124 13760 18134 13747 18139 13733 ct 
+18188 13746 l  18168 13802 18122 13829 18051 13829 ct 18002 13829 17963 13814 17937 13783 ct 
+17911 13752 17898 13706 17898 13644 ct 17898 13585 17911 13541 17937 13509 ct 
+17963 13479 18001 13463 18049 13463 ct 18148 13463 18197 13525 18197 13650 ct 
+18197 13659 l  17957 13659 l  p
+18139 13614 m  18136 13577 18127 13549 18112 13532 ct 18097 13515 18076 13506 18048 13506 ct 
+18021 13506 18000 13516 17984 13535 ct 17967 13554 17958 13580 17957 13614 ct 
+18139 13614 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 18478 13767 m  18467 13789 18454 13806 18436 13816 ct 18419 13825 18398 13830 18373 13830 ct 
+18331 13830 18299 13816 18279 13785 ct 18259 13756 18249 13710 18249 13649 ct 
+18249 13526 18290 13464 18373 13464 ct 18398 13464 18420 13468 18437 13479 ct 
+18454 13488 18467 13505 18478 13526 ct 18478 13485 l  18478 13339 l  18533 13339 l 
+18533 13752 l  18533 13788 18534 13813 18535 13824 ct 18482 13824 l  18481 13820 18481 13813 18480 13800 ct 
+18479 13787 18479 13776 18479 13767 ct 18478 13767 l  p
+18307 13648 m  18307 13698 18313 13733 18327 13753 ct 18339 13775 18359 13785 18387 13785 ct 
+18419 13785 18442 13774 18456 13750 ct 18470 13727 18478 13693 18478 13644 ct 
+18478 13597 18470 13563 18456 13541 ct 18442 13519 18419 13508 18388 13508 ct 
+18360 13508 18340 13519 18327 13541 ct 18314 13563 18307 13599 18307 13648 ct 
+p ef
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 3414 5636 m  3924 5099 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 3534 6099 m  4484 5099 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 4095 6099 m  5045 5099 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 4655 6099 m  5606 5099 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 5216 6099 m  6167 5099 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 5777 6099 m  6728 5099 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 6338 6099 m  7289 5099 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 6899 6099 m  7850 5099 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 7460 6099 m  8411 5099 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 8021 6099 m  8971 5099 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 8582 6099 m  9212 5436 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 9142 6099 m  9212 6026 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 9022 5099 m  9212 5299 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 8462 5099 m  9212 5889 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 7901 5099 m  8851 6099 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 7340 5099 m  8291 6099 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 6779 5099 m  7730 6099 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 6218 5099 m  7169 6099 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 5657 5099 m  6608 6099 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 5096 5099 m  6047 6099 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 4535 5099 m  5486 6099 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 3975 5099 m  4925 6099 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 3414 5099 m  4365 6099 l  ps
+gr
+gs
+0 lw 1 lj 0.699 0.699 0.699 c 3414 5690 m  3804 6099 l  ps
+gr
+gs
+0 lw 1 lj 0.007 0.007 0.007 c 6312 6099 m  3413 6099 l  3413 5099 l  9212 5099 l 
+9212 6099 l  6312 6099 l  pc
+gr
+gs
+0.007 0.007 0.007 c 4951 5422 m  4951 5832 l  4892 5832 l  4892 5422 l  4741 5422 l 
+4741 5372 l  5101 5372 l  5101 5422 l  4951 5422 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 5462 5832 m  5330 5630 l  5196 5832 l  5130 5832 l  5296 5593 l 
+5143 5370 l  5208 5370 l  5330 5552 l  5449 5370 l  5515 5370 l  5365 5590 l 
+5527 5832 l  5462 5832 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 6045 5655 m  6045 5778 6004 5840 5922 5840 ct 5897 5840 5876 5834 5859 5825 ct 
+5842 5816 5828 5800 5817 5779 ct 5816 5779 l  5816 5785 5816 5796 5815 5809 ct 
+5814 5823 5813 5830 5813 5834 ct 5759 5834 l  5760 5822 5761 5798 5761 5761 ct 
+5761 5347 l  5817 5347 l  5817 5486 l  5817 5500 5816 5517 5815 5536 ct 5817 5536 l 
+5828 5514 5842 5497 5859 5487 ct 5876 5478 5897 5473 5922 5473 ct 5964 5473 5996 5487 6016 5518 ct 
+6036 5547 6045 5593 6045 5655 ct p
+5987 5657 m  5987 5606 5981 5572 5968 5549 ct 5956 5528 5936 5518 5908 5518 ct 
+5876 5518 5854 5529 5839 5552 ct 5825 5575 5817 5610 5817 5661 ct 5817 5707 5825 5741 5839 5763 ct 
+5853 5785 5876 5797 5907 5797 ct 5935 5797 5956 5785 5968 5764 ct 5981 5742 5987 5706 5987 5657 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 6112 5834 m  6112 5347 l  6169 5347 l  6169 5834 l  6112 5834 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 6536 5655 m  6536 5717 6524 5763 6498 5794 ct 6472 5824 6434 5838 6384 5838 ct 
+6335 5838 6298 5823 6273 5792 ct 6248 5760 6236 5715 6236 5655 ct 6236 5533 6286 5472 6386 5472 ct 
+6438 5472 6476 5486 6500 5516 ct 6524 5545 6536 5592 6536 5655 ct p
+6478 5655 m  6478 5605 6471 5570 6457 5548 ct 6444 5525 6420 5515 6387 5515 ct 
+6354 5515 6331 5526 6316 5548 ct 6302 5572 6294 5606 6294 5655 ct 6294 5702 6301 5737 6316 5760 ct 
+6330 5784 6353 5796 6384 5796 ct 6418 5796 6442 5784 6456 5761 ct 6471 5739 6478 5703 6478 5655 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 6645 5653 m  6645 5701 6652 5736 6666 5759 ct 6680 5781 6703 5793 6731 5793 ct 
+6751 5793 6767 5787 6781 5776 ct 6794 5764 6802 5747 6805 5723 ct 6862 5727 l 
+6857 5761 6844 5788 6821 5808 ct 6797 5828 6768 5838 6732 5838 ct 6685 5838 6649 5823 6624 5792 ct 
+6599 5761 6587 5716 6587 5655 ct 6587 5595 6599 5549 6624 5519 ct 6649 5487 6685 5472 6732 5472 ct 
+6766 5472 6795 5481 6817 5500 ct 6840 5518 6854 5544 6860 5577 ct 6803 5582 l 
+6800 5562 6792 5546 6781 5535 ct 6769 5523 6752 5518 6730 5518 ct 6701 5518 6678 5528 6665 5548 ct 
+6652 5569 6645 5604 6645 5653 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 7132 5834 m  7019 5672 l  6977 5707 l  6977 5834 l  6921 5834 l 
+6921 5347 l  6977 5347 l  6977 5652 l  7125 5479 l  7190 5479 l  7054 5632 l 
+7197 5834 l  7132 5834 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 7282 5668 m  7282 5708 7290 5740 7305 5762 ct 7321 5784 7345 5795 7375 5795 ct 
+7399 5795 7419 5789 7433 5780 ct 7448 5769 7458 5757 7463 5741 ct 7512 5756 l 
+7492 5812 7446 5838 7375 5838 ct 7326 5838 7288 5823 7261 5793 ct 7235 5761 7222 5715 7222 5653 ct 
+7222 5594 7235 5549 7261 5518 ct 7288 5487 7325 5472 7373 5472 ct 7472 5472 7521 5534 7521 5659 ct 
+7521 5668 l  7282 5668 l  p
+7463 5622 m  7460 5585 7451 5558 7436 5540 ct 7421 5523 7400 5515 7372 5515 ct 
+7345 5515 7324 5524 7308 5543 ct 7292 5562 7283 5588 7282 5622 ct 7463 5622 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 7801 5777 m  7790 5799 7777 5816 7759 5825 ct 7742 5834 7721 5840 7696 5840 ct 
+7654 5840 7623 5825 7603 5795 ct 7583 5765 7573 5719 7573 5658 ct 7573 5534 7614 5473 7696 5473 ct 
+7721 5473 7743 5477 7760 5487 ct 7777 5497 7790 5513 7801 5534 ct 7801 5494 l 
+7801 5347 l  7857 5347 l  7857 5761 l  7857 5798 7858 5822 7859 5834 ct 7805 5834 l 
+7804 5829 7804 5822 7803 5809 ct 7802 5797 7802 5785 7802 5777 ct 7801 5777 l 
 p
-1878 -31 m  1896 -31 1913 -35 1927 -44 ct 1941 -52 1952 -63 1960 -78 ct 1968 -92 1972 -107 1972 -122 ct 
-1972 -147 l  1918 -146 l  1895 -145 1877 -143 1865 -139 ct 1853 -134 1844 -127 1838 -118 ct 
-1831 -109 1828 -97 1828 -82 ct 1828 -66 1832 -53 1841 -44 ct 1850 -36 1862 -31 1878 -31 ct 
-p ef
-2219 -3 m  2202 2 2186 4 2168 4 ct 2129 4 2109 -19 2109 -64 ct 2109 -263 l  2075 -263 l 
-2075 -299 l  2111 -299 l  2125 -366 l  2159 -366 l  2159 -299 l  2214 -299 l 
-2214 -263 l  2159 -263 l  2159 -74 l  2159 -60 2161 -50 2166 -44 ct 2170 -38 2178 -35 2190 -35 ct 
-2197 -35 2206 -37 2219 -39 ct 2219 -3 l  p ef
-2261 -362 m  2261 -409 l  2310 -409 l  2310 -362 l  2261 -362 l  p
-2261 0 m  2261 -298 l  2310 -298 l  2310 0 l  2261 0 l  p ef
-2577 0 m  2577 -189 l  2577 -209 2575 -224 2571 -235 ct 2568 -246 2561 -254 2553 -258 ct 
-2545 -263 2532 -266 2516 -266 ct 2492 -266 2473 -257 2459 -241 ct 2446 -225 2439 -202 2439 -173 ct 
-2439 0 l  2389 0 l  2389 -235 l  2389 -270 2389 -291 2387 -298 ct 2434 -298 l 
-2434 -298 2435 -295 2435 -291 ct 2435 -287 2435 -282 2436 -277 ct 2436 -272 2436 -262 2436 -247 ct 
-2437 -247 l  2449 -268 2462 -283 2477 -291 ct 2492 -300 2510 -304 2533 -304 ct 
-2565 -304 2589 -296 2604 -280 ct 2619 -263 2627 -236 2627 -199 ct 2627 0 l  2577 0 l 
-p ef
-2814 117 m  2781 117 2756 111 2736 98 ct 2717 85 2705 67 2699 43 ct 2749 36 l 
-2752 50 2760 61 2771 68 ct 2782 75 2797 79 2815 79 ct 2865 79 2889 50 2889 -8 ct 
-2889 -56 l  2889 -56 l  2879 -37 2867 -22 2850 -12 ct 2834 -3 2815 2 2793 2 ct 
-2756 2 2730 -10 2712 -34 ct 2695 -59 2687 -97 2687 -149 ct 2687 -201 2696 -240 2714 -265 ct 
-2733 -290 2761 -303 2799 -303 ct 2820 -303 2838 -298 2853 -289 ct 2869 -279 2881 -265 2889 -247 ct 
-2890 -247 l  2890 -253 2890 -262 2891 -276 ct 2892 -290 2893 -297 2893 -298 ct 
-2940 -298 l  2939 -288 2939 -268 2939 -237 ct 2939 -9 l  2939 75 2897 117 2814 117 ct 
+7631 5657 m  7631 5706 7637 5741 7650 5762 ct 7662 5784 7682 5795 7710 5795 ct 
+7742 5795 7765 5783 7779 5760 ct 7793 5737 7801 5701 7801 5653 ct 7801 5604 7793 5570 7779 5548 ct 
+7765 5526 7742 5516 7711 5516 ct 7683 5516 7663 5526 7650 5548 ct 7638 5570 7631 5606 7631 5657 ct 
+p ef
+gr
+gs
+0.507 0.832 0.109 c 28088 14428 m  26987 14428 l  26987 13093 l  29188 13093 l 
+29188 14428 l  28088 14428 l  p ef
+gr
+gs
+0 lw 1 lj 0.210 0.398 0.644 c 28088 14428 m  26987 14428 l  26987 13091 l 
+29188 13091 l  29188 14428 l  28088 14428 l  pc
+gr
+gs
+0.007 0.007 0.007 c 27817 13990 m  27703 13799 l  27566 13799 l  27566 13990 l 
+27507 13990 l  27507 13532 l  27714 13532 l  27763 13532 27801 13543 27828 13566 ct 
+27854 13589 27868 13621 27868 13662 ct 27868 13697 27858 13725 27839 13747 ct 
+27820 13770 27794 13785 27761 13792 ct 27885 13990 l  27817 13990 l  p
+27808 13663 m  27808 13637 27800 13616 27782 13602 ct 27765 13588 27740 13581 27708 13581 ct 
+27566 13581 l  27566 13749 l  27710 13749 l  27741 13749 27766 13742 27783 13726 ct 
+27800 13713 27808 13690 27808 13663 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 28128 13583 m  28128 13992 l  28068 13992 l  28068 13583 l 
+27918 13583 l  27918 13532 l  28278 13532 l  28278 13583 l  28128 13583 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 28688 13863 m  28688 13905 28673 13939 28641 13963 ct 28610 13986 28564 13998 28507 13998 ct 
+28400 13998 28339 13959 28322 13880 ct 28379 13867 l  28386 13896 28400 13916 28421 13928 ct 
+28443 13942 28472 13949 28509 13949 ct 28547 13949 28578 13941 28599 13927 ct 
+28619 13914 28630 13894 28630 13866 ct 28630 13852 28627 13839 28620 13829 ct 
+28614 13821 28604 13813 28593 13806 ct 28581 13801 28566 13796 28549 13792 ct 
+28533 13787 28515 13783 28495 13778 ct 28461 13769 28434 13762 28417 13754 ct 
+28399 13745 28385 13738 28374 13728 ct 28364 13717 28356 13706 28351 13693 ct 
+28345 13680 28342 13664 28342 13647 ct 28342 13608 28357 13578 28385 13556 ct 
+28414 13535 28455 13524 28508 13524 ct 28558 13524 28597 13533 28623 13548 ct 
+28649 13564 28668 13592 28678 13630 ct 28620 13641 l  28613 13617 28601 13599 28583 13587 ct 
+28564 13577 28539 13572 28508 13572 ct 28473 13572 28446 13577 28428 13589 ct 
+28409 13602 28400 13620 28400 13644 ct 28400 13658 28404 13669 28411 13679 ct 
+28418 13688 28428 13696 28442 13703 ct 28455 13709 28482 13717 28522 13726 ct 
+28535 13729 28549 13733 28562 13736 ct 28576 13739 28589 13744 28601 13747 ct 
+28613 13753 28625 13758 28636 13764 ct 28646 13770 28655 13778 28663 13787 ct 
+28671 13796 28677 13807 28682 13819 ct 28686 13832 28688 13846 28688 13863 ct 
+p ef
+gr
+gs
+0 lw 1 lj 0.007 0.007 0.007 c 25425 14678 m  34721 14678 l  ps
+gr
+gs
+0.007 0.007 0.007 c 25121 14703 m  25422 14809 l  25422 14598 l  25121 14703 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 35026 14690 m  34725 14585 l  34725 14797 l  35026 14690 l 
+p ef
+gr
+gs
+0 lw 1 lj 0.007 0.007 0.007 c 35024 15426 m  35024 14479 l  ps
+gr
+gs
+0.007 0.007 0.007 c 29455 15343 m  29455 15036 l  29455 15002 29455 14969 29457 14938 ct 
+29447 14977 29438 15007 29430 15029 ct 29316 15343 l  29275 15343 l  29161 15029 l 
+29144 14974 l  29134 14938 l  29135 14974 l  29136 15036 l  29136 15343 l 
+29083 15343 l  29083 14881 l  29161 14881 l  29277 15202 l  29280 15215 29285 15228 29288 15243 ct 
+29292 15258 29294 15268 29296 15275 ct 29297 15266 29301 15254 29306 15236 ct 
+29311 15218 29315 15206 29317 15202 ct 29432 14881 l  29508 14881 l  29508 15343 l 
+29455 15343 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 29645 15179 m  29645 15219 29653 15250 29668 15273 ct 29684 15295 29708 15305 29738 15305 ct 
+29762 15305 29783 15300 29797 15290 ct 29812 15280 29822 15267 29827 15251 ct 
+29876 15266 l  29856 15322 29810 15349 29738 15349 ct 29689 15349 29651 15334 29625 15303 ct 
+29599 15271 29586 15225 29586 15164 ct 29586 15104 29599 15060 29625 15028 ct 
+29651 14998 29688 14982 29736 14982 ct 29836 14982 29885 15044 29885 15170 ct 
+29885 15179 l  29645 15179 l  p
+29827 15134 m  29824 15096 29815 15068 29800 15050 ct 29785 15034 29763 15025 29735 15025 ct 
+29708 15025 29687 15035 29671 15054 ct 29655 15073 29646 15099 29645 15134 ct 
+29827 15134 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 30167 15287 m  30156 15309 30143 15326 30125 15336 ct 30108 15345 30087 15350 30062 15350 ct 
+30020 15350 29988 15336 29968 15305 ct 29948 15276 29938 15229 29938 15168 ct 
+29938 15045 29979 14984 30062 14984 ct 30087 14984 30109 14988 30126 14999 ct 
+30143 15008 30156 15024 30167 15045 ct 30167 15005 l  30167 14858 l  30222 14858 l 
+30222 15271 l  30222 15308 30223 15333 30224 15344 ct 30171 15344 l  30170 15340 30170 15333 30169 15320 ct 
+30168 15307 30168 15296 30168 15287 ct 30167 15287 l  p
+29996 15167 m  29996 15217 30002 15251 30016 15273 ct 30028 15295 30048 15305 30076 15305 ct 
+30108 15305 30131 15294 30145 15270 ct 30159 15247 30167 15211 30167 15163 ct 
+30167 15116 30159 15082 30145 15060 ct 30131 15038 30108 15027 30077 15027 ct 
+30049 15027 30029 15038 30016 15060 ct 30003 15082 29996 15118 29996 15167 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 30304 14914 m  30304 14858 l  30361 14858 l  30361 14914 l 
+30304 14914 l  p
+30304 15344 m  30304 14989 l  30361 14989 l  30361 15344 l  30304 15344 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 30500 14988 m  30500 15213 l  30500 15237 30503 15255 30507 15267 ct 
+30511 15281 30518 15289 30528 15296 ct 30537 15301 30551 15304 30570 15304 ct 
+30596 15304 30618 15295 30633 15275 ct 30649 15256 30656 15228 30656 15194 ct 
+30656 14988 l  30712 14988 l  30712 15267 l  30712 15308 30713 15334 30714 15343 ct 
+30661 15343 l  30661 15342 30661 15339 30661 15334 ct 30660 15329 30660 15324 30660 15318 ct 
+30660 15311 30659 15300 30659 15282 ct 30658 15282 l  30645 15307 30630 15324 30613 15335 ct 
+30597 15344 30576 15349 30551 15349 ct 30514 15349 30487 15340 30470 15321 ct 
+30452 15301 30443 15269 30443 15224 ct 30443 14988 l  30500 14988 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 30991 15343 m  30991 15118 l  30991 15084 30987 15060 30978 15047 ct 
+30969 15034 30953 15027 30930 15027 ct 30906 15027 30887 15037 30873 15056 ct 
+30859 15076 30853 15102 30853 15137 ct 30853 15343 l  30797 15343 l  30797 15064 l 
+30797 15023 30796 14998 30795 14988 ct 30848 14988 l  30848 14989 30848 14993 30849 14998 ct 
+30849 15002 30849 15007 30849 15014 ct 30850 15020 30850 15031 30850 15049 ct 
+30851 15049 l  30863 15024 30877 15006 30893 14997 ct 30908 14987 30927 14982 30949 14982 ct 
+30975 14982 30995 14987 31010 14998 ct 31024 15008 31035 15025 31040 15049 ct 
+31041 15049 l  31053 15025 31067 15008 31083 14998 ct 31101 14987 31121 14982 31144 14982 ct 
+31178 14982 31203 14992 31218 15011 ct 31233 15030 31241 15062 31241 15106 ct 
+31241 15343 l  31186 15343 l  31186 15118 l  31186 15084 31181 15060 31173 15047 ct 
+31164 15034 31148 15027 31125 15027 ct 31100 15027 31080 15037 31067 15056 ct 
+31053 15075 31046 15102 31046 15137 ct 31046 15343 l  30991 15343 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 31677 15215 m  31677 15257 31662 15290 31630 15314 ct 31599 15338 31554 15349 31497 15349 ct 
+31389 15349 31328 15309 31311 15231 ct 31368 15219 l  31375 15247 31389 15267 31410 15280 ct 
+31432 15294 31461 15300 31499 15300 ct 31537 15300 31567 15293 31588 15279 ct 
+31608 15265 31619 15245 31619 15218 ct 31619 15203 31616 15190 31609 15181 ct 
+31603 15173 31593 15164 31582 15158 ct 31570 15153 31556 15147 31539 15143 ct 
+31523 15139 31505 15135 31485 15129 ct 31450 15121 31423 15114 31406 15105 ct 
+31388 15097 31374 15088 31363 15079 ct 31353 15068 31345 15057 31340 15043 ct 
+31334 15030 31331 15015 31331 14998 ct 31331 14959 31346 14928 31374 14906 ct 
+31403 14885 31444 14875 31498 14875 ct 31548 14875 31586 14883 31612 14899 ct 
+31638 14915 31657 14942 31667 14981 ct 31609 14992 l  31602 14967 31590 14949 31572 14938 ct 
+31554 14927 31529 14922 31498 14922 ct 31462 14922 31435 14927 31417 14940 ct 
+31398 14953 31389 14970 31389 14995 ct 31389 15008 31393 15020 31400 15029 ct 
+31407 15039 31417 15046 31431 15054 ct 31444 15060 31472 15067 31512 15077 ct 
+31525 15080 31539 15083 31552 15087 ct 31565 15090 31578 15095 31590 15099 ct 
+31602 15104 31614 15109 31625 15116 ct 31635 15122 31644 15129 31652 15139 ct 
+31660 15147 31666 15159 31671 15170 ct 31675 15183 31677 15198 31677 15215 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 31764 15482 m  31749 15482 31736 15481 31726 15479 ct 31726 15434 l 
+31734 15435 31742 15436 31752 15436 ct 31787 15436 31814 15408 31834 15355 ct 
+31840 15341 l  31707 14988 l  31766 14988 l  31837 15184 l  31838 15187 31839 15190 31841 15195 ct 
+31842 15200 31848 15214 31855 15238 ct 31863 15262 31868 15276 31868 15278 ct 
+31890 15214 l  31963 14988 l  32022 14988 l  31893 15342 l  31879 15380 31867 15408 31855 15426 ct 
+31842 15445 31828 15460 31814 15468 ct 31799 15478 31783 15482 31764 15482 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 32280 15343 m  32280 15118 l  32280 15095 32278 15077 32273 15064 ct 
+32269 15050 32262 15042 32253 15036 ct 32243 15030 32229 15027 32211 15027 ct 
+32184 15027 32163 15037 32147 15057 ct 32132 15076 32124 15103 32124 15137 ct 
+32124 15343 l  32067 15343 l  32067 15064 l  32067 15023 32066 14998 32065 14988 ct 
+32119 14988 l  32119 14989 32119 14993 32120 14998 ct 32120 15002 32120 15007 32120 15014 ct 
+32121 15020 32121 15031 32121 15049 ct 32122 15049 l  32135 15024 32150 15007 32167 14997 ct 
+32184 14987 32205 14982 32230 14982 ct 32266 14982 32293 14992 32310 15010 ct 
+32327 15030 32336 15062 32336 15106 ct 32336 15343 l  32280 15343 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 32459 15164 m  32459 15211 32466 15246 32480 15269 ct 32494 15291 32517 15303 32545 15303 ct 
+32565 15303 32581 15298 32595 15286 ct 32608 15275 32616 15258 32619 15234 ct 
+32676 15238 l  32671 15271 32658 15299 32635 15319 ct 32611 15339 32582 15349 32546 15349 ct 
+32499 15349 32463 15334 32438 15302 ct 32413 15271 32401 15226 32401 15166 ct 
+32401 15105 32413 15060 32438 15029 ct 32463 14998 32499 14982 32546 14982 ct 
+32580 14982 32609 14992 32631 15010 ct 32654 15028 32668 15055 32674 15087 ct 
+32617 15093 l  32614 15073 32606 15057 32595 15045 ct 32583 15034 32566 15028 32544 15028 ct 
+32515 15028 32492 15039 32479 15059 ct 32466 15080 32459 15115 32459 15164 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 33121 15108 m  33121 15156 33112 15197 33095 15233 ct 33076 15268 33051 15296 33019 15315 ct 
+32987 15334 32950 15343 32907 15343 ct 32744 15343 l  32744 14882 l  32889 14882 l 
+32963 14882 33020 14902 33060 14941 ct 33101 14980 33121 15036 33121 15108 ct 
 p
-2889 -149 m  2889 -173 2886 -194 2879 -212 ct 2873 -229 2864 -243 2852 -252 ct 
-2839 -261 2826 -266 2811 -266 ct 2785 -266 2767 -257 2755 -238 ct 2744 -220 2738 -190 2738 -149 ct 
-2738 -108 2743 -79 2754 -61 ct 2765 -44 2784 -35 2810 -35 ct 2825 -35 2839 -39 2851 -48 ct 
-2863 -58 2873 -71 2879 -88 ct 2886 -105 2889 -126 2889 -149 ct p ef
-3423 -149 m  3423 -97 3412 -58 3389 -32 ct 3366 -7 3332 6 3289 6 ct 3245 6 3212 -7 3190 -34 ct 
-3168 -60 3157 -99 3157 -149 ct 3157 -252 3201 -304 3290 -304 ct 3336 -304 3369 -291 3391 -266 ct 
-3412 -241 3423 -202 3423 -149 ct p
-3371 -149 m  3371 -190 3365 -220 3353 -239 ct 3340 -258 3320 -267 3291 -267 ct 
-3262 -267 3241 -257 3228 -238 ct 3215 -219 3209 -190 3209 -149 ct 3209 -110 3215 -80 3228 -60 ct 
-3241 -41 3261 -31 3288 -31 ct 3318 -31 3339 -40 3352 -59 ct 3365 -79 3371 -108 3371 -149 ct 
-p ef
-3673 0 m  3673 -189 l  3673 -209 3671 -224 3667 -235 ct 3664 -246 3657 -254 3649 -258 ct 
-3641 -263 3628 -266 3612 -266 ct 3588 -266 3569 -257 3555 -241 ct 3542 -225 3535 -202 3535 -173 ct 
-3535 0 l  3485 0 l  3485 -235 l  3485 -270 3485 -291 3483 -298 ct 3530 -298 l 
-3530 -298 3531 -295 3531 -291 ct 3531 -287 3531 -282 3532 -277 ct 3532 -272 3532 -262 3532 -247 ct 
-3533 -247 l  3545 -268 3558 -283 3573 -291 ct 3588 -300 3606 -304 3629 -304 ct 
-3661 -304 3685 -296 3700 -280 ct 3715 -263 3723 -236 3723 -199 ct 3723 0 l  3673 0 l 
-p ef
-3954 1 m  3954 -409 l  4004 -409 l  4004 1 l  3954 1 l  p ef
-4081 -362 m  4081 -409 l  4130 -409 l  4130 -362 l  4081 -362 l  p
-4081 0 m  4081 -298 l  4130 -298 l  4130 0 l  4081 0 l  p ef
-4397 0 m  4397 -189 l  4397 -209 4395 -224 4391 -235 ct 4388 -246 4381 -254 4373 -258 ct 
-4365 -263 4352 -266 4336 -266 ct 4312 -266 4293 -257 4279 -241 ct 4266 -225 4259 -202 4259 -173 ct 
-4259 0 l  4209 0 l  4209 -235 l  4209 -270 4209 -291 4207 -298 ct 4254 -298 l 
-4254 -298 4255 -295 4255 -291 ct 4255 -287 4255 -282 4256 -277 ct 4256 -272 4256 -262 4256 -247 ct 
-4257 -247 l  4269 -268 4282 -283 4297 -291 ct 4312 -300 4330 -304 4353 -304 ct 
-4385 -304 4409 -296 4424 -280 ct 4439 -263 4447 -236 4447 -199 ct 4447 0 l  4397 0 l 
+33061 15108 m  33061 15051 33046 15007 33016 14978 ct 32987 14947 32944 14933 32887 14933 ct 
+32803 14933 l  32803 15294 l  32901 15294 l  32933 15294 32961 15285 32985 15270 ct 
+33009 15256 33028 15235 33041 15207 ct 33054 15179 33061 15146 33061 15108 ct 
 p ef
-4708 0 m  4607 -136 l  4571 -106 l  4571 0 l  4521 0 l  4521 -409 l  4571 -409 l 
-4571 -153 l  4701 -298 l  4760 -298 l  4639 -170 l  4766 0 l  4708 0 l 
+gr
+gs
+0.007 0.007 0.007 c 33235 15179 m  33235 15219 33243 15250 33258 15273 ct 33274 15295 33298 15305 33328 15305 ct 
+33353 15305 33373 15300 33387 15290 ct 33402 15280 33412 15267 33417 15251 ct 
+33466 15266 l  33446 15322 33400 15349 33328 15349 ct 33279 15349 33241 15334 33215 15303 ct 
+33189 15271 33176 15225 33176 15164 ct 33176 15104 33189 15060 33215 15028 ct 
+33241 14998 33278 14982 33326 14982 ct 33426 14982 33475 15044 33475 15170 ct 
+33475 15179 l  33235 15179 l  p
+33417 15134 m  33414 15096 33405 15068 33390 15050 ct 33375 15034 33354 15025 33325 15025 ct 
+33298 15025 33277 15035 33261 15054 ct 33245 15073 33236 15099 33235 15134 ct 
+33417 15134 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 33543 15344 m  33543 14858 l  33600 14858 l  33600 15344 l 
+33543 15344 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 33767 15349 m  33734 15349 33708 15340 33691 15321 ct 33674 15303 33667 15277 33667 15244 ct 
+33667 15207 33677 15180 33700 15160 ct 33723 15141 33760 15129 33811 15127 ct 
+33886 15126 l  33886 15107 l  33886 15079 33880 15058 33869 15045 ct 33857 15033 33839 15027 33814 15027 ct 
+33789 15027 33771 15031 33760 15040 ct 33748 15049 33741 15063 33739 15083 ct 
+33681 15078 l  33690 15014 33735 14982 33815 14982 ct 33858 14982 33889 14993 33911 15013 ct 
+33933 15033 33944 15062 33944 15101 ct 33944 15254 l  33944 15271 33946 15285 33950 15294 ct 
+33954 15302 33963 15306 33975 15306 ct 33980 15306 33986 15306 33993 15304 ct 
+33993 15341 l  33979 15344 33965 15346 33950 15346 ct 33928 15346 33913 15341 33904 15329 ct 
+33895 15318 33889 15300 33888 15276 ct 33886 15276 l  33872 15302 33855 15321 33836 15333 ct 
+33817 15344 33794 15349 33767 15349 ct p
+33780 15305 m  33801 15305 33819 15300 33835 15290 ct 33851 15281 33863 15267 33872 15250 ct 
+33882 15234 33886 15216 33886 15198 ct 33886 15168 l  33825 15169 l  33799 15170 33779 15174 33765 15178 ct 
+33752 15183 33741 15191 33734 15202 ct 33728 15214 33723 15227 33723 15245 ct 
+33723 15264 33728 15279 33738 15289 ct 33748 15300 33762 15305 33780 15305 ct 
 p ef
-4966 0 m  4966 -42 l  5065 -42 l  5065 -341 l  4977 -278 l  4977 -325 l 
-5069 -389 l  5115 -389 l  5115 -42 l  5209 -42 l  5209 0 l  4966 0 l  p ef
-pom
+gr
 gs
-0.933 0.933 0.933 c 25096 17408 m  25097 17408 l  24806 17408 24520 17423 24268 17452 ct 
-24016 17480 23807 17521 23661 17571 ct 23516 17620 23439 17676 23439 17734 ct 
-23439 17977 l  23439 18221 l  23439 18553 l  23439 18797 l  23439 19041 l 
-23439 19041 l  23439 19099 23516 19155 23661 19204 ct 23807 19254 24016 19295 24268 19323 ct 
-24520 19352 24806 19367 25097 19367 ct 26338 19366 l  27580 19366 l  29269 19366 l 
-30511 19366 l  31753 19366 l  31753 19367 l  32044 19367 32330 19352 32582 19323 ct 
-32834 19295 33043 19254 33189 19204 ct 33334 19155 33411 19099 33411 19041 ct 
-33411 18797 l  33411 18553 l  33411 18221 l  33411 17977 l  33411 17733 l 
-33411 17734 l  33411 17734 l  33411 17676 33334 17620 33189 17571 ct 33043 17521 32834 17480 32582 17452 ct 
-32330 17423 32044 17408 31753 17408 ct 30511 17408 l  29269 17408 l  27580 17408 l 
-27577 16551 l  25096 17408 l  p ef
-gr
-gs
-0 lw 1 lj 25095 17408 m  25096 17408 l  24805 17408 24519 17423 24267 17452 ct 
-24015 17480 23806 17521 23660 17571 ct 23515 17620 23438 17676 23438 17734 ct 
-23438 17977 l  23438 18221 l  23438 18553 l  23438 18797 l  23438 19041 l 
-23438 19041 l  23438 19099 23515 19155 23660 19204 ct 23806 19254 24015 19295 24267 19323 ct 
-24519 19352 24805 19367 25096 19367 ct 26337 19366 l  27579 19366 l  29269 19366 l 
-30511 19366 l  31753 19366 l  31753 19367 l  32044 19367 32330 19352 32582 19323 ct 
-32834 19295 33043 19254 33189 19204 ct 33334 19155 33411 19099 33411 19041 ct 
-33411 18797 l  33411 18553 l  33411 18221 l  33411 17977 l  33411 17733 l 
-33411 17734 l  33411 17734 l  33411 17676 33334 17620 33189 17571 ct 33043 17521 32834 17480 32582 17452 ct 
-32330 17423 32044 17408 31753 17408 ct 30511 17408 l  29269 17408 l  27579 17408 l 
-27576 16551 l  25095 17408 l  pc
+0.007 0.007 0.007 c 34050 15482 m  34034 15482 34021 15481 34011 15479 ct 34011 15434 l 
+34019 15435 34027 15436 34038 15436 ct 34073 15436 34100 15408 34120 15355 ct 
+34126 15341 l  33992 14988 l  34052 14988 l  34123 15184 l  34124 15187 34125 15190 34127 15195 ct 
+34128 15200 34133 15214 34140 15238 ct 34148 15262 34153 15276 34153 15278 ct 
+34175 15214 l  34248 14988 l  34307 14988 l  34178 15342 l  34164 15380 34152 15408 34140 15426 ct 
+34128 15445 34114 15460 34100 15468 ct 34085 15478 34069 15482 34050 15482 ct 
+p ef
 gr
-pum
-24695 17954 t
-46 0 m  46 -389 l  99 -389 l  99 -43 l  295 -43 l  295 0 l  46 0 l  p ef
-351 -362 m  351 -409 l  400 -409 l  400 -362 l  351 -362 l  p
-351 0 m  351 -298 l  400 -298 l  400 0 l  351 0 l  p ef
-652 0 m  652 -189 l  652 -218 648 -238 640 -249 ct 632 -260 618 -266 597 -266 ct 
-576 -266 559 -258 547 -241 ct 535 -225 528 -202 528 -173 ct 528 0 l  479 0 l 
-479 -235 l  479 -270 479 -291 477 -298 ct 524 -298 l  524 -298 525 -295 525 -291 ct 
-525 -287 525 -282 526 -277 ct 526 -272 526 -262 526 -247 ct 527 -247 l  538 -269 550 -283 564 -292 ct 
-578 -300 595 -304 614 -304 ct 637 -304 655 -300 668 -290 ct 681 -281 690 -267 695 -247 ct 
-696 -247 l  706 -268 719 -282 733 -291 ct 748 -300 766 -304 786 -304 ct 817 -304 838 -296 852 -279 ct 
-866 -263 873 -236 873 -199 ct 873 0 l  824 0 l  824 -189 l  824 -218 820 -238 812 -249 ct 
-804 -260 790 -266 769 -266 ct 747 -266 731 -258 719 -242 ct 707 -225 701 -203 701 -173 ct 
-701 0 l  652 0 l  p ef
-948 -362 m  948 -409 l  997 -409 l  997 -362 l  948 -362 l  p
-948 0 m  948 -298 l  997 -298 l  997 0 l  948 0 l  p ef
-1190 -3 m  1173 2 1157 4 1139 4 ct 1100 4 1080 -19 1080 -64 ct 1080 -263 l  1046 -263 l 
-1046 -299 l  1082 -299 l  1096 -366 l  1130 -366 l  1130 -299 l  1185 -299 l 
-1185 -263 l  1130 -263 l  1130 -74 l  1130 -60 1132 -50 1137 -44 ct 1141 -38 1149 -35 1161 -35 ct 
-1168 -35 1177 -37 1190 -39 ct 1190 -3 l  p ef
-1270 -138 m  1270 -104 1277 -78 1291 -59 ct 1305 -41 1326 -31 1353 -31 ct 1375 -31 1392 -36 1405 -44 ct 
-1418 -53 1427 -64 1431 -77 ct 1475 -65 l  1457 -18 1416 6 1353 6 ct 1309 6 1276 -7 1253 -33 ct 
-1229 -60 1218 -99 1218 -151 ct 1218 -200 1229 -238 1253 -264 ct 1276 -291 1308 -304 1351 -304 ct 
-1439 -304 1483 -251 1483 -145 ct 1483 -138 l  1270 -138 l  p
-1431 -176 m  1429 -208 1421 -231 1407 -245 ct 1394 -260 1375 -267 1350 -267 ct 
-1326 -267 1307 -259 1293 -243 ct 1279 -227 1272 -204 1271 -176 ct 1431 -176 l 
-p ef
-1733 -48 m  1724 -28 1712 -15 1697 -6 ct 1681 2 1663 6 1640 6 ct 1603 6 1575 -7 1557 -32 ct 
-1540 -57 1531 -96 1531 -147 ct 1531 -252 1567 -304 1640 -304 ct 1663 -304 1682 -300 1697 -291 ct 
-1712 -283 1724 -270 1733 -252 ct 1734 -252 l  1733 -285 l  1733 -409 l  1783 -409 l 
-1783 -61 l  1783 -30 1783 -9 1784 0 ct 1737 0 l  1736 -2 1736 -9 1735 -20 ct 
-1735 -31 1734 -40 1734 -48 ct 1733 -48 l  p
-1583 -149 m  1583 -107 1588 -77 1599 -59 ct 1610 -41 1628 -32 1653 -32 ct 1681 -32 1701 -42 1714 -62 ct 
-1727 -81 1733 -111 1733 -152 ct 1733 -192 1727 -221 1714 -239 ct 1701 -258 1681 -267 1654 -267 ct 
-1629 -267 1611 -258 1599 -239 ct 1588 -221 1583 -191 1583 -149 ct p ef
-2204 0 m  2204 -189 l  2204 -209 2202 -224 2198 -235 ct 2195 -246 2188 -254 2180 -258 ct 
-2172 -263 2159 -266 2143 -266 ct 2119 -266 2100 -257 2086 -241 ct 2073 -225 2066 -202 2066 -173 ct 
-2066 0 l  2016 0 l  2016 -235 l  2016 -270 2016 -291 2014 -298 ct 2061 -298 l 
-2061 -298 2062 -295 2062 -291 ct 2062 -287 2062 -282 2063 -277 ct 2063 -272 2063 -262 2063 -247 ct 
-2064 -247 l  2076 -268 2089 -283 2104 -291 ct 2119 -300 2137 -304 2160 -304 ct 
-2192 -304 2216 -296 2231 -280 ct 2246 -263 2254 -236 2254 -199 ct 2254 0 l  2204 0 l 
-p ef
-2376 -298 m  2376 -109 l  2376 -89 2378 -74 2382 -63 ct 2386 -52 2392 -44 2401 -40 ct 
-2409 -35 2422 -32 2438 -32 ct 2462 -32 2481 -41 2494 -57 ct 2508 -73 2515 -96 2515 -125 ct 
-2515 -298 l  2565 -298 l  2565 -63 l  2565 -28 2565 -7 2566 0 ct 2519 0 l 
-2519 0 2519 -3 2519 -7 ct 2519 -11 2518 -16 2518 -21 ct 2518 -26 2518 -36 2517 -51 ct 
-2516 -51 l  2505 -30 2492 -15 2477 -7 ct 2462 2 2443 6 2421 6 ct 2388 6 2364 -2 2349 -18 ct 
-2334 -35 2327 -62 2327 -99 ct 2327 -298 l  2376 -298 l  p ef
-2816 0 m  2816 -189 l  2816 -218 2812 -238 2804 -249 ct 2796 -260 2782 -266 2761 -266 ct 
-2740 -266 2723 -258 2711 -241 ct 2699 -225 2692 -202 2692 -173 ct 2692 0 l  2643 0 l 
-2643 -235 l  2643 -270 2643 -291 2641 -298 ct 2688 -298 l  2688 -298 2689 -295 2689 -291 ct 
-2689 -287 2689 -282 2690 -277 ct 2690 -272 2690 -262 2690 -247 ct 2691 -247 l 
-2702 -269 2714 -283 2728 -292 ct 2742 -300 2759 -304 2778 -304 ct 2801 -304 2819 -300 2832 -290 ct 
-2845 -281 2854 -267 2859 -247 ct 2860 -247 l  2870 -268 2883 -282 2897 -291 ct 
-2912 -300 2930 -304 2950 -304 ct 2981 -304 3002 -296 3016 -279 ct 3030 -263 3037 -236 3037 -199 ct 
-3037 0 l  2988 0 l  2988 -189 l  2988 -218 2984 -238 2976 -249 ct 2968 -260 2954 -266 2933 -266 ct 
-2911 -266 2895 -258 2883 -242 ct 2871 -225 2865 -203 2865 -173 ct 2865 0 l  2816 0 l 
-p ef
-3363 -150 m  3363 -46 3326 6 3253 6 ct 3231 6 3212 2 3197 -6 ct 3182 -14 3170 -28 3161 -46 ct 
-3160 -46 l  3160 -40 3160 -31 3159 -20 ct 3158 -8 3158 -1 3157 0 ct 3109 0 l 
-3110 -9 3111 -30 3111 -61 ct 3111 -409 l  3161 -409 l  3161 -292 l  3161 -280 3160 -266 3159 -250 ct 
-3161 -250 l  3170 -269 3182 -283 3197 -291 ct 3212 -299 3231 -303 3253 -303 ct 
-3291 -303 3319 -291 3336 -265 ct 3354 -240 3363 -202 3363 -150 ct p
-3311 -148 m  3311 -190 3305 -220 3294 -238 ct 3283 -256 3266 -265 3241 -265 ct 
-3213 -265 3192 -255 3180 -236 ct 3167 -217 3161 -187 3161 -145 ct 3161 -106 3167 -77 3179 -59 ct 
-3192 -40 3212 -31 3240 -31 ct 3265 -31 3283 -40 3294 -58 ct 3305 -77 3311 -107 3311 -148 ct 
-p ef
-3463 -138 m  3463 -104 3470 -78 3484 -59 ct 3498 -41 3519 -31 3546 -31 ct 3568 -31 3585 -36 3598 -44 ct 
-3611 -53 3620 -64 3624 -77 ct 3668 -65 l  3650 -18 3609 6 3546 6 ct 3502 6 3469 -7 3446 -33 ct 
-3422 -60 3411 -99 3411 -151 ct 3411 -200 3422 -238 3446 -264 ct 3469 -291 3501 -304 3544 -304 ct 
-3632 -304 3676 -251 3676 -145 ct 3676 -138 l  3463 -138 l  p
-3624 -176 m  3622 -208 3614 -231 3600 -245 ct 3587 -260 3568 -267 3543 -267 ct 
-3519 -267 3500 -259 3486 -243 ct 3472 -227 3465 -204 3464 -176 ct 3624 -176 l 
-p ef
-3739 0 m  3739 -229 l  3739 -250 3739 -273 3737 -298 ct 3784 -298 l  3786 -265 3786 -244 3786 -238 ct 
-3788 -238 l  3795 -263 3805 -281 3815 -290 ct 3825 -299 3840 -304 3858 -304 ct 
-3865 -304 3872 -303 3878 -301 ct 3878 -256 l  3872 -258 3863 -258 3852 -258 ct 
-3831 -258 3816 -250 3805 -232 ct 3794 -214 3789 -189 3789 -156 ct 3789 0 l  3739 0 l 
-p ef
-4333 -149 m  4333 -97 4322 -58 4299 -32 ct 4276 -7 4242 6 4199 6 ct 4155 6 4122 -7 4100 -34 ct 
-4078 -60 4067 -99 4067 -149 ct 4067 -252 4111 -304 4200 -304 ct 4246 -304 4279 -291 4301 -266 ct 
-4322 -241 4333 -202 4333 -149 ct p
-4281 -149 m  4281 -190 4275 -220 4263 -239 ct 4250 -258 4230 -267 4201 -267 ct 
-4172 -267 4151 -257 4138 -238 ct 4125 -219 4119 -190 4119 -149 ct 4119 -110 4125 -80 4138 -60 ct 
-4151 -41 4171 -31 4198 -31 ct 4228 -31 4249 -40 4262 -59 ct 4275 -79 4281 -108 4281 -149 ct 
-p ef
-4455 -263 m  4455 0 l  4406 0 l  4406 -263 l  4364 -263 l  4364 -299 l 
-4406 -299 l  4406 -333 l  4406 -360 4412 -379 4424 -391 ct 4436 -403 4454 -409 4479 -409 ct 
-4492 -409 4504 -408 4514 -406 ct 4514 -368 l  4505 -369 4498 -370 4492 -370 ct 
-4479 -370 4470 -367 4464 -360 ct 4458 -354 4455 -342 4455 -326 ct 4455 -299 l 
-4514 -299 l  4514 -263 l  4455 -263 l  p ef
-4783 6 m  4753 6 4731 -2 4716 -18 ct 4700 -34 4693 -55 4693 -83 ct 4693 -114 4703 -138 4723 -154 ct 
-4744 -171 4776 -180 4822 -181 ct 4888 -182 l  4888 -198 l  4888 -222 4883 -240 4873 -250 ct 
-4863 -261 4847 -266 4825 -266 ct 4802 -266 4786 -262 4776 -255 ct 4766 -247 4760 -235 4758 -219 ct 
-4706 -223 l  4715 -277 4754 -304 4826 -304 ct 4863 -304 4891 -295 4910 -278 ct 
-4929 -261 4939 -236 4939 -203 ct 4939 -74 l  4939 -60 4941 -49 4944 -41 ct 4948 -34 4956 -30 4966 -30 ct 
-4971 -30 4977 -31 4983 -32 ct 4983 -1 l  4970 2 4957 3 4944 3 ct 4926 3 4913 -1 4904 -11 ct 
-4896 -21 4891 -36 4890 -57 ct 4888 -57 l  4876 -34 4861 -18 4844 -8 ct 4827 1 4807 6 4783 6 ct 
+gs
+0.507 0.832 0.109 c 30937 14428 m  29838 14428 l  29838 13093 l  32038 13093 l 
+32038 14428 l  30937 14428 l  p ef
+gr
+gs
+0 lw 1 lj 0.210 0.398 0.644 c 30937 14428 m  29838 14428 l  29838 13091 l 
+32038 13091 l  32038 14428 l  30937 14428 l  pc
+gr
+gs
+0.007 0.007 0.007 c 30668 13990 m  30553 13799 l  30417 13799 l  30417 13990 l 
+30358 13990 l  30358 13532 l  30564 13532 l  30613 13532 30652 13543 30679 13566 ct 
+30705 13589 30718 13621 30718 13662 ct 30718 13697 30709 13725 30690 13747 ct 
+30671 13770 30645 13785 30611 13792 ct 30735 13990 l  30668 13990 l  p
+30659 13663 m  30659 13637 30651 13616 30632 13602 ct 30615 13588 30590 13581 30558 13581 ct 
+30417 13581 l  30417 13749 l  30560 13749 l  30591 13749 30616 13742 30633 13726 ct 
+30651 13713 30659 13690 30659 13663 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 30978 13583 m  30978 13992 l  30918 13992 l  30918 13583 l 
+30768 13583 l  30768 13532 l  31128 13532 l  31128 13583 l  30978 13583 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 31538 13863 m  31538 13905 31523 13939 31491 13963 ct 31459 13986 31414 13998 31357 13998 ct 
+31250 13998 31189 13959 31172 13880 ct 31229 13867 l  31236 13896 31250 13916 31271 13928 ct 
+31293 13942 31322 13949 31359 13949 ct 31397 13949 31427 13941 31448 13927 ct 
+31468 13914 31479 13894 31479 13866 ct 31479 13852 31476 13839 31469 13829 ct 
+31463 13821 31453 13813 31442 13806 ct 31430 13801 31416 13796 31399 13792 ct 
+31383 13787 31365 13783 31345 13778 ct 31311 13769 31284 13762 31267 13754 ct 
+31249 13745 31235 13738 31224 13728 ct 31214 13717 31206 13706 31201 13693 ct 
+31195 13680 31192 13664 31192 13647 ct 31192 13608 31207 13578 31235 13556 ct 
+31264 13535 31305 13524 31358 13524 ct 31408 13524 31446 13533 31472 13548 ct 
+31499 13564 31518 13592 31528 13630 ct 31469 13641 l  31462 13617 31450 13599 31432 13587 ct 
+31414 13577 31389 13572 31358 13572 ct 31323 13572 31296 13577 31278 13589 ct 
+31259 13602 31250 13620 31250 13644 ct 31250 13658 31254 13669 31261 13679 ct 
+31268 13688 31278 13696 31292 13703 ct 31305 13709 31332 13717 31372 13726 ct 
+31385 13729 31399 13733 31412 13736 ct 31425 13739 31438 13744 31450 13747 ct 
+31462 13753 31474 13758 31485 13764 ct 31496 13770 31505 13778 31513 13787 ct 
+31521 13796 31527 13807 31532 13819 ct 31536 13832 31538 13846 31538 13863 ct 
+p ef
+gr
+gs
+0.507 0.832 0.109 c 33786 14428 m  32686 14428 l  32686 13093 l  34887 13093 l 
+34887 14428 l  33786 14428 l  p ef
+gr
+gs
+0 lw 1 lj 0.210 0.398 0.644 c 33786 14428 m  32686 14428 l  32686 13091 l 
+34886 13091 l  34886 14428 l  33786 14428 l  pc
+gr
+gs
+0.007 0.007 0.007 c 33516 13990 m  33402 13799 l  33265 13799 l  33265 13990 l 
+33206 13990 l  33206 13532 l  33413 13532 l  33462 13532 33500 13543 33527 13566 ct 
+33553 13589 33567 13621 33567 13662 ct 33567 13697 33557 13725 33538 13747 ct 
+33519 13770 33493 13785 33460 13792 ct 33584 13990 l  33516 13990 l  p
+33507 13663 m  33507 13637 33499 13616 33481 13602 ct 33464 13588 33439 13581 33407 13581 ct 
+33265 13581 l  33265 13749 l  33409 13749 l  33440 13749 33465 13742 33482 13726 ct 
+33499 13713 33507 13690 33507 13663 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 33826 13583 m  33826 13992 l  33767 13992 l  33767 13583 l 
+33617 13583 l  33617 13532 l  33977 13532 l  33977 13583 l  33826 13583 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 34387 13863 m  34387 13905 34372 13939 34340 13963 ct 34309 13986 34264 13998 34207 13998 ct 
+34100 13998 34039 13959 34021 13880 ct 34079 13867 l  34086 13896 34100 13916 34121 13928 ct 
+34143 13942 34172 13949 34209 13949 ct 34247 13949 34277 13941 34298 13927 ct 
+34318 13914 34329 13894 34329 13866 ct 34329 13852 34326 13839 34319 13829 ct 
+34313 13821 34303 13813 34292 13806 ct 34280 13801 34266 13796 34249 13792 ct 
+34233 13787 34215 13783 34195 13778 ct 34161 13769 34134 13762 34117 13754 ct 
+34099 13745 34085 13738 34074 13728 ct 34064 13717 34056 13706 34051 13693 ct 
+34045 13680 34042 13664 34042 13647 ct 34042 13608 34057 13578 34085 13556 ct 
+34114 13535 34155 13524 34208 13524 ct 34258 13524 34296 13533 34322 13548 ct 
+34348 13564 34367 13592 34377 13630 ct 34319 13641 l  34312 13617 34300 13599 34282 13587 ct 
+34264 13577 34239 13572 34208 13572 ct 34173 13572 34146 13577 34128 13589 ct 
+34109 13602 34100 13620 34100 13644 ct 34100 13658 34104 13669 34111 13679 ct 
+34118 13688 34128 13696 34142 13703 ct 34155 13709 34182 13717 34222 13726 ct 
+34235 13729 34249 13733 34262 13736 ct 34275 13739 34288 13744 34300 13747 ct 
+34312 13753 34324 13758 34335 13764 ct 34345 13770 34354 13778 34362 13787 ct 
+34370 13796 34376 13807 34381 13819 ct 34385 13832 34387 13846 34387 13863 ct 
+p ef
+gr
+gs
+0 lw 1 lj 0.007 0.007 0.007 c -13 12983 m  35220 12983 l  ps
+gr
+gs
+0.933 0.933 0.933 c 9152 7914 m  9153 7914 l  8972 7914 8794 7927 8638 7954 ct 
+8482 7980 8352 8019 8261 8064 ct 8171 8109 8123 8161 8123 8214 ct 8123 8439 l 
+8123 8665 l  8123 8972 l  8123 9198 l  8123 9422 l  8123 9423 l  8123 9476 8171 9527 8261 9574 ct 
+8352 9620 8482 9659 8638 9685 ct 8794 9712 8972 9725 9153 9725 ct 9924 9725 l 
+10696 9725 l  11747 9725 l  12520 9725 l  13292 9725 l  13473 9725 13651 9712 13808 9685 ct 
+13964 9659 14094 9620 14185 9574 ct 14275 9527 14323 9476 14323 9423 ct 14323 9198 l 
+14323 8972 l  14323 8665 l  14323 8439 l  14323 8214 l  14323 8161 14275 8109 14185 8064 ct 
+14094 8019 13964 7980 13808 7954 ct 13651 7927 13473 7914 13292 7914 ct 12996 6978 l 
+11747 7914 l  10696 7914 l  9924 7914 l  9152 7914 l  p ef
+gr
+gs
+0 lw 1 lj 0.007 0.007 0.007 c 9152 7913 m  9153 7913 l  8972 7913 8794 7927 8637 7953 ct 
+8481 7979 8351 8018 8260 8064 ct 8170 8109 8122 8159 8122 8212 ct 8122 8437 l 
+8122 8664 l  8122 8970 l  8122 9196 l  8122 9421 l  8122 9422 l  8122 9474 8170 9526 8260 9572 ct 
+8351 9618 8481 9657 8637 9684 ct 8794 9710 8972 9724 9153 9724 ct 9924 9724 l 
+10696 9724 l  11747 9724 l  12520 9724 l  13292 9724 l  13473 9724 13651 9710 13808 9684 ct 
+13964 9657 14094 9618 14185 9572 ct 14275 9526 14323 9474 14323 9422 ct 14323 9196 l 
+14323 8970 l  14323 8664 l  14323 8437 l  14323 8212 l  14323 8159 14275 8109 14185 8064 ct 
+14094 8018 13964 7979 13808 7953 ct 13651 7927 13473 7913 13292 7913 ct 12996 6977 l 
+11747 7913 l  10696 7913 l  9924 7913 l  9152 7913 l  pc
+gr
+gs
+0.007 0.007 0.007 c 8937 8693 m  8893 8574 l  8715 8574 l  8671 8693 l  8616 8693 l 
+8774 8283 l  8834 8283 l  8991 8693 l  8937 8693 l  p
+8804 8325 m  8801 8333 l  8797 8349 8790 8370 8781 8396 ct 8731 8530 l  8877 8530 l 
+8827 8396 l  8821 8382 8816 8367 8811 8349 ct 8804 8325 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 9078 8379 m  9078 8579 l  9078 8600 9080 8616 9084 8627 ct 
+9088 8639 9094 8647 9104 8652 ct 9112 8657 9125 8660 9141 8660 ct 9165 8660 9184 8650 9197 8634 ct 
+9211 8617 9218 8593 9218 8562 ct 9218 8379 l  9268 8379 l  9268 8627 l  9268 8664 9268 8686 9269 8694 ct 
+9222 8694 l  9222 8694 9222 8690 9222 8686 ct 9222 8682 9221 8677 9221 8672 ct 
+9221 8666 9221 8656 9220 8640 ct 9219 8640 l  9208 8662 9195 8678 9180 8686 ct 
+9165 8696 9146 8700 9124 8700 ct 9090 8700 9066 8692 9051 8675 ct 9036 8657 9029 8628 9029 8589 ct 
+9029 8379 l  9078 8379 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 9526 8694 m  9445 8564 l  9365 8694 l  9311 8694 l  9417 8532 l 
+9316 8379 l  9371 8379 l  9445 8501 l  9519 8379 l  9576 8379 l  9474 8530 l 
+9582 8694 l  9526 8694 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 10092 8408 m  10092 8447 10080 8478 10057 8500 ct 10033 8523 10000 8535 9959 8535 ct 
+9845 8535 l  9845 8695 l  9791 8695 l  9791 8284 l  9956 8284 l  9999 8284 10033 8295 10057 8316 ct 
+10081 8338 10092 8368 10092 8408 ct p
+10040 8408 m  10040 8355 10009 8328 9949 8328 ct 9845 8328 l  9845 8490 l 
+9951 8490 l  10010 8490 10040 8463 10040 8408 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 10431 8694 m  10431 8504 l  10221 8504 l  10221 8694 l 
+10168 8694 l  10168 8283 l  10221 8283 l  10221 8458 l  10431 8458 l  10431 8283 l 
+10483 8283 l  10483 8694 l  10431 8694 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 10742 8524 m  10742 8694 l  10690 8694 l  10690 8524 l 
+10539 8283 l  10598 8283 l  10716 8480 l  10834 8283 l  10892 8283 l  10742 8524 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 11311 8607 m  11311 8637 11300 8660 11279 8676 ct 11257 8692 11227 8700 11189 8700 ct 
+11152 8700 11123 8694 11103 8681 ct 11083 8667 11070 8647 11064 8620 ct 11107 8612 l 
+11112 8628 11120 8641 11134 8648 ct 11147 8656 11165 8660 11189 8660 ct 11214 8660 11232 8656 11244 8648 ct 
+11256 8640 11261 8627 11261 8612 ct 11261 8599 11257 8588 11249 8580 ct 11241 8573 11228 8566 11210 8561 ct 
+11175 8552 l  11146 8543 11126 8536 11114 8528 ct 11102 8521 11093 8512 11086 8501 ct 
+11079 8490 11076 8478 11076 8462 ct 11076 8434 11085 8412 11105 8397 ct 11124 8382 11152 8374 11189 8374 ct 
+11222 8374 11248 8380 11268 8393 ct 11288 8404 11300 8424 11305 8452 ct 11260 8457 l 
+11257 8443 11250 8433 11238 8425 ct 11226 8418 11209 8414 11189 8414 ct 11167 8414 11150 8417 11140 8424 ct 
+11129 8432 11124 8442 11124 8457 ct 11124 8466 11126 8474 11130 8479 ct 11135 8485 11141 8489 11150 8494 ct 
+11159 8498 11177 8503 11204 8510 ct 11231 8518 11250 8524 11261 8529 ct 11273 8536 11283 8542 11290 8549 ct 
+11296 8557 11301 8565 11305 8575 ct 11309 8584 11311 8596 11311 8607 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 11408 8547 m  11408 8583 11415 8610 11429 8632 ct 11443 8650 11464 8661 11491 8661 ct 
+11514 8661 11531 8656 11544 8647 ct 11557 8638 11566 8626 11570 8612 ct 11614 8625 l 
+11596 8675 11555 8700 11491 8700 ct 11447 8700 11414 8686 11391 8659 ct 11367 8630 11356 8588 11356 8534 ct 
+11356 8482 11367 8442 11391 8415 ct 11414 8386 11446 8373 11489 8373 ct 11578 8373 11622 8428 11622 8540 ct 
+11622 8547 l  11408 8547 l  p
+11570 8507 m  11568 8474 11560 8449 11546 8435 ct 11533 8419 11514 8412 11488 8412 ct 
+11464 8412 11445 8420 11431 8437 ct 11417 8454 11410 8478 11409 8507 ct 11570 8507 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 11873 8694 m  11873 8495 l  11873 8474 11871 8458 11867 8445 ct 
+11864 8434 11857 8425 11849 8421 ct 11841 8416 11828 8413 11812 8413 ct 11788 8413 11769 8422 11754 8439 ct 
+11741 8457 11734 8481 11734 8512 ct 11734 8694 l  11684 8694 l  11684 8445 l 
+11684 8408 11684 8386 11682 8379 ct 11729 8379 l  11729 8379 11730 8382 11730 8386 ct 
+11730 8390 11730 8396 11731 8401 ct 11731 8406 11731 8417 11731 8433 ct 11732 8433 l 
+11744 8410 11757 8395 11773 8386 ct 11788 8377 11806 8373 11829 8373 ct 11861 8373 11885 8381 11900 8398 ct 
+11915 8416 11923 8444 11923 8484 ct 11923 8694 l  11873 8694 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 12185 8643 m  12176 8664 12164 8678 12149 8687 ct 12133 8696 12115 8700 12092 8700 ct 
+12054 8700 12026 8686 12008 8660 ct 11991 8634 11982 8593 11982 8539 ct 11982 8427 12018 8373 12092 8373 ct 
+12115 8373 12134 8377 12149 8386 ct 12164 8395 12176 8408 12185 8427 ct 12186 8427 l 
+12185 8393 l  12185 8262 l  12235 8262 l  12235 8629 l  12235 8662 12235 8684 12236 8694 ct 
+12189 8694 l  12188 8692 12188 8684 12187 8673 ct 12187 8661 12186 8652 12186 8643 ct 
+12185 8643 l  p
+12034 8537 m  12034 8581 12039 8613 12050 8632 ct 12062 8650 12080 8660 12105 8660 ct 
+12133 8660 12153 8649 12166 8628 ct 12179 8608 12185 8577 12185 8534 ct 12185 8490 12179 8460 12166 8441 ct 
+12153 8421 12133 8412 12106 8412 ct 12081 8412 12063 8421 12050 8441 ct 12039 8460 12034 8492 12034 8537 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 12535 8607 m  12535 8637 12524 8660 12502 8676 ct 12481 8692 12451 8700 12413 8700 ct 
+12376 8700 12347 8694 12327 8681 ct 12307 8667 12294 8647 12288 8620 ct 12331 8612 l 
+12336 8628 12344 8641 12358 8648 ct 12371 8656 12389 8660 12413 8660 ct 12438 8660 12456 8656 12468 8648 ct 
+12480 8640 12485 8627 12485 8612 ct 12485 8599 12481 8588 12473 8580 ct 12465 8573 12452 8566 12434 8561 ct 
+12399 8552 l  12370 8543 12350 8536 12338 8528 ct 12326 8521 12317 8512 12310 8501 ct 
+12303 8490 12300 8478 12300 8462 ct 12300 8434 12309 8412 12329 8397 ct 12348 8382 12376 8374 12413 8374 ct 
+12446 8374 12472 8380 12492 8393 ct 12512 8404 12524 8424 12529 8452 ct 12484 8457 l 
+12481 8443 12474 8433 12462 8425 ct 12450 8418 12433 8414 12413 8414 ct 12391 8414 12374 8417 12364 8424 ct 
+12353 8432 12348 8442 12348 8457 ct 12348 8466 12350 8474 12354 8479 ct 12359 8485 12365 8489 12374 8494 ct 
+12383 8498 12401 8503 12428 8510 ct 12455 8518 12474 8524 12485 8529 ct 12497 8536 12507 8542 12514 8549 ct 
+12520 8557 12525 8565 12529 8575 ct 12533 8584 12535 8596 12535 8607 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 13034 8695 m  12933 8524 l  12812 8524 l  12812 8695 l 
+12758 8695 l  12758 8284 l  12942 8284 l  12986 8284 13019 8295 13043 8315 ct 
+13067 8336 13079 8364 13079 8402 ct 13079 8433 13070 8458 13054 8479 ct 13037 8499 13014 8513 12984 8518 ct 
+13094 8695 l  13034 8695 l  p
+13026 8402 m  13026 8379 13018 8360 13003 8347 ct 12988 8335 12965 8328 12937 8328 ct 
+12812 8328 l  12812 8480 l  12939 8480 l  12967 8480 12988 8474 13003 8460 ct 
+13018 8446 13026 8427 13026 8402 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 13309 8328 m  13309 8693 l  13257 8693 l  13257 8328 l 
+13123 8328 l  13123 8283 l  13443 8283 l  13443 8328 l  13309 8328 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 13804 8580 m  13804 8619 13790 8648 13762 8668 ct 13734 8689 13694 8700 13643 8700 ct 
+13548 8700 13494 8665 13479 8595 ct 13530 8584 l  13535 8608 13548 8628 13567 8639 ct 
+13586 8650 13612 8657 13645 8657 ct 13679 8657 13705 8650 13725 8638 ct 13743 8626 13752 8607 13752 8583 ct 
+13752 8569 13749 8559 13744 8550 ct 13738 8542 13730 8536 13719 8529 ct 13708 8524 13695 8520 13681 8516 ct 
+13666 8513 13650 8508 13633 8504 ct 13602 8497 13579 8490 13563 8483 ct 13547 8476 13534 8467 13525 8459 ct 
+13516 8450 13509 8440 13504 8428 ct 13499 8416 13497 8403 13497 8387 ct 13497 8353 13510 8325 13535 8306 ct 
+13560 8287 13597 8278 13644 8278 ct 13688 8278 13723 8285 13746 8299 ct 13770 8314 13786 8338 13795 8372 ct 
+13743 8381 l  13738 8360 13727 8344 13710 8335 ct 13694 8324 13672 8320 13644 8320 ct 
+13613 8320 13589 8325 13573 8336 ct 13556 8346 13548 8363 13548 8384 ct 13548 8397 13551 8407 13558 8416 ct 
+13564 8424 13573 8430 13585 8437 ct 13597 8442 13621 8449 13656 8458 ct 13668 8461 13680 8463 13692 8466 ct 
+13704 8469 13716 8473 13727 8477 ct 13738 8481 13748 8486 13757 8492 ct 13767 8498 13775 8504 13782 8513 ct 
+13789 8521 13794 8530 13798 8541 ct 13802 8553 13804 8565 13804 8580 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 9246 9349 m  9229 9355 9213 9357 9195 9357 ct 9156 9357 9136 9333 9136 9285 ct 
+9136 9076 l  9101 9076 l  9101 9038 l  9138 9038 l  9152 8967 l  9186 8967 l 
+9186 9038 l  9241 9038 l  9241 9076 l  9186 9076 l  9186 9275 l  9186 9289 9188 9300 9193 9306 ct 
+9197 9313 9205 9316 9217 9316 ct 9224 9316 9233 9314 9246 9312 ct 9246 9349 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 9540 9196 m  9540 9249 9529 9292 9506 9319 ct 9483 9345 9449 9359 9405 9359 ct 
+9361 9359 9328 9345 9306 9317 ct 9284 9289 9273 9247 9273 9196 ct 9273 9087 9317 9033 9406 9033 ct 
+9453 9033 9486 9046 9508 9073 ct 9529 9099 9540 9140 9540 9196 ct p
+9488 9196 m  9488 9153 9482 9121 9470 9101 ct 9457 9081 9437 9072 9407 9072 ct 
+9378 9072 9357 9082 9344 9102 ct 9331 9122 9325 9153 9325 9196 ct 9325 9236 9331 9267 9344 9289 ct 
+9357 9309 9377 9320 9404 9320 ct 9435 9320 9456 9310 9469 9290 ct 9482 9268 9488 9238 9488 9196 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 9982 9266 m  9982 9296 9971 9319 9950 9335 ct 9929 9350 9899 9359 9861 9359 ct 
+9824 9359 9794 9353 9774 9340 ct 9754 9326 9741 9306 9735 9279 ct 9778 9270 l 
+9783 9287 9791 9300 9805 9307 ct 9819 9315 9837 9319 9861 9319 ct 9886 9319 9904 9315 9916 9307 ct 
+9928 9299 9933 9286 9933 9270 ct 9933 9258 9929 9248 9921 9239 ct 9913 9233 9900 9226 9882 9221 ct 
+9847 9212 l  9818 9203 9797 9196 9785 9188 ct 9773 9181 9764 9172 9757 9161 ct 
+9750 9150 9747 9138 9747 9122 ct 9747 9094 9756 9072 9776 9057 ct 9795 9042 9824 9034 9861 9034 ct 
+9894 9034 9920 9040 9940 9053 ct 9959 9064 9971 9084 9976 9112 ct 9932 9117 l 
+9929 9103 9922 9093 9910 9085 ct 9898 9078 9881 9074 9861 9074 ct 9839 9074 9822 9077 9812 9084 ct 
+9800 9092 9795 9102 9795 9117 ct 9795 9126 9797 9134 9801 9139 ct 9806 9145 9813 9149 9822 9154 ct 
+9831 9158 9849 9163 9876 9170 ct 9903 9178 9922 9184 9933 9189 ct 9945 9196 9954 9202 9961 9209 ct 
+9967 9217 9972 9224 9976 9234 ct 9980 9244 9982 9255 9982 9266 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 10156 9349 m  10139 9355 10123 9357 10104 9357 ct 10065 9357 10045 9333 10045 9285 ct 
+10045 9076 l  10011 9076 l  10011 9038 l  10047 9038 l  10061 8967 l  10095 8967 l 
+10095 9038 l  10151 9038 l  10151 9076 l  10095 9076 l  10095 9275 l  10095 9289 10097 9300 10102 9306 ct 
+10106 9313 10115 9316 10127 9316 ct 10134 9316 10143 9314 10156 9312 ct 10156 9349 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 10273 9359 m  10243 9359 10221 9350 10206 9334 ct 10190 9317 10183 9295 10183 9264 ct 
+10183 9233 10193 9207 10213 9190 ct 10234 9173 10266 9163 10312 9162 ct 10377 9161 l 
+10377 9144 l  10377 9119 10373 9100 10363 9089 ct 10353 9078 10337 9073 10315 9073 ct 
+10292 9073 10276 9077 10266 9084 ct 10256 9093 10250 9105 10248 9122 ct 10196 9118 l 
+10205 9061 10244 9033 10316 9033 ct 10353 9033 10380 9042 10400 9060 ct 10419 9078 10430 9104 10430 9139 ct 
+10430 9275 l  10430 9289 10431 9301 10434 9309 ct 10439 9317 10446 9321 10456 9321 ct 
+10461 9321 10467 9320 10473 9319 ct 10473 9352 l  10460 9355 10447 9356 10434 9356 ct 
+10416 9356 10403 9352 10394 9341 ct 10386 9330 10380 9315 10380 9293 ct 10377 9293 l 
+10365 9317 10351 9334 10334 9344 ct 10316 9354 10297 9359 10273 9359 ct p
+10284 9320 m  10302 9320 10319 9316 10333 9306 ct 10346 9298 10358 9286 10365 9269 ct 
+10374 9255 10377 9239 10377 9224 ct 10377 9198 l  10324 9199 l  10301 9199 10283 9202 10271 9205 ct 
+10259 9212 10250 9218 10244 9227 ct 10237 9237 10234 9249 10234 9265 ct 10234 9283 10238 9297 10247 9306 ct 
+10256 9315 10268 9320 10284 9320 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 10510 9353 m  10510 9113 l  10510 9089 10510 9065 10508 9039 ct 
+10555 9039 l  10557 9074 10557 9097 10557 9103 ct 10559 9103 l  10566 9076 10576 9057 10586 9047 ct 
+10596 9038 10611 9033 10629 9033 ct 10637 9033 10644 9034 10650 9036 ct 10650 9083 l 
+10644 9081 10635 9081 10623 9081 ct 10602 9081 10587 9089 10576 9109 ct 10565 9128 10560 9155 10560 9189 ct 
+10560 9353 l  10510 9353 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 10811 9349 m  10794 9355 10778 9357 10760 9357 ct 10721 9357 10701 9333 10701 9285 ct 
+10701 9076 l  10666 9076 l  10666 9038 l  10703 9038 l  10717 8967 l  10751 8967 l 
+10751 9038 l  10806 9038 l  10806 9076 l  10751 9076 l  10751 9275 l  10751 9289 10753 9300 10758 9306 ct 
+10762 9313 10770 9316 10782 9316 ct 10789 9316 10798 9314 10811 9312 ct 10811 9349 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 11172 9359 m  11141 9359 11113 9353 11089 9341 ct 11065 9328 11047 9310 11034 9286 ct 
+11021 9263 11015 9236 11015 9204 ct 11015 8944 l  11067 8944 l  11067 9199 l 
+11067 9236 11076 9264 11094 9284 ct 11112 9303 11138 9314 11172 9314 ct 11207 9314 11234 9303 11253 9283 ct 
+11273 9263 11282 9234 11282 9196 ct 11282 8944 l  11336 8944 l  11336 9199 l 
+11336 9233 11328 9260 11315 9284 ct 11302 9307 11283 9327 11258 9340 ct 11234 9353 11205 9359 11172 9359 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 11423 9353 m  11423 8943 l  11476 8943 l  11476 9307 l 
+11673 9307 l  11673 9353 l  11423 9353 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 12016 8988 m  12016 9352 l  11964 9352 l  11964 8988 l 
+11830 8988 l  11830 8943 l  12150 8943 l  12150 8988 l  12016 8988 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 12467 9353 m  12351 9174 l  12231 9353 l  12173 9353 l 
+12321 9140 l  12184 8943 l  12242 8943 l  12351 9104 l  12456 8943 l  12514 8943 l 
+12381 9138 l  12525 9353 l  12467 9353 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 12950 9147 m  12950 9190 12942 9227 12925 9259 ct 12910 9292 12888 9316 12859 9333 ct 
+12830 9350 12795 9359 12756 9359 ct 12716 9359 12682 9350 12653 9334 ct 12624 9317 12602 9292 12587 9260 ct 
+12571 9227 12564 9190 12564 9147 ct 12564 9082 12581 9032 12615 8994 ct 12649 8957 12696 8938 12756 8938 ct 
+12796 8938 12830 8946 12859 8963 ct 12888 8979 12910 9003 12926 9036 ct 12942 9067 12950 9105 12950 9147 ct 
 p
-4794 -31 m  4812 -31 4829 -35 4843 -44 ct 4857 -52 4868 -63 4876 -78 ct 4884 -92 4888 -107 4888 -122 ct 
-4888 -147 l  4834 -146 l  4811 -145 4793 -143 4781 -139 ct 4769 -134 4760 -127 4754 -118 ct 
-4747 -109 4744 -97 4744 -82 ct 4744 -66 4748 -53 4757 -44 ct 4766 -36 4778 -31 4794 -31 ct 
-p ef
-5136 -3 m  5119 2 5103 4 5085 4 ct 5046 4 5026 -19 5026 -64 ct 5026 -263 l  4992 -263 l 
-4992 -299 l  5028 -299 l  5042 -366 l  5076 -366 l  5076 -299 l  5131 -299 l 
-5131 -263 l  5076 -263 l  5076 -74 l  5076 -60 5078 -50 5083 -44 ct 5087 -38 5095 -35 5107 -35 ct 
-5114 -35 5123 -37 5136 -39 ct 5136 -3 l  p ef
-5292 -3 m  5275 2 5259 4 5241 4 ct 5202 4 5182 -19 5182 -64 ct 5182 -263 l  5148 -263 l 
-5148 -299 l  5184 -299 l  5198 -366 l  5232 -366 l  5232 -299 l  5287 -299 l 
-5287 -263 l  5232 -263 l  5232 -74 l  5232 -60 5234 -50 5239 -44 ct 5243 -38 5251 -35 5263 -35 ct 
-5270 -35 5279 -37 5292 -39 ct 5292 -3 l  p ef
-5372 -138 m  5372 -104 5379 -78 5393 -59 ct 5407 -41 5428 -31 5455 -31 ct 5477 -31 5494 -36 5507 -44 ct 
-5520 -53 5529 -64 5533 -77 ct 5577 -65 l  5559 -18 5518 6 5455 6 ct 5411 6 5378 -7 5355 -33 ct 
-5331 -60 5320 -99 5320 -151 ct 5320 -200 5331 -238 5355 -264 ct 5378 -291 5410 -304 5453 -304 ct 
-5541 -304 5585 -251 5585 -145 ct 5585 -138 l  5372 -138 l  p
-5533 -176 m  5531 -208 5523 -231 5509 -245 ct 5496 -260 5477 -267 5452 -267 ct 
-5428 -267 5409 -259 5395 -243 ct 5381 -227 5374 -204 5373 -176 ct 5533 -176 l 
-p ef
-5821 0 m  5821 -189 l  5821 -218 5817 -238 5809 -249 ct 5801 -260 5787 -266 5766 -266 ct 
-5745 -266 5728 -258 5716 -241 ct 5704 -225 5697 -202 5697 -173 ct 5697 0 l  5648 0 l 
-5648 -235 l  5648 -270 5648 -291 5646 -298 ct 5693 -298 l  5693 -298 5694 -295 5694 -291 ct 
-5694 -287 5694 -282 5695 -277 ct 5695 -272 5695 -262 5695 -247 ct 5696 -247 l 
-5707 -269 5719 -283 5733 -292 ct 5747 -300 5764 -304 5783 -304 ct 5806 -304 5824 -300 5837 -290 ct 
-5850 -281 5859 -267 5864 -247 ct 5865 -247 l  5875 -268 5888 -282 5902 -291 ct 
-5917 -300 5935 -304 5955 -304 ct 5986 -304 6007 -296 6021 -279 ct 6035 -263 6042 -236 6042 -199 ct 
-6042 0 l  5993 0 l  5993 -189 l  5993 -218 5989 -238 5981 -249 ct 5973 -260 5959 -266 5938 -266 ct 
-5916 -266 5900 -258 5888 -242 ct 5876 -225 5870 -203 5870 -173 ct 5870 0 l  5821 0 l 
-p ef
-6369 -151 m  6369 -47 6332 5 6259 5 ct 6213 5 6183 -12 6167 -47 ct 6165 -47 l 
-6166 -45 6167 -30 6167 0 ct 6167 117 l  6117 117 l  6117 -238 l  6117 -269 6116 -289 6115 -299 ct 
-6163 -299 l  6163 -298 6164 -295 6164 -291 ct 6164 -286 6165 -279 6165 -270 ct 
-6166 -261 6166 -254 6166 -251 ct 6167 -251 l  6176 -269 6188 -283 6202 -291 ct 
-6217 -300 6236 -304 6259 -304 ct 6296 -304 6324 -292 6342 -267 ct 6360 -242 6369 -204 6369 -151 ct 
+12895 9147 m  12895 9097 12883 9057 12859 9026 ct 12835 8998 12801 8983 12756 8983 ct 
+12712 8983 12678 8998 12653 9026 ct 12629 9056 12617 9096 12617 9147 ct 12617 9199 12629 9239 12654 9268 ct 
+12678 9299 12712 9314 12756 9314 ct 12801 9314 12835 9299 12859 9270 ct 12883 9241 12895 9200 12895 9147 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 13320 9067 m  13320 9106 13308 9137 13285 9159 ct 13261 9182 13228 9195 13187 9195 ct 
+13072 9195 l  13072 9354 l  13019 9354 l  13019 8944 l  13184 8944 l  13227 8944 13261 8955 13285 8976 ct 
+13309 8998 13320 9028 13320 9067 ct p
+13268 9067 m  13268 9015 13237 8988 13177 8988 ct 13072 8988 l  13072 9149 l 
+13179 9149 l  13238 9149 13268 9122 13268 9067 ct p ef
+gr
+gs
+0.933 0.933 0.933 c 18202 8339 m  17988 8339 17777 8353 17592 8379 ct 17407 8405 17253 8444 17146 8489 ct 
+17038 8536 16982 8587 16982 8640 ct 16982 8865 l  16982 9090 l  16982 9397 l 
+16982 9622 l  16982 9848 l  16982 9849 l  16982 9902 17038 9954 17146 10000 ct 
+17253 10045 17407 10084 17592 10110 ct 17777 10137 17988 10150 18202 10150 ct 
+19118 10150 l  20033 10150 l  21279 10150 l  22193 10150 l  23108 10150 l 
+23109 10150 l  23323 10150 23534 10137 23719 10110 ct 23905 10084 24059 10045 24166 10000 ct 
+24274 9954 24330 9902 24330 9849 ct 24330 9622 l  24330 9397 l  24330 9090 l 
+24330 8865 l  24330 8640 l  24330 8587 24274 8536 24166 8489 ct 24059 8444 23905 8405 23719 8379 ct 
+23534 8353 23323 8339 23109 8339 ct 22553 7369 l  21279 8339 l  20033 8339 l 
+19118 8339 l  18202 8339 l  p ef
+gr
+gs
+0 lw 1 lj 0.007 0.007 0.007 c 18201 8337 m  17987 8337 17776 8351 17591 8377 ct 
+17406 8404 17252 8443 17145 8488 ct 17037 8534 16981 8586 16981 8638 ct 16981 8864 l 
+16981 9089 l  16981 9395 l  16981 9621 l  16981 9847 l  16981 9848 l  16981 9901 17037 9952 17145 9998 ct 
+17252 10044 17406 10083 17591 10109 ct 17776 10135 17987 10149 18201 10149 ct 
+19117 10149 l  20032 10149 l  21278 10149 l  22192 10149 l  23107 10149 l 
+23108 10149 l  23322 10149 23533 10135 23718 10109 ct 23904 10083 24058 10044 24165 9998 ct 
+24273 9952 24329 9901 24329 9848 ct 24329 9621 l  24329 9395 l  24329 9089 l 
+24329 8864 l  24329 8638 l  24329 8586 24273 8534 24165 8488 ct 24058 8443 23904 8404 23718 8377 ct 
+23533 8351 23322 8337 23108 8337 ct 22552 7369 l  21278 8337 l  20032 8337 l 
+19117 8337 l  18201 8337 l  pc
+gr
+gs
+0.007 0.007 0.007 c 17930 9120 m  17930 8847 l  17930 8817 17931 8788 17933 8759 ct 
+17924 8795 17916 8822 17907 8841 ct 17807 9120 l  17770 9120 l  17669 8841 l 
+17653 8792 l  17644 8759 l  17645 8793 l  17646 8847 l  17646 9120 l  17599 9120 l 
+17599 8709 l  17668 8709 l  17772 8995 l  17775 9006 17779 9018 17782 9032 ct 
+17786 9044 17788 9054 17789 9060 ct 17790 9052 17794 9040 17798 9024 ct 17803 9008 17806 8999 17808 8995 ct 
+17910 8709 l  17978 8709 l  17978 9120 l  17930 9120 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 18138 9126 m  18108 9126 18086 9118 18071 9101 ct 18054 9084 18047 9062 18047 9033 ct 
+18047 9000 18057 8975 18078 8958 ct 18099 8939 18131 8929 18177 8928 ct 18243 8927 l 
+18243 8910 l  18243 8885 18238 8866 18228 8856 ct 18218 8844 18202 8839 18180 8839 ct 
+18157 8839 18141 8843 18131 8850 ct 18121 8859 18115 8872 18113 8888 ct 18060 8884 l 
+18070 8827 18109 8799 18181 8799 ct 18218 8799 18246 8808 18265 8826 ct 18284 8844 18294 8870 18294 8905 ct 
+18294 9042 l  18294 9057 18296 9068 18299 9077 ct 18303 9084 18311 9088 18321 9088 ct 
+18326 9088 18332 9087 18338 9086 ct 18338 9119 l  18325 9122 18312 9123 18299 9123 ct 
+18281 9123 18268 9119 18259 9108 ct 18251 9098 18246 9082 18245 9060 ct 18243 9060 l 
+18231 9084 18216 9101 18199 9112 ct 18182 9121 18162 9126 18138 9126 ct p
+18149 9087 m  18167 9087 18184 9083 18198 9074 ct 18212 9065 18223 9054 18231 9038 ct 
+18239 9023 18243 9007 18243 8992 ct 18243 8965 l  18189 8966 l  18166 8967 18148 8969 18136 8974 ct 
+18124 8979 18115 8986 18109 8996 ct 18102 9005 18099 9018 18099 9034 ct 18099 9050 18103 9064 18112 9074 ct 
+18121 9082 18133 9087 18149 9087 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 18374 8738 m  18374 8688 l  18424 8688 l  18424 8738 l 
+18374 8738 l  p
+18374 9120 m  18374 8806 l  18424 8806 l  18424 9120 l  18374 9120 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 18691 9120 m  18691 8920 l  18691 8899 18689 8883 18685 8872 ct 
+18682 8860 18675 8852 18667 8847 ct 18659 8842 18646 8839 18630 8839 ct 18606 8839 18587 8848 18573 8865 ct 
+18560 8882 18553 8906 18553 8937 ct 18553 9120 l  18502 9120 l  18502 8872 l 
+18502 8835 18502 8813 18500 8805 ct 18548 8805 l  18548 8805 18549 8808 18549 8813 ct 
+18549 8817 18549 8822 18550 8827 ct 18550 8833 18550 8843 18550 8859 ct 18551 8859 l 
+18563 8837 18576 8821 18591 8813 ct 18606 8803 18624 8799 18647 8799 ct 18679 8799 18703 8807 18718 8824 ct 
+18733 8842 18741 8870 18741 8909 ct 18741 9120 l  18691 9120 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 19280 8835 m  19280 8874 19268 8904 19245 8926 ct 19221 8949 19188 8961 19147 8961 ct 
+19033 8961 l  19033 9121 l  18979 9121 l  18979 8710 l  19144 8710 l  19187 8710 19221 8721 19245 8742 ct 
+19269 8764 19280 8796 19280 8835 ct p
+19228 8835 m  19228 8782 19197 8755 19137 8755 ct 19033 8755 l  19033 8917 l 
+19139 8917 l  19198 8917 19228 8889 19228 8835 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 19619 9120 m  19619 8930 l  19409 8930 l  19409 9120 l 
+19356 9120 l  19356 8709 l  19409 8709 l  19409 8884 l  19619 8884 l  19619 8709 l 
+19672 8709 l  19672 9120 l  19619 9120 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 19931 8950 m  19931 9120 l  19879 9120 l  19879 8950 l 
+19728 8709 l  19786 8709 l  19905 8906 l  20023 8709 l  20081 8709 l  19931 8950 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 20500 9034 m  20500 9063 20489 9086 20468 9102 ct 20446 9118 20416 9126 20378 9126 ct 
+20341 9126 20312 9120 20292 9107 ct 20272 9094 20259 9074 20253 9046 ct 20296 9038 l 
+20301 9055 20309 9067 20323 9075 ct 20336 9082 20354 9086 20378 9086 ct 20403 9086 20421 9082 20433 9075 ct 
+20445 9066 20450 9054 20450 9038 ct 20450 9025 20446 9016 20438 9007 ct 20430 9000 20417 8994 20399 8988 ct 
+20364 8979 l  20335 8970 20315 8963 20303 8956 ct 20291 8948 20282 8939 20275 8928 ct 
+20268 8918 20265 8904 20265 8888 ct 20265 8860 20274 8838 20294 8823 ct 20313 8808 20341 8800 20378 8800 ct 
+20411 8800 20437 8806 20457 8819 ct 20477 8830 20489 8850 20494 8878 ct 20449 8883 l 
+20446 8869 20439 8859 20427 8852 ct 20415 8844 20398 8840 20378 8840 ct 20356 8840 20339 8843 20329 8850 ct 
+20318 8858 20313 8868 20313 8883 ct 20313 8893 20315 8900 20319 8905 ct 20324 8912 20330 8917 20339 8921 ct 
+20348 8925 20366 8930 20393 8938 ct 20420 8945 20439 8952 20450 8957 ct 20463 8963 20472 8969 20479 8977 ct 
+20485 8984 20490 8993 20494 9002 ct 20498 9012 20500 9022 20500 9034 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 20845 9120 m  20788 9120 l  20736 8897 l  20726 8847 l 
+20724 8857 20722 8869 20718 8885 ct 20715 8902 20696 8981 20662 9120 ct 20604 9120 l 
+20520 8804 l  20569 8804 l  20620 9019 l  20621 9024 20625 9043 20631 9077 ct 
+20636 9055 l  20699 8804 l  20753 8804 l  20805 9021 l  20817 9077 l  20826 9037 l 
+20882 8804 l  20931 8804 l  20845 9120 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 20965 8738 m  20965 8688 l  21015 8688 l  21015 8738 l 
+20965 8738 l  p
+20965 9120 m  20965 8806 l  21015 8806 l  21015 9120 l  20965 9120 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 21208 9117 m  21191 9122 21175 9124 21157 9124 ct 21118 9124 21098 9100 21098 9053 ct 
+21098 8843 l  21063 8843 l  21063 8805 l  21100 8805 l  21114 8734 l  21148 8734 l 
+21148 8805 l  21203 8805 l  21203 8843 l  21148 8843 l  21148 9042 l  21148 9057 21150 9067 21155 9074 ct 
+21159 9080 21167 9083 21179 9083 ct 21186 9083 21195 9081 21208 9079 ct 21208 9117 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 21287 8962 m  21287 9003 21293 9035 21305 9055 ct 21318 9075 21337 9085 21362 9085 ct 
+21380 9085 21394 9080 21406 9069 ct 21419 9060 21426 9044 21429 9023 ct 21479 9027 l 
+21475 9057 21463 9081 21443 9099 ct 21422 9117 21395 9126 21363 9126 ct 21322 9126 21290 9113 21268 9084 ct 
+21246 9057 21235 9016 21235 8963 ct 21235 8908 21246 8868 21268 8841 ct 21290 8813 21322 8799 21363 8799 ct 
+21393 8799 21420 8807 21440 8824 ct 21460 8841 21472 8863 21477 8893 ct 21427 8897 l 
+21424 8880 21416 8865 21406 8856 ct 21396 8845 21381 8840 21361 8840 ct 21335 8840 21316 8849 21304 8867 ct 
+21293 8886 21287 8917 21287 8962 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 21581 8860 m  21592 8840 21605 8823 21620 8814 ct 21635 8804 21654 8800 21677 8800 ct 
+21710 8800 21734 8808 21749 8825 ct 21764 8843 21772 8872 21772 8912 ct 21772 9121 l 
+21722 9121 l  21722 8921 l  21722 8899 21720 8883 21716 8873 ct 21713 8861 21706 8854 21697 8848 ct 
+21689 8843 21675 8841 21660 8841 ct 21636 8841 21618 8849 21604 8866 ct 21590 8883 21583 8906 21583 8936 ct 
+21583 9121 l  21533 9121 l  21533 8688 l  21583 8688 l  21583 8801 l  21583 8813 21582 8825 21582 8839 ct 
+21581 8850 21581 8858 21580 8860 ct 21581 8860 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 21884 8975 m  21884 9010 21891 9038 21904 9058 ct 21919 9077 21939 9087 21967 9087 ct 
+21988 9087 22005 9082 22018 9074 ct 22031 9064 22040 9053 22045 9039 ct 22089 9052 l 
+22071 9101 22029 9126 21967 9126 ct 21922 9126 21890 9113 21867 9085 ct 21843 9057 21832 9016 21832 8961 ct 
+21832 8908 21843 8868 21867 8841 ct 21890 8813 21921 8799 21965 8799 ct 22053 8799 22097 8855 22097 8967 ct 
+22097 8975 l  21884 8975 l  p
+22045 8934 m  22042 8900 22034 8876 22020 8861 ct 22007 8845 21988 8838 21964 8838 ct 
+21939 8838 21921 8846 21907 8863 ct 21893 8880 21886 8904 21885 8934 ct 22045 8934 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 22383 9034 m  22383 9063 22372 9086 22351 9102 ct 22330 9118 22300 9126 22262 9126 ct 
+22225 9126 22196 9120 22176 9107 ct 22155 9094 22142 9074 22136 9046 ct 22180 9038 l 
+22185 9055 22193 9067 22207 9075 ct 22220 9082 22238 9086 22262 9086 ct 22287 9086 22305 9082 22317 9075 ct 
+22329 9066 22334 9054 22334 9038 ct 22334 9025 22330 9016 22322 9007 ct 22314 9000 22301 8994 22283 8988 ct 
+22248 8979 l  22219 8970 22199 8963 22187 8956 ct 22175 8948 22165 8939 22158 8928 ct 
+22151 8918 22148 8904 22148 8888 ct 22148 8860 22157 8838 22178 8823 ct 22197 8808 22225 8800 22262 8800 ct 
+22295 8800 22321 8806 22341 8819 ct 22360 8830 22372 8850 22377 8878 ct 22333 8883 l 
+22330 8869 22323 8859 22311 8852 ct 22299 8844 22282 8840 22262 8840 ct 22240 8840 22223 8843 22213 8850 ct 
+22202 8858 22197 8868 22197 8883 ct 22197 8893 22199 8900 22203 8905 ct 22208 8912 22214 8917 22223 8921 ct 
+22232 8925 22250 8930 22277 8938 ct 22304 8945 22323 8952 22334 8957 ct 22346 8963 22355 8969 22362 8977 ct 
+22368 8984 22373 8993 22377 9002 ct 22381 9012 22383 9022 22383 9034 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 22851 8962 m  22851 9072 22814 9126 22741 9126 ct 22719 9126 22700 9122 22685 9114 ct 
+22670 9105 22658 9090 22649 9072 ct 22648 9072 l  22648 9078 22648 9087 22647 9099 ct 
+22646 9112 22646 9119 22645 9120 ct 22596 9120 l  22597 9110 22598 9088 22598 9056 ct 
+22598 8688 l  22649 8688 l  22649 8812 l  22649 8824 22648 8839 22647 8856 ct 
+22649 8856 l  22658 8836 22670 8821 22685 8813 ct 22700 8804 22719 8800 22741 8800 ct 
+22779 8800 22807 8813 22824 8840 ct 22842 8866 22851 8906 22851 8962 ct p
+22799 8964 m  22799 8919 22793 8887 22782 8868 ct 22771 8849 22754 8840 22729 8840 ct 
+22701 8840 22680 8850 22668 8870 ct 22655 8890 22649 8922 22649 8967 ct 22649 9008 22655 9039 22667 9058 ct 
+22680 9078 22700 9087 22728 9087 ct 22753 9087 22771 9078 22782 9059 ct 22793 9039 22799 9007 22799 8964 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 22988 9126 m  22957 9126 22935 9118 22920 9101 ct 22904 9084 22897 9062 22897 9033 ct 
+22897 9000 22907 8975 22927 8958 ct 22948 8939 22981 8929 23027 8928 ct 23093 8927 l 
+23093 8910 l  23093 8885 23088 8866 23078 8856 ct 23068 8844 23052 8839 23030 8839 ct 
+23007 8839 22991 8843 22981 8850 ct 22970 8859 22964 8872 22962 8888 ct 22910 8884 l 
+22919 8827 22958 8799 23031 8799 ct 23068 8799 23096 8808 23115 8826 ct 23134 8844 23144 8870 23144 8905 ct 
+23144 9042 l  23144 9057 23146 9068 23149 9077 ct 23153 9084 23161 9088 23171 9088 ct 
+23176 9088 23182 9087 23188 9086 ct 23188 9119 l  23175 9122 23162 9123 23149 9123 ct 
+23131 9123 23118 9119 23109 9108 ct 23101 9098 23096 9082 23095 9060 ct 23093 9060 l 
+23081 9084 23066 9101 23049 9112 ct 23032 9121 23012 9126 22988 9126 ct p
+22999 9087 m  23017 9087 23034 9083 23048 9074 ct 23062 9065 23073 9054 23081 9038 ct 
+23089 9023 23093 9007 23093 8992 ct 23093 8965 l  23039 8966 l  23016 8967 22998 8969 22986 8974 ct 
+22973 8979 22964 8986 22958 8996 ct 22951 9005 22948 9018 22948 9034 ct 22948 9050 22952 9064 22961 9074 ct 
+22970 9082 22983 9087 22999 9087 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 23263 8962 m  23263 9003 23269 9035 23281 9055 ct 23294 9075 23313 9085 23338 9085 ct 
+23357 9085 23371 9080 23383 9069 ct 23395 9060 23402 9044 23405 9023 ct 23455 9027 l 
+23451 9057 23439 9081 23419 9099 ct 23398 9117 23372 9126 23339 9126 ct 23298 9126 23266 9113 23244 9084 ct 
+23222 9057 23211 9016 23211 8963 ct 23211 8908 23222 8868 23244 8841 ct 23266 8813 23298 8799 23339 8799 ct 
+23370 8799 23396 8807 23416 8824 ct 23436 8841 23448 8863 23453 8893 ct 23403 8897 l 
+23400 8880 23393 8865 23383 8856 ct 23373 8845 23358 8840 23337 8840 ct 23311 8840 23292 8849 23280 8867 ct 
+23269 8886 23263 8917 23263 8962 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 23696 9120 m  23595 8977 l  23559 9008 l  23559 9120 l 
+23508 9120 l  23508 8688 l  23559 8688 l  23559 8959 l  23689 8806 l  23748 8806 l 
+23627 8941 l  23754 9120 l  23696 9120 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 18112 9776 m  18095 9781 18078 9783 18060 9783 ct 18021 9783 18001 9759 18001 9712 ct 
+18001 9501 l  17967 9501 l  17967 9463 l  18003 9463 l  18017 9393 l  18051 9393 l 
+18051 9463 l  18107 9463 l  18107 9501 l  18051 9501 l  18051 9701 l  18051 9716 18053 9726 18058 9733 ct 
+18062 9739 18070 9742 18082 9742 ct 18089 9742 18099 9740 18112 9738 ct 18112 9776 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 18406 9622 m  18406 9677 18395 9718 18372 9745 ct 18349 9772 18315 9785 18272 9785 ct 
+18228 9785 18195 9772 18173 9743 ct 18150 9716 18139 9675 18139 9622 ct 18139 9513 18184 9458 18273 9458 ct 
+18319 9458 18352 9472 18374 9498 ct 18395 9524 18406 9565 18406 9622 ct p
+18354 9622 m  18354 9578 18348 9546 18336 9526 ct 18323 9506 18303 9497 18274 9497 ct 
+18245 9497 18224 9507 18211 9527 ct 18198 9547 18192 9578 18192 9622 ct 18192 9663 18198 9695 18211 9716 ct 
+18224 9736 18244 9746 18271 9746 ct 18301 9746 18322 9737 18335 9717 ct 18348 9696 18354 9665 18354 9622 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 18876 9622 m  18876 9677 18865 9718 18842 9745 ct 18819 9772 18785 9785 18742 9785 ct 
+18698 9785 18664 9772 18642 9743 ct 18620 9716 18609 9675 18609 9622 ct 18609 9513 18653 9458 18743 9458 ct 
+18789 9458 18822 9472 18844 9498 ct 18865 9524 18876 9565 18876 9622 ct p
+18824 9622 m  18824 9578 18818 9546 18806 9526 ct 18793 9506 18773 9497 18744 9497 ct 
+18715 9497 18694 9507 18680 9527 ct 18667 9547 18661 9578 18661 9622 ct 18661 9663 18667 9695 18680 9716 ct 
+18694 9736 18714 9746 18741 9746 ct 18771 9746 18792 9737 18805 9717 ct 18818 9696 18824 9665 18824 9622 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 19189 9620 m  19189 9729 19152 9784 19078 9784 ct 19032 9784 19002 9766 18986 9729 ct 
+18984 9729 l  18985 9732 18986 9747 18986 9779 ct 18986 9902 l  18936 9902 l 
+18936 9528 l  18936 9495 18935 9474 18934 9463 ct 18982 9463 l  18982 9464 18983 9467 18983 9472 ct 
+18983 9477 18984 9484 18984 9494 ct 18985 9503 18985 9512 18985 9515 ct 18986 9515 l 
+18995 9495 19007 9480 19021 9472 ct 19036 9462 19055 9458 19078 9458 ct 19116 9458 19144 9470 19162 9497 ct 
+19180 9524 19189 9564 19189 9620 ct p
+19137 9621 m  19137 9578 19131 9546 19120 9527 ct 19109 9508 19090 9498 19066 9498 ct 
+19046 9498 19031 9502 19020 9513 ct 19008 9521 19000 9535 18994 9553 ct 18988 9572 18986 9596 18986 9625 ct 
+18986 9666 18992 9697 19004 9716 ct 19017 9736 19037 9745 19065 9745 ct 19090 9745 19109 9736 19120 9717 ct 
+19131 9698 19137 9666 19137 9621 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 19287 9634 m  19287 9669 19294 9697 19308 9717 ct 19322 9736 19343 9746 19370 9746 ct 
+19392 9746 19410 9741 19423 9733 ct 19436 9723 19445 9712 19449 9698 ct 19493 9710 l 
+19475 9760 19434 9785 19370 9785 ct 19326 9785 19293 9772 19270 9744 ct 19246 9716 19235 9675 19235 9620 ct 
+19235 9567 19246 9527 19270 9500 ct 19293 9472 19325 9458 19368 9458 ct 19457 9458 19501 9514 19501 9626 ct 
+19501 9634 l  19287 9634 l  p
+19449 9593 m  19447 9559 19439 9535 19425 9520 ct 19412 9504 19392 9497 19367 9497 ct 
+19343 9497 19324 9505 19310 9522 ct 19296 9539 19289 9563 19288 9593 ct 19449 9593 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 19563 9779 m  19563 9537 l  19563 9515 19563 9490 19561 9464 ct 
+19608 9464 l  19610 9499 19610 9521 19610 9527 ct 19612 9527 l  19619 9501 19629 9482 19639 9473 ct 
+19649 9463 19664 9458 19683 9458 ct 19690 9458 19697 9459 19703 9461 ct 19703 9508 l 
+19697 9506 19688 9506 19677 9506 ct 19655 9506 19640 9515 19629 9534 ct 19618 9553 19613 9579 19613 9614 ct 
+19613 9779 l  19563 9779 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 19826 9785 m  19795 9785 19773 9777 19758 9760 ct 19742 9743 19735 9721 19735 9692 ct 
+19735 9659 19745 9634 19765 9617 ct 19786 9599 19819 9588 19865 9587 ct 19931 9586 l 
+19931 9569 l  19931 9544 19926 9525 19916 9515 ct 19906 9503 19890 9498 19868 9498 ct 
+19845 9498 19829 9502 19819 9509 ct 19809 9518 19803 9530 19801 9547 ct 19748 9543 l 
+19757 9486 19796 9458 19869 9458 ct 19906 9458 19934 9467 19953 9485 ct 19972 9503 19982 9529 19982 9564 ct 
+19982 9701 l  19982 9716 19984 9727 19987 9736 ct 19991 9743 19999 9747 20009 9747 ct 
+20014 9747 20020 9746 20026 9745 ct 20026 9778 l  20013 9781 20000 9782 19987 9782 ct 
+19969 9782 19956 9778 19947 9767 ct 19939 9757 19934 9741 19933 9719 ct 19931 9719 l 
+19919 9743 19904 9760 19887 9770 ct 19870 9780 19850 9785 19826 9785 ct p
+19837 9746 m  19855 9746 19872 9742 19886 9733 ct 19900 9724 19911 9713 19919 9697 ct 
+19927 9682 19931 9666 19931 9650 ct 19931 9624 l  19877 9625 l  19854 9626 19836 9628 19824 9633 ct 
+19812 9638 19803 9645 19796 9655 ct 19789 9664 19786 9677 19786 9693 ct 19786 9709 19790 9723 19800 9733 ct 
+19809 9741 19821 9746 19837 9746 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 20178 9776 m  20161 9781 20145 9783 20127 9783 ct 20087 9783 20067 9759 20067 9712 ct 
+20067 9501 l  20033 9501 l  20033 9463 l  20069 9463 l  20083 9393 l  20118 9393 l 
+20118 9463 l  20173 9463 l  20173 9501 l  20118 9501 l  20118 9701 l  20118 9716 20120 9726 20125 9733 ct 
+20129 9739 20137 9742 20149 9742 ct 20156 9742 20165 9740 20178 9738 ct 20178 9776 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 20219 9397 m  20219 9347 l  20269 9347 l  20269 9397 l 
+20219 9397 l  p
+20219 9779 m  20219 9464 l  20269 9464 l  20269 9779 l  20219 9779 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 20536 9779 m  20536 9579 l  20536 9558 20534 9542 20530 9530 ct 
+20527 9519 20520 9510 20512 9506 ct 20504 9501 20491 9498 20475 9498 ct 20451 9498 20431 9507 20417 9524 ct 
+20404 9541 20397 9565 20397 9596 ct 20397 9779 l  20347 9779 l  20347 9530 l 
+20347 9494 20347 9472 20345 9464 ct 20392 9464 l  20392 9464 20393 9467 20393 9472 ct 
+20393 9476 20393 9481 20394 9486 ct 20394 9492 20394 9502 20394 9518 ct 20395 9518 l 
+20407 9496 20420 9480 20436 9472 ct 20451 9462 20469 9458 20492 9458 ct 20524 9458 20548 9466 20563 9483 ct 
+20578 9501 20586 9529 20586 9568 ct 20586 9779 l  20536 9779 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 20772 9902 m  20739 9902 20714 9896 20694 9882 ct 20675 9868 20663 9849 20657 9824 ct 
+20707 9817 l  20710 9832 20718 9843 20729 9850 ct 20740 9858 20755 9862 20773 9862 ct 
+20824 9862 20848 9832 20848 9770 ct 20848 9720 l  20838 9740 20826 9756 20809 9766 ct 
+20793 9776 20773 9781 20751 9781 ct 20714 9781 20688 9768 20670 9743 ct 20653 9717 20645 9677 20645 9622 ct 
+20645 9567 20654 9526 20672 9500 ct 20691 9473 20719 9459 20757 9459 ct 20778 9459 20797 9464 20812 9474 ct 
+20828 9485 20840 9500 20848 9519 ct 20849 9519 l  20849 9513 20849 9503 20850 9488 ct 
+20851 9473 20852 9465 20852 9464 ct 20899 9464 l  20898 9475 20898 9497 20898 9529 ct 
+20898 9769 l  20898 9858 20856 9902 20772 9902 ct p
+20848 9622 m  20848 9597 20845 9575 20838 9556 ct 20832 9538 20823 9523 20811 9514 ct 
+20798 9504 20784 9499 20769 9499 ct 20743 9499 20725 9508 20713 9528 ct 20702 9547 20696 9579 20696 9622 ct 
+20696 9665 20701 9696 20712 9715 ct 20723 9733 20742 9742 20768 9742 ct 20783 9742 20798 9738 20810 9728 ct 
+20822 9718 20832 9704 20838 9686 ct 20845 9668 20848 9646 20848 9622 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 21382 9622 m  21382 9677 21371 9718 21348 9745 ct 21324 9772 21290 9785 21247 9785 ct 
+21203 9785 21170 9772 21148 9743 ct 21126 9716 21115 9675 21115 9622 ct 21115 9513 21159 9458 21248 9458 ct 
+21294 9458 21327 9472 21350 9498 ct 21371 9524 21382 9565 21382 9622 ct p
+21329 9622 m  21329 9578 21323 9546 21311 9526 ct 21298 9506 21278 9497 21249 9497 ct 
+21220 9497 21199 9507 21186 9527 ct 21173 9547 21167 9578 21167 9622 ct 21167 9663 21173 9695 21186 9716 ct 
+21199 9736 21219 9746 21246 9746 ct 21276 9746 21297 9737 21310 9717 ct 21323 9696 21329 9665 21329 9622 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 21632 9779 m  21632 9579 l  21632 9558 21629 9542 21625 9530 ct 
+21622 9519 21615 9510 21607 9506 ct 21599 9501 21586 9498 21570 9498 ct 21546 9498 21527 9507 21513 9524 ct 
+21500 9541 21493 9565 21493 9596 ct 21493 9779 l  21443 9779 l  21443 9530 l 
+21443 9494 21443 9472 21441 9464 ct 21488 9464 l  21488 9464 21489 9467 21489 9472 ct 
+21489 9476 21489 9481 21490 9486 ct 21490 9492 21490 9502 21490 9518 ct 21491 9518 l 
+21503 9496 21516 9480 21531 9472 ct 21546 9462 21564 9458 21587 9458 ct 21619 9458 21644 9466 21659 9483 ct 
+21674 9501 21682 9529 21682 9568 ct 21682 9779 l  21632 9779 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 21912 9780 m  21912 9347 l  21963 9347 l  21963 9780 l 
+21912 9780 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 22038 9397 m  22038 9347 l  22088 9347 l  22088 9397 l 
+22038 9397 l  p
+22038 9779 m  22038 9464 l  22088 9464 l  22088 9779 l  22038 9779 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 22355 9779 m  22355 9579 l  22355 9558 22353 9542 22349 9530 ct 
+22345 9519 22338 9510 22330 9506 ct 22322 9501 22309 9498 22293 9498 ct 22269 9498 22250 9507 22236 9524 ct 
+22223 9541 22216 9565 22216 9596 ct 22216 9779 l  22166 9779 l  22166 9530 l 
+22166 9494 22166 9472 22164 9464 ct 22211 9464 l  22211 9464 22212 9467 22212 9472 ct 
+22212 9476 22212 9481 22213 9486 ct 22213 9492 22213 9502 22213 9518 ct 22214 9518 l 
+22226 9496 22239 9480 22254 9472 ct 22269 9462 22287 9458 22310 9458 ct 22342 9458 22367 9466 22382 9483 ct 
+22397 9501 22405 9529 22405 9568 ct 22405 9779 l  22355 9779 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 22666 9779 m  22564 9635 l  22528 9667 l  22528 9779 l 
+22478 9779 l  22478 9347 l  22528 9347 l  22528 9617 l  22659 9464 l  22718 9464 l 
+22597 9599 l  22724 9779 l  22666 9779 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 22923 9779 m  22923 9735 l  23022 9735 l  23022 9419 l 
+22934 9485 l  22934 9436 l  23026 9368 l  23072 9368 l  23072 9735 l  23167 9735 l 
+23167 9779 l  22923 9779 l  p ef
+gr
+gs
+0.933 0.933 0.933 c 26596 15868 m  26597 15868 l  26331 15868 26070 15884 25840 15915 ct 
+25610 15944 25419 15987 25285 16039 ct 25152 16090 25082 16149 25082 16210 ct 
+25082 16467 l  25082 16724 l  25082 17074 l  25082 17329 l  25082 17586 l 
+25082 17647 25152 17706 25285 17758 ct 25419 17810 25610 17854 25840 17883 ct 
+26070 17914 26331 17929 26597 17929 ct 27732 17928 l  28869 17928 l  30412 17928 l 
+31548 17928 l  32684 17928 l  32684 17929 l  32950 17929 33211 17914 33442 17883 ct 
+33672 17854 33863 17810 33996 17758 ct 34129 17706 34199 17647 34199 17586 ct 
+34199 17329 l  34199 17074 l  34199 16724 l  34199 16467 l  34199 16209 l 
+34199 16210 l  34199 16149 34129 16090 33996 16039 ct 33863 15987 33672 15944 33442 15915 ct 
+33211 15884 32950 15868 32684 15868 ct 31548 15868 l  30412 15868 l  28869 15868 l 
+28866 14966 l  26596 15868 l  p ef
+gr
+gs
+0 lw 1 lj 0.007 0.007 0.007 c 26596 15868 m  26597 15868 l  26331 15868 26069 15884 25839 15914 ct 
+25609 15944 25418 15987 25285 16038 ct 25152 16090 25082 16149 25082 16210 ct 
+25082 16467 l  25082 16724 l  25082 17073 l  25082 17329 l  25082 17586 l 
+25082 17647 25152 17706 25285 17757 ct 25418 17810 25609 17853 25839 17883 ct 
+26069 17913 26331 17929 26597 17929 ct 27732 17928 l  28868 17928 l  30413 17928 l 
+31548 17928 l  32684 17928 l  32684 17929 l  32950 17929 33212 17913 33442 17883 ct 
+33671 17853 33863 17810 33996 17757 ct 34129 17706 34199 17647 34199 17586 ct 
+34199 17329 l  34199 17073 l  34199 16724 l  34199 16467 l  34199 16209 l 
+34199 16210 l  34199 16149 34129 16090 33996 16038 ct 33863 15987 33671 15944 33442 15914 ct 
+33212 15884 32950 15868 32684 15868 ct 31548 15868 l  30413 15868 l  28868 15868 l 
+28866 14966 l  26596 15868 l  pc
+gr
+gs
+0.007 0.007 0.007 c 25930 16443 m  25930 16033 l  25984 16033 l  25984 16398 l 
+26180 16398 l  26180 16443 l  25930 16443 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 26235 16061 m  26235 16011 l  26285 16011 l  26285 16061 l 
+26235 16061 l  p
+26235 16443 m  26235 16129 l  26285 16129 l  26285 16443 l  26235 16443 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 26536 16443 m  26536 16243 l  26536 16213 26532 16191 26524 16180 ct 
+26516 16168 26502 16162 26481 16162 ct 26460 16162 26443 16170 26431 16188 ct 
+26419 16205 26412 16229 26412 16260 ct 26412 16443 l  26363 16443 l  26363 16195 l 
+26363 16158 26363 16136 26361 16128 ct 26408 16128 l  26408 16128 26409 16131 26409 16136 ct 
+26409 16140 26409 16145 26410 16150 ct 26410 16156 26410 16166 26410 16182 ct 
+26411 16182 l  26422 16159 26434 16144 26448 16135 ct 26462 16126 26479 16122 26498 16122 ct 
+26521 16122 26539 16126 26552 16137 ct 26565 16146 26574 16161 26579 16182 ct 
+26580 16182 l  26590 16160 26603 16145 26618 16136 ct 26633 16126 26651 16122 26671 16122 ct 
+26702 16122 26723 16130 26737 16148 ct 26751 16165 26758 16194 26758 16233 ct 
+26758 16443 l  26709 16443 l  26709 16243 l  26709 16213 26705 16191 26697 16180 ct 
+26689 16168 26675 16162 26654 16162 ct 26632 16162 26616 16170 26603 16187 ct 
+26591 16205 26585 16228 26585 16260 ct 26585 16443 l  26536 16443 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 26832 16061 m  26832 16011 l  26882 16011 l  26882 16061 l 
+26832 16061 l  p
+26832 16443 m  26832 16129 l  26882 16129 l  26882 16443 l  26832 16443 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 27075 16440 m  27058 16445 27042 16447 27023 16447 ct 26984 16447 26964 16423 26964 16376 ct 
+26964 16166 l  26930 16166 l  26930 16128 l  26966 16128 l  26980 16057 l 
+27014 16057 l  27014 16128 l  27070 16128 l  27070 16166 l  27014 16166 l 
+27014 16365 l  27014 16380 27016 16390 27021 16397 ct 27026 16403 27034 16406 27046 16406 ct 
+27053 16406 27062 16404 27075 16402 ct 27075 16440 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 27155 16297 m  27155 16333 27162 16360 27176 16380 ct 27190 16399 27211 16409 27238 16409 ct 
+27260 16409 27277 16404 27290 16396 ct 27303 16386 27312 16375 27316 16361 ct 
+27360 16374 l  27342 16423 27301 16449 27238 16449 ct 27194 16449 27161 16436 27138 16407 ct 
+27113 16379 27102 16338 27102 16283 ct 27102 16231 27113 16191 27138 16164 ct 
+27161 16136 27193 16122 27236 16122 ct 27324 16122 27368 16178 27368 16289 ct 
+27368 16297 l  27155 16297 l  p
+27316 16257 m  27314 16223 27306 16199 27292 16184 ct 27279 16168 27260 16161 27235 16161 ct 
+27211 16161 27192 16169 27178 16186 ct 27164 16203 27157 16227 27156 16257 ct 
+27316 16257 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 27618 16393 m  27609 16414 27597 16427 27582 16437 ct 27565 16445 27547 16449 27524 16449 ct 
+27487 16449 27459 16436 27441 16409 ct 27424 16383 27415 16341 27415 16287 ct 
+27415 16177 27451 16122 27524 16122 ct 27547 16122 27567 16126 27582 16136 ct 
+27597 16144 27609 16158 27618 16177 ct 27619 16177 l  27618 16142 l  27618 16011 l 
+27668 16011 l  27668 16379 l  27668 16411 27668 16434 27669 16443 ct 27622 16443 l 
+27621 16441 27621 16434 27620 16422 ct 27620 16410 27619 16401 27619 16393 ct 
+27618 16393 l  p
+27467 16285 m  27467 16329 27472 16362 27483 16381 ct 27494 16400 27512 16409 27537 16409 ct 
+27565 16409 27586 16399 27599 16378 ct 27612 16358 27618 16325 27618 16282 ct 
+27618 16240 27612 16209 27599 16190 ct 27586 16170 27565 16161 27538 16161 ct 
+27513 16161 27495 16170 27483 16190 ct 27472 16209 27467 16241 27467 16285 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 28089 16443 m  28089 16243 l  28089 16222 28087 16206 28083 16195 ct 
+28080 16183 28073 16175 28065 16170 ct 28057 16165 28044 16162 28028 16162 ct 
+28004 16162 27984 16171 27970 16188 ct 27957 16205 27950 16229 27950 16260 ct 
+27950 16443 l  27900 16443 l  27900 16195 l  27900 16158 27900 16136 27898 16128 ct 
+27945 16128 l  27945 16128 27946 16131 27946 16136 ct 27946 16140 27946 16145 27947 16150 ct 
+27947 16156 27947 16166 27947 16182 ct 27948 16182 l  27960 16160 27973 16144 27988 16136 ct 
+28004 16126 28022 16122 28045 16122 ct 28077 16122 28101 16130 28116 16147 ct 
+28131 16165 28139 16194 28139 16233 ct 28139 16443 l  28089 16443 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 28260 16128 m  28260 16327 l  28260 16348 28262 16364 28266 16376 ct 
+28270 16387 28276 16396 28285 16400 ct 28293 16405 28306 16408 28322 16408 ct 
+28346 16408 28365 16399 28379 16382 ct 28393 16365 28400 16341 28400 16310 ct 
+28400 16128 l  28450 16128 l  28450 16376 l  28450 16413 28450 16436 28451 16443 ct 
+28404 16443 l  28404 16443 28404 16440 28404 16436 ct 28404 16431 28403 16425 28403 16420 ct 
+28403 16415 28403 16404 28402 16388 ct 28401 16388 l  28390 16410 28377 16427 28361 16436 ct 
+28346 16445 28327 16449 28305 16449 ct 28272 16449 28248 16441 28233 16423 ct 
+28218 16405 28211 16377 28211 16338 ct 28211 16128 l  28260 16128 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 28701 16443 m  28701 16243 l  28701 16213 28697 16191 28689 16180 ct 
+28681 16168 28667 16162 28646 16162 ct 28625 16162 28608 16170 28596 16188 ct 
+28584 16205 28576 16229 28576 16260 ct 28576 16443 l  28527 16443 l  28527 16195 l 
+28527 16158 28527 16136 28525 16128 ct 28572 16128 l  28572 16128 28573 16131 28573 16136 ct 
+28573 16140 28573 16145 28574 16150 ct 28574 16156 28574 16166 28574 16182 ct 
+28575 16182 l  28587 16159 28599 16144 28613 16135 ct 28627 16126 28644 16122 28663 16122 ct 
+28686 16122 28704 16126 28717 16137 ct 28730 16146 28739 16161 28744 16182 ct 
+28745 16182 l  28755 16160 28768 16145 28782 16136 ct 28797 16126 28815 16122 28835 16122 ct 
+28866 16122 28887 16130 28901 16148 ct 28915 16165 28922 16194 28922 16233 ct 
+28922 16443 l  28873 16443 l  28873 16243 l  28873 16213 28869 16191 28861 16180 ct 
+28853 16168 28839 16162 28818 16162 ct 28796 16162 28780 16170 28768 16187 ct 
+28756 16205 28750 16228 28750 16260 ct 28750 16443 l  28701 16443 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 29248 16284 m  29248 16395 29211 16449 29137 16449 ct 29115 16449 29096 16445 29081 16437 ct 
+29066 16428 29054 16414 29045 16395 ct 29044 16395 l  29044 16401 29044 16410 29043 16422 ct 
+29042 16435 29042 16442 29041 16443 ct 28993 16443 l  28994 16434 28995 16411 28995 16379 ct 
+28995 16011 l  29045 16011 l  29045 16135 l  29045 16147 29044 16162 29043 16179 ct 
+29045 16179 l  29054 16159 29066 16144 29081 16136 ct 29096 16127 29115 16123 29137 16123 ct 
+29175 16123 29204 16136 29221 16163 ct 29239 16189 29248 16229 29248 16284 ct 
 p
-6317 -150 m  6317 -191 6311 -221 6300 -239 ct 6289 -257 6271 -266 6247 -266 ct 
-6227 -266 6212 -262 6201 -253 ct 6189 -245 6181 -232 6175 -215 ct 6169 -197 6167 -174 6167 -146 ct 
-6167 -107 6173 -78 6185 -60 ct 6198 -41 6218 -32 6246 -32 ct 6271 -32 6289 -41 6300 -59 ct 
-6311 -77 6317 -107 6317 -150 ct p ef
-6545 -3 m  6528 2 6512 4 6494 4 ct 6455 4 6435 -19 6435 -64 ct 6435 -263 l  6401 -263 l 
-6401 -299 l  6437 -299 l  6451 -366 l  6485 -366 l  6485 -299 l  6540 -299 l 
-6540 -263 l  6485 -263 l  6485 -74 l  6485 -60 6487 -50 6492 -44 ct 6496 -38 6504 -35 6516 -35 ct 
-6523 -35 6532 -37 6545 -39 ct 6545 -3 l  p ef
-6811 -82 m  6811 -54 6800 -32 6779 -17 ct 6758 -2 6728 6 6690 6 ct 6653 6 6624 0 6604 -12 ct 
-6584 -25 6571 -44 6565 -70 ct 6608 -78 l  6613 -62 6621 -50 6635 -43 ct 6648 -36 6666 -32 6690 -32 ct 
-6715 -32 6733 -36 6745 -43 ct 6757 -51 6762 -63 6762 -78 ct 6762 -90 6758 -99 6750 -107 ct 
-6742 -114 6729 -120 6711 -125 ct 6676 -134 l  6647 -142 6627 -149 6615 -156 ct 
-6603 -163 6594 -172 6587 -182 ct 6580 -192 6577 -204 6577 -219 ct 6577 -246 6586 -267 6606 -281 ct 
-6625 -295 6653 -303 6690 -303 ct 6723 -303 6749 -297 6769 -285 ct 6788 -274 6800 -255 6805 -229 ct 
-6761 -224 l  6758 -237 6751 -247 6739 -254 ct 6727 -261 6710 -265 6690 -265 ct 
-6668 -265 6651 -262 6641 -255 ct 6630 -248 6625 -238 6625 -224 ct 6625 -215 6627 -208 6631 -203 ct 
-6636 -197 6642 -193 6651 -189 ct 6660 -185 6678 -180 6705 -173 ct 6732 -166 6751 -160 6762 -155 ct 
-6774 -149 6783 -143 6790 -136 ct 6796 -129 6801 -121 6805 -112 ct 6809 -103 6811 -93 6811 -82 ct 
-p ef
-7103 6 m  7073 6 7051 -2 7036 -18 ct 7020 -34 7013 -55 7013 -83 ct 7013 -114 7023 -138 7043 -154 ct 
-7064 -171 7096 -180 7142 -181 ct 7208 -182 l  7208 -198 l  7208 -222 7203 -240 7193 -250 ct 
-7183 -261 7167 -266 7145 -266 ct 7122 -266 7106 -262 7096 -255 ct 7086 -247 7080 -235 7078 -219 ct 
-7026 -223 l  7035 -277 7074 -304 7146 -304 ct 7183 -304 7211 -295 7230 -278 ct 
-7249 -261 7259 -236 7259 -203 ct 7259 -74 l  7259 -60 7261 -49 7264 -41 ct 7268 -34 7276 -30 7286 -30 ct 
-7291 -30 7297 -31 7303 -32 ct 7303 -1 l  7290 2 7277 3 7264 3 ct 7246 3 7233 -1 7224 -11 ct 
-7216 -21 7211 -36 7210 -57 ct 7208 -57 l  7196 -34 7181 -18 7164 -8 ct 7147 1 7127 6 7103 6 ct 
+29196 16286 m  29196 16242 29190 16210 29178 16191 ct 29167 16173 29150 16163 29125 16163 ct 
+29097 16163 29076 16174 29064 16194 ct 29051 16214 29045 16245 29045 16289 ct 
+29045 16330 29051 16362 29063 16381 ct 29076 16401 29096 16410 29124 16410 ct 
+29149 16410 29167 16401 29178 16382 ct 29190 16362 29196 16329 29196 16286 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 29347 16297 m  29347 16333 29354 16360 29368 16380 ct 29382 16399 29403 16409 29430 16409 ct 
+29452 16409 29469 16404 29482 16396 ct 29495 16386 29505 16375 29509 16361 ct 
+29553 16374 l  29535 16423 29493 16449 29430 16449 ct 29386 16449 29353 16436 29330 16407 ct 
+29306 16379 29295 16338 29295 16283 ct 29295 16231 29306 16191 29330 16164 ct 
+29353 16136 29385 16122 29428 16122 ct 29517 16122 29561 16178 29561 16289 ct 
+29561 16297 l  29347 16297 l  p
+29509 16257 m  29507 16223 29498 16199 29484 16184 ct 29471 16168 29452 16161 29427 16161 ct 
+29403 16161 29384 16169 29370 16186 ct 29356 16203 29349 16227 29348 16257 ct 
+29509 16257 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 29623 16443 m  29623 16201 l  29623 16179 29623 16155 29621 16128 ct 
+29668 16128 l  29670 16163 29670 16185 29670 16191 ct 29672 16191 l  29679 16165 29689 16146 29699 16137 ct 
+29709 16127 29724 16122 29742 16122 ct 29749 16122 29757 16123 29763 16125 ct 
+29763 16173 l  29757 16170 29747 16170 29736 16170 ct 29715 16170 29700 16179 29689 16198 ct 
+29678 16217 29673 16243 29673 16278 ct 29673 16443 l  29623 16443 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 30217 16285 m  30217 16340 30206 16381 30183 16408 ct 30160 16436 30125 16449 30082 16449 ct 
+30038 16449 30005 16436 29983 16406 ct 29961 16379 29950 16338 29950 16285 ct 
+29950 16177 29994 16122 30083 16122 ct 30129 16122 30163 16136 30185 16162 ct 
+30206 16188 30217 16229 30217 16285 ct p
+30165 16285 m  30165 16242 30159 16210 30147 16190 ct 30134 16170 30113 16161 30084 16161 ct 
+30055 16161 30034 16171 30021 16191 ct 30008 16211 30002 16242 30002 16285 ct 
+30002 16326 30008 16358 30021 16379 ct 30034 16399 30054 16409 30081 16409 ct 
+30111 16409 30132 16400 30146 16380 ct 30159 16359 30165 16328 30165 16285 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 30338 16166 m  30338 16443 l  30289 16443 l  30289 16166 l 
+30247 16166 l  30247 16128 l  30289 16128 l  30289 16091 l  30289 16063 30295 16043 30307 16030 ct 
+30319 16018 30337 16011 30362 16011 ct 30375 16011 30387 16013 30398 16015 ct 
+30398 16055 l  30388 16054 30381 16053 30375 16053 ct 30362 16053 30353 16056 30347 16063 ct 
+30341 16069 30338 16082 30338 16099 ct 30338 16128 l  30398 16128 l  30398 16166 l 
+30338 16166 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 30666 16449 m  30636 16449 30614 16441 30599 16423 ct 30583 16406 30576 16384 30576 16355 ct 
+30576 16322 30586 16297 30606 16280 ct 30627 16262 30659 16253 30705 16251 ct 
+30771 16250 l  30771 16234 l  30771 16208 30766 16189 30756 16179 ct 30746 16167 30730 16162 30708 16162 ct 
+30685 16162 30669 16166 30659 16174 ct 30649 16182 30643 16195 30641 16211 ct 
+30589 16207 l  30598 16150 30637 16122 30709 16122 ct 30746 16122 30774 16131 30793 16149 ct 
+30813 16167 30823 16194 30823 16228 ct 30823 16364 l  30823 16379 30825 16390 30828 16399 ct 
+30832 16406 30840 16410 30850 16410 ct 30855 16410 30861 16409 30867 16408 ct 
+30867 16442 l  30854 16445 30841 16446 30828 16446 ct 30809 16446 30796 16442 30787 16431 ct 
+30779 16420 30774 16404 30773 16382 ct 30771 16382 l  30759 16406 30744 16423 30727 16435 ct 
+30710 16444 30690 16449 30666 16449 ct p
+30677 16409 m  30695 16409 30712 16405 30726 16396 ct 30740 16387 30751 16376 30759 16360 ct 
+30767 16345 30771 16329 30771 16314 ct 30771 16287 l  30717 16288 l  30694 16289 30676 16291 30664 16296 ct 
+30652 16301 30643 16308 30637 16318 ct 30630 16327 30627 16340 30627 16356 ct 
+30627 16373 30631 16386 30640 16396 ct 30649 16404 30661 16409 30677 16409 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 31020 16440 m  31003 16445 30987 16447 30969 16447 ct 30930 16447 30910 16423 30910 16376 ct 
+30910 16166 l  30875 16166 l  30875 16128 l  30912 16128 l  30926 16057 l 
+30960 16057 l  30960 16128 l  31015 16128 l  31015 16166 l  30960 16166 l 
+30960 16365 l  30960 16380 30962 16390 30967 16397 ct 30971 16403 30979 16406 30991 16406 ct 
+30998 16406 31007 16404 31020 16402 ct 31020 16440 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 31176 16440 m  31158 16445 31142 16447 31124 16447 ct 31085 16447 31065 16423 31065 16376 ct 
+31065 16166 l  31031 16166 l  31031 16128 l  31067 16128 l  31081 16057 l 
+31115 16057 l  31115 16128 l  31170 16128 l  31170 16166 l  31115 16166 l 
+31115 16365 l  31115 16380 31117 16390 31122 16397 ct 31126 16403 31134 16406 31146 16406 ct 
+31153 16406 31162 16404 31176 16402 ct 31176 16440 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 31255 16297 m  31255 16333 31262 16360 31276 16380 ct 31290 16399 31311 16409 31338 16409 ct 
+31361 16409 31378 16404 31391 16396 ct 31404 16386 31413 16375 31417 16361 ct 
+31461 16374 l  31443 16423 31402 16449 31338 16449 ct 31294 16449 31261 16436 31238 16407 ct 
+31214 16379 31203 16338 31203 16283 ct 31203 16231 31214 16191 31238 16164 ct 
+31261 16136 31293 16122 31336 16122 ct 31425 16122 31469 16178 31469 16289 ct 
+31469 16297 l  31255 16297 l  p
+31417 16257 m  31415 16223 31407 16199 31393 16184 ct 31380 16168 31361 16161 31335 16161 ct 
+31311 16161 31292 16169 31278 16186 ct 31264 16203 31257 16227 31256 16257 ct 
+31417 16257 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 31704 16443 m  31704 16243 l  31704 16213 31700 16191 31692 16180 ct 
+31684 16168 31670 16162 31649 16162 ct 31628 16162 31611 16170 31599 16188 ct 
+31587 16205 31580 16229 31580 16260 ct 31580 16443 l  31531 16443 l  31531 16195 l 
+31531 16158 31531 16136 31529 16128 ct 31576 16128 l  31576 16128 31577 16131 31577 16136 ct 
+31577 16140 31577 16145 31578 16150 ct 31578 16156 31578 16166 31578 16182 ct 
+31579 16182 l  31590 16159 31602 16144 31616 16135 ct 31630 16126 31647 16122 31666 16122 ct 
+31689 16122 31707 16126 31720 16137 ct 31733 16146 31742 16161 31748 16182 ct 
+31749 16182 l  31759 16160 31772 16145 31786 16136 ct 31801 16126 31819 16122 31839 16122 ct 
+31870 16122 31891 16130 31905 16148 ct 31919 16165 31926 16194 31926 16233 ct 
+31926 16443 l  31877 16443 l  31877 16243 l  31877 16213 31873 16191 31865 16180 ct 
+31857 16168 31843 16162 31822 16162 ct 31800 16162 31784 16170 31772 16187 ct 
+31760 16205 31754 16228 31754 16260 ct 31754 16443 l  31704 16443 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 32253 16284 m  32253 16394 32215 16448 32142 16448 ct 32096 16448 32066 16430 32050 16394 ct 
+32048 16394 l  32049 16396 32050 16411 32050 16443 ct 32050 16566 l  32000 16566 l 
+32000 16193 l  32000 16160 31999 16139 31998 16127 ct 32046 16127 l  32046 16128 32047 16131 32047 16136 ct 
+32047 16142 32048 16149 32048 16159 ct 32049 16168 32049 16176 32049 16179 ct 
+32050 16179 l  32059 16160 32071 16145 32085 16136 ct 32100 16126 32119 16122 32142 16122 ct 
+32179 16122 32207 16135 32226 16162 ct 32244 16188 32253 16228 32253 16284 ct 
 p
-7114 -31 m  7132 -31 7149 -35 7163 -44 ct 7177 -52 7188 -63 7196 -78 ct 7204 -92 7208 -107 7208 -122 ct 
-7208 -147 l  7154 -146 l  7131 -145 7113 -143 7101 -139 ct 7089 -134 7080 -127 7074 -118 ct 
-7067 -109 7064 -97 7064 -82 ct 7064 -66 7068 -53 7077 -44 ct 7086 -36 7098 -31 7114 -31 ct 
-p ef
-7456 -3 m  7439 2 7423 4 7405 4 ct 7366 4 7346 -19 7346 -64 ct 7346 -263 l  7312 -263 l 
-7312 -299 l  7348 -299 l  7362 -366 l  7396 -366 l  7396 -299 l  7451 -299 l 
-7451 -263 l  7396 -263 l  7396 -74 l  7396 -60 7398 -50 7403 -44 ct 7407 -38 7415 -35 7427 -35 ct 
-7434 -35 7443 -37 7456 -39 ct 7456 -3 l  p ef
-pom
-pum
-24654 18581 t
-262 -82 m  262 -54 251 -32 230 -17 ct 209 -2 179 6 141 6 ct 104 6 75 0 55 -12 ct 
-35 -25 22 -44 16 -70 ct 59 -78 l  64 -62 72 -50 86 -43 ct 99 -36 117 -32 141 -32 ct 
-166 -32 184 -36 196 -43 ct 208 -51 213 -63 213 -78 ct 213 -90 209 -99 201 -107 ct 
-193 -114 180 -120 162 -125 ct 127 -134 l  98 -142 78 -149 66 -156 ct 54 -163 45 -172 38 -182 ct 
-31 -192 28 -204 28 -219 ct 28 -246 37 -267 57 -281 ct 76 -295 104 -303 141 -303 ct 
-174 -303 200 -297 220 -285 ct 239 -274 251 -255 256 -229 ct 212 -224 l  209 -237 202 -247 190 -254 ct 
-178 -261 161 -265 141 -265 ct 119 -265 102 -262 92 -255 ct 81 -248 76 -238 76 -224 ct 
-76 -215 78 -208 82 -203 ct 87 -197 93 -193 102 -189 ct 111 -185 129 -180 156 -173 ct 
-183 -166 202 -160 213 -155 ct 225 -149 234 -143 241 -136 ct 247 -129 252 -121 256 -112 ct 
-260 -103 262 -93 262 -82 ct p ef
-437 -3 m  420 2 404 4 386 4 ct 347 4 327 -19 327 -64 ct 327 -263 l  293 -263 l 
-293 -299 l  329 -299 l  343 -366 l  377 -366 l  377 -299 l  432 -299 l 
-432 -263 l  377 -263 l  377 -74 l  377 -60 379 -50 384 -44 ct 388 -38 396 -35 408 -35 ct 
-415 -35 424 -37 437 -39 ct 437 -3 l  p ef
-554 6 m  524 6 502 -2 487 -18 ct 471 -34 464 -55 464 -83 ct 464 -114 474 -138 494 -154 ct 
-515 -171 547 -180 593 -181 ct 659 -182 l  659 -198 l  659 -222 654 -240 644 -250 ct 
-634 -261 618 -266 596 -266 ct 573 -266 557 -262 547 -255 ct 537 -247 531 -235 529 -219 ct 
-477 -223 l  486 -277 525 -304 597 -304 ct 634 -304 662 -295 681 -278 ct 700 -261 710 -236 710 -203 ct 
-710 -74 l  710 -60 712 -49 715 -41 ct 719 -34 727 -30 737 -30 ct 742 -30 748 -31 754 -32 ct 
-754 -1 l  741 2 728 3 715 3 ct 697 3 684 -1 675 -11 ct 667 -21 662 -36 661 -57 ct 
-659 -57 l  647 -34 632 -18 615 -8 ct 598 1 578 6 554 6 ct p
-565 -31 m  583 -31 600 -35 614 -44 ct 628 -52 639 -63 647 -78 ct 655 -92 659 -107 659 -122 ct 
-659 -147 l  605 -146 l  582 -145 564 -143 552 -139 ct 540 -134 531 -127 525 -118 ct 
-518 -109 515 -97 515 -82 ct 515 -66 519 -53 528 -44 ct 537 -36 549 -31 565 -31 ct 
-p ef
-793 0 m  793 -229 l  793 -250 793 -273 791 -298 ct 838 -298 l  840 -265 840 -244 840 -238 ct 
-842 -238 l  849 -263 859 -281 869 -290 ct 879 -299 894 -304 912 -304 ct 919 -304 926 -303 932 -301 ct 
-932 -256 l  926 -258 917 -258 906 -258 ct 885 -258 870 -250 859 -232 ct 848 -214 843 -189 843 -156 ct 
-843 0 l  793 0 l  p ef
-1093 -3 m  1076 2 1060 4 1042 4 ct 1003 4 983 -19 983 -64 ct 983 -263 l  949 -263 l 
-949 -299 l  985 -299 l  999 -366 l  1033 -366 l  1033 -299 l  1088 -299 l 
-1088 -263 l  1033 -263 l  1033 -74 l  1033 -60 1035 -50 1040 -44 ct 1044 -38 1052 -35 1064 -35 ct 
-1071 -35 1080 -37 1093 -39 ct 1093 -3 l  p ef
-1134 -362 m  1134 -409 l  1183 -409 l  1183 -362 l  1134 -362 l  p
-1134 0 m  1134 -298 l  1183 -298 l  1183 0 l  1134 0 l  p ef
-1450 0 m  1450 -189 l  1450 -209 1448 -224 1444 -235 ct 1441 -246 1434 -254 1426 -258 ct 
-1418 -263 1405 -266 1389 -266 ct 1365 -266 1346 -257 1332 -241 ct 1319 -225 1312 -202 1312 -173 ct 
-1312 0 l  1262 0 l  1262 -235 l  1262 -270 1262 -291 1260 -298 ct 1307 -298 l 
-1307 -298 1308 -295 1308 -291 ct 1308 -287 1308 -282 1309 -277 ct 1309 -272 1309 -262 1309 -247 ct 
-1310 -247 l  1322 -268 1335 -283 1350 -291 ct 1365 -300 1383 -304 1406 -304 ct 
-1438 -304 1462 -296 1477 -280 ct 1492 -263 1500 -236 1500 -199 ct 1500 0 l  1450 0 l 
-p ef
-1688 117 m  1655 117 1630 111 1610 98 ct 1591 85 1579 67 1573 43 ct 1623 36 l 
-1626 50 1634 61 1645 68 ct 1656 75 1671 79 1689 79 ct 1739 79 1763 50 1763 -8 ct 
-1763 -56 l  1763 -56 l  1753 -37 1741 -22 1724 -12 ct 1708 -3 1689 2 1667 2 ct 
-1630 2 1604 -10 1586 -34 ct 1569 -59 1561 -97 1561 -149 ct 1561 -201 1570 -240 1588 -265 ct 
-1607 -290 1635 -303 1673 -303 ct 1694 -303 1712 -298 1727 -289 ct 1743 -279 1755 -265 1763 -247 ct 
-1764 -247 l  1764 -253 1764 -262 1765 -276 ct 1766 -290 1767 -297 1767 -298 ct 
-1814 -298 l  1813 -288 1813 -268 1813 -237 ct 1813 -9 l  1813 75 1771 117 1688 117 ct 
+32200 16285 m  32200 16242 32194 16210 32183 16191 ct 32172 16173 32154 16163 32130 16163 ct 
+32110 16163 32095 16167 32084 16177 ct 32072 16185 32064 16199 32058 16217 ct 
+32052 16236 32050 16260 32050 16289 ct 32050 16330 32056 16361 32068 16380 ct 
+32081 16400 32101 16409 32129 16409 ct 32154 16409 32172 16400 32183 16381 ct 
+32194 16362 32200 16330 32200 16285 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 32429 16440 m  32412 16445 32396 16447 32378 16447 ct 32339 16447 32319 16423 32319 16376 ct 
+32319 16166 l  32284 16166 l  32284 16128 l  32321 16128 l  32335 16057 l 
+32369 16057 l  32369 16128 l  32424 16128 l  32424 16166 l  32369 16166 l 
+32369 16365 l  32369 16380 32371 16390 32376 16397 ct 32380 16403 32388 16406 32400 16406 ct 
+32407 16406 32416 16404 32429 16402 ct 32429 16440 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 32695 16356 m  32695 16386 32684 16409 32663 16425 ct 32642 16441 32612 16449 32574 16449 ct 
+32537 16449 32507 16443 32487 16430 ct 32467 16417 32454 16397 32448 16368 ct 
+32491 16360 l  32496 16378 32504 16390 32518 16398 ct 32531 16405 32550 16409 32574 16409 ct 
+32599 16409 32617 16405 32629 16398 ct 32641 16389 32646 16377 32646 16360 ct 
+32646 16347 32642 16338 32634 16329 ct 32626 16322 32613 16316 32595 16310 ct 
+32560 16301 l  32530 16293 32510 16285 32498 16278 ct 32486 16270 32477 16261 32470 16250 ct 
+32463 16240 32460 16227 32460 16211 ct 32460 16183 32469 16161 32489 16146 ct 
+32508 16131 32537 16123 32574 16123 ct 32607 16123 32633 16129 32653 16142 ct 
+32672 16154 32684 16174 32689 16201 ct 32645 16206 l  32642 16193 32635 16182 32623 16175 ct 
+32611 16167 32594 16163 32574 16163 ct 32552 16163 32535 16166 32524 16174 ct 
+32513 16181 32508 16191 32508 16206 ct 32508 16216 32510 16223 32514 16228 ct 
+32519 16235 32525 16239 32535 16243 ct 32544 16247 32562 16253 32589 16260 ct 
+32616 16267 32635 16274 32646 16279 ct 32658 16285 32667 16291 32674 16299 ct 
+32680 16306 32685 16315 32689 16324 ct 32693 16334 32695 16344 32695 16356 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 32986 16449 m  32956 16449 32934 16441 32919 16423 ct 32903 16406 32896 16384 32896 16355 ct 
+32896 16322 32906 16297 32926 16280 ct 32947 16262 32979 16253 33025 16251 ct 
+33091 16250 l  33091 16234 l  33091 16208 33086 16189 33076 16179 ct 33066 16167 33050 16162 33028 16162 ct 
+33005 16162 32989 16166 32979 16174 ct 32969 16182 32963 16195 32961 16211 ct 
+32909 16207 l  32918 16150 32957 16122 33029 16122 ct 33066 16122 33094 16131 33113 16149 ct 
+33133 16167 33143 16194 33143 16228 ct 33143 16364 l  33143 16379 33145 16390 33148 16399 ct 
+33152 16406 33160 16410 33170 16410 ct 33175 16410 33181 16409 33187 16408 ct 
+33187 16442 l  33174 16445 33161 16446 33148 16446 ct 33130 16446 33116 16442 33107 16431 ct 
+33099 16420 33094 16404 33093 16382 ct 33091 16382 l  33079 16406 33064 16423 33047 16435 ct 
+33030 16444 33010 16449 32986 16449 ct p
+32997 16409 m  33015 16409 33032 16405 33046 16396 ct 33060 16387 33071 16376 33079 16360 ct 
+33087 16345 33091 16329 33091 16314 ct 33091 16287 l  33037 16288 l  33014 16289 32996 16291 32984 16296 ct 
+32972 16301 32963 16308 32957 16318 ct 32950 16327 32947 16340 32947 16356 ct 
+32947 16373 32951 16386 32960 16396 ct 32969 16404 32981 16409 32997 16409 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 33340 16440 m  33323 16445 33306 16447 33288 16447 ct 33249 16447 33229 16423 33229 16376 ct 
+33229 16166 l  33195 16166 l  33195 16128 l  33231 16128 l  33245 16057 l 
+33279 16057 l  33279 16128 l  33335 16128 l  33335 16166 l  33279 16166 l 
+33279 16365 l  33279 16380 33281 16390 33286 16397 ct 33290 16403 33298 16406 33310 16406 ct 
+33318 16406 33327 16404 33340 16402 ct 33340 16440 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 26106 17016 m  26106 17046 26095 17069 26074 17085 ct 26053 17100 26023 17109 25985 17109 ct 
+25948 17109 25919 17103 25898 17090 ct 25878 17077 25865 17057 25859 17029 ct 
+25902 17020 l  25907 17038 25915 17050 25930 17058 ct 25943 17065 25961 17069 25985 17069 ct 
+26010 17069 26028 17065 26040 17058 ct 26052 17049 26057 17037 26057 17020 ct 
+26057 17007 26053 16998 26045 16989 ct 26037 16982 26024 16976 26006 16970 ct 
+25971 16961 l  25942 16953 25922 16945 25909 16938 ct 25897 16930 25888 16921 25881 16910 ct 
+25874 16900 25871 16887 25871 16871 ct 25871 16843 25880 16821 25900 16806 ct 
+25920 16791 25948 16783 25985 16783 ct 26018 16783 26044 16789 26064 16802 ct 
+26083 16814 26095 16834 26100 16861 ct 26056 16866 l  26053 16853 26046 16842 26034 16835 ct 
+26022 16827 26005 16823 25985 16823 ct 25963 16823 25946 16826 25936 16834 ct 
+25925 16841 25920 16851 25920 16866 ct 25920 16876 25922 16883 25926 16888 ct 
+25931 16895 25937 16899 25946 16903 ct 25955 16907 25973 16913 26000 16920 ct 
+26027 16927 26046 16934 26057 16939 ct 26069 16945 26078 16951 26085 16959 ct 
+26091 16966 26096 16975 26100 16984 ct 26104 16994 26106 17004 26106 17016 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 26281 17100 m  26264 17105 26248 17106 26230 17106 ct 26191 17106 26171 17083 26171 17036 ct 
+26171 16825 l  26136 16825 l  26136 16787 l  26173 16787 l  26187 16717 l 
+26221 16717 l  26221 16787 l  26276 16787 l  26276 16825 l  26221 16825 l 
+26221 17025 l  26221 17040 26223 17050 26228 17057 ct 26232 17063 26240 17066 26252 17066 ct 
+26259 17066 26268 17064 26281 17062 ct 26281 17100 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 26397 17109 m  26367 17109 26345 17100 26330 17084 ct 26314 17066 26307 17044 26307 17015 ct 
+26307 16982 26317 16957 26337 16940 ct 26358 16922 26390 16913 26436 16911 ct 
+26503 16910 l  26503 16894 l  26503 16868 26498 16849 26488 16839 ct 26478 16827 26461 16822 26439 16822 ct 
+26416 16822 26400 16826 26390 16834 ct 26380 16842 26374 16855 26372 16871 ct 
+26320 16867 l  26329 16810 26368 16782 26440 16782 ct 26478 16782 26506 16791 26525 16809 ct 
+26544 16827 26554 16854 26554 16888 ct 26554 17024 l  26554 17039 26556 17050 26559 17059 ct 
+26563 17066 26571 17070 26581 17070 ct 26586 17070 26592 17069 26598 17068 ct 
+26598 17102 l  26585 17105 26572 17106 26559 17106 ct 26541 17106 26528 17102 26519 17091 ct 
+26511 17081 26506 17064 26505 17042 ct 26503 17042 l  26491 17066 26475 17084 26458 17094 ct 
+26441 17103 26421 17109 26397 17109 ct p
+26408 17069 m  26426 17069 26443 17065 26457 17056 ct 26471 17047 26483 17036 26491 17020 ct 
+26499 17005 26503 16989 26503 16974 ct 26503 16947 l  26448 16948 l  26425 16949 26407 16951 26395 16956 ct 
+26383 16961 26374 16968 26368 16978 ct 26361 16987 26358 17000 26358 17016 ct 
+26358 17033 26362 17046 26371 17056 ct 26380 17064 26392 17069 26408 17069 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 26636 17103 m  26636 16861 l  26636 16839 26636 16815 26634 16788 ct 
+26682 16788 l  26684 16823 26684 16845 26684 16851 ct 26686 16851 l  26693 16825 26703 16806 26713 16797 ct 
+26723 16787 26738 16782 26756 16782 ct 26763 16782 26770 16783 26776 16785 ct 
+26776 16833 l  26770 16830 26761 16830 26750 16830 ct 26729 16830 26714 16839 26703 16858 ct 
+26692 16877 26687 16903 26687 16938 ct 26687 17103 l  26636 17103 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 26937 17100 m  26920 17105 26904 17106 26886 17106 ct 26846 17106 26826 17083 26826 17036 ct 
+26826 16825 l  26792 16825 l  26792 16787 l  26828 16787 l  26842 16717 l 
+26876 16717 l  26876 16787 l  26932 16787 l  26932 16825 l  26876 16825 l 
+26876 17025 l  26876 17040 26878 17050 26884 17057 ct 26888 17063 26896 17066 26908 17066 ct 
+26915 17066 26924 17064 26937 17062 ct 26937 17100 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 26977 16721 m  26977 16671 l  27027 16671 l  27027 16721 l 
+26977 16721 l  p
+26977 17103 m  26977 16788 l  27027 16788 l  27027 17103 l  26977 17103 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 27294 17103 m  27294 16903 l  27294 16882 27292 16866 27288 16855 ct 
+27285 16843 27277 16835 27269 16830 ct 27261 16825 27248 16822 27232 16822 ct 
+27208 16822 27189 16831 27175 16848 ct 27162 16865 27155 16889 27155 16920 ct 
+27155 17103 l  27105 17103 l  27105 16855 l  27105 16818 27105 16796 27103 16788 ct 
+27150 16788 l  27150 16788 27151 16791 27151 16796 ct 27151 16800 27151 16805 27152 16810 ct 
+27152 16816 27152 16826 27152 16842 ct 27153 16842 l  27165 16820 27178 16804 27193 16796 ct 
+27208 16786 27226 16782 27249 16782 ct 27282 16782 27306 16790 27321 16807 ct 
+27336 16825 27344 16854 27344 16893 ct 27344 17103 l  27294 17103 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 27531 17225 m  27498 17225 27473 17219 27453 17205 ct 27434 17191 27422 17173 27416 17147 ct 
+27466 17140 l  27469 17155 27477 17166 27488 17174 ct 27499 17181 27514 17185 27532 17185 ct 
+27583 17185 27607 17155 27607 17094 ct 27607 17044 l  27597 17064 27585 17080 27568 17090 ct 
+27551 17100 27532 17105 27510 17105 ct 27473 17105 27447 17093 27429 17067 ct 
+27412 17041 27404 17001 27404 16945 ct 27404 16890 27413 16849 27431 16823 ct 
+27450 16797 27478 16783 27516 16783 ct 27537 16783 27555 16788 27571 16798 ct 
+27587 16808 27599 16823 27607 16842 ct 27608 16842 l  27608 16836 27608 16826 27609 16811 ct 
+27610 16797 27611 16789 27611 16788 ct 27658 16788 l  27657 16799 27657 16820 27657 16853 ct 
+27657 17094 l  27657 17181 27615 17225 27531 17225 ct p
+27607 16945 m  27607 16920 27604 16898 27597 16879 ct 27591 16861 27582 16846 27570 16837 ct 
+27556 16827 27543 16822 27528 16822 ct 27502 16822 27484 16831 27472 16851 ct 
+27461 16870 27455 16902 27455 16945 ct 27455 16989 27460 17020 27471 17039 ct 
+27482 17057 27501 17066 27527 17066 ct 27542 17066 27556 17062 27569 17053 ct 
+27581 17042 27591 17028 27597 17010 ct 27604 16993 27607 16969 27607 16945 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 27965 17109 m  27935 17109 27912 17100 27897 17084 ct 27881 17066 27874 17044 27874 17015 ct 
+27874 16982 27884 16957 27904 16940 ct 27926 16922 27958 16913 28004 16911 ct 
+28070 16910 l  28070 16894 l  28070 16868 28065 16849 28055 16839 ct 28045 16827 28029 16822 28007 16822 ct 
+27984 16822 27968 16826 27958 16834 ct 27948 16842 27942 16855 27940 16871 ct 
+27887 16867 l  27896 16810 27936 16782 28008 16782 ct 28045 16782 28073 16791 28092 16809 ct 
+28111 16827 28121 16854 28121 16888 ct 28121 17024 l  28121 17039 28123 17050 28126 17059 ct 
+28130 17066 28138 17070 28148 17070 ct 28153 17070 28159 17069 28165 17068 ct 
+28165 17102 l  28152 17105 28139 17106 28126 17106 ct 28108 17106 28095 17102 28086 17091 ct 
+28078 17081 28073 17064 28072 17042 ct 28070 17042 l  28058 17066 28043 17084 28026 17094 ct 
+28009 17103 27989 17109 27965 17109 ct p
+27976 17069 m  27994 17069 28011 17065 28025 17056 ct 28039 17047 28050 17036 28058 17020 ct 
+28066 17005 28070 16989 28070 16974 ct 28070 16947 l  28016 16948 l  27993 16949 27975 16951 27963 16956 ct 
+27951 16961 27942 16968 27936 16978 ct 27929 16987 27926 17000 27926 17016 ct 
+27926 17033 27930 17046 27939 17056 ct 27948 17064 27960 17069 27976 17069 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 28391 17103 m  28391 16903 l  28391 16882 28389 16866 28385 16855 ct 
+28382 16843 28375 16835 28367 16830 ct 28359 16825 28346 16822 28330 16822 ct 
+28306 16822 28287 16831 28273 16848 ct 28260 16865 28253 16889 28253 16920 ct 
+28253 17103 l  28202 17103 l  28202 16855 l  28202 16818 28202 16796 28200 16788 ct 
+28248 16788 l  28248 16788 28249 16791 28249 16796 ct 28249 16800 28249 16805 28250 16810 ct 
+28250 16816 28250 16826 28250 16842 ct 28251 16842 l  28263 16820 28276 16804 28291 16796 ct 
+28306 16786 28324 16782 28347 16782 ct 28379 16782 28403 16790 28418 16807 ct 
+28433 16825 28441 16854 28441 16893 ct 28441 17103 l  28391 17103 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 28834 17109 m  28803 17109 28775 17103 28751 17091 ct 28727 17079 28709 17061 28696 17038 ct 
+28683 17015 28677 16987 28677 16955 ct 28677 16694 l  28729 16694 l  28729 16950 l 
+28729 16987 28738 17016 28756 17036 ct 28774 17055 28800 17064 28834 17064 ct 
+28870 17064 28897 17055 28916 17035 ct 28936 17015 28945 16985 28945 16946 ct 
+28945 16694 l  28998 16694 l  28998 16949 l  28998 16983 28991 17011 28978 17036 ct 
+28965 17059 28946 17078 28921 17090 ct 28897 17103 28868 17109 28834 17109 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 29085 17103 m  29085 16693 l  29138 16693 l  29138 17058 l 
+29335 17058 l  29335 17103 l  29085 17103 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 29677 16738 m  29677 17102 l  29625 17102 l  29625 16738 l 
+29492 16738 l  29492 16693 l  29812 16693 l  29812 16738 l  29677 16738 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 30128 17103 m  30012 16923 l  29892 17103 l  29835 17103 l 
+29982 16889 l  29846 16693 l  29903 16693 l  30012 16854 l  30117 16693 l 
+30175 16693 l  30042 16887 l  30186 17103 l  30128 17103 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 30611 16896 m  30611 16939 30603 16977 30587 17008 ct 30571 17042 30549 17066 30520 17083 ct 
+30491 17100 30456 17109 30417 17109 ct 30377 17109 30343 17100 30314 17084 ct 
+30285 17067 30263 17042 30248 17009 ct 30232 16977 30225 16939 30225 16896 ct 
+30225 16830 30242 16780 30276 16743 ct 30310 16706 30357 16687 30417 16687 ct 
+30457 16687 30491 16696 30520 16713 ct 30549 16728 30571 16753 30588 16784 ct 
+30603 16816 30611 16854 30611 16896 ct p
+30556 16896 m  30556 16845 30544 16805 30520 16776 ct 30496 16747 30462 16733 30417 16733 ct 
+30373 16733 30339 16747 30314 16776 ct 30290 16804 30278 16844 30278 16896 ct 
+30278 16947 30290 16988 30315 17019 ct 30339 17049 30373 17064 30417 17064 ct 
+30462 17064 30496 17049 30520 17021 ct 30544 16990 30556 16949 30556 16896 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 30981 16817 m  30981 16856 30969 16886 30946 16908 ct 30922 16931 30889 16943 30847 16943 ct 
+30733 16943 l  30733 17103 l  30680 17103 l  30680 16694 l  30844 16694 l 
+30888 16694 30922 16704 30946 16725 ct 30970 16747 30981 16778 30981 16817 ct 
 p
-1763 -149 m  1763 -173 1760 -194 1753 -212 ct 1747 -229 1738 -243 1726 -252 ct 
-1713 -261 1700 -266 1685 -266 ct 1659 -266 1641 -257 1629 -238 ct 1618 -220 1612 -190 1612 -149 ct 
-1612 -108 1617 -79 1628 -61 ct 1639 -44 1658 -35 1684 -35 ct 1699 -35 1713 -39 1725 -48 ct 
-1737 -58 1747 -71 1753 -88 ct 1760 -105 1763 -126 1763 -149 ct p ef
-2121 6 m  2091 6 2069 -2 2054 -18 ct 2038 -34 2031 -55 2031 -83 ct 2031 -114 2041 -138 2061 -154 ct 
-2082 -171 2114 -180 2160 -181 ct 2226 -182 l  2226 -198 l  2226 -222 2221 -240 2211 -250 ct 
-2201 -261 2185 -266 2163 -266 ct 2140 -266 2124 -262 2114 -255 ct 2104 -247 2098 -235 2096 -219 ct 
-2044 -223 l  2053 -277 2092 -304 2164 -304 ct 2201 -304 2229 -295 2248 -278 ct 
-2267 -261 2277 -236 2277 -203 ct 2277 -74 l  2277 -60 2279 -49 2282 -41 ct 2286 -34 2294 -30 2304 -30 ct 
-2309 -30 2315 -31 2321 -32 ct 2321 -1 l  2308 2 2295 3 2282 3 ct 2264 3 2251 -1 2242 -11 ct 
-2234 -21 2229 -36 2228 -57 ct 2226 -57 l  2214 -34 2199 -18 2182 -8 ct 2165 1 2145 6 2121 6 ct 
+30929 16817 m  30929 16764 30898 16738 30837 16738 ct 30733 16738 l  30733 16899 l 
+30839 16899 l  30899 16899 30929 16871 30929 16817 ct p ef
+gr
+gs
+0.007 0.007 0.007 c 31478 17103 m  31421 17103 l  31369 16880 l  31359 16830 l 
+31357 16840 31355 16853 31351 16868 ct 31348 16885 31329 16963 31295 17103 ct 
+31238 17103 l  31154 16787 l  31203 16787 l  31254 17001 l  31255 17006 31259 17025 31265 17059 ct 
+31270 17037 l  31332 16787 l  31386 16787 l  31438 17003 l  31450 17059 l 
+31459 17019 l  31515 16787 l  31565 16787 l  31478 17103 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 31648 16842 m  31659 16822 31672 16806 31687 16797 ct 31702 16787 31721 16783 31744 16783 ct 
+31776 16783 31800 16791 31815 16808 ct 31831 16825 31839 16854 31839 16894 ct 
+31839 17103 l  31788 17103 l  31788 16903 l  31788 16881 31786 16865 31782 16855 ct 
+31779 16843 31772 16836 31763 16830 ct 31755 16825 31742 16823 31727 16823 ct 
+31703 16823 31685 16831 31671 16848 ct 31657 16865 31650 16888 31650 16918 ct 
+31650 17103 l  31600 17103 l  31600 16671 l  31650 16671 l  31650 16784 l 
+31650 16796 31649 16808 31649 16821 ct 31648 16833 31648 16840 31647 16842 ct 
+31648 16842 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 31913 16721 m  31913 16671 l  31963 16671 l  31963 16721 l 
+31913 16721 l  p
+31913 17103 m  31913 16788 l  31963 16788 l  31963 17103 l  31913 17103 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 32040 17103 m  32040 16671 l  32091 16671 l  32091 17103 l 
+32040 17103 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 32205 16957 m  32205 16993 32212 17020 32226 17040 ct 32240 17059 32261 17069 32288 17069 ct 
+32310 17069 32327 17064 32340 17056 ct 32353 17046 32362 17035 32366 17021 ct 
+32411 17034 l  32392 17084 32351 17109 32288 17109 ct 32244 17109 32211 17096 32188 17067 ct 
+32164 17039 32153 16998 32153 16943 ct 32153 16891 32164 16851 32188 16824 ct 
+32211 16796 32243 16782 32286 16782 ct 32374 16782 32419 16838 32419 16949 ct 
+32419 16957 l  32205 16957 l  p
+32366 16917 m  32364 16883 32356 16859 32342 16844 ct 32329 16828 32310 16821 32285 16821 ct 
+32261 16821 32242 16829 32228 16846 ct 32214 16863 32207 16887 32206 16917 ct 
+32366 16917 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 32752 17100 m  32734 17105 32718 17106 32700 17106 ct 32661 17106 32641 17083 32641 17036 ct 
+32641 16825 l  32607 16825 l  32607 16787 l  32643 16787 l  32657 16717 l 
+32691 16717 l  32691 16787 l  32747 16787 l  32747 16825 l  32691 16825 l 
+32691 17025 l  32691 17040 32693 17050 32698 17057 ct 32702 17063 32710 17066 32722 17066 ct 
+32729 17066 32738 17064 32752 17062 ct 32752 17100 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 32842 16842 m  32853 16822 32866 16806 32881 16797 ct 32896 16787 32915 16783 32938 16783 ct 
+32970 16783 32994 16791 33010 16808 ct 33025 16825 33033 16854 33033 16894 ct 
+33033 17103 l  32982 17103 l  32982 16903 l  32982 16881 32980 16865 32976 16855 ct 
+32973 16843 32966 16836 32957 16830 ct 32949 16825 32936 16823 32921 16823 ct 
+32897 16823 32879 16831 32865 16848 ct 32851 16865 32844 16888 32844 16918 ct 
+32844 17103 l  32794 17103 l  32794 16671 l  32844 16671 l  32844 16784 l 
+32844 16796 32843 16808 32843 16821 ct 32842 16833 32842 16840 32841 16842 ct 
+32842 16842 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 33144 16957 m  33144 16993 33151 17020 33165 17040 ct 33179 17059 33201 17069 33228 17069 ct 
+33250 17069 33267 17064 33280 17056 ct 33293 17046 33302 17035 33306 17021 ct 
+33350 17034 l  33332 17084 33291 17109 33228 17109 ct 33183 17109 33150 17096 33127 17067 ct 
+33103 17039 33092 16998 33092 16943 ct 33092 16891 33103 16851 33127 16824 ct 
+33150 16796 33182 16782 33226 16782 ct 33314 16782 33358 16838 33358 16949 ct 
+33358 16957 l  33144 16957 l  p
+33306 16917 m  33304 16883 33296 16859 33282 16844 ct 33269 16828 33250 16821 33225 16821 ct 
+33201 16821 33181 16829 33167 16846 ct 33153 16863 33146 16887 33145 16917 ct 
+33306 16917 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 25630 17762 m  25630 17489 l  25630 17459 25631 17430 25633 17402 ct 
+25624 17437 25616 17464 25608 17483 ct 25507 17762 l  25470 17762 l  25370 17483 l 
+25354 17434 l  25345 17402 l  25346 17435 l  25347 17489 l  25347 17762 l 
+25300 17762 l  25300 17351 l  25369 17351 l  25473 17637 l  25476 17648 25479 17660 25482 17674 ct 
+25487 17686 25488 17696 25489 17702 ct 25491 17694 25494 17682 25498 17666 ct 
+25503 17650 25506 17641 25508 17637 ct 25610 17351 l  25678 17351 l  25678 17762 l 
+25630 17762 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 25799 17616 m  25799 17651 25806 17679 25821 17699 ct 25835 17718 25856 17729 25883 17729 ct 
+25905 17729 25922 17723 25935 17715 ct 25948 17705 25957 17694 25961 17680 ct 
+26005 17693 l  25987 17743 25946 17768 25883 17768 ct 25839 17768 25805 17755 25782 17726 ct 
+25758 17698 25747 17657 25747 17602 ct 25747 17550 25758 17510 25782 17483 ct 
+25805 17455 25838 17441 25881 17441 ct 25969 17441 26013 17497 26013 17608 ct 
+26013 17616 l  25799 17616 l  p
+25961 17576 m  25959 17542 25951 17518 25937 17503 ct 25924 17487 25905 17480 25880 17480 ct 
+25856 17480 25837 17488 25823 17505 ct 25809 17522 25801 17546 25800 17576 ct 
+25961 17576 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 26262 17711 m  26253 17733 26241 17746 26226 17756 ct 26210 17764 26192 17768 26169 17768 ct 
+26132 17768 26104 17755 26086 17728 ct 26069 17702 26060 17661 26060 17606 ct 
+26060 17496 26096 17441 26169 17441 ct 26192 17441 26211 17445 26226 17455 ct 
+26241 17463 26253 17477 26262 17496 ct 26263 17496 l  26262 17461 l  26262 17330 l 
+26313 17330 l  26313 17698 l  26313 17730 26313 17753 26314 17762 ct 26266 17762 l 
+26265 17760 26265 17753 26264 17741 ct 26264 17729 26263 17720 26263 17711 ct 
+26262 17711 l  p
+26112 17604 m  26112 17648 26117 17681 26128 17700 ct 26139 17719 26157 17728 26182 17728 ct 
+26210 17728 26230 17718 26243 17697 ct 26256 17677 26262 17644 26262 17601 ct 
+26262 17559 26256 17528 26243 17509 ct 26230 17489 26210 17480 26183 17480 ct 
+26158 17480 26140 17489 26128 17509 ct 26117 17528 26112 17560 26112 17604 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 26387 17380 m  26387 17330 l  26437 17330 l  26437 17380 l 
+26387 17380 l  p
+26387 17762 m  26387 17448 l  26437 17448 l  26437 17762 l  26387 17762 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 26562 17447 m  26562 17646 l  26562 17667 26564 17683 26568 17695 ct 
+26572 17707 26578 17716 26587 17720 ct 26595 17725 26608 17728 26624 17728 ct 
+26648 17728 26667 17719 26680 17701 ct 26694 17684 26701 17660 26701 17629 ct 
+26701 17447 l  26752 17447 l  26752 17695 l  26752 17733 26752 17755 26753 17762 ct 
+26706 17762 l  26706 17762 26706 17759 26706 17755 ct 26706 17750 26704 17745 26704 17740 ct 
+26704 17735 26704 17724 26703 17708 ct 26702 17708 l  26691 17730 26678 17746 26663 17755 ct 
+26648 17764 26629 17768 26607 17768 ct 26574 17768 26550 17760 26535 17743 ct 
+26520 17725 26513 17696 26513 17657 ct 26513 17447 l  26562 17447 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 27002 17762 m  27002 17562 l  27002 17531 26998 17510 26990 17499 ct 
+26982 17487 26968 17481 26947 17481 ct 26926 17481 26909 17489 26897 17507 ct 
+26885 17524 26878 17548 26878 17579 ct 26878 17762 l  26829 17762 l  26829 17514 l 
+26829 17477 26829 17455 26827 17447 ct 26874 17447 l  26874 17447 26875 17450 26875 17455 ct 
+26875 17459 26875 17464 26876 17469 ct 26876 17475 26876 17485 26876 17501 ct 
+26877 17501 l  26888 17478 26900 17463 26914 17454 ct 26928 17445 26945 17441 26964 17441 ct 
+26987 17441 27006 17445 27019 17456 ct 27032 17465 27041 17480 27046 17501 ct 
+27047 17501 l  27057 17479 27070 17464 27084 17455 ct 27099 17445 27117 17441 27137 17441 ct 
+27168 17441 27189 17449 27203 17467 ct 27217 17484 27224 17513 27224 17551 ct 
+27224 17762 l  27175 17762 l  27175 17562 l  27175 17531 27171 17510 27163 17499 ct 
+27155 17487 27141 17481 27120 17481 ct 27098 17481 27082 17489 27070 17506 ct 
+27058 17524 27052 17547 27052 17579 ct 27052 17762 l  27002 17762 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 27611 17649 m  27611 17687 27597 17717 27569 17737 ct 27540 17758 27501 17768 27450 17768 ct 
+27355 17768 27301 17734 27286 17664 ct 27337 17654 l  27342 17678 27355 17697 27374 17707 ct 
+27393 17719 27419 17725 27452 17725 ct 27486 17725 27512 17719 27531 17706 ct 
+27549 17695 27558 17677 27558 17653 ct 27558 17639 27555 17628 27550 17620 ct 
+27544 17611 27536 17605 27525 17599 ct 27515 17594 27502 17589 27488 17585 ct 
+27473 17582 27457 17578 27440 17574 ct 27409 17566 27386 17560 27370 17553 ct 
+27354 17545 27341 17537 27332 17528 ct 27323 17520 27316 17509 27311 17498 ct 
+27306 17485 27304 17473 27304 17457 ct 27304 17421 27317 17394 27342 17375 ct 
+27367 17356 27404 17346 27451 17346 ct 27495 17346 27529 17354 27552 17367 ct 
+27577 17382 27593 17406 27602 17441 ct 27549 17450 l  27544 17428 27533 17413 27517 17403 ct 
+27501 17393 27479 17388 27451 17388 ct 27420 17388 27396 17394 27380 17404 ct 
+27363 17415 27355 17433 27355 17454 ct 27355 17466 27358 17477 27365 17485 ct 
+27371 17494 27380 17500 27392 17506 ct 27404 17511 27428 17519 27463 17527 ct 
+27475 17530 27487 17533 27499 17536 ct 27511 17539 27522 17542 27533 17546 ct 
+27544 17550 27554 17556 27563 17561 ct 27574 17567 27582 17574 27589 17582 ct 
+27596 17590 27601 17600 27605 17610 ct 27609 17622 27611 17635 27611 17649 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 27689 17885 m  27675 17885 27664 17884 27654 17882 ct 27654 17843 l 
+27661 17844 27669 17844 27678 17844 ct 27708 17844 27733 17821 27751 17773 ct 
+27756 17760 l  27637 17446 l  27690 17446 l  27753 17620 l  27754 17623 27755 17626 27756 17630 ct 
+27758 17634 27762 17646 27769 17668 ct 27776 17689 27779 17703 27780 17705 ct 
+27799 17647 l  27865 17446 l  27918 17446 l  27802 17762 l  27790 17796 27779 17820 27768 17837 ct 
+27757 17853 27745 17865 27733 17874 ct 27720 17881 27705 17885 27689 17885 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 28148 17762 m  28148 17562 l  28148 17541 28146 17525 28142 17514 ct 
+28139 17502 28132 17494 28124 17489 ct 28116 17484 28103 17481 28087 17481 ct 
+28063 17481 28044 17490 28030 17507 ct 28017 17524 28010 17548 28010 17579 ct 
+28010 17762 l  27959 17762 l  27959 17514 l  27959 17477 27959 17455 27957 17447 ct 
+28005 17447 l  28005 17447 28006 17450 28006 17455 ct 28006 17459 28006 17464 28007 17469 ct 
+28007 17475 28007 17485 28007 17501 ct 28008 17501 l  28020 17479 28033 17463 28048 17455 ct 
+28063 17445 28081 17441 28104 17441 ct 28136 17441 28160 17449 28175 17466 ct 
+28190 17484 28198 17513 28198 17551 ct 28198 17762 l  28148 17762 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 28310 17603 m  28310 17644 28316 17676 28328 17696 ct 28341 17716 28360 17726 28385 17726 ct 
+28403 17726 28417 17721 28429 17710 ct 28441 17701 28448 17685 28451 17664 ct 
+28501 17668 l  28497 17698 28485 17722 28465 17741 ct 28444 17759 28418 17768 28386 17768 ct 
+28345 17768 28313 17755 28290 17725 ct 28268 17698 28257 17657 28257 17604 ct 
+28257 17550 28268 17510 28290 17483 ct 28313 17455 28345 17441 28386 17441 ct 
+28416 17441 28442 17449 28462 17466 ct 28482 17483 28494 17505 28499 17535 ct 
+28449 17539 l  28446 17522 28439 17507 28429 17498 ct 28419 17487 28404 17482 28384 17482 ct 
+28358 17482 28339 17491 28327 17509 ct 28316 17528 28310 17559 28310 17603 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 28898 17553 m  28898 17596 28891 17633 28875 17664 ct 28859 17696 28837 17720 28809 17737 ct 
+28780 17754 28747 17762 28709 17762 ct 28563 17762 l  28563 17351 l  28693 17351 l 
+28758 17351 28809 17370 28845 17405 ct 28880 17440 28898 17489 28898 17553 ct 
 p
-2132 -31 m  2150 -31 2167 -35 2181 -44 ct 2195 -52 2206 -63 2214 -78 ct 2222 -92 2226 -107 2226 -122 ct 
-2226 -147 l  2172 -146 l  2149 -145 2131 -143 2119 -139 ct 2107 -134 2098 -127 2092 -118 ct 
-2085 -109 2082 -97 2082 -82 ct 2082 -66 2086 -53 2095 -44 ct 2104 -36 2116 -31 2132 -31 ct 
-p ef
-2547 0 m  2547 -189 l  2547 -209 2545 -224 2541 -235 ct 2538 -246 2531 -254 2523 -258 ct 
-2515 -263 2502 -266 2486 -266 ct 2462 -266 2443 -257 2429 -241 ct 2416 -225 2409 -202 2409 -173 ct 
-2409 0 l  2359 0 l  2359 -235 l  2359 -270 2359 -291 2357 -298 ct 2404 -298 l 
-2404 -298 2405 -295 2405 -291 ct 2405 -287 2405 -282 2406 -277 ct 2406 -272 2406 -262 2406 -247 ct 
-2407 -247 l  2419 -268 2432 -283 2447 -291 ct 2462 -300 2480 -304 2503 -304 ct 
-2535 -304 2559 -296 2574 -280 ct 2589 -263 2597 -236 2597 -199 ct 2597 0 l  2547 0 l 
-p ef
-2991 6 m  2960 6 2932 0 2908 -11 ct 2884 -23 2866 -40 2853 -62 ct 2840 -84 2834 -110 2834 -141 ct 
-2834 -388 l  2886 -388 l  2886 -145 l  2886 -110 2895 -83 2913 -64 ct 2931 -46 2957 -37 2991 -37 ct 
-3026 -37 3053 -46 3072 -65 ct 3092 -84 3101 -112 3101 -149 ct 3101 -388 l  3154 -388 l 
-3154 -146 l  3154 -114 3147 -87 3134 -64 ct 3121 -42 3102 -24 3077 -12 ct 3053 0 3024 6 2991 6 ct 
-p ef
-3242 0 m  3242 -389 l  3295 -389 l  3295 -43 l  3491 -43 l  3491 0 l  3242 0 l 
-p ef
-3834 -346 m  3834 -1 l  3782 -1 l  3782 -346 l  3649 -346 l  3649 -389 l 
-3968 -389 l  3968 -346 l  3834 -346 l  p ef
-4285 0 m  4169 -170 l  4050 0 l  3992 0 l  4139 -202 l  4003 -389 l  4061 -389 l 
-4169 -236 l  4274 -389 l  4332 -389 l  4199 -204 l  4343 0 l  4285 0 l 
-p ef
-4768 -196 m  4768 -155 4760 -119 4744 -89 ct 4729 -58 4707 -35 4678 -19 ct 4649 -2 4614 6 4575 6 ct 
-4535 6 4501 -2 4472 -18 ct 4443 -34 4421 -58 4406 -88 ct 4390 -119 4383 -155 4383 -196 ct 
-4383 -258 4400 -306 4434 -341 ct 4468 -376 4515 -394 4575 -394 ct 4615 -394 4649 -386 4678 -370 ct 
-4707 -355 4729 -332 4745 -302 ct 4760 -272 4768 -236 4768 -196 ct p
-4714 -196 m  4714 -244 4702 -282 4678 -310 ct 4654 -337 4620 -351 4575 -351 ct 
-4531 -351 4497 -337 4472 -310 ct 4448 -283 4436 -245 4436 -196 ct 4436 -147 4448 -108 4473 -80 ct 
-4497 -51 4531 -37 4575 -37 ct 4620 -37 4654 -51 4678 -78 ct 4702 -106 4714 -145 4714 -196 ct 
-p ef
-5138 -271 m  5138 -234 5126 -205 5103 -184 ct 5079 -162 5046 -151 5005 -151 ct 
-4891 -151 l  4891 1 l  4838 1 l  4838 -388 l  5002 -388 l  5045 -388 5079 -378 5103 -358 ct 
-5127 -337 5138 -308 5138 -271 ct p
-5086 -271 m  5086 -321 5055 -346 4995 -346 ct 4891 -346 l  4891 -193 l  4997 -193 l 
-5056 -193 5086 -219 5086 -271 ct p ef
-5636 0 m  5579 0 l  5527 -211 l  5517 -258 l  5515 -249 5513 -237 5509 -222 ct 
-5506 -206 5487 -132 5453 0 ct 5396 0 l  5312 -299 l  5361 -299 l  5412 -96 l 
-5413 -91 5417 -73 5423 -41 ct 5428 -62 l  5490 -299 l  5544 -299 l  5596 -94 l 
-5608 -41 l  5617 -79 l  5673 -299 l  5722 -299 l  5636 0 l  p ef
-5806 -247 m  5817 -266 5830 -281 5845 -290 ct 5860 -299 5879 -303 5902 -303 ct 
-5934 -303 5958 -295 5973 -279 ct 5988 -263 5996 -236 5996 -198 ct 5996 1 l  5946 1 l 
-5946 -189 l  5946 -210 5944 -225 5940 -235 ct 5937 -246 5930 -253 5921 -258 ct 
-5913 -263 5900 -265 5885 -265 ct 5861 -265 5843 -257 5829 -241 ct 5815 -225 5808 -203 5808 -175 ct 
-5808 1 l  5758 1 l  5758 -409 l  5808 -409 l  5808 -302 l  5808 -291 5807 -279 5807 -267 ct 
-5806 -256 5806 -249 5805 -247 ct 5806 -247 l  p ef
-6071 -362 m  6071 -409 l  6120 -409 l  6120 -362 l  6071 -362 l  p
-6071 0 m  6071 -298 l  6120 -298 l  6120 0 l  6071 0 l  p ef
-6198 1 m  6198 -409 l  6248 -409 l  6248 1 l  6198 1 l  p ef
-6363 -138 m  6363 -104 6370 -78 6384 -59 ct 6398 -41 6419 -31 6446 -31 ct 6468 -31 6485 -36 6498 -44 ct 
-6511 -53 6520 -64 6524 -77 ct 6568 -65 l  6550 -18 6509 6 6446 6 ct 6402 6 6369 -7 6346 -33 ct 
-6322 -60 6311 -99 6311 -151 ct 6311 -200 6322 -238 6346 -264 ct 6369 -291 6401 -304 6444 -304 ct 
-6532 -304 6576 -251 6576 -145 ct 6576 -138 l  6363 -138 l  p
-6524 -176 m  6522 -208 6514 -231 6500 -245 ct 6487 -260 6468 -267 6443 -267 ct 
-6419 -267 6400 -259 6386 -243 ct 6372 -227 6365 -204 6364 -176 ct 6524 -176 l 
-p ef
-6909 -3 m  6892 2 6876 4 6858 4 ct 6819 4 6799 -19 6799 -64 ct 6799 -263 l  6765 -263 l 
-6765 -299 l  6801 -299 l  6815 -366 l  6849 -366 l  6849 -299 l  6904 -299 l 
-6904 -263 l  6849 -263 l  6849 -74 l  6849 -60 6851 -50 6856 -44 ct 6860 -38 6868 -35 6880 -35 ct 
-6887 -35 6896 -37 6909 -39 ct 6909 -3 l  p ef
-7000 -247 m  7011 -266 7024 -281 7039 -290 ct 7054 -299 7073 -303 7096 -303 ct 
-7128 -303 7152 -295 7167 -279 ct 7182 -263 7190 -236 7190 -198 ct 7190 1 l  7140 1 l 
-7140 -189 l  7140 -210 7138 -225 7134 -235 ct 7131 -246 7124 -253 7115 -258 ct 
-7107 -263 7094 -265 7079 -265 ct 7055 -265 7037 -257 7023 -241 ct 7009 -225 7002 -203 7002 -175 ct 
-7002 1 l  6952 1 l  6952 -409 l  7002 -409 l  7002 -302 l  7002 -291 7001 -279 7001 -267 ct 
-7000 -256 7000 -249 6999 -247 ct 7000 -247 l  p ef
-7302 -138 m  7302 -104 7309 -78 7323 -59 ct 7337 -41 7358 -31 7385 -31 ct 7407 -31 7424 -36 7437 -44 ct 
-7450 -53 7459 -64 7463 -77 ct 7507 -65 l  7489 -18 7448 6 7385 6 ct 7341 6 7308 -7 7285 -33 ct 
-7261 -60 7250 -99 7250 -151 ct 7250 -200 7261 -238 7285 -264 ct 7308 -291 7340 -304 7383 -304 ct 
-7471 -304 7515 -251 7515 -145 ct 7515 -138 l  7302 -138 l  p
-7463 -176 m  7461 -208 7453 -231 7439 -245 ct 7426 -260 7407 -267 7382 -267 ct 
-7358 -267 7339 -259 7325 -243 ct 7311 -227 7304 -204 7303 -176 ct 7463 -176 l 
+28845 17553 m  28845 17502 28832 17463 28806 17437 ct 28780 17410 28741 17397 28692 17397 ct 
+28616 17397 l  28616 17718 l  28703 17718 l  28732 17718 28757 17711 28778 17698 ct 
+28800 17685 28817 17665 28828 17641 ct 28840 17616 28845 17587 28845 17553 ct 
 p ef
-pom
-pum
-24064 19208 t
-376 0 m  376 -259 l  376 -288 377 -315 379 -342 ct 370 -309 362 -283 354 -265 ct 
-254 0 l  217 0 l  116 -265 l  100 -312 l  91 -342 l  92 -311 l  93 -259 l 
-93 0 l  46 0 l  46 -389 l  115 -389 l  219 -119 l  222 -108 226 -97 229 -84 ct 
-233 -72 235 -63 236 -57 ct 237 -65 241 -76 245 -91 ct 250 -106 253 -115 255 -119 ct 
-356 -389 l  424 -389 l  424 0 l  376 0 l  p ef
-546 -138 m  546 -104 553 -78 567 -59 ct 581 -41 602 -31 629 -31 ct 651 -31 668 -36 681 -44 ct 
-694 -53 703 -64 707 -77 ct 751 -65 l  733 -18 692 6 629 6 ct 585 6 552 -7 529 -33 ct 
-505 -60 494 -99 494 -151 ct 494 -200 505 -238 529 -264 ct 552 -291 584 -304 627 -304 ct 
-715 -304 759 -251 759 -145 ct 759 -138 l  546 -138 l  p
-707 -176 m  705 -208 697 -231 683 -245 ct 670 -260 651 -267 626 -267 ct 602 -267 583 -259 569 -243 ct 
-555 -227 548 -204 547 -176 ct 707 -176 l  p ef
-1009 -48 m  1000 -28 988 -15 973 -6 ct 957 2 939 6 916 6 ct 879 6 851 -7 833 -32 ct 
-816 -57 807 -96 807 -147 ct 807 -252 843 -304 916 -304 ct 939 -304 958 -300 973 -291 ct 
-988 -283 1000 -270 1009 -252 ct 1010 -252 l  1009 -285 l  1009 -409 l  1059 -409 l 
-1059 -61 l  1059 -30 1059 -9 1060 0 ct 1013 0 l  1012 -2 1012 -9 1011 -20 ct 
-1011 -31 1010 -40 1010 -48 ct 1009 -48 l  p
-859 -149 m  859 -107 864 -77 875 -59 ct 886 -41 904 -32 929 -32 ct 957 -32 977 -42 990 -62 ct 
-1003 -81 1009 -111 1009 -152 ct 1009 -192 1003 -221 990 -239 ct 977 -258 957 -267 930 -267 ct 
-905 -267 887 -258 875 -239 ct 864 -221 859 -191 859 -149 ct p ef
-1134 -362 m  1134 -409 l  1183 -409 l  1183 -362 l  1134 -362 l  p
-1134 0 m  1134 -298 l  1183 -298 l  1183 0 l  1134 0 l  p ef
-1309 -298 m  1309 -109 l  1309 -89 1311 -74 1315 -63 ct 1319 -52 1325 -44 1334 -40 ct 
-1342 -35 1355 -32 1371 -32 ct 1395 -32 1414 -41 1427 -57 ct 1441 -73 1448 -96 1448 -125 ct 
-1448 -298 l  1498 -298 l  1498 -63 l  1498 -28 1498 -7 1499 0 ct 1452 0 l 
-1452 0 1452 -3 1452 -7 ct 1452 -11 1451 -16 1451 -21 ct 1451 -26 1451 -36 1450 -51 ct 
-1449 -51 l  1438 -30 1425 -15 1410 -7 ct 1395 2 1376 6 1354 6 ct 1321 6 1297 -2 1282 -18 ct 
-1267 -35 1260 -62 1260 -99 ct 1260 -298 l  1309 -298 l  p ef
-1749 0 m  1749 -189 l  1749 -218 1745 -238 1737 -249 ct 1729 -260 1715 -266 1694 -266 ct 
-1673 -266 1656 -258 1644 -241 ct 1632 -225 1625 -202 1625 -173 ct 1625 0 l  1576 0 l 
-1576 -235 l  1576 -270 1576 -291 1574 -298 ct 1621 -298 l  1621 -298 1622 -295 1622 -291 ct 
-1622 -287 1622 -282 1623 -277 ct 1623 -272 1623 -262 1623 -247 ct 1624 -247 l 
-1635 -269 1647 -283 1661 -292 ct 1675 -300 1692 -304 1711 -304 ct 1734 -304 1752 -300 1765 -290 ct 
-1778 -281 1787 -267 1792 -247 ct 1793 -247 l  1803 -268 1816 -282 1830 -291 ct 
-1845 -300 1863 -304 1883 -304 ct 1914 -304 1935 -296 1949 -279 ct 1963 -263 1970 -236 1970 -199 ct 
-1970 0 l  1921 0 l  1921 -189 l  1921 -218 1917 -238 1909 -249 ct 1901 -260 1887 -266 1866 -266 ct 
-1844 -266 1828 -258 1816 -242 ct 1804 -225 1798 -203 1798 -173 ct 1798 0 l  1749 0 l 
-p ef
-2357 -107 m  2357 -71 2343 -43 2315 -24 ct 2287 -4 2248 6 2197 6 ct 2102 6 2048 -27 2033 -93 ct 
-2084 -103 l  2089 -80 2102 -62 2121 -52 ct 2140 -41 2166 -35 2199 -35 ct 2233 -35 2259 -41 2278 -53 ct 
-2296 -64 2305 -81 2305 -104 ct 2305 -117 2302 -127 2297 -135 ct 2291 -143 2283 -149 2272 -155 ct 
-2262 -160 2249 -164 2235 -168 ct 2220 -171 2204 -175 2187 -179 ct 2156 -186 2133 -192 2117 -199 ct 
-2101 -206 2088 -214 2079 -222 ct 2070 -230 2063 -240 2058 -251 ct 2053 -263 2051 -275 2051 -290 ct 
-2051 -323 2064 -349 2089 -367 ct 2114 -385 2151 -394 2198 -394 ct 2242 -394 2276 -387 2299 -374 ct 
-2323 -360 2339 -337 2348 -305 ct 2296 -296 l  2291 -316 2280 -331 2264 -340 ct 
-2248 -350 2226 -354 2198 -354 ct 2167 -354 2143 -349 2127 -339 ct 2110 -329 2102 -313 2102 -293 ct 
-2102 -281 2105 -271 2112 -263 ct 2118 -255 2127 -249 2139 -243 ct 2151 -238 2175 -231 2210 -223 ct 
-2222 -220 2234 -218 2246 -215 ct 2258 -212 2269 -209 2280 -205 ct 2291 -201 2301 -196 2310 -191 ct 
-2320 -185 2328 -179 2335 -171 ct 2342 -163 2347 -154 2351 -144 ct 2355 -133 2357 -121 2357 -107 ct 
-p ef
-2436 117 m  2422 117 2411 116 2401 114 ct 2401 77 l  2408 78 2416 78 2425 78 ct 
-2455 78 2480 56 2498 10 ct 2503 -2 l  2384 -299 l  2437 -299 l  2500 -134 l 
-2501 -131 2502 -128 2503 -124 ct 2505 -121 2509 -109 2516 -88 ct 2523 -68 2526 -56 2527 -54 ct 
-2546 -108 l  2612 -299 l  2664 -299 l  2549 0 l  2537 32 2526 55 2515 71 ct 
-2504 86 2492 98 2480 106 ct 2467 113 2452 117 2436 117 ct p ef
-2894 0 m  2894 -189 l  2894 -209 2892 -224 2888 -235 ct 2885 -246 2878 -254 2870 -258 ct 
-2862 -263 2849 -266 2833 -266 ct 2809 -266 2790 -257 2776 -241 ct 2763 -225 2756 -202 2756 -173 ct 
-2756 0 l  2706 0 l  2706 -235 l  2706 -270 2706 -291 2704 -298 ct 2751 -298 l 
-2751 -298 2752 -295 2752 -291 ct 2752 -287 2752 -282 2753 -277 ct 2753 -272 2753 -262 2753 -247 ct 
-2754 -247 l  2766 -268 2779 -283 2794 -291 ct 2809 -300 2827 -304 2850 -304 ct 
-2882 -304 2906 -296 2921 -280 ct 2936 -263 2944 -236 2944 -199 ct 2944 0 l  2894 0 l 
-p ef
-3056 -150 m  3056 -111 3062 -81 3074 -62 ct 3087 -43 3106 -33 3131 -33 ct 3149 -33 3163 -38 3175 -48 ct 
-3187 -57 3194 -72 3197 -92 ct 3247 -88 l  3243 -60 3231 -37 3211 -20 ct 3190 -3 3164 6 3132 6 ct 
-3091 6 3059 -7 3037 -34 ct 3015 -60 3004 -99 3004 -149 ct 3004 -200 3015 -238 3037 -264 ct 
-3059 -291 3091 -304 3132 -304 ct 3162 -304 3188 -296 3208 -280 ct 3228 -264 3240 -243 3245 -215 ct 
-3195 -211 l  3192 -227 3185 -241 3175 -250 ct 3165 -260 3150 -265 3130 -265 ct 
-3104 -265 3085 -256 3073 -239 ct 3062 -221 3056 -192 3056 -150 ct p ef
-3644 -199 m  3644 -158 3637 -123 3621 -93 ct 3605 -63 3583 -40 3555 -24 ct 3526 -8 3493 0 3455 0 ct 
-3310 0 l  3310 -389 l  3439 -389 l  3504 -389 3555 -372 3591 -339 ct 3626 -306 3644 -259 3644 -199 ct 
-p
-3591 -199 m  3591 -247 3578 -284 3552 -309 ct 3526 -334 3487 -347 3438 -347 ct 
-3363 -347 l  3363 -42 l  3449 -42 l  3478 -42 3503 -48 3524 -61 ct 3546 -73 3563 -92 3574 -115 ct 
-3586 -139 3591 -166 3591 -199 ct p ef
-3746 -138 m  3746 -104 3753 -78 3767 -59 ct 3781 -41 3802 -31 3829 -31 ct 3851 -31 3868 -36 3881 -44 ct 
-3894 -53 3903 -64 3907 -77 ct 3951 -65 l  3933 -18 3892 6 3829 6 ct 3785 6 3752 -7 3729 -33 ct 
-3705 -60 3694 -99 3694 -151 ct 3694 -200 3705 -238 3729 -264 ct 3752 -291 3784 -304 3827 -304 ct 
-3915 -304 3959 -251 3959 -145 ct 3959 -138 l  3746 -138 l  p
-3907 -176 m  3905 -208 3897 -231 3883 -245 ct 3870 -260 3851 -267 3826 -267 ct 
-3802 -267 3783 -259 3769 -243 ct 3755 -227 3748 -204 3747 -176 ct 3907 -176 l 
-p ef
-4022 1 m  4022 -409 l  4072 -409 l  4072 1 l  4022 1 l  p ef
-4225 6 m  4195 6 4173 -2 4158 -18 ct 4142 -34 4135 -55 4135 -83 ct 4135 -114 4145 -138 4165 -154 ct 
-4186 -171 4218 -180 4264 -181 ct 4330 -182 l  4330 -198 l  4330 -222 4325 -240 4315 -250 ct 
-4305 -261 4289 -266 4267 -266 ct 4244 -266 4228 -262 4218 -255 ct 4208 -247 4202 -235 4200 -219 ct 
-4148 -223 l  4157 -277 4196 -304 4268 -304 ct 4305 -304 4333 -295 4352 -278 ct 
-4371 -261 4381 -236 4381 -203 ct 4381 -74 l  4381 -60 4383 -49 4386 -41 ct 4390 -34 4398 -30 4408 -30 ct 
-4413 -30 4419 -31 4425 -32 ct 4425 -1 l  4412 2 4399 3 4386 3 ct 4368 3 4355 -1 4346 -11 ct 
-4338 -21 4333 -36 4332 -57 ct 4330 -57 l  4318 -34 4303 -18 4286 -8 ct 4269 1 4249 6 4225 6 ct 
-p
-4236 -31 m  4254 -31 4271 -35 4285 -44 ct 4299 -52 4310 -63 4318 -78 ct 4326 -92 4330 -107 4330 -122 ct 
-4330 -147 l  4276 -146 l  4253 -145 4235 -143 4223 -139 ct 4211 -134 4202 -127 4196 -118 ct 
-4189 -109 4186 -97 4186 -82 ct 4186 -66 4190 -53 4199 -44 ct 4208 -36 4220 -31 4236 -31 ct 
-p ef
-4477 117 m  4463 117 4452 116 4442 114 ct 4442 77 l  4449 78 4457 78 4466 78 ct 
-4496 78 4521 56 4539 10 ct 4544 -2 l  4425 -299 l  4478 -299 l  4541 -134 l 
-4542 -131 4543 -128 4544 -124 ct 4546 -121 4550 -109 4557 -88 ct 4564 -68 4567 -56 4568 -54 ct 
-4587 -108 l  4653 -299 l  4705 -299 l  4590 0 l  4578 32 4567 55 4556 71 ct 
-4545 86 4533 98 4521 106 ct 4508 113 4493 117 4477 117 ct p ef
-5017 -3 m  5000 2 4984 4 4966 4 ct 4927 4 4907 -19 4907 -64 ct 4907 -263 l  4873 -263 l 
-4873 -299 l  4909 -299 l  4923 -366 l  4957 -366 l  4957 -299 l  5012 -299 l 
-5012 -263 l  4957 -263 l  4957 -74 l  4957 -60 4959 -50 4964 -44 ct 4968 -38 4976 -35 4988 -35 ct 
-4995 -35 5004 -37 5017 -39 ct 5017 -3 l  p ef
-5059 -362 m  5059 -409 l  5108 -409 l  5108 -362 l  5059 -362 l  p
-5059 0 m  5059 -298 l  5108 -298 l  5108 0 l  5059 0 l  p ef
-5360 0 m  5360 -189 l  5360 -218 5356 -238 5348 -249 ct 5340 -260 5326 -266 5305 -266 ct 
-5284 -266 5267 -258 5255 -241 ct 5243 -225 5236 -202 5236 -173 ct 5236 0 l  5187 0 l 
-5187 -235 l  5187 -270 5187 -291 5185 -298 ct 5232 -298 l  5232 -298 5233 -295 5233 -291 ct 
-5233 -287 5233 -282 5234 -277 ct 5234 -272 5234 -262 5234 -247 ct 5235 -247 l 
-5246 -269 5258 -283 5272 -292 ct 5286 -300 5303 -304 5322 -304 ct 5345 -304 5363 -300 5376 -290 ct 
-5389 -281 5398 -267 5403 -247 ct 5404 -247 l  5414 -268 5427 -282 5441 -291 ct 
-5456 -300 5474 -304 5494 -304 ct 5525 -304 5546 -296 5560 -279 ct 5574 -263 5581 -236 5581 -199 ct 
-5581 0 l  5532 0 l  5532 -189 l  5532 -218 5528 -238 5520 -249 ct 5512 -260 5498 -266 5477 -266 ct 
-5455 -266 5439 -258 5427 -242 ct 5415 -225 5409 -203 5409 -173 ct 5409 0 l  5360 0 l 
-p ef
-5694 -138 m  5694 -104 5701 -78 5715 -59 ct 5729 -41 5750 -31 5777 -31 ct 5799 -31 5816 -36 5829 -44 ct 
-5842 -53 5851 -64 5855 -77 ct 5899 -65 l  5881 -18 5840 6 5777 6 ct 5733 6 5700 -7 5677 -33 ct 
-5653 -60 5642 -99 5642 -151 ct 5642 -200 5653 -238 5677 -264 ct 5700 -291 5732 -304 5775 -304 ct 
-5863 -304 5907 -251 5907 -145 ct 5907 -138 l  5694 -138 l  p
-5855 -176 m  5853 -208 5845 -231 5831 -245 ct 5818 -260 5799 -267 5774 -267 ct 
-5750 -267 5731 -259 5717 -243 ct 5703 -227 5696 -204 5695 -176 ct 5855 -176 l 
-p ef
-5970 0 m  5970 -229 l  5970 -250 5970 -273 5968 -298 ct 6015 -298 l  6017 -265 6017 -244 6017 -238 ct 
-6019 -238 l  6026 -263 6036 -281 6046 -290 ct 6056 -299 6071 -304 6089 -304 ct 
-6096 -304 6103 -303 6109 -301 ct 6109 -256 l  6103 -258 6094 -258 6083 -258 ct 
-6062 -258 6047 -250 6036 -232 ct 6025 -214 6020 -189 6020 -156 ct 6020 0 l  5970 0 l 
-p ef
-6312 -362 m  6312 -409 l  6361 -409 l  6361 -362 l  6312 -362 l  p
-6312 0 m  6312 -298 l  6361 -298 l  6361 0 l  6312 0 l  p ef
-6663 -82 m  6663 -54 6652 -32 6631 -17 ct 6610 -2 6580 6 6542 6 ct 6505 6 6476 0 6456 -12 ct 
-6436 -25 6423 -44 6417 -70 ct 6460 -78 l  6465 -62 6473 -50 6487 -43 ct 6500 -36 6518 -32 6542 -32 ct 
-6567 -32 6585 -36 6597 -43 ct 6609 -51 6614 -63 6614 -78 ct 6614 -90 6610 -99 6602 -107 ct 
-6594 -114 6581 -120 6563 -125 ct 6528 -134 l  6499 -142 6479 -149 6467 -156 ct 
-6455 -163 6446 -172 6439 -182 ct 6432 -192 6429 -204 6429 -219 ct 6429 -246 6438 -267 6458 -281 ct 
-6477 -295 6505 -303 6542 -303 ct 6575 -303 6601 -297 6621 -285 ct 6640 -274 6652 -255 6657 -229 ct 
-6613 -224 l  6610 -237 6603 -247 6591 -254 ct 6579 -261 6562 -265 6542 -265 ct 
-6520 -265 6503 -262 6493 -255 ct 6482 -248 6477 -238 6477 -224 ct 6477 -215 6479 -208 6483 -203 ct 
-6488 -197 6494 -193 6503 -189 ct 6512 -185 6530 -180 6557 -173 ct 6584 -166 6603 -160 6614 -155 ct 
-6626 -149 6635 -143 6642 -136 ct 6648 -129 6653 -121 6657 -112 ct 6661 -103 6663 -93 6663 -82 ct 
-p ef
-6880 0 m  6880 -229 l  6880 -250 6880 -273 6878 -298 ct 6925 -298 l  6927 -265 6927 -244 6927 -238 ct 
-6929 -238 l  6936 -263 6946 -281 6956 -290 ct 6966 -299 6981 -304 6999 -304 ct 
-7006 -304 7013 -303 7019 -301 ct 7019 -256 l  7013 -258 7004 -258 6993 -258 ct 
-6972 -258 6957 -250 6946 -232 ct 6935 -214 6930 -189 6930 -156 ct 6930 0 l  6880 0 l 
-p ef
-7113 -298 m  7113 -109 l  7113 -89 7115 -74 7119 -63 ct 7123 -52 7129 -44 7138 -40 ct 
-7146 -35 7159 -32 7175 -32 ct 7199 -32 7218 -41 7231 -57 ct 7245 -73 7252 -96 7252 -125 ct 
-7252 -298 l  7302 -298 l  7302 -63 l  7302 -28 7302 -7 7303 0 ct 7256 0 l 
-7256 0 7256 -3 7256 -7 ct 7256 -11 7255 -16 7255 -21 ct 7255 -26 7255 -36 7254 -51 ct 
-7253 -51 l  7242 -30 7229 -15 7214 -7 ct 7199 2 7180 6 7158 6 ct 7125 6 7101 -2 7086 -18 ct 
-7071 -35 7064 -62 7064 -99 ct 7064 -298 l  7113 -298 l  p ef
-7568 0 m  7568 -189 l  7568 -209 7566 -224 7562 -235 ct 7559 -246 7552 -254 7544 -258 ct 
-7536 -263 7523 -266 7507 -266 ct 7483 -266 7464 -257 7450 -241 ct 7437 -225 7430 -202 7430 -173 ct 
-7430 0 l  7380 0 l  7380 -235 l  7380 -270 7380 -291 7378 -298 ct 7425 -298 l 
-7425 -298 7426 -295 7426 -291 ct 7426 -287 7426 -282 7427 -277 ct 7427 -272 7427 -262 7427 -247 ct 
-7428 -247 l  7440 -268 7453 -283 7468 -291 ct 7483 -300 7501 -304 7524 -304 ct 
-7556 -304 7580 -296 7595 -280 ct 7610 -263 7618 -236 7618 -199 ct 7618 0 l  7568 0 l 
-p ef
-7881 0 m  7881 -189 l  7881 -209 7879 -224 7875 -235 ct 7872 -246 7865 -254 7857 -258 ct 
-7849 -263 7836 -266 7820 -266 ct 7796 -266 7777 -257 7763 -241 ct 7750 -225 7743 -202 7743 -173 ct 
-7743 0 l  7693 0 l  7693 -235 l  7693 -270 7693 -291 7691 -298 ct 7738 -298 l 
-7738 -298 7739 -295 7739 -291 ct 7739 -287 7739 -282 7740 -277 ct 7740 -272 7740 -262 7740 -247 ct 
-7741 -247 l  7753 -268 7766 -283 7781 -291 ct 7796 -300 7814 -304 7837 -304 ct 
-7869 -304 7893 -296 7908 -280 ct 7923 -263 7931 -236 7931 -199 ct 7931 0 l  7881 0 l 
-p ef
-8005 -362 m  8005 -409 l  8054 -409 l  8054 -362 l  8005 -362 l  p
-8005 0 m  8005 -298 l  8054 -298 l  8054 0 l  8005 0 l  p ef
-8321 0 m  8321 -189 l  8321 -209 8319 -224 8315 -235 ct 8312 -246 8305 -254 8297 -258 ct 
-8289 -263 8276 -266 8260 -266 ct 8236 -266 8217 -257 8203 -241 ct 8190 -225 8183 -202 8183 -173 ct 
-8183 0 l  8133 0 l  8133 -235 l  8133 -270 8133 -291 8131 -298 ct 8178 -298 l 
-8178 -298 8179 -295 8179 -291 ct 8179 -287 8179 -282 8180 -277 ct 8180 -272 8180 -262 8180 -247 ct 
-8181 -247 l  8193 -268 8206 -283 8221 -291 ct 8236 -300 8254 -304 8277 -304 ct 
-8309 -304 8333 -296 8348 -280 ct 8363 -263 8371 -236 8371 -199 ct 8371 0 l  8321 0 l 
-p ef
-8558 117 m  8525 117 8500 111 8480 98 ct 8461 85 8449 67 8443 43 ct 8493 36 l 
-8496 50 8504 61 8515 68 ct 8526 75 8541 79 8559 79 ct 8609 79 8633 50 8633 -8 ct 
-8633 -56 l  8633 -56 l  8623 -37 8611 -22 8594 -12 ct 8578 -3 8559 2 8537 2 ct 
-8500 2 8474 -10 8456 -34 ct 8439 -59 8431 -97 8431 -149 ct 8431 -201 8440 -240 8458 -265 ct 
-8477 -290 8505 -303 8543 -303 ct 8564 -303 8582 -298 8597 -289 ct 8613 -279 8625 -265 8633 -247 ct 
-8634 -247 l  8634 -253 8634 -262 8635 -276 ct 8636 -290 8637 -297 8637 -298 ct 
-8684 -298 l  8683 -288 8683 -268 8683 -237 ct 8683 -9 l  8683 75 8641 117 8558 117 ct 
-p
-8633 -149 m  8633 -173 8630 -194 8623 -212 ct 8617 -229 8608 -243 8596 -252 ct 
-8583 -261 8570 -266 8555 -266 ct 8529 -266 8511 -257 8499 -238 ct 8488 -220 8482 -190 8482 -149 ct 
-8482 -108 8487 -79 8498 -61 ct 8509 -44 8528 -35 8554 -35 ct 8569 -35 8583 -39 8595 -48 ct 
-8607 -58 8617 -71 8623 -88 ct 8630 -105 8633 -126 8633 -149 ct p ef
-pom
-0 20018 t 
+gr
+gs
+0.007 0.007 0.007 c 29000 17616 m  29000 17651 29007 17679 29021 17699 ct 29035 17718 29056 17729 29083 17729 ct 
+29105 17729 29122 17723 29135 17715 ct 29148 17705 29157 17694 29161 17680 ct 
+29205 17693 l  29187 17743 29146 17768 29083 17768 ct 29039 17768 29006 17755 28983 17726 ct 
+28958 17698 28947 17657 28947 17602 ct 28947 17550 28958 17510 28983 17483 ct 
+29006 17455 29038 17441 29081 17441 ct 29169 17441 29213 17497 29213 17608 ct 
+29213 17616 l  29000 17616 l  p
+29161 17576 m  29159 17542 29151 17518 29137 17503 ct 29124 17487 29105 17480 29080 17480 ct 
+29056 17480 29037 17488 29023 17505 ct 29009 17522 29002 17546 29001 17576 ct 
+29161 17576 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 29275 17763 m  29275 17330 l  29326 17330 l  29326 17763 l 
+29275 17763 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 29478 17768 m  29448 17768 29426 17760 29411 17743 ct 29395 17725 29388 17703 29388 17674 ct 
+29388 17641 29398 17616 29418 17599 ct 29439 17581 29471 17571 29517 17570 ct 
+29583 17569 l  29583 17553 l  29583 17527 29578 17508 29568 17498 ct 29558 17486 29542 17481 29520 17481 ct 
+29497 17481 29481 17485 29471 17493 ct 29461 17501 29455 17514 29453 17530 ct 
+29401 17526 l  29410 17469 29449 17441 29521 17441 ct 29558 17441 29586 17450 29605 17468 ct 
+29624 17486 29634 17513 29634 17547 ct 29634 17683 l  29634 17698 29636 17709 29639 17718 ct 
+29643 17725 29651 17730 29662 17730 ct 29667 17730 29673 17729 29679 17728 ct 
+29679 17761 l  29666 17764 29652 17765 29639 17765 ct 29621 17765 29608 17761 29599 17750 ct 
+29591 17740 29586 17723 29585 17701 ct 29583 17701 l  29571 17725 29556 17743 29539 17754 ct 
+29522 17763 29502 17768 29478 17768 ct p
+29489 17729 m  29507 17729 29524 17724 29538 17715 ct 29552 17706 29563 17695 29571 17679 ct 
+29579 17664 29583 17648 29583 17633 ct 29583 17606 l  29529 17607 l  29506 17608 29488 17610 29476 17615 ct 
+29464 17620 29455 17627 29449 17637 ct 29442 17646 29439 17659 29439 17675 ct 
+29439 17691 29443 17705 29452 17715 ct 29461 17723 29473 17729 29489 17729 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 29730 17885 m  29716 17885 29705 17884 29695 17882 ct 29695 17843 l 
+29702 17844 29710 17844 29719 17844 ct 29749 17844 29774 17821 29792 17773 ct 
+29797 17760 l  29678 17446 l  29731 17446 l  29794 17620 l  29794 17623 29796 17626 29797 17630 ct 
+29799 17634 29803 17646 29809 17668 ct 29817 17689 29820 17703 29820 17705 ct 
+29840 17647 l  29906 17446 l  29958 17446 l  29843 17762 l  29831 17796 29820 17820 29809 17837 ct 
+29797 17853 29786 17865 29774 17874 ct 29761 17881 29746 17885 29730 17885 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 30270 17759 m  30253 17764 30237 17766 30219 17766 ct 30180 17766 30159 17742 30159 17695 ct 
+30159 17484 l  30125 17484 l  30125 17446 l  30161 17446 l  30176 17376 l 
+30210 17376 l  30210 17446 l  30265 17446 l  30265 17484 l  30210 17484 l 
+30210 17684 l  30210 17699 30212 17709 30217 17716 ct 30221 17722 30229 17725 30241 17725 ct 
+30248 17725 30257 17723 30270 17721 ct 30270 17759 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 30311 17380 m  30311 17330 l  30361 17330 l  30361 17380 l 
+30311 17380 l  p
+30311 17762 m  30311 17448 l  30361 17448 l  30361 17762 l  30311 17762 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 30613 17762 m  30613 17562 l  30613 17531 30609 17510 30601 17499 ct 
+30593 17487 30579 17481 30557 17481 ct 30536 17481 30519 17489 30507 17507 ct 
+30495 17524 30488 17548 30488 17579 ct 30488 17762 l  30439 17762 l  30439 17514 l 
+30439 17477 30439 17455 30437 17447 ct 30484 17447 l  30484 17447 30485 17450 30485 17455 ct 
+30485 17459 30485 17464 30486 17469 ct 30486 17475 30486 17485 30486 17501 ct 
+30487 17501 l  30498 17478 30510 17463 30524 17454 ct 30538 17445 30555 17441 30575 17441 ct 
+30598 17441 30616 17445 30629 17456 ct 30642 17465 30651 17480 30656 17501 ct 
+30657 17501 l  30667 17479 30680 17464 30694 17455 ct 30709 17445 30727 17441 30747 17441 ct 
+30778 17441 30799 17449 30813 17467 ct 30827 17484 30834 17513 30834 17551 ct 
+30834 17762 l  30785 17762 l  30785 17562 l  30785 17531 30781 17510 30773 17499 ct 
+30765 17487 30751 17481 30730 17481 ct 30708 17481 30692 17489 30680 17506 ct 
+30668 17524 30662 17547 30662 17579 ct 30662 17762 l  30613 17762 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 30946 17616 m  30946 17651 30953 17679 30967 17699 ct 30981 17718 31002 17729 31029 17729 ct 
+31051 17729 31068 17723 31081 17715 ct 31095 17705 31104 17694 31108 17680 ct 
+31152 17693 l  31134 17743 31093 17768 31029 17768 ct 30985 17768 30952 17755 30929 17726 ct 
+30905 17698 30894 17657 30894 17602 ct 30894 17550 30905 17510 30929 17483 ct 
+30952 17455 30984 17441 31027 17441 ct 31116 17441 31160 17497 31160 17608 ct 
+31160 17616 l  30946 17616 l  p
+31108 17576 m  31106 17542 31098 17518 31083 17503 ct 31070 17487 31051 17480 31026 17480 ct 
+31002 17480 30983 17488 30969 17505 ct 30955 17522 30948 17546 30947 17576 ct 
+31108 17576 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 31222 17762 m  31222 17520 l  31222 17498 31222 17474 31220 17447 ct 
+31267 17447 l  31269 17482 31269 17504 31269 17510 ct 31271 17510 l  31278 17484 31288 17465 31299 17456 ct 
+31309 17446 31324 17441 31342 17441 ct 31349 17441 31356 17442 31362 17444 ct 
+31362 17491 l  31356 17489 31347 17489 31336 17489 ct 31315 17489 31300 17498 31288 17517 ct 
+31277 17536 31272 17562 31272 17597 ct 31272 17762 l  31222 17762 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 31564 17380 m  31564 17330 l  31614 17330 l  31614 17380 l 
+31564 17380 l  p
+31564 17762 m  31564 17448 l  31614 17448 l  31614 17762 l  31564 17762 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 31916 17676 m  31916 17705 31905 17728 31884 17744 ct 31863 17760 31833 17768 31794 17768 ct 
+31757 17768 31728 17762 31708 17749 ct 31688 17736 31675 17716 31669 17688 ct 
+31712 17680 l  31717 17697 31725 17709 31739 17717 ct 31752 17724 31770 17728 31794 17728 ct 
+31820 17728 31838 17724 31850 17717 ct 31862 17708 31867 17696 31867 17680 ct 
+31867 17666 31863 17657 31855 17648 ct 31847 17641 31834 17635 31816 17629 ct 
+31780 17620 l  31751 17611 31731 17604 31719 17597 ct 31707 17589 31698 17580 31691 17569 ct 
+31684 17559 31681 17546 31681 17530 ct 31681 17502 31690 17480 31710 17465 ct 
+31729 17450 31757 17442 31794 17442 ct 31828 17442 31854 17448 31874 17461 ct 
+31893 17473 31905 17493 31910 17520 ct 31866 17525 l  31863 17511 31856 17501 31844 17494 ct 
+31832 17486 31815 17482 31794 17482 ct 31772 17482 31755 17485 31745 17493 ct 
+31734 17500 31729 17510 31729 17525 ct 31729 17535 31731 17542 31735 17547 ct 
+31740 17554 31746 17558 31755 17562 ct 31764 17566 31782 17571 31810 17579 ct 
+31837 17586 31856 17593 31867 17598 ct 31879 17604 31888 17610 31895 17618 ct 
+31901 17625 31906 17634 31910 17643 ct 31914 17653 31916 17663 31916 17676 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 32132 17762 m  32132 17520 l  32132 17498 32132 17474 32130 17447 ct 
+32177 17447 l  32179 17482 32179 17504 32179 17510 ct 32181 17510 l  32188 17484 32198 17465 32208 17456 ct 
+32218 17446 32233 17441 32251 17441 ct 32258 17441 32265 17442 32272 17444 ct 
+32272 17491 l  32265 17489 32256 17489 32245 17489 ct 32224 17489 32209 17498 32198 17517 ct 
+32187 17536 32182 17562 32182 17597 ct 32182 17762 l  32132 17762 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 32365 17447 m  32365 17646 l  32365 17667 32367 17683 32371 17695 ct 
+32375 17707 32381 17716 32390 17720 ct 32398 17725 32411 17728 32428 17728 ct 
+32452 17728 32471 17719 32484 17701 ct 32498 17684 32505 17660 32505 17629 ct 
+32505 17447 l  32555 17447 l  32555 17695 l  32555 17733 32555 17755 32556 17762 ct 
+32509 17762 l  32509 17762 32509 17759 32509 17755 ct 32509 17750 32508 17745 32508 17740 ct 
+32508 17735 32508 17724 32507 17708 ct 32506 17708 l  32495 17730 32482 17746 32467 17755 ct 
+32452 17764 32433 17768 32410 17768 ct 32377 17768 32353 17760 32338 17743 ct 
+32323 17725 32316 17696 32316 17657 ct 32316 17447 l  32365 17447 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 32821 17762 m  32821 17562 l  32821 17541 32819 17525 32815 17514 ct 
+32812 17502 32805 17494 32797 17489 ct 32789 17484 32775 17481 32759 17481 ct 
+32735 17481 32716 17490 32702 17507 ct 32689 17524 32682 17548 32682 17579 ct 
+32682 17762 l  32632 17762 l  32632 17514 l  32632 17477 32632 17455 32630 17447 ct 
+32677 17447 l  32677 17447 32678 17450 32678 17455 ct 32678 17459 32678 17464 32679 17469 ct 
+32679 17475 32679 17485 32679 17501 ct 32680 17501 l  32692 17479 32705 17463 32720 17455 ct 
+32735 17445 32753 17441 32776 17441 ct 32809 17441 32833 17449 32848 17466 ct 
+32863 17484 32871 17513 32871 17551 ct 32871 17762 l  32821 17762 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 33134 17762 m  33134 17562 l  33134 17541 33132 17525 33128 17514 ct 
+33125 17502 33118 17494 33110 17489 ct 33102 17484 33089 17481 33073 17481 ct 
+33049 17481 33030 17490 33015 17507 ct 33002 17524 32995 17548 32995 17579 ct 
+32995 17762 l  32945 17762 l  32945 17514 l  32945 17477 32945 17455 32943 17447 ct 
+32990 17447 l  32990 17447 32991 17450 32991 17455 ct 32991 17459 32991 17464 32992 17469 ct 
+32992 17475 32992 17485 32992 17501 ct 32993 17501 l  33005 17479 33019 17463 33034 17455 ct 
+33049 17445 33067 17441 33090 17441 ct 33122 17441 33146 17449 33161 17466 ct 
+33176 17484 33184 17513 33184 17551 ct 33184 17762 l  33134 17762 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 33257 17380 m  33257 17330 l  33307 17330 l  33307 17380 l 
+33257 17380 l  p
+33257 17762 m  33257 17448 l  33307 17448 l  33307 17762 l  33257 17762 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 33574 17762 m  33574 17562 l  33574 17541 33572 17525 33568 17514 ct 
+33565 17502 33558 17494 33550 17489 ct 33542 17484 33529 17481 33513 17481 ct 
+33488 17481 33469 17490 33455 17507 ct 33442 17524 33435 17548 33435 17579 ct 
+33435 17762 l  33385 17762 l  33385 17514 l  33385 17477 33385 17455 33383 17447 ct 
+33430 17447 l  33430 17447 33431 17450 33431 17455 ct 33431 17459 33431 17464 33432 17469 ct 
+33432 17475 33432 17485 33432 17501 ct 33433 17501 l  33445 17479 33458 17463 33473 17455 ct 
+33488 17445 33507 17441 33530 17441 ct 33562 17441 33586 17449 33601 17466 ct 
+33616 17484 33624 17513 33624 17551 ct 33624 17762 l  33574 17762 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 33810 17885 m  33777 17885 33752 17879 33732 17865 ct 33713 17850 33701 17831 33695 17806 ct 
+33745 17799 l  33748 17814 33756 17825 33767 17833 ct 33778 17840 33793 17844 33811 17844 ct 
+33861 17844 33886 17814 33886 17753 ct 33886 17702 l  33876 17722 33863 17738 33846 17748 ct 
+33830 17758 33811 17763 33789 17763 ct 33752 17763 33726 17750 33708 17725 ct 
+33691 17699 33683 17659 33683 17604 ct 33683 17549 33692 17508 33710 17482 ct 
+33729 17456 33757 17442 33795 17442 ct 33816 17442 33834 17447 33849 17457 ct 
+33865 17467 33878 17482 33886 17501 ct 33887 17501 l  33887 17495 33887 17485 33888 17470 ct 
+33889 17456 33890 17448 33890 17447 ct 33937 17447 l  33936 17458 33936 17479 33936 17511 ct 
+33936 17751 l  33936 17840 33894 17885 33810 17885 ct p
+33886 17604 m  33886 17579 33883 17557 33876 17538 ct 33870 17520 33860 17505 33848 17496 ct 
+33835 17486 33822 17481 33807 17481 ct 33781 17481 33763 17490 33751 17510 ct 
+33740 17529 33734 17561 33734 17604 ct 33734 17647 33739 17678 33750 17697 ct 
+33761 17715 33780 17724 33806 17724 ct 33821 17724 33835 17720 33847 17710 ct 
+33859 17700 33870 17686 33876 17668 ct 33883 17650 33886 17628 33886 17604 ct 
+p ef
+gr
+gs
+0 lw 1 lj 0.171 0.378 0.601 c 13810 13362 m  14059 13099 l  ps
+gr
+gs
+0 lw 1 lj 0.171 0.378 0.601 c 13810 13677 m  14359 13099 l  ps
+gr
+gs
+0 lw 1 lj 0.171 0.378 0.601 c 13810 13992 m  14659 13099 l  ps
+gr
+gs
+0 lw 1 lj 0.171 0.378 0.601 c 14006 14102 m  14959 13099 l  ps
+gr
+gs
+0 lw 1 lj 0.171 0.378 0.601 c 14306 14102 m  15259 13099 l  ps
+gr
+gs
+0 lw 1 lj 0.171 0.378 0.601 c 14606 14102 m  15559 13099 l  ps
+gr
+gs
+0 lw 1 lj 0.171 0.378 0.601 c 14906 14102 m  15859 13099 l  ps
+gr
+gs
+0 lw 1 lj 0.171 0.378 0.601 c 15206 14102 m  16159 13099 l  ps
+gr
+gs
+0 lw 1 lj 0.171 0.378 0.601 c 15506 14102 m  16328 13237 l  ps
+gr
+gs
+0 lw 1 lj 0.171 0.378 0.601 c 15806 14102 m  16328 13553 l  ps
+gr
+gs
+0 lw 1 lj 0.171 0.378 0.601 c 16106 14102 m  16328 13868 l  ps
+gr
+gs
+0 lw 1 lj 0.007 0.007 0.007 c 14143 14434 m  16089 14434 l  ps
+gr
+gs
+0.007 0.007 0.007 c 13856 14436 m  14157 14541 l  14157 14329 l  13856 14436 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 16377 14436 m  16076 14329 l  16076 14541 l  16377 14436 l 
+p ef
+gr
+gs
+0 lw 1 lj 0.007 0.007 0.007 c 13855 15170 m  13855 14224 l  ps
+gr
+gs
+0 lw 1 lj 0.007 0.007 0.007 c 16375 15170 m  16375 14224 l  ps
+gr
+gs
+0.007 0.007 0.007 c 14123 15189 m  14123 15237 14130 15271 14144 15295 ct 14158 15317 14180 15328 14208 15328 ct 
+14228 15328 14244 15323 14258 15311 ct 14272 15300 14280 15283 14283 15259 ct 
+14340 15263 l  14335 15297 14322 15324 14299 15344 ct 14275 15364 14245 15375 14209 15375 ct 
+14163 15375 14127 15359 14102 15327 ct 14077 15297 14065 15251 14065 15191 ct 
+14065 15131 14077 15085 14102 15055 ct 14127 15023 14163 15007 14209 15007 ct 
+14243 15007 14273 15017 14295 15036 ct 14318 15054 14332 15080 14338 15113 ct 
+14281 15118 l  14278 15098 14270 15082 14258 15070 ct 14246 15059 14229 15054 14207 15054 ct 
+14178 15054 14156 15064 14143 15084 ct 14130 15105 14123 15141 14123 15189 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 14454 15076 m  14466 15054 14481 15036 14498 15025 ct 14514 15014 14536 15008 14562 15008 ct 
+14599 15008 14626 15018 14643 15038 ct 14660 15057 14669 15088 14669 15134 ct 
+14669 15369 l  14613 15369 l  14613 15145 l  14613 15120 14611 15102 14606 15089 ct 
+14602 15078 14595 15068 14585 15063 ct 14575 15058 14560 15055 14543 15055 ct 
+14516 15055 14495 15064 14480 15083 ct 14464 15102 14456 15128 14456 15161 ct 
+14456 15369 l  14400 15369 l  14400 14884 l  14456 14884 l  14456 15009 l 
+14456 15024 14455 15038 14455 15051 ct 14454 15066 14454 15074 14453 15076 ct 
+14454 15076 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 14836 15375 m  14803 15375 14777 15365 14759 15346 ct 14742 15328 14734 15302 14734 15269 ct 
+14734 15233 14745 15205 14769 15185 ct 14792 15166 14829 15156 14880 15154 ct 
+14955 15153 l  14955 15134 l  14955 15104 14949 15083 14938 15070 ct 14926 15058 14908 15053 14883 15053 ct 
+14858 15053 14840 15057 14829 15065 ct 14817 15075 14810 15088 14808 15108 ct 
+14749 15103 l  14758 15039 14804 15007 14884 15007 ct 14927 15007 14958 15018 14980 15038 ct 
+15001 15058 15012 15087 15012 15127 ct 15012 15279 l  15012 15297 15014 15310 15018 15319 ct 
+15022 15327 15031 15331 15043 15331 ct 15048 15331 15054 15331 15061 15329 ct 
+15061 15366 l  15047 15369 15033 15371 15018 15371 ct 14997 15371 14982 15366 14973 15355 ct 
+14964 15343 14958 15325 14957 15301 ct 14955 15301 l  14941 15327 14924 15346 14905 15358 ct 
+14886 15369 14863 15375 14836 15375 ct p
+14849 15330 m  14870 15330 14888 15325 14904 15316 ct 14920 15306 14932 15293 14941 15276 ct 
+14951 15259 14955 15241 14955 15223 ct 14955 15194 l  14894 15195 l  14868 15196 14848 15199 14834 15203 ct 
+14821 15208 14810 15217 14803 15227 ct 14796 15239 14792 15253 14792 15270 ct 
+14792 15289 14797 15304 14807 15315 ct 14817 15325 14831 15330 14849 15330 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 15315 15368 m  15315 15143 l  15315 15120 15313 15102 15308 15089 ct 
+15304 15076 15297 15067 15288 15061 ct 15278 15056 15263 15053 15245 15053 ct 
+15218 15053 15197 15062 15181 15082 ct 15166 15101 15158 15128 15158 15162 ct 
+15158 15368 l  15102 15368 l  15102 15089 l  15102 15048 15101 15023 15100 15014 ct 
+15153 15014 l  15153 15015 15153 15018 15154 15023 ct 15154 15027 15154 15033 15154 15039 ct 
+15155 15045 15155 15057 15155 15075 ct 15156 15075 l  15169 15049 15184 15033 15201 15022 ct 
+15218 15013 15239 15007 15264 15007 ct 15301 15007 15328 15017 15345 15036 ct 
+15362 15056 15371 15087 15371 15131 ct 15371 15368 l  15315 15368 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 15667 15368 m  15667 15143 l  15667 15120 15665 15102 15660 15089 ct 
+15656 15076 15649 15067 15640 15061 ct 15630 15056 15616 15053 15598 15053 ct 
+15571 15053 15550 15062 15533 15082 ct 15518 15101 15510 15128 15510 15162 ct 
+15510 15368 l  15454 15368 l  15454 15089 l  15454 15048 15453 15023 15452 15014 ct 
+15505 15014 l  15505 15015 15505 15018 15506 15023 ct 15506 15027 15506 15033 15506 15039 ct 
+15507 15045 15507 15057 15507 15075 ct 15508 15075 l  15521 15049 15536 15033 15554 15022 ct 
+15571 15013 15592 15007 15617 15007 ct 15653 15007 15680 15017 15697 15036 ct 
+15714 15056 15723 15087 15723 15131 ct 15723 15368 l  15667 15368 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 15847 15204 m  15847 15244 15855 15276 15870 15298 ct 15886 15320 15910 15330 15940 15330 ct 
+15964 15330 15984 15325 15998 15316 ct 16014 15305 16024 15293 16029 15277 ct 
+16078 15291 l  16058 15347 16012 15375 15940 15375 ct 15891 15375 15853 15359 15827 15328 ct 
+15801 15297 15788 15250 15788 15189 ct 15788 15130 15801 15085 15827 15054 ct 
+15853 15023 15890 15007 15938 15007 ct 16038 15007 16087 15069 16087 15196 ct 
+16087 15204 l  15847 15204 l  p
+16029 15159 m  16026 15121 16017 15094 16002 15076 ct 15986 15059 15965 15050 15937 15050 ct 
+15910 15050 15889 15060 15873 15079 ct 15857 15098 15848 15125 15847 15159 ct 
+16029 15159 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 16155 15369 m  16155 14884 l  16212 14884 l  16212 15369 l 
+16155 15369 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 14561 16019 m  14561 16053 14549 16078 14525 16095 ct 14500 16113 14466 16122 14423 16122 ct 
+14382 16122 14350 16115 14327 16101 ct 14304 16087 14290 16064 14283 16034 ct 
+14332 16023 l  14337 16042 14347 16057 14361 16065 ct 14376 16074 14397 16078 14423 16078 ct 
+14452 16078 14472 16074 14486 16064 ct 14499 16056 14505 16042 14505 16023 ct 
+14505 16009 14501 15998 14492 15989 ct 14483 15981 14468 15974 14448 15968 ct 
+14408 15957 l  14376 15948 14353 15940 14339 15931 ct 14326 15923 14315 15913 14307 15901 ct 
+14300 15888 14296 15874 14296 15857 ct 14296 15823 14307 15799 14329 15782 ct 
+14351 15765 14382 15757 14424 15757 ct 14461 15757 14490 15763 14512 15777 ct 
+14535 15790 14549 15813 14555 15844 ct 14503 15850 l  14500 15835 14492 15822 14478 15814 ct 
+14465 15805 14447 15801 14424 15801 ct 14399 15801 14380 15805 14368 15813 ct 
+14356 15821 14350 15835 14350 15850 ct 14350 15861 14353 15869 14358 15876 ct 
+14363 15882 14370 15887 14380 15893 ct 14389 15897 14410 15903 14441 15911 ct 
+14471 15919 14492 15926 14505 15933 ct 14518 15940 14529 15947 14537 15955 ct 
+14544 15963 14550 15973 14554 15983 ct 14559 15994 14561 16005 14561 16019 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 14948 16116 m  14882 16116 l  14824 15865 l  14812 15810 l 
+14811 15820 14808 15835 14804 15853 ct 14800 15871 14779 15960 14741 16116 ct 
+14676 16116 l  14582 15762 l  14637 15762 l  14694 16003 l  14695 16008 14700 16030 14707 16068 ct 
+14713 16044 l  14783 15762 l  14843 15762 l  14902 16006 l  14916 16068 l 
+14926 16023 l  14990 15762 l  15044 15762 l  14948 16116 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 15082 15687 m  15082 15631 l  15139 15631 l  15139 15687 l 
+15082 15687 l  p
+15082 16117 m  15082 15763 l  15139 15763 l  15139 16117 l  15082 16117 l 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 15352 16114 m  15333 16119 15315 16121 15295 16121 ct 15250 16121 15227 16095 15227 16041 ct 
+15227 15805 l  15189 15805 l  15189 15762 l  15230 15762 l  15246 15683 l 
+15284 15683 l  15284 15762 l  15346 15762 l  15346 15805 l  15284 15805 l 
+15284 16028 l  15284 16045 15287 16057 15292 16064 ct 15297 16070 15307 16075 15320 16075 ct 
+15327 16075 15338 16073 15352 16069 ct 15352 16114 l  p ef
+gr
+gs
+0.007 0.007 0.007 c 15442 15938 m  15442 15985 15449 16020 15463 16043 ct 15477 16065 15499 16077 15527 16077 ct 
+15547 16077 15563 16071 15577 16060 ct 15590 16048 15598 16031 15601 16007 ct 
+15659 16011 l  15654 16045 15641 16073 15617 16091 ct 15593 16111 15564 16122 15528 16122 ct 
+15482 16122 15446 16106 15421 16076 ct 15396 16045 15384 16000 15384 15940 ct 
+15384 15880 15396 15834 15421 15803 ct 15446 15771 15482 15756 15528 15756 ct 
+15562 15756 15591 15765 15613 15784 ct 15637 15802 15651 15828 15657 15862 ct 
+15599 15867 l  15596 15846 15588 15830 15577 15819 ct 15565 15807 15548 15802 15526 15802 ct 
+15497 15802 15475 15813 15462 15833 ct 15449 15855 15442 15889 15442 15938 ct 
+p ef
+gr
+gs
+0.007 0.007 0.007 c 15773 15823 m  15785 15801 15800 15783 15817 15773 ct 15833 15762 15855 15757 15881 15757 ct 
+15918 15757 15945 15766 15962 15785 ct 15979 15804 15988 15836 15988 15881 ct 
+15988 16117 l  15932 16117 l  15932 15893 l  15932 15867 15930 15849 15925 15837 ct 
+15921 15825 15914 15816 15904 15810 ct 15893 15805 15879 15802 15862 15802 ct 
+15835 15802 15814 15811 15799 15830 ct 15783 15849 15775 15876 15775 15908 ct 
+15775 16117 l  15719 16117 l  15719 15631 l  15775 15631 l  15775 15758 l 
+15775 15771 15774 15785 15774 15799 ct 15773 15814 15773 15821 15772 15823 ct 
+15773 15823 l  p ef
+gr
+gr
+gs
+0 0 m 37993 0 l 37993 20001 l 0 20001 l 0 0 l eoclip newpath
+gr
+gr
+0 20002 t 
 pom
 count op_count sub {pop} repeat countdictstack dict_count sub {end} repeat b4_inc_state restore
 %%PageTrailer
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/doc/source/wifi-design.rst ns-3.44/src/wifi/doc/source/wifi-design.rst
--- ns-3.43/src/wifi/doc/source/wifi-design.rst	2024-10-09 16:41:10.112656800 -0700
+++ ns-3.44/src/wifi/doc/source/wifi-design.rst	2025-03-09 16:55:49.775372500 -0700
@@ -23,7 +23,7 @@
 * **802.11a**, **802.11b**, **802.11g**, **802.11n** (both 2.4 and 5 GHz bands), **802.11ac**, **802.11ax** (2.4, 5 and 6 GHz bands) and **802.11be** 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** (including support for the MU EDCA Parameter Set)
-* 802.11be **Multi-link** discovery and setup
+* 802.11be **Multi-link** discovery and setup, **Multi-Link Operations (MLO)** in **STR** (Simultaneous Transmit Receive) mode and **EMLSR** (Enhanced Multi-Link Single-Radio) mode
 * 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
@@ -997,6 +997,12 @@
 * ``HeFrameExchangeManager`` adds support for the transmission and reception of
   multi-user frames via DL OFDMA and UL OFDMA, as detailed below.
 
+FrameExchangeManager classes may have attributes controlling the frame exchange sequences
+they handle. For instance, the ``FrameExchangeManager`` base class has a **ProtectedIfResponded**
+attribute to enable/disable RTS/CTS protection for stations that have already responded to a
+frame requiring acknowledgment in the same TXOP, even if such frame had not been protected by
+RTS/CTS.
+
 .. _wifi-mu-ack-sequences:
 
 MAC queues
@@ -1195,6 +1201,13 @@
   modulation class.
 * the ``AuxPhyTxCapable`` attribute indicates whether aux PHYs are capable of transmitting frames
 
+The EMLSR Manager base class also provides the ``PutAuxPhyToSleep`` attribute to control whether
+aux PHYs opportunistically switch to the sleep state. Specifically, when this attribute is set to
+true, the behavior is as follows. For DL TXOPs, aux PHYs are put to sleep after an ICF is received;
+for UL TXOPs, aux PHYs are put to sleep when the CTS frame is received, if RTS/CTS is used, or when
+the transmission of the data frame starts, otherwise. Aux PHYs are resumed from sleep when the TXOP
+ends.
+
 Downlink TXOP
 -------------
 
@@ -1251,35 +1264,234 @@
 
    EMLSR operations: Uplink TXOP
 
-An EMLSR client can start an UL TXOP on any of the EMLSR links. When channel access is obtained
-on a link where an aux PHY is operating, the aux PHY transmits an RTS frame and then the main PHY
-takes over the TXOP. Figure :ref:`fig-emlsr-ul-txop` shows that the EMLSR client obtains a TXOP on
-link 1, which the main PHY is operating on. Therefore, a data frame can be sent without
-protection. Clearly, the EMLSR client blocks transmissions on the other EMLSR links as soon as it
-starts transmitting the data frame, while the AP MLD blocks transmissions to the EMLSR client on
-the other EMLSR links as soon as it receives an MPDU from the EMLSR client. When the UL TXOP
-terminates, the AP MLD starts a transition delay timer, during which it does not attempt to start
-a frame exchange with the EMLSR client on any EMLSR link. The EMLSR client, instead, starts a
-MediumSyncDelay timer on all the EMLSR links other than the one on which the UL TXOP was carried
-out. While the MediumSyncDelay timer is running on a link, the EMLSR client can start an UL TXOP
-on that link, but it can perform at most a predefined number of attempts. The duration of the
-MediumSyncDelay timer, the maximum number of TXOP attempts and the threshold to be used instead
-of the normal CCA sensitivity for the primary 20 MHz channel are all advertised by the AP MLD and
-can be configured through the attributes of the ``EmlsrManager`` class: ``MediumSyncDuration``, ``MsdMaxNTxops`` and ``MsdOfdmEdThreshold``, respectively.
-
-Figure :ref:`fig-emlsr-ul-txop` also shows that, afterwards, the EMLSR client obtains a TXOP on
-link 0, which an aux PHY is operating on. The aux PHY transmits an RTS frame and, in the
-meantime, the main PHY is switched to operate on that link, receives the CTS response and
-transmits the data frame. In the example shown in Fig. :ref:`fig-emlsr-ul-txop`, the
-``SwitchAuxPhy`` attribute of the ``DefaultEmlsrManager`` class is set to false. This means that
-the aux PHY stays on link 0 and, therefore, no PHY is operating on link 1 while the main PHY is
-carrying out the UL TXOP on link 0. Once such UL TXOP terminates, the main PHY is switched back
-to operate on link 1. While the MediumSyncDelay timer is running on link 1, the EMLSR client
-obtains a TXOP on link 1 and, as mandated by the 802.11be specs, sends an RTS frame. If there is
-no response to the RTS frame, the EMLSR client can attempt to obtain the TXOP again and transmit
-another RTS frame. However, the number of attempts performed while the MediumSyncDelay timer is
-running is limited by the value advertised by the AP MLD and configured through the
-``MsdMaxNTxops`` attribute of the ``EmlsrManager`` class.
+An EMLSR client can normally start an UL TXOP on any of the EMLSR links, provided that no DL or UL
+TXOP is ongoing on another EMLSR link. When channel access is obtained on a link on which the main
+PHY is operating, the EMLSR client can directly transmit a Data frame, provided that the protection
+manager does not request to use a protection mechanism and no MediumSyncDelay timer is running on
+that link (see below). Figure :ref:`fig-emlsr-ul-txop` shows that the EMLSR client obtains a TXOP
+on link 1, which the main PHY is operating on, and a Data frame is transmitted without protection.
+Clearly, the EMLSR client blocks transmissions on the other EMLSR links as soon as it starts
+transmitting the Data frame, while the AP MLD blocks transmissions to the EMLSR client on the other
+EMLSR links as soon as it receives an MPDU from the EMLSR client. When the UL TXOP terminates, the
+AP MLD starts a transition delay timer, during which it does not attempt to start a frame exchange
+with the EMLSR client on any EMLSR link.
+
+When channel access is obtained on a link on which an aux PHY is operating, the behavior depends on
+whether the aux PHY is TX capable or not, as controlled via the the ``AuxPhyTxCapable`` attribute
+of the EMLSR Manager base class.
+
+Let us consider first the case in which the aux PHY is capable of
+transmitting PPDUs. As shown in Fig. :ref:`fig-emlsr-ul-txop`, the EMLSR client obtains a TXOP on
+link 0, which an aux PHY is operating on. The aux PHY has to transmit an RTS frame (independently
+of whether the protection manager requests to use a protection mechanism or not) and receive the
+CTS response from the AP. The RTS frame is actually transmitted by the aux PHY if the main PHY is
+able to switch to that link and be ready to take over the UL TXOP right after the reception of the
+CTS frame. The Default EMLSR Manager allows the transmission of the RTS frame if the channel switch
+delay (plus the remaining switching time if the main PHY is currently switching) does not exceed
+the remaining time until the end of the reception of the CTS frame.
+
+In the example shown in Fig. :ref:`fig-emlsr-ul-txop`, the ``SwitchAuxPhy`` attribute of the
+``DefaultEmlsrManager`` class is set to false. This means that the aux PHY stays on link 0 and,
+therefore, no PHY is operating on link 1 while the main PHY is carrying out the UL TXOP on link 0.
+Once such UL TXOP terminates, the main PHY is switched back to operate on link 1.
+
+If the aux PHY is not TX capable, the behavior is determined by the specific EMLSR Manager subclass.
+The Default EMLSR Manager simply does nothing, i.e., the transmit opportunity gained by the aux
+PHY is just dropped.
+
+MediumSyncDelay timer
+---------------------
+
+An EMLSR client may lose medium sync on a link for several reasons:
+
+* the EMLSR client transmits a PPDU on another link, the TX duration exceeds a predefined threshold
+  of 72 microseconds (as defined in the 802.11be amendment) and the ``InDeviceInterference``
+  attribute of the EMLSR Manager base class is set to true (which implies that, when the PHY of a
+  device transmits, an interference is generated such that the other PHYs of the same device are not
+  able to decode anything and cannot decrease the backoff counter)
+* No PHY operates on the link for at least 72 microseconds
+* The aux PHY operating on the link awakes after sleeping for at least 72 microseconds
+
+When the EMLSR client loses medium sync on a link for a period of time longer than 72 microseconds,
+it has to start a MediumSyncDelay timer for that link. While the MediumSyncDelay timer is running
+for a link, the EMLSR client can still access the medium on that link, but it has to mandatorily use
+RTS/CTS protection for the frame exchange. Additionally, the EMLSR client can perform at most a
+predefined number of attempts to start an UL TXOP on a link for which a MediumSyncDelay timer is
+running. The MediumSyncDelay timer for a link is cancelled if an MPDU is received on that link. The
+duration of the MediumSyncDelay timer, the maximum number of TXOP attempts and the threshold to be
+used instead of the normal CCA sensitivity for the primary 20 MHz channel are all advertised by the
+AP MLD and can be configured through the attributes of the ``EmlsrManager`` class: ``MediumSyncDuration``, ``MsdMaxNTxops`` and ``MsdOfdmEdThreshold``, respectively.
+
+Figure :ref:`fig-emlsr-ul-txop` shows that the transmission of the Data frame on link 1 causes
+a MediumSyncDelay timer to start on link 0; this timer is cancelled when the CTS frame is
+subsequently received. Similarly, a MediumSyncDelay timer is started on link 1 after that no PHY
+operated on that link (for at least 72 microseconds). While the MediumSyncDelay timer is running
+on link 1, the EMLSR client obtains a TXOP on link 1 (on which the main PHY is operating) and, as
+mandated by the 802.11be specs, sends an RTS frame. If there is no response to the RTS frame, the
+EMLSR client can attempt to obtain the TXOP again and transmit another RTS frame. However, the
+number of attempts performed while the MediumSyncDelay timer is running is limited by the value
+advertised by the AP MLD and configured through the ``MsdMaxNTxops`` attribute of the
+``EmlsrManager`` class.
+
+Advanced EMLSR Manager
+----------------------
+The Advanced EMLSR Manager explores a few opportunities to improve the performance of EMLSR
+clients. In case aux PHYs are not TX capable, the Advanced EMLSR Manager implements mechanisms for
+the main PHY to switch to an auxiliary link and start an UL TXOP. More specifically, when the
+backoff counter reaches zero on an auxiliary link, it is checked whether a PPDU that might be an
+ICF is being received on any other EMLSR link. A PPDU being received might be an ICF if any of the
+following conditions holds:
+
+* the PHY header of the PPDU is being received and the modulation class is non-HT
+* the MAC header of an MPDU in the PPDU has been received, the ``UseNotifiedMacHdr`` attribute of
+  the EMLSR Manager base class is true and the MAC header indicates this MPDU is a Trigger Frame
+  addressed to the EMLSR client or to the broadcast address
+* the payload of the PPDU is being received, the MAC header of an MPDU in the PPDU has not been
+  received yet or the ``UseNotifiedMacHdr`` attribute of the EMLSR Manager base class is false,
+  and the modulation class is non-HT
+
+If a PPDU being received on another EMLSR link might be an ICF and the ``AllowUlTxopInRx`` attribute
+of the Advanced EMLSR Manager is set to false, then the UL transmit opportunity is dropped.
+Otherwise, it is checked whether it is possible and convenient for the main PHY to switch to the
+auxiliary link. The following conditions must all hold in order to request the main PHY to switch
+to the auxiliary link:
+
+* the main PHY is not in TX state
+* the main PHY is not switching nor is it trying to get channel access on another auxiliary link
+* no MediumSyncDelay timer is running on the auxiliary link or the maximum number of TXOP attempts
+  has not yet been reached
+* the main PHY is expected to get channel access on the auxiliary link more quickly, i.e., ALL the
+  ACs with queued frames (that can be transmitted on the link on which the main PHY is currently
+  operating) and with priority higher than or equal to that of the AC for which Aux PHY gained TXOP
+  have their backoff counter greater than the maximum between the expected delay in gaining channel
+  access on the auxiliary and the channel switch delay (plus PIFS if we cannot use aux PHY CCA)
+
+If the main PHY switches to the auxiliary link, it cannot transmit as soon as it completes the
+channel switch, but it has to verify that the medium has been virtually and physically idle
+during a PIFS period by means of a NAV and CCA check. If the ``UseAuxPhyCca`` attribute of the
+Advanced EMLSR Manager is set to true or the maximum channel width supported by the aux PHY is at
+least equal to the the maximum channel width supported by the main PHY, then the NAV and CCA check
+is performed by the aux PHY in the PIFS period preceding the main PHY channel switch end. Otherwise,
+the NAV and CCA check is performed by the main PHY in the PIFS period following the main PHY channel
+switch end.
+
+If the NAV and CCA check indicates that the medium has not been idle in the PIFS period, the main
+PHY has to contend for channel access on the auxiliary link. However, in case the aux PHYs do not
+switch link, the main PHY will attempt to get channel access on the auxiliary link for a limited
+amount of time, indicated by the ``SwitchMainPhyBackDelay`` attribute, and then it will switch back
+to the preferred link, in order not to leave the preferred link without a PHY operating on it for a
+too long time. Specifically, at the end of the PIFS period during which the medium has been
+determined to be busy, if channel access is not expected to be gained on the auxiliary link for any
+AC that has traffic to send on that link within a SwitchMainPhyBackDelay plus a channel switch
+delay (due to, e.g., NAV reservation), the main PHY switches back to the preferred link (unless
+there is a reason to postpone the switch, see below). Otherwise, a SwitchMainPhyBack timer is
+started having a duration of SwitchMainPhyBackDelay. The Advanced EMLSR Manager also connects a PHY
+listener to the main PHY, so that it is notified of events such as RX start, RX end, TX start and
+CCA busy start. If the Advanced EMLSR Manager is notified of such events, or is notified of the
+reception of the MAC header of an MPDU by the main PHY, while the SwitchMainPhyBack timer is
+running and channel access is not expected to be gained on the auxiliary link for any AC that has
+traffic to send on that link within the remaining time until the SwitchMainPhyBack timer expires
+plus a channel switch delay, then the main PHY switches back to the preferred link unless there is
+a reason to postpone the switch. The switch back to the preferred link is postponed if:
+
+* a PPDU that might be an ICF is being received on an EMLSR link on which the NAV is not set or
+  the TXOP holder is the associated AP MLD, OR
+* on the link on which the main PHY is currently operating the NAV is not set or the TXOP holder
+  is the associated AP MLD, the medium is idle and channel access is expected to be gained within
+  a channel switch delay
+
+A similar check is applied to possibly postpone the switch back to the preferred link when the
+SwitchMainPhyBack timer expires.
+
+The Advanced EMLSR Manager also connects a callback to the ``NSlotsLeftAlert`` trace source of the
+Channel Access Manager, which sends notifications when at most a configurable number of slots
+remain until the backoff of an AC expires. When the Advanced EMLSR Manager receives such a
+notification, it evaluates the opportunity of switching the main PHY to the auxiliary link on which
+the notification has been received. Specifically, the Advanced EMLSR Manager performs the check
+described above to determine whether the potential UL transmit opportunity shall be dropped (it is
+dropped if a PPDU being received on another EMLSR link might be an ICF and the ``AllowUlTxopInRx``
+attribute is set to false) and then it checks whether it is convenient for the main PHY to switch
+to the auxiliary link as described above (with the exception that the expected delay until backoff
+end is also taken into account). If the main PHY is requested to switch to the auxiliary link and
+the backoff on the auxiliary link counts down to zero while the main PHY is switching, a NAV and
+CCA check is performed as described above (by the aux PHY in the PIFS period preceding the main PHY
+channel switch end or by the main PHY in the PIFS period following the main PHY channel switch end).
+Similarly, a NAV and CCA check is performed (by the main PHY) if the remaining backoff time when
+the main PHY switch is completed is less than a PIFS. Otherwise, SwitchMainPhyBack timer is started
+having a duration of SwitchMainPhyBackDelay plus the remaining time until the backoff of the AC
+involved in the Channel Access Manager notification is expected to expire.
+
+The Advanced EMLSR Manager has the ``InterruptSwitch`` attribute that can be set to true to
+interrupt a main PHY switch when it is determined that the main PHY shall switch to a different
+link while still completing the previous switch; in such cases, the previous switch is interrupted
+and the new channel switch starts. This opportunity is exploited in two situations:
+
+* If the main PHY is switching while a TX capable aux PHY transmits an RTS to start an UL TXOP,
+  the main PHY switch can be interrupted and the main PHY can start switching to the link on
+  which the RTS has been sent, in order to meet the constraint that the main PHY shall be operating
+  on that link right after the reception of the CTS frame.
+* The main PHY is requested to switch to a link on which a TX capable aux PHY has sent an RTS, but
+  a CTS timeout occurs while the main PHY is switching. If the aux PHYs do not switch link, the
+  main PHY switch is interrupted and the main PHY returns to the preferred link; if the aux PHYs
+  switch link, the main PHY switch is interrupted and the main PHY returns to the link it just left.
+
+EMLSR traces
+------------
+
+.. _fig-emlsr-txop-ended-trace:
+
+.. figure:: figures/emlsr-txop-ended-trace.*
+   :align: center
+
+   Illustration of EMLSR TXOP ended trace
+
+The EMLSR implementation provides the following traces to further analyze the performance of
+EMLSR clients:
+
+* The ``WifiMac::IcfDropReason`` trace is fired every time an ICF is dropped by an EMLSR client
+  and provides the reason for dropping the ICF and the link on which the ICF was transmitted. The
+  reasons for dropping an ICF are:
+
+  * WifiIcfDrop::USING_OTHER_LINK: the ICF is received right after starting an UL transmission
+    on another link; the ICF is dropped and the UL TXOP continues.
+  * WifiIcfDrop::NOT_ENOUGH_TIME_TX: the ICF is received while the main PHY is completing a TX
+    and there is not enough time for the main PHY to complete the TX, start switching and be
+    operating on the link the ICF is received on at the end of the ICF reception
+  * WifiIcfDrop::NOT_ENOUGH_TIME_SWITCH: the ICF is received while the main PHY is completing a
+    switch and there is not enough time for the main PHY to complete the channel switch, start
+    switching and be operating on the link the ICF is received on at the end of the ICF reception
+
+* The ``StaWifiMac::EmlsrLinkSwitch`` trace provides information about start/end of EMLSR link
+  switch events: when a PHY operating on a link starts switching to another link, the trace provides
+  the ID of the link the PHY is leaving and a null pointer (indicating that no PHY is operating on
+  that link); when a PHY completes switching to a link, the trace provides the ID of the link and a
+  pointer to the PHY (which is now operating on that link)
+* The ``EmlsrManager::MainPhySwitch`` trace is fired when the main PHY switches channel to operate
+  on another link. Information associated with the main PHY switch is provided through a struct
+  that is inherited from ``struct EmlsrMainPhySwitchTrace``. Different inherited structs are defined
+  for the different reasons for the main PHY to switch link. All the inherited structs provide a
+  ``GetName`` method returning a string identifying the particular inherited struct. The available
+  inherited structs are:
+
+  * ``EmlsrDlTxopIcfReceivedByAuxPhyTrace``: main PHY is starting switching to another link to carry
+    out a DL TXOP after that an aux PHY received an ICF on that link
+  * ``EmlsrUlTxopRtsSentByAuxPhyTrace``: main PHY is starting switching to another link to take over
+    an UL TXOP started by a TX capable aux PHY that transmitted an RTS frame on that link
+  * ``EmlsrTxopEndedTrace``: main PHY is starting switching because a (DL or UL) TXOP ended. This
+    trace has a parameter, remTime, whose value is set as follows. When a TXOP ends after a
+    successful transmission and aux PHYs do not switch link, the main PHY switches back to the
+    preferred link; in such a case, the remTime parameter is set to zero. However, a TXOP may end
+    due to a CTS timeout after that a TX capable aux PHY had sent an RTS to start an UL TXOP and
+    the main PHY may be switching when the CTS timeout occurs. If the main PHY switch cannot be
+    interrupted (see case a) in Fig. :ref:`fig-emlsr-txop-ended-trace`), which is the case with the
+    Default EMLSR Manager or with the Advanced EMLSR Manager when the ``InterruptSwitch`` attribute
+    is false, the remTime parameter is set to the remaining channel switch delay at the time the
+    TXOP ends. If the main PHY switch can be interrupted (see case b) in Fig.
+    :ref:`fig-emlsr-txop-ended-trace`), which is the case with the Advanced EMLSR Manager when the
+    ``InterruptSwitch`` attribute is true, the remTime parameter indicates the time that was left
+    to complete the previous channel switch. Note that, in the latter case, this channel switch can
+    also occur when the aux PHYs switch link, as the main PHY returns to the link it was operating
+    on before starting the previous channel switch.
 
 Ack manager
 ###########
@@ -1514,6 +1726,116 @@
 
 Note: since our model is based on a single threshold, the PHY only supports one restricted power level.
 
+Groupcast with retries (GCR)
+############################
+
+The IEEE 802.11aa amendment introduced GCR functionality to provide reliable multicast transmissions.
+The standard proposes two retransmission policies: unsolicited retry (GCR-UR) and block acknowledgement (GCR-BA).
+|ns3| supports both GCR-UR and GCR-BA operations as described in the following. Only one retransmission policy
+can be selected and it cannot be changed at run-time.
+
+GCR service activation
+----------------------
+
+For any HT-capable AP, the WifiMacHelper will install an GCR Manager by using the type
+and attribute values configured through the ``SetGcrManager`` method.
+
+GCR-UR service is used by an AP if the ``RetransmissionPolicy`` attribute of the GCR manager
+base class is set to ``GCR_UNSOLICITED_RETRY`` and if there is at least one HT-capable STA
+associated to the AP. Similarly, GCR-BA service is used by an AP if the ``RetransmissionPolicy``
+attribute of the GCR manager base class is set to ``GCR_BLOCK_ACK`` and if there is at least
+one HT-capable STA associated to the AP.
+
+The current implementation does not support hybrid scenarios made of GCR capable and non-GCR capable STAs.
+
+Groupcast transmissions using GCR-UR
+------------------------------------
+
+When a multicast data packet is ready for transmission, it is first transmitted similarly to the
+legacy No-Ack/No-retry. Afterwards, the GCR-UR service retransmits the packet multiple times.
+The number of retransmission per multicast data packet is controlled through the ``UnsolicitedRetryLimit``
+attribute of the GCR manager base class (default is 7), unless it gets dropped because of lifetime expiry.
+
+The GCR manager holds a counter that gets incremented at each transmission of a
+groupcast packet, which is used to determine if a groupcast packet shall be retransmitted.
+The frame exchange manager polls the GCR manager to know whether a given groupcast packet
+shall be kept for retransmission. As long as a packet needs to be retransmitted, the
+groupcast packet is not removed from the queue and the retry flag is set in the MAC header.
+
+When GCR-UR service is used, A-MPDU can be enabled for groupcast frames the same way as for unicast ones.
+In that case, the AP attempts to establish a Block Ack agreement prior to a groupcast transmission
+with each member STA of the group corresponding to that transmission. As long as the Block Ack agreement
+is not successfully established with all members of the group, MPDU aggregation cannot be used.
+
+the establishment of the Block Ack agreements is done by sending ADDBA Request frames containing
+a GCR Group Address element, which indicates to the receiving STAs the group address for which the
+agreements are being established.
+
+The AP retransmits the same A-MPDU multiple times and, once the last retransmission is done,
+it advances its scoreboad boundaries since it does not get any feedback from the receivers.
+
+Upon reception of an A-MPDU, GCR-capable STAs flush any previous pending MPDUs by assuming
+an implicit BAR has been received. This ensures the receiver window follows the transmit window.
+In order to prevent MPDUs to stay pending and never get forwarded up, an event is also scheduled
+to ensure the receiver window gets flushed once the maximum MSDU lifetime has elapsed. This event
+is canceled upon reception of a new A-MPDU belonging to the same Block Ack agreement.
+
+Groupcast transmissions using GCR-BA
+------------------------------------
+
+The use of GCR-BA for a given group address requires the establishment of a block ack agreement
+with all members of that group address as described in the previous section.
+
+When a TXOP is granted to the AP and at least one groupcast is ready for transmission,
+the AP sends one or more groupcast MPDUs and schedules transmissions of a Block Ack Request
+packets to each member of the group. The first request is sent a SIFS after transmission of
+the last MPDU, unless the remaining TXOP duration does not allow it. The Block Ack Request
+packets may be transmitted in following TXOPs. If a STA does not answer to a Block Ack Request,
+it gets retransmitted until the Block Ack response is received.
+
+Once Block Ack responses have been received from all members of the group, the AP determines the
+groupcast MPDUs that have been successfully received by all members of the group. These MPDUs
+are removed from the queues and the AP advances its transmit window accordingly. In a following TXOP,
+the AP retransmits the groupcast MPDUs that have not been successfully received by all members of the group,
+and eventually adds other queued groupcast MPDU to the same group, if the TXOP limit allows it.
+
+TXVECTOR for groupcast transmissions using GCR service
+------------------------------------------------------
+
+When GCR is used, the lowest MCS and modulation class that can be decoded by all STAs
+that are members of the group address is selected for the transmission. Furthermore,
+it selects the minimum channel width and number of spatial streams supported over all
+members of the group. Similarly, depending on the selected modulation class, a guard
+interval duration that is supported by all members of the group address is picked.
+The current implementation assumes all GCR-capable STAs are members of all groups.
+
+Protection for groupcast transmissions
+--------------------------------------
+
+Protection used for groupcast transmission can be controlled through the
+``GcrProtectionMode"`` attribute of the GCR manager base class. If RTS/CTS
+protection mode is selected and if the groupcast data frames have a size larger than
+the value of the ``WifiRemoteStationManager::RtsCtsThreshold`` attribute, a RTS frame
+is directed to one of the STA that is part of the group, prior to groupcast MPDUs
+transmitted using the GCR service. If CTS-to-self protection mode is selected, a CTS
+frame is transmitted prior to groupcast MPDUs.
+
+The protection manager is responsible for selecting the protection frames to send
+prior to data transmissions. It relies on ``WifiRemoteStationManager::NeedRts`` and
+``WifiRemoteStationManager::NeedCtsToSelf``, which check the configured protection mode
+in GCR manager when data transmissions involve groupcast MPDUs using the GCR service.
+
+When RTS/CTS is used for protection, the default implementation picks the STA with the
+lowest AID as individual address to set as recipient of the RTS frame.
+
+Concealment of GCR transmissions
+--------------------------------
+
+MSDUs transmitted via the GCR service are sent in an A-MSDU made of a single A-MSDU
+subframe, regardless of current A-MSDU size settings. The Address 1 field of the A-MSDU
+is set to the concealment address, which can be configured through the
+``GcrManager::GcrConcealmentAddress`` attribute.
+
 Modifying Wifi model
 ####################
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/doc/source/wifi-references.rst ns-3.44/src/wifi/doc/source/wifi-references.rst
--- ns-3.43/src/wifi/doc/source/wifi-references.rst	2024-10-09 16:41:10.112656800 -0700
+++ ns-3.44/src/wifi/doc/source/wifi-references.rst	2025-03-09 16:55:49.775372500 -0700
@@ -68,3 +68,5 @@
 .. [corbet2012] \ J. Corbet, "TCP Small Queues", `LWN.net, July 17, 2012 <https://lwn.net/Articles/507065/>`__
 
 .. [grazia2022] \ C. Grazia, N. Patriciello, T. Hoiland-Jorgensen, M. Klapez and M. Casoni, "Aggregating Without Bloating: Hard Times for TCP on Wi-Fi", IEEE/ACM Transactions on Networking, Vol. 30, No.5, October 2022.
+
+.. [kumar2025comsnets] \ P. Kumar, J. Kulshrestha, M. Maity and S. Roy, "Use of Channel Occupancy for Multi Link WiFi 7 Scheduler Design in ns-3" 2025 17th International Conference on COMmunication Systems & NETworkS (COMSNETS), Bengaluru, India, 2025, to appear.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/doc/source/wifi-testing.rst ns-3.44/src/wifi/doc/source/wifi-testing.rst
--- ns-3.43/src/wifi/doc/source/wifi-testing.rst	2024-10-09 16:41:10.112656800 -0700
+++ ns-3.44/src/wifi/doc/source/wifi-testing.rst	2025-03-09 16:55:49.775372500 -0700
@@ -300,3 +300,8 @@
 A preliminary evaluation of the usage of OFDMA in 802.11ax, in terms of latency in non-saturated
 conditions, throughput in saturated conditions and transmission range with UL OFDMA, is provided
 in [avallone2021wcm]_ .
+
+Channel Occupancy Helper Testing
+********************************
+
+The Channel Occupancy helper (WifiCoTraceHelper class) has been tested by comparing the occupancy results for single packet transmissions of various sizes (one, two, or three symbols) with the results predicted by offline calculation of the expected values.  Additionally, the helper has been validated in saturated traffic conditions as described in the research publication "Use of Channel Occupancy for Multi Link WiFi 7 Scheduler Design in ns-3" to be presented at COMSNETS 25 [kumar2025comsnets]_ .
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/doc/source/wifi-user.rst ns-3.44/src/wifi/doc/source/wifi-user.rst
--- ns-3.43/src/wifi/doc/source/wifi-user.rst	2024-10-09 16:41:10.112656800 -0700
+++ ns-3.44/src/wifi/doc/source/wifi-user.rst	2025-03-09 16:55:49.775372500 -0700
@@ -1100,6 +1100,216 @@
 the ``GetStatistics()`` methods, but when the raw PPDU records are retrieved, all PPDUs
 received are available and the user is responsible for further filtering as they see fit.
 
+WifiTxStatsHelper
+=================
+
+The ``WifiTxStatsHelper`` is complementary to the ``WifiPhyRxTraceHelper``.  Where the latter
+is used to collect statistics of Wi-Fi reception events at the physical layer, the former
+is used for collecting statistics on the transmit side at the MAC layer, including the
+number of transmissions and retransmissions of an MPDU, and the total number of successful,
+retransmitted, and failed MPDUs.  In addition, the helper tracks
+the duration of time that MPDUs are enqueued, including the durations that they reside
+within the MAC queue. For failed MPDUs, their timestamps of drop and reasons for being dropped
+are collected.
+
+The trace helper works by hooking MAC- and PHY-level traces on the applicable nodes, devices,
+and links (in multi-link operation), and maintaining per-MPDU records of every transmission.
+We explain the operation by way of first reviewing how a simulation is configured to
+use the helper, and then reviewing the public API.
+
+A sample usage of this trace helper is as follows, as can be explored by extending an
+existing Wi-fi example program.  First, declare an instance of the helper, as one might do
+with other Wi-Fi helpers, prior to calling ``Simulation::Run()``:
+
+.. sourcecode:: cpp
+
+  WifiTxStatsHelper txStatsHelper;
+
+You may need to include the trace helper's header if it is not otherwise included by the
+wifi module header:
+
+.. sourcecode:: cpp
+
+  #include "ns3/wifi-tx-stats-helper.h"
+
+Next, enable the trace helper on some subset of the Wi-Fi nodes in the simulation.  This step
+will hook traces on all of the nodes or devices enabled.  Two methods are provided, depending
+on whether a NodeContainer or NetDeviceContainer is enabled:
+
+.. sourcecode:: cpp
+
+  NodeContainer n;
+  txStatsHelper.Enable(n);
+
+or
+
+.. sourcecode:: cpp
+
+  NetDeviceContainer d;
+  txStatsHelper.Enable(d);
+
+By default, statistics will be collected for MPDUs enqueued between the start and stop times, which default to
+collecting statistics for the whole simulation.  To limit the duration, the following methods
+can be used, as an example:
+
+.. sourcecode:: cpp
+
+  txStatsHelper.Start(Seconds(1));
+  txStatsHelper.Stop(Seconds(10));
+
+Alternatively, the constructor is overloaded to allow these arguments to be passed there instead:
+
+.. sourcecode:: cpp
+
+  WifiTxStatsHelper txStatsHelper(Seconds(1), Seconds(10));
+
+Finally, a ``Reset()`` method is provided, to clear the success and failure records.  If
+this method is called, any in-progress MPDUs (i.e., those that have been queued but have
+neither been positively acked nor reached the maximum number of retries) are kept, but
+any completed records are deleted.
+
+The following main methods provide the output:
+
+.. sourcecode:: cpp
+
+   CountPerNodeDevice_t GetSuccessesByNodeDevice() const;
+   CountPerNodeDevice_t GetFailuresByNodeDevice() const;
+   CountPerNodeDevice_t GetRetransmissionsByNodeDevice() const;
+   uint64_t GetSuccesses() const;
+   uint64_t GetFailures() const;
+   uint64_t GetRetransmissions() const;
+   Time GetDuration() const;
+   const SuccessRecords& GetSuccessRecords(
+       WifiTxStatsHelper::MultiLinkSuccessType type = FIRST_LINK_IN_SET) const;
+   const FailureRecords& GetFailureRecords() const;
+
+For Multi-Link Operation (MLO) configurations, the records of successful MPDU transmissions
+are also available on a more granular, per-link basis:
+
+.. sourcecode:: cpp
+
+   const SuccessRecords& GetSuccessRecords(
+       WifiTxStatsHelper::MultiLinkSuccessType type = FIRST_LINK_IN_SET) const;
+
+MPDU transmission failures can also be filtered on the drop reason type with the following methods:
+
+.. sourcecode:: cpp
+
+   CountPerNodeDevice_t GetFailuresByNodeDevice(WifiMacDropReason reason) const;
+   uint64_t GetFailures(WifiMacDropReason reason) const;
+
+The first three methods return unordered maps with counts of successful MPDU transmissions,
+failed MPDU transmissions, and retransmitted MPDUs (for eventually successful MPDUs).
+
+1. ``GetSuccessesByNodeDevice()``: The returned data structure counts the number of
+   successful MPDU transmissions that were observed, indexed by a {node ID, device ID}
+   tuple.  If Multi-Link Operation is in use on the device, an acknowledged MPDU will be
+   counted as one success regardless of how many links it was transmitted on.
+
+   a. ``GetSuccessesByNodeDeviceLink()``: The returned data structure counts the number of
+      successful MPDU transmissions that were observed, indexed by {node ID, device ID, link ID}
+      tuple.  The link ID corresponds to the link for which the MPDU was successfully
+      acknowledged. If `type` is set to `FIRST_LINK_IN_SET` (default), then the success
+      is counted on the first link in the MPDU's in-flight link ID set. Otherwise, the success
+      is counted for all links in the MPDU's in-flight link ID set.
+
+2. ``GetFailuresByNodeDevice()``:  This returned data structure counts the number of failures
+   (maximum retries reached) that were observed, indexed by {node ID, device ID} tuple.
+   Per-link statistics are not available for failures (which may have experienced transmissions
+   on different links).
+
+   a. ``GetFailuresByNodeDevice(WifiMacDropReason reason)``: This overloaded method filters for
+      failure counts that match the provided drop reason.
+
+3. ``GetRetransmissionsByNodeDevice()``:  This returned data structure counts the number of
+   retransmissions that were observed, indexed by {node ID, device ID} tuple.  Per-link
+   statistics are not available for retransmissions.  Additionally, retransmissions of MPDUs
+   that were not ultimately successful are not counted.
+
+The second three methods provide aggregated counts across all nodes and devices enabled for
+the helper.  These counts should be the same as if the hashed maps of the first three methods
+were iterated, and the counts for each entry summed. The `GetFailures()` method has an
+overloaded version (`uint64_t GetFailures(WifiMacDropReason reason) const;`) to get the
+count of failed MPDU transmissions due to a given reason. If `type` is set to
+`FIRST_LINK_IN_SET` (default) for the `GetSuccessRecords` method, then the successful
+MPDU's record is saved in the `std::list<MpduRecord>` of the first link in the
+MPDU's in-flight link ID set. Otherwise, the record is saved in the lists of all links
+in the MPDU's in-flight link ID set.
+
+The ``GetDuration()`` method will return the duration since the helper was started or last reset.
+
+More detailed statistics can be obtained by the methods ``GetSuccessRecords()`` and
+``GetFailureRecords()``.  These methods export unordered maps of success and failure records,
+in the form of ``struct MpduRecord``, and organized by node, and device, and also by
+link-id in the case of success records (link-id is not available for failure records).
+Each ``MpduRecord`` tracks the time of enqueue, the time of first transmission, the ack time,
+and the dequeue time (a dequeue occurs when the MPDU is either positively acked or is discarded
+due to too many retransmissions).  The node ID, device ID, MPDU sequence number, and TID are
+recorded, and the number of retransmissions (if any) are counted.  Finally, for successful
+MPDUs, the ``m_successLinkId`` field tracks the link ID on which the MPDU was ultimately
+acknowledged.  To obtain a complete accounting of all MPDUs tracked by the helper, both
+``GetSuccessRecords()`` and ``GetFailureRecords()`` must be queried; all MPDU results
+will end up in one of the two data structures.
+
+The example program ``src/wifi/examples/wifi-bianchi.cc`` provides an example use of this
+helper, by setting the program option ``--useTxHelper`` to true.
+
+WifiCoTraceHelper
+=================
+
+The ``WifiCoTraceHelper`` (channel occupancy trace helper) can be used to collect statistics of Wi-Fi channel occupancy, as observed from the perspective of the WifiPhy state of devices or links (in the case of multi-link devices).  The ``WifiPhyStateHelper`` tracks the state of the WifiPhy corresponding to whether it is in idle, transmitting, receiving, or some other state.  This helper object can be added to ns-3 Wi-Fi simulations to track the duration and percentage of time spent in each state.
+
+Wi-Fi channel access relies also on additional busy states that conceptually reside in the MAC layer, corresponding to the Network Allocation Vector (NAV).  The idle states reported herein correspond to the PHY (physical) carrier sense state and not the MAC (virtual) carrier sense state.
+
+In case of an EMLSR device, PHY objects keep switching among links. This helper aggregates a PHY duration to the link it is operating on at that instant. Be aware that switching PHY objects for an EMLSR device might result in unexpected statistics. For example, if auxiliary PHY is configured to not switch in EMLSR configurations then a link could have no PHY object operating on it intermittently. As a result, the total recorded duration on all links would not be same which does not occur for non-EMLSR devices.
+
+This helper can be added to a simulation program with statements such as the following:
+
+.. sourcecode:: cpp
+
+    WifiCoTraceHelper coHelper{Seconds(1.0), Seconds(11.0)};
+
+The above statement, if placed just prior to the call to ``Simulator::Run(),``
+will declare a helper object and configure it to collect statistics between
+one and eleven seconds.  However, WifiNetDevices must still be added, such
+as the following sample code:
+
+.. sourcecode:: cpp
+
+    coHelper.Enable(nodeOrDeviceContainer);
+
+Then finally, print the results after ``Simulator::Run()`` returns:
+
+.. sourcecode:: cpp
+
+    coHelper.PrintStatistics(std::cout);
+
+This will print output such as:
+
+.. sourcecode:: text
+
+    ---- COT for AP:0 ----
+    Showing duration by states:
+    IDLE:       +5.69s  (56.93%)
+    CCA_BUSY:   +1.18s  (11.80%)
+    TX:       +301.90ms  (3.02%)
+    RX:         +2.83s  (28.25%)
+
+    ---- COT for STA0:0 ----
+    Showing duration by states:
+    IDLE:       +5.71s  (57.06%)
+    CCA_BUSY: +377.52ms  (3.78%)
+    TX:         +1.63s  (16.31%)
+    RX:         +2.29s  (22.85%)
+
+You can export statistics from this helper for use cases such as printing in your own formatted statements:
+
+.. sourcecode:: cpp
+
+    auto records = coHelper.GetDeviceRecords();
+
+You can refer an example program in ``src/wifi/examples/wifi-co-trace-example.cc`` on how to use these APIs.
+
 HT configuration
 ================
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/examples/CMakeLists.txt ns-3.44/src/wifi/examples/CMakeLists.txt
--- ns-3.43/src/wifi/examples/CMakeLists.txt	2024-10-09 16:41:10.112656800 -0700
+++ ns-3.44/src/wifi/examples/CMakeLists.txt	2025-03-09 16:55:49.775372500 -0700
@@ -66,3 +66,13 @@
     ${libinternet}
     ${libmobility}
 )
+
+build_lib_example(
+  NAME wifi-co-trace-example
+  SOURCE_FILES wifi-co-trace-example.cc
+  LIBRARIES_TO_LINK
+    ${libwifi}
+    ${libinternet}
+    ${libmobility}
+    ${libapplications}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/examples/wifi-bianchi.cc ns-3.44/src/wifi/examples/wifi-bianchi.cc
--- ns-3.43/src/wifi/examples/wifi-bianchi.cc	2024-10-09 16:41:10.112656800 -0700
+++ ns-3.44/src/wifi/examples/wifi-bianchi.cc	2025-03-09 16:55:49.775372500 -0700
@@ -39,9 +39,12 @@
 #include "ns3/wifi-mac-header.h"
 #include "ns3/wifi-mac.h"
 #include "ns3/wifi-net-device.h"
+#include "ns3/wifi-phy-rx-trace-helper.h"
+#include "ns3/wifi-tx-stats-helper.h"
 #include "ns3/yans-wifi-helper.h"
 
 #include <fstream>
+#include <iomanip>
 #include <vector>
 
 /// Avoid std::numbers::pi because it's C++20
@@ -104,6 +107,8 @@
 bool tracing = false;    ///< Flag to enable/disable generation of tracing files
 uint32_t pktSize = 1500; ///< packet size used for the simulation (in bytes)
 uint8_t maxMpdus = 0;    ///< The maximum number of MPDUs in A-MPDUs (0 to disable MPDU aggregation)
+bool useTxHelper = false; ///< Flag to get MPDU statistics with WifiTxStatsHelper
+bool useRxHelper = false; ///< Flag to get PPDU statistics with WifiPhyRxTraceHelper
 
 /// Table of the expected values for EIFS
 std::map<std::string /* mode */,
@@ -1896,8 +1901,8 @@
 /**
  * Parse context strings of the form "/NodeList/x/DeviceList/x/..." to extract the NodeId integer
  *
- * \param context The context to parse.
- * \return the NodeId
+ * @param context The context to parse.
+ * @return the NodeId
  */
 uint32_t
 ContextToNodeId(std::string context)
@@ -1910,8 +1915,8 @@
 /**
  * Parse context strings of the form "/NodeList/x/DeviceList/x/..." and fetch the Mac address
  *
- * \param context The context to parse.
- * \return the device MAC address
+ * @param context The context to parse.
+ * @return the device MAC address
  */
 Mac48Address
 ContextToMac(std::string context)
@@ -1935,11 +1940,11 @@
 // Functions for tracing.
 
 /**
- * Incremement the counter for a given address.
+ * Increment the counter for a given address.
  *
- * \param [out] counter The counter to increment.
- * \param addr The address to incremement the counter for.
- * \param increment The incremement (1 if omitted).
+ * @param [out] counter The counter to increment.
+ * @param addr The address to increment the counter for.
+ * @param increment The increment (1 if omitted).
  */
 void
 IncrementCounter(std::map<Mac48Address, uint64_t>& counter,
@@ -1960,13 +1965,13 @@
 /**
  * Trace a packet reception.
  *
- * \param context The context.
- * \param p The packet.
- * \param channelFreqMhz The channel frequqncy.
- * \param txVector The TX vector.
- * \param aMpdu The AMPDU.
- * \param signalNoise The signal and noise dBm.
- * \param staId The STA ID.
+ * @param context The context.
+ * @param p The packet.
+ * @param channelFreqMhz The channel frequqncy.
+ * @param txVector The TX vector.
+ * @param aMpdu The AMPDU.
+ * @param signalNoise The signal and noise dBm.
+ * @param staId The STA ID.
  */
 void
 TracePacketReception(std::string context,
@@ -2018,8 +2023,8 @@
 /**
  * Contention window trace.
  *
- * \param context The context.
- * \param cw The contention window.
+ * @param context The context.
+ * @param cw The contention window.
  */
 void
 CwTrace(std::string context, uint32_t cw, uint8_t /* linkId */)
@@ -2036,8 +2041,8 @@
 /**
  * Backoff trace.
  *
- * \param context The context.
- * \param newVal The backoff value.
+ * @param context The context.
+ * @param newVal The backoff value.
  */
 void
 BackoffTrace(std::string context, uint32_t newVal, uint8_t /* linkId */)
@@ -2054,9 +2059,9 @@
 /**
  * PHY Rx trace.
  *
- * \param context The context.
- * \param p The packet.
- * \param power The Rx power.
+ * @param context The context.
+ * @param p The packet.
+ * @param power The Rx power.
  */
 void
 PhyRxTrace(std::string context, Ptr<const Packet> p, RxPowerWattPerChannelBand power)
@@ -2068,9 +2073,9 @@
 /**
  * PHY Rx trace.
  *
- * \param context The context.
- * \param txVector The TX vector.
- * \param psduDuration The PDSU diration.
+ * @param context The context.
+ * @param txVector The TX vector.
+ * @param psduDuration The PDSU diration.
  */
 void
 PhyRxPayloadTrace(std::string context, WifiTxVector txVector, Time psduDuration)
@@ -2083,9 +2088,9 @@
 /**
  * PHY Drop trace.
  *
- * \param context The context.
- * \param p The packet.
- * \param reason The drop reason.
+ * @param context The context.
+ * @param p The packet.
+ * @param reason The drop reason.
  */
 void
 PhyRxDropTrace(std::string context, Ptr<const Packet> p, WifiPhyRxfailureReason reason)
@@ -2168,8 +2173,8 @@
 /**
  * PHY RX end trace
  *
- * \param context The context.
- * \param p The packet.
+ * @param context The context.
+ * @param p The packet.
  */
 void
 PhyRxDoneTrace(std::string context, Ptr<const Packet> p)
@@ -2181,11 +2186,11 @@
 /**
  * PHY successful RX trace
  *
- * \param context The context.
- * \param p The packet.
- * \param snr The SNR.
- * \param mode The WiFi mode.
- * \param preamble The preamble.
+ * @param context The context.
+ * @param p The packet.
+ * @param snr The SNR.
+ * @param mode The WiFi mode.
+ * @param preamble The preamble.
  */
 void
 PhyRxOkTrace(std::string context,
@@ -2220,9 +2225,9 @@
 /**
  * PHY RX error trace
  *
- * \param context The context.
- * \param p The packet.
- * \param snr The SNR.
+ * @param context The context.
+ * @param p The packet.
+ * @param snr The SNR.
  */
 void
 PhyRxErrorTrace(std::string context, Ptr<const Packet> p, double snr)
@@ -2239,9 +2244,9 @@
 /**
  * PHY TX trace
  *
- * \param context The context.
- * \param p The packet.
- * \param txPowerW The TX power.
+ * @param context The context.
+ * @param p The packet.
+ * @param txPowerW The TX power.
  */
 void
 PhyTxTrace(std::string context, Ptr<const Packet> p, double txPowerW)
@@ -2263,8 +2268,8 @@
 /**
  * PHY TX end trace.
  *
- * \param context The context.
- * \param p The packet.
+ * @param context The context.
+ * @param p The packet.
  */
 void
 PhyTxDoneTrace(std::string context, Ptr<const Packet> p)
@@ -2276,8 +2281,8 @@
 /**
  * MAC TX trace.
  *
- * \param context The context.
- * \param p The packet.
+ * @param context The context.
+ * @param p The packet.
  */
 void
 MacTxTrace(std::string context, Ptr<const Packet> p)
@@ -2292,8 +2297,8 @@
 /**
  * MAC RX trace.
  *
- * \param context The context.
- * \param p The packet.
+ * @param context The context.
+ * @param p The packet.
  */
 void
 MacRxTrace(std::string context, Ptr<const Packet> p)
@@ -2308,9 +2313,9 @@
 /**
  * Socket send trace.
  *
- * \param context The context.
- * \param p The packet.
- * \param addr destination address.
+ * @param context The context.
+ * @param p The packet.
+ * @param addr destination address.
  */
 void
 SocketSendTrace(std::string context, Ptr<const Packet> p, const Address& addr)
@@ -2325,8 +2330,8 @@
 /**
  * Association log trace.
  *
- * \param context The context.
- * \param address The MAC address.
+ * @param context The context.
+ * @param address The MAC address.
  */
 void
 AssociationLog(std::string context, Mac48Address address)
@@ -2347,8 +2352,8 @@
 /**
  * Deassociation log trace.
  *
- * \param context The context.
- * \param address The MAC address.
+ * @param context The context.
+ * @param address The MAC address.
  */
 void
 DisassociationLog(std::string context, Mac48Address address)
@@ -2389,21 +2394,21 @@
     /**
      * Configure and run the experiment.
      *
-     * \param wifi the pre-configured WifiHelper
-     * \param wifiPhy the pre-configured YansWifiPhyHelper
-     * \param wifiMac the pre-configured WifiMacHelper
-     * \param wifiChannel the pre-configured YansWifiChannelHelper
-     * \param trialNumber the trial index
-     * \param networkSize the number of stations
-     * \param duration the duration of each simulation run
-     * \param pcap flag to enable/disable PCAP files generation
-     * \param infra flag to enable infrastructure model, ring adhoc network if not set
-     * \param guardIntervalNs the guard interval in ns
-     * \param distance the distance
-     * \param apTxPower the AP transmit power
-     * \param staTxPower the STA transmit power
-     * \param pktInterval the packet interval
-     * \return 0 if all went well
+     * @param wifi the pre-configured WifiHelper
+     * @param wifiPhy the pre-configured YansWifiPhyHelper
+     * @param wifiMac the pre-configured WifiMacHelper
+     * @param wifiChannel the pre-configured YansWifiChannelHelper
+     * @param trialNumber the trial index
+     * @param networkSize the number of stations
+     * @param duration the duration of each simulation run
+     * @param pcap flag to enable/disable PCAP files generation
+     * @param infra flag to enable infrastructure model, ring adhoc network if not set
+     * @param guardIntervalNs the guard interval in ns
+     * @param distance the distance
+     * @param apTxPower the AP transmit power
+     * @param staTxPower the STA transmit power
+     * @param pktInterval the packet interval
+     * @return 0 if all went well
      */
     int Run(const WifiHelper& wifi,
             const YansWifiPhyHelper& wifiPhy,
@@ -2632,6 +2637,24 @@
     Config::Connect("/NodeList/*/$ns3::Node/ApplicationList/*/$ns3::PacketSocketClient/Tx",
                     MakeCallback(&SocketSendTrace));
 
+    WifiTxStatsHelper wifiTxStats;
+    if (useTxHelper)
+    {
+        // Setup Wi-Fi Transmission Statistics Helper (WifiTxStatsHelper) for all devices
+        wifiTxStats.Enable(devices);
+        wifiTxStats.Start(Seconds(10));
+        wifiTxStats.Stop(Seconds(10) + duration);
+    }
+
+    WifiPhyRxTraceHelper rxTraceHelper;
+    if (useRxHelper)
+    {
+        // Setup Wi-Fi PHY Reception Trace Helper (WifiPhyRxTraceHelper) for all devices
+        rxTraceHelper.Enable(devices);
+        rxTraceHelper.Start(Seconds(10));
+        rxTraceHelper.Stop(Seconds(10) + duration);
+    }
+
     Simulator::Schedule(Seconds(10), &RestartCalc);
     Simulator::Stop(Seconds(10) + duration);
 
@@ -2643,6 +2666,151 @@
     Simulator::Run();
     Simulator::Destroy();
 
+    if (useTxHelper)
+    {
+        // Get results from WifiTxStatsHelper
+        const auto numSuccessPerNodeDevice = wifiTxStats.GetSuccessesByNodeDevice();
+        const auto numFailurePerNodeDevice = wifiTxStats.GetFailuresByNodeDevice();
+        const auto numFailureDueToFailedEnqueuePerNodeDevice =
+            wifiTxStats.GetFailuresByNodeDevice(WIFI_MAC_DROP_FAILED_ENQUEUE);
+        const auto numFailureDueToExpiredLifetimePerNodeDevice =
+            wifiTxStats.GetFailuresByNodeDevice(WIFI_MAC_DROP_EXPIRED_LIFETIME);
+        const auto numFailureDueToRetryLimitReachedPerNodeDevice =
+            wifiTxStats.GetFailuresByNodeDevice(WIFI_MAC_DROP_REACHED_RETRY_LIMIT);
+        const auto numFailureDueToQosOldPacketPerNodeDevice =
+            wifiTxStats.GetFailuresByNodeDevice(WIFI_MAC_DROP_QOS_OLD_PACKET);
+        const auto numRetransPerNodeDevice = wifiTxStats.GetRetransmissionsByNodeDevice();
+        std::cout << "WifiTxStatsHelper: node to number of MPDUs acked during (10, "
+                  << 10 + duration.ToInteger(Time::S) << "] s:" << std::endl;
+        if (numSuccessPerNodeDevice.empty())
+        {
+            std::cout << "none\n";
+        }
+        else
+        {
+            std::cout << std::setw(5) << "node" << std::setw(10) << "nSuccess" << std::endl;
+            for (const auto& [nodeDevTuple, nSuccess] : numSuccessPerNodeDevice)
+            {
+                std::cout << std::setw(5) << std::get<0>(nodeDevTuple) << std::setw(10) << nSuccess
+                          << std::endl;
+            }
+        }
+        std::cout
+            << "WifiTxStatsHelper: node to number of MPDUs failed (due to any reason) during (10, "
+            << 10 + duration.ToInteger(Time::S) << "] s:" << std::endl;
+        if (numFailurePerNodeDevice.empty())
+        {
+            std::cout << "none\n";
+        }
+        else
+        {
+            std::cout << std::setw(5) << "node" << std::setw(10) << "nFailed" << std::endl;
+            for (const auto& [nodeDevTuple, nFailure] : numFailurePerNodeDevice)
+            {
+                std::cout << std::setw(5) << std::get<0>(nodeDevTuple) << std::setw(10) << nFailure
+                          << std::endl;
+            }
+            std::cout << "WifiTxStatsHelper: node to number of MPDUs failed (due to "
+                         "WIFI_MAC_DROP_FAILED_ENQUEUE) during (10, "
+                      << 10 + duration.ToInteger(Time::S) << "] s:" << std::endl;
+            if (numFailureDueToFailedEnqueuePerNodeDevice.empty())
+            {
+                std::cout << "none\n";
+            }
+            else
+            {
+                std::cout << std::setw(5) << "node" << std::setw(10) << "nFailed" << std::endl;
+                for (const auto& [nodeDevTuple, nFailure] :
+                     numFailureDueToFailedEnqueuePerNodeDevice)
+                {
+                    std::cout << std::setw(5) << std::get<0>(nodeDevTuple) << std::setw(10)
+                              << nFailure << std::endl;
+                }
+            }
+            std::cout << "WifiTxStatsHelper: node to number of MPDUs failed (due to "
+                         "WIFI_MAC_DROP_EXPIRED_LIFETIME) during (10, "
+                      << 10 + duration.ToInteger(Time::S) << "] s:" << std::endl;
+            if (numFailureDueToExpiredLifetimePerNodeDevice.empty())
+            {
+                std::cout << "none\n";
+            }
+            else
+            {
+                std::cout << std::setw(5) << "node" << std::setw(10) << "nFailed" << std::endl;
+                for (const auto& [nodeDevTuple, nFailure] :
+                     numFailureDueToExpiredLifetimePerNodeDevice)
+                {
+                    std::cout << std::setw(5) << std::get<0>(nodeDevTuple) << std::setw(10)
+                              << nFailure << std::endl;
+                }
+            }
+            std::cout << "WifiTxStatsHelper: node to number of MPDUs failed (due to "
+                         "WIFI_MAC_DROP_REACHED_RETRY_LIMIT) during (10, "
+                      << 10 + duration.ToInteger(Time::S) << "] s:" << std::endl;
+            if (numFailureDueToRetryLimitReachedPerNodeDevice.empty())
+            {
+                std::cout << "none\n";
+            }
+            else
+            {
+                std::cout << std::setw(5) << "node" << std::setw(10) << "nFailed" << std::endl;
+                for (const auto& [nodeDevTuple, nFailure] :
+                     numFailureDueToRetryLimitReachedPerNodeDevice)
+                {
+                    std::cout << std::setw(5) << std::get<0>(nodeDevTuple) << std::setw(10)
+                              << nFailure << std::endl;
+                }
+            }
+            std::cout << "WifiTxStatsHelper: node to number of MPDUs failed (due to "
+                         "WIFI_MAC_DROP_QOS_OLD_PACKET) during (10, "
+                      << 10 + duration.ToInteger(Time::S) << "] s:" << std::endl;
+            if (numFailureDueToQosOldPacketPerNodeDevice.empty())
+            {
+                std::cout << "none\n";
+            }
+            else
+            {
+                std::cout << std::setw(5) << "node" << std::setw(10) << "nFailed" << std::endl;
+                for (const auto& [nodeDevTuple, nFailure] :
+                     numFailureDueToQosOldPacketPerNodeDevice)
+                {
+                    std::cout << std::setw(5) << std::get<0>(nodeDevTuple) << std::setw(10)
+                              << nFailure << std::endl;
+                }
+            }
+        }
+        std::cout << "WifiTxStatsHelper: node to number of retransmissions of MPDUs "
+                     "Acked during (10, "
+                  << 10 + duration.ToInteger(Time::S) << "] s:" << std::endl;
+        if (numRetransPerNodeDevice.empty())
+        {
+            std::cout << "none\n";
+        }
+        else
+        {
+            std::cout << std::setw(5) << "node" << std::setw(10) << "nRetrans" << std::endl;
+            for (const auto& [nodeDevTuple, nRetrans] : numRetransPerNodeDevice)
+            {
+                std::cout << std::setw(5) << std::get<0>(nodeDevTuple) << std::setw(10) << nRetrans
+                          << std::endl;
+            }
+        }
+    }
+
+    if (useRxHelper)
+    {
+        // Get results from WifiPhyRxTraceHelper
+        std::cout << "\nWifiPhyRxTraceHelper: overall statistics" << std::endl;
+        rxTraceHelper.PrintStatistics();
+        for (uint32_t nodeIndex = 0; nodeIndex < nNodes; ++nodeIndex)
+        {
+            std::cout << "\nWifiPhyRxTraceHelper: per-node statistics for node " << nodeIndex
+                      << std::endl;
+            rxTraceHelper.PrintStatistics(nodeIndex);
+        }
+        std::cout << std::endl;
+    }
+
     if (tracing)
     {
         cwTraceFile.flush();
@@ -2659,9 +2827,9 @@
 /**
  * Get the Counter associated with a MAC address.
  *
- * \param counter The map of counters to inspect.
- * \param addr The MAC address.
- * \return the value of the counter,
+ * @param counter The map of counters to inspect.
+ * @param addr The MAC address.
+ * @return the value of the counter,
  */
 uint64_t
 GetCount(const std::map<Mac48Address, uint64_t>& counter, Mac48Address addr)
@@ -2706,18 +2874,15 @@
         1000; ///< The socket packet interval in microseconds (a higher value is needed to reach
               ///< saturation conditions as the channel bandwidth or the MCS increases)
     meter_u distance = 0.001; ///< The distance in meters between the AP and the STAs
-    dBm_u apTxPower = 16;     ///< The transmit power of the AP (if infrastructure only)
-    dBm_u staTxPower = 16;    ///< The transmit power of each STA (or all STAs if adhoc)
+    dBm_u apTxPower{16};      ///< The transmit power of the AP (if infrastructure only)
+    dBm_u staTxPower{16};     ///< The transmit power of each STA (or all STAs if adhoc)
 
     // Disable fragmentation and RTS/CTS
     Config::SetDefault("ns3::WifiRemoteStationManager::FragmentationThreshold",
                        StringValue("22000"));
     Config::SetDefault("ns3::WifiRemoteStationManager::RtsCtsThreshold", StringValue("22000"));
-    // Disable short retransmission failure (make retransmissions persistent)
-    Config::SetDefault("ns3::WifiRemoteStationManager::MaxSlrc",
-                       UintegerValue(std::numeric_limits<uint32_t>::max()));
-    Config::SetDefault("ns3::WifiRemoteStationManager::MaxSsrc",
-                       UintegerValue(std::numeric_limits<uint32_t>::max()));
+    // Make CW stay equal to CWmax until a packet is acknowledged
+    Config::SetDefault("ns3::WifiMac::FrameRetryLimit", UintegerValue(65535));
     // Set maximum queue size to the largest value and set maximum queue delay to be larger than the
     // simulation time
     Config::SetDefault(
@@ -2730,6 +2895,8 @@
                  "Logging level (0: no log - 1: simulation script logs - 2: all logs)",
                  verbose);
     cmd.AddValue("tracing", "Generate trace files", tracing);
+    cmd.AddValue("useTxHelper", "Enable WifiTxStatsHelper on all devices", useTxHelper);
+    cmd.AddValue("useRxHelper", "Enable WifiPhyRxTraceHelper on all devices", useRxHelper);
     cmd.AddValue("pktSize", "The packet size in bytes", pktSize);
     cmd.AddValue("trials", "The maximal number of runs per network size", trials);
     cmd.AddValue("duration", "Time duration for each trial in seconds", duration);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/examples/wifi-co-trace-example.cc ns-3.44/src/wifi/examples/wifi-co-trace-example.cc
--- ns-3.43/src/wifi/examples/wifi-co-trace-example.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/wifi/examples/wifi-co-trace-example.cc	2025-03-09 16:55:49.775372500 -0700
@@ -0,0 +1,221 @@
+/*
+ * Copyright (c) 2024 University of Washington (updated to 802.11ax standard)
+ * Copyright (c) 2009 The Boeing Company
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ */
+
+// The purpose of this example is to illustrate basic use of the
+// WifiCoTraceHelper on a simple example program.
+//
+// This script configures four 802.11ax Wi-Fi STAs on a YansWifiChannel,
+// with devices in infrastructure mode, and each STA sends a saturating load
+// of UDP datagrams to the AP for a specified simulation duration. A simple
+// free-space path loss (Friis) propagation loss model is configured.
+// The lowest MCS ("HeMcs0") value is configured.
+//
+// At the end of the simulation, a channel occupancy report is printed for
+// each STA and for the AP.  There are two program options:
+// -- duration:
+// -- useDifferentAc:  (true or false)
+//
+// If 'useDifferentAc' has the value false, all STAs will have the same EDCA parameters
+// for best effort) and their channel utilization (the TX time output of the
+// channel access helper) will be close to equal.  If 'useDifferentAc' is true,
+// then two of the four STAs will instead be configured to use the voice
+// access category, and channel utilization will be different due to the
+// different EDCA parameters.
+
+#include "ns3/boolean.h"
+#include "ns3/command-line.h"
+#include "ns3/config.h"
+#include "ns3/double.h"
+#include "ns3/internet-stack-helper.h"
+#include "ns3/ipv4-address-helper.h"
+#include "ns3/log.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/mobility-model.h"
+#include "ns3/names.h"
+#include "ns3/neighbor-cache-helper.h"
+#include "ns3/on-off-helper.h"
+#include "ns3/packet-sink-helper.h"
+#include "ns3/ssid.h"
+#include "ns3/string.h"
+#include "ns3/uinteger.h"
+#include "ns3/wifi-co-trace-helper.h"
+#include "ns3/wifi-phy-rx-trace-helper.h"
+#include "ns3/yans-wifi-channel.h"
+#include "ns3/yans-wifi-helper.h"
+
+using namespace ns3;
+
+NS_LOG_COMPONENT_DEFINE("WifiCoTraceExample");
+
+// Function for runtime manual ARP configuration
+void
+PopulateNeighborCache()
+{
+    NeighborCacheHelper neighborCache;
+    neighborCache.PopulateNeighborCache();
+}
+
+int
+main(int argc, char* argv[])
+{
+    bool useDifferentAc = false;
+    Time duration{Seconds(10)};
+    double distance = 1; // meters
+
+    CommandLine cmd(__FILE__);
+    cmd.AddValue("useDifferentAc",
+                 "Uses VO AC on 2 STAs and BE on rest if true. Uses BE AC on all 4 STAs if false.",
+                 useDifferentAc);
+    cmd.AddValue("duration", "Duration of data transfer", duration);
+    cmd.Parse(argc, argv);
+
+    NodeContainer apNode(1);
+    Names::Add("AP", apNode.Get(0));
+    NodeContainer staNodes(4);
+    Names::Add("STA0", staNodes.Get(0));
+    Names::Add("STA1", staNodes.Get(1));
+    Names::Add("STA2", staNodes.Get(2));
+    Names::Add("STA3", staNodes.Get(3));
+
+    MobilityHelper mobility;
+    Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator>();
+    positionAlloc->Add(Vector(0.0, 0.0, 0.0));
+    mobility.SetPositionAllocator(positionAlloc);
+    mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
+    mobility.Install(apNode);
+    positionAlloc = CreateObject<ListPositionAllocator>();
+    positionAlloc->Add(Vector(distance, 0.0, 0.0));
+    positionAlloc->Add(Vector(0.0, distance, 0.0));
+    positionAlloc->Add(Vector(0.0, -distance, 0.0));
+    positionAlloc->Add(Vector(-distance, 0.0, 0.0));
+    mobility.Install(staNodes);
+
+    WifiHelper wifi;
+    wifi.SetStandard(WIFI_STANDARD_80211ax);
+
+    YansWifiPhyHelper wifiPhy;
+    YansWifiChannelHelper wifiChannel;
+    wifiChannel.SetPropagationDelay("ns3::ConstantSpeedPropagationDelayModel");
+    wifiChannel.AddPropagationLoss("ns3::FriisPropagationLossModel");
+    wifiPhy.SetChannel(wifiChannel.Create());
+
+    // Add a mac and disable rate control
+    WifiMacHelper wifiMac;
+    wifi.SetRemoteStationManager("ns3::ConstantRateWifiManager",
+                                 "DataMode",
+                                 StringValue("HeMcs0"),
+                                 "ControlMode",
+                                 StringValue("HeMcs0"));
+
+    // Setup the rest of the MAC
+    Ssid ssid = Ssid("wifi-default");
+    // setup AP to beacon roughly once per second (must be a multiple of 1024 us)
+    wifiMac.SetType("ns3::ApWifiMac",
+                    "Ssid",
+                    SsidValue(ssid),
+                    "QosSupported",
+                    BooleanValue(true),
+                    "BeaconInterval",
+                    TimeValue(MilliSeconds(1024)));
+    NetDeviceContainer apDevice = wifi.Install(wifiPhy, wifiMac, apNode);
+
+    // setup STA and disable the possible loss of association due to missed beacons
+    wifiMac.SetType("ns3::StaWifiMac",
+                    "Ssid",
+                    SsidValue(ssid),
+                    "QosSupported",
+                    BooleanValue(true),
+                    "MaxMissedBeacons",
+                    UintegerValue(std::numeric_limits<uint32_t>::max()));
+    NetDeviceContainer staDevices = wifi.Install(wifiPhy, wifiMac, staNodes);
+
+    NetDeviceContainer allDevices;
+    allDevices.Add(apDevice);
+    allDevices.Add(staDevices);
+
+    InternetStackHelper internet;
+    internet.Install(apNode);
+    internet.Install(staNodes);
+
+    Ipv4AddressHelper ipv4;
+    ipv4.SetBase("10.1.1.0", "255.255.255.0");
+    Ipv4InterfaceContainer i = ipv4.Assign(allDevices);
+
+    uint16_t portNumber = 9;
+    std::vector<uint8_t> tosValues = {0x70, 0x28, 0xb8, 0xc0}; // AC_BE, AC_BK, AC_VI, AC_VO
+    auto ipv4ap = apNode.Get(0)->GetObject<Ipv4>();
+    const auto address = ipv4ap->GetAddress(1, 0).GetLocal();
+
+    ApplicationContainer sourceApplications;
+    ApplicationContainer sinkApplications;
+    for (uint32_t i = 0; i < 4; i++)
+    {
+        InetSocketAddress sinkAddress(address, portNumber + i);
+        PacketSinkHelper packetSinkHelper("ns3::UdpSocketFactory", sinkAddress);
+        sinkApplications.Add(packetSinkHelper.Install(apNode.Get(0)));
+        OnOffHelper onOffHelper("ns3::UdpSocketFactory", sinkAddress);
+        onOffHelper.SetAttribute("OnTime", StringValue("ns3::ConstantRandomVariable[Constant=1]"));
+        onOffHelper.SetAttribute("OffTime", StringValue("ns3::ConstantRandomVariable[Constant=0]"));
+        onOffHelper.SetAttribute("DataRate", DataRateValue(2000000)); // bits/sec
+        onOffHelper.SetAttribute("PacketSize", UintegerValue(1472));  // bytes
+        if (!useDifferentAc)
+        {
+            onOffHelper.SetAttribute("Tos", UintegerValue(tosValues[0])); // AC_BE
+        }
+        else
+        {
+            onOffHelper.SetAttribute("Tos",
+                                     UintegerValue(tosValues[3 * (i % 2)])); // AC_BE and AC_VO
+        }
+        sourceApplications.Add(onOffHelper.Install(staNodes.Get(i)));
+    }
+
+    sinkApplications.Start(Seconds(0.0));
+    sinkApplications.Stop(Seconds(1.0) + duration + MilliSeconds(20));
+    sourceApplications.Start(Seconds(1.0));
+    sourceApplications.Stop(Seconds(1.0) + duration);
+
+    // Use the NeighborCacheHelper to avoid ARP messages (ARP replies, since they are unicast,
+    // count in the statistics.  The cache operation must be scheduled after WifiNetDevices are
+    // started, until issue #851 is fixed.  The indirection through a normal function is
+    // necessary because NeighborCacheHelper::PopulateNeighborCache() is overloaded
+    Simulator::Schedule(Seconds(0.99), &PopulateNeighborCache);
+
+    WifiCoTraceHelper wifiCoTraceHelper(Seconds(1), Seconds(1) + duration);
+    wifiCoTraceHelper.Enable(allDevices);
+
+    Simulator::Stop(duration + Seconds(2));
+    Simulator::Run();
+
+    // The following provide some examples of how to access and print the trace helper contents.
+    std::cout << "*** Print statistics for all nodes using built-in print method:" << std::endl;
+    wifiCoTraceHelper.PrintStatistics(std::cout);
+
+    std::cout << "*** Print the statistics in your own way.  Here, just sum the STAs total TX time:"
+              << std::endl
+              << std::endl;
+
+    auto records = wifiCoTraceHelper.GetDeviceRecords();
+    Time sumStaTxTime;
+    for (const auto& it : records)
+    {
+        if (it.m_nodeId > 0)
+        {
+            const auto it2 = it.m_linkStateDurations.at(0).find(WifiPhyState::TX);
+            if (it2 != it.m_linkStateDurations.at(0).end())
+            {
+                sumStaTxTime += it2->second;
+            }
+        }
+    }
+
+    std::cout << "Sum of STA time in TX state is " << sumStaTxTime.As(Time::S) << std::endl;
+
+    Simulator::Destroy();
+
+    return 0;
+}
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/examples/wifi-manager-example.cc ns-3.44/src/wifi/examples/wifi-manager-example.cc
--- ns-3.43/src/wifi/examples/wifi-manager-example.cc	2024-10-09 16:41:10.112656800 -0700
+++ ns-3.44/src/wifi/examples/wifi-manager-example.cc	2025-03-09 16:55:49.775372500 -0700
@@ -69,8 +69,8 @@
 /**
  * Packet received.
  *
- * \param pkt The packet.
- * \param addr The sender address.
+ * @param pkt The packet.
+ * @param addr The sender address.
  */
 void
 PacketRx(Ptr<const Packet> pkt, const Address& addr)
@@ -81,8 +81,8 @@
 /**
  * Rate changed.
  *
- * \param oldVal Old value.
- * \param newVal New value.
+ * @param oldVal Old value.
+ * @param newVal New value.
  */
 void
 RateChange(uint64_t oldVal, uint64_t newVal)
@@ -109,15 +109,15 @@
     /**
      * Constructor
      *
-     * \param name reference name
-     * \param standard wifi standard
-     * \param band PHY band
-     * \param width channel width
-     * \param snrLow SNR low
-     * \param snrHigh SNR high
-     * \param xMin x minimum
-     * \param xMax x maximum
-     * \param yMax y maximum
+     * @param name reference name
+     * @param standard wifi standard
+     * @param band PHY band
+     * @param width channel width
+     * @param snrLow SNR low
+     * @param snrHigh SNR high
+     * @param xMin x minimum
+     * @param xMax x maximum
+     * @param yMax y maximum
      */
     StandardInfo(std::string name,
                  WifiStandard standard,
@@ -154,12 +154,12 @@
 /**
  * Change the signal model and report the rate.
  *
- * \param rssModel The new RSS model.
- * \param step The step to use.
- * \param rss The RSS.
- * \param noise The noise.
- * \param rateDataset The rate dataset.
- * \param actualDataset The actual dataset.
+ * @param rssModel The new RSS model.
+ * @param step The step to use.
+ * @param rss The RSS.
+ * @param noise The noise.
+ * @param rateDataset The rate dataset.
+ * @param actualDataset The actual dataset.
  */
 void
 ChangeSignalAndReportRate(Ptr<FixedRssLossModel> rssModel,
@@ -170,7 +170,7 @@
                           Gnuplot2dDataset& actualDataset)
 {
     NS_LOG_FUNCTION(rssModel << step.stepSize << step.stepTime << rss);
-    dB_u snr = rss - noise;
+    dB_u snr{rss - noise};
     rateDataset.Add(snr, g_intervalRate / 1e6);
     // Calculate received rate since last interval
     double currentRate = ((g_intervalBytes * 8) / step.stepTime) / 1e6; // Mb/s
@@ -198,7 +198,7 @@
     uint32_t steps;
     uint32_t rtsThreshold = 999999; // disabled even for large A-MPDU
     uint32_t maxAmpduSize = 65535;
-    dBm_u stepSize = 1;
+    dBm_u stepSize{1};
     double stepTime = 1;        // seconds
     uint32_t packetSize = 1024; // bytes
     bool broadcast = false;
@@ -210,26 +210,22 @@
     uint16_t clientNss = 1;
     uint16_t serverShortGuardInterval = 800;
     uint16_t clientShortGuardInterval = 800;
-    uint16_t serverChannelWidth = 0; // use default for standard and band
-    uint16_t clientChannelWidth = 0; // use default for standard and band
+    MHz_u serverChannelWidth{0}; // use default for standard and band
+    MHz_u clientChannelWidth{0}; // use default for standard and band
     std::string wifiManager("Ideal");
     std::string standard("802.11a");
     StandardInfo serverSelectedStandard;
     StandardInfo clientSelectedStandard;
     bool infrastructure = false;
-    uint32_t maxSlrc = 7;
-    uint32_t maxSsrc = 7;
+    uint32_t maxRetryCount = 7;
 
     RngSeedManager::SetSeed(1);
     RngSeedManager::SetRun(2);
 
     CommandLine cmd(__FILE__);
-    cmd.AddValue("maxSsrc",
-                 "The maximum number of retransmission attempts for a RTS packet",
-                 maxSsrc);
-    cmd.AddValue("maxSlrc",
+    cmd.AddValue("maxRetryCount",
                  "The maximum number of retransmission attempts for a Data packet",
-                 maxSlrc);
+                 maxRetryCount);
     cmd.AddValue("rtsThreshold", "RTS threshold", rtsThreshold);
     cmd.AddValue("maxAmpduSize", "Max A-MPDU size", maxAmpduSize);
     cmd.AddValue("stepSize", "Power between steps (dBm)", stepSize);
@@ -278,35 +274,35 @@
 
     if (standard == "802.11b")
     {
-        if (serverChannelWidth == 0)
+        if (serverChannelWidth == MHz_u{0})
         {
             serverChannelWidth = GetDefaultChannelWidth(WIFI_STANDARD_80211b, WIFI_PHY_BAND_2_4GHZ);
         }
-        NS_ABORT_MSG_IF(serverChannelWidth != 22,
+        NS_ABORT_MSG_IF(serverChannelWidth != MHz_u{22},
                         "Invalid channel width for standard " << standard);
         NS_ABORT_MSG_IF(serverNss != 1, "Invalid nss for standard " << standard);
-        if (clientChannelWidth == 0)
+        if (clientChannelWidth == MHz_u{0})
         {
             clientChannelWidth = GetDefaultChannelWidth(WIFI_STANDARD_80211b, WIFI_PHY_BAND_2_4GHZ);
         }
-        NS_ABORT_MSG_IF(clientChannelWidth != 22,
+        NS_ABORT_MSG_IF(clientChannelWidth != MHz_u{22},
                         "Invalid channel width for standard " << standard);
         NS_ABORT_MSG_IF(clientNss != 1, "Invalid nss for standard " << standard);
     }
     else if (standard == "802.11a" || standard == "802.11g")
     {
-        if (serverChannelWidth == 0)
+        if (serverChannelWidth == MHz_u{0})
         {
             serverChannelWidth = GetDefaultChannelWidth(WIFI_STANDARD_80211g, WIFI_PHY_BAND_2_4GHZ);
         }
-        NS_ABORT_MSG_IF(serverChannelWidth != 20,
+        NS_ABORT_MSG_IF(serverChannelWidth != MHz_u{20},
                         "Invalid channel width for standard " << standard);
         NS_ABORT_MSG_IF(serverNss != 1, "Invalid nss for standard " << standard);
-        if (clientChannelWidth == 0)
+        if (clientChannelWidth == MHz_u{0})
         {
             clientChannelWidth = GetDefaultChannelWidth(WIFI_STANDARD_80211g, WIFI_PHY_BAND_2_4GHZ);
         }
-        NS_ABORT_MSG_IF(clientChannelWidth != 20,
+        NS_ABORT_MSG_IF(clientChannelWidth != MHz_u{20},
                         "Invalid channel width for standard " << standard);
         NS_ABORT_MSG_IF(clientNss != 1, "Invalid nss for standard " << standard);
     }
@@ -314,40 +310,40 @@
     {
         WifiPhyBand band =
             (standard == "802.11n-2.4GHz" ? WIFI_PHY_BAND_2_4GHZ : WIFI_PHY_BAND_5GHZ);
-        if (serverChannelWidth == 0)
+        if (serverChannelWidth == MHz_u{0})
         {
             serverChannelWidth = GetDefaultChannelWidth(WIFI_STANDARD_80211n, band);
         }
-        NS_ABORT_MSG_IF(serverChannelWidth != 20 && serverChannelWidth != 40,
+        NS_ABORT_MSG_IF(serverChannelWidth != MHz_u{20} && serverChannelWidth != MHz_u{40},
                         "Invalid channel width for standard " << standard);
         NS_ABORT_MSG_IF(serverNss == 0 || serverNss > 4,
                         "Invalid nss " << serverNss << " for standard " << standard);
-        if (clientChannelWidth == 0)
+        if (clientChannelWidth == MHz_u{0})
         {
             clientChannelWidth = GetDefaultChannelWidth(WIFI_STANDARD_80211n, band);
         }
-        NS_ABORT_MSG_IF(clientChannelWidth != 20 && clientChannelWidth != 40,
+        NS_ABORT_MSG_IF(clientChannelWidth != MHz_u{20} && clientChannelWidth != MHz_u{40},
                         "Invalid channel width for standard " << standard);
         NS_ABORT_MSG_IF(clientNss == 0 || clientNss > 4,
                         "Invalid nss " << clientNss << " for standard " << standard);
     }
     else if (standard == "802.11ac")
     {
-        if (serverChannelWidth == 0)
+        if (serverChannelWidth == MHz_u{0})
         {
             serverChannelWidth = GetDefaultChannelWidth(WIFI_STANDARD_80211ac, WIFI_PHY_BAND_5GHZ);
         }
-        NS_ABORT_MSG_IF(serverChannelWidth != 20 && serverChannelWidth != 40 &&
-                            serverChannelWidth != 80 && serverChannelWidth != 160,
+        NS_ABORT_MSG_IF(serverChannelWidth != MHz_u{20} && serverChannelWidth != MHz_u{40} &&
+                            serverChannelWidth != MHz_u{80} && serverChannelWidth != MHz_u{160},
                         "Invalid channel width for standard " << standard);
         NS_ABORT_MSG_IF(serverNss == 0 || serverNss > 4,
                         "Invalid nss " << serverNss << " for standard " << standard);
-        if (clientChannelWidth == 0)
+        if (clientChannelWidth == MHz_u{0})
         {
             clientChannelWidth = GetDefaultChannelWidth(WIFI_STANDARD_80211ac, WIFI_PHY_BAND_5GHZ);
         }
-        NS_ABORT_MSG_IF(clientChannelWidth != 20 && clientChannelWidth != 40 &&
-                            clientChannelWidth != 80 && clientChannelWidth != 160,
+        NS_ABORT_MSG_IF(clientChannelWidth != MHz_u{20} && clientChannelWidth != MHz_u{40} &&
+                            clientChannelWidth != MHz_u{80} && clientChannelWidth != MHz_u{160},
                         "Invalid channel width for standard " << standard);
         NS_ABORT_MSG_IF(clientNss == 0 || clientNss > 4,
                         "Invalid nss " << clientNss << " for standard " << standard);
@@ -358,43 +354,67 @@
         WifiPhyBand band = (standard == "802.11ax-2.4GHz" ? WIFI_PHY_BAND_2_4GHZ
                             : standard == "802.11ax-6GHz" ? WIFI_PHY_BAND_6GHZ
                                                           : WIFI_PHY_BAND_5GHZ);
-        if (serverChannelWidth == 0)
+        if (serverChannelWidth == MHz_u{0})
         {
             serverChannelWidth = GetDefaultChannelWidth(WIFI_STANDARD_80211ax, band);
         }
-        NS_ABORT_MSG_IF(serverChannelWidth != 20 && serverChannelWidth != 40 &&
-                            serverChannelWidth != 80 && serverChannelWidth != 160,
+        NS_ABORT_MSG_IF(serverChannelWidth != MHz_u{20} && serverChannelWidth != MHz_u{40} &&
+                            serverChannelWidth != MHz_u{80} && serverChannelWidth != MHz_u{160},
                         "Invalid channel width for standard " << standard);
         NS_ABORT_MSG_IF(serverNss == 0 || serverNss > 4,
                         "Invalid nss " << serverNss << " for standard " << standard);
-        if (clientChannelWidth == 0)
+        if (clientChannelWidth == MHz_u{0})
         {
             clientChannelWidth = GetDefaultChannelWidth(WIFI_STANDARD_80211ax, band);
         }
-        NS_ABORT_MSG_IF(clientChannelWidth != 20 && clientChannelWidth != 40 &&
-                            clientChannelWidth != 80 && clientChannelWidth != 160,
+        NS_ABORT_MSG_IF(clientChannelWidth != MHz_u{20} && clientChannelWidth != MHz_u{40} &&
+                            clientChannelWidth != MHz_u{80} && clientChannelWidth != MHz_u{160},
                         "Invalid channel width for standard " << standard);
         NS_ABORT_MSG_IF(clientNss == 0 || clientNss > 4,
                         "Invalid nss " << clientNss << " for standard " << standard);
     }
 
     // As channel width increases, scale up plot's yRange value
-    uint32_t channelRateFactor = std::max(clientChannelWidth, serverChannelWidth) / 20;
+    uint32_t channelRateFactor = std::max(clientChannelWidth, serverChannelWidth) / MHz_u{20};
     channelRateFactor = channelRateFactor * std::max(clientNss, serverNss);
 
     // The first number is channel width, second is minimum SNR, third is maximum
     // SNR, fourth and fifth provide xrange axis limits, and sixth the yaxis
     // maximum
     serverStandards = {
-        StandardInfo("802.11a", WIFI_STANDARD_80211a, WIFI_PHY_BAND_5GHZ, 20, 3, 27, 0, 30, 60),
-        StandardInfo("802.11b", WIFI_STANDARD_80211b, WIFI_PHY_BAND_2_4GHZ, 22, -5, 11, -6, 15, 15),
-        StandardInfo("802.11g", WIFI_STANDARD_80211g, WIFI_PHY_BAND_2_4GHZ, 20, -5, 27, -6, 30, 60),
+        StandardInfo("802.11a",
+                     WIFI_STANDARD_80211a,
+                     WIFI_PHY_BAND_5GHZ,
+                     MHz_u{20},
+                     dB_u{3},
+                     dB_u{27},
+                     0,
+                     30,
+                     60),
+        StandardInfo("802.11b",
+                     WIFI_STANDARD_80211b,
+                     WIFI_PHY_BAND_2_4GHZ,
+                     MHz_u{22},
+                     dB_u{-5},
+                     dB_u{11},
+                     -6,
+                     15,
+                     15),
+        StandardInfo("802.11g",
+                     WIFI_STANDARD_80211g,
+                     WIFI_PHY_BAND_2_4GHZ,
+                     MHz_u{20},
+                     dB_u{-5},
+                     dB_u{27},
+                     -6,
+                     30,
+                     60),
         StandardInfo("802.11n-5GHz",
                      WIFI_STANDARD_80211n,
                      WIFI_PHY_BAND_5GHZ,
                      serverChannelWidth,
-                     3,
-                     30,
+                     dB_u{3},
+                     dB_u{30},
                      0,
                      35,
                      80 * channelRateFactor),
@@ -402,8 +422,8 @@
                      WIFI_STANDARD_80211n,
                      WIFI_PHY_BAND_2_4GHZ,
                      serverChannelWidth,
-                     3,
-                     30,
+                     dB_u{3},
+                     dB_u{30},
                      0,
                      35,
                      80 * channelRateFactor),
@@ -411,27 +431,35 @@
                      WIFI_STANDARD_80211ac,
                      WIFI_PHY_BAND_5GHZ,
                      serverChannelWidth,
-                     5,
-                     50,
+                     dB_u{5},
+                     dB_u{50},
                      0,
                      55,
                      120 * channelRateFactor),
         StandardInfo("802.11p-10MHz",
                      WIFI_STANDARD_80211p,
                      WIFI_PHY_BAND_5GHZ,
-                     10,
-                     3,
-                     27,
+                     MHz_u{10},
+                     dB_u{3},
+                     dB_u{27},
+                     0,
+                     30,
+                     60),
+        StandardInfo("802.11p-5MHz",
+                     WIFI_STANDARD_80211p,
+                     WIFI_PHY_BAND_5GHZ,
+                     MHz_u{5},
+                     dB_u{3},
+                     dB_u{27},
                      0,
                      30,
                      60),
-        StandardInfo("802.11p-5MHz", WIFI_STANDARD_80211p, WIFI_PHY_BAND_5GHZ, 5, 3, 27, 0, 30, 60),
         StandardInfo("802.11ax-6GHz",
                      WIFI_STANDARD_80211ax,
                      WIFI_PHY_BAND_6GHZ,
                      serverChannelWidth,
-                     5,
-                     55,
+                     dB_u{5},
+                     dB_u{55},
                      0,
                      60,
                      120 * channelRateFactor),
@@ -439,8 +467,8 @@
                      WIFI_STANDARD_80211ax,
                      WIFI_PHY_BAND_5GHZ,
                      serverChannelWidth,
-                     5,
-                     55,
+                     dB_u{5},
+                     dB_u{55},
                      0,
                      60,
                      120 * channelRateFactor),
@@ -448,23 +476,47 @@
                      WIFI_STANDARD_80211ax,
                      WIFI_PHY_BAND_2_4GHZ,
                      serverChannelWidth,
-                     5,
-                     55,
+                     dB_u{5},
+                     dB_u{55},
                      0,
                      60,
                      120 * channelRateFactor),
     };
 
     clientStandards = {
-        StandardInfo("802.11a", WIFI_STANDARD_80211a, WIFI_PHY_BAND_5GHZ, 20, 3, 27, 0, 30, 60),
-        StandardInfo("802.11b", WIFI_STANDARD_80211b, WIFI_PHY_BAND_2_4GHZ, 22, -5, 11, -6, 15, 15),
-        StandardInfo("802.11g", WIFI_STANDARD_80211g, WIFI_PHY_BAND_2_4GHZ, 20, -5, 27, -6, 30, 60),
+        StandardInfo("802.11a",
+                     WIFI_STANDARD_80211a,
+                     WIFI_PHY_BAND_5GHZ,
+                     MHz_u{20},
+                     dB_u{3},
+                     dB_u{27},
+                     0,
+                     30,
+                     60),
+        StandardInfo("802.11b",
+                     WIFI_STANDARD_80211b,
+                     WIFI_PHY_BAND_2_4GHZ,
+                     MHz_u{22},
+                     dB_u{-5},
+                     dB_u{11},
+                     -6,
+                     15,
+                     15),
+        StandardInfo("802.11g",
+                     WIFI_STANDARD_80211g,
+                     WIFI_PHY_BAND_2_4GHZ,
+                     MHz_u{20},
+                     dB_u{-5},
+                     dB_u{27},
+                     -6,
+                     30,
+                     60),
         StandardInfo("802.11n-5GHz",
                      WIFI_STANDARD_80211n,
                      WIFI_PHY_BAND_5GHZ,
                      clientChannelWidth,
-                     3,
-                     30,
+                     dB_u{3},
+                     dB_u{30},
                      0,
                      35,
                      80 * channelRateFactor),
@@ -472,8 +524,8 @@
                      WIFI_STANDARD_80211n,
                      WIFI_PHY_BAND_2_4GHZ,
                      clientChannelWidth,
-                     3,
-                     30,
+                     dB_u{3},
+                     dB_u{30},
                      0,
                      35,
                      80 * channelRateFactor),
@@ -481,27 +533,35 @@
                      WIFI_STANDARD_80211ac,
                      WIFI_PHY_BAND_5GHZ,
                      clientChannelWidth,
-                     5,
-                     50,
+                     dB_u{5},
+                     dB_u{50},
                      0,
                      55,
                      120 * channelRateFactor),
         StandardInfo("802.11p-10MHz",
                      WIFI_STANDARD_80211p,
                      WIFI_PHY_BAND_5GHZ,
-                     10,
-                     3,
-                     27,
+                     MHz_u{10},
+                     dB_u{3},
+                     dB_u{27},
+                     0,
+                     30,
+                     60),
+        StandardInfo("802.11p-5MHz",
+                     WIFI_STANDARD_80211p,
+                     WIFI_PHY_BAND_5GHZ,
+                     MHz_u{5},
+                     dB_u{3},
+                     dB_u{27},
                      0,
                      30,
                      60),
-        StandardInfo("802.11p-5MHz", WIFI_STANDARD_80211p, WIFI_PHY_BAND_5GHZ, 5, 3, 27, 0, 30, 60),
         StandardInfo("802.11ax-6GHz",
                      WIFI_STANDARD_80211ax,
                      WIFI_PHY_BAND_6GHZ,
                      clientChannelWidth,
-                     5,
-                     55,
+                     dB_u{5},
+                     dB_u{55},
                      0,
                      60,
                      160 * channelRateFactor),
@@ -509,8 +569,8 @@
                      WIFI_STANDARD_80211ax,
                      WIFI_PHY_BAND_5GHZ,
                      clientChannelWidth,
-                     5,
-                     55,
+                     dB_u{5},
+                     dB_u{55},
                      0,
                      60,
                      160 * channelRateFactor),
@@ -518,8 +578,8 @@
                      WIFI_STANDARD_80211ax,
                      WIFI_PHY_BAND_2_4GHZ,
                      clientChannelWidth,
-                     5,
-                     55,
+                     dB_u{5},
+                     dB_u{55},
                      0,
                      60,
                      160 * channelRateFactor),
@@ -588,12 +648,10 @@
     std::ofstream outfile(dataName);
     Gnuplot gnuplot = Gnuplot(plotName);
 
-    Config::SetDefault("ns3::WifiRemoteStationManager::MaxSlrc", UintegerValue(maxSlrc));
-    Config::SetDefault("ns3::WifiRemoteStationManager::MaxSsrc", UintegerValue(maxSsrc));
+    Config::SetDefault("ns3::WifiMac::FrameRetryLimit", UintegerValue(maxRetryCount));
     Config::SetDefault("ns3::MinstrelWifiManager::PrintStats", BooleanValue(true));
     Config::SetDefault("ns3::MinstrelWifiManager::PrintSamples", BooleanValue(true));
     Config::SetDefault("ns3::MinstrelHtWifiManager::PrintStats", BooleanValue(true));
-
     // Disable the default noise figure of 7 dBm in WifiPhy; the calculations
     // of SNR below assume that the only noise is thermal noise
     Config::SetDefault("ns3::WifiPhy::RxNoiseFigure", DoubleValue(0));
@@ -716,9 +774,9 @@
         serverSelectedStandard.m_name == "802.11ac")
     {
         Ptr<HtConfiguration> clientHtConfiguration = wndClient->GetHtConfiguration();
-        clientHtConfiguration->SetShortGuardIntervalSupported(clientShortGuardInterval == 400);
+        clientHtConfiguration->m_sgiSupported = (clientShortGuardInterval == 400);
         Ptr<HtConfiguration> serverHtConfiguration = wndServer->GetHtConfiguration();
-        serverHtConfiguration->SetShortGuardIntervalSupported(serverShortGuardInterval == 400);
+        serverHtConfiguration->m_sgiSupported = (serverShortGuardInterval == 400);
     }
     else if (serverSelectedStandard.m_name == "802.11ax-6GHz" ||
              serverSelectedStandard.m_name == "802.11ax-5GHz" ||
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/examples/wifi-phy-configuration.cc ns-3.44/src/wifi/examples/wifi-phy-configuration.cc
--- ns-3.43/src/wifi/examples/wifi-phy-configuration.cc	2024-10-09 16:41:10.112656800 -0700
+++ ns-3.44/src/wifi/examples/wifi-phy-configuration.cc	2025-03-09 16:55:49.775372500 -0700
@@ -30,8 +30,8 @@
 /**
  * Get the Yans Wifi Phy Ptr object for the 1st node in the NodeContainer
  *
- * \param nc The node container.
- * \return the Yans Wifi Phy Ptr object of the 1st node in the NodeContainer
+ * @param nc The node container.
+ * @return the Yans Wifi Phy Ptr object of the 1st node in the NodeContainer
  */
 Ptr<YansWifiPhy>
 GetYansWifiPhyPtr(const NetDeviceContainer& nc)
@@ -44,7 +44,7 @@
 /**
  * Print the attributes to a file.
  *
- * \param enabled Enable printing.
+ * @param enabled Enable printing.
  */
 void
 PrintAttributesIfEnabled(bool enabled)
@@ -124,8 +124,8 @@
         phySta = GetYansWifiPhyPtr(staDevice);
         // We expect channel 36, width 20, frequency 5180
         NS_ASSERT(phySta->GetChannelNumber() == 36);
-        NS_ASSERT(phySta->GetChannelWidth() == 20);
-        NS_ASSERT(phySta->GetFrequency() == 5180);
+        NS_ASSERT(phySta->GetChannelWidth() == MHz_u{20});
+        NS_ASSERT(phySta->GetFrequency() == MHz_u{5180});
         PrintAttributesIfEnabled(printAttributes);
         break;
     case 2:
@@ -135,8 +135,8 @@
         phySta = GetYansWifiPhyPtr(staDevice);
         // We expect channel 1, width 22, frequency 2412
         NS_ASSERT(phySta->GetChannelNumber() == 1);
-        NS_ASSERT(phySta->GetChannelWidth() == 22);
-        NS_ASSERT(phySta->GetFrequency() == 2412);
+        NS_ASSERT(phySta->GetChannelWidth() == MHz_u{22});
+        NS_ASSERT(phySta->GetFrequency() == MHz_u{2412});
         PrintAttributesIfEnabled(printAttributes);
         break;
     case 3:
@@ -146,8 +146,8 @@
         phySta = GetYansWifiPhyPtr(staDevice);
         // We expect channel 1, width 20, frequency 2412
         NS_ASSERT(phySta->GetChannelNumber() == 1);
-        NS_ASSERT(phySta->GetChannelWidth() == 20);
-        NS_ASSERT(phySta->GetFrequency() == 2412);
+        NS_ASSERT(phySta->GetChannelWidth() == MHz_u{20});
+        NS_ASSERT(phySta->GetFrequency() == MHz_u{2412});
         PrintAttributesIfEnabled(printAttributes);
         break;
     case 4:
@@ -158,8 +158,8 @@
         phySta = GetYansWifiPhyPtr(staDevice);
         // We expect channel 36, width 20, frequency 5180
         NS_ASSERT(phySta->GetChannelNumber() == 36);
-        NS_ASSERT(phySta->GetChannelWidth() == 20);
-        NS_ASSERT(phySta->GetFrequency() == 5180);
+        NS_ASSERT(phySta->GetChannelWidth() == MHz_u{20});
+        NS_ASSERT(phySta->GetFrequency() == MHz_u{5180});
         PrintAttributesIfEnabled(printAttributes);
         break;
     case 5:
@@ -169,8 +169,8 @@
         phySta = GetYansWifiPhyPtr(staDevice);
         // We expect channel 1, width 20, frequency 2412
         NS_ASSERT(phySta->GetChannelNumber() == 1);
-        NS_ASSERT(phySta->GetChannelWidth() == 20);
-        NS_ASSERT(phySta->GetFrequency() == 2412);
+        NS_ASSERT(phySta->GetChannelWidth() == MHz_u{20});
+        NS_ASSERT(phySta->GetFrequency() == MHz_u{2412});
         PrintAttributesIfEnabled(printAttributes);
         break;
     case 6:
@@ -180,8 +180,8 @@
         phySta = GetYansWifiPhyPtr(staDevice);
         // We expect channel 42, width 80, frequency 5210
         NS_ASSERT(phySta->GetChannelNumber() == 42);
-        NS_ASSERT(phySta->GetChannelWidth() == 80);
-        NS_ASSERT(phySta->GetFrequency() == 5210);
+        NS_ASSERT(phySta->GetChannelWidth() == MHz_u{80});
+        NS_ASSERT(phySta->GetFrequency() == MHz_u{5210});
         PrintAttributesIfEnabled(printAttributes);
         break;
     case 7:
@@ -193,8 +193,8 @@
         phySta = GetYansWifiPhyPtr(staDevice);
         // We expect channel 1, width 20, frequency 2412
         NS_ASSERT(phySta->GetChannelNumber() == 1);
-        NS_ASSERT(phySta->GetChannelWidth() == 20);
-        NS_ASSERT(phySta->GetFrequency() == 2412);
+        NS_ASSERT(phySta->GetChannelWidth() == MHz_u{20});
+        NS_ASSERT(phySta->GetFrequency() == MHz_u{2412});
         PrintAttributesIfEnabled(printAttributes);
         break;
     case 8:
@@ -204,8 +204,8 @@
         phySta = GetYansWifiPhyPtr(staDevice);
         // We expect channel 42, width 80, frequency 5210
         NS_ASSERT(phySta->GetChannelNumber() == 42);
-        NS_ASSERT(phySta->GetChannelWidth() == 80);
-        NS_ASSERT(phySta->GetFrequency() == 5210);
+        NS_ASSERT(phySta->GetChannelWidth() == MHz_u{80});
+        NS_ASSERT(phySta->GetFrequency() == MHz_u{5210});
         PrintAttributesIfEnabled(printAttributes);
         break;
     case 9:
@@ -216,8 +216,8 @@
         phySta = GetYansWifiPhyPtr(staDevice);
         // We expect channel 7, width 80, frequency 5985
         NS_ASSERT(phySta->GetChannelNumber() == 7);
-        NS_ASSERT(phySta->GetChannelWidth() == 80);
-        NS_ASSERT(phySta->GetFrequency() == 5985);
+        NS_ASSERT(phySta->GetChannelWidth() == MHz_u{80});
+        NS_ASSERT(phySta->GetFrequency() == MHz_u{5985});
         PrintAttributesIfEnabled(printAttributes);
         break;
     case 10:
@@ -228,8 +228,8 @@
         phySta = GetYansWifiPhyPtr(staDevice);
         // We expect channel 172, width 10, frequency 5860
         NS_ASSERT(phySta->GetChannelNumber() == 172);
-        NS_ASSERT(phySta->GetChannelWidth() == 10);
-        NS_ASSERT(phySta->GetFrequency() == 5860);
+        NS_ASSERT(phySta->GetChannelWidth() == MHz_u{10});
+        NS_ASSERT(phySta->GetFrequency() == MHz_u{5860});
         PrintAttributesIfEnabled(printAttributes);
         break;
     case 11:
@@ -240,8 +240,8 @@
         phySta = GetYansWifiPhyPtr(staDevice);
         // We expect channel 171, width 5, frequency 5860
         NS_ASSERT(phySta->GetChannelNumber() == 171);
-        NS_ASSERT(phySta->GetChannelWidth() == 5);
-        NS_ASSERT(phySta->GetFrequency() == 5860);
+        NS_ASSERT(phySta->GetChannelWidth() == MHz_u{5});
+        NS_ASSERT(phySta->GetFrequency() == MHz_u{5860});
         PrintAttributesIfEnabled(printAttributes);
         break;
     case 12:
@@ -252,8 +252,8 @@
         phySta = GetYansWifiPhyPtr(staDevice);
         // We expect channel 44, width 20, frequency 5220
         NS_ASSERT(phySta->GetChannelNumber() == 44);
-        NS_ASSERT(phySta->GetChannelWidth() == 20);
-        NS_ASSERT(phySta->GetFrequency() == 5220);
+        NS_ASSERT(phySta->GetChannelWidth() == MHz_u{20});
+        NS_ASSERT(phySta->GetFrequency() == MHz_u{5220});
         PrintAttributesIfEnabled(printAttributes);
         break;
     case 13:
@@ -271,8 +271,8 @@
             StringValue("{40, 0, BAND_5GHZ, 0}"));
         // We expect channel 40, width 20, frequency 5200
         NS_ASSERT(phySta->GetChannelNumber() == 40);
-        NS_ASSERT(phySta->GetChannelWidth() == 20);
-        NS_ASSERT(phySta->GetFrequency() == 5200);
+        NS_ASSERT(phySta->GetChannelWidth() == MHz_u{20});
+        NS_ASSERT(phySta->GetFrequency() == MHz_u{5200});
         PrintAttributesIfEnabled(printAttributes);
         break;
     case 14:
@@ -289,8 +289,8 @@
             "/NodeList/1/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::YansWifiPhy/ChannelSettings",
             StringValue("{46, 0, BAND_5GHZ, 0}"));
         NS_ASSERT(phySta->GetChannelNumber() == 46);
-        NS_ASSERT(phySta->GetChannelWidth() == 40);
-        NS_ASSERT(phySta->GetFrequency() == 5230);
+        NS_ASSERT(phySta->GetChannelWidth() == MHz_u{40});
+        NS_ASSERT(phySta->GetFrequency() == MHz_u{5230});
         PrintAttributesIfEnabled(printAttributes);
         break;
     case 15:
@@ -307,8 +307,8 @@
             "/NodeList/1/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::YansWifiPhy/ChannelSettings",
             StringValue("{46, 0, BAND_5GHZ, 0}"));
         NS_ASSERT(phySta->GetChannelNumber() == 46);
-        NS_ASSERT(phySta->GetChannelWidth() == 40);
-        NS_ASSERT(phySta->GetFrequency() == 5230);
+        NS_ASSERT(phySta->GetChannelWidth() == MHz_u{40});
+        NS_ASSERT(phySta->GetFrequency() == MHz_u{5230});
         PrintAttributesIfEnabled(printAttributes);
         break;
     case 16:
@@ -347,8 +347,8 @@
         phySta = GetYansWifiPhyPtr(staDevice);
         // We expect channel number to be 100 due to frequency 5500
         NS_ASSERT(phySta->GetChannelNumber() == 100);
-        NS_ASSERT(phySta->GetChannelWidth() == 20);
-        NS_ASSERT(phySta->GetFrequency() == 5500);
+        NS_ASSERT(phySta->GetChannelWidth() == MHz_u{20});
+        NS_ASSERT(phySta->GetFrequency() == MHz_u{5500});
         PrintAttributesIfEnabled(printAttributes);
         break;
     case 18:
@@ -390,8 +390,8 @@
         phySta->SetAttribute("ChannelSettings", StringValue("{36, 0, BAND_5GHZ, 0}"));
         // We expect channel number to be 36 due to known center frequency 5180
         NS_ASSERT(phySta->GetChannelNumber() == 36);
-        NS_ASSERT(phySta->GetChannelWidth() == 20);
-        NS_ASSERT(phySta->GetFrequency() == 5180);
+        NS_ASSERT(phySta->GetChannelWidth() == MHz_u{20});
+        NS_ASSERT(phySta->GetFrequency() == MHz_u{5180});
         exceptionThrown = false;
         try
         {
@@ -405,8 +405,8 @@
         NS_ASSERT(exceptionThrown);
         phySta->SetAttribute("ChannelSettings", StringValue("{36, 0, BAND_5GHZ, 0}"));
         NS_ASSERT(phySta->GetChannelNumber() == 36);
-        NS_ASSERT(phySta->GetChannelWidth() == 20);
-        NS_ASSERT(phySta->GetFrequency() == 5180);
+        NS_ASSERT(phySta->GetChannelWidth() == MHz_u{20});
+        NS_ASSERT(phySta->GetFrequency() == MHz_u{5180});
         PrintAttributesIfEnabled(printAttributes);
         break;
     case 20:
@@ -417,8 +417,8 @@
         apDevice = wifi.Install(phy, macAp, wifiApNode.Get(0));
         phySta = GetYansWifiPhyPtr(staDevice);
         NS_ASSERT(phySta->GetChannelNumber() == 40);
-        NS_ASSERT(phySta->GetChannelWidth() == 20);
-        NS_ASSERT(phySta->GetFrequency() == 5200);
+        NS_ASSERT(phySta->GetChannelWidth() == MHz_u{20});
+        NS_ASSERT(phySta->GetFrequency() == MHz_u{5200});
         // Set both channel and frequency to consistent values after initialization
         wifi.SetStandard(WIFI_STANDARD_80211n);
         staDevice = wifi.Install(phy, macSta, wifiStaNode.Get(0));
@@ -426,8 +426,8 @@
         phySta = GetYansWifiPhyPtr(staDevice);
         phySta->SetAttribute("ChannelSettings", StringValue("{40, 0, BAND_5GHZ, 0}"));
         NS_ASSERT(phySta->GetChannelNumber() == 40);
-        NS_ASSERT(phySta->GetChannelWidth() == 20);
-        NS_ASSERT(phySta->GetFrequency() == 5200);
+        NS_ASSERT(phySta->GetChannelWidth() == MHz_u{20});
+        NS_ASSERT(phySta->GetFrequency() == MHz_u{5200});
         exceptionThrown = false;
         try
         {
@@ -440,8 +440,8 @@
         phySta->SetAttribute("ChannelSettings", StringValue("{36, 0, BAND_5GHZ, 0}"));
         // We expect channel number to be 36 and an exception to be thrown
         NS_ASSERT(phySta->GetChannelNumber() == 36);
-        NS_ASSERT(phySta->GetChannelWidth() == 20);
-        NS_ASSERT(phySta->GetFrequency() == 5180);
+        NS_ASSERT(phySta->GetChannelWidth() == MHz_u{20});
+        NS_ASSERT(phySta->GetFrequency() == MHz_u{5180});
         NS_ASSERT(exceptionThrown);
         exceptionThrown = false;
         try
@@ -455,8 +455,8 @@
         phySta->SetAttribute("ChannelSettings", StringValue("{36, 0, BAND_5GHZ, 0}"));
         // We expect channel number to be 36 and an exception to be thrown
         NS_ASSERT(phySta->GetChannelNumber() == 36);
-        NS_ASSERT(phySta->GetChannelWidth() == 20);
-        NS_ASSERT(phySta->GetFrequency() == 5180);
+        NS_ASSERT(phySta->GetChannelWidth() == MHz_u{20});
+        NS_ASSERT(phySta->GetFrequency() == MHz_u{5180});
         NS_ASSERT(exceptionThrown);
         PrintAttributesIfEnabled(printAttributes);
         break;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/examples/wifi-phy-rx-trace-example.cc ns-3.44/src/wifi/examples/wifi-phy-rx-trace-example.cc
--- ns-3.43/src/wifi/examples/wifi-phy-rx-trace-example.cc	2024-10-09 16:41:10.112656800 -0700
+++ ns-3.44/src/wifi/examples/wifi-phy-rx-trace-example.cc	2025-03-09 16:55:49.775372500 -0700
@@ -69,7 +69,7 @@
 /**
  * Function called when a packet is received.
  *
- * \param socket The receiving socket.
+ * @param socket The receiving socket.
  */
 void
 ReceivePacket(Ptr<Socket> socket)
@@ -94,10 +94,10 @@
 /**
  * Generate traffic.
  *
- * \param socket The sending socket.
- * \param pktSize The packet size.
- * \param pktCount The packet count.
- * \param pktInterval The interval between two packets.
+ * @param socket The sending socket.
+ * @param pktSize The packet size.
+ * @param pktCount The packet count.
+ * @param pktInterval The interval between two packets.
  */
 static void
 GeneratePacket(Ptr<Socket> socket, uint32_t pktSize, uint32_t pktCount, Time pktInterval)
@@ -134,7 +134,7 @@
     double distance = 1;        // meters
     bool enableTwoBss = false;  // whether to enable a second (non-traced) BSS
     double distanceTwoBss = 10; // meters (distance between APs if enableTwoBss is true)
-    Time interval = Seconds(1.0);
+    Time interval = Seconds(1);
     bool verbose = true;
     bool logging = false;
 
@@ -303,7 +303,7 @@
     rxTraceHelper.Stop(stopTime);
 
     Simulator::ScheduleWithContext(source->GetNode()->GetId(),
-                                   Seconds(1.0),
+                                   Seconds(1),
                                    &GeneratePacket,
                                    source,
                                    packetSize,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/examples/wifi-phy-test.cc ns-3.44/src/wifi/examples/wifi-phy-test.cc
--- ns-3.43/src/wifi/examples/wifi-phy-test.cc	2024-10-09 16:41:10.112656800 -0700
+++ ns-3.44/src/wifi/examples/wifi-phy-test.cc	2025-03-09 16:55:49.775372500 -0700
@@ -45,8 +45,8 @@
 
     /**
      * Run function
-     * \param input the PSR experiment
-     * \returns the PSR experiment output
+     * @param input the PSR experiment
+     * @returns the PSR experiment output
      */
     PsrExperiment::Output Run(PsrExperiment::Input input);
 
@@ -55,15 +55,15 @@
     void Send();
     /**
      * Send receive function
-     * \param psdu the PSDU
-     * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
-     * \param txVector the wifi transmit vector
-     * \param statusPerMpdu reception status per MPDU
+     * @param psdu the PSDU
+     * @param rxSignalInfo the info on the received signal (\see RxSignalInfo)
+     * @param txVector the wifi transmit vector
+     * @param statusPerMpdu reception status per MPDU
      */
     void Receive(Ptr<const WifiPsdu> psdu,
                  RxSignalInfo rxSignalInfo,
-                 WifiTxVector txVector,
-                 std::vector<bool> statusPerMpdu);
+                 const WifiTxVector& txVector,
+                 const std::vector<bool>& statusPerMpdu);
     Ptr<WifiPhy> m_tx; ///< transmit
     Input m_input;     ///< input
     Output m_output;   ///< output
@@ -84,8 +84,8 @@
 void
 PsrExperiment::Receive(Ptr<const WifiPsdu> psdu,
                        RxSignalInfo rxSignalInfo,
-                       WifiTxVector txVector,
-                       std::vector<bool> statusPerMpdu)
+                       const WifiTxVector& txVector,
+                       const std::vector<bool>& statusPerMpdu)
 {
     m_output.received++;
 }
@@ -175,8 +175,8 @@
 
     /**
      * Run function
-     * \param input the collision experiment data
-     * \returns the experiment output
+     * @param input the collision experiment data
+     * @returns the experiment output
      */
     CollisionExperiment::Output Run(CollisionExperiment::Input input);
 
@@ -187,15 +187,15 @@
     void SendB() const;
     /**
      * Receive function
-     * \param psdu the PSDU
-     * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
-     * \param txVector the wifi transmit vector
-     * \param statusPerMpdu reception status per MPDU
+     * @param psdu the PSDU
+     * @param rxSignalInfo the info on the received signal (\see RxSignalInfo)
+     * @param txVector the wifi transmit vector
+     * @param statusPerMpdu reception status per MPDU
      */
     void Receive(Ptr<const WifiPsdu> psdu,
                  RxSignalInfo rxSignalInfo,
-                 WifiTxVector txVector,
-                 std::vector<bool> statusPerMpdu);
+                 const WifiTxVector& txVector,
+                 const std::vector<bool>& statusPerMpdu);
     Ptr<WifiPhy> m_txA; ///< transmit A
     Ptr<WifiPhy> m_txB; ///< transmit B
     uint32_t m_flowIdA; ///< flow ID A
@@ -231,8 +231,8 @@
 void
 CollisionExperiment::Receive(Ptr<const WifiPsdu> psdu,
                              RxSignalInfo rxSignalInfo,
-                             WifiTxVector txVector,
-                             std::vector<bool> statusPerMpdu)
+                             const WifiTxVector& txVector,
+                             const std::vector<bool>& statusPerMpdu)
 {
     FlowIdTag tag;
     if ((*psdu->begin())->GetPacket()->FindFirstMatchingByteTag(tag))
@@ -253,7 +253,7 @@
 }
 
 CollisionExperiment::Input::Input()
-    : interval(MicroSeconds(0)),
+    : interval(),
       xA(-5),
       xB(5),
       txModeA("OfdmRate6Mbps"),
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/examples/wifi-test-interference-helper.cc ns-3.44/src/wifi/examples/wifi-test-interference-helper.cc
--- ns-3.43/src/wifi/examples/wifi-test-interference-helper.cc	2024-10-09 16:41:10.112656800 -0700
+++ ns-3.44/src/wifi/examples/wifi-test-interference-helper.cc	2025-03-09 16:55:49.775372500 -0700
@@ -77,8 +77,8 @@
         meter_u xB;            ///< x B
         std::string txModeA;   ///< transmit mode A
         std::string txModeB;   ///< transmit mode B
-        double txPowerLevelA;  ///< transmit power level A
-        double txPowerLevelB;  ///< transmit power level B
+        dBm_u txPowerLevelA;   ///< transmit power level A
+        dBm_u txPowerLevelB;   ///< transmit power level B
         uint32_t packetSizeA;  ///< packet size A
         uint32_t packetSizeB;  ///< packet size B
         uint16_t channelA;     ///< channel number A
@@ -89,21 +89,21 @@
         WifiPhyBand band;      ///< band
         WifiPreamble preamble; ///< preamble
         bool captureEnabled;   ///< whether physical layer capture is enabled
-        double captureMargin;  ///< margin used for physical layer capture
+        dB_u captureMargin;    ///< margin used for physical layer capture
     };
 
     InterferenceExperiment();
     /**
      * Run function
-     * \param input the interference experiment data
+     * @param input the interference experiment data
      */
     void Run(InterferenceExperiment::Input input);
 
   private:
     /**
      * Function triggered when a packet is dropped
-     * \param packet the packet that was dropped
-     * \param reason the reason why it was dropped
+     * @param packet the packet that was dropped
+     * @param reason the reason why it was dropped
      */
     void PacketDropped(Ptr<const Packet> packet, WifiPhyRxfailureReason reason);
     /// Send A function
@@ -180,24 +180,24 @@
 }
 
 InterferenceExperiment::Input::Input()
-    : interval(MicroSeconds(0)),
+    : interval(),
       xA(-5),
       xB(5),
       txModeA("OfdmRate54Mbps"),
       txModeB("OfdmRate54Mbps"),
-      txPowerLevelA(16.0206),
-      txPowerLevelB(16.0206),
+      txPowerLevelA(dBm_u{16.0206}),
+      txPowerLevelB(dBm_u{16.0206}),
       packetSizeA(1500),
       packetSizeB(1500),
       channelA(36),
       channelB(36),
-      widthA(20),
-      widthB(20),
+      widthA(MHz_u{20}),
+      widthB(MHz_u{20}),
       standard(WIFI_STANDARD_80211a),
       band(WIFI_PHY_BAND_5GHZ),
       preamble(WIFI_PREAMBLE_LONG),
       captureEnabled(false),
-      captureMargin(0)
+      captureMargin(dB_u{0})
 {
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/examples/wifi-trans-example.cc ns-3.44/src/wifi/examples/wifi-trans-example.cc
--- ns-3.43/src/wifi/examples/wifi-trans-example.cc	2024-10-09 16:41:10.112656800 -0700
+++ ns-3.44/src/wifi/examples/wifi-trans-example.cc	2025-03-09 16:55:49.779372700 -0700
@@ -15,6 +15,7 @@
 #include "ns3/spectrum-wifi-helper.h"
 #include "ns3/ssid.h"
 #include "ns3/string.h"
+#include "ns3/wifi-utils.h"
 
 using namespace ns3;
 
@@ -43,8 +44,8 @@
 main(int argc, char** argv)
 {
     std::string standardStr = "11a";
-    MHz_u bw = 20;
-    dBm_u pow = 23;
+    MHz_u bw{20};
+    dBm_u pow{23};
     bool verbose = false;
     CommandLine cmd(__FILE__);
     cmd.AddValue("standard",
@@ -76,8 +77,8 @@
         channelBand = "BAND_5GHZ";
         ssid = Ssid("ns380211a");
         dataRate = "OfdmRate6Mbps";
-        freq = 5180;
-        if (bw != 20)
+        freq = MHz_u{5180};
+        if (bw != MHz_u{20})
         {
             std::cout << "Bandwidth is not compatible with standard" << std::endl;
             return 1;
@@ -90,10 +91,10 @@
         channelBand = "BAND_5GHZ";
         ssid = Ssid("ns380211p_10MHZ");
         dataRate = "OfdmRate3MbpsBW10MHz";
-        freq = 5860;
+        freq = MHz_u{5860};
         dataStartTime = MicroSeconds(1400);
         dataDuration = MicroSeconds(600);
-        if (bw != 10)
+        if (bw != MHz_u{10})
         {
             std::cout << "Bandwidth is not compatible with standard" << std::endl;
             return 1;
@@ -106,10 +107,10 @@
         channelBand = "BAND_5GHZ";
         ssid = Ssid("ns380211p_5MHZ");
         dataRate = "OfdmRate1_5MbpsBW5MHz";
-        freq = 5860;
+        freq = MHz_u{5860};
         dataStartTime = MicroSeconds(2500);
         dataDuration = MicroSeconds(1200);
-        if (bw != 5)
+        if (bw != MHz_u{5})
         {
             std::cout << "Bandwidth is not compatible with standard" << std::endl;
             return 1;
@@ -122,10 +123,10 @@
         channelBand = "BAND_2_4GHZ";
         ssid = Ssid("ns380211n_2_4GHZ");
         dataRate = "HtMcs0";
-        freq = 2402 + (bw / 2); // so as to have 2412/2422 for 20/40
+        freq = MHz_u{2402} + (bw / 2); // so as to have 2412/2422 for 20/40
         dataStartTime = MicroSeconds(4700);
         dataDuration = MicroSeconds(400);
-        if (bw != 20 && bw != 40)
+        if (bw != MHz_u{20} && bw != MHz_u{40})
         {
             std::cout << "Bandwidth is not compatible with standard" << std::endl;
             return 1;
@@ -138,9 +139,9 @@
         channelBand = "BAND_5GHZ";
         ssid = Ssid("ns380211n_5GHZ");
         dataRate = "HtMcs0";
-        freq = 5170 + (bw / 2); // so as to have 5180/5190 for 20/40
+        freq = MHz_u{5170} + (bw / 2); // so as to have 5180/5190 for 20/40
         dataStartTime = MicroSeconds(1000);
-        if (bw != 20 && bw != 40)
+        if (bw != MHz_u{20} && bw != MHz_u{40})
         {
             std::cout << "Bandwidth is not compatible with standard" << std::endl;
             return 1;
@@ -153,10 +154,10 @@
         channelBand = "BAND_5GHZ";
         ssid = Ssid("ns380211ac");
         dataRate = "VhtMcs0";
-        freq = 5170 + (bw / 2); // so as to have 5180/5190/5210/5250 for 20/40/80/160
+        freq = MHz_u{5170} + (bw / 2); // so as to have 5180/5190/5210/5250 for 20/40/80/160
         dataStartTime = MicroSeconds(1100);
         dataDuration += MicroSeconds(400); // account for ADDBA procedure
-        if (bw != 20 && bw != 40 && bw != 80 && bw != 160)
+        if (bw != MHz_u{20} && bw != MHz_u{40} && bw != MHz_u{80} && bw != MHz_u{160})
         {
             std::cout << "Bandwidth is not compatible with standard" << std::endl;
             return 1;
@@ -169,10 +170,10 @@
         channelBand = "BAND_2_4GHZ";
         ssid = Ssid("ns380211ax_2_4GHZ");
         dataRate = "HeMcs0";
-        freq = 2402 + (bw / 2); // so as to have 2412/2422/2442 for 20/40/80
+        freq = MHz_u{2402} + (bw / 2); // so as to have 2412/2422/2442 for 20/40/80
         dataStartTime = MicroSeconds(5500);
         dataDuration += MicroSeconds(2000); // account for ADDBA procedure
-        if (bw != 20 && bw != 40 && bw != 80)
+        if (bw != MHz_u{20} && bw != MHz_u{40} && bw != MHz_u{80})
         {
             std::cout << "Bandwidth is not compatible with standard" << std::endl;
             return 1;
@@ -185,10 +186,10 @@
         channelBand = "BAND_5GHZ";
         ssid = Ssid("ns380211ax_5GHZ");
         dataRate = "HeMcs0";
-        freq = 5170 + (bw / 2); // so as to have 5180/5190/5210/5250 for 20/40/80/160
+        freq = MHz_u{5170} + (bw / 2); // so as to have 5180/5190/5210/5250 for 20/40/80/160
         dataStartTime = MicroSeconds(1200);
         dataDuration += MicroSeconds(500); // account for ADDBA procedure
-        if (bw != 20 && bw != 40 && bw != 80 && bw != 160)
+        if (bw != MHz_u{20} && bw != MHz_u{40} && bw != MHz_u{80} && bw != MHz_u{160})
         {
             std::cout << "Bandwidth is not compatible with standard" << std::endl;
             return 1;
@@ -278,12 +279,13 @@
 
     /* frequency range for spectrum analyzer */
     std::vector<double> freqs;
-    int margin = 2; // 1MHz margin on each side
-    int band = (bw + margin);
+    const MHz_u margin{2}; // 1MHz margin on each side
+    const auto band = (bw + margin);
     freqs.reserve(4 * 10 * band);
+    const MHz_u scale{0.1};
     for (int i = 0; i < (4 * 10 * band); ++i) // conversion to 100kHz scale
     {
-        freqs.push_back(i * 1e5 + (freq - 2 * band) * 1e6);
+        freqs.push_back(MHzToHz((i * scale) + (freq - 2 * band)));
     }
     Ptr<SpectrumModel> spectrumAnalyzerFreqModel = Create<SpectrumModel>(freqs);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/helper/athstats-helper.cc ns-3.44/src/wifi/helper/athstats-helper.cc
--- ns-3.43/src/wifi/helper/athstats-helper.cc	2024-10-09 16:41:10.112656800 -0700
+++ ns-3.44/src/wifi/helper/athstats-helper.cc	2025-03-09 16:55:49.779372700 -0700
@@ -27,7 +27,7 @@
 NS_LOG_COMPONENT_DEFINE("Athstats");
 
 AthstatsHelper::AthstatsHelper()
-    : m_interval(Seconds(1.0))
+    : m_interval(Seconds(1))
 {
 }
 
@@ -110,7 +110,7 @@
                             .AddConstructor<AthstatsWifiTraceSink>()
                             .AddAttribute("Interval",
                                           "Time interval between reports",
-                                          TimeValue(Seconds(1.0)),
+                                          TimeValue(Seconds(1)),
                                           MakeTimeAccessor(&AthstatsWifiTraceSink::m_interval),
                                           MakeTimeChecker());
     return tid;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/helper/athstats-helper.h ns-3.44/src/wifi/helper/athstats-helper.h
--- ns-3.43/src/wifi/helper/athstats-helper.h	2024-10-09 16:41:10.112656800 -0700
+++ ns-3.44/src/wifi/helper/athstats-helper.h	2025-03-09 16:55:49.779372700 -0700
@@ -41,27 +41,27 @@
     AthstatsHelper();
     /**
      * Enable athstats
-     * \param filename the file name
-     * \param nodeid the node ID
-     * \param deviceid the device ID
+     * @param filename the file name
+     * @param nodeid the node ID
+     * @param deviceid the device ID
      */
     void EnableAthstats(std::string filename, uint32_t nodeid, uint32_t deviceid);
     /**
      * Enable athstats
-     * \param filename the file name
-     * \param nd the device
+     * @param filename the file name
+     * @param nd the device
      */
     void EnableAthstats(std::string filename, Ptr<NetDevice> nd);
     /**
      * Enable athstats
-     * \param filename the file name
-     * \param d the collection of devices
+     * @param filename the file name
+     * @param d the collection of devices
      */
     void EnableAthstats(std::string filename, NetDeviceContainer d);
     /**
      * Enable athstats
-     * \param filename the file name
-     * \param n the collection of nodes
+     * @param filename the file name
+     * @param n the collection of nodes
      */
     void EnableAthstats(std::string filename, NodeContainer n);
 
@@ -94,8 +94,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     AthstatsWifiTraceSink();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/helper/spectrum-wifi-helper.h ns-3.44/src/wifi/helper/spectrum-wifi-helper.h
--- ns-3.43/src/wifi/helper/spectrum-wifi-helper.h	2024-10-09 16:41:10.112656800 -0700
+++ ns-3.44/src/wifi/helper/spectrum-wifi-helper.h	2025-03-09 16:55:49.779372700 -0700
@@ -21,7 +21,7 @@
 class SpectrumWifiPhy;
 
 /**
- * \brief Make it easy to create and manage PHY objects for the spectrum model.
+ * @brief Make it easy to create and manage PHY objects for the spectrum model.
  *
  * The Pcap and ASCII traces generated by the EnableAscii and EnablePcap methods defined
  * in this class correspond to PHY-level traces and come to us via WifiPhyHelper
@@ -36,26 +36,26 @@
     /**
      * Create a PHY helper.
      *
-     * \param nLinks the number of links to configure (>1 only for 11be devices)
+     * @param nLinks the number of links to configure (>1 only for 11be devices)
      */
     SpectrumWifiPhyHelper(uint8_t nLinks = 1);
 
     /**
-     * \param channel the default spectrum channel to associate to this helper
+     * @param channel the default spectrum channel to associate to this helper
      *
      * Every PHY created by a call to Install is associated to this default spectrum channel.
      */
     void SetChannel(const Ptr<SpectrumChannel> channel);
     /**
-     * \param channelName The name of the default spectrum channel to associate to this helper
+     * @param channelName The name of the default spectrum channel to associate to this helper
      *
      * Every PHY created by a call to Install is associated to this default spectrum channel.
      */
     void SetChannel(const std::string& channelName);
 
     /**
-     * \param channel the spectrum channel to add to this helper
-     * \param freqRange the frequency range, bounded by a minFrequency and a maxFrequency in MHz
+     * @param channel the spectrum channel to add to this helper
+     * @param freqRange the frequency range, bounded by a minFrequency and a maxFrequency in MHz
      *
      * Every PHY created by a call to Install is added to this spectrum channel.
      * If a PHY is requested to operate or scan a channel with the specified frequency and width
@@ -64,8 +64,8 @@
     void AddChannel(const Ptr<SpectrumChannel> channel,
                     const FrequencyRange& freqRange = WHOLE_WIFI_SPECTRUM);
     /**
-     * \param channelName The name of the spectrum channel to add to this helper
-     * \param freqRange the frequency range, bounded by a minFrequency and a maxFrequency in MHz
+     * @param channelName The name of the spectrum channel to add to this helper
+     * @param freqRange the frequency range, bounded by a minFrequency and a maxFrequency in MHz
      *
      * Every PHY created by a call to Install is added to this spectrum channel.
      * If a PHY is requested to operate or scan a channel with the specified frequency and width
@@ -79,8 +79,8 @@
      * If no mapping has been specified for a given link, all spectrum PHY interfaces will
      * be added to the PHY instance of that link.
      *
-     * \param linkId ID of the link to setup
-     * \param freqRange frequency range handled by of the spectrum PHY interface
+     * @param linkId ID of the link to setup
+     * @param freqRange frequency range handled by of the spectrum PHY interface
      */
     void AddPhyToFreqRangeMapping(uint8_t linkId, const FrequencyRange& freqRange);
 
@@ -91,25 +91,25 @@
 
   private:
     /**
-     * \param node the node on which we wish to create a wifi PHY
-     * \param device the device within which this PHY will be created
-     * \returns newly-created PHY objects.
+     * @param node the node on which we wish to create a wifi PHY
+     * @param device the device within which this PHY will be created
+     * @returns newly-created PHY objects.
      *
      * This method implements the pure virtual method defined in \ref ns3::WifiPhyHelper.
      */
     std::vector<Ptr<WifiPhy>> Create(Ptr<Node> node, Ptr<WifiNetDevice> device) const override;
 
     /**
-     * \brief Install PHY interfaces to the PHY instance of a given link
+     * @brief Install PHY interfaces to the PHY instance of a given link
      * based on the currently configured mapping (\see AddPhyInterface).
      *
-     * \param linkId ID of the link to setup
-     * \param phy spectrum PHY instance of the link
+     * @param linkId ID of the link to setup
+     * @param phy spectrum PHY instance of the link
      */
     void InstallPhyInterfaces(uint8_t linkId, Ptr<SpectrumWifiPhy> phy) const;
 
     /**
-     * \param channel The channel to inspect to possibly add a WifiBandwidthFilter
+     * @param channel The channel to inspect to possibly add a WifiBandwidthFilter
      *
      * This method will add a WifiBandwidthFilter object to the SpectrumChannel, only if
      * one has not yet been added.
@@ -118,7 +118,7 @@
 
     /**
      * Function that is notified when a spectrum channel switched
-     * \param phy spectrum PHY instance that has switched its channel
+     * @param phy spectrum PHY instance that has switched its channel
      */
     static void SpectrumChannelSwitched(Ptr<SpectrumWifiPhy> phy);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/helper/wifi-co-trace-helper.cc ns-3.44/src/wifi/helper/wifi-co-trace-helper.cc
--- ns-3.43/src/wifi/helper/wifi-co-trace-helper.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/wifi/helper/wifi-co-trace-helper.cc	2025-03-09 16:55:49.779372700 -0700
@@ -0,0 +1,387 @@
+/*
+ * Copyright (c) 2024 Indraprastha Institute of Information Technology Delhi
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ */
+
+#include "wifi-co-trace-helper.h"
+
+#include "ns3/assert.h"
+#include "ns3/log.h"
+#include "ns3/names.h"
+#include "ns3/net-device-container.h"
+#include "ns3/node-container.h"
+#include "ns3/node-list.h"
+#include "ns3/node.h"
+#include "ns3/pointer.h"
+#include "ns3/wifi-mac.h"
+#include "ns3/wifi-net-device.h"
+#include "ns3/wifi-phy-state-helper.h"
+#include "ns3/wifi-phy.h"
+
+#include <iomanip>
+#include <iostream>
+#include <sstream>
+#include <string>
+
+namespace ns3
+{
+
+NS_LOG_COMPONENT_DEFINE("WifiCoTraceHelper");
+
+WifiCoTraceHelper::WifiCoTraceHelper()
+{
+    NS_LOG_FUNCTION(this);
+}
+
+WifiCoTraceHelper::WifiCoTraceHelper(Time startTime, Time stopTime)
+{
+    NS_LOG_FUNCTION(this << startTime.As(Time::S) << stopTime.As(Time::S));
+    NS_ASSERT_MSG(startTime <= stopTime,
+                  "Invalid Start: " << startTime << " and Stop: " << stopTime << " Time");
+
+    m_startTime = startTime;
+    m_stopTime = stopTime;
+}
+
+void
+WifiCoTraceHelper::Start(Time start)
+{
+    NS_LOG_FUNCTION(this << start.As(Time::S));
+    NS_ASSERT_MSG(start <= m_stopTime,
+                  "Invalid Start: " << start << " and Stop: " << m_stopTime << " Time");
+    NS_ASSERT_MSG(start >= Simulator::Now(),
+                  "Invalid Start: " << start << " less than Now(): " << Simulator::Now());
+    m_startTime = start;
+}
+
+void
+WifiCoTraceHelper::Stop(Time stop)
+{
+    NS_LOG_FUNCTION(this << stop.As(Time::S));
+    NS_ASSERT_MSG(m_startTime <= stop,
+                  "Invalid Start: " << m_startTime << " and Stop: " << stop << " Time");
+    NS_ASSERT_MSG(stop >= Simulator::Now(),
+                  "Invalid Stop: " << stop << " less than Now(): " << Simulator::Now());
+
+    m_stopTime = stop;
+}
+
+void
+WifiCoTraceHelper::Reset()
+{
+    NS_LOG_FUNCTION(this);
+
+    for (auto& record : m_deviceRecords)
+    {
+        record.m_linkStateDurations.clear();
+    }
+}
+
+void
+WifiCoTraceHelper::Enable(NodeContainer nodes)
+{
+    NS_LOG_FUNCTION(this << nodes.GetN());
+    NetDeviceContainer netDevices;
+    for (uint32_t i = 0; i < nodes.GetN(); ++i)
+    {
+        for (uint32_t j = 0; j < nodes.Get(i)->GetNDevices(); ++j)
+        {
+            netDevices.Add(nodes.Get(i)->GetDevice(j));
+        }
+    }
+    Enable(netDevices);
+}
+
+void
+WifiCoTraceHelper::Enable(NetDeviceContainer devices)
+{
+    NS_LOG_FUNCTION(this << devices.GetN());
+
+    for (uint32_t j = 0; j < devices.GetN(); ++j)
+    {
+        auto device = DynamicCast<WifiNetDevice>(devices.Get(j));
+        if (!device)
+        {
+            NS_LOG_INFO("Ignoring deviceId: " << devices.Get(j)->GetIfIndex() << " on nodeId: "
+                                              << devices.Get(j)->GetNode()->GetId()
+                                              << " because it is not of type WifiNetDevice");
+            continue;
+        }
+        const auto idx = m_numDevices++;
+        m_deviceRecords.emplace_back(device);
+
+        for (uint32_t k = 0; k < device->GetNPhys(); ++k)
+        {
+            auto wifiPhyStateHelper = device->GetPhy(k)->GetState();
+            auto linkCallback =
+                MakeCallback(&WifiCoTraceHelper::NotifyWifiPhyState, this).Bind(idx, k);
+            wifiPhyStateHelper->TraceConnectWithoutContext("State", linkCallback);
+        }
+    }
+}
+
+void
+WifiCoTraceHelper::PrintStatistics(std::ostream& os, Time::Unit unit) const
+{
+    NS_LOG_FUNCTION(this);
+    NS_ASSERT_MSG(m_deviceRecords.size() == m_numDevices, "m_deviceRecords size mismatch");
+
+    for (size_t i = 0; i < m_numDevices; ++i)
+    {
+        auto nodeName = m_deviceRecords[i].m_nodeName;
+        auto deviceName = m_deviceRecords[i].m_deviceName;
+        if (nodeName.empty())
+        {
+            nodeName = std::to_string(m_deviceRecords[i].m_nodeId);
+        }
+        if (deviceName.empty())
+        {
+            deviceName = std::to_string(m_deviceRecords[i].m_ifIndex);
+        }
+        auto numLinks = m_deviceRecords[i].m_linkStateDurations.size();
+        if (numLinks == 1)
+        {
+            auto& statistics = m_deviceRecords[i].m_linkStateDurations.begin()->second;
+            os << "\n"
+               << "---- COT for " << nodeName << ":" << deviceName << " ----"
+               << "\n";
+            PrintLinkStates(os, statistics, unit);
+        }
+        else if (numLinks > 1)
+        {
+            os << "\nDevice \"" << nodeName << ":" << deviceName
+               << "\" has statistics for multiple links: "
+               << "\n";
+            for (auto& linkStates : m_deviceRecords[i].m_linkStateDurations)
+            {
+                os << "\n"
+                   << "---- COT for " << nodeName << ":" << deviceName << "#Link"
+                   << std::to_string(linkStates.first) << " ---"
+                   << "\n";
+                PrintLinkStates(os, linkStates.second, unit);
+            }
+        }
+        else
+        {
+            os << "\nDevice \"" << nodeName << ":" << deviceName << "\" has no statistics."
+               << "\n";
+        }
+    }
+    os << "\n";
+}
+
+std::ostream&
+WifiCoTraceHelper::PrintLinkStates(std::ostream& os,
+                                   const std::map<WifiPhyState, Time>& linkStates,
+                                   Time::Unit unit) const
+{
+    NS_LOG_FUNCTION(this);
+    os << "Showing duration by states: "
+       << "\n";
+
+    const auto percents = ComputePercentage(linkStates);
+    const auto showPercents = !percents.empty();
+
+    std::vector<std::string> stateColumn{};
+    std::vector<std::string> durationColumn{};
+    std::vector<std::string> percentColumn{};
+
+    for (const auto& it : linkStates)
+    {
+        std::stringstream stateStream;
+        stateStream << it.first << ": ";
+        stateColumn.emplace_back(stateStream.str());
+
+        std::stringstream durationStream;
+        durationStream << std::showpoint << std::fixed << std::setprecision(2)
+                       << it.second.As(unit);
+        durationColumn.emplace_back(durationStream.str());
+
+        if (showPercents)
+        {
+            std::stringstream percentStream;
+            percentStream << std::showpoint << std::fixed << std::setprecision(2) << " ("
+                          << percents.at(it.first) << "%)";
+            percentColumn.emplace_back(percentStream.str());
+        }
+    }
+
+    AlignDecimal(durationColumn);
+    if (showPercents)
+    {
+        AlignDecimal(percentColumn);
+    }
+    AlignWidth(stateColumn);
+    AlignWidth(durationColumn);
+
+    for (size_t i = 0; i < stateColumn.size(); ++i)
+    {
+        os << stateColumn.at(i) << durationColumn.at(i);
+        if (showPercents)
+        {
+            os << percentColumn.at(i);
+        }
+        os << "\n";
+    }
+
+    return os;
+}
+
+void
+WifiCoTraceHelper::AlignDecimal(std::vector<std::string>& column) const
+{
+    size_t maxPos = 0;
+    char decimal = '.';
+
+    for (auto& s : column)
+    {
+        size_t pos = s.find_first_of(decimal);
+        if (pos > maxPos)
+        {
+            maxPos = pos;
+        }
+    }
+
+    for (auto& s : column)
+    {
+        auto padding = std::string(maxPos - s.find_first_of(decimal), ' ');
+        s = padding + s;
+    }
+}
+
+void
+WifiCoTraceHelper::AlignWidth(std::vector<std::string>& column) const
+{
+    size_t maxWidth = 0;
+
+    for (auto& s : column)
+    {
+        size_t width = s.length();
+        if (width > maxWidth)
+        {
+            maxWidth = width;
+        }
+    }
+
+    for (auto& s : column)
+    {
+        auto padding = std::string(maxWidth - s.length(), ' ');
+        s = s + padding;
+    }
+}
+
+std::map<WifiPhyState, double>
+WifiCoTraceHelper::ComputePercentage(const std::map<WifiPhyState, Time>& linkStates) const
+{
+    NS_LOG_FUNCTION(this);
+    Time total;
+    for (const auto& it : linkStates)
+    {
+        total += it.second;
+    }
+
+    if (total.IsZero())
+    {
+        return {};
+    }
+
+    std::map<WifiPhyState, double> percents;
+    for (const auto& it : linkStates)
+    {
+        percents[it.first] = it.second.GetDouble() * 100.0 / total.GetDouble();
+    }
+
+    return percents;
+}
+
+const std::vector<WifiCoTraceHelper::DeviceRecord>&
+WifiCoTraceHelper::GetDeviceRecords() const
+{
+    return m_deviceRecords;
+}
+
+void
+WifiCoTraceHelper::NotifyWifiPhyState(std::size_t idx,
+                                      std::size_t phyId,
+                                      Time start,
+                                      Time duration,
+                                      WifiPhyState state)
+{
+    NS_LOG_FUNCTION(this << idx << phyId << start.As(Time::S) << duration.As(Time::US) << state);
+    NS_ASSERT_MSG(duration.IsPositive(), "Duration shouldn't be negative: " << duration.As());
+    NS_ASSERT_MSG(idx < m_deviceRecords.size(), "Index out-of-bounds");
+
+    // Compute duration that overlaps with [m_startTime, m_stopTime]
+    const auto overlappingDuration =
+        ComputeOverlappingDuration(m_startTime, m_stopTime, start, start + duration);
+
+    if (!overlappingDuration.IsZero())
+    {
+        const auto nodeId = m_deviceRecords[idx].m_nodeId;
+        const auto deviceId = m_deviceRecords[idx].m_ifIndex;
+        const auto device = NodeList::GetNode(nodeId)->GetDevice(deviceId);
+        const auto wifiDevice = DynamicCast<WifiNetDevice>(device);
+        NS_ASSERT_MSG(wifiDevice, "Error, Device type is not WifiNetDevice.");
+
+        auto linkId = wifiDevice->GetMac()->GetLinkForPhy(phyId);
+
+        if (linkId.has_value())
+        {
+            NS_LOG_INFO("Add device node "
+                        << m_deviceRecords[idx].m_nodeId << " index "
+                        << m_deviceRecords[idx].m_ifIndex << " linkId " << *linkId << " duration "
+                        << overlappingDuration.As(Time::US) << " state " << state);
+            m_deviceRecords[idx].AddLinkMeasurement(*linkId, start, overlappingDuration, state);
+        }
+        else
+        {
+            NS_LOG_DEBUG("LinkId not found for phyId:" << phyId);
+        }
+    }
+}
+
+Time
+WifiCoTraceHelper::ComputeOverlappingDuration(Time start1, Time stop1, Time start2, Time stop2)
+{
+    const auto Zero{Seconds(0)};
+
+    NS_ASSERT_MSG(start1 >= Zero && stop1 >= Zero && start1 <= stop1,
+                  "Interval: [" << start1 << "," << stop1 << "] is invalid.");
+    NS_ASSERT_MSG(start2 >= Zero && stop2 >= Zero && start2 <= stop2,
+                  "Interval: [" << start2 << "," << stop2 << "] is invalid.");
+
+    const auto maxStart = Max(start1, start2);
+    const auto minStop = Min(stop1, stop2);
+    const auto duration = minStop - maxStart;
+
+    return duration > Zero ? duration : Zero;
+}
+
+WifiCoTraceHelper::DeviceRecord::DeviceRecord(Ptr<WifiNetDevice> device)
+    : m_nodeId(device->GetNode()->GetId()),
+      m_ifIndex(device->GetIfIndex())
+{
+    NS_LOG_FUNCTION(this << device);
+    if (!Names::FindName(device->GetNode()).empty())
+    {
+        m_nodeName = Names::FindName(device->GetNode());
+    }
+    if (!Names::FindName(device).empty())
+    {
+        m_deviceName = Names::FindName(device);
+    }
+}
+
+void
+WifiCoTraceHelper::DeviceRecord::AddLinkMeasurement(size_t linkId,
+                                                    Time start,
+                                                    Time duration,
+                                                    WifiPhyState state)
+{
+    NS_LOG_FUNCTION(this << linkId << start.As(Time::S) << duration.As(Time::S) << state);
+    auto& stateDurations = m_linkStateDurations[linkId];
+    stateDurations[state] += duration;
+}
+
+} // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/helper/wifi-co-trace-helper.h ns-3.44/src/wifi/helper/wifi-co-trace-helper.h
--- ns-3.43/src/wifi/helper/wifi-co-trace-helper.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/wifi/helper/wifi-co-trace-helper.h	2025-03-09 16:55:49.779372700 -0700
@@ -0,0 +1,217 @@
+/*
+ * Copyright (c) 2024 Indraprastha Institute of Information Technology Delhi
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ */
+
+#ifndef WIFI_CO_HELPER_H
+#define WIFI_CO_HELPER_H
+
+#include "ns3/callback.h"
+#include "ns3/config.h"
+#include "ns3/nstime.h"
+#include "ns3/ptr.h"
+#include "ns3/simulator.h"
+#include "ns3/wifi-phy-state.h"
+
+#include <iostream>
+#include <map>
+#include <string>
+#include <vector>
+
+namespace ns3
+{
+
+class WifiNetDevice;
+class NodeContainer;
+class NetDeviceContainer;
+
+/**
+ * @class WifiCoTraceHelper
+ * @brief Track channel occupancy durations for WifiNetDevice
+ *
+ * The WifiCoTraceHelper class tracks the duration that a particular WifiNetDevice is in
+ * different states.  The states are defined by the ns-3 WifiPhyStateHelper and include states such
+ * as IDLE, CCA_BUSY, TX, and RX.  The helper tracks these durations between a user-configured start
+ * and end time.  At the end of a simulation, this helper can print out statistics on channel
+ * occupancy, and permits the export of an internal data structure to allow for custom printing or
+ * statistics handling.
+ *
+ * This helper supports both single-link devices and multi-link devices (MLD).
+ */
+class WifiCoTraceHelper
+{
+  public:
+    /**
+     * @struct DeviceRecord
+     * @brief Keeps track of channel occupancy statistics observed at a WifiNetDevice.
+     *
+     * Data structure to track durations of each WifiPhy state. Elements in m_linkStateDurations are
+     * indexed by "linkId".
+     */
+    struct DeviceRecord
+    {
+        uint32_t m_nodeId;        ///< Id of Node on which the WifiNetDevice is installed.
+        std::string m_nodeName;   ///< Name of Node on which the WifiNetDevice is installed. It's
+                                  ///< empty if the name isn't configured.
+        uint32_t m_ifIndex;       ///< Device Id of WifiNetDevice.
+        std::string m_deviceName; ///< Device name. It's empty if the name isn't configured.
+
+        /**
+         * Duration statistics by link and state. LinkId is the key in the
+         * first map, and the WifiPhyState is the key to the second.
+         */
+        std::map<uint8_t, std::map<WifiPhyState, Time>> m_linkStateDurations;
+
+        /**
+         * Constructor.
+         *
+         * @param device The WifiNetDevice whose links will be monitored to collect statistics.
+         */
+        DeviceRecord(Ptr<WifiNetDevice> device);
+
+        /**
+         * Update the duration statistics for the provided linkId and state
+         *
+         * @param linkId Id of Link whose statistics is updated.
+         * @param start Time at which link switched its WifiPhyState to state.
+         * @param duration Duration of time that the link stayed in this state.
+         * @param state The state of the link from start to (start + duration).
+         */
+        void AddLinkMeasurement(size_t linkId, Time start, Time duration, WifiPhyState state);
+    };
+
+    /**
+     * Default Constructor. StartTime is Seconds(0) and stopTime is Time::Max()
+     */
+    WifiCoTraceHelper();
+
+    /**
+     * Construct a helper object measuring between two simulation time points [startTime, stopTime]
+     *
+     * @param startTime The measurement start time
+     * @param stopTime The measurement stop time
+     */
+    WifiCoTraceHelper(Time startTime, Time stopTime);
+
+    /**
+     * Enables trace collection for all nodes and WifiNetDevices in the specified NodeContainer.
+     * @param nodes The NodeContainer containing WifiNetDevices to which traces are to be connected.
+     */
+    void Enable(NodeContainer nodes);
+    /**
+     * Enables trace collection for all nodes corresponding to the devices in the specified
+     * NetDeviceContainer.
+     * @param devices The NetDeviceContainer to which traces are to be connected.
+     */
+    void Enable(NetDeviceContainer devices);
+
+    /**
+     * Starts the collection of statistics from a specified start time.
+     * @param startTime The time to start collecting statistics.
+     */
+    void Start(Time startTime);
+
+    /**
+     * Stops the collection of statistics at a specified time.
+     * @param stopTime The time to stop collecting statistics.
+     */
+    void Stop(Time stopTime);
+
+    /**
+     * Resets the current statistics, clearing all links and their durations. It does not disconnect
+     * traced callbacks. It does not clear DeviceRecords. Only the statistics collected prior to
+     * invoking this method is cleared.
+     */
+    void Reset();
+
+    /**
+     * Print measurement results on an output stream
+     *
+     * @param os The output stream to print to
+     * @param unit The unit of time in which the durations should be printed. Defaults to AUTO.
+     */
+    void PrintStatistics(std::ostream& os, Time::Unit unit = Time::Unit::AUTO) const;
+
+    /**
+     * Returns measurement results on each installed device.
+     *
+     * @return Statistics of each device traced by this helper.
+     */
+    const std::vector<DeviceRecord>& GetDeviceRecords() const;
+
+  private:
+    uint32_t m_numDevices{0};     ///< Count the number of devices traced by this helper.
+    Time m_startTime;             ///< Instant at which statistics collection should start.
+    Time m_stopTime{Time::Max()}; ///< Instant at which statistics collection should stop.
+
+    std::vector<DeviceRecord> m_deviceRecords; ///< Stores the collected statistics.
+
+    /**
+     * A callback used to update statistics.
+     *
+     * @param idx Index of the device in m_deviceRecords vector.
+     * @param phyId Id of Phy whose state is switched.
+     * @param start Instant at which link switched its WifiPhyState to state.
+     * @param duration Duration of time the link stays in this state.
+     * @param state The state of the link from start to (start + duration).
+     */
+    void NotifyWifiPhyState(std::size_t idx,
+                            std::size_t phyId,
+                            Time start,
+                            Time duration,
+                            WifiPhyState state);
+
+    /**
+     * Compute overlapping time-duration between two intervals. It is a helper function used by
+     * NotifyWifiPhyState function.
+     *
+     * @param start1 Beginning of first interval
+     * @param stop1 End of first interval
+     * @param start2 Beginning of second interval
+     * @param stop2 End of second interval
+     * @return Return the time duration common between the two intervals.
+     */
+    Time ComputeOverlappingDuration(Time start1, Time stop1, Time start2, Time stop2);
+    /**
+     * A helper function used by PrintStatistics method. It converts absolute statistics to
+     * percentages.
+     *
+     * @param linkStates Statistics of a link.
+     * @return Statistics in percentages.
+     */
+    std::map<WifiPhyState, double> ComputePercentage(
+        const std::map<WifiPhyState, Time>& linkStates) const;
+
+    /**
+     * A helper function used by PrintStatistics method. It prints statistics of a link.
+     *
+     * @param os The output stream to print to
+     * @param linkStates Statistics of a link.
+     * @param unit The unit of time in which the durations should be printed.
+     * @return The output stream after IO operations.
+     */
+    std::ostream& PrintLinkStates(std::ostream& os,
+                                  const std::map<WifiPhyState, Time>& linkStates,
+                                  Time::Unit unit) const;
+
+    /**
+     * A helper function used by PrintLinkStates method to format the output. It pads each string at
+     * left with space characters such that the decimal points are at the same position.
+     *
+     * @param column A column of strings. Each string must contain a decimal point.
+     */
+    void AlignDecimal(std::vector<std::string>& column) const;
+
+    /**
+     * A helper function used by PrintLinkStates method to format the output. It pads each string at
+     * right with space characters such that all strings have same width.
+     *
+     * @param column A column of strings.
+     */
+    void AlignWidth(std::vector<std::string>& column) const;
+};
+
+} // namespace ns3
+
+#endif
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/helper/wifi-helper.cc ns-3.44/src/wifi/helper/wifi-helper.cc
--- ns-3.43/src/wifi/helper/wifi-helper.cc	2024-10-09 16:41:10.112656800 -0700
+++ ns-3.44/src/wifi/helper/wifi-helper.cc	2025-03-09 16:55:49.779372700 -0700
@@ -14,6 +14,7 @@
 #include "ns3/ap-wifi-mac.h"
 #include "ns3/config.h"
 #include "ns3/eht-configuration.h"
+#include "ns3/eht-ppdu.h"
 #include "ns3/he-configuration.h"
 #include "ns3/ht-configuration.h"
 #include "ns3/log.h"
@@ -30,8 +31,26 @@
 #include "ns3/wifi-mac-queue.h"
 #include "ns3/wifi-mac-trailer.h"
 
+#include <bit>
 #include <memory>
 
+namespace
+{
+/**
+ * Helper function to place the value to set in the correct bit(s) of a radiotap subfield.
+ *
+ * @param mask the mask of the corresponding subfield
+ * @param val the value the subfield should be set to
+ * @return the value placed at the correct position based on the mask
+ */
+uint32_t
+GetRadiotapField(uint32_t mask, uint32_t val)
+{
+    const auto shift = std::countr_zero(mask);
+    return (val << shift) & mask;
+}
+} // namespace
+
 namespace ns3
 {
 
@@ -39,12 +58,12 @@
 
 /**
  * ASCII trace PHY transmit sink with context
- * \param stream the output stream
- * \param context the context name
- * \param p the packet
- * \param mode the wifi mode
- * \param preamble the wifi preamble
- * \param txLevel the transmit power level
+ * @param stream the output stream
+ * @param context the context name
+ * @param p the packet
+ * @param mode the wifi mode
+ * @param preamble the wifi preamble
+ * @param txLevel the transmit power level
  */
 static void
 AsciiPhyTransmitSinkWithContext(Ptr<OutputStreamWrapper> stream,
@@ -64,11 +83,11 @@
 
 /**
  * ASCII trace PHY transmit sink without context
- * \param stream the output stream
- * \param p the packet
- * \param mode the wifi mode
- * \param preamble the wifi preamble
- * \param txLevel the transmit power level
+ * @param stream the output stream
+ * @param p the packet
+ * @param mode the wifi mode
+ * @param preamble the wifi preamble
+ * @param txLevel the transmit power level
  */
 static void
 AsciiPhyTransmitSinkWithoutContext(Ptr<OutputStreamWrapper> stream,
@@ -87,12 +106,12 @@
 
 /**
  * ASCII trace PHY receive sink with context
- * \param stream the output stream
- * \param context the context name
- * \param p the packet
- * \param snr the SNR
- * \param mode the wifi mode
- * \param preamble the wifi preamble
+ * @param stream the output stream
+ * @param context the context name
+ * @param p the packet
+ * @param snr the SNR
+ * @param mode the wifi mode
+ * @param preamble the wifi preamble
  */
 static void
 AsciiPhyReceiveSinkWithContext(Ptr<OutputStreamWrapper> stream,
@@ -112,11 +131,11 @@
 
 /**
  * ASCII trace PHY receive sink without context
- * \param stream the output stream
- * \param p the packet
- * \param snr the SNR
- * \param mode the wifi mode
- * \param preamble the wifi preamble
+ * @param stream the output stream
+ * @param p the packet
+ * @param snr the SNR
+ * @param mode the wifi mode
+ * @param preamble the wifi preamble
  */
 static void
 AsciiPhyReceiveSinkWithoutContext(Ptr<OutputStreamWrapper> stream,
@@ -247,7 +266,13 @@
     case PcapHelper::DLT_IEEE802_11_RADIO: {
         Ptr<Packet> p = packet->Copy();
         RadiotapHeader header;
-        GetRadiotapHeader(header, p, channelFreqMhz, txVector, aMpdu, staId);
+        GetRadiotapHeader(header,
+                          p,
+                          channelFreqMhz,
+                          info->device->GetPhy(phyId)->GetPrimary20Index(),
+                          txVector,
+                          aMpdu,
+                          staId);
         p->AddHeader(header);
         file->Write(Simulator::Now(), p);
         return;
@@ -284,7 +309,14 @@
     case PcapHelper::DLT_IEEE802_11_RADIO: {
         Ptr<Packet> p = packet->Copy();
         RadiotapHeader header;
-        GetRadiotapHeader(header, p, channelFreqMhz, txVector, aMpdu, staId, signalNoise);
+        GetRadiotapHeader(header,
+                          p,
+                          channelFreqMhz,
+                          info->device->GetPhy(phyId)->GetPrimary20Index(),
+                          txVector,
+                          aMpdu,
+                          staId,
+                          signalNoise);
         p->AddHeader(header);
         file->Write(Simulator::Now(), p);
         return;
@@ -298,127 +330,124 @@
 WifiPhyHelper::GetRadiotapHeader(RadiotapHeader& header,
                                  Ptr<Packet> packet,
                                  uint16_t channelFreqMhz,
-                                 WifiTxVector txVector,
+                                 uint8_t p20Index,
+                                 const WifiTxVector& txVector,
                                  MpduInfo aMpdu,
                                  uint16_t staId,
                                  SignalNoiseDbm signalNoise)
 {
     header.SetAntennaSignalPower(signalNoise.signal);
     header.SetAntennaNoisePower(signalNoise.noise);
-    GetRadiotapHeader(header, packet, channelFreqMhz, txVector, aMpdu, staId);
+    GetRadiotapHeader(header, packet, channelFreqMhz, p20Index, txVector, aMpdu, staId);
 }
 
 void
 WifiPhyHelper::GetRadiotapHeader(RadiotapHeader& header,
                                  Ptr<Packet> packet,
                                  uint16_t channelFreqMhz,
-                                 WifiTxVector txVector,
+                                 uint8_t p20Index,
+                                 const WifiTxVector& txVector,
                                  MpduInfo aMpdu,
                                  uint16_t staId)
 {
-    WifiPreamble preamble = txVector.GetPreambleType();
+    const auto preamble = txVector.GetPreambleType();
+    const auto modClass = txVector.GetModulationClass();
+    const auto channelWidth = txVector.GetChannelWidth();
+    const auto gi = txVector.GetGuardInterval();
 
-    uint8_t frameFlags = RadiotapHeader::FRAME_FLAG_NONE;
     header.SetTsft(Simulator::Now().GetMicroSeconds());
 
+    uint8_t frameFlags = RadiotapHeader::FRAME_FLAG_NONE;
     // Our capture includes the FCS, so we set the flag to say so.
     frameFlags |= RadiotapHeader::FRAME_FLAG_FCS_INCLUDED;
-
     if (preamble == WIFI_PREAMBLE_SHORT)
     {
         frameFlags |= RadiotapHeader::FRAME_FLAG_SHORT_PREAMBLE;
     }
-
-    if (txVector.GetGuardInterval().GetNanoSeconds() == 400)
+    if (gi.GetNanoSeconds() == 400)
     {
         frameFlags |= RadiotapHeader::FRAME_FLAG_SHORT_GUARD;
     }
-
     header.SetFrameFlags(frameFlags);
 
+    uint8_t mcs = 0;
+    uint8_t nss = 1;
     uint64_t rate = 0;
-    if (txVector.GetMode(staId).GetModulationClass() != WIFI_MOD_CLASS_HT &&
-        txVector.GetMode(staId).GetModulationClass() != WIFI_MOD_CLASS_VHT &&
-        txVector.GetMode(staId).GetModulationClass() != WIFI_MOD_CLASS_HE)
-    {
-        rate = txVector.GetMode(staId).GetDataRate(txVector.GetChannelWidth(),
-                                                   txVector.GetGuardInterval(),
-                                                   1) *
-               txVector.GetNss(staId) / 500000;
+    if (modClass < WIFI_MOD_CLASS_HT)
+    {
+        rate = txVector.GetMode(staId).GetDataRate(channelWidth, gi, 1) * nss / 500000;
         header.SetRate(static_cast<uint8_t>(rate));
     }
+    else
+    {
+        mcs = txVector.GetMode(staId).GetMcsValue();
+        nss = txVector.GetNss(staId);
+    }
 
-    uint16_t channelFlags = 0;
+    RadiotapHeader::ChannelFields channelFields{.frequency = channelFreqMhz};
     switch (rate)
     {
     case 2:  // 1Mbps
     case 4:  // 2Mbps
     case 10: // 5Mbps
     case 22: // 11Mbps
-        channelFlags |= RadiotapHeader::CHANNEL_FLAG_CCK;
+        channelFields.flags |= RadiotapHeader::CHANNEL_FLAG_CCK;
         break;
     default:
-        channelFlags |= RadiotapHeader::CHANNEL_FLAG_OFDM;
+        channelFields.flags |= RadiotapHeader::CHANNEL_FLAG_OFDM;
         break;
     }
-
     if (channelFreqMhz < 2500)
     {
-        channelFlags |= RadiotapHeader::CHANNEL_FLAG_SPECTRUM_2GHZ;
+        channelFields.flags |= RadiotapHeader::CHANNEL_FLAG_SPECTRUM_2GHZ;
     }
     else
     {
-        channelFlags |= RadiotapHeader::CHANNEL_FLAG_SPECTRUM_5GHZ;
+        channelFields.flags |= RadiotapHeader::CHANNEL_FLAG_SPECTRUM_5GHZ;
     }
+    header.SetChannelFields(channelFields);
 
-    header.SetChannelFrequencyAndFlags(channelFreqMhz, channelFlags);
-
-    if (txVector.GetMode(staId).GetModulationClass() == WIFI_MOD_CLASS_HT)
+    if (modClass == WIFI_MOD_CLASS_HT)
     {
-        uint8_t mcsKnown = RadiotapHeader::MCS_KNOWN_NONE;
-        uint8_t mcsFlags = RadiotapHeader::MCS_FLAGS_NONE;
+        RadiotapHeader::McsFields mcsFields{.mcs = mcs};
 
-        mcsKnown |= RadiotapHeader::MCS_KNOWN_INDEX;
+        mcsFields.known |= RadiotapHeader::MCS_KNOWN_INDEX | RadiotapHeader::MCS_KNOWN_BANDWIDTH |
+                           RadiotapHeader::MCS_KNOWN_GUARD_INTERVAL |
+                           RadiotapHeader::MCS_KNOWN_HT_FORMAT | RadiotapHeader::MCS_KNOWN_NESS |
+                           RadiotapHeader::MCS_KNOWN_FEC_TYPE | RadiotapHeader::MCS_KNOWN_STBC;
 
-        mcsKnown |= RadiotapHeader::MCS_KNOWN_BANDWIDTH;
-        if (txVector.GetChannelWidth() == 40)
+        if (channelWidth == MHz_u{40})
         {
-            mcsFlags |= RadiotapHeader::MCS_FLAGS_BANDWIDTH_40;
+            mcsFields.flags |= RadiotapHeader::MCS_FLAGS_BANDWIDTH_40;
         }
 
-        mcsKnown |= RadiotapHeader::MCS_KNOWN_GUARD_INTERVAL;
-        if (txVector.GetGuardInterval().GetNanoSeconds() == 400)
+        if (gi.GetNanoSeconds() == 400)
         {
-            mcsFlags |= RadiotapHeader::MCS_FLAGS_GUARD_INTERVAL;
+            mcsFields.flags |= RadiotapHeader::MCS_FLAGS_GUARD_INTERVAL;
         }
 
-        mcsKnown |= RadiotapHeader::MCS_KNOWN_HT_FORMAT;
-
-        mcsKnown |= RadiotapHeader::MCS_KNOWN_NESS;
-        if (txVector.GetNess() & 0x01) // bit 1
+        const auto ness = txVector.GetNess();
+        if (ness & 0x01) // bit 1
         {
-            mcsFlags |= RadiotapHeader::MCS_FLAGS_NESS_BIT_0;
+            mcsFields.flags |= RadiotapHeader::MCS_FLAGS_NESS_BIT_0;
         }
-        if (txVector.GetNess() & 0x02) // bit 2
+        if (ness & 0x02) // bit 2
         {
-            mcsKnown |= RadiotapHeader::MCS_KNOWN_NESS_BIT_1;
+            mcsFields.flags |= RadiotapHeader::MCS_KNOWN_NESS_BIT_1;
         }
 
-        mcsKnown |= RadiotapHeader::MCS_KNOWN_FEC_TYPE; // only BCC is currently supported
-
-        mcsKnown |= RadiotapHeader::MCS_KNOWN_STBC;
         if (txVector.IsStbc())
         {
-            mcsFlags |= RadiotapHeader::MCS_FLAGS_STBC_STREAMS;
+            mcsFields.flags |= RadiotapHeader::MCS_FLAGS_STBC_STREAMS;
         }
 
-        header.SetMcsFields(mcsKnown, mcsFlags, txVector.GetMode(staId).GetMcsValue());
+        header.SetMcsFields(mcsFields);
     }
 
     if (txVector.IsAggregation())
     {
-        uint16_t ampduStatusFlags = RadiotapHeader::A_MPDU_STATUS_NONE;
-        ampduStatusFlags |= RadiotapHeader::A_MPDU_STATUS_LAST_KNOWN;
+        RadiotapHeader::AmpduStatusFields ampduStatusFields{.referenceNumber = aMpdu.mpduRefNumber};
+        ampduStatusFields.flags |= RadiotapHeader::A_MPDU_STATUS_LAST_KNOWN;
         /* For PCAP file, MPDU Delimiter and Padding should be removed by the MAC Driver */
         AmpduSubframeHeader hdr;
         uint32_t extractedLength;
@@ -427,163 +456,325 @@
         packet = packet->CreateFragment(0, static_cast<uint32_t>(extractedLength));
         if (aMpdu.type == LAST_MPDU_IN_AGGREGATE || (hdr.GetEof() && hdr.GetLength() > 0))
         {
-            ampduStatusFlags |= RadiotapHeader::A_MPDU_STATUS_LAST;
+            ampduStatusFields.flags |= RadiotapHeader::A_MPDU_STATUS_LAST;
         }
-        header.SetAmpduStatus(aMpdu.mpduRefNumber, ampduStatusFlags, 1 /*CRC*/);
+        header.SetAmpduStatus(ampduStatusFields);
     }
 
-    if (txVector.GetMode(staId).GetModulationClass() == WIFI_MOD_CLASS_VHT)
+    if (modClass == WIFI_MOD_CLASS_VHT)
     {
-        uint16_t vhtKnown = RadiotapHeader::VHT_KNOWN_NONE;
-        uint8_t vhtFlags = RadiotapHeader::VHT_FLAGS_NONE;
-        uint8_t vhtBandwidth = 0;
-        uint8_t vhtMcsNss[4] = {0, 0, 0, 0};
-        uint8_t vhtCoding = 0;
-        uint8_t vhtGroupId = 0;
-        uint16_t vhtPartialAid = 0;
+        RadiotapHeader::VhtFields vhtFields{};
 
-        vhtKnown |= RadiotapHeader::VHT_KNOWN_STBC;
+        vhtFields.known |= RadiotapHeader::VHT_KNOWN_STBC;
         if (txVector.IsStbc())
         {
-            vhtFlags |= RadiotapHeader::VHT_FLAGS_STBC;
+            vhtFields.flags |= RadiotapHeader::VHT_FLAGS_STBC;
         }
 
-        vhtKnown |= RadiotapHeader::VHT_KNOWN_GUARD_INTERVAL;
-        if (txVector.GetGuardInterval().GetNanoSeconds() == 400)
+        vhtFields.known |= RadiotapHeader::VHT_KNOWN_GUARD_INTERVAL;
+        if (gi.GetNanoSeconds() == 400)
         {
-            vhtFlags |= RadiotapHeader::VHT_FLAGS_GUARD_INTERVAL;
+            vhtFields.flags |= RadiotapHeader::VHT_FLAGS_GUARD_INTERVAL;
         }
 
-        vhtKnown |= RadiotapHeader::VHT_KNOWN_BEAMFORMED; // Beamforming is currently not supported
-
-        vhtKnown |= RadiotapHeader::VHT_KNOWN_BANDWIDTH;
-        // not all bandwidth values are currently supported
-        if (txVector.GetChannelWidth() == 40)
+        vhtFields.known |=
+            RadiotapHeader::VHT_KNOWN_BEAMFORMED | RadiotapHeader::VHT_KNOWN_BANDWIDTH;
+        // TODO: bandwidths can be provided with sideband info
+        if (channelWidth == MHz_u{40})
         {
-            vhtBandwidth = 1;
+            vhtFields.bandwidth = 1;
         }
-        else if (txVector.GetChannelWidth() == 80)
+        else if (channelWidth == MHz_u{80})
         {
-            vhtBandwidth = 4;
+            vhtFields.bandwidth = 4;
         }
-        else if (txVector.GetChannelWidth() == 160)
+        else if (channelWidth == MHz_u{160})
         {
-            vhtBandwidth = 11;
+            vhtFields.bandwidth = 11;
         }
 
         // only SU PPDUs are currently supported
-        vhtMcsNss[0] |= (txVector.GetNss(staId) & 0x0f);
-        vhtMcsNss[0] |= ((txVector.GetMode(staId).GetMcsValue() << 4) & 0xf0);
+        vhtFields.mcsNss.at(0) |= (nss & 0x0f) | ((mcs << 4) & 0xf0);
 
-        header.SetVhtFields(vhtKnown,
-                            vhtFlags,
-                            vhtBandwidth,
-                            vhtMcsNss,
-                            vhtCoding,
-                            vhtGroupId,
-                            vhtPartialAid);
+        header.SetVhtFields(vhtFields);
     }
 
-    if (txVector.GetMode(staId).GetModulationClass() == WIFI_MOD_CLASS_HE)
+    if (modClass == WIFI_MOD_CLASS_HE)
     {
-        uint16_t data1 = RadiotapHeader::HE_DATA1_BSS_COLOR_KNOWN |
+        RadiotapHeader::HeFields heFields{};
+        heFields.data1 = RadiotapHeader::HE_DATA1_BSS_COLOR_KNOWN |
                          RadiotapHeader::HE_DATA1_DATA_MCS_KNOWN |
                          RadiotapHeader::HE_DATA1_BW_RU_ALLOC_KNOWN;
         if (preamble == WIFI_PREAMBLE_HE_ER_SU)
         {
-            data1 |= RadiotapHeader::HE_DATA1_FORMAT_EXT_SU;
+            heFields.data1 |= RadiotapHeader::HE_DATA1_FORMAT_EXT_SU;
         }
         else if (preamble == WIFI_PREAMBLE_HE_MU)
         {
-            data1 |= RadiotapHeader::HE_DATA1_FORMAT_MU;
-            data1 |= RadiotapHeader::HE_DATA1_SPTL_REUSE2_KNOWN;
+            heFields.data1 |=
+                RadiotapHeader::HE_DATA1_FORMAT_MU | RadiotapHeader::HE_DATA1_SPTL_REUSE2_KNOWN;
         }
         else if (preamble == WIFI_PREAMBLE_HE_TB)
         {
-            data1 |= RadiotapHeader::HE_DATA1_FORMAT_TRIG;
+            heFields.data1 |= RadiotapHeader::HE_DATA1_FORMAT_TRIG;
         }
 
-        uint16_t data2 = RadiotapHeader::HE_DATA2_GI_KNOWN;
+        heFields.data2 = RadiotapHeader::HE_DATA2_GI_KNOWN;
         if (preamble == WIFI_PREAMBLE_HE_MU || preamble == WIFI_PREAMBLE_HE_TB)
         {
-            data2 |= RadiotapHeader::HE_DATA2_RU_OFFSET_KNOWN;
-            // HeRu indices start at 1 whereas RadioTap starts at 0
-            data2 |= (((txVector.GetHeMuUserInfo(staId).ru.GetIndex() - 1) << 8) & 0x3f00);
-            data2 |= (((!txVector.GetHeMuUserInfo(staId).ru.GetPrimary80MHz()) << 15) & 0x8000);
-        }
-
-        uint16_t data3 = 0;
-        data3 |= (txVector.GetBssColor() & 0x003f);
-        data3 |= ((txVector.GetMode(staId).GetMcsValue() << 8) & 0x0f00);
+            heFields.data2 |=
+                RadiotapHeader::HE_DATA2_RU_OFFSET_KNOWN |
+                // HeRu indices start at 1 whereas RadioTap starts at 0
+                GetRadiotapField(RadiotapHeader::HE_DATA2_RU_OFFSET,
+                                 txVector.GetHeMuUserInfo(staId).ru.GetIndex() - 1) |
+                GetRadiotapField(RadiotapHeader::HE_DATA2_PRISEC_80_SEC,
+                                 !txVector.GetHeMuUserInfo(staId).ru.GetPrimary80MHz());
+        }
+
+        heFields.data3 =
+            GetRadiotapField(RadiotapHeader::HE_DATA3_BSS_COLOR, txVector.GetBssColor()) |
+            GetRadiotapField(RadiotapHeader::HE_DATA3_DATA_MCS, mcs);
+
+        heFields.data4 = (preamble == WIFI_PREAMBLE_HE_MU)
+                             ? GetRadiotapField(RadiotapHeader::HE_DATA4_MU_STA_ID, staId)
+                             : 0;
 
-        uint16_t data4 = 0;
-        if (preamble == WIFI_PREAMBLE_HE_MU)
-        {
-            data4 |= ((staId << 4) & 0x7ff0);
-        }
-
-        uint16_t data5 = 0;
+        heFields.data5 = 0;
         if (preamble == WIFI_PREAMBLE_HE_MU || preamble == WIFI_PREAMBLE_HE_TB)
         {
             HeRu::RuType ruType = txVector.GetHeMuUserInfo(staId).ru.GetRuType();
             switch (ruType)
             {
             case HeRu::RU_26_TONE:
-                data5 |= RadiotapHeader::HE_DATA5_DATA_BW_RU_ALLOC_26T;
+                heFields.data5 |= RadiotapHeader::HE_DATA5_DATA_BW_RU_ALLOC_26T;
                 break;
             case HeRu::RU_52_TONE:
-                data5 |= RadiotapHeader::HE_DATA5_DATA_BW_RU_ALLOC_52T;
+                heFields.data5 |= RadiotapHeader::HE_DATA5_DATA_BW_RU_ALLOC_52T;
                 break;
             case HeRu::RU_106_TONE:
-                data5 |= RadiotapHeader::HE_DATA5_DATA_BW_RU_ALLOC_106T;
+                heFields.data5 |= RadiotapHeader::HE_DATA5_DATA_BW_RU_ALLOC_106T;
                 break;
             case HeRu::RU_242_TONE:
-                data5 |= RadiotapHeader::HE_DATA5_DATA_BW_RU_ALLOC_242T;
+                heFields.data5 |= RadiotapHeader::HE_DATA5_DATA_BW_RU_ALLOC_242T;
                 break;
             case HeRu::RU_484_TONE:
-                data5 |= RadiotapHeader::HE_DATA5_DATA_BW_RU_ALLOC_484T;
+                heFields.data5 |= RadiotapHeader::HE_DATA5_DATA_BW_RU_ALLOC_484T;
                 break;
             case HeRu::RU_996_TONE:
-                data5 |= RadiotapHeader::HE_DATA5_DATA_BW_RU_ALLOC_996T;
+                heFields.data5 |= RadiotapHeader::HE_DATA5_DATA_BW_RU_ALLOC_996T;
                 break;
             case HeRu::RU_2x996_TONE:
-                data5 |= RadiotapHeader::HE_DATA5_DATA_BW_RU_ALLOC_2x996T;
+                heFields.data5 |= RadiotapHeader::HE_DATA5_DATA_BW_RU_ALLOC_2x996T;
                 break;
             default:
                 NS_ABORT_MSG("Unexpected RU type");
             }
         }
-        else if (txVector.GetChannelWidth() == 40)
+        else if (channelWidth == MHz_u{40})
         {
-            data5 |= RadiotapHeader::HE_DATA5_DATA_BW_RU_ALLOC_40MHZ;
+            heFields.data5 |= RadiotapHeader::HE_DATA5_DATA_BW_RU_ALLOC_40MHZ;
         }
-        else if (txVector.GetChannelWidth() == 80)
+        else if (channelWidth == MHz_u{80})
         {
-            data5 |= RadiotapHeader::HE_DATA5_DATA_BW_RU_ALLOC_80MHZ;
+            heFields.data5 |= RadiotapHeader::HE_DATA5_DATA_BW_RU_ALLOC_80MHZ;
         }
-        else if (txVector.GetChannelWidth() == 160)
+        else if (channelWidth == MHz_u{160})
         {
-            data5 |= RadiotapHeader::HE_DATA5_DATA_BW_RU_ALLOC_160MHZ;
+            heFields.data5 |= RadiotapHeader::HE_DATA5_DATA_BW_RU_ALLOC_160MHZ;
         }
-        if (txVector.GetGuardInterval().GetNanoSeconds() == 1600)
+        if (gi.GetNanoSeconds() == 1600)
         {
-            data5 |= RadiotapHeader::HE_DATA5_GI_1_6;
+            heFields.data5 |= RadiotapHeader::HE_DATA5_GI_1_6;
         }
-        else if (txVector.GetGuardInterval().GetNanoSeconds() == 3200)
+        else if (gi.GetNanoSeconds() == 3200)
         {
-            data5 |= RadiotapHeader::HE_DATA5_GI_3_2;
+            heFields.data5 |= RadiotapHeader::HE_DATA5_GI_3_2;
         }
 
-        header.SetHeFields(data1, data2, data3, data4, data5, 0);
+        header.SetHeFields(heFields);
     }
 
     if (preamble == WIFI_PREAMBLE_HE_MU)
     {
-        // TODO: fill in fields (everything is set to 0 so far)
-        std::array<uint8_t, 4> ruChannel1;
-        std::array<uint8_t, 4> ruChannel2;
-        header.SetHeMuFields(0, 0, ruChannel1, ruChannel2);
-        header.SetHeMuPerUserFields(0, 0, 0, 0);
+        RadiotapHeader::HeMuFields heMuFields{};
+        // TODO: fill in fields
+        header.SetHeMuFields(heMuFields);
+        RadiotapHeader::HeMuOtherUserFields heMuOtherUserFields{};
+        // TODO: fill in fields
+        header.SetHeMuOtherUserFields(heMuOtherUserFields);
+    }
+
+    if (IsEht(preamble))
+    {
+        RadiotapHeader::UsigFields usigFields{};
+        usigFields.common = RadiotapHeader::USIG_COMMON_PHY_VER_KNOWN |
+                            RadiotapHeader::USIG_COMMON_BW_KNOWN |
+                            RadiotapHeader::USIG_COMMON_BSS_COLOR_KNOWN;
+        switch (static_cast<uint16_t>(channelWidth))
+        {
+        case 20:
+            usigFields.common |= GetRadiotapField(RadiotapHeader::USIG_COMMON_BW,
+                                                  RadiotapHeader::USIG_COMMON_BW_20MHZ);
+            break;
+        case 40:
+            usigFields.common |= GetRadiotapField(RadiotapHeader::USIG_COMMON_BW,
+                                                  RadiotapHeader::USIG_COMMON_BW_40MHZ);
+            break;
+        case 80:
+            usigFields.common |= GetRadiotapField(RadiotapHeader::USIG_COMMON_BW,
+                                                  RadiotapHeader::USIG_COMMON_BW_80MHZ);
+            break;
+        case 160:
+            usigFields.common |= GetRadiotapField(RadiotapHeader::USIG_COMMON_BW,
+                                                  RadiotapHeader::USIG_COMMON_BW_160MHZ);
+            break;
+        default:
+            NS_ABORT_MSG("Unexpected channel width");
+            break;
+        }
+        usigFields.common |=
+            GetRadiotapField(RadiotapHeader::USIG_COMMON_BSS_COLOR, txVector.GetBssColor());
+        if (preamble == WIFI_PREAMBLE_EHT_MU)
+        {
+            usigFields.mask = RadiotapHeader::USIG2_MU_B0_B1_PPDU_TYPE |
+                              RadiotapHeader::USIG2_MU_B9_B10_SIG_MCS |
+                              RadiotapHeader::USIG2_MU_B3_B7_PUNCTURED_INFO;
+            usigFields.value = GetRadiotapField(RadiotapHeader::USIG2_MU_B0_B1_PPDU_TYPE,
+                                                txVector.GetEhtPpduType()) |
+                               GetRadiotapField(RadiotapHeader::USIG2_MU_B9_B10_SIG_MCS,
+                                                txVector.GetSigBMode().GetMcsValue());
+            std::optional<bool> isLow80MHz;
+            if (txVector.IsDlMu() && channelWidth > MHz_u{80})
+            {
+                const auto isLowP80 = p20Index < (channelWidth / MHz_u{40});
+                const auto isP80 = txVector.GetHeMuUserInfo(staId).ru.GetPrimary80MHz();
+                isLow80MHz = (isLowP80 && isP80) || (!isLowP80 && !isP80);
+            }
+            const auto puncturedChannelInfo =
+                EhtPpdu::GetPuncturedInfo(txVector.GetInactiveSubchannels(),
+                                          txVector.GetEhtPpduType(),
+                                          isLow80MHz);
+            usigFields.value |= GetRadiotapField(RadiotapHeader::USIG2_MU_B3_B7_PUNCTURED_INFO,
+                                                 puncturedChannelInfo);
+        }
+        else
+        {
+            usigFields.mask = RadiotapHeader::USIG2_TB_B0_B1_PPDU_TYPE;
+            usigFields.value = GetRadiotapField(RadiotapHeader::USIG2_TB_B0_B1_PPDU_TYPE,
+                                                txVector.GetEhtPpduType());
+        }
+        header.SetUsigFields(usigFields);
+    }
+
+    if (preamble == WIFI_PREAMBLE_EHT_MU)
+    {
+        RadiotapHeader::EhtFields ehtFields{};
+        ehtFields.known = RadiotapHeader::EHT_KNOWN_GI | RadiotapHeader::EHT_KNOWN_RU_MRU_SIZE_OM |
+                          RadiotapHeader::EHT_KNOWN_RU_MRU_INDEX_OM;
+        switch (gi.GetNanoSeconds())
+        {
+        case 800:
+            ehtFields.data.at(0) =
+                GetRadiotapField(RadiotapHeader::EHT_DATA0_GI, RadiotapHeader::EHT_DATA0_GI_800_NS);
+            break;
+        case 1600:
+            ehtFields.data.at(0) = GetRadiotapField(RadiotapHeader::EHT_DATA0_GI,
+                                                    RadiotapHeader::EHT_DATA0_GI_1600_NS);
+            break;
+        case 3200:
+            ehtFields.data.at(0) = GetRadiotapField(RadiotapHeader::EHT_DATA0_GI,
+                                                    RadiotapHeader::EHT_DATA0_GI_3200_NS);
+            break;
+        default:
+            NS_ABORT_MSG("Unexpected guard interval");
+            break;
+        }
+        ehtFields.data.at(1) = RadiotapHeader::EHT_DATA1_RU_ALLOC_CC_1_1_1_KNOWN;
+        const auto ruType = (txVector.GetEhtPpduType() == 1) ? HeRu::GetRuType(channelWidth)
+                                                             : txVector.GetRu(staId).GetRuType();
+        switch (ruType)
+        {
+        case HeRu::RU_26_TONE:
+            ehtFields.data.at(1) |= GetRadiotapField(RadiotapHeader::EHT_DATA1_RU_MRU_SIZE,
+                                                     RadiotapHeader::EHT_DATA1_RU_MRU_SIZE_26);
+            break;
+        case HeRu::RU_52_TONE:
+            ehtFields.data.at(1) |= GetRadiotapField(RadiotapHeader::EHT_DATA1_RU_MRU_SIZE,
+                                                     RadiotapHeader::EHT_DATA1_RU_MRU_SIZE_52);
+            break;
+        case HeRu::RU_106_TONE:
+            ehtFields.data.at(1) |= GetRadiotapField(RadiotapHeader::EHT_DATA1_RU_MRU_SIZE,
+                                                     RadiotapHeader::EHT_DATA1_RU_MRU_SIZE_106);
+            break;
+        case HeRu::RU_242_TONE:
+            ehtFields.data.at(1) |= GetRadiotapField(RadiotapHeader::EHT_DATA1_RU_MRU_SIZE,
+                                                     RadiotapHeader::EHT_DATA1_RU_MRU_SIZE_242);
+            break;
+        case HeRu::RU_484_TONE:
+            ehtFields.data.at(1) |= GetRadiotapField(RadiotapHeader::EHT_DATA1_RU_MRU_SIZE,
+                                                     RadiotapHeader::EHT_DATA1_RU_MRU_SIZE_484);
+            break;
+        case HeRu::RU_996_TONE:
+            ehtFields.data.at(1) |= GetRadiotapField(RadiotapHeader::EHT_DATA1_RU_MRU_SIZE,
+                                                     RadiotapHeader::EHT_DATA1_RU_MRU_SIZE_996);
+            break;
+        case HeRu::RU_2x996_TONE:
+            ehtFields.data.at(1) |= GetRadiotapField(RadiotapHeader::EHT_DATA1_RU_MRU_SIZE,
+                                                     RadiotapHeader::EHT_DATA1_RU_MRU_SIZE_2x996);
+            break;
+        default:
+            NS_ABORT_MSG("Unexpected RU type");
+            break;
+        }
+        const auto ruIndex =
+            (txVector.GetEhtPpduType() == 1) ? 1 : txVector.GetRu(staId).GetIndex();
+        const auto& ruAllocation = txVector.GetRuAllocation(p20Index);
+        ehtFields.data.at(1) |=
+            GetRadiotapField(RadiotapHeader::EHT_DATA1_RU_MRU_INDEX, ruIndex) |
+            GetRadiotapField(RadiotapHeader::EHT_DATA1_RU_ALLOC_CC_1_1_1, ruAllocation.at(0));
+        if (channelWidth >= MHz_u{40})
+        {
+            ehtFields.data.at(2) =
+                RadiotapHeader::EHT_DATA2_RU_ALLOC_CC_2_1_1_KNOWN |
+                GetRadiotapField(RadiotapHeader::EHT_DATA2_RU_ALLOC_CC_2_1_1, ruAllocation.at(1));
+        }
+        if (channelWidth >= MHz_u{80})
+        {
+            ehtFields.data.at(2) |=
+                RadiotapHeader::EHT_DATA2_RU_ALLOC_CC_1_1_2_KNOWN |
+                RadiotapHeader::EHT_DATA2_RU_ALLOC_CC_2_1_2_KNOWN |
+                GetRadiotapField(RadiotapHeader::EHT_DATA2_RU_ALLOC_CC_1_1_2, ruAllocation.at(2)) |
+                GetRadiotapField(RadiotapHeader::EHT_DATA2_RU_ALLOC_CC_2_1_2, ruAllocation.at(3));
+        }
+        if (channelWidth >= MHz_u{160})
+        {
+            ehtFields.data.at(3) =
+                RadiotapHeader::EHT_DATA3_RU_ALLOC_CC_1_2_1_KNOWN |
+                RadiotapHeader::EHT_DATA3_RU_ALLOC_CC_2_2_1_KNOWN |
+                RadiotapHeader::EHT_DATA3_RU_ALLOC_CC_1_2_2_KNOWN |
+                GetRadiotapField(RadiotapHeader::EHT_DATA3_RU_ALLOC_CC_1_2_1, ruAllocation.at(4)) |
+                GetRadiotapField(RadiotapHeader::EHT_DATA3_RU_ALLOC_CC_2_2_1, ruAllocation.at(5)) |
+                GetRadiotapField(RadiotapHeader::EHT_DATA3_RU_ALLOC_CC_1_2_2, ruAllocation.at(6));
+            ehtFields.data.at(4) =
+                RadiotapHeader::EHT_DATA4_RU_ALLOC_CC_2_2_2_KNOWN |
+                GetRadiotapField(RadiotapHeader::EHT_DATA4_RU_ALLOC_CC_2_2_2, ruAllocation.at(7));
+            ehtFields.known |= RadiotapHeader::EHT_KNOWN_PRIMARY_80;
+            const auto isLowP80 = p20Index < (channelWidth / MHz_u{40});
+            ehtFields.data.at(1) |=
+                GetRadiotapField(RadiotapHeader::EHT_DATA1_PRIMARY_80,
+                                 (isLowP80 ? RadiotapHeader::EHT_DATA1_PRIMARY_80_LOWEST
+                                           : RadiotapHeader::EHT_DATA1_PRIMARY_80_HIGHEST));
+        }
+        // TODO: handle 320 MHz when supported
+        uint32_t userInfo = RadiotapHeader::EHT_USER_INFO_STA_ID_KNOWN |
+                            RadiotapHeader::EHT_USER_INFO_MCS_KNOWN |
+                            RadiotapHeader::EHT_USER_INFO_NSS_KNOWN_O |
+                            RadiotapHeader::EHT_USER_INFO_DATA_FOR_USER |
+                            GetRadiotapField(RadiotapHeader::EHT_USER_INFO_STA_ID, staId) |
+                            GetRadiotapField(RadiotapHeader::EHT_USER_INFO_MCS, mcs) |
+                            GetRadiotapField(RadiotapHeader::EHT_USER_INFO_NSS_O, nss);
+        ehtFields.userInfo.push_back(userInfo);
+        header.SetEhtFields(ehtFields);
     }
 }
 
@@ -1006,6 +1197,7 @@
     LogComponentEnable("ErpOfdmPhy", logLevel);
     LogComponentEnable("ErpOfdmPpdu", logLevel);
     LogComponentEnable("FrameExchangeManager", logLevel);
+    LogComponentEnable("GcrManager", logLevel);
     LogComponentEnable("HeConfiguration", logLevel);
     LogComponentEnable("HeFrameExchangeManager", logLevel);
     LogComponentEnable("HePhy", logLevel);
@@ -1053,6 +1245,7 @@
     LogComponentEnable("WifiAssocManager", logLevel);
     LogComponentEnable("WifiDefaultAckManager", logLevel);
     LogComponentEnable("WifiDefaultAssocManager", logLevel);
+    LogComponentEnable("WifiDefaultGcrManager", logLevel);
     LogComponentEnable("WifiDefaultProtectionManager", logLevel);
     LogComponentEnable("WifiMac", logLevel);
     LogComponentEnable("WifiMacQueue", logLevel);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/helper/wifi-helper.h ns-3.44/src/wifi/helper/wifi-helper.h
--- ns-3.43/src/wifi/helper/wifi-helper.h	2024-10-09 16:41:10.112656800 -0700
+++ ns-3.44/src/wifi/helper/wifi-helper.h	2025-03-09 16:55:49.779372700 -0700
@@ -30,7 +30,7 @@
 class QueueItem;
 
 /**
- * \brief create PHY objects
+ * @brief create PHY objects
  *
  * This base class must be implemented by new PHY implementation which wish to integrate
  * with the \ref ns3::WifiHelper class.
@@ -41,16 +41,16 @@
     /**
      * Constructor
      *
-     * \param nLinks the number of links to configure (>1 only for 11be devices)
+     * @param nLinks the number of links to configure (>1 only for 11be devices)
      */
     WifiPhyHelper(uint8_t nLinks = 1);
     ~WifiPhyHelper() override;
 
     /**
-     * \param node the node on which the PHY object(s) will reside
-     * \param device the device within which the PHY object(s) will reside
+     * @param node the node on which the PHY object(s) will reside
+     * @param device the device within which the PHY object(s) will reside
      *
-     * \returns new PHY objects.
+     * @returns new PHY objects.
      *
      * Subclasses must implement this method to allow the ns3::WifiHelper class
      * to create PHY objects from ns3::WifiHelper::Install.
@@ -58,17 +58,17 @@
     virtual std::vector<Ptr<WifiPhy>> Create(Ptr<Node> node, Ptr<WifiNetDevice> device) const = 0;
 
     /**
-     * \param name the name of the attribute to set
-     * \param v the value of the attribute
+     * @param name the name of the attribute to set
+     * @param v the value of the attribute
      *
      * Set an attribute of all the underlying PHY object.
      */
     void Set(std::string name, const AttributeValue& v);
 
     /**
-     * \param name the name of the attribute to set
-     * \param v the value of the attribute
-     * \param linkId ID of the link to configure (>0 only for 11be devices)
+     * @param name the name of the attribute to set
+     * @param v the value of the attribute
+     * @param linkId ID of the link to configure (>0 only for 11be devices)
      *
      * Set an attribute of the given underlying PHY object.
      */
@@ -77,9 +77,9 @@
     /**
      * Helper function used to set the interference helper.
      *
-     * \tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
-     * \param type the type of interference helper
-     * \param args A sequence of name-value pairs of the attributes to set.
+     * @tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
+     * @param type the type of interference helper
+     * @param args A sequence of name-value pairs of the attributes to set.
      */
     template <typename... Args>
     void SetInterferenceHelper(std::string type, Args&&... args);
@@ -87,18 +87,18 @@
     /**
      * Helper function used to set the error rate model.
      *
-     * \tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
-     * \param type the type of error rate model
-     * \param args A sequence of name-value pairs of the attributes to set.
+     * @tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
+     * @param type the type of error rate model
+     * @param args A sequence of name-value pairs of the attributes to set.
      */
     template <typename... Args>
     void SetErrorRateModel(std::string type, Args&&... args);
 
     /**
-     * \tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
-     * \param linkId ID of the link to configure (>0 only for 11be devices)
-     * \param type the type of the error rate model to set.
-     * \param args A sequence of name-value pairs of the attributes to set.
+     * @tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
+     * @param linkId ID of the link to configure (>0 only for 11be devices)
+     * @param type the type of the error rate model to set.
+     * @param args A sequence of name-value pairs of the attributes to set.
      *
      * Set the error rate model and its attributes to use for the given link when Install is called.
      */
@@ -108,18 +108,18 @@
     /**
      * Helper function used to set the frame capture model.
      *
-     * \tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
-     * \param type the type of frame capture model
-     * \param args A sequence of name-value pairs of the attributes to set.
+     * @tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
+     * @param type the type of frame capture model
+     * @param args A sequence of name-value pairs of the attributes to set.
      */
     template <typename... Args>
     void SetFrameCaptureModel(std::string type, Args&&... args);
 
     /**
-     * \tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
-     * \param linkId ID of the link to configure (>0 only for 11be devices)
-     * \param type the type of the frame capture model to set.
-     * \param args A sequence of name-value pairs of the attributes to set.
+     * @tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
+     * @param linkId ID of the link to configure (>0 only for 11be devices)
+     * @param type the type of the frame capture model to set.
+     * @param args A sequence of name-value pairs of the attributes to set.
      *
      * Set the frame capture model and its attributes to use for the given link when Install is
      * called.
@@ -130,18 +130,18 @@
     /**
      * Helper function used to set the preamble detection model.
      *
-     * \tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
-     * \param type the type of preamble detection model
-     * \param args A sequence of name-value pairs of the attributes to set.
+     * @tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
+     * @param type the type of preamble detection model
+     * @param args A sequence of name-value pairs of the attributes to set.
      */
     template <typename... Args>
     void SetPreambleDetectionModel(std::string type, Args&&... args);
 
     /**
-     * \tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
-     * \param linkId ID of the link to configure (>0 only for 11be devices)
-     * \param type the type of the preamble detection model to set.
-     * \param args A sequence of name-value pairs of the attributes to set.
+     * @tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
+     * @param linkId ID of the link to configure (>0 only for 11be devices)
+     * @param type the type of the preamble detection model to set.
+     * @param args A sequence of name-value pairs of the attributes to set.
      *
      * Set the preamble detection model and its attributes to use for the given link when Install is
      * called.
@@ -188,10 +188,10 @@
         /**
          * Constructor
          *
-         * \param filename the common file name of the PCAP files
-         * \param dlt the selected data link type of the pcap file
-         * \param type the selected PCAP capture type
-         * \param dev the WifiNetDevice for which the PCAP files are generated
+         * @param filename the common file name of the PCAP files
+         * @param dlt the selected data link type of the pcap file
+         * @param type the selected PCAP capture type
+         * @param dev the WifiNetDevice for which the PCAP files are generated
          */
         PcapFilesInfo(const std::string& filename,
                       PcapHelper::DataLinkType dlt,
@@ -217,48 +217,48 @@
      * called before EnablePcap(), so that the header of the pcap file can be
      * written correctly.
      *
-     * \see SupportedPcapDataLinkTypes
+     * @see SupportedPcapDataLinkTypes
      *
-     * \param dlt The data link type of the pcap file (and packets) to be used
+     * @param dlt The data link type of the pcap file (and packets) to be used
      */
     void SetPcapDataLinkType(SupportedPcapDataLinkTypes dlt);
 
     /**
      * Get the data link type of PCAP traces to be used.
      *
-     * \see SupportedPcapDataLinkTypes
+     * @see SupportedPcapDataLinkTypes
      *
-     * \returns The data link type of the pcap file (and packets) to be used
+     * @returns The data link type of the pcap file (and packets) to be used
      */
     PcapHelper::DataLinkType GetPcapDataLinkType() const;
 
     /**
      * Set the PCAP capture type to be used. This function has to be called before EnablePcap().
      *
-     * \see PcapCaptureType
+     * @see PcapCaptureType
      *
-     * \param type The PCAP capture type
+     * @param type The PCAP capture type
      */
     void SetPcapCaptureType(PcapCaptureType type);
 
     /**
      * Get the PCAP capture type to be used.
      *
-     * \see PcapCaptureType
+     * @see PcapCaptureType
      *
-     * \return The PCAP capture type to be used
+     * @return The PCAP capture type to be used
      */
     PcapCaptureType GetPcapCaptureType() const;
 
   protected:
     /**
-     * \param info the information needed to write to the correct PCAP file
-     * \param phyId the ID of the PHY that raised the event
-     * \param packet the packet
-     * \param channelFreqMhz the channel frequency
-     * \param txVector the TXVECTOR
-     * \param aMpdu the A-MPDU information
-     * \param staId the STA-ID (only used for MU)
+     * @param info the information needed to write to the correct PCAP file
+     * @param phyId the ID of the PHY that raised the event
+     * @param packet the packet
+     * @param channelFreqMhz the channel frequency
+     * @param txVector the TXVECTOR
+     * @param aMpdu the A-MPDU information
+     * @param staId the STA-ID (only used for MU)
      *
      * Handle TX pcap.
      */
@@ -270,14 +270,14 @@
                                  MpduInfo aMpdu,
                                  uint16_t staId = SU_STA_ID);
     /**
-     * \param info the information needed to write to the correct PCAP file
-     * \param phyId the ID of the PHY that raised the event
-     * \param packet the packet
-     * \param channelFreqMhz the channel frequency
-     * \param txVector the TXVECTOR
-     * \param aMpdu the A-MPDU information
-     * \param signalNoise the RX signal and noise information
-     * \param staId the STA-ID (only used for MU)
+     * @param info the information needed to write to the correct PCAP file
+     * @param phyId the ID of the PHY that raised the event
+     * @param packet the packet
+     * @param channelFreqMhz the channel frequency
+     * @param txVector the TXVECTOR
+     * @param aMpdu the A-MPDU information
+     * @param signalNoise the RX signal and noise information
+     * @param staId the STA-ID (only used for MU)
      *
      * Handle RX pcap.
      */
@@ -302,9 +302,9 @@
      * If PCAP files are generated per link, it might create a new file if a link
      * has swapped to a new ID.
      *
-     * \param info the information needed to write to the correct PCAP file
-     * \param phyId the ID of the PHY that raised the event
-     * \return the PCAP file to write to
+     * @param info the information needed to write to the correct PCAP file
+     * @param phyId the ID of the PHY that raised the event
+     * @return the PCAP file to write to
      */
     static Ptr<PcapFileWrapper> GetOrCreatePcapFile(const std::shared_ptr<PcapFilesInfo>& info,
                                                     uint8_t phyId);
@@ -312,49 +312,53 @@
     /**
      * Get the Radiotap header for a transmitted packet.
      *
-     * \param header the radiotap header to be filled in
-     * \param packet the packet
-     * \param channelFreqMhz the channel frequency
-     * \param txVector the TXVECTOR
-     * \param aMpdu the A-MPDU information
-     * \param staId the STA-ID
+     * @param header the radiotap header to be filled in
+     * @param packet the packet
+     * @param channelFreqMhz the channel frequency
+     * @param p20Index the index of the primary20 channel
+     * @param txVector the TXVECTOR
+     * @param aMpdu the A-MPDU information
+     * @param staId the STA-ID
      */
     static void GetRadiotapHeader(RadiotapHeader& header,
                                   Ptr<Packet> packet,
                                   uint16_t channelFreqMhz,
-                                  WifiTxVector txVector,
+                                  uint8_t p20Index,
+                                  const WifiTxVector& txVector,
                                   MpduInfo aMpdu,
                                   uint16_t staId);
 
     /**
      * Get the Radiotap header for a received packet.
      *
-     * \param header the radiotap header to be filled in
-     * \param packet the packet
-     * \param channelFreqMhz the channel frequency
-     * \param txVector the TXVECTOR
-     * \param aMpdu the A-MPDU information
-     * \param staId the STA-ID
-     * \param signalNoise the rx signal and noise information
+     * @param header the radiotap header to be filled in
+     * @param packet the packet
+     * @param channelFreqMhz the channel frequency
+     * @param p20Index the index of the primary20 channel
+     * @param txVector the TXVECTOR
+     * @param aMpdu the A-MPDU information
+     * @param staId the STA-ID
+     * @param signalNoise the rx signal and noise information
      */
     static void GetRadiotapHeader(RadiotapHeader& header,
                                   Ptr<Packet> packet,
                                   uint16_t channelFreqMhz,
-                                  WifiTxVector txVector,
+                                  uint8_t p20Index,
+                                  const WifiTxVector& txVector,
                                   MpduInfo aMpdu,
                                   uint16_t staId,
                                   SignalNoiseDbm signalNoise);
 
     /**
-     * \brief Enable pcap output the indicated net device.
+     * @brief Enable pcap output the indicated net device.
      *
      * NetDevice-specific implementation mechanism for hooking the trace and
      * writing to the trace file.
      *
-     * \param prefix Filename prefix to use for pcap files.
-     * \param nd Net device for which you want to enable tracing.
-     * \param promiscuous If true capture all possible packets available at the device.
-     * \param explicitFilename Treat the prefix as an explicit filename if true
+     * @param prefix Filename prefix to use for pcap files.
+     * @param nd Net device for which you want to enable tracing.
+     * @param promiscuous If true capture all possible packets available at the device.
+     * @param explicitFilename Treat the prefix as an explicit filename if true
      */
     void EnablePcapInternal(std::string prefix,
                             Ptr<NetDevice> nd,
@@ -362,15 +366,15 @@
                             bool explicitFilename) override;
 
     /**
-     * \brief Enable ASCII trace output on the indicated net device.
+     * @brief Enable ASCII trace output on the indicated net device.
      *
      * NetDevice-specific implementation mechanism for hooking the trace and
      * writing to the trace file.
      *
-     * \param stream The output stream object to use when logging ASCII traces.
-     * \param prefix Filename prefix to use for ASCII trace files.
-     * \param nd Net device for which you want to enable tracing.
-     * \param explicitFilename Treat the prefix as an explicit filename if true
+     * @param stream The output stream object to use when logging ASCII traces.
+     * @param prefix Filename prefix to use for ASCII trace files.
+     * @param nd Net device for which you want to enable tracing.
+     * @param explicitFilename Treat the prefix as an explicit filename if true
      */
     void EnableAsciiInternal(Ptr<OutputStreamWrapper> stream,
                              std::string prefix,
@@ -382,7 +386,7 @@
 };
 
 /**
- * \brief helps to create WifiNetDevice objects
+ * @brief helps to create WifiNetDevice objects
  *
  * This class can help to create a large set of similar
  * WifiNetDevice objects and to configure a large set of
@@ -406,18 +410,18 @@
     /**
      * Helper function used to set the station manager
      *
-     * \tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
-     * \param type the type of station manager
-     * \param args A sequence of name-value pairs of the attributes to set.
+     * @tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
+     * @param type the type of station manager
+     * @param args A sequence of name-value pairs of the attributes to set.
      */
     template <typename... Args>
     void SetRemoteStationManager(std::string type, Args&&... args);
 
     /**
-     * \tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
-     * \param linkId ID of the link to configure (>0 only for 11be devices)
-     * \param type the type of the preamble detection model to set.
-     * \param args A sequence of name-value pairs of the attributes to set.
+     * @tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
+     * @param linkId ID of the link to configure (>0 only for 11be devices)
+     * @param type the type of the preamble detection model to set.
+     * @param args A sequence of name-value pairs of the attributes to set.
      *
      * Set the remote station manager model and its attributes to use for the given link.
      * If the helper stored a remote station manager model for the first N links only
@@ -431,9 +435,9 @@
     /**
      * Helper function used to set the OBSS-PD algorithm
      *
-     * \tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
-     * \param type the type of OBSS-PD algorithm
-     * \param args A sequence of name-value pairs of the attributes to set.
+     * @tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
+     * @param type the type of OBSS-PD algorithm
+     * @param args A sequence of name-value pairs of the attributes to set.
      */
     template <typename... Args>
     void SetObssPdAlgorithm(std::string type, Args&&... args);
@@ -442,7 +446,7 @@
     typedef std::function<std::size_t(Ptr<QueueItem>)> SelectQueueCallback;
 
     /**
-     * \param f the select queue callback
+     * @param f the select queue callback
      *
      * Set the select queue callback to set on the NetDevice queue interface aggregated
      * to the WifiNetDevice, in case WifiMac with QoS enabled is used
@@ -460,45 +464,45 @@
     void DisableFlowControl();
 
     /**
-     * \param phy the PHY helper to create PHY objects
-     * \param mac the MAC helper to create MAC objects
-     * \param first lower bound on the set of nodes on which a wifi device must be created
-     * \param last upper bound on the set of nodes on which a wifi device must be created
-     * \returns a device container which contains all the devices created by this method.
+     * @param phy the PHY helper to create PHY objects
+     * @param mac the MAC helper to create MAC objects
+     * @param first lower bound on the set of nodes on which a wifi device must be created
+     * @param last upper bound on the set of nodes on which a wifi device must be created
+     * @returns a device container which contains all the devices created by this method.
      */
     NetDeviceContainer virtual Install(const WifiPhyHelper& phy,
                                        const WifiMacHelper& mac,
                                        NodeContainer::Iterator first,
                                        NodeContainer::Iterator last) const;
     /**
-     * \param phy the PHY helper to create PHY objects
-     * \param mac the MAC helper to create MAC objects
-     * \param c the set of nodes on which a wifi device must be created
-     * \returns a device container which contains all the devices created by this method.
+     * @param phy the PHY helper to create PHY objects
+     * @param mac the MAC helper to create MAC objects
+     * @param c the set of nodes on which a wifi device must be created
+     * @returns a device container which contains all the devices created by this method.
      */
     virtual NetDeviceContainer Install(const WifiPhyHelper& phy,
                                        const WifiMacHelper& mac,
                                        NodeContainer c) const;
     /**
-     * \param phy the PHY helper to create PHY objects
-     * \param mac the MAC helper to create MAC objects
-     * \param node the node on which a wifi device must be created
-     * \returns a device container which contains all the devices created by this method.
+     * @param phy the PHY helper to create PHY objects
+     * @param mac the MAC helper to create MAC objects
+     * @param node the node on which a wifi device must be created
+     * @returns a device container which contains all the devices created by this method.
      */
     virtual NetDeviceContainer Install(const WifiPhyHelper& phy,
                                        const WifiMacHelper& mac,
                                        Ptr<Node> node) const;
     /**
-     * \param phy the PHY helper to create PHY objects
-     * \param mac the MAC helper to create MAC objects
-     * \param nodeName the name of node on which a wifi device must be created
-     * \returns a device container which contains all the devices created by this method.
+     * @param phy the PHY helper to create PHY objects
+     * @param mac the MAC helper to create MAC objects
+     * @param nodeName the name of node on which a wifi device must be created
+     * @returns a device container which contains all the devices created by this method.
      */
     virtual NetDeviceContainer Install(const WifiPhyHelper& phy,
                                        const WifiMacHelper& mac,
                                        std::string nodeName) const;
     /**
-     * \param standard the standard to configure during installation
+     * @param standard the standard to configure during installation
      *
      * This method sets standards-compliant defaults for WifiMac
      * parameters such as SIFS time, slot time, timeout values, etc.,
@@ -514,7 +518,7 @@
      * 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
+     * @code
      * Config::Set ("/NodeList/0/DeviceList/0/$ns3::WifiNetDevice/Mac/Slot", TimeValue (MicroSeconds
      * (slot))); \endcode
      *
@@ -524,7 +528,7 @@
     virtual void SetStandard(WifiStandard standard);
 
     /**
-     * \param standard String representation of the Wi-Fi standard
+     * @param standard String representation of the Wi-Fi standard
      *
      * This method overloads WifiHelper::SetStandard(WifiStandard standard) by allowing
      * selected string names. For example, the strings "802.11ax", "11ax", and "HE"
@@ -538,8 +542,8 @@
      * Helper function used to configure the HT options listed as attributes of
      * the HtConfiguration class.
      *
-     * \tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
-     * \param args A sequence of name-value pairs of the attributes to set.
+     * @tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
+     * @param args A sequence of name-value pairs of the attributes to set.
      */
     template <typename... Args>
     void ConfigHtOptions(Args&&... args);
@@ -548,8 +552,8 @@
      * Helper function used to configure the VHT options listed as attributes of
      * the VhtConfiguration class.
      *
-     * \tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
-     * \param args A sequence of name-value pairs of the attributes to set.
+     * @tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
+     * @param args A sequence of name-value pairs of the attributes to set.
      */
     template <typename... Args>
     void ConfigVhtOptions(Args&&... args);
@@ -558,8 +562,8 @@
      * Helper function used to configure the HE options listed as attributes of
      * the HeConfiguration class.
      *
-     * \tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
-     * \param args A sequence of name-value pairs of the attributes to set.
+     * @tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
+     * @param args A sequence of name-value pairs of the attributes to set.
      */
     template <typename... Args>
     void ConfigHeOptions(Args&&... args);
@@ -568,15 +572,15 @@
      * Helper function used to configure the EHT options listed as attributes of
      * the EhtConfiguration class.
      *
-     * \tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
-     * \param args A sequence of name-value pairs of the attributes to set.
+     * @tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
+     * @param args A sequence of name-value pairs of the attributes to set.
      */
     template <typename... Args>
     void ConfigEhtOptions(Args&&... args);
 
     /**
      * Helper to enable all WifiNetDevice log components with one statement
-     * \param logLevel (optional) log level setting
+     * @param logLevel (optional) log level setting
      */
     static void EnableLogComponents(LogLevel logLevel = LOG_LEVEL_ALL);
 
@@ -589,10 +593,10 @@
      * have been assigned. The Install() method should have previously been
      * called by the user.
      *
-     * \param c NetDeviceContainer of the set of net devices for which the
+     * @param c NetDeviceContainer of the set of net devices for which the
      *          WifiNetDevice should be modified to use fixed streams
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this helper
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this helper
      */
     static int64_t AssignStreams(NetDeviceContainer c, int64_t stream);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/helper/wifi-mac-helper.cc ns-3.44/src/wifi/helper/wifi-mac-helper.cc
--- ns-3.43/src/wifi/helper/wifi-mac-helper.cc	2024-10-09 16:41:10.112656800 -0700
+++ ns-3.44/src/wifi/helper/wifi-mac-helper.cc	2025-03-09 16:55:49.779372700 -0700
@@ -14,6 +14,7 @@
 #include "ns3/emlsr-manager.h"
 #include "ns3/enum.h"
 #include "ns3/frame-exchange-manager.h"
+#include "ns3/gcr-manager.h"
 #include "ns3/multi-user-scheduler.h"
 #include "ns3/pointer.h"
 #include "ns3/wifi-ack-manager.h"
@@ -91,6 +92,7 @@
 
     // create Channel Access Managers
     std::vector<Ptr<ChannelAccessManager>> caManagers;
+    caManagers.reserve(nLinks);
     for (uint8_t linkId = 0; linkId < nLinks; ++linkId)
     {
         caManagers.emplace_back(m_channelAccessManager.Create<ChannelAccessManager>());
@@ -132,11 +134,10 @@
     mac->SetMacQueueScheduler(queueScheduler);
 
     // create and install the Multi User Scheduler if this is an HE AP
-    Ptr<ApWifiMac> apMac;
-    if (standard >= WIFI_STANDARD_80211ax && m_muScheduler.IsTypeIdSet() &&
-        (apMac = DynamicCast<ApWifiMac>(mac)))
+    auto apMac = DynamicCast<ApWifiMac>(mac);
+    if (standard >= WIFI_STANDARD_80211ax && m_muScheduler.IsTypeIdSet() && apMac)
     {
-        Ptr<MultiUserScheduler> muScheduler = m_muScheduler.Create<MultiUserScheduler>();
+        auto muScheduler = m_muScheduler.Create<MultiUserScheduler>();
         apMac->AggregateObject(muScheduler);
     }
 
@@ -168,6 +169,13 @@
         apMac->SetApEmlsrManager(apEmlsrManager);
     }
 
+    // create and install the GCR Manager if this is a HT-capable AP
+    if (apMac && apMac->GetRobustAVStreamingSupported() && m_gcrManager.IsTypeIdSet())
+    {
+        auto gcrManager = m_gcrManager.Create<GcrManager>();
+        apMac->SetGcrManager(gcrManager);
+    }
+
     return mac;
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/helper/wifi-mac-helper.h ns-3.44/src/wifi/helper/wifi-mac-helper.h
--- ns-3.43/src/wifi/helper/wifi-mac-helper.h	2024-10-09 16:41:10.112656800 -0700
+++ ns-3.44/src/wifi/helper/wifi-mac-helper.h	2025-03-09 16:55:49.779372700 -0700
@@ -22,7 +22,7 @@
 class WifiNetDevice;
 
 /**
- * \brief create MAC layers for a ns3::WifiNetDevice.
+ * @brief create MAC layers for a ns3::WifiNetDevice.
  *
  * 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
@@ -50,9 +50,9 @@
     virtual ~WifiMacHelper();
 
     /**
-     * \tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
-     * \param type the type of ns3::WifiMac to create.
-     * \param args A sequence of name-value pairs of the attributes to set.
+     * @tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
+     * @param type the type of ns3::WifiMac to create.
+     * @param args A sequence of name-value pairs of the attributes to set.
      *
      * All the attributes specified in this method should exist
      * in the requested MAC.
@@ -63,8 +63,8 @@
     /**
      * Helper function used to create and set the Txop object.
      *
-     * \tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
-     * \param args A sequence of name-value pairs of the attributes to set.
+     * @tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
+     * @param args A sequence of name-value pairs of the attributes to set.
      */
     template <typename... Args>
     void SetDcf(Args&&... args);
@@ -72,9 +72,9 @@
     /**
      * Helper function used to create and set the QosTxop object corresponding to the given AC.
      *
-     * \param aci the AC index
-     * \tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
-     * \param args A sequence of name-value pairs of the attributes to set.
+     * @param aci the AC index
+     * @tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
+     * @param args A sequence of name-value pairs of the attributes to set.
      */
     template <typename... Args>
     void SetEdca(AcIndex aci, Args&&... args);
@@ -82,8 +82,8 @@
     /**
      * Helper function used to set the Channel Access Manager object.
      *
-     * \tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
-     * \param args A sequence of name-value pairs of the attributes to set.
+     * @tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
+     * @param args A sequence of name-value pairs of the attributes to set.
      */
     template <typename... Args>
     void SetChannelAccessManager(Args&&... args);
@@ -91,8 +91,8 @@
     /**
      * Helper function used to set the Frame Exchange Manager object.
      *
-     * \tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
-     * \param args A sequence of name-value pairs of the attributes to set.
+     * @tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
+     * @param args A sequence of name-value pairs of the attributes to set.
      */
     template <typename... Args>
     void SetFrameExchangeManager(Args&&... args);
@@ -100,9 +100,9 @@
     /**
      * Helper function used to set the Association Manager.
      *
-     * \tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
-     * \param type the type of Association Manager
-     * \param args A sequence of name-value pairs of the attributes to set.
+     * @tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
+     * @param type the type of Association Manager
+     * @param args A sequence of name-value pairs of the attributes to set.
      */
     template <typename... Args>
     void SetAssocManager(std::string type, Args&&... args);
@@ -110,9 +110,9 @@
     /**
      * Helper function used to set the MAC queue scheduler.
      *
-     * \tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
-     * \param type the type of MAC queue scheduler
-     * \param args A sequence of name-value pairs of the attributes to set.
+     * @tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
+     * @param type the type of MAC queue scheduler
+     * @param args A sequence of name-value pairs of the attributes to set.
      */
     template <typename... Args>
     void SetMacQueueScheduler(std::string type, Args&&... args);
@@ -120,9 +120,9 @@
     /**
      * Helper function used to set the Protection Manager.
      *
-     * \tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
-     * \param type the type of Protection Manager
-     * \param args A sequence of name-value pairs of the attributes to set.
+     * @tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
+     * @param type the type of Protection Manager
+     * @param args A sequence of name-value pairs of the attributes to set.
      */
     template <typename... Args>
     void SetProtectionManager(std::string type, Args&&... args);
@@ -130,9 +130,9 @@
     /**
      * Helper function used to set the Acknowledgment Manager.
      *
-     * \tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
-     * \param type the type of Acknowledgment Manager
-     * \param args A sequence of name-value pairs of the attributes to set.
+     * @tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
+     * @param type the type of Acknowledgment Manager
+     * @param args A sequence of name-value pairs of the attributes to set.
      */
     template <typename... Args>
     void SetAckManager(std::string type, Args&&... args);
@@ -141,9 +141,9 @@
      * Helper function used to set the Multi User Scheduler that can be aggregated
      * to an HE AP's MAC.
      *
-     * \tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
-     * \param type the type of Multi User Scheduler
-     * \param args A sequence of name-value pairs of the attributes to set.
+     * @tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
+     * @param type the type of Multi User Scheduler
+     * @param args A sequence of name-value pairs of the attributes to set.
      */
     template <typename... Args>
     void SetMultiUserScheduler(std::string type, Args&&... args);
@@ -151,9 +151,9 @@
     /**
      * Helper function used to set the EMLSR Manager that can be installed on an EHT non-AP MLD.
      *
-     * \tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
-     * \param type the type of EMLSR Manager
-     * \param args A sequence of name-value pairs of the attributes to set.
+     * @tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
+     * @param type the type of EMLSR Manager
+     * @param args A sequence of name-value pairs of the attributes to set.
      */
     template <typename... Args>
     void SetEmlsrManager(std::string type, Args&&... args);
@@ -161,17 +161,27 @@
     /**
      * Helper function used to set the AP EMLSR Manager that can be installed on an EHT AP MLD.
      *
-     * \tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
-     * \param type the type of AP EMLSR Manager
-     * \param args A sequence of name-value pairs of the attributes to set.
+     * @tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
+     * @param type the type of AP EMLSR Manager
+     * @param args A sequence of name-value pairs of the attributes to set.
      */
     template <typename... Args>
     void SetApEmlsrManager(std::string type, Args&&... args);
 
     /**
-     * \param device the device within which the MAC object will reside
-     * \param standard the standard to configure during installation
-     * \returns a new MAC object.
+     * Helper function used to set the GCR Manager that can be installed on a QoS AP.
+     *
+     * @tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
+     * @param type the type of GCR Manager
+     * @param args A sequence of name-value pairs of the attributes to set.
+     */
+    template <typename... Args>
+    void SetGcrManager(std::string type, Args&&... args);
+
+    /**
+     * @param device the device within which the MAC object will reside
+     * @param standard the standard to configure during installation
+     * @returns a new MAC object.
      *
      * This allows the ns3::WifiHelper class to create MAC objects from ns3::WifiHelper::Install.
      */
@@ -190,6 +200,7 @@
     ObjectFactory m_muScheduler;          ///< Multi-user Scheduler object factory
     ObjectFactory m_emlsrManager;         ///< EMLSR Manager object factory
     ObjectFactory m_apEmlsrManager;       ///< AP EMLSR Manager object factory
+    ObjectFactory m_gcrManager;           ///< GCR Manager object factory
 };
 
 } // namespace ns3
@@ -295,6 +306,14 @@
     m_apEmlsrManager.Set(args...);
 }
 
+template <typename... Args>
+void
+WifiMacHelper::SetGcrManager(std::string type, Args&&... args)
+{
+    m_gcrManager.SetTypeId(type);
+    m_gcrManager.Set(args...);
+}
+
 } // namespace ns3
 
 #endif /* WIFI_MAC_HELPER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/helper/wifi-phy-rx-trace-helper.cc ns-3.44/src/wifi/helper/wifi-phy-rx-trace-helper.cc
--- ns-3.43/src/wifi/helper/wifi-phy-rx-trace-helper.cc	2024-10-09 16:41:10.112656800 -0700
+++ ns-3.44/src/wifi/helper/wifi-phy-rx-trace-helper.cc	2025-03-09 16:55:49.779372700 -0700
@@ -957,7 +957,7 @@
         auto mapOfDevices = m_completedRecords.at(nodeId);
         if (mapOfDevices.contains(deviceId))
         {
-            auto mapOfLinks = mapOfDevices.at(deviceId);
+            const auto& mapOfLinks = mapOfDevices.at(deviceId);
             if (mapOfLinks.contains(linkId))
             {
                 auto vectorOfRecords = mapOfLinks.at(linkId);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/helper/wifi-phy-rx-trace-helper.h ns-3.44/src/wifi/helper/wifi-phy-rx-trace-helper.h
--- ns-3.43/src/wifi/helper/wifi-phy-rx-trace-helper.h	2024-10-09 16:41:10.112656800 -0700
+++ ns-3.44/src/wifi/helper/wifi-phy-rx-trace-helper.h	2025-03-09 16:55:49.779372700 -0700
@@ -664,8 +664,8 @@
 
     /**
      * Update the passed-in statistics object with statistics from the passed-in record.
-     * \param statistics The WifiPhyTraceStatistics object to modify
-     * \param record The WifiPpduRxRecord to examine
+     * @param statistics The WifiPhyTraceStatistics object to modify
+     * @param record The WifiPpduRxRecord to examine
      */
     void CountStatisticsForRecord(WifiPhyTraceStatistics& statistics,
                                   const WifiPpduRxRecord& record) const;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/helper/wifi-radio-energy-model-helper.h ns-3.44/src/wifi/helper/wifi-radio-energy-model-helper.h
--- ns-3.43/src/wifi/helper/wifi-radio-energy-model-helper.h	2024-10-09 16:41:10.112656800 -0700
+++ ns-3.44/src/wifi/helper/wifi-radio-energy-model-helper.h	2025-03-09 16:55:49.779372700 -0700
@@ -16,8 +16,8 @@
 {
 
 /**
- * \ingroup energy
- * \brief Assign WifiRadioEnergyModel to wifi devices.
+ * @ingroup energy
+ * @brief Assign WifiRadioEnergyModel to wifi devices.
  *
  * This installer installs WifiRadioEnergyModel for only WifiNetDevice objects.
  *
@@ -36,31 +36,31 @@
     ~WifiRadioEnergyModelHelper() override;
 
     /**
-     * \param name the name of the attribute to set
-     * \param v the value of the attribute
+     * @param name the name of the attribute to set
+     * @param v the value of the attribute
      *
      * Sets an attribute of the underlying PHY object.
      */
     void Set(std::string name, const AttributeValue& v) override;
 
     /**
-     * \param callback Callback function for energy depletion handling.
+     * @param callback Callback function for energy depletion handling.
      *
      * Sets the callback to be invoked when energy is depleted.
      */
     void SetDepletionCallback(WifiRadioEnergyModel::WifiRadioEnergyDepletionCallback callback);
 
     /**
-     * \param callback Callback function for energy recharged handling.
+     * @param callback Callback function for energy recharged handling.
      *
      * Sets the callback to be invoked when energy is recharged.
      */
     void SetRechargedCallback(WifiRadioEnergyModel::WifiRadioEnergyRechargedCallback callback);
 
     /**
-     * \tparam Ts \deduced Argument types
-     * \param name the name of the model to set
-     * \param [in] args Name and AttributeValue pairs to set.
+     * @tparam Ts \deduced Argument types
+     * @param name the name of the model to set
+     * @param [in] args Name and AttributeValue pairs to set.
      *
      * Configure a Transmission Current model for this EnergySource.
      */
@@ -69,9 +69,9 @@
 
   private:
     /**
-     * \param device Pointer to the NetDevice to install DeviceEnergyModel.
-     * \param source Pointer to EnergySource to install.
-     * \returns Ptr<DeviceEnergyModel>
+     * @param device Pointer to the NetDevice to install DeviceEnergyModel.
+     * @param source Pointer to EnergySource to install.
+     * @returns Ptr<DeviceEnergyModel>
      *
      * Implements DeviceEnergyModel::Install.
      */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/helper/wifi-tx-stats-helper.cc ns-3.44/src/wifi/helper/wifi-tx-stats-helper.cc
--- ns-3.43/src/wifi/helper/wifi-tx-stats-helper.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/wifi/helper/wifi-tx-stats-helper.cc	2025-03-09 16:55:49.779372700 -0700
@@ -0,0 +1,488 @@
+/*
+ * Copyright (c) 2024 Huazhong University of Science and Technology
+ * Copyright (c) 2024 University of Washington
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Authors:  Muyuan Shen <muyuan@uw.edu>
+ *           Hao Yin <haoyin@uw.edu>
+ */
+
+#include "wifi-tx-stats-helper.h"
+
+#include "ns3/frame-exchange-manager.h"
+#include "ns3/log.h"
+#include "ns3/net-device-container.h"
+#include "ns3/node-container.h"
+#include "ns3/wifi-mac-queue.h"
+#include "ns3/wifi-net-device.h"
+
+#include <functional>
+
+namespace ns3
+{
+
+NS_LOG_COMPONENT_DEFINE("WifiTxStatsHelper");
+
+WifiTxStatsHelper::WifiTxStatsHelper()
+{
+    NS_LOG_FUNCTION(this);
+}
+
+WifiTxStatsHelper::WifiTxStatsHelper(Time startTime, Time stopTime)
+    : m_startTime(startTime),
+      m_stopTime(stopTime)
+{
+    NS_LOG_FUNCTION(this << startTime.As(Time::S) << stopTime.As(Time::S));
+    NS_ASSERT_MSG(startTime <= stopTime,
+                  "Invalid Start: " << startTime << " and Stop: " << stopTime << " Time");
+}
+
+void
+WifiTxStatsHelper::Enable(const NodeContainer& nodes)
+{
+    NS_LOG_FUNCTION(this << nodes.GetN());
+    NetDeviceContainer netDevices;
+    for (uint32_t i = 0; i < nodes.GetN(); ++i)
+    {
+        for (uint32_t j = 0; j < nodes.Get(i)->GetNDevices(); ++j)
+        {
+            netDevices.Add(nodes.Get(i)->GetDevice(j));
+        }
+    }
+    Enable(netDevices);
+}
+
+void
+WifiTxStatsHelper::Enable(const NetDeviceContainer& devices)
+{
+    NS_LOG_FUNCTION(this << devices.GetN());
+
+    for (uint32_t j = 0; j < devices.GetN(); ++j)
+    {
+        auto device = DynamicCast<WifiNetDevice>(devices.Get(j));
+        if (!device)
+        {
+            NS_LOG_DEBUG("Ignoring deviceId: " << devices.Get(j)->GetIfIndex() << " on nodeId: "
+                                               << devices.Get(j)->GetNode()->GetId()
+                                               << " because it is not of type WifiNetDevice");
+            continue;
+        }
+        NS_LOG_INFO("Adding deviceId: " << devices.Get(j)->GetIfIndex()
+                                        << " on nodeId: " << devices.Get(j)->GetNode()->GetId());
+        const auto nodeId = devices.Get(j)->GetNode()->GetId();
+        const auto deviceId = devices.Get(j)->GetIfIndex();
+        if (device->GetMac()->GetQosSupported())
+        {
+            for (const auto& [ac, wifiAc] : wifiAcList)
+            {
+                // Trace enqueue for available ACs
+                device->GetMac()->GetTxopQueue(ac)->TraceConnectWithoutContext(
+                    "Enqueue",
+                    MakeCallback(&WifiTxStatsHelper::NotifyMacEnqueue, this)
+                        .Bind(nodeId, deviceId));
+            }
+        }
+        else
+        {
+            // Trace enqueue for Non-QoS AC
+            device->GetMac()
+                ->GetTxopQueue(AC_BE_NQOS)
+                ->TraceConnectWithoutContext(
+                    "Enqueue",
+                    MakeCallback(&WifiTxStatsHelper::NotifyMacEnqueue, this)
+                        .Bind(nodeId, deviceId));
+        }
+        device->GetMac()->TraceConnectWithoutContext(
+            "AckedMpdu",
+            MakeCallback(&WifiTxStatsHelper::NotifyAcked, this).Bind(nodeId, deviceId));
+        device->GetMac()->TraceConnectWithoutContext(
+            "DroppedMpdu",
+            MakeCallback(&WifiTxStatsHelper::NotifyMacDropped, this).Bind(nodeId, deviceId));
+        for (int i = 0; i < device->GetNPhys(); ++i)
+        {
+            device->GetPhy(i)->TraceConnectWithoutContext(
+                "PhyTxBegin",
+                MakeCallback(&WifiTxStatsHelper::NotifyTxStart, this).Bind(nodeId, deviceId));
+        }
+    }
+}
+
+void
+WifiTxStatsHelper::Start(Time startTime)
+{
+    NS_LOG_FUNCTION(this << startTime.As(Time::S));
+    NS_ASSERT_MSG(startTime >= Now(), "Invalid Start: " << startTime << " less than current time");
+    NS_ASSERT_MSG(startTime <= m_stopTime,
+                  "Invalid Start: " << startTime << " and Stop: " << m_stopTime << " Time");
+    m_startTime = startTime;
+}
+
+void
+WifiTxStatsHelper::Stop(Time stopTime)
+{
+    NS_LOG_FUNCTION(this << stopTime.As(Time::S));
+    NS_ASSERT_MSG(stopTime >= Now(), "Invalid Stop: " << stopTime << " less than current time");
+    NS_ASSERT_MSG(m_startTime <= stopTime,
+                  "Invalid Start: " << m_startTime << " and Stop: " << stopTime << " Time");
+    m_stopTime = stopTime;
+}
+
+void
+WifiTxStatsHelper::Reset()
+{
+    NS_LOG_FUNCTION(this);
+    m_successMap.clear();
+    m_failureMap.clear();
+    m_startTime = Now();
+}
+
+WifiTxStatsHelper::CountPerNodeDevice_t
+WifiTxStatsHelper::GetSuccessesByNodeDevice() const
+{
+    WifiTxStatsHelper::CountPerNodeDevice_t results;
+    for (const auto& [nodeDevTuple, records] : m_successMap)
+    {
+        results[{std::get<0>(nodeDevTuple), std::get<1>(nodeDevTuple)}] = records.size();
+    }
+    return results;
+}
+
+WifiTxStatsHelper::CountPerNodeDeviceLink_t
+WifiTxStatsHelper::GetSuccessesByNodeDeviceLink(WifiTxStatsHelper::MultiLinkSuccessType type) const
+{
+    WifiTxStatsHelper::CountPerNodeDeviceLink_t results;
+    for (const auto& [nodeDevTuple, records] : m_successMap)
+    {
+        for (const auto& record : records)
+        {
+            NS_ASSERT_MSG(!record.m_successLinkIdSet.empty(), "No LinkId set on MPDU");
+            if (type == FIRST_LINK_IN_SET)
+            {
+                const auto firstLinkId = *record.m_successLinkIdSet.begin();
+                const auto nodeDevLinkTuple =
+                    std::tuple<uint32_t, uint32_t, uint8_t>(std::get<0>(nodeDevTuple),
+                                                            std::get<1>(nodeDevTuple),
+                                                            firstLinkId);
+                if (auto countIt = results.find(nodeDevLinkTuple); countIt != results.end())
+                {
+                    countIt->second++;
+                }
+                else
+                {
+                    results[nodeDevLinkTuple] = 1;
+                }
+            }
+            else
+            {
+                for (const auto linkId : record.m_successLinkIdSet)
+                {
+                    const auto nodeDevLinkTuple =
+                        std::tuple<uint32_t, uint32_t, uint8_t>(std::get<0>(nodeDevTuple),
+                                                                std::get<1>(nodeDevTuple),
+                                                                linkId);
+                    if (auto countIt = results.find(nodeDevLinkTuple); countIt != results.end())
+                    {
+                        countIt->second++;
+                    }
+                    else
+                    {
+                        results[nodeDevLinkTuple] = 1;
+                    }
+                }
+            }
+        }
+    }
+    return results;
+}
+
+WifiTxStatsHelper::CountPerNodeDevice_t
+WifiTxStatsHelper::GetFailuresByNodeDevice() const
+{
+    WifiTxStatsHelper::CountPerNodeDevice_t results;
+    for (const auto& [nodeDevTuple, records] : m_failureMap)
+    {
+        results[{std::get<0>(nodeDevTuple), std::get<1>(nodeDevTuple)}] = records.size();
+    }
+    return results;
+}
+
+WifiTxStatsHelper::CountPerNodeDevice_t
+WifiTxStatsHelper::GetFailuresByNodeDevice(WifiMacDropReason reason) const
+{
+    WifiTxStatsHelper::CountPerNodeDevice_t results;
+    for (const auto& [nodeDevTuple, records] : m_failureMap)
+    {
+        for (const auto& record : records)
+        {
+            NS_ASSERT_MSG(record.m_dropTime.has_value() && record.m_dropReason.has_value(),
+                          "Incomplete dropped MPDU record");
+            if (record.m_dropReason == reason)
+            {
+                if (auto countIt =
+                        results.find({std::get<0>(nodeDevTuple), std::get<1>(nodeDevTuple)});
+                    countIt != results.end())
+                {
+                    countIt->second++;
+                }
+                else
+                {
+                    results[{std::get<0>(nodeDevTuple), std::get<1>(nodeDevTuple)}] = 1;
+                }
+            }
+        }
+    }
+    return results;
+}
+
+WifiTxStatsHelper::CountPerNodeDevice_t
+WifiTxStatsHelper::GetRetransmissionsByNodeDevice() const
+{
+    WifiTxStatsHelper::CountPerNodeDevice_t results;
+    for (const auto& [nodeDevLinkTuple, records] : m_successMap)
+    {
+        for (const auto& record : records)
+        {
+            if (auto countIt =
+                    results.find({std::get<0>(nodeDevLinkTuple), std::get<1>(nodeDevLinkTuple)});
+                countIt != results.end())
+            {
+                countIt->second += record.m_retransmissions;
+            }
+            else
+            {
+                results[{std::get<0>(nodeDevLinkTuple), std::get<1>(nodeDevLinkTuple)}] =
+                    record.m_retransmissions;
+            }
+        }
+    }
+    return results;
+}
+
+uint64_t
+WifiTxStatsHelper::GetSuccesses() const
+{
+    uint64_t count{0};
+    for (const auto& [nodeDevLinkTuple, records] : m_successMap)
+    {
+        count += records.size();
+    }
+    return count;
+}
+
+uint64_t
+WifiTxStatsHelper::GetFailures() const
+{
+    uint64_t count{0};
+    for (const auto& [nodeDevTuple, records] : m_failureMap)
+    {
+        count += records.size();
+    }
+    return count;
+}
+
+uint64_t
+WifiTxStatsHelper::GetFailures(WifiMacDropReason reason) const
+{
+    uint64_t count{0};
+    for (const auto& [nodeDevTuple, records] : m_failureMap)
+    {
+        for (const auto& record : records)
+        {
+            NS_ASSERT_MSG(record.m_dropTime.has_value() && record.m_dropReason.has_value(),
+                          "Incomplete dropped MPDU record");
+            if (record.m_dropReason == reason)
+            {
+                count++;
+            }
+        }
+    }
+    return count;
+}
+
+uint64_t
+WifiTxStatsHelper::GetRetransmissions() const
+{
+    uint64_t count{0};
+    for (const auto& [nodeDevTuple, records] : m_successMap)
+    {
+        for (const auto& record : records)
+        {
+            count += record.m_retransmissions;
+        }
+    }
+    return count;
+}
+
+Time
+WifiTxStatsHelper::GetDuration() const
+{
+    return Now() - m_startTime;
+}
+
+const WifiTxStatsHelper::MpduRecordsPerNodeDeviceLink_t
+WifiTxStatsHelper::GetSuccessRecords(WifiTxStatsHelper::MultiLinkSuccessType type) const
+{
+    WifiTxStatsHelper::MpduRecordsPerNodeDeviceLink_t results;
+    for (const auto& [nodeDevTuple, records] : m_successMap)
+    {
+        for (const auto& record : records)
+        {
+            NS_ASSERT_MSG(!record.m_successLinkIdSet.empty(), "No LinkId set on MPDU");
+            if (type == FIRST_LINK_IN_SET)
+            {
+                const auto firstLinkId = *record.m_successLinkIdSet.begin();
+                const auto nodeDevLinkTuple =
+                    std::tuple<uint32_t, uint32_t, uint8_t>(std::get<0>(nodeDevTuple),
+                                                            std::get<1>(nodeDevTuple),
+                                                            firstLinkId);
+                results[nodeDevLinkTuple].emplace_back(record);
+            }
+            else
+            {
+                for (const auto linkId : record.m_successLinkIdSet)
+                {
+                    const auto nodeDevLinkTuple =
+                        std::tuple<uint32_t, uint32_t, uint8_t>(std::get<0>(nodeDevTuple),
+                                                                std::get<1>(nodeDevTuple),
+                                                                linkId);
+                    results[nodeDevLinkTuple].emplace_back(record);
+                }
+            }
+        }
+    }
+    return results;
+}
+
+const WifiTxStatsHelper::MpduRecordsPerNodeDevice_t&
+WifiTxStatsHelper::GetFailureRecords() const
+{
+    return m_failureMap;
+}
+
+void
+WifiTxStatsHelper::NotifyMacEnqueue(uint32_t nodeId, uint32_t deviceId, Ptr<const WifiMpdu> mpdu)
+{
+    NS_LOG_FUNCTION(this << nodeId << deviceId << mpdu);
+    const auto now = Simulator::Now();
+    if (now > m_stopTime)
+    {
+        NS_LOG_DEBUG("Ignoring enqueue because helper is stopped");
+        return;
+    }
+    if (mpdu->GetHeader().IsData())
+    {
+        if (!mpdu->GetHeader().HasData())
+        {
+            // exclude Null frames
+            return;
+        }
+        MpduRecord record{.m_nodeId = nodeId, .m_deviceId = deviceId, .m_enqueueTime = now};
+        if (mpdu->GetHeader().IsQosData())
+        {
+            record.m_tid = mpdu->GetHeader().GetQosTid();
+        }
+        NS_LOG_INFO("Creating inflight record for packet UID "
+                    << mpdu->GetPacket()->GetUid() << " node " << nodeId << " device " << deviceId
+                    << " tid " << +record.m_tid);
+        m_inflightMap[mpdu->GetPacket()->GetUid()] = record;
+    }
+}
+
+void
+WifiTxStatsHelper::NotifyTxStart(uint32_t nodeId, uint32_t deviceId, Ptr<const Packet> pkt, Watt_u)
+{
+    NS_LOG_FUNCTION(this << nodeId << deviceId << pkt);
+    const auto now = Now();
+    if (now > m_stopTime)
+    {
+        NS_LOG_DEBUG("Ignoring TxStart because helper is stopped");
+        return;
+    }
+    if (auto pktRecord = m_inflightMap.find(pkt->GetUid()); pktRecord != m_inflightMap.end())
+    {
+        auto& [uid, record] = *pktRecord;
+        NS_LOG_INFO("Packet UID " << uid << " started");
+        if (record.m_txStartTime.IsZero())
+        {
+            NS_LOG_INFO("TxStart called (first transmission) for inflight packet UID "
+                        << pkt->GetUid());
+            record.m_txStartTime = now;
+        }
+        else
+        {
+            NS_LOG_INFO("TxStart called (retransmission) for inflight packet UID "
+                        << pkt->GetUid());
+            record.m_retransmissions++;
+        }
+    }
+}
+
+void
+WifiTxStatsHelper::NotifyAcked(uint32_t nodeId, uint32_t deviceId, Ptr<const WifiMpdu> mpdu)
+{
+    NS_LOG_FUNCTION(this << nodeId << deviceId << mpdu);
+    NS_ASSERT_MSG(!mpdu->GetInFlightLinkIds().empty(), "No LinkId set on MPDU");
+    const auto now = Now();
+    if (now <= m_startTime || now > m_stopTime)
+    {
+        if (auto pktRecord = m_inflightMap.find(mpdu->GetPacket()->GetUid());
+            pktRecord != m_inflightMap.end())
+        {
+            m_inflightMap.erase(pktRecord);
+        }
+        NS_LOG_DEBUG("Ignoring acknowledgement because the time is out of range");
+        return;
+    }
+    // Get the set of in-flight link IDs
+    const auto linkIds = mpdu->GetInFlightLinkIds();
+    if (auto pktRecord = m_inflightMap.find(mpdu->GetPacket()->GetUid());
+        pktRecord != m_inflightMap.end())
+    {
+        auto& [uid, record] = *pktRecord;
+        record.m_ackTime = now;
+        record.m_successLinkIdSet = linkIds;
+        record.m_mpduSeqNum = mpdu->GetHeader().GetSequenceNumber();
+        // Store record in success map and remove it below from inflight map
+        NS_LOG_INFO("Successful transmission logged of packet UID " << uid);
+        m_successMap[{nodeId, deviceId}].push_back(std::move(record));
+        NS_LOG_INFO("Erasing packet UID " << uid << " from inflight map due to success");
+        m_inflightMap.erase(pktRecord);
+    }
+}
+
+void
+WifiTxStatsHelper::NotifyMacDropped(uint32_t nodeId,
+                                    uint32_t deviceId,
+                                    WifiMacDropReason reason,
+                                    Ptr<const WifiMpdu> mpdu)
+{
+    NS_LOG_FUNCTION(this << nodeId << deviceId << +reason << mpdu);
+    const auto now = Now();
+    if (now <= m_startTime || now > m_stopTime)
+    {
+        if (auto pktRecord = m_inflightMap.find(mpdu->GetPacket()->GetUid());
+            pktRecord != m_inflightMap.end())
+        {
+            m_inflightMap.erase(pktRecord);
+        }
+        NS_LOG_DEBUG("Ignoring drop because the time is out of range");
+        return;
+    }
+    if (auto pktRecord = m_inflightMap.find(mpdu->GetPacket()->GetUid());
+        pktRecord != m_inflightMap.end())
+    {
+        auto& [uid, record] = *pktRecord;
+        NS_LOG_INFO("Packet UID " << uid << " dropped");
+        record.m_dropTime = now;
+        record.m_dropReason = reason;
+        record.m_mpduSeqNum = mpdu->GetHeader().GetSequenceNumber();
+        NS_LOG_INFO("Failed transmission logged of packet UID " << uid);
+        // Store record in failure map and remove it below from inflight map
+        m_failureMap[{nodeId, deviceId}].push_back(std::move(record));
+        NS_LOG_INFO("Erasing packet UID " << uid << " from inflight map due to failure");
+        m_inflightMap.erase(pktRecord);
+    }
+}
+
+} // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/helper/wifi-tx-stats-helper.h ns-3.44/src/wifi/helper/wifi-tx-stats-helper.h
--- ns-3.43/src/wifi/helper/wifi-tx-stats-helper.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/wifi/helper/wifi-tx-stats-helper.h	2025-03-09 16:55:49.779372700 -0700
@@ -0,0 +1,389 @@
+/*
+ * Copyright (c) 2024 Huazhong University of Science and Technology
+ * Copyright (c) 2024 University of Washington
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Authors:  Muyuan Shen <muyuan@uw.edu>
+ *           Hao Yin <haoyin@uw.edu>
+ */
+
+#ifndef WIFI_TX_STATS_HELPER_H
+#define WIFI_TX_STATS_HELPER_H
+
+#include "ns3/nstime.h"
+#include "ns3/object.h"
+#include "ns3/qos-utils.h"
+#include "ns3/type-id.h"
+#include "ns3/wifi-mac.h"
+#include "ns3/wifi-types.h"
+#include "ns3/wifi-utils.h"
+
+#include <cstdint>
+#include <functional>
+#include <map>
+#include <string>
+#include <tuple>
+#include <vector>
+
+namespace ns3
+{
+
+class NetDeviceContainer;
+class NodeContainer;
+class Time;
+class Packet;
+class WifiMpdu;
+
+/**
+ * @brief Statistics helper for tracking outcomes of data MPDU transmissions.
+ *
+ * This helper may be used to track statistics of all data MPDU transmissions on a given Node,
+ * WifiNetDevice, or even link granularity (for MLO operation), including counts of the
+ * number of successfully acknowledged MPDUs, the number of retransmissions (if any) of
+ * those successfully acknowledged MPDUs, and the number of failed MPDUs (by drop reason).
+ * The helper can also be used to access timestamped data about how long the MPDU was enqueued
+ * and how long it took to complete acknowledgement (or failure) once the first transmission
+ * of it was attempted. For failed MPDUs, their WifiMacDropReason can be accessed.
+ */
+class WifiTxStatsHelper
+{
+  public:
+    /**
+     * When Multi-Link Operation (MLO) is used, it is possible for MPDUs to be sent on
+     * multiple links concurrently.  When such an MPDU is acked, a question arises as to how
+     * to count the number of successes (only one success, or success on each link).  The
+     * ACK does not convey which transmission on which link triggered the event.  Therefore,
+     * two policies are defined for how to count a successful event.
+     * 1) FIRST_LINK_IN_SET: Count the success on the first link of the set of in-flight links
+     * 2) ALL_LINKS: Count the success on all links in the in-flight link set
+     */
+    enum MultiLinkSuccessType : uint8_t
+    {
+        FIRST_LINK_IN_SET,
+        ALL_LINKS
+    };
+
+    /**
+     * Structure for recording information about an individual data MPDU transmission.
+     */
+    struct MpduRecord
+    {
+        uint32_t m_nodeId{std::numeric_limits<uint32_t>::max()};   //!< The sending node ID
+        uint32_t m_deviceId{std::numeric_limits<uint32_t>::max()}; //!< The sending device ID
+        Time m_enqueueTime; //!< The enqueue time (time that the packet was added to a WifiMacQueue)
+        Time m_txStartTime; //!< The time at which the MPDU was first transmitted
+        std::optional<Time> m_dropTime;    //!< The time of removal from the WifiMacQueue, if failed
+        Time m_ackTime;                    //!< The time at which the MPDU was acknowledged
+        uint64_t m_mpduSeqNum{0};          //!< The MPDU sequence number
+        uint32_t m_retransmissions{0};     //!< A count of the number of retransmissions of the MPDU
+        uint8_t m_tid{WIFI_TID_UNDEFINED}; //!< The TID for the MPDU
+        std::set<uint8_t> m_successLinkIdSet; //!< If acked, the set of in-flight link ID(s)
+        std::optional<WifiMacDropReason> m_dropReason; //!< If failed, the drop reason
+    };
+
+    /**
+     *  Default constructor; start time initialized to zero and stop time to Time::Max()
+     */
+    WifiTxStatsHelper();
+    /**
+     * Construct a helper with start and stop times. Only those MPDUs
+     * enqueued between the start and stop times will be counted.
+     *
+     * @param startTime The measurement start time
+     * @param stopTime The measurement stop time
+     */
+    WifiTxStatsHelper(Time startTime, Time stopTime);
+
+    /**
+     * Enables trace collection for all nodes and WifiNetDevices in the specified NodeContainer.
+     * @param nodes The NodeContainer to which traces are to be connected.
+     */
+    void Enable(const NodeContainer& nodes);
+    /**
+     * Enables trace collection for all WifiNetDevices in the specified NetDeviceContainer.
+     * @param devices The NetDeviceContainer to which traces are to be connected.
+     */
+    void Enable(const NetDeviceContainer& devices);
+    /**
+     * @brief Set the start time for statistics collection
+     *
+     * No MPDUs enqueued before startTime will be included
+     * in the statistics.
+     *
+     * @param startTime The measurement start time
+     */
+    void Start(Time startTime);
+    /**
+     * @brief Set the stop time for statistics collection
+     *
+     * No MPDUs enqueued after stopTime elapses will be included in
+     * statistics. However, MPDUs that were enqueued before stopTime
+     * (and after startTime) will be included in the statistics if
+     * they are dequeued before the statistics are queried by the user.
+     *
+     * @param stopTime The measurement stop time
+     */
+    void Stop(Time stopTime);
+    /**
+     * @brief Clear the data structures for all completed successful and failed MpduRecords
+     */
+    void Reset();
+
+    //
+    // Hash function and unordered maps
+    //
+
+    /**
+     * Hash function for the tuples used in unordered_maps
+     */
+    struct TupleHash
+    {
+        /**
+         * Combines two hash values into one (similar to boost::hash_combine)
+         * @param seed the starting hash point
+         * @param value the value to combine to the hash
+         */
+        template <typename T>
+        void hash_combine(size_t& seed, const T& value) const
+        {
+            seed ^= std::hash<T>{}(value) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
+        }
+
+        /**
+         * Hash function for tuples of arbitrary size
+         * @param tuple the input Tuple
+         * @return the hash of the tuple elements
+         */
+        template <typename Tuple, size_t Index = 0>
+        size_t tuple_hash(const Tuple& tuple) const
+        {
+            if constexpr (Index < std::tuple_size<Tuple>::value)
+            {
+                size_t seed = tuple_hash<Tuple, Index + 1>(tuple);
+                hash_combine(seed, std::get<Index>(tuple));
+                return seed;
+            }
+            else
+            {
+                return 0; // Base case
+            }
+        }
+
+        /**
+         * Operator overload for calculating hash of tuple
+         * @param tuple the input Tuple
+         * @return the hash of the tuple elements
+         */
+        template <typename... Args>
+        size_t operator()(const std::tuple<Args...>& tuple) const
+        {
+            return tuple_hash(tuple);
+        }
+    };
+
+    using CountPerNodeDeviceLink_t =
+        std::unordered_map<std::tuple<uint32_t, uint32_t, uint8_t>,
+                           uint64_t,
+                           TupleHash>; //!< std::unordered_map of {nodeId, deviceId, linkId} tuple
+                                       //!< to counter value
+    using CountPerNodeDevice_t =
+        std::unordered_map<std::tuple<uint32_t, uint32_t>,
+                           uint64_t,
+                           TupleHash>; //!< std::unordered_map of {nodeId, deviceId} tuple to
+                                       //!< counter value
+    using MpduRecordsPerNodeDeviceLink_t =
+        std::unordered_map<std::tuple<uint32_t, uint32_t, uint8_t>,
+                           std::list<MpduRecord>,
+                           TupleHash>; //!< std::unordered_map of {nodeId, deviceId, linkId} tuple
+                                       //!< to a list of MPDU records
+    using MpduRecordsPerNodeDevice_t =
+        std::unordered_map<std::tuple<uint32_t, uint32_t>,
+                           std::list<MpduRecord>,
+                           TupleHash>; //!< std::unordered_map of {nodeId, deviceId} tuple to a list
+                                       //!< of MPDU records
+
+    //
+    // Methods to retrieve the counts tabulated by this helper
+    //
+
+    /**
+     * @brief Return the counts of successful MPDU transmissions in a hash map
+     *
+     * The return type is an std::unordered_map, and the keys are tuples of {node ID,
+     * device ID}. The value returned by indexing the tuple is the count of
+     * successful MPDU transmissions.
+     *
+     * If Multi-Link Operation (MLO) is configured, a variant of this method is available
+     * that returns an unordered_map indexed by a tuple that includes the Link ID, for
+     * more granular statistics reporting.
+     * @see GetSuccessesByNodeDeviceLink
+     *
+     * If Multi-Link Operation (MLO) is configured, and MPDUs are sent on multiple
+     * links in parallel, this method will count one success for any such acknowledged
+     * MPDU (even if it was successfully received on more than one link).
+     *
+     * @return A hash map with counts of MPDU successful transmissions
+     */
+    CountPerNodeDevice_t GetSuccessesByNodeDevice() const;
+    /**
+     * @brief Return the counts of successful MPDU transmissions in a hash map
+     * @param type how the statistics handle a successful MPDU transmitted on multiple links
+     *
+     * The return type is an std::unordered_map, and the keys are tuples of {node ID,
+     * device ID, link ID}. The value returned by indexing the tuple is the count of
+     * successful MPDU transmissions.
+     *
+     * The link ID corresponds to the link for which the MPDU was successfully
+     * acknowledged, regardless of the links that may have been used in
+     * earlier transmissions of the MPDU.
+     *
+     * For a similar method that does not use Link IDs in the key,
+     * @see GetSuccessesByNodeDevice
+     *
+     * @return A hash map with counts of MPDU successful transmissions
+     */
+    CountPerNodeDeviceLink_t GetSuccessesByNodeDeviceLink(
+        WifiTxStatsHelper::MultiLinkSuccessType type = FIRST_LINK_IN_SET) const;
+    /**
+     * @brief Return the counts of failed MPDU transmissions in a hash map
+     *
+     * The return type is an std::unordered_map, and the keys are tuples of {node ID,
+     * device ID}. The value returned by indexing the tuple is the count of
+     * failed MPDU transmissions.
+     *
+     * The number of failures are only stored with the granularity
+     * of per-device, since in a multi-link scenario, some retransmissions
+     * (that lead to eventual failure) may occur on different links.
+     *
+     * @return A hash map with counts of MPDU failed transmissions
+     */
+    CountPerNodeDevice_t GetFailuresByNodeDevice() const;
+    /**
+     * @brief Return the counts of failed MPDU transmissions due to given drop reason in a hash map
+     * @param reason Reason for dropping the MPDU
+     *
+     * The return type is an std::unordered_map, and the keys are tuples of {node ID,
+     * device ID}. The value returned by indexing the tuple is the count of
+     * failed MPDU transmissions due to the reason given.
+     *
+     * The number of failures are only stored with the granularity
+     * of per-device, since in a multi-link scenario, some retransmissions
+     * (that lead to eventual failure) may occur on different links.
+     *
+     * @return A hash map with counts of MPDU failed transmissions
+     */
+    CountPerNodeDevice_t GetFailuresByNodeDevice(WifiMacDropReason reason) const;
+    /**
+     * @brief Return the counts of MPDU retransmissions in a hash map
+     *
+     * The return type is an std::unordered_map, and the keys are tuples of {node ID,
+     * device ID}. The value returned by indexing the tuple is the count of
+     * MPDU retransmissions of those MPDUs that were successfully acked.
+     *
+     * The number of retransmissions are only stored with the granularity
+     * of per-device, since in a multi-link scenario, some retransmissions
+     * may be sent on different links.
+     *
+     * @return A hash map with counts of MPDU retransmissions for successful MPDUs
+     */
+    CountPerNodeDevice_t GetRetransmissionsByNodeDevice() const;
+    /**
+     * @brief Return the count of successful MPDU transmissions across all enabled devices
+     *
+     * @return The count of all successful MPDU transmissions
+     */
+    uint64_t GetSuccesses() const;
+    /**
+     * @brief Return the count of failed MPDU transmissions across all enabled devices
+     *
+     * @return The count of all failed MPDU transmissions
+     */
+    uint64_t GetFailures() const;
+    /**
+     * @brief Return the count of failed MPDU transmissions due to given drop reason across
+     * all enabled devices
+     * @param reason Reason for dropping the MPDU
+     *
+     * @return The count of all failed MPDU transmissions for the specified reason
+     */
+    uint64_t GetFailures(WifiMacDropReason reason) const;
+    /**
+     * @brief Return the count of MPDU retransmissions across all enabled devices
+     *
+     * @return The count of all MPDU retransmissions for acked MPDUs
+     */
+    uint64_t GetRetransmissions() const;
+    /**
+     * @brief Return the duration since the helper was started or reset
+     *
+     * @return The duration since the helper was started or reset
+     */
+    Time GetDuration() const;
+    /**
+     * @brief Return a hash map of successful MPDU records
+     * @param type how the statistics handle a successful MPDU transmitted on multiple links
+     *
+     * The return type is an std::unordered_map, and the keys are tuples of {node ID,
+     * device ID, link ID}. The value returned by indexing the tuple is the list of MPDU
+     * records of the MPDUs that were successfully acked.
+     *
+     * @return A const reference to the hash map of successful MPDU records
+     */
+    const MpduRecordsPerNodeDeviceLink_t GetSuccessRecords(
+        WifiTxStatsHelper::MultiLinkSuccessType type = FIRST_LINK_IN_SET) const;
+    /**
+     * @brief Return a hash map of MPDU records for failed transmissions
+     *
+     * The return type is an std::unordered_map, and the keys are tuples of {node ID,
+     * device ID}. The value returned by indexing the tuple is the list of MPDU
+     * records of the MPDUs that failed.
+     *
+     * @return A const reference to the hash map of MPDU records corresponding to failure
+     */
+    const MpduRecordsPerNodeDevice_t& GetFailureRecords() const;
+
+  private:
+    /**
+     * @brief Callback for the WifiMacQueue::Enqueue trace
+     * @param nodeId the Node ID triggering the trace
+     * @param deviceId the Node ID triggering the trace
+     * @param mpdu The MPDU enqueued
+     */
+    void NotifyMacEnqueue(uint32_t nodeId, uint32_t deviceId, Ptr<const WifiMpdu> mpdu);
+    /**
+     * @brief Callback for the WifiPhy::PhyTxBegin trace
+     * @param nodeId the Node ID triggering the trace
+     * @param deviceId the Node ID triggering the trace
+     * @param pkt The frame being sent
+     */
+    void NotifyTxStart(uint32_t nodeId, uint32_t deviceId, Ptr<const Packet> pkt, Watt_u);
+    /**
+     * @brief Callback for the WifiMac::AckedMpdu trace
+     * @param nodeId the Node ID triggering the trace
+     * @param deviceId the Node ID triggering the trace
+     * @param mpdu The MPDU acked
+     */
+    void NotifyAcked(uint32_t nodeId, uint32_t deviceId, Ptr<const WifiMpdu> mpdu);
+    /**
+     * @brief Callback for the WifiMac::DroppedMpdu trace
+     * @param nodeId the Node ID triggering the trace
+     * @param deviceId the Node ID triggering the trace
+     * @param reason Reason for dropping the MPDU
+     * @param mpdu The MPDU dropped
+     */
+    void NotifyMacDropped(uint32_t nodeId,
+                          uint32_t deviceId,
+                          WifiMacDropReason reason,
+                          Ptr<const WifiMpdu> mpdu);
+
+    MpduRecordsPerNodeDevice_t m_successMap;      //!< The nested map of successful MPDUs
+    MpduRecordsPerNodeDevice_t m_failureMap;      //!< The nested map of failed MPDUs
+    std::map<uint64_t, MpduRecord> m_inflightMap; //!< In-flight MPDUs; key is a Packet UID
+    Time m_startTime;                             //!< The start time for recording statistics
+    Time m_stopTime{Time::Max()};                 //!< The stop time for recording statistics
+};
+
+} // namespace ns3
+
+#endif // WIFI_TX_STATS_HELPER_H
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/helper/yans-wifi-helper.h ns-3.44/src/wifi/helper/yans-wifi-helper.h
--- ns-3.43/src/wifi/helper/yans-wifi-helper.h	2024-10-09 16:41:10.112656800 -0700
+++ ns-3.44/src/wifi/helper/yans-wifi-helper.h	2025-03-09 16:55:49.779372700 -0700
@@ -17,7 +17,7 @@
 {
 
 /**
- * \brief manage and create wifi channel objects for the YANS model.
+ * @brief manage and create wifi channel objects for the YANS model.
  *
  * The intent of this class is to make it easy to create a channel object
  * which implements the YANS channel model. The YANS channel model is described
@@ -38,14 +38,14 @@
      * a channel model with a propagation delay equal to a constant, the speed of light,
      * and a propagation loss based on a log distance model with a reference loss of 46.6777 dB
      * at reference distance of 1m.
-     * \returns YansWifiChannelHelper
+     * @returns YansWifiChannelHelper
      */
     static YansWifiChannelHelper Default();
 
     /**
-     * \tparam Ts \deduced Argument types
-     * \param name the name of the model to add
-     * \param [in] args Name and AttributeValue pairs to set.
+     * @tparam Ts \deduced Argument types
+     * @param name the name of the model to add
+     * @param [in] args Name and AttributeValue pairs to set.
      *
      * Add a propagation loss model to the set of currently-configured loss models.
      * This method is additive to allow you to construct complex propagation loss models
@@ -59,9 +59,9 @@
     template <typename... Ts>
     void AddPropagationLoss(std::string name, Ts&&... args);
     /**
-     * \tparam Ts \deduced Argument types
-     * \param name the name of the model to set
-     * \param [in] args Name and AttributeValue pairs to set.
+     * @tparam Ts \deduced Argument types
+     * @param name the name of the model to set
+     * @param [in] args Name and AttributeValue pairs to set.
      *
      * Configure a propagation delay for this channel.
      */
@@ -69,7 +69,7 @@
     void SetPropagationDelay(std::string name, Ts&&... args);
 
     /**
-     * \returns a new channel
+     * @returns a new channel
      *
      * Create a channel based on the configuration parameters set previously.
      */
@@ -81,11 +81,11 @@
      * used in the propagation loss models.  Return the number of streams
      * (possibly zero) that have been assigned.
      *
-     * \param c NetDeviceContainer of the set of net devices for which the
+     * @param c NetDeviceContainer of the set of net devices for which the
      *          WifiNetDevice should be modified to use fixed streams
-     * \param stream first stream index to use
+     * @param stream first stream index to use
      *
-     * \return the number of stream indices assigned by this helper
+     * @return the number of stream indices assigned by this helper
      */
     int64_t AssignStreams(Ptr<YansWifiChannel> c, int64_t stream);
 
@@ -95,7 +95,7 @@
 };
 
 /**
- * \brief Make it easy to create and manage PHY objects for the YANS model.
+ * @brief Make it easy to create and manage PHY objects for the YANS model.
  *
  * The YANS PHY model is described in "Yet Another Network Simulator",
  * published in WNS2 2006; an author-prepared version of this paper
@@ -114,13 +114,13 @@
     YansWifiPhyHelper();
 
     /**
-     * \param channel the channel to associate to this helper
+     * @param channel the channel to associate to this helper
      *
      * Every PHY created by a call to Install is associated to this channel.
      */
     void SetChannel(Ptr<YansWifiChannel> channel);
     /**
-     * \param channelName The name of the channel to associate to this helper
+     * @param channelName The name of the channel to associate to this helper
      *
      * Every PHY created by a call to Install is associated to this channel.
      */
@@ -128,9 +128,9 @@
 
   private:
     /**
-     * \param node the node on which we wish to create a wifi PHY
-     * \param device the device within which this PHY will be created
-     * \returns newly-created PHY objects.
+     * @param node the node on which we wish to create a wifi PHY
+     * @param device the device within which this PHY will be created
+     * @returns newly-created PHY objects.
      *
      * This method implements the pure virtual method defined in \ref ns3::WifiPhyHelper.
      */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/addba-extension.h ns-3.44/src/wifi/model/addba-extension.h
--- ns-3.43/src/wifi/model/addba-extension.h	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/addba-extension.h	2025-03-09 16:55:49.779372700 -0700
@@ -15,7 +15,7 @@
 {
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * The IEEE 802.11 ADDBA Extension Element (Sec. 9.4.2.139 of 802.11-2020)
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/adhoc-wifi-mac.h ns-3.44/src/wifi/model/adhoc-wifi-mac.h
--- ns-3.43/src/wifi/model/adhoc-wifi-mac.h	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/adhoc-wifi-mac.h	2025-03-09 16:55:49.779372700 -0700
@@ -17,16 +17,16 @@
 {
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
- * \brief Wifi MAC high model for an ad-hoc Wifi MAC
+ * @brief Wifi MAC high model for an ad-hoc Wifi MAC
  */
 class AdhocWifiMac : public WifiMac
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/ampdu-subframe-header.h ns-3.44/src/wifi/model/ampdu-subframe-header.h
--- ns-3.43/src/wifi/model/ampdu-subframe-header.h	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/ampdu-subframe-header.h	2025-03-09 16:55:49.779372700 -0700
@@ -15,8 +15,8 @@
 {
 
 /**
- * \ingroup wifi
- * \brief Headers for A-MPDU subframes
+ * @ingroup wifi
+ * @brief Headers for A-MPDU subframes
  */
 class AmpduSubframeHeader : public Header
 {
@@ -25,8 +25,8 @@
     ~AmpduSubframeHeader() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -39,25 +39,25 @@
     /**
      * Set the length field.
      *
-     * \param length in bytes
+     * @param length in bytes
      */
     void SetLength(uint16_t length);
     /**
      * Set the EOF field.
      *
-     * \param eof set EOF field if true
+     * @param eof set EOF field if true
      */
     void SetEof(bool eof);
     /**
      * Return the length field.
      *
-     * \return the length field in bytes
+     * @return the length field in bytes
      */
     uint16_t GetLength() const;
     /**
      * Return the EOF field.
      *
-     * \return the EOF field
+     * @return the EOF field
      */
     bool GetEof() const;
     /**
@@ -65,7 +65,7 @@
      * signature field is correct, i.e. corresponds to the
      * unique pattern 0x4E.
      *
-     * \return true if the signature is valid, false otherwise
+     * @return true if the signature is valid, false otherwise
      */
     bool IsSignatureValid() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/ampdu-tag.cc ns-3.44/src/wifi/model/ampdu-tag.cc
--- ns-3.43/src/wifi/model/ampdu-tag.cc	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/ampdu-tag.cc	2025-03-09 16:55:49.779372700 -0700
@@ -30,7 +30,7 @@
 
 AmpduTag::AmpduTag()
     : m_nbOfMpdus(0),
-      m_duration(Seconds(0))
+      m_duration()
 {
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/ampdu-tag.h ns-3.44/src/wifi/model/ampdu-tag.h
--- ns-3.43/src/wifi/model/ampdu-tag.h	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/ampdu-tag.h	2025-03-09 16:55:49.779372700 -0700
@@ -17,7 +17,7 @@
 {
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * The aim of the AmpduTag is to provide means for a MAC to specify that a packet includes A-MPDU
  * since this is done in HT-SIG and there is no HT-SIG representation in ns-3
@@ -26,8 +26,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -42,26 +42,26 @@
      */
     AmpduTag();
     /**
-     * \param nbOfMpdus the remaining number of MPDUs
+     * @param nbOfMpdus the remaining number of MPDUs
      *
      * Set the remaining number of MPDUs in the A-MPDU.
      */
     void SetRemainingNbOfMpdus(uint8_t nbOfMpdus);
     /**
-     * \param duration the remaining duration of the A-MPDU
+     * @param duration the remaining duration of the A-MPDU
      *
      * Set the remaining duration of the A-MPDU.
      */
     void SetRemainingAmpduDuration(Time duration);
 
     /**
-     * \return the remaining number of MPDUs in an A-MPDU
+     * @return the remaining number of MPDUs in an A-MPDU
      *
      * Returns the remaining number of MPDUs in an A-MPDU
      */
     uint8_t GetRemainingNbOfMpdus() const;
     /**
-     * \return the remaining duration of an A-MPDU
+     * @return the remaining duration of an A-MPDU
      *
      * Returns the remaining duration of an A-MPDU
      */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/amsdu-subframe-header.h ns-3.44/src/wifi/model/amsdu-subframe-header.h
--- ns-3.43/src/wifi/model/amsdu-subframe-header.h	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/amsdu-subframe-header.h	2025-03-09 16:55:49.779372700 -0700
@@ -16,8 +16,8 @@
 {
 
 /**
- * \ingroup wifi
- * \brief Headers for A-MSDU subframes
+ * @ingroup wifi
+ * @brief Headers for A-MSDU subframes
  */
 class AmsduSubframeHeader : public Header
 {
@@ -26,8 +26,8 @@
     ~AmsduSubframeHeader() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -39,32 +39,32 @@
 
     /**
      * Set destination address function
-     * \param to the destination MAC address
+     * @param to the destination MAC address
      */
     void SetDestinationAddr(Mac48Address to);
     /**
      * Set source address function
-     * \param to the source MAC address
+     * @param to the source MAC address
      */
     void SetSourceAddr(Mac48Address to);
     /**
      * Set length function
-     * \param length the length in bytes
+     * @param length the length in bytes
      */
     void SetLength(uint16_t length);
     /**
      * Get destination address function
-     * \returns the destination MAC address
+     * @returns the destination MAC address
      */
     Mac48Address GetDestinationAddr() const;
     /**
      * Get source address function
-     * \returns the source MAC address
+     * @returns the source MAC address
      */
     Mac48Address GetSourceAddr() const;
     /**
      * Get length function
-     * \returns the length in bytes
+     * @returns the length in bytes
      */
     uint16_t GetLength() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/ap-wifi-mac.cc ns-3.44/src/wifi/model/ap-wifi-mac.cc
--- ns-3.43/src/wifi/model/ap-wifi-mac.cc	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/ap-wifi-mac.cc	2025-03-09 16:55:49.783372600 -0700
@@ -12,10 +12,10 @@
 
 #include "amsdu-subframe-header.h"
 #include "channel-access-manager.h"
+#include "gcr-manager.h"
 #include "mac-rx-middle.h"
 #include "mac-tx-middle.h"
 #include "mgt-action-headers.h"
-#include "mgt-headers.h"
 #include "msdu-aggregator.h"
 #include "qos-txop.h"
 #include "reduced-neighbor-report.h"
@@ -30,7 +30,6 @@
 #include "ns3/he-configuration.h"
 #include "ns3/ht-configuration.h"
 #include "ns3/log.h"
-#include "ns3/multi-link-element.h"
 #include "ns3/packet.h"
 #include "ns3/pointer.h"
 #include "ns3/random-variable-stream.h"
@@ -170,6 +169,13 @@
                 MakeAttributeContainerAccessor<TimeAccessParamsPairValue, ';'>(
                     &ApWifiMac::m_txopLimitsForSta),
                 GetTimeAccessParamsChecker())
+            .AddAttribute("GcrManager",
+                          "The GCR manager object.",
+                          TypeId::ATTR_GET |
+                              TypeId::ATTR_CONSTRUCT, // prevent setting after construction
+                          PointerValue(),
+                          MakePointerAccessor(&ApWifiMac::GetGcrManager, &ApWifiMac::SetGcrManager),
+                          MakePointerChecker<GcrManager>())
             .AddTraceSource("AssociatedSta",
                             "A station associated with this access point.",
                             MakeTraceSourceAccessor(&ApWifiMac::m_assocLogger),
@@ -230,6 +236,11 @@
         m_apEmlsrManager->Dispose();
     }
     m_apEmlsrManager = nullptr;
+    if (m_gcrManager)
+    {
+        m_gcrManager->Dispose();
+    }
+    m_gcrManager = nullptr;
     WifiMac::DoDispose();
 }
 
@@ -266,6 +277,59 @@
 }
 
 void
+ApWifiMac::SetGcrManager(Ptr<GcrManager> gcrManager)
+{
+    NS_LOG_FUNCTION(this << gcrManager);
+    m_gcrManager = gcrManager;
+    m_gcrManager->SetWifiMac(this);
+}
+
+Ptr<GcrManager>
+ApWifiMac::GetGcrManager() const
+{
+    return m_gcrManager;
+}
+
+bool
+ApWifiMac::UseGcr(const WifiMacHeader& hdr) const
+{
+    if (!hdr.IsQosData())
+    {
+        return false;
+    }
+
+    if (!IsGroupcast(hdr.GetAddr1()))
+    {
+        return false;
+    }
+
+    if (!m_gcrManager)
+    {
+        return false;
+    }
+
+    if (m_gcrManager->GetRetransmissionPolicy() ==
+        GroupAddressRetransmissionPolicy::NO_ACK_NO_RETRY)
+    {
+        return false;
+    }
+
+    /*
+     * 802.11-2020 11.21.16.3.4 (GCR operation):
+     * An AP or mesh STA shall transmit a frame belonging to a group address
+     * via the GCR service if any associated STA or peer mesh STA has a GCR
+     * agreement for the group address and, otherwise, does not transmit the
+     * frame via the GCR service.
+     */
+    if (m_gcrManager->GetMemberStasForGroupAddress(hdr.GetAddr1()).empty())
+    {
+        return false;
+    }
+
+    return true;
+}
+
+void
 ApWifiMac::DoCompleteConfig()
 {
     NS_LOG_FUNCTION(this);
@@ -627,44 +691,25 @@
     MuEdcaParameterSet muEdcaParameters;
     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());
+    muEdcaParameters.SetMuAifsn(AC_BE, heConfiguration->m_muBeAifsn);
+    muEdcaParameters.SetMuCwMin(AC_BE, heConfiguration->m_muBeCwMin);
+    muEdcaParameters.SetMuCwMax(AC_BE, heConfiguration->m_muBeCwMax);
+    muEdcaParameters.SetMuEdcaTimer(AC_BE, heConfiguration->m_beMuEdcaTimer);
+
+    muEdcaParameters.SetMuAifsn(AC_BK, heConfiguration->m_muBkAifsn);
+    muEdcaParameters.SetMuCwMin(AC_BK, heConfiguration->m_muBkCwMin);
+    muEdcaParameters.SetMuCwMax(AC_BK, heConfiguration->m_muBkCwMax);
+    muEdcaParameters.SetMuEdcaTimer(AC_BK, heConfiguration->m_bkMuEdcaTimer);
+
+    muEdcaParameters.SetMuAifsn(AC_VI, heConfiguration->m_muViAifsn);
+    muEdcaParameters.SetMuCwMin(AC_VI, heConfiguration->m_muViCwMin);
+    muEdcaParameters.SetMuCwMax(AC_VI, heConfiguration->m_muViCwMax);
+    muEdcaParameters.SetMuEdcaTimer(AC_VI, heConfiguration->m_viMuEdcaTimer);
+
+    muEdcaParameters.SetMuAifsn(AC_VO, heConfiguration->m_muVoAifsn);
+    muEdcaParameters.SetMuCwMin(AC_VO, heConfiguration->m_muVoCwMin);
+    muEdcaParameters.SetMuCwMax(AC_VO, heConfiguration->m_muVoCwMax);
+    muEdcaParameters.SetMuEdcaTimer(AC_VO, heConfiguration->m_voMuEdcaTimer);
 
     // The timers of the MU EDCA Parameter Set must be either all zero or all
     // non-zero. The information element is advertised if all timers are non-zero
@@ -708,17 +753,23 @@
             rnr.SetShortSsid(nbrId, 0, 0);
             rnr.SetBssParameters(nbrId, 0, 0);
             rnr.SetPsd20MHz(nbrId, 0, 0);
-            rnr.SetMldParameters(nbrId, 0, 0, index, 0);
+            rnr.SetMldParameters(nbrId, 0, {0, index, 0, 0, 0});
         }
     }
     return rnr;
 }
 
 MultiLinkElement
-ApWifiMac::GetMultiLinkElement(uint8_t linkId, WifiMacType frameType, const Mac48Address& to)
+ApWifiMac::GetMultiLinkElement(uint8_t linkId,
+                               WifiMacType frameType,
+                               const Mac48Address& to,
+                               const std::optional<MultiLinkElement>& mlProbeReqMle)
 {
     NS_LOG_FUNCTION(this << +linkId << frameType << to);
     NS_ABORT_IF(GetNLinks() == 1);
+    NS_ABORT_MSG_IF(mlProbeReqMle.has_value() && frameType != WIFI_MAC_MGT_PROBE_RESPONSE,
+                    "ML Probe Request Multi-Link Element cannot be provided for frame type "
+                        << frameType);
 
     MultiLinkElement mle(MultiLinkElement::BASIC_VARIANT);
     mle.SetMldMacAddress(GetAddress());
@@ -728,9 +779,7 @@
     auto ehtConfiguration = GetEhtConfiguration();
     NS_ASSERT(ehtConfiguration);
 
-    if (BooleanValue emlsrActivated;
-        ehtConfiguration->GetAttributeFailSafe("EmlsrActivated", emlsrActivated) &&
-        emlsrActivated.Get())
+    if (ehtConfiguration->m_emlsrActivated)
     {
         mle.SetEmlsrSupported(true);
         // When the EMLSR Padding Delay subfield is included in a frame sent by an AP affiliated
@@ -739,8 +788,7 @@
         // with an AP MLD, the EMLSR Transition Delay subfield is reserved. (Sec. 9.4.2.312.2.3
         // of 802.11be D2.3)
         TimeValue time;
-        ehtConfiguration->GetAttribute("TransitionTimeout", time);
-        mle.SetTransitionTimeout(time.Get());
+        mle.SetTransitionTimeout(ehtConfiguration->m_transitionTimeout);
 
         // An AP affiliated with an AP MLD may include the Medium Synchronization Delay Information
         // subfield in the Common Info field of the Basic Multi-Link element carried in transmitted
@@ -749,17 +797,9 @@
         if (frameType == WIFI_MAC_MGT_ASSOCIATION_RESPONSE)
         {
             auto& commonInfo = mle.GetCommonInfoBasic();
-
-            ehtConfiguration->GetAttribute("MediumSyncDuration", time);
-            commonInfo.SetMediumSyncDelayTimer(time.Get());
-
-            IntegerValue ofdmEdThres;
-            ehtConfiguration->GetAttribute("MsdOfdmEdThreshold", ofdmEdThres);
-            commonInfo.SetMediumSyncOfdmEdThreshold(ofdmEdThres.Get());
-
-            UintegerValue maxNTxops;
-            ehtConfiguration->GetAttribute("MsdMaxNTxops", maxNTxops);
-            commonInfo.SetMediumSyncMaxNTxops(maxNTxops.Get());
+            commonInfo.SetMediumSyncDelayTimer(ehtConfiguration->m_mediumSyncDuration);
+            commonInfo.SetMediumSyncOfdmEdThreshold(ehtConfiguration->m_msdOfdmEdThreshold);
+            commonInfo.SetMediumSyncMaxNTxops(ehtConfiguration->m_msdMaxNTxops);
         }
     }
 
@@ -775,9 +815,8 @@
         mldCapabilities.emplace();
         mldCapabilities->maxNSimultaneousLinks = GetNLinks() - 1; // assuming STR for now
         mldCapabilities->srsSupport = 0;
-        EnumValue<WifiTidToLinkMappingNegSupport> negSupport;
-        ehtConfiguration->GetAttributeFailSafe("TidToLinkMappingNegSupport", negSupport);
-        mldCapabilities->tidToLinkMappingSupport = static_cast<uint8_t>(negSupport.Get());
+        mldCapabilities->tidToLinkMappingSupport =
+            static_cast<uint8_t>(ehtConfiguration->m_tidLinkMappingSupport);
         mldCapabilities->freqSepForStrApMld = 0; // not supported yet
         mldCapabilities->aarSupport = 0;         // not supported yet
     }
@@ -817,6 +856,75 @@
         }
     }
 
+    if (!mlProbeReqMle.has_value())
+    {
+        return mle; // not a multi-link probe request
+    }
+
+    auto reqVar = mlProbeReqMle->GetVariant();
+    NS_ASSERT_MSG(reqVar == MultiLinkElement::PROBE_REQUEST_VARIANT,
+                  "Invalid MLE variant " << reqVar);
+
+    // IEEE 802.11be D6.0 35.3.4.2 Use of multi-link probe request and response
+    // If either the Address 1 field or the Address 3 field of the multi-link probe request is set
+    // to the MAC address of the responding AP that operates on the same link where the multi-link
+    // probe request is sent, then the AP MLD ID subfield shall be present in the Probe Request
+    // Multi-Link element of the multi-link probe request value and targeted AP MLD is identified by
+    // AP MLD ID subfield, which is set to the same AP MLD ID as the one used by the AP that is
+    // addressed by the multi-link probe request to identify the AP MLD
+    //  in the Beacon and Probe Response frames that it transmits.
+    auto apMldId = mlProbeReqMle->GetApMldId();
+    NS_ASSERT_MSG(apMldId.has_value(), "AP MLD ID subfield missing");
+
+    // IEEE 802.11be D6.0 9.4.2.169.2 Neighbor AP Information field
+    // If the reported AP is affiliated with the same MLD as the reporting AP sending the frame
+    // carrying this element, the AP MLD ID subfield is set to 0. AP MLD ID value advertised in
+    // Beacons and Probe Responses is 0. Multi-BSSID feature not supported.
+    NS_ASSERT_MSG(*apMldId == 0, "AP MLD ID expected value is 0. value = " << +apMldId.value());
+
+    // Using set to handle case of multiple Per-STA Profiles including same link ID
+    std::set<uint8_t> respLinkIds{}; // Set of Link IDs to include in Probe Response
+    if (const auto nProfiles = mlProbeReqMle->GetNPerStaProfileSubelements(); nProfiles == 0)
+    {
+        // IEEE 802.11be D6.0 35.3.4.2 Use of multi-link probe request and response
+        // If the Probe Request Multi-link element in the multi-link probe request does not include
+        // any per-STA profile, then all APs affiliated with the same AP MLD as the AP identified in
+        // the Address 1 or Address 3 field or AP MLD ID shall be requested APs.
+        for (std::size_t i = 0; i < GetNLinks(); ++i)
+        {
+            if (i != linkId)
+            {
+                respLinkIds.insert(i);
+            }
+        }
+    }
+
+    for (std::size_t i = 0; i < mlProbeReqMle->GetNPerStaProfileSubelements(); ++i)
+    {
+        // IEEE 802.11be D6.0 35.3.4.2 Use of multi-link probe request and response
+        // If the Probe Request Multi-Link element in the multi-link probe request includes one or
+        // more per-STA profiles, then only APs affiliated with the same AP MLD whose link ID is
+        // equal to the value in the Link ID Field in a per-STA profile in the Probe Request
+        // Multi-link element shall be requested APs.
+        const auto& perStaProfile = mlProbeReqMle->GetPerStaProfile(i);
+        auto currLinkId = perStaProfile.GetLinkId();
+        if ((currLinkId < GetNLinks()) && (currLinkId != linkId))
+        {
+            respLinkIds.insert(currLinkId); // Only consider valid link IDs
+        }
+    }
+
+    auto setPerStaProfile = [&](uint8_t id) -> void {
+        mle.AddPerStaProfileSubelement();
+        auto& perStaProfile = mle.GetPerStaProfile(mle.GetNPerStaProfileSubelements() - 1);
+        perStaProfile.SetLinkId(id);
+        // Current support limited to Complete Profile request per link ID
+        // TODO: Add support for Partial Per-STA Profile request
+        perStaProfile.SetProbeResponse(GetProbeRespProfile(id));
+        perStaProfile.SetCompleteProfile();
+    };
+
+    std::for_each(respLinkIds.begin(), respLinkIds.end(), setPerStaProfile);
     return mle;
 }
 
@@ -829,10 +937,10 @@
     auto phy = GetWifiPhy(linkId);
     auto remoteStationManager = GetWifiRemoteStationManager(linkId);
 
-    operation.SetPrimaryChannel(phy->GetPrimaryChannelNumber(20));
+    operation.SetPrimaryChannel(phy->GetPrimaryChannelNumber(MHz_u{20}));
     operation.SetRifsMode(false);
     operation.SetNonGfHtStasPresent(true);
-    if (phy->GetChannelWidth() > 20)
+    if (phy->GetChannelWidth() > MHz_u{20})
     {
         operation.SetSecondaryChannelOffset(1);
         operation.SetStaChannelWidth(1);
@@ -850,10 +958,10 @@
     {
         uint8_t nss = (mcs.GetMcsValue() / 8) + 1;
         NS_ASSERT(nss > 0 && nss < 5);
-        uint64_t dataRate = mcs.GetDataRate(
-            phy->GetChannelWidth(),
-            NanoSeconds(GetHtConfiguration()->GetShortGuardIntervalSupported() ? 400 : 800),
-            nss);
+        uint64_t dataRate =
+            mcs.GetDataRate(phy->GetChannelWidth(),
+                            NanoSeconds(GetHtConfiguration()->m_sgiSupported ? 400 : 800),
+                            nss);
         if (dataRate > maxSupportedRate)
         {
             maxSupportedRate = dataRate;
@@ -933,7 +1041,7 @@
     const auto bssBandwidth = phy->GetChannelWidth();
     // Set to 0 for 20 MHz or 40 MHz BSS bandwidth.
     // Set to 1 for 80 MHz, 160 MHz or 80+80 MHz BSS bandwidth.
-    operation.SetChannelWidth((bssBandwidth > 40) ? 1 : 0);
+    operation.SetChannelWidth((bssBandwidth > MHz_u{40}) ? 1 : 0);
     // For 20, 40, or 80 MHz BSS bandwidth, indicates the channel center frequency
     // index for the 20, 40, or 80 MHz channel on which the VHT BSS operates.
     // For 160 MHz BSS bandwidth and the Channel Width subfield equal to 1,
@@ -941,8 +1049,9 @@
     // segment that contains the primary channel.
     // For 80+80 MHz BSS bandwidth and the Channel Width subfield equal to 1 or 3,
     // indicates the channel center frequency index for the primary 80 MHz channel of the VHT BSS.
-    operation.SetChannelCenterFrequencySegment0(
-        (bssBandwidth == 160) ? phy->GetPrimaryChannelNumber(80) : phy->GetChannelNumber());
+    operation.SetChannelCenterFrequencySegment0((bssBandwidth == MHz_u{160})
+                                                    ? phy->GetPrimaryChannelNumber(MHz_u{80})
+                                                    : phy->GetChannelNumber());
     // For a 20, 40, or 80 MHz BSS bandwidth, this subfield is set to 0.
     // For a 160 MHz BSS bandwidth and the Channel Width subfield equal to 1,
     // indicates the channel center frequency index of the 160 MHz channel on
@@ -952,9 +1061,10 @@
     const auto& operatingChannel = phy->GetOperatingChannel();
     const auto is80Plus80 =
         operatingChannel.GetWidthType() == WifiChannelWidthType::CW_80_PLUS_80MHZ;
-    operation.SetChannelCenterFrequencySegment1(
-        (bssBandwidth == 160) ? is80Plus80 ? operatingChannel.GetNumber(1) : phy->GetChannelNumber()
-                              : 0);
+    operation.SetChannelCenterFrequencySegment1((bssBandwidth == MHz_u{160})
+                                                    ? is80Plus80 ? operatingChannel.GetNumber(1)
+                                                                 : phy->GetChannelNumber()
+                                                    : 0);
     uint8_t maxSpatialStream = phy->GetMaxSupportedRxSpatialStreams();
     for (const auto& sta : GetLink(linkId).staList)
     {
@@ -1001,19 +1111,20 @@
             nss,
             11); // TBD: hardcode to 11 for now since we assume all MCS values are supported
     }
-    operation.m_bssColorInfo.m_bssColor = GetHeConfiguration()->GetBssColor();
+    operation.m_bssColorInfo.m_bssColor = GetHeConfiguration()->m_bssColor;
 
     if (auto phy = GetWifiPhy(linkId); phy && phy->GetPhyBand() == WIFI_PHY_BAND_6GHZ)
     {
         HeOperation::OpInfo6GHz op6Ghz;
         const auto bw = phy->GetChannelWidth();
         const auto ch = phy->GetOperatingChannel();
-        op6Ghz.m_chWid = (bw == 20) ? 0 : (bw == 40) ? 1 : (bw == 80) ? 2 : 3;
-        op6Ghz.m_primCh = ch.GetPrimaryChannelNumber(20, WIFI_STANDARD_80211ax);
-        op6Ghz.m_chCntrFreqSeg0 =
-            (bw == 160) ? ch.GetPrimaryChannelNumber(80, WIFI_STANDARD_80211ax) : ch.GetNumber();
+        op6Ghz.m_chWid = (bw == MHz_u{20}) ? 0 : (bw == MHz_u{40}) ? 1 : (bw == MHz_u{80}) ? 2 : 3;
+        op6Ghz.m_primCh = ch.GetPrimaryChannelNumber(MHz_u{20}, WIFI_STANDARD_80211ax);
+        op6Ghz.m_chCntrFreqSeg0 = (bw == MHz_u{160})
+                                      ? ch.GetPrimaryChannelNumber(MHz_u{80}, WIFI_STANDARD_80211ax)
+                                      : ch.GetNumber();
         // TODO: for 80+80 MHz channels, set this field to the secondary 80 MHz segment number
-        op6Ghz.m_chCntrFreqSeg1 = (bw == 160) ? ch.GetNumber() : 0;
+        op6Ghz.m_chCntrFreqSeg1 = (bw == MHz_u{160}) ? ch.GetNumber() : 0;
 
         operation.m_6GHzOpInfo = op6Ghz;
     }
@@ -1046,17 +1157,44 @@
 }
 
 void
-ApWifiMac::SendProbeResp(Mac48Address to, uint8_t linkId)
+ApWifiMac::EnqueueProbeResp(const MgtProbeResponseHeader& probeResp,
+                            Mac48Address to,
+                            uint8_t linkId)
 {
     NS_LOG_FUNCTION(this << to << +linkId);
-    WifiMacHeader hdr;
-    hdr.SetType(WIFI_MAC_MGT_PROBE_RESPONSE);
+    WifiMacHeader hdr(WIFI_MAC_MGT_PROBE_RESPONSE);
     hdr.SetAddr1(to);
     hdr.SetAddr2(GetLink(linkId).feManager->GetAddress());
     hdr.SetAddr3(GetLink(linkId).feManager->GetAddress());
     hdr.SetDsNotFrom();
     hdr.SetDsNotTo();
     Ptr<Packet> packet = Create<Packet>();
+    packet->AddHeader(probeResp);
+
+    if (!GetQosSupported())
+    {
+        GetTxop()->Queue(Create<WifiMpdu>(packet, hdr));
+    }
+    // "A QoS STA that transmits a Management frame determines access category used
+    // for medium access in transmission of the Management frame as follows
+    // (If dot11QMFActivated is false or not present)
+    // — If the Management frame is individually addressed to a non-QoS STA, category
+    //   AC_BE should be selected.
+    // — If category AC_BE was not selected by the previous step, category AC_VO
+    //   shall be selected." (Sec. 10.2.3.2 of 802.11-2020)
+    else if (!GetWifiRemoteStationManager(linkId)->GetQosSupported(to))
+    {
+        GetBEQueue()->Queue(Create<WifiMpdu>(packet, hdr));
+    }
+    else
+    {
+        GetVOQueue()->Queue(Create<WifiMpdu>(packet, hdr));
+    }
+}
+
+MgtProbeResponseHeader
+ApWifiMac::GetProbeRespProfile(uint8_t linkId) const
+{
     MgtProbeResponseHeader probe;
     probe.Get<Ssid>() = GetSsid();
     auto supportedRates = GetSupportedRates(linkId);
@@ -1108,53 +1246,46 @@
     {
         probe.Get<EhtCapabilities>() = GetEhtCapabilities(linkId);
         probe.Get<EhtOperation>() = GetEhtOperation(linkId);
-
-        if (GetNLinks() > 1)
-        {
-            /*
-             * If an AP is affiliated with an AP MLD and does not correspond to a nontransmitted
-             * BSSID, then the Beacon and Probe Response frames transmitted by the AP shall
-             * include a TBTT Information field in a Reduced Neighbor Report element with the
-             * TBTT Information Length field set to 16 or higher, for each of the other APs
-             * (if any) affiliated with the same AP MLD. (Sec. 35.3.4.1 of 802.11be D2.1.1)
-             */
-            if (auto rnr = GetReducedNeighborReport(linkId); rnr.has_value())
-            {
-                probe.Get<ReducedNeighborReport>() = std::move(*rnr);
-            }
-            /*
-             * If an AP affiliated with an AP MLD is not in a multiple BSSID set [..], the AP
-             * shall include, in a Beacon frame or a Probe Response frame, which is not a
-             * Multi-Link probe response, only the Common Info field of the Basic Multi-Link
-             * element for the AP MLD unless conditions in 35.3.11 (Multi-link procedures for
-             * channel switching, extended channel switching, and channel quieting) are
-             * satisfied. (Sec. 35.3.4.4 of 802.11be D2.1.1)
-             */
-            probe.Get<MultiLinkElement>() =
-                GetMultiLinkElement(linkId, WIFI_MAC_MGT_PROBE_RESPONSE);
-        }
     }
-    packet->AddHeader(probe);
 
-    if (!GetQosSupported())
-    {
-        GetTxop()->Queue(Create<WifiMpdu>(packet, hdr));
-    }
-    // "A QoS STA that transmits a Management frame determines access category used
-    // for medium access in transmission of the Management frame as follows
-    // (If dot11QMFActivated is false or not present)
-    // — If the Management frame is individually addressed to a non-QoS STA, category
-    //   AC_BE should be selected.
-    // — If category AC_BE was not selected by the previous step, category AC_VO
-    //   shall be selected." (Sec. 10.2.3.2 of 802.11-2020)
-    else if (!GetWifiRemoteStationManager(linkId)->GetQosSupported(to))
-    {
-        GetBEQueue()->Queue(Create<WifiMpdu>(packet, hdr));
-    }
-    else
-    {
-        GetVOQueue()->Queue(Create<WifiMpdu>(packet, hdr));
+    return probe;
+}
+
+MgtProbeResponseHeader
+ApWifiMac::GetProbeResp(uint8_t linkId, const std::optional<MultiLinkElement>& reqMle)
+{
+    NS_LOG_FUNCTION(this << linkId << reqMle.has_value());
+    NS_ASSERT_MSG(linkId < GetNLinks(), "Invalid link ID = " << +linkId);
+
+    auto probeResp = GetProbeRespProfile(linkId);
+
+    if (GetNLinks() > 1)
+    {
+        /*
+         * If an AP is affiliated with an AP MLD and does not correspond to a nontransmitted
+         * BSSID, then the Beacon and Probe Response frames transmitted by the AP shall
+         * include a TBTT Information field in a Reduced Neighbor Report element with the
+         * TBTT Information Length field set to 16 or higher, for each of the other APs
+         * (if any) affiliated with the same AP MLD. (Sec. 35.3.4.1 of 802.11be D2.1.1)
+         */
+        if (auto rnr = GetReducedNeighborReport(linkId); rnr.has_value())
+        {
+            probeResp.Get<ReducedNeighborReport>() = std::move(*rnr);
+        }
+        /*
+         * If an AP affiliated with an AP MLD is not in a multiple BSSID set [..], the AP
+         * shall include, in a Beacon frame or a Probe Response frame, which is not a
+         * Multi-Link probe response, only the Common Info field of the Basic Multi-Link
+         * element for the AP MLD unless conditions in 35.3.11 (Multi-link procedures for
+         * channel switching, extended channel switching, and channel quieting) are
+         * satisfied. (Sec. 35.3.4.4 of 802.11be D2.1.1)
+         */
+        probeResp.Get<MultiLinkElement>() = GetMultiLinkElement(linkId,
+                                                                WIFI_MAC_MGT_PROBE_RESPONSE,
+                                                                Mac48Address::GetBroadcast(),
+                                                                reqMle);
     }
+    return probeResp;
 }
 
 MgtAssocResponseHeader
@@ -1298,7 +1429,6 @@
         if (const auto [it, inserted] = link.staList.emplace(aid, staAddr); inserted)
         {
             // the STA on this link had no AID assigned
-            m_assocLogger(aid, staAddr);
             link.stationManager->SetAssociationId(staAddr, aid);
 
             if (link.stationManager->GetDsssSupported(staAddr) &&
@@ -1571,8 +1701,9 @@
         if (m_sendUnsolProbeResp)
         {
             Simulator::Schedule(fdBeaconInterval * count,
-                                &ApWifiMac::SendProbeResp,
+                                &ApWifiMac::EnqueueProbeResp,
                                 this,
+                                GetProbeResp(linkId, std::nullopt),
                                 Mac48Address::GetBroadcast(),
                                 linkId);
         }
@@ -1592,6 +1723,10 @@
 
     if (hdr.IsAssocResp() || hdr.IsReassocResp())
     {
+        MgtAssocResponseHeader assocResp;
+        mpdu->GetPacket()->PeekHeader(assocResp);
+        auto aid = assocResp.GetAssociationId();
+
         auto linkId = GetLinkIdByAddress(hdr.GetAddr2());
         NS_ABORT_MSG_IF(!linkId.has_value(), "No link ID matching the TA");
 
@@ -1599,6 +1734,7 @@
         {
             NS_LOG_DEBUG("AP=" << hdr.GetAddr2() << " associated with STA=" << hdr.GetAddr1());
             GetWifiRemoteStationManager(*linkId)->RecordGotAssocTxOk(hdr.GetAddr1());
+            m_assocLogger(aid, hdr.GetAddr1());
         }
 
         if (auto staMldAddress =
@@ -1626,6 +1762,7 @@
                     NS_LOG_DEBUG("AP=" << GetFrameExchangeManager(i)->GetAddress()
                                        << " associated with STA=" << *staAddress);
                     stationManager->RecordGotAssocTxOk(*staAddress);
+                    m_assocLogger(aid, *staAddress);
                     StaSwitchingToPsMode(*staAddress, i);
                 }
             }
@@ -1633,6 +1770,16 @@
             // Apply the negotiated TID-to-Link Mapping (if any) for DL direction
             ApplyTidLinkMapping(*staMldAddress, WifiDirection::DOWNLINK);
         }
+
+        if (auto extendedCapabilities =
+                GetWifiRemoteStationManager(*linkId)->GetStationExtendedCapabilities(
+                    hdr.GetAddr1());
+            m_gcrManager)
+        {
+            const auto isGcrCapable =
+                extendedCapabilities && extendedCapabilities->m_robustAvStreaming;
+            m_gcrManager->NotifyStaAssociated(hdr.GetAddr1(), isGcrCapable);
+        }
     }
     else if (hdr.IsAction())
     {
@@ -1691,6 +1838,17 @@
                 }
             }
         }
+
+        // free the assigned AID
+        MgtAssocResponseHeader assocResp;
+        mpdu->GetPacket()->PeekHeader(assocResp);
+        auto aid = assocResp.GetAssociationId();
+        m_aidToMldOrLinkAddress.erase(aid);
+        for (const auto& [id, lnk] : GetLinks())
+        {
+            auto& link = GetLink(id);
+            link.staList.erase(aid);
+        }
     }
 }
 
@@ -1889,7 +2047,12 @@
             if (ssid == GetSsid() || ssid->IsBroadcast())
             {
                 NS_LOG_DEBUG("Probe request received from " << from << ": send probe response");
-                SendProbeResp(from, linkId);
+                const auto isReqBcast = hdr->GetAddr1().IsGroup() && hdr->GetAddr3().IsBroadcast();
+                // not an ML Probe Request if ADDR1 and ADDR3 are broadcast
+                const auto probeResp = GetProbeResp(
+                    linkId,
+                    isReqBcast ? std::nullopt : probeRequestHeader.Get<MultiLinkElement>());
+                EnqueueProbeResp(probeResp, from, linkId);
             }
             return;
         }
@@ -1946,6 +2109,10 @@
                         UpdateShortSlotTimeEnabled(linkId);
                         UpdateShortPreambleEnabled(linkId);
                         StaSwitchingToActiveModeOrDeassociated(from, linkId);
+                        if (m_gcrManager)
+                        {
+                            m_gcrManager->NotifyStaDeassociated(from);
+                        }
                         break;
                     }
                 }
@@ -2106,10 +2273,8 @@
                     return failure("Incorrect directions in TID-to-Link Mapping IEs");
                 }
 
-                EnumValue<WifiTidToLinkMappingNegSupport> negSupport;
-                ehtConfig->GetAttributeFailSafe("TidToLinkMappingNegSupport", negSupport);
-
-                if (negSupport.Get() == WifiTidToLinkMappingNegSupport::NOT_SUPPORTED)
+                if (ehtConfig->m_tidLinkMappingSupport ==
+                    WifiTidToLinkMappingNegSupport::NOT_SUPPORTED)
                 {
                     return failure("TID-to-Link Mapping negotiation not supported");
                 }
@@ -2147,7 +2312,8 @@
                     break;
                 }
 
-                if (negSupport.Get() == WifiTidToLinkMappingNegSupport::SAME_LINK_SET &&
+                if (ehtConfig->m_tidLinkMappingSupport ==
+                        WifiTidToLinkMappingNegSupport::SAME_LINK_SET &&
                     !TidToLinkMappingValidForNegType1(dlMapping, ulMapping))
                 {
                     return failure("Mapping TIDs to distinct link sets is incompatible with "
@@ -2186,12 +2352,15 @@
         if (GetHtSupported(linkId))
         {
             const auto& htCapabilities = frame.template Get<HtCapabilities>();
-            if (htCapabilities.has_value() && htCapabilities->IsSupportedMcs(0))
+            if (htCapabilities.has_value())
             {
                 remoteStationManager->AddStationHtCapabilities(from, *htCapabilities);
             }
-            // const ExtendedCapabilities& extendedCapabilities = frame.GetExtendedCapabilities();
-            // TODO: to be completed
+            const auto& extendedCapabilities = frame.template Get<ExtendedCapabilities>();
+            if (extendedCapabilities.has_value())
+            {
+                remoteStationManager->AddStationExtendedCapabilities(from, *extendedCapabilities);
+            }
         }
         if (GetVhtSupported(linkId))
         {
@@ -2307,10 +2476,7 @@
 
     auto ehtConfiguration = GetEhtConfiguration();
 
-    if (BooleanValue emlsrActivated;
-        !ehtConfiguration ||
-        !ehtConfiguration->GetAttributeFailSafe("EmlsrActivated", emlsrActivated) ||
-        !emlsrActivated.Get())
+    if (!ehtConfiguration || !ehtConfiguration->m_emlsrActivated)
     {
         NS_LOG_DEBUG(
             "Received an EML Operating Mode Notification frame but EMLSR is not activated");
@@ -2348,11 +2514,9 @@
             auto ackDuration =
                 WifiPhy::CalculateTxDuration(psduMap, txVector, GetLink(linkId).phy->GetPhyBand());
 
-            TimeValue transitionTimeout;
-            ehtConfiguration->GetAttribute("TransitionTimeout", transitionTimeout);
-
-            m_transitionTimeoutEvents[sender] =
-                Simulator::Schedule(ackDuration + transitionTimeout.Get(), [=, this]() {
+            m_transitionTimeoutEvents[sender] = Simulator::Schedule(
+                ackDuration + ehtConfiguration->m_transitionTimeout,
+                [=, this]() {
                     for (uint8_t id = 0; id < GetNLinks(); id++)
                     {
                         auto linkAddress =
@@ -2484,6 +2648,11 @@
         UpdateShortPreambleEnabled(linkId);
     }
 
+    if (m_gcrManager)
+    {
+        m_gcrManager->Initialize();
+    }
+
     NS_ABORT_IF(!TraceConnectWithoutContext("AckedMpdu", MakeCallback(&ApWifiMac::TxOk, this)));
     NS_ABORT_IF(
         !TraceConnectWithoutContext("DroppedMpdu", MakeCallback(&ApWifiMac::TxFailed, this)));
@@ -2577,4 +2746,15 @@
     return 255;
 }
 
+bool
+ApWifiMac::IsGcrBaAgreementEstablishedWithAllMembers(const Mac48Address& groupAddress,
+                                                     uint8_t tid) const
+{
+    NS_ASSERT(m_gcrManager);
+    return GetQosTxop(tid)->GetBaManager()->IsGcrAgreementEstablished(
+        groupAddress,
+        tid,
+        m_gcrManager->GetMemberStasForGroupAddress(groupAddress));
+}
+
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/ap-wifi-mac.h ns-3.44/src/wifi/model/ap-wifi-mac.h
--- ns-3.43/src/wifi/model/ap-wifi-mac.h	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/ap-wifi-mac.h	2025-03-09 16:55:49.783372600 -0700
@@ -31,26 +31,23 @@
 class EdcaParameterSet;
 class MuEdcaParameterSet;
 class ReducedNeighborReport;
-class MultiLinkElement;
 class HtOperation;
 class VhtOperation;
 class HeOperation;
 class EhtOperation;
 class CfParameterSet;
 class UniformRandomVariable;
-class MgtAssocRequestHeader;
-class MgtReassocRequestHeader;
-class MgtAssocResponseHeader;
 class MgtEmlOmn;
 class ApEmlsrManager;
+class GcrManager;
 
 /// variant holding a  reference to a (Re)Association Request
 using AssocReqRefVariant = std::variant<std::reference_wrapper<MgtAssocRequestHeader>,
                                         std::reference_wrapper<MgtReassocRequestHeader>>;
 
 /**
- * \brief Wi-Fi AP state machine
- * \ingroup wifi
+ * @brief Wi-Fi AP state machine
+ * @ingroup wifi
  *
  * Handle association, dis-association and authentication,
  * of STAs within an infrastructure BSS.  By default, beacons are
@@ -63,8 +60,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -80,21 +77,33 @@
     /**
      * Set the AP EMLSR Manager.
      *
-     * \param apEmlsrManager the AP EMLSR Manager
+     * @param apEmlsrManager the AP EMLSR Manager
      */
     void SetApEmlsrManager(Ptr<ApEmlsrManager> apEmlsrManager);
 
     /**
-     * \return the AP EMLSR Manager
+     * @return the AP EMLSR Manager
      */
     Ptr<ApEmlsrManager> GetApEmlsrManager() const;
 
     /**
-     * \param interval the interval between two beacon transmissions.
+     * Set the GCR Manager.
+     *
+     * @param gcrManager the GCR Manager
+     */
+    void SetGcrManager(Ptr<GcrManager> gcrManager);
+
+    /**
+     * @return the GCR Manager
+     */
+    Ptr<GcrManager> GetGcrManager() const;
+
+    /**
+     * @param interval the interval between two beacon transmissions.
      */
     void SetBeaconInterval(Time interval);
     /**
-     * \return the interval between two beacon transmissions.
+     * @return the interval between two beacon transmissions.
      */
     Time GetBeaconInterval() const;
 
@@ -103,14 +112,14 @@
      * Each station is specified by an (association ID, MAC address) pair. Make sure
      * not to use the returned reference after that this object has been deallocated.
      *
-     * \param linkId the ID of the given link
-     * \return a const reference to the map of associated stations
+     * @param linkId the ID of the given link
+     * @return a const reference to the map of associated stations
      */
     const std::map<uint16_t, Mac48Address>& GetStaList(uint8_t linkId) const;
     /**
-     * \param addr the address of the associated station
-     * \param linkId the ID of the link on which the station is associated
-     * \return the Association ID allocated by the AP to the station, SU_STA_ID if unallocated
+     * @param addr the address of the associated station
+     * @param linkId the ID of the link on which the station is associated
+     * @return the Association ID allocated by the AP to the station, SU_STA_ID if unallocated
      */
     uint16_t GetAssociationId(Mac48Address addr, uint8_t linkId) const;
 
@@ -119,14 +128,14 @@
      * address. The address can be either a link address or an MLD address. In the former case,
      * the returned ID is the ID of the link connecting the AP to the STA with the given address.
      *
-     * \param address the given MAC address
-     * \return the ID of a link (if any) that has been setup with the given station
+     * @param address the given MAC address
+     * @return the ID of a link (if any) that has been setup with the given station
      */
     std::optional<uint8_t> IsAssociated(const Mac48Address& address) const;
 
     /**
-     * \param aid the given AID
-     * \return the MLD address (in case of MLD) or link address (in case of single link device)
+     * @param aid the given AID
+     * @return the MLD address (in case of MLD) or link address (in case of single link device)
      *         of the STA having the given AID, if any
      */
     std::optional<Mac48Address> GetMldOrLinkAddressByAid(uint16_t aid) const;
@@ -143,9 +152,9 @@
      * A queue size value of 255 is used to indicate an unspecified or unknown size.
      * See Section 9.2.4.5.6 of 802.11-2016
      *
-     * \param tid the given TID
-     * \param address the given MAC address
-     * \return the value of the Queue Size subfield
+     * @param tid the given TID
+     * @param address the given MAC address
+     * @return the value of the Queue Size subfield
      */
     uint8_t GetBufferStatus(uint8_t tid, Mac48Address address) const;
     /**
@@ -153,9 +162,9 @@
      * frame received from the station with the given MAC address and belonging to
      * the given TID.
      *
-     * \param tid the given TID
-     * \param address the given MAC address
-     * \param size the value of the Queue Size subfield
+     * @param tid the given TID
+     * @param address the given MAC address
+     * @param size the value of the Queue Size subfield
      */
     void SetBufferStatus(uint8_t tid, Mac48Address address, uint8_t size);
     /**
@@ -163,11 +172,31 @@
      * QoS Data or QoS Null frames received from the station with the given MAC address
      * and belonging to any TID.
      *
-     * \param address the given MAC address
-     * \return the maximum among the values of the Queue Size subfields
+     * @param address the given MAC address
+     * @return the maximum among the values of the Queue Size subfields
      */
     uint8_t GetMaxBufferStatus(Mac48Address address) const;
 
+    /**
+     * Return whether GCR is used to transmit a packet.
+     *
+     * @param hdr the header of the packet to transmit
+     * @return true if a GCR manager is set and the packet is a groupcast QoS data, false otherwise
+     */
+    bool UseGcr(const WifiMacHeader& hdr) const;
+
+    /**
+     * Check if a GCR Block Ack agreement has been successfully established with all members of
+     * its group.
+     *
+     * @param groupAddress the GCR group address.
+     * @param tid the traffic ID.
+     * @return true if a GCR Block Ack agreement has been successfully established with all members
+     * of its group, false otherwise.
+     */
+    bool IsGcrBaAgreementEstablishedWithAllMembers(const Mac48Address& groupAddress,
+                                                   uint8_t tid) const;
+
     /// ACI-indexed map of access parameters of type unsigned integer (CWmin, CWmax and AIFSN)
     using UintAccessParamsMap = std::map<AcIndex, std::vector<uint64_t>>;
 
@@ -193,18 +222,18 @@
      * be used to deserialize an ACI-indexed map of access parameters of type unsigned integer
      * (CWmin, CWmax and AIFSN) from a string:
      *
-     * \code
+     * @code
      *   ApWifiMac::UintAccessParamsMapValue value;
      *   value.DeserializeFromString("BE 31,31; VO 15,15",
      *                               ApWifiMac::GetUintAccessParamsChecker<uint32_t>());
      *   auto map = value.Get();
-     * \endcode
+     * @endcode
      *
      * The type of \p map is ApWifiMac::UintAccessParamsMapValue::result_type, which is
      * std::list<std::pair<AcIndex, std::vector<uint64_t>>>.
      *
-     * \tparam T \explicit the type of the unsigned integer access parameter
-     * \return a checker for the CwMinsForSta, CwMaxsForSta and AifsnsForSta attributes
+     * @tparam T \explicit the type of the unsigned integer access parameter
+     * @return a checker for the CwMinsForSta, CwMaxsForSta and AifsnsForSta attributes
      */
     template <class T>
     static Ptr<const AttributeChecker> GetUintAccessParamsChecker();
@@ -213,17 +242,17 @@
      * Get a checker for the TxopLimitsForSta attribute, which can be used to deserialize an
      * ACI-indexed map of access parameters of type Time (TxopLimit) from a string:
      *
-     * \code
+     * @code
      *   ApWifiMac::TimeAccessParamsMapValue value;
      *   value.DeserializeFromString("BE 3200us; VO 3232us",
      *                               ApWifiMac::GetTimeAccessParamsChecker());
      *   auto map = value.Get();
-     * \endcode
+     * @endcode
      *
      * The type of \p map is ApWifiMac::TimeAccessParamsMapValue::result_type, which is
      * std::list<std::pair<AcIndex, std::vector<Time>>>.
      *
-     * \return a checker for the TxopLimitsForSta attribute
+     * @return a checker for the TxopLimitsForSta attribute
      */
     static Ptr<const AttributeChecker> GetTimeAccessParamsChecker();
 
@@ -252,8 +281,8 @@
     /**
      * Get a reference to the link associated with the given ID.
      *
-     * \param linkId the given link ID
-     * \return a reference to the link associated with the given ID
+     * @param linkId the given link ID
+     * @return a reference to the link associated with the given ID
      */
     ApLinkEntity& GetLink(uint8_t linkId) const;
 
@@ -274,10 +303,10 @@
      * supported modes in its associated WifiRemoteStation and return true.
      * Otherwise, return false.
      *
-     * \param assoc the frame body of the received (Re)Association Request
-     * \param from the Transmitter Address field of the frame
-     * \param linkId the ID of the link on which the frame was received
-     * \return true if the (Re)Association request can be accepted, false otherwise
+     * @param assoc the frame body of the received (Re)Association Request
+     * @param from the Transmitter Address field of the frame
+     * @param linkId the ID of the link on which the frame was received
+     * @return true if the (Re)Association request can be accepted, false otherwise
      */
     bool ReceiveAssocRequest(const AssocReqRefVariant& assoc,
                              const Mac48Address& from,
@@ -290,9 +319,9 @@
      * a valid link other than the one the frame was received on and the supported
      * rates are compatible with our basic rate set).
      *
-     * \param assoc the frame body of the received (Re)Association Request
-     * \param from the Transmitter Address field of the frame
-     * \param linkId the ID of the link on which the frame was received
+     * @param assoc the frame body of the received (Re)Association Request
+     * @param from the Transmitter Address field of the frame
+     * @param linkId the ID of the link on which the frame was received
      */
     void ParseReportedStaInfo(const AssocReqRefVariant& assoc, Mac48Address from, uint8_t linkId);
 
@@ -300,9 +329,9 @@
      * Take necessary actions upon receiving the given EML Operating Mode Notification frame
      * from the given station on the given link.
      *
-     * \param frame the received EML Operating Mode Notification frame
-     * \param sender the MAC address of the sender of the frame
-     * \param linkId the ID of the link over which the frame was received
+     * @param frame the received EML Operating Mode Notification frame
+     * @param sender the MAC address of the sender of the frame
+     * @param linkId the ID of the link over which the frame was received
      */
     void ReceiveEmlOmn(MgtEmlOmn& frame, const Mac48Address& sender, uint8_t linkId);
 
@@ -312,7 +341,7 @@
      * was an association response to the receiver, we record that
      * the receiver is now associated with us.
      *
-     * \param mpdu the MPDU that we successfully sent
+     * @param mpdu the MPDU that we successfully sent
      */
     void TxOk(Ptr<const WifiMpdu> mpdu);
     /**
@@ -321,8 +350,8 @@
      * was an association response to the receiver, we record that
      * the receiver is not associated with us yet.
      *
-     * \param timeoutReason the reason why the TX timer was started (\see WifiTxTimer::Reason)
-     * \param mpdu the MPDU that we failed to sent
+     * @param timeoutReason the reason why the TX timer was started (\see WifiTxTimer::Reason)
+     * @param mpdu the MPDU that we failed to sent
      */
     void TxFailed(WifiMacDropReason timeoutReason, Ptr<const WifiMpdu> mpdu);
 
@@ -332,24 +361,45 @@
      * here because, as an AP, we also need to think about redistributing
      * to other associated STAs.
      *
-     * \param mpdu the MPDU containing the A-MSDU.
+     * @param mpdu the MPDU containing the A-MSDU.
      */
     void DeaggregateAmsduAndForward(Ptr<const WifiMpdu> mpdu) override;
+
     /**
-     * Send a Probe Response in response to a Probe Request received from the STA with the
-     * given address on the given link.
+     * Get Probe Response Per-STA Profile for the given link.
      *
-     * \param to the address of the STA we are sending a probe response to
-     * \param linkId the ID of the given link
+     * @param linkId the ID of the given link
+     * @return the Probe Response header
      */
-    void SendProbeResp(Mac48Address to, uint8_t linkId);
+    MgtProbeResponseHeader GetProbeRespProfile(uint8_t linkId) const;
+
+    /**
+     * Get Probe Response based on the given Probe Request Multi-link Element (if any)
+     *
+     * @param linkId the ID of link the Probe Response is to be sent
+     * @param reqMle Probe Request Multi-link Element
+     * @return Probe Response header
+     */
+    MgtProbeResponseHeader GetProbeResp(uint8_t linkId,
+                                        const std::optional<MultiLinkElement>& reqMle);
+
+    /**
+     * Send a packet prepared using the given Probe Response to the given receiver on the given
+     * link.
+     *
+     * @param probeResp the Probe Response header
+     * @param to the address of the STA we are sending a probe response to
+     * @param linkId the ID of the given link
+     */
+    void EnqueueProbeResp(const MgtProbeResponseHeader& probeResp, Mac48Address to, uint8_t linkId);
+
     /**
      * Get the Association Response frame to send on a given link. The returned frame
      * never includes a Multi-Link Element.
      *
-     * \param to the address of the STA we are sending an association response to
-     * \param linkId the ID of the given link
-     * \return the Association Response frame
+     * @param to the address of the STA we are sending an association response to
+     * @param linkId the ID of the given link
+     * @return the Association Response frame
      */
     MgtAssocResponseHeader GetAssocResp(Mac48Address to, uint8_t linkId);
     /// Map of (link ID, remote STA address) of the links to setup
@@ -362,8 +412,8 @@
      * non-AP MLD we are associating with. If no STA has an assigned AID value,
      * a new AID value is selected.
      *
-     * \param assoc the given Association Response frame
-     * \param linkIdStaAddrMap a map of (link ID, remote STA address) of the links to setup
+     * @param assoc the given Association Response frame
+     * @param linkIdStaAddrMap a map of (link ID, remote STA address) of the links to setup
      */
     void SetAid(MgtAssocResponseHeader& assoc, const LinkIdStaAddrMap& linkIdStaAddrMap);
     /**
@@ -371,10 +421,10 @@
      * is taken from the given Association Response that is sent over the given link
      * to the given station.
      *
-     * \param assoc the given Association Response frame
-     * \param to the Receiver Address (RA) of the Association Response frame
-     * \param linkId the ID of the link on which the Association Response frame is sent
-     * \return a map of (link ID, remote STA address) of the links to setup
+     * @param assoc the given Association Response frame
+     * @param to the Receiver Address (RA) of the Association Response frame
+     * @param linkId the ID of the link on which the Association Response frame is sent
+     * @return a map of (link ID, remote STA address) of the links to setup
      */
     LinkIdStaAddrMap GetLinkIdStaAddrMap(MgtAssocResponseHeader& assoc,
                                          const Mac48Address& to,
@@ -382,24 +432,24 @@
     /**
      * Forward an association or a reassociation response packet to the DCF/EDCA.
      *
-     * \param to the address of the STA we are sending an association response to
-     * \param isReassoc indicates whether it is a reassociation response
-     * \param linkId the ID of the link on which the association response must be sent
+     * @param to the address of the STA we are sending an association response to
+     * @param isReassoc indicates whether it is a reassociation response
+     * @param linkId the ID of the link on which the association response must be sent
      */
     void SendAssocResp(Mac48Address to, bool isReassoc, uint8_t linkId);
     /**
      * Forward a beacon packet to the beacon special DCF for transmission
      * on the given link.
      *
-     * \param linkId the ID of the given link
+     * @param linkId the ID of the given link
      */
     void SendOneBeacon(uint8_t linkId);
 
     /**
      * Get the FILS Discovery frame to send on the given link.
      *
-     * \param linkId the ID of the given link
-     * \return the FILS Discovery frame to send on the given link
+     * @param linkId the ID of the given link
+     * @return the FILS Discovery frame to send on the given link
      */
     Ptr<WifiMpdu> GetFilsDiscovery(uint8_t linkId) const;
 
@@ -407,7 +457,7 @@
      * Schedule the transmission of FILS Discovery frames or unsolicited Probe Response frames
      * on the given link
      *
-     * \param linkId the ID of the given link
+     * @param linkId the ID of the given link
      */
     void ScheduleFilsDiscOrUnsolProbeRespFrames(uint8_t linkId);
 
@@ -415,121 +465,128 @@
      * Process the Power Management bit in the Frame Control field of an MPDU
      * successfully received on the given link.
      *
-     * \param mpdu the successfully received MPDU
-     * \param linkId the ID of the given link
+     * @param mpdu the successfully received MPDU
+     * @param linkId the ID of the given link
      */
     void ProcessPowerManagementFlag(Ptr<const WifiMpdu> mpdu, uint8_t linkId);
     /**
      * Perform the necessary actions when a given station switches from active mode
      * to powersave mode.
      *
-     * \param staAddr the MAC address of the given station
-     * \param linkId the ID of the link on which the given station is operating
+     * @param staAddr the MAC address of the given station
+     * @param linkId the ID of the link on which the given station is operating
      */
     void StaSwitchingToPsMode(const Mac48Address& staAddr, uint8_t linkId);
     /**
      * Perform the necessary actions when a given station deassociates or switches
      * from powersave mode to active mode.
      *
-     * \param staAddr the MAC address of the given station
-     * \param linkId the ID of the link on which the given station is operating
+     * @param staAddr the MAC address of the given station
+     * @param linkId the ID of the link on which the given station is operating
      */
     void StaSwitchingToActiveModeOrDeassociated(const Mac48Address& staAddr, uint8_t linkId);
 
     /**
      * Return the Capability information of the current AP for the given link.
      *
-     * \param linkId the ID of the given link
-     * \return the Capability information that we support
+     * @param linkId the ID of the given link
+     * @return the Capability information that we support
      */
     CapabilityInformation GetCapabilities(uint8_t linkId) const;
     /**
      * Return the ERP information of the current AP for the given link.
      *
-     * \param linkId the ID of the given link
-     * \return the ERP information that we support for the given link
+     * @param linkId the ID of the given link
+     * @return the ERP information that we support for the given link
      */
     ErpInformation GetErpInformation(uint8_t linkId) const;
     /**
      * Return the EDCA Parameter Set of the current AP for the given link.
      *
-     * \param linkId the ID of the given link
-     * \return the EDCA Parameter Set that we support for the given link
+     * @param linkId the ID of the given link
+     * @return the EDCA Parameter Set that we support for the given link
      */
     EdcaParameterSet GetEdcaParameterSet(uint8_t linkId) const;
     /**
      * Return the MU EDCA Parameter Set of the current AP, if one needs to be advertised
      *
-     * \return the MU EDCA Parameter Set that needs to be advertised (if any)
+     * @return the MU EDCA Parameter Set that needs to be advertised (if any)
      */
     std::optional<MuEdcaParameterSet> GetMuEdcaParameterSet() const;
     /**
      * Return the Reduced Neighbor Report (RNR) element that the current AP sends
      * on the given link, if one needs to be advertised.
      *
-     * \param linkId the ID of the link to send the RNR element onto
-     * \return the Reduced Neighbor Report element
+     * @param linkId the ID of the link to send the RNR element onto
+     * @return the Reduced Neighbor Report element
      */
     std::optional<ReducedNeighborReport> GetReducedNeighborReport(uint8_t linkId) const;
+
     /**
      * Return the Multi-Link Element that the current AP includes in the management
      * frames of the given type it transmits on the given link.
      *
-     * \param linkId the ID of the link to send the Multi-Link Element onto
-     * \param frameType the type of the frame containing the Multi-Link Element
-     * \param to the Receiver Address of the frame containing the Multi-Link Element
-     * \return the Multi-Link Element
-     */
-    MultiLinkElement GetMultiLinkElement(uint8_t linkId,
-                                         WifiMacType frameType,
-                                         const Mac48Address& to = Mac48Address::GetBroadcast());
+     * @param linkId the ID of the link to send the Multi-Link Element onto
+     * @param frameType the type of the frame containing the Multi-Link Element
+     * @param to the Receiver Address of the frame containing the Multi-Link Element
+     * @param mlProbeReqMle the Multi-Link Element included in the multi-link probe request, in
+     *                      case the Multi-Link Element is requested for the response to such a
+     *                      frame
+     * @return the Multi-Link Element
+     */
+    MultiLinkElement GetMultiLinkElement(
+        uint8_t linkId,
+        WifiMacType frameType,
+        const Mac48Address& to = Mac48Address::GetBroadcast(),
+        const std::optional<MultiLinkElement>& mlProbeReqMle = std::nullopt);
+
     /**
      * Return the HT operation of the current AP for the given link.
      *
-     * \param linkId the ID of the given link
-     * \return the HT operation that we support
+     * @param linkId the ID of the given link
+     * @return the HT operation that we support
      */
     HtOperation GetHtOperation(uint8_t linkId) const;
     /**
      * Return the VHT operation of the current AP for the given link.
      *
-     * \param linkId the ID of the given link
-     * \return the VHT operation that we support
+     * @param linkId the ID of the given link
+     * @return the VHT operation that we support
      */
     VhtOperation GetVhtOperation(uint8_t linkId) const;
     /**
      * Return the HE operation of the current AP for the given link.
      *
-     * \param linkId the ID of the given link
-     * \return the HE operation that we support
+     * @param linkId the ID of the given link
+     * @return the HE operation that we support
      */
     HeOperation GetHeOperation(uint8_t linkId) const;
     /**
      * Return the EHT operation of the current AP for the given link.
      *
-     * \param linkId the ID of the given link
-     * \return the EHT operation that we support
+     * @param linkId the ID of the given link
+     * @return the EHT operation that we support
      */
     EhtOperation GetEhtOperation(uint8_t linkId) const;
     /**
      * Return an instance of SupportedRates that contains all rates that we support
      * for the given link (including HT rates).
      *
-     * \param linkId the ID of the given link
-     * \return all rates that we support
+     * @param linkId the ID of the given link
+     * @return all rates that we support
      */
     AllSupportedRates GetSupportedRates(uint8_t linkId) const;
     /**
      * Return the DSSS Parameter Set that we support on the given link
      *
-     * \param linkId the ID of the given link
-     * \return the DSSS Parameter Set that we support on the given link
+     * @param linkId the ID of the given link
+     * @return the DSSS Parameter Set that we support on the given link
      */
     DsssParameterSet GetDsssParameterSet(uint8_t linkId) const;
     /**
      * Enable or disable beacon generation of the AP.
      *
-     * \param enable enable or disable beacon generation
+     * @param enable enable or disable beacon generation
      */
     void SetBeaconGeneration(bool enable);
 
@@ -540,7 +597,7 @@
      * associated  to the AP, and that short slot time is supported by the AP and by all
      * other ERP stations that are associated to the AP. Otherwise, it is disabled.
      *
-     * \param linkId the ID of the given link
+     * @param linkId the ID of the given link
      */
     void UpdateShortSlotTimeEnabled(uint8_t linkId);
     /**
@@ -549,7 +606,7 @@
      * Typically, short preamble is enabled only when the AP and all associated
      * stations support short PHY preamble. Otherwise, it is disabled.
      *
-     * \param linkId the ID of the given link
+     * @param linkId the ID of the given link
      */
     void UpdateShortPreambleEnabled(uint8_t linkId);
 
@@ -557,8 +614,8 @@
      * Return whether protection for non-ERP stations is used in the BSS
      * corresponding to the given link.
      *
-     * \param linkId the ID of the given link
-     * \return true if protection for non-ERP stations is used in the BSS,
+     * @param linkId the ID of the given link
+     * @return true if protection for non-ERP stations is used in the BSS,
      *         false otherwise
      */
     bool GetUseNonErpProtection(uint8_t linkId) const;
@@ -567,7 +624,7 @@
     void DoInitialize() override;
 
     /**
-     * \return the next Association ID to be allocated by the AP
+     * @return the next Association ID to be allocated by the AP
      */
     uint16_t GetNextAssociationId() const;
 
@@ -583,6 +640,7 @@
     /// transition timeout events running for EMLSR clients
     std::map<Mac48Address, EventId> m_transitionTimeoutEvents;
     Ptr<ApEmlsrManager> m_apEmlsrManager; ///< AP EMLSR Manager
+    Ptr<GcrManager> m_gcrManager;         //!< GCR Manager
 
     UintAccessParamsMap m_cwMinsForSta;     //!< Per-AC CW min values to advertise to stations
     UintAccessParamsMap m_cwMaxsForSta;     //!< Per-AC CW max values to advertise to stations
@@ -608,8 +666,8 @@
     /**
      * TracedCallback signature for association/deassociation events.
      *
-     * \param aid the AID of the station
-     * \param address the MAC address of the station
+     * @param aid the AID of the station
+     * @param address the MAC address of the station
      */
     typedef void (*AssociationCallback)(uint16_t aid, Mac48Address address);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/block-ack-agreement.cc ns-3.44/src/wifi/model/block-ack-agreement.cc
--- ns-3.43/src/wifi/model/block-ack-agreement.cc	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/block-ack-agreement.cc	2025-03-09 16:55:49.783372600 -0700
@@ -21,10 +21,10 @@
 
 BlockAckAgreement::BlockAckAgreement(Mac48Address peer, uint8_t tid)
     : m_peer(peer),
-      m_amsduSupported(0),
+      m_amsduSupported(false),
       m_blockAckPolicy(1),
       m_tid(tid),
-      m_htSupported(0),
+      m_htSupported(false),
       m_inactivityEvent()
 {
     NS_LOG_FUNCTION(this << peer << +tid);
@@ -134,7 +134,7 @@
 bool
 BlockAckAgreement::IsAmsduSupported() const
 {
-    return m_amsduSupported == 1;
+    return m_amsduSupported;
 }
 
 uint16_t
@@ -153,7 +153,7 @@
 bool
 BlockAckAgreement::IsHtSupported() const
 {
-    return m_htSupported == 1;
+    return m_htSupported;
 }
 
 BlockAckType
@@ -169,7 +169,8 @@
     auto it = lengths.lower_bound(m_bufferSize);
     NS_ASSERT_MSG(it != lengths.cend(), "Buffer size too large: " << m_bufferSize);
     // Multi-TID Block Ack is not currently supported
-    return {BlockAckType::COMPRESSED, {static_cast<uint8_t>(*it / 8)}};
+    return {m_gcrGroupAddress ? BlockAckType::GCR : BlockAckType::COMPRESSED,
+            {static_cast<uint8_t>(*it / 8)}};
 }
 
 BlockAckReqType
@@ -190,4 +191,16 @@
     return (seqNumber - startingSeqNumber + SEQNO_SPACE_SIZE) % SEQNO_SPACE_SIZE;
 }
 
+void
+BlockAckAgreement::SetGcrGroupAddress(const Mac48Address& gcrGroupAddress)
+{
+    m_gcrGroupAddress = gcrGroupAddress;
+}
+
+const std::optional<Mac48Address>&
+BlockAckAgreement::GetGcrGroupAddress() const
+{
+    return m_gcrGroupAddress;
+}
+
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/block-ack-agreement.h ns-3.44/src/wifi/model/block-ack-agreement.h
--- ns-3.43/src/wifi/model/block-ack-agreement.h	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/block-ack-agreement.h	2025-03-09 16:55:49.783372600 -0700
@@ -14,11 +14,13 @@
 #include "ns3/event-id.h"
 #include "ns3/mac48-address.h"
 
+#include <optional>
+
 namespace ns3
 {
 /**
- * \brief Maintains information for a block ack agreement.
- * \ingroup wifi
+ * @brief Maintains information for a block ack agreement.
+ * @ingroup wifi
  */
 class BlockAckAgreement
 {
@@ -28,33 +30,33 @@
     /**
      * Constructor for BlockAckAgreement with given peer and TID.
      *
-     * \param peer the peer station
-     * \param tid the TID
+     * @param peer the peer station
+     * @param tid the TID
      */
     BlockAckAgreement(Mac48Address peer, uint8_t tid);
     virtual ~BlockAckAgreement();
     /**
      * Set buffer size.
      *
-     * \param bufferSize the buffer size (in number of MPDUs)
+     * @param bufferSize the buffer size (in number of MPDUs)
      */
     void SetBufferSize(uint16_t bufferSize);
     /**
      * Set timeout.
      *
-     * \param timeout the timeout value
+     * @param timeout the timeout value
      */
     void SetTimeout(uint16_t timeout);
     /**
      * Set starting sequence number.
      *
-     * \param seq the starting sequence number
+     * @param seq the starting sequence number
      */
     void SetStartingSequence(uint16_t seq);
     /**
      * Set starting sequence control.
      *
-     * \param seq the starting sequence control
+     * @param seq the starting sequence control
      */
     void SetStartingSequenceControl(uint16_t seq);
     /**
@@ -68,111 +70,124 @@
     /**
      * Enable or disable A-MSDU support.
      *
-     * \param supported enable or disable A-MSDU support
+     * @param supported enable or disable A-MSDU support
      */
     void SetAmsduSupport(bool supported);
     /**
      * Return the Traffic ID (TID).
      *
-     * \return TID
+     * @return TID
      */
     uint8_t GetTid() const;
     /**
      * Return the peer address.
      *
-     * \return the peer MAC address
+     * @return the peer MAC address
      */
     Mac48Address GetPeer() const;
     /**
      * Return the buffer size.
      *
-     * \return the buffer size (in number of MPDUs)
+     * @return the buffer size (in number of MPDUs)
      */
     uint16_t GetBufferSize() const;
     /**
      * Return the timeout.
      *
-     * \return the timeout
+     * @return the timeout
      */
     uint16_t GetTimeout() const;
     /**
      * Return the starting sequence number.
      *
-     * \return starting sequence number
+     * @return starting sequence number
      */
     virtual uint16_t GetStartingSequence() const;
     /**
      * Return the starting sequence control
      *
-     * \return starting sequence control
+     * @return starting sequence control
      */
     uint16_t GetStartingSequenceControl() const;
     /**
      * Return the last sequence number covered by the ack window
      *
-     * \return ending sequence number
+     * @return ending sequence number
      */
     uint16_t GetWinEnd() const;
     /**
      * Check whether the current ack policy is immediate BlockAck.
      *
-     * \return true if the current ack policy is immediate BlockAck,
+     * @return true if the current ack policy is immediate BlockAck,
      *         false otherwise
      */
     bool IsImmediateBlockAck() const;
     /**
      * Check whether A-MSDU is supported
      *
-     * \return true if A-MSDU is supported,
+     * @return true if A-MSDU is supported,
      *         false otherwise
      */
     bool IsAmsduSupported() const;
     /**
      * Enable or disable HT support.
      *
-     * \param htSupported enable or disable HT support
+     * @param htSupported enable or disable HT support
      */
     void SetHtSupported(bool htSupported);
     /**
      * Check whether HT is supported
      *
-     * \return true if HT is supported,
+     * @return true if HT is supported,
      *         false otherwise
      */
     bool IsHtSupported() const;
     /**
      * Get the type of the Block Acks sent by the recipient of this agreement.
      *
-     * \return the type of the Block Acks sent by the recipient of this agreement
+     * @return the type of the Block Acks sent by the recipient of this agreement
      */
     BlockAckType GetBlockAckType() const;
     /**
      * Get the type of the Block Ack Requests sent by the originator of this agreement.
      *
-     * \return the type of the Block Ack Requests sent by the originator of this agreement
+     * @return the type of the Block Ack Requests sent by the originator of this agreement
      */
     BlockAckReqType GetBlockAckReqType() const;
     /**
      * Get the distance between the given starting sequence number and the
      * given sequence number.
      *
-     * \param seqNumber the given sequence number
-     * \param startingSeqNumber the given starting sequence number
-     * \return the distance of the given sequence number from the given starting sequence number
+     * @param seqNumber the given sequence number
+     * @param startingSeqNumber the given starting sequence number
+     * @return the distance of the given sequence number from the given starting sequence number
      */
     static std::size_t GetDistance(uint16_t seqNumber, uint16_t startingSeqNumber);
+    /**
+     * Set the GCR group address for this agreement.
+     *
+     * @param gcrGroupAddress the GCR group address
+     */
+    void SetGcrGroupAddress(const Mac48Address& gcrGroupAddress);
+    /**
+     * Get the GCR group address of this agreement if it is a GCR Block Ack agreement.
+     *
+     * @return the GCR group address of this agreement if it is a GCR Block Ack agreement
+     */
+    const std::optional<Mac48Address>& GetGcrGroupAddress() const;
 
   protected:
-    Mac48Address m_peer;               //!< Peer address
-    uint8_t m_amsduSupported;          //!< Flag whether MSDU aggregation is supported
-    uint8_t m_blockAckPolicy;          //!< Type of block ack: immediate or delayed
-    uint8_t m_tid;                     //!< Traffic ID
-    uint16_t m_bufferSize;             //!< Buffer size
-    uint16_t m_timeout;                //!< Timeout
-    uint16_t m_startingSeq;            //!< Starting sequence control
-    uint16_t m_winEnd;                 //!< Ending sequence number
-    uint8_t m_htSupported;             //!< Flag whether HT is supported
-    mutable EventId m_inactivityEvent; //!< inactivity event
+    Mac48Address m_peer;                           //!< Peer address
+    bool m_amsduSupported;                         //!< Flag whether MSDU aggregation is supported
+    uint8_t m_blockAckPolicy;                      //!< Type of block ack: immediate or delayed
+    uint8_t m_tid;                                 //!< Traffic ID
+    uint16_t m_bufferSize;                         //!< Buffer size
+    uint16_t m_timeout;                            //!< Timeout
+    uint16_t m_startingSeq;                        //!< Starting sequence control
+    uint16_t m_winEnd;                             //!< Ending sequence number
+    bool m_htSupported;                            //!< Flag whether HT is supported
+    std::optional<Mac48Address> m_gcrGroupAddress; //!< the optional GCR group address
+    mutable EventId m_inactivityEvent;             //!< inactivity event
 };
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/block-ack-manager.cc ns-3.44/src/wifi/model/block-ack-manager.cc
--- ns-3.43/src/wifi/model/block-ack-manager.cc	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/block-ack-manager.cc	2025-03-09 16:55:49.783372600 -0700
@@ -62,27 +62,95 @@
     m_queue = nullptr;
 }
 
+BlockAckManager::OriginatorAgreementsI
+BlockAckManager::GetOriginatorBaAgreement(const Mac48Address& recipient,
+                                          uint8_t tid,
+                                          std::optional<Mac48Address> gcrGroupAddr)
+{
+    auto [first, last] = m_originatorAgreements.equal_range({recipient, tid});
+    for (auto it = first; it != last; ++it)
+    {
+        [[maybe_unused]] const auto& [baAgreement, packetQueue] = it->second;
+        if (baAgreement.GetGcrGroupAddress() == gcrGroupAddr)
+        {
+            return it;
+        }
+    }
+    return m_originatorAgreements.end();
+}
+
+BlockAckManager::OriginatorAgreementsCI
+BlockAckManager::GetOriginatorBaAgreement(const Mac48Address& recipient,
+                                          uint8_t tid,
+                                          std::optional<Mac48Address> gcrGroupAddr) const
+{
+    const auto [first, last] = m_originatorAgreements.equal_range({recipient, tid});
+    for (auto it = first; it != last; ++it)
+    {
+        [[maybe_unused]] const auto& [baAgreement, packetQueue] = it->second;
+        if (baAgreement.GetGcrGroupAddress() == gcrGroupAddr)
+        {
+            return it;
+        }
+    }
+    return m_originatorAgreements.cend();
+}
+
+BlockAckManager::RecipientAgreementsI
+BlockAckManager::GetRecipientBaAgreement(const Mac48Address& originator,
+                                         uint8_t tid,
+                                         std::optional<Mac48Address> gcrGroupAddr)
+{
+    auto [first, last] = m_recipientAgreements.equal_range({originator, tid});
+    for (auto it = first; it != last; ++it)
+    {
+        if (it->second.GetGcrGroupAddress() == gcrGroupAddr)
+        {
+            return it;
+        }
+    }
+    return m_recipientAgreements.end();
+}
+
+BlockAckManager::RecipientAgreementsCI
+BlockAckManager::GetRecipientBaAgreement(const Mac48Address& originator,
+                                         uint8_t tid,
+                                         std::optional<Mac48Address> gcrGroupAddr) const
+{
+    const auto [first, last] = m_recipientAgreements.equal_range({originator, tid});
+    for (auto it = first; it != last; ++it)
+    {
+        if (it->second.GetGcrGroupAddress() == gcrGroupAddr)
+        {
+            return it;
+        }
+    }
+    return m_recipientAgreements.cend();
+}
+
 BlockAckManager::OriginatorAgreementOptConstRef
-BlockAckManager::GetAgreementAsOriginator(const Mac48Address& recipient, uint8_t tid) const
+BlockAckManager::GetAgreementAsOriginator(const Mac48Address& recipient,
+                                          uint8_t tid,
+                                          std::optional<Mac48Address> gcrGroupAddr) const
 {
-    NS_LOG_FUNCTION(this << recipient << +tid);
-    if (auto it = m_originatorAgreements.find({recipient, tid}); it != m_originatorAgreements.end())
+    if (const auto it = GetOriginatorBaAgreement(recipient, tid, gcrGroupAddr);
+        it != m_originatorAgreements.cend())
     {
         return std::cref(it->second.first);
     }
-
     return std::nullopt;
 }
 
 BlockAckManager::RecipientAgreementOptConstRef
-BlockAckManager::GetAgreementAsRecipient(const Mac48Address& originator, uint8_t tid) const
+BlockAckManager::GetAgreementAsRecipient(const Mac48Address& originator,
+                                         uint8_t tid,
+                                         std::optional<Mac48Address> gcrGroupAddr) const
 {
-    NS_LOG_FUNCTION(this << originator << +tid);
-    if (auto it = m_recipientAgreements.find({originator, tid}); it != m_recipientAgreements.end())
+    if (const auto it = GetRecipientBaAgreement(originator, tid, gcrGroupAddr);
+        it != m_recipientAgreements.end())
     {
         return std::cref(it->second);
     }
-
     return std::nullopt;
 }
 
@@ -109,27 +177,51 @@
     {
         agreement.SetDelayedBlockAck();
     }
+    if (const auto gcrGroupAddr = reqHdr.GetGcrGroupAddress())
+    {
+        agreement.SetGcrGroupAddress(*gcrGroupAddr);
+    }
     agreement.SetState(OriginatorBlockAckAgreement::PENDING);
+
     m_originatorAgreementState(Simulator::Now(),
                                recipient,
                                tid,
                                OriginatorBlockAckAgreement::PENDING);
-    if (auto existingAgreement = GetAgreementAsOriginator(recipient, tid))
+
+    if (auto it = GetOriginatorBaAgreement(recipient, tid, reqHdr.GetGcrGroupAddress());
+        it != m_originatorAgreements.end())
     {
-        NS_ASSERT_MSG(existingAgreement->get().IsReset(),
-                      "Existing agreement must be in RESET state");
+        NS_ASSERT_MSG(it->second.first.IsReset(), "Existing agreement must be in RESET state");
+        it->second = std::make_pair(std::move(agreement), PacketQueue{});
     }
-    m_originatorAgreements.insert_or_assign({recipient, tid},
-                                            std::make_pair(std::move(agreement), PacketQueue{}));
-    m_blockPackets(recipient, tid);
+    else
+    {
+        m_originatorAgreements.emplace(std::make_pair(recipient, tid),
+                                       std::make_pair(std::move(agreement), PacketQueue{}));
+    }
+
+    const auto [first, last] = m_originatorAgreements.equal_range({recipient, tid});
+    NS_ASSERT_MSG(std::count_if(first,
+                                last,
+                                [&reqHdr](const auto& elem) {
+                                    return elem.second.first.GetGcrGroupAddress() ==
+                                           reqHdr.GetGcrGroupAddress();
+                                }) == 1,
+                  "There exists more than one "
+                      << (reqHdr.GetGcrGroupAddress().has_value() ? "GCR " : " ")
+                      << "Block Ack agreement for recipient " << recipient << " and tid " << +tid);
+
+    m_blockPackets(reqHdr.GetGcrGroupAddress().value_or(recipient), tid);
 }
 
 void
-BlockAckManager::DestroyOriginatorAgreement(const Mac48Address& recipient, uint8_t tid)
+BlockAckManager::DestroyOriginatorAgreement(const Mac48Address& recipient,
+                                            uint8_t tid,
+                                            std::optional<Mac48Address> gcrGroupAddr)
 {
-    NS_LOG_FUNCTION(this << recipient << +tid);
-    auto it = m_originatorAgreements.find({recipient, tid});
-    if (it != m_originatorAgreements.end())
+    NS_LOG_FUNCTION(this << recipient << tid << gcrGroupAddr.has_value());
+    if (auto it = GetOriginatorBaAgreement(recipient, tid, gcrGroupAddr);
+        it != m_originatorAgreements.end())
     {
         m_originatorAgreements.erase(it);
     }
@@ -141,9 +233,9 @@
                                            uint16_t startingSeq)
 {
     NS_LOG_FUNCTION(this << respHdr << recipient << startingSeq);
-    uint8_t tid = respHdr.GetTid();
-    auto it = m_originatorAgreements.find({recipient, tid});
-    if (it != m_originatorAgreements.end())
+    const auto tid = respHdr.GetTid();
+    if (auto it = GetOriginatorBaAgreement(recipient, tid, respHdr.GetGcrGroupAddress());
+        it != m_originatorAgreements.end())
     {
         OriginatorBlockAckAgreement& agreement = it->second.first;
         agreement.SetBufferSize(respHdr.GetBufferSize());
@@ -159,6 +251,11 @@
         {
             agreement.SetDelayedBlockAck();
         }
+        if (const auto gcrGroupAddr = respHdr.GetGcrGroupAddress())
+        {
+            agreement.SetGcrGroupAddress(*gcrGroupAddr);
+            m_gcrBlockAcks.emplace(*gcrGroupAddr, GcrBlockAcks{});
+        }
         if (!it->second.first.IsEstablished())
         {
             m_originatorAgreementState(Simulator::Now(),
@@ -174,10 +271,30 @@
                                                               &BlockAckManager::InactivityTimeout,
                                                               this,
                                                               recipient,
-                                                              tid);
+                                                              tid,
+                                                              respHdr.GetGcrGroupAddress());
+        }
+    }
+    if (!respHdr.GetGcrGroupAddress().has_value())
+    {
+        m_unblockPackets(recipient, tid);
+    }
+    else
+    {
+        for (const auto& agreement : m_originatorAgreements)
+        {
+            if (agreement.second.first.GetGcrGroupAddress() != respHdr.GetGcrGroupAddress())
+            {
+                continue;
+            }
+            if (!agreement.second.first.IsEstablished())
+            {
+                return;
+            }
         }
+        // established with all members so we can unblock
+        m_unblockPackets(respHdr.GetGcrGroupAddress().value(), tid);
     }
-    m_unblockPackets(recipient, tid);
 }
 
 void
@@ -206,21 +323,45 @@
     {
         agreement.SetDelayedBlockAck();
     }
+    if (const auto gcrGroupAddr = respHdr.GetGcrGroupAddress())
+    {
+        agreement.SetGcrGroupAddress(*gcrGroupAddr);
+    }
+
+    if (auto it = GetRecipientBaAgreement(originator, tid, respHdr.GetGcrGroupAddress());
+        it != m_recipientAgreements.end())
+    {
+        it->second = std::move(agreement);
+    }
+    else
+    {
+        m_recipientAgreements.emplace(std::make_pair(originator, tid), std::move(agreement));
+    }
 
-    m_recipientAgreements.insert_or_assign({originator, tid}, agreement);
+    const auto [first, last] = m_recipientAgreements.equal_range({originator, tid});
+    NS_ASSERT_MSG(
+        std::count_if(first,
+                      last,
+                      [&respHdr](const auto& elem) {
+                          return elem.second.GetGcrGroupAddress() == respHdr.GetGcrGroupAddress();
+                      }) == 1,
+        "There exists more than one " << (respHdr.GetGcrGroupAddress().has_value() ? "GCR " : " ")
+                                      << "Block Ack agreement for originator " << originator
+                                      << " and tid " << +tid);
 }
 
 void
-BlockAckManager::DestroyRecipientAgreement(const Mac48Address& originator, uint8_t tid)
+BlockAckManager::DestroyRecipientAgreement(const Mac48Address& originator,
+                                           uint8_t tid,
+                                           std::optional<Mac48Address> gcrGroupAddr)
 {
-    NS_LOG_FUNCTION(this << originator << tid);
-
-    if (auto agreementIt = m_recipientAgreements.find({originator, tid});
-        agreementIt != m_recipientAgreements.end())
+    NS_LOG_FUNCTION(this << originator << tid << gcrGroupAddr.has_value());
+    if (auto it = GetRecipientBaAgreement(originator, tid, gcrGroupAddr);
+        it != m_recipientAgreements.end())
     {
         // forward up the buffered MPDUs before destroying the agreement
-        agreementIt->second.Flush();
-        m_recipientAgreements.erase(agreementIt);
+        it->second.Flush();
+        m_recipientAgreements.erase(it);
     }
 }
 
@@ -228,15 +369,32 @@
 BlockAckManager::StorePacket(Ptr<WifiMpdu> mpdu)
 {
     NS_LOG_FUNCTION(this << *mpdu);
-    NS_ASSERT(mpdu->GetHeader().IsQosData());
+    DoStorePacket(mpdu, mpdu->GetHeader().GetAddr1());
+}
 
-    uint8_t tid = mpdu->GetHeader().GetQosTid();
-    Mac48Address recipient = mpdu->GetHeader().GetAddr1();
+void
+BlockAckManager::StoreGcrPacket(Ptr<WifiMpdu> mpdu, const GcrManager::GcrMembers& members)
+{
+    NS_LOG_FUNCTION(this << *mpdu << members.size());
+    for (const auto& member : members)
+    {
+        DoStorePacket(mpdu, member, mpdu->begin()->second.GetDestinationAddr());
+    }
+}
 
-    auto agreementIt = m_originatorAgreements.find({recipient, tid});
+void
+BlockAckManager::DoStorePacket(Ptr<WifiMpdu> mpdu,
+                               const Mac48Address& recipient,
+                               std::optional<Mac48Address> gcrGroupAddr)
+{
+    NS_LOG_FUNCTION(this << *mpdu << recipient << gcrGroupAddr.has_value());
+    NS_ASSERT(mpdu->GetHeader().IsQosData());
+
+    const auto tid = mpdu->GetHeader().GetQosTid();
+    auto agreementIt = GetOriginatorBaAgreement(recipient, tid, gcrGroupAddr);
     NS_ASSERT(agreementIt != m_originatorAgreements.end());
 
-    uint16_t mpduDist =
+    const auto mpduDist =
         agreementIt->second.first.GetDistance(mpdu->GetHeader().GetSequenceNumber());
 
     if (mpduDist >= SEQNO_SPACE_HALF_SIZE)
@@ -256,7 +414,7 @@
             return;
         }
 
-        uint16_t dist =
+        const auto dist =
             agreementIt->second.first.GetDistance((*it)->GetHeader().GetSequenceNumber());
 
         if (mpduDist > dist || (mpduDist == dist && mpdu->GetHeader().GetFragmentNumber() >
@@ -274,19 +432,14 @@
 uint32_t
 BlockAckManager::GetNBufferedPackets(const Mac48Address& recipient, uint8_t tid) const
 {
-    NS_LOG_FUNCTION(this << recipient << +tid);
-    auto it = m_originatorAgreements.find({recipient, tid});
-    if (it == m_originatorAgreements.end())
-    {
-        return 0;
-    }
-    return it->second.second.size();
+    const auto it = GetOriginatorBaAgreement(recipient, tid);
+    return (it != m_originatorAgreements.cend()) ? it->second.second.size() : 0;
 }
 
 void
 BlockAckManager::SetBlockAckThreshold(uint8_t nPackets)
 {
-    NS_LOG_FUNCTION(this << +nPackets);
+    NS_LOG_FUNCTION(this << nPackets);
     m_blockAckThreshold = nPackets;
 }
 
@@ -297,7 +450,7 @@
                                     const OriginatorAgreementsI& it,
                                     const Time& now)
 {
-    NS_LOG_FUNCTION(this << linkId << **mpduIt << +static_cast<uint8_t>(status));
+    NS_LOG_FUNCTION(this << linkId << **mpduIt << static_cast<uint8_t>(status));
 
     if (!(*mpduIt)->IsQueued())
     {
@@ -315,7 +468,7 @@
 
     const WifiMacHeader& hdr = (*mpduIt)->GetHeader();
 
-    NS_ASSERT(hdr.GetAddr1() == it->first.first);
+    NS_ASSERT((hdr.GetAddr1() == it->first.first) || hdr.GetAddr1().IsGroup());
     NS_ASSERT(hdr.IsQosData() && hdr.GetQosTid() == it->first.second);
 
     if (it->second.first.GetDistance(hdr.GetSequenceNumber()) >= SEQNO_SPACE_HALF_SIZE)
@@ -361,14 +514,18 @@
     NS_LOG_FUNCTION(this << linkId << *mpdu);
     NS_ASSERT(mpdu->GetHeader().IsQosData());
 
-    Mac48Address recipient = mpdu->GetOriginal()->GetHeader().GetAddr1();
-    uint8_t tid = mpdu->GetHeader().GetQosTid();
+    const auto recipient = mpdu->GetOriginal()->GetHeader().GetAddr1();
+    const auto tid = mpdu->GetHeader().GetQosTid();
 
-    auto it = m_originatorAgreements.find({recipient, tid});
+    auto it = GetOriginatorBaAgreement(recipient, tid);
     NS_ASSERT(it != m_originatorAgreements.end());
     NS_ASSERT(it->second.first.IsEstablished());
 
     it->second.first.NotifyAckedMpdu(mpdu);
+    if (!m_txOkCallback.IsNull())
+    {
+        m_txOkCallback(mpdu);
+    }
 
     // remove the acknowledged frame from the queue of outstanding packets
     for (auto queueIt = it->second.second.begin(); queueIt != it->second.second.end(); ++queueIt)
@@ -383,15 +540,32 @@
 }
 
 void
+BlockAckManager::NotifyLastGcrUrTx(Ptr<const WifiMpdu> mpdu,
+                                   const GcrManager::GcrMembers& recipients)
+{
+    NS_LOG_FUNCTION(this << *mpdu << recipients.size());
+    NS_ASSERT(mpdu->GetHeader().IsQosData());
+    const auto tid = mpdu->GetHeader().GetQosTid();
+    const auto gcrGroupAddr = mpdu->GetHeader().GetAddr1();
+    for (const auto& recipient : recipients)
+    {
+        auto it = GetOriginatorBaAgreement(recipient, tid, gcrGroupAddr);
+        NS_ASSERT(it != m_originatorAgreements.end());
+        NS_ASSERT(it->second.first.IsEstablished());
+        it->second.first.NotifyAckedMpdu(mpdu);
+    }
+}
+
+void
 BlockAckManager::NotifyMissedAck(uint8_t linkId, Ptr<WifiMpdu> mpdu)
 {
     NS_LOG_FUNCTION(this << linkId << *mpdu);
     NS_ASSERT(mpdu->GetHeader().IsQosData());
 
-    Mac48Address recipient = mpdu->GetOriginal()->GetHeader().GetAddr1();
-    uint8_t tid = mpdu->GetHeader().GetQosTid();
+    const auto recipient = mpdu->GetOriginal()->GetHeader().GetAddr1();
+    const auto tid = mpdu->GetHeader().GetQosTid();
 
-    auto it = m_originatorAgreements.find({recipient, tid});
+    auto it = GetOriginatorBaAgreement(recipient, tid);
     NS_ASSERT(it != m_originatorAgreements.end());
     NS_ASSERT(it->second.first.IsEstablished());
 
@@ -428,7 +602,7 @@
         tid = *tids.begin();
     }
 
-    auto it = m_originatorAgreements.find({recipient, tid});
+    auto it = GetOriginatorBaAgreement(recipient, tid);
     if (it == m_originatorAgreements.end() || !it->second.first.IsEstablished())
     {
         return {0, 0};
@@ -445,7 +619,12 @@
         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);
+            Simulator::Schedule(timeout,
+                                &BlockAckManager::InactivityTimeout,
+                                this,
+                                recipient,
+                                tid,
+                                std::nullopt);
     }
 
     NS_ASSERT(blockAck.IsCompressed() || blockAck.IsExtendedCompressed() || blockAck.IsMultiSta());
@@ -500,18 +679,152 @@
     return {nSuccessfulMpdus, nFailedMpdus};
 }
 
+std::optional<std::pair<uint16_t, uint16_t>>
+BlockAckManager::NotifyGotGcrBlockAck(uint8_t linkId,
+                                      const CtrlBAckResponseHeader& blockAck,
+                                      const Mac48Address& recipient,
+                                      const GcrManager::GcrMembers& members)
+{
+    NS_LOG_FUNCTION(this << linkId << blockAck << recipient);
+    NS_ABORT_MSG_IF(!blockAck.IsGcr(), "GCR Block Ack is expected");
+    NS_ABORT_MSG_IF(members.count(recipient) == 0,
+                    "Received GCR Block Ack response from unexpected recipient");
+
+    const auto tid = blockAck.GetTidInfo();
+    auto it = GetOriginatorBaAgreement(recipient, tid, blockAck.GetGcrGroupAddress());
+    if (it == m_originatorAgreements.end() || !it->second.first.IsEstablished())
+    {
+        return {};
+    }
+
+    NS_ASSERT_MSG(it->second.first.GetGcrGroupAddress().has_value() &&
+                      it->second.first.GetGcrGroupAddress().value() ==
+                          blockAck.GetGcrGroupAddress(),
+                  "No GCR agreement for group address " << blockAck.GetGcrGroupAddress());
+    if (it->second.first.m_inactivityEvent.IsPending())
+    {
+        /* 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,
+                                blockAck.GetGcrGroupAddress());
+    }
+
+    auto itGcrBlockAcks = m_gcrBlockAcks.find(blockAck.GetGcrGroupAddress());
+    NS_ASSERT(itGcrBlockAcks != m_gcrBlockAcks.end());
+    NS_ASSERT(itGcrBlockAcks->second.count(recipient) == 0);
+    itGcrBlockAcks->second[recipient] = blockAck;
+
+    if (itGcrBlockAcks->second.size() < members.size())
+    {
+        // we need to collect feedback from all members
+        NS_LOG_DEBUG("Expecting more GCR Block ACK(s)");
+        return {};
+    }
+
+    std::vector<bool> acked;
+    for (auto queueIt = it->second.second.begin(); queueIt != it->second.second.end(); ++queueIt)
+    {
+        auto currentSeq = (*queueIt)->GetHeader().GetSequenceNumber();
+        NS_LOG_DEBUG("Current seq=" << currentSeq);
+        auto received = true;
+        for ([[maybe_unused]] const auto& [recipient, gcrBlockAcks] : itGcrBlockAcks->second)
+        {
+            received &= gcrBlockAcks.IsPacketReceived(currentSeq, 0);
+        }
+        acked.emplace_back(received);
+    }
+
+    uint16_t nSuccessfulMpdus = 0;
+    uint16_t nFailedMpdus = 0;
+    const auto now = Simulator::Now();
+    std::list<Ptr<const WifiMpdu>> ackedMpdus;
+    auto countAndNotify = true;
+    for (const auto& member : members)
+    {
+        std::size_t index = 0;
+        it = GetOriginatorBaAgreement(member, tid, blockAck.GetGcrGroupAddress());
+        NS_ASSERT(acked.size() == it->second.second.size());
+        for (auto queueIt = it->second.second.begin(); queueIt != it->second.second.end();)
+        {
+            if (acked.at(index++))
+            {
+                it->second.first.NotifyAckedMpdu(*queueIt);
+                if (countAndNotify)
+                {
+                    nSuccessfulMpdus++;
+                    if (!m_txOkCallback.IsNull())
+                    {
+                        m_txOkCallback(*queueIt);
+                    }
+                    ackedMpdus.emplace_back(*queueIt);
+                }
+                queueIt = HandleInFlightMpdu(linkId, queueIt, ACKNOWLEDGED, it, now);
+            }
+            else
+            {
+                ++queueIt;
+            }
+        }
+        countAndNotify = false;
+    }
+
+    // Dequeue all acknowledged MPDUs at once
+    m_queue->DequeueIfQueued(ackedMpdus);
+
+    // Remaining outstanding MPDUs have not been acknowledged
+    countAndNotify = true;
+    for (const auto& member : members)
+    {
+        it = GetOriginatorBaAgreement(member, tid, blockAck.GetGcrGroupAddress());
+        for (auto queueIt = it->second.second.begin(); queueIt != it->second.second.end();)
+        {
+            // transmission actually failed if the MPDU is inflight only on the same link on
+            // which we received the BlockAck frame
+            auto linkIds = (*queueIt)->GetInFlightLinkIds();
+
+            if (linkIds.size() == 1 && *linkIds.begin() == linkId)
+            {
+                if (countAndNotify)
+                {
+                    nFailedMpdus++;
+                    if (!m_txFailedCallback.IsNull())
+                    {
+                        m_txFailedCallback(*queueIt);
+                    }
+                }
+                queueIt = HandleInFlightMpdu(linkId, queueIt, TO_RETRANSMIT, it, now);
+                continue;
+            }
+
+            queueIt = HandleInFlightMpdu(linkId, queueIt, STAY_INFLIGHT, it, now);
+        }
+        countAndNotify = false;
+    }
+
+    itGcrBlockAcks->second.clear();
+    return std::make_pair(nSuccessfulMpdus, nFailedMpdus);
+}
+
 void
 BlockAckManager::NotifyMissedBlockAck(uint8_t linkId, const Mac48Address& recipient, uint8_t tid)
 {
-    NS_LOG_FUNCTION(this << linkId << recipient << +tid);
+    NS_LOG_FUNCTION(this << linkId << recipient << tid);
 
-    auto it = m_originatorAgreements.find({recipient, tid});
+    auto it = GetOriginatorBaAgreement(recipient, tid);
     if (it == m_originatorAgreements.end() || !it->second.first.IsEstablished())
     {
         return;
     }
 
-    Time now = Simulator::Now();
+    const auto now = Simulator::Now();
 
     // remove all packets from the queue of outstanding packets (they will be
     // re-inserted if retransmitted)
@@ -532,7 +845,6 @@
 BlockAckManager::NotifyDiscardedMpdu(Ptr<const WifiMpdu> mpdu)
 {
     NS_LOG_FUNCTION(this << *mpdu);
-
     if (!mpdu->GetHeader().IsQosData())
     {
         NS_LOG_DEBUG("Not a QoS Data frame");
@@ -545,30 +857,53 @@
         return;
     }
 
-    Mac48Address recipient = mpdu->GetOriginal()->GetHeader().GetAddr1();
-    uint8_t tid = mpdu->GetHeader().GetQosTid();
-    auto it = m_originatorAgreements.find({recipient, tid});
-    if (it == m_originatorAgreements.end() || !it->second.first.IsEstablished())
+    const auto recipient = mpdu->GetOriginal()->GetHeader().GetAddr1();
+    const auto tid = mpdu->GetHeader().GetQosTid();
+    if (!recipient.IsGroup())
+    {
+        auto it = GetOriginatorBaAgreement(recipient, tid);
+        HandleDiscardedMpdu(mpdu, it);
+    }
+    else
+    {
+        const auto groupAddress = mpdu->GetOriginal()->GetHeader().GetAddr1();
+        for (auto it = m_originatorAgreements.begin(); it != m_originatorAgreements.end(); ++it)
+        {
+            if (it->first.second != tid || !it->second.first.GetGcrGroupAddress().has_value() ||
+                it->second.first.GetGcrGroupAddress().value() != groupAddress)
+            {
+                continue;
+            }
+            HandleDiscardedMpdu(mpdu, it);
+        }
+    }
+}
+
+void
+BlockAckManager::HandleDiscardedMpdu(Ptr<const WifiMpdu> mpdu, OriginatorAgreementsI iter)
+{
+    if (iter == m_originatorAgreements.end() || !iter->second.first.IsEstablished())
     {
         NS_LOG_DEBUG("No established Block Ack agreement");
         return;
     }
 
-    uint16_t currStartingSeq = it->second.first.GetStartingSequence();
-    if (QosUtilsIsOldPacket(currStartingSeq, mpdu->GetHeader().GetSequenceNumber()))
+    auto& [baAgreement, packetQueue] = iter->second;
+    if (const auto currStartingSeq = baAgreement.GetStartingSequence();
+        QosUtilsIsOldPacket(currStartingSeq, mpdu->GetHeader().GetSequenceNumber()))
     {
         NS_LOG_DEBUG("Discarded an old frame");
         return;
     }
 
     // actually advance the transmit window
-    it->second.first.NotifyDiscardedMpdu(mpdu);
+    baAgreement.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();)
+    for (auto mpduIt = iter->second.second.begin(); mpduIt != iter->second.second.end();)
     {
-        if (it->second.first.GetDistance((*mpduIt)->GetHeader().GetSequenceNumber()) >=
+        if (baAgreement.GetDistance((*mpduIt)->GetHeader().GetSequenceNumber()) >=
             SEQNO_SPACE_HALF_SIZE)
         {
             NS_LOG_DEBUG("Dropping old MPDU: " << **mpduIt);
@@ -577,7 +912,7 @@
             {
                 m_droppedOldMpduCallback(*mpduIt);
             }
-            mpduIt = it->second.second.erase(mpduIt);
+            mpduIt = packetQueue.erase(mpduIt);
         }
         else
         {
@@ -586,6 +921,7 @@
     }
 
     // schedule a BlockAckRequest
+    const auto [recipient, tid] = iter->first;
     NS_LOG_DEBUG("Schedule a Block Ack Request for agreement (" << recipient << ", " << +tid
                                                                 << ")");
 
@@ -598,48 +934,60 @@
     hdr.SetNoRetry();
     hdr.SetNoMoreFragments();
 
-    ScheduleBar(GetBlockAckReqHeader(recipient, tid), hdr);
+    ScheduleBar(GetBlockAckReqHeader(recipient, tid, baAgreement.GetGcrGroupAddress()), hdr);
 }
 
 void
 BlockAckManager::NotifyGotBlockAckRequest(const Mac48Address& originator,
                                           uint8_t tid,
-                                          uint16_t startingSeq)
+                                          uint16_t startingSeq,
+                                          std::optional<Mac48Address> gcrGroupAddr)
 {
-    NS_LOG_FUNCTION(this << originator << tid << startingSeq);
-    auto it = m_recipientAgreements.find({originator, tid});
-    if (it == m_recipientAgreements.end())
+    NS_LOG_FUNCTION(this << originator << tid << startingSeq << gcrGroupAddr.has_value());
+    if (auto it = GetRecipientBaAgreement(originator, tid, gcrGroupAddr);
+        it != m_recipientAgreements.end())
     {
-        return;
+        it->second.NotifyReceivedBar(startingSeq);
     }
-    it->second.NotifyReceivedBar(startingSeq);
 }
 
 void
 BlockAckManager::NotifyGotMpdu(Ptr<const WifiMpdu> mpdu)
 {
     NS_LOG_FUNCTION(this << *mpdu);
-    auto originator = mpdu->GetOriginal()->GetHeader().GetAddr2();
     NS_ASSERT(mpdu->GetHeader().IsQosData());
-    auto tid = mpdu->GetHeader().GetQosTid();
-
-    auto it = m_recipientAgreements.find({originator, tid});
-    if (it == m_recipientAgreements.end())
+    const auto originator = mpdu->GetOriginal()->GetHeader().GetAddr2();
+    const auto tid = mpdu->GetHeader().GetQosTid();
+    std::optional<Mac48Address> groupAddress;
+    if (const auto addr1 = mpdu->GetOriginal()->GetHeader().GetAddr1(); addr1.IsGroup())
     {
-        return;
+        groupAddress =
+            mpdu->GetHeader().IsQosAmsdu() ? mpdu->begin()->second.GetDestinationAddr() : addr1;
+    }
+    if (auto it = GetRecipientBaAgreement(originator, tid, groupAddress);
+        it != m_recipientAgreements.end())
+    {
+        it->second.NotifyReceivedMpdu(mpdu);
     }
-    it->second.NotifyReceivedMpdu(mpdu);
 }
 
 CtrlBAckRequestHeader
-BlockAckManager::GetBlockAckReqHeader(const Mac48Address& recipient, uint8_t tid) const
+BlockAckManager::GetBlockAckReqHeader(const Mac48Address& recipient,
+                                      uint8_t tid,
+                                      std::optional<Mac48Address> gcrGroupAddr) const
 {
-    NS_LOG_FUNCTION(this << recipient << +tid);
-    auto it = m_originatorAgreements.find({recipient, tid});
+    auto it = GetOriginatorBaAgreement(recipient, tid, gcrGroupAddr);
     NS_ASSERT(it != m_originatorAgreements.end());
-
     CtrlBAckRequestHeader reqHdr;
-    reqHdr.SetType((*it).second.first.GetBlockAckReqType());
+    if (gcrGroupAddr.has_value())
+    {
+        reqHdr.SetType(BlockAckReqType::GCR);
+        reqHdr.SetGcrGroupAddress(gcrGroupAddr.value());
+    }
+    else
+    {
+        reqHdr.SetType((*it).second.first.GetBlockAckReqType());
+    }
     reqHdr.SetTidInfo(tid);
     reqHdr.SetStartingSequence((*it).second.first.GetStartingSequence());
     return reqHdr;
@@ -704,36 +1052,21 @@
 }
 
 void
-BlockAckManager::InactivityTimeout(const Mac48Address& recipient, uint8_t tid)
-{
-    NS_LOG_FUNCTION(this << recipient << +tid);
-    m_blockAckInactivityTimeout(recipient, tid, true);
-}
-
-void
-BlockAckManager::NotifyOriginatorAgreementEstablished(const Mac48Address& recipient,
-                                                      uint8_t tid,
-                                                      uint16_t startingSeq)
+BlockAckManager::InactivityTimeout(const Mac48Address& recipient,
+                                   uint8_t tid,
+                                   std::optional<Mac48Address> gcrGroupAddr)
 {
-    NS_LOG_FUNCTION(this << recipient << +tid << startingSeq);
-    auto it = m_originatorAgreements.find({recipient, tid});
-    NS_ASSERT(it != m_originatorAgreements.end());
-    if (!it->second.first.IsEstablished())
-    {
-        m_originatorAgreementState(Simulator::Now(),
-                                   recipient,
-                                   tid,
-                                   OriginatorBlockAckAgreement::ESTABLISHED);
-    }
-    it->second.first.SetState(OriginatorBlockAckAgreement::ESTABLISHED);
-    it->second.first.SetStartingSequence(startingSeq);
+    NS_LOG_FUNCTION(this << recipient << tid << gcrGroupAddr.has_value());
+    m_blockAckInactivityTimeout(recipient, tid, true, gcrGroupAddr);
 }
 
 void
-BlockAckManager::NotifyOriginatorAgreementRejected(const Mac48Address& recipient, uint8_t tid)
+BlockAckManager::NotifyOriginatorAgreementRejected(const Mac48Address& recipient,
+                                                   uint8_t tid,
+                                                   std::optional<Mac48Address> gcrGroupAddr)
 {
-    NS_LOG_FUNCTION(this << recipient << +tid);
-    auto it = m_originatorAgreements.find({recipient, tid});
+    NS_LOG_FUNCTION(this << recipient << tid << gcrGroupAddr.has_value());
+    auto it = GetOriginatorBaAgreement(recipient, tid, gcrGroupAddr);
     NS_ASSERT(it != m_originatorAgreements.end());
     if (!it->second.first.IsRejected())
     {
@@ -743,14 +1076,19 @@
                                    OriginatorBlockAckAgreement::REJECTED);
     }
     it->second.first.SetState(OriginatorBlockAckAgreement::REJECTED);
-    m_unblockPackets(recipient, tid);
+    if (!gcrGroupAddr.has_value())
+    {
+        m_unblockPackets(recipient, tid);
+    }
 }
 
 void
-BlockAckManager::NotifyOriginatorAgreementNoReply(const Mac48Address& recipient, uint8_t tid)
+BlockAckManager::NotifyOriginatorAgreementNoReply(const Mac48Address& recipient,
+                                                  uint8_t tid,
+                                                  std::optional<Mac48Address> gcrGroupAddr)
 {
-    NS_LOG_FUNCTION(this << recipient << +tid);
-    auto it = m_originatorAgreements.find({recipient, tid});
+    NS_LOG_FUNCTION(this << recipient << tid << gcrGroupAddr.has_value());
+    auto it = GetOriginatorBaAgreement(recipient, tid, gcrGroupAddr);
     NS_ASSERT(it != m_originatorAgreements.end());
     if (!it->second.first.IsNoReply())
     {
@@ -760,14 +1098,19 @@
                                    OriginatorBlockAckAgreement::NO_REPLY);
     }
     it->second.first.SetState(OriginatorBlockAckAgreement::NO_REPLY);
-    m_unblockPackets(recipient, tid);
+    if (!gcrGroupAddr.has_value())
+    {
+        m_unblockPackets(recipient, tid);
+    }
 }
 
 void
-BlockAckManager::NotifyOriginatorAgreementReset(const Mac48Address& recipient, uint8_t tid)
+BlockAckManager::NotifyOriginatorAgreementReset(const Mac48Address& recipient,
+                                                uint8_t tid,
+                                                std::optional<Mac48Address> gcrGroupAddr)
 {
-    NS_LOG_FUNCTION(this << recipient << +tid);
-    auto it = m_originatorAgreements.find({recipient, tid});
+    NS_LOG_FUNCTION(this << recipient << tid << gcrGroupAddr.has_value());
+    auto it = GetOriginatorBaAgreement(recipient, tid, gcrGroupAddr);
     NS_ASSERT(it != m_originatorAgreements.end());
     if (!it->second.first.IsReset())
     {
@@ -777,6 +1120,10 @@
                                    OriginatorBlockAckAgreement::RESET);
     }
     it->second.first.SetState(OriginatorBlockAckAgreement::RESET);
+    if (gcrGroupAddr.has_value())
+    {
+        m_unblockPackets(gcrGroupAddr.value(), tid);
+    }
 }
 
 void
@@ -789,7 +1136,7 @@
 bool
 BlockAckManager::NeedBarRetransmission(uint8_t tid, const Mac48Address& recipient)
 {
-    auto it = m_originatorAgreements.find({recipient, tid});
+    auto it = GetOriginatorBaAgreement(recipient, tid);
     if (it == m_originatorAgreements.end() || !it->second.first.IsEstablished())
     {
         // If the inactivity timer has expired, QosTxop::SendDelbaFrame has been called and
@@ -797,7 +1144,7 @@
         return false;
     }
 
-    Time now = Simulator::Now();
+    const auto 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();)
@@ -815,8 +1162,18 @@
     return false;
 }
 
+bool
+BlockAckManager::NeedGcrBarRetransmission(const Mac48Address& gcrGroupAddress,
+                                          const Mac48Address& recipient,
+                                          uint8_t tid) const
+{
+    const auto it = GetOriginatorBaAgreement(recipient, tid, gcrGroupAddress);
+    return (it != m_originatorAgreements.cend() && it->second.first.IsEstablished());
+}
+
 void
-BlockAckManager::SetBlockAckInactivityCallback(Callback<void, Mac48Address, uint8_t, bool> callback)
+BlockAckManager::SetBlockAckInactivityCallback(
+    Callback<void, Mac48Address, uint8_t, bool, std::optional<Mac48Address>> callback)
 {
     NS_LOG_FUNCTION(this << &callback);
     m_blockAckInactivityTimeout = callback;
@@ -857,25 +1214,70 @@
 uint16_t
 BlockAckManager::GetRecipientBufferSize(const Mac48Address& recipient, uint8_t tid) const
 {
-    uint16_t size = 0;
-    auto it = m_originatorAgreements.find({recipient, tid});
-    if (it != m_originatorAgreements.end())
-    {
-        size = it->second.first.GetBufferSize();
-    }
-    return size;
+    const auto it = GetOriginatorBaAgreement(recipient, tid);
+    return (it != m_originatorAgreements.cend()) ? it->second.first.GetBufferSize() : 0;
 }
 
 uint16_t
 BlockAckManager::GetOriginatorStartingSequence(const Mac48Address& recipient, uint8_t tid) const
 {
+    const auto it = GetOriginatorBaAgreement(recipient, tid);
+    return (it != m_originatorAgreements.cend()) ? it->second.first.GetStartingSequence() : 0;
+}
+
+uint16_t
+BlockAckManager::GetGcrStartingSequence(const Mac48Address& groupAddress, uint8_t tid) const
+{
     uint16_t seqNum = 0;
-    auto it = m_originatorAgreements.find({recipient, tid});
-    if (it != m_originatorAgreements.end())
+    for (const auto& [key, pair] : m_originatorAgreements)
     {
-        seqNum = it->second.first.GetStartingSequence();
+        if (key.second != tid)
+        {
+            continue;
+        }
+        if (pair.first.GetGcrGroupAddress() == groupAddress)
+        {
+            seqNum = pair.first.GetStartingSequence();
+            break;
+        }
     }
     return seqNum;
 }
 
+uint16_t
+BlockAckManager::GetGcrBufferSize(const Mac48Address& groupAddress, uint8_t tid) const
+{
+    /* The AP shall maintain a set of the most recently received values of the
+       Buffer Size subfield from the Block Ack Parameter Set field in the ADDBA
+       Response frame received from each member of a specific group address.
+       The minimum of that set of values is defined to be the GCR buffer size
+       for that group address. */
+    uint16_t gcrBufferSize = std::numeric_limits<uint16_t>::max();
+    for (const auto& [key, pair] : m_originatorAgreements)
+    {
+        if ((key.second == tid) && (pair.first.GetGcrGroupAddress() == groupAddress))
+        {
+            gcrBufferSize = std::min(pair.first.GetBufferSize(), gcrBufferSize);
+        }
+    }
+    return gcrBufferSize;
+}
+
+bool
+BlockAckManager::IsGcrAgreementEstablished(const Mac48Address& gcrGroupAddress,
+                                           uint8_t tid,
+                                           const GcrManager::GcrMembers& members) const
+{
+    NS_ASSERT(!members.empty());
+    for (const auto& member : members)
+    {
+        if (const auto agreement = GetAgreementAsOriginator(member, tid, gcrGroupAddress);
+            !agreement || !agreement->get().IsEstablished())
+        {
+            return false;
+        }
+    }
+    return true;
+}
+
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/block-ack-manager.h ns-3.44/src/wifi/model/block-ack-manager.h
--- ns-3.43/src/wifi/model/block-ack-manager.h	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/block-ack-manager.h	2025-03-09 16:55:49.783372600 -0700
@@ -10,6 +10,7 @@
 #define BLOCK_ACK_MANAGER_H
 
 #include "block-ack-type.h"
+#include "gcr-manager.h"
 #include "originator-block-ack-agreement.h"
 #include "recipient-block-ack-agreement.h"
 #include "wifi-mac-header.h"
@@ -34,8 +35,8 @@
 class MacRxMiddle;
 
 /**
- * \brief Manages all block ack agreements for an originator station.
- * \ingroup wifi
+ * @brief Manages all block ack agreements for an originator station.
+ * @ingroup wifi
  */
 class BlockAckManager : public Object
 {
@@ -52,8 +53,8 @@
 
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -72,29 +73,36 @@
         std::optional<std::reference_wrapper<const RecipientBlockAckAgreement>>;
 
     /**
-     * \param recipient MAC address of the recipient
-     * \param tid Traffic ID
+     * @param recipient MAC address of the recipient
+     * @param tid Traffic ID
+     * @param gcrGroupAddr the GCR Group Address (only if it is a GCR Block Ack agreement)
      *
-     * \return a const reference to the block ack agreement with the given recipient, if it exists
+     * @return a const reference to the block ack agreement with the given recipient, if it exists
      *
      * Check if we are the originator of an existing block ack agreement with the given recipient.
      */
-    OriginatorAgreementOptConstRef GetAgreementAsOriginator(const Mac48Address& recipient,
-                                                            uint8_t tid) const;
+    OriginatorAgreementOptConstRef GetAgreementAsOriginator(
+        const Mac48Address& recipient,
+        uint8_t tid,
+        std::optional<Mac48Address> gcrGroupAddr = std::nullopt) const;
+
     /**
-     * \param originator MAC address of the originator
-     * \param tid Traffic ID
+     * @param originator MAC address of the originator
+     * @param tid Traffic ID
+     * @param gcrGroupAddr the GCR Group Address (only if it is a GCR Block Ack agreement)
      *
-     * \return a const reference to the block ack agreement with the given originator, if it exists
+     * @return a const reference to the block ack agreement with the given originator, if it exists
      *
      * Check if we are the recipient of an existing block ack agreement with the given originator.
      */
-    RecipientAgreementOptConstRef GetAgreementAsRecipient(const Mac48Address& originator,
-                                                          uint8_t tid) const;
+    RecipientAgreementOptConstRef GetAgreementAsRecipient(
+        const Mac48Address& originator,
+        uint8_t tid,
+        std::optional<Mac48Address> gcrGroupAddr = std::nullopt) const;
 
     /**
-     * \param reqHdr Relative Add block ack request (action frame).
-     * \param recipient Address of peer station involved in block ack mechanism.
+     * @param reqHdr Relative Add block ack request (action frame).
+     * @param recipient Address of peer station involved in block ack mechanism.
      *
      * Creates a new originator block ack agreement in pending state. When a ADDBA response
      * with a successful status code is received, the relative agreement becomes established.
@@ -102,17 +110,20 @@
     void CreateOriginatorAgreement(const MgtAddBaRequestHeader& reqHdr,
                                    const Mac48Address& recipient);
     /**
-     * \param recipient Address of peer station involved in block ack mechanism.
-     * \param tid traffic ID of transmitted packet.
+     * @param recipient Address of peer station involved in block ack mechanism.
+     * @param tid traffic ID of transmitted packet.
+     * @param gcrGroupAddr the GCR Group Address (only if it a GCR Block Ack agreement)
      *
      * Invoked when a recipient reject a block ack agreement or when a DELBA frame
      * is Received/Transmitted.
      */
-    void DestroyOriginatorAgreement(const Mac48Address& recipient, uint8_t tid);
-    /**
-     * \param respHdr Relative Add block ack response (action frame).
-     * \param recipient Address of peer station involved in block ack mechanism.
-     * \param startingSeq the updated starting sequence number
+    void DestroyOriginatorAgreement(const Mac48Address& recipient,
+                                    uint8_t tid,
+                                    std::optional<Mac48Address> gcrGroupAddr);
+    /**
+     * @param respHdr Relative Add block ack response (action frame).
+     * @param recipient Address of peer station involved in block ack mechanism.
+     * @param startingSeq the updated starting sequence number
      *
      * Invoked upon receipt of a ADDBA response frame from <i>recipient</i>.
      */
@@ -121,13 +132,13 @@
                                    uint16_t startingSeq);
 
     /**
-     * \param respHdr Add block ack response from originator (action
+     * @param respHdr Add block ack response from originator (action
      *        frame).
-     * \param originator Address of peer station involved in block ack
+     * @param originator Address of peer station involved in block ack
      *        mechanism.
-     * \param startingSeq Sequence number of the first MPDU of all
+     * @param startingSeq Sequence number of the first MPDU of all
      *        packets for which block ack was negotiated.
-     * \param rxMiddle the MAC RX Middle on this station
+     * @param rxMiddle the MAC RX Middle on this station
      *
      * This function is typically invoked only by ns3::WifiMac
      * when the STA (which may be non-AP in ESS, or in an IBSS) has
@@ -143,26 +154,39 @@
     /**
      * Destroy a recipient Block Ack agreement.
      *
-     * \param originator the originator MAC address
-     * \param tid the TID associated with the Block Ack agreement
+     * @param originator the originator MAC address
+     * @param tid the TID associated with the Block Ack agreement
+     * @param gcrGroupAddr the GCR Group Address (only if it a GCR Block Ack agreement)
      */
-    void DestroyRecipientAgreement(const Mac48Address& originator, uint8_t tid);
+    void DestroyRecipientAgreement(const Mac48Address& originator,
+                                   uint8_t tid,
+                                   std::optional<Mac48Address> gcrGroupAddr);
 
     /**
-     * \param mpdu MPDU to store.
+     * @param mpdu MPDU to store.
      *
      * Stores <i>mpdu</i> for a possible future retransmission. Retransmission occurs
-     * if the packet, in a BlockAck frame, is indicated by recipient as not received.
+     * if the packet, in a Block Ack frame, is indicated by recipient as not received.
      */
     void StorePacket(Ptr<WifiMpdu> mpdu);
+
+    /**
+     * @param mpdu groupcast MPDU to store.
+     * @param members intended recipients for the groupcast MPDU.
+     *
+     * Stores <i>mpdu</i> for a possible future retransmission. Retransmission occurs
+     * if the packet, in a GCR Block Ack frame, is indicated by recipient as not received.
+     */
+    void StoreGcrPacket(Ptr<WifiMpdu> mpdu, const GcrManager::GcrMembers& members);
+
     /**
      * Invoked upon receipt of an Ack frame on the given link 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
      * transmit window, if needed.
      *
-     * \param linkId the ID of the given link
-     * \param mpdu The acknowledged MPDU.
+     * @param linkId the ID of the given link
+     * @param mpdu The acknowledged MPDU.
      */
     void NotifyGotAck(uint8_t linkId, Ptr<const WifiMpdu> mpdu);
     /**
@@ -171,22 +195,22 @@
      * Remove the acknowledged frame from the outstanding packets and insert it in the
      * retransmission queue.
      *
-     * \param linkId the ID of the given link
-     * \param mpdu The unacknowledged MPDU.
+     * @param linkId the ID of the given link
+     * @param mpdu The unacknowledged MPDU.
      */
     void NotifyMissedAck(uint8_t linkId, Ptr<WifiMpdu> mpdu);
     /**
-     * \param linkId the ID of the given link
-     * \param blockAck The received BlockAck frame.
-     * \param recipient Sender of BlockAck frame.
-     * \param tids the set of TIDs the acknowledged MPDUs belong to
-     * \param index the index of the Per AID TID Info subfield, in case of Multi-STA
+     * @param linkId the ID of the given link
+     * @param blockAck The received BlockAck frame.
+     * @param recipient Sender of BlockAck frame.
+     * @param tids the set of TIDs the acknowledged MPDUs belong to
+     * @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
+     * @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 on the given link. Typically, this function
-     * is called by ns3::QosTxop object. Performs a check on which MPDUs, previously sent
+     * Invoked upon receipt of a Block Ack frame on the given link. Typically, this function
+     * is called by the frame exchange manager. Performs a check on which MPDUs, previously sent
      * with Ack Policy set to Block Ack, were correctly received by the recipient.
      * An acknowledged MPDU is removed from the buffer, retransmitted otherwise.
      * Note that <i>tids</i> is only used if <i>blockAck</i> is a Multi-STA Block Ack
@@ -197,10 +221,32 @@
                                                     const Mac48Address& recipient,
                                                     const std::set<uint8_t>& tids,
                                                     size_t index = 0);
+
     /**
-     * \param linkId the ID of the given link
-     * \param recipient Sender of the expected BlockAck frame.
-     * \param tid Traffic ID.
+     * @param linkId the ID of the given link
+     * @param blockAck The received BlockAck frame.
+     * @param recipient Sender of BlockAck frame.
+     * @param members the list of member STAs for that GCR group
+     * @return a pair of values indicating the number of successfully received MPDUs
+     *         and the number of failed MPDUs if GCR Block Ack frames for all member STAs
+     *         have been received.
+     *
+     * Invoked upon receipt of a GCR Block Ack frame on the given link. Typically, this function
+     * is called by the frame exchange manager. Stores the received Block Ack response for each
+     * GCR member STA. Once all responses have been received, it performs a check on which MPDUs,
+     * previously sent with Ack Policy set to Block Ack, were correctly received by the recipient.
+     * An acknowledged MPDU is removed from the buffer, retransmitted otherwise.
+     */
+    std::optional<std::pair<uint16_t, uint16_t>> NotifyGotGcrBlockAck(
+        uint8_t linkId,
+        const CtrlBAckResponseHeader& blockAck,
+        const Mac48Address& recipient,
+        const GcrManager::GcrMembers& members);
+
+    /**
+     * @param linkId the ID of the given link
+     * @param recipient Sender of the expected BlockAck frame.
+     * @param tid Traffic ID.
      *
      * Invoked upon missed reception of a block ack frame on the given link. Typically, this
      * function is called by ns3::QosTxop object. Performs a check on which MPDUs, previously
@@ -208,70 +254,71 @@
      */
     void NotifyMissedBlockAck(uint8_t linkId, const Mac48Address& recipient, uint8_t tid);
     /**
-     * \param originator MAC address of the sender of the Block Ack Request
-     * \param tid Traffic ID
-     * \param startingSeq the starting sequence number in the Block Ack Request
+     * @param originator MAC address of the sender of the Block Ack Request
+     * @param tid Traffic ID
+     * @param startingSeq the starting sequence number in the Block Ack Request
+     * @param gcrGroupAddr the GCR Group Address (only if it is a GCR Block Ack Request frame)
      *
      * Perform required actions upon receiving a Block Ack Request frame.
      */
     void NotifyGotBlockAckRequest(const Mac48Address& originator,
                                   uint8_t tid,
-                                  uint16_t startingSeq);
+                                  uint16_t startingSeq,
+                                  std::optional<Mac48Address> gcrGroupAddr = std::nullopt);
+
     /**
-     * \param mpdu the received MPDU
+     * @param mpdu the received MPDU
      *
      * Perform required actions upon receiving an MPDU.
      */
     void NotifyGotMpdu(Ptr<const WifiMpdu> mpdu);
     /**
-     * \param recipient Address of peer station involved in block ack mechanism.
-     * \param tid Traffic ID.
+     * @param recipient Address of peer station involved in block ack mechanism.
+     * @param tid Traffic ID.
      *
-     * \return the number of packets buffered for a specified agreement
+     * @return the number of packets buffered for a specified agreement
      *
      * Returns the number of packets buffered for a specified agreement. This methods doesn't return
      * the number of buffered MPDUs but the number of buffered MSDUs.
      */
     uint32_t GetNBufferedPackets(const Mac48Address& recipient, uint8_t tid) const;
     /**
-     * \param recipient Address of peer station involved in block ack mechanism.
-     * \param tid Traffic ID of transmitted packet.
-     * \param startingSeq starting sequence field
-     *
-     * Puts corresponding originator agreement in established state and updates number of packets
-     * and starting sequence field. Invoked typically after a block ack refresh.
-     */
-    void NotifyOriginatorAgreementEstablished(const Mac48Address& recipient,
-                                              uint8_t tid,
-                                              uint16_t startingSeq);
-    /**
-     * \param recipient Address of peer station involved in block ack mechanism.
-     * \param tid Traffic ID of transmitted packet.
+     * @param recipient Address of peer station involved in block ack mechanism.
+     * @param tid Traffic ID of transmitted packet.
+     * @param gcrGroupAddr the GCR Group Address (only if it a GCR Block Ack agreement)
      *
      * Marks an originator agreement as rejected. This happens if <i>recipient</i> station reject
      * block ack setup by an ADDBA Response frame with a failure status code. For now we assume
      * that every QoS station accepts a block ack setup.
      */
-    void NotifyOriginatorAgreementRejected(const Mac48Address& recipient, uint8_t tid);
-    /**
-     * \param recipient Address of peer station involved in block ack mechanism.
-     * \param tid Traffic ID of transmitted packet.
+    void NotifyOriginatorAgreementRejected(const Mac48Address& recipient,
+                                           uint8_t tid,
+                                           std::optional<Mac48Address> gcrGroupAddr);
+    /**
+     * @param recipient Address of peer station involved in block ack mechanism.
+     * @param tid Traffic ID of transmitted packet.
+     * @param gcrGroupAddr the GCR Group Address (only if it a GCR Block Ack agreement)
      *
      * Marks an originator agreement after not receiving response to ADDBA request. During this
      * state any packets in queue will be transmitted using normal MPDU. This also unblocks
      * recipient address.
      */
-    void NotifyOriginatorAgreementNoReply(const Mac48Address& recipient, uint8_t tid);
-    /**
-     * \param recipient Address of peer station involved in block ack mechanism.
-     * \param tid Traffic ID of transmitted packet.
+    void NotifyOriginatorAgreementNoReply(const Mac48Address& recipient,
+                                          uint8_t tid,
+                                          std::optional<Mac48Address> gcrGroupAddr);
+    /**
+     * @param recipient Address of peer station involved in block ack mechanism.
+     * @param tid Traffic ID of transmitted packet.
+     * @param gcrGroupAddr the GCR Group Address (only if it a GCR Block Ack agreement)
      *
      * Set Originator BA agreement to a transitory state to reset it after not receiving response
      * to ADDBA request.
      */
-    void NotifyOriginatorAgreementReset(const Mac48Address& recipient, uint8_t tid);
+    void NotifyOriginatorAgreementReset(const Mac48Address& recipient,
+                                        uint8_t tid,
+                                        std::optional<Mac48Address> gcrGroupAddr);
     /**
-     * \param nPackets Minimum number of packets for use of block ack.
+     * @param nPackets Minimum number of packets for use of block ack.
      *
      * Upon receipt of a BlockAck frame, if total number of packets (packets in WifiMacQueue
      * and buffered packets) is greater of <i>nPackets</i>, they are transmitted using block ack
@@ -280,23 +327,24 @@
     void SetBlockAckThreshold(uint8_t nPackets);
 
     /**
-     * \param queue The WifiMacQueue object.
+     * @param queue The WifiMacQueue object.
      */
     void SetQueue(const Ptr<WifiMacQueue> queue);
 
     /**
      * Set block ack inactivity callback
-     * \param callback the block ack inactivity callback function
+     * @param callback the block ack inactivity callback function
      */
-    void SetBlockAckInactivityCallback(Callback<void, Mac48Address, uint8_t, bool> callback);
+    void SetBlockAckInactivityCallback(
+        Callback<void, Mac48Address, uint8_t, bool, std::optional<Mac48Address>> callback);
     /**
      * Set block destination callback
-     * \param callback the block destination callback
+     * @param callback the block destination callback
      */
     void SetBlockDestinationCallback(Callback<void, Mac48Address, uint8_t> callback);
     /**
      * Set unblock destination callback
-     * \param callback the unblock destination callback
+     * @param callback the unblock destination callback
      */
     void SetUnblockDestinationCallback(Callback<void, Mac48Address, uint8_t> callback);
 
@@ -305,28 +353,44 @@
      * given recipient for the given TID and there is at least an outstanding MPDU
      * for such agreement whose lifetime is not expired.
      *
-     * \param tid Traffic ID
-     * \param recipient MAC address of the recipient
+     * @param tid Traffic ID
+     * @param recipient MAC address of the recipient
      *
-     * \returns true if BAR retransmission needed
+     * @returns true if BAR retransmission needed
      */
     bool NeedBarRetransmission(uint8_t tid, const Mac48Address& recipient);
+
+    /**
+     * This function returns true if a GCR block ack agreement is established with the given
+     * recipient, for the given TID, for the given GCR group address and there is at least an
+     * outstanding MPDU for such agreement whose lifetime is not expired.
+     *
+     * @param gcrGroupAddress the GCR group address
+     * @param tid Traffic ID
+     * @param recipient MAC address of the recipient
+     *
+     * @returns true if BAR retransmission needed
+     */
+    bool NeedGcrBarRetransmission(const Mac48Address& gcrGroupAddress,
+                                  const Mac48Address& recipient,
+                                  uint8_t tid) const;
+
     /**
      * This function returns the buffer size negotiated with the recipient.
      *
-     * \param tid Traffic ID
-     * \param recipient MAC address of the recipient
+     * @param tid Traffic ID
+     * @param recipient MAC address of the recipient
      *
-     * \returns the buffer size negotiated with the recipient
+     * @returns the buffer size negotiated with the recipient
      */
     uint16_t GetRecipientBufferSize(const Mac48Address& recipient, uint8_t tid) const;
     /**
      * This function returns the starting sequence number of the transmit window.
      *
-     * \param tid Traffic ID
-     * \param recipient MAC address of the recipient
+     * @param tid Traffic ID
+     * @param recipient MAC address of the recipient
      *
-     * \returns the starting sequence number of the transmit window (WinStartO)
+     * @returns the starting sequence number of the transmit window (WinStartO)
      */
     uint16_t GetOriginatorStartingSequence(const Mac48Address& recipient, uint8_t tid) const;
 
@@ -344,27 +408,27 @@
     typedef Callback<void, Ptr<const WifiMpdu>> DroppedOldMpdu;
 
     /**
-     * \param callback the callback to invoke when a
+     * @param callback the callback to invoke when a
      * packet transmission was completed successfully.
      */
     void SetTxOkCallback(TxOk callback);
     /**
-     * \param callback the callback to invoke when a
+     * @param callback the callback to invoke when a
      * packet transmission was completed unsuccessfuly.
      */
     void SetTxFailedCallback(TxFailed callback);
     /**
-     * \param callback the callback to invoke when an old MPDU is dropped
+     * @param callback the callback to invoke when an old MPDU is dropped
      */
     void SetDroppedOldMpduCallback(DroppedOldMpdu callback);
 
     /**
      * TracedCallback signature for state changes.
      *
-     * \param [in] now Time when the \pname{state} changed.
-     * \param [in] recipient MAC address of the recipient.
-     * \param [in] tid the TID.
-     * \param [in] state The state.
+     * @param [in] now Time when the \pname{state} changed.
+     * @param [in] recipient MAC address of the recipient.
+     * @param [in] tid the TID.
+     * @param [in] state The state.
      */
     typedef void (*AgreementStateTracedCallback)(Time now,
                                                  const Mac48Address& recipient,
@@ -372,7 +436,7 @@
                                                  OriginatorBlockAckAgreement::State state);
 
     /**
-     * \param mpdu the discarded frame
+     * @param mpdu the discarded frame
      *
      * Notify the block ack manager that an MPDU has been discarded, e.g., because
      * the MSDU lifetime expired. If there is an established block ack agreement,
@@ -384,18 +448,23 @@
     void NotifyDiscardedMpdu(Ptr<const WifiMpdu> mpdu);
 
     /**
-     * \param recipient the recipient
-     * \param tid the TID
-     * \return the BlockAckRequest header for the established BA agreement
+     * @param recipient the recipient
+     * @param tid the TID
+     * @param gcrGroupAddr the GCR Group Address (only if the Block Ack Request is being used for
+     * the GCR service)
+     * @return the BlockAckRequest header for the established BA agreement
      *
      * Get the BlockAckRequest header for the established BA agreement
      * (<i>recipient</i>,<i>tid</i>).
      */
-    CtrlBAckRequestHeader GetBlockAckReqHeader(const Mac48Address& recipient, uint8_t tid) const;
+    CtrlBAckRequestHeader GetBlockAckReqHeader(
+        const Mac48Address& recipient,
+        uint8_t tid,
+        std::optional<Mac48Address> gcrGroupAddr = std::nullopt) const;
 
     /**
-     * \param reqHdr the BlockAckRequest header
-     * \param hdr the 802.11 MAC header
+     * @param reqHdr the BlockAckRequest header
+     * @param hdr the 802.11 MAC header
      *
      * Enqueue the given BlockAckRequest into the queue storing the next BAR
      * frames to transmit. If a BAR for the same recipient and TID is already present
@@ -408,7 +477,7 @@
     using AgreementKey = std::pair<Mac48Address, uint8_t>;
 
     /**
-     * \return the list of BA agreements (identified by the recipient and TID pair) for which a BAR
+     * @return the list of BA agreements (identified by the recipient and TID pair) for which a BAR
      * shall only be sent if there are queued data frames belonging to those agreements
      */
     const std::list<AgreementKey>& GetSendBarIfDataQueuedList() const;
@@ -416,47 +485,162 @@
      * Add the given (recipient, TID) pair to the list of BA agreements for which a BAR
      * shall only be sent if there are queued data frames belonging to those agreements
      *
-     * \param recipient the recipient
-     * \param tid the TID
+     * @param recipient the recipient
+     * @param tid the TID
      */
     void AddToSendBarIfDataQueuedList(const Mac48Address& recipient, uint8_t tid);
     /**
      * Remove the given (recipient, TID) pair from the list of BA agreements for which a BAR
      * shall only be sent if there are queued data frames belonging to those agreements
      *
-     * \param recipient the recipient
-     * \param tid the TID
+     * @param recipient the recipient
+     * @param tid the TID
      */
     void RemoveFromSendBarIfDataQueuedList(const Mac48Address& recipient, uint8_t tid);
 
+    /**
+     * This function returns the minimum buffer size from ADDBA Response frames sent by all members
+     * of a group address <i>groupAddress</i> for a given TID <i>tid</i>.
+     *
+     * @param groupAddress the group address
+     * @param tid the traffic ID.
+     *
+     * @return the GCR buffer size.
+     */
+    uint16_t GetGcrBufferSize(const Mac48Address& groupAddress, uint8_t tid) const;
+
+    /**
+     * This function returns the starting sequence number of the transmit window for a given GCR
+     * Block Ack agreement established with all members of a group address <i>groupAddress</i> for a
+     * given TID <i>tid</i>.
+     *
+     * @param groupAddress the group address
+     * @param tid Traffic ID
+     *
+     * @returns the starting sequence number of the transmit window (WinStartO)
+     */
+    uint16_t GetGcrStartingSequence(const Mac48Address& groupAddress, uint8_t tid) const;
+
+    /**
+     * Check if a GCR Block Ack agreement has been successfully established with all members of
+     * the group.
+     *
+     * @param gcrGroupAddress the GCR Group Address.
+     * @param tid the traffic ID.
+     * @param members members of the group.
+     * @return true if a GCR Block Ack agreement has been successfully established with all members
+     * of the group, false otherwise.
+     */
+    bool IsGcrAgreementEstablished(const Mac48Address& gcrGroupAddress,
+                                   uint8_t tid,
+                                   const GcrManager::GcrMembers& members) const;
+
+    /**
+     * Notify the block ack manager about the last groupcast MPDU transmitted with the GCR-UR
+     * service. If there is an established block ack agreement, it makes the transmit window
+     * advance beyond the transmitted MPDU.
+     *
+     * @param mpdu the groupcast MPDU
+     * @param recipients the list of recipients for the groupcast MPDU
+     */
+    void NotifyLastGcrUrTx(Ptr<const WifiMpdu> mpdu, const GcrManager::GcrMembers& recipients);
+
   protected:
     void DoDispose() override;
 
   private:
     /**
-     * Inactivity timeout function
-     * \param recipient the recipient MAC address
-     * \param tid Traffic ID
+     * Inactivity timeout function for a Block Ack agreement
+     * @param recipient the recipient MAC address
+     * @param tid Traffic ID
+     * @param gcrGroupAddr the GCR Group Address (only if it a GCR Block Ack agreement)
      */
-    void InactivityTimeout(const Mac48Address& recipient, uint8_t tid);
+    void InactivityTimeout(const Mac48Address& recipient,
+                           uint8_t tid,
+                           std::optional<Mac48Address> gcrGroupAddr);
+
+    /**
+     * @param mpdu MPDU to store.
+     * @param recipient intended recipient for the stored MPDU.
+     * @param gcrGroupAddr the GCR Group Address (only if MPDU is transmitted using the GCR service)
+     *
+     * Stores <i>mpdu</i> for a possible future retransmission.
+     */
+    void DoStorePacket(Ptr<WifiMpdu> mpdu,
+                       const Mac48Address& recipient,
+                       std::optional<Mac48Address> gcrGroupAddr = std::nullopt);
 
     /**
      * typedef for a list of WifiMpdu.
      */
-    typedef std::list<Ptr<WifiMpdu>> PacketQueue;
+    using PacketQueue = std::list<Ptr<WifiMpdu>>;
     /**
      * typedef for an iterator for PacketQueue.
      */
-    typedef std::list<Ptr<WifiMpdu>>::iterator PacketQueueI;
+    using PacketQueueI = std::list<Ptr<WifiMpdu>>::iterator;
 
     /// AgreementKey-indexed map of originator block ack agreements
     using OriginatorAgreements =
-        std::map<AgreementKey, std::pair<OriginatorBlockAckAgreement, PacketQueue>>;
-    /// typedef for an iterator for Agreements
+        std::multimap<AgreementKey, std::pair<OriginatorBlockAckAgreement, PacketQueue>>;
+    /// An iterator for originator block ack agreements
     using OriginatorAgreementsI = OriginatorAgreements::iterator;
+    /// A const iterator for originator block ack agreements
+    using OriginatorAgreementsCI = OriginatorAgreements::const_iterator;
 
     /// AgreementKey-indexed map of recipient block ack agreements
-    using RecipientAgreements = std::map<AgreementKey, RecipientBlockAckAgreement>;
+    using RecipientAgreements = std::multimap<AgreementKey, RecipientBlockAckAgreement>;
+    /// An iterator for recipient block ack agreements
+    using RecipientAgreementsI = RecipientAgreements::iterator;
+    /// A const iterator for recipient block ack agreements
+    using RecipientAgreementsCI = RecipientAgreements::const_iterator;
+
+    /**
+     * @param recipient MAC address of the recipient
+     * @param tid Traffic ID
+     * @param gcrGroupAddr the GCR Group Address (only if it is a GCR Block Ack agreement)
+     *
+     * @return an iterator to the block ack agreement
+     */
+    OriginatorAgreementsI GetOriginatorBaAgreement(
+        const Mac48Address& recipient,
+        uint8_t tid,
+        std::optional<Mac48Address> gcrGroupAddr = std::nullopt);
+
+    /**
+     * @param recipient MAC address of the recipient
+     * @param tid Traffic ID
+     * @param gcrGroupAddr the GCR Group Address (only if it is a GCR Block Ack agreement)
+     *
+     * @return a const iterator to the block ack agreement
+     */
+    OriginatorAgreementsCI GetOriginatorBaAgreement(
+        const Mac48Address& recipient,
+        uint8_t tid,
+        std::optional<Mac48Address> gcrGroupAddr = std::nullopt) const;
+
+    /**
+     * @param originator MAC address of the originator
+     * @param tid Traffic ID
+     * @param gcrGroupAddr the GCR Group Address (only if it is a GCR Block Ack agreement)
+     *
+     * @return an iterator to the block ack agreement
+     */
+    RecipientAgreementsI GetRecipientBaAgreement(
+        const Mac48Address& originator,
+        uint8_t tid,
+        std::optional<Mac48Address> gcrGroupAddr = std::nullopt);
+
+    /**
+     * @param originator MAC address of the originator
+     * @param tid Traffic ID
+     * @param gcrGroupAddr the GCR Group Address (only if it is a GCR Block Ack agreement)
+     *
+     * @return a const iterator to the block ack agreement
+     */
+    RecipientAgreementsCI GetRecipientBaAgreement(
+        const Mac48Address& originator,
+        uint8_t tid,
+        std::optional<Mac48Address> gcrGroupAddr = std::nullopt) const;
 
     /**
      * Handle the given in flight MPDU based on its given status. If the status is
@@ -466,12 +650,12 @@
      * queues (independently of the status) if the MPDU is not stored in the EDCA
      * queue, is an old packet or its lifetime expired.
      *
-     * \param linkId the ID of the link on which the MPDU has been transmitted
-     * \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
+     * @param linkId the ID of the link on which the MPDU has been transmitted
+     * @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
      */
     PacketQueueI HandleInFlightMpdu(uint8_t linkId,
                                     PacketQueueI mpduIt,
@@ -480,6 +664,17 @@
                                     const Time& now);
 
     /**
+     * Handle discarded MPDU by making the transmit window advance beyond the discarded frame.
+     * This also involves (i) the removal of frames that consequently become old from the
+     * retransmit queue and from the queue of the block ack agreement, and (ii) the
+     * scheduling of a BlockAckRequest.
+     *
+     * @param mpdu the discarded MPDU
+     * @param iter an iterator to the corresponding agreement
+     */
+    void HandleDiscardedMpdu(Ptr<const WifiMpdu> mpdu, OriginatorAgreementsI iter);
+
+    /**
      * This data structure contains, for each originator block ack agreement (recipient, TID),
      * a set of packets for which an ack by block ack is requested.
      * Every packet or fragment indicated as correctly received in BlockAck frame is
@@ -491,9 +686,14 @@
     std::list<AgreementKey> m_sendBarIfDataQueued; ///< list of BA agreements for which a BAR shall
                                                    ///< only be sent if data is queued
 
+    /// List of received GCR BlockAck frames indexed by originator
+    using GcrBlockAcks = std::map<Mac48Address, CtrlBAckResponseHeader>;
+    std::map<Mac48Address /* GCR group address */, GcrBlockAcks>
+        m_gcrBlockAcks; ///< received GCR Block ACKs
+
     uint8_t m_blockAckThreshold; ///< block ack threshold
     Ptr<WifiMacQueue> m_queue;   ///< queue
-    Callback<void, Mac48Address, uint8_t, bool>
+    Callback<void, Mac48Address, uint8_t, bool, std::optional<Mac48Address>>
         m_blockAckInactivityTimeout;                      ///< BlockAck inactivity timeout callback
     Callback<void, Mac48Address, uint8_t> m_blockPackets; ///< block packets callback
     Callback<void, Mac48Address, uint8_t> m_unblockPackets; ///< unblock packets callback
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/block-ack-type.cc ns-3.44/src/wifi/model/block-ack-type.cc
--- ns-3.43/src/wifi/model/block-ack-type.cc	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/block-ack-type.cc	2025-03-09 16:55:49.783372600 -0700
@@ -23,6 +23,7 @@
         break;
     case COMPRESSED:
     case EXTENDED_COMPRESSED:
+    case GCR:
         m_bitmapLen.push_back(8);
         break;
     case MULTI_TID:
@@ -53,6 +54,7 @@
     case BASIC:
     case COMPRESSED:
     case EXTENDED_COMPRESSED:
+    case GCR:
         m_nSeqControls = 1;
         break;
     case MULTI_TID:
@@ -91,6 +93,9 @@
     case BlockAckType::MULTI_TID:
         os << "multi-tid-block-ack[" << type.m_bitmapLen.size() << "]";
         break;
+    case BlockAckType::GCR:
+        os << "gcr-block-ack";
+        break;
     case BlockAckType::MULTI_STA:
         os << "multi-sta-block-ack[" << type.m_bitmapLen.size() << "]";
         break;
@@ -117,6 +122,9 @@
     case BlockAckReqType::MULTI_TID:
         os << "multi-tid-block-ack-req[" << type.m_nSeqControls << "]";
         break;
+    case BlockAckReqType::GCR:
+        os << "gcr-block-ack-req";
+        break;
     default:
         NS_FATAL_ERROR("Unknown block ack request type");
     }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/block-ack-type.h ns-3.44/src/wifi/model/block-ack-type.h
--- ns-3.43/src/wifi/model/block-ack-type.h	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/block-ack-type.h	2025-03-09 16:55:49.783372600 -0700
@@ -17,21 +17,22 @@
 {
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * The different BlockAck variants.
  */
 struct BlockAckType
 {
     /**
-     * \enum Variant
-     * \brief The BlockAck variants
+     * @enum Variant
+     * @brief The BlockAck variants
      */
-    enum Variant
+    enum Variant : uint8_t
     {
         BASIC,
         COMPRESSED,
         EXTENDED_COMPRESSED,
         MULTI_TID,
+        GCR,
         MULTI_STA
     };
 
@@ -45,35 +46,36 @@
     /**
      * Constructor for BlockAckType with given variant.
      *
-     * \param v the Block Ack variant
+     * @param v the Block Ack variant
      */
     BlockAckType(Variant v);
     /**
      * Constructor for BlockAckType with given variant
      * and bitmap length.
      *
-     * \param v the Block Ack variant
-     * \param l the length (bytes) of included bitmaps
+     * @param v the Block Ack variant
+     * @param l the length (bytes) of included bitmaps
      */
     BlockAckType(Variant v, std::vector<uint8_t> l);
 };
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * The different BlockAckRequest variants.
  */
 struct BlockAckReqType
 {
     /**
-     * \enum Variant
-     * \brief The BlockAckReq variants
+     * @enum Variant
+     * @brief The BlockAckReq variants
      */
-    enum Variant
+    enum Variant : uint8_t
     {
         BASIC,
         COMPRESSED,
         EXTENDED_COMPRESSED,
-        MULTI_TID
+        MULTI_TID,
+        GCR
     };
 
     Variant m_variant;      //!< Block Ack Request variant
@@ -87,15 +89,15 @@
     /**
      * Constructor for BlockAckReqType with given variant.
      *
-     * \param v the Block Ack Request variant
+     * @param v the Block Ack Request variant
      */
     BlockAckReqType(Variant v);
     /**
      * Constructor for BlockAckReqType with given variant
      * and number of SSC fields.
      *
-     * \param v the Block Ack Request variant
-     * \param nSeqControls the number of included Starting Sequence Control fields
+     * @param v the Block Ack Request variant
+     * @param nSeqControls the number of included Starting Sequence Control fields
      */
     BlockAckReqType(Variant v, uint8_t nSeqControls);
 };
@@ -103,18 +105,18 @@
 /**
  * Serialize BlockAckType to ostream in a human-readable form.
  *
- * \param os std::ostream
- * \param type block ack type
- * \return std::ostream
+ * @param os std::ostream
+ * @param type block ack type
+ * @return std::ostream
  */
 std::ostream& operator<<(std::ostream& os, const BlockAckType& type);
 
 /**
  * Serialize BlockAckReqType to ostream in a human-readable form.
  *
- * \param os std::ostream
- * \param type block ack request type
- * \return std::ostream
+ * @param os std::ostream
+ * @param type block ack request type
+ * @return std::ostream
  */
 std::ostream& operator<<(std::ostream& os, const BlockAckReqType& type);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/block-ack-window.h ns-3.44/src/wifi/model/block-ack-window.h
--- ns-3.43/src/wifi/model/block-ack-window.h	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/block-ack-window.h	2025-03-09 16:55:49.783372600 -0700
@@ -16,8 +16,8 @@
 {
 
 /**
- * \ingroup wifi
- * \brief Block ack window
+ * @ingroup wifi
+ * @brief Block ack window
  *
  * This class provides the basic functionalities of a window sliding over a
  * bitmap: accessing any element in the bitmap and moving the window forward
@@ -53,33 +53,33 @@
     /**
      * Initialize the window with the given starting sequence number and size
      *
-     * \param winStart the window start
-     * \param winSize the window size
+     * @param winStart the window start
+     * @param winSize the window size
      */
     void Init(uint16_t winStart, uint16_t winSize);
     /**
      * Reset the window by clearing all the elements and setting winStart to the
      * given value.
      *
-     * \param winStart the window start
+     * @param winStart the window start
      */
     void Reset(uint16_t winStart);
     /**
      * Get the current winStart value.
      *
-     * \return the current winStart value
+     * @return the current winStart value
      */
     uint16_t GetWinStart() const;
     /**
      * Get the current winEnd value.
      *
-     * \return the current winEnd value
+     * @return the current winEnd value
      */
     uint16_t GetWinEnd() const;
     /**
      * Get the window size.
      *
-     * \return the window size
+     * @return the window size
      */
     std::size_t GetWinSize() const;
     /**
@@ -87,8 +87,8 @@
      * the current winStart. Note that the given distance must be less than the
      * window size.
      *
-     * \param distance the given distance
-     * \return a reference to the element in the window having the given distance
+     * @param distance the given distance
+     * @return a reference to the element in the window having the given distance
      *         from the current winStart
      */
     std::vector<bool>::reference At(std::size_t distance);
@@ -97,15 +97,15 @@
      * the current winStart. Note that the given distance must be less than the
      * window size.
      *
-     * \param distance the given distance
-     * \return a const reference to the element in the window having the given distance
+     * @param distance the given distance
+     * @return a const reference to the element in the window having the given distance
      *         from the current winStart
      */
     std::vector<bool>::const_reference At(std::size_t distance) const;
     /**
      * Advance the current winStart by the given number of positions.
      *
-     * \param count the number of positions the current winStart must be advanced by
+     * @param count the number of positions the current winStart must be advanced by
      */
     void Advance(std::size_t count);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/capability-information.cc ns-3.44/src/wifi/model/capability-information.cc
--- ns-3.43/src/wifi/model/capability-information.cc	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/capability-information.cc	2025-03-09 16:55:49.783372600 -0700
@@ -54,6 +54,15 @@
     Set(2);
 }
 
+void
+CapabilityInformation::SetCriticalUpdate(bool flag)
+{
+    if (flag)
+    {
+        Set(6);
+    }
+}
+
 bool
 CapabilityInformation::IsEss() const
 {
@@ -84,6 +93,12 @@
     return Is(2);
 }
 
+bool
+CapabilityInformation::IsCriticalUpdate() const
+{
+    return Is(6);
+}
+
 void
 CapabilityInformation::Set(uint8_t n)
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/capability-information.h ns-3.44/src/wifi/model/capability-information.h
--- ns-3.43/src/wifi/model/capability-information.h	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/capability-information.h	2025-03-09 16:55:49.783372600 -0700
@@ -15,7 +15,7 @@
 {
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * Capability information
  */
@@ -38,7 +38,7 @@
      * Set the short preamble bit
      * in the capability information field.
      *
-     * \param shortPreamble the short preamble bit
+     * @param shortPreamble the short preamble bit
      *
      */
     void SetShortPreamble(bool shortPreamble);
@@ -46,7 +46,7 @@
      * Set the short slot time bit
      * in the capability information field.
      *
-     * \param shortSlotTime the short preamble bit
+     * @param shortSlotTime the short preamble bit
      *
      */
     void SetShortSlotTime(bool shortSlotTime);
@@ -57,10 +57,16 @@
     void SetCfPollable();
 
     /**
+     * Set Critical Update flag (see IEEE 802.11be D5.0 9.4.1.4)
+     * @param flag critical update bit
+     */
+    void SetCriticalUpdate(bool flag);
+
+    /**
      * Check if the Extended Service Set (ESS) bit
      * in the capability information field is set to 1.
      *
-     * \return ESS bit in the capability information
+     * @return ESS bit in the capability information
      *         field is set to 1
      */
     bool IsEss() const;
@@ -68,7 +74,7 @@
      * Check if the Independent BSS (IBSS) bit
      * in the capability information field is set to 1.
      *
-     * \return IBSS bit in the capability information
+     * @return IBSS bit in the capability information
      *         field is set to 1
      */
     bool IsIbss() const;
@@ -76,7 +82,7 @@
      * Check if the short preamble bit
      * in the capability information field is set to 1.
      *
-     * \return short preamble bit in the capability information
+     * @return short preamble bit in the capability information
      *         field is set to 1
      */
     bool IsShortPreamble() const;
@@ -84,7 +90,7 @@
      * Check if the short slot time
      * in the capability information field is set to 1.
      *
-     * \return short slot time bit in the capability information
+     * @return short slot time bit in the capability information
      *         field is set to 1
      */
     bool IsShortSlotTime() const;
@@ -92,31 +98,38 @@
      * Check if the CF-Pollable bit
      * in the capability information field is set to 1.
      *
-     * \return CF-Pollable bit in the capability information
+     * @return CF-Pollable bit in the capability information
      *         field is set to 1
      */
     bool IsCfPollable() const;
 
     /**
+     * Check if Critical Update bit is set to 1
+     *
+     * @return true if set to 1, false otherwise
+     */
+    bool IsCriticalUpdate() const;
+
+    /**
      * Return the serialized size of capability
      * information.
      *
-     * \return the serialized size
+     * @return the serialized size
      */
     uint32_t GetSerializedSize() const;
     /**
      * Serialize capability information to the given buffer.
      *
-     * \param start an iterator to a buffer
-     * \return an iterator to a buffer after capability information
+     * @param start an iterator to a buffer
+     * @return an iterator to a buffer after capability information
      *         was serialized
      */
     Buffer::Iterator Serialize(Buffer::Iterator start) const;
     /**
      * Deserialize capability information from the given buffer.
      *
-     * \param start an iterator to a buffer
-     * \return an iterator to a buffer after capability information
+     * @param start an iterator to a buffer
+     * @return an iterator to a buffer after capability information
      *         was deserialized
      */
     Buffer::Iterator Deserialize(Buffer::Iterator start);
@@ -125,22 +138,22 @@
     /**
      * Check if bit n is set to 1.
      *
-     * \param n the bit position
+     * @param n the bit position
      *
-     * \return true if bit n is set to 1,
+     * @return true if bit n is set to 1,
      *         false otherwise
      */
     bool Is(uint8_t n) const;
     /**
      * Set bit n to 1.
      *
-     * \param n the bit position
+     * @param n the bit position
      */
     void Set(uint8_t n);
     /**
      * Set bit n to 0.
      *
-     * \param n the bit position
+     * @param n the bit position
      */
     void Clear(uint8_t n);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/channel-access-manager.cc ns-3.44/src/wifi/model/channel-access-manager.cc
--- ns-3.43/src/wifi/model/channel-access-manager.cc	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/channel-access-manager.cc	2025-03-09 16:55:49.783372600 -0700
@@ -42,7 +42,7 @@
     /**
      * Create a PhyListener for the given ChannelAccessManager.
      *
-     * \param cam the ChannelAccessManager
+     * @param cam the ChannelAccessManager
      */
     PhyListener(ns3::ChannelAccessManager* cam)
         : m_cam(cam),
@@ -57,7 +57,7 @@
     /**
      * Set this listener to be active or not.
      *
-     * \param active whether this listener is active or not
+     * @param active whether this listener is active or not
      */
     void SetActive(bool active)
     {
@@ -65,7 +65,7 @@
     }
 
     /**
-     * \return whether this listener is active or not
+     * @return whether this listener is active or not
      */
     bool IsActive() const
     {
@@ -185,7 +185,20 @@
                           "and subsequently the medium becomes busy.",
                           BooleanValue(false),
                           MakeBooleanAccessor(&ChannelAccessManager::m_proactiveBackoff),
-                          MakeBooleanChecker());
+                          MakeBooleanChecker())
+            .AddAttribute("NSlotsLeft",
+                          "Fire the NSlotsLeftAlert trace source when the backoff counter with "
+                          "the minimum value among all ACs reaches this value or it is started "
+                          "with a value less than this attribute. If this value is zero, the "
+                          "trace source is never fired.",
+                          UintegerValue(0),
+                          MakeUintegerAccessor(&ChannelAccessManager::m_nSlotsLeft),
+                          MakeUintegerChecker<uint8_t>())
+            .AddTraceSource("NSlotsLeftAlert",
+                            "The backoff counter of the AC with the given index reached the "
+                            "threshold set through the NSlotsLeft attribute.",
+                            MakeTraceSourceAccessor(&ChannelAccessManager::m_nSlotsLeftCallback),
+                            "ns3::ChannelAccessManager::NSlotsLeftCallback");
     return tid;
 }
 
@@ -264,6 +277,11 @@
     {
         phyListener = std::make_shared<PhyListener>(this);
         m_phyListeners.emplace(phy, phyListener);
+        if (!m_phy)
+        {
+            // no PHY operating on this link and no previous PHY listener to reactivate
+            m_lastSwitchingEnd = Simulator::Now();
+        }
     }
     if (m_phy)
     {
@@ -272,12 +290,6 @@
     m_phy = phy; // this is the new active PHY
     ResizeLastBusyStructs();
     phy->RegisterListener(phyListener);
-    if (phy->IsStateSwitching())
-    {
-        auto duration = phy->GetDelayUntilIdle();
-        NS_LOG_DEBUG("switching start for " << duration);
-        m_lastSwitchingEnd = Simulator::Now() + duration;
-    }
 }
 
 void
@@ -370,9 +382,10 @@
     m_lastBusyEnd.emplace(WIFI_CHANLIST_PRIMARY, now);
     m_lastIdle.emplace(WIFI_CHANLIST_PRIMARY, Timespan{now, now});
 
-    const auto width = m_phy ? m_phy->GetChannelWidth() : 0;
-    std::size_t size =
-        (width > 20 && m_phy->GetStandard() >= WIFI_STANDARD_80211ax) ? width / 20 : 0;
+    const auto width = m_phy ? m_phy->GetChannelWidth() : MHz_u{0};
+    std::size_t size = (width > MHz_u{20} && m_phy->GetStandard() >= WIFI_STANDARD_80211ax)
+                           ? Count20MHzSubchannels(width)
+                           : 0;
     m_lastPer20MHzBusyEnd.resize(size, now);
 
     if (!m_phy || !m_phy->GetOperatingChannel().IsOfdm())
@@ -380,7 +393,7 @@
         return;
     }
 
-    if (width >= 40)
+    if (width >= MHz_u{40})
     {
         m_lastBusyEnd.emplace(WIFI_CHANLIST_SECONDARY, now);
         m_lastIdle.emplace(WIFI_CHANLIST_SECONDARY, Timespan{now, now});
@@ -391,7 +404,7 @@
         m_lastIdle.erase(WIFI_CHANLIST_SECONDARY);
     }
 
-    if (width >= 80)
+    if (width >= MHz_u{80})
     {
         m_lastBusyEnd.emplace(WIFI_CHANLIST_SECONDARY40, now);
         m_lastIdle.emplace(WIFI_CHANLIST_SECONDARY40, Timespan{now, now});
@@ -402,7 +415,7 @@
         m_lastIdle.erase(WIFI_CHANLIST_SECONDARY40);
     }
 
-    if (width >= 160)
+    if (width >= MHz_u{160})
     {
         m_lastBusyEnd.emplace(WIFI_CHANLIST_SECONDARY80, now);
         m_lastIdle.emplace(WIFI_CHANLIST_SECONDARY80, Timespan{now, now});
@@ -607,9 +620,10 @@
             auto interval = (m_phy->GetPhyBand() == WIFI_PHY_BAND_2_4GHZ)
                                 ? GetSifs() + 2 * GetSlot()
                                 : m_phy->GetPifs();
-            auto width = (m_phy->GetOperatingChannel().IsOfdm() && m_phy->GetChannelWidth() > 20)
-                             ? GetLargestIdlePrimaryChannel(interval, now)
-                             : m_phy->GetChannelWidth();
+            auto width =
+                (m_phy->GetOperatingChannel().IsOfdm() && m_phy->GetChannelWidth() > MHz_u{20})
+                    ? GetLargestIdlePrimaryChannel(interval, now)
+                    : m_phy->GetChannelWidth();
             if (m_feManager->StartTransmission(txop, width))
             {
                 for (auto& collidingTxop : internalCollisionTxops)
@@ -710,6 +724,12 @@
     return backoffEnd;
 }
 
+Time
+ChannelAccessManager::GetNavEnd() const
+{
+    return m_lastNavEnd;
+}
+
 void
 ChannelAccessManager::UpdateBackoff()
 {
@@ -754,26 +774,43 @@
      * Is there a Txop which needs to access the medium, and,
      * if there is one, how many slots for AIFS+backoff does it require ?
      */
-    bool accessTimeoutNeeded = false;
+    Ptr<Txop> nextTxop;
     auto expectedBackoffEnd = Simulator::GetMaximumSimulationTime();
     const auto accessGrantStart = GetAccessGrantStart();
+    const auto now = Simulator::Now();
     for (auto txop : m_txops)
     {
         if (txop->GetAccessStatus(m_linkId) == Txop::REQUESTED)
         {
-            Time tmp = GetBackoffEndFor(txop, accessGrantStart);
-            if (tmp > Simulator::Now())
+            if (auto backoffEnd = GetBackoffEndFor(txop, accessGrantStart);
+                backoffEnd > now && backoffEnd < expectedBackoffEnd)
             {
-                accessTimeoutNeeded = true;
-                expectedBackoffEnd = std::min(expectedBackoffEnd, tmp);
+                expectedBackoffEnd = backoffEnd;
+                nextTxop = txop;
             }
         }
     }
-    NS_LOG_DEBUG("Access timeout needed: " << accessTimeoutNeeded);
-    if (accessTimeoutNeeded)
+    NS_LOG_DEBUG("Access timeout needed: " << (nextTxop != nullptr));
+    if (nextTxop)
     {
-        NS_LOG_DEBUG("expected backoff end=" << expectedBackoffEnd);
-        Time expectedBackoffDelay = expectedBackoffEnd - Simulator::Now();
+        const auto aci = nextTxop->GetWifiMacQueue()->GetAc();
+        NS_LOG_DEBUG("expected backoff end=" << expectedBackoffEnd << " by " << aci);
+        auto expectedBackoffDelay = expectedBackoffEnd - now;
+
+        if (m_nSlotsLeft > 0)
+        {
+            if (const auto slots = m_nSlotsLeft * GetSlot(); expectedBackoffDelay > slots)
+            {
+                // make the timer expire when the specified number of slots are left
+                expectedBackoffDelay -= slots;
+            }
+            else
+            {
+                // notify that a number of slots less than or equal to the specified value are left
+                m_nSlotsLeftCallback(m_linkId, aci, expectedBackoffDelay);
+            }
+        }
+
         if (m_accessTimeout.IsPending() &&
             Simulator::GetDelayLeft(m_accessTimeout) > expectedBackoffDelay)
         {
@@ -803,7 +840,7 @@
     // also be called before starting a TXOP gained through EDCA.
     UpdateLastIdlePeriod();
 
-    MHz_u width = 0;
+    MHz_u width{0};
 
     // we iterate over the different types of channels in the same order as they
     // are listed in WifiChannelListType
@@ -812,7 +849,7 @@
         if (lastIdle.second.start <= end - interval && lastIdle.second.end >= end)
         {
             // channel idle, update width
-            width = (width == 0) ? 20 : (2 * width);
+            width = (width == MHz_u{0}) ? MHz_u{20} : (2 * width);
         }
         else
         {
@@ -827,7 +864,7 @@
 {
     const auto now = Simulator::Now();
 
-    if (m_phy->GetChannelWidth() < 40)
+    if (m_phy->GetChannelWidth() < MHz_u{40})
     {
         NS_ASSERT_MSG(indices.size() == 1 && *indices.cbegin() == 0,
                       "Index 0 only can be specified if the channel width is less than 40 MHz");
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/channel-access-manager.h ns-3.44/src/wifi/model/channel-access-manager.h
--- ns-3.43/src/wifi/model/channel-access-manager.h	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/channel-access-manager.h	2025-03-09 16:55:49.783372600 -0700
@@ -15,6 +15,7 @@
 #include "ns3/event-id.h"
 #include "ns3/nstime.h"
 #include "ns3/object.h"
+#include "ns3/traced-callback.h"
 
 #include <algorithm>
 #include <map>
@@ -32,10 +33,11 @@
 class PhyListener;
 class Txop;
 class FrameExchangeManager;
+enum AcIndex : uint8_t; // opaque enum declaration
 
 /**
- * \brief Manage a set of ns3::Txop
- * \ingroup wifi
+ * @brief Manage a set of ns3::Txop
+ * @ingroup wifi
  *
  * Handle a set of independent ns3::Txop, each of which represents
  * a single DCF within a MAC stack. Each ns3::Txop has a priority
@@ -59,8 +61,8 @@
     ~ChannelAccessManager() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -69,37 +71,37 @@
      * listener becomes the active listener and the previous active listener attached to another
      * PHY, if any, is deactivated.
      *
-     * \param phy the WifiPhy to listen to
+     * @param phy the WifiPhy to listen to
      */
     void SetupPhyListener(Ptr<WifiPhy> phy);
     /**
      * Remove current registered listener for PHY events on the given PHY.
      *
-     * \param phy the WifiPhy to listen to
+     * @param phy the WifiPhy to listen to
      */
     void RemovePhyListener(Ptr<WifiPhy> phy);
     /**
      * Deactivate current registered listener for PHY events on the given PHY. All notifications
      * but channel switch notifications coming from an inactive listener are ignored.
      *
-     * \param phy the WifiPhy to listen to
+     * @param phy the WifiPhy to listen to
      */
     void DeactivatePhyListener(Ptr<WifiPhy> phy);
     /**
      * Set the ID of the link this Channel Access Manager is associated with.
      *
-     * \param linkId the ID of the link this Channel Access Manager is associated with
+     * @param linkId the ID of the link this Channel Access Manager is associated with
      */
     void SetLinkId(uint8_t linkId);
     /**
      * Set up the Frame Exchange Manager.
      *
-     * \param feManager the Frame Exchange Manager
+     * @param feManager the Frame Exchange Manager
      */
     void SetupFrameExchangeManager(Ptr<FrameExchangeManager> feManager);
 
     /**
-     * \param txop a new Txop.
+     * @param txop a new Txop.
      *
      * The ChannelAccessManager does not take ownership of this pointer so, the callee
      * must make sure that the Txop pointer will stay valid as long
@@ -119,17 +121,17 @@
      * backoff regardless of the busy/idle state of the medium, as per Section 35.3.16.4 of
      * 802.11be D4.0.
      *
-     * \param txop the Txop requesting to generate a backoff
-     * \param hadFramesToTransmit whether packets available for transmission were queued just
+     * @param txop the Txop requesting to generate a backoff
+     * @param hadFramesToTransmit whether packets available for transmission were queued just
      *                            before the occurrence of the event triggering this call
-     * \param checkMediumBusy whether generation of backoff (also) depends on the busy/idle state
+     * @param checkMediumBusy whether generation of backoff (also) depends on the busy/idle state
      *                        of the medium
-     * \return true if backoff needs to be generated, false otherwise
+     * @return true if backoff needs to be generated, false otherwise
      */
     bool NeedBackoffUponAccess(Ptr<Txop> txop, bool hadFramesToTransmit, bool checkMediumBusy);
 
     /**
-     * \param txop a Txop
+     * @param txop a Txop
      *
      * Notify the ChannelAccessManager that a specific Txop needs access to the
      * medium. The ChannelAccessManager is then responsible for starting an access
@@ -142,9 +144,9 @@
      * Access will never be granted to the medium _before_
      * the time returned by this method.
      *
-     * \param ignoreNav flag whether NAV should be ignored
+     * @param ignoreNav flag whether NAV should be ignored
      *
-     * \returns the absolute time at which access could start to be granted
+     * @returns the absolute time at which access could start to be granted
      */
     Time GetAccessGrantStart(bool ignoreNav = false) const;
 
@@ -152,9 +154,9 @@
      * Return the time when the backoff procedure
      * started for the given Txop.
      *
-     * \param txop the Txop
+     * @param txop the Txop
      *
-     * \return the time when the backoff procedure started
+     * @return the time when the backoff procedure started
      */
     Time GetBackoffStartFor(Ptr<Txop> txop) const;
 
@@ -162,15 +164,20 @@
      * Return the time when the backoff procedure
      * ended (or will end) for the given Txop.
      *
-     * \param txop the Txop
+     * @param txop the Txop
      *
-     * \return the time when the backoff procedure ended (or will end)
+     * @return the time when the backoff procedure ended (or will end)
      */
     Time GetBackoffEndFor(Ptr<Txop> txop) const;
 
     /**
-     * \param qosTxop a QosTxop that needs to be disabled
-     * \param duration the amount of time during which the QosTxop is disabled
+     * @return the time until the NAV has been set
+     */
+    Time GetNavEnd() 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.
@@ -184,12 +191,12 @@
      * the right to start a TXOP but it does not transmit any frame (e.g., due to constraints
      * associated with EMLSR operations), provided that the queue is not actually empty.
      *
-     * \param enable whether to enable backoff generation when no TX is performed in a TXOP
+     * @param enable whether to enable backoff generation when no TX is performed in a TXOP
      */
     void SetGenerateBackoffOnNoTx(bool enable);
 
     /**
-     * \return whether the backoff should be invoked when an AC gains the right to start a TXOP
+     * @return whether the backoff should be invoked when an AC gains the right to start a TXOP
      *         but it does not transmit any frame (e.g., due to constraints associated with EMLSR
      *         operations), provided that the queue is not actually empty
      */
@@ -200,22 +207,22 @@
      * given time interval before the given time, if any primary channel has been
      * idle, or zero, otherwise.
      *
-     * \param interval the given time interval
-     * \param end the given end time
-     * \return the width of the largest primary channel that has been idle for the given time
+     * @param interval the given time interval
+     * @param end the given end time
+     * @return the width of the largest primary channel that has been idle for the given time
      * interval before the given time, if any primary channel has been idle, or zero, otherwise
      */
     MHz_u GetLargestIdlePrimaryChannel(Time interval, Time end);
 
     /**
-     * \param indices a set of indices (starting at 0) specifying the 20 MHz channels to test
-     * \return true if per-20 MHz CCA indicates busy for at least one of the
+     * @param indices a set of indices (starting at 0) specifying the 20 MHz channels to test
+     * @return true if per-20 MHz CCA indicates busy for at least one of the
      *         specified 20 MHz channels, false otherwise
      */
     bool GetPer20MHzBusy(const std::set<uint8_t>& indices) const;
 
     /**
-     * \param duration expected duration of reception
+     * @param duration expected duration of reception
      *
      * Notify the Txop that a packet reception started
      * for the expected duration.
@@ -232,7 +239,7 @@
      */
     void NotifyRxEndErrorNow();
     /**
-     * \param duration expected duration of transmission
+     * @param duration expected duration of transmission
      *
      * Notify the Txop that a packet transmission was
      * just started and is expected to last for the specified
@@ -240,9 +247,9 @@
      */
     void NotifyTxStartNow(Time duration);
     /**
-     * \param duration expected duration of CCA busy period
-     * \param channelType the channel type for which the CCA busy state is reported.
-     * \param per20MhzDurations vector that indicates for how long each 20 MHz subchannel
+     * @param duration expected duration of CCA busy period
+     * @param channelType the channel type for which the CCA busy state is reported.
+     * @param per20MhzDurations vector that indicates for how long each 20 MHz subchannel
      *        (corresponding to the index of the element in the vector) is busy and where a zero
      * duration indicates that the subchannel is idle. The vector is non-empty if  the PHY supports
      * 802.11ax or later and if the operational channel width is larger than 20 MHz.
@@ -253,8 +260,8 @@
                                WifiChannelListType channelType,
                                const std::vector<Time>& per20MhzDurations);
     /**
-     * \param phyListener the PHY listener that sent this notification
-     * \param duration expected duration of channel switching period
+     * @param phyListener the PHY listener that sent this notification
+     * @param duration expected duration of channel switching period
      *
      * Notify the Txop that a channel switching period has just started.
      * During switching state, new packets can be enqueued in Txop/QosTxop
@@ -278,13 +285,13 @@
      */
     void NotifyOnNow();
     /**
-     * \param duration the value of the received NAV.
+     * @param duration the value of the received NAV.
      *
      * Called at end of RX
      */
     void NotifyNavResetNow(Time duration);
     /**
-     * \param duration the value of the received NAV.
+     * @param duration the value of the received NAV.
      *
      * Called at end of RX
      */
@@ -292,7 +299,7 @@
     /**
      * Notify that ack timer has started for the given duration.
      *
-     * \param duration the duration of the timer
+     * @param duration the duration of the timer
      */
     void NotifyAckTimeoutStartNow(Time duration);
     /**
@@ -302,7 +309,7 @@
     /**
      * Notify that CTS timer has started for the given duration.
      *
-     * \param duration the duration of the timer
+     * @param duration the duration of the timer
      */
     void NotifyCtsTimeoutStartNow(Time duration);
     /**
@@ -314,7 +321,7 @@
      * Check if the device is busy sending or receiving,
      * or NAV or CCA busy.
      *
-     * \return true if the device is busy,
+     * @return true if the device is busy,
      *         false otherwise
      */
     bool IsBusy() const;
@@ -326,7 +333,7 @@
     /**
      * Reset the backoff for the given DCF/EDCAF.
      *
-     * \param txop the given DCF/EDCAF
+     * @param txop the given DCF/EDCAF
      */
     void ResetBackoff(Ptr<Txop> txop);
 
@@ -340,9 +347,9 @@
      * used by the given link. This notification is sent by the EMLSR Manager when a PHY object
      * switches operating channel to operate on another link.
      *
-     * \param phy the PHY object that is going to switch channel
-     * \param channel the new operating channel of the given PHY
-     * \param linkId the ID of the link on which the given PHY is going to operate
+     * @param phy the PHY object that is going to switch channel
+     * @param channel the new operating channel of the given PHY
+     * @param linkId the ID of the link on which the given PHY is going to operate
      */
     void NotifySwitchingEmlsrLink(Ptr<WifiPhy> phy,
                                   const WifiPhyOperatingChannel& channel,
@@ -356,8 +363,8 @@
     /**
      * Get current registered listener for PHY events on the given PHY.
      *
-     * \param phy the given PHY
-     * \return the current registered listener for PHY events on the given PHY
+     * @param phy the given PHY
+     * @return the current registered listener for PHY events on the given PHY
      */
     std::shared_ptr<PhyListener> GetPhyListener(Ptr<WifiPhy> phy) const;
 
@@ -382,10 +389,10 @@
      * This overload is provided to enable caching the value returned by GetAccessGrantStart(),
      * which is independent of the given Txop object.
      *
-     * \param txop the Txop
-     * \param accessGrantStart the value returned by GetAccessGrantStart()
+     * @param txop the Txop
+     * @param accessGrantStart the value returned by GetAccessGrantStart()
      *
-     * \return the time when the backoff procedure started
+     * @return the time when the backoff procedure started
      */
     Time GetBackoffStartFor(Ptr<Txop> txop, Time accessGrantStart) const;
 
@@ -393,10 +400,10 @@
      * This overload is provided to enable caching the value returned by GetAccessGrantStart(),
      * which is independent of the given Txop object.
      *
-     * \param txop the Txop
-     * \param accessGrantStart the value returned by GetAccessGrantStart()
+     * @param txop the Txop
+     * @param accessGrantStart the value returned by GetAccessGrantStart()
      *
-     * \return the time when the backoff procedure ended (or will end)
+     * @return the time when the backoff procedure ended (or will end)
      */
     Time GetBackoffEndFor(Ptr<Txop> txop, Time accessGrantStart) const;
 
@@ -427,21 +434,21 @@
     /**
      * Return the Short Interframe Space (SIFS) for this PHY.
      *
-     * \return the SIFS duration
+     * @return the SIFS duration
      */
     virtual Time GetSifs() const;
 
     /**
      * Return the slot duration for this PHY.
      *
-     * \return the slot duration
+     * @return the slot duration
      */
     virtual Time GetSlot() const;
 
     /**
      * Return the EIFS duration minus a DIFS.
      *
-     * \return the EIFS duration minus a DIFS
+     * @return the EIFS duration minus a DIFS
      */
     virtual Time GetEifsNoDifs() const;
 
@@ -501,6 +508,23 @@
     Ptr<WifiPhy> m_phy;                    //!< pointer to the unique active PHY
     Ptr<FrameExchangeManager> m_feManager; //!< pointer to the Frame Exchange Manager
     uint8_t m_linkId;                      //!< the ID of the link this object is associated with
+    uint8_t m_nSlotsLeft;                  //!< fire the NSlotsLeftAlert trace source when the
+                                           //!< backoff counter with the minimum value among all
+                                           //!< ACs reaches this value
+
+    /**
+     * TracedCallback signature for NSlotsLeft alerts.
+     *
+     * @param linkId the ID of this link
+     * @param aci the index of the AC that triggered the NSlotsLeft alert
+     * @param backoffDelay delay until backoff counts down to zero
+     */
+    typedef void (*NSlotsLeftCallback)(uint8_t linkId, AcIndex aci, const Time& backoffDelay);
+
+    /// TracedCallback for NSlotsLeft alerts typedef
+    using NSlotsLeftTracedCallback = TracedCallback<uint8_t, AcIndex, const Time&>;
+
+    NSlotsLeftTracedCallback m_nSlotsLeftCallback; //!< traced callback for NSlotsLeft alerts
 };
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/ctrl-headers.cc ns-3.44/src/wifi/model/ctrl-headers.cc
--- ns-3.43/src/wifi/model/ctrl-headers.cc	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/ctrl-headers.cc	2025-03-09 16:55:49.783372600 -0700
@@ -72,6 +72,9 @@
     case BlockAckReqType::MULTI_TID:
         size += (2 + 2) * (m_tidInfo + 1);
         break;
+    case BlockAckReqType::GCR:
+        size += (2 + 6); // SSC plus GCR Group Address
+        break;
     default:
         NS_FATAL_ERROR("Invalid BA type");
         break;
@@ -94,6 +97,10 @@
     case BlockAckReqType::MULTI_TID:
         NS_FATAL_ERROR("Multi-tid block ack is not supported.");
         break;
+    case BlockAckReqType::GCR:
+        i.WriteHtolsbU16(GetStartingSequenceControl());
+        WriteTo(i, m_gcrAddress);
+        break;
     default:
         NS_FATAL_ERROR("Invalid BA type");
         break;
@@ -115,6 +122,10 @@
     case BlockAckReqType::MULTI_TID:
         NS_FATAL_ERROR("Multi-tid block ack is not supported.");
         break;
+    case BlockAckReqType::GCR:
+        SetStartingSequenceControl(i.ReadLsbtohU16());
+        ReadFrom(i, m_gcrAddress);
+        break;
     default:
         NS_FATAL_ERROR("Invalid BA type");
         break;
@@ -139,6 +150,9 @@
     case BlockAckReqType::MULTI_TID:
         res |= (0x03 << 1);
         break;
+    case BlockAckReqType::GCR:
+        res |= (0x06 << 1);
+        break;
     default:
         NS_FATAL_ERROR("Invalid BA type");
         break;
@@ -151,7 +165,11 @@
 CtrlBAckRequestHeader::SetBarControl(uint16_t bar)
 {
     m_barAckPolicy = ((bar & 0x01) == 1);
-    if (((bar >> 1) & 0x0f) == 0x03)
+    if (((bar >> 1) & 0x0f) == 0x06)
+    {
+        m_barType.m_variant = BlockAckReqType::GCR;
+    }
+    else if (((bar >> 1) & 0x0f) == 0x03)
     {
         m_barType.m_variant = BlockAckReqType::MULTI_TID;
     }
@@ -231,6 +249,20 @@
     return m_startingSeq;
 }
 
+void
+CtrlBAckRequestHeader::SetGcrGroupAddress(const Mac48Address& address)
+{
+    NS_ASSERT(IsGcr());
+    m_gcrAddress = address;
+}
+
+Mac48Address
+CtrlBAckRequestHeader::GetGcrGroupAddress() const
+{
+    NS_ASSERT(IsGcr());
+    return m_gcrAddress;
+}
+
 bool
 CtrlBAckRequestHeader::IsBasic() const
 {
@@ -255,6 +287,12 @@
     return m_barType.m_variant == BlockAckReqType::MULTI_TID;
 }
 
+bool
+CtrlBAckRequestHeader::IsGcr() const
+{
+    return m_barType.m_variant == BlockAckReqType::GCR;
+}
+
 /***********************************
  *       Block ack response
  ***********************************/
@@ -323,6 +361,9 @@
     case BlockAckType::MULTI_TID:
         size += (2 + 2 + 8) * (m_tidInfo + 1); // Multi-TID block ack
         break;
+    case BlockAckType::GCR:
+        size += (2 + 6 + m_baType.m_bitmapLen[0]);
+        break;
     case BlockAckType::MULTI_STA:
         for (auto& bitmapLen : m_baType.m_bitmapLen)
         {
@@ -349,6 +390,11 @@
         i.WriteHtolsbU16(GetStartingSequenceControl());
         i = SerializeBitmap(i);
         break;
+    case BlockAckType::GCR:
+        i.WriteHtolsbU16(GetStartingSequenceControl());
+        WriteTo(i, m_baInfo[0].m_address);
+        i = SerializeBitmap(i);
+        break;
     case BlockAckType::MULTI_STA:
         for (std::size_t index = 0; index < m_baInfo.size(); index++)
         {
@@ -365,7 +411,7 @@
             {
                 uint32_t reserved = 0;
                 i.WriteHtolsbU32(reserved);
-                WriteTo(i, m_baInfo[index].m_ra);
+                WriteTo(i, m_baInfo[index].m_address);
             }
         }
         break;
@@ -391,6 +437,11 @@
         SetStartingSequenceControl(i.ReadLsbtohU16());
         i = DeserializeBitmap(i);
         break;
+    case BlockAckType::GCR:
+        SetStartingSequenceControl(i.ReadLsbtohU16());
+        ReadFrom(i, m_baInfo[0].m_address);
+        i = DeserializeBitmap(i);
+        break;
     case BlockAckType::MULTI_STA: {
         std::size_t index = 0;
         while (i.GetRemainingSize() > 0)
@@ -414,7 +465,7 @@
             else
             {
                 i.ReadLsbtohU32(); // next 4 bytes are reserved
-                ReadFrom(i, m_baInfo.back().m_ra);
+                ReadFrom(i, m_baInfo.back().m_address);
                 // the length of this Per AID TID Info subfield is 12, so set
                 // the bitmap length to 8 to simulate the correct size
                 m_baType.m_bitmapLen.back() = 8;
@@ -450,7 +501,7 @@
         BaInfoInstance baInfoInstance{.m_aidTidInfo = 0,
                                       .m_startingSeq = 0,
                                       .m_bitmap = std::vector<uint8_t>(bitmapLen, 0),
-                                      .m_ra = Mac48Address()};
+                                      .m_address = Mac48Address()};
 
         m_baInfo.emplace_back(baInfoInstance);
     }
@@ -555,6 +606,12 @@
     return m_baType.m_variant == BlockAckType::MULTI_STA;
 }
 
+bool
+CtrlBAckResponseHeader::IsGcr() const
+{
+    return m_baType.m_variant == BlockAckType::GCR;
+}
+
 void
 CtrlBAckResponseHeader::SetAid11(uint16_t aid, std::size_t index)
 {
@@ -595,7 +652,7 @@
 {
     NS_ASSERT(GetAid11(index) == 2045);
 
-    m_baInfo[index].m_ra = ra;
+    m_baInfo[index].m_address = ra;
 }
 
 Mac48Address
@@ -603,7 +660,7 @@
 {
     NS_ASSERT(GetAid11(index) == 2045);
 
-    return m_baInfo[index].m_ra;
+    return m_baInfo[index].m_address;
 }
 
 std::size_t
@@ -630,6 +687,20 @@
     return ret;
 }
 
+void
+CtrlBAckResponseHeader::SetGcrGroupAddress(const Mac48Address& address)
+{
+    NS_ASSERT(IsGcr());
+    m_baInfo[0].m_address = address;
+}
+
+Mac48Address
+CtrlBAckResponseHeader::GetGcrGroupAddress() const
+{
+    NS_ASSERT(IsGcr());
+    return m_baInfo[0].m_address;
+}
+
 uint16_t
 CtrlBAckResponseHeader::GetBaControl() const
 {
@@ -651,6 +722,9 @@
     case BlockAckType::MULTI_TID:
         res |= (0x03 << 1);
         break;
+    case BlockAckType::GCR:
+        res |= (0x06 << 1);
+        break;
     case BlockAckType::MULTI_STA:
         res |= (0x0b << 1);
         break;
@@ -669,7 +743,11 @@
 CtrlBAckResponseHeader::SetBaControl(uint16_t ba)
 {
     m_baAckPolicy = ((ba & 0x01) == 1);
-    if (((ba >> 1) & 0x0f) == 0x03)
+    if (((ba >> 1) & 0x0f) == 0x06)
+    {
+        SetType(BlockAckType::GCR);
+    }
+    else if (((ba >> 1) & 0x0f) == 0x03)
     {
         SetType(BlockAckType::MULTI_TID);
     }
@@ -711,7 +789,7 @@
     // The Fragment Number subfield encodes the length of the bitmap for Compressed and Multi-STA
     // variants (see sections 9.3.1.8.2 and 9.3.1.8.7 of 802.11ax-2021 and 802.11be Draft 4.0).
     // Note that Fragmentation Level 3 is not supported.
-    if (m_baType.m_variant == BlockAckType::COMPRESSED)
+    if (m_baType.m_variant == BlockAckType::COMPRESSED || m_baType.m_variant == BlockAckType::GCR)
     {
         switch (m_baType.m_bitmapLen[0])
         {
@@ -774,7 +852,7 @@
     // The Fragment Number subfield encodes the length of the bitmap for Compressed and Multi-STA
     // variants (see sections 9.3.1.8.2 and 9.3.1.8.7 of 802.11ax-2021 and 802.11be Draft 4.0).
     // Note that Fragmentation Level 3 is not supported.
-    if (m_baType.m_variant == BlockAckType::COMPRESSED)
+    if (m_baType.m_variant == BlockAckType::COMPRESSED || m_baType.m_variant == BlockAckType::GCR)
     {
         uint16_t fragNumber = seqControl & 0x000f;
 
@@ -785,16 +863,16 @@
         switch (fragNumber)
         {
         case 0:
-            SetType({BlockAckType::COMPRESSED, {8}});
+            SetType({m_baType.m_variant, {8}});
             break;
         case 4:
-            SetType({BlockAckType::COMPRESSED, {32}});
+            SetType({m_baType.m_variant, {32}});
             break;
         case 8:
-            SetType({BlockAckType::COMPRESSED, {64}});
+            SetType({m_baType.m_variant, {64}});
             break;
         case 10:
-            SetType({BlockAckType::COMPRESSED, {128}});
+            SetType({m_baType.m_variant, {128}});
             break;
         default:
             NS_ABORT_MSG("Unsupported fragment number: " << fragNumber);
@@ -852,6 +930,7 @@
     case BlockAckType::BASIC:
     case BlockAckType::COMPRESSED:
     case BlockAckType::EXTENDED_COMPRESSED:
+    case BlockAckType::GCR:
     case BlockAckType::MULTI_STA:
         for (const auto& byte : m_baInfo[index].m_bitmap)
         {
@@ -881,6 +960,7 @@
     case BlockAckType::BASIC:
     case BlockAckType::COMPRESSED:
     case BlockAckType::EXTENDED_COMPRESSED:
+    case BlockAckType::GCR:
     case BlockAckType::MULTI_STA:
         for (uint8_t j = 0; j < m_baType.m_bitmapLen[index]; j++)
         {
@@ -917,6 +997,7 @@
         break;
     case BlockAckType::COMPRESSED:
     case BlockAckType::EXTENDED_COMPRESSED:
+    case BlockAckType::GCR:
     case BlockAckType::MULTI_STA: {
         uint16_t i = IndexInBitmap(seq, index);
         m_baInfo[index].m_bitmap[i / 8] |= (uint8_t(0x01) << (i % 8));
@@ -946,6 +1027,7 @@
         break;
     case BlockAckType::COMPRESSED:
     case BlockAckType::EXTENDED_COMPRESSED:
+    case BlockAckType::GCR:
     case BlockAckType::MULTI_STA:
         /* We can ignore this...compressed block ack doesn't support
            acknowledgment of single fragments */
@@ -983,6 +1065,7 @@
         return false;
     case BlockAckType::COMPRESSED:
     case BlockAckType::EXTENDED_COMPRESSED:
+    case BlockAckType::GCR:
     case BlockAckType::MULTI_STA: {
         uint16_t i = IndexInBitmap(seq, index);
         uint8_t mask = uint8_t(0x01) << (i % 8);
@@ -1013,6 +1096,7 @@
                0;
     case BlockAckType::COMPRESSED:
     case BlockAckType::EXTENDED_COMPRESSED:
+    case BlockAckType::GCR:
     case BlockAckType::MULTI_STA:
         /* We can ignore this...compressed block ack doesn't support
            acknowledgement of single fragments */
@@ -2052,7 +2136,7 @@
 MHz_u
 CtrlTriggerHeader::GetUlBandwidth() const
 {
-    return (1 << m_ulBandwidth) * 20;
+    return (1 << m_ulBandwidth) * MHz_u{20};
 }
 
 void
@@ -2182,6 +2266,12 @@
     return m_userInfoFields.back();
 }
 
+CtrlTriggerHeader::Iterator
+CtrlTriggerHeader::RemoveUserInfoField(ConstIterator userInfoIt)
+{
+    return m_userInfoFields.erase(userInfoIt);
+}
+
 CtrlTriggerHeader::ConstIterator
 CtrlTriggerHeader::begin() const
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/ctrl-headers.h ns-3.44/src/wifi/model/ctrl-headers.h
--- ns-3.43/src/wifi/model/ctrl-headers.h	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/ctrl-headers.h	2025-03-09 16:55:49.783372600 -0700
@@ -26,16 +26,16 @@
 enum AcIndex : uint8_t;
 
 /**
- * \ingroup wifi
- * \brief Headers for BlockAckRequest.
+ * @ingroup wifi
+ * @brief Headers for BlockAckRequest.
  *
- *  802.11n standard includes three types of BlockAck:
- *    - Basic BlockAck (unique type in 802.11e)
- *    - Compressed BlockAck
- *    - Multi-TID BlockAck
- *  For now only basic BlockAck and compressed BlockAck
- *  are supported.
- *  Basic BlockAck is also default variant.
+ *  802.11 standard includes multiple BlockAckReq variants:
+ *    - Basic BlockAckReq (unique type in 802.11e)
+ *    - Compressed BlockAckReq
+ *    - Multi-TID BlockAckReq
+ *    - GCR BlockAckReq
+ *  For now only basic BlockAckReq, compressed BlockAckReq and GCR BlockAckReq are supported.
+ *  Basic BlockAckReq is the default variant.
  */
 class CtrlBAckRequestHeader : public Header
 {
@@ -43,8 +43,8 @@
     CtrlBAckRequestHeader();
     ~CtrlBAckRequestHeader() override;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -57,89 +57,89 @@
     /**
      * Enable or disable HT immediate Ack.
      *
-     * \param immediateAck enable or disable HT immediate Ack
+     * @param immediateAck enable or disable HT immediate Ack
      */
     void SetHtImmediateAck(bool immediateAck);
     /**
      * Set the BlockAckRequest type.
      *
-     * \param type the BlockAckRequest type
+     * @param type the BlockAckRequest type
      */
     void SetType(BlockAckReqType type);
     /**
      * Set Traffic ID (TID).
      *
-     * \param tid the TID
+     * @param tid the TID
      */
     void SetTidInfo(uint8_t tid);
     /**
      * Set the starting sequence number from the given
      * raw sequence control field.
      *
-     * \param seq the raw sequence control
+     * @param seq the raw sequence control
      */
     void SetStartingSequence(uint16_t seq);
+    /**
+     * Set the GCR Group address (GCR variant only).
+     *
+     * @param address the GCR Group Address
+     */
+    void SetGcrGroupAddress(const Mac48Address& address);
 
     /**
      * Check if the current Ack Policy is immediate.
      *
-     * \return true if the current Ack Policy is immediate,
+     * @return true if the current Ack Policy is immediate,
      *         false otherwise
      */
     bool MustSendHtImmediateAck() const;
     /**
      * Return the BlockAckRequest type.
      *
-     * \return the type of the BlockAckRequest
+     * @return the type of the BlockAckRequest
      */
     BlockAckReqType GetType() const;
     /**
      * Return the Traffic ID (TID).
      *
-     * \return TID
+     * @return TID
      */
     uint8_t GetTidInfo() const;
     /**
      * Return the starting sequence number.
      *
-     * \return the starting sequence number
+     * @return the starting sequence number
      */
     uint16_t GetStartingSequence() const;
     /**
-     * Check if the current Ack Policy is Basic Block Ack
-     * (i.e. not multi-TID nor compressed).
-     *
-     * \return true if the current Ack Policy is Basic Block Ack,
-     *         false otherwise
+     * @return the GCR Group Address (GCR variant only)
+     */
+    Mac48Address GetGcrGroupAddress() const;
+    /**
+     * @return whether the variant of this BlockAckReq is Basic
      */
     bool IsBasic() const;
     /**
-     * Check if the current Ack Policy is Compressed Block Ack
-     * and not multi-TID.
-     *
-     * \return true if the current Ack Policy is Compressed Block Ack,
-     *         false otherwise
+     * @return whether the variant of this BlockAckReq is Compressed
      */
     bool IsCompressed() const;
     /**
-     * Check if the current Ack Policy is Extended Compressed Block Ack.
-     *
-     * \return true if the current Ack Policy is Extended Compressed Block Ack,
-     *         false otherwise
+     * @return whether the variant of this BlockAckReq is Extended Compressed
      */
     bool IsExtendedCompressed() const;
     /**
-     * Check if the current Ack Policy has Multi-TID Block Ack.
-     *
-     * \return true if the current Ack Policy has Multi-TID Block Ack,
-     *         false otherwise
+     * @return whether the variant of this BlockAckReq is Multi-TID
      */
     bool IsMultiTid() const;
+    /**
+     * @return whether the variant of this BlockAckReq is GCR
+     */
+    bool IsGcr() const;
 
     /**
      * Return the starting sequence control.
      *
-     * \return the starting sequence control
+     * @return the starting sequence control
      */
     uint16_t GetStartingSequenceControl() const;
 
@@ -148,19 +148,19 @@
      * Set the starting sequence control with the given
      * sequence control value
      *
-     * \param seqControl the sequence control value
+     * @param seqControl the sequence control value
      */
     void SetStartingSequenceControl(uint16_t seqControl);
     /**
      * Return the Block Ack control.
      *
-     * \return the Block Ack control
+     * @return the Block Ack control
      */
     uint16_t GetBarControl() const;
     /**
      * Set the Block Ack control.
      *
-     * \param bar the BAR control value
+     * @param bar the BAR control value
      */
     void SetBarControl(uint16_t bar);
 
@@ -174,17 +174,20 @@
     BlockAckReqType m_barType; ///< BAR type
     uint16_t m_tidInfo;        ///< TID info
     uint16_t m_startingSeq;    ///< starting seq
+    Mac48Address m_gcrAddress; ///< GCR Group Address (GCR variant only)
 };
 
 /**
- * \ingroup wifi
- * \brief Headers for BlockAck response.
+ * @ingroup wifi
+ * @brief Headers for BlockAck response.
  *
- *  802.11n standard includes three types of BlockAck:
+ *  802.11 standard includes multiple BlockAck variants:
  *    - Basic BlockAck (unique type in 802.11e)
  *    - Compressed BlockAck
  *    - Multi-TID BlockAck
- *  For now only basic BlockAck and compressed BlockAck
+ *    - GCR BlockAck
+ *    - Multi-STA BlockAck
+ *  For now only basic BlockAck, compressed BlockAck, GCR BlockAck and Multi-STA BlockAck
  *  are supported.
  *  Basic BlockAck is also default variant.
  */
@@ -194,8 +197,8 @@
     CtrlBAckResponseHeader();
     ~CtrlBAckResponseHeader() override;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -207,13 +210,13 @@
     /**
      * Enable or disable HT immediate Ack.
      *
-     * \param immediateAck enable or disable HT immediate Ack
+     * @param immediateAck enable or disable HT immediate Ack
      */
     void SetHtImmediateAck(bool immediateAck);
     /**
      * Set the block ack type.
      *
-     * \param type the BA type
+     * @param type the BA type
      */
     void SetType(BlockAckType type);
     /**
@@ -222,8 +225,8 @@
      * AID TID Info subfield of the Per AID TID Info subfield identified by the given
      * index.
      *
-     * \param tid the traffic ID
-     * \param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
+     * @param tid the traffic ID
+     * @param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
      */
     void SetTidInfo(uint8_t tid, std::size_t index = 0);
     /**
@@ -232,22 +235,28 @@
      * number in the Per AID TID Info subfield identified by the given index to the
      * given value.
      *
-     * \param seq the starting sequence number
-     * \param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
+     * @param seq the starting sequence number
+     * @param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
      */
     void SetStartingSequence(uint16_t seq, std::size_t index = 0);
+    /**
+     * Set the GCR Group address (GCR variant only).
+     *
+     * @param address the GCR Group Address
+     */
+    void SetGcrGroupAddress(const Mac48Address& address);
 
     /**
      * Check if the current Ack Policy is immediate.
      *
-     * \return true if the current Ack Policy is immediate,
+     * @return true if the current Ack Policy is immediate,
      *         false otherwise
      */
     bool MustSendHtImmediateAck() const;
     /**
      * Return the block ack type ID.
      *
-     * \return type
+     * @return type
      */
     BlockAckType GetType() const;
     /**
@@ -256,8 +265,8 @@
      * AID TID Info subfield of the Per AID TID Info subfield identified by the given
      * index.
      *
-     * \param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
-     * \return the Traffic ID
+     * @param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
+     * @return the Traffic ID
      */
     uint8_t GetTidInfo(std::size_t index = 0) const;
     /**
@@ -265,43 +274,36 @@
      * number. For Multi-STA Block Acks, get the starting sequence number in the
      * Per AID TID Info subfield identified by the given index.
      *
-     * \param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
-     * \return the starting sequence number
+     * @param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
+     * @return the starting sequence number
      */
     uint16_t GetStartingSequence(std::size_t index = 0) const;
     /**
-     * Check if the current BA policy is Basic Block Ack.
-     *
-     * \return true if the current BA policy is Basic Block Ack,
-     *         false otherwise
+     * @return the GCR Group Address (GCR variant only)
+     */
+    Mac48Address GetGcrGroupAddress() const;
+    /**
+     * @return whether the variant of this BlockAckReq is Basic
      */
     bool IsBasic() const;
     /**
-     * Check if the current BA policy is Compressed Block Ack.
-     *
-     * \return true if the current BA policy is Compressed Block Ack,
-     *         false otherwise
+     * @return whether the variant of this BlockAckReq is Compressed
      */
     bool IsCompressed() const;
     /**
-     * Check if the current BA policy is Extended Compressed Block Ack.
-     *
-     * \return true if the current BA policy is Extended Compressed Block Ack,
-     *         false otherwise
+     * @return whether the variant of this BlockAckReq is Extended Compressed
      */
     bool IsExtendedCompressed() const;
     /**
-     * Check if the current BA policy is Multi-TID Block Ack.
-     *
-     * \return true if the current BA policy is Multi-TID Block Ack,
-     *         false otherwise
+     * @return whether the variant of this BlockAckReq is Multi-TID
      */
     bool IsMultiTid() const;
     /**
-     * Check if the BlockAck frame variant is Multi-STA Block Ack.
-     *
-     * \return true if the BlockAck frame variant is Multi-STA Block Ack,
-     *         false otherwise
+     * @return whether the variant of this BlockAckReq is GCR
+     */
+    bool IsGcr() const;
+    /**
+     * @return whether the variant of this BlockAckReq is Multi-STA
      */
     bool IsMultiSta() const;
 
@@ -309,32 +311,32 @@
      * For Multi-STA Block Acks, set the AID11 subfield of the Per AID TID Info
      * subfield identified by the given index to the given value
      *
-     * \param aid the AID11 value
-     * \param index the index of the Per AID TID Info subfield
+     * @param aid the AID11 value
+     * @param index the index of the Per AID TID Info subfield
      */
     void SetAid11(uint16_t aid, std::size_t index);
     /**
      * For Multi-STA Block Acks, get the AID11 subfield of the Per AID TID Info
      * subfield identified by the given index.
      *
-     * \param index the index of the Per AID TID Info subfield
-     * \return the AID11 subfield
+     * @param index the index of the Per AID TID Info subfield
+     * @return the AID11 subfield
      */
     uint16_t GetAid11(std::size_t index) const;
     /**
      * For Multi-STA Block Acks, set the Ack Type subfield of the Per AID TID Info
      * subfield identified by the given index to the given value
      *
-     * \param type the ack type value
-     * \param index the index of the Per AID TID Info subfield
+     * @param type the ack type value
+     * @param index the index of the Per AID TID Info subfield
      */
     void SetAckType(bool type, std::size_t index);
     /**
      * For Multi-STA Block Acks, get the Ack Type subfield of the Per AID TID Info
      * subfield identified by the given index.
      *
-     * \param index the index of the Per AID TID Info subfield
-     * \return the Ack Type
+     * @param index the index of the Per AID TID Info subfield
+     * @return the Ack Type
      */
     bool GetAckType(std::size_t index) const;
     /**
@@ -342,8 +344,8 @@
      * subfield (with AID11 subfield equal to 2045) identified by the given index
      * to the given MAC address.
      *
-     * \param ra the MAC address
-     * \param index the index of the Per AID TID Info subfield
+     * @param ra the MAC address
+     * @param index the index of the Per AID TID Info subfield
      */
     void SetUnassociatedStaAddress(const Mac48Address& ra, std::size_t index);
     /**
@@ -351,23 +353,23 @@
      * subfield (with AID11 subfield equal to 2045) identified by the given index
      * to the given MAC address.
      *
-     * \param index the index of the Per AID TID Info subfield
-     * \return the MAC address stored in the RA subfield
+     * @param index the index of the Per AID TID Info subfield
+     * @return the MAC address stored in the RA subfield
      */
     Mac48Address GetUnassociatedStaAddress(std::size_t index) const;
     /**
      * For Multi-STA Block Acks, get the number of Per AID TID Info subfields
      * included in this Block Ack.
      *
-     * \return the number of Per AID TID Info subfields included in this Multi-STA Block Ack
+     * @return the number of Per AID TID Info subfields included in this Multi-STA Block Ack
      */
     std::size_t GetNPerAidTidInfoSubfields() const;
     /**
      * For Multi-STA Block Acks, get the indices of the Per AID TID Info subfields
      * carrying the given AID in the AID11 subfield.
      *
-     * \param aid the given AID
-     * \return a vector containing the indices of the Per AID TID Info subfields
+     * @param aid the given AID
+     * @return a vector containing the indices of the Per AID TID Info subfields
      *         carrying the given AID in the AID11 subfield
      */
     std::vector<uint32_t> FindPerAidTidInfoWithAid(uint16_t aid) const;
@@ -377,16 +379,16 @@
      * received. For Multi-STA Block Acks, <i>index</i> identifies the Per AID
      * TID Info subfield whose bitmap has to be updated.
      *
-     * \param seq the sequence number of the received packet
-     * \param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
+     * @param seq the sequence number of the received packet
+     * @param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
      */
     void SetReceivedPacket(uint16_t seq, std::size_t index = 0);
     /**
      * Set the bitmap that the packet with the given sequence
      * number and fragment number was received.
      *
-     * \param seq the sequence number
-     * \param frag the fragment number
+     * @param seq the sequence number
+     * @param frag the fragment number
      */
     void SetReceivedFragment(uint16_t seq, uint8_t frag);
     /**
@@ -394,9 +396,9 @@
      * BlockAck response. For Multi-STA Block Acks, <i>index</i> identifies the
      * Per AID TID Info subfield whose bitmap has to be checked.
      *
-     * \param seq the sequence number to be checked
-     * \param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
-     * \return true if the packet with the given sequence number
+     * @param seq the sequence number to be checked
+     * @param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
+     * @return true if the packet with the given sequence number
      *         was ACKed in this BlockAck response, false otherwise
      */
     bool IsPacketReceived(uint16_t seq, std::size_t index = 0) const;
@@ -404,9 +406,9 @@
      * Check if the packet with the given sequence number
      * and fragment number was acknowledged in this BlockAck response.
      *
-     * \param seq the sequence number
-     * \param frag the fragment number
-     * \return true if the packet with the given sequence number
+     * @param seq the sequence number
+     * @param frag the fragment number
+     * @return true if the packet with the given sequence number
      *         and sequence number was acknowledged in this BlockAck response,
      *         false otherwise
      */
@@ -417,8 +419,8 @@
      * Block Acks, <i>index</i> identifies the Per AID TID Info subfield whose
      * Starting Sequence Control subfield has to be returned.
      *
-     * \param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
-     * \return the value of the Starting Sequence Control subfield
+     * @param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
+     * @return the value of the Starting Sequence Control subfield
      */
     uint16_t GetStartingSequenceControl(std::size_t index = 0) const;
     /**
@@ -426,8 +428,8 @@
      * value. For Multi-STA Block Acks, <i>index</i> identifies the Per AID TID Info
      * subfield whose Starting Sequence Control subfield has to be set.
      *
-     * \param seqControl the raw sequence control value
-     * \param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
+     * @param seqControl the raw sequence control value
+     * @param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
      */
     void SetStartingSequenceControl(uint16_t seqControl, std::size_t index = 0);
     /**
@@ -435,8 +437,8 @@
      * For Multi-STA Block Acks, return a const reference to the bitmap included
      * in the Per AID TID Info subfield identified by <i>index</i>.
      *
-     * \param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
-     * \return a const reference to the bitmap from the BlockAck response header
+     * @param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
+     * @return a const reference to the bitmap from the BlockAck response header
      */
     const std::vector<uint8_t>& GetBitmap(std::size_t index = 0) const;
 
@@ -444,7 +446,7 @@
      * Reset the bitmap to 0. For Multi-STA Block Acks, reset the bitmap included
      * in the Per AID TID Info subfield identified by <i>index</i>.
      *
-     * \param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
+     * @param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
      */
     void ResetBitmap(std::size_t index = 0);
 
@@ -452,13 +454,13 @@
     /**
      * Return the Block Ack control.
      *
-     * \return the Block Ack control
+     * @return the Block Ack control
      */
     uint16_t GetBaControl() const;
     /**
      * Set the Block Ack control.
      *
-     * \param ba the BA control to set
+     * @param ba the BA control to set
      */
     void SetBaControl(uint16_t ba);
 
@@ -466,18 +468,18 @@
      * Serialize bitmap to the given buffer. For Multi-STA Block Acks, <i>index</i>
      * identifies the Per AID TID Info subfield whose bitmap has to be serialized.
      *
-     * \param start iterator pointing to the beginning of the buffer to write into.
-     * \param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
-     * \return Buffer::Iterator to the next available buffer
+     * @param start iterator pointing to the beginning of the buffer to write into.
+     * @param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
+     * @return Buffer::Iterator to the next available buffer
      */
     Buffer::Iterator SerializeBitmap(Buffer::Iterator start, std::size_t index = 0) const;
     /**
      * Deserialize bitmap from the given buffer. For Multi-STA Block Acks, <i>index</i>
      * identifies the Per AID TID Info subfield whose bitmap has to be deserialized.
      *
-     * \param start iterator pointing to the beginning of the buffer to read from.
-     * \param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
-     * \return Buffer::Iterator to the next available buffer
+     * @param start iterator pointing to the beginning of the buffer to read from.
+     * @param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
+     * @return Buffer::Iterator to the next available buffer
      */
     Buffer::Iterator DeserializeBitmap(Buffer::Iterator start, std::size_t index = 0);
 
@@ -487,10 +489,10 @@
      *
      * for more details see 7.2.1.8 in IEEE 802.11n/D4.00
      *
-     * \param seq the sequence number
-     * \param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
+     * @param seq the sequence number
+     * @param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
      *
-     * \return If we are using basic block ack, return value represents index of
+     * @return If we are using basic block ack, return value represents index of
      * block of 16 bits for packet having sequence number equals to <i>seq</i>.
      * If we are using compressed block ack, return value represents bit
      * to set to 1 in the compressed bitmap to indicate that packet having
@@ -503,9 +505,9 @@
      * Multi-STA Block Acks, check if sequence number <i>seq</i> can be acknowledged
      * in the bitmap included in the Per AID TID Info subfield identified by <i>index</i>.
      *
-     * \param seq the sequence number
-     * \param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
-     * \return true if the sequence number is concerned by the bitmap
+     * @param seq the sequence number
+     * @param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
+     * @return true if the sequence number is concerned by the bitmap
      */
     bool IsInBitmap(uint16_t seq, std::size_t index = 0) const;
 
@@ -534,15 +536,16 @@
                                        //!< AID TID Info subfield for Multi-STA
         uint16_t m_startingSeq;        //!< Block Ack Starting Sequence Control subfield
         std::vector<uint8_t> m_bitmap; //!< block ack bitmap
-        Mac48Address m_ra;             //!< RA subfield (address of an unassociated station)
-                                       //!< for Multi-STA; reserved for other variants
+        Mac48Address m_address;        //!< RA subfield (address of an unassociated station) for
+                                       //!< Multi-STA variant; GCR Group Address subfield for GCR
+                                       //!< variant; reserved for other variants
     };
 
     std::vector<BaInfoInstance> m_baInfo; //!< BA Information field
 };
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * The different Trigger frame types.
  */
 enum class TriggerFrameType : uint8_t
@@ -558,7 +561,7 @@
 };
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * The different variants for Common Info field and User Info field of Trigger Frames.
  */
 enum class TriggerFrameVariant : uint8_t
@@ -568,8 +571,8 @@
 };
 
 /**
- * \ingroup wifi
- * \brief User Info field of Trigger frames.
+ * @ingroup wifi
+ * @brief User Info field of Trigger frames.
  *
  * Trigger frames, introduced by 802.11ax amendment (see Section 9.3.1.23 of D3.0),
  * include one or more User Info fields, each of which carries information about the
@@ -581,15 +584,15 @@
     /**
      * Constructor
      *
-     * \param triggerType the Trigger frame type
-     * \param variant the Trigger Frame variant
+     * @param triggerType the Trigger frame type
+     * @param variant the Trigger Frame variant
      */
     CtrlTriggerUserInfoField(TriggerFrameType triggerType, TriggerFrameVariant variant);
     /**
      * Copy assignment operator.
      *
-     * \param userInfo the User Info field to copy
-     * \return a reference to the copied object
+     * @param userInfo the User Info field to copy
+     * @return a reference to the copied object
      *
      * Checks that the given User Info fields is included in the same type
      * of Trigger Frame.
@@ -602,39 +605,39 @@
     /**
      * Print the content of this User Info field
      *
-     * \param os output stream
+     * @param os output stream
      */
     void Print(std::ostream& os) const;
     /**
      * Get the expected size of this User Info field
      *
-     * \return the expected size of this User Info field.
+     * @return the expected size of this User Info field.
      */
     uint32_t GetSerializedSize() const;
     /**
      * Serialize the User Info field to the given buffer.
      *
-     * \param start an iterator which points to where the header should
+     * @param start an iterator which points to where the header should
      *        be written
-     * \return Buffer::Iterator to the next available buffer
+     * @return Buffer::Iterator to the next available buffer
      */
     Buffer::Iterator Serialize(Buffer::Iterator start) const;
     /**
      * Deserialize the User Info field from the given buffer.
      *
-     * \param start an iterator which points to where the header should
+     * @param start an iterator which points to where the header should
      *        read from
-     * \return Buffer::Iterator to the next available buffer
+     * @return Buffer::Iterator to the next available buffer
      */
     Buffer::Iterator Deserialize(Buffer::Iterator start);
     /**
      * Get the type of the Trigger Frame this User Info field belongs to.
      *
-     * \return the type of the Trigger Frame this User Info field belongs to
+     * @return the type of the Trigger Frame this User Info field belongs to
      */
     TriggerFrameType GetType() const;
     /**
-     * \return the preamble type of the TB PPDU solicited by this User Info field.
+     * @return the preamble type of the TB PPDU solicited by this User Info field.
      */
     WifiPreamble GetPreambleType() const;
     /**
@@ -642,41 +645,41 @@
      * station for which this User Info field is intended. The whole AID can
      * be passed, since the passed value is properly masked.
      *
-     * \param aid the value for the AID12 subfield
+     * @param aid the value for the AID12 subfield
      */
     void SetAid12(uint16_t aid);
     /**
      * Get the value of the AID12 subfield.
      *
-     * \return the AID12 subfield
+     * @return the AID12 subfield
      */
     uint16_t GetAid12() const;
     /**
      * Check if this User Info field allocates a Random Access RU for stations
      * associated with the AP that transmitted the Trigger frame.
      *
-     * \return true if a Random Access RU for associated stations is allocated
+     * @return true if a Random Access RU for associated stations is allocated
      */
     bool HasRaRuForAssociatedSta() const;
     /**
      * Check if this User Info field allocates a Random Access RU for stations
      * not associated with the AP that transmitted the Trigger frame.
      *
-     * \return true if a Random Access RU for unassociated stations is allocated
+     * @return true if a Random Access RU for unassociated stations is allocated
      */
     bool HasRaRuForUnassociatedSta() const;
     /**
      * Set the RU Allocation subfield according to the specified RU.
      * This method cannot be called on MU-RTS Trigger Frames (call SetMuRtsRuAllocation instead).
      *
-     * \param ru the RU this User Info field is allocating
+     * @param ru the RU this User Info field is allocating
      */
     void SetRuAllocation(HeRu::RuSpec ru);
     /**
      * Get the RU specified by the RU Allocation subfield.
      * This method cannot be called on MU-RTS Trigger Frames (call GetMuRtsRuAllocation instead).
      *
-     * \return the RU this User Info field is allocating
+     * @return the RU this User Info field is allocating
      */
     HeRu::RuSpec GetRuAllocation() const;
     /**
@@ -706,51 +709,51 @@
      * B7–B1 of the RU Allocation subfield is set to 68 to indicate the primary and secondary
      * 80 MHz channel.
      *
-     * \param value the value for B7–B1 of the RU Allocation subfield
+     * @param value the value for B7–B1 of the RU Allocation subfield
      */
     void SetMuRtsRuAllocation(uint8_t value);
     /**
      * This method can only be called on MU-RTS Trigger Frames.
      *
-     * \return the value of B7–B1 of the RU Allocation subfield (\see SetMuRtsRuAllocation)
+     * @return the value of B7–B1 of the RU Allocation subfield (\see SetMuRtsRuAllocation)
      */
     uint8_t GetMuRtsRuAllocation() const;
     /**
      * Set the UL FEC Coding Type subfield, which indicates whether BCC or LDPC is used
      *
-     * \param ldpc whether to use LDPC or not
+     * @param ldpc whether to use LDPC or not
      */
     void SetUlFecCodingType(bool ldpc);
     /**
      * Get the UL FEC Coding Type subfield, which indicates whether BCC or LDPC is used
      *
-     * \return true if LDPC is used
+     * @return true if LDPC is used
      */
     bool GetUlFecCodingType() const;
     /**
      * Set the UL MCS subfield, which indicates the MCS of the solicited HE TB PPDU
      *
-     * \param mcs the MCS index (a value between 0 and 11)
+     * @param mcs the MCS index (a value between 0 and 11)
      */
     void SetUlMcs(uint8_t mcs);
     /**
      * Get the UL MCS subfield, which indicates the MCS of the solicited HE TB PPDU
      *
-     * \return the MCS index (a value between 0 and 11)
+     * @return the MCS index (a value between 0 and 11)
      */
     uint8_t GetUlMcs() const;
     /**
      * Set the UL DCM subfield, which indicates whether or not DCM is used.
      * This method can only be used with HE variant User Info field.
      *
-     * \param dcm whether to use DCM or not
+     * @param dcm whether to use DCM or not
      */
     void SetUlDcm(bool dcm);
     /**
      * Get the UL DCM subfield, which indicates whether or not DCM is used
      * This method can only be used with HE variant User Info field.
      *
-     * \return true if DCM is used
+     * @return true if DCM is used
      */
     bool GetUlDcm() const;
     /**
@@ -758,20 +761,20 @@
      * is neither 0 nor 2045. This method must be called after setting the AID12
      * subfield to a value other than 0 and 2045.
      *
-     * \param startingSs the starting spatial stream (a value from 1 to 8)
-     * \param nSs the number of spatial streams (a value from 1 to 8)
+     * @param startingSs the starting spatial stream (a value from 1 to 8)
+     * @param nSs the number of spatial streams (a value from 1 to 8)
      */
     void SetSsAllocation(uint8_t startingSs, uint8_t nSs);
     /**
      * Get the starting spatial stream.
      *
-     * \return the starting spatial stream (a value between 1 and 8)
+     * @return the starting spatial stream (a value between 1 and 8)
      */
     uint8_t GetStartingSs() const;
     /**
      * Get the number of spatial streams.
      *
-     * \return the number of spatial streams (a value between 1 and 8)
+     * @return the number of spatial streams (a value between 1 and 8)
      */
     uint8_t GetNss() const;
     /**
@@ -779,15 +782,15 @@
      * is 0 or 2045. This method must be called after setting the AID12 subfield to
      * 0 or 2045.
      *
-     * \param nRaRu the number (from 1 to 32) of contiguous RUs allocated for Random Access.
-     * \param moreRaRu whether RA-RUs are allocated in subsequent Trigger frames
+     * @param nRaRu the number (from 1 to 32) of contiguous RUs allocated for Random Access.
+     * @param moreRaRu whether RA-RUs are allocated in subsequent Trigger frames
      */
     void SetRaRuInformation(uint8_t nRaRu, bool moreRaRu);
     /**
      * Get the number of contiguous RUs for Random Access. This method can only be
      * called if the AID12 subfield has been set to 0 or 2045
      *
-     * \return the number of contiguous RA-RUs (a value between 1 and 32)
+     * @return the number of contiguous RA-RUs (a value between 1 and 32)
      */
     uint8_t GetNRaRus() const;
     /**
@@ -795,7 +798,7 @@
      * that are sent before the end of the current TXOP. This method can only be
      * called if the AID12 subfield has been set to 0 or 2045
      *
-     * \return true if more RA-RUs are allocated in subsequent Trigger frames
+     * @return true if more RA-RUs are allocated in subsequent Trigger frames
      */
     bool GetMoreRaRu() const;
     /**
@@ -807,14 +810,14 @@
      * Set the UL Target RSSI subfield to indicate the expected receive signal
      * power in dBm
      *
-     * \param dBm the expected receive signal power (a value between -110 and -20)
+     * @param dBm the expected receive signal power (a value between -110 and -20)
      */
     void SetUlTargetRssi(int8_t dBm);
     /**
      * Return true if the UL Target RSSI subfield indicates to the station to transmit
      * an HE TB PPDU response at its maximum transmit power for the assigned MCS
      *
-     * \return true if the UL Target RSSI subfield indicates to the station to transmit
+     * @return true if the UL Target RSSI subfield indicates to the station to transmit
      * an HE TB PPDU response at its maximum transmit power for the assigned MCS
      */
     bool IsUlTargetRssiMaxTxPower() const;
@@ -822,36 +825,36 @@
      * Get the expected receive signal power for the solicited HE TB PPDU. This
      * method can only be called if IsUlTargetRssiMaxTxPower returns false.
      *
-     * \return the expected receive signal power in dBm
+     * @return the expected receive signal power in dBm
      */
     int8_t GetUlTargetRssi() const;
     /**
      * Set the Trigger Dependent User Info subfield for Basic Trigger frames.
      *
-     * \param spacingFactor the MPDU MU spacing factor
-     * \param tidLimit the value for the TID Aggregation Limit subfield
-     * \param prefAc the lowest AC recommended for aggregation of MPDUs
+     * @param spacingFactor the MPDU MU spacing factor
+     * @param tidLimit the value for the TID Aggregation Limit subfield
+     * @param prefAc the lowest AC recommended for aggregation of MPDUs
      */
     void SetBasicTriggerDepUserInfo(uint8_t spacingFactor, uint8_t tidLimit, AcIndex prefAc);
     /**
      * Get the MPDU MU spacing factor. This method can only be called if this
      * User Info field is included in a Basic Trigger frame.
      *
-     * \return the MPDU MU spacing factor
+     * @return the MPDU MU spacing factor
      */
     uint8_t GetMpduMuSpacingFactor() const;
     /**
      * Get the TID Aggregation Limit. This method can only be called if this
      * User Info field is included in a Basic Trigger frame.
      *
-     * \return the TID Aggregation Limit
+     * @return the TID Aggregation Limit
      */
     uint8_t GetTidAggregationLimit() const;
     /**
      * Get the Preferred AC subfield. This method can only be called if this
      * User Info field is included in a Basic Trigger frame.
      *
-     * \return the Preferred AC subfield
+     * @return the Preferred AC subfield
      */
     AcIndex GetPreferredAc() const;
     /**
@@ -860,7 +863,7 @@
      * subfield. The BAR Control subfield must indicate either a Compressed
      * BlockAckReq variant or a Multi-TID BlockAckReq variant.
      *
-     * \param bar the BlockAckRequest header object including the BAR Control
+     * @param bar the BlockAckRequest header object including the BAR Control
      *            subfield and the BAR Information subfield
      */
     void SetMuBarTriggerDepUserInfo(const CtrlBAckRequestHeader& bar);
@@ -870,7 +873,7 @@
      * subfield. The BAR Control subfield must indicate either a Compressed
      * BlockAckReq variant or a Multi-TID BlockAckReq variant.
      *
-     * \return the BlockAckRequest header object including the BAR Control
+     * @return the BlockAckRequest header object including the BAR Control
      *         subfield and the BAR Information subfield
      */
     const CtrlBAckRequestHeader& GetMuBarTriggerDepUserInfo() const;
@@ -908,8 +911,8 @@
 };
 
 /**
- * \ingroup wifi
- * \brief Headers for Trigger frames.
+ * @ingroup wifi
+ * @brief Headers for Trigger frames.
  *
  * 802.11ax amendment defines eight types of Trigger frames (see Section 9.3.1.23 of D3.0):
  *   - Basic
@@ -932,7 +935,7 @@
   public:
     CtrlTriggerHeader();
     /**
-     * \brief Constructor
+     * @brief Constructor
      *
      * Construct a Trigger Frame of the given type from the values stored in the
      * given TX vector. In particular:
@@ -945,24 +948,24 @@
      *
      * This constructor cannot be used to construct MU-RTS Trigger Frames.
      *
-     * \param type the Trigger frame type
-     * \param txVector the TX vector used to build this Trigger Frame
+     * @param type the Trigger frame type
+     * @param txVector the TX vector used to build this Trigger Frame
      */
     CtrlTriggerHeader(TriggerFrameType type, const WifiTxVector& txVector);
     ~CtrlTriggerHeader() override;
     /**
      * Copy assignment operator.
      *
-     * \param trigger the Trigger frame to copy
-     * \return a reference to the copied object
+     * @param trigger the Trigger frame to copy
+     * @return a reference to the copied object
      *
      * Ensure that the type of this Trigger Frame is set to the type of the given
      * Trigger Frame before copying the User Info fields.
      */
     CtrlTriggerHeader& operator=(const CtrlTriggerHeader& trigger);
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -977,106 +980,106 @@
      * For the moment, all User Info fields are of the same variant type, hence we
      * forbid changing the Common Info field variant type after adding User Info fields.
      *
-     * \param variant the Common Info field variant
+     * @param variant the Common Info field variant
      */
     void SetVariant(TriggerFrameVariant variant);
     /**
      * Get the Common Info field variant.
      *
-     * \return the Common Info field variant
+     * @return the Common Info field variant
      */
     TriggerFrameVariant GetVariant() const;
     /**
      * Set the Trigger frame type.
      *
-     * \param type the Trigger frame type
+     * @param type the Trigger frame type
      */
     void SetType(TriggerFrameType type);
     /**
      * Get the Trigger Frame type.
      *
-     * \return the Trigger Frame type
+     * @return the Trigger Frame type
      */
     TriggerFrameType GetType() const;
     /**
      * Return a string corresponding to the Trigger Frame type.
      *
-     * \returns a string corresponding to the Trigger Frame type.
+     * @returns a string corresponding to the Trigger Frame type.
      */
     const char* GetTypeString() const;
     /**
      * Return a string corresponding to the given Trigger Frame type.
      *
-     * \param type the Trigger Frame type
-     * \returns a string corresponding to the Trigger Frame type.
+     * @param type the Trigger Frame type
+     * @returns a string corresponding to the Trigger Frame type.
      */
     static const char* GetTypeString(TriggerFrameType type);
     /**
      * Check if this is a Basic Trigger frame.
      *
-     * \return true if this is a Basic Trigger frame,
+     * @return true if this is a Basic Trigger frame,
      *         false otherwise
      */
     bool IsBasic() const;
     /**
      * Check if this is a Beamforming Report Poll Trigger frame.
      *
-     * \return true if this is a Beamforming Report Poll Trigger frame,
+     * @return true if this is a Beamforming Report Poll Trigger frame,
      *         false otherwise
      */
     bool IsBfrp() const;
     /**
      * Check if this is a MU-BAR Trigger frame.
      *
-     * \return true if this is a MU-BAR Trigger frame,
+     * @return true if this is a MU-BAR Trigger frame,
      *         false otherwise
      */
     bool IsMuBar() const;
     /**
      * Check if this is a MU-RTS Trigger frame.
      *
-     * \return true if this is a MU-RTS Trigger frame,
+     * @return true if this is a MU-RTS Trigger frame,
      *         false otherwise
      */
     bool IsMuRts() const;
     /**
      * Check if this is a Buffer Status Report Poll Trigger frame.
      *
-     * \return true if this is a Buffer Status Report Poll Trigger frame,
+     * @return true if this is a Buffer Status Report Poll Trigger frame,
      *         false otherwise
      */
     bool IsBsrp() const;
     /**
      * Check if this is a Groupcast with Retries (GCR) MU-BAR Trigger frame.
      *
-     * \return true if this is a Groupcast with Retries (GCR) MU-BAR Trigger frame,
+     * @return true if this is a Groupcast with Retries (GCR) MU-BAR Trigger frame,
      *         false otherwise
      */
     bool IsGcrMuBar() const;
     /**
      * Check if this is a Bandwidth Query Report Poll Trigger frame.
      *
-     * \return true if this is a Bandwidth Query Report Poll Trigger frame,
+     * @return true if this is a Bandwidth Query Report Poll Trigger frame,
      *         false otherwise
      */
     bool IsBqrp() const;
     /**
      * Check if this is a NDP Feedback Report Poll Trigger frame.
      *
-     * \return true if this is a NDP Feedback Report Poll Trigger frame,
+     * @return true if this is a NDP Feedback Report Poll Trigger frame,
      *         false otherwise
      */
     bool IsNfrp() const;
     /**
      * Set the UL Length subfield of the Common Info field.
      *
-     * \param len the value for the UL Length subfield
+     * @param len the value for the UL Length subfield
      */
     void SetUlLength(uint16_t len);
     /**
      * Get the UL Length subfield of the Common Info field.
      *
-     * \return the UL Length subfield
+     * @return the UL Length subfield
      */
     uint16_t GetUlLength() const;
     /**
@@ -1084,44 +1087,44 @@
      * the HE TB PPDU solicited by this Trigger Frame. Note that the TX power
      * level is not set by this method.
      *
-     * \param staId the STA-ID of a station addressed by this Trigger Frame
-     * \return the TX vector of the solicited HE TB PPDU
+     * @param staId the STA-ID of a station addressed by this Trigger Frame
+     * @return the TX vector of the solicited HE TB PPDU
      */
     WifiTxVector GetHeTbTxVector(uint16_t staId) const;
     /**
      * Set the More TF subfield of the Common Info field.
      *
-     * \param more the value for the More TF subfield
+     * @param more the value for the More TF subfield
      */
     void SetMoreTF(bool more);
     /**
      * Get the More TF subfield of the Common Info field.
      *
-     * \return the More TF subfield
+     * @return the More TF subfield
      */
     bool GetMoreTF() const;
     /**
      * Set the CS Required subfield of the Common Info field.
      *
-     * \param cs the value for the CS Required subfield
+     * @param cs the value for the CS Required subfield
      */
     void SetCsRequired(bool cs);
     /**
      * Get the CS Required subfield of the Common Info field.
      *
-     * \return the CS Required subfield
+     * @return the CS Required subfield
      */
     bool GetCsRequired() const;
     /**
      * Set the bandwidth of the solicited HE TB PPDU.
      *
-     * \param bw bandwidth (allowed values: 20, 40, 80, 160)
+     * @param bw bandwidth (allowed values: 20, 40, 80, 160)
      */
     void SetUlBandwidth(MHz_u bw);
     /**
      * Get the bandwidth of the solicited HE TB PPDU.
      *
-     * \return the bandwidth (20, 40, 80 or 160)
+     * @return the bandwidth (20, 40, 80 or 160)
      */
     MHz_u GetUlBandwidth() const;
     /**
@@ -1131,63 +1134,63 @@
      *   - 2x LTF + 1.6us GI
      *   - 4x LTF + 3.2us GI
      *
-     * \param guardInterval the guard interval duration
-     * \param ltfType the HE-LTF type (1, 2 or 4)
+     * @param guardInterval the guard interval duration
+     * @param ltfType the HE-LTF type (1, 2 or 4)
      */
     void SetGiAndLtfType(Time guardInterval, uint8_t ltfType);
     /**
      * Get the guard interval duration of the solicited HE TB PPDU.
      *
-     * \return the guard interval duration  of the solicited HE TB PPDU
+     * @return the guard interval duration  of the solicited HE TB PPDU
      */
     Time GetGuardInterval() const;
     /**
      * Get the LTF type of the solicited HE TB PPDU.
      *
-     * \return the LTF type of the solicited HE TB PPDU
+     * @return the LTF type of the solicited HE TB PPDU
      */
     uint8_t GetLtfType() const;
     /**
      * Set the AP TX Power subfield of the Common Info field.
      *
-     * \param power the value (from -20 to 40) for the AP TX Power (dBm)
+     * @param power the value (from -20 to 40) for the AP TX Power (dBm)
      */
     void SetApTxPower(int8_t power);
     /**
      * Get the power value (dBm) indicated by the AP TX Power subfield of the
      * Common Info field.
      *
-     * \return the AP TX Power (dBm) per 20 MHz
+     * @return the AP TX Power (dBm) per 20 MHz
      */
     int8_t GetApTxPower() const;
     /**
      * Set the UL Spatial Reuse subfield of the Common Info field.
      *
-     * \param sr the value for the UL Spatial Reuse subfield
+     * @param sr the value for the UL Spatial Reuse subfield
      */
     void SetUlSpatialReuse(uint16_t sr);
     /**
      * Get the UL Spatial Reuse subfield of the Common Info field.
      *
-     * \return the UL Spatial Reuse subfield
+     * @return the UL Spatial Reuse subfield
      */
     uint16_t GetUlSpatialReuse() const;
     /**
      * Set the size in bytes of the Padding field. The Padding field, if present,
      * shall be at least two octets in length.
      *
-     * \param size the size in bytes of the Padding field
+     * @param size the size in bytes of the Padding field
      */
     void SetPaddingSize(std::size_t size);
     /**
-     * \return the size in bytes of the Padding field
+     * @return the size in bytes of the Padding field
      */
     std::size_t GetPaddingSize() const;
     /**
      * Get a copy of the Common Info field of this Trigger frame.
      * Note that the User Info fields are excluded.
      *
-     * \return a Trigger frame including a copy of the Common Info field of this frame.
+     * @return a Trigger frame including a copy of the Common Info field of this frame.
      */
     CtrlTriggerHeader GetCommonInfoField() const;
 
@@ -1196,7 +1199,7 @@
      * a non-const reference to it. Make sure to call this method after
      * setting the type of the Trigger frame.
      *
-     * \return a non-const reference to the newly added User Info field
+     * @return a non-const reference to the newly added User Info field
      */
     CtrlTriggerUserInfoField& AddUserInfoField();
     /**
@@ -1204,8 +1207,8 @@
      * a non-const reference to it. Make sure that the type of the given
      * User Info field matches the type of this Trigger Frame.
      *
-     * \param userInfo the User Info field to append to this Trigger Frame
-     * \return a non-const reference to the newly added User Info field
+     * @param userInfo the User Info field to append to this Trigger Frame
+     * @return a non-const reference to the newly added User Info field
      */
     CtrlTriggerUserInfoField& AddUserInfoField(const CtrlTriggerUserInfoField& userInfo);
 
@@ -1216,33 +1219,41 @@
     typedef std::list<CtrlTriggerUserInfoField>::iterator Iterator;
 
     /**
-     * \brief Get a const iterator pointing to the first User Info field in the list.
+     * Remove a User Info field from the Trigger Frame.
+     *
+     * @param userInfoIt an iterator pointing to the User Info field to remove
+     * @return an iterator following the removed User Info field
+     */
+    Iterator RemoveUserInfoField(ConstIterator userInfoIt);
+
+    /**
+     * @brief Get a const iterator pointing to the first User Info field in the list.
      *
-     * \return a const iterator pointing to the first User Info field in the list
+     * @return a const iterator pointing to the first User Info field in the list
      */
     ConstIterator begin() const;
     /**
-     * \brief Get a const iterator indicating past-the-last User Info field in the list.
+     * @brief Get a const iterator indicating past-the-last User Info field in the list.
      *
-     * \return a const iterator indicating past-the-last User Info field in the list
+     * @return a const iterator indicating past-the-last User Info field in the list
      */
     ConstIterator end() const;
     /**
-     * \brief Get an iterator pointing to the first User Info field in the list.
+     * @brief Get an iterator pointing to the first User Info field in the list.
      *
-     * \return an iterator pointing to the first User Info field in the list
+     * @return an iterator pointing to the first User Info field in the list
      */
     Iterator begin();
     /**
-     * \brief Get an iterator indicating past-the-last User Info field in the list.
+     * @brief Get an iterator indicating past-the-last User Info field in the list.
      *
-     * \return an iterator indicating past-the-last User Info field in the list
+     * @return an iterator indicating past-the-last User Info field in the list
      */
     Iterator end();
     /**
-     * \brief Get the number of User Info fields in this Trigger Frame.
+     * @brief Get the number of User Info fields in this Trigger Frame.
      *
-     * \return the number of User Info fields in this Trigger Frame
+     * @return the number of User Info fields in this Trigger Frame
      */
     std::size_t GetNUserInfoFields() const;
     /**
@@ -1250,9 +1261,9 @@
      * the one pointed to by the given iterator) whose AID12 subfield is set to
      * the given value.
      *
-     * \param start a const iterator pointing to the User Info field to start the search from
-     * \param aid12 the value of the AID12 subfield to match
-     * \return a const iterator pointing to the User Info field matching the specified
+     * @param start a const iterator pointing to the User Info field to start the search from
+     * @param aid12 the value of the AID12 subfield to match
+     * @return a const iterator pointing to the User Info field matching the specified
      * criterion, if any, or an iterator indicating past-the-last User Info field.
      */
     ConstIterator FindUserInfoWithAid(ConstIterator start, uint16_t aid12) const;
@@ -1260,8 +1271,8 @@
      * Get a const iterator pointing to the first User Info field found whose AID12
      * subfield is set to the given value.
      *
-     * \param aid12 the value of the AID12 subfield to match
-     * \return a const iterator pointing to the User Info field matching the specified
+     * @param aid12 the value of the AID12 subfield to match
+     * @return a const iterator pointing to the User Info field matching the specified
      * criterion, if any, or an iterator indicating past-the-last User Info field.
      */
     ConstIterator FindUserInfoWithAid(uint16_t aid12) const;
@@ -1270,8 +1281,8 @@
      * the one pointed to by the given iterator) which allocates a Random Access
      * RU for associated stations.
      *
-     * \param start a const iterator pointing to the User Info field to start the search from
-     * \return a const iterator pointing to the User Info field matching the specified
+     * @param start a const iterator pointing to the User Info field to start the search from
+     * @return a const iterator pointing to the User Info field matching the specified
      * criterion, if any, or an iterator indicating past-the-last User Info field.
      */
     ConstIterator FindUserInfoWithRaRuAssociated(ConstIterator start) const;
@@ -1279,7 +1290,7 @@
      * Get a const iterator pointing to the first User Info field found which allocates
      * a Random Access RU for associated stations.
      *
-     * \return a const iterator pointing to the User Info field matching the specified
+     * @return a const iterator pointing to the User Info field matching the specified
      * criterion, if any, or an iterator indicating past-the-last User Info field.
      */
     ConstIterator FindUserInfoWithRaRuAssociated() const;
@@ -1288,8 +1299,8 @@
      * the one pointed to by the given iterator) which allocates a Random Access
      * RU for unassociated stations.
      *
-     * \param start a const iterator pointing to the User Info field to start the search from
-     * \return a const iterator pointing to the User Info field matching the specified
+     * @param start a const iterator pointing to the User Info field to start the search from
+     * @return a const iterator pointing to the User Info field matching the specified
      * criterion, if any, or an iterator indicating past-the-last User Info field.
      */
     ConstIterator FindUserInfoWithRaRuUnassociated(ConstIterator start) const;
@@ -1297,7 +1308,7 @@
      * Get a const iterator pointing to the first User Info field found which allocates
      * a Random Access RU for unassociated stations.
      *
-     * \return a const iterator pointing to the User Info field matching the specified
+     * @return a const iterator pointing to the User Info field matching the specified
      * criterion, if any, or an iterator indicating past-the-last User Info field.
      */
     ConstIterator FindUserInfoWithRaRuUnassociated() const;
@@ -1309,7 +1320,7 @@
      * This function shall be invoked before transmitting and upon receiving
      * a Trigger frame.
      *
-     * \return true if the Trigger frame is valid, false otherwise.
+     * @return true if the Trigger frame is valid, false otherwise.
      */
     bool IsValid() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/edca-parameter-set.h ns-3.44/src/wifi/model/edca-parameter-set.h
--- ns-3.43/src/wifi/model/edca-parameter-set.h	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/edca-parameter-set.h	2025-03-09 16:55:49.783372600 -0700
@@ -15,8 +15,8 @@
 {
 
 /**
- * \brief The EDCA Parameter Set
- * \ingroup wifi
+ * @brief The EDCA Parameter Set
+ * @ingroup wifi
  *
  * This class knows how to serialise and deserialise the EDCA Parameter Set.
  */
@@ -31,230 +31,230 @@
     /**
      * Set the QoS Info field in the EdcaParameterSet information element.
      *
-     * \param qosInfo the QoS Info field in the EdcaParameterSet information element
+     * @param qosInfo the QoS Info field in the EdcaParameterSet information element
      */
     void SetQosInfo(uint8_t qosInfo);
     /**
      * Set the AC_BE AIFSN field in the EdcaParameterSet information element.
      *
-     * \param aifsn the AC_BE AIFSN field in the EdcaParameterSet information element
+     * @param aifsn the AC_BE AIFSN field in the EdcaParameterSet information element
      */
     void SetBeAifsn(uint8_t aifsn);
     /**
      * Set the AC_BE ACI field in the EdcaParameterSet information element.
      *
-     * \param aci the AC_BE ACI field in the EdcaParameterSet information element
+     * @param aci the AC_BE ACI field in the EdcaParameterSet information element
      */
     void SetBeAci(uint8_t aci);
     /**
      * Set the AC_BE CWmin field in the EdcaParameterSet information element.
      *
-     * \param cwMin the AC_BE CWmin field in the EdcaParameterSet information element
+     * @param cwMin the AC_BE CWmin field in the EdcaParameterSet information element
      */
     void SetBeCWmin(uint32_t cwMin);
     /**
      * Set the AC_BE CWmax field in the EdcaParameterSet information element.
      *
-     * \param cwMax the AC_BE CWmax field in the EdcaParameterSet information element
+     * @param cwMax the AC_BE CWmax field in the EdcaParameterSet information element
      */
     void SetBeCWmax(uint32_t cwMax);
     /**
      * Set the AC_BE TXOP Limit field in the EdcaParameterSet information element.
      *
-     * \param txop the AC_BE TXOP Limit field in the EdcaParameterSet information element
+     * @param txop the AC_BE TXOP Limit field in the EdcaParameterSet information element
      */
     void SetBeTxopLimit(uint16_t txop);
     /**
      * Set the AC_BK AIFSN field in the EdcaParameterSet information element.
      *
-     * \param aifsn the AC_BB AIFSN field in the EdcaParameterSet information element
+     * @param aifsn the AC_BB AIFSN field in the EdcaParameterSet information element
      */
     void SetBkAifsn(uint8_t aifsn);
     /**
      * Set the AC_BK ACI field in the EdcaParameterSet information element.
      *
-     * \param aci the AC_BK ACI field in the EdcaParameterSet information element
+     * @param aci the AC_BK ACI field in the EdcaParameterSet information element
      */
     void SetBkAci(uint8_t aci);
     /**
      * Set the AC_BK CWmin field in the EdcaParameterSet information element.
      *
-     * \param cwMin the AC_BK CWmin field in the EdcaParameterSet information element
+     * @param cwMin the AC_BK CWmin field in the EdcaParameterSet information element
      */
     void SetBkCWmin(uint32_t cwMin);
     /**
      * Set the AC_BK CWmax field in the EdcaParameterSet information element.
      *
-     * \param cwMax the AC_BK CWmax field in the EdcaParameterSet information element
+     * @param cwMax the AC_BK CWmax field in the EdcaParameterSet information element
      */
     void SetBkCWmax(uint32_t cwMax);
     /**
      * Set the AC_BK TXOP Limit field in the EdcaParameterSet information element.
      *
-     * \param txop the AC_BK TXOP Limit field in the EdcaParameterSet information element
+     * @param txop the AC_BK TXOP Limit field in the EdcaParameterSet information element
      */
     void SetBkTxopLimit(uint16_t txop);
     /**
      * Set the AC_VI AIFSN field in the EdcaParameterSet information element.
      *
-     * \param aifsn the AC_VI AIFSN field in the EdcaParameterSet information element
+     * @param aifsn the AC_VI AIFSN field in the EdcaParameterSet information element
      */
     void SetViAifsn(uint8_t aifsn);
     /**
      * Set the AC_VI ACI field in the EdcaParameterSet information element.
      *
-     * \param aci the AC_VI ACI field in the EdcaParameterSet information element
+     * @param aci the AC_VI ACI field in the EdcaParameterSet information element
      */
     void SetViAci(uint8_t aci);
     /**
      * Set the AC_VI CWmin field in the EdcaParameterSet information element.
      *
-     * \param cwMin the AC_VI CWmin field in the EdcaParameterSet information element
+     * @param cwMin the AC_VI CWmin field in the EdcaParameterSet information element
      */
     void SetViCWmin(uint32_t cwMin);
     /**
      * Set the AC_VI CWmax field in the EdcaParameterSet information element.
      *
-     * \param cwMax the AC_VI CWmax field in the EdcaParameterSet information element
+     * @param cwMax the AC_VI CWmax field in the EdcaParameterSet information element
      */
     void SetViCWmax(uint32_t cwMax);
     /**
      * Set the AC_VI TXOP Limit field in the EdcaParameterSet information element.
      *
-     * \param txop the AC_VI TXOP Limit field in the EdcaParameterSet information element
+     * @param txop the AC_VI TXOP Limit field in the EdcaParameterSet information element
      */
     void SetViTxopLimit(uint16_t txop);
     /**
      * Set the AC_VO AIFSN field in the EdcaParameterSet information element.
      *
-     * \param aifsn the AC_VO AIFSN field in the EdcaParameterSet information element
+     * @param aifsn the AC_VO AIFSN field in the EdcaParameterSet information element
      */
     void SetVoAifsn(uint8_t aifsn);
     /**
      * Set the AC_VO ACI field in the EdcaParameterSet information element.
      *
-     * \param aci the AC_VO ACI field in the EdcaParameterSet information element
+     * @param aci the AC_VO ACI field in the EdcaParameterSet information element
      */
     void SetVoAci(uint8_t aci);
     /**
      * Set the AC_VO CWmin field in the EdcaParameterSet information element.
      *
-     * \param cwMin the AC_VO CWmin field in the EdcaParameterSet information element
+     * @param cwMin the AC_VO CWmin field in the EdcaParameterSet information element
      */
     void SetVoCWmin(uint32_t cwMin);
     /**
      * Set the AC_VO CWmax field in the EdcaParameterSet information element.
      *
-     * \param cwMax the AC_VO CWmax field in the EdcaParameterSet information element
+     * @param cwMax the AC_VO CWmax field in the EdcaParameterSet information element
      */
     void SetVoCWmax(uint32_t cwMax);
     /**
      * Set the AC_VO TXOP Limit field in the EdcaParameterSet information element.
      *
-     * \param txop the AC_VO TXOP Limit field in the EdcaParameterSet information element
+     * @param txop the AC_VO TXOP Limit field in the EdcaParameterSet information element
      */
     void SetVoTxopLimit(uint16_t txop);
 
     /**
      * Return the QoS Info field in the EdcaParameterSet information element.
      *
-     * \return the QoS Info field in the EdcaParameterSet information element
+     * @return the QoS Info field in the EdcaParameterSet information element
      */
     uint8_t GetQosInfo() const;
     /**
      * Return the AC_BE AIFSN field in the EdcaParameterSet information element.
      *
-     * \return the AC_BE AIFSN field in the EdcaParameterSet information element
+     * @return the AC_BE AIFSN field in the EdcaParameterSet information element
      */
     uint8_t GetBeAifsn() const;
     /**
      * Return the AC_BE CWmin field in the EdcaParameterSet information element.
      *
-     * \return the AC_BE CWmin field in the EdcaParameterSet information element
+     * @return the AC_BE CWmin field in the EdcaParameterSet information element
      */
     uint32_t GetBeCWmin() const;
     /**
      * Return the AC_BE CWmax field in the EdcaParameterSet information element.
      *
-     * \return the AC_BE CWmax field in the EdcaParameterSet information element
+     * @return the AC_BE CWmax field in the EdcaParameterSet information element
      */
     uint32_t GetBeCWmax() const;
     /**
      * Return the AC_BE TXOP Limit field in the EdcaParameterSet information element.
      *
-     * \return the AC_BE TXOP Limit field in the EdcaParameterSet information element
+     * @return the AC_BE TXOP Limit field in the EdcaParameterSet information element
      */
     uint16_t GetBeTxopLimit() const;
     /**
      * Return the AC_BK AIFSN field in the EdcaParameterSet information element.
      *
-     * \return the AC_BK AIFSN field in the EdcaParameterSet information element
+     * @return the AC_BK AIFSN field in the EdcaParameterSet information element
      */
     uint8_t GetBkAifsn() const;
     /**
      * Return the AC_BK CWmin field in the EdcaParameterSet information element.
      *
-     * \return the AC_BK CWmin field in the EdcaParameterSet information element
+     * @return the AC_BK CWmin field in the EdcaParameterSet information element
      */
     uint32_t GetBkCWmin() const;
     /**
      * Return the AC_BK CWmax field in the EdcaParameterSet information element.
      *
-     * \return the AC_BK CWmax field in the EdcaParameterSet information element
+     * @return the AC_BK CWmax field in the EdcaParameterSet information element
      */
     uint32_t GetBkCWmax() const;
     /**
      * Return the AC_BK TXOP Limit field in the EdcaParameterSet information element.
      *
-     * \return the AC_BK TXOP Limit field in the EdcaParameterSet information element
+     * @return the AC_BK TXOP Limit field in the EdcaParameterSet information element
      */
     uint16_t GetBkTxopLimit() const;
     /**
      * Return the AC_VI AIFSN field in the EdcaParameterSet information element.
      *
-     * \return the AC_VI AIFSN field in the EdcaParameterSet information element
+     * @return the AC_VI AIFSN field in the EdcaParameterSet information element
      */
     uint8_t GetViAifsn() const;
     /**
      * Return the AC_VI CWmin field in the EdcaParameterSet information element.
      *
-     * \return the AC_VI CWmin field in the EdcaParameterSet information element
+     * @return the AC_VI CWmin field in the EdcaParameterSet information element
      */
     uint32_t GetViCWmin() const;
     /**
      * Return the AC_VI CWmax field in the EdcaParameterSet information element.
      *
-     * \return the AC_VI CWmax field in the EdcaParameterSet information element
+     * @return the AC_VI CWmax field in the EdcaParameterSet information element
      */
     uint32_t GetViCWmax() const;
     /**
      * Return the AC_VI TXOP Limit field in the EdcaParameterSet information element.
      *
-     * \return the AC_VI TXOP Limit field in the EdcaParameterSet information element
+     * @return the AC_VI TXOP Limit field in the EdcaParameterSet information element
      */
     uint16_t GetViTxopLimit() const;
     /**
      * Return the AC_VO AIFSN field in the EdcaParameterSet information element.
      *
-     * \return the AC_VO AIFSN field in the EdcaParameterSet information element
+     * @return the AC_VO AIFSN field in the EdcaParameterSet information element
      */
     uint8_t GetVoAifsn() const;
     /**
      * Return the AC_VO CWmin field in the EdcaParameterSet information element.
      *
-     * \return the AC_VO CWmin field in the EdcaParameterSet information element
+     * @return the AC_VO CWmin field in the EdcaParameterSet information element
      */
     uint32_t GetVoCWmin() const;
     /**
      * Return the AC_VO CWmax field in the EdcaParameterSet information element.
      *
-     * \return the AC_VO CWmax field in the EdcaParameterSet information element
+     * @return the AC_VO CWmax field in the EdcaParameterSet information element
      */
     uint32_t GetVoCWmax() const;
     /**
      * Return the AC_VO TXOP Limit field in the EdcaParameterSet information element.
      *
-     * \return the AC_VO TXOP Limit field in the EdcaParameterSet information element
+     * @return the AC_VO TXOP Limit field in the EdcaParameterSet information element
      */
     uint16_t GetVoTxopLimit() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/eht/advanced-ap-emlsr-manager.cc ns-3.44/src/wifi/model/eht/advanced-ap-emlsr-manager.cc
--- ns-3.43/src/wifi/model/eht/advanced-ap-emlsr-manager.cc	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/eht/advanced-ap-emlsr-manager.cc	2025-03-09 16:55:49.783372600 -0700
@@ -56,7 +56,8 @@
             .AddAttribute("UpdateCwAfterFailedIcf",
                           "Whether the AP MLD shall double the CW upon CTS timeout after an "
                           "MU-RTS in case all the clients solicited by the MU-RTS are EMLSR "
-                          "clients that have sent (or are sending) a frame to the AP",
+                          "clients that have sent (or are sending) a frame to the AP on "
+                          "another link.",
                           BooleanValue(true),
                           MakeBooleanAccessor(&AdvancedApEmlsrManager::m_updateCwAfterFailedIcf),
                           MakeBooleanChecker());
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/eht/advanced-ap-emlsr-manager.h ns-3.44/src/wifi/model/eht/advanced-ap-emlsr-manager.h
--- ns-3.43/src/wifi/model/eht/advanced-ap-emlsr-manager.h	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/eht/advanced-ap-emlsr-manager.h	2025-03-09 16:55:49.783372600 -0700
@@ -24,7 +24,7 @@
 class WifiTxVector;
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * AdvancedApEmlsrManager is an advanced AP EMLSR manager.
  */
@@ -32,8 +32,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -54,10 +54,10 @@
     /**
      * Store information about the MAC header of the MPDU being received on the given link.
      *
-     * \param linkId the ID of the given link
-     * \param macHdr the MAC header of the MPDU being received
-     * \param txVector the TXVECTOR used to transmit the PSDU
-     * \param psduDuration the remaining duration of the PSDU
+     * @param linkId the ID of the given link
+     * @param macHdr the MAC header of the MPDU being received
+     * @param txVector the TXVECTOR used to transmit the PSDU
+     * @param psduDuration the remaining duration of the PSDU
      */
     void ReceivedMacHdr(uint8_t linkId,
                         const WifiMacHeader& macHdr,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/eht/advanced-emlsr-manager.cc ns-3.44/src/wifi/model/eht/advanced-emlsr-manager.cc
--- ns-3.43/src/wifi/model/eht/advanced-emlsr-manager.cc	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/eht/advanced-emlsr-manager.cc	2025-03-09 16:55:49.783372600 -0700
@@ -13,6 +13,7 @@
 #include "ns3/boolean.h"
 #include "ns3/log.h"
 #include "ns3/wifi-net-device.h"
+#include "ns3/wifi-phy-listener.h"
 #include "ns3/wifi-phy.h"
 
 #include <algorithm>
@@ -24,6 +25,85 @@
 
 NS_OBJECT_ENSURE_REGISTERED(AdvancedEmlsrManager);
 
+/**
+ * PHY listener connected to the main PHY while operating on the link of an aux PHY that is
+ * not TX capable.
+ *
+ * PHY notifications are forwarded to this EMLSR manager one timestep later because this EMLSR
+ * manager may then decide to switch the main PHY back to the preferred link. Given that notifying
+ * a PHY listener is only one of the actions that are performed when handling events such as RX end
+ * or CCA busy start, it is not a good idea to request a main PHY switch while performing other
+ * actions. Forwarding notifications a timestep later allows to first complete the handling of the
+ * given event and then (possibly) starting a main PHY switch.
+ */
+class EmlsrPhyListener : public WifiPhyListener
+{
+  public:
+    /**
+     * Constructor
+     *
+     * @param emlsrManager the EMLSR manager
+     */
+    EmlsrPhyListener(Ptr<AdvancedEmlsrManager> emlsrManager)
+        : m_emlsrManager(emlsrManager)
+    {
+    }
+
+    void NotifyRxStart(Time /* duration */) override
+    {
+        Simulator::Schedule(TimeStep(1),
+                            &AdvancedEmlsrManager::InterruptSwitchMainPhyBackTimerIfNeeded,
+                            m_emlsrManager);
+    }
+
+    void NotifyRxEndOk() override
+    {
+        Simulator::Schedule(TimeStep(1),
+                            &AdvancedEmlsrManager::InterruptSwitchMainPhyBackTimerIfNeeded,
+                            m_emlsrManager);
+    }
+
+    void NotifyRxEndError() override
+    {
+    }
+
+    void NotifyTxStart(Time /* duration */, dBm_u /* txPower */) override
+    {
+    }
+
+    void NotifyCcaBusyStart(Time /* duration */,
+                            WifiChannelListType /* channelType */,
+                            const std::vector<Time>& /* per20MhzDurations */) override
+    {
+        Simulator::Schedule(TimeStep(1),
+                            &AdvancedEmlsrManager::InterruptSwitchMainPhyBackTimerIfNeeded,
+                            m_emlsrManager);
+    }
+
+    void NotifySwitchingStart(Time /* duration */) override
+    {
+    }
+
+    void NotifySleep() override
+    {
+    }
+
+    void NotifyOff() override
+    {
+    }
+
+    void NotifyWakeup() override
+    {
+    }
+
+    void NotifyOn() override
+    {
+    }
+
+  private:
+    Ptr<AdvancedEmlsrManager> m_emlsrManager; //!< the EMLSR manager
+};
+
 TypeId
 AdvancedEmlsrManager::GetTypeId()
 {
@@ -32,12 +112,6 @@
             .SetParent<DefaultEmlsrManager>()
             .SetGroupName("Wifi")
             .AddConstructor<AdvancedEmlsrManager>()
-            .AddAttribute("UseNotifiedMacHdr",
-                          "Whether to use the information about the MAC header of the MPDU "
-                          "being received, if notified by the PHY.",
-                          BooleanValue(true),
-                          MakeBooleanAccessor(&AdvancedEmlsrManager::m_useNotifiedMacHdr),
-                          MakeBooleanChecker())
             .AddAttribute("AllowUlTxopInRx",
                           "Whether a (main or aux) PHY is allowed to start an UL TXOP if "
                           "another PHY is receiving a PPDU (possibly starting a DL TXOP). "
@@ -64,7 +138,7 @@
                           "Duration of the timer started in case of non-TX capable aux PHY (that "
                           "does not switch link) when medium is sensed busy during the PIFS "
                           "interval preceding/following the main PHY switch end. When the timer "
-                          "expires, the main PHY is switched back to the primary link.",
+                          "expires, the main PHY is switched back to the preferred link.",
                           TimeValue(MilliSeconds(5)),
                           MakeTimeAccessor(&AdvancedEmlsrManager::m_switchMainPhyBackDelay),
                           MakeTimeChecker());
@@ -74,6 +148,7 @@
 AdvancedEmlsrManager::AdvancedEmlsrManager()
 {
     NS_LOG_FUNCTION(this);
+    m_phyListener = std::make_shared<EmlsrPhyListener>(this);
 }
 
 AdvancedEmlsrManager::~AdvancedEmlsrManager()
@@ -91,10 +166,41 @@
             "PhyRxMacHeaderEnd",
             MakeCallback(&AdvancedEmlsrManager::ReceivedMacHdr, this).Bind(phy));
     }
+    if (!GetAuxPhyTxCapable())
+    {
+        GetStaMac()->GetDevice()->GetPhy(GetMainPhyId())->UnregisterListener(m_phyListener);
+    }
+    m_phyListener.reset();
     DefaultEmlsrManager::DoDispose();
 }
 
 void
+AdvancedEmlsrManager::NotifyEmlsrModeChanged()
+{
+    NS_LOG_FUNCTION(this);
+
+    // disconnect callbacks on all links
+    for (const auto& linkId : GetStaMac()->GetLinkIds())
+    {
+        GetStaMac()->GetChannelAccessManager(linkId)->TraceDisconnectWithoutContext(
+            "NSlotsLeftAlert",
+            MakeCallback(&AdvancedEmlsrManager::SwitchMainPhyIfTxopToBeGainedByAuxPhy, this));
+    }
+
+    // connect callbacks on EMLSR links
+    for (const auto& emlsrLinkId : GetEmlsrLinks())
+    {
+        GetStaMac()
+            ->GetChannelAccessManager(emlsrLinkId)
+            ->TraceConnectWithoutContext(
+                "NSlotsLeftAlert",
+                MakeCallback(&AdvancedEmlsrManager::SwitchMainPhyIfTxopToBeGainedByAuxPhy, this));
+    }
+
+    DefaultEmlsrManager::NotifyEmlsrModeChanged();
+}
+
+void
 AdvancedEmlsrManager::DoSetWifiMac(Ptr<StaWifiMac> mac)
 {
     NS_LOG_FUNCTION(this << mac);
@@ -105,6 +211,10 @@
             "PhyRxMacHeaderEnd",
             MakeCallback(&AdvancedEmlsrManager::ReceivedMacHdr, this).Bind(phy));
     }
+    if (!GetAuxPhyTxCapable())
+    {
+        mac->GetDevice()->GetPhy(GetMainPhyId())->RegisterListener(m_phyListener);
+    }
 }
 
 std::pair<bool, Time>
@@ -115,90 +225,34 @@
     // prevent or allow an UL TXOP depending on whether another PHY is receiving a PPDU
     for (const auto id : GetStaMac()->GetLinkIds())
     {
-        if (id != linkId && GetStaMac()->IsEmlsrLink(id))
+        if (id == linkId)
         {
-            auto phy = GetStaMac()->GetWifiPhy(id);
+            continue;
+        }
 
-            if (auto macHdr = GetEhtFem(id)->GetReceivedMacHdr(); macHdr && m_useNotifiedMacHdr)
-            {
-                NS_ASSERT(phy &&
-                          phy->GetState()->GetLastTime({WifiPhyState::RX}) == Simulator::Now());
-                // we are receiving the MAC payload of a PSDU; if the PSDU being received on
-                // another link is an ICF, give up the TXOP and restart channel access at the
-                // end of PSDU reception. Note that we cannot be sure that the PSDU being received
-                // is an ICF addressed to us until we receive the entire PSDU
-                if (const auto& hdr = macHdr->get();
-                    hdr.IsTrigger() &&
-                    (hdr.GetAddr1().IsBroadcast() || hdr.GetAddr1() == GetEhtFem(id)->GetAddress()))
-                {
-                    return {false, phy->GetDelayUntilIdle()};
-                }
-                continue;
-            }
+        const auto [maybeIcf, delay] = CheckPossiblyReceivingIcf(id);
 
-            if (phy && phy->IsReceivingPhyHeader())
-            {
-                // we don't know yet the type of the frame being received; prevent or allow
-                // the UL TXOP based on user configuration
-                if (!m_allowUlTxopInRx)
-                {
-                    // retry channel access after the end of the current PHY header field
-                    return {false, phy->GetDelayUntilIdle()};
-                }
-                continue;
-            }
+        if (!maybeIcf)
+        {
+            // not receiving anything or receiving something that is certainly not an ICF
+            continue;
+        }
 
-            if (phy && phy->IsStateRx())
-            {
-                // we don't know yet the type of the frame being received; prevent or allow
-                // the UL TXOP based on user configuration
-                if (!m_allowUlTxopInRx)
-                {
-                    if (!m_useNotifiedMacHdr)
-                    {
-                        // restart channel access at the end of PSDU reception
-                        return {false, phy->GetDelayUntilIdle()};
-                    }
-
-                    // retry channel access after the expected end of the MAC header reception
-                    auto macHdrSize = WifiMacHeader(WIFI_MAC_QOSDATA).GetSerializedSize() +
-                                      4 /* A-MPDU subframe header length */;
-                    auto ongoingRxInfo = GetEhtFem(id)->GetOngoingRxInfo();
-                    // if a PHY is in RX state, it should have info about received MAC header.
-                    // The exception is represented by this situation:
-                    // - an aux PHY is disconnected from the MAC stack because the main PHY is
-                    //   operating on its link
-                    // - the main PHY notifies the MAC header info to the FEM and then leaves the
-                    //   link (e.g., because it recognizes that the MPDU is not addressed to the
-                    //   EMLSR client). Disconnecting the main PHY from the MAC stack causes the
-                    //   MAC header info to be discarded by the FEM
-                    // - the aux PHY is re-connected to the MAC stack and is still in RX state
-                    //   when the main PHY gets channel access on another link (and we get here)
-                    if (!ongoingRxInfo.has_value())
-                    {
-                        NS_ASSERT_MSG(phy != GetStaMac()->GetDevice()->GetPhy(GetMainPhyId()),
-                                      "Main PHY should have MAC header info when in RX state");
-                        // we are in the situation described above; if the MPDU being received
-                        // by the aux PHY is not addressed to the EMLSR client, we can ignore it
-                        continue;
-                    }
-                    const auto& txVector = ongoingRxInfo->get().txVector;
-                    if (txVector.IsMu())
-                    {
-                        // this is not an ICF, ignore it
-                        continue;
-                    }
-                    auto macHdrDuration = DataRate(txVector.GetMode().GetDataRate(txVector))
-                                              .CalculateBytesTxTime(macHdrSize);
-                    const auto timeSinceRxStart =
-                        Simulator::Now() - phy->GetState()->GetLastTime({WifiPhyState::CCA_BUSY});
-                    return {false, Max(macHdrDuration - timeSinceRxStart, Time{0})};
-                }
-                continue;
-            }
+        // a PPDU that may be an ICF is being received
+        if (!m_allowUlTxopInRx)
+        {
+            return {false, delay};
         }
     }
 
+    if (GetStaMac()->GetWifiPhy(linkId) == GetStaMac()->GetDevice()->GetPhy(GetMainPhyId()) &&
+        !m_auxPhyTxCapable && m_ccaLastPifs.IsPending())
+    {
+        // main PHY has got access on the link it switched to (because the aux PHY is not TX
+        // capable) before a PIFS interval was elapsed: do not start the TXOP now
+        return {false, Time{0}};
+    }
+
     return {true, Time{0}};
 }
 
@@ -225,13 +279,27 @@
         ongoingTxopEnd.Cancel();
         // this method is a callback connected to the PhyRxMacHeaderEnd trace source of WifiPhy
         // and is called within a for loop that executes all the callbacks. The call to NotifyTxop
-        // below leads the main PHY to be connected back to the primary link, thus
-        // the ResetPhy() method of the FEM on the non-primary link is called, which disconnects
+        // below leads the main PHY to be connected back to the preferred link, thus
+        // the ResetPhy() method of the FEM on the auxiliary link is called, which disconnects
         // another callback (FEM::ReceivedMacHdr) from the PhyRxMacHeaderEnd trace source of
         // the main PHY, thus invalidating the list of callbacks on which the for loop iterates.
         // Hence, schedule the call to NotifyTxopEnd to execute it outside such for loop.
         Simulator::ScheduleNow(&AdvancedEmlsrManager::NotifyTxopEnd, this, *linkId, false, false);
     }
+
+    // if the MAC header has been received on the link on which the main PHY is operating, the
+    // switch main PHY back timer is running and channel access is not expected to be gained by
+    // the main PHY before the switch main PHY back timer expires (plus a channel switch delay),
+    // try to switch the main PHY back to the preferred link
+    if (m_switchMainPhyBackEvent.IsPending() &&
+        phy == GetStaMac()->GetDevice()->GetPhy(GetMainPhyId()) &&
+        !GetExpectedAccessWithinDelay(*linkId,
+                                      Simulator::GetDelayLeft(m_switchMainPhyBackEvent) +
+                                          phy->GetChannelSwitchDelay()))
+    {
+        m_switchMainPhyBackEvent.Cancel();
+        SwitchMainPhyBackDelayExpired(*linkId);
+    }
 }
 
 void
@@ -262,29 +330,36 @@
     // starts switching to a link on which an aux PHY gained a TXOP and sent an RTS, but the CTS
     // is not received and the UL TXOP ends before the main PHY channel switch is completed.
     // In such cases, wait until the main PHY channel switch is completed (unless the channel
-    // switching can be interrupted) before requesting a new channel switch. Given that the
-    // TXOP ended, the event to put the aux PHY to sleep can be cancelled.
+    // switching can be interrupted) before requesting a new channel switch.
     // Backoff shall not be reset on the link left by the main PHY because a TXOP ended and
     // a new backoff value must be generated.
-    m_auxPhyToSleepEvent.Cancel();
-
     if (m_switchAuxPhy || !mainPhy->IsStateSwitching() || m_interruptSwitching)
     {
         NS_ASSERT_MSG(
             !m_switchAuxPhy || m_mainPhySwitchInfo.end >= Simulator::Now(),
             "Aux PHY next link ID should have a value when interrupting a main PHY switch");
         uint8_t nextLinkId = m_switchAuxPhy ? m_mainPhySwitchInfo.from : GetMainPhyId();
-        SwitchMainPhy(nextLinkId, false, DONT_RESET_BACKOFF, REQUEST_ACCESS);
+        const auto delay = mainPhy->IsStateSwitching() ? mainPhy->GetDelayUntilIdle() : Time{0};
+        SwitchMainPhy(nextLinkId,
+                      false,
+                      DONT_RESET_BACKOFF,
+                      REQUEST_ACCESS,
+                      EmlsrTxopEndedTrace(delay));
     }
     else
     {
         // delay link switch until current channel switching is completed
-        Simulator::Schedule(mainPhy->GetDelayUntilIdle(), [=, this]() {
-            // request the main PHY to switch back to the primary link only if in the meantime
+        const auto delay = mainPhy->GetDelayUntilIdle();
+        Simulator::Schedule(delay, [=, this]() {
+            // request the main PHY to switch back to the preferred link only if in the meantime
             // no TXOP started on another link (which will require the main PHY to switch link)
             if (!GetEhtFem(linkId)->UsingOtherEmlsrLink())
             {
-                SwitchMainPhy(GetMainPhyId(), false, DONT_RESET_BACKOFF, REQUEST_ACCESS);
+                SwitchMainPhy(GetMainPhyId(),
+                              false,
+                              DONT_RESET_BACKOFF,
+                              REQUEST_ACCESS,
+                              EmlsrTxopEndedTrace(delay));
             }
         });
     }
@@ -319,19 +394,9 @@
         return {false, timeToCtsEnd};
     }
 
-    // TXOP can be started, schedule main PHY switch. Main PHY shall terminate the channel switch
-    // at the end of CTS reception
-    const auto delay = timeToCtsEnd - switchingTime;
-
-    NS_ASSERT(delay.IsPositive());
-    NS_LOG_DEBUG("Schedule main Phy switch in " << delay.As(Time::US));
-    m_ulMainPhySwitch[linkId] = Simulator::Schedule(delay,
-                                                    &AdvancedEmlsrManager::SwitchMainPhy,
-                                                    this,
-                                                    linkId,
-                                                    false,
-                                                    RESET_BACKOFF,
-                                                    DONT_REQUEST_ACCESS);
+    // TXOP can be started, main PHY will be scheduled to switch by NotifyRtsSent as soon as the
+    // transmission of the RTS is notified
+    m_switchMainPhyOnRtsTx[linkId] = Simulator::Now();
 
     return {true, Time{0}};
 }
@@ -348,7 +413,7 @@
     // check CCA on the entire channel
     auto width = caManager->GetLargestIdlePrimaryChannel(pifs, Simulator::Now());
 
-    if (!isBusy && width > 0)
+    if (!isBusy && width > MHz_u{0})
     {
         // medium idle, start TXOP
         width = std::min(width, GetChannelForMainPhy(linkId).GetTotalWidth());
@@ -363,13 +428,26 @@
             }
             else if (!m_switchAuxPhy)
             {
-                // switch main PHY back to primary link if SwitchAuxPhy is false
-                SwitchMainPhyBackToPrimaryLink(linkId);
+                // switch main PHY back to preferred link if SwitchAuxPhy is false
+                SwitchMainPhyBackToPreferredLink(linkId, EmlsrSwitchMainPhyBackTrace(true));
             }
         });
     }
     else
     {
+        // medium busy, check when access may be granted
+        if (!GetExpectedAccessWithinDelay(linkId,
+                                          m_switchMainPhyBackDelay + phy->GetChannelSwitchDelay()))
+        {
+            NS_LOG_DEBUG("No AC is expected to get backoff soon, switch main PHY back");
+            if (auto mainPhy = GetStaMac()->GetDevice()->GetPhy(GetMainPhyId());
+                !mainPhy->IsStateSwitching())
+            {
+                SwitchMainPhyBackDelayExpired(linkId);
+            }
+            return;
+        }
+
         // medium busy, restart channel access
         NS_LOG_DEBUG("Medium busy in the last PIFS interval");
         edca->NotifyChannelReleased(linkId); // to set access to NOT_REQUESTED
@@ -380,12 +458,103 @@
         // the main PHY must stay for some time on this link to check if it gets channel access.
         // The timer is stopped if a DL or UL TXOP is started. When the timer expires, the main PHY
         // switches back to the preferred link if SwitchAuxPhy is false
-        m_switchMainPhyBackEvent = Simulator::Schedule(m_switchMainPhyBackDelay, [this, linkId]() {
-            if (!m_switchAuxPhy)
+        m_switchMainPhyBackEvent.Cancel();
+        m_switchMainPhyBackEvent =
+            Simulator::Schedule(m_switchMainPhyBackDelay,
+                                &AdvancedEmlsrManager::SwitchMainPhyBackDelayExpired,
+                                this,
+                                linkId);
+    }
+}
+
+void
+AdvancedEmlsrManager::SwitchMainPhyBackDelayExpired(uint8_t linkId)
+{
+    NS_LOG_FUNCTION(this << linkId);
+
+    if (m_switchAuxPhy)
+    {
+        return; // nothing to do
+    }
+
+    Time extension{0};
+
+    // check if the timer must be restarted because a frame is being received on any link
+    for (const auto id : GetStaMac()->GetLinkIds())
+    {
+        auto phy = GetStaMac()->GetWifiPhy(id);
+
+        if (!phy || !GetStaMac()->IsEmlsrLink(id))
+        {
+            continue;
+        }
+
+        if (!GetEhtFem(id)->VirtualCsMediumIdle() &&
+            GetEhtFem(id)->GetTxopHolder() != GetEhtFem(id)->GetBssid())
+        {
+            NS_LOG_DEBUG("NAV is set and TXOP holder is not the associated AP MLD on link " << +id);
+            continue;
+        }
+
+        const auto [maybeIcf, delay] = CheckPossiblyReceivingIcf(id);
+
+        if (maybeIcf)
+        {
+            extension = Max(extension, delay);
+        }
+        else if (id == linkId && phy->IsStateIdle())
+        {
+            // this is the link on which the main PHY is operating. If an AC with traffic is
+            // expected to get channel access soon (within a channel switch delay), restart
+            // the timer to have the main PHY stay a bit longer on this link
+            if (GetExpectedAccessWithinDelay(linkId, phy->GetChannelSwitchDelay()))
             {
-                SwitchMainPhyBackToPrimaryLink(linkId);
+                extension = Max(extension, phy->GetChannelSwitchDelay());
             }
-        });
+        }
+    }
+
+    if (extension.IsStrictlyPositive())
+    {
+        NS_LOG_DEBUG("Restarting the timer, check again in " << extension.As(Time::US));
+        m_switchMainPhyBackEvent =
+            Simulator::Schedule(extension,
+                                &AdvancedEmlsrManager::SwitchMainPhyBackDelayExpired,
+                                this,
+                                linkId);
+        return;
+    }
+
+    // no need to wait further, switch the main PHY back to the preferred link
+    SwitchMainPhyBackToPreferredLink(linkId, EmlsrSwitchMainPhyBackTrace(false));
+}
+
+void
+AdvancedEmlsrManager::InterruptSwitchMainPhyBackTimerIfNeeded()
+{
+    NS_LOG_FUNCTION(this);
+
+    if (!m_switchMainPhyBackEvent.IsPending())
+    {
+        return; // nothing to do
+    }
+
+    // a busy event occurred, check if the main PHY has to switch back to the preferred link
+    auto mainPhy = GetStaMac()->GetDevice()->GetPhy(GetMainPhyId());
+    auto linkId = GetStaMac()->GetLinkForPhy(GetMainPhyId());
+
+    if (!linkId.has_value())
+    {
+        NS_LOG_DEBUG("Main PHY is not operating on any link");
+        return;
+    }
+
+    const auto delay =
+        Simulator::GetDelayLeft(m_switchMainPhyBackEvent) + mainPhy->GetChannelSwitchDelay();
+    if (!GetExpectedAccessWithinDelay(*linkId, delay))
+    {
+        m_switchMainPhyBackEvent.Cancel();
+        SwitchMainPhyBackDelayExpired(*linkId);
     }
 }
 
@@ -406,9 +575,9 @@
 }
 
 bool
-AdvancedEmlsrManager::RequestMainPhyToSwitch(uint8_t linkId, AcIndex aci)
+AdvancedEmlsrManager::RequestMainPhyToSwitch(uint8_t linkId, AcIndex aci, const Time& delay)
 {
-    NS_LOG_FUNCTION(this << linkId << aci);
+    NS_LOG_FUNCTION(this << linkId << aci << delay.As(Time::US));
 
     // the aux PHY is not TX capable; check if main PHY has to switch to the aux PHY's link
     auto mainPhy = GetStaMac()->GetDevice()->GetPhy(m_mainPhyId);
@@ -428,53 +597,38 @@
         return false;
     }
 
-    switch (mainPhy->GetState()->GetState())
+    // delay until the earliest time the main PHY can access medium on the aux PHY link
+    auto minDelay = mainPhy->GetChannelSwitchDelay();
+    if (!m_useAuxPhyCca && (GetChannelForAuxPhy(linkId).GetTotalWidth() <
+                            GetChannelForMainPhy(linkId).GetTotalWidth()))
     {
-    case WifiPhyState::IDLE:
-        // proceed to try requesting main PHY to switch
-        break;
-    case WifiPhyState::CCA_BUSY:
-        // if the main PHY is receiving the PHY header of a PPDU, we decide to proceed or give up
-        // based on the AllowUlTxopInRx attribute
-        if (mainPhy->IsReceivingPhyHeader() && !m_allowUlTxopInRx)
-        {
-            NS_LOG_DEBUG("Main PHY receiving PHY header and AllowUlTxopInRx is false");
-            return false;
-        }
-        break;
-    case WifiPhyState::RX:
-        if (auto macHdr = GetEhtFem(*mainPhyLinkId)->GetReceivedMacHdr())
-        {
-            // information on the MAC header of the PSDU being received is available; if we cannot
-            // use it or the main PHY is receiving an ICF, give up requesting main PHY to switch
-            if (const auto& hdr = macHdr->get();
-                !m_useNotifiedMacHdr ||
-                (hdr.IsTrigger() && (hdr.GetAddr1().IsBroadcast() ||
-                                     hdr.GetAddr1() == GetEhtFem(*mainPhyLinkId)->GetAddress())))
-            {
-                NS_LOG_DEBUG("Receiving an ICF or cannot use MAC header information");
-                return false;
-            }
-        }
-        // information on the MAC header of the PSDU being received is not available, we decide to
-        // proceed or give up based on the AllowUlTxopInRx attribute
-        else if (!m_allowUlTxopInRx)
-        {
-            NS_LOG_DEBUG("Receiving PSDU, no MAC header information, AllowUlTxopInRx is false");
-            return false;
-        }
-        break;
-    default:
-        NS_LOG_DEBUG("Cannot request main PHY to switch when in state "
-                     << mainPhy->GetState()->GetState());
+        // cannot use aux PHY CCA
+        minDelay += GetStaMac()->GetWifiPhy(linkId)->GetPifs();
+    }
+    minDelay = std::max(delay, minDelay);
+
+    if (const auto elapsed = GetElapsedMediumSyncDelayTimer(linkId);
+        elapsed && MediumSyncDelayNTxopsExceeded(linkId) &&
+        (GetMediumSyncDuration() - *elapsed > minDelay))
+    {
+        NS_LOG_DEBUG("No more TXOP attempts allowed on aux PHY link and MSD timer still running");
         return false;
     }
 
-    // request to switch main PHY if we expect the main PHY to get channel access on this link
-    // more quickly, i.e., if ALL the ACs with queued frames (that can be transmitted on the link
-    // on which the main PHY is currently operating) and with priority higher than or equal to
-    // that of the AC for which Aux PHY gained TXOP have their backoff counter greater than the
-    // channel switch delay plus PIFS
+    // DoGetDelayUntilAccessRequest has already checked if the main PHY is receiving an ICF
+    if (const auto state = mainPhy->GetState()->GetState();
+        state != WifiPhyState::IDLE && state != WifiPhyState::CCA_BUSY && state != WifiPhyState::RX)
+    {
+        NS_LOG_DEBUG("Cannot request main PHY to switch when in state " << state);
+        return false;
+    }
+
+    // request to switch main PHY if we expect the main PHY to get channel access on this link more
+    // quickly, i.e., if ALL the ACs with queued frames (that can be transmitted on the link on
+    // which the main PHY is currently operating) and with priority higher than or equal to that of
+    // the AC for which Aux PHY gained TXOP have their backoff counter greater than the maximum
+    // between the expected delay in gaining channel access and the channel switch delay (plus PIFS
+    // if we cannot use aux PHY CCA)
 
     auto requestSwitch = false;
     const auto now = Simulator::Now();
@@ -489,11 +643,9 @@
             const auto backoffEnd =
                 GetStaMac()->GetChannelAccessManager(*mainPhyLinkId)->GetBackoffEndFor(edca);
             NS_LOG_DEBUG("Backoff end for " << acIndex
-                                            << " on primary link: " << backoffEnd.As(Time::US));
+                                            << " on preferred link: " << backoffEnd.As(Time::US));
 
-            if (backoffEnd <= now + mainPhy->GetChannelSwitchDelay() +
-                                  GetStaMac()->GetWifiPhy(linkId)->GetPifs() &&
-                edca->HasFramesToTransmit(*mainPhyLinkId))
+            if ((backoffEnd <= now + minDelay) && edca->HasFramesToTransmit(*mainPhyLinkId))
             {
                 requestSwitch = false;
                 break;
@@ -513,7 +665,18 @@
                   "This function should only be called if aux PHY is not TX capable");
     auto mainPhy = GetStaMac()->GetDevice()->GetPhy(m_mainPhyId);
 
-    if (RequestMainPhyToSwitch(linkId, aci))
+    if (mainPhy->IsStateSwitching() && m_mainPhySwitchInfo.to == linkId)
+    {
+        // the main PHY is switching to the link on which the aux PHY gained a TXOP. This can
+        // happen, e.g., if the main PHY was requested to switch to that link before the backoff
+        // counter reached zero. Or, this can happen in case of internal collision: the first AC
+        // requests the main PHY to switch and the second one finds the main PHY to be switching.
+        // In both cases, we do nothing because we have already scheduled the necessary actions
+        NS_LOG_DEBUG("Main PHY is already switching to link " << +linkId);
+        return;
+    }
+
+    if (RequestMainPhyToSwitch(linkId, aci, Time{0}))
     {
         const auto auxPhy = GetStaMac()->GetWifiPhy(linkId);
         const auto pifs = auxPhy->GetSifs() + auxPhy->GetSlot();
@@ -544,7 +707,18 @@
         }
 
         // switch main PHY
-        SwitchMainPhy(linkId, false, RESET_BACKOFF, DONT_REQUEST_ACCESS);
+        Time remNav{0};
+        if (const auto mainPhyLinkId = GetStaMac()->GetLinkForPhy(mainPhy))
+        {
+            auto mainPhyNavEnd = GetStaMac()->GetChannelAccessManager(*mainPhyLinkId)->GetNavEnd();
+            remNav = Max(remNav, mainPhyNavEnd - Simulator::Now());
+        }
+
+        SwitchMainPhy(linkId,
+                      false,
+                      RESET_BACKOFF,
+                      DONT_REQUEST_ACCESS,
+                      EmlsrUlTxopAuxPhyNotTxCapableTrace(aci, Time{0}, remNav));
         return;
     }
 
@@ -598,4 +772,148 @@
     });
 }
 
+void
+AdvancedEmlsrManager::SwitchMainPhyIfTxopToBeGainedByAuxPhy(uint8_t linkId,
+                                                            AcIndex aci,
+                                                            const Time& delay)
+{
+    NS_LOG_FUNCTION(this << linkId << aci << delay.As(Time::US));
+
+    if (m_auxPhyTxCapable)
+    {
+        NS_LOG_DEBUG("Nothing to do if aux PHY is TX capable");
+        return;
+    }
+
+    if (!delay.IsStrictlyPositive())
+    {
+        NS_LOG_DEBUG("Do nothing if delay is not strictly positive");
+        return;
+    }
+
+    if (GetEhtFem(linkId)->UsingOtherEmlsrLink())
+    {
+        NS_LOG_DEBUG("Do nothing because another EMLSR link is being used");
+        return;
+    }
+
+    if (!DoGetDelayUntilAccessRequest(linkId).first)
+    {
+        NS_LOG_DEBUG("Do nothing because a frame is being received on another EMLSR link");
+        return;
+    }
+
+    auto mainPhy = GetStaMac()->GetDevice()->GetPhy(m_mainPhyId);
+    auto phy = GetStaMac()->GetWifiPhy(linkId);
+
+    if (!phy || phy == mainPhy)
+    {
+        NS_LOG_DEBUG("No aux PHY is operating on link " << +linkId);
+        return;
+    }
+
+    if (!RequestMainPhyToSwitch(linkId, aci, delay))
+    {
+        NS_LOG_DEBUG("Chosen not to request the main PHY to switch");
+        if (const auto untilIdle = mainPhy->GetDelayUntilIdle();
+            untilIdle.IsStrictlyPositive() && untilIdle < delay)
+        {
+            NS_LOG_DEBUG("Retrying in " << untilIdle.As(Time::US));
+            Simulator::Schedule(untilIdle,
+                                &AdvancedEmlsrManager::SwitchMainPhyIfTxopToBeGainedByAuxPhy,
+                                this,
+                                linkId,
+                                aci,
+                                delay - untilIdle);
+        }
+        return;
+    }
+
+    // switch main PHY
+
+    // use aux PHY CCA (if allowed) if the backoff has already counted down to zero on the aux PHY
+    // link when the main PHY completes the switch
+    const auto edca = GetStaMac()->GetQosTxop(aci);
+    const auto cam = GetStaMac()->GetChannelAccessManager(linkId);
+    const auto auxPhy = GetStaMac()->GetWifiPhy(linkId);
+    const auto switchDelay = mainPhy->GetChannelSwitchDelay();
+    const auto now = Simulator::Now();
+    const auto auxPhyCcaCanBeUsed =
+        m_useAuxPhyCca || (GetChannelForAuxPhy(linkId).GetTotalWidth() >=
+                           GetChannelForMainPhy(linkId).GetTotalWidth());
+    const auto backoffEndBeforeSwitch = (cam->GetBackoffEndFor(edca) - now) <= switchDelay;
+
+    if (auxPhyCcaCanBeUsed && backoffEndBeforeSwitch)
+    {
+        NS_LOG_DEBUG("Schedule CCA check at the end of main PHY switch");
+        m_ccaLastPifs = Simulator::Schedule(switchDelay, [=, this]() {
+            // check NAV and CCA only if the backoff actually counted down to zero already
+            if (cam->GetBackoffEndFor(edca) <= Simulator::Now())
+            {
+                CheckNavAndCcaLastPifs(auxPhy, linkId, edca);
+            }
+        });
+    }
+
+    Time remNav{0};
+    if (const auto mainPhyLinkId = GetStaMac()->GetLinkForPhy(mainPhy))
+    {
+        auto mainPhyNavEnd = GetStaMac()->GetChannelAccessManager(*mainPhyLinkId)->GetNavEnd();
+        remNav = Max(remNav, mainPhyNavEnd - now);
+    }
+
+    SwitchMainPhy(linkId,
+                  false,
+                  RESET_BACKOFF,
+                  DONT_REQUEST_ACCESS,
+                  EmlsrUlTxopAuxPhyNotTxCapableTrace(aci, delay, remNav));
+
+    // check expected channel access delay when switch is completed
+    Simulator::Schedule(switchDelay, [=, this]() {
+        const auto accessDelay = cam->GetBackoffEndFor(edca) - Simulator::Now();
+
+        if (auxPhyCcaCanBeUsed && backoffEndBeforeSwitch && accessDelay.IsNegative())
+        {
+            // backoff already counted down to zero and we used aux PHY CCA
+            return;
+        }
+
+        const auto pifs = GetStaMac()->GetWifiPhy(linkId)->GetPifs();
+
+        // if the remaining backoff time is shorter than PIFS when the main PHY completes the
+        // switch, we need to schedule a CCA check a PIFS after the end of the main PHY switch
+        if (accessDelay <= pifs)
+        {
+            // use main PHY CCA in the last PIFS interval after main PHY switch end
+            NS_LOG_DEBUG("Schedule CCA check a PIFS after the end of main PHY switch");
+            m_ccaLastPifs = Simulator::Schedule(pifs,
+                                                &AdvancedEmlsrManager::CheckNavAndCcaLastPifs,
+                                                this,
+                                                mainPhy,
+                                                linkId,
+                                                edca);
+        }
+        else if (!GetExpectedAccessWithinDelay(linkId,
+                                               accessDelay + m_switchMainPhyBackDelay +
+                                                   mainPhy->GetChannelSwitchDelay()))
+        {
+            NS_LOG_DEBUG("No AC is expected to get backoff soon, switch main PHY back");
+            SwitchMainPhyBackDelayExpired(linkId);
+        }
+        else
+        {
+            // the main PHY must stay for some time on this link to check if it gets channel
+            // access. The timer is stopped if a DL or UL TXOP is started. When the timer
+            // expires, the main PHY switches back to the preferred link if SwitchAuxPhy is
+            // false
+            m_switchMainPhyBackEvent.Cancel();
+            m_switchMainPhyBackEvent =
+                Simulator::Schedule(accessDelay + m_switchMainPhyBackDelay,
+                                    &AdvancedEmlsrManager::SwitchMainPhyBackDelayExpired,
+                                    this,
+                                    linkId);
+        }
+    });
+}
+
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/eht/advanced-emlsr-manager.h ns-3.44/src/wifi/model/eht/advanced-emlsr-manager.h
--- ns-3.43/src/wifi/model/eht/advanced-emlsr-manager.h	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/eht/advanced-emlsr-manager.h	2025-03-09 16:55:49.783372600 -0700
@@ -11,11 +11,15 @@
 
 #include "default-emlsr-manager.h"
 
+#include <memory>
+
 namespace ns3
 {
 
+class WifiPhyListener;
+
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * AdvancedEmlsrManager is an advanced EMLSR manager.
  */
@@ -23,29 +27,38 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     AdvancedEmlsrManager();
     ~AdvancedEmlsrManager() override;
 
+    /**
+     * This method is called by the PHY listener attached to the main PHY when a switch main PHY
+     * back timer is started to notify of events that may delay the channel access for the main
+     * PHY on the current link. If the expected channel access is beyond the end of the switch
+     * main PHY timer expiration plus a channel switch delay, the timer is stopped immediately.
+     */
+    void InterruptSwitchMainPhyBackTimerIfNeeded();
+
   protected:
     void DoDispose() override;
     void DoSetWifiMac(Ptr<StaWifiMac> mac) override;
     std::pair<bool, Time> DoGetDelayUntilAccessRequest(uint8_t linkId) override;
     std::pair<bool, Time> GetDelayUnlessMainPhyTakesOverUlTxop(uint8_t linkId) override;
     void SwitchMainPhyIfTxopGainedByAuxPhy(uint8_t linkId, AcIndex aci) override;
+    void NotifyEmlsrModeChanged() override;
 
     /**
      * Possibly take actions when notified of the MAC header of the MPDU being received by the
      * given PHY.
      *
-     * \param phy the given PHY
-     * \param macHdr the MAC header of the MPDU being received
-     * \param txVector the TXVECTOR used to transmit the PSDU
-     * \param psduDuration the remaining duration of the PSDU
+     * @param phy the given PHY
+     * @param macHdr the MAC header of the MPDU being received
+     * @param txVector the TXVECTOR used to transmit the PSDU
+     * @param psduDuration the remaining duration of the PSDU
      */
     void ReceivedMacHdr(Ptr<WifiPhy> phy,
                         const WifiMacHeader& macHdr,
@@ -58,29 +71,52 @@
      * intended to be used when the main PHY switches channel to start an UL TXOP on a link where
      * channel access was obtained by a non-TX capable aux PHY.
      *
-     * \param phy the PHY that performed CCA in the last PIFS interval
-     * \param linkId the ID of the given link
-     * \param edca the given EDCAF
+     * @param phy the PHY that performed CCA in the last PIFS interval
+     * @param linkId the ID of the given link
+     * @param edca the given EDCAF
      */
     void CheckNavAndCcaLastPifs(Ptr<WifiPhy> phy, uint8_t linkId, Ptr<QosTxop> edca);
 
     /**
      * Determine whether the main PHY shall be requested to switch to the link of an aux PHY that
-     * has gained channel access through the given AC but it is not TX capable.
+     * is expected to gain channel access through the given AC in the given delay but it is not
+     * TX capable.
+     *
+     * @param linkId the ID of the link on which the aux PHY is operating
+     * @param aci the index of the given AC
+     * @param delay the delay after which the given AC is expected to gain channel access. Zero
+     *              indicates that channel access has been actually gained
+     * @return whether the main PHY shall be requested to switch to the link of the aux PHY
+     */
+    bool RequestMainPhyToSwitch(uint8_t linkId, AcIndex aci, const Time& delay);
+
+    /**
+     * This method is called when the given AC of the EMLSR client is expected to get channel
+     * access in the given delay on the given link, on which an aux PHY that is not TX capable
+     * is operating. This method has to decide whether to request the main PHY to switch to the
+     * given link to try to start a TXOP.
      *
-     * \param linkId the ID of the link on which the aux PHY is operating
-     * \param aci the index of the given AC
-     * \return whether the main PHY shall be requested to switch to the link of the aux PHY
+     * @param linkId the ID of the given link
+     * @param aci the index of the given AC
+     * @param delay the delay after which the given AC is expected to gain channel access
      */
-    bool RequestMainPhyToSwitch(uint8_t linkId, AcIndex aci);
+    void SwitchMainPhyIfTxopToBeGainedByAuxPhy(uint8_t linkId, AcIndex aci, const Time& delay);
+
+    /**
+     * This method is called when the switch main PHY back delay timer (which is started when the
+     * main PHY switches to the link of an aux PHY that does not switch and is not TX capable)
+     * expires and decides whether to delay the request to switch the main PHY back to the preferred
+     * link or to execute it immediately.
+     *
+     * @param linkId the ID of the link that the main PHY is leaving
+     */
+    void SwitchMainPhyBackDelayExpired(uint8_t linkId);
 
   private:
     void DoNotifyTxopEnd(uint8_t linkId) override;
     void DoNotifyIcfReceived(uint8_t linkId) override;
     void DoNotifyUlTxopStart(uint8_t linkId) override;
 
-    bool m_useNotifiedMacHdr;      //!< whether to use the information about the MAC header of
-                                   //!< the MPDU being received (if notified by the PHY)
     bool m_allowUlTxopInRx;        //!< whether a (main or aux) PHY is allowed to start an UL
                                    //!< TXOP if another PHY is receiving a PPDU
     bool m_interruptSwitching;     //!< whether a main PHY switching can be interrupted to start
@@ -98,6 +134,31 @@
     EventId m_switchMainPhyBackEvent; //!< event scheduled in case of non-TX capable aux PHY when
                                       //!< medium is sensed busy during the PIFS interval
                                       //!< preceding/following the main PHY switch end
+    std::shared_ptr<WifiPhyListener>
+        m_phyListener; //!< PHY listener connected to the main PHY while operating on the link of
+                       //!< an aux PHY that is not TX capable
+};
+
+/**
+ * Struct to trace that main PHY switched to leave a link on which an aux PHY was expected to gain
+ * a TXOP but the main PHY did not manage to gain a TXOP in the pre-configured amount of time.
+ */
+struct EmlsrSwitchMainPhyBackTrace : public EmlsrMainPhySwitchTraceImpl<EmlsrSwitchMainPhyBackTrace>
+{
+    static constexpr std::string_view m_name = "TxopNotGainedOnAuxPhyLink"; //!< trace name
+
+    bool nothingToTx; //!< if true, the main PHY managed to gain a TXOP but had nothing to transmit
+
+    /**
+     * Constructor provided because this struct is not an aggregate (it has a base struct), hence
+     * we cannot use designated initializers.
+     *
+     * @param nothing the value for the nothingToTx field
+     */
+    EmlsrSwitchMainPhyBackTrace(bool nothing)
+        : nothingToTx(nothing)
+    {
+    }
 };
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/eht/ap-emlsr-manager.h ns-3.44/src/wifi/model/eht/ap-emlsr-manager.h
--- ns-3.43/src/wifi/model/eht/ap-emlsr-manager.h	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/eht/ap-emlsr-manager.h	2025-03-09 16:55:49.783372600 -0700
@@ -22,7 +22,7 @@
 class WifiTxVector;
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * ApEmlsrManager is an abstract base class defining the API that EHT AP MLDs with
  * EMLSR activated can use to handle the operations on the EMLSR links of EMLSR clients
@@ -31,8 +31,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     ApEmlsrManager();
@@ -41,23 +41,23 @@
     /**
      * Set the wifi MAC. Note that it must be the MAC of an EHT AP MLD.
      *
-     * \param mac the wifi MAC
+     * @param mac the wifi MAC
      */
     void SetWifiMac(Ptr<ApWifiMac> mac);
 
     /**
      * This method is called when the reception of a PSDU succeeds on the given link.
      *
-     * \param linkId the ID of the given link
-     * \param psdu the PSDU whose reception succeeded
+     * @param linkId the ID of the given link
+     * @param psdu the PSDU whose reception succeeded
      */
     virtual void NotifyPsduRxOk(uint8_t linkId, Ptr<const WifiPsdu> psdu);
 
     /**
      * This method is called when the reception of a PSDU fails on the given link.
      *
-     * \param linkId the ID of the given link
-     * \param psdu the PSDU whose reception failed
+     * @param linkId the ID of the given link
+     * @param psdu the PSDU whose reception failed
      */
     virtual void NotifyPsduRxError(uint8_t linkId, Ptr<const WifiPsdu> psdu);
 
@@ -65,17 +65,17 @@
      * This method is intended to be called when the AP MLD starts transmitting an SU frame that
      * is not addressed to EMLSR clients that were previously involved in the ongoing DL TXOP.
      *
-     * \param psdu the PSDU being transmitted
-     * \param txVector the TXVECTOR used to transmit the PSDU
-     * \param band the PHY band in which the PSDU is being transmitted
-     * \return the delay after which the AP MLD starts the transition delay for the EMLSR client
+     * @param psdu the PSDU being transmitted
+     * @param txVector the TXVECTOR used to transmit the PSDU
+     * @param band the PHY band in which the PSDU is being transmitted
+     * @return the delay after which the AP MLD starts the transition delay for the EMLSR client
      */
     virtual Time GetDelayOnTxPsduNotForEmlsr(Ptr<const WifiPsdu> psdu,
                                              const WifiTxVector& txVector,
                                              WifiPhyBand band) = 0;
 
     /**
-     * \return whether the AP MLD shall double the CW upon CTS timeout after an MU-RTS in case
+     * @return whether the AP MLD shall double the CW upon CTS timeout after an MU-RTS in case
      *         all the clients solicited by the MU-RTS are EMLSR clients that have sent (or
      *         are sending) a frame to the AP
      */
@@ -87,18 +87,18 @@
     /**
      * Allow subclasses to take actions when the MAC is set.
      *
-     * \param mac the wifi MAC
+     * @param mac the wifi MAC
      */
     virtual void DoSetWifiMac(Ptr<ApWifiMac> mac);
 
     /**
-     * \return the MAC of the AP MLD managed by this AP EMLSR Manager.
+     * @return the MAC of the AP MLD managed by this AP EMLSR Manager.
      */
     Ptr<ApWifiMac> GetApMac() const;
 
     /**
-     * \param linkId the ID of the given link
-     * \return the EHT FrameExchangeManager attached to the AP operating on the given link
+     * @param linkId the ID of the given link
+     * @return the EHT FrameExchangeManager attached to the AP operating on the given link
      */
     Ptr<EhtFrameExchangeManager> GetEhtFem(uint8_t linkId) const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/eht/common-info-basic-mle.cc ns-3.44/src/wifi/model/eht/common-info-basic-mle.cc
--- ns-3.43/src/wifi/model/eht/common-info-basic-mle.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/wifi/model/eht/common-info-basic-mle.cc	2025-03-09 16:55:49.783372600 -0700
@@ -0,0 +1,305 @@
+/*
+ * Copyright (c) 2021 Universita' degli Studi di Napoli Federico II
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#include "common-info-basic-mle.h"
+
+#include "ns3/address-utils.h"
+
+namespace ns3
+{
+
+uint16_t
+CommonInfoBasicMle::GetPresenceBitmap() const
+{
+    // see Sec. 9.4.2.312.2.1 of 802.11be D1.5
+    return (m_linkIdInfo.has_value() ? 0x0001 : 0x0) |
+           (m_bssParamsChangeCount.has_value() ? 0x0002 : 0x0) |
+           (m_mediumSyncDelayInfo.has_value() ? 0x0004 : 0x0) |
+           (m_emlCapabilities.has_value() ? 0x0008 : 0x0) |
+           (m_mldCapabilities.has_value() ? 0x0010 : 0x0) | (m_apMldId.has_value() ? 0x0020 : 0x0) |
+           (m_extMldCapabilities.has_value() ? 0x0040 : 0x0);
+}
+
+uint8_t
+CommonInfoBasicMle::GetSize() const
+{
+    uint8_t ret = 7; // Common Info Length (1) + MLD MAC Address (6)
+    ret += (m_linkIdInfo.has_value() ? 1 : 0);
+    ret += (m_bssParamsChangeCount.has_value() ? 1 : 0);
+    ret += (m_mediumSyncDelayInfo.has_value() ? 2 : 0);
+    ret += (m_emlCapabilities.has_value() ? 2 : 0);
+    ret += (m_mldCapabilities.has_value() ? 2 : 0);
+    ret += (m_apMldId.has_value() ? 1 : 0);
+    ret += (m_extMldCapabilities.has_value() ? 2 : 0);
+    return ret;
+}
+
+void
+CommonInfoBasicMle::Serialize(Buffer::Iterator& start) const
+{
+    start.WriteU8(GetSize()); // Common Info Length
+    WriteTo(start, m_mldMacAddress);
+    if (m_linkIdInfo.has_value())
+    {
+        start.WriteU8(*m_linkIdInfo & 0x0f);
+    }
+    if (m_bssParamsChangeCount.has_value())
+    {
+        start.WriteU8(*m_bssParamsChangeCount);
+    }
+    if (m_mediumSyncDelayInfo.has_value())
+    {
+        start.WriteU8(m_mediumSyncDelayInfo->mediumSyncDuration);
+        uint8_t val = m_mediumSyncDelayInfo->mediumSyncOfdmEdThreshold |
+                      (m_mediumSyncDelayInfo->mediumSyncMaxNTxops << 4);
+        start.WriteU8(val);
+    }
+    if (m_emlCapabilities.has_value())
+    {
+        uint16_t val =
+            m_emlCapabilities->emlsrSupport | (m_emlCapabilities->emlsrPaddingDelay << 1) |
+            (m_emlCapabilities->emlsrTransitionDelay << 4) |
+            (m_emlCapabilities->emlmrSupport << 7) | (m_emlCapabilities->emlmrDelay << 8) |
+            (m_emlCapabilities->transitionTimeout << 11);
+        start.WriteHtolsbU16(val);
+    }
+    if (m_mldCapabilities.has_value())
+    {
+        uint16_t val =
+            m_mldCapabilities->maxNSimultaneousLinks | (m_mldCapabilities->srsSupport << 4) |
+            (m_mldCapabilities->tidToLinkMappingSupport << 5) |
+            (m_mldCapabilities->freqSepForStrApMld << 7) | (m_mldCapabilities->aarSupport << 12);
+        start.WriteHtolsbU16(val);
+    }
+    if (m_apMldId.has_value())
+    {
+        start.WriteU8(*m_apMldId);
+    }
+    if (m_extMldCapabilities.has_value())
+    {
+        uint16_t val = m_extMldCapabilities->opParamUpdateSupp |
+                       (m_extMldCapabilities->recommMaxSimulLinks << 1) |
+                       (m_extMldCapabilities->nstrStatusUpdateSupp << 5);
+        start.WriteHtolsbU16(val);
+    }
+}
+
+uint8_t
+CommonInfoBasicMle::Deserialize(Buffer::Iterator start, uint16_t presence)
+{
+    Buffer::Iterator i = start;
+
+    uint8_t length = i.ReadU8();
+    ReadFrom(i, m_mldMacAddress);
+    uint8_t count = 7;
+
+    if ((presence & 0x0001) != 0)
+    {
+        m_linkIdInfo = i.ReadU8() & 0x0f;
+        count++;
+    }
+    if ((presence & 0x0002) != 0)
+    {
+        m_bssParamsChangeCount = i.ReadU8();
+        count++;
+    }
+    if ((presence & 0x0004) != 0)
+    {
+        m_mediumSyncDelayInfo = MediumSyncDelayInfo();
+        m_mediumSyncDelayInfo->mediumSyncDuration = i.ReadU8();
+        uint8_t val = i.ReadU8();
+        m_mediumSyncDelayInfo->mediumSyncOfdmEdThreshold = val & 0x0f;
+        m_mediumSyncDelayInfo->mediumSyncMaxNTxops = (val >> 4) & 0x0f;
+        count += 2;
+    }
+    if ((presence & 0x0008) != 0)
+    {
+        m_emlCapabilities = EmlCapabilities();
+        uint16_t val = i.ReadLsbtohU16();
+        m_emlCapabilities->emlsrSupport = val & 0x0001;
+        m_emlCapabilities->emlsrPaddingDelay = (val >> 1) & 0x0007;
+        m_emlCapabilities->emlsrTransitionDelay = (val >> 4) & 0x0007;
+        m_emlCapabilities->emlmrSupport = (val >> 7) & 0x0001;
+        m_emlCapabilities->emlmrDelay = (val >> 8) & 0x0007;
+        m_emlCapabilities->transitionTimeout = (val >> 11) & 0x000f;
+        count += 2;
+    }
+    if ((presence & 0x0010) != 0)
+    {
+        m_mldCapabilities = MldCapabilities();
+        uint16_t val = i.ReadLsbtohU16();
+        m_mldCapabilities->maxNSimultaneousLinks = val & 0x000f;
+        m_mldCapabilities->srsSupport = (val >> 4) & 0x0001;
+        m_mldCapabilities->tidToLinkMappingSupport = (val >> 5) & 0x0003;
+        m_mldCapabilities->freqSepForStrApMld = (val >> 7) & 0x001f;
+        m_mldCapabilities->aarSupport = (val >> 12) & 0x0001;
+        count += 2;
+    }
+    if ((presence & 0x0020) != 0)
+    {
+        m_apMldId = i.ReadU8();
+        count++;
+    }
+    if ((presence & 0x0040) != 0)
+    {
+        m_extMldCapabilities = ExtMldCapabilities();
+        auto val = i.ReadLsbtohU16();
+        m_extMldCapabilities->opParamUpdateSupp = val & 0x0001;
+        m_extMldCapabilities->recommMaxSimulLinks = (val >> 1) & 0x000f;
+        m_extMldCapabilities->nstrStatusUpdateSupp = (val >> 5) & 0x0001;
+        count += 2;
+    }
+
+    NS_ABORT_MSG_IF(count != length,
+                    "Common Info Length (" << +length
+                                           << ") differs "
+                                              "from actual number of bytes read ("
+                                           << +count << ")");
+    return count;
+}
+
+uint8_t
+CommonInfoBasicMle::EncodeEmlsrPaddingDelay(Time delay)
+{
+    auto delayUs = delay.GetMicroSeconds();
+
+    if (delayUs == 0)
+    {
+        return 0;
+    }
+
+    for (uint8_t i = 1; i <= 4; i++)
+    {
+        if (1 << (i + 4) == delayUs)
+        {
+            return i;
+        }
+    }
+
+    NS_ABORT_MSG("Value not allowed (" << delay.As(Time::US) << ")");
+    return 0;
+}
+
+Time
+CommonInfoBasicMle::DecodeEmlsrPaddingDelay(uint8_t value)
+{
+    NS_ABORT_MSG_IF(value > 4, "Value not allowed (" << +value << ")");
+    if (value == 0)
+    {
+        return MicroSeconds(0);
+    }
+    return MicroSeconds(1 << (4 + value));
+}
+
+uint8_t
+CommonInfoBasicMle::EncodeEmlsrTransitionDelay(Time delay)
+{
+    auto delayUs = delay.GetMicroSeconds();
+
+    if (delayUs == 0)
+    {
+        return 0;
+    }
+
+    for (uint8_t i = 1; i <= 5; i++)
+    {
+        if (1 << (i + 3) == delayUs)
+        {
+            return i;
+        }
+    }
+
+    NS_ABORT_MSG("Value not allowed (" << delay.As(Time::US) << ")");
+    return 0;
+}
+
+Time
+CommonInfoBasicMle::DecodeEmlsrTransitionDelay(uint8_t value)
+{
+    NS_ABORT_MSG_IF(value > 5, "Value not allowed (" << +value << ")");
+    if (value == 0)
+    {
+        return MicroSeconds(0);
+    }
+    return MicroSeconds(1 << (3 + value));
+}
+
+void
+CommonInfoBasicMle::SetMediumSyncDelayTimer(Time delay)
+{
+    int64_t delayUs = delay.GetMicroSeconds();
+    NS_ABORT_MSG_IF(delayUs % 32 != 0, "Delay must be a multiple of 32 microseconds");
+    delayUs /= 32;
+
+    if (!m_mediumSyncDelayInfo.has_value())
+    {
+        m_mediumSyncDelayInfo = CommonInfoBasicMle::MediumSyncDelayInfo{};
+    }
+    m_mediumSyncDelayInfo->mediumSyncDuration = (delayUs & 0xff);
+}
+
+Time
+CommonInfoBasicMle::GetMediumSyncDelayTimer() const
+{
+    NS_ASSERT(m_mediumSyncDelayInfo);
+    return MicroSeconds(m_mediumSyncDelayInfo->mediumSyncDuration * 32);
+}
+
+void
+CommonInfoBasicMle::SetMediumSyncOfdmEdThreshold(int8_t threshold)
+{
+    NS_ABORT_MSG_IF(threshold < -72 || threshold > -62, "Threshold may range from -72 to -62 dBm");
+    uint8_t value = 72 + threshold;
+
+    if (!m_mediumSyncDelayInfo.has_value())
+    {
+        m_mediumSyncDelayInfo = CommonInfoBasicMle::MediumSyncDelayInfo{};
+    }
+    m_mediumSyncDelayInfo->mediumSyncOfdmEdThreshold = value;
+}
+
+int8_t
+CommonInfoBasicMle::GetMediumSyncOfdmEdThreshold() const
+{
+    NS_ASSERT(m_mediumSyncDelayInfo);
+    return (m_mediumSyncDelayInfo->mediumSyncOfdmEdThreshold) - 72;
+}
+
+void
+CommonInfoBasicMle::SetMediumSyncMaxNTxops(uint8_t nTxops)
+{
+    NS_ASSERT_MSG(nTxops < 16, "Value " << +nTxops << "cannot be encoded in 4 bits");
+
+    if (!m_mediumSyncDelayInfo.has_value())
+    {
+        m_mediumSyncDelayInfo = CommonInfoBasicMle::MediumSyncDelayInfo{};
+    }
+
+    if (nTxops == 0)
+    {
+        // no limit on max number of TXOPs
+        m_mediumSyncDelayInfo->mediumSyncMaxNTxops = 15;
+        return;
+    }
+
+    m_mediumSyncDelayInfo->mediumSyncMaxNTxops = --nTxops;
+}
+
+std::optional<uint8_t>
+CommonInfoBasicMle::GetMediumSyncMaxNTxops() const
+{
+    NS_ASSERT(m_mediumSyncDelayInfo);
+    uint8_t nTxops = m_mediumSyncDelayInfo->mediumSyncMaxNTxops;
+    if (nTxops == 15)
+    {
+        return std::nullopt;
+    }
+    return nTxops + 1;
+}
+
+} // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/eht/common-info-basic-mle.h ns-3.44/src/wifi/model/eht/common-info-basic-mle.h
--- ns-3.43/src/wifi/model/eht/common-info-basic-mle.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/wifi/model/eht/common-info-basic-mle.h	2025-03-09 16:55:49.783372600 -0700
@@ -0,0 +1,197 @@
+/*
+ * Copyright (c) 2021 Universita' degli Studi di Napoli Federico II
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#ifndef COMMON_INFO_BASIC_MLE_H
+#define COMMON_INFO_BASIC_MLE_H
+
+#include "ns3/buffer.h"
+#include "ns3/mac48-address.h"
+#include "ns3/nstime.h"
+
+#include <cstdint>
+#include <optional>
+
+namespace ns3
+{
+
+/**
+ * Common Info field of the Basic Multi-Link element.
+ * See Sec. 9.4.2.312.2.2 of 802.11be D1.5
+ */
+struct CommonInfoBasicMle
+{
+    /**
+     * Medium Synchronization Delay Information subfield
+     */
+    struct MediumSyncDelayInfo
+    {
+        uint8_t mediumSyncDuration;            //!< Medium Synchronization Duration
+        uint8_t mediumSyncOfdmEdThreshold : 4; //!< Medium Synchronization OFDM ED Threshold
+        uint8_t mediumSyncMaxNTxops : 4;       //!< Medium Synchronization MAximum Number of TXOPs
+    };
+
+    /**
+     * EML Capabilities subfield
+     */
+    struct EmlCapabilities
+    {
+        uint8_t emlsrSupport : 1;         //!< EMLSR Support
+        uint8_t emlsrPaddingDelay : 3;    //!< EMLSR Padding Delay
+        uint8_t emlsrTransitionDelay : 3; //!< EMLSR Transition Delay
+        uint8_t emlmrSupport : 1;         //!< EMLMR Support
+        uint8_t emlmrDelay : 3;           //!< EMLMR Delay
+        uint8_t transitionTimeout : 4;    //!< Transition Timeout
+    };
+
+    /**
+     * MLD Capabilities subfield
+     */
+    struct MldCapabilities
+    {
+        uint8_t maxNSimultaneousLinks : 4;   //!< Max number of simultaneous links
+        uint8_t srsSupport : 1;              //!< SRS Support
+        uint8_t tidToLinkMappingSupport : 2; //!< TID-To-Link Mapping Negotiation Supported
+        uint8_t freqSepForStrApMld : 5; //!< Frequency Separation For STR/AP MLD Type Indication
+        uint8_t aarSupport : 1;         //!< AAR Support
+    };
+
+    /**
+     * Extended MLD Capabilities and Operations subfield
+     */
+    struct ExtMldCapabilities
+    {
+        uint8_t opParamUpdateSupp : 1;    ///< Operation Parameter Update Support
+        uint8_t recommMaxSimulLinks : 4;  ///< Recommended Max Simultaneous Links
+        uint8_t nstrStatusUpdateSupp : 1; ///< NSTR Status Update Support
+    };
+
+    /**
+     * Subfields
+     */
+    Mac48Address m_mldMacAddress;                  //!< MLD MAC Address
+    std::optional<uint8_t> m_linkIdInfo;           //!< Link ID Info
+    std::optional<uint8_t> m_bssParamsChangeCount; //!< BSS Parameters Change Count
+    std::optional<MediumSyncDelayInfo>
+        m_mediumSyncDelayInfo;                        //!< Medium Synchronization Delay Information
+    std::optional<EmlCapabilities> m_emlCapabilities; //!< EML Capabilities
+    std::optional<MldCapabilities> m_mldCapabilities; //!< MLD Capabilities
+    std::optional<uint8_t> m_apMldId;                 ///< AP MLD ID
+    std::optional<ExtMldCapabilities> m_extMldCapabilities; ///< Extended MLD Capabilities
+
+    /**
+     * Get the Presence Bitmap subfield of the Common Info field
+     *
+     * @return the Presence Bitmap subfield of the Common Info field
+     */
+    uint16_t GetPresenceBitmap() const;
+
+    /**
+     * Get the size of the serialized Common Info field
+     *
+     * @return the size of the serialized Common Info field
+     */
+    uint8_t GetSize() const;
+
+    /**
+     * Serialize the Common Info field
+     *
+     * @param start iterator pointing to where the Common Info field should be written to
+     */
+    void Serialize(Buffer::Iterator& start) const;
+
+    /**
+     * Deserialize the Common Info field
+     *
+     * @param start iterator pointing to where the Common Info field should be read from
+     * @param presence the value of the Presence Bitmap field indicating which subfields
+     *                 are present in the Common Info field
+     * @return the number of bytes read
+     */
+    uint8_t Deserialize(Buffer::Iterator start, uint16_t presence);
+
+    /**
+     * @param delay the EMLSR Padding delay
+     * @return the encoded value for the EMLSR Padding Delay subfield
+     */
+    static uint8_t EncodeEmlsrPaddingDelay(Time delay);
+
+    /**
+     * @param value the value for the EMLSR Padding Delay subfield
+     * @return the corresponding EMLSR Padding delay
+     */
+    static Time DecodeEmlsrPaddingDelay(uint8_t value);
+
+    /**
+     * @param delay the EMLSR Transition delay
+     * @return the encoded value for the EMLSR Transition Delay subfield
+     */
+    static uint8_t EncodeEmlsrTransitionDelay(Time delay);
+
+    /**
+     * @param value the value for the EMLSR Transition Delay subfield
+     * @return the corresponding EMLSR Transition delay
+     */
+    static Time DecodeEmlsrTransitionDelay(uint8_t value);
+
+    /**
+     * Set the Medium Synchronization Duration subfield of the Medium Synchronization
+     * Delay Information in the Common Info field.
+     *
+     * @param delay the timer duration (must be a multiple of 32 microseconds)
+     */
+    void SetMediumSyncDelayTimer(Time delay);
+
+    /**
+     * Set the Medium Synchronization OFDM ED Threshold subfield of the Medium Synchronization
+     * Delay Information in the Common Info field.
+     *
+     * @param threshold the threshold in dBm (ranges from -72 to -62 dBm)
+     */
+    void SetMediumSyncOfdmEdThreshold(int8_t threshold);
+
+    /**
+     * Set the Medium Synchronization Maximum Number of TXOPs subfield of the Medium Synchronization
+     * Delay Information in the Common Info field. A value of zero indicates no limit on the
+     * maximum number of TXOPs.
+     *
+     * @param nTxops the maximum number of TXOPs a non-AP STA is allowed to attempt to
+     *               initiate while the MediumSyncDelay timer is running at a non-AP STA
+     */
+    void SetMediumSyncMaxNTxops(uint8_t nTxops);
+
+    /**
+     * Get the Medium Synchronization Duration subfield of the Medium Synchronization Delay
+     * Information in the Common Info field. Make sure that the Medium Synchronization Delay
+     * Information subfield is present.
+     *
+     * @return the timer duration
+     */
+    Time GetMediumSyncDelayTimer() const;
+
+    /**
+     * Get the Medium Synchronization OFDM ED Threshold in dBm. Make sure that the Medium
+     * Synchronization Delay Information subfield is present.
+     *
+     * @return the threshold in dBm
+     */
+    int8_t GetMediumSyncOfdmEdThreshold() const;
+
+    /**
+     * Get the maximum number of TXOPs a non-AP STA is allowed to attempt to initiate
+     * while the MediumSyncDelay timer is running at a non-AP STA. If no value is returned,
+     * no limit is imposed on the number of TXOPs. Make sure that the Medium Synchronization
+     * Delay Information subfield is present.
+     *
+     * @return the number of TXOPs
+     */
+    std::optional<uint8_t> GetMediumSyncMaxNTxops() const;
+};
+
+} // namespace ns3
+
+#endif /* COMMON_INFO_BASIC_MLE_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/eht/common-info-probe-req-mle.cc ns-3.44/src/wifi/model/eht/common-info-probe-req-mle.cc
--- ns-3.43/src/wifi/model/eht/common-info-probe-req-mle.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/wifi/model/eht/common-info-probe-req-mle.cc	2025-03-09 16:55:49.783372600 -0700
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2024
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Author: Sharan Naribole <sharan.naribole@gmail.com>
+ */
+
+#include "common-info-probe-req-mle.h"
+
+#include "ns3/abort.h"
+
+namespace ns3
+{
+
+uint16_t
+CommonInfoProbeReqMle::GetPresenceBitmap() const
+{
+    // IEEE 802.11be D5.0 Figure 9-1072q
+    return (m_apMldId.has_value() ? 0x0001 : 0x0);
+}
+
+uint8_t
+CommonInfoProbeReqMle::GetSize() const
+{
+    uint8_t size = 1; // Common Info Length
+    size += (m_apMldId.has_value() ? 1 : 0);
+    return size;
+}
+
+void
+CommonInfoProbeReqMle::Serialize(Buffer::Iterator& start) const
+{
+    start.WriteU8(GetSize()); // Common Info Length
+    if (m_apMldId.has_value())
+    {
+        start.WriteU8(*m_apMldId);
+    }
+}
+
+uint8_t
+CommonInfoProbeReqMle::Deserialize(Buffer::Iterator start, uint16_t presence)
+{
+    auto i = start;
+    auto length = i.ReadU8();
+    uint8_t count = 1;
+
+    if (presence & 0x1)
+    {
+        m_apMldId = i.ReadU8();
+        count++;
+    }
+    NS_ABORT_MSG_IF(count != length,
+                    "Common Info Length (" << +length
+                                           << ") differs "
+                                              "from actual number of bytes read ("
+                                           << +count << ")");
+    return count;
+}
+
+} // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/eht/common-info-probe-req-mle.h ns-3.44/src/wifi/model/eht/common-info-probe-req-mle.h
--- ns-3.43/src/wifi/model/eht/common-info-probe-req-mle.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/wifi/model/eht/common-info-probe-req-mle.h	2025-03-09 16:55:49.783372600 -0700
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2024
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Author: Sharan Naribole <sharan.naribole@gmail.com>
+ */
+
+#ifndef COMMON_INFO_PROBE_REQ_MLE_H
+#define COMMON_INFO_PROBE_REQ_MLE_H
+
+#include "ns3/buffer.h"
+
+#include <cstdint>
+#include <optional>
+
+namespace ns3
+{
+
+/**
+ * Common Info field of Multi-link Element Probe Request variant.
+ * IEEE 802.11be D6.0 9.4.2.321.3
+ */
+struct CommonInfoProbeReqMle
+{
+    std::optional<uint8_t> m_apMldId; ///< AP MLD ID
+
+    /**
+     * Get the Presence Bitmap subfield of the Common Info field
+     *
+     * @return the Presence Bitmap subfield of the Common Info field
+     */
+    uint16_t GetPresenceBitmap() const;
+
+    /**
+     * Get the size of the serialized Common Info field
+     *
+     * @return the size of the serialized Common Info field
+     */
+    uint8_t GetSize() const;
+
+    /**
+     * Serialize the Common Info field
+     *
+     * @param start iterator pointing to where the Common Info field should be written to
+     */
+    void Serialize(Buffer::Iterator& start) const;
+
+    /**
+     * Deserialize the Common Info field
+     *
+     * @param start iterator pointing to where the Common Info field should be read from
+     * @param presence the value of the Presence Bitmap field indicating which subfields
+     *                 are present in the Common Info field
+     * @return the number of bytes read
+     */
+    uint8_t Deserialize(Buffer::Iterator start, uint16_t presence);
+};
+
+} // namespace ns3
+
+#endif // COMMON_INFO_PROBE_REQ_MLE_H
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/eht/default-ap-emlsr-manager.h ns-3.44/src/wifi/model/eht/default-ap-emlsr-manager.h
--- ns-3.43/src/wifi/model/eht/default-ap-emlsr-manager.h	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/eht/default-ap-emlsr-manager.h	2025-03-09 16:55:49.783372600 -0700
@@ -15,7 +15,7 @@
 {
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * DefaultApEmlsrManager is the default AP EMLSR manager.
  */
@@ -23,8 +23,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/eht/default-emlsr-manager.cc ns-3.44/src/wifi/model/eht/default-emlsr-manager.cc
--- ns-3.43/src/wifi/model/eht/default-emlsr-manager.cc	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/eht/default-emlsr-manager.cc	2025-03-09 16:55:49.787372600 -0700
@@ -41,19 +41,11 @@
                           "no PHY will be listening on that EMLSR link).",
                           BooleanValue(true),
                           MakeBooleanAccessor(&DefaultEmlsrManager::m_switchAuxPhy),
-                          MakeBooleanChecker())
-            .AddAttribute("PutAuxPhyToSleep",
-                          "Whether Aux PHY should be put into sleep mode while the Main PHY "
-                          "is operating on the same link as the Aux PHY (this only matters "
-                          "when the Aux PHY does not switch channel).",
-                          BooleanValue(true),
-                          MakeBooleanAccessor(&DefaultEmlsrManager::m_auxPhyToSleep),
                           MakeBooleanChecker());
     return tid;
 }
 
 DefaultEmlsrManager::DefaultEmlsrManager()
-    : m_mainPhySwitchInfo{}
 {
     NS_LOG_FUNCTION(this);
 }
@@ -96,19 +88,12 @@
 void
 DefaultEmlsrManager::NotifyMainPhySwitch(std::optional<uint8_t> currLinkId,
                                          uint8_t nextLinkId,
+                                         Ptr<WifiPhy> auxPhy,
                                          Time duration)
 {
-    NS_LOG_FUNCTION(this << (currLinkId ? std::to_string(*currLinkId) : "") << nextLinkId
+    NS_LOG_FUNCTION(this << (currLinkId ? std::to_string(*currLinkId) : "") << nextLinkId << auxPhy
                          << duration.As(Time::US));
 
-    // if currLinkId has no value (i.e., the main PHY is not operating on any link), it means that
-    // the main PHY is switching
-    const auto now = Simulator::Now();
-    NS_ASSERT_MSG(currLinkId || m_mainPhySwitchInfo.end >= now,
-                  "No current link ID provided nor valid main PHY switch information stored");
-    m_mainPhySwitchInfo.from = currLinkId.value_or(m_mainPhySwitchInfo.from);
-    m_mainPhySwitchInfo.end = now + duration;
-
     if (m_switchAuxPhy)
     {
         // cancel any previously requested aux PHY switch
@@ -123,51 +108,80 @@
 
         // schedule Aux PHY switch so that it operates on the link on which the main PHY was
         // operating
-        auto auxPhy = GetStaMac()->GetWifiPhy(nextLinkId);
-
         NS_LOG_DEBUG("Aux PHY (" << auxPhy << ") operating on link " << +nextLinkId
-                                 << " will switch to link " << +currLinkId.value() << " in "
+                                 << " will switch to link " << +m_mainPhySwitchInfo.from << " in "
                                  << duration.As(Time::US));
-
-        m_auxPhySwitchEvent =
-            Simulator::Schedule(duration, [=, this, prevLinkId = m_mainPhySwitchInfo.from]() {
-                SwitchAuxPhy(auxPhy, nextLinkId, prevLinkId);
-            });
+        SwitchAuxPhyAfterMainPhy(auxPhy, nextLinkId, m_mainPhySwitchInfo.from, duration);
         return;
     }
 
     if (currLinkId.has_value() && currLinkId != GetMainPhyId())
     {
-        // the main PHY is leaving a non-primary link, hence an aux PHY needs to be reconnected
+        // the main PHY is leaving an auxiliary link, hence an aux PHY needs to be reconnected
         NS_ASSERT_MSG(
             m_auxPhyToReconnect,
-            "There should be an aux PHY to reconnect when the main PHY leaves a non-primary link");
+            "There should be an aux PHY to reconnect when the main PHY leaves an auxiliary link");
 
         // the Aux PHY is not actually switching (hence no switching delay)
         GetStaMac()->NotifySwitchingEmlsrLink(m_auxPhyToReconnect, *currLinkId, Seconds(0));
-        // resume aux PHY from sleep (once reconnected to its original link)
-        m_auxPhyToReconnect->ResumeFromSleep();
         SetCcaEdThresholdOnLinkSwitch(m_auxPhyToReconnect, *currLinkId);
     }
 
     // if currLinkId has no value, it means that the main PHY switch is interrupted, hence reset
-    // the aux PHY to reconnect and cancel the event to put the aux PHY to sleep. Doing so when
-    // the main PHY is leaving the primary link makes no harm (the aux PHY to reconnect and the
-    // event to put the aux PHY to sleep are set below), thus no need to add an 'if' condition
+    // the aux PHY to reconnect. Doing so when the main PHY is leaving the preferred link makes
+    // no harm (the aux PHY to reconnect is set below), thus no need to add an 'if' condition
     m_auxPhyToReconnect = nullptr;
-    m_auxPhyToSleepEvent.Cancel();
 
     if (nextLinkId != GetMainPhyId())
     {
-        // the main PHY is moving to a non-primary link and the aux PHY does not switch link
-        m_auxPhyToReconnect = GetStaMac()->GetWifiPhy(nextLinkId);
+        // the main PHY is moving to an auxiliary link and the aux PHY does not switch link
+        m_auxPhyToReconnect = auxPhy;
+    }
+}
 
-        if (m_auxPhyToSleep)
-        {
-            // aux PHY can be put into sleep mode when the main PHY completes the channel switch
-            m_auxPhyToSleepEvent =
-                Simulator::Schedule(duration, &WifiPhy::SetSleepMode, m_auxPhyToReconnect);
-        }
+void
+DefaultEmlsrManager::SwitchAuxPhyAfterMainPhy(Ptr<WifiPhy> auxPhy,
+                                              uint8_t currLinkId,
+                                              uint8_t nextLinkId,
+                                              Time duration)
+{
+    NS_LOG_FUNCTION(this << auxPhy << currLinkId << nextLinkId << duration.As(Time::US));
+
+    if (duration.IsStrictlyPositive())
+    {
+        auto lambda = [=, this]() {
+            if (GetStaMac()->GetWifiPhy(currLinkId) == auxPhy)
+            {
+                // the aux PHY is still operating on the link, likely because it is receiving a
+                // PPDU and connecting the main PHY to the link has been postponed
+                const auto [maybeIcf, extension] = CheckPossiblyReceivingIcf(currLinkId);
+                if (maybeIcf && extension.IsStrictlyPositive())
+                {
+                    NS_LOG_DEBUG("Switching aux PHY to link " << +nextLinkId << " is postponed by "
+                                                              << extension.As(Time::US));
+                    SwitchAuxPhyAfterMainPhy(auxPhy, currLinkId, nextLinkId, extension);
+                    return;
+                }
+            }
+            const auto isSleeping = auxPhy->IsStateSleep();
+            if (isSleeping)
+            {
+                // if the aux PHY is sleeping, it cannot switch channel
+                auxPhy->ResumeFromSleep();
+            }
+            SwitchAuxPhy(auxPhy, currLinkId, nextLinkId);
+            if (isSleeping)
+            {
+                // sleep mode will be postponed until the end of channel switch
+                auxPhy->SetSleepMode(true);
+            }
+        };
+
+        m_auxPhySwitchEvent = Simulator::Schedule(duration, lambda);
+    }
+    else
+    {
+        SwitchAuxPhy(auxPhy, currLinkId, nextLinkId);
     }
 }
 
@@ -198,14 +212,17 @@
     // switch main PHY to the previous link, if needed
     if (!m_switchAuxPhy)
     {
-        SwitchMainPhyBackToPrimaryLink(linkId);
+        const auto mainPhy = GetStaMac()->GetDevice()->GetPhy(m_mainPhyId);
+        const auto delay = mainPhy->IsStateSwitching() ? mainPhy->GetDelayUntilIdle() : Time{0};
+        SwitchMainPhyBackToPreferredLink(linkId, EmlsrTxopEndedTrace(delay));
     }
 }
 
 void
-DefaultEmlsrManager::SwitchMainPhyBackToPrimaryLink(uint8_t linkId)
+DefaultEmlsrManager::SwitchMainPhyBackToPreferredLink(uint8_t linkId,
+                                                      EmlsrMainPhySwitchTrace&& traceInfo)
 {
-    NS_LOG_FUNCTION(this << linkId);
+    NS_LOG_FUNCTION(this << linkId << traceInfo.GetName());
 
     NS_ABORT_MSG_IF(m_switchAuxPhy, "This method can only be called when SwitchAuxPhy is false");
 
@@ -220,22 +237,30 @@
     // switching to a link on which an aux PHY gained a TXOP and sent an RTS, but the CTS
     // is not received and the UL TXOP ends before the main PHY channel switch is completed.
     // In such cases, wait until the main PHY channel switch is completed before requesting
-    // a new channel switch and cancel the event to put the aux PHY to sleep.
+    // a new channel switch.
     // Backoff shall not be reset on the link left by the main PHY because a TXOP ended and
     // a new backoff value must be generated.
     if (!mainPhy->IsStateSwitching())
     {
-        SwitchMainPhy(GetMainPhyId(), false, DONT_RESET_BACKOFF, REQUEST_ACCESS);
+        SwitchMainPhy(GetMainPhyId(),
+                      false,
+                      DONT_RESET_BACKOFF,
+                      REQUEST_ACCESS,
+                      std::forward<EmlsrMainPhySwitchTrace>(traceInfo));
     }
     else
     {
-        m_auxPhyToSleepEvent.Cancel();
-        Simulator::Schedule(mainPhy->GetDelayUntilIdle(), [=, this]() {
-            // request the main PHY to switch back to the primary link only if in the meantime
-            // no TXOP started on another link (which will require the main PHY to switch link)
+        Simulator::Schedule(mainPhy->GetDelayUntilIdle(), [=, info = traceInfo.Clone(), this]() {
+            // request the main PHY to switch back to the preferred link only if
+            // in the meantime no TXOP started on another link (which will
+            // require the main PHY to switch link)
             if (!GetEhtFem(linkId)->UsingOtherEmlsrLink())
             {
-                SwitchMainPhy(GetMainPhyId(), false, DONT_RESET_BACKOFF, REQUEST_ACCESS);
+                SwitchMainPhy(GetMainPhyId(),
+                              false,
+                              DONT_RESET_BACKOFF,
+                              REQUEST_ACCESS,
+                              std::move(*info));
             }
         });
     }
@@ -253,18 +278,29 @@
 {
     NS_LOG_FUNCTION(this << linkId);
 
+    const auto stationManager = GetStaMac()->GetWifiRemoteStationManager(linkId);
+    const auto bssid = GetEhtFem(linkId)->GetBssid();
+    const auto allowedWidth = GetEhtFem(linkId)->GetAllowedWidth();
+
+    return GetTimeToCtsEnd(linkId, stationManager->GetRtsTxVector(bssid, allowedWidth));
+}
+
+Time
+DefaultEmlsrManager::GetTimeToCtsEnd(uint8_t linkId, const WifiTxVector& rtsTxVector) const
+{
+    NS_LOG_FUNCTION(this << linkId << rtsTxVector);
+
     auto phy = GetStaMac()->GetWifiPhy(linkId);
     NS_ASSERT_MSG(phy, "No PHY operating on link " << +linkId);
 
-    // we have to check whether the main PHY can switch to take over the UL TXOP
     const auto stationManager = GetStaMac()->GetWifiRemoteStationManager(linkId);
     const auto bssid = GetEhtFem(linkId)->GetBssid();
-    const auto allowedWidth = GetEhtFem(linkId)->GetAllowedWidth();
-
-    const auto rtsTxVector = stationManager->GetRtsTxVector(bssid, allowedWidth);
-    const auto rtsTxTime = phy->CalculateTxDuration(GetRtsSize(), rtsTxVector, phy->GetPhyBand());
     const auto ctsTxVector = stationManager->GetCtsTxVector(bssid, rtsTxVector.GetMode());
-    const auto ctsTxTime = phy->CalculateTxDuration(GetCtsSize(), ctsTxVector, phy->GetPhyBand());
+
+    const auto rtsTxTime =
+        WifiPhy::CalculateTxDuration(GetRtsSize(), rtsTxVector, phy->GetPhyBand());
+    const auto ctsTxTime =
+        WifiPhy::CalculateTxDuration(GetCtsSize(), ctsTxVector, phy->GetPhyBand());
 
     // the main PHY shall terminate the channel switch at the end of CTS reception;
     // the time remaining to the end of CTS reception includes two propagation delays
@@ -277,7 +313,7 @@
     NS_LOG_FUNCTION(this << linkId);
 
     auto mainPhy = GetStaMac()->GetDevice()->GetPhy(m_mainPhyId);
-    auto timeToCtsEnd = GetTimeToCtsEnd(linkId);
+    const auto timeToCtsEnd = GetTimeToCtsEnd(linkId);
     auto switchingTime = mainPhy->GetChannelSwitchDelay();
 
     switch (mainPhy->GetState()->GetState())
@@ -303,21 +339,44 @@
         NS_ABORT_MSG("Main PHY cannot be in state " << mainPhy->GetState()->GetState());
     }
 
-    // TXOP can be started, schedule main PHY switch. Main PHY shall terminate the channel switch
-    // at the end of CTS reception
-    const auto delay = timeToCtsEnd - mainPhy->GetChannelSwitchDelay();
+    // TXOP can be started, main PHY will be scheduled to switch by NotifyRtsSent as soon as the
+    // transmission of the RTS is notified
+    m_switchMainPhyOnRtsTx[linkId] = Simulator::Now();
+
+    return {true, Time{0}};
+}
+
+void
+DefaultEmlsrManager::NotifyRtsSent(uint8_t linkId,
+                                   Ptr<const WifiPsdu> rts,
+                                   const WifiTxVector& txVector)
+{
+    NS_LOG_FUNCTION(this << *rts << txVector);
+
+    const auto it = m_switchMainPhyOnRtsTx.find(linkId);
+
+    if (it == m_switchMainPhyOnRtsTx.cend() || it->second != Simulator::Now())
+    {
+        // No request for main PHY to switch or obsolete request
+        return;
+    }
+
+    // Main PHY shall terminate the channel switch at the end of CTS reception
+    auto mainPhy = GetStaMac()->GetDevice()->GetPhy(m_mainPhyId);
+    const auto delay = GetTimeToCtsEnd(linkId, txVector) - mainPhy->GetChannelSwitchDelay();
+    NS_ASSERT_MSG(delay.IsPositive(),
+                  "RTS is being sent, but not enough time for main PHY to switch");
 
-    NS_ASSERT(delay.IsPositive());
     NS_LOG_DEBUG("Schedule main Phy switch in " << delay.As(Time::US));
-    m_ulMainPhySwitch[linkId] = Simulator::Schedule(delay,
-                                                    &DefaultEmlsrManager::SwitchMainPhy,
-                                                    this,
-                                                    linkId,
-                                                    false,
-                                                    RESET_BACKOFF,
-                                                    DONT_REQUEST_ACCESS);
+    m_ulMainPhySwitch[linkId] = Simulator::Schedule(delay, [=, this]() {
+        SwitchMainPhy(linkId,
+                      false,
+                      RESET_BACKOFF,
+                      DONT_REQUEST_ACCESS,
+                      EmlsrUlTxopRtsSentByAuxPhyTrace{});
+    });
 
-    return {true, Time{0}};
+    m_switchMainPhyOnRtsTx.erase(it);
 }
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/eht/default-emlsr-manager.h ns-3.44/src/wifi/model/eht/default-emlsr-manager.h
--- ns-3.43/src/wifi/model/eht/default-emlsr-manager.h	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/eht/default-emlsr-manager.h	2025-03-09 16:55:49.787372600 -0700
@@ -17,7 +17,7 @@
 {
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * DefaultEmlsrManager is the default EMLSR manager.
  */
@@ -25,62 +25,88 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     DefaultEmlsrManager();
     ~DefaultEmlsrManager() override;
 
+    void NotifyRtsSent(uint8_t linkId,
+                       Ptr<const WifiPsdu> rts,
+                       const WifiTxVector& txVector) override;
+
   protected:
     uint8_t GetLinkToSendEmlOmn() override;
     std::optional<uint8_t> ResendNotification(Ptr<const WifiMpdu> mpdu) override;
     std::pair<bool, Time> DoGetDelayUntilAccessRequest(uint8_t linkId) override;
     void SwitchMainPhyIfTxopGainedByAuxPhy(uint8_t linkId, AcIndex aci) override;
     std::pair<bool, Time> GetDelayUnlessMainPhyTakesOverUlTxop(uint8_t linkId) override;
+    void NotifyEmlsrModeChanged() override;
 
     /**
      * This function is intended to be called when an aux PHY is about to transmit an RTS on
      * the given link to calculate the time remaining to the end of the CTS reception.
      *
-     * \param linkId the ID of the given link
-     * \return the time remaining to the end of the CTS reception
+     * @param linkId the ID of the given link
+     * @return the time remaining to the end of the CTS reception
      */
     Time GetTimeToCtsEnd(uint8_t linkId) const;
 
     /**
+     * This function is intended to be called when an aux PHY is about to transmit an RTS on
+     * the given link to calculate the time remaining to the end of the CTS reception.
+     *
+     * @param linkId the ID of the given link
+     * @param rtsTxVector the TXVECTOR used to transmit the RTS
+     * @return the time remaining to the end of the CTS reception
+     */
+    Time GetTimeToCtsEnd(uint8_t linkId, const WifiTxVector& rtsTxVector) const;
+
+    /**
      * This method can only be called when aux PHYs do not switch link. Switch the main PHY back
-     * to the primary link and reconnect the aux PHY that was operating on the link left by the
+     * to the preferred link and reconnect the aux PHY that was operating on the link left by the
      * main PHY.
      *
-     * \param linkId the ID of the link that the main PHY is leaving
+     * @param linkId the ID of the link that the main PHY is leaving
+     * @param traceInfo information to pass to the main PHY switch traced callback (the fromLinkId
+     *                  and toLinkId fields are set by SwitchMainPhy)
      */
-    void SwitchMainPhyBackToPrimaryLink(uint8_t linkId);
+    void SwitchMainPhyBackToPreferredLink(uint8_t linkId, EmlsrMainPhySwitchTrace&& traceInfo);
 
-    /// Store information about a main PHY switch.
-    struct MainPhySwitchInfo
-    {
-        Time end;     //!< end of channel switching
-        uint8_t from; //!< ID of the link which the main PHY is/has been leaving
-    };
-
-    bool m_switchAuxPhy;  /**< whether Aux PHY should switch channel to operate on the link on which
-                               the Main PHY was operating before moving to the link of the Aux PHY */
-    bool m_auxPhyToSleep; //!< whether Aux PHY should be put into sleep mode while the Main PHY
-                          //!< is operating on the same link as the Aux PHY
-    EventId m_auxPhyToSleepEvent;     //!< the event scheduled to put an Aux PHY into sleep mode
+    bool m_switchAuxPhy; /**< whether Aux PHY should switch channel to operate on the link on which
+                              the Main PHY was operating before moving to the link of the Aux PHY */
     Ptr<WifiPhy> m_auxPhyToReconnect; //!< Aux PHY the ChannelAccessManager of the link on which
                                       //!< the main PHY is operating has to connect a listener to
                                       //!< when the main PHY is back operating on its previous link
     EventId m_auxPhySwitchEvent;      //!< event scheduled for an aux PHY to switch link
-    MainPhySwitchInfo m_mainPhySwitchInfo; //!< main PHY switch info
+    std::map<uint8_t, Time> m_switchMainPhyOnRtsTx; //!< link ID-indexed map of the time when an RTS
+                                                    //!< that requires the main PHY to switch link
+                                                    //!< is expected to be transmitted on the link
 
   private:
+    /**
+     * This function shall be called when the main PHY starts switching to a link on which an aux
+     * PHY that is capable of switching link is operating. This function schedules the aux PHY
+     * switch to occur when the main PHY completes the switch and, in case the connection of the
+     * main PHY to the aux PHY link is postponed because the aux PHY is receiving a PPDU, the
+     * aux PHY switch is postponed accordingly.
+     *
+     * @param auxPhy the aux PHY that has to switch link
+     * @param currLinkId the link on which the aux PHY is operating
+     * @param nextLinkId the link to which the aux PHY will switch
+     * @param duration the remaining time until the aux PHY switch starts
+     */
+    void SwitchAuxPhyAfterMainPhy(Ptr<WifiPhy> auxPhy,
+                                  uint8_t currLinkId,
+                                  uint8_t nextLinkId,
+                                  Time duration);
+
     void DoNotifyMgtFrameReceived(Ptr<const WifiMpdu> mpdu, uint8_t linkId) override;
-    void NotifyEmlsrModeChanged() override;
     void NotifyMainPhySwitch(std::optional<uint8_t> currLinkId,
                              uint8_t nextLinkId,
+                             Ptr<WifiPhy> auxPhy,
                              Time duration) override;
     void DoNotifyIcfReceived(uint8_t linkId) override;
     void DoNotifyUlTxopStart(uint8_t linkId) override;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/eht/eht-capabilities.cc ns-3.44/src/wifi/model/eht/eht-capabilities.cc
--- ns-3.43/src/wifi/model/eht/eht-capabilities.cc	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/eht/eht-capabilities.cc	2025-03-09 16:55:49.787372600 -0700
@@ -594,7 +594,7 @@
 }
 
 uint8_t
-EhtCapabilities::GetHighestSupportedRxMcs(EhtMcsAndNssSet::EhtMcsMapType mapType)
+EhtCapabilities::GetHighestSupportedRxMcs(EhtMcsAndNssSet::EhtMcsMapType mapType) const
 {
     const auto it = m_supportedEhtMcsAndNssSet.supportedEhtMcsAndNssSet.find(mapType);
     if (it == m_supportedEhtMcsAndNssSet.supportedEhtMcsAndNssSet.cend())
@@ -629,7 +629,7 @@
 }
 
 uint8_t
-EhtCapabilities::GetHighestSupportedTxMcs(EhtMcsAndNssSet::EhtMcsMapType mapType)
+EhtCapabilities::GetHighestSupportedTxMcs(EhtMcsAndNssSet::EhtMcsMapType mapType) const
 {
     const auto it = m_supportedEhtMcsAndNssSet.supportedEhtMcsAndNssSet.find(mapType);
     if (it == m_supportedEhtMcsAndNssSet.supportedEhtMcsAndNssSet.cend())
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/eht/eht-capabilities.h ns-3.44/src/wifi/model/eht/eht-capabilities.h
--- ns-3.43/src/wifi/model/eht/eht-capabilities.h	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/eht/eht-capabilities.h	2025-03-09 16:55:49.787372600 -0700
@@ -39,21 +39,21 @@
     /**
      * Get the size of the serialized EHT MAC capabilities subfield
      *
-     * \return the size of the serialized EHT MAC capabilities subfield
+     * @return the size of the serialized EHT MAC capabilities subfield
      */
     uint16_t GetSize() const;
     /**
      * Serialize the EHT MAC capabilities subfield
      *
-     * \param start iterator pointing to where the EHT MAC capabilities subfield should be written
+     * @param start iterator pointing to where the EHT MAC capabilities subfield should be written
      * to
      */
     void Serialize(Buffer::Iterator& start) const;
     /**
      * Deserialize the EHT MAC capabilities subfield
      *
-     * \param start iterator pointing to where the EHT MAC capabilities subfield should be read from
-     * \return the number of bytes read
+     * @param start iterator pointing to where the EHT MAC capabilities subfield should be read from
+     * @return the number of bytes read
      */
     uint16_t Deserialize(Buffer::Iterator start);
 };
@@ -118,21 +118,21 @@
     /**
      * Get the size of the serialized EHT PHY capabilities subfield
      *
-     * \return the size of the serialized EHT PHY capabilities subfield
+     * @return the size of the serialized EHT PHY capabilities subfield
      */
     uint16_t GetSize() const;
     /**
      * Serialize the EHT PHY capabilities subfield
      *
-     * \param start iterator pointing to where the EHT PHY capabilities subfield should be written
+     * @param start iterator pointing to where the EHT PHY capabilities subfield should be written
      * to
      */
     void Serialize(Buffer::Iterator& start) const;
     /**
      * Deserialize the EHT PHY capabilities subfield
      *
-     * \param start iterator pointing to where the EHT PHY capabilities subfield should be read from
-     * \return the number of bytes read
+     * @param start iterator pointing to where the EHT PHY capabilities subfield should be read from
+     * @return the number of bytes read
      */
     uint16_t Deserialize(Buffer::Iterator start);
 };
@@ -162,20 +162,20 @@
     /**
      * Get the size of the serialized Supported EHT-MCS And NSS Set subfield
      *
-     * \return the size of the serialized Supported EHT-MCS And NSS Set  subfield
+     * @return the size of the serialized Supported EHT-MCS And NSS Set  subfield
      */
     uint16_t GetSize() const;
     /**
      * Serialize the Supported EHT-MCS And NSS Set subfield
      *
-     * \param start iterator pointing to where the Supported EHT-MCS And NSS Set subfield should be
+     * @param start iterator pointing to where the Supported EHT-MCS And NSS Set subfield should be
      * written to
      */
     void Serialize(Buffer::Iterator& start) const;
     /**
      * Deserialize the Supported EHT-MCS And NSS Set subfield
      *
-     * \param start iterator pointing to where the Supported EHT-MCS And NSS Set subfield should be
+     * @param start iterator pointing to where the Supported EHT-MCS And NSS Set subfield should be
      * read from \param is2_4Ghz indicating whether PHY is operating in 2.4 GHz based on previously
      * serialized IEs \param heSupportedChannelWidthSet supported channel width set based on
      * previously deserialized HE capabilities IE \param support320MhzIn6Ghz flag whether 320 MHz is
@@ -210,26 +210,26 @@
     /**
      * Get the size of the serialized EHT PPE Thresholds subfield
      *
-     * \return the size of the serialized EHT PPE Thresholds subfield
+     * @return the size of the serialized EHT PPE Thresholds subfield
      */
     uint16_t GetSize() const;
     /**
      * Serialize the EHT PPE Thresholds subfield
      *
-     * \param start iterator pointing to where the EHT PPE Thresholds subfield should be written to
+     * @param start iterator pointing to where the EHT PPE Thresholds subfield should be written to
      */
     void Serialize(Buffer::Iterator& start) const;
     /**
      * Deserialize the EHT PPE Thresholds subfield
      *
-     * \param start iterator pointing to where the EHT PPE Thresholds subfield should be read from
-     * \return the number of bytes read
+     * @param start iterator pointing to where the EHT PPE Thresholds subfield should be read from
+     * @return the number of bytes read
      */
     uint16_t Deserialize(Buffer::Iterator start);
 };
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * The IEEE 802.11be EHT Capabilities
  */
@@ -243,9 +243,9 @@
     /**
      * Constructor
      *
-     * \param is2_4Ghz indicating whether PHY is operating in 2.4 GHz based on previously serialized
+     * @param is2_4Ghz indicating whether PHY is operating in 2.4 GHz based on previously serialized
      * IEs
-     * \param heCapabilities the optional HE capabilities contained in the same management frame
+     * @param heCapabilities the optional HE capabilities contained in the same management frame
      */
     EhtCapabilities(bool is2_4Ghz, const std::optional<HeCapabilities>& heCapabilities);
     // Implementations of pure virtual methods, or overridden from base class.
@@ -256,37 +256,37 @@
     /**
      * Set the maximum MPDU length.
      *
-     * \param length the maximum MPDU length (3895, 7991 or 11454)
+     * @param length the maximum MPDU length (3895, 7991 or 11454)
      */
     void SetMaxMpduLength(uint16_t length);
 
     /**
      * Set the maximum A-MPDU length.
      *
-     * \param maxAmpduLength 2^(23 + x) - 1, x in the range 0 to 1
+     * @param maxAmpduLength 2^(23 + x) - 1, x in the range 0 to 1
      */
     void SetMaxAmpduLength(uint32_t maxAmpduLength);
 
     /**
      * Return the maximum A-MPDU length.
      *
-     * \return the maximum A-MPDU length
+     * @return the maximum A-MPDU length
      */
     uint32_t GetMaxAmpduLength() const;
 
     /**
      * Get the maximum MPDU length.
      *
-     * \return the maximum MPDU length in bytes
+     * @return the maximum MPDU length in bytes
      */
     uint16_t GetMaxMpduLength() const;
 
     /**
      * Set a subfield of the Supported EHT-MCS And NSS Set.
      *
-     * \param mapType the type of the subfield
-     * \param upperMcs the upper MCS of the range
-     * \param maxNss the maximum NSS supported for transmission in the MCS range
+     * @param mapType the type of the subfield
+     * @param upperMcs the upper MCS of the range
+     * @param maxNss the maximum NSS supported for transmission in the MCS range
      */
     void SetSupportedTxEhtMcsAndNss(EhtMcsAndNssSet::EhtMcsMapType mapType,
                                     uint8_t upperMcs,
@@ -294,9 +294,9 @@
     /**
      * Set a subfield of the Supported EHT-MCS And NSS Set.
      *
-     * \param mapType the type of the subfield
-     * \param upperMcs the upper MCS of the range
-     * \param maxNss the maximum NSS supported for reception in the MCS range
+     * @param mapType the type of the subfield
+     * @param upperMcs the upper MCS of the range
+     * @param maxNss the maximum NSS supported for reception in the MCS range
      */
     void SetSupportedRxEhtMcsAndNss(EhtMcsAndNssSet::EhtMcsMapType mapType,
                                     uint8_t upperMcs,
@@ -305,24 +305,24 @@
     /**
      * Get the highest supported RX MCS for a given EHT-MCS map type.
      *
-     * \param mapType the EHT-MCS map type
-     * \return the highest supported RX MCS for the given EHT-MCS map type
+     * @param mapType the EHT-MCS map type
+     * @return the highest supported RX MCS for the given EHT-MCS map type
      */
-    uint8_t GetHighestSupportedRxMcs(EhtMcsAndNssSet::EhtMcsMapType mapType);
+    uint8_t GetHighestSupportedRxMcs(EhtMcsAndNssSet::EhtMcsMapType mapType) const;
     /**
      * Get the highest supported TX MCS for a given EHT-MCS map type.
      *
-     * \param mapType the EHT-MCS map type
-     * \return the highest supported TX MCS for the given EHT-MCS map type
+     * @param mapType the EHT-MCS map type
+     * @return the highest supported TX MCS for the given EHT-MCS map type
      */
-    uint8_t GetHighestSupportedTxMcs(EhtMcsAndNssSet::EhtMcsMapType mapType);
+    uint8_t GetHighestSupportedTxMcs(EhtMcsAndNssSet::EhtMcsMapType mapType) const;
 
     /**
      * Set the EHT PPE threshold info subfield
      *
-     * \param nssPe the NSS_PE subfield
-     * \param ruIndexBitmask the RU Index Bitmask subfield
-     * \param ppeThresholds the PPE thresholds made of pairs (PPETmax, PPET8)
+     * @param nssPe the NSS_PE subfield
+     * @param ruIndexBitmask the RU Index Bitmask subfield
+     * @param ppeThresholds the PPE thresholds made of pairs (PPETmax, PPET8)
      */
     void SetPpeThresholds(uint8_t nssPe,
                           uint8_t ruIndexBitmask,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/eht/eht-configuration.h ns-3.44/src/wifi/model/eht/eht-configuration.h
--- ns-3.43/src/wifi/model/eht/eht-configuration.h	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/eht/eht-configuration.h	2025-03-09 16:55:49.787372600 -0700
@@ -31,7 +31,7 @@
 static constexpr uint8_t DEFAULT_MSD_MAX_N_TXOPS = 1;
 
 /**
- * \brief TID-to-Link Mapping Negotiation Support
+ * @brief TID-to-Link Mapping Negotiation Support
  */
 enum class WifiTidToLinkMappingNegSupport : uint8_t
 {
@@ -58,16 +58,16 @@
 /**@}*/
 
 /**
- * \brief Stream insertion operator.
- * \param [in] os The reference to the output stream.
- * \param [in] negsupport The WifiTidToLinkMappingNegSupport.
- * \return The reference to the output stream.
+ * @brief Stream insertion operator.
+ * @param [in] os The reference to the output stream.
+ * @param [in] negsupport The WifiTidToLinkMappingNegSupport.
+ * @return The reference to the output stream.
  */
 std::ostream& operator<<(std::ostream& os, WifiTidToLinkMappingNegSupport negsupport);
 
 /**
- * \brief EHT configuration
- * \ingroup wifi
+ * @brief EHT configuration
+ * @ingroup wifi
  *
  * This object stores EHT configuration information, for use in modifying
  * AP or STA behavior and for constructing EHT-related information elements.
@@ -80,27 +80,26 @@
     ~EhtConfiguration() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \param dir the direction for the requested TID-to-Link Mapping
-     * \return a TID-indexed map of the list of links where each TID is mapped to
+     * @param dir the direction for the requested TID-to-Link Mapping
+     * @return a TID-indexed map of the list of links where each TID is mapped to
      */
     WifiTidLinkMapping GetTidLinkMapping(WifiDirection dir) const;
 
     /**
      * Set the TID-to-Link mapping for the given direction.
      *
-     * \param dir the direction for the TID-to-Link Mapping
-     * \param mapping a list-of-TIDs-indexed map of the list of links where the TIDs are mapped to
+     * @param dir the direction for the TID-to-Link Mapping
+     * @param mapping a list-of-TIDs-indexed map of the list of links where the TIDs are mapped to
      */
     void SetTidLinkMapping(WifiDirection dir,
                            const std::map<std::list<uint8_t>, std::list<uint8_t>>& mapping);
 
-  private:
     bool m_emlsrActivated;       //!< whether EMLSR option is activated
     Time m_transitionTimeout;    //!< Transition timeout
     Time m_mediumSyncDuration;   //!< duration of the MediumSyncDelay timer
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/eht/eht-frame-exchange-manager.cc ns-3.44/src/wifi/model/eht/eht-frame-exchange-manager.cc
--- ns-3.43/src/wifi/model/eht/eht-frame-exchange-manager.cc	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/eht/eht-frame-exchange-manager.cc	2025-03-09 16:55:49.787372600 -0700
@@ -182,22 +182,24 @@
 
             // EMLSR clients involved in a DL or UL TXOP on another link
             std::set<Mac48Address> emlsrClients;
+            auto ehtFem =
+                StaticCast<EhtFrameExchangeManager>(m_mac->GetFrameExchangeManager(linkId));
 
             // check if an EMLSR client is the holder of an UL TXOP on the other link
-            if (auto ehtFem =
-                    StaticCast<EhtFrameExchangeManager>(m_mac->GetFrameExchangeManager(linkId));
-                ehtFem->m_ongoingTxopEnd.IsPending() && ehtFem->m_txopHolder &&
+            if (ehtFem->m_ongoingTxopEnd.IsPending() && ehtFem->m_txopHolder &&
                 m_mac->GetWifiRemoteStationManager(linkId)->GetEmlsrEnabled(
                     ehtFem->m_txopHolder.value()))
             {
+                NS_LOG_DEBUG("Involved in UL TXOP: " << ehtFem->m_txopHolder.value());
                 emlsrClients.insert(ehtFem->m_txopHolder.value());
             }
 
             // check if EMLSR clients are involved in a DL TXOP on another link
-            for (const auto& address : m_protectedStas)
+            for (const auto& address : ehtFem->m_protectedStas)
             {
                 if (m_mac->GetWifiRemoteStationManager(linkId)->GetEmlsrEnabled(address))
                 {
+                    NS_LOG_DEBUG("Involved in DL TXOP: " << address);
                     emlsrClients.insert(address);
                 }
             }
@@ -317,6 +319,19 @@
 }
 
 void
+EhtFrameExchangeManager::ProtectionCompleted()
+{
+    NS_LOG_FUNCTION(this);
+
+    if (m_staMac && m_staMac->GetEmlsrManager())
+    {
+        m_staMac->GetEmlsrManager()->NotifyProtectionCompleted(m_linkId);
+    }
+
+    HeFrameExchangeManager::ProtectionCompleted();
+}
+
+void
 EhtFrameExchangeManager::ForwardPsduDown(Ptr<const WifiPsdu> psdu, WifiTxVector& txVector)
 {
     NS_LOG_FUNCTION(this << psdu << txVector);
@@ -331,6 +346,38 @@
 
     auto txDuration = WifiPhy::CalculateTxDuration(psdu, txVector, m_phy->GetPhyBand());
 
+    if (m_apMac && psdu->GetHeader(0).IsTrigger())
+    {
+        for (const auto& client : m_sentRtsTo)
+        {
+            if (!GetWifiRemoteStationManager()->GetEmlsrEnabled(client))
+            {
+                continue;
+            }
+            auto clientMld = GetWifiRemoteStationManager()->GetMldAddress(client);
+            NS_ASSERT(clientMld);
+
+            // block transmissions on the other EMLSR links of the EMLSR clients
+            for (uint8_t linkId = 0; linkId < m_apMac->GetNLinks(); ++linkId)
+            {
+                if (linkId != m_linkId &&
+                    m_mac->GetWifiRemoteStationManager(linkId)->GetEmlsrEnabled(*clientMld))
+                {
+                    m_mac->BlockUnicastTxOnLinks(WifiQueueBlockedReason::USING_OTHER_EMLSR_LINK,
+                                                 *clientMld,
+                                                 {linkId});
+                }
+            }
+        }
+    }
+
+    if (m_staMac && m_staMac->IsEmlsrLink(m_linkId) && psdu->GetAddr1() == m_bssid &&
+        psdu->GetHeader(0).IsRts())
+    {
+        NS_ASSERT(m_staMac->GetEmlsrManager());
+        m_staMac->GetEmlsrManager()->NotifyRtsSent(m_linkId, psdu, txVector);
+    }
+
     HeFrameExchangeManager::ForwardPsduDown(psdu, txVector);
     UpdateTxopEndOnTxStart(txDuration, psdu->GetDuration());
 
@@ -361,15 +408,18 @@
     else if (m_staMac && m_staMac->IsEmlsrLink(m_linkId) &&
              m_staMac->GetEmlsrManager()->GetInDeviceInterference())
     {
+        NS_ASSERT(m_staMac->GetEmlsrManager());
+        m_staMac->GetEmlsrManager()->NotifyInDeviceInterferenceStart(m_linkId, txDuration);
+
         for (const auto linkId : m_staMac->GetLinkIds())
         {
             if (auto phy = m_mac->GetWifiPhy(linkId);
                 phy && linkId != m_linkId && m_staMac->IsEmlsrLink(linkId))
             {
-                auto txPowerDbm = phy->GetPower(txVector.GetTxPowerLevel()) + phy->GetTxGain();
+                const auto txPower = phy->GetPower(txVector.GetTxPowerLevel()) + phy->GetTxGain();
                 // generate in-device interference on the other EMLSR link for the duration of this
                 // transmission
-                GenerateInDeviceInterference(linkId, txDuration, DbmToW(txPowerDbm));
+                GenerateInDeviceInterference(linkId, txDuration, DbmToW(txPower));
             }
         }
     }
@@ -387,16 +437,52 @@
 
     if (m_apMac)
     {
+        // check if this is a BSRP TF used as ICF for some EMLSR client
+        if (IsTrigger(psduMap))
+        {
+            CtrlTriggerHeader trigger;
+            psduMap.cbegin()->second->GetPayload(0)->PeekHeader(trigger);
+
+            if (trigger.IsBsrp())
+            {
+                auto recipients = GetTfRecipients(trigger);
+                for (const auto& client : recipients)
+                {
+                    if (!GetWifiRemoteStationManager()->GetEmlsrEnabled(client))
+                    {
+                        continue;
+                    }
+                    auto clientMld = GetWifiRemoteStationManager()->GetMldAddress(client);
+                    NS_ASSERT(clientMld);
+
+                    // block transmissions on the other EMLSR links of the EMLSR clients
+                    for (uint8_t linkId = 0; linkId < m_apMac->GetNLinks(); ++linkId)
+                    {
+                        if (linkId != m_linkId &&
+                            m_mac->GetWifiRemoteStationManager(linkId)->GetEmlsrEnabled(*clientMld))
+                        {
+                            m_mac->BlockUnicastTxOnLinks(
+                                WifiQueueBlockedReason::USING_OTHER_EMLSR_LINK,
+                                *clientMld,
+                                {linkId});
+                        }
+                    }
+                }
+            }
+        }
+
         // check if the EMLSR clients shall switch back to listening operation at the end of this
         // PPDU
         for (auto clientIt = m_protectedStas.begin(); clientIt != m_protectedStas.end();)
         {
             auto aid = GetWifiRemoteStationManager()->GetAssociationId(*clientIt);
+            const auto psduMapIt = psduMap.find(aid);
+            const auto aidNotFoundAndNotTf = (psduMapIt == psduMap.cend()) && !IsTrigger(psduMap);
+            // the PSDU to process: the one addressed to the given AID (if any) or the unique one
+            const auto psdu = (psduMapIt != psduMap.cend() ? psduMapIt : psduMap.cbegin())->second;
 
-            if (auto psduMapIt = psduMap.find(aid);
-                GetWifiRemoteStationManager()->GetEmlsrEnabled(*clientIt) &&
-                (psduMapIt == psduMap.cend() ||
-                 GetEmlsrSwitchToListening(psduMapIt->second, aid, *clientIt)))
+            if (GetWifiRemoteStationManager()->GetEmlsrEnabled(*clientIt) &&
+                (aidNotFoundAndNotTf || GetEmlsrSwitchToListening(psdu, aid, *clientIt)))
             {
                 EmlsrSwitchToListening(*clientIt, txDuration);
                 // this client is no longer involved in the current TXOP
@@ -411,15 +497,18 @@
     else if (m_staMac && m_staMac->IsEmlsrLink(m_linkId) &&
              m_staMac->GetEmlsrManager()->GetInDeviceInterference())
     {
+        NS_ASSERT(m_staMac->GetEmlsrManager());
+        m_staMac->GetEmlsrManager()->NotifyInDeviceInterferenceStart(m_linkId, txDuration);
+
         for (const auto linkId : m_staMac->GetLinkIds())
         {
             if (auto phy = m_mac->GetWifiPhy(linkId);
                 phy && linkId != m_linkId && m_staMac->IsEmlsrLink(linkId))
             {
-                auto txPowerDbm = phy->GetPower(txVector.GetTxPowerLevel()) + phy->GetTxGain();
+                const auto txPower = phy->GetPower(txVector.GetTxPowerLevel()) + phy->GetTxGain();
                 // generate in-device interference on the other EMLSR link for the duration of this
                 // transmission
-                GenerateInDeviceInterference(linkId, txDuration, DbmToW(txPowerDbm));
+                GenerateInDeviceInterference(linkId, txDuration, DbmToW(txPower));
             }
         }
     }
@@ -477,69 +566,137 @@
     HeFrameExchangeManager::IntraBssNavResetTimeout();
 }
 
-void
-EhtFrameExchangeManager::EmlsrSwitchToListening(const Mac48Address& address, const Time& delay)
+bool
+EhtFrameExchangeManager::UnblockEmlsrLinksIfAllowed(Mac48Address address)
 {
-    NS_LOG_FUNCTION(this << address << delay.As(Time::US));
+    NS_LOG_FUNCTION(this << address);
 
     auto mldAddress = GetWifiRemoteStationManager()->GetMldAddress(address);
     NS_ASSERT_MSG(mldAddress, "MLD address not found for " << address);
     NS_ASSERT_MSG(m_apMac, "This function shall only be called by AP MLDs");
+    std::set<uint8_t> linkIds{m_linkId};
+
+    /**
+     * Do nothing if the EMLSR client is involved in a DL or UL TXOP on another EMLSR link. This
+     * may happen, e.g., when the AP MLD sent an MU-RTS to multiple stations on this link, some of
+     * which responded, but this EMLSR client did not, e.g., because it concurrently started an UL
+     * TXOP on another link. The AP MLD then started a (long) DL MU transmission on this link,
+     * during which the EMLSR client completed the UL TXOP and started being involved in another
+     * DL or UL TXOP (note that DL TXOP is possible because the AP MLD considered the EMLSR client
+     * unprotected as soon as it detected the start of the previous UL TXOP). A Block Ack timeout
+     * for the EMLSR client occurs at the end of the DL MU transmission (which brings us here) and
+     * it may occur while the EMLSR client is still involved in a DL or UL TXOP.
+     *
+     *          ┌─────────────┐          ┌───────────────┐
+     *          │  MU-RTS to  │          │    Data to    │      BA timeout for us
+     *          │us and others│          │ us and others │        |
+     *  ────────┴─────────────┴┬────────┬┴───────────────┴┬───────┬──────────────
+     *  [this link]            │CTS from│                 │BA from│
+     *                         │ others │                 │ others│
+     *                         └────────┘                 └───────┘
+     *                                          ┌───────┐
+     *                     ┌───┐      ┌──┐      │ MU-RTS│     ┌──────┐
+     *  [other link]       │CTS│      │BA│      │ to us │     │ Data │
+     *  ─────────┬────────┬┴───┴┬────┬┴──┴──────┴───────┴┬───┬┴──────┴┬──┬───────
+     *           │   RTS  │     │Data│                   │CTS│        │BA│
+     *           │from us │     └────┘                   └───┘        └──┘
+     *           └────────┘
+     */
 
     for (uint8_t linkId = 0; linkId < m_apMac->GetNLinks(); ++linkId)
     {
-        if (auto ehtFem =
-                StaticCast<EhtFrameExchangeManager>(m_mac->GetFrameExchangeManager(linkId));
-            ehtFem->m_ongoingTxopEnd.IsPending() && ehtFem->m_txopHolder &&
+        if (!m_mac->GetWifiRemoteStationManager(linkId)->GetEmlsrEnabled(*mldAddress))
+        {
+            continue; // not an EMLSR link
+        }
+
+        auto ehtFem = StaticCast<EhtFrameExchangeManager>(m_mac->GetFrameExchangeManager(linkId));
+
+        if (ehtFem->m_ongoingTxopEnd.IsPending() && ehtFem->m_txopHolder &&
             m_mac->GetWifiRemoteStationManager(linkId)->GetMldAddress(*ehtFem->m_txopHolder) ==
                 mldAddress)
         {
-            // this EMLSR client is the holder of an UL TXOP, do not unblock links
-            return;
+            NS_LOG_DEBUG("EMLSR client " << *mldAddress << " is the holder of an UL TXOP on link "
+                                         << +linkId << ", do not unblock links");
+            return false;
         }
-    }
 
-    // this EMLSR client switches back to listening operation a transition delay
-    // after the given delay
-    auto emlCapabilities = GetWifiRemoteStationManager()->GetStationEmlCapabilities(address);
-    NS_ASSERT(emlCapabilities);
+        if (linkId == m_linkId)
+        {
+            // no need to check if the EMLSR client is involved in a DL TXOP on this link
+            continue;
+        }
 
-    std::set<uint8_t> linkIds;
-    for (uint8_t linkId = 0; linkId < m_mac->GetNLinks(); linkId++)
-    {
-        if (m_mac->GetWifiRemoteStationManager(linkId)->GetEmlsrEnabled(*mldAddress))
+        linkIds.insert(linkId);
+
+        if (auto linkAddr =
+                m_apMac->GetWifiRemoteStationManager(linkId)->GetAffiliatedStaAddress(*mldAddress);
+            linkAddr &&
+            (ehtFem->m_sentRtsTo.contains(*linkAddr) || ehtFem->m_sentFrameTo.contains(*linkAddr) ||
+             ehtFem->m_protectedStas.contains(*linkAddr)))
         {
-            linkIds.insert(linkId);
+            NS_LOG_DEBUG("EMLSR client " << address
+                                         << " has been sent an ICF, do not unblock links");
+            return false;
         }
     }
 
+    // unblock DL transmissions with reason USING_OTHER_EMLSR_LINK
+    m_mac->UnblockUnicastTxOnLinks(WifiQueueBlockedReason::USING_OTHER_EMLSR_LINK,
+                                   *mldAddress,
+                                   linkIds);
+    return true;
+}
+
+void
+EhtFrameExchangeManager::EmlsrSwitchToListening(Mac48Address address, const Time& delay)
+{
+    NS_LOG_FUNCTION(this << address << delay.As(Time::US));
+
+    auto mldAddress = GetWifiRemoteStationManager()->GetMldAddress(address);
+    NS_ASSERT_MSG(mldAddress, "MLD address not found for " << address);
+    NS_ASSERT_MSG(m_apMac, "This function shall only be called by AP MLDs");
+
     auto blockLinks = [=, this]() {
-        // the reason for blocking the other EMLSR links has changed now
-        m_mac->UnblockUnicastTxOnLinks(WifiQueueBlockedReason::USING_OTHER_EMLSR_LINK,
-                                       *mldAddress,
-                                       linkIds);
+        if (!UnblockEmlsrLinksIfAllowed(address))
+        {
+            NS_LOG_DEBUG("Could not unblock transmissions to " << address);
+            return;
+        }
+
+        // this EMLSR client switches back to listening operation
+        std::set<uint8_t> linkIds;
+        for (uint8_t linkId = 0; linkId < m_mac->GetNLinks(); linkId++)
+        {
+            if (m_mac->GetWifiRemoteStationManager(linkId)->GetEmlsrEnabled(*mldAddress))
+            {
+                linkIds.insert(linkId);
+            }
+        }
 
         // block DL transmissions on this link until transition delay elapses
         m_mac->BlockUnicastTxOnLinks(WifiQueueBlockedReason::WAITING_EMLSR_TRANSITION_DELAY,
                                      *mldAddress,
                                      linkIds);
-    };
 
-    delay.IsZero() ? blockLinks() : static_cast<void>(Simulator::Schedule(delay, blockLinks));
+        auto unblockLinks = [=, this]() {
+            m_mac->UnblockUnicastTxOnLinks(WifiQueueBlockedReason::WAITING_EMLSR_TRANSITION_DELAY,
+                                           *mldAddress,
+                                           linkIds);
+        };
 
-    // unblock all EMLSR links when the transition delay elapses
-    auto unblockLinks = [=, this]() {
-        m_mac->UnblockUnicastTxOnLinks(WifiQueueBlockedReason::WAITING_EMLSR_TRANSITION_DELAY,
-                                       *mldAddress,
-                                       linkIds);
-    };
+        // unblock all EMLSR links when the transition delay elapses
+        auto emlCapabilities = GetWifiRemoteStationManager()->GetStationEmlCapabilities(address);
+        NS_ASSERT(emlCapabilities);
+        auto endDelay = CommonInfoBasicMle::DecodeEmlsrTransitionDelay(
+            emlCapabilities->get().emlsrTransitionDelay);
 
-    auto endDelay = delay + CommonInfoBasicMle::DecodeEmlsrTransitionDelay(
-                                emlCapabilities->get().emlsrTransitionDelay);
+        endDelay.IsZero() ? unblockLinks()
+                          : static_cast<void>(m_transDelayTimer[*mldAddress] =
+                                                  Simulator::Schedule(endDelay, unblockLinks));
+    };
 
-    endDelay.IsZero() ? unblockLinks()
-                      : static_cast<void>(m_transDelayTimer[*mldAddress] =
-                                              Simulator::Schedule(endDelay, unblockLinks));
+    delay.IsZero() ? blockLinks() : static_cast<void>(Simulator::Schedule(delay, blockLinks));
 }
 
 void
@@ -629,54 +786,89 @@
 }
 
 void
-EhtFrameExchangeManager::SendMuRts(const WifiTxParameters& txParams)
+EhtFrameExchangeManager::SetIcfPaddingAndTxVector(CtrlTriggerHeader& trigger,
+                                                  WifiTxVector& txVector) const
 {
-    NS_LOG_FUNCTION(this << &txParams);
+    NS_LOG_FUNCTION(this << trigger << txVector);
 
+    if (!trigger.IsMuRts() && !trigger.IsBsrp())
+    {
+        NS_LOG_INFO("Not an ICF");
+        return;
+    }
+
+    const auto recipients = GetTfRecipients(trigger);
     uint8_t maxPaddingDelay = 0;
+    bool isUnprotectedEmlsrDst = false;
 
-    // block transmissions on the other EMLSR links of the EMLSR clients
-    for (const auto& address : m_sentRtsTo)
+    for (const auto& address : recipients)
     {
-        if (!GetWifiRemoteStationManager()->GetEmlsrEnabled(address))
+        if (!GetWifiRemoteStationManager()->GetEmlsrEnabled(address) ||
+            m_protectedStas.contains(address))
         {
-            continue;
+            continue; // not an EMLSR client or EMLSR client already protected
         }
 
+        isUnprotectedEmlsrDst = true;
         auto emlCapabilities = GetWifiRemoteStationManager()->GetStationEmlCapabilities(address);
         NS_ASSERT(emlCapabilities);
         maxPaddingDelay = std::max(maxPaddingDelay, emlCapabilities->get().emlsrPaddingDelay);
+    }
 
-        auto mldAddress = GetWifiRemoteStationManager()->GetMldAddress(address);
-        NS_ASSERT(mldAddress);
-
-        for (uint8_t linkId = 0; linkId < m_apMac->GetNLinks(); linkId++)
-        {
-            if (linkId != m_linkId &&
-                m_mac->GetWifiRemoteStationManager(linkId)->GetEmlsrEnabled(*mldAddress))
-            {
-                m_mac->BlockUnicastTxOnLinks(WifiQueueBlockedReason::USING_OTHER_EMLSR_LINK,
-                                             *mldAddress,
-                                             {linkId});
-            }
-        }
+    if (isUnprotectedEmlsrDst)
+    {
+        // The initial Control frame of frame exchanges shall be sent in the non-HT PPDU or
+        // non-HT duplicate PPDU format using a rate of 6 Mb/s, 12 Mb/s, or 24 Mb/s.
+        // (Sec. 35.3.17 of 802.11be D3.0)
+        GetWifiRemoteStationManager()->AdjustTxVectorForIcf(txVector);
     }
 
     // add padding (if needed)
     if (maxPaddingDelay > 0)
     {
-        NS_ASSERT(txParams.m_protection &&
-                  txParams.m_protection->method == WifiProtection::MU_RTS_CTS);
-        auto protection = static_cast<WifiMuRtsCtsProtection*>(txParams.m_protection.get());
-        NS_ASSERT(protection->muRts.IsMuRts());
-
         // see formula (35-1) in Sec. 35.5.2.2.3 of 802.11be D3.0
-        auto rate = protection->muRtsTxVector.GetMode().GetDataRate(protection->muRtsTxVector);
+        auto rate = txVector.GetMode().GetDataRate(txVector);
         std::size_t nDbps = rate / 1e6 * 4; // see Table 17-4 of 802.11-2020
-        protection->muRts.SetPaddingSize((1 << (maxPaddingDelay + 2)) * nDbps / 8);
+        trigger.SetPaddingSize((1 << (maxPaddingDelay + 2)) * nDbps / 8);
     }
+}
+
+void
+EhtFrameExchangeManager::ReceivedQosNullAfterBsrpTf(Mac48Address sender)
+{
+    NS_LOG_FUNCTION(this << sender);
 
-    HeFrameExchangeManager::SendMuRts(txParams);
+    // an EMLSR client responding to a BSRP TF must be considered protected
+    if (GetWifiRemoteStationManager()->GetEmlsrEnabled(sender))
+    {
+        m_protectedStas.insert(sender);
+    }
+
+    HeFrameExchangeManager::ReceivedQosNullAfterBsrpTf(sender);
+}
+
+bool
+EhtFrameExchangeManager::EmlsrClientCannotRespondToIcf() const
+{
+    NS_ASSERT(m_staMac);
+    if (m_staMac->IsEmlsrLink(m_linkId))
+    {
+        auto mainPhy = m_staMac->GetDevice()->GetPhy(m_staMac->GetEmlsrManager()->GetMainPhyId());
+
+        // while an ICF is being received on this link, an aux PHY that is not TX capable may get
+        // a TXOP on another link, release the channel and request the main PHY to switch channel.
+        // It may be decided to have the main PHY start a TXOP on the other link a PIFS after the
+        // channel switch (e.g., MAC header information is not used and AllowUlTxopInRx is true).
+        // Thus, when the ICF is received on this link, it is not dropped but, when the CTS must
+        // be transmitted, the main PHY has already started transmitting on the other link. In
+        // such a case, do not respond to the ICF.
+        if (mainPhy->IsStateSwitching() || m_mac->GetLinkForPhy(mainPhy) != m_linkId)
+        {
+            NS_LOG_DEBUG("Main PHY is switching or operating on another link, abort ICF response");
+            return true;
+        }
+    }
+    return false;
 }
 
 void
@@ -686,37 +878,122 @@
 {
     NS_LOG_FUNCTION(this << muRtsHdr << trigger << muRtsSnr);
 
-    NS_ASSERT(m_staMac);
-    if (auto emlsrManager = m_staMac->GetEmlsrManager())
+    if (EmlsrClientCannotRespondToIcf())
     {
-        auto mainPhy = m_staMac->GetDevice()->GetPhy(emlsrManager->GetMainPhyId());
+        return;
+    }
+    HeFrameExchangeManager::SendCtsAfterMuRts(muRtsHdr, trigger, muRtsSnr);
+}
 
-        // an aux PHY that is not TX capable may get a TXOP, release the channel and request
-        // the main PHY to switch channel. Shortly afterwards, the AP MLD may send an ICF, thus
-        // when the main PHY is scheduled to send the CTS, the main PHY may be switching channel
-        // or may be operating on another link
-        if (mainPhy->IsStateSwitching() || m_mac->GetLinkForPhy(mainPhy) != m_linkId)
+void
+EhtFrameExchangeManager::SendQosNullFramesInTbPpdu(const CtrlTriggerHeader& trigger,
+                                                   const WifiMacHeader& hdr)
+{
+    NS_LOG_FUNCTION(this << trigger << hdr);
+
+    if (trigger.IsBsrp() && EmlsrClientCannotRespondToIcf())
+    {
+        return;
+    }
+    HeFrameExchangeManager::SendQosNullFramesInTbPpdu(trigger, hdr);
+}
+
+void
+EhtFrameExchangeManager::SwitchToListeningOrUnblockLinks(const std::set<Mac48Address>& clients)
+{
+    NS_LOG_FUNCTION(this);
+
+    for (const auto& address : clients)
+    {
+        if (GetWifiRemoteStationManager()->GetEmlsrEnabled(address))
         {
-            NS_LOG_DEBUG("Main PHY is switching or operating on another link, abort sending CTS");
-            return;
+            // EMLSR client switched to listening operations if it was protected, otherwise
+            // simply unblock transmissions
+            m_protectedStas.contains(address) ? EmlsrSwitchToListening(address, Seconds(0))
+                                              : (void)(UnblockEmlsrLinksIfAllowed(address));
+            m_protectedStas.erase(address);
         }
     }
-    HeFrameExchangeManager::SendCtsAfterMuRts(muRtsHdr, trigger, muRtsSnr);
 }
 
 void
 EhtFrameExchangeManager::CtsAfterMuRtsTimeout(Ptr<WifiMpdu> muRts, const WifiTxVector& txVector)
 {
     NS_LOG_FUNCTION(this << *muRts << txVector);
+    SwitchToListeningOrUnblockLinks(m_sentRtsTo);
+    HeFrameExchangeManager::CtsAfterMuRtsTimeout(muRts, txVector);
+}
 
-    // check if all the clients solicited by the MU-RTS are EMLSR clients that have sent (or
-    // are sending) a frame to the AP
+bool
+EhtFrameExchangeManager::GetUpdateCwOnCtsTimeout() const
+{
+    NS_LOG_FUNCTION(this);
+
+    if (m_apMac)
+    {
+        if (const auto apEmlsrManager = m_apMac->GetApEmlsrManager();
+            apEmlsrManager && IsCrossLinkCollision(m_sentRtsTo))
+        {
+            return apEmlsrManager->UpdateCwAfterFailedIcf();
+        }
+    }
+
+    return HeFrameExchangeManager::GetUpdateCwOnCtsTimeout();
+}
+
+void
+EhtFrameExchangeManager::TbPpduTimeout(WifiPsduMap* psduMap, std::size_t nSolicitedStations)
+{
+    NS_LOG_FUNCTION(this << psduMap << nSolicitedStations);
+
+    const auto& staMissedTbPpduFrom = m_txTimer.GetStasExpectedToRespond();
+    const auto crossLinkCollision = IsCrossLinkCollision(staMissedTbPpduFrom);
+
+    if (staMissedTbPpduFrom.size() != nSolicitedStations)
+    {
+        // some STAs replied, hence the transmission succeeded. EMLSR clients that did not
+        // respond are switching back to listening operations
+        SwitchToListeningOrUnblockLinks(staMissedTbPpduFrom);
+    }
+
+    const auto apEmlsrManager = m_apMac->GetApEmlsrManager();
+    const auto updateFailedCw =
+        crossLinkCollision && apEmlsrManager ? apEmlsrManager->UpdateCwAfterFailedIcf() : true;
+    DoTbPpduTimeout(psduMap, nSolicitedStations, updateFailedCw);
+}
+
+void
+EhtFrameExchangeManager::BlockAcksInTbPpduTimeout(WifiPsduMap* psduMap,
+                                                  std::size_t nSolicitedStations)
+{
+    NS_LOG_FUNCTION(this << psduMap << nSolicitedStations);
+
+    const auto& staMissedTbPpduFrom = m_txTimer.GetStasExpectedToRespond();
+
+    if (staMissedTbPpduFrom.size() != nSolicitedStations)
+    {
+        // some STAs replied, hence the transmission succeeded. EMLSR clients that did not
+        // respond are switching back to listening operations
+        SwitchToListeningOrUnblockLinks(staMissedTbPpduFrom);
+    }
+
+    HeFrameExchangeManager::BlockAcksInTbPpduTimeout(psduMap, nSolicitedStations);
+}
+
+bool
+EhtFrameExchangeManager::IsCrossLinkCollision(
+    const std::set<Mac48Address>& staMissedResponseFrom) const
+{
+    NS_LOG_FUNCTION(this << staMissedResponseFrom.size());
+
+    // check if all the clients that did not respond to the ICF are EMLSR clients that have sent
+    // (or are sending) a frame to the AP on another link
     auto crossLinkCollision = true;
 
     // we blocked transmissions on the other EMLSR links for the EMLSR clients we sent the ICF to.
-    // Given that no client responded, we can unblock transmissions for a client if there is no
-    // ongoing UL TXOP held by that client
-    for (const auto& address : m_sentRtsTo)
+    // For clients that did not respond, we can unblock transmissions if there is no ongoing
+    // UL TXOP held by that client
+    for (const auto& address : staMissedResponseFrom)
     {
         if (!GetWifiRemoteStationManager()->GetEmlsrEnabled(address))
         {
@@ -730,7 +1007,8 @@
         std::set<uint8_t> linkIds; // all EMLSR links of EMLSR client
         for (uint8_t linkId = 0; linkId < m_apMac->GetNLinks(); linkId++)
         {
-            if (m_mac->GetWifiRemoteStationManager(linkId)->GetEmlsrEnabled(*mldAddress))
+            if (m_mac->GetWifiRemoteStationManager(linkId)->GetEmlsrEnabled(*mldAddress) &&
+                linkId != m_linkId)
             {
                 linkIds.insert(linkId);
             }
@@ -765,16 +1043,9 @@
         {
             crossLinkCollision = false;
         }
-
-        linkIds.erase(m_linkId);
-        m_mac->UnblockUnicastTxOnLinks(WifiQueueBlockedReason::USING_OTHER_EMLSR_LINK,
-                                       *mldAddress,
-                                       linkIds);
     }
 
-    auto updateFailedCw =
-        crossLinkCollision ? m_apMac->GetApEmlsrManager()->UpdateCwAfterFailedIcf() : true;
-    DoCtsAfterMuRtsTimeout(muRts, txVector, updateFailedCw);
+    return crossLinkCollision;
 }
 
 void
@@ -904,9 +1175,9 @@
 }
 
 void
-EhtFrameExchangeManager::TransmissionFailed()
+EhtFrameExchangeManager::TransmissionFailed(bool forceCurrentCw)
 {
-    NS_LOG_FUNCTION(this);
+    NS_LOG_FUNCTION(this << forceCurrentCw);
 
     if (m_staMac && m_staMac->IsEmlsrLink(m_linkId) &&
         m_staMac->GetEmlsrManager()->GetElapsedMediumSyncDelayTimer(m_linkId))
@@ -916,7 +1187,7 @@
         m_staMac->GetEmlsrManager()->DecrementMediumSyncDelayNTxops(m_linkId);
     }
 
-    HeFrameExchangeManager::TransmissionFailed();
+    HeFrameExchangeManager::TransmissionFailed(forceCurrentCw);
 }
 
 void
@@ -1040,6 +1311,13 @@
             UpdateTxopEndOnRxEnd(psdu->GetDuration());
         }
     }
+
+    if (m_staMac && m_icfReceived)
+    {
+        // notify the EMLSR manager
+        m_staMac->GetEmlsrManager()->NotifyIcfReceived(m_linkId);
+        m_icfReceived = false;
+    }
 }
 
 bool
@@ -1083,6 +1361,19 @@
             m_mac->BlockUnicastTxOnLinks(WifiQueueBlockedReason::USING_OTHER_EMLSR_LINK,
                                          *mldAddress,
                                          {linkId});
+
+            // the AP MLD may have sent an ICF to the EMLSR client on this link while the EMLSR
+            // client was starting a TXOP on another link. To be safe, besides blocking
+            // transmissions, remove the EMLSR client from the protected stations on this link
+            auto linkAddr =
+                m_mac->GetWifiRemoteStationManager(linkId)->GetAffiliatedStaAddress(*mldAddress);
+            NS_ASSERT(linkAddr.has_value());
+            auto ehtFem =
+                StaticCast<EhtFrameExchangeManager>(m_mac->GetFrameExchangeManager(linkId));
+            NS_LOG_DEBUG("Remove " << *linkAddr << " from protected STAs");
+            ehtFem->m_protectedStas.erase(*linkAddr);
+            ehtFem->m_sentRtsTo.erase(*linkAddr);
+            ehtFem->m_sentFrameTo.erase(*linkAddr);
         }
     }
 
@@ -1127,19 +1418,13 @@
                                      const WifiTxVector& txVector,
                                      bool inAmpdu)
 {
+    NS_LOG_FUNCTION(this << *mpdu << rxSignalInfo << txVector << inAmpdu);
+
     // The received MPDU is either broadcast or addressed to this station
     NS_ASSERT(mpdu->GetHeader().GetAddr1().IsGroup() || mpdu->GetHeader().GetAddr1() == m_self);
 
     const auto& hdr = mpdu->GetHeader();
-
-    if (m_apMac)
-    {
-        // if the AP MLD received an MPDU from an EMLSR client that is starting an UL TXOP,
-        // block transmissions to the EMLSR client on other links
-        CheckEmlsrClientStartingTxop(hdr, txVector);
-    }
-
-    bool icfReceived = false;
+    const auto sender = hdr.GetAddr2();
 
     if (hdr.IsTrigger())
     {
@@ -1153,13 +1438,14 @@
 
         if (hdr.GetAddr1() != m_self &&
             (!hdr.GetAddr1().IsBroadcast() || !m_staMac->IsAssociated() ||
-             hdr.GetAddr2() != m_bssid // not sent by the AP this STA is associated with
+             sender != m_bssid // not sent by the AP this STA is associated with
              || trigger.FindUserInfoWithAid(m_staMac->GetAssociationId()) == trigger.end()))
         {
             return; // not addressed to us
         }
 
-        if (trigger.IsMuRts() && m_staMac->IsEmlsrLink(m_linkId))
+        if ((trigger.IsMuRts() || trigger.IsBsrp()) && !m_ongoingTxopEnd.IsPending() &&
+            m_staMac->IsEmlsrLink(m_linkId))
         {
             // this is an initial Control frame
             if (DropReceivedIcf())
@@ -1170,7 +1456,7 @@
             auto emlsrManager = m_staMac->GetEmlsrManager();
             NS_ASSERT(emlsrManager);
 
-            icfReceived = true;
+            m_icfReceived = true;
 
             // we just got involved in a DL TXOP. Check if we are still involved in the TXOP in a
             // SIFS (we are expected to reply by sending a CTS frame)
@@ -1179,32 +1465,97 @@
             m_ongoingTxopEnd = Simulator::Schedule(m_phy->GetSifs() + NanoSeconds(1),
                                                    &EhtFrameExchangeManager::TxopEnd,
                                                    this,
-                                                   hdr.GetAddr2());
+                                                   sender);
         }
     }
 
-    // We impose that an aux PHY is only able to receive an ICF, a CTS or a management frame
-    // (we are interested in receiving mainly Beacon frames). Note that other frames are still
-    // post-processed, e.g., used to set the NAV and the TXOP holder.
+    if (!m_icfReceived && ShallDropReceivedMpdu(mpdu))
+    {
+        NS_LOG_DEBUG("Drop received MPDU: " << *mpdu);
+        return;
+    }
+
+    HeFrameExchangeManager::ReceiveMpdu(mpdu, rxSignalInfo, txVector, inAmpdu);
+
+    if (m_apMac && GetWifiRemoteStationManager()->GetEmlsrEnabled(sender))
+    {
+        if (hdr.IsRts() && !m_sendCtsEvent.IsPending())
+        {
+            // received RTS but did not send CTS (e.g., NAV busy), start transition delay
+            EmlsrSwitchToListening(sender, Time{0});
+            return;
+        }
+
+        // if the AP MLD received an MPDU from an EMLSR client that is starting an UL TXOP,
+        // block transmissions to the EMLSR client on other links
+        CheckEmlsrClientStartingTxop(hdr, txVector);
+    }
+}
+
+void
+EhtFrameExchangeManager::EndReceiveAmpdu(Ptr<const WifiPsdu> psdu,
+                                         const RxSignalInfo& rxSignalInfo,
+                                         const WifiTxVector& txVector,
+                                         const std::vector<bool>& perMpduStatus)
+{
+    NS_LOG_FUNCTION(
+        this << *psdu << rxSignalInfo << txVector << perMpduStatus.size()
+             << std::all_of(perMpduStatus.begin(), perMpduStatus.end(), [](bool v) { return v; }));
+
+    if (ShallDropReceivedMpdu(*psdu->begin()))
+    {
+        return;
+    }
+
+    HeFrameExchangeManager::EndReceiveAmpdu(psdu, rxSignalInfo, txVector, perMpduStatus);
+}
+
+bool
+EhtFrameExchangeManager::ShallDropReceivedMpdu(Ptr<const WifiMpdu> mpdu) const
+{
+    NS_LOG_FUNCTION(this << *mpdu);
+
+    // this function only checks frames that shall be dropped by an EMLSR client
+    if (!m_staMac || !m_staMac->IsEmlsrLink(m_linkId))
+    {
+        return false;
+    }
+
+    const auto& hdr = mpdu->GetHeader();
+
+    // We impose that an aux PHY is only able to receive an ICF, a CF-End, a CTS or a management
+    // frame (we are interested in receiving mainly Beacon frames). Note that other frames are
+    // still post-processed, e.g., used to set the NAV and the TXOP holder.
     // The motivation is that, e.g., an AP MLD may send an ICF to EMLSR clients A and B;
     // A responds while B does not; the AP MLD sends a DL MU PPDU to both clients followed
     // by an MU-BAR to solicit a BlockAck from both clients. If an aux PHY of client B is
     // operating on this link, the MU-BAR will be received and a TB PPDU response sent
     // through the aux PHY.
-    if (m_staMac && m_staMac->IsEmlsrLink(m_linkId) &&
-        m_mac->GetLinkForPhy(m_staMac->GetEmlsrManager()->GetMainPhyId()) != m_linkId &&
-        !icfReceived && !mpdu->GetHeader().IsCts() && !mpdu->GetHeader().IsMgt())
+    if (hdr.IsMgt() || hdr.IsCts() || hdr.IsCfEnd() || (hdr.IsData() && hdr.GetAddr1().IsGroup()))
     {
-        NS_LOG_DEBUG("Dropping " << *mpdu << " received by an aux PHY on link " << +m_linkId);
-        return;
+        return false;
     }
 
-    HeFrameExchangeManager::ReceiveMpdu(mpdu, rxSignalInfo, txVector, inAmpdu);
+    // other frames cannot be received by an aux PHY
+    if (m_mac->GetLinkForPhy(m_staMac->GetEmlsrManager()->GetMainPhyId()) != m_linkId)
+    {
+        NS_LOG_DEBUG("Dropping " << *mpdu << " received by an aux PHY on link " << +m_linkId);
+        return true;
+    }
 
-    if (icfReceived)
+    // other frames cannot be received by the main PHY when not involved in any TXOP
+    if (!m_ongoingTxopEnd.IsPending() &&
+        std::none_of(wifiAcList.cbegin(), wifiAcList.cend(), [=, this](const auto& aciAcPair) {
+            return m_mac->GetQosTxop(aciAcPair.first)->GetTxopStartTime(m_linkId).has_value();
+        }))
     {
-        m_staMac->GetEmlsrManager()->NotifyIcfReceived(m_linkId);
+        NS_LOG_DEBUG("Dropping " << *mpdu << " received by main PHY on link " << +m_linkId
+                                 << " while no TXOP is ongoing");
+        return true;
     }
+
+    // other frames can be received by the main PHY when involved in a TXOP
+    return false;
 }
 
 bool
@@ -1315,7 +1666,7 @@
 {
     NS_LOG_FUNCTION(this << txopHolder.has_value());
 
-    if (m_phy && m_phy->IsReceivingPhyHeader())
+    if (m_phy && m_phy->GetInfoIfRxingPhyHeader())
     {
         // we may get here because the PHY has not issued the PHY-RXSTART.indication before
         // the expiration of the timer started to detect new received frames, but the PHY is
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/eht/eht-frame-exchange-manager.h ns-3.44/src/wifi/model/eht/eht-frame-exchange-manager.h
--- ns-3.43/src/wifi/model/eht/eht-frame-exchange-manager.h	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/eht/eht-frame-exchange-manager.h	2025-03-09 16:55:49.787372600 -0700
@@ -24,7 +24,7 @@
 class MgtEmlOmn;
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * Reasons for an EMLSR client to drop an ICF
  */
 enum class WifiIcfDrop : uint8_t
@@ -37,11 +37,11 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the stream
- * \param reason the reason for dropping the ICF
- * \returns a reference to the stream
+ * @param os the stream
+ * @param reason the reason for dropping the ICF
+ * @returns a reference to the stream
  */
 inline std::ostream&
 operator<<(std::ostream& os, WifiIcfDrop reason)
@@ -65,7 +65,7 @@
 }
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * EhtFrameExchangeManager handles the frame exchange sequences
  * for EHT stations.
@@ -74,8 +74,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     EhtFrameExchangeManager();
@@ -88,8 +88,8 @@
     /**
      * Send an EML Operating Mode Notification frame to the given station.
      *
-     * \param dest the MAC address of the receiver
-     * \param frame the EML Operating Mode Notification frame to send
+     * @param dest the MAC address of the receiver
+     * @param frame the EML Operating Mode Notification frame to send
      */
     void SendEmlOmn(const Mac48Address& dest, const MgtEmlOmn& frame);
 
@@ -98,16 +98,16 @@
      * there is no such information for the given station and the station is affiliated with an MLD,
      * return the RSSI of the most recent packet received from another station of the same MLD.
      *
-     * \param address of the remote station
-     * \return the RSSI of the most recent packet received from the remote station
+     * @param address of the remote station
+     * @return the RSSI of the most recent packet received from the remote station
      */
     std::optional<dBm_u> GetMostRecentRssi(const Mac48Address& address) const override;
 
     /**
-     * \param psdu the given PSDU
-     * \param aid the AID of an EMLSR client
-     * \param address the link MAC address of an EMLSR client
-     * \return whether the EMLSR client having the given AID and MAC address shall switch back to
+     * @param psdu the given PSDU
+     * @param aid the AID of an EMLSR client
+     * @param address the link MAC address of an EMLSR client
+     * @return whether the EMLSR client having the given AID and MAC address shall switch back to
      *         the listening operation when receiving the given PSDU
      */
     bool GetEmlsrSwitchToListening(Ptr<const WifiPsdu> psdu,
@@ -118,14 +118,14 @@
      * Notify that the given PHY will switch channel to operate on another EMLSR link
      * after the given delay.
      *
-     * \param phy the given PHY
-     * \param linkId the ID of the EMLSR link on which the given PHY is operating
-     * \param delay the delay after which the channel switch will be completed
+     * @param phy the given PHY
+     * @param linkId the ID of the EMLSR link on which the given PHY is operating
+     * @param delay the delay after which the channel switch will be completed
      */
     void NotifySwitchingEmlsrLink(Ptr<WifiPhy> phy, uint8_t linkId, Time delay);
 
     /**
-     * \return whether this is an EMLSR link that has been blocked because another EMLSR link
+     * @return whether this is an EMLSR link that has been blocked because another EMLSR link
      *         is being used
      */
     bool UsingOtherEmlsrLink() const;
@@ -136,9 +136,9 @@
      * on the other links). This method is intended to be called when an MPDU (possibly within
      * an A-MPDU) is received or when the reception of the MAC header in an MPDU is notified.
      *
-     * \param hdr the MAC header of the received (or being received) MPDU
-     * \param txVector the TXVECTOR used to transmit the frame received (or being received)
-     * \return whether the frame received (or being received) is sent by an EMLSR client to start
+     * @param hdr the MAC header of the received (or being received) MPDU
+     * @param txVector the TXVECTOR used to transmit the frame received (or being received)
+     * @return whether the frame received (or being received) is sent by an EMLSR client to start
      *         an UL TXOP
      */
     bool CheckEmlsrClientStartingTxop(const WifiMacHeader& hdr, const WifiTxVector& txVector);
@@ -150,17 +150,26 @@
      * This method blocks the transmissions on all the EMLSR links of the given EMLSR client until
      * the transition delay advertised by the EMLSR client expires.
      *
-     * \param address the link MAC address of the given EMLSR client
-     * \param delay the given delay
+     * @param address the link MAC address of the given EMLSR client
+     * @param delay the given delay
      */
-    void EmlsrSwitchToListening(const Mac48Address& address, const Time& delay);
+    void EmlsrSwitchToListening(Mac48Address address, const Time& delay);
 
     /**
-     * \return a reference to the event indicating the possible end of the current TXOP (of
+     * @return a reference to the event indicating the possible end of the current TXOP (of
      *         which this device is not the holder)
      */
     EventId& GetOngoingTxopEndEvent();
 
+    /**
+     * Set the padding and the TXVECTOR of the given Trigger Frame, in case it is an Initial
+     * Control Frame for some EMLSR client(s).
+     *
+     * @param trigger the given Trigger Frame
+     * @param txVector the TXVECTOR used to transmit the Trigger Frame
+     */
+    void SetIcfPaddingAndTxVector(CtrlTriggerHeader& trigger, WifiTxVector& txVector) const;
+
     /// ICF drop reason traced callback (WifiMac exposes this trace source)
     TracedCallback<WifiIcfDrop, uint8_t> m_icfDropCallback;
 
@@ -169,13 +178,13 @@
     void RxStartIndication(WifiTxVector txVector, Time psduDuration) override;
     void ForwardPsduDown(Ptr<const WifiPsdu> psdu, WifiTxVector& txVector) override;
     void ForwardPsduMapDown(WifiConstPsduMap psduMap, WifiTxVector& txVector) override;
-    void SendMuRts(const WifiTxParameters& txParams) override;
     void CtsAfterMuRtsTimeout(Ptr<WifiMpdu> muRts, const WifiTxVector& txVector) override;
+    bool GetUpdateCwOnCtsTimeout() const override;
     void SendCtsAfterMuRts(const WifiMacHeader& muRtsHdr,
                            const CtrlTriggerHeader& trigger,
                            double muRtsSnr) override;
     void TransmissionSucceeded() override;
-    void TransmissionFailed() override;
+    void TransmissionFailed(bool forceCurrentCw = false) override;
     void NotifyChannelReleased(Ptr<Txop> txop) override;
     void PreProcessFrame(Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector) override;
     void PostProcessFrame(Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector) override;
@@ -183,59 +192,119 @@
                      RxSignalInfo rxSignalInfo,
                      const WifiTxVector& txVector,
                      bool inAmpdu) override;
+    void EndReceiveAmpdu(Ptr<const WifiPsdu> psdu,
+                         const RxSignalInfo& rxSignalInfo,
+                         const WifiTxVector& txVector,
+                         const std::vector<bool>& perMpduStatus) override;
     void NavResetTimeout() override;
     void IntraBssNavResetTimeout() override;
     void SendCtsAfterRts(const WifiMacHeader& rtsHdr, WifiMode rtsTxMode, double rtsSnr) override;
     void PsduRxError(Ptr<const WifiPsdu> psdu) override;
+    void ReceivedQosNullAfterBsrpTf(Mac48Address sender) override;
+    void SendQosNullFramesInTbPpdu(const CtrlTriggerHeader& trigger,
+                                   const WifiMacHeader& hdr) override;
+    void TbPpduTimeout(WifiPsduMap* psduMap, std::size_t nSolicitedStations) override;
+    void BlockAcksInTbPpduTimeout(WifiPsduMap* psduMap, std::size_t nSolicitedStations) override;
+    void ProtectionCompleted() override;
+
+    /**
+     * @return whether this is an EMLSR client that cannot respond to an ICF received a SIFS before
+     */
+    bool EmlsrClientCannotRespondToIcf() const;
+
+    /**
+     * Check if the MPDU that has been received on this link shall be dropped. In our model,
+     * an aux PHY, or the main PHY that is not involved in any TXOP, can receive:
+     * - management frames
+     * - CTS
+     * - CF-End
+     * - broadcast data frames
+     * Note that this method does not attempt to detect if the given MPDU is an ICF (this is done
+     * by ReceiveMpdu).
+     *
+     * @param mpdu the MPDU that has been received
+     * @return whether the given MPDU shall be dropped
+     */
+    bool ShallDropReceivedMpdu(Ptr<const WifiMpdu> mpdu) const;
+
+    /**
+     * Check whether all the stations that did not respond (to a certain frame) are EMLSR clients
+     * trying to start an UL TXOP on another link.
+     *
+     * @param staMissedResponseFrom stations that did not respond
+     * @return whether all the stations that did not respond are EMLSR clients trying to start an
+     *         UL TXOP on another link
+     */
+    bool IsCrossLinkCollision(const std::set<Mac48Address>& staMissedResponseFrom) const;
+
+    /**
+     * Unblock transmissions on all the links of the given EMLSR client, provided that the latter
+     * is not involved in any DL or UL TXOP on another link.
+     *
+     * @param address the link MAC address of the given EMLSR client
+     * @return whether transmissions could be unblocked
+     */
+    bool UnblockEmlsrLinksIfAllowed(Mac48Address address);
 
   private:
     /**
-     * \return whether the received ICF must be dropped because we are unable to process it
+     * @return whether the received ICF must be dropped because we are unable to process it
      *         (e.g., another EMLSR link is being used or there is no time for main PHY switch)
      */
     bool DropReceivedIcf();
 
     /**
+     * For each EMLSR client in the given set of clients that did not respond to a frame requesting
+     * a response from multiple clients, have the client switch to listening or simply unblock
+     * links depending on whether the EMLSR client was protected or not.
+     *
+     * @param clients the given set of clients
+     */
+    void SwitchToListeningOrUnblockLinks(const std::set<Mac48Address>& clients);
+
+    /**
      * Generate an in-device interference of the given power on the given link for the given
      * duration.
      *
-     * \param linkId the ID of the link on which in-device interference is generated
-     * \param duration the duration of the in-device interference
-     * \param txPower the TX power
+     * @param linkId the ID of the link on which in-device interference is generated
+     * @param duration the duration of the in-device interference
+     * @param txPower the TX power
      */
     void GenerateInDeviceInterference(uint8_t linkId, Time duration, Watt_u txPower);
 
     /**
      * Update the TXOP end timer when starting a frame transmission.
      *
-     * \param txDuration the TX duration of the frame being transmitted
-     * \param durationId the Duration/ID value carried by the frame being transmitted
+     * @param txDuration the TX duration of the frame being transmitted
+     * @param durationId the Duration/ID value carried by the frame being transmitted
      */
     void UpdateTxopEndOnTxStart(Time txDuration, Time durationId);
 
     /**
      * Update the TXOP end timer when receiving a PHY-RXSTART.indication.
      *
-     * \param psduDuration the TX duration of the PSDU being received
+     * @param psduDuration the TX duration of the PSDU being received
      */
     void UpdateTxopEndOnRxStartIndication(Time psduDuration);
 
     /**
      * Update the TXOP end timer when a frame reception ends.
      *
-     * \param durationId the Duration/ID value carried by the received frame
+     * @param durationId the Duration/ID value carried by the received frame
      */
     void UpdateTxopEndOnRxEnd(Time durationId);
 
     /**
      * Take actions when a TXOP (of which we are not the holder) ends.
      *
-     * \param txopHolder the holder of the TXOP (if any)
+     * @param txopHolder the holder of the TXOP (if any)
      */
     void TxopEnd(const std::optional<Mac48Address>& txopHolder);
 
-    EventId m_ongoingTxopEnd; //!< event indicating the possible end of the current TXOP (of which
-                              //!< we are not the holder)
+    bool m_icfReceived{false}; //!< whether an ICF has been received and needs to be notified to
+                               //!< the EMLSR manager after post-processing the frame
+    EventId m_ongoingTxopEnd;  //!< event indicating the possible end of the current TXOP (of which
+                               //!< we are not the holder)
     std::unordered_map<Mac48Address, EventId, WifiAddressHash>
         m_transDelayTimer; //!< MLD address-indexed map of transition delay timers
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/eht/eht-operation.cc ns-3.44/src/wifi/model/eht/eht-operation.cc
--- ns-3.43/src/wifi/model/eht/eht-operation.cc	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/eht/eht-operation.cc	2025-03-09 16:55:49.787372600 -0700
@@ -8,7 +8,7 @@
 
 #include "eht-operation.h"
 
-#include <ns3/assert.h>
+#include "ns3/assert.h"
 
 #include <algorithm>
 
@@ -64,10 +64,10 @@
 
 /**
  * set the max Tx/Rx NSS for input MCS index range
- * \param vec vector of max NSS per MCS
- * \param maxNss max NSS for input MCS range
- * \param mcsStart MCS index start
- * \param mcsEnd MCS index end
+ * @param vec vector of max NSS per MCS
+ * @param maxNss max NSS for input MCS range
+ * @param mcsStart MCS index start
+ * @param mcsEnd MCS index end
  */
 void
 SetMaxNss(std::vector<uint8_t>& vec, uint8_t maxNss, uint8_t mcsStart, uint8_t mcsEnd)
@@ -83,10 +83,10 @@
 
 /**
  * Get the max Tx/Rx NSS for input MCS index range
- * \param vec vector of max NSS per MCS
- * \param mcsStart MCS index start
- * \param mcsEnd MCS index end
- * \return max Rx NSS
+ * @param vec vector of max NSS per MCS
+ * @param mcsStart MCS index start
+ * @param mcsEnd MCS index end
+ * @return max Rx NSS
  */
 uint32_t
 GetMaxNss(const std::vector<uint8_t>& vec, uint8_t mcsStart, uint8_t mcsEnd)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/eht/eht-operation.h ns-3.44/src/wifi/model/eht/eht-operation.h
--- ns-3.43/src/wifi/model/eht/eht-operation.h	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/eht/eht-operation.h	2025-03-09 16:55:49.787372600 -0700
@@ -9,7 +9,7 @@
 #ifndef EHT_OPERATION_H
 #define EHT_OPERATION_H
 
-#include <ns3/wifi-information-element.h>
+#include "ns3/wifi-information-element.h"
 
 #include <optional>
 #include <vector>
@@ -43,8 +43,8 @@
 constexpr uint8_t WIFI_DEFAULT_GRP_BU_EXP = 0;
 
 /**
- * \brief EHT Operation Information Element
- * \ingroup wifi
+ * @brief EHT Operation Information Element
+ * @ingroup wifi
  *
  * This class serializes and deserializes
  * the EHT Operation Information Element
@@ -74,14 +74,14 @@
         /**
          * Serialize the EHT Operation Parameters subfield
          *
-         * \param start iterator pointing to where the subfield should be written to
+         * @param start iterator pointing to where the subfield should be written to
          */
         void Serialize(Buffer::Iterator& start) const;
         /**
          * Deserialize the EHT Operation Parameters subfield
          *
-         * \param start iterator pointing to where the subfield should be read from
-         * \return the number of octets read
+         * @param start iterator pointing to where the subfield should be read from
+         * @return the number of octets read
          */
         uint16_t Deserialize(Buffer::Iterator start);
     };
@@ -109,15 +109,15 @@
         /**
          * Serialize the EHT Operation Information subfield
          *
-         * \param start iterator pointing to where the subfield should be written to
+         * @param start iterator pointing to where the subfield should be written to
          */
         void Serialize(Buffer::Iterator& start) const;
         /**
          * Deserialize the EHT Operation Information subfield
          *
-         * \param start iterator pointing to where the subfield should be read from
-         * \param disabledSubchBmPresent EHT Operation Param Disabled Subchannel Bitmap Present
-         * \return the number of octets read
+         * @param start iterator pointing to where the subfield should be read from
+         * @param disabledSubchBmPresent EHT Operation Param Disabled Subchannel Bitmap Present
+         * @return the number of octets read
          */
         uint16_t Deserialize(Buffer::Iterator start, bool disabledSubchBmPresent);
     };
@@ -134,14 +134,14 @@
         /**
          * Serialize the Basic EHT-MCS and NSS Set subfield
          *
-         * \param start iterator pointing to where the subfield should be written to
+         * @param start iterator pointing to where the subfield should be written to
          */
         void Serialize(Buffer::Iterator& start) const;
         /**
          * Deserialize the Basic EHT-MCS and NSS Set subfield
          *
-         * \param start iterator pointing to where the subfield should be read from
-         * \return the number of octets read
+         * @param start iterator pointing to where the subfield should be read from
+         * @return the number of octets read
          */
         uint16_t Deserialize(Buffer::Iterator start);
     };
@@ -153,16 +153,16 @@
 
     /**
      * Set the max Rx NSS for input MCS index range
-     * \param maxNss the maximum supported Rx NSS for MCS group
-     * \param mcsStart MCS index start
-     * \param mcsEnd MCS index end
+     * @param maxNss the maximum supported Rx NSS for MCS group
+     * @param mcsStart MCS index start
+     * @param mcsEnd MCS index end
      */
     void SetMaxRxNss(uint8_t maxNss, uint8_t mcsStart, uint8_t mcsEnd);
     /**
      * Set the max Tx NSS for input MCS index range
-     * \param maxNss the maximum supported Rx NSS for MCS group
-     * \param mcsStart MCS index start
-     * \param mcsEnd MCS index end
+     * @param maxNss the maximum supported Rx NSS for MCS group
+     * @param mcsStart MCS index start
+     * @param mcsEnd MCS index end
      */
     void SetMaxTxNss(uint8_t maxNss, uint8_t mcsStart, uint8_t mcsEnd);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/eht/eht-phy.cc ns-3.44/src/wifi/model/eht/eht-phy.cc
--- ns-3.43/src/wifi/model/eht/eht-phy.cc	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/eht/eht-phy.cc	2025-03-09 16:55:49.787372600 -0700
@@ -129,7 +129,7 @@
         return EhtPpdu::GetEhtSigFieldSize(
             txVector.GetChannelWidth(),
             txVector.GetRuAllocation(
-                m_wifiPhy ? m_wifiPhy->GetOperatingChannel().GetPrimaryChannelIndex(20) : 0),
+                m_wifiPhy ? m_wifiPhy->GetOperatingChannel().GetPrimaryChannelIndex(MHz_u{20}) : 0),
             txVector.GetEhtPpduType(),
             txVector.IsSigBCompression(),
             txVector.IsSigBCompression() ? txVector.GetHeMuUserInfoMap().size() : 0);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/eht/eht-phy.h ns-3.44/src/wifi/model/eht/eht-phy.h
--- ns-3.43/src/wifi/model/eht/eht-phy.h	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/eht/eht-phy.h	2025-03-09 16:55:49.787372600 -0700
@@ -12,8 +12,8 @@
 #include "ns3/he-phy.h"
 
 /**
- * \file
- * \ingroup wifi
+ * @file
+ * @ingroup wifi
  * Declaration of ns3::EhtPhy class.
  */
 
@@ -26,8 +26,8 @@
 #define EHT_PHY 121 // FIXME: not defined yet as of 802.11be D1.5
 
 /**
- * \brief PHY entity for EHT (11be)
- * \ingroup wifi
+ * @brief PHY entity for EHT (11be)
+ * @ingroup wifi
  *
  * EHT PHY is based on HE PHY.
  *
@@ -39,7 +39,7 @@
     /**
      * Constructor for EHT PHY
      *
-     * \param buildModeList flag used to add EHT modes to list (disabled
+     * @param buildModeList flag used to add EHT modes to list (disabled
      *                      by child classes to only add child classes' modes)
      */
     EhtPhy(bool buildModeList = true);
@@ -64,93 +64,93 @@
      * Return the EHT MCS corresponding to
      * the provided index.
      *
-     * \param index the index of the MCS
-     * \return an EHT MCS
+     * @param index the index of the MCS
+     * @return an EHT MCS
      */
     static WifiMode GetEhtMcs(uint8_t index);
 
     /**
      * Return MCS 0 from EHT MCS values.
      *
-     * \return MCS 0 from EHT MCS values
+     * @return MCS 0 from EHT MCS values
      */
     static WifiMode GetEhtMcs0();
     /**
      * Return MCS 1 from EHT MCS values.
      *
-     * \return MCS 1 from EHT MCS values
+     * @return MCS 1 from EHT MCS values
      */
     static WifiMode GetEhtMcs1();
     /**
      * Return MCS 2 from EHT MCS values.
      *
-     * \return MCS 2 from EHT MCS values
+     * @return MCS 2 from EHT MCS values
      */
     static WifiMode GetEhtMcs2();
     /**
      * Return MCS 3 from EHT MCS values.
      *
-     * \return MCS 3 from EHT MCS values
+     * @return MCS 3 from EHT MCS values
      */
     static WifiMode GetEhtMcs3();
     /**
      * Return MCS 4 from EHT MCS values.
      *
-     * \return MCS 4 from EHT MCS values
+     * @return MCS 4 from EHT MCS values
      */
     static WifiMode GetEhtMcs4();
     /**
      * Return MCS 5 from EHT MCS values.
      *
-     * \return MCS 5 from EHT MCS values
+     * @return MCS 5 from EHT MCS values
      */
     static WifiMode GetEhtMcs5();
     /**
      * Return MCS 6 from EHT MCS values.
      *
-     * \return MCS 6 from EHT MCS values
+     * @return MCS 6 from EHT MCS values
      */
     static WifiMode GetEhtMcs6();
     /**
      * Return MCS 7 from EHT MCS values.
      *
-     * \return MCS 7 from EHT MCS values
+     * @return MCS 7 from EHT MCS values
      */
     static WifiMode GetEhtMcs7();
     /**
      * Return MCS 8 from EHT MCS values.
      *
-     * \return MCS 8 from EHT MCS values
+     * @return MCS 8 from EHT MCS values
      */
     static WifiMode GetEhtMcs8();
     /**
      * Return MCS 9 from EHT MCS values.
      *
-     * \return MCS 9 from EHT MCS values
+     * @return MCS 9 from EHT MCS values
      */
     static WifiMode GetEhtMcs9();
     /**
      * Return MCS 10 from EHT MCS values.
      *
-     * \return MCS 10 from EHT MCS values
+     * @return MCS 10 from EHT MCS values
      */
     static WifiMode GetEhtMcs10();
     /**
      * Return MCS 11 from EHT MCS values.
      *
-     * \return MCS 11 from EHT MCS values
+     * @return MCS 11 from EHT MCS values
      */
     static WifiMode GetEhtMcs11();
     /**
      * Return MCS 12 from EHT MCS values.
      *
-     * \return MCS 12 from EHT MCS values
+     * @return MCS 12 from EHT MCS values
      */
     static WifiMode GetEhtMcs12();
     /**
      * Return MCS 13 from EHT MCS values.
      *
-     * \return MCS 13 from EHT MCS values
+     * @return MCS 13 from EHT MCS values
      */
     static WifiMode GetEhtMcs13();
 
@@ -159,8 +159,8 @@
      * the supplied EHT MCS index. This function is used
      * as a callback for WifiMode operation.
      *
-     * \param mcsValue the MCS index
-     * \return the coding rate.
+     * @param mcsValue the MCS index
+     * @return the coding rate.
      */
     static WifiCodeRate GetCodeRate(uint8_t mcsValue);
 
@@ -169,8 +169,8 @@
      * to the supplied EHT MCS index. This function is used
      * as a callback for WifiMode operation.
      *
-     * \param mcsValue the MCS index
-     * \return the size of modulation constellation.
+     * @param mcsValue the MCS index
+     * @return the size of modulation constellation.
      */
     static uint16_t GetConstellationSize(uint8_t mcsValue);
 
@@ -180,12 +180,12 @@
      * spatial stream. This function calls HtPhy::CalculatePhyRate
      * and is mainly used as a callback for WifiMode operation.
      *
-     * \param mcsValue the EHT MCS index
-     * \param channelWidth the considered channel width
-     * \param guardInterval the considered guard interval duration
-     * \param nss the considered number of stream
+     * @param mcsValue the EHT MCS index
+     * @param channelWidth the considered channel width
+     * @param guardInterval the considered guard interval duration
+     * @param nss the considered number of stream
      *
-     * \return the physical bit rate of this signal in bps.
+     * @return the physical bit rate of this signal in bps.
      */
     static uint64_t GetPhyRate(uint8_t mcsValue,
                                MHz_u channelWidth,
@@ -196,9 +196,9 @@
      * Return the PHY rate corresponding to
      * the supplied TXVECTOR for the STA-ID.
      *
-     * \param txVector the TXVECTOR used for the transmission
-     * \param staId the station ID for MU (unused if SU)
-     * \return the physical bit rate of this signal in bps.
+     * @param txVector the TXVECTOR used for the transmission
+     * @param staId the station ID for MU (unused if SU)
+     * @return the physical bit rate of this signal in bps.
      */
     static uint64_t GetPhyRateFromTxVector(const WifiTxVector& txVector,
                                            uint16_t staId = SU_STA_ID);
@@ -207,9 +207,9 @@
      * Return the data rate corresponding to
      * the supplied TXVECTOR for the STA-ID.
      *
-     * \param txVector the TXVECTOR used for the transmission
-     * \param staId the station ID for MU (unused if SU)
-     * \return the data bit rate in bps.
+     * @param txVector the TXVECTOR used for the transmission
+     * @param staId the station ID for MU (unused if SU)
+     * @return the data bit rate in bps.
      */
     static uint64_t GetDataRateFromTxVector(const WifiTxVector& txVector,
                                             uint16_t staId = SU_STA_ID);
@@ -220,11 +220,11 @@
      * guard interval, and number of spatial
      * streams.
      *
-     * \param mcsValue the EHT MCS index
-     * \param channelWidth the channel width
-     * \param guardInterval the guard interval duration
-     * \param nss the number of spatial streams
-     * \return the data bit rate in bps.
+     * @param mcsValue the EHT MCS index
+     * @param channelWidth the channel width
+     * @param guardInterval the guard interval duration
+     * @param nss the number of spatial streams
+     * @return the data bit rate in bps.
      */
     static uint64_t GetDataRate(uint8_t mcsValue,
                                 MHz_u channelWidth,
@@ -236,8 +236,8 @@
      * to the supplied HE MCS index. This function calls CalculateNonHtReferenceRate
      * and is used as a callback for WifiMode operation.
      *
-     * \param mcsValue the HE MCS index
-     * \return the rate in bps of the non-HT Reference Rate.
+     * @param mcsValue the HE MCS index
+     * @return the rate in bps of the non-HT Reference Rate.
      */
     static uint64_t GetNonHtReferenceRate(uint8_t mcsValue);
 
@@ -258,8 +258,8 @@
      * the provided index.
      * This method binds all the callbacks used by WifiMode.
      *
-     * \param index the index of the MCS
-     * \return an EHT MCS
+     * @param index the index of the MCS
+     * @return an EHT MCS
      */
     static WifiMode CreateEhtMcs(uint8_t index);
 
@@ -268,9 +268,9 @@
      * which corresponds to the supplied code rate and
      * constellation size.
      *
-     * \param codeRate the convolutional coding rate
-     * \param constellationSize the size of modulation constellation
-     * \returns the rate in bps.
+     * @param codeRate the convolutional coding rate
+     * @param constellationSize the size of modulation constellation
+     * @returns the rate in bps.
      *
      * To convert an HE MCS to its corresponding non-HT Reference Rate
      * use the modulation and coding rate of the HT MCS
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/eht/eht-ppdu.cc ns-3.44/src/wifi/model/eht/eht-ppdu.cc
--- ns-3.43/src/wifi/model/eht/eht-ppdu.cc	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/eht/eht-ppdu.cc	2025-03-09 16:55:49.787372600 -0700
@@ -14,6 +14,7 @@
 #include "ns3/wifi-phy-operating-channel.h"
 #include "ns3/wifi-psdu.h"
 
+#include <algorithm>
 #include <numeric>
 
 namespace ns3
@@ -47,11 +48,19 @@
     NS_ASSERT(bssColor < 64);
     if (ns3::IsDlMu(m_preamble))
     {
-        const auto p20Index = m_operatingChannel.GetPrimaryChannelIndex(20);
+        const auto p20Index = m_operatingChannel.GetPrimaryChannelIndex(MHz_u{20});
         m_ehtPhyHeader.emplace<EhtMuPhyHeader>(EhtMuPhyHeader{
             .m_bandwidth = GetChannelWidthEncodingFromMhz(txVector.GetChannelWidth()),
             .m_bssColor = bssColor,
             .m_ppduType = txVector.GetEhtPpduType(),
+            // TODO: EHT PPDU should store U-SIG per 20 MHz band, assume it is the lowest 20 MHz
+            // band for now
+            .m_puncturedChannelInfo =
+                GetPuncturedInfo(txVector.GetInactiveSubchannels(),
+                                 txVector.GetEhtPpduType(),
+                                 (txVector.IsDlMu() && (txVector.GetChannelWidth() > MHz_u{80}))
+                                     ? std::optional{true}
+                                     : std::nullopt),
             .m_ehtSigMcs = txVector.GetSigBMode().GetMcsValue(),
             .m_giLtfSize = GetGuardIntervalAndNltfEncoding(txVector.GetGuardInterval(),
                                                            2 /*NLTF currently unused*/),
@@ -115,14 +124,19 @@
     {
         auto ehtPhyHeader = std::get_if<EhtMuPhyHeader>(&m_ehtPhyHeader);
         NS_ASSERT(ehtPhyHeader);
-        txVector.SetChannelWidth(GetChannelWidthMhzFromEncoding(ehtPhyHeader->m_bandwidth));
+        const auto bw = GetChannelWidthMhzFromEncoding(ehtPhyHeader->m_bandwidth);
+        txVector.SetChannelWidth(bw);
         txVector.SetBssColor(ehtPhyHeader->m_bssColor);
         txVector.SetEhtPpduType(ehtPhyHeader->m_ppduType);
+        if (bw > MHz_u{80})
+        {
+            // TODO: use punctured channel information
+        }
         txVector.SetSigBMode(HePhy::GetVhtMcs(ehtPhyHeader->m_ehtSigMcs));
         txVector.SetGuardInterval(GetGuardIntervalFromEncoding(ehtPhyHeader->m_giLtfSize));
         const auto ruAllocation = ehtPhyHeader->m_ruAllocationA; // RU Allocation-B not supported
                                                                  // yet
-        if (const auto p20Index = m_operatingChannel.GetPrimaryChannelIndex(20);
+        if (const auto p20Index = m_operatingChannel.GetPrimaryChannelIndex(MHz_u{20});
             ruAllocation.has_value())
         {
             txVector.SetRuAllocation(ruAllocation.value(), p20Index);
@@ -200,14 +214,15 @@
     if (!compression)
     {
         commonFieldSize = 4 /* CRC */ + 6 /* tail */;
-        if (channelWidth <= 40)
+        if (channelWidth <= MHz_u{40})
         {
             commonFieldSize += 8; // only one allocation subfield
         }
         else
         {
             commonFieldSize +=
-                8 * (channelWidth / 40) /* one allocation field per 40 MHz */ + 1 /* center RU */;
+                8 * (channelWidth / MHz_u{40}) /* one allocation field per 40 MHz */ +
+                1 /* center RU */;
         }
     }
 
@@ -230,6 +245,63 @@
     return commonFieldSize + userSpecificFieldSize;
 }
 
+uint8_t
+EhtPpdu::GetPuncturedInfo(const std::vector<bool>& inactiveSubchannels,
+                          uint8_t ehtPpduType,
+                          std::optional<bool> isLow80MHz)
+{
+    if (inactiveSubchannels.size() < 4)
+    {
+        // no puncturing if less than 80 MHz
+        return 0;
+    }
+    NS_ASSERT_MSG(inactiveSubchannels.size() <= 8,
+                  "Puncturing over more than 160 MHz is not supported");
+    if (ehtPpduType == 0)
+    {
+        // IEEE 802.11be D5.0 Table 36-28
+        NS_ASSERT(inactiveSubchannels.size() <= 4 || isLow80MHz.has_value());
+        const auto startIndex = (inactiveSubchannels.size() <= 4) ? 0 : (*isLow80MHz ? 0 : 4);
+        const auto stopIndex =
+            (inactiveSubchannels.size() <= 4) ? inactiveSubchannels.size() : (*isLow80MHz ? 4 : 8);
+        uint8_t puncturedInfoField = 0;
+        for (std::size_t i = startIndex; i < stopIndex; ++i)
+        {
+            if (!inactiveSubchannels.at(i))
+            {
+                puncturedInfoField |= 1 << (i / 4);
+            }
+        }
+        return puncturedInfoField;
+    }
+    // IEEE 802.11be D5.0 Table 36-30
+    const auto numPunctured = std::count_if(inactiveSubchannels.cbegin(),
+                                            inactiveSubchannels.cend(),
+                                            [](bool punctured) { return punctured; });
+    if (numPunctured == 0)
+    {
+        // no puncturing
+        return 0;
+    }
+    const auto firstPunctured = std::find_if(inactiveSubchannels.cbegin(),
+                                             inactiveSubchannels.cend(),
+                                             [](bool punctured) { return punctured; });
+    const auto firstIndex = std::distance(inactiveSubchannels.cbegin(), firstPunctured);
+    switch (numPunctured)
+    {
+    case 1:
+        return firstIndex + 1;
+    case 2:
+        NS_ASSERT_MSG(((firstIndex % 2) == 0) && inactiveSubchannels.at(firstIndex + 1),
+                      "invalid 40 MHz puncturing pattern");
+        return 9 + (firstIndex / 2);
+    default:
+        break;
+    }
+    NS_ASSERT_MSG(false, "invalid puncturing pattern");
+    return 0;
+}
+
 Ptr<WifiPpdu>
 EhtPpdu::Copy() const
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/eht/eht-ppdu.h ns-3.44/src/wifi/model/eht/eht-ppdu.h
--- ns-3.43/src/wifi/model/eht/eht-ppdu.h	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/eht/eht-ppdu.h	2025-03-09 16:55:49.787372600 -0700
@@ -14,8 +14,8 @@
 #include <optional>
 
 /**
- * \file
- * \ingroup wifi
+ * @file
+ * @ingroup wifi
  * Declaration of ns3::EhtPpdu class.
  */
 
@@ -23,8 +23,8 @@
 {
 
 /**
- * \brief EHT PPDU (11be)
- * \ingroup wifi
+ * @brief EHT PPDU (11be)
+ * @ingroup wifi
  *
  * EhtPpdu is currently identical to HePpdu
  */
@@ -37,12 +37,11 @@
     struct EhtTbPhyHeader
     {
         // U-SIG fields
-        uint8_t m_phyVersionId{0}; ///< PHY Version Identifier field
-        uint8_t m_bandwidth{0};    ///< Bandwidth field
-        uint8_t m_bssColor{0};     ///< BSS color field
-        uint8_t m_ppduType{0};     ///< PPDU Type And Compressed Mode field
-
-    }; // struct EhtTbPhyHeader
+        uint8_t m_phyVersionId : 3 {0}; ///< PHY Version Identifier field
+        uint8_t m_bandwidth : 3 {0};    ///< Bandwidth field
+        uint8_t m_bssColor : 6 {0};     ///< BSS color field
+        uint8_t m_ppduType : 2 {0};     ///< PPDU Type And Compressed Mode field
+    };                                  // struct EhtTbPhyHeader
 
     /**
      * PHY header for EHT MU PPDUs
@@ -50,11 +49,12 @@
     struct EhtMuPhyHeader
     {
         // U-SIG fields
-        uint8_t m_phyVersionId{0}; ///< PHY Version Identifier field
-        uint8_t m_bandwidth{0};    ///< Bandwidth field
-        uint8_t m_bssColor{0};     ///< BSS color field
-        uint8_t m_ppduType{0};     ///< PPDU Type And Compressed Mode field
-        uint8_t m_ehtSigMcs{0};    ///< EHT-SIG-B MCS
+        uint8_t m_phyVersionId : 3 {0};         ///< PHY Version Identifier field
+        uint8_t m_bandwidth : 3 {0};            ///< Bandwidth field
+        uint8_t m_bssColor : 6 {0};             ///< BSS color field
+        uint8_t m_ppduType : 2 {0};             ///< PPDU Type And Compressed Mode field
+        uint8_t m_puncturedChannelInfo : 5 {0}; ///< Punctured Channel Information field
+        uint8_t m_ehtSigMcs : 2 {0};            ///< EHT-SIG-B MCS
 
         // EHT-SIG fields
         uint8_t m_giLtfSize{0}; ///< GI+LTF Size field
@@ -75,12 +75,12 @@
      *
      * This PPDU can either be UL or DL.
      *
-     * \param psdus the PHY payloads (PSDUs)
-     * \param txVector the TXVECTOR that was used for this PPDU
-     * \param channel the operating channel of the PHY used to transmit this PPDU
-     * \param ppduDuration the transmission duration of this PPDU
-     * \param uid the unique ID of this PPDU or of the triggering PPDU if this is an EHT TB PPDU
-     * \param flag the flag indicating the type of Tx PSD to build
+     * @param psdus the PHY payloads (PSDUs)
+     * @param txVector the TXVECTOR that was used for this PPDU
+     * @param channel the operating channel of the PHY used to transmit this PPDU
+     * @param ppduDuration the transmission duration of this PPDU
+     * @param uid the unique ID of this PPDU or of the triggering PPDU if this is an EHT TB PPDU
+     * @param flag the flag indicating the type of Tx PSD to build
      */
     EhtPpdu(const WifiConstPsduMap& psdus,
             const WifiTxVector& txVector,
@@ -96,17 +96,17 @@
      * Get the number of RUs per EHT-SIG-B content channel.
      * This function will be used once EHT PHY headers are implemented.
      *
-     * \param channelWidth the channel width occupied by the PPDU
-     * \param ehtPpduType the EHT_PPDU_TYPE used by the PPDU
-     * \param ruAllocation 8 bit RU_ALLOCATION per 20 MHz
-     * \param compression flag whether compression mode is used by the PPDU
-     * \param numMuMimoUsers the number of MU-MIMO users addressed by the PPDU
-     * \return a pair containing the number of RUs in each EHT-SIG-B content channel (resp. 1 and 2)
+     * @param channelWidth the channel width occupied by the PPDU
+     * @param ehtPpduType the EHT_PPDU_TYPE used by the PPDU
+     * @param ruAllocation 8 bit RU_ALLOCATION per 20 MHz
+     * @param compression flag whether compression mode is used by the PPDU
+     * @param numMuMimoUsers the number of MU-MIMO users addressed by the PPDU
+     * @return a pair containing the number of RUs in each EHT-SIG-B content channel (resp. 1 and 2)
      */
     static std::pair<std::size_t, std::size_t> GetNumRusPerEhtSigBContentChannel(
         MHz_u channelWidth,
         uint8_t ehtPpduType,
-        const std::vector<uint8_t>& ruAllocation,
+        const RuAllocation& ruAllocation,
         bool compression,
         std::size_t numMuMimoUsers);
 
@@ -114,28 +114,42 @@
      * Get the EHT-SIG content channels for a given PPDU
      * IEEE 802.11be-D3.1 36.3.12.8.2 EHT-SIG content channels
      *
-     * \param txVector the TXVECTOR used for the PPDU
-     * \param p20Index the index of the primary20 channel
-     * \return EHT-SIG content channels
+     * @param txVector the TXVECTOR used for the PPDU
+     * @param p20Index the index of the primary20 channel
+     * @return EHT-SIG content channels
      */
     static HeSigBContentChannels GetEhtSigContentChannels(const WifiTxVector& txVector,
                                                           uint8_t p20Index);
 
     /**
      * Get variable length EHT-SIG field size
-     * \param channelWidth the channel width occupied by the PPDU
-     * \param ruAllocation 8 bit RU_ALLOCATION per 20 MHz
-     * \param ehtPpduType the EHT_PPDU_TYPE used by the PPDU
-     * \param compression flag whether compression mode is used by the PPDU
-     * \param numMuMimoUsers the number of MU-MIMO users addressed by the PPDU
-     * \return field size in bytes
+     * @param channelWidth the channel width occupied by the PPDU
+     * @param ruAllocation 8 bit RU_ALLOCATION per 20 MHz
+     * @param ehtPpduType the EHT_PPDU_TYPE used by the PPDU
+     * @param compression flag whether compression mode is used by the PPDU
+     * @param numMuMimoUsers the number of MU-MIMO users addressed by the PPDU
+     * @return field size in bytes
      */
     static uint32_t GetEhtSigFieldSize(MHz_u channelWidth,
-                                       const std::vector<uint8_t>& ruAllocation,
+                                       const RuAllocation& ruAllocation,
                                        uint8_t ehtPpduType,
                                        bool compression,
                                        std::size_t numMuMimoUsers);
 
+    /**
+     * Get the Punctured Channel Information field in the U-SIG
+     * @param inactiveSubchannels the bitmap indexed by the 20 MHz subchannels in ascending order,
+     * where each bit indicates whether the corresponding 20 MHz subchannel is punctured or not
+     * within the transmission bandwidth
+     * @param ehtPpduType the EHT_PPDU_TYPE used by the PPDU
+     * @param isLow80MHz flag whether the 80 MHz frequency subblock where U-SIG processing is
+     * performed is the lowest in frequency (if OFDMA and if channel width is larger than 80 MHz)
+     * @return the value of the Punctured Channel Information field
+     */
+    static uint8_t GetPuncturedInfo(const std::vector<bool>& inactiveSubchannels,
+                                    uint8_t ehtPpduType,
+                                    std::optional<bool> isLow80MHz);
+
   private:
     bool IsDlMu() const override;
     bool IsUlMu() const override;
@@ -144,15 +158,15 @@
     /**
      * Fill in the PHY headers.
      *
-     * \param txVector the TXVECTOR that was used for this PPDU
-     * \param ppduDuration the transmission duration of this PPDU
+     * @param txVector the TXVECTOR that was used for this PPDU
+     * @param ppduDuration the transmission duration of this PPDU
      */
     void SetPhyHeaders(const WifiTxVector& txVector, Time ppduDuration);
 
     /**
      * Fill in the EHT PHY header.
      *
-     * \param txVector the TXVECTOR that was used for this PPDU
+     * @param txVector the TXVECTOR that was used for this PPDU
      */
     void SetEhtPhyHeader(const WifiTxVector& txVector);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/eht/emlsr-manager.cc ns-3.44/src/wifi/model/eht/emlsr-manager.cc
--- ns-3.43/src/wifi/model/eht/emlsr-manager.cc	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/eht/emlsr-manager.cc	2025-03-09 16:55:49.787372600 -0700
@@ -101,6 +101,22 @@
                           MakeBooleanAccessor(&EmlsrManager::SetInDeviceInterference,
                                               &EmlsrManager::GetInDeviceInterference),
                           MakeBooleanChecker())
+            .AddAttribute("PutAuxPhyToSleep",
+                          "Whether Aux PHYs should be put into sleep mode while the Main PHY "
+                          "is carrying out a (DL or UL) TXOP. Specifically, for DL TXOPs, aux "
+                          "PHYs are put to sleep after receiving the ICF; for UL TXOPs, aux PHYs "
+                          "are put to sleep when the CTS frame is received, if RTS/CTS is used, "
+                          "or when the transmission of the data frame starts, otherwise. "
+                          "Aux PHYs are resumed from sleep when the TXOP ends.",
+                          BooleanValue(false),
+                          MakeBooleanAccessor(&EmlsrManager::m_auxPhyToSleep),
+                          MakeBooleanChecker())
+            .AddAttribute("UseNotifiedMacHdr",
+                          "Whether to use the information about the MAC header of the MPDU "
+                          "being received, if notified by the PHY.",
+                          BooleanValue(true),
+                          MakeBooleanAccessor(&EmlsrManager::m_useNotifiedMacHdr),
+                          MakeBooleanChecker())
             .AddAttribute(
                 "EmlsrLinkSet",
                 "IDs of the links on which EMLSR mode will be enabled. An empty set "
@@ -114,14 +130,23 @@
                           BooleanValue(false),
                           MakeBooleanAccessor(&EmlsrManager::SetCamStateReset,
                                               &EmlsrManager::GetCamStateReset),
-                          MakeBooleanChecker());
+                          MakeBooleanChecker())
+            .AddTraceSource("MainPhySwitch",
+                            "This trace source is fired when the main PHY switches channel to "
+                            "operate on another link. Information associated with the main PHY "
+                            "switch is provided through a struct that is inherited from struct "
+                            "EmlsrMainPhySwitchTrace (use the GetName() method to get the type "
+                            "of the provided object).",
+                            MakeTraceSourceAccessor(&EmlsrManager::m_mainPhySwitchTrace),
+                            "ns3::EmlsrManager::MainPhySwitchCallback");
     return tid;
 }
 
 EmlsrManager::EmlsrManager()
-    // The STA initializes dot11MSDTimerDuration to aPPDUMaxTime defined in Table 36-70
-    // (Sec. 35.3.16.8.1 of 802.11be D3.1)
-    : m_mediumSyncDuration(MicroSeconds(DEFAULT_MSD_DURATION_USEC)),
+    : m_mainPhySwitchInfo{},
+      // The STA initializes dot11MSDTimerDuration to aPPDUMaxTime defined in Table 36-70
+      // (Sec. 35.3.16.8.1 of 802.11be D3.1)
+      m_mediumSyncDuration(MicroSeconds(DEFAULT_MSD_DURATION_USEC)),
       // The default value of dot11MSDOFDMEDthreshold is –72 dBm and the default value of
       // dot11MSDTXOPMax is 1, respectively (Sec. 35.3.16.8.1 of 802.11be D3.1)
       m_msdOfdmEdThreshold(DEFAULT_MSD_OFDM_ED_THRESH),
@@ -166,6 +191,9 @@
     m_staMac->TraceConnectWithoutContext("AckedMpdu", MakeCallback(&EmlsrManager::TxOk, this));
     m_staMac->TraceConnectWithoutContext("DroppedMpdu",
                                          MakeCallback(&EmlsrManager::TxDropped, this));
+    m_staMac->TraceConnectWithoutContext(
+        "EmlsrLinkSwitch",
+        MakeCallback(&EmlsrManager::EmlsrLinkSwitchCallback, this));
     DoSetWifiMac(mac);
 }
 
@@ -176,6 +204,42 @@
 }
 
 void
+EmlsrManager::EmlsrLinkSwitchCallback(uint8_t linkId, Ptr<WifiPhy> phy)
+{
+    NS_LOG_FUNCTION(this << linkId << phy);
+
+    if (!phy)
+    {
+        NS_ASSERT(!m_noPhySince.contains(linkId));
+        NS_LOG_DEBUG("Record that no PHY is operating on link " << +linkId);
+        m_noPhySince[linkId] = Simulator::Now();
+        return;
+    }
+
+    // phy switched to operate on the link with ID equal to linkId
+    auto it = m_noPhySince.find(linkId);
+
+    if (it == m_noPhySince.end())
+    {
+        // phy switched to a link on which another PHY was operating, do nothing
+        return;
+    }
+
+    auto duration = Simulator::Now() - it->second;
+    NS_ASSERT_MSG(duration.IsPositive(), "Interval duration should not be negative");
+
+    NS_LOG_DEBUG("PHY " << +phy->GetPhyId() << " switched to link " << +linkId << " after "
+                        << duration.As(Time::US)
+                        << " since last time a PHY was operating on this link");
+    if (duration > MicroSeconds(MEDIUM_SYNC_THRESHOLD_USEC))
+    {
+        StartMediumSyncDelayTimer(linkId);
+    }
+
+    m_noPhySince.erase(it);
+}
+
+void
 EmlsrManager::SetMainPhyId(uint8_t mainPhyId)
 {
     NS_LOG_FUNCTION(this << mainPhyId);
@@ -386,21 +450,62 @@
     }
 
     auto mainPhy = m_staMac->GetDevice()->GetPhy(m_mainPhyId);
-    auto auxPhy = m_staMac->GetWifiPhy(linkId);
+    auto rxPhy = m_staMac->GetWifiPhy(linkId);
 
-    if (m_staMac->GetWifiPhy(linkId) != mainPhy)
+    const auto receivedByAuxPhy = (rxPhy != mainPhy);
+    const auto mainPhyOnALink = (m_staMac->GetLinkForPhy(mainPhy).has_value());
+    const auto mainPhyIsSwitching =
+        (mainPhy->GetState()->GetLastTime({WifiPhyState::SWITCHING}) == Simulator::Now());
+    // if the main PHY is not operating on a link and it is not switching, then we have postponed
+    // the reconnection of the main PHY to a link because a PPDU reception was ongoing on that link
+    const auto mainPhyToConnect = (!mainPhyOnALink && !mainPhyIsSwitching);
+
+    const auto mainPhyToConnectToOtherLink = mainPhyToConnect && (m_mainPhySwitchInfo.to != linkId);
+
+    if (mainPhyToConnect)
+    {
+        // If ICF was received on a link other than the one the main PHY is waiting to be connected
+        // to, we need to cancel the pending reconnection and request a new main PHY switch.
+        // If ICF was received on the link the main PHY is waiting to be connected to, we cancel
+        // the pending reconnection and explicitly request the reconnection below
+        GetStaMac()->CancelEmlsrPhyConnectEvent(mainPhy->GetPhyId());
+    }
+
+    // We need to request a main PHY switch if:
+    // - the ICF was received by an aux PHY, AND
+    // - the main PHY is not waiting to be connected to a link OR it is waiting to be connected
+    //   to a link other than the link on which the ICF is received.
+    if (receivedByAuxPhy && (!mainPhyToConnect || mainPhyToConnectToOtherLink))
     {
-        // an aux PHY received the ICF
         SwitchMainPhy(linkId,
                       true, // channel switch should occur instantaneously
                       RESET_BACKOFF,
-                      DONT_REQUEST_ACCESS);
+                      DONT_REQUEST_ACCESS,
+                      EmlsrDlTxopIcfReceivedByAuxPhyTrace{});
+    }
+    else if (mainPhyToConnect && !mainPhyToConnectToOtherLink)
+    {
+        // If the main PHY is waiting to be connected to the link on which the ICF was received, we
+        // have to explicitly perform the connection because the pending event was cancelled above.
+        // We do this way in order to reconnect the main PHY before putting aux PHYs to sleep: if
+        // the aux PHY is put to sleep while still operating on the link on which it received the
+        // ICF, all the MAC events (including scheduled CTS transmission) will be cancelled.
+        m_staMac->NotifySwitchingEmlsrLink(mainPhy, linkId, Time{0});
+    }
 
+    if (receivedByAuxPhy)
+    {
         // aux PHY received the ICF but main PHY will send the response
-        auto uid = auxPhy->GetPreviouslyRxPpduUid();
+        auto uid = rxPhy->GetPreviouslyRxPpduUid();
         mainPhy->SetPreviouslyRxPpduUid(uid);
     }
 
+    // a DL TXOP started, set all aux PHYs to sleep
+    if (m_auxPhyToSleep)
+    {
+        SetSleepStateForAllAuxPhys(true);
+    }
+
     DoNotifyIcfReceived(linkId);
 }
 
@@ -440,6 +545,90 @@
     return GetDelayUnlessMainPhyTakesOverUlTxop(linkId);
 }
 
+std::pair<bool, Time>
+EmlsrManager::CheckPossiblyReceivingIcf(uint8_t linkId) const
+{
+    NS_LOG_FUNCTION(this << linkId);
+
+    auto phy = GetStaMac()->GetWifiPhy(linkId);
+
+    if (!phy || !GetStaMac()->IsEmlsrLink(linkId))
+    {
+        NS_LOG_DEBUG("No PHY (" << phy << ") or not an EMLSR link (" << +linkId << ")");
+        return {false, Time{0}};
+    }
+
+    if (auto macHdr = GetEhtFem(linkId)->GetReceivedMacHdr(); macHdr && m_useNotifiedMacHdr)
+    {
+        NS_LOG_DEBUG("Receiving the MAC payload of a PSDU and MAC header info can be used");
+        NS_ASSERT(phy->GetState()->GetLastTime({WifiPhyState::RX}) == Simulator::Now());
+
+        if (const auto& hdr = macHdr->get();
+            hdr.IsTrigger() &&
+            (hdr.GetAddr1().IsBroadcast() || hdr.GetAddr1() == GetEhtFem(linkId)->GetAddress()))
+        {
+            // the PSDU being received _may_ be an ICF. Note that we cannot be sure that the PSDU
+            // being received is an ICF addressed to us until we receive the entire PSDU
+            NS_LOG_DEBUG("Based on MAC header, may be an ICF, postpone by "
+                         << phy->GetDelayUntilIdle().As(Time::US));
+            return {true, phy->GetDelayUntilIdle()};
+        }
+    }
+    else if (auto txVector = phy->GetInfoIfRxingPhyHeader())
+    {
+        NS_LOG_DEBUG("Receiving PHY header");
+        if (txVector->get().GetModulationClass() < WIFI_MOD_CLASS_HT)
+        {
+            // the PHY header of a non-HT PPDU, which may be an ICF, is being received; check
+            // again after the TX duration of a non-HT PHY header
+            NS_LOG_DEBUG("PHY header of a non-HT PPDU, which may be an ICF, is being received");
+            return {true, EMLSR_RX_PHY_START_DELAY};
+        }
+    }
+    else if (phy->IsStateRx())
+    {
+        // we have not yet received the MAC header or we cannot use its info
+
+        auto ongoingRxInfo = GetEhtFem(linkId)->GetOngoingRxInfo();
+        // if a PHY is in RX state, it should have info about received MAC header.
+        // The exception is represented by this situation:
+        // - an aux PHY is disconnected from the MAC stack because the main PHY is
+        //   operating on its link
+        // - the main PHY notifies the MAC header info to the FEM and then leaves the
+        //   link (e.g., because it recognizes that the MPDU is not addressed to the
+        //   EMLSR client). Disconnecting the main PHY from the MAC stack causes the
+        //   MAC header info to be discarded by the FEM
+        // - the aux PHY is re-connected to the MAC stack and is still in RX state
+        //   when the main PHY gets channel access on another link (and we get here)
+        if (!ongoingRxInfo.has_value())
+        {
+            NS_ASSERT_MSG(phy != GetStaMac()->GetDevice()->GetPhy(GetMainPhyId()),
+                          "Main PHY should have MAC header info when in RX state");
+            // we are in the situation described above; if the MPDU being received
+            // by the aux PHY is not addressed to the EMLSR client, we can ignore it
+        }
+        else if (const auto& txVector = ongoingRxInfo->get().txVector;
+                 txVector.GetModulationClass() < WIFI_MOD_CLASS_HT)
+        {
+            if (auto remTime = phy->GetTimeToMacHdrEnd(SU_STA_ID);
+                m_useNotifiedMacHdr && remTime.has_value() && remTime->IsStrictlyPositive())
+            {
+                NS_LOG_DEBUG("Wait until the expected end of the MAC header reception: "
+                             << remTime->As(Time::US));
+                return {true, *remTime};
+            }
+
+            NS_LOG_DEBUG(
+                "MAC header info will not be available. Wait until the end of PSDU reception: "
+                << phy->GetDelayUntilIdle().As(Time::US));
+            return {true, phy->GetDelayUntilIdle()};
+        }
+    }
+
+    NS_LOG_DEBUG("No ICF being received, state: " << phy->GetState()->GetState());
+    return {false, Time{0}};
+}
+
 void
 EmlsrManager::NotifyUlTxopStart(uint8_t linkId)
 {
@@ -464,6 +653,36 @@
 }
 
 void
+EmlsrManager::NotifyRtsSent(uint8_t linkId, Ptr<const WifiPsdu> rts, const WifiTxVector& txVector)
+{
+    NS_LOG_FUNCTION(this << *rts << txVector);
+}
+
+void
+EmlsrManager::NotifyProtectionCompleted(uint8_t linkId)
+{
+    NS_LOG_FUNCTION(this << linkId);
+
+    if (m_auxPhyToSleep && m_staMac->IsEmlsrLink(linkId))
+    {
+        if (auto mainPhy = m_staMac->GetDevice()->GetPhy(m_mainPhyId); mainPhy->IsStateSwitching())
+        {
+            // main PHY is switching to this link to take over the UL TXOP. Postpone aux PHY
+            // sleeping until after the main PHY has completed switching
+            Simulator::Schedule(mainPhy->GetDelayUntilIdle() + TimeStep(1),
+                                &EmlsrManager::SetSleepStateForAllAuxPhys,
+                                this,
+                                true);
+        }
+        else
+        {
+            // put aux PHYs to sleep
+            SetSleepStateForAllAuxPhys(true);
+        }
+    }
+}
+
+void
 EmlsrManager::NotifyTxopEnd(uint8_t linkId, bool ulTxopNotStarted, bool ongoingDlTxop)
 {
     NS_LOG_FUNCTION(this << linkId << ulTxopNotStarted << ongoingDlTxop);
@@ -505,22 +724,47 @@
         return;
     }
 
+    if (m_auxPhyToSleep)
+    {
+        // TXOP ended, resume all aux PHYs from sleep
+        SetSleepStateForAllAuxPhys(false);
+    }
+
     DoNotifyTxopEnd(linkId);
 
-    Simulator::ScheduleNow([=, this]() {
-        // unblock transmissions and resume medium access on other EMLSR links
-        std::set<uint8_t> linkIds;
-        for (auto id : m_staMac->GetLinkIds())
+    // unblock transmissions and resume medium access on other EMLSR links
+    std::set<uint8_t> linkIds;
+    for (auto id : m_staMac->GetLinkIds())
+    {
+        if ((id != linkId) && m_staMac->IsEmlsrLink(id))
         {
-            if ((id != linkId) && m_staMac->IsEmlsrLink(id))
-            {
-                linkIds.insert(id);
-            }
+            linkIds.insert(id);
         }
-        m_staMac->UnblockTxOnLink(linkIds, WifiQueueBlockedReason::USING_OTHER_EMLSR_LINK);
+    }
+    m_staMac->UnblockTxOnLink(linkIds, WifiQueueBlockedReason::USING_OTHER_EMLSR_LINK);
+}
 
-        StartMediumSyncDelayTimer(linkId);
-    });
+void
+EmlsrManager::NotifyInDeviceInterferenceStart(uint8_t linkId, Time duration)
+{
+    NS_LOG_FUNCTION(this << linkId << duration.As(Time::US));
+    NS_ASSERT(m_inDeviceInterference);
+
+    // The STA may choose not to (re)start the MediumSyncDelay timer if the transmission duration
+    // is less than or equal to aMediumSyncThreshold. (Sec. 35.3.16.8.1 802.11be D5.1)
+    if (duration <= MicroSeconds(MEDIUM_SYNC_THRESHOLD_USEC))
+    {
+        return;
+    }
+
+    // iterate over all the other EMLSR links
+    for (auto id : m_staMac->GetLinkIds())
+    {
+        if (id != linkId && m_staMac->IsEmlsrLink(id))
+        {
+            Simulator::Schedule(duration, &EmlsrManager::StartMediumSyncDelayTimer, this, id);
+        }
+    }
 }
 
 void
@@ -556,9 +800,11 @@
 EmlsrManager::SwitchMainPhy(uint8_t linkId,
                             bool noSwitchDelay,
                             bool resetBackoff,
-                            bool requestAccess)
+                            bool requestAccess,
+                            EmlsrMainPhySwitchTrace&& traceInfo)
 {
-    NS_LOG_FUNCTION(this << linkId << noSwitchDelay << resetBackoff << requestAccess);
+    NS_LOG_FUNCTION(this << linkId << noSwitchDelay << resetBackoff << requestAccess
+                         << traceInfo.GetName());
 
     auto mainPhy = m_staMac->GetDevice()->GetPhy(m_mainPhyId);
 
@@ -567,9 +813,9 @@
 
     // find the link on which the main PHY is operating
     auto currMainPhyLinkId = m_staMac->GetLinkForPhy(mainPhy);
-
-    NS_ASSERT_MSG(currMainPhyLinkId.has_value() || mainPhy->IsStateSwitching(),
-                  "If the main PHY is not operating on a link, it must be switching");
+    traceInfo.fromLinkId = currMainPhyLinkId;
+    traceInfo.toLinkId = linkId;
+    m_mainPhySwitchTrace(traceInfo);
 
     const auto newMainPhyChannel = GetChannelForMainPhy(linkId);
 
@@ -588,6 +834,9 @@
     NS_ASSERT_MSG(!mainPhy->GetState()->IsStateTx(),
                   "We should not ask the main PHY to switch channel while transmitting");
 
+    // record the aux PHY operating on the link the main PHY is switching to
+    auto auxPhy = GetStaMac()->GetWifiPhy(linkId);
+
     // request the main PHY to switch channel
     const auto delay = mainPhy->GetChannelSwitchDelay();
     const auto pifs = mainPhy->GetSifs() + mainPhy->GetSlot();
@@ -642,8 +891,12 @@
         });
     }
 
+    m_mainPhySwitchInfo.from = currMainPhyLinkId.value_or(m_mainPhySwitchInfo.from);
+    m_mainPhySwitchInfo.to = linkId;
+    m_mainPhySwitchInfo.end = Simulator::Now() + timeToSwitchEnd;
+
     SetCcaEdThresholdOnLinkSwitch(mainPhy, linkId);
-    NotifyMainPhySwitch(currMainPhyLinkId, linkId, timeToSwitchEnd);
+    NotifyMainPhySwitch(currMainPhyLinkId, linkId, auxPhy, timeToSwitchEnd);
 }
 
 void
@@ -686,36 +939,42 @@
 {
     NS_LOG_FUNCTION(this << linkId);
 
-    // iterate over all the other EMLSR links
-    for (auto id : m_staMac->GetLinkIds())
+    if (m_mediumSyncDuration.IsZero())
     {
-        if (id != linkId && m_staMac->IsEmlsrLink(id))
-        {
-            const auto [it, inserted] = m_mediumSyncDelayStatus.try_emplace(id);
+        NS_LOG_DEBUG("MediumSyncDuration is zero");
+        return;
+    }
 
-            // reset the max number of TXOP attempts
-            it->second.msdNTxopsLeft = m_msdMaxNTxops;
+    auto phy = m_staMac->GetWifiPhy(linkId);
 
-            // there are cases in which no PHY is operating on a link; e.g., the main PHY starts
-            // switching to a link on which an aux PHY gained a TXOP and sent an RTS, but the CTS
-            // is not received and the UL TXOP ends before the main PHY channel switch is
-            // completed. The MSD timer is started on the link left "uncovered" by the main PHY
-            if (auto phy = m_staMac->GetWifiPhy(id); phy && !it->second.timer.IsPending())
-            {
-                NS_LOG_DEBUG("Setting CCA ED threshold on link "
-                             << +id << " to " << +m_msdOfdmEdThreshold << " PHY " << phy);
-                m_prevCcaEdThreshold[phy] = phy->GetCcaEdThreshold();
-                phy->SetCcaEdThreshold(m_msdOfdmEdThreshold);
-            }
+    if (!phy)
+    {
+        NS_LOG_DEBUG("No PHY operating on link " << +linkId);
+        // MSD timer will be started when a PHY will be operating on this link
+        return;
+    }
 
-            // (re)start the timer
-            it->second.timer.Cancel();
-            it->second.timer = Simulator::Schedule(m_mediumSyncDuration,
-                                                   &EmlsrManager::MediumSyncDelayTimerExpired,
-                                                   this,
-                                                   id);
-        }
+    const auto [it, inserted] = m_mediumSyncDelayStatus.try_emplace(linkId);
+
+    // reset the max number of TXOP attempts
+    it->second.msdNTxopsLeft = m_msdMaxNTxops;
+
+    if (!it->second.timer.IsPending())
+    {
+        NS_LOG_DEBUG("Setting CCA ED threshold on link "
+                     << +linkId << " to " << +m_msdOfdmEdThreshold << " PHY " << phy);
+        m_prevCcaEdThreshold[phy] = phy->GetCcaEdThreshold();
+        phy->SetCcaEdThreshold(m_msdOfdmEdThreshold);
     }
+
+    // (re)start the timer
+    it->second.timer.Cancel();
+    NS_LOG_DEBUG("Starting MediumSyncDelay timer for " << m_mediumSyncDuration.As(Time::US)
+                                                       << " on link " << +linkId);
+    it->second.timer = Simulator::Schedule(m_mediumSyncDuration,
+                                           &EmlsrManager::MediumSyncDelayTimerExpired,
+                                           this,
+                                           linkId);
 }
 
 void
@@ -799,6 +1058,28 @@
     return timerIt->second.msdNTxopsLeft == 0;
 }
 
+bool
+EmlsrManager::GetExpectedAccessWithinDelay(uint8_t linkId, const Time& delay) const
+{
+    const auto deadline = Simulator::Now() + delay;
+    for (const auto& [acIndex, ac] : wifiAcList)
+    {
+        if (auto edca = m_staMac->GetQosTxop(acIndex); edca->HasFramesToTransmit(linkId))
+        {
+            const auto backoffEnd =
+                m_staMac->GetChannelAccessManager(linkId)->GetBackoffEndFor(edca);
+
+            if (backoffEnd <= deadline)
+            {
+                NS_LOG_DEBUG("Backoff end for " << acIndex << " on link " << +linkId << ": "
+                                                << backoffEnd.As(Time::US));
+                return true;
+            }
+        }
+    }
+    return false;
+}
+
 MgtEmlOmn
 EmlsrManager::GetEmlOmn()
 {
@@ -987,7 +1268,11 @@
         auto cam = m_staMac->GetChannelAccessManager(linkId);
         cam->NotifySwitchingEmlsrLink(auxPhy, channel, linkId);
 
+        // apply channel width limitation assuming an instantaneous channel switch
+        const auto delay = auxPhy->GetChannelSwitchDelay();
+        auxPhy->SetAttribute("ChannelSwitchDelay", TimeValue(Time{0}));
         auxPhy->SetOperatingChannel(channel);
+        auxPhy->SetAttribute("ChannelSwitchDelay", TimeValue(delay));
 
         // the way the ChannelAccessManager handles EMLSR link switch implies that a PHY listener
         // is removed when the channel switch starts and another one is attached when the channel
@@ -995,15 +1280,13 @@
         // reset all backoffs (so that access timeout is also cancelled) when the channel switch
         // starts and request channel access (if needed) when the channel switch ends.
         cam->ResetAllBackoffs();
-        Simulator::Schedule(auxPhy->GetChannelSwitchDelay(), [=, this]() {
-            for (const auto& [acIndex, ac] : wifiAcList)
-            {
-                m_staMac->GetQosTxop(acIndex)->StartAccessAfterEvent(
-                    linkId,
-                    Txop::DIDNT_HAVE_FRAMES_TO_TRANSMIT,
-                    Txop::CHECK_MEDIUM_BUSY);
-            }
-        });
+        for (const auto& [acIndex, ac] : wifiAcList)
+        {
+            m_staMac->GetQosTxop(acIndex)->StartAccessAfterEvent(
+                linkId,
+                Txop::DIDNT_HAVE_FRAMES_TO_TRANSMIT,
+                Txop::CHECK_MEDIUM_BUSY);
+        }
     }
 }
 
@@ -1042,7 +1325,7 @@
                       "Primary" << auxPhyMaxWidth << " channel not found");
         m_auxPhyChannels.emplace(linkId, chIt);
         // find the P20 index for the channel used by the aux PHYs
-        auto p20Index = channel.GetPrimaryChannelIndex(20);
+        auto p20Index = channel.GetPrimaryChannelIndex(MHz_u{20});
         while (mainPhyChWidth > auxPhyMaxWidth)
         {
             mainPhyChWidth /= 2;
@@ -1070,4 +1353,95 @@
     return it->second;
 }
 
+void
+EmlsrManager::CancelAllSleepEvents()
+{
+    NS_LOG_FUNCTION(this);
+
+    for (auto& [id, event] : m_auxPhyToSleepEvents)
+    {
+        event.Cancel();
+    }
+    m_auxPhyToSleepEvents.clear();
+}
+
+void
+EmlsrManager::SetSleepStateForAllAuxPhys(bool sleep)
+{
+    NS_LOG_FUNCTION(this << sleep);
+
+    CancelAllSleepEvents();
+
+    for (const auto& phy : m_staMac->GetDevice()->GetPhys())
+    {
+        if (phy->GetPhyId() == m_mainPhyId)
+        {
+            continue; // do not set sleep mode/resume from sleep the main PHY
+        }
+
+        auto linkId = m_staMac->GetLinkForPhy(phy);
+
+        if (linkId.has_value() && !m_staMac->IsEmlsrLink(*linkId))
+        {
+            continue; // this PHY is not operating on an EMLSR link
+        }
+
+        if (!sleep)
+        {
+            if (!phy->IsStateSleep())
+            {
+                continue; // nothing to do
+            }
+
+            NS_LOG_DEBUG("PHY " << +phy->GetPhyId() << ": Resuming from sleep");
+            phy->ResumeFromSleep();
+
+            // if this aux PHY is operating on a link, check if it lost medium sync
+            if (linkId.has_value())
+            {
+                auto it = m_startSleep.find(phy->GetPhyId());
+                NS_ASSERT_MSG(it != m_startSleep.cend(),
+                              "No start sleep info for PHY ID " << phy->GetPhyId());
+                const auto sleepDuration = Simulator::Now() - it->second;
+                m_startSleep.erase(it);
+
+                if (sleepDuration > MicroSeconds(MEDIUM_SYNC_THRESHOLD_USEC))
+                {
+                    StartMediumSyncDelayTimer(*linkId);
+                }
+            }
+
+            continue; // resuming the PHY from sleep has been handled
+        }
+
+        if (phy->IsStateSleep())
+        {
+            continue; // nothing to do
+        }
+
+        // we force WifiPhy::SetSleepMode() to abort RX and switch immediately to sleep mode in
+        // case the state is RX. If the state is TX or SWITCHING, WifiPhy::SetSleepMode() postpones
+        // setting sleep mode to end of TX or SWITCHING. This is fine, but we schedule events here
+        // to correctly record the time an aux PHY was put to sleep and to be able to cancel them
+        // later if needed
+        std::stringstream ss;
+        auto s = std::string("PHY ") + std::to_string(phy->GetPhyId()) + ": Setting sleep mode";
+        if (phy->IsStateTx() || phy->IsStateSwitching())
+        {
+            const auto delay = phy->GetDelayUntilIdle();
+            NS_LOG_DEBUG(s << " in " << delay.As(Time::US));
+            m_auxPhyToSleepEvents[phy->GetPhyId()] = Simulator::Schedule(delay, [=, this]() {
+                phy->SetSleepMode(true);
+                m_startSleep[phy->GetPhyId()] = Simulator::Now();
+            });
+        }
+        else
+        {
+            NS_LOG_DEBUG(s);
+            phy->SetSleepMode(true);
+            m_startSleep[phy->GetPhyId()] = Simulator::Now();
+        }
+    }
+}
+
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/eht/emlsr-manager.h ns-3.44/src/wifi/model/eht/emlsr-manager.h
--- ns-3.43/src/wifi/model/eht/emlsr-manager.h	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/eht/emlsr-manager.h	2025-03-09 16:55:49.787372600 -0700
@@ -16,8 +16,10 @@
 #include "ns3/wifi-phy-operating-channel.h"
 
 #include <map>
+#include <memory>
 #include <optional>
 #include <set>
+#include <string_view>
 #include <utility>
 
 class EmlsrCcaBusyTest;
@@ -30,7 +32,46 @@
 class WifiMpdu;
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
+ * Base struct for EMLSR Main PHY switch traces.
+ */
+struct EmlsrMainPhySwitchTrace
+{
+    virtual ~EmlsrMainPhySwitchTrace() = default;
+
+    /// @return the name of this instance
+    virtual std::string_view GetName() const = 0;
+
+    /// @return a pointer to the clone of this object
+    virtual std::shared_ptr<EmlsrMainPhySwitchTrace> Clone() const = 0;
+
+    std::optional<uint8_t> fromLinkId; //!< ID of the link the main PHY is moving from (if any)
+    uint8_t toLinkId{WIFI_LINKID_UNDEFINED}; //!< ID of the link the main PHY is moving to
+};
+
+/**
+ * Implementation for the EMLSR Main PHY switch trace base struct. Child structs are inherited
+ * from this implementation according to the CRTP idiom and must define a static string_view
+ * member containing the name of the child.
+ */
+template <class T>
+struct EmlsrMainPhySwitchTraceImpl : public EmlsrMainPhySwitchTrace
+{
+    /// @copydoc ns3::EmlsrMainPhySwitchTrace::GetName
+    std::string_view GetName() const override
+    {
+        return T::m_name;
+    }
+
+    /// @copydoc ns3::EmlsrMainPhySwitchTrace::Clone
+    std::shared_ptr<EmlsrMainPhySwitchTrace> Clone() const override
+    {
+        return std::shared_ptr<EmlsrMainPhySwitchTrace>(new T(static_cast<const T&>(*this)));
+    }
+};
+
+/**
+ * @ingroup wifi
  *
  * EmlsrManager is an abstract base class defining the API that EHT non-AP MLDs
  * with EMLSR activated can use to handle the operations on the EMLSR links
@@ -41,9 +82,12 @@
     friend class ::EmlsrCcaBusyTest;
 
   public:
+    /// The aMediumSyncThreshold defined by Sec. 35.3.16.18.1 of 802.11be D4.0
+    static constexpr uint16_t MEDIUM_SYNC_THRESHOLD_USEC = 72;
+
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     EmlsrManager();
@@ -52,31 +96,31 @@
     /**
      * Set the wifi MAC. Note that it must be the MAC of an EHT non-AP MLD.
      *
-     * \param mac the wifi MAC
+     * @param mac the wifi MAC
      */
     void SetWifiMac(Ptr<StaWifiMac> mac);
 
     /**
      * Set the Transition Timeout advertised by the associated AP with EMLSR activated.
      *
-     * \param timeout the advertised Transition Timeout
+     * @param timeout the advertised Transition Timeout
      */
     void SetTransitionTimeout(Time timeout);
 
     /**
-     * \return the Transition Timeout, if advertised by the associated AP
+     * @return the Transition Timeout, if advertised by the associated AP
      */
     std::optional<Time> GetTransitionTimeout() const;
 
     /**
      * Set the duration of the MediumSyncDelay timer.
      *
-     * \param duration the duration of the MediumSyncDelay timer
+     * @param duration the duration of the MediumSyncDelay timer
      */
     void SetMediumSyncDuration(Time duration);
 
     /**
-     * \return the duration of the MediumSyncDelay timer
+     * @return the duration of the MediumSyncDelay timer
      */
     Time GetMediumSyncDuration() const;
 
@@ -84,12 +128,12 @@
      * Set the Medium Synchronization OFDM ED threshold (dBm) to use while the MediumSyncDelay
      * timer is running.
      *
-     * \param threshold the threshold in dBm (ranges from -72 to -62 dBm)
+     * @param threshold the threshold in dBm (ranges from -72 to -62 dBm)
      */
     void SetMediumSyncOfdmEdThreshold(int8_t threshold);
 
     /**
-     * \return the Medium Synchronization OFDM ED threshold (dBm) to use while the MediumSyncDelay
+     * @return the Medium Synchronization OFDM ED threshold (dBm) to use while the MediumSyncDelay
      * timer is running.
      */
     int8_t GetMediumSyncOfdmEdThreshold() const;
@@ -98,19 +142,19 @@
      * Set the maximum number of TXOPs a non-AP STA is allowed to attempt to initiate while
      * the MediumSyncDelay timer is running. No value indicates no limit.
      *
-     * \param nTxops the maximum number of TXOPs a non-AP STA is allowed to attempt to
+     * @param nTxops the maximum number of TXOPs a non-AP STA is allowed to attempt to
      *               initiate while the MediumSyncDelay timer is running
      */
     void SetMediumSyncMaxNTxops(std::optional<uint8_t> nTxops);
 
     /**
-     * \return the maximum number of TXOPs a non-AP STA is allowed to attempt to initiate while
+     * @return the maximum number of TXOPs a non-AP STA is allowed to attempt to initiate while
      * the MediumSyncDelay timer is running. No value indicates no limit.
      */
     std::optional<uint8_t> GetMediumSyncMaxNTxops() const;
 
     /**
-     * \return the ID of main PHY (position in the vector of PHYs held by WifiNetDevice)
+     * @return the ID of main PHY (position in the vector of PHYs held by WifiNetDevice)
      */
     uint8_t GetMainPhyId() const;
 
@@ -118,13 +162,13 @@
      * Take actions to enable EMLSR mode on the given set of links, if non-empty, or
      * disable EMLSR mode, otherwise.
      *
-     * \param linkIds the IDs of the links on which EMLSR mode should be enabled
+     * @param linkIds the IDs of the links on which EMLSR mode should be enabled
      *                (empty to disable EMLSR mode)
      */
     void SetEmlsrLinks(const std::set<uint8_t>& linkIds);
 
     /**
-     * \return the set of links on which EMLSR mode is enabled
+     * @return the set of links on which EMLSR mode is enabled
      */
     const std::set<uint8_t>& GetEmlsrLinks() const;
 
@@ -132,12 +176,12 @@
      * Set the member variable indicating whether the state of the CAM should be reset when
      * the main PHY switches channel and operates on the link associated with the CAM.
      *
-     * \param enable whether the CAM state should be reset
+     * @param enable whether the CAM state should be reset
      */
     void SetCamStateReset(bool enable);
 
     /**
-     * \return the value of the member variable indicating whether the state of the CAM should be
+     * @return the value of the member variable indicating whether the state of the CAM should be
      * reset when the main PHY switches channel and operates on the link associated with the CAM.
      */
     bool GetCamStateReset() const;
@@ -146,9 +190,9 @@
      * Notify that an UL TXOP is gained on the given link by the given AC. This method has to
      * determine whether to start the UL TXOP or release the channel.
      *
-     * \param linkId the ID of the given link
-     * \param aci the index of the given AC
-     * \return a pair consisting of a boolean value indicating whether the UL TXOP can be started
+     * @param linkId the ID of the given link
+     * @param aci the index of the given AC
+     * @return a pair consisting of a boolean value indicating whether the UL TXOP can be started
      *         and a Time value indicating the delay after which the EMLSR client must restart
      *         channel access (if needed) in case the UL TXOP is not started
      */
@@ -157,12 +201,12 @@
     /**
      * Set the member variable indicating whether Aux PHYs are capable of transmitting PPDUs.
      *
-     * \param capable whether Aux PHYs are capable of transmitting PPDUs
+     * @param capable whether Aux PHYs are capable of transmitting PPDUs
      */
     void SetAuxPhyTxCapable(bool capable);
 
     /**
-     * \return whether Aux PHYs are capable of transmitting PPDUs
+     * @return whether Aux PHYs are capable of transmitting PPDUs
      */
     bool GetAuxPhyTxCapable() const;
 
@@ -170,13 +214,13 @@
      * Set the member variable indicating whether in-device interference is such that a PHY cannot
      * decode anything and cannot decrease the backoff counter when another PHY is transmitting.
      *
-     * \param enable whether in-device interference is such that a PHY cannot decode anything
+     * @param enable whether in-device interference is such that a PHY cannot decode anything
      *               and cannot decrease the backoff counter when another PHY is transmitting
      */
     void SetInDeviceInterference(bool enable);
 
     /**
-     * \return whether in-device interference is such that a PHY cannot decode anything and cannot
+     * @return whether in-device interference is such that a PHY cannot decode anything and cannot
      *         decrease the backoff counter when another PHY is transmitting
      */
     bool GetInDeviceInterference() const;
@@ -184,42 +228,70 @@
     /**
      * Notify the reception of a management frame addressed to us.
      *
-     * \param mpdu the received MPDU
-     * \param linkId the ID of the link over which the MPDU was received
+     * @param mpdu the received MPDU
+     * @param linkId the ID of the link over which the MPDU was received
      */
     void NotifyMgtFrameReceived(Ptr<const WifiMpdu> mpdu, uint8_t linkId);
 
     /**
      * Notify the reception of an initial Control frame on the given link.
      *
-     * \param linkId the ID of the link on which the initial Control frame was received
+     * @param linkId the ID of the link on which the initial Control frame was received
      */
     void NotifyIcfReceived(uint8_t linkId);
 
     /**
      * Notify the start of an UL TXOP on the given link
      *
-     * \param linkId the ID of the given link
+     * @param linkId the ID of the given link
      */
     void NotifyUlTxopStart(uint8_t linkId);
 
     /**
+     * Notify that RTS transmission is starting on the given link.
+     *
+     * @param linkId the ID of the given link
+     * @param rts the RTS being transmitted
+     * @param txVector the TXVECTOR used to transmit the RTS
+     */
+    virtual void NotifyRtsSent(uint8_t linkId,
+                               Ptr<const WifiPsdu> rts,
+                               const WifiTxVector& txVector);
+
+    /**
+     * Notify that protection (if required) is completed and data frame exchange can start
+     * on the given link.
+     *
+     * @param linkId the ID of the given link
+     */
+    void NotifyProtectionCompleted(uint8_t linkId);
+
+    /**
      * Notify the end of a TXOP on the given link.
      *
-     * \param linkId the ID of the given link
-     * \param ulTxopNotStarted whether this is a notification of the end of an UL TXOP that did
+     * @param linkId the ID of the given link
+     * @param ulTxopNotStarted whether this is a notification of the end of an UL TXOP that did
      *                      not even start (no frame transmitted)
-     * \param ongoingDlTxop whether a DL TXOP is ongoing on the given link (if true, this is
+     * @param ongoingDlTxop whether a DL TXOP is ongoing on the given link (if true, this is
      *                      a notification of the end of an UL TXOP)
      */
     void NotifyTxopEnd(uint8_t linkId, bool ulTxopNotStarted = false, bool ongoingDlTxop = false);
 
     /**
+     * Notify that an STA affiliated with the EMLSR client is causing in-device interference
+     * for the given amount of time.
+     *
+     * @param linkId the ID of the link on which the STA is operating
+     * @param duration the duration of the in-device interference
+     */
+    virtual void NotifyInDeviceInterferenceStart(uint8_t linkId, Time duration);
+
+    /**
      * Check whether the MediumSyncDelay timer is running for the STA operating on the given link.
      * If so, returns the time elapsed since the timer started.
      *
-     * \param linkId the ID of the given link
-     * \return the time elapsed since the MediumSyncDelay timer started, if this timer is running
+     * @param linkId the ID of the given link
+     * @return the time elapsed since the MediumSyncDelay timer started, if this timer is running
      *         for the STA operating on the given link
      */
     std::optional<Time> GetElapsedMediumSyncDelayTimer(uint8_t linkId) const;
@@ -229,7 +301,7 @@
      * actions. This function must not be called when the MediumSyncDelay timer is not running
      * on the given link.
      *
-     * \param linkId the ID of the link associated with the MediumSyncDelay timer to cancel
+     * @param linkId the ID of the link associated with the MediumSyncDelay timer to cancel
      */
     void CancelMediumSyncDelayTimer(uint8_t linkId);
 
@@ -238,7 +310,7 @@
      * timer is running. This function must not be called when the MediumSyncDelay timer is not
      * running on the given link.
      *
-     * \param linkId the ID of the link on which a new TXOP attempt may be carried out
+     * @param linkId the ID of the link on which a new TXOP attempt may be carried out
      */
     void DecrementMediumSyncDelayNTxops(uint8_t linkId);
 
@@ -249,7 +321,7 @@
      * attempt is successful. This function must not be called when the MediumSyncDelay timer is
      * not running on the given link.
      *
-     * \param linkId the ID of the link for which the counter of the TXOP attempts is reset
+     * @param linkId the ID of the link for which the counter of the TXOP attempts is reset
      */
     void ResetMediumSyncDelayNTxops(uint8_t linkId);
 
@@ -257,34 +329,44 @@
      * Return whether no more TXOP attempt is allowed on the given link. This function must not
      * be called when the MediumSyncDelay timer is not running on the given link.
      *
-     * \param linkId the ID of the link on which a new TXOP attempt may be carried out
-     * \return whether no more TXOP attempt on the given link is allowed
+     * @param linkId the ID of the link on which a new TXOP attempt may be carried out
+     * @return whether no more TXOP attempt on the given link is allowed
      */
     bool MediumSyncDelayNTxopsExceeded(uint8_t linkId);
 
+    /**
+     * Check whether a PPDU that may be an ICF is being received on the given link. If so, return
+     * true along with the time to wait to know more information about the PPDU being received.
+     * Otherwise, return false.
+     *
+     * @param linkId the ID of the given link
+     * @return a pair indicating whether a PPDU that may be an ICF is being received on the link
+     */
+    std::pair<bool, Time> CheckPossiblyReceivingIcf(uint8_t linkId) const;
+
   protected:
     void DoDispose() override;
 
     /**
      * Allow subclasses to take actions when the MAC is set.
      *
-     * \param mac the wifi MAC
+     * @param mac the wifi MAC
      */
     virtual void DoSetWifiMac(Ptr<StaWifiMac> mac);
 
     /**
-     * \return the MAC of the non-AP MLD managed by this EMLSR Manager.
+     * @return the MAC of the non-AP MLD managed by this EMLSR Manager.
      */
     Ptr<StaWifiMac> GetStaMac() const;
 
     /**
-     * \param linkId the ID of the given link
-     * \return the EHT FrameExchangeManager attached to the non-AP STA operating on the given link
+     * @param linkId the ID of the given link
+     * @return the EHT FrameExchangeManager attached to the non-AP STA operating on the given link
      */
     Ptr<EhtFrameExchangeManager> GetEhtFem(uint8_t linkId) const;
 
     /**
-     * \return the ID of the link on which the EML Operating Mode Notification frame has to be sent
+     * @return the ID of the link on which the EML Operating Mode Notification frame has to be sent
      */
     virtual uint8_t GetLinkToSendEmlOmn() = 0;
 
@@ -292,21 +374,21 @@
      * A previous EML Operating Mode Notification frame was dropped. Ask the subclass whether
      * the frame needs to be re-sent on the given link (if any).
      *
-     * \param mpdu the dropped MPDU that includes the EML Operating Mode Notification frame
-     * \return the ID of the link over which to re-send the frame, if needed
+     * @param mpdu the dropped MPDU that includes the EML Operating Mode Notification frame
+     * @return the ID of the link over which to re-send the frame, if needed
      */
     virtual std::optional<uint8_t> ResendNotification(Ptr<const WifiMpdu> mpdu) = 0;
 
     /**
-     * \param linkId the ID of the given link
-     * \return the operating channel the main PHY must switch to in order to operate
+     * @param linkId the ID of the given link
+     * @return the operating channel the main PHY must switch to in order to operate
      *         on the given link
      */
     const WifiPhyOperatingChannel& GetChannelForMainPhy(uint8_t linkId) const;
 
     /**
-     * \param linkId the ID of the given link
-     * \return the operating channel an aux PHY must switch to in order to operate
+     * @param linkId the ID of the given link
+     * @return the operating channel an aux PHY must switch to in order to operate
      *         on the given link
      */
     const WifiPhyOperatingChannel& GetChannelForAuxPhy(uint8_t linkId) const;
@@ -314,14 +396,20 @@
     /**
      * Switch channel on the Main PHY so that it operates on the given link.
      *
-     * \param linkId the ID of the link on which the main PHY has to operate
-     * \param noSwitchDelay whether switching delay should be zero
-     * \param resetBackoff whether backoff should be reset on the link on which the main PHY
+     * @param linkId the ID of the link on which the main PHY has to operate
+     * @param noSwitchDelay whether switching delay should be zero
+     * @param resetBackoff whether backoff should be reset on the link on which the main PHY
      *                     is operating
-     * \param requestAccess whether channel access should be requested on the link on which the
+     * @param requestAccess whether channel access should be requested on the link on which the
      *                      main PHY is moving onto
+     * @param traceInfo information to pass to the main PHY switch traced callback (the fromLinkId
+     *                  and toLinkId fields are set by this function)
      */
-    void SwitchMainPhy(uint8_t linkId, bool noSwitchDelay, bool resetBackoff, bool requestAccess);
+    void SwitchMainPhy(uint8_t linkId,
+                       bool noSwitchDelay,
+                       bool resetBackoff,
+                       bool requestAccess,
+                       EmlsrMainPhySwitchTrace&& traceInfo);
 
     static constexpr bool RESET_BACKOFF = true;       //!< reset backoff on main PHY switch
     static constexpr bool DONT_RESET_BACKOFF = false; //!< do not reset backoff on main PHY switch
@@ -333,23 +421,31 @@
      * Switch channel on the Aux PHY operating on the given current link so that it operates
      * on the given next link.
      *
-     * \param auxPhy the Aux PHY
-     * \param currLinkId the ID of the link on which the aux PHY is currently operating
-     * \param nextLinkId the ID of the link on which the aux PHY will be operating
+     * @param auxPhy the Aux PHY
+     * @param currLinkId the ID of the link on which the aux PHY is currently operating
+     * @param nextLinkId the ID of the link on which the aux PHY will be operating
      */
     void SwitchAuxPhy(Ptr<WifiPhy> auxPhy, uint8_t currLinkId, uint8_t nextLinkId);
 
     /**
+     * Callback connected to the EmlsrLinkSwitch trace source of StaWifiMac.
+     *
+     * @param linkId the ID of the link involved in the EMLSR link switch event
+     * @param phy a pointer to the PHY involved in the EMLSR link switch event
+     */
+    virtual void EmlsrLinkSwitchCallback(uint8_t linkId, Ptr<WifiPhy> phy);
+
+    /**
      * Set the CCA ED threshold (if needed) on the given PHY that is switching channel to
      * operate on the given link.
      *
-     * \param phy the given PHY
-     * \param linkId the ID of the given link
+     * @param phy the given PHY
+     * @param linkId the ID of the given link
      */
     void SetCcaEdThresholdOnLinkSwitch(Ptr<WifiPhy> phy, uint8_t linkId);
 
     /**
-     * \return the EML Operating Mode Notification to send
+     * @return the EML Operating Mode Notification to send
      */
     MgtEmlOmn GetEmlOmn();
 
@@ -358,8 +454,8 @@
      * class when the EMLSR client gets channel access on the given link. This method has to
      * check possible reasons to give up the TXOP that apply to both main PHY and aux PHYs.
      *
-     * \param linkId the ID of the given link
-     * \return a pair consisting of a boolean value indicating whether the UL TXOP can be started
+     * @param linkId the ID of the given link
+     * @return a pair consisting of a boolean value indicating whether the UL TXOP can be started
      *         and a Time value indicating the delay after which the EMLSR client must restart
      *         channel access (if needed) in case the UL TXOP is not started
      */
@@ -371,8 +467,8 @@
      * an aux PHY that is not TX capable is operating. This method has to request the main PHY to
      * switch to the given link to take over the TXOP, unless it is decided to give up the TXOP.
      *
-     * \param linkId the ID of the given link
-     * \param aci the index of the given AC
+     * @param linkId the ID of the given link
+     * @param aci the index of the given AC
      */
     virtual void SwitchMainPhyIfTxopGainedByAuxPhy(uint8_t linkId, AcIndex aci) = 0;
 
@@ -383,29 +479,68 @@
      * given link to take over the TXOP, if possible, or determine the delay after which the
      * EMLSR client restarts channel access on the given link, otherwise.
      *
-     * \param linkId the ID of the given link
-     * \return a pair consisting of a boolean value indicating whether the UL TXOP can be started
+     * @param linkId the ID of the given link
+     * @return a pair consisting of a boolean value indicating whether the UL TXOP can be started
      *         and a Time value indicating the delay after which the EMLSR client must restart
      *         channel access (if needed) in case the UL TXOP is not started
      */
     virtual std::pair<bool, Time> GetDelayUnlessMainPhyTakesOverUlTxop(uint8_t linkId) = 0;
 
+    /**
+     * Set sleep state or awake state for all aux PHYs.
+     *
+     * @param sleep set sleep state, if true, or awake state, otherwise
+     */
+    void SetSleepStateForAllAuxPhys(bool sleep);
+
+    /**
+     * Cancel all pending events to put aux PHYs into sleep/awake state.
+     */
+    void CancelAllSleepEvents();
+
+    /**
+     * Get whether channel access is expected to be granted on the given link within the given
+     * delay to an Access Category that has traffic to send on the given link.
+     *
+     * @param linkId the ID of the given link
+     * @param delay the given delay
+     * @return whether channel access is expected to be granted on the given link within the given
+     *         delay
+     */
+    bool GetExpectedAccessWithinDelay(uint8_t linkId, const Time& delay) const;
+
+    /// Store information about a main PHY switch.
+    struct MainPhySwitchInfo
+    {
+        Time end;       //!< end of channel switching
+        uint8_t from{}; //!< ID of the link which the main PHY is/has been leaving
+        uint8_t to{};   //!< ID of the link which the main PHY is moving to
+    };
+
     Time m_emlsrPaddingDelay;    //!< EMLSR Padding delay
     Time m_emlsrTransitionDelay; //!< EMLSR Transition delay
     uint8_t m_mainPhyId; //!< ID of main PHY (position in the vector of PHYs held by WifiNetDevice)
     MHz_u m_auxPhyMaxWidth;                  //!< max channel width supported by aux PHYs
     WifiModulationClass m_auxPhyMaxModClass; //!< max modulation class supported by aux PHYs
     bool m_auxPhyTxCapable;                  //!< whether Aux PHYs are capable of transmitting PPDUs
+    bool m_auxPhyToSleep;     //!< whether Aux PHYs should be put into sleep mode while the Main PHY
+                              //!< is carrying out a (DL or UL) TXOP
+    bool m_useNotifiedMacHdr; //!< whether to use the information about the MAC header of
+                              //!< the MPDU being received (if notified by the PHY)
+    std::map<uint8_t, EventId> m_auxPhyToSleepEvents; //!< PHY ID-indexed map of events scheduled to
+                                                      //!< put an Aux PHY to sleep
+    std::map<uint8_t, Time> m_startSleep; //!< PHY ID-indexed map of last time sleep mode started
     std::map<uint8_t, EventId> m_ulMainPhySwitch; //!< link ID-indexed map of timers started when
                                                   //!< an aux PHY gains an UL TXOP and schedules
                                                   //!< a channel switch for the main PHY
+    MainPhySwitchInfo m_mainPhySwitchInfo;        //!< main PHY switch info
 
   private:
     /**
      * Set the ID of main PHY (position in the vector of PHYs held by WifiNetDevice). This
      * method cannot be called during or after initialization.
      *
-     * \param mainPhyId the ID of the main PHY
+     * @param mainPhyId the ID of the main PHY
      */
     void SetMainPhyId(uint8_t mainPhyId);
 
@@ -423,62 +558,60 @@
     void SendEmlOmn();
 
     /**
-     * Start the MediumSyncDelay timer and take the appropriate actions, if the timer is not
-     * already running.
+     * Start the MediumSyncDelay timer and take the appropriate actions.
      *
-     * \param linkId the ID of the link on which a TXOP was carried out that caused the STAs
-     *               operating on other links to lose medium synchronization
+     * @param linkId the ID of the link on which medium synchronization was lost
      */
     void StartMediumSyncDelayTimer(uint8_t linkId);
 
     /**
      * Take the appropriate actions when the MediumSyncDelay timer expires or is cancelled.
      *
-     * \param linkId the ID of the link associated with the MediumSyncDelay timer to cancel
+     * @param linkId the ID of the link associated with the MediumSyncDelay timer to cancel
      */
     void MediumSyncDelayTimerExpired(uint8_t linkId);
 
     /**
      * Notify the subclass of the reception of a management frame addressed to us.
      *
-     * \param mpdu the received MPDU
-     * \param linkId the ID of the link over which the MPDU was received
+     * @param mpdu the received MPDU
+     * @param linkId the ID of the link over which the MPDU was received
      */
     virtual void DoNotifyMgtFrameReceived(Ptr<const WifiMpdu> mpdu, uint8_t linkId) = 0;
 
     /**
      * Notify the subclass of the reception of an initial Control frame on the given link.
      *
-     * \param linkId the ID of the link on which the initial Control frame was received
+     * @param linkId the ID of the link on which the initial Control frame was received
      */
     virtual void DoNotifyIcfReceived(uint8_t linkId) = 0;
 
     /**
      * Notify the subclass of the start of an UL TXOP on the given link
      *
-     * \param linkId the ID of the given link
+     * @param linkId the ID of the given link
      */
     virtual void DoNotifyUlTxopStart(uint8_t linkId) = 0;
 
     /**
      * Notify the subclass of the end of a TXOP on the given link.
      *
-     * \param linkId the ID of the given link
+     * @param linkId the ID of the given link
      */
     virtual void DoNotifyTxopEnd(uint8_t linkId) = 0;
 
     /**
      * Notify the acknowledgment of the given MPDU.
      *
-     * \param mpdu the acknowledged MPDU
+     * @param mpdu the acknowledged MPDU
      */
     void TxOk(Ptr<const WifiMpdu> mpdu);
 
     /**
      * Notify that the given MPDU has been discarded for the given reason.
      *
-     * \param reason the reason why the MPDU was dropped
-     * \param mpdu the dropped MPDU
+     * @param reason the reason why the MPDU was dropped
+     * @param mpdu the dropped MPDU
      */
     void TxDropped(WifiMacDropReason reason, Ptr<const WifiMpdu> mpdu);
 
@@ -502,12 +635,14 @@
     /**
      * Notify subclass that the main PHY is switching channel to operate on another link.
      *
-     * \param currLinkId the ID of the link on which the main PHY is operating (if any)
-     * \param nextLinkId the ID of the link on which the main PHY will be operating
-     * \param duration the channel switch duration
+     * @param currLinkId the ID of the link on which the main PHY is operating (if any)
+     * @param nextLinkId the ID of the link on which the main PHY will be operating
+     * @param auxPhy the aux PHY operating on the link on which the main PHY will be operating
+     * @param duration the channel switch duration
      */
     virtual void NotifyMainPhySwitch(std::optional<uint8_t> currLinkId,
                                      uint8_t nextLinkId,
+                                     Ptr<WifiPhy> auxPhy,
                                      Time duration) = 0;
 
     /**
@@ -520,6 +655,18 @@
                                               //!< MediumSyncDelay timer is running
     };
 
+    /**
+     * TracedCallback signature for main PHY switch events.
+     *
+     * @param info the information associated with the main PHY switch event
+     */
+    typedef void (*MainPhySwitchCallback)(const EmlsrMainPhySwitchTrace& info);
+
+    /// TracedCallback for main PHY switch events typedef
+    using MainPhySwitchTracedCallback = TracedCallback<const EmlsrMainPhySwitchTrace&>;
+
+    MainPhySwitchTracedCallback m_mainPhySwitchTrace; //!< main PHY switch trace source
+
     Ptr<StaWifiMac> m_staMac;                     //!< the MAC of the managed non-AP MLD
     std::optional<Time> m_emlsrTransitionTimeout; /**< Transition timeout advertised by APs with
                                                        EMLSR activated */
@@ -550,6 +697,118 @@
         m_mainPhyChannels; //!< link ID-indexed map of operating channels for the main PHY
     std::map<uint8_t, WifiPhyOperatingChannel>
         m_auxPhyChannels; //!< link ID-indexed map of operating channels for the aux PHYs
+    std::map<uint8_t, Time>
+        m_noPhySince; //!< link ID-indexed map of the time since no PHY is operating on the link
+};
+
+/**
+ * Struct to trace that main PHY switched to start a DL TXOP after that an aux PHY received an ICF.
+ */
+struct EmlsrDlTxopIcfReceivedByAuxPhyTrace
+    : public EmlsrMainPhySwitchTraceImpl<EmlsrDlTxopIcfReceivedByAuxPhyTrace>
+{
+    static constexpr std::string_view m_name = "DlTxopIcfReceivedByAuxPhy"; //!< trace name
+};
+
+/**
+ * Struct to trace that main PHY switched to start an UL TXOP after that an aux PHY transmitted an
+ * RTS.
+ */
+struct EmlsrUlTxopRtsSentByAuxPhyTrace
+    : public EmlsrMainPhySwitchTraceImpl<EmlsrUlTxopRtsSentByAuxPhyTrace>
+{
+    static constexpr std::string_view m_name = "UlTxopRtsSentByAuxPhy"; //!< trace name
+};
+
+/**
+ * Struct to trace that main PHY switched when a (DL or UL) TXOP ended.
+ *
+ * This trace is normally called when aux PHYs do not switch link and the main PHY switches back to
+ * the preferred link when a TXOP carried out on another link ends. In such a case, the remTime
+ * field is set to zero.
+ *
+ * Note that the main PHY may be already switching when the TXOP ends; this happens, e.g., when the
+ * main PHY starts switching to a link on which an aux PHY gained a TXOP and sent an RTS, but the
+ * CTS is not received and the UL TXOP ends before the main PHY channel switch is completed. In this
+ * case, the main PHY switch is postponed until the previous switch is completed and the remTime
+ * field is set to the remaining channel switch delay at the time the TXOP ends:
+ *
+ *                                |-- main PHY switch --|
+ *                                |----- to link 1 -----|
+ *                                          ┌───────────┐
+ *                                          │    CTS    │
+ *  ────────────────────────┬───────────┬───┴X──────────┴─────────────────────────────
+ *  [link 1]                │    RTS    │     │-remTime-│
+ *                          └───────────┘     │         |-- main PHY switch --|
+ *                                            │         |- to preferred link -|
+ *                                         CTS timeout
+ *
+ * Note also that the Advanced EMLSR manager may allow a main PHY switch to be interrupted. If this
+ * option is enabled and the main PHY is switching when the TXOP ends, the previous switch is
+ * interrupted and the main PHY starts switching to the preferred link (in this case, the remTime
+ * field indicates the time that was left to complete the previous switch). Also note that, with
+ * the Advanced EMLSR manager, this trace may also be called when aux PHYs switch link. This happens
+ * when the TXOP ends while the main PHY is switching; in this case, the previous switch is
+ * interrupted and the main PHY returns to the link on which it was operating before the previous
+ * switch.
+ *
+ *                                |-- main PHY switch --|
+ *                                |----- to link 1 -----|(interrupted)
+ *                                          ┌───────────┐
+ *                                          │    CTS    │
+ *  ────────────────────────┬───────────┬───┴X──────────┴─────────────────────────────
+ *  [link 1]                │    RTS    │     │-remTime-│
+ *                          └───────────┘     │-- main PHY switch --|
+ *                                            │- to preferred link -|
+ *                                         CTS timeout
+ */
+struct EmlsrTxopEndedTrace : public EmlsrMainPhySwitchTraceImpl<EmlsrTxopEndedTrace>
+{
+    static constexpr std::string_view m_name = "TxopEnded"; //!< trace name
+
+    Time remTime; //!< the remaining time (at TXOP end) until the main PHY completes the
+                  //!< channel switch, in case the main PHY is completing a previous switch
+                  //!< when the TXOP ends
+
+    /**
+     * Constructor provided because this struct is not an aggregate (it has a base struct), hence
+     * we cannot use designated initializers.
+     *
+     * @param t the value for the sinceTxopEnd field
+     */
+    EmlsrTxopEndedTrace(const Time& t)
+        : remTime(t)
+    {
+    }
+};
+
+/**
+ * Struct to trace that main PHY switched to operate on a link on which an aux PHY that is not
+ * TX capable has gained or is expected to shortly gain a TXOP.
+ */
+struct EmlsrUlTxopAuxPhyNotTxCapableTrace
+    : public EmlsrMainPhySwitchTraceImpl<EmlsrUlTxopAuxPhyNotTxCapableTrace>
+{
+    static constexpr std::string_view m_name = "UlTxopAuxPhyNotTxCapable"; //!< trace name
+
+    AcIndex acIndex; //!< Access category of TXOP on aux PHY
+    Time remTime;    //!< Remaining time to complete backoff countdown on the aux PHY link
+    Time remNav;     //!< the remaining NAV on main PHY link when main PHY is requested to switch
+
+    /**
+     * Constructor provided because this struct is not an aggregate (it has a base struct), hence
+     * we cannot use designated initializers.
+     *
+     * @param aci the value for the acIndex field
+     * @param delay the value for the remTime field
+     * @param navLeft the value for the remNav field
+     */
+    EmlsrUlTxopAuxPhyNotTxCapableTrace(AcIndex aci, const Time& delay, const Time& navLeft)
+        : acIndex(aci),
+          remTime(delay),
+          remNav(navLeft)
+    {
+    }
 };
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/eht/multi-link-element.cc ns-3.44/src/wifi/model/eht/multi-link-element.cc
--- ns-3.43/src/wifi/model/eht/multi-link-element.cc	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/eht/multi-link-element.cc	2025-03-09 16:55:49.787372600 -0700
@@ -9,281 +9,16 @@
 #include "multi-link-element.h"
 
 #include "ns3/address-utils.h"
+#include "ns3/log.h"
 #include "ns3/mgt-headers.h"
 
 #include <utility>
 
-namespace ns3
-{
-
-/**
- * CommonInfoBasicMle
- */
-
-uint16_t
-CommonInfoBasicMle::GetPresenceBitmap() const
-{
-    // see Sec. 9.4.2.312.2.1 of 802.11be D1.5
-    return (m_linkIdInfo.has_value() ? 0x0001 : 0x0) |
-           (m_bssParamsChangeCount.has_value() ? 0x0002 : 0x0) |
-           (m_mediumSyncDelayInfo.has_value() ? 0x0004 : 0x0) |
-           (m_emlCapabilities.has_value() ? 0x0008 : 0x0) |
-           (m_mldCapabilities.has_value() ? 0x0010 : 0x0);
-}
-
-uint8_t
-CommonInfoBasicMle::GetSize() const
-{
-    uint8_t ret = 7; // Common Info Length (1) + MLD MAC Address (6)
-    ret += (m_linkIdInfo.has_value() ? 1 : 0);
-    ret += (m_bssParamsChangeCount.has_value() ? 1 : 0);
-    ret += (m_mediumSyncDelayInfo.has_value() ? 2 : 0);
-    ret += (m_emlCapabilities.has_value() ? 2 : 0);
-    ret += (m_mldCapabilities.has_value() ? 2 : 0);
-    return ret;
-}
-
-void
-CommonInfoBasicMle::Serialize(Buffer::Iterator& start) const
-{
-    start.WriteU8(GetSize()); // Common Info Length
-    WriteTo(start, m_mldMacAddress);
-    if (m_linkIdInfo.has_value())
-    {
-        start.WriteU8(*m_linkIdInfo & 0x0f);
-    }
-    if (m_bssParamsChangeCount.has_value())
-    {
-        start.WriteU8(*m_bssParamsChangeCount);
-    }
-    if (m_mediumSyncDelayInfo.has_value())
-    {
-        start.WriteU8(m_mediumSyncDelayInfo->mediumSyncDuration);
-        uint8_t val = m_mediumSyncDelayInfo->mediumSyncOfdmEdThreshold |
-                      (m_mediumSyncDelayInfo->mediumSyncMaxNTxops << 4);
-        start.WriteU8(val);
-    }
-    if (m_emlCapabilities.has_value())
-    {
-        uint16_t val =
-            m_emlCapabilities->emlsrSupport | (m_emlCapabilities->emlsrPaddingDelay << 1) |
-            (m_emlCapabilities->emlsrTransitionDelay << 4) |
-            (m_emlCapabilities->emlmrSupport << 7) | (m_emlCapabilities->emlmrDelay << 8) |
-            (m_emlCapabilities->transitionTimeout << 11);
-        start.WriteHtolsbU16(val);
-    }
-    if (m_mldCapabilities.has_value())
-    {
-        uint16_t val =
-            m_mldCapabilities->maxNSimultaneousLinks | (m_mldCapabilities->srsSupport << 4) |
-            (m_mldCapabilities->tidToLinkMappingSupport << 5) |
-            (m_mldCapabilities->freqSepForStrApMld << 7) | (m_mldCapabilities->aarSupport << 12);
-        start.WriteHtolsbU16(val);
-    }
-}
+NS_LOG_COMPONENT_DEFINE("MultiLinkElement");
 
-uint8_t
-CommonInfoBasicMle::Deserialize(Buffer::Iterator start, uint16_t presence)
-{
-    Buffer::Iterator i = start;
-
-    uint8_t length = i.ReadU8();
-    ReadFrom(i, m_mldMacAddress);
-    uint8_t count = 7;
-
-    if ((presence & 0x0001) != 0)
-    {
-        m_linkIdInfo = i.ReadU8() & 0x0f;
-        count++;
-    }
-    if ((presence & 0x0002) != 0)
-    {
-        m_bssParamsChangeCount = i.ReadU8();
-        count++;
-    }
-    if ((presence & 0x0004) != 0)
-    {
-        m_mediumSyncDelayInfo = MediumSyncDelayInfo();
-        m_mediumSyncDelayInfo->mediumSyncDuration = i.ReadU8();
-        uint8_t val = i.ReadU8();
-        m_mediumSyncDelayInfo->mediumSyncOfdmEdThreshold = val & 0x0f;
-        m_mediumSyncDelayInfo->mediumSyncMaxNTxops = (val >> 4) & 0x0f;
-        count += 2;
-    }
-    if ((presence & 0x0008) != 0)
-    {
-        m_emlCapabilities = EmlCapabilities();
-        uint16_t val = i.ReadLsbtohU16();
-        m_emlCapabilities->emlsrSupport = val & 0x0001;
-        m_emlCapabilities->emlsrPaddingDelay = (val >> 1) & 0x0007;
-        m_emlCapabilities->emlsrTransitionDelay = (val >> 4) & 0x0007;
-        m_emlCapabilities->emlmrSupport = (val >> 7) & 0x0001;
-        m_emlCapabilities->emlmrDelay = (val >> 8) & 0x0007;
-        m_emlCapabilities->transitionTimeout = (val >> 11) & 0x000f;
-        count += 2;
-    }
-    if ((presence & 0x0010) != 0)
-    {
-        m_mldCapabilities = MldCapabilities();
-        uint16_t val = i.ReadLsbtohU16();
-        m_mldCapabilities->maxNSimultaneousLinks = val & 0x000f;
-        m_mldCapabilities->srsSupport = (val >> 4) & 0x0001;
-        m_mldCapabilities->tidToLinkMappingSupport = (val >> 5) & 0x0003;
-        m_mldCapabilities->freqSepForStrApMld = (val >> 7) & 0x001f;
-        m_mldCapabilities->aarSupport = (val >> 12) & 0x0001;
-        count += 2;
-    }
-
-    NS_ABORT_MSG_IF(count != length,
-                    "Common Info Length (" << +length
-                                           << ") differs "
-                                              "from actual number of bytes read ("
-                                           << +count << ")");
-    return count;
-}
-
-uint8_t
-CommonInfoBasicMle::EncodeEmlsrPaddingDelay(Time delay)
-{
-    auto delayUs = delay.GetMicroSeconds();
-
-    if (delayUs == 0)
-    {
-        return 0;
-    }
-
-    for (uint8_t i = 1; i <= 4; i++)
-    {
-        if (1 << (i + 4) == delayUs)
-        {
-            return i;
-        }
-    }
-
-    NS_ABORT_MSG("Value not allowed (" << delay.As(Time::US) << ")");
-    return 0;
-}
-
-Time
-CommonInfoBasicMle::DecodeEmlsrPaddingDelay(uint8_t value)
-{
-    NS_ABORT_MSG_IF(value > 4, "Value not allowed (" << +value << ")");
-    if (value == 0)
-    {
-        return MicroSeconds(0);
-    }
-    return MicroSeconds(1 << (4 + value));
-}
-
-uint8_t
-CommonInfoBasicMle::EncodeEmlsrTransitionDelay(Time delay)
-{
-    auto delayUs = delay.GetMicroSeconds();
-
-    if (delayUs == 0)
-    {
-        return 0;
-    }
-
-    for (uint8_t i = 1; i <= 5; i++)
-    {
-        if (1 << (i + 3) == delayUs)
-        {
-            return i;
-        }
-    }
-
-    NS_ABORT_MSG("Value not allowed (" << delay.As(Time::US) << ")");
-    return 0;
-}
-
-Time
-CommonInfoBasicMle::DecodeEmlsrTransitionDelay(uint8_t value)
-{
-    NS_ABORT_MSG_IF(value > 5, "Value not allowed (" << +value << ")");
-    if (value == 0)
-    {
-        return MicroSeconds(0);
-    }
-    return MicroSeconds(1 << (3 + value));
-}
-
-void
-CommonInfoBasicMle::SetMediumSyncDelayTimer(Time delay)
-{
-    int64_t delayUs = delay.GetMicroSeconds();
-    NS_ABORT_MSG_IF(delayUs % 32 != 0, "Delay must be a multiple of 32 microseconds");
-    delayUs /= 32;
-
-    if (!m_mediumSyncDelayInfo.has_value())
-    {
-        m_mediumSyncDelayInfo = CommonInfoBasicMle::MediumSyncDelayInfo{};
-    }
-    m_mediumSyncDelayInfo->mediumSyncDuration = (delayUs & 0xff);
-}
-
-Time
-CommonInfoBasicMle::GetMediumSyncDelayTimer() const
-{
-    NS_ASSERT(m_mediumSyncDelayInfo);
-    return MicroSeconds(m_mediumSyncDelayInfo->mediumSyncDuration * 32);
-}
-
-void
-CommonInfoBasicMle::SetMediumSyncOfdmEdThreshold(int8_t threshold)
-{
-    NS_ABORT_MSG_IF(threshold < -72 || threshold > -62, "Threshold may range from -72 to -62 dBm");
-    uint8_t value = 72 + threshold;
-
-    if (!m_mediumSyncDelayInfo.has_value())
-    {
-        m_mediumSyncDelayInfo = CommonInfoBasicMle::MediumSyncDelayInfo{};
-    }
-    m_mediumSyncDelayInfo->mediumSyncOfdmEdThreshold = value;
-}
-
-int8_t
-CommonInfoBasicMle::GetMediumSyncOfdmEdThreshold() const
-{
-    NS_ASSERT(m_mediumSyncDelayInfo);
-    return (m_mediumSyncDelayInfo->mediumSyncOfdmEdThreshold) - 72;
-}
-
-void
-CommonInfoBasicMle::SetMediumSyncMaxNTxops(uint8_t nTxops)
-{
-    NS_ASSERT_MSG(nTxops < 16, "Value " << +nTxops << "cannot be encoded in 4 bits");
-
-    if (!m_mediumSyncDelayInfo.has_value())
-    {
-        m_mediumSyncDelayInfo = CommonInfoBasicMle::MediumSyncDelayInfo{};
-    }
-
-    if (nTxops == 0)
-    {
-        // no limit on max number of TXOPs
-        m_mediumSyncDelayInfo->mediumSyncMaxNTxops = 15;
-        return;
-    }
-
-    m_mediumSyncDelayInfo->mediumSyncMaxNTxops = --nTxops;
-}
-
-std::optional<uint8_t>
-CommonInfoBasicMle::GetMediumSyncMaxNTxops() const
+namespace ns3
 {
-    NS_ASSERT(m_mediumSyncDelayInfo);
-    uint8_t nTxops = m_mediumSyncDelayInfo->mediumSyncMaxNTxops;
-    if (nTxops == 15)
-    {
-        return std::nullopt;
-    }
-    return nTxops + 1;
-}
 
-/**
- * MultiLinkElement
- */
 MultiLinkElement::MultiLinkElement(ContainingFrame frame)
     : m_containingFrame(frame),
       m_commonInfo(std::in_place_type<std::monostate>) // initialize as UNSET
@@ -326,6 +61,9 @@
     case BASIC_VARIANT:
         m_commonInfo = CommonInfoBasicMle();
         break;
+    case PROBE_REQUEST_VARIANT:
+        m_commonInfo = CommonInfoProbeReqMle();
+        break;
     default:
         NS_ABORT_MSG("Unsupported variant: " << +variant);
     }
@@ -493,6 +231,39 @@
     return MicroSeconds(1 << (6 + emlCapabilities->transitionTimeout));
 }
 
+void
+MultiLinkElement::SetApMldId(uint8_t id)
+{
+    const auto variant = GetVariant();
+    switch (variant)
+    {
+    case BASIC_VARIANT:
+        std::get<CommonInfoBasicMle>(m_commonInfo).m_apMldId = id;
+        return;
+    case PROBE_REQUEST_VARIANT:
+        std::get<CommonInfoProbeReqMle>(m_commonInfo).m_apMldId = id;
+        return;
+    default:
+        NS_ABORT_MSG("AP MLD ID field not present in input variant " << variant);
+    }
+}
+
+std::optional<uint8_t>
+MultiLinkElement::GetApMldId() const
+{
+    const auto variant = GetVariant();
+    switch (variant)
+    {
+    case BASIC_VARIANT:
+        return std::get<CommonInfoBasicMle>(m_commonInfo).m_apMldId;
+    case PROBE_REQUEST_VARIANT:
+        return std::get<CommonInfoProbeReqMle>(m_commonInfo).m_apMldId;
+    default:
+        NS_LOG_DEBUG("AP MLD ID field not present in input variant");
+    }
+    return std::nullopt;
+}
+
 MultiLinkElement::PerStaProfileSubelement::PerStaProfileSubelement(Variant variant)
     : m_variant(variant),
       m_staControl(0)
@@ -503,7 +274,8 @@
     const PerStaProfileSubelement& perStaProfile)
     : m_variant(perStaProfile.m_variant),
       m_staControl(perStaProfile.m_staControl),
-      m_staMacAddress(perStaProfile.m_staMacAddress)
+      m_staMacAddress(perStaProfile.m_staMacAddress),
+      m_bssParamsChgCnt(perStaProfile.m_bssParamsChgCnt)
 {
     // deep copy of the STA Profile field
     auto staProfileCopy = [&](auto&& frame) {
@@ -533,6 +305,7 @@
     m_variant = perStaProfile.m_variant;
     m_staControl = perStaProfile.m_staControl;
     m_staMacAddress = perStaProfile.m_staMacAddress;
+    m_bssParamsChgCnt = perStaProfile.m_bssParamsChgCnt;
 
     // deep copy of the STA Profile field
     auto staProfileCopy = [&](auto&& frame) {
@@ -599,6 +372,29 @@
 }
 
 void
+MultiLinkElement::PerStaProfileSubelement::SetBssParamsChgCnt(uint8_t count)
+{
+    NS_ABORT_MSG_IF(m_variant != BASIC_VARIANT,
+                    "Expected Basic Variant, variant:" << +static_cast<uint8_t>(m_variant));
+    m_bssParamsChgCnt = count;
+    m_staControl |= 0x0800;
+}
+
+bool
+MultiLinkElement::PerStaProfileSubelement::HasBssParamsChgCnt() const
+{
+    return (m_staControl & 0x0800) != 0;
+}
+
+uint8_t
+MultiLinkElement::PerStaProfileSubelement::GetBssParamsChgCnt() const
+{
+    NS_ASSERT_MSG(m_bssParamsChgCnt.has_value(), "No value set for m_bssParamsChgCnt");
+    NS_ASSERT_MSG(HasBssParamsChgCnt(), "BSS Parameters Change count bit not set");
+    return m_bssParamsChgCnt.value();
+}
+
+void
 MultiLinkElement::PerStaProfileSubelement::SetAssocRequest(
     const std::variant<MgtAssocRequestHeader, MgtReassocRequestHeader>& assoc)
 {
@@ -669,15 +465,49 @@
     return *std::get<std::unique_ptr<MgtAssocResponseHeader>>(m_staProfile);
 }
 
+void
+MultiLinkElement::PerStaProfileSubelement::SetProbeResponse(const MgtProbeResponseHeader& probeResp)
+{
+    m_staProfile = std::make_unique<MgtProbeResponseHeader>(probeResp);
+}
+
+void
+MultiLinkElement::PerStaProfileSubelement::SetProbeResponse(MgtProbeResponseHeader&& probeResp)
+{
+    m_staProfile = std::make_unique<MgtProbeResponseHeader>(std::move(probeResp));
+}
+
+bool
+MultiLinkElement::PerStaProfileSubelement::HasProbeResponse() const
+{
+    return std::holds_alternative<std::unique_ptr<MgtProbeResponseHeader>>(m_staProfile);
+}
+
+MgtProbeResponseHeader&
+MultiLinkElement::PerStaProfileSubelement::GetProbeResponse() const
+{
+    NS_ABORT_IF(!HasProbeResponse());
+    return *std::get<std::unique_ptr<MgtProbeResponseHeader>>(m_staProfile);
+}
+
 uint8_t
 MultiLinkElement::PerStaProfileSubelement::GetStaInfoLength() const
 {
+    if (m_variant == PROBE_REQUEST_VARIANT)
+    {
+        return 0; // IEEE 802.11be 6.0 Figure 9-1072s
+    }
+
     uint8_t ret = 1; // STA Info Length
 
     if (HasStaMacAddress())
     {
         ret += 6;
     }
+    if (HasBssParamsChgCnt())
+    {
+        ret += 1;
+    }
     // TODO add other subfields of the STA Info field
     return ret;
 }
@@ -721,6 +551,13 @@
 void
 MultiLinkElement::PerStaProfileSubelement::SerializeInformationField(Buffer::Iterator start) const
 {
+    if (m_variant == PROBE_REQUEST_VARIANT)
+    {
+        NS_ASSERT_MSG(IsCompleteProfileSet(), "Encoding of STA Profile not supported");
+        start.WriteHtolsbU16(m_staControl);
+        return;
+    }
+
     start.WriteHtolsbU16(m_staControl);
     start.WriteU8(GetStaInfoLength());
 
@@ -728,6 +565,10 @@
     {
         WriteTo(start, m_staMacAddress);
     }
+    if (HasBssParamsChgCnt())
+    {
+        start.WriteU8(GetBssParamsChgCnt());
+    }
     // TODO add other subfields of the STA Info field
     auto staProfileSerialize = [&](auto&& frame) {
         using T = std::decay_t<decltype(frame)>;
@@ -754,6 +595,11 @@
 MultiLinkElement::PerStaProfileSubelement::DeserializeInformationField(Buffer::Iterator start,
                                                                        uint16_t length)
 {
+    if (m_variant == PROBE_REQUEST_VARIANT)
+    {
+        return DeserProbeReqMlePerSta(start, length);
+    }
+
     Buffer::Iterator i = start;
 
     m_staControl = i.ReadLsbtohU16();
@@ -763,6 +609,10 @@
     {
         ReadFrom(i, m_staMacAddress);
     }
+    if (HasBssParamsChgCnt())
+    {
+        m_bssParamsChgCnt = i.ReadU8();
+    }
 
     // TODO add other subfields of the STA Info field
     uint16_t count = i.GetDistanceFrom(start);
@@ -790,6 +640,42 @@
     return count;
 }
 
+uint16_t
+MultiLinkElement::PerStaProfileSubelement::DeserProbeReqMlePerSta(ns3::Buffer::Iterator start,
+                                                                  uint16_t length)
+{
+    NS_ASSERT_MSG(m_variant == PROBE_REQUEST_VARIANT,
+                  "Invalid Multi-link Element variant = " << static_cast<uint8_t>(m_variant));
+    Buffer::Iterator i = start;
+    uint16_t count = 0;
+
+    m_staControl = i.ReadLsbtohU16();
+    count += 2;
+
+    NS_ASSERT_MSG(count <= length,
+                  "Incorrect decoded size count =" << count << ", length=" << length);
+    if (count == length)
+    {
+        return count;
+    }
+
+    // TODO: Support decoding of Partial Per-STA Profile
+    // IEEE 802.11be D5.0 9.4.2.312.3 Probe Request Multi-Link element
+    // If the Complete Profile Requested subfield is set to 0 and the STA Profile field
+    // is present in a Per-STA Profile subelement,
+    // the STA Profile field includes exactly one of the following:
+    // - one Request element (see 9.4.2.9 (Request element)), or
+    // — one Extended Request element (see 9.4.2.10 (Extended Request element)), or
+    // — one Request element and one Extended Request element
+    NS_LOG_DEBUG("Decoding of STA Profile in Per-STA Profile subelement not supported");
+    while (count < length)
+    {
+        i.ReadU8();
+        count++;
+    }
+    return count;
+}
+
 void
 MultiLinkElement::AddPerStaProfileSubelement()
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/eht/multi-link-element.h ns-3.44/src/wifi/model/eht/multi-link-element.h
--- ns-3.43/src/wifi/model/eht/multi-link-element.h	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/eht/multi-link-element.h	2025-03-09 16:55:49.787372600 -0700
@@ -9,6 +9,9 @@
 #ifndef MULTI_LINK_ELEMENT_H
 #define MULTI_LINK_ELEMENT_H
 
+#include "common-info-basic-mle.h"
+#include "common-info-probe-req-mle.h"
+
 #include "ns3/nstime.h"
 #include "ns3/wifi-information-element.h"
 #include "ns3/wifi-mac-header.h"
@@ -23,178 +26,26 @@
 class MgtAssocRequestHeader;
 class MgtReassocRequestHeader;
 class MgtAssocResponseHeader;
+class MgtProbeResponseHeader;
 
 /// variant holding a reference to a (Re)Association Request
 using AssocReqRefVariant = std::variant<std::reference_wrapper<MgtAssocRequestHeader>,
                                         std::reference_wrapper<MgtReassocRequestHeader>>;
 
 /**
- * Common Info field of the Basic Multi-Link element.
- * See Sec. 9.4.2.312.2.2 of 802.11be D1.5
- */
-struct CommonInfoBasicMle
-{
-    /**
-     * Medium Synchronization Delay Information subfield
-     */
-    struct MediumSyncDelayInfo
-    {
-        uint8_t mediumSyncDuration;            //!< Medium Synchronization Duration
-        uint8_t mediumSyncOfdmEdThreshold : 4; //!< Medium Synchronization OFDM ED Threshold
-        uint8_t mediumSyncMaxNTxops : 4;       //!< Medium Synchronization MAximum Number of TXOPs
-    };
-
-    /**
-     * EML Capabilities subfield
-     */
-    struct EmlCapabilities
-    {
-        uint8_t emlsrSupport : 1;         //!< EMLSR Support
-        uint8_t emlsrPaddingDelay : 3;    //!< EMLSR Padding Delay
-        uint8_t emlsrTransitionDelay : 3; //!< EMLSR Transition Delay
-        uint8_t emlmrSupport : 1;         //!< EMLMR Support
-        uint8_t emlmrDelay : 3;           //!< EMLMR Delay
-        uint8_t transitionTimeout : 4;    //!< Transition Timeout
-    };
-
-    /**
-     * MLD Capabilities subfield
-     */
-    struct MldCapabilities
-    {
-        uint8_t maxNSimultaneousLinks : 4;   //!< Max number of simultaneous links
-        uint8_t srsSupport : 1;              //!< SRS Support
-        uint8_t tidToLinkMappingSupport : 2; //!< TID-To-Link Mapping Negotiation Supported
-        uint8_t freqSepForStrApMld : 5; //!< Frequency Separation For STR/AP MLD Type Indication
-        uint8_t aarSupport : 1;         //!< AAR Support
-    };
-
-    /**
-     * Subfields
-     */
-    Mac48Address m_mldMacAddress;                  //!< MLD MAC Address
-    std::optional<uint8_t> m_linkIdInfo;           //!< Link ID Info
-    std::optional<uint8_t> m_bssParamsChangeCount; //!< BSS Parameters Change Count
-    std::optional<MediumSyncDelayInfo>
-        m_mediumSyncDelayInfo;                        //!< Medium Synchronization Delay Information
-    std::optional<EmlCapabilities> m_emlCapabilities; //!< EML Capabilities
-    std::optional<MldCapabilities> m_mldCapabilities; //!< MLD Capabilities
-
-    /**
-     * Get the Presence Bitmap subfield of the Common Info field
-     *
-     * \return the Presence Bitmap subfield of the Common Info field
-     */
-    uint16_t GetPresenceBitmap() const;
-    /**
-     * Get the size of the serialized Common Info field
-     *
-     * \return the size of the serialized Common Info field
-     */
-    uint8_t GetSize() const;
-    /**
-     * Serialize the Common Info field
-     *
-     * \param start iterator pointing to where the Common Info field should be written to
-     */
-    void Serialize(Buffer::Iterator& start) const;
-    /**
-     * Deserialize the Common Info field
-     *
-     * \param start iterator pointing to where the Common Info field should be read from
-     * \param presence the value of the Presence Bitmap field indicating which subfields
-     *                 are present in the Common Info field
-     * \return the number of bytes read
-     */
-    uint8_t Deserialize(Buffer::Iterator start, uint16_t presence);
-
-    /**
-     * \param delay the EMLSR Padding delay
-     * \return the encoded value for the EMLSR Padding Delay subfield
-     */
-    static uint8_t EncodeEmlsrPaddingDelay(Time delay);
-    /**
-     * \param value the value for the EMLSR Padding Delay subfield
-     * \return the corresponding EMLSR Padding delay
-     */
-    static Time DecodeEmlsrPaddingDelay(uint8_t value);
-
-    /**
-     * \param delay the EMLSR Transition delay
-     * \return the encoded value for the EMLSR Transition Delay subfield
-     */
-    static uint8_t EncodeEmlsrTransitionDelay(Time delay);
-    /**
-     * \param value the value for the EMLSR Transition Delay subfield
-     * \return the corresponding EMLSR Transition delay
-     */
-    static Time DecodeEmlsrTransitionDelay(uint8_t value);
-
-    /**
-     * Set the Medium Synchronization Duration subfield of the Medium Synchronization
-     * Delay Information in the Common Info field.
-     *
-     * \param delay the timer duration (must be a multiple of 32 microseconds)
-     */
-    void SetMediumSyncDelayTimer(Time delay);
-    /**
-     * Set the Medium Synchronization OFDM ED Threshold subfield of the Medium Synchronization
-     * Delay Information in the Common Info field.
-     *
-     * \param threshold the threshold in dBm (ranges from -72 to -62 dBm)
-     */
-    void SetMediumSyncOfdmEdThreshold(int8_t threshold);
-    /**
-     * Set the Medium Synchronization Maximum Number of TXOPs subfield of the Medium Synchronization
-     * Delay Information in the Common Info field. A value of zero indicates no limit on the
-     * maximum number of TXOPs.
-     *
-     * \param nTxops the maximum number of TXOPs a non-AP STA is allowed to attempt to
-     *               initiate while the MediumSyncDelay timer is running at a non-AP STA
-     */
-    void SetMediumSyncMaxNTxops(uint8_t nTxops);
-    /**
-     * Get the Medium Synchronization Duration subfield of the Medium Synchronization Delay
-     * Information in the Common Info field. Make sure that the Medium Synchronization Delay
-     * Information subfield is present.
-     *
-     * \return the timer duration
-     */
-    Time GetMediumSyncDelayTimer() const;
-    /**
-     * Get the Medium Synchronization OFDM ED Threshold in dBm. Make sure that the Medium
-     * Synchronization Delay Information subfield is present.
-     *
-     * \return the threshold in dBm
-     */
-    int8_t GetMediumSyncOfdmEdThreshold() const;
-    /**
-     * Get the maximum number of TXOPs a non-AP STA is allowed to attempt to initiate
-     * while the MediumSyncDelay timer is running at a non-AP STA. If no value is returned,
-     * no limit is imposed on the number of TXOPs. Make sure that the Medium Synchronization
-     * Delay Information subfield is present.
-     *
-     * \return the number of TXOPs
-     */
-    std::optional<uint8_t> GetMediumSyncMaxNTxops() const;
-};
-
-/**
- * \brief The Multi-Link element
- * \ingroup wifi
+ * @brief The Multi-Link element
+ * @ingroup wifi
  *
- * The 802.11be Multi-Link element (see Sec.9.4.2.312 of 802.11be D1.5)
+ * The 802.11be Multi-Link element (see Sec.9.4.2.312 of 802.11be D5.0)
  *
  * TODO:
- * - Add setters/getters for EML Capabilities and MLD Capabilities subfields of
- *   the Common Info field of the Basic variant of a Multi-Link Element.
- * - Add support for variants other than the Basic one.
+ * - Add support for variants other than the Basic and Probe Request.
  */
 class MultiLinkElement : public WifiInformationElement
 {
   public:
     /**
-     * \ingroup wifi
+     * @ingroup wifi
      * Multi-Link element variants
      *
      * Note that Multi-Link element variants can be added to this enum only when
@@ -205,7 +56,7 @@
     enum Variant : uint8_t
     {
         BASIC_VARIANT = 0,
-        // PROBE_REQUEST_VARIANT,
+        PROBE_REQUEST_VARIANT,
         // RECONFIGURATION_VARIANT,
         // TDLS_VARIANT,
         // PRIORITY_ACCESS_VARIANT,
@@ -213,7 +64,7 @@
     };
 
     /**
-     * \ingroup wifi
+     * @ingroup wifi
      * SubElement IDs
      */
     enum SubElementId : uint8_t
@@ -225,19 +76,20 @@
     using ContainingFrame = std::variant<std::monostate,
                                          std::reference_wrapper<const MgtAssocRequestHeader>,
                                          std::reference_wrapper<const MgtReassocRequestHeader>,
-                                         std::reference_wrapper<const MgtAssocResponseHeader>>;
+                                         std::reference_wrapper<const MgtAssocResponseHeader>,
+                                         std::reference_wrapper<const MgtProbeResponseHeader>>;
 
     /**
      * Construct a Multi-Link Element with no variant set.
      *
-     * \param frame the management frame containing this Multi-Link Element
+     * @param frame the management frame containing this Multi-Link Element
      */
     MultiLinkElement(ContainingFrame frame = {});
     /**
      * Constructor
      *
-     * \param variant the Multi-Link element variant (cannot be UNSET)
-     * \param frame the management frame containing this Multi-Link Element
+     * @param variant the Multi-Link element variant (cannot be UNSET)
+     * @param frame the management frame containing this Multi-Link Element
      */
     MultiLinkElement(Variant variant, ContainingFrame frame = {});
 
@@ -250,21 +102,21 @@
     /**
      * Get the Multi-Link element variant
      *
-     * \return the Multi-Link element variant
+     * @return the Multi-Link element variant
      */
     Variant GetVariant() const;
 
-    /// \return a reference to the Common Info field (the MLE variant must be Basic)
+    /// @return a reference to the Common Info field (the MLE variant must be Basic)
     CommonInfoBasicMle& GetCommonInfoBasic();
 
-    /// \return a const reference to the Common Info field (the MLE variant must be Basic)
+    /// @return a const reference to the Common Info field (the MLE variant must be Basic)
     const CommonInfoBasicMle& GetCommonInfoBasic() const;
 
     /**
      * Set the MLD MAC Address subfield in the Common Info field. Make sure that
      * this is a Basic Multi-Link Element.
      *
-     * \param address the MLD MAC address
+     * @param address the MLD MAC address
      */
     void SetMldMacAddress(Mac48Address address);
 
@@ -272,7 +124,7 @@
      * Return the MLD MAC Address subfield in the Common Info field. Make sure that
      * this is a Basic Multi-Link Element.
      *
-     * \return the MLD MAC Address subfield in the Common Info field.
+     * @return the MLD MAC Address subfield in the Common Info field.
      */
     Mac48Address GetMldMacAddress() const;
 
@@ -280,14 +132,14 @@
      * Set the Link ID Info subfield in the Common Info field. Make sure that
      * this is a Basic Multi-Link Element.
      *
-     * \param linkIdInfo the link ID information
+     * @param linkIdInfo the link ID information
      */
     void SetLinkIdInfo(uint8_t linkIdInfo);
     /**
      * Return true if the Link ID Info subfield in the Common Info field is present
      * and false otherwise. Make sure that this is a Basic Multi-Link Element.
      *
-     * \return true if the Link ID Info subfield in the Common Info field is present
+     * @return true if the Link ID Info subfield in the Common Info field is present
      *         and false otherwise
      */
     bool HasLinkIdInfo() const;
@@ -295,7 +147,7 @@
      * Return the Link ID Info subfield in the Common Info field. Make sure that
      * this is a Basic Multi-Link Element and the Link ID Info subfield is present.
      *
-     * \return the Link ID Info subfield in the Common Info field
+     * @return the Link ID Info subfield in the Common Info field
      */
     uint8_t GetLinkIdInfo() const;
 
@@ -303,14 +155,14 @@
      * Set the BSS Parameters Change Count subfield in the Common Info field. Make sure that
      * this is a Basic Multi-Link Element.
      *
-     * \param count the BSS Parameters Change Count
+     * @param count the BSS Parameters Change Count
      */
     void SetBssParamsChangeCount(uint8_t count);
     /**
      * Return true if the BSS Parameters Change Count subfield in the Common Info field is present
      * and false otherwise. Make sure that this is a Basic Multi-Link Element.
      *
-     * \return true if the BSS Parameters Change Count subfield in the Common Info field is present
+     * @return true if the BSS Parameters Change Count subfield in the Common Info field is present
      *         and false otherwise
      */
     bool HasBssParamsChangeCount() const;
@@ -318,7 +170,7 @@
      * Return the BSS Parameters Change Count subfield in the Common Info field. Make sure that
      * this is a Basic Multi-Link Element and the BSS Parameters Change Count subfield is present.
      *
-     * \return the BSS Parameters Change Count subfield in the Common Info field
+     * @return the BSS Parameters Change Count subfield in the Common Info field
      */
     uint8_t GetBssParamsChangeCount() const;
 
@@ -327,35 +179,35 @@
      * to 1 if EMLSR mode is supported and set it to 0 otherwise. Make sure that this is a Basic
      * Multi-Link Element.
      *
-     * \param supported whether EMLSR mode is supported
+     * @param supported whether EMLSR mode is supported
      */
     void SetEmlsrSupported(bool supported);
     /**
      * Set the EMLSR Padding Delay subfield of the EML Capabilities subfield in the
      * Common Info field. Make sure that this is a Basic Multi-Link Element.
      *
-     * \param delay the EMLSR Padding delay (0us, 32us, 64us, 128us or 256us)
+     * @param delay the EMLSR Padding delay (0us, 32us, 64us, 128us or 256us)
      */
     void SetEmlsrPaddingDelay(Time delay);
     /**
      * Set the EMLSR Transition Delay subfield of the EML Capabilities subfield in the
      * Common Info field. Make sure that this is a Basic Multi-Link Element.
      *
-     * \param delay the EMLSR Transition delay (0us, 16us, 32us, 64us, 128us or 256us)
+     * @param delay the EMLSR Transition delay (0us, 16us, 32us, 64us, 128us or 256us)
      */
     void SetEmlsrTransitionDelay(Time delay);
     /**
      * Set the Transition Timeout subfield of the EML Capabilities subfield in the
      * Common Info field. Make sure that this is a Basic Multi-Link Element.
      *
-     * \param timeout the Transition Timeout (0us or 2^n us, with n=7..16)
+     * @param timeout the Transition Timeout (0us or 2^n us, with n=7..16)
      */
     void SetTransitionTimeout(Time timeout);
     /**
      * Return true if the EML Capabilities subfield in the Common Info field is present
      * and false otherwise. Make sure that this is a Basic Multi-Link Element.
      *
-     * \return whether the EML Capabilities subfield in the Common Info field is present
+     * @return whether the EML Capabilities subfield in the Common Info field is present
      */
     bool HasEmlCapabilities() const;
     /**
@@ -363,7 +215,7 @@
      * Common Info field is set to 1 and false otherwise. Make sure that this is a Basic
      * Multi-Link Element and the EML Capabilities subfield is present.
      *
-     * \return whether the EMLSR Support subfield is set to 1
+     * @return whether the EMLSR Support subfield is set to 1
      */
     bool IsEmlsrSupported() const;
     /**
@@ -371,7 +223,7 @@
      * Common Info field. Make sure that this is a Basic Multi-Link Element and the
      * EML Capabilities subfield is present.
      *
-     * \return the EMLSR Padding Delay
+     * @return the EMLSR Padding Delay
      */
     Time GetEmlsrPaddingDelay() const;
     /**
@@ -379,7 +231,7 @@
      * Common Info field. Make sure that this is a Basic Multi-Link Element and the
      * EML Capabilities subfield is present.
      *
-     * \return the EMLSR Transition Delay
+     * @return the EMLSR Transition Delay
      */
     Time GetEmlsrTransitionDelay() const;
     /**
@@ -387,14 +239,29 @@
      * Common Info field. Make sure that this is a Basic Multi-Link Element and the
      * EML Capabilities subfield is present.
      *
-     * \return the Transition Timeout
+     * @return the Transition Timeout
      */
     Time GetTransitionTimeout() const;
 
+    /**
+     * Set the AP MLD ID subfield of Common Info field. Valid variants are Basic and Probe Request.
+     *
+     * @param id AP MLD ID
+     */
+    void SetApMldId(uint8_t id);
+
+    /**
+     * Get the AP MLD ID subfield of Common Info field (if present). Valid variants are Basic and
+     * Probe Request.
+     *
+     * @return the AP MLD ID
+     */
+    std::optional<uint8_t> GetApMldId() const;
+
     mutable ContainingFrame m_containingFrame; //!< reference to the mgt frame containing this MLE
 
     /**
-     * \ingroup wifi
+     * @ingroup wifi
      * Per-STA Profile Subelement of Multi-Link element.
      * See Sec. 9.4.2.312.2.3 of 802.11be D1.5
      *
@@ -411,28 +278,30 @@
         /**
          * Constructor
          *
-         * \param variant the Multi-Link element variant
+         * @param variant the Multi-Link element variant
          */
         PerStaProfileSubelement(Variant variant);
 
         /**
          * Copy constructor performing a deep copy of the object
          *
-         * \param perStaProfile the object to copy
+         * @param perStaProfile the object to copy
          */
         PerStaProfileSubelement(const PerStaProfileSubelement& perStaProfile);
+
         /**
          * Copy assignment operator performing a deep copy of the object
          *
-         * \param perStaProfile the object to copy-assign
-         * \return a reference to this object
+         * @param perStaProfile the object to copy-assign
+         * @return a reference to this object
          */
         PerStaProfileSubelement& operator=(const PerStaProfileSubelement& perStaProfile);
+
         /**
          * Use default move assignment operator
          *
-         * \param perStaProfile the object to move-assign
-         * \return a reference to this object
+         * @param perStaProfile the object to move-assign
+         * @return a reference to this object
          */
         PerStaProfileSubelement& operator=(PerStaProfileSubelement&& perStaProfile) = default;
 
@@ -441,13 +310,13 @@
         /**
          * Set the Link ID subfield in the STA Control field
          *
-         * \param linkId the Link ID value
+         * @param linkId the Link ID value
          */
         void SetLinkId(uint8_t linkId);
         /**
          * Get the Link ID subfield in the STA Control field
          *
-         * \return the Link ID subfield in the STA Control field
+         * @return the Link ID subfield in the STA Control field
          */
         uint8_t GetLinkId() const;
 
@@ -456,58 +325,75 @@
          */
         void SetCompleteProfile();
         /**
-         * \return whether the Complete Profile flag in the STA Control field is set
+         * @return whether the Complete Profile flag in the STA Control field is set
          */
         bool IsCompleteProfileSet() const;
 
         /**
          * Set the STA MAC Address subfield in the STA Info field
          *
-         * \param address the MAC address to set
+         * @param address the MAC address to set
          */
         void SetStaMacAddress(Mac48Address address);
         /**
          * Return true if the STA MAC Address subfield in the STA Info field is present
          *
-         * \return true if the STA MAC Address subfield in the STA Info field is present
+         * @return true if the STA MAC Address subfield in the STA Info field is present
          */
         bool HasStaMacAddress() const;
         /**
          * Get the STA MAC Address subfield in the STA Info field, if present
          *
-         * \return the STA MAC Address subfield in the STA Info field, if present
+         * @return the STA MAC Address subfield in the STA Info field, if present
          */
         Mac48Address GetStaMacAddress() const;
 
         /**
+         * Set the BSS Parameters Change Count subfield in the STA Info field.
+         *
+         * @param count BSS Parameters Change Count
+         */
+        void SetBssParamsChgCnt(uint8_t count);
+
+        /// @return whether the BSS Parameters Change Count subfield in STA Info field is present
+        bool HasBssParamsChgCnt() const;
+
+        /**
+         * Get BSS Parameters Change Count subfield in the STA Info field.
+         *
+         * @return count value
+         */
+        uint8_t GetBssParamsChgCnt() const;
+
+        /**
          * Include the given (Re)Association Request frame body in the STA Profile field
          * of this Per-STA Profile subelement
          *
-         * \param assoc the given (Re)Association Request frame body
+         * @param assoc the given (Re)Association Request frame body
          */
         void SetAssocRequest(
             const std::variant<MgtAssocRequestHeader, MgtReassocRequestHeader>& assoc);
-        /** \copydoc SetAssocRequest */
+        /** @copydoc SetAssocRequest */
         void SetAssocRequest(std::variant<MgtAssocRequestHeader, MgtReassocRequestHeader>&& assoc);
         /**
          * Return true if an Association Request frame body is included in the
          * STA Profile field of this Per-STA Profile subelement
          *
-         * \return true if an Association Request frame body is included
+         * @return true if an Association Request frame body is included
          */
         bool HasAssocRequest() const;
         /**
          * Return true if a Reassociation Request frame body is included in the
          * STA Profile field of this Per-STA Profile subelement
          *
-         * \return true if a Reassociation Request frame body is included
+         * @return true if a Reassociation Request frame body is included
          */
         bool HasReassocRequest() const;
         /**
          * Get the (Re)Association Request frame body included in the STA Profile
          * field of this Per-STA Profile subelement
          *
-         * \return the (Re)Association Request frame body
+         * @return the (Re)Association Request frame body
          */
         AssocReqRefVariant GetAssocRequest() const;
 
@@ -515,31 +401,58 @@
          * Include the given (Re)Association Response frame body in the STA Profile field
          * of this Per-STA Profile subelement
          *
-         * \param assoc the given (Re)Association Response frame body
+         * @param assoc the given (Re)Association Response frame body
          */
         void SetAssocResponse(const MgtAssocResponseHeader& assoc);
-        /** \copydoc SetAssocResponse */
+        /** @copydoc SetAssocResponse */
         void SetAssocResponse(MgtAssocResponseHeader&& assoc);
         /**
          * Return true if a (Re)Association Response frame body is included in the
          * STA Profile field of this Per-STA Profile subelement
          *
-         * \return true if a (Re)Association Response frame body is included
+         * @return true if a (Re)Association Response frame body is included
          */
         bool HasAssocResponse() const;
         /**
          * Get the (Re)Association Response frame body included in the STA Profile
          * field of this Per-STA Profile subelement
          *
-         * \return the (Re)Association Response frame body
+         * @return the (Re)Association Response frame body
          */
         MgtAssocResponseHeader& GetAssocResponse() const;
 
         /**
+         * Include the given Probe Response frame body in the STA Profile field
+         * of this Per-STA Profile subelement
+         *
+         * @param probeResp the given Probe Response frame body
+         */
+        void SetProbeResponse(const MgtProbeResponseHeader& probeResp);
+
+        /// @copydoc SetProbeResponse
+        void SetProbeResponse(MgtProbeResponseHeader&& probeResp);
+
+        /**
+         * Return true if a Probe Response frame body is included in the
+         * STA Profile field of this Per-STA Profile subelement
+         *
+         * @return true if a Probe Response frame body is included
+         */
+        bool HasProbeResponse() const;
+
+        /**
+         * Get the Probe Response frame body included in the STA Profile
+         * field of this Per-STA Profile subelement
+         *
+         * @return the Probe Response frame body
+         */
+        MgtProbeResponseHeader& GetProbeResponse() const;
+
+        /**
          * Get the size in bytes of the serialized STA Info Length subfield of
          * the STA Info field
          *
-         * \return the size in bytes of the serialized STA Info Length subfield
+         * @return the size in bytes of the serialized STA Info Length subfield
          */
         uint8_t GetStaInfoLength() const;
 
@@ -551,13 +464,25 @@
         void SerializeInformationField(Buffer::Iterator start) const override;
         uint16_t DeserializeInformationField(Buffer::Iterator start, uint16_t length) override;
 
-        Variant m_variant;            //!< Multi-Link element variant
-        uint16_t m_staControl;        //!< STA Control field
-        Mac48Address m_staMacAddress; //!< STA MAC address
+        /**
+         * Deserialize information of Per-STA Profile Subelement in Probe Request Multi-link
+         * Element.
+         *
+         * @param start an iterator which points to where the information should be written
+         * @param length the expected number of octets to read
+         * @return the number of octets read
+         */
+        uint16_t DeserProbeReqMlePerSta(ns3::Buffer::Iterator start, uint16_t length);
+
+        Variant m_variant;                        //!< Multi-Link element variant
+        uint16_t m_staControl;                    //!< STA Control field
+        Mac48Address m_staMacAddress;             //!< STA MAC address
+        std::optional<uint8_t> m_bssParamsChgCnt; //!< BSS Params Change Count (Basic MLE)
         std::variant<std::monostate,
                      std::unique_ptr<MgtAssocRequestHeader>,
                      std::unique_ptr<MgtReassocRequestHeader>,
-                     std::unique_ptr<MgtAssocResponseHeader>>
+                     std::unique_ptr<MgtAssocResponseHeader>,
+                     std::unique_ptr<MgtProbeResponseHeader>>
             m_staProfile; /**< STA Profile field, containing the frame body of a frame of the
                                same type as the frame containing the Multi-Link Element */
     };
@@ -569,21 +494,21 @@
     /**
      * Return the number of Per-STA Profile Subelement in the Link Info field
      *
-     * \return the number of Per-STA Profile Subelement in the Link Info field
+     * @return the number of Per-STA Profile Subelement in the Link Info field
      */
     std::size_t GetNPerStaProfileSubelements() const;
     /**
      * Get a reference to the <i>i</i>-th Per-STA Profile Subelement in the Link Info field
      *
-     * \param i the index of the Per-STA Profile Subelement in the Link Info field
-     * \return a reference to the <i>i</i>-th Per-STA Profile Subelement in the Link Info field
+     * @param i the index of the Per-STA Profile Subelement in the Link Info field
+     * @return a reference to the <i>i</i>-th Per-STA Profile Subelement in the Link Info field
      */
     PerStaProfileSubelement& GetPerStaProfile(std::size_t i);
     /**
      * Get a reference to the <i>i</i>-th Per-STA Profile Subelement in the Link Info field
      *
-     * \param i the index of the Per-STA Profile Subelement in the Link Info field
-     * \return a reference to the <i>i</i>-th Per-STA Profile Subelement in the Link Info field
+     * @param i the index of the Per-STA Profile Subelement in the Link Info field
+     * @return a reference to the <i>i</i>-th Per-STA Profile Subelement in the Link Info field
      */
     const PerStaProfileSubelement& GetPerStaProfile(std::size_t i) const;
 
@@ -591,12 +516,13 @@
     /**
      * Set the variant of this Multi-Link Element
      *
-     * \param variant the variant of this Multi-Link Element
+     * @param variant the variant of this Multi-Link Element
      */
     void SetVariant(Variant variant);
 
     /// Typedef for structure holding a Common Info field
     using CommonInfo = std::variant<CommonInfoBasicMle,
+                                    CommonInfoProbeReqMle,
                                     // TODO Add other variants
                                     std::monostate /* UNSET variant*/>;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/eht/tid-to-link-mapping-element.h ns-3.44/src/wifi/model/eht/tid-to-link-mapping-element.h
--- ns-3.43/src/wifi/model/eht/tid-to-link-mapping-element.h	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/eht/tid-to-link-mapping-element.h	2025-03-09 16:55:49.787372600 -0700
@@ -31,8 +31,8 @@
 constexpr uint16_t WIFI_LINK_MAPPING_PRESENCE_IND_SIZE_B = 1;
 
 /**
- * \brief TID-to-Link Mapping Information Element
- * \ingroup wifi
+ * @brief TID-to-Link Mapping Information Element
+ * @ingroup wifi
  *
  * This class serializes and deserializes
  * the TID-to-Link Mapping element
@@ -53,20 +53,20 @@
         WifiDirection direction{DEFAULT_WIFI_TID_LINK_MAP_DIR}; ///< Direction
         bool defaultMapping{DEFAULT_WIFI_TID_LINK_MAPPING};     ///< Default link mapping
 
-        /// \return Serialized size of TID-to-Link Mapping Control in octets
+        /// @return Serialized size of TID-to-Link Mapping Control in octets
         uint16_t GetSubfieldSize() const;
 
         /**
          * Serialize the TID-to-Link Mapping Control subfield
          *
-         * \param start iterator pointing to where the subfield should be written to
+         * @param start iterator pointing to where the subfield should be written to
          */
         void Serialize(Buffer::Iterator& start) const;
         /**
          * Deserialize the TID-to-Link Mapping Control subfield
          *
-         * \param start iterator pointing to where the subfield should be read from
-         * \return the number of octets read
+         * @param start iterator pointing to where the subfield should be read from
+         * @return the number of octets read
          */
         uint16_t Deserialize(Buffer::Iterator start);
 
@@ -87,38 +87,38 @@
     /**
      * Set the Mapping Switch Time field.
      *
-     * \param mappingSwitchTime the time when the new mapping is established (rounded to a
+     * @param mappingSwitchTime the time when the new mapping is established (rounded to a
      *                          multiple of a TU)
      */
     void SetMappingSwitchTime(Time mappingSwitchTime);
 
-    /// \return the value of the Mapping Switch Time field, if present.
+    /// @return the value of the Mapping Switch Time field, if present.
     std::optional<Time> GetMappingSwitchTime() const;
 
     /**
      * Set the Expected Duration field.
      *
-     * \param expectedDuration the value for the Expected Duration field (rounded to a
+     * @param expectedDuration the value for the Expected Duration field (rounded to a
      *                         multiple of a TU)
      */
     void SetExpectedDuration(Time expectedDuration);
 
-    /// \return the value of the Expected Duration field, if present.
+    /// @return the value of the Expected Duration field, if present.
     std::optional<Time> GetExpectedDuration() const;
 
     /**
      * Set the Link Mapping field of the given TID such that the given TID is mapped
      * to the links associated with the given link IDs.
      *
-     * \param tid the given TID
-     * \param linkIds the IDs of the links which the given TID is mapped to
+     * @param tid the given TID
+     * @param linkIds the IDs of the links which the given TID is mapped to
      */
     void SetLinkMappingOfTid(uint8_t tid, std::set<uint8_t> linkIds);
     /**
      * Get the Link Mapping field of the given TID.
      *
-     * \param tid the given TID
-     * \return the IDs of the links which the given TID is mapped to
+     * @param tid the given TID
+     * @return the IDs of the links which the given TID is mapped to
      */
     std::set<uint8_t> GetLinkMappingOfTid(uint8_t tid) const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/error-rate-model.cc ns-3.44/src/wifi/model/error-rate-model.cc
--- ns-3.43/src/wifi/model/error-rate-model.cc	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/error-rate-model.cc	2025-03-09 16:55:49.787372600 -0700
@@ -62,7 +62,7 @@
     if (mode.GetModulationClass() == WIFI_MOD_CLASS_DSSS ||
         mode.GetModulationClass() == WIFI_MOD_CLASS_HR_DSSS)
     {
-        switch (mode.GetDataRate(22))
+        switch (mode.GetDataRate(MHz_u{22}))
         {
         case 1000000:
             return DsssErrorRateModel::GetDsssDbpskSuccessRate(snr, nbits);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/error-rate-model.h ns-3.44/src/wifi/model/error-rate-model.h
--- ns-3.43/src/wifi/model/error-rate-model.h	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/error-rate-model.h	2025-03-09 16:55:49.787372600 -0700
@@ -17,29 +17,29 @@
 {
 
 /**
- * \ingroup wifi
- * \brief the interface for Wifi's error models
+ * @ingroup wifi
+ * @brief the interface for Wifi's error models
  *
  */
 class ErrorRateModel : public Object
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \param txVector a specific transmission vector including WifiMode
-     * \param ber a target BER
+     * @param txVector a specific transmission vector including WifiMode
+     * @param ber a target BER
      *
-     * \return the SNR which corresponds to the requested BER
+     * @return the SNR which corresponds to the requested BER
      */
     double CalculateSnr(const WifiTxVector& txVector, double ber) const;
 
     /**
-     * \return true if the model is for AWGN channels,
+     * @return true if the model is for AWGN channels,
      *         false otherwise
      */
     virtual bool IsAwgn() const;
@@ -62,16 +62,16 @@
      * This method handles 802.11b rates by using the DSSS error rate model.
      * For all other rates, the method implemented by the subclass is called.
      *
-     * \param mode the Wi-Fi mode applicable to this chunk
-     * \param txVector TXVECTOR of the overall transmission
-     * \param snr the SNR of the chunk
-     * \param nbits the number of bits in this chunk
-     * \param numRxAntennas the number of active RX antennas (1 if not provided)
-     * \param field the PPDU field to which the chunk belongs to (assumes this is for the payload
+     * @param mode the Wi-Fi mode applicable to this chunk
+     * @param txVector TXVECTOR of the overall transmission
+     * @param snr the SNR of the chunk
+     * @param nbits the number of bits in this chunk
+     * @param numRxAntennas the number of active RX antennas (1 if not provided)
+     * @param field the PPDU field to which the chunk belongs to (assumes this is for the payload
      * part if not provided)
-     * \param staId the station ID for MU
+     * @param staId the station ID for MU
      *
-     * \return probability of successfully receiving the chunk
+     * @return probability of successfully receiving the chunk
      */
     double GetChunkSuccessRate(WifiMode mode,
                                const WifiTxVector& txVector,
@@ -86,8 +86,8 @@
      * used by this model. Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     virtual int64_t AssignStreams(int64_t stream);
 
@@ -95,15 +95,15 @@
     /**
      * A pure virtual method that must be implemented in the subclass.
      *
-     * \param mode the Wi-Fi mode applicable to this chunk
-     * \param txVector TXVECTOR of the overall transmission
-     * \param snr the SNR of the chunk
-     * \param nbits the number of bits in this chunk
-     * \param numRxAntennas the number of active RX antennas
-     * \param field the PPDU field to which the chunk belongs to
-     * \param staId the station ID for MU
+     * @param mode the Wi-Fi mode applicable to this chunk
+     * @param txVector TXVECTOR of the overall transmission
+     * @param snr the SNR of the chunk
+     * @param nbits the number of bits in this chunk
+     * @param numRxAntennas the number of active RX antennas
+     * @param field the PPDU field to which the chunk belongs to
+     * @param staId the station ID for MU
      *
-     * \return probability of successfully receiving the chunk
+     * @return probability of successfully receiving the chunk
      */
     virtual double DoGetChunkSuccessRate(WifiMode mode,
                                          const WifiTxVector& txVector,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/extended-capabilities.cc ns-3.44/src/wifi/model/extended-capabilities.cc
--- ns-3.43/src/wifi/model/extended-capabilities.cc	2024-10-09 16:41:10.116656800 -0700
+++ ns-3.44/src/wifi/model/extended-capabilities.cc	2025-03-09 16:55:49.787372600 -0700
@@ -11,67 +11,6 @@
 namespace ns3
 {
 
-ExtendedCapabilities::ExtendedCapabilities()
-    : m_20_40_bssCoexistenceManagementSupport(0),
-      m_extendedChannelSwitching(0),
-      m_psmpCapability(0),
-      m_spsmpSupport(0),
-      m_event(0),
-      m_diagnostics(0),
-      m_multicastDiagnostics(0),
-      m_locationTracking(0),
-      m_fms(0),
-      m_proxyArpService(0),
-      m_collocatedInterferenceReporting(0),
-      m_civicLocation(0),
-      m_geospatialLocation(0),
-      m_tfs(0),
-      m_wnmSleepMode(0),
-      m_timBroadcast(0),
-      m_bssTransition(0),
-      m_qosTrafficCapability(0),
-      m_acStationCount(0),
-      m_multipleBssid(0),
-      m_timingMeasurement(0),
-      m_channelUsage(0),
-      m_ssidList(0),
-      m_dms(0),
-      m_utcTsfOffset(0),
-      m_tpuBufferStaSupport(0),
-      m_tdlsPeerPsmSupport(0),
-      m_tdlsChannelSwitching(0),
-      m_interworking(0),
-      m_qosMap(0),
-      m_ebr(0),
-      m_sspnInterface(0),
-      m_msgcfCapability(0),
-      m_tdlsSupport(0),
-      m_tdlsProhibited(0),
-      m_tdlsChannelSwitchingProhibited(0),
-      m_rejectUnadmittedFrame(0),
-      m_serviceIntervalGranularity(0),
-      m_identifierLocation(0),
-      m_uapsdCoexistence(0),
-      m_wnmNotification(0),
-      m_qabCapability(0),
-      m_utf8Ssid(0),
-      m_qmfActivated(0),
-      m_qmfReconfigurationActivated(0),
-      m_robustAvStreaming(0),
-      m_advancedGcr(0),
-      m_meshGcr(0),
-      m_scs(0),
-      m_qloadReport(0),
-      m_alternateEdca(0),
-      m_unprotectedTxopNegotiation(0),
-      m_protectedTxopNegotiation(0),
-      m_protectedQloadReport(0),
-      m_tdlsWiderBandwidth(0),
-      m_operatingModeNotification(0),
-      m_maxNumberOfMsdusInAmsdu(0)
-{
-}
-
 WifiInformationElementId
 ExtendedCapabilities::ElementId() const
 {
@@ -81,7 +20,8 @@
 void
 ExtendedCapabilities::Print(std::ostream& os) const
 {
-    os << "Extended Capabilities=" << +GetExtendedCapabilitiesByte1();
+    os << "Extended Capabilities=";
+    // TODO: print useful capabilities
 }
 
 uint16_t
@@ -91,249 +31,168 @@
 }
 
 void
-ExtendedCapabilities::SetExtendedCapabilitiesByte1(uint8_t ctrl)
-{
-    m_20_40_bssCoexistenceManagementSupport = ctrl & 0x01;
-    m_extendedChannelSwitching = (ctrl >> 2) & 0x01;
-    m_psmpCapability = (ctrl >> 4) & 0x01;
-    m_spsmpSupport = (ctrl >> 6) & 0x01;
-    m_event = (ctrl >> 7) & 0x01;
-}
-
-uint8_t
-ExtendedCapabilities::GetExtendedCapabilitiesByte1() const
-{
-    uint8_t val = 0;
-    val |= m_20_40_bssCoexistenceManagementSupport & 0x01;
-    val |= (m_extendedChannelSwitching & 0x01) << 2;
-    val |= (m_psmpCapability & 0x01) << 4;
-    val |= (m_spsmpSupport & 0x01) << 6;
-    val |= (m_event & 0x01) << 7;
-    return val;
-}
-
-void
-ExtendedCapabilities::SetExtendedCapabilitiesByte2(uint8_t ctrl)
-{
-    m_diagnostics = ctrl & 0x01;
-    m_multicastDiagnostics = (ctrl >> 1) & 0x01;
-    m_locationTracking = (ctrl >> 2) & 0x01;
-    m_fms = (ctrl >> 3) & 0x01;
-    m_proxyArpService = (ctrl >> 4) & 0x01;
-    m_collocatedInterferenceReporting = (ctrl >> 5) & 0x01;
-    m_civicLocation = (ctrl >> 6) & 0x01;
-    m_geospatialLocation = (ctrl >> 7) & 0x01;
-}
-
-uint8_t
-ExtendedCapabilities::GetExtendedCapabilitiesByte2() const
-{
-    uint8_t val = 0;
-    val |= m_diagnostics & 0x01;
-    val |= (m_multicastDiagnostics & 0x01) << 1;
-    val |= (m_locationTracking & 0x01) << 2;
-    val |= (m_fms & 0x01) << 3;
-    val |= (m_proxyArpService & 0x01) << 4;
-    val |= (m_collocatedInterferenceReporting & 0x01) << 5;
-    val |= (m_civicLocation & 0x01) << 6;
-    val |= (m_geospatialLocation & 0x01) << 7;
-    return val;
-}
-
-void
-ExtendedCapabilities::SetExtendedCapabilitiesByte3(uint8_t ctrl)
-{
-    m_tfs = ctrl & 0x01;
-    m_wnmSleepMode = (ctrl >> 1) & 0x01;
-    m_timBroadcast = (ctrl >> 2) & 0x01;
-    m_bssTransition = (ctrl >> 3) & 0x01;
-    m_qosTrafficCapability = (ctrl >> 4) & 0x01;
-    m_acStationCount = (ctrl >> 5) & 0x01;
-    m_multipleBssid = (ctrl >> 6) & 0x01;
-    m_timingMeasurement = (ctrl >> 7) & 0x01;
-}
-
-uint8_t
-ExtendedCapabilities::GetExtendedCapabilitiesByte3() const
-{
-    uint8_t val = 0;
-    val |= m_tfs & 0x01;
-    val |= (m_wnmSleepMode & 0x01) << 1;
-    val |= (m_timBroadcast & 0x01) << 2;
-    val |= (m_bssTransition & 0x01) << 3;
-    val |= (m_qosTrafficCapability & 0x01) << 4;
-    val |= (m_acStationCount & 0x01) << 5;
-    val |= (m_multipleBssid & 0x01) << 6;
-    val |= (m_timingMeasurement & 0x01) << 7;
-    return val;
-}
-
-void
-ExtendedCapabilities::SetExtendedCapabilitiesByte4(uint8_t ctrl)
-{
-    m_channelUsage = ctrl & 0x01;
-    m_ssidList = (ctrl >> 1) & 0x01;
-    m_dms = (ctrl >> 2) & 0x01;
-    m_utcTsfOffset = (ctrl >> 3) & 0x01;
-    m_tpuBufferStaSupport = (ctrl >> 4) & 0x01;
-    m_tdlsPeerPsmSupport = (ctrl >> 5) & 0x01;
-    m_tdlsChannelSwitching = (ctrl >> 6) & 0x01;
-    m_interworking = (ctrl >> 7) & 0x01;
-}
-
-uint8_t
-ExtendedCapabilities::GetExtendedCapabilitiesByte4() const
-{
-    uint8_t val = 0;
-    val |= m_channelUsage & 0x01;
-    val |= (m_ssidList & 0x01) << 1;
-    val |= (m_dms & 0x01) << 2;
-    val |= (m_utcTsfOffset & 0x01) << 3;
-    val |= (m_tpuBufferStaSupport & 0x01) << 4;
-    val |= (m_tdlsPeerPsmSupport & 0x01) << 5;
-    val |= (m_tdlsChannelSwitching & 0x01) << 6;
-    val |= (m_interworking & 0x01) << 7;
-    return val;
-}
-
-void
-ExtendedCapabilities::SetExtendedCapabilitiesByte5(uint8_t ctrl)
-{
-    m_qosMap = ctrl & 0x01;
-    m_ebr = (ctrl >> 1) & 0x01;
-    m_sspnInterface = (ctrl >> 2) & 0x01;
-    m_msgcfCapability = (ctrl >> 4) & 0x01;
-    m_tdlsSupport = (ctrl >> 5) & 0x01;
-    m_tdlsProhibited = (ctrl >> 6) & 0x01;
-    m_tdlsChannelSwitchingProhibited = (ctrl >> 7) & 0x01;
-}
-
-uint8_t
-ExtendedCapabilities::GetExtendedCapabilitiesByte5() const
-{
-    uint8_t val = 0;
-    val |= m_qosMap & 0x01;
-    val |= (m_ebr & 0x01) << 1;
-    val |= (m_sspnInterface & 0x01) << 2;
-    val |= (m_msgcfCapability & 0x01) << 4;
-    val |= (m_tdlsSupport & 0x01) << 5;
-    val |= (m_tdlsProhibited & 0x01) << 6;
-    val |= (m_tdlsChannelSwitchingProhibited & 0x01) << 7;
-    return val;
-}
-
-void
-ExtendedCapabilities::SetExtendedCapabilitiesByte6(uint8_t ctrl)
-{
-    m_rejectUnadmittedFrame = ctrl & 0x01;
-    m_serviceIntervalGranularity = (ctrl >> 1) & 0x07;
-    m_identifierLocation = (ctrl >> 4) & 0x01;
-    m_uapsdCoexistence = (ctrl >> 5) & 0x01;
-    m_wnmNotification = (ctrl >> 6) & 0x01;
-    m_qabCapability = (ctrl >> 7) & 0x01;
-}
-
-uint8_t
-ExtendedCapabilities::GetExtendedCapabilitiesByte6() const
-{
-    uint8_t val = 0;
-    val |= m_rejectUnadmittedFrame & 0x01;
-    val |= (m_serviceIntervalGranularity & 0x07) << 1;
-    val |= (m_identifierLocation & 0x01) << 4;
-    val |= (m_uapsdCoexistence & 0x01) << 5;
-    val |= (m_wnmNotification & 0x01) << 6;
-    val |= (m_qabCapability & 0x01) << 7;
-    return val;
-}
-
-void
-ExtendedCapabilities::SetExtendedCapabilitiesByte7(uint8_t ctrl)
-{
-    m_utf8Ssid = ctrl & 0x01;
-    m_qmfActivated = (ctrl >> 1) & 0x01;
-    m_qmfReconfigurationActivated = (ctrl >> 2) & 0x01;
-    m_robustAvStreaming = (ctrl >> 3) & 0x01;
-    m_advancedGcr = (ctrl >> 4) & 0x01;
-    m_meshGcr = (ctrl >> 5) & 0x01;
-    m_scs = (ctrl >> 6) & 0x01;
-    m_qloadReport = (ctrl >> 7) & 0x01;
-}
-
-uint8_t
-ExtendedCapabilities::GetExtendedCapabilitiesByte7() const
-{
-    uint8_t val = 0;
-    val |= m_utf8Ssid & 0x01;
-    val |= (m_qmfActivated & 0x01) << 1;
-    val |= (m_qmfReconfigurationActivated & 0x01) << 2;
-    val |= (m_robustAvStreaming & 0x01) << 3;
-    val |= (m_advancedGcr & 0x01) << 4;
-    val |= (m_meshGcr & 0x01) << 5;
-    val |= (m_scs & 0x01) << 6;
-    val |= (m_qloadReport & 0x01) << 7;
-    return val;
-}
-
-void
-ExtendedCapabilities::SetExtendedCapabilitiesByte8(uint8_t ctrl)
-{
-    m_alternateEdca = ctrl & 0x01;
-    m_unprotectedTxopNegotiation = (ctrl >> 1) & 0x01;
-    m_protectedTxopNegotiation = (ctrl >> 2) & 0x01;
-    m_protectedQloadReport = (ctrl >> 3) & 0x01;
-    m_tdlsWiderBandwidth = (ctrl >> 4) & 0x01;
-    m_operatingModeNotification = (ctrl >> 5) & 0x01;
-    m_maxNumberOfMsdusInAmsdu = (ctrl >> 6) & 0x03;
-}
-
-uint8_t
-ExtendedCapabilities::GetExtendedCapabilitiesByte8() const
-{
-    uint8_t val = 0;
-    val |= m_alternateEdca & 0x01;
-    val |= (m_unprotectedTxopNegotiation & 0x01) << 1;
-    val |= (m_protectedTxopNegotiation & 0x01) << 2;
-    val |= (m_protectedQloadReport & 0x01) << 3;
-    val |= (m_tdlsWiderBandwidth & 0x01) << 4;
-    val |= (m_operatingModeNotification & 0x01) << 5;
-    val |= (m_maxNumberOfMsdusInAmsdu & 0x03) << 6;
-    return val;
-}
-
-void
 ExtendedCapabilities::SerializeInformationField(Buffer::Iterator start) const
 {
-    // write the corresponding value for each bit
-    start.WriteU8(GetExtendedCapabilitiesByte1());
-    start.WriteU8(GetExtendedCapabilitiesByte2());
-    start.WriteU8(GetExtendedCapabilitiesByte3());
-    start.WriteU8(GetExtendedCapabilitiesByte4());
-    start.WriteU8(GetExtendedCapabilitiesByte5());
-    start.WriteU8(GetExtendedCapabilitiesByte6());
-    start.WriteU8(GetExtendedCapabilitiesByte7());
-    start.WriteU8(GetExtendedCapabilitiesByte8());
+    uint8_t byte = 0;
+    byte |= m_20_40_bssCoexistenceManagementSupport & 0x01;
+    byte |= (m_extendedChannelSwitching & 0x01) << 2;
+    byte |= (m_psmpCapability & 0x01) << 4;
+    byte |= (m_spsmpSupport & 0x01) << 6;
+    byte |= (m_event & 0x01) << 7;
+    start.WriteU8(byte);
+
+    byte = 0;
+    byte |= m_diagnostics & 0x01;
+    byte |= (m_multicastDiagnostics & 0x01) << 1;
+    byte |= (m_locationTracking & 0x01) << 2;
+    byte |= (m_fms & 0x01) << 3;
+    byte |= (m_proxyArpService & 0x01) << 4;
+    byte |= (m_collocatedInterferenceReporting & 0x01) << 5;
+    byte |= (m_civicLocation & 0x01) << 6;
+    byte |= (m_geospatialLocation & 0x01) << 7;
+    start.WriteU8(byte);
+
+    byte = 0;
+    byte |= m_tfs & 0x01;
+    byte |= (m_wnmSleepMode & 0x01) << 1;
+    byte |= (m_timBroadcast & 0x01) << 2;
+    byte |= (m_bssTransition & 0x01) << 3;
+    byte |= (m_qosTrafficCapability & 0x01) << 4;
+    byte |= (m_acStationCount & 0x01) << 5;
+    byte |= (m_multipleBssid & 0x01) << 6;
+    byte |= (m_timingMeasurement & 0x01) << 7;
+    start.WriteU8(byte);
+
+    byte = 0;
+    byte |= m_channelUsage & 0x01;
+    byte |= (m_ssidList & 0x01) << 1;
+    byte |= (m_dms & 0x01) << 2;
+    byte |= (m_utcTsfOffset & 0x01) << 3;
+    byte |= (m_tpuBufferStaSupport & 0x01) << 4;
+    byte |= (m_tdlsPeerPsmSupport & 0x01) << 5;
+    byte |= (m_tdlsChannelSwitching & 0x01) << 6;
+    byte |= (m_interworking & 0x01) << 7;
+    start.WriteU8(byte);
+
+    byte = 0;
+    byte |= m_qosMap & 0x01;
+    byte |= (m_ebr & 0x01) << 1;
+    byte |= (m_sspnInterface & 0x01) << 2;
+    byte |= (m_msgcfCapability & 0x01) << 4;
+    byte |= (m_tdlsSupport & 0x01) << 5;
+    byte |= (m_tdlsProhibited & 0x01) << 6;
+    byte |= (m_tdlsChannelSwitchingProhibited & 0x01) << 7;
+    start.WriteU8(byte);
+
+    byte = 0;
+    byte |= m_rejectUnadmittedFrame & 0x01;
+    byte |= (m_serviceIntervalGranularity & 0x07) << 1;
+    byte |= (m_identifierLocation & 0x01) << 4;
+    byte |= (m_uapsdCoexistence & 0x01) << 5;
+    byte |= (m_wnmNotification & 0x01) << 6;
+    byte |= (m_qabCapability & 0x01) << 7;
+    start.WriteU8(byte);
+
+    byte = 0;
+    byte |= m_utf8Ssid & 0x01;
+    byte |= (m_qmfActivated & 0x01) << 1;
+    byte |= (m_qmfReconfigurationActivated & 0x01) << 2;
+    byte |= (m_robustAvStreaming & 0x01) << 3;
+    byte |= (m_advancedGcr & 0x01) << 4;
+    byte |= (m_meshGcr & 0x01) << 5;
+    byte |= (m_scs & 0x01) << 6;
+    byte |= (m_qloadReport & 0x01) << 7;
+    start.WriteU8(byte);
+
+    byte = 0;
+    byte |= m_alternateEdca & 0x01;
+    byte |= (m_unprotectedTxopNegotiation & 0x01) << 1;
+    byte |= (m_protectedTxopNegotiation & 0x01) << 2;
+    byte |= (m_protectedQloadReport & 0x01) << 3;
+    byte |= (m_tdlsWiderBandwidth & 0x01) << 4;
+    byte |= (m_operatingModeNotification & 0x01) << 5;
+    byte |= (m_maxNumberOfMsdusInAmsdu & 0x03) << 6;
+    start.WriteU8(byte);
 }
 
 uint16_t
 ExtendedCapabilities::DeserializeInformationField(Buffer::Iterator start, uint16_t length)
 {
     Buffer::Iterator i = start;
-    uint8_t byte1 = i.ReadU8();
-    uint8_t byte2 = i.ReadU8();
-    uint8_t byte3 = i.ReadU8();
-    uint8_t byte4 = i.ReadU8();
-    uint8_t byte5 = i.ReadU8();
-    uint8_t byte6 = i.ReadU8();
-    uint8_t byte7 = i.ReadU8();
-    uint8_t byte8 = i.ReadU8();
-    SetExtendedCapabilitiesByte1(byte1);
-    SetExtendedCapabilitiesByte2(byte2);
-    SetExtendedCapabilitiesByte3(byte3);
-    SetExtendedCapabilitiesByte4(byte4);
-    SetExtendedCapabilitiesByte5(byte5);
-    SetExtendedCapabilitiesByte6(byte6);
-    SetExtendedCapabilitiesByte7(byte7);
-    SetExtendedCapabilitiesByte8(byte8);
+
+    auto byte = i.ReadU8();
+    m_20_40_bssCoexistenceManagementSupport = byte & 0x01;
+    m_extendedChannelSwitching = (byte >> 2) & 0x01;
+    m_psmpCapability = (byte >> 4) & 0x01;
+    m_spsmpSupport = (byte >> 6) & 0x01;
+    m_event = (byte >> 7) & 0x01;
+
+    byte = i.ReadU8();
+    m_diagnostics = byte & 0x01;
+    m_multicastDiagnostics = (byte >> 1) & 0x01;
+    m_locationTracking = (byte >> 2) & 0x01;
+    m_fms = (byte >> 3) & 0x01;
+    m_proxyArpService = (byte >> 4) & 0x01;
+    m_collocatedInterferenceReporting = (byte >> 5) & 0x01;
+    m_civicLocation = (byte >> 6) & 0x01;
+    m_geospatialLocation = (byte >> 7) & 0x01;
+
+    byte = i.ReadU8();
+    m_tfs = byte & 0x01;
+    m_wnmSleepMode = (byte >> 1) & 0x01;
+    m_timBroadcast = (byte >> 2) & 0x01;
+    m_bssTransition = (byte >> 3) & 0x01;
+    m_qosTrafficCapability = (byte >> 4) & 0x01;
+    m_acStationCount = (byte >> 5) & 0x01;
+    m_multipleBssid = (byte >> 6) & 0x01;
+    m_timingMeasurement = (byte >> 7) & 0x01;
+
+    byte = i.ReadU8();
+    m_channelUsage = byte & 0x01;
+    m_ssidList = (byte >> 1) & 0x01;
+    m_dms = (byte >> 2) & 0x01;
+    m_utcTsfOffset = (byte >> 3) & 0x01;
+    m_tpuBufferStaSupport = (byte >> 4) & 0x01;
+    m_tdlsPeerPsmSupport = (byte >> 5) & 0x01;
+    m_tdlsChannelSwitching = (byte >> 6) & 0x01;
+    m_interworking = (byte >> 7) & 0x01;
+
+    byte = i.ReadU8();
+    m_qosMap = byte & 0x01;
+    m_ebr = (byte >> 1) & 0x01;
+    m_sspnInterface = (byte >> 2) & 0x01;
+    m_msgcfCapability = (byte >> 4) & 0x01;
+    m_tdlsSupport = (byte >> 5) & 0x01;
+    m_tdlsProhibited = (byte >> 6) & 0x01;
+    m_tdlsChannelSwitchingProhibited = (byte >> 7) & 0x01;
+
+    byte = i.ReadU8();
+    m_rejectUnadmittedFrame = byte & 0x01;
+    m_serviceIntervalGranularity = (byte >> 1) & 0x07;
+    m_identifierLocation = (byte >> 4) & 0x01;
+    m_uapsdCoexistence = (byte >> 5) & 0x01;
+    m_wnmNotification = (byte >> 6) & 0x01;
+    m_qabCapability = (byte >> 7) & 0x01;
+
+    byte = i.ReadU8();
+    m_utf8Ssid = byte & 0x01;
+    m_qmfActivated = (byte >> 1) & 0x01;
+    m_qmfReconfigurationActivated = (byte >> 2) & 0x01;
+    m_robustAvStreaming = (byte >> 3) & 0x01;
+    m_advancedGcr = (byte >> 4) & 0x01;
+    m_meshGcr = (byte >> 5) & 0x01;
+    m_scs = (byte >> 6) & 0x01;
+    m_qloadReport = (byte >> 7) & 0x01;
+
+    byte = i.ReadU8();
+    m_alternateEdca = byte & 0x01;
+    m_unprotectedTxopNegotiation = (byte >> 1) & 0x01;
+    m_protectedTxopNegotiation = (byte >> 2) & 0x01;
+    m_protectedQloadReport = (byte >> 3) & 0x01;
+    m_tdlsWiderBandwidth = (byte >> 4) & 0x01;
+    m_operatingModeNotification = (byte >> 5) & 0x01;
+    m_maxNumberOfMsdusInAmsdu = (byte >> 6) & 0x03;
+
     return length;
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/extended-capabilities.h ns-3.44/src/wifi/model/extended-capabilities.h
--- ns-3.43/src/wifi/model/extended-capabilities.h	2024-10-09 16:41:10.120656700 -0700
+++ ns-3.44/src/wifi/model/extended-capabilities.h	2025-03-09 16:55:49.787372600 -0700
@@ -15,187 +15,78 @@
 {
 
 /**
- * \brief The Extended Capabilities Information Element
- * \ingroup wifi
+ * @brief The Extended Capabilities Information Element
+ * @ingroup wifi
  *
  * This class knows how to serialise and deserialise the Extended Capabilities Information Element
  */
 class ExtendedCapabilities : public WifiInformationElement
 {
   public:
-    ExtendedCapabilities();
-
-    // Implementations of pure virtual methods of WifiInformationElement
     WifiInformationElementId ElementId() const override;
     uint16_t GetInformationFieldSize() const override;
     void SerializeInformationField(Buffer::Iterator start) const override;
     uint16_t DeserializeInformationField(Buffer::Iterator start, uint16_t length) override;
     void Print(std::ostream& os) const override;
 
-    /**
-     * Set the first byte in the Extended Capabilities information element.
-     *
-     * \param ctrl the first byte in the Extended Capabilities information element
-     */
-    void SetExtendedCapabilitiesByte1(uint8_t ctrl);
-    /**
-     * Set the second byte in the Extended Capabilities information element.
-     *
-     * \param ctrl the second byte in the Extended Capabilities information element
-     */
-    void SetExtendedCapabilitiesByte2(uint8_t ctrl);
-    /**
-     * Set the third byte in the Extended Capabilities information element.
-     *
-     * \param ctrl the third byte in the Extended Capabilities information element
-     */
-    void SetExtendedCapabilitiesByte3(uint8_t ctrl);
-    /**
-     * Set the fourth byte in the Extended Capabilities information element.
-     *
-     * \param ctrl the fourth byte in the Extended Capabilities information element
-     */
-    void SetExtendedCapabilitiesByte4(uint8_t ctrl);
-    /**
-     * Set the fifth byte in the Extended Capabilities information element.
-     *
-     * \param ctrl the fifth byte in the Extended Capabilities information element
-     */
-    void SetExtendedCapabilitiesByte5(uint8_t ctrl);
-    /**
-     * Set the sixth byte in the Extended Capabilities information element.
-     *
-     * \param ctrl the sixth byte in the Extended Capabilities information element
-     */
-    void SetExtendedCapabilitiesByte6(uint8_t ctrl);
-    /**
-     * Set the seventh byte in the Extended Capabilities information element.
-     *
-     * \param ctrl the seventh byte in the Extended Capabilities information element
-     */
-    void SetExtendedCapabilitiesByte7(uint8_t ctrl);
-    /**
-     * Set the eighth byte in the Extended Capabilities information element.
-     *
-     * \param ctrl the eighth byte in the Extended Capabilities information element
-     */
-    void SetExtendedCapabilitiesByte8(uint8_t ctrl);
-
-    /**
-     * Return the first byte in the Extended Capabilities information element.
-     *
-     * \return the first byte in the Extended Capabilities information element
-     */
-    uint8_t GetExtendedCapabilitiesByte1() const;
-    /**
-     * Return the second byte in the Extended Capabilities information element.
-     *
-     * \return the second byte in the Extended Capabilities information element
-     */
-    uint8_t GetExtendedCapabilitiesByte2() const;
-    /**
-     * Return the third byte in the Extended Capabilities information element.
-     *
-     * \return the third byte in the Extended Capabilities information element
-     */
-    uint8_t GetExtendedCapabilitiesByte3() const;
-    /**
-     * Return the fourth byte in the Extended Capabilities information element.
-     *
-     * \return the fourth byte in the Extended Capabilities information element
-     */
-    uint8_t GetExtendedCapabilitiesByte4() const;
-    /**
-     * Return the fifth byte in the Extended Capabilities information element.
-     *
-     * \return the fifth byte in the Extended Capabilities information element
-     */
-    uint8_t GetExtendedCapabilitiesByte5() const;
-    /**
-     * Return the sixth byte in the Extended Capabilities information element.
-     *
-     * \return the sixth byte in the Extended Capabilities information element
-     */
-    uint8_t GetExtendedCapabilitiesByte6() const;
-    /**
-     * Return the seventh byte in the Extended Capabilities information element.
-     *
-     * \return the seventh byte in the Extended Capabilities information element
-     */
-    uint8_t GetExtendedCapabilitiesByte7() const;
-    /**
-     * Return the eighth byte in the Extended Capabilities information element.
-     *
-     * \return the eighth byte in the Extended Capabilities information element
-     */
-    uint8_t GetExtendedCapabilitiesByte8() const;
-
-  private:
-    // fields if HT supported
-    uint8_t m_20_40_bssCoexistenceManagementSupport; ///< 20/40 BSS Coexistence Management Support
-    uint8_t m_extendedChannelSwitching;              ///< Extended Channel Switching
-    uint8_t m_psmpCapability;                        ///< PSMP Capability
-    uint8_t m_spsmpSupport;                          ///< S-PSMP Support
-
-    uint8_t m_event;                           ///< Event
-    uint8_t m_diagnostics;                     ///< Diagnostics
-    uint8_t m_multicastDiagnostics;            ///< Multicast Diagnostics
-    uint8_t m_locationTracking;                ///< Location Tracking
-    uint8_t m_fms;                             ///< FMS
-    uint8_t m_proxyArpService;                 ///< Proxy ARP Service
-    uint8_t m_collocatedInterferenceReporting; ///< Collocated Interference Reporting
-    uint8_t m_civicLocation;                   ///< Civic Location
-    uint8_t m_geospatialLocation;              ///< Geospatial Location
-
-    uint8_t m_tfs;                  ///< TFS
-    uint8_t m_wnmSleepMode;         ///< WNM Sleep Mode
-    uint8_t m_timBroadcast;         ///< TIM Broadcast
-    uint8_t m_bssTransition;        ///< BSS Transition
-    uint8_t m_qosTrafficCapability; ///< QoS Traffic Capability
-    uint8_t m_acStationCount;       ///< AC Station Count
-    uint8_t m_multipleBssid;        ///< Multiple BSSID
-    uint8_t m_timingMeasurement;    ///< Timing Measurement
-
-    uint8_t m_channelUsage;         ///< Channel Usage
-    uint8_t m_ssidList;             ///< SSID List
-    uint8_t m_dms;                  ///< DMS
-    uint8_t m_utcTsfOffset;         ///< UTC TSF Offset
-    uint8_t m_tpuBufferStaSupport;  ///< TPU Buffer STA Support
-    uint8_t m_tdlsPeerPsmSupport;   ///< TDLS Peer PSM Support
-    uint8_t m_tdlsChannelSwitching; ///< TDLS Channel Switching
-    uint8_t m_interworking;         ///< Interworking
-
-    uint8_t m_qosMap;                         ///< QoS Map
-    uint8_t m_ebr;                            ///< EBR
-    uint8_t m_sspnInterface;                  ///< SSPN Interface
-    uint8_t m_msgcfCapability;                ///< MSGCF Capability
-    uint8_t m_tdlsSupport;                    ///< TDLS Support
-    uint8_t m_tdlsProhibited;                 ///< TDLS Prohibited
-    uint8_t m_tdlsChannelSwitchingProhibited; ///< TDLS Channel Switching Prohibited
-
-    uint8_t m_rejectUnadmittedFrame;      ///< Reject Unadmitted Frame
-    uint8_t m_serviceIntervalGranularity; ///< Service Interval Granularity
-    uint8_t m_identifierLocation;         ///< Identifier Location
-    uint8_t m_uapsdCoexistence;           ///< U-APSD Coexistence
-    uint8_t m_wnmNotification;            ///< WNM Notification
-    uint8_t m_qabCapability;              ///< QAB Capability
-
-    uint8_t m_utf8Ssid;                    ///< UTF-8 SSID
-    uint8_t m_qmfActivated;                ///< QMFActivated
-    uint8_t m_qmfReconfigurationActivated; ///< QMFReconfigurationActivated
-    uint8_t m_robustAvStreaming;           ///< Robust AV Streaming
-    uint8_t m_advancedGcr;                 ///< Advanced GCR
-    uint8_t m_meshGcr;                     ///< Mesh GCR
-    uint8_t m_scs;                         ///< SCS
-    uint8_t m_qloadReport;                 ///< QLoad Report
-
-    uint8_t m_alternateEdca;              ///< Alternate EDCA
-    uint8_t m_unprotectedTxopNegotiation; ///< Unprotected TXOP Negotiation
-    uint8_t m_protectedTxopNegotiation;   ///< Protected TXOP Negotiation
-    uint8_t m_protectedQloadReport;       ///< Protected QLoad Report
-    uint8_t m_tdlsWiderBandwidth;         ///< TDLS Wider Bandwidth
-    uint8_t m_operatingModeNotification;  ///< Operating Mode Notification
-    uint8_t m_maxNumberOfMsdusInAmsdu;    ///< Max Number Of MSDUs In A-MSDU
+    uint8_t m_20_40_bssCoexistenceManagementSupport : 1 {
+        0};                                            ///< 20/40 BSS Coexistence Management Support
+    uint8_t m_extendedChannelSwitching : 1 {0};        ///< Extended Channel Switching
+    uint8_t m_psmpCapability : 1 {0};                  ///< PSMP Capability
+    uint8_t m_spsmpSupport : 1 {0};                    ///< S-PSMP Support
+    uint8_t m_event : 1 {0};                           ///< Event
+    uint8_t m_diagnostics : 1 {0};                     ///< Diagnostics
+    uint8_t m_multicastDiagnostics : 1 {0};            ///< Multicast Diagnostics
+    uint8_t m_locationTracking : 1 {0};                ///< Location Tracking
+    uint8_t m_fms : 1 {0};                             ///< FMS
+    uint8_t m_proxyArpService : 1 {0};                 ///< Proxy ARP Service
+    uint8_t m_collocatedInterferenceReporting : 1 {0}; ///< Collocated Interference Reporting
+    uint8_t m_civicLocation : 1 {0};                   ///< Civic Location
+    uint8_t m_geospatialLocation : 1 {0};              ///< Geospatial Location
+    uint8_t m_tfs : 1 {0};                             ///< TFS
+    uint8_t m_wnmSleepMode : 1 {0};                    ///< WNM Sleep Mode
+    uint8_t m_timBroadcast : 1 {0};                    ///< TIM Broadcast
+    uint8_t m_bssTransition : 1 {0};                   ///< BSS Transition
+    uint8_t m_qosTrafficCapability : 1 {0};            ///< QoS Traffic Capability
+    uint8_t m_acStationCount : 1 {0};                  ///< AC Station Count
+    uint8_t m_multipleBssid : 1 {0};                   ///< Multiple BSSID
+    uint8_t m_timingMeasurement : 1 {0};               ///< Timing Measurement
+    uint8_t m_channelUsage : 1 {0};                    ///< Channel Usage
+    uint8_t m_ssidList : 1 {0};                        ///< SSID List
+    uint8_t m_dms : 1 {0};                             ///< DMS
+    uint8_t m_utcTsfOffset : 1 {0};                    ///< UTC TSF Offset
+    uint8_t m_tpuBufferStaSupport : 1 {0};             ///< TPU Buffer STA Support
+    uint8_t m_tdlsPeerPsmSupport : 1 {0};              ///< TDLS Peer PSM Support
+    uint8_t m_tdlsChannelSwitching : 1 {0};            ///< TDLS Channel Switching
+    uint8_t m_interworking : 1 {0};                    ///< Interworking
+    uint8_t m_qosMap : 1 {0};                          ///< QoS Map
+    uint8_t m_ebr : 1 {0};                             ///< EBR
+    uint8_t m_sspnInterface : 1 {0};                   ///< SSPN Interface
+    uint8_t m_msgcfCapability : 1 {0};                 ///< MSGCF Capability
+    uint8_t m_tdlsSupport : 1 {0};                     ///< TDLS Support
+    uint8_t m_tdlsProhibited : 1 {0};                  ///< TDLS Prohibited
+    uint8_t m_tdlsChannelSwitchingProhibited : 1 {0};  ///< TDLS Channel Switching Prohibited
+    uint8_t m_rejectUnadmittedFrame : 1 {0};           ///< Reject Unadmitted Frame
+    uint8_t m_serviceIntervalGranularity : 3 {0};      ///< Service Interval Granularity
+    uint8_t m_identifierLocation : 1 {0};              ///< Identifier Location
+    uint8_t m_uapsdCoexistence : 1 {0};                ///< U-APSD Coexistence
+    uint8_t m_wnmNotification : 1 {0};                 ///< WNM Notification
+    uint8_t m_qabCapability : 1 {0};                   ///< QAB Capability
+    uint8_t m_utf8Ssid : 1 {0};                        ///< UTF-8 SSID
+    uint8_t m_qmfActivated : 1 {0};                    ///< QMFActivated
+    uint8_t m_qmfReconfigurationActivated : 1 {0};     ///< QMFReconfigurationActivated
+    uint8_t m_robustAvStreaming : 1 {0};               ///< Robust AV Streaming
+    uint8_t m_advancedGcr : 1 {0};                     ///< Advanced GCR
+    uint8_t m_meshGcr : 1 {0};                         ///< Mesh GCR
+    uint8_t m_scs : 1 {0};                             ///< SCS
+    uint8_t m_qloadReport : 1 {0};                     ///< QLoad Report
+    uint8_t m_alternateEdca : 1 {0};                   ///< Alternate EDCA
+    uint8_t m_unprotectedTxopNegotiation : 1 {0};      ///< Unprotected TXOP Negotiation
+    uint8_t m_protectedTxopNegotiation : 1 {0};        ///< Protected TXOP Negotiation
+    uint8_t m_protectedQloadReport : 1 {0};            ///< Protected QLoad Report
+    uint8_t m_tdlsWiderBandwidth : 1 {0};              ///< TDLS Wider Bandwidth
+    uint8_t m_operatingModeNotification : 1 {0};       ///< Operating Mode Notification
+    uint8_t m_maxNumberOfMsdusInAmsdu : 2 {0};         ///< Max Number Of MSDUs In A-MSDU
 };
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/fcfs-wifi-queue-scheduler.h ns-3.44/src/wifi/model/fcfs-wifi-queue-scheduler.h
--- ns-3.43/src/wifi/model/fcfs-wifi-queue-scheduler.h	2024-10-09 16:41:10.120656700 -0700
+++ ns-3.44/src/wifi/model/fcfs-wifi-queue-scheduler.h	2025-03-09 16:55:49.787372600 -0700
@@ -19,7 +19,7 @@
 class WifiMpdu;
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * Definition of priority for container queues.
  */
@@ -30,20 +30,20 @@
 };
 
 /**
- * \param lhs the left hand side priority
- * \param rhs the right hand side priority
- * \return whether the left hand side priority is equal to the right hand side priority
+ * @param lhs the left hand side priority
+ * @param rhs the right hand side priority
+ * @return whether the left hand side priority is equal to the right hand side priority
  */
 bool operator==(const FcfsPrio& lhs, const FcfsPrio& rhs);
 /**
- * \param lhs the left hand side priority
- * \param rhs the right hand side priority
- * \return whether the left hand side priority is less than the right hand side priority
+ * @param lhs the left hand side priority
+ * @param rhs the right hand side priority
+ * @return whether the left hand side priority is less than the right hand side priority
  */
 bool operator<(const FcfsPrio& lhs, const FcfsPrio& rhs);
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * FcfsWifiQueueScheduler is a wifi queue scheduler that serves data frames in a
  * first come first serve fashion. Control frames have the highest priority.
@@ -54,8 +54,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/frame-capture-model.h ns-3.44/src/wifi/model/frame-capture-model.h
--- ns-3.43/src/wifi/model/frame-capture-model.h	2024-10-09 16:41:10.120656700 -0700
+++ ns-3.44/src/wifi/model/frame-capture-model.h	2025-03-09 16:55:49.787372600 -0700
@@ -19,16 +19,16 @@
 class Time;
 
 /**
- * \ingroup wifi
- * \brief the interface for Wifi's frame capture models
+ * @ingroup wifi
+ * @brief the interface for Wifi's frame capture models
  *
  */
 class FrameCaptureModel : public Object
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -37,10 +37,10 @@
      * This method returns whether the reception should be switched to a
      * new incoming frame.
      *
-     * \param currentEvent the event of the current frame
-     * \param newEvent the event of the new incoming frame
+     * @param currentEvent the event of the current frame
+     * @param newEvent the event of the new incoming frame
      *
-     * \return true if the reception should be switched to a new incoming frame,
+     * @return true if the reception should be switched to a new incoming frame,
      *         false otherwise
      */
     virtual bool CaptureNewFrame(Ptr<Event> currentEvent, Ptr<Event> newEvent) const = 0;
@@ -49,9 +49,9 @@
      * This method returns true if the capture window duration has not elapsed yet,
      *                     false otherwise.
      *
-     * \param timePreambleDetected the time the preamble was detected
+     * @param timePreambleDetected the time the preamble was detected
      *
-     * \return true if the capture window duration has not elapsed yet,
+     * @return true if the capture window duration has not elapsed yet,
      *         false otherwise
      */
     virtual bool IsInCaptureWindow(Time timePreambleDetected) const;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/frame-exchange-manager.cc ns-3.44/src/wifi/model/frame-exchange-manager.cc
--- ns-3.43/src/wifi/model/frame-exchange-manager.cc	2024-10-09 16:41:10.120656700 -0700
+++ ns-3.44/src/wifi/model/frame-exchange-manager.cc	2025-03-09 16:55:49.787372600 -0700
@@ -8,6 +8,8 @@
 
 #include "frame-exchange-manager.h"
 
+#include "ap-wifi-mac.h"
+#include "gcr-manager.h"
 #include "snr-tag.h"
 #include "sta-wifi-mac.h"
 #include "wifi-mac-queue.h"
@@ -35,17 +37,27 @@
 TypeId
 FrameExchangeManager::GetTypeId()
 {
-    static TypeId tid = TypeId("ns3::FrameExchangeManager")
-                            .SetParent<Object>()
-                            .AddConstructor<FrameExchangeManager>()
-                            .SetGroupName("Wifi");
+    static TypeId tid =
+        TypeId("ns3::FrameExchangeManager")
+            .SetParent<Object>()
+            .AddConstructor<FrameExchangeManager>()
+            .SetGroupName("Wifi")
+            .AddAttribute("ProtectedIfResponded",
+                          "Whether a station is assumed to be protected if replied to a frame "
+                          "requiring acknowledgment. If a station is protected, subsequent "
+                          "transmissions to the same station in the same TXOP are not "
+                          "preceded by protection mechanisms.",
+                          BooleanValue(true),
+                          MakeBooleanAccessor(&FrameExchangeManager::m_protectedIfResponded),
+                          MakeBooleanChecker());
     return tid;
 }
 
 FrameExchangeManager::FrameExchangeManager()
-    : m_navEnd(Seconds(0)),
+    : m_navEnd(0),
+      m_txNav(0),
       m_linkId(0),
-      m_allowedWidth(0),
+      m_allowedWidth{0},
       m_promisc(false),
       m_moreFragments(false)
 {
@@ -62,10 +74,8 @@
 {
     NS_LOG_FUNCTION(this);
     m_txTimer.Cancel();
-    if (m_navResetEvent.IsPending())
-    {
-        m_navResetEvent.Cancel();
-    }
+    m_navResetEvent.Cancel();
+    m_sendCtsEvent.Cancel();
     m_navEnd = Simulator::Now();
     m_mpdu = nullptr;
     m_txParams.Clear();
@@ -81,6 +91,8 @@
     Reset();
     m_fragmentedPacket = nullptr;
     m_mac = nullptr;
+    m_apMac = nullptr;
+    m_staMac = nullptr;
     m_txMiddle = nullptr;
     m_rxMiddle = nullptr;
     m_channelAccessManager = nullptr;
@@ -128,6 +140,8 @@
 {
     NS_LOG_FUNCTION(this << mac);
     m_mac = mac;
+    m_apMac = DynamicCast<ApWifiMac>(m_mac);
+    m_staMac = DynamicCast<StaWifiMac>(mac);
 }
 
 void
@@ -187,8 +201,8 @@
             m_phy->SetReceiveOkCallback(MakeNullCallback<void,
                                                          Ptr<const WifiPsdu>,
                                                          RxSignalInfo,
-                                                         WifiTxVector,
-                                                         std::vector<bool>>());
+                                                         const WifiTxVector&,
+                                                         const std::vector<bool>&>());
             m_phy->SetReceiveErrorCallback(MakeNullCallback<void, Ptr<const WifiPsdu>>());
         }
         m_phy = nullptr;
@@ -267,6 +281,7 @@
 void
 FrameExchangeManager::NotifyPacketDiscarded(Ptr<const WifiMpdu> mpdu)
 {
+    NS_LOG_FUNCTION(this << *mpdu);
     NS_ASSERT(!m_droppedMpduCallback.IsNull());
     m_droppedMpduCallback(WIFI_MAC_DROP_REACHED_RETRY_LIMIT, mpdu);
 }
@@ -480,7 +495,14 @@
     m_protectedStas.merge(m_sentRtsTo);
     m_sentRtsTo.clear();
     NS_ASSERT(m_mpdu);
-    SendMpdu();
+    if (m_txParams.m_protection->method == WifiProtection::NONE)
+    {
+        SendMpdu();
+    }
+    else
+    {
+        Simulator::Schedule(m_phy->GetSifs(), &FrameExchangeManager::SendMpdu, this);
+    }
 }
 
 const std::set<Mac48Address>&
@@ -494,16 +516,42 @@
 {
     NS_LOG_FUNCTION(this);
 
-    Time txDuration = m_phy->CalculateTxDuration(GetPsduSize(m_mpdu, m_txParams.m_txVector),
-                                                 m_txParams.m_txVector,
-                                                 m_phy->GetPhyBand());
+    Time txDuration = WifiPhy::CalculateTxDuration(GetPsduSize(m_mpdu, m_txParams.m_txVector),
+                                                   m_txParams.m_txVector,
+                                                   m_phy->GetPhyBand());
 
     NS_ASSERT(m_txParams.m_acknowledgment);
 
     if (m_txParams.m_acknowledgment->method == WifiAcknowledgment::NONE)
     {
-        if (!m_mpdu->GetHeader().IsQosData() ||
-            m_mpdu->GetHeader().GetQosAckPolicy() == WifiMacHeader::NO_ACK)
+        if (m_mac->GetTypeOfStation() == AP && m_apMac->UseGcr(m_mpdu->GetHeader()))
+        {
+            if (m_apMac->GetGcrManager()->KeepGroupcastQueued(m_mpdu))
+            {
+                // keep the groupcast frame in the queue for future retransmission
+                Simulator::Schedule(txDuration + m_phy->GetSifs(), [=, this, mpdu = m_mpdu]() {
+                    NS_LOG_DEBUG("Prepare groupcast MPDU for retry");
+                    mpdu->ResetInFlight(m_linkId);
+                    // restore addr1 to the group address instead of the concealment address
+                    if (m_apMac->GetGcrManager()->UseConcealment(mpdu->GetHeader()))
+                    {
+                        mpdu->GetHeader().SetAddr1(mpdu->begin()->second.GetDestinationAddr());
+                    }
+                    mpdu->GetHeader().SetRetry();
+                });
+            }
+            else
+            {
+                if (m_apMac->GetGcrManager()->GetRetransmissionPolicy() ==
+                    GroupAddressRetransmissionPolicy::GCR_UNSOLICITED_RETRY)
+                {
+                    NotifyLastGcrUrTx(m_mpdu);
+                }
+                DequeueMpdu(m_mpdu);
+            }
+        }
+        else 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);
@@ -529,7 +577,7 @@
 
         Time timeout =
             txDuration + m_phy->GetSifs() + m_phy->GetSlot() +
-            m_phy->CalculatePhyPreambleAndHeaderDuration(normalAcknowledgment->ackTxVector);
+            WifiPhy::CalculatePhyPreambleAndHeaderDuration(normalAcknowledgment->ackTxVector);
         NS_ASSERT(!m_txTimer.IsRunning());
         m_txTimer.Set(WifiTxTimer::WAIT_NORMAL_ACK,
                       timeout,
@@ -548,6 +596,12 @@
 
     // transmit the MPDU
     ForwardMpduDown(m_mpdu, m_txParams.m_txVector);
+
+    if (m_txTimer.IsRunning())
+    {
+        NS_ASSERT(m_sentFrameTo.empty());
+        m_sentFrameTo = {m_mpdu->GetHeader().GetAddr1()};
+    }
 }
 
 void
@@ -558,6 +612,14 @@
     auto psdu = Create<WifiPsdu>(mpdu, false);
     FinalizeMacHeader(psdu);
     m_allowedWidth = std::min(m_allowedWidth, txVector.GetChannelWidth());
+    auto txDuration = WifiPhy::CalculateTxDuration(psdu, txVector, m_phy->GetPhyBand());
+    // The TXNAV timer is a single timer, shared by the EDCAFs within a STA, that is initialized
+    // with the duration from the Duration/ID field in the frame most recently successfully
+    // transmitted by the TXOP holder, except for PS-Poll frames. (Sec.10.23.2.2 IEEE 802.11-2020)
+    if (!mpdu->GetHeader().IsPsPoll())
+    {
+        m_txNav = Max(m_txNav, Simulator::Now() + txDuration + mpdu->GetHeader().GetDuration());
+    }
     m_phy->Send(psdu, txVector);
 }
 
@@ -621,21 +683,22 @@
     else if (protection->method == WifiProtection::RTS_CTS)
     {
         auto rtsCtsProtection = static_cast<WifiRtsCtsProtection*>(protection);
-        rtsCtsProtection->protectionTime = m_phy->CalculateTxDuration(GetRtsSize(),
-                                                                      rtsCtsProtection->rtsTxVector,
-                                                                      m_phy->GetPhyBand()) +
-                                           m_phy->CalculateTxDuration(GetCtsSize(),
-                                                                      rtsCtsProtection->ctsTxVector,
-                                                                      m_phy->GetPhyBand()) +
-                                           2 * m_phy->GetSifs();
+        rtsCtsProtection->protectionTime =
+            WifiPhy::CalculateTxDuration(GetRtsSize(),
+                                         rtsCtsProtection->rtsTxVector,
+                                         m_phy->GetPhyBand()) +
+            WifiPhy::CalculateTxDuration(GetCtsSize(),
+                                         rtsCtsProtection->ctsTxVector,
+                                         m_phy->GetPhyBand()) +
+            2 * m_phy->GetSifs();
     }
     else if (protection->method == WifiProtection::CTS_TO_SELF)
     {
         auto ctsToSelfProtection = static_cast<WifiCtsToSelfProtection*>(protection);
         ctsToSelfProtection->protectionTime =
-            m_phy->CalculateTxDuration(GetCtsSize(),
-                                       ctsToSelfProtection->ctsTxVector,
-                                       m_phy->GetPhyBand()) +
+            WifiPhy::CalculateTxDuration(GetCtsSize(),
+                                         ctsToSelfProtection->ctsTxVector,
+                                         m_phy->GetPhyBand()) +
             m_phy->GetSifs();
     }
 }
@@ -654,9 +717,9 @@
     {
         auto normalAcknowledgment = static_cast<WifiNormalAck*>(acknowledgment);
         normalAcknowledgment->acknowledgmentTime =
-            m_phy->GetSifs() + m_phy->CalculateTxDuration(GetAckSize(),
-                                                          normalAcknowledgment->ackTxVector,
-                                                          m_phy->GetPhyBand());
+            m_phy->GetSifs() + WifiPhy::CalculateTxDuration(GetAckSize(),
+                                                            normalAcknowledgment->ackTxVector,
+                                                            m_phy->GetPhyBand());
     }
 }
 
@@ -665,7 +728,7 @@
                                     Mac48Address receiver,
                                     const WifiTxParameters& txParams) const
 {
-    return m_phy->CalculateTxDuration(ppduPayloadSize, txParams.m_txVector, m_phy->GetPhyBand());
+    return WifiPhy::CalculateTxDuration(ppduPayloadSize, txParams.m_txVector, m_phy->GetPhyBand());
 }
 
 void
@@ -697,10 +760,11 @@
         WifiTxVector ackTxVector =
             GetWifiRemoteStationManager()->GetAckTxVector(header.GetAddr1(), txParams.m_txVector);
 
-        durationId +=
-            2 * m_phy->GetSifs() +
-            m_phy->CalculateTxDuration(GetAckSize(), ackTxVector, m_phy->GetPhyBand()) +
-            m_phy->CalculateTxDuration(nextFragmentSize, txParams.m_txVector, m_phy->GetPhyBand());
+        durationId += 2 * m_phy->GetSifs() +
+                      WifiPhy::CalculateTxDuration(GetAckSize(), ackTxVector, m_phy->GetPhyBand()) +
+                      WifiPhy::CalculateTxDuration(nextFragmentSize,
+                                                   txParams.m_txVector,
+                                                   m_phy->GetPhyBand());
     }
     return durationId;
 }
@@ -716,7 +780,7 @@
     ctsTxVector = GetWifiRemoteStationManager()->GetCtsTxVector(m_self, rtsTxVector.GetMode());
 
     return m_phy->GetSifs() +
-           m_phy->CalculateTxDuration(GetCtsSize(), ctsTxVector, m_phy->GetPhyBand()) /* CTS */
+           WifiPhy::CalculateTxDuration(GetCtsSize(), ctsTxVector, m_phy->GetPhyBand()) /* CTS */
            + m_phy->GetSifs() + txDuration + response;
 }
 
@@ -726,7 +790,9 @@
     NS_LOG_FUNCTION(this << &txParams);
 
     NS_ASSERT(txParams.GetPsduInfoMap().size() == 1);
-    Mac48Address receiver = txParams.GetPsduInfoMap().begin()->first;
+
+    const auto& hdr = txParams.GetPsduInfoMap().begin()->second.header;
+    const auto receiver = GetIndividuallyAddressedRecipient(m_mac, hdr);
 
     WifiMacHeader rts;
     rts.SetType(WIFI_MAC_CTL_RTS);
@@ -750,11 +816,11 @@
     // After transmitting an RTS frame, the STA shall wait for a CTSTimeout interval with
     // a value of aSIFSTime + aSlotTime + aRxPHYStartDelay (IEEE 802.11-2016 sec. 10.3.2.7).
     // aRxPHYStartDelay equals the time to transmit the PHY header.
-    Time timeout = m_phy->CalculateTxDuration(GetRtsSize(),
-                                              rtsCtsProtection->rtsTxVector,
-                                              m_phy->GetPhyBand()) +
+    Time timeout = WifiPhy::CalculateTxDuration(GetRtsSize(),
+                                                rtsCtsProtection->rtsTxVector,
+                                                m_phy->GetPhyBand()) +
                    m_phy->GetSifs() + m_phy->GetSlot() +
-                   m_phy->CalculatePhyPreambleAndHeaderDuration(rtsCtsProtection->ctsTxVector);
+                   WifiPhy::CalculatePhyPreambleAndHeaderDuration(rtsCtsProtection->ctsTxVector);
     NS_ASSERT(!m_txTimer.IsRunning());
     m_txTimer.Set(WifiTxTimer::WAIT_CTS,
                   timeout,
@@ -785,7 +851,7 @@
     cts.SetNoRetry();
     cts.SetAddr1(rtsHdr.GetAddr2());
     Time duration = rtsHdr.GetDuration() - m_phy->GetSifs() -
-                    m_phy->CalculateTxDuration(GetCtsSize(), ctsTxVector, m_phy->GetPhyBand());
+                    WifiPhy::CalculateTxDuration(GetCtsSize(), ctsTxVector, m_phy->GetPhyBand());
     // The TXOP holder may exceed the TXOP limit in some situations (Sec. 10.22.2.8 of 802.11-2016)
     if (duration.IsStrictlyNegative())
     {
@@ -850,12 +916,10 @@
 
     ForwardMpduDown(Create<WifiMpdu>(Create<Packet>(), cts), ctsToSelfProtection->ctsTxVector);
 
-    Time ctsDuration = m_phy->CalculateTxDuration(GetCtsSize(),
-                                                  ctsToSelfProtection->ctsTxVector,
-                                                  m_phy->GetPhyBand());
-    Simulator::Schedule(ctsDuration + m_phy->GetSifs(),
-                        &FrameExchangeManager::ProtectionCompleted,
-                        this);
+    Time ctsDuration = WifiPhy::CalculateTxDuration(GetCtsSize(),
+                                                    ctsToSelfProtection->ctsTxVector,
+                                                    m_phy->GetPhyBand());
+    Simulator::Schedule(ctsDuration, &FrameExchangeManager::ProtectionCompleted, this);
 }
 
 void
@@ -877,7 +941,7 @@
     // 802.11-2016, Section 9.2.5.7: Duration/ID is received duration value
     // minus the time to transmit the Ack frame and its SIFS interval
     Time duration = hdr.GetDuration() - m_phy->GetSifs() -
-                    m_phy->CalculateTxDuration(GetAckSize(), ackTxVector, m_phy->GetPhyBand());
+                    WifiPhy::CalculateTxDuration(GetAckSize(), ackTxVector, m_phy->GetPhyBand());
     // The TXOP holder may exceed the TXOP limit in some situations (Sec. 10.22.2.8 of 802.11-2016)
     if (duration.IsStrictlyNegative())
     {
@@ -924,6 +988,7 @@
 FrameExchangeManager::TransmissionSucceeded()
 {
     NS_LOG_FUNCTION(this);
+    m_sentFrameTo.clear();
 
     // Upon a transmission success, a non-QoS station transmits the next fragment,
     // if any, or releases the channel, otherwise
@@ -945,12 +1010,19 @@
 }
 
 void
-FrameExchangeManager::TransmissionFailed()
+FrameExchangeManager::TransmissionFailed(bool forceCurrentCw)
 {
-    NS_LOG_FUNCTION(this);
+    NS_LOG_FUNCTION(this << forceCurrentCw);
+    if (!forceCurrentCw)
+    {
+        m_dcf->UpdateFailedCw(m_linkId);
+    }
+    m_sentFrameTo.clear();
     // A non-QoS station always releases the channel upon a transmission failure
     NotifyChannelReleased(m_dcf);
     m_dcf = nullptr;
+    // reset TXNAV because transmission failed
+    m_txNav = Simulator::Now();
 }
 
 void
@@ -961,33 +1033,45 @@
     m_protectedStas.clear();
 }
 
+Ptr<WifiMpdu>
+FrameExchangeManager::DropMpduIfRetryLimitReached(Ptr<WifiPsdu> psdu)
+{
+    NS_LOG_FUNCTION(this << *psdu);
+
+    const auto mpdusToDrop = GetWifiRemoteStationManager()->GetMpdusToDropOnTxFailure(psdu);
+    Ptr<WifiMpdu> droppedMpdu{nullptr};
+
+    for (const auto& mpdu : mpdusToDrop)
+    {
+        // this MPDU needs to be dropped
+        droppedMpdu = mpdu;
+        NotifyPacketDiscarded(mpdu);
+        DequeueMpdu(mpdu);
+    }
+
+    return droppedMpdu;
+}
+
 void
 FrameExchangeManager::NormalAckTimeout(Ptr<WifiMpdu> mpdu, const WifiTxVector& txVector)
 {
     NS_LOG_FUNCTION(this << *mpdu << txVector);
 
     GetWifiRemoteStationManager()->ReportDataFailed(mpdu);
-
-    if (!GetWifiRemoteStationManager()->NeedRetransmission(mpdu))
+    if (auto droppedMpdu = DropMpduIfRetryLimitReached(Create<WifiPsdu>(mpdu, false)))
     {
-        NS_LOG_DEBUG("Missed Ack, discard MPDU");
-        NotifyPacketDiscarded(mpdu);
-        // Dequeue the MPDU if it is stored in a queue
-        DequeueMpdu(mpdu);
-        GetWifiRemoteStationManager()->ReportFinalDataFailed(mpdu);
-        m_dcf->ResetCw(m_linkId);
+        // notify remote station manager if at least an MPDU was dropped
+        GetWifiRemoteStationManager()->ReportFinalDataFailed(droppedMpdu);
     }
-    else
+
+    // the MPDU may have been dropped due to lifetime expiration or maximum amount of
+    // retransmissions reached
+    if (mpdu->IsQueued())
     {
-        NS_LOG_DEBUG("Missed Ack, retransmit MPDU");
-        if (mpdu->IsQueued()) // the MPDU may have been removed due to lifetime expiration
-        {
-            mpdu = m_mac->GetTxopQueue(mpdu->GetQueueAc())->GetOriginal(mpdu);
-            mpdu->ResetInFlight(m_linkId);
-        }
+        mpdu = m_mac->GetTxopQueue(mpdu->GetQueueAc())->GetOriginal(mpdu);
+        mpdu->ResetInFlight(m_linkId);
         mpdu->GetHeader().SetRetry();
         RetransmitMpduAfterMissedAck(mpdu);
-        m_dcf->UpdateFailedCw(m_linkId);
     }
 
     m_mpdu = nullptr;
@@ -1014,6 +1098,9 @@
 {
     NS_LOG_FUNCTION(this << *psdu);
 
+    // GetUpdateCwOnCtsTimeout() needs to be called before resetting m_sentRtsTo
+    const auto updateCw = GetUpdateCwOnCtsTimeout();
+
     m_sentRtsTo.clear();
     for (const auto& mpdu : *PeekPointer(psdu))
     {
@@ -1024,31 +1111,24 @@
     }
 
     GetWifiRemoteStationManager()->ReportRtsFailed(psdu->GetHeader(0));
-
-    if (!GetWifiRemoteStationManager()->NeedRetransmission(*psdu->begin()))
+    if (auto droppedMpdu = DropMpduIfRetryLimitReached(psdu))
     {
-        NS_LOG_DEBUG("Missed CTS, discard MPDU(s)");
-        GetWifiRemoteStationManager()->ReportFinalRtsFailed(psdu->GetHeader(0));
-        for (const auto& mpdu : *PeekPointer(psdu))
-        {
-            // Dequeue the MPDU if it is stored in a queue
-            DequeueMpdu(mpdu);
-            NotifyPacketDiscarded(mpdu);
-        }
-        m_dcf->ResetCw(m_linkId);
-    }
-    else
-    {
-        NS_LOG_DEBUG("Missed CTS, retransmit MPDU(s)");
-        m_dcf->UpdateFailedCw(m_linkId);
+        GetWifiRemoteStationManager()->ReportFinalRtsFailed(droppedMpdu->GetHeader());
     }
+
     // Make the sequence numbers of the MPDUs available again if the MPDUs have never
     // been transmitted, both in case the MPDUs have been discarded and in case the
     // MPDUs have to be transmitted (because a new sequence number is assigned to
     // MPDUs that have never been transmitted and are selected for transmission)
     ReleaseSequenceNumbers(psdu);
 
-    TransmissionFailed();
+    TransmissionFailed(!updateCw);
+}
+
+bool
+FrameExchangeManager::GetUpdateCwOnCtsTimeout() const
+{
+    return true;
 }
 
 void
@@ -1075,40 +1155,28 @@
 {
     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).
+    // For internal collisions, the frame retry counts associated with the MSDUs, A-MSDUs, or MMPDUs
+    // involved in the internal collision shall be incremented. (Sec. 10.23.2.12.1 of 802.11-2020)
     // 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);
 
-    auto mpdu =
-        (qosTxop ? qosTxop->PeekNextMpdu(m_linkId) : txop->GetWifiMacQueue()->Peek(m_linkId));
-
-    if (mpdu)
+    if (auto mpdu =
+            (qosTxop ? qosTxop->PeekNextMpdu(m_linkId) : txop->GetWifiMacQueue()->Peek(m_linkId));
+        mpdu && !mpdu->GetHeader().GetAddr1().IsGroup())
     {
-        if (mpdu->GetHeader().HasData() && !mpdu->GetHeader().GetAddr1().IsGroup())
+        if (mpdu->GetHeader().HasData())
         {
             GetWifiRemoteStationManager()->ReportDataFailed(mpdu);
         }
 
-        if (!mpdu->GetHeader().GetAddr1().IsGroup() &&
-            !GetWifiRemoteStationManager()->NeedRetransmission(mpdu))
+        if (DropMpduIfRetryLimitReached(Create<WifiPsdu>(mpdu, false)))
         {
-            NS_LOG_DEBUG("reset DCF");
             GetWifiRemoteStationManager()->ReportFinalDataFailed(mpdu);
-            DequeueMpdu(mpdu);
-            NotifyPacketDiscarded(mpdu);
-            txop->ResetCw(m_linkId);
-        }
-        else
-        {
-            NS_LOG_DEBUG("Update CW");
-            txop->UpdateFailedCw(m_linkId);
         }
     }
 
+    txop->UpdateFailedCw(m_linkId);
     txop->Txop::NotifyChannelReleased(m_linkId);
 }
 
@@ -1150,8 +1218,8 @@
 void
 FrameExchangeManager::Receive(Ptr<const WifiPsdu> psdu,
                               RxSignalInfo rxSignalInfo,
-                              WifiTxVector txVector,
-                              std::vector<bool> perMpduStatus)
+                              const WifiTxVector& txVector,
+                              const std::vector<bool>& perMpduStatus)
 {
     NS_LOG_FUNCTION(
         this << psdu << rxSignalInfo << txVector << perMpduStatus.size()
@@ -1235,13 +1303,13 @@
 
     if (psdu->GetAddr1() == m_self)
     {
-        // When the received frame’s RA is equal to the STA’s own MAC address, the STA
+        // When the received frame's RA is equal to the STA's own MAC address, the STA
         // shall not update its NAV (IEEE 802.11-2016, sec. 10.3.2.4)
         return;
     }
 
     // For all other received frames the STA shall update its NAV when the received
-    // Duration is greater than the STA’s current NAV value (IEEE 802.11-2016 sec. 10.3.2.4)
+    // Duration is greater than the STA's current NAV value (IEEE 802.11-2016 sec. 10.3.2.4)
     Time navEnd = Simulator::Now() + duration;
     if (navEnd > m_navEnd)
     {
@@ -1264,7 +1332,7 @@
             Time navResetDelay =
                 2 * m_phy->GetSifs() +
                 WifiPhy::CalculateTxDuration(GetCtsSize(), ctsTxVector, m_phy->GetPhyBand()) +
-                m_phy->CalculatePhyPreambleAndHeaderDuration(ctsTxVector) + 2 * m_phy->GetSlot();
+                WifiPhy::CalculatePhyPreambleAndHeaderDuration(ctsTxVector) + 2 * m_phy->GetSlot();
             m_navResetEvent =
                 Simulator::Schedule(navResetDelay, &FrameExchangeManager::NavResetTimeout, this);
         }
@@ -1314,12 +1382,12 @@
             if (VirtualCsMediumIdle())
             {
                 NS_LOG_DEBUG("Received RTS from=" << hdr.GetAddr2() << ", schedule CTS");
-                Simulator::Schedule(m_phy->GetSifs(),
-                                    &FrameExchangeManager::SendCtsAfterRts,
-                                    this,
-                                    hdr,
-                                    txVector.GetMode(),
-                                    rxSnr);
+                m_sendCtsEvent = Simulator::Schedule(m_phy->GetSifs(),
+                                                     &FrameExchangeManager::SendCtsAfterRts,
+                                                     this,
+                                                     hdr,
+                                                     txVector.GetMode(),
+                                                     rxSnr);
             }
             else
             {
@@ -1332,7 +1400,7 @@
             NS_ABORT_MSG_IF(inAmpdu, "Received CTS as part of an A-MPDU");
             NS_ASSERT(hdr.GetAddr1() == m_self);
 
-            Mac48Address sender = m_mpdu->GetHeader().GetAddr1();
+            const auto sender = GetIndividuallyAddressedRecipient(m_mac, m_mpdu->GetHeader());
             NS_LOG_DEBUG("Received CTS from=" << sender);
 
             SnrTag tag;
@@ -1345,7 +1413,7 @@
 
             m_txTimer.Cancel();
             m_channelAccessManager->NotifyCtsTimeoutResetNow();
-            Simulator::Schedule(m_phy->GetSifs(), &FrameExchangeManager::ProtectionCompleted, this);
+            ProtectionCompleted();
         }
         else if (hdr.IsAck() && m_mpdu && m_txTimer.IsRunning() &&
                  m_txTimer.GetReason() == WifiTxTimer::WAIT_NORMAL_ACK)
@@ -1412,6 +1480,7 @@
 {
     Mac48Address sender = mpdu->GetHeader().GetAddr1();
     NS_LOG_DEBUG("Received ACK from=" << sender);
+    m_txTimer.GotResponseFrom(sender);
 
     NotifyReceivedNormalAck(mpdu);
 
@@ -1469,4 +1538,10 @@
     NS_ASSERT_MSG(false, "A non-QoS station should not receive an A-MPDU");
 }
 
+void
+FrameExchangeManager::NotifyLastGcrUrTx(Ptr<const WifiMpdu> mpdu)
+{
+    NS_ASSERT_MSG(false, "A non-QoS station should not use GCR-UR");
+}
+
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/frame-exchange-manager.h ns-3.44/src/wifi/model/frame-exchange-manager.h
--- ns-3.43/src/wifi/model/frame-exchange-manager.h	2024-10-09 16:41:10.120656700 -0700
+++ ns-3.44/src/wifi/model/frame-exchange-manager.h	2025-03-09 16:55:49.787372600 -0700
@@ -35,12 +35,15 @@
 namespace ns3
 {
 
+class ApWifiMac;
+class StaWifiMac;
+
 struct RxSignalInfo;
 struct WifiProtection;
 struct WifiAcknowledgment;
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * FrameExchangeManager is a base class handling the basic frame exchange
  * sequences for non-QoS stations.
@@ -57,8 +60,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     FrameExchangeManager();
@@ -76,10 +79,10 @@
     /**
      * Request the FrameExchangeManager to start a frame exchange sequence.
      *
-     * \param dcf the channel access function that gained channel access. It is
+     * @param dcf the channel access function that gained channel access. It is
      *            the DCF on non-QoS stations and an EDCA on QoS stations.
-     * \param allowedWidth the allowed width for the frame exchange sequence
-     * \return true if a frame exchange sequence was started, false otherwise
+     * @param allowedWidth the allowed width for the frame exchange sequence
+     * @return true if a frame exchange sequence was started, false otherwise
      */
     virtual bool StartTransmission(Ptr<Txop> dcf, MHz_u allowedWidth);
 
@@ -89,15 +92,15 @@
      * the PSDU contains multiple MPDUs, the <i>perMpduStatus</i> vector is empty
      * when receiving the individual MPDUs.
      *
-     * \param psdu the received PSDU
-     * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
-     * \param txVector TxVector of the received PSDU
-     * \param perMpduStatus per MPDU reception status
+     * @param psdu the received PSDU
+     * @param rxSignalInfo the info on the received signal (\see RxSignalInfo)
+     * @param txVector TxVector of the received PSDU
+     * @param perMpduStatus per MPDU reception status
      */
     void Receive(Ptr<const WifiPsdu> psdu,
                  RxSignalInfo rxSignalInfo,
-                 WifiTxVector txVector,
-                 std::vector<bool> perMpduStatus);
+                 const WifiTxVector& txVector,
+                 const std::vector<bool>& perMpduStatus);
 
     /**
      * Information about the MPDU being received. The TXVECTOR is populated upon
@@ -111,14 +114,14 @@
     };
 
     /**
-     * \return the information about the MPDU being received by the PHY, if any. This information
+     * @return the information about the MPDU being received by the PHY, if any. This information
      *         is available from the time the PHY-RXSTART.indication is received until the end
      *         of PSDU reception
      */
     std::optional<std::reference_wrapper<const OngoingRxInfo>> GetOngoingRxInfo() const;
 
     /**
-     * \return the information about the MAC header of the MPDU being received by the PHY, if any.
+     * @return the information about the MAC header of the MPDU being received by the PHY, if any.
      *         The MAC header is available from the time its reception is completed until the end
      *         of PSDU reception
      */
@@ -127,37 +130,37 @@
     /**
      * Set the ID of the link this Frame Exchange Manager is associated with.
      *
-     * \param linkId the ID of the link this Frame Exchange Manager is associated with
+     * @param linkId the ID of the link this Frame Exchange Manager is associated with
      */
     virtual void SetLinkId(uint8_t linkId);
     /**
      * Set the MAC layer to use.
      *
-     * \param mac the MAC layer to use
+     * @param mac the MAC layer to use
      */
     virtual void SetWifiMac(const Ptr<WifiMac> mac);
     /**
      * Set the MAC TX Middle to use.
      *
-     * \param txMiddle the MAC TX Middle to use
+     * @param txMiddle the MAC TX Middle to use
      */
     virtual void SetMacTxMiddle(const Ptr<MacTxMiddle> txMiddle);
     /**
      * Set the MAC RX Middle to use.
      *
-     * \param rxMiddle the MAC RX Middle to use
+     * @param rxMiddle the MAC RX Middle to use
      */
     virtual void SetMacRxMiddle(const Ptr<MacRxMiddle> rxMiddle);
     /**
      * Set the channel access manager to use
      *
-     * \param channelAccessManager the channel access manager to use
+     * @param channelAccessManager the channel access manager to use
      */
     virtual void SetChannelAccessManager(const Ptr<ChannelAccessManager> channelAccessManager);
     /**
      * Set the PHY layer to use.
      *
-     * \param phy the PHY layer to use
+     * @param phy the PHY layer to use
      */
     virtual void SetWifiPhy(const Ptr<WifiPhy> phy);
     /**
@@ -167,53 +170,53 @@
     /**
      * Set the Protection Manager to use
      *
-     * \param protectionManager the Protection Manager to use
+     * @param protectionManager the Protection Manager to use
      */
     virtual void SetProtectionManager(Ptr<WifiProtectionManager> protectionManager);
     /**
      * Set the Acknowledgment Manager to use
      *
-     * \param ackManager the Acknowledgment Manager to use
+     * @param ackManager the Acknowledgment Manager to use
      */
     virtual void SetAckManager(Ptr<WifiAckManager> ackManager);
     /**
      * Set the MAC address.
      *
-     * \param address the MAC address
+     * @param address the MAC address
      */
     virtual void SetAddress(Mac48Address address);
     /**
      * Get the MAC address.
      *
-     * \return the MAC address
+     * @return the MAC address
      */
     Mac48Address GetAddress() const;
     /**
      * Set the Basic Service Set Identification.
      *
-     * \param bssid the BSSID
+     * @param bssid the BSSID
      */
     virtual void SetBssid(Mac48Address bssid);
     /**
      * Get the Basic Service Set Identification.
      *
-     * \return the BSSID
+     * @return the BSSID
      */
     Mac48Address GetBssid() const;
     /**
-     * \return the width of the channel that the FEM is allowed to use for the current transmission
+     * @return the width of the channel that the FEM is allowed to use for the current transmission
      */
     MHz_u GetAllowedWidth() const;
     /**
      * Set the callback to invoke when an MPDU is dropped.
      *
-     * \param callback the callback to invoke when an MPDU is dropped
+     * @param callback the callback to invoke when an MPDU is dropped
      */
     virtual void SetDroppedMpduCallback(DroppedMpdu callback);
     /**
      * Set the callback to invoke when an MPDU is successfully acked.
      *
-     * \param callback the callback to invoke when an MPDU is successfully acked
+     * @param callback the callback to invoke when an MPDU is successfully acked
      */
     void SetAckedMpduCallback(AckedMpdu callback);
     /**
@@ -223,7 +226,7 @@
     /**
      * Check if the device is operating in promiscuous mode.
      *
-     * \return true if the device is operating in promiscuous mode,
+     * @return true if the device is operating in promiscuous mode,
      *         false otherwise
      */
     bool IsPromisc() const;
@@ -231,14 +234,14 @@
     /**
      * Get a const reference to the WifiTxTimer object.
      *
-     * \return a const reference to the WifiTxTimer object
+     * @return a const reference to the WifiTxTimer object
      */
     const WifiTxTimer& GetWifiTxTimer() const;
 
     /**
      * Get the Protection Manager used by this node.
      *
-     * \return the Protection Manager used by this node
+     * @return the Protection Manager used by this node
      */
     Ptr<WifiProtectionManager> GetProtectionManager() const;
 
@@ -247,14 +250,14 @@
      * protection method. The protection time is stored in the protection
      * object itself.
      *
-     * \param protection the protection method
+     * @param protection the protection method
      */
     virtual void CalculateProtectionTime(WifiProtection* protection) const;
 
     /**
      * Get the Acknowledgment Manager used by this node.
      *
-     * \return the Acknowledgment Manager used by this node
+     * @return the Acknowledgment Manager used by this node
      */
     Ptr<WifiAckManager> GetAckManager() const;
 
@@ -263,29 +266,29 @@
      * acknowledgment method. The acknowledgment time is stored in the acknowledgment
      * object itself.
      *
-     * \param acknowledgment the acknowledgment method
+     * @param acknowledgment the acknowledgment method
      */
     virtual void CalculateAcknowledgmentTime(WifiAcknowledgment* acknowledgment) const;
 
     /**
-     * \return true if the virtual CS indication is that the medium is idle
+     * @return true if the virtual CS indication is that the medium is idle
      */
     virtual bool VirtualCsMediumIdle() const;
 
     /**
-     * \return the set of stations that have successfully received an RTS in this TXOP.
+     * @return the set of stations that have successfully received an RTS in this TXOP.
      */
     const std::set<Mac48Address>& GetProtectedStas() const;
 
     /**
      * Notify that an internal collision has occurred for the given Txop
      *
-     * \param txop the Txop for which an internal collision has occurred
+     * @param txop the Txop for which an internal collision has occurred
      */
     virtual void NotifyInternalCollision(Ptr<Txop> txop);
 
     /**
-     * \param duration switching delay duration.
+     * @param duration switching delay duration.
      *
      * This method is typically invoked by the PhyListener to notify
      * the MAC layer that a channel switching occurred. When a channel switching
@@ -311,7 +314,7 @@
     void DoDispose() override;
 
     /**
-     * \return the remote station manager operating on our link
+     * @return the remote station manager operating on our link
      */
     Ptr<WifiRemoteStationManager> GetWifiRemoteStationManager() const;
 
@@ -321,8 +324,8 @@
      * is applied, the given MPDU is dequeued from the MAC queue and the first
      * fragment is enqueued in its place.
      *
-     * \param mpdu the given MPDU
-     * \return the first fragment if fragmentation is needed, the given MPDU otherwise
+     * @param mpdu the given MPDU
+     * @return the first fragment if fragmentation is needed, the given MPDU otherwise
      */
     Ptr<WifiMpdu> GetFirstFragmentIfNeeded(Ptr<WifiMpdu> mpdu);
 
@@ -331,28 +334,29 @@
      * Note that <i>txParams</i> is moved to m_txParams and hence is left in an
      * undefined state.
      *
-     * \param mpdu the MPDU to send
-     * \param txParams the TX parameters to use to transmit the MPDU
+     * @param mpdu the MPDU to send
+     * @param txParams the TX parameters to use to transmit the MPDU
      */
     void SendMpduWithProtection(Ptr<WifiMpdu> mpdu, WifiTxParameters& txParams);
 
     /**
      * Start the protection mechanism indicated by the given TX parameters
      *
-     * \param txParams the TX parameters
+     * @param txParams the TX parameters
      */
     virtual void StartProtection(const WifiTxParameters& txParams);
 
     /**
-     * Transmit prepared frame upon successful protection mechanism.
+     * Transmit prepared frame immediately, if no protection was used, or in a SIFS, if protection
+     * was completed successfully.
      */
     virtual void ProtectionCompleted();
 
     /**
      * Update the NAV, if needed, based on the Duration/ID of the given <i>psdu</i>.
      *
-     * \param psdu the received PSDU
-     * \param txVector TxVector of the received PSDU
+     * @param psdu the received PSDU
+     * @param txVector TxVector of the received PSDU
      */
     virtual void UpdateNav(Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector);
 
@@ -364,17 +368,17 @@
     /**
      * This method is called when the reception of a PSDU fails.
      *
-     * \param psdu the PSDU whose reception failed
+     * @param psdu the PSDU whose reception failed
      */
     virtual void PsduRxError(Ptr<const WifiPsdu> psdu);
 
     /**
      * This method handles the reception of an MPDU (possibly included in an A-MPDU)
      *
-     * \param mpdu the received MPDU
-     * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
-     * \param txVector TxVector of the received PSDU
-     * \param inAmpdu true if the MPDU is part of an A-MPDU
+     * @param mpdu the received MPDU
+     * @param rxSignalInfo the info on the received signal (\see RxSignalInfo)
+     * @param txVector TxVector of the received PSDU
+     * @param inAmpdu true if the MPDU is part of an A-MPDU
      */
     virtual void ReceiveMpdu(Ptr<const WifiMpdu> mpdu,
                              RxSignalInfo rxSignalInfo,
@@ -385,10 +389,10 @@
      * This method is called when the reception of an A-MPDU including multiple
      * MPDUs is completed.
      *
-     * \param psdu the received PSDU
-     * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
-     * \param txVector TxVector of the received PSDU
-     * \param perMpduStatus per MPDU reception status
+     * @param psdu the received PSDU
+     * @param rxSignalInfo the info on the received signal (\see RxSignalInfo)
+     * @param txVector TxVector of the received PSDU
+     * @param perMpduStatus per MPDU reception status
      */
     virtual void EndReceiveAmpdu(Ptr<const WifiPsdu> psdu,
                                  const RxSignalInfo& rxSignalInfo,
@@ -398,11 +402,11 @@
     /**
      * Perform the actions needed when a Normal Ack is received.
      *
-     * \param mpdu the MPDU that was acknowledged
-     * \param txVector the TXVECTOR used to transmit the MPDU that was acknowledged
-     * \param ackTxVector the TXVECTOR used to transmit the Normal Ack frame
-     * \param rxInfo the info on the received signal (\see RxSignalInfo)
-     * \param snr the SNR at the receiver for the MPDU that was acknowledged
+     * @param mpdu the MPDU that was acknowledged
+     * @param txVector the TXVECTOR used to transmit the MPDU that was acknowledged
+     * @param ackTxVector the TXVECTOR used to transmit the Normal Ack frame
+     * @param rxInfo the info on the received signal (\see RxSignalInfo)
+     * @param snr the SNR at the receiver for the MPDU that was acknowledged
      */
     virtual void ReceivedNormalAck(Ptr<WifiMpdu> mpdu,
                                    const WifiTxVector& txVector,
@@ -413,14 +417,14 @@
     /**
      * Notify other components that an MPDU was acknowledged.
      *
-     * \param mpdu the MPDU that was acknowledged
+     * @param mpdu the MPDU that was acknowledged
      */
     virtual void NotifyReceivedNormalAck(Ptr<WifiMpdu> mpdu);
 
     /**
      * Retransmit an MPDU that was not acknowledged.
      *
-     * \param mpdu the MPDU to retransmit
+     * @param mpdu the MPDU to retransmit
      */
     virtual void RetransmitMpduAfterMissedAck(Ptr<WifiMpdu> mpdu) const;
 
@@ -428,7 +432,7 @@
      * Make the sequence numbers of MPDUs included in the given PSDU available again
      * if the MPDUs have never been transmitted.
      *
-     * \param psdu the given PSDU
+     * @param psdu the given PSDU
      */
     virtual void ReleaseSequenceNumbers(Ptr<const WifiPsdu> psdu) const;
 
@@ -436,7 +440,7 @@
      * Pass the given MPDU, discarded because of the max retry limit was reached,
      * to the MPDU dropped callback.
      *
-     * \param mpdu the discarded MPDU
+     * @param mpdu the discarded MPDU
      */
     virtual void NotifyPacketDiscarded(Ptr<const WifiMpdu> mpdu);
 
@@ -445,8 +449,8 @@
      * independently of whether the frame is addressed to this station
      * (e.g., storing buffer status reports).
      *
-     * \param psdu the received PSDU
-     * \param txVector TX vector of the received PSDU
+     * @param psdu the received PSDU
+     * @param txVector TX vector of the received PSDU
      */
     virtual void PreProcessFrame(Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector);
 
@@ -455,8 +459,8 @@
      * independently of whether the frame is addressed to this station
      * (e.g., setting the NAV or the TXOP holder).
      *
-     * \param psdu the received PSDU
-     * \param txVector TX vector of the received PSDU
+     * @param psdu the received PSDU
+     * @param txVector TX vector of the received PSDU
      */
     virtual void PostProcessFrame(Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector);
 
@@ -465,10 +469,10 @@
      * parameters if the size of the PSDU addressed to the given receiver
      * becomes <i>ppduPayloadSize</i>.
      *
-     * \param ppduPayloadSize the new PSDU size
-     * \param receiver the MAC address of the receiver of the PSDU
-     * \param txParams the TX parameters
-     * \return the updated TX duration
+     * @param ppduPayloadSize the new PSDU size
+     * @param receiver the MAC address of the receiver of the PSDU
+     * @param txParams the TX parameters
+     * @return the updated TX duration
      */
     virtual Time GetTxDuration(uint32_t ppduPayloadSize,
                                Mac48Address receiver,
@@ -478,8 +482,8 @@
      * Update the TX duration field of the given TX parameters after that the PSDU
      * addressed to the given receiver has changed.
      *
-     * \param receiver the MAC address of the receiver of the PSDU
-     * \param txParams the TX parameters
+     * @param receiver the MAC address of the receiver of the PSDU
+     * @param txParams the TX parameters
      */
     void UpdateTxDuration(Mac48Address receiver, WifiTxParameters& txParams) const;
 
@@ -488,23 +492,26 @@
      * given TXVECTOR. The purpose of this method is that it can be overridden to
      * compute the size of an S-MPDU.
      *
-     * \param mpdu the given MPDU
-     * \param txVector the given TXVECTOR
-     * \return the size of the MPDU
+     * @param mpdu the given MPDU
+     * @param txVector the given TXVECTOR
+     * @return the size of the MPDU
      */
     virtual uint32_t GetPsduSize(Ptr<const WifiMpdu> mpdu, const WifiTxVector& txVector) const;
 
     /**
      * Notify the given Txop that channel has been released.
      *
-     * \param txop the given Txop
+     * @param txop the given Txop
      */
     virtual void NotifyChannelReleased(Ptr<Txop> txop);
 
     Ptr<Txop> m_dcf;                                  //!< the DCF/EDCAF that gained channel access
     WifiTxTimer m_txTimer;                            //!< the timer set upon frame transmission
     EventId m_navResetEvent;                          //!< the event to reset the NAV after an RTS
+    EventId m_sendCtsEvent;                           //!< the event to send a CTS after an (MU-)RTS
     Ptr<WifiMac> m_mac;                               //!< the MAC layer on this station
+    Ptr<ApWifiMac> m_apMac;                           //!< AP MAC layer pointer (null if not an AP)
+    Ptr<StaWifiMac> m_staMac;                         //!< STA MAC layer pointer (null if not a STA)
     Ptr<MacTxMiddle> m_txMiddle;                      //!< the MAC TX Middle on this station
     Ptr<MacRxMiddle> m_rxMiddle;                      //!< the MAC RX Middle on this station
     Ptr<ChannelAccessManager> m_channelAccessManager; //!< the channel access manager
@@ -512,34 +519,39 @@
     Mac48Address m_self;                              //!< the MAC address of this device
     Mac48Address m_bssid;                             //!< BSSID address (Mac48Address)
     Time m_navEnd;                                    //!< NAV expiration time
+    Time m_txNav;                                     //!< the TXNAV timer
     std::set<Mac48Address> m_sentRtsTo; //!< the STA(s) which we sent an RTS to (waiting for CTS)
+    std::set<Mac48Address>
+        m_sentFrameTo; //!< the STA(s) to which we sent a frame requesting a response
     std::set<Mac48Address> m_protectedStas; //!< STAs that have replied to an RTS in this TXOP
-    uint8_t m_linkId;                       //!< the ID of the link this object is associated with
-    MHz_u m_allowedWidth;                   //!< the allowed width for the current transmission
-    bool m_promisc;                         //!< Flag if the device is operating in promiscuous mode
-    DroppedMpdu m_droppedMpduCallback;      //!< the dropped MPDU callback
-    AckedMpdu m_ackedMpduCallback;          //!< the acknowledged MPDU callback
+    bool m_protectedIfResponded;       //!< whether a STA is assumed to be protected if replied to a
+                                       //!< frame requiring acknowledgment
+    uint8_t m_linkId;                  //!< the ID of the link this object is associated with
+    MHz_u m_allowedWidth;              //!< the allowed width for the current transmission
+    bool m_promisc;                    //!< Flag if the device is operating in promiscuous mode
+    DroppedMpdu m_droppedMpduCallback; //!< the dropped MPDU callback
+    AckedMpdu m_ackedMpduCallback;     //!< the acknowledged MPDU callback
 
     /**
      * Finalize the MAC header of the MPDUs in the given PSDU before transmission. Tasks
      * performed by this method include setting the Power Management flag in the MAC header.
      *
-     * \param psdu the given PSDU
+     * @param psdu the given PSDU
      */
     virtual void FinalizeMacHeader(Ptr<const WifiPsdu> psdu);
 
     /**
      * Forward an MPDU down to the PHY layer.
      *
-     * \param mpdu the MPDU to forward down
-     * \param txVector the TXVECTOR used to transmit the MPDU
+     * @param mpdu the MPDU to forward down
+     * @param txVector the TXVECTOR used to transmit the MPDU
      */
     virtual void ForwardMpduDown(Ptr<WifiMpdu> mpdu, WifiTxVector& txVector);
 
     /**
      * Dequeue the given MPDU from the queue in which it is stored.
      *
-     * \param mpdu the given MPDU
+     * @param mpdu the given MPDU
      */
     virtual void DequeueMpdu(Ptr<const WifiMpdu> mpdu);
 
@@ -547,12 +559,12 @@
      * Compute how to set the Duration/ID field of a frame being transmitted with
      * the given TX parameters
      *
-     * \param header the MAC header of the frame
-     * \param size the size of the frame in bytes
-     * \param txParams the TX parameters used to send the frame
-     * \param fragmentedPacket the packet that originated the frame to transmit, in case
+     * @param header the MAC header of the frame
+     * @param size the size of the frame in bytes
+     * @param txParams the TX parameters used to send the frame
+     * @param fragmentedPacket the packet that originated the frame to transmit, in case
      *                         the latter is a fragment
-     * \return the computed Duration/ID value
+     * @return the computed Duration/ID value
      */
     virtual Time GetFrameDurationId(const WifiMacHeader& header,
                                     uint32_t size,
@@ -563,10 +575,10 @@
      * Compute how to set the Duration/ID field of an RTS frame to send to protect
      * a frame transmitted with the given TX vector.
      *
-     * \param rtsTxVector the TX vector used to send the RTS frame
-     * \param txDuration the TX duration of the data frame
-     * \param response the time taken by the response (acknowledgment) to the data frame
-     * \return the computed Duration/ID value for the RTS frame
+     * @param rtsTxVector the TX vector used to send the RTS frame
+     * @param txDuration the TX duration of the data frame
+     * @param response the time taken by the response (acknowledgment) to the data frame
+     * @return the computed Duration/ID value for the RTS frame
      */
     virtual Time GetRtsDurationId(const WifiTxVector& rtsTxVector,
                                   Time txDuration,
@@ -575,25 +587,25 @@
     /**
      * Send RTS to begin RTS-CTS-Data-Ack transaction.
      *
-     * \param txParams the TX parameters for the data frame
+     * @param txParams the TX parameters for the data frame
      */
     void SendRts(const WifiTxParameters& txParams);
 
     /**
      * Send CTS after receiving RTS.
      *
-     * \param rtsHdr the header of the received RTS
-     * \param rtsTxMode the TX mode used to transmit the RTS
-     * \param rtsSnr the SNR of the RTS in linear scale
+     * @param rtsHdr the header of the received RTS
+     * @param rtsTxMode the TX mode used to transmit the RTS
+     * @param rtsSnr the SNR of the RTS in linear scale
      */
     virtual void SendCtsAfterRts(const WifiMacHeader& rtsHdr, WifiMode rtsTxMode, double rtsSnr);
 
     /**
      * Send CTS after receiving RTS.
      *
-     * \param rtsHdr the header of the received RTS
-     * \param ctsTxVector the TXVECTOR to use to transmit the CTS
-     * \param rtsSnr the SNR of the RTS in linear scale
+     * @param rtsHdr the header of the received RTS
+     * @param ctsTxVector the TXVECTOR to use to transmit the CTS
+     * @param rtsSnr the SNR of the RTS in linear scale
      */
     void DoSendCtsAfterRts(const WifiMacHeader& rtsHdr, WifiTxVector& ctsTxVector, double rtsSnr);
 
@@ -601,10 +613,10 @@
      * Compute how to set the Duration/ID field of a CTS-to-self frame to send to
      * protect a frame transmitted with the given TX vector.
      *
-     * \param ctsTxVector the TX vector used to send the CTS-to-self frame
-     * \param txDuration the TX duration of the data frame
-     * \param response the time taken by the response (acknowledgment) to the data frame
-     * \return the computed Duration/ID value for the CTS-to-self frame
+     * @param ctsTxVector the TX vector used to send the CTS-to-self frame
+     * @param txDuration the TX duration of the data frame
+     * @param response the time taken by the response (acknowledgment) to the data frame
+     * @return the computed Duration/ID value for the CTS-to-self frame
      */
     virtual Time GetCtsToSelfDurationId(const WifiTxVector& ctsTxVector,
                                         Time txDuration,
@@ -613,16 +625,16 @@
     /**
      * Send CTS for a CTS-to-self mechanism.
      *
-     * \param txParams the TX parameters for the data frame
+     * @param txParams the TX parameters for the data frame
      */
     void SendCtsToSelf(const WifiTxParameters& txParams);
 
     /**
      * Send Normal Ack.
      *
-     * \param hdr the header of the frame soliciting the Normal Ack
-     * \param dataTxVector the TXVECTOR used to transmit the frame soliciting the Normal Ack
-     * \param dataSnr the SNR of the frame soliciting the Normal Ack in linear scale
+     * @param hdr the header of the frame soliciting the Normal Ack
+     * @param dataTxVector the TXVECTOR used to transmit the frame soliciting the Normal Ack
+     * @param dataSnr the SNR of the frame soliciting the Normal Ack in linear scale
      */
     void SendNormalAck(const WifiMacHeader& hdr, const WifiTxVector& dataTxVector, double dataSnr);
 
@@ -630,7 +642,7 @@
      * Get the next fragment of the current MSDU.
      * Only called for fragmented MSDUs.
      *
-     * \return the next fragment of the current MSDU.
+     * @return the next fragment of the current MSDU.
      */
     Ptr<WifiMpdu> GetNextFragment();
 
@@ -643,40 +655,59 @@
     /**
      * Take necessary actions upon a transmission failure. A non-QoS station
      * releases the channel when this method is called.
+     *
+     * @param forceCurrentCw whether to force the contention window to stay equal to the current
+     *                       value (normally, contention window is updated upon TX failure)
      */
-    virtual void TransmissionFailed();
+    virtual void TransmissionFailed(bool forceCurrentCw = false);
+
+    /**
+     * Wrapper for the GetMpdusToDropOnTxFailure function of the remote station manager that
+     * additionally drops the MPDUs in the given PSDU that the remote station manager requested
+     * to drop.
+     *
+     * @param psdu the given PSDU
+     * @return an MPDU that has been dropped, if any, to be notified to the remote station manager
+     *         through the appropriate function
+     */
+    Ptr<WifiMpdu> DropMpduIfRetryLimitReached(Ptr<WifiPsdu> psdu);
 
     /**
      * Called when the Ack timeout expires.
      *
-     * \param mpdu the MPDU that solicited a Normal Ack response
-     * \param txVector the TXVECTOR used to transmit the frame soliciting the Normal Ack
+     * @param mpdu the MPDU that solicited a Normal Ack response
+     * @param txVector the TXVECTOR used to transmit the frame soliciting the Normal Ack
      */
     virtual void NormalAckTimeout(Ptr<WifiMpdu> mpdu, const WifiTxVector& txVector);
 
     /**
      * Called when the CTS timeout expires.
      *
-     * \param rts the RTS that solicited a CTS response
-     * \param txVector the TXVECTOR used to transmit the RTS frame
+     * @param rts the RTS that solicited a CTS response
+     * @param txVector the TXVECTOR used to transmit the RTS frame
      */
     virtual void CtsTimeout(Ptr<WifiMpdu> rts, const WifiTxVector& txVector);
     /**
      * Take required actions when the CTS timer fired after sending an RTS to
      * protect the given PSDU expires.
      *
-     * \param psdu the PSDU protected by the failed RTS
+     * @param psdu the PSDU protected by the failed RTS
      */
     void DoCtsTimeout(Ptr<WifiPsdu> psdu);
 
     /**
+     * @return whether CW shall be updated on CTS timeout
+     */
+    virtual bool GetUpdateCwOnCtsTimeout() const;
+
+    /**
      * Reset this frame exchange manager.
      */
     virtual void Reset();
 
     /**
-     * \param txVector the TXVECTOR decoded from PHY header.
-     * \param psduDuration the duration of the PSDU that is about to be received.
+     * @param txVector the TXVECTOR decoded from PHY header.
+     * @param psduDuration the duration of the PSDU that is about to be received.
      *
      * This method is typically invoked by the lower PHY layer to notify
      * the MAC layer that the reception of a PSDU is starting.
@@ -689,14 +720,21 @@
     /**
      * Store information about the MAC header of the MPDU being received.
      *
-     * \param macHdr the MAC header of the MPDU being received
-     * \param txVector the TXVECTOR used to transmit the PSDU
-     * \param psduDuration the remaining duration of the PSDU
+     * @param macHdr the MAC header of the MPDU being received
+     * @param txVector the TXVECTOR used to transmit the PSDU
+     * @param psduDuration the remaining duration of the PSDU
      */
     virtual void ReceivedMacHdr(const WifiMacHeader& macHdr,
                                 const WifiTxVector& txVector,
                                 Time psduDuration);
 
+    /**
+     * Notify the last (re)transmission of a groupcast MPDU using the GCR-UR service.
+     *
+     * @param mpdu the groupcast MPDU
+     */
+    virtual void NotifyLastGcrUrTx(Ptr<const WifiMpdu> mpdu);
+
   private:
     /**
      * Send the current MPDU, which can be acknowledged by a Normal Ack.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/gcr-group-address.cc ns-3.44/src/wifi/model/gcr-group-address.cc
--- ns-3.43/src/wifi/model/gcr-group-address.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/wifi/model/gcr-group-address.cc	2025-03-09 16:55:49.787372600 -0700
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2023 Universita' degli Studi di Napoli Federico II
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#include "gcr-group-address.h"
+
+#include "ns3/address-utils.h"
+
+namespace ns3
+{
+
+void
+GcrGroupAddress::Print(std::ostream& os) const
+{
+    os << "gcrGroupAddress=" << m_gcrGroupAddress;
+}
+
+WifiInformationElementId
+GcrGroupAddress::ElementId() const
+{
+    return IE_GCR_GROUP_ADDRESS;
+}
+
+uint16_t
+GcrGroupAddress::GetInformationFieldSize() const
+{
+    return 6; // GCR Group Address field
+}
+
+void
+GcrGroupAddress::SerializeInformationField(Buffer::Iterator start) const
+{
+    WriteTo(start, m_gcrGroupAddress);
+}
+
+uint16_t
+GcrGroupAddress::DeserializeInformationField(Buffer::Iterator start, uint16_t length)
+{
+    ReadFrom(start, m_gcrGroupAddress);
+    return 6;
+}
+
+} // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/gcr-group-address.h ns-3.44/src/wifi/model/gcr-group-address.h
--- ns-3.43/src/wifi/model/gcr-group-address.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/wifi/model/gcr-group-address.h	2025-03-09 16:55:49.787372600 -0700
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2023 Universita' degli Studi di Napoli Federico II
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#ifndef GCR_GROUP_ADDRESS_H
+#define GCR_GROUP_ADDRESS_H
+
+#include "wifi-information-element.h"
+
+#include "ns3/mac48-address.h"
+
+namespace ns3
+{
+
+/**
+ * @ingroup wifi
+ *
+ * The IEEE 802.11 GCR Group Address Element (Sec. 9.4.2.125 of 802.11-2020)
+ */
+class GcrGroupAddress : public WifiInformationElement
+{
+  public:
+    GcrGroupAddress() = default;
+
+    WifiInformationElementId ElementId() const override;
+    void Print(std::ostream& os) const override;
+
+    Mac48Address m_gcrGroupAddress; //!< GCR Group Address field
+
+  private:
+    uint16_t GetInformationFieldSize() const override;
+    void SerializeInformationField(Buffer::Iterator start) const override;
+    uint16_t DeserializeInformationField(Buffer::Iterator start, uint16_t length) override;
+};
+
+} // namespace ns3
+
+#endif /* GCR_GROUP_ADDRESS_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/gcr-manager.cc ns-3.44/src/wifi/model/gcr-manager.cc
--- ns-3.43/src/wifi/model/gcr-manager.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/wifi/model/gcr-manager.cc	2025-03-09 16:55:49.787372600 -0700
@@ -0,0 +1,256 @@
+/*
+ * Copyright (c) 2023 DERONNE SOFTWARE ENGINEERING
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+#include "gcr-manager.h"
+
+#include "ap-wifi-mac.h"
+#include "wifi-mpdu.h"
+
+#include "ns3/enum.h"
+#include "ns3/log.h"
+#include "ns3/uinteger.h"
+
+#include <algorithm>
+
+namespace ns3
+{
+
+NS_LOG_COMPONENT_DEFINE("GcrManager");
+
+NS_OBJECT_ENSURE_REGISTERED(GcrManager);
+
+TypeId
+GcrManager::GetTypeId()
+{
+    static TypeId tid =
+        TypeId("ns3::GcrManager")
+            .SetParent<Object>()
+            .SetGroupName("Wifi")
+            .AddAttribute("RetransmissionPolicy",
+                          "The retransmission policy to use for group addresses.",
+                          TypeId::ATTR_GET |
+                              TypeId::ATTR_CONSTRUCT, // prevent setting after construction
+                          EnumValue(GroupAddressRetransmissionPolicy::NO_ACK_NO_RETRY),
+                          MakeEnumAccessor<GroupAddressRetransmissionPolicy>(
+                              &GcrManager::m_retransmissionPolicy),
+                          MakeEnumChecker(GroupAddressRetransmissionPolicy::NO_ACK_NO_RETRY,
+                                          "NO_RETRY",
+                                          GroupAddressRetransmissionPolicy::GCR_UNSOLICITED_RETRY,
+                                          "GCR_UR",
+                                          GroupAddressRetransmissionPolicy::GCR_BLOCK_ACK,
+                                          "GCR_BA"))
+            .AddAttribute(
+                "GcrProtectionMode",
+                "Protection mode used for groupcast frames when needed: "
+                "Rts-Cts or Cts-To-Self",
+                EnumValue(GroupcastProtectionMode::RTS_CTS),
+                MakeEnumAccessor<GroupcastProtectionMode>(&GcrManager::m_gcrProtectionMode),
+                MakeEnumChecker(GroupcastProtectionMode::RTS_CTS,
+                                "Rts-Cts",
+                                GroupcastProtectionMode::CTS_TO_SELF,
+                                "Cts-To-Self"))
+            .AddAttribute("UnsolicitedRetryLimit",
+                          "The maximum number of transmission attempts of a frame delivered using "
+                          "the GCR unsolicited retry retransmission policy.",
+                          UintegerValue(7),
+                          MakeUintegerAccessor(&GcrManager::m_gcrUnsolicitedRetryLimit),
+                          MakeUintegerChecker<uint8_t>())
+            .AddAttribute("GcrConcealmentAddress",
+                          "The GCR concealment address.",
+                          Mac48AddressValue(Mac48Address("01:0F:AC:47:43:52")),
+                          MakeMac48AddressAccessor(&GcrManager::SetGcrConcealmentAddress,
+                                                   &GcrManager::GetGcrConcealmentAddress),
+                          MakeMac48AddressChecker());
+    return tid;
+}
+
+GcrManager::GcrManager()
+    : m_unsolicitedRetryCounter{0}
+{
+    NS_LOG_FUNCTION(this);
+}
+
+GcrManager::~GcrManager()
+{
+    NS_LOG_FUNCTION(this);
+}
+
+void
+GcrManager::DoDispose()
+{
+    NS_LOG_FUNCTION(this);
+    m_apMac = nullptr;
+    Object::DoDispose();
+}
+
+void
+GcrManager::SetWifiMac(Ptr<ApWifiMac> mac)
+{
+    NS_LOG_FUNCTION(this << mac);
+    NS_ASSERT(mac);
+    m_apMac = mac;
+
+    NS_ABORT_MSG_IF(m_apMac->GetTypeOfStation() != AP || !m_apMac->GetQosSupported(),
+                    "GcrManager can only be installed on QoS APs");
+}
+
+GroupAddressRetransmissionPolicy
+GcrManager::GetRetransmissionPolicy() const
+{
+    return m_retransmissionPolicy;
+}
+
+GroupAddressRetransmissionPolicy
+GcrManager::GetRetransmissionPolicyFor(const WifiMacHeader& header) const
+{
+    NS_ASSERT_MSG(header.IsQosData() && IsGroupcast(header.GetAddr1()),
+                  "GCR service is only for QoS groupcast data frames");
+
+    // 11.21.16.3.4 GCR operation:
+    // A STA providing GCR service may switch between the DMS,
+    // GCR block ack, or GCR unsolicited retry retransmission policies
+
+    // This is a retry, use configured retransmission policy
+    if (header.IsRetry())
+    {
+        return m_retransmissionPolicy;
+    }
+
+    // This is not a retry but all STAs are GCR-capable, use configured retransmission policy
+    if (m_nonGcrStas.empty())
+    {
+        return m_retransmissionPolicy;
+    }
+
+    // not a retry and GCR-incapable STA(s) present, transmit using No-Ack/No-Retry
+    return GroupAddressRetransmissionPolicy::NO_ACK_NO_RETRY;
+}
+
+void
+GcrManager::SetGcrConcealmentAddress(const Mac48Address& address)
+{
+    NS_LOG_FUNCTION(this << address);
+    NS_ASSERT_MSG(address.IsGroup(), "The concealment address should be a group address");
+    m_gcrConcealmentAddress = address;
+}
+
+const Mac48Address&
+GcrManager::GetGcrConcealmentAddress() const
+{
+    return m_gcrConcealmentAddress;
+}
+
+bool
+GcrManager::UseConcealment(const WifiMacHeader& header) const
+{
+    NS_ASSERT_MSG(header.IsQosData() && IsGroupcast(header.GetAddr1()),
+                  "GCR service is only for QoS groupcast data frames");
+    NS_ASSERT_MSG(m_retransmissionPolicy != GroupAddressRetransmissionPolicy::NO_ACK_NO_RETRY,
+                  "GCR service is not enabled");
+    NS_ASSERT_MSG(!m_staMembers.empty(), "GCR service should not be used");
+
+    // Only GCR capable STAs, hence concealment is always used
+    if (m_nonGcrStas.empty())
+    {
+        return true;
+    }
+    // If A-MSDU is used, that means previous transmission was already concealed
+    if (header.IsQosAmsdu())
+    {
+        return true;
+    }
+    // Otherwise, use concealment except for the first transmission (hence when it is a retry)
+    return header.IsRetry();
+}
+
+bool
+GcrManager::KeepGroupcastQueued(Ptr<WifiMpdu> mpdu)
+{
+    NS_LOG_FUNCTION(this << *mpdu);
+    NS_ASSERT_MSG(mpdu->GetHeader().IsQosData() && IsGroupcast(mpdu->GetHeader().GetAddr1()),
+                  "GCR service is only for QoS groupcast data frames");
+    NS_ASSERT_MSG(m_retransmissionPolicy != GroupAddressRetransmissionPolicy::NO_ACK_NO_RETRY,
+                  "GCR service is not enabled");
+    NS_ASSERT_MSG(!m_staMembers.empty(), "GCR service should not be used");
+    if (m_retransmissionPolicy == GroupAddressRetransmissionPolicy::GCR_BLOCK_ACK)
+    {
+        return !mpdu->GetHeader().IsRetry() && !m_nonGcrStas.empty();
+    }
+    if (!m_mpdu || !mpdu->GetHeader().IsRetry())
+    {
+        m_unsolicitedRetryCounter = 0;
+        m_mpdu = mpdu;
+        NS_LOG_DEBUG("First groupcast transmission using No-Ack/No-Retry");
+    }
+    else
+    {
+        m_unsolicitedRetryCounter++;
+        NS_LOG_DEBUG("GCR solicited retry counter increased to " << +m_unsolicitedRetryCounter);
+    }
+    if (m_unsolicitedRetryCounter == m_gcrUnsolicitedRetryLimit)
+    {
+        NS_LOG_DEBUG("Last groupcast transmission retry done");
+        m_mpdu = nullptr;
+        m_unsolicitedRetryCounter = 0;
+        return false;
+    }
+    return true;
+}
+
+void
+GcrManager::NotifyStaAssociated(const Mac48Address& staAddress, bool gcrCapable)
+{
+    if (m_retransmissionPolicy == GroupAddressRetransmissionPolicy::NO_ACK_NO_RETRY)
+    {
+        // GCR is not used and we do not support run-time change of the retransmission policy
+        return;
+    }
+    NS_LOG_FUNCTION(this << staAddress << gcrCapable);
+    if (gcrCapable)
+    {
+        NS_ASSERT(m_staMembers.count(staAddress) == 0);
+        m_staMembers.insert(staAddress);
+    }
+    else
+    {
+        NS_ASSERT(m_nonGcrStas.count(staAddress) == 0);
+        m_nonGcrStas.insert(staAddress);
+    }
+}
+
+void
+GcrManager::NotifyStaDeassociated(const Mac48Address& staAddress)
+{
+    if (m_retransmissionPolicy == GroupAddressRetransmissionPolicy::NO_ACK_NO_RETRY)
+    {
+        // GCR is not used and we do not support run-time change of the retransmission policy
+        return;
+    }
+    NS_LOG_FUNCTION(this << staAddress);
+    m_nonGcrStas.erase(staAddress);
+    m_staMembers.erase(staAddress);
+}
+
+const GcrManager::GcrMembers&
+GcrManager::GetMemberStasForGroupAddress(const Mac48Address& /* groupAddress */) const
+{
+    // TODO: we currently assume all STAs belong to all group addresses
+    // as long as group membership action frame is not implemented
+    return m_staMembers;
+}
+
+void
+GcrManager::NotifyGroupMembershipChanged(const Mac48Address& staAddress,
+                                         const std::set<Mac48Address>& groupAddressList)
+{
+    NS_LOG_FUNCTION(this << staAddress << groupAddressList.size());
+    // TODO: group membership is not implemented yet, current implementation assumes GCR STAs are
+    // members of all groups
+}
+
+} // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/gcr-manager.h ns-3.44/src/wifi/model/gcr-manager.h
--- ns-3.43/src/wifi/model/gcr-manager.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/wifi/model/gcr-manager.h	2025-03-09 16:55:49.787372600 -0700
@@ -0,0 +1,177 @@
+/*
+ * Copyright (c) 2023 DERONNE SOFTWARE ENGINEERING
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+#ifndef GCR_MANAGER_H
+#define GCR_MANAGER_H
+
+#include "qos-utils.h"
+
+#include "ns3/mac48-address.h"
+#include "ns3/object.h"
+
+#include <set>
+#include <unordered_set>
+
+namespace ns3
+{
+
+class ApWifiMac;
+class WifiMpdu;
+
+/**
+ * @brief The possible values for group address retransmission policy
+ */
+enum class GroupAddressRetransmissionPolicy : uint8_t
+{
+    NO_ACK_NO_RETRY = 0,
+    GCR_UNSOLICITED_RETRY,
+    GCR_BLOCK_ACK
+};
+
+/// Groupcast protection mode enumeration
+enum GroupcastProtectionMode : uint8_t
+{
+    RTS_CTS,
+    CTS_TO_SELF
+};
+
+/**
+ * @ingroup wifi
+ *
+ * GcrManager is a base class defining the API to handle 802.11aa GCR.
+ */
+class GcrManager : public Object
+{
+  public:
+    /**
+     * @brief Get the type ID.
+     * @return the object TypeId
+     */
+    static TypeId GetTypeId();
+
+    GcrManager();
+    ~GcrManager() override;
+
+    /**
+     * Set the wifi MAC. Note that it must be the MAC of a QoS AP.
+     *
+     * @param mac the wifi MAC
+     */
+    void SetWifiMac(Ptr<ApWifiMac> mac);
+
+    /**
+     * Get the configured retransmission policy.
+     *
+     * @return the configured retransmission policy
+     */
+    GroupAddressRetransmissionPolicy GetRetransmissionPolicy() const;
+
+    /**
+     * Get the retransmission policy to use to transmit a given group addressed packet.
+     *
+     * @param header the header of the groupcast frame
+     * @return the retransmission policy to use
+     */
+    GroupAddressRetransmissionPolicy GetRetransmissionPolicyFor(const WifiMacHeader& header) const;
+
+    /**
+     * Set the GCR concealment address.
+     *
+     * @param address the GCR concealment address
+     */
+    void SetGcrConcealmentAddress(const Mac48Address& address);
+
+    /**
+     * Get the GCR concealment address.
+     *
+     * @return the GCR concealment address
+     */
+    const Mac48Address& GetGcrConcealmentAddress() const;
+
+    /**
+     * Indicate whether a group addressed packet should be transmitted to the GCR concealment
+     * address.
+     *
+     * @param header the header of the groupcast packet
+     * @return whether GCR concealment should be used
+     */
+    bool UseConcealment(const WifiMacHeader& header) const;
+
+    /**
+     * This function indicates whether a groupcast MPDU should be kept for next retransmission.
+     *
+     * @param mpdu the groupcast MPDU
+     * @return whether a groupcast MPDU should be kept for next retransmission
+     */
+    bool KeepGroupcastQueued(Ptr<WifiMpdu> mpdu);
+
+    /**
+     * This function notifies a STA is associated.
+     *
+     * @param staAddress the MAC address of the STA
+     * @param isGcrCapable whether GCR is supported by the STA
+     */
+    void NotifyStaAssociated(const Mac48Address& staAddress, bool isGcrCapable);
+
+    /**
+     * This function deletes a STA as a member of any group addresses.
+     *
+     * @param staAddress the MAC address of the STA
+     */
+    void NotifyStaDeassociated(const Mac48Address& staAddress);
+
+    /**
+     * This function adds a STA as a member of zero or more group addresses.
+     *
+     * @param staAddress the MAC address of the STA
+     * @param groupAddressList zero or more MAC addresses to indicate the set of group addressed MAC
+     * addresses for which the STA receives frames
+     */
+    void NotifyGroupMembershipChanged(const Mac48Address& staAddress,
+                                      const std::set<Mac48Address>& groupAddressList);
+
+    /// MAC addresses of member STAs of a GCR group
+    using GcrMembers = std::unordered_set<Mac48Address, WifiAddressHash>;
+
+    /**
+     * Get the list of MAC addresses of member STAs for a given group address.
+     * @param groupAddress the group address
+     * @return list of MAC addresses of member STAs for the group address
+     */
+    const GcrMembers& GetMemberStasForGroupAddress(const Mac48Address& groupAddress) const;
+
+    /**
+     * Get the MAC address of the individually addressed recipient to use for a groupcast frame
+     * or for a protection frame sent prior to groupcast frames for a given group address.
+     * @param groupAddress the group address
+     * @return the MAC address of the individually addressed recipient to use.
+     */
+    virtual Mac48Address GetIndividuallyAddressedRecipient(
+        const Mac48Address& groupAddress) const = 0;
+
+  protected:
+    void DoDispose() override;
+
+    /// List of associated STAs that are not GCR capable
+    using NonGcrStas = GcrMembers;
+
+    Ptr<ApWifiMac> m_apMac;                                  //!< the MAC of the AP
+    GroupAddressRetransmissionPolicy m_retransmissionPolicy; //!< retransmission policy
+    uint8_t m_gcrUnsolicitedRetryLimit;                      //!< GCR Unsolicited Retry Limit
+    uint8_t m_unsolicitedRetryCounter;                       //!< the unsolicited retry counter
+    Ptr<WifiMpdu> m_mpdu;                                    //!< current MPDU being retransmitted
+    NonGcrStas m_nonGcrStas;                                 //!< the list of non-GCR capable STAs
+    GcrMembers m_staMembers; //!< the list of STA members (assume currently each member is part of
+                             //!< all group)
+    GroupcastProtectionMode m_gcrProtectionMode; //!< Protection mode for groupcast frames
+    Mac48Address m_gcrConcealmentAddress;        //!< GCR concealment address
+};
+
+} // namespace ns3
+
+#endif /* GCR_MANAGER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/he/constant-obss-pd-algorithm.cc ns-3.44/src/wifi/model/he/constant-obss-pd-algorithm.cc
--- ns-3.43/src/wifi/model/he/constant-obss-pd-algorithm.cc	2024-10-09 16:41:10.120656700 -0700
+++ ns-3.44/src/wifi/model/he/constant-obss-pd-algorithm.cc	2025-03-09 16:55:49.787372600 -0700
@@ -72,7 +72,7 @@
 
     Ptr<HeConfiguration> heConfiguration = m_device->GetHeConfiguration();
     NS_ASSERT(heConfiguration);
-    uint8_t bssColor = heConfiguration->GetBssColor();
+    uint8_t bssColor = heConfiguration->m_bssColor;
 
     if (bssColor == 0)
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/he/constant-obss-pd-algorithm.h ns-3.44/src/wifi/model/he/constant-obss-pd-algorithm.h
--- ns-3.43/src/wifi/model/he/constant-obss-pd-algorithm.h	2024-10-09 16:41:10.120656700 -0700
+++ ns-3.44/src/wifi/model/he/constant-obss-pd-algorithm.h	2025-03-09 16:55:49.791372500 -0700
@@ -15,8 +15,8 @@
 {
 
 /**
- * \brief Constant OBSS PD algorithm
- * \ingroup wifi
+ * @brief Constant OBSS PD algorithm
+ * @ingroup wifi
  *
  * This constant OBSS_PD algorithm is a simple OBSS_PD algorithm which evaluates if a receiving
  * signal should be accepted or rejected based on a constant threshold.
@@ -34,8 +34,8 @@
     ConstantObssPdAlgorithm();
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/he/he-6ghz-band-capabilities.h ns-3.44/src/wifi/model/he/he-6ghz-band-capabilities.h
--- ns-3.43/src/wifi/model/he/he-6ghz-band-capabilities.h	2024-10-09 16:41:10.120656700 -0700
+++ ns-3.44/src/wifi/model/he/he-6ghz-band-capabilities.h	2025-03-09 16:55:49.791372500 -0700
@@ -15,7 +15,7 @@
 {
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * The HE 6 GHz Band Capabilities (IEEE 802.11ax-2021 9.4.2.263)
  */
@@ -49,26 +49,26 @@
     /**
      * Set the maximum AMPDU length.
      *
-     * \param maxAmpduLength 2^(13 + x) - 1, x in the range 0 to 7
+     * @param maxAmpduLength 2^(13 + x) - 1, x in the range 0 to 7
      */
     void SetMaxAmpduLength(uint32_t maxAmpduLength);
     /**
      * Return the maximum A-MPDU length.
      *
-     * \return the maximum A-MPDU length in bytes
+     * @return the maximum A-MPDU length in bytes
      */
     uint32_t GetMaxAmpduLength() const;
 
     /**
      * Set the maximum MPDU length.
      *
-     * \param length the maximum MPDU length (3895, 7991 or 11454)
+     * @param length the maximum MPDU length (3895, 7991 or 11454)
      */
     void SetMaxMpduLength(uint16_t length);
     /**
      * Get the maximum MPDU length.
      *
-     * \return the maximum MPDU length in bytes
+     * @return the maximum MPDU length in bytes
      */
     uint16_t GetMaxMpduLength() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/he/he-capabilities.h ns-3.44/src/wifi/model/he/he-capabilities.h
--- ns-3.43/src/wifi/model/he/he-capabilities.h	2024-10-09 16:41:10.120656700 -0700
+++ ns-3.44/src/wifi/model/he/he-capabilities.h	2025-03-09 16:55:49.791372500 -0700
@@ -15,7 +15,7 @@
 {
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * The IEEE 802.11ax HE Capabilities
  */
@@ -32,22 +32,22 @@
     /**
      * Set the HE MAC Capabilities Info field in the HE Capabilities information element.
      *
-     * \param ctrl1 the HE MAC Capabilities Info field 1 in the HE Capabilities information element
-     * \param ctrl2 the HE MAC Capabilities Info field 2 in the HE Capabilities information element
+     * @param ctrl1 the HE MAC Capabilities Info field 1 in the HE Capabilities information element
+     * @param ctrl2 the HE MAC Capabilities Info field 2 in the HE Capabilities information element
      */
     void SetHeMacCapabilitiesInfo(uint32_t ctrl1, uint16_t ctrl2);
     /**
      * Set the HE PHY Capabilities Info field in the HE Capabilities information element.
      *
-     * \param ctrl1 the HE PHY Capabilities Info field 1 in the HE Capabilities information element
-     * \param ctrl2 the HE PHY Capabilities Info field 2 in the HE Capabilities information element
-     * \param ctrl3 the HE PHY Capabilities Info field 3 in the HE Capabilities information element
+     * @param ctrl1 the HE PHY Capabilities Info field 1 in the HE Capabilities information element
+     * @param ctrl2 the HE PHY Capabilities Info field 2 in the HE Capabilities information element
+     * @param ctrl3 the HE PHY Capabilities Info field 3 in the HE Capabilities information element
      */
     void SetHePhyCapabilitiesInfo(uint64_t ctrl1, uint16_t ctrl2, uint8_t ctrl3);
     /**
      * Set the MCS and NSS field in the HE Capabilities information element.
      *
-     * \param ctrl the MCS and NSS field in the HE Capabilities information element
+     * @param ctrl the MCS and NSS field in the HE Capabilities information element
      */
     void SetSupportedMcsAndNss(uint16_t ctrl);
 
@@ -55,7 +55,7 @@
      * Return the 4 first octets of the HE MAC Capabilities Info field in the HE Capabilities
      * information element.
      *
-     * \return the 4 first octets of the HE MAC Capabilities Info field in the HE Capabilities
+     * @return the 4 first octets of the HE MAC Capabilities Info field in the HE Capabilities
      * information element
      */
     uint32_t GetHeMacCapabilitiesInfo1() const;
@@ -63,7 +63,7 @@
      * Return the last 2 octets of the HE MAC Capabilities Info field in the HE Capabilities
      * information element.
      *
-     * \return the last 2 octets of the HE MAC Capabilities Info field in the HE Capabilities
+     * @return the last 2 octets of the HE MAC Capabilities Info field in the HE Capabilities
      * information element
      */
     uint16_t GetHeMacCapabilitiesInfo2() const;
@@ -71,7 +71,7 @@
      * Return the 8 first octets of the HE PHY Capabilities Info field in the HE Capabilities
      * information element.
      *
-     * \return the 8 first octets of the HE PHY Capabilities Info field in the HE Capabilities
+     * @return the 8 first octets of the HE PHY Capabilities Info field in the HE Capabilities
      * information element
      */
     uint64_t GetHePhyCapabilitiesInfo1() const;
@@ -79,7 +79,7 @@
      * Return the octets 9-10 of the HE PHY Capabilities Info field in the HE Capabilities
      * information element.
      *
-     * \return the octets 9-10 of the HE PHY Capabilities Info field in the HE Capabilities
+     * @return the octets 9-10 of the HE PHY Capabilities Info field in the HE Capabilities
      * information element
      */
     uint16_t GetHePhyCapabilitiesInfo2() const;
@@ -87,14 +87,14 @@
      * Return the last octet of the HE PHY Capabilities Info field in the HE Capabilities
      * information element.
      *
-     * \return the last octet of the HE PHY Capabilities Info field in the HE Capabilities
+     * @return the last octet of the HE PHY Capabilities Info field in the HE Capabilities
      * information element
      */
     uint8_t GetHePhyCapabilitiesInfo3() const;
     /**
      * Return the MCS and NSS field in the HE Capabilities information element.
      *
-     * \return the MCS and NSS field in the HE Capabilities information element
+     * @return the MCS and NSS field in the HE Capabilities information element
      */
     uint16_t GetSupportedMcsAndNss() const;
 
@@ -102,65 +102,65 @@
     /**
      * Set channel width set.
      *
-     * \param channelWidthSet the channel width set
+     * @param channelWidthSet the channel width set
      */
     void SetChannelWidthSet(uint8_t channelWidthSet);
     /**
      * Set indication whether the transmission and reception of LDPC encoded packets is supported.
      *
-     * \param ldpcCodingInPayload indication whether the transmission and reception of LDPC encoded
+     * @param ldpcCodingInPayload indication whether the transmission and reception of LDPC encoded
      * packets is supported
      */
     void SetLdpcCodingInPayload(uint8_t ldpcCodingInPayload);
     /**
      * Set 1xHE-LTF and 800ns GI in HE SU PPDU reception support
      *
-     * \param heSuPpdu1xHeLtf800nsGi 1xHE-LTF and 800ns GI in HE SU PPDU reception support
+     * @param heSuPpdu1xHeLtf800nsGi 1xHE-LTF and 800ns GI in HE SU PPDU reception support
      */
     void SetHeSuPpdu1xHeLtf800nsGi(bool heSuPpdu1xHeLtf800nsGi);
     /**
      * Set 4xHE-LTF and 800ns GI in HE SU PPDU and HE MU PPDU reception support
      *
-     * \param heSuPpdu4xHeLtf800nsGi 4xHE-LTF and 800ns GI in HE SU PPDU and HE MU PPDU reception
+     * @param heSuPpdu4xHeLtf800nsGi 4xHE-LTF and 800ns GI in HE SU PPDU and HE MU PPDU reception
      * support
      */
     void SetHePpdu4xHeLtf800nsGi(bool heSuPpdu4xHeLtf800nsGi);
     /**
      * Get channel width set.
      *
-     * \returns the channel width set
+     * @returns the channel width set
      */
     uint8_t GetChannelWidthSet() const;
     /**
      * Indicates support for the transmission and reception of LDPC encoded packets.
      *
-     * \returns indication whether the transmission and reception of LDPC encoded packets is
+     * @returns indication whether the transmission and reception of LDPC encoded packets is
      * supported
      */
     uint8_t GetLdpcCodingInPayload() const;
     /**
      * Get 1xHE-LTF and 800ns GI in HE SU PPDU reception support
      *
-     * \returns true if 1xHE-LTF and 800ns GI in HE SU PPDU reception is supported, false otherwise
+     * @returns true if 1xHE-LTF and 800ns GI in HE SU PPDU reception is supported, false otherwise
      */
     bool GetHeSuPpdu1xHeLtf800nsGi() const;
     /**
      * Get 4xHE-LTF and 800ns GI in HE SU PPDU and HE MU PPDU reception support
      *
-     * \returns true if 4xHE-LTF and 800ns GI in HE SU PPDU and HE MU PPDU reception is supported,
+     * @returns true if 4xHE-LTF and 800ns GI in HE SU PPDU and HE MU PPDU reception is supported,
      *          false otherwise
      */
     bool GetHePpdu4xHeLtf800nsGi() const;
     /**
      * Get highest MCS supported.
      *
-     * \returns the highest MCS is supported
+     * @returns the highest MCS is supported
      */
     uint8_t GetHighestMcsSupported() const;
     /**
      * Get highest NSS supported.
      *
-     * \returns the highest supported NSS
+     * @returns the highest supported NSS
      */
     uint8_t GetHighestNssSupported() const;
 
@@ -168,7 +168,7 @@
     /**
      * Set the maximum AMPDU length.
      *
-     * \param maxAmpduLength 2^(20 + x) - 1, x in the range 0 to 3
+     * @param maxAmpduLength 2^(20 + x) - 1, x in the range 0 to 3
      */
     void SetMaxAmpduLength(uint32_t maxAmpduLength);
 
@@ -176,35 +176,35 @@
     /**
      * Set highest MCS supported.
      *
-     * \param mcs the MCS
+     * @param mcs the MCS
      */
     void SetHighestMcsSupported(uint8_t mcs);
     /**
      * Set highest NSS supported.
      *
-     * \param nss the NSS
+     * @param nss the NSS
      */
     void SetHighestNssSupported(uint8_t nss);
 
     /**
      * Is RX MCS supported.
      *
-     * \param mcs the MCS
-     * \returns true if MCS transmit supported
+     * @param mcs the MCS
+     * @returns true if MCS transmit supported
      */
     bool IsSupportedTxMcs(uint8_t mcs) const;
     /**
      * Is RX MCS supported.
      *
-     * \param mcs the MCS
-     * \returns true if MCS receive supported
+     * @param mcs the MCS
+     * @returns true if MCS receive supported
      */
     bool IsSupportedRxMcs(uint8_t mcs) const;
 
     /**
      * Return the maximum A-MPDU length.
      *
-     * \return the maximum A-MPDU length
+     * @return the maximum A-MPDU length
      */
     uint32_t GetMaxAmpduLength() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/he/he-configuration.cc ns-3.44/src/wifi/model/he/he-configuration.cc
--- ns-3.43/src/wifi/model/he/he-configuration.cc	2024-10-09 16:41:10.120656700 -0700
+++ ns-3.44/src/wifi/model/he/he-configuration.cc	2025-03-09 16:55:49.791372500 -0700
@@ -38,12 +38,11 @@
                           MakeTimeAccessor(&HeConfiguration::GetGuardInterval,
                                            &HeConfiguration::SetGuardInterval),
                           MakeTimeChecker(NanoSeconds(800), NanoSeconds(3200)))
-            .AddAttribute(
-                "BssColor",
-                "The BSS color",
-                UintegerValue(0),
-                MakeUintegerAccessor(&HeConfiguration::GetBssColor, &HeConfiguration::SetBssColor),
-                MakeUintegerChecker<uint8_t>())
+            .AddAttribute("BssColor",
+                          "The BSS color",
+                          UintegerValue(0),
+                          MakeUintegerAccessor(&HeConfiguration::m_bssColor),
+                          MakeUintegerChecker<uint8_t>())
             .AddAttribute("MaxTbPpduDelay",
                           "If positive, the value of this attribute specifies the maximum "
                           "delay with which a TB PPDU can be received after the reception of "
@@ -52,16 +51,8 @@
                           "is anyway capped at the duration of the training fields in the PPDU. "
                           "This attribute is only valid for APs.",
                           TimeValue(Seconds(0)),
-                          MakeTimeAccessor(&HeConfiguration::GetMaxTbPpduDelay,
-                                           &HeConfiguration::SetMaxTbPpduDelay),
+                          MakeTimeAccessor(&HeConfiguration::m_maxTbPpduDelay),
                           MakeTimeChecker(Seconds(0)))
-            .AddAttribute("MpduBufferSize",
-                          "This attribute is obsolete. Use the WifiMac::MpduBufferSize attribute "
-                          "instead.",
-                          UintegerValue(64),
-                          MakeUintegerAccessor(&HeConfiguration::m_mpduBufferSize),
-                          MakeUintegerChecker<uint16_t>(64, 256),
-                          TypeId::OBSOLETE)
             .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.",
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/he/he-configuration.h ns-3.44/src/wifi/model/he/he-configuration.h
--- ns-3.43/src/wifi/model/he/he-configuration.h	2024-10-09 16:41:10.120656700 -0700
+++ ns-3.44/src/wifi/model/he/he-configuration.h	2025-03-09 16:55:49.791372500 -0700
@@ -8,6 +8,7 @@
 #ifndef HE_CONFIGURATION_H
 #define HE_CONFIGURATION_H
 
+#include "ns3/deprecated.h"
 #include "ns3/nstime.h"
 #include "ns3/object.h"
 
@@ -15,8 +16,8 @@
 {
 
 /**
- * \brief HE configuration
- * \ingroup wifi
+ * @brief HE configuration
+ * @ingroup wifi
  *
  * This object stores HE configuration information, for use in modifying
  * AP or STA behavior and for constructing HE-related information elements.
@@ -28,57 +29,66 @@
     HeConfiguration();
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \param guardInterval the supported HE guard interval
+     * @param guardInterval the supported HE guard interval
      */
     void SetGuardInterval(Time guardInterval);
+
     /**
-     * \return the supported HE guard interval
+     * @return the supported HE guard interval
      */
     Time GetGuardInterval() const;
+
     /**
-     * \param bssColor the BSS color
+     * @param bssColor the BSS color
      */
+    NS_DEPRECATED_3_44("Set the m_bssColor member variable instead")
     void SetBssColor(uint8_t bssColor);
+
     /**
-     * \return the BSS color
+     * @return the BSS color
      */
+    NS_DEPRECATED_3_44("Get the m_bssColor member variable instead")
     uint8_t GetBssColor() const;
+
     /**
-     * \param maxTbPpduDelay the maximum TB PPDU delay
+     * @param maxTbPpduDelay the maximum TB PPDU delay
      */
+    NS_DEPRECATED_3_44("Set the m_maxTbPpduDelay member variable instead")
     void SetMaxTbPpduDelay(Time maxTbPpduDelay);
+
     /**
-     * \return the maximum TB PPDU delay
+     * @return the maximum TB PPDU delay
      */
+    NS_DEPRECATED_3_44("Get the m_maxTbPpduDelay member variable instead")
     Time GetMaxTbPpduDelay() const;
 
+    uint8_t m_bssColor;    //!< BSS color
+    Time m_maxTbPpduDelay; //!< Max TB PPDU delay
+    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
+
   private:
-    Time m_guardInterval;      //!< Supported HE guard interval
-    uint8_t m_bssColor;        //!< BSS color
-    Time m_maxTbPpduDelay;     //!< Max TB PPDU delay
-    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
+    Time m_guardInterval; //!< Supported HE guard interval
 };
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/he/he-frame-exchange-manager.cc ns-3.44/src/wifi/model/he/he-frame-exchange-manager.cc
--- ns-3.43/src/wifi/model/he/he-frame-exchange-manager.cc	2024-10-09 16:41:10.120656700 -0700
+++ ns-3.44/src/wifi/model/he/he-frame-exchange-manager.cc	2025-03-09 16:55:49.791372500 -0700
@@ -54,10 +54,17 @@
 TypeId
 HeFrameExchangeManager::GetTypeId()
 {
-    static TypeId tid = TypeId("ns3::HeFrameExchangeManager")
-                            .SetParent<VhtFrameExchangeManager>()
-                            .AddConstructor<HeFrameExchangeManager>()
-                            .SetGroupName("Wifi");
+    static TypeId tid =
+        TypeId("ns3::HeFrameExchangeManager")
+            .SetParent<VhtFrameExchangeManager>()
+            .AddConstructor<HeFrameExchangeManager>()
+            .SetGroupName("Wifi")
+            .AddAttribute("ContinueTxopAfterBsrp",
+                          "Whether to continue a TXOP a SIFS after the reception of responses "
+                          "to a BSRP Trigger Frame when TXOP limit is zero.",
+                          BooleanValue(false),
+                          MakeBooleanAccessor(&HeFrameExchangeManager::m_continueTxopAfterBsrpTf),
+                          MakeBooleanChecker());
     return tid;
 }
 
@@ -86,14 +93,6 @@
 }
 
 void
-HeFrameExchangeManager::SetWifiMac(const Ptr<WifiMac> mac)
-{
-    m_apMac = DynamicCast<ApWifiMac>(mac);
-    m_staMac = DynamicCast<StaWifiMac>(mac);
-    VhtFrameExchangeManager::SetWifiMac(mac);
-}
-
-void
 HeFrameExchangeManager::RxStartIndication(WifiTxVector txVector, Time psduDuration)
 {
     NS_LOG_FUNCTION(this << txVector << psduDuration.As(Time::MS));
@@ -106,7 +105,6 @@
 HeFrameExchangeManager::DoDispose()
 {
     NS_LOG_FUNCTION(this);
-    m_apMac = nullptr;
     m_staMac = nullptr;
     m_psduMap.clear();
     m_txParams.Clear();
@@ -258,7 +256,12 @@
                     "Cannot use RTS/CTS with MU PPDUs");
     if (txParams.m_protection->method == WifiProtection::MU_RTS_CTS)
     {
-        RecordSentMuRtsTo(txParams);
+        auto protection = static_cast<WifiMuRtsCtsProtection*>(txParams.m_protection.get());
+
+        NS_ASSERT(protection->muRts.IsMuRts());
+        NS_ASSERT(m_sentRtsTo.empty());
+        m_sentRtsTo = GetTfRecipients(protection->muRts);
+
         SendMuRts(txParams);
     }
     else
@@ -267,25 +270,21 @@
     }
 }
 
-void
-HeFrameExchangeManager::RecordSentMuRtsTo(const WifiTxParameters& txParams)
+std::set<Mac48Address>
+HeFrameExchangeManager::GetTfRecipients(const CtrlTriggerHeader& trigger) const
 {
-    NS_LOG_FUNCTION(this << &txParams);
-
-    NS_ASSERT(txParams.m_protection && txParams.m_protection->method == WifiProtection::MU_RTS_CTS);
-    auto protection = static_cast<WifiMuRtsCtsProtection*>(txParams.m_protection.get());
-
-    NS_ASSERT(protection->muRts.IsMuRts());
-    NS_ASSERT_MSG(m_apMac, "APs only can send MU-RTS TF");
+    std::set<Mac48Address> recipients;
+    NS_ASSERT_MSG(m_apMac, "APs only can send Trigger Frames");
     const auto& aidAddrMap = m_apMac->GetStaList(m_linkId);
-    NS_ASSERT(m_sentRtsTo.empty());
 
-    for (const auto& userInfo : protection->muRts)
+    for (const auto& userInfo : trigger)
     {
         const auto addressIt = aidAddrMap.find(userInfo.GetAid12());
         NS_ASSERT_MSG(addressIt != aidAddrMap.end(), "AID not found");
-        m_sentRtsTo.insert(addressIt->second);
+        recipients.insert(addressIt->second);
     }
+
+    return recipients;
 }
 
 void
@@ -296,7 +295,32 @@
     {
         m_protectedStas.merge(m_sentRtsTo);
         m_sentRtsTo.clear();
-        SendPsduMap();
+        if (m_muScheduler)
+        {
+            m_muScheduler->NotifyProtectionCompleted(m_linkId, m_psduMap, m_txParams);
+
+            if (m_psduMap.empty())
+            {
+                NS_LOG_INFO("Multi-user scheduler aborted the transmission");
+                NS_ASSERT(m_edca);
+                if (m_edca->GetTxopLimit(m_linkId).IsStrictlyPositive())
+                {
+                    SendCfEndIfNeeded();
+                    return;
+                }
+                NotifyChannelReleased(m_edca);
+                m_edca = nullptr;
+                return;
+            }
+        }
+        if (m_txParams.m_protection->method == WifiProtection::NONE)
+        {
+            SendPsduMap();
+        }
+        else
+        {
+            Simulator::Schedule(m_phy->GetSifs(), &HeFrameExchangeManager::SendPsduMap, this);
+        }
         return;
     }
     VhtFrameExchangeManager::ProtectionCompleted();
@@ -322,7 +346,7 @@
     // The TXOP holder may exceed the TXOP limit in some situations (Sec. 10.22.2.8
     // of 802.11-2016)
     return std::max(m_edca->GetRemainingTxop(m_linkId) -
-                        m_phy->CalculateTxDuration(muRtsSize, muRtsTxVector, m_phy->GetPhyBand()),
+                        WifiPhy::CalculateTxDuration(muRtsSize, muRtsTxVector, m_phy->GetPhyBand()),
                     Seconds(0));
 }
 
@@ -365,11 +389,11 @@
     // After transmitting an MU-RTS frame, the STA shall wait for a CTSTimeout interval of
     // aSIFSTime + aSlotTime + aRxPHYStartDelay (Sec. 27.2.5.2 of 802.11ax D3.0).
     // aRxPHYStartDelay equals the time to transmit the PHY header.
-    Time timeout = m_phy->CalculateTxDuration(mpdu->GetSize(),
-                                              protection->muRtsTxVector,
-                                              m_phy->GetPhyBand()) +
+    Time timeout = WifiPhy::CalculateTxDuration(mpdu->GetSize(),
+                                                protection->muRtsTxVector,
+                                                m_phy->GetPhyBand()) +
                    m_phy->GetSifs() + m_phy->GetSlot() +
-                   m_phy->CalculatePhyPreambleAndHeaderDuration(ctsTxVector);
+                   WifiPhy::CalculatePhyPreambleAndHeaderDuration(ctsTxVector);
 
     NS_ASSERT(!m_txTimer.IsRunning());
     m_txTimer.Set(WifiTxTimer::WAIT_CTS_AFTER_MU_RTS,
@@ -388,15 +412,6 @@
 HeFrameExchangeManager::CtsAfterMuRtsTimeout(Ptr<WifiMpdu> muRts, const WifiTxVector& txVector)
 {
     NS_LOG_FUNCTION(this << *muRts << txVector);
-    DoCtsAfterMuRtsTimeout(muRts, txVector, true);
-}
-
-void
-HeFrameExchangeManager::DoCtsAfterMuRtsTimeout(Ptr<WifiMpdu> muRts,
-                                               const WifiTxVector& txVector,
-                                               bool updateFailedCw)
-{
-    NS_LOG_FUNCTION(this << *muRts << txVector << updateFailedCw);
 
     if (m_psduMap.empty())
     {
@@ -406,8 +421,20 @@
         return;
     }
 
+    DoCtsAfterMuRtsTimeout(m_psduMap);
+    m_psduMap.clear();
+}
+
+void
+HeFrameExchangeManager::DoCtsAfterMuRtsTimeout(const WifiPsduMap& psduMap)
+{
+    NS_LOG_FUNCTION(this);
+
+    // GetUpdateCwOnCtsTimeout() needs to be called before resetting m_sentRtsTo
+    const auto updateCw = GetUpdateCwOnCtsTimeout();
+
     m_sentRtsTo.clear();
-    for (const auto& psdu : m_psduMap)
+    for (const auto& psdu : psduMap)
     {
         for (const auto& mpdu : *PeekPointer(psdu.second))
         {
@@ -418,47 +445,29 @@
         }
     }
 
-    // NOTE Implementation of QSRC[AC] and QLRC[AC] should be improved...
-    const auto& hdr = m_psduMap.cbegin()->second->GetHeader(0);
-    if (!hdr.GetAddr1().IsGroup())
+    if (const auto& hdr = psduMap.cbegin()->second->GetHeader(0); !hdr.GetAddr1().IsGroup())
     {
         GetWifiRemoteStationManager()->ReportRtsFailed(hdr);
     }
 
-    if (!hdr.GetAddr1().IsGroup() &&
-        !GetWifiRemoteStationManager()->NeedRetransmission(*m_psduMap.cbegin()->second->begin()))
+    for (const auto& [staId, psdu] : psduMap)
     {
-        NS_LOG_DEBUG("Missed CTS, discard MPDUs");
-        GetWifiRemoteStationManager()->ReportFinalRtsFailed(hdr);
-        for (const auto& psdu : m_psduMap)
+        if (psdu->GetAddr1().IsGroup())
         {
-            // Dequeue the MPDUs if they are stored in a queue
-            DequeuePsdu(psdu.second);
-            for (const auto& mpdu : *PeekPointer(psdu.second))
-            {
-                NotifyPacketDiscarded(mpdu);
-            }
+            continue;
         }
-        m_edca->ResetCw(m_linkId);
-    }
-    else
-    {
-        NS_LOG_DEBUG("Missed CTS, retransmit MPDUs");
-        if (updateFailedCw)
+        if (auto droppedMpdu = DropMpduIfRetryLimitReached(psdu))
         {
-            m_edca->UpdateFailedCw(m_linkId);
+            GetWifiRemoteStationManager()->ReportFinalRtsFailed(droppedMpdu->GetHeader());
         }
-    }
-    // Make the sequence numbers of the MPDUs available again if the MPDUs have never
-    // been transmitted, both in case the MPDUs have been discarded and in case the
-    // MPDUs have to be transmitted (because a new sequence number is assigned to
-    // MPDUs that have never been transmitted and are selected for transmission)
-    for (const auto& [staId, psdu] : m_psduMap)
-    {
+        // Make the sequence numbers of the MPDUs available again if the MPDUs have never
+        // been transmitted, both in case the MPDUs have been discarded and in case the
+        // MPDUs have to be transmitted (because a new sequence number is assigned to
+        // MPDUs that have never been transmitted and are selected for transmission)
         ReleaseSequenceNumbers(psdu);
     }
-    m_psduMap.clear();
-    TransmissionFailed();
+
+    TransmissionFailed(!updateCw);
 }
 
 Ptr<WifiPsdu>
@@ -505,9 +514,32 @@
     {
         NS_LOG_DEBUG(address << " did not respond, hence it is no longer protected");
         m_protectedStas.erase(address);
+        m_sentFrameTo.erase(address);
     }
 
-    VhtFrameExchangeManager::TransmissionSucceeded();
+    if (m_continueTxopAfterBsrpTf && m_edca && m_edca->GetTxopLimit(m_linkId).IsZero() &&
+        m_txTimer.IsRunning() &&
+        m_txTimer.GetReason() == WifiTxTimer::WAIT_QOS_NULL_AFTER_BSRP_TF &&
+        (m_txNav > Simulator::Now() + m_phy->GetSifs()))
+    {
+        NS_LOG_DEBUG("Schedule another transmission in a SIFS after successful BSRP TF");
+        Simulator::Schedule(m_phy->GetSifs(), [=, this]() {
+            // TXOP limit is null, hence the txopDuration parameter is unused
+            if (!StartTransmission(m_edca, Seconds(0)))
+            {
+                SendCfEndIfNeeded();
+            }
+        });
+        if (m_protectedIfResponded)
+        {
+            m_protectedStas.merge(m_sentFrameTo);
+        }
+        m_sentFrameTo.clear();
+    }
+    else
+    {
+        VhtFrameExchangeManager::TransmissionSucceeded();
+    }
 }
 
 void
@@ -622,9 +654,9 @@
             }
 
             Ptr<WifiPsdu> triggerPsdu = GetWifiPsdu(m_triggerFrame, acknowledgment->muBarTxVector);
-            Time txDuration = m_phy->CalculateTxDuration(triggerPsdu->GetSize(),
-                                                         acknowledgment->muBarTxVector,
-                                                         m_phy->GetPhyBand());
+            Time txDuration = WifiPhy::CalculateTxDuration(triggerPsdu->GetSize(),
+                                                           acknowledgment->muBarTxVector,
+                                                           m_phy->GetPhyBand());
             // update acknowledgmentTime to correctly set the Duration/ID
             *acknowledgment->acknowledgmentTime -= (m_phy->GetSifs() + txDuration);
             m_triggerFrame->GetHeader().SetDuration(GetPsduDurationId(txDuration, m_txParams));
@@ -632,7 +664,7 @@
             responseTxVector =
                 &acknowledgment->stationsReplyingWithBlockAck.begin()->second.blockAckTxVector;
             Time timeout = txDuration + m_phy->GetSifs() + m_phy->GetSlot() +
-                           m_phy->CalculatePhyPreambleAndHeaderDuration(*responseTxVector);
+                           WifiPhy::CalculatePhyPreambleAndHeaderDuration(*responseTxVector);
 
             m_txTimer.Set(WifiTxTimer::WAIT_BLOCK_ACKS_IN_TB_PPDU,
                           timeout,
@@ -790,10 +822,19 @@
     else
     {
         txDuration =
-            m_phy->CalculateTxDuration(psduMap, m_txParams.m_txVector, m_phy->GetPhyBand());
+            WifiPhy::CalculateTxDuration(psduMap, m_txParams.m_txVector, m_phy->GetPhyBand());
 
         // Set Duration/ID
         Time durationId = GetPsduDurationId(txDuration, m_txParams);
+
+        if (m_continueTxopAfterBsrpTf && m_edca && m_edca->GetTxopLimit(m_linkId).IsZero() &&
+            timerType == WifiTxTimer::WAIT_QOS_NULL_AFTER_BSRP_TF)
+        {
+            // add the duration of the following frame exchange to extend the NAV beyond the
+            // responses to the BSRP TF
+            durationId += m_muScheduler->GetExtraTimeForBsrpTfDurationId(m_linkId);
+        }
+
         for (auto& psdu : m_psduMap)
         {
             psdu.second->SetDuration(durationId);
@@ -817,7 +858,7 @@
     else
     {
         Time timeout = txDuration + m_phy->GetSifs() + m_phy->GetSlot() +
-                       m_phy->CalculatePhyPreambleAndHeaderDuration(*responseTxVector);
+                       WifiPhy::CalculatePhyPreambleAndHeaderDuration(*responseTxVector);
         m_channelAccessManager->NotifyAckTimeoutStartNow(timeout);
 
         // start timer
@@ -888,11 +929,31 @@
         auto hePhy = StaticCast<HePhy>(m_phy->GetPhyEntity(responseTxVector->GetModulationClass()));
         hePhy->SetTrigVector(m_trigVector, m_txTimer.GetDelayLeft());
     }
-    else if (timerType == WifiTxTimer::NOT_RUNNING && m_txParams.m_txVector.IsUlMu())
+    else if (timerType == WifiTxTimer::NOT_RUNNING &&
+             (m_txParams.m_txVector.IsUlMu() ||
+              m_txParams.m_acknowledgment->method == WifiAcknowledgment::DL_MU_BAR_BA_SEQUENCE))
     {
-        // clear m_psduMap after sending QoS Null frames following a BSRP Trigger Frame
+        // clear m_psduMap after sending QoS Null frames following a BSRP Trigger Frame or after
+        // sending a DL MU PPDU with BAR-BA ack sequence and no immediate response is expected
         Simulator::Schedule(txDuration, &WifiPsduMap::clear, &m_psduMap);
     }
+
+    if (m_txTimer.IsRunning() && timerType != WifiTxTimer::WAIT_BLOCK_ACK_AFTER_TB_PPDU)
+    {
+        NS_ASSERT(m_sentFrameTo.empty());
+
+        // do not record that a frame is being sent to an EMLSR client unless the AP is sending a
+        // BSRP TF or the EMLSR client is already protected
+        for (const auto& address : staExpectResponseFrom)
+        {
+            if (!GetWifiRemoteStationManager()->GetEmlsrEnabled(address) ||
+                timerType == WifiTxTimer::WAIT_QOS_NULL_AFTER_BSRP_TF ||
+                m_protectedStas.contains(address))
+            {
+                m_sentFrameTo.insert(address);
+            }
+        }
+    }
 }
 
 void
@@ -925,6 +986,12 @@
         txVector.SetAggregation(true);
     }
 
+    auto txDuration = WifiPhy::CalculateTxDuration(psduMap, txVector, m_phy->GetPhyBand());
+    // The TXNAV timer is a single timer, shared by the EDCAFs within a STA, that is initialized
+    // with the duration from the Duration/ID field in the frame most recently successfully
+    // transmitted by the TXOP holder, except for PS-Poll frames. (Sec.10.23.2.2 IEEE 802.11-2020)
+    m_txNav = Max(m_txNav, Simulator::Now() + txDuration + psduMap.cbegin()->second->GetDuration());
+
     m_phy->Send(psduMap, txVector);
 }
 
@@ -1000,10 +1067,10 @@
         uint32_t muRtsSize = WifiMacHeader(WIFI_MAC_CTL_TRIGGER).GetSize() +
                              muRtsCtsProtection->muRts.GetSerializedSize() + WIFI_MAC_FCS_LENGTH;
         muRtsCtsProtection->protectionTime =
-            m_phy->CalculateTxDuration(muRtsSize,
-                                       muRtsCtsProtection->muRtsTxVector,
-                                       m_phy->GetPhyBand()) +
-            m_phy->CalculateTxDuration(GetCtsSize(), ctsTxVector, m_phy->GetPhyBand()) +
+            WifiPhy::CalculateTxDuration(muRtsSize,
+                                         muRtsCtsProtection->muRtsTxVector,
+                                         m_phy->GetPhyBand()) +
+            WifiPhy::CalculateTxDuration(GetCtsSize(), ctsTxVector, m_phy->GetPhyBand()) +
             2 * m_phy->GetSifs();
     }
     else
@@ -1025,7 +1092,7 @@
     {
         auto dlMuBarBaAcknowledgment = static_cast<WifiDlMuBarBaSequence*>(acknowledgment);
 
-        Time duration = Seconds(0);
+        Time duration;
 
         // normal ack or implicit BAR policy can be used for (no more than) one receiver
         NS_ABORT_IF(dlMuBarBaAcknowledgment->stationsReplyingWithNormalAck.size() +
@@ -1038,29 +1105,30 @@
                 dlMuBarBaAcknowledgment->stationsReplyingWithNormalAck.begin()->second;
             duration +=
                 m_phy->GetSifs() +
-                m_phy->CalculateTxDuration(GetAckSize(), info.ackTxVector, m_phy->GetPhyBand());
+                WifiPhy::CalculateTxDuration(GetAckSize(), info.ackTxVector, m_phy->GetPhyBand());
         }
 
         if (!dlMuBarBaAcknowledgment->stationsReplyingWithBlockAck.empty())
         {
             const auto& info =
                 dlMuBarBaAcknowledgment->stationsReplyingWithBlockAck.begin()->second;
-            duration += m_phy->GetSifs() + m_phy->CalculateTxDuration(GetBlockAckSize(info.baType),
-                                                                      info.blockAckTxVector,
-                                                                      m_phy->GetPhyBand());
+            duration +=
+                m_phy->GetSifs() + WifiPhy::CalculateTxDuration(GetBlockAckSize(info.baType),
+                                                                info.blockAckTxVector,
+                                                                m_phy->GetPhyBand());
         }
 
         for (const auto& stations : dlMuBarBaAcknowledgment->stationsSendBlockAckReqTo)
         {
             const auto& info = stations.second;
             duration += m_phy->GetSifs() +
-                        m_phy->CalculateTxDuration(GetBlockAckRequestSize(info.barType),
-                                                   info.blockAckReqTxVector,
-                                                   m_phy->GetPhyBand()) +
+                        WifiPhy::CalculateTxDuration(GetBlockAckRequestSize(info.barType),
+                                                     info.blockAckReqTxVector,
+                                                     m_phy->GetPhyBand()) +
                         m_phy->GetSifs() +
-                        m_phy->CalculateTxDuration(GetBlockAckSize(info.baType),
-                                                   info.blockAckTxVector,
-                                                   m_phy->GetPhyBand());
+                        WifiPhy::CalculateTxDuration(GetBlockAckSize(info.baType),
+                                                     info.blockAckTxVector,
+                                                     m_phy->GetPhyBand());
         }
 
         dlMuBarBaAcknowledgment->acknowledgmentTime = duration;
@@ -1072,7 +1140,7 @@
     {
         auto dlMuTfMuBarAcknowledgment = static_cast<WifiDlMuTfMuBar*>(acknowledgment);
 
-        Time duration = Seconds(0);
+        Time duration;
 
         for (const auto& stations : dlMuTfMuBarAcknowledgment->stationsReplyingWithBlockAck)
         {
@@ -1080,10 +1148,10 @@
             const auto& info = stations.second;
             NS_ASSERT(info.blockAckTxVector.GetHeMuUserInfoMap().size() == 1);
             uint16_t staId = info.blockAckTxVector.GetHeMuUserInfoMap().begin()->first;
-            Time currBlockAckDuration = m_phy->CalculateTxDuration(GetBlockAckSize(info.baType),
-                                                                   info.blockAckTxVector,
-                                                                   m_phy->GetPhyBand(),
-                                                                   staId);
+            Time currBlockAckDuration = WifiPhy::CalculateTxDuration(GetBlockAckSize(info.baType),
+                                                                     info.blockAckTxVector,
+                                                                     m_phy->GetPhyBand(),
+                                                                     staId);
             // update the max duration among all the Block Ack responses
             if (currBlockAckDuration > duration)
             {
@@ -1106,9 +1174,9 @@
         }
         dlMuTfMuBarAcknowledgment->acknowledgmentTime =
             m_phy->GetSifs() +
-            m_phy->CalculateTxDuration(muBarSize,
-                                       dlMuTfMuBarAcknowledgment->muBarTxVector,
-                                       m_phy->GetPhyBand()) +
+            WifiPhy::CalculateTxDuration(muBarSize,
+                                         dlMuTfMuBarAcknowledgment->muBarTxVector,
+                                         m_phy->GetPhyBand()) +
             m_phy->GetSifs() + duration;
     }
     /*
@@ -1118,7 +1186,7 @@
     {
         auto dlMuAggrTfAcknowledgment = static_cast<WifiDlMuAggregateTf*>(acknowledgment);
 
-        Time duration = Seconds(0);
+        Time duration;
 
         for (const auto& stations : dlMuAggrTfAcknowledgment->stationsReplyingWithBlockAck)
         {
@@ -1126,10 +1194,10 @@
             const auto& info = stations.second;
             NS_ASSERT(info.blockAckTxVector.GetHeMuUserInfoMap().size() == 1);
             uint16_t staId = info.blockAckTxVector.GetHeMuUserInfoMap().begin()->first;
-            Time currBlockAckDuration = m_phy->CalculateTxDuration(GetBlockAckSize(info.baType),
-                                                                   info.blockAckTxVector,
-                                                                   m_phy->GetPhyBand(),
-                                                                   staId);
+            Time currBlockAckDuration = WifiPhy::CalculateTxDuration(GetBlockAckSize(info.baType),
+                                                                     info.blockAckTxVector,
+                                                                     m_phy->GetPhyBand(),
+                                                                     staId);
             // update the max duration among all the Block Ack responses
             if (currBlockAckDuration > duration)
             {
@@ -1152,9 +1220,9 @@
     {
         auto ulMuMultiStaBa = static_cast<WifiUlMuMultiStaBa*>(acknowledgment);
 
-        Time duration = m_phy->CalculateTxDuration(GetBlockAckSize(ulMuMultiStaBa->baType),
-                                                   ulMuMultiStaBa->multiStaBaTxVector,
-                                                   m_phy->GetPhyBand());
+        Time duration = WifiPhy::CalculateTxDuration(GetBlockAckSize(ulMuMultiStaBa->baType),
+                                                     ulMuMultiStaBa->multiStaBaTxVector,
+                                                     m_phy->GetPhyBand());
         ulMuMultiStaBa->acknowledgmentTime = m_phy->GetSifs() + duration;
     }
     /*
@@ -1190,24 +1258,24 @@
 
     auto userInfoIt = trigger.FindUserInfoWithAid(staId);
     NS_ASSERT_MSG(userInfoIt != trigger.end(), "User Info field for AID=" << staId << " not found");
-    MHz_u bw = 0;
+    MHz_u bw{0};
 
     if (uint8_t ru = userInfoIt->GetMuRtsRuAllocation(); ru < 65)
     {
-        bw = 20;
+        bw = MHz_u{20};
     }
     else if (ru < 67)
     {
-        bw = 40;
+        bw = MHz_u{40};
     }
     else if (ru == 67)
     {
-        bw = 80;
+        bw = MHz_u{80};
     }
     else
     {
         NS_ASSERT(ru == 68);
-        bw = 160;
+        bw = MHz_u{160};
     }
 
     auto txVector = GetWifiRemoteStationManager()->GetCtsTxVector(m_bssid, GetCtsModeAfterMuRts());
@@ -1246,10 +1314,10 @@
 
     uint16_t staId = (txParams.m_txVector.IsDlMu() ? m_apMac->GetAssociationId(receiver, m_linkId)
                                                    : m_staMac->GetAssociationId());
-    Time psduDuration = m_phy->CalculateTxDuration(ppduPayloadSize,
-                                                   txParams.m_txVector,
-                                                   m_phy->GetPhyBand(),
-                                                   staId);
+    Time psduDuration = WifiPhy::CalculateTxDuration(ppduPayloadSize,
+                                                     txParams.m_txVector,
+                                                     m_phy->GetPhyBand(),
+                                                     staId);
 
     return txParams.m_txDuration ? std::max(psduDuration, *txParams.m_txDuration) : psduDuration;
 }
@@ -1257,8 +1325,18 @@
 void
 HeFrameExchangeManager::TbPpduTimeout(WifiPsduMap* psduMap, std::size_t nSolicitedStations)
 {
+    NS_LOG_FUNCTION(this << psduMap << nSolicitedStations);
+    DoTbPpduTimeout(psduMap, nSolicitedStations, true);
+}
+
+void
+HeFrameExchangeManager::DoTbPpduTimeout(WifiPsduMap* psduMap,
+                                        std::size_t nSolicitedStations,
+                                        bool updateFailedCw)
+{
     const auto& staMissedTbPpduFrom = m_txTimer.GetStasExpectedToRespond();
-    NS_LOG_FUNCTION(this << psduMap << staMissedTbPpduFrom.size() << nSolicitedStations);
+    NS_LOG_FUNCTION(this << psduMap << staMissedTbPpduFrom.size() << nSolicitedStations
+                         << updateFailedCw);
 
     NS_ASSERT(psduMap);
     NS_ASSERT(IsTrigger(*psduMap));
@@ -1270,15 +1348,38 @@
     if (staMissedTbPpduFrom.size() == nSolicitedStations)
     {
         // no station replied, the transmission failed
-        m_edca->UpdateFailedCw(m_linkId);
+        CtrlTriggerHeader trigger;
+        psduMap->cbegin()->second->GetPayload(0)->PeekHeader(trigger);
 
-        TransmissionFailed();
+        if (m_continueTxopAfterBsrpTf && m_edca->GetTxopLimit(m_linkId).IsZero() &&
+            trigger.IsBsrp())
+        {
+            SendCfEndIfNeeded();
+        }
+
+        TransmissionFailed(!updateFailedCw);
     }
     else if (!m_multiStaBaEvent.IsPending())
     {
         m_edca->ResetCw(m_linkId);
         TransmissionSucceeded();
     }
+    else
+    {
+        // Stations that did not respond must be removed from the set of stations for which
+        // protection is not needed in the current TXOP.
+        for (const auto& address : staMissedTbPpduFrom)
+        {
+            NS_LOG_DEBUG(address << " did not respond, hence it is no longer protected");
+            m_protectedStas.erase(address);
+            m_sentFrameTo.erase(address);
+        }
+        if (m_protectedIfResponded)
+        {
+            m_protectedStas.merge(m_sentFrameTo);
+        }
+        m_sentFrameTo.clear();
+    }
 
     m_psduMap.clear();
 }
@@ -1298,19 +1399,10 @@
     const auto& staMissedBlockAckFrom = m_txTimer.GetStasExpectedToRespond();
     NS_ASSERT(!staMissedBlockAckFrom.empty());
 
-    bool resetCw;
-
     if (staMissedBlockAckFrom.size() == nSolicitedStations)
     {
         // no station replied, the transmission failed
-        // call ReportDataFailed to increase SRC/LRC
         GetWifiRemoteStationManager()->ReportDataFailed(*psduMap->begin()->second->begin());
-        resetCw = false;
-    }
-    else
-    {
-        // the transmission succeeded
-        resetCw = true;
     }
 
     if (m_triggerFrame)
@@ -1321,28 +1413,13 @@
 
     for (const auto& sta : staMissedBlockAckFrom)
     {
-        Ptr<WifiPsdu> psdu = GetPsduTo(sta, *psduMap);
+        auto psdu = GetPsduTo(sta, *psduMap);
         NS_ASSERT(psdu);
-        // If the QSRC[AC] or the QLRC[AC] has reached dot11ShortRetryLimit or dot11LongRetryLimit
-        // respectively, CW[AC] shall be reset to CWmin[AC] (sec. 10.22.2.2 of 802.11-2016).
-        // We should get that psduResetCw is the same for all PSDUs, but the handling of QSRC/QLRC
-        // needs to be aligned to the specifications.
-        bool psduResetCw;
-        MissedBlockAck(psdu, m_txParams.m_txVector, psduResetCw);
-        resetCw = resetCw || psduResetCw;
+        MissedBlockAck(psdu, m_txParams.m_txVector);
     }
 
     NS_ASSERT(m_edca);
 
-    if (resetCw)
-    {
-        m_edca->ResetCw(m_linkId);
-    }
-    else
-    {
-        m_edca->UpdateFailedCw(m_linkId);
-    }
-
     if (staMissedBlockAckFrom.size() == nSolicitedStations)
     {
         // no station replied, the transmission failed
@@ -1350,6 +1427,7 @@
     }
     else
     {
+        m_edca->ResetCw(m_linkId);
         TransmissionSucceeded();
     }
     m_psduMap.clear();
@@ -1360,12 +1438,9 @@
 {
     NS_LOG_FUNCTION(this << *psdu << txVector);
 
-    bool resetCw;
-
-    // call ReportDataFailed to increase SRC/LRC
     GetWifiRemoteStationManager()->ReportDataFailed(*psdu->begin());
 
-    MissedBlockAck(psdu, m_txParams.m_txVector, resetCw);
+    MissedBlockAck(psdu, m_txParams.m_txVector);
 
     // This is a PSDU sent in a TB PPDU. An HE STA resumes the EDCA backoff procedure
     // without modifying CW or the backoff counter for the associated EDCAF, after
@@ -1455,7 +1530,7 @@
 
     Ptr<HeConfiguration> heConfiguration = m_mac->GetHeConfiguration();
     NS_ASSERT_MSG(heConfiguration, "This STA has to be an HE station to send an HE TB PPDU");
-    v.SetBssColor(heConfiguration->GetBssColor());
+    v.SetBssColor(heConfiguration->m_bssColor);
 
     if (userInfoIt->IsUlTargetRssiMaxTxPower())
     {
@@ -1489,7 +1564,7 @@
         trigger.GetApTxPower() -
         static_cast<int8_t>(
             *optRssi); // cast RSSI to be on equal footing with AP Tx power information
-    auto reqTxPower = static_cast<dBm_u>(userInfoIt->GetUlTargetRssi() + pathLossDb);
+    auto reqTxPower = dBm_u{static_cast<double>(userInfoIt->GetUlTargetRssi() + pathLossDb)};
 
     // Convert the transmit power to a power level
     uint8_t numPowerLevels = m_phy->GetNTxPower();
@@ -1661,7 +1736,7 @@
 
             auto agreement = m_mac->GetBaAgreementEstablishedAsRecipient(receiver, tid);
             NS_ASSERT(agreement);
-            agreement->get().FillBlockAckBitmap(&blockAck, index);
+            agreement->get().FillBlockAckBitmap(blockAck, index);
             NS_LOG_DEBUG("Multi-STA Block Ack: Sending Block Ack with seq="
                          << blockAck.GetStartingSequence(index) << " to=" << receiver
                          << " tid=" << +tid);
@@ -1682,9 +1757,9 @@
     Ptr<WifiPsdu> psdu =
         GetWifiPsdu(Create<WifiMpdu>(packet, hdr), acknowledgment->multiStaBaTxVector);
 
-    Time txDuration = m_phy->CalculateTxDuration(GetBlockAckSize(acknowledgment->baType),
-                                                 acknowledgment->multiStaBaTxVector,
-                                                 m_phy->GetPhyBand());
+    Time txDuration = WifiPhy::CalculateTxDuration(GetBlockAckSize(acknowledgment->baType),
+                                                   acknowledgment->multiStaBaTxVector,
+                                                   m_phy->GetPhyBand());
     /**
      * In a BlockAck frame transmitted in response to a frame carried in HE TB PPDU under
      * single protection settings, the Duration/ID field is set to the value obtained from
@@ -1986,7 +2061,7 @@
     // This condition is used if the BSS is not disabled ("If a STA determines that the BSS color
     // is disabled (see 26.17.3.3), then the RXVECTOR parameter BSS_COLOR of a PPDU shall not be
     // used to classify the PPDU")
-    const auto bssColor = m_mac->GetHeConfiguration()->GetBssColor();
+    const auto bssColor = m_mac->GetHeConfiguration()->m_bssColor;
 
     // the other two conditions using the RXVECTOR parameter PARTIAL_AID are not implemented
     return bssColor != 0 && bssColor == txVector.GetBssColor();
@@ -2004,7 +2079,7 @@
 
     if (psdu->GetAddr1() == m_self)
     {
-        // When the received frame’s RA is equal to the STA’s own MAC address, the STA
+        // When the received frame's RA is equal to the STA's own MAC address, the STA
         // shall not update its NAV (IEEE 802.11-2020, sec. 10.3.2.4)
         return;
     }
@@ -2035,7 +2110,7 @@
     }
 
     // For all other received frames the STA shall update its NAV when the received
-    // Duration is greater than the STA’s current NAV value (IEEE 802.11-2020 sec. 10.3.2.4)
+    // Duration is greater than the STA's current NAV value (IEEE 802.11-2020 sec. 10.3.2.4)
     auto intraBssNavEnd = Simulator::Now() + duration;
     if (intraBssNavEnd > m_intraBssNavEnd)
     {
@@ -2058,7 +2133,7 @@
             auto navResetDelay =
                 2 * m_phy->GetSifs() +
                 WifiPhy::CalculateTxDuration(GetCtsSize(), ctsTxVector, m_phy->GetPhyBand()) +
-                m_phy->CalculatePhyPreambleAndHeaderDuration(ctsTxVector) + 2 * m_phy->GetSlot();
+                WifiPhy::CalculatePhyPreambleAndHeaderDuration(ctsTxVector) + 2 * m_phy->GetSlot();
             m_intraBssNavResetEvent =
                 Simulator::Schedule(navResetDelay,
                                     &HeFrameExchangeManager::IntraBssNavResetTimeout,
@@ -2176,6 +2251,8 @@
                                     const WifiTxVector& txVector,
                                     bool inAmpdu)
 {
+    NS_LOG_FUNCTION(this << *mpdu << rxSignalInfo << txVector << inAmpdu);
+
     // The received MPDU is either broadcast or addressed to this station
     NS_ASSERT(mpdu->GetHeader().GetAddr1().IsGroup() || mpdu->GetHeader().GetAddr1() == m_self);
 
@@ -2291,21 +2368,7 @@
         }
 
         NS_LOG_DEBUG("Received a QoS Null frame in a TB PPDU from " << sender);
-
-        // remove the sender from the set of stations that are expected to send a TB PPDU
-        m_txTimer.GotResponseFrom(sender);
-
-        if (m_txTimer.GetStasExpectedToRespond().empty())
-        {
-            // we do not expect any other response
-            m_txTimer.Cancel();
-            m_channelAccessManager->NotifyAckTimeoutResetNow();
-
-            NS_ASSERT(m_edca);
-            m_psduMap.clear();
-            m_edca->ResetCw(m_linkId);
-            TransmissionSucceeded();
-        }
+        ReceivedQosNullAfterBsrpTf(sender);
 
         // the received TB PPDU has been processed
         return;
@@ -2332,9 +2395,7 @@
 
             m_txTimer.Cancel();
             m_channelAccessManager->NotifyCtsTimeoutResetNow();
-            Simulator::Schedule(m_phy->GetSifs(),
-                                &HeFrameExchangeManager::ProtectionCompleted,
-                                this);
+            ProtectionCompleted();
         }
         else if (hdr.IsCts() && m_txTimer.IsRunning() &&
                  m_txTimer.GetReason() == WifiTxTimer::WAIT_CTS_AFTER_MU_RTS)
@@ -2346,9 +2407,7 @@
 
             m_txTimer.Cancel();
             m_channelAccessManager->NotifyCtsTimeoutResetNow();
-            Simulator::Schedule(m_phy->GetSifs(),
-                                &HeFrameExchangeManager::ProtectionCompleted,
-                                this);
+            ProtectionCompleted();
         }
         else if (hdr.IsAck() && m_txTimer.IsRunning() &&
                  m_txTimer.GetReason() == WifiTxTimer::WAIT_NORMAL_ACK_AFTER_DL_MU_PPDU)
@@ -2443,6 +2502,7 @@
             NS_ABORT_MSG_IF(!blockAck.IsMultiSta(),
                             "A Multi-STA BlockAck is expected after a TB PPDU");
             NS_LOG_DEBUG("Received a Multi-STA BlockAck from=" << hdr.GetAddr2());
+            m_txTimer.GotResponseFrom(hdr.GetAddr2());
 
             NS_ASSERT(m_staMac && m_staMac->IsAssociated());
             if (hdr.GetAddr2() != m_bssid)
@@ -2582,12 +2642,12 @@
                 // - The UL MU CS condition indicates that the medium is idle
                 // (Sec. 26.2.6.3 of 802.11ax-2021)
                 NS_LOG_DEBUG("Schedule CTS");
-                Simulator::Schedule(m_phy->GetSifs(),
-                                    &HeFrameExchangeManager::SendCtsAfterMuRts,
-                                    this,
-                                    hdr,
-                                    trigger,
-                                    rxSignalInfo.snr);
+                m_sendCtsEvent = Simulator::Schedule(m_phy->GetSifs(),
+                                                     &HeFrameExchangeManager::SendCtsAfterMuRts,
+                                                     this,
+                                                     hdr,
+                                                     trigger,
+                                                     rxSignalInfo.snr);
             }
             else if (trigger.IsMuBar())
             {
@@ -2750,21 +2810,7 @@
         }
 
         NS_LOG_DEBUG("Received QoS Null frames in a TB PPDU from " << sender);
-
-        // remove the sender from the set of stations that are expected to send a TB PPDU
-        m_txTimer.GotResponseFrom(sender);
-
-        if (m_txTimer.GetStasExpectedToRespond().empty())
-        {
-            // we do not expect any other response
-            m_txTimer.Cancel();
-            m_channelAccessManager->NotifyAckTimeoutResetNow();
-
-            NS_ASSERT(m_edca);
-            m_psduMap.clear();
-            m_edca->ResetCw(m_linkId);
-            TransmissionSucceeded();
-        }
+        ReceivedQosNullAfterBsrpTf(sender);
 
         // the received TB PPDU has been processed
         return;
@@ -2791,4 +2837,30 @@
     VhtFrameExchangeManager::EndReceiveAmpdu(psdu, rxSignalInfo, txVector, perMpduStatus);
 }
 
+void
+HeFrameExchangeManager::ReceivedQosNullAfterBsrpTf(Mac48Address sender)
+{
+    NS_LOG_FUNCTION(this << sender);
+
+    NS_ASSERT(m_txTimer.IsRunning() &&
+              m_txTimer.GetReason() == WifiTxTimer::WAIT_QOS_NULL_AFTER_BSRP_TF);
+
+    // remove the sender from the set of stations that are expected to send a TB PPDU
+    m_txTimer.GotResponseFrom(sender);
+
+    if (m_txTimer.GetStasExpectedToRespond().empty())
+    {
+        // we do not expect any other response
+        m_channelAccessManager->NotifyAckTimeoutResetNow();
+
+        NS_ASSERT(m_edca);
+        m_psduMap.clear();
+        m_edca->ResetCw(m_linkId);
+        TransmissionSucceeded();
+        // we reset the TX timer after calling TransmissionSucceeded, so that the latter can
+        // check whether the reason for the last timer is WAIT_QOS_NULL_AFTER_BSRP_TF
+        m_txTimer.Cancel();
+    }
+}
+
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/he/he-frame-exchange-manager.h ns-3.44/src/wifi/model/he/he-frame-exchange-manager.h
--- ns-3.43/src/wifi/model/he/he-frame-exchange-manager.h	2024-10-09 16:41:10.120656700 -0700
+++ ns-3.44/src/wifi/model/he/he-frame-exchange-manager.h	2025-03-09 16:55:49.791372500 -0700
@@ -20,35 +20,24 @@
 {
 
 class MultiUserScheduler;
-class ApWifiMac;
-class StaWifiMac;
 class CtrlTriggerHeader;
 
 /**
- * Map of PSDUs indexed by STA-ID
- */
-typedef std::unordered_map<uint16_t /* staId */, Ptr<WifiPsdu> /* PSDU */> WifiPsduMap;
-/**
- * Map of const PSDUs indexed by STA-ID
- */
-typedef std::unordered_map<uint16_t /* staId */, Ptr<const WifiPsdu> /* PSDU */> WifiConstPsduMap;
-
-/**
- * \param psduMap a PSDU map
- * \return true if the given PSDU map contains a single PSDU including a single MPDU
+ * @param psduMap a PSDU map
+ * @return true if the given PSDU map contains a single PSDU including a single MPDU
  *         that carries a Trigger Frame
  */
 bool IsTrigger(const WifiPsduMap& psduMap);
 
 /**
- * \param psduMap a PSDU map
- * \return true if the given PSDU map contains a single PSDU including a single MPDU
+ * @param psduMap a PSDU map
+ * @return true if the given PSDU map contains a single PSDU including a single MPDU
  *         that carries a Trigger Frame
  */
 bool IsTrigger(const WifiConstPsduMap& psduMap);
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * HeFrameExchangeManager handles the frame exchange sequences
  * for HE stations.
@@ -57,15 +46,14 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     HeFrameExchangeManager();
     ~HeFrameExchangeManager() override;
 
     bool StartFrameExchange(Ptr<QosTxop> edca, Time availableTime, bool initialFrame) override;
-    void SetWifiMac(const Ptr<WifiMac> mac) override;
     void CalculateAcknowledgmentTime(WifiAcknowledgment* acknowledgment) const override;
     void CalculateProtectionTime(WifiProtection* protection) const override;
     std::optional<Mac48Address> FindTxopHolder(const WifiMacHeader& hdr,
@@ -75,7 +63,7 @@
     /**
      * Set the Multi-user Scheduler associated with this Frame Exchange Manager.
      *
-     * \param muScheduler the Multi-user Scheduler associated with this Frame Exchange Manager
+     * @param muScheduler the Multi-user Scheduler associated with this Frame Exchange Manager
      */
     void SetMultiUserScheduler(const Ptr<MultiUserScheduler> muScheduler);
 
@@ -83,9 +71,9 @@
      * Get the PSDU in the given PSDU map that is addressed to the given MAC address,
      * if any, or a null pointer, otherwise.
      *
-     * \param to the MAC address
-     * \param psduMap the PSDU map
-     * \return the PSDU, if any, or a null pointer, otherwise
+     * @param to the MAC address
+     * @param psduMap the PSDU map
+     * @return the PSDU, if any, or a null pointer, otherwise
      */
     static Ptr<WifiPsdu> GetPsduTo(Mac48Address to, const WifiPsduMap& psduMap);
 
@@ -94,7 +82,7 @@
      * Trigger Frame to the most recent RSSI observed from the corresponding
      * station.
      *
-     * \param trigger the given Trigger Frame
+     * @param trigger the given Trigger Frame
      */
     virtual void SetTargetRssi(CtrlTriggerHeader& trigger) const;
 
@@ -102,8 +90,8 @@
      * Get the RSSI of the most recent packet received from the station having
      * the given address.
      *
-     * \param address of the remote station
-     * \return the RSSI of the most recent packet received from the remote station
+     * @param address of the remote station
+     * @return the RSSI of the most recent packet received from the remote station
      */
     virtual std::optional<dBm_u> GetMostRecentRssi(const Mac48Address& address) const;
 
@@ -111,9 +99,9 @@
      * Return whether the received frame is classified as intra-BSS. It is assumed that
      * this station is already associated with an AP.
      *
-     * \param psdu the received PSDU
-     * \param txVector TX vector of the received PSDU
-     * \return true if the received frame is classified as intra-BSS, false otherwise
+     * @param psdu the received PSDU
+     * @param txVector TX vector of the received PSDU
+     * @return true if the received frame is classified as intra-BSS, false otherwise
      *         (the received frame is classified as inter-BSS or it cannot be classified
      *         as intra-BSS or inter-BSS)
      */
@@ -123,12 +111,20 @@
      * This method is intended to be called a SIFS after the reception of a Trigger Frame
      * to determine whether the station is allowed to respond.
      *
-     * \param trigger the Trigger Frame soliciting a response
-     * \return true if CS is not required or the UL MU CS mechanism indicates that the medium
+     * @param trigger the Trigger Frame soliciting a response
+     * @return true if CS is not required or the UL MU CS mechanism indicates that the medium
      *         is idle, false otherwise
      */
     bool UlMuCsMediumIdle(const CtrlTriggerHeader& trigger) const;
 
+    /**
+     * Get the (link) address of the non-AP stations solicited by the given Trigger Frame.
+     *
+     * @param trigger the given Trigger Frame
+     * @return the (link) address of the non-AP stations solicited by the given Trigger Frame
+     */
+    std::set<Mac48Address> GetTfRecipients(const CtrlTriggerHeader& trigger) const;
+
   protected:
     void DoDispose() override;
     void Reset() override;
@@ -169,11 +165,11 @@
      * Compute how to set the Duration/ID field of an MU-RTS Trigger Frame to send to protect
      * a frame transmitted with the given TX vector.
      *
-     * \param muRtsSize the size of the MU-RTS Trigger Frame in bytes
-     * \param muRtsTxVector the TX vector used to send the MU-RTS Trigger Frame
-     * \param txDuration the TX duration of the data frame
-     * \param response the time taken by the response (acknowledgment) to the data frame
-     * \return the computed Duration/ID value for the MU-RTS Trigger Frame
+     * @param muRtsSize the size of the MU-RTS Trigger Frame in bytes
+     * @param muRtsTxVector the TX vector used to send the MU-RTS Trigger Frame
+     * @param txDuration the TX duration of the data frame
+     * @param response the time taken by the response (acknowledgment) to the data frame
+     * @return the computed Duration/ID value for the MU-RTS Trigger Frame
      */
     virtual Time GetMuRtsDurationId(uint32_t muRtsSize,
                                     const WifiTxVector& muRtsTxVector,
@@ -181,51 +177,40 @@
                                     Time response) const;
 
     /**
-     * Record the stations being solicited by an MU-RTS TF.
-     *
-     * \param txParams the TX parameters for the data frame protected by the MU-RTS TF.
-     */
-    void RecordSentMuRtsTo(const WifiTxParameters& txParams);
-
-    /**
      * Send an MU-RTS to begin an MU-RTS/CTS frame exchange protecting an MU PPDU.
      *
-     * \param txParams the TX parameters for the data frame
+     * @param txParams the TX parameters for the data frame
      */
     virtual void SendMuRts(const WifiTxParameters& txParams);
 
     /**
      * Called when no CTS frame is received after an MU-RTS.
      *
-     * \param muRts the MU-RTS that solicited CTS responses
-     * \param txVector the TXVECTOR used to transmit the MU-RTS frame
+     * @param muRts the MU-RTS that solicited CTS responses
+     * @param txVector the TXVECTOR used to transmit the MU-RTS frame
      */
     virtual void CtsAfterMuRtsTimeout(Ptr<WifiMpdu> muRts, const WifiTxVector& txVector);
 
     /**
      * Called when no CTS frame is received after an MU-RTS.
      *
-     * \param muRts the MU-RTS that solicited CTS responses
-     * \param txVector the TXVECTOR used to transmit the MU-RTS frame
-     * \param updateFailedCw whether to update CW in case of retransmission after TX failure
-     */
-    void DoCtsAfterMuRtsTimeout(Ptr<WifiMpdu> muRts,
-                                const WifiTxVector& txVector,
-                                bool updateFailedCw);
+     * @param psduMap the PSDU map protected by the failed MU-RTS
+     */
+    void DoCtsAfterMuRtsTimeout(const WifiPsduMap& psduMap);
 
     /**
      * Send CTS after receiving an MU-RTS.
      *
-     * \param muRtsHdr the MAC header of the received MU-RTS
-     * \param trigger the MU-RTS Trigger Frame header
-     * \param muRtsSnr the SNR of the MU-RTS in linear scale
+     * @param muRtsHdr the MAC header of the received MU-RTS
+     * @param trigger the MU-RTS Trigger Frame header
+     * @param muRtsSnr the SNR of the MU-RTS in linear scale
      */
     virtual void SendCtsAfterMuRts(const WifiMacHeader& muRtsHdr,
                                    const CtrlTriggerHeader& trigger,
                                    double muRtsSnr);
 
     /**
-     * \return the mode used to transmit a CTS after an MU-RTS.
+     * @return the mode used to transmit a CTS after an MU-RTS.
      */
     WifiMode GetCtsModeAfterMuRts() const;
 
@@ -233,9 +218,9 @@
      * Get the TXVECTOR that the station having the given station ID has to use to send a
      * CTS frame after receiving an MU-RTS Trigger Frame from the AP it is associated with.
      *
-     * \param trigger the MU-RTS Trigger Frame
-     * \param staId the station ID for MU
-     * \return the TXVECTOR to use to send a CTS frame
+     * @param trigger the MU-RTS Trigger Frame
+     * @param staId the station ID for MU
+     * @return the TXVECTOR to use to send a CTS frame
      */
     WifiTxVector GetCtsTxVectorAfterMuRts(const CtrlTriggerHeader& trigger, uint16_t staId) const;
 
@@ -244,16 +229,16 @@
      * Note that both <i>psduMap</i> and <i>txParams</i> are moved to m_psduMap and
      * m_txParams, respectively, and hence are left in an undefined state.
      *
-     * \param psduMap the map of PSDUs to send
-     * \param txParams the TX parameters to use to transmit the PSDUs
+     * @param psduMap the map of PSDUs to send
+     * @param txParams the TX parameters to use to transmit the PSDUs
      */
     void SendPsduMapWithProtection(WifiPsduMap psduMap, WifiTxParameters& txParams);
 
     /**
      * Forward a map of PSDUs down to the PHY layer.
      *
-     * \param psduMap the map of PSDUs to transmit
-     * \param txVector the TXVECTOR used to transmit the MU PPDU
+     * @param psduMap the map of PSDUs to transmit
+     * @param txVector the TXVECTOR used to transmit the MU PPDU
      */
     virtual void ForwardPsduMapDown(WifiConstPsduMap psduMap, WifiTxVector& txVector);
 
@@ -262,8 +247,8 @@
      * in response to a DL MU PPDU. This method must not be called if all the
      * expected BlockAck frames were received.
      *
-     * \param psduMap a pointer to PSDU map transmitted in a DL MU PPDU
-     * \param nSolicitedStations the number of stations solicited to send a TB PPDU
+     * @param psduMap a pointer to PSDU map transmitted in a DL MU PPDU
+     * @param nSolicitedStations the number of stations solicited to send a TB PPDU
      */
     virtual void BlockAcksInTbPpduTimeout(WifiPsduMap* psduMap, std::size_t nSolicitedStations);
 
@@ -272,17 +257,28 @@
      * response to Trigger Frame. This method must not be called if all the
      * expected TB PPDUs were received.
      *
-     * \param psduMap a pointer to PSDU map transmitted in a DL MU PPDU
-     * \param nSolicitedStations the number of stations solicited to send a TB PPDU
+     * @param psduMap a pointer to PSDU map transmitted in a DL MU PPDU
+     * @param nSolicitedStations the number of stations solicited to send a TB PPDU
      */
     virtual void TbPpduTimeout(WifiPsduMap* psduMap, std::size_t nSolicitedStations);
 
     /**
+     * Take the necessary actions after that some TB PPDUs are missing in
+     * response to Trigger Frame. This method must not be called if all the
+     * expected TB PPDUs were received.
+     *
+     * @param psduMap a pointer to PSDU map transmitted in a DL MU PPDU
+     * @param nSolicitedStations the number of stations solicited to send a TB PPDU
+     * @param updateFailedCw whether to update CW in case the transmission failed
+     */
+    void DoTbPpduTimeout(WifiPsduMap* psduMap, std::size_t nSolicitedStations, bool updateFailedCw);
+
+    /**
      * Take the necessary actions after that a Block Ack is missing after a
      * TB PPDU solicited through a Trigger Frame.
      *
-     * \param psdu the PSDU in the TB PPDU
-     * \param txVector the TXVECTOR used to transmit the TB PPDU
+     * @param psdu the PSDU in the TB PPDU
+     * @param txVector the TXVECTOR used to transmit the TB PPDU
      */
     virtual void BlockAckAfterTbPpduTimeout(Ptr<WifiPsdu> psdu, const WifiTxVector& txVector);
 
@@ -290,8 +286,8 @@
      * Get the TRIGVECTOR that the MAC has to pass to the PHY when transmitting
      * the given Trigger Frame.
      *
-     * \param trigger the given Trigger Frame
-     * \return the TRIGVECTOR
+     * @param trigger the given Trigger Frame
+     * @return the TRIGVECTOR
      */
     WifiTxVector GetTrigVector(const CtrlTriggerHeader& trigger) const;
 
@@ -301,9 +297,9 @@
      * level to use for the consequent HE TB PPDU.
      * Note that this method should only be called by non-AP stations only.
      *
-     * \param trigger the received Trigger frame
-     * \param triggerSender the MAC address of the AP sending the Trigger frame
-     * \return TXVECTOR for the HE TB PPDU frame
+     * @param trigger the received Trigger frame
+     * @param triggerSender the MAC address of the AP sending the Trigger frame
+     * @return TXVECTOR for the HE TB PPDU frame
      */
     WifiTxVector GetHeTbTxVector(CtrlTriggerHeader trigger, Mac48Address triggerSender) const;
 
@@ -315,9 +311,9 @@
      * Note that the number of recipients must match the number of users addressed
      * by the given TXVECTOR.
      *
-     * \param responseTxVector the given TXVECTOR
-     * \param recipients the list of BlockAckReq headers indexed by the station's AID
-     * \return the MPDU containing the built MU-BAR
+     * @param responseTxVector the given TXVECTOR
+     * @param recipients the list of BlockAckReq headers indexed by the station's AID
+     * @return the MPDU containing the built MU-BAR
      */
     Ptr<WifiMpdu> PrepareMuBar(const WifiTxVector& responseTxVector,
                                std::map<uint16_t, CtrlBAckRequestHeader> recipients) const;
@@ -325,8 +321,8 @@
     /**
      * Send a Multi-STA Block Ack frame after the reception of some TB PPDUs.
      *
-     * \param txParams the TX parameters for the Trigger Frame that solicited the TB PPDUs
-     * \param durationId the Duration/ID field of the HE TB PPDU that elicited the Multi-STA
+     * @param txParams the TX parameters for the Trigger Frame that solicited the TB PPDUs
+     * @param durationId the Duration/ID field of the HE TB PPDU that elicited the Multi-STA
      *                   Block Ack response
      */
     void SendMultiStaBlockAck(const WifiTxParameters& txParams, Time durationId);
@@ -336,13 +332,20 @@
      * of QoS Null frames that are actually aggregated depends on the available time
      * as indicated by the Trigger Frame and is at most 8 (one QoS Null frame per TID).
      *
-     * \param trigger the Basic or BSRP Trigger Frame content
-     * \param hdr the MAC header of the Basic or BSRP Trigger Frame
+     * @param trigger the Basic or BSRP Trigger Frame content
+     * @param hdr the MAC header of the Basic or BSRP Trigger Frame
+     */
+    virtual void SendQosNullFramesInTbPpdu(const CtrlTriggerHeader& trigger,
+                                           const WifiMacHeader& hdr);
+
+    /**
+     * Perform the actions required when receiving QoS Null frame(s) from the given sender after
+     * a BSRP Trigger Frame.
+     *
+     * @param sender the MAC address of the given sender
      */
-    void SendQosNullFramesInTbPpdu(const CtrlTriggerHeader& trigger, const WifiMacHeader& hdr);
+    virtual void ReceivedQosNullAfterBsrpTf(Mac48Address sender);
 
-    Ptr<ApWifiMac> m_apMac;          //!< MAC pointer (null if not an AP)
-    Ptr<StaWifiMac> m_staMac;        //!< MAC pointer (null if not a STA)
     WifiTxVector m_trigVector;       //!< the TRIGVECTOR
     Time m_intraBssNavEnd;           //!< intra-BSS NAV expiration time
     EventId m_intraBssNavResetEvent; //!< the event to reset the intra-BSS NAV after an RTS
@@ -356,18 +359,18 @@
     /**
      * Take the necessary actions when receiving a Basic Trigger Frame.
      *
-     * \param trigger the Basic Trigger Frame content
-     * \param hdr the MAC header of the Basic Trigger Frame
+     * @param trigger the Basic Trigger Frame content
+     * @param hdr the MAC header of the Basic Trigger Frame
      */
     void ReceiveBasicTrigger(const CtrlTriggerHeader& trigger, const WifiMacHeader& hdr);
 
     /**
      * Respond to a MU-BAR Trigger Frame (if permitted by UL MU CS mechanism).
      *
-     * \param trigger the Basic Trigger Frame content
-     * \param tid the TID requested for us in the MU-BAR Trigger Frame
-     * \param durationId the Duration/ID field of the MPDU carrying the Trigger Frame
-     * \param snr the receive SNR
+     * @param trigger the Basic Trigger Frame content
+     * @param tid the TID requested for us in the MU-BAR Trigger Frame
+     * @param durationId the Duration/ID field of the MPDU carrying the Trigger Frame
+     * @param snr the receive SNR
      */
     void ReceiveMuBarTrigger(const CtrlTriggerHeader& trigger,
                              uint8_t tid,
@@ -381,6 +384,8 @@
     EventId m_multiStaBaEvent;             //!< Sending a Multi-STA BlockAck event
     MuSnrTag m_muSnrTag;                   //!< Tag to attach to Multi-STA BlockAck frames
     bool m_triggerFrameInAmpdu;            //!< True if the received A-MPDU contains an MU-BAR
+    bool m_continueTxopAfterBsrpTf; //!< whether to continue a TXOP a SIFS after the reception of
+                                    //!< responses to a BSRP TF when TXOP limit is zero
 };
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/he/he-operation.h ns-3.44/src/wifi/model/he/he-operation.h
--- ns-3.43/src/wifi/model/he/he-operation.h	2024-10-09 16:41:10.120656700 -0700
+++ ns-3.44/src/wifi/model/he/he-operation.h	2025-03-09 16:55:49.791372500 -0700
@@ -17,8 +17,8 @@
 {
 
 /**
- * \brief The HE Operation Information Element
- * \ingroup wifi
+ * @brief The HE Operation Information Element
+ * @ingroup wifi
  *
  * This class knows how to serialise and deserialise
  * the HE Operation Information Element
@@ -48,27 +48,27 @@
         /**
          * Print the content of the HE Operation Parameters field.
          *
-         * \param os output stream
+         * @param os output stream
          */
         void Print(std::ostream& os) const;
 
         /**
-         * \return the serialized size of the HE Operation Parameters field
+         * @return the serialized size of the HE Operation Parameters field
          */
         uint16_t GetSerializedSize() const;
 
         /**
          * Serialize the HE Operation Parameters field
          *
-         * \param start an iterator which points to where the information should be written
+         * @param start an iterator which points to where the information should be written
          */
         void Serialize(Buffer::Iterator& start) const;
 
         /**
          * Deserialize the HE Operation Parameters field.
          *
-         * \param start an iterator which points to where the information should be read from
-         * \return the number of bytes read
+         * @param start an iterator which points to where the information should be read from
+         * @return the number of bytes read
          */
         uint16_t Deserialize(Buffer::Iterator& start);
     };
@@ -83,27 +83,27 @@
         /**
          * Print the content of the BSS Color Information field.
          *
-         * \param os output stream
+         * @param os output stream
          */
         void Print(std::ostream& os) const;
 
         /**
-         * \return the serialized size of the BSS Color Information field
+         * @return the serialized size of the BSS Color Information field
          */
         uint16_t GetSerializedSize() const;
 
         /**
          * Serialize the BSS Color Information field
          *
-         * \param start an iterator which points to where the information should be written
+         * @param start an iterator which points to where the information should be written
          */
         void Serialize(Buffer::Iterator& start) const;
 
         /**
          * Deserialize the BSS Color Information field.
          *
-         * \param start an iterator which points to where the information should be read from
-         * \return the number of bytes read
+         * @param start an iterator which points to where the information should be read from
+         * @return the number of bytes read
          */
         uint16_t Deserialize(Buffer::Iterator& start);
     };
@@ -123,27 +123,27 @@
         /**
          * Print the content of the 6 GHz Operation Information field.
          *
-         * \param os output stream
+         * @param os output stream
          */
         void Print(std::ostream& os) const;
 
         /**
-         * \return the serialized size of the 6 GHz Operation Information field
+         * @return the serialized size of the 6 GHz Operation Information field
          */
         uint16_t GetSerializedSize() const;
 
         /**
          * Serialize the 6 GHz Operation Information field
          *
-         * \param start an iterator which points to where the information should be written
+         * @param start an iterator which points to where the information should be written
          */
         void Serialize(Buffer::Iterator& start) const;
 
         /**
          * Deserialize the 6 GHz Operation Information field.
          *
-         * \param start an iterator which points to where the information should be read from
-         * \return the number of bytes read
+         * @param start an iterator which points to where the information should be read from
+         * @return the number of bytes read
          */
         uint16_t Deserialize(Buffer::Iterator& start);
     };
@@ -152,8 +152,8 @@
      * Set the Basic HE-MCS and NSS field in the HE Operation information element
      * by specifying the pair (<i>nss</i>, <i>maxMcs</i>).
      *
-     * \param nss the NSS
-     * \param maxHeMcs the maximum supported HE-MCS value corresponding to that NSS
+     * @param nss the NSS
+     * @param maxHeMcs the maximum supported HE-MCS value corresponding to that NSS
      */
     void SetMaxHeMcsPerNss(uint8_t nss, uint8_t maxHeMcs);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/he/he-phy.cc ns-3.44/src/wifi/model/he/he-phy.cc
--- ns-3.43/src/wifi/model/he/he-phy.cc	2024-10-09 16:41:10.120656700 -0700
+++ ns-3.44/src/wifi/model/he/he-phy.cc	2025-03-09 16:55:49.791372500 -0700
@@ -217,7 +217,7 @@
         return HePpdu::GetSigBFieldSize(
             txVector.GetChannelWidth(),
             txVector.GetRuAllocation(
-                m_wifiPhy ? m_wifiPhy->GetOperatingChannel().GetPrimaryChannelIndex(20) : 0),
+                m_wifiPhy ? m_wifiPhy->GetOperatingChannel().GetPrimaryChannelIndex(MHz_u{20}) : 0),
             txVector.IsSigBCompression(),
             txVector.IsSigBCompression() ? txVector.GetHeMuUserInfoMap().size() : 0);
     }
@@ -232,7 +232,7 @@
         const auto symbolDuration = MicroSeconds(4);
         // Number of data bits per symbol
         const auto ndbps =
-            GetSigBMode(txVector).GetDataRate(20) * symbolDuration.GetNanoSeconds() / 1e9;
+            GetSigBMode(txVector).GetDataRate(MHz_u{20}) * symbolDuration.GetNanoSeconds() / 1e9;
         const auto numSymbols = ceil((sigBSize) / ndbps);
 
         return FemtoSeconds(static_cast<uint64_t>(numSymbols * symbolDuration.GetFemtoSeconds()));
@@ -555,7 +555,7 @@
         Ptr<HeConfiguration> heConfiguration = m_wifiPhy->GetDevice()->GetHeConfiguration();
         if (heConfiguration)
         {
-            bssColor = heConfiguration->GetBssColor();
+            bssColor = heConfiguration->m_bssColor;
         }
     }
     return bssColor;
@@ -985,7 +985,8 @@
     HeRu::SubcarrierGroup group = HeRu::GetSubcarrierGroup(
         channelWidth,
         ru.GetRuType(),
-        ru.GetPhyIndex(channelWidth, m_wifiPhy->GetOperatingChannel().GetPrimaryChannelIndex(20)));
+        ru.GetPhyIndex(channelWidth,
+                       m_wifiPhy->GetOperatingChannel().GetPrimaryChannelIndex(MHz_u{20})));
     // for a TX spectrum, the guard bandwidth is a function of the transmission channel width
     // and the spectrum width equals the transmission channel width (hence bandIndex equals 0)
     const auto indices = ConvertHeRuSubcarriers(channelWidth,
@@ -1015,7 +1016,8 @@
     HeRu::SubcarrierGroup group = HeRu::GetSubcarrierGroup(
         channelWidth,
         ru.GetRuType(),
-        ru.GetPhyIndex(channelWidth, m_wifiPhy->GetOperatingChannel().GetPrimaryChannelIndex(20)));
+        ru.GetPhyIndex(channelWidth,
+                       m_wifiPhy->GetOperatingChannel().GetPrimaryChannelIndex(MHz_u{20})));
     // for an RX spectrum, the guard bandwidth is a function of the operating channel width
     // and the spectrum width equals the operating channel width
     const auto indices = ConvertHeRuSubcarriers(
@@ -1054,7 +1056,7 @@
         channelWidth,
         nonOfdmaRu.GetRuType(),
         nonOfdmaRu.GetPhyIndex(channelWidth,
-                               m_wifiPhy->GetOperatingChannel().GetPrimaryChannelIndex(20)));
+                               m_wifiPhy->GetOperatingChannel().GetPrimaryChannelIndex(MHz_u{20})));
     const auto indices = ConvertHeRuSubcarriers(
         channelWidth,
         GetGuardBandwidth(m_wifiPhy->GetChannelWidth()),
@@ -1080,9 +1082,9 @@
     {
         // the center 26-tone RU in an 80 MHz channel is not fully covered by
         // any 20 MHz channel, but only by an 80 MHz channel
-        return 80;
+        return MHz_u{80};
     }
-    return std::max<MHz_u>(HeRu::GetBandwidth(ru.GetRuType()), 20);
+    return std::max(HeRu::GetBandwidth(ru.GetRuType()), MHz_u{20});
 }
 
 uint64_t
@@ -1102,9 +1104,9 @@
      * primitive for a PPDU received in the primary or at the secondary 20 MHz channel, the
      * secondary 40 MHz channel, or the secondary 80 MHz channel.
      */
-    if (channelWidth >= 40 && ppdu->GetUid() != m_previouslyTxPpduUid)
+    if (channelWidth >= MHz_u{40} && ppdu->GetUid() != m_previouslyTxPpduUid)
     {
-        channelWidth = 20;
+        channelWidth = MHz_u{20};
     }
     return channelWidth;
 }
@@ -1130,9 +1132,9 @@
     const auto ppduBw = ppdu->GetTxVector().GetChannelWidth();
     auto obssPdLevel = m_obssPdAlgorithm->GetObssPdLevel();
     auto bw = ppduBw;
-    while (bw > 20)
+    while (bw > MHz_u{20})
     {
-        obssPdLevel += 3;
+        obssPdLevel += dB_u{3};
         bw /= 2;
     }
 
@@ -1198,7 +1200,7 @@
      * primitive, the PHY shall set the per20bitmap to indicate the busy/idle status of each 20 MHz
      * subchannel.
      */
-    if (m_wifiPhy->GetChannelWidth() < 40)
+    if (m_wifiPhy->GetChannelWidth() < MHz_u{40})
     {
         return {};
     }
@@ -1208,7 +1210,7 @@
         m_wifiPhy->GetChannelWidth());
     for (auto index : indices)
     {
-        auto band = m_wifiPhy->GetBand(20, index);
+        auto band = m_wifiPhy->GetBand(MHz_u{20}, index);
         /**
          * A signal is present on the 20 MHz subchannel at or above a threshold of –62 dBm at the
          * receiver's antenna(s). The PHY shall indicate that the 20 MHz subchannel is busy a period
@@ -1220,15 +1222,15 @@
 
         if (ppdu)
         {
-            const MHz_u subchannelMinFreq =
-                m_wifiPhy->GetFrequency() - (m_wifiPhy->GetChannelWidth() / 2) + (index * 20);
-            const MHz_u subchannelMaxFreq = subchannelMinFreq + 20;
+            const auto subchannelMinFreq = m_wifiPhy->GetFrequency() -
+                                           (m_wifiPhy->GetChannelWidth() / 2) + (index * MHz_u{20});
+            const auto subchannelMaxFreq = subchannelMinFreq + MHz_u{20};
             const auto ppduBw = ppdu->GetTxVector().GetChannelWidth();
 
             if (ppduBw <= m_wifiPhy->GetChannelWidth() &&
                 ppdu->DoesOverlapChannel(subchannelMinFreq, subchannelMaxFreq))
             {
-                std::optional<double> obssPdLevel{std::nullopt};
+                std::optional<dBm_u> obssPdLevel{std::nullopt};
                 if (m_obssPdAlgorithm)
                 {
                     obssPdLevel = m_obssPdAlgorithm->GetObssPdLevel();
@@ -1243,9 +1245,10 @@
                      * The PHY shall indicate that the 20 MHz subchannel is busy with > 90%
                      * probability within a period aCCAMidTime.
                      */
-                    ccaThreshold =
-                        obssPdLevel.has_value() ? std::max(-72.0, obssPdLevel.value()) : -72.0;
-                    band = m_wifiPhy->GetBand(20, index);
+                    ccaThreshold = obssPdLevel.has_value()
+                                       ? std::max(dBm_u{-72.0}, obssPdLevel.value())
+                                       : dBm_u{-72.0};
+                    band = m_wifiPhy->GetBand(MHz_u{20}, index);
                     break;
                 case 40:
                     /**
@@ -1254,9 +1257,10 @@
                      * the receiver's antenna(s) is present. The PHY shall indicate that the 20 MHz
                      * subchannel is busy with > 90% probability within a period aCCAMidTime.
                      */
-                    ccaThreshold =
-                        obssPdLevel.has_value() ? std::max(-72.0, obssPdLevel.value() + 3) : -72.0;
-                    band = m_wifiPhy->GetBand(40, std::floor(index / 2));
+                    ccaThreshold = obssPdLevel.has_value()
+                                       ? std::max(dBm_u{-72.0}, obssPdLevel.value() + dB_u{3})
+                                       : dBm_u{-72.0};
+                    band = m_wifiPhy->GetBand(MHz_u{40}, std::floor(index / 2));
                     break;
                 case 80:
                     /**
@@ -1265,9 +1269,10 @@
                      * receiver's antenna(s) is present. The PHY shall indicate that the 20 MHz
                      * subchannel is busy with > 90% probability within a period aCCAMidTime.
                      */
-                    ccaThreshold =
-                        obssPdLevel.has_value() ? std::max(-69.0, obssPdLevel.value() + 6) : -69.0;
-                    band = m_wifiPhy->GetBand(80, std::floor(index / 4));
+                    ccaThreshold = obssPdLevel.has_value()
+                                       ? std::max(dBm_u{-69.0}, obssPdLevel.value() + dB_u{6})
+                                       : dBm_u{-69.0};
+                    band = m_wifiPhy->GetBand(MHz_u{80}, std::floor(index / 4));
                     break;
                 case 160:
                     // Not defined in the standard: keep -62 dBm
@@ -1317,9 +1322,9 @@
     // training fields that are between the start of the HE portion and the start
     // of the Data field.
     auto maxDelay = GetDuration(WIFI_PPDU_FIELD_TRAINING, txVector);
-    if (heConfiguration->GetMaxTbPpduDelay().IsStrictlyPositive())
+    if (heConfiguration->m_maxTbPpduDelay.IsStrictlyPositive())
     {
-        maxDelay = Min(maxDelay, heConfiguration->GetMaxTbPpduDelay());
+        maxDelay = Min(maxDelay, heConfiguration->m_maxTbPpduDelay);
     }
     return maxDelay;
 }
@@ -1354,7 +1359,7 @@
     const auto& puncturedSubchannels = txVector.GetInactiveSubchannels();
     if (!puncturedSubchannels.empty())
     {
-        const auto p20Index = m_wifiPhy->GetOperatingChannel().GetPrimaryChannelIndex(20);
+        const auto p20Index = m_wifiPhy->GetOperatingChannel().GetPrimaryChannelIndex(MHz_u{20});
         const auto& indices =
             m_wifiPhy->GetOperatingChannel().GetAll20MHzChannelIndicesInPrimary(channelWidth);
         const auto p20IndexInBitmap = p20Index - *(indices.cbegin());
@@ -1370,7 +1375,7 @@
             // non-HE portion is sent only on the 20 MHz channels covering the RU
             const auto staId = GetStaId(ppdu);
             const auto ruWidth = HeRu::GetBandwidth(txVector.GetRu(staId).GetRuType());
-            channelWidth = (ruWidth < 20) ? 20 : ruWidth;
+            channelWidth = (ruWidth < MHz_u{20}) ? MHz_u{20} : ruWidth;
             return WifiSpectrumValueHelper::CreateDuplicated20MhzTxPowerSpectralDensity(
                 GetCenterFrequenciesForNonHePart(ppdu, staId),
                 channelWidth,
@@ -1453,10 +1458,11 @@
         const MHz_u startingFrequency = centerFrequencies.front() - (currentWidth / 2);
         centerFrequencies.front() =
             startingFrequency +
-            nonOfdmaWidth * (nonOfdmaRu.GetPhyIndex(
-                                 currentWidth,
-                                 m_wifiPhy->GetOperatingChannel().GetPrimaryChannelIndex(20)) -
-                             1) +
+            nonOfdmaWidth *
+                (nonOfdmaRu.GetPhyIndex(
+                     currentWidth,
+                     m_wifiPhy->GetOperatingChannel().GetPrimaryChannelIndex(MHz_u{20})) -
+                 1) +
             nonOfdmaWidth / 2;
     }
     return centerFrequencies;
@@ -1473,14 +1479,15 @@
     }
     if (ppdu->GetType() == WIFI_PPDU_TYPE_UL_MU || ppdu->GetType() == WIFI_PPDU_TYPE_DL_MU)
     {
-        dBm_u nonHeTxPower = m_wifiPhy->GetTxPowerForTransmission(ppdu) + m_wifiPhy->GetTxGain();
+        const auto nonHeTxPower =
+            m_wifiPhy->GetTxPowerForTransmission(ppdu) + m_wifiPhy->GetTxGain();
 
         // temporarily set WifiPpdu flag to PSD_HE_PORTION for correct calculation of TX power for
         // the HE portion
         auto hePpdu = DynamicCast<const HePpdu>(ppdu);
         NS_ASSERT(hePpdu);
         hePpdu->SetTxPsdFlag(HePpdu::PSD_HE_PORTION);
-        dBm_u heTxPower = m_wifiPhy->GetTxPowerForTransmission(ppdu) + m_wifiPhy->GetTxGain();
+        const auto heTxPower = m_wifiPhy->GetTxPowerForTransmission(ppdu) + m_wifiPhy->GetTxGain();
         hePpdu->SetTxPsdFlag(HePpdu::PSD_NON_HE_PORTION);
 
         // non-HE portion
@@ -1537,7 +1544,7 @@
         return ConvertLSigLengthToHeTbPpduDuration(txVector.GetLength(), txVector, band);
     }
 
-    Time maxDuration = Seconds(0);
+    Time maxDuration;
     for (auto& staIdPsdu : psduMap)
     {
         if (txVector.IsDlMu())
@@ -1856,7 +1863,7 @@
     std::vector<WifiSpectrumBandIndices> convertedSubcarriers{};
     guardBandwidth /= centerFrequencies.size();
     const auto nGuardBands =
-        static_cast<uint32_t>(((2 * guardBandwidth * 1e6) / subcarrierSpacing) + 0.5);
+        static_cast<uint32_t>(((2 * MHzToHz(guardBandwidth)) / subcarrierSpacing) + 0.5);
     if (bandWidth > (totalWidth / centerFrequencies.size()))
     {
         NS_ASSERT(bandIndex == 0);
@@ -1882,7 +1889,7 @@
         break;
     }
 
-    const auto numBandsInBand = static_cast<size_t>(bandWidth * 1e6 / subcarrierSpacing);
+    const auto numBandsInBand = static_cast<size_t>(MHzToHz(bandWidth) / subcarrierSpacing);
     centerFrequencyIndex += numBandsInBand * bandIndex;
     // start and stop subcarriers might be in different frequency segments, hence define a low and a
     // high center frequency
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/he/he-phy.h ns-3.44/src/wifi/model/he/he-phy.h
--- ns-3.43/src/wifi/model/he/he-phy.h	2024-10-09 16:41:10.120656700 -0700
+++ ns-3.44/src/wifi/model/he/he-phy.h	2025-03-09 16:55:49.791372500 -0700
@@ -21,8 +21,8 @@
 #include <optional>
 
 /**
- * \file
- * \ingroup wifi
+ * @file
+ * @ingroup wifi
  * Declaration of ns3::HePhy class
  * and ns3::HeSigAParameters struct.
  */
@@ -47,8 +47,8 @@
 };
 
 /**
- * \brief PHY entity for HE (11ax)
- * \ingroup wifi
+ * @brief PHY entity for HE (11ax)
+ * @ingroup wifi
  *
  * HE PHY is based on VHT PHY.
  *
@@ -67,7 +67,7 @@
     /**
      * Constructor for HE PHY
      *
-     * \param buildModeList flag used to add HE modes to list (disabled
+     * @param buildModeList flag used to add HE modes to list (disabled
      *                      by child classes to only add child classes' modes)
      */
     HePhy(bool buildModeList = true);
@@ -110,7 +110,7 @@
     Ptr<const WifiPpdu> GetRxPpduFromTxPpdu(Ptr<const WifiPpdu> ppdu) override;
 
     /**
-     * \return the BSS color of this PHY.
+     * @return the BSS color of this PHY.
      */
     uint8_t GetBssColor() const;
 
@@ -119,37 +119,37 @@
      * If the latter is not a feasible duration (considering the selected guard interval),
      * a proper duration is computed and returned along with the L-SIG length value.
      *
-     * \param ppduDuration the duration of the HE TB PPDU
-     * \param txVector the TXVECTOR used for the transmission of this HE TB PPDU
-     * \param band the frequency band being used
+     * @param ppduDuration the duration of the HE TB PPDU
+     * @param txVector the TXVECTOR used for the transmission of this HE TB PPDU
+     * @param band the frequency band being used
      *
-     * \return the L-SIG length value and the adjusted HE TB PPDU duration.
+     * @return the L-SIG length value and the adjusted HE TB PPDU duration.
      */
     static std::pair<uint16_t, Time> ConvertHeTbPpduDurationToLSigLength(
         Time ppduDuration,
         const WifiTxVector& txVector,
         WifiPhyBand band);
     /**
-     * \param length the L-SIG length value
-     * \param txVector the TXVECTOR used for the transmission of this HE TB PPDU
-     * \param band the frequency band being used
+     * @param length the L-SIG length value
+     * @param txVector the TXVECTOR used for the transmission of this HE TB PPDU
+     * @param band the frequency band being used
      *
-     * \return the duration of the HE TB PPDU corresponding to that L-SIG length value.
+     * @return the duration of the HE TB PPDU corresponding to that L-SIG length value.
      */
     static Time ConvertLSigLengthToHeTbPpduDuration(uint16_t length,
                                                     const WifiTxVector& txVector,
                                                     WifiPhyBand band);
     /**
-     * \param txVector the transmission parameters used for the HE TB PPDU
+     * @param txVector the transmission parameters used for the HE TB PPDU
      *
-     * \return the duration of the non-HE portion of the HE TB PPDU.
+     * @return the duration of the non-HE portion of the HE TB PPDU.
      */
     virtual Time CalculateNonHeDurationForHeTb(const WifiTxVector& txVector) const;
 
     /**
-     * \param txVector the transmission parameters used for the HE MU PPDU
+     * @param txVector the transmission parameters used for the HE MU PPDU
      *
-     * \return the duration of the non-HE portion of the HE MU PPDU.
+     * @return the duration of the non-HE portion of the HE MU PPDU.
      */
     virtual Time CalculateNonHeDurationForHeMu(const WifiTxVector& txVector) const;
 
@@ -157,41 +157,41 @@
      * Get the band in the TX spectrum associated with the RU used by the PSDU
      * transmitted to/by a given STA in a DL MU PPDU/HE TB PPDU
      *
-     * \param txVector the TXVECTOR used for the transmission
-     * \param staId the STA-ID of the station
+     * @param txVector the TXVECTOR used for the transmission
+     * @param staId the STA-ID of the station
      *
-     * \return the RU band in the TX spectrum
+     * @return the RU band in the TX spectrum
      */
     WifiSpectrumBandInfo GetRuBandForTx(const WifiTxVector& txVector, uint16_t staId) const;
     /**
      * Get the band in the RX spectrum associated with the RU used by the PSDU
      * transmitted to/by a given STA in a DL MU PPDU/HE TB PPDU
      *
-     * \param txVector the TXVECTOR used for the transmission
-     * \param staId the STA-ID of the station
+     * @param txVector the TXVECTOR used for the transmission
+     * @param staId the STA-ID of the station
      *
-     * \return the RU band in the RX spectrum
+     * @return the RU band in the RX spectrum
      */
     WifiSpectrumBandInfo GetRuBandForRx(const WifiTxVector& txVector, uint16_t staId) const;
     /**
      * Get the band used to transmit the non-OFDMA part of an HE TB PPDU.
      *
-     * \param txVector the TXVECTOR used for the transmission
-     * \param staId the STA-ID of the station taking part of the UL MU
+     * @param txVector the TXVECTOR used for the transmission
+     * @param staId the STA-ID of the station taking part of the UL MU
      *
-     * \return the spectrum band used to transmit the non-OFDMA part of an HE TB PPDU
+     * @return the spectrum band used to transmit the non-OFDMA part of an HE TB PPDU
      */
     WifiSpectrumBandInfo GetNonOfdmaBand(const WifiTxVector& txVector, uint16_t staId) const;
     /**
      * Get the width of the non-OFDMA portion of an HE TB PPDU
      *
-     * \param ru the RU in which the HE TB PPDU is sent
-     * \return the width of the non-OFDMA portion of an HE TB PPDU
+     * @param ru the RU in which the HE TB PPDU is sent
+     * @return the width of the non-OFDMA portion of an HE TB PPDU
      */
     MHz_u GetNonOfdmaWidth(HeRu::RuSpec ru) const;
 
     /**
-     * \return the UID of the HE TB PPDU being received
+     * @return the UID of the HE TB PPDU being received
      */
     uint64_t GetCurrentHeTbPpduUid() const;
 
@@ -199,8 +199,8 @@
      * Set the TRIGVECTOR and the associated expiration time. A TRIGVECTOR shall expire
      * when the TX timer associated with the transmission of the Trigger Frame expires.
      *
-     * \param trigVector the TRIGVECTOR
-     * \param validity the amount of time (from now) until expiration of the TRIGVECTOR
+     * @param trigVector the TRIGVECTOR
+     * @param validity the amount of time (from now) until expiration of the TRIGVECTOR
      */
     void SetTrigVector(const WifiTxVector& trigVector, Time validity);
 
@@ -208,9 +208,9 @@
      * Get the center frequency per segment of the non-HE portion of the current PPDU for the given
      * STA-ID. Note this method is only to be used for UL MU.
      *
-     * \param ppdu the PPDU
-     * \param staId the STA-ID of the station taking part of the UL MU
-     * \return the center frequency corresponding to the non-HE portion of the HE TB PPDU
+     * @param ppdu the PPDU
+     * @param staId the STA-ID of the station taking part of the UL MU
+     * @return the center frequency corresponding to the non-HE portion of the HE TB PPDU
      */
     std::vector<MHz_u> GetCenterFrequenciesForNonHePart(const Ptr<const WifiPpdu> ppdu,
                                                         uint16_t staId) const;
@@ -218,21 +218,21 @@
     /**
      * Sets the OBSS-PD algorithm.
      *
-     * \param algorithm the OBSS-PD algorithm
+     * @param algorithm the OBSS-PD algorithm
      */
     void SetObssPdAlgorithm(const Ptr<ObssPdAlgorithm> algorithm);
 
     /**
      * Gets the OBSS-PD algorithm.
      *
-     * \return the OBSS-PD algorithm
+     * @return the OBSS-PD algorithm
      */
     Ptr<ObssPdAlgorithm> GetObssPdAlgorithm() const;
 
     /**
      * Set a callback for a end of HE-SIG-A.
      *
-     * \param callback the EndOfHeSigACallback to set
+     * @param callback the EndOfHeSigACallback to set
      */
     void SetEndOfHeSigACallback(EndOfHeSigACallback callback);
 
@@ -241,7 +241,7 @@
      * This method is scheduled immediately after end of HE-SIG-A, once
      * field processing is finished.
      *
-     * \param params the HE-SIG-A parameters
+     * @param params the HE-SIG-A parameters
      */
     void NotifyEndOfHeSigA(HeSigAParameters params);
 
@@ -253,81 +253,81 @@
      * Return the HE MCS corresponding to
      * the provided index.
      *
-     * \param index the index of the MCS
-     * \return an HE MCS
+     * @param index the index of the MCS
+     * @return an HE MCS
      */
     static WifiMode GetHeMcs(uint8_t index);
 
     /**
      * Return MCS 0 from HE MCS values.
      *
-     * \return MCS 0 from HE MCS values
+     * @return MCS 0 from HE MCS values
      */
     static WifiMode GetHeMcs0();
     /**
      * Return MCS 1 from HE MCS values.
      *
-     * \return MCS 1 from HE MCS values
+     * @return MCS 1 from HE MCS values
      */
     static WifiMode GetHeMcs1();
     /**
      * Return MCS 2 from HE MCS values.
      *
-     * \return MCS 2 from HE MCS values
+     * @return MCS 2 from HE MCS values
      */
     static WifiMode GetHeMcs2();
     /**
      * Return MCS 3 from HE MCS values.
      *
-     * \return MCS 3 from HE MCS values
+     * @return MCS 3 from HE MCS values
      */
     static WifiMode GetHeMcs3();
     /**
      * Return MCS 4 from HE MCS values.
      *
-     * \return MCS 4 from HE MCS values
+     * @return MCS 4 from HE MCS values
      */
     static WifiMode GetHeMcs4();
     /**
      * Return MCS 5 from HE MCS values.
      *
-     * \return MCS 5 from HE MCS values
+     * @return MCS 5 from HE MCS values
      */
     static WifiMode GetHeMcs5();
     /**
      * Return MCS 6 from HE MCS values.
      *
-     * \return MCS 6 from HE MCS values
+     * @return MCS 6 from HE MCS values
      */
     static WifiMode GetHeMcs6();
     /**
      * Return MCS 7 from HE MCS values.
      *
-     * \return MCS 7 from HE MCS values
+     * @return MCS 7 from HE MCS values
      */
     static WifiMode GetHeMcs7();
     /**
      * Return MCS 8 from HE MCS values.
      *
-     * \return MCS 8 from HE MCS values
+     * @return MCS 8 from HE MCS values
      */
     static WifiMode GetHeMcs8();
     /**
      * Return MCS 9 from HE MCS values.
      *
-     * \return MCS 9 from HE MCS values
+     * @return MCS 9 from HE MCS values
      */
     static WifiMode GetHeMcs9();
     /**
      * Return MCS 10 from HE MCS values.
      *
-     * \return MCS 10 from HE MCS values
+     * @return MCS 10 from HE MCS values
      */
     static WifiMode GetHeMcs10();
     /**
      * Return MCS 11 from HE MCS values.
      *
-     * \return MCS 11 from HE MCS values
+     * @return MCS 11 from HE MCS values
      */
     static WifiMode GetHeMcs11();
 
@@ -336,8 +336,8 @@
      * the supplied HE MCS index. This function is used
      * as a callback for WifiMode operation.
      *
-     * \param mcsValue the MCS index
-     * \return the coding rate.
+     * @param mcsValue the MCS index
+     * @return the coding rate.
      */
     static WifiCodeRate GetCodeRate(uint8_t mcsValue);
     /**
@@ -345,8 +345,8 @@
      * to the supplied HE MCS index. This function is used
      * as a callback for WifiMode operation.
      *
-     * \param mcsValue the MCS index
-     * \return the size of modulation constellation.
+     * @param mcsValue the MCS index
+     * @return the size of modulation constellation.
      */
     static uint16_t GetConstellationSize(uint8_t mcsValue);
     /**
@@ -355,12 +355,12 @@
      * spatial stream. This function calls HtPhy::CalculatePhyRate
      * and is mainly used as a callback for WifiMode operation.
      *
-     * \param mcsValue the HE MCS index
-     * \param channelWidth the considered channel width
-     * \param guardInterval the considered guard interval duration
-     * \param nss the considered number of stream
+     * @param mcsValue the HE MCS index
+     * @param channelWidth the considered channel width
+     * @param guardInterval the considered guard interval duration
+     * @param nss the considered number of stream
      *
-     * \return the physical bit rate of this signal in bps.
+     * @return the physical bit rate of this signal in bps.
      */
     static uint64_t GetPhyRate(uint8_t mcsValue,
                                MHz_u channelWidth,
@@ -370,9 +370,9 @@
      * Return the PHY rate corresponding to
      * the supplied TXVECTOR for the STA-ID.
      *
-     * \param txVector the TXVECTOR used for the transmission
-     * \param staId the station ID for MU (unused if SU)
-     * \return the physical bit rate of this signal in bps.
+     * @param txVector the TXVECTOR used for the transmission
+     * @param staId the station ID for MU (unused if SU)
+     * @return the physical bit rate of this signal in bps.
      */
     static uint64_t GetPhyRateFromTxVector(const WifiTxVector& txVector,
                                            uint16_t staId = SU_STA_ID);
@@ -380,9 +380,9 @@
      * Return the data rate corresponding to
      * the supplied TXVECTOR for the STA-ID.
      *
-     * \param txVector the TXVECTOR used for the transmission
-     * \param staId the station ID for MU (unused if SU)
-     * \return the data bit rate in bps.
+     * @param txVector the TXVECTOR used for the transmission
+     * @param staId the station ID for MU (unused if SU)
+     * @return the data bit rate in bps.
      */
     static uint64_t GetDataRateFromTxVector(const WifiTxVector& txVector,
                                             uint16_t staId = SU_STA_ID);
@@ -392,11 +392,11 @@
      * guard interval, and number of spatial
      * streams.
      *
-     * \param mcsValue the MCS index
-     * \param channelWidth the channel width
-     * \param guardInterval the guard interval duration
-     * \param nss the number of spatial streams
-     * \return the data bit rate in bps.
+     * @param mcsValue the MCS index
+     * @param channelWidth the channel width
+     * @param guardInterval the guard interval duration
+     * @param nss the number of spatial streams
+     * @return the data bit rate in bps.
      */
     static uint64_t GetDataRate(uint8_t mcsValue,
                                 MHz_u channelWidth,
@@ -407,16 +407,16 @@
      * to the supplied HE MCS index. This function calls CalculateNonHtReferenceRate
      * and is used as a callback for WifiMode operation.
      *
-     * \param mcsValue the HE MCS index
-     * \return the rate in bps of the non-HT Reference Rate.
+     * @param mcsValue the HE MCS index
+     * @return the rate in bps of the non-HT Reference Rate.
      */
     static uint64_t GetNonHtReferenceRate(uint8_t mcsValue);
     /**
      * Check whether the combination in TXVECTOR is allowed.
      * This function is used as a callback for WifiMode operation.
      *
-     * \param txVector the TXVECTOR
-     * \returns true if this combination is allowed, false otherwise.
+     * @param txVector the TXVECTOR
+     * @returns true if this combination is allowed, false otherwise.
      */
     static bool IsAllowed(const WifiTxVector& txVector);
 
@@ -425,27 +425,27 @@
      * the provided index.
      * This method binds all the callbacks used by WifiMode.
      *
-     * \param index the index of the MCS
-     * \return an HE MCS
+     * @param index the index of the MCS
+     * @return an HE MCS
      */
     static WifiMode CreateHeMcs(uint8_t index);
 
     /**
-     * \param guardInterval the guard interval duration
-     * \return the symbol duration
+     * @param guardInterval the guard interval duration
+     * @return the symbol duration
      */
     static Time GetSymbolDuration(Time guardInterval);
 
     /**
-     * \param bandWidth the width of the band used for the OFDMA transmission. Must be a multiple of
+     * @param bandWidth the width of the band used for the OFDMA transmission. Must be a multiple of
      * 20 MHz
-     * \param guardBandwidth width of the guard band
-     * \param centerFrequencies the center frequency of each segment
-     * \param totalWidth the width of the operating channel
-     * \param subcarrierSpacing the subcarrier spacing
-     * \param subcarrierRange the subcarrier range of the HE RU
-     * \param bandIndex the index (starting at 0) of the band within the operating channel
-     * \return the converted subcarriers
+     * @param guardBandwidth width of the guard band
+     * @param centerFrequencies the center frequency of each segment
+     * @param totalWidth the width of the operating channel
+     * @param subcarrierSpacing the subcarrier spacing
+     * @param subcarrierRange the subcarrier range of the HE RU
+     * @param bandIndex the index (starting at 0) of the band within the operating channel
+     * @return the converted subcarriers
      *
      * This is a helper function to convert HE RU subcarriers, which are relative to the center
      * frequency subcarrier, to the indexes used by the Spectrum model. The size of the returned
@@ -495,10 +495,10 @@
      * Process SIG-A, perform amendment-specific actions, and
      * provide an updated status of the reception.
      *
-     * \param event the event holding incoming PPDU's information
-     * \param status the status of the reception of the correctly received SIG-A after the
+     * @param event the event holding incoming PPDU's information
+     * @param status the status of the reception of the correctly received SIG-A after the
      * configuration support check
-     * \return the updated status of the reception of the SIG-A
+     * @return the updated status of the reception of the SIG-A
      */
     virtual PhyFieldRxStatus ProcessSigA(Ptr<Event> event, PhyFieldRxStatus status);
 
@@ -506,16 +506,16 @@
      * Process SIG-B, perform amendment-specific actions, and
      * provide an updated status of the reception.
      *
-     * \param event the event holding incoming PPDU's information
-     * \param status the status of the reception of the correctly received SIG-A after the
+     * @param event the event holding incoming PPDU's information
+     * @param status the status of the reception of the correctly received SIG-A after the
      * configuration support check
-     * \return the updated status of the reception of the SIG-B
+     * @return the updated status of the reception of the SIG-B
      */
     virtual PhyFieldRxStatus ProcessSigB(Ptr<Event> event, PhyFieldRxStatus status);
 
     /**
-     * \param txVector the transmission parameters
-     * \return the number of bits of the HE-SIG-B
+     * @param txVector the transmission parameters
+     * @return the number of bits of the HE-SIG-B
      */
     virtual uint32_t GetSigBSize(const WifiTxVector& txVector) const;
 
@@ -524,7 +524,7 @@
      * transmission. This function is called upon the RX event corresponding to the HE portion of
      * the MU PPDU.
      *
-     * \param event the event holding incoming HE portion of the PPDU's information
+     * @param event the event holding incoming HE portion of the PPDU's information
      */
     void StartReceiveMuPayload(Ptr<Event> event);
 
@@ -533,9 +533,9 @@
      * which corresponds to the supplied code rate and
      * constellation size.
      *
-     * \param codeRate the convolutional coding rate
-     * \param constellationSize the size of modulation constellation
-     * \returns the rate in bps.
+     * @param codeRate the convolutional coding rate
+     * @param constellationSize the size of modulation constellation
+     * @returns the rate in bps.
      *
      * To convert an HE MCS to its corresponding non-HT Reference Rate
      * use the modulation and coding rate of the HT MCS
@@ -544,8 +544,8 @@
     static uint64_t CalculateNonHtReferenceRate(WifiCodeRate codeRate, uint16_t constellationSize);
 
     /**
-     * \param channelWidth the channel width
-     * \return the number of usable subcarriers for data
+     * @param channelWidth the channel width
+     * @return the number of usable subcarriers for data
      */
     static uint16_t GetUsableSubcarriers(MHz_u channelWidth);
 
@@ -571,10 +571,10 @@
     /**
      * This is a helper function to create the TX PSD of the non-HE and HE portions.
      *
-     * \param txPower power to spread across the bands
-     * \param ppdu the PPDU that will be transmitted
-     * \param flag flag indicating whether the PSD is for non-HE portion or HE portion
-     * \return Pointer to SpectrumValue
+     * @param txPower power to spread across the bands
+     * @param ppdu the PPDU that will be transmitted
+     * @param flag flag indicating whether the PSD is for non-HE portion or HE portion
+     * @return Pointer to SpectrumValue
      */
     Ptr<SpectrumValue> GetTxPowerSpectralDensity(Watt_u txPower,
                                                  Ptr<const WifiPpdu> ppdu,
@@ -583,10 +583,10 @@
     /**
      * Start the transmission of the HE portion of the MU PPDU.
      *
-     * \param ppdu the PPDU
-     * \param txPower the total TX power
-     * \param txPowerSpectrum the TX PSD
-     * \param hePortionDuration the duration of the HE portion
+     * @param ppdu the PPDU
+     * @param txPower the total TX power
+     * @param txPowerSpectrum the TX PSD
+     * @param hePortionDuration the duration of the HE portion
      */
     void StartTxHePortion(Ptr<const WifiPpdu> ppdu,
                           dBm_u txPower,
@@ -596,9 +596,9 @@
     /**
      * Notify PHY state helper to switch to CCA busy state,
      *
-     * \param duration the duration of the CCA state
-     * \param channelType the channel type for which the CCA busy state is reported.
-     * \param per20MHzDurations the per-20 MHz CCA durations vector
+     * @param duration the duration of the CCA state
+     * @param channelType the channel type for which the CCA busy state is reported.
+     * @param per20MHzDurations the per-20 MHz CCA durations vector
      */
     void NotifyCcaBusy(Time duration,
                        WifiChannelListType channelType,
@@ -611,8 +611,8 @@
      * indicates that the subchannel is idle. The vector is non-empty if the
      * operational channel width is larger than 20 MHz.
      *
-     * \param ppdu the incoming PPDU or nullptr for any signal
-     * \return the per-20 MHz CCA durations vector
+     * @param ppdu the incoming PPDU or nullptr for any signal
+     * @return the per-20 MHz CCA durations vector
      */
     std::vector<Time> GetPer20MHzDurations(const Ptr<const WifiPpdu> ppdu);
 
@@ -621,10 +621,10 @@
      * the PHY band, compute a valid PPDU duration considering the number and
      * duration of symbols, the preamble duration and the guard interval.
      *
-     * \param ppduDuration the given PPDU duration
-     * \param txVector the given TXVECTOR
-     * \param band the PHY band
-     * \return a valid PPDU duration
+     * @param ppduDuration the given PPDU duration
+     * @param txVector the given TXVECTOR
+     * @param band the PHY band
+     * @return a valid PPDU duration
      */
     static Time GetValidPpduDuration(Time ppduDuration,
                                      const WifiTxVector& txVector,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/he/he-ppdu.cc ns-3.44/src/wifi/model/he/he-ppdu.cc
--- ns-3.43/src/wifi/model/he/he-ppdu.cc	2024-10-09 16:41:10.120656700 -0700
+++ ns-3.44/src/wifi/model/he/he-ppdu.cc	2025-03-09 16:55:49.791372500 -0700
@@ -119,7 +119,7 @@
     }
     else if (ns3::IsDlMu(m_preamble))
     {
-        const auto p20Index = m_operatingChannel.GetPrimaryChannelIndex(20);
+        const auto p20Index = m_operatingChannel.GetPrimaryChannelIndex(MHz_u{20});
         const uint8_t noMuMimoUsers{0};
         m_heSig.emplace<HeMuSigHeader>(HeMuSigHeader{
             .m_bssColor = bssColor,
@@ -134,7 +134,7 @@
             .m_ruAllocation = txVector.GetRuAllocation(p20Index),
             .m_contentChannels = GetHeSigBContentChannels(txVector, p20Index),
             .m_center26ToneRuIndication =
-                (txVector.GetChannelWidth() >= 80)
+                (txVector.GetChannelWidth() >= MHz_u{80})
                     ? std::optional{txVector.GetCenter26ToneRuIndication()}
                     : std::nullopt});
     }
@@ -196,7 +196,7 @@
                          heSigHeader->m_sigBCompression,
                          GetMuMimoUsersFromEncoding(heSigHeader->m_muMimoUsers));
         txVector.SetSigBMode(HePhy::GetVhtMcs(heSigHeader->m_sigBMcs));
-        const auto p20Index = m_operatingChannel.GetPrimaryChannelIndex(20);
+        const auto p20Index = m_operatingChannel.GetPrimaryChannelIndex(MHz_u{20});
         txVector.SetRuAllocation(heSigHeader->m_ruAllocation, p20Index);
         if (heSigHeader->m_center26ToneRuIndication.has_value())
         {
@@ -258,24 +258,24 @@
             auto ruSpec = ruSpecs.at(ruIndex);
             auto ruType = ruSpec.GetRuType();
             if ((ruAllocation.size() == 8) && (ruType == HeRu::RU_996_TONE) &&
-                (((txVector.GetChannelWidth() == 160) && sigBcompression) ||
+                (((txVector.GetChannelWidth() == MHz_u{160}) && sigBcompression) ||
                  std::all_of(
                      contentChannel.cbegin(),
                      contentChannel.cend(),
                      [&userInfo](const auto& item) { return userInfo.staId == item.staId; })))
             {
-                NS_ASSERT(txVector.GetChannelWidth() == 160);
                 ruType = HeRu::RU_2x996_TONE;
             }
             const auto ruBw = HeRu::GetBandwidth(ruType);
             auto primary80 = ruAllocIndex < 4;
-            const uint8_t num20MhzSubchannelsInRu = (ruBw < 20) ? 1 : (ruBw / 20);
+            const uint8_t num20MhzSubchannelsInRu =
+                (ruBw < MHz_u{20}) ? 1 : Count20MHzSubchannels(ruBw);
             auto numRuAllocsInContentChannel = std::max(1, num20MhzSubchannelsInRu / 2);
-            auto ruIndexOffset = (ruBw < 20) ? (ruSpecs.size() * ruAllocIndex)
-                                             : (ruAllocIndex / num20MhzSubchannelsInRu);
+            auto ruIndexOffset = (ruBw < MHz_u{20}) ? (ruSpecs.size() * ruAllocIndex)
+                                                    : (ruAllocIndex / num20MhzSubchannelsInRu);
             if (!primary80)
             {
-                ruIndexOffset -= HeRu::GetRusOfType(80, ruType).size();
+                ruIndexOffset -= HeRu::GetRusOfType(MHz_u{80}, ruType).size();
             }
             if (!txVector.IsAllocated(userInfo.staId))
             {
@@ -302,7 +302,7 @@
 Time
 HePpdu::GetTxDuration() const
 {
-    Time ppduDuration = Seconds(0);
+    Time ppduDuration;
     const auto& txVector = GetTxVector();
     const auto length = m_lSig.GetLength();
     const auto tSymbol = HePhy::GetSymbolDuration(txVector.GetGuardInterval());
@@ -411,7 +411,8 @@
     {
         TxPsdFlag flag = GetTxPsdFlag();
         const auto ruWidth = HeRu::GetBandwidth(txVector.GetRu(GetStaId()).GetRuType());
-        MHz_u channelWidth = (flag == PSD_NON_HE_PORTION && ruWidth < 20) ? 20 : ruWidth;
+        MHz_u channelWidth =
+            (flag == PSD_NON_HE_PORTION && ruWidth < MHz_u{20}) ? MHz_u{20} : ruWidth;
         NS_LOG_INFO("Use channelWidth=" << channelWidth << " MHz for HE TB from " << GetStaId()
                                         << " for " << flag);
         return channelWidth;
@@ -486,7 +487,7 @@
         // If the HE-SIG-B Compression field in the HE-SIG-A field of an HE MU PPDU is 1,
         // for bandwidths larger than 20 MHz, the AP performs an equitable split of
         // the User fields between two HE-SIG-B content channels
-        if (channelWidth == 20)
+        if (channelWidth == MHz_u{20})
         {
             return {numMuMimoUsers, 0};
         }
@@ -500,8 +501,7 @@
     }
 
     NS_ASSERT_MSG(!ruAllocation.empty(), "RU allocation is not set");
-    [[maybe_unused]] const std::size_t num20MhzSubchannels = channelWidth / 20;
-    NS_ASSERT_MSG(ruAllocation.size() == num20MhzSubchannels,
+    NS_ASSERT_MSG(ruAllocation.size() == Count20MHzSubchannels(channelWidth),
                   "RU allocation is not consistent with packet bandwidth");
 
     switch (static_cast<uint16_t>(channelWidth))
@@ -513,7 +513,7 @@
         chSize.first += HeRu::GetRuSpecs(ruAllocation[0]).size();
         break;
     default:
-        for (auto n = 0; n < channelWidth / 20;)
+        for (std::size_t n = 0; n < Count20MHzSubchannels(channelWidth);)
         {
             chSize.first += HeRu::GetRuSpecs(ruAllocation[n]).size();
             if (ruAllocation[n] >= 208)
@@ -524,7 +524,7 @@
             }
             n += 2;
         }
-        for (auto n = 0; n < channelWidth / 20;)
+        for (std::size_t n = 0; n < Count20MHzSubchannels(channelWidth);)
         {
             chSize.second += HeRu::GetRuSpecs(ruAllocation[n + 1]).size();
             if (ruAllocation[n + 1] >= 208)
@@ -546,7 +546,7 @@
     HeSigBContentChannels contentChannels{{}};
 
     const auto channelWidth = txVector.GetChannelWidth();
-    if (channelWidth > 20)
+    if (channelWidth > MHz_u{20})
     {
         contentChannels.emplace_back();
     }
@@ -572,14 +572,14 @@
 
         std::size_t numRus = (ruType >= HeRu::RU_242_TONE)
                                  ? 1
-                                 : HeRu::m_heRuSubcarrierGroups.at({20, ruType}).size();
+                                 : HeRu::m_heRuSubcarrierGroups.at({MHz_u{20}, ruType}).size();
         const auto ruIdx = ru.GetIndex();
         for (auto staId : staIds)
         {
             const auto& userInfo = txVector.GetHeMuUserInfo(staId);
             NS_ASSERT(ru == userInfo.ru);
             std::size_t ccIndex{0};
-            if (channelWidth < 40)
+            if (channelWidth < MHz_u{40})
             {
                 // only one content channel
                 ccIndex = 0;
@@ -636,14 +636,15 @@
     if (!sigBCompression)
     {
         commonFieldSize = 4 /* CRC */ + 6 /* tail */;
-        if (channelWidth <= 40)
+        if (channelWidth <= MHz_u{40})
         {
             commonFieldSize += 8; // only one allocation subfield
         }
         else
         {
             commonFieldSize +=
-                8 * (channelWidth / 40) /* one allocation field per 40 MHz */ + 1 /* center RU */;
+                8 * (channelWidth / MHz_u{40}) /* one allocation field per 40 MHz */ +
+                1 /* center RU */;
         }
     }
 
@@ -684,15 +685,15 @@
 uint8_t
 HePpdu::GetChannelWidthEncodingFromMhz(MHz_u channelWidth)
 {
-    if (channelWidth == 160)
+    if (channelWidth == MHz_u{160})
     {
         return 3;
     }
-    else if (channelWidth == 80)
+    else if (channelWidth == MHz_u{80})
     {
         return 2;
     }
-    else if (channelWidth == 40)
+    else if (channelWidth == MHz_u{40})
     {
         return 1;
     }
@@ -707,19 +708,19 @@
 {
     if (bandwidth == 3)
     {
-        return 160;
+        return MHz_u{160};
     }
     else if (bandwidth == 2)
     {
-        return 80;
+        return MHz_u{80};
     }
     else if (bandwidth == 1)
     {
-        return 40;
+        return MHz_u{40};
     }
     else
     {
-        return 20;
+        return MHz_u{20};
     }
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/he/he-ppdu.h ns-3.44/src/wifi/model/he/he-ppdu.h
--- ns-3.43/src/wifi/model/he/he-ppdu.h	2024-10-09 16:41:10.120656700 -0700
+++ ns-3.44/src/wifi/model/he/he-ppdu.h	2025-03-09 16:55:49.791372500 -0700
@@ -16,8 +16,8 @@
 #include <variant>
 
 /**
- * \file
- * \ingroup wifi
+ * @file
+ * @ingroup wifi
  * Declaration of ns3::HePpdu class.
  */
 
@@ -30,8 +30,8 @@
 class WifiPsdu;
 
 /**
- * \brief HE PPDU (11ax)
- * \ingroup wifi
+ * @brief HE PPDU (11ax)
+ * @ingroup wifi
  *
  * HePpdu stores a preamble, PHY headers and a map of PSDUs of a PPDU with HE header
  */
@@ -109,11 +109,11 @@
     /**
      * Create an SU HE PPDU, storing a PSDU.
      *
-     * \param psdu the PHY payload (PSDU)
-     * \param txVector the TXVECTOR that was used for this PPDU
-     * \param channel the operating channel of the PHY used to transmit this PPDU
-     * \param ppduDuration the transmission duration of this PPDU
-     * \param uid the unique ID of this PPDU
+     * @param psdu the PHY payload (PSDU)
+     * @param txVector the TXVECTOR that was used for this PPDU
+     * @param channel the operating channel of the PHY used to transmit this PPDU
+     * @param ppduDuration the transmission duration of this PPDU
+     * @param uid the unique ID of this PPDU
      */
     HePpdu(Ptr<const WifiPsdu> psdu,
            const WifiTxVector& txVector,
@@ -125,12 +125,12 @@
      *
      * This PPDU can either be UL or DL.
      *
-     * \param psdus the PHY payloads (PSDUs)
-     * \param txVector the TXVECTOR that was used for this PPDU
-     * \param channel the operating channel of the PHY used to transmit this PPDU
-     * \param ppduDuration the transmission duration of this PPDU
-     * \param uid the unique ID of this PPDU or of the triggering PPDU if this is an HE TB PPDU
-     * \param flag the flag indicating the type of Tx PSD to build
+     * @param psdus the PHY payloads (PSDUs)
+     * @param txVector the TXVECTOR that was used for this PPDU
+     * @param channel the operating channel of the PHY used to transmit this PPDU
+     * @param ppduDuration the transmission duration of this PPDU
+     * @param uid the unique ID of this PPDU or of the triggering PPDU if this is an HE TB PPDU
+     * @param flag the flag indicating the type of Tx PSD to build
      */
     HePpdu(const WifiConstPsduMap& psdus,
            const WifiTxVector& txVector,
@@ -148,23 +148,23 @@
     /**
      * Get the payload of the PPDU.
      *
-     * \param bssColor the BSS color of the PHY calling this function.
-     * \param staId the STA-ID of the PHY calling this function.
-     * \return the PSDU
+     * @param bssColor the BSS color of the PHY calling this function.
+     * @param staId the STA-ID of the PHY calling this function.
+     * @return the PSDU
      */
     Ptr<const WifiPsdu> GetPsdu(uint8_t bssColor, uint16_t staId = SU_STA_ID) const;
 
     /**
-     * \return the transmit PSD flag set for this PPDU
+     * @return the transmit PSD flag set for this PPDU
      *
-     * \see TxPsdFlag
+     * @see TxPsdFlag
      */
     TxPsdFlag GetTxPsdFlag() const;
 
     /**
-     * \param flag the transmit PSD flag set for this PPDU
+     * @param flag the transmit PSD flag set for this PPDU
      *
-     * \see TxPsdFlag
+     * @see TxPsdFlag
      */
     void SetTxPsdFlag(TxPsdFlag flag) const;
 
@@ -173,7 +173,7 @@
      * is not available from the PHY headers but it requires information from the TRIGVECTOR
      * of the AP expecting these HE TB PPDUs.
      *
-     * \param trigVector the TRIGVECTOR or std::nullopt if no TRIGVECTOR is available at the caller
+     * @param trigVector the TRIGVECTOR or std::nullopt if no TRIGVECTOR is available at the caller
      */
     void UpdateTxVectorForUlMu(const std::optional<WifiTxVector>& trigVector) const;
 
@@ -182,11 +182,11 @@
      * This is applicable only for MU.
      * See section 27.3.10.8.3 of IEEE 802.11ax draft 4.0.
      *
-     * \param channelWidth the channel width occupied by the PPDU
-     * \param ruAllocation 8 bit RU_ALLOCATION per 20 MHz
-     * \param sigBCompression flag whether SIG-B compression is used by the PPDU
-     * \param numMuMimoUsers the number of MU-MIMO users addressed by the PPDU
-     * \return a pair containing the number of RUs in each HE-SIG-B content channel (resp. 1 and 2)
+     * @param channelWidth the channel width occupied by the PPDU
+     * @param ruAllocation 8 bit RU_ALLOCATION per 20 MHz
+     * @param sigBCompression flag whether SIG-B compression is used by the PPDU
+     * @param numMuMimoUsers the number of MU-MIMO users addressed by the PPDU
+     * @return a pair containing the number of RUs in each HE-SIG-B content channel (resp. 1 and 2)
      */
     static std::pair<std::size_t, std::size_t> GetNumRusPerHeSigBContentChannel(
         MHz_u channelWidth,
@@ -198,20 +198,20 @@
      * Get the HE SIG-B content channels for a given PPDU
      * IEEE 802.11ax-2021 27.3.11.8.2 HE-SIG-B content channels
      *
-     * \param txVector the TXVECTOR used for the PPDU
-     * \param p20Index the index of the primary20 channel
-     * \return HE-SIG-B content channels
+     * @param txVector the TXVECTOR used for the PPDU
+     * @param p20Index the index of the primary20 channel
+     * @return HE-SIG-B content channels
      */
     static HeSigBContentChannels GetHeSigBContentChannels(const WifiTxVector& txVector,
                                                           uint8_t p20Index);
 
     /**
      * Get variable length HE SIG-B field size
-     * \param channelWidth the channel width occupied by the PPDU
-     * \param ruAllocation 8 bit RU_ALLOCATION per 20 MHz
-     * \param sigBCompression flag whether SIG-B compression is used by the PPDU
-     * \param numMuMimoUsers the number of MU-MIMO users addressed by the PPDU
-     * \return field size in bytes
+     * @param channelWidth the channel width occupied by the PPDU
+     * @param ruAllocation 8 bit RU_ALLOCATION per 20 MHz
+     * @param sigBCompression flag whether SIG-B compression is used by the PPDU
+     * @param numMuMimoUsers the number of MU-MIMO users addressed by the PPDU
+     * @return field size in bytes
      */
     static uint32_t GetSigBFieldSize(MHz_u channelWidth,
                                      const RuAllocation& ruAllocation,
@@ -222,18 +222,18 @@
     /**
      * Fill in the TXVECTOR from PHY headers.
      *
-     * \param txVector the TXVECTOR to fill in
+     * @param txVector the TXVECTOR to fill in
      */
     virtual void SetTxVectorFromPhyHeaders(WifiTxVector& txVector) const;
 
     /**
      * Reconstruct HeMuUserInfoMap from HE-SIG-B header.
      *
-     * \param txVector the TXVECTOR to set its HeMuUserInfoMap
-     * \param ruAllocation the RU_ALLOCATION per 20 MHz
-     * \param contentChannels the HE-SIG-B content channels
-     * \param sigBCompression flag whether SIG-B compression is used by the PPDU
-     * \param numMuMimoUsers the number of MU-MIMO users addressed by the PPDU
+     * @param txVector the TXVECTOR to set its HeMuUserInfoMap
+     * @param ruAllocation the RU_ALLOCATION per 20 MHz
+     * @param contentChannels the HE-SIG-B content channels
+     * @param sigBCompression flag whether SIG-B compression is used by the PPDU
+     * @param numMuMimoUsers the number of MU-MIMO users addressed by the PPDU
      */
     void SetHeMuUserInfos(WifiTxVector& txVector,
                           const RuAllocation& ruAllocation,
@@ -244,65 +244,65 @@
     /**
      * Convert channel width expressed in MHz to bandwidth field encoding in HE-SIG-A.
      *
-     * \param channelWidth the channel width in MHz
-     * \return the value used to encode the bandwidth field in HE-SIG-A
+     * @param channelWidth the channel width in MHz
+     * @return the value used to encode the bandwidth field in HE-SIG-A
      */
     static uint8_t GetChannelWidthEncodingFromMhz(MHz_u channelWidth);
 
     /**
      * Convert number of spatial streams to NSTS field encoding in HE-SIG-A.
      *
-     * \param nss the number of spatial streams
-     * \return the value used to encode the NSTS field in HE-SIG-A
+     * @param nss the number of spatial streams
+     * @return the value used to encode the NSTS field in HE-SIG-A
      */
     static uint8_t GetNstsEncodingFromNss(uint8_t nss);
 
     /**
      * Convert guard interval and NLTF to its encoding in HE-SIG-A.
      *
-     * \param guardInterval the guard interval
-     * \param nltf the the number of long training symbols
-     * \return the value used to encode the NSTS field in HE-SIG-A
+     * @param guardInterval the guard interval
+     * @param nltf the the number of long training symbols
+     * @return the value used to encode the NSTS field in HE-SIG-A
      */
     static uint8_t GetGuardIntervalAndNltfEncoding(Time guardInterval, uint8_t nltf);
 
     /**
      * Convert number of spatial streams from NSTS field encoding in HE-SIG-A.
      *
-     * \param nsts the value of the NSTS field in HE-SIG-A
-     * \return the number of spatial streams
+     * @param nsts the value of the NSTS field in HE-SIG-A
+     * @return the number of spatial streams
      */
     static uint8_t GetNssFromNstsEncoding(uint8_t nsts);
 
     /**
      * Convert channel width expressed in MHz from bandwidth field encoding in HE-SIG-A.
      *
-     * \param bandwidth the value of the bandwidth field in HE-SIG-A
-     * \return the channel width in MHz
+     * @param bandwidth the value of the bandwidth field in HE-SIG-A
+     * @return the channel width in MHz
      */
     static MHz_u GetChannelWidthMhzFromEncoding(uint8_t bandwidth);
 
     /**
      * Convert guard interval from its encoding in HE-SIG-A.
      *
-     * \param giAndNltfSize the value used to encode the guard interval and NLTF field in HE-SIG-A
-     * \return the guard interval
+     * @param giAndNltfSize the value used to encode the guard interval and NLTF field in HE-SIG-A
+     * @return the guard interval
      */
     static Time GetGuardIntervalFromEncoding(uint8_t giAndNltfSize);
 
     /**
      * Convert number of MU-MIMO users to its encoding in HE-SIG-A.
      *
-     * \param nUsers the number of MU-MIMO users
-     * \return the number of MU-MIMO users to its encoding in HE-SIG-A
+     * @param nUsers the number of MU-MIMO users
+     * @return the number of MU-MIMO users to its encoding in HE-SIG-A
      */
     static uint8_t GetMuMimoUsersEncoding(uint8_t nUsers);
 
     /**
      * Convert number of MU-MIMO users from its encoding in HE-SIG-A.
      *
-     * \param encoding the number of MU-MIMO users encoded in HE-SIG-A
-     * \return the number of MU-MIMO users from its encoding in HE-SIG-A
+     * @param encoding the number of MU-MIMO users encoded in HE-SIG-A
+     * @return the number of MU-MIMO users from its encoding in HE-SIG-A
      */
     static uint8_t GetMuMimoUsersFromEncoding(uint8_t encoding);
 
@@ -315,40 +315,40 @@
     /**
      * Fill in the PHY headers.
      *
-     * \param txVector the TXVECTOR that was used for this PPDU
-     * \param ppduDuration the transmission duration of this PPDU
+     * @param txVector the TXVECTOR that was used for this PPDU
+     * @param ppduDuration the transmission duration of this PPDU
      */
     void SetPhyHeaders(const WifiTxVector& txVector, Time ppduDuration);
 
     /**
      * Fill in the L-SIG header.
      *
-     * \param ppduDuration the transmission duration of this PPDU
+     * @param ppduDuration the transmission duration of this PPDU
      */
     void SetLSigHeader(Time ppduDuration);
 
     /**
      * Fill in the HE-SIG header.
      *
-     * \param txVector the TXVECTOR that was used for this PPDU
+     * @param txVector the TXVECTOR that was used for this PPDU
      */
     void SetHeSigHeader(const WifiTxVector& txVector);
 
     /**
      * Return true if the PPDU is a MU PPDU
-     * \return true if the PPDU is a MU PPDU
+     * @return true if the PPDU is a MU PPDU
      */
     virtual bool IsMu() const;
 
     /**
      * Return true if the PPDU is a DL MU PPDU
-     * \return true if the PPDU is a DL MU PPDU
+     * @return true if the PPDU is a DL MU PPDU
      */
     virtual bool IsDlMu() const;
 
     /**
      * Return true if the PPDU is an UL MU PPDU
-     * \return true if the PPDU is an UL MU PPDU
+     * @return true if the PPDU is an UL MU PPDU
      */
     virtual bool IsUlMu() const;
 
@@ -356,11 +356,11 @@
 };                       // class HePpdu
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the stream
- * \param flag the transmit power spectral density flag
- * \returns a reference to the stream
+ * @param os the stream
+ * @param flag the transmit power spectral density flag
+ * @returns a reference to the stream
  */
 std::ostream& operator<<(std::ostream& os, const HePpdu::TxPsdFlag& flag);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/he/he-ru.cc ns-3.44/src/wifi/model/he/he-ru.cc
--- ns-3.43/src/wifi/model/he/he-ru.cc	2024-10-09 16:41:10.120656700 -0700
+++ ns-3.44/src/wifi/model/he/he-ru.cc	2025-03-09 16:55:49.791372500 -0700
@@ -19,7 +19,7 @@
 
 const HeRu::SubcarrierGroups HeRu::m_heRuSubcarrierGroups = {
     // RUs in a 20 MHz HE PPDU (Table 28-6)
-    {{20, HeRu::RU_26_TONE},
+    {{MHz_u{20}, HeRu::RU_26_TONE},
      {/* 1 */ {{-121, -96}},
       /* 2 */ {{-95, -70}},
       /* 3 */ {{-68, -43}},
@@ -29,17 +29,17 @@
       /* 7 */ {{43, 68}},
       /* 8 */ {{70, 95}},
       /* 9 */ {{96, 121}}}},
-    {{20, HeRu::RU_52_TONE},
+    {{MHz_u{20}, HeRu::RU_52_TONE},
      {/* 1 */ {{-121, -70}},
       /* 2 */ {{-68, -17}},
       /* 3 */ {{17, 68}},
       /* 4 */ {{70, 121}}}},
-    {{20, HeRu::RU_106_TONE},
+    {{MHz_u{20}, HeRu::RU_106_TONE},
      {/* 1 */ {{-122, -17}},
       /* 2 */ {{17, 122}}}},
-    {{20, HeRu::RU_242_TONE}, {/* 1 */ {{-122, -2}, {2, 122}}}},
+    {{MHz_u{20}, HeRu::RU_242_TONE}, {/* 1 */ {{-122, -2}, {2, 122}}}},
     // RUs in a 40 MHz HE PPDU (Table 28-7)
-    {{40, HeRu::RU_26_TONE},
+    {{MHz_u{40}, HeRu::RU_26_TONE},
      {/* 1 */ {{-243, -218}},
       /* 2 */ {{-217, -192}},
       /* 3 */ {{-189, -164}},
@@ -58,7 +58,7 @@
       /* 16 */ {{164, 189}},
       /* 17 */ {{192, 217}},
       /* 18 */ {{218, 243}}}},
-    {{40, HeRu::RU_52_TONE},
+    {{MHz_u{40}, HeRu::RU_52_TONE},
      {/* 1 */ {{-243, -192}},
       /* 2 */ {{-189, -138}},
       /* 3 */ {{-109, -58}},
@@ -67,17 +67,17 @@
       /* 6 */ {{58, 109}},
       /* 7 */ {{138, 189}},
       /* 8 */ {{192, 243}}}},
-    {{40, HeRu::RU_106_TONE},
+    {{MHz_u{40}, HeRu::RU_106_TONE},
      {/* 1 */ {{-243, -138}},
       /* 2 */ {{-109, -4}},
       /* 3 */ {{4, 109}},
       /* 4 */ {{138, 243}}}},
-    {{40, HeRu::RU_242_TONE},
+    {{MHz_u{40}, HeRu::RU_242_TONE},
      {/* 1 */ {{-244, -3}},
       /* 2 */ {{3, 244}}}},
-    {{40, HeRu::RU_484_TONE}, {/* 1 */ {{-244, -3}, {3, 244}}}},
+    {{MHz_u{40}, HeRu::RU_484_TONE}, {/* 1 */ {{-244, -3}, {3, 244}}}},
     // RUs in an 80 MHz HE PPDU (Table 28-8)
-    {{80, HeRu::RU_26_TONE},
+    {{MHz_u{80}, HeRu::RU_26_TONE},
      {/* 1 */ {{-499, -474}},
       /* 2 */ {{-473, -448}},
       /* 3 */ {{-445, -420}},
@@ -115,7 +115,7 @@
       /* 35 */ {{420, 445}},
       /* 36 */ {{448, 473}},
       /* 37 */ {{474, 499}}}},
-    {{80, HeRu::RU_52_TONE},
+    {{MHz_u{80}, HeRu::RU_52_TONE},
      {/* 1 */ {{-499, -448}},
       /* 2 */ {{-445, -394}},
       /* 3 */ {{-365, -314}},
@@ -132,7 +132,7 @@
       /* 14 */ {{314, 365}},
       /* 15 */ {{394, 445}},
       /* 16 */ {{448, 499}}}},
-    {{80, HeRu::RU_106_TONE},
+    {{MHz_u{80}, HeRu::RU_106_TONE},
      {/* 1 */ {{-499, -394}},
       /* 2 */ {{-365, -260}},
       /* 3 */ {{-257, -152}},
@@ -141,15 +141,15 @@
       /* 6 */ {{152, 257}},
       /* 7 */ {{260, 365}},
       /* 8 */ {{394, 499}}}},
-    {{80, HeRu::RU_242_TONE},
+    {{MHz_u{80}, HeRu::RU_242_TONE},
      {/* 1 */ {{-500, -259}},
       /* 2 */ {{-258, -17}},
       /* 3 */ {{17, 258}},
       /* 4 */ {{259, 500}}}},
-    {{80, HeRu::RU_484_TONE},
+    {{MHz_u{80}, HeRu::RU_484_TONE},
      {/* 1 */ {{-500, -17}},
       /* 2 */ {{17, 500}}}},
-    {{80, HeRu::RU_996_TONE}, {/* 1 */ {{-500, -3}, {3, 500}}}},
+    {{MHz_u{80}, HeRu::RU_996_TONE}, {/* 1 */ {{-500, -3}, {3, 500}}}},
 };
 
 // Table 27-26 IEEE802.11ax-2021
@@ -467,10 +467,10 @@
 std::size_t
 HeRu::RuSpec::GetPhyIndex(MHz_u bw, uint8_t p20Index) const
 {
-    bool primary80IsLower80 = (p20Index < bw / 40);
+    bool primary80IsLower80 = (p20Index < bw / MHz_u{40});
 
-    if (bw < 160 || m_ruType == HeRu::RU_2x996_TONE || (primary80IsLower80 && m_primary80MHz) ||
-        (!primary80IsLower80 && !m_primary80MHz))
+    if (bw < MHz_u{160} || m_ruType == HeRu::RU_2x996_TONE ||
+        (primary80IsLower80 && m_primary80MHz) || (!primary80IsLower80 && !m_primary80MHz))
     {
         return m_index;
     }
@@ -483,21 +483,21 @@
 std::size_t
 HeRu::GetNRus(MHz_u bw, RuType ruType)
 {
-    if (bw == 160 && ruType == RU_2x996_TONE)
+    if (bw == MHz_u{160} && ruType == RU_2x996_TONE)
     {
         return 1;
     }
 
     // if the bandwidth is 160MHz, search for the number of RUs available
     // in 80MHz and double the result.
-    auto it = m_heRuSubcarrierGroups.find({(bw == 160 ? 80 : bw), ruType});
+    auto it = m_heRuSubcarrierGroups.find({(bw == MHz_u{160} ? MHz_u{80} : bw), ruType});
 
     if (it == m_heRuSubcarrierGroups.end())
     {
         return 0;
     }
 
-    return (bw == 160 ? 2 : 1) * it->second.size();
+    return (bw == MHz_u{160} ? 2 : 1) * it->second.size();
 }
 
 std::vector<HeRu::RuSpec>
@@ -505,17 +505,17 @@
 {
     if (ruType == HeRu::RU_2x996_TONE)
     {
-        NS_ASSERT(bw >= 160);
+        NS_ASSERT(bw >= MHz_u{160});
         return {{ruType, 1, true}};
     }
 
     std::vector<HeRu::RuSpec> ret;
     std::vector<bool> primary80MHzSet{true};
 
-    if (bw == 160)
+    if (bw == MHz_u{160})
     {
         primary80MHzSet.push_back(false);
-        bw = 80;
+        bw = MHz_u{80};
     }
 
     for (auto primary80MHz : primary80MHzSet)
@@ -537,22 +537,22 @@
 
     if (ruType == HeRu::RU_52_TONE || ruType == HeRu::RU_106_TONE)
     {
-        if (bw == 20)
+        if (bw == MHz_u{20})
         {
             indices.push_back(5);
         }
-        else if (bw == 40)
+        else if (bw == MHz_u{40})
         {
             indices.insert(indices.end(), {5, 14});
         }
-        else if (bw >= 80)
+        else if (bw >= MHz_u{80})
         {
             indices.insert(indices.end(), {5, 14, 19, 24, 33});
         }
     }
     else if (ruType == HeRu::RU_242_TONE || ruType == HeRu::RU_484_TONE)
     {
-        if (bw >= 80)
+        if (bw >= MHz_u{80})
         {
             indices.push_back(19);
         }
@@ -561,7 +561,7 @@
     std::vector<HeRu::RuSpec> ret;
     std::vector<bool> primary80MHzSet{true};
 
-    if (bw == 160)
+    if (bw == MHz_u{160})
     {
         primary80MHzSet.push_back(false);
     }
@@ -581,7 +581,7 @@
 {
     if (ruType == HeRu::RU_2x996_TONE) // handle special case of RU covering 160 MHz channel
     {
-        NS_ABORT_MSG_IF(bw != 160, "2x996 tone RU can only be used on 160 MHz band");
+        NS_ABORT_MSG_IF(bw != MHz_u{160}, "2x996 tone RU can only be used on 160 MHz band");
         return {{-1012, -3}, {3, 1012}};
     }
 
@@ -590,21 +590,21 @@
     // The phyIndex is used to that aim.
     std::size_t indexInLower80MHz = phyIndex;
     std::size_t numRus = GetNRus(bw, ruType);
-    int16_t shift = (bw == 160) ? -512 : 0;
-    if (bw == 160 && phyIndex > (numRus / 2))
+    int16_t shift = (bw == MHz_u{160}) ? -512 : 0;
+    if (bw == MHz_u{160} && phyIndex > (numRus / 2))
     {
         // The provided index is that of the upper 80 MHz subchannel
         indexInLower80MHz = phyIndex - (numRus / 2);
         shift = 512;
     }
 
-    auto it = m_heRuSubcarrierGroups.find({(bw == 160 ? 80 : bw), ruType});
+    auto it = m_heRuSubcarrierGroups.find({(bw == MHz_u{160} ? MHz_u{80} : bw), ruType});
 
     NS_ABORT_MSG_IF(it == m_heRuSubcarrierGroups.end(), "RU not found");
     NS_ABORT_MSG_IF(indexInLower80MHz > it->second.size(), "RU index not available");
 
     SubcarrierGroup group = it->second.at(indexInLower80MHz - 1);
-    if (bw == 160)
+    if (bw == MHz_u{160})
     {
         for (auto& range : group)
         {
@@ -619,7 +619,7 @@
 HeRu::DoesOverlap(MHz_u bw, RuSpec ru, const std::vector<RuSpec>& v)
 {
     // A 2x996-tone RU spans 160 MHz, hence it overlaps with any other RU
-    if (bw == 160 && ru.GetRuType() == RU_2x996_TONE && !v.empty())
+    if (bw == MHz_u{160} && ru.GetRuType() == RU_2x996_TONE && !v.empty())
     {
         return true;
     }
@@ -656,7 +656,7 @@
 {
     for (const auto& range : toneRanges)
     {
-        if (bw == 160 && ru.GetRuType() == RU_2x996_TONE)
+        if (bw == MHz_u{160} && ru.GetRuType() == RU_2x996_TONE)
         {
             return true;
         }
@@ -681,7 +681,7 @@
 
     std::size_t numRusPer80Mhz;
     std::vector<bool> primary80MhzFlags;
-    if (bw == 160)
+    if (bw == MHz_u{160})
     {
         primary80MhzFlags.push_back(true);
         primary80MhzFlags.push_back(false);
@@ -758,22 +758,22 @@
     switch (ruType)
     {
     case RU_26_TONE:
-        return 2;
+        return MHz_u{2};
     case RU_52_TONE:
-        return 4;
+        return MHz_u{4};
     case RU_106_TONE:
-        return 8;
+        return MHz_u{8};
     case RU_242_TONE:
-        return 20;
+        return MHz_u{20};
     case RU_484_TONE:
-        return 40;
+        return MHz_u{40};
     case RU_996_TONE:
-        return 80;
+        return MHz_u{80};
     case RU_2x996_TONE:
-        return 160;
+        return MHz_u{160};
     default:
         NS_ABORT_MSG("RU type " << ruType << " not found");
-        return 0;
+        return MHz_u{0};
     }
 }
 
@@ -819,7 +819,8 @@
             nRusAssigned = ru.second.size();
             break;
         }
-        else if (bandwidth == 160 && ru.first.first == 80 && (2 * ru.second.size() <= nStations))
+        else if (bandwidth == MHz_u{160} && ru.first.first == MHz_u{80} &&
+                 (2 * ru.second.size() <= nStations))
         {
             ruType = ru.first.second;
             nRusAssigned = 2 * ru.second.size();
@@ -828,7 +829,7 @@
     }
     if (nRusAssigned == 0)
     {
-        NS_ABORT_IF(bandwidth != 160 || nStations != 1);
+        NS_ABORT_IF(bandwidth != MHz_u{160} || nStations != 1);
         nRusAssigned = 1;
         ruType = RU_2x996_TONE;
     }
@@ -839,11 +840,11 @@
     {
     case RU_52_TONE:
     case RU_106_TONE:
-        if (bandwidth == 20)
+        if (bandwidth == MHz_u{20})
         {
             nCentral26TonesRus = 1;
         }
-        else if (bandwidth == 40)
+        else if (bandwidth == MHz_u{40})
         {
             nCentral26TonesRus = 2;
         }
@@ -854,13 +855,13 @@
         break;
     case RU_242_TONE:
     case RU_484_TONE:
-        nCentral26TonesRus = (bandwidth >= 80 ? 1 : 0);
+        nCentral26TonesRus = (bandwidth >= MHz_u{80} ? 1 : 0);
         break;
     default:
         nCentral26TonesRus = 0;
     }
 
-    if (bandwidth == 160)
+    if (bandwidth == MHz_u{160})
     {
         nCentral26TonesRus *= 2;
     }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/he/he-ru.h ns-3.44/src/wifi/model/he/he-ru.h
--- ns-3.43/src/wifi/model/he/he-ru.h	2024-10-09 16:41:10.120656700 -0700
+++ ns-3.44/src/wifi/model/he/he-ru.h	2025-03-09 16:55:49.791372500 -0700
@@ -63,58 +63,58 @@
         /**
          * Constructor
          *
-         * \param ruType the RU type
-         * \param index the RU index (starting at 1)
-         * \param primary80MHz whether the RU is allocated in the primary 80MHz channel
+         * @param ruType the RU type
+         * @param index the RU index (starting at 1)
+         * @param primary80MHz whether the RU is allocated in the primary 80MHz channel
          */
         RuSpec(RuType ruType, std::size_t index, bool primary80MHz);
 
         /**
          * Get the RU type
          *
-         * \return the RU type
+         * @return the RU type
          */
         RuType GetRuType() const;
         /**
          * Get the RU index
          *
-         * \return the RU index
+         * @return the RU index
          */
         std::size_t GetIndex() const;
         /**
          * Get the primary 80 MHz flag
          *
-         * \return true if the RU is in the primary 80 MHz channel and false otherwise
+         * @return true if the RU is in the primary 80 MHz channel and false otherwise
          */
         bool GetPrimary80MHz() const;
         /**
          * Get the RU PHY index
          *
-         * \param bw the width of the channel of which the RU is part
-         * \param p20Index the index of the primary20 channel
-         * \return the RU PHY index
+         * @param bw the width of the channel of which the RU is part
+         * @param p20Index the index of the primary20 channel
+         * @return the RU PHY index
          */
         std::size_t GetPhyIndex(MHz_u bw, uint8_t p20Index) const;
 
         /**
          * Compare this RU to the given RU.
          *
-         * \param other the given RU
-         * \return true if this RU compares equal to the given RU, false otherwise
+         * @param other the given RU
+         * @return true if this RU compares equal to the given RU, false otherwise
          */
         bool operator==(const RuSpec& other) const;
         /**
          * Compare this RU to the given RU.
          *
-         * \param other the given RU
-         * \return true if this RU differs from the given RU, false otherwise
+         * @param other the given RU
+         * @return true if this RU differs from the given RU, false otherwise
          */
         bool operator!=(const RuSpec& other) const;
         /**
          * Compare this RU to the given RU.
          *
-         * \param other the given RU
-         * \return true if this RU is smaller than the given RU, false otherwise
+         * @param other the given RU
+         * @return true if this RU is smaller than the given RU, false otherwise
          */
         bool operator<(const RuSpec& other) const;
 
@@ -133,16 +133,16 @@
         /**
          * Constructor.
          *
-         * \param channelWidth the channel width
-         * \param p20Index the index of the primary20 channel
+         * @param channelWidth the channel width
+         * @param p20Index the index of the primary20 channel
          */
         RuSpecCompare(MHz_u channelWidth, uint8_t p20Index);
         /**
          * Function call operator.
          *
-         * \param lhs left hand side RU
-         * \param rhs right hand side RU
-         * \return true if the left hand side RU has its leftmost tone at a lower
+         * @param lhs left hand side RU
+         * @param rhs right hand side RU
+         * @return true if the left hand side RU has its leftmost tone at a lower
          *         frequency than the leftmost tone of the right hand side RU,
          *         false otherwise
          */
@@ -157,9 +157,9 @@
      * Get the number of distinct RUs of the given type (number of tones)
      * available in a HE PPDU of the given bandwidth.
      *
-     * \param bw the bandwidth of the HE PPDU (20, 40, 80, 160)
-     * \param ruType the RU type (number of tones)
-     * \return the number of distinct RUs available
+     * @param bw the bandwidth of the HE PPDU (20, 40, 80, 160)
+     * @param ruType the RU type (number of tones)
+     * @return the number of distinct RUs available
      */
     static std::size_t GetNRus(MHz_u bw, RuType ruType);
 
@@ -167,9 +167,9 @@
      * Get the set of distinct RUs of the given type (number of tones)
      * available in a HE PPDU of the given bandwidth.
      *
-     * \param bw the bandwidth of the HE PPDU (20, 40, 80, 160)
-     * \param ruType the RU type (number of tones)
-     * \return the set of distinct RUs available
+     * @param bw the bandwidth of the HE PPDU (20, 40, 80, 160)
+     * @param ruType the RU type (number of tones)
+     * @return the set of distinct RUs available
      */
     static std::vector<HeRu::RuSpec> GetRusOfType(MHz_u bw, HeRu::RuType ruType);
 
@@ -177,9 +177,9 @@
      * Get the set of 26-tone RUs that can be additionally allocated if the given
      * bandwidth is split in RUs of the given type.
      *
-     * \param bw the bandwidth of the HE PPDU (20, 40, 80, 160)
-     * \param ruType the RU type (number of tones)
-     * \return the set of 26-tone RUs that can be additionally allocated
+     * @param bw the bandwidth of the HE PPDU (20, 40, 80, 160)
+     * @param ruType the RU type (number of tones)
+     * @return the set of 26-tone RUs that can be additionally allocated
      */
     static std::vector<HeRu::RuSpec> GetCentral26TonesRus(MHz_u bw, HeRu::RuType ruType);
 
@@ -192,10 +192,10 @@
      * the 160 MHz channel (i.e. -1012 to 1012). The PHY index parameter is used to
      * distinguish between lower and higher 80 MHz subchannels.
      *
-     * \param bw the bandwidth of the HE PPDU (20, 40, 80, 160)
-     * \param ruType the RU type (number of tones)
-     * \param phyIndex the PHY index (starting at 1) of the RU
-     * \return the subcarrier range of the specified RU
+     * @param bw the bandwidth of the HE PPDU (20, 40, 80, 160)
+     * @param ruType the RU type (number of tones)
+     * @param phyIndex the PHY index (starting at 1) of the RU
+     * @return the subcarrier range of the specified RU
      */
     static SubcarrierGroup GetSubcarrierGroup(MHz_u bw, RuType ruType, std::size_t phyIndex);
 
@@ -204,10 +204,10 @@
      * Note that for channel width of 160 MHz the returned range is relative to
      * the 160 MHz channel (i.e. -1012 to 1012).
      *
-     * \param bw the bandwidth of the HE PPDU (20, 40, 80, 160)
-     * \param ru the given RU allocation
-     * \param v the given set of RUs
-     * \return true if the given RU overlaps with the given set of RUs.
+     * @param bw the bandwidth of the HE PPDU (20, 40, 80, 160)
+     * @param ru the given RU allocation
+     * @param v the given set of RUs
+     * @return true if the given RU overlaps with the given set of RUs.
      */
     static bool DoesOverlap(MHz_u bw, RuSpec ru, const std::vector<RuSpec>& v);
 
@@ -216,11 +216,11 @@
      * Note that for channel width of 160 MHz the returned range is relative to
      * the 160 MHz channel (i.e. -1012 to 1012).
      *
-     * \param bw the bandwidth of the HE PPDU (20, 40, 80, 160)
-     * \param ru the given RU allocation
-     * \param toneRanges the given set of tone ranges
-     * \param p20Index the index of the primary20 channel
-     * \return true if the given RU overlaps with the given set of tone ranges.
+     * @param bw the bandwidth of the HE PPDU (20, 40, 80, 160)
+     * @param ru the given RU allocation
+     * @param toneRanges the given set of tone ranges
+     * @param p20Index the index of the primary20 channel
+     * @return true if the given RU overlaps with the given set of tone ranges.
      */
     static bool DoesOverlap(MHz_u bw,
                             RuSpec ru,
@@ -232,26 +232,26 @@
      * reference RU allocation.
      * Note that an assert is generated if the RU allocation is not found.
      *
-     * \param bw the bandwidth of the HE PPDU (20, 40, 80, 160)
-     * \param referenceRu the reference RU allocation
-     * \param searchedRuType the searched RU type
-     * \return the searched RU allocation.
+     * @param bw the bandwidth of the HE PPDU (20, 40, 80, 160)
+     * @param referenceRu the reference RU allocation
+     * @param searchedRuType the searched RU type
+     * @return the searched RU allocation.
      */
     static RuSpec FindOverlappingRu(MHz_u bw, RuSpec referenceRu, RuType searchedRuType);
 
     /**
      * Get the approximate bandwidth occupied by a RU.
      *
-     * \param ruType the RU type
-     * \return the approximate bandwidth occupied by the RU
+     * @param ruType the RU type
+     * @return the approximate bandwidth occupied by the RU
      */
     static MHz_u GetBandwidth(RuType ruType);
 
     /**
      * Get the RU corresponding to the approximate bandwidth.
      *
-     * \param bandwidth the approximate bandwidth occupied by the RU
-     * \return the RU type
+     * @param bandwidth the approximate bandwidth occupied by the RU
+     * @return the RU type
      */
     static RuType GetRuType(MHz_u bandwidth);
 
@@ -261,12 +261,12 @@
      * an RU subject to the constraint that all the stations must be assigned an RU
      * of the same size (in terms of number of tones).
      *
-     * \param bandwidth the channel bandwidth
-     * \param nStations the number of candidate stations. On return, it is set to
+     * @param bandwidth the channel bandwidth
+     * @param nStations the number of candidate stations. On return, it is set to
      *                  the number of stations that are assigned an RU
      * \param[out] nCentral26TonesRus the number of additional 26-tone RUs that can be
      *                                allocated if the returned RU size is greater than 26 tones
-     * \return the RU type
+     * @return the RU type
      */
     static RuType GetEqualSizedRusForStations(MHz_u bandwidth,
                                               std::size_t& nStations,
@@ -288,14 +288,14 @@
     static const RuAllocationMap m_heRuAllocations;
 
     /// Get the RU specs based on RU_ALLOCATION
-    /// \param ruAllocation 8 bit RU_ALLOCATION value
-    /// \return RU spec associated with the RU_ALLOCATION
+    /// @param ruAllocation 8 bit RU_ALLOCATION value
+    /// @return RU spec associated with the RU_ALLOCATION
     static std::vector<RuSpec> GetRuSpecs(uint8_t ruAllocation);
 
     /// Get the RU_ALLOCATION value for equal size RUs
-    /// \param ruType equal size RU type (generated by GetEqualSizedRusForStations)
-    /// \param isOdd if number of stations is an odd number
-    /// \return RU_ALLOCATION value
+    /// @param ruType equal size RU type (generated by GetEqualSizedRusForStations)
+    /// @param isOdd if number of stations is an odd number
+    /// @return RU_ALLOCATION value
     static uint8_t GetEqualizedRuAllocation(RuType ruType, bool isOdd);
 
     /// Empty 242-tone RU identifier
@@ -303,20 +303,20 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the stream
- * \param ruType the RU type
- * \returns a reference to the stream
+ * @param os the stream
+ * @param ruType the RU type
+ * @returns a reference to the stream
  */
 std::ostream& operator<<(std::ostream& os, const HeRu::RuType& ruType);
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the stream
- * \param ru the RU
- * \returns a reference to the stream
+ * @param os the stream
+ * @param ru the RU
+ * @returns a reference to the stream
  */
 std::ostream& operator<<(std::ostream& os, const HeRu::RuSpec& ru);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/he/mu-edca-parameter-set.h ns-3.44/src/wifi/model/he/mu-edca-parameter-set.h
--- ns-3.43/src/wifi/model/he/mu-edca-parameter-set.h	2024-10-09 16:41:10.120656700 -0700
+++ ns-3.44/src/wifi/model/he/mu-edca-parameter-set.h	2025-03-09 16:55:49.791372500 -0700
@@ -18,8 +18,8 @@
 {
 
 /**
- * \brief The MU EDCA Parameter Set
- * \ingroup wifi
+ * @brief The MU EDCA Parameter Set
+ * @ingroup wifi
  *
  * The 802.11ax MU EDCA Parameter Set.
  */
@@ -34,7 +34,7 @@
     /**
      * Set the QoS Info field in the MuEdcaParameterSet information element.
      *
-     * \param qosInfo 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);
     /**
@@ -42,8 +42,8 @@
      * 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
+     * @param aci the AC Index
+     * @param aifsn the value for the AIFSN subfield
      */
     void SetMuAifsn(uint8_t aci, uint8_t aifsn);
     /**
@@ -51,8 +51,8 @@
      * 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
+     * @param aci the AC Index
+     * @param cwMin the CWmin value encoded by the ECWmin field
      */
     void SetMuCwMin(uint8_t aci, uint16_t cwMin);
     /**
@@ -60,8 +60,8 @@
      * 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
+     * @param aci the AC Index
+     * @param cwMax the CWmax value encoded by the ECWmax field
      */
     void SetMuCwMax(uint8_t aci, uint16_t cwMax);
     /**
@@ -72,47 +72,47 @@
      * 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
+     * @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
+     * @return the QoS Info field in the MuEdcaParameterSet information element
      */
     uint8_t GetQosInfo() 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
+     * @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
+     * @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
+     * @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
+     * @param aci the AC Index
+     * @return the MU EDCA Timer value
      */
     Time GetMuEdcaTimer(uint8_t aci) const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/he/multi-user-scheduler.cc ns-3.44/src/wifi/model/he/multi-user-scheduler.cc
--- ns-3.43/src/wifi/model/he/multi-user-scheduler.cc	2024-10-09 16:41:10.120656700 -0700
+++ ns-3.44/src/wifi/model/he/multi-user-scheduler.cc	2025-03-09 16:55:49.791372500 -0700
@@ -64,11 +64,27 @@
                           "channel access.",
                           BooleanValue(true),
                           MakeBooleanAccessor(&MultiUserScheduler::m_restartTimerUponAccess),
-                          MakeBooleanChecker());
+                          MakeBooleanChecker())
+            .AddAttribute("DefaultTbPpduDuration",
+                          "Default duration of TB PPDUs solicited via a Basic Trigger Frame. "
+                          "This value is used to compute the Duration/ID field of BSRP Trigger "
+                          "Frames sent when the TXOP Limit is zero and the FrameExchangeManager "
+                          "continues the TXOP a SIFS after receiving response to the BSRP TF. "
+                          "This value shall also be used by subclasses when they have no other "
+                          "information available to determine the TX duration of solicited PPDUs. "
+                          "The default value roughly corresponds to half the maximum PPDU TX "
+                          "duration.",
+                          TimeValue(MilliSeconds(2)),
+                          MakeTimeAccessor(&MultiUserScheduler::m_defaultTbPpduDuration),
+                          MakeTimeChecker());
     return tid;
 }
 
 MultiUserScheduler::MultiUserScheduler()
+    : m_isUnprotectedEmlsrClient([this](uint8_t linkId, Mac48Address address) {
+          return m_apMac->GetWifiRemoteStationManager(linkId)->GetEmlsrEnabled(address) &&
+                 !m_apMac->GetFrameExchangeManager(linkId)->GetProtectedStas().contains(address);
+      })
 {
 }
 
@@ -186,6 +202,12 @@
     return StaticCast<HeFrameExchangeManager>(m_apMac->GetFrameExchangeManager(linkId));
 }
 
+Time
+MultiUserScheduler::GetExtraTimeForBsrpTfDurationId(uint8_t linkId) const
+{
+    return m_defaultTbPpduDuration;
+}
+
 void
 MultiUserScheduler::AccessReqTimeout(uint8_t linkId)
 {
@@ -259,9 +281,10 @@
 }
 
 MultiUserScheduler::TxFormat
-MultiUserScheduler::GetLastTxFormat(uint8_t linkId)
+MultiUserScheduler::GetLastTxFormat(uint8_t linkId) const
 {
-    return m_lastTxInfo[linkId].lastTxFormat;
+    const auto it = m_lastTxInfo.find(linkId);
+    return it != m_lastTxInfo.cend() ? it->second.lastTxFormat : NO_TX;
 }
 
 MultiUserScheduler::DlMuInfo&
@@ -333,6 +356,141 @@
     GetHeFem(m_linkId)->SetTargetRssi(m_lastTxInfo[m_linkId].ulInfo.trigger);
 }
 
+void
+MultiUserScheduler::RemoveRecipientsFromTf(
+    uint8_t linkId,
+    CtrlTriggerHeader& trigger,
+    WifiTxParameters& txParams,
+    std::function<bool(uint8_t, Mac48Address)> predicate) const
+{
+    NS_LOG_FUNCTION(this << linkId << &txParams);
+
+    const auto& aidAddrMap = m_apMac->GetStaList(linkId);
+
+    for (auto userInfoIt = trigger.begin(); userInfoIt != trigger.end();)
+    {
+        const auto addressIt = aidAddrMap.find(userInfoIt->GetAid12());
+        NS_ASSERT_MSG(addressIt != aidAddrMap.cend(),
+                      "AID " << userInfoIt->GetAid12() << " not found");
+        const auto address = addressIt->second;
+
+        if (predicate(linkId, address))
+        {
+            NS_LOG_INFO("Removing User Info field addressed to " << address);
+
+            userInfoIt = trigger.RemoveUserInfoField(userInfoIt);
+
+            if (txParams.m_acknowledgment->method == WifiAcknowledgment::UL_MU_MULTI_STA_BA)
+            {
+                auto acknowledgment =
+                    static_cast<WifiUlMuMultiStaBa*>(txParams.m_acknowledgment.get());
+                for (auto it = acknowledgment->stationsReceivingMultiStaBa.begin();
+                     it != acknowledgment->stationsReceivingMultiStaBa.end();)
+                {
+                    if (it->first.first == address)
+                    {
+                        it = acknowledgment->stationsReceivingMultiStaBa.erase(it);
+                    }
+                    else
+                    {
+                        ++it;
+                    }
+                }
+            }
+        }
+        else
+        {
+            ++userInfoIt;
+        }
+    }
+}
+
+void
+MultiUserScheduler::RemoveRecipientsFromDlMu(
+    uint8_t linkId,
+    WifiPsduMap& psduMap,
+    WifiTxParameters& txParams,
+    std::function<bool(uint8_t, Mac48Address)> predicate) const
+{
+    NS_LOG_FUNCTION(this << linkId << &txParams);
+
+    const auto& aidAddrMap = m_apMac->GetStaList(linkId);
+
+    for (auto psduMapIt = psduMap.begin(); psduMapIt != psduMap.end();)
+    {
+        const auto addressIt = aidAddrMap.find(psduMapIt->first);
+        NS_ASSERT_MSG(addressIt != aidAddrMap.cend(), "AID " << psduMapIt->first << " not found");
+        const auto address = addressIt->second;
+
+        if (predicate(linkId, address))
+        {
+            NS_LOG_INFO("Removing PSDU addressed to " << address);
+
+            txParams.m_txVector.GetHeMuUserInfoMap().erase(psduMapIt->first);
+            psduMapIt = psduMap.erase(psduMapIt);
+
+            if (txParams.m_acknowledgment->method == WifiAcknowledgment::DL_MU_BAR_BA_SEQUENCE)
+            {
+                auto acknowledgment =
+                    static_cast<WifiDlMuBarBaSequence*>(txParams.m_acknowledgment.get());
+                acknowledgment->stationsReplyingWithNormalAck.erase(address);
+                acknowledgment->stationsReplyingWithBlockAck.erase(address);
+                acknowledgment->stationsSendBlockAckReqTo.erase(address);
+            }
+            else if (txParams.m_acknowledgment->method == WifiAcknowledgment::DL_MU_TF_MU_BAR)
+            {
+                auto acknowledgment =
+                    static_cast<WifiDlMuTfMuBar*>(txParams.m_acknowledgment.get());
+                acknowledgment->stationsReplyingWithBlockAck.erase(address);
+            }
+            else if (txParams.m_acknowledgment->method == WifiAcknowledgment::DL_MU_AGGREGATE_TF)
+            {
+                auto acknowledgment =
+                    static_cast<WifiDlMuAggregateTf*>(txParams.m_acknowledgment.get());
+                acknowledgment->stationsReplyingWithBlockAck.erase(address);
+            }
+        }
+        else
+        {
+            ++psduMapIt;
+        }
+    }
+}
+
+void
+MultiUserScheduler::NotifyProtectionCompleted(uint8_t linkId,
+                                              WifiPsduMap& psduMap,
+                                              WifiTxParameters& txParams)
+{
+    NS_LOG_FUNCTION(this << linkId << &txParams);
+
+    if (txParams.m_txVector.IsDlMu())
+    {
+        NS_ASSERT(GetLastTxFormat(linkId) == DL_MU_TX);
+
+        UpdateDlMuAfterProtection(linkId, psduMap, txParams);
+    }
+    else if (IsTrigger(psduMap))
+    {
+        NS_ASSERT(GetLastTxFormat(linkId) == UL_MU_TX);
+
+        UpdateTriggerFrameAfterProtection(linkId, GetUlMuInfo(linkId).trigger, txParams);
+
+        if (GetUlMuInfo(linkId).trigger.GetNUserInfoFields() == 0)
+        {
+            NS_LOG_INFO("No User Info field left");
+            psduMap.clear();
+        }
+        else
+        {
+            auto mpdu = GetTriggerFrame(GetUlMuInfo(linkId).trigger, linkId);
+            GetUlMuInfo(linkId).macHdr = mpdu->GetHeader();
+            psduMap =
+                WifiPsduMap{{SU_STA_ID, GetHeFem(linkId)->GetWifiPsdu(mpdu, txParams.m_txVector)}};
+        }
+    }
+}
+
 uint32_t
 MultiUserScheduler::GetMaxSizeOfQosNullAmpdu(const CtrlTriggerHeader& trigger) const
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/he/multi-user-scheduler.h ns-3.44/src/wifi/model/he/multi-user-scheduler.h
--- ns-3.43/src/wifi/model/he/multi-user-scheduler.h	2024-10-09 16:41:10.120656700 -0700
+++ ns-3.44/src/wifi/model/he/multi-user-scheduler.h	2025-03-09 16:55:49.791372500 -0700
@@ -17,6 +17,7 @@
 #include "ns3/wifi-remote-station-manager.h"
 #include "ns3/wifi-tx-parameters.h"
 
+#include <functional>
 #include <unordered_map>
 #include <vector>
 
@@ -25,10 +26,8 @@
 
 class HeFrameExchangeManager;
 
-typedef std::unordered_map<uint16_t /* staId */, Ptr<WifiPsdu> /* PSDU */> WifiPsduMap;
-
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * MultiUserScheduler is an abstract base class defining the API that APs
  * supporting at least VHT can use to determine the format of their next transmission.
@@ -42,8 +41,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     MultiUserScheduler();
@@ -77,15 +76,15 @@
      * Notify the Multi-user Scheduler that the given AC of the AP gained channel
      * access. The Multi-user Scheduler determines the format of the next transmission.
      *
-     * \param edca the EDCAF which has been granted the opportunity to transmit
-     * \param availableTime the amount of time allowed for the frame exchange. Pass
+     * @param edca the EDCAF which has been granted the opportunity to transmit
+     * @param availableTime the amount of time allowed for the frame exchange. Pass
      *                      Time::Min() in case the TXOP limit is null
-     * \param initialFrame true if the frame being transmitted is the initial frame
+     * @param initialFrame true if the frame being transmitted is the initial frame
      *                     of the TXOP. This is used to determine whether the TXOP
      *                     limit can be exceeded
-     * \param allowedWidth the allowed width for the next transmission
-     * \param linkId the ID of the link over which channel access was gained
-     * \return the format of the next transmission
+     * @param allowedWidth the allowed width for the next transmission
+     * @param linkId the ID of the link over which channel access was gained
+     * @return the format of the next transmission
      */
     TxFormat NotifyAccessGranted(Ptr<QosTxop> edca,
                                  Time availableTime,
@@ -97,8 +96,8 @@
      * Get the information required to perform a DL MU transmission on the given link. Note
      * that this method can only be called if GetTxFormat returns DL_MU_TX on the given link.
      *
-     * \param linkId the ID of the given link
-     * \return the information required to perform a DL MU transmission
+     * @param linkId the ID of the given link
+     * @return the information required to perform a DL MU transmission
      */
     DlMuInfo& GetDlMuInfo(uint8_t linkId);
 
@@ -106,22 +105,52 @@
      * Get the information required to solicit an UL MU transmission on the given link. Note
      * that this method can only be called if GetTxFormat returns UL_MU_TX on the given link.
      *
-     * \param linkId the ID of the given link
-     * \return the information required to solicit an UL MU transmission
+     * @param linkId the ID of the given link
+     * @return the information required to solicit an UL MU transmission
      */
     UlMuInfo& GetUlMuInfo(uint8_t linkId);
 
     /**
+     * This method is called when a protection mechanism for an MU transmission is completed and
+     * gives the MU scheduler the opportunity to modify the MU PPDU or the TX parameters before
+     * the actual MU transmission.
+     *
+     * @param linkId ID of the link on which protection was completed
+     * @param psduMap the PSDU map to be transmitted
+     * @param txParams the TX parameters for the MU transmission
+     */
+    void NotifyProtectionCompleted(uint8_t linkId,
+                                   WifiPsduMap& psduMap,
+                                   WifiTxParameters& txParams);
+
+    /**
+     * When the TXOP limit is zero and the TXOP continues a SIFS after receiving a response to a
+     * BSRP TF, the Duration/ID field of the BSRP TF should be extended to reserve the medium
+     * for the frame exchange following the BSRP TF. This method is intended to return the estimated
+     * duration of the frame exchange following the BSRP TF (including the SIFS after the responses
+     * to the BSRP TF). Specifically, the base class method simply returns the default duration of
+     * TB PPDUs solicited via a Basic Trigger Frame. Subclasses can override this method to return
+     * a more accurate estimate of the time required by the following frame exchange.
+     *
+     * This method should only be called when the MU scheduler has determined that a BSRP TF has
+     * to be sent on the given link.
+     *
+     * @param linkId the ID of the given link
+     * @return the estimated duration of the frame exchange following the BSRP TF
+     */
+    virtual Time GetExtraTimeForBsrpTfDurationId(uint8_t linkId) const;
+
+    /**
      * Set the duration of the interval between two consecutive requests for channel
      * access made by the MultiUserScheduler.
      *
-     * \param interval the duration of the interval between two consecutive requests
+     * @param interval the duration of the interval between two consecutive requests
      *                 for channel access
      */
     void SetAccessReqInterval(Time interval);
 
     /**
-     * \return the duration of the interval between two consecutive requests for channel access
+     * @return the duration of the interval between two consecutive requests for channel access
      */
     Time GetAccessReqInterval() const;
 
@@ -129,36 +158,86 @@
     /**
      * Get the station manager attached to the AP on the given link.
      *
-     * \param linkId the ID of the given link
-     * \return the station manager attached to the AP on the given link
+     * @param linkId the ID of the given link
+     * @return the station manager attached to the AP on the given link
      */
     Ptr<WifiRemoteStationManager> GetWifiRemoteStationManager(uint8_t linkId) const;
 
     /**
      * Get the HE Frame Exchange Manager attached to the AP on the given link.
      *
-     * \param linkId the ID of the given link
-     * \return the HE Frame Exchange Manager attached to the AP on the given link
+     * @param linkId the ID of the given link
+     * @return the HE Frame Exchange Manager attached to the AP on the given link
      */
     Ptr<HeFrameExchangeManager> GetHeFem(uint8_t linkId) const;
 
     /**
      * Get an MPDU containing the given Trigger Frame.
      *
-     * \param trigger the given Trigger Frame
-     * \param linkId the ID of the link on which the Trigger Frame has to be sent
-     * \return an MPDU containing the given Trigger Frame
+     * @param trigger the given Trigger Frame
+     * @param linkId the ID of the link on which the Trigger Frame has to be sent
+     * @return an MPDU containing the given Trigger Frame
      */
     Ptr<WifiMpdu> GetTriggerFrame(const CtrlTriggerHeader& trigger, uint8_t linkId) const;
 
     /**
+     * Update the given Trigger Frame after protection is completed on the given link.
+     *
+     * @param linkId the ID of the given link
+     * @param trigger the given Trigger Frame
+     * @param txParams the TX parameters for the UL MU transmission
+     */
+    virtual void UpdateTriggerFrameAfterProtection(uint8_t linkId,
+                                                   CtrlTriggerHeader& trigger,
+                                                   WifiTxParameters& txParams) const {};
+
+    /**
+     * Update the given PSDU map after protection is completed on the given link.
+     *
+     * @param linkId the ID of the given link
+     * @param psduMap the given PSDU map
+     * @param txParams the TX parameters for the DL MU transmission
+     */
+    virtual void UpdateDlMuAfterProtection(uint8_t linkId,
+                                           WifiPsduMap& psduMap,
+                                           WifiTxParameters& txParams) const {};
+
+    /**
+     * Remove the User Info fields for which the given predicate is true from the given Trigger
+     * Frame.
+     *
+     * @param linkId the ID of the link on which the Trigger Frame has to be sent
+     * @param trigger the given Trigger Frame
+     * @param txParams the TX parameters for the UL MU transmission
+     * @param predicate the given predicate (input parameters are link ID and device link address)
+     */
+    void RemoveRecipientsFromTf(uint8_t linkId,
+                                CtrlTriggerHeader& trigger,
+                                WifiTxParameters& txParams,
+                                std::function<bool(uint8_t, Mac48Address)> predicate) const;
+
+    /**
+     * Remove PSDUs for which the given predicate is true from the given PSDU map. Entries in the
+     * TXVECTOR corresponding to such PSDUs are also removed.
+     *
+     * @param linkId the ID of the link on which the PSDU map has to be sent
+     * @param psduMap the given PSDU map
+     * @param txParams the TX parameters for the DL MU transmission
+     * @param predicate the given predicate (input parameters are link ID and device link address)
+     */
+    void RemoveRecipientsFromDlMu(uint8_t linkId,
+                                  WifiPsduMap& psduMap,
+                                  WifiTxParameters& txParams,
+                                  std::function<bool(uint8_t, Mac48Address)> predicate) const;
+
+    /**
      * Get the format of the last transmission on the given link, as determined by
      * the last call to NotifyAccessGranted that did not return NO_TX.
      *
-     * \param linkId the ID of the given link
-     * \return the format of the last transmission on the given link
+     * @param linkId the ID of the given link
+     * @return the format of the last transmission on the given link
      */
-    TxFormat GetLastTxFormat(uint8_t linkId);
+    TxFormat GetLastTxFormat(uint8_t linkId) const;
 
     /**
      * Get the maximum size in bytes among the A-MPDUs containing QoS Null frames
@@ -167,8 +246,8 @@
      * QoS Null frames as the number of TIDs for which a BlockAck agreement has
      * been established between the station and the AP.
      *
-     * \param trigger the given Trigger Frame
-     * \return the maximum size in bytes among the A-MPDUs containing QoS Null frames
+     * @param trigger the given Trigger Frame
+     * @return the maximum size in bytes among the A-MPDUs containing QoS Null frames
      *         and solicited by the given Trigger Frame
      */
     uint32_t GetMaxSizeOfQosNullAmpdu(const CtrlTriggerHeader& trigger) const;
@@ -177,18 +256,24 @@
     void NotifyNewAggregate() override;
     void DoInitialize() override;
 
-    Ptr<ApWifiMac> m_apMac; //!< the AP wifi MAC
-    Ptr<QosTxop> m_edca;    //!< the AC that gained channel access
-    Time m_availableTime;   //!< the time available for frame exchange
-    bool m_initialFrame;    //!< true if a TXOP is being started
-    MHz_u m_allowedWidth;   //!< the allowed width for the current transmission
-    uint8_t m_linkId;       //!< the ID of the link over which channel access has been granted
+    Ptr<ApWifiMac> m_apMac;       //!< the AP wifi MAC
+    Ptr<QosTxop> m_edca;          //!< the AC that gained channel access
+    Time m_availableTime;         //!< the time available for frame exchange
+    bool m_initialFrame;          //!< true if a TXOP is being started
+    MHz_u m_allowedWidth;         //!< the allowed width for the current transmission
+    uint8_t m_linkId;             //!< the ID of the link over which channel access has been granted
+    Time m_defaultTbPpduDuration; //!< the default duration of TB PPDUs solicited by Basic TFs
+
+    const std::function<bool(uint8_t, Mac48Address)>
+        m_isUnprotectedEmlsrClient; //!< predicate returning true if the device with the given
+                                    //!< (link) address is an EMLSR client that is not protected on
+                                    //!< the given link
 
   private:
     /**
      * Set the wifi MAC. Note that it must be the MAC of an HE AP.
      *
-     * \param mac the AP wifi MAC
+     * @param mac the AP wifi MAC
      */
     void SetWifiMac(Ptr<ApWifiMac> mac);
 
@@ -197,28 +282,28 @@
      * the given link, such as requesting channel access (if not requested already) and restarting
      * the channel access request timer.
      *
-     * \param linkId the ID of the given link
+     * @param linkId the ID of the given link
      */
     void AccessReqTimeout(uint8_t linkId);
 
     /**
      * Select the format of the next transmission.
      *
-     * \return the format of the next transmission
+     * @return the format of the next transmission
      */
     virtual TxFormat SelectTxFormat() = 0;
 
     /**
      * Compute the information required to perform a DL MU transmission.
      *
-     * \return the information required to perform a DL MU transmission
+     * @return the information required to perform a DL MU transmission
      */
     virtual DlMuInfo ComputeDlMuInfo() = 0;
 
     /**
      * Prepare the information required to solicit an UL MU transmission.
      *
-     * \return the information required to solicit an UL MU transmission
+     * @return the information required to solicit an UL MU transmission
      */
     virtual UlMuInfo ComputeUlMuInfo() = 0;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/he/mu-snr-tag.h ns-3.44/src/wifi/model/he/mu-snr-tag.h
--- ns-3.43/src/wifi/model/he/mu-snr-tag.h	2024-10-09 16:41:10.120656700 -0700
+++ ns-3.44/src/wifi/model/he/mu-snr-tag.h	2025-03-09 16:55:49.791372500 -0700
@@ -17,7 +17,7 @@
 {
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * A tag to be attached to a response to a multi-user UL frame, that carries the SNR
  * values with which the individual frames have been received.
@@ -26,8 +26,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -49,22 +49,22 @@
     /**
      * Set the SNR for the given sender to the given value.
      *
-     * \param staId the STA-ID of the given sender
-     * \param snr the value of the SNR to set in linear scale
+     * @param staId the STA-ID of the given sender
+     * @param snr the value of the SNR to set in linear scale
      */
     void Set(uint16_t staId, double snr);
     /**
      * Return true if the SNR value for the given STA-ID is present
      *
-     * \param staId the STA-ID
-     * \return true if the SNR value for the given STA-ID is present
+     * @param staId the STA-ID
+     * @return true if the SNR value for the given STA-ID is present
      */
     bool IsPresent(uint16_t staId) const;
     /**
      * Return the SNR value for the given sender.
      *
-     * \param staId the STA-ID of the given sender
-     * \return the SNR value in linear scale
+     * @param staId the STA-ID of the given sender
+     * @return the SNR value in linear scale
      */
     double Get(uint16_t staId) const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/he/obss-pd-algorithm.cc ns-3.44/src/wifi/model/he/obss-pd-algorithm.cc
--- ns-3.43/src/wifi/model/he/obss-pd-algorithm.cc	2024-10-09 16:41:10.120656700 -0700
+++ ns-3.44/src/wifi/model/he/obss-pd-algorithm.cc	2025-03-09 16:55:49.791372500 -0700
@@ -88,13 +88,13 @@
 void
 ObssPdAlgorithm::ResetPhy(HeSigAParameters params)
 {
-    dBm_u txPowerMaxSiso = 0;
-    dBm_u txPowerMaxMimo = 0;
+    dBm_u txPowerMaxSiso{0};
+    dBm_u txPowerMaxMimo{0};
     bool powerRestricted = false;
     // Fetch my BSS color
     Ptr<HeConfiguration> heConfiguration = m_device->GetHeConfiguration();
     NS_ASSERT(heConfiguration);
-    uint8_t bssColor = heConfiguration->GetBssColor();
+    uint8_t bssColor = heConfiguration->m_bssColor;
     NS_LOG_DEBUG("My BSS color " << (uint16_t)bssColor << " received frame "
                                  << (uint16_t)params.bssColor);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/he/obss-pd-algorithm.h ns-3.44/src/wifi/model/he/obss-pd-algorithm.h
--- ns-3.43/src/wifi/model/he/obss-pd-algorithm.h	2024-10-09 16:41:10.120656700 -0700
+++ ns-3.44/src/wifi/model/he/obss-pd-algorithm.h	2025-03-09 16:55:49.791372500 -0700
@@ -23,8 +23,8 @@
 class WifiNetDevice;
 
 /**
- * \brief OBSS PD algorithm interface
- * \ingroup wifi
+ * @brief OBSS PD algorithm interface
+ * @ingroup wifi
  *
  * This object provides the interface for all OBSS_PD algorithms
  * and is designed to be subclassed.
@@ -37,26 +37,26 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
      * Connect the WifiNetDevice and setup eventual callbacks.
      *
-     * \param device the WifiNetDevice
+     * @param device the WifiNetDevice
      */
     virtual void ConnectWifiNetDevice(const Ptr<WifiNetDevice> device);
 
     /**
      * Reset PHY to IDLE.
-     * \param params HeSigAParameters causing PHY reset
+     * @param params HeSigAParameters causing PHY reset
      */
     void ResetPhy(HeSigAParameters params);
 
     /**
-     * \param params the HE-SIG-A parameters
+     * @param params the HE-SIG-A parameters
      *
      * Evaluate the receipt of HE-SIG-A.
      */
@@ -65,11 +65,11 @@
     /**
      * TracedCallback signature for OBSS_PD reset events.
      *
-     * \param [in] bssColor The BSS color of frame triggering the reset
-     * \param [in] rssiDbm The RSSI (dBm) of frame triggering the reset
-     * \param [in] powerRestricted Whether a TX power restriction is triggered
-     * \param [in] txPowerMaxDbmSiso The SISO TX power restricted level (dBm)
-     * \param [in] txPowerMaxDbmMimo The MIMO TX power restricted level (dBm)
+     * @param [in] bssColor The BSS color of frame triggering the reset
+     * @param [in] rssiDbm The RSSI (dBm) of frame triggering the reset
+     * @param [in] powerRestricted Whether a TX power restriction is triggered
+     * @param [in] txPowerMaxDbmSiso The SISO TX power restricted level (dBm)
+     * @param [in] txPowerMaxDbmMimo The MIMO TX power restricted level (dBm)
      */
     typedef void (*ResetTracedCallback)(uint8_t bssColor,
                                         double rssiDbm,
@@ -78,11 +78,11 @@
                                         double txPowerMaxDbmMimo);
 
     /**
-     * \param level the current OBSS PD level
+     * @param level the current OBSS PD level
      */
     void SetObssPdLevel(dBm_u level);
     /**
-     * \return the current OBSS PD level
+     * @return the current OBSS PD level
      */
     dBm_u GetObssPdLevel() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/he/rr-multi-user-scheduler.cc ns-3.44/src/wifi/model/he/rr-multi-user-scheduler.cc
--- ns-3.43/src/wifi/model/he/rr-multi-user-scheduler.cc	2024-10-09 16:41:10.120656700 -0700
+++ ns-3.44/src/wifi/model/he/rr-multi-user-scheduler.cc	2025-03-09 16:55:49.791372500 -0700
@@ -9,9 +9,9 @@
 #include "rr-multi-user-scheduler.h"
 
 #include "he-configuration.h"
-#include "he-frame-exchange-manager.h"
 #include "he-phy.h"
 
+#include "ns3/eht-frame-exchange-manager.h"
 #include "ns3/log.h"
 #include "ns3/wifi-acknowledgment.h"
 #include "ns3/wifi-mac-queue.h"
@@ -192,7 +192,7 @@
     txVector.SetPreambleType(WIFI_PREAMBLE_HE_TB);
     txVector.SetChannelWidth(m_allowedWidth);
     txVector.SetGuardInterval(heConfiguration->GetGuardInterval());
-    txVector.SetBssColor(heConfiguration->GetBssColor());
+    txVector.SetBssColor(heConfiguration->m_bssColor);
 
     // iterate over the associated stations until an enough number of stations is identified
     auto staIt = m_staListUl.begin();
@@ -363,6 +363,21 @@
         m_apMac->GetWifiRemoteStationManager(m_linkId)->GetRtsTxVector(m_triggerMacHdr.GetAddr1(),
                                                                        m_allowedWidth);
 
+    // If this BSRP TF is an ICF, we need to add padding and adjust the TXVECTOR
+    if (auto ehtFem =
+            DynamicCast<EhtFrameExchangeManager>(m_apMac->GetFrameExchangeManager(m_linkId)))
+    {
+        auto prevPaddingSize = m_trigger.GetPaddingSize();
+        ehtFem->SetIcfPaddingAndTxVector(m_trigger, m_txParams.m_txVector);
+        // serialize again if padding has been added
+        if (m_trigger.GetPaddingSize() != prevPaddingSize)
+        {
+            auto packet = Create<Packet>();
+            packet->AddHeader(m_trigger);
+            item = Create<WifiMpdu>(packet, item->GetHeader());
+        }
+    }
+
     if (!GetHeFem(m_linkId)->TryAddMpdu(item, m_txParams, m_availableTime))
     {
         // sending the BSRP Trigger Frame is not possible, hence return NO_TX. In
@@ -373,7 +388,7 @@
     }
 
     // Compute the time taken by each station to transmit 8 QoS Null frames
-    Time qosNullTxDuration = Seconds(0);
+    Time qosNullTxDuration;
     for (const auto& userInfo : m_trigger)
     {
         Time duration = WifiPhy::CalculateTxDuration(GetMaxSizeOfQosNullAmpdu(m_trigger),
@@ -383,6 +398,9 @@
         qosNullTxDuration = Max(qosNullTxDuration, duration);
     }
 
+    NS_ASSERT(m_txParams.m_txDuration.has_value());
+    m_triggerTxDuration = m_txParams.m_txDuration.value();
+
     if (m_availableTime != Time::Min())
     {
         // TryAddMpdu only considers the time to transmit the Trigger Frame
@@ -390,7 +408,6 @@
         NS_ASSERT(m_txParams.m_acknowledgment &&
                   m_txParams.m_acknowledgment->acknowledgmentTime.has_value() &&
                   m_txParams.m_acknowledgment->acknowledgmentTime->IsZero());
-        NS_ASSERT(m_txParams.m_txDuration.has_value());
 
         if (*m_txParams.m_protection->protectionTime + *m_txParams.m_txDuration // BSRP TF tx time
                 + m_apMac->GetWifiPhy(m_linkId)->GetSifs() + qosNullTxDuration >
@@ -503,13 +520,15 @@
         return NO_TX;
     }
 
+    NS_ASSERT(m_txParams.m_txDuration.has_value());
+    m_triggerTxDuration = m_txParams.m_txDuration.value();
+
     if (m_availableTime != Time::Min())
     {
         // TryAddMpdu only considers the time to transmit the Trigger Frame
         NS_ASSERT(m_txParams.m_protection && m_txParams.m_protection->protectionTime.has_value());
         NS_ASSERT(m_txParams.m_acknowledgment &&
                   m_txParams.m_acknowledgment->acknowledgmentTime.has_value());
-        NS_ASSERT(m_txParams.m_txDuration.has_value());
 
         maxDuration = Min(maxDuration,
                           m_availableTime - *m_txParams.m_protection->protectionTime -
@@ -523,7 +542,7 @@
     }
 
     // Compute the time taken by each station to transmit a frame of maxBufferSize size
-    Time bufferTxTime = Seconds(0);
+    Time bufferTxTime;
     for (const auto& userInfo : m_trigger)
     {
         Time duration = WifiPhy::CalculateTxDuration(maxBufferSize,
@@ -542,7 +561,7 @@
     {
         // maxDuration may be a too short time. If it does not allow any station to
         // transmit at least m_ulPsduSize bytes, give up the UL MU transmission for now
-        Time minDuration = Seconds(0);
+        Time minDuration;
         for (const auto& userInfo : m_trigger)
         {
             Time duration =
@@ -583,6 +602,78 @@
 }
 
 void
+RrMultiUserScheduler::UpdateTriggerFrameAfterProtection(uint8_t linkId,
+                                                        CtrlTriggerHeader& trigger,
+                                                        WifiTxParameters& txParams) const
+{
+    NS_LOG_FUNCTION(this << linkId << &txParams);
+
+    // remove unprotected EMLSR clients, unless this is a BSRP TF (which acts as ICF)
+    if (trigger.IsBsrp())
+    {
+        NS_LOG_INFO("BSRP TF is an ICF for unprotected EMLSR clients");
+        return;
+    }
+
+    NS_LOG_INFO("Checking unprotected EMLSR clients");
+    RemoveRecipientsFromTf(linkId, trigger, txParams, m_isUnprotectedEmlsrClient);
+}
+
+void
+RrMultiUserScheduler::UpdateDlMuAfterProtection(uint8_t linkId,
+                                                WifiPsduMap& psduMap,
+                                                WifiTxParameters& txParams) const
+{
+    NS_LOG_FUNCTION(this << linkId << &txParams);
+
+    NS_LOG_INFO("Checking unprotected EMLSR clients");
+    RemoveRecipientsFromDlMu(linkId, psduMap, txParams, m_isUnprotectedEmlsrClient);
+}
+
+Time
+RrMultiUserScheduler::GetExtraTimeForBsrpTfDurationId(uint8_t linkId) const
+{
+    auto phy = m_apMac->GetWifiPhy(linkId);
+    BlockAckType baType(BlockAckType::MULTI_STA);
+    uint16_t aid{0};
+    Mac48Address staAddress;
+
+    // we assume that a Basic Trigger Frame is sent after a BSRP Trigger Frame. In order to
+    // compute the TX duration of the Multi-STA BlockAck, we need to find the bitmap length
+    // for each STA solicited by the Trigger Frame
+    for (const auto& userInfo : m_trigger)
+    {
+        aid = userInfo.GetAid12();
+        auto it = m_apMac->GetStaList(linkId).find(aid);
+        NS_ASSERT(it != m_apMac->GetStaList(linkId).cend());
+        staAddress = it->second;
+
+        // find a TID for which a BA agreement exists with the given originator
+        uint8_t tid = 0;
+        while (tid < 8 && !m_apMac->GetBaAgreementEstablishedAsRecipient(staAddress, tid))
+        {
+            ++tid;
+        }
+        NS_ASSERT_MSG(tid < 8, "No Block Ack agreement established with originator " << staAddress);
+
+        baType.m_bitmapLen.push_back(
+            m_apMac->GetBaTypeAsRecipient(staAddress, tid).m_bitmapLen.at(0));
+    }
+
+    NS_ASSERT_MSG(aid != 0, "No User Info field in the Trigger Frame");
+
+    auto multiStaBaTxVector =
+        GetWifiRemoteStationManager(linkId)->GetBlockAckTxVector(staAddress,
+                                                                 m_trigger.GetHeTbTxVector(aid));
+
+    auto multiStaBaDuration = WifiPhy::CalculateTxDuration(GetBlockAckSize(baType),
+                                                           multiStaBaTxVector,
+                                                           phy->GetPhyBand());
+
+    return m_triggerTxDuration + m_defaultTbPpduDuration + multiStaBaDuration + 3 * phy->GetSifs();
+}
+
+void
 RrMultiUserScheduler::NotifyStationAssociated(uint16_t aid, Mac48Address address)
 {
     NS_LOG_FUNCTION(this << aid << address);
@@ -701,7 +792,7 @@
     m_txParams.m_txVector.SetPreambleType(WIFI_PREAMBLE_HE_MU);
     m_txParams.m_txVector.SetChannelWidth(m_allowedWidth);
     m_txParams.m_txVector.SetGuardInterval(heConfiguration->GetGuardInterval());
-    m_txParams.m_txVector.SetBssColor(heConfiguration->GetBssColor());
+    m_txParams.m_txVector.SetBssColor(heConfiguration->m_bssColor);
 
     // The TXOP limit can be exceeded by the TXOP holder if it does not transmit more
     // than one Data or Management frame in the TXOP and the frame is not in an A-MPDU
@@ -714,7 +805,7 @@
     m_candidates.clear();
 
     std::vector<uint8_t> ruAllocations;
-    const std::size_t numRuAllocs = m_txParams.m_txVector.GetChannelWidth() / 20;
+    const auto numRuAllocs = Count20MHzSubchannels(m_txParams.m_txVector.GetChannelWidth());
     ruAllocations.resize(numRuAllocs);
     NS_ASSERT((m_candidates.size() % numRuAllocs) == 0);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/he/rr-multi-user-scheduler.h ns-3.44/src/wifi/model/he/rr-multi-user-scheduler.h
--- ns-3.43/src/wifi/model/he/rr-multi-user-scheduler.h	2024-10-09 16:41:10.120656700 -0700
+++ ns-3.44/src/wifi/model/he/rr-multi-user-scheduler.h	2025-03-09 16:55:49.791372500 -0700
@@ -18,7 +18,7 @@
 {
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * RrMultiUserScheduler is a simple OFDMA scheduler that indicates to perform a DL OFDMA
  * transmission if the AP has frames to transmit to at least one station.
@@ -28,24 +28,33 @@
  * configurable. Associated stations are served based on their priority. The priority is
  * determined by the credits/debits a station gets when it is selected or not for transmission.
  *
- * \todo Take the supported channel width of the stations into account while selecting
+ * @todo Take the supported channel width of the stations into account while selecting
  * stations and assigning RUs to them.
  */
 class RrMultiUserScheduler : public MultiUserScheduler
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     RrMultiUserScheduler();
     ~RrMultiUserScheduler() override;
 
+    Time GetExtraTimeForBsrpTfDurationId(uint8_t linkId) const override;
+
   protected:
     void DoDispose() override;
     void DoInitialize() override;
 
+    void UpdateTriggerFrameAfterProtection(uint8_t linkId,
+                                           CtrlTriggerHeader& trigger,
+                                           WifiTxParameters& txParams) const override;
+    void UpdateDlMuAfterProtection(uint8_t linkId,
+                                   WifiPsduMap& psduMap,
+                                   WifiTxParameters& txParams) const override;
+
     /**
      * Information used to sort stations
      */
@@ -59,16 +68,16 @@
     /**
      * Determine whether the given STA can be solicited via a Basic Trigger Frame.
      *
-     * \param info the information about the given STA
-     * \return whether the given STA can be solicited via a Basic Trigger Frame
+     * @param info the information about the given STA
+     * @return whether the given STA can be solicited via a Basic Trigger Frame
      */
     virtual bool CanSolicitStaInBasicTf(const MasterInfo& info) const;
 
     /**
      * Determine whether the given STA can be solicited via a BSRP Trigger Frame.
      *
-     * \param info the information about the given STA
-     * \return whether the given STA can be solicited via a BSRP Trigger Frame
+     * @param info the information about the given STA
+     * @return whether the given STA can be solicited via a BSRP Trigger Frame
      */
     virtual bool CanSolicitStaInBsrpTf(const MasterInfo& info) const;
 
@@ -81,7 +90,7 @@
      * Check if it is possible to send a BSRP Trigger Frame given the current
      * time limits.
      *
-     * \return UL_MU_TX if it is possible to send a BSRP TF, NO_TX otherwise
+     * @return UL_MU_TX if it is possible to send a BSRP TF, NO_TX otherwise
      */
     virtual TxFormat TrySendingBsrpTf();
 
@@ -89,7 +98,7 @@
      * Check if it is possible to send a Basic Trigger Frame given the current
      * time limits.
      *
-     * \return UL_MU_TX if it is possible to send a Basic TF, DL_MU_TX if we can try
+     * @return UL_MU_TX if it is possible to send a Basic TF, DL_MU_TX if we can try
      *         to send a DL MU PPDU and NO_TX if the remaining time is too short
      */
     virtual TxFormat TrySendingBasicTf();
@@ -98,7 +107,7 @@
      * Check if it is possible to send a DL MU PPDU given the current
      * time limits.
      *
-     * \return DL_MU_TX if it is possible to send a DL MU PPDU, SU_TX if a SU PPDU
+     * @return DL_MU_TX if it is possible to send a DL MU PPDU, SU_TX if a SU PPDU
      *         can be transmitted (e.g., there are no HE stations associated or sending
      *         a DL MU PPDU is not possible and m_forceDlOfdma is false) or NO_TX otherwise
      */
@@ -109,8 +118,8 @@
      * transmissions from suitable stations, i.e., stations that have established a
      * BlockAck agreement with the AP and for which the given predicate returns true.
      *
-     * \param canBeSolicited a predicate returning false for stations that shall not be solicited
-     * \return a TXVECTOR that can be used to construct a Trigger Frame to solicit
+     * @param canBeSolicited a predicate returning false for stations that shall not be solicited
+     * @return a TXVECTOR that can be used to construct a Trigger Frame to solicit
      *         transmissions from suitable stations
      */
     virtual WifiTxVector GetTxVectorForUlMu(std::function<bool(const MasterInfo&)> canBeSolicited);
@@ -118,15 +127,15 @@
     /**
      * Notify the scheduler that a station associated with the AP
      *
-     * \param aid the AID of the station
-     * \param address the MAC address of the station
+     * @param aid the AID of the station
+     * @param address the MAC address of the station
      */
     void NotifyStationAssociated(uint16_t aid, Mac48Address address);
     /**
      * Notify the scheduler that a station deassociated with the AP
      *
-     * \param aid the AID of the station
-     * \param address the MAC address of the station
+     * @param aid the AID of the station
+     * @param address the MAC address of the station
      */
     void NotifyStationDeassociated(uint16_t aid, Mac48Address address);
 
@@ -139,16 +148,16 @@
      * TXVECTOR contains a subset of such HeMuUserInfo entries. The set of candidate
      * stations is also updated by removing stations that are not allocated an RU.
      *
-     * \param txVector the given TXVECTOR
+     * @param txVector the given TXVECTOR
      */
     void FinalizeTxVector(WifiTxVector& txVector);
     /**
      * Update credits of the stations in the given list considering that a PPDU having
      * the given duration is being transmitted or solicited by using the given TXVECTOR.
      *
-     * \param staList the list of stations
-     * \param txDuration the TX duration of the PPDU being transmitted or solicited
-     * \param txVector the TXVECTOR for the PPDU being transmitted or solicited
+     * @param staList the list of stations
+     * @param txDuration the TX duration of the PPDU being transmitted or solicited
+     * @param txVector the TXVECTOR for the PPDU being transmitted or solicited
      */
     void UpdateCredits(std::list<MasterInfo>& staList,
                        Time txDuration,
@@ -173,6 +182,7 @@
     Time m_maxCredits;                     //!< Max amount of credits a station can have
     CtrlTriggerHeader m_trigger;           //!< Trigger Frame to send
     WifiMacHeader m_triggerMacHdr;         //!< MAC header for Trigger Frame
+    Time m_triggerTxDuration{0};           //!< Trigger Frame TX duration
     WifiTxParameters m_txParams;           //!< TX parameters
 };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/ht/ht-capabilities.h ns-3.44/src/wifi/model/ht/ht-capabilities.h
--- ns-3.43/src/wifi/model/ht/ht-capabilities.h	2024-10-09 16:41:10.120656700 -0700
+++ ns-3.44/src/wifi/model/ht/ht-capabilities.h	2025-03-09 16:55:49.791372500 -0700
@@ -22,8 +22,8 @@
 {
 
 /**
- * \brief The HT Capabilities Information Element
- * \ingroup wifi
+ * @brief The HT Capabilities Information Element
+ * @ingroup wifi
  *
  * This class knows how to serialise and deserialise the HT Capabilities Information Element
  */
@@ -38,35 +38,35 @@
     /**
      * Set the HT Capabilities Info field in the HT Capabilities information element.
      *
-     * \param ctrl the HT Capabilities Info field in the HT Capabilities information element
+     * @param ctrl the HT Capabilities Info field in the HT Capabilities information element
      */
     void SetHtCapabilitiesInfo(uint16_t ctrl);
     /**
      * Set the A-MPDU Parameters field in the HT Capabilities information element.
      *
-     * \param ctrl the A-MPDU Parameters field in the HT Capabilities information element
+     * @param ctrl the A-MPDU Parameters field in the HT Capabilities information element
      */
     void SetAmpduParameters(uint8_t ctrl);
     /**
      * Set the Supported MCS Set field in the HT Capabilities information element.
      *
-     * \param ctrl1 the first 64 bytes of the Supported MCS Set field in the HT Capabilities
+     * @param ctrl1 the first 64 bytes of the Supported MCS Set field in the HT Capabilities
      * information element
-     * \param ctrl2 the last 64 bytes of the Supported MCS Set field in the HT Capabilities
+     * @param ctrl2 the last 64 bytes of the Supported MCS Set field in the HT Capabilities
      * information element
      */
     void SetSupportedMcsSet(uint64_t ctrl1, uint64_t ctrl2);
     /**
      * Set the Extended HT Capabilities field in the HT Capabilities information element.
      *
-     * \param ctrl the Extended HT Capabilities field in the HT Capabilities information element
+     * @param ctrl the Extended HT Capabilities field in the HT Capabilities information element
      */
     void SetExtendedHtCapabilities(uint16_t ctrl);
     /**
      * Set the Transmit Beamforming (TxBF) Capabilities field in the HT Capabilities information
      * element.
      *
-     * \param ctrl the Transmit Beamforming (TxBF) Capabilities field in the HT Capabilities
+     * @param ctrl the Transmit Beamforming (TxBF) Capabilities field in the HT Capabilities
      * information element
      */
     void SetTxBfCapabilities(uint32_t ctrl);
@@ -74,7 +74,7 @@
      * Set the the Antenna Selection (ASEL) Capabilities field in the HT Capabilities information
      * element.
      *
-     * \param ctrl the Antenna Selection (ASEL) Capabilities field in the HT Capabilities
+     * @param ctrl the Antenna Selection (ASEL) Capabilities field in the HT Capabilities
      * information element
      */
     void SetAntennaSelectionCapabilities(uint8_t ctrl);
@@ -82,101 +82,101 @@
     /**
      * Set the LDPC field.
      *
-     * \param ldpc the LDPC field
+     * @param ldpc the LDPC field
      */
     void SetLdpc(uint8_t ldpc);
     /**
      * Set the supported channel width field.
      *
-     * \param supportedChannelWidth the supported channel width field
+     * @param supportedChannelWidth the supported channel width field
      */
     void SetSupportedChannelWidth(uint8_t supportedChannelWidth);
     /**
      * Set the short guard interval 20 field.
      *
-     * \param shortGuardInterval the short guard interval
+     * @param shortGuardInterval the short guard interval
      */
     void SetShortGuardInterval20(uint8_t shortGuardInterval);
     /**
      * Set the short guard interval 40 field.
      *
-     * \param shortGuardInterval the short guard interval
+     * @param shortGuardInterval the short guard interval
      */
     void SetShortGuardInterval40(uint8_t shortGuardInterval);
     /**
      * Set the maximum AMSDU length.
      *
-     * \param maxAmsduLength Either 3839 or 7935
+     * @param maxAmsduLength Either 3839 or 7935
      */
     void SetMaxAmsduLength(uint16_t maxAmsduLength);
     /**
      * Set the LSIG protection support.
      *
-     * \param lSigProtection the LSIG protection support field
+     * @param lSigProtection the LSIG protection support field
      */
     void SetLSigProtectionSupport(uint8_t lSigProtection);
 
     /**
      * Set the maximum AMPDU length.
      *
-     * \param maxAmpduLength 2^(13 + x) - 1, x in the range 0 to 3
+     * @param maxAmpduLength 2^(13 + x) - 1, x in the range 0 to 3
      */
     void SetMaxAmpduLength(uint32_t maxAmpduLength);
 
     /**
      * Set the receive MCS bitmask.
      *
-     * \param index the index of the receive MCS
+     * @param index the index of the receive MCS
      */
     void SetRxMcsBitmask(uint8_t index);
     /**
      * Set the receive highest supported data rate.
      *
-     * \param maxSupportedRate the maximum supported data rate
+     * @param maxSupportedRate the maximum supported data rate
      */
     void SetRxHighestSupportedDataRate(uint16_t maxSupportedRate);
     /**
      * Set the transmit MCS set defined.
      *
-     * \param txMcsSetDefined the TX MCS set defined
+     * @param txMcsSetDefined the TX MCS set defined
      */
     void SetTxMcsSetDefined(uint8_t txMcsSetDefined);
     /**
      * Set the transmit / receive MCS set unequal.
      *
-     * \param txRxMcsSetUnequal the TX/RX MCS set unequal field
+     * @param txRxMcsSetUnequal the TX/RX MCS set unequal field
      */
     void SetTxRxMcsSetUnequal(uint8_t txRxMcsSetUnequal);
     /**
      * Set the transmit maximum N spatial streams.
      *
-     * \param maxTxSpatialStreams the maximum number of TX SSs
+     * @param maxTxSpatialStreams the maximum number of TX SSs
      */
     void SetTxMaxNSpatialStreams(uint8_t maxTxSpatialStreams);
     /**
      * Set the transmit unequal modulation.
      *
-     * \param txUnequalModulation the TX unequal modulation field
+     * @param txUnequalModulation the TX unequal modulation field
      */
     void SetTxUnequalModulation(uint8_t txUnequalModulation);
 
     /**
      * Return the HT Capabilities Info field in the HT Capabilities information element.
      *
-     * \return the HT Capabilities Info field in the HT Capabilities information element
+     * @return the HT Capabilities Info field in the HT Capabilities information element
      */
     uint16_t GetHtCapabilitiesInfo() const;
     /**
      * Return the A-MPDU Parameters field in the HT Capabilities information element.
      *
-     * \return the A-MPDU Parameters field in the HT Capabilities information element
+     * @return the A-MPDU Parameters field in the HT Capabilities information element
      */
     uint8_t GetAmpduParameters() const;
     /**
      * Return the first 64 bytes of the Supported MCS Set field in the HT Capabilities information
      * element.
      *
-     * \return the first 64 bytes of the Supported MCS Set field in the HT Capabilities information
+     * @return the first 64 bytes of the Supported MCS Set field in the HT Capabilities information
      * element
      */
     uint64_t GetSupportedMcsSet1() const;
@@ -184,21 +184,21 @@
      * Return the last 64 bytes of the Supported MCS Set field in the HT Capabilities information
      * element.
      *
-     * \return the last 64 bytes of the Supported MCS Set field in the HT Capabilities information
+     * @return the last 64 bytes of the Supported MCS Set field in the HT Capabilities information
      * element
      */
     uint64_t GetSupportedMcsSet2() const;
     /**
      * Return the Extended HT Capabilities field in the HT Capabilities information element.
      *
-     * \return the Extended HT Capabilities field in the HT Capabilities information element
+     * @return the Extended HT Capabilities field in the HT Capabilities information element
      */
     uint16_t GetExtendedHtCapabilities() const;
     /**
      * Return the Transmit Beamforming (TxBF) Capabilities field in the HT Capabilities information
      * element.
      *
-     * \return the Transmit Beamforming (TxBF) Capabilities field in the HT Capabilities information
+     * @return the Transmit Beamforming (TxBF) Capabilities field in the HT Capabilities information
      * element
      */
     uint32_t GetTxBfCapabilities() const;
@@ -206,7 +206,7 @@
      * Return the Antenna Selection (ASEL) Capabilities field in the HT Capabilities information
      * element.
      *
-     * \return the Antenna Selection (ASEL) Capabilities field in the HT Capabilities information
+     * @return the Antenna Selection (ASEL) Capabilities field in the HT Capabilities information
      * element
      */
     uint8_t GetAntennaSelectionCapabilities() const;
@@ -214,45 +214,45 @@
     /**
      * Return LDPC.
      *
-     * \return the LDPC value
+     * @return the LDPC value
      */
     uint8_t GetLdpc() const;
     /**
      * Return the supported channel width.
      *
-     * \return the supported channel width
+     * @return the supported channel width
      */
     uint8_t GetSupportedChannelWidth() const;
     /**
      * Return the short guard interval 20 value.
      *
-     * \return the short guard interval 20 value
+     * @return the short guard interval 20 value
      */
     uint8_t GetShortGuardInterval20() const;
     /**
      * Return the maximum A-MSDU length.
      *
-     * \return the maximum A-MSDU length
+     * @return the maximum A-MSDU length
      */
     uint16_t GetMaxAmsduLength() const;
     /**
      * Return the maximum A-MPDU length.
      *
-     * \return the maximum A-MPDU length
+     * @return the maximum A-MPDU length
      */
     uint32_t GetMaxAmpduLength() const;
     /**
      * Return the is MCS supported flag.
      *
-     * \param mcs is MCS supported flag
+     * @param mcs is MCS supported flag
      *
-     * \return true if successful
+     * @return true if successful
      */
     bool IsSupportedMcs(uint8_t mcs) const;
     /**
      * Return the receive highest supported antennas.
      *
-     * \return the receive highest supported antennas
+     * @return the receive highest supported antennas
      */
     uint8_t GetRxHighestSupportedAntennas() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/ht/ht-configuration.cc ns-3.44/src/wifi/model/ht/ht-configuration.cc
--- ns-3.43/src/wifi/model/ht/ht-configuration.cc	2024-10-09 16:41:10.120656700 -0700
+++ ns-3.44/src/wifi/model/ht/ht-configuration.cc	2025-03-09 16:55:49.791372500 -0700
@@ -40,20 +40,17 @@
             .AddAttribute("ShortGuardIntervalSupported",
                           "Whether or not short guard interval is supported.",
                           BooleanValue(false),
-                          MakeBooleanAccessor(&HtConfiguration::GetShortGuardIntervalSupported,
-                                              &HtConfiguration::SetShortGuardIntervalSupported),
+                          MakeBooleanAccessor(&HtConfiguration::m_sgiSupported),
                           MakeBooleanChecker())
             .AddAttribute("LdpcSupported",
                           "Whether or not LDPC coding is supported.",
                           BooleanValue(false),
-                          MakeBooleanAccessor(&HtConfiguration::GetLdpcSupported,
-                                              &HtConfiguration::SetLdpcSupported),
+                          MakeBooleanAccessor(&HtConfiguration::m_ldpcSupported),
                           MakeBooleanChecker())
             .AddAttribute("Support40MHzOperation",
                           "Whether or not 40 MHz operation is to be supported.",
                           BooleanValue(true),
-                          MakeBooleanAccessor(&HtConfiguration::Get40MHzOperationSupported,
-                                              &HtConfiguration::Set40MHzOperationSupported),
+                          MakeBooleanAccessor(&HtConfiguration::m_40MHzSupported),
                           MakeBooleanChecker());
     return tid;
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/ht/ht-configuration.h ns-3.44/src/wifi/model/ht/ht-configuration.h
--- ns-3.43/src/wifi/model/ht/ht-configuration.h	2024-10-09 16:41:10.120656700 -0700
+++ ns-3.44/src/wifi/model/ht/ht-configuration.h	2025-03-09 16:55:49.791372500 -0700
@@ -9,14 +9,15 @@
 #ifndef HT_CONFIGURATION_H
 #define HT_CONFIGURATION_H
 
+#include "ns3/deprecated.h"
 #include "ns3/object.h"
 
 namespace ns3
 {
 
 /**
- * \brief HT configuration
- * \ingroup wifi
+ * @brief HT configuration
+ * @ingroup wifi
  *
  * This object stores HT configuration information, for use in modifying
  * AP or STA behavior and for constructing HT-related information elements.
@@ -29,53 +30,63 @@
     ~HtConfiguration() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
      * Enable or disable SGI support.
      *
-     * \param enable true if SGI is to be supported,
+     * @param enable true if SGI is to be supported,
      *               false otherwise
      */
+    NS_DEPRECATED_3_44("Set the m_sgiSupported member variable instead")
     void SetShortGuardIntervalSupported(bool enable);
+
     /**
-     * \return whether the device supports SGI.
+     * @return whether the device supports SGI.
      *
-     * \return true if SGI is supported,
+     * @return true if SGI is supported,
      *         false otherwise.
      */
+    NS_DEPRECATED_3_44("Get the m_sgiSupported member variable instead")
     bool GetShortGuardIntervalSupported() const;
+
     /**
      * Enable or disable LDPC support.
      *
-     * \param enable true if LDPC is to be supported,
+     * @param enable true if LDPC is to be supported,
      *               false otherwise
      */
+    NS_DEPRECATED_3_44("Set the m_ldpcSupported member variable instead")
     void SetLdpcSupported(bool enable);
+
     /**
-     * \return whether the device supports LDPC.
+     * @return whether the device supports LDPC.
      *
-     * \return true if LDPC is supported,
+     * @return true if LDPC is supported,
      *         false otherwise.
      */
+    NS_DEPRECATED_3_44("Get the m_ldpcSupported member variable instead")
     bool GetLdpcSupported() const;
+
     /**
      * Enable or disable 40 MHz operation support.
      *
-     * \param enable true if both 20 MHz and 40 MHz operation is to be supported,
+     * @param enable true if both 20 MHz and 40 MHz operation is to be supported,
      *               false if only 20 MHz operation is to be supported
      */
+    NS_DEPRECATED_3_44("Set the m_40MHzSupported member variable instead")
     void Set40MHzOperationSupported(bool enable);
+
     /**
-     * \return true if both 20 MHz and 40 MHz operation is supported, false if
+     * @return true if both 20 MHz and 40 MHz operation is supported, false if
      *         only 20 MHz operation is supported
      */
+    NS_DEPRECATED_3_44("Get the m_40MHzSupported member variable instead")
     bool Get40MHzOperationSupported() const;
 
-  private:
     bool m_sgiSupported;   ///< flag whether short guard interval is supported
     bool m_ldpcSupported;  ///< flag whether LDPC coding is supported
     bool m_40MHzSupported; ///< whether 40 MHz operation is supported
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/ht/ht-frame-exchange-manager.cc ns-3.44/src/wifi/model/ht/ht-frame-exchange-manager.cc
--- ns-3.43/src/wifi/model/ht/ht-frame-exchange-manager.cc	2024-10-09 16:41:10.120656700 -0700
+++ ns-3.44/src/wifi/model/ht/ht-frame-exchange-manager.cc	2025-03-09 16:55:49.791372500 -0700
@@ -11,8 +11,10 @@
 #include "ht-configuration.h"
 
 #include "ns3/abort.h"
+#include "ns3/ap-wifi-mac.h"
 #include "ns3/assert.h"
 #include "ns3/ctrl-headers.h"
+#include "ns3/gcr-manager.h"
 #include "ns3/log.h"
 #include "ns3/mgt-action-headers.h"
 #include "ns3/recipient-block-ack-agreement.h"
@@ -62,6 +64,10 @@
 HtFrameExchangeManager::DoDispose()
 {
     NS_LOG_FUNCTION(this);
+    if (m_flushGroupcastMpdusEvent.IsPending())
+    {
+        m_flushGroupcastMpdusEvent.Cancel();
+    }
     m_pendingAddBaResp.clear();
     m_msduAggregator = nullptr;
     m_mpduAggregator = nullptr;
@@ -134,16 +140,57 @@
     return establish;
 }
 
+std::optional<Mac48Address>
+HtFrameExchangeManager::NeedSetupGcrBlockAck(const WifiMacHeader& header)
+{
+    NS_ASSERT(m_mac->GetTypeOfStation() == AP && m_apMac->UseGcr(header));
+    const auto& groupAddress = header.GetAddr1();
+
+    const auto tid = header.GetQosTid();
+    auto qosTxop = m_mac->GetQosTxop(tid);
+    const auto maxMpduSize =
+        m_mpduAggregator->GetMaxAmpduSize(groupAddress, tid, WIFI_MOD_CLASS_HT);
+    const auto isGcrBa = (m_apMac->GetGcrManager()->GetRetransmissionPolicy() ==
+                          GroupAddressRetransmissionPolicy::GCR_BLOCK_ACK);
+    WifiContainerQueueId queueId{WIFI_QOSDATA_QUEUE, WIFI_GROUPCAST, groupAddress, tid};
+
+    for (const auto& recipients =
+             m_apMac->GetGcrManager()->GetMemberStasForGroupAddress(groupAddress);
+         const auto& nextRecipient : recipients)
+    {
+        if (auto agreement =
+                qosTxop->GetBaManager()->GetAgreementAsOriginator(nextRecipient, tid, groupAddress);
+            agreement && !agreement->get().IsReset())
+        {
+            continue;
+        }
+
+        const auto packets = qosTxop->GetWifiMacQueue()->GetNPackets(queueId);
+        const auto establish =
+            (isGcrBa ||
+             (qosTxop->GetBlockAckThreshold() > 0 && packets >= qosTxop->GetBlockAckThreshold()) ||
+             (maxMpduSize > 0 && packets > 1));
+        NS_LOG_FUNCTION(this << groupAddress << +tid << establish);
+        if (establish)
+        {
+            return nextRecipient;
+        }
+    }
+
+    return std::nullopt;
+}
+
 bool
 HtFrameExchangeManager::SendAddBaRequest(Mac48Address dest,
                                          uint8_t tid,
                                          uint16_t startingSeq,
                                          uint16_t timeout,
                                          bool immediateBAck,
-                                         Time availableTime)
+                                         Time availableTime,
+                                         std::optional<Mac48Address> gcrGroupAddr)
 {
-    NS_LOG_FUNCTION(this << dest << +tid << startingSeq << timeout << immediateBAck
-                         << availableTime);
+    NS_LOG_FUNCTION(this << dest << +tid << startingSeq << timeout << immediateBAck << availableTime
+                         << gcrGroupAddr.has_value());
     NS_LOG_DEBUG("Send ADDBA request to " << dest);
 
     WifiMacHeader hdr;
@@ -182,6 +229,11 @@
     // set the starting sequence number for the BA agreement
     reqHdr.SetStartingSequence(startingSeq);
 
+    if (gcrGroupAddr)
+    {
+        reqHdr.SetGcrGroupAddress(*gcrGroupAddr);
+    }
+
     GetBaManager(tid)->CreateOriginatorAgreement(reqHdr, dest);
 
     packet->AddHeader(reqHdr);
@@ -243,6 +295,11 @@
     respHdr.SetBufferSize(bufferSize);
     respHdr.SetTimeout(reqHdr.GetTimeout());
 
+    if (auto gcrGroupAddr = reqHdr.GetGcrGroupAddress())
+    {
+        respHdr.SetGcrGroupAddress(*gcrGroupAddr);
+    }
+
     WifiActionHeader actionHdr;
     WifiActionHeader::ActionValue action;
     action.blockAck = WifiActionHeader::BLOCK_ACK_ADDBA_RESPONSE;
@@ -262,7 +319,8 @@
                                                 reqHdr.GetStartingSequence(),
                                                 m_rxMiddle);
 
-    auto agreement = GetBaManager(tid)->GetAgreementAsRecipient(originator, tid);
+    auto agreement =
+        GetBaManager(tid)->GetAgreementAsRecipient(originator, tid, reqHdr.GetGcrGroupAddress());
     NS_ASSERT(agreement);
     if (respHdr.GetTimeout() != 0)
     {
@@ -274,7 +332,8 @@
                                 this,
                                 originator,
                                 tid,
-                                false);
+                                false,
+                                reqHdr.GetGcrGroupAddress());
     }
 
     auto mpdu = Create<WifiMpdu>(packet, hdr);
@@ -308,9 +367,12 @@
 }
 
 void
-HtFrameExchangeManager::SendDelbaFrame(Mac48Address addr, uint8_t tid, bool byOriginator)
+HtFrameExchangeManager::SendDelbaFrame(Mac48Address addr,
+                                       uint8_t tid,
+                                       bool byOriginator,
+                                       std::optional<Mac48Address> gcrGroupAddr)
 {
-    NS_LOG_FUNCTION(this << addr << +tid << byOriginator);
+    NS_LOG_FUNCTION(this << addr << +tid << byOriginator << gcrGroupAddr.has_value());
     WifiMacHeader hdr;
     hdr.SetType(WIFI_MAC_MGT_ACTION);
     // use the remote link address if addr is an MLD address
@@ -323,6 +385,10 @@
     MgtDelBaHeader delbaHdr;
     delbaHdr.SetTid(tid);
     byOriginator ? delbaHdr.SetByOriginator() : delbaHdr.SetByRecipient();
+    if (gcrGroupAddr.has_value())
+    {
+        delbaHdr.SetGcrGroupAddress(gcrGroupAddr.value());
+    }
 
     WifiActionHeader actionHdr;
     WifiActionHeader::ActionValue action;
@@ -336,6 +402,17 @@
     m_mac->GetQosTxop(tid)->Queue(Create<WifiMpdu>(packet, hdr));
 }
 
+uint16_t
+HtFrameExchangeManager::GetBaAgreementStartingSequenceNumber(const WifiMacHeader& header)
+{
+    // if the peeked MPDU has been already transmitted, use its sequence number
+    // as the starting sequence number for the BA agreement, otherwise use the
+    // next available sequence number
+    return header.IsRetry()
+               ? header.GetSequenceNumber()
+               : m_txMiddle->GetNextSeqNumberByTidAndAddress(header.GetQosTid(), header.GetAddr1());
+}
+
 bool
 HtFrameExchangeManager::StartFrameExchange(Ptr<QosTxop> edca, Time availableTime, bool initialFrame)
 {
@@ -364,23 +441,29 @@
     if (hdr.IsQosData() && !hdr.GetAddr1().IsGroup() &&
         NeedSetupBlockAck(hdr.GetAddr1(), hdr.GetQosTid()))
     {
-        // if the peeked MPDU has been already transmitted, use its sequence number
-        // as the starting sequence number for the BA agreement, otherwise use the
-        // next available sequence number
-        uint16_t startingSeq =
-            (hdr.IsRetry()
-                 ? hdr.GetSequenceNumber()
-                 : m_txMiddle->GetNextSeqNumberByTidAndAddress(hdr.GetQosTid(), hdr.GetAddr1()));
         return SendAddBaRequest(hdr.GetAddr1(),
                                 hdr.GetQosTid(),
-                                startingSeq,
+                                GetBaAgreementStartingSequenceNumber(hdr),
                                 edca->GetBlockAckInactivityTimeout(),
                                 true,
                                 availableTime);
     }
+    else if (IsGcr(m_mac, hdr))
+    {
+        if (const auto addbaRecipient = NeedSetupGcrBlockAck(hdr))
+        {
+            return SendAddBaRequest(addbaRecipient.value(),
+                                    hdr.GetQosTid(),
+                                    GetBaAgreementStartingSequenceNumber(hdr),
+                                    edca->GetBlockAckInactivityTimeout(),
+                                    true,
+                                    availableTime,
+                                    hdr.GetAddr1());
+        }
+    }
 
     // Use SendDataFrame if we can try aggregation
-    if (hdr.IsQosData() && !hdr.GetAddr1().IsGroup() && !peekedItem->IsFragment() &&
+    if (hdr.IsQosData() && !hdr.GetAddr1().IsBroadcast() && !peekedItem->IsFragment() &&
         !GetWifiRemoteStationManager()->NeedFragmentation(peekedItem =
                                                               CreateAliasIfNeeded(peekedItem)))
     {
@@ -446,8 +529,20 @@
                 continue;
             }
 
-            auto agreement = m_mac->GetBaAgreementEstablishedAsOriginator(recipient, tid);
-            if (!agreement)
+            auto agreement = m_mac->GetBaAgreementEstablishedAsOriginator(
+                recipient,
+                tid,
+                reqHdr.IsGcr() ? std::optional{reqHdr.GetGcrGroupAddress()} : std::nullopt);
+            if (const auto isGcrBa =
+                    reqHdr.IsGcr() && (m_apMac->GetGcrManager()->GetRetransmissionPolicy() ==
+                                       GroupAddressRetransmissionPolicy::GCR_BLOCK_ACK);
+                agreement && reqHdr.IsGcr() && !isGcrBa)
+            {
+                NS_LOG_DEBUG("Skip GCR BAR if GCR-BA retransmission policy is not selected");
+                queue->Remove(bar);
+                continue;
+            }
+            else if (!agreement)
             {
                 NS_LOG_DEBUG("BA agreement with " << recipient << " for TID=" << +tid
                                                   << " was torn down");
@@ -509,7 +604,14 @@
         auto baManager = m_mac->GetQosTxop(ac)->GetBaManager();
         for (const auto& [recipient, tid] : baManager->GetSendBarIfDataQueuedList())
         {
-            if (queue->PeekByTidAndAddress(tid, recipient))
+            WifiContainerQueueId queueId(
+                WIFI_QOSDATA_QUEUE,
+                WIFI_UNICAST,
+                GetWifiRemoteStationManager()->GetMldAddress(recipient).value_or(recipient),
+                tid);
+            // check if data is queued and can be transmitted on this link
+            if (queue->PeekByTidAndAddress(tid, recipient) &&
+                !m_mac->GetTxBlockedOnLink(QosUtilsMapTidToAc(tid), queueId, m_linkId))
             {
                 auto [reqHdr, hdr] = m_mac->GetQosTxop(ac)->PrepareBlockAckRequest(recipient, tid);
                 auto pkt = Create<Packet>();
@@ -614,7 +716,7 @@
     {
         // a QoS data frame using the Block Ack policy can be followed by a BlockAckReq
         // frame and a BlockAck frame. Such a sequence is handled by the HT FEM
-        SendPsduWithProtection(Create<WifiPsdu>(mpdu, false), txParams);
+        SendPsduWithProtection(GetWifiPsdu(mpdu, txParams.m_txVector), txParams);
     }
     else
     {
@@ -634,22 +736,23 @@
     if (acknowledgment->method == WifiAcknowledgment::BLOCK_ACK)
     {
         auto blockAcknowledgment = static_cast<WifiBlockAck*>(acknowledgment);
-        Time baTxDuration = m_phy->CalculateTxDuration(GetBlockAckSize(blockAcknowledgment->baType),
-                                                       blockAcknowledgment->blockAckTxVector,
-                                                       m_phy->GetPhyBand());
+        auto baTxDuration =
+            WifiPhy::CalculateTxDuration(GetBlockAckSize(blockAcknowledgment->baType),
+                                         blockAcknowledgment->blockAckTxVector,
+                                         m_phy->GetPhyBand());
         blockAcknowledgment->acknowledgmentTime = m_phy->GetSifs() + baTxDuration;
     }
     else if (acknowledgment->method == WifiAcknowledgment::BAR_BLOCK_ACK)
     {
         auto barBlockAcknowledgment = static_cast<WifiBarBlockAck*>(acknowledgment);
-        Time barTxDuration =
-            m_phy->CalculateTxDuration(GetBlockAckRequestSize(barBlockAcknowledgment->barType),
-                                       barBlockAcknowledgment->blockAckReqTxVector,
-                                       m_phy->GetPhyBand());
-        Time baTxDuration =
-            m_phy->CalculateTxDuration(GetBlockAckSize(barBlockAcknowledgment->baType),
-                                       barBlockAcknowledgment->blockAckTxVector,
-                                       m_phy->GetPhyBand());
+        auto barTxDuration =
+            WifiPhy::CalculateTxDuration(GetBlockAckRequestSize(barBlockAcknowledgment->barType),
+                                         barBlockAcknowledgment->blockAckReqTxVector,
+                                         m_phy->GetPhyBand());
+        auto baTxDuration =
+            WifiPhy::CalculateTxDuration(GetBlockAckSize(barBlockAcknowledgment->baType),
+                                         barBlockAcknowledgment->blockAckTxVector,
+                                         m_phy->GetPhyBand());
         barBlockAcknowledgment->acknowledgmentTime =
             2 * m_phy->GetSifs() + barTxDuration + baTxDuration;
     }
@@ -685,6 +788,8 @@
         {
             // notify the BA manager that the MPDU was acknowledged
             edca->GetBaManager()->NotifyGotAck(m_linkId, mpdu);
+            // the BA manager fires the AckedMpdu trace source, so nothing else must be done
+            return;
         }
     }
     else if (mpdu->GetHeader().IsAction())
@@ -703,11 +808,15 @@
                 auto tid = delBa.GetTid();
                 if (delBa.IsByOriginator())
                 {
-                    GetBaManager(tid)->DestroyOriginatorAgreement(address, tid);
+                    GetBaManager(tid)->DestroyOriginatorAgreement(address,
+                                                                  tid,
+                                                                  delBa.GetGcrGroupAddress());
                 }
                 else
                 {
-                    GetBaManager(tid)->DestroyRecipientAgreement(address, tid);
+                    GetBaManager(tid)->DestroyRecipientAgreement(address,
+                                                                 tid,
+                                                                 delBa.GetGcrGroupAddress());
                 }
             }
             else if (actionHdr.GetAction().blockAck == WifiActionHeader::BLOCK_ACK_ADDBA_REQUEST)
@@ -720,7 +829,8 @@
                                     &QosTxop::AddBaResponseTimeout,
                                     edca,
                                     address,
-                                    addBa.GetTid());
+                                    addBa.GetTid(),
+                                    addBa.GetGcrGroupAddress());
             }
             else if (actionHdr.GetAction().blockAck == WifiActionHeader::BLOCK_ACK_ADDBA_RESPONSE)
             {
@@ -728,9 +838,11 @@
                 MgtAddBaResponseHeader addBa;
                 p->PeekHeader(addBa);
                 auto tid = addBa.GetTid();
-                NS_ASSERT_MSG(GetBaManager(tid)->GetAgreementAsRecipient(address, tid),
-                              "Recipient BA agreement {" << address << ", " << +tid
-                                                         << "} not found");
+                NS_ASSERT_MSG(
+                    GetBaManager(tid)->GetAgreementAsRecipient(address,
+                                                               tid,
+                                                               addBa.GetGcrGroupAddress()),
+                    "Recipient BA agreement {" << address << ", " << +tid << "} not found");
                 m_pendingAddBaResp.erase({address, tid});
             }
         }
@@ -743,7 +855,8 @@
 {
     NS_LOG_DEBUG(this);
 
-    if (m_edca && m_edca->GetTxopLimit(m_linkId).IsZero() && GetBar(m_edca->GetAccessCategory()))
+    if (m_edca && m_edca->GetTxopLimit(m_linkId).IsZero() && GetBar(m_edca->GetAccessCategory()) &&
+        (m_txNav > Simulator::Now() + m_phy->GetSifs()))
     {
         // A TXOP limit of 0 indicates that the TXOP holder may transmit or cause to
         // be transmitted (as responses) the following within the current TXOP:
@@ -755,6 +868,12 @@
 
         // TXOP limit is null, hence the txopDuration parameter is unused
         Simulator::Schedule(m_phy->GetSifs(), fp, this, m_edca, Seconds(0));
+
+        if (m_protectedIfResponded)
+        {
+            m_protectedStas.merge(m_sentFrameTo);
+        }
+        m_sentFrameTo.clear();
     }
     else
     {
@@ -778,24 +897,34 @@
         if (actionHdr.GetCategory() == WifiActionHeader::BLOCK_ACK &&
             actionHdr.GetAction().blockAck == WifiActionHeader::BLOCK_ACK_ADDBA_REQUEST)
         {
-            uint8_t tid = GetTid(mpdu->GetPacket(), mpdu->GetHeader());
+            const auto tid = GetTid(mpdu->GetPacket(), mpdu->GetHeader());
             auto recipient = mpdu->GetHeader().GetAddr1();
             // if the recipient is an MLD, use its MLD address
             if (auto mldAddr = GetWifiRemoteStationManager()->GetMldAddress(recipient))
             {
                 recipient = *mldAddr;
             }
-            if (auto agreement = GetBaManager(tid)->GetAgreementAsOriginator(recipient, tid);
+            auto p = mpdu->GetPacket()->Copy();
+            p->RemoveHeader(actionHdr);
+            MgtAddBaRequestHeader addBa;
+            p->PeekHeader(addBa);
+            if (auto agreement =
+                    GetBaManager(tid)->GetAgreementAsOriginator(recipient,
+                                                                tid,
+                                                                addBa.GetGcrGroupAddress());
                 agreement && agreement->get().IsPending())
             {
                 NS_LOG_DEBUG("No ACK after ADDBA request");
                 Ptr<QosTxop> qosTxop = m_mac->GetQosTxop(tid);
-                qosTxop->NotifyOriginatorAgreementNoReply(recipient, tid);
+                qosTxop->NotifyOriginatorAgreementNoReply(recipient,
+                                                          tid,
+                                                          addBa.GetGcrGroupAddress());
                 Simulator::Schedule(qosTxop->GetFailedAddBaTimeout(),
                                     &QosTxop::ResetBa,
                                     qosTxop,
                                     recipient,
-                                    tid);
+                                    tid,
+                                    addBa.GetGcrGroupAddress());
             }
         }
     }
@@ -833,10 +962,20 @@
 {
     NS_LOG_FUNCTION(this << *psdu);
 
-    auto tids = psdu->GetTids();
+    const auto tids = psdu->GetTids();
+    const auto isGcr = IsGcr(m_mac, psdu->GetHeader(0));
+    auto agreementEstablished =
+        !tids.empty() /* no QoS data frame included */ &&
+        (isGcr ? GetBaManager(*tids.begin())
+                     ->IsGcrAgreementEstablished(
+                         psdu->GetHeader(0).GetAddr1(),
+                         *tids.begin(),
+                         m_apMac->GetGcrManager()->GetMemberStasForGroupAddress(
+                             psdu->GetHeader(0).GetAddr1()))
+               : m_mac->GetBaAgreementEstablishedAsOriginator(psdu->GetAddr1(), *tids.begin())
+                     .has_value());
 
-    if (tids.empty() || // no QoS data frames included
-        !m_mac->GetBaAgreementEstablishedAsOriginator(psdu->GetAddr1(), *tids.begin()))
+    if (!agreementEstablished)
     {
         QosFrameExchangeManager::ReleaseSequenceNumbers(psdu);
         return;
@@ -853,7 +992,15 @@
         if (hdr.IsQosData())
         {
             uint8_t tid = hdr.GetQosTid();
-            NS_ASSERT(m_mac->GetBaAgreementEstablishedAsOriginator(hdr.GetAddr1(), tid));
+            agreementEstablished =
+                isGcr ? GetBaManager(tid)->IsGcrAgreementEstablished(
+                            psdu->GetHeader(0).GetAddr1(),
+                            tid,
+                            m_apMac->GetGcrManager()->GetMemberStasForGroupAddress(
+                                psdu->GetHeader(0).GetAddr1()))
+                      : m_mac->GetBaAgreementEstablishedAsOriginator(psdu->GetAddr1(), tid)
+                            .has_value();
+            NS_ASSERT(agreementEstablished);
 
             if (!hdr.IsRetry() && !(*mpduIt)->IsInFlight())
             {
@@ -950,7 +1097,14 @@
     {
         m_protectedStas.merge(m_sentRtsTo);
         m_sentRtsTo.clear();
-        SendPsdu();
+        if (m_txParams.m_protection->method == WifiProtection::NONE)
+        {
+            SendPsdu();
+        }
+        else
+        {
+            Simulator::Schedule(m_phy->GetSifs(), &HtFrameExchangeManager::SendPsdu, this);
+        }
         return;
     }
     QosFrameExchangeManager::ProtectionCompleted();
@@ -979,22 +1133,57 @@
     NS_LOG_FUNCTION(this);
 
     Time txDuration =
-        m_phy->CalculateTxDuration(m_psdu->GetSize(), m_txParams.m_txVector, m_phy->GetPhyBand());
+        WifiPhy::CalculateTxDuration(m_psdu->GetSize(), m_txParams.m_txVector, m_phy->GetPhyBand());
 
     NS_ASSERT(m_txParams.m_acknowledgment);
 
     if (m_txParams.m_acknowledgment->method == WifiAcknowledgment::NONE)
     {
-        Simulator::Schedule(txDuration, &HtFrameExchangeManager::TransmissionSucceeded, this);
-
         std::set<uint8_t> tids = m_psdu->GetTids();
         NS_ASSERT_MSG(tids.size() <= 1, "Multi-TID A-MPDUs are not supported");
 
-        if (tids.empty() || m_psdu->GetAckPolicyForTid(*tids.begin()) == WifiMacHeader::NO_ACK)
+        if (m_mac->GetTypeOfStation() == AP && m_apMac->UseGcr(m_psdu->GetHeader(0)))
+        {
+            if (m_apMac->GetGcrManager()->KeepGroupcastQueued(*m_psdu->begin()))
+            {
+                // keep the groupcast frame in the queue for future retransmission
+                Simulator::Schedule(txDuration + m_phy->GetSifs(), [=, this, psdu = m_psdu]() {
+                    NS_LOG_DEBUG("Prepare groupcast PSDU for retry");
+                    for (const auto& mpdu : *PeekPointer(psdu))
+                    {
+                        mpdu->ResetInFlight(m_linkId);
+                        // restore addr1 to the group address instead of the concealment address
+                        if (m_apMac->GetGcrManager()->UseConcealment(mpdu->GetHeader()))
+                        {
+                            mpdu->GetHeader().SetAddr1(mpdu->begin()->second.GetDestinationAddr());
+                        }
+                        mpdu->GetHeader().SetRetry();
+                    }
+                });
+            }
+            else
+            {
+                if (m_apMac->GetGcrManager()->GetRetransmissionPolicy() ==
+                    GroupAddressRetransmissionPolicy::GCR_UNSOLICITED_RETRY)
+                {
+                    for (const auto& mpdu : *PeekPointer(m_psdu))
+                    {
+                        NotifyLastGcrUrTx(mpdu);
+                    }
+                }
+                DequeuePsdu(m_psdu);
+            }
+        }
+        else if (tids.empty() || m_psdu->GetAckPolicyForTid(*tids.begin()) == WifiMacHeader::NO_ACK)
         {
             // No acknowledgment, hence dequeue the PSDU if it is stored in a queue
             DequeuePsdu(m_psdu);
         }
+
+        Simulator::Schedule(txDuration, [=, this]() {
+            TransmissionSucceeded();
+            m_psdu = nullptr;
+        });
     }
     else if (m_txParams.m_acknowledgment->method == WifiAcknowledgment::BLOCK_ACK)
     {
@@ -1007,7 +1196,7 @@
 
         Time timeout =
             txDuration + m_phy->GetSifs() + m_phy->GetSlot() +
-            m_phy->CalculatePhyPreambleAndHeaderDuration(blockAcknowledgment->blockAckTxVector);
+            WifiPhy::CalculatePhyPreambleAndHeaderDuration(blockAcknowledgment->blockAckTxVector);
         NS_ASSERT(!m_txTimer.IsRunning());
         m_txTimer.Set(WifiTxTimer::WAIT_BLOCK_ACK,
                       timeout,
@@ -1023,16 +1212,43 @@
         m_psdu->SetDuration(GetPsduDurationId(txDuration, m_txParams));
 
         // schedule the transmission of a BAR in a SIFS
-        std::set<uint8_t> tids = m_psdu->GetTids();
+        const auto tids = m_psdu->GetTids();
         NS_ABORT_MSG_IF(tids.size() > 1,
                         "Acknowledgment method incompatible with a Multi-TID A-MPDU");
-        uint8_t tid = *tids.begin();
+        const auto tid = *tids.begin();
 
-        Ptr<QosTxop> edca = m_mac->GetQosTxop(tid);
-        auto [reqHdr, hdr] = edca->PrepareBlockAckRequest(m_psdu->GetAddr1(), tid);
-        GetBaManager(tid)->ScheduleBar(reqHdr, hdr);
+        auto edca = m_mac->GetQosTxop(tid);
+        const auto isGcr = IsGcr(m_mac, m_psdu->GetHeader(0));
+        const auto& recipients =
+            isGcr ? m_apMac->GetGcrManager()->GetMemberStasForGroupAddress(m_psdu->GetAddr1())
+                  : GcrManager::GcrMembers{m_psdu->GetAddr1()};
+        std::optional<Mac48Address> gcrGroupAddress{isGcr ? std::optional{m_psdu->GetAddr1()}
+                                                          : std::nullopt};
+        for (const auto& recipient : recipients)
+        {
+            auto [reqHdr, hdr] = edca->PrepareBlockAckRequest(recipient, tid, gcrGroupAddress);
+            GetBaManager(tid)->ScheduleBar(reqHdr, hdr);
+        }
+
+        if (isGcr)
+        {
+            Simulator::Schedule(txDuration + m_phy->GetSifs(), [=, this, psdu = m_psdu]() {
+                NS_LOG_DEBUG("Restore group address of PSDU");
+                for (const auto& mpdu : *PeekPointer(psdu))
+                {
+                    // restore addr1 to the group address instead of the concealment address
+                    if (m_apMac->GetGcrManager()->UseConcealment(mpdu->GetHeader()))
+                    {
+                        mpdu->GetHeader().SetAddr1(mpdu->begin()->second.GetDestinationAddr());
+                    }
+                }
+            });
+        }
 
-        Simulator::Schedule(txDuration, &HtFrameExchangeManager::TransmissionSucceeded, this);
+        Simulator::Schedule(txDuration, [=, this]() {
+            TransmissionSucceeded();
+            m_psdu = nullptr;
+        });
     }
     else
     {
@@ -1050,6 +1266,12 @@
         ForwardMpduDown(*m_psdu->begin(), m_txParams.m_txVector);
     }
 
+    if (m_txTimer.IsRunning())
+    {
+        NS_ASSERT(m_sentFrameTo.empty());
+        m_sentFrameTo = {m_psdu->GetAddr1()};
+    }
+
     if (m_txParams.m_acknowledgment->method == WifiAcknowledgment::NONE)
     {
         // we are done in case the A-MPDU does not require acknowledgment
@@ -1103,6 +1325,14 @@
                 hdr.SetQosEosp();
                 hdr.SetQosQueueSize(queueSizeForTid[tid].value());
             }
+
+            if (m_mac->GetTypeOfStation() == AP && m_apMac->UseGcr(hdr) &&
+                m_apMac->GetGcrManager()->UseConcealment(mpdu->GetHeader()))
+            {
+                const auto& gcrConcealmentAddress =
+                    m_apMac->GetGcrManager()->GetGcrConcealmentAddress();
+                hdr.SetAddr1(gcrConcealmentAddress);
+            }
         }
     }
 
@@ -1112,8 +1342,7 @@
 void
 HtFrameExchangeManager::DequeuePsdu(Ptr<const WifiPsdu> psdu)
 {
-    NS_LOG_DEBUG(this << psdu);
-
+    NS_LOG_FUNCTION(this << *psdu);
     for (const auto& mpdu : *PeekPointer(psdu))
     {
         DequeueMpdu(mpdu);
@@ -1135,6 +1364,15 @@
         txVector.SetAggregation(true);
     }
 
+    auto txDuration = WifiPhy::CalculateTxDuration(psdu, txVector, m_phy->GetPhyBand());
+    // The TXNAV timer is a single timer, shared by the EDCAFs within a STA, that is initialized
+    // with the duration from the Duration/ID field in the frame most recently successfully
+    // transmitted by the TXOP holder, except for PS-Poll frames. (Sec.10.23.2.2 IEEE 802.11-2020)
+    if (!psdu->GetHeader(0).IsPsPoll())
+    {
+        m_txNav = Max(m_txNav, Simulator::Now() + txDuration + psdu->GetDuration());
+    }
+
     m_phy->Send(psdu, txVector);
 }
 
@@ -1339,35 +1577,22 @@
 
     GetWifiRemoteStationManager()->ReportDataFailed(*psdu->begin());
 
-    bool resetCw;
-    MissedBlockAck(psdu, txVector, resetCw);
-
-    NS_ASSERT(m_edca);
-
-    if (resetCw)
-    {
-        m_edca->ResetCw(m_linkId);
-    }
-    else
-    {
-        m_edca->UpdateFailedCw(m_linkId);
-    }
+    MissedBlockAck(psdu, txVector);
 
     m_psdu = nullptr;
     TransmissionFailed();
 }
 
 void
-HtFrameExchangeManager::MissedBlockAck(Ptr<WifiPsdu> psdu,
-                                       const WifiTxVector& txVector,
-                                       bool& resetCw)
+HtFrameExchangeManager::MissedBlockAck(Ptr<WifiPsdu> psdu, const WifiTxVector& txVector)
 {
-    NS_LOG_FUNCTION(this << psdu << txVector << resetCw);
+    NS_LOG_FUNCTION(this << psdu << txVector);
 
     auto recipient = psdu->GetAddr1();
     auto recipientMld = GetWifiRemoteStationManager()->GetMldAddress(recipient).value_or(recipient);
     bool isBar;
     uint8_t tid;
+    std::optional<Mac48Address> gcrGroupAddress;
 
     if (psdu->GetNMpdus() == 1 && psdu->GetHeader(0).IsBlockAckReq())
     {
@@ -1375,6 +1600,10 @@
         CtrlBAckRequestHeader baReqHdr;
         psdu->GetPayload(0)->PeekHeader(baReqHdr);
         tid = baReqHdr.GetTidInfo();
+        if (baReqHdr.IsGcr())
+        {
+            gcrGroupAddress = baReqHdr.GetGcrGroupAddress();
+        }
     }
     else
     {
@@ -1383,6 +1612,15 @@
         NS_ABORT_MSG_IF(tids.size() > 1, "Multi-TID A-MPDUs not handled here");
         NS_ASSERT(!tids.empty());
         tid = *tids.begin();
+
+        GetWifiRemoteStationManager()
+            ->ReportAmpduTxStatus(recipient, 0, psdu->GetNMpdus(), 0, 0, txVector);
+
+        if (auto droppedMpdu = DropMpduIfRetryLimitReached(psdu))
+        {
+            // notify remote station manager if at least an MPDU was dropped
+            GetWifiRemoteStationManager()->ReportFinalDataFailed(droppedMpdu);
+        }
     }
 
     Ptr<QosTxop> edca = m_mac->GetQosTxop(tid);
@@ -1390,7 +1628,13 @@
     if (edca->UseExplicitBarAfterMissedBlockAck() || isBar)
     {
         // we have to send a BlockAckReq, if needed
-        if (GetBaManager(tid)->NeedBarRetransmission(tid, recipientMld))
+        const auto retransmitBar =
+            gcrGroupAddress.has_value()
+                ? GetBaManager(tid)->NeedGcrBarRetransmission(gcrGroupAddress.value(),
+                                                              recipientMld,
+                                                              tid)
+                : GetBaManager(tid)->NeedBarRetransmission(tid, recipientMld);
+        if (retransmitBar)
         {
             NS_LOG_DEBUG("Missed Block Ack, transmit a BlockAckReq");
             /**
@@ -1413,14 +1657,12 @@
                 auto [reqHdr, hdr] = edca->PrepareBlockAckRequest(recipient, tid);
                 GetBaManager(tid)->ScheduleBar(reqHdr, hdr);
             }
-            resetCw = false;
         }
         else
         {
             NS_LOG_DEBUG("Missed Block Ack, do not transmit a BlockAckReq");
             // if a BA agreement exists, we can get here if there is no outstanding
             // MPDU whose lifetime has not expired yet.
-            GetWifiRemoteStationManager()->ReportFinalDataFailed(*psdu->begin());
             if (isBar)
             {
                 DequeuePsdu(psdu);
@@ -1431,31 +1673,12 @@
                 // for this recipient
                 GetBaManager(tid)->AddToSendBarIfDataQueuedList(recipientMld, tid);
             }
-            resetCw = true;
         }
     }
     else
     {
         // we have to retransmit the data frames, if needed
-        GetWifiRemoteStationManager()
-            ->ReportAmpduTxStatus(recipient, 0, psdu->GetNMpdus(), 0, 0, txVector);
-        if (!GetWifiRemoteStationManager()->NeedRetransmission(*psdu->begin()))
-        {
-            NS_LOG_DEBUG("Missed Block Ack, do not retransmit the data frames");
-            GetWifiRemoteStationManager()->ReportFinalDataFailed(*psdu->begin());
-            for (const auto& mpdu : *PeekPointer(psdu))
-            {
-                NotifyPacketDiscarded(mpdu);
-                DequeueMpdu(mpdu);
-            }
-            resetCw = true;
-        }
-        else
-        {
-            NS_LOG_DEBUG("Missed Block Ack, retransmit data frames");
-            GetBaManager(tid)->NotifyMissedBlockAck(m_linkId, recipientMld, tid);
-            resetCw = false;
-        }
+        GetBaManager(tid)->NotifyMissedBlockAck(m_linkId, recipientMld, tid);
     }
 }
 
@@ -1463,9 +1686,10 @@
 HtFrameExchangeManager::SendBlockAck(const RecipientBlockAckAgreement& agreement,
                                      Time durationId,
                                      WifiTxVector& blockAckTxVector,
-                                     double rxSnr)
+                                     double rxSnr,
+                                     std::optional<Mac48Address> gcrGroupAddr)
 {
-    NS_LOG_FUNCTION(this << durationId << blockAckTxVector << rxSnr);
+    NS_LOG_FUNCTION(this << durationId << blockAckTxVector << rxSnr << gcrGroupAddr.has_value());
 
     WifiMacHeader hdr;
     hdr.SetType(WIFI_MAC_CTL_BACKRESP);
@@ -1481,8 +1705,12 @@
 
     CtrlBAckResponseHeader blockAck;
     blockAck.SetType(agreement.GetBlockAckType());
+    if (gcrGroupAddr.has_value())
+    {
+        blockAck.SetGcrGroupAddress(gcrGroupAddr.value());
+    }
     blockAck.SetTidInfo(agreement.GetTid());
-    agreement.FillBlockAckBitmap(&blockAck);
+    agreement.FillBlockAckBitmap(blockAck);
 
     Ptr<Packet> packet = Create<Packet>();
     packet->AddHeader(blockAck);
@@ -1495,7 +1723,7 @@
     // time, in microseconds between the end of the PPDU carrying the frame that
     // elicited the response and the end of the PPDU carrying the BlockAck frame.
     Time baDurationId = durationId - m_phy->GetSifs() -
-                        m_phy->CalculateTxDuration(psdu, blockAckTxVector, m_phy->GetPhyBand());
+                        WifiPhy::CalculateTxDuration(psdu, blockAckTxVector, m_phy->GetPhyBand());
     // The TXOP holder may exceed the TXOP limit in some situations (Sec. 10.22.2.8 of 802.11-2016)
     if (baDurationId.IsStrictlyNegative())
     {
@@ -1516,6 +1744,8 @@
                                     const WifiTxVector& txVector,
                                     bool inAmpdu)
 {
+    NS_LOG_FUNCTION(this << *mpdu << rxSignalInfo << txVector << inAmpdu);
+
     // The received MPDU is either broadcast or addressed to this station
     NS_ASSERT(mpdu->GetHeader().GetAddr1().IsGroup() || mpdu->GetHeader().GetAddr1() == m_self);
 
@@ -1543,15 +1773,14 @@
 
             m_txTimer.Cancel();
             m_channelAccessManager->NotifyCtsTimeoutResetNow();
-            Simulator::Schedule(m_phy->GetSifs(),
-                                &HtFrameExchangeManager::ProtectionCompleted,
-                                this);
+            ProtectionCompleted();
         }
         else if (hdr.IsBlockAck() && m_txTimer.IsRunning() &&
                  m_txTimer.GetReason() == WifiTxTimer::WAIT_BLOCK_ACK && hdr.GetAddr1() == m_self)
         {
             Mac48Address sender = hdr.GetAddr2();
             NS_LOG_DEBUG("Received BlockAck from=" << sender);
+            m_txTimer.GotResponseFrom(sender);
 
             SnrTag tag;
             mpdu->GetPacket()->PeekPacketTag(tag);
@@ -1560,17 +1789,44 @@
             CtrlBAckResponseHeader blockAck;
             mpdu->GetPacket()->PeekHeader(blockAck);
             uint8_t tid = blockAck.GetTidInfo();
-            std::pair<uint16_t, uint16_t> ret =
-                GetBaManager(tid)->NotifyGotBlockAck(m_linkId,
-                                                     blockAck,
-                                                     m_mac->GetMldAddress(sender).value_or(sender),
-                                                     {tid});
-            GetWifiRemoteStationManager()->ReportAmpduTxStatus(sender,
-                                                               ret.first,
-                                                               ret.second,
-                                                               rxSnr,
-                                                               tag.Get(),
-                                                               m_txParams.m_txVector);
+            if (blockAck.IsGcr())
+            {
+                const auto& gcrMembers = m_apMac->GetGcrManager()->GetMemberStasForGroupAddress(
+                    blockAck.GetGcrGroupAddress());
+                const auto ret = GetBaManager(tid)->NotifyGotGcrBlockAck(
+                    m_linkId,
+                    blockAck,
+                    m_mac->GetMldAddress(sender).value_or(sender),
+                    gcrMembers);
+
+                if (ret.has_value())
+                {
+                    for (const auto& sender : gcrMembers)
+                    {
+                        GetWifiRemoteStationManager()->ReportAmpduTxStatus(sender,
+                                                                           ret->first,
+                                                                           ret->second,
+                                                                           rxSnr,
+                                                                           tag.Get(),
+                                                                           m_txParams.m_txVector);
+                    }
+                }
+            }
+            else
+            {
+                const auto [nSuccessful, nFailed] = GetBaManager(tid)->NotifyGotBlockAck(
+                    m_linkId,
+                    blockAck,
+                    m_mac->GetMldAddress(sender).value_or(sender),
+                    {tid});
+
+                GetWifiRemoteStationManager()->ReportAmpduTxStatus(sender,
+                                                                   nSuccessful,
+                                                                   nFailed,
+                                                                   rxSnr,
+                                                                   tag.Get(),
+                                                                   m_txParams.m_txVector);
+            }
 
             // cancel the timer
             m_txTimer.Cancel();
@@ -1592,16 +1848,19 @@
             NS_ASSERT(hdr.GetAddr1() == m_self);
             NS_ABORT_MSG_IF(inAmpdu, "BlockAckReq in A-MPDU is not supported");
 
-            Mac48Address sender = hdr.GetAddr2();
+            auto sender = hdr.GetAddr2();
             NS_LOG_DEBUG("Received BlockAckReq from=" << sender);
 
             CtrlBAckRequestHeader blockAckReq;
             mpdu->GetPacket()->PeekHeader(blockAckReq);
             NS_ABORT_MSG_IF(blockAckReq.IsMultiTid(), "Multi-TID BlockAckReq not supported");
-            uint8_t tid = blockAckReq.GetTidInfo();
-
-            auto agreement = m_mac->GetBaAgreementEstablishedAsRecipient(sender, tid);
+            const auto tid = blockAckReq.GetTidInfo();
 
+            auto agreement = m_mac->GetBaAgreementEstablishedAsRecipient(
+                sender,
+                tid,
+                blockAckReq.IsGcr() ? std::optional{blockAckReq.GetGcrGroupAddress()}
+                                    : std::nullopt);
             if (!agreement)
             {
                 NS_LOG_DEBUG("There's not a valid agreement for this BlockAckReq");
@@ -1611,7 +1870,9 @@
             GetBaManager(tid)->NotifyGotBlockAckRequest(
                 m_mac->GetMldAddress(sender).value_or(sender),
                 tid,
-                blockAckReq.GetStartingSequence());
+                blockAckReq.GetStartingSequence(),
+                blockAckReq.IsGcr() ? std::optional{blockAckReq.GetGcrGroupAddress()}
+                                    : std::nullopt);
 
             NS_LOG_DEBUG("Schedule Block Ack");
             Simulator::Schedule(
@@ -1621,7 +1882,9 @@
                 *agreement,
                 hdr.GetDuration(),
                 GetWifiRemoteStationManager()->GetBlockAckTxVector(sender, txVector),
-                rxSnr);
+                rxSnr,
+                blockAckReq.IsGcr() ? std::optional{blockAckReq.GetGcrGroupAddress()}
+                                    : std::nullopt);
         }
         else
         {
@@ -1631,11 +1894,19 @@
         return;
     }
 
-    if (hdr.IsQosData() && hdr.HasData() && hdr.GetAddr1() == m_self)
-    {
-        uint8_t tid = hdr.GetQosTid();
-
-        if (m_mac->GetBaAgreementEstablishedAsRecipient(hdr.GetAddr2(), tid))
+    if (const auto isGroup = IsGroupcast(hdr.GetAddr1());
+        hdr.IsQosData() && hdr.HasData() &&
+        ((hdr.GetAddr1() == m_self) || (isGroup && (inAmpdu || !mpdu->GetHeader().IsQosNoAck()))))
+    {
+        const auto tid = hdr.GetQosTid();
+
+        auto agreement = m_mac->GetBaAgreementEstablishedAsRecipient(
+            hdr.GetAddr2(),
+            tid,
+            isGroup ? std::optional{hdr.IsQosAmsdu() ? mpdu->begin()->second.GetDestinationAddr()
+                                                     : hdr.GetAddr1()}
+                    : std::nullopt);
+        if (agreement)
         {
             // a Block Ack agreement has been established
             NS_LOG_DEBUG("Received from=" << hdr.GetAddr2() << " (" << *mpdu << ")");
@@ -1663,6 +1934,12 @@
         ReceiveMgtAction(mpdu, txVector);
     }
 
+    if (IsGroupcast(hdr.GetAddr1()) && hdr.IsQosData() && hdr.IsQosAmsdu() &&
+        !m_mac->GetRobustAVStreamingSupported())
+    {
+        return;
+    }
+
     QosFrameExchangeManager::ReceiveMpdu(mpdu, rxSignalInfo, txVector, inAmpdu);
 }
 
@@ -1735,7 +2012,9 @@
                 // agreement exists in BlockAckManager and we need to
                 // destroy it.
                 GetBaManager(delBaHdr.GetTid())
-                    ->DestroyRecipientAgreement(recipient, delBaHdr.GetTid());
+                    ->DestroyRecipientAgreement(recipient,
+                                                delBaHdr.GetTid(),
+                                                delBaHdr.GetGcrGroupAddress());
             }
             else
             {
@@ -1762,6 +2041,10 @@
                                         const WifiTxVector& txVector,
                                         const std::vector<bool>& perMpduStatus)
 {
+    NS_LOG_FUNCTION(
+        this << *psdu << rxSignalInfo << txVector << perMpduStatus.size()
+             << std::all_of(perMpduStatus.begin(), perMpduStatus.end(), [](bool v) { return v; }));
+
     std::set<uint8_t> tids = psdu->GetTids();
 
     // Multi-TID A-MPDUs are not supported yet
@@ -1785,9 +2068,77 @@
                 *agreement,
                 psdu->GetDuration(),
                 GetWifiRemoteStationManager()->GetBlockAckTxVector(psdu->GetAddr2(), txVector),
-                rxSignalInfo.snr);
+                rxSignalInfo.snr,
+                std::nullopt);
         }
+        else if (psdu->GetAddr1().IsGroup() && (ackPolicy == WifiMacHeader::NO_ACK))
+        {
+            // groupcast A-MPDU received
+            m_flushGroupcastMpdusEvent.Cancel();
+
+            /*
+             * There might be pending MPDUs from a previous groupcast transmission
+             * that have not been forwarded up yet (e.g. all transmission attempts
+             * of a given MPDU have failed). For groupcast transmissions using GCR-UR service,
+             * transmitter keeps advancing its window since there is no feedback from the
+             * recipients. In order to forward up previously received groupcast MPDUs and avoid
+             * following MPDUs not to be forwarded up, we flush the recipient window. The sequence
+             * number to use can easily be deduced since sequence number of groupcast MPDUs are
+             * consecutive.
+             */
+            const auto startSeq = psdu->GetHeader(0).GetSequenceNumber();
+            const auto groupAddress = psdu->GetHeader(0).IsQosAmsdu()
+                                          ? (*psdu->begin())->begin()->second.GetDestinationAddr()
+                                          : psdu->GetAddr1();
+            FlushGroupcastMpdus(groupAddress, psdu->GetAddr2(), tid, startSeq);
+
+            /*
+             * In case all MPDUs of all following transmissions are corrupted or
+             * if no following groupcast transmission happens, some groupcast MPDUs
+             * of the currently received A-MPDU would never be forwarded up. To prevent this,
+             * we schedule a flush of the recipient window once the MSDU lifetime limit elapsed.
+             */
+            const auto stopSeq = (startSeq + perMpduStatus.size()) % 4096;
+            const auto maxDelay = m_mac->GetQosTxop(tid)->GetWifiMacQueue()->GetMaxDelay();
+            m_flushGroupcastMpdusEvent =
+                Simulator::Schedule(maxDelay,
+                                    &HtFrameExchangeManager::FlushGroupcastMpdus,
+                                    this,
+                                    groupAddress,
+                                    psdu->GetAddr2(),
+                                    tid,
+                                    stopSeq);
+        }
+    }
+}
+
+void
+HtFrameExchangeManager::FlushGroupcastMpdus(const Mac48Address& groupAddress,
+                                            const Mac48Address& originator,
+                                            uint8_t tid,
+                                            uint16_t seq)
+{
+    NS_LOG_FUNCTION(this << groupAddress << originator << tid << seq);
+    // We can flush the recipient window by indicating the reception of an implicit GCR BAR
+    GetBaManager(tid)->NotifyGotBlockAckRequest(originator, tid, seq, groupAddress);
+}
+
+void
+HtFrameExchangeManager::NotifyLastGcrUrTx(Ptr<const WifiMpdu> mpdu)
+{
+    NS_LOG_FUNCTION(this << mpdu);
+    const auto tid = mpdu->GetHeader().GetQosTid();
+    const auto groupAddress = mpdu->GetHeader().GetAddr1();
+    if (!GetBaManager(tid)->IsGcrAgreementEstablished(
+            groupAddress,
+            tid,
+            m_apMac->GetGcrManager()->GetMemberStasForGroupAddress(groupAddress)))
+    {
+        return;
     }
+    GetBaManager(tid)->NotifyLastGcrUrTx(
+        mpdu,
+        m_apMac->GetGcrManager()->GetMemberStasForGroupAddress(groupAddress));
 }
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/ht/ht-frame-exchange-manager.h ns-3.44/src/wifi/model/ht/ht-frame-exchange-manager.h
--- ns-3.43/src/wifi/model/ht/ht-frame-exchange-manager.h	2024-10-09 16:41:10.120656700 -0700
+++ ns-3.44/src/wifi/model/ht/ht-frame-exchange-manager.h	2025-03-09 16:55:49.791372500 -0700
@@ -12,7 +12,6 @@
 #include "ns3/mpdu-aggregator.h"
 #include "ns3/msdu-aggregator.h"
 #include "ns3/qos-frame-exchange-manager.h"
-#include "ns3/wifi-psdu.h"
 
 class AmpduAggregationTest;
 
@@ -23,7 +22,7 @@
 class RecipientBlockAckAgreement;
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * HtFrameExchangeManager handles the frame exchange sequences
  * for HT stations.
@@ -35,8 +34,8 @@
     friend class ::AmpduAggregationTest;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     HtFrameExchangeManager();
@@ -49,13 +48,13 @@
     /**
      * Returns the aggregator used to construct A-MSDU subframes.
      *
-     * \return the aggregator used to construct A-MSDU subframes.
+     * @return the aggregator used to construct A-MSDU subframes.
      */
     Ptr<MsduAggregator> GetMsduAggregator() const;
     /**
      * Returns the aggregator used to construct A-MPDU subframes.
      *
-     * \return the aggregator used to construct A-MPDU subframes.
+     * @return the aggregator used to construct A-MPDU subframes.
      */
     Ptr<MpduAggregator> GetMpduAggregator() const;
 
@@ -65,10 +64,10 @@
      * and its transmission time does not exceed the given PPDU duration limit (if
      * different than Time::Min()).
      *
-     * \param mpdu the given MPDU
-     * \param txParams the TX parameters
-     * \param ppduDurationLimit the constraint on the PPDU transmission time
-     * \return true if the size and time constraints are met, false otherwise
+     * @param mpdu the given MPDU
+     * @param txParams the TX parameters
+     * @param ppduDurationLimit the constraint on the PPDU transmission time
+     * @return true if the size and time constraints are met, false otherwise
      */
     bool IsWithinLimitsIfAddMpdu(Ptr<const WifiMpdu> mpdu,
                                  const WifiTxParameters& txParams,
@@ -79,11 +78,11 @@
      * size for A-MPDUs sent to the given receiver, belonging to the given TID and
      * transmitted using the given modulation class.
      *
-     * \param ampduSize the size in bytes of the A-MPDU.
-     * \param receiver the address of the station that is the receiver of the A-MPDU
-     * \param tid the TID of the A-MPDU
-     * \param modulation the modulation class used to transmit the A-MPDU
-     * \return true if the constraint on the max A-MPDU size is met.
+     * @param ampduSize the size in bytes of the A-MPDU.
+     * @param receiver the address of the station that is the receiver of the A-MPDU
+     * @param tid the TID of the A-MPDU
+     * @param modulation the modulation class used to transmit the A-MPDU
+     * @return true if the constraint on the max A-MPDU size is met.
      */
     virtual bool IsWithinAmpduSizeLimit(uint32_t ampduSize,
                                         Mac48Address receiver,
@@ -97,11 +96,11 @@
      * size and time constraints are met, the TX parameters are modified with the
      * updated protection and acknowledgment methods.
      *
-     * \param msdu the given MSDU
-     * \param txParams the TX parameters
-     * \param availableTime the constraint on the TX time of the PSDU, if different
+     * @param msdu the given MSDU
+     * @param txParams the TX parameters
+     * @param availableTime the constraint on the TX time of the PSDU, if different
      *        than Time::Min()
-     * \return true if aggregating an MSDU to the current PSDU does not violate the
+     * @return true if aggregating an MSDU to the current PSDU does not violate the
      *         size and time constraints
      */
     virtual bool TryAggregateMsdu(Ptr<const WifiMpdu> msdu,
@@ -114,10 +113,10 @@
      * and its transmission time does not exceed the given PPDU duration limit (if
      * different than Time::Min()).
      *
-     * \param msdu the given MSDU
-     * \param txParams the TX parameters
-     * \param ppduDurationLimit the constraint on the PPDU transmission time
-     * \return true if the size and time constraints are met, false otherwise
+     * @param msdu the given MSDU
+     * @param txParams the TX parameters
+     * @param ppduDurationLimit the constraint on the PPDU transmission time
+     * @return true if the size and time constraints are met, false otherwise
      */
     virtual bool IsWithinLimitsIfAggregateMsdu(Ptr<const WifiMpdu> msdu,
                                                const WifiTxParameters& txParams,
@@ -127,8 +126,8 @@
      * This method can be called to accept a received ADDBA Request. An
      * ADDBA Response will be constructed and queued for transmission.
      *
-     * \param reqHdr the received ADDBA Request header.
-     * \param originator the MAC address of the originator.
+     * @param reqHdr the received ADDBA Request header.
+     * @param originator the MAC address of the originator.
      */
     void SendAddBaResponse(const MgtAddBaRequestHeader& reqHdr, Mac48Address originator);
 
@@ -136,27 +135,40 @@
      * Sends DELBA frame to cancel a block ack agreement with STA
      * addressed by <i>addr</i> for TID <i>tid</i>.
      *
-     * \param addr address of the recipient.
-     * \param tid traffic ID.
-     * \param byOriginator flag to indicate whether this is set by the originator.
-     */
-    void SendDelbaFrame(Mac48Address addr, uint8_t tid, bool byOriginator);
+     * @param addr address of the recipient.
+     * @param tid traffic ID.
+     * @param byOriginator flag to indicate whether this is set by the originator.
+     * @param gcrGroupAddr the GCR Group Address (only if it a GCR Block Ack agreement)
+     */
+    void SendDelbaFrame(Mac48Address addr,
+                        uint8_t tid,
+                        bool byOriginator,
+                        std::optional<Mac48Address> gcrGroupAddr);
 
     /**
      * Get the next BlockAckRequest or MU-BAR Trigger Frame to send, if any. If TID and recipient
      * address are given, then only return a BlockAckRequest, if any, addressed to that recipient
      * and for the given TID.
      *
-     * \param ac the AC whose queue is searched for BlockAckRequest or Trigger Frames
-     * \param optTid the TID (optional)
-     * \param optAddress the recipient of the BAR (optional)
+     * @param ac the AC whose queue is searched for BlockAckRequest or Trigger Frames
+     * @param optTid the TID (optional)
+     * @param optAddress the recipient of the BAR (optional)
      *
-     * \return the next BAR or Trigger Frame to be sent, if any
+     * @return the next BAR or Trigger Frame to be sent, if any
      */
     Ptr<WifiMpdu> GetBar(AcIndex ac,
                          std::optional<uint8_t> optTid = std::nullopt,
                          std::optional<Mac48Address> optAddress = std::nullopt);
 
+    /**
+     * Get a PSDU containing the given MPDU
+     *
+     * @param mpdu the given MPDU
+     * @param txVector the TXVECTOR to use to send the MPDU
+     * @return a PSDU containing the given MPDU
+     */
+    virtual Ptr<WifiPsdu> GetWifiPsdu(Ptr<WifiMpdu> mpdu, const WifiTxVector& txVector) const;
+
   protected:
     void DoDispose() override;
 
@@ -177,38 +189,30 @@
     void CtsTimeout(Ptr<WifiMpdu> rts, const WifiTxVector& txVector) override;
     void TransmissionSucceeded() override;
     void ProtectionCompleted() override;
+    void NotifyLastGcrUrTx(Ptr<const WifiMpdu> mpdu) override;
 
     /**
      * Process a received management action frame that relates to Block Ack agreement.
      *
-     * \param mpdu the MPDU carrying the received management action frame
-     * \param txVector the TXVECTOR used to transmit the management action frame
+     * @param mpdu the MPDU carrying the received management action frame
+     * @param txVector the TXVECTOR used to transmit the management action frame
      */
     void ReceiveMgtAction(Ptr<const WifiMpdu> mpdu, const WifiTxVector& txVector);
 
     /**
-     * Get a PSDU containing the given MPDU
-     *
-     * \param mpdu the given MPDU
-     * \param txVector the TXVECTOR to use to send the MPDU
-     * \return a PSDU containing the given MPDU
-     */
-    virtual Ptr<WifiPsdu> GetWifiPsdu(Ptr<WifiMpdu> mpdu, const WifiTxVector& txVector) const;
-
-    /**
      * Get the Block Ack Manager handling the given TID.
      *
-     * \param tid the given TID
-     * \return the Block Ack Manager handling the given TID
+     * @param tid the given TID
+     * @return the Block Ack Manager handling the given TID
      */
     Ptr<BlockAckManager> GetBaManager(uint8_t tid) const;
 
     /**
      * Compute how to set the Duration/ID field of PSDUs that do not include fragments.
      *
-     * \param txDuration the duration of the PSDU transmission
-     * \param txParams the TX parameters used to send the PSDU
-     * \return the value for the Duration/ID field
+     * @param txDuration the duration of the PSDU transmission
+     * @param txParams the TX parameters used to send the PSDU
+     * @return the value for the Duration/ID field
      */
     virtual Time GetPsduDurationId(Time txDuration, const WifiTxParameters& txParams) const;
 
@@ -218,8 +222,8 @@
      * Note that <i>txParams</i> is moved to m_txParams and hence is left in an
      * undefined state.
      *
-     * \param psdu the PSDU to send
-     * \param txParams the TX parameters to use to transmit the PSDU
+     * @param psdu the PSDU to send
+     * @param txParams the TX parameters to use to transmit the PSDU
      */
     void SendPsduWithProtection(Ptr<WifiPsdu> psdu, WifiTxParameters& txParams);
 
@@ -227,7 +231,7 @@
      * Notify the transmission of the given PSDU to the EDCAF associated with the
      * AC the PSDU belongs to.
      *
-     * \param psdu the PSDU to transmit
+     * @param psdu the PSDU to transmit
      */
     virtual void NotifyTxToEdca(Ptr<const WifiPsdu> psdu) const;
 
@@ -235,15 +239,15 @@
      * Forward a PSDU down to the PHY layer. Also, notify the Block Ack Manager
      * of the transmission of the constituent MPDUs.
      *
-     * \param psdu the PSDU to forward down
-     * \param txVector the TXVECTOR used to transmit the MPDU
+     * @param psdu the PSDU to forward down
+     * @param txVector the TXVECTOR used to transmit the MPDU
      */
     virtual void ForwardPsduDown(Ptr<const WifiPsdu> psdu, WifiTxVector& txVector);
 
     /**
      * Dequeue the MPDUs of the given PSDU from the queue in which they are stored.
      *
-     * \param psdu the given PSDU
+     * @param psdu the given PSDU
      */
     void DequeuePsdu(Ptr<const WifiPsdu> psdu);
 
@@ -252,13 +256,13 @@
      * fits within the given available time, if the latter is not Time::Min() and this is not
      * the initial frame of a TXOP), transmit the frame and return true. Otherwise, return false.
      *
-     * \param mpdu the given MPDU
-     * \param availableTime the amount of time allowed for the frame exchange. Equals
+     * @param mpdu the given MPDU
+     * @param availableTime the amount of time allowed for the frame exchange. Equals
      *                      Time::Min() in case the TXOP limit is null
-     * \param initialFrame true if the frame being transmitted is the initial frame
+     * @param initialFrame true if the frame being transmitted is the initial frame
      *                     of the TXOP. This is used to determine whether the TXOP
      *                     limit can be exceeded
-     * \return true if frame is transmitted, false otherwise
+     * @return true if frame is transmitted, false otherwise
      */
     virtual bool SendMpduFromBaManager(Ptr<WifiMpdu> mpdu, Time availableTime, bool initialFrame);
 
@@ -268,17 +272,26 @@
      * exchange (possibly including protection and acknowledgment) is completed within
      * the given available time.
      *
-     * \param peekedItem the given non-broadcast QoS data frame
-     * \param availableTime the amount of time allowed for the frame exchange. Equals
+     * @param peekedItem the given non-broadcast QoS data frame
+     * @param availableTime the amount of time allowed for the frame exchange. Equals
      *                      Time::Min() in case the TXOP limit is null
-     * \param initialFrame true if the frame being transmitted is the initial frame
+     * @param initialFrame true if the frame being transmitted is the initial frame
      *                     of the TXOP. This is used to determine whether the TXOP
      *                     limit can be exceeded
-     * \return true if frame is transmitted, false otherwise
+     * @return true if frame is transmitted, false otherwise
      */
     virtual bool SendDataFrame(Ptr<WifiMpdu> peekedItem, Time availableTime, bool initialFrame);
 
     /**
+     * Retrieve the starting sequence number for a BA agreement to be established.
+     *
+     * @param header the MAC header of the next data packet selected for transmission once the BA
+     * agreement is established. \return the starting sequence number for a BA agreement to be
+     * established
+     */
+    uint16_t GetBaAgreementStartingSequenceNumber(const WifiMacHeader& header);
+
+    /**
      * A Block Ack agreement needs to be established with the given recipient for the
      * given TID if it does not already exist (or exists and is in state RESET) and:
      *
@@ -286,50 +299,71 @@
      * - MPDU aggregation is enabled and there is more than one packet in the queue OR
      * - the station is a VHT station
      *
-     * \param recipient address of the recipient.
-     * \param tid traffic ID.
-     * \return true if a Block Ack agreement needs to be established, false otherwise.
+     * @param recipient address of the recipient.
+     * @param tid traffic ID.
+     * @return true if a Block Ack agreement needs to be established, false otherwise.
      */
     virtual bool NeedSetupBlockAck(Mac48Address recipient, uint8_t tid);
 
     /**
+     * A Block Ack agreement needs to be established prior to the transmission of a groupcast data
+     * packet using the GCR service if it does not already exist (or exists and is in state RESET)
+     * for all member STAs and:
+     *
+     * - the number of packets in the groupcast queue reaches the BlockAckThreshold value OR
+     * - MPDU aggregation is enabled and there is more than one groupcast packet in the queue OR
+     * - the station is a VHT station
+     *
+     * @param header the MAC header of the next groupcast data packet selected for transmission.
+     * @return the recipient of the ADDBA frame if a Block Ack agreement needs to be established,
+     * std::nullopt otherwise.
+     */
+    virtual std::optional<Mac48Address> NeedSetupGcrBlockAck(const WifiMacHeader& header);
+
+    /**
      * Sends an ADDBA Request to establish a block ack agreement with STA
      * addressed by <i>recipient</i> for TID <i>tid</i>.
      *
-     * \param recipient address of the recipient.
-     * \param tid traffic ID.
-     * \param startingSeq the BA agreement starting sequence number
-     * \param timeout timeout value.
-     * \param immediateBAck flag to indicate whether immediate BlockAck is used.
-     * \param availableTime the amount of time allowed for the frame exchange. Equals
+     * @param recipient address of the recipient.
+     * @param tid traffic ID.
+     * @param startingSeq the BA agreement starting sequence number
+     * @param timeout timeout value.
+     * @param immediateBAck flag to indicate whether immediate BlockAck is used.
+     * @param availableTime the amount of time allowed for the frame exchange. Equals
      *                      Time::Min() in case the TXOP limit is null
-     * \return true if ADDBA Request frame is transmitted, false otherwise
+     * @param gcrGroupAddr the GCR Group Address (only if the Block Ack agreement is being
+     *                     set up for the GCR service)
+     * @return true if ADDBA Request frame is transmitted, false otherwise
      */
     bool SendAddBaRequest(Mac48Address recipient,
                           uint8_t tid,
                           uint16_t startingSeq,
                           uint16_t timeout,
                           bool immediateBAck,
-                          Time availableTime);
+                          Time availableTime,
+                          std::optional<Mac48Address> gcrGroupAddr = std::nullopt);
 
     /**
      * Create a BlockAck frame with header equal to <i>blockAck</i> and start its transmission.
      *
-     * \param agreement the agreement the Block Ack response belongs to
-     * \param durationId the Duration/ID of the frame soliciting this Block Ack response
-     * \param blockAckTxVector the transmit vector for the Block Ack response
-     * \param rxSnr the receive SNR
+     * @param agreement the agreement the Block Ack response belongs to
+     * @param durationId the Duration/ID of the frame soliciting this Block Ack response
+     * @param blockAckTxVector the transmit vector for the Block Ack response
+     * @param rxSnr the receive SNR
+     * @param gcrGroupAddr the GCR Group Address (only if the Block Ack is being used for the GCR
+     * service)
      */
     void SendBlockAck(const RecipientBlockAckAgreement& agreement,
                       Time durationId,
                       WifiTxVector& blockAckTxVector,
-                      double rxSnr);
+                      double rxSnr,
+                      std::optional<Mac48Address> gcrGroupAddr = std::nullopt);
 
     /**
      * Called when the BlockAck timeout expires.
      *
-     * \param psdu the PSDU (BlockAckReq or A-MPDU) that solicited a BlockAck response
-     * \param txVector the TXVECTOR used to send the PSDU that solicited a BlockAck response
+     * @param psdu the PSDU (BlockAckReq or A-MPDU) that solicited a BlockAck response
+     * @param txVector the TXVECTOR used to send the PSDU that solicited a BlockAck response
      */
     virtual void BlockAckTimeout(Ptr<WifiPsdu> psdu, const WifiTxVector& txVector);
 
@@ -337,11 +371,26 @@
      * Take necessary actions when a BlockAck is missed, such as scheduling a
      * BlockAckReq frame or the retransmission of the unacknowledged frames.
      *
-     * \param psdu the PSDU (BlockAckReq or A-MPDU) that solicited a BlockAck response
-     * \param txVector the TXVECTOR used to send the PSDU that solicited a BlockAck response
-     * \param[out] resetCw true if we shall stop retransmitting the PSDU
+     * @param psdu the PSDU (BlockAckReq or A-MPDU) that solicited a BlockAck response
+     * @param txVector the TXVECTOR used to send the PSDU that solicited a BlockAck response
      */
-    virtual void MissedBlockAck(Ptr<WifiPsdu> psdu, const WifiTxVector& txVector, bool& resetCw);
+    virtual void MissedBlockAck(Ptr<WifiPsdu> psdu, const WifiTxVector& txVector);
+
+    /**
+     * Perform required actions to ensure the receiver window is flushed when a groupcast A-MPDU is
+     * received via the GCR service. If there are pending groupcast MPDUs from that recipient and
+     * that traffic ID, these MPDUs are forwarded up, by assuming an implicit BAR from the
+     * originator.
+     *
+     * @param groupAddress the destination group address of the MPDUs
+     * @param originator MAC address of the sender of the groupcast MPDUs
+     * @param tid Traffic ID
+     * @param seq the starting sequence number of the recipient window
+     */
+    void FlushGroupcastMpdus(const Mac48Address& groupAddress,
+                             const Mac48Address& originator,
+                             uint8_t tid,
+                             uint16_t seq);
 
     /// agreement key typedef (MAC address and TID)
     typedef std::pair<Mac48Address, uint8_t> AgreementKey;
@@ -361,6 +410,9 @@
 
     Ptr<WifiPsdu> m_psdu;        //!< the A-MPDU being transmitted
     WifiTxParameters m_txParams; //!< the TX parameters for the current frame
+
+    EventId m_flushGroupcastMpdusEvent; //!< the event to flush pending groupcast MPDUs from
+                                        //!< previously received A-MPDU
 };
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/ht/ht-operation.h ns-3.44/src/wifi/model/ht/ht-operation.h
--- ns-3.43/src/wifi/model/ht/ht-operation.h	2024-10-09 16:41:10.120656700 -0700
+++ ns-3.44/src/wifi/model/ht/ht-operation.h	2025-03-09 16:55:49.791372500 -0700
@@ -30,8 +30,8 @@
 };
 
 /**
- * \brief The HT Operation Information Element
- * \ingroup wifi
+ * @brief The HT Operation Information Element
+ * @ingroup wifi
  *
  * This class knows how to serialise and deserialise
  * the HT Operation Information Element
@@ -48,33 +48,33 @@
     /**
      * Set the Primary Channel field in the HT Operation information element.
      *
-     * \param ctrl the Primary Channel field in the HT Operation information element
+     * @param ctrl the Primary Channel field in the HT Operation information element
      */
     void SetPrimaryChannel(uint8_t ctrl);
     /**
      * Set the Information Subset 1 field in the HT Operation information element.
      *
-     * \param ctrl the Information Subset 1 field in the HT Operation information element
+     * @param ctrl the Information Subset 1 field in the HT Operation information element
      */
     void SetInformationSubset1(uint8_t ctrl);
     /**
      * Set the Information Subset 2 field in the HT Operation information element.
      *
-     * \param ctrl the Information Subset 2 field in the HT Operation information element
+     * @param ctrl the Information Subset 2 field in the HT Operation information element
      */
     void SetInformationSubset2(uint16_t ctrl);
     /**
      * Set the Information Subset 3 field in the HT Operation information element.
      *
-     * \param ctrl the Information Subset 3 field in the HT Operation information element
+     * @param ctrl the Information Subset 3 field in the HT Operation information element
      */
     void SetInformationSubset3(uint16_t ctrl);
     /**
      * Set the Basic MCS Set field in the HT Operation information element.
      *
-     * \param ctrl1 the first 64 bytes of the Basic MCS Set field in the HT Operation
+     * @param ctrl1 the first 64 bytes of the Basic MCS Set field in the HT Operation
      * information element
-     * \param ctrl2 the last 64 bytes of the Basic MCS Set field in the HT Operation
+     * @param ctrl2 the last 64 bytes of the Basic MCS Set field in the HT Operation
      * information element
      */
     void SetBasicMcsSet(uint64_t ctrl1, uint64_t ctrl2);
@@ -82,263 +82,263 @@
     /**
      * Set the secondary channel offset.
      *
-     * \param secondaryChannelOffset the secondary channel offset
+     * @param secondaryChannelOffset the secondary channel offset
      */
     void SetSecondaryChannelOffset(uint8_t secondaryChannelOffset);
     /**
      * Set the STA channel width.
      *
-     * \param staChannelWidth the STA channel width
+     * @param staChannelWidth the STA channel width
      */
     void SetStaChannelWidth(uint8_t staChannelWidth);
     /**
      * Set the RIFS mode.
      *
-     * \param rifsMode the RIFS mode
+     * @param rifsMode the RIFS mode
      */
     void SetRifsMode(uint8_t rifsMode);
 
     /**
      * Set the HT protection.
      *
-     * \param htProtection the HT protection
+     * @param htProtection the HT protection
      */
     void SetHtProtection(uint8_t htProtection);
     /**
      * Set the non GF HT STAs present.
      *
-     * \param nonGfHtStasPresent the non GF HT STAs present
+     * @param nonGfHtStasPresent the non GF HT STAs present
      */
     void SetNonGfHtStasPresent(uint8_t nonGfHtStasPresent);
     /**
      * Set the OBSS non HT STAs present.
      *
-     * \param obssNonHtStasPresent the OBSS non HTA STAs present
+     * @param obssNonHtStasPresent the OBSS non HTA STAs present
      */
     void SetObssNonHtStasPresent(uint8_t obssNonHtStasPresent);
 
     /**
      * Set the dual beacon.
      *
-     * \param dualBeacon the dual beacon
+     * @param dualBeacon the dual beacon
      */
     void SetDualBeacon(uint8_t dualBeacon);
     /**
      * Set the dual CTS protection.
      *
-     * \param dualCtsProtection the dual CTS protection
+     * @param dualCtsProtection the dual CTS protection
      */
     void SetDualCtsProtection(uint8_t dualCtsProtection);
     /**
      * Set the STBC beacon.
      *
-     * \param stbcBeacon the STBC beacon
+     * @param stbcBeacon the STBC beacon
      */
     void SetStbcBeacon(uint8_t stbcBeacon);
     /**
      * Set the LSIG TXOP protection full support.
      *
-     * \param lSigTxopProtectionFullSupport the LSIG TXOP protection full support
+     * @param lSigTxopProtectionFullSupport the LSIG TXOP protection full support
      */
     void SetLSigTxopProtectionFullSupport(uint8_t lSigTxopProtectionFullSupport);
     /**
      * Set the PCO active.
      *
-     * \param pcoActive the PCO active
+     * @param pcoActive the PCO active
      */
     void SetPcoActive(uint8_t pcoActive);
     /**
      * Set the PCO phase.
      *
-     * \param pcoPhase the PCO phase
+     * @param pcoPhase the PCO phase
      */
     void SetPhase(uint8_t pcoPhase);
 
     /**
      * Set the receive MCS bitmask.
      *
-     * \param index the MCS bitmask
+     * @param index the MCS bitmask
      */
     void SetRxMcsBitmask(uint8_t index);
     /**
      * Set the receive highest supported data rate.
      *
-     * \param maxSupportedRate the maximum supported data rate
+     * @param maxSupportedRate the maximum supported data rate
      */
     void SetRxHighestSupportedDataRate(uint16_t maxSupportedRate);
     /**
      * Set the transmit MCS set defined.
      *
-     * \param txMcsSetDefined the transmit MCS set defined
+     * @param txMcsSetDefined the transmit MCS set defined
      */
     void SetTxMcsSetDefined(uint8_t txMcsSetDefined);
     /**
      * Set the transmit / receive MCS set unequal.
      *
-     * \param txRxMcsSetUnequal the transmit / receive MCS set unequal
+     * @param txRxMcsSetUnequal the transmit / receive MCS set unequal
      */
     void SetTxRxMcsSetUnequal(uint8_t txRxMcsSetUnequal);
     /**
      * Set the transmit maximum number spatial streams.
      *
-     * \param maxTxSpatialStreams the maximum transmit spatial streams
+     * @param maxTxSpatialStreams the maximum transmit spatial streams
      */
     void SetTxMaxNSpatialStreams(uint8_t maxTxSpatialStreams);
     /**
      * Set the transmit unequal modulation.
      *
-     * \param txUnequalModulation the transmit unequal modulation
+     * @param txUnequalModulation the transmit unequal modulation
      */
     void SetTxUnequalModulation(uint8_t txUnequalModulation);
 
     /**
      * Return the Primary Channel field in the HT Operation information element.
      *
-     * \return the Primary Channel field in the HT Operation information element
+     * @return the Primary Channel field in the HT Operation information element
      */
     uint8_t GetPrimaryChannel() const;
     /**
      * Return the Information Subset 1 field in the HT Operation information element.
      *
-     * \return the Information Subset 1 field in the HT Operation information element
+     * @return the Information Subset 1 field in the HT Operation information element
      */
     uint8_t GetInformationSubset1() const;
     /**
      * Return the Information Subset 2 field in the HT Operation information element.
      *
-     * \return the Information Subset 2 field in the HT Operation information element
+     * @return the Information Subset 2 field in the HT Operation information element
      */
     uint16_t GetInformationSubset2() const;
     /**
      * Return the Information Subset 3 field in the HT Operation information element.
      *
-     * \return the Information Subset 3 field in the HT Operation information element
+     * @return the Information Subset 3 field in the HT Operation information element
      */
     uint16_t GetInformationSubset3() const;
     /**
      * Return the first 64 bytes of the Basic MCS Set field in the HT Operation information element.
      *
-     * \return the first 64 bytes of the Basic MCS Set field in the HT Operation information element
+     * @return the first 64 bytes of the Basic MCS Set field in the HT Operation information element
      */
     uint64_t GetBasicMcsSet1() const;
     /**
      * Return the last 64 bytes of the Basic MCS Set field in the HT Operation information element.
      *
-     * \return the last 64 bytes of the Basic MCS Set field in the HT Operation information element
+     * @return the last 64 bytes of the Basic MCS Set field in the HT Operation information element
      */
     uint64_t GetBasicMcsSet2() const;
 
     /**
      * Return the secondary channel offset.
      *
-     * \return the secondary channel offset
+     * @return the secondary channel offset
      */
     uint8_t GetSecondaryChannelOffset() const;
     /**
      * Return the STA channel width.
      *
-     * \return the STA channel width
+     * @return the STA channel width
      */
     uint8_t GetStaChannelWidth() const;
     /**
      * Return the RIFS mode.
      *
-     * \return the RIFS mode
+     * @return the RIFS mode
      */
     uint8_t GetRifsMode() const;
 
     /**
      * Return the HT protection.
      *
-     * \return the HT protection
+     * @return the HT protection
      */
     uint8_t GetHtProtection() const;
     /**
      * Return the non GF HT STAs present.
      *
-     * \return the non GF HT STAs present
+     * @return the non GF HT STAs present
      */
     uint8_t GetNonGfHtStasPresent() const;
     /**
      * Return the OBSS non HT STAs present.
      *
-     * \return the OBSS non HT STAs present
+     * @return the OBSS non HT STAs present
      */
     uint8_t GetObssNonHtStasPresent() const;
 
     /**
      * Return dual beacon.
      *
-     * \return the dual beacon
+     * @return the dual beacon
      */
     uint8_t GetDualBeacon() const;
     /**
      * Return dual CTS protection.
      *
-     * \return the dual CTS protection
+     * @return the dual CTS protection
      */
     uint8_t GetDualCtsProtection() const;
     /**
      * Return STBC beacon.
      *
-     * \return the STBC beacon
+     * @return the STBC beacon
      */
     uint8_t GetStbcBeacon() const;
     /**
      * Return LSIG TXOP protection full support.
      *
-     * \return the LSIG TXOP protection full support
+     * @return the LSIG TXOP protection full support
      */
     uint8_t GetLSigTxopProtectionFullSupport() const;
     /**
      * Return PCO active.
      *
-     * \return the PCO active
+     * @return the PCO active
      */
     uint8_t GetPcoActive() const;
     /**
      * Return phase.
      *
-     * \return the phase
+     * @return the phase
      */
     uint8_t GetPhase() const;
 
     /**
      * Return MCS is supported.
      *
-     * \param mcs MCS
+     * @param mcs MCS
      *
-     * \return the MCS is supported
+     * @return the MCS is supported
      */
     bool IsSupportedMcs(uint8_t mcs) const;
     /**
      * Return receive highest supported data rate.
      *
-     * \return receive highest supported data rate
+     * @return receive highest supported data rate
      */
     uint16_t GetRxHighestSupportedDataRate() const;
     /**
      * Return transmit MCS set defined.
      *
-     * \return the transmit MCS set defined
+     * @return the transmit MCS set defined
      */
     uint8_t GetTxMcsSetDefined() const;
     /**
      * Return transmit / receive MCS set unequal.
      *
-     * \return transmit / receive MCS set unequal
+     * @return transmit / receive MCS set unequal
      */
     uint8_t GetTxRxMcsSetUnequal() const;
     /**
      * Return transmit maximum number spatial streams.
      *
-     * \return transmit maximum number spatial streams
+     * @return transmit maximum number spatial streams
      */
     uint8_t GetTxMaxNSpatialStreams() const;
     /**
      * Return transmit unequal modulation.
      *
-     * \return transmit unequal modulation
+     * @return transmit unequal modulation
      */
     uint8_t GetTxUnequalModulation() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/ht/ht-phy.cc ns-3.44/src/wifi/model/ht/ht-phy.cc
--- ns-3.43/src/wifi/model/ht/ht-phy.cc	2024-10-09 16:41:10.120656700 -0700
+++ ns-3.44/src/wifi/model/ht/ht-phy.cc	2025-03-09 16:55:49.791372500 -0700
@@ -712,7 +712,7 @@
 uint16_t
 HtPhy::GetUsableSubcarriers(MHz_u channelWidth)
 {
-    return (channelWidth == 40) ? 108 : 52;
+    return (channelWidth == MHz_u{40}) ? 108 : 52;
 }
 
 Time
@@ -816,12 +816,12 @@
 PhyEntity::CcaIndication
 HtPhy::GetCcaIndication(const Ptr<const WifiPpdu> ppdu)
 {
-    if (m_wifiPhy->GetChannelWidth() < 40)
+    if (m_wifiPhy->GetChannelWidth() < MHz_u{40})
     {
         return OfdmPhy::GetCcaIndication(ppdu);
     }
     auto ccaThreshold = GetCcaThreshold(ppdu, WIFI_CHANLIST_PRIMARY);
-    auto delayUntilCcaEnd = GetDelayUntilCcaEnd(ccaThreshold, GetPrimaryBand(20));
+    auto delayUntilCcaEnd = GetDelayUntilCcaEnd(ccaThreshold, GetPrimaryBand(MHz_u{20}));
     if (delayUntilCcaEnd.IsStrictlyPositive())
     {
         return std::make_pair(
@@ -830,7 +830,7 @@
     }
     if (ppdu)
     {
-        const MHz_u primaryWidth = 20;
+        const MHz_u primaryWidth{20};
         const MHz_u p20MinFreq =
             m_wifiPhy->GetOperatingChannel().GetPrimaryChannelCenterFrequency(primaryWidth) -
             (primaryWidth / 2);
@@ -847,7 +847,7 @@
         }
     }
 
-    const MHz_u secondaryWidth = 20;
+    const MHz_u secondaryWidth{20};
     const MHz_u s20MinFreq =
         m_wifiPhy->GetOperatingChannel().GetSecondaryChannelCenterFrequency(secondaryWidth) -
         (secondaryWidth / 2);
@@ -857,7 +857,7 @@
     if (!ppdu || ppdu->DoesOverlapChannel(s20MinFreq, s20MaxFreq))
     {
         ccaThreshold = GetCcaThreshold(ppdu, WIFI_CHANLIST_SECONDARY);
-        delayUntilCcaEnd = GetDelayUntilCcaEnd(ccaThreshold, GetSecondaryBand(20));
+        delayUntilCcaEnd = GetDelayUntilCcaEnd(ccaThreshold, GetSecondaryBand(MHz_u{20}));
         if (delayUntilCcaEnd.IsStrictlyPositive())
         {
             return std::make_pair(delayUntilCcaEnd, WIFI_CHANLIST_SECONDARY);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/ht/ht-phy.h ns-3.44/src/wifi/model/ht/ht-phy.h
--- ns-3.43/src/wifi/model/ht/ht-phy.h	2024-10-09 16:41:10.120656700 -0700
+++ ns-3.44/src/wifi/model/ht/ht-phy.h	2025-03-09 16:55:49.791372500 -0700
@@ -13,8 +13,8 @@
 #include "ns3/ofdm-phy.h"
 
 /**
- * \file
- * \ingroup wifi
+ * @file
+ * @ingroup wifi
  * Declaration of ns3::HtPhy class.
  */
 
@@ -30,8 +30,8 @@
 constexpr uint8_t HT_MAX_NSS = 4;
 
 /**
- * \brief PHY entity for HT (11n)
- * \ingroup wifi
+ * @brief PHY entity for HT (11n)
+ * @ingroup wifi
  *
  * HT PHY is based on OFDM PHY.
  * Only HT-Mixed is supported (support for HT-Greenfield has been removed).
@@ -45,8 +45,8 @@
     /**
      * Constructor for HT PHY
      *
-     * \param maxNss the maximum number of spatial streams
-     * \param buildModeList flag used to add HT modes to list (disabled
+     * @param maxNss the maximum number of spatial streams
+     * @param buildModeList flag used to add HT modes to list (disabled
      *                      by child classes to only add child classes' modes)
      */
     HtPhy(uint8_t maxNss = 1, bool buildModeList = true);
@@ -74,16 +74,16 @@
                             Time ppduDuration) override;
 
     /**
-     * \return the WifiMode used for the L-SIG (non-HT header) field
+     * @return the WifiMode used for the L-SIG (non-HT header) field
      */
     static WifiMode GetLSigMode();
     /**
-     * \return the WifiMode used for the HT-SIG field
+     * @return the WifiMode used for the HT-SIG field
      */
     virtual WifiMode GetHtSigMode() const;
 
     /**
-     * \return the BSS membership selector for this PHY entity
+     * @return the BSS membership selector for this PHY entity
      */
     uint8_t GetBssMembershipSelector() const;
 
@@ -91,14 +91,14 @@
      * Set the maximum supported MCS index __per spatial stream__.
      * For HT, this results in non-continuous indices for supported MCSs.
      *
-     * \return the maximum MCS index per spatial stream supported by this entity
+     * @return the maximum MCS index per spatial stream supported by this entity
      */
     uint8_t GetMaxSupportedMcsIndexPerSs() const;
     /**
      * Set the maximum supported MCS index __per spatial stream__.
      * For HT, this results in non-continuous indices for supported MCSs.
      *
-     * \param maxIndex the maximum MCS index per spatial stream supported by this entity
+     * @param maxIndex the maximum MCS index per spatial stream supported by this entity
      *
      * The provided value should not be greater than maximum standard-defined value.
      */
@@ -107,30 +107,30 @@
      * Configure the maximum number of spatial streams supported
      * by this HT PHY.
      *
-     * \param maxNss the maximum number of spatial streams
+     * @param maxNss the maximum number of spatial streams
      */
     void SetMaxSupportedNss(uint8_t maxNss);
 
     /**
-     * \param preamble the type of preamble
-     * \return the duration of the L-SIG (non-HT header) field
+     * @param preamble the type of preamble
+     * @return the duration of the L-SIG (non-HT header) field
      *
-     * \see WIFI_PPDU_FIELD_NON_HT_HEADER
+     * @see WIFI_PPDU_FIELD_NON_HT_HEADER
      */
     virtual Time GetLSigDuration(WifiPreamble preamble) const;
     /**
-     * \param txVector the transmission parameters
-     * \param nDataLtf the number of data LTF fields (excluding those in preamble)
-     * \param nExtensionLtf the number of extension LTF fields
-     * \return the duration of the training field
+     * @param txVector the transmission parameters
+     * @param nDataLtf the number of data LTF fields (excluding those in preamble)
+     * @param nExtensionLtf the number of extension LTF fields
+     * @return the duration of the training field
      *
-     * \see WIFI_PPDU_FIELD_TRAINING
+     * @see WIFI_PPDU_FIELD_TRAINING
      */
     virtual Time GetTrainingDuration(const WifiTxVector& txVector,
                                      uint8_t nDataLtf,
                                      uint8_t nExtensionLtf = 0) const;
     /**
-     * \return the duration of the HT-SIG field
+     * @return the duration of the HT-SIG field
      */
     virtual Time GetHtSigDuration() const;
 
@@ -142,201 +142,201 @@
      * Return the HT MCS corresponding to
      * the provided index.
      *
-     * \param index the index of the MCS
-     * \return an HT MCS
+     * @param index the index of the MCS
+     * @return an HT MCS
      */
     static WifiMode GetHtMcs(uint8_t index);
 
     /**
      * Return MCS 0 from HT MCS values.
      *
-     * \return MCS 0 from HT MCS values
+     * @return MCS 0 from HT MCS values
      */
     static WifiMode GetHtMcs0();
     /**
      * Return MCS 1 from HT MCS values.
      *
-     * \return MCS 1 from HT MCS values
+     * @return MCS 1 from HT MCS values
      */
     static WifiMode GetHtMcs1();
     /**
      * Return MCS 2 from HT MCS values.
      *
-     * \return MCS 2 from HT MCS values
+     * @return MCS 2 from HT MCS values
      */
     static WifiMode GetHtMcs2();
     /**
      * Return MCS 3 from HT MCS values.
      *
-     * \return MCS 3 from HT MCS values
+     * @return MCS 3 from HT MCS values
      */
     static WifiMode GetHtMcs3();
     /**
      * Return MCS 4 from HT MCS values.
      *
-     * \return MCS 4 from HT MCS values
+     * @return MCS 4 from HT MCS values
      */
     static WifiMode GetHtMcs4();
     /**
      * Return MCS 5 from HT MCS values.
      *
-     * \return MCS 5 from HT MCS values
+     * @return MCS 5 from HT MCS values
      */
     static WifiMode GetHtMcs5();
     /**
      * Return MCS 6 from HT MCS values.
      *
-     * \return MCS 6 from HT MCS values
+     * @return MCS 6 from HT MCS values
      */
     static WifiMode GetHtMcs6();
     /**
      * Return MCS 7 from HT MCS values.
      *
-     * \return MCS 7 from HT MCS values
+     * @return MCS 7 from HT MCS values
      */
     static WifiMode GetHtMcs7();
     /**
      * Return MCS 8 from HT MCS values.
      *
-     * \return MCS 8 from HT MCS values
+     * @return MCS 8 from HT MCS values
      */
     static WifiMode GetHtMcs8();
     /**
      * Return MCS 9 from HT MCS values.
      *
-     * \return MCS 9 from HT MCS values
+     * @return MCS 9 from HT MCS values
      */
     static WifiMode GetHtMcs9();
     /**
      * Return MCS 10 from HT MCS values.
      *
-     * \return MCS 10 from HT MCS values
+     * @return MCS 10 from HT MCS values
      */
     static WifiMode GetHtMcs10();
     /**
      * Return MCS 11 from HT MCS values.
      *
-     * \return MCS 11 from HT MCS values
+     * @return MCS 11 from HT MCS values
      */
     static WifiMode GetHtMcs11();
     /**
      * Return MCS 12 from HT MCS values.
      *
-     * \return MCS 12 from HT MCS values
+     * @return MCS 12 from HT MCS values
      */
     static WifiMode GetHtMcs12();
     /**
      * Return MCS 13 from HT MCS values.
      *
-     * \return MCS 13 from HT MCS values
+     * @return MCS 13 from HT MCS values
      */
     static WifiMode GetHtMcs13();
     /**
      * Return MCS 14 from HT MCS values.
      *
-     * \return MCS 14 from HT MCS values
+     * @return MCS 14 from HT MCS values
      */
     static WifiMode GetHtMcs14();
     /**
      * Return MCS 15 from HT MCS values.
      *
-     * \return MCS 15 from HT MCS values
+     * @return MCS 15 from HT MCS values
      */
     static WifiMode GetHtMcs15();
     /**
      * Return MCS 16 from HT MCS values.
      *
-     * \return MCS 16 from HT MCS values
+     * @return MCS 16 from HT MCS values
      */
     static WifiMode GetHtMcs16();
     /**
      * Return MCS 17 from HT MCS values.
      *
-     * \return MCS 17 from HT MCS values
+     * @return MCS 17 from HT MCS values
      */
     static WifiMode GetHtMcs17();
     /**
      * Return MCS 18 from HT MCS values.
      *
-     * \return MCS 18 from HT MCS values
+     * @return MCS 18 from HT MCS values
      */
     static WifiMode GetHtMcs18();
     /**
      * Return MCS 19 from HT MCS values.
      *
-     * \return MCS 19 from HT MCS values
+     * @return MCS 19 from HT MCS values
      */
     static WifiMode GetHtMcs19();
     /**
      * Return MCS 20 from HT MCS values.
      *
-     * \return MCS 20 from HT MCS values
+     * @return MCS 20 from HT MCS values
      */
     static WifiMode GetHtMcs20();
     /**
      * Return MCS 21 from HT MCS values.
      *
-     * \return MCS 21 from HT MCS values
+     * @return MCS 21 from HT MCS values
      */
     static WifiMode GetHtMcs21();
     /**
      * Return MCS 22 from HT MCS values.
      *
-     * \return MCS 22 from HT MCS values
+     * @return MCS 22 from HT MCS values
      */
     static WifiMode GetHtMcs22();
     /**
      * Return MCS 23 from HT MCS values.
      *
-     * \return MCS 23 from HT MCS values
+     * @return MCS 23 from HT MCS values
      */
     static WifiMode GetHtMcs23();
     /**
      * Return MCS 24 from HT MCS values.
      *
-     * \return MCS 24 from HT MCS values
+     * @return MCS 24 from HT MCS values
      */
     static WifiMode GetHtMcs24();
     /**
      * Return MCS 25 from HT MCS values.
      *
-     * \return MCS 25 from HT MCS values
+     * @return MCS 25 from HT MCS values
      */
     static WifiMode GetHtMcs25();
     /**
      * Return MCS 26 from HT MCS values.
      *
-     * \return MCS 26 from HT MCS values
+     * @return MCS 26 from HT MCS values
      */
     static WifiMode GetHtMcs26();
     /**
      * Return MCS 27 from HT MCS values.
      *
-     * \return MCS 27 from HT MCS values
+     * @return MCS 27 from HT MCS values
      */
     static WifiMode GetHtMcs27();
     /**
      * Return MCS 28 from HT MCS values.
      *
-     * \return MCS 28 from HT MCS values
+     * @return MCS 28 from HT MCS values
      */
     static WifiMode GetHtMcs28();
     /**
      * Return MCS 29 from HT MCS values.
      *
-     * \return MCS 29 from HT MCS values
+     * @return MCS 29 from HT MCS values
      */
     static WifiMode GetHtMcs29();
     /**
      * Return MCS 30 from HT MCS values.
      *
-     * \return MCS 30 from HT MCS values
+     * @return MCS 30 from HT MCS values
      */
     static WifiMode GetHtMcs30();
     /**
      * Return MCS 31 from HT MCS values.
      *
-     * \return MCS 31 from HT MCS values
+     * @return MCS 31 from HT MCS values
      */
     static WifiMode GetHtMcs31();
 
@@ -346,8 +346,8 @@
      * GetCodeRate and is used as a callback for
      * WifiMode operation.
      *
-     * \param mcsValue the MCS index
-     * \return the coding rate.
+     * @param mcsValue the MCS index
+     * @return the coding rate.
      */
     static WifiCodeRate GetHtCodeRate(uint8_t mcsValue);
     /**
@@ -356,16 +356,16 @@
      * since HT MCS index > 8 is used for higher NSS.
      * This function is reused by child classes.
      *
-     * \param mcsValue the MCS index
-     * \return the coding rate.
+     * @param mcsValue the MCS index
+     * @return the coding rate.
      */
     static WifiCodeRate GetCodeRate(uint8_t mcsValue);
     /**
      * Return the constellation size corresponding
      * to the supplied HT MCS index.
      *
-     * \param mcsValue the MCS index
-     * \return the size of modulation constellation.
+     * @param mcsValue the MCS index
+     * @return the size of modulation constellation.
      */
     static uint16_t GetHtConstellationSize(uint8_t mcsValue);
     /**
@@ -374,8 +374,8 @@
      * since HT MCS index > 8 is used for higher NSS.
      * This function is reused by child classes.
      *
-     * \param mcsValue the MCS index
-     * \return the size of modulation constellation.
+     * @param mcsValue the MCS index
+     * @return the size of modulation constellation.
      */
     static uint16_t GetConstellationSize(uint8_t mcsValue);
     /**
@@ -384,12 +384,12 @@
      * spatial stream. This function calls CalculatePhyRate
      * and is mainly used as a callback for WifiMode operation.
      *
-     * \param mcsValue the HT MCS index
-     * \param channelWidth the considered channel width
-     * \param guardInterval the considered guard interval duration
-     * \param nss the considered number of stream
+     * @param mcsValue the HT MCS index
+     * @param channelWidth the considered channel width
+     * @param guardInterval the considered guard interval duration
+     * @param nss the considered number of stream
      *
-     * \return the physical bit rate of this signal in bps.
+     * @return the physical bit rate of this signal in bps.
      */
     static uint64_t GetPhyRate(uint8_t mcsValue,
                                MHz_u channelWidth,
@@ -401,9 +401,9 @@
      * This function is mainly used as a callback
      * for WifiMode operation.
      *
-     * \param txVector the TXVECTOR used for the transmission
-     * \param staId the station ID (only here to have a common signature for all callbacks)
-     * \return the physical bit rate of this signal in bps.
+     * @param txVector the TXVECTOR used for the transmission
+     * @param staId the station ID (only here to have a common signature for all callbacks)
+     * @return the physical bit rate of this signal in bps.
      */
     static uint64_t GetPhyRateFromTxVector(const WifiTxVector& txVector, uint16_t staId);
     /**
@@ -412,9 +412,9 @@
      * This function is mainly used as a callback
      * for WifiMode operation.
      *
-     * \param txVector the TXVECTOR used for the transmission
-     * \param staId the station ID (only here to have a common signature for all callbacks)
-     * \return the data bit rate in bps.
+     * @param txVector the TXVECTOR used for the transmission
+     * @param staId the station ID (only here to have a common signature for all callbacks)
+     * @return the data bit rate in bps.
      */
     static uint64_t GetDataRateFromTxVector(const WifiTxVector& txVector, uint16_t staId);
     /**
@@ -423,11 +423,11 @@
      * of spatial streams. This function is mainly used as a
      * callback for WifiMode operation.
      *
-     * \param mcsValue the HT MCS index
-     * \param channelWidth the channel width
-     * \param guardInterval the guard interval duration in nanoseconds
-     * \param nss the number of spatial streams
-     * \return the data bit rate in bps.
+     * @param mcsValue the HT MCS index
+     * @param channelWidth the channel width
+     * @param guardInterval the guard interval duration in nanoseconds
+     * @param nss the number of spatial streams
+     * @return the data bit rate in bps.
      */
     static uint64_t GetDataRate(uint8_t mcsValue,
                                 MHz_u channelWidth,
@@ -438,16 +438,16 @@
      * to the supplied HT MCS index. This function calls CalculateNonHtReferenceRate
      * and is used as a callback for WifiMode operation.
      *
-     * \param mcsValue the HT MCS index
-     * \return the rate in bps of the non-HT Reference Rate.
+     * @param mcsValue the HT MCS index
+     * @return the rate in bps of the non-HT Reference Rate.
      */
     static uint64_t GetNonHtReferenceRate(uint8_t mcsValue);
     /**
      * Check whether the combination in TXVECTOR is allowed.
      * This function is used as a callback for WifiMode operation.
      *
-     * \param txVector the TXVECTOR
-     * \returns true if this combination is allowed, false otherwise.
+     * @param txVector the TXVECTOR
+     * @returns true if this combination is allowed, false otherwise.
      */
     static bool IsAllowed(const WifiTxVector& txVector);
 
@@ -469,13 +469,13 @@
     virtual void BuildModeList();
 
     /**
-     * \param txVector the transmission parameters
-     * \return the number of BCC encoders used for data encoding
+     * @param txVector the transmission parameters
+     * @return the number of BCC encoders used for data encoding
      */
     virtual uint8_t GetNumberBccEncoders(const WifiTxVector& txVector) const;
     /**
-     * \param txVector the transmission parameters
-     * \return the symbol duration (including GI)
+     * @param txVector the transmission parameters
+     * @return the symbol duration (including GI)
      */
     virtual Time GetSymbolDuration(const WifiTxVector& txVector) const;
 
@@ -483,9 +483,9 @@
      * Return the PHY rate corresponding to
      * the supplied code rate and data rate.
      *
-     * \param codeRate the code rate
-     * \param dataRate the data rate in bps
-     * \return the data bit rate in bps.
+     * @param codeRate the code rate
+     * @param dataRate the data rate in bps
+     * @return the data bit rate in bps.
      */
     static uint64_t CalculatePhyRate(WifiCodeRate codeRate, uint64_t dataRate);
     /**
@@ -493,9 +493,9 @@
      * which corresponds to the supplied code rate and
      * constellation size.
      *
-     * \param codeRate the convolutional coding rate
-     * \param constellationSize the size of modulation constellation
-     * \returns the rate in bps.
+     * @param codeRate the convolutional coding rate
+     * @param constellationSize the size of modulation constellation
+     * @returns the rate in bps.
      *
      * To convert an HT MCS to its corresponding non-HT Reference Rate
      * use the modulation and coding rate of the HT MCS
@@ -505,20 +505,20 @@
     /**
      * Convert WifiCodeRate to a ratio, e.g., code ratio of WIFI_CODE_RATE_1_2 is 0.5.
      *
-     * \param codeRate the code rate
-     * \return the code rate in ratio.
+     * @param codeRate the code rate
+     * @return the code rate in ratio.
      */
     static double GetCodeRatio(WifiCodeRate codeRate);
     /**
      * Calculates data rate from the supplied parameters.
      *
-     * \param symbolDuration the symbol duration
-     * \param usableSubCarriers the number of usable subcarriers for data
-     * \param numberOfBitsPerSubcarrier the number of data bits per subcarrier
-     * \param codingRate the coding rate
-     * \param nss the considered number of streams
+     * @param symbolDuration the symbol duration
+     * @param usableSubCarriers the number of usable subcarriers for data
+     * @param numberOfBitsPerSubcarrier the number of data bits per subcarrier
+     * @param codingRate the coding rate
+     * @param nss the considered number of streams
      *
-     * \return the data bit rate of this signal in bps.
+     * @return the data bit rate of this signal in bps.
      */
     static uint64_t CalculateDataRate(Time symbolDuration,
                                       uint16_t usableSubCarriers,
@@ -527,14 +527,14 @@
                                       uint8_t nss);
 
     /**
-     * \param channelWidth the channel width
-     * \return the number of usable subcarriers for data
+     * @param channelWidth the channel width
+     * @return the number of usable subcarriers for data
      */
     static uint16_t GetUsableSubcarriers(MHz_u channelWidth);
 
     /**
-     * \param guardInterval the guard interval duration
-     * \return the symbol duration
+     * @param guardInterval the guard interval duration
+     * @return the symbol duration
      */
     static Time GetSymbolDuration(Time guardInterval);
 
@@ -548,8 +548,8 @@
      * End receiving the HT-SIG, perform HT-specific actions, and
      * provide the status of the reception.
      *
-     * \param event the event holding incoming PPDU's information
-     * \return status of the reception of the HT-SIG
+     * @param event the event holding incoming PPDU's information
+     * @return status of the reception of the HT-SIG
      */
     PhyFieldRxStatus EndReceiveHtSig(Ptr<Event> event);
 
@@ -558,8 +558,8 @@
      * the provided index.
      * This method binds all the callbacks used by WifiMode.
      *
-     * \param index the index of the MCS
-     * \return an HT MCS
+     * @param index the index of the MCS
+     * @return an HT MCS
      */
     static WifiMode CreateHtMcs(uint8_t index);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/ht/ht-ppdu.cc ns-3.44/src/wifi/model/ht/ht-ppdu.cc
--- ns-3.43/src/wifi/model/ht/ht-ppdu.cc	2024-10-09 16:41:10.120656700 -0700
+++ ns-3.44/src/wifi/model/ht/ht-ppdu.cc	2025-03-09 16:55:49.791372500 -0700
@@ -135,13 +135,13 @@
 void
 HtPpdu::HtSigHeader::SetChannelWidth(MHz_u channelWidth)
 {
-    m_cbw20_40 = (channelWidth > 20) ? 1 : 0;
+    m_cbw20_40 = (channelWidth > MHz_u{20}) ? 1 : 0;
 }
 
 MHz_u
 HtPpdu::HtSigHeader::GetChannelWidth() const
 {
-    return m_cbw20_40 ? 40 : 20;
+    return m_cbw20_40 ? MHz_u{40} : MHz_u{20};
 }
 
 void
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/ht/ht-ppdu.h ns-3.44/src/wifi/model/ht/ht-ppdu.h
--- ns-3.43/src/wifi/model/ht/ht-ppdu.h	2024-10-09 16:41:10.120656700 -0700
+++ ns-3.44/src/wifi/model/ht/ht-ppdu.h	2025-03-09 16:55:49.791372500 -0700
@@ -14,8 +14,8 @@
 #include "ns3/ofdm-ppdu.h"
 
 /**
- * \file
- * \ingroup wifi
+ * @file
+ * @ingroup wifi
  * Declaration of ns3::HtPpdu class.
  */
 
@@ -25,8 +25,8 @@
 class WifiPsdu;
 
 /**
- * \brief HT  PPDU (11n)
- * \ingroup wifi
+ * @brief HT  PPDU (11n)
+ * @ingroup wifi
  *
  * HtPpdu stores a preamble, PHY headers and a PSDU of a PPDU with HT header
  */
@@ -45,61 +45,61 @@
         /**
          * Fill the MCS field of HT-SIG.
          *
-         * \param mcs the MCS field of HT-SIG
+         * @param mcs the MCS field of HT-SIG
          */
         void SetMcs(uint8_t mcs);
         /**
          * Return the MCS field of HT-SIG.
          *
-         * \return the MCS field of HT-SIG
+         * @return the MCS field of HT-SIG
          */
         uint8_t GetMcs() const;
         /**
          * Fill the channel width field of HT-SIG.
          *
-         * \param channelWidth the channel width
+         * @param channelWidth the channel width
          */
         void SetChannelWidth(MHz_u channelWidth);
         /**
          * Return the channel width.
          *
-         * \return the channel width
+         * @return the channel width
          */
         MHz_u GetChannelWidth() const;
         /**
          * Fill the aggregation field of HT-SIG.
          *
-         * \param aggregation whether the PSDU contains A-MPDU or not
+         * @param aggregation whether the PSDU contains A-MPDU or not
          */
         void SetAggregation(bool aggregation);
         /**
          * Return the aggregation field of HT-SIG.
          *
-         * \return the aggregation field of HT-SIG
+         * @return the aggregation field of HT-SIG
          */
         bool GetAggregation() const;
         /**
          * Fill the short guard interval field of HT-SIG.
          *
-         * \param sgi whether short guard interval is used or not
+         * @param sgi whether short guard interval is used or not
          */
         void SetShortGuardInterval(bool sgi);
         /**
          * Return the short guard interval field of HT-SIG.
          *
-         * \return the short guard interval field of HT-SIG
+         * @return the short guard interval field of HT-SIG
          */
         bool GetShortGuardInterval() const;
         /**
          * Fill the HT length field of HT-SIG (in bytes).
          *
-         * \param length the HT length field of HT-SIG (in bytes)
+         * @param length the HT length field of HT-SIG (in bytes)
          */
         void SetHtLength(uint16_t length);
         /**
          * Return the HT length field of HT-SIG (in bytes).
          *
-         * \return the HT length field of HT-SIG (in bytes)
+         * @return the HT length field of HT-SIG (in bytes)
          */
         uint16_t GetHtLength() const;
 
@@ -114,11 +114,11 @@
     /**
      * Create an HT PPDU.
      *
-     * \param psdu the PHY payload (PSDU)
-     * \param txVector the TXVECTOR that was used for this PPDU
-     * \param channel the operating channel of the PHY used to transmit this PPDU
-     * \param ppduDuration the transmission duration of this PPDU
-     * \param uid the unique ID of this PPDU
+     * @param psdu the PHY payload (PSDU)
+     * @param txVector the TXVECTOR that was used for this PPDU
+     * @param channel the operating channel of the PHY used to transmit this PPDU
+     * @param ppduDuration the transmission duration of this PPDU
+     * @param uid the unique ID of this PPDU
      */
     HtPpdu(Ptr<const WifiPsdu> psdu,
            const WifiTxVector& txVector,
@@ -135,26 +135,26 @@
     /**
      * Fill in the PHY headers.
      *
-     * \param txVector the TXVECTOR that was used for this PPDU
-     * \param ppduDuration the transmission duration of this PPDU
-     * \param psduSize the size duration of the PHY payload (PSDU)
+     * @param txVector the TXVECTOR that was used for this PPDU
+     * @param ppduDuration the transmission duration of this PPDU
+     * @param psduSize the size duration of the PHY payload (PSDU)
      */
     void SetPhyHeaders(const WifiTxVector& txVector, Time ppduDuration, std::size_t psduSize);
 
     /**
      * Fill in the L-SIG header.
      *
-     * \param lSig the L-SIG header to fill in
-     * \param ppduDuration the transmission duration of this PPDU
+     * @param lSig the L-SIG header to fill in
+     * @param ppduDuration the transmission duration of this PPDU
      */
     virtual void SetLSigHeader(LSigHeader& lSig, Time ppduDuration) const;
 
     /**
      * Fill in the HT-SIG header.
      *
-     * \param htSig the HT-SIG header to fill in
-     * \param txVector the TXVECTOR that was used for this PPDU
-     * \param psduSize the size duration of the PHY payload (PSDU)
+     * @param htSig the HT-SIG header to fill in
+     * @param txVector the TXVECTOR that was used for this PPDU
+     * @param psduSize the size duration of the PHY payload (PSDU)
      */
     void SetHtSigHeader(HtSigHeader& htSig,
                         const WifiTxVector& txVector,
@@ -163,9 +163,9 @@
     /**
      * Fill in the TXVECTOR from PHY headers.
      *
-     * \param txVector the TXVECTOR to fill in
-     * \param lSig the L-SIG header
-     * \param htSig the HT-SIG header
+     * @param txVector the TXVECTOR to fill in
+     * @param lSig the L-SIG header
+     * @param htSig the HT-SIG header
      */
     void SetTxVectorFromPhyHeaders(WifiTxVector& txVector,
                                    const LSigHeader& lSig,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/interference-helper.cc ns-3.44/src/wifi/model/interference-helper.cc
--- ns-3.43/src/wifi/model/interference-helper.cc	2024-10-09 16:41:10.120656700 -0700
+++ ns-3.44/src/wifi/model/interference-helper.cc	2025-03-09 16:55:49.791372500 -0700
@@ -246,8 +246,8 @@
     auto result = m_niChanges.insert({band, niChanges});
     NS_ASSERT(result.second);
     // Always have a zero power noise event in the list
-    AddNiChangeEvent(Time(0), NiChange(0.0, nullptr), result.first);
-    m_firstPowers.insert({band, 0.0});
+    AddNiChangeEvent(Time(0), NiChange(Watt_u{0}, nullptr), result.first);
+    m_firstPowers.insert({band, Watt_u{0}});
 }
 
 void
@@ -354,8 +354,8 @@
     {
         auto niIt = m_niChanges.find(band);
         NS_ABORT_IF(niIt == m_niChanges.end());
-        Watt_u previousPowerStart = 0;
-        Watt_u previousPowerEnd = 0;
+        Watt_u previousPowerStart{0.0};
+        Watt_u previousPowerEnd{0.0};
         auto previousPowerPosition = GetPreviousPosition(event->GetStartTime(), niIt);
         previousPowerStart = previousPowerPosition->second.GetPower();
         previousPowerEnd = GetPreviousPosition(event->GetEndTime(), niIt)->second.GetPower();
@@ -411,9 +411,9 @@
     // thermal noise at 290K in J/s = W
     static const double BOLTZMANN = 1.3803e-23;
     // Nt is the power of thermal noise in W
-    const auto Nt = BOLTZMANN * 290 * channelWidth * 1e6;
+    const auto Nt = BOLTZMANN * 290 * MHzToHz(channelWidth);
     // receiver noise Floor which accounts for thermal noise and non-idealities of the receiver
-    Watt_u noiseFloor = m_noiseFigure * Nt;
+    Watt_u noiseFloor{m_noiseFigure * Nt};
     Watt_u noise = noiseFloor + noiseInterference;
     auto snr = signal / noise; // linear scale
     NS_LOG_DEBUG("bandwidth=" << channelWidth << "MHz, signal=" << signal << "W, noise="
@@ -448,7 +448,7 @@
     auto it = niIt->second.find(event->GetStartTime());
     const auto muMimoPower = (event->GetPpdu()->GetType() == WIFI_PPDU_TYPE_UL_MU)
                                  ? CalculateMuMimoPowerW(event, band)
-                                 : 0.0;
+                                 : Watt_u{0.0};
     for (; it != niIt->second.end() && it->first < now; ++it)
     {
         if (IsSameMuMimoTransmission(event, it->second.GetEvent()) &&
@@ -462,7 +462,7 @@
         if (std::abs(noiseInterference) < std::numeric_limits<double>::epsilon())
         {
             // fix some possible rounding issues with double values
-            noiseInterference = 0.0;
+            noiseInterference = Watt_u{0.0};
         }
     }
     it = niIt->second.find(event->GetStartTime());
@@ -472,14 +472,14 @@
         ;
     }
     NiChanges ni;
-    ni.emplace(event->GetStartTime(), NiChange(0, event));
+    ni.emplace(event->GetStartTime(), NiChange(Watt_u{0}, event));
     while (++it != niIt->second.end() && it->second.GetEvent() != event)
     {
         ni.insert(*it);
     }
-    ni.emplace(event->GetEndTime(), NiChange(0, event));
+    ni.emplace(event->GetEndTime(), NiChange(Watt_u{0}, event));
     nis.insert({band, ni});
-    NS_ASSERT_MSG(noiseInterference >= 0.0,
+    NS_ASSERT_MSG(noiseInterference >= Watt_u{0.0},
                   "CalculateNoiseInterferenceW returns negative value " << noiseInterference);
     return noiseInterference;
 }
@@ -577,7 +577,7 @@
     const auto& niIt = nis->find(band)->second;
     auto j = niIt.cbegin();
     auto previous = j->first;
-    Watt_u muMimoPower = 0.0;
+    Watt_u muMimoPower{0.0};
     const auto payloadMode = event->GetPpdu()->GetTxVector().GetMode(staId);
     auto phyPayloadStart = j->first;
     if (event->GetPpdu()->GetType() != WIFI_PPDU_TYPE_UL_MU &&
@@ -849,8 +849,8 @@
     return std::all_of(band.frequencies.cbegin(),
                        band.frequencies.cend(),
                        [&freqRange](const auto& freqs) {
-                           return ((freqs.second > (freqRange.minFrequency * 1e6)) &&
-                                   (freqs.first < (freqRange.maxFrequency * 1e6)));
+                           return ((freqs.second > MHzToHz(freqRange.minFrequency)) &&
+                                   (freqs.first < MHzToHz(freqRange.maxFrequency)));
                        });
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/interference-helper.h ns-3.44/src/wifi/model/interference-helper.h
--- ns-3.43/src/wifi/model/interference-helper.h	2024-10-09 16:41:10.120656700 -0700
+++ ns-3.44/src/wifi/model/interference-helper.h	2025-03-09 16:55:49.791372500 -0700
@@ -21,9 +21,9 @@
 class ErrorRateModel;
 
 /**
- * \ingroup wifi
- * \brief handles interference calculations
- * \brief signal event for a PPDU.
+ * @ingroup wifi
+ * @brief handles interference calculations
+ * @brief signal event for a PPDU.
  */
 class Event : public SimpleRefCount<Event>
 {
@@ -32,69 +32,69 @@
      * Create an Event with the given parameters. Note that <i>rxPower</i> will
      * be moved into this object.
      *
-     * \param ppdu the PPDU
-     * \param duration duration of the PPDU
-     * \param rxPower the received power per band (W)
+     * @param ppdu the PPDU
+     * @param duration duration of the PPDU
+     * @param rxPower the received power per band (W)
      */
     Event(Ptr<const WifiPpdu> ppdu, Time duration, RxPowerWattPerChannelBand&& rxPower);
 
     /**
      * Return the PPDU.
      *
-     * \return the PPDU
+     * @return the PPDU
      */
     Ptr<const WifiPpdu> GetPpdu() const;
     /**
      * Return the start time of the signal.
      *
-     * \return the start time of the signal
+     * @return the start time of the signal
      */
     Time GetStartTime() const;
     /**
      * Return the end time of the signal.
      *
-     * \return the end time of the signal
+     * @return the end time of the signal
      */
     Time GetEndTime() const;
     /**
      * Return the duration of the signal.
      *
-     * \return the duration of the signal
+     * @return the duration of the signal
      */
     Time GetDuration() const;
     /**
      * Return the total received power.
      *
-     * \return the total received power
+     * @return the total received power
      */
     Watt_u GetRxPower() const;
     /**
      * Return the received power for a given band.
      *
-     * \param band the band for which the power should be returned
-     * \return the received power for a given band
+     * @param band the band for which the power should be returned
+     * @return the received power for a given band
      */
     Watt_u GetRxPower(const WifiSpectrumBandInfo& band) const;
     /**
      * Return the received power (W) for all bands.
      *
-     * \return the received power (W) for all bands.
+     * @return the received power (W) for all bands.
      */
     const RxPowerWattPerChannelBand& GetRxPowerPerBand() const;
     /**
      * Update the received power (W) for all bands, i.e. add up the received power
      * to the current received power, for each band.
      *
-     * \param rxPower the received power (W) for all bands.
+     * @param rxPower the received power (W) for all bands.
      */
     void UpdateRxPowerW(const RxPowerWattPerChannelBand& rxPower);
     /**
      * Update the PPDU that initially generated the event.
      * This is needed to have the PPDU holding the correct TXVECTOR
-     * upon reception of multiple signals carring the same content
+     * upon reception of multiple signals carrying the same content
      * but over different channel width (typically non-HT duplicates).
      *
-     * \param ppdu the new PPDU to use for this event.
+     * @param ppdu the new PPDU to use for this event.
      */
     void UpdatePpdu(Ptr<const WifiPpdu> ppdu);
 
@@ -106,17 +106,17 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the stream
- * \param event the event
- * \returns a reference to the stream
+ * @param os the stream
+ * @param event the event
+ * @returns a reference to the stream
  */
 std::ostream& operator<<(std::ostream& os, const Event& event);
 
 /**
- * \ingroup wifi
- * \brief handles interference calculations
+ * @ingroup wifi
+ * @brief handles interference calculations
  */
 class InterferenceHelper : public Object
 {
@@ -125,29 +125,29 @@
     ~InterferenceHelper() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
      * Add a frequency band.
      *
-     * \param band the band to be added
+     * @param band the band to be added
      */
     void AddBand(const WifiSpectrumBandInfo& band);
 
     /**
      * Remove a frequency band.
      *
-     * \param band the band to be removed
+     * @param band the band to be removed
      */
     void RemoveBand(const WifiSpectrumBandInfo& band);
 
     /**
      * Check whether bands are already tracked by this interference helper.
      *
-     * \return true if bands are tracked by this interference helper, false otherwise
+     * @return true if bands are tracked by this interference helper, false otherwise
      */
     bool HasBands() const;
 
@@ -155,8 +155,8 @@
      * Update the frequency bands that belongs to a given frequency range when the spectrum model is
      * changed.
      *
-     * \param bands the bands to be added in the new spectrum model
-     * \param freqRange the frequency range the bands belong to
+     * @param bands the bands to be added in the new spectrum model
+     * @param freqRange the frequency range the bands belong to
      */
     void UpdateBands(const std::vector<WifiSpectrumBandInfo>& bands,
                      const FrequencyRange& freqRange);
@@ -164,35 +164,35 @@
     /**
      * Set the noise figure.
      *
-     * \param value noise figure in linear scale
+     * @param value noise figure in linear scale
      */
     void SetNoiseFigure(double value);
     /**
      * Set the error rate model for this interference helper.
      *
-     * \param rate Error rate model
+     * @param rate Error rate model
      */
     void SetErrorRateModel(const Ptr<ErrorRateModel> rate);
 
     /**
      * Return the error rate model.
      *
-     * \return Error rate model
+     * @return Error rate model
      */
     Ptr<ErrorRateModel> GetErrorRateModel() const;
     /**
      * Set the number of RX antennas in the receiver corresponding to this
      * interference helper.
      *
-     * \param rx the number of RX antennas
+     * @param rx the number of RX antennas
      */
     void SetNumberOfReceiveAntennas(uint8_t rx);
 
     /**
-     * \param energy the minimum energy requested
-     * \param band identify the requested band
+     * @param energy the minimum energy requested
+     * @param band identify the requested band
      *
-     * \returns the expected amount of time the observed
+     * @returns the expected amount of time the observed
      *          energy on the medium for a given band will
      *          be higher than the requested threshold.
      */
@@ -201,14 +201,14 @@
     /**
      * Add the PPDU-related signal to interference helper.
      *
-     * \param ppdu the PPDU
-     * \param duration the PPDU duration
-     * \param rxPower received power per band (W)
-     * \param freqRange the frequency range in which the received signal is detected
-     * \param isStartHePortionRxing flag whether the event corresponds to the start of the HE
+     * @param ppdu the PPDU
+     * @param duration the PPDU duration
+     * @param rxPower received power per band (W)
+     * @param freqRange the frequency range in which the received signal is detected
+     * @param isStartHePortionRxing flag whether the event corresponds to the start of the HE
      * portion reception (only used for MU)
      *
-     * \return Event
+     * @return Event
      */
     Ptr<Event> Add(Ptr<const WifiPpdu> ppdu,
                    Time duration,
@@ -218,9 +218,9 @@
 
     /**
      * Add a non-Wifi signal to interference helper.
-     * \param duration the duration of the signal
-     * \param rxPower received power per band (W)
-     * \param freqRange the frequency range in which the received signal is detected
+     * @param duration the duration of the signal
+     * @param rxPower received power per band (W)
+     * @param freqRange the frequency range in which the received signal is detected
      */
     void AddForeignSignal(Time duration,
                           RxPowerWattPerChannelBand& rxPower,
@@ -232,14 +232,14 @@
      * reception success/failure evaluation, while hiding aggregation details from
      * this class.
      *
-     * \param event the event corresponding to the first time the corresponding PPDU arrives
-     * \param channelWidth the channel width used to transmit the PSDU
-     * \param band identify the band used by the PSDU
-     * \param staId the station ID of the PSDU (only used for MU)
-     * \param relativeMpduStartStop the time window (pair of start and end times) of PHY payload to
+     * @param event the event corresponding to the first time the corresponding PPDU arrives
+     * @param channelWidth the channel width used to transmit the PSDU
+     * @param band identify the band used by the PSDU
+     * @param staId the station ID of the PSDU (only used for MU)
+     * @param relativeMpduStartStop the time window (pair of start and end times) of PHY payload to
      * focus on
      *
-     * \return struct of SNR and PER (with PER being evaluated over the provided time window)
+     * @return struct of SNR and PER (with PER being evaluated over the provided time window)
      */
     PhyEntity::SnrPer CalculatePayloadSnrPer(Ptr<Event> event,
                                              MHz_u channelWidth,
@@ -249,12 +249,12 @@
     /**
      * Calculate the SNIR for the event (starting from now until the event end).
      *
-     * \param event the event corresponding to the first time the corresponding PPDU arrives
-     * \param channelWidth the channel width
-     * \param nss the number of spatial streams
-     * \param band identify the band used by the PSDU
+     * @param event the event corresponding to the first time the corresponding PPDU arrives
+     * @param channelWidth the channel width
+     * @param nss the number of spatial streams
+     * @param band identify the band used by the PSDU
      *
-     * \return the SNR for the PPDU in linear scale
+     * @return the SNR for the PPDU in linear scale
      */
     double CalculateSnr(Ptr<Event> event,
                         MHz_u channelWidth,
@@ -264,12 +264,12 @@
      * Calculate the SNIR at the start of the PHY header and accumulate
      * all SNIR changes in the SNIR vector.
      *
-     * \param event the event corresponding to the first time the corresponding PPDU arrives
-     * \param channelWidth the channel width for header measurement
-     * \param band identify the band used by the PSDU
-     * \param header the PHY header to consider
+     * @param event the event corresponding to the first time the corresponding PPDU arrives
+     * @param channelWidth the channel width for header measurement
+     * @param band identify the band used by the PSDU
+     * @param header the PHY header to consider
      *
-     * \return struct of SNR and PER
+     * @return struct of SNR and PER
      */
     PhyEntity::SnrPer CalculatePhyHeaderSnrPer(Ptr<Event> event,
                                                MHz_u channelWidth,
@@ -278,22 +278,22 @@
 
     /**
      * Notify that RX has started.
-     * \param freqRange the frequency range in which the received signal event is detected
+     * @param freqRange the frequency range in which the received signal event is detected
      */
     void NotifyRxStart(const FrequencyRange& freqRange);
     /**
      * Notify that RX has ended.
      *
-     * \param endTime the end time of the signal
-     * \param freqRange the frequency range in which the received signal event was detected
+     * @param endTime the end time of the signal
+     * @param freqRange the frequency range in which the received signal event was detected
      */
     void NotifyRxEnd(Time endTime, const FrequencyRange& freqRange);
 
     /**
      * Update event to scale its received power (W) per band.
      *
-     * \param event the event to be updated
-     * \param rxPower the received power (W) per band to be added to the current event
+     * @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, const RxPowerWattPerChannelBand& rxPower);
 
@@ -303,12 +303,12 @@
     /**
      * Calculate SNR (linear ratio) from the given signal power and noise+interference power.
      *
-     * \param signal signal power
-     * \param noiseInterference noise and interference power
-     * \param channelWidth signal width
-     * \param nss the number of spatial streams
+     * @param signal signal power
+     * @param noiseInterference noise and interference power
+     * @param channelWidth signal width
+     * @param nss the number of spatial streams
      *
-     * \return SNR in linear scale
+     * @return SNR in linear scale
      */
     double CalculateSnr(Watt_u signal,
                         Watt_u noiseInterference,
@@ -318,13 +318,13 @@
      * Calculate the success rate of the chunk given the SINR, duration, and TXVECTOR.
      * The duration and TXVECTOR are used to calculate how many bits are present in the chunk.
      *
-     * \param snir the SINR
-     * \param duration the duration of the chunk
-     * \param mode the WifiMode
-     * \param txVector the TXVECTOR
-     * \param field the PPDU field to which the chunk belongs to
+     * @param snir the SINR
+     * @param duration the duration of the chunk
+     * @param mode the WifiMode
+     * @param txVector the TXVECTOR
+     * @param field the PPDU field to which the chunk belongs to
      *
-     * \return the success rate
+     * @return the success rate
      */
     double CalculateChunkSuccessRate(double snir,
                                      Time duration,
@@ -336,12 +336,12 @@
      * The duration and TXVECTOR are used to calculate how many bits are present in the payload
      * chunk.
      *
-     * \param snir the SINR
-     * \param duration the duration of the chunk
-     * \param txVector the TXVECTOR
-     * \param staId the station ID of the PSDU (only used for MU)
+     * @param snir the SINR
+     * @param duration the duration of the chunk
+     * @param txVector the TXVECTOR
+     * @param staId the station ID of the PSDU (only used for MU)
      *
-     * \return the success rate
+     * @return the success rate
      */
     double CalculatePayloadChunkSuccessRate(double snir,
                                             Time duration,
@@ -361,27 +361,27 @@
         /**
          * Create a NiChange at the given time and the amount of NI change.
          *
-         * \param power the power
-         * \param event causes this NI change
+         * @param power the power
+         * @param event causes this NI change
          */
         NiChange(Watt_u power, Ptr<Event> event);
         ~NiChange();
         /**
          * Return the power
          *
-         * \return the power
+         * @return the power
          */
         Watt_u GetPower() const;
         /**
          * Add a given amount of power.
          *
-         * \param power the power to be added to the existing value
+         * @param power the power to be added to the existing value
          */
         void AddPower(Watt_u power);
         /**
          * Return the event causes the corresponding NI change
          *
-         * \return the event
+         * @return the event
          */
         Ptr<Event> GetEvent() const;
 
@@ -411,17 +411,17 @@
     /**
      * Check whether a given band is tracked by this interference helper.
      *
-     * \param band the band to be checked
-     * \return true if the band is already tracked by this interference helper, false otherwise
+     * @param band the band to be checked
+     * @return true if the band is already tracked by this interference helper, false otherwise
      */
     bool HasBand(const WifiSpectrumBandInfo& band) const;
 
     /**
      * Check whether a given band belongs to a given frequency range.
      *
-     * \param band the band to be checked
-     * \param freqRange the frequency range to check whether the band belong to
-     * \return true if the band belongs to the frequency range, false otherwise
+     * @param band the band to be checked
+     * @param freqRange the frequency range to check whether the band belong to
+     * @return true if the band belongs to the frequency range, false otherwise
      */
     bool IsBandInFrequencyRange(const WifiSpectrumBandInfo& band,
                                 const FrequencyRange& freqRange) const;
@@ -429,9 +429,9 @@
     /**
      * Append the given Event.
      *
-     * \param event the event to be appended
-     * \param freqRange the frequency range in which the received signal event is detected
-     * \param isStartHePortionRxing flag whether event corresponds to the start of the HE portion
+     * @param event the event to be appended
+     * @param freqRange the frequency range in which the received signal event is detected
+     * @param isStartHePortionRxing flag whether event corresponds to the start of the HE portion
      * reception (only used for MU)
      */
     void AppendEvent(Ptr<Event> event, const FrequencyRange& freqRange, bool isStartHePortionRxing);
@@ -439,11 +439,11 @@
     /**
      * Calculate noise and interference power.
      *
-     * \param event the event
-     * \param nis the NiChanges
-     * \param band the band
+     * @param event the event
+     * @param nis the NiChanges
+     * @param band the band
      *
-     * \return noise and interference power
+     * @return noise and interference power
      */
     Watt_u CalculateNoiseInterferenceW(Ptr<Event> event,
                                        NiChangesPerBand& nis,
@@ -453,10 +453,10 @@
      * Calculate power of all other events preceding a given event that belong to the same MU-MIMO
      * transmission.
      *
-     * \param event the event
-     * \param band the band
+     * @param event the event
+     * @param band the band
      *
-     * \return the power of all other events preceding the event that belong to the same MU-MIMO
+     * @return the power of all other events preceding the event that belong to the same MU-MIMO
      * transmission
      */
     Watt_u CalculateMuMimoPowerW(Ptr<const Event> event, const WifiSpectrumBandInfo& band) const;
@@ -466,14 +466,14 @@
      * window (thus enabling per MPDU PER information). The PHY payload can be divided into
      * multiple chunks (e.g. due to interference from other transmissions).
      *
-     * \param event the event
-     * \param channelWidth the channel width used to transmit the PSDU
-     * \param nis the NiChanges
-     * \param band identify the band used by the PSDU
-     * \param staId the station ID of the PSDU (only used for MU)
-     * \param window time window (pair of start and end times) of PHY payload to focus on
+     * @param event the event
+     * @param channelWidth the channel width used to transmit the PSDU
+     * @param nis the NiChanges
+     * @param band identify the band used by the PSDU
+     * @param staId the station ID of the PSDU (only used for MU)
+     * @param window time window (pair of start and end times) of PHY payload to focus on
      *
-     * \return the error rate of the payload
+     * @return the error rate of the payload
      */
     double CalculatePayloadPer(Ptr<const Event> event,
                                MHz_u channelWidth,
@@ -485,13 +485,13 @@
      * Calculate the error rate of the PHY header. The PHY header
      * can be divided into multiple chunks (e.g. due to interference from other transmissions).
      *
-     * \param event the event
-     * \param nis the NiChanges
-     * \param channelWidth the channel width for header measurement
-     * \param band the band
-     * \param header the PHY header to consider
+     * @param event the event
+     * @param nis the NiChanges
+     * @param channelWidth the channel width for header measurement
+     * @param band the band
+     * @param header the PHY header to consider
      *
-     * \return the error rate of the HT PHY header
+     * @return the error rate of the HT PHY header
      */
     double CalculatePhyHeaderPer(Ptr<const Event> event,
                                  NiChangesPerBand* nis,
@@ -501,13 +501,13 @@
     /**
      * Calculate the success rate of the PHY header sections for the provided event.
      *
-     * \param event the event
-     * \param nis the NiChanges
-     * \param channelWidth the channel width for header measurement
-     * \param band the band
-     * \param phyHeaderSections the map of PHY header sections (\see PhyEntity::PhyHeaderSections)
+     * @param event the event
+     * @param nis the NiChanges
+     * @param channelWidth the channel width for header measurement
+     * @param band the band
+     * @param phyHeaderSections the map of PHY header sections (\see PhyEntity::PhyHeaderSections)
      *
-     * \return the success rate of the PHY header sections
+     * @return the success rate of the PHY header sections
      */
     double CalculatePhyHeaderSectionPsr(Ptr<const Event> event,
                                         NiChangesPerBand* nis,
@@ -523,17 +523,17 @@
     /**
      * Returns an iterator to the first NiChange that is later than moment
      *
-     * \param moment time to check from
-     * \param niIt iterator of the band to check
-     * \returns an iterator to the list of NiChanges
+     * @param moment time to check from
+     * @param niIt iterator of the band to check
+     * @returns an iterator to the list of NiChanges
      */
     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 niIt iterator of the band to check
-     * \returns an iterator to the list of NiChanges
+     * @param moment time to check from
+     * @param niIt iterator of the band to check
+     * @returns an iterator to the list of NiChanges
      */
     NiChanges::iterator GetPreviousPosition(Time moment, NiChangesPerBand::iterator niIt);
 
@@ -541,10 +541,10 @@
      * Add NiChange to the list at the appropriate position and
      * return the iterator of the new event.
      *
-     * \param moment time to check from
-     * \param change the NiChange to add
-     * \param niIt iterator of the band to check
-     * \returns the iterator of the new event
+     * @param moment time to check from
+     * @param change the NiChange to add
+     * @param niIt iterator of the band to check
+     * @returns the iterator of the new event
      */
     NiChanges::iterator AddNiChangeEvent(Time moment,
                                          NiChange change,
@@ -554,10 +554,10 @@
      * Return whether another event is a MU-MIMO event that belongs to the same transmission and to
      * the same RU.
      *
-     * \param currentEvent the current event that is being inspected
-     * \param otherEvent the other event to compare against
+     * @param currentEvent the current event that is being inspected
+     * @param otherEvent the other event to compare against
      *
-     * \return whether both events belong to the same transmission and to the same RU
+     * @return whether both events belong to the same transmission and to the same RU
      */
     bool IsSameMuMimoTransmission(Ptr<const Event> currentEvent, Ptr<const Event> otherEvent) const;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/mac-rx-middle.cc ns-3.44/src/wifi/model/mac-rx-middle.cc
--- ns-3.43/src/wifi/model/mac-rx-middle.cc	2024-10-09 16:41:10.120656700 -0700
+++ ns-3.44/src/wifi/model/mac-rx-middle.cc	2025-03-09 16:55:49.791372500 -0700
@@ -50,7 +50,7 @@
     /**
      * Check if we are de-fragmenting packets.
      *
-     * \return true if we are de-fragmenting packets,
+     * @return true if we are de-fragmenting packets,
      *         false otherwise
      */
     bool IsDeFragmenting() const
@@ -62,7 +62,7 @@
      * We have received a first fragmented packet.
      * We start the deframentation by saving the first fragment.
      *
-     * \param packet the first fragmented packet
+     * @param packet the first fragmented packet
      */
     void AccumulateFirstFragment(Ptr<const Packet> packet)
     {
@@ -77,9 +77,9 @@
      * We re-construct the packet from the fragments we saved
      * and return the full packet.
      *
-     * \param packet the last fragment
+     * @param packet the last fragment
      *
-     * \return the fully reconstructed packet
+     * @return the fully reconstructed packet
      */
     Ptr<Packet> AccumulateLastFragment(Ptr<const Packet> packet)
     {
@@ -99,7 +99,7 @@
      * We received a fragmented packet (not first and not last).
      * We simply save it into our internal list.
      *
-     * \param packet the received fragment
+     * @param packet the received fragment
      */
     void AccumulateFragment(Ptr<const Packet> packet)
     {
@@ -111,9 +111,9 @@
      * Check if the sequence control (i.e. fragment number) is
      * in order.
      *
-     * \param sequenceControl the raw sequence control
+     * @param sequenceControl the raw sequence control
      *
-     * \return true if the sequence control is in order,
+     * @return true if the sequence control is in order,
      *         false otherwise
      */
     bool IsNextFragment(uint16_t sequenceControl) const
@@ -125,7 +125,7 @@
     /**
      * Return the last sequence control we received.
      *
-     * \return the last sequence control
+     * @return the last sequence control
      */
     uint16_t GetLastSequenceControl() const
     {
@@ -135,7 +135,7 @@
     /**
      * Set the last sequence control we received.
      *
-     * \param sequenceControl the last sequence control we received
+     * @param sequenceControl the last sequence control we received
      */
     void SetSequenceControl(uint16_t sequenceControl)
     {
@@ -161,17 +161,28 @@
 }
 
 OriginatorRxStatus&
-MacRxMiddle::Lookup(const WifiMacHeader& hdr)
+MacRxMiddle::Lookup(Ptr<const WifiMpdu> mpdu)
 {
-    NS_LOG_FUNCTION(hdr);
+    NS_LOG_FUNCTION(*mpdu);
+    const auto& hdr = mpdu->GetOriginal()->GetHeader();
     const auto source = hdr.GetAddr2();
-    if (hdr.IsQosData() && !source.IsGroup())
+    const auto dest = hdr.GetAddr1();
+    if (hdr.IsQosData() && !dest.IsGroup())
     {
-        /* only for QoS data non-broadcast frames */
+        /* only for QoS data unicast frames */
         const auto key = std::make_pair(source, hdr.GetQosTid());
         auto [it, inserted] = m_qosOriginatorStatus.try_emplace(key);
         return it->second;
     }
+    else if (hdr.IsQosData() && dest.IsGroup())
+    {
+        /* for QoS data groupcast frames: use the (nonconcealed) group address as key */
+        const auto groupAddress =
+            hdr.IsQosAmsdu() ? mpdu->begin()->second.GetDestinationAddr() : hdr.GetAddr1();
+        const auto key = std::make_pair(groupAddress, hdr.GetQosTid());
+        auto [it, inserted] = m_qosOriginatorStatus.insert({key, {}});
+        return it->second;
+    }
     /* - management frames
      * - QoS data broadcast frames
      * - non-QoS data frames
@@ -256,7 +267,7 @@
     const auto& hdr = mpdu->GetOriginal()->GetHeader();
     NS_ASSERT(hdr.IsData() || hdr.IsMgt());
 
-    auto& originator = Lookup(hdr);
+    auto& originator = Lookup(mpdu);
     /**
      * The check below is really unneeded because it can fail in a lot of
      * normal cases. Specifically, it is possible for sequence numbers to
@@ -287,10 +298,7 @@
     }
     NS_LOG_DEBUG("forwarding data from=" << hdr.GetAddr2() << ", seq=" << hdr.GetSequenceNumber()
                                          << ", frag=" << +hdr.GetFragmentNumber());
-    if (!hdr.GetAddr1().IsGroup())
-    {
-        originator.SetSequenceControl(hdr.GetSequenceControl());
-    }
+    originator.SetSequenceControl(hdr.GetSequenceControl());
     if (aggregate == mpdu->GetPacket())
     {
         m_callback(mpdu, linkId);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/mac-rx-middle.h ns-3.44/src/wifi/model/mac-rx-middle.h
--- ns-3.43/src/wifi/model/mac-rx-middle.h	2024-10-09 16:41:10.120656700 -0700
+++ ns-3.44/src/wifi/model/mac-rx-middle.h	2025-03-09 16:55:49.791372500 -0700
@@ -24,7 +24,7 @@
 class WifiMpdu;
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * This class handles duplicate detection and recomposition of fragments.
  */
@@ -42,15 +42,15 @@
     /**
      * Set a callback to forward the packet up.
      *
-     * \param callback the callback to set
+     * @param callback the callback to set
      */
     void SetForwardCallback(ForwardUpCallback callback);
 
     /**
      * Receive an MPDU on the given link.
      *
-     * \param mpdu the MPDU
-     * \param linkId the ID of the given link
+     * @param mpdu the MPDU
+     * @param linkId the ID of the given link
      */
     void Receive(Ptr<const WifiMpdu> mpdu, uint8_t linkId);
 
@@ -59,22 +59,23 @@
     friend class MacRxMiddleTest;
     /**
      * Look up for OriginatorRxStatus associated with the sender address
-     * (by looking at ADDR2 field in the header).
+     * (by looking at ADDR2 field in the header) for unicast. For groupcast,
+     * the (nonconcealed) group address is used instead.
      * The method creates a new OriginatorRxStatus if one is not already presented.
      *
-     * \param hdr the MAC header
+     * @param mpdu the received MPDU
      *
-     * \return OriginatorRxStatus
+     * @return OriginatorRxStatus
      */
-    OriginatorRxStatus& Lookup(const WifiMacHeader& hdr);
+    OriginatorRxStatus& Lookup(Ptr<const WifiMpdu> mpdu);
     /**
      * Check if we have already received the packet from the sender before
      * (by looking at the sequence control field).
      *
-     * \param hdr the MAC header
-     * \param originator the packet originator status
+     * @param hdr the MAC header
+     * @param originator the packet originator status
      *
-     * \return true if we already received the packet previously,
+     * @return true if we already received the packet previously,
      *         false otherwise
      */
     bool IsDuplicate(const WifiMacHeader& hdr, const OriginatorRxStatus& originator) const;
@@ -86,11 +87,11 @@
      * If the packet is the last fragment, the method tries to re-construct the full packet
      * and return the packet if success.
      *
-     * \param packet the packet
-     * \param hdr the MAC header
-     * \param originator the packet originator status
+     * @param packet the packet
+     * @param hdr the MAC header
+     * @param originator the packet originator status
      *
-     * \return a packet if the packet is successfully reassembled (or not a fragment),
+     * @return a packet if the packet is successfully reassembled (or not a fragment),
      *         0 if we failed to reassemble the packet (e.g. missing fragments/out-of-order).
      */
     Ptr<const Packet> HandleFragments(Ptr<const Packet> packet,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/mac-tx-middle.cc ns-3.44/src/wifi/model/mac-tx-middle.cc
--- ns-3.43/src/wifi/model/mac-tx-middle.cc	2024-10-09 16:41:10.120656700 -0700
+++ ns-3.44/src/wifi/model/mac-tx-middle.cc	2025-03-09 16:55:49.791372500 -0700
@@ -40,7 +40,7 @@
 {
     NS_LOG_FUNCTION(this);
     uint16_t retval;
-    if (hdr->IsQosData() && !hdr->GetAddr1().IsGroup())
+    if (hdr->IsQosData() && !hdr->GetAddr1().IsBroadcast())
     {
         uint8_t tid = hdr->GetQosTid();
         NS_ASSERT(tid < 16);
@@ -78,7 +78,7 @@
 {
     NS_LOG_FUNCTION(this);
     uint16_t retval;
-    if (hdr->IsQosData() && !hdr->GetAddr1().IsGroup())
+    if (hdr->IsQosData() && !hdr->GetAddr1().IsBroadcast())
     {
         uint8_t tid = hdr->GetQosTid();
         NS_ASSERT(tid < 16);
@@ -118,7 +118,7 @@
 {
     NS_LOG_FUNCTION(this << *hdr);
 
-    if (hdr->IsQosData() && !hdr->GetAddr1().IsGroup())
+    if (hdr->IsQosData() && !hdr->GetAddr1().IsBroadcast())
     {
         uint8_t tid = hdr->GetQosTid();
         NS_ASSERT(tid < 16);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/mac-tx-middle.h ns-3.44/src/wifi/model/mac-tx-middle.h
--- ns-3.43/src/wifi/model/mac-tx-middle.h	2024-10-09 16:41:10.120656700 -0700
+++ ns-3.44/src/wifi/model/mac-tx-middle.h	2025-03-09 16:55:49.791372500 -0700
@@ -22,7 +22,7 @@
 class Mac48Address;
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * Handles sequence numbering of IEEE 802.11 data frames
  */
@@ -35,8 +35,8 @@
     /**
      * Return the next sequence number for the given header.
      *
-     * \param hdr Wi-Fi header
-     * \return the next sequence number
+     * @param hdr Wi-Fi header
+     * @return the next sequence number
      */
     uint16_t GetNextSequenceNumberFor(const WifiMacHeader* hdr);
     /**
@@ -44,23 +44,23 @@
      * the current sequence number remains unchanged). This functions is used for A-MPDU
      * aggregation.
      *
-     * \param hdr Wi-Fi header
-     * \return the next sequence number
+     * @param hdr Wi-Fi header
+     * @return the next sequence number
      */
     uint16_t PeekNextSequenceNumberFor(const WifiMacHeader* hdr);
     /**
      * Return the next sequence number for the Traffic ID and destination.
      *
-     * \param tid Traffic ID
-     * \param addr destination address
-     * \return the next sequence number
+     * @param tid Traffic ID
+     * @param addr destination address
+     * @return the next sequence number
      */
     uint16_t GetNextSeqNumberByTidAndAddress(uint8_t tid, Mac48Address addr) const;
     /**
      * Set the sequence number of the given MAC header as the next sequence
      * number for the Traffic ID and destination of the given MAC header.
      *
-     * \param hdr the given MAC header
+     * @param hdr the given MAC header
      */
     void SetSequenceNumberFor(const WifiMacHeader* hdr);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/mgt-action-headers.cc ns-3.44/src/wifi/model/mgt-action-headers.cc
--- ns-3.43/src/wifi/model/mgt-action-headers.cc	2024-10-09 16:41:10.120656700 -0700
+++ ns-3.44/src/wifi/model/mgt-action-headers.cc	2025-03-09 16:55:49.795372700 -0700
@@ -11,6 +11,7 @@
 #include "mgt-action-headers.h"
 
 #include "addba-extension.h"
+#include "gcr-group-address.h"
 
 #include "ns3/multi-link-element.h"
 #include "ns3/packet.h"
@@ -739,6 +740,13 @@
 void
 MgtAddBaRequestHeader::Print(std::ostream& os) const
 {
+    os << "A-MSDU support=" << m_amsduSupport << " Policy=" << +m_policy << " TID=" << +m_tid
+       << " Buffer size=" << m_bufferSize << " Timeout=" << m_timeoutValue
+       << " Starting seq=" << m_startingSeq;
+    if (m_gcrGroupAddress.has_value())
+    {
+        os << " GCR group address=" << m_gcrGroupAddress.value();
+    }
 }
 
 uint32_t
@@ -749,6 +757,11 @@
     size += 2; // Block ack parameter set
     size += 2; // Block ack timeout value
     size += 2; // Starting sequence control
+    if (m_gcrGroupAddress)
+    {
+        // a GCR Group Address element has to be added
+        size += GcrGroupAddress().GetSerializedSize();
+    }
     if (m_bufferSize >= 1024)
     {
         // an ADDBA Extension element has to be added
@@ -765,6 +778,12 @@
     i.WriteHtolsbU16(GetParameterSet());
     i.WriteHtolsbU16(m_timeoutValue);
     i.WriteHtolsbU16(GetStartingSequenceControl());
+    if (m_gcrGroupAddress)
+    {
+        GcrGroupAddress gcrGroupAddr;
+        gcrGroupAddr.m_gcrGroupAddress = *m_gcrGroupAddress;
+        i = gcrGroupAddr.Serialize(i);
+    }
     if (m_bufferSize >= 1024)
     {
         AddbaExtension addbaExt;
@@ -781,8 +800,16 @@
     SetParameterSet(i.ReadLsbtohU16());
     m_timeoutValue = i.ReadLsbtohU16();
     SetStartingSequenceControl(i.ReadLsbtohU16());
-    AddbaExtension addbaExt;
+    m_gcrGroupAddress.reset();
+    GcrGroupAddress gcrGroupAddr;
     auto tmp = i;
+    i = gcrGroupAddr.DeserializeIfPresent(i);
+    if (i.GetDistanceFrom(tmp) != 0)
+    {
+        m_gcrGroupAddress = gcrGroupAddr.m_gcrGroupAddress;
+    }
+    AddbaExtension addbaExt;
+    tmp = i;
     i = addbaExt.DeserializeIfPresent(i);
     if (i.GetDistanceFrom(tmp) != 0)
     {
@@ -842,6 +869,12 @@
     m_amsduSupport = supported;
 }
 
+void
+MgtAddBaRequestHeader::SetGcrGroupAddress(const Mac48Address& address)
+{
+    m_gcrGroupAddress = address;
+}
+
 uint8_t
 MgtAddBaRequestHeader::GetTid() const
 {
@@ -869,7 +902,7 @@
 bool
 MgtAddBaRequestHeader::IsAmsduSupported() const
 {
-    return m_amsduSupport == 1;
+    return m_amsduSupport;
 }
 
 uint16_t
@@ -884,11 +917,16 @@
     return (m_startingSeq << 4) & 0xfff0;
 }
 
+std::optional<Mac48Address>
+MgtAddBaRequestHeader::GetGcrGroupAddress() const
+{
+    return m_gcrGroupAddress;
+}
+
 uint16_t
 MgtAddBaRequestHeader::GetParameterSet() const
 {
-    uint16_t res = 0;
-    res |= m_amsduSupport;
+    uint16_t res = m_amsduSupport ? 1 : 0;
     res |= m_policy << 1;
     res |= m_tid << 2;
     res |= (m_bufferSize % 1024) << 6;
@@ -898,7 +936,7 @@
 void
 MgtAddBaRequestHeader::SetParameterSet(uint16_t params)
 {
-    m_amsduSupport = params & 0x01;
+    m_amsduSupport = ((params & 0x01) == 1);
     m_policy = (params >> 1) & 0x01;
     m_tid = (params >> 2) & 0x0f;
     m_bufferSize = (params >> 6) & 0x03ff;
@@ -929,7 +967,12 @@
 void
 MgtAddBaResponseHeader::Print(std::ostream& os) const
 {
-    os << "status code=" << m_code;
+    os << "Status code=" << m_code << "A-MSDU support=" << m_amsduSupport << " Policy=" << +m_policy
+       << " TID=" << +m_tid << " Buffer size=" << m_bufferSize << " Timeout=" << m_timeoutValue;
+    if (m_gcrGroupAddress.has_value())
+    {
+        os << " GCR group address=" << m_gcrGroupAddress.value();
+    }
 }
 
 uint32_t
@@ -940,6 +983,11 @@
     size += m_code.GetSerializedSize(); // Status code
     size += 2;                          // Block ack parameter set
     size += 2;                          // Block ack timeout value
+    if (m_gcrGroupAddress)
+    {
+        // a GCR Group Address element has to be added
+        size += GcrGroupAddress().GetSerializedSize();
+    }
     if (m_bufferSize >= 1024)
     {
         // an ADDBA Extension element has to be added
@@ -956,6 +1004,12 @@
     i = m_code.Serialize(i);
     i.WriteHtolsbU16(GetParameterSet());
     i.WriteHtolsbU16(m_timeoutValue);
+    if (m_gcrGroupAddress)
+    {
+        GcrGroupAddress gcrGroupAddr;
+        gcrGroupAddr.m_gcrGroupAddress = *m_gcrGroupAddress;
+        i = gcrGroupAddr.Serialize(i);
+    }
     if (m_bufferSize >= 1024)
     {
         AddbaExtension addbaExt;
@@ -972,8 +1026,16 @@
     i = m_code.Deserialize(i);
     SetParameterSet(i.ReadLsbtohU16());
     m_timeoutValue = i.ReadLsbtohU16();
-    AddbaExtension addbaExt;
+    m_gcrGroupAddress.reset();
+    GcrGroupAddress gcrGroupAddr;
     auto tmp = i;
+    i = gcrGroupAddr.DeserializeIfPresent(i);
+    if (i.GetDistanceFrom(tmp) != 0)
+    {
+        m_gcrGroupAddress = gcrGroupAddr.m_gcrGroupAddress;
+    }
+    AddbaExtension addbaExt;
+    tmp = i;
     i = addbaExt.DeserializeIfPresent(i);
     if (i.GetDistanceFrom(tmp) != 0)
     {
@@ -1027,6 +1089,12 @@
     m_amsduSupport = supported;
 }
 
+void
+MgtAddBaResponseHeader::SetGcrGroupAddress(const Mac48Address& address)
+{
+    m_gcrGroupAddress = address;
+}
+
 StatusCode
 MgtAddBaResponseHeader::GetStatusCode() const
 {
@@ -1060,14 +1128,19 @@
 bool
 MgtAddBaResponseHeader::IsAmsduSupported() const
 {
-    return m_amsduSupport == 1;
+    return m_amsduSupport;
+}
+
+std::optional<Mac48Address>
+MgtAddBaResponseHeader::GetGcrGroupAddress() const
+{
+    return m_gcrGroupAddress;
 }
 
 uint16_t
 MgtAddBaResponseHeader::GetParameterSet() const
 {
-    uint16_t res = 0;
-    res |= m_amsduSupport;
+    uint16_t res = m_amsduSupport ? 1 : 0;
     res |= m_policy << 1;
     res |= m_tid << 2;
     res |= (m_bufferSize % 1024) << 6;
@@ -1077,7 +1150,7 @@
 void
 MgtAddBaResponseHeader::SetParameterSet(uint16_t params)
 {
-    m_amsduSupport = params & 0x01;
+    m_amsduSupport = ((params & 0x01) == 1);
     m_policy = (params >> 1) & 0x01;
     m_tid = (params >> 2) & 0x0f;
     m_bufferSize = (params >> 6) & 0x03ff;
@@ -1108,6 +1181,11 @@
 void
 MgtDelBaHeader::Print(std::ostream& os) const
 {
+    os << "Initiator=" << m_initiator << " TID=" << +m_tid;
+    if (m_gcrGroupAddress.has_value())
+    {
+        os << " GCR group address=" << m_gcrGroupAddress.value();
+    }
 }
 
 uint32_t
@@ -1116,6 +1194,11 @@
     uint32_t size = 0;
     size += 2; // DelBa parameter set
     size += 2; // Reason code
+    if (m_gcrGroupAddress)
+    {
+        // a GCR Group Address element has to be added
+        size += GcrGroupAddress().GetSerializedSize();
+    }
     return size;
 }
 
@@ -1125,6 +1208,12 @@
     Buffer::Iterator i = start;
     i.WriteHtolsbU16(GetParameterSet());
     i.WriteHtolsbU16(m_reasonCode);
+    if (m_gcrGroupAddress)
+    {
+        GcrGroupAddress gcrGroupAddr;
+        gcrGroupAddr.m_gcrGroupAddress = *m_gcrGroupAddress;
+        i = gcrGroupAddr.Serialize(i);
+    }
 }
 
 uint32_t
@@ -1133,6 +1222,14 @@
     Buffer::Iterator i = start;
     SetParameterSet(i.ReadLsbtohU16());
     m_reasonCode = i.ReadLsbtohU16();
+    m_gcrGroupAddress.reset();
+    GcrGroupAddress gcrGroupAddr;
+    auto tmp = i;
+    i = gcrGroupAddr.DeserializeIfPresent(i);
+    if (i.GetDistanceFrom(tmp) != 0)
+    {
+        m_gcrGroupAddress = gcrGroupAddr.m_gcrGroupAddress;
+    }
     return i.GetDistanceFrom(start);
 }
 
@@ -1169,6 +1266,18 @@
     m_tid = static_cast<uint16_t>(tid);
 }
 
+void
+MgtDelBaHeader::SetGcrGroupAddress(const Mac48Address& address)
+{
+    m_gcrGroupAddress = address;
+}
+
+std::optional<Mac48Address>
+MgtDelBaHeader::GetGcrGroupAddress() const
+{
+    return m_gcrGroupAddress;
+}
+
 uint16_t
 MgtDelBaHeader::GetParameterSet() const
 {
@@ -1654,11 +1763,11 @@
 void
 FilsDiscHeader::FdCapability::SetOpChannelWidth(MHz_u width)
 {
-    m_chWidth = (width == 20 || width == 22) ? 0
-                : (width == 40)              ? 1
-                : (width == 80)              ? 2
-                : (width == 160)             ? 3
-                                             : 4;
+    m_chWidth = (width == MHz_u{20} || width == MHz_u{22}) ? 0
+                : (width == MHz_u{40})                     ? 1
+                : (width == MHz_u{80})                     ? 2
+                : (width == MHz_u{160})                    ? 3
+                                                           : 4;
 }
 
 MHz_u
@@ -1667,17 +1776,17 @@
     switch (m_chWidth)
     {
     case 0:
-        return m_phyIdx == 0 ? 22 : 20; // PHY Index 0 indicates 802.11b
+        return m_phyIdx == 0 ? MHz_u{22} : MHz_u{20}; // PHY Index 0 indicates 802.11b
     case 1:
-        return 40;
+        return MHz_u{40};
     case 2:
-        return 80;
+        return MHz_u{80};
     case 3:
-        return 160;
+        return MHz_u{160};
     default:
         NS_ABORT_MSG("Reserved value: " << +m_chWidth);
     }
-    return 0;
+    return MHz_u{0};
 }
 
 void
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/mgt-action-headers.h ns-3.44/src/wifi/model/mgt-action-headers.h
--- ns-3.43/src/wifi/model/mgt-action-headers.h	2024-10-09 16:41:10.120656700 -0700
+++ ns-3.44/src/wifi/model/mgt-action-headers.h	2025-03-09 16:55:49.795372700 -0700
@@ -18,6 +18,7 @@
 #include "wifi-standards.h"
 
 #include "ns3/header.h"
+#include "ns3/mac48-address.h"
 
 #include <list>
 #include <optional>
@@ -28,7 +29,7 @@
 class Packet;
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * See IEEE 802.11 chapter 7.3.1.11
  * Header format: | category: 1 | action value: 1 |
@@ -239,43 +240,43 @@
     /**
      * Set action for this Action header.
      *
-     * \param type category
-     * \param action action
+     * @param type category
+     * @param action action
      */
     void SetAction(CategoryValue type, ActionValue action);
 
     /**
      * Return the category value.
      *
-     * \return CategoryValue
+     * @return CategoryValue
      */
     CategoryValue GetCategory() const;
     /**
      * Return the action value.
      *
-     * \return ActionValue
+     * @return ActionValue
      */
     ActionValue GetAction() const;
 
     /**
      * Peek an Action header from the given packet.
      *
-     * \param pkt the given packet
-     * \return the category value and the action value in the peeked Action header
+     * @param pkt the given packet
+     * @return the category value and the action value in the peeked Action header
      */
     static std::pair<CategoryValue, ActionValue> Peek(Ptr<const Packet> pkt);
 
     /**
      * Remove an Action header from the given packet.
      *
-     * \param pkt the given packet
-     * \return the category value and the action value in the removed Action header
+     * @param pkt the given packet
+     * @return the category value and the action value in the removed Action header
      */
     static std::pair<CategoryValue, ActionValue> Remove(Ptr<Packet> pkt);
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -290,7 +291,7 @@
 };
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * Implement the header for management frames of type Add Block Ack request.
  */
 class MgtAddBaRequestHeader : public Header
@@ -298,7 +299,7 @@
   public:
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -318,108 +319,119 @@
     /**
      * Set Traffic ID (TID).
      *
-     * \param tid traffic ID
+     * @param tid traffic ID
      */
     void SetTid(uint8_t tid);
     /**
      * Set timeout.
      *
-     * \param timeout timeout
+     * @param timeout timeout
      */
     void SetTimeout(uint16_t timeout);
     /**
      * Set buffer size.
      *
-     * \param size buffer size
+     * @param size buffer size
      */
     void SetBufferSize(uint16_t size);
     /**
      * Set the starting sequence number.
      *
-     * \param seq the starting sequence number
+     * @param seq the starting sequence number
      */
     void SetStartingSequence(uint16_t seq);
     /**
      * Enable or disable A-MSDU support.
      *
-     * \param supported enable or disable A-MSDU support
+     * @param supported enable or disable A-MSDU support
      */
     void SetAmsduSupport(bool supported);
+    /**
+     * Set the GCR Group address.
+     *
+     * @param address the GCR Group Address
+     */
+    void SetGcrGroupAddress(const Mac48Address& address);
 
     /**
      * Return the starting sequence number.
      *
-     * \return the starting sequence number
+     * @return the starting sequence number
      */
     uint16_t GetStartingSequence() const;
     /**
      * Return the Traffic ID (TID).
      *
-     * \return TID
+     * @return TID
      */
     uint8_t GetTid() const;
     /**
      * Return whether the Block Ack policy is immediate Block Ack.
      *
-     * \return true if immediate Block Ack is being used, false otherwise
+     * @return true if immediate Block Ack is being used, false otherwise
      */
     bool IsImmediateBlockAck() const;
     /**
      * Return the timeout.
      *
-     * \return timeout
+     * @return timeout
      */
     uint16_t GetTimeout() const;
     /**
      * Return the buffer size.
      *
-     * \return the buffer size.
+     * @return the buffer size.
      */
     uint16_t GetBufferSize() const;
     /**
      * Return whether A-MSDU capability is supported.
      *
-     * \return true is A-MSDU is supported, false otherwise
+     * @return true is A-MSDU is supported, false otherwise
      */
     bool IsAmsduSupported() const;
+    /**
+     * @return the GCR Group Address, if present
+     */
+    std::optional<Mac48Address> GetGcrGroupAddress() const;
 
   private:
     /**
      * Return the raw parameter set.
      *
-     * \return the raw parameter set
+     * @return the raw parameter set
      */
     uint16_t GetParameterSet() const;
     /**
      * Set the parameter set from the given raw value.
      *
-     * \param params raw parameter set value
+     * @param params raw parameter set value
      */
     void SetParameterSet(uint16_t params);
     /**
      * Return the raw sequence control.
      *
-     * \return the raw sequence control
+     * @return the raw sequence control
      */
     uint16_t GetStartingSequenceControl() const;
     /**
      * Set sequence control with the given raw value.
      *
-     * \param seqControl the raw sequence control
+     * @param seqControl the raw sequence control
      */
     void SetStartingSequenceControl(uint16_t seqControl);
 
-    uint8_t m_dialogToken{1};   //!< Not used for now
-    uint8_t m_amsduSupport{1};  //!< Flag if A-MSDU is supported
-    uint8_t m_policy{1};        //!< Block Ack policy
-    uint8_t m_tid{0};           //!< Traffic ID
-    uint16_t m_bufferSize{0};   //!< Buffer size
-    uint16_t m_timeoutValue{0}; //!< Timeout
-    uint16_t m_startingSeq{0};  //!< Starting sequence number
+    uint8_t m_dialogToken{1};                      //!< Not used for now
+    bool m_amsduSupport{true};                     //!< Flag if A-MSDU is supported
+    uint8_t m_policy{1};                           //!< Block Ack policy
+    uint8_t m_tid{0};                              //!< Traffic ID
+    uint16_t m_bufferSize{0};                      //!< Buffer size
+    uint16_t m_timeoutValue{0};                    //!< Timeout
+    uint16_t m_startingSeq{0};                     //!< Starting sequence number
+    std::optional<Mac48Address> m_gcrGroupAddress; //!< GCR Group Address (optional)
 };
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * Implement the header for management frames of type Add Block Ack response.
  */
 class MgtAddBaResponseHeader : public Header
@@ -427,7 +439,7 @@
   public:
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -447,96 +459,107 @@
     /**
      * Set Traffic ID (TID).
      *
-     * \param tid traffic ID
+     * @param tid traffic ID
      */
     void SetTid(uint8_t tid);
     /**
      * Set timeout.
      *
-     * \param timeout timeout
+     * @param timeout timeout
      */
     void SetTimeout(uint16_t timeout);
     /**
      * Set buffer size.
      *
-     * \param size buffer size
+     * @param size buffer size
      */
     void SetBufferSize(uint16_t size);
     /**
      * Set the status code.
      *
-     * \param code the status code
+     * @param code the status code
      */
     void SetStatusCode(StatusCode code);
     /**
      * Enable or disable A-MSDU support.
      *
-     * \param supported enable or disable A-MSDU support
+     * @param supported enable or disable A-MSDU support
      */
     void SetAmsduSupport(bool supported);
+    /**
+     * Set the GCR Group address.
+     *
+     * @param address the GCR Group Address
+     */
+    void SetGcrGroupAddress(const Mac48Address& address);
 
     /**
      * Return the status code.
      *
-     * \return the status code
+     * @return the status code
      */
     StatusCode GetStatusCode() const;
     /**
      * Return the Traffic ID (TID).
      *
-     * \return TID
+     * @return TID
      */
     uint8_t GetTid() const;
     /**
      * Return whether the Block Ack policy is immediate Block Ack.
      *
-     * \return true if immediate Block Ack is being used, false otherwise
+     * @return true if immediate Block Ack is being used, false otherwise
      */
     bool IsImmediateBlockAck() const;
     /**
      * Return the timeout.
      *
-     * \return timeout
+     * @return timeout
      */
     uint16_t GetTimeout() const;
     /**
      * Return the buffer size.
      *
-     * \return the buffer size.
+     * @return the buffer size.
      */
     uint16_t GetBufferSize() const;
     /**
      * Return whether A-MSDU capability is supported.
      *
-     * \return true is A-MSDU is supported, false otherwise
+     * @return true is A-MSDU is supported, false otherwise
      */
     bool IsAmsduSupported() const;
+    /**
+     * @return the GCR Group Address, if present
+     */
+    std::optional<Mac48Address> GetGcrGroupAddress() const;
 
   private:
     /**
      * Return the raw parameter set.
      *
-     * \return the raw parameter set
+     * @return the raw parameter set
      */
     uint16_t GetParameterSet() const;
     /**
      * Set the parameter set from the given raw value.
      *
-     * \param params raw parameter set value
+     * @param params raw parameter set value
      */
     void SetParameterSet(uint16_t params);
 
-    uint8_t m_dialogToken{1};   //!< Not used for now
-    StatusCode m_code{};        //!< Status code
-    uint8_t m_amsduSupport{1};  //!< Flag if A-MSDU is supported
-    uint8_t m_policy{1};        //!< Block ACK policy
-    uint8_t m_tid{0};           //!< Traffic ID
-    uint16_t m_bufferSize{0};   //!< Buffer size
-    uint16_t m_timeoutValue{0}; //!< Timeout
+    uint8_t m_dialogToken{1};                      //!< Not used for now
+    StatusCode m_code{};                           //!< Status code
+    bool m_amsduSupport{true};                     //!< Flag if A-MSDU is supported
+    uint8_t m_policy{1};                           //!< Block ACK policy
+    uint8_t m_tid{0};                              //!< Traffic ID
+    uint16_t m_bufferSize{0};                      //!< Buffer size
+    uint16_t m_timeoutValue{0};                    //!< Timeout
+    std::optional<Mac48Address> m_gcrGroupAddress; //!< GCR Group Address (optional)
 };
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * Implement the header for management frames of type Delete Block Ack.
  */
 class MgtDelBaHeader : public Header
@@ -544,7 +567,7 @@
   public:
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
@@ -557,20 +580,20 @@
     /**
      * Check if the initiator bit in the DELBA is set.
      *
-     * \return true if the initiator bit in the DELBA is set,
+     * @return true if the initiator bit in the DELBA is set,
      *         false otherwise
      */
     bool IsByOriginator() const;
     /**
      * Return the Traffic ID (TID).
      *
-     * \return TID
+     * @return TID
      */
     uint8_t GetTid() const;
     /**
      * Set Traffic ID (TID).
      *
-     * \param tid traffic ID
+     * @param tid traffic ID
      */
     void SetTid(uint8_t tid);
     /**
@@ -581,28 +604,39 @@
      * Un-set the initiator bit in the DELBA.
      */
     void SetByRecipient();
+    /**
+     * Set the GCR Group address.
+     *
+     * @param address the GCR Group Address
+     */
+    void SetGcrGroupAddress(const Mac48Address& address);
+    /**
+     * @return the GCR Group Address, if present
+     */
+    std::optional<Mac48Address> GetGcrGroupAddress() const;
 
   private:
     /**
      * Return the raw parameter set.
      *
-     * \return the raw parameter set
+     * @return the raw parameter set
      */
     uint16_t GetParameterSet() const;
     /**
      * Set the parameter set from the given raw value.
      *
-     * \param params raw parameter set value
+     * @param params raw parameter set value
      */
     void SetParameterSet(uint16_t params);
 
     uint16_t m_initiator{0};  //!< initiator
     uint16_t m_tid{0};        //!< Traffic ID
     uint16_t m_reasonCode{1}; //!< Not used for now. Always set to 1: "Unspecified reason"
+    std::optional<Mac48Address> m_gcrGroupAddress; //!< GCR Group Address (optional)
 };
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * Implement the header for Action frames of type EML Operating Mode Notification.
  */
 class MgtEmlOmn : public Header
@@ -612,7 +646,7 @@
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -647,11 +681,11 @@
     /**
      * Set the bit position in the link bitmap corresponding to the given link.
      *
-     * \param linkId the ID of the given link
+     * @param linkId the ID of the given link
      */
     void SetLinkIdInBitmap(uint8_t linkId);
     /**
-     * \return the ID of the links whose bit position in the link bitmap is set to 1
+     * @return the ID of the links whose bit position in the link bitmap is set to 1
      */
     std::list<uint8_t> GetLinkBitmap() const;
 
@@ -661,7 +695,7 @@
 };
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * Implement the FILS (Fast Initial Link Setup) action frame.
  * See sec. 9.6.7.36 of IEEE 802.11-2020 and IEEE 802.11ax-2021.
  */
@@ -670,7 +704,7 @@
   public:
     FilsDiscHeader();
 
-    /// \return the object TypeId
+    /// @return the object TypeId
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
     void Print(std::ostream& os) const override;
@@ -681,20 +715,20 @@
     /**
      * Set the SSID field.
      *
-     * \param ssid the SSID
+     * @param ssid the SSID
      */
     void SetSsid(const std::string& ssid);
 
-    /// \return the SSID
+    /// @return the SSID
     const std::string& GetSsid() const;
 
-    /// \return size of FILS Discovery Information field in octets
+    /// @return size of FILS Discovery Information field in octets
     uint32_t GetInformationFieldSize() const;
 
-    /// \return size of non-optional subfields in octets
+    /// @return size of non-optional subfields in octets
     uint32_t GetSizeNonOptSubfields() const;
 
-    /// \brief sets value of Length subfield
+    /// @brief sets value of Length subfield
     void SetLengthSubfield();
 
     /// FILS Discovery Frame Control subfield of FILS Discovery Information field
@@ -714,15 +748,15 @@
         uint8_t m_reserved : 2 {0};              ///< Reserved Bits
 
         /**
-         * \brief serialize content to a given buffer
-         * \param start given input buffer iterator
+         * @brief serialize content to a given buffer
+         * @param start given input buffer iterator
          */
         void Serialize(Buffer::Iterator& start) const;
 
         /**
-         * \brief read content from a given buffer
-         * \param start input buffer iterator
-         * \return number of read octets
+         * @brief read content from a given buffer
+         * @param start input buffer iterator
+         * @return number of read octets
          */
         uint32_t Deserialize(Buffer::Iterator start);
     };
@@ -740,17 +774,17 @@
         uint8_t m_minRate : 3 {0};               ///< FILS Minimum Rate
 
         /**
-         * \brief Set the BSS Operating Channel Width field based on the operating channel width
-         * \param width the operating channel width
+         * @brief Set the BSS Operating Channel Width field based on the operating channel width
+         * @param width the operating channel width
          */
         void SetOpChannelWidth(MHz_u width);
 
-        /// \return the operating channel width encoded in the BSS Operating Channel Width field
+        /// @return the operating channel width encoded in the BSS Operating Channel Width field
         MHz_u GetOpChannelWidth() const;
 
         /**
-         * \brief Set the Maximum Number of Spatial Streams field
-         * \param maxNss the maximum number of supported spatial streams
+         * @brief Set the Maximum Number of Spatial Streams field
+         * @param maxNss the maximum number of supported spatial streams
          */
         void SetMaxNss(uint8_t maxNss);
 
@@ -758,33 +792,33 @@
          * Note that this function returns 5 if the maximum number of supported spatial streams
          * is greater than 4.
          *
-         * \return the maximum number of supported spatial streams
+         * @return the maximum number of supported spatial streams
          */
         uint8_t GetMaxNss() const;
 
         /**
-         * \brief Set the PHY Index field based on the given wifi standard
-         * \param standard the wifi standard
+         * @brief Set the PHY Index field based on the given wifi standard
+         * @param standard the wifi standard
          */
         void SetStandard(WifiStandard standard);
 
         /**
-         * \param band the PHY band in which the device is operating (needed to distinguish
+         * @param band the PHY band in which the device is operating (needed to distinguish
          *             between 802.11a and 802.11g)
-         * \return the wifi standard encoded in the PHY Index field
+         * @return the wifi standard encoded in the PHY Index field
          */
         WifiStandard GetStandard(WifiPhyBand band) const;
 
         /**
-         * \brief serialize content to a given buffer
-         * \param start given input buffer iterator
+         * @brief serialize content to a given buffer
+         * @param start given input buffer iterator
          */
         void Serialize(Buffer::Iterator& start) const;
 
         /**
-         * \brief read content from a given buffer
-         * \param start input buffer iterator
-         * \return number of read octets
+         * @brief read content from a given buffer
+         * @param start input buffer iterator
+         * @return number of read octets
          */
         uint32_t Deserialize(Buffer::Iterator start);
     };
@@ -812,20 +846,20 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the output stream
- * \param control the Fils Discovery Frame Control field
- * \returns a reference to the stream
+ * @param os the output stream
+ * @param control the Fils Discovery Frame Control field
+ * @returns a reference to the stream
  */
 std::ostream& operator<<(std::ostream& os, const FilsDiscHeader::FilsDiscFrameControl& control);
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the output stream
- * \param capability the Fils Discovery Frame Capability field
- * \returns a reference to the stream
+ * @param os the output stream
+ * @param capability the Fils Discovery Frame Capability field
+ * @returns a reference to the stream
  */
 std::ostream& operator<<(std::ostream& os, const FilsDiscHeader::FdCapability& capability);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/mgt-headers.cc ns-3.44/src/wifi/model/mgt-headers.cc
--- ns-3.43/src/wifi/model/mgt-headers.cc	2024-10-09 16:41:10.120656700 -0700
+++ ns-3.44/src/wifi/model/mgt-headers.cc	2025-03-09 16:55:49.795372700 -0700
@@ -93,6 +93,8 @@
 uint32_t
 MgtProbeResponseHeader::GetSerializedSizeImpl() const
 {
+    SetMleContainingFrame();
+
     uint32_t size = 8 /* timestamp */ + 2 /* beacon interval */;
     size += m_capability.GetSerializedSize();
     size += WifiMgtHeader<MgtProbeResponseHeader, ProbeResponseElems>::GetSerializedSizeImpl();
@@ -102,6 +104,8 @@
 void
 MgtProbeResponseHeader::SerializeImpl(Buffer::Iterator start) const
 {
+    SetMleContainingFrame();
+
     Buffer::Iterator i = start;
     i.WriteHtolsbU64(Simulator::Now().GetMicroSeconds());
     i.WriteHtolsbU16(static_cast<uint16_t>(m_beaconInterval / 1024));
@@ -118,7 +122,20 @@
     m_beaconInterval *= 1024;
     i = m_capability.Deserialize(i);
     auto distance = i.GetDistanceFrom(start);
-    return distance + WifiMgtHeader<MgtProbeResponseHeader, ProbeResponseElems>::DeserializeImpl(i);
+    distance += WifiMgtHeader<MgtProbeResponseHeader, ProbeResponseElems>::DeserializeImpl(i);
+    if (auto& mle = Get<MultiLinkElement>())
+    {
+        for (std::size_t id = 0; id < mle->GetNPerStaProfileSubelements(); ++id)
+        {
+            auto& perStaProfile = mle->GetPerStaProfile(id);
+            if (perStaProfile.HasProbeResponse())
+            {
+                auto& frameInPerStaProfile = perStaProfile.GetProbeResponse();
+                frameInPerStaProfile.CopyIesFromContainingFrame(*this);
+            }
+        }
+    }
+    return distance;
 }
 
 /***********************************************************
@@ -270,6 +287,44 @@
                           DeserializeFromPerStaProfileImpl(i, length - distance, frame);
 }
 
+uint32_t
+MgtProbeResponseHeader::GetSerializedSizeInPerStaProfileImpl(
+    const MgtProbeResponseHeader& frame) const
+{
+    uint32_t size = 0;
+    size += m_capability.GetSerializedSize();
+    size +=
+        MgtHeaderInPerStaProfile<MgtProbeResponseHeader,
+                                 ProbeResponseElems>::GetSerializedSizeInPerStaProfileImpl(frame);
+    return size;
+}
+
+void
+MgtProbeResponseHeader::SerializeInPerStaProfileImpl(Buffer::Iterator start,
+                                                     const MgtProbeResponseHeader& frame) const
+{
+    auto i = start;
+    i = m_capability.Serialize(i);
+    MgtHeaderInPerStaProfile<MgtProbeResponseHeader,
+                             ProbeResponseElems>::SerializeInPerStaProfileImpl(i, frame);
+}
+
+uint32_t
+MgtProbeResponseHeader::DeserializeFromPerStaProfileImpl(Buffer::Iterator start,
+                                                         uint16_t length,
+                                                         const MgtProbeResponseHeader& frame)
+{
+    auto i = start;
+    m_timestamp = frame.GetTimestamp();
+    m_beaconInterval = frame.GetBeaconIntervalUs();
+    i = m_capability.Deserialize(i);
+    auto distance = i.GetDistanceFrom(start);
+    NS_ASSERT_MSG(distance <= length,
+                  "Bytes read (" << distance << ") exceed expected number (" << length << ")");
+    return distance + MgtHeaderInPerStaProfile<MgtProbeResponseHeader, ProbeResponseElems>::
+                          DeserializeFromPerStaProfileImpl(i, length - distance, frame);
+}
+
 /***********************************************************
  *          Ressoc Request
  ***********************************************************/
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/mgt-headers.h ns-3.44/src/wifi/model/mgt-headers.h
--- ns-3.43/src/wifi/model/mgt-headers.h	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/mgt-headers.h	2025-03-09 16:55:49.795372700 -0700
@@ -54,25 +54,25 @@
  * the STA Profile field of the Basic Multi-Link element.
  */
 
-/** \copydoc CanBeInPerStaProfile */
+/** @copydoc CanBeInPerStaProfile */
 template <>
 struct CanBeInPerStaProfile<ReducedNeighborReport> : std::false_type
 {
 };
 
-/** \copydoc CanBeInPerStaProfile */
+/** @copydoc CanBeInPerStaProfile */
 template <>
 struct CanBeInPerStaProfile<TidToLinkMapping> : std::false_type
 {
 };
 
-/** \copydoc CanBeInPerStaProfile */
+/** @copydoc CanBeInPerStaProfile */
 template <>
 struct CanBeInPerStaProfile<MultiLinkElement> : std::false_type
 {
 };
 
-/** \copydoc CanBeInPerStaProfile */
+/** @copydoc CanBeInPerStaProfile */
 template <>
 struct CanBeInPerStaProfile<Ssid> : std::false_type
 {
@@ -82,11 +82,13 @@
 using ProbeRequestElems = std::tuple<Ssid,
                                      SupportedRates,
                                      std::optional<ExtendedSupportedRatesIE>,
+                                     std::optional<DsssParameterSet>,
                                      std::optional<HtCapabilities>,
                                      std::optional<ExtendedCapabilities>,
                                      std::optional<VhtCapabilities>,
                                      std::optional<HeCapabilities>,
                                      std::optional<He6GhzBandCapabilities>,
+                                     std::optional<MultiLinkElement>,
                                      std::optional<EhtCapabilities>>;
 
 /// List of Information Elements included in Probe Response frames
@@ -143,7 +145,7 @@
                                       std::vector<TidToLinkMapping>>;
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * Implement the header for management frames of type association request.
  */
 class MgtAssocRequestHeader
@@ -157,45 +159,45 @@
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
-    /** \copydoc Header::GetInstanceTypeId */
+    /** @copydoc Header::GetInstanceTypeId */
     TypeId GetInstanceTypeId() const override;
 
     /**
      * Set the listen interval.
      *
-     * \param interval the listen interval
+     * @param interval the listen interval
      */
     void SetListenInterval(uint16_t interval);
     /**
      * Return the listen interval.
      *
-     * \return the listen interval
+     * @return the listen interval
      */
     uint16_t GetListenInterval() const;
     /**
-     * \return a reference to the Capability information
+     * @return a reference to the Capability information
      */
     CapabilityInformation& Capabilities();
     /**
-     * \return a const reference to the Capability information
+     * @return a const reference to the Capability information
      */
     const CapabilityInformation& Capabilities() const;
 
   protected:
-    /** \copydoc Header::GetSerializedSize */
+    /** @copydoc Header::GetSerializedSize */
     uint32_t GetSerializedSizeImpl() const;
-    /** \copydoc Header::Serialize */
+    /** @copydoc Header::Serialize */
     void SerializeImpl(Buffer::Iterator start) const;
-    /** \copydoc Header::Deserialize */
+    /** @copydoc Header::Deserialize */
     uint32_t DeserializeImpl(Buffer::Iterator start);
 
     /**
-     * \param frame the frame containing the Multi-Link Element
-     * \return the number of bytes that are needed to serialize this header into a Per-STA Profile
+     * @param frame the frame containing the Multi-Link Element
+     * @return the number of bytes that are needed to serialize this header into a Per-STA Profile
      *         subelement of the Multi-Link Element
      */
     uint32_t GetSerializedSizeInPerStaProfileImpl(const MgtAssocRequestHeader& frame) const;
@@ -203,8 +205,8 @@
     /**
      * Serialize this header into a Per-STA Profile subelement of a Multi-Link Element
      *
-     * \param start an iterator which points to where the header should be written
-     * \param frame the frame containing the Multi-Link Element
+     * @param start an iterator which points to where the header should be written
+     * @param frame the frame containing the Multi-Link Element
      */
     void SerializeInPerStaProfileImpl(Buffer::Iterator start,
                                       const MgtAssocRequestHeader& frame) const;
@@ -212,10 +214,10 @@
     /**
      * Deserialize this header from a Per-STA Profile subelement of a Multi-Link Element.
      *
-     * \param start an iterator which points to where the header should be read from
-     * \param length the expected number of bytes to read
-     * \param frame the frame containing the Multi-Link Element
-     * \return the number of bytes read
+     * @param start an iterator which points to where the header should be read from
+     * @param length the expected number of bytes to read
+     * @param frame the frame containing the Multi-Link Element
+     * @return the number of bytes read
      */
     uint32_t DeserializeFromPerStaProfileImpl(Buffer::Iterator start,
                                               uint16_t length,
@@ -227,7 +229,7 @@
 };
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * Implement the header for management frames of type reassociation request.
  */
 class MgtReassocRequestHeader
@@ -241,53 +243,53 @@
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
-    /** \copydoc Header::GetInstanceTypeId */
+    /** @copydoc Header::GetInstanceTypeId */
     TypeId GetInstanceTypeId() const override;
 
     /**
      * Set the listen interval.
      *
-     * \param interval the listen interval
+     * @param interval the listen interval
      */
     void SetListenInterval(uint16_t interval);
     /**
      * Return the listen interval.
      *
-     * \return the listen interval
+     * @return the listen interval
      */
     uint16_t GetListenInterval() const;
     /**
-     * \return a reference to the Capability information
+     * @return a reference to the Capability information
      */
     CapabilityInformation& Capabilities();
     /**
-     * \return a const reference to the Capability information
+     * @return a const reference to the Capability information
      */
     const CapabilityInformation& Capabilities() const;
     /**
      * Set the address of the current access point.
      *
-     * \param currentApAddr address of the current access point
+     * @param currentApAddr address of the current access point
      */
     void SetCurrentApAddress(Mac48Address currentApAddr);
 
   protected:
-    /** \copydoc Header::GetSerializedSize */
+    /** @copydoc Header::GetSerializedSize */
     uint32_t GetSerializedSizeImpl() const;
-    /** \copydoc Header::Serialize */
+    /** @copydoc Header::Serialize */
     void SerializeImpl(Buffer::Iterator start) const;
-    /** \copydoc Header::Deserialize */
+    /** @copydoc Header::Deserialize */
     uint32_t DeserializeImpl(Buffer::Iterator start);
-    /** \copydoc Header::Print */
+    /** @copydoc Header::Print */
     void PrintImpl(std::ostream& os) const;
 
     /**
-     * \param frame the frame containing the Multi-Link Element
-     * \return the number of bytes that are needed to serialize this header into a Per-STA Profile
+     * @param frame the frame containing the Multi-Link Element
+     * @return the number of bytes that are needed to serialize this header into a Per-STA Profile
      *         subelement of the Multi-Link Element
      */
     uint32_t GetSerializedSizeInPerStaProfileImpl(const MgtReassocRequestHeader& frame) const;
@@ -295,8 +297,8 @@
     /**
      * Serialize this header into a Per-STA Profile subelement of a Multi-Link Element
      *
-     * \param start an iterator which points to where the header should be written
-     * \param frame the frame containing the Multi-Link Element
+     * @param start an iterator which points to where the header should be written
+     * @param frame the frame containing the Multi-Link Element
      */
     void SerializeInPerStaProfileImpl(Buffer::Iterator start,
                                       const MgtReassocRequestHeader& frame) const;
@@ -304,10 +306,10 @@
     /**
      * Deserialize this header from a Per-STA Profile subelement of a Multi-Link Element.
      *
-     * \param start an iterator which points to where the header should be read from
-     * \param length the expected number of bytes to read
-     * \param frame the frame containing the Multi-Link Element
-     * \return the number of bytes read
+     * @param start an iterator which points to where the header should be read from
+     * @param length the expected number of bytes to read
+     * @param frame the frame containing the Multi-Link Element
+     * @return the number of bytes read
      */
     uint32_t DeserializeFromPerStaProfileImpl(Buffer::Iterator start,
                                               uint16_t length,
@@ -320,7 +322,7 @@
 };
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * Implement the header for management frames of type association and reassociation response.
  */
 class MgtAssocResponseHeader
@@ -334,59 +336,59 @@
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
-    /** \copydoc Header::GetInstanceTypeId */
+    /** @copydoc Header::GetInstanceTypeId */
     TypeId GetInstanceTypeId() const override;
 
     /**
      * Return the status code.
      *
-     * \return the status code
+     * @return the status code
      */
     StatusCode GetStatusCode();
     /**
      * Set the status code.
      *
-     * \param code the status code
+     * @param code the status code
      */
     void SetStatusCode(StatusCode code);
     /**
-     * \return a reference to the Capability information
+     * @return a reference to the Capability information
      */
     CapabilityInformation& Capabilities();
     /**
-     * \return a const reference to the Capability information
+     * @return a const reference to the Capability information
      */
     const CapabilityInformation& Capabilities() const;
     /**
      * Return the association ID.
      *
-     * \return the association ID
+     * @return the association ID
      */
     uint16_t GetAssociationId() const;
     /**
      * Set the association ID.
      *
-     * \param aid the association ID
+     * @param aid the association ID
      */
     void SetAssociationId(uint16_t aid);
 
   protected:
-    /** \copydoc Header::GetSerializedSize */
+    /** @copydoc Header::GetSerializedSize */
     uint32_t GetSerializedSizeImpl() const;
-    /** \copydoc Header::Serialize */
+    /** @copydoc Header::Serialize */
     void SerializeImpl(Buffer::Iterator start) const;
-    /** \copydoc Header::Deserialize */
+    /** @copydoc Header::Deserialize */
     uint32_t DeserializeImpl(Buffer::Iterator start);
-    /** \copydoc Header::Print */
+    /** @copydoc Header::Print */
     void PrintImpl(std::ostream& os) const;
 
     /**
-     * \param frame the frame containing the Multi-Link Element
-     * \return the number of bytes that are needed to serialize this header into a Per-STA Profile
+     * @param frame the frame containing the Multi-Link Element
+     * @return the number of bytes that are needed to serialize this header into a Per-STA Profile
      *         subelement of the Multi-Link Element
      */
     uint32_t GetSerializedSizeInPerStaProfileImpl(const MgtAssocResponseHeader& frame) const;
@@ -394,8 +396,8 @@
     /**
      * Serialize this header into a Per-STA Profile subelement of a Multi-Link Element
      *
-     * \param start an iterator which points to where the header should be written
-     * \param frame the frame containing the Multi-Link Element
+     * @param start an iterator which points to where the header should be written
+     * @param frame the frame containing the Multi-Link Element
      */
     void SerializeInPerStaProfileImpl(Buffer::Iterator start,
                                       const MgtAssocResponseHeader& frame) const;
@@ -403,10 +405,10 @@
     /**
      * Deserialize this header from a Per-STA Profile subelement of a Multi-Link Element.
      *
-     * \param start an iterator which points to where the header should be read from
-     * \param length the expected number of bytes to read
-     * \param frame the frame containing the Multi-Link Element
-     * \return the number of bytes read
+     * @param start an iterator which points to where the header should be read from
+     * @param length the expected number of bytes to read
+     * @param frame the frame containing the Multi-Link Element
+     * @return the number of bytes read
      */
     uint32_t DeserializeFromPerStaProfileImpl(Buffer::Iterator start,
                                               uint16_t length,
@@ -419,7 +421,7 @@
 };
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * Implement the header for management frames of type probe request.
  */
 class MgtProbeRequestHeader : public WifiMgtHeader<MgtProbeRequestHeader, ProbeRequestElems>
@@ -429,69 +431,99 @@
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
-    /** \copydoc Header::GetInstanceTypeId */
+    /** @copydoc Header::GetInstanceTypeId */
     TypeId GetInstanceTypeId() const override;
 };
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * Implement the header for management frames of type probe response.
  */
-class MgtProbeResponseHeader : public WifiMgtHeader<MgtProbeResponseHeader, ProbeResponseElems>
+class MgtProbeResponseHeader
+    : public MgtHeaderInPerStaProfile<MgtProbeResponseHeader, ProbeResponseElems>
 {
     friend class WifiMgtHeader<MgtProbeResponseHeader, ProbeResponseElems>;
+    friend class MgtHeaderInPerStaProfile<MgtProbeResponseHeader, ProbeResponseElems>;
 
   public:
     ~MgtProbeResponseHeader() override = default;
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
-    /** \copydoc Header::GetInstanceTypeId */
+    /** @copydoc Header::GetInstanceTypeId */
     TypeId GetInstanceTypeId() const override;
 
     /**
      * Return the beacon interval in microseconds unit.
      *
-     * \return beacon interval in microseconds unit
+     * @return beacon interval in microseconds unit
      */
     uint64_t GetBeaconIntervalUs() const;
     /**
      * Set the beacon interval in microseconds unit.
      *
-     * \param us beacon interval in microseconds unit
+     * @param us beacon interval in microseconds unit
      */
     void SetBeaconIntervalUs(uint64_t us);
     /**
-     * \return a reference to the Capability information
+     * @return a reference to the Capability information
      */
     CapabilityInformation& Capabilities();
     /**
-     * \return a const reference to the Capability information
+     * @return a const reference to the Capability information
      */
     const CapabilityInformation& Capabilities() const;
     /**
      * Return the time stamp.
      *
-     * \return time stamp
+     * @return time stamp
      */
     uint64_t GetTimestamp() const;
 
   protected:
-    /** \copydoc Header::GetSerializedSize */
+    /** @copydoc Header::GetSerializedSize */
     uint32_t GetSerializedSizeImpl() const;
-    /** \copydoc Header::Serialize*/
+    /** @copydoc Header::Serialize*/
     void SerializeImpl(Buffer::Iterator start) const;
-    /** \copydoc Header::Deserialize */
+    /** @copydoc Header::Deserialize */
     uint32_t DeserializeImpl(Buffer::Iterator start);
 
+    /**
+     * @param frame the frame containing the Multi-Link Element
+     * @return the number of bytes that are needed to serialize this header into a Per-STA Profile
+     *         subelement of the Multi-Link Element
+     */
+    uint32_t GetSerializedSizeInPerStaProfileImpl(const MgtProbeResponseHeader& frame) const;
+
+    /**
+     * Serialize this header into a Per-STA Profile subelement of a Multi-Link Element
+     *
+     * @param start an iterator which points to where the header should be written
+     * @param frame the frame containing the Multi-Link Element
+     */
+    void SerializeInPerStaProfileImpl(Buffer::Iterator start,
+                                      const MgtProbeResponseHeader& frame) const;
+
+    /**
+     * Deserialize this header from a Per-STA Profile subelement of a Multi-Link Element.
+     *
+     * @param start an iterator which points to where the header should be read from
+     * @param length the expected number of bytes to read
+     * @param frame the frame containing the Multi-Link Element
+     * @return the number of bytes read
+     */
+    uint32_t DeserializeFromPerStaProfileImpl(Buffer::Iterator start,
+                                              uint16_t length,
+                                              const MgtProbeResponseHeader& frame);
+
   private:
     uint64_t m_timestamp;               //!< Timestamp
     uint64_t m_beaconInterval;          //!< Beacon interval
@@ -499,7 +531,7 @@
 };
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * Implement the header for management frames of type beacon.
  */
 class MgtBeaconHeader : public MgtProbeResponseHeader
@@ -509,7 +541,7 @@
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/mpdu-aggregator.cc ns-3.44/src/wifi/model/mpdu-aggregator.cc
--- ns-3.43/src/wifi/model/mpdu-aggregator.cc	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/mpdu-aggregator.cc	2025-03-09 16:55:49.795372700 -0700
@@ -10,11 +10,12 @@
 #include "mpdu-aggregator.h"
 
 #include "ampdu-subframe-header.h"
+#include "ap-wifi-mac.h"
 #include "ctrl-headers.h"
+#include "gcr-manager.h"
 #include "msdu-aggregator.h"
 #include "qos-txop.h"
 #include "wifi-mac-trailer.h"
-#include "wifi-mac.h"
 #include "wifi-mpdu.h"
 #include "wifi-net-device.h"
 #include "wifi-phy.h"
@@ -122,14 +123,19 @@
 {
     NS_LOG_FUNCTION(this << recipient << +tid << modulation);
 
-    AcIndex ac = QosUtilsMapTidToAc(tid);
+    if (auto apMac = DynamicCast<ApWifiMac>(m_mac);
+        IsGroupcast(recipient) && (m_mac->GetTypeOfStation() == AP) && apMac->GetGcrManager())
+    {
+        recipient = apMac->GetGcrManager()->GetIndividuallyAddressedRecipient(recipient);
+    }
 
+    AcIndex ac = QosUtilsMapTidToAc(tid);
     // Find the A-MPDU max size configured on this device
     uint32_t maxAmpduSize = m_mac->GetMaxAmpduSize(ac);
 
     if (maxAmpduSize == 0)
     {
-        NS_LOG_DEBUG("A-MPDU Aggregation is disabled on this station for AC " << ac);
+        NS_LOG_DEBUG("A-MPDU Aggregation is disabled on this station for " << ac);
         return 0;
     }
 
@@ -147,13 +153,14 @@
     // format used to transmit the A-MPDU
     if (modulation >= WIFI_MOD_CLASS_EHT)
     {
-        NS_ABORT_MSG_IF(!ehtCapabilities, "EHT Capabilities element not received");
+        NS_ABORT_MSG_IF(!ehtCapabilities,
+                        "EHT Capabilities element not received for " << recipient);
 
         maxAmpduSize = std::min(maxAmpduSize, ehtCapabilities->GetMaxAmpduLength());
     }
     else if (modulation >= WIFI_MOD_CLASS_HE)
     {
-        NS_ABORT_MSG_IF(!heCapabilities, "HE Capabilities element not received");
+        NS_ABORT_MSG_IF(!heCapabilities, "HE Capabilities element not received for " << recipient);
 
         maxAmpduSize = std::min(maxAmpduSize, heCapabilities->GetMaxAmpduLength());
         if (he6GhzCapabilities)
@@ -163,13 +170,14 @@
     }
     else if (modulation == WIFI_MOD_CLASS_VHT)
     {
-        NS_ABORT_MSG_IF(!vhtCapabilities, "VHT Capabilities element not received");
+        NS_ABORT_MSG_IF(!vhtCapabilities,
+                        "VHT Capabilities element not received for " << recipient);
 
         maxAmpduSize = std::min(maxAmpduSize, vhtCapabilities->GetMaxAmpduLength());
     }
     else if (modulation == WIFI_MOD_CLASS_HT)
     {
-        NS_ABORT_MSG_IF(!htCapabilities, "HT Capabilities element not received");
+        NS_ABORT_MSG_IF(!htCapabilities, "HT Capabilities element not received for " << recipient);
 
         maxAmpduSize = std::min(maxAmpduSize, htCapabilities->GetMaxAmpduLength());
     }
@@ -210,16 +218,27 @@
 
     std::vector<Ptr<WifiMpdu>> mpduList;
 
-    Mac48Address recipient = mpdu->GetHeader().GetAddr1();
-    NS_ASSERT(mpdu->GetHeader().IsQosData() && !recipient.IsBroadcast());
-    uint8_t tid = mpdu->GetHeader().GetQosTid();
-    auto origRecipient = mpdu->GetOriginal()->GetHeader().GetAddr1();
+    const auto& header = mpdu->GetHeader();
+    const auto recipient = GetIndividuallyAddressedRecipient(m_mac, header);
+    NS_ASSERT(header.IsQosData() && !recipient.IsBroadcast());
+
+    const auto& origAddr1 = mpdu->GetOriginal()->GetHeader().GetAddr1();
+    auto origRecipient = GetIndividuallyAddressedRecipient(m_mac, mpdu->GetOriginal()->GetHeader());
 
-    Ptr<QosTxop> qosTxop = m_mac->GetQosTxop(tid);
+    const auto tid = header.GetQosTid();
+    auto qosTxop = m_mac->GetQosTxop(tid);
     NS_ASSERT(qosTxop);
 
+    const auto isGcr = IsGcr(m_mac, header);
+    const auto bufferSize = qosTxop->GetBaBufferSize(origRecipient, tid, isGcr);
+    const auto startSeq = qosTxop->GetBaStartingSequence(origRecipient, tid, isGcr);
+
     // Have to make sure that the block ack agreement is established and A-MPDU is enabled
-    if (m_mac->GetBaAgreementEstablishedAsOriginator(recipient, tid) &&
+    auto apMac = DynamicCast<ApWifiMac>(m_mac);
+    const auto agreementEstablished =
+        isGcr ? apMac->IsGcrBaAgreementEstablishedWithAllMembers(header.GetAddr1(), tid)
+              : m_mac->GetBaAgreementEstablishedAsOriginator(recipient, tid).has_value();
+    if (agreementEstablished &&
         GetMaxAmpduSize(recipient, tid, txParams.m_txVector.GetModulationClass()) > 0)
     {
         /* here is performed MPDU aggregation */
@@ -227,6 +246,23 @@
 
         while (nextMpdu)
         {
+            const auto isGcrUr = isGcr && (apMac->GetGcrManager()->GetRetransmissionPolicy() ==
+                                           GroupAddressRetransmissionPolicy::GCR_UNSOLICITED_RETRY);
+            if (isGcrUr && header.IsRetry() && !nextMpdu->GetHeader().IsRetry())
+            {
+                // if this is a retransmitted A-MPDU transmitted via GCR-UR, do not add new MPDU
+                break;
+            }
+            if (isGcr &&
+                apMac->GetGcrManager()->GetRetransmissionPolicyFor(header) !=
+                    apMac->GetGcrManager()->GetRetransmissionPolicyFor(nextMpdu->GetHeader()))
+            {
+                // if an MPDU has been previously transmitted using No-Ack/No-Retry,
+                // do not add a new MPDU that still needs to be transmitted using No-Ack/No-Retry,
+                // unless No-Ack/No-Retry is the only selected retransmission policy
+                break;
+            }
+
             // if we are here, nextMpdu can be aggregated to the A-MPDU.
             NS_LOG_DEBUG("Adding packet with sequence number "
                          << nextMpdu->GetHeader().GetSequenceNumber()
@@ -237,15 +273,14 @@
 
             // If allowed by the BA agreement, get the next MPDU
             auto peekedMpdu =
-                qosTxop->PeekNextMpdu(m_linkId, tid, origRecipient, nextMpdu->GetOriginal());
+                qosTxop->PeekNextMpdu(m_linkId, tid, origAddr1, nextMpdu->GetOriginal());
             nextMpdu = nullptr;
 
             if (peekedMpdu)
             {
                 // PeekNextMpdu() does not return an MPDU that is beyond the transmit window
-                NS_ASSERT(IsInWindow(peekedMpdu->GetHeader().GetSequenceNumber(),
-                                     qosTxop->GetBaStartingSequence(origRecipient, tid),
-                                     qosTxop->GetBaBufferSize(origRecipient, tid)));
+                NS_ASSERT(
+                    IsInWindow(peekedMpdu->GetHeader().GetSequenceNumber(), startSeq, bufferSize));
 
                 peekedMpdu = m_htFem->CreateAliasIfNeeded(peekedMpdu);
                 // get the next MPDU to aggregate, provided that the constraints on size
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/mpdu-aggregator.h ns-3.44/src/wifi/model/mpdu-aggregator.h
--- ns-3.43/src/wifi/model/mpdu-aggregator.h	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/mpdu-aggregator.h	2025-03-09 16:55:49.795372700 -0700
@@ -30,8 +30,8 @@
 class HtFrameExchangeManager;
 
 /**
- * \brief Aggregator used to construct A-MPDUs
- * \ingroup wifi
+ * @brief Aggregator used to construct A-MPDUs
+ * @ingroup wifi
  */
 class MpduAggregator : public Object
 {
@@ -42,8 +42,8 @@
     typedef std::map<AcIndex, Ptr<QosTxop>> EdcaQueues;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -53,16 +53,16 @@
     /**
      * Aggregate an MPDU to an A-MPDU.
      *
-     * \param mpdu the MPDU.
-     * \param ampdu the A-MPDU.
-     * \param isSingle whether it is a single MPDU.
+     * @param mpdu the MPDU.
+     * @param ampdu the A-MPDU.
+     * @param isSingle whether it is a single MPDU.
      */
     static void Aggregate(Ptr<const WifiMpdu> mpdu, Ptr<Packet> ampdu, bool isSingle);
 
     /**
      * Set the ID of the link this MPDU aggregator is associated with.
      *
-     * \param linkId the ID of the link this MPDU aggregator is associated with
+     * @param linkId the ID of the link this MPDU aggregator is associated with
      */
     void SetLinkId(uint8_t linkId);
 
@@ -70,9 +70,9 @@
      * Compute the size of the A-MPDU resulting from the aggregation of an MPDU of
      * size <i>mpduSize</i> and an A-MPDU of size <i>ampduSize</i>.
      *
-     * \param mpduSize the MPDU size in bytes.
-     * \param ampduSize the A-MPDU size in bytes.
-     * \return the size of the resulting A-MPDU in bytes.
+     * @param mpduSize the MPDU size in bytes.
+     * @param ampduSize the A-MPDU size in bytes.
+     * @return the size of the resulting A-MPDU in bytes.
      */
     static uint32_t GetSizeIfAggregated(uint32_t mpduSize, uint32_t ampduSize);
 
@@ -80,10 +80,10 @@
      * Determine the maximum size for an A-MPDU of the given TID that can be sent
      * to the given receiver when using the given modulation class.
      *
-     * \param recipient the receiver station address.
-     * \param tid the TID.
-     * \param modulation the modulation class.
-     * \return the maximum A-MPDU size in bytes.
+     * @param recipient the receiver station address.
+     * @param tid the TID.
+     * @param modulation the modulation class.
+     * @return the maximum A-MPDU size in bytes.
      */
     uint32_t GetMaxAmpduSize(Mac48Address recipient,
                              uint8_t tid,
@@ -115,10 +115,10 @@
      * established with the receiver, or another MPDU to aggregate was not found),
      * the returned vector is empty.
      *
-     * \param mpdu the given MPDU.
-     * \param txParams the TX parameters used to transmit the frame
-     * \param availableTime the time available for the frame exchange
-     * \return the resulting A-MPDU, if aggregation is possible.
+     * @param mpdu the given MPDU.
+     * @param txParams the TX parameters used to transmit the frame
+     * @param availableTime the time available for the frame exchange
+     * @return the resulting A-MPDU, if aggregation is possible.
      */
     std::vector<Ptr<WifiMpdu>> GetNextAmpdu(Ptr<WifiMpdu> mpdu,
                                             WifiTxParameters& txParams,
@@ -127,13 +127,13 @@
     /**
      * Set the MAC layer to use.
      *
-     * \param mac the MAC layer to use
+     * @param mac the MAC layer to use
      */
     void SetWifiMac(const Ptr<WifiMac> mac);
 
     /**
-     * \param ampduSize the size of the A-MPDU that needs to be padded in bytes
-     * \return the size of the padding that must be added to the end of an A-MPDU in bytes
+     * @param ampduSize the size of the A-MPDU that needs to be padded in bytes
+     * @return the size of the padding that must be added to the end of an A-MPDU in bytes
      *
      * Calculates how much padding must be added to the end of an A-MPDU of the given size
      * (once another MPDU is aggregated).
@@ -145,9 +145,9 @@
      * Get the A-MPDU subframe header corresponding to the MPDU size and
      * whether the MPDU is a single MPDU.
      *
-     * \param mpduSize size of the MPDU in bytes.
-     * \param isSingle true if S-MPDU.
-     * \return the A-MPDU subframe header
+     * @param mpduSize size of the MPDU in bytes.
+     * @param isSingle true if S-MPDU.
+     * @return the A-MPDU subframe header
      */
     static AmpduSubframeHeader GetAmpduSubframeHeader(uint16_t mpduSize, bool isSingle);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/msdu-aggregator.cc ns-3.44/src/wifi/model/msdu-aggregator.cc
--- ns-3.43/src/wifi/model/msdu-aggregator.cc	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/msdu-aggregator.cc	2025-03-09 16:55:49.795372700 -0700
@@ -9,10 +9,11 @@
 
 #include "msdu-aggregator.h"
 
+#include "ap-wifi-mac.h"
+#include "gcr-manager.h"
 #include "qos-txop.h"
 #include "wifi-mac-queue.h"
 #include "wifi-mac-trailer.h"
-#include "wifi-mac.h"
 #include "wifi-remote-station-manager.h"
 #include "wifi-tx-parameters.h"
 
@@ -83,15 +84,12 @@
 {
     NS_LOG_FUNCTION(this << *peekedItem << &txParams << availableTime);
 
-    Ptr<WifiMacQueue> queue = m_mac->GetTxopQueue(peekedItem->GetQueueAc());
-
-    uint8_t tid = peekedItem->GetHeader().GetQosTid();
-    auto recipient = peekedItem->GetOriginal()->GetHeader().GetAddr1();
-
     /* "The Address 1 field of an MPDU carrying an A-MSDU shall be set to an
      * individual address or to the GCR concealment address" (Section 10.12
      * of 802.11-2016)
      */
+    const auto& header = peekedItem->GetOriginal()->GetHeader();
+    const auto recipient = GetIndividuallyAddressedRecipient(m_mac, header);
     NS_ABORT_MSG_IF(recipient.IsBroadcast(), "Recipient address is broadcast");
 
     /* "A STA shall not transmit an A-MSDU within a QoS Data frame under a block
@@ -106,14 +104,45 @@
 
     NS_ASSERT(m_htFem);
 
+    auto queue = m_mac->GetTxopQueue(peekedItem->GetQueueAc());
+
+    // if GCR, A-MSDU is always used with a single A-MSDU subframe
+    if (IsGcr(m_mac, header))
+    {
+        auto apMac = DynamicCast<ApWifiMac>(m_mac);
+        NS_ASSERT(apMac);
+        auto gcrManager = apMac->GetGcrManager();
+        if (!gcrManager->UseConcealment(peekedItem->GetHeader()))
+        {
+            return nullptr;
+        }
+        auto msdu = peekedItem->GetOriginal();
+        auto gcrAmsdu =
+            Create<WifiMpdu>(msdu->GetPacket(), msdu->GetHeader(), msdu->GetTimestamp());
+        gcrAmsdu->Aggregate(nullptr);
+        queue->Replace(msdu, gcrAmsdu);
+        if (msdu->GetHeader().IsRetry())
+        {
+            gcrAmsdu->AssignSeqNo(msdu->GetHeader().GetSequenceNumber());
+        }
+        return m_htFem->CreateAliasIfNeeded(gcrAmsdu);
+    }
+    else if (IsGroupcast(recipient))
+    {
+        NS_LOG_DEBUG("No A-MSDU aggregation for groupcast frames without GCR service");
+        return nullptr;
+    }
+
+    const auto tid = header.GetQosTid();
     if (GetMaxAmsduSize(recipient, tid, txParams.m_txVector.GetModulationClass()) == 0)
     {
         NS_LOG_DEBUG("A-MSDU aggregation disabled");
         return nullptr;
     }
 
-    Ptr<WifiMpdu> amsdu = queue->GetOriginal(peekedItem);
-    uint8_t nMsdu = 1;
+    // perform A-MSDU aggregation
+    auto amsdu = queue->GetOriginal(peekedItem);
+    std::size_t nMsdu = 1;
     peekedItem = queue->PeekByTidAndAddress(tid, recipient, peekedItem->GetOriginal());
 
     // stop aggregation if we find an A-MSDU in the queue. This likely happens when an A-MSDU is
@@ -127,7 +156,7 @@
                       "Found item with sequence number assignment after one without: perhaps "
                       "sequence numbers were not released correctly?");
         // find the next MPDU before dequeuing the current one
-        Ptr<const WifiMpdu> msdu = peekedItem->GetOriginal();
+        auto msdu = peekedItem->GetOriginal();
         peekedItem = queue->PeekByTidAndAddress(tid, recipient, msdu);
         queue->DequeueIfQueued({amsdu});
         // perform A-MSDU aggregation
@@ -167,7 +196,7 @@
 
     if (maxAmsduSize == 0)
     {
-        NS_LOG_DEBUG("A-MSDU Aggregation is disabled on this station for AC " << ac);
+        NS_LOG_DEBUG("A-MSDU Aggregation is disabled on this station for " << ac);
         return 0;
     }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/msdu-aggregator.h ns-3.44/src/wifi/model/msdu-aggregator.h
--- ns-3.43/src/wifi/model/msdu-aggregator.h	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/msdu-aggregator.h	2025-03-09 16:55:49.795372700 -0700
@@ -29,8 +29,8 @@
 class WifiTxParameters;
 
 /**
- * \brief Aggregator used to construct A-MSDUs
- * \ingroup wifi
+ * @brief Aggregator used to construct A-MSDUs
+ * @ingroup wifi
  */
 class MsduAggregator : public Object
 {
@@ -39,8 +39,8 @@
     typedef std::map<AcIndex, Ptr<QosTxop>> EdcaQueues;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -50,7 +50,7 @@
     /**
      * Set the ID of the link this MSDU aggregator is associated with.
      *
-     * \param linkId the ID of the link this MSDU aggregator is associated with
+     * @param linkId the ID of the link this MSDU aggregator is associated with
      */
     void SetLinkId(uint8_t linkId);
 
@@ -60,9 +60,9 @@
      * Note that only the basic A-MSDU subframe format (section 9.3.2.2.2 of IEEE
      * 802.11-2016) is supported.
      *
-     * \param msduSize the MSDU size in bytes.
-     * \param amsduSize the A-MSDU size in bytes.
-     * \return the size of the resulting A-MSDU in bytes.
+     * @param msduSize the MSDU size in bytes.
+     * @param amsduSize the A-MSDU size in bytes.
+     * @return the size of the resulting A-MSDU in bytes.
      */
     static uint16_t GetSizeIfAggregated(uint16_t msduSize, uint16_t amsduSize);
 
@@ -91,10 +91,10 @@
      * 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
-     * \return the resulting A-MSDU, if aggregation is possible, a null pointer otherwise.
+     * @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
+     * @return the resulting A-MSDU, if aggregation is possible, a null pointer otherwise.
      */
     Ptr<WifiMpdu> GetNextAmsdu(Ptr<WifiMpdu> peekedItem,
                                WifiTxParameters& txParams,
@@ -104,10 +104,10 @@
      * Determine the maximum size for an A-MSDU of the given TID that can be sent
      * to the given receiver when using the given modulation class.
      *
-     * \param recipient the receiver station address.
-     * \param tid the TID.
-     * \param modulation the modulation class.
-     * \return the maximum A-MSDU size in bytes.
+     * @param recipient the receiver station address.
+     * @param tid the TID.
+     * @param modulation the modulation class.
+     * @return the maximum A-MSDU size in bytes.
      */
     uint16_t GetMaxAmsduSize(Mac48Address recipient,
                              uint8_t tid,
@@ -115,15 +115,15 @@
 
     /**
      *
-     * \param aggregatedPacket the aggregated packet.
-     * \returns DeaggregatedMsdus.
+     * @param aggregatedPacket the aggregated packet.
+     * @returns DeaggregatedMsdus.
      */
     static WifiMpdu::DeaggregatedMsdus Deaggregate(Ptr<Packet> aggregatedPacket);
 
     /**
      * Set the MAC layer to use.
      *
-     * \param mac the MAC layer to use
+     * @param mac the MAC layer to use
      */
     void SetWifiMac(const Ptr<WifiMac> mac);
 
@@ -132,9 +132,9 @@
      * given size if a new MSDU is added.
      * Each A-MSDU subframe is padded so that its length is multiple of 4 octets.
      *
-     * \param amsduSize the size of the A-MSDU
+     * @param amsduSize the size of the A-MSDU
      *
-     * \return the number of octets required for padding
+     * @return the number of octets required for padding
      */
     static uint8_t CalculatePadding(uint16_t amsduSize);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/nist-error-rate-model.h ns-3.44/src/wifi/model/nist-error-rate-model.h
--- ns-3.43/src/wifi/model/nist-error-rate-model.h	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/nist-error-rate-model.h	2025-03-09 16:55:49.795372700 -0700
@@ -16,7 +16,7 @@
 {
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * A model for the error rate for different modulations.  For OFDM modulation,
  * the model description and validation can be found in
@@ -27,8 +27,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -45,73 +45,73 @@
     /**
      * Return the bValue such that coding rate = bValue / (bValue + 1).
      *
-     * \param codeRate the coding rate
+     * @param codeRate the coding rate
      *
-     * \return the bValue such that coding rate = bValue / (bValue + 1)
+     * @return the bValue such that coding rate = bValue / (bValue + 1)
      */
     uint8_t GetBValue(WifiCodeRate codeRate) const;
     /**
      * Return the coded BER for the given p and b.
      *
-     * \param p the SNR ratio (in linear scale)
-     * \param bValue such that coding rate = bValue / (bValue + 1)
+     * @param p the SNR ratio (in linear scale)
+     * @param bValue such that coding rate = bValue / (bValue + 1)
      *
-     * \return the coded BER
+     * @return the coded BER
      */
     double CalculatePe(double p, uint8_t bValue) const;
     /**
      * Return BER of BPSK at the given SNR.
      *
-     * \param snr SNR ratio (in linear scale)
+     * @param snr SNR ratio (in linear scale)
      *
-     * \return BER of BPSK at the given SNR
+     * @return BER of BPSK at the given SNR
      */
     double GetBpskBer(double snr) const;
     /**
      * Return BER of QPSK at the given SNR.
      *
-     * \param snr SNR ratio (in linear scale)
+     * @param snr SNR ratio (in linear scale)
      *
-     * \return BER of QPSK at the given SNR
+     * @return BER of QPSK at the given SNR
      */
     double GetQpskBer(double snr) const;
     /**
      * Return BER of QAM for a given constellation size at the given SNR.
      *
-     * \param constellationSize the constellation size (M)
-     * \param snr SNR ratio (in linear scale)
-     * \return BER of QAM for a given constellation size at the given SNR
+     * @param constellationSize the constellation size (M)
+     * @param snr SNR ratio (in linear scale)
+     * @return BER of QAM for a given constellation size at the given SNR
      */
     double GetQamBer(uint16_t constellationSize, double snr) const;
     /**
      * Return BER of BPSK at the given SNR after applying FEC.
      *
-     * \param snr SNR ratio (in linear scale)
-     * \param nbits the number of bits in the chunk
-     * \param bValue the bValue such that coding rate = bValue / (bValue + 1)
+     * @param snr SNR ratio (in linear scale)
+     * @param nbits the number of bits in the chunk
+     * @param bValue the bValue such that coding rate = bValue / (bValue + 1)
      *
-     * \return BER of BPSK at the given SNR after applying FEC
+     * @return BER of BPSK at the given SNR after applying FEC
      */
     double GetFecBpskBer(double snr, uint64_t nbits, uint8_t bValue) const;
     /**
      * Return BER of QPSK at the given SNR after applying FEC.
      *
-     * \param snr SNR ratio (in linear scale)
-     * \param nbits the number of bits in the chunk
-     * \param bValue the bValue such that coding rate = bValue / (bValue + 1)
+     * @param snr SNR ratio (in linear scale)
+     * @param nbits the number of bits in the chunk
+     * @param bValue the bValue such that coding rate = bValue / (bValue + 1)
      *
-     * \return BER of QPSK at the given SNR after applying FEC
+     * @return BER of QPSK at the given SNR after applying FEC
      */
     double GetFecQpskBer(double snr, uint64_t nbits, uint8_t bValue) const;
     /**
      * Return BER of QAM for a given constellation size at the given SNR after applying FEC.
      *
-     * \param constellationSize the constellation size (M)
-     * \param snr SNR ratio (in linear scale)
-     * \param nbits the number of bits in the chunk
-     * \param bValue the bValue such that coding rate = bValue / (bValue + 1)
+     * @param constellationSize the constellation size (M)
+     * @param snr SNR ratio (in linear scale)
+     * @param nbits the number of bits in the chunk
+     * @param bValue the bValue such that coding rate = bValue / (bValue + 1)
      *
-     * \return BER of QAM for a given constellation size at the given SNR after applying FEC
+     * @return BER of QAM for a given constellation size at the given SNR after applying FEC
      */
     double GetFecQamBer(uint16_t constellationSize,
                         double snr,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/non-ht/dsss-error-rate-model.h ns-3.44/src/wifi/model/non-ht/dsss-error-rate-model.h
--- ns-3.43/src/wifi/model/non-ht/dsss-error-rate-model.h	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/non-ht/dsss-error-rate-model.h	2025-03-09 16:55:49.795372700 -0700
@@ -27,17 +27,17 @@
 /**
  * Integral function using GSL library
  *
- * \param x the input x variable
- * \param params a pointer to FunctionParameters struct
+ * @param x the input x variable
+ * @param params a pointer to FunctionParameters struct
  *
- * \return the integral function
+ * @return the integral function
  */
 double IntegralFunction(double x, void* params);
 #endif
 
 /**
- * \brief an implementation of DSSS error rate model
- * \ingroup wifi
+ * @brief an implementation of DSSS error rate model
+ * @ingroup wifi
  *
  * The 802.11b modulations:
  *    - 1 Mbps mode is based on DBPSK. BER is from equation 5.2-69 from John G. Proakis
@@ -64,47 +64,47 @@
     /**
      * A function DQPSK
      *
-     * \param x the input variable
+     * @param x the input variable
      *
-     * \return DQPSK (x)
+     * @return DQPSK (x)
      */
     static double DqpskFunction(double x);
     /**
      * Return the chunk success rate of the differential BPSK.
      *
-     * \param sinr the SINR ratio (not dB) of the chunk
-     * \param nbits the size of the chunk
+     * @param sinr the SINR ratio (not dB) of the chunk
+     * @param nbits the size of the chunk
      *
-     * \return the chunk success rate of the differential BPSK
+     * @return the chunk success rate of the differential BPSK
      */
     static double GetDsssDbpskSuccessRate(double sinr, uint64_t nbits);
     /**
      * Return the chunk success rate of the differential encoded QPSK.
      *
-     * \param sinr the SINR ratio (not dB) of the chunk
-     * \param nbits the size of the chunk
+     * @param sinr the SINR ratio (not dB) of the chunk
+     * @param nbits the size of the chunk
      *
-     * \return the chunk success rate of the differential encoded QPSK.
+     * @return the chunk success rate of the differential encoded QPSK.
      */
     static double GetDsssDqpskSuccessRate(double sinr, uint64_t nbits);
     /**
      * Return the chunk success rate of the differential encoded QPSK for
      * 5.5Mbps data rate.
      *
-     * \param sinr the SINR ratio (not dB) of the chunk
-     * \param nbits the size of the chunk
+     * @param sinr the SINR ratio (not dB) of the chunk
+     * @param nbits the size of the chunk
      *
-     * \return the chunk success rate of the differential encoded QPSK for
+     * @return the chunk success rate of the differential encoded QPSK for
      */
     static double GetDsssDqpskCck5_5SuccessRate(double sinr, uint64_t nbits);
     /**
      * Return the chunk success rate of the differential encoded QPSK for
      * 11Mbps data rate.
      *
-     * \param sinr the SINR ratio (not dB) of the chunk
-     * \param nbits the size of the chunk
+     * @param sinr the SINR ratio (not dB) of the chunk
+     * @param nbits the size of the chunk
      *
-     * \return the chunk success rate of the differential encoded QPSK for
+     * @return the chunk success rate of the differential encoded QPSK for
      */
     static double GetDsssDqpskCck11SuccessRate(double sinr, uint64_t nbits);
 #ifdef HAVE_GSL
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/non-ht/dsss-parameter-set.h ns-3.44/src/wifi/model/non-ht/dsss-parameter-set.h
--- ns-3.43/src/wifi/model/non-ht/dsss-parameter-set.h	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/non-ht/dsss-parameter-set.h	2025-03-09 16:55:49.795372700 -0700
@@ -15,8 +15,8 @@
 {
 
 /**
- * \brief The DSSS Parameter Set
- * \ingroup wifi
+ * @brief The DSSS Parameter Set
+ * @ingroup wifi
  *
  * This class knows how to serialise and deserialise the DSSS Parameter Set.
  */
@@ -31,7 +31,7 @@
     /**
      * Set the Current Channel field in the DsssParameterSet information element.
      *
-     * \param currentChannel the CurrentChannel field in the DsssParameterSet information element
+     * @param currentChannel the CurrentChannel field in the DsssParameterSet information element
      */
     void SetCurrentChannel(uint8_t currentChannel);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/non-ht/dsss-phy.cc ns-3.44/src/wifi/model/non-ht/dsss-phy.cc
--- ns-3.43/src/wifi/model/non-ht/dsss-phy.cc	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/non-ht/dsss-phy.cc	2025-03-09 16:55:49.795372700 -0700
@@ -60,7 +60,7 @@
 /**
  * Get the array of possible DSSS rates.
  *
- * \return the DSSS rates in bits per second
+ * @return the DSSS rates in bits per second
  */
 const std::array<uint64_t, 4>&
 GetDsssRatesBpsList()
@@ -142,7 +142,7 @@
 DsssPhy::GetPreambleDuration(const WifiTxVector& txVector) const
 {
     if (txVector.GetPreambleType() == WIFI_PREAMBLE_SHORT &&
-        (txVector.GetMode().GetDataRate(22) > 1000000))
+        (txVector.GetMode().GetDataRate(MHz_u{22}) > 1000000))
     {
         // Section 16.2.2.3 "Short PPDU format" Figure 16-2 "Short PPDU format"; IEEE Std
         // 802.11-2016
@@ -159,7 +159,7 @@
 DsssPhy::GetHeaderDuration(const WifiTxVector& txVector) const
 {
     if (txVector.GetPreambleType() == WIFI_PREAMBLE_SHORT &&
-        (txVector.GetMode().GetDataRate(22) > 1000000))
+        (txVector.GetMode().GetDataRate(MHz_u{22}) > 1000000))
     {
         // Section 16.2.2.3 "Short PPDU format" and Figure 16-2 "Short PPDU format"; IEEE Std
         // 802.11-2016
@@ -183,7 +183,8 @@
                             double& /* totalAmpduNumSymbols */,
                             uint16_t /* staId */) const
 {
-    return MicroSeconds(lrint(ceil((size * 8.0) / (txVector.GetMode().GetDataRate(22) / 1.0e6))));
+    return MicroSeconds(
+        lrint(ceil((size * 8.0) / (txVector.GetMode().GetDataRate(MHz_u{22}) / 1.0e6))));
 }
 
 Ptr<WifiPpdu>
@@ -236,7 +237,7 @@
 MHz_u
 DsssPhy::GetRxChannelWidth(const WifiTxVector& txVector) const
 {
-    if (m_wifiPhy->GetChannelWidth() > 20)
+    if (m_wifiPhy->GetChannelWidth() > MHz_u{20})
     {
         /*
          * This is a workaround necessary with HE-capable PHYs,
@@ -244,7 +245,7 @@
          * Without this hack, SpectrumWifiPhy::GetBand will crash.
          * FIXME: see issue #402 for a better solution.
          */
-        return 20;
+        return MHz_u{20};
     }
     return PhyEntity::GetRxChannelWidth(txVector);
 }
@@ -252,7 +253,7 @@
 MHz_u
 DsssPhy::GetMeasurementChannelWidth(const Ptr<const WifiPpdu> ppdu) const
 {
-    return ppdu ? GetRxChannelWidth(ppdu->GetTxVector()) : 22;
+    return ppdu ? GetRxChannelWidth(ppdu->GetTxVector()) : MHz_u{22};
 }
 
 Ptr<SpectrumValue>
@@ -263,7 +264,7 @@
     const auto& txVector = ppdu->GetTxVector();
     const auto channelWidth = txVector.GetChannelWidth();
     NS_LOG_FUNCTION(this << centerFrequencies.front() << channelWidth << txPower);
-    NS_ABORT_MSG_IF(channelWidth != 22, "Invalid channel width for DSSS");
+    NS_ABORT_MSG_IF(channelWidth != MHz_u{22}, "Invalid channel width for DSSS");
     auto v =
         WifiSpectrumValueHelper::CreateDsssTxPowerSpectralDensity(centerFrequencies.front(),
                                                                   txPower,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/non-ht/dsss-phy.h ns-3.44/src/wifi/model/non-ht/dsss-phy.h
--- ns-3.43/src/wifi/model/non-ht/dsss-phy.h	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/non-ht/dsss-phy.h	2025-03-09 16:55:49.795372700 -0700
@@ -16,8 +16,8 @@
 #include <vector>
 
 /**
- * \file
- * \ingroup wifi
+ * @file
+ * @ingroup wifi
  * Declaration of ns3::DsssPhy class.
  */
 
@@ -25,8 +25,8 @@
 {
 
 /**
- * \brief PHY entity for HR/DSSS (11b)
- * \ingroup wifi
+ * @brief PHY entity for HR/DSSS (11b)
+ * @ingroup wifi
  *
  * Refer to IEEE 802.11-2016, clause 16 (HR/DSSS).
  * Note that DSSS rates (clause 15) are a subset
@@ -68,32 +68,32 @@
      * Return a WifiMode for HR/DSSS
      * corresponding to the provided rate.
      *
-     * \param rate the rate in bps
-     * \return a WifiMode for HR/DSSS
+     * @param rate the rate in bps
+     * @return a WifiMode for HR/DSSS
      */
     static WifiMode GetDsssRate(uint64_t rate);
     /**
      * Return a WifiMode for DSSS at 1 Mbps.
      *
-     * \return a WifiMode for DSSS at 1 Mbps
+     * @return a WifiMode for DSSS at 1 Mbps
      */
     static WifiMode GetDsssRate1Mbps();
     /**
      * Return a WifiMode for DSSS at 2 Mbps.
      *
-     * \return a WifiMode for DSSS at 2 Mbps
+     * @return a WifiMode for DSSS at 2 Mbps
      */
     static WifiMode GetDsssRate2Mbps();
     /**
      * Return a WifiMode for HR/DSSS at 5.5 Mbps.
      *
-     * \return a WifiMode for HR/DSSS at 5.5 Mbps
+     * @return a WifiMode for HR/DSSS at 5.5 Mbps
      */
     static WifiMode GetDsssRate5_5Mbps();
     /**
      * Return a WifiMode for HR/DSSS at 11 Mbps.
      *
-     * \return a WifiMode for HR/DSSS at 11 Mbps
+     * @return a WifiMode for HR/DSSS at 11 Mbps
      */
     static WifiMode GetDsssRate11Mbps();
 
@@ -102,8 +102,8 @@
      * name using ModulationLookupTable. This is mainly used as a
      * callback for WifiMode operation.
      *
-     * \param name the unique name of the DSSS or HR/DSSS mode
-     * \return WifiCodeRate corresponding to the unique name
+     * @param name the unique name of the DSSS or HR/DSSS mode
+     * @return WifiCodeRate corresponding to the unique name
      */
     static WifiCodeRate GetCodeRate(const std::string& name);
     /**
@@ -111,8 +111,8 @@
      * unique name using ModulationLookupTable. This is mainly used
      * as a callback for WifiMode operation.
      *
-     * \param name the unique name of the DSSS or HR/DSSS mode
-     * \return constellation size corresponding to the unique name
+     * @param name the unique name of the DSSS or HR/DSSS mode
+     * @return constellation size corresponding to the unique name
      */
     static uint16_t GetConstellationSize(const std::string& name);
     /**
@@ -121,9 +121,9 @@
      * This function is mainly used as a callback
      * for WifiMode operation.
      *
-     * \param txVector the TXVECTOR used for the transmission
-     * \param staId the station ID (only here to have a common signature for all callbacks)
-     * \return the data bit rate in bps.
+     * @param txVector the TXVECTOR used for the transmission
+     * @param staId the station ID (only here to have a common signature for all callbacks)
+     * @return the data bit rate in bps.
      */
     static uint64_t GetDataRateFromTxVector(const WifiTxVector& txVector, uint16_t staId);
     /**
@@ -131,19 +131,19 @@
      * the supplied parameters. This function is mainly used as a callback
      * for WifiMode operation.
      *
-     * \param name the unique name of the DSSS or HR/DSSS mode
-     * \param modClass the modulation class, must be either WIFI_MOD_CLASS_DSSS or
+     * @param name the unique name of the DSSS or HR/DSSS mode
+     * @param modClass the modulation class, must be either WIFI_MOD_CLASS_DSSS or
      * WIFI_MOD_CLASS_HR_DSSS
      *
-     * \return the data bit rate of this signal in bps.
+     * @return the data bit rate of this signal in bps.
      */
     static uint64_t GetDataRate(const std::string& name, WifiModulationClass modClass);
     /**
      * Check whether the combination in TXVECTOR is allowed.
      * This function is used as a callback for WifiMode operation.
      *
-     * \param txVector the TXVECTOR
-     * \returns true if this combination is allowed, false otherwise.
+     * @param txVector the TXVECTOR
+     * @returns true if this combination is allowed, false otherwise.
      */
     static bool IsAllowed(const WifiTxVector& txVector);
 
@@ -155,21 +155,21 @@
     MHz_u GetMeasurementChannelWidth(const Ptr<const WifiPpdu> ppdu) const override;
 
     /**
-     * \param txVector the transmission parameters
-     * \return the WifiMode used for the PHY header field
+     * @param txVector the transmission parameters
+     * @return the WifiMode used for the PHY header field
      */
     WifiMode GetHeaderMode(const WifiTxVector& txVector) const;
 
     /**
-     * \param txVector the transmission parameters
-     * \return the duration of the PHY preamble field
+     * @param txVector the transmission parameters
+     * @return the duration of the PHY preamble field
      *
-     * \see WIFI_PPDU_FIELD_PREAMBLE
+     * @see WIFI_PPDU_FIELD_PREAMBLE
      */
     Time GetPreambleDuration(const WifiTxVector& txVector) const;
     /**
-     * \param txVector the transmission parameters
-     * \return the duration of the PHY header field
+     * @param txVector the transmission parameters
+     * @return the duration of the PHY header field
      */
     Time GetHeaderDuration(const WifiTxVector& txVector) const;
 
@@ -177,8 +177,8 @@
      * End receiving the header, perform DSSS-specific actions, and
      * provide the status of the reception.
      *
-     * \param event the event holding incoming PPDU's information
-     * \return status of the reception of the header
+     * @param event the event holding incoming PPDU's information
+     * @return status of the reception of the header
      */
     PhyFieldRxStatus EndReceiveHeader(Ptr<Event> event);
 
@@ -187,10 +187,10 @@
      * must already be contained inside ModulationLookupTable.
      * This method binds all the callbacks used by WifiMode.
      *
-     * \param uniqueName the unique name of the WifiMode
-     * \param modClass the modulation class of the WifiMode, must be either WIFI_MOD_CLASS_DSSS or
+     * @param uniqueName the unique name of the WifiMode
+     * @param modClass the modulation class of the WifiMode, must be either WIFI_MOD_CLASS_DSSS or
      * WIFI_MOD_CLASS_HR_DSSS
-     * \return the DSSS or HR/DSSS WifiMode
+     * @return the DSSS or HR/DSSS WifiMode
      */
     static WifiMode CreateDsssMode(std::string uniqueName, WifiModulationClass modClass);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/non-ht/dsss-ppdu.cc ns-3.44/src/wifi/model/non-ht/dsss-ppdu.cc
--- ns-3.43/src/wifi/model/non-ht/dsss-ppdu.cc	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/non-ht/dsss-ppdu.cc	2025-03-09 16:55:49.795372700 -0700
@@ -45,7 +45,7 @@
                         const WifiTxVector& txVector,
                         Time ppduDuration) const
 {
-    dsssSig.SetRate(txVector.GetMode().GetDataRate(22));
+    dsssSig.SetRate(txVector.GetMode().GetDataRate(MHz_u{22}));
     Time psduDuration = ppduDuration - WifiPhy::CalculatePhyPreambleAndHeaderDuration(txVector);
     dsssSig.SetLength(psduDuration.GetMicroSeconds());
 }
@@ -55,7 +55,7 @@
 {
     WifiTxVector txVector;
     txVector.SetPreambleType(m_preamble);
-    txVector.SetChannelWidth(22);
+    txVector.SetChannelWidth(MHz_u{22});
     SetTxVectorFromDsssHeader(txVector, m_dsssSig);
     return txVector;
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/non-ht/dsss-ppdu.h ns-3.44/src/wifi/model/non-ht/dsss-ppdu.h
--- ns-3.43/src/wifi/model/non-ht/dsss-ppdu.h	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/non-ht/dsss-ppdu.h	2025-03-09 16:55:49.795372700 -0700
@@ -14,8 +14,8 @@
 #include "ns3/wifi-ppdu.h"
 
 /**
- * \file
- * \ingroup wifi
+ * @file
+ * @ingroup wifi
  * Declaration of ns3::DsssPpdu class.
  */
 
@@ -25,8 +25,8 @@
 class WifiPsdu;
 
 /**
- * \brief DSSS (HR/DSSS) PPDU (11b)
- * \ingroup wifi
+ * @brief DSSS (HR/DSSS) PPDU (11b)
+ * @ingroup wifi
  *
  * DsssPpdu stores a preamble, PHY headers and a PSDU of a PPDU with DSSS modulation.
  */
@@ -45,25 +45,25 @@
         /**
          * Fill the RATE field of L-SIG (in bit/s).
          *
-         * \param rate the RATE field of L-SIG expressed in bit/s
+         * @param rate the RATE field of L-SIG expressed in bit/s
          */
         void SetRate(uint64_t rate);
         /**
          * Return the RATE field of L-SIG (in bit/s).
          *
-         * \return the RATE field of L-SIG expressed in bit/s
+         * @return the RATE field of L-SIG expressed in bit/s
          */
         uint64_t GetRate() const;
         /**
          * Fill the LENGTH field of L-SIG (in bytes).
          *
-         * \param length the LENGTH field of L-SIG expressed in bytes
+         * @param length the LENGTH field of L-SIG expressed in bytes
          */
         void SetLength(uint16_t length);
         /**
          * Return the LENGTH field of L-SIG (in bytes).
          *
-         * \return the LENGTH field of L-SIG expressed in bytes
+         * @return the LENGTH field of L-SIG expressed in bytes
          */
         uint16_t GetLength() const;
 
@@ -75,11 +75,11 @@
     /**
      * Create a DSSS (HR/DSSS) PPDU.
      *
-     * \param psdu the PHY payload (PSDU)
-     * \param txVector the TXVECTOR that was used for this PPDU
-     * \param channel the operating channel of the PHY used to transmit this PPDU
-     * \param ppduDuration the transmission duration of this PPDU
-     * \param uid the unique ID of this PPDU
+     * @param psdu the PHY payload (PSDU)
+     * @param txVector the TXVECTOR that was used for this PPDU
+     * @param channel the operating channel of the PHY used to transmit this PPDU
+     * @param ppduDuration the transmission duration of this PPDU
+     * @param uid the unique ID of this PPDU
      */
     DsssPpdu(Ptr<const WifiPsdu> psdu,
              const WifiTxVector& txVector,
@@ -96,17 +96,17 @@
     /**
      * Fill in the PHY headers.
      *
-     * \param txVector the TXVECTOR that was used for this PPDU
-     * \param ppduDuration the transmission duration of this PPDU
+     * @param txVector the TXVECTOR that was used for this PPDU
+     * @param ppduDuration the transmission duration of this PPDU
      */
     void SetPhyHeaders(const WifiTxVector& txVector, Time ppduDuration);
 
     /**
      * Fill in the DSSS header.
      *
-     * \param dsssSig the DSSS header to fill in
-     * \param txVector the TXVECTOR that was used for this PPDU
-     * \param ppduDuration the transmission duration of this PPDU
+     * @param dsssSig the DSSS header to fill in
+     * @param txVector the TXVECTOR that was used for this PPDU
+     * @param ppduDuration the transmission duration of this PPDU
      */
     void SetDsssHeader(DsssSigHeader& dsssSig,
                        const WifiTxVector& txVector,
@@ -115,8 +115,8 @@
     /**
      * Fill in the TXVECTOR from DSSS header.
      *
-     * \param txVector the TXVECTOR to fill in
-     * \param dsssSig the DSSS header
+     * @param txVector the TXVECTOR to fill in
+     * @param dsssSig the DSSS header
      */
     virtual void SetTxVectorFromDsssHeader(WifiTxVector& txVector,
                                            const DsssSigHeader& dsssSig) const;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/non-ht/erp-information.h ns-3.44/src/wifi/model/non-ht/erp-information.h
--- ns-3.43/src/wifi/model/non-ht/erp-information.h	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/non-ht/erp-information.h	2025-03-09 16:55:49.795372700 -0700
@@ -15,8 +15,8 @@
 {
 
 /**
- * \brief The ErpInformation Information Element
- * \ingroup wifi
+ * @brief The ErpInformation Information Element
+ * @ingroup wifi
  *
  * This class knows how to serialise and deserialise the ErpInformation Information Element.
  */
@@ -34,39 +34,39 @@
     /**
      * Set the Barker_Preamble_Mode field in the ErpInformation information element.
      *
-     * \param barkerPreambleMode the Barker_Preamble_Mode field in the ErpInformation information
+     * @param barkerPreambleMode the Barker_Preamble_Mode field in the ErpInformation information
      * element
      */
     void SetBarkerPreambleMode(uint8_t barkerPreambleMode);
     /**
      * Set the Use_Protection field in the ErpInformation information element.
      *
-     * \param useProtection the Use_Protection field in the ErpInformation information element
+     * @param useProtection the Use_Protection field in the ErpInformation information element
      */
     void SetUseProtection(uint8_t useProtection);
     /**
      * Set the Non_Erp_Present field in the ErpInformation information element.
      *
-     * \param nonErpPresent the Non_Erp_Present field in the ErpInformation information element
+     * @param nonErpPresent the Non_Erp_Present field in the ErpInformation information element
      */
     void SetNonErpPresent(uint8_t nonErpPresent);
 
     /**
      * Return the Barker_Preamble_Mode field in the ErpInformation information element.
      *
-     * \return the Barker_Preamble_Mode field in the ErpInformation information element
+     * @return the Barker_Preamble_Mode field in the ErpInformation information element
      */
     uint8_t GetBarkerPreambleMode() const;
     /**
      * Return the Use_Protection field in the ErpInformation information element.
      *
-     * \return the Use_Protection field in the ErpInformation information element
+     * @return the Use_Protection field in the ErpInformation information element
      */
     uint8_t GetUseProtection() const;
     /**
      * Return the Non_Erp_Present field in the ErpInformation information element.
      *
-     * \return the Non_Erp_Present field in the ErpInformation information element
+     * @return the Non_Erp_Present field in the ErpInformation information element
      */
     uint8_t GetNonErpPresent() const;
 
@@ -77,10 +77,10 @@
 /**
  * output stream output operator
  *
- * \param os output stream
- * \param erpInformation the ERP Information
+ * @param os output stream
+ * @param erpInformation the ERP Information
  *
- * \returns output stream
+ * @returns output stream
  */
 std::ostream& operator<<(std::ostream& os, const ErpInformation& erpInformation);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/non-ht/erp-ofdm-phy.cc ns-3.44/src/wifi/model/non-ht/erp-ofdm-phy.cc
--- ns-3.43/src/wifi/model/non-ht/erp-ofdm-phy.cc	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/non-ht/erp-ofdm-phy.cc	2025-03-09 16:55:49.795372700 -0700
@@ -55,7 +55,7 @@
 /**
  * Get the array of possible ERP OFDM rates.
  *
- * \return the ERP OFDM rates in bits per second
+ * @return the ERP OFDM rates in bits per second
  */
 const std::array<uint64_t, 8>&
 GetErpOfdmRatesBpsList()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/non-ht/erp-ofdm-phy.h ns-3.44/src/wifi/model/non-ht/erp-ofdm-phy.h
--- ns-3.43/src/wifi/model/non-ht/erp-ofdm-phy.h	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/non-ht/erp-ofdm-phy.h	2025-03-09 16:55:49.795372700 -0700
@@ -14,8 +14,8 @@
 #include "ofdm-phy.h"
 
 /**
- * \file
- * \ingroup wifi
+ * @file
+ * @ingroup wifi
  * Declaration of ns3::ErpOfdmPhy class.
  */
 
@@ -23,8 +23,8 @@
 {
 
 /**
- * \brief PHY entity for ERP-OFDM (11g)
- * \ingroup wifi
+ * @brief PHY entity for ERP-OFDM (11g)
+ * @ingroup wifi
  *
  * ERP-OFDM PHY is based on OFDM PHY.
  * ERP-DSSS/CCK mode is not supported.
@@ -56,57 +56,57 @@
      * Return a WifiMode for ERP-OFDM
      * corresponding to the provided rate.
      *
-     * \param rate the rate in bps
-     * \return a WifiMode for ERP-OFDM
+     * @param rate the rate in bps
+     * @return a WifiMode for ERP-OFDM
      */
     static WifiMode GetErpOfdmRate(uint64_t rate);
 
     /**
      * Return a WifiMode for ERP-OFDM at 6 Mbps.
      *
-     * \return a WifiMode for ERP-OFDM at 6 Mbps
+     * @return a WifiMode for ERP-OFDM at 6 Mbps
      */
     static WifiMode GetErpOfdmRate6Mbps();
     /**
      * Return a WifiMode for ERP-OFDM at 9 Mbps.
      *
-     * \return a WifiMode for ERP-OFDM at 9 Mbps
+     * @return a WifiMode for ERP-OFDM at 9 Mbps
      */
     static WifiMode GetErpOfdmRate9Mbps();
     /**
      * Return a WifiMode for ERP-OFDM at 12 Mbps.
      *
-     * \return a WifiMode for ERP-OFDM at 12 Mbps
+     * @return a WifiMode for ERP-OFDM at 12 Mbps
      */
     static WifiMode GetErpOfdmRate12Mbps();
     /**
      * Return a WifiMode for ERP-OFDM at 18 Mbps.
      *
-     * \return a WifiMode for ERP-OFDM at 18 Mbps
+     * @return a WifiMode for ERP-OFDM at 18 Mbps
      */
     static WifiMode GetErpOfdmRate18Mbps();
     /**
      * Return a WifiMode for ERP-OFDM at 24 Mbps.
      *
-     * \return a WifiMode for ERP-OFDM at 24 Mbps
+     * @return a WifiMode for ERP-OFDM at 24 Mbps
      */
     static WifiMode GetErpOfdmRate24Mbps();
     /**
      * Return a WifiMode for ERP-OFDM at 36 Mbps.
      *
-     * \return a WifiMode for ERP-OFDM at 36 Mbps
+     * @return a WifiMode for ERP-OFDM at 36 Mbps
      */
     static WifiMode GetErpOfdmRate36Mbps();
     /**
      * Return a WifiMode for ERP-OFDM at 48 Mbps.
      *
-     * \return a WifiMode for ERP-OFDM at 48 Mbps
+     * @return a WifiMode for ERP-OFDM at 48 Mbps
      */
     static WifiMode GetErpOfdmRate48Mbps();
     /**
      * Return a WifiMode for ERP-OFDM at 54 Mbps.
      *
-     * \return a WifiMode for ERP-OFDM at 54 Mbps
+     * @return a WifiMode for ERP-OFDM at 54 Mbps
      */
     static WifiMode GetErpOfdmRate54Mbps();
 
@@ -115,8 +115,8 @@
      * ModulationLookupTable. This is mainly used as a callback for
      * WifiMode operation.
      *
-     * \param name the unique name of the ERP-OFDM mode
-     * \return WifiCodeRate corresponding to the unique name
+     * @param name the unique name of the ERP-OFDM mode
+     * @return WifiCodeRate corresponding to the unique name
      */
     static WifiCodeRate GetCodeRate(const std::string& name);
     /**
@@ -124,8 +124,8 @@
      * ModulationLookupTable. This is mainly used as a callback for
      * WifiMode operation.
      *
-     * \param name the unique name of the ERP-OFDM mode
-     * \return constellation size corresponding to the unique name
+     * @param name the unique name of the ERP-OFDM mode
+     * @return constellation size corresponding to the unique name
      */
     static uint16_t GetConstellationSize(const std::string& name);
     /**
@@ -133,10 +133,10 @@
      * the supplied parameters. This function calls OfdmPhy::CalculatePhyRate
      * and is mainly used as a callback for WifiMode operation.
      *
-     * \param name the unique name of the ERP-OFDM mode
-     * \param channelWidth the considered channel width
+     * @param name the unique name of the ERP-OFDM mode
+     * @param channelWidth the considered channel width
      *
-     * \return the physical bit rate of this signal in bps.
+     * @return the physical bit rate of this signal in bps.
      */
     static uint64_t GetPhyRate(const std::string& name, MHz_u channelWidth);
     /**
@@ -145,9 +145,9 @@
      * This function is mainly used as a callback
      * for WifiMode operation.
      *
-     * \param txVector the TXVECTOR used for the transmission
-     * \param staId the station ID (only here to have a common signature for all callbacks)
-     * \return the physical bit rate of this signal in bps.
+     * @param txVector the TXVECTOR used for the transmission
+     * @param staId the station ID (only here to have a common signature for all callbacks)
+     * @return the physical bit rate of this signal in bps.
      */
     static uint64_t GetPhyRateFromTxVector(const WifiTxVector& txVector, uint16_t staId);
     /**
@@ -156,9 +156,9 @@
      * This function is mainly used as a callback
      * for WifiMode operation.
      *
-     * \param txVector the TXVECTOR used for the transmission
-     * \param staId the station ID (only here to have a common signature for all callbacks)
-     * \return the data bit rate in bps.
+     * @param txVector the TXVECTOR used for the transmission
+     * @param staId the station ID (only here to have a common signature for all callbacks)
+     * @return the data bit rate in bps.
      */
     static uint64_t GetDataRateFromTxVector(const WifiTxVector& txVector, uint16_t staId);
     /**
@@ -166,18 +166,18 @@
      * the supplied parameters. This function calls OfdmPhy::CalculateDataRate
      * and is mainly used as a callback for WifiMode operation.
      *
-     * \param name the unique name of the ERP-OFDM mode
-     * \param channelWidth the considered channel width
+     * @param name the unique name of the ERP-OFDM mode
+     * @param channelWidth the considered channel width
      *
-     * \return the data bit rate of this signal in bps.
+     * @return the data bit rate of this signal in bps.
      */
     static uint64_t GetDataRate(const std::string& name, MHz_u channelWidth);
     /**
      * Check whether the combination in TXVECTOR is allowed.
      * This function is used as a callback for WifiMode operation.
      *
-     * \param txVector the TXVECTOR
-     * \returns true if this combination is allowed, false otherwise.
+     * @param txVector the TXVECTOR
+     * @returns true if this combination is allowed, false otherwise.
      */
     static bool IsAllowed(const WifiTxVector& txVector);
 
@@ -191,9 +191,9 @@
      * must already be contained inside ModulationLookupTable.
      * This method binds all the callbacks used by WifiMode.
      *
-     * \param uniqueName the unique name of the WifiMode
-     * \param isMandatory whether the WifiMode is mandatory
-     * \return the ERP-OFDM WifiMode
+     * @param uniqueName the unique name of the WifiMode
+     * @param isMandatory whether the WifiMode is mandatory
+     * @return the ERP-OFDM WifiMode
      */
     static WifiMode CreateErpOfdmMode(std::string uniqueName, bool isMandatory);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/non-ht/erp-ofdm-ppdu.cc ns-3.44/src/wifi/model/non-ht/erp-ofdm-ppdu.cc
--- ns-3.43/src/wifi/model/non-ht/erp-ofdm-ppdu.cc	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/non-ht/erp-ofdm-ppdu.cc	2025-03-09 16:55:49.795372700 -0700
@@ -33,7 +33,7 @@
 ErpOfdmPpdu::SetTxVectorFromLSigHeader(WifiTxVector& txVector, const LSigHeader& lSig) const
 {
     txVector.SetMode(ErpOfdmPhy::GetErpOfdmRate(lSig.GetRate()));
-    txVector.SetChannelWidth(20);
+    txVector.SetChannelWidth(MHz_u{20});
 }
 
 Ptr<WifiPpdu>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/non-ht/erp-ofdm-ppdu.h ns-3.44/src/wifi/model/non-ht/erp-ofdm-ppdu.h
--- ns-3.43/src/wifi/model/non-ht/erp-ofdm-ppdu.h	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/non-ht/erp-ofdm-ppdu.h	2025-03-09 16:55:49.795372700 -0700
@@ -13,8 +13,8 @@
 #include "ofdm-ppdu.h"
 
 /**
- * \file
- * \ingroup wifi
+ * @file
+ * @ingroup wifi
  * Declaration of ns3::ErpOfdmPpdu class.
  */
 
@@ -24,8 +24,8 @@
 class WifiPsdu;
 
 /**
- * \brief ERP-OFDM PPDU (11g)
- * \ingroup wifi
+ * @brief ERP-OFDM PPDU (11g)
+ * @ingroup wifi
  *
  * ErpOfdmPpdu stores a preamble, PHY headers and a PSDU of a PPDU with non-HT header,
  * i.e., PPDU that uses ERP-OFDM modulation.
@@ -36,10 +36,10 @@
     /**
      * Create an ERP-OFDM PPDU.
      *
-     * \param psdu the PHY payload (PSDU)
-     * \param txVector the TXVECTOR that was used for this PPDU
-     * \param channel the operating channel of the PHY used to transmit this PPDU
-     * \param uid the unique ID of this PPDU
+     * @param psdu the PHY payload (PSDU)
+     * @param txVector the TXVECTOR that was used for this PPDU
+     * @param channel the operating channel of the PHY used to transmit this PPDU
+     * @param uid the unique ID of this PPDU
      */
     ErpOfdmPpdu(Ptr<const WifiPsdu> psdu,
                 const WifiTxVector& txVector,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/non-ht/ofdm-phy.cc ns-3.44/src/wifi/model/non-ht/ofdm-phy.cc
--- ns-3.43/src/wifi/model/non-ht/ofdm-phy.cc	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/non-ht/ofdm-phy.cc	2025-03-09 16:55:49.795372700 -0700
@@ -71,13 +71,13 @@
 
 /// OFDM rates in bits per second for each bandwidth
 const std::map<MHz_u, std::array<uint64_t, 8> > s_ofdmRatesBpsList =
-   {{ 20, // MHz
+   {{ MHz_u{20},
      {  6000000,  9000000, 12000000, 18000000,
        24000000, 36000000, 48000000, 54000000 }},
-   { 10, // MHz
+   { MHz_u{10},
      {  3000000,  4500000,  6000000,  9000000,
        12000000, 18000000, 24000000, 27000000 }},
-   { 5, // MHz
+   { MHz_u{5},
      {  1500000,  2250000,  3000000,  4500000,
         6000000,  9000000, 12000000, 13500000 }},
 };
@@ -87,7 +87,7 @@
 /**
  * Get the array of possible OFDM rates for each bandwidth.
  *
- * \return the OFDM rates in bits per second
+ * @return the OFDM rates in bits per second
  */
 const std::map<MHz_u, std::array<uint64_t, 8>>&
 GetOfdmRatesBpsList()
@@ -106,25 +106,25 @@
         switch (variant)
         {
         case OFDM_PHY_DEFAULT:
-            for (const auto& rate : bwRatesMap.at(20))
+            for (const auto& rate : bwRatesMap.at(MHz_u{20}))
             {
-                WifiMode mode = GetOfdmRate(rate, 20);
+                WifiMode mode = GetOfdmRate(rate, MHz_u{20});
                 NS_LOG_LOGIC("Add " << mode << " to list");
                 m_modeList.emplace_back(mode);
             }
             break;
         case OFDM_PHY_10_MHZ:
-            for (const auto& rate : bwRatesMap.at(10))
+            for (const auto& rate : bwRatesMap.at(MHz_u{10}))
             {
-                WifiMode mode = GetOfdmRate(rate, 10);
+                WifiMode mode = GetOfdmRate(rate, MHz_u{10});
                 NS_LOG_LOGIC("Add " << mode << " to list");
                 m_modeList.emplace_back(mode);
             }
             break;
         case OFDM_PHY_5_MHZ:
-            for (const auto& rate : bwRatesMap.at(5))
+            for (const auto& rate : bwRatesMap.at(MHz_u{5}))
             {
-                WifiMode mode = GetOfdmRate(rate, 5);
+                WifiMode mode = GetOfdmRate(rate, MHz_u{5});
                 NS_LOG_LOGIC("Add " << mode << " to list");
                 m_modeList.emplace_back(mode);
             }
@@ -334,7 +334,7 @@
 OfdmPhy::IsChannelWidthSupported(Ptr<const WifiPpdu> ppdu) const
 {
     const auto channelWidth = ppdu->GetTxVector().GetChannelWidth();
-    if ((channelWidth >= 40) && (channelWidth > m_wifiPhy->GetChannelWidth()))
+    if ((channelWidth >= MHz_u{40}) && (channelWidth > m_wifiPhy->GetChannelWidth()))
     {
         NS_LOG_DEBUG("Packet reception could not be started because not enough channel width ("
                      << channelWidth << " vs " << m_wifiPhy->GetChannelWidth() << ")");
@@ -631,11 +631,11 @@
 {
     Time symbolDuration = MicroSeconds(4);
     uint8_t bwFactor = 1;
-    if (channelWidth == 10)
+    if (channelWidth == MHz_u{10})
     {
         bwFactor = 2;
     }
-    else if (channelWidth == 5)
+    else if (channelWidth == MHz_u{5})
     {
         bwFactor = 4;
     }
@@ -659,7 +659,7 @@
 {
     if (!ppdu)
     {
-        return std::min<MHz_u>(m_wifiPhy->GetChannelWidth(), 20);
+        return std::min(m_wifiPhy->GetChannelWidth(), MHz_u{20});
     }
     return GetRxChannelWidth(ppdu->GetTxVector());
 }
@@ -667,11 +667,11 @@
 dBm_u
 OfdmPhy::GetCcaThreshold(const Ptr<const WifiPpdu> ppdu, WifiChannelListType channelType) const
 {
-    if (ppdu && ppdu->GetTxVector().GetChannelWidth() < 20)
+    if (ppdu && ppdu->GetTxVector().GetChannelWidth() < MHz_u{20})
     {
         // scale CCA sensitivity threshold for BW of 5 and 10 MHz
         const auto bw = GetRxChannelWidth(ppdu->GetTxVector());
-        const auto thresholdW = DbmToW(m_wifiPhy->GetCcaSensitivityThreshold()) * (bw / 20.0);
+        const auto thresholdW = DbmToW(m_wifiPhy->GetCcaSensitivityThreshold()) * (bw / MHz_u{20});
         return WToDbm(thresholdW);
     }
     return PhyEntity::GetCcaThreshold(ppdu, channelType);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/non-ht/ofdm-phy.h ns-3.44/src/wifi/model/non-ht/ofdm-phy.h
--- ns-3.43/src/wifi/model/non-ht/ofdm-phy.h	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/non-ht/ofdm-phy.h	2025-03-09 16:55:49.795372700 -0700
@@ -14,8 +14,8 @@
 #include "ns3/phy-entity.h"
 
 /**
- * \file
- * \ingroup wifi
+ * @file
+ * @ingroup wifi
  * Declaration of ns3::OfdmPhy class
  * and ns3::OfdmPhyVariant enum.
  */
@@ -24,10 +24,10 @@
 {
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * The OFDM (11a) PHY variants.
  *
- * \see OfdmPhy
+ * @see OfdmPhy
  */
 enum OfdmPhyVariant
 {
@@ -37,8 +37,8 @@
 };
 
 /**
- * \brief PHY entity for OFDM (11a)
- * \ingroup wifi
+ * @brief PHY entity for OFDM (11a)
+ * @ingroup wifi
  *
  * This class is also used for the 10 MHz and 5 MHz bandwidth
  * variants addressing vehicular communications (default is 20 MHz
@@ -52,8 +52,8 @@
     /**
      * Constructor for OFDM PHY
      *
-     * \param variant the OFDM PHY variant
-     * \param buildModeList flag used to add OFDM modes to list (disabled
+     * @param variant the OFDM PHY variant
+     * @param buildModeList flag used to add OFDM modes to list (disabled
      *                      by child classes to only add child classes' modes)
      */
     OfdmPhy(OfdmPhyVariant variant = OFDM_PHY_DEFAULT, bool buildModeList = true);
@@ -89,153 +89,153 @@
      * corresponding to the provided rate and
      * the channel bandwidth (20, 10, or 5 MHz).
      *
-     * \param rate the rate in bps
-     * \param bw the bandwidth
-     * \return a WifiMode for OFDM
+     * @param rate the rate in bps
+     * @param bw the bandwidth
+     * @return a WifiMode for OFDM
      */
-    static WifiMode GetOfdmRate(uint64_t rate, MHz_u bw = 20);
+    static WifiMode GetOfdmRate(uint64_t rate, MHz_u bw = MHz_u{20});
     /**
      * Return a WifiMode for OFDM at 6 Mbps.
      *
-     * \return a WifiMode for OFDM at 6 Mbps
+     * @return a WifiMode for OFDM at 6 Mbps
      */
     static WifiMode GetOfdmRate6Mbps();
     /**
      * Return a WifiMode for OFDM at 9 Mbps.
      *
-     * \return a WifiMode for OFDM at 9 Mbps
+     * @return a WifiMode for OFDM at 9 Mbps
      */
     static WifiMode GetOfdmRate9Mbps();
     /**
      * Return a WifiMode for OFDM at 12Mbps.
      *
-     * \return a WifiMode for OFDM at 12 Mbps
+     * @return a WifiMode for OFDM at 12 Mbps
      */
     static WifiMode GetOfdmRate12Mbps();
     /**
      * Return a WifiMode for OFDM at 18 Mbps.
      *
-     * \return a WifiMode for OFDM at 18 Mbps
+     * @return a WifiMode for OFDM at 18 Mbps
      */
     static WifiMode GetOfdmRate18Mbps();
     /**
      * Return a WifiMode for OFDM at 24 Mbps.
      *
-     * \return a WifiMode for OFDM at 24 Mbps
+     * @return a WifiMode for OFDM at 24 Mbps
      */
     static WifiMode GetOfdmRate24Mbps();
     /**
      * Return a WifiMode for OFDM at 36 Mbps.
      *
-     * \return a WifiMode for OFDM at 36 Mbps
+     * @return a WifiMode for OFDM at 36 Mbps
      */
     static WifiMode GetOfdmRate36Mbps();
     /**
      * Return a WifiMode for OFDM at 48 Mbps.
      *
-     * \return a WifiMode for OFDM at 48 Mbps
+     * @return a WifiMode for OFDM at 48 Mbps
      */
     static WifiMode GetOfdmRate48Mbps();
     /**
      * Return a WifiMode for OFDM at 54 Mbps.
      *
-     * \return a WifiMode for OFDM at 54 Mbps
+     * @return a WifiMode for OFDM at 54 Mbps
      */
     static WifiMode GetOfdmRate54Mbps();
     /**
      * Return a WifiMode for OFDM at 3 Mbps with 10 MHz channel spacing.
      *
-     * \return a WifiMode for OFDM at 3 Mbps with 10 MHz channel spacing
+     * @return a WifiMode for OFDM at 3 Mbps with 10 MHz channel spacing
      */
     static WifiMode GetOfdmRate3MbpsBW10MHz();
     /**
      * Return a WifiMode for OFDM at 4.5 Mbps with 10 MHz channel spacing.
      *
-     * \return a WifiMode for OFDM at 4.5 Mbps with 10 MHz channel spacing
+     * @return a WifiMode for OFDM at 4.5 Mbps with 10 MHz channel spacing
      */
     static WifiMode GetOfdmRate4_5MbpsBW10MHz();
     /**
      * Return a WifiMode for OFDM at 6 Mbps with 10 MHz channel spacing.
      *
-     * \return a WifiMode for OFDM at 6 Mbps with 10 MHz channel spacing
+     * @return a WifiMode for OFDM at 6 Mbps with 10 MHz channel spacing
      */
     static WifiMode GetOfdmRate6MbpsBW10MHz();
     /**
      * Return a WifiMode for OFDM at 9 Mbps with 10 MHz channel spacing.
      *
-     * \return a WifiMode for OFDM at 9 Mbps with 10 MHz channel spacing
+     * @return a WifiMode for OFDM at 9 Mbps with 10 MHz channel spacing
      */
     static WifiMode GetOfdmRate9MbpsBW10MHz();
     /**
      * Return a WifiMode for OFDM at 12 Mbps with 10 MHz channel spacing.
      *
-     * \return a WifiMode for OFDM at 12 Mbps with 10 MHz channel spacing
+     * @return a WifiMode for OFDM at 12 Mbps with 10 MHz channel spacing
      */
     static WifiMode GetOfdmRate12MbpsBW10MHz();
     /**
      * Return a WifiMode for OFDM at 18 Mbps with 10 MHz channel spacing.
      *
-     * \return a WifiMode for OFDM at 18 Mbps with 10 MHz channel spacing
+     * @return a WifiMode for OFDM at 18 Mbps with 10 MHz channel spacing
      */
     static WifiMode GetOfdmRate18MbpsBW10MHz();
     /**
      * Return a WifiMode for OFDM at 24 Mbps with 10 MHz channel spacing.
      *
-     * \return a WifiMode for OFDM at 24 Mbps with 10 MHz channel spacing
+     * @return a WifiMode for OFDM at 24 Mbps with 10 MHz channel spacing
      */
     static WifiMode GetOfdmRate24MbpsBW10MHz();
     /**
      * Return a WifiMode for OFDM at 27 Mbps with 10 MHz channel spacing.
      *
-     * \return a WifiMode for OFDM at 27 Mbps with 10 MHz channel spacing
+     * @return a WifiMode for OFDM at 27 Mbps with 10 MHz channel spacing
      */
     static WifiMode GetOfdmRate27MbpsBW10MHz();
     /**
      * Return a WifiMode for OFDM at 1.5 Mbps with 5 MHz channel spacing.
      *
-     * \return a WifiMode for OFDM at 1.5 Mbps with 5 MHz channel spacing
+     * @return a WifiMode for OFDM at 1.5 Mbps with 5 MHz channel spacing
      */
     static WifiMode GetOfdmRate1_5MbpsBW5MHz();
     /**
      * Return a WifiMode for OFDM at 2.25 Mbps with 5 MHz channel spacing.
      *
-     * \return a WifiMode for OFDM at 2.25 Mbps with 5 MHz channel spacing
+     * @return a WifiMode for OFDM at 2.25 Mbps with 5 MHz channel spacing
      */
     static WifiMode GetOfdmRate2_25MbpsBW5MHz();
     /**
      * Return a WifiMode for OFDM at 3 Mbps with 5 MHz channel spacing.
      *
-     * \return a WifiMode for OFDM at 3 Mbps with 5 MHz channel spacing
+     * @return a WifiMode for OFDM at 3 Mbps with 5 MHz channel spacing
      */
     static WifiMode GetOfdmRate3MbpsBW5MHz();
     /**
      * Return a WifiMode for OFDM at 4.5 Mbps with 5 MHz channel spacing.
      *
-     * \return a WifiMode for OFDM at 4.5 Mbps with 5 MHz channel spacing
+     * @return a WifiMode for OFDM at 4.5 Mbps with 5 MHz channel spacing
      */
     static WifiMode GetOfdmRate4_5MbpsBW5MHz();
     /**
      * Return a WifiMode for OFDM at 6 Mbps with 5 MHz channel spacing.
      *
-     * \return a WifiMode for OFDM at 6 Mbps with 5 MHz channel spacing
+     * @return a WifiMode for OFDM at 6 Mbps with 5 MHz channel spacing
      */
     static WifiMode GetOfdmRate6MbpsBW5MHz();
     /**
      * Return a WifiMode for OFDM at 9 Mbps with 5 MHz channel spacing.
      *
-     * \return a WifiMode for OFDM at 9 Mbps with 5 MHz channel spacing
+     * @return a WifiMode for OFDM at 9 Mbps with 5 MHz channel spacing
      */
     static WifiMode GetOfdmRate9MbpsBW5MHz();
     /**
      * Return a WifiMode for OFDM at 12 Mbps with 5 MHz channel spacing.
      *
-     * \return a WifiMode for OFDM at 12 Mbps with 5 MHz channel spacing
+     * @return a WifiMode for OFDM at 12 Mbps with 5 MHz channel spacing
      */
     static WifiMode GetOfdmRate12MbpsBW5MHz();
     /**
      * Return a WifiMode for OFDM at 13.5 Mbps with 5 MHz channel spacing.
      *
-     * \return a WifiMode for OFDM at 13.5 Mbps with 5 MHz channel spacing
+     * @return a WifiMode for OFDM at 13.5 Mbps with 5 MHz channel spacing
      */
     static WifiMode GetOfdmRate13_5MbpsBW5MHz();
 
@@ -244,8 +244,8 @@
      * ModulationLookupTable. This is mainly used as a callback for
      * WifiMode operation.
      *
-     * \param name the unique name of the OFDM mode
-     * \return WifiCodeRate corresponding to the unique name
+     * @param name the unique name of the OFDM mode
+     * @return WifiCodeRate corresponding to the unique name
      */
     static WifiCodeRate GetCodeRate(const std::string& name);
     /**
@@ -253,8 +253,8 @@
      * ModulationLookupTable. This is mainly used as a callback for
      * WifiMode operation.
      *
-     * \param name the unique name of the OFDM mode
-     * \return constellation size corresponding to the unique name
+     * @param name the unique name of the OFDM mode
+     * @return constellation size corresponding to the unique name
      */
     static uint16_t GetConstellationSize(const std::string& name);
     /**
@@ -262,10 +262,10 @@
      * the supplied parameters. This function calls CalculatePhyRate
      * and is mainly used as a callback for WifiMode operation.
      *
-     * \param name the unique name of the OFDM mode
-     * \param channelWidth the considered channel width
+     * @param name the unique name of the OFDM mode
+     * @param channelWidth the considered channel width
      *
-     * \return the physical bit rate of this signal in bps.
+     * @return the physical bit rate of this signal in bps.
      */
     static uint64_t GetPhyRate(const std::string& name, MHz_u channelWidth);
 
@@ -275,9 +275,9 @@
      * This function is mainly used as a callback
      * for WifiMode operation.
      *
-     * \param txVector the TXVECTOR used for the transmission
-     * \param staId the station ID (only here to have a common signature for all callbacks)
-     * \return the physical bit rate of this signal in bps.
+     * @param txVector the TXVECTOR used for the transmission
+     * @param staId the station ID (only here to have a common signature for all callbacks)
+     * @return the physical bit rate of this signal in bps.
      */
     static uint64_t GetPhyRateFromTxVector(const WifiTxVector& txVector, uint16_t staId);
     /**
@@ -286,9 +286,9 @@
      * This function is mainly used as a callback
      * for WifiMode operation.
      *
-     * \param txVector the TXVECTOR used for the transmission
-     * \param staId the station ID (only here to have a common signature for all callbacks)
-     * \return the data bit rate in bps.
+     * @param txVector the TXVECTOR used for the transmission
+     * @param staId the station ID (only here to have a common signature for all callbacks)
+     * @return the data bit rate in bps.
      */
     static uint64_t GetDataRateFromTxVector(const WifiTxVector& txVector, uint16_t staId);
     /**
@@ -296,18 +296,18 @@
      * the supplied parameters. This function calls CalculateDataRate and
      * is mainly used as a callback for WifiMode operation.
      *
-     * \param name the unique name of the OFDM mode
-     * \param channelWidth the considered channel width
+     * @param name the unique name of the OFDM mode
+     * @param channelWidth the considered channel width
      *
-     * \return the data bit rate of this signal in bps.
+     * @return the data bit rate of this signal in bps.
      */
     static uint64_t GetDataRate(const std::string& name, MHz_u channelWidth);
     /**
      * Check whether the combination in TXVECTOR is allowed.
      * This function is used as a callback for WifiMode operation.
      *
-     * \param txVector the TXVECTOR
-     * \returns true if this combination is allowed, false otherwise.
+     * @param txVector the TXVECTOR
+     * @returns true if this combination is allowed, false otherwise.
      */
     static bool IsAllowed(const WifiTxVector& txVector);
 
@@ -319,31 +319,31 @@
     MHz_u GetMeasurementChannelWidth(const Ptr<const WifiPpdu> ppdu) const override;
 
     /**
-     * \param txVector the transmission parameters
-     * \return the WifiMode used for the SIGNAL field
+     * @param txVector the transmission parameters
+     * @return the WifiMode used for the SIGNAL field
      */
     virtual WifiMode GetHeaderMode(const WifiTxVector& txVector) const;
 
     /**
-     * \param txVector the transmission parameters
-     * \return the duration of the preamble field
+     * @param txVector the transmission parameters
+     * @return the duration of the preamble field
      *
-     * \see WIFI_PPDU_FIELD_PREAMBLE
+     * @see WIFI_PPDU_FIELD_PREAMBLE
      */
     virtual Time GetPreambleDuration(const WifiTxVector& txVector) const;
     /**
-     * \param txVector the transmission parameters
-     * \return the duration of the SIGNAL field
+     * @param txVector the transmission parameters
+     * @return the duration of the SIGNAL field
      */
     virtual Time GetHeaderDuration(const WifiTxVector& txVector) const;
 
     /**
-     * \return the number of service bits
+     * @return the number of service bits
      */
     uint8_t GetNumberServiceBits() const;
     /**
-     * \param band the frequency band being used
-     * \return the signal extension duration
+     * @param band the frequency band being used
+     * @return the signal extension duration
      */
     Time GetSignalExtension(WifiPhyBand band) const;
 
@@ -351,51 +351,51 @@
      * End receiving the header, perform OFDM-specific actions, and
      * provide the status of the reception.
      *
-     * \param event the event holding incoming PPDU's information
-     * \return status of the reception of the header
+     * @param event the event holding incoming PPDU's information
+     * @return status of the reception of the header
      */
     PhyFieldRxStatus EndReceiveHeader(Ptr<Event> event);
 
     /**
      * Checks if the PPDU's bandwidth is supported by the PHY.
      *
-     * \param ppdu the received PPDU
-     * \return \c true if supported, \c false otherwise
+     * @param ppdu the received PPDU
+     * @return \c true if supported, \c false otherwise
      */
     virtual bool IsChannelWidthSupported(Ptr<const WifiPpdu> ppdu) const;
     /**
      * Checks if the signaled configuration (including bandwidth)
      * is supported by the PHY.
      *
-     * \param field the current PPDU field (SIG used for checking config)
-     * \param ppdu the received PPDU
-     * \return \c true if supported, \c false otherwise
+     * @param field the current PPDU field (SIG used for checking config)
+     * @param ppdu the received PPDU
+     * @return \c true if supported, \c false otherwise
      */
     virtual bool IsAllConfigSupported(WifiPpduField field, Ptr<const WifiPpdu> ppdu) const;
 
     /**
      * Calculate the PHY rate in bps from code rate and data rate.
      *
-     * \param codeRate the WifiCodeRate
-     * \param dataRate the data rate in bps
-     * \return the physical rate in bps from WifiCodeRate and data rate.
+     * @param codeRate the WifiCodeRate
+     * @param dataRate the data rate in bps
+     * @return the physical rate in bps from WifiCodeRate and data rate.
      */
     static uint64_t CalculatePhyRate(WifiCodeRate codeRate, uint64_t dataRate);
     /**
      * Convert WifiCodeRate to a ratio, e.g., code ratio of WIFI_CODE_RATE_1_2 is 0.5.
      *
-     * \param codeRate the WifiCodeRate
-     * \return the ratio form of WifiCodeRate.
+     * @param codeRate the WifiCodeRate
+     * @return the ratio form of WifiCodeRate.
      */
     static double GetCodeRatio(WifiCodeRate codeRate);
     /**
      * Calculates data rate from the supplied parameters.
      *
-     * \param codeRate the code rate of the mode
-     * \param constellationSize the size of modulation constellation
-     * \param channelWidth the considered channel width
+     * @param codeRate the code rate of the mode
+     * @param constellationSize the size of modulation constellation
+     * @param channelWidth the considered channel width
      *
-     * \return the data bit rate of this signal in bps.
+     * @return the data bit rate of this signal in bps.
      */
     static uint64_t CalculateDataRate(WifiCodeRate codeRate,
                                       uint16_t constellationSize,
@@ -403,12 +403,12 @@
     /**
      * Calculates data rate from the supplied parameters.
      *
-     * \param symbolDuration the symbol duration
-     * \param usableSubCarriers the number of usable subcarriers for data
-     * \param numberOfBitsPerSubcarrier the number of data bits per subcarrier
-     * \param codingRate the coding rate
+     * @param symbolDuration the symbol duration
+     * @param usableSubCarriers the number of usable subcarriers for data
+     * @param numberOfBitsPerSubcarrier the number of data bits per subcarrier
+     * @param codingRate the coding rate
      *
-     * \return the data bit rate of this signal in bps.
+     * @return the data bit rate of this signal in bps.
      */
     static uint64_t CalculateDataRate(Time symbolDuration,
                                       uint16_t usableSubCarriers,
@@ -416,13 +416,13 @@
                                       double codingRate);
 
     /**
-     * \return the number of usable subcarriers for data
+     * @return the number of usable subcarriers for data
      */
     static uint16_t GetUsableSubcarriers();
 
     /**
-     * \param channelWidth the channel width
-     * \return the symbol duration
+     * @param channelWidth the channel width
+     * @return the symbol duration
      */
     static Time GetSymbolDuration(MHz_u channelWidth);
 
@@ -432,9 +432,9 @@
      * must already be contained inside ModulationLookupTable.
      * This method binds all the callbacks used by WifiMode.
      *
-     * \param uniqueName the unique name of the WifiMode
-     * \param isMandatory whether the WifiMode is mandatory
-     * \return the OFDM WifiMode
+     * @param uniqueName the unique name of the WifiMode
+     * @param isMandatory whether the WifiMode is mandatory
+     * @return the OFDM WifiMode
      */
     static WifiMode CreateOfdmMode(std::string uniqueName, bool isMandatory);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/non-ht/ofdm-ppdu.cc ns-3.44/src/wifi/model/non-ht/ofdm-ppdu.cc
--- ns-3.43/src/wifi/model/non-ht/ofdm-ppdu.cc	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/non-ht/ofdm-ppdu.cc	2025-03-09 16:55:49.795372700 -0700
@@ -28,7 +28,7 @@
                    uint64_t uid,
                    bool instantiateLSig /* = true */)
     : WifiPpdu(psdu, txVector, channel, uid),
-      m_channelWidth(txVector.IsNonHtDuplicate() ? 20 : txVector.GetChannelWidth())
+      m_channelWidth(txVector.IsNonHtDuplicate() ? MHz_u{20} : txVector.GetChannelWidth())
 {
     NS_LOG_FUNCTION(this << psdu << txVector << channel << uid);
     if (instantiateLSig)
@@ -63,7 +63,7 @@
 void
 OfdmPpdu::SetTxVectorFromLSigHeader(WifiTxVector& txVector, const LSigHeader& lSig) const
 {
-    NS_ASSERT(m_channelWidth <= 20);
+    NS_ASSERT(m_channelWidth <= MHz_u{20});
     // OFDM uses 20 MHz, unless PHY channel width is 5 MHz or 10 MHz
     txVector.SetMode(OfdmPhy::GetOfdmRate(lSig.GetRate(m_channelWidth), m_channelWidth));
     txVector.SetChannelWidth(m_channelWidth);
@@ -93,11 +93,11 @@
 void
 OfdmPpdu::LSigHeader::SetRate(uint64_t rate, MHz_u channelWidth)
 {
-    if (channelWidth == 5)
+    if (channelWidth == MHz_u{5})
     {
         rate *= 4; // corresponding 20 MHz rate if 5 MHz is used
     }
-    else if (channelWidth == 10)
+    else if (channelWidth == MHz_u{10})
     {
         rate *= 2; // corresponding 20 MHz rate if 10 MHz is used
     }
@@ -177,11 +177,11 @@
         NS_ASSERT_MSG(false, "Invalid rate");
         break;
     }
-    if (channelWidth == 5)
+    if (channelWidth == MHz_u{5})
     {
         rate /= 4; // compute corresponding 5 MHz rate
     }
-    else if (channelWidth == 10)
+    else if (channelWidth == MHz_u{10})
     {
         rate /= 2; // compute corresponding 10 MHz rate
     }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/non-ht/ofdm-ppdu.h ns-3.44/src/wifi/model/non-ht/ofdm-ppdu.h
--- ns-3.43/src/wifi/model/non-ht/ofdm-ppdu.h	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/non-ht/ofdm-ppdu.h	2025-03-09 16:55:49.795372700 -0700
@@ -15,8 +15,8 @@
 #include "ns3/wifi-ppdu.h"
 
 /**
- * \file
- * \ingroup wifi
+ * @file
+ * @ingroup wifi
  * Declaration of ns3::OfdmPpdu class.
  */
 
@@ -26,8 +26,8 @@
 class WifiPsdu;
 
 /**
- * \brief OFDM PPDU (11a)
- * \ingroup wifi
+ * @brief OFDM PPDU (11a)
+ * @ingroup wifi
  *
  * OfdmPpdu stores a preamble, PHY headers and a PSDU of a PPDU with non-HT header,
  * i.e., PPDU that uses OFDM modulation.
@@ -47,27 +47,27 @@
         /**
          * Fill the RATE field of L-SIG (in bit/s).
          *
-         * \param rate the RATE field of L-SIG expressed in bit/s
-         * \param channelWidth the channel width
+         * @param rate the RATE field of L-SIG expressed in bit/s
+         * @param channelWidth the channel width
          */
-        void SetRate(uint64_t rate, MHz_u channelWidth = 20);
+        void SetRate(uint64_t rate, MHz_u channelWidth = MHz_u{20});
         /**
          * Return the RATE field of L-SIG (in bit/s).
          *
-         * \param channelWidth the channel width
-         * \return the RATE field of L-SIG expressed in bit/s
+         * @param channelWidth the channel width
+         * @return the RATE field of L-SIG expressed in bit/s
          */
-        uint64_t GetRate(MHz_u channelWidth = 20) const;
+        uint64_t GetRate(MHz_u channelWidth = MHz_u{20}) const;
         /**
          * Fill the LENGTH field of L-SIG (in bytes).
          *
-         * \param length the LENGTH field of L-SIG expressed in bytes
+         * @param length the LENGTH field of L-SIG expressed in bytes
          */
         void SetLength(uint16_t length);
         /**
          * Return the LENGTH field of L-SIG (in bytes).
          *
-         * \return the LENGTH field of L-SIG expressed in bytes
+         * @return the LENGTH field of L-SIG expressed in bytes
          */
         uint16_t GetLength() const;
 
@@ -79,11 +79,11 @@
     /**
      * Create an OFDM PPDU.
      *
-     * \param psdu the PHY payload (PSDU)
-     * \param txVector the TXVECTOR that was used for this PPDU
-     * \param channel the operating channel of the PHY used to transmit this PPDU
-     * \param uid the unique ID of this PPDU
-     * \param instantiateLSig flag used to instantiate LSigHeader (set LSigHeader's
+     * @param psdu the PHY payload (PSDU)
+     * @param txVector the TXVECTOR that was used for this PPDU
+     * @param channel the operating channel of the PHY used to transmit this PPDU
+     * @param uid the unique ID of this PPDU
+     * @param instantiateLSig flag used to instantiate LSigHeader (set LSigHeader's
      *                        rate and length), should be disabled by child classes
      */
     OfdmPpdu(Ptr<const WifiPsdu> psdu,
@@ -104,25 +104,25 @@
     /**
      * Fill in the PHY headers.
      *
-     * \param txVector the TXVECTOR that was used for this PPDU
-     * \param psduSize the size duration of the PHY payload (PSDU)
+     * @param txVector the TXVECTOR that was used for this PPDU
+     * @param psduSize the size duration of the PHY payload (PSDU)
      */
     void SetPhyHeaders(const WifiTxVector& txVector, std::size_t psduSize);
 
     /**
      * Fill in the L-SIG header.
      *
-     * \param lSig the L-SIG header to fill in
-     * \param txVector the TXVECTOR that was used for this PPDU
-     * \param psduSize the size duration of the PHY payload (PSDU)
+     * @param lSig the L-SIG header to fill in
+     * @param txVector the TXVECTOR that was used for this PPDU
+     * @param psduSize the size duration of the PHY payload (PSDU)
      */
     void SetLSigHeader(LSigHeader& lSig, const WifiTxVector& txVector, std::size_t psduSize) const;
 
     /**
      * Fill in the TXVECTOR from L-SIG header.
      *
-     * \param txVector the TXVECTOR to fill in
-     * \param lSig the L-SIG header
+     * @param txVector the TXVECTOR to fill in
+     * @param lSig the L-SIG header
      */
     virtual void SetTxVectorFromLSigHeader(WifiTxVector& txVector, const LSigHeader& lSig) const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/non-inheritance.h ns-3.44/src/wifi/model/non-inheritance.h
--- ns-3.43/src/wifi/model/non-inheritance.h	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/non-inheritance.h	2025-03-09 16:55:49.795372700 -0700
@@ -17,7 +17,7 @@
 {
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * The IEEE 802.11 Non-Inheritance Information Element
  */
@@ -31,15 +31,15 @@
     /**
      * Add the Information Element specified by the given Element ID and Element ID Extension.
      *
-     * \param elemId the given Element ID
-     * \param elemIdExt the given Element ID Extension
+     * @param elemId the given Element ID
+     * @param elemIdExt the given Element ID Extension
      */
     void Add(uint8_t elemId, uint8_t elemIdExt = 0);
 
     /**
-     * \param elemId the given Element ID
-     * \param elemIdExt the given Element ID Extension
-     * \return whether the Information Element specified by the given Element ID and
+     * @param elemId the given Element ID
+     * @param elemIdExt the given Element ID Extension
+     * @return whether the Information Element specified by the given Element ID and
      *         Element ID Extension is present
      */
     bool IsPresent(uint8_t elemId, uint8_t elemIdExt = 0) const;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/originator-block-ack-agreement.h ns-3.44/src/wifi/model/originator-block-ack-agreement.h
--- ns-3.43/src/wifi/model/originator-block-ack-agreement.h	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/originator-block-ack-agreement.h	2025-03-09 16:55:49.795372700 -0700
@@ -22,7 +22,7 @@
 class WifiMpdu;
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * Maintains the state and information about transmitted MPDUs with Ack Policy set to Block Ack
  * for an originator station. The state diagram is as follows:
  *
@@ -63,8 +63,8 @@
     /**
      * Constructor
      *
-     * \param recipient MAC address
-     * \param tid Traffic ID
+     * @param recipient MAC address
+     * @param tid Traffic ID
      */
     OriginatorBlockAckAgreement(Mac48Address recipient, uint8_t tid);
     ~OriginatorBlockAckAgreement() override;
@@ -107,41 +107,41 @@
     /**
      * Set the current state.
      *
-     * \param state to set
+     * @param state to set
      */
     void SetState(State state);
     /**
      * Check if the current state of this agreement is PENDING.
      *
-     * \return true if the current state of this agreement is PENDING,
+     * @return true if the current state of this agreement is PENDING,
      *         false otherwise
      */
     bool IsPending() const;
     /**
      * Check if the current state of this agreement is ESTABLISHED.
      *
-     * \return true if the current state of this agreement is ESTABLISHED,
+     * @return true if the current state of this agreement is ESTABLISHED,
      *         false otherwise
      */
     bool IsEstablished() const;
     /**
      * Check if the current state of this agreement is NO_REPLY.
      *
-     * \return true if the current state of this agreement is NO_REPLY,
+     * @return true if the current state of this agreement is NO_REPLY,
      *         false otherwise
      */
     bool IsNoReply() const;
     /**
      * Check if the current state of this agreement is RESET.
      *
-     * \return true if the current state of this agreement is RESET,
+     * @return true if the current state of this agreement is RESET,
      *         false otherwise
      */
     bool IsReset() const;
     /**
      * Check if the current state of this agreement is REJECTED.
      *
-     * \return true if the current state of this agreement is REJECTED,
+     * @return true if the current state of this agreement is REJECTED,
      *         false otherwise
      */
     bool IsRejected() const;
@@ -151,7 +151,7 @@
      * window has been initialized. Otherwise, return the starting sequence number
      * stored by the BlockAckAgreement base class.
      *
-     * \return the starting sequence number.
+     * @return the starting sequence number.
      */
     uint16_t GetStartingSequence() const override;
 
@@ -159,8 +159,8 @@
      * Get the distance between the current starting sequence number and the
      * given sequence number.
      *
-     * \param seqNumber the given sequence number
-     * \return the distance of the given sequence number from the current winstart
+     * @param seqNumber the given sequence number
+     * @return the distance of the given sequence number from the current winstart
      */
     std::size_t GetDistance(uint16_t seqNumber) const;
 
@@ -174,21 +174,21 @@
      * Advance the transmit window so as to include the transmitted MPDU, if the
      * latter is not an old packet and is beyond the current transmit window.
      *
-     * \param mpdu the transmitted MPDU
+     * @param mpdu the transmitted MPDU
      */
     void NotifyTransmittedMpdu(Ptr<const WifiMpdu> mpdu);
     /**
      * Record that the given MPDU has been acknowledged and advance the transmit
      * window if possible.
      *
-     * \param mpdu the acknowledged MPDU
+     * @param mpdu the acknowledged MPDU
      */
     void NotifyAckedMpdu(Ptr<const WifiMpdu> mpdu);
     /**
      * Advance the transmit window beyond the MPDU that has been reported to
      * be discarded.
      *
-     * \param mpdu the discarded MPDU
+     * @param mpdu the discarded MPDU
      */
     void NotifyDiscardedMpdu(Ptr<const WifiMpdu> mpdu);
 
@@ -196,8 +196,8 @@
      * Check whether all the MPDUs in the TX window other than the given ones have been already
      * acknowledged.
      *
-     * \param seqNumbers the sequence numbers of the given MPDUs
-     * \return whether all the MPDUs in the TX window other than the given ones have been already
+     * @param seqNumbers the sequence numbers of the given MPDUs
+     * @return whether all the MPDUs in the TX window other than the given ones have been already
      *         acknowledged
      */
     bool AllAckedMpdusInTxWindow(const std::set<uint16_t>& seqNumbers) const;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/phy-entity.cc ns-3.44/src/wifi/model/phy-entity.cc
--- ns-3.43/src/wifi/model/phy-entity.cc	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/phy-entity.cc	2025-03-09 16:55:49.795372700 -0700
@@ -619,7 +619,7 @@
             if (GetRandomValue() > snrPer.per)
             {
                 // interference level should permit to correctly decode the MAC header
-                m_endOfMacHdrEvents.push_back(
+                m_endOfMacHdrEvents[staId].push_back(
                     Simulator::Schedule(endOfMpduDuration + macHdrDuration, [=, this]() {
                         m_wifiPhy->m_phyRxMacHeaderEndTrace((*mpdu)->GetHeader(),
                                                             txVector,
@@ -630,14 +630,14 @@
         }
 
         uint32_t size = (mpduType == NORMAL_MPDU) ? psdu->GetSize() : psdu->GetAmpduSubframeSize(i);
-        Time mpduDuration = m_wifiPhy->GetPayloadDuration(size,
-                                                          txVector,
-                                                          m_wifiPhy->GetPhyBand(),
-                                                          mpduType,
-                                                          true,
-                                                          totalAmpduSize,
-                                                          totalAmpduNumSymbols,
-                                                          staId);
+        Time mpduDuration = WifiPhy::GetPayloadDuration(size,
+                                                        txVector,
+                                                        m_wifiPhy->GetPhyBand(),
+                                                        mpduType,
+                                                        true,
+                                                        totalAmpduSize,
+                                                        totalAmpduNumSymbols,
+                                                        staId);
 
         remainingAmpduDuration -= mpduDuration;
         if (i == (nMpdus - 1) && !remainingAmpduDuration.IsZero()) // no more MPDUs coming
@@ -693,7 +693,7 @@
     signalNoiseIt->second = rxInfo.second;
 
     RxSignalInfo rxSignalInfo;
-    rxSignalInfo.snr = DbToRatio(rxInfo.second.signal - rxInfo.second.noise);
+    rxSignalInfo.snr = DbToRatio(dB_u{rxInfo.second.signal - rxInfo.second.noise});
     rxSignalInfo.rssi = rxInfo.second.signal;
 
     auto statusPerMpduIt = m_statusPerMpduMap.find({ppdu->GetUid(), staId});
@@ -844,6 +844,27 @@
     }
 }
 
+std::optional<Time>
+PhyEntity::GetTimeToMacHdrEnd(uint16_t staId) const
+{
+    const auto it = m_endOfMacHdrEvents.find(staId);
+
+    if (it == m_endOfMacHdrEvents.cend())
+    {
+        return std::nullopt;
+    }
+
+    for (const auto& endOfMacHdrEvent : it->second)
+    {
+        if (endOfMacHdrEvent.IsPending())
+        {
+            return Simulator::GetDelayLeft(endOfMacHdrEvent);
+        }
+    }
+
+    return std::nullopt;
+}
+
 std::pair<MHz_u, WifiSpectrumBandInfo>
 PhyEntity::GetChannelWidthAndBand(const WifiTxVector& txVector, uint16_t /* staId */) const
 {
@@ -942,9 +963,12 @@
         NS_ASSERT(endOfMpduEvent.IsExpired());
     }
     m_endOfMpduEvents.clear();
-    for (const auto& endOfMacHdrEvent : m_endOfMacHdrEvents)
+    for (const auto& [staId, endOfMacHdrEvents] : m_endOfMacHdrEvents)
     {
-        NS_ASSERT(endOfMacHdrEvent.IsExpired());
+        for (const auto& endOfMacHdrEvent : endOfMacHdrEvents)
+        {
+            NS_ASSERT(endOfMacHdrEvent.IsExpired());
+        }
     }
     m_endOfMacHdrEvents.clear();
     if (reset)
@@ -968,14 +992,14 @@
 {
     NS_LOG_FUNCTION(this << *event);
     const auto rxPower = GetRxPowerForPpdu(event);
-    NS_LOG_DEBUG("Sync to signal (power=" << (rxPower > 0.0
+    NS_LOG_DEBUG("Sync to signal (power=" << (rxPower > Watt_u{0.0}
                                                   ? std::to_string(WToDbm(rxPower)) + "dBm)"
                                                   : std::to_string(rxPower) + "W)"));
     m_wifiPhy->m_interference->NotifyRxStart(
         m_wifiPhy->GetCurrentFrequencyRange()); // We need to notify it now so that it starts
                                                 // recording events
     m_endPreambleDetectionEvents.push_back(
-        Simulator::Schedule(m_wifiPhy->GetPreambleDetectionDuration(),
+        Simulator::Schedule(WifiPhy::GetPreambleDetectionDuration(),
                             &PhyEntity::EndPreambleDetectionPeriod,
                             this,
                             event));
@@ -1036,8 +1060,8 @@
     NS_LOG_DEBUG("SNR(dB)=" << RatioToDb(snr) << " at end of preamble detection period");
 
     if (const auto power = m_wifiPhy->m_currentEvent->GetRxPower(measurementBand);
-        (!m_wifiPhy->m_preambleDetectionModel && maxRxPower && (*maxRxPower > 0.0)) ||
-        (m_wifiPhy->m_preambleDetectionModel && power > 0.0 &&
+        (!m_wifiPhy->m_preambleDetectionModel && maxRxPower && (*maxRxPower > Watt_u{0.0})) ||
+        (m_wifiPhy->m_preambleDetectionModel && power > Watt_u{0.0} &&
          m_wifiPhy->m_preambleDetectionModel->IsPreambleDetected(WToDbm(power),
                                                                  snr,
                                                                  measurementChannelWidth)))
@@ -1090,7 +1114,7 @@
         // Continue receiving preamble
         const auto durationTillEnd =
             GetDuration(WIFI_PPDU_FIELD_PREAMBLE, event->GetPpdu()->GetTxVector()) -
-            m_wifiPhy->GetPreambleDetectionDuration();
+            WifiPhy::GetPreambleDetectionDuration();
         m_wifiPhy->NotifyCcaBusy(event->GetPpdu(),
                                  durationTillEnd); // will be prolonged by next field
         m_wifiPhy->m_endPhyRxEvent = Simulator::Schedule(durationTillEnd,
@@ -1147,9 +1171,12 @@
         endMpduEvent.Cancel();
     }
     m_endOfMpduEvents.clear();
-    for (auto& endMacHdrEvent : m_endOfMacHdrEvents)
+    for (auto& [staId, endOfMacHdrEvents] : m_endOfMacHdrEvents)
     {
-        endMacHdrEvent.Cancel();
+        for (auto& endMacHdrEvent : endOfMacHdrEvents)
+        {
+            endMacHdrEvent.Cancel();
+        }
     }
     m_endOfMacHdrEvents.clear();
 }
@@ -1190,9 +1217,12 @@
             endMpduEvent.Cancel();
         }
         m_endOfMpduEvents.clear();
-        for (auto& endMacHdrEvent : m_endOfMacHdrEvents)
+        for (auto& [staId, endOfMacHdrEvents] : m_endOfMacHdrEvents)
         {
-            endMacHdrEvent.Cancel();
+            for (auto& endMacHdrEvent : endOfMacHdrEvents)
+            {
+                endMacHdrEvent.Cancel();
+            }
         }
         m_endOfMacHdrEvents.clear();
     }
@@ -1251,7 +1281,7 @@
 WifiSpectrumBandInfo
 PhyEntity::GetSecondaryBand(MHz_u bandWidth) const
 {
-    NS_ASSERT(m_wifiPhy->GetChannelWidth() >= 40);
+    NS_ASSERT(m_wifiPhy->GetChannelWidth() >= MHz_u{40});
     return m_wifiPhy->GetBand(bandWidth,
                               m_wifiPhy->GetOperatingChannel().GetSecondaryChannelIndex(bandWidth));
 }
@@ -1345,10 +1375,10 @@
 PhyEntity::StartTx(Ptr<const WifiPpdu> ppdu)
 {
     NS_LOG_FUNCTION(this << ppdu);
-    auto txPowerDbm = m_wifiPhy->GetTxPowerForTransmission(ppdu) + m_wifiPhy->GetTxGain();
+    auto txPower = m_wifiPhy->GetTxPowerForTransmission(ppdu) + m_wifiPhy->GetTxGain();
     auto txVector = ppdu->GetTxVector();
-    auto txPowerSpectrum = GetTxPowerSpectralDensity(DbmToW(txPowerDbm), ppdu);
-    Transmit(ppdu->GetTxDuration(), ppdu, txPowerDbm, txPowerSpectrum, "transmission");
+    auto txPowerSpectrum = GetTxPowerSpectralDensity(DbmToW(txPower), ppdu);
+    Transmit(ppdu->GetTxDuration(), ppdu, txPower, txPowerSpectrum, "transmission");
 }
 
 void
@@ -1404,18 +1434,18 @@
     // not overlap the primary channel
     const auto channelWidth = m_wifiPhy->GetChannelWidth();
     const auto primaryWidth = ((static_cast<uint16_t>(channelWidth) % 20 == 0)
-                                   ? 20
+                                   ? MHz_u{20}
                                    : channelWidth); // if the channel width is a multiple of 20 MHz,
                                                     // then we consider the primary20 channel
     const auto p20CenterFreq =
         m_wifiPhy->GetOperatingChannel().GetPrimaryChannelCenterFrequency(primaryWidth);
-    const uint16_t p20MinFreq = p20CenterFreq - (primaryWidth / 2);
-    const uint16_t p20MaxFreq = p20CenterFreq + (primaryWidth / 2);
+    const auto p20MinFreq = p20CenterFreq - (primaryWidth / 2);
+    const auto p20MaxFreq = p20CenterFreq + (primaryWidth / 2);
     const auto txChannelWidth = (ppdu->GetTxChannelWidth() / ppdu->GetTxCenterFreqs().size());
     for (auto txCenterFreq : ppdu->GetTxCenterFreqs())
     {
-        const uint16_t minTxFreq = txCenterFreq - txChannelWidth / 2;
-        const uint16_t maxTxFreq = txCenterFreq + txChannelWidth / 2;
+        const auto minTxFreq = txCenterFreq - txChannelWidth / 2;
+        const auto maxTxFreq = txCenterFreq + txChannelWidth / 2;
         if ((p20MinFreq >= minTxFreq) && (p20MaxFreq <= maxTxFreq))
         {
             return true;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/phy-entity.h ns-3.44/src/wifi/model/phy-entity.h
--- ns-3.43/src/wifi/model/phy-entity.h	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/phy-entity.h	2025-03-09 16:55:49.795372700 -0700
@@ -28,8 +28,8 @@
 #include <utility>
 
 /**
- * \file
- * \ingroup wifi
+ * @file
+ * @ingroup wifi
  * Declaration of:
  * - ns3::PhyEntity class
  * - ns3::SignalNoiseDbm, ns3::MpduInfo, and ns3::RxSignalInfo structs
@@ -53,8 +53,8 @@
 class WifiPpdu;
 
 /**
- * \brief Abstract class for PHY entities
- * \ingroup wifi
+ * @brief Abstract class for PHY entities
+ * @ingroup wifi
  *
  * This class enables to have a unique set of APIs
  * to be used by each PHY entity, corresponding to
@@ -86,7 +86,7 @@
         /**
          * Constructor setting outcome of reception.
          *
-         * \param s \c true if success
+         * @param s \c true if success
          */
         PhyFieldRxStatus(bool s)
             : isSuccess(s)
@@ -96,9 +96,9 @@
         /**
          * Constructor.
          *
-         * \param s \c true if success
-         * \param r reason of failure
-         * \param a action to perform in case of failure
+         * @param s \c true if success
+         * @param r reason of failure
+         * @param a action to perform in case of failure
          */
         PhyFieldRxStatus(bool s, WifiPhyRxfailureReason r, PhyRxFailureAction a)
             : isSuccess(s),
@@ -126,8 +126,8 @@
         /**
          * Constructor for SnrPer.
          *
-         * \param s the SNR in linear scale
-         * \param p the PER
+         * @param s the SNR in linear scale
+         * @param p the PER
          */
         SnrPer(double s, double p)
             : snr(s),
@@ -144,28 +144,28 @@
     /**
      * Set the WifiPhy owning this PHY entity.
      *
-     * \param wifiPhy the WifiPhy owning this PHY entity
+     * @param wifiPhy the WifiPhy owning this PHY entity
      */
     void SetOwner(Ptr<WifiPhy> wifiPhy);
 
     /**
      * Check if the WifiMode is supported.
      *
-     * \param mode the WifiMode to check
-     * \return true if the WifiMode is supported,
+     * @param mode the WifiMode to check
+     * @return true if the WifiMode is supported,
      *         false otherwise
      */
     virtual bool IsModeSupported(WifiMode mode) const;
     /**
-     * \return the number of WifiModes supported by this entity
+     * @return the number of WifiModes supported by this entity
      */
     virtual uint8_t GetNumModes() const;
 
     /**
      * Get the WifiMode corresponding to the given MCS index.
      *
-     * \param index the index of the MCS
-     * \return the WifiMode corresponding to the MCS index
+     * @param index the index of the MCS
+     * @return the WifiMode corresponding to the MCS index
      *
      * This method should be used only for HtPhy and child classes.
      */
@@ -173,8 +173,8 @@
     /**
      * Check if the WifiMode corresponding to the given MCS index is supported.
      *
-     * \param index the index of the MCS
-     * \return true if the WifiMode corresponding to the MCS index is supported,
+     * @param index the index of the MCS
+     * @return true if the WifiMode corresponding to the MCS index is supported,
      *         false otherwise
      *
      * Will return false for non-MCS modes.
@@ -183,7 +183,7 @@
     /**
      * Check if the WifiModes handled by this PHY are MCSs.
      *
-     * \return true if the handled WifiModes are MCSs,
+     * @return true if the handled WifiModes are MCSs,
      *         false if they are non-MCS modes
      */
     virtual bool HandlesMcsModes() const;
@@ -191,32 +191,32 @@
     /**
      * Get the WifiMode for the SIG field specified by the PPDU field.
      *
-     * \param field the PPDU field
-     * \param txVector the transmission parameters
+     * @param field the PPDU field
+     * @param txVector the transmission parameters
      *
-     * \return the WifiMode used for the SIG field
+     * @return the WifiMode used for the SIG field
      */
     virtual WifiMode GetSigMode(WifiPpduField field, const WifiTxVector& txVector) const;
 
     /**
-     * \brief Return a const iterator to the first WifiMode
+     * @brief Return a const iterator to the first WifiMode
      *
-     * \return a const iterator to the first WifiMode.
+     * @return a const iterator to the first WifiMode.
      */
     std::list<WifiMode>::const_iterator begin() const;
     /**
-     * \brief Return a const iterator to past-the-last WifiMode
+     * @brief Return a const iterator to past-the-last WifiMode
      *
-     * \return a const iterator to past-the-last WifiMode.
+     * @return a const iterator to past-the-last WifiMode.
      */
     std::list<WifiMode>::const_iterator end() const;
 
     /**
      * Return the field following the provided one.
      *
-     * \param currentField the considered PPDU field
-     * \param preamble the preamble indicating the PPDU format
-     * \return the PPDU field following the reference one
+     * @param currentField the considered PPDU field
+     * @param preamble the preamble indicating the PPDU format
+     * @return the PPDU field following the reference one
      */
     WifiPpduField GetNextField(WifiPpduField currentField, WifiPreamble preamble) const;
 
@@ -224,35 +224,35 @@
      * Get the duration of the PPDU field (or group of fields)
      * used by this entity for the given transmission parameters.
      *
-     * \param field the PPDU field (or group of fields)
-     * \param txVector the transmission parameters
+     * @param field the PPDU field (or group of fields)
+     * @param txVector the transmission parameters
      *
-     * \return the duration of the PPDU field
+     * @return the duration of the PPDU field
      */
     virtual Time GetDuration(WifiPpduField field, const WifiTxVector& txVector) const;
     /**
-     * \param txVector the transmission parameters
+     * @param txVector the transmission parameters
      *
-     * \return the total duration of the PHY preamble and PHY header.
+     * @return the total duration of the PHY preamble and PHY header.
      */
     Time CalculatePhyPreambleAndHeaderDuration(const WifiTxVector& txVector) const;
 
     /**
-     * \param size the number of bytes in the packet to send
-     * \param txVector the TXVECTOR used for the transmission of this packet
-     * \param band the frequency band
-     * \param mpdutype the type of the MPDU as defined in WifiPhy::MpduType.
-     * \param incFlag this flag is used to indicate that the variables need to be update or not
+     * @param size the number of bytes in the packet to send
+     * @param txVector the TXVECTOR used for the transmission of this packet
+     * @param band the frequency band
+     * @param mpdutype the type of the MPDU as defined in WifiPhy::MpduType.
+     * @param incFlag this flag is used to indicate that the variables need to be update or not
      * This function is called a couple of times for the same packet so variables should not be
      * increased each time.
-     * \param totalAmpduSize the total size of the previously transmitted MPDUs for the concerned
+     * @param totalAmpduSize the total size of the previously transmitted MPDUs for the concerned
      * A-MPDU. If incFlag is set, this parameter will be updated.
-     * \param totalAmpduNumSymbols the number of symbols previously transmitted for the MPDUs in the
+     * @param totalAmpduNumSymbols the number of symbols previously transmitted for the MPDUs in the
      * concerned A-MPDU, used for the computation of the number of symbols needed for the last MPDU.
      * If incFlag is set, this parameter will be updated.
-     * \param staId the STA-ID of the PSDU (only used for MU PPDUs)
+     * @param staId the STA-ID of the PSDU (only used for MU PPDUs)
      *
-     * \return the duration of the PSDU
+     * @return the duration of the PSDU
      */
     virtual Time GetPayloadDuration(uint32_t size,
                                     const WifiTxVector& txVector,
@@ -268,9 +268,9 @@
      * The STA-ID value is properly determined based on whether the given PSDU has
      * to be transmitted as a DL or UL frame.
      *
-     * \param psdu the given PSDU
-     * \param txVector the TXVECTOR to use to send the PSDU
-     * \return a WifiConstPsduMap built from the given PSDU and the given TXVECTOR
+     * @param psdu the given PSDU
+     * @param txVector the TXVECTOR to use to send the PSDU
+     * @return a WifiConstPsduMap built from the given PSDU and the given TXVECTOR
      */
     virtual WifiConstPsduMap GetWifiConstPsduMap(Ptr<const WifiPsdu> psdu,
                                                  const WifiTxVector& txVector) const;
@@ -278,7 +278,7 @@
     /**
      * Get the maximum PSDU size in bytes.
      *
-     * \return the maximum PSDU size in bytes
+     * @return the maximum PSDU size in bytes
      */
     virtual uint32_t GetMaxPsduSize() const = 0;
 
@@ -289,7 +289,7 @@
     typedef std::pair<std::pair<Time /* start */, Time /* stop */>, WifiMode> PhyHeaderChunkInfo;
     /**
      * A map of PhyHeaderChunkInfo elements per PPDU field.
-     * \see PhyHeaderChunkInfo
+     * @see PhyHeaderChunkInfo
      */
     typedef std::map<WifiPpduField, PhyHeaderChunkInfo> PhyHeaderSections;
     /**
@@ -297,22 +297,22 @@
      * This map will contain the PPDU fields that are actually present based
      * on the \p txVector information.
      *
-     * \param txVector the transmission parameters
-     * \param ppduStart the time at which the PPDU started
-     * \return the list of preamble sections
+     * @param txVector the transmission parameters
+     * @param ppduStart the time at which the PPDU started
+     * @return the list of preamble sections
      *
-     * \see PhyHeaderSections
+     * @see PhyHeaderSections
      */
     PhyHeaderSections GetPhyHeaderSections(const WifiTxVector& txVector, Time ppduStart) const;
 
     /**
      * Build amendment-specific PPDU.
      *
-     * \param psdus the PHY payloads (PSDUs)
-     * \param txVector the TXVECTOR that was used for the PPDU
-     * \param ppduDuration the transmission duration of the PPDU
+     * @param psdus the PHY payloads (PSDUs)
+     * @param txVector the TXVECTOR that was used for the PPDU
+     * @param ppduDuration the transmission duration of the PPDU
      *
-     * \return the amendment-specific WifiPpdu
+     * @return the amendment-specific WifiPpdu
      */
     virtual Ptr<WifiPpdu> BuildPpdu(const WifiConstPsduMap& psdus,
                                     const WifiTxVector& txVector,
@@ -321,25 +321,25 @@
     /**
      * Get the duration of the PPDU up to (but excluding) the given field.
      *
-     * \param field the considered PPDU field
-     * \param txVector the transmission parameters
-     * \return the duration from the beginning of the PPDU up to the field
+     * @param field the considered PPDU field
+     * @param txVector the transmission parameters
+     * @return the duration from the beginning of the PPDU up to the field
      */
     Time GetDurationUpToField(WifiPpduField field, const WifiTxVector& txVector) const;
     /**
      * Get the remaining duration of the PPDU after the end of the given field.
      *
-     * \param field the considered PPDU field
-     * \param ppdu the received PPDU
-     * \return the remaining duration of the PPDU after the end of to the field
+     * @param field the considered PPDU field
+     * @param ppdu the received PPDU
+     * @return the remaining duration of the PPDU after the end of to the field
      */
     Time GetRemainingDurationAfterField(Ptr<const WifiPpdu> ppdu, WifiPpduField field) const;
 
     /**
      * Get the PSDU addressed to that PHY in a PPDU (useful for MU PPDU).
      *
-     * \param ppdu the PPDU to extract the PSDU from
-     * \return the PSDU addressed to that PHY
+     * @param ppdu the PPDU to extract the PSDU from
+     * @return the PSDU addressed to that PHY
      */
     virtual Ptr<const WifiPsdu> GetAddressedPsduInPpdu(Ptr<const WifiPpdu> ppdu) const;
 
@@ -349,9 +349,9 @@
      * This method triggers the start of the preamble detection period (\see
      * StartPreambleDetectionPeriod) if the PHY can process the PPDU.
      *
-     * \param ppdu the arriving PPDU
-     * \param rxPowersW the receive power in W per band
-     * \param rxDuration the duration of the PPDU
+     * @param ppdu the arriving PPDU
+     * @param rxPowersW the receive power in W per band
+     * @param rxDuration the duration of the PPDU
      */
     virtual void StartReceivePreamble(Ptr<const WifiPpdu> ppdu,
                                       RxPowerWattPerChannelBand& rxPowersW,
@@ -365,8 +365,8 @@
      * The PHY is kept in CCA busy during the reception of the field (except for
      * data field which should be in RX).
      *
-     * \param field the starting PPDU field
-     * \param event the event holding incoming PPDU's information
+     * @param field the starting PPDU field
+     * @param event the event holding incoming PPDU's information
      */
     void StartReceiveField(WifiPpduField field, Ptr<Event> event);
     /**
@@ -377,22 +377,22 @@
      * In case of failure, the indications in the returned \see PhyFieldRxStatus
      * are performed.
      *
-     * \param field the ending PPDU field
-     * \param event the event holding incoming PPDU's information
+     * @param field the ending PPDU field
+     * @param event the event holding incoming PPDU's information
      */
     void EndReceiveField(WifiPpduField field, Ptr<Event> event);
 
     /**
      * The last symbol of the PPDU has arrived.
      *
-     * \param event the event holding incoming PPDU's information
+     * @param event the event holding incoming PPDU's information
      */
     void EndReceivePayload(Ptr<Event> event);
 
     /**
      * Reset PHY at the end of the PPDU under reception after it has failed the PHY header.
      *
-     * \param event the event holding incoming PPDU's information
+     * @param event the event holding incoming PPDU's information
      */
     void ResetReceive(Ptr<Event> event);
 
@@ -401,7 +401,7 @@
      */
     virtual void CancelAllEvents();
     /**
-     * \return \c true if there is no end preamble detection event running, \c false otherwise
+     * @return \c true if there is no end preamble detection event running, \c false otherwise
      */
     bool NoEndPreambleDetectionEvents() const;
     /**
@@ -410,11 +410,20 @@
     void CancelRunningEndPreambleDetectionEvents();
 
     /**
+     * Get the remaining time to the end of the MAC header reception of the next MPDU being
+     * received from the given STA, if any.
+     *
+     * @param staId the STA-ID of the transmitter; equals SU_STA_ID for SU PPDUs
+     * @return the remaining time to the end of the MAC header reception of the next MPDU, if any
+     */
+    virtual std::optional<Time> GetTimeToMacHdrEnd(uint16_t staId) const;
+
+    /**
      * Return the STA ID that has been assigned to the station this PHY belongs to.
      * This is typically called for MU PPDUs, in order to pick the correct PSDU.
      *
-     * \param ppdu the PPDU for which the STA ID is requested
-     * \return the STA ID
+     * @param ppdu the PPDU for which the STA ID is requested
+     * @return the STA ID
      */
     virtual uint16_t GetStaId(const Ptr<const WifiPpdu> ppdu) const;
 
@@ -422,8 +431,8 @@
      * Determine whether the PHY shall issue a PHY-RXSTART.indication primitive in response to a
      * given PPDU.
      *
-     * \param ppdu the PPDU
-     * \return true if the PHY shall issue a PHY-RXSTART.indication primitive in response to a PPDU,
+     * @param ppdu the PPDU
+     * @return true if the PHY shall issue a PHY-RXSTART.indication primitive in response to a PPDU,
      * false otherwise
      */
     virtual bool CanStartRx(Ptr<const WifiPpdu> ppdu) const;
@@ -432,15 +441,15 @@
      * Check if PHY state should move to CCA busy state based on current
      * state of interference tracker.
      *
-     * \param ppdu the incoming PPDU or nullptr for any signal
+     * @param ppdu the incoming PPDU or nullptr for any signal
      */
     virtual void SwitchMaybeToCcaBusy(const Ptr<const WifiPpdu> ppdu);
     /**
      * Notify PHY state helper to switch to CCA busy state,
      *
-     * \param ppdu the incoming PPDU or nullptr for any signal
-     * \param duration the duration of the CCA state
-     * \param channelType the channel type for which the CCA busy state is reported.
+     * @param ppdu the incoming PPDU or nullptr for any signal
+     * @param duration the duration of the CCA state
+     * @param channelType the channel type for which the CCA busy state is reported.
      */
     virtual void NotifyCcaBusy(const Ptr<const WifiPpdu> ppdu,
                                Time duration,
@@ -448,22 +457,22 @@
     /**
      * This function is called by SpectrumWifiPhy to send
      * the PPDU while performing amendment-specific actions.
-     * \see SpectrumWifiPhy::StartTx
+     * @see SpectrumWifiPhy::StartTx
      *
-     * \param ppdu the PPDU to send
+     * @param ppdu the PPDU to send
      */
     virtual void StartTx(Ptr<const WifiPpdu> ppdu);
 
     /**
      * This function prepares most of the WifiSpectrumSignalParameters
      * parameters and invokes SpectrumWifiPhy's Transmit method.
-     * \see SpectrumWifiPhy::Transmit
+     * @see SpectrumWifiPhy::Transmit
      *
-     * \param txDuration the duration of the transmission
-     * \param ppdu the PPDU to send
-     * \param txPower the total TX power
-     * \param txPowerSpectrum the TX PSD
-     * \param type the type of transmission (for logging)
+     * @param txDuration the duration of the transmission
+     * @param ppdu the PPDU to send
+     * @param txPower the total TX power
+     * @param txPowerSpectrum the TX PSD
+     * @param type the type of transmission (for logging)
      */
     void Transmit(Time txDuration,
                   Ptr<const WifiPpdu> ppdu,
@@ -472,11 +481,11 @@
                   const std::string& type);
 
     /**
-     * \param psduMap the PSDU(s) to transmit indexed by STA-ID
-     * \param txVector the TXVECTOR used for the transmission of the PPDU
-     * \param band the frequency band being used
+     * @param psduMap the PSDU(s) to transmit indexed by STA-ID
+     * @param txVector the TXVECTOR used for the transmission of the PPDU
+     * @param band the frequency band being used
      *
-     * \return the total amount of time this PHY will stay busy for the transmission of the PPDU
+     * @return the total amount of time this PHY will stay busy for the transmission of the PPDU
      */
     virtual Time CalculateTxDuration(const WifiConstPsduMap& psduMap,
                                      const WifiTxVector& txVector,
@@ -485,9 +494,9 @@
      * Return the CCA threshold for a given channel type.
      * If the channel type is not provided, the default CCA threshold is returned.
      *
-     * \param ppdu the PPDU that is being received
-     * \param channelType the channel type
-     * \return the CCA threshold
+     * @param ppdu the PPDU that is being received
+     * @param channelType the channel type
+     * @return the CCA threshold
      */
     virtual dBm_u GetCcaThreshold(const Ptr<const WifiPpdu> ppdu,
                                   WifiChannelListType channelType) const;
@@ -498,8 +507,8 @@
      * from TX instead of a copy of it. Child classes can change that behavior and do a copy and/or
      * change the content of the parameters stored in WifiPpdu.
      *
-     * \param ppdu the WifiPpdu transmitted by the TX PHY
-     * \return the WifiPpdu to be used by the RX PHY
+     * @param ppdu the WifiPpdu transmitted by the TX PHY
+     * @return the WifiPpdu to be used by the RX PHY
      */
     virtual Ptr<const WifiPpdu> GetRxPpduFromTxPpdu(Ptr<const WifiPpdu> ppdu);
 
@@ -507,8 +516,8 @@
      * Obtain the next UID for the PPDU to transmit.
      * Note that the global UID counter could be incremented.
      *
-     * \param txVector the transmission parameters
-     * \return the UID to use for the PPDU to transmit
+     * @param txVector the transmission parameters
+     * @return the UID to use for the PPDU to transmit
      */
     virtual uint64_t ObtainNextUid(const WifiTxVector& txVector);
 
@@ -516,8 +525,8 @@
      * Obtain the maximum time between two PPDUs with the same UID to consider they are identical
      * and their power can be added construtively.
      *
-     * \param txVector the TXVECTOR used for the transmission of the PPDUs
-     * \return the maximum time between two PPDUs with the same UID to decode them
+     * @param txVector the TXVECTOR used for the transmission of the PPDUs
+     * @return the maximum time between two PPDUs with the same UID to decode them
      */
     virtual Time GetMaxDelayPpduSameUid(const WifiTxVector& txVector);
 
@@ -541,7 +550,7 @@
     /**
      * Return the PPDU formats of the PHY.
      *
-     * \return the PPDU formats of the PHY
+     * @return the PPDU formats of the PHY
      */
     virtual const PpduFormats& GetPpduFormats() const = 0;
 
@@ -549,18 +558,18 @@
      * Start receiving a given field, perform amendment-specific actions, and
      * signify if it is supported.
      *
-     * \param field the starting PPDU field
-     * \param event the event holding incoming PPDU's information
-     * \return \c true if the field is supported, \c false otherwise
+     * @param field the starting PPDU field
+     * @param event the event holding incoming PPDU's information
+     * @return \c true if the field is supported, \c false otherwise
      */
     virtual bool DoStartReceiveField(WifiPpduField field, Ptr<Event> event);
     /**
      * End receiving a given field, perform amendment-specific actions, and
      * provide the status of the reception.
      *
-     * \param field the ending PPDU field
-     * \param event the event holding incoming PPDU's information
-     * \return status of the reception of the PPDU field
+     * @param field the ending PPDU field
+     * @param event the event holding incoming PPDU's information
+     * @return status of the reception of the PPDU field
      */
     virtual PhyFieldRxStatus DoEndReceiveField(WifiPpduField field, Ptr<Event> event);
 
@@ -570,23 +579,23 @@
      * We store all incoming preamble events, perform amendment-specific actions,
      * and a decision is made at the end of the preamble detection window.
      *
-     * \param ppdu the incoming PPDU
-     * \param rxPowersW the receive power in W per band
-     * \return the event holding the incoming PPDU's information
+     * @param ppdu the incoming PPDU
+     * @param rxPowersW the receive power in W per band
+     * @return the event holding the incoming PPDU's information
      */
     virtual Ptr<Event> DoGetEvent(Ptr<const WifiPpdu> ppdu, RxPowerWattPerChannelBand& rxPowersW);
     /**
      * End receiving the preamble, perform amendment-specific actions, and
      * provide the status of the reception.
      *
-     * \param event the event holding incoming PPDU's information
-     * \return status of the reception of the preamble
+     * @param event the event holding incoming PPDU's information
+     * @return status of the reception of the preamble
      */
     virtual PhyFieldRxStatus DoEndReceivePreamble(Ptr<Event> event);
     /**
      * Start the preamble detection period.
      *
-     * \param event the event holding incoming PPDU's information
+     * @param event the event holding incoming PPDU's information
      */
     void StartPreambleDetectionPeriod(Ptr<Event> event);
     /**
@@ -596,14 +605,14 @@
      * In addition, in case of successful detection, the end of the
      * preamble reception is triggered (\see DoEndReceivePreamble).
      *
-     * \param event the event holding incoming PPDU's information
+     * @param event the event holding incoming PPDU's information
      */
     void EndPreambleDetectionPeriod(Ptr<Event> event);
 
     /**
      * Start receiving the PSDU (i.e. the first symbol of the PSDU has arrived).
      *
-     * \param event the event holding incoming PPDU's information
+     * @param event the event holding incoming PPDU's information
      */
     void StartReceivePayload(Ptr<Event> event);
 
@@ -611,8 +620,8 @@
      * Start receiving the PSDU (i.e. the first symbol of the PSDU has arrived)
      * and perform amendment-specific actions.
      *
-     * \param event the event holding incoming PPDU's information
-     * \return the payload duration
+     * @param event the event holding incoming PPDU's information
+     * @return the payload duration
      */
     virtual Time DoStartReceivePayload(Ptr<Event> event);
 
@@ -620,7 +629,7 @@
      * Perform amendment-specific actions before resetting PHY at
      * the end of the PPDU under reception after it has failed the PHY header.
      *
-     * \param event the event holding incoming PPDU's information
+     * @param event the event holding incoming PPDU's information
      */
     virtual void DoResetReceive(Ptr<Event> event);
 
@@ -628,7 +637,7 @@
      * Perform amendment-specific actions before aborting the
      * current reception.
      *
-     * \param reason the reason the reception is aborted
+     * @param reason the reason the reception is aborted
      */
     virtual void DoAbortCurrentReception(WifiPhyRxfailureReason reason);
 
@@ -636,8 +645,8 @@
      * Checks if the signaled configuration (excluding bandwidth)
      * is supported by the PHY.
      *
-     * \param ppdu the received PPDU
-     * \return \c true if supported, \c false otherwise
+     * @param ppdu the received PPDU
+     * @return \c true if supported, \c false otherwise
      */
     virtual bool IsConfigSupported(Ptr<const WifiPpdu> ppdu) const;
 
@@ -645,9 +654,9 @@
      * Drop the PPDU and the corresponding preamble detection event, but keep CCA busy
      * state after the completion of the currently processed event.
      *
-     * \param ppdu the incoming PPDU
-     * \param reason the reason the PPDU is dropped
-     * \param endRx the end of the incoming PPDU's reception
+     * @param ppdu the incoming PPDU
+     * @param reason the reason the PPDU is dropped
+     * @param endRx the end of the incoming PPDU's reception
      */
     void DropPreambleEvent(Ptr<const WifiPpdu> ppdu, WifiPhyRxfailureReason reason, Time endRx);
 
@@ -655,22 +664,22 @@
      * Erase the event corresponding to the PPDU from the list of preamble events,
      * but consider it as noise after the completion of the current event.
      *
-     * \param ppdu the incoming PPDU
-     * \param rxDuration the duration of the PPDU
+     * @param ppdu the incoming PPDU
+     * @param rxDuration the duration of the PPDU
      */
     void ErasePreambleEvent(Ptr<const WifiPpdu> ppdu, Time rxDuration);
 
     /**
      * Get the reception status for the provided MPDU and notify.
      *
-     * \param mpdu the arriving MPDU
-     * \param event the event holding incoming PPDU's information
-     * \param staId the station ID of the PSDU (only used for MU)
-     * \param relativeMpduStart the relative start time of the MPDU within the A-MPDU.
+     * @param mpdu the arriving MPDU
+     * @param event the event holding incoming PPDU's information
+     * @param staId the station ID of the PSDU (only used for MU)
+     * @param relativeMpduStart the relative start time of the MPDU within the A-MPDU.
      * 0 for normal MPDUs
-     * \param mpduDuration the duration of the MPDU
+     * @param mpduDuration the duration of the MPDU
      *
-     * \return information on MPDU reception: status, signal power (dBm), and noise power (in dBm)
+     * @return information on MPDU reception: status, signal power (dBm), and noise power (in dBm)
      */
     std::pair<bool, SignalNoiseDbm> GetReceptionStatus(Ptr<WifiMpdu> mpdu,
                                                        Ptr<Event> event,
@@ -680,11 +689,11 @@
     /**
      * The last symbol of an MPDU in an A-MPDU has arrived.
      *
-     * \param event the event holding incoming PPDU's information
-     * \param mpdu the arriving MPDU
-     * \param mpduIndex the index of the MPDU within the A-MPDU
-     * \param relativeStart the relative start time of the MPDU within the A-MPDU.
-     * \param mpduDuration the duration of the MPDU
+     * @param event the event holding incoming PPDU's information
+     * @param mpdu the arriving MPDU
+     * @param mpduIndex the index of the MPDU within the A-MPDU
+     * @param relativeStart the relative start time of the MPDU within the A-MPDU.
+     * @param mpduDuration the duration of the MPDU
      */
     void EndOfMpdu(Ptr<Event> event,
                    Ptr<WifiMpdu> mpdu,
@@ -695,18 +704,18 @@
     /**
      * Schedule end of MPDUs events.
      *
-     * \param event the event holding incoming PPDU's information
+     * @param event the event holding incoming PPDU's information
      */
     void ScheduleEndOfMpdus(Ptr<Event> event);
 
     /**
      * Perform amendment-specific actions when the payload is successfully received.
      *
-     * \param psdu the successfully received PSDU
-     * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
-     * \param txVector TXVECTOR of the PSDU
-     * \param staId the station ID of the PSDU (only used for MU)
-     * \param statusPerMpdu reception status per MPDU
+     * @param psdu the successfully received PSDU
+     * @param rxSignalInfo the info on the received signal (\see RxSignalInfo)
+     * @param txVector TXVECTOR of the PSDU
+     * @param staId the station ID of the PSDU (only used for MU)
+     * @param statusPerMpdu reception status per MPDU
      */
     virtual void RxPayloadSucceeded(Ptr<const WifiPsdu> psdu,
                                     RxSignalInfo rxSignalInfo,
@@ -716,9 +725,9 @@
     /**
      * Perform amendment-specific actions when the payload is unsuccessfuly received.
      *
-     * \param psdu the PSDU that we failed to received
-     * \param snr the SNR of the received PSDU in linear scale
-     * \param txVector TXVECTOR of the PSDU
+     * @param psdu the PSDU that we failed to received
+     * @param snr the SNR of the received PSDU in linear scale
+     * @param txVector TXVECTOR of the PSDU
      */
     virtual void RxPayloadFailed(Ptr<const WifiPsdu> psdu,
                                  double snr,
@@ -728,16 +737,16 @@
      * Perform amendment-specific actions at the end of the reception of
      * the payload.
      *
-     * \param ppdu the incoming PPDU
+     * @param ppdu the incoming PPDU
      */
     virtual void DoEndReceivePayload(Ptr<const WifiPpdu> ppdu);
 
     /**
      * Get the channel width and band to use (will be overloaded by child classes).
      *
-     * \param txVector the transmission parameters
-     * \param staId the station ID of the PSDU
-     * \return a pair of channel width and band
+     * @param txVector the transmission parameters
+     * @param staId the station ID of the PSDU
+     * @return a pair of channel width and band
      */
     virtual std::pair<MHz_u, WifiSpectrumBandInfo> GetChannelWidthAndBand(
         const WifiTxVector& txVector,
@@ -746,7 +755,7 @@
     /**
      * Abort the current reception.
      *
-     * \param reason the reason the reception is aborted
+     * @param reason the reason the reception is aborted
      */
     void AbortCurrentReception(WifiPhyRxfailureReason reason);
 
@@ -754,45 +763,45 @@
      * Obtain a random value from the WifiPhy's generator.
      * Wrapper used by child classes.
      *
-     * \return a uniform random value
+     * @return a uniform random value
      */
     double GetRandomValue() const;
     /**
      * Obtain the SNR and PER of the PPDU field from the WifiPhy's InterferenceHelper class.
      * Wrapper used by child classes.
      *
-     * \param field the PPDU field
-     * \param event the event holding incoming PPDU's information
-     * \return the SNR and PER
+     * @param field the PPDU field
+     * @param event the event holding incoming PPDU's information
+     * @return the SNR and PER
      */
     SnrPer GetPhyHeaderSnrPer(WifiPpduField field, Ptr<Event> event) const;
     /**
      * Obtain the received power for a given band.
      * Wrapper used by child classes.
      *
-     * \param event the event holding incoming PPDU's information
-     * \return the received power for the event over a given band
+     * @param event the event holding incoming PPDU's information
+     * @return the received power for the event over a given band
      */
     Watt_u GetRxPowerForPpdu(Ptr<Event> event) const;
     /**
      * Get the pointer to the current event (stored in WifiPhy).
      * Wrapper used by child classes.
      *
-     * \return the pointer to the current event
+     * @return the pointer to the current event
      */
     Ptr<const Event> GetCurrentEvent() const;
     /**
      * Get the map of current preamble events (stored in WifiPhy).
      * Wrapper used by child classes.
      *
-     * \return the reference to the map of current preamble events
+     * @return the reference to the map of current preamble events
      */
     const std::map<std::pair<uint64_t, WifiPreamble>, Ptr<Event>>& GetCurrentPreambleEvents() const;
     /**
      * Add an entry to the map of current preamble events (stored in WifiPhy).
      * Wrapper used by child classes.
      *
-     * \param event the event holding incoming PPDU's information
+     * @param event the event holding incoming PPDU's information
      */
     void AddPreambleEvent(Ptr<Event> event);
 
@@ -800,12 +809,12 @@
      * Create an event using WifiPhy's InterferenceHelper class.
      * Wrapper used by child classes.
      *
-     * \param ppdu the PPDU
-     * \param duration the PPDU duration
-     * \param rxPower received power per band (W)
-     * \param isStartHePortionRxing flag whether the event corresponds to the start of the OFDMA
+     * @param ppdu the PPDU
+     * @param duration the PPDU duration
+     * @param rxPower received power per band (W)
+     * @param isStartHePortionRxing flag whether the event corresponds to the start of the OFDMA
      * payload reception (only used for UL-OFDMA)
-     * \return the created event
+     * @return the created event
      */
     Ptr<Event> CreateInterferenceEvent(Ptr<const WifiPpdu> ppdu,
                                        Time duration,
@@ -820,9 +829,9 @@
      * updated accordingly. Otherwise, a new interference event is created and PPDU is dropped by
      * the PHY.
      *
-     * \param event the event of the ongoing reception
-     * \param ppdu the newly received PPDU (UL MU or non-HT duplicate)
-     * \param rxPower the received power (W) per band of the newly received PPDU
+     * @param event the event of the ongoing reception
+     * @param ppdu the newly received PPDU (UL MU or non-HT duplicate)
+     * @param rxPower the received power (W) per band of the newly received PPDU
      */
     virtual void HandleRxPpduWithSameContent(Ptr<Event> event,
                                              Ptr<const WifiPpdu> ppdu,
@@ -832,14 +841,14 @@
      * Notify WifiPhy's InterferenceHelper of the end of the reception,
      * clear maps and end of MPDU event, and eventually reset WifiPhy.
      *
-     * \param reset whether to reset WifiPhy
+     * @param reset whether to reset WifiPhy
      */
     void NotifyInterferenceRxEndAndClear(bool reset);
 
     /**
-     * \param txPower power to spread across the bands
-     * \param ppdu the PPDU that will be transmitted
-     * \return Pointer to SpectrumValue
+     * @param txPower power to spread across the bands
+     * @param ppdu the PPDU that will be transmitted
+     * @return Pointer to SpectrumValue
      *
      * This is a helper function to create the right TX PSD corresponding
      * to the amendment of this PHY.
@@ -850,8 +859,8 @@
     /**
      * Fire the trace indicating that the PHY is starting to receive the payload of a PPDU.
      *
-     * \param txVector the TXVECTOR used to transmit the PPDU
-     * \param payloadDuration the TX duration of the PPDU payload
+     * @param txVector the TXVECTOR used to transmit the PPDU
+     * @param payloadDuration the TX duration of the PPDU payload
      */
     void NotifyPayloadBegin(const WifiTxVector& txVector, const Time& payloadDuration);
 
@@ -862,9 +871,9 @@
      * channel width). Otherwise, this call is equivalent to GetBand with
      * <i>bandIndex</i> equal to zero.
      *
-     * \param bandWidth the width of the band to be returned
+     * @param bandWidth the width of the band to be returned
      *
-     * \return the info corresponding to the band
+     * @return the info corresponding to the band
      */
     WifiSpectrumBandInfo GetPrimaryBand(MHz_u bandWidth) const;
     /**
@@ -872,47 +881,47 @@
      * the secondary channel of the given bandwidth (which must be a multiple of 20 MHz
      * and not exceed the operating channel width).
      *
-     * \param bandWidth the width of the band to be returned
+     * @param bandWidth the width of the band to be returned
      *
-     * \return the info corresponding to the band
+     * @return the info corresponding to the band
      */
     WifiSpectrumBandInfo GetSecondaryBand(MHz_u bandWidth) const;
 
     /**
      * Return the channel width used to measure the RSSI.
      *
-     * \param ppdu the PPDU that is being received
-     * \return the channel width used for RSSI measurement
+     * @param ppdu the PPDU that is being received
+     * @return the channel width used for RSSI measurement
      */
     virtual MHz_u GetMeasurementChannelWidth(const Ptr<const WifiPpdu> ppdu) const = 0;
 
     /**
      * Return the channel width used in the reception spectrum model.
      *
-     * \param txVector the TXVECTOR of the PPDU that is being received
-     * \return the channel width used for RxSpectrumModel
+     * @param txVector the TXVECTOR of the PPDU that is being received
+     * @return the channel width used for RxSpectrumModel
      */
     virtual MHz_u GetRxChannelWidth(const WifiTxVector& txVector) const;
 
     /**
      * Return the delay until CCA busy is ended for a given sensitivity threshold and a given band.
      *
-     * \param threshold the CCA sensitivity threshold
-     * \param band identify the requested band
-     * \return the delay until CCA busy is ended
+     * @param threshold the CCA sensitivity threshold
+     * @param band identify the requested band
+     * @return the delay until CCA busy is ended
      */
     Time GetDelayUntilCcaEnd(dBm_u threshold, const WifiSpectrumBandInfo& band);
 
     /**
-     * \param currentChannelWidth channel width of the current transmission
-     * \return the width of the guard band
+     * @param currentChannelWidth channel width of the current transmission
+     * @return the width of the guard band
      *
      * Wrapper method used by child classes for PSD generation.
      * Note that this method is necessary for testing UL OFDMA.
      */
     MHz_u GetGuardBandwidth(MHz_u currentChannelWidth) const;
     /**
-     * \return a tuple containing the minimum rejection for the inner band,
+     * @return a tuple containing the minimum rejection for the inner band,
      *                            the minimum rejection for the outer band, and
      *                            the maximum rejection for the outer band
      *                            for the transmit spectrum mask.
@@ -930,8 +939,8 @@
      * Get CCA end time and its corresponding channel list type when a new signal has been received
      * by the PHY.
      *
-     * \param ppdu the incoming PPDU or nullptr for any signal
-     * \return CCA end time and its corresponding channel list type when a new signal has been
+     * @param ppdu the incoming PPDU or nullptr for any signal
+     * @return CCA end time and its corresponding channel list type when a new signal has been
      * received by the PHY, or std::nullopt if all channel list types are IDLE.
      */
     virtual CcaIndication GetCcaIndication(const Ptr<const WifiPpdu> ppdu);
@@ -943,8 +952,9 @@
     std::list<WifiMode> m_modeList; //!< the list of supported modes
 
     std::vector<EventId> m_endPreambleDetectionEvents; //!< the end of preamble detection events
-    std::vector<EventId> m_endOfMpduEvents;   //!< the end of MPDU events (only used for A-MPDUs)
-    std::vector<EventId> m_endOfMacHdrEvents; //!< the end of MAC header events
+    std::vector<EventId> m_endOfMpduEvents; //!< the end of MPDU events (only used for A-MPDUs)
+    std::map<uint16_t, std::vector<EventId>>
+        m_endOfMacHdrEvents; //!< STA_ID-indexed map of the RX end of MAC header events
 
     std::vector<EventId>
         m_endRxPayloadEvents; //!< the end of receive events (only one unless UL MU reception)
@@ -965,19 +975,19 @@
 };                                   // class PhyEntity
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the stream
- * \param action the action to perform in case of failure
- * \returns a reference to the stream
+ * @param os the stream
+ * @param action the action to perform in case of failure
+ * @returns a reference to the stream
  */
 std::ostream& operator<<(std::ostream& os, const PhyEntity::PhyRxFailureAction& action);
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the stream
- * \param status the status of the reception of a PPDU field
- * \returns a reference to the stream
+ * @param os the stream
+ * @param status the status of the reception of a PPDU field
+ * @returns a reference to the stream
  */
 std::ostream& operator<<(std::ostream& os, const PhyEntity::PhyFieldRxStatus& status);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/preamble-detection-model.h ns-3.44/src/wifi/model/preamble-detection-model.h
--- ns-3.43/src/wifi/model/preamble-detection-model.h	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/preamble-detection-model.h	2025-03-09 16:55:49.795372700 -0700
@@ -17,16 +17,16 @@
 {
 
 /**
- * \ingroup wifi
- * \brief the interface for Wifi's preamble detection models
+ * @ingroup wifi
+ * @brief the interface for Wifi's preamble detection models
  *
  */
 class PreambleDetectionModel : public Object
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -34,11 +34,11 @@
      * A pure virtual method that must be implemented in the subclass.
      * This method returns whether the preamble detection was successful.
      *
-     * \param rssi the RSSI of the received signal.
-     * \param snr the SNR of the received signal in linear scale.
-     * \param channelWidth the channel width of the received signal.
+     * @param rssi the RSSI of the received signal.
+     * @param snr the SNR of the received signal in linear scale.
+     * @param channelWidth the channel width of the received signal.
      *
-     * \return true if the preamble has been detected,
+     * @return true if the preamble has been detected,
      *         false otherwise
      */
     virtual bool IsPreambleDetected(dBm_u rssi, double snr, MHz_u channelWidth) const = 0;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/qos-frame-exchange-manager.cc ns-3.44/src/wifi/model/qos-frame-exchange-manager.cc
--- ns-3.43/src/wifi/model/qos-frame-exchange-manager.cc	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/qos-frame-exchange-manager.cc	2025-03-09 16:55:49.795372700 -0700
@@ -74,7 +74,6 @@
 {
     NS_LOG_FUNCTION(this);
     NS_ASSERT(m_edca);
-    NS_ASSERT(m_edca->GetTxopLimit(m_linkId).IsStrictlyPositive());
 
     WifiMacHeader cfEnd;
     cfEnd.SetType(WIFI_MAC_CTL_END);
@@ -91,10 +90,10 @@
 
     auto mpdu = Create<WifiMpdu>(Create<Packet>(), cfEnd);
     auto txDuration =
-        m_phy->CalculateTxDuration(mpdu->GetSize(), cfEndTxVector, m_phy->GetPhyBand());
+        WifiPhy::CalculateTxDuration(mpdu->GetSize(), cfEndTxVector, m_phy->GetPhyBand());
 
-    // Send the CF-End frame if the remaining duration is long enough to transmit this frame
-    if (m_edca->GetRemainingTxop(m_linkId) > txDuration)
+    // Send the CF-End frame if the remaining TXNAV is long enough to transmit this frame
+    if (m_txNav > Simulator::Now() + txDuration)
     {
         NS_LOG_DEBUG("Send CF-End frame");
         ForwardMpduDown(mpdu, cfEndTxVector);
@@ -111,9 +110,9 @@
 }
 
 void
-QosFrameExchangeManager::PifsRecovery()
+QosFrameExchangeManager::PifsRecovery(bool forceCurrentCw)
 {
-    NS_LOG_FUNCTION(this);
+    NS_LOG_FUNCTION(this << forceCurrentCw);
     NS_ASSERT(m_edca);
     NS_ASSERT(m_edca->GetTxopStartTime(m_linkId).has_value());
 
@@ -122,9 +121,14 @@
         m_allowedWidth,
         m_channelAccessManager->GetLargestIdlePrimaryChannel(m_phy->GetPifs(), Simulator::Now()));
 
-    if (m_allowedWidth == 0)
+    if (m_allowedWidth == MHz_u{0})
     {
+        // PIFS recovery failed, TXOP is terminated
         NotifyChannelReleased(m_edca);
+        if (!forceCurrentCw)
+        {
+            m_edca->UpdateFailedCw(m_linkId);
+        }
         m_edca = nullptr;
     }
     else
@@ -484,9 +488,10 @@
     // is set to cover the remaining TXOP time (Sec. 9.2.5.2 of 802.11-2016).
     // The TXOP holder may exceed the TXOP limit in some situations (Sec. 10.22.2.8
     // of 802.11-2016)
-    return std::max(m_edca->GetRemainingTxop(m_linkId) -
-                        m_phy->CalculateTxDuration(size, txParams.m_txVector, m_phy->GetPhyBand()),
-                    *txParams.m_acknowledgment->acknowledgmentTime);
+    return std::max(
+        m_edca->GetRemainingTxop(m_linkId) -
+            WifiPhy::CalculateTxDuration(size, txParams.m_txVector, m_phy->GetPhyBand()),
+        *txParams.m_acknowledgment->acknowledgmentTime);
 }
 
 Time
@@ -511,9 +516,10 @@
     // is set to cover the remaining TXOP time (Sec. 9.2.5.2 of 802.11-2016).
     // The TXOP holder may exceed the TXOP limit in some situations (Sec. 10.22.2.8
     // of 802.11-2016)
-    return std::max(m_edca->GetRemainingTxop(m_linkId) -
-                        m_phy->CalculateTxDuration(GetRtsSize(), rtsTxVector, m_phy->GetPhyBand()),
-                    Seconds(0));
+    return std::max(
+        m_edca->GetRemainingTxop(m_linkId) -
+            WifiPhy::CalculateTxDuration(GetRtsSize(), rtsTxVector, m_phy->GetPhyBand()),
+        Seconds(0));
 }
 
 Time
@@ -538,9 +544,10 @@
     // is set to cover the remaining TXOP time (Sec. 9.2.5.2 of 802.11-2016).
     // The TXOP holder may exceed the TXOP limit in some situations (Sec. 10.22.2.8
     // of 802.11-2016)
-    return std::max(m_edca->GetRemainingTxop(m_linkId) -
-                        m_phy->CalculateTxDuration(GetCtsSize(), ctsTxVector, m_phy->GetPhyBand()),
-                    Seconds(0));
+    return std::max(
+        m_edca->GetRemainingTxop(m_linkId) -
+            WifiPhy::CalculateTxDuration(GetCtsSize(), ctsTxVector, m_phy->GetPhyBand()),
+        Seconds(0));
 }
 
 void
@@ -583,6 +590,11 @@
 
         // we are continuing a TXOP, hence the txopDuration parameter is unused
         Simulator::Schedule(m_phy->GetSifs(), fp, this, m_edca, Seconds(0));
+
+        if (m_protectedIfResponded)
+        {
+            m_protectedStas.merge(m_sentFrameTo);
+        }
     }
     else
     {
@@ -590,17 +602,18 @@
         m_edca = nullptr;
     }
     m_initialFrame = false;
+    m_sentFrameTo.clear();
 }
 
 void
-QosFrameExchangeManager::TransmissionFailed()
+QosFrameExchangeManager::TransmissionFailed(bool forceCurrentCw)
 {
-    NS_LOG_FUNCTION(this);
+    NS_LOG_FUNCTION(this << forceCurrentCw);
 
     // TODO This will be removed once no Txop is installed on a QoS station
     if (!m_edca)
     {
-        FrameExchangeManager::TransmissionFailed();
+        FrameExchangeManager::TransmissionFailed(forceCurrentCw);
         return;
     }
 
@@ -609,6 +622,10 @@
         // The backoff procedure shall be invoked by an EDCAF when the transmission
         // of an MPDU in the initial PPDU of a TXOP fails (Sec. 10.22.2.2 of 802.11-2016)
         NS_LOG_DEBUG("TX of the initial frame of a TXOP failed: terminate TXOP");
+        if (!forceCurrentCw)
+        {
+            m_edca->UpdateFailedCw(m_linkId);
+        }
         NotifyChannelReleased(m_edca);
         m_edca = nullptr;
     }
@@ -633,8 +650,10 @@
             // the medium is idle in a PIFS
             NS_LOG_DEBUG("TX of a non-initial frame of a TXOP failed: perform PIFS recovery");
             NS_ASSERT(!m_pifsRecoveryEvent.IsPending());
-            m_pifsRecoveryEvent =
-                Simulator::Schedule(m_phy->GetPifs(), &QosFrameExchangeManager::PifsRecovery, this);
+            m_pifsRecoveryEvent = Simulator::Schedule(m_phy->GetPifs(),
+                                                      &QosFrameExchangeManager::PifsRecovery,
+                                                      this,
+                                                      forceCurrentCw);
         }
         else
         {
@@ -643,11 +662,19 @@
             // requests channel access if needed,
             NS_LOG_DEBUG("TX of a non-initial frame of a TXOP failed: invoke backoff");
             m_edca->Txop::NotifyChannelReleased(m_linkId);
+            // CW and QSRC shall be updated in this case (see Section 10.23.2.2 of 802.11-2020)
+            if (!forceCurrentCw)
+            {
+                m_edca->UpdateFailedCw(m_linkId);
+            }
             m_edcaBackingOff = m_edca;
             m_edca = nullptr;
         }
     }
     m_initialFrame = false;
+    m_sentFrameTo.clear();
+    // reset TXNAV because transmission failed
+    m_txNav = Simulator::Now();
 }
 
 void
@@ -667,10 +694,9 @@
                 NS_LOG_DEBUG("Station " << hdr.GetAddr2() << " reported a buffer status of "
                                         << +hdr.GetQosQueueSize()
                                         << " for tid=" << +hdr.GetQosTid());
-                StaticCast<ApWifiMac>(m_mac)->SetBufferStatus(
-                    hdr.GetQosTid(),
-                    mpdu->GetOriginal()->GetHeader().GetAddr2(),
-                    hdr.GetQosQueueSize());
+                m_apMac->SetBufferStatus(hdr.GetQosTid(),
+                                         mpdu->GetOriginal()->GetHeader().GetAddr2(),
+                                         hdr.GetQosQueueSize());
             }
         }
     }
@@ -702,6 +728,12 @@
 }
 
 std::optional<Mac48Address>
+QosFrameExchangeManager::GetTxopHolder() const
+{
+    return m_txopHolder;
+}
+
+std::optional<Mac48Address>
 QosFrameExchangeManager::FindTxopHolder(const WifiMacHeader& hdr, const WifiTxVector& txVector)
 {
     NS_LOG_FUNCTION(this << hdr << txVector);
@@ -760,6 +792,8 @@
                                      const WifiTxVector& txVector,
                                      bool inAmpdu)
 {
+    NS_LOG_FUNCTION(this << *mpdu << rxSignalInfo << txVector << inAmpdu);
+
     // The received MPDU is either broadcast or addressed to this station
     NS_ASSERT(mpdu->GetHeader().GetAddr1().IsGroup() || mpdu->GetHeader().GetAddr1() == m_self);
 
@@ -778,12 +812,12 @@
         if (hdr.GetAddr2() == m_txopHolder || VirtualCsMediumIdle())
         {
             NS_LOG_DEBUG("Received RTS from=" << hdr.GetAddr2() << ", schedule CTS");
-            Simulator::Schedule(m_phy->GetSifs(),
-                                &QosFrameExchangeManager::SendCtsAfterRts,
-                                this,
-                                hdr,
-                                txVector.GetMode(),
-                                rxSnr);
+            m_sendCtsEvent = Simulator::Schedule(m_phy->GetSifs(),
+                                                 &QosFrameExchangeManager::SendCtsAfterRts,
+                                                 this,
+                                                 hdr,
+                                                 txVector.GetMode(),
+                                                 rxSnr);
         }
         else
         {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/qos-frame-exchange-manager.h ns-3.44/src/wifi/model/qos-frame-exchange-manager.h
--- ns-3.43/src/wifi/model/qos-frame-exchange-manager.h	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/qos-frame-exchange-manager.h	2025-03-09 16:55:49.795372700 -0700
@@ -17,7 +17,7 @@
 {
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * QosFrameExchangeManager handles the frame exchange sequences
  * for QoS stations.
@@ -27,8 +27,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     QosFrameExchangeManager();
@@ -44,10 +44,10 @@
      * The protection and acknowledgment methods held by the given TX parameters are
      * only updated if the given MPDU can be added.
      *
-     * \param mpdu the MPDU to add to the frame being built
-     * \param txParams the TX parameters describing the frame being built
-     * \param availableTime the time limit on the frame exchange sequence
-     * \return true if the given MPDU can be added to the frame being built
+     * @param mpdu the MPDU to add to the frame being built
+     * @param txParams the TX parameters describing the frame being built
+     * @param availableTime the time limit on the frame exchange sequence
+     * @return true if the given MPDU can be added to the frame being built
      */
     bool TryAddMpdu(Ptr<const WifiMpdu> mpdu, WifiTxParameters& txParams, Time availableTime) const;
 
@@ -56,10 +56,10 @@
      * by the given TX parameters) without violating the given constraint on the
      * PPDU transmission duration.
      *
-     * \param mpdu the MPDU to add to the frame being built
-     * \param txParams the TX parameters describing the frame being built
-     * \param ppduDurationLimit the time limit on the PPDU transmission duration
-     * \return true if the given MPDU can be added to the frame being built
+     * @param mpdu the MPDU to add to the frame being built
+     * @param txParams the TX parameters describing the frame being built
+     * @param ppduDurationLimit the time limit on the PPDU transmission duration
+     * @return true if the given MPDU can be added to the frame being built
      */
     virtual bool IsWithinLimitsIfAddMpdu(Ptr<const WifiMpdu> mpdu,
                                          const WifiTxParameters& txParams,
@@ -72,11 +72,11 @@
      * <i>ppduPayloadSize</i>. Also check that the PSDU size does not exceed the
      * max PSDU size for the modulation class being used.
      *
-     * \param ppduPayloadSize the new PSDU size
-     * \param receiver the MAC address of the receiver of the PSDU
-     * \param txParams the TX parameters describing the frame being built
-     * \param ppduDurationLimit the limit on the PPDU duration
-     * \return true if the constraints on the PPDU duration limit and the maximum PSDU size are met
+     * @param ppduPayloadSize the new PSDU size
+     * @param receiver the MAC address of the receiver of the PSDU
+     * @param txParams the TX parameters describing the frame being built
+     * @param ppduDurationLimit the limit on the PPDU duration
+     * @return true if the constraints on the PPDU duration limit and the maximum PSDU size are met
      */
     virtual bool IsWithinSizeAndTimeLimits(uint32_t ppduPayloadSize,
                                            Mac48Address receiver,
@@ -88,11 +88,16 @@
      * This is required by 11be MLDs to support translation of MAC addresses. For single
      * link devices, the given MPDU is simply returned.
      *
-     * \param mpdu the given MPDU
-     * \return the alias of the given MPDU for transmission on this link
+     * @param mpdu the given MPDU
+     * @return the alias of the given MPDU for transmission on this link
      */
     virtual Ptr<WifiMpdu> CreateAliasIfNeeded(Ptr<WifiMpdu> mpdu) const;
 
+    /**
+     * @return the TXOP holder (if any)
+     */
+    std::optional<Mac48Address> GetTxopHolder() const;
+
   protected:
     void DoDispose() override;
 
@@ -115,17 +120,17 @@
                                 Time txDuration,
                                 Time response) const override;
     void TransmissionSucceeded() override;
-    void TransmissionFailed() override;
+    void TransmissionFailed(bool forceCurrentCw = false) override;
     void ForwardMpduDown(Ptr<WifiMpdu> mpdu, WifiTxVector& txVector) override;
 
     /**
      * Request the FrameExchangeManager to start a frame exchange sequence.
      *
-     * \param edca the EDCA that gained channel access
-     * \param txopDuration the duration of a TXOP. This value is only used when a
+     * @param edca the EDCA that gained channel access
+     * @param txopDuration the duration of a TXOP. This value is only used when a
      *                     new TXOP is started (and hence the TXOP limit for the
      *                     given EDCAF is non-zero)
-     * \return true if a frame exchange sequence was started, false otherwise
+     * @return true if a frame exchange sequence was started, false otherwise
      */
     virtual bool StartTransmission(Ptr<QosTxop> edca, Time txopDuration);
 
@@ -134,13 +139,13 @@
      * as needed) that fits within the given <i>availableTime</i> (if different than
      * Time::Min()).
      *
-     * \param edca the EDCAF which has been granted the opportunity to transmit
-     * \param availableTime the amount of time allowed for the frame exchange. Pass
+     * @param edca the EDCAF which has been granted the opportunity to transmit
+     * @param availableTime the amount of time allowed for the frame exchange. Pass
      *                      Time::Min() in case the TXOP limit is null
-     * \param initialFrame true if the frame being transmitted is the initial frame
+     * @param initialFrame true if the frame being transmitted is the initial frame
      *                     of the TXOP. This is used to determine whether the TXOP
      *                     limit can be exceeded
-     * \return true if a frame exchange is started, false otherwise
+     * @return true if a frame exchange is started, false otherwise
      */
     virtual bool StartFrameExchange(Ptr<QosTxop> edca, Time availableTime, bool initialFrame);
 
@@ -148,23 +153,26 @@
      * Perform a PIFS recovery as a response to transmission failure within a TXOP.
      * If the carrier sense indicates that the medium is idle, continue the TXOP.
      * Otherwise, release the channel.
+     *
+     * @param forceCurrentCw whether to force the contention window to stay equal to the current
+     *                       value if PIFs recovery fails (normally, contention window is updated)
      */
-    void PifsRecovery();
+    void PifsRecovery(bool forceCurrentCw);
 
     /**
      * Send a CF-End frame to indicate the completion of the TXOP, provided that
      * the remaining duration is long enough to transmit this frame.
      *
-     * \return true if a CF-End frame was sent, false otherwise
+     * @return true if a CF-End frame was sent, false otherwise
      */
     virtual bool SendCfEndIfNeeded();
 
     /**
      * Determine the holder of the TXOP, if possible, based on the received frame
      *
-     * \param hdr the MAC header of an MPDU included in the received PSDU
-     * \param txVector TX vector of the received PSDU
-     * \return the holder of the TXOP, if one was found
+     * @param hdr the MAC header of an MPDU included in the received PSDU
+     * @param txVector TX vector of the received PSDU
+     * @return the holder of the TXOP, if one was found
      */
     virtual std::optional<Mac48Address> FindTxopHolder(const WifiMacHeader& hdr,
                                                        const WifiTxVector& txVector);
@@ -183,8 +191,8 @@
     /**
      * Set the TXOP holder, if needed, based on the received frame
      *
-     * \param psdu the received PSDU
-     * \param txVector TX vector of the received PSDU
+     * @param psdu the received PSDU
+     * @param txVector TX vector of the received PSDU
      */
     void SetTxopHolder(Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/qos-txop.cc ns-3.44/src/wifi/model/qos-txop.cc
--- ns-3.43/src/wifi/model/qos-txop.cc	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/qos-txop.cc	2025-03-09 16:55:49.795372700 -0700
@@ -11,8 +11,10 @@
 
 #include "qos-txop.h"
 
+#include "ap-wifi-mac.h"
 #include "channel-access-manager.h"
 #include "ctrl-headers.h"
+#include "gcr-manager.h"
 #include "mac-tx-middle.h"
 #include "mgt-action-headers.h"
 #include "mpdu-aggregator.h"
@@ -85,7 +87,12 @@
             .AddTraceSource("TxopTrace",
                             "Trace source for TXOP start and duration times",
                             MakeTraceSourceAccessor(&QosTxop::m_txopTrace),
-                            "ns3::QosTxop::TxopTracedCallback");
+                            "ns3::QosTxop::TxopTracedCallback")
+            .AddTraceSource("BaEstablished",
+                            "A block ack agreement is established with the given recipient for "
+                            "the given TID (and the given GCR group address, if any).",
+                            MakeTraceSourceAccessor(&QosTxop::m_baEstablishedCallback),
+                            "ns3::QosTxop::BaEstablishedCallback");
     return tid;
 }
 
@@ -281,27 +288,31 @@
 }
 
 uint16_t
-QosTxop::GetBaBufferSize(Mac48Address address, uint8_t tid) const
+QosTxop::GetBaBufferSize(Mac48Address address, uint8_t tid, bool isGcr) const
 {
-    return m_baManager->GetRecipientBufferSize(address, tid);
+    return isGcr ? m_baManager->GetGcrBufferSize(address, tid)
+                 : m_baManager->GetRecipientBufferSize(address, tid);
 }
 
 uint16_t
-QosTxop::GetBaStartingSequence(Mac48Address address, uint8_t tid) const
+QosTxop::GetBaStartingSequence(Mac48Address address, uint8_t tid, bool isGcr) const
 {
-    return m_baManager->GetOriginatorStartingSequence(address, tid);
+    return isGcr ? m_baManager->GetGcrStartingSequence(address, tid)
+                 : m_baManager->GetOriginatorStartingSequence(address, tid);
 }
 
 std::pair<CtrlBAckRequestHeader, WifiMacHeader>
-QosTxop::PrepareBlockAckRequest(Mac48Address recipient, uint8_t tid) const
+QosTxop::PrepareBlockAckRequest(Mac48Address recipient,
+                                uint8_t tid,
+                                std::optional<Mac48Address> gcrGroupAddr) const
 {
-    NS_LOG_FUNCTION(this << recipient << +tid);
+    NS_LOG_FUNCTION(this << recipient << +tid << gcrGroupAddr.has_value());
     NS_ASSERT(QosUtilsMapTidToAc(tid) == m_ac);
 
     auto recipientMld = m_mac->GetMldAddress(recipient);
 
-    CtrlBAckRequestHeader reqHdr =
-        m_baManager->GetBlockAckReqHeader(recipientMld.value_or(recipient), tid);
+    auto reqHdr =
+        m_baManager->GetBlockAckReqHeader(recipientMld.value_or(recipient), tid, gcrGroupAddr);
 
     WifiMacHeader hdr;
     hdr.SetType(WIFI_MAC_CTL_BACKREQ);
@@ -381,7 +392,10 @@
         {
             return m_queue->PeekFirstAvailable(linkId, mpdu);
         }
-        WifiContainerQueueId queueId(WIFI_QOSDATA_QUEUE, WIFI_UNICAST, recipient, tid);
+        WifiContainerQueueId queueId(WIFI_QOSDATA_QUEUE,
+                                     recipient.IsGroup() ? WIFI_GROUPCAST : WIFI_UNICAST,
+                                     recipient,
+                                     tid);
         if (auto mask = m_mac->GetMacQueueScheduler()->GetQueueLinkMask(m_ac, queueId, linkId);
             mask && mask->none())
         {
@@ -426,13 +440,25 @@
                 break;
             }
 
-            // if no BA agreement, we cannot have multiple MPDUs in-flight
-            if (item->GetHeader().IsQosData() &&
-                !m_mac->GetBaAgreementEstablishedAsOriginator(item->GetHeader().GetAddr1(),
-                                                              item->GetHeader().GetQosTid()))
+            if (item->GetHeader().IsQosData())
             {
-                NS_LOG_DEBUG("No BA agreement and an MPDU is already in-flight");
-                return nullptr;
+                auto apMac = DynamicCast<ApWifiMac>(m_mac);
+                const auto isGcr = IsGcr(m_mac, item->GetHeader());
+                const auto agreementEstablished =
+                    isGcr
+                        ? apMac->IsGcrBaAgreementEstablishedWithAllMembers(
+                              item->GetHeader().GetAddr1(),
+                              item->GetHeader().GetQosTid())
+                        : m_mac
+                              ->GetBaAgreementEstablishedAsOriginator(item->GetHeader().GetAddr1(),
+                                                                      item->GetHeader().GetQosTid())
+                              .has_value();
+                // if no BA agreement, we cannot have multiple MPDUs in-flight
+                if (!agreementEstablished)
+                {
+                    NS_LOG_DEBUG("No BA agreement and an MPDU is already in-flight");
+                    return nullptr;
+                }
             }
 
             NS_LOG_DEBUG("Skipping in flight MPDU: " << *item);
@@ -457,21 +483,24 @@
         return nullptr;
     }
 
-    WifiMacHeader& hdr = item->GetHeader();
+    auto& hdr = item->GetHeader();
 
     // peek the next sequence number and check if it is within the transmit window
     // in case of QoS data frame
-    uint16_t sequence = item->HasSeqNoAssigned() ? hdr.GetSequenceNumber()
-                                                 : m_txMiddle->PeekNextSequenceNumberFor(&hdr);
+    const auto sequence = item->HasSeqNoAssigned() ? hdr.GetSequenceNumber()
+                                                   : m_txMiddle->PeekNextSequenceNumberFor(&hdr);
     if (hdr.IsQosData())
     {
-        Mac48Address recipient = hdr.GetAddr1();
-        uint8_t tid = hdr.GetQosTid();
-
-        if (m_mac->GetBaAgreementEstablishedAsOriginator(recipient, tid) &&
-            !IsInWindow(sequence,
-                        GetBaStartingSequence(recipient, tid),
-                        GetBaBufferSize(recipient, tid)))
+        const auto recipient = hdr.GetAddr1();
+        const auto tid = hdr.GetQosTid();
+        const auto isGcr = IsGcr(m_mac, hdr);
+        const auto bufferSize = GetBaBufferSize(recipient, tid, isGcr);
+        const auto startSeq = GetBaStartingSequence(recipient, tid, isGcr);
+        auto apMac = DynamicCast<ApWifiMac>(m_mac);
+        const auto agreementEstablished =
+            isGcr ? apMac->IsGcrBaAgreementEstablishedWithAllMembers(recipient, tid)
+                  : m_mac->GetBaAgreementEstablishedAsOriginator(recipient, tid).has_value();
+        if (agreementEstablished && !IsInWindow(sequence, startSeq, bufferSize))
         {
             NS_LOG_DEBUG("Packet beyond the end of the current transmit window");
             return nullptr;
@@ -530,10 +559,14 @@
                       GetBaBufferSize(peekedItem->GetOriginal()->GetHeader().GetAddr1(), tid)));
 
         // try A-MSDU aggregation if the MPDU does not contain an A-MSDU and does not already
-        // have a sequence number assigned (may be a retransmission)
-        if (m_mac->GetHtConfiguration() && !recipient.IsBroadcast() &&
-            !peekedItem->GetHeader().IsQosAmsdu() && !peekedItem->HasSeqNoAssigned() &&
-            !peekedItem->IsFragment())
+        // have a sequence number assigned (may be a retransmission) unless it is a concealed GCR
+        // MPDU:
+        if (auto apMac = DynamicCast<ApWifiMac>(m_mac);
+            m_mac->GetHtConfiguration() && !recipient.IsBroadcast() &&
+            !peekedItem->GetHeader().IsQosAmsdu() && !peekedItem->IsFragment() &&
+            (!peekedItem->HasSeqNoAssigned() ||
+             (IsGcr(m_mac, peekedItem->GetHeader()) &&
+              (apMac->GetGcrManager()->UseConcealment(peekedItem->GetHeader())))))
         {
             auto htFem = StaticCast<HtFrameExchangeManager>(qosFem);
             mpdu = htFem->GetMsduAggregator()->GetNextAmsdu(peekedItem, txParams, availableTime);
@@ -652,7 +685,11 @@
 
     if (respHdr.GetStatusCode().IsSuccess())
     {
-        NS_LOG_DEBUG("block ack agreement established with " << recipient << " tid " << +tid);
+        const auto gcrGroup = respHdr.GetGcrGroupAddress();
+        NS_LOG_DEBUG("block ack agreement established with "
+                     << recipient << " tid " << +tid << (gcrGroup ? " group " : "")
+                     << (gcrGroup ? gcrGroup->ConvertTo() : Address()));
+        m_baEstablishedCallback(recipient, tid, gcrGroup);
         // A (destination, TID) pair is "blocked" (i.e., no more packets are sent) when an
         // Add BA Request is sent to the destination. However, when the Add BA Request timer
         // expires, the (destination, TID) pair is "unblocked" and packets to the destination are
@@ -660,8 +697,9 @@
         // already assigned waiting to be retransmitted (or being transmitted on another link)
         // when the Add BA Response is received. In this case, the starting sequence number shall
         // be set equal to the sequence number of such packet.
-        uint16_t startingSeq = m_txMiddle->GetNextSeqNumberByTidAndAddress(tid, recipient);
-        auto peekedItem = m_queue->PeekByTidAndAddress(tid, recipient);
+        const auto queueRecipient = respHdr.GetGcrGroupAddress().value_or(recipient);
+        auto startingSeq = m_txMiddle->GetNextSeqNumberByTidAndAddress(tid, queueRecipient);
+        auto peekedItem = m_queue->PeekByTidAndAddress(tid, queueRecipient);
         if (peekedItem && peekedItem->HasSeqNoAssigned())
         {
             startingSeq = peekedItem->GetHeader().GetSequenceNumber();
@@ -671,7 +709,9 @@
     else
     {
         NS_LOG_DEBUG("discard ADDBA response" << recipient);
-        m_baManager->NotifyOriginatorAgreementRejected(recipient, tid);
+        m_baManager->NotifyOriginatorAgreementRejected(recipient,
+                                                       tid,
+                                                       respHdr.GetGcrGroupAddress());
     }
 }
 
@@ -680,23 +720,43 @@
 {
     NS_LOG_FUNCTION(this << delBaHdr << recipient);
     NS_LOG_DEBUG("received DELBA frame from=" << recipient);
-    m_baManager->DestroyOriginatorAgreement(recipient, delBaHdr->GetTid());
+    m_baManager->DestroyOriginatorAgreement(recipient,
+                                            delBaHdr->GetTid(),
+                                            delBaHdr->GetGcrGroupAddress());
 }
 
 void
-QosTxop::NotifyOriginatorAgreementNoReply(const Mac48Address& recipient, uint8_t tid)
+QosTxop::NotifyOriginatorAgreementNoReply(const Mac48Address& recipient,
+                                          uint8_t tid,
+                                          std::optional<Mac48Address> gcrGroupAddr)
 {
-    NS_LOG_FUNCTION(this << recipient << tid);
-    m_baManager->NotifyOriginatorAgreementNoReply(recipient, tid);
+    NS_LOG_FUNCTION(this << recipient << tid << gcrGroupAddr.has_value());
+    m_baManager->NotifyOriginatorAgreementNoReply(recipient, tid, gcrGroupAddr);
 }
 
 void
 QosTxop::CompleteMpduTx(Ptr<WifiMpdu> mpdu)
 {
+    NS_LOG_FUNCTION(this << *mpdu);
     NS_ASSERT(mpdu->GetHeader().IsQosData());
     // If there is an established BA agreement, store the packet in the queue of outstanding packets
-    if (m_mac->GetBaAgreementEstablishedAsOriginator(mpdu->GetHeader().GetAddr1(),
-                                                     mpdu->GetHeader().GetQosTid()))
+
+    if (auto apMac = DynamicCast<ApWifiMac>(m_mac);
+        IsGcr(m_mac, mpdu->GetHeader()) &&
+        (apMac->GetGcrManager()->GetRetransmissionPolicyFor(mpdu->GetHeader()) ==
+         GroupAddressRetransmissionPolicy::GCR_BLOCK_ACK))
+    {
+        NS_ASSERT(mpdu->IsQueued());
+        NS_ASSERT(m_queue->GetAc() == mpdu->GetQueueAc());
+        const auto recipient = mpdu->begin()->second.GetDestinationAddr();
+        m_baManager->StoreGcrPacket(
+            m_queue->GetOriginal(mpdu),
+            apMac->GetGcrManager()->GetMemberStasForGroupAddress(recipient));
+        return;
+    }
+
+    if (const auto recipient = mpdu->GetHeader().GetAddr1();
+        m_mac->GetBaAgreementEstablishedAsOriginator(recipient, mpdu->GetHeader().GetQosTid()))
     {
         NS_ASSERT(mpdu->IsQueued());
         NS_ASSERT(m_queue->GetAc() == mpdu->GetQueueAc());
@@ -733,30 +793,37 @@
 }
 
 void
-QosTxop::AddBaResponseTimeout(Mac48Address recipient, uint8_t tid)
+QosTxop::AddBaResponseTimeout(Mac48Address recipient,
+                              uint8_t tid,
+                              std::optional<Mac48Address> gcrGroupAddr)
 {
-    NS_LOG_FUNCTION(this << recipient << +tid);
+    NS_LOG_FUNCTION(this << recipient << +tid << gcrGroupAddr.has_value());
     // If agreement is still pending, ADDBA response is not received
-    if (auto agreement = m_baManager->GetAgreementAsOriginator(recipient, tid);
-        agreement && agreement->get().IsPending())
+    auto agreement = m_baManager->GetAgreementAsOriginator(recipient, tid, gcrGroupAddr);
+    if (agreement && agreement->get().IsPending())
     {
-        NotifyOriginatorAgreementNoReply(recipient, tid);
-        Simulator::Schedule(m_failedAddBaTimeout, &QosTxop::ResetBa, this, recipient, tid);
+        NotifyOriginatorAgreementNoReply(recipient, tid, gcrGroupAddr);
+        Simulator::Schedule(m_failedAddBaTimeout,
+                            &QosTxop::ResetBa,
+                            this,
+                            recipient,
+                            tid,
+                            gcrGroupAddr);
     }
 }
 
 void
-QosTxop::ResetBa(Mac48Address recipient, uint8_t tid)
+QosTxop::ResetBa(Mac48Address recipient, uint8_t tid, std::optional<Mac48Address> gcrGroupAddr)
 {
-    NS_LOG_FUNCTION(this << recipient << +tid);
+    NS_LOG_FUNCTION(this << recipient << +tid << gcrGroupAddr.has_value());
     // This function is scheduled when waiting for an ADDBA response. However,
     // before this function is called, a DELBA request may arrive, which causes
     // the agreement to be deleted. Hence, check if an agreement exists before
     // notifying that the agreement has to be reset.
-    if (auto agreement = m_baManager->GetAgreementAsOriginator(recipient, tid);
-        agreement && !agreement->get().IsEstablished())
+    auto agreement = m_baManager->GetAgreementAsOriginator(recipient, tid, gcrGroupAddr);
+    if (agreement && !agreement->get().IsEstablished())
     {
-        m_baManager->NotifyOriginatorAgreementReset(recipient, tid);
+        m_baManager->NotifyOriginatorAgreementReset(recipient, tid, gcrGroupAddr);
     }
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/qos-txop.h ns-3.44/src/wifi/model/qos-txop.h
--- ns-3.43/src/wifi/model/qos-txop.h	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/qos-txop.h	2025-03-09 16:55:49.795372700 -0700
@@ -30,9 +30,9 @@
 class WifiTxParameters;
 
 /**
- * \brief Handles the packet queue and stores DCF/EDCA access parameters
+ * @brief Handles the packet queue and stores DCF/EDCA access parameters
  * (one Txop per AC).
- * \ingroup wifi
+ * @ingroup wifi
  *
  * This class handles the packet queue and stores DCF/EDCA access
  * parameters (one Txop per AC). It generates backoff values and stores the channel access status
@@ -52,8 +52,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -69,169 +69,182 @@
     /**
      * Get the access category of this object.
      *
-     * \return the access category.
+     * @return the access category.
      */
     AcIndex GetAccessCategory() 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
+     * @return true if an explicit BlockAckRequest is sent after a missed BlockAck
      */
     bool UseExplicitBarAfterMissedBlockAck() const;
 
     /**
      * Get the Block Ack Manager associated with this QosTxop.
      *
-     * \returns the Block Ack Manager
+     * @returns the Block Ack Manager
      */
     Ptr<BlockAckManager> GetBaManager();
     /**
-     * \param address recipient address of the peer station
-     * \param tid traffic ID.
+     * @param address recipient address of the peer station or the group address for GCR.
+     * @param tid traffic ID.
+     * @param isGcr flag to indicate whether this function is called for GCR.
      *
-     * \return the negotiated buffer size during ADDBA handshake.
+     * @return the negotiated buffer size during ADDBA handshake.
      *
      * Returns the negotiated buffer size during ADDBA handshake with station addressed by
      * <i>recipient</i> for TID <i>tid</i>.
      */
-    uint16_t GetBaBufferSize(Mac48Address address, uint8_t tid) const;
+    uint16_t GetBaBufferSize(Mac48Address address, uint8_t tid, bool isGcr = false) const;
     /**
-     * \param address recipient address of the peer station
-     * \param tid traffic ID.
+     * @param address recipient address of the peer station or the group address for GCR.
+     * @param tid traffic ID.
+     * @param isGcr flag to indicate whether this function is called for GCR.
      *
-     * \return the starting sequence number of the originator transmit window.
+     * @return the starting sequence number of the  transmit window.
      *
      * Returns the current starting sequence number of the transmit window on the
      * originator (WinStartO) of the block ack agreement established with the given
      * recipient for the given TID.
      */
-    uint16_t GetBaStartingSequence(Mac48Address address, uint8_t tid) const;
+    uint16_t GetBaStartingSequence(Mac48Address address, uint8_t tid, bool isGcr = false) const;
     /**
-     * \param recipient Address of recipient.
-     * \param tid traffic ID.
-     * \return the BlockAckRequest header and the MAC header for the BlockAckReq
+     * @param recipient Address of recipient.
+     * @param tid traffic ID.
+     * @param gcrGroupAddr the GCR Group Address (only if the Block Ack Request is being used for
+     * the GCR service).
+     * @return the BlockAckRequest header and the MAC header for the BlockAckReq
      *
      * Prepare a BlockAckRequest to be sent to <i>recipient</i> for Traffic ID
      * <i>tid</i>. The header for the BlockAckRequest is requested to the QosTxop
      * corresponding to the given TID. A block ack agreement with the given recipient
      * for the given TID must have been established by such QosTxop.
      */
-    std::pair<CtrlBAckRequestHeader, WifiMacHeader> PrepareBlockAckRequest(Mac48Address recipient,
-                                                                           uint8_t tid) const;
+    std::pair<CtrlBAckRequestHeader, WifiMacHeader> PrepareBlockAckRequest(
+        Mac48Address recipient,
+        uint8_t tid,
+        std::optional<Mac48Address> gcrGroupAddr = std::nullopt) const;
 
     /* Event handlers */
     /**
      * Event handler when an ADDBA response is received.
      *
-     * \param respHdr ADDBA response header.
-     * \param recipient address of the recipient.
+     * @param respHdr ADDBA response header.
+     * @param recipient address of the recipient.
      */
     void GotAddBaResponse(const MgtAddBaResponseHeader& respHdr, Mac48Address recipient);
     /**
      * Event handler when a DELBA frame is received.
      *
-     * \param delBaHdr DELBA header.
-     * \param recipient address of the recipient.
+     * @param delBaHdr DELBA header.
+     * @param recipient address of the recipient.
      */
     void GotDelBaFrame(const MgtDelBaHeader* delBaHdr, Mac48Address recipient);
     /**
      * Take action upon notification of ADDBA_REQUEST frame being discarded
      * (likely due to exceeded max retry limit).
      *
-     * \param recipient the intended recipient of the ADDBA_REQUEST frame
-     * \param tid the TID
-     */
-    void NotifyOriginatorAgreementNoReply(const Mac48Address& recipient, uint8_t tid);
+     * @param recipient the intended recipient of the ADDBA_REQUEST frame
+     * @param tid the TID
+     * @param gcrGroupAddr the GCR Group Address (only if it a GCR Block Ack agreement)
+     */
+    void NotifyOriginatorAgreementNoReply(const Mac48Address& recipient,
+                                          uint8_t tid,
+                                          std::optional<Mac48Address> gcrGroupAddr);
     /**
      * Callback when ADDBA response is not received after timeout.
      *
-     * \param recipient MAC address of recipient
-     * \param tid traffic ID
-     */
-    void AddBaResponseTimeout(Mac48Address recipient, uint8_t tid);
+     * @param recipient MAC address of recipient
+     * @param tid traffic ID
+     * @param gcrGroupAddr the GCR Group Address (only if it a GCR Block Ack agreement)
+     */
+    void AddBaResponseTimeout(Mac48Address recipient,
+                              uint8_t tid,
+                              std::optional<Mac48Address> gcrGroupAddr);
     /**
      * Reset BA agreement after BA negotiation failed.
      *
-     * \param recipient MAC address of recipient
-     * \param tid traffic ID
+     * @param recipient MAC address of recipient
+     * @param tid traffic ID
+     * @param gcrGroupAddr the GCR Group Address (only if it a GCR Block Ack agreement)
      */
-    void ResetBa(Mac48Address recipient, uint8_t tid);
+    void ResetBa(Mac48Address recipient, uint8_t tid, std::optional<Mac48Address> gcrGroupAddr);
 
     /**
      * Set threshold for block ack mechanism. If number of packets in the
      * queue reaches the threshold, block ack mechanism is used.
      *
-     * \param threshold block ack threshold value.
+     * @param threshold block ack threshold value.
      */
     void SetBlockAckThreshold(uint8_t threshold);
     /**
      * Return the current threshold for block ack mechanism.
      *
-     * \return the current threshold for block ack mechanism.
+     * @return the current threshold for block ack mechanism.
      */
     uint8_t GetBlockAckThreshold() const;
 
     /**
      * Set the BlockAck inactivity timeout.
      *
-     * \param timeout the BlockAck inactivity timeout.
+     * @param timeout the BlockAck inactivity timeout.
      */
     void SetBlockAckInactivityTimeout(uint16_t timeout);
     /**
      * Get the BlockAck inactivity timeout.
      *
-     * \return the BlockAck inactivity timeout.
+     * @return the BlockAck inactivity timeout.
      */
     uint16_t GetBlockAckInactivityTimeout() const;
     /**
      * Stores an MPDU (part of an A-MPDU) in block ack agreement (i.e. the sender is waiting
      * for a BlockAck containing the sequence number of this MPDU).
      *
-     * \param mpdu received MPDU.
+     * @param mpdu received MPDU.
      */
     void CompleteMpduTx(Ptr<WifiMpdu> mpdu);
     /**
      * Set the timeout to wait for ADDBA response.
      *
-     * \param addBaResponseTimeout the timeout to wait for ADDBA response
+     * @param addBaResponseTimeout the timeout to wait for ADDBA response
      */
     void SetAddBaResponseTimeout(Time addBaResponseTimeout);
     /**
      * Get the timeout for ADDBA response.
      *
-     * \returns the timeout to wait for ADDBA response
+     * @returns the timeout to wait for ADDBA response
      */
     Time GetAddBaResponseTimeout() const;
     /**
      * Set the timeout for failed BA agreement. During the timeout period,
      * all packets will be transmitted using normal MPDU.
      *
-     * \param failedAddBaTimeout the timeout for failed BA agreement
+     * @param failedAddBaTimeout the timeout for failed BA agreement
      */
     void SetFailedAddBaTimeout(Time failedAddBaTimeout);
     /**
      * Get the timeout for failed BA agreement.
      *
-     * \returns the timeout for failed BA agreement
+     * @returns the timeout for failed BA agreement
      */
     Time GetFailedAddBaTimeout() const;
 
     /**
      * Return the next sequence number for the given header.
      *
-     * \param hdr Wi-Fi header.
+     * @param hdr Wi-Fi header.
      *
-     * \return the next sequence number.
+     * @return the next sequence number.
      */
     uint16_t GetNextSequenceNumberFor(const WifiMacHeader* hdr);
     /**
      * Return the next sequence number for the Traffic ID and destination, but do not pick it (i.e.
      * the current sequence number remains unchanged).
      *
-     * \param hdr Wi-Fi header.
+     * @param hdr Wi-Fi header.
      *
-     * \return the next sequence number.
+     * @return the next sequence number.
      */
     uint16_t PeekNextSequenceNumberFor(const WifiMacHeader* hdr);
     /**
@@ -244,11 +257,11 @@
      * transmitted, it is assigned a sequence number peeked from MacTxMiddle.
      * Also note that multiple links are only available since 802.11be.
      *
-     * \param linkId the ID of the given link
-     * \param tid traffic ID.
-     * \param recipient the receiver station address.
-     * \param mpdu the MPDU after which the search starts from
-     * \returns the peeked frame.
+     * @param linkId the ID of the given link
+     * @param tid traffic ID.
+     * @param recipient the receiver station address.
+     * @param mpdu the MPDU after which the search starts from
+     * @returns the peeked frame.
      */
     Ptr<WifiMpdu> PeekNextMpdu(uint8_t linkId,
                                uint8_t tid = 8,
@@ -264,14 +277,14 @@
      * attempt to perform A-MSDU aggregation (while meeting the constraints mentioned
      * above) and assign a sequence number to the dequeued frame.
      *
-     * \param linkId the ID of the given link
-     * \param peekedItem the peeked frame.
-     * \param txParams the TX parameters for the frame
-     * \param availableTime the time available for the transmission of the frame
+     * @param linkId the ID of the given link
+     * @param peekedItem the peeked frame.
+     * @param txParams the TX parameters for the frame
+     * @param availableTime the time available for the transmission of the frame
                             (including protection and acknowledgment); a value of
      *                      Time::Min() indicates no time constraint
-     * \param initialFrame true if the frame is the initial PPDU of a TXOP
-     * \return the frame to transmit or a null pointer if no frame meets the time constraints
+     * @param initialFrame true if the frame is the initial PPDU of a TXOP
+     * @return the frame to transmit or a null pointer if no frame meets the time constraints
      */
     Ptr<WifiMpdu> GetNextMpdu(uint8_t linkId,
                               Ptr<WifiMpdu> peekedItem,
@@ -283,7 +296,7 @@
      * Assign a sequence number to the given MPDU, if it is not a fragment
      * and it is not a retransmitted frame.
      *
-     * \param mpdu the MPDU
+     * @param mpdu the MPDU
      */
     void AssignSequenceNumber(Ptr<WifiMpdu> mpdu) const;
 
@@ -291,22 +304,22 @@
      * 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 tid the Traffic ID
-     * \param receiver the address of the given receiver
-     * \return the value for the Queue Size subfield
+     * @param tid the Traffic ID
+     * @param receiver the address of the given receiver
+     * @return the value for the Queue Size subfield
      */
     uint8_t GetQosQueueSize(uint8_t tid, Mac48Address receiver) const;
 
     /**
-     * \param linkId the ID of the given link
-     * \return the TXOP start time, if a TXOP is ongoing on the given link
+     * @param linkId the ID of the given link
+     * @return the TXOP start time, if a TXOP is ongoing on the given link
      */
     virtual std::optional<Time> GetTxopStartTime(uint8_t linkId) const;
     /**
      * Return the remaining duration in the current TXOP on the given link.
      *
-     * \param linkId the ID of the given link
-     * \return the remaining duration in the current TXOP.
+     * @param linkId the ID of the given link
+     * @return the remaining duration in the current TXOP.
      */
     virtual Time GetRemainingTxop(uint8_t linkId) const;
 
@@ -314,52 +327,52 @@
      * Set the minimum contention window size to use while the MU EDCA Timer
      * is running for the given link.
      *
-     * \param cwMin the minimum contention window size.
-     * \param linkId the ID of the given link
+     * @param cwMin the minimum contention window size.
+     * @param linkId the ID of the given link
      */
     void SetMuCwMin(uint16_t cwMin, uint8_t linkId);
     /**
      * Set the maximum contention window size to use while the MU EDCA Timer
      * is running for the given link.
      *
-     * \param cwMax the maximum contention window size.
-     * \param linkId the ID of the given link
+     * @param cwMax the maximum contention window size.
+     * @param linkId the ID of the given link
      */
     void SetMuCwMax(uint16_t cwMax, uint8_t linkId);
     /**
      * Set the number of slots that make up an AIFS while the MU EDCA Timer
      * is running for the given link.
      *
-     * \param aifsn the number of slots that make up an AIFS.
-     * \param linkId the ID of the given link
+     * @param aifsn the number of slots that make up an AIFS.
+     * @param linkId the ID of the given link
      */
     void SetMuAifsn(uint8_t aifsn, uint8_t linkId);
     /**
      * Set the MU EDCA Timer for the given link.
      *
-     * \param timer the timer duration.
-     * \param linkId the ID of the given link
+     * @param timer the timer duration.
+     * @param linkId the ID of the given link
      */
     void SetMuEdcaTimer(Time timer, uint8_t linkId);
     /**
      * Start the MU EDCA Timer for the given link.
      *
-     * \param linkId the ID of the given link
+     * @param linkId the ID of the given link
      */
     void StartMuEdcaTimerNow(uint8_t linkId);
     /**
      * Return true if the MU EDCA Timer is running for the given link, false otherwise.
      *
-     * \param linkId the ID of the given link
-     * \return whether the MU EDCA Timer is running
+     * @param linkId the ID of the given link
+     * @return whether the MU EDCA Timer is running
      */
     bool MuEdcaTimerRunning(uint8_t linkId) const;
     /**
      * Return true if the EDCA is disabled (the MU EDCA Timer is running and the
      * MU AIFSN is zero) for the given link, false otherwise.
      *
-     * \param linkId the ID of the given link
-     * \return whether the EDCA is disabled
+     * @param linkId the ID of the given link
+     * @return whether the EDCA is disabled
      */
     bool EdcaDisabled(uint8_t linkId) const;
     /**
@@ -367,8 +380,8 @@
      * EDCA Parameter Set or the MU EDCA Parameter Set, depending on whether the
      * MU EDCA Timer is running or not.
      *
-     * \param linkId the ID of the given link
-     * \return the currently used minimum contention window size.
+     * @param linkId the ID of the given link
+     * @return the currently used minimum contention window size.
      */
     uint32_t GetMinCw(uint8_t linkId) const override;
     /**
@@ -376,8 +389,8 @@
      * EDCA Parameter Set or the MU EDCA Parameter Set, depending on whether the
      * MU EDCA Timer is running or not.
      *
-     * \param linkId the ID of the given link
-     * \return the currently used maximum contention window size.
+     * @param linkId the ID of the given link
+     * @return the currently used maximum contention window size.
      */
     uint32_t GetMaxCw(uint8_t linkId) const override;
     /**
@@ -385,8 +398,8 @@
      * to the EDCA Parameter Set or the MU EDCA Parameter Set, depending on whether
      * the MU EDCA Timer is running or not.
      *
-     * \param linkId the ID of the given link
-     * \return the number of slots that currently make up an AIFS.
+     * @param linkId the ID of the given link
+     * @return the number of slots that currently make up an AIFS.
      */
     uint8_t GetAifsn(uint8_t linkId) const override;
 
@@ -416,8 +429,8 @@
     /**
      * Get a reference to the link associated with the given ID.
      *
-     * \param linkId the given link ID
-     * \return a reference to the link associated with the given ID
+     * @param linkId the given link ID
+     * @return a reference to the link associated with the given ID
      */
     QosLinkEntity& GetLink(uint8_t linkId) const;
 
@@ -432,8 +445,8 @@
      * starting sequence number of the transmit window, provided that a block ack
      * agreement has been established with the recipient for the given TID.
      *
-     * \param mpdu the given MPDU
-     * \return true if the MPDU is to be considered old, false otherwise
+     * @param mpdu the given MPDU
+     * @return true if the MPDU is to be considered old, false otherwise
      */
     bool IsQosOldPacket(Ptr<const WifiMpdu> mpdu);
 
@@ -458,6 +471,24 @@
         TxopTracedCallback;
 
     TxopTracedCallback m_txopTrace; //!< TXOP trace callback
+
+    /**
+     * TracedCallback signature for block ack agreement established events.
+     *
+     * @param recipient the MAC address of the recipient
+     * @param tid the TID for which block ack agreement is established
+     * @param gcrGroup the GCR group address (if any)
+     */
+    typedef void (*BaEstablishedCallback)(Mac48Address recipient,
+                                          uint8_t tid,
+                                          std::optional<Mac48Address> gcrGroup);
+
+    /// TracedCallback for block ack agreement established events typedef
+    using BaEstablishedTracedCallback =
+        TracedCallback<Mac48Address, uint8_t, std::optional<Mac48Address>>;
+
+    BaEstablishedTracedCallback
+        m_baEstablishedCallback; //!< traced callback for block ack agreement established events
 };
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/qos-utils.h ns-3.44/src/wifi/model/qos-utils.h
--- ns-3.43/src/wifi/model/qos-utils.h	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/qos-utils.h	2025-03-09 16:55:49.795372700 -0700
@@ -32,8 +32,8 @@
     /**
      * Functional operator for (MAC address, TID) hash computation.
      *
-     * \param addressTidPair the (MAC address, TID) pair
-     * \return the hash
+     * @param addressTidPair the (MAC address, TID) pair
+     * @return the hash
      */
     std::size_t operator()(const WifiAddressTidPair& addressTidPair) const;
 };
@@ -46,14 +46,14 @@
     /**
      * Functional operator for MAC address hash computation.
      *
-     * \param address the MAC address
-     * \return the hash
+     * @param address the MAC address
+     * @return the hash
      */
     std::size_t operator()(const Mac48Address& address) const;
 };
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * This enumeration defines the Access Categories as an enumeration
  * with values corresponding to the AC index (ACI) values specified
  * (Table 8-104 "ACI-to-AC coding"; IEEE 802.11-2012).
@@ -77,11 +77,11 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the stream
- * \param acIndex the AC index
- * \returns a reference to the stream
+ * @param os the stream
+ * @param acIndex the AC index
+ * @returns a reference to the stream
  */
 inline std::ostream&
 operator<<(std::ostream& os, const AcIndex& acIndex)
@@ -109,7 +109,7 @@
 }
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * This class stores the pair of TIDs of an Access Category.
  */
 class WifiAc
@@ -118,27 +118,27 @@
     /**
      * Constructor.
      *
-     * \param lowTid the TID with lower priority
-     * \param highTid the TID with higher priority
+     * @param lowTid the TID with lower priority
+     * @param highTid the TID with higher priority
      */
     WifiAc(uint8_t lowTid, uint8_t highTid);
     /**
      * Get the TID with lower priority
      *
-     * \return the TID with lower priority
+     * @return the TID with lower priority
      */
     uint8_t GetLowTid() const;
     /**
      * Get the TID with higher priority
      *
-     * \return the TID with higher priority
+     * @return the TID with higher priority
      */
     uint8_t GetHighTid() const;
     /**
      * Given a TID belonging to this Access Category, get the other TID of this AC.
      *
-     * \param tid a TID belonging to this AC
-     * \return the other TID belonging to this AC
+     * @param tid a TID belonging to this AC
+     * @return the other TID belonging to this AC
      */
     uint8_t GetOtherTid(uint8_t tid) const;
 
@@ -148,46 +148,46 @@
 };
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * Operator> overload returning true if the AC on the left has higher priority
  * than the AC on the right.
  *
- * \param left the AC on the left of operator>
- * \param right the AC on the right of operator>
- * \return true if the AC on the left has higher priority than the AC on the right
+ * @param left the AC on the left of operator>
+ * @param right the AC on the right of operator>
+ * @return true if the AC on the left has higher priority than the AC on the right
  */
 bool operator>(AcIndex left, AcIndex right);
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * Operator>= overload returning true if the AC on the left has higher or the same
  * priority than the AC on the right.
  *
- * \param left the AC on the left of operator>=
- * \param right the AC on the right of operator>=
- * \return true if the AC on the left has higher or the same priority than the AC on the right
+ * @param left the AC on the left of operator>=
+ * @param right the AC on the right of operator>=
+ * @return true if the AC on the left has higher or the same priority than the AC on the right
  */
 bool operator>=(AcIndex left, AcIndex right);
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * Operator< overload returning true if the AC on the left has lower priority
  * than the AC on the right.
  *
- * \param left the AC on the left of operator<
- * \param right the AC on the right of operator<
- * \return true if the AC on the left has lower priority than the AC on the right
+ * @param left the AC on the left of operator<
+ * @param right the AC on the right of operator<
+ * @return true if the AC on the left has lower priority than the AC on the right
  */
 bool operator<(AcIndex left, AcIndex right);
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * Operator<= overload returning true if the AC on the left has lower or the same
  * priority than the AC on the right.
  *
- * \param left the AC on the left of operator<=
- * \param right the AC on the right of operator<=
- * \return true if the AC on the left has lower or the same priority than the AC on the right
+ * @param left the AC on the left of operator<=
+ * @param right the AC on the right of operator<=
+ * @return true if the AC on the left has lower or the same priority than the AC on the right
  */
 bool operator<=(AcIndex left, AcIndex right);
 
@@ -198,30 +198,30 @@
 extern const std::map<AcIndex, WifiAc> wifiAcList;
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * Maps TID (Traffic ID) to Access classes.
  * For more details see (Table 9-1 "UP-to-AC mapping"; IEEE 802.11-2012).
  *
- * \param tid the Traffic ID to be mapped to Access class
- * \return the access class for the given TID
+ * @param tid the Traffic ID to be mapped to Access class
+ * @return the access class for the given TID
  */
 AcIndex QosUtilsMapTidToAc(uint8_t tid);
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * Next function is useful to correctly sort buffered packets under block ack.
  * When an BAR is received from originator station, completed "old"
  * (see section 9.10.3 in IEEE 802.11e) packets must be forwarded up before "new" packets.
  *
- * \param seqControl the sequence control field
- * \param endSequence the sequence number ending the acknowledgment window
+ * @param seqControl the sequence control field
+ * @param endSequence the sequence number ending the acknowledgment window
  *
- * \return a unique integer for the given sequence control and end sequence
+ * @return a unique integer for the given sequence control and end sequence
  */
 uint32_t QosUtilsMapSeqControlToUniqueInteger(uint16_t seqControl, uint16_t endSequence);
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * This function checks if packet with sequence number <i>seqNumber</i> is an "old" packet.
  * The sequence number space is considered divided into two parts, one of which is "old" and
  * one of which is "new" by means of a boundary created by adding half the sequence number
@@ -252,28 +252,28 @@
  * if that packet (with sequence number <i>numberSeq</i>)) belongs to the section of the
  * sequence number space marked with '-' characters. The function returns false otherwise.
  *
- * \param startingSeq the starting sequence number
- * \param seqNumber the sequence number to be checked
+ * @param startingSeq the starting sequence number
+ * @param seqNumber the sequence number to be checked
  *
- * \return true if the packet is old, false otherwise
+ * @return true if the packet is old, false otherwise
  */
 bool QosUtilsIsOldPacket(uint16_t startingSeq, uint16_t seqNumber);
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * This function is useful to get traffic id of different packet types.
  *
- * \param packet packet to check
- * \param hdr 802.11 header for packet to check
- * \return the TID of different packet types
+ * @param packet packet to check
+ * @param hdr 802.11 header for packet to check
+ * @return the TID of different packet types
  */
 uint8_t GetTid(Ptr<const Packet> packet, const WifiMacHeader hdr);
 
 /**
- * \ingroup wifi
- * \brief Determine the TX queue for a given packet
- * \param item the packet
- * \returns the access category
+ * @ingroup wifi
+ * @brief Determine the TX queue for a given packet
+ * @param item the packet
+ * @returns the access category
  *
  * Modeled after the Linux function ieee80211_select_queue (net/mac80211/wme.c).
  * A SocketPriority tag is attached to the packet (or the existing one is
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/rate-control/aarfcd-wifi-manager.cc ns-3.44/src/wifi/model/rate-control/aarfcd-wifi-manager.cc
--- ns-3.43/src/wifi/model/rate-control/aarfcd-wifi-manager.cc	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/rate-control/aarfcd-wifi-manager.cc	2025-03-09 16:55:49.795372700 -0700
@@ -21,7 +21,7 @@
 NS_LOG_COMPONENT_DEFINE("AarfcdWifiManager");
 
 /**
- * \brief hold per-remote-station state for AARF-CD Wifi manager.
+ * @brief hold per-remote-station state for AARF-CD Wifi manager.
  *
  * This struct extends from WifiRemoteStation struct to hold additional
  * information required by the AARF-CD Wifi manager
@@ -319,9 +319,9 @@
     NS_LOG_FUNCTION(this << st << allowedWidth);
     auto station = static_cast<AarfcdWifiRemoteStation*>(st);
     auto channelWidth = GetChannelWidth(station);
-    if (channelWidth > 20 && channelWidth != 22)
+    if (channelWidth > MHz_u{20} && channelWidth != MHz_u{22})
     {
-        channelWidth = 20;
+        channelWidth = MHz_u{20};
     }
     WifiMode mode = GetSupported(station, station->m_rate);
     uint64_t rate = mode.GetDataRate(channelWidth);
@@ -346,13 +346,13 @@
 AarfcdWifiManager::DoGetRtsTxVector(WifiRemoteStation* st)
 {
     NS_LOG_FUNCTION(this << st);
-    /// \todo we could/should implement the AARF algorithm for
+    /// @todo we could/should implement the AARF algorithm for
     /// RTS only by picking a single rate within the BasicRateSet.
     auto station = static_cast<AarfcdWifiRemoteStation*>(st);
     auto channelWidth = GetChannelWidth(station);
-    if (channelWidth > 20 && channelWidth != 22)
+    if (channelWidth > MHz_u{20} && channelWidth != MHz_u{22})
     {
-        channelWidth = 20;
+        channelWidth = MHz_u{20};
     }
     WifiMode mode;
     if (!GetUseNonErpProtection())
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/rate-control/aarfcd-wifi-manager.h ns-3.44/src/wifi/model/rate-control/aarfcd-wifi-manager.h
--- ns-3.43/src/wifi/model/rate-control/aarfcd-wifi-manager.h	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/rate-control/aarfcd-wifi-manager.h	2025-03-09 16:55:49.795372700 -0700
@@ -18,8 +18,8 @@
 struct AarfcdWifiRemoteStation;
 
 /**
- * \brief an implementation of the AARF-CD algorithm
- * \ingroup wifi
+ * @brief an implementation of the AARF-CD algorithm
+ * @ingroup wifi
  *
  * This algorithm was first described in "Efficient Collision Detection for Auto Rate Fallback
  * Algorithm". The implementation available here was done by Federico Maguolo for a very early
@@ -34,8 +34,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     AarfcdWifiManager();
@@ -56,7 +56,7 @@
      * The fundamental reason for this is that there is a backoff between each data
      * transmission, be it an initial transmission or a retransmission.
      *
-     * \param station the station that we failed to send Data
+     * @param station the station that we failed to send Data
      */
     void DoReportDataFailed(WifiRemoteStation* station) override;
     void DoReportRtsOk(WifiRemoteStation* station,
@@ -78,31 +78,31 @@
     /**
      * Check if the use of RTS for the given station can be turned off.
      *
-     * \param station the station that we are checking
+     * @param station the station that we are checking
      */
     void CheckRts(AarfcdWifiRemoteStation* station);
     /**
      * Increase the RTS window size of the given station.
      *
-     * \param station the station to increase RTS window
+     * @param station the station to increase RTS window
      */
     void IncreaseRtsWnd(AarfcdWifiRemoteStation* station);
     /**
      * Reset the RTS window of the given station.
      *
-     * \param station the station to reset RTS window
+     * @param station the station to reset RTS window
      */
     void ResetRtsWnd(AarfcdWifiRemoteStation* station);
     /**
      * Turn off RTS for the given station.
      *
-     * \param station the station to turn RTS off
+     * @param station the station to turn RTS off
      */
     void TurnOffRts(AarfcdWifiRemoteStation* station);
     /**
      * Turn on RTS for the given station.
      *
-     * \param station the station to turn RTS on
+     * @param station the station to turn RTS on
      */
     void TurnOnRts(AarfcdWifiRemoteStation* station);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/rate-control/aarf-wifi-manager.cc ns-3.44/src/wifi/model/rate-control/aarf-wifi-manager.cc
--- ns-3.43/src/wifi/model/rate-control/aarf-wifi-manager.cc	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/rate-control/aarf-wifi-manager.cc	2025-03-09 16:55:49.795372700 -0700
@@ -20,7 +20,7 @@
 NS_LOG_COMPONENT_DEFINE("AarfWifiManager");
 
 /**
- * \brief hold per-remote-station state for AARF Wifi manager.
+ * @brief hold per-remote-station state for AARF Wifi manager.
  *
  * This struct extends from WifiRemoteStation struct to hold additional
  * information required by the AARF Wifi manager
@@ -140,7 +140,7 @@
  * The fundamental reason for this is that there is a backoff between each data
  * transmission, be it an initial transmission or a retransmission.
  *
- * \param st the station that we failed to send Data
+ * @param st the station that we failed to send Data
  */
 void
 AarfWifiManager::DoReportDataFailed(WifiRemoteStation* st)
@@ -250,9 +250,9 @@
     NS_LOG_FUNCTION(this << st << allowedWidth);
     auto station = static_cast<AarfWifiRemoteStation*>(st);
     auto channelWidth = GetChannelWidth(station);
-    if (channelWidth > 20 && channelWidth != 22)
+    if (channelWidth > MHz_u{20} && channelWidth != MHz_u{22})
     {
-        channelWidth = 20;
+        channelWidth = MHz_u{20};
     }
     WifiMode mode = GetSupported(station, station->m_rate);
     uint64_t rate = mode.GetDataRate(channelWidth);
@@ -277,13 +277,13 @@
 AarfWifiManager::DoGetRtsTxVector(WifiRemoteStation* st)
 {
     NS_LOG_FUNCTION(this << st);
-    /// \todo we could/should implement the AARF algorithm for
+    /// @todo we could/should implement the AARF algorithm for
     /// RTS only by picking a single rate within the BasicRateSet.
     auto station = static_cast<AarfWifiRemoteStation*>(st);
     auto channelWidth = GetChannelWidth(station);
-    if (channelWidth > 20 && channelWidth != 22)
+    if (channelWidth > MHz_u{20} && channelWidth != MHz_u{22})
     {
-        channelWidth = 20;
+        channelWidth = MHz_u{20};
     }
     WifiMode mode;
     if (!GetUseNonErpProtection())
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/rate-control/aarf-wifi-manager.h ns-3.44/src/wifi/model/rate-control/aarf-wifi-manager.h
--- ns-3.43/src/wifi/model/rate-control/aarf-wifi-manager.h	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/rate-control/aarf-wifi-manager.h	2025-03-09 16:55:49.795372700 -0700
@@ -16,8 +16,8 @@
 {
 
 /**
- * \brief AARF Rate control algorithm
- * \ingroup wifi
+ * @brief AARF Rate control algorithm
+ * @ingroup wifi
  *
  * This class implements the AARF rate control algorithm which
  * was initially described in <i>IEEE 802.11 Rate Adaptation:
@@ -32,8 +32,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     AarfWifiManager();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/rate-control/amrr-wifi-manager.cc ns-3.44/src/wifi/model/rate-control/amrr-wifi-manager.cc
--- ns-3.43/src/wifi/model/rate-control/amrr-wifi-manager.cc	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/rate-control/amrr-wifi-manager.cc	2025-03-09 16:55:49.795372700 -0700
@@ -20,7 +20,7 @@
 NS_LOG_COMPONENT_DEFINE("AmrrWifiManager");
 
 /**
- * \brief hold per-remote-station state for AMRR Wifi manager.
+ * @brief hold per-remote-station state for AMRR Wifi manager.
  *
  * This struct extends from WifiRemoteStation struct to hold additional
  * information required by the AMRR Wifi manager
@@ -50,7 +50,7 @@
             .AddConstructor<AmrrWifiManager>()
             .AddAttribute("UpdatePeriod",
                           "The interval between decisions about rate control changes",
-                          TimeValue(Seconds(1.0)),
+                          TimeValue(Seconds(1)),
                           MakeTimeAccessor(&AmrrWifiManager::m_updatePeriod),
                           MakeTimeChecker())
             .AddAttribute(
@@ -365,9 +365,9 @@
         }
     }
     auto channelWidth = GetChannelWidth(station);
-    if (channelWidth > 20 && channelWidth != 22)
+    if (channelWidth > MHz_u{20} && channelWidth != MHz_u{22})
     {
-        channelWidth = 20;
+        channelWidth = MHz_u{20};
     }
     WifiMode mode = GetSupported(station, rateIndex);
     uint64_t rate = mode.GetDataRate(channelWidth);
@@ -394,9 +394,9 @@
     NS_LOG_FUNCTION(this << st);
     auto station = static_cast<AmrrWifiRemoteStation*>(st);
     auto channelWidth = GetChannelWidth(station);
-    if (channelWidth > 20 && channelWidth != 22)
+    if (channelWidth > MHz_u{20} && channelWidth != MHz_u{22})
     {
-        channelWidth = 20;
+        channelWidth = MHz_u{20};
     }
     UpdateMode(station);
     WifiMode mode;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/rate-control/amrr-wifi-manager.h ns-3.44/src/wifi/model/rate-control/amrr-wifi-manager.h
--- ns-3.43/src/wifi/model/rate-control/amrr-wifi-manager.h	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/rate-control/amrr-wifi-manager.h	2025-03-09 16:55:49.795372700 -0700
@@ -18,8 +18,8 @@
 struct AmrrWifiRemoteStation;
 
 /**
- * \brief AMRR Rate control algorithm
- * \ingroup wifi
+ * @brief AMRR Rate control algorithm
+ * @ingroup wifi
  *
  * This class implements the AMRR rate control algorithm which
  * was initially described in <i>IEEE 802.11 Rate Adaptation:
@@ -34,8 +34,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -66,34 +66,34 @@
     /**
      * Update the mode used to send to the given station.
      *
-     * \param station the remote station state
+     * @param station the remote station state
      */
     void UpdateMode(AmrrWifiRemoteStation* station);
     /**
      * Reset transmission statistics of the given station.
      *
-     * \param station the remote station state
+     * @param station the remote station state
      */
     void ResetCnt(AmrrWifiRemoteStation* station);
     /**
      * Increase the transmission rate to the given station.
      *
-     * \param station the remote station state
+     * @param station the remote station state
      */
     void IncreaseRate(AmrrWifiRemoteStation* station);
     /**
      * Decrease the transmission rate to the given station.
      *
-     * \param station the remote station state
+     * @param station the remote station state
      */
     void DecreaseRate(AmrrWifiRemoteStation* station);
     /**
      * Check if the current rate for the given station is the
      * minimum rate.
      *
-     * \param station the remote station state
+     * @param station the remote station state
      *
-     * \return true if the current rate is the minimum rate,
+     * @return true if the current rate is the minimum rate,
      *         false otherwise
      */
     bool IsMinRate(AmrrWifiRemoteStation* station) const;
@@ -101,9 +101,9 @@
      * Check if the current rate for the given station is the
      * maximum rate.
      *
-     * \param station the remote station state
+     * @param station the remote station state
      *
-     * \return true if the current rate is the maximum rate,
+     * @return true if the current rate is the maximum rate,
      *         false otherwise
      */
     bool IsMaxRate(AmrrWifiRemoteStation* station) const;
@@ -111,9 +111,9 @@
      * Check if the number of retransmission and transmission error
      * is less than the number of successful transmission (times ratio).
      *
-     * \param station the remote station state
+     * @param station the remote station state
      *
-     * \return true if the number of retransmission and transmission error
+     * @return true if the number of retransmission and transmission error
      *              is less than the number of successful transmission
      *              (times ratio), false otherwise
      */
@@ -122,9 +122,9 @@
      * Check if the number of retransmission and transmission error
      * is greater than the number of successful transmission (times ratio).
      *
-     * \param station the remote station state
+     * @param station the remote station state
      *
-     * \return true if the number of retransmission and transmission error
+     * @return true if the number of retransmission and transmission error
      *              is less than the number of successful transmission
      *              (times ratio), false otherwise
      */
@@ -133,8 +133,8 @@
      * Check if the number of retransmission, transmission error,
      * and successful transmission are greater than 10.
      *
-     * \param station the remote station state
-     * \return true if the number of retransmission, transmission error,
+     * @param station the remote station state
+     * @return true if the number of retransmission, transmission error,
      *         and successful transmission are greater than 10,
      *         false otherwise
      */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/rate-control/aparf-wifi-manager.cc ns-3.44/src/wifi/model/rate-control/aparf-wifi-manager.cc
--- ns-3.43/src/wifi/model/rate-control/aparf-wifi-manager.cc	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/rate-control/aparf-wifi-manager.cc	2025-03-09 16:55:49.795372700 -0700
@@ -342,9 +342,9 @@
     NS_LOG_FUNCTION(this << st << allowedWidth);
     auto station = static_cast<AparfWifiRemoteStation*>(st);
     auto channelWidth = GetChannelWidth(station);
-    if (channelWidth > 20 && channelWidth != 22)
+    if (channelWidth > MHz_u{20} && channelWidth != MHz_u{22})
     {
-        channelWidth = 20;
+        channelWidth = MHz_u{20};
     }
     CheckInit(station);
     WifiMode mode = GetSupported(station, station->m_rateIndex);
@@ -378,13 +378,13 @@
 AparfWifiManager::DoGetRtsTxVector(WifiRemoteStation* st)
 {
     NS_LOG_FUNCTION(this << st);
-    /// \todo we could/should implement the ARF algorithm for
+    /// @todo we could/should implement the ARF algorithm for
     /// RTS only by picking a single rate within the BasicRateSet.
     auto station = static_cast<AparfWifiRemoteStation*>(st);
     auto channelWidth = GetChannelWidth(station);
-    if (channelWidth > 20 && channelWidth != 22)
+    if (channelWidth > MHz_u{20} && channelWidth != MHz_u{22})
     {
-        channelWidth = 20;
+        channelWidth = MHz_u{20};
     }
     WifiMode mode;
     if (!GetUseNonErpProtection())
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/rate-control/aparf-wifi-manager.h ns-3.44/src/wifi/model/rate-control/aparf-wifi-manager.h
--- ns-3.43/src/wifi/model/rate-control/aparf-wifi-manager.h	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/rate-control/aparf-wifi-manager.h	2025-03-09 16:55:49.795372700 -0700
@@ -17,7 +17,7 @@
 struct AparfWifiRemoteStation;
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * APARF Power and rate control algorithm
  *
  * This class implements the High Performance power and rate control algorithm
@@ -36,7 +36,7 @@
   public:
     /**
      * Register this type.
-     * \return The object TypeId.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
     AparfWifiManager();
@@ -77,7 +77,7 @@
 
     /** Check for initializations.
      *
-     * \param station The remote station.
+     * @param station The remote station.
      */
     void CheckInit(AparfWifiRemoteStation* station);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/rate-control/arf-wifi-manager.cc ns-3.44/src/wifi/model/rate-control/arf-wifi-manager.cc
--- ns-3.43/src/wifi/model/rate-control/arf-wifi-manager.cc	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/rate-control/arf-wifi-manager.cc	2025-03-09 16:55:49.795372700 -0700
@@ -19,7 +19,7 @@
 NS_LOG_COMPONENT_DEFINE("ArfWifiManager");
 
 /**
- * \brief hold per-remote-station state for ARF Wifi manager.
+ * @brief hold per-remote-station state for ARF Wifi manager.
  *
  * This struct extends from WifiRemoteStation struct to hold additional
  * information required by the ARF Wifi manager
@@ -124,7 +124,7 @@
  * The fundamental reason for this is that there is a backoff between each data
  * transmission, be it an initial transmission or a retransmission.
  *
- * \param st the station that we failed to send Data
+ * @param st the station that we failed to send Data
  */
 void
 ArfWifiManager::DoReportDataFailed(WifiRemoteStation* st)
@@ -227,9 +227,9 @@
     NS_LOG_FUNCTION(this << st << allowedWidth);
     auto station = static_cast<ArfWifiRemoteStation*>(st);
     auto channelWidth = GetChannelWidth(station);
-    if (channelWidth > 20 && channelWidth != 22)
+    if (channelWidth > MHz_u{20} && channelWidth != MHz_u{22})
     {
-        channelWidth = 20;
+        channelWidth = MHz_u{20};
     }
     WifiMode mode = GetSupported(station, station->m_rate);
     uint64_t rate = mode.GetDataRate(channelWidth);
@@ -254,13 +254,13 @@
 ArfWifiManager::DoGetRtsTxVector(WifiRemoteStation* st)
 {
     NS_LOG_FUNCTION(this << st);
-    /// \todo we could/should implement the ARF algorithm for
+    /// @todo we could/should implement the ARF algorithm for
     /// RTS only by picking a single rate within the BasicRateSet.
     auto station = static_cast<ArfWifiRemoteStation*>(st);
     auto channelWidth = GetChannelWidth(station);
-    if (channelWidth > 20 && channelWidth != 22)
+    if (channelWidth > MHz_u{20} && channelWidth != MHz_u{22})
     {
-        channelWidth = 20;
+        channelWidth = MHz_u{20};
     }
     WifiMode mode;
     if (!GetUseNonErpProtection())
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/rate-control/arf-wifi-manager.h ns-3.44/src/wifi/model/rate-control/arf-wifi-manager.h
--- ns-3.43/src/wifi/model/rate-control/arf-wifi-manager.h	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/rate-control/arf-wifi-manager.h	2025-03-09 16:55:49.795372700 -0700
@@ -16,8 +16,8 @@
 {
 
 /**
- * \ingroup wifi
- * \brief ARF Rate control algorithm
+ * @ingroup wifi
+ * @brief ARF Rate control algorithm
  *
  * This class implements the so-called ARF algorithm which was
  * initially described in <i>WaveLAN-II: A High-performance wireless
@@ -38,8 +38,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     ArfWifiManager();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/rate-control/cara-wifi-manager.cc ns-3.44/src/wifi/model/rate-control/cara-wifi-manager.cc
--- ns-3.43/src/wifi/model/rate-control/cara-wifi-manager.cc	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/rate-control/cara-wifi-manager.cc	2025-03-09 16:55:49.795372700 -0700
@@ -19,7 +19,7 @@
 NS_LOG_COMPONENT_DEFINE("CaraWifiManager");
 
 /**
- * \brief hold per-remote-station state for CARA Wifi manager.
+ * @brief hold per-remote-station state for CARA Wifi manager.
  *
  * This struct extends from WifiRemoteStation struct to hold additional
  * information required by the CARA Wifi manager
@@ -198,9 +198,9 @@
     NS_LOG_FUNCTION(this << st << allowedWidth);
     auto station = static_cast<CaraWifiRemoteStation*>(st);
     auto channelWidth = GetChannelWidth(station);
-    if (channelWidth > 20 && channelWidth != 22)
+    if (channelWidth > MHz_u{20} && channelWidth != MHz_u{22})
     {
-        channelWidth = 20;
+        channelWidth = MHz_u{20};
     }
     WifiMode mode = GetSupported(station, station->m_rate);
     uint64_t rate = mode.GetDataRate(channelWidth);
@@ -226,12 +226,12 @@
 {
     NS_LOG_FUNCTION(this << st);
     auto station = static_cast<CaraWifiRemoteStation*>(st);
-    /// \todo we could/should implement the Arf algorithm for
+    /// @todo we could/should implement the Arf algorithm for
     /// RTS only by picking a single rate within the BasicRateSet.
     auto channelWidth = GetChannelWidth(station);
-    if (channelWidth > 20 && channelWidth != 22)
+    if (channelWidth > MHz_u{20} && channelWidth != MHz_u{22})
     {
-        channelWidth = 20;
+        channelWidth = MHz_u{20};
     }
     WifiMode mode;
     if (!GetUseNonErpProtection())
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/rate-control/cara-wifi-manager.h ns-3.44/src/wifi/model/rate-control/cara-wifi-manager.h
--- ns-3.43/src/wifi/model/rate-control/cara-wifi-manager.h	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/rate-control/cara-wifi-manager.h	2025-03-09 16:55:49.795372700 -0700
@@ -16,8 +16,8 @@
 {
 
 /**
- * \brief implement the CARA rate control algorithm
- * \ingroup wifi
+ * @brief implement the CARA rate control algorithm
+ * @ingroup wifi
  *
  * Implement the CARA algorithm from:
  * J. Kim, S. Kim, S. Choi, and D. Qiao.
@@ -34,8 +34,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     CaraWifiManager();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/rate-control/constant-rate-wifi-manager.h ns-3.44/src/wifi/model/rate-control/constant-rate-wifi-manager.h
--- ns-3.43/src/wifi/model/rate-control/constant-rate-wifi-manager.h	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/rate-control/constant-rate-wifi-manager.h	2025-03-09 16:55:49.795372700 -0700
@@ -15,8 +15,8 @@
 {
 
 /**
- * \ingroup wifi
- * \brief use constant rates for data and RTS transmissions
+ * @ingroup wifi
+ * @brief use constant rates for data and RTS transmissions
  *
  * This class uses always the same transmission rate for every
  * packet sent.
@@ -25,8 +25,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     ConstantRateWifiManager();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/rate-control/ideal-wifi-manager.cc ns-3.44/src/wifi/model/rate-control/ideal-wifi-manager.cc
--- ns-3.43/src/wifi/model/rate-control/ideal-wifi-manager.cc	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/rate-control/ideal-wifi-manager.cc	2025-03-09 16:55:49.795372700 -0700
@@ -19,7 +19,7 @@
 {
 
 /**
- * \brief hold per-remote-station state for Ideal Wifi manager.
+ * @brief hold per-remote-station state for Ideal Wifi manager.
  *
  * This struct extends from WifiRemoteStation struct to hold additional
  * information required by the Ideal Wifi manager
@@ -89,11 +89,11 @@
     if (mode.GetModulationClass() == WIFI_MOD_CLASS_DSSS ||
         mode.GetModulationClass() == WIFI_MOD_CLASS_HR_DSSS)
     {
-        return 22;
+        return MHz_u{22};
     }
     else
     {
-        return 20;
+        return MHz_u{20};
     }
 }
 
@@ -124,7 +124,7 @@
     {
         for (const auto& mode : GetPhy()->GetMcsList())
         {
-            for (MHz_u j = 20; j <= GetPhy()->GetChannelWidth(); j *= 2)
+            for (MHz_u j{20}; j <= GetPhy()->GetChannelWidth(); j *= 2)
             {
                 txVector.SetChannelWidth(j);
                 if (mode.GetModulationClass() == WIFI_MOD_CLASS_HT)
@@ -134,11 +134,21 @@
                     txVector.SetGuardInterval(guardInterval);
                     // derive NSS from the MCS index
                     nss = (mode.GetMcsValue() / 8) + 1;
-                    NS_LOG_DEBUG("Adding mode = " << mode.GetUniqueName() << " channel width " << j
-                                                  << " nss " << +nss << " GI " << guardInterval);
                     txVector.SetNss(nss);
                     txVector.SetMode(mode);
-                    AddSnrThreshold(txVector, GetPhy()->CalculateSnr(txVector, m_ber));
+                    if (txVector.IsValid(GetPhy()->GetPhyBand()))
+                    {
+                        NS_LOG_DEBUG("Adding mode = " << mode.GetUniqueName() << " channel width "
+                                                      << j << " nss " << +nss << " GI "
+                                                      << guardInterval);
+                        AddSnrThreshold(txVector, GetPhy()->CalculateSnr(txVector, m_ber));
+                    }
+                    else
+                    {
+                        NS_LOG_DEBUG("Skipping mode = " << mode.GetUniqueName() << " channel width "
+                                                        << j << " nss " << +nss << " GI "
+                                                        << guardInterval);
+                    }
                 }
                 else
                 {
@@ -156,12 +166,21 @@
                     {
                         if (mode.IsAllowed(j, k))
                         {
-                            NS_LOG_DEBUG("Adding mode = " << mode.GetUniqueName()
-                                                          << " channel width " << j << " nss " << +k
-                                                          << " GI " << guardInterval);
                             txVector.SetNss(k);
                             txVector.SetMode(mode);
-                            AddSnrThreshold(txVector, GetPhy()->CalculateSnr(txVector, m_ber));
+                            if (txVector.IsValid(GetPhy()->GetPhyBand()))
+                            {
+                                NS_LOG_DEBUG("Adding mode = " << mode.GetUniqueName()
+                                                              << " channel width " << j << " nss "
+                                                              << +k << " GI " << guardInterval);
+                                AddSnrThreshold(txVector, GetPhy()->CalculateSnr(txVector, m_ber));
+                            }
+                            else
+                            {
+                                NS_LOG_DEBUG("Skipping mode = " << mode.GetUniqueName()
+                                                                << " channel width " << j << " nss "
+                                                                << +k << " GI " << guardInterval);
+                            }
                         }
                         else
                         {
@@ -224,11 +243,11 @@
     NS_LOG_FUNCTION(this << station);
     auto st = static_cast<IdealWifiRemoteStation*>(station);
     st->m_lastSnrObserved = 0.0;
-    st->m_lastChannelWidthObserved = 0;
+    st->m_lastChannelWidthObserved = MHz_u{0};
     st->m_lastNssObserved = 1;
     st->m_lastSnrCached = CACHE_INITIAL_VALUE;
     st->m_lastMode = GetDefaultMode();
-    st->m_lastChannelWidth = 0;
+    st->m_lastChannelWidth = MHz_u{0};
     st->m_lastNss = 1;
 }
 
@@ -260,7 +279,7 @@
     auto station = static_cast<IdealWifiRemoteStation*>(st);
     station->m_lastSnrObserved = rtsSnr;
     station->m_lastChannelWidthObserved =
-        GetPhy()->GetChannelWidth() >= 40 ? 20 : GetPhy()->GetChannelWidth();
+        GetPhy()->GetChannelWidth() >= MHz_u{42} ? MHz_u{20} : GetPhy()->GetChannelWidth();
     station->m_lastNssObserved = 1;
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/rate-control/ideal-wifi-manager.h ns-3.44/src/wifi/model/rate-control/ideal-wifi-manager.h
--- ns-3.43/src/wifi/model/rate-control/ideal-wifi-manager.h	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/rate-control/ideal-wifi-manager.h	2025-03-09 16:55:49.795372700 -0700
@@ -18,8 +18,8 @@
 struct IdealWifiRemoteStation;
 
 /**
- * \brief Ideal rate control algorithm
- * \ingroup wifi
+ * @brief Ideal rate control algorithm
+ * @ingroup wifi
  *
  * This class implements an 'ideal' rate control algorithm
  * similar to RBAR in spirit (see <i>A rate-adaptive MAC
@@ -36,8 +36,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     IdealWifiManager();
@@ -45,7 +45,7 @@
 
     void SetupPhy(const Ptr<WifiPhy> phy) override;
 
-  private:
+  protected:
     void DoInitialize() override;
     WifiRemoteStation* DoCreateStation() const override;
     void DoReportRxOk(WifiRemoteStation* station, double rxSnr, WifiMode txMode) override;
@@ -73,10 +73,11 @@
     WifiTxVector DoGetDataTxVector(WifiRemoteStation* station, MHz_u allowedWidth) override;
     WifiTxVector DoGetRtsTxVector(WifiRemoteStation* station) override;
 
+  private:
     /**
      * Reset the station, invoked if the maximum amount of retries has failed.
      *
-     * \param station the station for which statistics should be reset
+     * @param station the station for which statistics should be reset
      */
     void Reset(WifiRemoteStation* station) const;
 
@@ -91,24 +92,24 @@
      * Return the minimum SNR needed to successfully transmit
      * data with this WifiTxVector at the specified BER.
      *
-     * \param txVector WifiTxVector (containing valid mode, width, and Nss)
+     * @param txVector WifiTxVector (containing valid mode, width, and Nss)
      *
-     * \return the minimum SNR for the given WifiTxVector in linear scale
+     * @return the minimum SNR for the given WifiTxVector in linear scale
      */
     double GetSnrThreshold(WifiTxVector txVector);
     /**
      * Adds a pair of WifiTxVector and the minimum SNR for that given vector
      * to the list.
      *
-     * \param txVector the WifiTxVector storing mode, channel width, and Nss
-     * \param snr the minimum SNR for the given txVector in linear scale
+     * @param txVector the WifiTxVector storing mode, channel width, and Nss
+     * @param snr the minimum SNR for the given txVector in linear scale
      */
     void AddSnrThreshold(WifiTxVector txVector, double snr);
 
     /**
      * Convenience function for selecting a channel width for non-HT mode
-     * \param mode non-HT WifiMode
-     * \return the channel width for the selected mode
+     * @param mode non-HT WifiMode
+     * @return the channel width for the selected mode
      */
     MHz_u GetChannelWidthForNonHtMode(WifiMode mode) const;
 
@@ -118,10 +119,10 @@
      * different channel width than the requested one, and/or a different NSS,  the function does
      * some computations to get the corresponding SNR.
      *
-     * \param station the station being queried
-     * \param channelWidth the channel width
-     * \param nss the number of spatial streams
-     * \return the SNR in linear scale
+     * @param station the station being queried
+     * @param channelWidth the channel width
+     * @param nss the number of spatial streams
+     * @return the SNR in linear scale
      */
     double GetLastObservedSnr(IdealWifiRemoteStation* station,
                               MHz_u channelWidth,
@@ -129,18 +130,18 @@
 
     /**
      * Check whether a given modulation class is supported by both the node and the peer
-     * \param mc the modulation class
-     * \param station the peer station
-     * \return true if the modulation class can be used, false otherwise
+     * @param mc the modulation class
+     * @param station the peer station
+     * @return true if the modulation class can be used, false otherwise
      */
     bool IsModulationClassSupported(WifiModulationClass mc, IdealWifiRemoteStation* station);
 
     /**
      * Check whether a given modulation class is supported and that there are no higher modulation
      * classes that should instead be candidates
-     * \param mc the modulation class
-     * \param station the peer station
-     * \return true if the modulation class is a candidate, false otherwise
+     * @param mc the modulation class
+     * @param station the peer station
+     * @return true if the modulation class is a candidate, false otherwise
      */
     bool IsCandidateModulationClass(WifiModulationClass mc, IdealWifiRemoteStation* station);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/rate-control/minstrel-ht-wifi-manager.cc ns-3.44/src/wifi/model/rate-control/minstrel-ht-wifi-manager.cc
--- ns-3.43/src/wifi/model/rate-control/minstrel-ht-wifi-manager.cc	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/rate-control/minstrel-ht-wifi-manager.cc	2025-03-09 16:55:49.795372700 -0700
@@ -32,7 +32,9 @@
 #include "ns3/wifi-mac.h"
 #include "ns3/wifi-net-device.h"
 #include "ns3/wifi-phy.h"
+#include "ns3/wifi-psdu.h"
 
+#include <algorithm>
 #include <iomanip>
 
 #define Min(a, b) ((a < b) ? a : b)
@@ -43,6 +45,42 @@
 namespace ns3
 {
 
+/**
+ * @brief standard information for each modulation class
+ */
+const std::map<WifiModulationClass, MinstrelHtWifiManager::StandardInfo> minstrelHtStandardInfos{
+    {
+        WIFI_MOD_CLASS_HT,
+        {
+            .groupType = WIFI_MINSTREL_GROUP_HT,
+            .maxMcs = 7,
+            .maxWidth = MHz_u{40},
+            .guardIntervals = {NanoSeconds(800), NanoSeconds(400)},
+            .maxStreams = 4,
+        },
+    },
+    {
+        WIFI_MOD_CLASS_VHT,
+        {
+            .groupType = WIFI_MINSTREL_GROUP_VHT,
+            .maxMcs = 9,
+            .maxWidth = MHz_u{160},
+            .guardIntervals = {NanoSeconds(800), NanoSeconds(400)},
+            .maxStreams = 8,
+        },
+    },
+    {
+        WIFI_MOD_CLASS_HE,
+        {
+            .groupType = WIFI_MINSTREL_GROUP_HE,
+            .maxMcs = 11,
+            .maxWidth = MHz_u{160},
+            .guardIntervals = {NanoSeconds(3200), NanoSeconds(1600), NanoSeconds(800)},
+            .maxStreams = 8,
+        },
+    },
+};
+
 /// MinstrelHtWifiRemoteStation structure
 struct MinstrelHtWifiRemoteStation : MinstrelWifiRemoteStation
 {
@@ -137,7 +175,7 @@
 MinstrelHtWifiManager::~MinstrelHtWifiManager()
 {
     NS_LOG_FUNCTION(this);
-    for (uint8_t i = 0; i < m_numGroups; i++)
+    for (std::size_t i = 0; i < m_numGroups; i++)
     {
         m_minstrelGroups[i].ratesFirstMpduTxTimeTable.clear();
         m_minstrelGroups[i].ratesTxTimeTable.clear();
@@ -173,6 +211,76 @@
 }
 
 void
+MinstrelHtWifiManager::InitializeGroups(WifiModulationClass mc)
+{
+    const auto& standardInfos = minstrelHtStandardInfos.at(mc);
+    for (MHz_u chWidth{20}; chWidth <= standardInfos.maxWidth; chWidth *= 2)
+    {
+        for (const auto& guardInterval : standardInfos.guardIntervals)
+        {
+            for (uint8_t streams = 1; streams <= standardInfos.maxStreams; ++streams)
+            {
+                const auto groupId =
+                    GetGroupIdForType(standardInfos.groupType, streams, guardInterval, chWidth);
+
+                m_minstrelGroups[groupId].streams = streams;
+                m_minstrelGroups[groupId].gi = guardInterval;
+                m_minstrelGroups[groupId].chWidth = chWidth;
+                m_minstrelGroups[groupId].type = standardInfos.groupType;
+                m_minstrelGroups[groupId].isSupported = false;
+
+                // Check capabilities of the device
+                if ((((mc >= WIFI_MOD_CLASS_HE) &&
+                      (GetGuardInterval() <=
+                       guardInterval)) || /// Is GI supported by the transmitter?
+                     ((mc < WIFI_MOD_CLASS_HE) &&
+                      !(!GetShortGuardIntervalSupported() &&
+                        (guardInterval.GetNanoSeconds() ==
+                         400)))) /// Is SGI supported by the transmitter?
+                    && (GetPhy()->GetChannelWidth() >=
+                        chWidth) /// Is channel width supported by the transmitter?
+                    && (GetPhy()->GetMaxSupportedTxSpatialStreams() >=
+                        streams)) /// Are streams supported by the transmitter?
+                {
+                    m_minstrelGroups[groupId].isSupported = true;
+
+                    // Calculate TX time for all rates of the group
+                    WifiModeList mcsList = GetDeviceMcsList(mc);
+                    for (uint8_t i = 0; i <= standardInfos.maxMcs; ++i)
+                    {
+                        const auto mcsIndex = (mc == WIFI_MOD_CLASS_HT)
+                                                  ? (i + (m_minstrelGroups[groupId].streams - 1) *
+                                                             (standardInfos.maxMcs + 1))
+                                                  : i;
+                        WifiMode mode = mcsList.at(mcsIndex);
+                        // Check for invalid MCSs and do not add time to array.
+                        if (IsValidMcs(streams, chWidth, mode))
+                        {
+                            AddFirstMpduTxTime(groupId,
+                                               mode,
+                                               CalculateMpduTxDuration(streams,
+                                                                       guardInterval,
+                                                                       chWidth,
+                                                                       mode,
+                                                                       FIRST_MPDU_IN_AGGREGATE));
+                            AddMpduTxTime(groupId,
+                                          mode,
+                                          CalculateMpduTxDuration(streams,
+                                                                  guardInterval,
+                                                                  chWidth,
+                                                                  mode,
+                                                                  MIDDLE_MPDU_IN_AGGREGATE));
+                        }
+                    }
+                    NS_LOG_DEBUG("Initialized group " << groupId << ": (" << +streams << ","
+                                                      << guardInterval << "," << chWidth << ")");
+                }
+            }
+        }
+    }
+}
+
+void
 MinstrelHtWifiManager::DoInitialize()
 {
     NS_LOG_FUNCTION(this);
@@ -183,20 +291,21 @@
      * station.
      */
 
+    m_numGroups = 0;
     if (GetHtSupported())
     {
-        m_numGroups = MAX_HT_SUPPORTED_STREAMS * MAX_HT_STREAM_GROUPS;
-        m_numRates = MAX_HT_GROUP_RATES;
+        m_numGroups += GetNumGroups(WIFI_MOD_CLASS_HT);
+        m_numRates = minstrelHtStandardInfos.at(WIFI_MOD_CLASS_HT).maxMcs + 1;
     }
     if (GetVhtSupported())
     {
-        m_numGroups += MAX_VHT_SUPPORTED_STREAMS * MAX_VHT_STREAM_GROUPS;
-        m_numRates = MAX_VHT_GROUP_RATES;
+        m_numGroups += GetNumGroups(WIFI_MOD_CLASS_VHT);
+        m_numRates = minstrelHtStandardInfos.at(WIFI_MOD_CLASS_VHT).maxMcs + 1;
     }
     if (GetHeSupported())
     {
-        m_numGroups += MAX_HE_SUPPORTED_STREAMS * MAX_HE_STREAM_GROUPS;
-        m_numRates = MAX_HE_GROUP_RATES;
+        m_numGroups += GetNumGroups(WIFI_MOD_CLASS_HE);
+        m_numRates = minstrelHtStandardInfos.at(WIFI_MOD_CLASS_HE).maxMcs + 1;
     }
 
     /**
@@ -217,197 +326,26 @@
     if (GetHtSupported())
     {
         // Initialize all HT groups
-        for (MHz_u chWidth = 20; chWidth <= MAX_HT_WIDTH; chWidth *= 2)
-        {
-            for (int gi = 800; gi >= 400;)
-            {
-                const auto guardInterval = NanoSeconds(gi);
-                for (uint8_t streams = 1; streams <= MAX_HT_SUPPORTED_STREAMS; streams++)
-                {
-                    uint8_t groupId = GetHtGroupId(streams, guardInterval, chWidth);
-
-                    m_minstrelGroups[groupId].streams = streams;
-                    m_minstrelGroups[groupId].gi = guardInterval;
-                    m_minstrelGroups[groupId].chWidth = chWidth;
-                    m_minstrelGroups[groupId].type = WIFI_MINSTREL_GROUP_HT;
-                    m_minstrelGroups[groupId].isSupported = false;
-
-                    // Check capabilities of the device
-                    if (!(!GetShortGuardIntervalSupported() &&
-                          (gi == 400)) /// Is SGI supported by the transmitter?
-                        && (GetPhy()->GetChannelWidth() >=
-                            chWidth) /// Is channel width supported by the transmitter?
-                        && (GetPhy()->GetMaxSupportedTxSpatialStreams() >=
-                            streams)) /// Are streams supported by the transmitter?
-                    {
-                        m_minstrelGroups[groupId].isSupported = true;
-
-                        // Calculate TX time for all rates of the group
-                        WifiModeList htMcsList = GetHtDeviceMcsList();
-                        for (uint8_t i = 0; i < MAX_HT_GROUP_RATES; i++)
-                        {
-                            uint16_t deviceIndex = i + (m_minstrelGroups[groupId].streams - 1) * 8;
-                            WifiMode mode = htMcsList[deviceIndex];
-                            AddFirstMpduTxTime(groupId,
-                                               mode,
-                                               CalculateMpduTxDuration(GetPhy(),
-                                                                       streams,
-                                                                       guardInterval,
-                                                                       chWidth,
-                                                                       mode,
-                                                                       FIRST_MPDU_IN_AGGREGATE));
-                            AddMpduTxTime(groupId,
-                                          mode,
-                                          CalculateMpduTxDuration(GetPhy(),
-                                                                  streams,
-                                                                  guardInterval,
-                                                                  chWidth,
-                                                                  mode,
-                                                                  MIDDLE_MPDU_IN_AGGREGATE));
-                        }
-                        NS_LOG_DEBUG("Initialized group " << +groupId << ": (" << +streams << ","
-                                                          << guardInterval << "," << chWidth
-                                                          << ")");
-                    }
-                }
-                gi /= 2;
-            }
-        }
+        InitializeGroups(WIFI_MOD_CLASS_HT);
     }
 
     if (GetVhtSupported())
     {
         // Initialize all VHT groups
-        for (MHz_u chWidth = 20; chWidth <= MAX_VHT_WIDTH; chWidth *= 2)
-        {
-            for (int gi = 800; gi >= 400;)
-            {
-                const auto guardInterval = NanoSeconds(gi);
-                for (uint8_t streams = 1; streams <= MAX_VHT_SUPPORTED_STREAMS; streams++)
-                {
-                    uint8_t groupId = GetVhtGroupId(streams, guardInterval, chWidth);
-
-                    m_minstrelGroups[groupId].streams = streams;
-                    m_minstrelGroups[groupId].gi = guardInterval;
-                    m_minstrelGroups[groupId].chWidth = chWidth;
-                    m_minstrelGroups[groupId].type = WIFI_MINSTREL_GROUP_VHT;
-                    m_minstrelGroups[groupId].isSupported = false;
-
-                    // Check capabilities of the device
-                    if (!(!GetShortGuardIntervalSupported() &&
-                          (gi == 400)) /// Is SGI supported by the transmitter?
-                        && (GetPhy()->GetChannelWidth() >=
-                            chWidth) /// Is channel width supported by the transmitter?
-                        && (GetPhy()->GetMaxSupportedTxSpatialStreams() >=
-                            streams)) /// Are streams supported by the transmitter?
-                    {
-                        m_minstrelGroups[groupId].isSupported = true;
-
-                        // Calculate TX time for all rates of the group
-                        WifiModeList vhtMcsList = GetVhtDeviceMcsList();
-                        for (uint8_t i = 0; i < MAX_VHT_GROUP_RATES; i++)
-                        {
-                            WifiMode mode = vhtMcsList[i];
-                            // Check for invalid VHT MCSs and do not add time to array.
-                            if (IsValidMcs(GetPhy(), streams, chWidth, mode))
-                            {
-                                AddFirstMpduTxTime(
-                                    groupId,
-                                    mode,
-                                    CalculateMpduTxDuration(GetPhy(),
-                                                            streams,
-                                                            guardInterval,
-                                                            chWidth,
-                                                            mode,
-                                                            FIRST_MPDU_IN_AGGREGATE));
-                                AddMpduTxTime(groupId,
-                                              mode,
-                                              CalculateMpduTxDuration(GetPhy(),
-                                                                      streams,
-                                                                      guardInterval,
-                                                                      chWidth,
-                                                                      mode,
-                                                                      MIDDLE_MPDU_IN_AGGREGATE));
-                            }
-                        }
-                        NS_LOG_DEBUG("Initialized group " << +groupId << ": (" << +streams << ","
-                                                          << gi << "," << chWidth << ")");
-                    }
-                }
-                gi /= 2;
-            }
-        }
+        InitializeGroups(WIFI_MOD_CLASS_VHT);
     }
 
     if (GetHeSupported())
     {
         // Initialize all HE groups
-        for (MHz_u chWidth = 20; chWidth <= MAX_HE_WIDTH; chWidth *= 2)
-        {
-            for (int gi = 3200; gi >= 800;)
-            {
-                const auto guardInterval = NanoSeconds(gi);
-                for (uint8_t streams = 1; streams <= MAX_HE_SUPPORTED_STREAMS; streams++)
-                {
-                    uint8_t groupId = GetHeGroupId(streams, guardInterval, chWidth);
-
-                    m_minstrelGroups[groupId].streams = streams;
-                    m_minstrelGroups[groupId].gi = guardInterval;
-                    m_minstrelGroups[groupId].chWidth = chWidth;
-                    m_minstrelGroups[groupId].type = WIFI_MINSTREL_GROUP_HE;
-                    m_minstrelGroups[groupId].isSupported = false;
-
-                    // Check capabilities of the device
-                    if ((GetGuardInterval() <=
-                         guardInterval) /// Is GI supported by the transmitter?
-                        && (GetPhy()->GetChannelWidth() >=
-                            chWidth) /// Is channel width supported by the transmitter?
-                        && (GetPhy()->GetMaxSupportedTxSpatialStreams() >=
-                            streams)) /// Are streams supported by the transmitter?
-                    {
-                        m_minstrelGroups[groupId].isSupported = true;
-
-                        // Calculate tx time for all rates of the group
-                        WifiModeList heMcsList = GetHeDeviceMcsList();
-                        for (uint8_t i = 0; i < MAX_HE_GROUP_RATES; i++)
-                        {
-                            WifiMode mode = heMcsList.at(i);
-                            // Check for invalid HE MCSs and do not add time to array.
-                            if (IsValidMcs(GetPhy(), streams, chWidth, mode))
-                            {
-                                AddFirstMpduTxTime(
-                                    groupId,
-                                    mode,
-                                    CalculateMpduTxDuration(GetPhy(),
-                                                            streams,
-                                                            guardInterval,
-                                                            chWidth,
-                                                            mode,
-                                                            FIRST_MPDU_IN_AGGREGATE));
-                                AddMpduTxTime(groupId,
-                                              mode,
-                                              CalculateMpduTxDuration(GetPhy(),
-                                                                      streams,
-                                                                      guardInterval,
-                                                                      chWidth,
-                                                                      mode,
-                                                                      MIDDLE_MPDU_IN_AGGREGATE));
-                            }
-                        }
-                        NS_LOG_DEBUG("Initialized group " << +groupId << ": (" << +streams << ","
-                                                          << gi << "," << chWidth << ")");
-                    }
-                }
-                gi /= 2;
-            }
-        }
+        InitializeGroups(WIFI_MOD_CLASS_HE);
     }
 }
 
 bool
-MinstrelHtWifiManager::IsValidMcs(Ptr<WifiPhy> phy, uint8_t streams, MHz_u chWidth, WifiMode mode)
+MinstrelHtWifiManager::IsValidMcs(uint8_t streams, MHz_u chWidth, WifiMode mode)
 {
-    NS_LOG_FUNCTION(this << phy << +streams << chWidth << mode);
+    NS_LOG_FUNCTION(this << streams << chWidth << mode);
     WifiTxVector txvector;
     txvector.SetNss(streams);
     txvector.SetChannelWidth(chWidth);
@@ -415,56 +353,74 @@
     return txvector.IsValid();
 }
 
+bool
+MinstrelHtWifiManager::ShouldAddMcsToGroup(WifiMode mode, std::size_t groupId)
+{
+    for (const auto& [mc, infos] : minstrelHtStandardInfos)
+    {
+        if ((m_minstrelGroups[groupId].type == infos.groupType) &&
+            (mode.GetModulationClass() == mc) &&
+            IsValidMcs(m_minstrelGroups[groupId].streams, m_minstrelGroups[groupId].chWidth, mode))
+        {
+            if (mc == WIFI_MOD_CLASS_HT)
+            {
+                /// Check if the HT MCS corresponds to groups number of streams.
+                return ((mode.GetMcsValue() < (m_minstrelGroups[groupId].streams * 8)) &&
+                        (mode.GetMcsValue() >= ((m_minstrelGroups[groupId].streams - 1) * 8)));
+            }
+            return true;
+        }
+    }
+    return false;
+}
+
 Time
-MinstrelHtWifiManager::CalculateMpduTxDuration(Ptr<WifiPhy> phy,
-                                               uint8_t streams,
+MinstrelHtWifiManager::CalculateMpduTxDuration(uint8_t streams,
                                                Time gi,
                                                MHz_u chWidth,
                                                WifiMode mode,
                                                MpduType mpduType)
 {
-    NS_LOG_FUNCTION(this << phy << +streams << gi << chWidth << mode << mpduType);
-    WifiTxVector txvector;
+    NS_LOG_FUNCTION(this << streams << gi << chWidth << mode << mpduType);
+    WifiTxVector txvector{};
     txvector.SetNss(streams);
     txvector.SetGuardInterval(gi);
     txvector.SetChannelWidth(chWidth);
-    txvector.SetNess(0);
-    txvector.SetStbc(false);
     txvector.SetMode(mode);
-    txvector.SetPreambleType(WIFI_PREAMBLE_HT_MF);
+    txvector.SetPreambleType(GetPreambleForTransmission(mode.GetModulationClass()));
     return WifiPhy::CalculatePhyPreambleAndHeaderDuration(txvector) +
-           WifiPhy::GetPayloadDuration(m_frameLength, txvector, phy->GetPhyBand(), mpduType);
+           WifiPhy::GetPayloadDuration(m_frameLength, txvector, GetPhy()->GetPhyBand(), mpduType);
 }
 
 Time
-MinstrelHtWifiManager::GetFirstMpduTxTime(uint8_t groupId, WifiMode mode) const
+MinstrelHtWifiManager::GetFirstMpduTxTime(std::size_t groupId, WifiMode mode) const
 {
-    NS_LOG_FUNCTION(this << +groupId << mode);
-    auto it = m_minstrelGroups[groupId].ratesFirstMpduTxTimeTable.find(mode);
-    NS_ASSERT(it != m_minstrelGroups[groupId].ratesFirstMpduTxTimeTable.end());
+    NS_LOG_FUNCTION(this << groupId << mode);
+    const auto it = m_minstrelGroups[groupId].ratesFirstMpduTxTimeTable.find(mode);
+    NS_ASSERT(it != m_minstrelGroups[groupId].ratesFirstMpduTxTimeTable.cend());
     return it->second;
 }
 
 void
-MinstrelHtWifiManager::AddFirstMpduTxTime(uint8_t groupId, WifiMode mode, Time t)
+MinstrelHtWifiManager::AddFirstMpduTxTime(std::size_t groupId, WifiMode mode, Time t)
 {
-    NS_LOG_FUNCTION(this << +groupId << mode << t);
+    NS_LOG_FUNCTION(this << groupId << mode << t);
     m_minstrelGroups[groupId].ratesFirstMpduTxTimeTable.insert(std::make_pair(mode, t));
 }
 
 Time
-MinstrelHtWifiManager::GetMpduTxTime(uint8_t groupId, WifiMode mode) const
+MinstrelHtWifiManager::GetMpduTxTime(std::size_t groupId, WifiMode mode) const
 {
-    NS_LOG_FUNCTION(this << +groupId << mode);
+    NS_LOG_FUNCTION(this << groupId << mode);
     auto it = m_minstrelGroups[groupId].ratesTxTimeTable.find(mode);
     NS_ASSERT(it != m_minstrelGroups[groupId].ratesTxTimeTable.end());
     return it->second;
 }
 
 void
-MinstrelHtWifiManager::AddMpduTxTime(uint8_t groupId, WifiMode mode, Time t)
+MinstrelHtWifiManager::AddMpduTxTime(std::size_t groupId, WifiMode mode, Time t)
 {
-    NS_LOG_FUNCTION(this << +groupId << mode << t);
+    NS_LOG_FUNCTION(this << groupId << mode << t);
     m_minstrelGroups[groupId].ratesTxTimeTable.insert(std::make_pair(mode, t));
 }
 
@@ -618,8 +574,8 @@
     }
     else if (station->m_longRetry < CountRetries(station))
     {
-        uint8_t rateId = GetRateId(station->m_txrate);
-        uint8_t groupId = GetGroupId(station->m_txrate);
+        const auto rateId = GetRateId(station->m_txrate);
+        const auto groupId = GetGroupId(station->m_txrate);
         station->m_groupsTable[groupId]
             .m_ratesTable[rateId]
             .numRateAttempt++; // Increment the attempts counter for the rate used.
@@ -635,7 +591,7 @@
                                       MHz_u dataChannelWidth,
                                       uint8_t dataNss)
 {
-    NS_LOG_FUNCTION(this << st << ackSnr << ackMode << dataSnr << dataChannelWidth << +dataNss);
+    NS_LOG_FUNCTION(this << st << ackSnr << ackMode << dataSnr << dataChannelWidth << dataNss);
     auto station = static_cast<MinstrelHtWifiRemoteStation*>(st);
 
     CheckInit(station);
@@ -673,8 +629,8 @@
     }
     else
     {
-        uint8_t rateId = GetRateId(station->m_txrate);
-        uint8_t groupId = GetGroupId(station->m_txrate);
+        const auto rateId = GetRateId(station->m_txrate);
+        const auto groupId = GetGroupId(station->m_txrate);
 
         NS_LOG_DEBUG(
             "DoReportDataOk m_txrate = "
@@ -770,7 +726,7 @@
                                              uint8_t dataNss)
 {
     NS_LOG_FUNCTION(this << st << nSuccessfulMpdus << nFailedMpdus << rxSnr << dataSnr
-                         << dataChannelWidth << +dataNss);
+                         << dataChannelWidth << dataNss);
     auto station = static_cast<MinstrelHtWifiRemoteStation*>(st);
 
     CheckInit(station);
@@ -790,8 +746,8 @@
 
     UpdatePacketCounters(station, nSuccessfulMpdus, nFailedMpdus);
 
-    uint8_t rateId = GetRateId(station->m_txrate);
-    uint8_t groupId = GetGroupId(station->m_txrate);
+    const auto rateId = GetRateId(station->m_txrate);
+    const auto groupId = GetGroupId(station->m_txrate);
     station->m_groupsTable[groupId].m_ratesTable[rateId].numRateSuccess += nSuccessfulMpdus;
     station->m_groupsTable[groupId].m_ratesTable[rateId].numRateAttempt +=
         nSuccessfulMpdus + nFailedMpdus;
@@ -856,12 +812,12 @@
     /**
      * Get the IDs for all rates.
      */
-    uint8_t maxTpRateId = GetRateId(station->m_maxTpRate);
-    uint8_t maxTpGroupId = GetGroupId(station->m_maxTpRate);
-    uint8_t maxTp2RateId = GetRateId(station->m_maxTpRate2);
-    uint8_t maxTp2GroupId = GetGroupId(station->m_maxTpRate2);
-    uint8_t maxProbRateId = GetRateId(station->m_maxProbRate);
-    uint8_t maxProbGroupId = GetGroupId(station->m_maxProbRate);
+    const auto maxTpRateId = GetRateId(station->m_maxTpRate);
+    const auto maxTpGroupId = GetGroupId(station->m_maxTpRate);
+    const auto maxTp2RateId = GetRateId(station->m_maxTpRate2);
+    const auto maxTp2GroupId = GetGroupId(station->m_maxTpRate2);
+    const auto maxProbRateId = GetRateId(station->m_maxProbRate);
+    const auto maxProbGroupId = GetGroupId(station->m_maxProbRate);
 
     /// For normal rate, we're not currently sampling random rates.
     if (!station->m_isSampling)
@@ -983,39 +939,23 @@
     // the width becomes lower than 20 MHz
     auto width = group.chWidth / 2;
 
-    while (width >= 20)
+    while (width >= MHz_u{20})
     {
         if (width > allowedWidth)
         {
             width /= 2;
             continue;
         }
-
-        switch (group.type)
-        {
-        case WIFI_MINSTREL_GROUP_HT:
-            groupId = GetHtGroupId(group.streams, group.gi, width);
-            break;
-        case WIFI_MINSTREL_GROUP_VHT:
-            groupId = GetVhtGroupId(group.streams, group.gi, width);
-            break;
-        case WIFI_MINSTREL_GROUP_HE:
-            groupId = GetHeGroupId(group.streams, group.gi, width);
-            break;
-        default:
-            NS_ABORT_MSG("Unknown group type: " << group.type);
-        }
-
+        groupId = GetGroupIdForType(group.type, group.streams, group.gi, width);
         group = m_minstrelGroups[groupId];
         if (group.isSupported)
         {
             break;
         }
-
         width /= 2;
     }
 
-    NS_ABORT_MSG_IF(width < 20, "No rate compatible with the allowed width found");
+    NS_ABORT_MSG_IF(width < MHz_u{20}, "No rate compatible with the allowed width found");
 
     return GetIndex(groupId, GetRateId(txRate));
 }
@@ -1046,26 +986,26 @@
     station->m_txrate = UpdateRateAfterAllowedWidth(station->m_txrate, allowedWidth);
     NS_LOG_DEBUG("DoGetDataMode m_txrate= " << station->m_txrate);
 
-    uint8_t rateId = GetRateId(station->m_txrate);
-    uint8_t groupId = GetGroupId(station->m_txrate);
-    uint8_t mcsIndex = station->m_groupsTable[groupId].m_ratesTable[rateId].mcsIndex;
+    const auto rateId = GetRateId(station->m_txrate);
+    const auto groupId = GetGroupId(station->m_txrate);
+    const auto mcsIndex = station->m_groupsTable[groupId].m_ratesTable[rateId].mcsIndex;
 
-    NS_LOG_DEBUG("DoGetDataMode rateId= " << +rateId << " groupId= " << +groupId
+    NS_LOG_DEBUG("DoGetDataMode rateId= " << rateId << " groupId= " << groupId
                                           << " mode= " << GetMcsSupported(station, mcsIndex));
 
     McsGroup group = m_minstrelGroups[groupId];
 
     // Check consistency of rate selected.
-    if (((group.type == WIFI_MINSTREL_GROUP_HE) && (group.gi < GetGuardInterval(station))) ||
-        (((group.type == WIFI_MINSTREL_GROUP_HT) || (group.type == WIFI_MINSTREL_GROUP_VHT)) &&
-         (group.gi.GetNanoSeconds() == 400) && !GetShortGuardIntervalSupported(station)) ||
+    if (((group.type >= WIFI_MINSTREL_GROUP_HE) && (group.gi < GetGuardInterval(station))) ||
+        ((group.type < WIFI_MINSTREL_GROUP_HE) && (group.gi.GetNanoSeconds() == 400) &&
+         !GetShortGuardIntervalSupported(station)) ||
         (group.chWidth > GetChannelWidth(station)) ||
         (group.streams > GetNumberOfSupportedStreams(station)))
     {
         NS_FATAL_ERROR("Inconsistent group selected. Group: ("
                        << +group.streams << "," << group.gi << "," << group.chWidth << ")"
                        << " Station capabilities: (" << GetNumberOfSupportedStreams(station) << ","
-                       << ((group.type == WIFI_MINSTREL_GROUP_HE)
+                       << ((group.type >= WIFI_MINSTREL_GROUP_HE)
                                ? GetGuardInterval(station)
                                : NanoSeconds(GetShortGuardIntervalSupported(station) ? 400 : 800))
                        << "," << GetChannelWidth(station) << ")");
@@ -1123,20 +1063,20 @@
          */
 
         // As we are in Minstrel HT, assume the last rate was an HT rate.
-        uint8_t rateId = GetRateId(station->m_txrate);
-        uint8_t groupId = GetGroupId(station->m_txrate);
-        uint8_t mcsIndex = station->m_groupsTable[groupId].m_ratesTable[rateId].mcsIndex;
-
-        WifiMode lastRate = GetMcsSupported(station, mcsIndex);
-        uint64_t lastDataRate = lastRate.GetNonHtReferenceRate();
-        uint8_t nBasicRates = GetNBasicModes();
+        const auto rateId = GetRateId(station->m_txrate);
+        const auto groupId = GetGroupId(station->m_txrate);
+        const auto mcsIndex = station->m_groupsTable[groupId].m_ratesTable[rateId].mcsIndex;
+
+        const auto lastRate = GetMcsSupported(station, mcsIndex);
+        const auto lastDataRate = lastRate.GetNonHtReferenceRate();
+        const auto nBasicRates = GetNBasicModes();
 
         WifiMode rtsRate;
         bool rateFound = false;
 
         for (uint8_t i = 0; i < nBasicRates; i++)
         {
-            uint64_t rate = GetBasicMode(i).GetDataRate(20);
+            const auto rate = GetBasicMode(i).GetDataRate(MHz_u{20});
             if (rate <= lastDataRate)
             {
                 rtsRate = GetBasicMode(i);
@@ -1146,10 +1086,9 @@
 
         if (!rateFound)
         {
-            Ptr<WifiPhy> phy = GetPhy();
-            for (const auto& mode : phy->GetModeList())
+            for (const auto& mode : GetPhy()->GetModeList())
             {
-                uint64_t rate = mode.GetDataRate(20);
+                const auto rate = mode.GetDataRate(MHz_u{20});
                 if (rate <= lastDataRate)
                 {
                     rtsRate = mode;
@@ -1173,6 +1112,27 @@
     }
 }
 
+std::list<Ptr<WifiMpdu>>
+MinstrelHtWifiManager::DoGetMpdusToDropOnTxFailure(WifiRemoteStation* station, Ptr<WifiPsdu> psdu)
+{
+    NS_LOG_FUNCTION(this << *psdu);
+
+    std::list<Ptr<WifiMpdu>> mpdusToDrop;
+
+    for (const auto& mpdu : *PeekPointer(psdu))
+    {
+        if (!DoNeedRetransmission(station,
+                                  mpdu->GetPacket(),
+                                  (mpdu->GetRetryCount() < GetMac()->GetFrameRetryLimit())))
+        {
+            // this MPDU needs to be dropped
+            mpdusToDrop.push_back(mpdu);
+        }
+    }
+
+    return mpdusToDrop;
+}
+
 bool
 MinstrelHtWifiManager::DoNeedRetransmission(WifiRemoteStation* st,
                                             Ptr<const Packet> packet,
@@ -1216,12 +1176,12 @@
 uint32_t
 MinstrelHtWifiManager::CountRetries(MinstrelHtWifiRemoteStation* station)
 {
-    uint8_t maxProbRateId = GetRateId(station->m_maxProbRate);
-    uint8_t maxProbGroupId = GetGroupId(station->m_maxProbRate);
-    uint8_t maxTpRateId = GetRateId(station->m_maxTpRate);
-    uint8_t maxTpGroupId = GetGroupId(station->m_maxTpRate);
-    uint8_t maxTp2RateId = GetRateId(station->m_maxTpRate2);
-    uint8_t maxTp2GroupId = GetGroupId(station->m_maxTpRate2);
+    const auto maxProbRateId = GetRateId(station->m_maxProbRate);
+    const auto maxProbGroupId = GetGroupId(station->m_maxProbRate);
+    const auto maxTpRateId = GetRateId(station->m_maxTpRate);
+    const auto maxTpGroupId = GetGroupId(station->m_maxTpRate);
+    const auto maxTp2RateId = GetRateId(station->m_maxTpRate2);
+    const auto maxTp2GroupId = GetGroupId(station->m_maxTpRate2);
 
     if (!station->m_isSampling)
     {
@@ -1240,11 +1200,11 @@
 MinstrelHtWifiManager::GetNextSample(MinstrelHtWifiRemoteStation* station)
 {
     NS_LOG_FUNCTION(this << station);
-    uint8_t sampleGroup = station->m_sampleGroup;
-    uint8_t index = station->m_groupsTable[sampleGroup].m_index;
-    uint8_t col = station->m_groupsTable[sampleGroup].m_col;
-    uint8_t sampleIndex = station->m_sampleTable[index][col];
-    uint16_t rateIndex = GetIndex(sampleGroup, sampleIndex);
+    const auto sampleGroup = station->m_sampleGroup;
+    const auto index = station->m_groupsTable[sampleGroup].m_index;
+    const auto col = station->m_groupsTable[sampleGroup].m_col;
+    const auto sampleIndex = station->m_sampleTable[index][col];
+    const auto rateIndex = GetIndex(sampleGroup, sampleIndex);
     NS_LOG_DEBUG("Next Sample is " << rateIndex);
     SetNextSample(station); // Calculate the next sample rate.
     return rateIndex;
@@ -1262,9 +1222,9 @@
 
     station->m_groupsTable[station->m_sampleGroup].m_index++;
 
-    uint8_t sampleGroup = station->m_sampleGroup;
-    uint8_t index = station->m_groupsTable[station->m_sampleGroup].m_index;
-    uint8_t col = station->m_groupsTable[sampleGroup].m_col;
+    const auto sampleGroup = station->m_sampleGroup;
+    auto index = station->m_groupsTable[station->m_sampleGroup].m_index;
+    auto col = station->m_groupsTable[sampleGroup].m_col;
 
     if (index >= m_numRates)
     {
@@ -1298,12 +1258,12 @@
         // SAMPLING
         NS_LOG_DEBUG("Obtaining a sampling rate");
         /// Now go through the table and find an index rate.
-        uint16_t sampleIdx = GetNextSample(station);
+        const auto sampleIdx = GetNextSample(station);
         NS_LOG_DEBUG("Sampling rate = " << sampleIdx);
 
         // Evaluate if the sampling rate selected should be used.
-        uint8_t sampleGroupId = GetGroupId(sampleIdx);
-        uint8_t sampleRateId = GetRateId(sampleIdx);
+        const auto sampleGroupId = GetGroupId(sampleIdx);
+        const auto sampleRateId = GetRateId(sampleIdx);
 
         // If the rate selected is not supported, then don't sample.
         if (station->m_groupsTable[sampleGroupId].m_supported &&
@@ -1316,7 +1276,7 @@
              * Also do not sample if the probability is already higher than 95%
              * to avoid wasting airtime.
              */
-            MinstrelHtRateInfo sampleRateInfo =
+            const auto sampleRateInfo =
                 station->m_groupsTable[sampleGroupId].m_ratesTable[sampleRateId];
 
             NS_LOG_DEBUG("Use sample rate? MaxTpRate= "
@@ -1332,21 +1292,21 @@
                  * if the link is working perfectly.
                  */
 
-                uint8_t maxTpGroupId = GetGroupId(station->m_maxTpRate);
-                uint8_t maxTp2GroupId = GetGroupId(station->m_maxTpRate2);
-                uint8_t maxTp2RateId = GetRateId(station->m_maxTpRate2);
-                uint8_t maxProbGroupId = GetGroupId(station->m_maxProbRate);
-                uint8_t maxProbRateId = GetRateId(station->m_maxProbRate);
+                const auto maxTpGroupId = GetGroupId(station->m_maxTpRate);
+                const auto maxTp2GroupId = GetGroupId(station->m_maxTpRate2);
+                const auto maxTp2RateId = GetRateId(station->m_maxTpRate2);
+                const auto maxProbGroupId = GetGroupId(station->m_maxProbRate);
+                const auto maxProbRateId = GetRateId(station->m_maxProbRate);
 
-                uint8_t maxTpStreams = m_minstrelGroups[maxTpGroupId].streams;
-                uint8_t sampleStreams = m_minstrelGroups[sampleGroupId].streams;
+                const auto maxTpStreams = m_minstrelGroups[maxTpGroupId].streams;
+                const auto sampleStreams = m_minstrelGroups[sampleGroupId].streams;
 
-                Time sampleDuration = sampleRateInfo.perfectTxTime;
-                Time maxTp2Duration =
+                const auto sampleDuration = sampleRateInfo.perfectTxTime;
+                const auto maxTp2Duration =
                     station->m_groupsTable[maxTp2GroupId].m_ratesTable[maxTp2RateId].perfectTxTime;
-                Time maxProbDuration = station->m_groupsTable[maxProbGroupId]
-                                           .m_ratesTable[maxProbRateId]
-                                           .perfectTxTime;
+                const auto maxProbDuration = station->m_groupsTable[maxProbGroupId]
+                                                 .m_ratesTable[maxProbRateId]
+                                                 .perfectTxTime;
 
                 NS_LOG_DEBUG("Use sample rate? SampleDuration= "
                              << sampleDuration << " maxTp2Duration= " << maxTp2Duration
@@ -1425,7 +1385,7 @@
     station->m_maxProbRate = GetLowestIndex(station);
 
     /// Update throughput and EWMA for each rate inside each group.
-    for (uint8_t j = 0; j < m_numGroups; j++)
+    for (std::size_t j = 0; j < m_numGroups; j++)
     {
         if (station->m_groupsTable[j].m_supported)
         {
@@ -1534,7 +1494,7 @@
 
 double
 MinstrelHtWifiManager::CalculateThroughput(MinstrelHtWifiRemoteStation* station,
-                                           uint8_t groupId,
+                                           std::size_t groupId,
                                            uint8_t rateId,
                                            double ewmaProb)
 {
@@ -1553,7 +1513,7 @@
          * For the throughput calculation, limit the probability value to 90% to
          * account for collision related packet error rate fluctuation.
          */
-        Time txTime = station->m_groupsTable[groupId].m_ratesTable[rateId].perfectTxTime;
+        const auto txTime = station->m_groupsTable[groupId].m_ratesTable[rateId].perfectTxTime;
         if (ewmaProb > 90)
         {
             return 90 / txTime.GetSeconds();
@@ -1570,15 +1530,15 @@
 {
     GroupInfo* group;
     MinstrelHtRateInfo rate;
-    uint8_t tmpGroupId;
+    std::size_t tmpGroupId;
     uint8_t tmpRateId;
     double tmpTh;
     double tmpProb;
-    uint8_t groupId;
+    std::size_t groupId;
     uint8_t rateId;
     double currentTh;
     // maximum group probability (GP) variables
-    uint8_t maxGPGroupId;
+    std::size_t maxGPGroupId;
     uint8_t maxGPRateId;
     double maxGPTh;
 
@@ -1633,13 +1593,13 @@
 void
 MinstrelHtWifiManager::SetBestStationThRates(MinstrelHtWifiRemoteStation* station, uint16_t index)
 {
-    uint8_t groupId;
+    std::size_t groupId;
     uint8_t rateId;
     double th;
     double prob;
-    uint8_t maxTpGroupId;
+    std::size_t maxTpGroupId;
     uint8_t maxTpRateId;
-    uint8_t maxTp2GroupId;
+    std::size_t maxTp2GroupId;
     uint8_t maxTp2RateId;
     double maxTpTh;
     double maxTpProb;
@@ -1707,7 +1667,7 @@
      */
     NS_LOG_DEBUG("Supported groups by station:");
     bool noSupportedGroupFound = true;
-    for (uint8_t groupId = 0; groupId < m_numGroups; groupId++)
+    for (std::size_t groupId = 0; groupId < m_numGroups; groupId++)
     {
         if (m_minstrelGroups[groupId].isSupported)
         {
@@ -1740,15 +1700,14 @@
                 // UseLatestAmendmentOnly attribute is enabled
                 continue;
             }
-            if (((m_minstrelGroups[groupId].type == WIFI_MINSTREL_GROUP_HT) ||
-                 (m_minstrelGroups[groupId].type == WIFI_MINSTREL_GROUP_VHT)) &&
+            if ((m_minstrelGroups[groupId].type < WIFI_MINSTREL_GROUP_HE) &&
                 (m_minstrelGroups[groupId].gi.GetNanoSeconds() == 400) &&
                 !GetShortGuardIntervalSupported(station))
             {
                 // It is a SGI group but the receiver does not support SGI: skip
                 continue;
             }
-            if ((m_minstrelGroups[groupId].type == WIFI_MINSTREL_GROUP_HE) &&
+            if ((m_minstrelGroups[groupId].type >= WIFI_MINSTREL_GROUP_HE) &&
                 (m_minstrelGroups[groupId].gi < GetGuardInterval(station)))
             {
                 // The receiver does not support the GI: skip
@@ -1765,7 +1724,7 @@
                 continue;
             }
 
-            NS_LOG_DEBUG("Group: " << +groupId << " type: " << m_minstrelGroups[groupId].type
+            NS_LOG_DEBUG("Group: " << groupId << " type: " << m_minstrelGroups[groupId].type
                                    << " streams: " << +m_minstrelGroups[groupId].streams
                                    << " GI: " << m_minstrelGroups[groupId].gi
                                    << " width: " << m_minstrelGroups[groupId].chWidth);
@@ -1786,40 +1745,19 @@
             // group.
             for (uint8_t i = 0; i < station->m_nModes; i++)
             {
-                WifiMode mode = GetMcsSupported(station, i);
-
-                /// Use the McsValue as the index in the rate table.
-                /// This way, MCSs not supported are not initialized.
-                uint8_t rateId = mode.GetMcsValue();
-                if (mode.GetModulationClass() == WIFI_MOD_CLASS_HT)
-                {
-                    rateId %= MAX_HT_GROUP_RATES;
-                }
-
-                if (((m_minstrelGroups[groupId].type == WIFI_MINSTREL_GROUP_HE) &&
-                     (mode.GetModulationClass() ==
-                      WIFI_MOD_CLASS_HE) /// If it is a HE MCS only add to a HE group.
-                     && IsValidMcs(GetPhy(),
-                                   m_minstrelGroups[groupId].streams,
-                                   m_minstrelGroups[groupId].chWidth,
-                                   mode)) /// Check validity of the HE MCS
-                    || ((m_minstrelGroups[groupId].type == WIFI_MINSTREL_GROUP_VHT) &&
-                        (mode.GetModulationClass() ==
-                         WIFI_MOD_CLASS_VHT) /// If it is a VHT MCS only add to a VHT group.
-                        && IsValidMcs(GetPhy(),
-                                      m_minstrelGroups[groupId].streams,
-                                      m_minstrelGroups[groupId].chWidth,
-                                      mode)) /// Check validity of the VHT MCS
-                    || ((m_minstrelGroups[groupId].type == WIFI_MINSTREL_GROUP_HT) &&
-                        (mode.GetModulationClass() ==
-                         WIFI_MOD_CLASS_HT) /// If it is a HT MCS only add to a HT group.
-                        && (mode.GetMcsValue() <
-                            (m_minstrelGroups[groupId].streams *
-                             8)) /// Check if the HT MCS corresponds to groups number of streams.
-                        && (mode.GetMcsValue() >= ((m_minstrelGroups[groupId].streams - 1) * 8))))
+                if (const auto mode = GetMcsSupported(station, i);
+                    ShouldAddMcsToGroup(mode, groupId))
                 {
                     NS_LOG_DEBUG("Mode " << +i << ": " << mode);
 
+                    /// Use the McsValue as the index in the rate table.
+                    /// This way, MCSs not supported are not initialized.
+                    auto rateId = mode.GetMcsValue();
+                    if (mode.GetModulationClass() == WIFI_MOD_CLASS_HT)
+                    {
+                        rateId %= (minstrelHtStandardInfos.at(WIFI_MOD_CLASS_HT).maxMcs + 1);
+                    }
+
                     station->m_groupsTable[groupId].m_ratesTable[rateId].supported = true;
                     station->m_groupsTable[groupId].m_ratesTable[rateId].mcsIndex =
                         i; /// Mapping between rateId and operationalMcsSet
@@ -1857,8 +1795,8 @@
 MinstrelHtWifiManager::CalculateRetransmits(MinstrelHtWifiRemoteStation* station, uint16_t index)
 {
     NS_LOG_FUNCTION(this << station << index);
-    uint8_t groupId = GetGroupId(index);
-    uint8_t rateId = GetRateId(index);
+    const auto groupId = GetGroupId(index);
+    const auto rateId = GetRateId(index);
     if (!station->m_groupsTable[groupId].m_ratesTable[rateId].retryUpdated)
     {
         CalculateRetransmits(station, groupId, rateId);
@@ -1867,18 +1805,18 @@
 
 void
 MinstrelHtWifiManager::CalculateRetransmits(MinstrelHtWifiRemoteStation* station,
-                                            uint8_t groupId,
+                                            std::size_t groupId,
                                             uint8_t rateId)
 {
-    NS_LOG_FUNCTION(this << station << +groupId << +rateId);
+    NS_LOG_FUNCTION(this << station << groupId << rateId);
 
     uint32_t cw = 15; // Is an approximation.
     uint32_t cwMax = 1023;
     Time cwTime;
     Time txTime;
     Time dataTxTime;
-    Time slotTime = GetPhy()->GetSlot();
-    Time ackTime = GetPhy()->GetSifs() + GetPhy()->GetBlockAckTxTime();
+    const auto slotTime = GetPhy()->GetSlot();
+    const auto ackTime = GetPhy()->GetSifs() + GetPhy()->GetBlockAckTxTime();
 
     if (station->m_groupsTable[groupId].m_ratesTable[rateId].ewmaProb < 1)
     {
@@ -1950,7 +1888,7 @@
     station->m_col = station->m_index = 0;
 
     // for off-setting to make rates fall between 0 and nModes
-    uint8_t numSampleRates = m_numRates;
+    auto numSampleRates = m_numRates;
 
     uint16_t newIndex;
     for (uint8_t col = 0; col < m_nSampleCol; col++)
@@ -1989,7 +1927,7 @@
            "________last_______    ______sum-of________\n"
         << " mode guard #  rate  [name   idx airtime  max_tp]  [avg(tp) avg(prob) sd(prob)]  "
            "[prob.|retry|suc|att]  [#success | #attempts]\n";
-    for (uint8_t i = 0; i < m_numGroups; i++)
+    for (std::size_t i = 0; i < m_numGroups; i++)
     {
         StatsDump(station, i, station->m_statsFile);
     }
@@ -2005,10 +1943,10 @@
 
 void
 MinstrelHtWifiManager::StatsDump(MinstrelHtWifiRemoteStation* station,
-                                 uint8_t groupId,
+                                 std::size_t groupId,
                                  std::ofstream& of)
 {
-    uint8_t numRates = m_numRates;
+    auto numRates = m_numRates;
     McsGroup group = m_minstrelGroups[groupId];
     Time txTime;
     for (uint8_t i = 0; i < numRates; i++)
@@ -2019,11 +1957,11 @@
             of << group.type << " " << group.chWidth << "   " << group.gi << "  " << +group.streams
                << "   ";
 
-            uint16_t maxTpRate = station->m_maxTpRate;
-            uint16_t maxTpRate2 = station->m_maxTpRate2;
-            uint16_t maxProbRate = station->m_maxProbRate;
+            const auto maxTpRate = station->m_maxTpRate;
+            const auto maxTpRate2 = station->m_maxTpRate2;
+            const auto maxProbRate = station->m_maxProbRate;
 
-            uint16_t idx = GetIndex(groupId, i);
+            const auto idx = GetIndex(groupId, i);
             if (idx == maxTpRate)
             {
                 of << 'A';
@@ -2051,14 +1989,17 @@
 
             if (group.type == WIFI_MINSTREL_GROUP_HT)
             {
-                of << std::setw(4) << "   MCS" << (group.streams - 1) * 8 + i;
+                of << std::setw(4) << "   MCS"
+                   << (group.streams - 1) *
+                              (minstrelHtStandardInfos.at(WIFI_MOD_CLASS_HT).maxMcs + 1) +
+                          i;
             }
             else
             {
                 of << std::setw(7) << "   MCS" << +i << "/" << static_cast<int>(group.streams);
             }
 
-            of << "  " << std::setw(3) << +idx << "  ";
+            of << "  " << std::setw(3) << idx << "  ";
 
             /* tx_time[rate(i)] in usec */
             txTime = GetFirstMpduTxTime(
@@ -2084,114 +2025,97 @@
 }
 
 uint16_t
-MinstrelHtWifiManager::GetIndex(uint8_t groupId, uint8_t rateId)
+MinstrelHtWifiManager::GetIndex(std::size_t groupId, uint8_t rateId)
 {
-    NS_LOG_FUNCTION(this << +groupId << +rateId);
-    uint16_t index;
-    index = groupId * m_numRates + rateId;
-    return index;
+    NS_LOG_FUNCTION(this << groupId << rateId);
+    return groupId * m_numRates + rateId;
 }
 
 uint8_t
 MinstrelHtWifiManager::GetRateId(uint16_t index)
 {
     NS_LOG_FUNCTION(this << index);
-    uint8_t id;
-    id = index % m_numRates;
-    return id;
+    return index % m_numRates;
 }
 
-uint8_t
+std::size_t
 MinstrelHtWifiManager::GetGroupId(uint16_t index)
 {
     NS_LOG_FUNCTION(this << index);
     return index / m_numRates;
 }
 
-uint8_t
-MinstrelHtWifiManager::GetHtGroupId(uint8_t txstreams, Time guardInterval, MHz_u chWidth)
+std::size_t
+MinstrelHtWifiManager::GetIdInGroup(WifiModulationClass mc,
+                                    uint8_t streams,
+                                    Time guardInterval,
+                                    MHz_u chWidth)
 {
-    NS_LOG_FUNCTION(this << +txstreams << guardInterval << chWidth);
-    uint8_t giIndex = (guardInterval.GetNanoSeconds() == 400) ? 1 : 0;
-    uint8_t widthIndex = (chWidth == 40) ? 1 : 0;
-    return (MAX_HT_SUPPORTED_STREAMS * 2 * widthIndex) + (MAX_HT_SUPPORTED_STREAMS * giIndex) +
-           txstreams - 1;
+    NS_LOG_FUNCTION(this << mc << streams << guardInterval << chWidth);
+    const auto& standardInfos = minstrelHtStandardInfos.at(mc);
+    const auto it = std::find(standardInfos.guardIntervals.cbegin(),
+                              standardInfos.guardIntervals.cend(),
+                              guardInterval);
+    const auto giIndex = std::distance(standardInfos.guardIntervals.cbegin(), it);
+    const auto widthIndex = std::log2(chWidth / MHz_u{20});
+    return (standardInfos.maxStreams * standardInfos.guardIntervals.size() * widthIndex) +
+           (standardInfos.maxStreams * giIndex) + streams - 1;
 }
 
-uint8_t
-MinstrelHtWifiManager::GetVhtGroupId(uint8_t txstreams, Time guardInterval, MHz_u chWidth)
+std::size_t
+MinstrelHtWifiManager::GetNumGroups(WifiModulationClass mc)
 {
-    NS_LOG_FUNCTION(this << +txstreams << guardInterval << chWidth);
-    uint8_t giIndex = (guardInterval.GetNanoSeconds() == 400) ? 1 : 0;
-    uint8_t widthIndex;
-    if (chWidth == 160)
-    {
-        widthIndex = 3;
-    }
-    else if (chWidth == 80)
-    {
-        widthIndex = 2;
-    }
-    else if (chWidth == 40)
-    {
-        widthIndex = 1;
-    }
-    else // 20 MHz
-    {
-        widthIndex = 0;
-    }
-    uint8_t groupId = (MAX_HT_STREAM_GROUPS * MAX_HT_SUPPORTED_STREAMS); /// add all HT groups
-    groupId += (MAX_VHT_SUPPORTED_STREAMS * 2 * widthIndex) +
-               (MAX_VHT_SUPPORTED_STREAMS * giIndex) + txstreams - 1;
-    return groupId;
+    const auto& standardInfos = minstrelHtStandardInfos.at(mc);
+    const auto numWidths = std::log2(standardInfos.maxWidth / MHz_u{20}) + 1;
+    return numWidths * standardInfos.guardIntervals.size() * standardInfos.maxStreams;
 }
 
-uint8_t
-MinstrelHtWifiManager::GetHeGroupId(uint8_t txstreams, Time guardInterval, MHz_u chWidth)
+std::size_t
+MinstrelHtWifiManager::GetHtGroupId(uint8_t streams, Time guardInterval, MHz_u chWidth)
 {
-    NS_LOG_FUNCTION(this << +txstreams << guardInterval << chWidth);
-    uint8_t giIndex;
-    if (const auto gi = guardInterval.GetNanoSeconds(); gi == 800)
-    {
-        giIndex = 2;
-    }
-    else if (gi == 1600)
-    {
-        giIndex = 1;
-    }
-    else // 3200 ns
-    {
-        giIndex = 0;
-    }
-    uint8_t widthIndex;
-    if (chWidth == 160)
-    {
-        widthIndex = 3;
-    }
-    else if (chWidth == 80)
-    {
-        widthIndex = 2;
-    }
-    else if (chWidth == 40)
-    {
-        widthIndex = 1;
-    }
-    else // 20 MHz
-    {
-        widthIndex = 0;
-    }
-    uint8_t groupId = 0;
-    if (GetHtSupported()) // This check is needed since HT is not supported in 6 GHz band
-    {
-        groupId = MAX_HT_STREAM_GROUPS * MAX_HT_SUPPORTED_STREAMS;
-    }
-    if (GetVhtSupported()) // This check is needed since VHT is not supported in 2.4 and 6 GHz bands
+    NS_LOG_FUNCTION(this << streams << guardInterval << chWidth);
+    return GetIdInGroup(WIFI_MOD_CLASS_HT, streams, guardInterval, chWidth);
+}
+
+std::size_t
+MinstrelHtWifiManager::GetVhtGroupId(uint8_t streams, Time guardInterval, MHz_u chWidth)
+{
+    NS_LOG_FUNCTION(this << streams << guardInterval << chWidth);
+    const auto allHtGroups = GetNumGroups(WIFI_MOD_CLASS_HT);
+    const auto vhtGroupId = GetIdInGroup(WIFI_MOD_CLASS_VHT, streams, guardInterval, chWidth);
+    return allHtGroups + vhtGroupId;
+}
+
+std::size_t
+MinstrelHtWifiManager::GetHeGroupId(uint8_t streams, Time guardInterval, MHz_u chWidth)
+{
+    NS_LOG_FUNCTION(this << streams << guardInterval << chWidth);
+    // This check is needed since HT is not supported in 6 GHz band
+    std::size_t allHtGroups = (GetHtSupported()) ? GetNumGroups(WIFI_MOD_CLASS_HT) : 0;
+    // This check is needed since VHT is not supported in 2.4 and 6 GHz bands
+    std::size_t allVhtGroups = (GetVhtSupported()) ? GetNumGroups(WIFI_MOD_CLASS_VHT) : 0;
+    const auto heGroupId = GetIdInGroup(WIFI_MOD_CLASS_HE, streams, guardInterval, chWidth);
+    return allHtGroups + allVhtGroups + heGroupId;
+}
+
+std::size_t
+MinstrelHtWifiManager::GetGroupIdForType(McsGroupType type,
+                                         uint8_t streams,
+                                         Time guardInterval,
+                                         MHz_u chWidth)
+{
+    switch (type)
     {
-        groupId += MAX_VHT_STREAM_GROUPS * MAX_VHT_SUPPORTED_STREAMS; /// add all VHT groups
+    case WIFI_MINSTREL_GROUP_HT:
+        return GetHtGroupId(streams, guardInterval, chWidth);
+    case WIFI_MINSTREL_GROUP_VHT:
+        return GetVhtGroupId(streams, guardInterval, chWidth);
+    case WIFI_MINSTREL_GROUP_HE:
+        return GetHeGroupId(streams, guardInterval, chWidth);
+    default:
+        NS_ABORT_MSG("Unknown group type: " << type);
     }
-    groupId += (MAX_HE_SUPPORTED_STREAMS * 3 * widthIndex) + (MAX_HE_SUPPORTED_STREAMS * giIndex) +
-               txstreams - 1;
-    return groupId;
+    return 0;
 }
 
 uint16_t
@@ -2199,7 +2123,7 @@
 {
     NS_LOG_FUNCTION(this << station);
 
-    uint8_t groupId = 0;
+    std::size_t groupId = 0;
     uint8_t rateId = 0;
     while (groupId < m_numGroups && !station->m_groupsTable[groupId].m_supported)
     {
@@ -2215,9 +2139,9 @@
 }
 
 uint16_t
-MinstrelHtWifiManager::GetLowestIndex(MinstrelHtWifiRemoteStation* station, uint8_t groupId)
+MinstrelHtWifiManager::GetLowestIndex(MinstrelHtWifiRemoteStation* station, std::size_t groupId)
 {
-    NS_LOG_FUNCTION(this << station << +groupId);
+    NS_LOG_FUNCTION(this << station << groupId);
 
     uint8_t rateId = 0;
     while (rateId < m_numRates && !station->m_groupsTable[groupId].m_ratesTable[rateId].supported)
@@ -2230,27 +2154,11 @@
 }
 
 WifiModeList
-MinstrelHtWifiManager::GetHeDeviceMcsList() const
-{
-    const auto& mcsList = GetPhy()->GetMcsList(WIFI_MOD_CLASS_HE);
-    WifiModeList heMcsList(mcsList.begin(), mcsList.end());
-    return heMcsList;
-}
-
-WifiModeList
-MinstrelHtWifiManager::GetVhtDeviceMcsList() const
-{
-    const auto& mcsList = GetPhy()->GetMcsList(WIFI_MOD_CLASS_VHT);
-    WifiModeList vhtMcsList(mcsList.begin(), mcsList.end());
-    return vhtMcsList;
-}
-
-WifiModeList
-MinstrelHtWifiManager::GetHtDeviceMcsList() const
+MinstrelHtWifiManager::GetDeviceMcsList(WifiModulationClass mc) const
 {
-    const auto& mcsList = GetPhy()->GetMcsList(WIFI_MOD_CLASS_HT);
-    WifiModeList htMcsList(mcsList.begin(), mcsList.end());
-    return htMcsList;
+    const auto& phyMcsList = GetPhy()->GetMcsList(mc);
+    WifiModeList mcsList(phyMcsList.cbegin(), phyMcsList.cend());
+    return mcsList;
 }
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/rate-control/minstrel-ht-wifi-manager.h ns-3.44/src/wifi/model/rate-control/minstrel-ht-wifi-manager.h
--- ns-3.43/src/wifi/model/rate-control/minstrel-ht-wifi-manager.h	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/rate-control/minstrel-ht-wifi-manager.h	2025-03-09 16:55:49.795372700 -0700
@@ -28,22 +28,24 @@
 typedef std::map<WifiMode, Time> TxTime;
 
 /**
- * \enum McsGroupType
- * \brief Available MCS group types
+ * @enum McsGroupType
+ * @brief Available MCS group types
  */
 enum McsGroupType
 {
-    WIFI_MINSTREL_GROUP_HT = 0,
+    WIFI_MINSTREL_GROUP_INVALID = 0,
+    WIFI_MINSTREL_GROUP_HT,
     WIFI_MINSTREL_GROUP_VHT,
-    WIFI_MINSTREL_GROUP_HE
+    WIFI_MINSTREL_GROUP_HE,
+    WIFI_MINSTREL_GROUP_COUNT
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the stream
- * \param type the MCS group type
- * \returns a reference to the stream
+ * @param os the stream
+ * @param type the MCS group type
+ * @returns a reference to the stream
  */
 inline std::ostream&
 operator<<(std::ostream& os, McsGroupType type)
@@ -57,6 +59,7 @@
     case WIFI_MINSTREL_GROUP_HE:
         return (os << "HE");
     default:
+    case WIFI_MINSTREL_GROUP_INVALID:
         return (os << "INVALID");
     }
 }
@@ -153,34 +156,8 @@
 typedef std::vector<GroupInfo> McsGroupData;
 
 /**
- * Constants for maximum values.
- */
-
-static const uint8_t MAX_HT_SUPPORTED_STREAMS =
-    4; //!< Maximal number of streams supported by the HT PHY layer.
-static const uint8_t MAX_VHT_SUPPORTED_STREAMS =
-    8; //!< Maximal number of streams supported by the VHT PHY layer.
-static const uint8_t MAX_HE_SUPPORTED_STREAMS =
-    8; //!< Maximal number of streams supported by the HE PHY layer.
-static const uint8_t MAX_HT_STREAM_GROUPS =
-    4; //!< Maximal number of groups per stream in HT (2 possible channel widths and 2 possible GI
-       //!< configurations).
-static const uint8_t MAX_VHT_STREAM_GROUPS =
-    8; //!< Maximal number of groups per stream in VHT (4 possible channel widths and 2 possible GI
-       //!< configurations).
-static const uint8_t MAX_HE_STREAM_GROUPS =
-    12; //!< Maximal number of groups per stream in HE (4 possible channel widths and 3 possible GI
-        //!< configurations).
-static const uint8_t MAX_HT_GROUP_RATES = 8;   //!< Number of rates (or MCS) per HT group.
-static const uint8_t MAX_VHT_GROUP_RATES = 10; //!< Number of rates (or MCS) per VHT group.
-static const uint8_t MAX_HE_GROUP_RATES = 12;  //!< Number of rates (or MCS) per HE group.
-static const MHz_u MAX_HT_WIDTH = 40;          //!< Maximal channel width.
-static const MHz_u MAX_VHT_WIDTH = 160;        //!< Maximal channel width.
-static const MHz_u MAX_HE_WIDTH = 160;         //!< Maximal channel width.
-
-/**
- * \brief Implementation of Minstrel-HT Rate Control Algorithm
- * \ingroup wifi
+ * @brief Implementation of Minstrel-HT Rate Control Algorithm
+ * @ingroup wifi
  *
  * Minstrel-HT is a rate adaptation mechanism for the 802.11n/ac/ax standards
  * based on Minstrel, and is based on the approach of probing the channel
@@ -226,8 +203,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     MinstrelHtWifiManager();
@@ -238,10 +215,22 @@
     int64_t AssignStreams(int64_t stream) override;
 
     /**
+     * A struct to contain information of a standard.
+     */
+    struct StandardInfo
+    {
+        McsGroupType groupType{}; //!< group type associated to the given standard in Minstrel HT
+        uint8_t maxMcs{};         //!< maximum MCS index (for 1 SS if 802.11n)
+        MHz_u maxWidth{};         //!< maximum channel width
+        std::vector<Time> guardIntervals{}; //!< supported GIs
+        uint8_t maxStreams{};               //!< maximum number of spatial streams
+    };
+
+    /**
      * TracedCallback signature for rate change events.
      *
-     * \param [in] rate The new rate.
-     * \param [in] address The remote station MAC address.
+     * @param [in] rate The new rate.
+     * @param [in] address The remote station MAC address.
      */
     typedef void (*RateChangeTracedCallback)(const uint64_t rate, const Mac48Address remoteAddress);
 
@@ -272,35 +261,60 @@
                                double dataSnr,
                                MHz_u dataChannelWidth,
                                uint8_t dataNss) override;
-    bool DoNeedRetransmission(WifiRemoteStation* st,
-                              Ptr<const Packet> packet,
-                              bool normally) override;
+    std::list<Ptr<WifiMpdu>> DoGetMpdusToDropOnTxFailure(WifiRemoteStation* station,
+                                                         Ptr<WifiPsdu> psdu) override;
+
+    /**
+     * Initialize all groups belonging to a given modulation class.
+     *
+     * @param mc the modulation class
+     */
+    void InitializeGroups(WifiModulationClass mc);
+
+    /**
+     * @param st the station that we need to communicate
+     * @param packet the packet to send
+     * @param normally indicates whether the normal 802.11 data retransmission mechanism
+     *        would request that the data is retransmitted or not.
+     * @return true if we want to resend a packet after a failed transmission attempt,
+     *         false otherwise.
+     *
+     * Note: This method is called after any unicast packet transmission (control, management,
+     *       or data) has been attempted and has failed.
+     */
+    bool DoNeedRetransmission(WifiRemoteStation* st, Ptr<const Packet> packet, bool normally);
 
     /**
      * Check the validity of a combination of number of streams, chWidth and mode.
      *
-     * \param phy pointer to the wifi PHY
-     * \param streams the number of streams
-     * \param chWidth the channel width
-     * \param mode the wifi mode
-     * \returns true if the combination is valid
+     * @param streams the number of streams
+     * @param chWidth the channel width
+     * @param mode the wifi mode
+     * @returns true if the combination is valid
      */
-    bool IsValidMcs(Ptr<WifiPhy> phy, uint8_t streams, MHz_u chWidth, WifiMode mode);
+    bool IsValidMcs(uint8_t streams, MHz_u chWidth, WifiMode mode);
+
+    /**
+     * Check whether a given MCS mode should be added to a given group.
+     *
+     * @param mode the MCS mode
+     * @param groupId the group ID
+     * @returns true if the MCS mode should be added to the group
+     */
+    bool ShouldAddMcsToGroup(WifiMode mode, std::size_t groupId);
 
     /**
      * Estimates the TxTime of a frame with a given mode and group (stream, guard interval and
      * channel width).
      *
-     * \param phy pointer to the wifi PHY
-     * \param streams the number of streams
-     * \param gi guard interval duration
-     * \param chWidth the channel width
-     * \param mode the wifi mode
-     * \param mpduType the type of the MPDU
-     * \returns the transmit time
+     * @param streams the number of streams
+     * @param gi guard interval duration
+     * @param chWidth the channel width
+     * @param mode the wifi mode
+     * @param mpduType the type of the MPDU
+     * @returns the transmit time
      */
-    Time CalculateMpduTxDuration(Ptr<WifiPhy> phy,
-                                 uint8_t streams,
+    Time CalculateMpduTxDuration(uint8_t streams,
                                  Time gi,
                                  MHz_u chWidth,
                                  WifiMode mode,
@@ -309,51 +323,51 @@
     /**
      * Obtain the TxTime saved in the group information.
      *
-     * \param groupId the group ID
-     * \param mode the wifi mode
-     * \returns the transmit time
+     * @param groupId the group ID
+     * @param mode the wifi mode
+     * @returns the transmit time
      */
-    Time GetMpduTxTime(uint8_t groupId, WifiMode mode) const;
+    Time GetMpduTxTime(std::size_t groupId, WifiMode mode) const;
 
     /**
      * Save a TxTime to the vector of groups.
      *
-     * \param groupId the group ID
-     * \param mode the wifi mode
-     * \param t the transmit time
+     * @param groupId the group ID
+     * @param mode the wifi mode
+     * @param t the transmit time
      */
-    void AddMpduTxTime(uint8_t groupId, WifiMode mode, Time t);
+    void AddMpduTxTime(std::size_t groupId, WifiMode mode, Time t);
 
     /**
      * Obtain the TxTime saved in the group information.
      *
-     * \param groupId the group ID
-     * \param mode the wifi mode
-     * \returns the transmit time
+     * @param groupId the group ID
+     * @param mode the wifi mode
+     * @returns the transmit time
      */
-    Time GetFirstMpduTxTime(uint8_t groupId, WifiMode mode) const;
+    Time GetFirstMpduTxTime(std::size_t groupId, WifiMode mode) const;
 
     /**
      * Save a TxTime to the vector of groups.
      *
-     * \param groupId the group ID
-     * \param mode the wifi mode
-     * \param t the transmit time
+     * @param groupId the group ID
+     * @param mode the wifi mode
+     * @param t the transmit time
      */
-    void AddFirstMpduTxTime(uint8_t groupId, WifiMode mode, Time t);
+    void AddFirstMpduTxTime(std::size_t groupId, WifiMode mode, Time t);
 
     /**
      * Update the number of retries and reset accordingly.
-     * \param station the wifi remote station
+     * @param station the wifi remote station
      */
     void UpdateRetry(MinstrelHtWifiRemoteStation* station);
 
     /**
      * Update the number of sample count variables.
      *
-     * \param station the wifi remote station
-     * \param nSuccessfulMpdus the number of successfully received MPDUs
-     * \param nFailedMpdus the number of failed MPDUs
+     * @param station the wifi remote station
+     * @param nSuccessfulMpdus the number of successfully received MPDUs
+     * @param nFailedMpdus the number of failed MPDUs
      */
     void UpdatePacketCounters(MinstrelHtWifiRemoteStation* station,
                               uint16_t nSuccessfulMpdus,
@@ -362,87 +376,87 @@
     /**
      * Getting the next sample from Sample Table.
      *
-     * \param station the wifi remote station
-     * \returns the next sample
+     * @param station the wifi remote station
+     * @returns the next sample
      */
     uint16_t GetNextSample(MinstrelHtWifiRemoteStation* station);
 
     /**
      * Set the next sample from Sample Table.
      *
-     * \param station the wifi remote station
+     * @param station the wifi remote station
      */
     void SetNextSample(MinstrelHtWifiRemoteStation* station);
 
     /**
      * Find a rate to use from Minstrel Table.
      *
-     * \param station the Minstrel-HT wifi remote station
-     * \returns the rate in bps
+     * @param station the Minstrel-HT wifi remote station
+     * @returns the rate in bps
      */
     uint16_t FindRate(MinstrelHtWifiRemoteStation* station);
 
     /**
      * Update the Minstrel Table.
      *
-     * \param station the Minstrel-HT wifi remote station
+     * @param station the Minstrel-HT wifi remote station
      */
     void UpdateStats(MinstrelHtWifiRemoteStation* station);
 
     /**
      * Initialize Minstrel Table.
      *
-     * \param station the Minstrel-HT wifi remote station
+     * @param station the Minstrel-HT wifi remote station
      */
     void RateInit(MinstrelHtWifiRemoteStation* station);
 
     /**
      * Return the average throughput of the MCS defined by groupId and rateId.
      *
-     * \param station the Minstrel-HT wifi remote station
-     * \param groupId the group ID
-     * \param rateId the rate ID
-     * \param ewmaProb the EWMA probability
-     * \returns the throughput in bps
+     * @param station the Minstrel-HT wifi remote station
+     * @param groupId the group ID
+     * @param rateId the rate ID
+     * @param ewmaProb the EWMA probability
+     * @returns the throughput in bps
      */
     double CalculateThroughput(MinstrelHtWifiRemoteStation* station,
-                               uint8_t groupId,
+                               std::size_t groupId,
                                uint8_t rateId,
                                double ewmaProb);
 
     /**
      * Set index rate as maxTpRate or maxTp2Rate if is better than current values.
      *
-     * \param station the Minstrel-HT wifi remote station
-     * \param index the index
+     * @param station the Minstrel-HT wifi remote station
+     * @param index the index
      */
     void SetBestStationThRates(MinstrelHtWifiRemoteStation* station, uint16_t index);
 
     /**
      * Set index rate as maxProbRate if it is better than current value.
      *
-     * \param station the Minstrel-HT wifi remote station
-     * \param index the index
+     * @param station the Minstrel-HT wifi remote station
+     * @param index the index
      */
     void SetBestProbabilityRate(MinstrelHtWifiRemoteStation* station, uint16_t index);
 
     /**
      * Calculate the number of retransmissions to set for the index rate.
      *
-     * \param station the Minstrel-HT wifi remote station
-     * \param index the index
+     * @param station the Minstrel-HT wifi remote station
+     * @param index the index
      */
     void CalculateRetransmits(MinstrelHtWifiRemoteStation* station, uint16_t index);
 
     /**
      * Calculate the number of retransmissions to set for the (groupId, rateId) rate.
      *
-     * \param station the Minstrel-HT wifi remote station
-     * \param groupId the group ID
-     * \param rateId the rate ID
+     * @param station the Minstrel-HT wifi remote station
+     * @param groupId the group ID
+     * @param rateId the rate ID
      */
     void CalculateRetransmits(MinstrelHtWifiRemoteStation* station,
-                              uint8_t groupId,
+                              std::size_t groupId,
                               uint8_t rateId);
 
     /**
@@ -461,10 +475,10 @@
      *  - Data transmission
      *  - backoffs according to CW
      *
-     * \param dataTransmissionTime the data transmission time
-     * \param shortRetries the short retries
-     * \param longRetries the long retries
-     * \returns the unicast packet time
+     * @param dataTransmissionTime the data transmission time
+     * @param shortRetries the short retries
+     * @param longRetries the long retries
+     * @returns the unicast packet time
      */
     Time CalculateTimeUnicastPacket(Time dataTransmissionTime,
                                     uint32_t shortRetries,
@@ -473,81 +487,81 @@
     /**
      * Perform EWMSD (Exponentially Weighted Moving Standard Deviation) calculation.
      *
-     * \param oldEwmsd the old EWMSD
-     * \param currentProb the current probability
-     * \param ewmaProb the EWMA probability
-     * \param weight the weight
-     * \returns the EWMSD
+     * @param oldEwmsd the old EWMSD
+     * @param currentProb the current probability
+     * @param ewmaProb the EWMA probability
+     * @param weight the weight
+     * @returns the EWMSD
      */
     double CalculateEwmsd(double oldEwmsd, double currentProb, double ewmaProb, double weight);
 
     /**
      * Initialize Sample Table.
      *
-     * \param station the Minstrel-HT wifi remote station
+     * @param station the Minstrel-HT wifi remote station
      */
     void InitSampleTable(MinstrelHtWifiRemoteStation* station);
 
     /**
      * Printing Sample Table.
      *
-     * \param station the Minstrel-HT wifi remote station
+     * @param station the Minstrel-HT wifi remote station
      */
     void PrintSampleTable(MinstrelHtWifiRemoteStation* station);
 
     /**
      * Printing Minstrel Table.
      *
-     * \param station the Minstrel-HT wifi remote station
+     * @param station the Minstrel-HT wifi remote station
      */
     void PrintTable(MinstrelHtWifiRemoteStation* station);
 
     /**
      * Print group statistics.
      *
-     * \param station the Minstrel-HT wifi remote station
-     * \param groupId the group ID
-     * \param of the output file stream
+     * @param station the Minstrel-HT wifi remote station
+     * @param groupId the group ID
+     * @param of the output file stream
      */
-    void StatsDump(MinstrelHtWifiRemoteStation* station, uint8_t groupId, std::ofstream& of);
+    void StatsDump(MinstrelHtWifiRemoteStation* station, std::size_t groupId, std::ofstream& of);
 
     /**
      * Check for initializations.
      *
-     * \param station the Minstrel-HT wifi remote station
+     * @param station the Minstrel-HT wifi remote station
      */
     void CheckInit(MinstrelHtWifiRemoteStation* station);
 
     /**
      * Count retries.
      *
-     * \param station the Minstrel-HT wifi remote station
-     * \returns the count of retries
+     * @param station the Minstrel-HT wifi remote station
+     * @returns the count of retries
      */
     uint32_t CountRetries(MinstrelHtWifiRemoteStation* station);
 
     /**
      * Update rate.
      *
-     * \param station the Minstrel-HT wifi remote station
+     * @param station the Minstrel-HT wifi remote station
      */
     void UpdateRate(MinstrelHtWifiRemoteStation* station);
 
     /**
      * Return the rateId inside a group, from the global index.
      *
-     * \param index the index
-     * \returns the rate ID
+     * @param index the index
+     * @returns the rate ID
      */
     uint8_t GetRateId(uint16_t index);
 
     /**
      * Return the groupId from the global index.
      *
-     * \param index the index
-     * \returns the group ID
+     * @param index the index
+     * @returns the group ID
      */
-    uint8_t GetGroupId(uint16_t index);
+    std::size_t GetGroupId(uint16_t index);
 
     /**
      * Returns the global index corresponding to the groupId and rateId.
@@ -556,76 +570,103 @@
      * all rates in all groups is used.
      * The group order is fixed by BW -> SGI -> streams.
      *
-     * \param groupId the group ID
-     * \param rateId the rate ID
-     * \returns the index
+     * @param groupId the group ID
+     * @param rateId the rate ID
+     * @returns the index
      */
-    uint16_t GetIndex(uint8_t groupId, uint8_t rateId);
+    uint16_t GetIndex(std::size_t groupId, uint8_t rateId);
 
     /**
-     * Returns the groupId of an HT MCS with the given number of streams, GI and channel width used.
+     * Returns the Id of a MCS of a given modulation class with the given number of streams, GI and
+     * channel width used in the group associated to that modulation class.
      *
-     * \param txstreams the number of streams
-     * \param guardInterval guard interval duration
-     * \param chWidth the channel width
-     * \returns the HT group ID
+     * @param mc the modulation class
+     * @param streams the number of streams
+     * @param guardInterval guard interval duration
+     * @param chWidth the channel width
+     * @returns the HT group ID
      */
-    uint8_t GetHtGroupId(uint8_t txstreams, Time guardInterval, MHz_u chWidth);
+    std::size_t GetIdInGroup(WifiModulationClass mc,
+                             uint8_t streams,
+                             Time guardInterval,
+                             MHz_u chWidth);
 
     /**
-     * Returns the groupId of a VHT MCS with the given number of streams, GI and channel width used.
+     * Returns the number of groups for a given modulation class.
      *
-     * \param txstreams the number of streams
-     * \param guardInterval guard interval duration
-     * \param chWidth the channel width
-     * \returns the VHT group ID
+     * @param mc the modulation class
+     * @returns the number of groups for the modulation class
      */
-    uint8_t GetVhtGroupId(uint8_t txstreams, Time guardInterval, MHz_u chWidth);
+    std::size_t GetNumGroups(WifiModulationClass mc);
 
     /**
-     * Returns the groupId of an HE MCS with the given number of streams, GI and channel width used.
+     * Returns the groupId of an HT MCS with the given number of streams, GI and channel width used.
      *
-     * \param txstreams the number of streams
-     * \param guardInterval guard interval duration
-     * \param chWidth the channel width
-     * \returns the HE group ID
+     * @param streams the number of streams
+     * @param guardInterval guard interval duration
+     * @param chWidth the channel width
+     * @returns the HT group ID
      */
-    uint8_t GetHeGroupId(uint8_t txstreams, Time guardInterval, MHz_u chWidth);
+    std::size_t GetHtGroupId(uint8_t streams, Time guardInterval, MHz_u chWidth);
 
     /**
-     * Returns the lowest global index of the rates supported by the station.
+     * Returns the groupId of a VHT MCS with the given number of streams, GI and channel width used.
      *
-     * \param station the Minstrel-HT wifi remote station
-     * \returns the lowest global index
+     * @param streams the number of streams
+     * @param guardInterval guard interval duration
+     * @param chWidth the channel width
+     * @returns the VHT group ID
      */
-    uint16_t GetLowestIndex(MinstrelHtWifiRemoteStation* station);
+    std::size_t GetVhtGroupId(uint8_t streams, Time guardInterval, MHz_u chWidth);
 
     /**
-     * Returns the lowest global index of the rates supported by in the group.
+     * Returns the groupId of an HE MCS with the given number of streams, GI and channel width used.
      *
-     * \param station the Minstrel-HT wifi remote station
-     * \param groupId the group ID
-     * \returns the lowest global index
-     */
-    uint16_t GetLowestIndex(MinstrelHtWifiRemoteStation* station, uint8_t groupId);
+     * @param streams the number of streams
+     * @param guardInterval guard interval duration
+     * @param chWidth the channel width
+     * @returns the HE group ID
+     */
+    std::size_t GetHeGroupId(uint8_t streams, Time guardInterval, MHz_u chWidth);
+
+    /**
+     * Returns the group ID of an MCS of a given group type with the given number of streams, GI and
+     * channel width used.
+     *
+     * @param type the MCS group type
+     * @param streams the number of streams
+     * @param guardInterval guard interval duration
+     * @param chWidth the channel width
+     * @returns the group ID
+     */
+    std::size_t GetGroupIdForType(McsGroupType type,
+                                  uint8_t streams,
+                                  Time guardInterval,
+                                  MHz_u chWidth);
 
     /**
-     * Returns a list of only the HE MCS supported by the device.
-     * \returns the list of the HE MCS supported
+     * Returns the lowest global index of the rates supported by the station.
+     *
+     * @param station the Minstrel-HT wifi remote station
+     * @returns the lowest global index
      */
-    WifiModeList GetHeDeviceMcsList() const;
+    uint16_t GetLowestIndex(MinstrelHtWifiRemoteStation* station);
 
     /**
-     * Returns a list of only the VHT MCS supported by the device.
-     * \returns the list of the VHT MCS supported
+     * Returns the lowest global index of the rates supported by in the group.
+     *
+     * @param station the Minstrel-HT wifi remote station
+     * @param groupId the group ID
+     * @returns the lowest global index
      */
-    WifiModeList GetVhtDeviceMcsList() const;
+    uint16_t GetLowestIndex(MinstrelHtWifiRemoteStation* station, std::size_t groupId);
 
     /**
-     * Returns a list of only the HT MCS supported by the device.
-     * \returns the list of the HT MCS supported
+     * Returns a list of only the MCS supported by the device for a given modulation class.
+     * @param mc the modulation class
+     * @returns the list of the MCS supported for that modulation class
      */
-    WifiModeList GetHtDeviceMcsList() const;
+    WifiModeList GetDeviceMcsList(WifiModulationClass mc) const;
 
     /**
      * Given the index of the current TX rate, check whether the channel width is
@@ -636,9 +677,9 @@
      * group with the same MCS as the given TX rate. If no supported MCS group is
      * found, the simulation aborts.
      *
-     * \param txRate the index of the current TX rate
-     * \param allowedWidth the allowed width
-     * \return the index of a TX rate whose channel width is not greater than the
+     * @param txRate the index of the current TX rate
+     * @param allowedWidth the allowed width
+     * @return the index of a TX rate whose channel width is not greater than the
      *         allowed width, if found (otherwise, the simulation aborts)
      */
     uint16_t UpdateRateAfterAllowedWidth(uint16_t txRate, MHz_u allowedWidth);
@@ -650,7 +691,7 @@
     uint8_t m_ewmaLevel;           //!< Exponential weighted moving average level (or coefficient).
     uint8_t m_nSampleCol;          //!< Number of sample columns.
     uint32_t m_frameLength;        //!< Frame length used to calculate modes TxTime in bytes.
-    uint8_t m_numGroups;           //!< Number of groups Minstrel should consider.
+    std::size_t m_numGroups;       //!< Number of groups Minstrel should consider.
     uint8_t m_numRates;            //!< Number of rates per group Minstrel should consider.
     bool m_useLatestAmendmentOnly; //!< Flag if only the latest supported amendment by both peers
                                    //!< should be used.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/rate-control/minstrel-wifi-manager.cc ns-3.44/src/wifi/model/rate-control/minstrel-wifi-manager.cc
--- ns-3.43/src/wifi/model/rate-control/minstrel-wifi-manager.cc	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/rate-control/minstrel-wifi-manager.cc	2025-03-09 16:55:49.795372700 -0700
@@ -25,8 +25,10 @@
 #include "ns3/simulator.h"
 #include "ns3/wifi-mac.h"
 #include "ns3/wifi-phy.h"
+#include "ns3/wifi-psdu.h"
 
 #include <iomanip>
+#include <limits>
 
 #define Min(a, b) ((a < b) ? a : b)
 
@@ -109,7 +111,7 @@
         WifiTxVector txVector;
         txVector.SetMode(mode);
         txVector.SetPreambleType(WIFI_PREAMBLE_LONG);
-        AddCalcTxTime(mode, phy->CalculateTxDuration(m_pktLen, txVector, phy->GetPhyBand()));
+        AddCalcTxTime(mode, WifiPhy::CalculateTxDuration(m_pktLen, txVector, phy->GetPhyBand()));
     }
     WifiRemoteStationManager::SetupPhy(phy);
 }
@@ -375,9 +377,9 @@
 {
     NS_LOG_FUNCTION(this << station);
     auto channelWidth = GetChannelWidth(station);
-    if (channelWidth > 20 && channelWidth != 22)
+    if (channelWidth > MHz_u{20} && channelWidth != MHz_u{22})
     {
-        channelWidth = 20;
+        channelWidth = MHz_u{20};
     }
     if (!station->m_initialized)
     {
@@ -408,9 +410,9 @@
     NS_LOG_FUNCTION(this << station);
     NS_LOG_DEBUG("DoGetRtsMode m_txrate=" << station->m_txrate);
     auto channelWidth = GetChannelWidth(station);
-    if (channelWidth > 20 && channelWidth != 22)
+    if (channelWidth > MHz_u{20} && channelWidth != MHz_u{22})
     {
-        channelWidth = 20;
+        channelWidth = MHz_u{20};
     }
     WifiMode mode;
     if (!GetUseNonErpProtection())
@@ -936,6 +938,27 @@
     return GetRtsTxVector(station);
 }
 
+std::list<Ptr<WifiMpdu>>
+MinstrelWifiManager::DoGetMpdusToDropOnTxFailure(WifiRemoteStation* station, Ptr<WifiPsdu> psdu)
+{
+    NS_LOG_FUNCTION(this << *psdu);
+
+    std::list<Ptr<WifiMpdu>> mpdusToDrop;
+
+    for (const auto& mpdu : *PeekPointer(psdu))
+    {
+        if (!DoNeedRetransmission(station,
+                                  mpdu->GetPacket(),
+                                  (mpdu->GetRetryCount() < GetMac()->GetFrameRetryLimit())))
+        {
+            // this MPDU needs to be dropped
+            mpdusToDrop.push_back(mpdu);
+        }
+    }
+
+    return mpdusToDrop;
+}
+
 bool
 MinstrelWifiManager::DoNeedRetransmission(WifiRemoteStation* st,
                                           Ptr<const Packet> packet,
@@ -1009,7 +1032,7 @@
         // Emulating minstrel.c::ath_rate_ctl_reset
         // We only check from 2 to 10 retries. This guarantee that
         // at least one retry is permitted.
-        Time totalTxTimeWithGivenRetries = Seconds(0.0); // tx_time in minstrel.c
+        Time totalTxTimeWithGivenRetries; // tx_time in minstrel.c
         NS_LOG_DEBUG(" Calculating the number of retries");
         for (uint32_t retries = 2; retries < 11; retries++)
         {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/rate-control/minstrel-wifi-manager.h ns-3.44/src/wifi/model/rate-control/minstrel-wifi-manager.h
--- ns-3.43/src/wifi/model/rate-control/minstrel-wifi-manager.h	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/rate-control/minstrel-wifi-manager.h	2025-03-09 16:55:49.795372700 -0700
@@ -65,7 +65,7 @@
 typedef std::vector<std::vector<uint8_t>> SampleRate;
 
 /**
- * \brief hold per-remote-station state for Minstrel Wifi manager.
+ * @brief hold per-remote-station state for Minstrel Wifi manager.
  *
  * This struct extends from WifiRemoteStation struct to hold additional
  * information required by the Minstrel Wifi manager
@@ -103,8 +103,8 @@
 };
 
 /**
- * \brief Implementation of Minstrel Rate Control Algorithm
- * \ingroup wifi
+ * @brief Implementation of Minstrel Rate Control Algorithm
+ * @ingroup wifi
  *
  * Minstrel is a rate control algorithm implemented in MadWifi and Linux.
  * The basic principle is to probe the environment and adapt the rate
@@ -147,8 +147,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     MinstrelWifiManager();
@@ -161,74 +161,74 @@
     /**
      * Update the rate.
      *
-     * \param station the station object
+     * @param station the station object
      */
     void UpdateRate(MinstrelWifiRemoteStation* station);
 
     /**
      * Update the Minstrel Table.
      *
-     * \param station the station object
+     * @param station the station object
      */
     void UpdateStats(MinstrelWifiRemoteStation* station);
 
     /**
      * Find a rate to use from Minstrel Table.
      *
-     * \param station the station object
-     * \returns the rate in bps
+     * @param station the station object
+     * @returns the rate in bps
      */
     uint16_t FindRate(MinstrelWifiRemoteStation* station);
 
     /**
      * Get data transmit vector.
      *
-     * \param station the station object
-     * \returns WifiTxVector
+     * @param station the station object
+     * @returns WifiTxVector
      */
     WifiTxVector GetDataTxVector(MinstrelWifiRemoteStation* station);
 
     /**
      * Get RTS transmit vector.
      *
-     * \param station the station object
-     * \returns WifiTxVector
+     * @param station the station object
+     * @returns WifiTxVector
      */
     WifiTxVector GetRtsTxVector(MinstrelWifiRemoteStation* station);
 
     /**
      * Get the number of retries.
      *
-     * \param station the station object
-     * \returns the number of retries
+     * @param station the station object
+     * @returns the number of retries
      */
     uint32_t CountRetries(MinstrelWifiRemoteStation* station);
 
     /**
      * Update packet counters.
      *
-     * \param station the station object
+     * @param station the station object
      */
     void UpdatePacketCounters(MinstrelWifiRemoteStation* station);
 
     /**
      * Update the number of retries and reset accordingly.
      *
-     * \param station the station object
+     * @param station the station object
      */
     void UpdateRetry(MinstrelWifiRemoteStation* station);
 
     /**
      * Check for initializations.
      *
-     * \param station the station object
+     * @param station the station object
      */
     void CheckInit(MinstrelWifiRemoteStation* station);
 
     /**
      * Initialize Sample Table.
      *
-     * \param station the station object
+     * @param station the station object
      */
     void InitSampleTable(MinstrelWifiRemoteStation* station);
 
@@ -252,38 +252,49 @@
     void DoReportFinalDataFailed(WifiRemoteStation* station) override;
     WifiTxVector DoGetDataTxVector(WifiRemoteStation* station, MHz_u allowedWidth) override;
     WifiTxVector DoGetRtsTxVector(WifiRemoteStation* station) override;
+    std::list<Ptr<WifiMpdu>> DoGetMpdusToDropOnTxFailure(WifiRemoteStation* station,
+                                                         Ptr<WifiPsdu> psdu) override;
 
-    bool DoNeedRetransmission(WifiRemoteStation* st,
-                              Ptr<const Packet> packet,
-                              bool normally) override;
+    /**
+     * @param st the station that we need to communicate
+     * @param packet the packet to send
+     * @param normally indicates whether the normal 802.11 data retransmission mechanism
+     *        would request that the data is retransmitted or not.
+     * @return true if we want to resend a packet after a failed transmission attempt,
+     *         false otherwise.
+     *
+     * Note: This method is called after any unicast packet transmission (control, management,
+     *       or data) has been attempted and has failed.
+     */
+    bool DoNeedRetransmission(WifiRemoteStation* st, Ptr<const Packet> packet, bool normally);
 
     /**
      * Estimate the TxTime of a packet with a given mode.
      *
-     * \param mode Wi-Fi mode
-     * \returns the transmission time
+     * @param mode Wi-Fi mode
+     * @returns the transmission time
      */
     Time GetCalcTxTime(WifiMode mode) const;
     /**
      * Add transmission time for the given mode to an internal list.
      *
-     * \param mode Wi-Fi mode
-     * \param t transmission time
+     * @param mode Wi-Fi mode
+     * @param t transmission time
      */
     void AddCalcTxTime(WifiMode mode, Time t);
 
     /**
      * Initialize Minstrel Table.
      *
-     * \param station the station object
+     * @param station the station object
      */
     void RateInit(MinstrelWifiRemoteStation* station);
 
     /**
      * Get the next sample from Sample Table.
      *
-     * \param station the station object
-     * \returns the next sample
+     * @param station the station object
+     * @returns the next sample
      */
     uint16_t GetNextSample(MinstrelWifiRemoteStation* station);
 
@@ -303,10 +314,10 @@
      *  - Data transmission
      *  - backoffs according to CW
      *
-     * \param dataTransmissionTime the data transmission time
-     * \param shortRetries short retries
-     * \param longRetries long retries
-     * \returns the unicast packet time
+     * @param dataTransmissionTime the data transmission time
+     * @param shortRetries short retries
+     * @param longRetries long retries
+     * @returns the unicast packet time
      */
     Time CalculateTimeUnicastPacket(Time dataTransmissionTime,
                                     uint32_t shortRetries,
@@ -315,14 +326,14 @@
     /**
      * Print Sample Table.
      *
-     * \param station the station object
+     * @param station the station object
      */
     void PrintSampleTable(MinstrelWifiRemoteStation* station) const;
 
     /**
      * Print Minstrel Table.
      *
-     * \param station the station object
+     * @param station the station object
      */
     void PrintTable(MinstrelWifiRemoteStation* station);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/rate-control/onoe-wifi-manager.cc ns-3.44/src/wifi/model/rate-control/onoe-wifi-manager.cc
--- ns-3.43/src/wifi/model/rate-control/onoe-wifi-manager.cc	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/rate-control/onoe-wifi-manager.cc	2025-03-09 16:55:49.799372700 -0700
@@ -20,7 +20,7 @@
 NS_LOG_COMPONENT_DEFINE("OnoeWifiManager");
 
 /**
- * \brief hold per-remote-station state for ONOE Wifi manager.
+ * @brief hold per-remote-station state for ONOE Wifi manager.
  *
  * This struct extends from WifiRemoteStation struct to hold additional
  * information required by the ONOE Wifi manager
@@ -50,7 +50,7 @@
             .AddConstructor<OnoeWifiManager>()
             .AddAttribute("UpdatePeriod",
                           "The interval between decisions about rate control changes",
-                          TimeValue(Seconds(1.0)),
+                          TimeValue(Seconds(1)),
                           MakeTimeAccessor(&OnoeWifiManager::m_updatePeriod),
                           MakeTimeChecker())
             .AddAttribute("RaiseThreshold",
@@ -324,9 +324,9 @@
         }
     }
     auto channelWidth = GetChannelWidth(station);
-    if (channelWidth > 20 && channelWidth != 22)
+    if (channelWidth > MHz_u{20} && channelWidth != MHz_u{22})
     {
-        channelWidth = 20;
+        channelWidth = MHz_u{20};
     }
     WifiMode mode = GetSupported(station, rateIndex);
     uint64_t rate = mode.GetDataRate(channelWidth);
@@ -353,9 +353,9 @@
     NS_LOG_FUNCTION(this << st);
     auto station = static_cast<OnoeWifiRemoteStation*>(st);
     auto channelWidth = GetChannelWidth(station);
-    if (channelWidth > 20 && channelWidth != 22)
+    if (channelWidth > MHz_u{20} && channelWidth != MHz_u{22})
     {
-        channelWidth = 20;
+        channelWidth = MHz_u{20};
     }
     UpdateMode(station);
     WifiMode mode;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/rate-control/onoe-wifi-manager.h ns-3.44/src/wifi/model/rate-control/onoe-wifi-manager.h
--- ns-3.43/src/wifi/model/rate-control/onoe-wifi-manager.h	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/rate-control/onoe-wifi-manager.h	2025-03-09 16:55:49.799372700 -0700
@@ -18,10 +18,10 @@
 struct OnoeWifiRemoteStation;
 
 /**
- * \brief an implementation of the rate control algorithm developed
+ * @brief an implementation of the rate control algorithm developed
  *        by Atsushi Onoe
  *
- * \ingroup wifi
+ * @ingroup wifi
  *
  * This algorithm is well known because it has been used as the default
  * rate control algorithm for the madwifi driver. I am not aware of
@@ -36,8 +36,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     OnoeWifiManager();
@@ -67,13 +67,13 @@
     /**
      * Update the number of retry (both short and long).
      *
-     * \param station the ONOE wifi remote station
+     * @param station the ONOE wifi remote station
      */
     void UpdateRetry(OnoeWifiRemoteStation* station);
     /**
      * Update the mode.
      *
-     * \param station the ONOE wifi remote station
+     * @param station the ONOE wifi remote station
      */
     void UpdateMode(OnoeWifiRemoteStation* station);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/rate-control/parf-wifi-manager.cc ns-3.44/src/wifi/model/rate-control/parf-wifi-manager.cc
--- ns-3.43/src/wifi/model/rate-control/parf-wifi-manager.cc	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/rate-control/parf-wifi-manager.cc	2025-03-09 16:55:49.799372700 -0700
@@ -314,9 +314,9 @@
     NS_LOG_FUNCTION(this << st << allowedWidth);
     auto station = static_cast<ParfWifiRemoteStation*>(st);
     auto channelWidth = GetChannelWidth(station);
-    if (channelWidth > 20 && channelWidth != 22)
+    if (channelWidth > MHz_u{20} && channelWidth != MHz_u{22})
     {
-        channelWidth = 20;
+        channelWidth = MHz_u{20};
     }
     CheckInit(station);
     WifiMode mode = GetSupported(station, station->m_rateIndex);
@@ -350,13 +350,13 @@
 ParfWifiManager::DoGetRtsTxVector(WifiRemoteStation* st)
 {
     NS_LOG_FUNCTION(this << st);
-    /// \todo we could/should implement the ARF algorithm for
+    /// @todo we could/should implement the ARF algorithm for
     /// RTS only by picking a single rate within the BasicRateSet.
     auto station = static_cast<ParfWifiRemoteStation*>(st);
     auto channelWidth = GetChannelWidth(station);
-    if (channelWidth > 20 && channelWidth != 22)
+    if (channelWidth > MHz_u{20} && channelWidth != MHz_u{22})
     {
-        channelWidth = 20;
+        channelWidth = MHz_u{20};
     }
     WifiMode mode;
     if (!GetUseNonErpProtection())
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/rate-control/parf-wifi-manager.h ns-3.44/src/wifi/model/rate-control/parf-wifi-manager.h
--- ns-3.43/src/wifi/model/rate-control/parf-wifi-manager.h	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/rate-control/parf-wifi-manager.h	2025-03-09 16:55:49.799372700 -0700
@@ -17,7 +17,7 @@
 struct ParfWifiRemoteStation;
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * PARF Rate control algorithm
  *
  * This class implements the PARF algorithm as described in
@@ -35,7 +35,7 @@
   public:
     /**
      * Register this type.
-     * \return The object TypeId.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
     ParfWifiManager();
@@ -66,7 +66,7 @@
 
     /** Check for initializations.
      *
-     * \param station The remote station.
+     * @param station The remote station.
      */
     void CheckInit(ParfWifiRemoteStation* station);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/rate-control/rraa-wifi-manager.cc ns-3.44/src/wifi/model/rate-control/rraa-wifi-manager.cc
--- ns-3.43/src/wifi/model/rate-control/rraa-wifi-manager.cc	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/rate-control/rraa-wifi-manager.cc	2025-03-09 16:55:49.799372700 -0700
@@ -22,7 +22,7 @@
 NS_LOG_COMPONENT_DEFINE("RraaWifiManager");
 
 /**
- * \brief hold per-remote-station state for RRAA Wifi manager.
+ * @brief hold per-remote-station state for RRAA Wifi manager.
  *
  * This struct extends from WifiRemoteStation struct to hold additional
  * information required by the RRAA Wifi manager
@@ -120,8 +120,8 @@
         txVector.SetMode(mode);
         txVector.SetPreambleType(WIFI_PREAMBLE_LONG);
         /* Calculate the TX Time of the Data and the corresponding Ack */
-        Time dataTxTime = phy->CalculateTxDuration(m_frameLength, txVector, phy->GetPhyBand());
-        Time ackTxTime = phy->CalculateTxDuration(m_ackLength, txVector, phy->GetPhyBand());
+        Time dataTxTime = WifiPhy::CalculateTxDuration(m_frameLength, txVector, phy->GetPhyBand());
+        Time ackTxTime = WifiPhy::CalculateTxDuration(m_ackLength, txVector, phy->GetPhyBand());
         NS_LOG_DEBUG("Calculating TX times: Mode= " << mode << " DataTxTime= " << dataTxTime
                                                     << " AckTxTime= " << ackTxTime);
         AddCalcTxTime(mode, dataTxTime + ackTxTime);
@@ -347,9 +347,9 @@
     NS_LOG_FUNCTION(this << st << allowedWidth);
     auto station = static_cast<RraaWifiRemoteStation*>(st);
     auto channelWidth = GetChannelWidth(station);
-    if (channelWidth > 20 && channelWidth != 22)
+    if (channelWidth > MHz_u{20} && channelWidth != MHz_u{22})
     {
-        channelWidth = 20;
+        channelWidth = MHz_u{20};
     }
     CheckInit(station);
     WifiMode mode = GetSupported(station, station->m_rateIndex);
@@ -377,9 +377,9 @@
     NS_LOG_FUNCTION(this << st);
     auto station = static_cast<RraaWifiRemoteStation*>(st);
     auto channelWidth = GetChannelWidth(station);
-    if (channelWidth > 20 && channelWidth != 22)
+    if (channelWidth > MHz_u{20} && channelWidth != MHz_u{22})
     {
-        channelWidth = 20;
+        channelWidth = MHz_u{20};
     }
     WifiMode mode;
     if (!GetUseNonErpProtection())
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/rate-control/rraa-wifi-manager.h ns-3.44/src/wifi/model/rate-control/rraa-wifi-manager.h
--- ns-3.43/src/wifi/model/rate-control/rraa-wifi-manager.h	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/rate-control/rraa-wifi-manager.h	2025-03-09 16:55:49.799372700 -0700
@@ -32,8 +32,8 @@
 typedef std::vector<std::pair<WifiRraaThresholds, WifiMode>> RraaThresholdsTable;
 
 /**
- * \brief Robust Rate Adaptation Algorithm
- * \ingroup wifi
+ * @brief Robust Rate Adaptation Algorithm
+ * @ingroup wifi
  *
  * This is an implementation of RRAA as described in
  * "Robust rate adaptation for 802.11 wireless networks"
@@ -48,8 +48,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -83,80 +83,80 @@
 
     /**
      * Check for initializations.
-     * \param station The remote station.
+     * @param station The remote station.
      */
     void CheckInit(RraaWifiRemoteStation* station);
     /**
      * Return the index for the maximum transmission rate for
      * the given station.
      *
-     * \param station the remote station
+     * @param station the remote station
      *
-     * \return the index for the maximum transmission rate
+     * @return the index for the maximum transmission rate
      */
     uint8_t GetMaxRate(RraaWifiRemoteStation* station) const;
     /**
      * Check if the counter should be reset.
      *
-     * \param station the remote station
+     * @param station the remote station
      */
     void CheckTimeout(RraaWifiRemoteStation* station);
     /**
      * Find an appropriate rate for the given station, using
      * a basic algorithm.
      *
-     * \param station the remote station
+     * @param station the remote station
      */
     void RunBasicAlgorithm(RraaWifiRemoteStation* station);
     /**
      * Activate the use of RTS for the given station if the conditions are met.
      *
-     * \param station the remote station
+     * @param station the remote station
      */
     void ARts(RraaWifiRemoteStation* station);
     /**
      * Reset the counters of the given station.
      *
-     * \param station the remote station
+     * @param station the remote station
      */
     void ResetCountersBasic(RraaWifiRemoteStation* station);
     /**
      * Initialize the thresholds internal list for the given station.
      *
-     * \param station the remote station
+     * @param station the remote station
      */
     void InitThresholds(RraaWifiRemoteStation* station);
     /**
      * Get the thresholds for the given station and mode.
      *
-     * \param station the remote station
-     * \param mode the WifiMode
+     * @param station the remote station
+     * @param mode the WifiMode
      *
-     * \return the RRAA thresholds
+     * @return the RRAA thresholds
      */
     WifiRraaThresholds GetThresholds(RraaWifiRemoteStation* station, WifiMode mode) const;
     /**
      * Get the thresholds for the given station and mode index.
      *
-     * \param station the remote station
-     * \param index the mode index in the supported rates
+     * @param station the remote station
+     * @param index the mode index in the supported rates
      *
-     * \return the RRAA thresholds
+     * @return the RRAA thresholds
      */
     WifiRraaThresholds GetThresholds(RraaWifiRemoteStation* station, uint8_t index) const;
     /**
      * Get the estimated TxTime of a packet with a given mode.
      *
-     * \param mode the WifiMode
+     * @param mode the WifiMode
      *
-     * \return the estimated TX time
+     * @return the estimated TX time
      */
     Time GetCalcTxTime(WifiMode mode) const;
     /**
      * Add transmission time for the given mode to an internal list.
      *
-     * \param mode the WifiMode
-     * \param t transmission time
+     * @param mode the WifiMode
+     * @param t transmission time
      */
     void AddCalcTxTime(WifiMode mode, Time t);
     /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/rate-control/rrpaa-wifi-manager.cc ns-3.44/src/wifi/model/rate-control/rrpaa-wifi-manager.cc
--- ns-3.43/src/wifi/model/rate-control/rrpaa-wifi-manager.cc	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/rate-control/rrpaa-wifi-manager.cc	2025-03-09 16:55:49.799372700 -0700
@@ -149,8 +149,8 @@
         txVector.SetMode(mode);
         txVector.SetPreambleType(WIFI_PREAMBLE_LONG);
         /* Calculate the TX Time of the Data and the corresponding Ack */
-        Time dataTxTime = phy->CalculateTxDuration(m_frameLength, txVector, phy->GetPhyBand());
-        Time ackTxTime = phy->CalculateTxDuration(m_ackLength, txVector, phy->GetPhyBand());
+        Time dataTxTime = WifiPhy::CalculateTxDuration(m_frameLength, txVector, phy->GetPhyBand());
+        Time ackTxTime = WifiPhy::CalculateTxDuration(m_ackLength, txVector, phy->GetPhyBand());
         NS_LOG_DEBUG("Calculating TX times: Mode= " << mode << " DataTxTime= " << dataTxTime
                                                     << " AckTxTime= " << ackTxTime);
         AddCalcTxTime(mode, dataTxTime + ackTxTime);
@@ -391,9 +391,9 @@
     NS_LOG_FUNCTION(this << st << allowedWidth);
     auto station = static_cast<RrpaaWifiRemoteStation*>(st);
     auto channelWidth = GetChannelWidth(station);
-    if (channelWidth > 20 && channelWidth != 22)
+    if (channelWidth > MHz_u{20} && channelWidth != MHz_u{22})
     {
-        channelWidth = 20;
+        channelWidth = MHz_u{20};
     }
     CheckInit(station);
     WifiMode mode = GetSupported(station, station->m_rateIndex);
@@ -429,9 +429,9 @@
     NS_LOG_FUNCTION(this << st);
     auto station = static_cast<RrpaaWifiRemoteStation*>(st);
     auto channelWidth = GetChannelWidth(station);
-    if (channelWidth > 20 && channelWidth != 22)
+    if (channelWidth > MHz_u{20} && channelWidth != MHz_u{22})
     {
-        channelWidth = 20;
+        channelWidth = MHz_u{20};
     }
     WifiMode mode;
     if (!GetUseNonErpProtection())
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/rate-control/rrpaa-wifi-manager.h ns-3.44/src/wifi/model/rate-control/rrpaa-wifi-manager.h
--- ns-3.43/src/wifi/model/rate-control/rrpaa-wifi-manager.h	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/rate-control/rrpaa-wifi-manager.h	2025-03-09 16:55:49.799372700 -0700
@@ -19,7 +19,7 @@
 struct RrpaaWifiRemoteStation;
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * Robust Rate and Power Adaptation Algorithm
  *
  * This class implements the RRPAA algorithm as described in <i>Rate, Power and Carrier-Sense
@@ -65,7 +65,7 @@
   public:
     /**
      * Register this type.
-     * \return The object TypeId.
+     * @return The object TypeId.
      */
     static TypeId GetTypeId();
     RrpaaWifiManager();
@@ -79,9 +79,9 @@
      * used by this model.  Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream first stream index to use
+     * @param stream first stream index to use
      *
-     * \return the number of stream indices assigned by this model
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream) override;
 
@@ -109,77 +109,77 @@
 
     /**
      * Check for initializations.
-     * \param station the remote station.
+     * @param station the remote station.
      */
     void CheckInit(RrpaaWifiRemoteStation* station);
 
     /**
      * Check if the counter should be reset.
      *
-     * \param station the remote station
+     * @param station the remote station
      */
     void CheckTimeout(RrpaaWifiRemoteStation* station);
     /**
      * Find an appropriate rate and power for the given station, using
      * a basic algorithm.
      *
-     * \param station the remote station
+     * @param station the remote station
      */
     void RunBasicAlgorithm(RrpaaWifiRemoteStation* station);
     /**
      * Run an enhanced algorithm which activates the use of RTS
      * for the given station if the conditions are met.
      *
-     * \param station the remote station
+     * @param station the remote station
      */
     void RunAdaptiveRtsAlgorithm(RrpaaWifiRemoteStation* station);
     /**
      * Reset the counters of the given station.
      *
-     * \param station the remote station
+     * @param station the remote station
      */
     void ResetCountersBasic(RrpaaWifiRemoteStation* station);
 
     /**
      * Initialize the thresholds internal list for the given station.
      *
-     * \param station the remote station
+     * @param station the remote station
      */
     void InitThresholds(RrpaaWifiRemoteStation* station);
 
     /**
      * Get the thresholds for the given station and mode.
      *
-     * \param station the remote station
-     * \param mode the WifiMode
+     * @param station the remote station
+     * @param mode the WifiMode
      *
-     * \return the RRPAA thresholds
+     * @return the RRPAA thresholds
      */
     WifiRrpaaThresholds GetThresholds(RrpaaWifiRemoteStation* station, WifiMode mode) const;
 
     /**
      * Get the thresholds for the given station and mode index.
      *
-     * \param station the remote station
-     * \param index the mode index in the supported rates
+     * @param station the remote station
+     * @param index the mode index in the supported rates
      *
-     * \return the RRPAA thresholds
+     * @return the RRPAA thresholds
      */
     WifiRrpaaThresholds GetThresholds(RrpaaWifiRemoteStation* station, uint8_t index) const;
 
     /**
      * Get the estimated TxTime of a packet with a given mode.
      *
-     * \param mode the WifiMode
+     * @param mode the WifiMode
      *
-     * \return the estimated TX time
+     * @return the estimated TX time
      */
     Time GetCalcTxTime(WifiMode mode) const;
     /**
      * Add transmission time for the given mode to an internal list.
      *
-     * \param mode the WifiMode
-     * \param t transmission time
+     * @param mode the WifiMode
+     * @param t transmission time
      */
     void AddCalcTxTime(WifiMode mode, Time t);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/rate-control/thompson-sampling-wifi-manager.cc ns-3.44/src/wifi/model/rate-control/thompson-sampling-wifi-manager.cc
--- ns-3.43/src/wifi/model/rate-control/thompson-sampling-wifi-manager.cc	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/rate-control/thompson-sampling-wifi-manager.cc	2025-03-09 16:55:49.799372700 -0700
@@ -112,7 +112,7 @@
     // Add HT, VHT or HE MCSes
     for (const auto& mode : GetPhy()->GetMcsList())
     {
-        for (MHz_u j = 20; j <= GetPhy()->GetChannelWidth(); j *= 2)
+        for (MHz_u j{20}; j <= GetPhy()->GetChannelWidth(); j *= 2)
         {
             WifiModulationClass modulationClass = WIFI_MOD_CLASS_HT;
             if (GetVhtSupported())
@@ -151,11 +151,11 @@
             if (stats.mode.GetModulationClass() == WIFI_MOD_CLASS_DSSS ||
                 stats.mode.GetModulationClass() == WIFI_MOD_CLASS_HR_DSSS)
             {
-                stats.channelWidth = 22;
+                stats.channelWidth = MHz_u{22};
             }
             else
             {
-                stats.channelWidth = 20;
+                stats.channelWidth = MHz_u{20};
             }
             stats.nss = 1;
             station->m_mcsStats.push_back(stats);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/rate-control/thompson-sampling-wifi-manager.h ns-3.44/src/wifi/model/rate-control/thompson-sampling-wifi-manager.h
--- ns-3.43/src/wifi/model/rate-control/thompson-sampling-wifi-manager.h	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/rate-control/thompson-sampling-wifi-manager.h	2025-03-09 16:55:49.799372700 -0700
@@ -17,8 +17,8 @@
 {
 
 /**
- * \brief Thompson Sampling rate control algorithm
- * \ingroup wifi
+ * @brief Thompson Sampling rate control algorithm
+ * @ingroup wifi
  *
  * This class implements Thompson Sampling rate control algorithm.
  *
@@ -29,8 +29,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     ThompsonSamplingWifiManager();
@@ -69,7 +69,7 @@
      * Initializes station rate tables. If station is already initialized,
      * nothing is done.
      *
-     * \param station Station which should be initialized.
+     * @param station Station which should be initialized.
      */
     void InitializeStation(WifiRemoteStation* station) const;
 
@@ -82,32 +82,32 @@
      * to tell which mode was used for succeeded/failed frame when
      * feedback is received.
      *
-     * \param station Station for which a new mode should be drawn.
+     * @param station Station for which a new mode should be drawn.
      */
     void UpdateNextMode(WifiRemoteStation* station) const;
 
     /**
      * Applies exponential decay to MCS statistics.
      *
-     * \param st Remote STA for which MCS statistics is to be updated.
-     * \param i MCS index.
+     * @param st Remote STA for which MCS statistics is to be updated.
+     * @param i MCS index.
      */
     void Decay(WifiRemoteStation* st, size_t i) const;
 
     /**
      * Returns guard interval for the given mode.
      *
-     * \param st Remote STA
-     * \param mode The WifiMode
-     * \return the guard interval
+     * @param st Remote STA
+     * @param mode The WifiMode
+     * @return the guard interval
      */
     Time GetModeGuardInterval(WifiRemoteStation* st, WifiMode mode) const;
 
     /**
      * Sample beta random variable with given parameters
-     * \param alpha first parameter of beta distribution
-     * \param beta second parameter of beta distribution
-     * \return beta random variable sample
+     * @param alpha first parameter of beta distribution
+     * @param beta second parameter of beta distribution
+     * @return beta random variable sample
      */
     double SampleBetaVariable(uint64_t alpha, uint64_t beta) const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/recipient-block-ack-agreement.cc ns-3.44/src/wifi/model/recipient-block-ack-agreement.cc
--- ns-3.43/src/wifi/model/recipient-block-ack-agreement.cc	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/recipient-block-ack-agreement.cc	2025-03-09 16:55:49.799372700 -0700
@@ -159,8 +159,10 @@
         // MAC process in order of increasing Sequence Number subfield value. Gaps may
         // exist in the Sequence Number subfield values of the MSDUs or A-MSDUs that are
         // passed up to the next MAC process.
-        PassBufferedMpdusWithSeqNumberLessThan(mpdu->GetHeader().GetSequenceNumber() - m_winSizeB +
-                                               1);
+        const uint16_t newWinStartB =
+            (mpdu->GetHeader().GetSequenceNumber() - m_winSizeB + 1 + SEQNO_SPACE_SIZE) %
+            SEQNO_SPACE_SIZE;
+        PassBufferedMpdusWithSeqNumberLessThan(newWinStartB);
 
         // 5. Pass MSDUs or A-MSDUs stored in the buffer up to the next MAC process in
         // order of increasing value of the Sequence Number subfield starting with
@@ -218,20 +220,20 @@
 }
 
 void
-RecipientBlockAckAgreement::FillBlockAckBitmap(CtrlBAckResponseHeader* blockAckHeader,
+RecipientBlockAckAgreement::FillBlockAckBitmap(CtrlBAckResponseHeader& blockAckHeader,
                                                std::size_t index) const
 {
     NS_LOG_FUNCTION(this << blockAckHeader << index);
-    if (blockAckHeader->IsBasic())
+    if (blockAckHeader.IsBasic())
     {
         NS_FATAL_ERROR("Basic block ack is not supported.");
     }
-    else if (blockAckHeader->IsMultiTid())
+    else if (blockAckHeader.IsMultiTid())
     {
         NS_FATAL_ERROR("Multi-tid block ack is not supported.");
     }
-    else if (blockAckHeader->IsCompressed() || blockAckHeader->IsExtendedCompressed() ||
-             blockAckHeader->IsMultiSta())
+    else if (blockAckHeader.IsCompressed() || blockAckHeader.IsExtendedCompressed() ||
+             blockAckHeader.IsMultiSta() || blockAckHeader.IsGcr())
     {
         // The Starting Sequence Number subfield of the Block Ack Starting Sequence
         // Control subfield of the BlockAck frame shall be set to any value in the
@@ -239,14 +241,14 @@
         // We set it to WinStartR
         uint16_t ssn = m_scoreboard.GetWinStart();
         NS_LOG_DEBUG("SSN=" << ssn);
-        blockAckHeader->SetStartingSequence(ssn, index);
-        blockAckHeader->ResetBitmap(index);
+        blockAckHeader.SetStartingSequence(ssn, index);
+        blockAckHeader.ResetBitmap(index);
 
         for (std::size_t i = 0; i < m_scoreboard.GetWinSize(); i++)
         {
             if (m_scoreboard.At(i))
             {
-                blockAckHeader->SetReceivedPacket((ssn + i) % SEQNO_SPACE_SIZE, index);
+                blockAckHeader.SetReceivedPacket((ssn + i) % SEQNO_SPACE_SIZE, index);
             }
         }
     }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/recipient-block-ack-agreement.h ns-3.44/src/wifi/model/recipient-block-ack-agreement.h
--- ns-3.43/src/wifi/model/recipient-block-ack-agreement.h	2024-10-09 16:41:10.124656700 -0700
+++ ns-3.44/src/wifi/model/recipient-block-ack-agreement.h	2025-03-09 16:55:49.799372700 -0700
@@ -21,7 +21,7 @@
 class CtrlBAckResponseHeader;
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * Maintains the scoreboard and the receive reordering buffer used by a recipient
  * of a Block Ack agreement.
  */
@@ -31,13 +31,13 @@
     /**
      * Constructor
      *
-     * \param originator MAC address
-     * \param amsduSupported whether A-MSDU support is enabled
-     * \param tid Traffic ID
-     * \param bufferSize the buffer size (in number of MPDUs)
-     * \param timeout the timeout value
-     * \param startingSeq the starting sequence number
-     * \param htSupported whether HT support is enabled
+     * @param originator MAC address
+     * @param amsduSupported whether A-MSDU support is enabled
+     * @param tid Traffic ID
+     * @param bufferSize the buffer size (in number of MPDUs)
+     * @param timeout the timeout value
+     * @param startingSeq the starting sequence number
+     * @param htSupported whether HT support is enabled
      */
     RecipientBlockAckAgreement(Mac48Address originator,
                                bool amsduSupported,
@@ -51,7 +51,7 @@
     /**
      * Set the MAC RX Middle to use.
      *
-     * \param rxMiddle the MAC RX Middle to use
+     * @param rxMiddle the MAC RX Middle to use
      */
     void SetMacRxMiddle(const Ptr<MacRxMiddle> rxMiddle);
 
@@ -59,14 +59,14 @@
      * Update both the scoreboard and the receive reordering buffer upon reception
      * of the given MPDU.
      *
-     * \param mpdu the received MPDU
+     * @param mpdu the received MPDU
      */
     void NotifyReceivedMpdu(Ptr<const WifiMpdu> mpdu);
     /**
      * Update both the scoreboard and the receive reordering buffer upon reception
      * of a Block Ack Request.
      *
-     * \param startingSequenceNumber the starting sequence number included in the
+     * @param startingSequenceNumber the starting sequence number included in the
      *                               received Block Ack Request
      */
     void NotifyReceivedBar(uint16_t startingSequenceNumber);
@@ -76,10 +76,10 @@
      * For Multi-STA Block Acks, <i>index</i> identifies the Per AID TID Info
      * subfield whose bitmap has to be filled.
      *
-     * \param blockAckHeader the block ack header
-     * \param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
+     * @param blockAckHeader the block ack header
+     * @param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
      */
-    void FillBlockAckBitmap(CtrlBAckResponseHeader* blockAckHeader, std::size_t index = 0) const;
+    void FillBlockAckBitmap(CtrlBAckResponseHeader& blockAckHeader, std::size_t index = 0) const;
     /**
      * This is called when a Block Ack agreement is destroyed to flush the
      * received packets.
@@ -101,7 +101,7 @@
      * subfield values that are lower than the new value of WinStartB up to the next
      * MAC process in order of increasing Sequence Number subfield value.
      *
-     * \param newWinStartB the new value of WinStartB
+     * @param newWinStartB the new value of WinStartB
      */
     void PassBufferedMpdusWithSeqNumberLessThan(uint16_t newWinStartB);
 
@@ -114,9 +114,9 @@
         /**
          * Functional operator for sorting the buffered MPDUs.
          *
-         * \param a the key of first buffered MPDU (\see Key)
-         * \param b the key of second buffered MPDU (\see Key)
-         * \return true if first key is smaller than second
+         * @param a the key of first buffered MPDU (\see Key)
+         * @param b the key of second buffered MPDU (\see Key)
+         * @return true if first key is smaller than second
          */
         bool operator()(const Key& a, const Key& b) const;
     };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/reduced-neighbor-report.cc ns-3.44/src/wifi/model/reduced-neighbor-report.cc
--- ns-3.43/src/wifi/model/reduced-neighbor-report.cc	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/reduced-neighbor-report.cc	2025-03-09 16:55:49.799372700 -0700
@@ -9,6 +9,7 @@
 #include "reduced-neighbor-report.h"
 
 #include "wifi-phy-operating-channel.h"
+#include "wifi-utils.h"
 
 #include "ns3/abort.h"
 #include "ns3/address-utils.h"
@@ -53,17 +54,17 @@
     switch (channel.GetPhyBand())
     {
     case WIFI_PHY_BAND_2_4GHZ:
-        if (channel.GetWidth() == 20)
+        if (channel.GetWidth() == MHz_u{20})
         {
             operatingClass = 81;
         }
-        else if (channel.GetWidth() == 40)
+        else if (channel.GetWidth() == MHz_u{40})
         {
             operatingClass = 83;
         }
         break;
     case WIFI_PHY_BAND_5GHZ:
-        if (channel.GetWidth() == 20)
+        if (channel.GetWidth() == MHz_u{20})
         {
             if (channelNumber == 36 || channelNumber == 40 || channelNumber == 44 ||
                 channelNumber == 48)
@@ -89,7 +90,7 @@
                 operatingClass = 125;
             }
         }
-        else if (channel.GetWidth() == 40)
+        else if (channel.GetWidth() == MHz_u{40})
         {
             if (channelNumber == 38 || channelNumber == 46)
             {
@@ -110,7 +111,7 @@
                 operatingClass = 126;
             }
         }
-        else if (channel.GetWidth() == 80)
+        else if (channel.GetWidth() == MHz_u{80})
         {
             if (channelNumber == 42 || channelNumber == 58 || channelNumber == 106 ||
                 channelNumber == 122 || channelNumber == 138 || channelNumber == 155 ||
@@ -119,7 +120,7 @@
                 operatingClass = 128;
             }
         }
-        else if (channel.GetWidth() == 160)
+        else if (channel.GetWidth() == MHz_u{160})
         {
             if (channelNumber == 50 || channelNumber == 114 || channelNumber == 163)
             {
@@ -128,19 +129,19 @@
         }
         break;
     case WIFI_PHY_BAND_6GHZ:
-        if (channel.GetWidth() == 20)
+        if (channel.GetWidth() == MHz_u{20})
         {
             operatingClass = 131;
         }
-        else if (channel.GetWidth() == 40)
+        else if (channel.GetWidth() == MHz_u{40})
         {
             operatingClass = 132;
         }
-        else if (channel.GetWidth() == 80)
+        else if (channel.GetWidth() == MHz_u{80})
         {
             operatingClass = 133;
         }
-        else if (channel.GetWidth() == 160)
+        else if (channel.GetWidth() == MHz_u{160})
         {
             operatingClass = 134;
         }
@@ -157,18 +158,18 @@
                         << "band " << channel.GetPhyBand());
 
     // find the primary channel number
-    MHz_u startingFreq = 0;
+    MHz_u startingFreq{0};
 
     switch (channel.GetPhyBand())
     {
     case WIFI_PHY_BAND_2_4GHZ:
-        startingFreq = 2407;
+        startingFreq = MHz_u{2407};
         break;
     case WIFI_PHY_BAND_5GHZ:
-        startingFreq = 5000;
+        startingFreq = MHz_u{5000};
         break;
     case WIFI_PHY_BAND_6GHZ:
-        startingFreq = 5950;
+        startingFreq = MHz_u{5950};
         break;
     case WIFI_PHY_BAND_UNSPECIFIED:
     default:
@@ -177,7 +178,7 @@
     }
 
     uint8_t primaryChannelNumber =
-        (channel.GetPrimaryChannelCenterFrequency(20) - startingFreq) / 5;
+        (channel.GetPrimaryChannelCenterFrequency(MHz_u{20}) - startingFreq) / MHz_u{5};
 
     m_nbrApInfoFields.at(nbrApInfoId).operatingClass = operatingClass;
     m_nbrApInfoFields.at(nbrApInfoId).channelNumber = primaryChannelNumber;
@@ -189,74 +190,74 @@
     NS_ASSERT(nbrApInfoId < m_nbrApInfoFields.size());
 
     WifiPhyBand band = WIFI_PHY_BAND_UNSPECIFIED;
-    MHz_u width = 0;
+    MHz_u width{0};
 
     switch (m_nbrApInfoFields.at(nbrApInfoId).operatingClass)
     {
     case 81:
         band = WIFI_PHY_BAND_2_4GHZ;
-        width = 20;
+        width = MHz_u{20};
         break;
     case 83:
         band = WIFI_PHY_BAND_2_4GHZ;
-        width = 40;
+        width = MHz_u{40};
         break;
     case 115:
     case 118:
     case 121:
     case 125:
         band = WIFI_PHY_BAND_5GHZ;
-        width = 20;
+        width = MHz_u{20};
         break;
     case 116:
     case 119:
     case 122:
     case 126:
         band = WIFI_PHY_BAND_5GHZ;
-        width = 40;
+        width = MHz_u{40};
         break;
     case 128:
         band = WIFI_PHY_BAND_5GHZ;
-        width = 80;
+        width = MHz_u{80};
         break;
     case 129:
         band = WIFI_PHY_BAND_5GHZ;
-        width = 160;
+        width = MHz_u{160};
         break;
     case 131:
         band = WIFI_PHY_BAND_6GHZ;
-        width = 20;
+        width = MHz_u{20};
         break;
     case 132:
         band = WIFI_PHY_BAND_6GHZ;
-        width = 40;
+        width = MHz_u{40};
         break;
     case 133:
         band = WIFI_PHY_BAND_6GHZ;
-        width = 80;
+        width = MHz_u{80};
         break;
     case 134:
         band = WIFI_PHY_BAND_6GHZ;
-        width = 160;
+        width = MHz_u{160};
         break;
     default:
         break;
     }
 
-    NS_ABORT_IF(band == WIFI_PHY_BAND_UNSPECIFIED || width == 0);
+    NS_ABORT_IF(band == WIFI_PHY_BAND_UNSPECIFIED || width == MHz_u{0});
 
-    MHz_u startingFreq = 0;
+    MHz_u startingFreq{0};
 
     switch (band)
     {
     case WIFI_PHY_BAND_2_4GHZ:
-        startingFreq = 2407;
+        startingFreq = MHz_u{2407};
         break;
     case WIFI_PHY_BAND_5GHZ:
-        startingFreq = 5000;
+        startingFreq = MHz_u{5000};
         break;
     case WIFI_PHY_BAND_6GHZ:
-        startingFreq = 5950;
+        startingFreq = MHz_u{5950};
         break;
     case WIFI_PHY_BAND_UNSPECIFIED:
     default:
@@ -265,10 +266,10 @@
     }
 
     uint8_t primaryChannelNumber = m_nbrApInfoFields.at(nbrApInfoId).channelNumber;
-    MHz_u primaryChannelCenterFrequency = startingFreq + primaryChannelNumber * 5;
+    auto primaryChannelCenterFrequency = startingFreq + primaryChannelNumber * MHz_u{5};
 
     uint8_t channelNumber = 0;
-    MHz_u frequency = 0;
+    MHz_u frequency{0};
 
     for (const auto& channel : WifiPhyOperatingChannel::m_frequencyChannels)
     {
@@ -299,8 +300,8 @@
                     }
                     break;
                 case 40:
-                    if ((channel.frequency == primaryChannelCenterFrequency + 10) ||
-                        (channel.frequency == primaryChannelCenterFrequency - 10))
+                    if ((channel.frequency == primaryChannelCenterFrequency + MHz_u{10}) ||
+                        (channel.frequency == primaryChannelCenterFrequency - MHz_u{10}))
                     {
                         found = true;
                     }
@@ -319,14 +320,14 @@
         }
     }
 
-    NS_ABORT_IF(channelNumber == 0 || frequency == 0);
+    NS_ABORT_IF(channelNumber == 0 || frequency == MHz_u{0});
 
     WifiPhyOperatingChannel channel;
     channel.Set({{channelNumber, frequency, width, band}}, WIFI_STANDARD_UNSPECIFIED);
 
-    MHz_u channelLowestFreq = frequency - width / 2;
-    MHz_u primaryChannelLowestFreq = primaryChannelCenterFrequency - 10;
-    channel.SetPrimary20Index((primaryChannelLowestFreq - channelLowestFreq) / 20);
+    const auto channelLowestFreq = frequency - width / 2;
+    const auto primaryChannelLowestFreq = primaryChannelCenterFrequency - MHz_u{10};
+    channel.SetPrimary20Index(Count20MHzSubchannels(channelLowestFreq, primaryChannelLowestFreq));
 
     return channel;
 }
@@ -519,17 +520,13 @@
 void
 ReducedNeighborReport::SetMldParameters(std::size_t nbrApInfoId,
                                         std::size_t index,
-                                        uint8_t mldId,
-                                        uint8_t linkId,
-                                        uint8_t changeCount)
+                                        const MldParameters& mldParams)
 {
     NS_ASSERT(nbrApInfoId < m_nbrApInfoFields.size());
     NS_ASSERT(index < m_nbrApInfoFields.at(nbrApInfoId).tbttInformationSet.size());
 
     auto it = std::next(m_nbrApInfoFields.at(nbrApInfoId).tbttInformationSet.begin(), index);
-    it->mldParameters.mldId = mldId;
-    it->mldParameters.linkId = (linkId & 0x0f);
-    it->mldParameters.bssParamsChangeCount = changeCount;
+    it->mldParameters = mldParams;
 
     m_nbrApInfoFields.at(nbrApInfoId).hasMldParams = true;
 }
@@ -542,23 +539,13 @@
     return m_nbrApInfoFields.at(nbrApInfoId).hasMldParams;
 }
 
-uint8_t
-ReducedNeighborReport::GetMldId(std::size_t nbrApInfoId, std::size_t index) const
-{
-    NS_ASSERT(HasMldParameters(nbrApInfoId));
-    NS_ASSERT(index < m_nbrApInfoFields.at(nbrApInfoId).tbttInformationSet.size());
-
-    return m_nbrApInfoFields.at(nbrApInfoId).tbttInformationSet.at(index).mldParameters.mldId;
-}
-
-uint8_t
-ReducedNeighborReport::GetLinkId(std::size_t nbrApInfoId, std::size_t index) const
+const ReducedNeighborReport::MldParameters&
+ReducedNeighborReport::GetMldParameters(std::size_t nbrApInfoId, std::size_t index) const
 {
     NS_ASSERT(HasMldParameters(nbrApInfoId));
     NS_ASSERT(index < m_nbrApInfoFields.at(nbrApInfoId).tbttInformationSet.size());
 
-    return m_nbrApInfoFields.at(nbrApInfoId).tbttInformationSet.at(index).mldParameters.linkId &
-           0x0f;
+    return m_nbrApInfoFields.at(nbrApInfoId).tbttInformationSet.at(index).mldParameters;
 }
 
 void
@@ -660,10 +647,12 @@
             }
             if (neighborApInfo.hasMldParams)
             {
-                start.WriteU8(tbttInformation.mldParameters.mldId);
+                start.WriteU8(tbttInformation.mldParameters.apMldId);
                 uint16_t other = 0;
                 other |= (tbttInformation.mldParameters.linkId & 0x0f);
                 other |= (tbttInformation.mldParameters.bssParamsChangeCount << 4);
+                other |= (tbttInformation.mldParameters.allUpdates << 12);
+                other |= (tbttInformation.mldParameters.disabledLink << 13);
                 start.WriteHtolsbU16(other);
             }
         }
@@ -722,14 +711,14 @@
             }
             if (m_nbrApInfoFields.back().hasMldParams)
             {
-                m_nbrApInfoFields.back().tbttInformationSet.back().mldParameters.mldId = i.ReadU8();
+                auto& mldParams = m_nbrApInfoFields.back().tbttInformationSet.back().mldParameters;
+                mldParams.apMldId = i.ReadU8();
                 uint16_t other = i.ReadLsbtohU16();
                 count += 3;
-                m_nbrApInfoFields.back().tbttInformationSet.back().mldParameters.linkId =
-                    other & 0x000f;
-                m_nbrApInfoFields.back()
-                    .tbttInformationSet.back()
-                    .mldParameters.bssParamsChangeCount = (other >> 4) & 0x00ff;
+                mldParams.linkId = other & 0x000f;
+                mldParams.bssParamsChangeCount = (other >> 4) & 0x00ff;
+                mldParams.allUpdates = (other >> 12) & 0x01;
+                mldParams.disabledLink = (other >> 13) & 0x01;
             }
         }
     }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/reduced-neighbor-report.h ns-3.44/src/wifi/model/reduced-neighbor-report.h
--- ns-3.43/src/wifi/model/reduced-neighbor-report.h	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/reduced-neighbor-report.h	2025-03-09 16:55:49.799372700 -0700
@@ -21,8 +21,8 @@
 class WifiPhyOperatingChannel;
 
 /**
- * \brief The Reduced Neighbor Report element
- * \ingroup wifi
+ * @brief The Reduced Neighbor Report element
+ * @ingroup wifi
  *
  * This class knows how to serialise and deserialise the Reduced Neighbor Report element.
  */
@@ -34,9 +34,11 @@
      */
     struct MldParameters
     {
-        uint8_t mldId;                //!< MLD ID
-        uint8_t linkId;               //!< Link ID
+        uint8_t apMldId;              //!< AP MLD ID
+        uint8_t linkId : 4;           //!< Link ID
         uint8_t bssParamsChangeCount; //!< BSS Parameters Change Count
+        uint8_t allUpdates : 1;       ///< All Updates Included
+        uint8_t disabledLink : 1;     ///< Disabled Link Indication
     };
 
     /**
@@ -44,12 +46,12 @@
      */
     struct TbttInformation
     {
-        uint8_t neighborApTbttOffset{0};      //!< Neighbor AP TBTT Offset
-        Mac48Address bssid;                   //!< BSSID (optional)
-        uint32_t shortSsid{0};                //!< Short SSID (optional)
-        uint8_t bssParameters{0};             //!< BSS parameters (optional)
-        uint8_t psd20MHz{0};                  //!< 20 MHz PSD (optional)
-        MldParameters mldParameters{0, 0, 0}; //!< MLD Parameters (optional)
+        uint8_t neighborApTbttOffset{0}; //!< Neighbor AP TBTT Offset
+        Mac48Address bssid;              //!< BSSID (optional)
+        uint32_t shortSsid{0};           //!< Short SSID (optional)
+        uint8_t bssParameters{0};        //!< BSS parameters (optional)
+        uint8_t psd20MHz{0};             //!< 20 MHz PSD (optional)
+        MldParameters mldParameters{};   //!< MLD Parameters (optional)
     };
 
     /**
@@ -94,7 +96,7 @@
     /**
      * Get the number of Neighbor AP Information fields
      *
-     * \return the number of Neighbor AP Information fields
+     * @return the number of Neighbor AP Information fields
      */
     std::size_t GetNNbrApInfoFields() const;
     /**
@@ -106,16 +108,16 @@
      * Set the Operating Class and the Channel Number fields of the given
      * Neighbor AP Information field based on the given operating channel.
      *
-     * \param nbrApInfoId identifier of the given Neighbor AP Information field
-     * \param channel the PHY operating channel
+     * @param nbrApInfoId identifier of the given Neighbor AP Information field
+     * @param channel the PHY operating channel
      */
     void SetOperatingChannel(std::size_t nbrApInfoId, const WifiPhyOperatingChannel& channel);
     /**
      * Get the operating channel coded into the Operating Class and the Channel Number
      * fields of the given Neighbor AP Information field.
      *
-     * \param nbrApInfoId identifier of the given Neighbor AP Information field
-     * \return the PHY operating channel
+     * @param nbrApInfoId identifier of the given Neighbor AP Information field
+     * @return the PHY operating channel
      */
     WifiPhyOperatingChannel GetOperatingChannel(std::size_t nbrApInfoId) const;
 
@@ -123,15 +125,15 @@
      * Get the number of TBTT Information fields included in the TBTT Information Set
      * field of the given Neighbor AP Information field
      *
-     * \param nbrApInfoId identifier of the given Neighbor AP Information field
-     * \return the number of TBTT Information fields
+     * @param nbrApInfoId identifier of the given Neighbor AP Information field
+     * @return the number of TBTT Information fields
      */
     std::size_t GetNTbttInformationFields(std::size_t nbrApInfoId) const;
     /**
      * Add a TBTT Information fields to the TBTT Information Set field
      * of the given Neighbor AP Information field
      *
-     * \param nbrApInfoId identifier of the given Neighbor AP Information field
+     * @param nbrApInfoId identifier of the given Neighbor AP Information field
      */
     void AddTbttInformationField(std::size_t nbrApInfoId);
 
@@ -139,26 +141,26 @@
      * Set the BSSID field of the <i>i</i>-th TBTT Information field of the given
      * Neighbor AP Information field
      *
-     * \param nbrApInfoId identifier of the given Neighbor AP Information field
-     * \param index the index of the given TBTT Information field
-     * \param bssid the BSSID value
+     * @param nbrApInfoId identifier of the given Neighbor AP Information field
+     * @param index the index of the given TBTT Information field
+     * @param bssid the BSSID value
      */
     void SetBssid(std::size_t nbrApInfoId, std::size_t index, Mac48Address bssid);
     /**
      * Return true if the BSSID field is present in all the TBTT Information fields
      * of the given Neighbor AP Information field.
      *
-     * \param nbrApInfoId identifier of the given Neighbor AP Information field
-     * \return true if the BSSID field is present
+     * @param nbrApInfoId identifier of the given Neighbor AP Information field
+     * @return true if the BSSID field is present
      */
     bool HasBssid(std::size_t nbrApInfoId) const;
     /**
      * Get the BSSID field (must be present) in the <i>i</i>-th TBTT Information field
      * of the given Neighbor AP Information field.
      *
-     * \param nbrApInfoId identifier of the given Neighbor AP Information field
-     * \param index the index of the given TBTT Information field
-     * \return the BSSID field
+     * @param nbrApInfoId identifier of the given Neighbor AP Information field
+     * @param index the index of the given TBTT Information field
+     * @return the BSSID field
      */
     Mac48Address GetBssid(std::size_t nbrApInfoId, std::size_t index) const;
 
@@ -166,26 +168,26 @@
      * Set the Short SSID field of the <i>i</i>-th TBTT Information field of the given
      * Neighbor AP Information field
      *
-     * \param nbrApInfoId identifier of the given Neighbor AP Information field
-     * \param index the index of the given TBTT Information field
-     * \param shortSsid the short SSID value
+     * @param nbrApInfoId identifier of the given Neighbor AP Information field
+     * @param index the index of the given TBTT Information field
+     * @param shortSsid the short SSID value
      */
     void SetShortSsid(std::size_t nbrApInfoId, std::size_t index, uint32_t shortSsid);
     /**
      * Return true if the Short SSID field is present in all the TBTT Information fields
      * of the given Neighbor AP Information field.
      *
-     * \param nbrApInfoId identifier of the given Neighbor AP Information field
-     * \return true if the Short SSID field is present
+     * @param nbrApInfoId identifier of the given Neighbor AP Information field
+     * @return true if the Short SSID field is present
      */
     bool HasShortSsid(std::size_t nbrApInfoId) const;
     /**
      * Get the Short SSID field (must be present) in the <i>i</i>-th TBTT Information field
      * of the given Neighbor AP Information field.
      *
-     * \param nbrApInfoId identifier of the given Neighbor AP Information field
-     * \param index the index of the given TBTT Information field
-     * \return the Short SSID field
+     * @param nbrApInfoId identifier of the given Neighbor AP Information field
+     * @param index the index of the given TBTT Information field
+     * @return the Short SSID field
      */
     uint32_t GetShortSsid(std::size_t nbrApInfoId, std::size_t index) const;
 
@@ -193,26 +195,26 @@
      * Set the BSS Parameters field of the <i>i</i>-th TBTT Information field of the given
      * Neighbor AP Information field
      *
-     * \param nbrApInfoId identifier of the given Neighbor AP Information field
-     * \param index the index of the given TBTT Information field
-     * \param bssParameters the BSS Parameters value
+     * @param nbrApInfoId identifier of the given Neighbor AP Information field
+     * @param index the index of the given TBTT Information field
+     * @param bssParameters the BSS Parameters value
      */
     void SetBssParameters(std::size_t nbrApInfoId, std::size_t index, uint8_t bssParameters);
     /**
      * Return true if the BSS Parameters field is present in all the TBTT Information fields
      * of the given Neighbor AP Information field.
      *
-     * \param nbrApInfoId identifier of the given Neighbor AP Information field
-     * \return true if the BSS Parameters field is present
+     * @param nbrApInfoId identifier of the given Neighbor AP Information field
+     * @return true if the BSS Parameters field is present
      */
     bool HasBssParameters(std::size_t nbrApInfoId) const;
     /**
      * Get the BSS Parameters field (must be present) in the <i>i</i>-th TBTT Information field
      * of the given Neighbor AP Information field.
      *
-     * \param nbrApInfoId identifier of the given Neighbor AP Information field
-     * \param index the index of the given TBTT Information field
-     * \return the BSS Parameters field
+     * @param nbrApInfoId identifier of the given Neighbor AP Information field
+     * @param index the index of the given TBTT Information field
+     * @return the BSS Parameters field
      */
     uint8_t GetBssParameters(std::size_t nbrApInfoId, std::size_t index) const;
 
@@ -220,26 +222,26 @@
      * Set the 20 MHz PSD field of the <i>i</i>-th TBTT Information field of the given
      * Neighbor AP Information field
      *
-     * \param nbrApInfoId identifier of the given Neighbor AP Information field
-     * \param index the index of the given TBTT Information field
-     * \param psd20MHz the 20 MHz PSD value
+     * @param nbrApInfoId identifier of the given Neighbor AP Information field
+     * @param index the index of the given TBTT Information field
+     * @param psd20MHz the 20 MHz PSD value
      */
     void SetPsd20MHz(std::size_t nbrApInfoId, std::size_t index, uint8_t psd20MHz);
     /**
      * Return true if the 20 MHz PSD field is present in all the TBTT Information fields
      * of the given Neighbor AP Information field.
      *
-     * \param nbrApInfoId identifier of the given Neighbor AP Information field
-     * \return true if the 20 MHz PSD field is present
+     * @param nbrApInfoId identifier of the given Neighbor AP Information field
+     * @return true if the 20 MHz PSD field is present
      */
     bool HasPsd20MHz(std::size_t nbrApInfoId) const;
     /**
      * Get the 20 MHz PSD field (must be present) in the <i>i</i>-th TBTT Information field
      * of the given Neighbor AP Information field.
      *
-     * \param nbrApInfoId identifier of the given Neighbor AP Information field
-     * \param index the index of the given TBTT Information field
-     * \return the 20 MHz PSD field
+     * @param nbrApInfoId identifier of the given Neighbor AP Information field
+     * @param index the index of the given TBTT Information field
+     * @return the 20 MHz PSD field
      */
     uint8_t GetPsd20MHz(std::size_t nbrApInfoId, std::size_t index) const;
 
@@ -247,43 +249,30 @@
      * Set the MLD Parameters subfield of the <i>i</i>-th TBTT Information field of the given
      * Neighbor AP Information field
      *
-     * \param nbrApInfoId identifier of the given Neighbor AP Information field
-     * \param index the index of the given TBTT Information field
-     * \param mldId the MLD ID value
-     * \param linkId the Link ID value
-     * \param changeSequence the Change Sequence value
+     * @param nbrApInfoId identifier of the given Neighbor AP Information field
+     * @param index the index of the given TBTT Information field
+     * @param mldParams the MLD parameters
      */
     void SetMldParameters(std::size_t nbrApInfoId,
                           std::size_t index,
-                          uint8_t mldId,
-                          uint8_t linkId,
-                          uint8_t changeSequence);
+                          const MldParameters& mldParams);
     /**
      * Return true if the MLD Parameters subfield is present in all the TBTT Information fields
      * of the given Neighbor AP Information field.
      *
-     * \param nbrApInfoId identifier of the given Neighbor AP Information field
-     * \return true if the MLD Parameters subfield is present
+     * @param nbrApInfoId identifier of the given Neighbor AP Information field
+     * @return true if the MLD Parameters subfield is present
      */
     bool HasMldParameters(std::size_t nbrApInfoId) const;
     /**
-     * Get the MLD ID value in the MLD Parameters subfield (must be present) in the
-     * <i>i</i>-th TBTT Information field of the given Neighbor AP Information field.
-     *
-     * \param nbrApInfoId identifier of the given Neighbor AP Information field
-     * \param index the index of the given TBTT Information field
-     * \return the MLD ID value
-     */
-    uint8_t GetMldId(std::size_t nbrApInfoId, std::size_t index) const;
-    /**
-     * Get the Link ID value in the MLD Parameters subfield (must be present) in the
-     * <i>i</i>-th TBTT Information field of the given Neighbor AP Information field.
+     * Get the MLD Parameters subfield (must be present) in the <i>i</i>-th TBTT Information field
+     * of the given Neighbor AP Information field.
      *
-     * \param nbrApInfoId identifier of the given Neighbor AP Information field
-     * \param index the index of the given TBTT Information field
-     * \return the Link ID value
+     * @param nbrApInfoId identifier of the given Neighbor AP Information field
+     * @param index the index of the given TBTT Information field
+     * @return the MLD parameters
      */
-    uint8_t GetLinkId(std::size_t nbrApInfoId, std::size_t index) const;
+    const MldParameters& GetMldParameters(std::size_t nbrApInfoId, std::size_t index) const;
 
   private:
     /**
@@ -295,14 +284,14 @@
      * we can set the TBTT Information Count field based on the number of TBTT Information
      * fields included in the given Neighbor AP Information field.
      *
-     * \param nbrApInfoId identifier of the given Neighbor AP Information field
+     * @param nbrApInfoId identifier of the given Neighbor AP Information field
      */
     void WriteTbttInformationCount(std::size_t nbrApInfoId) const;
     /**
      * Get the TBTT Information Count field of the given Neighbor AP Information field.
      *
-     * \param nbrApInfoId identifier of the given Neighbor AP Information field
-     * \return the TBTT Information Count
+     * @param nbrApInfoId identifier of the given Neighbor AP Information field
+     * @return the TBTT Information Count
      */
     uint8_t ReadTbttInformationCount(std::size_t nbrApInfoId) const;
 
@@ -315,14 +304,14 @@
      * we can set the TBTT Information Length field based on the TBTT Information
      * field contents.
      *
-     * \param nbrApInfoId identifier of the given Neighbor AP Information field
+     * @param nbrApInfoId identifier of the given Neighbor AP Information field
      */
     void WriteTbttInformationLength(std::size_t nbrApInfoId) const;
     /**
      * Use the TBTT Information Length field of the given Neighbor AP Information field
      * to set the xxxPresent flags of the NeighborApInformation struct
      *
-     * \param nbrApInfoId identifier of the given Neighbor AP Information field
+     * @param nbrApInfoId identifier of the given Neighbor AP Information field
      */
     void ReadTbttInformationLength(std::size_t nbrApInfoId);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/reference/error-rate-tables.cc ns-3.44/src/wifi/model/reference/error-rate-tables.cc
--- ns-3.43/src/wifi/model/reference/error-rate-tables.cc	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/reference/error-rate-tables.cc	2025-03-09 16:55:49.799372700 -0700
@@ -20,188 +20,188 @@
 const SnrPerTable AwgnErrorTableBcc32[ERROR_TABLE_BCC_MAX_NUM_MCS] = {
     // MCS-0
     {
-        {-3.50000, 1.00000},
-        {-3.00000, 0.99500},
-        {-2.50000, 0.94080},
-        {-2.00000, 0.82590},
-        {-1.50000, 0.58950},
-        {-1.00000, 0.30830},
-        {-0.50000, 0.12540},
-        {0.00000, 0.03440},
-        {0.50000, 0.00850},
-        {1.00000, 0.00150},
-        {1.50000, 0.00024},
-        {2.00000, 0.00009},
-        {2.50000, 0.00000},
+        {dB_u{-3.50000}, 1.00000},
+        {dB_u{-3.00000}, 0.99500},
+        {dB_u{-2.50000}, 0.94080},
+        {dB_u{-2.00000}, 0.82590},
+        {dB_u{-1.50000}, 0.58950},
+        {dB_u{-1.00000}, 0.30830},
+        {dB_u{-0.50000}, 0.12540},
+        {dB_u{0.00000}, 0.03440},
+        {dB_u{0.50000}, 0.00850},
+        {dB_u{1.00000}, 0.00150},
+        {dB_u{1.50000}, 0.00024},
+        {dB_u{2.00000}, 0.00009},
+        {dB_u{2.50000}, 0.00000},
     },
     // MCS-1
     {
-        {-0.50000, 1.00000},
-        {0.00000, 0.99210},
-        {0.50000, 0.96710},
-        {1.00000, 0.83490},
-        {1.50000, 0.58740},
-        {2.00000, 0.31690},
-        {2.50000, 0.11820},
-        {3.00000, 0.03640},
-        {3.50000, 0.00850},
-        {4.00000, 0.00160},
-        {4.50000, 0.00026},
-        {5.00000, 0.00003},
-        {5.50000, 0.00000},
+        {dB_u{-0.50000}, 1.00000},
+        {dB_u{0.00000}, 0.99210},
+        {dB_u{0.50000}, 0.96710},
+        {dB_u{1.00000}, 0.83490},
+        {dB_u{1.50000}, 0.58740},
+        {dB_u{2.00000}, 0.31690},
+        {dB_u{2.50000}, 0.11820},
+        {dB_u{3.00000}, 0.03640},
+        {dB_u{3.50000}, 0.00850},
+        {dB_u{4.00000}, 0.00160},
+        {dB_u{4.50000}, 0.00026},
+        {dB_u{5.00000}, 0.00003},
+        {dB_u{5.50000}, 0.00000},
     },
     // MCS-2
     {
-        {2.00000, 1.00000},
-        {2.50000, 0.99400},
-        {3.00000, 0.95880},
-        {3.50000, 0.85120},
-        {4.00000, 0.59900},
-        {4.50000, 0.31250},
-        {5.00000, 0.11710},
-        {5.50000, 0.03390},
-        {6.00000, 0.00780},
-        {6.50000, 0.00160},
-        {7.00000, 0.00028},
-        {7.50000, 0.00008},
-        {8.00000, 0.00000},
+        {dB_u{2.00000}, 1.00000},
+        {dB_u{2.50000}, 0.99400},
+        {dB_u{3.00000}, 0.95880},
+        {dB_u{3.50000}, 0.85120},
+        {dB_u{4.00000}, 0.59900},
+        {dB_u{4.50000}, 0.31250},
+        {dB_u{5.00000}, 0.11710},
+        {dB_u{5.50000}, 0.03390},
+        {dB_u{6.00000}, 0.00780},
+        {dB_u{6.50000}, 0.00160},
+        {dB_u{7.00000}, 0.00028},
+        {dB_u{7.50000}, 0.00008},
+        {dB_u{8.00000}, 0.00000},
     },
     // MCS-3
     {
-        {4.00000, 1.00000},
-        {4.50000, 0.99900},
-        {5.00000, 0.99800},
-        {5.50000, 0.96900},
-        {6.00000, 0.88430},
-        {6.50000, 0.74090},
-        {7.00000, 0.46510},
-        {7.50000, 0.25710},
-        {8.00000, 0.10800},
-        {8.50000, 0.03810},
-        {9.00000, 0.01190},
-        {9.50000, 0.00320},
-        {10.00000, 0.00076},
-        {10.50000, 0.00017},
-        {11.00000, 0.00003},
-        {11.50000, 0.00000},
+        {dB_u{4.00000}, 1.00000},
+        {dB_u{4.50000}, 0.99900},
+        {dB_u{5.00000}, 0.99800},
+        {dB_u{5.50000}, 0.96900},
+        {dB_u{6.00000}, 0.88430},
+        {dB_u{6.50000}, 0.74090},
+        {dB_u{7.00000}, 0.46510},
+        {dB_u{7.50000}, 0.25710},
+        {dB_u{8.00000}, 0.10800},
+        {dB_u{8.50000}, 0.03810},
+        {dB_u{9.00000}, 0.01190},
+        {dB_u{9.50000}, 0.00320},
+        {dB_u{10.00000}, 0.00076},
+        {dB_u{10.50000}, 0.00017},
+        {dB_u{11.00000}, 0.00003},
+        {dB_u{11.50000}, 0.00000},
     },
     // MCS-4
     {
-        {8.00000, 1.00000},
-        {8.50000, 0.99900},
-        {9.00000, 0.94790},
-        {9.50000, 0.79890},
-        {10.00000, 0.59230},
-        {10.50000, 0.33700},
-        {11.00000, 0.15720},
-        {11.50000, 0.05420},
-        {12.00000, 0.01580},
-        {12.50000, 0.00400},
-        {13.00000, 0.00110},
-        {13.50000, 0.00027},
-        {14.00000, 0.00009},
-        {14.50000, 0.00000},
+        {dB_u{8.00000}, 1.00000},
+        {dB_u{8.50000}, 0.99900},
+        {dB_u{9.00000}, 0.94790},
+        {dB_u{9.50000}, 0.79890},
+        {dB_u{10.00000}, 0.59230},
+        {dB_u{10.50000}, 0.33700},
+        {dB_u{11.00000}, 0.15720},
+        {dB_u{11.50000}, 0.05420},
+        {dB_u{12.00000}, 0.01580},
+        {dB_u{12.50000}, 0.00400},
+        {dB_u{13.00000}, 0.00110},
+        {dB_u{13.50000}, 0.00027},
+        {dB_u{14.00000}, 0.00009},
+        {dB_u{14.50000}, 0.00000},
     },
     // MCS-5
     {
-        {11.50000, 1.00000},
-        {12.00000, 0.99800},
-        {12.50000, 0.96530},
-        {13.00000, 0.89700},
-        {13.50000, 0.73010},
-        {14.00000, 0.52570},
-        {14.50000, 0.30580},
-        {15.00000, 0.15750},
-        {15.50000, 0.06460},
-        {16.00000, 0.02410},
-        {16.50000, 0.00790},
-        {17.00000, 0.00230},
-        {17.50000, 0.00069},
-        {18.00000, 0.00018},
-        {18.50000, 0.00004},
-        {19.00000, 0.00002},
-        {19.50000, 0.00000},
+        {dB_u{11.50000}, 1.00000},
+        {dB_u{12.00000}, 0.99800},
+        {dB_u{12.50000}, 0.96530},
+        {dB_u{13.00000}, 0.89700},
+        {dB_u{13.50000}, 0.73010},
+        {dB_u{14.00000}, 0.52570},
+        {dB_u{14.50000}, 0.30580},
+        {dB_u{15.00000}, 0.15750},
+        {dB_u{15.50000}, 0.06460},
+        {dB_u{16.00000}, 0.02410},
+        {dB_u{16.50000}, 0.00790},
+        {dB_u{17.00000}, 0.00230},
+        {dB_u{17.50000}, 0.00069},
+        {dB_u{18.00000}, 0.00018},
+        {dB_u{18.50000}, 0.00004},
+        {dB_u{19.00000}, 0.00002},
+        {dB_u{19.50000}, 0.00000},
     },
     // MCS-6
     {
-        {13.00000, 1.00000},
-        {13.50000, 0.99010},
-        {14.00000, 0.96250},
-        {14.50000, 0.83980},
-        {15.00000, 0.68660},
-        {15.50000, 0.46340},
-        {16.00000, 0.25200},
-        {16.50000, 0.11450},
-        {17.00000, 0.04610},
-        {17.50000, 0.01580},
-        {18.00000, 0.00490},
-        {18.50000, 0.00160},
-        {19.00000, 0.00039},
-        {19.50000, 0.00011},
-        {20.00000, 0.00002},
-        {20.50000, 0.00000},
+        {dB_u{13.00000}, 1.00000},
+        {dB_u{13.50000}, 0.99010},
+        {dB_u{14.00000}, 0.96250},
+        {dB_u{14.50000}, 0.83980},
+        {dB_u{15.00000}, 0.68660},
+        {dB_u{15.50000}, 0.46340},
+        {dB_u{16.00000}, 0.25200},
+        {dB_u{16.50000}, 0.11450},
+        {dB_u{17.00000}, 0.04610},
+        {dB_u{17.50000}, 0.01580},
+        {dB_u{18.00000}, 0.00490},
+        {dB_u{18.50000}, 0.00160},
+        {dB_u{19.00000}, 0.00039},
+        {dB_u{19.50000}, 0.00011},
+        {dB_u{20.00000}, 0.00002},
+        {dB_u{20.50000}, 0.00000},
     },
     // MCS-7
     {
-        {14.00000, 1.00000},
-        {14.50000, 0.99700},
-        {15.00000, 0.98330},
-        {15.50000, 0.94260},
-        {16.00000, 0.84830},
-        {16.50000, 0.63470},
-        {17.00000, 0.43770},
-        {17.50000, 0.22260},
-        {18.00000, 0.11110},
-        {18.50000, 0.04400},
-        {19.00000, 0.01730},
-        {19.50000, 0.00530},
-        {20.00000, 0.00190},
-        {20.50000, 0.00052},
-        {21.00000, 0.00016},
-        {21.50000, 0.00004},
-        {22.00000, 0.00000},
+        {dB_u{14.00000}, 1.00000},
+        {dB_u{14.50000}, 0.99700},
+        {dB_u{15.00000}, 0.98330},
+        {dB_u{15.50000}, 0.94260},
+        {dB_u{16.00000}, 0.84830},
+        {dB_u{16.50000}, 0.63470},
+        {dB_u{17.00000}, 0.43770},
+        {dB_u{17.50000}, 0.22260},
+        {dB_u{18.00000}, 0.11110},
+        {dB_u{18.50000}, 0.04400},
+        {dB_u{19.00000}, 0.01730},
+        {dB_u{19.50000}, 0.00530},
+        {dB_u{20.00000}, 0.00190},
+        {dB_u{20.50000}, 0.00052},
+        {dB_u{21.00000}, 0.00016},
+        {dB_u{21.50000}, 0.00004},
+        {dB_u{22.00000}, 0.00000},
     },
     // MCS-8
     {
-        {17.50000, 1.00000},
-        {18.00000, 0.99600},
-        {18.50000, 0.98040},
-        {19.00000, 0.92860},
-        {19.50000, 0.82250},
-        {20.00000, 0.67500},
-        {20.50000, 0.44140},
-        {21.00000, 0.26660},
-        {21.50000, 0.13380},
-        {22.00000, 0.05950},
-        {22.50000, 0.02450},
-        {23.00000, 0.00910},
-        {23.50000, 0.00320},
-        {24.00000, 0.00098},
-        {24.50000, 0.00033},
-        {25.00000, 0.00014},
-        {25.50000, 0.00004},
-        {26.00000, 0.00000},
+        {dB_u{17.50000}, 1.00000},
+        {dB_u{18.00000}, 0.99600},
+        {dB_u{18.50000}, 0.98040},
+        {dB_u{19.00000}, 0.92860},
+        {dB_u{19.50000}, 0.82250},
+        {dB_u{20.00000}, 0.67500},
+        {dB_u{20.50000}, 0.44140},
+        {dB_u{21.00000}, 0.26660},
+        {dB_u{21.50000}, 0.13380},
+        {dB_u{22.00000}, 0.05950},
+        {dB_u{22.50000}, 0.02450},
+        {dB_u{23.00000}, 0.00910},
+        {dB_u{23.50000}, 0.00320},
+        {dB_u{24.00000}, 0.00098},
+        {dB_u{24.50000}, 0.00033},
+        {dB_u{25.00000}, 0.00014},
+        {dB_u{25.50000}, 0.00004},
+        {dB_u{26.00000}, 0.00000},
     },
     // MCS-9
     {
-        {19.00000, 1.00000},
-        {19.50000, 0.99800},
-        {20.00000, 0.98910},
-        {20.50000, 0.95970},
-        {21.00000, 0.87500},
-        {21.50000, 0.73170},
-        {22.00000, 0.51540},
-        {22.50000, 0.30380},
-        {23.00000, 0.15240},
-        {23.50000, 0.06340},
-        {24.00000, 0.02470},
-        {24.50000, 0.00850},
-        {25.00000, 0.00290},
-        {25.50000, 0.00100},
-        {26.00000, 0.00017},
-        {26.50000, 0.00014},
-        {27.00000, 0.00002},
-        {27.50000, 0.00000},
+        {dB_u{19.00000}, 1.00000},
+        {dB_u{19.50000}, 0.99800},
+        {dB_u{20.00000}, 0.98910},
+        {dB_u{20.50000}, 0.95970},
+        {dB_u{21.00000}, 0.87500},
+        {dB_u{21.50000}, 0.73170},
+        {dB_u{22.00000}, 0.51540},
+        {dB_u{22.50000}, 0.30380},
+        {dB_u{23.00000}, 0.15240},
+        {dB_u{23.50000}, 0.06340},
+        {dB_u{24.00000}, 0.02470},
+        {dB_u{24.50000}, 0.00850},
+        {dB_u{25.00000}, 0.00290},
+        {dB_u{25.50000}, 0.00100},
+        {dB_u{26.00000}, 0.00017},
+        {dB_u{26.50000}, 0.00014},
+        {dB_u{27.00000}, 0.00002},
+        {dB_u{27.50000}, 0.00000},
     },
 };
 
@@ -209,147 +209,147 @@
 const SnrPerTable AwgnErrorTableBcc1458[ERROR_TABLE_BCC_MAX_NUM_MCS] = {
     // MCS-0
     {
-        {-1.00000, 1.00000},
-        {-0.50000, 0.99400},
-        {0.00000, 0.81850},
-        {0.50000, 0.29080},
-        {1.00000, 0.06630},
-        {1.50000, 0.01120},
-        {2.00000, 0.00150},
-        {2.50000, 0.00015},
-        {3.00000, 0.00001},
-        {3.50000, 0.00000},
+        {dB_u{-1.00000}, 1.00000},
+        {dB_u{-0.50000}, 0.99400},
+        {dB_u{0.00000}, 0.81850},
+        {dB_u{0.50000}, 0.29080},
+        {dB_u{1.00000}, 0.06630},
+        {dB_u{1.50000}, 0.01120},
+        {dB_u{2.00000}, 0.00150},
+        {dB_u{2.50000}, 0.00015},
+        {dB_u{3.00000}, 0.00001},
+        {dB_u{3.50000}, 0.00000},
     },
     // MCS-1
     {
-        {2.00000, 1.00000},
-        {2.50000, 0.99700},
-        {3.00000, 0.79440},
-        {3.50000, 0.30080},
-        {4.00000, 0.07280},
-        {4.50000, 0.01200},
-        {5.00000, 0.00150},
-        {5.50000, 0.00023},
-        {6.00000, 0.00000},
+        {dB_u{2.00000}, 1.00000},
+        {dB_u{2.50000}, 0.99700},
+        {dB_u{3.00000}, 0.79440},
+        {dB_u{3.50000}, 0.30080},
+        {dB_u{4.00000}, 0.07280},
+        {dB_u{4.50000}, 0.01200},
+        {dB_u{5.00000}, 0.00150},
+        {dB_u{5.50000}, 0.00023},
+        {dB_u{6.00000}, 0.00000},
     },
     // MCS-2
     {
-        {4.50000, 1.00000},
-        {5.00000, 0.99800},
-        {5.50000, 0.75780},
-        {6.00000, 0.30100},
-        {6.50000, 0.06760},
-        {7.00000, 0.01220},
-        {7.50000, 0.00230},
-        {8.00000, 0.00035},
-        {8.50000, 0.00004},
-        {9.00000, 0.00000},
+        {dB_u{4.50000}, 1.00000},
+        {dB_u{5.00000}, 0.99800},
+        {dB_u{5.50000}, 0.75780},
+        {dB_u{6.00000}, 0.30100},
+        {dB_u{6.50000}, 0.06760},
+        {dB_u{7.00000}, 0.01220},
+        {dB_u{7.50000}, 0.00230},
+        {dB_u{8.00000}, 0.00035},
+        {dB_u{8.50000}, 0.00004},
+        {dB_u{9.00000}, 0.00000},
     },
     // MCS-3
     {
-        {7.50000, 1.00000},
-        {8.00000, 0.99400},
-        {8.50000, 0.84050},
-        {9.00000, 0.43410},
-        {9.50000, 0.14190},
-        {10.00000, 0.03740},
-        {10.50000, 0.00860},
-        {11.00000, 0.00190},
-        {11.50000, 0.00036},
-        {12.00000, 0.00005},
-        {12.50000, 0.00000},
+        {dB_u{7.50000}, 1.00000},
+        {dB_u{8.00000}, 0.99400},
+        {dB_u{8.50000}, 0.84050},
+        {dB_u{9.00000}, 0.43410},
+        {dB_u{9.50000}, 0.14190},
+        {dB_u{10.00000}, 0.03740},
+        {dB_u{10.50000}, 0.00860},
+        {dB_u{11.00000}, 0.00190},
+        {dB_u{11.50000}, 0.00036},
+        {dB_u{12.00000}, 0.00005},
+        {dB_u{12.50000}, 0.00000},
     },
     // MCS-4
     {
-        {11.00000, 1.00000},
-        {11.50000, 0.92690},
-        {12.00000, 0.51390},
-        {12.50000, 0.18260},
-        {13.00000, 0.04650},
-        {13.50000, 0.01100},
-        {14.00000, 0.00260},
-        {14.50000, 0.00041},
-        {15.00000, 0.00010},
-        {15.50000, 0.00000},
+        {dB_u{11.00000}, 1.00000},
+        {dB_u{11.50000}, 0.92690},
+        {dB_u{12.00000}, 0.51390},
+        {dB_u{12.50000}, 0.18260},
+        {dB_u{13.00000}, 0.04650},
+        {dB_u{13.50000}, 0.01100},
+        {dB_u{14.00000}, 0.00260},
+        {dB_u{14.50000}, 0.00041},
+        {dB_u{15.00000}, 0.00010},
+        {dB_u{15.50000}, 0.00000},
     },
     // MCS-5
     {
-        {14.50000, 1.00000},
-        {15.00000, 0.99900},
-        {15.50000, 0.94790},
-        {16.00000, 0.66250},
-        {16.50000, 0.29780},
-        {17.00000, 0.10580},
-        {17.50000, 0.03340},
-        {18.00000, 0.00910},
-        {18.50000, 0.00230},
-        {19.00000, 0.00064},
-        {19.50000, 0.00017},
-        {20.00000, 0.00002},
-        {20.50000, 0.00000},
+        {dB_u{14.50000}, 1.00000},
+        {dB_u{15.00000}, 0.99900},
+        {dB_u{15.50000}, 0.94790},
+        {dB_u{16.00000}, 0.66250},
+        {dB_u{16.50000}, 0.29780},
+        {dB_u{17.00000}, 0.10580},
+        {dB_u{17.50000}, 0.03340},
+        {dB_u{18.00000}, 0.00910},
+        {dB_u{18.50000}, 0.00230},
+        {dB_u{19.00000}, 0.00064},
+        {dB_u{19.50000}, 0.00017},
+        {dB_u{20.00000}, 0.00002},
+        {dB_u{20.50000}, 0.00000},
     },
     // MCS-6
     {
-        {16.00000, 1.00000},
-        {16.50000, 0.99500},
-        {17.00000, 0.87960},
-        {17.50000, 0.51390},
-        {18.00000, 0.20910},
-        {18.50000, 0.06390},
-        {19.00000, 0.01860},
-        {19.50000, 0.00460},
-        {20.00000, 0.00130},
-        {20.50000, 0.00023},
-        {21.00000, 0.00002},
-        {21.50000, 0.00000},
+        {dB_u{16.00000}, 1.00000},
+        {dB_u{16.50000}, 0.99500},
+        {dB_u{17.00000}, 0.87960},
+        {dB_u{17.50000}, 0.51390},
+        {dB_u{18.00000}, 0.20910},
+        {dB_u{18.50000}, 0.06390},
+        {dB_u{19.00000}, 0.01860},
+        {dB_u{19.50000}, 0.00460},
+        {dB_u{20.00000}, 0.00130},
+        {dB_u{20.50000}, 0.00023},
+        {dB_u{21.00000}, 0.00002},
+        {dB_u{21.50000}, 0.00000},
     },
     // MCS-7
     {
-        {17.50000, 1.00000},
-        {18.00000, 0.97850},
-        {18.50000, 0.73930},
-        {19.00000, 0.33750},
-        {19.50000, 0.12340},
-        {20.00000, 0.03550},
-        {20.50000, 0.01000},
-        {21.00000, 0.00270},
-        {21.50000, 0.00050},
-        {22.00000, 0.00009},
-        {22.50000, 0.00001},
-        {23.00000, 0.00000},
+        {dB_u{17.50000}, 1.00000},
+        {dB_u{18.00000}, 0.97850},
+        {dB_u{18.50000}, 0.73930},
+        {dB_u{19.00000}, 0.33750},
+        {dB_u{19.50000}, 0.12340},
+        {dB_u{20.00000}, 0.03550},
+        {dB_u{20.50000}, 0.01000},
+        {dB_u{21.00000}, 0.00270},
+        {dB_u{21.50000}, 0.00050},
+        {dB_u{22.00000}, 0.00009},
+        {dB_u{22.50000}, 0.00001},
+        {dB_u{23.00000}, 0.00000},
     },
     // MCS-8
     {
-        {21.00000, 1.00000},
-        {21.50000, 0.99800},
-        {22.00000, 0.93990},
-        {22.50000, 0.67090},
-        {23.00000, 0.35250},
-        {23.50000, 0.13760},
-        {24.00000, 0.04750},
-        {24.50000, 0.01540},
-        {25.00000, 0.00520},
-        {25.50000, 0.00150},
-        {26.00000, 0.00036},
-        {26.50000, 0.00007},
-        {27.00000, 0.00000},
+        {dB_u{21.00000}, 1.00000},
+        {dB_u{21.50000}, 0.99800},
+        {dB_u{22.00000}, 0.93990},
+        {dB_u{22.50000}, 0.67090},
+        {dB_u{23.00000}, 0.35250},
+        {dB_u{23.50000}, 0.13760},
+        {dB_u{24.00000}, 0.04750},
+        {dB_u{24.50000}, 0.01540},
+        {dB_u{25.00000}, 0.00520},
+        {dB_u{25.50000}, 0.00150},
+        {dB_u{26.00000}, 0.00036},
+        {dB_u{26.50000}, 0.00007},
+        {dB_u{27.00000}, 0.00000},
     },
     // MCS-9
     {
-        {22.50000, 1.00000},
-        {23.00000, 0.99900},
-        {23.50000, 0.95060},
-        {24.00000, 0.68470},
-        {24.50000, 0.32610},
-        {25.00000, 0.12480},
-        {25.50000, 0.04090},
-        {26.00000, 0.01300},
-        {26.50000, 0.00360},
-        {27.00000, 0.00082},
-        {27.50000, 0.00010},
-        {28.00000, 0.00002},
-        {28.50000, 0.00001},
-        {29.00000, 0.00000},
+        {dB_u{22.50000}, 1.00000},
+        {dB_u{23.00000}, 0.99900},
+        {dB_u{23.50000}, 0.95060},
+        {dB_u{24.00000}, 0.68470},
+        {dB_u{24.50000}, 0.32610},
+        {dB_u{25.00000}, 0.12480},
+        {dB_u{25.50000}, 0.04090},
+        {dB_u{26.00000}, 0.01300},
+        {dB_u{26.50000}, 0.00360},
+        {dB_u{27.00000}, 0.00082},
+        {dB_u{27.50000}, 0.00010},
+        {dB_u{28.00000}, 0.00002},
+        {dB_u{28.50000}, 0.00001},
+        {dB_u{29.00000}, 0.00000},
     },
 };
 
@@ -357,170 +357,172 @@
 const SnrPerTable AwgnErrorTableLdpc1458[ERROR_TABLE_LDPC_MAX_NUM_MCS] = {
     // MCS-0
     {
-        {-1.50000, 1.00000},
-        {-1.25000, 0.97950},
-        {-1.00000, 0.60480},
-        {-0.75000, 0.17050},
-        {-0.50000, 0.03320},
-        {-0.25000, 0.00530},
-        {0.00000, 0.00085},
-        {0.25000, 0.00022},
-        {0.50000, 0.00004},
-        {0.75000, 0.00000},
+        {dB_u{-1.50000}, 1.00000},
+        {dB_u{-1.25000}, 0.97950},
+        {dB_u{-1.00000}, 0.60480},
+        {dB_u{-0.75000}, 0.17050},
+        {dB_u{-0.50000}, 0.03320},
+        {dB_u{-0.25000}, 0.00530},
+        {dB_u{0.00000}, 0.00085},
+        {dB_u{0.25000}, 0.00022},
+        {dB_u{0.50000}, 0.00004},
+        {dB_u{0.75000}, 0.00000},
     },
     // MCS-1
     {
-        {1.50000, 1.00000},
-        {1.75000, 0.97470},
-        {2.00000, 0.62330},
-        {2.25000, 0.18590},
-        {2.50000, 0.03400},
-        {2.75000, 0.00550},
-        {3.00000, 0.00083},
-        {3.25000, 0.00015},
-        {3.50000, 0.00003},
-        {3.75000, 0.00000},
+        {dB_u{1.50000}, 1.00000},
+        {dB_u{1.75000}, 0.97470},
+        {dB_u{2.00000}, 0.62330},
+        {dB_u{2.25000}, 0.18590},
+        {dB_u{2.50000}, 0.03400},
+        {dB_u{2.75000}, 0.00550},
+        {dB_u{3.00000}, 0.00083},
+        {dB_u{3.25000}, 0.00015},
+        {dB_u{3.50000}, 0.00003},
+        {dB_u{3.75000}, 0.00000},
     },
     // MCS-2
     {
-        {4.00000, 1.00000},
-        {4.25000, 0.98720},
-        {4.50000, 0.62560},
-        {4.75000, 0.15800},
-        {5.00000, 0.02090},
-        {5.25000, 0.00250},
-        {5.50000, 0.00034},
-        {5.75000, 0.00003},
-        {6.00000, 0.00000},
+        {dB_u{4.00000}, 1.00000},
+        {dB_u{4.25000}, 0.98720},
+        {dB_u{4.50000}, 0.62560},
+        {dB_u{4.75000}, 0.15800},
+        {dB_u{5.00000}, 0.02090},
+        {dB_u{5.25000}, 0.00250},
+        {dB_u{5.50000}, 0.00034},
+        {dB_u{5.75000}, 0.00003},
+        {dB_u{6.00000}, 0.00000},
     },
     // MCS-3
     {
-        {6.75000, 1.00000},
-        {7.00000, 0.99800},
-        {7.25000, 0.94340},
-        {7.50000, 0.57890},
-        {7.75000, 0.20640},
-        {8.00000, 0.04840},
-        {8.25000, 0.00930},
-        {8.50000, 0.00180},
-        {8.75000, 0.00040},
-        {9.00000, 0.00011},
-        {9.25000, 0.00002},
-        {9.50000, 0.00000},
+        {dB_u{6.75000}, 1.00000},
+        {dB_u{7.00000}, 0.99800},
+        {dB_u{7.25000}, 0.94340},
+        {dB_u{7.50000}, 0.57890},
+        {dB_u{7.75000}, 0.20640},
+        {dB_u{8.00000}, 0.04840},
+        {dB_u{8.25000}, 0.00930},
+        {dB_u{8.50000}, 0.00180},
+        {dB_u{8.75000}, 0.00040},
+        {dB_u{9.00000}, 0.00011},
+        {dB_u{9.25000}, 0.00002},
+        {dB_u{9.50000}, 0.00000},
     },
     // MCS-4
-    {{10.00000, 1.00000},
-     {10.25000, 0.99310},
-     {10.50000, 0.70890},
-     {10.75000, 0.24720},
-     {11.00000, 0.04700},
-     {11.25000, 0.00590},
-     {11.50000, 0.00091},
-     {11.75000, 0.00016},
-     {12.00000, 0.00003},
-     {12.25000, 0.00000}},
+    {
+        {dB_u{10.00000}, 1.00000},
+        {dB_u{10.25000}, 0.99310},
+        {dB_u{10.50000}, 0.70890},
+        {dB_u{10.75000}, 0.24720},
+        {dB_u{11.00000}, 0.04700},
+        {dB_u{11.25000}, 0.00590},
+        {dB_u{11.50000}, 0.00091},
+        {dB_u{11.75000}, 0.00016},
+        {dB_u{12.00000}, 0.00003},
+        {dB_u{12.25000}, 0.00000},
+    },
     // MCS-5
     {
-        {14.00000, 1.00000},
-        {14.25000, 0.99700},
-        {14.50000, 0.91830},
-        {14.75000, 0.53790},
-        {15.00000, 0.16610},
-        {15.25000, 0.03690},
-        {15.50000, 0.00650},
-        {15.75000, 0.00100},
-        {16.00000, 0.00031},
-        {16.25000, 0.00005},
-        {16.50000, 0.00000},
+        {dB_u{14.00000}, 1.00000},
+        {dB_u{14.25000}, 0.99700},
+        {dB_u{14.50000}, 0.91830},
+        {dB_u{14.75000}, 0.53790},
+        {dB_u{15.00000}, 0.16610},
+        {dB_u{15.25000}, 0.03690},
+        {dB_u{15.50000}, 0.00650},
+        {dB_u{15.75000}, 0.00100},
+        {dB_u{16.00000}, 0.00031},
+        {dB_u{16.25000}, 0.00005},
+        {dB_u{16.50000}, 0.00000},
     },
     // MCS-6
     {
-        {15.50000, 1.00000},
-        {15.75000, 0.98140},
-        {16.00000, 0.73930},
-        {16.25000, 0.33110},
-        {16.50000, 0.08150},
-        {16.75000, 0.01620},
-        {17.00000, 0.00270},
-        {17.25000, 0.00052},
-        {17.50000, 0.00005},
-        {17.75000, 0.00003},
-        {18.00000, 0.00000},
+        {dB_u{15.50000}, 1.00000},
+        {dB_u{15.75000}, 0.98140},
+        {dB_u{16.00000}, 0.73930},
+        {dB_u{16.25000}, 0.33110},
+        {dB_u{16.50000}, 0.08150},
+        {dB_u{16.75000}, 0.01620},
+        {dB_u{17.00000}, 0.00270},
+        {dB_u{17.25000}, 0.00052},
+        {dB_u{17.50000}, 0.00005},
+        {dB_u{17.75000}, 0.00003},
+        {dB_u{18.00000}, 0.00000},
     },
     // MCS-7
     {
-        {17.00000, 1.00000},
-        {17.25000, 0.97750},
-        {17.50000, 0.73980},
-        {17.75000, 0.33190},
-        {18.00000, 0.09640},
-        {18.25000, 0.02180},
-        {18.50000, 0.00470},
-        {18.75000, 0.00087},
-        {19.00000, 0.00018},
-        {19.25000, 0.00003},
-        {19.50000, 0.00000},
+        {dB_u{17.00000}, 1.00000},
+        {dB_u{17.25000}, 0.97750},
+        {dB_u{17.50000}, 0.73980},
+        {dB_u{17.75000}, 0.33190},
+        {dB_u{18.00000}, 0.09640},
+        {dB_u{18.25000}, 0.02180},
+        {dB_u{18.50000}, 0.00470},
+        {dB_u{18.75000}, 0.00087},
+        {dB_u{19.00000}, 0.00018},
+        {dB_u{19.25000}, 0.00003},
+        {dB_u{19.50000}, 0.00000},
     },
     // MCS-8
     {
-        {20.50000, 1.00000},
-        {20.75000, 0.99500},
-        {21.00000, 0.89700},
-        {21.25000, 0.56270},
-        {21.50000, 0.20920},
-        {21.75000, 0.05600},
-        {22.00000, 0.01170},
-        {22.25000, 0.00250},
-        {22.50000, 0.00038},
-        {22.75000, 0.00013},
-        {23.00000, 0.00004},
-        {23.25000, 0.00001},
-        {23.50000, 0.00000},
+        {dB_u{20.50000}, 1.00000},
+        {dB_u{20.75000}, 0.99500},
+        {dB_u{21.00000}, 0.89700},
+        {dB_u{21.25000}, 0.56270},
+        {dB_u{21.50000}, 0.20920},
+        {dB_u{21.75000}, 0.05600},
+        {dB_u{22.00000}, 0.01170},
+        {dB_u{22.25000}, 0.00250},
+        {dB_u{22.50000}, 0.00038},
+        {dB_u{22.75000}, 0.00013},
+        {dB_u{23.00000}, 0.00004},
+        {dB_u{23.25000}, 0.00001},
+        {dB_u{23.50000}, 0.00000},
     },
     // MCS-9
     {
-        {22.25000, 1.00000},
-        {22.50000, 0.99900},
-        {22.75000, 0.94080},
-        {23.00000, 0.63600},
-        {23.25000, 0.27190},
-        {23.50000, 0.08700},
-        {23.75000, 0.02210},
-        {24.00000, 0.00500},
-        {24.25000, 0.00110},
-        {24.50000, 0.00032},
-        {24.75000, 0.00004},
-        {25.00000, 0.00000},
+        {dB_u{22.25000}, 1.00000},
+        {dB_u{22.50000}, 0.99900},
+        {dB_u{22.75000}, 0.94080},
+        {dB_u{23.00000}, 0.63600},
+        {dB_u{23.25000}, 0.27190},
+        {dB_u{23.50000}, 0.08700},
+        {dB_u{23.75000}, 0.02210},
+        {dB_u{24.00000}, 0.00500},
+        {dB_u{24.25000}, 0.00110},
+        {dB_u{24.50000}, 0.00032},
+        {dB_u{24.75000}, 0.00004},
+        {dB_u{25.00000}, 0.00000},
     },
     // MCS-10
     {
-        {25.75000, 1.00000},
-        {26.00000, 0.94970},
-        {26.25000, 0.68660},
-        {26.50000, 0.32940},
-        {26.75000, 0.11620},
-        {27.00000, 0.03440},
-        {27.25000, 0.00880},
-        {27.50000, 0.00210},
-        {27.75000, 0.00054},
-        {28.00000, 0.00009},
-        {28.25000, 0.00002},
-        {28.50000, 0.00000},
+        {dB_u{25.75000}, 1.00000},
+        {dB_u{26.00000}, 0.94970},
+        {dB_u{26.25000}, 0.68660},
+        {dB_u{26.50000}, 0.32940},
+        {dB_u{26.75000}, 0.11620},
+        {dB_u{27.00000}, 0.03440},
+        {dB_u{27.25000}, 0.00880},
+        {dB_u{27.50000}, 0.00210},
+        {dB_u{27.75000}, 0.00054},
+        {dB_u{28.00000}, 0.00009},
+        {dB_u{28.25000}, 0.00002},
+        {dB_u{28.50000}, 0.00000},
     },
     // MCS-11
     {
-        {27.75000, 1.00000},
-        {28.00000, 0.94880},
-        {28.25000, 0.75260},
-        {28.50000, 0.40230},
-        {28.75000, 0.16210},
-        {29.00000, 0.05150},
-        {29.25000, 0.01310},
-        {29.50000, 0.00360},
-        {29.75000, 0.00100},
-        {30.00000, 0.00022},
-        {30.25000, 0.00006},
-        {30.50000, 0.00000},
+        {dB_u{27.75000}, 1.00000},
+        {dB_u{28.00000}, 0.94880},
+        {dB_u{28.25000}, 0.75260},
+        {dB_u{28.50000}, 0.40230},
+        {dB_u{28.75000}, 0.16210},
+        {dB_u{29.00000}, 0.05150},
+        {dB_u{29.25000}, 0.01310},
+        {dB_u{29.50000}, 0.00360},
+        {dB_u{29.75000}, 0.00100},
+        {dB_u{30.00000}, 0.00022},
+        {dB_u{30.25000}, 0.00006},
+        {dB_u{30.50000}, 0.00000},
     },
 };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/simple-frame-capture-model.h ns-3.44/src/wifi/model/simple-frame-capture-model.h
--- ns-3.43/src/wifi/model/simple-frame-capture-model.h	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/simple-frame-capture-model.h	2025-03-09 16:55:49.799372700 -0700
@@ -15,7 +15,7 @@
 namespace ns3
 {
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * A simple threshold-based model for frame capture effect.
  * If the new incoming frame arrives while the receiver is
@@ -28,8 +28,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -39,13 +39,13 @@
     /**
      * Sets the frame capture margin.
      *
-     * \param margin the frame capture margin
+     * @param margin the frame capture margin
      */
     void SetMargin(dB_u margin);
     /**
      * Return the frame capture margin.
      *
-     * \return the frame capture margin
+     * @return the frame capture margin
      */
     dB_u GetMargin() const;
 
@@ -53,10 +53,10 @@
      * This method returns whether the reception should be switched to a
      * new incoming frame.
      *
-     * \param currentEvent the event of the current frame
-     * \param newEvent the event of the new incoming frame
+     * @param currentEvent the event of the current frame
+     * @param newEvent the event of the new incoming frame
      *
-     * \return true if the reception should be switched to a new incoming frame,
+     * @return true if the reception should be switched to a new incoming frame,
      *         false otherwise
      */
     bool CaptureNewFrame(Ptr<Event> currentEvent, Ptr<Event> newEvent) const override;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/snr-tag.h ns-3.44/src/wifi/model/snr-tag.h
--- ns-3.43/src/wifi/model/snr-tag.h	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/snr-tag.h	2025-03-09 16:55:49.799372700 -0700
@@ -24,8 +24,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -43,13 +43,13 @@
     /**
      * Set the SNR to the given value.
      *
-     * \param snr the value of the SNR to set in linear scale
+     * @param snr the value of the SNR to set in linear scale
      */
     void Set(double snr);
     /**
      * Return the SNR value.
      *
-     * \return the SNR value in linear scale
+     * @return the SNR value in linear scale
      */
     double Get() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/spectrum-wifi-phy.cc ns-3.44/src/wifi/model/spectrum-wifi-phy.cc
--- ns-3.43/src/wifi/model/spectrum-wifi-phy.cc	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/spectrum-wifi-phy.cc	2025-03-09 16:55:49.799372700 -0700
@@ -124,13 +124,13 @@
     NS_LOG_FUNCTION(this << spectrumPhyInterface);
     WifiSpectrumBands bands{};
     const auto channelWidth = spectrumPhyInterface->GetChannelWidth();
-    if (channelWidth < 20)
+    if (channelWidth < MHz_u{20})
     {
         bands.push_back(GetBandForInterface(spectrumPhyInterface, channelWidth));
     }
     else
     {
-        for (MHz_u bw = channelWidth; bw >= 20; bw = bw / 2)
+        for (MHz_u bw = channelWidth; bw >= MHz_u{20}; bw = bw / 2)
         {
             for (uint16_t i = 0; i < (channelWidth / bw); ++i)
             {
@@ -147,7 +147,7 @@
 {
     HeRuBands heRuBands{};
     const auto channelWidth = spectrumPhyInterface->GetChannelWidth();
-    for (MHz_u bw = channelWidth; bw >= 20; bw = bw / 2)
+    for (MHz_u bw = channelWidth; bw >= MHz_u{20}; bw = bw / 2)
     {
         for (uint32_t i = 0; i < (channelWidth / bw); ++i)
         {
@@ -178,10 +178,10 @@
                                                                     indicesPerSegment));
                     }
                     std::size_t index =
-                        (bw == 160 && phyIndex > nRus / 2 ? phyIndex - nRus / 2 : phyIndex);
-                    const auto p20Index = GetOperatingChannel().GetPrimaryChannelIndex(20);
-                    bool primary80IsLower80 = (p20Index < bw / 40);
-                    bool primary80 = (bw < 160 || ruType == HeRu::RU_2x996_TONE ||
+                        (bw == MHz_u{160} && phyIndex > nRus / 2 ? phyIndex - nRus / 2 : phyIndex);
+                    const auto p20Index = GetOperatingChannel().GetPrimaryChannelIndex(MHz_u{20});
+                    bool primary80IsLower80 = (p20Index < bw / MHz_u{40});
+                    bool primary80 = (bw < MHz_u{160} || ruType == HeRu::RU_2x996_TONE ||
                                       (primary80IsLower80 && phyIndex <= nRus / 2) ||
                                       (!primary80IsLower80 && phyIndex > nRus / 2));
                     HeRu::RuSpec ru(ruType, index, primary80);
@@ -470,7 +470,7 @@
     {
         NS_ASSERT_MSG(receivedSignalPsd->GetValuesN() ==
                           interface->GetRxSpectrumModel()->GetNumBands(),
-                      "Use multi model spectrum channel if PHYs have different spectrum models!");
+                      "Incorrect spectrum conversion or multi model spectrum channel is not used!");
     }
     NS_LOG_DEBUG("Received signal with PSD " << *receivedSignalPsd << " and duration "
                                              << rxDuration.As(Time::NS));
@@ -489,21 +489,21 @@
     const auto channelWidth = interface ? interface->GetChannelWidth() : GetChannelWidth();
     const auto& bands =
         interface ? interface->GetBands() : m_currentSpectrumPhyInterface->GetBands();
-    Watt_u totalRxPower = 0.0;
+    Watt_u totalRxPower{0.0};
     RxPowerWattPerChannelBand rxPowers;
 
     const auto rxGainRatio = DbToRatio(GetRxGain());
 
     std::size_t index = 0;
-    MHz_u prevBw = 0;
+    MHz_u prevBw{0};
     for (const auto& band : bands)
     {
         const auto bw =
             std::accumulate(band.frequencies.cbegin(),
                             band.frequencies.cend(),
-                            0,
+                            MHz_u{0},
                             [](MHz_u sum, const auto& startStopFreqs) {
-                                return sum + ((startStopFreqs.second - startStopFreqs.first) / 1e6);
+                                return sum + HzToMHz(startStopFreqs.second - startStopFreqs.first);
                             });
         NS_ASSERT(bw <= channelWidth);
         index = ((bw != prevBw) ? 0 : (index + 1));
@@ -515,10 +515,10 @@
         rxPowers.insert({band, rxPowerPerBand});
         NS_LOG_DEBUG("Signal power received after antenna gain for "
                      << bw << " MHz channel band " << index << ": " << rxPowerPerBand << " W"
-                     << (rxPowerPerBand > 0.0
+                     << (rxPowerPerBand > Watt_u{0.0}
                              ? " (" + std::to_string(WToDbm(rxPowerPerBand)) + " dBm)"
                              : ""));
-        if (bw <= 20)
+        if (bw <= MHz_u{20})
         {
             totalRxPower += rxPowerPerBand;
         }
@@ -539,17 +539,18 @@
         }
     }
 
-    NS_ASSERT_MSG(totalRxPower >= 0.0, "Negative RX power");
-    NS_LOG_DEBUG(
-        "Total signal power received after antenna gain: "
-        << totalRxPower << " W"
-        << (totalRxPower > 0.0 ? " (" + std::to_string(WToDbm(totalRxPower)) + " dBm)" : ""));
+    NS_ASSERT_MSG(totalRxPower >= Watt_u{0.0}, "Negative RX power");
+    NS_LOG_DEBUG("Total signal power received after antenna gain: "
+                 << totalRxPower << " W"
+                 << (totalRxPower > Watt_u{0.0}
+                         ? " (" + std::to_string(WToDbm(totalRxPower)) + " dBm)"
+                         : ""));
 
     Ptr<WifiSpectrumSignalParameters> wifiRxParams =
         DynamicCast<WifiSpectrumSignalParameters>(rxParams);
 
     // Log the signal arrival to the trace source
-    if (totalRxPower > 0.0)
+    if (totalRxPower > Watt_u{0.0})
     {
         m_signalCb(rxParams, senderNodeId, WToDbm(totalRxPower), rxDuration);
     }
@@ -587,12 +588,13 @@
     // Current implementation assumes constant RX power over the PPDU duration
     // Compare received TX power per MHz to normalized RX sensitivity
     const auto ppdu = GetRxPpduFromTxPpdu(wifiRxParams->ppdu);
-    if (totalRxPower < DbmToW(GetRxSensitivity()) * (ppdu->GetTxChannelWidth() / 20.0))
+    if (totalRxPower < DbmToW(GetRxSensitivity()) * (ppdu->GetTxChannelWidth() / MHz_u{20}))
     {
-        NS_LOG_INFO(
-            "Received signal too weak to process: "
-            << totalRxPower << " W"
-            << (totalRxPower > 0.0 ? " (" + std::to_string(WToDbm(totalRxPower)) + " dBm)" : ""));
+        NS_LOG_INFO("Received signal too weak to process: "
+                    << totalRxPower << " W"
+                    << (totalRxPower > Watt_u{0.0}
+                            ? " (" + std::to_string(WToDbm(totalRxPower)) + " dBm)"
+                            : ""));
         m_interference->Add(ppdu, rxDuration, rxPowers, GetCurrentFrequencyRange());
         SwitchMaybeToCcaBusy(nullptr);
         return;
@@ -662,11 +664,11 @@
 MHz_u
 SpectrumWifiPhy::GetGuardBandwidth(MHz_u currentChannelWidth) const
 {
-    MHz_u guardBandwidth = 0;
-    if (currentChannelWidth == 22)
+    MHz_u guardBandwidth{0};
+    if (currentChannelWidth == MHz_u{22})
     {
         // handle case of DSSS transmission
-        guardBandwidth = 10;
+        guardBandwidth = MHz_u{10};
     }
     else
     {
@@ -684,7 +686,7 @@
 uint32_t
 SpectrumWifiPhy::GetNumBandsBetweenSegments(const std::vector<MHz_u>& centerFrequencies,
                                             MHz_u totalWidth,
-                                            uint32_t subcarrierSpacing)
+                                            Hz_u subcarrierSpacing)
 {
     const auto numSegments = centerFrequencies.size();
     NS_ABORT_MSG_IF(numSegments > 2, "Only 2 non-contiguous frequency segments are supported");
@@ -698,7 +700,7 @@
     // all segments have the same width
     const auto segmentsWidth = totalWidth / numSegments;
     const auto widthBetweenSegments = highFrequency - lowFrequency - segmentsWidth;
-    return (widthBetweenSegments * 1e6) / subcarrierSpacing;
+    return MHzToHz(widthBetweenSegments) / subcarrierSpacing;
 }
 
 WifiSpectrumBandInfo
@@ -721,8 +723,8 @@
         numSegments = spectrumPhyInterface->GetCenterFrequencies().size();
         bandWidth /= spectrumPhyInterface->GetCenterFrequencies().size();
     }
-    const auto numBandsInBand = static_cast<size_t>(bandWidth * 1e6 / subcarrierSpacing);
-    auto numBandsInChannel = static_cast<size_t>(channelWidth * 1e6 / subcarrierSpacing);
+    const auto numBandsInBand = static_cast<size_t>(MHzToHz(bandWidth) / subcarrierSpacing);
+    auto numBandsInChannel = static_cast<size_t>(MHzToHz(channelWidth) / subcarrierSpacing);
     const auto numBands = channelWidth / bandWidth;
     if (numBandsInBand % 2 == 0)
     {
@@ -750,9 +752,9 @@
         auto frequencies =
             ConvertIndicesToFrequenciesForInterface(spectrumPhyInterface, {startIndex, stopIndex});
         auto freqRange = spectrumPhyInterface->GetFrequencyRange();
-        NS_ASSERT(frequencies.first >= (freqRange.minFrequency * 1e6));
-        NS_ASSERT(frequencies.second <= (freqRange.maxFrequency * 1e6));
-        NS_ASSERT((frequencies.second - frequencies.first) == (bandWidth * 1e6));
+        NS_ASSERT(frequencies.first >= MHzToHz(freqRange.minFrequency));
+        NS_ASSERT(frequencies.second <= MHzToHz(freqRange.maxFrequency));
+        NS_ASSERT((frequencies.second - frequencies.first) == MHzToHz(bandWidth));
         if (startIndex >= totalNumBands / 2)
         {
             // step past DC
@@ -789,7 +791,7 @@
     auto startGuardBand = rxSpectrumModel->Begin();
     auto startChannel = std::next(startGuardBand, indices.first);
     auto endChannel = std::next(startGuardBand, indices.second + 1);
-    return {startChannel->fc, endChannel->fc};
+    return {Hz_u{startChannel->fc}, Hz_u{endChannel->fc}};
 }
 
 std::tuple<dBr_u, dBr_u, dBr_u>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/spectrum-wifi-phy.h ns-3.44/src/wifi/model/spectrum-wifi-phy.h
--- ns-3.43/src/wifi/model/spectrum-wifi-phy.h	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/spectrum-wifi-phy.h	2025-03-09 16:55:49.799372700 -0700
@@ -36,8 +36,8 @@
 using HeRuBands = std::map<WifiSpectrumBandInfo, HeRu::RuSpec>;
 
 /**
- * \brief 802.11 PHY layer model
- * \ingroup wifi
+ * @brief 802.11 PHY layer model
+ * @ingroup wifi
  *
  * This PHY implements a spectrum-aware enhancement of the 802.11 SpectrumWifiPhy
  * model.
@@ -54,8 +54,8 @@
     friend class ::SpectrumWifiPhyFilterTest;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -76,8 +76,8 @@
     /**
      * Attach a SpectrumChannel to use for a given frequency range.
      *
-     * \param channel the SpectrumChannel to attach
-     * \param freqRange the frequency range, bounded by a minFrequency and a maxFrequency in MHz
+     * @param channel the SpectrumChannel to attach
+     * @param freqRange the frequency range, bounded by a minFrequency and a maxFrequency in MHz
      */
     void AddChannel(const Ptr<SpectrumChannel> channel,
                     const FrequencyRange& freqRange = WHOLE_WIFI_SPECTRUM);
@@ -86,14 +86,14 @@
      * Input method for delivering a signal from the spectrum channel
      * and low-level PHY interface to this SpectrumWifiPhy instance.
      *
-     * \param rxParams Input signal parameters
-     * \param interface the Spectrum PHY interface for which the signal has been detected
+     * @param rxParams Input signal parameters
+     * @param interface the Spectrum PHY interface for which the signal has been detected
      */
     void StartRx(Ptr<SpectrumSignalParameters> rxParams,
                  Ptr<const WifiSpectrumPhyInterface> interface);
 
     /**
-     * \param antenna an AntennaModel to include in the transmitted
+     * @param antenna an AntennaModel to include in the transmitted
      *                SpectrumSignalParameters (in case any objects downstream of the
      *                SpectrumWifiPhy wish to adjust signal properties based on the
      *                transmitted antenna model.  This antenna is also used when
@@ -107,16 +107,16 @@
     /**
      * Get the antenna model used for reception
      *
-     * \return the AntennaModel used for reception
+     * @return the AntennaModel used for reception
      */
     Ptr<AntennaModel> GetAntenna() const;
 
     /**
      * Callback invoked when the PHY model starts to process a signal
      *
-     * \param senderNodeId Node Id of the sender of the signal
-     * \param rxPower received signal power (dBm)
-     * \param duration Signal duration
+     * @param senderNodeId Node Id of the sender of the signal
+     * @param rxPower received signal power (dBm)
+     * @param duration Signal duration
      */
     typedef void (*SignalArrivalCallback)(Ptr<const SpectrumSignalParameters> signal,
                                           uint32_t senderNodeId,
@@ -130,8 +130,8 @@
      * portion specified by the caller. It takes care to configure the RX spectrum model of the PHY
      * interface and to update the bands tracked in interference helper.
      *
-     * \param frequencies the center frequency of each segment the PHY interface should use
-     * \param width the total channel width the PHY interface should use
+     * @param frequencies the center frequency of each segment the PHY interface should use
+     * @param width the total channel width the PHY interface should use
      */
     void ConfigureInterface(const std::vector<MHz_u>& frequencies, MHz_u width);
 
@@ -139,29 +139,29 @@
      * This function is sending the signal to the Spectrum channel
      * after finishing the configuration of the transmit parameters.
      *
-     * \param txParams the parameters to be provided to the Spectrum channel
+     * @param txParams the parameters to be provided to the Spectrum channel
      */
     void Transmit(Ptr<WifiSpectrumSignalParameters> txParams);
 
     /**
      * Determine the WifiPpdu to be used by the RX PHY based on the WifiPpdu sent by the TX PHY.
      *
-     * \param ppdu the WifiPpdu transmitted by the TX PHY
-     * \return the WifiPpdu to be used by the RX PHY
+     * @param ppdu the WifiPpdu transmitted by the TX PHY
+     * @return the WifiPpdu to be used by the RX PHY
      */
     Ptr<const WifiPpdu> GetRxPpduFromTxPpdu(Ptr<const WifiPpdu> ppdu);
 
     /**
      * Get the currently active spectrum PHY interface
      *
-     * \return the current spectrum PHY interface
+     * @return the current spectrum PHY interface
      */
     Ptr<WifiSpectrumPhyInterface> GetCurrentInterface() const;
 
     /**
      * Get the map of interfaces attached to this spectrum PHY
      *
-     * \return the map of interfaces attached to this spectrum PHY
+     * @return the map of interfaces attached to this spectrum PHY
      */
     const std::map<FrequencyRange, Ptr<WifiSpectrumPhyInterface>>& GetSpectrumPhyInterfaces() const;
 
@@ -169,18 +169,18 @@
      * Determine the number of bands between the two segments if the operating channel is made of
      * non-contiguous segments, otherwise the function returns zero.
      *
-     * \param centerFrequencies the center frequency of each segment
-     * \param totalWidth the width of the operating channel
-     * \param subcarrierSpacing the subcarrier spacing
-     * \return the number of bands between the two segments if the operating channel is made of
+     * @param centerFrequencies the center frequency of each segment
+     * @param totalWidth the width of the operating channel
+     * @param subcarrierSpacing the subcarrier spacing
+     * @return the number of bands between the two segments if the operating channel is made of
      * non-contiguous segments, zero otherwise
      */
     static uint32_t GetNumBandsBetweenSegments(const std::vector<MHz_u>& centerFrequencies,
                                                MHz_u totalWidth,
-                                               uint32_t subcarrierSpacing);
+                                               Hz_u subcarrierSpacing);
 
     /**
-     * \param callback the callback to invoke when operating channel has switched.
+     * @param callback the callback to invoke when operating channel has switched.
      */
     void SetChannelSwitchedCallback(Callback<void> callback);
 
@@ -204,10 +204,10 @@
 
     /**
      * Perform run-time spectrum model change
-     * \param spectrumPhyInterface the spectrum PHY interface for which the spectrum model should be
+     * @param spectrumPhyInterface the spectrum PHY interface for which the spectrum model should be
      * changed
-     * \param centerFrequencies the center frequency of each segment the PHY interface should use
-     * \param channelWidth the total channel width the PHY interface should use
+     * @param centerFrequencies the center frequency of each segment the PHY interface should use
+     * @param channelWidth the total channel width the PHY interface should use
      */
     void ResetSpectrumModel(Ptr<WifiSpectrumPhyInterface> spectrumPhyInterface,
                             const std::vector<MHz_u>& centerFrequencies,
@@ -215,16 +215,16 @@
 
     /**
      * This function is called to update the bands handled by the InterferenceHelper.
-     * \param spectrumPhyInterface the spectrum PHY interface for which the bands should be updated
+     * @param spectrumPhyInterface the spectrum PHY interface for which the bands should be updated
      */
     void UpdateInterferenceHelperBands(Ptr<WifiSpectrumPhyInterface> spectrumPhyInterface);
 
     /**
      * This function computes the RU bands that belong to a given spectrum PHY interface.
      *
-     * \param spectrumPhyInterface the spectrum PHY interface to consider to compute the RU bands
-     * \param guardBandwidth width of the guard band
-     * \returns the computed RU bands for the spectrum PHY interface
+     * @param spectrumPhyInterface the spectrum PHY interface to consider to compute the RU bands
+     * @param guardBandwidth width of the guard band
+     * @returns the computed RU bands for the spectrum PHY interface
      */
     HeRuBands GetHeRuBands(Ptr<WifiSpectrumPhyInterface> spectrumPhyInterface,
                            MHz_u guardBandwidth);
@@ -232,19 +232,19 @@
     /**
      * This function computes the bands that belong to a given spectrum PHY interface.
      *
-     * \param spectrumPhyInterface the spectrum PHY interface to consider to compute the bands
-     * \returns the computed bands for the spectrum PHY interface
+     * @param spectrumPhyInterface the spectrum PHY interface to consider to compute the bands
+     * @returns the computed bands for the spectrum PHY interface
      */
     WifiSpectrumBands ComputeBands(Ptr<WifiSpectrumPhyInterface> spectrumPhyInterface);
 
     /**
      * Get the info of a given band that belongs to a given spectrum PHY interface
      *
-     * \param spectrumPhyInterface the spectrum PHY interface
-     * \param bandWidth the width of the band to be returned
-     * \param bandIndex the index of the band to be returned
+     * @param spectrumPhyInterface the spectrum PHY interface
+     * @param bandWidth the width of the band to be returned
+     * @param bandIndex the index of the band to be returned
      *
-     * \return the info that defines the band
+     * @return the info that defines the band
      */
     WifiSpectrumBandInfo GetBandForInterface(Ptr<WifiSpectrumPhyInterface> spectrumPhyInterface,
                                              MHz_u bandWidth,
@@ -253,9 +253,9 @@
     /**
      * This is a helper function to convert start and stop indices to start and stop frequencies.
      *
-     * \param spectrumPhyInterface the spectrum PHY interface to consider for the calculations
-     * \param indices the start/stop indices to convert
-     * \return the converted frequencies
+     * @param spectrumPhyInterface the spectrum PHY interface to consider for the calculations
+     * @param indices the start/stop indices to convert
+     * @return the converted frequencies
      */
     WifiSpectrumBandFrequencies ConvertIndicesToFrequenciesForInterface(
         Ptr<WifiSpectrumPhyInterface> spectrumPhyInterface,
@@ -265,8 +265,8 @@
      * Determine whether the PHY shall issue a PHY-RXSTART.indication primitive in response to a
      * given PPDU.
      *
-     * \param ppdu the PPDU
-     * \return true if the PHY shall issue a PHY-RXSTART.indication primitive in response to a PPDU,
+     * @param ppdu the PPDU
+     * @return true if the PHY shall issue a PHY-RXSTART.indication primitive in response to a PPDU,
      * false otherwise
      */
     bool CanStartRx(Ptr<const WifiPpdu> ppdu) const;
@@ -274,9 +274,9 @@
     /**
      * Get the spectrum PHY interface that covers a band portion of the RF channel
      *
-     * \param frequency the center frequency of the RF channel band
-     * \param width the width of the RF channel band
-     * \return the spectrum PHY interface that covers the indicated band of the RF channel
+     * @param frequency the center frequency of the RF channel band
+     * @param width the width of the RF channel band
+     * @return the spectrum PHY interface that covers the indicated band of the RF channel
      */
     Ptr<WifiSpectrumPhyInterface> GetInterfaceCoveringChannelBand(MHz_u frequency,
                                                                   MHz_u width) const;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/ssid.h ns-3.44/src/wifi/model/ssid.h
--- ns-3.43/src/wifi/model/ssid.h	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/ssid.h	2025-03-09 16:55:49.799372700 -0700
@@ -15,11 +15,11 @@
 {
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * The IEEE 802.11 SSID Information Element
  *
- * \see attribute_Ssid
+ * @see attribute_Ssid
  */
 class Ssid : public WifiInformationElement
 {
@@ -31,7 +31,7 @@
     /**
      * Create SSID from a given string
      *
-     * \param s SSID in string
+     * @param s SSID in string
      */
     Ssid(std::string s);
 
@@ -42,16 +42,16 @@
     /**
      * Check if the two SSIDs are equal.
      *
-     * \param o SSID to compare to
+     * @param o SSID to compare to
      *
-     * \return true if the two SSIDs are equal,
+     * @return true if the two SSIDs are equal,
      *         false otherwise
      */
     bool IsEqual(const Ssid& o) const;
     /**
      * Check if the SSID is broadcast.
      *
-     * \return true if the SSID is broadcast,
+     * @return true if the SSID is broadcast,
      *         false otherwise
      */
     bool IsBroadcast() const;
@@ -59,7 +59,7 @@
     /**
      * Peek the SSID.
      *
-     * \return a pointer to SSID string
+     * @return a pointer to SSID string
      */
     char* PeekString() const;
 
@@ -75,10 +75,10 @@
 /**
  * Serialize from the given istream to this SSID.
  *
- * \param is the input stream
- * \param ssid the SSID
+ * @param is the input stream
+ * @param ssid the SSID
  *
- * \return std::istream
+ * @return std::istream
  */
 std::istream& operator>>(std::istream& is, Ssid& ssid);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/status-code.h ns-3.44/src/wifi/model/status-code.h
--- ns-3.43/src/wifi/model/status-code.h	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/status-code.h	2025-03-09 16:55:49.799372700 -0700
@@ -33,22 +33,22 @@
     /**
      * Return whether the status code is success.
      *
-     * \return true if success,
+     * @return true if success,
      *         false otherwise
      */
     bool IsSuccess() const;
 
     /**
-     * \returns the expected size of the status code.
+     * @returns the expected size of the status code.
      *
      * This method should return the number of bytes which are needed to store
      * the status code data by Serialize.
      */
     uint32_t GetSerializedSize() const;
     /**
-     * \param start an iterator which points to where the status code should be written
+     * @param start an iterator which points to where the status code should be written
      *
-     * \return Buffer::Iterator
+     * @return Buffer::Iterator
      *
      * This method is used to store a status code into the byte buffer.
      * The data written is expected to match bit-for-bit the representation of this
@@ -56,9 +56,9 @@
      */
     Buffer::Iterator Serialize(Buffer::Iterator start) const;
     /**
-     * \param start an iterator which points to where the status code should be read.
+     * @param start an iterator which points to where the status code should be read.
      *
-     * \returns the number of bytes read.
+     * @returns the number of bytes read.
      *
      * This method is used to re-create a status code from the byte buffer.
      * The data read is expected to match bit-for-bit the representation of this
@@ -73,10 +73,10 @@
 /**
  * Serialize StatusCode to the given ostream.
  *
- * \param os the output stream
- * \param code the StatusCode
+ * @param os the output stream
+ * @param code the StatusCode
  *
- * \return std::ostream
+ * @return std::ostream
  */
 std::ostream& operator<<(std::ostream& os, const StatusCode& code);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/sta-wifi-mac.cc ns-3.44/src/wifi/model/sta-wifi-mac.cc
--- ns-3.43/src/wifi/model/sta-wifi-mac.cc	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/sta-wifi-mac.cc	2025-03-09 16:55:49.799372700 -0700
@@ -13,7 +13,6 @@
 #include "channel-access-manager.h"
 #include "frame-exchange-manager.h"
 #include "mgt-action-headers.h"
-#include "mgt-headers.h"
 #include "qos-txop.h"
 #include "snr-tag.h"
 #include "wifi-assoc-manager.h"
@@ -123,13 +122,6 @@
                             "that disassociated with an AP MLD, the AP MLD address is provided.",
                             MakeTraceSourceAccessor(&StaWifiMac::m_deAssocLogger),
                             "ns3::Mac48Address::TracedCallback")
-            .AddTraceSource("LinkSetupCanceled",
-                            "A link setup in the context of ML setup with an AP MLD was torn down. "
-                            "Provides ID of the setup link and AP MAC address",
-                            MakeTraceSourceAccessor(&StaWifiMac::m_setupCanceled),
-                            "ns3::StaWifiMac::LinkSetupCallback",
-                            TypeId::OBSOLETE,
-                            "Disassociation only occurs at MLD level; use DeAssoc trace.")
             .AddTraceSource("BeaconArrival",
                             "Time of beacons arrival from associated AP",
                             MakeTraceSourceAccessor(&StaWifiMac::m_beaconArrival),
@@ -137,7 +129,15 @@
             .AddTraceSource("ReceivedBeaconInfo",
                             "Information about every received Beacon frame",
                             MakeTraceSourceAccessor(&StaWifiMac::m_beaconInfo),
-                            "ns3::ApInfo::TracedCallback");
+                            "ns3::ApInfo::TracedCallback")
+            .AddTraceSource("EmlsrLinkSwitch",
+                            "Trace start/end of EMLSR link switch events: when a PHY operating on "
+                            "a link starts switching, provides the ID of the link and a null "
+                            "pointer (indicating no PHY is operating on that link); when a PHY "
+                            "completes switching to a link, provides the ID of the link and a "
+                            "pointer to the PHY (that is now operating on that link)",
+                            MakeTraceSourceAccessor(&StaWifiMac::m_emlsrLinkSwitchLogger),
+                            "ns3::StaWifiMac::EmlsrLinkSwitchCallback");
     return tid;
 }
 
@@ -305,7 +305,7 @@
 StaWifiMac::GetCurrentChannel(uint8_t linkId) const
 {
     auto phy = GetWifiPhy(linkId);
-    const auto width = phy->GetOperatingChannel().IsOfdm() ? 20 : phy->GetChannelWidth();
+    const auto width = phy->GetOperatingChannel().IsOfdm() ? MHz_u{20} : phy->GetChannelWidth();
     uint8_t ch = phy->GetPrimaryChannelNumber(width);
     return {ch, phy->GetPhyBand()};
 }
@@ -348,23 +348,20 @@
     return GetLink(linkId).emlsrEnabled;
 }
 
-void
-StaWifiMac::SendProbeRequest(uint8_t linkId)
+MgtProbeRequestHeader
+StaWifiMac::GetProbeRequest(uint8_t linkId) const
 {
-    NS_LOG_FUNCTION(this << linkId);
-    WifiMacHeader hdr;
-    hdr.SetType(WIFI_MAC_MGT_PROBE_REQUEST);
-    hdr.SetAddr1(Mac48Address::GetBroadcast());
-    hdr.SetAddr2(GetFrameExchangeManager(linkId)->GetAddress());
-    hdr.SetAddr3(Mac48Address::GetBroadcast());
-    hdr.SetDsNotFrom();
-    hdr.SetDsNotTo();
-    Ptr<Packet> packet = Create<Packet>();
     MgtProbeRequestHeader probe;
     probe.Get<Ssid>() = GetSsid();
     auto supportedRates = GetSupportedRates(linkId);
     probe.Get<SupportedRates>() = supportedRates.rates;
     probe.Get<ExtendedSupportedRatesIE>() = supportedRates.extendedRates;
+    if (GetWifiPhy(linkId)->GetPhyBand() == WIFI_PHY_BAND_2_4GHZ)
+    {
+        DsssParameterSet params;
+        params.SetCurrentChannel(GetWifiPhy(linkId)->GetChannelNumber());
+        probe.Get<DsssParameterSet>() = params;
+    }
     if (GetHtSupported(linkId))
     {
         probe.Get<ExtendedCapabilities>() = GetExtendedCapabilities();
@@ -386,7 +383,45 @@
     {
         probe.Get<EhtCapabilities>() = GetEhtCapabilities(linkId);
     }
-    packet->AddHeader(probe);
+    return probe;
+}
+
+MgtProbeRequestHeader
+StaWifiMac::GetMultiLinkProbeRequest(uint8_t linkId,
+                                     const std::vector<uint8_t>& apLinkIds,
+                                     std::optional<uint8_t> apMldId) const
+{
+    NS_LOG_FUNCTION(this << linkId << apMldId.has_value());
+    auto req = GetProbeRequest(linkId);
+
+    if (GetNLinks() == 1)
+    {
+        // Single link (non-EHT) device
+        NS_LOG_DEBUG("Single link device does not support Multi-link operation, not including "
+                     "Multi-link Element");
+        return req;
+    }
+
+    req.Get<MultiLinkElement>() = GetProbeReqMultiLinkElement(apLinkIds, apMldId);
+    return req;
+}
+
+void
+StaWifiMac::EnqueueProbeRequest(const MgtProbeRequestHeader& probeReq,
+                                uint8_t linkId,
+                                const Mac48Address& addr1,
+                                const Mac48Address& addr3)
+{
+    NS_LOG_FUNCTION(this << linkId << addr1 << addr3);
+    WifiMacHeader hdr(WIFI_MAC_MGT_PROBE_REQUEST);
+    hdr.SetAddr1(addr1);
+    hdr.SetAddr2(GetFrameExchangeManager(linkId)->GetAddress());
+    hdr.SetAddr3(addr3);
+    hdr.SetDsNotFrom();
+    hdr.SetDsNotTo();
+
+    auto packet = Create<Packet>();
+    packet->AddHeader(probeReq);
 
     if (!GetQosSupported())
     {
@@ -459,7 +494,7 @@
 }
 
 MultiLinkElement
-StaWifiMac::GetMultiLinkElement(bool isReassoc, uint8_t linkId) const
+StaWifiMac::GetBasicMultiLinkElement(bool isReassoc, uint8_t linkId) const
 {
     NS_LOG_FUNCTION(this << isReassoc << +linkId);
 
@@ -498,10 +533,9 @@
 
     auto ehtConfiguration = GetEhtConfiguration();
     NS_ASSERT(ehtConfiguration);
-    EnumValue<WifiTidToLinkMappingNegSupport> negSupport;
-    ehtConfiguration->GetAttributeFailSafe("TidToLinkMappingNegSupport", negSupport);
 
-    mldCapabilities->tidToLinkMappingSupport = static_cast<uint8_t>(negSupport.Get());
+    mldCapabilities->tidToLinkMappingSupport =
+        static_cast<uint8_t>(ehtConfiguration->m_tidLinkMappingSupport);
     mldCapabilities->freqSepForStrApMld = 0; // not supported yet
     mldCapabilities->aarSupport = 0;         // not supported yet
 
@@ -538,6 +572,30 @@
     return multiLinkElement;
 }
 
+MultiLinkElement
+StaWifiMac::GetProbeReqMultiLinkElement(const std::vector<uint8_t>& apLinkIds,
+                                        std::optional<uint8_t> apMldId) const
+{
+    // IEEE 802.11be D6.0 9.4.2.321.3
+    MultiLinkElement mle(MultiLinkElement::PROBE_REQUEST_VARIANT);
+    if (apMldId.has_value())
+    {
+        mle.SetApMldId(*apMldId);
+    }
+
+    for (const auto apLinkId : apLinkIds)
+    {
+        mle.AddPerStaProfileSubelement();
+        auto& perStaProfile = mle.GetPerStaProfile(mle.GetNPerStaProfileSubelements() - 1);
+        perStaProfile.SetLinkId(apLinkId);
+        // Current support limited to Complete Profile request per link ID
+        // TODO: Add support for Partial Per-STA Profile request
+        perStaProfile.SetCompleteProfile();
+    };
+
+    return mle;
+}
+
 std::vector<TidToLinkMapping>
 StaWifiMac::GetTidToLinkMappingElements(WifiTidToLinkMappingNegSupport apNegSupport)
 {
@@ -546,10 +604,9 @@
     auto ehtConfig = GetEhtConfiguration();
     NS_ASSERT(ehtConfig);
 
-    EnumValue<WifiTidToLinkMappingNegSupport> negSupport;
-    ehtConfig->GetAttributeFailSafe("TidToLinkMappingNegSupport", negSupport);
+    auto negSupport = ehtConfig->m_tidLinkMappingSupport;
 
-    NS_ABORT_MSG_IF(negSupport.Get() == WifiTidToLinkMappingNegSupport::NOT_SUPPORTED,
+    NS_ABORT_MSG_IF(negSupport == WifiTidToLinkMappingNegSupport::NOT_SUPPORTED,
                     "Cannot request TID-to-Link Mapping if negotiation is not supported");
 
     // store the mappings, so that we can enforce them when the AP MLD accepts them
@@ -559,8 +616,7 @@
     bool mappingValidForNegType1 = TidToLinkMappingValidForNegType1(m_dlTidLinkMappingInAssocReq,
                                                                     m_ulTidLinkMappingInAssocReq);
     NS_ABORT_MSG_IF(
-        negSupport.Get() == WifiTidToLinkMappingNegSupport::SAME_LINK_SET &&
-            !mappingValidForNegType1,
+        negSupport == WifiTidToLinkMappingNegSupport::SAME_LINK_SET && !mappingValidForNegType1,
         "Mapping TIDs to distinct link sets is incompatible with negotiation support of 1");
 
     if (apNegSupport == WifiTidToLinkMappingNegSupport::SAME_LINK_SET && !mappingValidForNegType1)
@@ -649,7 +705,7 @@
         GetWifiRemoteStationManager(linkId)->GetMldAddress(*link.bssid).has_value())
     {
         auto addMle = [&](auto&& frame) {
-            frame.template Get<MultiLinkElement>() = GetMultiLinkElement(isReassoc, linkId);
+            frame.template Get<MultiLinkElement>() = GetBasicMultiLinkElement(isReassoc, linkId);
         };
         std::visit(addMle, frame);
 
@@ -870,7 +926,7 @@
     // until the RX is completed (otherwise, crashes may occur if we are receiving a MU frame
     // because its reception requires the STA-ID). We need to check that a PHY is operating on
     // the given link, because this may (temporarily) not be the case for EMLSR clients.
-    Time delay = Seconds(0);
+    Time delay;
     for (const auto& [id, link] : GetLinks())
     {
         if (link->phy && link->phy->IsStateRx())
@@ -1718,9 +1774,7 @@
             if (const auto& heOperation = frame.template Get<HeOperation>();
                 heOperation.has_value())
             {
-                GetHeConfiguration()->SetAttribute(
-                    "BssColor",
-                    UintegerValue(heOperation->m_bssColorInfo.m_bssColor));
+                GetHeConfiguration()->m_bssColor = heOperation->m_bssColorInfo.m_bssColor;
             }
         }
 
@@ -2024,6 +2078,7 @@
         if (link->phy == phy && id != linkId)
         {
             link->phy = nullptr;
+            m_emlsrLinkSwitchLogger(id, nullptr);
         }
     }
 
@@ -2045,25 +2100,52 @@
         newLink.feManager->SetWifiPhy(phy);
         // Connect the station manager on the new link to the given PHY
         newLink.stationManager->SetupPhy(phy);
+        // log link switch
+        m_emlsrLinkSwitchLogger(linkId, phy);
     };
 
     // cancel any pending event for the given PHY to switch link
-    if (auto eventIt = m_emlsrLinkSwitch.find(phy->GetPhyId()); eventIt != m_emlsrLinkSwitch.end())
-    {
-        eventIt->second.Cancel();
-        m_emlsrLinkSwitch.erase(eventIt);
-    }
+    CancelEmlsrPhyConnectEvent(phy->GetPhyId());
 
-    // if there is no PHY operating on the new link, connect the PHY to the new link now.
-    // Otherwise, wait until the channel switch is completed, so that the PHY operating on the new
-    // link can possibly continue receiving frames in the meantime.
-    if (!GetLink(linkId).phy)
+    // connect the PHY to the new link when the channel switch is completed, unless there is a PHY
+    // operating on the new link that is possibly receiving an ICF, in which case the PHY is
+    // connected when the frame reception is completed
+    if (delay.IsStrictlyPositive())
+    {
+        auto lambda = [=, this]() mutable {
+            const auto [maybeIcf, extension] = m_emlsrManager->CheckPossiblyReceivingIcf(linkId);
+            if (maybeIcf && extension.IsStrictlyPositive())
+            {
+                NS_ASSERT_MSG(phy->GetPhyId() == m_emlsrManager->GetMainPhyId(),
+                              "Only the main PHY is expected to move to a link on which another "
+                              "PHY is operating. PHY ID="
+                                  << +phy->GetPhyId());
+                NS_LOG_DEBUG("Connecting main PHY to link " << +linkId << " is postponed by "
+                                                            << extension.As(Time::US));
+                NotifySwitchingEmlsrLink(phy, linkId, extension);
+            }
+            else
+            {
+                connectPhy();
+            }
+        };
+
+        m_emlsrLinkSwitch.emplace(phy->GetPhyId(), Simulator::Schedule(delay, lambda));
+    }
+    else
     {
         connectPhy();
     }
-    else
+}
+
+void
+StaWifiMac::CancelEmlsrPhyConnectEvent(uint8_t phyId)
+{
+    NS_LOG_FUNCTION(this << phyId);
+    if (auto eventIt = m_emlsrLinkSwitch.find(phyId); eventIt != m_emlsrLinkSwitch.end())
     {
-        m_emlsrLinkSwitch.emplace(phy->GetPhyId(), Simulator::Schedule(delay, connectPhy));
+        eventIt->second.Cancel();
+        m_emlsrLinkSwitch.erase(eventIt);
     }
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/sta-wifi-mac.h ns-3.44/src/wifi/model/sta-wifi-mac.h
--- ns-3.43/src/wifi/model/sta-wifi-mac.h	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/sta-wifi-mac.h	2025-03-09 16:55:49.799372700 -0700
@@ -11,7 +11,6 @@
 #ifndef STA_WIFI_MAC_H
 #define STA_WIFI_MAC_H
 
-#include "mgt-headers.h"
 #include "wifi-mac.h"
 
 #include "ns3/eht-configuration.h"
@@ -21,6 +20,7 @@
 
 class AmpduAggregationTest;
 class MultiLinkOperationsTestBase;
+class ProbeExchTest;
 
 namespace ns3
 {
@@ -32,7 +32,7 @@
 class EmlsrManager;
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * Scan type (active or passive)
  */
@@ -43,7 +43,7 @@
 };
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * Structure holding scan parameters
  */
@@ -73,7 +73,7 @@
 };
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * Enumeration for power management modes
  */
@@ -86,7 +86,7 @@
 };
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * The Wifi MAC high model for a non-AP STA in a BSS. The state
  * machine is as follows:
@@ -134,8 +134,8 @@
   public:
     /// Allow test cases to access private members
     friend class ::AmpduAggregationTest;
-    /// Allow test cases to access private members
     friend class ::MultiLinkOperationsTestBase;
+    friend class ::ProbeExchTest;
 
     /// type of the management frames used to get info about APs
     using MgtFrameType =
@@ -168,8 +168,8 @@
     };
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -180,84 +180,111 @@
     int64_t AssignStreams(int64_t stream) override;
 
     /**
-     * \param phys the physical layers attached to this MAC.
+     * @param phys the physical layers attached to this MAC.
      */
     void SetWifiPhys(const std::vector<Ptr<WifiPhy>>& phys) override;
 
     /**
      * Set the Association Manager.
      *
-     * \param assocManager the Association Manager
+     * @param assocManager the Association Manager
      */
     void SetAssocManager(Ptr<WifiAssocManager> assocManager);
 
     /**
      * Set the EMLSR Manager.
      *
-     * \param emlsrManager the EMLSR Manager
+     * @param emlsrManager the EMLSR Manager
      */
     void SetEmlsrManager(Ptr<EmlsrManager> emlsrManager);
 
     /**
-     * \return the EMLSR Manager
+     * @return the EMLSR Manager
      */
     Ptr<EmlsrManager> GetEmlsrManager() const;
 
     /**
-     * Enqueue a probe request packet for transmission on the given link.
+     * Get the frame body of the Probe Request to transmit on the given link.
+     *
+     * @param linkId the ID of the given link
+     * @return the Probe Request frame body
+     */
+    MgtProbeRequestHeader GetProbeRequest(uint8_t linkId) const;
+
+    /**
+     * Get the frame body of the Multi-Link Probe Request to transmit on the given link.
      *
-     * \param linkId the ID of the given link
+     * @param linkId the ID of the given link
+     * @param apLinkIds ID of the links on which the requested APs, affiliated with the
+     *                  AP MLD, operate
+     * @param apMldId the AP MLD ID to include in the Common Info field
+     * @return the Multi-Link Probe Request frame body
      */
-    void SendProbeRequest(uint8_t linkId);
+    MgtProbeRequestHeader GetMultiLinkProbeRequest(uint8_t linkId,
+                                                   const std::vector<uint8_t>& apLinkIds,
+                                                   std::optional<uint8_t> apMldId) const;
+
+    /**
+     * Enqueue the given probe request packet for transmission on the given link.
+     *
+     * @param probeReq the given Probe Request frame body
+     * @param linkId the ID of the given link
+     * @param addr1 the MAC address for the Address1 field
+     * @param addr3 the MAC address for the Address3 field
+     */
+    void EnqueueProbeRequest(const MgtProbeRequestHeader& probeReq,
+                             uint8_t linkId,
+                             const Mac48Address& addr1 = Mac48Address::GetBroadcast(),
+                             const Mac48Address& addr3 = Mac48Address::GetBroadcast());
 
     /**
      * This method is called after wait beacon timeout or wait probe request timeout has
      * occurred. This will trigger association process from beacons or probe responses
      * gathered while scanning.
      *
-     * \param bestAp the info about the best AP to associate with, if one was found
+     * @param bestAp the info about the best AP to associate with, if one was found
      */
     void ScanningTimeout(const std::optional<ApInfo>& bestAp);
 
     /**
      * Return whether we are associated with an AP.
      *
-     * \return true if we are associated with an AP, false otherwise
+     * @return true if we are associated with an AP, false otherwise
      */
     bool IsAssociated() const;
 
     /**
      * Get the IDs of the setup links (if any).
      *
-     * \return the IDs of the setup links
+     * @return the IDs of the setup links
      */
     std::set<uint8_t> GetSetupLinkIds() const;
 
     /**
      * Return the association ID.
      *
-     * \return the association ID
+     * @return the association ID
      */
     uint16_t GetAssociationId() const;
 
     /**
      * Enable or disable Power Save mode on the given link.
      *
-     * \param enableLinkIdPair a pair indicating whether to enable or not power save mode on
+     * @param enableLinkIdPair a pair indicating whether to enable or not power save mode on
      *                         the link with the given ID
      */
     void SetPowerSaveMode(const std::pair<bool, uint8_t>& enableLinkIdPair);
 
     /**
-     * \param linkId the ID of the given link
-     * \return the current Power Management mode of the STA operating on the given link
+     * @param linkId the ID of the given link
+     * @return the current Power Management mode of the STA operating on the given link
      */
     WifiPowerManagementMode GetPmMode(uint8_t linkId) const;
 
     /**
      * Set the Power Management mode of the setup links after association.
      *
-     * \param linkId the ID of the link used to establish association
+     * @param linkId the ID of the link used to establish association
      */
     void SetPmModeAfterAssociation(uint8_t linkId);
 
@@ -265,7 +292,7 @@
      * Notify that the MPDU we sent was successfully received by the receiver
      * (i.e. we received an Ack from the receiver).
      *
-     * \param mpdu the MPDU that we successfully sent
+     * @param mpdu the MPDU that we successfully sent
      */
     void TxOk(Ptr<const WifiMpdu> mpdu);
 
@@ -274,39 +301,46 @@
     /**
      * Notify the MAC that EMLSR mode has changed on the given set of links.
      *
-     * \param linkIds the IDs of the links that are now EMLSR links (EMLSR mode is disabled
+     * @param linkIds the IDs of the links that are now EMLSR links (EMLSR mode is disabled
      *                on other links)
      */
     void NotifyEmlsrModeChanged(const std::set<uint8_t>& linkIds);
 
     /**
-     * \param linkId the ID of the given link
-     * \return whether the EMLSR mode is enabled on the given link
+     * @param linkId the ID of the given link
+     * @return whether the EMLSR mode is enabled on the given link
      */
     bool IsEmlsrLink(uint8_t linkId) const;
 
     /**
      * Notify that the given PHY switched channel to operate on another EMLSR link.
      *
-     * \param phy the given PHY
-     * \param linkId the ID of the EMLSR link on which the given PHY is operating
-     * \param delay the delay after which the channel switch will be completed
+     * @param phy the given PHY
+     * @param linkId the ID of the EMLSR link on which the given PHY is operating
+     * @param delay the delay after which the channel switch will be completed
      */
     void NotifySwitchingEmlsrLink(Ptr<WifiPhy> phy, uint8_t linkId, Time delay);
 
     /**
+     * Cancel any scheduled event for connecting the given PHY to an EMLSR link.
+     *
+     * @param phyId the ID of the given PHY
+     */
+    void CancelEmlsrPhyConnectEvent(uint8_t phyId);
+
+    /**
      * Block transmissions on the given link for the given reason.
      *
-     * \param linkId the ID of the given link
-     * \param reason the reason for blocking transmissions on the given link
+     * @param linkId the ID of the given link
+     * @param reason the reason for blocking transmissions on the given link
      */
     void BlockTxOnLink(uint8_t linkId, WifiQueueBlockedReason reason);
 
     /**
      * Unblock transmissions on the given links for the given reason.
      *
-     * \param linkIds the IDs of the given links
-     * \param reason the reason for unblocking transmissions on the given links
+     * @param linkIds the IDs of the given links
+     * @param reason the reason for unblocking transmissions on the given links
      */
     void UnblockTxOnLink(std::set<uint8_t> linkIds, WifiQueueBlockedReason reason);
 
@@ -333,16 +367,16 @@
     /**
      * Get a reference to the link associated with the given ID.
      *
-     * \param linkId the given link ID
-     * \return a reference to the link associated with the given ID
+     * @param linkId the given link ID
+     * @return a reference to the link associated with the given ID
      */
     StaLinkEntity& GetLink(uint8_t linkId) const;
 
     /**
      * Cast the given LinkEntity object to StaLinkEntity.
      *
-     * \param link the given LinkEntity object
-     * \return a reference to the object casted to StaLinkEntity
+     * @param link the given LinkEntity object
+     * @return a reference to the object casted to StaLinkEntity
      */
     StaLinkEntity& GetStaLink(const std::unique_ptr<WifiMac::LinkEntity>& link) const;
 
@@ -365,13 +399,13 @@
     /**
      * Enable or disable active probing.
      *
-     * \param enable enable or disable active probing
+     * @param enable enable or disable active probing
      */
     void SetActiveProbing(bool enable);
     /**
      * Return whether active probing is enabled.
      *
-     * \return true if active probing is enabled, false otherwise
+     * @return true if active probing is enabled, false otherwise
      */
     bool GetActiveProbing() const;
 
@@ -379,9 +413,9 @@
      * Determine whether the supported rates indicated in a given Beacon frame or
      * Probe Response frame fit with the configured membership selector.
      *
-     * \param frame the given Beacon or Probe Response frame
-     * \param linkId ID of the link the mgt frame was received over
-     * \return whether the the supported rates indicated in the given management
+     * @param frame the given Beacon or Probe Response frame
+     * @param linkId ID of the link the mgt frame was received over
+     * @return whether the the supported rates indicated in the given management
      *         frame fit with the configured membership selector
      */
     bool CheckSupportedRates(std::variant<MgtBeaconHeader, MgtProbeResponseHeader> frame,
@@ -396,24 +430,24 @@
     /**
      * Process the Beacon frame received on the given link.
      *
-     * \param mpdu the MPDU containing the Beacon frame
-     * \param linkId the ID of the given link
+     * @param mpdu the MPDU containing the Beacon frame
+     * @param linkId the ID of the given link
      */
     void ReceiveBeacon(Ptr<const WifiMpdu> mpdu, uint8_t linkId);
 
     /**
      * Process the Probe Response frame received on the given link.
      *
-     * \param mpdu the MPDU containing the Probe Response frame
-     * \param linkId the ID of the given link
+     * @param mpdu the MPDU containing the Probe Response frame
+     * @param linkId the ID of the given link
      */
     void ReceiveProbeResp(Ptr<const WifiMpdu> mpdu, uint8_t linkId);
 
     /**
      * Process the (Re)Association Response frame received on the given link.
      *
-     * \param mpdu the MPDU containing the (Re)Association Response frame
-     * \param linkId the ID of the given link
+     * @param mpdu the MPDU containing the (Re)Association Response frame
+     * @param linkId the ID of the given link
      */
     void ReceiveAssocResp(Ptr<const WifiMpdu> mpdu, uint8_t linkId);
 
@@ -422,10 +456,10 @@
      * Probe Response or Association Response). If STA is not associated, this
      * information will be used for the association process.
      *
-     * \param frame the body of the given management frame
-     * \param apAddr MAC address of the AP
-     * \param bssid MAC address of BSSID
-     * \param linkId ID of the link the management frame was received over
+     * @param frame the body of the given management frame
+     * @param apAddr MAC address of the AP
+     * @param bssid MAC address of BSSID
+     * @param linkId ID of the link the management frame was received over
      */
     void UpdateApInfo(const MgtFrameType& frame,
                       const Mac48Address& apAddr,
@@ -436,9 +470,9 @@
      * Get the (Re)Association Request frame to send on a given link. The returned frame
      * never includes a Multi-Link Element.
      *
-     * \param isReassoc whether a Reassociation Request has to be returned
-     * \param linkId the ID of the given link
-     * \return the (Re)Association Request frame
+     * @param isReassoc whether a Reassociation Request has to be returned
+     * @param linkId the ID of the given link
+     * @return the (Re)Association Request frame
      */
     std::variant<MgtAssocRequestHeader, MgtReassocRequestHeader> GetAssociationRequest(
         bool isReassoc,
@@ -449,7 +483,7 @@
      * The standard is not clear on the correct queue for management frames if QoS is supported.
      * We always use the DCF.
      *
-     * \param isReassoc flag whether it is a reassociation request
+     * @param isReassoc flag whether it is a reassociation request
      *
      */
     void SendAssociationRequest(bool isReassoc);
@@ -471,9 +505,10 @@
     /**
      * Return whether we are waiting for an association response from an AP.
      *
-     * \return true if we are waiting for an association response from an AP, false otherwise
+     * @return true if we are waiting for an association response from an AP, false otherwise
      */
     bool IsWaitAssocResp() const;
+
     /**
      * This method is called after we have not received a beacon from the AP on any link.
      */
@@ -481,7 +516,7 @@
     /**
      * Restarts the beacon timer.
      *
-     * \param delay the delay before the watchdog fires
+     * @param delay the delay before the watchdog fires
      */
     void RestartBeaconWatchdog(Time delay);
     /**
@@ -492,23 +527,33 @@
      * Return an instance of SupportedRates that contains all rates that we support
      * including HT rates.
      *
-     * \param linkId the ID of the link for which the request is made
-     * \return SupportedRates all rates that we support
+     * @param linkId the ID of the link for which the request is made
+     * @return SupportedRates all rates that we support
      */
     AllSupportedRates GetSupportedRates(uint8_t linkId) const;
     /**
-     * Return the Multi-Link Element to include in the management frames transmitted
+     * Return the Basic Multi-Link Element to include in the management frames transmitted
      * on the given link
      *
-     * \param isReassoc whether the Multi-Link Element is included in a Reassociation Request
-     * \param linkId the ID of the given link
-     * \return the Multi-Link Element
+     * @param isReassoc whether the Basic Multi-Link Element is included in a Reassociation Request
+     * @param linkId the ID of the given link
+     * @return the Basic Multi-Link Element
      */
-    MultiLinkElement GetMultiLinkElement(bool isReassoc, uint8_t linkId) const;
+    MultiLinkElement GetBasicMultiLinkElement(bool isReassoc, uint8_t linkId) const;
 
     /**
-     * \param apNegSupport the negotiation type supported by the AP MLD
-     * \return the TID-to-Link Mapping element(s) to include in Association Request frame.
+     * Return the Probe Request Multi-Link Element to include in the management frames to transmit.
+     *
+     * @param apLinkIds ID of the links on which the requested APs operate
+     * @param apMldId the AP MLD ID to include in the Common Info field
+     * @return the Probe Request Multi-Link Element
+     */
+    MultiLinkElement GetProbeReqMultiLinkElement(const std::vector<uint8_t>& apLinkIds,
+                                                 std::optional<uint8_t> apMldId) const;
+
+    /**
+     * @param apNegSupport the negotiation type supported by the AP MLD
+     * @return the TID-to-Link Mapping element(s) to include in Association Request frame.
      */
     std::vector<TidToLinkMapping> GetTidToLinkMappingElements(
         WifiTidToLinkMappingNegSupport apNegSupport);
@@ -516,7 +561,7 @@
     /**
      * Set the current MAC state.
      *
-     * \param value the new state
+     * @param value the new state
      */
     void SetState(MacState value);
 
@@ -535,8 +580,8 @@
     /**
      * Set the EDCA parameters for the given link.
      *
-     * \param params the EDCA parameters
-     * \param linkId the ID of the given link
+     * @param params the EDCA parameters
+     * @param linkId the ID of the given link
      */
     void SetEdcaParameters(const EdcaParams& params, uint8_t linkId);
 
@@ -555,16 +600,16 @@
     /**
      * Set the MU EDCA parameters for the given link.
      *
-     * \param params the MU EDCA parameters
-     * \param linkId the ID of the given link
+     * @param params the MU EDCA parameters
+     * @param linkId the ID of the given link
      */
     void SetMuEdcaParameters(const MuEdcaParams& params, uint8_t linkId);
 
     /**
      * Return the Capability information for the given link.
      *
-     * \param linkId the ID of the given link
-     * \return the Capability information that we support
+     * @param linkId the ID of the given link
+     * @return the Capability information that we support
      */
     CapabilityInformation GetCapabilities(uint8_t linkId) const;
 
@@ -577,8 +622,8 @@
      * Get the current primary20 channel used on the given link as a
      * (channel number, PHY band) pair.
      *
-     * \param linkId the ID of the given link
-     * \return a (channel number, PHY band) pair
+     * @param linkId the ID of the given link
+     * @return a (channel number, PHY band) pair
      */
     WifiScanParams::Channel GetCurrentChannel(uint8_t linkId) const;
 
@@ -608,23 +653,26 @@
     /// store the UL TID-to-Link Mapping included in the Association Request frame
     WifiTidLinkMapping m_ulTidLinkMappingInAssocReq;
 
-    TracedCallback<Mac48Address> m_assocLogger;             ///< association logger
-    TracedCallback<uint8_t, Mac48Address> m_setupCompleted; ///< link setup completed logger
-    TracedCallback<Mac48Address> m_deAssocLogger;           ///< disassociation logger
-    TracedCallback<uint8_t, Mac48Address> m_setupCanceled;  ///< link setup canceled logger
-    TracedCallback<Time> m_beaconArrival;                   ///< beacon arrival logger
-    TracedCallback<ApInfo> m_beaconInfo;                    ///< beacon info logger
+    TracedCallback<Mac48Address> m_assocLogger;                    ///< association logger
+    TracedCallback<uint8_t, Mac48Address> m_setupCompleted;        ///< link setup completed logger
+    TracedCallback<Mac48Address> m_deAssocLogger;                  ///< disassociation logger
+    TracedCallback<Time> m_beaconArrival;                          ///< beacon arrival logger
+    TracedCallback<ApInfo> m_beaconInfo;                           ///< beacon info logger
+    TracedCallback<uint8_t, Ptr<WifiPhy>> m_emlsrLinkSwitchLogger; ///< EMLSR link switch logger
 
     /// TracedCallback signature for link setup completed/canceled events
     using LinkSetupCallback = void (*)(uint8_t /* link ID */, Mac48Address /* AP address */);
+
+    /// TracedCallback signature for EMLSR link switch events
+    using EmlsrLinkSwitchCallback = void (*)(uint8_t /* link ID */, Ptr<WifiPhy> /* PHY */);
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the output stream
- * \param apInfo the AP information
- * \returns a reference to the stream
+ * @param os the output stream
+ * @param apInfo the AP information
+ * @returns a reference to the stream
  */
 std::ostream& operator<<(std::ostream& os, const StaWifiMac::ApInfo& apInfo);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/supported-rates.h ns-3.44/src/wifi/model/supported-rates.h
--- ns-3.43/src/wifi/model/supported-rates.h	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/supported-rates.h	2025-03-09 16:55:49.799372700 -0700
@@ -18,8 +18,8 @@
 {
 
 /**
- * \brief The Supported Rates Information Element
- * \ingroup wifi
+ * @brief The Supported Rates Information Element
+ * @ingroup wifi
  *
  * This class knows how to serialise and deserialise the Supported
  * Rates Element that holds the first 8 (non-HT) supported rates.
@@ -40,8 +40,8 @@
     /**
      * Return the rate (converted back to raw value) at the given index.
      *
-     * \param i the given index
-     * \return the rate in bps
+     * @param i the given index
+     * @return the rate in bps
      */
     uint32_t GetRate(uint8_t i) const;
 
@@ -54,8 +54,8 @@
 };
 
 /**
- * \brief The Extended Supported Rates Information Element
- * \ingroup wifi
+ * @brief The Extended Supported Rates Information Element
+ * @ingroup wifi
  *
  * This class knows how to serialise and deserialise the Extended
  * Supported Rates Element that holds (non-HT) rates beyond the 8 that
@@ -69,8 +69,8 @@
 };
 
 /**
- * \brief Struct containing all supported rates.
- * \ingroup wifi
+ * @brief Struct containing all supported rates.
+ * @ingroup wifi
  *
  */
 struct AllSupportedRates
@@ -78,20 +78,20 @@
     /**
      * Add the given rate to the supported rates.
      *
-     * \param bs the rate to be added in bps
+     * @param bs the rate to be added in bps
      */
     void AddSupportedRate(uint64_t bs);
     /**
      * Set the given rate to basic rates.
      *
-     * \param bs the rate to be set in bps
+     * @param bs the rate to be set in bps
      */
     void SetBasicRate(uint64_t bs);
     /**
      * Add a special value to the supported rate set, corresponding to
      * a BSS membership selector
      *
-     * \param bs the special membership selector value (not a valid rate)
+     * @param bs the special membership selector value (not a valid rate)
      */
     void AddBssMembershipSelectorRate(uint64_t bs);
     /**
@@ -99,9 +99,9 @@
      * serialized to the Supported Rates Information Element (i.e. as a
      * multiple of 500 Kbits/sec, possibly with MSB set to 1).
      *
-     * \param bs the rate to be checked in bps
+     * @param bs the rate to be checked in bps
      *
-     * \return true if the rate is supported, false otherwise
+     * @return true if the rate is supported, false otherwise
      */
     bool IsSupportedRate(uint64_t bs) const;
     /**
@@ -109,9 +109,9 @@
      * serialized to the Supported Rates Information Element (i.e. as a
      * multiple of 500 Kbits/sec, with MSB set to 1).
      *
-     * \param bs the rate to be checked in bps
+     * @param bs the rate to be checked in bps
      *
-     * \return true if the rate is a basic rate, false otherwise
+     * @return true if the rate is a basic rate, false otherwise
      */
     bool IsBasicRate(uint64_t bs) const;
     /**
@@ -119,15 +119,15 @@
      * is encoded as it is serialized to the Supporting Rates Information
      * Element (i.e. with the MSB set to 1).
      *
-     * \param bs the rate to be checked in bps
+     * @param bs the rate to be checked in bps
      *
-     * \return true if the rate is a BSS membership selector, false otherwise
+     * @return true if the rate is a BSS membership selector, false otherwise
      */
     bool IsBssMembershipSelectorRate(uint64_t bs) const;
     /**
      * Return the number of supported rates.
      *
-     * \return the number of supported rates
+     * @return the number of supported rates
      */
     uint8_t GetNRates() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/table-based-error-rate-model.cc ns-3.44/src/wifi/model/table-based-error-rate-model.cc
--- ns-3.43/src/wifi/model/table-based-error-rate-model.cc	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/table-based-error-rate-model.cc	2025-03-09 16:55:49.799372700 -0700
@@ -70,7 +70,7 @@
 {
     NS_LOG_FUNCTION(this << snr);
     const auto multiplier = std::round(std::pow(10.0, precision));
-    return std::floor(snr * multiplier + 0.5) / multiplier;
+    return dB_u{std::floor(snr * multiplier + 0.5) / multiplier};
 }
 
 std::optional<uint8_t>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/table-based-error-rate-model.h ns-3.44/src/wifi/model/table-based-error-rate-model.h
--- ns-3.43/src/wifi/model/table-based-error-rate-model.h	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/table-based-error-rate-model.h	2025-03-09 16:55:49.799372700 -0700
@@ -23,16 +23,16 @@
 class WifiTxVector;
 
 /*
- * \ingroup wifi
- * \brief the interface for the table-driven OFDM error model
+ * @ingroup wifi
+ * @brief the interface for the table-driven OFDM error model
  *
  */
 class TableBasedErrorRateModel : public ErrorRateModel
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -40,9 +40,9 @@
     ~TableBasedErrorRateModel() override;
 
     /**
-     * \brief Utility function to convert WifiMode to an MCS value
-     * \param mode the WifiMode
-     * \return the equivalent MCS value, if found
+     * @brief Utility function to convert WifiMode to an MCS value
+     * @param mode the WifiMode
+     * @return the equivalent MCS value, if found
      */
     static std::optional<uint8_t> GetMcsForMode(WifiMode mode);
 
@@ -58,19 +58,19 @@
     /**
      * Round SNR to the specified precision
      *
-     * \param snr the SNR to round
-     * \param precision the precision to use
-     * \return the rounded SNR to the specified precision
+     * @param snr the SNR to round
+     * @param precision the precision to use
+     * @return the rounded SNR to the specified precision
      */
     dB_u RoundSnr(dB_u snr, double precision) const;
 
     /**
      * Fetch the frame success rate for a given Wi-Fi mode, TXVECTOR, SNR and frame size.
-     * \param mode the Wi-Fi mode
-     * \param txVector the TXVECTOR
-     * \param snr the SNR (linear scale)
-     * \param nbits the number of bits
-     * \return the frame success rate for a given Wi-Fi mode, TXVECTOR, SNR and frame size
+     * @param mode the Wi-Fi mode
+     * @param txVector the TXVECTOR
+     * @param snr the SNR (linear scale)
+     * @param nbits the number of bits
+     * @return the frame success rate for a given Wi-Fi mode, TXVECTOR, SNR and frame size
      */
     double FetchFsr(WifiMode mode, const WifiTxVector& txVector, double snr, uint64_t nbits) const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/threshold-preamble-detection-model.h ns-3.44/src/wifi/model/threshold-preamble-detection-model.h
--- ns-3.43/src/wifi/model/threshold-preamble-detection-model.h	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/threshold-preamble-detection-model.h	2025-03-09 16:55:49.799372700 -0700
@@ -15,7 +15,7 @@
 namespace ns3
 {
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * A threshold-based model for detecting PHY preamble.
  * This model assumes that a preamble is successfully detected if SNR is at or above a given
@@ -26,8 +26,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/tim.h ns-3.44/src/wifi/model/tim.h
--- ns-3.43/src/wifi/model/tim.h	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/tim.h	2025-03-09 16:55:49.799372700 -0700
@@ -17,8 +17,8 @@
 {
 
 /**
- * \brief The Traffic Indication Map Information Element
- * \ingroup wifi
+ * @brief The Traffic Indication Map Information Element
+ * @ingroup wifi
  *
  * The 802.11 Traffic Indication Map (see section 9.4.2.5 of 802.11-2020)
  *
@@ -34,7 +34,7 @@
     /**
      * Add the provided AID value to the list contained in the Virtual Bitmap
      *
-     * \param aid the AID value to add to this TIM's Virtual Bitmap
+     * @param aid the AID value to add to this TIM's Virtual Bitmap
      */
     void AddAid(uint16_t aid);
 
@@ -42,9 +42,9 @@
      * Add the AID values in the provided iterator range to the list contained
      * in the Virtual Bitmap
      *
-     * \tparam Iterator Type of iterator
-     * \param begin Starting position of the iterator range
-     * \param end Ending position of the iterator range
+     * @tparam Iterator Type of iterator
+     * @param begin Starting position of the iterator range
+     * @param end Ending position of the iterator range
      */
     template <typename Iterator>
     void AddAid(Iterator begin, Iterator end);
@@ -53,8 +53,8 @@
      * Check whether the bit corresponding to the provided AID is set in the
      * Virtual Bitmap included in this TIM
      *
-     * \param aid The AID value to look for
-     * \return True if the AID value is found in the Virtual Bitmap, false otherwise
+     * @param aid The AID value to look for
+     * @return True if the AID value is found in the Virtual Bitmap, false otherwise
      */
     bool HasAid(uint16_t aid) const;
 
@@ -62,8 +62,8 @@
      * Return the AID values, greater than the given AID value, whose corresponding bits are set
      * in the virtual bitmap.
      *
-     * \param aid the given AID value
-     * \return the AID values, greater than the given AID value, whose corresponding bits are set
+     * @param aid the given AID value
+     * @return the AID values, greater than the given AID value, whose corresponding bits are set
      *         in the virtual bitmap
      */
     std::set<uint16_t> GetAidSet(uint16_t aid = 0) const;
@@ -73,12 +73,12 @@
      * the first octet included in the Partial Virtual Bitmap. Note that the Bitmap Offset
      * subfield contains the number N1/2.
      *
-     * \return the Partial Virtual Bitmap offset
+     * @return the Partial Virtual Bitmap offset
      */
     uint8_t GetPartialVirtualBitmapOffset() const;
 
     /**
-     * \return the last non-zero octet in the virtual bitmap (denoted as N2 by the specs)
+     * @return the last non-zero octet in the virtual bitmap (denoted as N2 by the specs)
      */
     uint8_t GetLastNonZeroOctetIndex() const;
 
@@ -95,8 +95,8 @@
      * Obtain the index of the octet where the provided AID value should be
      * set in the Virtual Bitmap
      *
-     * \param aid the provided AID value
-     * \return the index of the octet where the provided AID value should be
+     * @param aid the provided AID value
+     * @return the index of the octet where the provided AID value should be
      *         set in the Virtual Bitmap
      */
     uint8_t GetAidOctetIndex(uint16_t aid) const;
@@ -104,8 +104,8 @@
     /**
      * Obtain an octet with a set bit, corresponding to the provided AID value
      *
-     * \param aid the provided AID value
-     * \return an octet with a set bit, corresponding to the provided AID value
+     * @param aid the provided AID value
+     * @return an octet with a set bit, corresponding to the provided AID value
      */
     uint8_t GetAidBit(uint16_t aid) const;
 
@@ -113,9 +113,9 @@
      * Obtain the AID value represented by a certain octet index and bit
      * position inside the Virtual Bitmap
      *
-     * \param octet the octet index in the Virtual Bitmap
-     * \param position the bit position in the octet of the Virtual Bitmap
-     * \return the corresponding AID value
+     * @param octet the octet index in the Virtual Bitmap
+     * @param position the bit position in the octet of the Virtual Bitmap
+     * @return the corresponding AID value
      */
     uint16_t GetAidFromOctetIndexAndBitPosition(uint16_t octet, uint8_t position) const;
 
@@ -123,12 +123,12 @@
      * The Bitmap Control field is optional if the TIM is carried in an S1G PPDU, while
      * it is always present when the TIM is carried in a non-S1G PPDU.
      *
-     * \return the value of the Bitmap Control field
+     * @return the value of the Bitmap Control field
      */
     uint8_t GetBitmapControl() const;
 
     /**
-     * \return a vector containing the Partial Virtual Bitmap octets
+     * @return a vector containing the Partial Virtual Bitmap octets
      */
     std::vector<uint8_t> GetPartialVirtualBitmap() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/txop.cc ns-3.44/src/wifi/model/txop.cc
--- ns-3.43/src/wifi/model/txop.cc	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/txop.cc	2025-03-09 16:55:49.799372700 -0700
@@ -73,7 +73,7 @@
                           MakeUintegerAccessor((void(Txop::*)(uint32_t)) & Txop::SetMinCw,
                                                (uint32_t(Txop::*)() const) & Txop::GetMinCw),
                           MakeUintegerChecker<uint32_t>(),
-                          TypeId::OBSOLETE,
+                          TypeId::SupportLevel::OBSOLETE,
                           "Use MinCws attribute instead of MinCw")
             .AddAttribute(
                 "MinCws",
@@ -93,7 +93,7 @@
                           MakeUintegerAccessor((void(Txop::*)(uint32_t)) & Txop::SetMaxCw,
                                                (uint32_t(Txop::*)() const) & Txop::GetMaxCw),
                           MakeUintegerChecker<uint32_t>(),
-                          TypeId::OBSOLETE,
+                          TypeId::SupportLevel::OBSOLETE,
                           "Use MaxCws attribute instead of MaxCw")
             .AddAttribute(
                 "MaxCws",
@@ -114,7 +114,7 @@
                 MakeUintegerAccessor((void(Txop::*)(uint8_t)) & Txop::SetAifsn,
                                      (uint8_t(Txop::*)() const) & Txop::GetAifsn),
                 MakeUintegerChecker<uint8_t>(),
-                TypeId::OBSOLETE,
+                TypeId::SupportLevel::OBSOLETE,
                 "Use Aifsns attribute instead of Aifsn")
             .AddAttribute(
                 "Aifsns",
@@ -134,7 +134,7 @@
                           MakeTimeAccessor((void(Txop::*)(Time)) & Txop::SetTxopLimit,
                                            (Time(Txop::*)() const) & Txop::GetTxopLimit),
                           MakeTimeChecker(),
-                          TypeId::OBSOLETE,
+                          TypeId::SupportLevel::OBSOLETE,
                           "Use TxopLimits attribute instead of TxopLimit")
             .AddAttribute(
                 "TxopLimits",
@@ -358,6 +358,12 @@
     return GetLink(linkId).cw;
 }
 
+std::size_t
+Txop::GetStaRetryCount(uint8_t linkId) const
+{
+    return GetLink(linkId).staRetryCount;
+}
+
 void
 Txop::ResetCw(uint8_t linkId)
 {
@@ -365,6 +371,7 @@
     auto& link = GetLink(linkId);
     link.cw = GetMinCw(linkId);
     m_cwTrace(link.cw, linkId);
+    link.staRetryCount = 0;
 }
 
 void
@@ -372,10 +379,26 @@
 {
     NS_LOG_FUNCTION(this << linkId);
     auto& link = GetLink(linkId);
-    // see 802.11-2012, section 9.19.2.5
-    link.cw = std::min(2 * (link.cw + 1) - 1, GetMaxCw(linkId));
-    // if the MU EDCA timer is running, CW cannot be less than MU CW min
-    link.cw = std::max(link.cw, GetMinCw(linkId));
+
+    if (link.staRetryCount < m_mac->GetFrameRetryLimit())
+    {
+        // If QSRC[AC] is less than dot11ShortRetryLimit,
+        // - QSRC[AC] shall be incremented by 1.
+        // - CW[AC] shall be set to the lesser of CWmax[AC] and 2^QSRC[AC] × (CWmin[AC] + 1) – 1.
+        // (Section 10.23.2.2 of 802.11-2020)
+        ++link.staRetryCount;
+        link.cw =
+            std::min(GetMaxCw(linkId), (1 << link.staRetryCount) * (GetMinCw(linkId) + 1) - 1);
+    }
+    else
+    {
+        //  Else
+        // - QSRC[AC] shall be set to 0.
+        // - CW[AC] shall be set to CWmin[AC].
+        link.staRetryCount = 0;
+        link.cw = GetMinCw(linkId);
+    }
+
     m_cwTrace(link.cw, linkId);
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/txop.h ns-3.44/src/wifi/model/txop.h
--- ns-3.43/src/wifi/model/txop.h	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/txop.h	2025-03-09 16:55:49.799372700 -0700
@@ -44,9 +44,9 @@
 enum WifiMacDropReason : uint8_t; // opaque enum declaration
 
 /**
- * \brief Handles the packet queue and stores DCF/EDCA access parameters
+ * @brief Handles the packet queue and stores DCF/EDCA access parameters
  * (one Txop per AC).
- * \ingroup wifi
+ * @ingroup wifi
  *
  * This class handles the packet queue and stores DCF/EDCA access
  * parameters (one Txop per AC). It generates backoff values and stores the channel access status
@@ -59,8 +59,8 @@
     ~Txop() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -82,32 +82,32 @@
     /**
      * Check for QoS TXOP.
      *
-     * \returns true if QoS TXOP.
+     * @returns true if QoS TXOP.
      */
     virtual bool IsQosTxop() const;
 
     /**
      * Set the wifi MAC this Txop is associated to.
      *
-     * \param mac associated wifi MAC
+     * @param mac associated wifi MAC
      */
     virtual void SetWifiMac(const Ptr<WifiMac> mac);
     /**
      * Set MacTxMiddle this Txop is associated to.
      *
-     * \param txMiddle MacTxMiddle to associate.
+     * @param txMiddle MacTxMiddle to associate.
      */
     void SetTxMiddle(const Ptr<MacTxMiddle> txMiddle);
 
     /**
-     * \param callback the callback to invoke when an MPDU is dropped
+     * @param callback the callback to invoke when an MPDU is dropped
      */
     virtual void SetDroppedMpduCallback(DroppedMpdu callback);
 
     /**
      * Return the packet queue associated with this Txop.
      *
-     * \return the associated WifiMacQueue
+     * @return the associated WifiMacQueue
      */
     Ptr<WifiMacQueue> GetWifiMacQueue() const;
 
@@ -115,7 +115,7 @@
      * Set the minimum contention window size. For 11be multi-link devices,
      * set the minimum contention window size on the first link.
      *
-     * \param minCw the minimum contention window size.
+     * @param minCw the minimum contention window size.
      */
     void SetMinCw(uint32_t minCw);
     /**
@@ -123,7 +123,7 @@
      * Note that an empty <i>minCws</i> is ignored, otherwise its size must match the number
      * of links.
      *
-     * \param minCws the minimum contention window size for each link (links are sorted in
+     * @param minCws the minimum contention window size for each link (links are sorted in
      *               increasing order of link ID).
      */
     void SetMinCws(const std::vector<uint32_t>& minCws);
@@ -131,15 +131,15 @@
      * Set the minimum contention window size for the given link. Note that this function can
      * only be called after that links have been created.
      *
-     * \param minCw the minimum contention window size.
-     * \param linkId the ID of the given link
+     * @param minCw the minimum contention window size.
+     * @param linkId the ID of the given link
      */
     void SetMinCw(uint32_t minCw, uint8_t linkId);
     /**
      * Set the maximum contention window size. For 11be multi-link devices,
      * set the maximum contention window size on the first link.
      *
-     * \param maxCw the maximum contention window size.
+     * @param maxCw the maximum contention window size.
      */
     void SetMaxCw(uint32_t maxCw);
     /**
@@ -147,7 +147,7 @@
      * Note that an empty <i>maxCws</i> is ignored, otherwise its size must match the number
      * of links.
      *
-     * \param maxCws the maximum contention window size for each link (links are sorted in
+     * @param maxCws the maximum contention window size for each link (links are sorted in
      *               increasing order of link ID).
      */
     void SetMaxCws(const std::vector<uint32_t>& maxCws);
@@ -155,15 +155,15 @@
      * Set the maximum contention window size for the given link. Note that this function can
      * only be called after that links have been created.
      *
-     * \param maxCw the maximum contention window size.
-     * \param linkId the ID of the given link
+     * @param maxCw the maximum contention window size.
+     * @param linkId the ID of the given link
      */
     void SetMaxCw(uint32_t maxCw, uint8_t linkId);
     /**
      * Set the number of slots that make up an AIFS. For 11be multi-link devices,
      * set the number of slots that make up an AIFS on the first link.
      *
-     * \param aifsn the number of slots that make up an AIFS.
+     * @param aifsn the number of slots that make up an AIFS.
      */
     void SetAifsn(uint8_t aifsn);
     /**
@@ -171,7 +171,7 @@
      * Note that an empty <i>aifsns</i> is ignored, otherwise its size must match the number
      * of links.
      *
-     * \param aifsns the number of slots that make up an AIFS for each link (links are sorted in
+     * @param aifsns the number of slots that make up an AIFS for each link (links are sorted in
      *               increasing order of link ID).
      */
     void SetAifsns(const std::vector<uint8_t>& aifsns);
@@ -179,14 +179,14 @@
      * Set the number of slots that make up an AIFS for the given link. Note that this function
      * can only be called after that links have been created.
      *
-     * \param aifsn the number of slots that make up an AIFS.
-     * \param linkId the ID of the given link
+     * @param aifsn the number of slots that make up an AIFS.
+     * @param linkId the ID of the given link
      */
     void SetAifsn(uint8_t aifsn, uint8_t linkId);
     /**
      * Set the TXOP limit.
      *
-     * \param txopLimit the TXOP limit.
+     * @param txopLimit the TXOP limit.
      *        Value zero corresponds to default Txop.
      */
     void SetTxopLimit(Time txopLimit);
@@ -195,7 +195,7 @@
      * Note that an empty <i>txopLimits</i> is ignored, otherwise its size must match the number
      * of links.
      *
-     * \param txopLimits the TXOP limit for each link (links are sorted in increasing order of
+     * @param txopLimits the TXOP limit for each link (links are sorted in increasing order of
      *                   link ID).
      */
     void SetTxopLimits(const std::vector<Time>& txopLimits);
@@ -203,87 +203,87 @@
      * Set the TXOP limit for the given link. Note that this function can only be called after
      * that links have been created.
      *
-     * \param txopLimit the TXOP limit (must not be negative)
-     * \param linkId the ID of the given link
+     * @param txopLimit the TXOP limit (must not be negative)
+     * @param linkId the ID of the given link
      */
     void SetTxopLimit(Time txopLimit, uint8_t linkId);
     /**
      * Return the minimum contention window size. For 11be multi-link devices,
      * return the minimum contention window size on the first link.
      *
-     * \return the minimum contention window size.
+     * @return the minimum contention window size.
      */
     uint32_t GetMinCw() const;
     /**
      * Return the minimum contention window size for each link.
      *
-     * \return the minimum contention window size values.
+     * @return the minimum contention window size values.
      */
     std::vector<uint32_t> GetMinCws() const;
     /**
      * Return the minimum contention window size for the given link.
      *
-     * \param linkId the ID of the given link
-     * \return the minimum contention window size.
+     * @param linkId the ID of the given link
+     * @return the minimum contention window size.
      */
     virtual uint32_t GetMinCw(uint8_t linkId) const;
     /**
      * Return the maximum contention window size. For 11be multi-link devices,
      * return the maximum contention window size on the first link.
      *
-     * \return the maximum contention window size.
+     * @return the maximum contention window size.
      */
     uint32_t GetMaxCw() const;
     /**
      * Return the maximum contention window size for each link.
      *
-     * \return the maximum contention window size values.
+     * @return the maximum contention window size values.
      */
     std::vector<uint32_t> GetMaxCws() const;
     /**
      * Return the maximum contention window size for the given link.
      *
-     * \param linkId the ID of the given link
-     * \return the maximum contention window size.
+     * @param linkId the ID of the given link
+     * @return the maximum contention window size.
      */
     virtual uint32_t GetMaxCw(uint8_t linkId) const;
     /**
      * Return the number of slots that make up an AIFS. For 11be multi-link devices,
      * return the number of slots that make up an AIFS on the first link.
      *
-     * \return the number of slots that make up an AIFS.
+     * @return the number of slots that make up an AIFS.
      */
     uint8_t GetAifsn() const;
     /**
      * Return the number of slots that make up an AIFS for each link.
      *
-     * \return the number of slots that make up an AIFS for each link.
+     * @return the number of slots that make up an AIFS for each link.
      */
     std::vector<uint8_t> GetAifsns() const;
     /**
      * Return the number of slots that make up an AIFS for the given link.
      *
-     * \param linkId the ID of the given link
-     * \return the number of slots that make up an AIFS.
+     * @param linkId the ID of the given link
+     * @return the number of slots that make up an AIFS.
      */
     virtual uint8_t GetAifsn(uint8_t linkId) const;
     /**
      * Return the TXOP limit.
      *
-     * \return the TXOP limit.
+     * @return the TXOP limit.
      */
     Time GetTxopLimit() const;
     /**
      * Return the TXOP limit for each link.
      *
-     * \return the TXOP limit for each link.
+     * @return the TXOP limit for each link.
      */
     std::vector<Time> GetTxopLimits() const;
     /**
      * Return the TXOP limit for the given link.
      *
-     * \param linkId the ID of the given link
-     * \return the TXOP limit.
+     * @param linkId the ID of the given link
+     * @return the TXOP limit.
      */
     Time GetTxopLimit(uint8_t linkId) const;
     /**
@@ -292,7 +292,7 @@
      * of a packet after the maximum number of retransmissions has been
      * reached). By default, this resets the CW variable to minCW.
      *
-     * \param linkId the ID of the given link
+     * @param linkId the ID of the given link
      */
     void ResetCw(uint8_t linkId);
     /**
@@ -300,14 +300,33 @@
      * a transmission failure. By default, this triggers a doubling
      * of CW (capped by maxCW).
      *
-     * \param linkId the ID of the given link
+     * @param linkId the ID of the given link
      */
     void UpdateFailedCw(uint8_t linkId);
 
     /**
+     * Get the current value of the CW variable for the given link. The initial
+     * value is minCw.
+     *
+     * @param linkId the ID of the given link
+     * @return the current value of the CW variable for the given link
+     */
+    uint32_t GetCw(uint8_t linkId) const;
+
+    /**
+     * Get the Station Short Retry Count (SSRC) maintained by non-QoS stations or the QoS STA
+     * Retry Count (QSRC) maintained by QoS STAs for each AC on the given link.
+     *
+     * @param linkId the ID of the given link
+     * @return the Station Short Retry Count (SSRC) maintained by non-QoS stations or the QoS STA
+     *         Retry Count (QSRC) maintained by QoS STAs for each AC on the given link
+     */
+    std::size_t GetStaRetryCount(uint8_t linkId) const;
+
+    /**
      * Notify that the given link switched to sleep mode.
      *
-     * \param linkId the ID of the given link
+     * @param linkId the ID of the given link
      */
     virtual void NotifySleep(uint8_t linkId);
     /**
@@ -318,7 +337,7 @@
      * When wake up operation occurs on a link, channel access on that link
      * will be restarted.
      *
-     * \param linkId the ID of the link
+     * @param linkId the ID of the link
      */
     virtual void NotifyWakeUp(uint8_t linkId);
     /**
@@ -328,7 +347,7 @@
 
     /* Event handlers */
     /**
-     * \param mpdu the given MPDU
+     * @param mpdu the given MPDU
      *
      * Store the given MPDU in the internal queue until it
      * can be sent safely.
@@ -339,15 +358,15 @@
      * Called by the FrameExchangeManager to notify that channel access has
      * been granted on the given link for the given amount of time.
      *
-     * \param linkId the ID of the given link
-     * \param txopDuration the duration of the TXOP gained (zero for DCF)
+     * @param linkId the ID of the given link
+     * @param txopDuration the duration of the TXOP gained (zero for DCF)
      */
     virtual void NotifyChannelAccessed(uint8_t linkId, Time txopDuration = Seconds(0));
     /**
      * Called by the FrameExchangeManager to notify the completion of the transmissions.
      * This method generates a new backoff and restarts access if needed.
      *
-     * \param linkId the ID of the link the FrameExchangeManager is operating on
+     * @param linkId the ID of the link the FrameExchangeManager is operating on
      */
     virtual void NotifyChannelReleased(uint8_t linkId);
 
@@ -356,15 +375,15 @@
      * used by this model. Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream first stream index to use.
+     * @param stream first stream index to use.
      *
-     * \return the number of stream indices assigned by this model.
+     * @return the number of stream indices assigned by this model.
      */
     int64_t AssignStreams(int64_t stream);
 
     /**
-     * \param linkId the ID of the given link
-     * \return the current channel access status for the given link
+     * @param linkId the ID of the given link
+     * @return the current channel access status for the given link
      */
     virtual ChannelAccessStatus GetAccessStatus(uint8_t linkId) const;
 
@@ -376,11 +395,11 @@
      * the PHY operating on the given link just woke up from sleep mode. The <i>checkMediumBusy</i>
      * argument is forwarded to the NeedBackoffUponAccess method of the ChannelAccessManager.
      *
-     * \param linkId the ID of the given link
-     * \param hadFramesToTransmit whether packets available for transmission were queued just
+     * @param linkId the ID of the given link
+     * @param hadFramesToTransmit whether packets available for transmission were queued just
      *                            before the occurrence of the event causing this channel access
      *                            request
-     * \param checkMediumBusy whether generation of backoff (also) depends on the busy/idle state
+     * @param checkMediumBusy whether generation of backoff (also) depends on the busy/idle state
      *                        of the medium
      */
     void StartAccessAfterEvent(uint8_t linkId, bool hadFramesToTransmit, bool checkMediumBusy);
@@ -395,8 +414,8 @@
         false; //!< generation of backoff is independent of the busy/idle state of the medium
 
     /**
-     * \param nSlots the number of slots of the backoff.
-     * \param linkId the ID of the given link
+     * @param nSlots the number of slots of the backoff.
+     * @param linkId the ID of the given link
      *
      * Start a backoff for the given link by initializing the backoff counter to
      * the number of slots specified.
@@ -405,8 +424,8 @@
 
     /**
      * Check if the Txop has frames to transmit over the given link
-     * \param linkId the ID of the given link.
-     * \return true if the Txop has frames to transmit.
+     * @param linkId the ID of the given link.
+     * @return true if the Txop has frames to transmit.
      */
     virtual bool HasFramesToTransmit(uint8_t linkId);
 
@@ -415,7 +434,7 @@
      * is normally called by the WifiMac of a non-AP MLD upon completing ML setup to have
      * its link IDs match AP MLD's link IDs.
      *
-     * \param links a set of pairs (from, to) each mapping a current link ID to the
+     * @param links a set of pairs (from, to) each mapping a current link ID to the
      *              link ID it has to become (i.e., link 'from' becomes link 'to')
      */
     void SwapLinks(std::map<uint8_t, uint8_t> links);
@@ -435,7 +454,7 @@
     };
 
     /**
-     * \return a const reference to user-provided access parameters
+     * @return a const reference to user-provided access parameters
      */
     const UserDefinedAccessParams& GetUserAccessParams() const;
 
@@ -450,7 +469,7 @@
     /**
      * Create a wifi MAC queue containing packets of the given AC
      *
-     * \param aci the index of the given AC
+     * @param aci the index of the given AC
      */
     virtual void CreateQueue(AcIndex aci);
 
@@ -458,51 +477,43 @@
     /**
      * Notify that access request has been received for the given link.
      *
-     * \param linkId the ID of the given link
+     * @param linkId the ID of the given link
      */
     virtual void NotifyAccessRequested(uint8_t linkId);
 
     /**
      * Generate a new backoff for the given link now.
      *
-     * \param linkId the ID of the given link
+     * @param linkId the ID of the given link
      */
     virtual void GenerateBackoff(uint8_t linkId);
     /**
      * Request access to the ChannelAccessManager associated with the given link
      *
-     * \param linkId the ID of the given link
+     * @param linkId the ID of the given link
      */
     void RequestAccess(uint8_t linkId);
 
     /**
-     * Get the current value of the CW variable for the given link. The initial
-     * value is minCw.
-     *
-     * \param linkId the ID of the given link
-     * \return the current value of the CW variable for the given link
-     */
-    uint32_t GetCw(uint8_t linkId) const;
-    /**
      * Return the current number of backoff slots on the given link.
      *
-     * \param linkId the ID of the given link
-     * \return the current number of backoff slots
+     * @param linkId the ID of the given link
+     * @return the current number of backoff slots
      */
     uint32_t GetBackoffSlots(uint8_t linkId) const;
     /**
      * Return the time when the backoff procedure started on the given link.
      *
-     * \param linkId the ID of the given link
-     * \return the time when the backoff procedure started
+     * @param linkId the ID of the given link
+     * @return the time when the backoff procedure started
      */
     Time GetBackoffStart(uint8_t linkId) const;
     /**
      * Update backoff slots for the given link that nSlots has passed.
      *
-     * \param nSlots the number of slots to decrement
-     * \param backoffUpdateBound the time at which backoff should start
-     * \param linkId the ID of the given link
+     * @param nSlots the number of slots to decrement
+     * @param backoffUpdateBound the time at which backoff should start
+     * @param linkId the ID of the given link
      */
     void UpdateBackoffSlotsNow(uint32_t nSlots, Time backoffUpdateBound, uint8_t linkId);
 
@@ -516,16 +527,19 @@
         /// Destructor (a virtual method is needed to make this struct polymorphic)
         virtual ~LinkEntity() = default;
 
-        uint32_t backoffSlots{0};                  //!< the number of backoff slots
-        Time backoffStart{0};                      /**< the backoffStart variable is used to keep
-                                                        track of the time at which a backoff was
-                                                        started or the time at which the backoff
-                                                        counter was last updated */
-        uint32_t cw{0};                            //!< the current contention window
-        uint32_t cwMin{0};                         //!< the minimum contention window
-        uint32_t cwMax{0};                         //!< the maximum contention window
-        uint8_t aifsn{0};                          //!< the AIFSN
-        Time txopLimit{0};                         //!< the TXOP limit time
+        uint32_t backoffSlots{0};     //!< the number of backoff slots
+        Time backoffStart{0};         /**< the backoffStart variable is used to keep
+                                           track of the time at which a backoff was
+                                           started or the time at which the backoff
+                                           counter was last updated */
+        uint32_t cw{0};               //!< the current contention window
+        uint32_t cwMin{0};            //!< the minimum contention window
+        uint32_t cwMax{0};            //!< the maximum contention window
+        uint8_t aifsn{0};             //!< the AIFSN
+        Time txopLimit{0};            //!< the TXOP limit time
+        std::size_t staRetryCount{0}; //!< the Station Short Retry Count (SSRC) maintained by
+                                      //!< non-QoS stations or the QoS STA Retry Count (QSRC)
+                                      //!< maintained by QoS STAs for each AC
         ChannelAccessStatus access{NOT_REQUESTED}; //!< channel access status
 
         mutable class
@@ -538,13 +552,13 @@
     /**
      * Get a reference to the link associated with the given ID.
      *
-     * \param linkId the given link ID
-     * \return a reference to the link associated with the given ID
+     * @param linkId the given link ID
+     * @return a reference to the link associated with the given ID
      */
     LinkEntity& GetLink(uint8_t linkId) const;
 
     /**
-     * \return a const reference to the map of link entities
+     * @return a const reference to the map of link entities
      */
     const std::map<uint8_t, std::unique_ptr<LinkEntity>>& GetLinks() const;
 
@@ -567,7 +581,7 @@
     /**
      * Create a LinkEntity object.
      *
-     * \return a unique pointer to the created LinkEntity object
+     * @return a unique pointer to the created LinkEntity object
      */
     virtual std::unique_ptr<LinkEntity> CreateLinkEntity() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/vht/vht-capabilities.h ns-3.44/src/wifi/model/vht/vht-capabilities.h
--- ns-3.43/src/wifi/model/vht/vht-capabilities.h	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/vht/vht-capabilities.h	2025-03-09 16:55:49.799372700 -0700
@@ -16,7 +16,7 @@
 {
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * The IEEE 802.11ac VHT Capabilities
  */
@@ -32,26 +32,26 @@
     /**
      * Set the VHT Capabilities Info field in the VHT Capabilities information element.
      *
-     * \param ctrl the VHT Capabilities Info field in the VHT Capabilities information element
+     * @param ctrl the VHT Capabilities Info field in the VHT Capabilities information element
      */
     void SetVhtCapabilitiesInfo(uint32_t ctrl);
     /**
      * Set the MCS and NSS field in the VHT Capabilities information element.
      *
-     * \param ctrl the MCS and NSS field in the VHT Capabilities information element
+     * @param ctrl the MCS and NSS field in the VHT Capabilities information element
      */
     void SetSupportedMcsAndNssSet(uint64_t ctrl);
 
     /**
      * Return the VHT Capabilities Info field in the VHT Capabilities information element.
      *
-     * \return the VHT Capabilities Info field in the VHT Capabilities information element
+     * @return the VHT Capabilities Info field in the VHT Capabilities information element
      */
     uint32_t GetVhtCapabilitiesInfo() const;
     /**
      * Return the MCS and NSS field in the VHT Capabilities information element.
      *
-     * \return the MCS and NSS field in the VHT Capabilities information element
+     * @return the MCS and NSS field in the VHT Capabilities information element
      */
     uint64_t GetSupportedMcsAndNssSet() const;
 
@@ -59,140 +59,140 @@
     /**
      * Set the maximum MPDU length.
      *
-     * \param length the maximum MPDU length (3895, 7991 or 11454)
+     * @param length the maximum MPDU length (3895, 7991 or 11454)
      */
     void SetMaxMpduLength(uint16_t length);
     /**
      * Set the supported channel width set.
      *
-     * \param channelWidthSet the supported channel width set
+     * @param channelWidthSet the supported channel width set
      */
     void SetSupportedChannelWidthSet(uint8_t channelWidthSet);
     /**
      * Set the receive LDPC.
      *
-     * \param rxLdpc the receive LDPC
+     * @param rxLdpc the receive LDPC
      */
     void SetRxLdpc(uint8_t rxLdpc);
     /**
      * Set the short guard interval 80 MHz.
      *
-     * \param shortGuardInterval the short guard interval 80 MHz
+     * @param shortGuardInterval the short guard interval 80 MHz
      */
     void SetShortGuardIntervalFor80Mhz(uint8_t shortGuardInterval);
     /**
      * Set the short guard interval 160 MHz.
      *
-     * \param shortGuardInterval the short guard interval 160 MHz
+     * @param shortGuardInterval the short guard interval 160 MHz
      */
     void SetShortGuardIntervalFor160Mhz(uint8_t shortGuardInterval);
     /**
      * Set the receive STBC.
      *
-     * \param rxStbc the receive STBC
+     * @param rxStbc the receive STBC
      */
     void SetRxStbc(uint8_t rxStbc);
     /**
      * Set the transmit STBC.
      *
-     * \param txStbc the receive STBC
+     * @param txStbc the receive STBC
      */
     void SetTxStbc(uint8_t txStbc);
     /**
      * Set the maximum AMPDU length.
      *
-     * \param maxAmpduLength 2^(13 + x) - 1, x in the range 0 to 7
+     * @param maxAmpduLength 2^(13 + x) - 1, x in the range 0 to 7
      */
     void SetMaxAmpduLength(uint32_t maxAmpduLength);
 
     /**
      * Get the maximum MPDU length.
      *
-     * \return the maximum MPDU length in bytes
+     * @return the maximum MPDU length in bytes
      */
     uint16_t GetMaxMpduLength() const;
     /**
      * Get the supported channel width set.
      *
-     * \returns the supported channel width set
+     * @returns the supported channel width set
      */
     uint8_t GetSupportedChannelWidthSet() const;
     /**
      * Get the receive LDPC.
      *
-     * \returns the receive LDPC
+     * @returns the receive LDPC
      */
     uint8_t GetRxLdpc() const;
     /**
      * Get the receive STBC.
      *
-     * \returns the receive STBC
+     * @returns the receive STBC
      */
     uint8_t GetRxStbc() const;
     /**
      * Get the transmit STBC.
      *
-     * \returns the transmit STBC
+     * @returns the transmit STBC
      */
     uint8_t GetTxStbc() const;
 
     /**
-     * \param mcs Max MCS value (between 7 and 9)
-     * \param nss Spatial stream for which the Max MCS value is being set
+     * @param mcs Max MCS value (between 7 and 9)
+     * @param nss Spatial stream for which the Max MCS value is being set
      */
     void SetRxMcsMap(uint8_t mcs, uint8_t nss);
     /**
-     * \param mcs Max MCS value (between 7 and 9)
-     * \param nss Spatial stream for which the Max MCS value is being set
+     * @param mcs Max MCS value (between 7 and 9)
+     * @param nss Spatial stream for which the Max MCS value is being set
      */
     void SetTxMcsMap(uint8_t mcs, uint8_t nss);
     /**
      * Set the receive highest supported LGI data rate.
      *
-     * \param supportedDatarate receive highest supported LGI data rate
+     * @param supportedDatarate receive highest supported LGI data rate
      */
     void SetRxHighestSupportedLgiDataRate(uint16_t supportedDatarate);
     /**
      * Set the transmit highest supported LGI data rate.
      *
-     * \param supportedDatarate transmit highest supported LGI data rate
+     * @param supportedDatarate transmit highest supported LGI data rate
      */
     void SetTxHighestSupportedLgiDataRate(uint16_t supportedDatarate);
     /**
      * Get the is MCS supported.
      *
-     * \param mcs the MCS
-     * \param nss the NSS
-     * \returns the is MCS supported
+     * @param mcs the MCS
+     * @param nss the NSS
+     * @returns the is MCS supported
      */
     bool IsSupportedMcs(uint8_t mcs, uint8_t nss) const;
 
     /**
      * Get the receive highest supported LGI data rate.
      *
-     * \returns the receive highest supported LGI data rate.
+     * @returns the receive highest supported LGI data rate.
      */
     uint16_t GetRxHighestSupportedLgiDataRate() const;
 
     /**
      * Returns true if transmit MCS is supported.
      *
-     * \param mcs the MCS
-     * \returns whether transmit MCS is supported
+     * @param mcs the MCS
+     * @returns whether transmit MCS is supported
      */
     bool IsSupportedTxMcs(uint8_t mcs) const;
     /**
      * Returns true if receive MCS is supported.
      *
-     * \param mcs the MCS
-     * \returns whether receive MCS is supported
+     * @param mcs the MCS
+     * @returns whether receive MCS is supported
      */
     bool IsSupportedRxMcs(uint8_t mcs) const;
 
     /**
      * Return the maximum A-MPDU length.
      *
-     * \return the maximum A-MPDU length in bytes
+     * @return the maximum A-MPDU length in bytes
      */
     uint32_t GetMaxAmpduLength() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/vht/vht-configuration.cc ns-3.44/src/wifi/model/vht/vht-configuration.cc
--- ns-3.43/src/wifi/model/vht/vht-configuration.cc	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/vht/vht-configuration.cc	2025-03-09 16:55:49.799372700 -0700
@@ -42,8 +42,7 @@
             .AddAttribute("Support160MHzOperation",
                           "Whether or not 160 MHz operation is to be supported.",
                           BooleanValue(true),
-                          MakeBooleanAccessor(&VhtConfiguration::Get160MHzOperationSupported,
-                                              &VhtConfiguration::Set160MHzOperationSupported),
+                          MakeBooleanAccessor(&VhtConfiguration::m_160MHzSupported),
                           MakeBooleanChecker())
             .AddAttribute("SecondaryCcaSensitivityThresholds",
                           "Tuple {threshold for 20MHz PPDUs, threshold for 40MHz PPDUs, threshold "
@@ -83,17 +82,17 @@
     const SecondaryCcaSensitivityThresholds& thresholds)
 {
     NS_LOG_FUNCTION(this);
-    m_secondaryCcaSensitivityThresholds[20] = std::get<0>(thresholds);
-    m_secondaryCcaSensitivityThresholds[40] = std::get<1>(thresholds);
-    m_secondaryCcaSensitivityThresholds[80] = std::get<2>(thresholds);
+    m_secondaryCcaSensitivityThresholds[MHz_u{20}] = std::get<0>(thresholds);
+    m_secondaryCcaSensitivityThresholds[MHz_u{40}] = std::get<1>(thresholds);
+    m_secondaryCcaSensitivityThresholds[MHz_u{80}] = std::get<2>(thresholds);
 }
 
 VhtConfiguration::SecondaryCcaSensitivityThresholds
 VhtConfiguration::GetSecondaryCcaSensitivityThresholds() const
 {
-    return {m_secondaryCcaSensitivityThresholds.at(20),
-            m_secondaryCcaSensitivityThresholds.at(40),
-            m_secondaryCcaSensitivityThresholds.at(80)};
+    return {m_secondaryCcaSensitivityThresholds.at(MHz_u{20}),
+            m_secondaryCcaSensitivityThresholds.at(MHz_u{40}),
+            m_secondaryCcaSensitivityThresholds.at(MHz_u{80})};
 }
 
 const std::map<MHz_u, dBm_u>&
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/vht/vht-configuration.h ns-3.44/src/wifi/model/vht/vht-configuration.h
--- ns-3.43/src/wifi/model/vht/vht-configuration.h	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/vht/vht-configuration.h	2025-03-09 16:55:49.799372700 -0700
@@ -9,6 +9,7 @@
 #ifndef VHT_CONFIGURATION_H
 #define VHT_CONFIGURATION_H
 
+#include "ns3/deprecated.h"
 #include "ns3/object.h"
 #include "ns3/wifi-units.h"
 
@@ -19,8 +20,8 @@
 {
 
 /**
- * \brief VHT configuration
- * \ingroup wifi
+ * @brief VHT configuration
+ * @ingroup wifi
  *
  * This object stores VHT configuration information, for use in modifying
  * AP or STA behavior and for constructing VHT-related information elements.
@@ -33,22 +34,25 @@
     ~VhtConfiguration() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
      * Enable or disable 160 MHz operation support.
      *
-     * \param enable true if 20 MHz, 40 MHz, 80 MHz and 160 MHz operation is to be supported,
+     * @param enable true if 20 MHz, 40 MHz, 80 MHz and 160 MHz operation is to be supported,
      *               false if 20 MHz, 40 MHz and 80 MHz operation is to be supported
      */
+    NS_DEPRECATED_3_44("Set the m_160MHzSupported member variable instead")
     void Set160MHzOperationSupported(bool enable);
+
     /**
-     * \return true if 20 MHz, 40 MHz, 80 MHz and 160 MHz operation is supported,
+     * @return true if 20 MHz, 40 MHz, 80 MHz and 160 MHz operation is supported,
      *         false if 20 MHz, 40 MHz and 80 MHz operation is supported
      */
+    NS_DEPRECATED_3_44("Get the m_160MHzSupported member variable instead")
     bool Get160MHzOperationSupported() const;
 
     using SecondaryCcaSensitivityThresholds =
@@ -60,22 +64,23 @@
      * The thresholds are defined as a tuple {threshold for 20MHz PPDUs,
      * threshold for 40MHz PPDUs, threshold for 80MHz PPDUs}.
      *
-     * \param thresholds the CCA sensitivity thresholds
+     * @param thresholds the CCA sensitivity thresholds
      */
     void SetSecondaryCcaSensitivityThresholds(const SecondaryCcaSensitivityThresholds& thresholds);
     /**
-     * \return the CCA sensitivity thresholds for PPDUs that do not occupy the primary channel
+     * @return the CCA sensitivity thresholds for PPDUs that do not occupy the primary channel
      */
     SecondaryCcaSensitivityThresholds GetSecondaryCcaSensitivityThresholds() const;
 
     /**
-     * \return the CCA sensitivity thresholds for PPDUs that do not occupy the primary channel,
+     * @return the CCA sensitivity thresholds for PPDUs that do not occupy the primary channel,
      * indexed by signal bandwidth
      */
     const std::map<MHz_u, dBm_u>& GetSecondaryCcaSensitivityThresholdsPerBw() const;
 
-  private:
     bool m_160MHzSupported; ///< whether 160 MHz operation is supported
+
+  private:
     std::map<MHz_u, dBm_u>
         m_secondaryCcaSensitivityThresholds; ///< CCA sensitivity thresholds for signals that do not
                                              ///< occupy the primary channel, indexed by signal
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/vht/vht-frame-exchange-manager.h ns-3.44/src/wifi/model/vht/vht-frame-exchange-manager.h
--- ns-3.43/src/wifi/model/vht/vht-frame-exchange-manager.h	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/vht/vht-frame-exchange-manager.h	2025-03-09 16:55:49.799372700 -0700
@@ -15,7 +15,7 @@
 {
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * VhtFrameExchangeManager handles the frame exchange sequences
  * for VHT stations.
@@ -24,15 +24,16 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     VhtFrameExchangeManager();
     ~VhtFrameExchangeManager() override;
 
-  protected:
     Ptr<WifiPsdu> GetWifiPsdu(Ptr<WifiMpdu> mpdu, const WifiTxVector& txVector) const override;
+
+  protected:
     uint32_t GetPsduSize(Ptr<const WifiMpdu> mpdu, const WifiTxVector& txVector) const override;
 };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/vht/vht-operation.h ns-3.44/src/wifi/model/vht/vht-operation.h
--- ns-3.43/src/wifi/model/vht/vht-operation.h	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/vht/vht-operation.h	2025-03-09 16:55:49.799372700 -0700
@@ -15,8 +15,8 @@
 {
 
 /**
- * \brief The VHT Operation Information Element
- * \ingroup wifi
+ * @brief The VHT Operation Information Element
+ * @ingroup wifi
  *
  * This class knows how to serialise and deserialise
  * the VHT Operation Information Element
@@ -33,27 +33,27 @@
     /**
      * Set the Channel Width field in the VHT Operation information element.
      *
-     * \param channelWidth the Channel Width field in the VHT Operation information element
+     * @param channelWidth the Channel Width field in the VHT Operation information element
      */
     void SetChannelWidth(uint8_t channelWidth);
     /**
      * Set the Channel Center Frequency Segment 0 field in the VHT Operation information element.
      *
-     * \param channelCenterFrequencySegment0 the Channel Center Frequency Segment 0 field in the VHT
+     * @param channelCenterFrequencySegment0 the Channel Center Frequency Segment 0 field in the VHT
      * Operation information element
      */
     void SetChannelCenterFrequencySegment0(uint8_t channelCenterFrequencySegment0);
     /**
      * Set the Channel Center Frequency Segment 1 field in the VHT Operation information element.
      *
-     * \param channelCenterFrequencySegment1 the Channel Center Frequency Segment 1 field in the VHT
+     * @param channelCenterFrequencySegment1 the Channel Center Frequency Segment 1 field in the VHT
      * Operation information element
      */
     void SetChannelCenterFrequencySegment1(uint8_t channelCenterFrequencySegment1);
     /**
      * Set the Basic VHT-MCS and NSS field in the VHT Operation information element.
      *
-     * \param basicVhtMcsAndNssSet the Basic VHT-MCS and NSS field in the VHT Operation information
+     * @param basicVhtMcsAndNssSet the Basic VHT-MCS and NSS field in the VHT Operation information
      * element
      */
     void SetBasicVhtMcsAndNssSet(uint16_t basicVhtMcsAndNssSet);
@@ -61,33 +61,33 @@
      * Set the Basic VHT-MCS and NSS field in the VHT Operation information element
      * by specifying the tuple (nss, maxMcs).
      *
-     * \param nss the NSS
-     * \param maxVhtMcs the maximum supported VHT-MCS value corresponding to that NSS
+     * @param nss the NSS
+     * @param maxVhtMcs the maximum supported VHT-MCS value corresponding to that NSS
      */
     void SetMaxVhtMcsPerNss(uint8_t nss, uint8_t maxVhtMcs);
 
     /**
      * Return the Channel Width field in the VHT Operation information element.
      *
-     * \return the Channel Width field in the VHT Operation information element
+     * @return the Channel Width field in the VHT Operation information element
      */
     uint8_t GetChannelWidth() const;
     /**
      * Return the Channel Center Frequency Segment 0 field in the VHT Operation information element.
      *
-     * \return the Channel Center Frequency Segment 0 field in the VHT Operation information element
+     * @return the Channel Center Frequency Segment 0 field in the VHT Operation information element
      */
     uint8_t GetChannelCenterFrequencySegment0() const;
     /**
      * Return the Channel Center Frequency Segment 1 field in the VHT Operation information element.
      *
-     * \return the Channel Center Frequency Segment 1 field in the VHT Operation information element
+     * @return the Channel Center Frequency Segment 1 field in the VHT Operation information element
      */
     uint8_t GetChannelCenterFrequencySegment1() const;
     /**
      * Return the Basic VHT-MCS And Nss field in the VHT Operation information element.
      *
-     * \return the Basic VHT-MCS And Nss field in the VHT Operation information element
+     * @return the Basic VHT-MCS And Nss field in the VHT Operation information element
      */
     uint16_t GetBasicVhtMcsAndNssSet() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/vht/vht-phy.cc ns-3.44/src/wifi/model/vht/vht-phy.cc
--- ns-3.43/src/wifi/model/vht/vht-phy.cc	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/vht/vht-phy.cc	2025-03-09 16:55:49.799372700 -0700
@@ -50,40 +50,40 @@
 
 const VhtPhy::NesExceptionMap VhtPhy::m_exceptionsMap {
                     /* {BW,Nss,MCS} Nes */
-    { std::make_tuple ( 80, 7, 2),  3 }, // instead of 2
-    { std::make_tuple ( 80, 7, 7),  6 }, // instead of 4
-    { std::make_tuple ( 80, 7, 8),  6 }, // instead of 5
-    { std::make_tuple ( 80, 8, 7),  6 }, // instead of 5
-    { std::make_tuple (160, 4, 7),  6 }, // instead of 5
-    { std::make_tuple (160, 5, 8),  8 }, // instead of 7
-    { std::make_tuple (160, 6, 7),  8 }, // instead of 7
-    { std::make_tuple (160, 7, 3),  4 }, // instead of 3
-    { std::make_tuple (160, 7, 4),  6 }, // instead of 5
-    { std::make_tuple (160, 7, 5),  7 }, // instead of 6
-    { std::make_tuple (160, 7, 7),  9 }, // instead of 8
-    { std::make_tuple (160, 7, 8), 12 }, // instead of 9
-    { std::make_tuple (160, 7, 9), 12 }, // instead of 10
+    { std::make_tuple (MHz_u{80}, 7, 2),  3 }, // instead of 2
+    { std::make_tuple (MHz_u{80}, 7, 7),  6 }, // instead of 4
+    { std::make_tuple (MHz_u{80}, 7, 8),  6 }, // instead of 5
+    { std::make_tuple (MHz_u{80}, 8, 7),  6 }, // instead of 5
+    { std::make_tuple (MHz_u{160}, 4, 7),  6 }, // instead of 5
+    { std::make_tuple (MHz_u{160}, 5, 8),  8 }, // instead of 7
+    { std::make_tuple (MHz_u{160}, 6, 7),  8 }, // instead of 7
+    { std::make_tuple (MHz_u{160}, 7, 3),  4 }, // instead of 3
+    { std::make_tuple (MHz_u{160}, 7, 4),  6 }, // instead of 5
+    { std::make_tuple (MHz_u{160}, 7, 5),  7 }, // instead of 6
+    { std::make_tuple (MHz_u{160}, 7, 7),  9 }, // instead of 8
+    { std::make_tuple (MHz_u{160}, 7, 8), 12 }, // instead of 9
+    { std::make_tuple (MHz_u{160}, 7, 9), 12 }, // instead of 10
 };
 
 // clang-format on
 
 /**
- * \brief map a given channel list type to the corresponding scaling factor
+ * @brief map a given channel list type to the corresponding scaling factor
  */
 const std::map<WifiChannelListType, dBm_u> channelTypeToScalingFactor{
-    {WIFI_CHANLIST_PRIMARY, 0.0},
-    {WIFI_CHANLIST_SECONDARY, 0.0},
-    {WIFI_CHANLIST_SECONDARY40, 3.0},
-    {WIFI_CHANLIST_SECONDARY80, 6.0},
+    {WIFI_CHANLIST_PRIMARY, dBm_u{0.0}},
+    {WIFI_CHANLIST_SECONDARY, dBm_u{0.0}},
+    {WIFI_CHANLIST_SECONDARY40, dBm_u{3.0}},
+    {WIFI_CHANLIST_SECONDARY80, dBm_u{6.0}},
 };
 
 /**
- * \brief map a given secondary channel width to its channel list type
+ * @brief map a given secondary channel width to its channel list type
  */
 const std::map<MHz_u, WifiChannelListType> secondaryChannels{
-    {20, WIFI_CHANLIST_SECONDARY},
-    {40, WIFI_CHANLIST_SECONDARY40},
-    {80, WIFI_CHANLIST_SECONDARY80},
+    {MHz_u{20}, WIFI_CHANLIST_SECONDARY},
+    {MHz_u{40}, WIFI_CHANLIST_SECONDARY40},
+    {MHz_u{80}, WIFI_CHANLIST_SECONDARY80},
 };
 
 VhtPhy::VhtPhy(bool buildModeList /* = true */)
@@ -516,11 +516,11 @@
 bool
 VhtPhy::IsCombinationAllowed(uint8_t mcsValue, MHz_u channelWidth, uint8_t nss)
 {
-    if (mcsValue == 9 && channelWidth == 20 && nss != 3)
+    if (mcsValue == 9 && channelWidth == MHz_u{20} && nss != 3)
     {
         return false;
     }
-    if (mcsValue == 6 && channelWidth == 80 && nss == 3)
+    if (mcsValue == 6 && channelWidth == MHz_u{80} && nss == 3)
     {
         return false;
     }
@@ -547,13 +547,13 @@
             return m_wifiPhy->GetCcaSensitivityThreshold();
         }
         case WIFI_CHANLIST_SECONDARY:
-            NS_ASSERT_MSG(ppduBw == 20, "Invalid channel width " << ppduBw);
+            NS_ASSERT_MSG(ppduBw == MHz_u{20}, "Invalid channel width " << ppduBw);
             break;
         case WIFI_CHANLIST_SECONDARY40:
-            NS_ASSERT_MSG(ppduBw <= 40, "Invalid channel width " << ppduBw);
+            NS_ASSERT_MSG(ppduBw <= MHz_u{40}, "Invalid channel width " << ppduBw);
             break;
         case WIFI_CHANLIST_SECONDARY80:
-            NS_ASSERT_MSG(ppduBw <= 80, "Invalid channel width " << ppduBw);
+            NS_ASSERT_MSG(ppduBw <= MHz_u{80}, "Invalid channel width " << ppduBw);
             break;
         default:
             NS_ASSERT_MSG(false, "Invalid channel list type");
@@ -592,7 +592,7 @@
 
     if (ppdu)
     {
-        const MHz_u primaryWidth = 20;
+        const MHz_u primaryWidth{20};
         const MHz_u p20MinFreq =
             m_wifiPhy->GetOperatingChannel().GetPrimaryChannelCenterFrequency(primaryWidth) -
             (primaryWidth / 2);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/vht/vht-phy.h ns-3.44/src/wifi/model/vht/vht-phy.h
--- ns-3.43/src/wifi/model/vht/vht-phy.h	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/vht/vht-phy.h	2025-03-09 16:55:49.799372700 -0700
@@ -13,8 +13,8 @@
 #include "ns3/ht-phy.h"
 
 /**
- * \file
- * \ingroup wifi
+ * @file
+ * @ingroup wifi
  * Declaration of ns3::VhtPhy class.
  */
 
@@ -27,8 +27,8 @@
 #define VHT_PHY 126
 
 /**
- * \brief PHY entity for VHT (11ac)
- * \ingroup wifi
+ * @brief PHY entity for VHT (11ac)
+ * @ingroup wifi
  *
  * VHT PHY is based on HT PHY.
  *
@@ -40,7 +40,7 @@
     /**
      * Constructor for VHT PHY
      *
-     * \param buildModeList flag used to add VHT modes to list (disabled
+     * @param buildModeList flag used to add VHT modes to list (disabled
      *                      by child classes to only add child classes' modes)
      */
     VhtPhy(bool buildModeList = true);
@@ -63,23 +63,23 @@
                           WifiChannelListType channelType) const override;
 
     /**
-     * \return the WifiMode used for the SIG-A field
+     * @return the WifiMode used for the SIG-A field
      */
     virtual WifiMode GetSigAMode() const;
     /**
-     * \param txVector the transmission parameters
-     * \return the WifiMode used for the SIG-B field
+     * @param txVector the transmission parameters
+     * @return the WifiMode used for the SIG-B field
      */
     virtual WifiMode GetSigBMode(const WifiTxVector& txVector) const;
 
     /**
-     * \param preamble the type of preamble
-     * \return the duration of the SIG-A field
+     * @param preamble the type of preamble
+     * @return the duration of the SIG-A field
      */
     virtual Time GetSigADuration(WifiPreamble preamble) const;
     /**
-     * \param txVector the transmission parameters
-     * \return the duration of the SIG-B field
+     * @param txVector the transmission parameters
+     * @return the duration of the SIG-B field
      */
     virtual Time GetSigBDuration(const WifiTxVector& txVector) const;
 
@@ -91,69 +91,69 @@
      * Return the VHT MCS corresponding to
      * the provided index.
      *
-     * \param index the index of the MCS
-     * \return an VHT MCS
+     * @param index the index of the MCS
+     * @return an VHT MCS
      */
     static WifiMode GetVhtMcs(uint8_t index);
 
     /**
      * Return MCS 0 from VHT MCS values.
      *
-     * \return MCS 0 from VHT MCS values
+     * @return MCS 0 from VHT MCS values
      */
     static WifiMode GetVhtMcs0();
     /**
      * Return MCS 1 from VHT MCS values.
      *
-     * \return MCS 1 from VHT MCS values
+     * @return MCS 1 from VHT MCS values
      */
     static WifiMode GetVhtMcs1();
     /**
      * Return MCS 2 from VHT MCS values.
      *
-     * \return MCS 2 from VHT MCS values
+     * @return MCS 2 from VHT MCS values
      */
     static WifiMode GetVhtMcs2();
     /**
      * Return MCS 3 from VHT MCS values.
      *
-     * \return MCS 3 from VHT MCS values
+     * @return MCS 3 from VHT MCS values
      */
     static WifiMode GetVhtMcs3();
     /**
      * Return MCS 4 from VHT MCS values.
      *
-     * \return MCS 4 from VHT MCS values
+     * @return MCS 4 from VHT MCS values
      */
     static WifiMode GetVhtMcs4();
     /**
      * Return MCS 5 from VHT MCS values.
      *
-     * \return MCS 5 from VHT MCS values
+     * @return MCS 5 from VHT MCS values
      */
     static WifiMode GetVhtMcs5();
     /**
      * Return MCS 6 from VHT MCS values.
      *
-     * \return MCS 6 from VHT MCS values
+     * @return MCS 6 from VHT MCS values
      */
     static WifiMode GetVhtMcs6();
     /**
      * Return MCS 7 from VHT MCS values.
      *
-     * \return MCS 7 from VHT MCS values
+     * @return MCS 7 from VHT MCS values
      */
     static WifiMode GetVhtMcs7();
     /**
      * Return MCS 8 from VHT MCS values.
      *
-     * \return MCS 8 from VHT MCS values
+     * @return MCS 8 from VHT MCS values
      */
     static WifiMode GetVhtMcs8();
     /**
      * Return MCS 9 from VHT MCS values.
      *
-     * \return MCS 9 from VHT MCS values
+     * @return MCS 9 from VHT MCS values
      */
     static WifiMode GetVhtMcs9();
 
@@ -163,8 +163,8 @@
      * reused by child classes and is used as a callback
      * for WifiMode operation.
      *
-     * \param mcsValue the MCS index
-     * \return the coding rate.
+     * @param mcsValue the MCS index
+     * @return the coding rate.
      */
     static WifiCodeRate GetCodeRate(uint8_t mcsValue);
     /**
@@ -173,8 +173,8 @@
      * reused by child classes and is used as a callback for
      * WifiMode operation.
      *
-     * \param mcsValue the MCS index
-     * \return the size of modulation constellation.
+     * @param mcsValue the MCS index
+     * @return the size of modulation constellation.
      */
     static uint16_t GetConstellationSize(uint8_t mcsValue);
     /**
@@ -183,12 +183,12 @@
      * spatial stream. This function calls HtPhy::CalculatePhyRate
      * and is mainly used as a callback for WifiMode operation.
      *
-     * \param mcsValue the VHT MCS index
-     * \param channelWidth the considered channel width
-     * \param guardInterval the considered guard interval duration
-     * \param nss the considered number of stream
+     * @param mcsValue the VHT MCS index
+     * @param channelWidth the considered channel width
+     * @param guardInterval the considered guard interval duration
+     * @param nss the considered number of stream
      *
-     * \return the physical bit rate of this signal in bps.
+     * @return the physical bit rate of this signal in bps.
      */
     static uint64_t GetPhyRate(uint8_t mcsValue,
                                MHz_u channelWidth,
@@ -200,9 +200,9 @@
      * This function is mainly used as a callback
      * for WifiMode operation.
      *
-     * \param txVector the TXVECTOR used for the transmission
-     * \param staId the station ID (only here to have a common signature for all callbacks)
-     * \return the physical bit rate of this signal in bps.
+     * @param txVector the TXVECTOR used for the transmission
+     * @param staId the station ID (only here to have a common signature for all callbacks)
+     * @return the physical bit rate of this signal in bps.
      */
     static uint64_t GetPhyRateFromTxVector(const WifiTxVector& txVector, uint16_t staId);
     /**
@@ -211,9 +211,9 @@
      * This function is mainly used as a callback
      * for WifiMode operation.
      *
-     * \param txVector the TXVECTOR used for the transmission
-     * \param staId the station ID (only here to have a common signature for all callbacks)
-     * \return the data bit rate in bps.
+     * @param txVector the TXVECTOR used for the transmission
+     * @param staId the station ID (only here to have a common signature for all callbacks)
+     * @return the data bit rate in bps.
      */
     static uint64_t GetDataRateFromTxVector(const WifiTxVector& txVector, uint16_t staId);
     /**
@@ -222,11 +222,11 @@
      * guard interval, and number of spatial
      * streams.
      *
-     * \param mcsValue the MCS index
-     * \param channelWidth the channel width
-     * \param guardInterval the guard interval duration
-     * \param nss the number of spatial streams
-     * \return the data bit rate in bps.
+     * @param mcsValue the MCS index
+     * @param channelWidth the channel width
+     * @param guardInterval the guard interval duration
+     * @param nss the number of spatial streams
+     * @return the data bit rate in bps.
      */
     static uint64_t GetDataRate(uint8_t mcsValue,
                                 MHz_u channelWidth,
@@ -237,26 +237,26 @@
      * to the supplied VHT MCS index. This function calls CalculateNonHtReferenceRate
      * and is used as a callback for WifiMode operation.
      *
-     * \param mcsValue the VHT MCS index
-     * \return the rate in bps of the non-HT Reference Rate.
+     * @param mcsValue the VHT MCS index
+     * @return the rate in bps of the non-HT Reference Rate.
      */
     static uint64_t GetNonHtReferenceRate(uint8_t mcsValue);
     /**
      * Check whether the combination of <MCS, channel width, NSS> is allowed.
      * This function is used as a callback for WifiMode operation.
      *
-     * \param mcsValue the considered MCS index
-     * \param channelWidth the considered channel width
-     * \param nss the considered number of streams
-     * \returns true if this <MCS, channel width, NSS> combination is allowed, false otherwise.
+     * @param mcsValue the considered MCS index
+     * @param channelWidth the considered channel width
+     * @param nss the considered number of streams
+     * @returns true if this <MCS, channel width, NSS> combination is allowed, false otherwise.
      */
     static bool IsCombinationAllowed(uint8_t mcsValue, MHz_u channelWidth, uint8_t nss);
     /**
      * Check whether the combination in TXVECTOR is allowed.
      * This function is used as a callback for WifiMode operation.
      *
-     * \param txVector the TXVECTOR
-     * \returns true if this combination is allowed, false otherwise.
+     * @param txVector the TXVECTOR
+     * @returns true if this combination is allowed, false otherwise.
      */
     static bool IsAllowed(const WifiTxVector& txVector);
 
@@ -274,19 +274,19 @@
      * provide the status of the reception.
      *
      * Child classes can perform amendment-specific actions by specializing
-     * \see ProcessSig.
+     * @see ProcessSig.
      *
-     * \param event the event holding incoming PPDU's information
-     * \param field the current PPDU field
-     * \return status of the reception of the SIG-A of SIG-B
+     * @param event the event holding incoming PPDU's information
+     * @param field the current PPDU field
+     * @return status of the reception of the SIG-A of SIG-B
      */
     PhyFieldRxStatus EndReceiveSig(Ptr<Event> event, WifiPpduField field);
 
     /**
      * Get the failure reason corresponding to the unsuccessful processing of a given PPDU field.
      *
-     * \param field the PPDU field
-     * \return the failure reason corresponding to the unsuccessful processing of the PPDU field
+     * @param field the PPDU field
+     * @return the failure reason corresponding to the unsuccessful processing of the PPDU field
      */
     virtual WifiPhyRxfailureReason GetFailureReason(WifiPpduField field) const;
 
@@ -294,11 +294,11 @@
      * Process SIG-A or SIG-B, perform amendment-specific actions, and
      * provide an updated status of the reception.
      *
-     * \param event the event holding incoming PPDU's information
-     * \param status the status of the reception of the correctly received SIG-A or SIG-B after the
+     * @param event the event holding incoming PPDU's information
+     * @param status the status of the reception of the correctly received SIG-A or SIG-B after the
      * configuration support check
-     * \param field the current PPDU field to identify whether it is SIG-A or SIG-B
-     * \return the updated status of the reception of the SIG-A or SIG-B
+     * @param field the current PPDU field to identify whether it is SIG-A or SIG-B
+     * @return the updated status of the reception of the SIG-A or SIG-B
      */
     virtual PhyFieldRxStatus ProcessSig(Ptr<Event> event,
                                         PhyFieldRxStatus status,
@@ -309,9 +309,9 @@
      * which corresponds to the supplied code rate and
      * constellation size.
      *
-     * \param codeRate the convolutional coding rate
-     * \param constellationSize the size of modulation constellation
-     * \returns the rate in bps.
+     * @param codeRate the convolutional coding rate
+     * @param constellationSize the size of modulation constellation
+     * @returns the rate in bps.
      *
      * To convert an VHT MCS to its corresponding non-HT Reference Rate
      * use the modulation and coding rate of the HT MCS
@@ -319,8 +319,8 @@
      */
     static uint64_t CalculateNonHtReferenceRate(WifiCodeRate codeRate, uint16_t constellationSize);
     /**
-     * \param channelWidth the channel width
-     * \return he number of usable subcarriers for data
+     * @param channelWidth the channel width
+     * @return he number of usable subcarriers for data
      */
     static uint16_t GetUsableSubcarriers(MHz_u channelWidth);
 
@@ -332,8 +332,8 @@
      * the provided index.
      * This method binds all the callbacks used by WifiMode.
      *
-     * \param index the index of the MCS
-     * \return a VHT MCS
+     * @param index the index of the MCS
+     * @return a VHT MCS
      */
     static WifiMode CreateVhtMcs(uint8_t index);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/vht/vht-ppdu.cc ns-3.44/src/wifi/model/vht/vht-ppdu.cc
--- ns-3.43/src/wifi/model/vht/vht-ppdu.cc	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/vht/vht-ppdu.cc	2025-03-09 16:55:49.799372700 -0700
@@ -150,15 +150,15 @@
 void
 VhtPpdu::VhtSigHeader::SetChannelWidth(MHz_u channelWidth)
 {
-    if (channelWidth == 160)
+    if (channelWidth == MHz_u{160})
     {
         m_bw = 3;
     }
-    else if (channelWidth == 80)
+    else if (channelWidth == MHz_u{80})
     {
         m_bw = 2;
     }
-    else if (channelWidth == 40)
+    else if (channelWidth == MHz_u{40})
     {
         m_bw = 1;
     }
@@ -173,19 +173,19 @@
 {
     if (m_bw == 3)
     {
-        return 160;
+        return MHz_u{160};
     }
     else if (m_bw == 2)
     {
-        return 80;
+        return MHz_u{80};
     }
     else if (m_bw == 1)
     {
-        return 40;
+        return MHz_u{40};
     }
     else
     {
-        return 20;
+        return MHz_u{20};
     }
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/vht/vht-ppdu.h ns-3.44/src/wifi/model/vht/vht-ppdu.h
--- ns-3.43/src/wifi/model/vht/vht-ppdu.h	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/vht/vht-ppdu.h	2025-03-09 16:55:49.799372700 -0700
@@ -15,8 +15,8 @@
 #include "ns3/wifi-phy-operating-channel.h"
 
 /**
- * \file
- * \ingroup wifi
+ * @file
+ * @ingroup wifi
  * Declaration of ns3::VhtPpdu class.
  */
 
@@ -26,8 +26,8 @@
 class WifiPsdu;
 
 /**
- * \brief VHT PPDU (11ac)
- * \ingroup wifi
+ * @brief VHT PPDU (11ac)
+ * @ingroup wifi
  *
  * VhtPpdu stores a preamble, PHY headers and a PSDU of a PPDU with VHT header
  */
@@ -46,69 +46,69 @@
         /**
          * Set the Multi-User (MU) flag.
          *
-         * \param mu the MU flag
+         * @param mu the MU flag
          */
         void SetMuFlag(bool mu);
 
         /**
          * Fill the channel width field of VHT-SIG-A1.
          *
-         * \param channelWidth the channel width
+         * @param channelWidth the channel width
          */
         void SetChannelWidth(MHz_u channelWidth);
         /**
          * Return the channel width.
          *
-         * \return the channel width
+         * @return the channel width
          */
         MHz_u GetChannelWidth() const;
         /**
          * Fill the number of streams field of VHT-SIG-A1.
          *
-         * \param nStreams the number of streams
+         * @param nStreams the number of streams
          */
         void SetNStreams(uint8_t nStreams);
         /**
          * Return the number of streams.
          *
-         * \return the number of streams
+         * @return the number of streams
          */
         uint8_t GetNStreams() const;
 
         /**
          * Fill the short guard interval field of VHT-SIG-A2.
          *
-         * \param sgi whether short guard interval is used or not
+         * @param sgi whether short guard interval is used or not
          */
         void SetShortGuardInterval(bool sgi);
         /**
          * Return the short GI field of VHT-SIG-A2.
          *
-         * \return the short GI field of VHT-SIG-A2
+         * @return the short GI field of VHT-SIG-A2
          */
         bool GetShortGuardInterval() const;
         /**
          * Fill the short GI NSYM disambiguation field of VHT-SIG-A2.
          *
-         * \param disambiguation whether short GI NSYM disambiguation is set or not
+         * @param disambiguation whether short GI NSYM disambiguation is set or not
          */
         void SetShortGuardIntervalDisambiguation(bool disambiguation);
         /**
          * Return the short GI NSYM disambiguation field of VHT-SIG-A2.
          *
-         * \return the short GI NSYM disambiguation field of VHT-SIG-A2
+         * @return the short GI NSYM disambiguation field of VHT-SIG-A2
          */
         bool GetShortGuardIntervalDisambiguation() const;
         /**
          * Fill the SU VHT MCS field of VHT-SIG-A2.
          *
-         * \param mcs the SU VHT MCS field of VHT-SIG-A2
+         * @param mcs the SU VHT MCS field of VHT-SIG-A2
          */
         void SetSuMcs(uint8_t mcs);
         /**
          * Return the SU VHT MCS field of VHT-SIG-A2.
          *
-         * \return the SU VHT MCS field of VHT-SIG-A2
+         * @return the SU VHT MCS field of VHT-SIG-A2
          */
         uint8_t GetSuMcs() const;
 
@@ -129,11 +129,11 @@
     /**
      * Create a VHT PPDU.
      *
-     * \param psdu the PHY payload (PSDU)
-     * \param txVector the TXVECTOR that was used for this PPDU
-     * \param channel the operating channel of the PHY used to transmit this PPDU
-     * \param ppduDuration the transmission duration of this PPDU
-     * \param uid the unique ID of this PPDU
+     * @param psdu the PHY payload (PSDU)
+     * @param txVector the TXVECTOR that was used for this PPDU
+     * @param channel the operating channel of the PHY used to transmit this PPDU
+     * @param ppduDuration the transmission duration of this PPDU
+     * @param uid the unique ID of this PPDU
      */
     VhtPpdu(Ptr<const WifiPsdu> psdu,
             const WifiTxVector& txVector,
@@ -151,25 +151,25 @@
     /**
      * Fill in the PHY headers.
      *
-     * \param txVector the TXVECTOR that was used for this PPDU
-     * \param ppduDuration the transmission duration of this PPDU
+     * @param txVector the TXVECTOR that was used for this PPDU
+     * @param ppduDuration the transmission duration of this PPDU
      */
     virtual void SetPhyHeaders(const WifiTxVector& txVector, Time ppduDuration);
 
     /**
      * Fill in the L-SIG header.
      *
-     * \param lSig the L-SIG header to fill in
-     * \param ppduDuration the transmission duration of this PPDU
+     * @param lSig the L-SIG header to fill in
+     * @param ppduDuration the transmission duration of this PPDU
      */
     virtual void SetLSigHeader(LSigHeader& lSig, Time ppduDuration) const;
 
     /**
      * Fill in the VHT-SIG header.
      *
-     * \param vhtSig the VHT-SIG header to fill in
-     * \param txVector the TXVECTOR that was used for this PPDU
-     * \param ppduDuration the transmission duration of this PPDU
+     * @param vhtSig the VHT-SIG header to fill in
+     * @param txVector the TXVECTOR that was used for this PPDU
+     * @param ppduDuration the transmission duration of this PPDU
      */
     void SetVhtSigHeader(VhtSigHeader& vhtSig,
                          const WifiTxVector& txVector,
@@ -178,9 +178,9 @@
     /**
      * Fill in the TXVECTOR from PHY headers.
      *
-     * \param txVector the TXVECTOR to fill in
-     * \param lSig the L-SIG header
-     * \param vhtSig the VHT-SIG header
+     * @param txVector the TXVECTOR to fill in
+     * @param lSig the L-SIG header
+     * @param vhtSig the VHT-SIG header
      */
     void SetTxVectorFromPhyHeaders(WifiTxVector& txVector,
                                    const LSigHeader& lSig,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-ack-manager.h ns-3.44/src/wifi/model/wifi-ack-manager.h
--- ns-3.43/src/wifi/model/wifi-ack-manager.h	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/wifi-ack-manager.h	2025-03-09 16:55:49.799372700 -0700
@@ -25,7 +25,7 @@
 class WifiRemoteStationManager;
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * WifiAckManager is an abstract base class. Each subclass defines a logic
  * to select the acknowledgment method for a given frame.
@@ -34,8 +34,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     WifiAckManager();
@@ -44,29 +44,29 @@
     /**
      * Set the MAC which is using this Acknowledgment Manager
      *
-     * \param mac a pointer to the MAC
+     * @param mac a pointer to the MAC
      */
     void SetWifiMac(Ptr<WifiMac> mac);
     /**
      * Set the ID of the link this Acknowledgment Manager is associated with.
      *
-     * \param linkId the ID of the link this Acknowledgment Manager is associated with
+     * @param linkId the ID of the link this Acknowledgment Manager is associated with
      */
     void SetLinkId(uint8_t linkId);
 
     /**
      * Set the QoS Ack policy for the given MPDU, which must be a QoS data frame.
      *
-     * \param item the MPDU
-     * \param acknowledgment the WifiAcknowledgment object storing the QoS Ack policy to set
+     * @param item the MPDU
+     * @param acknowledgment the WifiAcknowledgment object storing the QoS Ack policy to set
      */
     static void SetQosAckPolicy(Ptr<WifiMpdu> item, const WifiAcknowledgment* acknowledgment);
 
     /**
      * Set the QoS Ack policy for the given PSDU, which must include at least a QoS data frame.
      *
-     * \param psdu the PSDU
-     * \param acknowledgment the WifiAcknowledgment object storing the QoS Ack policy to set
+     * @param psdu the PSDU
+     * @param acknowledgment the WifiAcknowledgment object storing the QoS Ack policy to set
      */
     static void SetQosAckPolicy(Ptr<WifiPsdu> psdu, const WifiAcknowledgment* acknowledgment);
 
@@ -75,9 +75,9 @@
      * frame. Return a null pointer if the acknowledgment method is unchanged or the new
      * acknowledgment method otherwise.
      *
-     * \param mpdu the MPDU to be added to the current frame
-     * \param txParams the current TX parameters for the current frame
-     * \return a null pointer if the acknowledgment method is unchanged or the new
+     * @param mpdu the MPDU to be added to the current frame
+     * @param txParams the current TX parameters for the current frame
+     * @return a null pointer if the acknowledgment method is unchanged or the new
      *         acknowledgment method otherwise
      */
     virtual std::unique_ptr<WifiAcknowledgment> TryAddMpdu(Ptr<const WifiMpdu> mpdu,
@@ -88,9 +88,9 @@
      * frame. Return a null pointer if the acknowledgment method is unchanged or the new
      * acknowledgment method otherwise.
      *
-     * \param msdu the MSDU to be aggregated to the current frame
-     * \param txParams the current TX parameters for the current frame
-     * \return a null pointer if the acknowledgment method is unchanged or the new
+     * @param msdu the MSDU to be aggregated to the current frame
+     * @param txParams the current TX parameters for the current frame
+     * @return a null pointer if the acknowledgment method is unchanged or the new
      *         acknowledgment method otherwise
      */
     virtual std::unique_ptr<WifiAcknowledgment> TryAggregateMsdu(
@@ -101,7 +101,7 @@
     void DoDispose() override;
 
     /**
-     * \return the remote station manager operating on our link
+     * @return the remote station manager operating on our link
      */
     Ptr<WifiRemoteStationManager> GetWifiRemoteStationManager() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-acknowledgment.h ns-3.44/src/wifi/model/wifi-acknowledgment.h
--- ns-3.43/src/wifi/model/wifi-acknowledgment.h	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/wifi-acknowledgment.h	2025-03-09 16:55:49.799372700 -0700
@@ -26,7 +26,7 @@
 class Mac48Address;
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * WifiAcknowledgment is an abstract base struct. Each derived struct defines an acknowledgment
  * method and stores the information needed to perform acknowledgment according to
@@ -35,8 +35,8 @@
 struct WifiAcknowledgment
 {
     /**
-     * \enum Method
-     * \brief Available acknowledgment methods
+     * @enum Method
+     * @brief Available acknowledgment methods
      */
     enum Method
     {
@@ -53,14 +53,14 @@
 
     /**
      * Constructor.
-     * \param m the acknowledgment method for this object
+     * @param m the acknowledgment method for this object
      */
     WifiAcknowledgment(Method m);
     virtual ~WifiAcknowledgment();
 
     /**
      * Clone this object.
-     * \return a pointer to the cloned object
+     * @return a pointer to the cloned object
      */
     virtual std::unique_ptr<WifiAcknowledgment> Copy() const = 0;
 
@@ -68,9 +68,9 @@
      * Get the QoS Ack policy to use for the MPDUs addressed to the given receiver
      * and belonging to the given TID.
      *
-     * \param receiver the MAC address of the receiver
-     * \param tid the TID
-     * \return the QoS Ack policy to use
+     * @param receiver the MAC address of the receiver
+     * @param tid the TID
+     * @return the QoS Ack policy to use
      */
     WifiMacHeader::QosAckPolicy GetQosAckPolicy(Mac48Address receiver, uint8_t tid) const;
 
@@ -79,15 +79,15 @@
      * and belonging to the given TID. If the pair (receiver, TID) already exists,
      * it is overwritten with the given QoS Ack policy.
      *
-     * \param receiver the MAC address of the receiver
-     * \param tid the TID
-     * \param ackPolicy the QoS Ack policy to use
+     * @param receiver the MAC address of the receiver
+     * @param tid the TID
+     * @param ackPolicy the QoS Ack policy to use
      */
     void SetQosAckPolicy(Mac48Address receiver, uint8_t tid, WifiMacHeader::QosAckPolicy ackPolicy);
 
     /**
-     * \brief Print the object contents.
-     * \param os output stream in which the data should be printed.
+     * @brief Print the object contents.
+     * @param os output stream in which the data should be printed.
      */
     virtual void Print(std::ostream& os) const = 0;
 
@@ -99,10 +99,10 @@
      * Check whether the given QoS Ack policy can be used for the MPDUs addressed
      * to the given receiver and belonging to the given TID.
      *
-     * \param receiver the MAC address of the receiver
-     * \param tid the TID
-     * \param ackPolicy the QoS Ack policy to use
-     * \return true if the given QoS Ack policy can be used, false otherwise
+     * @param receiver the MAC address of the receiver
+     * @param tid the TID
+     * @param ackPolicy the QoS Ack policy to use
+     * @return true if the given QoS Ack policy can be used, false otherwise
      */
     virtual bool CheckQosAckPolicy(Mac48Address receiver,
                                    uint8_t tid,
@@ -113,7 +113,7 @@
 };
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * WifiNoAck specifies that no acknowledgment is required.
  */
@@ -129,7 +129,7 @@
 };
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * WifiNormalAck specifies that acknowledgment via Normal Ack is required.
  */
@@ -147,7 +147,7 @@
 };
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * WifiBlockAck specifies that acknowledgment via Block Ack is required.
  */
@@ -166,7 +166,7 @@
 };
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * WifiBarBlockAck specifies that a BlockAckReq is sent to solicit a Block Ack response.
  */
@@ -187,7 +187,7 @@
 };
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * WifiDlMuBarBaSequence specifies that a DL MU PPDU is acknowledged through a
  * sequence of BlockAckReq and BlockAck frames. Only one station may be allowed
@@ -234,7 +234,7 @@
 };
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * WifiDlMuTfMuBar specifies that a DL MU PPDU is followed after a SIFS duration
  * by a MU-BAR Trigger Frame (sent as single user frame) soliciting BlockAck
@@ -266,7 +266,7 @@
 };
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * WifiDlMuAggregateTf specifies that a DL MU PPDU made of PSDUs including each
  * a MU-BAR Trigger Frame is acknowledged through BlockAck frames sent as
@@ -297,7 +297,7 @@
 };
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * WifiUlMuMultiStaBa specifies that a Basic Trigger Frame is being sent to
  * solicit TB PPDUs that will be acknowledged through a multi-STA BlockAck frame.
@@ -320,7 +320,7 @@
 };
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * WifiAckAfterTbPpdu is used when a station prepares a TB PPDU to send in
  * response to a Basic Trigger Frame. The acknowledgment time must be
@@ -340,11 +340,11 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the output stream
- * \param acknowledgment the acknowledgment method
- * \returns a reference to the stream
+ * @param os the output stream
+ * @param acknowledgment the acknowledgment method
+ * @returns a reference to the stream
  */
 std::ostream& operator<<(std::ostream& os, const WifiAcknowledgment* acknowledgment);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-assoc-manager.cc ns-3.44/src/wifi/model/wifi-assoc-manager.cc
--- ns-3.43/src/wifi/model/wifi-assoc-manager.cc	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/wifi-assoc-manager.cc	2025-03-09 16:55:49.799372700 -0700
@@ -294,8 +294,6 @@
     {
         auto ehtConfig = m_mac->GetEhtConfiguration();
         NS_ASSERT(ehtConfig);
-        EnumValue<WifiTidToLinkMappingNegSupport> negSupport;
-        ehtConfig->GetAttributeFailSafe("TidToLinkMappingNegSupport", negSupport);
 
         // A non-AP MLD that performs multi-link (re)setup on at least two links with an AP MLD
         // that sets the TID-To-Link Mapping Negotiation Support subfield of the MLD Capabilities
@@ -304,7 +302,7 @@
         // MLD Capabilities field of the Basic Multi-Link element it transmits to at least 1.
         // (Sec. 35.3.7.1.1 of 802.11be D3.1)
         if (mldCapabilities->tidToLinkMappingSupport > 0 &&
-            negSupport.Get() == WifiTidToLinkMappingNegSupport::NOT_SUPPORTED)
+            ehtConfig->m_tidLinkMappingSupport == WifiTidToLinkMappingNegSupport::NOT_SUPPORTED)
         {
             NS_LOG_DEBUG("AP MLD supports TID-to-Link Mapping negotiation, while we don't");
             return false;
@@ -330,7 +328,7 @@
 
         std::size_t tbttInfoFieldIndex = 0;
         while (tbttInfoFieldIndex < rnr.GetNTbttInformationFields(nbrApInfoId) &&
-               rnr.GetMldId(nbrApInfoId, tbttInfoFieldIndex) != 0)
+               rnr.GetMldParameters(nbrApInfoId, tbttInfoFieldIndex).apMldId != 0)
         {
             tbttInfoFieldIndex++;
         }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-assoc-manager.h ns-3.44/src/wifi/model/wifi-assoc-manager.h
--- ns-3.43/src/wifi/model/wifi-assoc-manager.h	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/wifi-assoc-manager.h	2025-03-09 16:55:49.799372700 -0700
@@ -20,7 +20,7 @@
 {
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * Abstract base class for the Association Manager, which manages
  * scanning and association for single link devices and ML discovery
@@ -38,15 +38,15 @@
         /**
          * Constructor.
          *
-         * \param manager a pointer to the Association Manager
+         * @param manager a pointer to the Association Manager
          */
         ApInfoCompare(const WifiAssocManager& manager);
         /**
          * Function call operator. Calls the Compare method of the Association Manager.
          *
-         * \param lhs left hand side ApInfo object
-         * \param rhs right hand side ApInfo object
-         * \return true if the left hand side ApInfo object should be placed before the
+         * @param lhs left hand side ApInfo object
+         * @param rhs right hand side ApInfo object
+         * @return true if the left hand side ApInfo object should be placed before the
          *         right hand side ApInfo object in the sorted list maintained by the
          *         Association Manager, false otherwise
          */
@@ -68,8 +68,8 @@
     };
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -78,7 +78,7 @@
     /**
      * Set the pointer to the STA wifi MAC.
      *
-     * \param mac the pointer to the STA wifi MAC
+     * @param mac the pointer to the STA wifi MAC
      */
     void SetStaWifiMac(Ptr<StaWifiMac> mac);
 
@@ -88,7 +88,7 @@
      * about APs matching the given scanning parameters may be used and scanning
      * not performed.
      *
-     * \param scanParams the scanning parameters
+     * @param scanParams the scanning parameters
      */
     void StartScanning(WifiScanParams&& scanParams);
 
@@ -98,14 +98,14 @@
      *
      * Note that the given ApInfo object is moved to the sorted list of ApInfo objects.
      *
-     * \param apInfo the AP information contained in the received frame
+     * @param apInfo the AP information contained in the received frame
      */
     virtual void NotifyApInfo(const StaWifiMac::ApInfo&& apInfo);
 
     /**
      * Notify that the given link has completed channel switching.
      *
-     * \param linkId the ID of the given link
+     * @param linkId the ID of the given link
      */
     virtual void NotifyChannelSwitched(uint8_t linkId) = 0;
 
@@ -113,9 +113,9 @@
      * Compare two ApInfo objects for the purpose of keeping a sorted list of
      * ApInfo objects.
      *
-     * \param lhs left hand side ApInfo object
-     * \param rhs right hand side ApInfo object
-     * \return true if the left hand side ApInfo object should be placed before the
+     * @param lhs left hand side ApInfo object
+     * @param rhs right hand side ApInfo object
+     * @return true if the left hand side ApInfo object should be placed before the
      *         right hand side ApInfo object in the sorted list of ApInfo objects,
      *         false otherwise
      */
@@ -125,9 +125,9 @@
      * Search the given RNR element for APs affiliated to the same AP MLD as the
      * reporting AP. The search starts at the given Neighbor AP Information field.
      *
-     * \param rnr the given RNR element
-     * \param nbrApInfoId the index of the given Neighbor AP Information field
-     * \return the index of the Neighbor AP Information field and the index of the
+     * @param rnr the given RNR element
+     * @param nbrApInfoId the index of the given Neighbor AP Information field
+     * @return the index of the Neighbor AP Information field and the index of the
      *         TBTT Information field containing the next affiliated AP, if any.
      */
     static std::optional<WifiAssocManager::RnrLinkInfo> GetNextAffiliatedAp(
@@ -138,8 +138,8 @@
      * Find all the APs affiliated to the same AP MLD as the reporting AP that sent
      * the given RNR element.
      *
-     * \param rnr the given RNR element
-     * \return a list containing the index of the Neighbor AP Information field and the index of the
+     * @param rnr the given RNR element
+     * @return a list containing the index of the Neighbor AP Information field and the index of the
      *         TBTT Information field containing all the affiliated APs
      */
     static std::list<WifiAssocManager::RnrLinkInfo> GetAllAffiliatedAps(
@@ -156,7 +156,7 @@
     using SortedList = std::set<StaWifiMac::ApInfo, ApInfoCompare>;
 
     /**
-     * \return a const reference to the sorted list of ApInfo objects.
+     * @return a const reference to the sorted list of ApInfo objects.
      */
     const SortedList& GetSortedList() const;
 
@@ -164,21 +164,21 @@
      * Get a reference to the list of the links to setup with the given AP. This method
      * allows subclasses to modify such a list.
      *
-     * \param apInfo the info about the given AP
-     * \return a reference to the list of the links to setup with the given AP
+     * @param apInfo the info about the given AP
+     * @return a reference to the list of the links to setup with the given AP
      */
     std::list<StaWifiMac::ApInfo::SetupLinksInfo>& GetSetupLinks(const StaWifiMac::ApInfo& apInfo);
 
     /**
-     * \return the scanning parameters.
+     * @return the scanning parameters.
      */
     const WifiScanParams& GetScanParams() const;
 
     /**
      * Check whether the given AP information match the current scanning parameters.
      *
-     * \param apInfo the given AP information
-     * \return whether the given AP information match the current scanning parameters
+     * @param apInfo the given AP information
+     * @return whether the given AP information match the current scanning parameters
      */
     bool MatchScanParams(const StaWifiMac::ApInfo& apInfo) const;
 
@@ -186,16 +186,16 @@
      * Allow subclasses to choose whether the given ApInfo shall be considered
      * and hence inserted in the sorted list of ApInfo objects.
      *
-     * \param apInfo the apInfo object to insert
-     * \return true if the apInfo object can be inserted, false otherwise
+     * @param apInfo the apInfo object to insert
+     * @return true if the apInfo object can be inserted, false otherwise
      */
     virtual bool CanBeInserted(const StaWifiMac::ApInfo& apInfo) const = 0;
     /**
      * Allow subclasses to choose whether the given ApInfo shall be returned or
      * discarded when the STA wifi MAC requests information on the best AP.
      *
-     * \param apInfo the apInfo object to return
-     * \return true if the apInfo object can be returned, false otherwise
+     * @param apInfo the apInfo object to return
+     * @return true if the apInfo object can be returned, false otherwise
      */
     virtual bool CanBeReturned(const StaWifiMac::ApInfo& apInfo) const = 0;
 
@@ -218,7 +218,7 @@
      *                 Beacon/Probe Response received from the best AP, if any
      * \param[out] rnr const reference to the Reduced Neighbor Report Element present
      *                 in the Beacon/Probe Response received from the best AP, if any.
-     * \return whether 11be Multi-Link setup can be established with the current best AP
+     * @return whether 11be Multi-Link setup can be established with the current best AP
      */
     bool CanSetupMultiLink(OptMleConstRef& mle, OptRnrConstRef& rnr);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-bandwidth-filter.cc ns-3.44/src/wifi/model/wifi-bandwidth-filter.cc
--- ns-3.43/src/wifi/model/wifi-bandwidth-filter.cc	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/wifi-bandwidth-filter.cc	2025-03-09 16:55:49.799372700 -0700
@@ -12,8 +12,8 @@
 #include "wifi-spectrum-phy-interface.h"
 #include "wifi-spectrum-signal-parameters.h"
 
-#include <ns3/boolean.h>
-#include <ns3/spectrum-transmit-filter.h>
+#include "ns3/boolean.h"
+#include "ns3/spectrum-transmit-filter.h"
 
 namespace ns3
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-bandwidth-filter.h ns-3.44/src/wifi/model/wifi-bandwidth-filter.h
--- ns-3.43/src/wifi/model/wifi-bandwidth-filter.h	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/wifi-bandwidth-filter.h	2025-03-09 16:55:49.799372700 -0700
@@ -7,7 +7,7 @@
 #ifndef WIFI_BANDWIDTH_FILTER_H
 #define WIFI_BANDWIDTH_FILTER_H
 
-#include <ns3/spectrum-transmit-filter.h>
+#include "ns3/spectrum-transmit-filter.h"
 
 namespace ns3
 {
@@ -18,18 +18,18 @@
     WifiBandwidthFilter();
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Ignore the signal being received if it is a Wi-Fi PPDU whose TX band
+     * @brief Ignore the signal being received if it is a Wi-Fi PPDU whose TX band
      *        (including guard bands) does not overlap the current operating channel.
      *
-     * \param params the parameters of the signals being received
-     * \param receiverPhy the SpectrumPhy of the receiver
-     * \return whether the signal being received should be ignored
+     * @param params the parameters of the signals being received
+     * @param receiverPhy the SpectrumPhy of the receiver
+     * @return whether the signal being received should be ignored
      */
 
     bool DoFilter(Ptr<const SpectrumSignalParameters> params,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-default-ack-manager.cc ns-3.44/src/wifi/model/wifi-default-ack-manager.cc
--- ns-3.43/src/wifi/model/wifi-default-ack-manager.cc	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/wifi-default-ack-manager.cc	2025-03-09 16:55:49.799372700 -0700
@@ -10,6 +10,7 @@
 
 #include "ap-wifi-mac.h"
 #include "ctrl-headers.h"
+#include "gcr-manager.h"
 #include "qos-utils.h"
 #include "wifi-mac-queue.h"
 #include "wifi-mpdu.h"
@@ -292,8 +293,32 @@
 
     if (receiver.IsGroup())
     {
-        NS_ABORT_MSG_IF(!txParams.LastAddedIsFirstMpdu(receiver),
-                        "Unicast frames only can be aggregated");
+        // if the current acknowledgment method (if any) is already BAR_BLOCK_ACK, it will not
+        // change by adding an MPDU
+        if (txParams.m_acknowledgment &&
+            txParams.m_acknowledgment->method == WifiAcknowledgment::BAR_BLOCK_ACK)
+        {
+            return nullptr;
+        }
+        const auto isGcr = IsGcr(m_mac, hdr);
+        NS_ABORT_MSG_IF(!isGcr && !txParams.LastAddedIsFirstMpdu(receiver),
+                        "Unicast frames only can be aggregated if GCR is not used");
+        if (auto apMac = DynamicCast<ApWifiMac>(m_mac);
+            isGcr && apMac->GetGcrManager()->GetRetransmissionPolicyFor(hdr) ==
+                         GroupAddressRetransmissionPolicy::GCR_BLOCK_ACK)
+        {
+            NS_LOG_DEBUG("Request to schedule a GCR Block Ack Request");
+            const auto recipient =
+                apMac->GetGcrManager()->GetIndividuallyAddressedRecipient(receiver);
+            auto acknowledgment = std::make_unique<WifiBarBlockAck>();
+            acknowledgment->blockAckReqTxVector =
+                GetWifiRemoteStationManager()->GetBlockAckTxVector(recipient, txParams.m_txVector);
+            acknowledgment->blockAckTxVector = acknowledgment->blockAckReqTxVector;
+            acknowledgment->barType = BlockAckReqType::GCR;
+            acknowledgment->baType = BlockAckType::GCR;
+            acknowledgment->SetQosAckPolicy(receiver, hdr.GetQosTid(), WifiMacHeader::BLOCK_ACK);
+            return acknowledgment;
+        }
         auto acknowledgment = std::make_unique<WifiNoAck>();
         if (hdr.IsQosData())
         {
@@ -369,6 +394,22 @@
         return acknowledgment;
     }
 
+    if (hdr.IsBlockAckReq())
+    {
+        CtrlBAckRequestHeader baReqHdr;
+        mpdu->GetPacket()->PeekHeader(baReqHdr);
+        if (baReqHdr.IsGcr())
+        {
+            NS_LOG_DEBUG("GCR Block Ack Req, request GCR Block Ack");
+            auto acknowledgment = std::make_unique<WifiBlockAck>();
+            acknowledgment->blockAckTxVector =
+                GetWifiRemoteStationManager()->GetBlockAckTxVector(receiver, txParams.m_txVector);
+            acknowledgment->baType = BlockAckType::GCR;
+            acknowledgment->SetQosAckPolicy(receiver, tid, WifiMacHeader::NORMAL_ACK);
+            return acknowledgment;
+        }
+    }
+
     NS_LOG_DEBUG(
         "A-MPDU using Implicit Block Ack Request policy or BlockAckReq, request Block Ack");
     auto acknowledgment = std::make_unique<WifiBlockAck>();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-default-ack-manager.h ns-3.44/src/wifi/model/wifi-default-ack-manager.h
--- ns-3.43/src/wifi/model/wifi-default-ack-manager.h	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/wifi-default-ack-manager.h	2025-03-09 16:55:49.799372700 -0700
@@ -18,7 +18,7 @@
 class WifiMpdu;
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * WifiDefaultAckManager is the default ack manager.
  */
@@ -26,8 +26,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -45,9 +45,9 @@
      * of the given MPDU and of all the QoS data frames included in the given TX
      * parameters.
      *
-     * \param mpdu the given MPDU
-     * \param txParams the given TX parameters
-     * \return the maximum distance between the starting sequence number of the Block
+     * @param mpdu the given MPDU
+     * @param txParams the given TX parameters
+     * @return the maximum distance between the starting sequence number of the Block
      *         Ack agreement which the given MPDU belongs to and each of the sequence
      *         numbers of the given MPDU and of all the QoS data frames included in
      *         the given TX parameters
@@ -61,15 +61,15 @@
      * included in the given TX parameters requires an immediate response (Normal Ack,
      * Block Ack or Block Ack Request followed by Block Ack).
      *
-     * \param mpdu the given MPDU.
-     * \param txParams the given TX parameters.
-     * \return true if the given PSDU requires an immediate response
+     * @param mpdu the given MPDU.
+     * @param txParams the given TX parameters.
+     * @return true if the given PSDU requires an immediate response
      */
     bool IsResponseNeeded(Ptr<const WifiMpdu> mpdu, const WifiTxParameters& txParams) const;
 
     /**
-     * \param mpdu the given MPDU
-     * \return whether there exist MPDUs with lower sequence number than the given MPDU that are
+     * @param mpdu the given MPDU
+     * @return whether there exist MPDUs with lower sequence number than the given MPDU that are
      * inflight on the same link as the given MPDU
      */
     bool ExistInflightOnSameLink(Ptr<const WifiMpdu> mpdu) const;
@@ -83,9 +83,9 @@
      * This method can only be called if the selected acknowledgment method for DL
      * multi-user frames consists of a sequence of BlockAckReq and BlockAck frames.
      *
-     * \param mpdu the given MPDU
-     * \param txParams the TX parameters describing the current multi-user frame
-     * \return the new acknowledgment method or a null pointer if the acknowledgment method
+     * @param mpdu the given MPDU
+     * @param txParams the TX parameters describing the current multi-user frame
+     * @return the new acknowledgment method or a null pointer if the acknowledgment method
      *         is unchanged
      */
     virtual std::unique_ptr<WifiAcknowledgment> GetAckInfoIfBarBaSequence(
@@ -99,9 +99,9 @@
      * This method can only be called if the selected acknowledgment method for DL
      * multi-user frames consists of a MU-BAR Trigger Frame sent as single-user frame.
      *
-     * \param mpdu the given MPDU
-     * \param txParams the TX parameters describing the current multi-user frame
-     * \return the new acknowledgment method or a null pointer if the acknowledgment method
+     * @param mpdu the given MPDU
+     * @param txParams the TX parameters describing the current multi-user frame
+     * @return the new acknowledgment method or a null pointer if the acknowledgment method
      *         is unchanged
      */
     virtual std::unique_ptr<WifiAcknowledgment> GetAckInfoIfTfMuBar(
@@ -116,9 +116,9 @@
      * multi-user frames consists of MU-BAR Trigger Frames aggregated to the PSDUs of
      * the MU PPDU.
      *
-     * \param mpdu the given MPDU
-     * \param txParams the TX parameters describing the current multi-user frame
-     * \return the new acknowledgment method or a null pointer if the acknowledgment method
+     * @param mpdu the given MPDU
+     * @param txParams the TX parameters describing the current multi-user frame
+     * @return the new acknowledgment method or a null pointer if the acknowledgment method
      *         is unchanged
      */
     virtual std::unique_ptr<WifiAcknowledgment> GetAckInfoIfAggregatedMuBar(
@@ -129,9 +129,9 @@
      * Calculate the acknowledgment method for the TB PPDUs solicited by the given
      * Trigger Frame.
      *
-     * \param mpdu the given Trigger Frame
-     * \param txParams the current TX parameters (just the TXVECTOR needs to be set)
-     * \return the acknowledgment method for the TB PPDUs solicited by the given Trigger Frame
+     * @param mpdu the given Trigger Frame
+     * @param txParams the current TX parameters (just the TXVECTOR needs to be set)
+     * @return the acknowledgment method for the TB PPDUs solicited by the given Trigger Frame
      */
     virtual std::unique_ptr<WifiAcknowledgment> TryUlMuTransmission(
         Ptr<const WifiMpdu> mpdu,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-default-assoc-manager.cc ns-3.44/src/wifi/model/wifi-default-assoc-manager.cc
--- ns-3.43/src/wifi/model/wifi-default-assoc-manager.cc	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/wifi-default-assoc-manager.cc	2025-03-09 16:55:49.799372700 -0700
@@ -90,9 +90,12 @@
         for (uint8_t linkId = 0; linkId < m_mac->GetNLinks(); linkId++)
         {
             Simulator::Schedule(GetScanParams().probeDelay,
-                                &StaWifiMac::SendProbeRequest,
+                                &StaWifiMac::EnqueueProbeRequest,
                                 m_mac,
-                                linkId);
+                                m_mac->GetProbeRequest(linkId),
+                                linkId,
+                                Mac48Address::GetBroadcast(),
+                                Mac48Address::GetBroadcast());
         }
         m_probeRequestEvent =
             Simulator::Schedule(GetScanParams().probeDelay + GetScanParams().maxChannelTime,
@@ -193,7 +196,7 @@
             Mac48Address bssid = rnr->get().GetBssid(apIt->m_nbrApInfoId, apIt->m_tbttInfoFieldId);
             setupLinks.emplace_back(StaWifiMac::ApInfo::SetupLinksInfo{
                 linkId,
-                rnr->get().GetLinkId(apIt->m_nbrApInfoId, apIt->m_tbttInfoFieldId),
+                rnr->get().GetMldParameters(apIt->m_nbrApInfoId, apIt->m_tbttInfoFieldId).linkId,
                 bssid});
 
             if (needChannelSwitch)
@@ -206,10 +209,10 @@
                 // switch this link to using the channel used by a reported AP (or its primary80
                 // in case the reported AP is using a 160 MHz and the non-AP MLD does not support
                 // 160 MHz operations)
-                if (apChannel.GetTotalWidth() > 80 &&
-                    !phy->GetDevice()->GetVhtConfiguration()->Get160MHzOperationSupported())
+                if (apChannel.GetTotalWidth() > MHz_u{80} &&
+                    !phy->GetDevice()->GetVhtConfiguration()->m_160MHzSupported)
                 {
-                    apChannel = apChannel.GetPrimaryChannel(80);
+                    apChannel = apChannel.GetPrimaryChannel(MHz_u{80});
                 }
 
                 NS_LOG_DEBUG("Switch link " << +linkId << " to using " << apChannel);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-default-assoc-manager.h ns-3.44/src/wifi/model/wifi-default-assoc-manager.h
--- ns-3.43/src/wifi/model/wifi-default-assoc-manager.h	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/wifi-default-assoc-manager.h	2025-03-09 16:55:49.799372700 -0700
@@ -17,7 +17,7 @@
 class StaWifiMac;
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * Default wifi Association Manager.
  */
@@ -25,8 +25,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     WifiDefaultAssocManager();
@@ -53,7 +53,7 @@
      * Take action upon the expiration of the timer set when requesting channel
      * switch on the given link.
      *
-     * \param linkId the ID of the given link
+     * @param linkId the ID of the given link
      */
     void ChannelSwitchTimeout(uint8_t linkId);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-default-gcr-manager.cc ns-3.44/src/wifi/model/wifi-default-gcr-manager.cc
--- ns-3.43/src/wifi/model/wifi-default-gcr-manager.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/wifi/model/wifi-default-gcr-manager.cc	2025-03-09 16:55:49.799372700 -0700
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2023 DERONNE SOFTWARE ENGINEERING
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+#include "wifi-default-gcr-manager.h"
+
+#include "ap-wifi-mac.h"
+
+#include "ns3/log.h"
+
+namespace ns3
+{
+
+NS_LOG_COMPONENT_DEFINE("WifiDefaultGcrManager");
+
+NS_OBJECT_ENSURE_REGISTERED(WifiDefaultGcrManager);
+
+TypeId
+WifiDefaultGcrManager::GetTypeId()
+{
+    static TypeId tid = TypeId("ns3::WifiDefaultGcrManager")
+                            .SetParent<GcrManager>()
+                            .SetGroupName("Wifi")
+                            .AddConstructor<WifiDefaultGcrManager>();
+    return tid;
+}
+
+WifiDefaultGcrManager::WifiDefaultGcrManager()
+{
+    NS_LOG_FUNCTION(this);
+}
+
+WifiDefaultGcrManager::~WifiDefaultGcrManager()
+{
+    NS_LOG_FUNCTION_NOARGS();
+}
+
+Mac48Address
+WifiDefaultGcrManager::GetIndividuallyAddressedRecipient(
+    const Mac48Address& /* groupAddress */) const
+{
+    /*
+     * 802.11-2020: 10.23.2.12.2 Unsolicited retry procedure:
+     * When using a protection mechanism that requires a response from another STA,
+     * the AP should select a STA that is a member of the GCR group.
+     * For now, we assume all associated GCR-capable STAs are part of the GCR group,
+     * hence we pick the first STA from the list held by the AP.
+     */
+    NS_ASSERT(!m_staMembers.empty());
+    return *m_staMembers.cbegin();
+}
+
+} // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-default-gcr-manager.h ns-3.44/src/wifi/model/wifi-default-gcr-manager.h
--- ns-3.43/src/wifi/model/wifi-default-gcr-manager.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/wifi/model/wifi-default-gcr-manager.h	2025-03-09 16:55:49.799372700 -0700
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2023 DERONNE SOFTWARE ENGINEERING
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+#ifndef WIFI_DEFAULT_GCR_MANAGER_H
+#define WIFI_DEFAULT_GCR_MANAGER_H
+
+#include "gcr-manager.h"
+
+namespace ns3
+{
+
+/**
+ * @ingroup wifi
+ *
+ * WifiDefaultGcrManager is the default implementation for groupcast with retries GCR, as defined in
+ * 802.11aa. Since the standard does not describe how to map GCR-capable STAs to a given GCR group,
+ * the default implementation assumes all GCR-capable STAs are part of all GCR groups. Also, it is
+ * left left open to implementation which individual address to use to use while protecting a GCR
+ * transmission. The default implementation decides to pick the address of the first associated
+ * GCR-capable STA.
+ */
+class WifiDefaultGcrManager : public GcrManager
+{
+  public:
+    /**
+     * @brief Get the type ID.
+     * @return the object TypeId
+     */
+    static TypeId GetTypeId();
+
+    WifiDefaultGcrManager();
+    ~WifiDefaultGcrManager() override;
+
+    Mac48Address GetIndividuallyAddressedRecipient(
+        const Mac48Address& groupcastAddress) const override;
+};
+
+} // namespace ns3
+
+#endif /* WIFI_DEFAULT_GCR_MANAGER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-default-protection-manager.cc ns-3.44/src/wifi/model/wifi-default-protection-manager.cc
--- ns-3.43/src/wifi/model/wifi-default-protection-manager.cc	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/wifi-default-protection-manager.cc	2025-03-09 16:55:49.799372700 -0700
@@ -9,12 +9,12 @@
 #include "wifi-default-protection-manager.h"
 
 #include "ap-wifi-mac.h"
-#include "frame-exchange-manager.h"
 #include "sta-wifi-mac.h"
 #include "wifi-mpdu.h"
 #include "wifi-tx-parameters.h"
 
 #include "ns3/boolean.h"
+#include "ns3/eht-frame-exchange-manager.h"
 #include "ns3/emlsr-manager.h"
 #include "ns3/erp-ofdm-phy.h"
 #include "ns3/log.h"
@@ -48,6 +48,12 @@
                           "Initial Control Frame to an EMLSR client).",
                           BooleanValue(false),
                           MakeBooleanAccessor(&WifiDefaultProtectionManager::m_singleRtsPerTxop),
+                          MakeBooleanChecker())
+            .AddAttribute("SkipMuRtsBeforeBsrp",
+                          "If enabled, MU-RTS is not used to protect the transmission of a BSRP "
+                          "Trigger Frame.",
+                          BooleanValue(true),
+                          MakeBooleanAccessor(&WifiDefaultProtectionManager::m_skipMuRtsBeforeBsrp),
                           MakeBooleanChecker());
     return tid;
 }
@@ -206,8 +212,7 @@
     }
 
     // check if CTS-to-Self is needed
-    if (GetWifiRemoteStationManager()->GetUseNonErpProtection() &&
-        GetWifiRemoteStationManager()->NeedCtsToSelf(txParams.m_txVector))
+    if (GetWifiRemoteStationManager()->NeedCtsToSelf(txParams.m_txVector, hdr))
     {
         auto protection = std::make_unique<WifiCtsToSelfProtection>();
         protection->ctsTxVector = GetWifiRemoteStationManager()->GetCtsToSelfTxVector();
@@ -259,10 +264,9 @@
     {
         // we get here if this is the first MPDU for this receiver.
         NS_ABORT_MSG_IF(m_mac->GetTypeOfStation() != AP, "HE APs only can send DL MU PPDUs");
-        auto apMac = StaticCast<ApWifiMac>(m_mac);
         auto modClass = txParams.m_txVector.GetModulationClass();
         auto txWidth = modClass == WIFI_MOD_CLASS_DSSS || modClass == WIFI_MOD_CLASS_HR_DSSS
-                           ? 20
+                           ? MHz_u{20}
                            : txParams.m_txVector.GetChannelWidth();
 
         if (protection != nullptr)
@@ -310,12 +314,12 @@
             }
         }
 
-        // The initial Control frame of frame exchanges shall be sent in the non-HT PPDU or
-        // non-HT duplicate PPDU format using a rate of 6 Mb/s, 12 Mb/s, or 24 Mb/s.
-        // (Sec. 35.3.17 of 802.11be D3.0)
         if (isEmlsrDestination && !isProtected)
         {
-            GetWifiRemoteStationManager()->AdjustTxVectorForIcf(protection->muRtsTxVector);
+            // This MU-RTS is an ICF for some EMLSR client
+            auto ehtFem =
+                StaticCast<EhtFrameExchangeManager>(m_mac->GetFrameExchangeManager(m_linkId));
+            ehtFem->SetIcfPaddingAndTxVector(protection->muRts, protection->muRtsTxVector);
         }
 
         return std::unique_ptr<WifiMuRtsCtsProtection>(protection);
@@ -376,6 +380,10 @@
         (m_sendMuRts && !allProtected && (!m_singleRtsPerTxop || protectedStas.empty())) ||
         isUnprotectedEmlsrDst;
 
+    // if we are sending a BSRP TF and SkipMuRtsBeforeBsrpTf is true, do not use MU-RTS (even in
+    // case of unprotected EMLSR, because the BSRP TF is an ICF)
+    needMuRts = needMuRts && (!m_skipMuRtsBeforeBsrp || !trigger.IsBsrp());
+
     if (!needMuRts)
     {
         // No protection needed
@@ -395,12 +403,11 @@
     {
         protection->muRtsTxVector.SetMode(ErpOfdmPhy::GetErpOfdmRate6Mbps());
     }
-    // The initial Control frame of frame exchanges shall be sent in the non-HT PPDU or
-    // non-HT duplicate PPDU format using a rate of 6 Mb/s, 12 Mb/s, or 24 Mb/s.
-    // (Sec. 35.3.17 of 802.11be D3.0)
     if (isUnprotectedEmlsrDst)
     {
-        GetWifiRemoteStationManager()->AdjustTxVectorForIcf(protection->muRtsTxVector);
+        // This MU-RTS is an ICF for some EMLSR client
+        auto ehtFem = StaticCast<EhtFrameExchangeManager>(m_mac->GetFrameExchangeManager(m_linkId));
+        ehtFem->SetIcfPaddingAndTxVector(protection->muRts, protection->muRtsTxVector);
     }
 
     return protection;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-default-protection-manager.h ns-3.44/src/wifi/model/wifi-default-protection-manager.h
--- ns-3.43/src/wifi/model/wifi-default-protection-manager.h	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/wifi-default-protection-manager.h	2025-03-09 16:55:49.799372700 -0700
@@ -19,7 +19,7 @@
 class WifiMacHeader;
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * WifiDefaultProtectionManager is the default protection manager, which selects
  * the protection method for a frame based on its size.
@@ -28,8 +28,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -45,9 +45,9 @@
     /**
      * Select the protection method for a single PSDU.
      *
-     * \param hdr the MAC header of the PSDU
-     * \param txParams the TX parameters describing the PSDU
-     * \return the selected protection method
+     * @param hdr the MAC header of the PSDU
+     * @param txParams the TX parameters describing the PSDU
+     * @return the selected protection method
      */
     virtual std::unique_ptr<WifiProtection> GetPsduProtection(
         const WifiMacHeader& hdr,
@@ -64,9 +64,9 @@
      * bandwidth equal to the minimum between the TX width of the DL MU PPDU and the
      * maximum channel width supported by the non-AP station.
      *
-     * \param mpdu the given MPDU
-     * \param txParams the TX parameters describing the current DL MU PPDU
-     * \return the new protection method or a null pointer if the protection method
+     * @param mpdu the given MPDU
+     * @param txParams the TX parameters describing the current DL MU PPDU
+     * @return the new protection method or a null pointer if the protection method
      *         is unchanged
      */
     virtual std::unique_ptr<WifiProtection> TryAddMpduToMuPpdu(Ptr<const WifiMpdu> mpdu,
@@ -80,15 +80,16 @@
      * occupying a bandwidth equal to the minimum between the TX width of the PPDU containing
      * the MU-RTS and the maximum channel width supported by the non-AP station.
      *
-     * \param mpdu the given Trigger Frame
-     * \param txParams the current TX parameters (just the TXVECTOR needs to be set)
-     * \return the protection method for the UL MU transmission solicited by the given Trigger Frame
+     * @param mpdu the given Trigger Frame
+     * @param txParams the current TX parameters (just the TXVECTOR needs to be set)
+     * @return the protection method for the UL MU transmission solicited by the given Trigger Frame
      */
     virtual std::unique_ptr<WifiProtection> TryUlMuTransmission(Ptr<const WifiMpdu> mpdu,
                                                                 const WifiTxParameters& txParams);
 
-    bool m_sendMuRts;        //!< true for sending an MU-RTS to protect DL MU PPDUs
-    bool m_singleRtsPerTxop; //!< true for using protection only once in a TXOP
+    bool m_sendMuRts;           //!< true for sending an MU-RTS to protect DL MU PPDUs
+    bool m_singleRtsPerTxop;    //!< true for using protection only once in a TXOP
+    bool m_skipMuRtsBeforeBsrp; //!< whether to skip MU-RTS before BSRP TF
 };
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-information-element.h ns-3.44/src/wifi/model/wifi-information-element.h
--- ns-3.43/src/wifi/model/wifi-information-element.h	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/wifi-information-element.h	2025-03-09 16:55:49.799372700 -0700
@@ -198,7 +198,14 @@
 #define IE_QUIET_PERIOD_RESPONSE ((WifiInformationElementId)177)
 // 178 to 181 are reserved
 #define IE_ECPAC_POLICY ((WifiInformationElementId)182)
-// 183 to 190 are reserved
+#define IE_CLUSTER_TIME_OFFSET ((WifiInformationElementId)183)
+#define IE_INTRA_ACCESS_CATEGORY_PRIORITY ((WifiInformationElementId)184)
+#define IE_SCS_DESCRIPTOR ((WifiInformationElementId)185)
+#define IE_QLOAD_REPORT ((WifiInformationElementId)186)
+#define IE_HCCA_TXOP_UPDATE_COUNT ((WifiInformationElementId)187)
+#define IE_HIGHER_LAYER_STREAM_ID ((WifiInformationElementId)188)
+#define IE_GCR_GROUP_ADDRESS ((WifiInformationElementId)189)
+#define IE_ANTENNA_SECTOR_ID_PATTERN ((WifiInformationElementId)190)
 #define IE_VHT_CAPABILITIES ((WifiInformationElementId)191)
 #define IE_VHT_OPERATION ((WifiInformationElementId)192)
 #define IE_EXTENDED_BSS_LOAD ((WifiInformationElementId)193)
@@ -232,8 +239,8 @@
 #define IE_EXT_TID_TO_LINK_MAPPING_ELEMENT ((WifiInformationElementId)109)
 
 /**
- * \brief Information element, as defined in 802.11-2007 standard
- * \ingroup wifi
+ * @brief Information element, as defined in 802.11-2007 standard
+ * @ingroup wifi
  *
  * The IEEE 802.11 standard includes the notion of Information
  * Elements, which are encodings of management information to be
@@ -282,9 +289,9 @@
      * Serialize entire IE including Element ID and length fields. Handle
      * fragmentation of the IE if needed.
      *
-     * \param i an iterator which points to where the IE should be written.
+     * @param i an iterator which points to where the IE should be written.
      *
-     * \return an iterator
+     * @return an iterator
      */
     Buffer::Iterator Serialize(Buffer::Iterator i) const;
     /**
@@ -293,9 +300,9 @@
      * at the Element ID (i.e., the very first octet) of the correct type of
      * information element, otherwise this method will generate a fatal error.
      *
-     * \param i an iterator which points to where the IE should be read.
+     * @param i an iterator which points to where the IE should be read.
      *
-     * \return an iterator
+     * @return an iterator
      */
     Buffer::Iterator Deserialize(Buffer::Iterator i);
     /**
@@ -305,29 +312,29 @@
      * the Element ID is not the one that the given class is interested
      * in then it will return the same iterator.
      *
-     * \param i an iterator which points to where the IE should be read.
+     * @param i an iterator which points to where the IE should be read.
      *
-     * \return an iterator
+     * @return an iterator
      */
     Buffer::Iterator DeserializeIfPresent(Buffer::Iterator i);
     /**
      * Get the size of the serialized IE including Element ID and
      * length fields (for every element this IE is possibly fragmented into).
      *
-     * \return the size of the serialized IE in bytes
+     * @return the size of the serialized IE in bytes
      */
     uint16_t GetSerializedSize() const;
 
     // Each subclass must implement these pure virtual functions:
     /**
      * Get the wifi information element ID
-     * \returns the wifi information element ID
+     * @returns the wifi information element ID
      */
     virtual WifiInformationElementId ElementId() const = 0;
 
     /**
      * Get the wifi information element ID extension
-     * \returns the wifi information element ID extension
+     * @returns the wifi information element ID extension
      */
     virtual WifiInformationElementId ElementIdExt() const;
 
@@ -335,16 +342,16 @@
     /**
      * Generate human-readable form of IE
      *
-     * \param os output stream
+     * @param os output stream
      */
     virtual void Print(std::ostream& os) const;
     /**
      * Compare two IEs for equality by ID & Length, and then through
      * memcmp of serialised version
      *
-     * \param a another information element to compare with
+     * @param a another information element to compare with
      *
-     * \return true if the two IEs are equal,
+     * @return true if the two IEs are equal,
      *         false otherwise
      */
     virtual bool operator==(const WifiInformationElement& a) const;
@@ -353,18 +360,18 @@
     /**
      * Serialize an IE that needs to be fragmented.
      *
-     * \param i an iterator which points to where the IE should be written.
-     * \param size the size of the body of the IE
-     * \return an iterator pointing to past the IE that was serialized
+     * @param i an iterator which points to where the IE should be written.
+     * @param size the size of the body of the IE
+     * @return an iterator pointing to past the IE that was serialized
      */
     Buffer::Iterator SerializeFragments(Buffer::Iterator i, uint16_t size) const;
     /**
      * Deserialize the Information field of an IE. Also handle the case in which
      * the IE is fragmented.
      *
-     * \param i an iterator which points to where the Information field should be read.
-     * \param length the expected number of bytes to read
-     * \return an iterator pointing to past the IE that was deserialized
+     * @param i an iterator which points to where the Information field should be read.
+     * @param length the expected number of bytes to read
+     * @return an iterator pointing to past the IE that was deserialized
      */
     Buffer::Iterator DoDeserialize(Buffer::Iterator i, uint16_t length);
     /**
@@ -373,14 +380,14 @@
      * is the value that will appear in the second octet of the entire
      * IE - the length field - if the IE is not fragmented)
      *
-     * \return the length of serialized information
+     * @return the length of serialized information
      */
     virtual uint16_t GetInformationFieldSize() const = 0;
     /**
      * Serialize information (i.e., the body of the IE, not including
      * the Element ID and length octets)
      *
-     * \param start an iterator which points to where the information should
+     * @param start an iterator which points to where the information should
      *        be written.
      */
     virtual void SerializeInformationField(Buffer::Iterator start) const = 0;
@@ -388,20 +395,20 @@
      * Deserialize information (i.e., the body of the IE, not including
      * the Element ID and length octets)
      *
-     * \param start an iterator which points to where the information should be written.
-     * \param length the expected number of bytes to read
+     * @param start an iterator which points to where the information should be written.
+     * @param length the expected number of bytes to read
      *
-     * \return the number of bytes read
+     * @return the number of bytes read
      */
     virtual uint16_t DeserializeInformationField(Buffer::Iterator start, uint16_t length) = 0;
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the output stream
- * \param element the Information Element
- * \returns a reference to the stream
+ * @param os the output stream
+ * @param element the Information Element
+ * @returns a reference to the stream
  */
 std::ostream& operator<<(std::ostream& os, const WifiInformationElement& element);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-mac.cc ns-3.44/src/wifi/model/wifi-mac.cc
--- ns-3.43/src/wifi/model/wifi-mac.cc	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/wifi-mac.cc	2025-03-09 16:55:49.803372600 -0700
@@ -146,6 +146,14 @@
                 UintegerValue(1024),
                 MakeUintegerAccessor(&WifiMac::GetMpduBufferSize, &WifiMac::SetMpduBufferSize),
                 MakeUintegerChecker<uint16_t>(1, 1024))
+            .AddAttribute(
+                "FrameRetryLimit",
+                "The maximum number of transmission attempts of a frame that are made before a "
+                "failure condition is indicated. This corresponds to the dot11ShortRetryLimit "
+                "parameter in the standard.",
+                UintegerValue(7),
+                MakeUintegerAccessor(&WifiMac::GetFrameRetryLimit, &WifiMac::SetFrameRetryLimit),
+                MakeUintegerChecker<uint32_t>(1, 65535))
             .AddAttribute("VO_MaxAmsduSize",
                           "Maximum length in bytes of an A-MSDU for AC_VO access class "
                           "(capped to 7935 for HT PPDUs and 11398 for VHT/HE/EHT PPDUs). "
@@ -282,12 +290,19 @@
                 UintegerValue(0),
                 MakeUintegerAccessor(&WifiMac::SetBkBlockAckInactivityTimeout),
                 MakeUintegerChecker<uint16_t>())
-            .AddTraceSource("MacTx",
-                            "A packet has been received from higher layers and is being processed "
-                            "in preparation for "
-                            "queueing for transmission.",
-                            MakeTraceSourceAccessor(&WifiMac::m_macTxTrace),
-                            "ns3::Packet::TracedCallback")
+            .AddAttribute("RobustAVStreamingSupported",
+                          "Whether or not Robust Audio Video Streaming is supported (only allowed "
+                          "for AP STAs or non-AP that are HT capable).",
+                          BooleanValue(false),
+                          MakeBooleanAccessor(&WifiMac::SetRobustAVStreamingSupported,
+                                              &WifiMac::GetRobustAVStreamingSupported),
+                          MakeBooleanChecker())
+            .AddTraceSource(
+                "MacTx",
+                "A packet has been received by the WifiNetDevice and is about to be enqueued; "
+                "it has a LlcSnapHeader prepended but not yet a WifiMacHeader.",
+                MakeTraceSourceAccessor(&WifiMac::m_macTxTrace),
+                "ns3::Packet::TracedCallback")
             .AddTraceSource(
                 "MacTxDrop",
                 "A packet has been dropped in the MAC layer before being queued for transmission. "
@@ -751,6 +766,9 @@
         MakeCallback(&MpduTracedCallback::operator(), &m_nackedMpduCallback));
     edcaIt->second->SetDroppedMpduCallback(
         MakeCallback(&DroppedMpduTracedCallback::operator(), &m_droppedMpduCallback));
+    edcaIt->second->GetWifiMacQueue()->TraceConnectWithoutContext(
+        "Expired",
+        MakeCallback(&WifiMac::NotifyRsmOfExpiredMpdu, this));
 }
 
 void
@@ -1051,6 +1069,7 @@
     for (auto managerIt = stationManagers.cbegin(); auto& [id, link] : m_links)
     {
         link->stationManager = *managerIt++;
+        link->stationManager->SetLinkId(id);
     }
 
     CompleteConfig();
@@ -1109,6 +1128,10 @@
     {
         link.channelAccessManager->SetLinkId(id);
     }
+    if (link.stationManager)
+    {
+        link.stationManager->SetLinkId(id);
+    }
 }
 
 std::optional<uint8_t>
@@ -1298,6 +1321,12 @@
     NS_ABORT_MSG_IF(dir == WifiDirection::BOTH_DIRECTIONS,
                     "Cannot request TID-to-Link mapping for both directions");
 
+    if (!GetWifiRemoteStationManager(linkId)->GetMldAddress(mldAddr).has_value())
+    {
+        // the link has not been setup
+        return false;
+    }
+
     const auto& mappings =
         (dir == WifiDirection::DOWNLINK ? m_dlTidLinkMappings : m_ulTidLinkMappings);
 
@@ -1306,7 +1335,7 @@
     if (it == mappings.cend())
     {
         // TID-to-link mapping was not negotiated, TIDs are mapped to all setup links
-        return GetWifiRemoteStationManager(linkId)->GetMldAddress(mldAddr).has_value();
+        return true;
     }
 
     auto linkSetIt = it->second.find(tid);
@@ -1315,7 +1344,7 @@
     {
         // If there is no successfully negotiated TID-to-link mapping for a TID, then the TID
         // is mapped to all setup links for DL and UL (Sec. 35.3.7.1.3 of 802.11be D3.1)
-        return GetWifiRemoteStationManager(linkId)->GetMldAddress(mldAddr).has_value();
+        return true;
     }
 
     return std::find(linkSetIt->second.cbegin(), linkSetIt->second.cend(), linkId) !=
@@ -1670,6 +1699,37 @@
 }
 
 void
+WifiMac::NotifyRsmOfExpiredMpdu(Ptr<const WifiMpdu> mpdu)
+{
+    NS_LOG_FUNCTION(this << *mpdu);
+
+    const auto& hdr = mpdu->GetHeader();
+    const auto remoteAddr = hdr.GetAddr1();
+
+    if (remoteAddr.IsGroup() || hdr.IsCtl() || !hdr.IsRetry() || mpdu->IsInFlight())
+    {
+        return; // nothing to do
+    }
+
+    std::optional<Mac48Address> optAddr;
+    for (const auto& [id, link] : m_links)
+    {
+        if (link->stationManager->GetMldAddress(remoteAddr) == remoteAddr)
+        {
+            // this is a link setup with a remote MLD and remoteAddr is the MLD address
+            optAddr = link->feManager->GetAddress(); // use local address of this setup link
+        }
+    }
+
+    const auto localAddr =
+        optAddr.value_or(GetNLinks() == 1 ? m_address : DoGetLocalAddress(remoteAddr));
+    const auto linkId = GetLinkIdByAddress(localAddr);
+    NS_ASSERT_MSG(linkId.has_value(), "No link with address " << localAddr);
+
+    GetLink(*linkId).stationManager->ReportFinalDataFailed(mpdu);
+}
+
+void
 WifiMac::Enqueue(Ptr<Packet> packet, Mac48Address to)
 {
     NS_LOG_FUNCTION(this << packet << to);
@@ -1842,12 +1902,15 @@
 }
 
 WifiMac::OriginatorAgreementOptConstRef
-WifiMac::GetBaAgreementEstablishedAsOriginator(Mac48Address recipient, uint8_t tid) const
+WifiMac::GetBaAgreementEstablishedAsOriginator(Mac48Address recipient,
+                                               uint8_t tid,
+                                               std::optional<Mac48Address> gcrGroupAddr) const
 {
     // BA agreements are indexed by the MLD address if ML setup was performed
     recipient = GetMldAddress(recipient).value_or(recipient);
 
-    auto agreement = GetQosTxop(tid)->GetBaManager()->GetAgreementAsOriginator(recipient, tid);
+    auto agreement =
+        GetQosTxop(tid)->GetBaManager()->GetAgreementAsOriginator(recipient, tid, gcrGroupAddr);
     if (!agreement || !agreement->get().IsEstablished())
     {
         return std::nullopt;
@@ -1856,11 +1919,13 @@
 }
 
 WifiMac::RecipientAgreementOptConstRef
-WifiMac::GetBaAgreementEstablishedAsRecipient(Mac48Address originator, uint8_t tid) const
+WifiMac::GetBaAgreementEstablishedAsRecipient(Mac48Address originator,
+                                              uint8_t tid,
+                                              std::optional<Mac48Address> gcrGroupAddr) const
 {
     // BA agreements are indexed by the MLD address if ML setup was performed
     originator = GetMldAddress(originator).value_or(originator);
-    return GetQosTxop(tid)->GetBaManager()->GetAgreementAsRecipient(originator, tid);
+    return GetQosTxop(tid)->GetBaManager()->GetAgreementAsRecipient(originator, tid, gcrGroupAddr);
 }
 
 BlockAckType
@@ -2033,6 +2098,19 @@
 }
 
 void
+WifiMac::SetFrameRetryLimit(uint32_t limit)
+{
+    NS_LOG_FUNCTION(this << limit);
+    m_frameRetryLimit = limit;
+}
+
+uint32_t
+WifiMac::GetFrameRetryLimit() const
+{
+    return m_frameRetryLimit;
+}
+
+void
 WifiMac::SetVoBlockAckThreshold(uint8_t threshold)
 {
     NS_LOG_FUNCTION(this << +threshold);
@@ -2115,24 +2193,22 @@
 ExtendedCapabilities
 WifiMac::GetExtendedCapabilities() const
 {
-    NS_LOG_FUNCTION(this);
     ExtendedCapabilities capabilities;
-    // TODO: to be completed
+    capabilities.m_robustAvStreaming = GetRobustAVStreamingSupported();
     return capabilities;
 }
 
 HtCapabilities
 WifiMac::GetHtCapabilities(uint8_t linkId) const
 {
-    NS_LOG_FUNCTION(this << +linkId);
     NS_ASSERT(GetHtSupported(linkId));
     HtCapabilities capabilities;
 
     auto phy = GetWifiPhy(linkId);
     Ptr<HtConfiguration> htConfiguration = GetHtConfiguration();
-    bool sgiSupported = htConfiguration->GetShortGuardIntervalSupported();
-    capabilities.SetLdpc(htConfiguration->GetLdpcSupported());
-    capabilities.SetSupportedChannelWidth(htConfiguration->Get40MHzOperationSupported() ? 1 : 0);
+    bool sgiSupported = htConfiguration->m_sgiSupported;
+    capabilities.SetLdpc(htConfiguration->m_ldpcSupported);
+    capabilities.SetSupportedChannelWidth(htConfiguration->m_40MHzSupported ? 1 : 0);
     capabilities.SetShortGuardInterval20(sgiSupported);
     capabilities.SetShortGuardInterval40(sgiSupported);
     // Set Maximum A-MSDU Length subfield
@@ -2160,9 +2236,10 @@
         capabilities.SetRxMcsBitmask(mcs.GetMcsValue());
         uint8_t nss = (mcs.GetMcsValue() / 8) + 1;
         NS_ASSERT(nss > 0 && nss < 5);
-        uint64_t dataRate = mcs.GetDataRate(htConfiguration->Get40MHzOperationSupported() ? 40 : 20,
-                                            NanoSeconds(sgiSupported ? 400 : 800),
-                                            nss);
+        uint64_t dataRate =
+            mcs.GetDataRate(htConfiguration->m_40MHzSupported ? MHz_u{40} : MHz_u{20},
+                            NanoSeconds(sgiSupported ? 400 : 800),
+                            nss);
         if (dataRate > maxSupportedRate)
         {
             maxSupportedRate = dataRate;
@@ -2183,18 +2260,16 @@
 VhtCapabilities
 WifiMac::GetVhtCapabilities(uint8_t linkId) const
 {
-    NS_LOG_FUNCTION(this << +linkId);
     NS_ASSERT(GetVhtSupported(linkId));
     VhtCapabilities capabilities;
 
     auto phy = GetWifiPhy(linkId);
     Ptr<HtConfiguration> htConfiguration = GetHtConfiguration();
-    NS_ABORT_MSG_IF(!htConfiguration->Get40MHzOperationSupported(),
+    NS_ABORT_MSG_IF(!htConfiguration->m_40MHzSupported,
                     "VHT stations have to support 40 MHz operation");
     Ptr<VhtConfiguration> vhtConfiguration = GetVhtConfiguration();
-    bool sgiSupported = htConfiguration->GetShortGuardIntervalSupported();
-    capabilities.SetSupportedChannelWidthSet(vhtConfiguration->Get160MHzOperationSupported() ? 1
-                                                                                             : 0);
+    bool sgiSupported = htConfiguration->m_sgiSupported;
+    capabilities.SetSupportedChannelWidthSet(vhtConfiguration->m_160MHzSupported ? 1 : 0);
     // Set Maximum MPDU Length subfield
     uint16_t maxAmsduSize =
         std::max({m_voMaxAmsduSize, m_viMaxAmsduSize, m_beMaxAmsduSize, m_bkMaxAmsduSize});
@@ -2217,7 +2292,7 @@
     // The maximum A-MPDU length in VHT capabilities elements ranges from 2^13-1 to 2^20-1
     capabilities.SetMaxAmpduLength(std::min(std::max(maxAmpduLength, 8191U), 1048575U));
 
-    capabilities.SetRxLdpc(htConfiguration->GetLdpcSupported());
+    capabilities.SetRxLdpc(htConfiguration->m_ldpcSupported);
     capabilities.SetShortGuardIntervalFor80Mhz(sgiSupported);
     capabilities.SetShortGuardIntervalFor160Mhz(sgiSupported);
     uint8_t maxMcs = 0;
@@ -2238,7 +2313,7 @@
         capabilities.SetTxMcsMap(maxMcs, nss);
     }
     uint64_t maxSupportedRateLGI = 0; // in bit/s
-    MHz_u maxWidth = vhtConfiguration->Get160MHzOperationSupported() ? 160 : 80;
+    const auto maxWidth = vhtConfiguration->m_160MHzSupported ? MHz_u{160} : MHz_u{80};
     for (const auto& mcs : phy->GetMcsList(WIFI_MOD_CLASS_VHT))
     {
         if (!mcs.IsAllowed(maxWidth, 1))
@@ -2265,7 +2340,6 @@
 HeCapabilities
 WifiMac::GetHeCapabilities(uint8_t linkId) const
 {
-    NS_LOG_FUNCTION(this << +linkId);
     NS_ASSERT(GetHeSupported());
     HeCapabilities capabilities;
 
@@ -2274,8 +2348,7 @@
     Ptr<VhtConfiguration> vhtConfiguration = GetVhtConfiguration();
     Ptr<HeConfiguration> heConfiguration = GetHeConfiguration();
     uint8_t channelWidthSet = 0;
-    if ((htConfiguration->Get40MHzOperationSupported()) &&
-        (phy->GetPhyBand() == WIFI_PHY_BAND_2_4GHZ))
+    if ((htConfiguration->m_40MHzSupported) && (phy->GetPhyBand() == WIFI_PHY_BAND_2_4GHZ))
     {
         channelWidthSet |= 0x01;
     }
@@ -2284,13 +2357,13 @@
     {
         channelWidthSet |= 0x02;
     }
-    if ((vhtConfiguration->Get160MHzOperationSupported()) &&
+    if ((vhtConfiguration->m_160MHzSupported) &&
         ((phy->GetPhyBand() == WIFI_PHY_BAND_5GHZ) || (phy->GetPhyBand() == WIFI_PHY_BAND_6GHZ)))
     {
         channelWidthSet |= 0x04;
     }
     capabilities.SetChannelWidthSet(channelWidthSet);
-    capabilities.SetLdpcCodingInPayload(htConfiguration->GetLdpcSupported());
+    capabilities.SetLdpcCodingInPayload(htConfiguration->m_ldpcSupported);
     if (heConfiguration->GetGuardInterval().GetNanoSeconds() == 800)
     {
         // todo: We assume for now that if we support 800ns GI then 1600ns GI is supported as well
@@ -2358,7 +2431,6 @@
 EhtCapabilities
 WifiMac::GetEhtCapabilities(uint8_t linkId) const
 {
-    NS_LOG_FUNCTION(this << +linkId);
     NS_ASSERT(GetEhtSupported());
     EhtCapabilities capabilities;
 
@@ -2401,7 +2473,7 @@
 
     const uint8_t maxTxNss = phy->GetMaxSupportedTxSpatialStreams();
     const uint8_t maxRxNss = phy->GetMaxSupportedRxSpatialStreams();
-    if (auto htConfig = GetHtConfiguration(); !htConfig->Get40MHzOperationSupported())
+    if (auto htConfig = GetHtConfiguration(); !htConfig->m_40MHzSupported)
     {
         for (auto maxMcs : {7, 9, 11, 13})
         {
@@ -2429,7 +2501,7 @@
                 phy->IsMcsSupported(WIFI_MOD_CLASS_EHT, maxMcs) ? maxTxNss : 0);
         }
     }
-    if (auto vhtConfig = GetVhtConfiguration(); vhtConfig->Get160MHzOperationSupported())
+    if (auto vhtConfig = GetVhtConfiguration(); vhtConfig->m_160MHzSupported)
     {
         for (auto maxMcs : {9, 11, 13})
         {
@@ -2498,4 +2570,19 @@
     return maxSize;
 }
 
+void
+WifiMac::SetRobustAVStreamingSupported(bool enable)
+{
+    NS_LOG_FUNCTION(this << enable);
+    m_robustAVStreamingSupported = enable;
+}
+
+bool
+WifiMac::GetRobustAVStreamingSupported() const
+{
+    NS_ASSERT_MSG(!m_robustAVStreamingSupported || GetDevice()->GetHtConfiguration(),
+                  "Robust AV Streaming requires STA to be HT-capable");
+    return m_robustAVStreamingSupported;
+}
+
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-mac.h ns-3.44/src/wifi/model/wifi-mac.h
--- ns-3.43/src/wifi/model/wifi-mac.h	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/wifi-mac.h	2025-03-09 16:55:49.803372600 -0700
@@ -9,6 +9,7 @@
 #ifndef WIFI_MAC_H
 #define WIFI_MAC_H
 
+#include "mgt-headers.h"
 #include "qos-utils.h"
 #include "ssid.h"
 #include "wifi-mac-queue-scheduler.h"
@@ -50,7 +51,7 @@
 enum class WifiIcfDrop : uint8_t; // opaque enum declaration
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * Enumeration for type of WiFi station
  */
 enum TypeOfStation
@@ -63,8 +64,8 @@
 };
 
 /**
- * \ingroup wifi
- * \brief The reason why an MPDU was dropped
+ * @ingroup wifi
+ * @brief The reason why an MPDU was dropped
  */
 enum WifiMacDropReason : uint8_t
 {
@@ -77,8 +78,8 @@
 typedef std::unordered_map<uint16_t /* staId */, Ptr<WifiPsdu> /* PSDU */> WifiPsduMap;
 
 /**
- * \brief base class for all MAC-level wifi objects.
- * \ingroup wifi
+ * @brief base class for all MAC-level wifi objects.
+ * @ingroup wifi
  *
  * This class encapsulates all the low-level MAC functionality
  * DCA, EDCA, etc) and all the high-level MAC functionality
@@ -89,8 +90,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -106,98 +107,98 @@
      * used by this model.  Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream first stream index to use
+     * @param stream first stream index to use
      *
-     * \return the number of stream indices assigned by this model
+     * @return the number of stream indices assigned by this model
      */
     virtual int64_t AssignStreams(int64_t stream);
 
     /**
      * Sets the device this PHY is associated with.
      *
-     * \param device the device this PHY is associated with
+     * @param device the device this PHY is associated with
      */
     void SetDevice(const Ptr<WifiNetDevice> device);
     /**
      * Return the device this PHY is associated with
      *
-     * \return the device this PHY is associated with
+     * @return the device this PHY is associated with
      */
     Ptr<WifiNetDevice> GetDevice() const;
 
     /**
      * Get the Frame Exchange Manager associated with the given link
      *
-     * \param linkId the ID of the given link
-     * \return the Frame Exchange Manager
+     * @param linkId the ID of the given link
+     * @return the Frame Exchange Manager
      */
     Ptr<FrameExchangeManager> GetFrameExchangeManager(uint8_t linkId = SINGLE_LINK_OP_ID) const;
 
     /**
-     * \param feManagers the frame exchange managers attached to this MAC.
+     * @param feManagers the frame exchange managers attached to this MAC.
      */
     void SetFrameExchangeManagers(const std::vector<Ptr<FrameExchangeManager>>& feManagers);
 
     /**
      * Get the Channel Access Manager associated with the given link
      *
-     * \param linkId the ID of the given link
-     * \return the Channel Access Manager
+     * @param linkId the ID of the given link
+     * @return the Channel Access Manager
      */
     Ptr<ChannelAccessManager> GetChannelAccessManager(uint8_t linkId = SINGLE_LINK_OP_ID) const;
 
     /**
-     * \param caManagers the channel access managers attached to this MAC.
+     * @param caManagers the channel access managers attached to this MAC.
      */
     void SetChannelAccessManagers(const std::vector<Ptr<ChannelAccessManager>>& caManagers);
 
     /**
      * Get the number of links (can be greater than 1 for 11be devices only).
      *
-     * \return the number of links used by this MAC
+     * @return the number of links used by this MAC
      */
     uint8_t GetNLinks() const;
 
     /**
-     * \return the set of link IDs in use by this device
+     * @return the set of link IDs in use by this device
      */
     const std::set<uint8_t>& GetLinkIds() const;
 
     /**
      * Get the ID of the link having the given MAC address, if any.
      *
-     * \param address the given MAC address
-     * \return the ID of the link having the given MAC address, if any
+     * @param address the given MAC address
+     * @return the ID of the link having the given MAC address, if any
      */
     virtual std::optional<uint8_t> GetLinkIdByAddress(const Mac48Address& address) const;
 
     /**
      * Get the ID of the link (if any) on which the given PHY is operating.
      *
-     * \param phy the given PHY
-     * \return the ID of the link (if any) on which the given PHY is operating
+     * @param phy the given PHY
+     * @return the ID of the link (if any) on which the given PHY is operating
      */
     std::optional<uint8_t> GetLinkForPhy(Ptr<const WifiPhy> phy) const;
 
     /**
      * Get the ID of the link (if any) on which the given PHY is operating.
      *
-     * \param phyId the index of the given PHY in the vector of PHYs held by WifiNetDevice
-     * \return the ID of the link (if any) on which the given PHY is operating
+     * @param phyId the index of the given PHY in the vector of PHYs held by WifiNetDevice
+     * @return the ID of the link (if any) on which the given PHY is operating
      */
     std::optional<uint8_t> GetLinkForPhy(std::size_t phyId) const;
 
     /**
      * Indicate if a given link is on the 6 GHz band.
      *
-     * \param linkId the ID of the given link
-     * \return whether the given link is on the 6 GHz band
+     * @param linkId the ID of the given link
+     * @return whether the given link is on the 6 GHz band
      */
     bool Is6GhzBand(uint8_t linkId) const;
 
     /**
-     * \param remoteAddr the (MLD or link) address of a remote device
-     * \return the MLD address of the remote device having the given (MLD or link) address, if
+     * @param remoteAddr the (MLD or link) address of a remote device
+     * @return the MLD address of the remote device having the given (MLD or link) address, if
      *         the remote device is an MLD.
      */
     std::optional<Mac48Address> GetMldAddress(const Mac48Address& remoteAddr) const;
@@ -213,58 +214,58 @@
      * - Otherwise, return the MAC address of the affiliated STA (which must exists) that
      * can be used to communicate with the remote device.
      *
-     * \param remoteAddr the MAC address of the remote device
-     * \return the local MAC address used to communicate with the remote device
+     * @param remoteAddr the MAC address of the remote device
+     * @return the local MAC address used to communicate with the remote device
      */
     Mac48Address GetLocalAddress(const Mac48Address& remoteAddr) const;
 
     /**
      * Accessor for the Txop object
      *
-     * \return a smart pointer to Txop
+     * @return a smart pointer to Txop
      */
     Ptr<Txop> GetTxop() const;
     /**
      * Accessor for a specified EDCA object
      *
-     * \param ac the Access Category
-     * \return a smart pointer to a QosTxop
+     * @param ac the Access Category
+     * @return a smart pointer to a QosTxop
      */
     Ptr<QosTxop> GetQosTxop(AcIndex ac) const;
     /**
      * Accessor for a specified EDCA object
      *
-     * \param tid the Traffic ID
-     * \return a smart pointer to a QosTxop
+     * @param tid the Traffic ID
+     * @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,
      * if such (Qos)Txop is installed, or a null pointer, otherwise.
      *
-     * \param ac the given Access Category
-     * \return 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,
      *         if such (Qos)Txop is installed, or a null pointer, otherwise
      */
     virtual Ptr<WifiMacQueue> GetTxopQueue(AcIndex ac) const;
 
     /**
      * Check if the MAC has frames to transmit over the given link
-     * \param linkId the ID of the given link.
-     * \return whether the MAC has frames to transmit.
+     * @param linkId the ID of the given link.
+     * @return whether the MAC has frames to transmit.
      */
     virtual bool HasFramesToTransmit(uint8_t linkId);
 
     /**
      * Set the wifi MAC queue scheduler
      *
-     * \param scheduler the wifi MAC queue scheduler
+     * @param scheduler the wifi MAC queue scheduler
      */
     virtual void SetMacQueueScheduler(Ptr<WifiMacQueueScheduler> scheduler);
     /**
      * Get the wifi MAC queue scheduler
      *
-     * \return the wifi MAC queue scheduler
+     * @return the wifi MAC queue scheduler
      */
     Ptr<WifiMacQueueScheduler> GetMacQueueScheduler() const;
 
@@ -273,22 +274,22 @@
      * station it is implementing. This is something that the channel
      * access functions need to know.
      *
-     * \param type the type of station.
+     * @param type the type of station.
      */
     void SetTypeOfStation(TypeOfStation type);
     /**
      * Return the type of station.
      *
-     * \return the type of station.
+     * @return the type of station.
      */
     TypeOfStation GetTypeOfStation() const;
 
     /**
-     * \param ssid the current SSID of this MAC layer.
+     * @param ssid the current SSID of this MAC layer.
      */
     void SetSsid(Ssid ssid);
     /**
-     * \brief Sets the interface in promiscuous mode.
+     * @brief Sets the interface in promiscuous mode.
      *
      * Enables promiscuous mode on the interface. Note that any further
      * filtering on the incoming frame path may affect the overall
@@ -298,31 +299,31 @@
     /**
      * Enable or disable CTS-to-self feature.
      *
-     * \param enable true if CTS-to-self is to be supported,
+     * @param enable true if CTS-to-self is to be supported,
      *               false otherwise
      */
     void SetCtsToSelfSupported(bool enable);
 
     /**
-     * \return the MAC address associated to this MAC layer.
+     * @return the MAC address associated to this MAC layer.
      */
     Mac48Address GetAddress() const;
     /**
-     * \return the SSID which this MAC layer is going to try to stay in.
+     * @return the SSID which this MAC layer is going to try to stay in.
      */
     Ssid GetSsid() const;
     /**
-     * \param address the current address of this MAC layer.
+     * @param address the current address of this MAC layer.
      */
     virtual void SetAddress(Mac48Address address);
     /**
-     * \return the BSSID of the network the given link belongs to.
-     * \param linkId the ID of the given link
+     * @return the BSSID of the network the given link belongs to.
+     * @param linkId the ID of the given link
      */
     Mac48Address GetBssid(uint8_t linkId) const;
     /**
-     * \param bssid the BSSID of the network that the given link belongs to.
-     * \param linkId the ID of the given link
+     * @param bssid the BSSID of the network that the given link belongs to.
+     * @param linkId the ID of the given link
      */
     void SetBssid(Mac48Address bssid, uint8_t linkId);
 
@@ -331,9 +332,9 @@
      * the station with the given address for the given reason. The given MAC address
      * must be the MLD address in case the addressed device is multi-link.
      *
-     * \param reason the reason for blocking transmissions
-     * \param address the MAC address of the given device
-     * \param linkIds the IDs of the links to block
+     * @param reason the reason for blocking transmissions
+     * @param address the MAC address of the given device
+     * @param linkIds the IDs of the links to block
      */
     void BlockUnicastTxOnLinks(WifiQueueBlockedReason reason,
                                const Mac48Address& address,
@@ -344,9 +345,9 @@
      * the station with the given address for the given reason. The given MAC address
      * must be the MLD address in case the addressed device is multi-link.
      *
-     * \param reason the reason for unblocking transmissions
-     * \param address the MAC address of the given device
-     * \param linkIds the IDs of the links to unblock
+     * @param reason the reason for unblocking transmissions
+     * @param address the MAC address of the given device
+     * @param linkIds the IDs of the links to unblock
      */
     void UnblockUnicastTxOnLinks(WifiQueueBlockedReason reason,
                                  const Mac48Address& address,
@@ -356,11 +357,11 @@
      * Check whether the transmission of the packets in the given container queue of the given
      * Access Category are blocked on the given link for the given reason (if any).
      *
-     * \param ac the given Access Category
-     * \param queueId the given container queue
-     * \param linkId the ID of the given link
-     * \param reason the reason to block transmissions (REASONS_COUNT indicate no reason)
-     * \return whether transmission is blocked
+     * @param ac the given Access Category
+     * @param queueId the given container queue
+     * @param linkId the ID of the given link
+     * @param reason the reason to block transmissions (REASONS_COUNT indicate no reason)
+     * @return whether transmission is blocked
      */
     bool GetTxBlockedOnLink(
         AcIndex ac,
@@ -372,14 +373,14 @@
      * Return true if packets can be forwarded to the given destination,
      * false otherwise.
      *
-     * \param to the address to which the packet should be sent
-     * \return whether packets can be forwarded to the given destination
+     * @param to the address to which the packet should be sent
+     * @return whether packets can be forwarded to the given destination
      */
     virtual bool CanForwardPacketsTo(Mac48Address to) const = 0;
 
     /**
-     * \param packet the packet to send.
-     * \param to the address to which the packet should be sent.
+     * @param packet the packet to send.
+     * @param to the address to which the packet should be sent.
      *
      * The packet should be enqueued in a TX queue, and should be
      * dequeued as soon as the DCF/EDCA function determines that
@@ -388,9 +389,9 @@
     void Enqueue(Ptr<Packet> packet, Mac48Address to);
 
     /**
-     * \param packet the packet to send.
-     * \param to the address to which the packet should be sent.
-     * \param from the address from which the packet should be sent.
+     * @param packet the packet to send.
+     * @param to the address to which the packet should be sent.
+     * @param from the address from which the packet should be sent.
      *
      * The packet should be enqueued in a TX queue, and should be
      * dequeued as soon as the DCF/EDCA function determines that
@@ -401,10 +402,10 @@
     void Enqueue(Ptr<Packet> packet, Mac48Address to, Mac48Address from);
 
     /**
-     * \param packet the packet to send.
-     * \param to the address to which the packet should be sent.
-     * \param from the address from which the packet should be sent.
-     * \param tid the TID to use to send this packet
+     * @param packet the packet to send.
+     * @param to the address to which the packet should be sent.
+     * @param from the address from which the packet should be sent.
+     * @param tid the TID to use to send this packet
      *
      * The packet should be enqueued in a TX queue, and should be
      * dequeued as soon as the DCF/EDCA function determines that
@@ -414,7 +415,7 @@
     void Enqueue(Ptr<Packet> packet, Mac48Address to, Mac48Address from, uint8_t tid);
 
     /**
-     * \return if this MAC supports sending from arbitrary address.
+     * @return if this MAC supports sending from arbitrary address.
      *
      * The interface may or may not support sending from arbitrary address.
      * This function returns true if sending from arbitrary address is supported,
@@ -423,12 +424,12 @@
     virtual bool SupportsSendFrom() const;
 
     /**
-     * \param phys the physical layers attached to this MAC.
+     * @param phys the physical layers attached to this MAC.
      */
     virtual void SetWifiPhys(const std::vector<Ptr<WifiPhy>>& phys);
     /**
-     * \param linkId the index (starting at 0) of the PHY object to retrieve
-     * \return the physical layer attached to this MAC
+     * @param linkId the index (starting at 0) of the PHY object to retrieve
+     * @return the physical layer attached to this MAC
      */
     Ptr<WifiPhy> GetWifiPhy(uint8_t linkId = SINGLE_LINK_OP_ID) const;
     /**
@@ -437,18 +438,18 @@
     void ResetWifiPhys();
 
     /**
-     * \param stationManager the station manager attached to this MAC.
+     * @param stationManager the station manager attached to this MAC.
      */
     void SetWifiRemoteStationManager(Ptr<WifiRemoteStationManager> stationManager);
     /**
-     * \param stationManagers the station managers attached to this MAC.
+     * @param stationManagers the station managers attached to this MAC.
      */
     void SetWifiRemoteStationManagers(
         const std::vector<Ptr<WifiRemoteStationManager>>& stationManagers);
     /**
-     * \param linkId the ID (starting at 0) of the link of the RemoteStationManager object
+     * @param linkId the ID (starting at 0) of the link of the RemoteStationManager object
      * to retrieve
-     * \return the remote station manager operating on the given link
+     * @return the remote station manager operating on the given link
      */
     Ptr<WifiRemoteStationManager> GetWifiRemoteStationManager(uint8_t linkId = 0) const;
 
@@ -456,23 +457,23 @@
      * This type defines the callback of a higher layer that a
      * WifiMac(-derived) object invokes to pass a packet up the stack.
      *
-     * \param packet the packet that has been received.
-     * \param from the MAC address of the device that sent the packet.
-     * \param to the MAC address of the device that the packet is destined for.
+     * @param packet the packet that has been received.
+     * @param from the MAC address of the device that sent the packet.
+     * @param to the MAC address of the device that the packet is destined for.
      */
     typedef Callback<void, Ptr<const Packet>, Mac48Address, Mac48Address> ForwardUpCallback;
 
     /**
-     * \param upCallback the callback to invoke when a packet must be
+     * @param upCallback the callback to invoke when a packet must be
      *        forwarded up the stack.
      */
     void SetForwardUpCallback(ForwardUpCallback upCallback);
     /**
-     * \param linkUp the callback to invoke when the link becomes up.
+     * @param linkUp the callback to invoke when the link becomes up.
      */
     virtual void SetLinkUpCallback(Callback<void> linkUp);
     /**
-     * \param linkDown the callback to invoke when the link becomes down.
+     * @param linkDown the callback to invoke when the link becomes down.
      */
     void SetLinkDownCallback(Callback<void> linkDown);
     /* Next functions are not pure virtual so non QoS WifiMacs are not
@@ -482,12 +483,12 @@
     /**
      * Notify that channel on the given link has been switched.
      *
-     * \param linkId the ID of the given link
+     * @param linkId the ID of the given link
      */
     virtual void NotifyChannelSwitching(uint8_t linkId);
 
     /**
-     * \param packet the packet being enqueued
+     * @param packet the packet being enqueued
      *
      * Public method used to fire a MacTx trace. Implemented for encapsulation purposes.
      * Note this trace indicates that the packet was accepted by the device only.
@@ -495,7 +496,7 @@
      */
     void NotifyTx(Ptr<const Packet> packet);
     /**
-     * \param packet the packet being dropped
+     * @param packet the packet being dropped
      *
      * Public method used to fire a MacTxDrop trace.
      * This trace indicates that the packet was dropped before it was queued for
@@ -503,163 +504,176 @@
      */
     void NotifyTxDrop(Ptr<const Packet> packet);
     /**
-     * \param packet the packet we received
+     * @param packet the packet we received
      *
      * Public method used to fire a MacRx trace. Implemented for encapsulation purposes.
      */
     void NotifyRx(Ptr<const Packet> packet);
     /**
-     * \param packet the packet we received promiscuously
+     * @param packet the packet we received promiscuously
      *
      * Public method used to fire a MacPromiscRx trace. Implemented for encapsulation purposes.
      */
     void NotifyPromiscRx(Ptr<const Packet> packet);
     /**
-     * \param packet the packet we received but is not destined for us
+     * @param packet the packet we received but is not destined for us
      *
      * Public method used to fire a MacRxDrop trace. Implemented for encapsulation purposes.
      */
     void NotifyRxDrop(Ptr<const Packet> packet);
 
     /**
-     * \return pointer to HtConfiguration if it exists
+     * @return pointer to HtConfiguration if it exists
      */
     Ptr<HtConfiguration> GetHtConfiguration() const;
     /**
-     * \return pointer to VhtConfiguration if it exists
+     * @return pointer to VhtConfiguration if it exists
      */
     Ptr<VhtConfiguration> GetVhtConfiguration() const;
     /**
-     * \return pointer to HeConfiguration if it exists
+     * @return pointer to HeConfiguration if it exists
      */
     Ptr<HeConfiguration> GetHeConfiguration() const;
     /**
-     * \return pointer to EhtConfiguration if it exists
+     * @return pointer to EhtConfiguration if it exists
      */
     Ptr<EhtConfiguration> GetEhtConfiguration() const;
 
     /**
      * Return the extended capabilities of the device.
      *
-     * \return the extended capabilities that we support
+     * @return the extended capabilities that we support
      */
     ExtendedCapabilities GetExtendedCapabilities() const;
     /**
      * Return the HT capabilities of the device for the given link.
      *
-     * \param linkId the ID of the given link
-     * \return the HT capabilities that we support
+     * @param linkId the ID of the given link
+     * @return the HT capabilities that we support
      */
     HtCapabilities GetHtCapabilities(uint8_t linkId) const;
     /**
      * Return the VHT capabilities of the device for the given link.
      *
-     * \param linkId the ID of the given link
-     * \return the VHT capabilities that we support
+     * @param linkId the ID of the given link
+     * @return the VHT capabilities that we support
      */
     VhtCapabilities GetVhtCapabilities(uint8_t linkId) const;
     /**
      * Return the HE capabilities of the device for the given link.
      *
-     * \param linkId the ID of the given link
-     * \return the HE capabilities that we support
+     * @param linkId the ID of the given link
+     * @return the HE capabilities that we support
      */
     HeCapabilities GetHeCapabilities(uint8_t linkId) const;
     /**
      * Return the HE 6GHz band capabilities of the device for the given 6 GHz link.
      *
-     * \param linkId the ID of the given 6 GHz link
-     * \return the HE 6GHz band capabilities that we support
+     * @param linkId the ID of the given 6 GHz link
+     * @return the HE 6GHz band capabilities that we support
      */
     He6GhzBandCapabilities GetHe6GhzBandCapabilities(uint8_t linkId) const;
     /**
      * Return the EHT capabilities of the device for the given link.
      *
-     * \param linkId the ID of the given link
-     * \return the EHT capabilities that we support
+     * @param linkId the ID of the given link
+     * @return the EHT capabilities that we support
      */
     EhtCapabilities GetEhtCapabilities(uint8_t linkId) const;
 
     /**
      * Return whether the device supports QoS.
      *
-     * \return true if QoS is supported, false otherwise
+     * @return true if QoS is supported, false otherwise
      */
     bool GetQosSupported() const;
     /**
      * Return whether the device supports ERP on the given link.
      *
-     * \param linkId the ID of the given link
-     * \return true if ERP is supported, false otherwise
+     * @param linkId the ID of the given link
+     * @return true if ERP is supported, false otherwise
      */
     bool GetErpSupported(uint8_t linkId) const;
     /**
      * Return whether the device supports DSSS on the given link.
      *
-     * \param linkId the ID of the given link
-     * \return true if DSSS is supported, false otherwise
+     * @param linkId the ID of the given link
+     * @return true if DSSS is supported, false otherwise
      */
     bool GetDsssSupported(uint8_t linkId) const;
     /**
      * Return whether the device supports HT on the given link.
      *
-     * \param linkId the ID of the given link.
-     * \return true if HT is supported, false otherwise
+     * @param linkId the ID of the given link.
+     * @return true if HT is supported, false otherwise
      */
     bool GetHtSupported(uint8_t linkId) const;
     /**
      * Return whether the device supports VHT on the given link.
      *
-     * \param linkId the ID of the given link.
-     * \return true if VHT is supported, false otherwise
+     * @param linkId the ID of the given link.
+     * @return true if VHT is supported, false otherwise
      */
     bool GetVhtSupported(uint8_t linkId) const;
     /**
      * Return whether the device supports HE.
      *
-     * \return true if HE is supported, false otherwise
+     * @return true if HE is supported, false otherwise
      */
     bool GetHeSupported() const;
     /**
      * Return whether the device supports EHT.
      *
-     * \return true if EHT is supported, false otherwise
+     * @return true if EHT is supported, false otherwise
      */
     bool GetEhtSupported() const;
 
     /**
-     * \param address the (link or MLD) address of a remote station
-     * \return true if the remote station with the given address supports HT
+     * @param address the (link or MLD) address of a remote station
+     * @return true if the remote station with the given address supports HT
      */
     bool GetHtSupported(const Mac48Address& address) const;
     /**
-     * \param address the (link or MLD) address of a remote station
-     * \return true if the remote station with the given address supports VHT
+     * @param address the (link or MLD) address of a remote station
+     * @return true if the remote station with the given address supports VHT
      */
     bool GetVhtSupported(const Mac48Address& address) const;
     /**
-     * \param address the (link or MLD) address of a remote station
-     * \return true if the remote station with the given address supports HE
+     * @param address the (link or MLD) address of a remote station
+     * @return true if the remote station with the given address supports HE
      */
     bool GetHeSupported(const Mac48Address& address) const;
     /**
-     * \param address the (link or MLD) address of a remote station
-     * \return true if the remote station with the given address supports EHT
+     * @param address the (link or MLD) address of a remote station
+     * @return true if the remote station with the given address supports EHT
      */
     bool GetEhtSupported(const Mac48Address& address) const;
 
     /**
+     * Enable or disable Robust AV Streaming support for the device.
+     *
+     * @param enable whether Robust AV Streaming is supported
+     */
+    void SetRobustAVStreamingSupported(bool enable);
+    /**
+     * Return whether the device supports Robust AV Streaming.
+     *
+     * @return true if Robust AV Streaming is supported, false otherwise
+     */
+    bool GetRobustAVStreamingSupported() const;
+
+    /**
      * Return the maximum A-MPDU size of the given Access Category.
      *
-     * \param ac Access Category index
-     * \return the maximum A-MPDU size
+     * @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
+     * @param ac Access Category index
+     * @return the maximum A-MSDU size
      */
     uint16_t GetMaxAmsduSize(AcIndex ac) const;
 
@@ -671,60 +685,66 @@
         std::optional<std::reference_wrapper<const RecipientBlockAckAgreement>>;
 
     /**
-     * \param recipient (link or device) MAC address of the recipient
-     * \param tid traffic ID.
+     * @param recipient (link or device) MAC address of the recipient
+     * @param tid traffic ID
+     * @param gcrGroupAddr the GCR Group Address (only if it is a GCR Block Ack agreement)
      *
-     * \return the originator block ack agreement, if one has been established
+     * @return the originator block ack agreement, if one has been established
      *
      * Checks if an originator block ack agreement is established with station addressed by
      * <i>recipient</i> for TID <i>tid</i>.
      */
-    OriginatorAgreementOptConstRef GetBaAgreementEstablishedAsOriginator(Mac48Address recipient,
-                                                                         uint8_t tid) const;
-    /**
-     * \param originator (link or device) MAC address of the originator
-     * \param tid traffic ID.
+    OriginatorAgreementOptConstRef GetBaAgreementEstablishedAsOriginator(
+        Mac48Address recipient,
+        uint8_t tid,
+        std::optional<Mac48Address> gcrGroupAddr = std::nullopt) const;
+    /**
+     * @param originator (link or device) MAC address of the originator
+     * @param tid traffic ID
+     * @param gcrGroupAddr the GCR Group Address (only if it is a GCR Block Ack agreement)
      *
-     * \return the recipient block ack agreement, if one has been established
+     * @return the recipient block ack agreement, if one has been established
      *
      * Checks if a recipient block ack agreement is established with station addressed by
      * <i>originator</i> for TID <i>tid</i>.
      */
-    RecipientAgreementOptConstRef GetBaAgreementEstablishedAsRecipient(Mac48Address originator,
-                                                                       uint8_t tid) const;
+    RecipientAgreementOptConstRef GetBaAgreementEstablishedAsRecipient(
+        Mac48Address originator,
+        uint8_t tid,
+        std::optional<Mac48Address> gcrGroupAddr = std::nullopt) const;
 
     /**
-     * \param recipient MAC address
-     * \param tid traffic ID
+     * @param recipient MAC address
+     * @param tid traffic ID
      *
-     * \return the type of Block Acks sent by the recipient
+     * @return the type of Block Acks sent by the recipient
      *
      * This function returns the type of Block Acks sent by the recipient.
      */
     BlockAckType GetBaTypeAsOriginator(const Mac48Address& recipient, uint8_t tid) const;
     /**
-     * \param recipient MAC address of recipient
-     * \param tid traffic ID
+     * @param recipient MAC address of recipient
+     * @param tid traffic ID
      *
-     * \return the type of Block Ack Requests sent to the recipient
+     * @return the type of Block Ack Requests sent to the recipient
      *
      * This function returns the type of Block Ack Requests sent to the recipient.
      */
     BlockAckReqType GetBarTypeAsOriginator(const Mac48Address& recipient, uint8_t tid) const;
     /**
-     * \param originator MAC address of originator
-     * \param tid traffic ID
+     * @param originator MAC address of originator
+     * @param tid traffic ID
      *
-     * \return the type of Block Acks sent to the originator
+     * @return the type of Block Acks sent to the originator
      *
      * This function returns the type of Block Acks sent to the originator.
      */
     BlockAckType GetBaTypeAsRecipient(Mac48Address originator, uint8_t tid) const;
     /**
-     * \param originator MAC address of originator
-     * \param tid traffic ID
+     * @param originator MAC address of originator
+     * @param tid traffic ID
      *
-     * \return the type of Block Ack Requests sent by the originator
+     * @return the type of Block Ack Requests sent by the originator
      *
      * This function returns the type of Block Ack Requests sent by the originator.
      */
@@ -734,30 +754,42 @@
      * Get the maximum Block Ack buffer size (in number of MPDUs) supported by the given device,
      * if any, or by this device, otherwise, based on the supported standard.
      *
-     * \param address the (MLD or link) address of the given device
-     * \return the maximum supported Block Ack buffer size (in number of MPDUs)
+     * @param address the (MLD or link) address of the given device
+     * @return the maximum supported Block Ack buffer size (in number of MPDUs)
      */
     uint16_t GetMaxBaBufferSize(std::optional<Mac48Address> address = std::nullopt) const;
 
     /**
-     * \param size the size (in number of MPDUs) of the buffer used for each BlockAck
+     * @param size the size (in number of MPDUs) of the buffer used for each BlockAck
      *             agreement in which this node is a recipient
      */
     void SetMpduBufferSize(uint16_t size);
 
     /**
-     * \return the size (in number of MPDUs) of the buffer used for each BlockAck
+     * @return the size (in number of MPDUs) of the buffer used for each BlockAck
      *             agreement in which this node is a recipient
      */
     uint16_t GetMpduBufferSize() const;
 
     /**
+     * Set the frame retry limit.
+     *
+     * @param limit the frame retry limit
+     */
+    void SetFrameRetryLimit(uint32_t limit);
+
+    /**
+     * @return the frame retry limit
+     */
+    uint32_t GetFrameRetryLimit() const;
+
+    /**
      * Get the TID-to-Link Mapping negotiated with the given MLD (if any) for the given direction.
      * An empty mapping indicates the default mapping.
      *
-     * \param mldAddr the MLD address of the given MLD
-     * \param dir the given direction (DL or UL)
-     * \return the negotiated TID-to-Link Mapping
+     * @param mldAddr the MLD address of the given MLD
+     * @param dir the given direction (DL or UL)
+     * @return the negotiated TID-to-Link Mapping
      */
     std::optional<std::reference_wrapper<const WifiTidLinkMapping>> GetTidToLinkMapping(
         Mac48Address mldAddr,
@@ -767,11 +799,11 @@
      * Check whether the given TID is mapped on the given link in the given direction for the
      * given MLD.
      *
-     * \param mldAddr the MLD address of the given MLD
-     * \param dir the given direction (DL or UL)
-     * \param tid the given TID
-     * \param linkId the ID of the given link
-     * \return whether the given TID is mapped on the given link in the given direction for the
+     * @param mldAddr the MLD address of the given MLD
+     * @param dir the given direction (DL or UL)
+     * @param tid the given TID
+     * @param linkId the ID of the given link
+     * @return whether the given TID is mapped on the given link in the given direction for the
      *         given MLD
      */
     bool TidMappedOnLink(Mac48Address mldAddr,
@@ -785,8 +817,8 @@
     void NotifyConstructionCompleted() override;
 
     /**
-     * \param cwMin the minimum contention window size
-     * \param cwMax the maximum contention window size
+     * @param cwMin the minimum contention window size
+     * @param cwMax the maximum contention window size
      *
      * This method is called to set the minimum and the maximum
      * contention window size.
@@ -796,37 +828,37 @@
     /**
      * Enable or disable short slot time feature.
      *
-     * \param enable true if short slot time is to be supported,
+     * @param enable true if short slot time is to be supported,
      *               false otherwise
      */
     void SetShortSlotTimeSupported(bool enable);
     /**
-     * \return whether the device supports short slot time capability.
+     * @return whether the device supports short slot time capability.
      */
     bool GetShortSlotTimeSupported() const;
 
     /**
      * Accessor for the AC_VO channel access function
      *
-     * \return a smart pointer to QosTxop
+     * @return a smart pointer to QosTxop
      */
     Ptr<QosTxop> GetVOQueue() const;
     /**
      * Accessor for the AC_VI channel access function
      *
-     * \return a smart pointer to QosTxop
+     * @return a smart pointer to QosTxop
      */
     Ptr<QosTxop> GetVIQueue() const;
     /**
      * Accessor for the AC_BE channel access function
      *
-     * \return a smart pointer to QosTxop
+     * @return a smart pointer to QosTxop
      */
     Ptr<QosTxop> GetBEQueue() const;
     /**
      * Accessor for the AC_BK channel access function
      *
-     * \return a smart pointer to QosTxop
+     * @return a smart pointer to QosTxop
      */
     Ptr<QosTxop> GetBKQueue() const;
 
@@ -847,16 +879,16 @@
      * buffered MPDU has been received on); in such a cases, the value
      * of <i>linkId</i> should be WIFI_LINKID_UNDEFINED.
      *
-     * \param mpdu the MPDU that has been received.
-     * \param linkId the ID of the given link
+     * @param mpdu the MPDU that has been received.
+     * @param linkId the ID of the given link
      */
     virtual void Receive(Ptr<const WifiMpdu> mpdu, uint8_t linkId);
     /**
      * Forward the packet up to the device.
      *
-     * \param packet the packet that we are forwarding up to the device
-     * \param from the address of the source
-     * \param to the address of the destination
+     * @param packet the packet that we are forwarding up to the device
+     * @param from the address of the source
+     * @param to the address of the destination
      */
     void ForwardUp(Ptr<const Packet> packet, Mac48Address from, Mac48Address to);
 
@@ -864,7 +896,7 @@
      * This method can be called to de-aggregate an A-MSDU and forward
      * the constituent packets up the stack.
      *
-     * \param mpdu the MPDU containing the A-MSDU.
+     * @param mpdu the MPDU containing the A-MSDU.
      */
     virtual void DeaggregateAmsduAndForward(Ptr<const WifiMpdu> mpdu);
 
@@ -872,8 +904,8 @@
      * Apply the TID-to-Link Mapping negotiated with the given MLD for the given direction
      * by properly configuring the queue scheduler.
      *
-     * \param mldAddr the MLD MAC address of the given MLD
-     * \param dir the given direction (DL or UL)
+     * @param mldAddr the MLD MAC address of the given MLD
+     * @param dir the given direction (DL or UL)
      */
     void ApplyTidLinkMapping(const Mac48Address& mldAddr, WifiDirection dir);
 
@@ -882,7 +914,7 @@
      * is normally called by a non-AP MLD upon completing ML setup to have its link IDs
      * match AP MLD's link IDs.
      *
-     * \param links a set of pairs (from, to) each mapping a current link ID to the
+     * @param links a set of pairs (from, to) each mapping a current link ID to the
      *              link ID it has to become (i.e., link 'from' becomes link 'to')
      */
     void SwapLinks(std::map<uint8_t, uint8_t> links);
@@ -909,15 +941,15 @@
     };
 
     /**
-     * \return a const reference to the map of link entities
+     * @return a const reference to the map of link entities
      */
     const std::map<uint8_t, std::unique_ptr<LinkEntity>>& GetLinks() const;
 
     /**
      * Get a reference to the link associated with the given ID.
      *
-     * \param linkId the given link ID
-     * \return a reference to the link associated with the given ID
+     * @param linkId the given link ID
+     * @return a reference to the link associated with the given ID
      */
     LinkEntity& GetLink(uint8_t linkId) const;
 
@@ -925,9 +957,9 @@
      * Update the TID-to-Link Mappings for the given MLD in the given direction based on the
      * given negotiated mappings. An empty mapping indicates the default mapping.
      *
-     * \param mldAddr the MLD address of the given MLD
-     * \param dir the given direction (DL or UL)
-     * \param mapping the negotiated TID-to-Link Mapping
+     * @param mldAddr the MLD address of the given MLD
+     * @param dir the given direction (DL or UL)
+     * @param mapping the negotiated TID-to-Link Mapping
      */
     void UpdateTidToLinkMapping(const Mac48Address& mldAddr,
                                 WifiDirection dir,
@@ -953,11 +985,11 @@
     virtual void DoCompleteConfig() = 0;
 
     /**
-     * \param dcf the DCF to be configured
-     * \param cwmin the minimum contention window for the DCF
-     * \param cwmax the maximum contention window for the DCF
-     * \param isDsss vector of flags to indicate whether PHY is DSSS or HR/DSSS for every link
-     * \param ac the access category for the DCF
+     * @param dcf the DCF to be configured
+     * @param cwmin the minimum contention window for the DCF
+     * @param cwmax the maximum contention window for the DCF
+     * @param isDsss vector of flags to indicate whether PHY is DSSS or HR/DSSS for every link
+     * @param ac the access category for the DCF
      *
      * Configure the DCF with appropriate values depending on the given access category.
      */
@@ -970,7 +1002,7 @@
     /**
      * Configure PHY dependent parameters such as CWmin and CWmax on the given link.
      *
-     * \param linkId the ID of the given link
+     * @param linkId the ID of the given link
      */
     void ConfigurePhyDependentParameters(uint8_t linkId);
 
@@ -978,7 +1010,7 @@
      * Enable or disable QoS support for the device. Construct a Txop object or QosTxop objects
      * accordingly. This method is private so that it is only used while constructing this object.
      *
-     * \param enable whether QoS is supported
+     * @param enable whether QoS is supported
      */
     void SetQosSupported(bool enable);
 
@@ -986,7 +1018,7 @@
      * Set the Txop object.
      * This method is private so that it is only used while constructing this object.
      *
-     * \param dcf the Txop object
+     * @param dcf the Txop object
      */
     void SetTxop(Ptr<Txop> dcf);
 
@@ -994,7 +1026,7 @@
      * Set the AC_VO channel access function
      * This method is private so that it is only used while constructing this object.
      *
-     * \param edca the QosTxop object for AC_VO
+     * @param edca the QosTxop object for AC_VO
      */
     void SetVoQueue(Ptr<QosTxop> edca);
 
@@ -1002,7 +1034,7 @@
      * Set the AC_VI channel access function
      * This method is private so that it is only used while constructing this object.
      *
-     * \param edca the QosTxop object for AC_VI
+     * @param edca the QosTxop object for AC_VI
      */
     void SetViQueue(Ptr<QosTxop> edca);
 
@@ -1010,7 +1042,7 @@
      * Set the AC_BE channel access function
      * This method is private so that it is only used while constructing this object.
      *
-     * \param edca the QosTxop object for AC_BE
+     * @param edca the QosTxop object for AC_BE
      */
     void SetBeQueue(Ptr<QosTxop> edca);
 
@@ -1018,7 +1050,7 @@
      * Set the AC_BK channel access function
      * This method is private so that it is only used while constructing this object.
      *
-     * \param edca the QosTxop object for AC_BK
+     * @param edca the QosTxop object for AC_BK
      */
     void SetBkQueue(Ptr<QosTxop> edca);
 
@@ -1032,22 +1064,22 @@
      * This method is a private utility invoked to configure the channel
      * access function for the specified Access Category.
      *
-     * \param ac the Access Category of the queue to initialise.
+     * @param ac the Access Category of the queue to initialise.
      */
     void SetupEdcaQueue(AcIndex ac);
 
     /**
      * If no link has been already created, create the given number links; otherwise, do nothing.
      *
-     * \param nLinks the given number of links
-     * \return whether the given number of links have been created
+     * @param nLinks the given number of links
+     * @return whether the given number of links have been created
      */
     bool CreateLinksIfNeeded(std::size_t nLinks);
 
     /**
      * Create a LinkEntity object.
      *
-     * \return a unique pointer to the created LinkEntity object
+     * @return a unique pointer to the created LinkEntity object
      */
     virtual std::unique_ptr<LinkEntity> CreateLinkEntity() const;
 
@@ -1056,7 +1088,7 @@
      * link ID stored by the Frame Exchange Manager and the Channel Access Manager operating
      * on that link.
      *
-     * \param id the (new) ID of the link that has changed ID
+     * @param id the (new) ID of the link that has changed ID
      */
     void UpdateLinkId(uint8_t id);
 
@@ -1066,80 +1098,80 @@
      * given MAC address. This method is overridden because its implementation depends
      * on the type of station.
      *
-     * \param remoteAddr the MAC address of the remote single link device
-     * \return the MAC address of the affiliated STA used to communicate with the remote device
+     * @param remoteAddr the MAC address of the remote single link device
+     * @return the MAC address of the affiliated STA used to communicate with the remote device
      */
     virtual Mac48Address DoGetLocalAddress(const Mac48Address& remoteAddr) const;
 
     /**
      * Enable or disable ERP support for the given link.
      *
-     * \param enable whether ERP is supported
-     * \param linkId the ID of the given link
+     * @param enable whether ERP is supported
+     * @param linkId the ID of the given link
      */
     void SetErpSupported(bool enable, uint8_t linkId);
     /**
      * Enable or disable DSSS support for the given link.
      *
-     * \param enable whether DSSS is supported
-     * \param linkId the ID of the given link
+     * @param enable whether DSSS is supported
+     * @param linkId the ID of the given link
      */
     void SetDsssSupported(bool enable, uint8_t linkId);
 
     /**
      * Set the block ack threshold for AC_VO.
      *
-     * \param threshold the block ack threshold for AC_VO.
+     * @param threshold the block ack threshold for AC_VO.
      */
     void SetVoBlockAckThreshold(uint8_t threshold);
     /**
      * Set the block ack threshold for AC_VI.
      *
-     * \param threshold the block ack threshold for AC_VI.
+     * @param threshold the block ack threshold for AC_VI.
      */
     void SetViBlockAckThreshold(uint8_t threshold);
     /**
      * Set the block ack threshold for AC_BE.
      *
-     * \param threshold the block ack threshold for AC_BE.
+     * @param threshold the block ack threshold for AC_BE.
      */
     void SetBeBlockAckThreshold(uint8_t threshold);
     /**
      * Set the block ack threshold for AC_BK.
      *
-     * \param threshold the block ack threshold for AC_BK.
+     * @param threshold the block ack threshold for AC_BK.
      */
     void SetBkBlockAckThreshold(uint8_t threshold);
 
     /**
      * Set VO block ack inactivity timeout.
      *
-     * \param timeout the VO block ack inactivity timeout.
+     * @param timeout the VO block ack inactivity timeout.
      */
     void SetVoBlockAckInactivityTimeout(uint16_t timeout);
     /**
      * Set VI block ack inactivity timeout.
      *
-     * \param timeout the VI block ack inactivity timeout.
+     * @param timeout the VI block ack inactivity timeout.
      */
     void SetViBlockAckInactivityTimeout(uint16_t timeout);
     /**
      * Set BE block ack inactivity timeout.
      *
-     * \param timeout the BE block ack inactivity timeout.
+     * @param timeout the BE block ack inactivity timeout.
      */
     void SetBeBlockAckInactivityTimeout(uint16_t timeout);
     /**
      * Set BK block ack inactivity timeout.
      *
-     * \param timeout the BK block ack inactivity timeout.
+     * @param timeout the BK block ack inactivity timeout.
      */
     void SetBkBlockAckInactivityTimeout(uint16_t timeout);
 
     /**
-     * \param mpdu the MPDU to send.
-     * \param to the address to which the packet should be sent.
-     * \param from the address from which the packet should be sent.
+     * @param mpdu the MPDU to send.
+     * @param to the address to which the packet should be sent.
+     * @param from the address from which the packet should be sent.
      *
      * Subclasses need to implement this method to finalize the MAC header of the MPDU
      * (MAC addresses and ToDS/FromDS flags) and enqueue the MPDU in a TX queue.
@@ -1149,12 +1181,21 @@
     /**
      * Allow subclasses to take actions when a packet to enqueue has been dropped.
      *
-     * \param packet the dropped packet
-     * \param to the address to which the packet should have been sent
+     * @param packet the dropped packet
+     * @param to the address to which the packet should have been sent
      */
     virtual void NotifyDropPacketToEnqueue(Ptr<Packet> packet, Mac48Address to);
 
     /**
+     * Notify the remote station manager if the given expired (hence dropped) MPDU is a management
+     * or data frame (with a unicast receiver address) that has been already transmitted and is not
+     * in flight (otherwise, it is handled when the ack is received or the TX timeout expires).
+     *
+     * @param mpdu the expired MPDU
+     */
+    void NotifyRsmOfExpiredMpdu(Ptr<const WifiMpdu> mpdu);
+
+    /**
      * This Boolean is set \c true iff this WifiMac is to model
      * 802.11e/WMM style Quality of Service. It is exposed through the
      * attribute system.
@@ -1200,10 +1241,13 @@
     uint32_t m_beMaxAmpduSize; ///< maximum A-MPDU size for AC_BE (in bytes)
     uint32_t m_bkMaxAmpduSize; ///< maximum A-MPDU size for AC_BK (in bytes)
 
-    uint16_t m_mpduBufferSize; //!< BlockAck buffer size (in number of MPDUs)
+    uint16_t m_mpduBufferSize;  //!< BlockAck buffer size (in number of MPDUs)
+    uint32_t m_frameRetryLimit; //!< the frame retry limit
 
     UniformRandomBitGenerator m_shuffleLinkIdsGen; //!< random number generator to shuffle link IDs
 
+    bool m_robustAVStreamingSupported; ///< flag whether robust AV streaming is supported
+
     /// @brief DL TID-to-Link Mapping negotiated with an MLD (identified by its MLD address)
     std::unordered_map<Mac48Address, WifiTidLinkMapping, WifiAddressHash> m_dlTidLinkMappings;
     /// @brief UL TID-to-Link Mapping negotiated with an MLD (identified by its MLD address)
@@ -1215,14 +1259,14 @@
      * The trace source fired when packets come into the "top" of the device
      * at the L3/L2 transition, before being queued for transmission.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_macTxTrace;
     /**
      * The trace source fired when packets coming into the "top" of the device
      * are dropped at the MAC layer before being queued for transmission.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_macTxDropTrace;
     /**
@@ -1230,7 +1274,7 @@
      * immediately before being forwarded up to higher layers (at the L2/L3
      * transition).  This is a promiscuous trace.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_macPromiscRxTrace;
     /**
@@ -1238,22 +1282,22 @@
      * immediately before being forwarded up to higher layers (at the L2/L3
      * transition).  This is a non- promiscuous trace.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_macRxTrace;
     /**
      * The trace source fired when packets coming into the "top" of the device
      * are dropped at the MAC layer during reception.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_macRxDropTrace;
 
     /**
      * TracedCallback signature for MPDU drop events.
      *
-     * \param reason the reason why the MPDU was dropped (\see WifiMacDropReason)
-     * \param mpdu the dropped MPDU
+     * @param reason the reason why the MPDU was dropped (\see WifiMacDropReason)
+     * @param mpdu the dropped MPDU
      */
     typedef void (*DroppedMpduCallback)(WifiMacDropReason reason, Ptr<const WifiMpdu> mpdu);
 
@@ -1274,9 +1318,9 @@
     /**
      * TracedCallback signature for MPDU response timeout events.
      *
-     * \param reason the reason why the timer was started
-     * \param mpdu the MPDU whose response was not received before the timeout
-     * \param txVector the TXVECTOR used to transmit the MPDU
+     * @param reason the reason why the timer was started
+     * @param mpdu the MPDU whose response was not received before the timeout
+     * @param txVector the TXVECTOR used to transmit the MPDU
      */
     typedef void (*MpduResponseTimeoutCallback)(uint8_t reason,
                                                 Ptr<const WifiMpdu> mpdu,
@@ -1295,9 +1339,9 @@
     /**
      * TracedCallback signature for PSDU response timeout events.
      *
-     * \param reason the reason why the timer was started
-     * \param psdu the PSDU whose response was not received before the timeout
-     * \param txVector the TXVECTOR used to transmit the PSDU
+     * @param reason the reason why the timer was started
+     * @param psdu the PSDU whose response was not received before the timeout
+     * @param txVector the TXVECTOR used to transmit the PSDU
      */
     typedef void (*PsduResponseTimeoutCallback)(uint8_t reason,
                                                 Ptr<const WifiPsdu> psdu,
@@ -1316,10 +1360,10 @@
     /**
      * TracedCallback signature for PSDU map response timeout events.
      *
-     * \param reason the reason why the timer was started
-     * \param psduMap the PSDU map for which not all responses were received before the timeout
-     * \param missingStations the MAC addresses of the stations that did not respond
-     * \param nTotalStations the total number of stations that had to respond
+     * @param reason the reason why the timer was started
+     * @param psduMap the PSDU map for which not all responses were received before the timeout
+     * @param missingStations the MAC addresses of the stations that did not respond
+     * @param nTotalStations the total number of stations that had to respond
      */
     typedef void (*PsduMapResponseTimeoutCallback)(uint8_t reason,
                                                    WifiPsduMap* psduMap,
@@ -1339,8 +1383,8 @@
     /**
      * TracedCallback signature for ICF drop events.
      *
-     * \param reason the reason why the ICF was dropped by the EMLSR client
-     * \param linkId the ID of the link on which the ICF was dropped
+     * @param reason the reason why the ICF was dropped by the EMLSR client
+     * @param linkId the ID of the link on which the ICF was dropped
      */
     typedef void (*IcfDropCallback)(WifiIcfDrop reason, uint8_t linkId);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-mac-header.cc ns-3.44/src/wifi/model/wifi-mac-header.cc
--- ns-3.43/src/wifi/model/wifi-mac-header.cc	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/wifi-mac-header.cc	2025-03-09 16:55:49.799372700 -0700
@@ -832,29 +832,25 @@
 bool
 WifiMacHeader::IsQosBlockAck() const
 {
-    NS_ASSERT(IsQosData());
-    return (m_qosAckPolicy == 3);
+    return (IsQosData() && m_qosAckPolicy == 3);
 }
 
 bool
 WifiMacHeader::IsQosNoAck() const
 {
-    NS_ASSERT(IsQosData());
-    return (m_qosAckPolicy == 1);
+    return (IsQosData() && m_qosAckPolicy == 1);
 }
 
 bool
 WifiMacHeader::IsQosAck() const
 {
-    NS_ASSERT(IsQosData());
-    return (m_qosAckPolicy == 0);
+    return (IsQosData() && m_qosAckPolicy == 0);
 }
 
 bool
 WifiMacHeader::IsQosEosp() const
 {
-    NS_ASSERT(IsQosData());
-    return (m_qosEosp == 1);
+    return (IsQosData() && m_qosEosp == 1);
 }
 
 WifiMacHeader::QosAckPolicy
@@ -886,8 +882,7 @@
 bool
 WifiMacHeader::IsQosAmsdu() const
 {
-    NS_ASSERT(IsQosData());
-    return (m_amsduPresent == 1);
+    return (IsQosData() && m_amsduPresent == 1);
 }
 
 uint8_t
@@ -1140,6 +1135,7 @@
            << ", SeqNumber=" << m_seqSeq;
         break;
     case WIFI_MAC_DATA:
+    case WIFI_MAC_QOSDATA:
         PrintFrameControl(os);
         os << " Duration/ID=" << m_duration << "us";
         if (!m_ctrlToDs && !m_ctrlFromDs)
@@ -1198,7 +1194,6 @@
     case WIFI_MAC_DATA_NULL_CFACK:
     case WIFI_MAC_DATA_NULL_CFPOLL:
     case WIFI_MAC_DATA_NULL_CFACK_CFPOLL:
-    case WIFI_MAC_QOSDATA:
     case WIFI_MAC_QOSDATA_CFACK:
     case WIFI_MAC_QOSDATA_CFPOLL:
     case WIFI_MAC_QOSDATA_CFACK_CFPOLL:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-mac-header.h ns-3.44/src/wifi/model/wifi-mac-header.h
--- ns-3.43/src/wifi/model/wifi-mac-header.h	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/wifi-mac-header.h	2025-03-09 16:55:49.799372700 -0700
@@ -79,7 +79,7 @@
 };
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * Implements the IEEE 802.11 MAC header
  */
@@ -112,13 +112,13 @@
     /**
      * Construct a MAC header of the given type
      *
-     * \param type the MAC header type
+     * @param type the MAC header type
      */
     WifiMacHeader(WifiMacType type);
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -147,65 +147,65 @@
     /**
      * Fill the Address 1 field with the given address.
      *
-     * \param address the address to be used in the Address 1 field
+     * @param address the address to be used in the Address 1 field
      */
     void SetAddr1(Mac48Address address);
     /**
      * Fill the Address 2 field with the given address.
      *
-     * \param address the address to be used in the Address 2 field
+     * @param address the address to be used in the Address 2 field
      */
     void SetAddr2(Mac48Address address);
     /**
      * Fill the Address 3 field with the given address.
      *
-     * \param address the address to be used in the Address 3 field
+     * @param address the address to be used in the Address 3 field
      */
     void SetAddr3(Mac48Address address);
     /**
      * Fill the Address 4 field with the given address.
      *
-     * \param address the address to be used in the Address 4 field
+     * @param address the address to be used in the Address 4 field
      */
     void SetAddr4(Mac48Address address);
     /**
      * Set Type/Subtype values with the correct values depending
      * on the given type.
      *
-     * \param type the WifiMacType for the header
-     * \param resetToDsFromDs whether the ToDs and FromDs flags
+     * @param type the WifiMacType for the header
+     * @param resetToDsFromDs whether the ToDs and FromDs flags
      *        should be reset.
      */
     virtual void SetType(WifiMacType type, bool resetToDsFromDs = true);
     /**
      * Set the Duration/ID field with the given raw uint16_t value.
      *
-     * \param duration the raw duration in uint16_t
+     * @param duration the raw duration in uint16_t
      */
     void SetRawDuration(uint16_t duration);
     /**
      * Set the Duration/ID field with the given duration (Time object).
      * The method converts the given time to microseconds.
      *
-     * \param duration the duration (Time object)
+     * @param duration the duration (Time object)
      */
     void SetDuration(Time duration);
     /**
      * Set the Duration/ID field with the given ID.
      *
-     * \param id the ID
+     * @param id the ID
      */
     void SetId(uint16_t id);
     /**
      * Set the sequence number of the header.
      *
-     * \param seq the given sequence number
+     * @param seq the given sequence number
      */
     void SetSequenceNumber(uint16_t seq);
     /**
      * Set the fragment number of the header.
      *
-     * \param frag the given fragment number
+     * @param frag the given fragment number
      */
     void SetFragmentNumber(uint8_t frag);
     /**
@@ -235,7 +235,7 @@
     /**
      * Set the TID for the QoS header.
      *
-     * \param tid the TID for the QoS header
+     * @param tid the TID for the QoS header
      */
     void SetQosTid(uint8_t tid);
     /**
@@ -249,7 +249,7 @@
     /**
      * Set the QoS Ack policy in the QoS control field.
      *
-     * \param policy the Qos Ack policy
+     * @param policy the Qos Ack policy
      */
     void SetQosAckPolicy(QosAckPolicy policy);
     /**
@@ -263,13 +263,13 @@
     /**
      * Set TXOP limit in the QoS control field.
      *
-     * \param txop the TXOP limit
+     * @param txop the TXOP limit
      */
     void SetQosTxopLimit(uint8_t txop);
     /**
      * Set the Queue Size subfield in the QoS control field.
      *
-     * \param size the value for the Queue Size subfield
+     * @param size the value for the Queue Size subfield
      */
     void SetQosQueueSize(uint8_t size);
     /**
@@ -292,39 +292,39 @@
     /**
      * Return the address in the Address 1 field.
      *
-     * \return the address in the Address 1 field
+     * @return the address in the Address 1 field
      */
     Mac48Address GetAddr1() const;
     /**
      * Return the address in the Address 2 field.
      *
-     * \return the address in the Address 2 field
+     * @return the address in the Address 2 field
      */
     Mac48Address GetAddr2() const;
     /**
      * Return the address in the Address 3 field.
      *
-     * \return the address in the Address 3 field
+     * @return the address in the Address 3 field
      */
     Mac48Address GetAddr3() const;
     /**
      * Return the address in the Address 4 field.
      *
-     * \return the address in the Address 4 field
+     * @return the address in the Address 4 field
      */
     Mac48Address GetAddr4() const;
     /**
      * Return the type (WifiMacType)
      *
-     * \return the type (WifiMacType)
+     * @return the type (WifiMacType)
      */
     virtual WifiMacType GetType() const;
     /**
-     * \return true if From DS bit is set, false otherwise
+     * @return true if From DS bit is set, false otherwise
      */
     bool IsFromDs() const;
     /**
-     * \return true if To DS bit is set, false otherwise
+     * @return true if To DS bit is set, false otherwise
      */
     bool IsToDs() const;
     /**
@@ -332,295 +332,295 @@
      * not check the Subtype field. (e.g. the header may be
      * Data with QoS)
      *
-     * \return true if Type is DATA, false otherwise
+     * @return true if Type is DATA, false otherwise
      */
     bool IsData() const;
     /**
      * Return true if the Type is DATA and Subtype is one of the
      * possible values for QoS Data.
      *
-     * \return true if Type is QoS DATA, false otherwise
+     * @return true if Type is QoS DATA, false otherwise
      */
     bool IsQosData() const;
     /**
      * Return true if the header type is DATA and is not DATA_NULL.
      *
-     * \return true if the header type is DATA and is not DATA_NULL,
+     * @return true if the header type is DATA and is not DATA_NULL,
      *         false otherwise
      */
     bool HasData() const;
     /**
      * Return true if the Type is Control.
      *
-     * \return true if Type is Control, false otherwise
+     * @return true if Type is Control, false otherwise
      */
     bool IsCtl() const;
     /**
      * Return true if the Type is Management.
      *
-     * \return true if Type is Management, false otherwise
+     * @return true if Type is Management, false otherwise
      */
     bool IsMgt() const;
     /**
      * Return true if the Type/Subtype is one of the possible CF-Poll headers.
      *
-     * \return true if the Type/Subtype is one of the possible CF-Poll headers, false otherwise
+     * @return true if the Type/Subtype is one of the possible CF-Poll headers, false otherwise
      */
     bool IsCfPoll() const;
     /**
      * Return true if the header is a CF-Ack header.
      *
-     * \return true if the header is a CF-Ack header, false otherwise
+     * @return true if the header is a CF-Ack header, false otherwise
      */
     bool IsCfAck() const;
     /**
      * Return true if the header is a CF-End header.
      *
-     * \return true if the header is a CF-End header, false otherwise
+     * @return true if the header is a CF-End header, false otherwise
      */
     bool IsCfEnd() const;
     /**
      * Return true if the header is a PS-POLL header.
      *
-     * \return true if the header is a PS-POLL header, false otherwise
+     * @return true if the header is a PS-POLL header, false otherwise
      */
     bool IsPsPoll() const;
     /**
      * Return true if the header is a RTS header.
      *
-     * \return true if the header is a RTS header, false otherwise
+     * @return true if the header is a RTS header, false otherwise
      */
     bool IsRts() const;
     /**
      * Return true if the header is a CTS header.
      *
-     * \return true if the header is a CTS header, false otherwise
+     * @return true if the header is a CTS header, false otherwise
      */
     bool IsCts() const;
     /**
      * Return true if the header is an Ack header.
      *
-     * \return true if the header is an Ack header, false otherwise
+     * @return true if the header is an Ack header, false otherwise
      */
     bool IsAck() const;
     /**
      * Return true if the header is a BlockAckRequest header.
      *
-     * \return true if the header is a BlockAckRequest header, false otherwise
+     * @return true if the header is a BlockAckRequest header, false otherwise
      */
     bool IsBlockAckReq() const;
     /**
      * Return true if the header is a BlockAck header.
      *
-     * \return true if the header is a BlockAck header, false otherwise
+     * @return true if the header is a BlockAck header, false otherwise
      */
     bool IsBlockAck() const;
     /**
      * Return true if the header is a Trigger header.
      *
-     * \return true if the header is a Trigger header, false otherwise
+     * @return true if the header is a Trigger header, false otherwise
      */
     bool IsTrigger() const;
     /**
      * Return true if the header is an Association Request header.
      *
-     * \return true if the header is an Association Request header, false otherwise
+     * @return true if the header is an Association Request header, false otherwise
      */
     bool IsAssocReq() const;
     /**
      * Return true if the header is an Association Response header.
      *
-     * \return true if the header is an Association Response header, false otherwise
+     * @return true if the header is an Association Response header, false otherwise
      */
     bool IsAssocResp() const;
     /**
      * Return true if the header is a Reassociation Request header.
      *
-     * \return true if the header is a Reassociation Request header, false otherwise
+     * @return true if the header is a Reassociation Request header, false otherwise
      */
     bool IsReassocReq() const;
     /**
      * Return true if the header is a Reassociation Response header.
      *
-     * \return true if the header is a Reassociation Response header, false otherwise
+     * @return true if the header is a Reassociation Response header, false otherwise
      */
     bool IsReassocResp() const;
     /**
      * Return true if the header is a Probe Request header.
      *
-     * \return true if the header is a Probe Request header, false otherwise
+     * @return true if the header is a Probe Request header, false otherwise
      */
     bool IsProbeReq() const;
     /**
      * Return true if the header is a Probe Response header.
      *
-     * \return true if the header is a Probe Response header, false otherwise
+     * @return true if the header is a Probe Response header, false otherwise
      */
     bool IsProbeResp() const;
     /**
      * Return true if the header is a Beacon header.
      *
-     * \return true if the header is a Beacon header, false otherwise
+     * @return true if the header is a Beacon header, false otherwise
      */
     bool IsBeacon() const;
     /**
      * Return true if the header is a Disassociation header.
      *
-     * \return true if the header is a Disassociation header, false otherwise
+     * @return true if the header is a Disassociation header, false otherwise
      */
     bool IsDisassociation() const;
     /**
      * Return true if the header is an Authentication header.
      *
-     * \return true if the header is an Authentication header, false otherwise
+     * @return true if the header is an Authentication header, false otherwise
      */
     bool IsAuthentication() const;
     /**
      * Return true if the header is a Deauthentication header.
      *
-     * \return true if the header is a Deauthentication header, false otherwise
+     * @return true if the header is a Deauthentication header, false otherwise
      */
     bool IsDeauthentication() const;
     /**
      * Return true if the header is an Action header.
      *
-     * \return true if the header is an Action header, false otherwise
+     * @return true if the header is an Action header, false otherwise
      */
     bool IsAction() const;
     /**
      * Return true if the header is an Action No Ack header.
      *
-     * \return true if the header is an Action No Ack header, false otherwise
+     * @return true if the header is an Action No Ack header, false otherwise
      */
     bool IsActionNoAck() const;
     /**
      * Check if the header is a Multihop action header.
      *
-     * \return true if the header is a Multihop action header,
+     * @return true if the header is a Multihop action header,
      *         false otherwise
      */
     bool IsMultihopAction() const;
     /**
      * Return the raw duration from the Duration/ID field.
      *
-     * \return the raw duration from the Duration/ID field
+     * @return the raw duration from the Duration/ID field
      */
     uint16_t GetRawDuration() const;
     /**
      * Return the duration from the Duration/ID field (Time object).
      *
-     * \return the duration from the Duration/ID field (Time object)
+     * @return the duration from the Duration/ID field (Time object)
      */
     Time GetDuration() const;
     /**
      * Return the raw Sequence Control field.
      *
-     * \return the raw Sequence Control field
+     * @return the raw Sequence Control field
      */
     uint16_t GetSequenceControl() const;
     /**
      * Return the sequence number of the header.
      *
-     * \return the sequence number of the header
+     * @return the sequence number of the header
      */
     uint16_t GetSequenceNumber() const;
     /**
      * Return the fragment number of the header.
      *
-     * \return the fragment number of the header
+     * @return the fragment number of the header
      */
     uint8_t GetFragmentNumber() const;
     /**
      * Return if the Retry bit is set.
      *
-     * \return true if the Retry bit is set, false otherwise
+     * @return true if the Retry bit is set, false otherwise
      */
     bool IsRetry() const;
     /**
      * Return if the Power Management bit is set.
      *
-     * \return true if the Power Management bit is set, false otherwise
+     * @return true if the Power Management bit is set, false otherwise
      */
     bool IsPowerManagement() const;
     /**
      * Return if the More Data bit is set.
      *
-     * \return true if the More Data bit is set, false otherwise
+     * @return true if the More Data bit is set, false otherwise
      */
     bool IsMoreData() const;
     /**
      * Return if the More Fragment bit is set.
      *
-     * \return true if the More Fragment bit is set, false otherwise
+     * @return true if the More Fragment bit is set, false otherwise
      */
     bool IsMoreFragments() const;
     /**
-     * Return if the QoS Ack policy is Block Ack.
+     * Return if IsQosData() is true and the QoS Ack policy is Block Ack.
      *
-     * \return true if the QoS Ack policy is Block Ack, false otherwise
+     * @return true if IsQosData() and the QoS Ack policy is Block Ack, false otherwise
      */
     bool IsQosBlockAck() const;
     /**
-     * Return if the QoS Ack policy is No Ack.
+     * Return if IsQosData() is true and the QoS Ack policy is No Ack.
      *
-     * \return true if the QoS Ack policy is No Ack, false otherwise
+     * @return true if IsQosData() and the QoS Ack policy is No Ack, false otherwise
      */
     bool IsQosNoAck() const;
     /**
-     * Return if the QoS Ack policy is Normal Ack.
+     * Return if IsQosData() is true and the QoS Ack policy is Normal Ack.
      *
-     * \return true if the QoS Ack policy is No Ack, false otherwise
+     * @return true if IsQosData() and the QoS Ack policy is No Ack, false otherwise
      */
     bool IsQosAck() const;
     /**
-     * Return if the end of service period (EOSP) is set.
+     * Return if IsQosData() is true and the end of service period (EOSP) is set.
      *
-     * \return true if the end of service period (EOSP) is set, false otherwise
+     * @return true if IsQosData() and the end of service period (EOSP) is set, false otherwise
      */
     bool IsQosEosp() const;
     /**
-     * Check if the A-MSDU present bit is set in the QoS control field.
+     * Check if IsQosData() is true and the A-MSDU present bit is set in the QoS control field.
      *
-     * \return true if the A-MSDU present bit is set,
+     * @return true if IsQosData() and the A-MSDU present bit is set,
      *         false otherwise
      */
     bool IsQosAmsdu() const;
     /**
      * Return the Traffic ID of a QoS header.
      *
-     * \return the Traffic ID of a QoS header
+     * @return the Traffic ID of a QoS header
      */
     uint8_t GetQosTid() const;
     /**
      * Return the QoS Ack policy in the QoS control field.
      *
-     * \return the QoS Ack policy in the QoS control field
+     * @return the QoS Ack policy in the QoS control field
      */
     QosAckPolicy GetQosAckPolicy() const;
     /**
      * Get the Queue Size subfield in the QoS control field.
      *
-     * \return the value of the Queue Size subfield
+     * @return the value of the Queue Size subfield
      */
     uint8_t GetQosQueueSize() const;
     /**
      * Return the size of the WifiMacHeader in octets.
      * GetSerializedSize calls this function.
      *
-     * \return the size of the WifiMacHeader in octets
+     * @return the size of the WifiMacHeader in octets
      */
     virtual uint32_t GetSize() const;
     /**
      * Return a string corresponds to the header type.
      *
-     * \returns a string corresponds to the header type.
+     * @returns a string corresponds to the header type.
      */
     virtual const char* GetTypeString() const;
 
     /**
      * TracedCallback signature for WifiMacHeader
      *
-     * \param [in] header The header
+     * @param [in] header The header
      */
     typedef void (*TracedCallback)(const WifiMacHeader& header);
 
@@ -628,37 +628,37 @@
     /**
      * Return the raw Frame Control field.
      *
-     * \return the raw Frame Control field
+     * @return the raw Frame Control field
      */
     virtual uint16_t GetFrameControl() const;
     /**
      * Return the raw QoS Control field.
      *
-     * \return the raw QoS Control field
+     * @return the raw QoS Control field
      */
     virtual uint16_t GetQosControl() const;
     /**
      * Set the Frame Control field with the given raw value.
      *
-     * \param control the raw Frame Control field value
+     * @param control the raw Frame Control field value
      */
     virtual void SetFrameControl(uint16_t control);
     /**
      * Set the Sequence Control field with the given raw value.
      *
-     * \param seq the raw Sequence Control field value
+     * @param seq the raw Sequence Control field value
      */
     void SetSequenceControl(uint16_t seq);
     /**
      * Set the QoS Control field with the given raw value.
      *
-     * \param qos the raw QoS Control field value
+     * @param qos the raw QoS Control field value
      */
     virtual void SetQosControl(uint16_t qos);
     /**
      * Print the Frame Control field to the output stream.
      *
-     * \param os the output stream to print to
+     * @param os the output stream to print to
      */
     void PrintFrameControl(std::ostream& os) const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-mac-queue.cc ns-3.44/src/wifi/model/wifi-mac-queue.cc
--- ns-3.43/src/wifi/model/wifi-mac-queue.cc	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/wifi-mac-queue.cc	2025-03-09 16:55:49.799372700 -0700
@@ -316,8 +316,11 @@
 WifiMacQueue::PeekByTidAndAddress(uint8_t tid, Mac48Address dest, Ptr<const WifiMpdu> item) const
 {
     NS_LOG_FUNCTION(this << +tid << dest << item);
-    NS_ABORT_IF(dest.IsGroup());
-    WifiContainerQueueId queueId(WIFI_QOSDATA_QUEUE, WIFI_UNICAST, dest, tid);
+    NS_ABORT_IF(dest.IsBroadcast());
+    WifiContainerQueueId queueId(WIFI_QOSDATA_QUEUE,
+                                 dest.IsGroup() ? WIFI_GROUPCAST : WIFI_UNICAST,
+                                 dest,
+                                 tid);
     return PeekByQueueId(queueId, item);
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-mac-queue-container.cc ns-3.44/src/wifi/model/wifi-mac-queue-container.cc
--- ns-3.43/src/wifi/model/wifi-mac-queue-container.cc	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/wifi-mac-queue-container.cc	2025-03-09 16:55:49.799372700 -0700
@@ -70,8 +70,23 @@
 {
     const WifiMacHeader& hdr = mpdu->GetHeader();
 
-    auto addrType = hdr.GetAddr1().IsGroup() ? WIFI_BROADCAST : WIFI_UNICAST;
-    auto address = hdr.GetAddr1().IsGroup() ? hdr.GetAddr2() : hdr.GetAddr1();
+    WifiReceiverAddressType addrType;
+    Mac48Address address;
+    if (hdr.GetAddr1().IsBroadcast())
+    {
+        addrType = WIFI_BROADCAST;
+        address = hdr.GetAddr2();
+    }
+    else if (hdr.GetAddr1().IsGroup())
+    {
+        addrType = WIFI_GROUPCAST;
+        address = hdr.IsQosAmsdu() ? mpdu->begin()->second.GetDestinationAddr() : hdr.GetAddr1();
+    }
+    else
+    {
+        addrType = WIFI_UNICAST;
+        address = hdr.GetAddr1();
+    }
 
     if (hdr.IsCtl())
     {
@@ -151,14 +166,16 @@
             ++lastExpiredIt;
         }
 
-        if (lastExpiredIt != firstExpiredIt)
+        if (lastExpiredIt == firstExpiredIt)
         {
-            // transfer non-inflight MPDUs with expired lifetime to the tail of m_expiredQueue
-            m_expiredQueue.splice(m_expiredQueue.end(), queue, firstExpiredIt, lastExpiredIt);
-            ret->second = m_expiredQueue.end();
+            break;
         }
 
-    } while (lastExpiredIt != firstExpiredIt);
+        // transfer non-inflight MPDUs with expired lifetime to the tail of m_expiredQueue
+        m_expiredQueue.splice(m_expiredQueue.end(), queue, firstExpiredIt, lastExpiredIt);
+        ret->second = m_expiredQueue.end();
+
+    } while (true);
 
     return *ret;
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-mac-queue-container.h ns-3.44/src/wifi/model/wifi-mac-queue-container.h
--- ns-3.43/src/wifi/model/wifi-mac-queue-container.h	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/wifi-mac-queue-container.h	2025-03-09 16:55:49.799372700 -0700
@@ -34,13 +34,14 @@
 enum WifiReceiverAddressType : uint8_t
 {
     WIFI_UNICAST = 0,
-    WIFI_BROADCAST
+    WIFI_BROADCAST,
+    WIFI_GROUPCAST
 };
 
 /**
  * Tuple (queue type, receiver address type, Address, TID) identifying a container queue.
  *
- * \note that Address has a different meaning depending on container queue type:
+ * @note that Address has a different meaning depending on container queue type:
  *
  * - for container queue types holding unicast frames, Address is the Receiver Address (RA)
  *   of the frames stored in the queue. For 11be MLDs, it is expected that:
@@ -74,7 +75,7 @@
  ***************************************************/
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * Hashing functor taking a QueueId and returning a @c std::size_t.
  * For use with `unordered_map` and `unordered_set`.
  */
@@ -83,8 +84,8 @@
 {
     /**
      * The functor.
-     * \param queueId The QueueId value to hash.
-     * \return the hash
+     * @param queueId The QueueId value to hash.
+     * @return the hash
      */
     std::size_t operator()(ns3::WifiContainerQueueId queueId) const;
 };
@@ -93,7 +94,7 @@
 {
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * Class for the container used by WifiMacQueue
  *
  * This container holds multiple container queues organized in an hash table
@@ -117,25 +118,25 @@
     /**
      * Insert the given item at the specified location in the container.
      *
-     * \param pos iterator before which the item will be inserted
-     * \param item the item to insert in the container
-     * \return iterator pointing to the inserted item
+     * @param pos iterator before which the item will be inserted
+     * @param item the item to insert in the container
+     * @return iterator pointing to the inserted item
      */
     iterator insert(const_iterator pos, Ptr<WifiMpdu> item);
 
     /**
      * Erase the specified elements from the container.
      *
-     * \param pos iterator to the element to remove
-     * \return iterator following the removed element
+     * @param pos iterator to the element to remove
+     * @return iterator following the removed element
      */
     iterator erase(const_iterator pos);
 
     /**
      * Return the WifiMpdu included in the element pointed to by the given iterator.
      *
-     * \param it the given iterator
-     * \return the item included in the element pointed to by the given iterator
+     * @param it the given iterator
+     * @return the item included in the element pointed to by the given iterator
      */
     Ptr<WifiMpdu> GetItem(const const_iterator it) const;
 
@@ -143,8 +144,8 @@
      * Return the QueueId identifying the container queue in which the given MPDU is
      * (or is to be) enqueued. Note that the given MPDU must not contain a control frame.
      *
-     * \param mpdu the given MPDU
-     * \return the QueueId identifying the container queue in which the given MPDU
+     * @param mpdu the given MPDU
+     * @return the QueueId identifying the container queue in which the given MPDU
      *         is (or is to be) enqueued
      */
     static WifiContainerQueueId GetQueueId(Ptr<const WifiMpdu> mpdu);
@@ -153,16 +154,16 @@
      * Get a const reference to the container queue identified by the given QueueId.
      * The container queue is created if it does not exist.
      *
-     * \param queueId the given QueueId
-     * \return a const reference to the container queue identified by the given QueueId
+     * @param queueId the given QueueId
+     * @return a const reference to the container queue identified by the given QueueId
      */
     const ContainerQueue& GetQueue(const WifiContainerQueueId& queueId) const;
 
     /**
      * Get the total size of the MPDUs stored in the queue identified by the given QueueId.
      *
-     * \param queueId the given queue ID
-     * \return true if the given queue does not exist in the container or is empty,
+     * @param queueId the given queue ID
+     * @return true if the given queue does not exist in the container or is empty,
      *         false otherwise
      */
     uint32_t GetNBytes(const WifiContainerQueueId& queueId) const;
@@ -171,8 +172,8 @@
      * Transfer non-inflight MPDUs with expired lifetime in the container queue identified by
      * the given QueueId to the container queue storing MPDUs with expired lifetime.
      *
-     * \param queueId the QueueId identifying the container queue
-     * \return the range [first, last) of iterators pointing to the MPDUs transferred
+     * @param queueId the QueueId identifying the container queue
+     * @return the range [first, last) of iterators pointing to the MPDUs transferred
      *         to the container queue storing MPDUs with expired lifetime
      */
     std::pair<iterator, iterator> ExtractExpiredMpdus(const WifiContainerQueueId& queueId) const;
@@ -180,7 +181,7 @@
      * Transfer non-inflight MPDUs with expired lifetime in all the container queues to the
      * container queue storing MPDUs with expired lifetime.
      *
-     * \return the range [first, last) of iterators pointing to the MPDUs transferred
+     * @return the range [first, last) of iterators pointing to the MPDUs transferred
      *         to the container queue storing MPDUs with expired lifetime
      */
     std::pair<iterator, iterator> ExtractAllExpiredMpdus() const;
@@ -188,7 +189,7 @@
      * Get the range [first, last) of iterators pointing to all the MPDUs queued
      * in the container queue storing MPDUs with expired lifetime.
      *
-     * \return the range [first, last) of iterators pointing to all the MPDUs queued
+     * @return the range [first, last) of iterators pointing to all the MPDUs queued
      *         in the container queue storing MPDUs with expired lifetime
      */
     std::pair<iterator, iterator> GetAllExpiredMpdus() const;
@@ -198,8 +199,8 @@
      * Transfer non-inflight MPDUs with expired lifetime in the given container queue to the
      * container queue storing MPDUs with expired lifetime.
      *
-     * \param queue the given container queue
-     * \return the range [first, last) of iterators pointing to the MPDUs transferred
+     * @param queue the given container queue
+     * @return the range [first, last) of iterators pointing to the MPDUs transferred
      *         to the container queue storing MPDUs with expired lifetime
      */
     std::pair<iterator, iterator> DoExtractExpiredMpdus(ContainerQueue& queue) const;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-mac-queue-elem.h ns-3.44/src/wifi/model/wifi-mac-queue-elem.h
--- ns-3.43/src/wifi/model/wifi-mac-queue-elem.h	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/wifi-mac-queue-elem.h	2025-03-09 16:55:49.799372700 -0700
@@ -22,7 +22,7 @@
 class WifiMpdu;
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * Type of elements stored in a WifiMacQueue container.
  *
  * Such elements can be accessed by the WifiMacQueue (via iterators) and
@@ -48,7 +48,7 @@
 
     /**
      * Constructor.
-     * \param item the MPDU stored by this queue element
+     * @param item the MPDU stored by this queue element
      */
     WifiMacQueueElem(Ptr<WifiMpdu> item);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-mac-queue.h ns-3.44/src/wifi/model/wifi-mac-queue.h
--- ns-3.43/src/wifi/model/wifi-mac-queue.h	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/wifi-mac-queue.h	2025-03-09 16:55:49.803372600 -0700
@@ -35,7 +35,7 @@
 extern template class Queue<WifiMpdu, ns3::WifiMacQueueContainer>;
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * This queue implements the timeout procedure described in
  * (Section 9.19.2.6 "Retransmit procedures" paragraph 6; IEEE 802.11-2012).
@@ -56,15 +56,15 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
      * Constructor
      *
-     * \param ac the Access Category of the packets stored in this queue
+     * @param ac the Access Category of the packets stored in this queue
      */
     WifiMacQueue(AcIndex ac = AC_UNDEF);
 
@@ -80,61 +80,61 @@
     /**
      * Get the Access Category of the packets stored in this queue
      *
-     * \return the Access Category of the packets stored in this queue
+     * @return the Access Category of the packets stored in this queue
      */
     AcIndex GetAc() const;
 
     /**
      * Set the wifi MAC queue scheduler
      *
-     * \param scheduler the wifi MAC queue scheduler
+     * @param scheduler the wifi MAC queue scheduler
      */
     void SetScheduler(Ptr<WifiMacQueueScheduler> scheduler);
 
     /**
      * Set the maximum delay before the packet is discarded.
      *
-     * \param delay the maximum delay
+     * @param delay the maximum delay
      */
     void SetMaxDelay(Time delay);
     /**
      * Return the maximum delay before the packet is discarded.
      *
-     * \return the maximum delay
+     * @return the maximum delay
      */
     Time GetMaxDelay() const;
 
     /**
      * Enqueue the given Wifi MAC queue item at the <i>end</i> of the queue.
      *
-     * \param item the Wifi MAC queue item to be enqueued at the end
-     * \return true if success, false if the packet has been dropped
+     * @param item the Wifi MAC queue item to be enqueued at the end
+     * @return true if success, false if the packet has been dropped
      */
     bool Enqueue(Ptr<WifiMpdu> item) override;
     /**
      * Dequeue the packet in the front of the queue.
      *
-     * \return the packet
+     * @return the packet
      */
     Ptr<WifiMpdu> Dequeue() override;
     /**
      * Dequeue the given MPDUs if they are stored in this queue.
      *
-     * \param mpdus the given MPDUs
+     * @param mpdus the given MPDUs
      */
     void DequeueIfQueued(const std::list<Ptr<const WifiMpdu>>& mpdus);
     /**
      * Peek the packet in the front of the queue. The packet is not removed.
      *
-     * \return the packet
+     * @return the packet
      */
     Ptr<const WifiMpdu> Peek() const override;
     /**
      * Peek the packet in the front of the queue for transmission on the given
      * link (if any). The packet is not removed.
      *
-     * \param linkId the ID of the link onto which we can transmit a packet
-     * \return the packet
+     * @param linkId the ID of the link onto which we can transmit a packet
+     * @return the packet
      */
     Ptr<WifiMpdu> Peek(std::optional<uint8_t> linkId) const;
     /**
@@ -146,11 +146,11 @@
      * 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
-     * \param item the item after which the search starts from
+     * @param tid the given TID
+     * @param dest the given destination
+     * @param item the item after which the search starts from
      *
-     * \return the peeked packet or nullptr if no packet was found
+     * @return the peeked packet or nullptr if no packet was found
      */
     Ptr<WifiMpdu> PeekByTidAndAddress(uint8_t tid,
                                       Mac48Address dest,
@@ -165,9 +165,9 @@
      * expired lifetime because we assume that a previous call was made with a null
      * pointer as argument, which removed the MPDUs with expired lifetime).
      *
-     * \param queueId the given queue ID
-     * \param item the item after which the search starts from
-     * \return the peeked packet or nullptr if no packet was found
+     * @param queueId the given queue ID
+     * @param item the item after which the search starts from
+     * @return the peeked packet or nullptr if no packet was found
      */
     Ptr<WifiMpdu> PeekByQueueId(const WifiContainerQueueId& queueId,
                                 Ptr<const WifiMpdu> item = nullptr) const;
@@ -178,16 +178,16 @@
      * in the queue; otherwise, the search starts from the head of the queue.
      * The packet is not removed from queue.
      *
-     * \param linkId the ID of the given link
-     * \param item the item after which the search starts from
+     * @param linkId the ID of the given link
+     * @param item the item after which the search starts from
      *
-     * \return the peeked packet or nullptr if no packet was found
+     * @return the peeked packet or nullptr if no packet was found
      */
     Ptr<WifiMpdu> PeekFirstAvailable(uint8_t linkId, Ptr<const WifiMpdu> item = nullptr) const;
     /**
      * Remove the packet in the front of the queue.
      *
-     * \return the packet
+     * @return the packet
      */
     Ptr<WifiMpdu> Remove() override;
     /**
@@ -196,8 +196,8 @@
      * true, all the items in the queue from the head to the given position are
      * removed if their lifetime expired.
      *
-     * \param item the item to be removed
-     * \return the removed item
+     * @param item the item to be removed
+     * @return the removed item
      */
     Ptr<WifiMpdu> Remove(Ptr<const WifiMpdu> item);
 
@@ -211,8 +211,8 @@
      * item is dequeued and the new item is enqueued in its place. In this way,
      * statistics about queue size (in terms of bytes) are correctly updated.
      *
-     * \param currentItem the given current item
-     * \param newItem the given new item
+     * @param currentItem the given current item
+     * @param newItem the given new item
      */
     void Replace(Ptr<const WifiMpdu> currentItem, Ptr<WifiMpdu> newItem);
 
@@ -220,8 +220,8 @@
      * Get the number of MPDUs currently stored in the container queue identified
      * by the given queue ID.
      *
-     * \param queueId the given queue ID
-     * \return the number of MPDUs currently stored in the container queue
+     * @param queueId the given queue ID
+     * @return the number of MPDUs currently stored in the container queue
      */
     uint32_t GetNPackets(const WifiContainerQueueId& queueId) const;
 
@@ -229,8 +229,8 @@
      * Get the amount of bytes currently stored in the container queue identified
      * by the given queue ID.
      *
-     * \param queueId the given queue ID
-     * \return the amount of bytes currently stored in the container queue
+     * @param queueId the given queue ID
+     * @return the amount of bytes currently stored in the container queue
      */
     uint32_t GetNBytes(const WifiContainerQueueId& queueId) const;
 
@@ -238,9 +238,9 @@
      * Remove the given item if it has been in the queue for too long. Return true
      * if the item is removed, false otherwise.
      *
-     * \param item the item whose lifetime is checked
-     * \param now a copy of Simulator::Now()
-     * \return true if the item is removed, false otherwise
+     * @param item the item whose lifetime is checked
+     * @param now a copy of Simulator::Now()
+     * @return true if the item is removed, false otherwise
      */
     bool TtlExceeded(Ptr<const WifiMpdu> item, const Time& now);
 
@@ -249,11 +249,11 @@
      * given queue ID to the container queue storing MPDUs with expired lifetime.
      * Each MPDU that is found to have an expired lifetime feeds the "Expired"
      * trace source and is notified to the scheduler.
-     * \note that such MPDUs are not removed from the WifiMacQueue (and hence are
+     * @note that such MPDUs are not removed from the WifiMacQueue (and hence are
      * still accounted for in the overall statistics kept by the Queue base class)
      * in order to make this method const.
      *
-     * \param queueId the given queue ID
+     * @param queueId the given queue ID
      */
     void ExtractExpiredMpdus(const WifiContainerQueueId& queueId) const;
     /**
@@ -261,7 +261,7 @@
      * container queue storing MPDUs with expired lifetime. Each MPDU that is found
      * to have an expired lifetime feeds the "Expired" trace source and is notified
      * to the scheduler.
-     * \note that such MPDUs are not removed from the WifiMacQueue (and hence are
+     * @note that such MPDUs are not removed from the WifiMacQueue (and hence are
      * still accounted for in the overall statistics kept by the Queue base class)
      * in order to make this method const.
      */
@@ -275,15 +275,15 @@
      * Unlike the GetOriginal() method of WifiMpdu, this method returns a non-const
      * pointer to the original copy of the given MPDU.
      *
-     * \param mpdu the given MPDU
-     * \return the original copy of the given MPDU
+     * @param mpdu the given MPDU
+     * @return the original copy of the given MPDU
      */
     Ptr<WifiMpdu> GetOriginal(Ptr<WifiMpdu> mpdu);
 
     /**
-     * \param mpdu the given MPDU
-     * \param linkId the ID of the given link
-     * \return the alias of the given MPDU that is inflight on the given link, if any, or
+     * @param mpdu the given MPDU
+     * @param linkId the ID of the given link
+     * @return the alias of the given MPDU that is inflight on the given link, if any, or
      *         a null pointer, otherwise
      */
     Ptr<WifiMpdu> GetAlias(Ptr<const WifiMpdu> mpdu, uint8_t linkId);
@@ -295,17 +295,17 @@
 
   private:
     /**
-     * \param mpdu the given MPDU
-     * \return the queue iterator stored by the given MPDU
+     * @param mpdu the given MPDU
+     * @return the queue iterator stored by the given MPDU
      */
     Iterator GetIt(Ptr<const WifiMpdu> mpdu) const;
 
     /**
      * Enqueue the given Wifi MAC queue item before the given position.
      *
-     * \param pos the position before which the item is to be inserted
-     * \param item the Wifi MAC queue item to be enqueued
-     * \return true if success, false if the packet has been dropped
+     * @param pos the position before which the item is to be inserted
+     * @param item the Wifi MAC queue item to be enqueued
+     * @return true if success, false if the packet has been dropped
      */
     bool Insert(ConstIterator pos, Ptr<WifiMpdu> item);
     /**
@@ -313,9 +313,9 @@
      * sets the iterator field of the item and updates internal statistics, if
      * insertion succeeded.
      *
-     * \param pos the position before where the item will be inserted
-     * \param item the item to enqueue
-     * \return true if success, false if the packet has been dropped.
+     * @param pos the position before where the item will be inserted
+     * @param item the item to enqueue
+     * @return true if success, false if the packet has been dropped.
      */
     bool DoEnqueue(ConstIterator pos, Ptr<WifiMpdu> item);
     /**
@@ -323,7 +323,7 @@
      * resets the iterator field of the dequeued items and notifies the scheduler, if
      * any item was dequeued.
      *
-     * \param iterators the list of iterators pointing to the items to dequeue
+     * @param iterators the list of iterators pointing to the items to dequeue
      */
     void DoDequeue(const std::list<ConstIterator>& iterators);
     /**
@@ -331,8 +331,8 @@
      * resets the iterator field of the item and notifies the scheduleer, if an
      * item was dropped.
      *
-     * \param pos the position of the item to drop
-     * \return the dropped item.
+     * @param pos the position of the item to drop
+     * @return the dropped item.
      */
     Ptr<WifiMpdu> DoRemove(ConstIterator pos);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-mac-queue-scheduler.h ns-3.44/src/wifi/model/wifi-mac-queue-scheduler.h
--- ns-3.43/src/wifi/model/wifi-mac-queue-scheduler.h	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/wifi-mac-queue-scheduler.h	2025-03-09 16:55:49.799372700 -0700
@@ -24,7 +24,7 @@
 class WifiMac;
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * Enumeration of the reasons to block container queues.
  */
@@ -39,11 +39,11 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the stream
- * \param reason the reason to block container queues
- * \returns a reference to the stream
+ * @param os the stream
+ * @param reason the reason to block container queues
+ * @returns a reference to the stream
  */
 inline std::ostream&
 operator<<(std::ostream& os, WifiQueueBlockedReason reason)
@@ -69,7 +69,7 @@
 }
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * WifiMacQueueScheduler is an abstract base class defining the public interface
  * for a wifi MAC queue scheduler.
@@ -78,15 +78,15 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
      * Set the wifi MAC.
      *
-     * \param mac the wifi MAC
+     * @param mac the wifi MAC
      */
     virtual void SetWifiMac(Ptr<WifiMac> mac);
 
@@ -95,10 +95,10 @@
      * whose lifetime has not expired. Queues containing MPDUs that cannot be sent
      * over the given link (if any) are ignored.
      *
-     * \param ac the Access Category that we want to serve
-     * \param linkId the ID of the link on which MPDUs contained in the returned queue must be
+     * @param ac the Access Category that we want to serve
+     * @param linkId the ID of the link on which MPDUs contained in the returned queue must be
      *               allowed to be sent
-     * \return the ID of the selected container queue (if any)
+     * @return the ID of the selected container queue (if any)
      */
     virtual std::optional<WifiContainerQueueId> GetNext(AcIndex ac,
                                                         std::optional<uint8_t> linkId) = 0;
@@ -107,11 +107,11 @@
      * guaranteed to contain at least an MPDU whose lifetime has not expired.
      * Queues containing MPDUs that cannot be sent over the given link (if any) are ignored.
      *
-     * \param ac the Access Category that we want to serve
-     * \param linkId the ID of the link on which MPDUs contained in the returned queue must be
+     * @param ac the Access Category that we want to serve
+     * @param linkId the ID of the link on which MPDUs contained in the returned queue must be
      *               allowed to be sent
-     * \param prevQueueId the ID of the container queue served previously
-     * \return the ID of the selected container queue (if any)
+     * @param prevQueueId the ID of the container queue served previously
+     * @return the ID of the selected container queue (if any)
      */
     virtual std::optional<WifiContainerQueueId> GetNext(
         AcIndex ac,
@@ -122,10 +122,10 @@
      * Get the list of the IDs of the links the given MPDU (belonging to the given
      * Access Category) can be sent over.
      *
-     * \param ac the given Access Category
-     * \param mpdu the given MPDU
-     * \param ignoredReasons list of reasons for blocking a link that are ignored
-     * \return the list of the IDs of the links the given MPDU can be sent over
+     * @param ac the given Access Category
+     * @param mpdu the given MPDU
+     * @param ignoredReasons list of reasons for blocking a link that are ignored
+     * @return the list of the IDs of the links the given MPDU can be sent over
      */
     virtual std::list<uint8_t> GetLinkIds(
         AcIndex ac,
@@ -138,13 +138,13 @@
      * Transmitter Address (TA) and TID (if needed) for the given reason, such that
      * frames in these queues are not transmitted on the given set of links.
      *
-     * \param reason the reason for blocking the queues
-     * \param ac the given Access Category
-     * \param types the types of the queues to block
-     * \param rxAddress the Receiver Address (RA) of the frames
-     * \param txAddress the Transmitter Address (TA) of the frames
-     * \param tids the TIDs optionally identifying the queues to block
-     * \param linkIds set of links to block (empty to block all setup links)
+     * @param reason the reason for blocking the queues
+     * @param ac the given Access Category
+     * @param types the types of the queues to block
+     * @param rxAddress the Receiver Address (RA) of the frames
+     * @param txAddress the Transmitter Address (TA) of the frames
+     * @param tids the TIDs optionally identifying the queues to block
+     * @param linkIds set of links to block (empty to block all setup links)
      */
     virtual void BlockQueues(WifiQueueBlockedReason reason,
                              AcIndex ac,
@@ -159,13 +159,13 @@
      * Transmitter Address (TA) and TID (if needed) for the given reason, such that
      * frames in these queues can be transmitted on the given set of links.
      *
-     * \param reason the reason for unblocking the queues
-     * \param ac the given Access Category
-     * \param types the types of the queues to unblock
-     * \param rxAddress the Receiver Address (RA) of the frames
-     * \param txAddress the Transmitter Address (TA) of the frames
-     * \param tids the TIDs optionally identifying the queues to unblock
-     * \param linkIds set of links to unblock (empty to unblock all setup links)
+     * @param reason the reason for unblocking the queues
+     * @param ac the given Access Category
+     * @param types the types of the queues to unblock
+     * @param rxAddress the Receiver Address (RA) of the frames
+     * @param txAddress the Transmitter Address (TA) of the frames
+     * @param tids the TIDs optionally identifying the queues to unblock
+     * @param linkIds set of links to unblock (empty to unblock all setup links)
      */
     virtual void UnblockQueues(WifiQueueBlockedReason reason,
                                AcIndex ac,
@@ -183,10 +183,10 @@
      * is blocked and for which reason, provided that the given container queue exists and has
      * a mask for the given link.
      *
-     * \param ac the given Access Category
-     * \param queueId the ID of the given container queue
-     * \param linkId the ID of the given link
-     * \return the mask associated with the given container queue for the given link
+     * @param ac the given Access Category
+     * @param queueId the ID of the given container queue
+     * @param linkId the ID of the given link
+     * @return the mask associated with the given container queue for the given link
      */
     virtual std::optional<Mask> GetQueueLinkMask(AcIndex ac,
                                                  const WifiContainerQueueId& queueId,
@@ -195,9 +195,9 @@
     /**
      * Check whether an MPDU has to be dropped before enqueuing the given MPDU.
      *
-     * \param ac the Access Category of the MPDU being enqueued
-     * \param mpdu the MPDU to enqueue
-     * \return a pointer to the MPDU to drop, if any, or a null pointer, otherwise
+     * @param ac the Access Category of the MPDU being enqueued
+     * @param mpdu the MPDU to enqueue
+     * @return a pointer to the MPDU to drop, if any, or a null pointer, otherwise
      */
     virtual Ptr<WifiMpdu> HasToDropBeforeEnqueue(AcIndex ac, Ptr<WifiMpdu> mpdu) = 0;
     /**
@@ -205,8 +205,8 @@
      * Category. The container queue in which the MPDU has been enqueued must be
      * assigned a priority value.
      *
-     * \param ac the Access Category of the enqueued MPDU
-     * \param mpdu the enqueued MPDU
+     * @param ac the Access Category of the enqueued MPDU
+     * @param mpdu the enqueued MPDU
      */
     virtual void NotifyEnqueue(AcIndex ac, Ptr<WifiMpdu> mpdu) = 0;
     /**
@@ -214,8 +214,8 @@
      * given Access Category. The container queues which became empty after dequeuing
      * the MPDUs are removed from the sorted list of queues.
      *
-     * \param ac the Access Category of the dequeued MPDUs
-     * \param mpdus the list of dequeued MPDUs
+     * @param ac the Access Category of the dequeued MPDUs
+     * @param mpdus the list of dequeued MPDUs
      */
     virtual void NotifyDequeue(AcIndex ac, const std::list<Ptr<WifiMpdu>>& mpdus) = 0;
     /**
@@ -223,8 +223,8 @@
      * given Access Category. The container queues which became empty after removing
      * the MPDUs are removed from the sorted list of queues.
      *
-     * \param ac the Access Category of the removed MPDUs
-     * \param mpdus the list of removed MPDUs
+     * @param ac the Access Category of the removed MPDUs
+     * @param mpdus the list of removed MPDUs
      */
     virtual void NotifyRemove(AcIndex ac, const std::list<Ptr<WifiMpdu>>& mpdus) = 0;
 
@@ -234,7 +234,7 @@
     /**
      * Get the wifi MAC.
      *
-     * \return the wifi MAC
+     * @return the wifi MAC
      */
     Ptr<WifiMac> GetMac() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-mac-queue-scheduler-impl.h ns-3.44/src/wifi/model/wifi-mac-queue-scheduler-impl.h
--- ns-3.43/src/wifi/model/wifi-mac-queue-scheduler-impl.h	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/wifi-mac-queue-scheduler-impl.h	2025-03-09 16:55:49.799372700 -0700
@@ -32,7 +32,7 @@
 class WifiMacQueue;
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * WifiMacQueueSchedulerImpl is a template class enabling the definition of
  * different types of priority values for the container queues. The function to
@@ -46,8 +46,8 @@
     friend class ::WifiMacQueueDropOldestTest;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -56,22 +56,22 @@
      */
     WifiMacQueueSchedulerImpl();
 
-    /** \copydoc ns3::WifiMacQueueScheduler::SetWifiMac */
+    /** @copydoc ns3::WifiMacQueueScheduler::SetWifiMac */
     void SetWifiMac(Ptr<WifiMac> mac) final;
-    /** \copydoc ns3::WifiMacQueueScheduler::GetNext(AcIndex,std::optional<uint8_t>) */
+    /** @copydoc ns3::WifiMacQueueScheduler::GetNext(AcIndex,std::optional<uint8_t>) */
     std::optional<WifiContainerQueueId> GetNext(AcIndex ac, std::optional<uint8_t> linkId) final;
     /**
-     *  \copydoc ns3::WifiMacQueueScheduler::GetNext(AcIndex,std::optional<uint8_t>,
+     *  @copydoc ns3::WifiMacQueueScheduler::GetNext(AcIndex,std::optional<uint8_t>,
      *           const WifiContainerQueueId&)
      */
     std::optional<WifiContainerQueueId> GetNext(AcIndex ac,
                                                 std::optional<uint8_t> linkId,
                                                 const WifiContainerQueueId& prevQueueId) final;
-    /** \copydoc ns3::WifiMacQueueScheduler::GetLinkIds */
+    /** @copydoc ns3::WifiMacQueueScheduler::GetLinkIds */
     std::list<uint8_t> GetLinkIds(AcIndex ac,
                                   Ptr<const WifiMpdu> mpdu,
                                   const std::list<WifiQueueBlockedReason>& ignoredReasons) final;
-    /** \copydoc ns3::WifiMacQueueScheduler::BlockQueues */
+    /** @copydoc ns3::WifiMacQueueScheduler::BlockQueues */
     void BlockQueues(WifiQueueBlockedReason reason,
                      AcIndex ac,
                      const std::list<WifiContainerQueueType>& types,
@@ -79,7 +79,7 @@
                      const Mac48Address& txAddress,
                      const std::set<uint8_t>& tids,
                      const std::set<uint8_t>& linkIds) final;
-    /** \copydoc ns3::WifiMacQueueScheduler::UnblockQueues */
+    /** @copydoc ns3::WifiMacQueueScheduler::UnblockQueues */
     void UnblockQueues(WifiQueueBlockedReason reason,
                        AcIndex ac,
                        const std::list<WifiContainerQueueType>& types,
@@ -87,29 +87,29 @@
                        const Mac48Address& txAddress,
                        const std::set<uint8_t>& tids,
                        const std::set<uint8_t>& linkIds) final;
-    /** \copydoc ns3::WifiMacQueueScheduler::GetQueueLinkMask */
+    /** @copydoc ns3::WifiMacQueueScheduler::GetQueueLinkMask */
     std::optional<Mask> GetQueueLinkMask(AcIndex ac,
                                          const WifiContainerQueueId& queueId,
                                          uint8_t linkId) final;
-    /** \copydoc ns3::WifiMacQueueScheduler::HasToDropBeforeEnqueue */
+    /** @copydoc ns3::WifiMacQueueScheduler::HasToDropBeforeEnqueue */
     Ptr<WifiMpdu> HasToDropBeforeEnqueue(AcIndex ac, Ptr<WifiMpdu> mpdu) final;
-    /** \copydoc ns3::WifiMacQueueScheduler::NotifyEnqueue */
+    /** @copydoc ns3::WifiMacQueueScheduler::NotifyEnqueue */
     void NotifyEnqueue(AcIndex ac, Ptr<WifiMpdu> mpdu) final;
-    /** \copydoc ns3::WifiMacQueueScheduler::NotifyDequeue */
+    /** @copydoc ns3::WifiMacQueueScheduler::NotifyDequeue */
     void NotifyDequeue(AcIndex ac, const std::list<Ptr<WifiMpdu>>& mpdus) final;
-    /** \copydoc ns3::WifiMacQueueScheduler::NotifyRemove */
+    /** @copydoc ns3::WifiMacQueueScheduler::NotifyRemove */
     void NotifyRemove(AcIndex ac, const std::list<Ptr<WifiMpdu>>& mpdus) final;
 
   protected:
-    /** \copydoc ns3::Object::DoDispose */
+    /** @copydoc ns3::Object::DoDispose */
     void DoDispose() override;
 
     /**
      * Set the priority for the given container queue belonging to the given Access Category.
      *
-     * \param ac the Access Category of the container queue
-     * \param queueId the ID of the given container queue
-     * \param priority the priority value
+     * @param ac the Access Category of the container queue
+     * @param queueId the ID of the given container queue
+     * @param priority the priority value
      */
     void SetPriority(AcIndex ac, const WifiContainerQueueId& queueId, const Priority& priority);
 
@@ -131,7 +131,7 @@
      *
      * Empty queues shall not be kept in this data structure.
      *
-     * \note We cannot store iterators to QueueInfoMap because if rehashing occurs due
+     * @note We cannot store iterators to QueueInfoMap because if rehashing occurs due
      *       to an insertion, all iterators are invalidated. References are not invalidated
      *       instead. Therefore, we store reference wrappers (which can be reassigned).
      */
@@ -165,8 +165,8 @@
      * Get a const reference to the sorted list of container queues for the given
      * Access Category.
      *
-     * \param ac the given Access Category
-     * \return a const reference to the sorted list of container queues for the given Access
+     * @param ac the given Access Category
+     * @return a const reference to the sorted list of container queues for the given Access
      * Category
      */
     const SortedQueues& GetSortedQueues(AcIndex ac) const;
@@ -174,8 +174,8 @@
     /**
      * Get the wifi MAC queue associated with the given Access Category.
      *
-     * \param ac the given Access Category
-     * \return the wifi MAC queue associated with the given Access Category
+     * @param ac the given Access Category
+     * @return the wifi MAC queue associated with the given Access Category
      */
     Ptr<WifiMacQueue> GetWifiMacQueue(AcIndex ac) const;
 
@@ -186,9 +186,9 @@
      * container queue and initialize the list of the IDs of the links over which packets
      * contained in that container queue can be sent.
      *
-     * \param ac the given Access Category
-     * \param mpdu the given MPDU
-     * \return an iterator to the information associated with the container queue used to
+     * @param ac the given Access Category
+     * @param mpdu the given MPDU
+     * @return an iterator to the information associated with the container queue used to
      *         store the given MPDU of the given Access Category
      */
     typename QueueInfoMap::iterator InitQueueInfo(AcIndex ac, Ptr<const WifiMpdu> mpdu);
@@ -198,11 +198,11 @@
      * queue is guaranteed to contain at least an MPDU whose lifetime has not expired.
      * Queues containing MPDUs that cannot be sent over the given link are ignored.
      *
-     * \param ac the Access Category that we want to serve
-     * \param linkId the ID of the link on which MPDUs contained in the returned queue must be
+     * @param ac the Access Category that we want to serve
+     * @param linkId the ID of the link on which MPDUs contained in the returned queue must be
      *               allowed to be sent
-     * \param sortedQueuesIt iterator pointing to the queue we start the search from
-     * \return the ID of the selected container queue (if any)
+     * @param sortedQueuesIt iterator pointing to the queue we start the search from
+     * @return the ID of the selected container queue (if any)
      */
     std::optional<WifiContainerQueueId> DoGetNext(AcIndex ac,
                                                   std::optional<uint8_t> linkId,
@@ -211,9 +211,9 @@
     /**
      * Check whether an MPDU has to be dropped before enqueuing the given MPDU.
      *
-     * \param ac the Access Category of the MPDU being enqueued
-     * \param mpdu the MPDU to enqueue
-     * \return a pointer to the MPDU to drop, if any, or a null pointer, otherwise
+     * @param ac the Access Category of the MPDU being enqueued
+     * @param mpdu the MPDU to enqueue
+     * @return a pointer to the MPDU to drop, if any, or a null pointer, otherwise
      */
     virtual Ptr<WifiMpdu> HasToDropBeforeEnqueuePriv(AcIndex ac, Ptr<WifiMpdu> mpdu) = 0;
     /**
@@ -221,8 +221,8 @@
      * Category. The container queue in which the MPDU has been enqueued must be
      * assigned a priority value.
      *
-     * \param ac the Access Category of the enqueued MPDU
-     * \param mpdu the enqueued MPDU
+     * @param ac the Access Category of the enqueued MPDU
+     * @param mpdu the enqueued MPDU
      */
     virtual void DoNotifyEnqueue(AcIndex ac, Ptr<WifiMpdu> mpdu) = 0;
     /**
@@ -230,8 +230,8 @@
      * given Access Category. The container queues which became empty after dequeuing
      * the MPDUs are removed from the sorted list of queues.
      *
-     * \param ac the Access Category of the dequeued MPDUs
-     * \param mpdus the list of dequeued MPDUs
+     * @param ac the Access Category of the dequeued MPDUs
+     * @param mpdus the list of dequeued MPDUs
      */
     virtual void DoNotifyDequeue(AcIndex ac, const std::list<Ptr<WifiMpdu>>& mpdus) = 0;
     /**
@@ -239,8 +239,8 @@
      * given Access Category. The container queues which became empty after removing
      * the MPDUs are removed from the sorted list of queues.
      *
-     * \param ac the Access Category of the removed MPDUs
-     * \param mpdus the list of removed MPDUs
+     * @param ac the Access Category of the removed MPDUs
+     * @param mpdus the list of removed MPDUs
      */
     virtual void DoNotifyRemove(AcIndex ac, const std::list<Ptr<WifiMpdu>>& mpdus) = 0;
 
@@ -249,14 +249,14 @@
      * Access Category that hold frames having the given Receiver Address (RA),
      * Transmitter Address (TA) and TID (if needed) for the given reason.
      *
-     * \param block true to block the queues, false to unblock
-     * \param reason the reason for blocking the queues
-     * \param ac the given Access Category
-     * \param types the types of the queues to block
-     * \param rxAddress the Receiver Address (RA) of the frames
-     * \param txAddress the Transmitter Address (TA) of the frames
-     * \param tids the TIDs optionally identifying the queues to block
-     * \param linkIds set of links to block (empty to block all setup links)
+     * @param block true to block the queues, false to unblock
+     * @param reason the reason for blocking the queues
+     * @param ac the given Access Category
+     * @param types the types of the queues to block
+     * @param rxAddress the Receiver Address (RA) of the frames
+     * @param txAddress the Transmitter Address (TA) of the frames
+     * @param tids the TIDs optionally identifying the queues to block
+     * @param linkIds set of links to block (empty to block all setup links)
      */
     void DoBlockQueues(bool block,
                        WifiQueueBlockedReason reason,
@@ -634,27 +634,35 @@
                 prevQueueIt = std::prev(sortedQueuesIt);
             }
 
-            GetWifiMacQueue(ac)->ExtractExpiredMpdus(queueInfoPair.first);
+            const auto queueId = queueInfoPair.first;
+            GetWifiMacQueue(ac)->ExtractExpiredMpdus(queueId);
 
-            if (GetWifiMacQueue(ac)->GetNBytes(queueInfoPair.first) == 0)
+            if (GetWifiMacQueue(ac)->GetNBytes(queueId) == 0)
             {
-                sortedQueuesIt = (prevQueueIt.has_value() ? std::next(prevQueueIt.value())
-                                                          : m_perAcInfo[ac].sortedQueues.begin());
+                auto nextQueueIt = (prevQueueIt.has_value() ? std::next(prevQueueIt.value())
+                                                            : m_perAcInfo[ac].sortedQueues.begin());
+                // the container queue may be empty but it may not have been removed yet from the
+                // sorted list. This may happen because the scheduler is notified after that packets
+                // are dequeued and there may be a callback connected to the Dequeue trace source
+                // that calls this function. In such a case, nextQueueIt actually points to the same
+                // queue as sortedQueuesIt. The iterator is advanced to avoid an infinite loop.
+                if (nextQueueIt != m_perAcInfo[ac].sortedQueues.end() &&
+                    nextQueueIt->second.get().first == queueId)
+                {
+                    sortedQueuesIt = std::next(nextQueueIt);
+                }
+                else
+                {
+                    sortedQueuesIt = nextQueueIt;
+                }
                 continue;
             }
-            break;
+            return queueInfoPair.first;
         }
 
         sortedQueuesIt++;
     }
-
-    std::optional<WifiContainerQueueId> queueId;
-
-    if (sortedQueuesIt != m_perAcInfo[ac].sortedQueues.end())
-    {
-        queueId = sortedQueuesIt->second.get().first;
-    }
-    return queueId;
+    return {};
 }
 
 template <class Priority, class Compare>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-mac-trailer.h ns-3.44/src/wifi/model/wifi-mac-trailer.h
--- ns-3.43/src/wifi/model/wifi-mac-trailer.h	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/wifi-mac-trailer.h	2025-03-09 16:55:49.803372600 -0700
@@ -20,7 +20,7 @@
 static const uint16_t WIFI_MAC_FCS_LENGTH = 4;
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * Implements the IEEE 802.11 MAC trailer
  */
@@ -31,8 +31,8 @@
     ~WifiMacTrailer() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-mgt-header.h ns-3.44/src/wifi/model/wifi-mgt-header.h
--- ns-3.43/src/wifi/model/wifi-mgt-header.h	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/wifi-mgt-header.h	2025-03-09 16:55:49.803372600 -0700
@@ -30,8 +30,8 @@
 {
 
 /**
- * \ingroup object
- * \tparam T \explicit An Information Element type
+ * @ingroup object
+ * @tparam T \explicit An Information Element type
  *
  * Provides the type used to store Information Elements in the tuple held by WifiMgtHeader:
  * - a mandatory Information Element of type T is stored as std::optional\<T\>
@@ -45,7 +45,7 @@
     typedef std::optional<T> type;
 };
 
-/** \copydoc GetStoredIe */
+/** @copydoc GetStoredIe */
 template <class T>
 struct GetStoredIe<std::optional<T>>
 {
@@ -53,7 +53,7 @@
     typedef std::optional<T> type;
 };
 
-/** \copydoc GetStoredIe */
+/** @copydoc GetStoredIe */
 template <class T>
 struct GetStoredIe<std::vector<T>>
 {
@@ -61,23 +61,23 @@
     typedef std::vector<T> type;
 };
 
-/** \copydoc GetStoredIe */
+/** @copydoc GetStoredIe */
 template <class T>
 using GetStoredIeT = typename GetStoredIe<T>::type;
 
 } // namespace internal
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * Implement the header for management frames.
- * \tparam Derived \explicit the type of derived management frame
- * \tparam Tuple \explicit A tuple of the types of Information Elements included in the mgt frame
+ * @tparam Derived \explicit the type of derived management frame
+ * @tparam Tuple \explicit A tuple of the types of Information Elements included in the mgt frame
  */
 template <typename Derived, typename Tuple>
 class WifiMgtHeader;
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * Base class for implementing management frame headers. This class adopts the CRTP idiom,
  * mainly to allow subclasses to specialize the method used to initialize Information
  * Elements before deserialization (<i>InitForDeserialization</i>).
@@ -88,8 +88,8 @@
  * - the type of an optional Information Element IE is std::optional\<IE\>
  * - the type of an Information Element IE that can appear zero or more times is std::vector\<IE\>
  *
- * \tparam Derived \explicit the type of derived management frame
- * \tparam Elems \explicit sorted list of Information Elements that can be included in mgt frame
+ * @tparam Derived \explicit the type of derived management frame
+ * @tparam Elems \explicit sorted list of Information Elements that can be included in mgt frame
  */
 template <typename Derived, typename... Elems>
 class WifiMgtHeader<Derived, std::tuple<Elems...>> : public Header
@@ -98,8 +98,8 @@
     /**
      * Access a (mandatory or optional) Information Element.
      *
-     * \tparam T \explicit the type of the Information Element to return
-     * \return a reference to the Information Element of the given type
+     * @tparam T \explicit the type of the Information Element to return
+     * @return a reference to the Information Element of the given type
      */
     template <typename T,
               std::enable_if_t<(std::is_same_v<std::vector<T>, Elems> + ...) == 0, int> = 0>
@@ -108,8 +108,8 @@
     /**
      * Access a (mandatory or optional) Information Element.
      *
-     * \tparam T \explicit the type of the Information Element to return
-     * \return a const reference to the Information Element of the given type
+     * @tparam T \explicit the type of the Information Element to return
+     * @return a const reference to the Information Element of the given type
      */
     template <typename T,
               std::enable_if_t<(std::is_same_v<std::vector<T>, Elems> + ...) == 0, int> = 0>
@@ -118,8 +118,8 @@
     /**
      * Access an Information Element that can be present zero or more times.
      *
-     * \tparam T \explicit the type of the Information Element to return
-     * \return a reference to the Information Element of the given type
+     * @tparam T \explicit the type of the Information Element to return
+     * @return a reference to the Information Element of the given type
      */
     template <typename T,
               std::enable_if_t<(std::is_same_v<std::vector<T>, Elems> + ...) == 1, int> = 0>
@@ -128,8 +128,8 @@
     /**
      * Access an Information Element that can be present zero or more times.
      *
-     * \tparam T \explicit the type of the Information Element to return
-     * \return a reference to the Information Element of the given type
+     * @tparam T \explicit the type of the Information Element to return
+     * @return a reference to the Information Element of the given type
      */
     template <typename T,
               std::enable_if_t<(std::is_same_v<std::vector<T>, Elems> + ...) == 1, int> = 0>
@@ -142,8 +142,8 @@
 
   protected:
     /**
-     * \tparam IE \deduced the type of the Information Element to initialize for deserialization
-     * \param optElem the object to initialize for deserializing the information element into
+     * @tparam IE \deduced the type of the Information Element to initialize for deserialization
+     * @param optElem the object to initialize for deserializing the information element into
      *
      * The Information Element object is constructed by calling the object's default constructor.
      */
@@ -151,34 +151,34 @@
     void InitForDeserialization(std::optional<IE>& optElem);
 
     /**
-     * \param optElem the EhtCapabilities object to initialize for deserializing the
+     * @param optElem the EhtCapabilities object to initialize for deserializing the
      *                information element into
      */
     void InitForDeserialization(std::optional<EhtCapabilities>& optElem);
 
-    /** \copydoc ns3::Header::Print */
+    /** @copydoc ns3::Header::Print */
     void PrintImpl(std::ostream& os) const;
-    /** \copydoc ns3::Header::GetSerializedSize */
+    /** @copydoc ns3::Header::GetSerializedSize */
     uint32_t GetSerializedSizeImpl() const;
-    /** \copydoc ns3::Header::Serialize */
+    /** @copydoc ns3::Header::Serialize */
     void SerializeImpl(Buffer::Iterator start) const;
-    /** \copydoc ns3::Header::Deserialize */
+    /** @copydoc ns3::Header::Deserialize */
     uint32_t DeserializeImpl(Buffer::Iterator start);
 
     /**
-     * \tparam T \deduced the type of the Information Element
-     * \param elem the optional Information Element
-     * \param start the buffer iterator pointing to where deserialization starts
-     * \return an iterator pointing to where deserialization terminated
+     * @tparam T \deduced the type of the Information Element
+     * @param elem the optional Information Element
+     * @param start the buffer iterator pointing to where deserialization starts
+     * @return an iterator pointing to where deserialization terminated
      */
     template <typename T>
     Buffer::Iterator DoDeserialize(std::optional<T>& elem, Buffer::Iterator start);
 
     /**
-     * \tparam T \deduced the type of the Information Elements
-     * \param elems a vector of Information Elements
-     * \param start the buffer iterator pointing to where deserialization starts
-     * \return an iterator pointing to where deserialization terminated
+     * @tparam T \deduced the type of the Information Elements
+     * @param elems a vector of Information Elements
+     * @param start the buffer iterator pointing to where deserialization starts
+     * @return an iterator pointing to where deserialization terminated
      */
     template <typename T>
     Buffer::Iterator DoDeserialize(std::vector<T>& elems, Buffer::Iterator start);
@@ -190,38 +190,38 @@
 };
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *  Inspect a type to deduce whether it is an Information Element that can be included in a
  *  Per-STA Profile subelement of a Multi-Link Element.
- *  \tparam T \explicit The type to inspect.
+ *  @tparam T \explicit The type to inspect.
  */
 template <class T>
 struct CanBeInPerStaProfile : std::true_type
 {
 };
 
-/** \copydoc CanBeInPerStaProfile */
+/** @copydoc CanBeInPerStaProfile */
 template <class T>
 inline constexpr bool CanBeInPerStaProfileV = CanBeInPerStaProfile<T>::value;
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * Implement the header for management frames that can be included in a Per-STA Profile
  * subelement of a Multi-Link Element.
- * \tparam Derived \explicit the type of derived management frame
- * \tparam Tuple \explicit A tuple of the types of Information Elements included in the mgt frame
+ * @tparam Derived \explicit the type of derived management frame
+ * @tparam Tuple \explicit A tuple of the types of Information Elements included in the mgt frame
  */
 template <typename Derived, typename Tuple>
 class MgtHeaderInPerStaProfile;
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * Add methods needed to serialize/deserialize a management header into a Per-STA Profile
  * subelement of a Multi-Link Element.
  *
- * \tparam Derived \explicit the type of derived management frame
- * \tparam Elems \explicit sorted list of Information Elements that can be included in mgt frame
+ * @tparam Derived \explicit the type of derived management frame
+ * @tparam Elems \explicit sorted list of Information Elements that can be included in mgt frame
  */
 template <typename Derived, typename... Elems>
 class MgtHeaderInPerStaProfile<Derived, std::tuple<Elems...>>
@@ -229,8 +229,8 @@
 {
   public:
     /**
-     * \param frame the frame containing the Multi-Link Element
-     * \return the number of bytes that are needed to serialize this header into a Per-STA Profile
+     * @param frame the frame containing the Multi-Link Element
+     * @return the number of bytes that are needed to serialize this header into a Per-STA Profile
      *         subelement of the Multi-Link Element
      */
     uint32_t GetSerializedSizeInPerStaProfile(const Derived& frame) const;
@@ -238,18 +238,18 @@
     /**
      * Serialize this header into a Per-STA Profile subelement of a Multi-Link Element
      *
-     * \param start an iterator which points to where the header should be written
-     * \param frame the frame containing the Multi-Link Element
+     * @param start an iterator which points to where the header should be written
+     * @param frame the frame containing the Multi-Link Element
      */
     void SerializeInPerStaProfile(Buffer::Iterator start, const Derived& frame) const;
 
     /**
      * Deserialize this header from a Per-STA Profile subelement of a Multi-Link Element.
      *
-     * \param start an iterator which points to where the header should be read from
-     * \param length the expected number of bytes to read
-     * \param frame the frame containing the Multi-Link Element
-     * \return the number of bytes read
+     * @param start an iterator which points to where the header should be read from
+     * @param length the expected number of bytes to read
+     * @param frame the frame containing the Multi-Link Element
+     * @return the number of bytes read
      */
     uint32_t DeserializeFromPerStaProfile(Buffer::Iterator start,
                                           uint16_t length,
@@ -261,7 +261,7 @@
      * shall be invoked when the deserialization has been completed (i.e., the Non-Inheritance
      * element, if present, has been deserialized).
      *
-     * \param frame the frame containing the Multi-Link Element
+     * @param frame the frame containing the Multi-Link Element
      */
     void CopyIesFromContainingFrame(const Derived& frame);
 
@@ -269,8 +269,8 @@
     using WifiMgtHeader<Derived, std::tuple<Elems...>>::InitForDeserialization;
 
     /**
-     * \param frame the frame containing the Multi-Link Element
-     * \return the number of bytes that are needed to serialize this header into a Per-STA Profile
+     * @param frame the frame containing the Multi-Link Element
+     * @return the number of bytes that are needed to serialize this header into a Per-STA Profile
      *         subelement of the Multi-Link Element
      */
     uint32_t GetSerializedSizeInPerStaProfileImpl(const Derived& frame) const;
@@ -278,18 +278,18 @@
     /**
      * Serialize this header into a Per-STA Profile subelement of a Multi-Link Element
      *
-     * \param start an iterator which points to where the header should be written
-     * \param frame the frame containing the Multi-Link Element
+     * @param start an iterator which points to where the header should be written
+     * @param frame the frame containing the Multi-Link Element
      */
     void SerializeInPerStaProfileImpl(Buffer::Iterator start, const Derived& frame) const;
 
     /**
      * Deserialize this header from a Per-STA Profile subelement of a Multi-Link Element.
      *
-     * \param start an iterator which points to where the header should be read from
-     * \param length the expected number of bytes to read
-     * \param frame the frame containing the Multi-Link Element
-     * \return the number of bytes read
+     * @param start an iterator which points to where the header should be read from
+     * @param length the expected number of bytes to read
+     * @param frame the frame containing the Multi-Link Element
+     * @return the number of bytes read
      */
     uint32_t DeserializeFromPerStaProfileImpl(Buffer::Iterator start,
                                               uint16_t length,
@@ -301,7 +301,7 @@
     void SetMleContainingFrame() const;
 
     /**
-     * \param optElem the MultiLinkElement object to initialize for deserializing the
+     * @param optElem the MultiLinkElement object to initialize for deserializing the
      *                information element into
      */
     void InitForDeserialization(std::optional<MultiLinkElement>& optElem);
@@ -391,9 +391,9 @@
 {
 
 /**
- * \tparam T \deduced the type of the Information Element
- * \param elem the optional Information Element
- * \return the serialized size of the Information Element, if present, or 0, otherwise
+ * @tparam T \deduced the type of the Information Element
+ * @param elem the optional Information Element
+ * @return the serialized size of the Information Element, if present, or 0, otherwise
  */
 template <typename T>
 uint16_t
@@ -403,9 +403,9 @@
 }
 
 /**
- * \tparam T \deduced the type of the Information Elements
- * \param elems a vector of Information Elements
- * \return the serialized size of the Information Elements
+ * @tparam T \deduced the type of the Information Elements
+ * @param elems a vector of Information Elements
+ * @return the serialized size of the Information Elements
  */
 template <typename T>
 uint16_t
@@ -437,10 +437,10 @@
 {
 
 /**
- * \tparam T \deduced the type of the Information Element
- * \param elem the optional Information Element
- * \param start the buffer iterator pointing to where serialization starts
- * \return an iterator pointing to where serialization terminated
+ * @tparam T \deduced the type of the Information Element
+ * @param elem the optional Information Element
+ * @param start the buffer iterator pointing to where serialization starts
+ * @return an iterator pointing to where serialization terminated
  */
 template <typename T>
 Buffer::Iterator
@@ -450,10 +450,10 @@
 }
 
 /**
- * \tparam T \deduced the type of the Information Elements
- * \param elems a vector of Information Elements
- * \param start the buffer iterator pointing to where serialization starts
- * \return an iterator pointing to where serialization terminated
+ * @tparam T \deduced the type of the Information Elements
+ * @param elems a vector of Information Elements
+ * @param start the buffer iterator pointing to where serialization starts
+ * @return an iterator pointing to where serialization terminated
  */
 template <typename T>
 Buffer::Iterator
@@ -562,9 +562,9 @@
 {
 
 /**
- * \tparam T \deduced the type of the Information Element
- * \param elem the optional Information Element
- * \param os the output stream
+ * @tparam T \deduced the type of the Information Element
+ * @param elem the optional Information Element
+ * @param os the output stream
  */
 template <typename T>
 void
@@ -577,9 +577,9 @@
 }
 
 /**
- * \tparam T \deduced the type of the Information Elements
- * \param elems a vector of Information Elements
- * \param os the output stream
+ * @tparam T \deduced the type of the Information Elements
+ * @param elems a vector of Information Elements
+ * @param os the output stream
  */
 template <typename T>
 void
@@ -608,11 +608,11 @@
 {
 
 /**
- * \tparam T \deduced the type of the given Information Element
- * \tparam Derived \deduced the type of the containing management frame
- * \param elem the given Information Element
- * \param frame the containing management frame
- * \return whether the given Information Element shall be serialized in a Per-STA Profile
+ * @tparam T \deduced the type of the given Information Element
+ * @tparam Derived \deduced the type of the containing management frame
+ * @param elem the given Information Element
+ * @param frame the containing management frame
+ * @return whether the given Information Element shall be serialized in a Per-STA Profile
  *         subelement of the Multi-Link Element included in the containing management frame
  */
 template <typename T, typename Derived>
@@ -643,11 +643,11 @@
 }
 
 /**
- * \tparam T \deduced the type of the given vector of Information Elements
- * \tparam Derived \deduced the type of the containing management frame
- * \param elems the given vector of Information Elements
- * \param frame the containing management frame
- * \return whether the given Information Elements shall be serialized in a Per-STA Profile
+ * @tparam T \deduced the type of the given vector of Information Elements
+ * @tparam Derived \deduced the type of the containing management frame
+ * @param elems the given vector of Information Elements
+ * @param frame the containing management frame
+ * @return whether the given Information Elements shall be serialized in a Per-STA Profile
  *         subelement of the Multi-Link Element included in the containing management frame
  */
 template <typename T, typename Derived>
@@ -678,11 +678,11 @@
 }
 
 /**
- * \tparam T \deduced the type of the given Information Element
- * \tparam Derived \deduced the type of the containing management frame
- * \param elem the given Information Element
- * \param frame the containing management frame
- * \return a pair (Element ID, Element ID Extension) if the given Information Element shall be
+ * @tparam T \deduced the type of the given Information Element
+ * @tparam Derived \deduced the type of the containing management frame
+ * @param elem the given Information Element
+ * @param frame the containing management frame
+ * @return a pair (Element ID, Element ID Extension) if the given Information Element shall be
  *         listed in the Non-Inheritance IE of the Per-STA Profile subelement of the Multi-Link
  *         Element included in the containing management frame
  */
@@ -699,11 +699,11 @@
 }
 
 /**
- * \tparam T \deduced the type of the given vector of Information Elements
- * \tparam Derived \deduced the type of the containing management frame
- * \param elems the given Information Elements
- * \param frame the containing management frame
- * \return a pair (Element ID, Element ID Extension) if the given Information Element shall be
+ * @tparam T \deduced the type of the given vector of Information Elements
+ * @tparam Derived \deduced the type of the containing management frame
+ * @param elems the given Information Elements
+ * @param frame the containing management frame
+ * @return a pair (Element ID, Element ID Extension) if the given Information Element shall be
  *         listed in the Non-Inheritance IE of the Per-STA Profile subelement of the Multi-Link
  *         Element included in the containing management frame
  */
@@ -814,10 +814,10 @@
 {
 
 /**
- * \tparam T \deduced the type of the given Information Element
- * \tparam Derived \deduced the type of the containing management frame
- * \param elem the given Information Element
- * \param frame the containing management frame
+ * @tparam T \deduced the type of the given Information Element
+ * @tparam Derived \deduced the type of the containing management frame
+ * @param elem the given Information Element
+ * @param frame the containing management frame
  *
  * Copy the given Information Element from the containing frame to the Per-STA Profile subelement
  * of the Multi-Link Element, if the Information Element has been inherited (i.e., it is present
@@ -835,10 +835,10 @@
 }
 
 /**
- * \tparam T \deduced the type of the given vector of Information Elements
- * \tparam Derived \deduced the type of the containing management frame
- * \param elems the given vector of Information Elements
- * \param frame the containing management frame
+ * @tparam T \deduced the type of the given vector of Information Elements
+ * @tparam Derived \deduced the type of the containing management frame
+ * @param elems the given vector of Information Elements
+ * @param frame the containing management frame
  *
  * Copy the given Information Element from the containing frame to the Per-STA Profile subelement
  * of the Multi-Link Element, if the Information Element has been inherited (i.e., it is present
@@ -906,9 +906,9 @@
 {
 
 /**
- * \tparam T \deduced the type of the given Information Element
- * \param elem the given Information Element
- * \param nonInheritance the Non-Inheritance information element
+ * @tparam T \deduced the type of the given Information Element
+ * @param elem the given Information Element
+ * @param nonInheritance the Non-Inheritance information element
  *
  * Remove the given Information Element from this header, if it is present and is listed in
  * the given Non-Inheritance element.
@@ -924,9 +924,9 @@
 }
 
 /**
- * \tparam T \deduced the type of the given vector of Information Elements
- * \param elem the given Information Elements
- * \param nonInheritance the Non-Inheritance information element
+ * @tparam T \deduced the type of the given vector of Information Elements
+ * @param elem the given Information Elements
+ * @param nonInheritance the Non-Inheritance information element
  *
  * Remove the given Information Elements from this header, if they are present and are listed in
  * the given Non-Inheritance element.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-mode.h ns-3.44/src/wifi/model/wifi-mode.h
--- ns-3.43/src/wifi/model/wifi-mode.h	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/wifi-mode.h	2025-03-09 16:55:49.803372600 -0700
@@ -26,107 +26,107 @@
 class WifiTxVector;
 
 /**
- * \brief represent a single transmission mode
- * \ingroup wifi
+ * @brief represent a single transmission mode
+ * @ingroup wifi
  *
  * A WifiMode is implemented by a single integer which is used
  * to lookup in a global array the characteristics of the
  * associated transmission mode. It is thus extremely cheap to
  * keep a WifiMode variable around.
  *
- * \see attribute_WifiMode
+ * @see attribute_WifiMode
  */
 class WifiMode
 {
   public:
     /**
-     * \returns true if this <MCS, channel width, NSS> combination is allowed, false otherwise.
+     * @returns true if this <MCS, channel width, NSS> combination is allowed, false otherwise.
      *
-     * \param channelWidth the considered channel width
-     * \param nss the considered number of streams
+     * @param channelWidth the considered channel width
+     * @param nss the considered number of streams
      */
     bool IsAllowed(MHz_u channelWidth, uint8_t nss) const;
     /**
-     * \returns true if this TXVECTOR combination is allowed, false otherwise.
+     * @returns true if this TXVECTOR combination is allowed, false otherwise.
      *
-     * \param txVector the const WifiTxVector& of the signal
+     * @param txVector the const WifiTxVector& of the signal
      */
     bool IsAllowed(const WifiTxVector& txVector) const;
     /**
      *
-     * \param channelWidth the considered channel width
-     * \param guardInterval the considered guard interval duration
-     * \param nss the considered number of streams
+     * @param channelWidth the considered channel width
+     * @param guardInterval the considered guard interval duration
+     * @param nss the considered number of streams
      *
-     * \returns the physical bit rate of this signal in bps.
+     * @returns the physical bit rate of this signal in bps.
      *
      * If a transmission mode uses 1/2 FEC, and if its
      * data rate is 3.25Mbps, the PHY rate is 6.5Mbps
      */
     uint64_t GetPhyRate(MHz_u channelWidth, Time guardInterval, uint8_t nss) const;
     /**
-     * \param txVector the const WifiTxVector& of the signal
-     * \param staId the station ID for MU (unused if SU)
+     * @param txVector the const WifiTxVector& of the signal
+     * @param staId the station ID for MU (unused if SU)
      *
-     * \returns the physical bit rate of this signal in bps.
+     * @returns the physical bit rate of this signal in bps.
      *
      * If a transmission mode uses 1/2 FEC, and if its
      * data rate is 3.25Mbps, the PHY rate is 6.5Mbps
      */
     uint64_t GetPhyRate(const WifiTxVector& txVector, uint16_t staId = SU_STA_ID) const;
     /**
-     * \param channelWidth the considered channel width
+     * @param channelWidth the considered channel width
      *
-     * \returns the physical bit rate of this non-HT signal.
+     * @returns the physical bit rate of this non-HT signal.
      */
     uint64_t GetPhyRate(MHz_u channelWidth) const;
     /**
      *
-     * \param channelWidth the considered channel width
-     * \param guardInterval the considered guard interval duration
-     * \param nss the considered number of streams
+     * @param channelWidth the considered channel width
+     * @param guardInterval the considered guard interval duration
+     * @param nss the considered number of streams
      *
-     * \returns the data bit rate of this signal in bps.
+     * @returns the data bit rate of this signal in bps.
      */
     uint64_t GetDataRate(MHz_u channelWidth, Time guardInterval, uint8_t nss) const;
     /**
-     * \param txVector the const WifiTxVector& of the signal
-     * \param staId the station ID for MU (unused if SU)
+     * @param txVector the const WifiTxVector& of the signal
+     * @param staId the station ID for MU (unused if SU)
      *
-     * \returns the data bit rate of this signal.
+     * @returns the data bit rate of this signal.
      */
     uint64_t GetDataRate(const WifiTxVector& txVector, uint16_t staId = SU_STA_ID) const;
     /**
-     * \param channelWidth the considered channel width
+     * @param channelWidth the considered channel width
      *
-     * \returns the data bit rate of this non-HT.
+     * @returns the data bit rate of this non-HT.
      */
     uint64_t GetDataRate(MHz_u channelWidth) const;
 
     /**
-     * \returns the coding rate of this transmission mode
+     * @returns the coding rate of this transmission mode
      */
     WifiCodeRate GetCodeRate() const;
     /**
-     * \returns the size of the modulation constellation.
+     * @returns the size of the modulation constellation.
      */
     uint16_t GetConstellationSize() const;
     /**
-     * \returns the MCS value.
+     * @returns the MCS value.
      */
     uint8_t GetMcsValue() const;
     /**
-     * \returns a human-readable representation of this WifiMode
+     * @returns a human-readable representation of this WifiMode
      * instance.
      */
     const std::string& GetUniqueName() const;
     /**
-     * \returns true if this mode is a mandatory mode, false
+     * @returns true if this mode is a mandatory mode, false
      *          otherwise.
      */
     bool IsMandatory() const;
     /**
-     * \returns the UID associated to this wireless mode.
+     * @returns the UID associated to this wireless mode.
      *
      * Each specific wireless mode should have a different UID.
      * For example, the 802.11b 1Mbps and the 802.11b 2Mbps modes
@@ -135,12 +135,12 @@
     uint32_t GetUid() const;
     /**
      *
-     * \returns the Modulation Class (Section 9.7.8 "Modulation classes"; IEEE 802.11-2012)
+     * @returns the Modulation Class (Section 9.7.8 "Modulation classes"; IEEE 802.11-2012)
      * to which this WifiMode belongs.
      */
     WifiModulationClass GetModulationClass() const;
     /**
-     * \returns the rate (in bps) of the non-HT Reference Rate
+     * @returns the rate (in bps) of the non-HT Reference Rate
      * which corresponds to the HT MCS of this WifiMode.
      *
      * To convert an HT MCS to is corresponding non-HT Reference Rate
@@ -149,14 +149,14 @@
      */
     uint64_t GetNonHtReferenceRate() const;
     /**
-     * \param mode the WifiMode
-     * \returns true if this WifiMode has a
+     * @param mode the WifiMode
+     * @returns true if this WifiMode has a
      * a code rate strictly higher than mode.
      */
     bool IsHigherCodeRate(WifiMode mode) const;
     /**
-     * \param mode the WifiMode
-     * \returns true if this WifiMode has a
+     * @param mode the WifiMode
+     * @returns true if this WifiMode has a
      * a rate strictly higher than mode.
      */
     bool IsHigherDataRate(WifiMode mode) const;
@@ -172,7 +172,7 @@
      * Create a WifiMode if the given string represents a valid
      * WifiMode name.
      *
-     * \param name std::string of a valid WifiMode name
+     * @param name std::string of a valid WifiMode name
      */
     WifiMode(std::string name);
 
@@ -182,7 +182,7 @@
     /**
      * Create a WifiMode from a given unique ID.
      *
-     * \param uid unique ID
+     * @param uid unique ID
      */
     WifiMode(uint32_t uid);
     uint32_t m_uid; ///< UID
@@ -191,10 +191,10 @@
 /**
  * Check if the two WifiModes are identical.
  *
- * \param a WifiMode
- * \param b WifiMode
+ * @param a WifiMode
+ * @param b WifiMode
  *
- * \return true if the two WifiModes are identical,
+ * @return true if the two WifiModes are identical,
  *         false otherwise
  */
 bool operator==(const WifiMode& a, const WifiMode& b);
@@ -202,10 +202,10 @@
 /**
  * Check if the two WifiModes are different.
  *
- * \param a WifiMode
- * \param b WifiMode
+ * @param a WifiMode
+ * @param b WifiMode
  *
- * \return true if the two WifiModes are different,
+ * @return true if the two WifiModes are different,
  *         false otherwise
  */
 bool operator!=(const WifiMode& a, const WifiMode& b);
@@ -213,10 +213,10 @@
 /**
  * Compare two WifiModes
  *
- * \param a WifiMode
- * \param b WifiMode
+ * @param a WifiMode
+ * @param b WifiMode
  *
- * \return true if a is less than b,
+ * @return true if a is less than b,
  *         false otherwise
  */
 bool operator<(const WifiMode& a, const WifiMode& b);
@@ -224,19 +224,19 @@
 /**
  * Serialize WifiMode to ostream (human-readable).
  *
- * \param os the output stream
- * \param mode the WifiMode
+ * @param os the output stream
+ * @param mode the WifiMode
  *
- * \return std::ostream
+ * @return std::ostream
  */
 std::ostream& operator<<(std::ostream& os, const WifiMode& mode);
 /**
  * Serialize WifiMode from istream (human-readable).
  *
- * \param is the input stream
- * \param mode the WifiMode
+ * @param is the input stream
+ * @param mode the WifiMode
  *
- * \return std::istream
+ * @return std::istream
  */
 std::istream& operator>>(std::istream& is, WifiMode& mode);
 
@@ -255,7 +255,7 @@
 typedef WifiModeList::const_iterator WifiModeListIterator;
 
 /**
- * \brief create WifiMode class instances and keep track of them.
+ * @brief create WifiMode class instances and keep track of them.
  *
  * This factory ensures that each WifiMode created has a unique name
  * and assigns to each of them a unique integer.
@@ -266,21 +266,21 @@
     // Typedefs for callbacks used by WifiModeItem
     /**
      * Typedef for callback used to retrieve code rate of a WifiMode
-     * \return the code rate of the WifiMode.
+     * @return the code rate of the WifiMode.
      */
     typedef Callback<WifiCodeRate> CodeRateCallback;
     /**
      * Typedef for callback used to retrieve constellation size of a WifiMode
-     * \return the size of modulation constellation of the WifiMode.
+     * @return the size of modulation constellation of the WifiMode.
      */
     typedef Callback<uint16_t> ConstellationSizeCallback;
     /**
      * Typedef for callback used to calculate PHY rate of a WifiMode
      * from a TXVECTOR.
      *
-     * \param txVector the TXVECTOR used for the transmission
-     * \param staId the station ID
-     * \return the physical bit rate of the signal in bps.
+     * @param txVector the TXVECTOR used for the transmission
+     * @param staId the station ID
+     * @return the physical bit rate of the signal in bps.
      */
     typedef Callback<uint64_t, const WifiTxVector& /* txVector */, uint16_t /* staId */>
         PhyRateCallback;
@@ -288,9 +288,9 @@
      * Typedef for callback used to calculate data rate of a WifiMode
      * from a TXVECTOR.
      *
-     * \param txVector the TXVECTOR used for the transmission
-     * \param staId the station ID
-     * \return the data rate of the signal in bps.
+     * @param txVector the TXVECTOR used for the transmission
+     * @param staId the station ID
+     * @return the data rate of the signal in bps.
      */
     typedef Callback<uint64_t, const WifiTxVector& /* txVector */, uint16_t /* staId */>
         DataRateCallback;
@@ -299,37 +299,37 @@
      * an MCS defined in HT or later amendment. For Non-HT modes (DSSS, OFDM,
      * etc) this should be defined as null.
      *
-     * \return the rate (in bps) of the non-HT Reference Rate.
+     * @return the rate (in bps) of the non-HT Reference Rate.
      */
     typedef Callback<uint64_t> NonHtReferenceRateCallback;
     /**
      * Typedef for callback used to check whether a given combination is allowed
      *
-     * \param txVector the TXVECTOR containing the combination to check
-     * \return true if combination of current WifiMode and TXVECTOR is allowed.
+     * @param txVector the TXVECTOR containing the combination to check
+     * @return true if combination of current WifiMode and TXVECTOR is allowed.
      */
     typedef Callback<bool, const WifiTxVector& /* txVector */> AllowedCallback;
 
     /**
-     * \param uniqueName the name of the associated WifiMode. This name
+     * @param uniqueName the name of the associated WifiMode. This name
      *        must be unique across _all_ instances.
-     * \param modClass the class of modulation
-     * \param isMandatory true if this WifiMode is mandatory, false otherwise.
-     * \param codeRateCallback a callback function to retrieve coding rate of
+     * @param modClass the class of modulation
+     * @param isMandatory true if this WifiMode is mandatory, false otherwise.
+     * @param codeRateCallback a callback function to retrieve coding rate of
      *        this WifiMode. If convolutional coding is used for this rate
      *        then the callback returns the convolutional coding rate used. If
      *        there is no explicit convolutional coding step (e.g., for DSSS
      *        rates) then the callback should returns WIFI_CODE_RATE_UNDEFINED.
-     * \param constellationSizeCallback a callback function that returns the
+     * @param constellationSizeCallback a callback function that returns the
      *        order of the constellation used.
-     * \param phyRateCallback a callback function to calculate the PHY rate (in
+     * @param phyRateCallback a callback function to calculate the PHY rate (in
      *        bps) of this WifiMode.
-     * \param dataRateCallback a callback function to calculate the data rate
+     * @param dataRateCallback a callback function to calculate the data rate
      *        (in bps) of this WifiMode.
-     * \param isAllowedCallback a callback function to check whether a
+     * @param isAllowedCallback a callback function to check whether a
      *        specific combination of this WifiMode is allowed.
      *
-     * \return WifiMode
+     * @return WifiMode
      *
      * Create a non-HT WifiMode.
      */
@@ -343,25 +343,25 @@
                                    AllowedCallback isAllowedCallback);
 
     /**
-     * \param uniqueName the name of the associated WifiMode. This name
+     * @param uniqueName the name of the associated WifiMode. This name
      *        must be unique across _all_ instances.
-     * \param mcsValue the MCS value
-     * \param modClass the class of modulation
-     * \param isMandatory true if this WifiMode is mandatory, false otherwise.
-     * \param codeRateCallback a callback function that returns the coding rate
+     * @param mcsValue the MCS value
+     * @param modClass the class of modulation
+     * @param isMandatory true if this WifiMode is mandatory, false otherwise.
+     * @param codeRateCallback a callback function that returns the coding rate
      *        of this WifiMode.
-     * \param constellationSizeCallback a callback function that returns the size
+     * @param constellationSizeCallback a callback function that returns the size
      *        of modulation constellation of this WifiMode.
-     * \param phyRateCallback a callback function to calculate the PHY rate (in
+     * @param phyRateCallback a callback function to calculate the PHY rate (in
      *        bps) of this WifiMode.
-     * \param dataRateCallback a callback function to calculate the data rate (in
+     * @param dataRateCallback a callback function to calculate the data rate (in
      *        bps) of this WifiMode.
-     * \param nonHtReferenceRateCallback a callback function to calculate the rate
+     * @param nonHtReferenceRateCallback a callback function to calculate the rate
      *        (in bps) of the non-HT Reference Rate of this WifiMode.
-     * \param isAllowedCallback a callback function to calculate whether a given
+     * @param isAllowedCallback a callback function to calculate whether a given
      *        combination of is allowed for this WifiMode.
      *
-     * \return WifiMode
+     * @return WifiMode
      *
      * Create a HT or later WifiMode.
      */
@@ -384,7 +384,7 @@
     /**
      * Return a WifiModeFactory
      *
-     * \return a WifiModeFactory
+     * @return a WifiModeFactory
      */
     static WifiModeFactory* GetFactory();
     WifiModeFactory();
@@ -419,25 +419,25 @@
     /**
      * Search and return WifiMode from a given name.
      *
-     * \param name human-readable WifiMode
+     * @param name human-readable WifiMode
      *
-     * \return the WifiMode
+     * @return the WifiMode
      */
     WifiMode Search(std::string name) const;
     /**
      * Allocate a WifiModeItem from a given uniqueUid.
      *
-     * \param uniqueUid the unique UID
+     * @param uniqueUid the unique UID
      *
-     * \return the allocated UID index
+     * @return the allocated UID index
      */
     uint32_t AllocateUid(std::string uniqueUid);
     /**
      * Return a WifiModeItem at the given UID index.
      *
-     * \param uid the UID index
+     * @param uid the UID index
      *
-     * \return WifiModeItem at the given UID
+     * @return WifiModeItem at the given UID
      */
     WifiModeItem* Get(uint32_t uid);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-mpdu.cc ns-3.44/src/wifi/model/wifi-mpdu.cc
--- ns-3.43/src/wifi/model/wifi-mpdu.cc	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/wifi-mpdu.cc	2025-03-09 16:55:49.803372600 -0700
@@ -29,6 +29,7 @@
     auto& original = std::get<OriginalInfo>(m_instanceInfo);
     original.m_packet = p;
     original.m_timestamp = stamp;
+    original.m_retryCount = 0;
 
     if (header.IsQosData() && header.IsQosAmsdu())
     {
@@ -113,6 +114,41 @@
     return std::get<OriginalInfo>(origInstanceInfo).m_timestamp;
 }
 
+uint32_t
+WifiMpdu::GetRetryCount() const
+{
+    if (auto original = std::get_if<ORIGINAL>(&m_instanceInfo))
+    {
+        return original->m_retryCount;
+    }
+    const auto& origInstanceInfo = std::get<Ptr<WifiMpdu>>(m_instanceInfo)->m_instanceInfo;
+    return std::get<OriginalInfo>(origInstanceInfo).m_retryCount;
+}
+
+void
+WifiMpdu::IncrementRetryCount()
+{
+    NS_LOG_FUNCTION(this);
+
+    if (m_header.IsBlockAckReq() || m_header.IsTrigger())
+    {
+        // this function may be called for these frames, but a retry count must not be maintained
+        // for them
+        return;
+    }
+
+    NS_ABORT_MSG_UNLESS(m_header.IsData() || m_header.IsMgt(),
+                        "Frame retry count is not maintained for frames of type "
+                            << m_header.GetTypeString());
+    if (auto original = std::get_if<ORIGINAL>(&m_instanceInfo))
+    {
+        ++original->m_retryCount;
+        return;
+    }
+    auto& origInstanceInfo = std::get<Ptr<WifiMpdu>>(m_instanceInfo)->m_instanceInfo;
+    ++std::get<OriginalInfo>(origInstanceInfo).m_retryCount;
+}
+
 const WifiMacHeader&
 WifiMpdu::GetHeader() const
 {
@@ -181,6 +217,7 @@
         // An MSDU is going to be aggregated to this MPDU, hence this has to be an A-MSDU now
         Ptr<const WifiMpdu> firstMsdu = Create<const WifiMpdu>(*this);
         original.m_packet = Create<Packet>();
+        original.m_retryCount = 0;
         DoAggregate(firstMsdu);
 
         m_header.SetQosAmsdu();
@@ -370,7 +407,8 @@
 void
 WifiMpdu::Print(std::ostream& os) const
 {
-    os << m_header << ", payloadSize=" << GetPacketSize() << ", queued=" << IsQueued();
+    os << m_header << ", payloadSize=" << GetPacketSize() << ", retryCount=" << GetRetryCount()
+       << ", queued=" << IsQueued();
     if (IsQueued())
     {
         os << ", residualLifetime=" << (GetExpiryTime() - Simulator::Now()).As(Time::US)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-mpdu.h ns-3.44/src/wifi/model/wifi-mpdu.h
--- ns-3.43/src/wifi/model/wifi-mpdu.h	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/wifi-mpdu.h	2025-03-09 16:55:49.803372600 -0700
@@ -28,7 +28,7 @@
 {
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * Tag used to allow (only) WifiMacQueue to access the queue iterator stored
  * by a WifiMpdu.
@@ -40,7 +40,7 @@
 };
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * WifiMpdu stores a (const) packet along with a MAC header. To support 802.11be
  * Multi-Link Operation (MLO), a WifiMpdu variant, referred to as WifiMpdu alias,
@@ -51,79 +51,79 @@
 {
   public:
     /**
-     * \brief Create a Wifi MAC queue item containing a packet and a Wifi MAC header.
-     * \param p the const packet included in the created item.
-     * \param header the Wifi MAC header included in the created item.
-     * \param stamp the timestamp to associate with the MPDU
+     * @brief Create a Wifi MAC queue item containing a packet and a Wifi MAC header.
+     * @param p the const packet included in the created item.
+     * @param header the Wifi MAC header included in the created item.
+     * @param stamp the timestamp to associate with the MPDU
      */
     WifiMpdu(Ptr<const Packet> p, const WifiMacHeader& header, Time stamp = Simulator::Now());
 
     virtual ~WifiMpdu();
 
     /**
-     * \return whether this is the original version of the MPDU
+     * @return whether this is the original version of the MPDU
      */
     bool IsOriginal() const;
 
     /**
-     * \return the original version of this MPDU
+     * @return the original version of this MPDU
      */
     Ptr<const WifiMpdu> GetOriginal() const;
 
     /**
-     * \brief Get the packet stored in this item
-     * \return the packet stored in this item.
+     * @brief Get the packet stored in this item
+     * @return the packet stored in this item.
      */
     Ptr<const Packet> GetPacket() const;
 
     /**
-     * \brief Get the header stored in this item
-     * \return the header stored in this item.
+     * @brief Get the header stored in this item
+     * @return the header stored in this item.
      */
     const WifiMacHeader& GetHeader() const;
 
     /**
-     * \brief Get the header stored in this item
-     * \return the header stored in this item.
+     * @brief Get the header stored in this item
+     * @return the header stored in this item.
      */
     WifiMacHeader& GetHeader();
 
     /**
-     * \brief Return the destination address present in the header
-     * \return the destination address
+     * @brief Return the destination address present in the header
+     * @return the destination address
      */
     Mac48Address GetDestinationAddress() const;
 
     /**
-     * \brief Return the size of the packet stored by this item, including header
+     * @brief Return the size of the packet stored by this item, including header
      *        size and trailer size
      *
-     * \return the size of the packet stored by this item in bytes.
+     * @return the size of the packet stored by this item in bytes.
      */
     uint32_t GetSize() const;
 
     /**
-     * \brief Return the size in bytes of the packet or control header or management
+     * @brief Return the size in bytes of the packet or control header or management
      *        header stored by this item.
      *
-     * \return the size in bytes of the packet or control header or management header
+     * @return the size in bytes of the packet or control header or management header
      *         stored by this item
      */
     uint32_t GetPacketSize() const;
 
     /**
      * Return true if this item contains an MSDU fragment, false otherwise
-     * \return true if this item contains an MSDU fragment, false otherwise
+     * @return true if this item contains an MSDU fragment, false otherwise
      */
     bool IsFragment() const;
 
     /**
-     * \brief Aggregate the MSDU contained in the given MPDU to this MPDU (thus
+     * @brief Aggregate the MSDU contained in the given MPDU to this MPDU (thus
      *        constituting an A-MSDU). Note that the given MPDU cannot contain
      *        an A-MSDU. If the given MPDU is a null pointer, the effect of this
      *        call is to add only an A-MSDU subframe header, thus producing an A-MSDU
      *        containing a single MSDU.
-     * \param msdu the MPDU containing the MSDU to aggregate
+     * @param msdu the MPDU containing the MSDU to aggregate
      */
     void Aggregate(Ptr<const WifiMpdu> msdu);
 
@@ -134,15 +134,15 @@
         DeaggregatedMsdusCI;
 
     /**
-     * \brief Get a constant iterator pointing to the first MSDU in the list of aggregated MSDUs.
+     * @brief Get a constant iterator pointing to the first MSDU in the list of aggregated MSDUs.
      *
-     * \return a constant iterator pointing to the first MSDU in the list of aggregated MSDUs
+     * @return a constant iterator pointing to the first MSDU in the list of aggregated MSDUs
      */
     DeaggregatedMsdusCI begin() const;
     /**
-     * \brief Get a constant iterator indicating past-the-last MSDU in the list of aggregated MSDUs.
+     * @brief Get a constant iterator indicating past-the-last MSDU in the list of aggregated MSDUs.
      *
-     * \return a constant iterator indicating past-the-last MSDU in the list of aggregated MSDUs
+     * @return a constant iterator indicating past-the-last MSDU in the list of aggregated MSDUs
      */
     DeaggregatedMsdusCI end() const;
 
@@ -152,64 +152,74 @@
     /**
      * Set the queue iterator stored by this object.
      *
-     * \param queueIt the queue iterator for this object
-     * \param tag a wifi MAC queue iterator tag (allows only WifiMacQueue to call this method)
+     * @param queueIt the queue iterator for this object
+     * @param tag a wifi MAC queue iterator tag (allows only WifiMacQueue to call this method)
      */
     void SetQueueIt(std::optional<Iterator> queueIt, WmqIteratorTag tag);
     /**
-     * \param tag a wifi MAC queue iterator tag (allows only WifiMacQueue to call this method)
-     * \return the queue iterator stored by this object
+     * @param tag a wifi MAC queue iterator tag (allows only WifiMacQueue to call this method)
+     * @return the queue iterator stored by this object
      */
     Iterator GetQueueIt(WmqIteratorTag tag) const;
 
     /**
      * Return true if this item is stored in some queue, false otherwise.
      *
-     * \return true if this item is stored in some queue, false otherwise
+     * @return true if this item is stored in some queue, false otherwise
      */
     bool IsQueued() const;
     /**
      * 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
+     * @return the AC of the queue this item is stored into
      */
     AcIndex GetQueueAc() const;
     /**
-     * \return the time this MPDU was constructed
+     * @return the time this MPDU was constructed
      */
     Time GetTimestamp() const;
     /**
-     * \return the expiry time of this MPDU
+     * @return the expiry time of this MPDU
      */
     Time GetExpiryTime() const;
 
     /**
-     * \brief Get the MAC protocol data unit (MPDU) corresponding to this item
+     * @return the frame retry count
+     */
+    uint32_t GetRetryCount() const;
+
+    /**
+     * Increment the frame retry count.
+     */
+    void IncrementRetryCount();
+
+    /**
+     * @brief Get the MAC protocol data unit (MPDU) corresponding to this item
      *        (i.e. a copy of the packet stored in this item wrapped with MAC
      *        header and trailer)
-     * \return the MAC protocol data unit corresponding to this item.
+     * @return the MAC protocol data unit corresponding to this item.
      */
     Ptr<Packet> GetProtocolDataUnit() const;
 
     /**
      * Mark this MPDU as being in flight on the given link.
      *
-     * \param linkId the ID of the given link
+     * @param linkId the ID of the given link
      */
     void SetInFlight(uint8_t linkId) const;
     /**
      * Mark this MPDU as not being in flight on the given link.
      *
-     * \param linkId the ID of the given link
+     * @param linkId the ID of the given link
      */
     void ResetInFlight(uint8_t linkId) const;
     /**
-     * \return the set of IDs of the links on which this MPDU is currently in flight
+     * @return the set of IDs of the links on which this MPDU is currently in flight
      */
     std::set<uint8_t> GetInFlightLinkIds() const;
     /**
-     * \return true if this MPDU is in flight on any link, false otherwise
+     * @return true if this MPDU is in flight on any link, false otherwise
      */
     bool IsInFlight() const;
 
@@ -217,11 +227,11 @@
      * Set the sequence number of this MPDU (and of the original copy, if this is an alias)
      * to the given value. Also, record that a sequence number has been assigned to this MPDU.
      *
-     * \param seqNo the given sequence number
+     * @param seqNo the given sequence number
      */
     void AssignSeqNo(uint16_t seqNo);
     /**
-     * \return whether a sequence number has been assigned to this MPDU
+     * @return whether a sequence number has been assigned to this MPDU
      */
     bool HasSeqNoAssigned() const;
     /**
@@ -234,28 +244,28 @@
      * on the link with the given ID. Aliases have their own copy of the MAC header and
      * cannot be used to perform non-const operations on the frame body.
      *
-     * \param linkId the ID of the given link
-     * \return an alias for this MPDU
+     * @param linkId the ID of the given link
+     * @return an alias for this MPDU
      */
     Ptr<WifiMpdu> CreateAlias(uint8_t linkId) const;
 
     /**
-     * \brief Print the item contents.
-     * \param os output stream in which the data should be printed.
+     * @brief Print the item contents.
+     * @param os output stream in which the data should be printed.
      */
     virtual void Print(std::ostream& os) const;
 
   private:
     /**
-     * \brief Aggregate the MSDU contained in the given MPDU to this MPDU (thus
+     * @brief Aggregate the MSDU contained in the given MPDU to this MPDU (thus
      *        constituting an A-MSDU). Note that the given MPDU cannot contain
      *        an A-MSDU.
-     * \param msdu the MPDU containing the MSDU to aggregate
+     * @param msdu the MPDU containing the MSDU to aggregate
      */
     void DoAggregate(Ptr<const WifiMpdu> msdu);
 
     /**
-     * \return the queue iterator stored by this object
+     * @return the queue iterator stored by this object
      */
     Iterator GetQueueIt() const;
 
@@ -279,14 +289,15 @@
         DeaggregatedMsdus m_msduList;      //!< list of aggregated MSDUs included in this MPDU
         std::optional<Iterator> m_queueIt; //!< Queue iterator pointing to this MPDU, if queued
         bool m_seqNoAssigned;              //!< whether a sequence number has been assigned
+        uint32_t m_retryCount; //!< the frame retry count maintained for each MSDU, A-MSDU or MMPDU
     };
 
     /**
-     * \return a reference to the information held by the original copy of the MPDU.
+     * @return a reference to the information held by the original copy of the MPDU.
      */
     OriginalInfo& GetOriginalInfo();
     /**
-     * \return a const reference to the information held by the original copy of the MPDU.
+     * @return a const reference to the information held by the original copy of the MPDU.
      */
     const OriginalInfo& GetOriginalInfo() const;
 
@@ -300,11 +311,11 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the output stream
- * \param item the WifiMpdu
- * \returns a reference to the stream
+ * @param os the output stream
+ * @param item the WifiMpdu
+ * @returns a reference to the stream
  */
 std::ostream& operator<<(std::ostream& os, const WifiMpdu& item);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-net-device.cc ns-3.44/src/wifi/model/wifi-net-device.cc
--- ns-3.43/src/wifi/model/wifi-net-device.cc	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/wifi-net-device.cc	2025-03-09 16:55:49.803372600 -0700
@@ -49,7 +49,7 @@
                           PointerValue(),
                           MakePointerAccessor(&WifiNetDevice::GetChannel),
                           MakePointerChecker<Channel>(),
-                          TypeId::DEPRECATED,
+                          TypeId::SupportLevel::DEPRECATED,
                           "class WifiNetDevice; use the Channel "
                           "attribute of WifiPhy")
             .AddAttribute("Phy",
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-net-device.h ns-3.44/src/wifi/model/wifi-net-device.h
--- ns-3.43/src/wifi/model/wifi-net-device.h	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/wifi-net-device.h	2025-03-09 16:55:49.803372600 -0700
@@ -32,15 +32,15 @@
 static const uint16_t MAX_MSDU_SIZE = 2304;
 
 /**
- * \defgroup wifi Wifi Models
+ * @defgroup wifi Wifi Models
  *
  * This section documents the API of the ns-3 Wifi module. For a generic functional description,
  * please refer to the ns-3 manual.
  */
 
 /**
- * \brief Hold together all Wifi-related objects.
- * \ingroup wifi
+ * @brief Hold together all Wifi-related objects.
+ * @ingroup wifi
  *
  * This class holds together ns3::Channel, ns3::WifiPhy,
  * ns3::WifiMac, and, ns3::WifiRemoteStationManager.
@@ -49,8 +49,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -64,111 +64,111 @@
     /**
      * Set the Wifi standard.
      *
-     * \param standard the Wifi standard
+     * @param standard the Wifi standard
      */
     void SetStandard(WifiStandard standard);
     /**
      * Get the Wifi standard.
      *
-     * \return the Wifi standard
+     * @return the Wifi standard
      */
     WifiStandard GetStandard() const;
 
     /**
-     * \param mac the MAC layer to use.
+     * @param mac the MAC layer to use.
      */
     void SetMac(const Ptr<WifiMac> mac);
     /**
-     * \param phy the PHY layer to use.
+     * @param phy the PHY layer to use.
      */
     void SetPhy(const Ptr<WifiPhy> phy);
     /**
-     * \param phys the PHY layers to use (for 11be multi-link devices only)
+     * @param phys the PHY layers to use (for 11be multi-link devices only)
      */
     void SetPhys(const std::vector<Ptr<WifiPhy>>& phys);
     /**
-     * \param manager the manager to use.
+     * @param manager the manager to use.
      */
     void SetRemoteStationManager(const Ptr<WifiRemoteStationManager> manager);
     /**
-     * \param managers the managers to use (for 11be multi-link devices only)
+     * @param managers the managers to use (for 11be multi-link devices only)
      */
     void SetRemoteStationManagers(const std::vector<Ptr<WifiRemoteStationManager>>& managers);
     /**
-     * \returns the MAC we are currently using.
+     * @returns the MAC we are currently using.
      */
     Ptr<WifiMac> GetMac() const;
     /**
-     * \returns the PHY we are currently using.
+     * @returns the PHY we are currently using.
      *
      * This GetPhy variant is needed to keep using "Phy" in the path names.
      */
     Ptr<WifiPhy> GetPhy() const;
     /**
-     * \param i the index (starting at 0) of the PHY object to retrieve
-     * \returns the requested PHY object
+     * @param i the index (starting at 0) of the PHY object to retrieve
+     * @returns the requested PHY object
      */
     virtual Ptr<WifiPhy> GetPhy(uint8_t i) const;
     /**
-     * \returns a const reference to the vector of PHY objects
+     * @returns a const reference to the vector of PHY objects
      */
     virtual const std::vector<Ptr<WifiPhy>>& GetPhys() const;
     /**
-     * \returns the number of PHY objects
+     * @returns the number of PHY objects
      */
     uint8_t GetNPhys() const;
     /**
-     * \returns the remote station manager we are currently using.
+     * @returns the remote station manager we are currently using.
      *
      * This GetRemoteStationManager variant is needed to keep using "RemoteStationManager"
      * in the path names.
      */
     Ptr<WifiRemoteStationManager> GetRemoteStationManager() const;
     /**
-     * \param linkId the ID (starting at 0) of the link of the RemoteStationManager
+     * @param linkId the ID (starting at 0) of the link of the RemoteStationManager
      *               object to retrieve
-     * \returns the requested remote station manager
+     * @returns the requested remote station manager
      */
     Ptr<WifiRemoteStationManager> GetRemoteStationManager(uint8_t linkId) const;
     /**
-     * \returns a const reference to the vector of remote station managers
+     * @returns a const reference to the vector of remote station managers
      */
     virtual const std::vector<Ptr<WifiRemoteStationManager>>& GetRemoteStationManagers() const;
     /**
-     * \returns the number of remote station managers
+     * @returns the number of remote station managers
      */
     uint8_t GetNRemoteStationManagers() const;
 
     /**
-     * \param htConfiguration pointer to HtConfiguration
+     * @param htConfiguration pointer to HtConfiguration
      */
     void SetHtConfiguration(Ptr<HtConfiguration> htConfiguration);
     /**
-     * \return pointer to HtConfiguration if it exists
+     * @return pointer to HtConfiguration if it exists
      */
     Ptr<HtConfiguration> GetHtConfiguration() const;
     /**
-     * \param vhtConfiguration pointer to VhtConfiguration
+     * @param vhtConfiguration pointer to VhtConfiguration
      */
     void SetVhtConfiguration(Ptr<VhtConfiguration> vhtConfiguration);
     /**
-     * \return pointer to VhtConfiguration if it exists
+     * @return pointer to VhtConfiguration if it exists
      */
     Ptr<VhtConfiguration> GetVhtConfiguration() const;
     /**
-     * \param heConfiguration pointer to HeConfiguration
+     * @param heConfiguration pointer to HeConfiguration
      */
     void SetHeConfiguration(Ptr<HeConfiguration> heConfiguration);
     /**
-     * \return pointer to HeConfiguration if it exists
+     * @return pointer to HeConfiguration if it exists
      */
     Ptr<HeConfiguration> GetHeConfiguration() const;
     /**
-     * \param ehtConfiguration pointer to EhtConfiguration
+     * @param ehtConfiguration pointer to EhtConfiguration
      */
     void SetEhtConfiguration(Ptr<EhtConfiguration> ehtConfiguration);
     /**
-     * \return pointer to EhtConfiguration if it exists
+     * @return pointer to EhtConfiguration if it exists
      */
     Ptr<EhtConfiguration> GetEhtConfiguration() const;
 
@@ -207,9 +207,9 @@
      * Receive a packet from the lower layer and pass the
      * packet up the stack.
      *
-     * \param packet the packet to forward up
-     * \param from the source address
-     * \param to the destination address
+     * @param packet the packet to forward up
+     * @param from the source address
+     * @param to the destination address
      */
     void ForwardUp(Ptr<const Packet> packet, Mac48Address from, Mac48Address to);
 
@@ -232,11 +232,11 @@
     /**
      * Send a packet
      *
-     * \param packet packet sent from upper layers
-     * \param source source mac address (if provided)
-     * \param dest destination mac address
-     * \param protocolNumber type of payload contained in this packet
-     * \returns true if successful, false otherwise
+     * @param packet packet sent from upper layers
+     * @param source source mac address (if provided)
+     * @param dest destination mac address
+     * @param protocolNumber type of payload contained in this packet
+     * @returns true if successful, false otherwise
      */
     bool DoSend(Ptr<Packet> packet,
                 std::optional<Address> source,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-opt-field.h ns-3.44/src/wifi/model/wifi-opt-field.h
--- ns-3.43/src/wifi/model/wifi-opt-field.h	2024-10-09 16:41:10.128656900 -0700
+++ ns-3.44/src/wifi/model/wifi-opt-field.h	2025-03-09 16:55:49.803372600 -0700
@@ -16,7 +16,7 @@
 {
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * OptFieldWithPresenceInd is a class modeling an optional field (in an Information Element, a
  * management frame, etc.) having an associated Presence Indicator bit. This class is a wrapper
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-phy-band.h ns-3.44/src/wifi/model/wifi-phy-band.h
--- ns-3.43/src/wifi/model/wifi-phy-band.h	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/model/wifi-phy-band.h	2025-03-09 16:55:49.803372600 -0700
@@ -15,7 +15,7 @@
 {
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * Identifies the PHY band.
  */
 enum WifiPhyBand
@@ -33,11 +33,11 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the stream
- * \param band the band
- * \returns a reference to the stream
+ * @param os the stream
+ * @param band the band
+ * @returns a reference to the stream
  */
 inline std::ostream&
 operator<<(std::ostream& os, WifiPhyBand band)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-phy.cc ns-3.44/src/wifi/model/wifi-phy.cc
--- ns-3.43/src/wifi/model/wifi-phy.cc	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/model/wifi-phy.cc	2025-03-09 16:55:49.803372600 -0700
@@ -299,16 +299,22 @@
                           BooleanValue(false),
                           MakeBooleanAccessor(&WifiPhy::m_notifyRxMacHeaderEnd),
                           MakeBooleanChecker())
-            .AddTraceSource("PhyTxBegin",
-                            "Trace source indicating a packet "
-                            "has begun transmitting over the channel medium",
-                            MakeTraceSourceAccessor(&WifiPhy::m_phyTxBeginTrace),
-                            "ns3::WifiPhy::PhyTxBeginTracedCallback")
-            .AddTraceSource("PhyTxPsduBegin",
-                            "Trace source indicating a PSDU "
-                            "has begun transmitting over the channel medium",
-                            MakeTraceSourceAccessor(&WifiPhy::m_phyTxPsduBeginTrace),
-                            "ns3::WifiPhy::PsduTxBeginCallback")
+            .AddTraceSource(
+                "PhyTxBegin",
+                "Trace source indicating a packet has begun transmitting over the medium; "
+                "the packet holds a single MPDU even if the MPDU is transmitted within an A-MPDU "
+                "(in which case this trace fires for each MPDU in the "
+                "A-MPDU).",
+                MakeTraceSourceAccessor(&WifiPhy::m_phyTxBeginTrace),
+                "ns3::WifiPhy::PhyTxBeginTracedCallback")
+            .AddTraceSource(
+                "PhyTxPsduBegin",
+                "Trace source indicating a PSDU has begun transmitting over the channel medium; "
+                "this trace returns a WifiConstPsduMap with a single element (in the case of SU "
+                "PPDU) "
+                "or multiple elements (in the case of MU PPDU)",
+                MakeTraceSourceAccessor(&WifiPhy::m_phyTxPsduBeginTrace),
+                "ns3::WifiPhy::PsduTxBeginCallback")
             .AddTraceSource("PhyTxEnd",
                             "Trace source indicating a packet "
                             "has been completely transmitted over the channel.",
@@ -345,7 +351,7 @@
                             "Trace source indicating a packet "
                             "has been dropped by the device during reception",
                             MakeTraceSourceAccessor(&WifiPhy::m_phyRxDropTrace),
-                            "ns3::Packet::TracedCallback")
+                            "ns3::WifiPhy::PhyRxDropTracedCallback")
             .AddTraceSource("PhyRxPpduDrop",
                             "Trace source indicating a ppdu "
                             "has been dropped by the device during reception",
@@ -379,17 +385,17 @@
       m_standard(WIFI_STANDARD_UNSPECIFIED),
       m_maxModClassSupported(WIFI_MOD_CLASS_UNKNOWN),
       m_band(WIFI_PHY_BAND_UNSPECIFIED),
-      m_sifs(Seconds(0)),
-      m_slot(Seconds(0)),
-      m_pifs(Seconds(0)),
-      m_ackTxTime(Seconds(0)),
-      m_blockAckTxTime(Seconds(0)),
+      m_sifs(),
+      m_slot(),
+      m_pifs(),
+      m_ackTxTime(),
+      m_blockAckTxTime(),
       m_powerRestricted(false),
       m_channelAccessRequested(false),
       m_txSpatialStreams(1),
       m_rxSpatialStreams(1),
       m_wifiRadioEnergyModel(nullptr),
-      m_timeLastPreambleDetected(Seconds(0))
+      m_timeLastPreambleDetected()
 {
     NS_LOG_FUNCTION(this);
     m_random = CreateObject<UniformRandomVariable>();
@@ -718,7 +724,7 @@
     dBm_u dbm;
     if (m_nTxPower > 1)
     {
-        dbm = m_txPowerBase + powerLevel * (m_txPowerEnd - m_txPowerBase) / (m_nTxPower - 1);
+        dbm = m_txPowerBase + dB_u{powerLevel * (m_txPowerEnd - m_txPowerBase) / (m_nTxPower - 1)};
     }
     else
     {
@@ -910,7 +916,7 @@
 WifiPhy::Configure80211p()
 {
     NS_LOG_FUNCTION(this);
-    if (GetChannelWidth() == 10)
+    if (GetChannelWidth() == MHz_u{10})
     {
         AddPhyEntity(WIFI_MOD_CLASS_OFDM, Create<OfdmPhy>(OFDM_PHY_10_MHZ));
 
@@ -920,7 +926,7 @@
         SetPifs(GetSifs() + GetSlot());
         m_ackTxTime = MicroSeconds(88);
     }
-    else if (GetChannelWidth() == 5)
+    else if (GetChannelWidth() == MHz_u{5})
     {
         AddPhyEntity(WIFI_MOD_CLASS_OFDM, Create<OfdmPhy>(OFDM_PHY_5_MHZ));
 
@@ -1098,7 +1104,7 @@
 uint8_t
 WifiPhy::GetPrimary20Index() const
 {
-    return m_operatingChannel.GetPrimaryChannelIndex(20);
+    return m_operatingChannel.GetPrimaryChannelIndex(MHz_u{20});
 }
 
 void
@@ -1119,7 +1125,7 @@
     auto modulation = mode.GetModulationClass();
     if (modulation == WIFI_MOD_CLASS_DSSS || modulation == WIFI_MOD_CLASS_HR_DSSS)
     {
-        return 22;
+        return MHz_u{22};
     }
 
     return std::min({GetChannelWidth(), GetMaximumChannelWidth(modulation), maxAllowedWidth});
@@ -1135,7 +1141,7 @@
         segments.emplace_back(channel.GetNumber(segmentId),
                               channel.GetWidth(segmentId),
                               channel.GetPhyBand(),
-                              channel.GetPrimaryChannelIndex(20));
+                              channel.GetPrimaryChannelIndex(MHz_u{20}));
     }
     SetOperatingChannel(segments);
 }
@@ -1240,7 +1246,7 @@
         {
             band = GetDefaultPhyBand(m_standard);
         }
-        if (width == 0 && number == 0)
+        if (width == MHz_u{0} && number == 0)
         {
             width = GetDefaultChannelWidth(m_standard, static_cast<WifiPhyBand>(band));
         }
@@ -1273,7 +1279,7 @@
                    std::back_inserter(segments),
                    [this](const auto& channelTuple) {
                        return FrequencyChannelInfo{std::get<0>(channelTuple),
-                                                   0,
+                                                   MHz_u{0},
                                                    std::get<1>(channelTuple),
                                                    m_band};
                    });
@@ -1286,7 +1292,7 @@
     if (m_device)
     {
         if (auto htConfig = m_device->GetHtConfiguration();
-            htConfig && !htConfig->Get40MHzOperationSupported() && chWidth > 20)
+            htConfig && !htConfig->m_40MHzSupported && chWidth > MHz_u{20})
         {
             NS_ABORT_MSG("Attempting to set a " << chWidth
                                                 << " MHz channel on"
@@ -1294,7 +1300,7 @@
         }
 
         if (auto vhtConfig = m_device->GetVhtConfiguration();
-            vhtConfig && !vhtConfig->Get160MHzOperationSupported() && chWidth > 80)
+            vhtConfig && !vhtConfig->m_160MHzSupported && chWidth > MHz_u{80})
         {
             NS_ABORT_MSG("Attempting to set a " << chWidth
                                                 << " MHz channel on"
@@ -1408,7 +1414,7 @@
 }
 
 void
-WifiPhy::SetSleepMode()
+WifiPhy::SetSleepMode(bool forceSleepInRx)
 {
     NS_LOG_FUNCTION(this);
     m_powerRestricted = false;
@@ -1417,15 +1423,24 @@
     {
     case WifiPhyState::TX:
         NS_LOG_DEBUG("setting sleep mode postponed until end of current transmission");
-        Simulator::Schedule(GetDelayUntilIdle(), &WifiPhy::SetSleepMode, this);
+        Simulator::Schedule(GetDelayUntilIdle(), &WifiPhy::SetSleepMode, this, forceSleepInRx);
         break;
     case WifiPhyState::RX:
-        NS_LOG_DEBUG("setting sleep mode postponed until end of current reception");
-        Simulator::Schedule(GetDelayUntilIdle(), &WifiPhy::SetSleepMode, this);
+        NS_LOG_DEBUG("setting sleep mode"
+                     << (forceSleepInRx ? "" : "postponed until end of current reception"));
+        if (forceSleepInRx)
+        {
+            AbortCurrentReception(WifiPhyRxfailureReason::SLEEPING);
+            m_state->SwitchToSleep();
+        }
+        else
+        {
+            Simulator::Schedule(GetDelayUntilIdle(), &WifiPhy::SetSleepMode, this, forceSleepInRx);
+        }
         break;
     case WifiPhyState::SWITCHING:
         NS_LOG_DEBUG("setting sleep mode postponed until end of channel switching");
-        Simulator::Schedule(GetDelayUntilIdle(), &WifiPhy::SetSleepMode, this);
+        Simulator::Schedule(GetDelayUntilIdle(), &WifiPhy::SetSleepMode, this, forceSleepInRx);
         break;
     case WifiPhyState::CCA_BUSY:
     case WifiPhyState::IDLE:
@@ -1691,9 +1706,9 @@
 void
 WifiPhy::NotifyMonitorSniffRx(Ptr<const WifiPsdu> psdu,
                               MHz_u channelFreq,
-                              WifiTxVector txVector,
+                              const WifiTxVector& txVector,
                               SignalNoiseDbm signalNoise,
-                              std::vector<bool> statusPerMpdu,
+                              const std::vector<bool>& statusPerMpdu,
                               uint16_t staId)
 {
     MpduInfo aMpdu;
@@ -1745,7 +1760,7 @@
 void
 WifiPhy::NotifyMonitorSniffTx(Ptr<const WifiPsdu> psdu,
                               MHz_u channelFreq,
-                              WifiTxVector txVector,
+                              const WifiTxVector& txVector,
                               uint16_t staId)
 {
     MpduInfo aMpdu;
@@ -1782,6 +1797,19 @@
     }
 }
 
+std::optional<Time>
+WifiPhy::GetTimeToMacHdrEnd(uint16_t staId) const
+{
+    for (auto& [modClass, phyEntity] : m_phyEntities)
+    {
+        if (auto remTime = phyEntity->GetTimeToMacHdrEnd(staId))
+        {
+            return remTime;
+        }
+    }
+    return std::nullopt;
+}
+
 WifiConstPsduMap
 WifiPhy::GetWifiConstPsduMap(Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector)
 {
@@ -1982,10 +2010,15 @@
     }
 }
 
-bool
-WifiPhy::IsReceivingPhyHeader() const
+std::optional<std::reference_wrapper<const WifiTxVector>>
+WifiPhy::GetInfoIfRxingPhyHeader() const
 {
-    return m_endPhyRxEvent.IsPending();
+    if (m_endPhyRxEvent.IsPending())
+    {
+        NS_ASSERT_MSG(m_currentEvent, "No current event while receiving PHY header");
+        return std::cref(m_currentEvent->GetPpdu()->GetTxVector());
+    }
+    return std::nullopt;
 }
 
 void
@@ -2353,7 +2386,7 @@
 Hz_u
 WifiPhy::GetSubcarrierSpacing() const
 {
-    Hz_u subcarrierSpacing = 0;
+    Hz_u subcarrierSpacing{0};
     switch (GetStandard())
     {
     case WIFI_STANDARD_80211a:
@@ -2361,21 +2394,21 @@
     case WIFI_STANDARD_80211b:
     case WIFI_STANDARD_80211n:
     case WIFI_STANDARD_80211ac:
-        subcarrierSpacing = 312500;
+        subcarrierSpacing = Hz_u{312500};
         break;
     case WIFI_STANDARD_80211p:
-        if (GetChannelWidth() == 5)
+        if (GetChannelWidth() == MHz_u{5})
         {
-            subcarrierSpacing = 78125;
+            subcarrierSpacing = Hz_u{78125};
         }
         else
         {
-            subcarrierSpacing = 156250;
+            subcarrierSpacing = Hz_u{156250};
         }
         break;
     case WIFI_STANDARD_80211ax:
     case WIFI_STANDARD_80211be:
-        subcarrierSpacing = 78125;
+        subcarrierSpacing = Hz_u{78125};
         break;
     default:
         NS_FATAL_ERROR("Standard unknown: " << GetStandard());
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-phy-common.cc ns-3.44/src/wifi/model/wifi-phy-common.cc
--- ns-3.43/src/wifi/model/wifi-phy-common.cc	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/model/wifi-phy-common.cc	2025-03-09 16:55:49.803372600 -0700
@@ -34,7 +34,7 @@
         Ptr<HtConfiguration> htConfiguration = device->GetHtConfiguration();
         NS_ASSERT(htConfiguration); // If HT/VHT modulation is used, we should have a HT
                                     // configuration attached
-        gi = NanoSeconds(htConfiguration->GetShortGuardIntervalSupported() ? 400 : 800);
+        gi = NanoSeconds(htConfiguration->m_sgiSupported ? 400 : 800);
     }
     return gi;
 }
@@ -56,7 +56,7 @@
 }
 
 WifiPreamble
-GetPreambleForTransmission(WifiModulationClass modulation, bool useShortPreamble)
+GetPreambleForTransmission(WifiModulationClass modulation, bool useShortPreamble /* = false */)
 {
     if (modulation == WIFI_MOD_CLASS_EHT)
     {
@@ -239,22 +239,23 @@
     {
     case WIFI_MOD_CLASS_DSSS:
     case WIFI_MOD_CLASS_HR_DSSS:
-        return 22;
+        return MHz_u{22};
     case WIFI_MOD_CLASS_OFDM:
     case WIFI_MOD_CLASS_ERP_OFDM:
-        return 20;
+        return MHz_u{20};
     case WIFI_MOD_CLASS_HT:
-        return 40;
+        return MHz_u{40};
     // NOLINTBEGIN(bugprone-branch-clone)
     case WIFI_MOD_CLASS_VHT:
     case WIFI_MOD_CLASS_HE:
-        return 160;
+        return MHz_u{160};
     case WIFI_MOD_CLASS_EHT:
-        return 160; // TODO update when 320 MHz channels are supported and remove clang-tidy guards
+        return MHz_u{
+            160}; // TODO update when 320 MHz channels are supported and remove clang-tidy guards
     // NOLINTEND(bugprone-branch-clone)
     default:
         NS_ABORT_MSG("Unknown modulation class: " << modulation);
-        return 0;
+        return MHz_u{0};
     }
 }
 
@@ -264,27 +265,27 @@
     switch (width)
     {
     case WifiChannelWidthType::UNKNOWN:
-        return 0;
+        return MHz_u{0};
     case WifiChannelWidthType::CW_20MHZ:
-        return 20;
+        return MHz_u{20};
     case WifiChannelWidthType::CW_22MHZ:
-        return 22;
+        return MHz_u{22};
     case WifiChannelWidthType::CW_5MHZ:
-        return 5;
+        return MHz_u{5};
     case WifiChannelWidthType::CW_10MHZ:
-        return 10;
+        return MHz_u{10};
     case WifiChannelWidthType::CW_40MHZ:
-        return 40;
+        return MHz_u{40};
     case WifiChannelWidthType::CW_80MHZ:
-        return 80;
+        return MHz_u{80};
     case WifiChannelWidthType::CW_160MHZ:
     case WifiChannelWidthType::CW_80_PLUS_80MHZ:
-        return 160;
+        return MHz_u{160};
     case WifiChannelWidthType::CW_2160MHZ:
-        return 2160;
+        return MHz_u{2160};
     default:
         NS_FATAL_ERROR("Unknown wifi channel width type " << width);
-        return 0;
+        return MHz_u{0};
     }
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-phy-common.h ns-3.44/src/wifi/model/wifi-phy-common.h
--- ns-3.43/src/wifi/model/wifi-phy-common.h	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/model/wifi-phy-common.h	2025-03-09 16:55:49.803372600 -0700
@@ -22,8 +22,8 @@
 #include <vector>
 
 /**
- * \file
- * \ingroup wifi
+ * @file
+ * @ingroup wifi
  * Declaration of the following enums:
  * - ns3::WifiPreamble
  * - ns3::WifiModulationClass
@@ -60,12 +60,12 @@
 using WifiSpectrumBands = std::vector<WifiSpectrumBandInfo>;
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * Compare two bands.
  *
- * \param lhs the band on the left of operator<
- * \param rhs the band on the right of operator<
- * \return true if the start/stop frequencies of the first segment of left are lower than the
+ * @param lhs the band on the left of operator<
+ * @param rhs the band on the right of operator<
+ * @return true if the start/stop frequencies of the first segment of left are lower than the
  * start/stop frequencies of the first segment of right. If the first segment is the same for left
  * and right, it return true if the start/stop frequencies of the second segment of left are lower
  * than the start/stop frequencies of the second segment of right. Otherwise, the function return
@@ -82,11 +82,11 @@
 }
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the stream
- * \param band the band
- * \returns a reference to the stream
+ * @param os the stream
+ * @param band the band
+ * @returns a reference to the stream
  */
 inline std::ostream&
 operator<<(std::ostream& os, const WifiSpectrumBandInfo& band)
@@ -127,11 +127,11 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the stream
- * \param codeRate the code rate
- * \returns a reference to the stream
+ * @param os the stream
+ * @param codeRate the code rate
+ * @returns a reference to the stream
  */
 inline std::ostream&
 operator<<(std::ostream& os, const WifiCodeRate& codeRate)
@@ -171,7 +171,7 @@
 }
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * The type of preamble to be used by an IEEE 802.11 transmission
  */
 enum WifiPreamble
@@ -193,11 +193,11 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the stream
- * \param preamble the preamble
- * \returns a reference to the stream
+ * @param os the stream
+ * @param preamble the preamble
+ * @returns a reference to the stream
  */
 inline std::ostream&
 operator<<(std::ostream& os, const WifiPreamble& preamble)
@@ -239,7 +239,7 @@
 }
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * This enumeration defines the modulation classes per
  * (Table 10-6 "Modulation classes"; IEEE 802.11-2016, with
  * updated in 802.11ax/D6.0 as Table 10-9).
@@ -264,11 +264,11 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the stream
- * \param modulation the WifiModulationClass
- * \returns a reference to the stream
+ * @param os the stream
+ * @param modulation the WifiModulationClass
+ * @returns a reference to the stream
  */
 inline std::ostream&
 operator<<(std::ostream& os, const WifiModulationClass& modulation)
@@ -306,7 +306,7 @@
 }
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * The type of PPDU field (grouped for convenience)
  */
 enum WifiPpduField
@@ -335,11 +335,11 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the stream
- * \param field the PPDU field
- * \returns a reference to the stream
+ * @param os the stream
+ * @param field the PPDU field
+ * @returns a reference to the stream
  */
 inline std::ostream&
 operator<<(std::ostream& os, const WifiPpduField& field)
@@ -371,7 +371,7 @@
 }
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * The type of PPDU (SU, DL MU, or UL MU)
  */
 enum WifiPpduType
@@ -382,11 +382,11 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the stream
- * \param type the PPDU type
- * \returns a reference to the stream
+ * @param os the stream
+ * @param type the PPDU type
+ * @returns a reference to the stream
  */
 inline std::ostream&
 operator<<(std::ostream& os, const WifiPpduType& type)
@@ -406,7 +406,7 @@
 }
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * Enumeration of the possible reception failure reasons.
  */
 enum WifiPhyRxfailureReason
@@ -439,11 +439,11 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the stream
- * \param reason the failure reason
- * \returns a reference to the stream
+ * @param os the stream
+ * @param reason the failure reason
+ * @returns a reference to the stream
  */
 inline std::ostream&
 operator<<(std::ostream& os, const WifiPhyRxfailureReason& reason)
@@ -506,7 +506,7 @@
 }
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * Enumeration of the possible channel-list parameter elements
  * defined in Table 8-5 of IEEE 802.11-2016.
  */
@@ -519,11 +519,11 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the stream
- * \param type the wifi channel list type
- * \returns a reference to the stream
+ * @param os the stream
+ * @param type the wifi channel list type
+ * @returns a reference to the stream
  */
 inline std::ostream&
 operator<<(std::ostream& os, WifiChannelListType type)
@@ -545,11 +545,11 @@
 }
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the stream
- * \param width the wifi channel width type
- * \returns a reference to the stream
+ * @param os the stream
+ * @param width the wifi channel width type
+ * @returns a reference to the stream
  */
 inline std::ostream&
 operator<<(std::ostream& os, WifiChannelWidthType width)
@@ -583,40 +583,41 @@
 /**
  * Get the guard interval for a given WifiMode.
  *
- * \param mode the WifiMode
- * \param device pointer to the WifiNetDevice object
+ * @param mode the WifiMode
+ * @param device pointer to the WifiNetDevice object
  *
- * \return the guard interval duration to use for the mode
+ * @return the guard interval duration to use for the mode
  */
 Time GetGuardIntervalForMode(WifiMode mode, const Ptr<WifiNetDevice> device);
 
 /**
  * Get the guard interval for a given WifiMode.
  *
- * \param mode the WifiMode
- * \param htShortGuardInterval whether HT/VHT short guard interval is enabled
- * \param heGuardInterval the HE guard interval duration
+ * @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 to use for the mode
+ * @return the guard interval duration to use for the mode
  */
 Time GetGuardIntervalForMode(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
+ * @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
+ * @return the preamble to be used for the transmission
  */
-WifiPreamble GetPreambleForTransmission(WifiModulationClass modulation, bool useShortPreamble);
+WifiPreamble GetPreambleForTransmission(WifiModulationClass modulation,
+                                        bool useShortPreamble = false);
 
 /**
  * Return the modulation class corresponding to the given preamble type.
  * Only preamble types used by HT/VHT/HE/EHT can be passed to this function.
  *
- * \param preamble the given preamble type (must be one defined by HT standard or later)
- * \return the modulation class corresponding to the given preamble type
+ * @param preamble the given preamble type (must be one defined by HT standard or later)
+ * @return the modulation class corresponding to the given preamble type
  */
 WifiModulationClass GetModulationClassForPreamble(WifiPreamble preamble);
 
@@ -624,10 +625,10 @@
  * 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
+ * @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
+ * @return true if the modulation class of the selected mode for the
  * control answer frame is allowed, false otherwise
  */
 bool IsAllowedControlAnswerModulationClass(WifiModulationClass modClassReq,
@@ -638,33 +639,33 @@
  * the PHY layers defining the aPPDUMaxTime characteristic (HT, VHT and HE).
  * Return zero otherwise.
  *
- * \param preamble the preamble type
+ * @param preamble the preamble type
  *
- * \return the maximum PPDU duration, if defined, and zero otherwise
+ * @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
+ * @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
+ * @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
+ * @param preamble the preamble
+ * @return true if the provided preamble corresponds to a uplink multi-user transmission
  */
 bool IsUlMu(WifiPreamble preamble);
 
@@ -675,32 +676,32 @@
  * (WIFI_MOD_CLASS_DSSS and WIFI_MOD_CLASS_HR_DSSS); this method will return
  * the latter.
  *
- * \param standard the standard
- * \return the modulation class corresponding to the standard
+ * @param standard the standard
+ * @return the modulation class corresponding to the standard
  */
 WifiModulationClass GetModulationClassForStandard(WifiStandard standard);
 
 /**
  * Get the maximum channel width allowed for the given modulation class.
  *
- * \param modulation the modulation class
- * \return the maximum channel width allowed for the given modulation class
+ * @param modulation the modulation class
+ * @return the maximum channel width allowed for the given modulation class
  */
 MHz_u GetMaximumChannelWidth(WifiModulationClass modulation);
 
 /**
  * Get the total channel width for the channel width type.
  *
- * \param width the channel width type
- * \return the total channel width for the channel width type
+ * @param width the channel width type
+ * @return the total channel width for the channel width type
  */
 MHz_u GetChannelWidthInMhz(WifiChannelWidthType width);
 
 /**
  * Return true if a preamble corresponds to an EHT transmission.
  *
- * \param preamble the preamble
- * \return true if the provided preamble corresponds to an EHT transmission
+ * @param preamble the preamble
+ * @return true if the provided preamble corresponds to an EHT transmission
  */
 bool IsEht(WifiPreamble preamble);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-phy.h ns-3.44/src/wifi/model/wifi-phy.h
--- ns-3.43/src/wifi/model/wifi-phy.h	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/model/wifi-phy.h	2025-03-09 16:55:49.803372600 -0700
@@ -47,8 +47,8 @@
 class WifiMacHeader;
 
 /**
- * \brief 802.11 PHY layer model
- * \ingroup wifi
+ * @brief 802.11 PHY layer model
+ * @ingroup wifi
  *
  */
 class WifiPhy : public Object
@@ -56,8 +56,8 @@
   public:
     friend class PhyEntity;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -67,30 +67,30 @@
     /**
      * Return the WifiPhyStateHelper of this PHY
      *
-     * \return the WifiPhyStateHelper of this PHY
+     * @return the WifiPhyStateHelper of this PHY
      */
     Ptr<WifiPhyStateHelper> GetState() const;
 
     /**
-     * \param callback the callback to invoke
+     * @param callback the callback to invoke
      *        upon successful packet reception.
      */
     void SetReceiveOkCallback(RxOkCallback callback);
     /**
-     * \param callback the callback to invoke
+     * @param callback the callback to invoke
      *        upon erroneous packet reception.
      */
     void SetReceiveErrorCallback(RxErrorCallback callback);
 
     /**
-     * \param listener the new listener
+     * @param listener the new listener
      *
      * Add the input listener to the list of objects to be notified of
      * PHY-level events. The input listener is notified of CCA busy information.
      */
     void RegisterListener(const std::shared_ptr<WifiPhyListener>& listener);
     /**
-     * \param listener the listener to be unregistered
+     * @param listener the listener to be unregistered
      *
      * Remove the input listener from the list of objects to be notified of
      * PHY-level events.
@@ -98,25 +98,26 @@
     void UnregisterListener(const std::shared_ptr<WifiPhyListener>& listener);
 
     /**
-     * \param callback the callback to invoke when PHY capabilities have changed.
+     * @param callback the callback to invoke when PHY capabilities have changed.
      */
     void SetCapabilitiesChangedCallback(Callback<void> callback);
 
     /**
      * Start receiving the PHY preamble of a PPDU (i.e. the first bit of the preamble has arrived).
      *
-     * \param ppdu the arriving PPDU
-     * \param rxPowersW the receive power in W per band
-     * \param rxDuration the duration of the PPDU
+     * @param ppdu the arriving PPDU
+     * @param rxPowersW the receive power in W per band
+     * @param rxDuration the duration of the PPDU
      */
     void StartReceivePreamble(Ptr<const WifiPpdu> ppdu,
                               RxPowerWattPerChannelBand& rxPowersW,
                               Time rxDuration);
 
     /**
-     * \return whether the PHY is busy decoding the PHY header fields of a PPDU
+     * @return if the PHY is busy decoding the PHY header fields of a PPDU, return the TXVECTOR
+     *         used to transmit the PPDU; otherwise, return a null optional value
      */
-    bool IsReceivingPhyHeader() const;
+    std::optional<std::reference_wrapper<const WifiTxVector>> GetInfoIfRxingPhyHeader() const;
 
     /**
      * For HE receptions only, check and possibly modify the transmit power restriction state at
@@ -129,9 +130,9 @@
      * The STA-ID value is properly determined based on whether the given PSDU has
      * to be transmitted as a DL or UL frame.
      *
-     * \param psdu the given PSDU
-     * \param txVector the TXVECTOR to use to send the PSDU
-     * \return a WifiConstPsduMap built from the given PSDU and the given TXVECTOR
+     * @param psdu the given PSDU
+     * @param txVector the TXVECTOR to use to send the PSDU
+     * @return a WifiConstPsduMap built from the given PSDU and the given TXVECTOR
      */
     static WifiConstPsduMap GetWifiConstPsduMap(Ptr<const WifiPsdu> psdu,
                                                 const WifiTxVector& txVector);
@@ -142,16 +143,16 @@
      * along with a STA-ID value that is determined based on whether the given PSDU has
      * to be transmitted as a DL or UL frame.
      *
-     * \param psdu the PSDU to send (in a SU PPDU)
-     * \param txVector the TXVECTOR that has TX parameters such as mode, the transmission mode to
+     * @param psdu the PSDU to send (in a SU PPDU)
+     * @param txVector the TXVECTOR that has TX parameters such as mode, the transmission mode to
      * use to send this PSDU, and txPowerLevel, a power level to use to send the whole PPDU. The
      * real transmission power is calculated as txPowerMin + txPowerLevel * (txPowerMax -
      * txPowerMin) / nTxLevels
      */
     void Send(Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector);
     /**
-     * \param psdus the PSDUs to send
-     * \param txVector the TXVECTOR that has tx parameters such as mode, the transmission mode to
+     * @param psdus the PSDUs to send
+     * @param txVector the TXVECTOR that has tx parameters such as mode, the transmission mode to
      * use to send this PSDU, and txPowerLevel, a power level to use to send the whole PPDU. The
      * real transmission power is calculated as txPowerMin + txPowerLevel * (txPowerMax -
      * txPowerMin) / nTxLevels
@@ -159,14 +160,16 @@
     void Send(const WifiConstPsduMap& psdus, const WifiTxVector& txVector);
 
     /**
-     * \param ppdu the PPDU to send
+     * @param ppdu the PPDU to send
      */
     virtual void StartTx(Ptr<const WifiPpdu> ppdu) = 0;
 
     /**
      * Put in sleep mode.
+     *
+     * @param forceSleepWhileInRx force setting sleep mode if state is RX
      */
-    void SetSleepMode();
+    void SetSleepMode(bool forceSleepWhileInRx = false);
     /**
      * Resume from sleep mode.
      */
@@ -181,36 +184,36 @@
     void ResumeFromOff();
 
     /**
-     * \return true of the current state of the PHY layer is WifiPhy::IDLE, false otherwise.
+     * @return true of the current state of the PHY layer is WifiPhy::IDLE, false otherwise.
      */
     bool IsStateIdle() const;
     /**
-     * \return true of the current state of the PHY layer is WifiPhy::CCA_BUSY, false otherwise.
+     * @return true of the current state of the PHY layer is WifiPhy::CCA_BUSY, false otherwise.
      */
     bool IsStateCcaBusy() const;
     /**
-     * \return true of the current state of the PHY layer is WifiPhy::RX, false otherwise.
+     * @return true of the current state of the PHY layer is WifiPhy::RX, false otherwise.
      */
     bool IsStateRx() const;
     /**
-     * \return true of the current state of the PHY layer is WifiPhy::TX, false otherwise.
+     * @return true of the current state of the PHY layer is WifiPhy::TX, false otherwise.
      */
     bool IsStateTx() const;
     /**
-     * \return true of the current state of the PHY layer is WifiPhy::SWITCHING, false otherwise.
+     * @return true of the current state of the PHY layer is WifiPhy::SWITCHING, false otherwise.
      */
     bool IsStateSwitching() const;
     /**
-     * \return true if the current state of the PHY layer is WifiPhy::SLEEP, false otherwise.
+     * @return true if the current state of the PHY layer is WifiPhy::SLEEP, false otherwise.
      */
     bool IsStateSleep() const;
     /**
-     * \return true if the current state of the PHY layer is WifiPhy::OFF, false otherwise.
+     * @return true if the current state of the PHY layer is WifiPhy::OFF, false otherwise.
      */
     bool IsStateOff() const;
 
     /**
-     * \return the predicted delay until this PHY can become WifiPhy::IDLE.
+     * @return the predicted delay until this PHY can become WifiPhy::IDLE.
      *
      * The PHY will never become WifiPhy::IDLE _before_ the delay returned by
      * this method but it could become really idle later.
@@ -220,23 +223,23 @@
     /**
      * Return the start time of the last received packet.
      *
-     * \return the start time of the last received packet
+     * @return the start time of the last received packet
      */
     Time GetLastRxStartTime() const;
     /**
      * Return the end time of the last received packet.
      *
-     * \return the end time of the last received packet
+     * @return the end time of the last received packet
      */
     Time GetLastRxEndTime() const;
 
     /**
-     * \param size the number of bytes in the packet to send
-     * \param txVector the TXVECTOR used for the transmission of this packet
-     * \param band the frequency band being used
-     * \param staId the STA-ID of the recipient (only used for MU)
+     * @param size the number of bytes in the packet to send
+     * @param txVector the TXVECTOR used for the transmission of this packet
+     * @param band the frequency band being used
+     * @param staId the STA-ID of the recipient (only used for MU)
      *
-     * \return the total amount of time this PHY will stay busy for the transmission of these bytes.
+     * @return the total amount of time this PHY will stay busy for the transmission of these bytes.
      */
     static Time CalculateTxDuration(uint32_t size,
                                     const WifiTxVector& txVector,
@@ -250,46 +253,46 @@
      * properly calculate the TX duration in case the PSDU has to be transmitted as
      * an UL frame.
      *
-     * \param psdu the PSDU to transmit
-     * \param txVector the TXVECTOR used for the transmission of the PSDU
-     * \param band the frequency band
+     * @param psdu the PSDU to transmit
+     * @param txVector the TXVECTOR used for the transmission of the PSDU
+     * @param band the frequency band
      *
-     * \return the total amount of time this PHY will stay busy for the transmission of the PPDU
+     * @return the total amount of time this PHY will stay busy for the transmission of the PPDU
      */
     static Time CalculateTxDuration(Ptr<const WifiPsdu> psdu,
                                     const WifiTxVector& txVector,
                                     WifiPhyBand band);
     /**
-     * \param psduMap the PSDU(s) to transmit indexed by STA-ID
-     * \param txVector the TXVECTOR used for the transmission of the PPDU
-     * \param band the frequency band being used
+     * @param psduMap the PSDU(s) to transmit indexed by STA-ID
+     * @param txVector the TXVECTOR used for the transmission of the PPDU
+     * @param band the frequency band being used
      *
-     * \return the total amount of time this PHY will stay busy for the transmission of the PPDU
+     * @return the total amount of time this PHY will stay busy for the transmission of the PPDU
      */
     static Time CalculateTxDuration(const WifiConstPsduMap& psduMap,
                                     const WifiTxVector& txVector,
                                     WifiPhyBand band);
 
     /**
-     * \param txVector the transmission parameters used for this packet
+     * @param txVector the transmission parameters used for this packet
      *
-     * \return the total amount of time this PHY will stay busy for the transmission of the PHY
+     * @return the total amount of time this PHY will stay busy for the transmission of the PHY
      * preamble and PHY header.
      */
     static Time CalculatePhyPreambleAndHeaderDuration(const WifiTxVector& txVector);
     /**
-     * \return the preamble detection duration, which is the time correlation needs to detect the
+     * @return the preamble detection duration, which is the time correlation needs to detect the
      * start of an incoming frame.
      */
     static Time GetPreambleDetectionDuration();
     /**
-     * \param size the number of bytes in the packet to send
-     * \param txVector the TXVECTOR used for the transmission of this packet
-     * \param band the frequency band
-     * \param mpdutype the type of the MPDU as defined in WifiPhy::MpduType.
-     * \param staId the STA-ID of the PSDU (only used for MU PPDUs)
+     * @param size the number of bytes in the packet to send
+     * @param txVector the TXVECTOR used for the transmission of this packet
+     * @param band the frequency band
+     * @param mpdutype the type of the MPDU as defined in WifiPhy::MpduType.
+     * @param staId the STA-ID of the PSDU (only used for MU PPDUs)
      *
-     * \return the duration of the PSDU
+     * @return the duration of the PSDU
      */
     static Time GetPayloadDuration(uint32_t size,
                                    const WifiTxVector& txVector,
@@ -297,21 +300,21 @@
                                    MpduType mpdutype = NORMAL_MPDU,
                                    uint16_t staId = SU_STA_ID);
     /**
-     * \param size the number of bytes in the packet to send
-     * \param txVector the TXVECTOR used for the transmission of this packet
-     * \param band the frequency band
-     * \param mpdutype the type of the MPDU as defined in WifiPhy::MpduType.
-     * \param incFlag this flag is used to indicate that the variables need to be update or not
+     * @param size the number of bytes in the packet to send
+     * @param txVector the TXVECTOR used for the transmission of this packet
+     * @param band the frequency band
+     * @param mpdutype the type of the MPDU as defined in WifiPhy::MpduType.
+     * @param incFlag this flag is used to indicate that the variables need to be update or not
      * This function is called a couple of times for the same packet so variables should not be
      * increased each time.
-     * \param totalAmpduSize the total size of the previously transmitted MPDUs for the concerned
+     * @param totalAmpduSize the total size of the previously transmitted MPDUs for the concerned
      * A-MPDU. If incFlag is set, this parameter will be updated.
-     * \param totalAmpduNumSymbols the number of symbols previously transmitted for the MPDUs in the
+     * @param totalAmpduNumSymbols the number of symbols previously transmitted for the MPDUs in the
      * concerned A-MPDU, used for the computation of the number of symbols needed for the last MPDU.
      * If incFlag is set, this parameter will be updated.
-     * \param staId the STA-ID of the PSDU (only used for MU PPDUs)
+     * @param staId the STA-ID of the PSDU (only used for MU PPDUs)
      *
-     * \return the duration of the PSDU
+     * @return the duration of the PSDU
      */
     static Time GetPayloadDuration(uint32_t size,
                                    const WifiTxVector& txVector,
@@ -322,9 +325,9 @@
                                    double& totalAmpduNumSymbols,
                                    uint16_t staId);
     /**
-     * \param txVector the transmission parameters used for this packet
+     * @param txVector the transmission parameters used for this packet
      *
-     * \return the duration until the start of the packet
+     * @return the duration until the start of the packet
      */
     static Time GetStartOfPacketDuration(const WifiTxVector& txVector);
 
@@ -340,25 +343,25 @@
      * WifiRemoteStationManager), which itself is a superset (again, not
      * necessarily proper) of the BSSBasicRateSet.
      *
-     * \return the list of supported (non-MCS) modes.
+     * @return the list of supported (non-MCS) modes.
      */
     std::list<WifiMode> GetModeList() const;
     /**
      * Get the list of supported (non-MCS) modes for the given modulation class (i.e.
      * corresponding to a given PHY entity).
      *
-     * \param modulation the modulation class
-     * \return the list of supported (non-MCS) modes for the given modulation class.
+     * @param modulation the modulation class
+     * @return the list of supported (non-MCS) modes for the given modulation class.
      *
-     * \see GetModeList ()
+     * @see GetModeList ()
      */
     std::list<WifiMode> GetModeList(WifiModulationClass modulation) const;
     /**
      * Check if the given WifiMode is supported by the PHY.
      *
-     * \param mode the wifi mode to check
+     * @param mode the wifi mode to check
      *
-     * \return true if the given mode is supported,
+     * @return true if the given mode is supported,
      *         false otherwise
      */
     bool IsModeSupported(WifiMode mode) const;
@@ -367,25 +370,25 @@
      * This is the first mode to be added (i.e. the lowest one
      * over all supported PHY entities).
      *
-     * \return the default WifiMode
+     * @return the default WifiMode
      */
     WifiMode GetDefaultMode() const;
     /**
      * Check if the given MCS of the given modulation class is supported by the PHY.
      *
-     * \param modulation the modulation class
-     * \param mcs the MCS value
+     * @param modulation the modulation class
+     * @param mcs the MCS value
      *
-     * \return true if the given mode is supported,
+     * @return true if the given mode is supported,
      *         false otherwise
      */
     bool IsMcsSupported(WifiModulationClass modulation, uint8_t mcs) const;
 
     /**
-     * \param txVector the transmission vector
-     * \param ber the probability of bit error rate
+     * @param txVector the transmission vector
+     * @param ber the probability of bit error rate
      *
-     * \return the minimum SNR which is required to achieve
+     * @return the minimum SNR which is required to achieve
      *          the requested BER for the specified transmission vector. (W/W)
      */
     double CalculateSnr(const WifiTxVector& txVector, double ber) const;
@@ -393,57 +396,57 @@
     /**
      * Set the Short Interframe Space (SIFS) for this PHY.
      *
-     * \param sifs the SIFS duration
+     * @param sifs the SIFS duration
      */
     void SetSifs(Time sifs);
     /**
      * Return the Short Interframe Space (SIFS) for this PHY.
      *
-     * \return the SIFS duration
+     * @return the SIFS duration
      */
     Time GetSifs() const;
     /**
      * Set the slot duration for this PHY.
      *
-     * \param slot the slot duration
+     * @param slot the slot duration
      */
     void SetSlot(Time slot);
     /**
      * Return the slot duration for this PHY.
      *
-     * \return the slot duration
+     * @return the slot duration
      */
     Time GetSlot() const;
     /**
      * Set the PCF Interframe Space (PIFS) for this PHY.
      *
-     * \param pifs the PIFS duration
+     * @param pifs the PIFS duration
      */
     void SetPifs(Time pifs);
     /**
      * Return the PCF Interframe Space (PIFS) for this PHY.
      *
-     * \return the PIFS duration
+     * @return the PIFS duration
      */
     Time GetPifs() const;
     /**
      * Return the estimated Ack TX time for this PHY.
      *
-     * \return the estimated Ack TX time
+     * @return the estimated Ack TX time
      */
     Time GetAckTxTime() const;
     /**
      * Return the estimated BlockAck TX time for this PHY.
      *
-     * \return the estimated BlockAck TX time
+     * @return the estimated BlockAck TX time
      */
     Time GetBlockAckTxTime() const;
 
     /**
      * Get the maximum PSDU size in bytes for the given modulation class.
      *
-     * \param modulation the modulation class
-     * \return the maximum PSDU size in bytes for the given modulation class
+     * @param modulation the modulation class
+     * @return the maximum PSDU size in bytes for the given modulation class
      */
     static uint32_t GetMaxPsduSize(WifiModulationClass modulation);
 
@@ -455,13 +458,13 @@
      * BssMembershipSelectorSet, and which is stored inside HT PHY (and above)
      * instances.
      *
-     * \return the list of BSS membership selectors.
+     * @return the list of BSS membership selectors.
      */
     std::list<uint8_t> GetBssMembershipSelectorList() const;
     /**
-     * \return the number of supported MCSs.
+     * @return the number of supported MCSs.
      *
-     * \see GetMcsList ()
+     * @see GetMcsList ()
      */
     uint16_t GetNMcs() const;
     /**
@@ -470,27 +473,27 @@
      * transmission/reception MCS indices that this WifiPhy(-derived class)
      * can support - a set of MCS indices which is stored by each HT PHY (and above).
      *
-     * \return the list of supported MCSs.
+     * @return the list of supported MCSs.
      */
     std::list<WifiMode> GetMcsList() const;
     /**
      * Get the list of supported MCSs for the given modulation class (i.e.
      * corresponding to a given PHY entity).
      *
-     * \param modulation the modulation class
-     * \return the list of supported MCSs for the given modulation class.
+     * @param modulation the modulation class
+     * @return the list of supported MCSs for the given modulation class.
      *
-     * \see GetMcsList ()
+     * @see GetMcsList ()
      */
     std::list<WifiMode> GetMcsList(WifiModulationClass modulation) const;
     /**
      * Get the WifiMode object corresponding to the given MCS of the given
      * modulation class.
      *
-     * \param modulation the modulation class
-     * \param mcs the MCS value
+     * @param modulation the modulation class
+     * @param mcs the MCS value
      *
-     * \return the WifiMode object corresponding to the given MCS of the given
+     * @return the WifiMode object corresponding to the given MCS of the given
      *         modulation class
      */
     WifiMode GetMcs(WifiModulationClass modulation, uint8_t mcs) const;
@@ -498,11 +501,11 @@
     /**
      * Return current channel number.
      *
-     * \return the current channel number
+     * @return the current channel number
      */
     uint8_t GetChannelNumber() const;
     /**
-     * \return the required time for channel switch operation of this WifiPhy
+     * @return the required time for channel switch operation of this WifiPhy
      */
     Time GetChannelSwitchDelay() const;
 
@@ -511,7 +514,7 @@
      * Note that, in case a Spectrum PHY is used, this method must be called after adding
      * a spectrum channel covering the operating channel bandwidth.
      *
-     * \param standard the Wi-Fi standard
+     * @param standard the Wi-Fi standard
      */
     virtual void ConfigureStandard(WifiStandard standard);
 
@@ -520,40 +523,40 @@
      * The maximum modulation class supported will be the minimum between the given modulation
      * class and the maximum modulation class supported based on the configured standard.
      *
-     * \param modClass the given modulation class
+     * @param modClass the given modulation class
      */
     void SetMaxModulationClassSupported(WifiModulationClass modClass);
 
     /**
-     * \return the maximum modulation class that has to be supported by this PHY object.
+     * @return the maximum modulation class that has to be supported by this PHY object.
      */
     WifiModulationClass GetMaxModulationClassSupported() const;
 
     /**
      * Get the configured Wi-Fi standard
      *
-     * \return the Wi-Fi standard that has been configured
+     * @return the Wi-Fi standard that has been configured
      */
     WifiStandard GetStandard() const;
 
     /**
      * Get the configured Wi-Fi band
      *
-     * \return the Wi-Fi band that has been configured
+     * @return the Wi-Fi band that has been configured
      */
     WifiPhyBand GetPhyBand() const;
 
     /**
      * Get a const reference to the operating channel
      *
-     * \return a const reference to the operating channel
+     * @return a const reference to the operating channel
      */
     const WifiPhyOperatingChannel& GetOperatingChannel() const;
 
     /**
      * Return the Channel this WifiPhy is connected to.
      *
-     * \return the Channel this WifiPhy is connected to
+     * @return the Channel this WifiPhy is connected to
      */
     virtual Ptr<Channel> GetChannel() const = 0;
 
@@ -561,50 +564,50 @@
      * Public method used to fire a PhyTxBegin trace.
      * Implemented for encapsulation purposes.
      *
-     * \param psdus the PSDUs being transmitted (only one unless DL MU transmission)
-     * \param txPower the transmit power
+     * @param psdus the PSDUs being transmitted (only one unless DL MU transmission)
+     * @param txPower the transmit power
      */
     void NotifyTxBegin(const WifiConstPsduMap& psdus, Watt_u txPower);
     /**
      * Public method used to fire a PhyTxEnd trace.
      * Implemented for encapsulation purposes.
      *
-     * \param psdus the PSDUs being transmitted (only one unless DL MU transmission)
+     * @param psdus the PSDUs being transmitted (only one unless DL MU transmission)
      */
     void NotifyTxEnd(const WifiConstPsduMap& psdus);
     /**
      * Public method used to fire a PhyTxDrop trace.
      * Implemented for encapsulation purposes.
      *
-     * \param psdu the PSDU being transmitted
+     * @param psdu the PSDU being transmitted
      */
     void NotifyTxDrop(Ptr<const WifiPsdu> psdu);
     /**
      * Public method used to fire a PhyRxBegin trace.
      * Implemented for encapsulation purposes.
      *
-     * \param psdu the PSDU being transmitted
-     * \param rxPowersW the receive power per channel band in Watts
+     * @param psdu the PSDU being transmitted
+     * @param rxPowersW the receive power per channel band in Watts
      */
     void NotifyRxBegin(Ptr<const WifiPsdu> psdu, const RxPowerWattPerChannelBand& rxPowersW);
     /**
      * Public method used to fire a PhyRxEnd trace.
      * Implemented for encapsulation purposes.
      *
-     * \param psdu the PSDU being transmitted
+     * @param psdu the PSDU being transmitted
      */
     void NotifyRxEnd(Ptr<const WifiPsdu> psdu);
     /**
      * Public method used to fire a PhyRxDrop trace.
      * Implemented for encapsulation purposes.
      *
-     * \note This method is called also by NotifyRxPpduDrop and is left
+     * @note This method is called also by NotifyRxPpduDrop and is left
      * in the public API for backward compatibility reasons.  Do not
      * call both this method and the newer NotifyRxPpduDrop().  Instead,
      * call NotifyRxPpduDrop() and it will call this method also.
      *
-     * \param psdu the PSDU being transmitted
-     * \param reason the reason the packet was dropped
+     * @param psdu the PSDU being transmitted
+     * @param reason the reason the packet was dropped
      */
     void NotifyRxDrop(Ptr<const WifiPsdu> psdu, WifiPhyRxfailureReason reason);
 
@@ -613,8 +616,8 @@
      * Implemented for encapsulation purposes.  This method also
      * calls the PhyRxDrop trace.
      *
-     * \param ppdu the PSDU being transmitted
-     * \param reason the reason the packet was dropped
+     * @param ppdu the PSDU being transmitted
+     * @param reason the reason the packet was dropped
      */
     void NotifyRxPpduDrop(Ptr<const WifiPpdu> ppdu, WifiPhyRxfailureReason reason);
     /**
@@ -624,43 +627,43 @@
      * The A-MPDU reference number (RX side) is set within the method. It must be a different value
      * for each A-MPDU but the same for each subframe within one A-MPDU.
      *
-     * \param psdu the PSDU being received
-     * \param channelFreq the frequency at which the packet is received. Note that in real devices
+     * @param psdu the PSDU being received
+     * @param channelFreq the frequency at which the packet is received. Note that in real devices
      * this is normally the frequency to which the receiver is tuned, and this can be different than
      * the frequency at which the packet was originally transmitted. This is because it is possible
      * to have the receiver tuned on a given channel and still to be able to receive packets on a
      * nearby channel.
-     * \param txVector the TXVECTOR that holds RX parameters
-     * \param signalNoise signal power and noise power in dBm (noise power includes the noise
+     * @param txVector the TXVECTOR that holds RX parameters
+     * @param signalNoise signal power and noise power in dBm (noise power includes the noise
      * figure)
-     * \param statusPerMpdu reception status per MPDU
-     * \param staId the STA-ID
+     * @param statusPerMpdu reception status per MPDU
+     * @param staId the STA-ID
      */
     void NotifyMonitorSniffRx(Ptr<const WifiPsdu> psdu,
                               MHz_u channelFreq,
-                              WifiTxVector txVector,
+                              const WifiTxVector& txVector,
                               SignalNoiseDbm signalNoise,
-                              std::vector<bool> statusPerMpdu,
+                              const std::vector<bool>& statusPerMpdu,
                               uint16_t staId = SU_STA_ID);
 
     /**
      * TracedCallback signature for monitor mode receive events.
      *
      *
-     * \param packet the packet being received
-     * \param channelFreq the frequency at which the packet is received. Note that in real devices
+     * @param packet the packet being received
+     * @param channelFreq the frequency at which the packet is received. Note that in real devices
      * this is normally the frequency to which  the receiver is tuned, and this can be different
      * than the frequency at which the packet was originally transmitted. This is because it is
      * possible to have the receiver tuned on a given channel and still to be able to receive
      * packets on a nearby channel.
-     * \param txVector the TXVECTOR that holds RX parameters
-     * \param aMpdu the type of the packet (0 is not A-MPDU, 1 is a MPDU that is part of an A-MPDU
+     * @param txVector the TXVECTOR that holds RX parameters
+     * @param aMpdu the type of the packet (0 is not A-MPDU, 1 is a MPDU that is part of an A-MPDU
      * and 2 is the last MPDU in an A-MPDU) and the A-MPDU reference number (must be a different
      * value for each A-MPDU but the same for each subframe within one A-MPDU)
-     * \param signalNoise signal power and noise power in dBm
-     * \param staId the STA-ID
+     * @param signalNoise signal power and noise power in dBm
+     * @param staId the STA-ID
      *
-     * \todo WifiTxVector should be passed by const reference because of its size.
+     * @todo WifiTxVector should be passed by const reference because of its size.
      */
     typedef void (*MonitorSnifferRxCallback)(Ptr<const Packet> packet,
                                              uint16_t channelFreqMhz,
@@ -676,30 +679,30 @@
      * The A-MPDU reference number (RX side) is set within the method. It must be a different value
      * for each A-MPDU but the same for each subframe within one A-MPDU.
      *
-     * \param psdu the PSDU being received
-     * \param channelFreq the frequency at which the packet is
+     * @param psdu the PSDU being received
+     * @param channelFreq the frequency at which the packet is
      *        transmitted.
-     * \param txVector the TXVECTOR that holds TX parameters
-     * \param staId the STA-ID
+     * @param txVector the TXVECTOR that holds TX parameters
+     * @param staId the STA-ID
      */
     void NotifyMonitorSniffTx(Ptr<const WifiPsdu> psdu,
                               MHz_u channelFreq,
-                              WifiTxVector txVector,
+                              const WifiTxVector& txVector,
                               uint16_t staId = SU_STA_ID);
 
     /**
      * TracedCallback signature for monitor mode transmit events.
      *
-     * \param packet the packet being transmitted
-     * \param channelFreqMhz the frequency in MHz at which the packet is
+     * @param packet the packet being transmitted
+     * @param channelFreqMhz the frequency in MHz at which the packet is
      *        transmitted.
-     * \param txVector the TXVECTOR that holds TX parameters
-     * \param aMpdu the type of the packet (0 is not A-MPDU, 1 is a MPDU that is part of an A-MPDU
+     * @param txVector the TXVECTOR that holds TX parameters
+     * @param aMpdu the type of the packet (0 is not A-MPDU, 1 is a MPDU that is part of an A-MPDU
      * and 2 is the last MPDU in an A-MPDU) and the A-MPDU reference number (must be a different
      * value for each A-MPDU but the same for each subframe within one A-MPDU)
-     * \param staId the STA-ID
+     * @param staId the STA-ID
      *
-     * \todo WifiTxVector should be passed by const reference because of its size.
+     * @todo WifiTxVector should be passed by const reference because of its size.
      */
     typedef void (*MonitorSnifferTxCallback)(const Ptr<const Packet> packet,
                                              uint16_t channelFreqMhz,
@@ -710,27 +713,27 @@
     /**
      * TracedCallback signature for Phy transmit events.
      *
-     * \param packet the packet being transmitted
-     * \param txPowerW the transmit power in Watts
+     * @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
-     * \param txVector the TXVECTOR holding the TX parameters
-     * \param txPowerW the transmit power in Watts
+     * @param psduMap the PSDU map being transmitted
+     * @param txVector the TXVECTOR holding the TX parameters
+     * @param txPowerW the transmit power in Watts
      */
     typedef void (*PsduTxBeginCallback)(WifiConstPsduMap psduMap,
-                                        WifiTxVector txVector,
+                                        const 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
+     * @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);
@@ -738,26 +741,35 @@
     /**
      * TracedCallback signature for start of PSDU reception events.
      *
-     * \param txVector the TXVECTOR decoded from the PHY header
-     * \param psduDuration the duration of the PSDU
+     * @param txVector the TXVECTOR decoded from the PHY header
+     * @param psduDuration the duration of the PSDU
      */
     typedef void (*PhyRxPayloadBeginTracedCallback)(WifiTxVector txVector, Time psduDuration);
 
     /**
-     * TracedCallback signature for start of PSDU reception events.
+     * TracedCallback signature for PhyRxPpduDrop trace source.
      *
-     * \param txVector the TXVECTOR decoded from the PHY header
-     * \param psduDuration the duration of the PSDU
+     * @param ppdu the ppdu being received
+     * @param reason the reason the ppdu was dropped
      */
     typedef void (*PhyRxPpduDropTracedCallback)(Ptr<const WifiPpdu> ppdu,
                                                 WifiPhyRxfailureReason reason);
 
     /**
+     * TracedCallback signature for PhyRxDrop trace source.
+     *
+     * @param packet the packet being received
+     * @param reason the reason the packet was dropped
+     */
+    typedef void (*PhyRxDropTracedCallback)(Ptr<const Packet> packet,
+                                            WifiPhyRxfailureReason reason);
+
+    /**
      * TracedCallback signature for end of MAC header reception events.
      *
-     * \param macHdr the MAC header of the MPDU being received
-     * \param txVector the TXVECTOR used to transmit the PSDU
-     * \param psduDuration the remaining duration of the PSDU
+     * @param macHdr the MAC header of the MPDU being received
+     * @param txVector the TXVECTOR used to transmit the PSDU
+     * @param psduDuration the remaining duration of the PSDU
      */
     typedef void (*PhyRxMacHeaderEndTracedCallback)(const WifiMacHeader& macHdr,
                                                     const WifiTxVector& txVector,
@@ -768,8 +780,8 @@
      * used by this model. Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     virtual int64_t AssignStreams(int64_t stream);
 
@@ -778,69 +790,69 @@
      * The energy of a received signal should be higher than
      * this threshold to allow the PHY layer to detect the signal.
      *
-     * \param threshold the receive sensitivity threshold
+     * @param threshold the receive sensitivity threshold
      */
     void SetRxSensitivity(dBm_u threshold);
     /**
      * Return the receive sensitivity threshold.
      *
-     * \return the receive sensitivity threshold
+     * @return the receive sensitivity threshold
      */
     dBm_u GetRxSensitivity() const;
     /**
      * Sets the CCA energy detection threshold. The energy of a all received signals
      * should be higher than this threshold to allow the PHY layer to declare CCA BUSY state.
      *
-     * \param threshold the CCA threshold
+     * @param threshold the CCA threshold
      */
     void SetCcaEdThreshold(dBm_u threshold);
     /**
      * Return the CCA energy detection threshold.
      *
-     * \return the CCA energy detection threshold
+     * @return the CCA energy detection threshold
      */
     dBm_u GetCcaEdThreshold() const;
     /**
      * Sets the CCA sensitivity threshold. The energy of a received wifi signal
      * should be higher than this threshold to allow the PHY layer to declare CCA BUSY state.
      *
-     * \param threshold the CCA sensitivity threshold
+     * @param threshold the CCA sensitivity threshold
      */
     void SetCcaSensitivityThreshold(dBm_u threshold);
     /**
      * Return the CCA sensitivity threshold.
      *
-     * \return the CCA sensitivity threshold
+     * @return the CCA sensitivity threshold
      */
     dBm_u GetCcaSensitivityThreshold() const;
     /**
      * Sets the RX loss in the Signal-to-Noise-Ratio due to non-idealities in the receiver.
      *
-     * \param noiseFigure noise figure
+     * @param noiseFigure noise figure
      */
     void SetRxNoiseFigure(dB_u noiseFigure);
     /**
      * Sets the minimum available transmission power level.
      *
-     * \param start the minimum transmission power level
+     * @param start the minimum transmission power level
      */
     void SetTxPowerStart(dBm_u start);
     /**
      * Return the minimum available transmission power level.
      *
-     * \return the minimum available transmission power level
+     * @return the minimum available transmission power level
      */
     dBm_u GetTxPowerStart() const;
     /**
      * Sets the maximum available transmission power level.
      *
-     * \param end the maximum transmission power level
+     * @param end the maximum transmission power level
      */
     void SetTxPowerEnd(dBm_u end);
     /**
      * Return the maximum available transmission power level.
      *
-     * \return the maximum available transmission power level
+     * @return the maximum available transmission power level
      */
     dBm_u GetTxPowerEnd() const;
     /**
@@ -848,61 +860,70 @@
      * minimum level and the maximum level. Transmission power levels are
      * equally separated (in dBm) with the minimum and the maximum included.
      *
-     * \param n the number of available levels
+     * @param n the number of available levels
      */
     void SetNTxPower(uint8_t n);
     /**
      * Return the number of available transmission power levels.
      *
-     * \return the number of available transmission power levels
+     * @return the number of available transmission power levels
      */
     uint8_t GetNTxPower() const;
     /**
      * Sets the transmission gain.
      *
-     * \param gain the transmission gain
+     * @param gain the transmission gain
      */
     void SetTxGain(dB_u gain);
     /**
      * Return the transmission gain.
      *
-     * \return the transmission gain
+     * @return the transmission gain
      */
     dB_u GetTxGain() const;
     /**
      * Sets the reception gain.
      *
-     * \param gain the reception gain
+     * @param gain the reception gain
      */
     void SetRxGain(dB_u gain);
     /**
      * Return the reception gain.
      *
-     * \return the reception gain
+     * @return the reception gain
      */
     dB_u GetRxGain() const;
 
     /**
+     * Get the remaining time to the end of the MAC header reception of the next MPDU being
+     * received from the given STA, if any.
+     *
+     * @param staId the STA-ID of the transmitter; equals SU_STA_ID for SU PPDUs
+     * @return the remaining time to the end of the MAC header reception of the next MPDU, if any
+     */
+    std::optional<Time> GetTimeToMacHdrEnd(uint16_t staId) const;
+
+    /**
      * Sets the device this PHY is associated with.
      *
-     * \param device the device this PHY is associated with
+     * @param device the device this PHY is associated with
      */
     virtual void SetDevice(const Ptr<WifiNetDevice> device);
     /**
      * Return the device this PHY is associated with
      *
-     * \return the device this PHY is associated with
+     * @return the device this PHY is associated with
      */
     Ptr<WifiNetDevice> GetDevice() const;
     /**
-     * \brief assign a mobility model to this device
+     * @brief assign a mobility model to this device
      *
      * This method allows a user to specify a mobility model that should be
      * associated with this physical layer.  Calling this method is optional
      * and only necessary if the user wants to override the mobility model
      * that is aggregated to the node.
      *
-     * \param mobility the mobility model this PHY is associated with
+     * @param mobility the mobility model this PHY is associated with
      */
     void SetMobility(const Ptr<MobilityModel> mobility);
     /**
@@ -912,7 +933,7 @@
      * will return the mobility model (if any) that has been aggregated
      * to the node.
      *
-     * \return the mobility model this PHY is associated with
+     * @return the mobility model this PHY is associated with
      */
     Ptr<MobilityModel> GetMobility() const;
 
@@ -936,7 +957,7 @@
      * operating channel bandwidth must have been already added when actually setting
      * the operating channel.
      *
-     * \param channel the given operating channel
+     * @param channel the given operating channel
      */
     void SetOperatingChannel(const WifiPhyOperatingChannel& channel);
 
@@ -944,7 +965,7 @@
      * This overloaded function is used to pass a list of segments
      * from which the operating channel can be deduced.
      *
-     * \param channelSegments the segments identifying the operating channel
+     * @param channelSegments the segments identifying the operating channel
      */
     void SetOperatingChannel(const ChannelSegments& channelSegments);
 
@@ -952,27 +973,27 @@
      * This overloaded function is used when the operating channel
      * consists of a single segment, identified by a tuple.
      *
-     * \param tuple the segment identifying the operating channel
+     * @param tuple the segment identifying the operating channel
      */
     void SetOperatingChannel(const ChannelTuple& tuple);
 
     /**
      * Configure whether it is prohibited to change PHY band after initialization.
      *
-     * \param enable true to prohibit changing PHY band after initialization,
+     * @param enable true to prohibit changing PHY band after initialization,
      *        false otherwise
      */
     void SetFixedPhyBand(bool enable);
     /**
-     * \return whether it is prohibited to change PHY band after initialization
+     * @return whether it is prohibited to change PHY band after initialization
      */
     bool HasFixedPhyBand() const;
     /**
-     * \return the operating center frequency
+     * @return the operating center frequency
      */
     MHz_u GetFrequency() const;
     /**
-     * \return the index of the primary 20 MHz channel
+     * @return the index of the primary 20 MHz channel
      */
     uint8_t GetPrimary20Index() const;
     /**
@@ -980,74 +1001,75 @@
      * using the given WifiMode, subject to the constraint that the TX bandwidth cannot exceed
      * the given maximum allowed value.
      *
-     * \param mode the given WifiMode
-     * \param maxAllowedBandWidth the maximum allowed TX bandwidth
-     * \return the bandwidth for the transmission
+     * @param mode the given WifiMode
+     * @param maxAllowedBandWidth the maximum allowed TX bandwidth
+     * @return the bandwidth for the transmission
      */
     MHz_u GetTxBandwidth(WifiMode mode,
-                         MHz_u maxAllowedBandWidth = std::numeric_limits<MHz_u>::max()) const;
+                         MHz_u maxAllowedBandWidth = MHz_u{
+                             std::numeric_limits<double>::max()}) const;
     /**
-     * \param antennas the number of antennas on this node.
+     * @param antennas the number of antennas on this node.
      */
     void SetNumberOfAntennas(uint8_t antennas);
     /**
-     * \return the number of antennas on this device
+     * @return the number of antennas on this device
      */
     uint8_t GetNumberOfAntennas() const;
     /**
-     * \param streams the maximum number of supported TX spatial streams.
+     * @param streams the maximum number of supported TX spatial streams.
      */
     void SetMaxSupportedTxSpatialStreams(uint8_t streams);
     /**
-     * \return the maximum number of supported TX spatial streams
+     * @return the maximum number of supported TX spatial streams
      */
     uint8_t GetMaxSupportedTxSpatialStreams() const;
     /**
-     * \param streams the maximum number of supported RX spatial streams.
+     * @param streams the maximum number of supported RX spatial streams.
      */
     void SetMaxSupportedRxSpatialStreams(uint8_t streams);
     /**
-     * \return the maximum number of supported RX spatial streams
+     * @return the maximum number of supported RX spatial streams
      */
     uint8_t GetMaxSupportedRxSpatialStreams() const;
     /**
      * Enable or disable short PHY preamble.
      *
-     * \param preamble sets whether short PHY preamble is supported or not
+     * @param preamble sets whether short PHY preamble is supported or not
      */
     void SetShortPhyPreambleSupported(bool preamble);
     /**
      * Return whether short PHY preamble is supported.
      *
-     * \returns if short PHY preamble is supported or not
+     * @returns if short PHY preamble is supported or not
      */
     bool GetShortPhyPreambleSupported() const;
 
     /**
      * Set the index allocated to this PHY
      *
-     * \param phyId the ID allocated to this PHY
+     * @param phyId the ID allocated to this PHY
      */
     void SetPhyId(uint8_t phyId);
 
     /**
      * Get the index allocated to this PHY
      *
-     * \return the ID allocated to this PHY
+     * @return the ID allocated to this PHY
      */
     uint8_t GetPhyId() const;
 
     /**
      * Sets the interference helper.
      *
-     * \param helper the interference helper
+     * @param helper the interference helper
      */
     virtual void SetInterferenceHelper(const Ptr<InterferenceHelper> helper);
 
     /**
      * Sets the error rate model.
      *
-     * \param model the error rate model
+     * @param model the error rate model
      */
     void SetErrorRateModel(const Ptr<ErrorRateModel> model);
     /**
@@ -1059,30 +1081,30 @@
      * is typically used to force specific packet losses or
      * for testing purposes.
      *
-     * \param em Pointer to the ErrorModel.
+     * @param em Pointer to the ErrorModel.
      */
     void SetPostReceptionErrorModel(const Ptr<ErrorModel> em);
     /**
      * Sets the frame capture model.
      *
-     * \param frameCaptureModel the frame capture model
+     * @param frameCaptureModel the frame capture model
      */
     void SetFrameCaptureModel(const Ptr<FrameCaptureModel> frameCaptureModel);
     /**
      * Sets the preamble detection model.
      *
-     * \param preambleDetectionModel the preamble detection model
+     * @param preambleDetectionModel the preamble detection model
      */
     void SetPreambleDetectionModel(const Ptr<PreambleDetectionModel> preambleDetectionModel);
     /**
      * Sets the wifi radio energy model.
      *
-     * \param wifiRadioEnergyModel the wifi radio energy model
+     * @param wifiRadioEnergyModel the wifi radio energy model
      */
     void SetWifiRadioEnergyModel(const Ptr<WifiRadioEnergyModel> wifiRadioEnergyModel);
 
     /**
-     * \return the channel width
+     * @return the channel width
      */
     MHz_u GetChannelWidth() const;
 
@@ -1090,28 +1112,30 @@
      * Get the power of the given power level.
      * In current implementation, the power levels are equally spaced (in dBm).
      *
-     * \param powerLevel the power level
+     * @param powerLevel the power level
      *
-     * \return the transmission power at the given power level
+     * @return the transmission power at the given power level
      */
     dBm_u GetPower(uint8_t powerLevel) const;
 
     /**
      * Reset PHY to IDLE, with some potential TX power restrictions for the next transmission.
      *
-     * \param powerRestricted flag whether the transmit power is restricted for the next
+     * @param powerRestricted flag whether the transmit power is restricted for the next
      * transmission
-     * \param txPowerMaxSiso the SISO transmit power restriction for the next transmission
-     * \param txPowerMaxMimo the MIMO transmit power restriction for the next transmission
+     * @param txPowerMaxSiso the SISO transmit power restriction for the next transmission
+     * @param txPowerMaxMimo the MIMO transmit power restriction for the next transmission
      */
-    void ResetCca(bool powerRestricted, dBm_u txPowerMaxSiso = 0, dBm_u txPowerMaxMimo = 0);
+    void ResetCca(bool powerRestricted,
+                  dBm_u txPowerMaxSiso = dBm_u{0},
+                  dBm_u txPowerMaxMimo = dBm_u{0});
     /**
      * Compute the transmit power for the next transmission.
      * The returned power will satisfy the power density constraints
      * after addition of antenna gain.
      *
-     * \param ppdu the PPDU to transmit
-     * \return the transmit power for the next transmission
+     * @param ppdu the PPDU to transmit
+     * @return the transmit power for the next transmission
      */
     dBm_u GetTxPowerForTransmission(Ptr<const WifiPpdu> ppdu) const;
     /**
@@ -1126,8 +1150,8 @@
     /**
      * This is a helper function to convert start and stop indices to start and stop frequencies.
      *
-     * \param indices the start/stop indices to convert
-     * \return the converted frequencies
+     * @param indices the start/stop indices to convert
+     * @return the converted frequencies
      */
     virtual WifiSpectrumBandFrequencies ConvertIndicesToFrequencies(
         const WifiSpectrumBandIndices& indices) const = 0;
@@ -1138,8 +1162,8 @@
      * Through this method, child classes can add their own PHY entities in
      * a static manner.
      *
-     * \param modulation the modulation class
-     * \param phyEntity the PHY entity
+     * @param modulation the modulation class
+     * @param phyEntity the PHY entity
      */
     static void AddStaticPhyEntity(WifiModulationClass modulation, Ptr<PhyEntity> phyEntity);
 
@@ -1148,8 +1172,8 @@
      * This is used to compute the different amendment-specific parameters within
      * calling static methods.
      *
-     * \param modulation the modulation class
-     * \return the pointer to the static implemented PHY entity
+     * @param modulation the modulation class
+     * @return the pointer to the static implemented PHY entity
      */
     static const Ptr<const PhyEntity> GetStaticPhyEntity(WifiModulationClass modulation);
 
@@ -1161,43 +1185,43 @@
      * used to transmit the PPDU is non-HT (duplicate), the latest PHY entity corresponding to the
      * configured standard is also returned.
      *
-     * \param ppdu the received PPDU
-     * \return the pointer to the supported PHY entity
+     * @param ppdu the received PPDU
+     * @return the pointer to the supported PHY entity
      */
     Ptr<PhyEntity> GetPhyEntityForPpdu(const Ptr<const WifiPpdu> ppdu) const;
 
     /**
      * Get the supported PHY entity corresponding to the modulation class.
      *
-     * \param modulation the modulation class
-     * \return the pointer to the supported PHY entity
+     * @param modulation the modulation class
+     * @return the pointer to the supported PHY entity
      */
     Ptr<PhyEntity> GetPhyEntity(WifiModulationClass modulation) const;
     /**
      * Get the supported PHY entity corresponding to the wifi standard.
      *
-     * \param standard the wifi standard
-     * \return the pointer to the supported PHY entity
+     * @param standard the wifi standard
+     * @return the pointer to the supported PHY entity
      */
     Ptr<PhyEntity> GetPhyEntity(WifiStandard standard) const;
     /**
      * Get the latest PHY entity supported by this PHY instance.
      *
-     * \return the latest PHY entity supported by this PHY instance
+     * @return the latest PHY entity supported by this PHY instance
      */
     Ptr<PhyEntity> GetLatestPhyEntity() const;
 
     /**
-     * \return the UID of the previously received PPDU (reset to UINT64_MAX upon transmission)
+     * @return the UID of the previously received PPDU (reset to UINT64_MAX upon transmission)
      */
     uint64_t GetPreviouslyRxPpduUid() const;
 
     /**
      * Set the UID of the previously received PPDU.
      *
-     * \param uid the value for the UID of the previously received PPDU
+     * @param uid the value for the UID of the previously received PPDU
      *
-     * \note This method shall only be used in exceptional circumstances, such as when a PHY
+     * @note This method shall only be used in exceptional circumstances, such as when a PHY
      * transmits a response to a Trigger Frame that was received by another PHY. This is the
      * case, e.g., when an aux PHY of an EMLSR client receives an ICF but it is the main PHY
      * that switches channel and transmits the response to the ICF.
@@ -1205,8 +1229,8 @@
     void SetPreviouslyRxPpduUid(uint64_t uid);
 
     /**
-     * \param currentChannelWidth channel width of the current transmission
-     * \return the width of the guard band
+     * @param currentChannelWidth channel width of the current transmission
+     * @return the width of the guard band
      *
      * Note: in order to properly model out of band transmissions for OFDM, the guard
      * band has been configured so as to expand the modeled spectrum up to the
@@ -1219,7 +1243,7 @@
      */
     virtual MHz_u GetGuardBandwidth(MHz_u currentChannelWidth) const = 0;
     /**
-     * \return a tuple containing the minimum rejection for the inner band,
+     * @return a tuple containing the minimum rejection for the inner band,
      *                            the minimum rejection for the outer band, and
      *                            the maximum rejection for the outer band
      *                            for the transmit spectrum mask.
@@ -1230,39 +1254,39 @@
 
     /**
      * Get channel number of the primary channel
-     * \param primaryChannelWidth the width of the primary channel
+     * @param primaryChannelWidth the width of the primary channel
      *
-     * \return channel number of the primary channel
+     * @return channel number of the primary channel
      */
     uint8_t GetPrimaryChannelNumber(MHz_u primaryChannelWidth) const;
 
     /**
      * Get the info of a given band
      *
-     * \param bandWidth the width of the band to be returned
-     * \param bandIndex the index of the band to be returned
+     * @param bandWidth the width of the band to be returned
+     * @param bandIndex the index of the band to be returned
      *
-     * \return the info that defines the band
+     * @return the info that defines the band
      */
     virtual WifiSpectrumBandInfo GetBand(MHz_u bandWidth, uint8_t bandIndex = 0) = 0;
 
     /**
      * Get the frequency range of the current RF interface.
      *
-     * \return the frequency range of the current RF interface
+     * @return the frequency range of the current RF interface
      */
     virtual FrequencyRange GetCurrentFrequencyRange() const = 0;
 
     /**
-     * \return the subcarrier spacing corresponding to the configure standard
+     * @return the subcarrier spacing corresponding to the configure standard
      */
     Hz_u GetSubcarrierSpacing() const;
 
     /**
      * Callback invoked when the PHY model starts to transmit a signal
      *
-     * \param ppdu The PPDU being transmitted
-     * \param txVector txVector used for transmitting the PPDU
+     * @param ppdu The PPDU being transmitted
+     * @param txVector txVector used for transmitting the PPDU
      */
     typedef void (*SignalTransmissionCallback)(Ptr<const WifiPpdu> ppdu,
                                                const WifiTxVector& txVector);
@@ -1280,7 +1304,7 @@
      * Perform any actions necessary when user changes operating channel after
      * initialization.
      *
-     * \return the amount of time to wait until the channel switch can be performed or
+     * @return the amount of time to wait until the channel switch can be performed or
      * std::nullopt if channel switch is currently not possible (i.e., the radio is in sleep mode)
      */
     std::optional<Time> GetDelayUntilChannelSwitch();
@@ -1293,14 +1317,14 @@
      * Check if PHY state should move to CCA busy state based on current
      * state of interference tracker.
      *
-     * \param ppdu the incoming PPDU or nullptr for any signal
+     * @param ppdu the incoming PPDU or nullptr for any signal
      */
     void SwitchMaybeToCcaBusy(const Ptr<const WifiPpdu> ppdu = nullptr);
     /**
      * Notify PHY state helper to switch to CCA busy state,
      *
-     * \param ppdu the incoming PPDU or nullptr for any signal
-     * \param duration the duration of the CCA state
+     * @param ppdu the incoming PPDU or nullptr for any signal
+     * @param duration the duration of the CCA state
      */
     void NotifyCcaBusy(const Ptr<const WifiPpdu> ppdu, Time duration);
 
@@ -1311,8 +1335,8 @@
      * in the static map of implemented PHY entities (\see GetStaticPhyEntities).
      * In addition, child classes can add their own PHY entities.
      *
-     * \param modulation the modulation class
-     * \param phyEntity the PHY entity
+     * @param modulation the modulation class
+     * @param phyEntity the PHY entity
      */
     void AddPhyEntity(WifiModulationClass modulation, Ptr<PhyEntity> phyEntity);
 
@@ -1411,7 +1435,7 @@
     /**
      * Add the given MCS to the device MCS set.
      *
-     * \param mode the MCS to add to the device MCS set
+     * @param mode the MCS to add to the device MCS set
      */
     void PushMcs(WifiMode mode);
     /**
@@ -1421,22 +1445,22 @@
 
     /**
      * Due to newly arrived signal, the current reception cannot be continued and has to be aborted
-     * \param reason the reason the reception is aborted
+     * @param reason the reason the reception is aborted
      *
      */
     void AbortCurrentReception(WifiPhyRxfailureReason reason);
 
     /**
      * Callback function when a transmission is completed
-     * \param psdus the PSDUs that have been sent
+     * @param psdus the PSDUs that have been sent
      */
     void TxDone(const WifiConstPsduMap& psdus);
 
     /**
      * Get the PSDU addressed to that PHY in a PPDU (useful for MU PPDU).
      *
-     * \param ppdu the PPDU to extract the PSDU from
-     * \return the PSDU addressed to that PHY
+     * @param ppdu the PPDU to extract the PSDU from
+     * @return the PSDU addressed to that PHY
      */
     Ptr<const WifiPsdu> GetAddressedPsduInPpdu(Ptr<const WifiPpdu> ppdu) const;
 
@@ -1450,14 +1474,14 @@
      * The trace source fired when a packet begins the transmission process on
      * the medium.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>, double> m_phyTxBeginTrace;
     /**
      * The trace source fired when a PSDU map begins the transmission process on
      * the medium.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<WifiConstPsduMap, WifiTxVector, double /* TX power (W) */> m_phyTxPsduBeginTrace;
 
@@ -1465,7 +1489,7 @@
      * The trace source fired when a packet ends the transmission process on
      * the medium.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_phyTxEndTrace;
 
@@ -1473,7 +1497,7 @@
      * The trace source fired when the PHY layer drops a packet as it tries
      * to transmit it.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_phyTxDropTrace;
 
@@ -1481,7 +1505,7 @@
      * The trace source fired when a packet begins the reception process from
      * the medium.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>, RxPowerWattPerChannelBand> m_phyRxBeginTrace;
 
@@ -1497,7 +1521,7 @@
      * it's also at that point that the correct decoding of
      * HT-SIG, VHT-SIGs, and HE-SIGs are checked.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<WifiTxVector, Time> m_phyRxPayloadBeginTrace;
 
@@ -1508,7 +1532,7 @@
      * header of an MPDU being received and make the information therein available to the MAC
      * as soon as the reception of the MAC header ends.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<const WifiMacHeader&, const WifiTxVector&, Time> m_phyRxMacHeaderEndTrace;
 
@@ -1516,14 +1540,14 @@
      * The trace source fired when a packet ends the reception process from
      * the medium.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_phyRxEndTrace;
 
     /**
      * The trace source fired when the PHY layer drops a packet it has received.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>, WifiPhyRxfailureReason> m_phyRxDropTrace;
 
@@ -1540,8 +1564,8 @@
      * corresponds in the madwifi driver to calling the function
      * ieee80211_input_monitor()
      *
-     * \see class CallBackTraceSource
-     * \todo WifiTxVector and signalNoiseDbm should be passed as
+     * @see class CallBackTraceSource
+     * @todo WifiTxVector and signalNoiseDbm should be passed as
      *       const references because of their sizes.
      */
     TracedCallback<Ptr<const Packet>,
@@ -1560,8 +1584,8 @@
      * corresponds in the madwifi driver to calling the function
      * ieee80211_input_monitor()
      *
-     * \see class CallBackTraceSource
-     * \todo WifiTxVector should be passed by const reference because
+     * @see class CallBackTraceSource
+     * @todo WifiTxVector should be passed by const reference because
      * of its size.
      */
     TracedCallback<Ptr<const Packet>,
@@ -1572,11 +1596,11 @@
         m_phyMonitorSniffTxTrace;
 
     /**
-     * \return the map of __implemented__ PHY entities.
+     * @return the map of __implemented__ PHY entities.
      * This is used to compute the different
      * amendment-specific parameters in a static manner.
      * For PHY entities supported by a given WifiPhy instance,
-     * \see m_phyEntities.
+     * @see m_phyEntities.
      */
     static std::map<WifiModulationClass, Ptr<PhyEntity>>& GetStaticPhyEntities();
 
@@ -1634,9 +1658,9 @@
 };
 
 /**
- * \param os           output stream
- * \param rxSignalInfo received signal info to stringify
- * \return output stream
+ * @param os           output stream
+ * @param rxSignalInfo received signal info to stringify
+ * @return output stream
  */
 std::ostream& operator<<(std::ostream& os, RxSignalInfo rxSignalInfo);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-phy-listener.h ns-3.44/src/wifi/model/wifi-phy-listener.h
--- ns-3.43/src/wifi/model/wifi-phy-listener.h	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/model/wifi-phy-listener.h	2025-03-09 16:55:49.803372600 -0700
@@ -18,7 +18,7 @@
 {
 
 /**
- * \brief receive notifications about PHY events.
+ * @brief receive notifications about PHY events.
  */
 class WifiPhyListener
 {
@@ -32,7 +32,7 @@
     }
 
     /**
-     * \param duration the expected duration of the packet reception.
+     * @param duration the expected duration of the packet reception.
      *
      * We have received the first bit of a packet. We decided
      * that we could synchronize on this packet. It does not mean
@@ -57,8 +57,8 @@
      */
     virtual void NotifyRxEndError() = 0;
     /**
-     * \param duration the expected transmission duration.
-     * \param txPower the nominal TX power
+     * @param duration the expected transmission duration.
+     * @param txPower the nominal TX power
      *
      * We are about to send the first bit of the packet.
      * We do not send any event to notify the end of
@@ -68,9 +68,9 @@
      */
     virtual void NotifyTxStart(Time duration, dBm_u txPower) = 0;
     /**
-     * \param duration the expected busy duration.
-     * \param channelType the channel type for which the CCA busy state is reported.
-     * \param per20MhzDurations vector that indicates for how long each 20 MHz subchannel
+     * @param duration the expected busy duration.
+     * @param channelType the channel type for which the CCA busy state is reported.
+     * @param per20MhzDurations vector that indicates for how long each 20 MHz subchannel
      *        (corresponding to the index of the element in the vector) is busy and where a zero
      * duration indicates that the subchannel is idle. The vector is non-empty if  the PHY supports
      * 802.11ax or later and if the operational channel width is larger than 20 MHz.
@@ -91,7 +91,7 @@
                                     WifiChannelListType channelType,
                                     const std::vector<Time>& per20MhzDurations) = 0;
     /**
-     * \param duration the expected channel switching duration.
+     * @param duration the expected channel switching duration.
      *
      * We do not send any event to notify the end of
      * channel switching. Listeners should assume that the
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-phy-operating-channel.cc ns-3.44/src/wifi/model/wifi-phy-operating-channel.cc
--- ns-3.43/src/wifi/model/wifi-phy-operating-channel.cc	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/model/wifi-phy-operating-channel.cc	2025-03-09 16:55:49.803372600 -0700
@@ -10,6 +10,7 @@
 #include "wifi-phy-operating-channel.h"
 
 #include "wifi-phy-common.h"
+#include "wifi-utils.h"
 
 #include "ns3/assert.h"
 #include "ns3/log.h"
@@ -26,237 +27,237 @@
 const std::set<FrequencyChannelInfo> WifiPhyOperatingChannel::m_frequencyChannels = {{
     // 2.4 GHz channels
     //  802.11b uses width of 22, while OFDM modes use width of 20
-    {1, 2412, 22, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::DSSS},
-    {1, 2412, 20, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::OFDM},
-    {2, 2417, 22, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::DSSS},
-    {2, 2417, 20, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::OFDM},
-    {3, 2422, 22, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::DSSS},
-    {3, 2422, 20, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::OFDM},
-    {4, 2427, 22, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::DSSS},
-    {4, 2427, 20, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::OFDM},
-    {5, 2432, 22, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::DSSS},
-    {5, 2432, 20, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::OFDM},
-    {6, 2437, 22, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::DSSS},
-    {6, 2437, 20, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::OFDM},
-    {7, 2442, 22, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::DSSS},
-    {7, 2442, 20, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::OFDM},
-    {8, 2447, 22, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::DSSS},
-    {8, 2447, 20, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::OFDM},
-    {9, 2452, 22, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::DSSS},
-    {9, 2452, 20, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::OFDM},
-    {10, 2457, 22, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::DSSS},
-    {10, 2457, 20, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::OFDM},
-    {11, 2462, 22, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::DSSS},
-    {11, 2462, 20, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::OFDM},
-    {12, 2467, 22, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::DSSS},
-    {12, 2467, 20, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::OFDM},
-    {13, 2472, 22, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::DSSS},
-    {13, 2472, 20, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::OFDM},
+    {1, MHz_u{2412}, MHz_u{22}, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::DSSS},
+    {1, MHz_u{2412}, MHz_u{20}, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::OFDM},
+    {2, MHz_u{2417}, MHz_u{22}, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::DSSS},
+    {2, MHz_u{2417}, MHz_u{20}, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::OFDM},
+    {3, MHz_u{2422}, MHz_u{22}, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::DSSS},
+    {3, MHz_u{2422}, MHz_u{20}, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::OFDM},
+    {4, MHz_u{2427}, MHz_u{22}, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::DSSS},
+    {4, MHz_u{2427}, MHz_u{20}, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::OFDM},
+    {5, MHz_u{2432}, MHz_u{22}, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::DSSS},
+    {5, MHz_u{2432}, MHz_u{20}, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::OFDM},
+    {6, MHz_u{2437}, MHz_u{22}, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::DSSS},
+    {6, MHz_u{2437}, MHz_u{20}, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::OFDM},
+    {7, MHz_u{2442}, MHz_u{22}, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::DSSS},
+    {7, MHz_u{2442}, MHz_u{20}, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::OFDM},
+    {8, MHz_u{2447}, MHz_u{22}, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::DSSS},
+    {8, MHz_u{2447}, MHz_u{20}, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::OFDM},
+    {9, MHz_u{2452}, MHz_u{22}, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::DSSS},
+    {9, MHz_u{2452}, MHz_u{20}, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::OFDM},
+    {10, MHz_u{2457}, MHz_u{22}, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::DSSS},
+    {10, MHz_u{2457}, MHz_u{20}, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::OFDM},
+    {11, MHz_u{2462}, MHz_u{22}, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::DSSS},
+    {11, MHz_u{2462}, MHz_u{20}, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::OFDM},
+    {12, MHz_u{2467}, MHz_u{22}, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::DSSS},
+    {12, MHz_u{2467}, MHz_u{20}, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::OFDM},
+    {13, MHz_u{2472}, MHz_u{22}, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::DSSS},
+    {13, MHz_u{2472}, MHz_u{20}, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::OFDM},
     // Only defined for 802.11b
-    {14, 2484, 22, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::DSSS},
+    {14, MHz_u{2484}, MHz_u{22}, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::DSSS},
     // 40 MHz channels
-    {3, 2422, 40, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::OFDM},
-    {4, 2427, 40, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::OFDM},
-    {5, 2432, 40, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::OFDM},
-    {6, 2437, 40, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::OFDM},
-    {7, 2442, 40, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::OFDM},
-    {8, 2447, 40, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::OFDM},
-    {9, 2452, 40, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::OFDM},
-    {10, 2457, 40, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::OFDM},
-    {11, 2462, 40, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::OFDM},
+    {3, MHz_u{2422}, MHz_u{40}, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::OFDM},
+    {4, MHz_u{2427}, MHz_u{40}, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::OFDM},
+    {5, MHz_u{2432}, MHz_u{40}, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::OFDM},
+    {6, MHz_u{2437}, MHz_u{40}, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::OFDM},
+    {7, MHz_u{2442}, MHz_u{40}, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::OFDM},
+    {8, MHz_u{2447}, MHz_u{40}, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::OFDM},
+    {9, MHz_u{2452}, MHz_u{40}, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::OFDM},
+    {10, MHz_u{2457}, MHz_u{40}, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::OFDM},
+    {11, MHz_u{2462}, MHz_u{40}, WIFI_PHY_BAND_2_4GHZ, FrequencyChannelType::OFDM},
 
     // Now the 5 GHz channels used for 802.11a/n/ac/ax/be
     // 20 MHz channels
-    {36, 5180, 20, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {40, 5200, 20, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {44, 5220, 20, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {48, 5240, 20, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {52, 5260, 20, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {56, 5280, 20, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {60, 5300, 20, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {64, 5320, 20, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {100, 5500, 20, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {104, 5520, 20, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {108, 5540, 20, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {112, 5560, 20, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {116, 5580, 20, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {120, 5600, 20, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {124, 5620, 20, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {128, 5640, 20, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {132, 5660, 20, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {136, 5680, 20, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {140, 5700, 20, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {144, 5720, 20, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {149, 5745, 20, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {153, 5765, 20, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {157, 5785, 20, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {161, 5805, 20, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {165, 5825, 20, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {169, 5845, 20, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {173, 5865, 20, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {177, 5885, 20, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {181, 5905, 20, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {36, MHz_u{5180}, MHz_u{20}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {40, MHz_u{5200}, MHz_u{20}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {44, MHz_u{5220}, MHz_u{20}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {48, MHz_u{5240}, MHz_u{20}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {52, MHz_u{5260}, MHz_u{20}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {56, MHz_u{5280}, MHz_u{20}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {60, MHz_u{5300}, MHz_u{20}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {64, MHz_u{5320}, MHz_u{20}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {100, MHz_u{5500}, MHz_u{20}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {104, MHz_u{5520}, MHz_u{20}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {108, MHz_u{5540}, MHz_u{20}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {112, MHz_u{5560}, MHz_u{20}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {116, MHz_u{5580}, MHz_u{20}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {120, MHz_u{5600}, MHz_u{20}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {124, MHz_u{5620}, MHz_u{20}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {128, MHz_u{5640}, MHz_u{20}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {132, MHz_u{5660}, MHz_u{20}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {136, MHz_u{5680}, MHz_u{20}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {140, MHz_u{5700}, MHz_u{20}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {144, MHz_u{5720}, MHz_u{20}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {149, MHz_u{5745}, MHz_u{20}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {153, MHz_u{5765}, MHz_u{20}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {157, MHz_u{5785}, MHz_u{20}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {161, MHz_u{5805}, MHz_u{20}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {165, MHz_u{5825}, MHz_u{20}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {169, MHz_u{5845}, MHz_u{20}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {173, MHz_u{5865}, MHz_u{20}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {177, MHz_u{5885}, MHz_u{20}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {181, MHz_u{5905}, MHz_u{20}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
     // 40 MHz channels
-    {38, 5190, 40, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {46, 5230, 40, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {54, 5270, 40, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {62, 5310, 40, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {102, 5510, 40, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {110, 5550, 40, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {118, 5590, 40, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {126, 5630, 40, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {134, 5670, 40, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {142, 5710, 40, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {151, 5755, 40, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {159, 5795, 40, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {167, 5835, 40, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {175, 5875, 40, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {38, MHz_u{5190}, MHz_u{40}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {46, MHz_u{5230}, MHz_u{40}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {54, MHz_u{5270}, MHz_u{40}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {62, MHz_u{5310}, MHz_u{40}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {102, MHz_u{5510}, MHz_u{40}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {110, MHz_u{5550}, MHz_u{40}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {118, MHz_u{5590}, MHz_u{40}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {126, MHz_u{5630}, MHz_u{40}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {134, MHz_u{5670}, MHz_u{40}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {142, MHz_u{5710}, MHz_u{40}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {151, MHz_u{5755}, MHz_u{40}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {159, MHz_u{5795}, MHz_u{40}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {167, MHz_u{5835}, MHz_u{40}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {175, MHz_u{5875}, MHz_u{40}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
     // 80 MHz channels
-    {42, 5210, 80, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {58, 5290, 80, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {106, 5530, 80, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {122, 5610, 80, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {138, 5690, 80, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {155, 5775, 80, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {171, 5855, 80, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {42, MHz_u{5210}, MHz_u{80}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {58, MHz_u{5290}, MHz_u{80}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {106, MHz_u{5530}, MHz_u{80}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {122, MHz_u{5610}, MHz_u{80}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {138, MHz_u{5690}, MHz_u{80}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {155, MHz_u{5775}, MHz_u{80}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {171, MHz_u{5855}, MHz_u{80}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
     // 160 MHz channels
-    {50, 5250, 160, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {114, 5570, 160, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-    {163, 5815, 160, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {50, MHz_u{5250}, MHz_u{160}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {114, MHz_u{5570}, MHz_u{160}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+    {163, MHz_u{5815}, MHz_u{160}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
 
     // 802.11p 10 MHz channels at the 5.855-5.925 band
-    {172, 5860, 10, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::CH_80211P},
-    {174, 5870, 10, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::CH_80211P},
-    {176, 5880, 10, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::CH_80211P},
-    {178, 5890, 10, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::CH_80211P},
-    {180, 5900, 10, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::CH_80211P},
-    {182, 5910, 10, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::CH_80211P},
-    {184, 5920, 10, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::CH_80211P},
+    {172, MHz_u{5860}, MHz_u{10}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::CH_80211P},
+    {174, MHz_u{5870}, MHz_u{10}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::CH_80211P},
+    {176, MHz_u{5880}, MHz_u{10}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::CH_80211P},
+    {178, MHz_u{5890}, MHz_u{10}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::CH_80211P},
+    {180, MHz_u{5900}, MHz_u{10}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::CH_80211P},
+    {182, MHz_u{5910}, MHz_u{10}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::CH_80211P},
+    {184, MHz_u{5920}, MHz_u{10}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::CH_80211P},
 
     // 802.11p 5 MHz channels at the 5.855-5.925 band (for simplification, we consider the same
     // center frequencies as the 10 MHz channels)
-    {171, 5860, 5, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::CH_80211P},
-    {173, 5870, 5, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::CH_80211P},
-    {175, 5880, 5, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::CH_80211P},
-    {177, 5890, 5, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::CH_80211P},
-    {179, 5900, 5, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::CH_80211P},
-    {181, 5910, 5, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::CH_80211P},
-    {183, 5920, 5, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::CH_80211P},
+    {171, MHz_u{5860}, MHz_u{5}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::CH_80211P},
+    {173, MHz_u{5870}, MHz_u{5}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::CH_80211P},
+    {175, MHz_u{5880}, MHz_u{5}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::CH_80211P},
+    {177, MHz_u{5890}, MHz_u{5}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::CH_80211P},
+    {179, MHz_u{5900}, MHz_u{5}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::CH_80211P},
+    {181, MHz_u{5910}, MHz_u{5}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::CH_80211P},
+    {183, MHz_u{5920}, MHz_u{5}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::CH_80211P},
 
     // Now the 6 GHz channels for 802.11ax/be
     // 20 MHz channels
-    {1, 5955, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {5, 5975, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {9, 5995, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {13, 6015, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {17, 6035, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {21, 6055, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {25, 6075, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {29, 6095, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {33, 6115, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {37, 6135, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {41, 6155, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {45, 6175, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {49, 6195, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {53, 6215, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {57, 6235, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {61, 6255, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {65, 6275, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {69, 6295, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {73, 6315, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {77, 6335, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {81, 6355, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {85, 6375, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {89, 6395, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {93, 6415, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {97, 6435, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {101, 6455, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {105, 6475, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {109, 6495, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {113, 6515, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {117, 6535, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {121, 6555, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {125, 6575, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {129, 6595, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {133, 6615, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {137, 6635, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {141, 6655, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {145, 6675, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {149, 6695, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {153, 6715, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {157, 6735, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {161, 6755, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {165, 6775, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {169, 6795, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {173, 6815, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {177, 6835, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {181, 6855, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {185, 6875, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {189, 6895, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {193, 6915, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {197, 6935, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {201, 6955, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {205, 6975, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {209, 6995, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {213, 7015, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {217, 7035, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {221, 7055, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {225, 7075, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {229, 7095, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {233, 7115, 20, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {1, MHz_u{5955}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {5, MHz_u{5975}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {9, MHz_u{5995}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {13, MHz_u{6015}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {17, MHz_u{6035}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {21, MHz_u{6055}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {25, MHz_u{6075}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {29, MHz_u{6095}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {33, MHz_u{6115}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {37, MHz_u{6135}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {41, MHz_u{6155}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {45, MHz_u{6175}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {49, MHz_u{6195}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {53, MHz_u{6215}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {57, MHz_u{6235}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {61, MHz_u{6255}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {65, MHz_u{6275}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {69, MHz_u{6295}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {73, MHz_u{6315}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {77, MHz_u{6335}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {81, MHz_u{6355}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {85, MHz_u{6375}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {89, MHz_u{6395}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {93, MHz_u{6415}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {97, MHz_u{6435}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {101, MHz_u{6455}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {105, MHz_u{6475}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {109, MHz_u{6495}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {113, MHz_u{6515}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {117, MHz_u{6535}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {121, MHz_u{6555}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {125, MHz_u{6575}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {129, MHz_u{6595}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {133, MHz_u{6615}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {137, MHz_u{6635}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {141, MHz_u{6655}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {145, MHz_u{6675}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {149, MHz_u{6695}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {153, MHz_u{6715}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {157, MHz_u{6735}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {161, MHz_u{6755}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {165, MHz_u{6775}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {169, MHz_u{6795}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {173, MHz_u{6815}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {177, MHz_u{6835}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {181, MHz_u{6855}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {185, MHz_u{6875}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {189, MHz_u{6895}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {193, MHz_u{6915}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {197, MHz_u{6935}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {201, MHz_u{6955}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {205, MHz_u{6975}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {209, MHz_u{6995}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {213, MHz_u{7015}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {217, MHz_u{7035}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {221, MHz_u{7055}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {225, MHz_u{7075}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {229, MHz_u{7095}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {233, MHz_u{7115}, MHz_u{20}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
     // 40 MHz channels
-    {3, 5965, 40, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {11, 6005, 40, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {19, 6045, 40, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {27, 6085, 40, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {35, 6125, 40, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {43, 6165, 40, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {51, 6205, 40, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {59, 6245, 40, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {67, 6285, 40, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {75, 6325, 40, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {83, 6365, 40, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {91, 6405, 40, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {99, 6445, 40, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {107, 6485, 40, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {115, 6525, 40, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {123, 6565, 40, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {131, 6605, 40, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {139, 6645, 40, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {147, 6685, 40, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {155, 6725, 40, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {163, 6765, 40, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {171, 6805, 40, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {179, 6845, 40, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {187, 6885, 40, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {195, 6925, 40, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {203, 6965, 40, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {211, 7005, 40, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {219, 7045, 40, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {227, 7085, 40, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {3, MHz_u{5965}, MHz_u{40}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {11, MHz_u{6005}, MHz_u{40}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {19, MHz_u{6045}, MHz_u{40}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {27, MHz_u{6085}, MHz_u{40}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {35, MHz_u{6125}, MHz_u{40}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {43, MHz_u{6165}, MHz_u{40}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {51, MHz_u{6205}, MHz_u{40}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {59, MHz_u{6245}, MHz_u{40}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {67, MHz_u{6285}, MHz_u{40}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {75, MHz_u{6325}, MHz_u{40}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {83, MHz_u{6365}, MHz_u{40}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {91, MHz_u{6405}, MHz_u{40}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {99, MHz_u{6445}, MHz_u{40}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {107, MHz_u{6485}, MHz_u{40}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {115, MHz_u{6525}, MHz_u{40}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {123, MHz_u{6565}, MHz_u{40}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {131, MHz_u{6605}, MHz_u{40}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {139, MHz_u{6645}, MHz_u{40}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {147, MHz_u{6685}, MHz_u{40}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {155, MHz_u{6725}, MHz_u{40}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {163, MHz_u{6765}, MHz_u{40}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {171, MHz_u{6805}, MHz_u{40}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {179, MHz_u{6845}, MHz_u{40}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {187, MHz_u{6885}, MHz_u{40}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {195, MHz_u{6925}, MHz_u{40}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {203, MHz_u{6965}, MHz_u{40}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {211, MHz_u{7005}, MHz_u{40}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {219, MHz_u{7045}, MHz_u{40}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {227, MHz_u{7085}, MHz_u{40}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
     // 80 MHz channels
-    {7, 5985, 80, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {23, 6065, 80, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {39, 6145, 80, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {55, 6225, 80, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {71, 6305, 80, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {87, 6385, 80, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {103, 6465, 80, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {119, 6545, 80, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {135, 6625, 80, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {151, 6705, 80, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {167, 6785, 80, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {183, 6865, 80, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {199, 6945, 80, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {215, 7025, 80, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {7, MHz_u{5985}, MHz_u{80}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {23, MHz_u{6065}, MHz_u{80}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {39, MHz_u{6145}, MHz_u{80}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {55, MHz_u{6225}, MHz_u{80}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {71, MHz_u{6305}, MHz_u{80}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {87, MHz_u{6385}, MHz_u{80}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {103, MHz_u{6465}, MHz_u{80}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {119, MHz_u{6545}, MHz_u{80}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {135, MHz_u{6625}, MHz_u{80}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {151, MHz_u{6705}, MHz_u{80}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {167, MHz_u{6785}, MHz_u{80}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {183, MHz_u{6865}, MHz_u{80}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {199, MHz_u{6945}, MHz_u{80}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {215, MHz_u{7025}, MHz_u{80}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
     // 160 MHz channels
-    {15, 6025, 160, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {47, 6185, 160, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {79, 6345, 160, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {111, 6505, 160, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {143, 6665, 160, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {175, 6825, 160, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
-    {207, 6985, 160, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {15, MHz_u{6025}, MHz_u{160}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {47, MHz_u{6185}, MHz_u{160}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {79, MHz_u{6345}, MHz_u{160}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {111, MHz_u{6505}, MHz_u{160}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {143, MHz_u{6665}, MHz_u{160}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {175, MHz_u{6825}, MHz_u{160}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
+    {207, MHz_u{6985}, MHz_u{160}, WIFI_PHY_BAND_6GHZ, FrequencyChannelType::OFDM},
 }};
 
 std::ostream&
@@ -369,7 +370,7 @@
     if ((channelIts.size() > 2) ||
         ((channelIts.size() == 2) &&
          !std::all_of(channelIts.cbegin(), channelIts.cend(), [](const auto& channel) {
-             return channel->width == 80;
+             return channel->width == MHz_u{80};
          })))
     {
         throw std::runtime_error("WifiPhyOperatingChannel is invalid: only 80+80MHz is "
@@ -384,7 +385,7 @@
 WifiPhyOperatingChannel::SetDefault(MHz_u width, WifiStandard standard, WifiPhyBand band)
 {
     NS_LOG_FUNCTION(this << width << standard << band);
-    Set({{GetDefaultChannelNumber(width, standard, band), 0, width, band}}, standard);
+    Set({{GetDefaultChannelNumber(width, standard, band), MHz_u{0}, width, band}}, standard);
 }
 
 uint8_t
@@ -398,13 +399,14 @@
     auto prevSegmentChannelIt = m_frequencyChannels.end();
     if (previousChannelNumber)
     {
-        prevSegmentChannelIt = FindFirst(*previousChannelNumber, 0, width, standard, band, start);
+        prevSegmentChannelIt =
+            FindFirst(*previousChannelNumber, MHz_u{0}, width, standard, band, start);
         if (prevSegmentChannelIt != m_frequencyChannels.end())
         {
             start = std::next(prevSegmentChannelIt);
         }
     }
-    auto channelIt = FindFirst(0, 0, width, standard, band, start);
+    auto channelIt = FindFirst(0, MHz_u{0}, width, standard, band, start);
     if (prevSegmentChannelIt != m_frequencyChannels.end() && channelIt != m_frequencyChannels.end())
     {
         const auto prevFreq = prevSegmentChannelIt->frequency;
@@ -417,7 +419,7 @@
         {
             // segments are contiguous to each others, find next segment to make sure they are
             // not contiguous
-            channelIt = FindFirst(0, 0, width, standard, band, std::next(channelIt));
+            channelIt = FindFirst(0, MHz_u{0}, width, standard, band, std::next(channelIt));
         }
     }
     if (channelIt != m_frequencyChannels.end())
@@ -445,11 +447,11 @@
         {
             return false;
         }
-        if (frequency != 0 && channel.frequency != frequency)
+        if (frequency != MHz_u{0} && channel.frequency != frequency)
         {
             return false;
         }
-        if (width != 0 && channel.width != width)
+        if (width != MHz_u{0} && channel.width != width)
         {
             return false;
         }
@@ -573,7 +575,7 @@
     NS_ASSERT(IsSet());
     return std::accumulate(m_channelIts.cbegin(),
                            m_channelIts.cend(),
-                           0,
+                           MHz_u{0},
                            [](MHz_u sum, const auto& channel) { return sum + channel->width; });
 }
 
@@ -619,7 +621,7 @@
 
     // the index of primary40 is half the index of primary20; the index of
     // primary80 is half the index of primary40, ...
-    MHz_u width = 20;
+    MHz_u width{20};
     uint8_t index = m_primary20Index;
 
     while (width < primaryChannelWidth)
@@ -644,7 +646,8 @@
 {
     NS_LOG_FUNCTION(this << +index);
 
-    NS_ABORT_MSG_IF(index > 0 && index >= GetTotalWidth() / 20, "Primary20 index out of range");
+    NS_ABORT_MSG_IF(index > 0 && index >= Count20MHzSubchannels(GetTotalWidth()),
+                    "Primary20 index out of range");
     m_primary20Index = index;
 }
 
@@ -737,7 +740,7 @@
     WifiPhyOperatingChannel primaryChannel(primaryChanIt);
 
     const auto primaryIndex = m_primary20Index - (GetPrimaryChannelIndex(primaryChannelWidth) *
-                                                  (primaryChannelWidth / 20));
+                                                  Count20MHzSubchannels(primaryChannelWidth));
     primaryChannel.SetPrimary20Index(primaryIndex);
 
     return primaryChannel;
@@ -752,7 +755,7 @@
         return {};
     }
 
-    MHz_u currWidth = 20;
+    MHz_u currWidth{20};
     std::set<uint8_t> indices;
     indices.insert(m_primary20Index);
 
@@ -775,13 +778,13 @@
 WifiPhyOperatingChannel::GetAll20MHzChannelIndicesInSecondary(
     const std::set<uint8_t>& primaryIndices) const
 {
-    if (primaryIndices.empty() || GetTotalWidth() == 20)
+    if (primaryIndices.empty() || GetTotalWidth() == MHz_u{20})
     {
         return {};
     }
 
     uint8_t size = 1;
-    MHz_u primaryWidth = 20;
+    MHz_u primaryWidth{20};
 
     // find the width of the primary channel corresponding to the size of the given set
     while (size != primaryIndices.size())
@@ -826,12 +829,12 @@
     // handle first the special case of center 26-tone RUs
     if (ruType == HeRu::RU_26_TONE && ru.GetIndex() == 19)
     {
-        NS_ASSERT_MSG(width >= 80,
+        NS_ASSERT_MSG(width >= MHz_u{80},
                       "26-tone RU with index 19 is only present in channels of at least 80 MHz");
         // the center 26-tone RU in an 80 MHz channel is not fully covered by
         // any 20 MHz channel, but by the two central 20 MHz channels in the 80 MHz channel
-        auto indices = ru.GetPrimary80MHz() ? GetAll20MHzChannelIndicesInPrimary(80)
-                                            : GetAll20MHzChannelIndicesInSecondary(80);
+        auto indices = ru.GetPrimary80MHz() ? GetAll20MHzChannelIndicesInPrimary(MHz_u{80})
+                                            : GetAll20MHzChannelIndicesInSecondary(MHz_u{80});
         indices.erase(indices.begin());
         indices.erase(std::prev(indices.end()));
         return indices;
@@ -847,12 +850,12 @@
 
     // if the RU refers to a 160 MHz channel, we have to update the RU index (which
     // refers to an 80 MHz channel) if the RU is not in the lower 80 MHz channel
-    if (width == 160)
+    if (width == MHz_u{160})
     {
         bool primary80IsLower80 = (m_primary20Index < 4);
         if (primary80IsLower80 != ru.GetPrimary80MHz())
         {
-            auto nRusIn80MHz = HeRu::GetNRus(80, ruType);
+            auto nRusIn80MHz = HeRu::GetNRus(MHz_u{80}, ruType);
             // "ignore" the center 26-tone RU in an 80 MHz channel
             if (ruType == HeRu::RU_26_TONE)
             {
@@ -882,7 +885,7 @@
         NS_ABORT_MSG("Unhandled RU type: " << ruType);
     }
 
-    auto nRusInCoveringChannel = HeRu::GetNRus(n20MHzChannels * 20, ruType);
+    auto nRusInCoveringChannel = HeRu::GetNRus(n20MHzChannels * MHz_u{20}, ruType);
     // compute the index (starting at 0) of the covering channel within the given width
     std::size_t indexOfCoveringChannelInGivenWidth = (ruIndex - 1) / nRusInCoveringChannel;
 
@@ -904,7 +907,7 @@
     }
 
     // finally, add the appropriate offset if width is less than the operational channel width
-    auto offset = GetPrimaryChannelIndex(width) * width / 20;
+    auto offset = GetPrimaryChannelIndex(width) * Count20MHzSubchannels(width);
 
     if (offset > 0)
     {
@@ -953,7 +956,7 @@
                << " width " << channel.GetWidth() << " band " << channel.GetPhyBand();
             if ((segmentId == 0) && (static_cast<uint16_t>(channel.GetTotalWidth()) % 20 == 0))
             {
-                os << " primary20 " << +channel.GetPrimaryChannelIndex(20);
+                os << " primary20 " << +channel.GetPrimaryChannelIndex(MHz_u{20});
             }
             if (segmentId < numSegments - 1)
             {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-phy-operating-channel.h ns-3.44/src/wifi/model/wifi-phy-operating-channel.h
--- ns-3.43/src/wifi/model/wifi-phy-operating-channel.h	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/model/wifi-phy-operating-channel.h	2025-03-09 16:55:49.803372600 -0700
@@ -29,10 +29,10 @@
 struct FrequencyChannelInfo
 {
     /**
-     * \brief spaceship operator.
+     * @brief spaceship operator.
      *
-     * \param info the frequency channel info
-     * \returns -1 if the provided channel info is located at a lower channel number, 0 if the
+     * @param info the frequency channel info
+     * @returns -1 if the provided channel info is located at a lower channel number, 0 if the
      * provided channel info is identical or 1 if the provided channel info is located at a higher
      * channel number
      */
@@ -45,16 +45,16 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the stream
- * \param info the frequency channel info
- * \returns a reference to the stream
+ * @param os the stream
+ * @param info the frequency channel info
+ * @returns a reference to the stream
  */
 std::ostream& operator<<(std::ostream& os, const FrequencyChannelInfo& info);
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * Class that keeps track of all information about the current PHY operating channel.
  */
@@ -70,9 +70,9 @@
         /**
          * Functional operator for sorting the frequency segments.
          *
-         * \param a const iterator pointing to the frequency channel for the first segment
-         * \param b const iterator pointing to the frequency channel for the second segment
-         * \return true if the center frequency of the first segment is lower than the center
+         * @param a const iterator pointing to the frequency channel for the first segment
+         * @param b const iterator pointing to the frequency channel for the second segment
+         * @return true if the center frequency of the first segment is lower than the center
          * frequency of the second segment
          */
         bool operator()(const ConstIterator& a, const ConstIterator& b) const;
@@ -90,7 +90,7 @@
      * Create a PHY operating channel from an iterator pointing to a channel in the set of available
      * channels.
      *
-     * \param it the iterator pointing to a channel in the set of available channels
+     * @param it the iterator pointing to a channel in the set of available channels
      */
     WifiPhyOperatingChannel(ConstIterator it);
 
@@ -98,7 +98,7 @@
      * Create a PHY operating channel from iterators pointing to multiple frequency segments in the
      * set of available channels.
      *
-     * \param its the iterators pointing to frequency segments in the set of available channels
+     * @param its the iterators pointing to frequency segments in the set of available channels
      */
     WifiPhyOperatingChannel(const ConstIteratorSet& its);
 
@@ -108,9 +108,9 @@
      * Check if the given WifiPhyOperatingChannel is equivalent.
      * Note that the primary20 channels are not compared.
      *
-     * \param other another WifiPhyOperatingChannel
+     * @param other another WifiPhyOperatingChannel
      *
-     * \return true if the given WifiPhyOperatingChannel is equivalent,
+     * @return true if the given WifiPhyOperatingChannel is equivalent,
      *         false otherwise
      */
     bool operator==(const WifiPhyOperatingChannel& other) const;
@@ -118,9 +118,9 @@
     /**
      * Check if the given WifiPhyOperatingChannel is different.
      *
-     * \param other another WifiPhyOperatingChannel
+     * @param other another WifiPhyOperatingChannel
      *
-     * \return true if the given WifiPhyOperatingChannel is different,
+     * @return true if the given WifiPhyOperatingChannel is different,
      *         false otherwise
      */
     bool operator!=(const WifiPhyOperatingChannel& other) const;
@@ -131,7 +131,7 @@
     /**
      * Return true if a valid channel has been set, false otherwise.
      *
-     * \return true if a valid channel has been set, false otherwise
+     * @return true if a valid channel has been set, false otherwise
      */
     bool IsSet() const;
     /**
@@ -141,8 +141,8 @@
      * If the channel width is a multiple of 20 MHz, the primary 20 MHz channel
      * is set to the 20 MHz subchannel with the lowest center frequency.
      *
-     * \param segments the frequency segments
-     * \param standard the standard
+     * @param segments the frequency segments
+     * @param standard the standard
      */
     void Set(const std::vector<FrequencyChannelInfo>& segments, WifiStandard standard);
     /**
@@ -150,9 +150,9 @@
      * If the channel width is a multiple of 20 MHz, the primary 20 MHz channel
      * is set to the 20 MHz subchannel with the lowest center frequency.
      *
-     * \param width the channel width
-     * \param standard the standard
-     * \param band the PHY band
+     * @param width the channel width
+     * @param standard the standard
+     * @param band the PHY band
      */
     void SetDefault(MHz_u width, WifiStandard standard, WifiPhyBand band);
 
@@ -160,13 +160,13 @@
      * Get the default channel number for a given segment of the given width and for the given
      * standard and band.
      *
-     * \param width the channel width
-     * \param standard the standard
-     * \param band the PHY band
-     * \param previousChannelNumber the channel number of the previous (in frequency) segment (if
+     * @param width the channel width
+     * @param standard the standard
+     * @param band the PHY band
+     * @param previousChannelNumber the channel number of the previous (in frequency) segment (if
      * non-contiguous operating channel is used). If there is no place for another segment that is
      * not contiguous to that previous one (at a higher frequency), an error is thrown
-     * \return the default channel number
+     * @return the default channel number
      */
     static uint8_t GetDefaultChannelNumber(
         MHz_u width,
@@ -180,8 +180,8 @@
      * it returns the channel number of the segment occuping the lowest
      * frequencies when a non-contiguous operating channel is used.
      *
-     * \param segment the index of the frequency segment (if operating channel is non-contiguous)
-     * \return the channel number for a given frequency segment
+     * @param segment the index of the frequency segment (if operating channel is non-contiguous)
+     * @return the channel number for a given frequency segment
      */
     uint8_t GetNumber(std::size_t segment = 0) const;
     /**
@@ -190,8 +190,8 @@
      * it returns the center frequency of the segment occuping the lowest
      * frequencies when a non-contiguous operating channel is used.
      *
-     * \param segment the index of the frequency segment (if operating channel is non-contiguous)
-     * \return the center frequency for a given frequency segment
+     * @param segment the index of the frequency segment (if operating channel is non-contiguous)
+     * @return the center frequency for a given frequency segment
      */
     MHz_u GetFrequency(std::size_t segment = 0) const;
     /**
@@ -200,65 +200,65 @@
      * it returns the channel width of the segment occuping the lowest
      * frequencies when a non-contiguous operating channel is used.
      *
-     * \param segment the index of the frequency segment (if operating channel is non-contiguous)
-     * \return the channel width for a given frequency segment
+     * @param segment the index of the frequency segment (if operating channel is non-contiguous)
+     * @return the channel width for a given frequency segment
      */
     MHz_u GetWidth(std::size_t segment = 0) const;
     /**
      * Return the width of the whole operating channel.
      *
-     * \return the width of the whole operating channel
+     * @return the width of the whole operating channel
      */
     MHz_u GetTotalWidth() const;
     /**
      * Return the channel number per segment.
      * Segments are ordered by increasing frequencies.
      *
-     * \return the channel number per segment
+     * @return the channel number per segment
      */
     std::vector<uint8_t> GetNumbers() const;
     /**
      * Return the center frequency per segment.
      * Segments are ordered by increasing frequencies.
      *
-     * \return the center frequency per segment
+     * @return the center frequency per segment
      */
     std::vector<MHz_u> GetFrequencies() const;
     /**
      * Return the channel width per segment.
      * Segments are ordered by increasing frequencies.
      *
-     * \return the channel width per segment
+     * @return the channel width per segment
      */
     std::vector<MHz_u> GetWidths() const;
     /**
      * Return the width type of the operating channel.
      *
-     * \return the width type of the operating channel
+     * @return the width type of the operating channel
      */
     WifiChannelWidthType GetWidthType() const;
     /**
      * Return the PHY band of the operating channel
      *
-     * \return the PHY band of the operating channel
+     * @return the PHY band of the operating channel
      */
     WifiPhyBand GetPhyBand() const;
     /**
      * Return whether the operating channel is an OFDM channel.
      *
-     * \return whether the operating channel is an OFDM channel
+     * @return whether the operating channel is an OFDM channel
      */
     bool IsOfdm() const;
     /**
      * Return whether the operating channel is a DSSS channel.
      *
-     * \return whether the operating channel is a DSSS channel
+     * @return whether the operating channel is a DSSS channel
      */
     bool IsDsss() const;
     /**
      * Return whether the operating channel is an 802.11p channel.
      *
-     * \return whether the operating channel is an 802.11p channel
+     * @return whether the operating channel is an 802.11p channel
      */
     bool Is80211p() const;
 
@@ -267,8 +267,8 @@
      * primary channel of the given width within the operating channel (0 indicates
      * the 20 MHz subchannel with the lowest center frequency). Otherwise, return 0.
      *
-     * \param primaryChannelWidth the width of the primary channel
-     * \return the index of the requested primary channel within the operating channel
+     * @param primaryChannelWidth the width of the primary channel
+     * @return the index of the requested primary channel within the operating channel
      */
     uint8_t GetPrimaryChannelIndex(MHz_u primaryChannelWidth) const;
 
@@ -277,8 +277,8 @@
      * secondary channel of the given width within the operating channel (0 indicates
      * the 20 MHz subchannel with the lowest center frequency). Otherwise, return 0.
      *
-     * \param secondaryChannelWidth the width of the secondary channel
-     * \return the index of the requested secondary channel within the operating channel
+     * @param secondaryChannelWidth the width of the secondary channel
+     * @return the index of the requested secondary channel within the operating channel
      */
     uint8_t GetSecondaryChannelIndex(MHz_u secondaryChannelWidth) const;
 
@@ -286,23 +286,23 @@
      * Set the index of the primary 20 MHz channel (0 indicates the 20 MHz subchannel
      * with the lowest center frequency among all segments).
      *
-     * \param index the index of the primary 20 MHz channel
+     * @param index the index of the primary 20 MHz channel
      */
     void SetPrimary20Index(uint8_t index);
 
     /**
      * Get the center frequency of the primary channel of the given width.
      *
-     * \param primaryChannelWidth the width of the primary channel
-     * \return the center frequency of the primary channel of the given width
+     * @param primaryChannelWidth the width of the primary channel
+     * @return the center frequency of the primary channel of the given width
      */
     MHz_u GetPrimaryChannelCenterFrequency(MHz_u primaryChannelWidth) const;
 
     /**
      * Get the center frequency of the secondary channel of the given width.
      *
-     * \param secondaryChannelWidth the width of the secondary channel
-     * \return the center frequency of the secondary channel of the given width
+     * @param secondaryChannelWidth the width of the secondary channel
+     * @return the center frequency of the secondary channel of the given width
      */
     MHz_u GetSecondaryChannelCenterFrequency(MHz_u secondaryChannelWidth) const;
 
@@ -311,8 +311,8 @@
      * channel of the given width, if such primary channel exists, or an empty set,
      * otherwise.
      *
-     * \param width the width of the primary channel
-     * \return the channel indices of all the 20 MHz channels included in the primary
+     * @param width the width of the primary channel
+     * @return the channel indices of all the 20 MHz channels included in the primary
      *         channel of the given width, if such primary channel exists, or an empty set,
      *         otherwise
      */
@@ -322,8 +322,8 @@
      * channel of the given width, if such secondary channel exists, or an empty set,
      * otherwise.
      *
-     * \param width the width of the secondary channel
-     * \return the channel indices of all the 20 MHz channels included in the secondary
+     * @param width the width of the secondary channel
+     * @return the channel indices of all the 20 MHz channels included in the secondary
      *         channel of the given width, if such secondary channel exists, or an empty set,
      *         otherwise
      */
@@ -333,9 +333,9 @@
      * channel corresponding to the given primary channel, if such secondary channel
      * exists, or an empty set, otherwise.
      *
-     * \param primaryIndices the channel indices of all the 20 MHz channels included
+     * @param primaryIndices the channel indices of all the 20 MHz channels included
      *                       in the primary channel
-     * \return the channel indices of all the 20 MHz channels included in the secondary
+     * @return the channel indices of all the 20 MHz channels included in the secondary
      *         channel corresponding to the given primary channel, if such secondary channel
      *         exists, or an empty set, otherwise
      */
@@ -345,14 +345,14 @@
     /**
      * Find the first frequency segment matching the specified parameters.
      *
-     * \param number the channel number (use 0 to leave it unspecified)
-     * \param frequency the channel center frequency in MHz (use 0 to leave it unspecified)
-     * \param width the channel width (use 0 to leave it unspecified)
-     * \param standard the standard (use WIFI_STANDARD_UNSPECIFIED not to check whether a
+     * @param number the channel number (use 0 to leave it unspecified)
+     * @param frequency the channel center frequency in MHz (use 0 to leave it unspecified)
+     * @param width the channel width (use 0 to leave it unspecified)
+     * @param standard the standard (use WIFI_STANDARD_UNSPECIFIED not to check whether a
      *                 channel is suitable for a specific standard)
-     * \param band the PHY band
-     * \param start an iterator pointing to the channel to start the search with
-     * \return an iterator pointing to the found channel, if any, or to past-the-end
+     * @param band the PHY band
+     * @param start an iterator pointing to the channel to start the search with
+     * @return an iterator pointing to the found channel, if any, or to past-the-end
      *         of the set of available channels
      */
     static ConstIterator FindFirst(uint8_t number,
@@ -364,18 +364,18 @@
 
     /**
      * Get channel number of the primary channel
-     * \param primaryChannelWidth the width of the primary channel
-     * \param standard the standard
+     * @param primaryChannelWidth the width of the primary channel
+     * @param standard the standard
      *
-     * \return channel number of the primary channel
+     * @return channel number of the primary channel
      */
     uint8_t GetPrimaryChannelNumber(MHz_u primaryChannelWidth, WifiStandard standard) const;
 
     /**
      * Get a WifiPhyOperatingChannel object corresponding to the primary channel of the given width.
      *
-     * \param primaryChannelWidth the width of the primary channel in MHz
-     * \return a WifiPhyOperatingChannel object corresponding to the primary channel of the given
+     * @param primaryChannelWidth the width of the primary channel in MHz
+     * @return a WifiPhyOperatingChannel object corresponding to the primary channel of the given
      *         width
      */
     WifiPhyOperatingChannel GetPrimaryChannel(MHz_u primaryChannelWidth) const;
@@ -383,26 +383,26 @@
     /**
      * Get the channel indices of the minimum subset of 20 MHz channels containing the given RU.
      *
-     * \param ru the given RU
-     * \param width the width of the channel to which the given RU refers to; normally,
+     * @param ru the given RU
+     * @param width the width of the channel to which the given RU refers to; normally,
      *              it is the width of the PPDU for which the RU is allocated
-     * \return the channel indices of the minimum subset of 20 MHz channels containing the given RU
+     * @return the channel indices of the minimum subset of 20 MHz channels containing the given RU
      */
     std::set<uint8_t> Get20MHzIndicesCoveringRu(HeRu::RuSpec ru, MHz_u width) const;
 
     /**
      * Get the index of the segment that contains a given primary channel.
      *
-     * \param primaryChannelWidth the width of the primary channel
-     * \return the index of the segment that contains the primary channel
+     * @param primaryChannelWidth the width of the primary channel
+     * @return the index of the segment that contains the primary channel
      */
     uint8_t GetPrimarySegmentIndex(MHz_u primaryChannelWidth) const;
 
     /**
      * Get the index of the segment that contains a given secondary channel.
      *
-     * \param secondaryChannelWidth the width of the secondary channel
-     * \return the index of the segment that contains the secondary channel
+     * @param secondaryChannelWidth the width of the secondary channel
+     * @return the index of the segment that contains the secondary channel
      */
     uint8_t GetSecondarySegmentIndex(MHz_u secondaryChannelWidth) const;
 
@@ -410,7 +410,7 @@
      * Get the number of frequency segments in the operating channel.
      * This is only more than one if a non-contiguous operating channel is used.
      *
-     * \return the number of frequency segments
+     * @return the number of frequency segments
      */
     std::size_t GetNSegments() const;
 
@@ -421,11 +421,11 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the stream
- * \param channel the operating channel
- * \returns a reference to the stream
+ * @param os the stream
+ * @param channel the operating channel
+ * @returns a reference to the stream
  */
 std::ostream& operator<<(std::ostream& os, const WifiPhyOperatingChannel& channel);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-phy-state.h ns-3.44/src/wifi/model/wifi-phy-state.h
--- ns-3.43/src/wifi/model/wifi-phy-state.h	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/model/wifi-phy-state.h	2025-03-09 16:55:49.803372600 -0700
@@ -53,11 +53,11 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the stream
- * \param state the state
- * \returns a reference to the stream
+ * @param os the stream
+ * @param state the state
+ * @returns a reference to the stream
  */
 inline std::ostream&
 operator<<(std::ostream& os, WifiPhyState state)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-phy-state-helper.cc ns-3.44/src/wifi/model/wifi-phy-state-helper.cc
--- ns-3.43/src/wifi/model/wifi-phy-state-helper.cc	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/model/wifi-phy-state-helper.cc	2025-03-09 16:55:49.803372600 -0700
@@ -12,6 +12,7 @@
 #include "wifi-phy.h"
 #include "wifi-psdu.h"
 #include "wifi-tx-vector.h"
+#include "wifi-utils.h"
 
 #include "ns3/log.h"
 #include "ns3/packet.h"
@@ -540,8 +541,11 @@
     case WifiPhyState::CCA_BUSY:
         LogPreviousIdleAndCcaBusyStates();
         break;
+    case WifiPhyState::RX:
+        DoSwitchFromRx();
+        break;
     default:
-        NS_FATAL_ERROR("Invalid WifiPhy state.");
+        NS_FATAL_ERROR("Invalid WifiPhy state: " << GetState());
         break;
     }
     m_previousStateChangeTime = now;
@@ -574,9 +578,11 @@
     DoSwitchFromRx();
     m_endCcaBusy = Simulator::Now();
     std::vector<Time> per20MhzDurations;
-    if (operatingWidth >= 40)
+    if (operatingWidth >= MHz_u{40})
     {
-        std::fill_n(std::back_inserter(per20MhzDurations), (operatingWidth / 20), Seconds(0));
+        std::fill_n(std::back_inserter(per20MhzDurations),
+                    Count20MHzSubchannels(operatingWidth),
+                    Seconds(0));
     }
     NotifyListeners(&WifiPhyListener::NotifyCcaBusyStart,
                     Seconds(0),
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-phy-state-helper.h ns-3.44/src/wifi/model/wifi-phy-state-helper.h
--- ns-3.43/src/wifi/model/wifi-phy-state-helper.h	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/model/wifi-phy-state-helper.h	2025-03-09 16:55:49.803372600 -0700
@@ -44,7 +44,11 @@
  * arg3: TXVECTOR of PSDU
  * arg4: vector of per-MPDU status of reception.
  */
-typedef Callback<void, Ptr<const WifiPsdu>, RxSignalInfo, WifiTxVector, std::vector<bool>>
+typedef Callback<void,
+                 Ptr<const WifiPsdu>,
+                 RxSignalInfo,
+                 const WifiTxVector&,
+                 const std::vector<bool>&>
     RxOkCallback;
 /**
  * Callback if PSDU unsuccessfuly received
@@ -54,7 +58,7 @@
 typedef Callback<void, Ptr<const WifiPsdu>> RxErrorCallback;
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * This objects implements the PHY state machine of the Wifi device.
  */
@@ -62,8 +66,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -72,107 +76,107 @@
     /**
      * Set a callback for a successful reception.
      *
-     * \param callback the RxOkCallback to set
+     * @param callback the RxOkCallback to set
      */
     void SetReceiveOkCallback(RxOkCallback callback);
     /**
      * Set a callback for a failed reception.
      *
-     * \param callback the RxErrorCallback to set
+     * @param callback the RxErrorCallback to set
      */
     void SetReceiveErrorCallback(RxErrorCallback callback);
     /**
      * Register WifiPhyListener to this WifiPhyStateHelper.
      *
-     * \param listener the WifiPhyListener to register
+     * @param listener the WifiPhyListener to register
      */
     void RegisterListener(const std::shared_ptr<WifiPhyListener>& listener);
     /**
      * Remove WifiPhyListener from this WifiPhyStateHelper.
      *
-     * \param listener the WifiPhyListener to unregister
+     * @param listener the WifiPhyListener to unregister
      */
     void UnregisterListener(const std::shared_ptr<WifiPhyListener>& listener);
     /**
      * Return the current state of WifiPhy.
      *
-     * \return the current state of WifiPhy
+     * @return the current state of WifiPhy
      */
     WifiPhyState GetState() const;
     /**
      * Check whether the current state is CCA busy.
      *
-     * \return true if the current state is CCA busy, false otherwise
+     * @return true if the current state is CCA busy, false otherwise
      */
     bool IsStateCcaBusy() const;
     /**
      * Check whether the current state is IDLE.
      *
-     * \return true if the current state is IDLE, false otherwise
+     * @return true if the current state is IDLE, false otherwise
      */
     bool IsStateIdle() const;
     /**
      * Check whether the current state is RX.
      *
-     * \return true if the current state is RX, false otherwise
+     * @return true if the current state is RX, false otherwise
      */
     bool IsStateRx() const;
     /**
      * Check whether the current state is TX.
      *
-     * \return true if the current state is TX, false otherwise
+     * @return true if the current state is TX, false otherwise
      */
     bool IsStateTx() const;
     /**
      * Check whether the current state is SWITCHING.
      *
-     * \return true if the current state is SWITCHING, false otherwise
+     * @return true if the current state is SWITCHING, false otherwise
      */
     bool IsStateSwitching() const;
     /**
      * Check whether the current state is SLEEP.
      *
-     * \return true if the current state is SLEEP, false otherwise
+     * @return true if the current state is SLEEP, false otherwise
      */
     bool IsStateSleep() const;
     /**
      * Check whether the current state is OFF.
      *
-     * \return true if the current state is OFF, false otherwise
+     * @return true if the current state is OFF, false otherwise
      */
     bool IsStateOff() const;
     /**
      * Return the time before the state is back to IDLE.
      *
-     * \return the delay before the state is back to IDLE
+     * @return the delay before the state is back to IDLE
      */
     Time GetDelayUntilIdle() const;
     /**
      * Return the time the last RX start.
      *
-     * \return the time the last RX start.
+     * @return the time the last RX start.
      */
     Time GetLastRxStartTime() const;
     /**
      * Return the time the last RX end.
      *
-     * \return the time the last RX end.
+     * @return the time the last RX end.
      */
     Time GetLastRxEndTime() const;
 
     /**
-     * \param states a set of PHY states
-     * \return the last time the PHY has been in any of the given states
+     * @param states a set of PHY states
+     * @return the last time the PHY has been in any of the given states
      */
     Time GetLastTime(std::initializer_list<WifiPhyState> states) const;
 
     /**
      * Switch state to TX for the given duration.
      *
-     * \param txDuration the duration of the PPDU to transmit
-     * \param psdus the PSDUs in the transmitted PPDU (only one unless it is a MU PPDU)
-     * \param txPower the nominal TX power
-     * \param txVector the TX vector for the transmission
+     * @param txDuration the duration of the PPDU to transmit
+     * @param psdus the PSDUs in the transmitted PPDU (only one unless it is a MU PPDU)
+     * @param txPower the nominal TX power
+     * @param txVector the TX vector for the transmission
      */
     void SwitchToTx(Time txDuration,
                     const WifiConstPsduMap& psdus,
@@ -181,21 +185,21 @@
     /**
      * Switch state to RX for the given duration.
      *
-     * \param rxDuration the duration of the RX
+     * @param rxDuration the duration of the RX
      */
     void SwitchToRx(Time rxDuration);
     /**
      * Switch state to channel switching for the given duration.
      *
-     * \param switchingDuration the duration of required to switch the channel
+     * @param switchingDuration the duration of required to switch the channel
      */
     void SwitchToChannelSwitching(Time switchingDuration);
     /**
      * Notify the reception of an MPDU included in an A-MPDU.
      *
-     * \param psdu the successfully received PSDU
-     * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
-     * \param txVector TXVECTOR of the PSDU
+     * @param psdu the successfully received PSDU
+     * @param rxSignalInfo the info on the received signal (\see RxSignalInfo)
+     * @param txVector TXVECTOR of the PSDU
      */
     void NotifyRxMpdu(Ptr<const WifiPsdu> psdu,
                       RxSignalInfo rxSignalInfo,
@@ -203,11 +207,11 @@
     /**
      * Handle the successful reception of a PSDU.
      *
-     * \param psdu the successfully received PSDU
-     * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
-     * \param txVector TXVECTOR of the PSDU
-     * \param staId the station ID of the PSDU (only used for MU)
-     * \param statusPerMpdu reception status per MPDU
+     * @param psdu the successfully received PSDU
+     * @param rxSignalInfo the info on the received signal (\see RxSignalInfo)
+     * @param txVector TXVECTOR of the PSDU
+     * @param staId the station ID of the PSDU (only used for MU)
+     * @param statusPerMpdu reception status per MPDU
      */
     void NotifyRxPsduSucceeded(Ptr<const WifiPsdu> psdu,
                                RxSignalInfo rxSignalInfo,
@@ -217,19 +221,19 @@
     /**
      * Handle the unsuccessful reception of a PSDU.
      *
-     * \param psdu the PSDU that we failed to received
-     * \param snr the SNR of the received PSDU in linear scale
+     * @param psdu the PSDU that we failed to received
+     * @param snr the SNR of the received PSDU in linear scale
      */
     void NotifyRxPsduFailed(Ptr<const WifiPsdu> psdu, double snr);
 
     /**
      * Handle the outcome of a reception of a PPDU.
      *
-     * \param ppdu the received PPDU
-     * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
-     * \param txVector TXVECTOR of the PSDU
-     * \param staId the station ID of the PSDU (only used for MU)
-     * \param statusPerMpdu reception status per MPDU
+     * @param ppdu the received PPDU
+     * @param rxSignalInfo the info on the received signal (\see RxSignalInfo)
+     * @param txVector TXVECTOR of the PSDU
+     * @param staId the station ID of the PSDU (only used for MU)
+     * @param statusPerMpdu reception status per MPDU
      */
     void NotifyRxPpduOutcome(Ptr<const WifiPpdu> ppdu,
                              RxSignalInfo rxSignalInfo,
@@ -246,15 +250,15 @@
     void SwitchFromRxEndError();
     /**
      * Abort current reception following a CCA reset request.
-     * \param operatingWidth the channel width the PHY is operating on
+     * @param operatingWidth the channel width the PHY is operating on
      */
     void SwitchFromRxAbort(MHz_u operatingWidth);
     /**
      * Switch to CCA busy.
      *
-     * \param duration the duration of the CCA state
-     * \param channelType the channel type for which the CCA busy state is reported.
-     * \param per20MhzDurations vector that indicates for how long each 20 MHz subchannel
+     * @param duration the duration of the CCA state
+     * @param channelType the channel type for which the CCA busy state is reported.
+     * @param per20MhzDurations vector that indicates for how long each 20 MHz subchannel
      *        (corresponding to the index of the element in the vector) is busy and where a zero
      * duration indicates that the subchannel is idle. The vector is non-empty if the PHY supports
      * 802.11ax or later and if the operational channel width is larger than 20 MHz.
@@ -282,20 +286,20 @@
     /**
      * TracedCallback signature for state changes.
      *
-     * \param [in] start Time when the \pname{state} started.
-     * \param [in] duration Amount of time we've been in (or will be in)
+     * @param [in] start Time when the \pname{state} started.
+     * @param [in] duration Amount of time we've been in (or will be in)
      *             the \pname{state}.
-     * \param [in] state The state.
+     * @param [in] state The state.
      */
     typedef void (*StateTracedCallback)(Time start, Time duration, WifiPhyState state);
 
     /**
      * TracedCallback signature for receive end OK event.
      *
-     * \param [in] packet The received packet.
-     * \param [in] snr    The SNR of the received packet in linear scale.
-     * \param [in] mode   The transmission mode of the packet.
-     * \param [in] preamble The preamble of the packet.
+     * @param [in] packet The received packet.
+     * @param [in] snr    The SNR of the received packet in linear scale.
+     * @param [in] mode   The transmission mode of the packet.
+     * @param [in] preamble The preamble of the packet.
      */
     typedef void (*RxOkTracedCallback)(Ptr<const Packet> packet,
                                        double snr,
@@ -305,15 +309,15 @@
     /**
      * TracedCallback signature for the outcome of a received packet.
      *
-     * \param [in] psdu The received PSDU (Physical Layer Service Data Unit).
-     * \param [in] signalInfo Information about the received signal, including its power and other
+     * @param [in] ppdu The received PPDU (Physical Layer Protocol Data Unit).
+     * @param [in] signalInfo Information about the received signal, including its power and other
      * characteristics.
-     * \param [in] txVector The transmission vector used for the packet, detailing
+     * @param [in] txVector The transmission vector used for the packet, detailing
      * the transmission parameters.
-     * \param [in] outcomes A vector of boolean values indicating the
+     * @param [in] outcomes A vector of boolean values indicating the
      * success or failure of receiving individual MPDUs within the PSDU.
      */
-    typedef void (*RxOutcomeTracedCallback)(Ptr<const WifiPsdu> psdu,
+    typedef void (*RxOutcomeTracedCallback)(Ptr<const WifiPpdu> ppdu,
                                             RxSignalInfo signalInfo,
                                             const WifiTxVector& txVector,
                                             const std::vector<bool>& outcomes);
@@ -321,18 +325,18 @@
     /**
      * TracedCallback signature for receive end error event.
      *
-     * \param [in] packet       The received packet.
-     * \param [in] snr          The SNR of the received packet in linear scale.
+     * @param [in] packet       The received packet.
+     * @param [in] snr          The SNR of the received packet in linear scale.
      */
     typedef void (*RxEndErrorTracedCallback)(Ptr<const Packet> packet, double snr);
 
     /**
      * TracedCallback signature for transmit event.
      *
-     * \param [in] packet The received packet.
-     * \param [in] mode   The transmission mode of the packet.
-     * \param [in] preamble The preamble of the packet.
-     * \param [in] power  The transmit power level.
+     * @param [in] packet The received packet.
+     * @param [in] mode   The transmission mode of the packet.
+     * @param [in] preamble The preamble of the packet.
+     * @param [in] power  The transmit power level.
      */
     typedef void (*TxTracedCallback)(Ptr<const Packet> packet,
                                      WifiMode mode,
@@ -342,10 +346,10 @@
     /**
      * Notify all WifiPhyListener objects of the given PHY event.
      *
-     * \tparam FUNC \deduced Member function type
-     * \tparam Ts \deduced Function argument types
-     * \param f the member function to invoke
-     * \param args arguments to pass to the member function
+     * @tparam FUNC \deduced Member function type
+     * @tparam Ts \deduced Function argument types
+     * @param f the member function to invoke
+     * @param args arguments to pass to the member function
      */
     template <typename FUNC, typename... Ts>
     void NotifyListeners(FUNC f, Ts&&... args);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-ppdu.cc ns-3.44/src/wifi/model/wifi-ppdu.cc
--- ns-3.43/src/wifi/model/wifi-ppdu.cc	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/model/wifi-ppdu.cc	2025-03-09 16:55:49.803372600 -0700
@@ -21,9 +21,9 @@
  * If the specified channel width is spread over multiple frequency segments (e.g. 160 MHz if
  * operating channel is 80+80MHz), multiple center frequencies are returned.
  *
- * \param channel the operating channel of the PHY
- * \param channelWidth the channel width
- * \return the center frequency of each segment covered by the given width
+ * @param channel the operating channel of the PHY
+ * @param channelWidth the channel width
+ * @return the center frequency of each segment covered by the given width
  */
 std::vector<ns3::MHz_u>
 GetChannelCenterFrequenciesPerSegment(const ns3::WifiPhyOperatingChannel& channel,
@@ -100,15 +100,6 @@
     m_psdus = psdus;
 }
 
-WifiPpdu::~WifiPpdu()
-{
-    for (auto& psdu : m_psdus)
-    {
-        psdu.second = nullptr;
-    }
-    m_psdus.clear();
-}
-
 const WifiTxVector&
 WifiPpdu::GetTxVector() const
 {
@@ -273,7 +264,7 @@
 WifiPpdu::PrintPayload() const
 {
     std::ostringstream ss;
-    ss << "PSDU=" << GetPsdu() << " ";
+    ss << "PSDU=" << *GetPsdu() << " ";
     return ss.str();
 }
 
@@ -292,14 +283,4 @@
     return os;
 }
 
-std::ostream&
-operator<<(std::ostream& os, const WifiConstPsduMap& psdus)
-{
-    for (const auto& psdu : psdus)
-    {
-        os << "PSDU for STA_ID=" << psdu.first << " (" << *psdu.second << ") ";
-    }
-    return os;
-}
-
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-ppdu.h ns-3.44/src/wifi/model/wifi-ppdu.h
--- ns-3.43/src/wifi/model/wifi-ppdu.h	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/model/wifi-ppdu.h	2025-03-09 16:55:49.803372600 -0700
@@ -9,6 +9,7 @@
 #ifndef WIFI_PPDU_H
 #define WIFI_PPDU_H
 
+#include "wifi-psdu.h"
 #include "wifi-tx-vector.h"
 
 #include "ns3/nstime.h"
@@ -19,8 +20,8 @@
 #include <vector>
 
 /**
- * \file
- * \ingroup wifi
+ * @file
+ * @ingroup wifi
  * Declaration of ns3::WifiPpdu class
  * and ns3::WifiConstPsduMap.
  */
@@ -29,7 +30,6 @@
 {
 
 class Packet;
-class WifiPsdu;
 class WifiPhyOperatingChannel;
 
 /**
@@ -38,7 +38,7 @@
 typedef std::unordered_map<uint16_t /* STA-ID */, Ptr<const WifiPsdu> /* PSDU */> WifiConstPsduMap;
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * WifiPpdu stores a preamble, a modulation class, PHY headers and a PSDU.
  * This class should be subclassed for each amendment.
@@ -49,10 +49,10 @@
     /**
      * Create a PPDU storing a PSDU.
      *
-     * \param psdu the PHY payload (PSDU)
-     * \param txVector the TXVECTOR that was used for this PPDU
-     * \param channel the operating channel of the PHY used to transmit this PPDU
-     * \param uid the unique ID of this PPDU
+     * @param psdu the PHY payload (PSDU)
+     * @param txVector the TXVECTOR that was used for this PPDU
+     * @param channel the operating channel of the PHY used to transmit this PPDU
+     * @param uid the unique ID of this PPDU
      */
     WifiPpdu(Ptr<const WifiPsdu> psdu,
              const WifiTxVector& txVector,
@@ -61,10 +61,10 @@
     /**
      * Create a PPDU storing a map of PSDUs.
      *
-     * \param psdus the PHY payloads (PSDUs)
-     * \param txVector the TXVECTOR that was used for this PPDU
-     * \param channel the operating channel of the PHY used to transmit this PPDU
-     * \param uid the unique ID of this PPDU
+     * @param psdus the PHY payloads (PSDUs)
+     * @param txVector the TXVECTOR that was used for this PPDU
+     * @param channel the operating channel of the PHY used to transmit this PPDU
+     * @param uid the unique ID of this PPDU
      */
     WifiPpdu(const WifiConstPsduMap& psdus,
              const WifiTxVector& txVector,
@@ -73,12 +73,12 @@
     /**
      * Destructor for WifiPpdu.
      */
-    virtual ~WifiPpdu();
+    virtual ~WifiPpdu() = default;
 
     /**
      * Get the TXVECTOR used to send the PPDU.
      *
-     * \return the TXVECTOR of the PPDU.
+     * @return the TXVECTOR of the PPDU.
      */
     const WifiTxVector& GetTxVector() const;
 
@@ -90,19 +90,19 @@
     /**
      * Update the TXVECTOR based on some information known at the receiver.
      *
-     * \param updatedTxVector the updated TXVECTOR.
+     * @param updatedTxVector the updated TXVECTOR.
      */
     void UpdateTxVector(const WifiTxVector& updatedTxVector) const;
 
     /**
      * Get the payload of the PPDU.
      *
-     * \return the PSDU
+     * @return the PSDU
      */
     Ptr<const WifiPsdu> GetPsdu() const;
 
     /**
-     * \return c\ true if the PPDU's transmission was aborted due to transmitter switch off
+     * @return c\ true if the PPDU's transmission was aborted due to transmitter switch off
      */
     bool IsTruncatedTx() const;
 
@@ -114,7 +114,7 @@
     /**
      * Get the total transmission duration of the PPDU.
      *
-     * \return the transmission duration of the PPDU
+     * @return the transmission duration of the PPDU
      */
     virtual Time GetTxDuration() const;
 
@@ -122,70 +122,70 @@
      * Get the channel width over which the PPDU will effectively be
      * transmitted.
      *
-     * \return the effective channel width used for the tranmsission
+     * @return the effective channel width used for the tranmsission
      */
     virtual MHz_u GetTxChannelWidth() const;
 
     /**
-     * \return the center frequency per segment used for the transmission of this PPDU
+     * @return the center frequency per segment used for the transmission of this PPDU
      */
     std::vector<MHz_u> GetTxCenterFreqs() const;
 
     /**
      * Check whether the given PPDU overlaps a given channel.
      *
-     * \param minFreq the minimum frequency of the channel
-     * \param maxFreq the maximum frequency of the channel
-     * \return true if this PPDU overlaps the channel, false otherwise
+     * @param minFreq the minimum frequency of the channel
+     * @param maxFreq the maximum frequency of the channel
+     * @return true if this PPDU overlaps the channel, false otherwise
      */
     bool DoesOverlapChannel(MHz_u minFreq, MHz_u maxFreq) const;
 
     /**
      * Get the modulation used for the PPDU.
-     * \return the modulation used for the PPDU
+     * @return the modulation used for the PPDU
      */
     WifiModulationClass GetModulation() const;
 
     /**
      * Get the UID of the PPDU.
-     * \return the UID of the PPDU
+     * @return the UID of the PPDU
      */
     uint64_t GetUid() const;
 
     /**
      * Get the preamble of the PPDU.
-     * \return the preamble of the PPDU
+     * @return the preamble of the PPDU
      */
     WifiPreamble GetPreamble() const;
 
     /**
-     * \brief Print the PPDU contents.
-     * \param os output stream in which the data should be printed.
+     * @brief Print the PPDU contents.
+     * @param os output stream in which the data should be printed.
      */
     void Print(std::ostream& os) const;
     /**
-     * \brief Copy this instance.
-     * \return a Ptr to a copy of this instance.
+     * @brief Copy this instance.
+     * @return a Ptr to a copy of this instance.
      */
     virtual Ptr<WifiPpdu> Copy() const;
 
     /**
      * Return the PPDU type (\see WifiPpduType)
-     * \return the PPDU type
+     * @return the PPDU type
      */
     virtual WifiPpduType GetType() const;
 
     /**
      * Get the ID of the STA that transmitted the PPDU for UL MU,
      * SU_STA_ID otherwise.
-     * \return the ID of the STA that transmitted the PPDU for UL MU, SU_STA_ID otherwise
+     * @return the ID of the STA that transmitted the PPDU for UL MU, SU_STA_ID otherwise
      */
     virtual uint16_t GetStaId() const;
 
   protected:
     /**
-     * \brief Print the payload of the PPDU.
-     * \return information on the payload part of the PPDU
+     * @brief Print the payload of the PPDU.
+     * @return information on the payload part of the PPDU
      */
     virtual std::string PrintPayload() const;
 
@@ -204,7 +204,7 @@
     /**
      * Get the TXVECTOR used to send the PPDU.
      *
-     * \return the TXVECTOR of the PPDU.
+     * @return the TXVECTOR of the PPDU.
      */
     virtual WifiTxVector DoGetTxVector() const;
 
@@ -222,23 +222,14 @@
 };                          // class WifiPpdu
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the stream
- * \param ppdu the const pointer to the PPDU
- * \returns a reference to the stream
+ * @param os the stream
+ * @param ppdu the const pointer to the PPDU
+ * @returns a reference to the stream
  */
 std::ostream& operator<<(std::ostream& os, const Ptr<const WifiPpdu>& ppdu);
 
-/**
- * \brief Stream insertion operator.
- *
- * \param os the stream
- * \param psdus the PSDUs
- * \returns a reference to the stream
- */
-std::ostream& operator<<(std::ostream& os, const WifiConstPsduMap& psdus);
-
 } // namespace ns3
 
 #endif /* WIFI_PPDU_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-protection.h ns-3.44/src/wifi/model/wifi-protection.h
--- ns-3.43/src/wifi/model/wifi-protection.h	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/model/wifi-protection.h	2025-03-09 16:55:49.803372600 -0700
@@ -21,7 +21,7 @@
 {
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * WifiProtection is an abstract base struct. Each derived struct defines a protection
  * method and stores the information needed to perform protection according to
@@ -30,8 +30,8 @@
 struct WifiProtection
 {
     /**
-     * \enum Method
-     * \brief Available protection methods
+     * @enum Method
+     * @brief Available protection methods
      */
     enum Method
     {
@@ -43,20 +43,20 @@
 
     /**
      * Constructor.
-     * \param m the protection method for this object
+     * @param m the protection method for this object
      */
     WifiProtection(Method m);
     virtual ~WifiProtection();
 
     /**
      * Clone this object.
-     * \return a pointer to the cloned object
+     * @return a pointer to the cloned object
      */
     virtual std::unique_ptr<WifiProtection> Copy() const = 0;
 
     /**
-     * \brief Print the object contents.
-     * \param os output stream in which the data should be printed.
+     * @brief Print the object contents.
+     * @param os output stream in which the data should be printed.
      */
     virtual void Print(std::ostream& os) const = 0;
 
@@ -65,7 +65,7 @@
 };
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * WifiNoProtection specifies that no protection method is used.
  */
@@ -78,7 +78,7 @@
 };
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * WifiRtsCtsProtection specifies that RTS/CTS protection method is used.
  */
@@ -94,7 +94,7 @@
 };
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * WifiCtsToSelfProtection specifies that CTS-to-self protection method is used.
  */
@@ -109,7 +109,7 @@
 };
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * WifiMuRtsCtsProtection specifies that MU-RTS/CTS protection method is used.
  */
@@ -126,11 +126,11 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the output stream
- * \param protection the protection method
- * \returns a reference to the stream
+ * @param os the output stream
+ * @param protection the protection method
+ * @returns a reference to the stream
  */
 std::ostream& operator<<(std::ostream& os, const WifiProtection* protection);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-protection-manager.cc ns-3.44/src/wifi/model/wifi-protection-manager.cc
--- ns-3.43/src/wifi/model/wifi-protection-manager.cc	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/model/wifi-protection-manager.cc	2025-03-09 16:55:49.803372600 -0700
@@ -84,11 +84,12 @@
         std::min(txWidth, GetWifiRemoteStationManager()->GetChannelWidthSupported(receiver));
     auto phy = m_mac->GetWifiPhy(m_linkId);
     std::size_t primaryIdx = phy->GetOperatingChannel().GetPrimaryChannelIndex(ctsTxWidth);
-    std::size_t idx80MHz = 80 / ctsTxWidth;
-    if ((phy->GetChannelWidth() == 160) && (ctsTxWidth <= 40) && (primaryIdx >= idx80MHz))
+    std::size_t idx80MHz = MHz_u{80} / ctsTxWidth;
+    if ((phy->GetChannelWidth() == MHz_u{160}) && (ctsTxWidth <= MHz_u{40}) &&
+        (primaryIdx >= idx80MHz))
     {
         // the primary80 is in the higher part of the 160 MHz channel
-        primaryIdx -= 80 / ctsTxWidth;
+        primaryIdx -= idx80MHz;
     }
     switch (static_cast<uint16_t>(ctsTxWidth))
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-protection-manager.h ns-3.44/src/wifi/model/wifi-protection-manager.h
--- ns-3.43/src/wifi/model/wifi-protection-manager.h	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/model/wifi-protection-manager.h	2025-03-09 16:55:49.803372600 -0700
@@ -24,7 +24,7 @@
 class WifiRemoteStationManager;
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * WifiProtectionManager is an abstract base class. Each subclass defines a logic
  * to select the protection method for a given frame.
@@ -33,8 +33,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     WifiProtectionManager();
@@ -43,13 +43,13 @@
     /**
      * Set the MAC which is using this Protection Manager
      *
-     * \param mac a pointer to the MAC
+     * @param mac a pointer to the MAC
      */
     void SetWifiMac(Ptr<WifiMac> mac);
     /**
      * Set the ID of the link this Protection Manager is associated with.
      *
-     * \param linkId the ID of the link this Protection Manager is associated with
+     * @param linkId the ID of the link this Protection Manager is associated with
      */
     void SetLinkId(uint8_t linkId);
 
@@ -58,9 +58,9 @@
      * frame. Return a null pointer if the protection method is unchanged or the new
      * protection method otherwise.
      *
-     * \param mpdu the MPDU to be added to the current frame
-     * \param txParams the current TX parameters for the current frame
-     * \return a null pointer if the protection method is unchanged or the new
+     * @param mpdu the MPDU to be added to the current frame
+     * @param txParams the current TX parameters for the current frame
+     * @return a null pointer if the protection method is unchanged or the new
      *         protection method otherwise
      */
     virtual std::unique_ptr<WifiProtection> TryAddMpdu(Ptr<const WifiMpdu> mpdu,
@@ -71,9 +71,9 @@
      * current frame. Return a null pointer if the protection method is unchanged or
      * the new protection method otherwise.
      *
-     * \param msdu the MSDU to be aggregated to the current frame
-     * \param txParams the current TX parameters for the current frame
-     * \return a null pointer if the protection method is unchanged or the new
+     * @param msdu the MSDU to be aggregated to the current frame
+     * @param txParams the current TX parameters for the current frame
+     * @return a null pointer if the protection method is unchanged or the new
      *         protection method otherwise
      */
     virtual std::unique_ptr<WifiProtection> TryAggregateMsdu(Ptr<const WifiMpdu> msdu,
@@ -83,7 +83,7 @@
     void DoDispose() override;
 
     /**
-     * \return the remote station manager operating on our link
+     * @return the remote station manager operating on our link
      */
     Ptr<WifiRemoteStationManager> GetWifiRemoteStationManager() const;
 
@@ -94,9 +94,9 @@
      * between the TX width of the protected data frame and the maximum width supported
      * by the solicited station.
      *
-     * \param muRts the MU-RTS Trigger Frame
-     * \param txWidth the TX width of the protected data frame
-     * \param receiver the MAC address of the solicited station
+     * @param muRts the MU-RTS Trigger Frame
+     * @param txWidth the TX width of the protected data frame
+     * @param receiver the MAC address of the solicited station
      */
     void AddUserInfoToMuRts(CtrlTriggerHeader& muRts,
                             MHz_u txWidth,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-psdu.cc ns-3.44/src/wifi/model/wifi-psdu.cc
--- ns-3.43/src/wifi/model/wifi-psdu.cc	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/model/wifi-psdu.cc	2025-03-09 16:55:49.803372600 -0700
@@ -107,7 +107,7 @@
     {
         if (m_mpduList.at(i)->GetHeader().GetAddr1() != ra)
         {
-            NS_ABORT_MSG("MPDUs in an A-AMPDU must have the same receiver address");
+            NS_ABORT_MSG("MPDUs in an A-MPDU must have the same receiver address");
         }
     }
     return ra;
@@ -122,7 +122,7 @@
     {
         if (m_mpduList.at(i)->GetHeader().GetAddr2() != ta)
         {
-            NS_ABORT_MSG("MPDUs in an A-AMPDU must have the same transmitter address");
+            NS_ABORT_MSG("MPDUs in an A-MPDU must have the same transmitter address");
         }
     }
     return ta;
@@ -163,6 +163,16 @@
     }
 }
 
+void
+WifiPsdu::IncrementRetryCount()
+{
+    NS_LOG_FUNCTION(this);
+    for (auto& mpdu : m_mpduList)
+    {
+        mpdu->IncrementRetryCount();
+    }
+}
+
 std::set<uint8_t>
 WifiPsdu::GetTids() const
 {
@@ -368,4 +378,40 @@
     return os;
 }
 
+std::ostream&
+operator<<(std::ostream& os, const WifiPsduMap& psduMap)
+{
+    for (const auto& [staId, psdu] : psduMap)
+    {
+        if (staId != SU_STA_ID)
+        {
+            os << "[PSDU for STA_ID=" << staId << ", ";
+        }
+        psdu->Print(os);
+        if (staId != SU_STA_ID)
+        {
+            os << "]";
+        }
+    }
+    return os;
+}
+
+std::ostream&
+operator<<(std::ostream& os, const WifiConstPsduMap& psduMap)
+{
+    for (const auto& [staId, psdu] : psduMap)
+    {
+        if (staId != SU_STA_ID)
+        {
+            os << "[PSDU for STA_ID=" << staId << ", ";
+        }
+        psdu->Print(os);
+        if (staId != SU_STA_ID)
+        {
+            os << "]";
+        }
+    }
+    return os;
+}
+
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-psdu.h ns-3.44/src/wifi/model/wifi-psdu.h
--- ns-3.43/src/wifi/model/wifi-psdu.h	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/model/wifi-psdu.h	2025-03-09 16:55:49.803372600 -0700
@@ -15,6 +15,7 @@
 #include "ns3/nstime.h"
 
 #include <set>
+#include <unordered_map>
 #include <vector>
 
 namespace ns3
@@ -23,7 +24,7 @@
 class Packet;
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * WifiPsdu stores an MPDU, S-MPDU or A-MPDU, by keeping header(s) and
  * payload(s) separate for each constituent MPDU.
@@ -36,8 +37,8 @@
      * frames that do not have to keep an associated lifetime and are not stored
      * in an S-MPDU.
      *
-     * \param p the payload of the MPDU.
-     * \param header the Wifi MAC header of the MPDU.
+     * @param p the payload of the MPDU.
+     * @param header the Wifi MAC header of the MPDU.
      */
     WifiPsdu(Ptr<const Packet> p, const WifiMacHeader& header);
 
@@ -45,8 +46,8 @@
      * Create a PSDU storing an MPDU or S-MPDU. Typically used for QoS data
      * frames that have to keep an associated lifetime.
      *
-     * \param mpdu the MPDU.
-     * \param isSingle true for an S-MPDU
+     * @param mpdu the MPDU.
+     * @param isSingle true for an S-MPDU
      */
     WifiPsdu(Ptr<WifiMpdu> mpdu, bool isSingle);
 
@@ -54,15 +55,15 @@
      * Create a PSDU storing an MPDU or S-MPDU. Typically used for QoS data
      * frames that have to keep an associated lifetime.
      *
-     * \param mpdu the MPDU.
-     * \param isSingle true for an S-MPDU
+     * @param mpdu the MPDU.
+     * @param isSingle true for an S-MPDU
      */
     WifiPsdu(Ptr<const WifiMpdu> mpdu, bool isSingle);
 
     /**
      * Create a PSDU storing an S-MPDU or A-MPDU.
      *
-     * \param mpduList the list of constituent MPDUs.
+     * @param mpduList the list of constituent MPDUs.
      */
     WifiPsdu(std::vector<Ptr<WifiMpdu>> mpduList);
 
@@ -70,92 +71,97 @@
 
     /**
      * Return true if the PSDU is an S-MPDU
-     * \return true if the PSDU is an S-MPDU.
+     * @return true if the PSDU is an S-MPDU.
      */
     bool IsSingle() const;
 
     /**
      * Return true if the PSDU is an S-MPDU or A-MPDU
-     * \return true if the PSDU is an S-MPDU or A-MPDU.
+     * @return true if the PSDU is an S-MPDU or A-MPDU.
      */
     bool IsAggregate() const;
 
     /**
-     * \brief Get the PSDU as a single packet
-     * \return the PSDU.
+     * @brief Get the PSDU as a single packet
+     * @return the PSDU.
      */
     Ptr<const Packet> GetPacket() const;
 
     /**
-     * \brief Get the header of the i-th MPDU
-     * \param i index in the list of MPDUs
-     * \return the header of the i-th MPDU.
+     * @brief Get the header of the i-th MPDU
+     * @param i index in the list of MPDUs
+     * @return the header of the i-th MPDU.
      */
     const WifiMacHeader& GetHeader(std::size_t i) const;
 
     /**
-     * \brief Get the header of the i-th MPDU
-     * \param i index in the list of MPDUs
-     * \return the header of the i-th MPDU.
+     * @brief Get the header of the i-th MPDU
+     * @param i index in the list of MPDUs
+     * @return the header of the i-th MPDU.
      */
     WifiMacHeader& GetHeader(std::size_t i);
 
     /**
-     * \brief Get the payload of the i-th MPDU
-     * \param i index in the list of MPDUs
-     * \return the payload of the i-th MPDU.
+     * @brief Get the payload of the i-th MPDU
+     * @param i index in the list of MPDUs
+     * @return the payload of the i-th MPDU.
      */
     Ptr<const Packet> GetPayload(std::size_t i) const;
 
     /**
-     * \brief Get a copy of the i-th A-MPDU subframe (includes subframe header, MPDU, and possibly
+     * @brief Get a copy of the i-th A-MPDU subframe (includes subframe header, MPDU, and possibly
      * padding)
-     * \param i the index in the list of A-MPDU subframes \return the i-th A-MPDU subframe.
+     * @param i the index in the list of A-MPDU subframes \return the i-th A-MPDU subframe.
      */
     Ptr<Packet> GetAmpduSubframe(std::size_t i) const;
 
     /**
-     * \brief Return the size of the i-th A-MPDU subframe.
-     * \param i the index in the list of A-MPDU subframes
-     * \return the size of the i-th A-MPDU subframe.
+     * @brief Return the size of the i-th A-MPDU subframe.
+     * @param i the index in the list of A-MPDU subframes
+     * @return the size of the i-th A-MPDU subframe.
      */
     std::size_t GetAmpduSubframeSize(std::size_t i) const;
 
     /**
      * Get the Receiver Address (RA), which is common to all the MPDUs
-     * \return the Receiver Address.
+     * @return the Receiver Address.
      */
     Mac48Address GetAddr1() const;
 
     /**
      * Get the Transmitter Address (TA), which is common to all the MPDUs
-     * \return the Transmitter Address.
+     * @return the Transmitter Address.
      */
     Mac48Address GetAddr2() const;
 
     /**
-     * \return true if the Duration/ID field contains a value for setting the NAV
+     * @return true if the Duration/ID field contains a value for setting the NAV
      */
     bool HasNav() const;
 
     /**
      * Get the duration from the Duration/ID field, which is common to all the MPDUs
-     * \return the duration from the Duration/ID field.
+     * @return the duration from the Duration/ID field.
      */
     Time GetDuration() const;
 
     /**
      * Set the Duration/ID field on all the MPDUs
-     * \param duration the value for the Duration/ID field.
+     * @param duration the value for the Duration/ID field.
      */
     void SetDuration(Time duration);
 
     /**
+     * Increment the frame retry count for all the MPDUs.
+     */
+    void IncrementRetryCount();
+
+    /**
      * Get the set of TIDs of the QoS Data frames included in the PSDU. Note that
      * only single-TID A-MPDUs are currently supported, hence the returned set
      * contains at most one TID value.
      *
-     * \return the set of TIDs of the QoS Data frames included in the PSDU.
+     * @return the set of TIDs of the QoS Data frames included in the PSDU.
      */
     std::set<uint8_t> GetTids() const;
 
@@ -165,8 +171,8 @@
      * given TID have the same QoS Ack Policy. Do not call this method if there
      * is no QoS Date frame in the PSDU.
      *
-     * \param tid the given TID
-     * \return the QoS Ack Policy common to all QoS Data frames having the given TID.
+     * @param tid the given TID
+     * @return the QoS Ack Policy common to all QoS Data frames having the given TID.
      */
     WifiMacHeader::QosAckPolicy GetAckPolicyForTid(uint8_t tid) const;
 
@@ -174,8 +180,8 @@
      * Set the QoS Ack Policy of the QoS Data frames included in the PSDU that
      * have the given TID to the given policy.
      *
-     * \param tid the given TID
-     * \param policy the given QoS Ack policy
+     * @param tid the given TID
+     * @param policy the given QoS Ack policy
      */
     void SetAckPolicyForTid(uint8_t tid, WifiMacHeader::QosAckPolicy policy);
 
@@ -185,57 +191,57 @@
      * sequence number. If this  PSDU does not contain any QoS Data frame that
      * is not an old frame, an invalid distance (4096) is returned.
      *
-     * \param startingSeq the given starting sequence number.
-     * \return the maximum distance between the sequence numbers included in the
+     * @param startingSeq the given starting sequence number.
+     * @return the maximum distance between the sequence numbers included in the
      *         PSDU and the given starting sequence number
      */
     uint16_t GetMaxDistFromStartingSeq(uint16_t startingSeq) const;
 
     /**
-     * \brief Return the size of the PSDU in bytes
+     * @brief Return the size of the PSDU in bytes
      *
-     * \return the size of the PSDU.
+     * @return the size of the PSDU.
      */
     uint32_t GetSize() const;
 
     /**
-     * \brief Return the number of MPDUs constituting the PSDU
+     * @brief Return the number of MPDUs constituting the PSDU
      *
-     * \return the number of MPDUs constituting the PSDU.
+     * @return the number of MPDUs constituting the PSDU.
      */
     std::size_t GetNMpdus() const;
 
     /**
-     * \brief Return a const iterator to the first MPDU
+     * @brief Return a const iterator to the first MPDU
      *
-     * \return a const iterator to the first MPDU.
+     * @return a const iterator to the first MPDU.
      */
     std::vector<Ptr<WifiMpdu>>::const_iterator begin() const;
 
     /**
-     * \brief Return an iterator to the first MPDU
+     * @brief Return an iterator to the first MPDU
      *
-     * \return an iterator to the first MPDU.
+     * @return an iterator to the first MPDU.
      */
     std::vector<Ptr<WifiMpdu>>::iterator begin();
 
     /**
-     * \brief Return a const iterator to past-the-last MPDU
+     * @brief Return a const iterator to past-the-last MPDU
      *
-     * \return a const iterator to past-the-last MPDU.
+     * @return a const iterator to past-the-last MPDU.
      */
     std::vector<Ptr<WifiMpdu>>::const_iterator end() const;
 
     /**
-     * \brief Return an iterator to past-the-last MPDU
+     * @brief Return an iterator to past-the-last MPDU
      *
-     * \return an iterator to past-the-last MPDU.
+     * @return an iterator to past-the-last MPDU.
      */
     std::vector<Ptr<WifiMpdu>>::iterator end();
 
     /**
-     * \brief Print the PSDU contents.
-     * \param os output stream in which the data should be printed.
+     * @brief Print the PSDU contents.
+     * @param os output stream in which the data should be printed.
      */
     void Print(std::ostream& os) const;
 
@@ -246,14 +252,38 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the stream
- * \param psdu the PSDU
- * \returns a reference to the stream
+ * @param os the stream
+ * @param psdu the PSDU
+ * @returns a reference to the stream
  */
 std::ostream& operator<<(std::ostream& os, const WifiPsdu& psdu);
 
+/// Map of PSDUs indexed by STA-ID
+using WifiPsduMap = std::unordered_map<uint16_t /* staId */, Ptr<WifiPsdu> /* PSDU */>;
+
+/// Map of const PSDUs indexed by STA-ID
+using WifiConstPsduMap = std::unordered_map<uint16_t /* staId */, Ptr<const WifiPsdu> /* PSDU */>;
+
+/**
+ * @brief Stream insertion operator.
+ *
+ * @param os the stream
+ * @param psduMap the PSDU map
+ * @returns a reference to the stream
+ */
+std::ostream& operator<<(std::ostream& os, const WifiPsduMap& psduMap);
+
+/**
+ * @brief Stream insertion operator.
+ *
+ * @param os the stream
+ * @param psduMap the PSDU map
+ * @returns a reference to the stream
+ */
+std::ostream& operator<<(std::ostream& os, const WifiConstPsduMap& psduMap);
+
 } // namespace ns3
 
 #endif /* WIFI_PSDU_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-radio-energy-model.cc ns-3.44/src/wifi/model/wifi-radio-energy-model.cc
--- ns-3.43/src/wifi/model/wifi-radio-energy-model.cc	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/model/wifi-radio-energy-model.cc	2025-03-09 16:55:49.803372600 -0700
@@ -82,7 +82,7 @@
 WifiRadioEnergyModel::WifiRadioEnergyModel()
     : m_source(nullptr),
       m_currentState(WifiPhyState::IDLE),
-      m_lastUpdateTime(Seconds(0.0)),
+      m_lastUpdateTime(),
       m_nPendingChangeState(0)
 {
     NS_LOG_FUNCTION(this);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-radio-energy-model.h ns-3.44/src/wifi/model/wifi-radio-energy-model.h
--- ns-3.43/src/wifi/model/wifi-radio-energy-model.h	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/model/wifi-radio-energy-model.h	2025-03-09 16:55:49.803372600 -0700
@@ -24,7 +24,7 @@
 class WifiTxCurrentModel;
 
 /**
- * \ingroup energy
+ * @ingroup energy
  * A WifiPhy listener class for notifying the WifiRadioEnergyModel of Wifi radio
  * state change.
  *
@@ -41,16 +41,16 @@
     ~WifiRadioEnergyModelPhyListener() override;
 
     /**
-     * \brief Sets the change state callback. Used by helper class.
+     * @brief Sets the change state callback. Used by helper class.
      *
-     * \param callback Change state callback.
+     * @param callback Change state callback.
      */
     void SetChangeStateCallback(energy::DeviceEnergyModel::ChangeStateCallback callback);
 
     /**
-     * \brief Sets the update TX current callback.
+     * @brief Sets the update TX current callback.
      *
-     * \param callback Update TX current callback.
+     * @param callback Update TX current callback.
      */
     void SetUpdateTxCurrentCallback(UpdateTxCurrentCallback callback);
 
@@ -89,8 +89,8 @@
 };
 
 /**
- * \ingroup energy
- * \brief A WiFi radio energy model.
+ * @ingroup energy
+ * @brief A WiFi radio energy model.
  *
  * 4 states are defined for the radio: TX, RX, IDLE, SLEEP. Default state is
  * IDLE.
@@ -151,24 +151,24 @@
     typedef Callback<void> WifiRadioEnergyRechargedCallback;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     WifiRadioEnergyModel();
     ~WifiRadioEnergyModel() override;
 
     /**
-     * \brief Sets pointer to EnergySource installed on node.
+     * @brief Sets pointer to EnergySource installed on node.
      *
-     * \param source Pointer to EnergySource installed on node.
+     * @param source Pointer to EnergySource installed on node.
      *
      * Implements DeviceEnergyModel::SetEnergySource.
      */
     void SetEnergySource(const Ptr<energy::EnergySource> source) override;
 
     /**
-     * \returns Total energy consumption of the wifi device.
+     * @returns Total energy consumption of the wifi device.
      *
      * Implements DeviceEnergyModel::GetTotalEnergyConsumption.
      */
@@ -176,149 +176,149 @@
 
     // Setter & getters for state power consumption.
     /**
-     * \brief Gets idle current.
+     * @brief Gets idle current.
      *
-     * \returns idle current of the wifi device.
+     * @returns idle current of the wifi device.
      */
     ampere_u GetIdleCurrentA() const;
     /**
-     * \brief Sets idle current.
+     * @brief Sets idle current.
      *
-     * \param idleCurrentA the idle current
+     * @param idleCurrentA the idle current
      */
     void SetIdleCurrentA(ampere_u idleCurrentA);
     /**
-     * \brief Gets CCA busy current.
+     * @brief Gets CCA busy current.
      *
-     * \returns CCA Busy current of the wifi device.
+     * @returns CCA Busy current of the wifi device.
      */
     ampere_u GetCcaBusyCurrentA() const;
     /**
-     * \brief Sets CCA busy current.
+     * @brief Sets CCA busy current.
      *
-     * \param ccaBusyCurrentA the CCA busy current
+     * @param ccaBusyCurrentA the CCA busy current
      */
     void SetCcaBusyCurrentA(ampere_u ccaBusyCurrentA);
     /**
-     * \brief Gets transmit current.
+     * @brief Gets transmit current.
      *
-     * \returns transmit current of the wifi device.
+     * @returns transmit current of the wifi device.
      */
     ampere_u GetTxCurrentA() const;
     /**
-     * \brief Sets transmit current.
+     * @brief Sets transmit current.
      *
-     * \param txCurrentA the transmit current
+     * @param txCurrentA the transmit current
      */
     void SetTxCurrentA(ampere_u txCurrentA);
     /**
-     * \brief Gets receive current.
+     * @brief Gets receive current.
      *
-     * \returns receive current of the wifi device.
+     * @returns receive current of the wifi device.
      */
     ampere_u GetRxCurrentA() const;
     /**
-     * \brief Sets receive current.
+     * @brief Sets receive current.
      *
-     * \param rxCurrentA the receive current
+     * @param rxCurrentA the receive current
      */
     void SetRxCurrentA(ampere_u rxCurrentA);
     /**
-     * \brief Gets switching current.
+     * @brief Gets switching current.
      *
-     * \returns switching current of the wifi device.
+     * @returns switching current of the wifi device.
      */
     ampere_u GetSwitchingCurrentA() const;
     /**
-     * \brief Sets switching current.
+     * @brief Sets switching current.
      *
-     * \param switchingCurrentA the switching current
+     * @param switchingCurrentA the switching current
      */
     void SetSwitchingCurrentA(ampere_u switchingCurrentA);
     /**
-     * \brief Gets sleep current.
+     * @brief Gets sleep current.
      *
-     * \returns sleep current of the wifi device.
+     * @returns sleep current of the wifi device.
      */
     ampere_u GetSleepCurrentA() const;
     /**
-     * \brief Sets sleep current.
+     * @brief Sets sleep current.
      *
-     * \param sleepCurrentA the sleep current
+     * @param sleepCurrentA the sleep current
      */
     void SetSleepCurrentA(ampere_u sleepCurrentA);
 
     /**
-     * \returns Current state.
+     * @returns Current state.
      */
     WifiPhyState GetCurrentState() const;
 
     /**
-     * \param callback Callback function.
+     * @param callback Callback function.
      *
      * Sets callback for energy depletion handling.
      */
     void SetEnergyDepletionCallback(WifiRadioEnergyDepletionCallback callback);
 
     /**
-     * \param callback Callback function.
+     * @param callback Callback function.
      *
      * Sets callback for energy recharged handling.
      */
     void SetEnergyRechargedCallback(WifiRadioEnergyRechargedCallback callback);
 
     /**
-     * \param model the model used to compute the wifi TX current.
+     * @param model the model used to compute the wifi TX current.
      */
     void SetTxCurrentModel(const Ptr<WifiTxCurrentModel> model);
 
     /**
-     * \brief Calls the CalcTxCurrent method of the TX current model to
+     * @brief Calls the CalcTxCurrent method of the TX current model to
      *        compute the TX current based on such model
      *
-     * \param txPower the nominal TX power
+     * @param txPower the nominal TX power
      */
     void SetTxCurrentFromModel(dBm_u txPower);
 
     /**
-     * \brief Changes state of the WifiRadioEnergyMode.
+     * @brief Changes state of the WifiRadioEnergyMode.
      *
-     * \param newState New state the wifi radio is in.
+     * @param newState New state the wifi radio is in.
      *
      * Implements DeviceEnergyModel::ChangeState.
      */
     void ChangeState(int newState) override;
 
     /**
-     * \param state the wifi state
+     * @param state the wifi state
      *
-     * \returns the time the radio can stay in that state based on the remaining energy.
+     * @returns the time the radio can stay in that state based on the remaining energy.
      */
     Time GetMaximumTimeInState(WifiPhyState state) const;
 
     /**
-     * \brief Handles energy depletion.
+     * @brief Handles energy depletion.
      *
      * Implements DeviceEnergyModel::HandleEnergyDepletion
      */
     void HandleEnergyDepletion() override;
 
     /**
-     * \brief Handles energy recharged.
+     * @brief Handles energy recharged.
      *
      * Implements DeviceEnergyModel::HandleEnergyRecharged
      */
     void HandleEnergyRecharged() override;
 
     /**
-     * \brief Handles energy changed.
+     * @brief Handles energy changed.
      *
      * Implements DeviceEnergyModel::HandleEnergyChanged
      */
     void HandleEnergyChanged() override;
 
     /**
-     * \returns Pointer to the PHY listener.
+     * @returns Pointer to the PHY listener.
      */
     std::shared_ptr<WifiRadioEnergyModelPhyListener> GetPhyListener();
 
@@ -326,20 +326,20 @@
     void DoDispose() override;
 
     /**
-     * \param state the wifi state
-     * \returns draw of device at given state.
+     * @param state the wifi state
+     * @returns draw of device at given state.
      */
     ampere_u GetStateA(WifiPhyState state) const;
 
     /**
-     * \returns Current draw of device at current state.
+     * @returns Current draw of device at current state.
      *
      * Implements DeviceEnergyModel::GetCurrentA.
      */
     ampere_u DoGetCurrentA() const override;
 
     /**
-     * \param state New state the radio device is currently in.
+     * @param state New state the radio device is currently in.
      *
      * Sets current state. This function is private so that only the energy model
      * can change its own state.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-remote-station-info.cc ns-3.44/src/wifi/model/wifi-remote-station-info.cc
--- ns-3.43/src/wifi/model/wifi-remote-station-info.cc	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/model/wifi-remote-station-info.cc	2025-03-09 16:55:49.803372600 -0700
@@ -14,8 +14,8 @@
 {
 
 WifiRemoteStationInfo::WifiRemoteStationInfo()
-    : m_memoryTime(Seconds(1.0)),
-      m_lastUpdate(Seconds(0.0)),
+    : m_memoryTime(Seconds(1)),
+      m_lastUpdate(),
       m_failAvg(0.0)
 {
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-remote-station-info.h ns-3.44/src/wifi/model/wifi-remote-station-info.h
--- ns-3.43/src/wifi/model/wifi-remote-station-info.h	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/model/wifi-remote-station-info.h	2025-03-09 16:55:49.803372600 -0700
@@ -16,7 +16,7 @@
 {
 
 /**
- * \brief TID independent remote station statistics
+ * @brief TID independent remote station statistics
  *
  * Structure is similar to struct sta_info in Linux kernel (see
  * net/mac80211/sta_info.h)
@@ -28,9 +28,9 @@
     virtual ~WifiRemoteStationInfo();
 
     /**
-     * \brief Updates average frame error rate when data or RTS was transmitted successfully.
+     * @brief Updates average frame error rate when data or RTS was transmitted successfully.
      *
-     * \param retryCounter is SLRC or SSRC value at the moment of success transmission.
+     * @param retryCounter is SLRC or SSRC value at the moment of success transmission.
      */
     void NotifyTxSuccess(uint32_t retryCounter);
     /**
@@ -39,19 +39,19 @@
     void NotifyTxFailed();
     /**
      * Return frame error rate (probability that frame is corrupted due to transmission error).
-     * \returns the frame error rate
+     * @returns the frame error rate
      */
     double GetFrameErrorRate() const;
 
   private:
     /**
-     * \brief Calculate averaging coefficient for frame error rate. Depends on time of the last
+     * @brief Calculate averaging coefficient for frame error rate. Depends on time of the last
      * update.
      *
-     * \attention Calling this method twice gives different results,
+     * @attention Calling this method twice gives different results,
      * because it resets time of last update.
      *
-     * \return average coefficient for frame error rate
+     * @return average coefficient for frame error rate
      */
     double CalculateAveragingCoefficient();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-remote-station-manager.cc ns-3.44/src/wifi/model/wifi-remote-station-manager.cc
--- ns-3.43/src/wifi/model/wifi-remote-station-manager.cc	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/model/wifi-remote-station-manager.cc	2025-03-09 16:55:49.803372600 -0700
@@ -9,12 +9,14 @@
 #include "wifi-remote-station-manager.h"
 
 #include "ap-wifi-mac.h"
+#include "gcr-manager.h"
 #include "sta-wifi-mac.h"
 #include "wifi-mac-header.h"
 #include "wifi-mac-trailer.h"
 #include "wifi-mpdu.h"
 #include "wifi-net-device.h"
 #include "wifi-phy.h"
+#include "wifi-psdu.h"
 #include "wifi-tx-parameters.h"
 
 #include "ns3/boolean.h"
@@ -49,14 +51,29 @@
                           "This value will not have any effect on some rate control algorithms.",
                           UintegerValue(7),
                           MakeUintegerAccessor(&WifiRemoteStationManager::SetMaxSsrc),
-                          MakeUintegerChecker<uint32_t>())
+                          MakeUintegerChecker<uint32_t>(),
+                          TypeId::SupportLevel::OBSOLETE,
+                          "Use WifiMac::FrameRetryLimit instead")
             .AddAttribute("MaxSlrc",
                           "The maximum number of retransmission attempts for any packet with size "
                           "> RtsCtsThreshold. "
                           "This value will not have any effect on some rate control algorithms.",
                           UintegerValue(4),
                           MakeUintegerAccessor(&WifiRemoteStationManager::SetMaxSlrc),
-                          MakeUintegerChecker<uint32_t>())
+                          MakeUintegerChecker<uint32_t>(),
+                          TypeId::SupportLevel::OBSOLETE,
+                          "Use WifiMac::FrameRetryLimit instead")
+            .AddAttribute(
+                "IncrementRetryCountUnderBa",
+                "The 802.11-2020 standard states that the retry count for frames that are part of "
+                "a Block Ack agreement shall not be incremented when a transmission fails. As a "
+                "consequence, frames that are part of a Block Ack agreement are not dropped based "
+                "on the number of retries. Set this attribute to true to override the standard "
+                "behavior and increment the retry count (and eventually drop) frames that are "
+                "part of a Block Ack agreement.",
+                BooleanValue(false),
+                MakeBooleanAccessor(&WifiRemoteStationManager::m_incrRetryCountUnderBa),
+                MakeBooleanChecker())
             .AddAttribute("RtsCtsThreshold",
                           "If the size of the PSDU is bigger than this value, we use an RTS/CTS "
                           "handshake before sending the data frame."
@@ -135,7 +152,8 @@
 }
 
 WifiRemoteStationManager::WifiRemoteStationManager()
-    : m_useNonErpProtection(false),
+    : m_linkId(0),
+      m_useNonErpProtection(false),
       m_useNonHtProtection(false),
       m_shortPreambleEnabled(false),
       m_shortSlotTimeEnabled(false)
@@ -178,6 +196,13 @@
     m_wifiMac = mac;
 }
 
+void
+WifiRemoteStationManager::SetLinkId(uint8_t linkId)
+{
+    NS_LOG_FUNCTION(this << +linkId);
+    m_linkId = linkId;
+}
+
 int64_t
 WifiRemoteStationManager::AssignStreams(int64_t stream)
 {
@@ -271,7 +296,7 @@
 {
     if (auto htConfiguration = m_wifiPhy->GetDevice()->GetHtConfiguration())
     {
-        return htConfiguration->GetLdpcSupported();
+        return htConfiguration->m_ldpcSupported;
     }
     return false;
 }
@@ -281,7 +306,7 @@
 {
     if (auto htConfiguration = m_wifiPhy->GetDevice()->GetHtConfiguration())
     {
-        return htConfiguration->GetShortGuardIntervalSupported();
+        return htConfiguration->m_sgiSupported;
     }
     return false;
 }
@@ -580,21 +605,10 @@
 WifiRemoteStationManager::GetDataTxVector(const WifiMacHeader& header, MHz_u allowedWidth)
 {
     NS_LOG_FUNCTION(this << header << allowedWidth);
-    Mac48Address address = header.GetAddr1();
+    const auto address = header.GetAddr1();
     if (!header.IsMgt() && address.IsGroup())
     {
-        WifiMode mode = GetNonUnicastMode();
-        WifiTxVector v;
-        v.SetMode(mode);
-        v.SetPreambleType(
-            GetPreambleForTransmission(mode.GetModulationClass(), GetShortPreambleEnabled()));
-        v.SetTxPowerLevel(m_defaultTxPowerLevel);
-        v.SetChannelWidth(m_wifiPhy->GetTxBandwidth(mode, allowedWidth));
-        v.SetGuardInterval(GetGuardIntervalForMode(mode, m_wifiPhy->GetDevice()));
-        v.SetNTx(GetNumberOfAntennas());
-        v.SetNss(1);
-        v.SetNess(0);
-        return v;
+        return GetGroupcastTxVector(header, allowedWidth);
     }
     WifiTxVector txVector;
     if (header.IsMgt())
@@ -636,7 +650,7 @@
     Ptr<HeConfiguration> heConfiguration = m_wifiPhy->GetDevice()->GetHeConfiguration();
     if (heConfiguration)
     {
-        txVector.SetBssColor(heConfiguration->GetBssColor());
+        txVector.SetBssColor(heConfiguration->m_bssColor);
     }
     // If both the allowed width and the TXVECTOR channel width are integer multiple
     // of 20 MHz, then the TXVECTOR channel width must not exceed the allowed width
@@ -733,7 +747,9 @@
 WifiTxVector
 WifiRemoteStationManager::GetCtsTxVector(Mac48Address to, WifiMode rtsTxMode) const
 {
-    NS_ASSERT(!to.IsGroup());
+    auto apMac = DynamicCast<ApWifiMac>(m_wifiMac);
+    NS_ASSERT(!to.IsGroup() ||
+              (m_wifiMac && (m_wifiMac->GetTypeOfStation() == AP) && apMac->GetGcrManager()));
     WifiMode ctsMode = GetControlAnswerMode(rtsTxMode);
     WifiTxVector v;
     v.SetMode(ctsMode);
@@ -890,7 +906,7 @@
      *   unless they conflict with the requirement to use the
      *   BSSBasicRateSet parameter.
      *
-     * \todo Note that we're ignoring the last sentence for now, because
+     * @todo Note that we're ignoring the last sentence for now, because
      * there is not yet any manipulation here of PHY options.
      */
     for (const auto& thismode : m_wifiPhy->GetModeList())
@@ -955,11 +971,12 @@
 WifiRemoteStationManager::ReportRtsFailed(const WifiMacHeader& header)
 {
     NS_LOG_FUNCTION(this << header);
-    NS_ASSERT(!header.GetAddr1().IsGroup());
+    const auto recipient = GetIndividuallyAddressedRecipient(m_wifiMac, header);
+    NS_ASSERT(!recipient.IsGroup());
     AcIndex ac = QosUtilsMapTidToAc((header.IsQosData()) ? header.GetQosTid() : 0);
     m_ssrc[ac]++;
-    m_macTxRtsFailed(header.GetAddr1());
-    DoReportRtsFailed(Lookup(header.GetAddr1()));
+    m_macTxRtsFailed(recipient);
+    DoReportRtsFailed(Lookup(recipient));
 }
 
 void
@@ -989,8 +1006,9 @@
                                       double rtsSnr)
 {
     NS_LOG_FUNCTION(this << header << ctsSnr << ctsMode << rtsSnr);
-    NS_ASSERT(!header.GetAddr1().IsGroup());
-    WifiRemoteStation* station = Lookup(header.GetAddr1());
+    const auto recipient = GetIndividuallyAddressedRecipient(m_wifiMac, header);
+    NS_ASSERT(!recipient.IsGroup());
+    WifiRemoteStation* station = Lookup(recipient);
     AcIndex ac = QosUtilsMapTidToAc((header.IsQosData()) ? header.GetQosTid() : 0);
     station->m_state->m_info.NotifyTxSuccess(m_ssrc[ac]);
     m_ssrc[ac] = 0;
@@ -1066,7 +1084,7 @@
 void
 WifiRemoteStationManager::ReportRxOk(Mac48Address address,
                                      RxSignalInfo rxSignalInfo,
-                                     WifiTxVector txVector)
+                                     const WifiTxVector& txVector)
 {
     NS_LOG_FUNCTION(this << address << rxSignalInfo << txVector);
     if (address.IsGroup())
@@ -1102,16 +1120,85 @@
                           dataTxVector.GetNss(GetStaId(address, dataTxVector)));
 }
 
+std::list<Ptr<WifiMpdu>>
+WifiRemoteStationManager::GetMpdusToDropOnTxFailure(Ptr<WifiPsdu> psdu)
+{
+    NS_LOG_FUNCTION(this << *psdu);
+
+    auto* station = Lookup(GetIndividuallyAddressedRecipient(m_wifiMac, psdu->GetHeader(0)));
+
+    DoIncrementRetryCountOnTxFailure(station, psdu);
+    return DoGetMpdusToDropOnTxFailure(station, psdu);
+}
+
+void
+WifiRemoteStationManager::DoIncrementRetryCountOnTxFailure(WifiRemoteStation* station,
+                                                           Ptr<WifiPsdu> psdu)
+{
+    NS_LOG_FUNCTION(this << *psdu);
+
+    // The frame retry count for an MSDU or A-MSDU that is not part of a block ack agreement or
+    // for an MMPDU shall be incremented every time transmission fails for that MSDU, A-MSDU, or
+    // MMPDU, including of an associated RTS (Sec. 10.23.2.12.1 of 802.11-2020).
+    // Frames for which the retry count needs to be incremented:
+    // - management frames
+    // - non-QoS Data frames
+    // - QoS Data frames that are not part of a Block Ack agreement
+    // - QoS Data frames that are part of a Block Ack agreement if the IncrementRetryCountUnderBa
+    //   attribute is set to true
+    const auto& hdr = psdu->GetHeader(0);
+
+    if (hdr.IsMgt() || (hdr.IsData() && !hdr.IsQosData()) ||
+        (hdr.IsQosData() && (!m_wifiMac->GetBaAgreementEstablishedAsOriginator(
+                                hdr.GetAddr1(),
+                                hdr.GetQosTid() || m_incrRetryCountUnderBa))))
+    {
+        psdu->IncrementRetryCount();
+    }
+}
+
+std::list<Ptr<WifiMpdu>>
+WifiRemoteStationManager::DoGetMpdusToDropOnTxFailure(WifiRemoteStation* station,
+                                                      Ptr<WifiPsdu> psdu)
+{
+    NS_LOG_FUNCTION(this << *psdu);
+
+    std::list<Ptr<WifiMpdu>> mpdusToDrop;
+
+    for (const auto& mpdu : *PeekPointer(psdu))
+    {
+        if (mpdu->GetRetryCount() == m_wifiMac->GetFrameRetryLimit())
+        {
+            // this MPDU needs to be dropped
+            mpdusToDrop.push_back(mpdu);
+        }
+    }
+
+    return mpdusToDrop;
+}
+
 bool
 WifiRemoteStationManager::NeedRts(const WifiMacHeader& header, const WifiTxParameters& txParams)
 {
     NS_LOG_FUNCTION(this << header << &txParams);
     auto address = header.GetAddr1();
-    const auto modulationClass = txParams.m_txVector.GetModulationClass();
-    if (address.IsGroup())
+    const auto isGcr = IsGcr(m_wifiMac, header);
+    if (!isGcr && address.IsGroup())
     {
         return false;
     }
+    if (isGcr)
+    {
+        EnumValue<GroupcastProtectionMode> enumValue;
+        auto apMac = DynamicCast<ApWifiMac>(m_wifiMac);
+        apMac->GetGcrManager()->GetAttribute("GcrProtectionMode", enumValue);
+        if (enumValue.Get() != GroupcastProtectionMode::RTS_CTS)
+        {
+            return false;
+        }
+        address = apMac->GetGcrManager()->GetIndividuallyAddressedRecipient(address);
+    }
+    const auto modulationClass = txParams.m_txVector.GetModulationClass();
     if (m_erpProtectionMode == RTS_CTS &&
         ((modulationClass == WIFI_MOD_CLASS_ERP_OFDM) || (modulationClass == WIFI_MOD_CLASS_HT) ||
          (modulationClass == WIFI_MOD_CLASS_VHT) || (modulationClass == WIFI_MOD_CLASS_HE) ||
@@ -1138,33 +1225,43 @@
 }
 
 bool
-WifiRemoteStationManager::NeedCtsToSelf(WifiTxVector txVector)
+WifiRemoteStationManager::NeedCtsToSelf(const WifiTxVector& txVector, const WifiMacHeader& header)
 {
-    WifiMode mode = txVector.GetMode();
-    NS_LOG_FUNCTION(this << mode);
-    if (m_erpProtectionMode == CTS_TO_SELF &&
-        ((mode.GetModulationClass() == WIFI_MOD_CLASS_ERP_OFDM) ||
-         (mode.GetModulationClass() == WIFI_MOD_CLASS_HT) ||
-         (mode.GetModulationClass() == WIFI_MOD_CLASS_VHT) ||
-         (mode.GetModulationClass() == WIFI_MOD_CLASS_HE) ||
-         (mode.GetModulationClass() == WIFI_MOD_CLASS_EHT)) &&
-        m_useNonErpProtection)
+    NS_LOG_FUNCTION(this << txVector << header);
+    if (m_useNonErpProtection && m_erpProtectionMode == CTS_TO_SELF &&
+        ((txVector.GetModulationClass() == WIFI_MOD_CLASS_ERP_OFDM) ||
+         (txVector.GetModulationClass() == WIFI_MOD_CLASS_HT) ||
+         (txVector.GetModulationClass() == WIFI_MOD_CLASS_VHT) ||
+         (txVector.GetModulationClass() == WIFI_MOD_CLASS_HE) ||
+         (txVector.GetModulationClass() == WIFI_MOD_CLASS_EHT)))
     {
         NS_LOG_DEBUG(
             "WifiRemoteStationManager::NeedCtsToSelf returning true to protect non-ERP stations");
         return true;
     }
     else if (m_htProtectionMode == CTS_TO_SELF &&
-             ((mode.GetModulationClass() == WIFI_MOD_CLASS_HT) ||
-              (mode.GetModulationClass() == WIFI_MOD_CLASS_VHT)) &&
+             ((txVector.GetModulationClass() == WIFI_MOD_CLASS_HT) ||
+              (txVector.GetModulationClass() == WIFI_MOD_CLASS_VHT)) &&
              m_useNonHtProtection && !(m_erpProtectionMode != CTS_TO_SELF && m_useNonErpProtection))
     {
         NS_LOG_DEBUG(
             "WifiRemoteStationManager::NeedCtsToSelf returning true to protect non-HT stations");
         return true;
     }
-    else if (!m_useNonErpProtection)
+    else if (IsGcr(m_wifiMac, header))
+    {
+        EnumValue<GroupcastProtectionMode> enumValue;
+        auto apMac = DynamicCast<ApWifiMac>(m_wifiMac);
+        apMac->GetGcrManager()->GetAttribute("GcrProtectionMode", enumValue);
+        if (enumValue.Get() == GroupcastProtectionMode::CTS_TO_SELF)
+        {
+            return true;
+        }
+    }
+    // FIXME: commented out for now
+    /*else if (!m_useNonErpProtection)
     {
+        const auto mode = txVector.GetMode();
         // search for the BSS Basic Rate set, if the used mode is in the basic set then there is no
         // need for CTS To Self
         for (auto i = m_bssBasicRateSet.begin(); i != m_bssBasicRateSet.end(); i++)
@@ -1190,7 +1287,7 @@
         }
         NS_LOG_DEBUG("WifiRemoteStationManager::NeedCtsToSelf returning true");
         return true;
-    }
+    }*/
     return false;
 }
 
@@ -1221,32 +1318,6 @@
 }
 
 bool
-WifiRemoteStationManager::NeedRetransmission(Ptr<const WifiMpdu> mpdu)
-{
-    NS_LOG_FUNCTION(this << *mpdu);
-    NS_ASSERT(!mpdu->GetHeader().GetAddr1().IsGroup());
-    AcIndex ac =
-        QosUtilsMapTidToAc((mpdu->GetHeader().IsQosData()) ? mpdu->GetHeader().GetQosTid() : 0);
-    bool longMpdu = (mpdu->GetSize() > m_rtsCtsThreshold);
-    uint32_t retryCount;
-    uint32_t maxRetryCount;
-    if (longMpdu)
-    {
-        retryCount = m_slrc[ac];
-        maxRetryCount = m_maxSlrc;
-    }
-    else
-    {
-        retryCount = m_ssrc[ac];
-        maxRetryCount = m_maxSsrc;
-    }
-    bool normally = retryCount < maxRetryCount;
-    NS_LOG_DEBUG("WifiRemoteStationManager::NeedRetransmission count: "
-                 << retryCount << " result: " << std::boolalpha << normally);
-    return DoNeedRetransmission(Lookup(mpdu->GetHeader().GetAddr1()), mpdu->GetPacket(), normally);
-}
-
-bool
 WifiRemoteStationManager::NeedFragmentation(Ptr<const WifiMpdu> mpdu)
 {
     NS_LOG_FUNCTION(this << *mpdu);
@@ -1447,7 +1518,7 @@
 
     WifiRemoteStation* station = DoCreateStation();
     station->m_state = LookupState(address).get();
-    station->m_rssiAndUpdateTimePair = std::make_pair(0, Seconds(0));
+    station->m_rssiAndUpdateTimePair = std::make_pair(dBm_u{0}, Seconds(0));
     const_cast<WifiRemoteStationManager*>(this)->m_stations.insert({address, station});
     return station;
 }
@@ -1474,18 +1545,19 @@
 }
 
 void
-WifiRemoteStationManager::AddStationHtCapabilities(Mac48Address from, HtCapabilities htCapabilities)
+WifiRemoteStationManager::AddStationHtCapabilities(Mac48Address from,
+                                                   const HtCapabilities& htCapabilities)
 {
     // Used by all stations to record HT capabilities of remote stations
     NS_LOG_FUNCTION(this << from << htCapabilities);
     auto state = LookupState(from);
     if (htCapabilities.GetSupportedChannelWidth() == 1)
     {
-        state->m_channelWidth = 40;
+        state->m_channelWidth = MHz_u{40};
     }
     else
     {
-        state->m_channelWidth = 20;
+        state->m_channelWidth = MHz_u{20};
     }
     SetQosSupport(from, true);
     for (const auto& mcs : m_wifiPhy->GetMcsList(WIFI_MOD_CLASS_HT))
@@ -1499,19 +1571,29 @@
 }
 
 void
+WifiRemoteStationManager::AddStationExtendedCapabilities(
+    Mac48Address from,
+    const ExtendedCapabilities& extendedCapabilities)
+{
+    NS_LOG_FUNCTION(this << from << extendedCapabilities);
+    auto state = LookupState(from);
+    state->m_extendedCapabilities = Create<const ExtendedCapabilities>(extendedCapabilities);
+}
+
+void
 WifiRemoteStationManager::AddStationVhtCapabilities(Mac48Address from,
-                                                    VhtCapabilities vhtCapabilities)
+                                                    const VhtCapabilities& vhtCapabilities)
 {
     // Used by all stations to record VHT capabilities of remote stations
     NS_LOG_FUNCTION(this << from << vhtCapabilities);
     auto state = LookupState(from);
     if (vhtCapabilities.GetSupportedChannelWidthSet() == 1)
     {
-        state->m_channelWidth = 160;
+        state->m_channelWidth = MHz_u{160};
     }
     else
     {
-        state->m_channelWidth = 80;
+        state->m_channelWidth = MHz_u{80};
     }
     for (uint8_t i = 1; i <= m_wifiPhy->GetMaxSupportedTxSpatialStreams(); i++)
     {
@@ -1527,7 +1609,8 @@
 }
 
 void
-WifiRemoteStationManager::AddStationHeCapabilities(Mac48Address from, HeCapabilities heCapabilities)
+WifiRemoteStationManager::AddStationHeCapabilities(Mac48Address from,
+                                                   const HeCapabilities& heCapabilities)
 {
     // Used by all stations to record HE capabilities of remote stations
     NS_LOG_FUNCTION(this << from << heCapabilities);
@@ -1537,11 +1620,11 @@
     {
         if (heCapabilities.GetChannelWidthSet() & 0x04)
         {
-            state->m_channelWidth = 160;
+            state->m_channelWidth = MHz_u{160};
         }
         else if (heCapabilities.GetChannelWidthSet() & 0x02)
         {
-            state->m_channelWidth = 80;
+            state->m_channelWidth = MHz_u{80};
         }
         // For other cases at 5 GHz, the supported channel width is set by the VHT capabilities
     }
@@ -1549,11 +1632,11 @@
     {
         if (heCapabilities.GetChannelWidthSet() & 0x01)
         {
-            state->m_channelWidth = 40;
+            state->m_channelWidth = MHz_u{40};
         }
         else
         {
-            state->m_channelWidth = 20;
+            state->m_channelWidth = MHz_u{20};
         }
     }
     if (heCapabilities.GetHeSuPpdu1xHeLtf800nsGi())
@@ -1590,7 +1673,7 @@
 
 void
 WifiRemoteStationManager::AddStationEhtCapabilities(Mac48Address from,
-                                                    EhtCapabilities ehtCapabilities)
+                                                    const EhtCapabilities& ehtCapabilities)
 {
     // Used by all stations to record EHT capabilities of remote stations
     NS_LOG_FUNCTION(this << from << ehtCapabilities);
@@ -1629,6 +1712,12 @@
     return LookupState(from)->m_htCapabilities;
 }
 
+Ptr<const ExtendedCapabilities>
+WifiRemoteStationManager::GetStationExtendedCapabilities(const Mac48Address& from)
+{
+    return LookupState(from)->m_extendedCapabilities;
+}
+
 Ptr<const VhtCapabilities>
 WifiRemoteStationManager::GetStationVhtCapabilities(Mac48Address from)
 {
@@ -1872,16 +1961,119 @@
     }
 }
 
-bool
-WifiRemoteStationManager::DoNeedRts(WifiRemoteStation* station, uint32_t size, bool normally)
+WifiTxVector
+WifiRemoteStationManager::GetGroupcastTxVector(const WifiMacHeader& header, MHz_u allowedWidth)
 {
-    return normally;
+    const auto& to = header.GetAddr1();
+    NS_ASSERT(to.IsGroup());
+
+    WifiTxVector groupcastTxVector{};
+    const auto mode = GetNonUnicastMode();
+    groupcastTxVector.SetMode(mode);
+    groupcastTxVector.SetPreambleType(
+        GetPreambleForTransmission(mode.GetModulationClass(), GetShortPreambleEnabled()));
+    groupcastTxVector.SetTxPowerLevel(m_defaultTxPowerLevel);
+    groupcastTxVector.SetChannelWidth(m_wifiPhy->GetTxBandwidth(mode, allowedWidth));
+    groupcastTxVector.SetNTx(GetNumberOfAntennas());
+
+    if (to.IsBroadcast())
+    {
+        return groupcastTxVector;
+    }
+
+    auto apMac = DynamicCast<ApWifiMac>(m_wifiMac);
+    if (!apMac)
+    {
+        return groupcastTxVector;
+    }
+
+    auto gcrManager = apMac->GetGcrManager();
+    if (!gcrManager)
+    {
+        return groupcastTxVector;
+    }
+
+    const auto& groupStas = gcrManager->GetMemberStasForGroupAddress(to);
+    if (groupStas.empty())
+    {
+        return groupcastTxVector;
+    }
+
+    if (!gcrManager->UseConcealment(header))
+    {
+        return groupcastTxVector;
+    }
+
+    // If we are here, that means the mode will be used for the transmission of a groupcast frame
+    // using the GCR service. We should loop over each member STA that is going to receive the
+    // groupcast frame and select the highest possible mode over all STAs.
+    std::optional<WifiMode> groupcastMode;
+    auto maxWidth = allowedWidth;
+    auto maxNss = m_wifiPhy->GetMaxSupportedTxSpatialStreams();
+    std::map<WifiModulationClass, Time> minGisPerMc{/* non-HT OFDM is always 800 ns */
+                                                    {WIFI_MOD_CLASS_HT, NanoSeconds(400)},
+                                                    {WIFI_MOD_CLASS_HE, NanoSeconds(800)}};
+    const std::map<WifiModulationClass, WifiModulationClass> giRefModClass{
+        /* HT/VHT: short or long GI */
+        {WIFI_MOD_CLASS_HT, WIFI_MOD_CLASS_HT},
+        {WIFI_MOD_CLASS_VHT, WIFI_MOD_CLASS_HT},
+        /* HE/EHT: 3 possible GIs */
+        {WIFI_MOD_CLASS_HE, WIFI_MOD_CLASS_HE},
+        {WIFI_MOD_CLASS_EHT, WIFI_MOD_CLASS_HE}};
+    for (const auto& staAddress : groupStas)
+    {
+        // Get the equivalent TXVECTOR if the frame would be a unicast frame to that STA in order to
+        // get what rate would be selected for that STA.
+        WifiMacHeader hdr(WIFI_MAC_QOSDATA);
+        hdr.SetAddr1(staAddress);
+        const auto unicastTxVector = GetDataTxVector(hdr, allowedWidth);
+
+        // update the groupcast mode if:
+        //   - this is the first mode to inspect;
+        //   - this mode has a lower modulation class than the currently selected groupcast mode;
+        //   - when the modulation class is similar, this mode has a lower MCS than the currently
+        //   selected groupcast mode.
+        if (!groupcastMode.has_value() ||
+            (unicastTxVector.GetModulationClass() < groupcastMode->GetModulationClass()) ||
+            ((unicastTxVector.GetModulationClass() == groupcastMode->GetModulationClass()) &&
+             (unicastTxVector.GetMode().GetMcsValue() < groupcastMode->GetMcsValue())))
+        {
+            groupcastMode = unicastTxVector.GetMode();
+        }
+        maxWidth = std::min(unicastTxVector.GetChannelWidth(), maxWidth);
+        maxNss = std::min(unicastTxVector.GetNss(), maxNss);
+        auto mc = unicastTxVector.GetModulationClass();
+        if (const auto it = giRefModClass.find(mc); it != giRefModClass.cend())
+        {
+            mc = it->second;
+        }
+        if (auto it = minGisPerMc.find(mc); it != minGisPerMc.end())
+        {
+            it->second = std::max(unicastTxVector.GetGuardInterval(), it->second);
+        }
+    }
+    NS_ASSERT(groupcastMode.has_value());
+
+    groupcastTxVector.SetMode(*groupcastMode);
+    groupcastTxVector.SetPreambleType(
+        GetPreambleForTransmission(groupcastMode->GetModulationClass(), GetShortPreambleEnabled()));
+    groupcastTxVector.SetChannelWidth(maxWidth);
+    groupcastTxVector.SetNss(maxNss);
+    auto mc = groupcastMode->GetModulationClass();
+    if (const auto it = giRefModClass.find(mc); it != giRefModClass.cend())
+    {
+        mc = it->second;
+    }
+    if (const auto it = minGisPerMc.find(mc); it != minGisPerMc.cend())
+    {
+        groupcastTxVector.SetGuardInterval(it->second);
+    }
+
+    return groupcastTxVector;
 }
 
 bool
-WifiRemoteStationManager::DoNeedRetransmission(WifiRemoteStation* station,
-                                               Ptr<const Packet> packet,
-                                               bool normally)
+WifiRemoteStationManager::DoNeedRts(WifiRemoteStation* station, uint32_t size, bool normally)
 {
     return normally;
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-remote-station-manager.h ns-3.44/src/wifi/model/wifi-remote-station-manager.h
--- ns-3.43/src/wifi/model/wifi-remote-station-manager.h	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/model/wifi-remote-station-manager.h	2025-03-09 16:55:49.803372600 -0700
@@ -9,23 +9,25 @@
 #ifndef WIFI_REMOTE_STATION_MANAGER_H
 #define WIFI_REMOTE_STATION_MANAGER_H
 
+#include "extended-capabilities.h"
 #include "qos-utils.h"
 #include "wifi-mode.h"
 #include "wifi-remote-station-info.h"
 #include "wifi-utils.h"
 
+#include "ns3/common-info-basic-mle.h"
 #include "ns3/data-rate.h"
 #include "ns3/eht-capabilities.h"
 #include "ns3/he-6ghz-band-capabilities.h"
 #include "ns3/he-capabilities.h"
 #include "ns3/ht-capabilities.h"
 #include "ns3/mac48-address.h"
-#include "ns3/multi-link-element.h"
 #include "ns3/object.h"
 #include "ns3/traced-callback.h"
 #include "ns3/vht-capabilities.h"
 
 #include <array>
+#include <list>
 #include <memory>
 #include <optional>
 #include <unordered_map>
@@ -38,6 +40,7 @@
 class WifiMacHeader;
 class Packet;
 class WifiMpdu;
+class WifiPsdu;
 class WifiTxVector;
 class WifiTxParameters;
 
@@ -45,7 +48,7 @@
 struct RxSignalInfo;
 
 /**
- * \brief hold per-remote-station state.
+ * @brief hold per-remote-station state.
  *
  * The state in this class is used to keep track
  * of association status if we are in an infrastructure
@@ -57,7 +60,10 @@
  */
 struct WifiRemoteStation
 {
-    virtual ~WifiRemoteStation(){};
+    virtual ~WifiRemoteStation()
+    {
+    }
+
     WifiRemoteStationState* m_state; //!< Remote station state
     std::pair<dBm_u, Time>
         m_rssiAndUpdateTimePair; //!< RSSI of the most recent packet received from
@@ -99,7 +105,9 @@
     bool m_dsssSupported;              //!< Flag if DSSS is supported by the remote station
     bool m_erpOfdmSupported;           //!< Flag if ERP OFDM is supported by the remote station
     bool m_ofdmSupported;              //!< Flag if OFDM is supported by the remote station
-    Ptr<const HtCapabilities> m_htCapabilities;   //!< remote station HT capabilities
+    Ptr<const HtCapabilities> m_htCapabilities; //!< remote station HT capabilities
+    Ptr<const ExtendedCapabilities>
+        m_extendedCapabilities;                   //!< remote station extended capabilities
     Ptr<const VhtCapabilities> m_vhtCapabilities; //!< remote station VHT capabilities
     Ptr<const HeCapabilities> m_heCapabilities;   //!< remote station HE capabilities
     Ptr<const He6GhzBandCapabilities>
@@ -120,8 +128,8 @@
 };
 
 /**
- * \ingroup wifi
- * \brief hold a list of per-remote-station state.
+ * @ingroup wifi
+ * @brief hold a list of per-remote-station state.
  *
  * \sa ns3::WifiRemoteStation.
  */
@@ -129,8 +137,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -158,168 +166,190 @@
      * Set up PHY associated with this device since it is the object that
      * knows the full set of transmit rates that are supported.
      *
-     * \param phy the PHY of this device
+     * @param phy the PHY of this device
      */
     virtual void SetupPhy(const Ptr<WifiPhy> phy);
     /**
      * Set up MAC associated with this device since it is the object that
      * knows the full set of timing parameters (e.g. IFS).
      *
-     * \param mac the MAC of this device
+     * @param mac the MAC of this device
      */
     virtual void SetupMac(const Ptr<WifiMac> mac);
 
     /**
+     * Set the ID of the link this Remote Station Manager is associated with.
+     *
+     * @param linkId the ID of the link this Remote Station Manager is associated with
+     */
+    void SetLinkId(uint8_t linkId);
+
+    /**
      * Assign a fixed random variable stream number to the random variables
      * used by this model.  Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     virtual int64_t AssignStreams(int64_t stream);
 
     /**
      * Sets the maximum STA short retry count (SSRC).
      *
-     * \param maxSsrc the maximum SSRC
+     * @param maxSsrc the maximum SSRC
      */
     void SetMaxSsrc(uint32_t maxSsrc);
     /**
      * Sets the maximum STA long retry count (SLRC).
      *
-     * \param maxSlrc the maximum SLRC
+     * @param maxSlrc the maximum SLRC
      */
     void SetMaxSlrc(uint32_t maxSlrc);
     /**
      * Sets the RTS threshold.
      *
-     * \param threshold the RTS threshold
+     * @param threshold the RTS threshold
      */
     void SetRtsCtsThreshold(uint32_t threshold);
 
     /**
      * Return the fragmentation threshold.
      *
-     * \return the fragmentation threshold
+     * @return the fragmentation threshold
      */
     uint32_t GetFragmentationThreshold() const;
     /**
      * Sets a fragmentation threshold. The method calls a private method
      * DoSetFragmentationThreshold that checks the validity of the value given.
      *
-     * \param threshold the fragmentation threshold
+     * @param threshold the fragmentation threshold
      */
     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
+     * @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
-     * \param qosSupported whether the station supports QoS
+     * @param from the address of the station being recorded
+     * @param qosSupported whether the station supports QoS
      */
     void SetQosSupport(Mac48Address from, bool qosSupported);
     /**
-     * \param from the address of the station being recorded
-     * \param emlsrEnabled whether EMLSR mode is enabled for the station on this link
+     * @param from the address of the station being recorded
+     * @param emlsrEnabled whether EMLSR mode is enabled for the station on this link
      */
     void SetEmlsrEnabled(const Mac48Address& from, bool emlsrEnabled);
     /**
      * Records HT capabilities of the remote station.
      *
-     * \param from the address of the station being recorded
-     * \param htCapabilities the HT capabilities of the station
+     * @param from the address of the station being recorded
+     * @param htCapabilities the HT capabilities of the station
      */
-    void AddStationHtCapabilities(Mac48Address from, HtCapabilities htCapabilities);
+    void AddStationHtCapabilities(Mac48Address from, const HtCapabilities& htCapabilities);
+    /**
+     * Records extended capabilities of the remote station.
+     *
+     * @param from the address of the station being recorded
+     * @param extendedCapabilities the extended capabilities of the station
+     */
+    void AddStationExtendedCapabilities(Mac48Address from,
+                                        const ExtendedCapabilities& extendedCapabilities);
     /**
      * Records VHT capabilities of the remote station.
      *
-     * \param from the address of the station being recorded
-     * \param vhtCapabilities the VHT capabilities of the station
+     * @param from the address of the station being recorded
+     * @param vhtCapabilities the VHT capabilities of the station
      */
-    void AddStationVhtCapabilities(Mac48Address from, VhtCapabilities vhtCapabilities);
+    void AddStationVhtCapabilities(Mac48Address from, const VhtCapabilities& vhtCapabilities);
     /**
      * Records HE capabilities of the remote station.
      *
-     * \param from the address of the station being recorded
-     * \param heCapabilities the HE capabilities of the station
+     * @param from the address of the station being recorded
+     * @param heCapabilities the HE capabilities of the station
      */
-    void AddStationHeCapabilities(Mac48Address from, HeCapabilities heCapabilities);
+    void AddStationHeCapabilities(Mac48Address from, const HeCapabilities& heCapabilities);
     /**
      * Records HE 6 GHz Band Capabilities of a remote station
      *
-     * \param from the address of the remote station
-     * \param he6GhzCapabilities the HE 6 GHz Band Capabilities of the remote station
+     * @param from the address of the remote station
+     * @param he6GhzCapabilities the HE 6 GHz Band Capabilities of the remote station
      */
     void AddStationHe6GhzCapabilities(const Mac48Address& from,
                                       const He6GhzBandCapabilities& he6GhzCapabilities);
     /**
      * Records EHT capabilities of the remote station.
      *
-     * \param from the address of the station being recorded
-     * \param ehtCapabilities the EHT capabilities of the station
+     * @param from the address of the station being recorded
+     * @param ehtCapabilities the EHT capabilities of the station
      */
-    void AddStationEhtCapabilities(Mac48Address from, EhtCapabilities ehtCapabilities);
+    void AddStationEhtCapabilities(Mac48Address from, const EhtCapabilities& ehtCapabilities);
     /**
      * Records the Common Info field advertised by the given remote station in a Multi-Link
      * Element. It includes the MLD address of the remote station.
      *
-     * \param from the address of the station being recorded
-     * \param mleCommonInfo the MLE Common Info advertised by the station
+     * @param from the address of the station being recorded
+     * @param mleCommonInfo the MLE Common Info advertised by the station
      */
     void AddStationMleCommonInfo(Mac48Address from,
                                  const std::shared_ptr<CommonInfoBasicMle>& mleCommonInfo);
     /**
      * Return the HT capabilities sent by the remote station.
      *
-     * \param from the address of the remote station
-     * \return the HT capabilities sent by the remote station
+     * @param from the address of the remote station
+     * @return the HT capabilities sent by the remote station
      */
     Ptr<const HtCapabilities> GetStationHtCapabilities(Mac48Address from);
     /**
+     * Return the extended capabilities sent by the remote station.
+     *
+     * @param from the address of the remote station
+     * @return the extended capabilities sent by the remote station
+     */
+    Ptr<const ExtendedCapabilities> GetStationExtendedCapabilities(const Mac48Address& from);
+    /**
      * Return the VHT capabilities sent by the remote station.
      *
-     * \param from the address of the remote station
-     * \return the VHT capabilities sent by the remote station
+     * @param from the address of the remote station
+     * @return the VHT capabilities sent by the remote station
      */
     Ptr<const VhtCapabilities> GetStationVhtCapabilities(Mac48Address from);
     /**
      * Return the HE capabilities sent by the remote station.
      *
-     * \param from the address of the remote station
-     * \return the HE capabilities sent by the remote station
+     * @param from the address of the remote station
+     * @return the HE capabilities sent by the remote station
      */
     Ptr<const HeCapabilities> GetStationHeCapabilities(Mac48Address from);
     /**
      * Return the HE 6 GHz Band Capabilities sent by a remote station.
      *
-     * \param from the address of the remote station
-     * \return the HE 6 GHz Band capabilities sent by the remote station
+     * @param from the address of the remote station
+     * @return the HE 6 GHz Band capabilities sent by the remote station
      */
     Ptr<const He6GhzBandCapabilities> GetStationHe6GhzCapabilities(const Mac48Address& from) const;
     /**
      * Return the EHT capabilities sent by the remote station.
      *
-     * \param from the address of the remote station
-     * \return the EHT capabilities sent by the remote station
+     * @param from the address of the remote station
+     * @return the EHT capabilities sent by the remote station
      */
     Ptr<const EhtCapabilities> GetStationEhtCapabilities(Mac48Address from);
     /**
-     * \param from the (MLD or link) address of the remote non-AP MLD
-     * \return the EML Capabilities advertised by the remote non-AP MLD
+     * @param from the (MLD or link) address of the remote non-AP MLD
+     * @return the EML Capabilities advertised by the remote non-AP MLD
      */
     std::optional<std::reference_wrapper<CommonInfoBasicMle::EmlCapabilities>>
     GetStationEmlCapabilities(const Mac48Address& from);
     /**
-     * \param from the (MLD or link) address of the remote non-AP MLD
-     * \return the MLD Capabilities advertised by the remote non-AP MLD
+     * @param from the (MLD or link) address of the remote non-AP MLD
+     * @return the MLD Capabilities advertised by the remote non-AP MLD
      */
     std::optional<std::reference_wrapper<CommonInfoBasicMle::MldCapabilities>>
     GetStationMldCapabilities(const Mac48Address& from);
@@ -328,7 +358,7 @@
      * associated with. Note that this means that this function returns false if this is a
      * 6 GHz link.
      *
-     * \return true if HT capability support is enabled, false otherwise
+     * @return true if HT capability support is enabled, false otherwise
      */
     bool GetHtSupported() const;
     /**
@@ -336,88 +366,88 @@
      * associated with. Note that this means that this function returns false if this is a
      * 2.4 or 6 GHz link.
      *
-     * \return true if VHT capability support is enabled, false otherwise
+     * @return true if VHT capability support is enabled, false otherwise
      */
     bool GetVhtSupported() const;
     /**
      * Return whether the device has HE capability support enabled.
      *
-     * \return true if HE capability support is enabled, false otherwise
+     * @return true if HE capability support is enabled, false otherwise
      */
     bool GetHeSupported() const;
     /**
      * Return whether the device has EHT capability support enabled.
      *
-     * \return true if EHT capability support is enabled, false otherwise
+     * @return true if EHT capability support is enabled, false otherwise
      */
     bool GetEhtSupported() const;
     /**
      * Return whether the device has LDPC support enabled.
      *
-     * \return true if LDPC support is enabled, false otherwise
+     * @return true if LDPC support is enabled, false otherwise
      */
     bool GetLdpcSupported() const;
     /**
      * Return whether the device has SGI support enabled.
      *
-     * \return true if SGI support is enabled, false otherwise
+     * @return true if SGI support is enabled, false otherwise
      */
     bool GetShortGuardIntervalSupported() const;
     /**
-     * Return the supported HE guard interval duration.
+     * Return the shortest supported HE guard interval duration.
      *
-     * \return the supported HE guard interval duration
+     * @return the shortest supported HE guard interval duration
      */
     Time GetGuardInterval() const;
     /**
      * Enable or disable protection for non-ERP stations.
      *
-     * \param enable enable or disable protection for non-ERP stations
+     * @param enable enable or disable protection for non-ERP stations
      */
     void SetUseNonErpProtection(bool enable);
     /**
      * Return whether the device supports protection of non-ERP stations.
      *
-     * \return true if protection for non-ERP stations is enabled,
+     * @return true if protection for non-ERP stations is enabled,
      *         false otherwise
      */
     bool GetUseNonErpProtection() const;
     /**
      * Enable or disable protection for non-HT stations.
      *
-     * \param enable enable or disable protection for non-HT stations
+     * @param enable enable or disable protection for non-HT stations
      */
     void SetUseNonHtProtection(bool enable);
     /**
      * Return whether the device supports protection of non-HT stations.
      *
-     * \return true if protection for non-HT stations is enabled,
+     * @return true if protection for non-HT stations is enabled,
      *         false otherwise
      */
     bool GetUseNonHtProtection() const;
     /**
      * Enable or disable short PHY preambles.
      *
-     * \param enable enable or disable short PHY preambles
+     * @param enable enable or disable short PHY preambles
      */
     void SetShortPreambleEnabled(bool enable);
     /**
      * Return whether the device uses short PHY preambles.
      *
-     * \return true if short PHY preambles are enabled,
+     * @return true if short PHY preambles are enabled,
      *         false otherwise
      */
     bool GetShortPreambleEnabled() const;
     /**
      * Enable or disable short slot time.
      *
-     * \param enable enable or disable short slot time
+     * @param enable enable or disable short slot time
      */
     void SetShortSlotTimeEnabled(bool enable);
     /**
      * Return whether the device uses short slot time.
      *
-     * \return true if short slot time is enabled,
+     * @return true if short slot time is enabled,
      *         false otherwise
      */
     bool GetShortSlotTimeEnabled() const;
@@ -432,250 +462,259 @@
      * BSSBasicRateSet of the associated AP and which are supported locally.
      * Invoked in an AP to configure the BSSBasicRateSet.
      *
-     * \param mode the WifiMode to be added to the basic mode set
+     * @param mode the WifiMode to be added to the basic mode set
      */
     void AddBasicMode(WifiMode mode);
     /**
      * Return the default transmission mode.
      *
-     * \return WifiMode the default transmission mode
+     * @return WifiMode the default transmission mode
      */
     WifiMode GetDefaultMode() const;
     /**
      * Return the number of basic modes we support.
      *
-     * \return the number of basic modes we support
+     * @return the number of basic modes we support
      */
     uint8_t GetNBasicModes() const;
     /**
      * Return a basic mode from the set of basic modes.
      *
-     * \param i index of the basic mode in the basic mode set
+     * @param i index of the basic mode in the basic mode set
      *
-     * \return the basic mode at the given index
+     * @return the basic mode at the given index
      */
     WifiMode GetBasicMode(uint8_t i) const;
     /**
      * Return the number of non-ERP basic modes we support.
      *
-     * \return the number of basic modes we support
+     * @return the number of basic modes we support
      */
     uint32_t GetNNonErpBasicModes() const;
     /**
      * Return a basic mode from the set of basic modes that is not an ERP mode.
      *
-     * \param i index of the basic mode in the basic mode set
+     * @param i index of the basic mode in the basic mode set
      *
-     * \return the basic mode at the given index
+     * @return the basic mode at the given index
      */
     WifiMode GetNonErpBasicMode(uint8_t i) const;
     /**
      * Return whether the station supports LDPC or not.
      *
-     * \param address the address of the station
+     * @param address the address of the station
      *
-     * \return true if LDPC is supported by the station,
+     * @return true if LDPC is supported by the station,
      *         false otherwise
      */
     bool GetLdpcSupported(Mac48Address address) const;
     /**
      * Return whether the station supports short PHY preamble or not.
      *
-     * \param address the address of the station
+     * @param address the address of the station
      *
-     * \return true if short PHY preamble is supported by the station,
+     * @return true if short PHY preamble is supported by the station,
      *         false otherwise
      */
     bool GetShortPreambleSupported(Mac48Address address) const;
     /**
      * Return whether the station supports short ERP slot time or not.
      *
-     * \param address the address of the station
+     * @param address the address of the station
      *
-     * \return true if short ERP slot time is supported by the station,
+     * @return true if short ERP slot time is supported by the station,
      *         false otherwise
      */
     bool GetShortSlotTimeSupported(Mac48Address address) const;
     /**
      * Return whether the given station is QoS capable.
      *
-     * \param address the address of the station
+     * @param address the address of the station
      *
-     * \return true if the station has QoS capabilities,
+     * @return true if the station has QoS capabilities,
      *         false otherwise
      */
     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
+     * @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.
      *
-     * \param mcs the WifiMode to be added to the basic MCS set
+     * @param mcs the WifiMode to be added to the basic MCS set
      */
     void AddBasicMcs(WifiMode mcs);
     /**
      * Return the default Modulation and Coding Scheme (MCS) index.
      *
-     * \return the default WifiMode
+     * @return the default WifiMode
      */
     WifiMode GetDefaultMcs() const;
     /**
      * Return the default MCS to use to transmit frames to the given station.
      *
-     * \param st the given station
-     * \return the default MCS to use to transmit frames to the given station
+     * @param st the given station
+     * @return the default MCS to use to transmit frames to the given station
      */
     WifiMode GetDefaultModeForSta(const WifiRemoteStation* st) const;
     /**
      * Return the number of basic MCS index.
      *
-     * \return the number of basic MCS index
+     * @return the number of basic MCS index
      */
     uint8_t GetNBasicMcs() const;
     /**
      * Return the MCS at the given <i>list</i> index.
      *
-     * \param i the position in the list
+     * @param i the position in the list
      *
-     * \return the basic MCS at the given list index
+     * @return the basic MCS at the given list index
      */
     WifiMode GetBasicMcs(uint8_t i) const;
     /**
      * Record the MCS index supported by the station.
      *
-     * \param address the address of the station
-     * \param mcs the WifiMode supported by the station
+     * @param address the address of the station
+     * @param mcs the WifiMode supported by the station
      */
     void AddSupportedMcs(Mac48Address address, WifiMode mcs);
     /**
      * Return the channel width supported by the station.
      *
-     * \param address the address of the station
+     * @param address the address of the station
      *
-     * \return the channel width supported by the station
+     * @return the channel width supported by the station
      */
     MHz_u GetChannelWidthSupported(Mac48Address address) const;
     /**
      * Return whether the station supports HT/VHT short guard interval.
      *
-     * \param address the address of the station
+     * @param address the address of the station
      *
-     * \return true if the station supports HT/VHT short guard interval,
+     * @return true if the station supports HT/VHT short guard interval,
      *         false otherwise
      */
     bool GetShortGuardIntervalSupported(Mac48Address address) const;
     /**
      * Return the number of spatial streams supported by the station.
      *
-     * \param address the address of the station
+     * @param address the address of the station
      *
-     * \return the number of spatial streams supported by the station
+     * @return the number of spatial streams supported by the station
      */
     uint8_t GetNumberOfSupportedStreams(Mac48Address address) const;
     /**
      * Return the number of MCS supported by the station.
      *
-     * \param address the address of the station
+     * @param address the address of the station
      *
-     * \return the number of MCS supported by the station
+     * @return the number of MCS supported by the station
      */
     uint8_t GetNMcsSupported(Mac48Address address) const;
     /**
      * Return whether the station supports DSSS or not.
      *
-     * \param address the address of the station
+     * @param address the address of the station
      *
-     * \return true if DSSS is supported by the station,
+     * @return true if DSSS is supported by the station,
      *         false otherwise
      */
     bool GetDsssSupported(const Mac48Address& address) const;
     /**
      * Return whether the station supports ERP OFDM or not.
      *
-     * \param address the address of the station
+     * @param address the address of the station
      *
-     * \return true if ERP OFDM is supported by the station,
+     * @return true if ERP OFDM is supported by the station,
      *         false otherwise
      */
     bool GetErpOfdmSupported(const Mac48Address& address) const;
     /**
      * Return whether the station supports OFDM or not.
      *
-     * \param address the address of the station
+     * @param address the address of the station
      *
-     * \return true if OFDM is supported by the station,
+     * @return true if OFDM is supported by the station,
      *         false otherwise
      */
     bool GetOfdmSupported(const Mac48Address& address) const;
     /**
      * Return whether the station supports HT or not.
      *
-     * \param address the address of the station
+     * @param address the address of the station
      *
-     * \return true if HT is supported by the station,
+     * @return true if HT is supported by the station,
      *         false otherwise
      */
     bool GetHtSupported(Mac48Address address) const;
     /**
      * Return whether the station supports VHT or not.
      *
-     * \param address the address of the station
+     * @param address the address of the station
      *
-     * \return true if VHT is supported by the station,
+     * @return true if VHT is supported by the station,
      *         false otherwise
      */
     bool GetVhtSupported(Mac48Address address) const;
     /**
      * Return whether the station supports HE or not.
      *
-     * \param address the address of the station
+     * @param address the address of the station
      *
-     * \return true if HE is supported by the station,
+     * @return true if HE is supported by the station,
      *         false otherwise
      */
     bool GetHeSupported(Mac48Address address) const;
     /**
      * Return whether the station supports EHT or not.
      *
-     * \param address the address of the station
+     * @param address the address of the station
      *
-     * \return true if EHT is supported by the station,
+     * @return true if EHT is supported by the station,
      *         false otherwise
      */
     bool GetEhtSupported(Mac48Address address) const;
     /**
-     * \param address the (MLD or link) address of the non-AP MLD
-     * \return whether the non-AP MLD supports EMLSR
+     * @param address the (MLD or link) address of the non-AP MLD
+     * @return whether the non-AP MLD supports EMLSR
      */
     bool GetEmlsrSupported(const Mac48Address& address) const;
     /**
-     * \param address the (MLD or link) address of the non-AP MLD
-     * \return whether EMLSR mode is enabled for the non-AP MLD on this link
+     * @param address the (MLD or link) address of the non-AP MLD
+     * @return whether EMLSR mode is enabled for the non-AP MLD on this link
      */
     bool GetEmlsrEnabled(const Mac48Address& address) const;
 
     /**
      * Return a mode for non-unicast packets.
      *
-     * \return WifiMode for non-unicast packets
+     * @return WifiMode for non-unicast packets
      */
     WifiMode GetNonUnicastMode() const;
 
     /**
+     * Return the TXVECTOR to use for a groupcast packet.
+     *
+     * @param header the MAC header of the groupcast packet
+     * @param allowedWidth the allowed width in MHz to send this packet
+     * @return the TXVECTOR to use to send the groupcast packet
+     */
+    WifiTxVector GetGroupcastTxVector(const WifiMacHeader& header, MHz_u allowedWidth);
+
+    /**
      * Invoked in a STA or AP to store the set of
      * modes supported by a destination which is
      * also supported locally.
      * The set of supported modes includes
      * the BSSBasicRateSet.
      *
-     * \param address the address of the station being recorded
-     * \param mode the WifiMode supports by the station
+     * @param address the address of the station being recorded
+     * @param mode the WifiMode supports by the station
      */
     void AddSupportedMode(Mac48Address address, WifiMode mode);
     /**
@@ -683,52 +722,52 @@
      * by a destination which is also supported locally.
      * The set of supported modes includes the BSSBasicRateSet.
      *
-     * \param address the address of the station being recorded
+     * @param address the address of the station being recorded
      */
     void AddAllSupportedModes(Mac48Address address);
     /**
      * Invoked in a STA or AP to store all of the MCS supported
      * by a destination which is also supported locally.
      *
-     * \param address the address of the station being recorded
+     * @param address the address of the station being recorded
      */
     void AddAllSupportedMcs(Mac48Address address);
     /**
      * Invoked in a STA or AP to delete all of the supported MCS by a destination.
      *
-     * \param address the address of the station being recorded
+     * @param address the address of the station being recorded
      */
     void RemoveAllSupportedMcs(Mac48Address address);
     /**
      * Record whether the short PHY preamble is supported by the station.
      *
-     * \param address the address of the station
-     * \param isShortPreambleSupported whether or not short PHY preamble is supported by the station
+     * @param address the address of the station
+     * @param isShortPreambleSupported whether or not short PHY preamble is supported by the station
      */
     void AddSupportedPhyPreamble(Mac48Address address, bool isShortPreambleSupported);
     /**
      * Record whether the short ERP slot time is supported by the station.
      *
-     * \param address the address of the station
-     * \param isShortSlotTimeSupported whether or not short ERP slot time is supported by the
+     * @param address the address of the station
+     * @param isShortSlotTimeSupported whether or not short ERP slot time is supported by the
      * station
      */
     void AddSupportedErpSlotTime(Mac48Address address, bool isShortSlotTimeSupported);
     /**
      * Return whether the station state is brand new.
      *
-     * \param address the address of the station
+     * @param address the address of the station
      *
-     * \return true if the state of the station is brand new,
+     * @return true if the state of the station is brand new,
      *         false otherwise
      */
     bool IsBrandNew(Mac48Address address) const;
     /**
      * Return whether the station associated.
      *
-     * \param address the address of the station
+     * @param address the address of the station
      *
-     * \return true if the station is associated,
+     * @return true if the station is associated,
      *         false otherwise
      */
     bool IsAssociated(Mac48Address address) const;
@@ -736,9 +775,9 @@
      * Return whether we are waiting for an ACK for
      * the association response we sent.
      *
-     * \param address the address of the station
+     * @param address the address of the station
      *
-     * \return true if the station is associated,
+     * @return true if the station is associated,
      *         false otherwise
      */
     bool IsWaitAssocTxOk(Mac48Address address) const;
@@ -746,56 +785,56 @@
      * Records that we are waiting for an ACK for
      * the association response we sent.
      *
-     * \param address the address of the station
+     * @param address the address of the station
      */
     void RecordWaitAssocTxOk(Mac48Address address);
     /**
      * Records that we got an ACK for
      * the association response we sent.
      *
-     * \param address the address of the station
+     * @param address the address of the station
      */
     void RecordGotAssocTxOk(Mac48Address address);
     /**
      * Records that we missed an ACK for
      * the association response we sent.
      *
-     * \param address the address of the station
+     * @param address the address of the station
      */
     void RecordGotAssocTxFailed(Mac48Address address);
     /**
      * Records that the STA was disassociated.
      *
-     * \param address the address of the station
+     * @param address the address of the station
      */
     void RecordDisassociated(Mac48Address address);
     /**
      * Return whether we refused an association request from the given station
      *
-     * \param address the address of the station
-     * \return true if we refused an association request, false otherwise
+     * @param address the address of the station
+     * @return true if we refused an association request, false otherwise
      */
     bool IsAssocRefused(Mac48Address address) const;
     /**
      * Records that association request was refused
      *
-     * \param address the address of the station
+     * @param address the address of the station
      */
     void RecordAssocRefused(Mac48Address address);
 
     /**
      * Return whether the STA is currently in Power Save mode.
      *
-     * \param address the address of the station
+     * @param address the address of the station
      *
-     * \return true if the station is in Power Save mode, false otherwise
+     * @return true if the station is in Power Save mode, false otherwise
      */
     bool IsInPsMode(const Mac48Address& address) const;
     /**
      * Register whether the STA is in Power Save mode or not.
      *
-     * \param address the address of the station
-     * \param isInPsMode whether the STA is in PS mode or not
+     * @param address the address of the station
+     * @param isInPsMode whether the STA is in PS mode or not
      */
     void SetPsMode(const Mac48Address& address, bool isInPsMode);
 
@@ -805,31 +844,31 @@
      * with the given station (which requires both this station and the given
      * station to be MLDs).
      *
-     * \param address the MAC address of the remote station
-     * \return the address of the MLD the given station is affiliated with, if any
+     * @param address the MAC address of the remote station
+     * @return the address of the MLD the given station is affiliated with, if any
      */
     std::optional<Mac48Address> GetMldAddress(const Mac48Address& address) const;
     /**
      * Get the address of the remote station operating on this link and affiliated
      * with the MLD having the given MAC address, if any.
      *
-     * \param mldAddress the MLD MAC address
-     * \return the address of the remote station operating on this link and
+     * @param mldAddress the MLD MAC address
+     * @return the address of the remote station operating on this link and
      *         affiliated with the MLD, if any
      */
     std::optional<Mac48Address> GetAffiliatedStaAddress(const Mac48Address& mldAddress) const;
 
     /**
-     * \param header MAC header
-     * \param allowedWidth the allowed width to send this packet
-     * \return the TXVECTOR to use to send this packet
+     * @param header MAC header
+     * @param allowedWidth the allowed width to send this packet
+     * @return the TXVECTOR to use to send this packet
      */
     WifiTxVector GetDataTxVector(const WifiMacHeader& header, MHz_u allowedWidth);
     /**
-     * \param address remote address
-     * \param allowedWidth the allowed width for the data frame being protected
+     * @param address remote address
+     * @param allowedWidth the allowed width for the data frame being protected
      *
-     * \return the TXVECTOR to use to send the RTS prior to the
+     * @return the TXVECTOR to use to send the RTS prior to the
      *         transmission of the data packet itself.
      */
     WifiTxVector GetRtsTxVector(Mac48Address address, MHz_u allowedWidth);
@@ -837,16 +876,16 @@
      * Return a TXVECTOR for the CTS frame given the destination and the mode of the RTS
      * used by the sender.
      *
-     * \param to the MAC address of the CTS receiver
-     * \param rtsTxMode the mode of the RTS used by the sender
-     * \return TXVECTOR for the CTS
+     * @param to the MAC address of the CTS receiver
+     * @param rtsTxMode the mode of the RTS used by the sender
+     * @return TXVECTOR for the CTS
      */
     WifiTxVector GetCtsTxVector(Mac48Address to, WifiMode rtsTxMode) const;
     /**
      * Since CTS-to-self parameters are not dependent on the station,
      * it is implemented in wifi remote station manager
      *
-     * \return the transmission mode to use to send the CTS-to-self prior to the
+     * @return the transmission mode to use to send the CTS-to-self prior to the
      *         transmission of the data packet itself.
      */
     WifiTxVector GetCtsToSelfTxVector();
@@ -854,32 +893,32 @@
      * Adjust the TXVECTOR for an initial Control frame to ensure that the modulation class
      * is non-HT and the rate is 6 Mbps, 12 Mbps or 24 Mbps.
      *
-     * \param txVector the TXVECTOR to adjust
+     * @param txVector the TXVECTOR to adjust
      */
     void AdjustTxVectorForIcf(WifiTxVector& txVector) const;
     /**
      * Return a TXVECTOR for the Ack frame given the destination and the mode of the Data
      * used by the sender.
      *
-     * \param to the MAC address of the Ack receiver
-     * \param dataTxVector the TXVECTOR of the Data used by the sender
-     * \return TXVECTOR for the Ack
+     * @param to the MAC address of the Ack receiver
+     * @param dataTxVector the TXVECTOR of the Data used by the sender
+     * @return TXVECTOR for the Ack
      */
     WifiTxVector GetAckTxVector(Mac48Address to, const WifiTxVector& dataTxVector) const;
     /**
      * Return a TXVECTOR for the BlockAck frame given the destination and the mode of the Data
      * used by the sender.
      *
-     * \param to the MAC address of the BlockAck receiver
-     * \param dataTxVector the TXVECTOR of the Data used by the sender
-     * \return TXVECTOR for the BlockAck
+     * @param to the MAC address of the BlockAck receiver
+     * @param dataTxVector the TXVECTOR of the Data used by the sender
+     * @return TXVECTOR for the BlockAck
      */
     WifiTxVector GetBlockAckTxVector(Mac48Address to, const WifiTxVector& dataTxVector) const;
     /**
      * Get control answer mode function.
      *
-     * \param reqMode request mode
-     * \return control answer mode
+     * @param reqMode request mode
+     * @return control answer mode
      */
     WifiMode GetControlAnswerMode(WifiMode reqMode) const;
 
@@ -887,14 +926,14 @@
      * Should be invoked whenever the RtsTimeout associated to a transmission
      * attempt expires.
      *
-     * \param header MAC header of the DATA packet
+     * @param header MAC header of the DATA packet
      */
     void ReportRtsFailed(const WifiMacHeader& header);
     /**
      * Should be invoked whenever the AckTimeout associated to a transmission
      * attempt expires.
      *
-     * \param mpdu the MPDU whose transmission failed
+     * @param mpdu the MPDU whose transmission failed
      */
     void ReportDataFailed(Ptr<const WifiMpdu> mpdu);
     /**
@@ -902,21 +941,21 @@
      * we just sent. Note that we also get the SNR of the RTS we sent since
      * the receiver put a SnrTag in the CTS.
      *
-     * \param header MAC header of the DATA packet
-     * \param ctsSnr the SNR of the CTS we received
-     * \param ctsMode the WifiMode the receiver used to send the CTS
-     * \param rtsSnr the SNR of the RTS we sent
+     * @param header MAC header of the DATA packet
+     * @param ctsSnr the SNR of the CTS we received
+     * @param ctsMode the WifiMode the receiver used to send the CTS
+     * @param rtsSnr the SNR of the RTS we sent
      */
     void ReportRtsOk(const WifiMacHeader& header, double ctsSnr, WifiMode ctsMode, double rtsSnr);
     /**
      * Should be invoked whenever we receive the ACK associated to a data packet
      * we just sent.
      *
-     * \param mpdu the MPDU
-     * \param ackSnr the SNR of the ACK we received
-     * \param ackMode the WifiMode the receiver used to send the ACK
-     * \param dataSnr the SNR of the DATA we sent
-     * \param dataTxVector the TXVECTOR of the DATA we sent
+     * @param mpdu the MPDU
+     * @param ackSnr the SNR of the ACK we received
+     * @param ackMode the WifiMode the receiver used to send the ACK
+     * @param dataSnr the SNR of the DATA we sent
+     * @param dataTxVector the TXVECTOR of the DATA we sent
      */
     void ReportDataOk(Ptr<const WifiMpdu> mpdu,
                       double ackSnr,
@@ -924,30 +963,28 @@
                       double dataSnr,
                       WifiTxVector dataTxVector);
     /**
-     * Should be invoked after calling ReportRtsFailed if
-     * NeedRetransmission returns false
+     * Should be invoked after calling ReportRtsFailed if frames are dropped
      *
-     * \param header MAC header of the DATA packet
+     * @param header MAC header of the DATA packet
      */
     void ReportFinalRtsFailed(const WifiMacHeader& header);
     /**
-     * Should be invoked after calling ReportDataFailed if
-     * NeedRetransmission returns false
+     * Should be invoked after calling ReportDataFailed if frames are dropped
      *
-     * \param mpdu the MPDU which was discarded
+     * @param mpdu the MPDU which was discarded
      */
     void ReportFinalDataFailed(Ptr<const WifiMpdu> mpdu);
     /**
      * Typically called per A-MPDU, either when a Block ACK was successfully
      * received or when a BlockAckTimeout has elapsed.
      *
-     * \param address the address of the receiver
-     * \param nSuccessfulMpdus number of successfully transmitted MPDUs
+     * @param address the address of the receiver
+     * @param nSuccessfulMpdus number of successfully transmitted MPDUs
      * A value of 0 means that the Block ACK was missed.
-     * \param nFailedMpdus number of unsuccessfuly transmitted MPDUs
-     * \param rxSnr received SNR of the block ack frame itself
-     * \param dataSnr data SNR reported by remote station
-     * \param dataTxVector the TXVECTOR of the MPDUs we sent
+     * @param nFailedMpdus number of unsuccessfuly transmitted MPDUs
+     * @param rxSnr received SNR of the block ack frame itself
+     * @param dataSnr data SNR reported by remote station
+     * @param dataTxVector the TXVECTOR of the MPDUs we sent
      */
     void ReportAmpduTxStatus(Mac48Address address,
                              uint16_t nSuccessfulMpdus,
@@ -957,82 +994,84 @@
                              WifiTxVector dataTxVector);
 
     /**
-     * \param address remote address
-     * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
-     * \param txVector the TXVECTOR used for the packet received
+     * @param address remote address
+     * @param rxSignalInfo the info on the received signal (\see RxSignalInfo)
+     * @param txVector the TXVECTOR used for the packet received
      *
      * Should be invoked whenever a packet is successfully received.
      */
-    void ReportRxOk(Mac48Address address, RxSignalInfo rxSignalInfo, WifiTxVector txVector);
+    void ReportRxOk(Mac48Address address, RxSignalInfo rxSignalInfo, const WifiTxVector& txVector);
 
     /**
-     * \param header MAC header of the data frame to send
-     * \param txParams the TX parameters for the data frame to send
+     * Increment the retry count for all the MPDUs (if needed) in the given PSDU and find the
+     * MPDUs to drop based on the frame retry count.
      *
-     * \return true if we want to use an RTS/CTS handshake for this
+     * @param psdu the given PSDU, whose transmission failed
+     * @return the list of MPDUs that have to be dropped
+     */
+    std::list<Ptr<WifiMpdu>> GetMpdusToDropOnTxFailure(Ptr<WifiPsdu> psdu);
+
+    /**
+     * @param header MAC header of the data frame to send
+     * @param txParams the TX parameters for the data frame to send
+     *
+     * @return true if we want to use an RTS/CTS handshake for this
      *         frame before sending it, false otherwise.
      */
     bool NeedRts(const WifiMacHeader& header, const WifiTxParameters& txParams);
     /**
      * Return if we need to do CTS-to-self before sending a DATA.
      *
-     * \param txVector the TXVECTOR of the packet to be sent
-     *
-     * \return true if CTS-to-self is needed,
+     * @param txVector the TXVECTOR of the DATA
+     * @param header the MAC header of the DATA
+     * @return true if CTS-to-self is needed,
      *         false otherwise
      */
-    bool NeedCtsToSelf(WifiTxVector txVector);
+    bool NeedCtsToSelf(const WifiTxVector& txVector, const WifiMacHeader& header);
 
     /**
-     * \param mpdu the MPDU to send
+     * @param mpdu the MPDU to send
      *
-     * \return true if we want to resend a packet after a failed transmission attempt,
-     *         false otherwise.
-     */
-    bool NeedRetransmission(Ptr<const WifiMpdu> mpdu);
-    /**
-     * \param mpdu the MPDU to send
-     *
-     * \return true if this packet should be fragmented,
+     * @return true if this packet should be fragmented,
      *         false otherwise.
      */
     bool NeedFragmentation(Ptr<const WifiMpdu> mpdu);
     /**
-     * \param mpdu the MPDU to send
-     * \param fragmentNumber the fragment index of the next fragment to send (starts at zero).
+     * @param mpdu the MPDU to send
+     * @param fragmentNumber the fragment index of the next fragment to send (starts at zero).
      *
-     * \return the size of the corresponding fragment.
+     * @return the size of the corresponding fragment.
      */
     uint32_t GetFragmentSize(Ptr<const WifiMpdu> mpdu, uint32_t fragmentNumber);
     /**
-     * \param mpdu the packet to send
-     * \param fragmentNumber the fragment index of the next fragment to send (starts at zero).
+     * @param mpdu the packet to send
+     * @param fragmentNumber the fragment index of the next fragment to send (starts at zero).
      *
-     * \return the offset within the original packet where this fragment starts.
+     * @return the offset within the original packet where this fragment starts.
      */
     uint32_t GetFragmentOffset(Ptr<const WifiMpdu> mpdu, uint32_t fragmentNumber);
     /**
-     * \param mpdu the packet to send
-     * \param fragmentNumber the fragment index of the next fragment to send (starts at zero).
+     * @param mpdu the packet to send
+     * @param fragmentNumber the fragment index of the next fragment to send (starts at zero).
      *
-     * \return true if this is the last fragment, false otherwise.
+     * @return true if this is the last fragment, false otherwise.
      */
     bool IsLastFragment(Ptr<const WifiMpdu> mpdu, uint32_t fragmentNumber);
 
     /**
-     * \return the default transmission power
+     * @return the default transmission power
      */
     uint8_t GetDefaultTxPowerLevel() const;
     /**
-     * \param address of the remote station
+     * @param address of the remote station
      *
-     * \return information regarding the remote station associated with the given address
+     * @return information regarding the remote station associated with the given address
      */
     WifiRemoteStationInfo GetInfo(Mac48Address address);
     /**
-     * \param address of the remote station
+     * @param address of the remote station
      *
-     * \return the RSSI of the most recent packet received from the remote station (irrespective of
+     * @return the RSSI of the most recent packet received from the remote station (irrespective of
      * TID)
      *
      * This method is typically used when the device needs
@@ -1043,32 +1082,32 @@
     /**
      * Set the default transmission power level
      *
-     * \param txPower the default transmission power level
+     * @param txPower the default transmission power level
      */
     void SetDefaultTxPowerLevel(uint8_t txPower);
     /**
-     * \return the number of antennas supported by the PHY layer
+     * @return the number of antennas supported by the PHY layer
      */
     uint8_t GetNumberOfAntennas() const;
     /**
-     * \return the maximum number of spatial streams supported by the PHY layer
+     * @return the maximum number of spatial streams supported by the PHY layer
      */
     uint8_t GetMaxNumberOfTransmitStreams() const;
     /**
-     * \returns whether LDPC should be used for a given destination address.
+     * @returns whether LDPC should be used for a given destination address.
      *
-     * \param dest the destination address
+     * @param dest the destination address
      *
-     * \return whether LDPC should be used for a given destination address
+     * @return whether LDPC should be used for a given destination address
      */
     bool UseLdpcForDestination(Mac48Address dest) const;
 
     /**
      * TracedCallback signature for power change events.
      *
-     * \param [in] oldPower The previous power (in dBm).
-     * \param [in] newPower The new power (in dBm).
-     * \param [in] address The remote station MAC address.
+     * @param [in] oldPower The previous power (in dBm).
+     * @param [in] newPower The new power (in dBm).
+     * @param [in] address The remote station MAC address.
      */
     typedef void (*PowerChangeTracedCallback)(double oldPower,
                                               double newPower,
@@ -1077,9 +1116,9 @@
     /**
      * TracedCallback signature for rate change events.
      *
-     * \param [in] oldRate The previous data rate.
-     * \param [in] newRate The new data rate.
-     * \param [in] address The remote station MAC address.
+     * @param [in] oldRate The previous data rate.
+     * @param [in] newRate The new data rate.
+     * @param [in] address The remote station MAC address.
      */
     typedef void (*RateChangeTracedCallback)(DataRate oldRate,
                                              DataRate newRate,
@@ -1088,13 +1127,13 @@
     /**
      * Return the WifiPhy.
      *
-     * \return a pointer to the WifiPhy
+     * @return a pointer to the WifiPhy
      */
     Ptr<WifiPhy> GetPhy() const;
     /**
      * Return the WifiMac.
      *
-     * \return a pointer to the WifiMac
+     * @return a pointer to the WifiMac
      */
     Ptr<WifiMac> GetMac() const;
 
@@ -1103,149 +1142,149 @@
     /**
      * Return whether mode associated with the specified station at the specified index.
      *
-     * \param station the station being queried
-     * \param i the index
+     * @param station the station being queried
+     * @param i the index
      *
-     * \return WifiMode at the given index of the specified station
+     * @return WifiMode at the given index of the specified station
      */
     WifiMode GetSupported(const WifiRemoteStation* station, uint8_t i) const;
     /**
      * Return the number of modes supported by the given station.
      *
-     * \param station the station being queried
+     * @param station the station being queried
      *
-     * \return the number of modes supported by the given station
+     * @return the number of modes supported by the given station
      */
     uint8_t GetNSupported(const WifiRemoteStation* station) const;
     /**
      * Return whether the given station is QoS capable.
      *
-     * \param station the station being queried
+     * @param station the station being queried
      *
-     * \return true if the station has QoS capabilities,
+     * @return true if the station has QoS capabilities,
      *         false otherwise
      */
     bool GetQosSupported(const WifiRemoteStation* station) const;
     /**
      * Return whether the given station is HT capable.
      *
-     * \param station the station being queried
+     * @param station the station being queried
      *
-     * \return true if the station has HT capabilities,
+     * @return true if the station has HT capabilities,
      *         false otherwise
      */
     bool GetHtSupported(const WifiRemoteStation* station) const;
     /**
      * Return whether the given station is VHT capable.
      *
-     * \param station the station being queried
+     * @param station the station being queried
      *
-     * \return true if the station has VHT capabilities,
+     * @return true if the station has VHT capabilities,
      *         false otherwise
      */
     bool GetVhtSupported(const WifiRemoteStation* station) const;
     /**
      * Return whether the given station is HE capable.
      *
-     * \param station the station being queried
+     * @param station the station being queried
      *
-     * \return true if the station has HE capabilities,
+     * @return true if the station has HE capabilities,
      *         false otherwise
      */
     bool GetHeSupported(const WifiRemoteStation* station) const;
     /**
      * Return whether the given station is EHT capable.
      *
-     * \param station the station being queried
+     * @param station the station being queried
      *
-     * \return true if the station has EHT capabilities,
+     * @return true if the station has EHT capabilities,
      *         false otherwise
      */
     bool GetEhtSupported(const WifiRemoteStation* station) const;
     /**
-     * \param station the station of a non-AP MLD
-     * \return whether the non-AP MLD supports EMLSR
+     * @param station the station of a non-AP MLD
+     * @return whether the non-AP MLD supports EMLSR
      */
     bool GetEmlsrSupported(const WifiRemoteStation* station) const;
     /**
-     * \param station the station of a non-AP MLD
-     * \return whether EMLSR mode is enabled for the non-AP MLD on this link
+     * @param station the station of a non-AP MLD
+     * @return whether EMLSR mode is enabled for the non-AP MLD on this link
      */
     bool GetEmlsrEnabled(const WifiRemoteStation* station) const;
     /**
      * Return the WifiMode supported by the specified station at the specified index.
      *
-     * \param station the station being queried
-     * \param i the index
+     * @param station the station being queried
+     * @param i the index
      *
-     * \return the WifiMode at the given index of the specified station
+     * @return the WifiMode at the given index of the specified station
      */
 
     WifiMode GetMcsSupported(const WifiRemoteStation* station, uint8_t i) const;
     /**
      * Return the number of MCS supported by the given station.
      *
-     * \param station the station being queried
+     * @param station the station being queried
      *
-     * \return the number of MCS supported by the given station
+     * @return the number of MCS supported by the given station
      */
     uint8_t GetNMcsSupported(const WifiRemoteStation* station) const;
     /**
      * Return whether non-ERP mode associated with the specified station at the specified index.
      *
-     * \param station the station being queried
-     * \param i the index
+     * @param station the station being queried
+     * @param i the index
      *
-     * \return WifiMode at the given index of the specified station
+     * @return WifiMode at the given index of the specified station
      */
     WifiMode GetNonErpSupported(const WifiRemoteStation* station, uint8_t i) const;
     /**
      * Return the number of non-ERP modes supported by the given station.
      *
-     * \param station the station being queried
+     * @param station the station being queried
      *
-     * \return the number of non-ERP modes supported by the given station
+     * @return the number of non-ERP modes supported by the given station
      */
     uint32_t GetNNonErpSupported(const WifiRemoteStation* station) const;
     /**
      * Return the address of the station.
      *
-     * \param station the station being queried
+     * @param station the station being queried
      *
-     * \return the address of the station
+     * @return the address of the station
      */
     Mac48Address GetAddress(const WifiRemoteStation* station) const;
     /**
      * Return the channel width supported by the station.
      *
-     * \param station the station being queried
+     * @param station the station being queried
      *
-     * \return the channel width supported by the station
+     * @return the channel width supported by the station
      */
     MHz_u GetChannelWidth(const WifiRemoteStation* station) const;
     /**
      * Return whether the given station supports HT/VHT short guard interval.
      *
-     * \param station the station being queried
+     * @param station the station being queried
      *
-     * \return true if the station supports HT/VHT short guard interval,
+     * @return true if the station supports HT/VHT short guard interval,
      *         false otherwise
      */
     bool GetShortGuardIntervalSupported(const WifiRemoteStation* station) const;
     /**
-     * Return the HE guard interval duration supported by the station.
+     * Return the shortest HE guard interval duration supported by the station.
      *
-     * \param station the station being queried
+     * @param station the station being queried
      *
-     * \return the HE guard interval duration supported by the station
+     * @return the shortest HE guard interval duration supported by the station
      */
     Time GetGuardInterval(const WifiRemoteStation* station) const;
     /**
      * Return whether the given station supports A-MPDU.
      *
-     * \param station the station being queried
+     * @param station the station being queried
      *
-     * \return true if the station supports MPDU aggregation,
+     * @return true if the station supports MPDU aggregation,
      *         false otherwise
      */
     bool GetAggregation(const WifiRemoteStation* station) const;
@@ -1253,65 +1292,74 @@
     /**
      * Return the number of supported streams the station has.
      *
-     * \param station the station being queried
+     * @param station the station being queried
      *
-     * \return the number of supported streams the station has
+     * @return the number of supported streams the station has
      */
     uint8_t GetNumberOfSupportedStreams(const WifiRemoteStation* station) const;
     /**
-     * \returns the number of Ness the station has.
+     * @returns the number of Ness the station has.
      *
-     * \param station the station being queried
+     * @param station the station being queried
      *
-     * \return the number of Ness the station has
+     * @return the number of Ness the station has
      */
     uint8_t GetNess(const WifiRemoteStation* station) const;
 
+    uint8_t m_linkId;             //!< the ID of the link this object is associated with
+    bool m_incrRetryCountUnderBa; //!< whether  to increment the retry count of frames that are
+                                  //!< part of a Block Ack agreement
+
   private:
     /**
      * If the given TXVECTOR is used for a MU transmission, return the STAID of
      * the station with the given address if we are an AP or our own STAID if we
      * are a STA associated with some AP. Otherwise, return SU_STA_ID.
      *
-     * \param address the address of the station
-     * \param txVector the TXVECTOR used for a MU transmission
-     * \return the STA-ID of the station
+     * @param address the address of the station
+     * @param txVector the TXVECTOR used for a MU transmission
+     * @return the STA-ID of the station
      */
     uint16_t GetStaId(Mac48Address address, const WifiTxVector& txVector) const;
 
     /**
-     * \param station the station that we need to communicate
-     * \param size the size of the frame to send in bytes
-     * \param normally indicates whether the normal 802.11 RTS enable mechanism would
+     * Increment the retry count (if needed) for the given PSDU, whose transmission failed.
+     *
+     * @param station the station the PSDU is addressed to
+     * @param psdu the given PSDU
+     */
+    virtual void DoIncrementRetryCountOnTxFailure(WifiRemoteStation* station, Ptr<WifiPsdu> psdu);
+
+    /**
+     * Find the MPDUs to drop (possibly based on their frame retry count) in the given PSDU,
+     * whose transmission failed.
+     *
+     * @param station the station the PSDU is addressed to
+     * @param psdu the given PSDU
+     * @return the MPDUs in the PSDU to drop
+     */
+    virtual std::list<Ptr<WifiMpdu>> DoGetMpdusToDropOnTxFailure(WifiRemoteStation* station,
+                                                                 Ptr<WifiPsdu> psdu);
+
+    /**
+     * @param station the station that we need to communicate
+     * @param size the size of the frame to send in bytes
+     * @param normally indicates whether the normal 802.11 RTS enable mechanism would
      *        request that the RTS is sent or not.
      *
-     * \return true if we want to use an RTS/CTS handshake for this frame before sending it,
+     * @return true if we want to use an RTS/CTS handshake for this frame before sending it,
      *         false otherwise.
      *
      * Note: This method is called before a unicast packet is sent on the medium.
      */
     virtual bool DoNeedRts(WifiRemoteStation* station, uint32_t size, bool normally);
     /**
-     * \param station the station that we need to communicate
-     * \param packet the packet to send
-     * \param normally indicates whether the normal 802.11 data retransmission mechanism
-     *        would request that the data is retransmitted or not.
-     * \return true if we want to resend a packet after a failed transmission attempt,
-     *         false otherwise.
-     *
-     * Note: This method is called after any unicast packet transmission (control, management,
-     *       or data) has been attempted and has failed.
-     */
-    virtual bool DoNeedRetransmission(WifiRemoteStation* station,
-                                      Ptr<const Packet> packet,
-                                      bool normally);
-    /**
-     * \param station the station that we need to communicate
-     * \param packet the packet to send
-     * \param normally indicates whether the normal 802.11 data fragmentation mechanism
+     * @param station the station that we need to communicate
+     * @param packet the packet to send
+     * @param normally indicates whether the normal 802.11 data fragmentation mechanism
      *        would request that the data packet is fragmented or not.
      *
-     * \return true if this packet should be fragmented,
+     * @return true if this packet should be fragmented,
      *         false otherwise.
      *
      * Note: This method is called before sending a unicast packet.
@@ -1320,22 +1368,22 @@
                                      Ptr<const Packet> packet,
                                      bool normally);
     /**
-     * \return a new station data structure
+     * @return a new station data structure
      */
     virtual WifiRemoteStation* DoCreateStation() const = 0;
     /**
-     * \param station the station that we need to communicate
-     * \param allowedWidth the allowed width to send a packet to the station
-     * \return the TXVECTOR to use to send a packet to the station
+     * @param station the station that we need to communicate
+     * @param allowedWidth the allowed width to send a packet to the station
+     * @return the TXVECTOR to use to send a packet to the station
      *
      * Note: This method is called before sending a unicast packet or a fragment
      *       of a unicast packet to decide which transmission mode to use.
      */
     virtual WifiTxVector DoGetDataTxVector(WifiRemoteStation* station, MHz_u allowedWidth) = 0;
     /**
-     * \param station the station that we need to communicate
+     * @param station the station that we need to communicate
      *
-     * \return the transmission mode to use to send an RTS to the station
+     * @return the transmission mode to use to send an RTS to the station
      *
      * Note: This method is called before sending an RTS to a station
      *       to decide which transmission mode to use for the RTS.
@@ -1346,24 +1394,24 @@
      * This method is a pure virtual method that must be implemented by the sub-class.
      * This allows different types of WifiRemoteStationManager to respond differently,
      *
-     * \param station the station that we failed to send RTS
+     * @param station the station that we failed to send RTS
      */
     virtual void DoReportRtsFailed(WifiRemoteStation* station) = 0;
     /**
      * This method is a pure virtual method that must be implemented by the sub-class.
      * This allows different types of WifiRemoteStationManager to respond differently,
      *
-     * \param station the station that we failed to send DATA
+     * @param station the station that we failed to send DATA
      */
     virtual void DoReportDataFailed(WifiRemoteStation* station) = 0;
     /**
      * This method is a pure virtual method that must be implemented by the sub-class.
      * This allows different types of WifiRemoteStationManager to respond differently,
      *
-     * \param station the station that we successfully sent RTS
-     * \param ctsSnr the SNR of the CTS we received
-     * \param ctsMode the WifiMode the receiver used to send the CTS
-     * \param rtsSnr the SNR of the RTS we sent
+     * @param station the station that we successfully sent RTS
+     * @param ctsSnr the SNR of the CTS we received
+     * @param ctsMode the WifiMode the receiver used to send the CTS
+     * @param rtsSnr the SNR of the RTS we sent
      */
     virtual void DoReportRtsOk(WifiRemoteStation* station,
                                double ctsSnr,
@@ -1373,12 +1421,12 @@
      * This method is a pure virtual method that must be implemented by the sub-class.
      * This allows different types of WifiRemoteStationManager to respond differently,
      *
-     * \param station the station that we successfully sent RTS
-     * \param ackSnr the SNR of the ACK we received
-     * \param ackMode the WifiMode the receiver used to send the ACK
-     * \param dataSnr the SNR of the DATA we sent
-     * \param dataChannelWidth the channel width of the DATA we sent
-     * \param dataNss the number of spatial streams used to send the DATA
+     * @param station the station that we successfully sent RTS
+     * @param ackSnr the SNR of the ACK we received
+     * @param ackMode the WifiMode the receiver used to send the ACK
+     * @param dataSnr the SNR of the DATA we sent
+     * @param dataChannelWidth the channel width of the DATA we sent
+     * @param dataNss the number of spatial streams used to send the DATA
      */
     virtual void DoReportDataOk(WifiRemoteStation* station,
                                 double ackSnr,
@@ -1390,23 +1438,23 @@
      * This method is a pure virtual method that must be implemented by the sub-class.
      * This allows different types of WifiRemoteStationManager to respond differently,
      *
-     * \param station the station that we failed to send RTS
+     * @param station the station that we failed to send RTS
      */
     virtual void DoReportFinalRtsFailed(WifiRemoteStation* station) = 0;
     /**
      * This method is a pure virtual method that must be implemented by the sub-class.
      * This allows different types of WifiRemoteStationManager to respond differently,
      *
-     * \param station the station that we failed to send DATA
+     * @param station the station that we failed to send DATA
      */
     virtual void DoReportFinalDataFailed(WifiRemoteStation* station) = 0;
     /**
      * This method is a pure virtual method that must be implemented by the sub-class.
      * This allows different types of WifiRemoteStationManager to respond differently,
      *
-     * \param station the station that sent the DATA to us
-     * \param rxSnr the SNR of the DATA we received
-     * \param txMode the WifiMode the sender used to send the DATA
+     * @param station the station that sent the DATA to us
+     * @param rxSnr the SNR of the DATA we received
+     * @param txMode the WifiMode the sender used to send the DATA
      */
     virtual void DoReportRxOk(WifiRemoteStation* station, double rxSnr, WifiMode txMode) = 0;
     /**
@@ -1415,14 +1463,14 @@
      * be implemented by the sub-class intended to handle A-MPDUs. This allows different
      * types of WifiRemoteStationManager to respond differently.
      *
-     * \param station the station that sent the DATA to us
-     * \param nSuccessfulMpdus number of successfully transmitted MPDUs.
+     * @param station the station that sent the DATA to us
+     * @param nSuccessfulMpdus number of successfully transmitted MPDUs.
      *        A value of 0 means that the Block ACK was missed.
-     * \param nFailedMpdus number of unsuccessfuly transmitted MPDUs.
-     * \param rxSnr received SNR of the block ack frame itself
-     * \param dataSnr data SNR reported by remote station
-     * \param dataChannelWidth the channel width of the A-MPDU we sent
-     * \param dataNss the number of spatial streams used to send the A-MPDU
+     * @param nFailedMpdus number of unsuccessfuly transmitted MPDUs.
+     * @param rxSnr received SNR of the block ack frame itself
+     * @param dataSnr data SNR reported by remote station
+     * @param dataChannelWidth the channel width of the A-MPDU we sent
+     * @param dataNss the number of spatial streams used to send the A-MPDU
      */
     virtual void DoReportAmpduTxStatus(WifiRemoteStation* station,
                                        uint16_t nSuccessfulMpdus,
@@ -1435,16 +1483,16 @@
     /**
      * Return the state of the station associated with the given address.
      *
-     * \param address the address of the station
-     * \return WifiRemoteStationState corresponding to the address
+     * @param address the address of the station
+     * @return WifiRemoteStationState corresponding to the address
      */
     std::shared_ptr<WifiRemoteStationState> LookupState(Mac48Address address) const;
     /**
      * Return the station associated with the given address.
      *
-     * \param address the address of the station
+     * @param address the address of the station
      *
-     * \return WifiRemoteStation corresponding to the address
+     * @return WifiRemoteStation corresponding to the address
      */
     WifiRemoteStation* Lookup(Mac48Address address) const;
 
@@ -1452,21 +1500,21 @@
      * Actually sets the fragmentation threshold, it also checks the validity of
      * the given threshold.
      *
-     * \param threshold the fragmentation threshold
+     * @param threshold the fragmentation threshold
      */
     void DoSetFragmentationThreshold(uint32_t threshold);
     /**
      * Return the current fragmentation threshold
      *
-     * \return the fragmentation threshold
+     * @return the fragmentation threshold
      */
     uint32_t DoGetFragmentationThreshold() const;
     /**
      * Return the number of fragments needed for the given packet.
      *
-     * \param mpdu the packet to be fragmented
+     * @param mpdu the packet to be fragmented
      *
-     * \return the number of fragments needed
+     * @return the number of fragments needed
      */
     uint32_t GetNFragments(Ptr<const WifiMpdu> mpdu);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-spectrum-phy-interface.h ns-3.44/src/wifi/model/wifi-spectrum-phy-interface.h
--- ns-3.43/src/wifi/model/wifi-spectrum-phy-interface.h	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/model/wifi-spectrum-phy-interface.h	2025-03-09 16:55:49.803372600 -0700
@@ -22,7 +22,7 @@
 class SpectrumWifiPhy;
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * This class is an adaptor between class SpectrumWifiPhy (which inherits
  * from WifiPhy) and class SpectrumChannel (which expects objects derived
@@ -36,25 +36,25 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     /**
      * Constructor
      *
-     * \param freqRange the frequency range covered by the interface
+     * @param freqRange the frequency range covered by the interface
      */
     WifiSpectrumPhyInterface(FrequencyRange freqRange);
     /**
      * Connect SpectrumWifiPhy object
-     * \param phy SpectrumWifiPhy object to be connected to this object
+     * @param phy SpectrumWifiPhy object to be connected to this object
      */
     void SetSpectrumWifiPhy(const Ptr<SpectrumWifiPhy> phy);
 
     /**
      * Get SpectrumWifiPhy object
-     * \return Pointer to SpectrumWifiPhy object
+     * @return Pointer to SpectrumWifiPhy object
      */
     Ptr<const SpectrumWifiPhy> GetSpectrumWifiPhy() const;
 
@@ -70,14 +70,14 @@
     /**
      * Get the spectrum channel this interface is attached to
      *
-     * \return the spectrum channel this interface is attached to
+     * @return the spectrum channel this interface is attached to
      */
     Ptr<SpectrumChannel> GetChannel() const;
 
     /**
      * Get the frequency range covered by the spectrum channel this interface is attached to
      *
-     * \return the frequency range covered by the spectrum channel this interface is attached to
+     * @return the frequency range covered by the spectrum channel this interface is attached to
      */
     const FrequencyRange& GetFrequencyRange() const;
 
@@ -85,7 +85,7 @@
      * Get the center frequency for each segment of the the spectrum channel this interface is
      * attached to
      *
-     * \return the center frequency for each segment of the the spectrum channel this interface is
+     * @return the center frequency for each segment of the the spectrum channel this interface is
      * attached to to
      */
     const std::vector<MHz_u>& GetCenterFrequencies() const;
@@ -93,7 +93,7 @@
     /**
      * Get the channel width covered by the spectrum channel this interface is attached to
      *
-     * \return the channel width covered by the spectrum channel this interface is attached
+     * @return the channel width covered by the spectrum channel this interface is attached
      * to to
      */
     MHz_u GetChannelWidth() const;
@@ -101,17 +101,17 @@
     /**
      * Start transmission over the spectrum channel
      *
-     * \param params the parameters of the signal to transmit
+     * @param params the parameters of the signal to transmit
      */
     void StartTx(Ptr<SpectrumSignalParameters> params);
 
     /**
      * Set the RX spectrum model
      *
-     * \param centerFrequencies the center frequency for each segment
-     * \param channelWidth the total channel width
-     * \param bandBandwidth the width of each band
-     * \param guardBandwidth the total width of the guard band
+     * @param centerFrequencies the center frequency for each segment
+     * @param channelWidth the total channel width
+     * @param bandBandwidth the width of each band
+     * @param guardBandwidth the total width of the guard band
      */
     void SetRxSpectrumModel(const std::vector<MHz_u>& centerFrequencies,
                             MHz_u channelWidth,
@@ -121,26 +121,26 @@
     /**
      * Set the vector of spectrum bands handled by this interface
      *
-     * \param bands vector of spectrum bands
+     * @param bands vector of spectrum bands
      */
     void SetBands(WifiSpectrumBands&& bands);
     /**
      * Get the vector of spectrum bands handled by this interface
      *
-     * \return the vector of spectrum bands
+     * @return the vector of spectrum bands
      */
     const WifiSpectrumBands& GetBands() const;
 
     /**
      * Set the HE RU spectrum bands handled by this interface (if any)
      *
-     * \param heRuBands the HE RU spectrum bands
+     * @param heRuBands the HE RU spectrum bands
      */
     void SetHeRuBands(HeRuBands&& heRuBands);
     /**
      * Get the HE RU spectrum bands handled by this interface
      *
-     * \return the HE RU spectrum bands
+     * @return the HE RU spectrum bands
      */
     const HeRuBands& GetHeRuBands() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-spectrum-signal-parameters.h ns-3.44/src/wifi/model/wifi-spectrum-signal-parameters.h
--- ns-3.43/src/wifi/model/wifi-spectrum-signal-parameters.h	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/model/wifi-spectrum-signal-parameters.h	2025-03-09 16:55:49.803372600 -0700
@@ -20,7 +20,7 @@
 class WifiPpdu;
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * Signal parameters for wifi
  */
@@ -36,7 +36,7 @@
     /**
      * copy constructor
      *
-     * \param p the wifi spectrum signal parameters
+     * @param p the wifi spectrum signal parameters
      */
     WifiSpectrumSignalParameters(const WifiSpectrumSignalParameters& p);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-spectrum-value-helper.cc ns-3.44/src/wifi/model/wifi-spectrum-value-helper.cc
--- ns-3.43/src/wifi/model/wifi-spectrum-value-helper.cc	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/model/wifi-spectrum-value-helper.cc	2025-03-09 16:55:49.803372600 -0700
@@ -58,9 +58,9 @@
 
 /**
  * Less than operator
- * \param lhs the left hand side wifi spectrum to compare
- * \param rhs the right hand side wifi spectrum to compare
- * \returns true if the left hand side spectrum is less than the right hand side spectrum
+ * @param lhs the left hand side wifi spectrum to compare
+ * @param rhs the right hand side wifi spectrum to compare
+ * @returns true if the left hand side spectrum is less than the right hand side spectrum
  */
 bool
 operator<(const WifiSpectrumModelId& lhs, const WifiSpectrumModelId& rhs)
@@ -110,10 +110,10 @@
             std::minmax_element(centerFrequencies.cbegin(), centerFrequencies.cend());
         const auto separationWidth =
             (minCenterFrequency == maxCenterFrequency)
-                ? 0
+                ? MHz_u{0}
                 : (*maxCenterFrequency - *minCenterFrequency - (channelWidth / 2));
-        NS_ASSERT(separationWidth == 0 || centerFrequencies.size() == 2);
-        Hz_u bandwidth = (channelWidth + (2 * guardBandwidth) + separationWidth) * 1e6;
+        NS_ASSERT(separationWidth == MHz_u{0} || centerFrequencies.size() == 2);
+        const auto bandwidth = MHzToHz((channelWidth + (2 * guardBandwidth) + separationWidth));
         // For OFDM, the center subcarrier is null (at center frequency)
         uint32_t numBands = std::ceil(bandwidth / carrierSpacing);
         NS_ASSERT(numBands > 0);
@@ -132,13 +132,13 @@
         // total width, only a quarter of the channel width has to be subtracted. Finally, we
         // remove the guard band width to get the center frequency of the first band and half the
         // carrier spacing to get the effective starting frequency of the first band.
-        const auto startingFrequencyHz = *minCenterFrequency * 1e6 -
-                                         ((channelWidth * 1e6) / (2 * centerFrequencies.size())) -
-                                         (guardBandwidth * 1e6) - (carrierSpacing / 2);
+        const auto startingFrequency = MHzToHz(*minCenterFrequency) -
+                                       (MHzToHz(channelWidth) / (2 * centerFrequencies.size())) -
+                                       MHzToHz(guardBandwidth) - (carrierSpacing / 2);
         for (size_t i = 0; i < numBands; i++)
         {
             BandInfo info;
-            auto f = startingFrequencyHz + (i * carrierSpacing);
+            auto f = startingFrequency + (i * carrierSpacing);
             info.fl = f;
             f += carrierSpacing / 2;
             info.fc = f;
@@ -162,14 +162,15 @@
                                                           MHz_u guardBandwidth)
 {
     NS_LOG_FUNCTION(centerFrequency << txPower << +guardBandwidth);
-    MHz_u channelWidth = 22; // DSSS channels are 22 MHz wide
-    Hz_u carrierSpacing = 312500;
+    MHz_u channelWidth{22}; // DSSS channels are 22 MHz wide
+    Hz_u carrierSpacing{312500};
     Ptr<SpectrumValue> c = Create<SpectrumValue>(
         GetSpectrumModel({centerFrequency}, channelWidth, carrierSpacing, guardBandwidth));
     auto vit = c->ValuesBegin();
     auto bit = c->ConstBandsBegin();
-    auto nGuardBands = static_cast<uint32_t>(((2 * guardBandwidth * 1e6) / carrierSpacing) + 0.5);
-    auto nAllocatedBands = static_cast<uint32_t>(((channelWidth * 1e6) / carrierSpacing) + 0.5);
+    auto nGuardBands =
+        static_cast<uint32_t>(((MHzToHz(2 * guardBandwidth)) / carrierSpacing) + 0.5);
+    auto nAllocatedBands = static_cast<uint32_t>((MHzToHz(channelWidth) / carrierSpacing) + 0.5);
     NS_ASSERT(c->GetSpectrumModel()->GetNumBands() == (nAllocatedBands + nGuardBands + 1));
     // Evenly spread power across 22 MHz
     const auto txPowerPerBand = txPower / nAllocatedBands;
@@ -195,23 +196,24 @@
 {
     NS_LOG_FUNCTION(centerFrequency << channelWidth << txPower << guardBandwidth << minInnerBand
                                     << minOuterBand << lowestPoint);
-    Hz_u carrierSpacing = 0;
+    Hz_u carrierSpacing{0};
     uint32_t innerSlopeWidth = 0;
     switch (static_cast<uint16_t>(channelWidth))
     {
     case 20:
-        carrierSpacing = 312500;                                               // Hz
-        innerSlopeWidth = static_cast<uint32_t>((2e6 / carrierSpacing) + 0.5); // [-11;-9] & [9;11]
+        carrierSpacing = Hz_u{312500};
+        innerSlopeWidth =
+            static_cast<uint32_t>((Hz_u{2e6} / carrierSpacing) + 0.5); // [-11;-9] & [9;11]
         break;
     case 10:
-        carrierSpacing = 156250; // Hz
+        carrierSpacing = Hz_u{156250};
         innerSlopeWidth =
-            static_cast<uint32_t>((1e6 / carrierSpacing) + 0.5); // [-5.5;-4.5] & [4.5;5.5]
+            static_cast<uint32_t>((Hz_u{1e6} / carrierSpacing) + 0.5); // [-5.5;-4.5] & [4.5;5.5]
         break;
     case 5:
-        carrierSpacing = 78125; // Hz
+        carrierSpacing = Hz_u{78125};
         innerSlopeWidth =
-            static_cast<uint32_t>((5e5 / carrierSpacing) + 0.5); // [-2.75;-2.5] & [2.5;2.75]
+            static_cast<uint32_t>((Hz_u{5e5} / carrierSpacing) + 0.5); // [-2.75;-2.5] & [2.5;2.75]
         break;
     default:
         NS_FATAL_ERROR("Channel width " << channelWidth << " should be correctly set.");
@@ -220,8 +222,9 @@
 
     auto c = Create<SpectrumValue>(
         GetSpectrumModel({centerFrequency}, channelWidth, carrierSpacing, guardBandwidth));
-    auto nGuardBands = static_cast<uint32_t>(((2 * guardBandwidth * 1e6) / carrierSpacing) + 0.5);
-    auto nAllocatedBands = static_cast<uint32_t>(((channelWidth * 1e6) / carrierSpacing) + 0.5);
+    auto nGuardBands =
+        static_cast<uint32_t>(((MHzToHz(2 * guardBandwidth)) / carrierSpacing) + 0.5);
+    auto nAllocatedBands = static_cast<uint32_t>((MHzToHz(channelWidth) / carrierSpacing) + 0.5);
     NS_ASSERT_MSG(c->GetSpectrumModel()->GetNumBands() == (nAllocatedBands + nGuardBands + 1),
                   "Unexpected number of bands " << c->GetSpectrumModel()->GetNumBands());
     // 52 subcarriers (48 data + 4 pilot)
@@ -267,36 +270,37 @@
     const std::vector<bool>& puncturedSubchannels)
 {
     NS_ASSERT_MSG(centerFrequencies.size() == 1 ||
-                      (channelWidth == 160 && centerFrequencies.size() <= 2),
+                      (channelWidth == MHz_u{160} && centerFrequencies.size() <= 2),
                   "PSD for non-contiguous channels is only possible when the total width is 160 "
                   "MHz and cannot be made of more than 2 segments");
     NS_LOG_FUNCTION(printFrequencies(centerFrequencies)
                     << channelWidth << txPower << guardBandwidth << minInnerBand << minOuterBand
                     << lowestPoint);
-    const Hz_u carrierSpacing = 312500;
+    const Hz_u carrierSpacing{312500};
     Ptr<SpectrumValue> c = Create<SpectrumValue>(
         GetSpectrumModel(centerFrequencies, channelWidth, carrierSpacing, guardBandwidth));
     // assume all frequency segments have the same width, hence split the guard bandwidth
     // accordingly over the segments
     guardBandwidth /= centerFrequencies.size();
     const auto nGuardBands =
-        static_cast<uint32_t>(((2 * guardBandwidth * 1e6) / carrierSpacing) + 0.5);
+        static_cast<uint32_t>(((MHzToHz(2 * guardBandwidth)) / carrierSpacing) + 0.5);
     const auto nAllocatedBands =
-        static_cast<uint32_t>(((channelWidth * 1e6) / carrierSpacing) + 0.5);
+        static_cast<uint32_t>((MHzToHz(channelWidth) / carrierSpacing) + 0.5);
     const auto separationWidth = std::abs(centerFrequencies.back() - centerFrequencies.front());
-    const auto unallocatedWidth = separationWidth > 0 ? (separationWidth - (channelWidth / 2)) : 0;
+    const auto unallocatedWidth =
+        separationWidth > Hz_u{0} ? (separationWidth - (channelWidth / 2)) : 0;
     const auto nUnallocatedBands =
-        static_cast<uint32_t>(((unallocatedWidth * 1e6) / carrierSpacing) + 0.5);
+        static_cast<uint32_t>((MHzToHz(unallocatedWidth) / carrierSpacing) + 0.5);
     NS_ASSERT_MSG(c->GetSpectrumModel()->GetNumBands() ==
                       (nAllocatedBands + nGuardBands + nUnallocatedBands + 1),
                   "Unexpected number of bands " << c->GetSpectrumModel()->GetNumBands());
-    std::size_t num20MhzBands = channelWidth / 20;
+    auto num20MhzBands = Count20MHzSubchannels(channelWidth);
     std::size_t numAllocatedSubcarriersPer20MHz = 52;
     NS_ASSERT(puncturedSubchannels.empty() || (puncturedSubchannels.size() == num20MhzBands));
     const auto txPowerPerBand = (txPower / numAllocatedSubcarriersPer20MHz) / num20MhzBands;
     NS_LOG_DEBUG("Power per band " << txPowerPerBand << "W");
 
-    std::size_t numSubcarriersPer20MHz = (20 * 1e6) / carrierSpacing;
+    std::size_t numSubcarriersPer20MHz = MHzToHz(MHz_u{20}) / carrierSpacing;
     std::size_t numUnallocatedSubcarriersPer20MHz =
         numSubcarriersPer20MHz - numAllocatedSubcarriersPer20MHz;
     std::vector<std::vector<WifiSpectrumBandIndices>> subBandsPerSegment(
@@ -336,11 +340,11 @@
 
     // Prepare spectrum mask specific variables
     auto innerSlopeWidth = static_cast<uint32_t>(
-        (2e6 / carrierSpacing) +
+        (Hz_u{2e6} / carrierSpacing) +
         0.5); // size in number of subcarriers of the 0dBr<->20dBr slope (2MHz for HT/VHT)
     WifiSpectrumBandIndices maskBand(0, nAllocatedBands + nGuardBands + nUnallocatedBands);
     const auto puncturedSlopeWidth =
-        static_cast<uint32_t>((500e3 / carrierSpacing) +
+        static_cast<uint32_t>((Hz_u{500e3} / carrierSpacing) +
                               0.5); // size in number of subcarriers of the punctured slope band
 
     // Build transmit spectrum mask
@@ -371,35 +375,36 @@
     dBr_u lowestPoint)
 {
     NS_ASSERT_MSG(centerFrequencies.size() == 1 ||
-                      (channelWidth == 160 && centerFrequencies.size() <= 2),
+                      (channelWidth == MHz_u{160} && centerFrequencies.size() <= 2),
                   "PSD for non-contiguous channels is only possible when the total width is 160 "
                   "MHz and cannot be made of more than 2 segments");
     NS_LOG_FUNCTION(printFrequencies(centerFrequencies)
                     << channelWidth << txPower << guardBandwidth << minInnerBand << minOuterBand
                     << lowestPoint);
-    const Hz_u carrierSpacing = 312500;
+    const Hz_u carrierSpacing{312500};
     Ptr<SpectrumValue> c = Create<SpectrumValue>(
         GetSpectrumModel(centerFrequencies, channelWidth, carrierSpacing, guardBandwidth));
     // assume all frequency segments have the same width, hence split the guard bandwidth
     // accordingly over the segments
     guardBandwidth /= centerFrequencies.size();
     const auto nGuardBands =
-        static_cast<uint32_t>(((2 * guardBandwidth * 1e6) / carrierSpacing) + 0.5);
+        static_cast<uint32_t>(((MHzToHz(2 * guardBandwidth)) / carrierSpacing) + 0.5);
     const auto nAllocatedBands =
-        static_cast<uint32_t>(((channelWidth * 1e6) / carrierSpacing) + 0.5);
+        static_cast<uint32_t>((MHzToHz(channelWidth) / carrierSpacing) + 0.5);
     const auto separationWidth = std::abs(centerFrequencies.back() - centerFrequencies.front());
-    const auto unallocatedWidth = separationWidth > 0 ? (separationWidth - (channelWidth / 2)) : 0;
+    const auto unallocatedWidth =
+        separationWidth > Hz_u{0} ? (separationWidth - (channelWidth / 2)) : 0;
     const auto nUnallocatedBands =
-        static_cast<uint32_t>(((unallocatedWidth * 1e6) / carrierSpacing) + 0.5);
+        static_cast<uint32_t>((MHzToHz(unallocatedWidth) / carrierSpacing) + 0.5);
     NS_ASSERT_MSG(c->GetSpectrumModel()->GetNumBands() ==
                       (nAllocatedBands + nGuardBands + nUnallocatedBands + 1),
                   "Unexpected number of bands " << c->GetSpectrumModel()->GetNumBands());
-    std::size_t num20MhzBands = channelWidth / 20;
+    auto num20MhzBands = Count20MHzSubchannels(channelWidth);
     std::size_t numAllocatedSubcarriersPer20MHz = 56;
     const auto txPowerPerBand = (txPower / numAllocatedSubcarriersPer20MHz) / num20MhzBands;
     NS_LOG_DEBUG("Power per band " << txPowerPerBand << "W");
 
-    std::size_t numSubcarriersPer20MHz = (20 * 1e6) / carrierSpacing;
+    std::size_t numSubcarriersPer20MHz = MHzToHz(MHz_u{20}) / carrierSpacing;
     std::size_t numUnallocatedSubcarriersPer20MHz =
         numSubcarriersPer20MHz - numAllocatedSubcarriersPer20MHz;
     std::vector<std::vector<WifiSpectrumBandIndices>> subBandsPerSegment(
@@ -430,7 +435,7 @@
 
     // Prepare spectrum mask specific variables
     auto innerSlopeWidth = static_cast<uint32_t>(
-        (2e6 / carrierSpacing) +
+        (Hz_u{2e6} / carrierSpacing) +
         0.5); // size in number of subcarriers of the inner band (2MHz for HT/VHT)
     WifiSpectrumBandIndices maskBand(0, nAllocatedBands + nGuardBands + nUnallocatedBands);
 
@@ -482,29 +487,30 @@
     const std::vector<bool>& puncturedSubchannels)
 {
     NS_ASSERT_MSG(
-        centerFrequencies.size() == 1 || channelWidth == 160,
+        centerFrequencies.size() == 1 || channelWidth == MHz_u{160},
         "PSD for non-contiguous channels is only possible when the total width is 160 MHz");
     NS_LOG_FUNCTION(printFrequencies(centerFrequencies)
                     << channelWidth << txPower << guardBandwidth << minInnerBand << minOuterBand
                     << lowestPoint);
-    const Hz_u carrierSpacing = 78125;
+    const Hz_u carrierSpacing{78125};
     Ptr<SpectrumValue> c = Create<SpectrumValue>(
         GetSpectrumModel(centerFrequencies, channelWidth, carrierSpacing, guardBandwidth));
     // assume all frequency segments have the same width, hence split the guard bandwidth
     // accordingly over the segments
     guardBandwidth /= centerFrequencies.size();
     const auto nGuardBands =
-        static_cast<uint32_t>(((2 * guardBandwidth * 1e6) / carrierSpacing) + 0.5);
+        static_cast<uint32_t>(((MHzToHz(2 * guardBandwidth)) / carrierSpacing) + 0.5);
     const auto separationWidth = std::abs(centerFrequencies.back() - centerFrequencies.front());
-    const auto unallocatedWidth = separationWidth > 0 ? (separationWidth - (channelWidth / 2)) : 0;
+    const auto unallocatedWidth =
+        separationWidth > Hz_u{0} ? (separationWidth - (channelWidth / 2)) : 0;
     const auto nUnallocatedBands =
-        static_cast<uint32_t>(((unallocatedWidth * 1e6) / carrierSpacing) + 0.5);
+        static_cast<uint32_t>((MHzToHz(unallocatedWidth) / carrierSpacing) + 0.5);
     const auto nAllocatedBands =
-        static_cast<uint32_t>(((channelWidth * 1e6) / carrierSpacing) + 0.5);
+        static_cast<uint32_t>((MHzToHz(channelWidth) / carrierSpacing) + 0.5);
     NS_ASSERT_MSG(c->GetSpectrumModel()->GetNumBands() ==
                       (nAllocatedBands + nGuardBands + nUnallocatedBands + 1),
                   "Unexpected number of bands " << c->GetSpectrumModel()->GetNumBands());
-    Watt_u txPowerPerBand = 0.0;
+    Watt_u txPowerPerBand{0.0};
     uint32_t start1;
     uint32_t stop1;
     uint32_t start2;
@@ -514,8 +520,9 @@
     uint32_t start4;
     uint32_t stop4;
     // Prepare spectrum mask specific variables
-    auto innerSlopeWidth = static_cast<uint32_t>(
-        (1e6 / carrierSpacing) + 0.5); // size in number of subcarriers of the inner band
+    auto innerSlopeWidth =
+        static_cast<uint32_t>((MHzToHz(MHz_u{1}) / carrierSpacing) +
+                              0.5); // size in number of subcarriers of the inner band
     std::vector<std::vector<WifiSpectrumBandIndices>> subBandsPerSegment(
         centerFrequencies.size()); // list of data/pilot-containing subBands (sent at 0dBr)
     WifiSpectrumBandIndices maskBand(0, nAllocatedBands + nGuardBands + nUnallocatedBands);
@@ -524,8 +531,8 @@
     case 20:
         // 242 subcarriers (234 data + 8 pilot)
         txPowerPerBand = txPower / 242;
-        innerSlopeWidth =
-            static_cast<uint32_t>((5e5 / carrierSpacing) + 0.5); // [-10.25;-9.75] & [9.75;10.25]
+        innerSlopeWidth = static_cast<uint32_t>((Hz_u{5e5} / carrierSpacing) +
+                                                0.5); // [-10.25;-9.75] & [9.75;10.25]
         // skip the guard band and 6 subbands, then place power in 121 subbands, then
         // skip 3 DC, then place power in 121 subbands, then skip
         // the final 5 subbands and the guard band.
@@ -589,10 +596,10 @@
 
     // Create punctured bands
     auto puncturedSlopeWidth =
-        static_cast<uint32_t>((500e3 / carrierSpacing) +
+        static_cast<uint32_t>((Hz_u{500e3} / carrierSpacing) +
                               0.5); // size in number of subcarriers of the punctured slope band
     std::vector<std::vector<WifiSpectrumBandIndices>> puncturedBandsPerSegment;
-    std::size_t subcarriersPerSuband = (20 * 1e6 / carrierSpacing);
+    std::size_t subcarriersPerSuband = (MHzToHz(MHz_u{20}) / carrierSpacing);
     uint32_t start = (nGuardBands / 2);
     uint32_t stop = start + subcarriersPerSuband - 1;
     if (!puncturedSubchannels.empty())
@@ -657,7 +664,7 @@
     };
     NS_LOG_FUNCTION(printFrequencies(centerFrequencies)
                     << channelWidth << txPower << guardBandwidth << printRuIndices(ru));
-    const Hz_u carrierSpacing = 78125;
+    const Hz_u carrierSpacing{78125};
     Ptr<SpectrumValue> c = Create<SpectrumValue>(
         GetSpectrumModel(centerFrequencies, channelWidth, carrierSpacing, guardBandwidth));
 
@@ -711,11 +718,11 @@
     NS_LOG_LOGIC("Power per band " << txPowerPerBand << "W");
 
     // Different power levels
-    dBm_u txPowerRef = (10.0 * std::log10(txPowerPerBand * 1000.0));
-    dBm_u txPowerInnerBandMin = txPowerRef + minInnerBand;
-    dBm_u txPowerMiddleBandMin = txPowerRef + minOuterBand;
-    dBm_u txPowerOuterBandMin =
-        txPowerRef + lowestPoint; // TODO also take into account dBm/MHz constraints
+    dBm_u txPowerRef{10.0 * std::log10(txPowerPerBand * 1000.0)};
+    dBm_u txPowerInnerBandMin{txPowerRef + minInnerBand};
+    dBm_u txPowerMiddleBandMin{txPowerRef + minOuterBand};
+    dBm_u txPowerOuterBandMin{txPowerRef +
+                              lowestPoint}; // TODO also take into account dBm/MHz constraints
 
     // Different widths (in number of bands)
     uint32_t outerSlopeWidth =
@@ -876,23 +883,23 @@
     double puncturedSlope = (-1.0 * minInnerBand) / puncturedSlopeWidth;
 
     // Build spectrum mask
-    Watt_u previousTxPower = 0.0;
+    Watt_u previousTxPower{0.0};
     std::vector<Watt_u> txPowerValues(numBands);
     NS_ASSERT(txPowerValues.size() == numBands);
     for (size_t i = 0; i < numBands; ++i)
     {
         size_t psdIndex =
             (allocatedSubBandsPerSegment.size() == 1) ? 0 : ((i < (numBands / 2)) ? 0 : 1);
-        Watt_u txPower = 0.0;
+        Watt_u txPower{0.0};
         if (i < maskBand.first || i > maskBand.second) // outside the spectrum mask
         {
-            txPower = 0.0;
+            txPower = Watt_u{0.0};
         }
         else if (betweenPsdsBand.has_value() &&
                  (i <= betweenPsdsBand->second && i >= betweenPsdsBand->first))
         {
             // value for PSD mask 1
-            std::vector<double> txPowerWPsds(2);
+            std::vector<Watt_u> txPowerWPsds(2);
             if (i <= middleBandsRight.at(0).second && i >= middleBandsRight.at(0).first)
             {
                 txPowerWPsds.at(0) =
@@ -936,7 +943,7 @@
                 NS_ASSERT(false);
             }
 
-            txPower = std::accumulate(txPowerWPsds.cbegin(), txPowerWPsds.cend(), 0.0);
+            txPower = std::accumulate(txPowerWPsds.cbegin(), txPowerWPsds.cend(), Watt_u{0.0});
             txPower = std::max(DbmToW(txPowerRef - 25.0), txPower);
             txPower = std::min(DbmToW(txPowerRef - 20.0), txPower);
         }
@@ -1082,7 +1089,7 @@
 {
     NS_LOG_FUNCTION(c << txPower);
     // Normalize power so that total signal power equals transmit power
-    Watt_u currentTxPower = Integral(*c);
+    Watt_u currentTxPower{Integral(*c)};
     double normalizationRatio [[maybe_unused]] = currentTxPower / txPower;
     double invNormalizationRatio = txPower / currentTxPower;
     NS_LOG_LOGIC("Current power: " << currentTxPower << "W vs expected power: " << txPower << "W"
@@ -1117,7 +1124,7 @@
             ++index;
         }
     }
-    const Watt_u power = powerWattPerHertz * bandWidth;
+    const Watt_u power{powerWattPerHertz * bandWidth};
     NS_ASSERT_MSG(power >= 0.0, "Invalid calculated power " << power);
     return power;
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-spectrum-value-helper.h ns-3.44/src/wifi/model/wifi-spectrum-value-helper.h
--- ns-3.43/src/wifi/model/wifi-spectrum-value-helper.h	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/model/wifi-spectrum-value-helper.h	2025-03-09 16:55:49.803372600 -0700
@@ -13,7 +13,7 @@
 
 #include "wifi-units.h"
 
-#include <ns3/spectrum-value.h>
+#include "ns3/spectrum-value.h"
 
 #include <vector>
 
@@ -26,7 +26,7 @@
 using WifiSpectrumBandIndices = std::pair<uint32_t, uint32_t>;
 
 /**
- * \ingroup spectrum
+ * @ingroup spectrum
  *
  *  This class defines all functions to create a spectrum model for
  *  Wi-Fi based on a a spectral model aligned with an OFDM subcarrier
@@ -46,11 +46,11 @@
      * +/- the guard bands (i.e. the model will span (channelWidth +
      * 2 * guardBandwidth) MHz of bandwidth).
      *
-     * \param centerFrequencies center frequency per segment
-     * \param channelWidth total allocated channel width over all segments
-     * \param carrierSpacing carrier spacing
-     * \param guardBandwidth total width of the guard band, which will be split over the segments
-     * \return the static SpectrumModel instance corresponding to the
+     * @param centerFrequencies center frequency per segment
+     * @param channelWidth total allocated channel width over all segments
+     * @param carrierSpacing carrier spacing
+     * @param guardBandwidth total width of the guard band, which will be split over the segments
+     * @return the static SpectrumModel instance corresponding to the
      * given carrier frequency and channel width configuration.
      */
     static Ptr<SpectrumModel> GetSpectrumModel(const std::vector<MHz_u>& centerFrequencies,
@@ -64,12 +64,12 @@
      * The center frequency typically corresponds to 802.11b channel
      * center frequencies but is not restricted to those frequencies.
      *
-     * \note There is no channel width parameter; this method assumes 22 MHz
+     * @note There is no channel width parameter; this method assumes 22 MHz
      *
-     * \param centerFrequency center frequency
-     * \param txPower transmit power to allocate
-     * \param guardBandwidth width of the guard band
-     * \returns a pointer to a newly allocated SpectrumValue representing the DSSS Transmit Power
+     * @param centerFrequency center frequency
+     * @param txPower transmit power to allocate
+     * @param guardBandwidth width of the guard band
+     * @returns a pointer to a newly allocated SpectrumValue representing the DSSS Transmit Power
      * Spectral Density in W/Hz
      */
     static Ptr<SpectrumValue> CreateDsssTxPowerSpectralDensity(MHz_u centerFrequency,
@@ -81,37 +81,37 @@
      * (802.11a/g).  Channel width may vary between 20, 10, and 5 MHz.
      * Guard bandwidth also typically varies with channel width.
      *
-     * \param centerFrequency center frequency
-     * \param channelWidth channel width
-     * \param txPower transmit power to allocate
-     * \param guardBandwidth width of the guard band
-     * \param minInnerBand the minimum relative power in the inner band
-     * \param minOuterband the minimum relative power in the outer band
-     * \param lowestPoint maximum relative power of the outermost subcarriers of the guard band
-     * \return a pointer to a newly allocated SpectrumValue representing the OFDM Transmit Power
+     * @param centerFrequency center frequency
+     * @param channelWidth channel width
+     * @param txPower transmit power to allocate
+     * @param guardBandwidth width of the guard band
+     * @param minInnerBand the minimum relative power in the inner band
+     * @param minOuterband the minimum relative power in the outer band
+     * @param lowestPoint maximum relative power of the outermost subcarriers of the guard band
+     * @return a pointer to a newly allocated SpectrumValue representing the OFDM Transmit Power
      * Spectral Density in W/Hz for each Band
      */
     static Ptr<SpectrumValue> CreateOfdmTxPowerSpectralDensity(MHz_u centerFrequency,
                                                                MHz_u channelWidth,
                                                                Watt_u txPower,
                                                                MHz_u guardBandwidth,
-                                                               dBr_u minInnerBand = -20,
-                                                               dBr_u minOuterband = -28,
-                                                               dBr_u lowestPoint = -40);
+                                                               dBr_u minInnerBand = dBr_u{-20},
+                                                               dBr_u minOuterband = dBr_u{-28},
+                                                               dBr_u lowestPoint = dBr_u{-40});
 
     /**
      * Create a transmit power spectral density corresponding to OFDM duplicated over multiple 20
      * MHz subchannels. Channel width may vary between 20, 40, 80, and 160 MHz.
      *
-     * \param centerFrequencies center frequency per segment
-     * \param channelWidth total allocated channel width over all segments
-     * \param txPower transmit power to allocate
-     * \param guardBandwidth width of the guard band
-     * \param minInnerBand the minimum relative power in the inner band
-     * \param minOuterband the minimum relative power in the outer band
-     * \param lowestPoint maximum relative power of the outermost subcarriers of the guard band
-     * \param puncturedSubchannels bitmap indicating whether a 20 MHz subchannel is punctured or not
-     * \return a pointer to a newly allocated SpectrumValue representing the duplicated 20 MHz OFDM
+     * @param centerFrequencies center frequency per segment
+     * @param channelWidth total allocated channel width over all segments
+     * @param txPower transmit power to allocate
+     * @param guardBandwidth width of the guard band
+     * @param minInnerBand the minimum relative power in the inner band
+     * @param minOuterband the minimum relative power in the outer band
+     * @param lowestPoint maximum relative power of the outermost subcarriers of the guard band
+     * @param puncturedSubchannels bitmap indicating whether a 20 MHz subchannel is punctured or not
+     * @return a pointer to a newly allocated SpectrumValue representing the duplicated 20 MHz OFDM
      * Transmit Power Spectral Density in W/Hz for each Band
      */
     static Ptr<SpectrumValue> CreateDuplicated20MhzTxPowerSpectralDensity(
@@ -119,9 +119,9 @@
         MHz_u channelWidth,
         Watt_u txPower,
         MHz_u guardBandwidth,
-        dBr_u minInnerBand = -20,
-        dBr_u minOuterband = -28,
-        dBr_u lowestPoint = -40,
+        dBr_u minInnerBand = dBr_u{-20},
+        dBr_u minOuterband = dBr_u{-28},
+        dBr_u lowestPoint = dBr_u{-40},
         const std::vector<bool>& puncturedSubchannels = {});
 
     /**
@@ -129,14 +129,14 @@
      * High Throughput (HT) (802.11n/ac).  Channel width may vary between
      * 20, 40, 80, and 160 MHz.
      *
-     * \param centerFrequencies center frequency per segment
-     * \param channelWidth total allocated channel width over all segments
-     * \param txPower transmit power to allocate
-     * \param guardBandwidth width of the guard band
-     * \param minInnerBand the minimum relative power in the inner band
-     * \param minOuterband the minimum relative power in the outer band
-     * \param lowestPoint maximum relative power of the outermost subcarriers of the guard band
-     * \return a pointer to a newly allocated SpectrumValue representing the HT OFDM Transmit Power
+     * @param centerFrequencies center frequency per segment
+     * @param channelWidth total allocated channel width over all segments
+     * @param txPower transmit power to allocate
+     * @param guardBandwidth width of the guard band
+     * @param minInnerBand the minimum relative power in the inner band
+     * @param minOuterband the minimum relative power in the outer band
+     * @param lowestPoint maximum relative power of the outermost subcarriers of the guard band
+     * @return a pointer to a newly allocated SpectrumValue representing the HT OFDM Transmit Power
      * Spectral Density in W/Hz for each Band
      */
     static Ptr<SpectrumValue> CreateHtOfdmTxPowerSpectralDensity(
@@ -144,24 +144,24 @@
         MHz_u channelWidth,
         Watt_u txPower,
         MHz_u guardBandwidth,
-        dBr_u minInnerBand = -20,
-        dBr_u minOuterband = -28,
-        dBr_u lowestPoint = -40);
+        dBr_u minInnerBand = dBr_u{-20},
+        dBr_u minOuterband = dBr_u{-28},
+        dBr_u lowestPoint = dBr_u{-40});
 
     /**
      * Create a transmit power spectral density corresponding to OFDM
      * High Efficiency (HE) (802.11ax) for contiguous channels.
      * Channel width may vary between 20, 40, 80, and 160 MHz.
      *
-     * \param centerFrequency center frequency
-     * \param channelWidth channel width
-     * \param txPower transmit power to allocate
-     * \param guardBandwidth width of the guard band
-     * \param minInnerBand the minimum relative power in the inner band
-     * \param minOuterband the minimum relative power in the outer band
-     * \param lowestPoint maximum relative power of the outermost subcarriers of the guard band
-     * \param puncturedSubchannels bitmap indicating whether a 20 MHz subchannel is punctured or not
-     * \return a pointer to a newly allocated SpectrumValue representing the HE OFDM Transmit Power
+     * @param centerFrequency center frequency
+     * @param channelWidth channel width
+     * @param txPower transmit power to allocate
+     * @param guardBandwidth width of the guard band
+     * @param minInnerBand the minimum relative power in the inner band
+     * @param minOuterband the minimum relative power in the outer band
+     * @param lowestPoint maximum relative power of the outermost subcarriers of the guard band
+     * @param puncturedSubchannels bitmap indicating whether a 20 MHz subchannel is punctured or not
+     * @return a pointer to a newly allocated SpectrumValue representing the HE OFDM Transmit Power
      * Spectral Density in W/Hz for each Band
      */
     static Ptr<SpectrumValue> CreateHeOfdmTxPowerSpectralDensity(
@@ -169,9 +169,9 @@
         MHz_u channelWidth,
         Watt_u txPower,
         MHz_u guardBandwidth,
-        dBr_u minInnerBand = -20,
-        dBr_u minOuterband = -28,
-        dBr_u lowestPoint = -40,
+        dBr_u minInnerBand = dBr_u{-20},
+        dBr_u minOuterband = dBr_u{-28},
+        dBr_u lowestPoint = dBr_u{-40},
         const std::vector<bool>& puncturedSubchannels = {});
 
     /**
@@ -179,15 +179,15 @@
      * High Efficiency (HE) (802.11ax) made of one or more frequency segment(s).
      * Channel width may vary between 20, 40, 80, and 160 MHz.
      *
-     * \param centerFrequencies center frequency per segment
-     * \param channelWidth total allocated channel width over all segments
-     * \param txPower transmit power to allocate
-     * \param guardBandwidth width of the guard band
-     * \param minInnerBand the minimum relative power in the inner band
-     * \param minOuterband the minimum relative power in the outer band
-     * \param lowestPoint maximum relative power of the outermost subcarriers of the guard band
-     * \param puncturedSubchannels bitmap indicating whether a 20 MHz subchannel is punctured or not
-     * \return a pointer to a newly allocated SpectrumValue representing the HE OFDM Transmit Power
+     * @param centerFrequencies center frequency per segment
+     * @param channelWidth total allocated channel width over all segments
+     * @param txPower transmit power to allocate
+     * @param guardBandwidth width of the guard band
+     * @param minInnerBand the minimum relative power in the inner band
+     * @param minOuterband the minimum relative power in the outer band
+     * @param lowestPoint maximum relative power of the outermost subcarriers of the guard band
+     * @param puncturedSubchannels bitmap indicating whether a 20 MHz subchannel is punctured or not
+     * @return a pointer to a newly allocated SpectrumValue representing the HE OFDM Transmit Power
      * Spectral Density in W/Hz for each Band
      */
     static Ptr<SpectrumValue> CreateHeOfdmTxPowerSpectralDensity(
@@ -195,9 +195,9 @@
         MHz_u channelWidth,
         Watt_u txPower,
         MHz_u guardBandwidth,
-        dBr_u minInnerBand = -20,
-        dBr_u minOuterband = -28,
-        dBr_u lowestPoint = -40,
+        dBr_u minInnerBand = dBr_u{-20},
+        dBr_u minOuterband = dBr_u{-28},
+        dBr_u lowestPoint = dBr_u{-40},
         const std::vector<bool>& puncturedSubchannels = {});
 
     /**
@@ -205,12 +205,12 @@
      * of HE TB PPDUs for a given RU.
      * An ideal (i.e. rectangular) spectral mask is considered for the time being.
      *
-     * \param centerFrequencies center frequency per segment
-     * \param channelWidth total allocated channel width over all segments
-     * \param txPower transmit power to allocate
-     * \param guardBandwidth width of the guard band
-     * \param ru the RU band used by the STA
-     * \return a pointer to a newly allocated SpectrumValue representing the HE OFDM Transmit Power
+     * @param centerFrequencies center frequency per segment
+     * @param channelWidth total allocated channel width over all segments
+     * @param txPower transmit power to allocate
+     * @param guardBandwidth width of the guard band
+     * @param ru the RU band used by the STA
+     * @return a pointer to a newly allocated SpectrumValue representing the HE OFDM Transmit Power
      * Spectral Density on the RU used by the STA in W/Hz for each Band
      */
     static Ptr<SpectrumValue> CreateHeMuOfdmTxPowerSpectralDensity(
@@ -247,24 +247,24 @@
      * shifted inwards and a flat junction band (at -20 dBr) had to be added
      * between the inner and the middle bands.
      *
-     * \param c spectrumValue to allocate according to transmit power spectral density mask (in W/Hz
+     * @param c spectrumValue to allocate according to transmit power spectral density mask (in W/Hz
      * for each band)
-     * \param allocatedSubBandsPerSegment vector of start and stop subcarrier indexes of the
+     * @param allocatedSubBandsPerSegment vector of start and stop subcarrier indexes of the
      * allocated sub bands, for each segment
-     * \param maskBand start and stop subcarrier indexes of transmit mask (in case signal doesn't
+     * @param maskBand start and stop subcarrier indexes of transmit mask (in case signal doesn't
      * cover whole SpectrumModel)
-     * \param txPowerPerBand power allocated to each subcarrier in the allocated sub bands
-     * \param nGuardBands size (in number of subcarriers) of the guard band (left and right)
-     * \param innerSlopeWidth size (in number of subcarriers) of the inner band (i.e. slope going
+     * @param txPowerPerBand power allocated to each subcarrier in the allocated sub bands
+     * @param nGuardBands size (in number of subcarriers) of the guard band (left and right)
+     * @param innerSlopeWidth size (in number of subcarriers) of the inner band (i.e. slope going
      * from 0 dBr to -20 dBr in the figure above)
-     * \param minInnerBand the minimum relative power in the inner band (i.e., -20 dBr in the
+     * @param minInnerBand the minimum relative power in the inner band (i.e., -20 dBr in the
      * figure above)
-     * \param minOuterband the minimum relative power in the outer band (i.e., -28 dBr in the
+     * @param minOuterband the minimum relative power in the outer band (i.e., -28 dBr in the
      * figure above)
-     * \param lowestPoint maximum relative power of the outermost subcarriers of the guard band
-     * \param puncturedSubBands vector of start and stop subcarrier indexes of the punctured sub
+     * @param lowestPoint maximum relative power of the outermost subcarriers of the guard band
+     * @param puncturedSubBands vector of start and stop subcarrier indexes of the punctured sub
      * bands, for each segment
-     * \param puncturedSlopeWidth size (in number of subcarriers) of the punctured band slope
+     * @param puncturedSlopeWidth size (in number of subcarriers) of the punctured band slope
      */
     static void CreateSpectrumMaskForOfdm(
         Ptr<SpectrumValue> c,
@@ -283,26 +283,26 @@
      * Normalize the transmit spectrum mask generated by CreateSpectrumMaskForOfdm
      * so that the total transmitted power corresponds to the input value.
      *
-     * \param c spectrumValue to normalize (in W/Hz for each band)
-     * \param txPower total transmit power to allocate
+     * @param c spectrumValue to normalize (in W/Hz for each band)
+     * @param txPower total transmit power to allocate
      */
     static void NormalizeSpectrumMask(Ptr<SpectrumValue> c, Watt_u txPower);
 
     /**
      * Calculate the power of the specified band composed of uniformly-sized sub-bands.
      *
-     * \param psd received Power Spectral Density in W/Hz
-     * \param segments a vector of pair of start and stop indexes that defines each segment of the
+     * @param psd received Power Spectral Density in W/Hz
+     * @param segments a vector of pair of start and stop indexes that defines each segment of the
      * band
      *
-     * \return band power
+     * @return band power
      */
     static Watt_u GetBandPowerW(Ptr<SpectrumValue> psd,
                                 const std::vector<WifiSpectrumBandIndices>& segments);
 };
 
 /**
- * \ingroup spectrum
+ * @ingroup spectrum
  * Struct defining a frequency range between minFrequency and maxFrequency.
  */
 struct FrequencyRange
@@ -314,20 +314,20 @@
 /**
  * Compare two FrequencyRange values
  *
- * \param lhs the FrequencyRange value on the left of operator
- * \param rhs the FrequencyRange value on the right of operator
+ * @param lhs the FrequencyRange value on the left of operator
+ * @param rhs the FrequencyRange value on the right of operator
  *
- * \return true if minFrequency of left is less than minFrequency of right, false otherwise
+ * @return true if minFrequency of left is less than minFrequency of right, false otherwise
  */
 bool operator<(const FrequencyRange& lhs, const FrequencyRange& rhs);
 
 /**
  * Compare two FrequencyRange values
  *
- * \param lhs the FrequencyRange value on the left of operator
- * \param rhs the FrequencyRange value on the right of operator
+ * @param lhs the FrequencyRange value on the left of operator
+ * @param rhs the FrequencyRange value on the right of operator
  *
- * \return true if both minFrequency and maxFrequency of left are equal to minFrequency and
+ * @return true if both minFrequency and maxFrequency of left are equal to minFrequency and
  * maxFrequency of right respectively, false otherwise
  */
 bool operator==(const FrequencyRange& lhs, const FrequencyRange& rhs);
@@ -335,10 +335,10 @@
 /**
  * Compare two FrequencyRange values
  *
- * \param lhs the FrequencyRange value on the left of operator
- * \param rhs the FrequencyRange value on the right of operator
+ * @param lhs the FrequencyRange value on the left of operator
+ * @param rhs the FrequencyRange value on the right of operator
  *
- * \return true if either minFrequency or maxFrequency of left different from minFrequency or
+ * @return true if either minFrequency or maxFrequency of left different from minFrequency or
  * maxFrequency of right respectively, false otherwise
  */
 bool operator!=(const FrequencyRange& lhs, const FrequencyRange& rhs);
@@ -346,24 +346,24 @@
 /**
  * Serialize FrequencyRange values to ostream (human-readable).
  *
- * \param os the output stream
- * \param freqRange the FrequencyRange
+ * @param os the output stream
+ * @param freqRange the FrequencyRange
  *
- * \return std::ostream
+ * @return std::ostream
  */
 std::ostream& operator<<(std::ostream& os, const FrequencyRange& freqRange);
 
 /// Identifier for the frequency range covering the whole wifi spectrum
-constexpr FrequencyRange WHOLE_WIFI_SPECTRUM = {2401, 7125};
+constexpr FrequencyRange WHOLE_WIFI_SPECTRUM = {MHz_u{2401}, MHz_u{7125}};
 
 /// Identifier for the frequency range covering the wifi spectrum in the 2.4 GHz band
-constexpr FrequencyRange WIFI_SPECTRUM_2_4_GHZ = {2401, 2483};
+constexpr FrequencyRange WIFI_SPECTRUM_2_4_GHZ = {MHz_u{2401}, MHz_u{2483}};
 
 /// Identifier for the frequency range covering the wifi spectrum in the 5 GHz band
-constexpr FrequencyRange WIFI_SPECTRUM_5_GHZ = {5170, 5915};
+constexpr FrequencyRange WIFI_SPECTRUM_5_GHZ = {MHz_u{5170}, MHz_u{5915}};
 
 /// Identifier for the frequency range covering the wifi spectrum in the 6 GHz band
-constexpr FrequencyRange WIFI_SPECTRUM_6_GHZ = {5945, 7125};
+constexpr FrequencyRange WIFI_SPECTRUM_6_GHZ = {MHz_u{5945}, MHz_u{7125}};
 
 } // namespace ns3
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-standards.h ns-3.44/src/wifi/model/wifi-standards.h
--- ns-3.43/src/wifi/model/wifi-standards.h	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/model/wifi-standards.h	2025-03-09 16:55:49.803372600 -0700
@@ -22,7 +22,7 @@
 {
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * Identifies the IEEE 802.11 specifications that a Wifi device can be configured to use.
  */
 enum WifiStandard
@@ -41,11 +41,11 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the stream
- * \param standard the standard
- * \returns a reference to the stream
+ * @param os the stream
+ * @param standard the standard
+ * @returns a reference to the stream
  */
 inline std::ostream&
 operator<<(std::ostream& os, WifiStandard standard)
@@ -76,15 +76,15 @@
 }
 
 /**
- * \brief map a given standard configured by the user to the allowed PHY bands
+ * @brief map a given standard configured by the user to the allowed PHY bands
  */
 extern const std::map<WifiStandard, std::list<WifiPhyBand>> wifiStandards;
 
 /**
  * Get the type of the frequency channel for the given standard
  *
- * \param standard the standard
- * \return the type of the frequency channel for the given standard
+ * @param standard the standard
+ * @return the type of the frequency channel for the given standard
  */
 inline FrequencyChannelType
 GetFrequencyChannelType(WifiStandard standard)
@@ -103,9 +103,9 @@
 /**
  * Get the default channel width for the given PHY standard and band.
  *
- * \param standard the given standard
- * \param band the given PHY band
- * \return the default channel width for the given standard
+ * @param standard the given standard
+ * @param band the given PHY band
+ * @return the default channel width for the given standard
  */
 inline MHz_u
 GetDefaultChannelWidth(WifiStandard standard, WifiPhyBand band)
@@ -113,26 +113,26 @@
     switch (standard)
     {
     case WIFI_STANDARD_80211b:
-        return 22;
+        return MHz_u{22};
     case WIFI_STANDARD_80211p:
-        return 10;
+        return MHz_u{10};
     case WIFI_STANDARD_80211ac:
-        return 80;
+        return MHz_u{80};
     case WIFI_STANDARD_80211ad:
-        return 2160;
+        return MHz_u{2160};
     case WIFI_STANDARD_80211ax:
     case WIFI_STANDARD_80211be:
-        return (band == WIFI_PHY_BAND_2_4GHZ ? 20 : 80);
+        return (band == WIFI_PHY_BAND_2_4GHZ ? MHz_u{20} : MHz_u{80});
     default:
-        return 20;
+        return MHz_u{20};
     }
 }
 
 /**
  * Get the default PHY band for the given standard.
  *
- * \param standard the given standard
- * \return the default PHY band for the given standard
+ * @param standard the given standard
+ * @return the default PHY band for the given standard
  */
 inline WifiPhyBand
 GetDefaultPhyBand(WifiStandard standard)
@@ -155,9 +155,9 @@
 /**
  * Get the TypeId name for the FrameExchangeManager corresponding to the given standard.
  *
- * \param standard the given standard
- * \param qosSupported whether QoS is supported (ignored if standard is at least HT)
- * \return the TypeId name for the FrameExchangeManager corresponding to the given standard
+ * @param standard the given standard
+ * @param qosSupported whether QoS is supported (ignored if standard is at least HT)
+ * @return the TypeId name for the FrameExchangeManager corresponding to the given standard
  */
 inline std::string
 GetFrameExchangeManagerTypeIdName(WifiStandard standard, bool qosSupported)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-tx-current-model.h ns-3.44/src/wifi/model/wifi-tx-current-model.h
--- ns-3.43/src/wifi/model/wifi-tx-current-model.h	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/model/wifi-tx-current-model.h	2025-03-09 16:55:49.803372600 -0700
@@ -17,17 +17,17 @@
 {
 
 /**
- * \ingroup energy
+ * @ingroup energy
  *
- * \brief Model the transmit current as a function of the transmit power and mode
+ * @brief Model the transmit current as a function of the transmit power and mode
  *
  */
 class WifiTxCurrentModel : public Object
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -35,16 +35,16 @@
     ~WifiTxCurrentModel() override;
 
     /**
-     * \param txPower the nominal TX power
-     * \returns the transmit current
+     * @param txPower the nominal TX power
+     * @returns the transmit current
      */
     virtual ampere_u CalcTxCurrent(dBm_u txPower) const = 0;
 };
 
 /**
- * \ingroup energy
+ * @ingroup energy
  *
- * \brief a linear model of the Wifi transmit current
+ * @brief a linear model of the Wifi transmit current
  *
  * This model assumes that the transmit current is a linear function
  * of the nominal transmit power used to send the frame.
@@ -76,8 +76,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-tx-parameters.cc ns-3.44/src/wifi/model/wifi-tx-parameters.cc
--- ns-3.43/src/wifi/model/wifi-tx-parameters.cc	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/model/wifi-tx-parameters.cc	2025-03-09 16:55:49.803372600 -0700
@@ -270,8 +270,6 @@
 uint32_t
 WifiTxParameters::GetSize(Mac48Address receiver) const
 {
-    NS_LOG_FUNCTION(this << receiver);
-
     auto infoIt = m_info.find(receiver);
 
     if (infoIt == m_info.end())
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-tx-parameters.h ns-3.44/src/wifi/model/wifi-tx-parameters.h
--- ns-3.43/src/wifi/model/wifi-tx-parameters.h	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/model/wifi-tx-parameters.h	2025-03-09 16:55:49.803372600 -0700
@@ -27,7 +27,7 @@
 struct WifiAcknowledgment;
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * This class stores the TX parameters (TX vector, protection mechanism,
  * acknowledgment mechanism, TX duration, ...) for a frame of different types
@@ -40,28 +40,28 @@
     /**
      * Copy constructor.
      *
-     * \param txParams the WifiTxParameters to copy
+     * @param txParams the WifiTxParameters to copy
      */
     WifiTxParameters(const WifiTxParameters& txParams);
 
     /**
      * Copy assignment operator.
-     * \param txParams the TX parameters to assign to this object
-     * \return the reference to this object
+     * @param txParams the TX parameters to assign to this object
+     * @return the reference to this object
      */
     WifiTxParameters& operator=(const WifiTxParameters& txParams);
 
     /**
      * Move constructor. Must define it manually because copy constructor is explicit.
-     * \param txParams the WifiTxParameters to copy
+     * @param txParams the WifiTxParameters to copy
      */
     WifiTxParameters(WifiTxParameters&& txParams) = default;
 
     /**
      * Move assignment operator. Must define it manually because copy assignment
      * operator is explicit.
-     * \param txParams the TX parameters to assign to this object
-     * \return the reference to this object
+     * @param txParams the TX parameters to assign to this object
+     * @return the reference to this object
      */
     WifiTxParameters& operator=(WifiTxParameters&& txParams) = default;
 
@@ -80,7 +80,7 @@
      * to the same receiver already exists in the frame, A-MPDU aggregation is considered.
      * Store information needed to "undo" the addition of the MPDU by calling UndoAddMpdu().
      *
-     * \param mpdu the MPDU being added
+     * @param mpdu the MPDU being added
      */
     void AddMpdu(Ptr<const WifiMpdu> mpdu);
 
@@ -93,8 +93,8 @@
      * Check if the last added MPDU is the first MPDU for the given receiver.
      * Call this method only after adding an MPDU for the given receiver.
      *
-     * \param receiver the MAC address of the given receiver
-     * \return whether the last added MPDU is the first MPDU for the given receiver
+     * @param receiver the MAC address of the given receiver
+     * @return whether the last added MPDU is the first MPDU for the given receiver
      */
     bool LastAddedIsFirstMpdu(Mac48Address receiver) const;
 
@@ -102,31 +102,31 @@
      * Record that an MSDU is being aggregated to the last MPDU added to the frame
      * that hase the same receiver.
      *
-     * \param msdu the MSDU being aggregated
+     * @param msdu the MSDU being aggregated
      */
     void AggregateMsdu(Ptr<const WifiMpdu> msdu);
 
     /**
      * Get the size in bytes of the frame in case the given MPDU is added.
      *
-     * \param mpdu the given MPDU
-     * \return the size in bytes of the frame in case the given MPDU is added
+     * @param mpdu the given MPDU
+     * @return the size in bytes of the frame in case the given MPDU is added
      */
     uint32_t GetSizeIfAddMpdu(Ptr<const WifiMpdu> mpdu) const;
 
     /**
      * Get the size in bytes of the frame in case the given MSDU is aggregated.
      *
-     * \param msdu the given MSDU
-     * \return size in bytes of the frame in case the given MSDU is aggregated
+     * @param msdu the given MSDU
+     * @return size in bytes of the frame in case the given MSDU is aggregated
      */
     uint32_t GetSizeIfAggregateMsdu(Ptr<const WifiMpdu> msdu) const;
 
     /**
      * Get the size in bytes of the (A-)MPDU addressed to the given receiver.
      *
-     * \param receiver the MAC address of the given receiver
-     * \return the size in bytes of the (A-)MPDU addressed to the given receiver
+     * @param receiver the MAC address of the given receiver
+     * @return the size in bytes of the (A-)MPDU addressed to the given receiver
      */
     uint32_t GetSize(Mac48Address receiver) const;
 
@@ -146,8 +146,8 @@
      * Get a pointer to the information about the PSDU addressed to the given
      * receiver, if present, and a null pointer otherwise.
      *
-     * \param receiver the MAC address of the receiver
-     * \return a pointer to an entry in the PSDU information map or a null pointer
+     * @param receiver the MAC address of the receiver
+     * @return a pointer to an entry in the PSDU information map or a null pointer
      */
     const PsduInfo* GetPsduInfo(Mac48Address receiver) const;
 
@@ -157,13 +157,13 @@
     /**
      * Get a const reference to the map containing information about PSDUs.
      *
-     * \return a const reference to the map containing information about PSDUs
+     * @return a const reference to the map containing information about PSDUs
      */
     const PsduInfoMap& GetPsduInfoMap() const;
 
     /**
-     * \brief Print the object contents.
-     * \param os output stream in which the data should be printed.
+     * @brief Print the object contents.
+     * @param os output stream in which the data should be printed.
      */
     void Print(std::ostream& os) const;
 
@@ -177,11 +177,11 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the output stream
- * \param txParams the TX parameters
- * \returns a reference to the stream
+ * @param os the output stream
+ * @param txParams the TX parameters
+ * @returns a reference to the stream
  */
 std::ostream& operator<<(std::ostream& os, const WifiTxParameters* txParams);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-tx-timer.cc ns-3.44/src/wifi/model/wifi-tx-timer.cc
--- ns-3.43/src/wifi/model/wifi-tx-timer.cc	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/model/wifi-tx-timer.cc	2025-03-09 16:55:49.803372600 -0700
@@ -23,7 +23,7 @@
     : m_timeoutEvent(),
       m_reason(NOT_RUNNING),
       m_impl(nullptr),
-      m_end(Seconds(0))
+      m_end()
 {
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-tx-timer.h ns-3.44/src/wifi/model/wifi-tx-timer.h
--- ns-3.43/src/wifi/model/wifi-tx-timer.h	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/model/wifi-tx-timer.h	2025-03-09 16:55:49.803372600 -0700
@@ -28,7 +28,7 @@
 typedef std::unordered_map<uint16_t /* staId */, Ptr<WifiPsdu> /* PSDU */> WifiPsduMap;
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  *
  * This class is used to handle the timer that a station starts when transmitting
  * a frame that solicits a response. The timeout can be rescheduled (multiple times)
@@ -38,8 +38,8 @@
 {
   public:
     /**
-     * \enum Reason
-     * \brief The reason why the timer was started
+     * @enum Reason
+     * @brief The reason why the timer was started
      */
     enum Reason : uint8_t
     {
@@ -65,15 +65,15 @@
      * This method starts a timer of the given duration and schedules a call to
      * the given method in case the timer expires.
      *
-     * \tparam MEM \deduced Class method function signature type
-     * \tparam OBJ \deduced Class type of the object
-     * \tparam Args \deduced Type template parameter pack
-     * \param reason the reason why the timer was started
-     * \param delay the time to the expiration of the timer
-     * \param from the set of stations we expect to receive a response from
-     * \param mem_ptr Member method pointer to invoke
-     * \param obj The object on which to invoke the member method
-     * \param args The arguments to pass to the invoked method
+     * @tparam MEM \deduced Class method function signature type
+     * @tparam OBJ \deduced Class type of the object
+     * @tparam Args \deduced Type template parameter pack
+     * @param reason the reason why the timer was started
+     * @param delay the time to the expiration of the timer
+     * @param from the set of stations we expect to receive a response from
+     * @param mem_ptr Member method pointer to invoke
+     * @param obj The object on which to invoke the member method
+     * @param args The arguments to pass to the invoked method
      */
     template <typename MEM, typename OBJ, typename... Args>
     void Set(Reason reason,
@@ -87,7 +87,7 @@
      * Reschedule the timer to time out the given amount of time from the moment
      * this function is called. Note that nothing is done if the timer is not running.
      *
-     * \param delay the time to the expiration of the timer
+     * @param delay the time to the expiration of the timer
      */
     void Reschedule(const Time& delay);
 
@@ -95,22 +95,22 @@
      * Get the reason why the timer was started. Call
      * this method only if the timer is running
      *
-     * \return the reason why the timer was started
+     * @return the reason why the timer was started
      */
     Reason GetReason() const;
 
     /**
      * Get a string associated with the given reason
      *
-     * \param reason the given reason
-     * \return a string associated with the given reason
+     * @param reason the given reason
+     * @return a string associated with the given reason
      */
     std::string GetReasonString(Reason reason) const;
 
     /**
      * Return true if the timer is running
      *
-     * \return true if the timer is running
+     * @return true if the timer is running
      */
     bool IsRunning() const;
 
@@ -122,19 +122,19 @@
     /**
      * Notify that a response was got from the given station.
      *
-     * \param from the MAC address of the given station
+     * @param from the MAC address of the given station
      */
     void GotResponseFrom(const Mac48Address& from);
 
     /**
-     * \return the set of stations that are still expected to respond
+     * @return the set of stations that are still expected to respond
      */
     const std::set<Mac48Address>& GetStasExpectedToRespond() const;
 
     /**
      * Get the remaining time until the timer will expire.
      *
-     * \return the remaining time until the timer will expire.
+     * @return the remaining time until the timer will expire.
      *         If the timer is not running, this method returns zero.
      */
     Time GetDelayLeft() const;
@@ -158,7 +158,7 @@
     /**
      * Set the callback to invoke when the TX timer following the transmission of an MPDU expires.
      *
-     * \param callback the callback to invoke when the TX timer following the transmission
+     * @param callback the callback to invoke when the TX timer following the transmission
      *                 of an MPDU expires
      */
     void SetMpduResponseTimeoutCallback(MpduResponseTimeout callback) const;
@@ -166,7 +166,7 @@
     /**
      * Set the callback to invoke when the TX timer following the transmission of a PSDU expires.
      *
-     * \param callback the callback to invoke when the TX timer following the transmission
+     * @param callback the callback to invoke when the TX timer following the transmission
      *                 of a PSDU expires
      */
     void SetPsduResponseTimeoutCallback(PsduResponseTimeout callback) const;
@@ -175,7 +175,7 @@
      * Set the callback to invoke when the TX timer following the transmission of a PSDU map
      * expires.
      *
-     * \param callback the callback to invoke when the TX timer following the transmission
+     * @param callback the callback to invoke when the TX timer following the transmission
      *                 of a PSDU map expires
      */
     void SetPsduMapResponseTimeoutCallback(PsduMapResponseTimeout callback) const;
@@ -185,12 +185,12 @@
      * This method is called when the timer expires. It invokes the callbacks
      * and the method set by the user.
      *
-     * \tparam MEM \deduced Class method function signature type
-     * \tparam OBJ \deduced Class type of the object
-     * \tparam Args \deduced Type template parameter pack
-     * \param mem_ptr Member method pointer to invoke
-     * \param obj The object on which to invoke the member method
-     * \param args The arguments to pass to the invoked method
+     * @tparam MEM \deduced Class method function signature type
+     * @tparam OBJ \deduced Class type of the object
+     * @tparam Args \deduced Type template parameter pack
+     * @param mem_ptr Member method pointer to invoke
+     * @param obj The object on which to invoke the member method
+     * @param args The arguments to pass to the invoked method
      */
     template <typename MEM, typename OBJ, typename... Args>
     void Timeout(MEM mem_ptr, OBJ obj, Args... args);
@@ -204,8 +204,8 @@
      * This method is called when the timer expires to feed the MPDU response
      * timeout callback.
      *
-     * \param item the MPDU followed by no response
-     * \param txVector the TXVECTOR used to transmit the MPDU
+     * @param item the MPDU followed by no response
+     * @param txVector the TXVECTOR used to transmit the MPDU
      */
     void FeedTraceSource(Ptr<WifiMpdu> item, WifiTxVector txVector);
 
@@ -213,8 +213,8 @@
      * This method is called when the timer expires to feed the PSDU response
      * timeout callback.
      *
-     * \param psdu the PSDU followed by no response
-     * \param txVector the TXVECTOR used to transmit the PSDU
+     * @param psdu the PSDU followed by no response
+     * @param txVector the TXVECTOR used to transmit the PSDU
      */
     void FeedTraceSource(Ptr<WifiPsdu> psdu, WifiTxVector txVector);
 
@@ -222,8 +222,8 @@
      * This method is called when the timer expires to feed the PSDU map response
      * timeout callback.
      *
-     * \param psduMap the PSDU map for which not all responses were received
-     * \param nTotalStations the total number of expected responses
+     * @param psduMap the PSDU map for which not all responses were received
+     * @param nTotalStations the total number of expected responses
      */
     void FeedTraceSource(WifiPsduMap* psduMap, std::size_t nTotalStations);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-tx-vector.cc ns-3.44/src/wifi/model/wifi-tx-vector.cc
--- ns-3.43/src/wifi/model/wifi-tx-vector.cc	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/model/wifi-tx-vector.cc	2025-03-09 16:55:49.803372600 -0700
@@ -10,6 +10,7 @@
 #include "wifi-tx-vector.h"
 
 #include "wifi-phy-common.h"
+#include "wifi-utils.h"
 
 #include "ns3/abort.h"
 #include "ns3/eht-phy.h"
@@ -25,7 +26,7 @@
 WifiTxVector::WifiTxVector()
     : m_txPowerLevel(1),
       m_preamble(WIFI_PREAMBLE_LONG),
-      m_channelWidth(20),
+      m_channelWidth(MHz_u{20}),
       m_guardInterval(NanoSeconds(800)),
       m_nTx(1),
       m_nss(1),
@@ -266,7 +267,7 @@
 bool
 WifiTxVector::IsNonHtDuplicate() const
 {
-    return ((m_channelWidth >= 40) && !IsMu() && (GetModulationClass() < WIFI_MOD_CLASS_HT));
+    return ((m_channelWidth >= MHz_u{40}) && !IsMu() && (GetModulationClass() < WIFI_MOD_CLASS_HT));
 }
 
 void
@@ -442,7 +443,7 @@
         return false;
     }
     const auto& modeName = m_mode.GetUniqueName();
-    if (m_channelWidth == 20)
+    if (m_channelWidth == MHz_u{20})
     {
         if (m_nss != 3 && m_nss != 6)
         {
@@ -452,7 +453,7 @@
             }
         }
     }
-    else if (m_channelWidth == 80)
+    else if (m_channelWidth == MHz_u{80})
     {
         if (m_nss == 3 || m_nss == 7)
         {
@@ -469,7 +470,7 @@
             }
         }
     }
-    else if (m_channelWidth == 160)
+    else if (m_channelWidth == MHz_u{160})
     {
         if (m_nss == 3)
         {
@@ -657,11 +658,10 @@
     NS_ABORT_MSG_IF(m_preamble < WIFI_PREAMBLE_HE_SU,
                     "Only HE (or later) authorized for preamble puncturing");
     NS_ABORT_MSG_IF(
-        m_channelWidth < 80,
+        m_channelWidth < MHz_u{80},
         "Preamble puncturing only possible for transmission bandwidth of 80 MHz or larger");
-    [[maybe_unused]] const std::size_t num20MhzSubchannels = m_channelWidth / 20;
     NS_ABORT_MSG_IF(!inactiveSubchannels.empty() &&
-                        inactiveSubchannels.size() != num20MhzSubchannels,
+                        inactiveSubchannels.size() != Count20MHzSubchannels(m_channelWidth),
                     "The size of the inactive subchannnels bitmap should be equal to the number of "
                     "20 MHz subchannels");
     m_inactiveSubchannels = inactiveSubchannels;
@@ -686,7 +686,7 @@
 std::optional<Center26ToneRuIndication>
 WifiTxVector::GetCenter26ToneRuIndication() const
 {
-    if (!IsDlMu() || (m_channelWidth < 80))
+    if (!IsDlMu() || (m_channelWidth < MHz_u{80}))
     {
         return std::nullopt;
     }
@@ -786,7 +786,7 @@
 RuAllocation
 WifiTxVector::DeriveRuAllocation(uint8_t p20Index) const
 {
-    RuAllocation ruAllocations(m_channelWidth / 20, HeRu::EMPTY_242_TONE_RU);
+    RuAllocation ruAllocations(Count20MHzSubchannels(m_channelWidth), HeRu::EMPTY_242_TONE_RU);
     std::vector<HeRu::RuType> ruTypes{};
     ruTypes.resize(ruAllocations.size());
     const auto& orderedMap = GetUserInfoMapOrderedByRus(p20Index);
@@ -795,9 +795,10 @@
         const auto ruType = ru.GetRuType();
         const auto ruBw = HeRu::GetBandwidth(ruType);
         const auto isPrimary80MHz = ru.GetPrimary80MHz();
-        const auto rusPerSubchannel = HeRu::GetRusOfType(ruBw > 20 ? ruBw : 20, ruType);
+        const auto rusPerSubchannel =
+            HeRu::GetRusOfType(ruBw > MHz_u{20} ? ruBw : MHz_u{20}, ruType);
         auto ruIndex = ru.GetIndex();
-        if ((m_channelWidth >= 80) && (ruIndex > 19))
+        if ((m_channelWidth >= MHz_u{80}) && (ruIndex > 19))
         {
             // take into account the center 26-tone RU in the primary 80 MHz
             ruIndex--;
@@ -809,17 +810,16 @@
         }
         if (!isPrimary80MHz && (ruType != HeRu::RU_2x996_TONE))
         {
-            NS_ASSERT(m_channelWidth > 80);
+            NS_ASSERT(m_channelWidth > MHz_u{80});
             // adjust RU index for the secondary 80 MHz: in that case index is restarting at 1,
             // hence we need to add an offset corresponding to the number of RUs of the same type in
             // the primary 80 MHz
-            ruIndex += HeRu::GetRusOfType(80, ruType).size();
+            ruIndex += HeRu::GetRusOfType(MHz_u{80}, ruType).size();
         }
-        const auto index =
-            (ruBw < 20) ? ((ruIndex - 1) / rusPerSubchannel.size()) : ((ruIndex - 1) * (ruBw / 20));
-        const auto numSubchannelsForRu = (ruBw < 20) ? 1 : (ruBw / 20);
-        [[maybe_unused]] const std::size_t num20MhzSubchannels = m_channelWidth / 20;
-        NS_ABORT_IF(index >= num20MhzSubchannels);
+        const auto numSubchannelsForRu = (ruBw < MHz_u{20}) ? 1 : Count20MHzSubchannels(ruBw);
+        const auto index = (ruBw < MHz_u{20}) ? ((ruIndex - 1) / rusPerSubchannel.size())
+                                              : ((ruIndex - 1) * numSubchannelsForRu);
+        NS_ABORT_IF(index >= Count20MHzSubchannels(m_channelWidth));
         auto ruAlloc = HeRu::GetEqualizedRuAllocation(ruType, false);
         if (ruAllocations.at(index) != HeRu::EMPTY_242_TONE_RU)
         {
@@ -840,7 +840,7 @@
                 NS_ASSERT_MSG(false, "unsupported RU combination");
             }
         }
-        for (auto i = 0; i < numSubchannelsForRu; ++i)
+        for (std::size_t i = 0; i < numSubchannelsForRu; ++i)
         {
             ruTypes.at(index + i) = ruType;
             ruAllocations.at(index + i) = ruAlloc;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-tx-vector.h ns-3.44/src/wifi/model/wifi-tx-vector.h
--- ns-3.43/src/wifi/model/wifi-tx-vector.h	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/model/wifi-tx-vector.h	2025-03-09 16:55:49.803372600 -0700
@@ -38,24 +38,24 @@
     /**
      * Compare this user info to the given user info.
      *
-     * \param other the given user info
-     * \return true if this user info compares equal to the given user info, false otherwise
+     * @param other the given user info
+     * @return true if this user info compares equal to the given user info, false otherwise
      */
     bool operator==(const HeMuUserInfo& other) const;
     /**
      * Compare this user info to the given user info.
      *
-     * \param other the given user info
-     * \return true if this user info differs from the given user info, false otherwise
+     * @param other the given user info
+     * @return true if this user info differs from the given user info, false otherwise
      */
     bool operator!=(const HeMuUserInfo& other) const;
 };
 
-/// 8 bit RU_ALLOCATION per 20 MHz
-using RuAllocation = std::vector<uint8_t>;
+/// 9 bits RU_ALLOCATION per 20 MHz
+using RuAllocation = std::vector<uint16_t>;
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * Enum for the different values for CENTER_26_TONE_RU
  */
 enum Center26ToneRuIndication : uint8_t
@@ -88,7 +88,7 @@
  * still needs to initialize at least the mode and transmit power level
  * appropriately.
  *
- * \note the above reference is valid for the DSSS PHY only (clause
+ * @note the above reference is valid for the DSSS PHY only (clause
  * 16). TXVECTOR is defined also for the other PHYs, however they
  * don't include the TXPWRLVL explicitly in the TXVECTOR. This is
  * somewhat strange, since all PHYs actually have a
@@ -108,20 +108,20 @@
     /**
      * Create a TXVECTOR with the given parameters.
      *
-     * \param mode WifiMode
-     * \param powerLevel transmission power level
-     * \param preamble preamble type
-     * \param guardInterval the guard interval duration in nanoseconds
-     * \param nTx the number of TX antennas
-     * \param nss the number of spatial STBC streams (NSS)
-     * \param ness the number of extension spatial streams (NESS)
-     * \param channelWidth the channel width
-     * \param aggregation enable or disable MPDU aggregation
-     * \param stbc enable or disable STBC
-     * \param ldpc enable or disable LDPC (BCC is used otherwise)
-     * \param bssColor the BSS color
-     * \param length the LENGTH field of the L-SIG
-     * \param triggerResponding the Trigger Responding parameter
+     * @param mode WifiMode
+     * @param powerLevel transmission power level
+     * @param preamble preamble type
+     * @param guardInterval the guard interval duration in nanoseconds
+     * @param nTx the number of TX antennas
+     * @param nss the number of spatial STBC streams (NSS)
+     * @param ness the number of extension spatial streams (NESS)
+     * @param channelWidth the channel width
+     * @param aggregation enable or disable MPDU aggregation
+     * @param stbc enable or disable STBC
+     * @param ldpc enable or disable LDPC (BCC is used otherwise)
+     * @param bssColor the BSS color
+     * @param length the LENGTH field of the L-SIG
+     * @param triggerResponding the Trigger Responding parameter
      */
     WifiTxVector(WifiMode mode,
                  uint8_t powerLevel,
@@ -139,12 +139,12 @@
                  bool triggerResponding = false);
     /**
      * Copy constructor
-     * \param txVector the TXVECTOR to copy
+     * @param txVector the TXVECTOR to copy
      */
     WifiTxVector(const WifiTxVector& txVector);
 
     /**
-     * \returns whether mode has been initialized
+     * @returns whether mode has been initialized
      */
     bool GetModeInitialized() const;
     /**
@@ -153,79 +153,79 @@
      * 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 MU
-     * \returns the selected payload transmission mode
+     * @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
+     * @param mode the payload WifiMode
      */
     void SetMode(WifiMode mode);
     /**
      * Sets the selected payload transmission mode for a given STA ID (for MU only)
      *
-     * \param mode
-     * \param staId the station ID for MU
+     * @param mode
+     * @param staId the station ID for MU
      */
     void SetMode(WifiMode mode, uint16_t staId);
 
     /**
      * Get the modulation class specified by this TXVECTOR.
      *
-     * \return the Modulation Class specified by this TXVECTOR
+     * @return the Modulation Class specified by this TXVECTOR
      */
     WifiModulationClass GetModulationClass() const;
 
     /**
-     * \returns the transmission power level
+     * @returns the transmission power level
      */
     uint8_t GetTxPowerLevel() const;
     /**
      * Sets the selected transmission power level
      *
-     * \param powerlevel the transmission power level
+     * @param powerlevel the transmission power level
      */
     void SetTxPowerLevel(uint8_t powerlevel);
     /**
-     * \returns the preamble type
+     * @returns the preamble type
      */
     WifiPreamble GetPreambleType() const;
     /**
      * Sets the preamble type
      *
-     * \param preamble the preamble type
+     * @param preamble the preamble type
      */
     void SetPreambleType(WifiPreamble preamble);
     /**
-     * \returns the channel width
+     * @returns the channel width
      */
     MHz_u GetChannelWidth() const;
     /**
      * Sets the selected channelWidth
      *
-     * \param channelWidth the channel width
+     * @param channelWidth the channel width
      */
     void SetChannelWidth(MHz_u channelWidth);
     /**
-     * \returns the guard interval duration (in nanoseconds)
+     * @returns the guard interval duration (in nanoseconds)
      */
     Time GetGuardInterval() const;
     /**
      * Sets the guard interval duration (in nanoseconds)
      *
-     * \param guardInterval the guard interval duration (in nanoseconds)
+     * @param guardInterval the guard interval duration (in nanoseconds)
      */
     void SetGuardInterval(Time guardInterval);
     /**
-     * \returns the number of TX antennas
+     * @returns the number of TX antennas
      */
     uint8_t GetNTx() const;
     /**
      * Sets the number of TX antennas
      *
-     * \param nTx the number of TX antennas
+     * @param nTx the number of TX antennas
      */
     void SetNTx(uint8_t nTx);
     /**
@@ -234,113 +234,113 @@
      * return the number of spatial streams for the transmission to the station
      * identified by the given STA-ID.
      *
-     * \param staId the station ID for MU
-     * \returns the number of spatial streams
+     * @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 over all RUs of an HE MU (used for OFDMA)
+     * @returns the maximum number of Nss over all RUs of an HE MU (used for OFDMA)
      */
     uint8_t GetNssMax() const;
     /**
-     * \returns the total number of Nss for a given RU of an HE MU (used for full bandwidth MU-MIMO)
+     * @returns the total number of Nss for a given RU of an HE MU (used for full bandwidth MU-MIMO)
      */
     uint8_t GetNssTotal() const;
     /**
      * Sets the number of Nss
      *
-     * \param nss the number of spatial streams
+     * @param nss the number of spatial streams
      */
     void SetNss(uint8_t nss);
     /**
      * Sets the number of Nss for MU
      *
-     * \param nss the number of spatial streams
-     * \param staId the station ID for MU
+     * @param nss the number of spatial streams
+     * @param staId the station ID for MU
      */
     void SetNss(uint8_t nss, uint16_t staId);
     /**
-     * \returns the number of extended spatial streams
+     * @returns the number of extended spatial streams
      */
     uint8_t GetNess() const;
     /**
      * Sets the Ness number
      *
-     * \param ness the number of extended spatial streams
+     * @param ness the number of extended spatial streams
      */
     void SetNess(uint8_t ness);
     /**
      * Checks whether the PSDU contains A-MPDU.
-     * \returns true if this PSDU has A-MPDU aggregation,
+     * @returns true if this PSDU has A-MPDU aggregation,
      *          false otherwise
      */
     bool IsAggregation() const;
     /**
      * Sets if PSDU contains A-MPDU.
      *
-     * \param aggregation whether the PSDU contains A-MPDU or not
+     * @param aggregation whether the PSDU contains A-MPDU or not
      */
     void SetAggregation(bool aggregation);
     /**
      * Check if STBC is used or not
      *
-     * \returns true if STBC is used,
+     * @returns true if STBC is used,
      *           false otherwise
      */
     bool IsStbc() const;
     /**
      * Sets if STBC is being used
      *
-     * \param stbc enable or disable STBC
+     * @param stbc enable or disable STBC
      */
     void SetStbc(bool stbc);
     /**
      * Check if LDPC FEC coding is used or not
      *
-     * \returns true if LDPC is used,
+     * @returns true if LDPC is used,
      *          false if BCC is used
      */
     bool IsLdpc() const;
     /**
      * Sets if LDPC FEC coding is being used
      *
-     * \param ldpc enable or disable LDPC
+     * @param ldpc enable or disable LDPC
      */
     void SetLdpc(bool ldpc);
     /**
      * Checks whether this TXVECTOR corresponds to a non-HT duplicate.
-     * \returns true if this TXVECTOR corresponds to a non-HT duplicate,
+     * @returns true if this TXVECTOR corresponds to a non-HT duplicate,
      *          false otherwise.
      */
     bool IsNonHtDuplicate() const;
     /**
      * Set the BSS color
-     * \param color the BSS color
+     * @param color the BSS color
      */
     void SetBssColor(uint8_t color);
     /**
      * Get the BSS color
-     * \return the BSS color
+     * @return the BSS color
      */
     uint8_t GetBssColor() const;
     /**
      * Set the LENGTH field of the L-SIG
-     * \param length the LENGTH field of the L-SIG
+     * @param length the LENGTH field of the L-SIG
      */
     void SetLength(uint16_t length);
     /**
      * Get the LENGTH field of the L-SIG
-     * \return the LENGTH field of the L-SIG
+     * @return the LENGTH field of the L-SIG
      */
     uint16_t GetLength() const;
     /**
      * Return true if the Trigger Responding parameter is set to true, false otherwise.
-     * \return true if the Trigger Responding parameter is set to true, false otherwise
+     * @return true if the Trigger Responding parameter is set to true, false otherwise
      */
     bool IsTriggerResponding() const;
     /**
      * Set the Trigger Responding parameter to the given value
-     * \param triggerResponding the value for the Trigger Responding parameter
+     * @param triggerResponding the value for the Trigger Responding parameter
      */
     void SetTriggerResponding(bool triggerResponding);
     /**
@@ -350,86 +350,86 @@
      * If a PHY band is specified, it is checked that the PHY band is appropriate for
      * the modulation class of the TXVECTOR, in case the latter is OFDM or ERP-OFDM.
      *
-     * \param band the PHY band
-     * \return true if the WifiTxVector parameters are allowed by the standard
+     * @param band the PHY band
+     * @return true if the WifiTxVector parameters are allowed by the standard
      */
     bool IsValid(WifiPhyBand band = WIFI_PHY_BAND_UNSPECIFIED) const;
     /**
-     * \return true if this TX vector is used for a multi-user (OFDMA and/or MU-MIMO) transmission
+     * @return true if this TX vector is used for a multi-user (OFDMA and/or MU-MIMO) transmission
      */
     bool IsMu() const;
     /**
-     * \return true if this TX vector is used for a downlink multi-user (OFDMA and/or MU-MIMO)
+     * @return true if this TX vector is used for a downlink multi-user (OFDMA and/or MU-MIMO)
      * transmission
      */
     bool IsDlMu() const;
     /**
-     * \return true if this TX vector is used for an uplink multi-user (OFDMA and/or MU-MIMO)
+     * @return true if this TX vector is used for an uplink multi-user (OFDMA and/or MU-MIMO)
      * transmission
      */
     bool IsUlMu() const;
     /**
      * Return true if this TX vector is used for a downlink multi-user transmission using OFDMA.
      *
-     * \return true if this TX vector is used for a downlink multi-user transmission using OFDMA
+     * @return true if this TX vector is used for a downlink multi-user transmission using OFDMA
      */
     bool IsDlOfdma() const;
     /**
      * Return true if this TX vector is used for a downlink multi-user transmission using MU-MIMO.
      *
-     * \return true if this TX vector is used for a downlink multi-user transmission using MU-MIMO
+     * @return true if this TX vector is used for a downlink multi-user transmission using MU-MIMO
      */
     bool IsDlMuMimo() const;
     /**
      * Check if STA ID is allocated
-     * \param staId STA ID
-     * \return true if allocated, false otherwise
+     * @param staId STA ID
+     * @return true if allocated, false otherwise
      */
     bool IsAllocated(uint16_t staId) const;
     /**
      * Get the RU specification for the STA-ID.
      * This is applicable only for MU.
      *
-     * \param staId the station ID
-     * \return the RU specification for the STA-ID
+     * @param staId the station ID
+     * @return the RU specification for the STA-ID
      */
     HeRu::RuSpec GetRu(uint16_t staId) const;
     /**
      * Set the RU specification for the STA-ID.
      * This is applicable only for MU.
      *
-     * \param ru the RU specification
-     * \param staId the station ID
+     * @param ru the RU specification
+     * @param staId the station ID
      */
     void SetRu(HeRu::RuSpec ru, uint16_t staId);
     /**
      * Get the HE MU user-specific transmission information for the given STA-ID.
      * This is applicable only for HE MU.
      *
-     * \param staId the station ID
-     * \return the HE MU user-specific transmission information for the given STA-ID
+     * @param staId the station ID
+     * @return the HE MU user-specific transmission information for the given STA-ID
      */
     HeMuUserInfo GetHeMuUserInfo(uint16_t staId) const;
     /**
      * Set the HE MU user-specific transmission information for the given STA-ID.
      * This is applicable only for HE MU.
      *
-     * \param staId the station ID
-     * \param userInfo the HE MU user-specific transmission information
+     * @param staId the station ID
+     * @param userInfo the HE MU user-specific transmission information
      */
     void SetHeMuUserInfo(uint16_t staId, HeMuUserInfo userInfo);
     /**
      * Get a const reference to the map HE MU user-specific transmission information indexed by
      * STA-ID. This is applicable only for HE MU.
      *
-     * \return a const reference to the map of HE MU user-specific information indexed by STA-ID
+     * @return a const reference to the map of HE MU user-specific information indexed by STA-ID
      */
     const HeMuUserInfoMap& GetHeMuUserInfoMap() const;
     /**
      * Get a reference to the map HE MU user-specific transmission information indexed by STA-ID.
      * This is applicable only for HE MU.
      *
-     * \return a reference to the map of HE MU user-specific information indexed by STA-ID
+     * @return a reference to the map of HE MU user-specific information indexed by STA-ID
      */
     HeMuUserInfoMap& GetHeMuUserInfoMap();
 
@@ -439,22 +439,22 @@
     /**
      * Get the map of specific user info parameters ordered per increasing frequency RUs.
      *
-     * \param p20Index the index of the primary20 channel
-     * \return the map of specific user info parameters ordered per increasing frequency RUs
+     * @param p20Index the index of the primary20 channel
+     * @return the map of specific user info parameters ordered per increasing frequency RUs
      */
     UserInfoMapOrderedByRus GetUserInfoMapOrderedByRus(uint8_t p20Index) const;
 
     /**
      * Indicate whether the Common field is present in the HE-SIG-B field.
      *
-     * \return true if the Common field is present in the HE-SIG-B, false otherwise
+     * @return true if the Common field is present in the HE-SIG-B, false otherwise
      */
     bool IsSigBCompression() const;
 
     /**
      * Set the 20 MHz subchannels that are punctured.
      *
-     * \param inactiveSubchannels the bitmap indexed by the 20 MHz subchannels in ascending order,
+     * @param inactiveSubchannels the bitmap indexed by the 20 MHz subchannels in ascending order,
      *        where each bit indicates whether the corresponding 20 MHz subchannel is punctured or
      * not within the transmission bandwidth
      */
@@ -462,7 +462,7 @@
     /**
      * Get the 20 MHz subchannels that are punctured.
      *
-     * \return the bitmap indexed by the 20 MHz subchannels in ascending order,
+     * @return the bitmap indexed by the 20 MHz subchannels in ascending order,
      *         where each bit indicates whether the corresponding 20 MHz subchannel is punctured or
      * not within the transmission bandwidth
      */
@@ -470,33 +470,33 @@
 
     /**
      * Set the MCS used for SIG-B
-     * \param mode MCS used for SIG-B
+     * @param mode MCS used for SIG-B
      */
     void SetSigBMode(const WifiMode& mode);
 
     /**
      * Get MCS used for SIG-B
-     * \return MCS for SIG-B
+     * @return MCS for SIG-B
      */
     WifiMode GetSigBMode() const;
 
     /**
      * Set RU_ALLOCATION field
-     * \param ruAlloc 8 bit RU_ALLOCATION per 20 MHz
-     * \param p20Index the index of the primary20 channel
+     * @param ruAlloc 8 bit RU_ALLOCATION per 20 MHz
+     * @param p20Index the index of the primary20 channel
      */
     void SetRuAllocation(const RuAllocation& ruAlloc, uint8_t p20Index);
 
     /**
      * Get RU_ALLOCATION field
-     * \return 8 bit RU_ALLOCATION per 20 MHz
-     * \param p20Index the index of the primary20 channel
+     * @return 8 bit RU_ALLOCATION per 20 MHz
+     * @param p20Index the index of the primary20 channel
      */
     const RuAllocation& GetRuAllocation(uint8_t p20Index) const;
 
     /**
      * Set CENTER_26_TONE_RU field
-     * \param center26ToneRuIndication the CENTER_26_TONE_RU field
+     * @param center26ToneRuIndication the CENTER_26_TONE_RU field
      */
     void SetCenter26ToneRuIndication(Center26ToneRuIndication center26ToneRuIndication);
 
@@ -504,18 +504,18 @@
      * Get CENTER_26_TONE_RU field
      * This field is present if format is HE_MU and
      * when channel width is set to 80 MHz or larger.
-     * \return the CENTER_26_TONE_RU field if present
+     * @return the CENTER_26_TONE_RU field if present
      */
     std::optional<Center26ToneRuIndication> GetCenter26ToneRuIndication() const;
 
     /**
      * Set the EHT_PPDU_TYPE parameter
-     * \param type the EHT_PPDU_TYPE parameter
+     * @param type the EHT_PPDU_TYPE parameter
      */
     void SetEhtPpduType(uint8_t type);
     /**
      * Get the EHT_PPDU_TYPE parameter
-     * \return the EHT_PPDU_TYPE parameter
+     * @return the EHT_PPDU_TYPE parameter
      */
     uint8_t GetEhtPpduType() const;
 
@@ -526,8 +526,8 @@
      * based on the content of per-user information.
      * This is valid only for allocations of RUs of the same size per 20 MHz subchannel.
      *
-     * \param p20Index the index of the primary20 channel
-     * \return 8 bit RU_ALLOCATION per 20 MHz
+     * @param p20Index the index of the primary20 channel
+     * @return 8 bit RU_ALLOCATION per 20 MHz
      */
     RuAllocation DeriveRuAllocation(uint8_t p20Index) const;
 
@@ -536,15 +536,15 @@
      * for which its CENTER_26_TONE_RU has not been set yet,
      * based on the content of per-user information.
      *
-     * \return the CENTER_26_TONE_RU field
+     * @return the CENTER_26_TONE_RU field
      */
     Center26ToneRuIndication DeriveCenter26ToneRuIndication() const;
 
     /**
      * Get the number of STAs in a given RU.
      *
-     * \param ru the RU specification
-     * \return the number of STAs in the RU
+     * @param ru the RU specification
+     * @return the number of STAs in the RU
      */
     uint8_t GetNumStasInRu(const HeRu::RuSpec& ru) const;
 
@@ -593,10 +593,10 @@
 /**
  * Serialize WifiTxVector to the given ostream.
  *
- * \param os the output stream
- * \param v the WifiTxVector to stringify
+ * @param os the output stream
+ * @param v the WifiTxVector to stringify
  *
- * \return output stream
+ * @return output stream
  */
 std::ostream& operator<<(std::ostream& os, const WifiTxVector& v);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-types.h ns-3.44/src/wifi/model/wifi-types.h
--- ns-3.43/src/wifi/model/wifi-types.h	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/model/wifi-types.h	2025-03-09 16:55:49.803372600 -0700
@@ -15,7 +15,7 @@
 {
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * Enumeration of the possible channel widths
  */
 enum class WifiChannelWidthType : uint8_t
@@ -34,7 +34,7 @@
 };
 
 /**
- * \ingroup wifi
+ * @ingroup wifi
  * The type of an MPDU.
  */
 enum MpduType
@@ -75,8 +75,8 @@
 };
 
 /**
- * \ingroup wifi
- * \brief Enumeration of frequency channel types
+ * @ingroup wifi
+ * @brief Enumeration of frequency channel types
  */
 enum class FrequencyChannelType : uint8_t
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-units.h ns-3.44/src/wifi/model/wifi-units.h
--- ns-3.43/src/wifi/model/wifi-units.h	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/model/wifi-units.h	2025-03-09 16:55:49.803372600 -0700
@@ -13,8 +13,8 @@
 #include <cstdint>
 
 /**
- * \file
- * \ingroup wifi
+ * @file
+ * @ingroup wifi
  * Declaration of the SI units (as weak types aliases) used across wifi module
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-utils.cc ns-3.44/src/wifi/model/wifi-utils.cc
--- ns-3.43/src/wifi/model/wifi-utils.cc	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/model/wifi-utils.cc	2025-03-09 16:55:49.803372600 -0700
@@ -8,7 +8,9 @@
 
 #include "wifi-utils.h"
 
+#include "ap-wifi-mac.h"
 #include "ctrl-headers.h"
+#include "gcr-manager.h"
 #include "wifi-mac-header.h"
 #include "wifi-mac-trailer.h"
 
@@ -169,4 +171,30 @@
     return true;
 }
 
+bool
+IsGroupcast(const Mac48Address& adr)
+{
+    return adr.IsGroup() && !adr.IsBroadcast();
+}
+
+bool
+IsGcr(Ptr<WifiMac> mac, const WifiMacHeader& hdr)
+{
+    auto apMac = DynamicCast<ApWifiMac>(mac);
+    return apMac && apMac->UseGcr(hdr);
+}
+
+Mac48Address
+GetIndividuallyAddressedRecipient(Ptr<WifiMac> mac, const WifiMacHeader& hdr)
+{
+    const auto isGcr = IsGcr(mac, hdr);
+    const auto addr1 = hdr.GetAddr1();
+    if (!isGcr)
+    {
+        return addr1;
+    }
+    auto apMac = DynamicCast<ApWifiMac>(mac);
+    return apMac->GetGcrManager()->GetIndividuallyAddressedRecipient(addr1);
+}
+
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/wifi-utils.h ns-3.44/src/wifi/model/wifi-utils.h
--- ns-3.43/src/wifi/model/wifi-utils.h	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/model/wifi-utils.h	2025-03-09 16:55:49.807372600 -0700
@@ -23,8 +23,10 @@
 namespace ns3
 {
 
+class Mac48Address;
 class WifiMacHeader;
 class Packet;
+class WifiMac;
 
 /**
  * Wifi direction. Values are those defined for the TID-to-Link Mapping Control Direction
@@ -38,11 +40,11 @@
 };
 
 /**
- * \brief Stream insertion operator.
+ * @brief Stream insertion operator.
  *
- * \param os the stream
- * \param direction the direction
- * \returns a reference to the stream
+ * @param os the stream
+ * @param direction the direction
+ * @returns a reference to the stream
  */
 inline std::ostream&
 operator<<(std::ostream& os, const WifiDirection& direction)
@@ -67,79 +69,137 @@
 /**
  * Convert from dBm to Watts.
  *
- * \param val the value in dBm
+ * @param val the value in dBm
  *
- * \return the equivalent Watts for the given dBm
+ * @return the equivalent Watts for the given dBm
  */
 Watt_u DbmToW(dBm_u val);
 /**
  * Convert from dB to ratio.
  *
- * \param val the value in dB
+ * @param val the value in dB
  *
- * \return ratio in linear scale
+ * @return ratio in linear scale
  */
 double DbToRatio(dB_u val);
 /**
  * Convert from Watts to dBm.
  *
- * \param val the value in Watts
+ * @param val the value in Watts
  *
- * \return the equivalent dBm for the given Watts
+ * @return the equivalent dBm for the given Watts
  */
 dBm_u WToDbm(Watt_u val);
 /**
  * Convert from ratio to dB.
  *
- * \param ratio the ratio in linear scale
+ * @param ratio the ratio in linear scale
  *
- * \return the value in dB
+ * @return the value in dB
  */
 dB_u RatioToDb(double ratio);
+
+/**
+ * Convert from MHz to Hz.
+ *
+ * @param val the value in MHz
+ *
+ * @return the value in Hz
+ */
+inline Hz_u
+MHzToHz(MHz_u val)
+{
+    return val * 1e6;
+}
+
+/**
+ * Convert from Hz to MHz.
+ *
+ * @param val the value in Hz
+ *
+ * @return the value in MHz
+ */
+inline MHz_u
+HzToMHz(Hz_u val)
+{
+    return val * 1e-6;
+}
+
+/**
+ * Return the number of 20 MHz subchannels covering the channel width.
+ *
+ * @param channelWidth the channel width
+ * @return the number of 20 MHz subchannels
+ */
+inline std::size_t
+Count20MHzSubchannels(MHz_u channelWidth)
+{
+    NS_ASSERT(static_cast<uint16_t>(channelWidth) % 20 == 0);
+    return channelWidth / MHz_u{20};
+}
+
+/**
+ * Return the number of 20 MHz subchannels covering the channel width between a lower frequency and
+ * an upper frequency. This function should only be called when the channel width between the lower
+ * frequency and the upper frequency is a multiple of 20 MHz.
+ *
+ * @param lower the lower frequency
+ * @param upper the upper frequency
+ * @return the number of 20 MHz subchannels
+ */
+inline std::size_t
+Count20MHzSubchannels(MHz_u lower, MHz_u upper)
+{
+    NS_ASSERT(upper >= lower);
+    const auto width = upper - lower;
+    NS_ASSERT((static_cast<uint16_t>(width) % 20 == 0));
+    return Count20MHzSubchannels(width);
+}
+
 /**
  * Return the total Ack size (including FCS trailer).
  *
- * \return the total Ack size in bytes
+ * @return the total Ack size in bytes
  */
 uint32_t GetAckSize();
 /**
  * Return the total BlockAck size (including FCS trailer).
  *
- * \param type the BlockAck type
- * \return the total BlockAck size in bytes
+ * @param type the BlockAck type
+ * @return the total BlockAck size in bytes
  */
 uint32_t GetBlockAckSize(BlockAckType type);
 /**
  * Return the total BlockAckRequest size (including FCS trailer).
  *
- * \param type the BlockAckRequest type
- * \return the total BlockAckRequest size in bytes
+ * @param type the BlockAckRequest type
+ * @return the total BlockAckRequest size in bytes
  */
 uint32_t GetBlockAckRequestSize(BlockAckReqType type);
 /**
  * Return the total MU-BAR size (including FCS trailer).
  *
- * \param types the list of Block Ack Request types of the individual BARs
- * \return the total MU-BAR size in bytes
+ * @param types the list of Block Ack Request types of the individual BARs
+ * @return the total MU-BAR size in bytes
  */
 uint32_t GetMuBarSize(std::list<BlockAckReqType> types);
 /**
  * Return the total RTS size (including FCS trailer).
  *
- * \return the total RTS size in bytes
+ * @return the total RTS size in bytes
  */
 uint32_t GetRtsSize();
 /**
  * Return the total CTS size (including FCS trailer).
  *
- * \return the total CTS size in bytes
+ * @return the total CTS size in bytes
  */
 uint32_t GetCtsSize();
 /**
- * \param seq MPDU sequence number
- * \param winstart sequence number window start
- * \param winsize the size of the sequence number window
- * \returns true if in the window
+ * @param seq MPDU sequence number
+ * @param winstart sequence number window start
+ * @param winsize the size of the sequence number window
+ * @returns true if in the window
  *
  * This method checks if the MPDU's sequence number is inside the scoreboard boundaries or not
  */
@@ -147,17 +207,17 @@
 /**
  * Add FCS trailer to a packet.
  *
- * \param packet the packet to add a trailer to
+ * @param packet the packet to add a trailer to
  */
 void AddWifiMacTrailer(Ptr<Packet> packet);
 /**
  * Return the total size of the packet after WifiMacHeader and FCS trailer
  * have been added.
  *
- * \param packet the packet to be encapsulated with WifiMacHeader and FCS trailer
- * \param hdr the WifiMacHeader
- * \param isAmpdu whether packet is part of an A-MPDU
- * \return the total packet size
+ * @param packet the packet to be encapsulated with WifiMacHeader and FCS trailer
+ * @param hdr the WifiMacHeader
+ * @param isAmpdu whether packet is part of an A-MPDU
+ * @return the total packet size
  */
 uint32_t GetSize(Ptr<const Packet> packet, const WifiMacHeader* hdr, bool isAmpdu);
 
@@ -165,13 +225,42 @@
  * Check if the given TID-to-Link Mappings are valid for a negotiation type of 1. Specifically,
  * it is checked whether all TIDs are mapped to the same set of links.
  *
- * \param dlLinkMapping the given TID-to-Link Mapping for Downlink
- * \param ulLinkMapping the given TID-to-Link Mapping for Uplink
- * \return whether the given TID-to-Link Mappings are valid for a negotiation type of 1
+ * @param dlLinkMapping the given TID-to-Link Mapping for Downlink
+ * @param ulLinkMapping the given TID-to-Link Mapping for Uplink
+ * @return whether the given TID-to-Link Mappings are valid for a negotiation type of 1
  */
 bool TidToLinkMappingValidForNegType1(const WifiTidLinkMapping& dlLinkMapping,
                                       const WifiTidLinkMapping& ulLinkMapping);
 
+/**
+ * Check whether a MAC destination address corresponds to a groupcast transmission.
+ *
+ * @param adr the MAC address
+ * @return true if the MAC address is a group address that is not a broadcast address
+ */
+bool IsGroupcast(const Mac48Address& adr);
+
+/**
+ * Return whether a given packet is transmitted using the GCR service.
+ *
+ * @param mac a pointer to the wifi MAC
+ * @param hdr the MAC header of the packet to check
+ * @return true if the packet is transmitted using the GCR service, false otherwise
+ */
+bool IsGcr(Ptr<WifiMac> mac, const WifiMacHeader& hdr);
+
+/**
+ * Get the MAC address of the individually addressed recipient to use for a given packet.
+ * If this is a groupcast packet to be transmitted with the GCR service, the GCR manager is
+ * requested to return which individually addressed recipient to use. Otherwise, it corresponds to
+ * the address1 of the MAC header.
+ *
+ * @param mac a pointer to the wifi MAC
+ * @param hdr the MAC header of the packet to check
+ * @return the MAC address of the individually addressed recipient to use
+ */
+Mac48Address GetIndividuallyAddressedRecipient(Ptr<WifiMac> mac, const WifiMacHeader& hdr);
+
 /// Size of the space of sequence numbers
 static constexpr uint16_t SEQNO_SPACE_SIZE = 4096;
 
@@ -185,6 +274,9 @@
 /// Invalid link identifier
 static constexpr uint8_t WIFI_LINKID_UNDEFINED = 0xff;
 
+/// Invalid TID identifier
+static constexpr uint8_t WIFI_TID_UNDEFINED = 0xff;
+
 /// Wi-Fi Time Unit value in microseconds (see IEEE 802.11-2020 sec. 3.1)
 /// Used to initialize WIFI_TU
 constexpr int WIFI_TU_US = 1024;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/yans-error-rate-model.cc ns-3.44/src/wifi/model/yans-error-rate-model.cc
--- ns-3.43/src/wifi/model/yans-error-rate-model.cc	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/model/yans-error-rate-model.cc	2025-03-09 16:55:49.807372600 -0700
@@ -38,10 +38,10 @@
 }
 
 double
-YansErrorRateModel::GetBpskBer(double snr, uint32_t signalSpread, uint64_t phyRate) const
+YansErrorRateModel::GetBpskBer(double snr, MHz_u signalSpread, uint64_t phyRate) const
 {
     NS_LOG_FUNCTION(this << snr << signalSpread << phyRate);
-    double EbNo = snr * signalSpread / phyRate;
+    double EbNo = snr * signalSpread * 1e6 / phyRate;
     double z = std::sqrt(EbNo);
     double ber = 0.5 * erfc(z);
     NS_LOG_INFO("bpsk snr=" << snr << " ber=" << ber);
@@ -51,11 +51,11 @@
 double
 YansErrorRateModel::GetQamBer(double snr,
                               unsigned int m,
-                              uint32_t signalSpread,
+                              MHz_u signalSpread,
                               uint64_t phyRate) const
 {
     NS_LOG_FUNCTION(this << snr << m << signalSpread << phyRate);
-    double EbNo = snr * signalSpread / phyRate;
+    double EbNo = snr * signalSpread * 1e6 / phyRate;
     double z = std::sqrt((1.5 * log2(m) * EbNo) / (m - 1.0));
     double z1 = ((1.0 - 1.0 / std::sqrt(m)) * erfc(z));
     double z2 = 1 - std::pow((1 - z1), 2);
@@ -136,7 +136,7 @@
 double
 YansErrorRateModel::GetFecBpskBer(double snr,
                                   uint64_t nbits,
-                                  uint32_t signalSpread,
+                                  MHz_u signalSpread,
                                   uint64_t phyRate,
                                   uint32_t dFree,
                                   uint32_t adFree) const
@@ -157,7 +157,7 @@
 double
 YansErrorRateModel::GetFecQamBer(double snr,
                                  uint64_t nbits,
-                                 uint32_t signalSpread,
+                                 MHz_u signalSpread,
                                  uint64_t phyRate,
                                  uint32_t m,
                                  uint32_t dFree,
@@ -197,8 +197,8 @@
         uint64_t phyRate;
         if ((txVector.IsMu() && (staId == SU_STA_ID)) || (mode != txVector.GetMode(staId)))
         {
-            phyRate = mode.GetPhyRate(txVector.GetChannelWidth() >= 40
-                                          ? 20
+            phyRate = mode.GetPhyRate(txVector.GetChannelWidth() >= MHz_u{40}
+                                          ? MHz_u{20}
                                           : txVector.GetChannelWidth()); // This is the PHY header
         }
         else
@@ -211,19 +211,19 @@
             {
                 return GetFecBpskBer(snr,
                                      nbits,
-                                     txVector.GetChannelWidth() * 1000000, // signal spread
-                                     phyRate,                              // PHY rate
-                                     10,                                   // dFree
-                                     11);                                  // adFree
+                                     txVector.GetChannelWidth(), // signal spread
+                                     phyRate,                    // PHY rate
+                                     10,                         // dFree
+                                     11);                        // adFree
             }
             else
             {
                 return GetFecBpskBer(snr,
                                      nbits,
-                                     txVector.GetChannelWidth() * 1000000, // signal spread
-                                     phyRate,                              // PHY rate
-                                     5,                                    // dFree
-                                     8);                                   // adFree
+                                     txVector.GetChannelWidth(), // signal spread
+                                     phyRate,                    // PHY rate
+                                     5,                          // dFree
+                                     8);                         // adFree
             }
         }
         else if (mode.GetConstellationSize() == 4)
@@ -232,23 +232,23 @@
             {
                 return GetFecQamBer(snr,
                                     nbits,
-                                    txVector.GetChannelWidth() * 1000000, // signal spread
-                                    phyRate,                              // PHY rate
-                                    4,                                    // m
-                                    10,                                   // dFree
-                                    11,                                   // adFree
-                                    0);                                   // adFreePlusOne
+                                    txVector.GetChannelWidth(), // signal spread
+                                    phyRate,                    // PHY rate
+                                    4,                          // m
+                                    10,                         // dFree
+                                    11,                         // adFree
+                                    0);                         // adFreePlusOne
             }
             else
             {
                 return GetFecQamBer(snr,
                                     nbits,
-                                    txVector.GetChannelWidth() * 1000000, // signal spread
-                                    phyRate,                              // PHY rate
-                                    4,                                    // m
-                                    5,                                    // dFree
-                                    8,                                    // adFree
-                                    31);                                  // adFreePlusOne
+                                    txVector.GetChannelWidth(), // signal spread
+                                    phyRate,                    // PHY rate
+                                    4,                          // m
+                                    5,                          // dFree
+                                    8,                          // adFree
+                                    31);                        // adFreePlusOne
             }
         }
         else if (mode.GetConstellationSize() == 16)
@@ -257,23 +257,23 @@
             {
                 return GetFecQamBer(snr,
                                     nbits,
-                                    txVector.GetChannelWidth() * 1000000, // signal spread
-                                    phyRate,                              // PHY rate
-                                    16,                                   // m
-                                    10,                                   // dFree
-                                    11,                                   // adFree
-                                    0);                                   // adFreePlusOne
+                                    txVector.GetChannelWidth(), // signal spread
+                                    phyRate,                    // PHY rate
+                                    16,                         // m
+                                    10,                         // dFree
+                                    11,                         // adFree
+                                    0);                         // adFreePlusOne
             }
             else
             {
                 return GetFecQamBer(snr,
                                     nbits,
-                                    txVector.GetChannelWidth() * 1000000, // signal spread
-                                    phyRate,                              // PHY rate
-                                    16,                                   // m
-                                    5,                                    // dFree
-                                    8,                                    // adFree
-                                    31);                                  // adFreePlusOne
+                                    txVector.GetChannelWidth(), // signal spread
+                                    phyRate,                    // PHY rate
+                                    16,                         // m
+                                    5,                          // dFree
+                                    8,                          // adFree
+                                    31);                        // adFreePlusOne
             }
         }
         else if (mode.GetConstellationSize() == 64)
@@ -282,35 +282,35 @@
             {
                 return GetFecQamBer(snr,
                                     nbits,
-                                    txVector.GetChannelWidth() * 1000000, // signal spread
-                                    phyRate,                              // PHY rate
-                                    64,                                   // m
-                                    6,                                    // dFree
-                                    1,                                    // adFree
-                                    16);                                  // adFreePlusOne
+                                    txVector.GetChannelWidth(), // signal spread
+                                    phyRate,                    // PHY rate
+                                    64,                         // m
+                                    6,                          // dFree
+                                    1,                          // adFree
+                                    16);                        // adFreePlusOne
             }
             if (mode.GetCodeRate() == WIFI_CODE_RATE_5_6)
             {
                 // Table B.32  in Pâl Frenger et al., "Multi-rate Convolutional Codes".
                 return GetFecQamBer(snr,
                                     nbits,
-                                    txVector.GetChannelWidth() * 1000000, // signal spread
-                                    phyRate,                              // PHY rate
-                                    64,                                   // m
-                                    4,                                    // dFree
-                                    14,                                   // adFree
-                                    69);                                  // adFreePlusOne
+                                    txVector.GetChannelWidth(), // signal spread
+                                    phyRate,                    // PHY rate
+                                    64,                         // m
+                                    4,                          // dFree
+                                    14,                         // adFree
+                                    69);                        // adFreePlusOne
             }
             else
             {
                 return GetFecQamBer(snr,
                                     nbits,
-                                    txVector.GetChannelWidth() * 1000000, // signal spread
-                                    phyRate,                              // PHY rate
-                                    64,                                   // m
-                                    5,                                    // dFree
-                                    8,                                    // adFree
-                                    31);                                  // adFreePlusOne
+                                    txVector.GetChannelWidth(), // signal spread
+                                    phyRate,                    // PHY rate
+                                    64,                         // m
+                                    5,                          // dFree
+                                    8,                          // adFree
+                                    31);                        // adFreePlusOne
             }
         }
         else if (mode.GetConstellationSize() == 256)
@@ -319,24 +319,24 @@
             {
                 return GetFecQamBer(snr,
                                     nbits,
-                                    txVector.GetChannelWidth() * 1000000, // signal spread
-                                    phyRate,                              // PHY rate
-                                    256,                                  // m
-                                    4,                                    // dFree
-                                    14,                                   // adFree
-                                    69                                    // adFreePlusOne
+                                    txVector.GetChannelWidth(), // signal spread
+                                    phyRate,                    // PHY rate
+                                    256,                        // m
+                                    4,                          // dFree
+                                    14,                         // adFree
+                                    69                          // adFreePlusOne
                 );
             }
             else
             {
                 return GetFecQamBer(snr,
                                     nbits,
-                                    txVector.GetChannelWidth() * 1000000, // signal spread
-                                    phyRate,                              // PHY rate
-                                    256,                                  // m
-                                    5,                                    // dFree
-                                    8,                                    // adFree
-                                    31                                    // adFreePlusOne
+                                    txVector.GetChannelWidth(), // signal spread
+                                    phyRate,                    // PHY rate
+                                    256,                        // m
+                                    5,                          // dFree
+                                    8,                          // adFree
+                                    31                          // adFreePlusOne
                 );
             }
         }
@@ -346,24 +346,24 @@
             {
                 return GetFecQamBer(snr,
                                     nbits,
-                                    txVector.GetChannelWidth() * 1000000, // signal spread
-                                    phyRate,                              // PHY rate
-                                    1024,                                 // m
-                                    4,                                    // dFree
-                                    14,                                   // adFree
-                                    69                                    // adFreePlusOne
+                                    txVector.GetChannelWidth(), // signal spread
+                                    phyRate,                    // PHY rate
+                                    1024,                       // m
+                                    4,                          // dFree
+                                    14,                         // adFree
+                                    69                          // adFreePlusOne
                 );
             }
             else
             {
                 return GetFecQamBer(snr,
                                     nbits,
-                                    txVector.GetChannelWidth() * 1000000, // signal spread
-                                    phyRate,                              // PHY rate
-                                    1024,                                 // m
-                                    5,                                    // dFree
-                                    8,                                    // adFree
-                                    31                                    // adFreePlusOne
+                                    txVector.GetChannelWidth(), // signal spread
+                                    phyRate,                    // PHY rate
+                                    1024,                       // m
+                                    5,                          // dFree
+                                    8,                          // adFree
+                                    31                          // adFreePlusOne
                 );
             }
         }
@@ -373,24 +373,24 @@
             {
                 return GetFecQamBer(snr,
                                     nbits,
-                                    txVector.GetChannelWidth() * 1000000, // signal spread
-                                    phyRate,                              // PHY rate
-                                    4096,                                 // m
-                                    4,                                    // dFree
-                                    14,                                   // adFree
-                                    69                                    // adFreePlusOne
+                                    txVector.GetChannelWidth(), // signal spread
+                                    phyRate,                    // PHY rate
+                                    4096,                       // m
+                                    4,                          // dFree
+                                    14,                         // adFree
+                                    69                          // adFreePlusOne
                 );
             }
             else
             {
                 return GetFecQamBer(snr,
                                     nbits,
-                                    txVector.GetChannelWidth() * 1000000, // signal spread
-                                    phyRate,                              // PHY rate
-                                    4096,                                 // m
-                                    5,                                    // dFree
-                                    8,                                    // adFree
-                                    31                                    // adFreePlusOne
+                                    txVector.GetChannelWidth(), // signal spread
+                                    phyRate,                    // PHY rate
+                                    4096,                       // m
+                                    5,                          // dFree
+                                    8,                          // adFree
+                                    31                          // adFreePlusOne
                 );
             }
         }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/yans-error-rate-model.h ns-3.44/src/wifi/model/yans-error-rate-model.h
--- ns-3.43/src/wifi/model/yans-error-rate-model.h	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/model/yans-error-rate-model.h	2025-03-09 16:55:49.807372600 -0700
@@ -15,8 +15,8 @@
 {
 
 /**
- * \brief Model the error rate for different modulations.
- * \ingroup wifi
+ * @brief Model the error rate for different modulations.
+ * @ingroup wifi
  *
  * A packet of interest (e.g., a packet can potentially be received by the MAC)
  * is divided into chunks. Each chunk is related to an start/end receiving event.
@@ -43,8 +43,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -61,94 +61,94 @@
     /**
      * Return BER of BPSK with the given parameters.
      *
-     * \param snr SNR ratio (not dB)
-     * \param signalSpread
-     * \param phyRate
+     * @param snr SNR ratio (not dB)
+     * @param signalSpread
+     * @param phyRate
      *
-     * \return BER of BPSK at the given SNR
+     * @return BER of BPSK at the given SNR
      */
-    double GetBpskBer(double snr, uint32_t signalSpread, uint64_t phyRate) const;
+    double GetBpskBer(double snr, MHz_u signalSpread, uint64_t phyRate) const;
     /**
      * Return BER of QAM-m with the given parameters.
      *
-     * \param snr SNR ratio (not dB)
-     * \param m
-     * \param signalSpread
-     * \param phyRate
+     * @param snr SNR ratio (not dB)
+     * @param m
+     * @param signalSpread
+     * @param phyRate
      *
-     * \return BER of BPSK at the given SNR
+     * @return BER of BPSK at the given SNR
      */
-    double GetQamBer(double snr, unsigned int m, uint32_t signalSpread, uint64_t phyRate) const;
+    double GetQamBer(double snr, unsigned int m, MHz_u signalSpread, uint64_t phyRate) const;
     /**
      * Return k!
      *
-     * \param k
+     * @param k
      *
-     * \return k!
+     * @return k!
      */
     uint32_t Factorial(uint32_t k) const;
     /**
      * Return Binomial distribution for a given k, p, and n
      *
-     * \param k
-     * \param p
-     * \param n
+     * @param k
+     * @param p
+     * @param n
      *
-     * \return a Binomial distribution
+     * @return a Binomial distribution
      */
     double Binomial(uint32_t k, double p, uint32_t n) const;
     /**
-     * \param ber
-     * \param d
+     * @param ber
+     * @param d
      *
-     * \return double
+     * @return double
      */
     double CalculatePdOdd(double ber, unsigned int d) const;
     /**
-     * \param ber
-     * \param d
+     * @param ber
+     * @param d
      *
-     * \return double
+     * @return double
      */
     double CalculatePdEven(double ber, unsigned int d) const;
     /**
-     * \param ber
-     * \param d
+     * @param ber
+     * @param d
      *
-     * \return double
+     * @return double
      */
     double CalculatePd(double ber, unsigned int d) const;
     /**
-     * \param snr SNR ratio (not dB)
-     * \param nbits
-     * \param signalSpread
-     * \param phyRate
-     * \param dFree
-     * \param adFree
+     * @param snr SNR ratio (not dB)
+     * @param nbits
+     * @param signalSpread
+     * @param phyRate
+     * @param dFree
+     * @param adFree
      *
-     * \return double
+     * @return double
      */
     double GetFecBpskBer(double snr,
                          uint64_t nbits,
-                         uint32_t signalSpread,
+                         MHz_u signalSpread,
                          uint64_t phyRate,
                          uint32_t dFree,
                          uint32_t adFree) const;
     /**
-     * \param snr SNR ratio (not dB)
-     * \param nbits
-     * \param signalSpread
-     * \param phyRate
-     * \param m
-     * \param dfree
-     * \param adFree
-     * \param adFreePlusOne
+     * @param snr SNR ratio (not dB)
+     * @param nbits
+     * @param signalSpread
+     * @param phyRate
+     * @param m
+     * @param dfree
+     * @param adFree
+     * @param adFreePlusOne
      *
-     * \return double
+     * @return double
      */
     double GetFecQamBer(double snr,
                         uint64_t nbits,
-                        uint32_t signalSpread,
+                        MHz_u signalSpread,
                         uint64_t phyRate,
                         uint32_t m,
                         uint32_t dfree,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/yans-wifi-channel.cc ns-3.44/src/wifi/model/yans-wifi-channel.cc
--- ns-3.43/src/wifi/model/yans-wifi-channel.cc	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/model/yans-wifi-channel.cc	2025-03-09 16:55:49.807372600 -0700
@@ -93,7 +93,7 @@
 
             auto receiverMobility = (*i)->GetMobility()->GetObject<MobilityModel>();
             const auto delay = m_delay->GetDelay(senderMobility, receiverMobility);
-            const auto rxPower = m_loss->CalcRxPower(txPower, senderMobility, receiverMobility);
+            const dBm_u rxPower{m_loss->CalcRxPower(txPower, senderMobility, receiverMobility)};
             NS_LOG_DEBUG("propagation: txPower="
                          << txPower << "dBm, rxPower=" << rxPower << "dBm, "
                          << "distance=" << senderMobility->GetDistanceFrom(receiverMobility)
@@ -129,13 +129,15 @@
     // Current implementation assumes constant RX power over the PPDU duration
     // Compare received TX power per MHz to normalized RX sensitivity
     const auto txWidth = ppdu->GetTxChannelWidth();
-    if (totalRxPower < phy->GetRxSensitivity() + RatioToDb(txWidth / 20.0))
+    if (totalRxPower < phy->GetRxSensitivity() + RatioToDb(txWidth / MHz_u{20}))
     {
         NS_LOG_INFO("Received signal too weak to process: " << rxPower << " dBm");
         return;
     }
     RxPowerWattPerChannelBand rxPowerW;
-    rxPowerW.insert({{{{0, 0}}, {{0, 0}}}, (DbmToW(totalRxPower))}); // dummy band for YANS
+
+    rxPowerW.insert(
+        {{{{0, 0}}, {{Hz_u{0}, Hz_u{0}}}}, (DbmToW(totalRxPower))}); // dummy band for YANS
     phy->StartReceivePreamble(ppdu, rxPowerW, ppdu->GetTxDuration());
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/yans-wifi-channel.h ns-3.44/src/wifi/model/yans-wifi-channel.h
--- ns-3.43/src/wifi/model/yans-wifi-channel.h	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/model/yans-wifi-channel.h	2025-03-09 16:55:49.807372600 -0700
@@ -25,8 +25,8 @@
 class WifiPpdu;
 
 /**
- * \brief a channel to interconnect ns3::YansWifiPhy objects.
- * \ingroup wifi
+ * @brief a channel to interconnect ns3::YansWifiPhy objects.
+ * @ingroup wifi
  *
  * This class is expected to be used in tandem with the ns3::YansWifiPhy
  * class and supports an ns3::PropagationLossModel and an
@@ -37,8 +37,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -51,23 +51,23 @@
     /**
      * Adds the given YansWifiPhy to the PHY list
      *
-     * \param phy the YansWifiPhy to be added to the PHY list
+     * @param phy the YansWifiPhy to be added to the PHY list
      */
     void Add(Ptr<YansWifiPhy> phy);
 
     /**
-     * \param loss the new propagation loss model.
+     * @param loss the new propagation loss model.
      */
     void SetPropagationLossModel(const Ptr<PropagationLossModel> loss);
     /**
-     * \param delay the new propagation delay model.
+     * @param delay the new propagation delay model.
      */
     void SetPropagationDelayModel(const Ptr<PropagationDelayModel> delay);
 
     /**
-     * \param sender the PHY object from which the packet is originating.
-     * \param ppdu the PPDU to send
-     * \param txPower the TX power associated to the packet
+     * @param sender the PHY object from which the packet is originating.
+     * @param ppdu the PPDU to send
+     * @param txPower the TX power associated to the packet
      *
      * This method should not be invoked by normal users. It is
      * currently invoked only from YansWifiPhy::StartTx.  The channel
@@ -81,9 +81,9 @@
      * used by this model.  Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream first stream index to use
+     * @param stream first stream index to use
      *
-     * \return the number of stream indices assigned by this model
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream);
 
@@ -98,9 +98,9 @@
      * The method then calls the corresponding YansWifiPhy that the first
      * bit of the PPDU has arrived.
      *
-     * \param receiver the device to which the packet is destined
-     * \param ppdu the PPDU being sent
-     * \param txPower the TX power associated to the packet being sent
+     * @param receiver the device to which the packet is destined
+     * @param ppdu the PPDU being sent
+     * @param txPower the TX power associated to the packet being sent
      */
     static void Receive(Ptr<YansWifiPhy> receiver, Ptr<const WifiPpdu> ppdu, dBm_u txPower);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/yans-wifi-phy.cc ns-3.44/src/wifi/model/yans-wifi-phy.cc
--- ns-3.43/src/wifi/model/yans-wifi-phy.cc	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/model/yans-wifi-phy.cc	2025-03-09 16:55:49.807372600 -0700
@@ -47,7 +47,11 @@
 {
     WifiPhy::SetInterferenceHelper(helper);
     // add dummy band for Yans
-    m_interference->AddBand({{{0, 0}}, {{0, 0}}});
+    m_interference->AddBand({{{0, 0}},
+                             {{
+                                 Hz_u{0},
+                                 Hz_u{0},
+                             }}});
 }
 
 YansWifiPhy::~YansWifiPhy()
@@ -98,20 +102,24 @@
 YansWifiPhy::GetGuardBandwidth(MHz_u currentChannelWidth) const
 {
     NS_ABORT_MSG("Guard bandwidth not relevant for Yans");
-    return 0;
+    return MHz_u{0};
 }
 
 std::tuple<dBr_u, dBr_u, dBr_u>
 YansWifiPhy::GetTxMaskRejectionParams() const
 {
     NS_ABORT_MSG("Tx mask rejection params not relevant for Yans");
-    return std::make_tuple(0.0, 0.0, 0.0);
+    return std::make_tuple(dBr_u{0.0}, dBr_u{0.0}, dBr_u{0.0});
 }
 
 WifiSpectrumBandInfo
 YansWifiPhy::GetBand(MHz_u /*bandWidth*/, uint8_t /*bandIndex*/)
 {
-    return {{{0, 0}}, {{0, 0}}};
+    return {{{0, 0}},
+            {{
+                Hz_u{0},
+                Hz_u{0},
+            }}};
 }
 
 FrequencyRange
@@ -123,7 +131,7 @@
 WifiSpectrumBandFrequencies
 YansWifiPhy::ConvertIndicesToFrequencies(const WifiSpectrumBandIndices& /*indices*/) const
 {
-    return {0, 0};
+    return {Hz_u{0}, Hz_u{0}};
 }
 
 void
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/model/yans-wifi-phy.h ns-3.44/src/wifi/model/yans-wifi-phy.h
--- ns-3.43/src/wifi/model/yans-wifi-phy.h	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/model/yans-wifi-phy.h	2025-03-09 16:55:49.807372600 -0700
@@ -19,8 +19,8 @@
 class YansWifiChannel;
 
 /**
- * \brief 802.11 PHY layer model
- * \ingroup wifi
+ * @brief 802.11 PHY layer model
+ * @ingroup wifi
  *
  * This PHY implements a model of 802.11a. The model
  * implemented here is based on the model described
@@ -37,8 +37,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -58,7 +58,7 @@
     /**
      * Set the YansWifiChannel this YansWifiPhy is to be connected to.
      *
-     * \param channel the YansWifiChannel this YansWifiPhy is to be connected to
+     * @param channel the YansWifiChannel this YansWifiPhy is to be connected to
      */
     void SetChannel(const Ptr<YansWifiChannel> channel);
 
@@ -66,18 +66,18 @@
      * Logs the arrival of a PPDU, including its power and duration.
      * This will also trace PPDUs below WifiPhy::RxSensitivity
      *
-     * \param [in] ppdu The PPDU being traced upon its arrival.
-     * \param [in] rxPowerDbm The received power of the PPDU in dBm.
-     * \param [in] duration The duration of the PPDU signal.
+     * @param [in] ppdu The PPDU being traced upon its arrival.
+     * @param [in] rxPowerDbm The received power of the PPDU in dBm.
+     * @param [in] duration The duration of the PPDU signal.
      */
     void TraceSignalArrival(Ptr<const WifiPpdu> ppdu, double rxPowerDbm, Time duration);
 
     /**
      * Callback invoked when the PHY model starts to process a signal
      *
-     * \param ppdu The PPDU being processed
-     * \param rxPowerDbm received signal power (dBm)
-     * \param duration Signal duration
+     * @param ppdu The PPDU being processed
+     * @param rxPowerDbm received signal power (dBm)
+     * @param duration Signal duration
      */
     typedef void (*SignalArrivalCallback)(Ptr<const WifiPpdu> ppdu,
                                           double rxPowerDbm,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/test/80211b.c ns-3.44/src/wifi/test/80211b.c
--- ns-3.43/src/wifi/test/80211b.c	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/test/80211b.c	2025-03-09 16:55:49.807372600 -0700
@@ -7,9 +7,9 @@
  */
 
 /**
- * \file
- * \ingroup wifi-test
- * \ingroup tests
+ * @file
+ * @ingroup wifi-test
+ * @ingroup tests
  *
  * This program is used to generate plots found in the paper
  * Guangyu Pei and Tom Henderson, "Validation of ns-3 802.11b PHY model",
@@ -27,8 +27,8 @@
  */
 
 /**
- * \ingroup wifi
- * \defgroup wifi-test wifi module tests
+ * @ingroup wifi
+ * @defgroup wifi-test wifi module tests
  */
 
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/test/block-ack-test-suite.cc ns-3.44/src/wifi/test/block-ack-test-suite.cc
--- ns-3.43/src/wifi/test/block-ack-test-suite.cc	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/test/block-ack-test-suite.cc	2025-03-09 16:55:49.807372600 -0700
@@ -43,10 +43,10 @@
 NS_LOG_COMPONENT_DEFINE("WifiBlockAckTest");
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Packet Buffering Case A
+ * @brief Packet Buffering Case A
  *
  * This simple test verifies the correctness of buffering for packets received
  * under block ack. In order to completely understand this example is important to cite
@@ -149,10 +149,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Packet Buffering Case B
+ * @brief Packet Buffering Case B
  *
  * ----- = old packets
  * +++++ = new packets
@@ -261,10 +261,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test for the originator block ack window
+ * @brief Test for the originator block ack window
  */
 class OriginatorBlockAckWindowTest : public TestCase
 {
@@ -665,10 +665,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test for block ack header
+ * @brief Test for block ack header
  */
 class CtrlBAckResponseHeaderTest : public TestCase
 {
@@ -762,17 +762,17 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test for recipient reordering buffer operations
+ * @brief Test for recipient reordering buffer operations
  */
 class BlockAckRecipientBufferTest : public TestCase
 {
   public:
     /**
-     * \brief Constructor
-     * \param ssn the Starting Sequence Number used to initialize WinStartB
+     * @brief Constructor
+     * @param ssn the Starting Sequence Number used to initialize WinStartB
      */
     BlockAckRecipientBufferTest(uint16_t ssn);
     ~BlockAckRecipientBufferTest() override;
@@ -782,8 +782,8 @@
     /**
      * Keep track of MPDUs received on the given link that are forwarded up.
      *
-     * \param mpdu an MPDU that is forwarded up
-     * \param linkId the ID of the given link
+     * @param mpdu an MPDU that is forwarded up
+     * @param linkId the ID of the given link
      */
     void ForwardUp(Ptr<const WifiMpdu> mpdu, uint8_t linkId);
 
@@ -989,10 +989,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test for Multi-STA block ack header
+ * @brief Test for Multi-STA block ack header
  */
 class MultiStaCtrlBAckResponseHeaderTest : public TestCase
 {
@@ -1659,10 +1659,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test for Block Ack Policy with aggregation disabled
+ * @brief Test for Block Ack Policy with aggregation disabled
  *
  * This test aims to check the Block Ack policy when A-MPDU aggregation is disabled.
  * In this case, a QoS station can transmit multiple QoS data frames before requesting
@@ -1711,9 +1711,9 @@
     {
         /**
          * Callback for the TxopTrace trace
-         * \param startTime TXOP start time
-         * \param duration TXOP duration
-         * \param linkId the ID of the link
+         * @param startTime TXOP start time
+         * @param duration TXOP duration
+         * @param linkId the ID of the link
          */
         void Trace(Time startTime, Time duration, uint8_t linkId);
         Time m_max{Seconds(0)}; ///< max TXOP duration
@@ -1721,8 +1721,8 @@
 
   public:
     /**
-     * \brief Constructor
-     * \param txop true for non-null TXOP limit
+     * @brief Constructor
+     * @param txop true for non-null TXOP limit
      */
     BlockAckAggregationDisabledTest(bool txop);
     ~BlockAckAggregationDisabledTest() override;
@@ -1740,23 +1740,23 @@
 
     /**
      * Function to trace packets received by the server application
-     * \param context the context
-     * \param p the packet
-     * \param adr the address
+     * @param context the context
+     * @param p the packet
+     * @param adr the address
      */
     void L7Receive(std::string context, Ptr<const Packet> p, const Address& adr);
     /**
      * Callback invoked when PHY transmits a packet
-     * \param context the context
-     * \param p the packet
-     * \param power the tx power
+     * @param context the context
+     * @param p the packet
+     * @param power the tx power
      */
     void Transmit(std::string context, Ptr<const Packet> p, double power);
     /**
      * Callback invoked when PHY receives a packet
-     * \param context the context
-     * \param p the packet
-     * \param rxPowersW the received power per channel band in watts
+     * @param context the context
+     * @param p the packet
+     * @param rxPowersW the received power per channel band in watts
      */
     void Receive(std::string context, Ptr<const Packet> p, RxPowerWattPerChannelBand rxPowersW);
 };
@@ -1958,7 +1958,7 @@
     client1->SetRemote(socket);
     wifiStaNode.Get(0)->AddApplication(client1);
     client1->SetStartTime(Seconds(1));
-    client1->SetStopTime(Seconds(3.0));
+    client1->SetStopTime(Seconds(3));
 
     // the second client application generates 13 packets. Even if when the first
     // packet is queued the queue is empty, the first packet is not transmitted
@@ -1971,13 +1971,13 @@
     client2->SetRemote(socket);
     wifiStaNode.Get(0)->AddApplication(client2);
     client2->SetStartTime(Seconds(1.5));
-    client2->SetStopTime(Seconds(3.0));
+    client2->SetStopTime(Seconds(3));
 
     Ptr<PacketSocketServer> server = CreateObject<PacketSocketServer>();
     server->SetLocal(socket);
     wifiApNode.Get(0)->AddApplication(server);
-    server->SetStartTime(Seconds(0.0));
-    server->SetStopTime(Seconds(4.0));
+    server->SetStartTime(Seconds(0));
+    server->SetStopTime(Seconds(4));
 
     Config::Connect("/NodeList/*/ApplicationList/0/$ns3::PacketSocketServer/Rx",
                     MakeCallback(&BlockAckAggregationDisabledTest::L7Receive, this));
@@ -2008,10 +2008,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test for Block Ack Policy with non-null BA threshold and TX window blocked.
+ * @brief Test for Block Ack Policy with non-null BA threshold and TX window blocked.
  *
  * An EHT device establishes a Block Ack agreement (for TID 0) with the AP and uses a Block Ack
  * threshold of 0.125 (i.e., Block Ack is requested if there are at least 64 * 0.125 = 8 MPDUs
@@ -2030,16 +2030,16 @@
 {
   public:
     /**
-     * \param mld whether the non-AP device is a multi-link device
+     * @param mld whether the non-AP device is a multi-link device
      */
     OrigBlockAckWindowStalled(bool mld);
 
     /**
      * Callback invoked when a FEM passes PSDUs to the PHY.
      *
-     * \param psduMap the PSDU map
-     * \param txVector the TX vector
-     * \param txPowerW the tx power in Watts
+     * @param psduMap the PSDU map
+     * @param txVector the TX vector
+     * @param txPowerW the tx power in Watts
      */
     void Transmit(WifiConstPsduMap psduMap, WifiTxVector txVector, double txPowerW);
 
@@ -2215,13 +2215,13 @@
     client->SetRemote(socket);
     wifiStaNode.Get(0)->AddApplication(client);
     client->SetStartTime(Seconds(0.5));
-    client->SetStopTime(Seconds(3.0));
+    client->SetStopTime(Seconds(3));
 
     auto server = CreateObject<PacketSocketServer>();
     server->SetLocal(socket);
     wifiApNode.Get(0)->AddApplication(server);
-    server->SetStartTime(Seconds(0.0));
-    server->SetStopTime(Seconds(4.0));
+    server->SetStartTime(Seconds(0));
+    server->SetStopTime(Seconds(4));
 }
 
 void
@@ -2241,10 +2241,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Block Ack Test Suite
+ * @brief Block Ack Test Suite
  */
 class BlockAckTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/test/channel-access-manager-test.cc ns-3.44/src/wifi/test/channel-access-manager-test.cc
--- ns-3.43/src/wifi/test/channel-access-manager-test.cc	2024-10-09 16:41:10.132656800 -0700
+++ ns-3.44/src/wifi/test/channel-access-manager-test.cc	2025-03-09 16:55:49.807372600 -0700
@@ -42,10 +42,10 @@
 class ChannelAccessManagerTest;
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief TxopTest Txop Test
+ * @brief TxopTest Txop Test
  */
 template <typename TxopType>
 class TxopTest : public TxopType
@@ -54,15 +54,15 @@
     /**
      * Constructor
      *
-     * \param test the test channel access manager
-     * \param i the index of the Txop
+     * @param test the test channel access manager
+     * @param i the index of the Txop
      */
     TxopTest(ChannelAccessManagerTest<TxopType>* test, uint32_t i);
 
     /**
      * Queue transmit function
-     * \param txTime the transmit time
-     * \param expectedGrantTime the expected grant time
+     * @param txTime the transmit time
+     * @param expectedGrantTime the expected grant time
      */
     void QueueTx(uint64_t txTime, uint64_t expectedGrantTime);
 
@@ -70,17 +70,17 @@
     /// allow ChannelAccessManagerTest class access
     friend class ChannelAccessManagerTest<TxopType>;
 
-    /// \copydoc ns3::Txop::DoDispose
+    /// @copydoc ns3::Txop::DoDispose
     void DoDispose() override;
-    /// \copydoc ns3::Txop::NotifyChannelAccessed
+    /// @copydoc ns3::Txop::NotifyChannelAccessed
     void NotifyChannelAccessed(uint8_t linkId, Time txopDuration = Seconds(0)) override;
-    /// \copydoc ns3::Txop::HasFramesToTransmit
+    /// @copydoc ns3::Txop::HasFramesToTransmit
     bool HasFramesToTransmit(uint8_t linkId) override;
-    /// \copydoc ns3::Txop::NotifySleep
+    /// @copydoc ns3::Txop::NotifySleep
     void NotifySleep(uint8_t linkId) override;
-    /// \copydoc ns3::Txop::NotifyWakeUp
+    /// @copydoc ns3::Txop::NotifyWakeUp
     void NotifyWakeUp(uint8_t linkId) override;
-    /// \copydoc ns3::Txop::GenerateBackoff
+    /// @copydoc ns3::Txop::GenerateBackoff
     void GenerateBackoff(uint8_t linkId) override;
 
     typedef std::pair<uint64_t, uint64_t> ExpectedGrant; //!< the expected grant typedef
@@ -101,7 +101,7 @@
 
     /**
      * Check if the Txop has frames to transmit.
-     * \return true if the Txop has frames to transmit.
+     * @return true if the Txop has frames to transmit.
      */
 
     ChannelAccessManagerTest<TxopType>* m_test; //!< the test DCF/EDCA manager
@@ -109,10 +109,10 @@
 };
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief ChannelAccessManager Stub
+ * @brief ChannelAccessManager Stub
  */
 class ChannelAccessManagerStub : public ChannelAccessManager
 {
@@ -124,7 +124,7 @@
     /**
      * Set the Short Interframe Space (SIFS).
      *
-     * \param sifs the SIFS duration
+     * @param sifs the SIFS duration
      */
     void SetSifs(Time sifs)
     {
@@ -134,7 +134,7 @@
     /**
      * Set the slot duration.
      *
-     * \param slot the slot duration
+     * @param slot the slot duration
      */
     void SetSlot(Time slot)
     {
@@ -144,7 +144,7 @@
     /**
      * Set the duration of EIFS - DIFS
      *
-     * \param eifsNoDifs the duration of EIFS - DIFS
+     * @param eifsNoDifs the duration of EIFS - DIFS
      */
     void SetEifsNoDifs(Time eifsNoDifs)
     {
@@ -173,10 +173,10 @@
 };
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Frame Exchange Manager Stub
+ * @brief Frame Exchange Manager Stub
  */
 template <typename TxopType>
 class FrameExchangeManagerStub : public FrameExchangeManager
@@ -185,7 +185,7 @@
     /**
      * Constructor
      *
-     * \param test the test channel access manager
+     * @param test the test channel access manager
      */
     FrameExchangeManagerStub(ChannelAccessManagerTest<TxopType>* test)
         : m_test(test)
@@ -195,10 +195,10 @@
     /**
      * Request the FrameExchangeManager to start a frame exchange sequence.
      *
-     * \param dcf the channel access function that gained channel access. It is
+     * @param dcf the channel access function that gained channel access. It is
      *            the DCF on non-QoS stations and an EDCA on QoS stations.
-     * \param allowedWidth the maximum allowed TX width
-     * \return true if a frame exchange sequence was started, false otherwise
+     * @param allowedWidth the maximum allowed TX width
+     * @return true if a frame exchange sequence was started, false otherwise
      */
     bool StartTransmission(Ptr<Txop> dcf, MHz_u allowedWidth) override
     {
@@ -206,13 +206,13 @@
         return true;
     }
 
-    /// \copydoc ns3::FrameExchangeManager::NotifyInternalCollision
+    /// @copydoc ns3::FrameExchangeManager::NotifyInternalCollision
     void NotifyInternalCollision(Ptr<Txop> txop) override
     {
         m_test->NotifyInternalCollision(DynamicCast<TxopTest<TxopType>>(txop));
     }
 
-    /// \copydoc ns3::FrameExchangeManager::NotifySwitchingStartNow
+    /// @copydoc ns3::FrameExchangeManager::NotifySwitchingStartNow
     void NotifySwitchingStartNow(Time duration) override
     {
         m_test->NotifyChannelSwitching();
@@ -223,10 +223,10 @@
 };
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Channel Access Manager Test
+ * @brief Channel Access Manager Test
  */
 template <typename TxopType>
 class ChannelAccessManagerTest : public TestCase
@@ -237,17 +237,17 @@
 
     /**
      * Notify access granted function
-     * \param i the index of the Txop
+     * @param i the index of the Txop
      */
     void NotifyAccessGranted(uint32_t i);
     /**
      * Notify internal collision function
-     * \param state the Txop
+     * @param state the Txop
      */
     void NotifyInternalCollision(Ptr<TxopTest<TxopType>> state);
     /**
      * Generate backoff function
-     * \param i the index of the Txop
+     * @param i the index of the Txop
      */
     void GenerateBackoff(uint32_t i);
     /**
@@ -258,111 +258,111 @@
   private:
     /**
      * Start test function
-     * \param slotTime the slot time
-     * \param sifs the SIFS
-     * \param eifsNoDifsNoSifs the EIFS no DIFS no SIFS
-     * \param ackTimeoutValue the Ack timeout value
-     * \param chWidth the channel width
+     * @param slotTime the slot time
+     * @param sifs the SIFS
+     * @param eifsNoDifsNoSifs the EIFS no DIFS no SIFS
+     * @param ackTimeoutValue the Ack timeout value
+     * @param chWidth the channel width
      */
     void StartTest(uint64_t slotTime,
                    uint64_t sifs,
                    uint64_t eifsNoDifsNoSifs,
                    uint32_t ackTimeoutValue = 20,
-                   MHz_u chWidth = 20);
+                   MHz_u chWidth = MHz_u{20});
     /**
      * Add Txop function
-     * \param aifsn the AIFSN
+     * @param aifsn the AIFSN
      */
     void AddTxop(uint32_t aifsn);
     /// End test function
     void EndTest();
     /**
      * Expect internal collision function
-     * \param time the expected time
-     * \param nSlots the number of slots
-     * \param from the expected from
+     * @param time the expected time
+     * @param nSlots the number of slots
+     * @param from the expected from
      */
     void ExpectInternalCollision(uint64_t time, uint32_t nSlots, uint32_t from);
     /**
      * Expect generate backoff function
-     * \param time the expected time
-     * \param nSlots the number of slots
-     * \param from the expected from
+     * @param time the expected time
+     * @param nSlots the number of slots
+     * @param from the expected from
      */
     void ExpectBackoff(uint64_t time, uint32_t nSlots, uint32_t from);
     /**
      * Schedule a check that the channel access manager is busy or idle
-     * \param time the expected time
-     * \param busy whether the manager is expected to be busy
+     * @param time the expected time
+     * @param busy whether the manager is expected to be busy
      */
     void ExpectBusy(uint64_t time, bool busy);
     /**
      * Perform check that channel access manager is busy or idle
-     * \param busy whether expected state is busy
+     * @param busy whether expected state is busy
      */
     void DoCheckBusy(bool busy);
     /**
      * Add receive OK event function
-     * \param at the event time
-     * \param duration the duration
+     * @param at the event time
+     * @param duration the duration
      */
     void AddRxOkEvt(uint64_t at, uint64_t duration);
     /**
      * Add receive error event function for error at end of frame
-     * \param at the event time
-     * \param duration the duration
+     * @param at the event time
+     * @param duration the duration
      */
     void AddRxErrorEvt(uint64_t at, uint64_t duration);
     /**
      * Add receive error event function for error during frame
-     * \param at the event time
-     * \param duration the duration
-     * \param timeUntilError the time after event time to force the error
+     * @param at the event time
+     * @param duration the duration
+     * @param timeUntilError the time after event time to force the error
      */
     void AddRxErrorEvt(uint64_t at, uint64_t duration, uint64_t timeUntilError);
     /**
      * Add receive inside SIFS event function
-     * \param at the event time
-     * \param duration the duration
+     * @param at the event time
+     * @param duration the duration
      */
     void AddRxInsideSifsEvt(uint64_t at, uint64_t duration);
     /**
      * Add transmit event function
-     * \param at the event time
-     * \param duration the duration
+     * @param at the event time
+     * @param duration the duration
      */
     void AddTxEvt(uint64_t at, uint64_t duration);
     /**
      * Add NAV reset function
-     * \param at the event time
-     * \param duration the duration
+     * @param at the event time
+     * @param duration the duration
      */
     void AddNavReset(uint64_t at, uint64_t duration);
     /**
      * Add NAV start function
-     * \param at the event time
-     * \param duration the duration
+     * @param at the event time
+     * @param duration the duration
      */
     void AddNavStart(uint64_t at, uint64_t duration);
     /**
      * Add Ack timeout reset function
-     * \param at the event time
+     * @param at the event time
      */
     void AddAckTimeoutReset(uint64_t at);
     /**
      * Add access function
-     * \param at the event time
-     * \param txTime the transmit time
-     * \param expectedGrantTime the expected grant time
-     * \param from the index of the requesting Txop
+     * @param at the event time
+     * @param txTime the transmit time
+     * @param expectedGrantTime the expected grant time
+     * @param from the index of the requesting Txop
      */
     void AddAccessRequest(uint64_t at, uint64_t txTime, uint64_t expectedGrantTime, uint32_t from);
     /**
      * Add access request with Ack timeout
-     * \param at time to schedule DoAccessRequest event
-     * \param txTime the transmit time
-     * \param expectedGrantTime the expected grant time
-     * \param from the index of the requesting Txop
+     * @param at time to schedule DoAccessRequest event
+     * @param txTime the transmit time
+     * @param expectedGrantTime the expected grant time
+     * @param from the index of the requesting Txop
      */
     void AddAccessRequestWithAckTimeout(uint64_t at,
                                         uint64_t txTime,
@@ -370,11 +370,11 @@
                                         uint32_t from);
     /**
      * Add access request with successful ack
-     * \param at time to schedule DoAccessRequest event
-     * \param txTime the transmit time
-     * \param expectedGrantTime the expected grant time
-     * \param ackDelay the delay of the Ack after txEnd
-     * \param from the index of the requesting Txop
+     * @param at time to schedule DoAccessRequest event
+     * @param txTime the transmit time
+     * @param expectedGrantTime the expected grant time
+     * @param ackDelay the delay of the Ack after txEnd
+     * @param from the index of the requesting Txop
      */
     void AddAccessRequestWithSuccessfulAck(uint64_t at,
                                            uint64_t txTime,
@@ -383,19 +383,19 @@
                                            uint32_t from);
     /**
      * Add access request with successful Ack
-     * \param txTime the transmit time
-     * \param expectedGrantTime the expected grant time
-     * \param state TxopTest
+     * @param txTime the transmit time
+     * @param expectedGrantTime the expected grant time
+     * @param state TxopTest
      */
     void DoAccessRequest(uint64_t txTime,
                          uint64_t expectedGrantTime,
                          Ptr<TxopTest<TxopType>> state);
     /**
      * Add CCA busy event function
-     * \param at the event time
-     * \param duration the duration
-     * \param channelType the channel type
-     * \param per20MhzDurations vector that indicates for how long each 20 MHz subchannel is busy
+     * @param at the event time
+     * @param duration the duration
+     * @param channelType the channel type
+     * @param per20MhzDurations vector that indicates for how long each 20 MHz subchannel is busy
      */
     void AddCcaBusyEvt(uint64_t at,
                        uint64_t duration,
@@ -403,14 +403,14 @@
                        const std::vector<Time>& per20MhzDurations = {});
     /**
      * Add switching event function
-     * \param at the event time
-     * \param duration the duration
+     * @param at the event time
+     * @param duration the duration
      */
     void AddSwitchingEvt(uint64_t at, uint64_t duration);
     /**
      * Add receive start event function
-     * \param at the event time
-     * \param duration the duration
+     * @param at the event time
+     * @param duration the duration
      */
     void AddRxStartEvt(uint64_t at, uint64_t duration);
 
@@ -1216,7 +1216,7 @@
     //     |  rx  | sifs | aifsn |  tx  |
     //                |
     //               52 request access
-    StartTest(4, 6, 10, 20, 40);
+    StartTest(4, 6, 10, 20, MHz_u{40});
     AddTxop(1);
     AddRxOkEvt(20, 30);
     AddCcaBusyEvt(50, 10, WIFI_CHANLIST_SECONDARY);
@@ -1230,7 +1230,7 @@
     //     |  rx  | sifs | aifsn |  tx  |
     //                       |
     //                      58 request access
-    StartTest(4, 6, 10, 20, 80);
+    StartTest(4, 6, 10, 20, MHz_u{80});
     AddTxop(1);
     AddRxOkEvt(20, 30);
     AddCcaBusyEvt(50, 10, WIFI_CHANLIST_SECONDARY);
@@ -1244,7 +1244,7 @@
     //     |  rx  | sifs | aifsn | idle |  tx  |
     //                               |
     //                              62 request access
-    StartTest(4, 6, 10, 20, 80);
+    StartTest(4, 6, 10, 20, MHz_u{80});
     AddTxop(1);
     AddRxOkEvt(20, 30);
     AddCcaBusyEvt(50, 14, WIFI_CHANLIST_SECONDARY40);
@@ -1259,7 +1259,7 @@
     //   |    rx    | sifs | acktxttime | sifs + aifsn |  tx  |
     //                   |
     //                  55 request access
-    StartTest(4, 6, 10, 20, 160);
+    StartTest(4, 6, 10, 20, MHz_u{160});
     AddTxop(1);
     AddRxErrorEvt(20, 30);
     AddCcaBusyEvt(50, 26, WIFI_CHANLIST_SECONDARY);
@@ -1274,7 +1274,7 @@
     //   |    rx    | sifs | acktxttime | sifs + aifsn |  tx  |
     //                                        |
     //                                       70 request access
-    StartTest(4, 6, 10, 20, 160);
+    StartTest(4, 6, 10, 20, MHz_u{160});
     AddTxop(1);
     AddRxErrorEvt(20, 30);
     AddCcaBusyEvt(50, 26, WIFI_CHANLIST_SECONDARY40);
@@ -1289,7 +1289,7 @@
     //   |    rx    | sifs | acktxttime | sifs + aifsn | idle |  tx  |
     //                                                     |
     //                                                    82 request access
-    StartTest(4, 6, 10, 20, 160);
+    StartTest(4, 6, 10, 20, MHz_u{160});
     AddTxop(1);
     AddRxErrorEvt(20, 30);
     AddCcaBusyEvt(50, 34, WIFI_CHANLIST_SECONDARY80);
@@ -1328,10 +1328,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test the calculation of the largest idle primary channel performed by
+ * @brief Test the calculation of the largest idle primary channel performed by
  * ChannelAccessManager::GetLargestIdlePrimaryChannel().
  *
  * In every test, the ChannelAccessManager is notified of a CCA_BUSY period and
@@ -1351,8 +1351,8 @@
     /**
      * Test a specific combination of operating channel width and busy channel type.
      *
-     * \param chWidth the operating channel width
-     * \param busyChannel the busy channel type
+     * @param chWidth the operating channel width
+     * @param busyChannel the busy channel type
      */
     void RunOne(MHz_u chWidth, WifiChannelListType busyChannel);
 
@@ -1391,19 +1391,20 @@
     // After 1ms, we are notified of CCA_BUSY for 1ms on the given channel
     Time ccaBusyStartDelay = MilliSeconds(1);
     Time ccaBusyDuration = MilliSeconds(1);
-    Simulator::Schedule(ccaBusyStartDelay,
-                        &ChannelAccessManager::NotifyCcaBusyStartNow,
-                        m_cam,
-                        ccaBusyDuration,
-                        busyChannel,
-                        std::vector<Time>(chWidth == 20 ? 0 : chWidth / 20, Seconds(0)));
+    Simulator::Schedule(
+        ccaBusyStartDelay,
+        &ChannelAccessManager::NotifyCcaBusyStartNow,
+        m_cam,
+        ccaBusyDuration,
+        busyChannel,
+        std::vector<Time>(chWidth == MHz_u{20} ? 0 : Count20MHzSubchannels(chWidth), Seconds(0)));
 
     // During any interval ending within CCA_BUSY period, the idle channel is the
     // primary channel contiguous to the busy secondary channel, if the busy channel
     // is a secondary channel, or there is no idle channel, otherwise.
-    MHz_u idleWidth = (busyChannel == WifiChannelListType::WIFI_CHANLIST_PRIMARY)
-                          ? 0
-                          : ((1 << (busyChannel - 1)) * 20);
+    const auto idleWidth = (busyChannel == WifiChannelListType::WIFI_CHANLIST_PRIMARY)
+                               ? MHz_u{0}
+                               : ((1 << (busyChannel - 1)) * MHz_u{20});
 
     Time checkTime1 = start + ccaBusyStartDelay + ccaBusyDuration / 2;
     Simulator::Schedule(checkTime1 - start, [=, this]() {
@@ -1480,7 +1481,7 @@
     Simulator::Schedule(checkTime6 - start, [=, this]() {
         Time interval6 = interval5 + rxDuration / 2;
         NS_TEST_EXPECT_MSG_EQ(m_cam->GetLargestIdlePrimaryChannel(interval6, checkTime6),
-                              0,
+                              MHz_u{0},
                               "Incorrect width of the idle channel in an interval "
                                   << "overlapping RX (channel width: " << chWidth
                                   << " MHz, busy channel: " << busyChannel << ")");
@@ -1495,7 +1496,7 @@
     uint8_t channel = 0;
     std::list<WifiChannelListType> busyChannels;
 
-    for (MHz_u chWidth : {20, 40, 80, 160})
+    for (auto chWidth : {MHz_u{20}, MHz_u{40}, MHz_u{80}, MHz_u{160}})
     {
         busyChannels.push_back(static_cast<WifiChannelListType>(channel));
 
@@ -1534,10 +1535,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test the GenerateBackoffIfTxopWithoutTx and ProactiveBackoff attributes of the
+ * @brief Test the GenerateBackoffIfTxopWithoutTx and ProactiveBackoff attributes of the
  *        ChannelAccessManager. The backoff values generated by the VO AC of the AP are checked.
  *
  * The GenerateBackoffIfTxopWithoutTx test checks the generation of backoff values when the
@@ -1586,7 +1587,7 @@
     /**
      * Constructor
      *
-     * \param type the test type
+     * @param type the test type
      */
     BackoffGenerationTest(TestType type);
 
@@ -1597,18 +1598,18 @@
     /**
      * Callback invoked when a FEM passes PSDUs to the PHY.
      *
-     * \param psduMap the PSDU map
-     * \param txVector the TX vector
-     * \param txPowerW the tx power in Watts
+     * @param psduMap the PSDU map
+     * @param txVector the TX vector
+     * @param txPowerW the tx power in Watts
      */
     void Transmit(WifiConstPsduMap psduMap, WifiTxVector txVector, double txPowerW);
 
     /**
      * Callback invoked when a new backoff value is generated by the given AC on the station.
      *
-     * \param ac the AC index
-     * \param backoff the generated backoff value
-     * \param linkId the ID of the link for which the backoff value has been generated
+     * @param ac the AC index
+     * @param backoff the generated backoff value
+     * @param linkId the ID of the link for which the backoff value has been generated
      */
     void BackoffGenerated(AcIndex ac, uint32_t backoff, uint8_t linkId);
 
@@ -1997,7 +1998,7 @@
     NS_LOG_FUNCTION(this);
     auto phy = DynamicCast<SpectrumWifiPhy>(m_apMac->GetWifiPhy(SINGLE_LINK_OP_ID));
     auto psd = Create<SpectrumValue>(phy->GetCurrentInterface()->GetRxSpectrumModel());
-    *psd = DbmToW(20) / 80e6; // PSD spread across 80 MHz to generate some noise
+    *psd = DbmToW(dBm_u{20}) / 80e6; // PSD spread across 80 MHz to generate some noise
 
     auto spectrumSignalParams = Create<SpectrumSignalParameters>();
     spectrumSignalParams->duration = m_interferenceDuration;
@@ -2009,10 +2010,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Txop Test Suite
+ * @brief Txop Test Suite
  */
 class TxopTestSuite : public TestSuite
 {
@@ -2029,10 +2030,10 @@
 static TxopTestSuite g_dcfTestSuite;
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief QosTxop Test Suite
+ * @brief QosTxop Test Suite
  */
 class QosTxopTestSuite : public TestSuite
 {
@@ -2049,10 +2050,10 @@
 static QosTxopTestSuite g_edcaTestSuite;
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief ChannelAccessManager Test Suite
+ * @brief ChannelAccessManager Test Suite
  */
 class ChannelAccessManagerTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/test/examples-to-run.py ns-3.44/src/wifi/test/examples-to-run.py
--- ns-3.43/src/wifi/test/examples-to-run.py	2024-10-09 16:41:10.136656800 -0700
+++ ns-3.44/src/wifi/test/examples-to-run.py	2025-03-09 16:55:49.807372600 -0700
@@ -35,7 +35,7 @@
         "True",
     ),
     (
-        "wifi-manager-example --wifiManager=Aarf --standard=802.11a --maxSlrc=1 --stepTime=0.1",
+        "wifi-manager-example --wifiManager=Aarf --standard=802.11a --maxRetryCount=1 --stepTime=0.1",
         "True",
         "True",
     ),
@@ -62,7 +62,7 @@
         "True",
     ),
     (
-        "wifi-manager-example --wifiManager=Aarfcd --standard=802.11a --maxSlrc=1 --stepTime=0.1",
+        "wifi-manager-example --wifiManager=Aarfcd --standard=802.11a --maxRetryCount=1 --stepTime=0.1",
         "True",
         "True",
     ),
@@ -93,7 +93,7 @@
         "True",
     ),
     (
-        "wifi-manager-example --wifiManager=Amrr --standard=802.11a --maxSlrc=1 --stepTime=0.1",
+        "wifi-manager-example --wifiManager=Amrr --standard=802.11a --maxRetryCount=1 --stepTime=0.1",
         "True",
         "True",
     ),
@@ -120,7 +120,7 @@
         "True",
     ),
     (
-        "wifi-manager-example --wifiManager=Arf --standard=802.11a --maxSlrc=1 --stepTime=0.1",
+        "wifi-manager-example --wifiManager=Arf --standard=802.11a --maxRetryCount=1 --stepTime=0.1",
         "True",
         "True",
     ),
@@ -147,7 +147,7 @@
         "True",
     ),
     (
-        "wifi-manager-example --wifiManager=Cara --standard=802.11a --maxSlrc=1 --stepTime=0.1",
+        "wifi-manager-example --wifiManager=Cara --standard=802.11a --maxRetryCount=1 --stepTime=0.1",
         "True",
         "True",
     ),
@@ -174,7 +174,7 @@
         "True",
     ),
     (
-        "wifi-manager-example --wifiManager=Onoe --standard=802.11a --maxSlrc=1 --stepTime=0.1",
+        "wifi-manager-example --wifiManager=Onoe --standard=802.11a --maxRetryCount=1 --stepTime=0.1",
         "True",
         "True",
     ),
@@ -201,7 +201,7 @@
         "True",
     ),
     (
-        "wifi-manager-example --wifiManager=Rraa --standard=802.11a --maxSlrc=1 --stepTime=0.1",
+        "wifi-manager-example --wifiManager=Rraa --standard=802.11a --maxRetryCount=1 --stepTime=0.1",
         "True",
         "True",
     ),
@@ -232,7 +232,7 @@
         "True",
     ),
     (
-        "wifi-manager-example --wifiManager=Minstrel --standard=802.11a --maxSlrc=1 --stepTime=0.1",
+        "wifi-manager-example --wifiManager=Minstrel --standard=802.11a --maxRetryCount=1 --stepTime=0.1",
         "True",
         "True",
     ),
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/test/inter-bss-test-suite.cc ns-3.44/src/wifi/test/inter-bss-test-suite.cc
--- ns-3.43/src/wifi/test/inter-bss-test-suite.cc	2024-10-09 16:41:10.136656800 -0700
+++ ns-3.44/src/wifi/test/inter-bss-test-suite.cc	2025-03-09 16:55:49.807372600 -0700
@@ -38,10 +38,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Wifi Test
+ * @brief Wifi Test
  *
  * This test case tests the transmission of inter-BSS cases
  * and verify behavior of 11ax OBSS_PD spatial reuse.
@@ -69,7 +69,7 @@
     /**
      * Constructor
      *
-     * \param standard The standard to use for the test
+     * @param standard The standard to use for the test
      */
     TestInterBssConstantObssPdAlgo(WifiStandard standard);
     ~TestInterBssConstantObssPdAlgo() override;
@@ -79,20 +79,20 @@
   private:
     /**
      * Send one packet function
-     * \param tx_dev the transmitting device
-     * \param rx_dev the receiving device
-     * \param payloadSize the payload size
+     * @param tx_dev the transmitting device
+     * @param rx_dev the receiving device
+     * @param payloadSize the payload size
      */
     void SendOnePacket(Ptr<WifiNetDevice> tx_dev, Ptr<WifiNetDevice> rx_dev, uint32_t payloadSize);
 
     /**
      * Allocate the node positions
-     * \param d1 distance d1
-     * \param d2 distance d2
-     * \param d3 distance d3
-     * \param d4 distance d4
-     * \param d5 distance d5
-     * \return the node positions
+     * @param d1 distance d1
+     * @param d2 distance d2
+     * @param d3 distance d3
+     * @param d4 distance d4
+     * @param d5 distance d5
+     * @return the node positions
      */
     Ptr<ListPositionAllocator> AllocatePositions(meter_u d1,
                                                  meter_u d2,
@@ -102,7 +102,7 @@
 
     /**
      * Set the expected transmit power
-     * \param txPower the transmit power
+     * @param txPower the transmit power
      */
     void SetExpectedTxPower(dBm_u txPower);
 
@@ -133,39 +133,39 @@
 
     /**
      * Check if the Phy State for a device is an expected value
-     * \param device the device to check
-     * \param expectedState the expected PHY state
+     * @param device the device to check
+     * @param expectedState the expected PHY state
      */
     void CheckPhyState(Ptr<WifiNetDevice> device, WifiPhyState expectedState);
 
     /**
      * Check if the Phy drop reasons for a device are as expected
-     * \param device the device to check
-     * \param expectedDropReasons the expected PHY drop reasons
+     * @param device the device to check
+     * @param expectedDropReasons the expected PHY drop reasons
      */
     void CheckPhyDropReasons(Ptr<WifiNetDevice> device,
                              std::vector<WifiPhyRxfailureReason> expectedDropReasons);
 
     /**
      * Notify Phy transmit begin
-     * \param context the context
-     * \param p the packet
-     * \param txPowerW the tx power
+     * @param context the context
+     * @param p the packet
+     * @param txPowerW the tx power
      */
     void NotifyPhyTxBegin(std::string context, Ptr<const Packet> p, double txPowerW);
 
     /**
      * Notify Phy receive ends
-     * \param context the context
-     * \param p the packet
+     * @param context the context
+     * @param p the packet
      */
     void NotifyPhyRxEnd(std::string context, Ptr<const Packet> p);
 
     /**
      * Notify Phy receive drops
-     * \param context the context
-     * \param p the packet
-     * \param reason the reason why it was dropped
+     * @param context the context
+     * @param p the packet
+     * @param reason the reason why it was dropped
      */
     void NotifyPhyRxDrop(std::string context, Ptr<const Packet> p, WifiPhyRxfailureReason reason);
 
@@ -216,10 +216,10 @@
       m_payloadSize1(1000),
       m_payloadSize2(1500),
       m_payloadSize3(2000),
-      m_txPower(15),
-      m_obssPdLevel(-72),
-      m_obssRxPower(-82),
-      m_expectedTxPower(15),
+      m_txPower(dBm_u{15}),
+      m_obssPdLevel(dBm_u{-72}),
+      m_obssRxPower(dBm_u{-82}),
+      m_expectedTxPower(dBm_u{15}),
       m_bssColor1(1),
       m_bssColor2(2),
       m_bssColor3(3),
@@ -315,87 +315,87 @@
     // We test PHY state and verify whether a CCA reset did occur.
 
     // AP2 sends a packet 0.5s later.
-    Simulator::Schedule(Seconds(2.0), &TestInterBssConstantObssPdAlgo::ClearDropReasons, this);
-    Simulator::Schedule(Seconds(2.0),
+    Simulator::Schedule(Seconds(2), &TestInterBssConstantObssPdAlgo::ClearDropReasons, this);
+    Simulator::Schedule(Seconds(2),
                         &TestInterBssConstantObssPdAlgo::SendOnePacket,
                         this,
                         ap_device2,
                         sta_device2,
                         m_payloadSize2);
-    Simulator::Schedule(Seconds(2.0) + MicroSeconds(10),
+    Simulator::Schedule(Seconds(2) + MicroSeconds(10),
                         &TestInterBssConstantObssPdAlgo::CheckPhyState,
                         this,
                         ap_device2,
                         WifiPhyState::TX);
     // All other PHYs should have stay idle until 4us (preamble detection time).
-    Simulator::Schedule(Seconds(2.0) + MicroSeconds(11),
+    Simulator::Schedule(Seconds(2) + MicroSeconds(11),
                         &TestInterBssConstantObssPdAlgo::CheckPhyState,
                         this,
                         sta_device1,
                         WifiPhyState::IDLE);
-    Simulator::Schedule(Seconds(2.0) + MicroSeconds(11),
+    Simulator::Schedule(Seconds(2) + MicroSeconds(11),
                         &TestInterBssConstantObssPdAlgo::CheckPhyState,
                         this,
                         sta_device2,
                         WifiPhyState::IDLE);
-    Simulator::Schedule(Seconds(2.0) + MicroSeconds(11),
+    Simulator::Schedule(Seconds(2) + MicroSeconds(11),
                         &TestInterBssConstantObssPdAlgo::CheckPhyState,
                         this,
                         ap_device1,
                         WifiPhyState::IDLE);
     // All PHYs should be receiving the PHY header (i.e. PHY state is CCA_BUSY) if preamble has been
     // detected (always the case in this test).
-    Simulator::Schedule(Seconds(2.0) + MicroSeconds(14),
+    Simulator::Schedule(Seconds(2) + MicroSeconds(14),
                         &TestInterBssConstantObssPdAlgo::CheckPhyState,
                         this,
                         sta_device1,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(2.0) + MicroSeconds(14),
+    Simulator::Schedule(Seconds(2) + MicroSeconds(14),
                         &TestInterBssConstantObssPdAlgo::CheckPhyState,
                         this,
                         sta_device2,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(2.0) + MicroSeconds(14),
+    Simulator::Schedule(Seconds(2) + MicroSeconds(14),
                         &TestInterBssConstantObssPdAlgo::CheckPhyState,
                         this,
                         ap_device1,
                         WifiPhyState::CCA_BUSY);
     // PHYs of AP1 and STA1 should be idle after HE-SIG-A if they were reset by OBSS_PD SR,
     // otherwise they should be CCA_busy until beginning of payload.
-    Simulator::Schedule(Seconds(2.0) + MicroSeconds(43),
+    Simulator::Schedule(Seconds(2) + MicroSeconds(43),
                         &TestInterBssConstantObssPdAlgo::CheckPhyDropReasons,
                         this,
                         sta_device1,
                         dropReasons);
-    Simulator::Schedule(Seconds(2.0) + MicroSeconds(43),
+    Simulator::Schedule(Seconds(2) + MicroSeconds(43),
                         &TestInterBssConstantObssPdAlgo::CheckPhyState,
                         this,
                         sta_device1,
                         expectPhyReset ? WifiPhyState::IDLE : WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(2.0) + MicroSeconds(43),
+    Simulator::Schedule(Seconds(2) + MicroSeconds(43),
                         &TestInterBssConstantObssPdAlgo::CheckPhyDropReasons,
                         this,
                         ap_device1,
                         dropReasons);
-    Simulator::Schedule(Seconds(2.0) + MicroSeconds(43),
+    Simulator::Schedule(Seconds(2) + MicroSeconds(43),
                         &TestInterBssConstantObssPdAlgo::CheckPhyState,
                         this,
                         ap_device1,
                         expectPhyReset ? WifiPhyState::IDLE : WifiPhyState::CCA_BUSY);
     // PHYs of AP1 and STA1 should be idle if they were reset by OBSS_PD SR, otherwise they should
     // be CCA_busy/Rx (since filtered/not filtered, resp.).
-    Simulator::Schedule(Seconds(2.0) + MicroSeconds(54),
+    Simulator::Schedule(Seconds(2) + MicroSeconds(54),
                         &TestInterBssConstantObssPdAlgo::CheckPhyState,
                         this,
                         sta_device1,
                         expectPhyReset ? WifiPhyState::IDLE : stateDuringPayloadNeighboringBss);
-    Simulator::Schedule(Seconds(2.0) + MicroSeconds(54),
+    Simulator::Schedule(Seconds(2) + MicroSeconds(54),
                         &TestInterBssConstantObssPdAlgo::CheckPhyState,
                         this,
                         ap_device1,
                         expectPhyReset ? WifiPhyState::IDLE : stateDuringPayloadNeighboringBss);
     // STA2 should be receiving
-    Simulator::Schedule(Seconds(2.0) + MicroSeconds(54),
+    Simulator::Schedule(Seconds(2) + MicroSeconds(54),
                         &TestInterBssConstantObssPdAlgo::CheckPhyState,
                         this,
                         sta_device2,
@@ -665,31 +665,32 @@
 {
     uint32_t idx = ConvertContextToNodeId(context);
     uint32_t pktSize = p->GetSize() - 38;
+    Watt_u txPower{txPowerW};
     if ((idx == 0) && ((pktSize == m_payloadSize1) || (pktSize == (m_payloadSize1 / 10))))
     {
         m_numSta1PacketsSent++;
-        NS_TEST_EXPECT_MSG_EQ(TestDoubleIsEqual(WToDbm(txPowerW), m_expectedTxPower, 1e-12),
+        NS_TEST_EXPECT_MSG_EQ(TestDoubleIsEqual(WToDbm(txPower), m_expectedTxPower, 1e-12),
                               true,
                               "Tx power is not correct!");
     }
     else if ((idx == 1) && ((pktSize == m_payloadSize2) || (pktSize == (m_payloadSize2 / 10))))
     {
         m_numSta2PacketsSent++;
-        NS_TEST_EXPECT_MSG_EQ(TestDoubleIsEqual(WToDbm(txPowerW), m_expectedTxPower, 1e-12),
+        NS_TEST_EXPECT_MSG_EQ(TestDoubleIsEqual(WToDbm(txPower), m_expectedTxPower, 1e-12),
                               true,
                               "Tx power is not correct!");
     }
     else if ((idx == 3) && ((pktSize == m_payloadSize1) || (pktSize == (m_payloadSize1 / 10))))
     {
         m_numAp1PacketsSent++;
-        NS_TEST_EXPECT_MSG_EQ(TestDoubleIsEqual(WToDbm(txPowerW), m_expectedTxPower, 1e-12),
+        NS_TEST_EXPECT_MSG_EQ(TestDoubleIsEqual(WToDbm(txPower), m_expectedTxPower, 1e-12),
                               true,
                               "Tx power is not correct!");
     }
     else if ((idx == 4) && ((pktSize == m_payloadSize2) || (pktSize == (m_payloadSize2 / 10))))
     {
         m_numAp2PacketsSent++;
-        NS_TEST_EXPECT_MSG_EQ(TestDoubleIsEqual(WToDbm(txPowerW), m_expectedTxPower, 1e-12),
+        NS_TEST_EXPECT_MSG_EQ(TestDoubleIsEqual(WToDbm(txPower), m_expectedTxPower, 1e-12),
                               true,
                               "Tx power is not correct!");
     }
@@ -904,16 +905,13 @@
 
     lossModel->SetLoss(wifiStaNodes.Get(0)->GetObject<MobilityModel>(),
                        wifiApNodes.Get(0)->GetObject<MobilityModel>(),
-                       m_txPower +
-                           static_cast<dB_u>(30.0)); // Low attenuation for IBSS transmissions
+                       m_txPower + dB_u{30.0}); // Low attenuation for IBSS transmissions
     lossModel->SetLoss(wifiStaNodes.Get(1)->GetObject<MobilityModel>(),
                        wifiApNodes.Get(1)->GetObject<MobilityModel>(),
-                       m_txPower +
-                           static_cast<dB_u>(30.0)); // Low attenuation for IBSS transmissions
+                       m_txPower + dB_u{30.0}); // Low attenuation for IBSS transmissions
     lossModel->SetLoss(wifiStaNodes.Get(2)->GetObject<MobilityModel>(),
                        wifiApNodes.Get(2)->GetObject<MobilityModel>(),
-                       m_txPower +
-                           static_cast<dB_u>(30.0)); // Low attenuation for IBSS transmissions
+                       m_txPower + dB_u{30.0}); // Low attenuation for IBSS transmissions
 
     Config::Connect("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/PhyTxBegin",
                     MakeCallback(&TestInterBssConstantObssPdAlgo::NotifyPhyTxBegin, this));
@@ -934,24 +932,24 @@
 TestInterBssConstantObssPdAlgo::DoRun()
 {
     // Test case 1: CCA CS Threshold = m_obssRxPower < m_obssPdLevel
-    m_obssPdLevel = -72;
-    m_obssRxPower = -82;
+    m_obssPdLevel = dBm_u{-72};
+    m_obssRxPower = dBm_u{-82};
     m_bssColor1 = 1;
     m_bssColor2 = 2;
     m_bssColor3 = 3;
     RunOne();
 
     // Test case 2: CCA CS Threshold < m_obssPdLevel < m_obssRxPower
-    m_obssPdLevel = -72;
-    m_obssRxPower = -62;
+    m_obssPdLevel = dBm_u{-72};
+    m_obssRxPower = dBm_u{-62};
     m_bssColor1 = 1;
     m_bssColor2 = 2;
     m_bssColor3 = 3;
     RunOne();
 
     // Test case 3: CCA CS Threshold < m_obssPdLevel = m_obssRxPower
-    m_obssPdLevel = -72;
-    m_obssRxPower = -72;
+    m_obssPdLevel = dBm_u{-72};
+    m_obssRxPower = dBm_u{-72};
     m_bssColor1 = 1;
     m_bssColor2 = 2;
     m_bssColor3 = 3;
@@ -959,16 +957,16 @@
 
     // Test case 4: CCA CS Threshold = m_obssRxPower < m_obssPdLevel with BSS color 2 and 3
     // set to 0
-    m_obssPdLevel = -72;
-    m_obssRxPower = -82;
+    m_obssPdLevel = dBm_u{-72};
+    m_obssRxPower = dBm_u{-82};
     m_bssColor1 = 1;
     m_bssColor2 = 0;
     m_bssColor3 = 0;
     RunOne();
 
     // Test case 5: CCA CS Threshold = m_obssRxPower < m_obssPdLevel with BSS color 1 set to 0
-    m_obssPdLevel = -72;
-    m_obssRxPower = -82;
+    m_obssPdLevel = dBm_u{-72};
+    m_obssRxPower = dBm_u{-82};
     m_bssColor1 = 0;
     m_bssColor2 = 2;
     m_bssColor3 = 3;
@@ -976,10 +974,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Inter BSS Test Suite
+ * @brief Inter BSS Test Suite
  */
 
 class InterBssTestSuite : public TestSuite
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/test/power-rate-adaptation-test.cc ns-3.44/src/wifi/test/power-rate-adaptation-test.cc
--- ns-3.43/src/wifi/test/power-rate-adaptation-test.cc	2024-10-09 16:41:10.136656800 -0700
+++ ns-3.44/src/wifi/test/power-rate-adaptation-test.cc	2025-03-09 16:55:49.807372600 -0700
@@ -25,10 +25,10 @@
 using namespace ns3;
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Power Rate Adaptation Test
+ * @brief Power Rate Adaptation Test
  */
 class PowerRateAdaptationTest : public TestCase
 {
@@ -46,7 +46,7 @@
     void TestRrpaa();
     /**
      * Configure nde function
-     * \returns the node
+     * @returns the node
      */
     Ptr<Node> ConfigureNode();
 
@@ -94,8 +94,8 @@
      * Configure power control parameters.
      */
     phy->SetNTxPower(18);
-    phy->SetTxPowerStart(0);
-    phy->SetTxPowerEnd(17);
+    phy->SetTxPowerStart(dBm_u{0});
+    phy->SetTxPowerEnd(dBm_u{17});
 
     /*
      * Create manager.
@@ -1136,7 +1136,7 @@
         "RRPAA: Incorrect vale of data rate");
     NS_TEST_ASSERT_MSG_EQ(power, 0, "RRPAA: Incorrect value of power level");
 
-    Simulator::Stop(Seconds(10.0));
+    Simulator::Stop(Seconds(10));
 
     Simulator::Run();
     Simulator::Destroy();
@@ -1151,10 +1151,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Power Rate Adaptation Test Suite
+ * @brief Power Rate Adaptation Test Suite
  */
 class PowerRateAdaptationTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/test/power-save-test.cc ns-3.44/src/wifi/test/power-save-test.cc
--- ns-3.43/src/wifi/test/power-save-test.cc	2024-10-09 16:41:10.136656800 -0700
+++ ns-3.44/src/wifi/test/power-save-test.cc	2025-03-09 16:55:49.807372600 -0700
@@ -23,16 +23,16 @@
 NS_LOG_COMPONENT_DEFINE("PowerSaveTest");
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test TIM Information element serialization and deserialization
+ * @brief Test TIM Information element serialization and deserialization
  */
 class TimInformationElementTest : public HeaderSerializationTestCase
 {
   public:
     /**
-     * \brief Constructor
+     * @brief Constructor
      */
     TimInformationElementTest();
 
@@ -40,11 +40,11 @@
     /**
      * Reset the passed TIM to have the provided parameters.
      *
-     * \param tim the TIM element to set
-     * \param dtimCount the DTIM count value
-     * \param dtimPeriod the DTIM period value
-     * \param multicastPending whether group addressed frames are queued
-     * \param aidValues the AID values to set
+     * @param tim the TIM element to set
+     * @param dtimCount the DTIM count value
+     * @param dtimPeriod the DTIM period value
+     * @param multicastPending whether group addressed frames are queued
+     * @param aidValues the AID values to set
      */
     void SetTim(Tim& tim,
                 uint8_t dtimCount,
@@ -56,17 +56,17 @@
      * Test that the Bitmap Control and the Partial Virtual Bitmap
      * fields of the provided TIM match the passed bufferContents.
      *
-     * \param tim the provided TIM
-     * \param bufferContents the expected content of the buffer
+     * @param tim the provided TIM
+     * @param bufferContents the expected content of the buffer
      */
     void CheckSerializationAgainstBuffer(Tim& tim, const std::vector<uint8_t>& bufferContents);
 
     /**
      * Test that the GetAidSet() method return the expected set of AID values.
      *
-     * \param tim the TIM element
-     * \param aid the AID value passed to GetAidSet()
-     * \param expectedSet the expected set of AID values returned by GetAidSet()
+     * @param tim the TIM element
+     * @param aid the AID value passed to GetAidSet()
+     * @param expectedSet the expected set of AID values returned by GetAidSet()
      */
     void CheckAidSet(const Tim& tim, uint16_t aid, const std::set<uint16_t>& expectedSet);
 };
@@ -246,10 +246,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Power Save Test Suite
+ * @brief Power Save Test Suite
  */
 class PowerSaveTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/test/spectrum-wifi-phy-test.cc ns-3.44/src/wifi/test/spectrum-wifi-phy-test.cc
--- ns-3.43/src/wifi/test/spectrum-wifi-phy-test.cc	2024-10-09 16:41:10.136656800 -0700
+++ ns-3.44/src/wifi/test/spectrum-wifi-phy-test.cc	2025-03-09 16:55:49.807372600 -0700
@@ -39,7 +39,7 @@
 NS_LOG_COMPONENT_DEFINE("SpectrumWifiPhyTest");
 
 static const uint8_t CHANNEL_NUMBER = 36;
-static const MHz_u CHANNEL_WIDTH = 20;
+static const MHz_u CHANNEL_WIDTH{20};
 static const MHz_u GUARD_WIDTH = CHANNEL_WIDTH; // expanded to channel width to model spectrum mask
 
 /**
@@ -58,8 +58,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId()
     {
@@ -73,7 +73,7 @@
     /**
      * Indicate whether the interference helper is in receiving state
      *
-     * \return true if the interference helper is in receiving state, false otherwise
+     * @return true if the interference helper is in receiving state, false otherwise
      */
     bool IsRxing() const
     {
@@ -85,9 +85,9 @@
     /**
      * Indicate whether a given band is tracked by the interference helper
      *
-     * \param startStopFreqs the start and stop frequencies per segment of the band
+     * @param startStopFreqs the start and stop frequencies per segment of the band
      *
-     * \return true if the specified band is tracked by the interference helper, false otherwise
+     * @return true if the specified band is tracked by the interference helper, false otherwise
      */
     bool IsBandTracked(const std::vector<WifiSpectrumBandFrequencies>& startStopFreqs) const
     {
@@ -105,10 +105,10 @@
 NS_OBJECT_ENSURE_REGISTERED(ExtInterferenceHelper);
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Spectrum Wifi Phy Basic Test
+ * @brief Spectrum Wifi Phy Basic Test
  */
 class SpectrumWifiPhyBasicTest : public TestCase
 {
@@ -117,7 +117,7 @@
     /**
      * Constructor
      *
-     * \param name reference name
+     * @param name reference name
      */
     SpectrumWifiPhyBasicTest(std::string name);
     ~SpectrumWifiPhyBasicTest() override;
@@ -128,31 +128,31 @@
     Ptr<SpectrumWifiPhy> m_phy; ///< Phy
     /**
      * Make signal function
-     * \param txPower the transmit power
-     * \param channel the operating channel of the PHY used for the transmission
-     * \returns Ptr<SpectrumSignalParameters>
+     * @param txPower the transmit power
+     * @param channel the operating channel of the PHY used for the transmission
+     * @returns Ptr<SpectrumSignalParameters>
      */
     Ptr<SpectrumSignalParameters> MakeSignal(Watt_u txPower,
                                              const WifiPhyOperatingChannel& channel);
     /**
      * Send signal function
-     * \param txPower the transmit power
+     * @param txPower the transmit power
      */
     void SendSignal(Watt_u txPower);
     /**
      * Spectrum wifi receive success function
-     * \param psdu the PSDU
-     * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
-     * \param txVector the transmit vector
-     * \param statusPerMpdu reception status per MPDU
+     * @param psdu the PSDU
+     * @param rxSignalInfo the info on the received signal (\see RxSignalInfo)
+     * @param txVector the transmit vector
+     * @param statusPerMpdu reception status per MPDU
      */
     void SpectrumWifiPhyRxSuccess(Ptr<const WifiPsdu> psdu,
                                   RxSignalInfo rxSignalInfo,
-                                  WifiTxVector txVector,
-                                  std::vector<bool> statusPerMpdu);
+                                  const WifiTxVector& txVector,
+                                  const std::vector<bool>& statusPerMpdu);
     /**
      * Spectrum wifi receive failure function
-     * \param psdu the PSDU
+     * @param psdu the PSDU
      */
     void SpectrumWifiPhyRxFailure(Ptr<const WifiPsdu> psdu);
     uint32_t m_count; ///< count
@@ -197,7 +197,7 @@
 
     auto psdu = Create<WifiPsdu>(pkt, hdr);
     const auto txDuration =
-        m_phy->CalculateTxDuration(psdu->GetSize(), txVector, m_phy->GetPhyBand());
+        SpectrumWifiPhy::CalculateTxDuration(psdu->GetSize(), txVector, m_phy->GetPhyBand());
 
     auto ppdu = Create<OfdmPpdu>(psdu, txVector, channel, m_uid++);
 
@@ -225,8 +225,8 @@
 void
 SpectrumWifiPhyBasicTest::SpectrumWifiPhyRxSuccess(Ptr<const WifiPsdu> psdu,
                                                    RxSignalInfo rxSignalInfo,
-                                                   WifiTxVector txVector,
-                                                   std::vector<bool> statusPerMpdu)
+                                                   const WifiTxVector& txVector,
+                                                   const std::vector<bool>& statusPerMpdu)
 {
     NS_LOG_FUNCTION(this << *psdu << rxSignalInfo << txVector);
     m_count++;
@@ -301,10 +301,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test Phy Listener
+ * @brief Test Phy Listener
  */
 class TestPhyListener : public ns3::WifiPhyListener
 {
@@ -397,10 +397,10 @@
 };
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Spectrum Wifi Phy Listener Test
+ * @brief Spectrum Wifi Phy Listener Test
  */
 class SpectrumWifiPhyListenerTest : public SpectrumWifiPhyBasicTest
 {
@@ -447,10 +447,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Spectrum Wifi Phy Filter Test
+ * @brief Spectrum Wifi Phy Filter Test
  */
 class SpectrumWifiPhyFilterTest : public TestCase
 {
@@ -459,7 +459,7 @@
     /**
      * Constructor
      *
-     * \param name reference name
+     * @param name reference name
      */
     SpectrumWifiPhyFilterTest(std::string name);
     ~SpectrumWifiPhyFilterTest() override;
@@ -481,8 +481,8 @@
 
     /**
      * Callback triggered when a packet is received by the PHYs
-     * \param p the received packet
-     * \param rxPowersW the received power per channel band in watts
+     * @param p the received packet
+     * @param rxPowersW the received power per channel band in watts
      */
     void RxCallback(Ptr<const Packet> p, RxPowerWattPerChannelBand rxPowersW);
 
@@ -495,8 +495,8 @@
 
 SpectrumWifiPhyFilterTest::SpectrumWifiPhyFilterTest()
     : TestCase("SpectrumWifiPhy test RX filters"),
-      m_txChannelWidth(20),
-      m_rxChannelWidth(20)
+      m_txChannelWidth(MHz_u{20}),
+      m_rxChannelWidth(MHz_u{20})
 {
 }
 
@@ -545,10 +545,10 @@
     }
 
     size_t numBands = rxPowersW.size();
-    auto expectedNumBands = std::max<std::size_t>(1, m_rxChannelWidth / 20);
-    expectedNumBands += (m_rxChannelWidth / 40);
-    expectedNumBands += (m_rxChannelWidth / 80);
-    expectedNumBands += (m_rxChannelWidth / 160);
+    auto expectedNumBands = std::max<std::size_t>(1, m_rxChannelWidth / MHz_u{20});
+    expectedNumBands += (m_rxChannelWidth / MHz_u{40});
+    expectedNumBands += (m_rxChannelWidth / MHz_u{80});
+    expectedNumBands += (m_rxChannelWidth / MHz_u{160});
     expectedNumBands += m_rxPhy
                             ->GetHeRuBands(m_rxPhy->GetCurrentInterface(),
                                            m_rxPhy->GetGuardBandwidth(
@@ -581,15 +581,15 @@
                           expectedTotalRxPower,
                           "Total received power is not correct");
 
-    if ((m_txChannelWidth <= m_rxChannelWidth) && (channelWidth >= 20))
+    if ((m_txChannelWidth <= m_rxChannelWidth) && (channelWidth >= MHz_u{20}))
     {
-        band = m_rxPhy->GetBand(20, 0); // primary 20 MHz
+        band = m_rxPhy->GetBand(MHz_u{20}, 0); // primary 20 MHz
         it = rxPowersW.find(band);
         NS_LOG_INFO("powerW in primary 20 MHz channel: " << it->second << " (" << WToDbm(it->second)
                                                          << " dBm)");
         const auto rxPowerPrimaryChannel20 = static_cast<int>(WToDbm(it->second) + 0.5);
         const auto expectedRxPowerPrimaryChannel20 =
-            16 - static_cast<int>(RatioToDb(channelWidth / 20));
+            16 - static_cast<int>(RatioToDb(Count20MHzSubchannels(channelWidth)));
         NS_TEST_ASSERT_MSG_EQ(rxPowerPrimaryChannel20,
                               expectedRxPowerPrimaryChannel20,
                               "Received power in the primary 20 MHz band is not correct");
@@ -660,16 +660,16 @@
     {
     case 20:
     default:
-        txFrequency = 5180;
+        txFrequency = MHz_u{5180};
         break;
     case 40:
-        txFrequency = 5190;
+        txFrequency = MHz_u{5190};
         break;
     case 80:
-        txFrequency = 5210;
+        txFrequency = MHz_u{5210};
         break;
     case 160:
-        txFrequency = 5250;
+        txFrequency = MHz_u{5250};
         break;
     }
     auto txChannelNum = WifiPhyOperatingChannel::FindFirst(0,
@@ -686,16 +686,16 @@
     {
     case 20:
     default:
-        rxFrequency = 5180;
+        rxFrequency = MHz_u{5180};
         break;
     case 40:
-        rxFrequency = 5190;
+        rxFrequency = MHz_u{5190};
         break;
     case 80:
-        rxFrequency = 5210;
+        rxFrequency = MHz_u{5210};
         break;
     case 160:
-        rxFrequency = 5250;
+        rxFrequency = MHz_u{5250};
         break;
     }
     auto rxChannelNum = WifiPhyOperatingChannel::FindFirst(0,
@@ -715,78 +715,78 @@
 void
 SpectrumWifiPhyFilterTest::DoRun()
 {
-    m_txChannelWidth = 20;
-    m_rxChannelWidth = 20;
+    m_txChannelWidth = MHz_u{20};
+    m_rxChannelWidth = MHz_u{20};
     RunOne();
 
-    m_txChannelWidth = 40;
-    m_rxChannelWidth = 40;
+    m_txChannelWidth = MHz_u{40};
+    m_rxChannelWidth = MHz_u{40};
     RunOne();
 
-    m_txChannelWidth = 80;
-    m_rxChannelWidth = 80;
+    m_txChannelWidth = MHz_u{80};
+    m_rxChannelWidth = MHz_u{80};
     RunOne();
 
-    m_txChannelWidth = 160;
-    m_rxChannelWidth = 160;
+    m_txChannelWidth = MHz_u{160};
+    m_rxChannelWidth = MHz_u{160};
     RunOne();
 
-    m_txChannelWidth = 20;
-    m_rxChannelWidth = 40;
+    m_txChannelWidth = MHz_u{20};
+    m_rxChannelWidth = MHz_u{40};
     RunOne();
 
-    m_txChannelWidth = 20;
-    m_rxChannelWidth = 80;
+    m_txChannelWidth = MHz_u{20};
+    m_rxChannelWidth = MHz_u{80};
     RunOne();
 
-    m_txChannelWidth = 40;
-    m_rxChannelWidth = 80;
+    m_txChannelWidth = MHz_u{40};
+    m_rxChannelWidth = MHz_u{80};
     RunOne();
 
-    m_txChannelWidth = 20;
-    m_rxChannelWidth = 160;
+    m_txChannelWidth = MHz_u{20};
+    m_rxChannelWidth = MHz_u{160};
     RunOne();
 
-    m_txChannelWidth = 40;
-    m_rxChannelWidth = 160;
+    m_txChannelWidth = MHz_u{40};
+    m_rxChannelWidth = MHz_u{160};
     RunOne();
 
-    m_txChannelWidth = 80;
-    m_rxChannelWidth = 160;
+    m_txChannelWidth = MHz_u{80};
+    m_rxChannelWidth = MHz_u{160};
     RunOne();
 
-    m_txChannelWidth = 40;
-    m_rxChannelWidth = 20;
+    m_txChannelWidth = MHz_u{40};
+    m_rxChannelWidth = MHz_u{20};
     RunOne();
 
-    m_txChannelWidth = 80;
-    m_rxChannelWidth = 20;
+    m_txChannelWidth = MHz_u{80};
+    m_rxChannelWidth = MHz_u{20};
     RunOne();
 
-    m_txChannelWidth = 80;
-    m_rxChannelWidth = 40;
+    m_txChannelWidth = MHz_u{80};
+    m_rxChannelWidth = MHz_u{40};
     RunOne();
 
-    m_txChannelWidth = 160;
-    m_rxChannelWidth = 20;
+    m_txChannelWidth = MHz_u{160};
+    m_rxChannelWidth = MHz_u{20};
     RunOne();
 
-    m_txChannelWidth = 160;
-    m_rxChannelWidth = 40;
+    m_txChannelWidth = MHz_u{160};
+    m_rxChannelWidth = MHz_u{40};
     RunOne();
 
-    m_txChannelWidth = 160;
-    m_rxChannelWidth = 80;
+    m_txChannelWidth = MHz_u{160};
+    m_rxChannelWidth = MHz_u{80};
     RunOne();
 
     Simulator::Destroy();
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Spectrum Wifi Phy Bands Calculations Test
+ * @brief Spectrum Wifi Phy Bands Calculations Test
  *
  * This test verifies SpectrumWifiPhy::GetBand produces the expected results, for both contiguous
  * (160 MHz) and non-contiguous (80+80MHz) operating channel
@@ -803,10 +803,10 @@
 
     /**
      * Run one function
-     * \param channelNumberPerSegment the channel number for each segment of the operating channel
-     * \param bandWidth the width of the band to test
-     * \param bandIndex the index of the band to test
-     * \param expectedIndices the expected start and stop indices returned by
+     * @param channelNumberPerSegment the channel number for each segment of the operating channel
+     * @param bandWidth the width of the band to test
+     * @param bandIndex the index of the band to test
+     * @param expectedIndices the expected start and stop indices returned by
      * SpectrumWifiPhy::GetBand \param expectedFrequencies the expected start and stop frequencies
      * returned by SpectrumWifiPhy::GetBand
      */
@@ -870,8 +870,8 @@
     for (auto channelNumber : channelNumberPerSegment)
     {
         const auto& channelInfo = WifiPhyOperatingChannel::FindFirst(channelNumber,
-                                                                     0,
-                                                                     0,
+                                                                     MHz_u{0},
+                                                                     MHz_u{0},
                                                                      WIFI_STANDARD_80211ax,
                                                                      WIFI_PHY_BAND_5GHZ);
         channelSegments.emplace_back(channelInfo->number, channelInfo->width, channelInfo->band, 0);
@@ -904,28 +904,28 @@
 SpectrumWifiPhyGetBandTest::DoRun()
 {
     const uint32_t indicesPer20MhzBand = 256; // based on 802.11ax carrier spacing
-    const MHz_u channelWidth = 160;           // we consider the largest channel width
+    const MHz_u channelWidth{160};            // we consider the largest channel width
     const uint8_t channelNumberContiguous160Mhz =
         50; // channel number of the first 160 MHz band in 5 GHz band
     const std::vector<uint8_t> channelNumberPerSegment = {42,
                                                           106}; // channel numbers used for 80+80MHz
     // separation between segment at channel number 42 and segment at channel number 106
-    const MHz_u separationWidth = 240;
+    const MHz_u separationWidth{240};
     for (bool contiguous160Mhz : {true /* 160 MHz */, false /* 80+80MHz */})
     {
-        MHz_u guardWidth = contiguous160Mhz ? channelWidth : (channelWidth / 2);
-        uint32_t guardStopIndice = (indicesPer20MhzBand * (guardWidth / 20)) - 1;
+        const auto guardWidth = contiguous160Mhz ? channelWidth : (channelWidth / 2);
+        uint32_t guardStopIndice = (indicesPer20MhzBand * Count20MHzSubchannels(guardWidth)) - 1;
         std::vector<WifiSpectrumBandIndices> previousExpectedIndices{};
         std::vector<WifiSpectrumBandFrequencies> previousExpectedFrequencies{};
-        for (auto bandWidth : {20, 40, 80, 160})
+        for (auto bandWidth : {MHz_u{20}, MHz_u{40}, MHz_u{80}, MHz_u{160}})
         {
             const uint32_t expectedStartIndice = guardStopIndice + 1;
             const uint32_t expectedStopIndice =
-                expectedStartIndice + (indicesPer20MhzBand * (bandWidth / 20)) - 1;
+                expectedStartIndice + (indicesPer20MhzBand * Count20MHzSubchannels(bandWidth)) - 1;
             std::vector<WifiSpectrumBandIndices> expectedIndices{
                 {expectedStartIndice, expectedStopIndice}};
-            const Hz_u expectedStartFrequency = 5170 * 1e6;
-            const Hz_u expectedStopFrequency = (5170 + bandWidth) * 1e6;
+            const Hz_u expectedStartFrequency = MHzToHz(5170);
+            const Hz_u expectedStopFrequency = MHzToHz(5170 + bandWidth);
             std::vector<WifiSpectrumBandFrequencies> expectedFrequencies{
                 {expectedStartFrequency, expectedStopFrequency}};
             const std::size_t numBands = (channelWidth / bandWidth);
@@ -945,10 +945,12 @@
                 }
                 else if ((i == (numBands / 2)) && !contiguous160Mhz)
                 {
-                    expectedIndices.at(0).first += (indicesPer20MhzBand * (separationWidth / 20));
-                    expectedIndices.at(0).second += (indicesPer20MhzBand * (separationWidth / 20));
-                    expectedFrequencies.at(0).first += (separationWidth * 1e6);
-                    expectedFrequencies.at(0).second += (separationWidth * 1e6);
+                    expectedIndices.at(0).first +=
+                        (indicesPer20MhzBand * Count20MHzSubchannels(separationWidth));
+                    expectedIndices.at(0).second +=
+                        (indicesPer20MhzBand * Count20MHzSubchannels(separationWidth));
+                    expectedFrequencies.at(0).first += MHzToHz(separationWidth);
+                    expectedFrequencies.at(0).second += MHzToHz(separationWidth);
                 }
                 RunOne(contiguous160Mhz ? std::vector<uint8_t>{channelNumberContiguous160Mhz}
                                         : channelNumberPerSegment,
@@ -963,9 +965,10 @@
                 }
                 expectedIndices.at(0).first = expectedIndices.at(0).second + 1;
                 expectedIndices.at(0).second =
-                    expectedIndices.at(0).first + (indicesPer20MhzBand * (bandWidth / 20)) - 1;
-                expectedFrequencies.at(0).first += (bandWidth * 1e6);
-                expectedFrequencies.at(0).second += (bandWidth * 1e6);
+                    expectedIndices.at(0).first +
+                    (indicesPer20MhzBand * Count20MHzSubchannels(bandWidth)) - 1;
+                expectedFrequencies.at(0).first += MHzToHz(bandWidth);
+                expectedFrequencies.at(0).second += MHzToHz(bandWidth);
             }
         }
     }
@@ -974,10 +977,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test tracked bands in interference helper upon channel switching
+ * @brief Test tracked bands in interference helper upon channel switching
  *
  * The test is verifying that the correct bands are tracked by the interference helper upon channel
  * switching. It focuses on 80 and 160 MHz bands while considering 160 MHz operating channels, for
@@ -996,7 +999,7 @@
     /**
      * Switch channel function
      *
-     * \param channelNumberPerSegment the channel number for each segment of the operating channel
+     * @param channelNumberPerSegment the channel number for each segment of the operating channel
      * to switch to
      */
     void SwitchChannel(const std::vector<uint8_t>& channelNumberPerSegment);
@@ -1004,9 +1007,9 @@
     /**
      * Verify the bands tracked by the interference helper
      *
-     * \param expectedTrackedBands the bands that are expected to be tracked by the interference
+     * @param expectedTrackedBands the bands that are expected to be tracked by the interference
      * helper
-     * \param expectedUntrackedBands the bands that are expected to be untracked by the
+     * @param expectedUntrackedBands the bands that are expected to be untracked by the
      * interference helper
      */
     void VerifyTrackedBands(
@@ -1015,7 +1018,7 @@
 
     /**
      * Run one function
-     * \param channelNumberPerSegmentBeforeSwitching the channel number for each segment of the
+     * @param channelNumberPerSegmentBeforeSwitching the channel number for each segment of the
      * operating channel to switch from \param channelNumberPerSegmentAfterSwitching the channel
      * number for each segment of the operating channel to switch to \param expectedTrackedBands the
      * bands that are expected to be tracked by the interference helper \param expectedUntrackedBand
@@ -1076,8 +1079,8 @@
     for (auto channelNumber : channelNumberPerSegment)
     {
         const auto& channelInfo = WifiPhyOperatingChannel::FindFirst(channelNumber,
-                                                                     0,
-                                                                     0,
+                                                                     MHz_u{0},
+                                                                     MHz_u{0},
                                                                      WIFI_STANDARD_80211ax,
                                                                      WIFI_PHY_BAND_5GHZ);
         channelSegments.emplace_back(channelInfo->number, channelInfo->width, channelInfo->band, 0);
@@ -1154,64 +1157,72 @@
     // switch from 160 MHz to 80+80 MHz
     RunOne({50},
            {42, 106},
-           {{{5170 * 1e6, 5250 * 1e6}} /* first 80 MHz segment */,
-            {{5490 * 1e6, 5570 * 1e6}} /* second 80 MHz segment */,
-            {{5170 * 1e6, 5250 * 1e6},
-             {5490 * 1e6, 5570 * 1e6}} /* non-contiguous 160 MHz band made of the two segments */},
-           {{{5170 * 1e6, 5330 * 1e6}} /* full 160 MHz band should have been removed */});
+           {{{MHzToHz(5170), MHzToHz(5250)}} /* first 80 MHz segment */,
+            {{MHzToHz(5490), MHzToHz(5570)}} /* second 80 MHz segment */,
+            {{MHzToHz(5170), MHzToHz(5250)},
+             {MHzToHz(5490),
+              MHzToHz(5570)}} /* non-contiguous 160 MHz band made of the two segments */},
+           {{{MHzToHz(5170), MHzToHz(5330)}} /* full 160 MHz band should have been removed */});
 
     // switch from 80+80 MHz to 160 MHz
-    RunOne({42, 106},
-           {50},
-           {{{5170 * 1e6, 5330 * 1e6}} /* full 160 MHz band */,
-            {{5170 * 1e6, 5250 * 1e6}} /* first 80 MHz segment is part of the 160 MHz channel*/},
-           {{{5490 * 1e6, 5570 * 1e6}} /* second 80 MHz segment should have been removed */,
-            {{5170 * 1e6, 5250 * 1e6},
-             {5490 * 1e6, 5570 * 1e6}} /* non-contiguous 160 MHz band should have been removed */});
+    RunOne(
+        {42, 106},
+        {50},
+        {{{MHzToHz(5170), MHzToHz(5330)}} /* full 160 MHz band */,
+         {{MHzToHz(5170), MHzToHz(5250)}} /* first 80 MHz segment is part of the 160 MHz channel*/},
+        {{{MHzToHz(5490), MHzToHz(5570)}} /* second 80 MHz segment should have been removed */,
+         {{MHzToHz(5170), MHzToHz(5250)},
+          {MHzToHz(5490),
+           MHzToHz(5570)}} /* non-contiguous 160 MHz band should have been removed */});
 
     // switch from 80+80 MHz to 80+80 MHz with segment swap
     RunOne({42, 106},
            {106, 42},
-           {{{5490 * 1e6, 5570 * 1e6}} /* first 80 MHz segment */,
-            {{5490 * 1e6, 5570 * 1e6}} /* second 80 MHz segment */,
-            {{5170 * 1e6, 5250 * 1e6},
-             {5490 * 1e6, 5570 * 1e6}} /* non-contiguous 160 MHz band made of the two segments */},
+           {{{MHzToHz(5490), MHzToHz(5570)}} /* first 80 MHz segment */,
+            {{MHzToHz(5490), MHzToHz(5570)}} /* second 80 MHz segment */,
+            {{MHzToHz(5170), MHzToHz(5250)},
+             {MHzToHz(5490),
+              MHzToHz(5570)}} /* non-contiguous 160 MHz band made of the two segments */},
            {});
 
     // switch from 80+80 MHz to another 80+80 MHz with one common segment
     RunOne({42, 106},
            {106, 138},
-           {{{5490 * 1e6, 5570 * 1e6}} /* first 80 MHz segment */,
-            {{5650 * 1e6, 5730 * 1e6}} /* second 80 MHz segment */,
-            {{5490 * 1e6, 5570 * 1e6},
-             {5650 * 1e6, 5730 * 1e6}} /* non-contiguous 160 MHz band made of the two segments */},
-           {{{5170 * 1e6, 5250 * 1e6}} /* 80 MHz segment at channel 42 should have been removed */,
-            {{5170 * 1e6, 5250 * 1e6},
-             {5490 * 1e6,
-              5570 * 1e6}} /* previous non-contiguous 160 MHz band should have been removed */});
+           {{{MHzToHz(5490), MHzToHz(5570)}} /* first 80 MHz segment */,
+            {{MHzToHz(5650), MHzToHz(5730)}} /* second 80 MHz segment */,
+            {{MHzToHz(5490), MHzToHz(5570)},
+             {MHzToHz(5650),
+              MHzToHz(5730)}} /* non-contiguous 160 MHz band made of the two segments */},
+           {{{MHzToHz(5170),
+              MHzToHz(5250)}} /* 80 MHz segment at channel 42 should have been removed */,
+            {{MHzToHz(5170), MHzToHz(5250)},
+             {MHzToHz(5490),
+              MHzToHz(5570)}} /* previous non-contiguous 160 MHz band should have been removed */});
 
     // switch from 80+80 MHz to another 80+80 MHz with no common segment
-    RunOne(
-        {42, 106},
-        {122, 155},
-        {{{5570 * 1e6, 5650 * 1e6}} /* first 80 MHz segment */,
-         {{5735 * 1e6, 5815 * 1e6}} /* second 80 MHz segment */,
-         {{5570 * 1e6, 5650 * 1e6},
-          {5735 * 1e6, 5815 * 1e6}} /* non-contiguous 160 MHz band made of the two segments */},
-        {{{5170 * 1e6, 5250 * 1e6}} /* previous first 80 MHz segment should have been removed */,
-         {{5490 * 1e6, 5570 * 1e6}} /* previous second 80 MHz segment should have been removed */,
-         {{5170 * 1e6, 5250 * 1e6},
-          {5490 * 1e6,
-           5570 * 1e6}} /* previous non-contiguous 160 MHz band should have been removed */});
+    RunOne({42, 106},
+           {122, 155},
+           {{{MHzToHz(5570), MHzToHz(5650)}} /* first 80 MHz segment */,
+            {{MHzToHz(5735), MHzToHz(5815)}} /* second 80 MHz segment */,
+            {{MHzToHz(5570), MHzToHz(5650)},
+             {MHzToHz(5735),
+              MHzToHz(5815)}} /* non-contiguous 160 MHz band made of the two segments */},
+           {{{MHzToHz(5170),
+              MHzToHz(5250)}} /* previous first 80 MHz segment should have been removed */,
+            {{MHzToHz(5490),
+              MHzToHz(5570)}} /* previous second 80 MHz segment should have been removed */,
+            {{MHzToHz(5170), MHzToHz(5250)},
+             {MHzToHz(5490),
+              MHzToHz(5570)}} /* previous non-contiguous 160 MHz band should have been removed */});
 
     Simulator::Destroy();
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test 80+80MHz transmission
+ * @brief Test 80+80MHz transmission
  *
  * The test verifies that two non-contiguous segments are handled by the spectrum PHY
  * to transmit 160 MHz PPDUs when the operating channel is configured as 80+80MHz.
@@ -1238,11 +1249,11 @@
 
     /**
      * Run one function
-     * \param channelNumbers the channel number for each segment of the operating channel
-     * \param interferenceCenterFrequency the center frequency of the interference signal to
+     * @param channelNumbers the channel number for each segment of the operating channel
+     * @param interferenceCenterFrequency the center frequency of the interference signal to
      * generate
-     * \param interferenceBandWidth the band width of the interference signal to generate
-     * \param expectSuccess flag to indicate whether reception is expected to be successful
+     * @param interferenceBandWidth the band width of the interference signal to generate
+     * @param expectSuccess flag to indicate whether reception is expected to be successful
      */
     void RunOne(const std::vector<uint8_t>& channelNumbers,
                 MHz_u interferenceCenterFrequency,
@@ -1252,7 +1263,7 @@
     /**
      * Switch channel function
      *
-     * \param channelNumbers the channel number for each segment of the operating channel
+     * @param channelNumbers the channel number for each segment of the operating channel
      * to switch to
      */
     void SwitchChannel(const std::vector<uint8_t>& channelNumbers);
@@ -1264,8 +1275,8 @@
 
     /**
      * Generate interference function
-     * \param interferencePsd the PSD of the interference to be generated
-     * \param duration the duration of the interference
+     * @param interferencePsd the PSD of the interference to be generated
+     * @param duration the duration of the interference
      */
     void GenerateInterference(Ptr<SpectrumValue> interferencePsd, Time duration);
 
@@ -1276,26 +1287,26 @@
 
     /**
      * Receive success function for STA
-     * \param psdu the PSDU
-     * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
-     * \param txVector the transmit vector
-     * \param statusPerMpdu reception status per MPDU
+     * @param psdu the PSDU
+     * @param rxSignalInfo the info on the received signal (\see RxSignalInfo)
+     * @param txVector the transmit vector
+     * @param statusPerMpdu reception status per MPDU
      */
     void RxSuccessSta(Ptr<const WifiPsdu> psdu,
                       RxSignalInfo rxSignalInfo,
-                      WifiTxVector txVector,
-                      std::vector<bool> statusPerMpdu);
+                      const WifiTxVector& txVector,
+                      const std::vector<bool>& statusPerMpdu);
 
     /**
      * Receive failure function for STA
-     * \param psdu the PSDU
+     * @param psdu the PSDU
      */
     void RxFailureSta(Ptr<const WifiPsdu> psdu);
 
     /**
      * Verify results
      *
-     * \param expectSuccess flag to indicate whether reception is expected to be successful
+     * @param expectSuccess flag to indicate whether reception is expected to be successful
      */
     void CheckResults(bool expectSuccess);
 
@@ -1322,8 +1333,8 @@
     for (auto channelNumber : channelNumbers)
     {
         const auto& channelInfo = WifiPhyOperatingChannel::FindFirst(channelNumber,
-                                                                     0,
-                                                                     0,
+                                                                     MHz_u{0},
+                                                                     MHz_u{0},
                                                                      WIFI_STANDARD_80211ax,
                                                                      WIFI_PHY_BAND_5GHZ);
         channelSegments.emplace_back(channelInfo->number, channelInfo->width, channelInfo->band, 0);
@@ -1344,7 +1355,7 @@
                           1,
                           1,
                           0,
-                          160,
+                          MHz_u{160},
                           false,
                           false,
                           false};
@@ -1375,8 +1386,8 @@
 void
 SpectrumWifiPhy80Plus80Test::RxSuccessSta(Ptr<const WifiPsdu> psdu,
                                           RxSignalInfo rxSignalInfo,
-                                          WifiTxVector txVector,
-                                          std::vector<bool> /*statusPerMpdu*/)
+                                          const WifiTxVector& txVector,
+                                          const std::vector<bool>& /*statusPerMpdu*/)
 {
     NS_LOG_FUNCTION(this << *psdu << rxSignalInfo << txVector);
     m_countRxSuccessSta++;
@@ -1482,9 +1493,9 @@
                         channelNumbers);
 
     // create info about interference to generate
-    BandInfo bandInfo{.fl = (interferenceCenterFrequency - (interferenceBandWidth / 2)) * 1e6,
-                      .fc = interferenceCenterFrequency * 1e6,
-                      .fh = (interferenceCenterFrequency + (interferenceBandWidth / 2)) * 1e6};
+    BandInfo bandInfo{.fl = MHzToHz(interferenceCenterFrequency - (interferenceBandWidth / 2)),
+                      .fc = MHzToHz(interferenceCenterFrequency),
+                      .fh = MHzToHz(interferenceCenterFrequency + (interferenceBandWidth / 2))};
     auto spectrumInterference = Create<SpectrumModel>(Bands{bandInfo});
     auto interferencePsd = Create<SpectrumValue>(spectrumInterference);
     Watt_u interferencePower{0.1};
@@ -1523,7 +1534,7 @@
     //                   │          5250 MHz, 160 MHz           │
     //                   └──────────────────────────────────────┘
     //
-    RunOne({50}, 5290, 80, false);
+    RunOne({50}, MHz_u{5290}, MHz_u{80}, false);
 
     // Test transmission over non-contiguous 160 MHz (i.e. 80+80MHz) and same interference as in
     // previous run. The reception should succeed because the interference is located between the
@@ -1538,7 +1549,7 @@
     //                   │80+80MHz segment 0│                             │80+80MHz segment 1│
     //                   └──────────────────┘                             └──────────────────┘
     //
-    RunOne({42, 106}, 5290, 80, true);
+    RunOne({42, 106}, MHz_u{5290}, MHz_u{80}, true);
 
     // Test transmission over non-contiguous 160 MHz (i.e. 80+80MHz) and interference generated on
     // the first segment of the channel width (channel 42, i.e. center frequency 5210 and bandwidth
@@ -1554,7 +1565,7 @@
     //                   │80+80MHz segment 0│                             │80+80MHz segment 1│
     //                   └──────────────────┘                             └──────────────────┘
     //
-    RunOne({42, 106}, 5210, 80, false);
+    RunOne({42, 106}, MHz_u{5210}, MHz_u{80}, false);
 
     // Test transmission over non-contiguous 160 MHz (i.e. 80+80MHz) and interference generated on
     // the second segment of the channel width (channel 42, i.e. center frequency 5210 and bandwidth
@@ -1570,16 +1581,16 @@
     //                   │80+80MHz segment 0│                             │80+80MHz segment 1│
     //                   └──────────────────┘                             └──────────────────┘
     //
-    RunOne({42, 106}, 5530, 80, false);
+    RunOne({42, 106}, MHz_u{5530}, MHz_u{80}, false);
 
     Simulator::Destroy();
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Spectrum Wifi Phy Multiple Spectrum Test
+ * @brief Spectrum Wifi Phy Multiple Spectrum Test
  *
  * This test is testing the ability to plug multiple spectrum channels to the spectrum wifi PHY.
  * It considers 4 TX-RX PHY pairs that are independent from each others and are plugged to different
@@ -1610,9 +1621,9 @@
     /**
      * Constructor
      *
-     * \param trackSignalsInactiveInterfaces flag to indicate whether signals coming from inactive
+     * @param trackSignalsInactiveInterfaces flag to indicate whether signals coming from inactive
      * spectrum PHY interfaces shall be tracked during the test
-     * \param chanSwitchScenario the channel switching scenario to consider for the test
+     * @param chanSwitchScenario the channel switching scenario to consider for the test
      */
     SpectrumWifiPhyMultipleInterfacesTest(bool trackSignalsInactiveInterfaces,
                                           ChannelSwitchScenario chanSwitchScenario);
@@ -1625,11 +1636,11 @@
     /**
      * Switch channel function
      *
-     * \param phy the PHY to switch
-     * \param band the PHY band to use
-     * \param channelNumber number the channel number to use
-     * \param channelWidth the channel width to use
-     * \param listenerIndex index of the listener for that PHY, if PHY is a RX PHY
+     * @param phy the PHY to switch
+     * @param band the PHY band to use
+     * @param channelNumber number the channel number to use
+     * @param channelWidth the channel width to use
+     * @param listenerIndex index of the listener for that PHY, if PHY is a RX PHY
      */
     void SwitchChannel(Ptr<SpectrumWifiPhy> phy,
                        WifiPhyBand band,
@@ -1640,17 +1651,17 @@
     /**
      * Send PPDU function
      *
-     * \param phy the PHY to transmit the signal
-     * \param txPower the power to transmit the signal (this is also the received power since we do
+     * @param phy the PHY to transmit the signal
+     * @param txPower the power to transmit the signal (this is also the received power since we do
      * not have propagation loss to simplify) \param payloadSize the payload size in bytes
      */
     void SendPpdu(Ptr<SpectrumWifiPhy> phy, dBm_u txPower, uint32_t payloadSize);
 
     /**
      * Callback triggered when a packet is received by a PHY
-     * \param index the index to identify the RX PHY
-     * \param packet the received packet
-     * \param rxPowersW the received power per channel band in watts
+     * @param index the index to identify the RX PHY
+     * @param packet the received packet
+     * @param rxPowersW the received power per channel band in watts
      */
     void RxCallback(std::size_t index,
                     Ptr<const Packet> packet,
@@ -1658,31 +1669,31 @@
 
     /**
      * Receive success function
-     * \param index index of the RX STA
-     * \param psdu the PSDU
-     * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
-     * \param txVector the transmit vector
-     * \param statusPerMpdu reception status per MPDU
+     * @param index index of the RX STA
+     * @param psdu the PSDU
+     * @param rxSignalInfo the info on the received signal (\see RxSignalInfo)
+     * @param txVector the transmit vector
+     * @param statusPerMpdu reception status per MPDU
      */
     void RxSuccess(std::size_t index,
                    Ptr<const WifiPsdu> psdu,
                    RxSignalInfo rxSignalInfo,
-                   WifiTxVector txVector,
-                   std::vector<bool> statusPerMpdu);
+                   const WifiTxVector& txVector,
+                   const std::vector<bool>& statusPerMpdu);
 
     /**
      * Receive failure function
-     * \param index index of the RX STA
-     * \param psdu the PSDU
+     * @param index index of the RX STA
+     * @param psdu the PSDU
      */
     void RxFailure(std::size_t index, Ptr<const WifiPsdu> psdu);
 
     /**
      * Schedule now to check the interferences
-     * \param phy the PHY for which the check has to be executed
-     * \param freqRange the frequency range for which the check has to be executed
-     * \param band the band for which the check has to be executed
-     * \param interferencesExpected flag whether interferences are expected to have been tracked
+     * @param phy the PHY for which the check has to be executed
+     * @param freqRange the frequency range for which the check has to be executed
+     * @param band the band for which the check has to be executed
+     * @param interferencesExpected flag whether interferences are expected to have been tracked
      */
     void CheckInterferences(Ptr<SpectrumWifiPhy> phy,
                             const FrequencyRange& freqRange,
@@ -1691,9 +1702,9 @@
 
     /**
      * Check the interferences
-     * \param phy the PHY for which the check has to be executed
-     * \param band the band for which the check has to be executed
-     * \param interferencesExpected flag whether interferences are expected to have been tracked
+     * @param phy the PHY for which the check has to be executed
+     * @param band the band for which the check has to be executed
+     * @param interferencesExpected flag whether interferences are expected to have been tracked
      */
     void DoCheckInterferences(Ptr<SpectrumWifiPhy> phy,
                               const WifiSpectrumBandInfo& band,
@@ -1702,13 +1713,13 @@
     /**
      * Verify results
      *
-     * \param index the index to identify the RX PHY to check
-     * \param expectedNumRx the expected number of RX events for that PHY
-     * \param expectedNumRxSuccess the expected amount of successfully received packets
-     * \param expectedRxBytes the expected amount of received bytes
-     * \param expectedFrequencyRangeActiveRfInterface the expected frequency range (in MHz) of the
+     * @param index the index to identify the RX PHY to check
+     * @param expectedNumRx the expected number of RX events for that PHY
+     * @param expectedNumRxSuccess the expected amount of successfully received packets
+     * @param expectedRxBytes the expected amount of received bytes
+     * @param expectedFrequencyRangeActiveRfInterface the expected frequency range (in MHz) of the
      * active RF interface
-     * \param expectedConnectedPhysPerChannel the expected number of PHYs attached for each spectrum
+     * @param expectedConnectedPhysPerChannel the expected number of PHYs attached for each spectrum
      * channel
      */
     void CheckResults(std::size_t index,
@@ -1721,11 +1732,11 @@
     /**
      * Verify CCA indication reported by a given PHY
      *
-     * \param index the index to identify the RX PHY to check
-     * \param expectedCcaBusyIndication flag to indicate whether a CCA BUSY notification is expected
-     * \param switchingDelay delay between the TX has started and the time RX switched to the TX
+     * @param index the index to identify the RX PHY to check
+     * @param expectedCcaBusyIndication flag to indicate whether a CCA BUSY notification is expected
+     * @param switchingDelay delay between the TX has started and the time RX switched to the TX
      * channel
-     * \param propagationDelay the propagation delay
+     * @param propagationDelay the propagation delay
      */
     void CheckCcaIndication(std::size_t index,
                             bool expectedCcaBusyIndication,
@@ -1735,8 +1746,8 @@
     /**
      * Verify rxing state of the interference helper
      *
-     * \param phy the PHY to which the interference helper instance is attached
-     * \param rxingExpected flag whether the interference helper is expected to be in rxing state or
+     * @param phy the PHY to which the interference helper instance is attached
+     * @param rxingExpected flag whether the interference helper is expected to be in rxing state or
      * not
      */
     void CheckRxingState(Ptr<SpectrumWifiPhy> phy, bool rxingExpected);
@@ -1814,7 +1825,7 @@
                           1,
                           1,
                           0,
-                          20,
+                          MHz_u{20},
                           false,
                           false};
     Ptr<Packet> pkt = Create<Packet>(payloadSize);
@@ -1851,8 +1862,8 @@
 SpectrumWifiPhyMultipleInterfacesTest::RxSuccess(std::size_t index,
                                                  Ptr<const WifiPsdu> psdu,
                                                  RxSignalInfo rxSignalInfo,
-                                                 WifiTxVector txVector,
-                                                 std::vector<bool> /*statusPerMpdu*/)
+                                                 const WifiTxVector& txVector,
+                                                 const std::vector<bool>& /*statusPerMpdu*/)
 {
     NS_LOG_FUNCTION(this << index << *psdu << rxSignalInfo << txVector);
     m_countRxSuccess.at(index)++;
@@ -1895,7 +1906,7 @@
     phy->GetAttribute("InterferenceHelper", ptr);
     auto interferenceHelper = DynamicCast<InterferenceHelper>(ptr.Get<InterferenceHelper>());
     NS_ASSERT(interferenceHelper);
-    const auto energyDuration = interferenceHelper->GetEnergyDuration(0, band);
+    const auto energyDuration = interferenceHelper->GetEnergyDuration(Watt_u{0}, band);
     NS_TEST_ASSERT_MSG_EQ(energyDuration.IsStrictlyPositive(),
                           interferencesExpected,
                           "Incorrect interferences detection");
@@ -2149,7 +2160,7 @@
 {
     NS_LOG_FUNCTION(this);
 
-    const dBm_u ccaEdThreshold = -62.0; ///< CCA-ED threshold
+    const dBm_u ccaEdThreshold{-62.0}; ///< CCA-ED threshold
     const auto txAfterChannelSwitchDelay =
         MicroSeconds((m_chanSwitchScenario == ChannelSwitchScenario::BEFORE_TX)
                          ? 250
@@ -2182,7 +2193,7 @@
                             &SpectrumWifiPhyMultipleInterfacesTest::SendPpdu,
                             this,
                             txPpduPhy,
-                            0,
+                            dBm_u{0},
                             1000);
         for (std::size_t j = 0; j < 4; ++j)
         {
@@ -2220,7 +2231,7 @@
                             &SpectrumWifiPhyMultipleInterfacesTest::SendPpdu,
                             this,
                             txPpduPhy,
-                            0,
+                            dBm_u{0},
                             1000);
         const auto& expectedFreqRange = txPpduPhy->GetCurrentFrequencyRange();
         for (std::size_t j = 0; j < 4; ++j)
@@ -2276,7 +2287,7 @@
                             &SpectrumWifiPhyMultipleInterfacesTest::SendPpdu,
                             this,
                             txPpduPhy,
-                            0,
+                            dBm_u{0},
                             1000);
         for (std::size_t j = 0; j < 4; ++j)
         {
@@ -2312,24 +2323,24 @@
     }
 
     // verify CCA indication when switching to a channel with an ongoing transmission
-    for (const dBm_u txPower : {-60.0 /* above CCA-ED */, -70.0 /* below CCA-ED */})
+    for (const auto txPower : {dBm_u{-60} /* above CCA-ED */, dBm_u{-70} /* below CCA-ED */})
     {
         for (std::size_t i = 0; i < 4; ++i)
         {
             for (std::size_t j = 0; j < 4; ++j)
             {
                 auto txPpduPhy = m_txPhys.at(i);
-                const auto startChannel =
-                    WifiPhyOperatingChannel::FindFirst(txPpduPhy->GetPrimaryChannelNumber(20),
-                                                       0,
-                                                       20,
-                                                       WIFI_STANDARD_80211ax,
-                                                       txPpduPhy->GetPhyBand());
-                for (auto bw = txPpduPhy->GetChannelWidth(); bw >= 20; bw /= 2)
+                const auto startChannel = WifiPhyOperatingChannel::FindFirst(
+                    txPpduPhy->GetPrimaryChannelNumber(MHz_u{20}),
+                    MHz_u{0},
+                    MHz_u{20},
+                    WIFI_STANDARD_80211ax,
+                    txPpduPhy->GetPhyBand());
+                for (auto bw = txPpduPhy->GetChannelWidth(); bw >= MHz_u{20}; bw /= 2)
                 {
                     const auto& channelInfo =
                         (*WifiPhyOperatingChannel::FindFirst(0,
-                                                             0,
+                                                             MHz_u{0},
                                                              bw,
                                                              WIFI_STANDARD_80211ax,
                                                              txPpduPhy->GetPhyBand(),
@@ -2393,7 +2404,7 @@
                                 &SpectrumWifiPhyMultipleInterfacesTest::SendPpdu,
                                 this,
                                 txPpduPhy,
-                                20,
+                                dBm_u{20},
                                 500);
 
             // switch channel to other band
@@ -2414,7 +2425,7 @@
                                 &SpectrumWifiPhyMultipleInterfacesTest::SendPpdu,
                                 this,
                                 txPpduPhy,
-                                0,
+                                dBm_u{0},
                                 1000);
 
             // switch back to initial band during PHY header reception
@@ -2435,7 +2446,7 @@
                                 &SpectrumWifiPhyMultipleInterfacesTest::SendPpdu,
                                 this,
                                 txPpduPhy,
-                                0,
+                                dBm_u{0},
                                 1500);
 
             // check results
@@ -2481,7 +2492,7 @@
                                 &SpectrumWifiPhyMultipleInterfacesTest::SendPpdu,
                                 this,
                                 txPpduPhy,
-                                20,
+                                dBm_u{20},
                                 500);
 
             // switch channel back to previous channel before preamble detection is finished:
@@ -2514,7 +2525,7 @@
                                 &SpectrumWifiPhyMultipleInterfacesTest::SendPpdu,
                                 this,
                                 txPpduPhy,
-                                20,
+                                dBm_u{20},
                                 1000);
 
             // second transmission on 5 GHz low band  with high power a bit later:
@@ -2524,7 +2535,7 @@
                                 &SpectrumWifiPhyMultipleInterfacesTest::SendPpdu,
                                 this,
                                 txPpduPhy,
-                                20,
+                                dBm_u{20},
                                 1000);
 
             // restore channel for TX PHY index 2
@@ -2556,7 +2567,7 @@
                                 &SpectrumWifiPhyMultipleInterfacesTest::SendPpdu,
                                 this,
                                 txPpduPhy,
-                                0,
+                                dBm_u{0},
                                 1500);
 
             // check results
@@ -2583,10 +2594,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Spectrum Wifi Phy Interfaces Helper Test
+ * @brief Spectrum Wifi Phy Interfaces Helper Test
  *
  * This test checks the expected interfaces are added to the spectrum PHY instances
  * created by the helper.
@@ -2772,10 +2783,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Spectrum Wifi Phy Test Suite
+ * @brief Spectrum Wifi Phy Test Suite
  */
 class SpectrumWifiPhyTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/test/tx-duration-test.cc ns-3.44/src/wifi/test/tx-duration-test.cc
--- ns-3.43/src/wifi/test/tx-duration-test.cc	2024-10-09 16:41:10.136656800 -0700
+++ ns-3.44/src/wifi/test/tx-duration-test.cc	2025-03-09 16:55:49.807372600 -0700
@@ -27,10 +27,10 @@
 NS_LOG_COMPONENT_DEFINE("TxDurationTest");
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Tx Duration Test
+ * @brief Tx Duration Test
  */
 class TxDurationTest : public TestCase
 {
@@ -167,7 +167,7 @@
             knownDuration +=
                 MicroSeconds(6); // 2.4 GHz band should be at the end of the bands to test
         }
-        Time calculatedDuration = phy->GetPayloadDuration(size, txVector, testedBand);
+        Time calculatedDuration = YansWifiPhy::GetPayloadDuration(size, txVector, testedBand);
         if (calculatedDuration != knownDuration)
         {
             std::cerr << "size=" << size << " band=" << testedBand << " mode=" << payloadMode
@@ -219,7 +219,7 @@
             knownDuration +=
                 MicroSeconds(6); // 2.4 GHz band should be at the end of the bands to test
         }
-        Time calculatedDuration = phy->CalculateTxDuration(size, txVector, testedBand);
+        Time calculatedDuration = YansWifiPhy::CalculateTxDuration(size, txVector, testedBand);
         Time calculatedDurationUsingList =
             CalculateTxDurationUsingList(std::list<uint32_t>{size},
                                          std::list<uint16_t>{SU_STA_ID},
@@ -253,7 +253,7 @@
         channelWidth < std::accumulate(
                            std::begin(userInfos),
                            std::end(userInfos),
-                           0,
+                           MHz_u{0},
                            [](const MHz_u prevBw, const HeMuUserInfo& info) {
                                return prevBw + HeRu::GetBandwidth(info.ru.GetRuType());
                            }),
@@ -293,13 +293,13 @@
             knownDuration +=
                 MicroSeconds(6); // 2.4 GHz band should be at the end of the bands to test
         }
-        Time calculatedDuration = NanoSeconds(0);
+        Time calculatedDuration;
         uint32_t longestSize = 0;
         auto iterStaId = staIds.begin();
         for (auto& size : sizes)
         {
             Time ppduDurationForSta =
-                phy->CalculateTxDuration(size, txVector, testedBand, *iterStaId);
+                YansWifiPhy::CalculateTxDuration(size, txVector, testedBand, *iterStaId);
             if (ppduDurationForSta > calculatedDuration)
             {
                 calculatedDuration = ppduDurationForSta;
@@ -357,25 +357,25 @@
     retval = retval &&
              CheckPayloadDuration(1023,
                                   DsssPhy::GetDsssRate11Mbps(),
-                                  22,
+                                  MHz_u{22},
                                   NanoSeconds(800),
                                   WIFI_PREAMBLE_LONG,
                                   MicroSeconds(744)) &&
              CheckPayloadDuration(1024,
                                   DsssPhy::GetDsssRate11Mbps(),
-                                  22,
+                                  MHz_u{22},
                                   NanoSeconds(800),
                                   WIFI_PREAMBLE_LONG,
                                   MicroSeconds(745)) &&
              CheckPayloadDuration(1025,
                                   DsssPhy::GetDsssRate11Mbps(),
-                                  22,
+                                  MHz_u{22},
                                   NanoSeconds(800),
                                   WIFI_PREAMBLE_LONG,
                                   MicroSeconds(746)) &&
              CheckPayloadDuration(1026,
                                   DsssPhy::GetDsssRate11Mbps(),
-                                  22,
+                                  MHz_u{22},
                                   NanoSeconds(800),
                                   WIFI_PREAMBLE_LONG,
                                   MicroSeconds(747));
@@ -389,193 +389,193 @@
     retval = retval &&
              CheckTxDuration(1023,
                              DsssPhy::GetDsssRate11Mbps(),
-                             22,
+                             MHz_u{22},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_SHORT,
                              MicroSeconds(744 + 96)) &&
              CheckTxDuration(1024,
                              DsssPhy::GetDsssRate11Mbps(),
-                             22,
+                             MHz_u{22},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_SHORT,
                              MicroSeconds(745 + 96)) &&
              CheckTxDuration(1025,
                              DsssPhy::GetDsssRate11Mbps(),
-                             22,
+                             MHz_u{22},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_SHORT,
                              MicroSeconds(746 + 96)) &&
              CheckTxDuration(1026,
                              DsssPhy::GetDsssRate11Mbps(),
-                             22,
+                             MHz_u{22},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_SHORT,
                              MicroSeconds(747 + 96)) &&
              CheckTxDuration(1023,
                              DsssPhy::GetDsssRate11Mbps(),
-                             22,
+                             MHz_u{22},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_LONG,
                              MicroSeconds(744 + 192)) &&
              CheckTxDuration(1024,
                              DsssPhy::GetDsssRate11Mbps(),
-                             22,
+                             MHz_u{22},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_LONG,
                              MicroSeconds(745 + 192)) &&
              CheckTxDuration(1025,
                              DsssPhy::GetDsssRate11Mbps(),
-                             22,
+                             MHz_u{22},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_LONG,
                              MicroSeconds(746 + 192)) &&
              CheckTxDuration(1026,
                              DsssPhy::GetDsssRate11Mbps(),
-                             22,
+                             MHz_u{22},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_LONG,
                              MicroSeconds(747 + 192)) &&
              CheckTxDuration(1023,
                              DsssPhy::GetDsssRate5_5Mbps(),
-                             22,
+                             MHz_u{22},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_SHORT,
                              MicroSeconds(1488 + 96)) &&
              CheckTxDuration(1024,
                              DsssPhy::GetDsssRate5_5Mbps(),
-                             22,
+                             MHz_u{22},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_SHORT,
                              MicroSeconds(1490 + 96)) &&
              CheckTxDuration(1025,
                              DsssPhy::GetDsssRate5_5Mbps(),
-                             22,
+                             MHz_u{22},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_SHORT,
                              MicroSeconds(1491 + 96)) &&
              CheckTxDuration(1026,
                              DsssPhy::GetDsssRate5_5Mbps(),
-                             22,
+                             MHz_u{22},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_SHORT,
                              MicroSeconds(1493 + 96)) &&
              CheckTxDuration(1023,
                              DsssPhy::GetDsssRate5_5Mbps(),
-                             22,
+                             MHz_u{22},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_LONG,
                              MicroSeconds(1488 + 192)) &&
              CheckTxDuration(1024,
                              DsssPhy::GetDsssRate5_5Mbps(),
-                             22,
+                             MHz_u{22},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_LONG,
                              MicroSeconds(1490 + 192)) &&
              CheckTxDuration(1025,
                              DsssPhy::GetDsssRate5_5Mbps(),
-                             22,
+                             MHz_u{22},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_LONG,
                              MicroSeconds(1491 + 192)) &&
              CheckTxDuration(1026,
                              DsssPhy::GetDsssRate5_5Mbps(),
-                             22,
+                             MHz_u{22},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_LONG,
                              MicroSeconds(1493 + 192)) &&
              CheckTxDuration(1023,
                              DsssPhy::GetDsssRate2Mbps(),
-                             22,
+                             MHz_u{22},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_SHORT,
                              MicroSeconds(4092 + 96)) &&
              CheckTxDuration(1024,
                              DsssPhy::GetDsssRate2Mbps(),
-                             22,
+                             MHz_u{22},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_SHORT,
                              MicroSeconds(4096 + 96)) &&
              CheckTxDuration(1025,
                              DsssPhy::GetDsssRate2Mbps(),
-                             22,
+                             MHz_u{22},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_SHORT,
                              MicroSeconds(4100 + 96)) &&
              CheckTxDuration(1026,
                              DsssPhy::GetDsssRate2Mbps(),
-                             22,
+                             MHz_u{22},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_SHORT,
                              MicroSeconds(4104 + 96)) &&
              CheckTxDuration(1023,
                              DsssPhy::GetDsssRate2Mbps(),
-                             22,
+                             MHz_u{22},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_LONG,
                              MicroSeconds(4092 + 192)) &&
              CheckTxDuration(1024,
                              DsssPhy::GetDsssRate2Mbps(),
-                             22,
+                             MHz_u{22},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_LONG,
                              MicroSeconds(4096 + 192)) &&
              CheckTxDuration(1025,
                              DsssPhy::GetDsssRate2Mbps(),
-                             22,
+                             MHz_u{22},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_LONG,
                              MicroSeconds(4100 + 192)) &&
              CheckTxDuration(1026,
                              DsssPhy::GetDsssRate2Mbps(),
-                             22,
+                             MHz_u{22},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_LONG,
                              MicroSeconds(4104 + 192)) &&
              CheckTxDuration(1023,
                              DsssPhy::GetDsssRate1Mbps(),
-                             22,
+                             MHz_u{22},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_SHORT,
                              MicroSeconds(8184 + 192)) &&
              CheckTxDuration(1024,
                              DsssPhy::GetDsssRate1Mbps(),
-                             22,
+                             MHz_u{22},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_SHORT,
                              MicroSeconds(8192 + 192)) &&
              CheckTxDuration(1025,
                              DsssPhy::GetDsssRate1Mbps(),
-                             22,
+                             MHz_u{22},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_SHORT,
                              MicroSeconds(8200 + 192)) &&
              CheckTxDuration(1026,
                              DsssPhy::GetDsssRate1Mbps(),
-                             22,
+                             MHz_u{22},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_SHORT,
                              MicroSeconds(8208 + 192)) &&
              CheckTxDuration(1023,
                              DsssPhy::GetDsssRate1Mbps(),
-                             22,
+                             MHz_u{22},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_LONG,
                              MicroSeconds(8184 + 192)) &&
              CheckTxDuration(1024,
                              DsssPhy::GetDsssRate1Mbps(),
-                             22,
+                             MHz_u{22},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_LONG,
                              MicroSeconds(8192 + 192)) &&
              CheckTxDuration(1025,
                              DsssPhy::GetDsssRate1Mbps(),
-                             22,
+                             MHz_u{22},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_LONG,
                              MicroSeconds(8200 + 192)) &&
              CheckTxDuration(1026,
                              DsssPhy::GetDsssRate1Mbps(),
-                             22,
+                             MHz_u{22},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_LONG,
                              MicroSeconds(8208 + 192));
@@ -584,7 +584,7 @@
     // https://web.archive.org/web/20100711002639/http://mailman.isi.edu/pipermail/ns-developers/2009-July/006226.html
     retval = retval && CheckTxDuration(14,
                                        DsssPhy::GetDsssRate1Mbps(),
-                                       22,
+                                       MHz_u{22},
                                        NanoSeconds(800),
                                        WIFI_PREAMBLE_LONG,
                                        MicroSeconds(304));
@@ -593,19 +593,19 @@
     retval = retval &&
              CheckTxDuration(1536,
                              DsssPhy::GetDsssRate11Mbps(),
-                             22,
+                             MHz_u{22},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_LONG,
                              MicroSeconds(1310)) &&
              CheckTxDuration(76,
                              DsssPhy::GetDsssRate11Mbps(),
-                             22,
+                             MHz_u{22},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_LONG,
                              MicroSeconds(248)) &&
              CheckTxDuration(14,
                              DsssPhy::GetDsssRate11Mbps(),
-                             22,
+                             MHz_u{22},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_LONG,
                              MicroSeconds(203));
@@ -617,19 +617,19 @@
     retval = retval &&
              CheckTxDuration(1536,
                              OfdmPhy::GetOfdmRate54Mbps(),
-                             20,
+                             MHz_u{20},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_LONG,
                              MicroSeconds(248)) &&
              CheckTxDuration(76,
                              OfdmPhy::GetOfdmRate54Mbps(),
-                             20,
+                             MHz_u{20},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_LONG,
                              MicroSeconds(32)) &&
              CheckTxDuration(14,
                              OfdmPhy::GetOfdmRate54Mbps(),
-                             20,
+                             MHz_u{20},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_LONG,
                              MicroSeconds(24));
@@ -640,19 +640,19 @@
     retval = retval &&
              CheckTxDuration(1536,
                              ErpOfdmPhy::GetErpOfdmRate54Mbps(),
-                             20,
+                             MHz_u{20},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_LONG,
                              MicroSeconds(254)) &&
              CheckTxDuration(76,
                              ErpOfdmPhy::GetErpOfdmRate54Mbps(),
-                             20,
+                             MHz_u{20},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_LONG,
                              MicroSeconds(38)) &&
              CheckTxDuration(14,
                              ErpOfdmPhy::GetErpOfdmRate54Mbps(),
-                             20,
+                             MHz_u{20},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_LONG,
                              MicroSeconds(30));
@@ -663,91 +663,91 @@
     retval = retval &&
              CheckTxDuration(1536,
                              HtPhy::GetHtMcs7(),
-                             20,
+                             MHz_u{20},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_HT_MF,
                              MicroSeconds(228)) &&
              CheckTxDuration(76,
                              HtPhy::GetHtMcs7(),
-                             20,
+                             MHz_u{20},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_HT_MF,
                              MicroSeconds(48)) &&
              CheckTxDuration(14,
                              HtPhy::GetHtMcs7(),
-                             20,
+                             MHz_u{20},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_HT_MF,
                              MicroSeconds(40)) &&
              CheckTxDuration(1536,
                              HtPhy::GetHtMcs0(),
-                             20,
+                             MHz_u{20},
                              NanoSeconds(400),
                              WIFI_PREAMBLE_HT_MF,
                              NanoSeconds(1742400)) &&
              CheckTxDuration(76,
                              HtPhy::GetHtMcs0(),
-                             20,
+                             MHz_u{20},
                              NanoSeconds(400),
                              WIFI_PREAMBLE_HT_MF,
                              MicroSeconds(126)) &&
              CheckTxDuration(14,
                              HtPhy::GetHtMcs0(),
-                             20,
+                             MHz_u{20},
                              NanoSeconds(400),
                              WIFI_PREAMBLE_HT_MF,
                              NanoSeconds(57600)) &&
              CheckTxDuration(1536,
                              HtPhy::GetHtMcs6(),
-                             20,
+                             MHz_u{20},
                              NanoSeconds(400),
                              WIFI_PREAMBLE_HT_MF,
                              NanoSeconds(226800)) &&
              CheckTxDuration(76,
                              HtPhy::GetHtMcs6(),
-                             20,
+                             MHz_u{20},
                              NanoSeconds(400),
                              WIFI_PREAMBLE_HT_MF,
                              NanoSeconds(46800)) &&
              CheckTxDuration(14,
                              HtPhy::GetHtMcs6(),
-                             20,
+                             MHz_u{20},
                              NanoSeconds(400),
                              WIFI_PREAMBLE_HT_MF,
                              NanoSeconds(39600)) &&
              CheckTxDuration(1536,
                              HtPhy::GetHtMcs7(),
-                             40,
+                             MHz_u{40},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_HT_MF,
                              MicroSeconds(128)) &&
              CheckTxDuration(76,
                              HtPhy::GetHtMcs7(),
-                             40,
+                             MHz_u{40},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_HT_MF,
                              MicroSeconds(44)) &&
              CheckTxDuration(14,
                              HtPhy::GetHtMcs7(),
-                             40,
+                             MHz_u{40},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_HT_MF,
                              MicroSeconds(40)) &&
              CheckTxDuration(1536,
                              HtPhy::GetHtMcs7(),
-                             40,
+                             MHz_u{40},
                              NanoSeconds(400),
                              WIFI_PREAMBLE_HT_MF,
                              NanoSeconds(118800)) &&
              CheckTxDuration(76,
                              HtPhy::GetHtMcs7(),
-                             40,
+                             MHz_u{40},
                              NanoSeconds(400),
                              WIFI_PREAMBLE_HT_MF,
                              NanoSeconds(43200)) &&
              CheckTxDuration(14,
                              HtPhy::GetHtMcs7(),
-                             40,
+                             MHz_u{40},
                              NanoSeconds(400),
                              WIFI_PREAMBLE_HT_MF,
                              NanoSeconds(39600));
@@ -758,181 +758,181 @@
     retval = retval &&
              CheckTxDuration(1536,
                              VhtPhy::GetVhtMcs8(),
-                             20,
+                             MHz_u{20},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_VHT_SU,
                              MicroSeconds(196)) &&
              CheckTxDuration(76,
                              VhtPhy::GetVhtMcs8(),
-                             20,
+                             MHz_u{20},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_VHT_SU,
                              MicroSeconds(48)) &&
              CheckTxDuration(14,
                              VhtPhy::GetVhtMcs8(),
-                             20,
+                             MHz_u{20},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_VHT_SU,
                              MicroSeconds(40)) &&
              CheckTxDuration(1536,
                              VhtPhy::GetVhtMcs8(),
-                             20,
+                             MHz_u{20},
                              NanoSeconds(400),
                              WIFI_PREAMBLE_VHT_SU,
                              MicroSeconds(180)) &&
              CheckTxDuration(76,
                              VhtPhy::GetVhtMcs8(),
-                             20,
+                             MHz_u{20},
                              NanoSeconds(400),
                              WIFI_PREAMBLE_VHT_SU,
                              NanoSeconds(46800)) &&
              CheckTxDuration(14,
                              VhtPhy::GetVhtMcs8(),
-                             20,
+                             MHz_u{20},
                              NanoSeconds(400),
                              WIFI_PREAMBLE_VHT_SU,
                              NanoSeconds(39600)) &&
              CheckTxDuration(1536,
                              VhtPhy::GetVhtMcs9(),
-                             40,
+                             MHz_u{40},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_VHT_SU,
                              MicroSeconds(108)) &&
              CheckTxDuration(76,
                              VhtPhy::GetVhtMcs9(),
-                             40,
+                             MHz_u{40},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_VHT_SU,
                              MicroSeconds(40)) &&
              CheckTxDuration(14,
                              VhtPhy::GetVhtMcs9(),
-                             40,
+                             MHz_u{40},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_VHT_SU,
                              MicroSeconds(40)) &&
              CheckTxDuration(1536,
                              VhtPhy::GetVhtMcs9(),
-                             40,
+                             MHz_u{40},
                              NanoSeconds(400),
                              WIFI_PREAMBLE_VHT_SU,
                              NanoSeconds(100800)) &&
              CheckTxDuration(76,
                              VhtPhy::GetVhtMcs9(),
-                             40,
+                             MHz_u{40},
                              NanoSeconds(400),
                              WIFI_PREAMBLE_VHT_SU,
                              NanoSeconds(39600)) &&
              CheckTxDuration(14,
                              VhtPhy::GetVhtMcs9(),
-                             40,
+                             MHz_u{40},
                              NanoSeconds(400),
                              WIFI_PREAMBLE_VHT_SU,
                              NanoSeconds(39600)) &&
              CheckTxDuration(1536,
                              VhtPhy::GetVhtMcs0(),
-                             80,
+                             MHz_u{80},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_VHT_SU,
                              MicroSeconds(460)) &&
              CheckTxDuration(76,
                              VhtPhy::GetVhtMcs0(),
-                             80,
+                             MHz_u{80},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_VHT_SU,
                              MicroSeconds(60)) &&
              CheckTxDuration(14,
                              VhtPhy::GetVhtMcs0(),
-                             80,
+                             MHz_u{80},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_VHT_SU,
                              MicroSeconds(44)) &&
              CheckTxDuration(1536,
                              VhtPhy::GetVhtMcs0(),
-                             80,
+                             MHz_u{80},
                              NanoSeconds(400),
                              WIFI_PREAMBLE_VHT_SU,
                              NanoSeconds(417600)) &&
              CheckTxDuration(76,
                              VhtPhy::GetVhtMcs0(),
-                             80,
+                             MHz_u{80},
                              NanoSeconds(400),
                              WIFI_PREAMBLE_VHT_SU,
                              NanoSeconds(57600)) &&
              CheckTxDuration(14,
                              VhtPhy::GetVhtMcs0(),
-                             80,
+                             MHz_u{80},
                              NanoSeconds(400),
                              WIFI_PREAMBLE_VHT_SU,
                              NanoSeconds(43200)) &&
              CheckTxDuration(1536,
                              VhtPhy::GetVhtMcs9(),
-                             80,
+                             MHz_u{80},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_VHT_SU,
                              MicroSeconds(68)) &&
              CheckTxDuration(76,
                              VhtPhy::GetVhtMcs9(),
-                             80,
+                             MHz_u{80},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_VHT_SU,
                              MicroSeconds(40)) &&
              CheckTxDuration(14,
                              VhtPhy::GetVhtMcs9(),
-                             80,
+                             MHz_u{80},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_VHT_SU,
                              MicroSeconds(40)) &&
              CheckTxDuration(1536,
                              VhtPhy::GetVhtMcs9(),
-                             80,
+                             MHz_u{80},
                              NanoSeconds(400),
                              WIFI_PREAMBLE_VHT_SU,
                              NanoSeconds(64800)) &&
              CheckTxDuration(76,
                              VhtPhy::GetVhtMcs9(),
-                             80,
+                             MHz_u{80},
                              NanoSeconds(400),
                              WIFI_PREAMBLE_VHT_SU,
                              NanoSeconds(39600)) &&
              CheckTxDuration(14,
                              VhtPhy::GetVhtMcs9(),
-                             80,
+                             MHz_u{80},
                              NanoSeconds(400),
                              WIFI_PREAMBLE_VHT_SU,
                              NanoSeconds(39600)) &&
              CheckTxDuration(1536,
                              VhtPhy::GetVhtMcs8(),
-                             160,
+                             MHz_u{160},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_VHT_SU,
                              MicroSeconds(56)) &&
              CheckTxDuration(76,
                              VhtPhy::GetVhtMcs8(),
-                             160,
+                             MHz_u{160},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_VHT_SU,
                              MicroSeconds(40)) &&
              CheckTxDuration(14,
                              VhtPhy::GetVhtMcs8(),
-                             160,
+                             MHz_u{160},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_VHT_SU,
                              MicroSeconds(40)) &&
              CheckTxDuration(1536,
                              VhtPhy::GetVhtMcs8(),
-                             160,
+                             MHz_u{160},
                              NanoSeconds(400),
                              WIFI_PREAMBLE_VHT_SU,
                              MicroSeconds(54)) &&
              CheckTxDuration(76,
                              VhtPhy::GetVhtMcs8(),
-                             160,
+                             MHz_u{160},
                              NanoSeconds(400),
                              WIFI_PREAMBLE_VHT_SU,
                              NanoSeconds(39600)) &&
              CheckTxDuration(14,
                              VhtPhy::GetVhtMcs8(),
-                             160,
+                             MHz_u{160},
                              NanoSeconds(400),
                              WIFI_PREAMBLE_VHT_SU,
                              NanoSeconds(39600));
@@ -943,433 +943,433 @@
     retval = retval &&
              CheckTxDuration(1536,
                              HePhy::GetHeMcs0(),
-                             20,
+                             MHz_u{20},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(1485600)) &&
              CheckTxDuration(76,
                              HePhy::GetHeMcs0(),
-                             20,
+                             MHz_u{20},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(125600)) &&
              CheckTxDuration(14,
                              HePhy::GetHeMcs0(),
-                             20,
+                             MHz_u{20},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(71200)) &&
              CheckTxDuration(1536,
                              HePhy::GetHeMcs0(),
-                             40,
+                             MHz_u{40},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(764800)) &&
              CheckTxDuration(76,
                              HePhy::GetHeMcs0(),
-                             40,
+                             MHz_u{40},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(84800)) &&
              CheckTxDuration(14,
                              HePhy::GetHeMcs0(),
-                             40,
+                             MHz_u{40},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(57600)) &&
              CheckTxDuration(1536,
                              HePhy::GetHeMcs0(),
-                             80,
+                             MHz_u{80},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(397600)) &&
              CheckTxDuration(76,
                              HePhy::GetHeMcs0(),
-                             80,
+                             MHz_u{80},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(71200)) &&
              CheckTxDuration(14,
                              HePhy::GetHeMcs0(),
-                             80,
+                             MHz_u{80},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(57600)) &&
              CheckTxDuration(1536,
                              HePhy::GetHeMcs0(),
-                             160,
+                             MHz_u{160},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(220800)) &&
              CheckTxDuration(76,
                              HePhy::GetHeMcs0(),
-                             160,
+                             MHz_u{160},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(57600)) &&
              CheckTxDuration(14,
                              HePhy::GetHeMcs0(),
-                             160,
+                             MHz_u{160},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(57600)) &&
              CheckTxDuration(1536,
                              HePhy::GetHeMcs0(),
-                             20,
+                             MHz_u{20},
                              NanoSeconds(1600),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(1570400)) &&
              CheckTxDuration(76,
                              HePhy::GetHeMcs0(),
-                             20,
+                             MHz_u{20},
                              NanoSeconds(1600),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(130400)) &&
              CheckTxDuration(14,
                              HePhy::GetHeMcs0(),
-                             20,
+                             MHz_u{20},
                              NanoSeconds(1600),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(72800)) &&
              CheckTxDuration(1536,
                              HePhy::GetHeMcs0(),
-                             40,
+                             MHz_u{40},
                              NanoSeconds(1600),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(807200)) &&
              CheckTxDuration(76,
                              HePhy::GetHeMcs0(),
-                             40,
+                             MHz_u{40},
                              NanoSeconds(1600),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(87200)) &&
              CheckTxDuration(14,
                              HePhy::GetHeMcs0(),
-                             40,
+                             MHz_u{40},
                              NanoSeconds(1600),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(58400)) &&
              CheckTxDuration(1536,
                              HePhy::GetHeMcs0(),
-                             80,
+                             MHz_u{80},
                              NanoSeconds(1600),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(418400)) &&
              CheckTxDuration(76,
                              HePhy::GetHeMcs0(),
-                             80,
+                             MHz_u{80},
                              NanoSeconds(1600),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(72800)) &&
              CheckTxDuration(14,
                              HePhy::GetHeMcs0(),
-                             80,
+                             MHz_u{80},
                              NanoSeconds(1600),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(58400)) &&
              CheckTxDuration(1536,
                              HePhy::GetHeMcs0(),
-                             160,
+                             MHz_u{160},
                              NanoSeconds(1600),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(231200)) &&
              CheckTxDuration(76,
                              HePhy::GetHeMcs0(),
-                             160,
+                             MHz_u{160},
                              NanoSeconds(1600),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(58400)) &&
              CheckTxDuration(14,
                              HePhy::GetHeMcs0(),
-                             160,
+                             MHz_u{160},
                              NanoSeconds(1600),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(58400)) &&
              CheckTxDuration(1536,
                              HePhy::GetHeMcs0(),
-                             20,
+                             MHz_u{20},
                              NanoSeconds(3200),
                              WIFI_PREAMBLE_HE_SU,
                              MicroSeconds(1740)) &&
              CheckTxDuration(76,
                              HePhy::GetHeMcs0(),
-                             20,
+                             MHz_u{20},
                              NanoSeconds(3200),
                              WIFI_PREAMBLE_HE_SU,
                              MicroSeconds(140)) &&
              CheckTxDuration(14,
                              HePhy::GetHeMcs0(),
-                             20,
+                             MHz_u{20},
                              NanoSeconds(3200),
                              WIFI_PREAMBLE_HE_SU,
                              MicroSeconds(76)) &&
              CheckTxDuration(1536,
                              HePhy::GetHeMcs0(),
-                             40,
+                             MHz_u{40},
                              NanoSeconds(3200),
                              WIFI_PREAMBLE_HE_SU,
                              MicroSeconds(892)) &&
              CheckTxDuration(76,
                              HePhy::GetHeMcs0(),
-                             40,
+                             MHz_u{40},
                              NanoSeconds(3200),
                              WIFI_PREAMBLE_HE_SU,
                              MicroSeconds(92)) &&
              CheckTxDuration(14,
                              HePhy::GetHeMcs0(),
-                             40,
+                             MHz_u{40},
                              NanoSeconds(3200),
                              WIFI_PREAMBLE_HE_SU,
                              MicroSeconds(60)) &&
              CheckTxDuration(1536,
                              HePhy::GetHeMcs0(),
-                             80,
+                             MHz_u{80},
                              NanoSeconds(3200),
                              WIFI_PREAMBLE_HE_SU,
                              MicroSeconds(460)) &&
              CheckTxDuration(76,
                              HePhy::GetHeMcs0(),
-                             80,
+                             MHz_u{80},
                              NanoSeconds(3200),
                              WIFI_PREAMBLE_HE_SU,
                              MicroSeconds(76)) &&
              CheckTxDuration(14,
                              HePhy::GetHeMcs0(),
-                             80,
+                             MHz_u{80},
                              NanoSeconds(3200),
                              WIFI_PREAMBLE_HE_SU,
                              MicroSeconds(60)) &&
              CheckTxDuration(1536,
                              HePhy::GetHeMcs0(),
-                             160,
+                             MHz_u{160},
                              NanoSeconds(3200),
                              WIFI_PREAMBLE_HE_SU,
                              MicroSeconds(252)) &&
              CheckTxDuration(76,
                              HePhy::GetHeMcs0(),
-                             160,
+                             MHz_u{160},
                              NanoSeconds(3200),
                              WIFI_PREAMBLE_HE_SU,
                              MicroSeconds(60)) &&
              CheckTxDuration(14,
                              HePhy::GetHeMcs0(),
-                             160,
+                             MHz_u{160},
                              NanoSeconds(3200),
                              WIFI_PREAMBLE_HE_SU,
                              MicroSeconds(60)) &&
              CheckTxDuration(1536,
                              HePhy::GetHeMcs11(),
-                             20,
+                             MHz_u{20},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(139200)) &&
              CheckTxDuration(76,
                              HePhy::GetHeMcs11(),
-                             20,
+                             MHz_u{20},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(57600)) &&
              CheckTxDuration(14,
                              HePhy::GetHeMcs11(),
-                             20,
+                             MHz_u{20},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(57600)) &&
              CheckTxDuration(1536,
                              HePhy::GetHeMcs11(),
-                             40,
+                             MHz_u{40},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(98400)) &&
              CheckTxDuration(76,
                              HePhy::GetHeMcs11(),
-                             40,
+                             MHz_u{40},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(57600)) &&
              CheckTxDuration(14,
                              HePhy::GetHeMcs11(),
-                             40,
+                             MHz_u{40},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(57600)) &&
              CheckTxDuration(1536,
                              HePhy::GetHeMcs11(),
-                             80,
+                             MHz_u{80},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(71200)) &&
              CheckTxDuration(76,
                              HePhy::GetHeMcs11(),
-                             80,
+                             MHz_u{80},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(57600)) &&
              CheckTxDuration(14,
                              HePhy::GetHeMcs11(),
-                             80,
+                             MHz_u{80},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(57600)) &&
              CheckTxDuration(1536,
                              HePhy::GetHeMcs11(),
-                             160,
+                             MHz_u{160},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(57600)) &&
              CheckTxDuration(76,
                              HePhy::GetHeMcs11(),
-                             160,
+                             MHz_u{160},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(57600)) &&
              CheckTxDuration(14,
                              HePhy::GetHeMcs11(),
-                             160,
+                             MHz_u{160},
                              NanoSeconds(800),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(57600)) &&
              CheckTxDuration(1536,
                              HePhy::GetHeMcs11(),
-                             20,
+                             MHz_u{20},
                              NanoSeconds(1600),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(144800)) &&
              CheckTxDuration(76,
                              HePhy::GetHeMcs11(),
-                             20,
+                             MHz_u{20},
                              NanoSeconds(1600),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(58400)) &&
              CheckTxDuration(14,
                              HePhy::GetHeMcs11(),
-                             20,
+                             MHz_u{20},
                              NanoSeconds(1600),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(58400)) &&
              CheckTxDuration(1536,
                              HePhy::GetHeMcs11(),
-                             40,
+                             MHz_u{40},
                              NanoSeconds(1600),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(101600)) &&
              CheckTxDuration(76,
                              HePhy::GetHeMcs11(),
-                             40,
+                             MHz_u{40},
                              NanoSeconds(1600),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(58400)) &&
              CheckTxDuration(14,
                              HePhy::GetHeMcs11(),
-                             40,
+                             MHz_u{40},
                              NanoSeconds(1600),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(58400)) &&
              CheckTxDuration(1536,
                              HePhy::GetHeMcs11(),
-                             80,
+                             MHz_u{80},
                              NanoSeconds(1600),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(72800)) &&
              CheckTxDuration(76,
                              HePhy::GetHeMcs11(),
-                             80,
+                             MHz_u{80},
                              NanoSeconds(1600),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(58400)) &&
              CheckTxDuration(14,
                              HePhy::GetHeMcs11(),
-                             80,
+                             MHz_u{80},
                              NanoSeconds(1600),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(58400)) &&
              CheckTxDuration(1536,
                              HePhy::GetHeMcs11(),
-                             160,
+                             MHz_u{160},
                              NanoSeconds(1600),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(58400)) &&
              CheckTxDuration(76,
                              HePhy::GetHeMcs11(),
-                             160,
+                             MHz_u{160},
                              NanoSeconds(1600),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(58400)) &&
              CheckTxDuration(14,
                              HePhy::GetHeMcs11(),
-                             160,
+                             MHz_u{160},
                              NanoSeconds(1600),
                              WIFI_PREAMBLE_HE_SU,
                              NanoSeconds(58400)) &&
              CheckTxDuration(1536,
                              HePhy::GetHeMcs11(),
-                             20,
+                             MHz_u{20},
                              NanoSeconds(3200),
                              WIFI_PREAMBLE_HE_SU,
                              MicroSeconds(156)) &&
              CheckTxDuration(76,
                              HePhy::GetHeMcs11(),
-                             20,
+                             MHz_u{20},
                              NanoSeconds(3200),
                              WIFI_PREAMBLE_HE_SU,
                              MicroSeconds(60)) &&
              CheckTxDuration(14,
                              HePhy::GetHeMcs11(),
-                             20,
+                             MHz_u{20},
                              NanoSeconds(3200),
                              WIFI_PREAMBLE_HE_SU,
                              MicroSeconds(60)) &&
              CheckTxDuration(1536,
                              HePhy::GetHeMcs11(),
-                             40,
+                             MHz_u{40},
                              NanoSeconds(3200),
                              WIFI_PREAMBLE_HE_SU,
                              MicroSeconds(108)) &&
              CheckTxDuration(76,
                              HePhy::GetHeMcs11(),
-                             40,
+                             MHz_u{40},
                              NanoSeconds(3200),
                              WIFI_PREAMBLE_HE_SU,
                              MicroSeconds(60)) &&
              CheckTxDuration(14,
                              HePhy::GetHeMcs11(),
-                             40,
+                             MHz_u{40},
                              NanoSeconds(3200),
                              WIFI_PREAMBLE_HE_SU,
                              MicroSeconds(60)) &&
              CheckTxDuration(1536,
                              HePhy::GetHeMcs11(),
-                             80,
+                             MHz_u{80},
                              NanoSeconds(3200),
                              WIFI_PREAMBLE_HE_SU,
                              MicroSeconds(76)) &&
              CheckTxDuration(76,
                              HePhy::GetHeMcs11(),
-                             80,
+                             MHz_u{80},
                              NanoSeconds(3200),
                              WIFI_PREAMBLE_HE_SU,
                              MicroSeconds(60)) &&
              CheckTxDuration(14,
                              HePhy::GetHeMcs11(),
-                             80,
+                             MHz_u{80},
                              NanoSeconds(3200),
                              WIFI_PREAMBLE_HE_SU,
                              MicroSeconds(60)) &&
              CheckTxDuration(1536,
                              HePhy::GetHeMcs11(),
-                             160,
+                             MHz_u{160},
                              NanoSeconds(3200),
                              WIFI_PREAMBLE_HE_SU,
                              MicroSeconds(60)) &&
              CheckTxDuration(76,
                              HePhy::GetHeMcs11(),
-                             160,
+                             MHz_u{160},
                              NanoSeconds(3200),
                              WIFI_PREAMBLE_HE_SU,
                              MicroSeconds(60)) &&
              CheckTxDuration(14,
                              HePhy::GetHeMcs11(),
-                             160,
+                             MHz_u{160},
                              NanoSeconds(3200),
                              WIFI_PREAMBLE_HE_SU,
                              MicroSeconds(60));
@@ -1382,7 +1382,7 @@
                  std::list<uint32_t>{1536, 1536},
                  std::list<HeMuUserInfo>{{{HeRu::RU_242_TONE, 1, true}, 0, 1},
                                          {{HeRu::RU_242_TONE, 2, true}, 0, 1}},
-                 40,
+                 MHz_u{40},
                  NanoSeconds(800),
                  WIFI_PREAMBLE_HE_MU,
                  NanoSeconds(
@@ -1390,14 +1390,14 @@
              && CheckMuTxDuration(std::list<uint32_t>{1536, 1536},
                                   std::list<HeMuUserInfo>{{{HeRu::RU_242_TONE, 1, true}, 1, 1},
                                                           {{HeRu::RU_242_TONE, 2, true}, 0, 1}},
-                                  40,
+                                  MHz_u{40},
                                   NanoSeconds(800),
                                   WIFI_PREAMBLE_HE_MU,
                                   NanoSeconds(1493600)) // shouldn't change if first PSDU is shorter
              && CheckMuTxDuration(std::list<uint32_t>{1536, 76},
                                   std::list<HeMuUserInfo>{{{HeRu::RU_242_TONE, 1, true}, 0, 1},
                                                           {{HeRu::RU_242_TONE, 2, true}, 0, 1}},
-                                  40,
+                                  MHz_u{40},
                                   NanoSeconds(800),
                                   WIFI_PREAMBLE_HE_MU,
                                   NanoSeconds(1493600));
@@ -1409,21 +1409,21 @@
              CheckMuTxDuration(std::list<uint32_t>{1536, 1536},
                                std::list<HeMuUserInfo>{{{HeRu::RU_242_TONE, 1, true}, 0, 1},
                                                        {{HeRu::RU_242_TONE, 2, true}, 0, 1}},
-                               40,
+                               MHz_u{40},
                                NanoSeconds(800),
                                WIFI_PREAMBLE_EHT_MU,
                                NanoSeconds(1493600)) // equivalent to 802.11ax MU
              && CheckMuTxDuration(std::list<uint32_t>{1536, 1536},
                                   std::list<HeMuUserInfo>{{{HeRu::RU_242_TONE, 1, true}, 1, 1},
                                                           {{HeRu::RU_242_TONE, 2, true}, 0, 1}},
-                                  40,
+                                  MHz_u{40},
                                   NanoSeconds(800),
                                   WIFI_PREAMBLE_EHT_MU,
                                   NanoSeconds(1493600)) // shouldn't change if first PSDU is shorter
              && CheckMuTxDuration(std::list<uint32_t>{1536, 76},
                                   std::list<HeMuUserInfo>{{{HeRu::RU_242_TONE, 1, true}, 0, 1},
                                                           {{HeRu::RU_242_TONE, 2, true}, 0, 1}},
-                                  40,
+                                  MHz_u{40},
                                   NanoSeconds(800),
                                   WIFI_PREAMBLE_EHT_MU,
                                   NanoSeconds(1493600));
@@ -1434,10 +1434,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief HE-SIG-B duration test
+ * @brief HE-SIG-B duration test
  */
 class HeSigBDurationTest : public TestCase
 {
@@ -1454,13 +1454,13 @@
     /**
      * Constructor
      *
-     * \param userInfos the HE MU specific per-user information to use for the test
-     * \param sigBMode the mode to transmit HE-SIG-B for the test
-     * \param channelWidth the channel width to select for the test
-     * \param expectedMuType the expected MU type (OFDMA or MU-MIMO)
-     * \param expectedRuAllocation the expected RU_ALLOCATION
-     * \param expectedNumUsersPerCc the expected number of users per content channel
-     * \param expectedSigBDuration the expected duration of the HE-SIG-B header
+     * @param userInfos the HE MU specific per-user information to use for the test
+     * @param sigBMode the mode to transmit HE-SIG-B for the test
+     * @param channelWidth the channel width to select for the test
+     * @param expectedMuType the expected MU type (OFDMA or MU-MIMO)
+     * @param expectedRuAllocation the expected RU_ALLOCATION
+     * @param expectedNumUsersPerCc the expected number of users per content channel
+     * @param expectedSigBDuration the expected duration of the HE-SIG-B header
      */
     HeSigBDurationTest(const std::list<HeMuUserInfo>& userInfos,
                        const WifiMode& sigBMode,
@@ -1476,7 +1476,7 @@
     /**
      * Build a TXVECTOR for HE MU.
      *
-     * \return the configured HE MU TXVECTOR
+     * @return the configured HE MU TXVECTOR
      */
     WifiTxVector BuildTxVector() const;
 
@@ -1573,10 +1573,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief PHY header sections consistency test
+ * @brief PHY header sections consistency test
  */
 class PhyHeaderSectionsTest : public TestCase
 {
@@ -1652,7 +1652,7 @@
 void
 PhyHeaderSectionsTest::DoRun()
 {
-    Time ppduStart = Seconds(1.0);
+    Time ppduStart = Seconds(1);
     Ptr<PhyEntity> phyEntity;
     PhyEntity::PhyHeaderSections sections;
     WifiTxVector txVector;
@@ -1662,7 +1662,7 @@
     // 11b (HR/DSSS)
     phyEntity = Create<DsssPhy>();
     txVector.SetMode(DsssPhy::GetDsssRate1Mbps());
-    txVector.SetChannelWidth(22);
+    txVector.SetChannelWidth(MHz_u{22});
 
     // -> long PPDU format
     txVector.SetPreambleType(WIFI_PREAMBLE_LONG);
@@ -1704,7 +1704,7 @@
     {
         phyEntity = Create<OfdmPhy>(variant.first);
         std::size_t ratio = variant.second;
-        MHz_u bw = 20 / ratio;
+        const auto bw = MHz_u{20} / ratio;
         txVector.SetChannelWidth(bw);
         txVector.SetMode(OfdmPhy::GetOfdmRate(12000000 / ratio, bw));
         nonHtMode = OfdmPhy::GetOfdmRate(6000000 / ratio, bw);
@@ -1721,7 +1721,7 @@
     // ==================================================================================
     // 11g (ERP-OFDM)
     phyEntity = Create<ErpOfdmPhy>();
-    txVector.SetChannelWidth(20);
+    txVector.SetChannelWidth(MHz_u{20});
     txVector.SetMode(ErpOfdmPhy::GetErpOfdmRate(54000000));
     nonHtMode = ErpOfdmPhy::GetErpOfdmRate6Mbps();
     sections = {
@@ -1734,7 +1734,7 @@
     // ==================================================================================
     // 11n (HT)
     phyEntity = Create<HtPhy>(4);
-    txVector.SetChannelWidth(20);
+    txVector.SetChannelWidth(MHz_u{20});
     txVector.SetMode(HtPhy::GetHtMcs6());
     nonHtMode = OfdmPhy::GetOfdmRate6Mbps();
     WifiMode htSigMode = nonHtMode;
@@ -1754,7 +1754,7 @@
           htSigMode}},
     };
     CheckPhyHeaderSections(phyEntity->GetPhyHeaderSections(txVector, ppduStart), sections);
-    txVector.SetChannelWidth(20); // shouldn't have any impact
+    txVector.SetChannelWidth(MHz_u{20}); // shouldn't have any impact
     CheckPhyHeaderSections(phyEntity->GetPhyHeaderSections(txVector, ppduStart), sections);
 
     // -> HT-mixed format for 3 SS and 1 ESS
@@ -1769,7 +1769,7 @@
     // ==================================================================================
     // 11ac (VHT)
     phyEntity = Create<VhtPhy>();
-    txVector.SetChannelWidth(20);
+    txVector.SetChannelWidth(MHz_u{20});
     txVector.SetNess(0);
     txVector.SetMode(VhtPhy::GetVhtMcs7());
     WifiMode sigAMode = nonHtMode;
@@ -1806,13 +1806,13 @@
     sections[WIFI_PPDU_FIELD_SIG_B] = {{ppduStart + MicroSeconds(48), ppduStart + MicroSeconds(52)},
                                        sigBMode};
     CheckPhyHeaderSections(phyEntity->GetPhyHeaderSections(txVector, ppduStart), sections);
-    txVector.SetChannelWidth(80); // shouldn't have any impact
+    txVector.SetChannelWidth(MHz_u{80}); // shouldn't have any impact
     CheckPhyHeaderSections(phyEntity->GetPhyHeaderSections(txVector, ppduStart), sections);
 
     // ==================================================================================
     // 11ax (HE)
     phyEntity = Create<HePhy>();
-    txVector.SetChannelWidth(20);
+    txVector.SetChannelWidth(MHz_u{20});
     txVector.SetNss(2); // HE-LTF duration assumed to be always 8 us for the time being (see note in
                         // HePhy::GetTrainingDuration)
     txVector.SetMode(HePhy::GetHeMcs9());
@@ -1874,7 +1874,7 @@
          ppduStart + MicroSeconds(56)}, // 1 HE-STF (@ 4 us) + 2 HE-LTFs (@ 8 us)
         sigBMode};
     CheckPhyHeaderSections(phyEntity->GetPhyHeaderSections(txVector, ppduStart), sections);
-    txVector.SetChannelWidth(160); // shouldn't have any impact
+    txVector.SetChannelWidth(MHz_u{160}); // shouldn't have any impact
     txVector.SetRuAllocation({96, 113, 113, 113, 113, 113, 113, 113}, 0);
 
     CheckPhyHeaderSections(phyEntity->GetPhyHeaderSections(txVector, ppduStart), sections);
@@ -1884,7 +1884,7 @@
     sections.erase(WIFI_PPDU_FIELD_SIG_A); // FIXME: do we keep using separate type for 11be?
     sections.erase(WIFI_PPDU_FIELD_SIG_B); // FIXME: do we keep using separate type for 11be?
     phyEntity = Create<EhtPhy>();
-    txVector.SetChannelWidth(20);
+    txVector.SetChannelWidth(MHz_u{20});
     txVector.SetNss(2); // EHT-LTF duration assumed to be always 8 us for the time being (see note
                         // in HePhy::GetTrainingDuration)
     txVector.SetMode(EhtPhy::GetEhtMcs9());
@@ -1919,17 +1919,17 @@
          ppduStart + MicroSeconds(56)}, // 1 HE-STF (@ 4 us) + 2 HE-LTFs (@ 8 us)
         ehtSigMode};
     CheckPhyHeaderSections(phyEntity->GetPhyHeaderSections(txVector, ppduStart), sections);
-    txVector.SetChannelWidth(160); // shouldn't have any impact
+    txVector.SetChannelWidth(MHz_u{160}); // shouldn't have any impact
     txVector.SetRuAllocation({96, 113, 113, 113, 113, 113, 113, 113}, 0);
 
     CheckPhyHeaderSections(phyEntity->GetPhyHeaderSections(txVector, ppduStart), sections);
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Tx Duration Test Suite
+ * @brief Tx Duration Test Suite
  */
 class TxDurationTestSuite : public TestSuite
 {
@@ -1948,7 +1948,7 @@
     AddTestCase(new HeSigBDurationTest(
                     {{{HeRu::RU_106_TONE, 1, true}, 11, 1}, {{HeRu::RU_106_TONE, 2, true}, 10, 4}},
                     VhtPhy::GetVhtMcs5(),
-                    20,
+                    MHz_u{20},
                     HeSigBDurationTest::OFDMA,
                     {96},
                     std::make_pair(2, 0), // both users in HE-SIG-B content channel 1
@@ -1964,7 +1964,7 @@
                                 {{HeRu::RU_52_TONE, 7, true}, 5, 3},
                                 {{HeRu::RU_52_TONE, 8, true}, 6, 2}},
                                VhtPhy::GetVhtMcs4(),
-                               40,
+                               MHz_u{40},
                                HeSigBDurationTest::OFDMA,
                                {96, 112},
                                std::make_pair(2, 4), // two users in HE-SIG-B content channel 1 and
@@ -1982,7 +1982,7 @@
                                 {{HeRu::RU_52_TONE, 8, true}, 6, 2},
                                 {{HeRu::RU_26_TONE, 14, true}, 3, 1}},
                                VhtPhy::GetVhtMcs3(),
-                               40,
+                               MHz_u{40},
                                HeSigBDurationTest::OFDMA,
                                {96, 15},
                                std::make_pair(2, 5), // two users in HE-SIG-B content channel 1 and
@@ -2002,7 +2002,7 @@
                                 {{HeRu::RU_242_TONE, 3, true}, 1, 1},
                                 {{HeRu::RU_242_TONE, 4, true}, 4, 1}},
                                VhtPhy::GetVhtMcs1(),
-                               80,
+                               MHz_u{80},
                                HeSigBDurationTest::OFDMA,
                                {96, 15, 192, 192},
                                std::make_pair(3, 6), // three users in HE-SIG-B content channel 1
@@ -2023,7 +2023,7 @@
                                 {{HeRu::RU_242_TONE, 4, true}, 4, 1},
                                 {{HeRu::RU_996_TONE, 1, false}, 1, 1}},
                                VhtPhy::GetVhtMcs1(),
-                               160,
+                               MHz_u{160},
                                HeSigBDurationTest::OFDMA,
                                {96, 15, 192, 192, 208, 208, 208, 208},
                                std::make_pair(4, 7), // four users in HE-SIG-B content channel 1 and
@@ -2042,7 +2042,7 @@
                                 {{HeRu::RU_26_TONE, 8, true}, 11, 1},
                                 {{HeRu::RU_26_TONE, 9, true}, 11, 1}},
                                VhtPhy::GetVhtMcs5(),
-                               20,
+                               MHz_u{20},
                                HeSigBDurationTest::OFDMA,
                                {0},
                                std::make_pair(9, 0), // 9 users in HE-SIG-B content channel 1
@@ -2057,7 +2057,7 @@
                                 {{HeRu::RU_52_TONE, 5, true}, 11, 1},
                                 {{HeRu::RU_52_TONE, 8, true}, 11, 2}},
                                VhtPhy::GetVhtMcs5(),
-                               40,
+                               MHz_u{40},
                                HeSigBDurationTest::OFDMA,
                                {112, 112},
                                std::make_pair(4, 4), // 4 users in both HE-SIG-B content channels
@@ -2073,7 +2073,7 @@
                                 {{HeRu::RU_52_TONE, 5, true}, 11, 2},
                                 {{HeRu::RU_52_TONE, 6, true}, 11, 3}},
                                VhtPhy::GetVhtMcs5(),
-                               40,
+                               MHz_u{40},
                                HeSigBDurationTest::OFDMA,
                                {112, 112},
                                std::make_pair(4, 4), // 4 users in both HE-SIG-B content channels
@@ -2084,7 +2084,7 @@
     AddTestCase(new HeSigBDurationTest(
                     {{{HeRu::RU_242_TONE, 1, true}, 11, 1}, {{HeRu::RU_242_TONE, 1, true}, 10, 4}},
                     VhtPhy::GetVhtMcs5(),
-                    20,
+                    MHz_u{20},
                     HeSigBDurationTest::MU_MIMO,
                     {192},
                     std::make_pair(2, 0), // both users in HE-SIG-B content channel 1
@@ -2097,7 +2097,7 @@
                                 {{HeRu::RU_242_TONE, 1, true}, 5, 2},
                                 {{HeRu::RU_242_TONE, 1, true}, 6, 1}},
                                VhtPhy::GetVhtMcs4(),
-                               20,
+                               MHz_u{20},
                                HeSigBDurationTest::MU_MIMO,
                                {192},
                                std::make_pair(3, 0), // all users in HE-SIG-B content channel 1
@@ -2111,7 +2111,7 @@
                                 {{HeRu::RU_242_TONE, 1, true}, 6, 3},
                                 {{HeRu::RU_242_TONE, 1, true}, 7, 2}},
                                VhtPhy::GetVhtMcs4(),
-                               20,
+                               MHz_u{20},
                                HeSigBDurationTest::MU_MIMO,
                                {192},
                                std::make_pair(4, 0), // all users in HE-SIG-B content channel 1
@@ -2127,7 +2127,7 @@
                                 {{HeRu::RU_242_TONE, 1, true}, 8, 1},
                                 {{HeRu::RU_242_TONE, 1, true}, 9, 1}},
                                VhtPhy::GetVhtMcs4(),
-                               20,
+                               MHz_u{20},
                                HeSigBDurationTest::MU_MIMO,
                                {192},
                                std::make_pair(6, 0), // all users in HE-SIG-B content channel 1
@@ -2145,7 +2145,7 @@
                                 {{HeRu::RU_242_TONE, 1, true}, 10, 1},
                                 {{HeRu::RU_242_TONE, 1, true}, 11, 1}},
                                VhtPhy::GetVhtMcs4(),
-                               20,
+                               MHz_u{20},
                                HeSigBDurationTest::MU_MIMO,
                                {192},
                                std::make_pair(8, 0), // all users in HE-SIG-B content channel 1
@@ -2156,7 +2156,7 @@
     AddTestCase(new HeSigBDurationTest(
                     {{{HeRu::RU_484_TONE, 1, true}, 11, 1}, {{HeRu::RU_484_TONE, 1, true}, 10, 4}},
                     VhtPhy::GetVhtMcs5(),
-                    40,
+                    MHz_u{40},
                     HeSigBDurationTest::MU_MIMO,
                     {200, 200},
                     std::make_pair(1, 1), // users equally split between the two content channels
@@ -2170,7 +2170,7 @@
              {{HeRu::RU_484_TONE, 1, true}, 5, 2},
              {{HeRu::RU_484_TONE, 1, true}, 6, 1}},
             VhtPhy::GetVhtMcs4(),
-            40,
+            MHz_u{40},
             HeSigBDurationTest::MU_MIMO,
             {200, 200},
             std::make_pair(2, 1), // 2 users in content channel 1 and 1 user in content channel 2
@@ -2184,7 +2184,7 @@
                      {{HeRu::RU_484_TONE, 1, true}, 6, 3},
                      {{HeRu::RU_484_TONE, 1, true}, 7, 2}},
                     VhtPhy::GetVhtMcs4(),
-                    40,
+                    MHz_u{40},
                     HeSigBDurationTest::MU_MIMO,
                     {200, 200},
                     std::make_pair(2, 2), // users equally split between the two content channels
@@ -2200,7 +2200,7 @@
                      {{HeRu::RU_484_TONE, 1, true}, 8, 1},
                      {{HeRu::RU_484_TONE, 1, true}, 9, 1}},
                     VhtPhy::GetVhtMcs4(),
-                    40,
+                    MHz_u{40},
                     HeSigBDurationTest::MU_MIMO,
                     {200, 200},
                     std::make_pair(3, 3), // users equally split between the two content channels
@@ -2218,7 +2218,7 @@
                      {{HeRu::RU_484_TONE, 1, true}, 10, 1},
                      {{HeRu::RU_484_TONE, 1, true}, 11, 1}},
                     VhtPhy::GetVhtMcs4(),
-                    40,
+                    MHz_u{40},
                     HeSigBDurationTest::MU_MIMO,
                     {200, 200},
                     std::make_pair(4, 4), // users equally split between the two content channels
@@ -2229,7 +2229,7 @@
     AddTestCase(new HeSigBDurationTest(
                     {{{HeRu::RU_996_TONE, 1, true}, 11, 1}, {{HeRu::RU_996_TONE, 1, true}, 10, 4}},
                     VhtPhy::GetVhtMcs5(),
-                    80,
+                    MHz_u{80},
                     HeSigBDurationTest::MU_MIMO,
                     {208, 208, 208, 208},
                     std::make_pair(1, 1), // users equally split between the two content channels
@@ -2243,7 +2243,7 @@
              {{HeRu::RU_996_TONE, 1, true}, 5, 2},
              {{HeRu::RU_996_TONE, 1, true}, 6, 1}},
             VhtPhy::GetVhtMcs4(),
-            80,
+            MHz_u{80},
             HeSigBDurationTest::MU_MIMO,
             {208, 208, 208, 208},
             std::make_pair(2, 1), // 2 users in content channel 1 and 1 user in content channel 2
@@ -2257,7 +2257,7 @@
                      {{HeRu::RU_996_TONE, 1, true}, 6, 3},
                      {{HeRu::RU_996_TONE, 1, true}, 7, 2}},
                     VhtPhy::GetVhtMcs4(),
-                    80,
+                    MHz_u{80},
                     HeSigBDurationTest::MU_MIMO,
                     {208, 208, 208, 208},
                     std::make_pair(2, 2), // users equally split between the two content channels
@@ -2273,7 +2273,7 @@
                      {{HeRu::RU_996_TONE, 1, true}, 8, 1},
                      {{HeRu::RU_996_TONE, 1, true}, 9, 1}},
                     VhtPhy::GetVhtMcs4(),
-                    80,
+                    MHz_u{80},
                     HeSigBDurationTest::MU_MIMO,
                     {208, 208, 208, 208},
                     std::make_pair(3, 3), // users equally split between the two content channels
@@ -2291,7 +2291,7 @@
                      {{HeRu::RU_996_TONE, 1, true}, 10, 1},
                      {{HeRu::RU_996_TONE, 1, true}, 11, 1}},
                     VhtPhy::GetVhtMcs4(),
-                    80,
+                    MHz_u{80},
                     HeSigBDurationTest::MU_MIMO,
                     {208, 208, 208, 208},
                     std::make_pair(4, 4), // users equally split between the two content channels
@@ -2303,7 +2303,7 @@
         new HeSigBDurationTest(
             {{{HeRu::RU_2x996_TONE, 1, true}, 11, 1}, {{HeRu::RU_2x996_TONE, 1, true}, 10, 4}},
             VhtPhy::GetVhtMcs5(),
-            160,
+            MHz_u{160},
             HeSigBDurationTest::MU_MIMO,
             {208, 208, 208, 208, 208, 208, 208, 208},
             std::make_pair(1, 1), // users equally split between the two content channels
@@ -2317,7 +2317,7 @@
              {{HeRu::RU_2x996_TONE, 1, true}, 5, 2},
              {{HeRu::RU_2x996_TONE, 1, true}, 6, 1}},
             VhtPhy::GetVhtMcs4(),
-            160,
+            MHz_u{160},
             HeSigBDurationTest::MU_MIMO,
             {208, 208, 208, 208, 208, 208, 208, 208},
             std::make_pair(2, 1), // 2 users in content channel 1 and 1 user in content channel 2
@@ -2331,7 +2331,7 @@
                      {{HeRu::RU_2x996_TONE, 1, true}, 6, 3},
                      {{HeRu::RU_2x996_TONE, 1, true}, 7, 2}},
                     VhtPhy::GetVhtMcs4(),
-                    160,
+                    MHz_u{160},
                     HeSigBDurationTest::MU_MIMO,
                     {208, 208, 208, 208, 208, 208, 208, 208},
                     std::make_pair(2, 2), // users equally split between the two content channels
@@ -2347,7 +2347,7 @@
                      {{HeRu::RU_2x996_TONE, 1, true}, 8, 1},
                      {{HeRu::RU_2x996_TONE, 1, true}, 9, 1}},
                     VhtPhy::GetVhtMcs4(),
-                    160,
+                    MHz_u{160},
                     HeSigBDurationTest::MU_MIMO,
                     {208, 208, 208, 208, 208, 208, 208, 208},
                     std::make_pair(3, 3), // users equally split between the two content channels
@@ -2365,7 +2365,7 @@
                      {{HeRu::RU_2x996_TONE, 1, true}, 10, 1},
                      {{HeRu::RU_2x996_TONE, 1, true}, 11, 1}},
                     VhtPhy::GetVhtMcs4(),
-                    160,
+                    MHz_u{160},
                     HeSigBDurationTest::MU_MIMO,
                     {208, 208, 208, 208, 208, 208, 208, 208},
                     std::make_pair(4, 4), // users equally split between the two content channels
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/test/wifi-aggregation-test.cc ns-3.44/src/wifi/test/wifi-aggregation-test.cc
--- ns-3.43/src/wifi/test/wifi-aggregation-test.cc	2024-10-09 16:41:10.136656800 -0700
+++ ns-3.44/src/wifi/test/wifi-aggregation-test.cc	2025-03-09 16:55:49.807372600 -0700
@@ -6,6 +6,7 @@
  * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
  */
 
+#include "ns3/attribute-container.h"
 #include "ns3/config.h"
 #include "ns3/eht-configuration.h"
 #include "ns3/fcfs-wifi-queue-scheduler.h"
@@ -36,7 +37,6 @@
 #include "ns3/wifi-psdu.h"
 #include "ns3/yans-wifi-helper.h"
 #include "ns3/yans-wifi-phy.h"
-#include <ns3/attribute-container.h>
 
 #include <algorithm>
 #include <iterator>
@@ -45,10 +45,10 @@
 using namespace ns3;
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Ampdu Aggregation Test
+ * @brief Ampdu Aggregation Test
  */
 class AmpduAggregationTest : public TestCase
 {
@@ -70,8 +70,8 @@
     /**
      * Construct object with non-default test parameters
      *
-     * \param name the name of the test case
-     * \param params the test parameters
+     * @param name the name of the test case
+     * @param params the test parameters
      */
     AmpduAggregationTest(const std::string& name, const Params& params);
 
@@ -79,28 +79,28 @@
     /**
      * Establish a BlockAck agreement.
      *
-     * \param recipient the recipient MAC address
+     * @param recipient the recipient MAC address
      */
     void EstablishAgreement(const Mac48Address& recipient);
 
     /**
      * Enqueue the given number of packets addressed to the given station and of the given size.
      *
-     * \param count the number of packets
-     * \param size the size (bytes) of each packet
-     * \param dest the destination address
+     * @param count the number of packets
+     * @param size the size (bytes) of each packet
+     * @param dest the destination address
      */
     void EnqueuePkts(std::size_t count, uint32_t size, const Mac48Address& dest);
 
     /**
-     * \return the Best Effort QosTxop
+     * @return the Best Effort QosTxop
      */
     Ptr<QosTxop> GetBeQueue() const;
 
     /**
      * Dequeue a PSDU.
      *
-     * \param mpduList the MPDUs contained in the PSDU
+     * @param mpduList the MPDUs contained in the PSDU
      */
     void DequeueMpdus(const std::vector<Ptr<WifiMpdu>>& mpduList);
 
@@ -112,8 +112,8 @@
     /**
      * Fired when the MAC discards an MPDU.
      *
-     * \param reason the reason why the MPDU was discarded
-     * \param mpdu the discarded MPDU
+     * @param reason the reason why the MPDU was discarded
+     * @param mpdu the discarded MPDU
      */
     void MpduDiscarded(WifiMacDropReason reason, Ptr<const WifiMpdu> mpdu);
 
@@ -225,6 +225,7 @@
     m_device->SetMac(m_mac);
     m_mac->SetWifiPhys(m_phys);
     std::vector<Ptr<ChannelAccessManager>> caManagers;
+    caManagers.reserve(m_params.nLinks);
     for (uint8_t i = 0; i < m_params.nLinks; i++)
     {
         caManagers.emplace_back(CreateObject<ChannelAccessManager>());
@@ -479,9 +480,7 @@
                           true,
                           "no MPDU aggregation should be performed if there is no agreement");
 
-    m_managers.at(SINGLE_LINK_OP_ID)
-        ->SetMaxSsrc(
-            0); // set to 0 in order to fake that the maximum number of retries has been reached
+    m_mac->SetFrameRetryLimit(1); // fake that the maximum number of retries has been reached
     m_mac->TraceConnectWithoutContext("DroppedMpdu",
                                       MakeCallback(&AmpduAggregationTest::MpduDiscarded, this));
     htFem->m_dcf = GetBeQueue();
@@ -507,10 +506,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Two Level Aggregation Test
+ * @brief Two Level Aggregation Test
  */
 class TwoLevelAggregationTest : public AmpduAggregationTest
 {
@@ -727,10 +726,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief 802.11ax aggregation test which permits 64 or 256 MPDUs in A-MPDU according to the
+ * @brief 802.11ax aggregation test which permits 64 or 256 MPDUs in A-MPDU according to the
  * negotiated buffer size.
  */
 class HeAggregationTest : public AmpduAggregationTest
@@ -739,7 +738,7 @@
     /**
      * Constructor.
      *
-     * \param bufferSize the size (in number of MPDUs) of the BlockAck buffer
+     * @param bufferSize the size (in number of MPDUs) of the BlockAck buffer
      */
     HeAggregationTest(uint16_t bufferSize);
 
@@ -793,10 +792,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief 802.11be aggregation test which permits up to 1024 MPDUs in A-MPDU according to the
+ * @brief 802.11be aggregation test which permits up to 1024 MPDUs in A-MPDU according to the
  * negotiated buffer size.
  */
 class EhtAggregationTest : public AmpduAggregationTest
@@ -805,7 +804,7 @@
     /**
      * Constructor.
      *
-     * \param bufferSize the size (in number of MPDUs) of the BlockAck buffer
+     * @param bufferSize the size (in number of MPDUs) of the BlockAck buffer
      */
     EhtAggregationTest(uint16_t bufferSize);
 
@@ -923,10 +922,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test for A-MSDU and A-MPDU aggregation
+ * @brief Test for A-MSDU and A-MPDU aggregation
  *
  * This test aims to check that the packets passed to the MAC layer (on the sender
  * side) are forwarded up to the upper layer (on the receiver side) when A-MSDU and
@@ -950,7 +949,7 @@
     /**
      * Constructor.
      *
-     * \param notifyMacHdrRxEnd whether notification of MAC header reception end is enabled
+     * @param notifyMacHdrRxEnd whether notification of MAC header reception end is enabled
      */
     PreservePacketsInAmpdus(bool notifyMacHdrRxEnd);
     ~PreservePacketsInAmpdus() override;
@@ -969,22 +968,22 @@
 
     /**
      * Callback invoked when an MSDU is passed to the MAC
-     * \param packet the MSDU to transmit
+     * @param packet the MSDU to transmit
      */
     void NotifyMacTransmit(Ptr<const Packet> packet);
     /**
      * Callback invoked when the sender MAC passes a PSDU(s) to the PHY
-     * \param psduMap the PSDU map
-     * \param txVector the TX vector
-     * \param txPowerW the transmit power in Watts
+     * @param psduMap the PSDU map
+     * @param txVector the TX vector
+     * @param txPowerW the transmit power in Watts
      */
     void NotifyPsduForwardedDown(WifiConstPsduMap psduMap, WifiTxVector txVector, double txPowerW);
     /**
      * Callback invoked when the reception of the MAC header of an MPDU is completed.
-     * \param mac the MAC to which the reception of the MAC header is notified
-     * \param macHdr the MAC header of the MPDU being received
-     * \param txVector the TXVECTOR used to transmit the PSDU
-     * \param psduDuration the remaining duration of the PSDU
+     * @param mac the MAC to which the reception of the MAC header is notified
+     * @param macHdr the MAC header of the MPDU being received
+     * @param txVector the TXVECTOR used to transmit the PSDU
+     * @param psduDuration the remaining duration of the PSDU
      */
     void NotifyMacHeaderEndRx(Ptr<WifiMac> mac,
                               const WifiMacHeader& macHdr,
@@ -992,7 +991,7 @@
                               Time psduDuration);
     /**
      * Callback invoked when the receiver MAC forwards a packet up to the upper layer
-     * \param p the packet
+     * @param p the packet
      */
     void NotifyMacForwardUp(Ptr<const Packet> p);
 };
@@ -1172,7 +1171,7 @@
     client->SetRemote(socket);
     wifiStaNode.Get(0)->AddApplication(client);
     client->SetStartTime(Seconds(1));
-    client->SetStopTime(Seconds(3.0));
+    client->SetStopTime(Seconds(3));
     Simulator::Schedule(Seconds(1.5),
                         &PacketSocketClient::SetAttribute,
                         client,
@@ -1182,8 +1181,8 @@
     Ptr<PacketSocketServer> server = CreateObject<PacketSocketServer>();
     server->SetLocal(socket);
     wifiApNode.Get(0)->AddApplication(server);
-    server->SetStartTime(Seconds(0.0));
-    server->SetStopTime(Seconds(4.0));
+    server->SetStartTime(Seconds(0));
+    server->SetStopTime(Seconds(4));
 
     sta_device->GetMac()->TraceConnectWithoutContext(
         "MacTx",
@@ -1224,10 +1223,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Wifi Aggregation Test Suite
+ * @brief Wifi Aggregation Test Suite
  */
 class WifiAggregationTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/test/wifi-channel-switching-test.cc ns-3.44/src/wifi/test/wifi-channel-switching-test.cc
--- ns-3.43/src/wifi/test/wifi-channel-switching-test.cc	2024-10-09 16:41:10.136656800 -0700
+++ ns-3.44/src/wifi/test/wifi-channel-switching-test.cc	2025-03-09 16:55:49.807372600 -0700
@@ -29,8 +29,8 @@
 NS_LOG_COMPONENT_DEFINE("WifiChannelSwitchingTest");
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
  * This test verifies that communication between an AP and a STA resumes
  * after that both switch channel and PHY band. The channel switch is
@@ -42,7 +42,7 @@
 {
   public:
     /**
-     * \brief Constructor
+     * @brief Constructor
      */
     WifiChannelSwitchingTest();
     ~WifiChannelSwitchingTest() override;
@@ -53,23 +53,23 @@
      * Callback invoked when a station associates with an AP. Tracks the number of
      * times the association procedure is performed.
      *
-     * \param bssid the BSSID
+     * @param bssid the BSSID
      */
     void Associated(Mac48Address bssid);
     /**
      * Callback invoked when PHY receives a PSDU to transmit from the MAC. Tracks the
      * number of times a QoS data frame is transmitted by the STA.
      *
-     * \param psduMap the PSDU map
-     * \param txVector the TX vector
-     * \param txPowerW the tx power in Watts
+     * @param psduMap the PSDU map
+     * @param txVector the TX vector
+     * @param txPowerW the tx power in Watts
      */
     void Transmit(WifiConstPsduMap psduMap, WifiTxVector txVector, double txPowerW);
     /**
      * Function to trace packets received by the server application
      *
-     * \param p the packet
-     * \param addr the address
+     * @param p the packet
+     * @param addr the address
      */
     void L7Receive(Ptr<const Packet> p, const Address& addr);
     /**
@@ -83,10 +83,10 @@
     /**
      * Callback invoked when the PHY on the given node changes state.
      *
-     * \param nodeId the given node ID
-     * \param start the time state changes
-     * \param duration the time the PHY will stay in the new state
-     * \param state the new PHY state
+     * @param nodeId the given node ID
+     * @param start the time state changes
+     * @param duration the time the PHY will stay in the new state
+     * @param state the new PHY state
      */
     void StateChange(uint32_t nodeId, Time start, Time duration, WifiPhyState state);
 
@@ -177,13 +177,13 @@
     client->SetRemote(socket);
     m_staNode.Get(0)->AddApplication(client);
     client->SetStartTime(Seconds(0.5));
-    client->SetStopTime(Seconds(1.0));
+    client->SetStopTime(Seconds(1));
 
     auto server = CreateObject<PacketSocketServer>();
     server->SetLocal(socket);
     m_apNode.Get(0)->AddApplication(server);
-    server->SetStartTime(Seconds(0.0));
-    server->SetStopTime(Seconds(1.0));
+    server->SetStartTime(Seconds(0));
+    server->SetStopTime(Seconds(1));
 }
 
 void
@@ -209,7 +209,7 @@
 void
 WifiChannelSwitchingTest::DoRun()
 {
-    Time simulationTime(Seconds(6.0));
+    Time simulationTime(Seconds(6));
 
     RngSeedManager::SetSeed(1);
     RngSeedManager::SetRun(40);
@@ -292,10 +292,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Block Ack Test Suite
+ * @brief Block Ack Test Suite
  */
 class WifiChannelSwitchingTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/test/wifi-co-trace-helper-test.cc ns-3.44/src/wifi/test/wifi-co-trace-helper-test.cc
--- ns-3.43/src/wifi/test/wifi-co-trace-helper-test.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/wifi/test/wifi-co-trace-helper-test.cc	2025-03-09 16:55:49.807372600 -0700
@@ -0,0 +1,788 @@
+/*
+ * Copyright (c) 2024 Indraprastha Institute of Information Technology Delhi
+ * Copyright (c) 2009 University of Washington
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ */
+
+#include "ns3/boolean.h"
+#include "ns3/double.h"
+#include "ns3/eht-configuration.h"
+#include "ns3/enum.h"
+#include "ns3/he-phy.h"
+#include "ns3/integer.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/multi-model-spectrum-channel.h"
+#include "ns3/names.h"
+#include "ns3/node-list.h"
+#include "ns3/object.h"
+#include "ns3/packet-socket-client.h"
+#include "ns3/packet-socket-helper.h"
+#include "ns3/packet-socket-server.h"
+#include "ns3/packet.h"
+#include "ns3/pointer.h"
+#include "ns3/rng-seed-manager.h"
+#include "ns3/spectrum-wifi-helper.h"
+#include "ns3/ssid.h"
+#include "ns3/string.h"
+#include "ns3/test.h"
+#include "ns3/uinteger.h"
+#include "ns3/wifi-co-trace-helper.h"
+#include "ns3/wifi-helper.h"
+#include "ns3/wifi-mac.h"
+#include "ns3/wifi-mpdu.h"
+#include "ns3/wifi-net-device.h"
+#include "ns3/wifi-phy-state.h"
+#include "ns3/wifi-psdu.h"
+#include "ns3/yans-wifi-helper.h"
+
+using namespace ns3;
+NS_LOG_COMPONENT_DEFINE("WifiCoTraceHelperTest");
+
+/**
+ * @ingroup wifi-test
+ * @brief It's a base class with some utility methods for other test cases in this file.
+ */
+class WifiCoTraceHelperBaseTestCase : public TestCase
+{
+  public:
+    /**
+     * Constructor.
+     *
+     * @param testName Name of a test.
+     */
+    WifiCoTraceHelperBaseTestCase(const std::string& testName)
+        : TestCase(testName)
+    {
+    }
+
+  protected:
+    /**
+     * It gets the channel occupancy of a link on a node measured by WifiCoTraceHelper.
+     *
+     * @param nodeId Id of a node.
+     * @param linkId Id of link.
+     * @param coHelper Helper to obtain channel occupancy
+     * @return Statistics measured by WifiCoTraceHelper corresponding to nodeId,linkId.
+     */
+    const std::map<WifiPhyState, Time>& GetChannelOccupancy(size_t nodeId,
+                                                            size_t linkId,
+                                                            WifiCoTraceHelper& coHelper);
+
+    /**
+     * A helper function that sets tid-to-link mapping.
+     *
+     * @param mapping A string that configure tid-to-link mapping.
+     */
+    void ConfigureTidToLinkMapping(const std::string& mapping);
+
+    /**
+     * A helper function that installs PacketSocketServer on a node.
+     *
+     * @param node The node on which the server is installed.
+     * @param startAfter The server starts after a delay of "startAfter" duration.
+     * @param prot The PacketSocketAddress of the server uses "prot" as its protocol number.
+     */
+    void InstallPacketSocketServer(Ptr<Node> node, Time startAfter, size_t prot);
+
+    /**
+     * A helper function that installs PacketSocketClient application on a node.
+     *
+     * @param client The node on which the client is installed.
+     * @param server A node on which PacketSocketServer is installed and to whom the client sends
+     * requests.
+     * @param prot The protocol number used by both the client and the server.
+     * @param startAfter The client starts after a delay of "startAfter" duration.
+     * @param numPkts The client sends these many packets to server immediately.
+     * @param pktLen The length of each packet in bytes.
+     * @param tid The tid of each packet.
+     * @return A pointer to the installed PacketSocketClient application.
+     */
+    Ptr<PacketSocketClient> InstallPacketSocketClient(Ptr<Node> client,
+                                                      Ptr<Node> server,
+                                                      size_t prot,
+                                                      Time startAfter,
+                                                      size_t numPkts,
+                                                      size_t pktLen,
+                                                      size_t tid);
+
+    /**
+     * A helper function that schedules to send given number of packets from one node to another.
+     *
+     * @param from The node which sends the packets.
+     * @param to The node which receives the packets.
+     * @param startAfter The packets are scheduled to send after this much duration.
+     * @param numPkts The number of packets.
+     * @param pktLen The length of each packet in bytes.
+     * @param tid The optional tid of each packet. The default value is "0".
+     */
+    void SchedulePackets(Ptr<Node> from,
+                         Ptr<Node> to,
+                         Time startAfter,
+                         size_t numPkts,
+                         size_t pktLen,
+                         size_t tid);
+
+    /**
+     * A helper function that disables frame aggregation.
+     */
+    void DisableAggregation();
+
+    Time m_simulationStop{Seconds(5.0)}; ///< Instant at which simulation should stop.
+    NodeContainer m_nodes;               ///< Container of all nodes instantiated in this test case.
+    NetDeviceContainer m_devices; ///< Container of all devices instantiated in this test case.
+    size_t protocol =
+        1; ///< A unique Protocol used in each PacketSocketClient and PacketSocketServer pair.
+};
+
+const std::map<WifiPhyState, Time>&
+WifiCoTraceHelperBaseTestCase::GetChannelOccupancy(size_t nodeId,
+                                                   size_t linkId,
+                                                   WifiCoTraceHelper& coHelper)
+{
+    const auto& devRecords = coHelper.GetDeviceRecords();
+    auto senderRecord = std::find_if(devRecords.cbegin(), devRecords.cend(), [nodeId](auto& x) {
+        return x.m_nodeId == nodeId;
+    });
+
+    NS_ASSERT_MSG((senderRecord != devRecords.end()), "Expected statistics for nodeId: " << nodeId);
+
+    auto stats = senderRecord->m_linkStateDurations.find(linkId);
+    auto endItr = senderRecord->m_linkStateDurations.end();
+    NS_ASSERT_MSG((stats != endItr),
+                  "Expected statistics at nodeId: " << nodeId << ", linkId: " << linkId);
+
+    return stats->second;
+}
+
+void
+WifiCoTraceHelperBaseTestCase::ConfigureTidToLinkMapping(const std::string& mapping)
+{
+    for (size_t i = 0; i < m_devices.GetN(); ++i)
+    {
+        auto wifiDevice = DynamicCast<WifiNetDevice>(m_devices.Get(i));
+        wifiDevice->GetMac()->GetEhtConfiguration()->SetAttribute(
+            "TidToLinkMappingNegSupport",
+            EnumValue(WifiTidToLinkMappingNegSupport::ANY_LINK_SET));
+
+        wifiDevice->GetMac()->GetEhtConfiguration()->SetAttribute("TidToLinkMappingUl",
+                                                                  StringValue(mapping));
+    }
+}
+
+/**
+ * Install Packet Socket Server on a node. A Packet Socket client generates an uplink flow and sends
+ * it to the server.
+ */
+void
+WifiCoTraceHelperBaseTestCase::InstallPacketSocketServer(Ptr<Node> node,
+                                                         Time startAfter,
+                                                         size_t prot)
+{
+    Ptr<WifiNetDevice> device = DynamicCast<WifiNetDevice>(node->GetDevice(0));
+    PacketSocketAddress srvAddr;
+    srvAddr.SetSingleDevice(device->GetIfIndex());
+    srvAddr.SetProtocol(prot);
+    auto psServer = CreateObject<PacketSocketServer>();
+    psServer->SetLocal(srvAddr);
+    node->AddApplication(psServer);
+    psServer->SetStartTime(startAfter);
+}
+
+/**
+ * Install packet socket client that generates an uplink flow on a node.
+ */
+Ptr<PacketSocketClient>
+WifiCoTraceHelperBaseTestCase::InstallPacketSocketClient(Ptr<Node> client,
+                                                         Ptr<Node> server,
+                                                         size_t prot,
+                                                         Time startAfter,
+                                                         size_t numPkts,
+                                                         size_t pktLen,
+                                                         size_t tid)
+{
+    NS_LOG_INFO("Start Flow on node:" << client->GetId()
+                                      << " at:" << Simulator::Now() + startAfter);
+
+    Ptr<WifiNetDevice> staDevice = DynamicCast<WifiNetDevice>(client->GetDevice(0));
+    PacketSocketAddress sockAddr;
+    sockAddr.SetSingleDevice(staDevice->GetIfIndex());
+    sockAddr.SetPhysicalAddress(server->GetDevice(0)->GetAddress());
+    sockAddr.SetProtocol(prot);
+
+    auto clientApp = CreateObject<PacketSocketClient>();
+    clientApp->SetAttribute("PacketSize", UintegerValue(pktLen));
+    clientApp->SetAttribute("MaxPackets", UintegerValue(numPkts));
+    clientApp->SetAttribute("Interval", TimeValue(Seconds(0))); // Send packets immediately
+    clientApp->SetAttribute("Priority", UintegerValue(tid));
+    clientApp->SetRemote(sockAddr);
+    clientApp->SetStartTime(startAfter);
+
+    staDevice->GetNode()->AddApplication(clientApp);
+    return clientApp;
+}
+
+void
+WifiCoTraceHelperBaseTestCase::SchedulePackets(Ptr<Node> from,
+                                               Ptr<Node> to,
+                                               Time startDelay,
+                                               size_t numPkts,
+                                               size_t pktLen,
+                                               size_t tid = 0)
+{
+    /* Install a PacketSocket server and client pair with a unique protocol on each invocation. */
+    this->protocol++;
+
+    InstallPacketSocketServer(to, startDelay, this->protocol);
+    InstallPacketSocketClient(from, to, this->protocol, startDelay, numPkts, pktLen, tid);
+}
+
+void
+WifiCoTraceHelperBaseTestCase::DisableAggregation()
+{
+    for (size_t i = 0; i < this->m_nodes.GetN(); i++)
+    {
+        for (uint32_t j = 0; j < this->m_nodes.Get(i)->GetNDevices(); j++)
+        {
+            auto device = DynamicCast<WifiNetDevice>(m_nodes.Get(i)->GetDevice(j));
+            if (!device)
+            {
+                continue;
+            }
+
+            device->GetMac()->SetAttribute("BE_MaxAmpduSize", UintegerValue(0));
+            device->GetMac()->SetAttribute("BK_MaxAmpduSize", UintegerValue(0));
+            device->GetMac()->SetAttribute("VO_MaxAmpduSize", UintegerValue(0));
+            device->GetMac()->SetAttribute("VI_MaxAmpduSize", UintegerValue(0));
+
+            device->GetMac()->SetAttribute("BE_MaxAmsduSize", UintegerValue(0));
+            device->GetMac()->SetAttribute("BK_MaxAmsduSize", UintegerValue(0));
+            device->GetMac()->SetAttribute("VO_MaxAmsduSize", UintegerValue(0));
+            device->GetMac()->SetAttribute("VI_MaxAmsduSize", UintegerValue(0));
+        }
+    }
+}
+
+/**
+ * @ingroup wifi-test
+ * @brief Send one packet from one WifiNetDevice to other.
+ *
+ * This test case sends a single packet from one wifi device to another, operating in Adhoc mode,
+ * and compares the TX duration measured by WifiCoTraceHelper with the analytically calculated
+ * value.
+ */
+class SendOnePacketTestCase : public WifiCoTraceHelperBaseTestCase
+{
+  public:
+    /** Constructor. */
+    SendOnePacketTestCase();
+
+  private:
+    /** Executes test case and assertions. */
+    void DoRun() override;
+    /** Setup test case's scenario. */
+    void DoSetup() override;
+};
+
+SendOnePacketTestCase::SendOnePacketTestCase()
+    : WifiCoTraceHelperBaseTestCase(
+          "SendOnePacketTestCase: Send one packet from one WifiNetDevice to other.")
+{
+}
+
+void
+SendOnePacketTestCase::DoRun()
+{
+    size_t senderNodeId = 1;
+    size_t recNodeId = 0;
+    Ptr<Node> sender = m_nodes.Get(senderNodeId);
+    Ptr<Node> receiver = m_nodes.Get(recNodeId);
+
+    // Send a packet to initiate one-time control frame exchanges in Adhoc mode.
+    // To avoid one-time control frames, we will not measure channel occupancy during transmission
+    // of this packet.
+    SchedulePackets(sender, receiver, Seconds(0.5), 1 /*num of packets*/, 1000 /*packet length*/);
+
+    // Send a packet that requires only one symbol to transmit and measure its channel occupancy.
+    /**
+     * Size of frame in Bytes = 204 (payload) + 34 (Mac & Phy Headers) = 238
+     * Frame Size in bits + Phy service and tail bits = 238*8 + 22 = 1926
+     * Phy rate at MCS 11, 40 MHz, 800 ns GI, 1 spatial stream = 286.6 Mbps
+     * Symbol duration = 12.8 + 0.8 = 13.6 us
+     * Number of symbols = ceil(1926 / (286.6 * 13.6)) = 1
+     */
+    Time scheduleAt{Seconds(1.0)};
+    size_t packetLen = 200; /*In Bytes*/
+    SchedulePackets(sender, receiver, scheduleAt, 1 /*num of packets*/, packetLen);
+    WifiCoTraceHelper helper1{scheduleAt, scheduleAt + Seconds(0.1)};
+    helper1.Enable(m_nodes);
+
+    // Send a packet that requires two symbols to transmit and measure its channel occupancy.
+    /**
+     * If we replace payload size from 204 to 504 in the above calculation in comments, then number
+     * of symbols equals 2.
+     * Number of symbols = ceil(4326 / (286.6 * 13.6)) = 2
+     */
+    scheduleAt = Seconds(1.5);
+    packetLen = 500; /*In Bytes*/
+    SchedulePackets(sender, receiver, scheduleAt, 1 /*num of packets*/, packetLen);
+    WifiCoTraceHelper helper2{scheduleAt, scheduleAt + Seconds(0.1)};
+    helper2.Enable(m_nodes);
+
+    // Send a packet that requires three symbols to transmit and measure its channel occupancy.
+    /**
+     * If we replace payload size from 204 to 1004 in the above calculation in comments, then number
+     * of symbols equals 3.
+     * Number of symbols = ceil(8326 / (286.6 * 13.6)) = 2
+     */
+    scheduleAt = Seconds(2.0);
+    packetLen = 1000; /*In Bytes*/
+    SchedulePackets(sender, receiver, scheduleAt, 1 /*num of packets*/, packetLen);
+    WifiCoTraceHelper helper3{scheduleAt, scheduleAt + Seconds(0.1)};
+    helper3.Enable(m_nodes);
+
+    Simulator::Stop(Seconds(2.5));
+
+    Simulator::Run();
+    Simulator::Destroy();
+
+    /**
+     * Data Packet
+     * ===========
+     * Preamble Duration = 48 us
+     * Symbol Duration = 12.8 + 0.8 (Guard Interval) = 13.6 us
+     * Tx Duration of a packet requiring 1 symbol  = (1 * 13.6) + 48 = 61.6 us
+     * Tx Duration of a packet requiring 2 symbols = (2 * 13.6) + 48 = 75.2 us
+     * Tx Duration of a packet requiring 3 symbols = (3 * 13.6) + 48 = 88.8 us
+     */
+
+    auto map1 = GetChannelOccupancy(senderNodeId, 0 /*linkId*/, helper1);
+    NS_TEST_ASSERT_MSG_EQ(map1.at(WifiPhyState::TX),
+                          NanoSeconds(61600),
+                          "TX duration does not match");
+
+    auto map2 = GetChannelOccupancy(senderNodeId, 0 /*linkId*/, helper2);
+    NS_TEST_ASSERT_MSG_EQ(map2.at(WifiPhyState::TX),
+                          NanoSeconds(75200),
+                          "TX duration does not match");
+
+    auto map3 = GetChannelOccupancy(senderNodeId, 0 /*linkId*/, helper3);
+    NS_TEST_ASSERT_MSG_EQ(map3.at(WifiPhyState::TX),
+                          NanoSeconds(88800),
+                          "TX duration does not match");
+
+    /**
+     * Acknowledgement Packet
+     * ======================
+     * Preamble Duration = 20 us
+     * Symbol Duration = 4 us
+     * Number of symbols = 2
+     * Tx Duration of Ack packet = 2*4 + 20 = 28 us
+     */
+    auto ackMap = GetChannelOccupancy(recNodeId, 0 /*linkId*/, helper1);
+    NS_TEST_ASSERT_MSG_EQ(ackMap.at(WifiPhyState::TX),
+                          NanoSeconds(28000),
+                          "TX duration does not match");
+}
+
+void
+SendOnePacketTestCase::DoSetup()
+{
+    std::string mcs{"11"};
+
+    uint32_t nWifi = 2;
+    m_nodes.Create(nWifi);
+
+    WifiMacHelper mac;
+    Ssid ssid = Ssid("ns-3-ssid");
+
+    WifiHelper wifi;
+    wifi.SetStandard(WIFI_STANDARD_80211be);
+
+    // Create multiple spectrum channels
+    Ptr<MultiModelSpectrumChannel> spectrumChannel5Ghz = CreateObject<MultiModelSpectrumChannel>();
+
+    SpectrumWifiPhyHelper phy(1);
+    phy.SetPcapDataLinkType(WifiPhyHelper::DLT_IEEE802_11_RADIO);
+    phy.AddChannel(spectrumChannel5Ghz, WIFI_SPECTRUM_5_GHZ);
+
+    // configure operating channel for each link
+    phy.Set(0, "ChannelSettings", StringValue("{0, 40, BAND_5GHZ, 0}"));
+
+    uint8_t linkId = 0;
+    wifi.SetRemoteStationManager(linkId,
+                                 "ns3::ConstantRateWifiManager",
+                                 "DataMode",
+                                 StringValue("EhtMcs" + mcs),
+                                 "ControlMode",
+                                 StringValue("OfdmRate24Mbps"));
+
+    mac.SetType("ns3::AdhocWifiMac");
+    m_devices = wifi.Install(phy, mac, m_nodes);
+
+    MobilityHelper mobility;
+    Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator>();
+    positionAlloc->Add(Vector(0.0, 0.0, 0.0));
+    auto distance = 0.1;
+    positionAlloc->Add(Vector(distance, 0.0, 0.0));
+    mobility.SetPositionAllocator(positionAlloc);
+    mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
+    mobility.Install(m_nodes);
+
+    /* Disable aggregation and set guard interval */
+    DisableAggregation();
+    int gi = 800; // Guard Interval in nano seconds
+    Config::Set("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/HeConfiguration/GuardInterval",
+                TimeValue(NanoSeconds(gi)));
+
+    PacketSocketHelper helper;
+    helper.Install(m_nodes);
+}
+
+/**
+ * @ingroup wifi-test
+ * @brief Trace channel occupany on each link of MLDs
+ *
+ * This test case sends a packet on each link of a MLD and asserts that WifiCoTraceHelper measures
+ * TX duration correctly on every link. It uses tid-to-link mapping to schedule a packet to a
+ * specific link.
+ *
+ */
+class MLOTestCase : public WifiCoTraceHelperBaseTestCase
+{
+  public:
+    /** Constructor. */
+    MLOTestCase();
+
+  private:
+    void DoRun() override;
+    void DoSetup() override;
+};
+
+MLOTestCase::MLOTestCase()
+    : WifiCoTraceHelperBaseTestCase(
+          "MLOTestCase: Track channel occupancy on multiple links of a multi-link device (MLD).")
+{
+}
+
+void
+MLOTestCase::DoRun()
+{
+    /* Configure tid-to-link mapping such that packets with different tids are sent on different
+     * links. */
+    ConfigureTidToLinkMapping("0 0; 1,2,3,4,5,6,7 1");
+
+    size_t senderNodeId = 1;
+    size_t recNodeId = 0;
+    Ptr<Node> sender = m_nodes.Get(senderNodeId);
+    Ptr<Node> receiver = m_nodes.Get(recNodeId);
+
+    SchedulePackets(sender, receiver, Seconds(0.5), 1, 1000, 0 /*tid*/);
+    SchedulePackets(sender, receiver, Seconds(0.5), 1, 1000, 3 /*tid*/);
+
+    // Send a packet with tid '0' and measure channel occupancy.
+    Time scheduleAt = Seconds(1.05);
+    size_t tid = 0;
+    SchedulePackets(sender, receiver, scheduleAt, 1 /*num of packets*/, 1000 /*Bytes*/, tid);
+    WifiCoTraceHelper helper0{scheduleAt, scheduleAt + Seconds(0.01)};
+    helper0.Enable(m_nodes);
+
+    // Send a packet with tid '3' and measure channel occupancy.
+    scheduleAt = Seconds(2.0);
+    tid = 3;
+    SchedulePackets(sender, receiver, scheduleAt, 1 /*num of packets*/, 1000 /*Bytes*/, tid);
+    WifiCoTraceHelper helper1{scheduleAt, scheduleAt + Seconds(0.1)};
+    helper1.Enable(m_nodes);
+
+    Simulator::Stop(Seconds(3.5));
+
+    Simulator::Run();
+
+    std::cout << "## MLOTestCase: Tid 0 Packet ##\n";
+    helper0.PrintStatistics(std::cout);
+    std::cout << "## MLOTestCase: Tid 3 Packet ##\n";
+    helper1.PrintStatistics(std::cout);
+
+    /* Assert TX time for each packet matches analytically compuated value of 88.8 us. Refer
+     * SendOnePacketTestCase above for the analytical calculation of TX time of 88.8 us.*/
+    // Assert on link 0
+    auto map0 = GetChannelOccupancy(senderNodeId, 0 /*linkId*/, helper0);
+    NS_TEST_ASSERT_MSG_EQ(map0.at(WifiPhyState::TX),
+                          NanoSeconds(88800),
+                          "TX duration does not match");
+
+    // Assert on link 1
+    auto map1 = GetChannelOccupancy(senderNodeId, 1 /*linkId*/, helper1);
+    NS_TEST_ASSERT_MSG_EQ(map1.at(WifiPhyState::TX),
+                          NanoSeconds(88800),
+                          "TX duration does not match");
+
+    Simulator::Destroy();
+}
+
+void
+MLOTestCase::DoSetup()
+{
+    // LogComponentEnable("WifiCoTraceHelper", LOG_LEVEL_INFO);
+    RngSeedManager::SetSeed(1);
+
+    NodeContainer ap;
+    ap.Create(1);
+
+    uint32_t nWifi = 1;
+    NodeContainer sta;
+    sta.Create(nWifi);
+
+    m_nodes.Add(ap);
+    m_nodes.Add(sta);
+
+    WifiMacHelper mac;
+    Ssid ssid = Ssid("ns-3-ssid");
+
+    WifiHelper wifi;
+    wifi.SetStandard(WIFI_STANDARD_80211be);
+
+    // Create multiple spectrum channels
+    Ptr<MultiModelSpectrumChannel> spectrumChannel5Ghz = CreateObject<MultiModelSpectrumChannel>();
+    Ptr<MultiModelSpectrumChannel> spectrumChannel6Ghz = CreateObject<MultiModelSpectrumChannel>();
+
+    // SpectrumWifiPhyHelper (3 links)
+    SpectrumWifiPhyHelper phy(2);
+    phy.SetPcapDataLinkType(WifiPhyHelper::DLT_IEEE802_11_RADIO);
+    phy.AddChannel(spectrumChannel5Ghz, WIFI_SPECTRUM_5_GHZ);
+    phy.AddChannel(spectrumChannel6Ghz, WIFI_SPECTRUM_6_GHZ);
+
+    // configure operating channel for each link
+    phy.Set(0, "ChannelSettings", StringValue("{0, 40, BAND_5GHZ, 0}"));
+    phy.Set(1, "ChannelSettings", StringValue("{0, 40, BAND_6GHZ, 0}"));
+
+    // configure rate manager for each link
+    uint8_t linkId = 0;
+    wifi.SetRemoteStationManager(linkId,
+                                 "ns3::ConstantRateWifiManager",
+                                 "DataMode",
+                                 StringValue("EhtMcs11"),
+                                 "ControlMode",
+                                 StringValue("OfdmRate24Mbps"));
+    wifi.SetRemoteStationManager(1,
+                                 "ns3::ConstantRateWifiManager",
+                                 "DataMode",
+                                 StringValue("EhtMcs11"),
+                                 "ControlMode",
+                                 StringValue("OfdmRate24Mbps"));
+
+    mac.SetType("ns3::ApWifiMac", "Ssid", SsidValue(ssid));
+    m_devices.Add(wifi.Install(phy, mac, ap));
+    mac.SetType("ns3::StaWifiMac", "Ssid", SsidValue(ssid), "ActiveProbing", BooleanValue(false));
+    m_devices.Add(wifi.Install(phy, mac, sta));
+
+    MobilityHelper mobility;
+    Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator>();
+
+    positionAlloc->Add(Vector(0.0, 0.0, 0.0));
+    auto distance = 1;
+    positionAlloc->Add(Vector(distance, 0.0, 0.0));
+    mobility.SetPositionAllocator(positionAlloc);
+
+    mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
+    mobility.Install(m_nodes);
+
+    /* Disable aggregation and set guard interval */
+    DisableAggregation();
+    int gi = 800; // Guard Interval in nano seconds
+    Config::Set("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/HeConfiguration/GuardInterval",
+                TimeValue(NanoSeconds(gi)));
+
+    PacketSocketHelper helper;
+    helper.Install(m_nodes);
+}
+
+/**
+ * @ingroup wifi-test
+ * @brief LinkId of non-AP MLD changes after MLO setup.
+ *
+ * This test case configures one AP MLD with three links and one non-AP MLD with two links. Ngon-AP
+ * MLD swaps (i.e., renames) its link after MLO setup. It asserts that WifiCoTraceHelper should
+ * capture statistics of the renamed link.
+ */
+class LinkRenameTestCase : public WifiCoTraceHelperBaseTestCase
+{
+  public:
+    /** Constructor. */
+    LinkRenameTestCase();
+
+  private:
+    void DoRun() override;
+    void DoSetup() override;
+};
+
+LinkRenameTestCase::LinkRenameTestCase()
+    : WifiCoTraceHelperBaseTestCase(
+          "LinkRenameTestCase: WifiCoTraceHelper should record statistics under new LinkId.")
+{
+}
+
+void
+LinkRenameTestCase::DoRun()
+{
+    // Adding nodes to wificohelper
+    WifiCoTraceHelper coHelper;
+    coHelper.Stop(m_simulationStop);
+    coHelper.Enable(m_nodes);
+    auto staNodeId = 1;
+
+    SchedulePackets(m_nodes.Get(1), m_nodes.Get(0), Seconds(2.0), 1000, 1000);
+    Simulator::Stop(m_simulationStop);
+
+    Simulator::Run();
+    Simulator::Destroy();
+
+    std::cout << "## LinkRenameTestCase ##\n";
+    coHelper.PrintStatistics(std::cout);
+
+    auto staStatistics = coHelper.GetDeviceRecords().at(staNodeId).m_linkStateDurations;
+
+    // Note that sta has only two phys. So, a linkId of '2' is created by renaming one of the
+    // existing links.
+    auto renamedLinkId = 2;
+    auto it = staStatistics.find(renamedLinkId);
+    NS_TEST_ASSERT_MSG_EQ((it != staStatistics.end()),
+                          true,
+                          "Link: " << renamedLinkId << " isn't present at non-AP MLD");
+}
+
+void
+LinkRenameTestCase::DoSetup()
+{
+    // LogComponentEnable("WifiCoTraceHelper", LOG_LEVEL_DEBUG);
+
+    m_simulationStop = Seconds(3);
+
+    NodeContainer ap;
+    ap.Create(1);
+
+    uint32_t nWifi = 1;
+    NodeContainer sta;
+    sta.Create(nWifi);
+
+    m_nodes.Add(ap);
+    m_nodes.Add(sta);
+
+    WifiMacHelper mac;
+    Ssid ssid = Ssid("ns-3-ssid");
+
+    // Create multiple spectrum channels
+    Ptr<MultiModelSpectrumChannel> spectrumChannel2_4Ghz =
+        CreateObject<MultiModelSpectrumChannel>();
+    Ptr<MultiModelSpectrumChannel> spectrumChannel5Ghz = CreateObject<MultiModelSpectrumChannel>();
+
+    // SpectrumWifiPhyHelper (2 links)
+    SpectrumWifiPhyHelper nonApPhyHelper(2);
+    nonApPhyHelper.SetPcapDataLinkType(WifiPhyHelper::DLT_IEEE802_11_RADIO);
+    nonApPhyHelper.AddChannel(spectrumChannel5Ghz, WIFI_SPECTRUM_5_GHZ);
+    nonApPhyHelper.AddChannel(spectrumChannel5Ghz, WIFI_SPECTRUM_5_GHZ);
+
+    // configure operating channel for each link
+    nonApPhyHelper.Set(0, "ChannelSettings", StringValue("{42, 80, BAND_5GHZ, 0}"));
+    nonApPhyHelper.Set(1, "ChannelSettings", StringValue("{0, 80, BAND_5GHZ, 0}"));
+
+    nonApPhyHelper.Set("FixedPhyBand", BooleanValue(true));
+
+    WifiHelper nonApWifiHelper;
+    nonApWifiHelper.SetStandard(WIFI_STANDARD_80211be);
+
+    // configure rate manager for each link
+    uint8_t firstLinkId = 0;
+    nonApWifiHelper.SetRemoteStationManager(firstLinkId,
+                                            "ns3::ConstantRateWifiManager",
+                                            "DataMode",
+                                            StringValue("EhtMcs9"),
+                                            "ControlMode",
+                                            StringValue("EhtMcs9"));
+    nonApWifiHelper.SetRemoteStationManager(1,
+                                            "ns3::ConstantRateWifiManager",
+                                            "DataMode",
+                                            StringValue("EhtMcs9"),
+                                            "ControlMode",
+                                            StringValue("EhtMcs9"));
+
+    SpectrumWifiPhyHelper apPhyHelper(3);
+    apPhyHelper.SetPcapDataLinkType(WifiPhyHelper::DLT_IEEE802_11_RADIO);
+    apPhyHelper.AddChannel(spectrumChannel2_4Ghz, WIFI_SPECTRUM_2_4_GHZ);
+    apPhyHelper.AddChannel(spectrumChannel5Ghz, WIFI_SPECTRUM_5_GHZ);
+    apPhyHelper.AddChannel(spectrumChannel5Ghz, WIFI_SPECTRUM_5_GHZ);
+
+    // configure operating channel for each link
+    apPhyHelper.Set(0, "ChannelSettings", StringValue("{6, 40, BAND_2_4GHZ, 0}"));
+    apPhyHelper.Set(1, "ChannelSettings", StringValue("{42, 80, BAND_5GHZ, 0}"));
+    apPhyHelper.Set(2, "ChannelSettings", StringValue("{0, 0, BAND_5GHZ, 0}"));
+
+    apPhyHelper.Set("FixedPhyBand", BooleanValue(true));
+
+    WifiHelper apWifiHelper;
+    apWifiHelper.SetStandard(WIFI_STANDARD_80211be);
+
+    apWifiHelper.SetRemoteStationManager(firstLinkId,
+                                         "ns3::ConstantRateWifiManager",
+                                         "DataMode",
+                                         StringValue("EhtMcs9"),
+                                         "ControlMode",
+                                         StringValue("EhtMcs9"));
+    apWifiHelper.SetRemoteStationManager(1,
+                                         "ns3::ConstantRateWifiManager",
+                                         "DataMode",
+                                         StringValue("EhtMcs9"),
+                                         "ControlMode",
+                                         StringValue("EhtMcs9"));
+    apWifiHelper.SetRemoteStationManager(2,
+                                         "ns3::ConstantRateWifiManager",
+                                         "DataMode",
+                                         StringValue("EhtMcs9"),
+                                         "ControlMode",
+                                         StringValue("EhtMcs9"));
+
+    mac.SetType("ns3::ApWifiMac", "Ssid", SsidValue(ssid), "BeaconGeneration", BooleanValue(true));
+    m_devices.Add(apWifiHelper.Install(apPhyHelper, mac, ap));
+
+    mac.SetType("ns3::StaWifiMac", "Ssid", SsidValue(ssid), "ActiveProbing", BooleanValue(true));
+    m_devices.Add(nonApWifiHelper.Install(nonApPhyHelper, mac, sta));
+
+    MobilityHelper mobility;
+    Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator>();
+
+    positionAlloc->Add(Vector(0.0, 0.0, 0.0));
+    auto distance = 0.1;
+    positionAlloc->Add(Vector(distance, 0.0, 0.0));
+    mobility.SetPositionAllocator(positionAlloc);
+
+    mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
+    mobility.Install(m_nodes);
+
+    PacketSocketHelper helper;
+    helper.Install(m_nodes);
+}
+
+/**
+ * @ingroup wifi-test
+ * @brief Wifi Channel Occupancy Helper Test Suite
+ */
+class WifiCoHelperTestSuite : public TestSuite
+{
+  public:
+    /** Constructor. */
+    WifiCoHelperTestSuite();
+};
+
+WifiCoHelperTestSuite::WifiCoHelperTestSuite()
+    : TestSuite("wifi-co-trace-helper", Type::UNIT)
+{
+    AddTestCase(new SendOnePacketTestCase, TestCase::Duration::QUICK);
+    AddTestCase(new MLOTestCase, TestCase::Duration::QUICK);
+    AddTestCase(new LinkRenameTestCase, TestCase::Duration::QUICK);
+}
+
+/**
+ * @ingroup wifi-test
+ * WifiCoHelperTestSuite instance variable.
+ */
+static WifiCoHelperTestSuite g_WifiCoHelperTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/test/wifi-dynamic-bw-op-test.cc ns-3.44/src/wifi/test/wifi-dynamic-bw-op-test.cc
--- ns-3.43/src/wifi/test/wifi-dynamic-bw-op-test.cc	2024-10-09 16:41:10.136656800 -0700
+++ ns-3.44/src/wifi/test/wifi-dynamic-bw-op-test.cc	2025-03-09 16:55:49.807372600 -0700
@@ -27,8 +27,8 @@
 NS_LOG_COMPONENT_DEFINE("WifiDynamicBwOpTestSuite");
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
  * Two BSSes, each with one AP and one non-AP STA, are configured to operate on
  * different channels. Specifically, the operating channel of BSS 1 is the secondary<X>
@@ -42,25 +42,25 @@
     /**
      * Constructor
      *
-     * \param channelStr channel setting strings for BSS 0 and BSS 1
-     * \param bss0Width width of the transmission in BSS 0 started when BSS 1 is transmitting
+     * @param channelStr channel setting strings for BSS 0 and BSS 1
+     * @param bss0Width width of the transmission in BSS 0 started when BSS 1 is transmitting
      */
     WifiUseAvailBwTest(std::initializer_list<std::string> channelStr, MHz_u bss0Width);
     ~WifiUseAvailBwTest() override;
 
     /**
      * Function to trace packets received by the server application in the given BSS
-     * \param bss the given BSS
-     * \param p the packet
-     * \param addr the address
+     * @param bss the given BSS
+     * @param p the packet
+     * @param addr the address
      */
     void L7Receive(uint8_t bss, Ptr<const Packet> p, const Address& addr);
     /**
      * Callback invoked when a PHY receives a PSDU to transmit
-     * \param bss the BSS the PSDU belongs to
-     * \param psduMap the PSDU map
-     * \param txVector the TX vector
-     * \param txPowerW the tx power in Watts
+     * @param bss the BSS the PSDU belongs to
+     * @param psduMap the PSDU map
+     * @param txVector the TX vector
+     * @param txPowerW the tx power in Watts
      */
     void Transmit(uint8_t bss, WifiConstPsduMap psduMap, WifiTxVector txVector, double txPowerW);
     /**
@@ -154,8 +154,8 @@
         client->SetAttribute("Interval", TimeValue(MicroSeconds(0)));
         client->SetRemote(m_sockets[0]);
         m_apDevices.Get(0)->GetNode()->AddApplication(client);
-        client->SetStartTime(Seconds(0));  // start now
-        client->SetStopTime(Seconds(1.0)); // stop in a second
+        client->SetStartTime(Seconds(0)); // start now
+        client->SetStopTime(Seconds(1));  // stop in a second
         client->Initialize();
 
         // after 1us (to allow for propagation delay), the largest idle primary
@@ -266,7 +266,7 @@
         client1->SetRemote(m_sockets[bss]);
         wifiApNodes.Get(bss)->AddApplication(client1);
         client1->SetStartTime(Seconds(0.5) + bss * MilliSeconds(500));
-        client1->SetStopTime(Seconds(2.0));
+        client1->SetStopTime(Seconds(2));
 
         // At time 1.5, start a transmission in BSS 1
         if (bss == 1)
@@ -278,14 +278,14 @@
             client2->SetRemote(m_sockets[bss]);
             wifiApNodes.Get(bss)->AddApplication(client2);
             client2->SetStartTime(Seconds(1.5));
-            client2->SetStopTime(Seconds(2.0));
+            client2->SetStopTime(Seconds(2));
         }
 
         Ptr<PacketSocketServer> server = CreateObject<PacketSocketServer>();
         server->SetLocal(m_sockets[bss]);
         wifiStaNodes.Get(bss)->AddApplication(server);
-        server->SetStartTime(Seconds(0.0));
-        server->SetStopTime(Seconds(2.0));
+        server->SetStartTime(Seconds(0));
+        server->SetStopTime(Seconds(2));
 
         // Trace received packets on non-AP STAs
         Config::ConnectWithoutContext("/NodeList/" + std::to_string(2 + bss) +
@@ -407,10 +407,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief wifi dynamic bandwidth operation Test Suite
+ * @brief wifi dynamic bandwidth operation Test Suite
  */
 class WifiDynamicBwOpTestSuite : public TestSuite
 {
@@ -431,8 +431,9 @@
      *  BSS 1   │   52   │
      *          └────────┘
      */
-    AddTestCase(new WifiUseAvailBwTest({"{54, 40, BAND_5GHZ, 1}", "{52, 20, BAND_5GHZ, 0}"}, 20),
-                TestCase::Duration::QUICK);
+    AddTestCase(
+        new WifiUseAvailBwTest({"{54, 40, BAND_5GHZ, 1}", "{52, 20, BAND_5GHZ, 0}"}, MHz_u{20}),
+        TestCase::Duration::QUICK);
     /**
      *           ─── primary 40 ───
      *           primary20
@@ -445,8 +446,9 @@
      *                            └────────┴────────┘
      *                                      primary20
      */
-    AddTestCase(new WifiUseAvailBwTest({"{58, 80, BAND_5GHZ, 0}", "{62, 40, BAND_5GHZ, 1}"}, 40),
-                TestCase::Duration::QUICK);
+    AddTestCase(
+        new WifiUseAvailBwTest({"{58, 80, BAND_5GHZ, 0}", "{62, 40, BAND_5GHZ, 1}"}, MHz_u{40}),
+        TestCase::Duration::QUICK);
     /**
      *                                               ─────────── primary 80 ───────────
      *                                                       primary20
@@ -459,8 +461,9 @@
      *          └────────┴────────┴────────┴────────┘
      *                             primary20
      */
-    AddTestCase(new WifiUseAvailBwTest({"{50, 160, BAND_5GHZ, 5}", "{42, 80, BAND_5GHZ, 2}"}, 80),
-                TestCase::Duration::QUICK);
+    AddTestCase(
+        new WifiUseAvailBwTest({"{50, 160, BAND_5GHZ, 5}", "{42, 80, BAND_5GHZ, 2}"}, MHz_u{80}),
+        TestCase::Duration::QUICK);
 }
 
 static WifiDynamicBwOpTestSuite g_wifiDynamicBwOpTestSuite; ///< the test suite
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/test/wifi-eht-info-elems-test.cc ns-3.44/src/wifi/test/wifi-eht-info-elems-test.cc
--- ns-3.43/src/wifi/test/wifi-eht-info-elems-test.cc	2024-10-09 16:41:10.136656800 -0700
+++ ns-3.44/src/wifi/test/wifi-eht-info-elems-test.cc	2025-03-09 16:55:49.807372600 -0700
@@ -27,10 +27,10 @@
 NS_LOG_COMPONENT_DEFINE("WifiEhtInfoElemsTest");
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test Multi-Link Element (Basic variant) serialization and deserialization
+ * @brief Test Multi-Link Element (Basic variant) serialization and deserialization
  */
 class BasicMultiLinkElementTest : public HeaderSerializationTestCase
 {
@@ -45,9 +45,9 @@
      * Get a Multi-Link Element including the given Common Info field and the
      * given Per-STA Profile Subelements
      *
-     * \param commonInfo the given Common Info field
-     * \param subelements the given set of Per-STA Profile Subelements
-     * \return a Multi-Link Element
+     * @param commonInfo the given Common Info field
+     * @param subelements the given set of Per-STA Profile Subelements
+     * @return a Multi-Link Element
      */
     MultiLinkElement GetMultiLinkElement(
         const CommonInfoBasicMle& commonInfo,
@@ -583,10 +583,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test Reduced Neighbor Report serialization and deserialization
+ * @brief Test Reduced Neighbor Report serialization and deserialization
  */
 class ReducedNeighborReportTest : public HeaderSerializationTestCase
 {
@@ -603,10 +603,10 @@
     /**
      * Get a Reduced Neighbor Report element including the given operating channels
      *
-     * \param channel2_4It a channel in the 2.4 GHz band
-     * \param channel5It a channel in the 5 GHz band
-     * \param channel6It a channel in the 6 GHz band
-     * \return a Reduced Neighbor Report element
+     * @param channel2_4It a channel in the 2.4 GHz band
+     * @param channel5It a channel in the 5 GHz band
+     * @param channel6It a channel in the 6 GHz band
+     * @return a Reduced Neighbor Report element
      */
     ReducedNeighborReport GetReducedNeighborReport(PhyOpChannelIt channel2_4It,
                                                    PhyOpChannelIt channel5It,
@@ -649,7 +649,7 @@
         rnr.SetShortSsid(nbrId, 0, 0);
         rnr.SetBssParameters(nbrId, 0, 10);
         rnr.SetPsd20MHz(nbrId, 0, 50);
-        rnr.SetMldParameters(nbrId, 0, 0, 2, 3);
+        rnr.SetMldParameters(nbrId, 0, {0, 2, 3, 1, 1});
     }
 
     if (channel5It != WifiPhyOperatingChannel::m_frequencyChannels.cend())
@@ -666,14 +666,14 @@
         rnr.SetShortSsid(nbrId, 0, 0);
         rnr.SetBssParameters(nbrId, 0, 20);
         rnr.SetPsd20MHz(nbrId, 0, 60);
-        rnr.SetMldParameters(nbrId, 0, 0, 3, 4);
+        rnr.SetMldParameters(nbrId, 0, {0, 3, 4, 0, 1});
         // Add another TBTT Information Field
         rnr.AddTbttInformationField(nbrId);
         rnr.SetBssid(nbrId, 1, Mac48Address("00:00:00:00:01:05"));
         rnr.SetShortSsid(nbrId, 1, 0);
         rnr.SetBssParameters(nbrId, 1, 30);
         rnr.SetPsd20MHz(nbrId, 1, 70);
-        rnr.SetMldParameters(nbrId, 1, 0, 4, 5);
+        rnr.SetMldParameters(nbrId, 1, {0, 4, 5, 1, 0});
     }
 
     if (channel6It != WifiPhyOperatingChannel::m_frequencyChannels.cend())
@@ -690,7 +690,7 @@
         rnr.SetShortSsid(nbrId, 0, 0);
         rnr.SetBssParameters(nbrId, 0, 40);
         rnr.SetPsd20MHz(nbrId, 0, 80);
-        rnr.SetMldParameters(nbrId, 0, 0, 5, 6);
+        rnr.SetMldParameters(nbrId, 0, {0, 5, 6, 0, 0});
     }
 
     NS_LOG_DEBUG(info.str());
@@ -713,8 +713,8 @@
         if (channel2_4It != WifiPhyOperatingChannel::m_frequencyChannels.cend())
         {
             channel2_4It = WifiPhyOperatingChannel::FindFirst(0,
-                                                              0,
-                                                              0,
+                                                              MHz_u{0},
+                                                              MHz_u{0},
                                                               WIFI_STANDARD_80211be,
                                                               WIFI_PHY_BAND_2_4GHZ,
                                                               channel2_4It);
@@ -722,8 +722,8 @@
         if (channel5It != WifiPhyOperatingChannel::m_frequencyChannels.cend())
         {
             channel5It = WifiPhyOperatingChannel::FindFirst(0,
-                                                            0,
-                                                            0,
+                                                            MHz_u{0},
+                                                            MHz_u{0},
                                                             WIFI_STANDARD_80211be,
                                                             WIFI_PHY_BAND_5GHZ,
                                                             channel5It);
@@ -731,8 +731,8 @@
         if (channel6It != WifiPhyOperatingChannel::m_frequencyChannels.cend())
         {
             channel6It = WifiPhyOperatingChannel::FindFirst(0,
-                                                            0,
-                                                            0,
+                                                            MHz_u{0},
+                                                            MHz_u{0},
                                                             WIFI_STANDARD_80211be,
                                                             WIFI_PHY_BAND_6GHZ,
                                                             channel6It);
@@ -757,18 +757,18 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test serialization and deserialization of EHT capabilities IE
+ * @brief Test serialization and deserialization of EHT capabilities IE
  */
 class WifiEhtCapabilitiesIeTest : public HeaderSerializationTestCase
 {
   public:
     /**
      * Constructor
-     * \param is2_4Ghz whether the PHY is operating in 2.4 GHz
-     * \param channelWidth the supported channel width
+     * @param is2_4Ghz whether the PHY is operating in 2.4 GHz
+     * @param channelWidth the supported channel width
      */
     WifiEhtCapabilitiesIeTest(bool is2_4Ghz, MHz_u channelWidth);
     ~WifiEhtCapabilitiesIeTest() override = default;
@@ -776,17 +776,17 @@
     /**
      * Generate the HE capabilities IE.
      *
-     * \return the generated HE capabilities IE
+     * @return the generated HE capabilities IE
      */
     HeCapabilities GetHeCapabilities() const;
 
     /**
      * Generate the EHT capabilities IE.
      *
-     * \param maxMpduLength the maximum MPDU length in bytes
-     * \param maxAmpduSize the maximum A-MPDU size in bytes
-     * \param maxSupportedMcs the maximum EHT MCS supported by the PHY
-     * \return the generated EHT capabilities IE
+     * @param maxMpduLength the maximum MPDU length in bytes
+     * @param maxAmpduSize the maximum A-MPDU size in bytes
+     * @param maxSupportedMcs the maximum EHT MCS supported by the PHY
+     * @return the generated EHT capabilities IE
      */
     EhtCapabilities GetEhtCapabilities(uint16_t maxMpduLength,
                                        uint32_t maxAmpduSize,
@@ -795,41 +795,41 @@
     /**
      * Serialize the EHT capabilities in a buffer.
      *
-     * \param ehtCapabilities the EHT capabilities
-     * \return the buffer in which the EHT capabilities has been serialized
+     * @param ehtCapabilities the EHT capabilities
+     * @return the buffer in which the EHT capabilities has been serialized
      */
     Buffer SerializeIntoBuffer(const EhtCapabilities& ehtCapabilities);
 
     /**
      * Check that the given buffer contains the given value at the given position.
      *
-     * \param buffer the given buffer
-     * \param position the given position (starting at 0)
-     * \param value the given value
+     * @param buffer the given buffer
+     * @param position the given position (starting at 0)
+     * @param value the given value
      */
     void CheckSerializedByte(const Buffer& buffer, uint32_t position, uint8_t value);
 
     /**
      * Check the content of the EHT MAC Capabilities Information subfield.
      *
-     * \param buffer the buffer containing the serialized EHT capabilities
-     * \param expectedValueFirstByte the expected value for the first byte
+     * @param buffer the buffer containing the serialized EHT capabilities
+     * @param expectedValueFirstByte the expected value for the first byte
      */
     void CheckEhtMacCapabilitiesInformation(const Buffer& buffer, uint8_t expectedValueFirstByte);
 
     /**
      * Check the content of the EHT PHY Capabilities Information subfield.
      *
-     * \param buffer the buffer containing the serialized EHT capabilities
-     * \param expectedValueSixthByte the expected value for the sixth byte
+     * @param buffer the buffer containing the serialized EHT capabilities
+     * @param expectedValueSixthByte the expected value for the sixth byte
      */
     void CheckEhtPhyCapabilitiesInformation(const Buffer& buffer, uint8_t expectedValueSixthByte);
 
     /**
      * Check the content of the Supported EHT-MCS And NSS Set subfield.
-     * \param maxSupportedMcs the maximum EHT MCS supported by the PHY
+     * @param maxSupportedMcs the maximum EHT MCS supported by the PHY
      *
-     * \param buffer the buffer containing the serialized EHT capabilities
+     * @param buffer the buffer containing the serialized EHT capabilities
      */
     void CheckSupportedEhtMcsAndNssSet(const Buffer& buffer, uint8_t maxSupportedMcs);
 
@@ -852,15 +852,15 @@
 {
     HeCapabilities capabilities;
     uint8_t channelWidthSet = 0;
-    if ((m_channelWidth >= 40) && m_is2_4Ghz)
+    if ((m_channelWidth >= MHz_u{40}) && m_is2_4Ghz)
     {
         channelWidthSet |= 0x01;
     }
-    if ((m_channelWidth >= 80) && !m_is2_4Ghz)
+    if ((m_channelWidth >= MHz_u{80}) && !m_is2_4Ghz)
     {
         channelWidthSet |= 0x02;
     }
-    if ((m_channelWidth >= 160) && !m_is2_4Ghz)
+    if ((m_channelWidth >= MHz_u{160}) && !m_is2_4Ghz)
     {
         channelWidthSet |= 0x04;
     }
@@ -888,7 +888,7 @@
         (maxSupportedMcs >= 12) ? 1 : 0;
     capabilities.m_phyCapabilities.supportRx1024And4096QamForRuSmallerThan242Tones =
         (maxSupportedMcs >= 12) ? 1 : 0;
-    if (m_channelWidth == 20)
+    if (m_channelWidth == MHz_u{20})
     {
         for (auto maxMcs : {7, 9, 11, 13})
         {
@@ -914,7 +914,7 @@
                 maxMcs <= maxSupportedMcs ? 4 : 0);
         }
     }
-    if (m_channelWidth >= 160)
+    if (m_channelWidth >= MHz_u{160})
     {
         for (auto maxMcs : {9, 11, 13})
         {
@@ -926,7 +926,7 @@
                                                     maxMcs <= maxSupportedMcs ? 1 : 0);
         }
     }
-    if (m_channelWidth == 320)
+    if (m_channelWidth == MHz_u{320})
     {
         capabilities.m_phyCapabilities.support320MhzIn6Ghz = 1;
         for (auto maxMcs : {9, 11, 13})
@@ -979,7 +979,7 @@
 WifiEhtCapabilitiesIeTest::CheckEhtPhyCapabilitiesInformation(const Buffer& buffer,
                                                               uint8_t expectedValueSixthByte)
 {
-    CheckSerializedByte(buffer, 5, (m_channelWidth == 320) ? 0x02 : 0x00);
+    CheckSerializedByte(buffer, 5, (m_channelWidth == MHz_u{320}) ? 0x02 : 0x00);
     CheckSerializedByte(buffer, 6, 0x00);
     CheckSerializedByte(buffer, 7, 0x00);
     CheckSerializedByte(buffer, 8, 0x00);
@@ -994,7 +994,7 @@
 WifiEhtCapabilitiesIeTest::CheckSupportedEhtMcsAndNssSet(const Buffer& buffer,
                                                          uint8_t maxSupportedMcs)
 {
-    if (m_channelWidth == 20)
+    if (m_channelWidth == MHz_u{20})
     {
         CheckSerializedByte(buffer, 14, 0x21); // first byte of Supported EHT-MCS And NSS Set
         CheckSerializedByte(
@@ -1022,7 +1022,7 @@
             16,
             maxSupportedMcs >= 12 ? 0x43 : 0x00); // third byte of Supported EHT-MCS And NSS Set
     }
-    if (m_channelWidth >= 160)
+    if (m_channelWidth >= MHz_u{160})
     {
         CheckSerializedByte(buffer, 17, 0x12); // first byte of EHT-MCS Map (BW = 160 MHz)
         CheckSerializedByte(
@@ -1034,7 +1034,7 @@
             19,
             maxSupportedMcs >= 12 ? 0x12 : 0x00); // third byte of EHT-MCS Map (BW = 160 MHz)
     }
-    if (m_channelWidth == 320)
+    if (m_channelWidth == MHz_u{320})
     {
         CheckSerializedByte(buffer, 20, 0x34); // first byte of EHT-MCS Map (BW = 320 MHz)
         CheckSerializedByte(
@@ -1079,8 +1079,9 @@
                             9 +                          // EHT PHY Capabilities Information
                             expectedEhtMcsAndNssSetSize; // Supported EHT-MCS And NSS Set
 
-    auto mapType = m_channelWidth == 20 ? EhtMcsAndNssSet::EHT_MCS_MAP_TYPE_20_MHZ_ONLY
-                                        : EhtMcsAndNssSet::EHT_MCS_MAP_TYPE_NOT_LARGER_THAN_80_MHZ;
+    auto mapType = m_channelWidth == MHz_u{20}
+                       ? EhtMcsAndNssSet::EHT_MCS_MAP_TYPE_20_MHZ_ONLY
+                       : EhtMcsAndNssSet::EHT_MCS_MAP_TYPE_NOT_LARGER_THAN_80_MHZ;
 
     {
         maxMcs = 11;
@@ -1187,10 +1188,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test TID-To-Link Mapping information element serialization and deserialization
+ * @brief Test TID-To-Link Mapping information element serialization and deserialization
  */
 class TidToLinkMappingElementTest : public HeaderSerializationTestCase
 {
@@ -1198,10 +1199,10 @@
     /**
      * Constructor
      *
-     * \param direction The direction for the TID-to-link mapping
-     * \param mappingSwitchTime the Mapping Switching Time
-     * \param expectedDuration the Expected Duration
-     * \param mappings A TID-indexed map of the link sets the TIDs are mapped to
+     * @param direction The direction for the TID-to-link mapping
+     * @param mappingSwitchTime the Mapping Switching Time
+     * @param expectedDuration the Expected Duration
+     * @param mappings A TID-indexed map of the link sets the TIDs are mapped to
      */
     TidToLinkMappingElementTest(WifiDirection direction,
                                 std::optional<Time> mappingSwitchTime,
@@ -1276,10 +1277,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test EHT Operation information element serialization and deserialization
+ * @brief Test EHT Operation information element serialization and deserialization
  */
 class EhtOperationElementTest : public HeaderSerializationTestCase
 {
@@ -1287,16 +1288,16 @@
     /**
      * Constructor
      *
-     * \param params the EHT Operation Parameters field
-     * \param rxMaxNss0_7 RX max NSS that supports EHT MCS 0-7
-     * \param txMaxNss0_7 TX max NSS that supports EHT MCS 0-7
-     * \param rxMaxNss8_9 RX max NSS that supports EHT MCS 8-9
-     * \param txMaxNss8_9 TX max NSS that supports EHT MCS 8-9
-     * \param rxMaxNss10_11 RX max NSS that supports EHT MCS 10-11
-     * \param txMaxNss10_11 TX max NSS that supports EHT MCS 10-11
-     * \param rxMaxNss12_13 RX max NSS that supports EHT MCS 12-13
-     * \param txMaxNss12_13 TX max NSS that supports EHT MCS 12-13
-     * \param opInfo the EHT Operation Information field
+     * @param params the EHT Operation Parameters field
+     * @param rxMaxNss0_7 RX max NSS that supports EHT MCS 0-7
+     * @param txMaxNss0_7 TX max NSS that supports EHT MCS 0-7
+     * @param rxMaxNss8_9 RX max NSS that supports EHT MCS 8-9
+     * @param txMaxNss8_9 TX max NSS that supports EHT MCS 8-9
+     * @param rxMaxNss10_11 RX max NSS that supports EHT MCS 10-11
+     * @param txMaxNss10_11 TX max NSS that supports EHT MCS 10-11
+     * @param rxMaxNss12_13 RX max NSS that supports EHT MCS 12-13
+     * @param txMaxNss12_13 TX max NSS that supports EHT MCS 12-13
+     * @param opInfo the EHT Operation Information field
      */
     EhtOperationElementTest(const EhtOperation::EhtOpParams& params,
                             uint8_t rxMaxNss0_7,
@@ -1349,10 +1350,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief wifi EHT Information Elements Test Suite
+ * @brief wifi EHT Information Elements Test Suite
  */
 class WifiEhtInfoElemsTestSuite : public TestSuite
 {
@@ -1365,13 +1366,13 @@
 {
     AddTestCase(new BasicMultiLinkElementTest(), TestCase::Duration::QUICK);
     AddTestCase(new ReducedNeighborReportTest(), TestCase::Duration::QUICK);
-    AddTestCase(new WifiEhtCapabilitiesIeTest(false, 20), TestCase::Duration::QUICK);
-    AddTestCase(new WifiEhtCapabilitiesIeTest(true, 20), TestCase::Duration::QUICK);
-    AddTestCase(new WifiEhtCapabilitiesIeTest(false, 80), TestCase::Duration::QUICK);
-    AddTestCase(new WifiEhtCapabilitiesIeTest(true, 40), TestCase::Duration::QUICK);
-    AddTestCase(new WifiEhtCapabilitiesIeTest(true, 80), TestCase::Duration::QUICK);
-    AddTestCase(new WifiEhtCapabilitiesIeTest(false, 160), TestCase::Duration::QUICK);
-    AddTestCase(new WifiEhtCapabilitiesIeTest(false, 320), TestCase::Duration::QUICK);
+    AddTestCase(new WifiEhtCapabilitiesIeTest(false, MHz_u{20}), TestCase::Duration::QUICK);
+    AddTestCase(new WifiEhtCapabilitiesIeTest(true, MHz_u{20}), TestCase::Duration::QUICK);
+    AddTestCase(new WifiEhtCapabilitiesIeTest(false, MHz_u{80}), TestCase::Duration::QUICK);
+    AddTestCase(new WifiEhtCapabilitiesIeTest(true, MHz_u{40}), TestCase::Duration::QUICK);
+    AddTestCase(new WifiEhtCapabilitiesIeTest(true, MHz_u{80}), TestCase::Duration::QUICK);
+    AddTestCase(new WifiEhtCapabilitiesIeTest(false, MHz_u{160}), TestCase::Duration::QUICK);
+    AddTestCase(new WifiEhtCapabilitiesIeTest(false, MHz_u{320}), TestCase::Duration::QUICK);
     AddTestCase(
         new TidToLinkMappingElementTest(WifiDirection::DOWNLINK, std::nullopt, std::nullopt, {}),
         TestCase::Duration::QUICK);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/test/wifi-emlsr-test.cc ns-3.44/src/wifi/test/wifi-emlsr-test.cc
--- ns-3.43/src/wifi/test/wifi-emlsr-test.cc	2024-10-09 16:41:10.136656800 -0700
+++ ns-3.44/src/wifi/test/wifi-emlsr-test.cc	2025-03-09 16:55:49.807372600 -0700
@@ -13,8 +13,8 @@
 #include "ns3/config.h"
 #include "ns3/ctrl-headers.h"
 #include "ns3/eht-configuration.h"
+#include "ns3/eht-frame-exchange-manager.h"
 #include "ns3/emlsr-manager.h"
-#include "ns3/he-frame-exchange-manager.h"
 #include "ns3/log.h"
 #include "ns3/mgt-action-headers.h"
 #include "ns3/mobility-helper.h"
@@ -34,7 +34,6 @@
 #include <algorithm>
 #include <functional>
 #include <iomanip>
-#include <optional>
 
 using namespace ns3;
 
@@ -134,11 +133,170 @@
             ss << "} TID = " << +psdu->GetHeader(0).GetQosTid();
         }
         NS_LOG_INFO(ss.str());
+
+        // if this frame is transmitted by an EMLSR client on an EMLSR links, in-device interference
+        // is configured and the TX duration exceeds the threshold (72us), MediumSyncDelay timer is
+        // (re)started at the end of the transmission
+        if (auto staMac = DynamicCast<StaWifiMac>(mac);
+            staMac && staMac->IsEmlsrLink(*linkId) &&
+            staMac->GetEmlsrManager()->GetMediumSyncDuration().IsStrictlyPositive())
+        {
+            const auto mustStartMsd =
+                staMac->GetEmlsrManager()->GetInDeviceInterference() &&
+                txDuration > MicroSeconds(EmlsrManager::MEDIUM_SYNC_THRESHOLD_USEC);
+
+            for (auto id : staMac->GetLinkIds())
+            {
+                // timer started on EMLSR links other than the link on which TX is starting,
+                // provided that a PHY is operating on the link and MediumSyncDuration is not null
+                if (!staMac->IsEmlsrLink(id) || id == *linkId || staMac->GetWifiPhy(id) == nullptr)
+                {
+                    continue;
+                }
+                Simulator::Schedule(
+                    txDuration - TimeStep(1),
+                    [=, hdrType = psdu->GetHeader(0).GetTypeString(), this]() {
+                        // check if MSD timer was running on the link before completing transmission
+                        bool msdWasRunning = staMac->GetEmlsrManager()
+                                                 ->GetElapsedMediumSyncDelayTimer(id)
+                                                 .has_value();
+                        if (auto phy = staMac->GetWifiPhy(id);
+                            !msdWasRunning && !mustStartMsd && phy && phy->IsStateSleep())
+                        {
+                            // if the MSD timer was not running before the end of the TX, it is not
+                            // expected to be started and the PHY operating on this link is
+                            // sleeping, do not check that the MSD timer is not started after the
+                            // end of the TX, because it may be started because of the sleep period
+                            // of the aux PHY
+                            return;
+                        }
+                        Simulator::Schedule(TimeStep(2), [=, this]() {
+                            CheckMsdTimerRunning(staMac,
+                                                 id,
+                                                 (msdWasRunning || mustStartMsd),
+                                                 std::string("after transmitting ") + hdrType +
+                                                     " on link " + std::to_string(*linkId));
+                        });
+                    });
+            }
+        }
     }
     NS_LOG_INFO("TX duration = " << txDuration.As(Time::MS) << "  TXVECTOR = " << txVector << "\n");
 }
 
 void
+EmlsrOperationsTestBase::CheckMsdTimerRunning(Ptr<StaWifiMac> staMac,
+                                              uint8_t linkId,
+                                              bool isRunning,
+                                              const std::string& msg)
+{
+    auto time = staMac->GetEmlsrManager()->GetElapsedMediumSyncDelayTimer(linkId);
+    NS_TEST_ASSERT_MSG_EQ(time.has_value(),
+                          isRunning,
+                          Simulator::Now().As(Time::MS)
+                              << " Unexpected status for MediumSyncDelay timer on link " << +linkId
+                              << " " << msg);
+    if (auto phy = staMac->GetWifiPhy(linkId))
+    {
+        auto currThreshold = phy->GetCcaEdThreshold();
+        NS_TEST_EXPECT_MSG_EQ((static_cast<int8_t>(currThreshold) ==
+                               staMac->GetEmlsrManager()->GetMediumSyncOfdmEdThreshold()),
+                              isRunning,
+                              Simulator::Now().As(Time::MS)
+                                  << " Unexpected value (" << currThreshold
+                                  << ") for CCA ED threshold on link " << +linkId << " " << msg);
+    }
+}
+
+void
+EmlsrOperationsTestBase::CheckAuxPhysSleepMode(Ptr<StaWifiMac> staMac, bool sleep)
+{
+    if (!m_putAuxPhyToSleep)
+    {
+        // if m_putAuxPhyToSleep is false, aux PHYs must not be put to sleep
+        sleep = false;
+    }
+
+    for (const auto& phy : staMac->GetDevice()->GetPhys())
+    {
+        if (phy->GetPhyId() == m_mainPhyId)
+        {
+            continue; // do not check the main PHY
+        }
+
+        auto linkId = staMac->GetLinkForPhy(phy);
+
+        if (linkId.has_value() && !staMac->IsEmlsrLink(*linkId))
+        {
+            continue; // this PHY is not operating on an EMLSR link
+        }
+
+        if (!sleep)
+        {
+            NS_TEST_EXPECT_MSG_EQ(phy->IsStateSleep(),
+                                  false,
+                                  Simulator::Now().GetTimeStep()
+                                      << " PHY " << +phy->GetPhyId() << " is in unexpected state "
+                                      << phy->GetState()->GetState());
+            continue;
+        }
+
+        // if the PHY is in state TX or switching, sleep is postponed until their end
+        const auto delay =
+            (phy->IsStateTx() || phy->IsStateSwitching()) ? phy->GetDelayUntilIdle() : Time{0};
+
+        Simulator::Schedule(delay, [=, this]() {
+            NS_TEST_EXPECT_MSG_EQ(phy->IsStateSleep(),
+                                  true,
+                                  "PHY " << +phy->GetPhyId() << " is in unexpected state "
+                                         << phy->GetState()->GetState());
+        });
+    }
+}
+
+void
+EmlsrOperationsTestBase::MainPhySwitchInfoCallback(std::size_t index,
+                                                   const EmlsrMainPhySwitchTrace& info)
+{
+    m_traceInfo[index] = info.Clone();
+}
+
+void
+EmlsrOperationsTestBase::CheckMainPhyTraceInfo(std::size_t index,
+                                               std::string_view reason,
+                                               const std::optional<uint8_t>& fromLinkId,
+                                               uint8_t toLinkId,
+                                               bool checkFromLinkId,
+                                               bool checkToLinkId)
+{
+    const auto traceInfoIt = m_traceInfo.find(index);
+    NS_TEST_ASSERT_MSG_EQ((traceInfoIt != m_traceInfo.cend()), true, "Expected stored trace info");
+    const auto& traceInfo = traceInfoIt->second;
+
+    NS_TEST_EXPECT_MSG_EQ(traceInfo->GetName(), reason, "Unexpected reason");
+
+    if (checkFromLinkId)
+    {
+        NS_TEST_ASSERT_MSG_EQ(traceInfo->fromLinkId.has_value(),
+                              fromLinkId.has_value(),
+                              "Unexpected stored from_link ID");
+        if (fromLinkId.has_value())
+        {
+            NS_TEST_EXPECT_MSG_EQ(+traceInfo->fromLinkId.value(),
+                                  +fromLinkId.value(),
+                                  "Unexpected from_link ID");
+        }
+    }
+
+    if (checkToLinkId)
+    {
+        NS_TEST_EXPECT_MSG_EQ(+traceInfo->toLinkId, +toLinkId, "Unexpected to_link ID");
+    }
+
+    m_traceInfo.erase(traceInfoIt);
+}
+
+void
 EmlsrOperationsTestBase::DoSetup()
 {
     RngSeedManager::SetSeed(1);
@@ -146,6 +304,8 @@
     int64_t streamNumber = 100;
 
     Config::SetDefault("ns3::WifiMac::MpduBufferSize", UintegerValue(64));
+    Config::SetDefault("ns3::EmlsrManager::InDeviceInterference", BooleanValue(true));
+    Config::SetDefault("ns3::EmlsrManager::PutAuxPhyToSleep", BooleanValue(m_putAuxPhyToSleep));
 
     NodeContainer wifiApNode(1);
     NodeContainer wifiStaNodes(m_nEmlsrStations);
@@ -181,6 +341,9 @@
                 SsidValue(Ssid("ns-3-ssid")),
                 "BeaconGeneration",
                 BooleanValue(true));
+    mac.SetApEmlsrManager("ns3::AdvancedApEmlsrManager",
+                          "WaitTransDelayOnPsduRxError",
+                          BooleanValue(true));
 
     NetDeviceContainer apDevice = wifi.Install(phyHelper, mac, wifiApNode);
 
@@ -205,12 +368,14 @@
     {
         auto device = DynamicCast<WifiNetDevice>(staDevices.Get(i));
         auto staMac = DynamicCast<StaWifiMac>(device->GetMac());
+        auto emlsrManager = staMac->GetEmlsrManager();
         NS_ASSERT_MSG(i < m_paddingDelay.size(), "Not enough padding delay values provided");
-        staMac->GetEmlsrManager()->SetAttribute("EmlsrPaddingDelay",
-                                                TimeValue(m_paddingDelay.at(i)));
+        emlsrManager->SetAttribute("EmlsrPaddingDelay", TimeValue(m_paddingDelay.at(i)));
         NS_ASSERT_MSG(i < m_transitionDelay.size(), "Not enough transition delay values provided");
-        staMac->GetEmlsrManager()->SetAttribute("EmlsrTransitionDelay",
-                                                TimeValue(m_transitionDelay.at(i)));
+        emlsrManager->SetAttribute("EmlsrTransitionDelay", TimeValue(m_transitionDelay.at(i)));
+        emlsrManager->TraceConnectWithoutContext(
+            "MainPhySwitch",
+            MakeCallback(&EmlsrOperationsTestBase::MainPhySwitchInfoCallback, this).Bind(i));
     }
 
     if (m_nNonEmlsrStations > 0)
@@ -709,6 +874,7 @@
     m_transitionDelay = params.transitionDelay;
     m_transitionTimeout = params.transitionTimeout;
     m_establishBaDl = true;
+    m_putAuxPhyToSleep = params.putAuxPhyToSleep;
     m_duration = Seconds(1.5);
 
     NS_ABORT_MSG_IF(params.linksToEnableEmlsrOn.size() < 2,
@@ -778,6 +944,31 @@
         CheckBlockAck(psduMap, txVector, phyId);
         break;
 
+    case WIFI_MAC_CTL_END:
+        if (auto apMac = DynamicCast<ApWifiMac>(mac))
+        {
+            const auto txDuration =
+                WifiPhy::CalculateTxDuration(psduMap,
+                                             txVector,
+                                             apMac->GetDevice()->GetPhy(phyId)->GetPhyBand());
+            for (std::size_t i = 0; i < m_nEmlsrStations; ++i)
+            {
+                if (m_staMacs[i]->IsEmlsrLink(linkId) &&
+                    m_staMacs[i]->GetWifiPhy(linkId) ==
+                        m_staMacs[i]->GetDevice()->GetPhy(m_mainPhyId))
+                {
+                    // AP is terminating a TXOP on an EMLSR link on which the main PHY is operating,
+                    // aux PHYs should resume from sleep
+                    Simulator::Schedule(txDuration + TimeStep(1),
+                                        &EmlsrDlTxopTest::CheckAuxPhysSleepMode,
+                                        this,
+                                        m_staMacs[i],
+                                        false);
+                }
+            }
+        }
+        break;
+
     default:;
     }
 }
@@ -786,7 +977,7 @@
 EmlsrDlTxopTest::DoSetup()
 {
     // Channel switch delay should be less than the ICF padding duration, otherwise
-    // DL TXOPs cannot be initiated on non-primary links
+    // DL TXOPs cannot be initiated on auxiliary links
     auto delay = std::min(MicroSeconds(100),
                           *std::min_element(m_paddingDelay.cbegin(), m_paddingDelay.cend()));
     Config::SetDefault("ns3::WifiPhy::ChannelSwitchDelay", TimeValue(MicroSeconds(75)));
@@ -1918,8 +2109,8 @@
                                   << maxPaddingDelay.As(Time::US));
     }
 
-    // check that the EMLSR clients have blocked transmissions on other links after
-    // receiving this ICF
+    // check that the EMLSR clients have blocked transmissions on other links, switched their main
+    // PHY (if needed) and have put aux PHYs to sleep after receiving this ICF
     for (const auto& userInfo : trigger)
     {
         for (std::size_t i = 0; i < m_nEmlsrStations; i++)
@@ -1929,6 +2120,8 @@
                 continue;
             }
 
+            const auto mainPhyLinkId = m_staMacs[i]->GetLinkForPhy(m_mainPhyId);
+
             Simulator::Schedule(txDuration + NanoSeconds(5), [=, this]() {
                 for (uint8_t id = 0; id < m_staMacs[i]->GetNLinks(); id++)
                 {
@@ -1941,6 +2134,13 @@
                                      "Checking EMLSR links on EMLSR client " + std::to_string(i) +
                                          " after receiving ICF");
                 }
+
+                if (mainPhyLinkId != linkId)
+                {
+                    CheckMainPhyTraceInfo(i, "DlTxopIcfReceivedByAuxPhy", mainPhyLinkId, linkId);
+                }
+
+                CheckAuxPhysSleepMode(m_staMacs[i], true);
             });
 
             break;
@@ -2374,7 +2574,9 @@
 }
 
 EmlsrUlTxopTest::EmlsrUlTxopTest(const Params& params)
-    : EmlsrOperationsTestBase("Check EML UL TXOP transmissions"),
+    : EmlsrOperationsTestBase("Check EML UL TXOP transmissions (genBackoffAndUseAuxPhyCca=" +
+                              std::to_string(params.genBackoffAndUseAuxPhyCca) +
+                              ", nSlotsLeftAlert=" + std::to_string(params.nSlotsLeftAlert)),
       m_emlsrLinks(params.linksToEnableEmlsrOn),
       m_channelWidth(params.channelWidth),
       m_auxPhyChannelWidth(params.auxPhyChannelWidth),
@@ -2388,7 +2590,10 @@
       m_countBlockAck(0),
       m_countRtsframes(0),
       m_genBackoffIfTxopWithoutTx(params.genBackoffAndUseAuxPhyCca),
-      m_useAuxPhyCca(params.genBackoffAndUseAuxPhyCca)
+      m_useAuxPhyCca(params.genBackoffAndUseAuxPhyCca),
+      m_nSlotsLeftAlert(params.nSlotsLeftAlert),
+      m_switchMainPhyBackDelayTimeout(params.switchMainPhyBackDelayTimeout),
+      m_5thQosFrameExpWidth(0)
 {
     m_nEmlsrStations = 1;
     m_nNonEmlsrStations = 0;
@@ -2400,6 +2605,7 @@
     m_transitionDelay = {MicroSeconds(256)};
     m_establishBaDl = true;
     m_establishBaUl = true;
+    m_putAuxPhyToSleep = params.putAuxPhyToSleep;
     m_duration = Seconds(1);
 
     NS_ABORT_MSG_IF(params.linksToEnableEmlsrOn.size() < 2,
@@ -2422,14 +2628,18 @@
                        UintegerValue(m_auxPhyChannelWidth));
     Config::SetDefault("ns3::DefaultEmlsrManager::SwitchAuxPhy", BooleanValue(false));
     Config::SetDefault("ns3::AdvancedEmlsrManager::UseAuxPhyCca", BooleanValue(m_useAuxPhyCca));
+    Config::SetDefault("ns3::AdvancedEmlsrManager::SwitchMainPhyBackDelay",
+                       TimeValue(MilliSeconds(m_switchMainPhyBackDelayTimeout ? 2 : 0)));
     Config::SetDefault("ns3::EhtConfiguration::MediumSyncDuration",
                        TimeValue(m_mediumSyncDuration));
     Config::SetDefault("ns3::EhtConfiguration::MsdMaxNTxops", UintegerValue(m_msdMaxNTxops));
     Config::SetDefault("ns3::ChannelAccessManager::GenerateBackoffIfTxopWithoutTx",
                        BooleanValue(m_genBackoffIfTxopWithoutTx));
+    Config::SetDefault("ns3::ChannelAccessManager::NSlotsLeft", UintegerValue(m_nSlotsLeftAlert));
     // Channel switch delay should be less than RTS TX time + SIFS + CTS TX time, otherwise
     // UL TXOPs cannot be initiated by aux PHYs
     Config::SetDefault("ns3::WifiPhy::ChannelSwitchDelay", TimeValue(MicroSeconds(75)));
+    Config::SetDefault("ns3::WifiPhy::NotifyMacHdrRxEnd", BooleanValue(true));
 
     EmlsrOperationsTestBase::DoSetup();
 
@@ -2441,14 +2651,15 @@
     // configure channels of the given width
     for (auto band : {WIFI_PHY_BAND_2_4GHZ, WIFI_PHY_BAND_5GHZ, WIFI_PHY_BAND_6GHZ})
     {
-        MHz_u bw = 20;
+        MHz_u bw{20};
         uint8_t number = band == WIFI_PHY_BAND_5GHZ ? 36 : 1;
 
-        auto width = std::min<MHz_u>(m_channelWidth, band == WIFI_PHY_BAND_2_4GHZ ? 40 : 160);
+        auto width =
+            std::min(m_channelWidth, band == WIFI_PHY_BAND_2_4GHZ ? MHz_u{40} : MHz_u{160});
         while (bw < width)
         {
             bw *= 2;
-            number += bw / 20;
+            number += Count20MHzSubchannels(bw);
         }
 
         for (auto mac : std::initializer_list<Ptr<WifiMac>>{m_apMac, m_staMacs[0]})
@@ -2542,10 +2753,6 @@
         NS_TEST_EXPECT_MSG_EQ(+linkId, +m_mainPhyId, "AssocReq not sent by the main PHY");
         break;
 
-    case WIFI_MAC_CTL_TRIGGER:
-        CheckInitialControlFrame(*psdu->begin(), txVector, linkId);
-        break;
-
     case WIFI_MAC_CTL_RTS:
         CheckRtsFrames(*psdu->begin(), txVector, linkId);
         break;
@@ -2648,6 +2855,12 @@
         // check that other EMLSR links are now blocked on the EMLSR client and on the AP MLD
         // after this QoS data frame is received
         Simulator::ScheduleNow([=, this]() {
+            auto phyHdrTxTime = WifiPhy::CalculatePhyPreambleAndHeaderDuration(txVector);
+            auto macHdrSize = (*psduMap.at(SU_STA_ID)->begin())->GetHeader().GetSerializedSize() +
+                              4 /* A-MPDU subframe header size */;
+            auto macHdrTxTime =
+                DataRate(txVector.GetMode().GetDataRate(txVector)).CalculateBytesTxTime(macHdrSize);
+
             for (auto id : m_staMacs[0]->GetLinkIds())
             {
                 CheckBlockedLink(
@@ -2659,6 +2872,17 @@
                     "Checking EMLSR links on EMLSR client while sending the first data frame",
                     false);
 
+                Simulator::Schedule(phyHdrTxTime + macHdrTxTime + MicroSeconds(1), [=, this]() {
+                    CheckBlockedLink(m_apMac,
+                                     m_staMacs[0]->GetAddress(),
+                                     id,
+                                     WifiQueueBlockedReason::USING_OTHER_EMLSR_LINK,
+                                     id != m_staMacs[0]->GetLinkForPhy(m_mainPhyId) &&
+                                         m_staMacs[0]->IsEmlsrLink(id),
+                                     "Checking EMLSR links on AP MLD right after receiving the MAC "
+                                     "header of the first data frame");
+                });
+
                 Simulator::Schedule(
                     txDuration + MicroSeconds(MAX_PROPAGATION_DELAY_USEC),
                     [=, this]() {
@@ -2669,7 +2893,7 @@
                             WifiQueueBlockedReason::USING_OTHER_EMLSR_LINK,
                             id != m_staMacs[0]->GetLinkForPhy(m_mainPhyId) &&
                                 m_staMacs[0]->IsEmlsrLink(id),
-                            "Checking EMLSR links on AP MLD while sending the first data frame");
+                            "Checking EMLSR links on AP MLD after sending the first data frame");
                     });
             }
         });
@@ -2759,50 +2983,45 @@
         auxPhyLinks.erase(*m_nonEmlsrLink);
     }
 
-    // lambda to check that the MediumSyncDelay timer is correctly running/not running and
-    // the CCA ED threshold is set to the correct value on all the links
-    auto checkMediumSyncDelayTimerActive = [=, this]() {
-        for (auto id : m_staMacs[0]->GetLinkIds())
-        {
-            // timer only started on EMLSR links other than the link on which TXOP was carried
-            // out
-            auto isTimerActive = m_staMacs[0]->IsEmlsrLink(id) && id != linkId;
-            auto time = m_staMacs[0]->GetEmlsrManager()->GetElapsedMediumSyncDelayTimer(id);
-            NS_TEST_EXPECT_MSG_EQ(time.has_value(),
-                                  isTimerActive,
-                                  Simulator::Now().As(Time::MS)
-                                      << " Unexpected status for MediumSyncDelay timer on link "
-                                      << +id << " after terminating a TXOP on link " << +linkId);
-            auto currThreshold = m_staMacs[0]->GetWifiPhy(id)->GetCcaEdThreshold();
-            NS_TEST_EXPECT_MSG_EQ((static_cast<int8_t>(currThreshold) ==
-                                   m_staMacs[0]->GetEmlsrManager()->GetMediumSyncOfdmEdThreshold()),
-                                  isTimerActive,
-                                  Simulator::Now().As(Time::MS)
-                                      << " Unexpected value (" << currThreshold
-                                      << ") for CCA ED threshold on link " << +id
-                                      << " when MediumSyncDelay is "
-                                      << (isTimerActive ? "active" : "inactive"));
-        }
-    };
-
     auto txDuration =
         WifiPhy::CalculateTxDuration(psduMap, txVector, m_apMac->GetWifiPhy(linkId)->GetPhyBand());
 
-    // in this test, BlockAck frames terminates TXOP. If a BlockAck frame is sent on an EMLSR link
-    // other than the main PHY link, it means that the aux PHY associated with that link is in
-    // sleep mode and it is resumed after the end of the BlockAck frame
-    if (linkId != m_mainPhyId && linkId != m_nonEmlsrLink)
-    {
-        Simulator::Schedule(txDuration - NanoSeconds(1), [=, this]() {
-            NS_TEST_EXPECT_MSG_EQ(m_staMacs[0]->GetDevice()->GetPhy(linkId)->IsStateSleep(),
-                                  true,
-                                  "Aux PHY on link " << +linkId << " not in sleep mode");
-        });
-        Simulator::Schedule(txDuration + NanoSeconds(1), [=, this]() {
-            NS_TEST_EXPECT_MSG_EQ(m_staMacs[0]->GetDevice()->GetPhy(linkId)->IsStateSleep(),
-                                  false,
-                                  "Aux PHY on link " << +linkId << " in sleep mode");
-        });
+    // in this test, BlockAck frames terminates TXOP, thus aux PHYs shall be in sleep mode before
+    // the end of BlockAck reception and awake right afterwards
+    if (linkId != m_nonEmlsrLink)
+    {
+        Simulator::Schedule(txDuration - TimeStep(1),
+                            &EmlsrUlTxopTest::CheckAuxPhysSleepMode,
+                            this,
+                            m_staMacs[0],
+                            true);
+        Simulator::Schedule(txDuration + TimeStep(1),
+                            &EmlsrUlTxopTest::CheckAuxPhysSleepMode,
+                            this,
+                            m_staMacs[0],
+                            false);
+
+        // if the TXOP has been carried out on a link other than the preferred link, the main PHY
+        // switches back to the preferred link when the TXOP ends
+        if (m_staMacs[0]->GetLinkForPhy(m_mainPhyId) != linkId)
+        {
+            Simulator::Schedule(txDuration + TimeStep(1), [=, this]() {
+                // check the traced remaining time before calling CheckMainPhyTraceInfo
+                if (const auto traceInfoIt = m_traceInfo.find(0);
+                    traceInfoIt != m_traceInfo.cend() &&
+                    traceInfoIt->second->GetName() == "TxopEnded")
+                {
+                    const auto& traceInfo =
+                        static_cast<const EmlsrTxopEndedTrace&>(*traceInfoIt->second);
+                    NS_TEST_EXPECT_MSG_EQ(
+                        traceInfo.remTime,
+                        Time{0},
+                        "Expected null remaining time because TXOP ended regularly");
+                }
+
+                CheckMainPhyTraceInfo(0, "TxopEnded", linkId, m_mainPhyId);
+            });
+        }
     }
 
     switch (m_countBlockAck)
@@ -2840,26 +3059,27 @@
             break;
         }
         m_checkBackoffStarted = true;
-        // check MediumSyncDelay timer on the EMLSR client after receiving BlockAck
-        Simulator::Schedule(txDuration + NanoSeconds(1), checkMediumSyncDelayTimerActive);
         break;
     case 5:
         // Block Ack in response to the second data frame sent by the EMLSR client on EMLSR links.
-        // Check that MediumSyncDelay timer is running on the link where the main PHY is operating
-        // and that the number of backoff slots is not changed since the beginning of the TXOP
-        Simulator::Schedule(txDuration + NanoSeconds(1), [=, this]() {
-            checkMediumSyncDelayTimerActive();
-            auto elapsed =
-                m_staMacs[0]->GetEmlsrManager()->GetElapsedMediumSyncDelayTimer(m_mainPhyId);
-            NS_TEST_EXPECT_MSG_EQ(
-                elapsed.has_value(),
-                true,
-                "MediumSyncDelay timer not running on link where main PHY is operating");
-            m_lastMsdExpiryTime = Simulator::Now() +
-                                  m_staMacs[0]->GetEmlsrManager()->GetMediumSyncDuration() -
-                                  *elapsed;
-        });
+        // Check that MediumSyncDelay timer starts running on the link where the main PHY switches
+        // to when the channel switch is completed
+        Simulator::Schedule(
+            txDuration + m_staMacs[0]->GetDevice()->GetPhy(m_mainPhyId)->GetChannelSwitchDelay() +
+                NanoSeconds(1),
+            [=, this]() {
+                auto elapsed =
+                    m_staMacs[0]->GetEmlsrManager()->GetElapsedMediumSyncDelayTimer(m_mainPhyId);
+                NS_TEST_EXPECT_MSG_EQ(
+                    elapsed.has_value(),
+                    true,
+                    "MediumSyncDelay timer not running on link where main PHY is operating");
+                m_lastMsdExpiryTime = Simulator::Now() +
+                                      m_staMacs[0]->GetEmlsrManager()->GetMediumSyncDuration() -
+                                      *elapsed;
+            });
 
+        // Check that the number of backoff slots is not changed since the beginning of the TXOP
         Simulator::Schedule(txDuration, [=, this]() {
             m_checkBackoffStarted = false;
             NS_TEST_ASSERT_MSG_EQ(m_backoffEndTime.has_value(),
@@ -2911,62 +3131,78 @@
         m_staMacs[0]->GetEmlsrManager()->SetAuxPhyTxCapable(false);
         if (!m_nonEmlsrLink)
         {
-            // if there are two non-primary links, set MediumSyncDuration to zero so that the
+            // if there are two auxiliary links, set MediumSyncDuration to zero so that the
             // next UL QoS data frame is not protected also in case it is transmitted on the
-            // non-primary link other than the one on which the last frame exchange occurred
+            // auxiliary link other than the one on which the last frame exchange occurred
             m_staMacs[0]->GetEmlsrManager()->SetMediumSyncDuration(Seconds(0));
         }
 
-        // generate a very large backoff for the primary link, so that when an aux PHY gains a
+        // generate a very large backoff for the preferred link, so that when an aux PHY gains a
         // TXOP, it requests the main PHY to switch to its link to transmit the frames
         m_staMacs[0]->GetQosTxop(AC_BE)->StartBackoffNow(100, m_mainPhyId);
 
         // events to be scheduled at the end of the BlockAck response
         Simulator::Schedule(txDuration + NanoSeconds(1), [=, this]() {
-            // check that the main PHY switches to its primary link
+            // check that the main PHY switches to its preferred link
             auto mainPhy = m_staMacs[0]->GetDevice()->GetPhy(m_mainPhyId);
-            auto mainPhyLinkid = m_staMacs[0]->GetLinkForPhy(mainPhy);
 
             NS_TEST_EXPECT_MSG_EQ(mainPhy->IsStateSwitching(),
                                   true,
                                   "Main PHY is not switching at time "
                                       << Simulator::Now().As(Time::NS));
-            NS_TEST_ASSERT_MSG_EQ(mainPhyLinkid.has_value(),
-                                  true,
-                                  "Main PHY should be operating on a link");
-            NS_TEST_EXPECT_MSG_EQ(+mainPhyLinkid.value(),
-                                  +m_mainPhyId,
-                                  "Main PHY expected to operate on the primary link");
 
             // events to be scheduled when the first main PHY channel switch is completed
             Simulator::Schedule(mainPhy->GetChannelSwitchDelay(), [=, this]() {
+                // either the main PHY is operating on the preferred link or it is switching again
+                auto mainPhyLinkid = m_staMacs[0]->GetLinkForPhy(mainPhy);
+                if (mainPhyLinkid)
+                {
+                    NS_TEST_EXPECT_MSG_EQ(+mainPhyLinkid.value(),
+                                          +m_mainPhyId,
+                                          "Main PHY expected to operate on the preferred link");
+                }
+                else
+                {
+                    NS_TEST_EXPECT_MSG_EQ(
+                        mainPhy->IsStateSwitching(),
+                        true,
+                        "Main PHY is not operating on a link and it is not switching at time "
+                            << Simulator::Now().As(Time::NS));
+                }
+
                 auto acBe = m_staMacs[0]->GetQosTxop(AC_BE);
 
-                // find the min remaining backoff time on non-primary links for AC BE
+                // find the min remaining backoff time on auxiliary links for AC BE
                 auto minBackoff = Time::Max();
+                Time slot{0};
                 for (uint8_t id = 0; id < m_staMacs[0]->GetNLinks(); id++)
                 {
-                    // update backoff
-                    m_staMacs[0]->GetChannelAccessManager(id)->NeedBackoffUponAccess(acBe,
-                                                                                     true,
-                                                                                     true);
+                    if (!m_staMacs[0]->GetWifiPhy(id))
+                    {
+                        continue; // no PHY on this link
+                    }
+
                     if (auto backoff =
                             m_staMacs[0]->GetChannelAccessManager(id)->GetBackoffEndFor(acBe);
                         id != m_mainPhyId && m_staMacs[0]->IsEmlsrLink(id) && backoff < minBackoff)
                     {
                         minBackoff = backoff;
+                        slot = m_staMacs[0]->GetWifiPhy(id)->GetSlot();
                     }
                 }
 
                 // if the backoff on a link has expired before the end of the main PHY channel
-                // switch, the main PHY will be requested to switch again at the first slot
-                // boundary after the end of the channel switch. Otherwise, it will be requested
-                // to switch when the backoff expires.
-                auto expected2ndSwitchDelay = (minBackoff <= Simulator::Now())
-                                                  ? mainPhy->GetSlot()
-                                                  : (minBackoff - Simulator::Now());
+                // switch, the main PHY will be requested to switch again no later than the first
+                // slot boundary after the end of the channel switch. Otherwise, it will be
+                // requested to switch when the backoff expires or when the backoff counter reaches
+                // the configured number of slots
+                auto expected2ndSwitchDelay =
+                    (minBackoff <= Simulator::Now()) ? mainPhy->GetSlot()
+                    : m_nSlotsLeftAlert > 0
+                        ? Max(minBackoff - m_nSlotsLeftAlert * slot - Simulator::Now(), Time{0})
+                        : (minBackoff - Simulator::Now());
 
-                // check that the main PHY is requested to switch to a non-primary link after
+                // check that the main PHY is requested to switch to an auxiliary link after
                 // the expected delay
                 Simulator::Schedule(expected2ndSwitchDelay + NanoSeconds(1), [=, this]() {
                     NS_TEST_EXPECT_MSG_EQ(mainPhy->IsStateSwitching(),
@@ -2976,33 +3212,115 @@
                     NS_TEST_EXPECT_MSG_EQ(m_staMacs[0]->GetLinkForPhy(mainPhy).has_value(),
                                           false,
                                           "Main PHY should not be operating on a link because it "
-                                          "should be switching to a non-primary link");
+                                          "should be switching to an auxiliary link");
+                    // check that the appropriate trace info was received
+                    CheckMainPhyTraceInfo(0,
+                                          "UlTxopAuxPhyNotTxCapable",
+                                          std::nullopt,
+                                          0,
+                                          false,
+                                          false);
 
-                    // events to be scheduled when main PHY finishes switching to non-primary link
-                    Simulator::Schedule(mainPhy->GetDelayUntilIdle(), [=, this]() {
-                        auto nonPrimLinkId = m_staMacs[0]->GetLinkForPhy(mainPhy);
+                    const auto delayUntilIdle = mainPhy->GetDelayUntilIdle();
+                    auto startTimerDelay = delayUntilIdle;
+
+                    if (m_switchMainPhyBackDelayTimeout)
+                    {
+                        TimeValue switchMainPhyBackDelay;
+                        m_staMacs[0]->GetEmlsrManager()->GetAttribute("SwitchMainPhyBackDelay",
+                                                                      switchMainPhyBackDelay);
+
+                        // If nSlotsAlert is 0, the decision whether to start the switch back timer
+                        // is taken at the end of the PIFS period during which we perform CCA and
+                        // NAV check, which coincides with the end of the channel switch or is a
+                        // PIFS afterwards, depending on whether aux PHY CCA is used. Therefore,
+                        // before the end of the CCA and NAV check period we have to make the medium
+                        // busy on the link the main PHY is switching to. Given that we do not know
+                        // which link it is, we set the NAV on all links.
+                        // If nSlotsAlert > 0, the decision whether to start the switch back timer
+                        // is taken at the end of the channel switch and it is needed that the time
+                        // until the backoff end is at least a PIFS to start the switch back timer.
+                        auto endCcaNavCheckDelay = delayUntilIdle;
+
+                        for (uint8_t id = 0; id < m_staMacs[0]->GetNLinks(); ++id)
+                        {
+                            if (auto phy = m_staMacs[0]->GetWifiPhy(id))
+                            {
+                                if (!m_useAuxPhyCca && m_nSlotsLeftAlert == 0)
+                                {
+                                    endCcaNavCheckDelay =
+                                        Max(endCcaNavCheckDelay, delayUntilIdle + phy->GetPifs());
+                                }
+
+                                m_staMacs[0]->GetChannelAccessManager(id)->NotifyNavStartNow(
+                                    endCcaNavCheckDelay + TimeStep(1));
+                            }
+                        }
+                        startTimerDelay = endCcaNavCheckDelay;
 
-                        NS_TEST_ASSERT_MSG_EQ(nonPrimLinkId.has_value(),
+                        // when the SwitchMainPhyBackDelay timer starts, extend the NAV on the
+                        // aux PHY link on which the main PHY is operating by the timer duration
+                        // plus a channel switch delay, so that the timer expires and the main PHY
+                        // returns to the preferred link. If nSlotsAlert > 0, the timer duration is
+                        // extended by the expected channel access when the main PHY switch ends.
+                        Simulator::Schedule(startTimerDelay, [=, this]() {
+                            auto auxLinkId = m_staMacs[0]->GetLinkForPhy(mainPhy);
+                            NS_TEST_ASSERT_MSG_EQ(
+                                auxLinkId.has_value(),
+                                true,
+                                "Main PHY should be operating on a link before timer expires");
+                            auto timerDuration = switchMainPhyBackDelay.Get();
+                            if (m_nSlotsLeftAlert > 0)
+                            {
+                                timerDuration += (m_staMacs[0]
+                                                      ->GetChannelAccessManager(*auxLinkId)
+                                                      ->GetBackoffEndFor(acBe) -
+                                                  Simulator::Now());
+                            }
+                            m_staMacs[0]
+                                ->GetChannelAccessManager(*auxLinkId)
+                                ->NotifyNavStartNow(timerDuration +
+                                                    mainPhy->GetChannelSwitchDelay());
+
+                            // check that the SwitchMainPhyBackDelay timer expires and the main PHY
+                            // returns to the preferred link
+                            Simulator::Schedule(timerDuration + TimeStep(1), [=, this]() {
+                                CheckMainPhyTraceInfo(0,
+                                                      "TxopNotGainedOnAuxPhyLink",
+                                                      std::nullopt,
+                                                      m_mainPhyId,
+                                                      false);
+                            });
+                        });
+                    }
+
+                    // events to be scheduled when main PHY finishes switching to auxiliary link
+                    Simulator::Schedule(mainPhy->GetDelayUntilIdle(), [=, this]() {
+                        auto auxLinkId = m_staMacs[0]->GetLinkForPhy(mainPhy);
+                        NS_TEST_ASSERT_MSG_EQ(auxLinkId.has_value(),
                                               true,
                                               "Main PHY should have completed switching");
-                        // update backoff on the non-primary link on which main PHY is operating
-                        m_staMacs[0]
-                            ->GetChannelAccessManager(*nonPrimLinkId)
-                            ->NeedBackoffUponAccess(acBe, true, true);
+                        // update backoff on the auxiliary link on which main PHY is operating
+                        auto cam = m_staMacs[0]->GetChannelAccessManager(*auxLinkId);
+                        cam->NeedBackoffUponAccess(acBe, true, true);
+                        const auto usedAuxPhyCca =
+                            (m_useAuxPhyCca || m_auxPhyChannelWidth >= m_channelWidth) &&
+                            (m_nSlotsLeftAlert == 0 ||
+                             cam->GetBackoffEndFor(acBe) <= Simulator::Now());
+                        m_5thQosFrameExpWidth =
+                            usedAuxPhyCca ? m_auxPhyChannelWidth : m_channelWidth;
                         // record the time the transmission of the QoS data frames must have
                         // started: (a PIFS after) end of channel switch, if the backoff counter
-                        // on the non-primary link is null and UseAuxPhyCca is true (false); when
+                        // on the auxiliary link is null and UseAuxPhyCca is true (false); when
                         // the backoff expires, otherwise
-                        if (auto slots = acBe->GetBackoffSlots(*nonPrimLinkId); slots == 0)
+                        if (auto slots = acBe->GetBackoffSlots(*auxLinkId); slots == 0)
                         {
                             m_5thQosFrameTxTime =
                                 Simulator::Now() + (m_useAuxPhyCca ? Time{0} : mainPhy->GetPifs());
                         }
                         else
                         {
-                            m_5thQosFrameTxTime = m_staMacs[0]
-                                                      ->GetChannelAccessManager(*nonPrimLinkId)
-                                                      ->GetBackoffEndFor(acBe);
+                            m_5thQosFrameTxTime = cam->GetBackoffEndFor(acBe);
                         }
                     });
                 });
@@ -3012,39 +3330,11 @@
         // generate data packets for another UL data frame
         NS_LOG_INFO("Enqueuing two packets at the EMLSR client\n");
         m_staMacs[0]->GetDevice()->GetNode()->AddApplication(GetApplication(UPLINK, 0, 2, 1000));
-
         break;
     }
 }
 
 void
-EmlsrUlTxopTest::CheckInitialControlFrame(Ptr<const WifiMpdu> mpdu,
-                                          const WifiTxVector& txVector,
-                                          uint8_t linkId)
-{
-    CtrlTriggerHeader trigger;
-    mpdu->GetPacket()->PeekHeader(trigger);
-    if (!trigger.IsMuRts())
-    {
-        return;
-    }
-
-    if (linkId != m_mainPhyId && linkId != m_nonEmlsrLink)
-    {
-        // this is an ICF sent on an aux PHY link to start a DL TXOP. Given that aux PHYs do not
-        // switch channel, they are put in sleep mode while the main PHY is operating on their link
-        auto auxPhy = m_staMacs[0]->GetWifiPhy(linkId);
-        auto txDuration =
-            WifiPhy::CalculateTxDuration(mpdu->GetSize(), txVector, auxPhy->GetPhyBand());
-        Simulator::Schedule(txDuration + NanoSeconds(1), [=, this]() {
-            NS_TEST_EXPECT_MSG_EQ(auxPhy->IsStateSleep(),
-                                  true,
-                                  "Aux PHY on link " << +linkId << " not in sleep mode");
-        });
-    }
-}
-
-void
 EmlsrUlTxopTest::CheckRtsFrames(Ptr<const WifiMpdu> mpdu,
                                 const WifiTxVector& txVector,
                                 uint8_t linkId)
@@ -3096,47 +3386,62 @@
     auto txDuration = WifiPhy::CalculateTxDuration(mpdu->GetSize(),
                                                    txVector,
                                                    m_apMac->GetWifiPhy(linkId)->GetPhyBand());
+    const auto doCorruptCts = m_corruptCts.has_value() && *m_corruptCts;
 
-    if (linkId != m_mainPhyId && linkId != m_nonEmlsrLink &&
+    if (linkId != m_staMacs[0]->GetLinkForPhy(m_mainPhyId) && linkId != m_nonEmlsrLink &&
         mpdu->GetHeader().GetAddr1() == m_staMacs[0]->GetFrameExchangeManager(linkId)->GetAddress())
     {
         // this is a CTS sent to an aux PHY starting an UL TXOP. Given that aux PHYs do not
         // switch channel, they are put in sleep mode when the main PHY starts operating on their
         // link, which coincides with the end of CTS plus two propagation delays
-        auto auxPhy = m_staMacs[0]->GetWifiPhy(linkId);
+        const auto auxPhy = m_staMacs[0]->GetWifiPhy(linkId);
+        const auto mainPhy = m_staMacs[0]->GetDevice()->GetPhy(m_mainPhyId);
         Simulator::Schedule(txDuration, [=, this]() {
+            // when CTS ends, the main PHY is still switching and the aux PHY is not yet sleeping
+            NS_TEST_EXPECT_MSG_EQ(mainPhy->IsStateSwitching(),
+                                  true,
+                                  "Expecting the main PHY to be switching link");
             NS_TEST_EXPECT_MSG_EQ(auxPhy->IsStateSleep(),
                                   false,
                                   "Aux PHY on link " << +linkId << " already in sleep mode");
+            // when CTS is sent, the main PHY may have already started switching, thus we may not
+            // know which link the main PHY is moving from
+            CheckMainPhyTraceInfo(0, "UlTxopRtsSentByAuxPhy", std::nullopt, linkId, false);
         });
-        // if the CTS is corrupted, the TXOP ends and the aux PHY is not put to sleep
-        auto isStateSleep = !(m_corruptCts.has_value() && *m_corruptCts);
-
         Simulator::Schedule(
-            txDuration + MicroSeconds(2 * MAX_PROPAGATION_DELAY_USEC) + NanoSeconds(1),
+            txDuration + MicroSeconds(2 * MAX_PROPAGATION_DELAY_USEC) + TimeStep(1),
             [=, this]() {
-                NS_TEST_EXPECT_MSG_EQ(auxPhy->IsStateSleep(),
-                                      isStateSleep,
-                                      "Aux PHY on link " << +linkId
-                                                         << (isStateSleep ? " not yet" : " already")
-                                                         << " in sleep mode");
+                // aux PHYs are put to sleep if and only if CTS is not corrupted
+                // (causing the end of the TXOP)
+                CheckAuxPhysSleepMode(m_staMacs[0], !doCorruptCts);
+                // if CTS is corrupted, TXOP ends and the main PHY switches back
+                // to the preferred link
+                if (doCorruptCts)
+                {
+                    // check the traced remaining time before calling CheckMainPhyTraceInfo
+                    if (const auto traceInfoIt = m_traceInfo.find(0);
+                        traceInfoIt != m_traceInfo.cend() &&
+                        traceInfoIt->second->GetName() == "TxopEnded")
+                    {
+                        const auto& traceInfo =
+                            static_cast<const EmlsrTxopEndedTrace&>(*traceInfoIt->second);
+                        NS_TEST_EXPECT_MSG_GT(traceInfo.remTime,
+                                              Time{0},
+                                              "Expected non-zero remaining time because main PHY "
+                                              "was switching when TXOP ended");
+                    }
+
+                    CheckMainPhyTraceInfo(0, "TxopEnded", linkId, m_mainPhyId);
+                }
             });
     }
 
-    if (m_corruptCts.has_value() && *m_corruptCts)
+    if (doCorruptCts)
     {
         // corrupt reception at EMLSR client
         NS_LOG_INFO("CORRUPTED");
         m_errorModel->SetList({mpdu->GetPacket()->GetUid()});
         m_corruptCts = false;
-
-        // main PHY is about to complete channel switch when CTS ends
-        Simulator::Schedule(txDuration, [=, this]() {
-            const auto mainPhy = m_staMacs[0]->GetDevice()->GetPhy(m_mainPhyId);
-            NS_TEST_EXPECT_MSG_EQ(mainPhy->IsStateSwitching(),
-                                  true,
-                                  "Expecting the main PHY to be switching link");
-        });
     }
 }
 
@@ -3245,15 +3550,15 @@
      * For both scenarios, after the last frame exchange on the main PHY link, we have the
      * following frame exchanges on an EMLSR link where an aux PHY is operating on. After the
      * first frame exchange, aux PHYs are configured as non-TX capable. Note that the two frame
-     * exchanges may occur on distinct non-primary EMLSR links.
+     * exchanges may occur on distinct auxiliary EMLSR links.
      *
-     *                                             | main PHY || main PHY  |
-     *  [ link ]   ┌───┐         ┌───┐         ┌──┐| switches ||switches to|             ┌──┐
-     *  [0 or 2]   │CTS│         │CTS│         │BA│|to primary||non-primary|PIFS|        │BA│
-     *  ──────┬───┬┴───X────┬───┬┴───┴┬───┬───┬┴──┴─────────────────────────────┬───┬───┬┴──┴────
-     *        │RTS│         │RTS│     │QoS│QoS│                                 │QoS│QoS│
-     *        └───┘         └───┘     │ X │ Y │                                 │ Z │ W │
-     *                                └───┴───┘                                 └───┴───┘
+     *                                             | main PHY  || main PHY  |
+     *  [ link ]   ┌───┐         ┌───┐         ┌──┐|switches to||switches to|             ┌──┐
+     *  [0 or 2]   │CTS│         │CTS│         │BA│| preferred ||auxiliary  |PIFS|        │BA│
+     *  ──────┬───┬┴───X────┬───┬┴───┴┬───┬───┬┴──┴──────────────────────────────┬───┬───┬┴──┴───
+     *        │RTS│         │RTS│     │QoS│QoS│                                  │QoS│QoS│
+     *        └───┘         └───┘     │ X │ Y │                                  │ Z │ W │
+     *                                └───┴───┘                                  └───┴───┘
      * For all EMLSR links scenario, X=10, Y=11, Z=12, W=13
      * For the scenario with a non-EMLSR link, X=12, Y=13, Z=14, W=15
      */
@@ -3449,11 +3754,47 @@
                           m_auxPhyChannelWidth,
                           "Fourth data frame not transmitted on the same width as RTS");
 
+    auto fourthLinkId = psduIt->linkId;
+
     psduIt++;
     jumpToQosDataOrMuRts();
 
-    // the fifth QoS data frame is transmitted by the main PHY on a non-primary link because
-    // the aux PHY is not TX capable. The QoS data frame is not protected by RTS
+    NS_TEST_ASSERT_MSG_EQ((psduIt != m_txPsdus.cend()), true, "Expected more frames");
+    // Do not check the start transmission time if a backoff is generated even when no
+    // transmission is done (if the backoff expires while the main PHY is switching, a new
+    // backoff is generated and, before this backoff expires, the main PHY may be requested
+    // to switch to another auxiliary link; this may happen multiple times...)
+    if (!m_genBackoffIfTxopWithoutTx && !m_switchMainPhyBackDelayTimeout)
+    {
+        NS_TEST_EXPECT_MSG_LT_OR_EQ(psduIt->startTx,
+                                    m_5thQosFrameTxTime,
+                                    "Fifth data frame transmitted too late");
+    }
+
+    // the fifth QoS data frame is transmitted by the main PHY on an auxiliary link because
+    // the aux PHY is not TX capable. The QoS data frame is protected by RTS if it is transmitted
+    // on a different link than the previous one (because the MediumSyncDelay timer is running)
+    if (psduIt->linkId != fourthLinkId)
+    {
+        // RTS
+        NS_TEST_EXPECT_MSG_EQ(psduIt->psduMap.cbegin()->second->GetHeader(0).IsRts(),
+                              true,
+                              "Fifth QoS data frame should be transmitted with protection");
+        NS_TEST_EXPECT_MSG_EQ(
+            +psduIt->phyId,
+            +m_mainPhyId,
+            "RTS before fifth QoS data frame should be transmitted by the main PHY");
+        psduIt++;
+        // CTS
+        NS_TEST_ASSERT_MSG_EQ((psduIt != m_txPsdus.cend()),
+                              true,
+                              "CTS before fifth QoS data frame has not been transmitted");
+        NS_TEST_EXPECT_MSG_EQ(psduIt->psduMap.cbegin()->second->GetHeader(0).IsCts(),
+                              true,
+                              "CTS before fifth QoS data frame has not been transmitted");
+        psduIt++;
+    }
+
     // QoS Data
     NS_TEST_ASSERT_MSG_EQ((psduIt != m_txPsdus.cend()),
                           true,
@@ -3466,22 +3807,327 @@
                           "Fifth QoS data frame should be transmitted by the main PHY");
     NS_TEST_EXPECT_MSG_NE(+psduIt->linkId,
                           +m_mainPhyId,
-                          "Fifth QoS data frame should be transmitted on a non-primary link");
+                          "Fifth QoS data frame should be transmitted on an auxiliary link");
     NS_TEST_EXPECT_MSG_EQ(psduIt->txVector.GetChannelWidth(),
-                          (m_useAuxPhyCca ? m_auxPhyChannelWidth : m_channelWidth),
+                          m_5thQosFrameExpWidth,
                           "Fifth data frame not transmitted on the correct channel width");
-    // Do not check the start transmission time if a backoff is generated even when no
-    // transmission is done (if the backoff expires while the main PHY is switching, a new
-    // backoff is generated and, before this backoff expires, the main PHY may be requested
-    // to switch to another non-primary link; this may happen multiple times...)
-    if (!m_genBackoffIfTxopWithoutTx)
+}
+
+EmlsrUlOfdmaTest::EmlsrUlOfdmaTest(bool enableBsrp)
+    : EmlsrOperationsTestBase("Check UL OFDMA operations with an EMLSR client"),
+      m_enableBsrp(enableBsrp),
+      m_txPsdusPos(0),
+      m_startAccessReq(0)
+{
+    m_linksToEnableEmlsrOn = {0, 1, 2};
+    m_nEmlsrStations = 1;
+    m_nNonEmlsrStations = 1;
+    m_establishBaDl = false;
+    m_establishBaUl = true;
+    m_mainPhyId = 1;
+    m_duration = Seconds(1);
+}
+
+void
+EmlsrUlOfdmaTest::DoSetup()
+{
+    Config::SetDefault("ns3::WifiPhy::ChannelSwitchDelay", TimeValue(m_transitionDelay.at(0)));
+
+    EmlsrOperationsTestBase::DoSetup();
+
+    m_apMac->GetQosTxop(AC_BE)->SetTxopLimits(
+        {MicroSeconds(3200), MicroSeconds(3200), MicroSeconds(3200)});
+
+    auto muScheduler = CreateObjectWithAttributes<RrMultiUserScheduler>("EnableUlOfdma",
+                                                                        BooleanValue(true),
+                                                                        "EnableBsrp",
+                                                                        BooleanValue(m_enableBsrp));
+    m_apMac->AggregateObject(muScheduler);
+}
+
+void
+EmlsrUlOfdmaTest::Transmit(Ptr<WifiMac> mac,
+                           uint8_t phyId,
+                           WifiConstPsduMap psduMap,
+                           WifiTxVector txVector,
+                           double txPowerW)
+{
+    EmlsrOperationsTestBase::Transmit(mac, phyId, psduMap, txVector, txPowerW);
+    auto linkId = m_txPsdus.back().linkId;
+
+    auto psdu = psduMap.begin()->second;
+
+    switch (psdu->GetHeader(0).GetType())
     {
-        NS_TEST_EXPECT_MSG_LT_OR_EQ(psduIt->startTx,
-                                    m_5thQosFrameTxTime,
-                                    "Fifth data frame transmitted too late");
+    case WIFI_MAC_CTL_TRIGGER:
+        if (m_txPsdusPos == 0 && !m_startAccessReq.IsZero() && Simulator::Now() >= m_startAccessReq)
+        {
+            // this is the first Trigger Frame sent after the AP requested channel access
+            // through the Multi-user scheduler and it is an ICF for the EMLSR client
+            m_txPsdusPos = m_txPsdus.size() - 1;
+            auto txDuration = WifiPhy::CalculateTxDuration(psduMap,
+                                                           txVector,
+                                                           mac->GetWifiPhy(linkId)->GetPhyBand());
+            NS_LOG_INFO("This is the first Trigger Frame\n");
+            // once the Trigger Frame is received by the EMLSR client, make the client application
+            // on the EMLSR client generate two packets. These packets will be sent via UL OFDMA
+            // because the EMLSR client has blocked transmissions on other links when receiving
+            // this Trigger Frame, hence it will not try to get access on other links via EDCA
+            Simulator::Schedule(
+                txDuration + MicroSeconds(1), // to account for propagation delay
+                [=, this]() {
+                    for (const auto id : m_staMacs[0]->GetLinkIds())
+                    {
+                        auto ehtFem = StaticCast<EhtFrameExchangeManager>(
+                            m_staMacs[0]->GetFrameExchangeManager(id));
+                        NS_TEST_EXPECT_MSG_EQ(
+                            ehtFem->UsingOtherEmlsrLink(),
+                            (id != linkId),
+                            "Link " << +id << " was" << (id == linkId ? " not" : "")
+                                    << " expected to be blocked on EMLSR client at time "
+                                    << Simulator::Now().As(Time::NS));
+                    }
+                    NS_LOG_INFO("Generate two packets\n");
+                    m_staMacs[0]->GetDevice()->GetNode()->AddApplication(
+                        GetApplication(UPLINK, 0, 2, 100));
+                });
+        }
+        break;
+
+    case WIFI_MAC_CTL_BACKRESP:
+        if (!m_startAccessReq.IsZero() && Simulator::Now() >= m_startAccessReq)
+        {
+            CtrlBAckResponseHeader blockAck;
+            psdu->GetPayload(0)->PeekHeader(blockAck);
+            if (blockAck.IsMultiSta())
+            {
+                auto txDuration =
+                    WifiPhy::CalculateTxDuration(psduMap,
+                                                 txVector,
+                                                 mac->GetWifiPhy(linkId)->GetPhyBand());
+                Simulator::Stop(txDuration + MicroSeconds(1));
+            }
+        }
+        break;
+
+    default:;
+    }
+
+    if (psdu->GetHeader(0).IsCfEnd())
+    {
+        // we do not check CF-End frames
+        m_txPsdus.pop_back();
     }
 }
 
+void
+EmlsrUlOfdmaTest::DoRun()
+{
+    Simulator::Stop(m_duration);
+    Simulator::Run();
+
+    CheckResults();
+
+    Simulator::Destroy();
+}
+
+void
+EmlsrUlOfdmaTest::StartTraffic()
+{
+    auto muScheduler = m_apMac->GetObject<MultiUserScheduler>();
+    NS_TEST_ASSERT_MSG_NE(muScheduler, nullptr, "No MU scheduler installed on AP MLD");
+
+    NS_LOG_INFO("Setting Access Request interval");
+
+    const auto interval = MilliSeconds(50);
+    muScheduler->SetAccessReqInterval(interval);
+    m_startAccessReq = Simulator::Now() + interval;
+}
+
+void
+EmlsrUlOfdmaTest::CheckResults()
+{
+    /**
+     * Sending BSRP TF disabled.
+     *
+     * The figure assumes that link 0 is used to send the first Trigger Frame after that the
+     * AP MLD requests channel access through the Multi-user scheduler. The first Trigger Frame
+     * is MU-RTS because EMLSR client needs an ICF; the other Trigger Frames are Basic TFs and
+     * do not solicit the EMLSR client.
+     *             ┌─────┐     ┌─────┐           ┌──────┐
+     *             │ MU  │     │Basic│           │Multi-│
+     *  [link 0]   │ RTS │     │  TF │           │STA BA│
+     *  ───────────┴─────┴┬───┬┴─────┴┬────────┬─┴──────┴───────────────
+     *                    │CTS│       │QoS Null│
+     *                    ├───┤       ├────────┤
+     *                    │CTS│       │QoS Data│
+     *                    └───┘       └────────┘
+     *
+     *               ┌─────┐
+     *               │Basic│
+     *  [link 1]     │  TF │
+     *  ─────────────┴─────┴┬────┬──────────────────────────────────────
+     *                      │QoS │
+     *                      │Null│
+     *                      └────┘
+     *
+     *               ┌─────┐
+     *               │Basic│
+     *  [link 2]     │  TF │
+     *  ─────────────┴─────┴┬────┬──────────────────────────────────────
+     *                      │QoS │
+     *                      │Null│
+     *                      └────┘
+     *
+     * Sending BSRP TF enabled.
+     *
+     * The figure assumes that link 0 is used to send the first Trigger Frame after that the
+     * AP MLD requests channel access through the Multi-user scheduler. The first Trigger Frames
+     * are all BSRP Trigger Frames, but only the first one solicits the EMLSR client, too.
+     *             ┌─────┐          ┌─────┐           ┌──────┐
+     *             │BSRP │          │Basic│           │Multi-│
+     *  [link 0]   │  TF │          │  TF │           │STA BA│
+     *  ───────────┴─────┴┬────────┬┴─────┴┬────────┬─┴──────┴──────────
+     *                    │QoS Null│       │QoS Data│
+     *                    ├────────┤       └────────┘
+     *                    │QoS Null│
+     *                    └────────┘
+     *
+     *               ┌─────┐
+     *               │BSRP │
+     *  [link 1]     │  TF │
+     *  ─────────────┴─────┴┬────┬──────────────────────────────────────
+     *                      │QoS │
+     *                      │Null│
+     *                      └────┘
+     *
+     *               ┌─────┐
+     *               │BSRP │
+     *  [link 2]     │  TF │
+     *  ─────────────┴─────┴┬────┬──────────────────────────────────────
+     *                      │QoS │
+     *                      │Null│
+     *                      └────┘
+     */
+
+    NS_TEST_ASSERT_MSG_GT(m_txPsdusPos, 0, "First Trigger Frame not detected");
+
+    // Check the Trigger Frames (one per link) after requesting channel access
+    auto index = m_txPsdusPos;
+    const auto firstLinkId = m_txPsdus[m_txPsdusPos].linkId;
+    for (; index < m_txPsdusPos + 3; ++index)
+    {
+        NS_TEST_ASSERT_MSG_EQ(m_txPsdus[index].psduMap.cbegin()->second->GetHeader(0).IsTrigger(),
+                              true,
+                              "Expected a Trigger Frame");
+        CtrlTriggerHeader trigger;
+        m_txPsdus[index].psduMap.cbegin()->second->GetPayload(0)->PeekHeader(trigger);
+
+        TriggerFrameType triggerType =
+            m_enableBsrp ? TriggerFrameType::BSRP_TRIGGER
+                         : (index == m_txPsdusPos ? TriggerFrameType::MU_RTS_TRIGGER
+                                                  : TriggerFrameType::BASIC_TRIGGER);
+        NS_TEST_EXPECT_MSG_EQ(+static_cast<uint8_t>(trigger.GetType()),
+                              +static_cast<uint8_t>(triggerType),
+                              "Unexpected Trigger Frame type on link " << +m_txPsdus[index].linkId);
+
+        // only the first TF solicits the EMLSR client and the non-AP MLD
+        NS_TEST_EXPECT_MSG_EQ(
+            trigger.GetNUserInfoFields(),
+            (index == m_txPsdusPos ? 2 : 1),
+            "Unexpected number of User Info fields for Trigger Frame, index=" << index);
+    }
+
+    auto startIndex = index;
+    std::size_t ctsCount = 0;
+    std::size_t qosNullCount = 0;
+    // Check responses to Trigger Frames
+    for (; index < startIndex + 4; ++index)
+    {
+        const auto& hdr = m_txPsdus[index].psduMap.cbegin()->second->GetHeader(0);
+
+        if (hdr.IsCts())
+        {
+            ++ctsCount;
+            continue;
+        }
+
+        if (hdr.IsQosData() && !hdr.HasData())
+        {
+            ++qosNullCount;
+            // if BSRP is enabled, the QoS Null frame sent by the EMLSR client in response to the
+            // first BSRP TF reports a non-null buffer status
+            if (m_enableBsrp &&
+                hdr.GetAddr2() == m_staMacs[0]->GetFrameExchangeManager(firstLinkId)->GetAddress())
+            {
+                NS_TEST_EXPECT_MSG_GT(+hdr.GetQosQueueSize(), 0, "Unexpected buffer size");
+            }
+            else
+            {
+                NS_TEST_EXPECT_MSG_EQ(+hdr.GetQosQueueSize(), 0, "Unexpected buffer size");
+            }
+            continue;
+        }
+    }
+    NS_TEST_EXPECT_MSG_EQ(ctsCount, (m_enableBsrp ? 0 : 2), "Unexpected number of CTS frames");
+    NS_TEST_EXPECT_MSG_EQ(qosNullCount,
+                          (m_enableBsrp ? 4 : 2),
+                          "Unexpected number of QoS Null frames");
+
+    // we expect only one Basic Trigger Frame (sent on the same link as the first Trigger Frame),
+    // because the buffer status reported on the other links by the non-EMLSR client is zero
+    NS_TEST_ASSERT_MSG_EQ(m_txPsdus[index].psduMap.cbegin()->second->GetHeader(0).IsTrigger(),
+                          true,
+                          "Expected a Trigger Frame");
+    NS_TEST_EXPECT_MSG_EQ(+m_txPsdus[index].linkId,
+                          +firstLinkId,
+                          "Unexpected link ID for Basic TF");
+    CtrlTriggerHeader trigger;
+    m_txPsdus[index].psduMap.cbegin()->second->GetPayload(0)->PeekHeader(trigger);
+
+    NS_TEST_EXPECT_MSG_EQ(+static_cast<uint8_t>(trigger.GetType()),
+                          +static_cast<uint8_t>(TriggerFrameType::BASIC_TRIGGER),
+                          "Unexpected Trigger Frame type");
+
+    // when BSRP TF is enabled, the non-EMLSR client has already communicated a buffer status of
+    // zero, so it is not solicited by the AP through the Basic Trigger Frame. Otherwise, it is
+    // solicited because buffer status was not known when the BSRP TF was prepared (before sending
+    // MU-RTS)
+    NS_TEST_EXPECT_MSG_EQ(trigger.GetNUserInfoFields(),
+                          (m_enableBsrp ? 1 : 2),
+                          "Unexpected number of User Info fields for Basic Trigger Frame");
+
+    // Response(s) to the Basic Trigger Frame
+    startIndex = ++index;
+    for (; index < startIndex + (m_enableBsrp ? 1 : 2); ++index)
+    {
+        const auto& hdr = m_txPsdus[index].psduMap.cbegin()->second->GetHeader(0);
+
+        NS_TEST_EXPECT_MSG_EQ(hdr.IsQosData(), true, "Expected a QoS frame");
+
+        // EMLSR client sends a QoS Data frame, non-EMLSR client sends a QoS Null frame
+        NS_TEST_EXPECT_MSG_EQ(
+            hdr.HasData(),
+            (hdr.GetAddr2() == m_staMacs[0]->GetFrameExchangeManager(firstLinkId)->GetAddress()),
+            "Unexpected type of QoS data frame");
+
+        if (hdr.HasData())
+        {
+            NS_TEST_EXPECT_MSG_EQ(m_txPsdus[index].txVector.IsUlMu(),
+                                  true,
+                                  "QoS Data frame should be sent in a TB PPDU");
+        }
+    }
+
+    // Finally, the AP MLD sends a Multi-STA BlockAck
+    NS_TEST_EXPECT_MSG_EQ(m_txPsdus[index].psduMap.cbegin()->second->GetHeader(0).IsBlockAck(),
+                          true,
+                          "Expected a BlockAck frame");
+    CtrlBAckResponseHeader blockAck;
+    m_txPsdus[index].psduMap.cbegin()->second->GetPayload(0)->PeekHeader(blockAck);
+    NS_TEST_EXPECT_MSG_EQ(blockAck.IsMultiSta(), true, "Expected a Multi-STA BlockAck");
+}
+
 EmlsrLinkSwitchTest::EmlsrLinkSwitchTest(const Params& params)
     : EmlsrOperationsTestBase(
           std::string("Check EMLSR link switching (switchAuxPhy=") +
@@ -3501,7 +4147,7 @@
     m_linksToEnableEmlsrOn = {0, 1, 2}; // enable EMLSR on all links right after association
     m_mainPhyId = 1;
     m_establishBaDl = true;
-    m_duration = Seconds(1.0);
+    m_duration = Seconds(1);
     // when aux PHYs do not switch link, the main PHY switches back to its previous link after
     // a TXOP, hence the transition delay must exceed the channel switch delay (default: 250us)
     m_transitionDelay = {MicroSeconds(128)};
@@ -3582,8 +4228,7 @@
     Config::SetDefault("ns3::AdvancedEmlsrManager::InterruptSwitch",
                        BooleanValue(m_resetCamStateAndInterruptSwitch));
     Config::SetDefault("ns3::EmlsrManager::AuxPhyChannelWidth", UintegerValue(m_auxPhyMaxChWidth));
-    Config::SetDefault("ns3::WifiPhy::ChannelSwitchDelay", TimeValue(MicroSeconds(75)));
-    Config::SetDefault("ns3::EhtConfiguration::MediumSyncDuration", TimeValue(Time{0}));
+    Config::SetDefault("ns3::WifiPhy::ChannelSwitchDelay", TimeValue(MicroSeconds(45)));
 
     EmlsrOperationsTestBase::DoSetup();
 
@@ -3925,34 +4570,67 @@
 
         // check that when CTS timeout occurs, the main PHY is switching
         Simulator::Schedule(
-            m_staMacs[0]->GetFrameExchangeManager(linkId)->GetWifiTxTimer().GetDelayLeft(),
+            m_staMacs[0]->GetFrameExchangeManager(linkId)->GetWifiTxTimer().GetDelayLeft() -
+                TimeStep(1),
             [=, this]() {
+                // store the time to complete the current channel switch at CTS timeout
                 auto mainPhy = m_staMacs[0]->GetDevice()->GetPhy(m_mainPhyId);
-                NS_TEST_EXPECT_MSG_EQ(mainPhy->IsStateSwitching(),
-                                      true,
-                                      "Main PHY expected to be in SWITCHING state instead of "
-                                          << mainPhy->GetState()->GetState());
+                auto toCurrSwitchEnd = mainPhy->GetDelayUntilIdle() + TimeStep(1);
 
-                // If main PHY channel switch can be interrupted, the main PHY should be back
-                // operating on the primary link after a channel switch delay. Otherwise, it
-                // will be operating on the primary link, if SwitchAuxPhy is false, or on the
-                // link used to send the RTS, if SwitchAuxPhy is true, after the remaining
-                // channel switching time plus the channel switch delay.
-                auto newLinkId =
-                    (m_resetCamStateAndInterruptSwitch || !m_switchAuxPhy) ? m_mainPhyId : linkId;
-                auto delay = mainPhy->GetChannelSwitchDelay();
-                if (!m_resetCamStateAndInterruptSwitch)
-                {
-                    delay += mainPhy->GetDelayUntilIdle();
-                }
-                Simulator::Schedule(delay + TimeStep(1), [=, this]() {
-                    auto id = m_staMacs[0]->GetLinkForPhy(mainPhy);
-                    NS_TEST_EXPECT_MSG_EQ(id.has_value(),
+                Simulator::Schedule(TimeStep(1), [=, this]() {
+                    NS_TEST_EXPECT_MSG_EQ(mainPhy->IsStateSwitching(),
                                           true,
-                                          "Expected main PHY to operate on a link");
-                    NS_TEST_EXPECT_MSG_EQ(*id,
-                                          newLinkId,
-                                          "Main PHY is operating on an unexpected link");
+                                          "Main PHY expected to be in SWITCHING state instead of "
+                                              << mainPhy->GetState()->GetState());
+
+                    // If main PHY channel switch can be interrupted, the main PHY should be back
+                    // operating on the preferred link after a channel switch delay. Otherwise, it
+                    // will be operating on the preferred link, if SwitchAuxPhy is false, or on the
+                    // link used to send the RTS, if SwitchAuxPhy is true, after the remaining
+                    // channel switching time plus the channel switch delay.
+                    auto newLinkId = (m_resetCamStateAndInterruptSwitch || !m_switchAuxPhy)
+                                         ? m_mainPhyId
+                                         : linkId;
+                    auto delayLeft = m_resetCamStateAndInterruptSwitch
+                                         ? Time{0}
+                                         : toCurrSwitchEnd; // time to complete current switch
+                    if (m_resetCamStateAndInterruptSwitch || !m_switchAuxPhy)
+                    {
+                        // add the time to perform another channel switch
+                        delayLeft += mainPhy->GetChannelSwitchDelay();
+                    }
+
+                    auto totalSwitchDelay =
+                        delayLeft + (mainPhy->GetChannelSwitchDelay() - toCurrSwitchEnd);
+
+                    Simulator::Schedule(delayLeft - TimeStep(1), [=, this]() {
+                        // check if the MSD timer was running on the link left by the main PHY
+                        // before completing channel switch
+                        bool msdWasRunning = m_staMacs[0]
+                                                 ->GetEmlsrManager()
+                                                 ->GetElapsedMediumSyncDelayTimer(m_mainPhyId)
+                                                 .has_value();
+
+                        Simulator::Schedule(TimeStep(2), [=, this]() {
+                            auto id = m_staMacs[0]->GetLinkForPhy(mainPhy);
+                            NS_TEST_EXPECT_MSG_EQ(id.has_value(),
+                                                  true,
+                                                  "Expected main PHY to operate on a link");
+                            NS_TEST_EXPECT_MSG_EQ(*id,
+                                                  newLinkId,
+                                                  "Main PHY is operating on an unexpected link");
+                            const auto startMsd =
+                                (totalSwitchDelay >
+                                 MicroSeconds(EmlsrManager::MEDIUM_SYNC_THRESHOLD_USEC));
+                            const auto msdIsRunning = msdWasRunning || startMsd;
+                            CheckMsdTimerRunning(
+                                m_staMacs[0],
+                                m_mainPhyId,
+                                msdIsRunning,
+                                std::string("because total switch delay was ") +
+                                    std::to_string(totalSwitchDelay.GetNanoSeconds()) + "ns");
+                        });
+                    });
                 });
             });
     }
@@ -4061,7 +4739,7 @@
     }
 }
 
-EmlsrCcaBusyTest::EmlsrCcaBusyTest(uint16_t auxPhyMaxChWidth)
+EmlsrCcaBusyTest::EmlsrCcaBusyTest(MHz_u auxPhyMaxChWidth)
     : EmlsrOperationsTestBase(std::string("Check EMLSR link switching (auxPhyMaxChWidth=") +
                               std::to_string(auxPhyMaxChWidth) + "MHz )"),
       m_auxPhyMaxChWidth(auxPhyMaxChWidth),
@@ -4074,7 +4752,7 @@
     m_linksToEnableEmlsrOn = {0, 1, 2}; // enable EMLSR on all links right after association
     m_mainPhyId = 1;
     m_establishBaUl = true;
-    m_duration = Seconds(1.0);
+    m_duration = Seconds(1);
     m_transitionDelay = {MicroSeconds(128)};
 }
 
@@ -4149,10 +4827,12 @@
     m_nextMainPhyLinkId = (m_currMainPhyLinkId + 1) % 2;
 
     // request the main PHY to switch to another link
-    m_staMacs[0]->GetEmlsrManager()->SwitchMainPhy(m_nextMainPhyLinkId,
-                                                   false,
-                                                   EmlsrManager::DONT_RESET_BACKOFF,
-                                                   EmlsrManager::DONT_REQUEST_ACCESS);
+    m_staMacs[0]->GetEmlsrManager()->SwitchMainPhy(
+        m_nextMainPhyLinkId,
+        false,
+        EmlsrManager::DONT_RESET_BACKOFF,
+        EmlsrManager::DONT_REQUEST_ACCESS,
+        EmlsrDlTxopIcfReceivedByAuxPhyTrace{}); // trace info not used
 
     // the other MLD transmits a packet to the AP
     TransmitPacketToAp(m_nextMainPhyLinkId);
@@ -4197,12 +4877,12 @@
     NS_TEST_EXPECT_MSG_NE(mainPhy, auxPhy, "Main PHY is operating on an unexpected link");
 
     // 2. Aux PHY is receiving the PHY header
-    NS_TEST_EXPECT_MSG_EQ(auxPhy->IsReceivingPhyHeader(),
+    NS_TEST_EXPECT_MSG_EQ(auxPhy->GetInfoIfRxingPhyHeader().has_value(),
                           true,
                           "Aux PHY is not receiving a PHY header");
 
     // 3. Main PHY dropped the preamble because it is switching
-    NS_TEST_EXPECT_MSG_EQ(mainPhy->IsReceivingPhyHeader(),
+    NS_TEST_EXPECT_MSG_EQ(mainPhy->GetInfoIfRxingPhyHeader().has_value(),
                           false,
                           "Main PHY is receiving a PHY header");
 
@@ -4288,38 +4968,64 @@
     for (const auto& emlsrLinks :
          {std::set<uint8_t>{0, 1, 2}, std::set<uint8_t>{1, 2}, std::set<uint8_t>{0, 1}})
     {
-        AddTestCase(
-            new EmlsrDlTxopTest(
-                {1, 0, emlsrLinks, {MicroSeconds(32)}, {MicroSeconds(32)}, MicroSeconds(512)}),
-            TestCase::Duration::QUICK);
-        AddTestCase(
-            new EmlsrDlTxopTest(
-                {1, 1, emlsrLinks, {MicroSeconds(64)}, {MicroSeconds(64)}, MicroSeconds(512)}),
-            TestCase::Duration::QUICK);
+        AddTestCase(new EmlsrDlTxopTest({1,
+                                         0,
+                                         emlsrLinks,
+                                         {MicroSeconds(32)},
+                                         {MicroSeconds(32)},
+                                         MicroSeconds(512),
+                                         true /* putAuxPhyToSleep */}),
+                    TestCase::Duration::QUICK);
+        AddTestCase(new EmlsrDlTxopTest({1,
+                                         1,
+                                         emlsrLinks,
+                                         {MicroSeconds(64)},
+                                         {MicroSeconds(64)},
+                                         MicroSeconds(512),
+                                         false /* putAuxPhyToSleep */}),
+                    TestCase::Duration::QUICK);
         AddTestCase(new EmlsrDlTxopTest({2,
                                          2,
                                          emlsrLinks,
                                          {MicroSeconds(128), MicroSeconds(256)},
                                          {MicroSeconds(128), MicroSeconds(256)},
-                                         MicroSeconds(512)}),
+                                         MicroSeconds(512),
+                                         true /* putAuxPhyToSleep */}),
                     TestCase::Duration::QUICK);
     }
 
     for (auto genBackoffAndUseAuxPhyCca : {true, false})
     {
-        AddTestCase(new EmlsrUlTxopTest(
-                        {{0, 1, 2}, 40, 20, MicroSeconds(5504), 3, genBackoffAndUseAuxPhyCca}),
-                    TestCase::Duration::QUICK);
-        AddTestCase(
-            new EmlsrUlTxopTest({{0, 1}, 40, 20, MicroSeconds(5504), 1, genBackoffAndUseAuxPhyCca}),
-            TestCase::Duration::QUICK);
+        for (auto nSlotsLeft : std::initializer_list<uint8_t>{0, 4})
+        {
+            AddTestCase(new EmlsrUlTxopTest({{0, 1, 2},
+                                             MHz_u{40},
+                                             MHz_u{20},
+                                             MicroSeconds(5504),
+                                             3,
+                                             genBackoffAndUseAuxPhyCca,
+                                             nSlotsLeft,
+                                             true, /* putAuxPhyToSleep */
+                                             false /* switchMainPhyBackDelayTimeout */}),
+                        TestCase::Duration::QUICK);
+            AddTestCase(new EmlsrUlTxopTest({{0, 1},
+                                             MHz_u{40},
+                                             MHz_u{20},
+                                             MicroSeconds(5504),
+                                             1,
+                                             genBackoffAndUseAuxPhyCca,
+                                             nSlotsLeft,
+                                             false, /* putAuxPhyToSleep */
+                                             true /* switchMainPhyBackDelayTimeout */}),
+                        TestCase::Duration::QUICK);
+        }
     }
 
     for (bool switchAuxPhy : {true, false})
     {
         for (bool resetCamStateAndInterruptSwitch : {true, false})
         {
-            for (MHz_u auxPhyMaxChWidth : {20, 40, 80, 160})
+            for (auto auxPhyMaxChWidth : {MHz_u{20}, MHz_u{40}, MHz_u{80}, MHz_u{160}})
             {
                 AddTestCase(new EmlsrLinkSwitchTest(
                                 {switchAuxPhy, resetCamStateAndInterruptSwitch, auxPhyMaxChWidth}),
@@ -4328,8 +5034,11 @@
         }
     }
 
-    AddTestCase(new EmlsrCcaBusyTest(20), TestCase::Duration::QUICK);
-    AddTestCase(new EmlsrCcaBusyTest(80), TestCase::Duration::QUICK);
+    AddTestCase(new EmlsrUlOfdmaTest(false), TestCase::Duration::QUICK);
+    AddTestCase(new EmlsrUlOfdmaTest(true), TestCase::Duration::QUICK);
+
+    AddTestCase(new EmlsrCcaBusyTest(MHz_u{20}), TestCase::Duration::QUICK);
+    AddTestCase(new EmlsrCcaBusyTest(MHz_u{80}), TestCase::Duration::QUICK);
 }
 
 static WifiEmlsrTestSuite g_wifiEmlsrTestSuite; ///< the test suite
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/test/wifi-emlsr-test.h ns-3.44/src/wifi/test/wifi-emlsr-test.h
--- ns-3.43/src/wifi/test/wifi-emlsr-test.h	2024-10-09 16:41:10.136656800 -0700
+++ ns-3.44/src/wifi/test/wifi-emlsr-test.h	2025-03-09 16:55:49.807372600 -0700
@@ -21,13 +21,26 @@
 #include "ns3/wifi-ppdu.h"
 #include "ns3/wifi-psdu.h"
 
+#include <list>
+#include <map>
+#include <memory>
+#include <optional>
+#include <set>
+#include <vector>
+
 using namespace ns3;
 
+// forward declaration
+namespace ns3
+{
+struct EmlsrMainPhySwitchTrace;
+}
+
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test EML Operating Mode Notification frame serialization and deserialization
+ * @brief Test EML Operating Mode Notification frame serialization and deserialization
  */
 class EmlOperatingModeNotificationTest : public HeaderSerializationTestCase
 {
@@ -43,10 +56,10 @@
 };
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Base class for EMLSR Operations tests
+ * @brief Base class for EMLSR Operations tests
  *
  * This base class setups and configures one AP MLD, a variable number of non-AP MLDs with
  * EMLSR activated and a variable number of non-AP MLD with EMLSR deactivated. Every MLD has
@@ -63,7 +76,7 @@
     /**
      * Constructor
      *
-     * \param name The name of the new TestCase created
+     * @param name The name of the new TestCase created
      */
     EmlsrOperationsTestBase(const std::string& name);
     ~EmlsrOperationsTestBase() override = default;
@@ -79,11 +92,11 @@
     /**
      * Callback invoked when a FEM passes PSDUs to the PHY.
      *
-     * \param mac the MAC transmitting the PSDUs
-     * \param phyId the ID of the PHY transmitting the PSDUs
-     * \param psduMap the PSDU map
-     * \param txVector the TX vector
-     * \param txPowerW the tx power in Watts
+     * @param mac the MAC transmitting the PSDUs
+     * @param phyId the ID of the PHY transmitting the PSDUs
+     * @param psduMap the PSDU map
+     * @param txVector the TX vector
+     * @param txPowerW the tx power in Watts
      */
     virtual void Transmit(Ptr<WifiMac> mac,
                           uint8_t phyId,
@@ -92,11 +105,11 @@
                           double txPowerW);
 
     /**
-     * \param dir the traffic direction (downlink/uplink)
-     * \param staId the index (starting at 0) of the non-AP MLD generating/receiving packets
-     * \param count the number of packets to generate
-     * \param pktSize the size of the packets to generate
-     * \return an application generating the given number packets of the given size from/to the
+     * @param dir the traffic direction (downlink/uplink)
+     * @param staId the index (starting at 0) of the non-AP MLD generating/receiving packets
+     * @param count the number of packets to generate
+     * @param pktSize the size of the packets to generate
+     * @return an application generating the given number packets of the given size from/to the
      *         AP MLD to/from the given non-AP MLD
      */
     Ptr<PacketSocketClient> GetApplication(TrafficDirection dir,
@@ -108,13 +121,13 @@
      * Check whether QoS data unicast transmissions addressed to the given destination on the
      * given link are blocked or unblocked for the given reason on the given device.
      *
-     * \param mac the MAC of the given device
-     * \param dest the MAC address of the given destination
-     * \param linkId the ID of the given link
-     * \param reason the reason for blocking transmissions to test
-     * \param blocked whether transmissions are blocked for the given reason
-     * \param description text indicating when this check is performed
-     * \param testUnblockedForOtherReasons whether to test if transmissions are unblocked for
+     * @param mac the MAC of the given device
+     * @param dest the MAC address of the given destination
+     * @param linkId the ID of the given link
+     * @param reason the reason for blocking transmissions to test
+     * @param blocked whether transmissions are blocked for the given reason
+     * @param description text indicating when this check is performed
+     * @param testUnblockedForOtherReasons whether to test if transmissions are unblocked for
      *                                     all the reasons other than the one provided
      */
     void CheckBlockedLink(Ptr<WifiMac> mac,
@@ -125,6 +138,52 @@
                           std::string description,
                           bool testUnblockedForOtherReasons = true);
 
+    /**
+     * Check whether the MediumSyncDelay timer is running on the given link of the given device.
+     *
+     * @param staMac the MAC of the given device
+     * @param linkId the ID of the given link
+     * @param isRunning whether the MediumSyncDelay timer is running
+     * @param msg message to print in case the check failed
+     */
+    void CheckMsdTimerRunning(Ptr<StaWifiMac> staMac,
+                              uint8_t linkId,
+                              bool isRunning,
+                              const std::string& msg);
+
+    /**
+     * Check whether aux PHYs of the given device are in sleep mode/awake.
+     *
+     * @param staMac the MAC of the given device
+     * @param sleep whether aux PHYs should be in sleep mode
+     */
+    void CheckAuxPhysSleepMode(Ptr<StaWifiMac> staMac, bool sleep);
+
+    /**
+     * Callback connected to the EMLSR Manager MainPhySwitch trace source.
+     *
+     * @param index the index of the EMLSR client whose main PHY switch event is logged
+     * @param info the information associated with the main PHY switch event
+     */
+    void MainPhySwitchInfoCallback(std::size_t index, const EmlsrMainPhySwitchTrace& info);
+
+    /**
+     * Check information provided by the EMLSR Manager MainPhySwitch trace.
+     *
+     * @param index the ID of the EMLSR client this check refers to
+     * @param reason the reason for main PHY to switch
+     * @param fromLinkId the ID of the link the main PHY is moving from (if any)
+     * @param toLinkId the ID of the link the main PHY is moving to
+     * @param checkFromLinkId whether to check the given fromLinkId value
+     * @param checkToLinkId whether to check the given toLinkId value
+     */
+    void CheckMainPhyTraceInfo(std::size_t index,
+                               std::string_view reason,
+                               const std::optional<uint8_t>& fromLinkId,
+                               uint8_t toLinkId,
+                               bool checkFromLinkId = true,
+                               bool checkToLinkId = true);
+
     void DoSetup() override;
 
     /// Information about transmitted frames
@@ -147,18 +206,21 @@
     std::vector<Time> m_paddingDelay{
         {MicroSeconds(32)}}; ///< Padding Delay advertised by the non-AP MLD
     std::vector<Time> m_transitionDelay{
-        {MicroSeconds(16)}};                ///< Transition Delay advertised by the non-AP MLD
-    bool m_establishBaDl{false};            /**< whether BA needs to be established (for TID 0)
-                                                 with the AP as originator */
-    bool m_establishBaUl{false};            /**< whether BA needs to be established (for TID 0)
-                                                 with the AP as recipient */
-    std::vector<FrameInfo> m_txPsdus;       ///< transmitted PSDUs
-    Ptr<ApWifiMac> m_apMac;                 ///< AP wifi MAC
-    std::vector<Ptr<StaWifiMac>> m_staMacs; ///< MACs of the non-AP MLDs
+        {MicroSeconds(16)}};          ///< Transition Delay advertised by the non-AP MLD
+    bool m_establishBaDl{false};      /**< whether BA needs to be established (for TID 0)
+                                           with the AP as originator */
+    bool m_establishBaUl{false};      /**< whether BA needs to be established (for TID 0)
+                                           with the AP as recipient */
+    bool m_putAuxPhyToSleep{false};   //!< whether aux PHYs are put to sleep during DL/UL TXOPs
+    std::vector<FrameInfo> m_txPsdus; ///< transmitted PSDUs
+    Ptr<ApWifiMac> m_apMac;           ///< AP wifi MAC
+    std::vector<Ptr<StaWifiMac>> m_staMacs;       ///< MACs of the non-AP MLDs
     std::vector<PacketSocketAddress> m_dlSockets; ///< packet socket address for DL traffic
     std::vector<PacketSocketAddress> m_ulSockets; ///< packet socket address for UL traffic
     uint16_t m_lastAid{0};                        ///< AID of last associated station
     Time m_duration{0};                           ///< simulation duration
+    std::map<std::size_t, std::shared_ptr<EmlsrMainPhySwitchTrace>>
+        m_traceInfo; ///< EMLSR client ID-indexed map of trace info from last main PHY switch
 
   private:
     /**
@@ -166,7 +228,7 @@
      * This method is connected to the ApWifiMac's AssociatedSta trace source.
      * Start generating traffic (if needed) when all stations are associated.
      *
-     * \param aid the AID assigned to the previous associated STA
+     * @param aid the AID assigned to the previous associated STA
      */
     void SetSsid(uint16_t aid, Mac48Address /* addr */);
 
@@ -179,10 +241,10 @@
 };
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test the exchange of EML Operating Mode Notification frames.
+ * @brief Test the exchange of EML Operating Mode Notification frames.
  *
  * This test considers an AP MLD and a non-AP MLD with EMLSR activated. Upon association,
  * the non-AP MLD sends an EML Operating Mode Notification frame, which is however corrupted
@@ -206,8 +268,8 @@
     /**
      * Constructor
      *
-     * \param linksToEnableEmlsrOn IDs of links on which EMLSR mode should be enabled
-     * \param transitionTimeout the Transition Timeout advertised by the AP MLD
+     * @param linksToEnableEmlsrOn IDs of links on which EMLSR mode should be enabled
+     * @param transitionTimeout the Transition Timeout advertised by the AP MLD
      */
     EmlOmnExchangeTest(const std::set<uint8_t>& linksToEnableEmlsrOn, Time transitionTimeout);
     ~EmlOmnExchangeTest() override = default;
@@ -224,14 +286,14 @@
     /**
      * Callback invoked when the non-AP MLD receives the acknowledgment for a transmitted MPDU.
      *
-     * \param mpdu the acknowledged MPDU
+     * @param mpdu the acknowledged MPDU
      */
     void TxOk(Ptr<const WifiMpdu> mpdu);
     /**
      * Callback invoked when the non-AP MLD drops the given MPDU for the given reason.
      *
-     * \param reason the reason why the MPDU was dropped
-     * \param mpdu the dropped MPDU
+     * @param reason the reason why the MPDU was dropped
+     * @param mpdu the dropped MPDU
      */
     void TxDropped(WifiMacDropReason reason, Ptr<const WifiMpdu> mpdu);
 
@@ -239,9 +301,9 @@
      * Check the content of the EML Capabilities subfield of the Multi-Link Element included
      * in the Association Request frame sent by the non-AP MLD.
      *
-     * \param mpdu the MPDU containing the Association Request frame
-     * \param txVector the TXVECTOR used to transmit the frame
-     * \param linkId the ID of the link on which the frame was transmitted
+     * @param mpdu the MPDU containing the Association Request frame
+     * @param txVector the TXVECTOR used to transmit the frame
+     * @param linkId the ID of the link on which the frame was transmitted
      */
     void CheckEmlCapabilitiesInAssocReq(Ptr<const WifiMpdu> mpdu,
                                         const WifiTxVector& txVector,
@@ -250,9 +312,9 @@
      * Check the content of the EML Capabilities subfield of the Multi-Link Element included
      * in the Association Response frame sent by the AP MLD to the EMLSR client.
      *
-     * \param mpdu the MPDU containing the Association Response frame
-     * \param txVector the TXVECTOR used to transmit the frame
-     * \param linkId the ID of the link on which the frame was transmitted
+     * @param mpdu the MPDU containing the Association Response frame
+     * @param txVector the TXVECTOR used to transmit the frame
+     * @param linkId the ID of the link on which the frame was transmitted
      */
     void CheckEmlCapabilitiesInAssocResp(Ptr<const WifiMpdu> mpdu,
                                          const WifiTxVector& txVector,
@@ -260,9 +322,9 @@
     /**
      * Check the content of a received EML Operating Mode Notification frame.
      *
-     * \param psdu the PSDU containing the EML Operating Mode Notification frame
-     * \param txVector the TXVECTOR used to transmit the frame
-     * \param linkId the ID of the link on which the frame was transmitted
+     * @param psdu the PSDU containing the EML Operating Mode Notification frame
+     * @param txVector the TXVECTOR used to transmit the frame
+     * @param linkId the ID of the link on which the frame was transmitted
      */
     void CheckEmlNotification(Ptr<const WifiPsdu> psdu,
                               const WifiTxVector& txVector,
@@ -285,10 +347,10 @@
 };
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test the transmission of DL frames to EMLSR clients.
+ * @brief Test the transmission of DL frames to EMLSR clients.
  *
  * This test considers an AP MLD and a configurable number of non-AP MLDs that support EMLSR
  * and a configurable number of non-AP MLDs that do not support EMLSR. All MLDs have three
@@ -334,6 +396,9 @@
  *   the link used to exchange EML Notification frames, the two A-MPDUs are transmitted one
  *   after another on the link used to exchange EML Notification frames. Otherwise, the two
  *   A-MPDUs are sent concurrently on two distinct links
+ *
+ * Also, if the PutAuxPhyToSleep attribute is set to true, it is checked that aux PHYs are in
+ * sleep mode after receiving an ICF and are resumed from sleep after receiving the CF-End frame.
  */
 class EmlsrDlTxopTest : public EmlsrOperationsTestBase
 {
@@ -353,12 +418,13 @@
             transitionDelay;    //!< vector (whose size equals <i>nEmlsrStations</i>) of
                                 //!< transition the delay values advertised by non-AP MLDs
         Time transitionTimeout; //!< the Transition Timeout advertised by the AP MLD
+        bool putAuxPhyToSleep;  //!< whether aux PHYs are put to sleep during DL/UL TXOPs
     };
 
     /**
      * Constructor
      *
-     * \param params parameters for the EMLSR DL TXOP test
+     * @param params parameters for the EMLSR DL TXOP test
      */
     EmlsrDlTxopTest(const Params& params);
     ~EmlsrDlTxopTest() override = default;
@@ -381,7 +447,7 @@
      * Check that the AP MLD considers the correct Power Management mode for the links setup
      * with the given non-AP MLD. This method is intended to be called shortly after ML setup.
      *
-     * \param address a link address of the given non-AP MLD
+     * @param address a link address of the given non-AP MLD
      */
     void CheckPmModeAfterAssociation(const Mac48Address& address);
 
@@ -389,9 +455,9 @@
      * Check that appropriate actions are taken when the AP MLD transmits an EML Operating Mode
      * Notification response frame to an EMLSR client on the given link.
      *
-     * \param mpdu the MPDU carrying the EML Operating Mode Notification frame
-     * \param txVector the TXVECTOR used to send the PPDU
-     * \param linkId the ID of the given link
+     * @param mpdu the MPDU carrying the EML Operating Mode Notification frame
+     * @param txVector the TXVECTOR used to send the PPDU
+     * @param linkId the ID of the given link
      */
     void CheckApEmlNotificationFrame(Ptr<const WifiMpdu> mpdu,
                                      const WifiTxVector& txVector,
@@ -401,9 +467,9 @@
      * Check that appropriate actions are taken when an EMLSR client transmits an EML Operating
      * Mode Notification frame to the AP MLD on the given link.
      *
-     * \param mpdu the MPDU carrying the EML Operating Mode Notification frame
-     * \param txVector the TXVECTOR used to send the PPDU
-     * \param linkId the ID of the given link
+     * @param mpdu the MPDU carrying the EML Operating Mode Notification frame
+     * @param txVector the TXVECTOR used to send the PPDU
+     * @param linkId the ID of the given link
      */
     void CheckStaEmlNotificationFrame(Ptr<const WifiMpdu> mpdu,
                                       const WifiTxVector& txVector,
@@ -413,9 +479,9 @@
      * Check that appropriate actions are taken by the AP MLD transmitting an initial
      * Control frame to an EMLSR client on the given link.
      *
-     * \param mpdu the MPDU carrying the MU-RTS TF
-     * \param txVector the TXVECTOR used to send the PPDU
-     * \param linkId the ID of the given link
+     * @param mpdu the MPDU carrying the MU-RTS TF
+     * @param txVector the TXVECTOR used to send the PPDU
+     * @param linkId the ID of the given link
      */
     void CheckInitialControlFrame(Ptr<const WifiMpdu> mpdu,
                                   const WifiTxVector& txVector,
@@ -425,9 +491,9 @@
      * Check that appropriate actions are taken by the AP MLD transmitting a PPDU containing
      * QoS data frames to EMLSR clients on the given link.
      *
-     * \param psduMap the PSDU(s) carrying QoS data frames
-     * \param txVector the TXVECTOR used to send the PPDU
-     * \param linkId the ID of the given link
+     * @param psduMap the PSDU(s) carrying QoS data frames
+     * @param txVector the TXVECTOR used to send the PPDU
+     * @param linkId the ID of the given link
      */
     void CheckQosFrames(const WifiConstPsduMap& psduMap,
                         const WifiTxVector& txVector,
@@ -437,9 +503,9 @@
      * Check that appropriate actions are taken by the AP MLD receiving a PPDU containing
      * BlockAck frames from EMLSR clients on the given link.
      *
-     * \param psduMap the PSDU carrying BlockAck frames
-     * \param txVector the TXVECTOR used to send the PPDU
-     * \param phyId the ID of the PHY transmitting the PSDU(s)
+     * @param psduMap the PSDU carrying BlockAck frames
+     * @param txVector the TXVECTOR used to send the PPDU
+     * @param phyId the ID of the PHY transmitting the PSDU(s)
      */
     void CheckBlockAck(const WifiConstPsduMap& psduMap,
                        const WifiTxVector& txVector,
@@ -463,10 +529,10 @@
 };
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test the transmission of UL frames from EMLSR clients.
+ * @brief Test the transmission of UL frames from EMLSR clients.
  *
  * This test considers an AP MLD and a non-AP MLD that support EMLSR. The non-AP MLD setups three
  * links, while the set of EMLSR links is configurable. Block ack agreements (for TID 0) for both
@@ -511,14 +577,18 @@
  *   link, stays in sleep mode until the TXOP ends and is resumed from sleep mode right after the
  *   end of the DL/UL TXOP.
  * - When an aux PHY that is not TX capable gains a TXOP, it checks whether the main PHY can switch
- *   to the non-primary link a start an UL TXOP. If the main PHY is switching, the aux PHY waits
+ *   to the auxiliary link a start an UL TXOP. If the main PHY is switching, the aux PHY waits
  *   until the channel switch is completed and checks again; if the remaining backoff time on the
- *   primary link is greater than the channel switch delay, the main PHY is requested to switch to
- *   the non-primary link of the aux PHY. When the channel switch is completed, if the medium is
- *   idle on the non-primary link and the backoff is zero, the main PHY starts an UL TXOP after a
+ *   preferred link is greater than the channel switch delay, the main PHY is requested to switch to
+ *   the auxiliary link of the aux PHY. When the channel switch is completed, if the medium is
+ *   idle on the auxiliary link and the backoff is zero, the main PHY starts an UL TXOP after a
  *   PIFS period; otherwise, the main PHY starts an UL TXOP when the backoff timer counts down to
  *   zero. The QoS data frame sent by the main PHY is not protected by RTS and the bandwidth it
  *   occupies is not affected by possible limitations on the aux PHY TX bandwidth capabilities.
+ *
+ * Also, if the PutAuxPhyToSleep attribute is set to true, it is checked that aux PHYs are in
+ * sleep mode a SIFS after receiving the ICF and are still in sleep mode right before receiving
+ * a Block Ack frame, and they are resumed from sleep after receiving the Block Ack frame.
  */
 class EmlsrUlTxopTest : public EmlsrOperationsTestBase
 {
@@ -543,12 +613,17 @@
                                         //!< but it does not transmit any frame, the second value
                                         //!< controls whether CCA info from aux PHY is used when
                                         //!< aux PHY is not TX capable
+        uint8_t nSlotsLeftAlert;        //!< value to set the ChannelAccessManager NSlotsLeft
+                                        //!< attribute to
+        bool putAuxPhyToSleep;          //!< whether aux PHYs are put to sleep during DL/UL TXOPs
+        bool switchMainPhyBackDelayTimeout; //!< whether a SwitchMainPhyBackDelay timer expires
+                                            //!< after that the main PHY moved to an aux PHY link
     };
 
     /**
      * Constructor
      *
-     * \param params parameters for the EMLSR UL TXOP test
+     * @param params parameters for the EMLSR UL TXOP test
      */
     EmlsrUlTxopTest(const Params& params);
     ~EmlsrUlTxopTest() override = default;
@@ -571,31 +646,19 @@
      * Check that appropriate actions are taken by the EMLSR client when transmitting an RTS
      * frame on the given link.
      *
-     * \param mpdu the MPDU carrying the RTS frame
-     * \param txVector the TXVECTOR used to send the PPDU
-     * \param linkId the ID of the given link
+     * @param mpdu the MPDU carrying the RTS frame
+     * @param txVector the TXVECTOR used to send the PPDU
+     * @param linkId the ID of the given link
      */
     void CheckRtsFrames(Ptr<const WifiMpdu> mpdu, const WifiTxVector& txVector, uint8_t linkId);
 
     /**
-     * Check that appropriate actions are taken by the AP MLD transmitting an initial
-     * Control frame to an EMLSR client on the given link.
-     *
-     * \param mpdu the MPDU carrying the MU-RTS TF
-     * \param txVector the TXVECTOR used to send the PPDU
-     * \param linkId the ID of the given link
-     */
-    void CheckInitialControlFrame(Ptr<const WifiMpdu> mpdu,
-                                  const WifiTxVector& txVector,
-                                  uint8_t linkId);
-
-    /**
      * Check that appropriate actions are taken by the EMLSR client when receiving a CTS
      * frame on the given link.
      *
-     * \param mpdu the MPDU carrying the CTS frame
-     * \param txVector the TXVECTOR used to send the PPDU
-     * \param linkId the ID of the given link
+     * @param mpdu the MPDU carrying the CTS frame
+     * @param txVector the TXVECTOR used to send the PPDU
+     * @param linkId the ID of the given link
      */
     void CheckCtsFrames(Ptr<const WifiMpdu> mpdu, const WifiTxVector& txVector, uint8_t linkId);
 
@@ -603,9 +666,9 @@
      * Check that appropriate actions are taken when an MLD transmits a PPDU containing
      * QoS data frames on the given link.
      *
-     * \param psduMap the PSDU(s) carrying QoS data frames
-     * \param txVector the TXVECTOR used to send the PPDU
-     * \param linkId the ID of the given link
+     * @param psduMap the PSDU(s) carrying QoS data frames
+     * @param txVector the TXVECTOR used to send the PPDU
+     * @param linkId the ID of the given link
      */
     void CheckQosFrames(const WifiConstPsduMap& psduMap,
                         const WifiTxVector& txVector,
@@ -615,9 +678,9 @@
      * Check that appropriate actions are taken when an MLD transmits a PPDU containing
      * BlockAck frames on the given link.
      *
-     * \param psduMap the PSDU carrying BlockAck frames
-     * \param txVector the TXVECTOR used to send the PPDU
-     * \param linkId the ID of the given link
+     * @param psduMap the PSDU carrying BlockAck frames
+     * @param txVector the TXVECTOR used to send the PPDU
+     * @param linkId the ID of the given link
      */
     void CheckBlockAck(const WifiConstPsduMap& psduMap,
                        const WifiTxVector& txVector,
@@ -629,8 +692,8 @@
     /**
      * Callback invoked when a new backoff value is generated by the EMLSR client.
      *
-     * \param backoff the generated backoff value
-     * \param linkId the ID of the link for which the backoff value has been generated
+     * @param backoff the generated backoff value
+     * @param linkId the ID of the link for which the backoff value has been generated
      */
     void BackoffGenerated(uint32_t backoff, uint8_t linkId);
 
@@ -659,15 +722,72 @@
                                           //!< transmit any frame
     bool m_useAuxPhyCca;                  //!< whether CCA info from aux PHY is used when
                                           //!< aux PHY is not TX capable
+    uint8_t m_nSlotsLeftAlert;            //!< value for ChannelAccessManager NSlotsLeft attribute
+    bool m_switchMainPhyBackDelayTimeout; //!< whether a SwitchMainPhyBackDelay timer expires
+                                          //!< after that the main PHY moved to an aux PHY link
     std::optional<bool> m_corruptCts;     //!< whether the transmitted CTS must be corrupted
     Time m_5thQosFrameTxTime;             //!< start transmission time of the 5th QoS data frame
+    MHz_u m_5thQosFrameExpWidth;          //!< expected width of the 5th QoS data frame
+};
+
+/**
+ * @ingroup wifi-test
+ * @ingroup tests
+ *
+ * @brief Check UL OFDMA operations with EMLSR clients.
+ *
+ * This test considers an AP MLD and an EMLSR client and a non-AP MLD that setup three links with
+ * the AP MLD. Once block ack agreements (for TID 0) are established for the UL direction, the
+ * AP MLD starts requesting channel access (on all the links) through the Multi-User scheduler.
+ * Given that links are idle, AP MLD accesses the channel on all the links and concurrently sends
+ * Trigger Frames. When the transmission of the first Trigger Frame is over, a client application
+ * on the EMLSR client generates two packets addressed to the AP MLD.
+ *
+ * It is checked that:
+ * - when sending BSRP TF is disabled, the first Trigger Frame sent is an MU-RTS; otherwise, it is
+ *   a BSRP Trigger Frame. In both cases, such Trigger Frame acts as an ICF for the EMLSR client
+ * - the other Trigger Frames sent concurrently with the ICF only solicit the non-EMLSR client
+ *   (AP MLD has blocked transmissions to the EMLSR client upon preparing the first Trigger Frame)
+ * - the buffer status reported in QoS Null frames is as expected
+ * - the EMLSR client sends a QoS Data frame in a TB PPDU
+ */
+class EmlsrUlOfdmaTest : public EmlsrOperationsTestBase
+{
+  public:
+    /**
+     * Constructor
+     *
+     * @param enableBsrp whether MU scheduler sends BSRP TFs
+     */
+    EmlsrUlOfdmaTest(bool enableBsrp);
+
+  protected:
+    void DoSetup() override;
+    void DoRun() override;
+    void Transmit(Ptr<WifiMac> mac,
+                  uint8_t phyId,
+                  WifiConstPsduMap psduMap,
+                  WifiTxVector txVector,
+                  double txPowerW) override;
+
+    /**
+     * Check that the simulation produced the expected results.
+     */
+    void CheckResults();
+
+  private:
+    void StartTraffic() override;
+
+    bool m_enableBsrp;        //!< whether MU scheduler sends BSRP TFs
+    std::size_t m_txPsdusPos; //!< position in the vector of TX PSDUs of the first ICF
+    Time m_startAccessReq;    //!< start time of the first AP MLD access request via MU scheduler
 };
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test the switching of PHYs on EMLSR clients.
+ * @brief Test the switching of PHYs on EMLSR clients.
  *
  * An AP MLD and an EMLSR client setup 3 links, on which EMLSR mode is enabled. The AP MLD
  * transmits 4 QoS data frames (one after another, each protected by ICF):
@@ -698,13 +818,13 @@
                                               //!< with the link on which the main PHY has just
                                               //!< switched to, the second value controls whether
                                               //!< a main PHY channel switch can be interrupted
-        MHz_u auxPhyMaxChWidth;               //!< max channel width (MHz) supported by aux PHYs
+        MHz_u auxPhyMaxChWidth;               //!< max channel width supported by aux PHYs
     };
 
     /**
      * Constructor
      *
-     * \param params parameters for the EMLSR link switching test
+     * @param params parameters for the EMLSR link switching test
      */
     EmlsrLinkSwitchTest(const Params& params);
 
@@ -728,9 +848,9 @@
      * Check that the Main PHY (and possibly the Aux PHY) correctly switches channel when the
      * reception of an ICF ends.
      *
-     * \param psduMap the PSDU carrying the MU-RTS TF
-     * \param txVector the TXVECTOR used to send the PPDU
-     * \param linkId the ID of the given link
+     * @param psduMap the PSDU carrying the MU-RTS TF
+     * @param txVector the TXVECTOR used to send the PPDU
+     * @param linkId the ID of the given link
      */
     void CheckInitialControlFrame(const WifiConstPsduMap& psduMap,
                                   const WifiTxVector& txVector,
@@ -740,9 +860,9 @@
      * Check that appropriate actions are taken by the AP MLD transmitting a PPDU containing
      * QoS data frames to the EMLSR client on the given link.
      *
-     * \param psduMap the PSDU(s) carrying QoS data frames
-     * \param txVector the TXVECTOR used to send the PPDU
-     * \param linkId the ID of the given link
+     * @param psduMap the PSDU(s) carrying QoS data frames
+     * @param txVector the TXVECTOR used to send the PPDU
+     * @param linkId the ID of the given link
      */
     void CheckQosFrames(const WifiConstPsduMap& psduMap,
                         const WifiTxVector& txVector,
@@ -752,9 +872,9 @@
      * Check that appropriate actions are taken by the EMLSR client transmitting a PPDU containing
      * an RTS frame to the AP MLD on the given link.
      *
-     * \param psduMap the PSDU carrying RTS frame
-     * \param txVector the TXVECTOR used to send the PPDU
-     * \param linkId the ID of the given link
+     * @param psduMap the PSDU carrying RTS frame
+     * @param txVector the TXVECTOR used to send the PPDU
+     * @param linkId the ID of the given link
      */
     void CheckRtsFrame(const WifiConstPsduMap& psduMap,
                        const WifiTxVector& txVector,
@@ -767,7 +887,7 @@
         m_resetCamStateAndInterruptSwitch; /**< whether to reset the state of the
                               ChannelAccessManager associated with the link on which the main PHY
                               has just switched to and whether main PHY switch can be interrupted */
-    MHz_u m_auxPhyMaxChWidth;              //!< max channel width (MHz) supported by aux PHYs
+    MHz_u m_auxPhyMaxChWidth;              //!< max channel width supported by aux PHYs
     std::size_t m_countQoSframes;          //!< counter for QoS data frames
     std::size_t m_countIcfFrames;          //!< counter for ICF frames
     std::size_t m_countRtsFrames;          //!< counter for RTS frames
@@ -776,10 +896,10 @@
 };
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief wifi EMLSR Test Suite
+ * @brief wifi EMLSR Test Suite
  */
 class WifiEmlsrTestSuite : public TestSuite
 {
@@ -788,10 +908,10 @@
 };
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test CCA busy notifications on EMLSR clients.
+ * @brief Test CCA busy notifications on EMLSR clients.
  *
  * SwitchAuxPhy is set to true, so that the aux PHY starts switching when the main PHY switch is
  * completed.
@@ -812,9 +932,9 @@
     /**
      * Constructor
      *
-     * \param auxPhyMaxChWidth max channel width (MHz) supported by aux PHYs
+     * @param auxPhyMaxChWidth max channel width supported by aux PHYs
      */
-    EmlsrCcaBusyTest(uint16_t auxPhyMaxChWidth);
+    EmlsrCcaBusyTest(MHz_u auxPhyMaxChWidth);
 
     ~EmlsrCcaBusyTest() override = default;
 
@@ -828,7 +948,7 @@
     /**
      * Make the other MLD transmit a packet to the AP on the given link.
      *
-     * \param linkId the ID of the given link
+     * @param linkId the ID of the given link
      */
     void TransmitPacketToAp(uint8_t linkId);
 
@@ -847,7 +967,7 @@
      */
     void CheckPoint3();
 
-    uint16_t m_auxPhyMaxChWidth; //!< max channel width (MHz) supported by aux PHYs
+    MHz_u m_auxPhyMaxChWidth;    //!< max channel width supported by aux PHYs
     Time m_channelSwitchDelay;   //!< the PHY channel switch delay
     uint8_t m_currMainPhyLinkId; //!< the ID of the link the main PHY switches from
     uint8_t m_nextMainPhyLinkId; //!< the ID of the link the main PHY switches to
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/test/wifi-error-rate-models-test.cc ns-3.44/src/wifi/test/wifi-error-rate-models-test.cc
--- ns-3.43/src/wifi/test/wifi-error-rate-models-test.cc	2024-10-09 16:41:10.136656800 -0700
+++ ns-3.44/src/wifi/test/wifi-error-rate-models-test.cc	2025-03-09 16:55:49.807372600 -0700
@@ -42,10 +42,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Wifi Error Rate Models Test Case Dsss
+ * @brief Wifi Error Rate Models Test Case Dsss
  */
 class WifiErrorRateModelsTestCaseDsss : public TestCase
 {
@@ -151,10 +151,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Wifi Error Rate Models Test Case Nist
+ * @brief Wifi Error Rate Models Test Case Nist
  */
 class WifiErrorRateModelsTestCaseNist : public TestCase
 {
@@ -190,194 +190,194 @@
                                         std::pow(10.0, snr / 10.0),
                                         frameSize * 8);
     NS_TEST_ASSERT_MSG_EQ_TOL(ps, 2.04e-10, 1e-10, "Not equal within tolerance");
-    snr = 3.0;
+    snr = dB_u{3.0};
     ps = nist->GetChunkSuccessRate(WifiMode("OfdmRate6Mbps"),
                                    txVector,
                                    std::pow(10.0, snr / 10.0),
                                    frameSize * 8);
     NS_TEST_ASSERT_MSG_EQ_TOL(ps, 0.020, 0.001, "Not equal within tolerance");
-    snr = 4.0;
+    snr = dB_u{4.0};
     ps = nist->GetChunkSuccessRate(WifiMode("OfdmRate6Mbps"),
                                    txVector,
                                    std::pow(10.0, snr / 10.0),
                                    frameSize * 8);
     NS_TEST_ASSERT_MSG_EQ_TOL(ps, 0.885, 0.001, "Not equal within tolerance");
-    snr = 5.0;
+    snr = dB_u{5.0};
     ps = nist->GetChunkSuccessRate(WifiMode("OfdmRate6Mbps"),
                                    txVector,
                                    std::pow(10.0, snr / 10.0),
                                    frameSize * 8);
     NS_TEST_ASSERT_MSG_EQ_TOL(ps, 0.997, 0.001, "Not equal within tolerance");
 
-    snr = 6.0;
+    snr = dB_u{6.0};
     ps = nist->GetChunkSuccessRate(WifiMode("OfdmRate9Mbps"),
                                    txVector,
                                    std::pow(10.0, snr / 10.0),
                                    frameSize * 8);
     NS_TEST_ASSERT_MSG_EQ_TOL(ps, 0.097, 0.001, "Not equal within tolerance");
-    snr = 7.0;
+    snr = dB_u{7.0};
     ps = nist->GetChunkSuccessRate(WifiMode("OfdmRate9Mbps"),
                                    txVector,
                                    std::pow(10.0, snr / 10.0),
                                    frameSize * 8);
     NS_TEST_ASSERT_MSG_EQ_TOL(ps, 0.918, 0.001, "Not equal within tolerance");
-    snr = 8.0;
+    snr = dB_u{8.0};
     ps = nist->GetChunkSuccessRate(WifiMode("OfdmRate9Mbps"),
                                    txVector,
                                    std::pow(10.0, snr / 10.0),
                                    frameSize * 8);
     NS_TEST_ASSERT_MSG_EQ_TOL(ps, 0.998, 0.001, "Not equal within tolerance");
-    snr = 9.0;
+    snr = dB_u{9.0};
     ps = nist->GetChunkSuccessRate(WifiMode("OfdmRate9Mbps"),
                                    txVector,
                                    std::pow(10.0, snr / 10.0),
                                    frameSize * 8);
     NS_TEST_ASSERT_MSG_EQ_TOL(ps, 0.999, 0.001, "Not equal within tolerance");
 
-    snr = 6.0;
+    snr = dB_u{6.0};
     ps = nist->GetChunkSuccessRate(WifiMode("OfdmRate12Mbps"),
                                    txVector,
                                    std::pow(10.0, snr / 10.0),
                                    frameSize * 8);
     NS_TEST_ASSERT_MSG_EQ_TOL(ps, 0.0174, 0.001, "Not equal within tolerance");
-    snr = 7.0;
+    snr = dB_u{7.0};
     ps = nist->GetChunkSuccessRate(WifiMode("OfdmRate12Mbps"),
                                    txVector,
                                    std::pow(10.0, snr / 10.0),
                                    frameSize * 8);
     NS_TEST_ASSERT_MSG_EQ_TOL(ps, 0.881, 0.001, "Not equal within tolerance");
-    snr = 8.0;
+    snr = dB_u{8.0};
     ps = nist->GetChunkSuccessRate(WifiMode("OfdmRate12Mbps"),
                                    txVector,
                                    std::pow(10.0, snr / 10.0),
                                    frameSize * 8);
     NS_TEST_ASSERT_MSG_EQ_TOL(ps, 0.997, 0.001, "Not equal within tolerance");
-    snr = 9.0;
+    snr = dB_u{9.0};
     ps = nist->GetChunkSuccessRate(WifiMode("OfdmRate12Mbps"),
                                    txVector,
                                    std::pow(10.0, snr / 10.0),
                                    frameSize * 8);
     NS_TEST_ASSERT_MSG_EQ_TOL(ps, 0.999, 0.001, "Not equal within tolerance");
 
-    snr = 8.5;
+    snr = dB_u{8.5};
     ps = nist->GetChunkSuccessRate(WifiMode("OfdmRate18Mbps"),
                                    txVector,
                                    std::pow(10.0, snr / 10.0),
                                    frameSize * 8);
     NS_TEST_ASSERT_MSG_EQ_TOL(ps, 2.85e-6, 1e-6, "Not equal within tolerance");
-    snr = 9.5;
+    snr = dB_u{9.5};
     ps = nist->GetChunkSuccessRate(WifiMode("OfdmRate18Mbps"),
                                    txVector,
                                    std::pow(10.0, snr / 10.0),
                                    frameSize * 8);
     NS_TEST_ASSERT_MSG_EQ_TOL(ps, 0.623, 0.001, "Not equal within tolerance");
-    snr = 10.5;
+    snr = dB_u{10.5};
     ps = nist->GetChunkSuccessRate(WifiMode("OfdmRate18Mbps"),
                                    txVector,
                                    std::pow(10.0, snr / 10.0),
                                    frameSize * 8);
     NS_TEST_ASSERT_MSG_EQ_TOL(ps, 0.985, 0.001, "Not equal within tolerance");
-    snr = 11.5;
+    snr = dB_u{11.5};
     ps = nist->GetChunkSuccessRate(WifiMode("OfdmRate18Mbps"),
                                    txVector,
                                    std::pow(10.0, snr / 10.0),
                                    frameSize * 8);
     NS_TEST_ASSERT_MSG_EQ_TOL(ps, 0.999, 0.001, "Not equal within tolerance");
 
-    snr = 12.0;
+    snr = dB_u{12.0};
     ps = nist->GetChunkSuccessRate(WifiMode("OfdmRate24Mbps"),
                                    txVector,
                                    std::pow(10.0, snr / 10.0),
                                    frameSize * 8);
     NS_TEST_ASSERT_MSG_EQ_TOL(ps, 2.22e-7, 1e-7, "Not equal within tolerance");
-    snr = 13.0;
+    snr = dB_u{13.0};
     ps = nist->GetChunkSuccessRate(WifiMode("OfdmRate24Mbps"),
                                    txVector,
                                    std::pow(10.0, snr / 10.0),
                                    frameSize * 8);
     NS_TEST_ASSERT_MSG_EQ_TOL(ps, 0.495, 0.001, "Not equal within tolerance");
-    snr = 14.0;
+    snr = dB_u{14.0};
     ps = nist->GetChunkSuccessRate(WifiMode("OfdmRate24Mbps"),
                                    txVector,
                                    std::pow(10.0, snr / 10.0),
                                    frameSize * 8);
     NS_TEST_ASSERT_MSG_EQ_TOL(ps, 0.974, 0.001, "Not equal within tolerance");
-    snr = 15.0;
+    snr = dB_u{15.0};
     ps = nist->GetChunkSuccessRate(WifiMode("OfdmRate24Mbps"),
                                    txVector,
                                    std::pow(10.0, snr / 10.0),
                                    frameSize * 8);
     NS_TEST_ASSERT_MSG_EQ_TOL(ps, 0.999, 0.001, "Not equal within tolerance");
 
-    snr = 15.5;
+    snr = dB_u{15.5};
     ps = nist->GetChunkSuccessRate(WifiMode("OfdmRate36Mbps"),
                                    txVector,
                                    std::pow(10.0, snr / 10.0),
                                    frameSize * 8);
     NS_TEST_ASSERT_MSG_EQ_TOL(ps, 0.012, 0.001, "Not equal within tolerance");
-    snr = 16.5;
+    snr = dB_u{16.5};
     ps = nist->GetChunkSuccessRate(WifiMode("OfdmRate36Mbps"),
                                    txVector,
                                    std::pow(10.0, snr / 10.0),
                                    frameSize * 8);
     NS_TEST_ASSERT_MSG_EQ_TOL(ps, 0.818, 0.001, "Not equal within tolerance");
-    snr = 17.5;
+    snr = dB_u{17.5};
     ps = nist->GetChunkSuccessRate(WifiMode("OfdmRate36Mbps"),
                                    txVector,
                                    std::pow(10.0, snr / 10.0),
                                    frameSize * 8);
     NS_TEST_ASSERT_MSG_EQ_TOL(ps, 0.993, 0.001, "Not equal within tolerance");
-    snr = 18.5;
+    snr = dB_u{18.5};
     ps = nist->GetChunkSuccessRate(WifiMode("OfdmRate36Mbps"),
                                    txVector,
                                    std::pow(10.0, snr / 10.0),
                                    frameSize * 8);
     NS_TEST_ASSERT_MSG_EQ_TOL(ps, 0.999, 0.001, "Not equal within tolerance");
 
-    snr = 20.0;
+    snr = dB_u{20.0};
     ps = nist->GetChunkSuccessRate(WifiMode("OfdmRate48Mbps"),
                                    txVector,
                                    std::pow(10.0, snr / 10.0),
                                    frameSize * 8);
     NS_TEST_ASSERT_MSG_EQ_TOL(ps, 1.3e-4, 1e-4, "Not equal within tolerance");
-    snr = 21.0;
+    snr = dB_u{21.0};
     ps = nist->GetChunkSuccessRate(WifiMode("OfdmRate48Mbps"),
                                    txVector,
                                    std::pow(10.0, snr / 10.0),
                                    frameSize * 8);
     NS_TEST_ASSERT_MSG_EQ_TOL(ps, 0.649, 0.001, "Not equal within tolerance");
-    snr = 22.0;
+    snr = dB_u{22.0};
     ps = nist->GetChunkSuccessRate(WifiMode("OfdmRate48Mbps"),
                                    txVector,
                                    std::pow(10.0, snr / 10.0),
                                    frameSize * 8);
     NS_TEST_ASSERT_MSG_EQ_TOL(ps, 0.983, 0.001, "Not equal within tolerance");
-    snr = 23.0;
+    snr = dB_u{23.0};
     ps = nist->GetChunkSuccessRate(WifiMode("OfdmRate48Mbps"),
                                    txVector,
                                    std::pow(10.0, snr / 10.0),
                                    frameSize * 8);
     NS_TEST_ASSERT_MSG_EQ_TOL(ps, 0.999, 0.001, "Not equal within tolerance");
 
-    snr = 21.0;
+    snr = dB_u{21.0};
     ps = nist->GetChunkSuccessRate(WifiMode("OfdmRate54Mbps"),
                                    txVector,
                                    std::pow(10.0, snr / 10.0),
                                    frameSize * 8);
     NS_TEST_ASSERT_MSG_EQ_TOL(ps, 5.44e-8, 1e-8, "Not equal within tolerance");
-    snr = 22.0;
+    snr = dB_u{22.0};
     ps = nist->GetChunkSuccessRate(WifiMode("OfdmRate54Mbps"),
                                    txVector,
                                    std::pow(10.0, snr / 10.0),
                                    frameSize * 8);
     NS_TEST_ASSERT_MSG_EQ_TOL(ps, 0.410, 0.001, "Not equal within tolerance");
-    snr = 23.0;
+    snr = dB_u{23.0};
     ps = nist->GetChunkSuccessRate(WifiMode("OfdmRate54Mbps"),
                                    txVector,
                                    std::pow(10.0, snr / 10.0),
                                    frameSize * 8);
     NS_TEST_ASSERT_MSG_EQ_TOL(ps, 0.958, 0.001, "Not equal within tolerance");
-    snr = 24.0;
+    snr = dB_u{24.0};
     ps = nist->GetChunkSuccessRate(WifiMode("OfdmRate54Mbps"),
                                    txVector,
                                    std::pow(10.0, snr / 10.0),
@@ -393,10 +393,10 @@
 };
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Wifi Error Rate Models Test Case MIMO
+ * @brief Wifi Error Rate Models Test Case MIMO
  */
 class WifiErrorRateModelsTestCaseMimo : public TestCase
 {
@@ -427,7 +427,7 @@
 
     txVector.SetMode(mode);
     txVector.SetTxPowerLevel(0);
-    txVector.SetChannelWidth(20);
+    txVector.SetChannelWidth(MHz_u{20});
     txVector.SetNss(1);
     txVector.SetNTx(1);
 
@@ -438,8 +438,8 @@
     // SISO: initial SNR set to 4dB
     dB_u initialSnr{4.0};
     dB_u tol{0.1};
-    auto snr = interference.CalculateSnr(0.001,
-                                         0.001 / DbToRatio(initialSnr),
+    auto snr = interference.CalculateSnr(Watt_u{0.001},
+                                         Watt_u{0.001} / DbToRatio(initialSnr),
                                          txVector.GetChannelWidth(),
                                          txVector.GetNss());
     NS_TEST_ASSERT_MSG_EQ_TOL(RatioToDb(snr),
@@ -457,8 +457,8 @@
     // MIMO 2x1:2: expect no SNR gain in AWGN channel
     txVector.SetNss(2);
     txVector.SetNTx(2);
-    snr = interference.CalculateSnr(0.001,
-                                    0.001 / DbToRatio(initialSnr),
+    snr = interference.CalculateSnr(Watt_u{0.001},
+                                    Watt_u{0.001} / DbToRatio(initialSnr),
                                     txVector.GetChannelWidth(),
                                     txVector.GetNss());
     NS_TEST_ASSERT_MSG_EQ_TOL(RatioToDb(snr),
@@ -476,12 +476,12 @@
     txVector.SetNss(1);
     txVector.SetNTx(1);
     interference.SetNumberOfReceiveAntennas(2);
-    snr = interference.CalculateSnr(0.001,
-                                    0.001 / DbToRatio(initialSnr),
+    snr = interference.CalculateSnr(Watt_u{0.001},
+                                    Watt_u{0.001} / DbToRatio(initialSnr),
                                     txVector.GetChannelWidth(),
                                     txVector.GetNss());
     NS_TEST_ASSERT_MSG_EQ_TOL(RatioToDb(snr),
-                              initialSnr + static_cast<dB_u>(3.0),
+                              initialSnr + dB_u{3.0},
                               tol,
                               "SNR not within tolerance for 1x2:1 MIMO");
     chunkSuccess = interference.CalculatePayloadChunkSuccessRate(snr, duration, txVector);
@@ -494,12 +494,12 @@
     txVector.SetNss(1);
     txVector.SetNTx(2);
     interference.SetNumberOfReceiveAntennas(2);
-    snr = interference.CalculateSnr(0.001,
-                                    0.001 / DbToRatio(initialSnr),
+    snr = interference.CalculateSnr(Watt_u{0.001},
+                                    Watt_u{0.001} / DbToRatio(initialSnr),
                                     txVector.GetChannelWidth(),
                                     txVector.GetNss());
     NS_TEST_ASSERT_MSG_EQ_TOL(RatioToDb(snr),
-                              initialSnr + static_cast<dB_u>(3.0),
+                              initialSnr + dB_u{3.0},
                               tol,
                               "SNR not equal within tolerance for 2x2:1 MIMO");
     chunkSuccess = interference.CalculatePayloadChunkSuccessRate(snr, duration, txVector);
@@ -511,8 +511,8 @@
     txVector.SetNss(2);
     txVector.SetNTx(2);
     interference.SetNumberOfReceiveAntennas(2);
-    snr = interference.CalculateSnr(0.001,
-                                    0.001 / DbToRatio(initialSnr),
+    snr = interference.CalculateSnr(Watt_u{0.001},
+                                    Watt_u{0.001} / DbToRatio(initialSnr),
                                     txVector.GetChannelWidth(),
                                     txVector.GetNss());
     NS_TEST_ASSERT_MSG_EQ_TOL(RatioToDb(snr),
@@ -530,12 +530,12 @@
     txVector.SetNss(1);
     txVector.SetNTx(3);
     interference.SetNumberOfReceiveAntennas(3);
-    snr = interference.CalculateSnr(0.001,
-                                    0.001 / DbToRatio(initialSnr),
+    snr = interference.CalculateSnr(Watt_u{0.001},
+                                    Watt_u{0.001} / DbToRatio(initialSnr),
                                     txVector.GetChannelWidth(),
                                     txVector.GetNss());
     NS_TEST_ASSERT_MSG_EQ_TOL(RatioToDb(snr),
-                              initialSnr + static_cast<dB_u>(4.8),
+                              initialSnr + dB_u{4.8},
                               tol,
                               "SNR not within tolerance for 3x3:1 MIMO");
     chunkSuccess = interference.CalculatePayloadChunkSuccessRate(snr, duration, txVector);
@@ -548,12 +548,12 @@
     txVector.SetNss(2);
     txVector.SetNTx(3);
     interference.SetNumberOfReceiveAntennas(3);
-    snr = interference.CalculateSnr(0.001,
-                                    0.001 / DbToRatio(initialSnr),
+    snr = interference.CalculateSnr(Watt_u{0.001},
+                                    Watt_u{0.001} / DbToRatio(initialSnr),
                                     txVector.GetChannelWidth(),
                                     txVector.GetNss());
     NS_TEST_ASSERT_MSG_EQ_TOL(RatioToDb(snr),
-                              initialSnr + static_cast<dB_u>(1.8),
+                              initialSnr + dB_u{1.8},
                               tol,
                               "SNR not within tolerance for 3x3:2 MIMO");
     chunkSuccess = interference.CalculatePayloadChunkSuccessRate(snr, duration, txVector);
@@ -565,8 +565,8 @@
     txVector.SetNss(3);
     txVector.SetNTx(3);
     interference.SetNumberOfReceiveAntennas(3);
-    snr = interference.CalculateSnr(0.001,
-                                    0.001 / DbToRatio(initialSnr),
+    snr = interference.CalculateSnr(Watt_u{0.001},
+                                    Watt_u{0.001} / DbToRatio(initialSnr),
                                     txVector.GetChannelWidth(),
                                     txVector.GetNss());
     NS_TEST_ASSERT_MSG_EQ_TOL(RatioToDb(snr),
@@ -584,12 +584,12 @@
     txVector.SetNss(1);
     txVector.SetNTx(4);
     interference.SetNumberOfReceiveAntennas(4);
-    snr = interference.CalculateSnr(0.001,
-                                    0.001 / DbToRatio(initialSnr),
+    snr = interference.CalculateSnr(Watt_u{0.001},
+                                    Watt_u{0.001} / DbToRatio(initialSnr),
                                     txVector.GetChannelWidth(),
                                     txVector.GetNss());
     NS_TEST_ASSERT_MSG_EQ_TOL(RatioToDb(snr),
-                              initialSnr + static_cast<dB_u>(6.0),
+                              initialSnr + dB_u{6.0},
                               tol,
                               "SNR not within tolerance for 4x4:1 MIMO");
     chunkSuccess = interference.CalculatePayloadChunkSuccessRate(snr, duration, txVector);
@@ -602,12 +602,12 @@
     txVector.SetNss(2);
     txVector.SetNTx(4);
     interference.SetNumberOfReceiveAntennas(4);
-    snr = interference.CalculateSnr(0.001,
-                                    0.001 / DbToRatio(initialSnr),
+    snr = interference.CalculateSnr(Watt_u{0.001},
+                                    Watt_u{0.001} / DbToRatio(initialSnr),
                                     txVector.GetChannelWidth(),
                                     txVector.GetNss());
     NS_TEST_ASSERT_MSG_EQ_TOL(RatioToDb(snr),
-                              initialSnr + static_cast<dB_u>(3.0),
+                              initialSnr + dB_u{3.0},
                               tol,
                               "SNR not within tolerance for 4x4:2 MIMO");
     chunkSuccess = interference.CalculatePayloadChunkSuccessRate(snr, duration, txVector);
@@ -620,12 +620,12 @@
     txVector.SetNss(3);
     txVector.SetNTx(4);
     interference.SetNumberOfReceiveAntennas(4);
-    snr = interference.CalculateSnr(0.001,
-                                    0.001 / DbToRatio(initialSnr),
+    snr = interference.CalculateSnr(Watt_u{0.001},
+                                    Watt_u{0.001} / DbToRatio(initialSnr),
                                     txVector.GetChannelWidth(),
                                     txVector.GetNss());
     NS_TEST_ASSERT_MSG_EQ_TOL(RatioToDb(snr),
-                              initialSnr + static_cast<dB_u>(1.2),
+                              initialSnr + dB_u{1.2},
                               tol,
                               "SNR not within tolerance for 4x4:3 MIMO");
     chunkSuccess = interference.CalculatePayloadChunkSuccessRate(snr, duration, txVector);
@@ -637,8 +637,8 @@
     txVector.SetNss(4);
     txVector.SetNTx(4);
     interference.SetNumberOfReceiveAntennas(4);
-    snr = interference.CalculateSnr(0.001,
-                                    0.001 / DbToRatio(initialSnr),
+    snr = interference.CalculateSnr(Watt_u{0.001},
+                                    Watt_u{0.001} / DbToRatio(initialSnr),
                                     txVector.GetChannelWidth(),
                                     txVector.GetNss());
     NS_TEST_ASSERT_MSG_EQ_TOL(RatioToDb(snr),
@@ -662,283 +662,360 @@
         /* MCS 0 - 1458 bytes */
         {std::make_pair(0, 1458),
          {
-             {-4.00, 1.00000}, {-3.75, 1.00000}, {-3.50, 1.00000}, {-3.25, 1.00000},
-             {-3.00, 1.00000}, {-2.75, 1.00000}, {-2.50, 1.00000}, {-2.25, 1.00000},
-             {-2.00, 1.00000}, {-1.75, 1.00000}, {-1.50, 1.00000}, {-1.25, 1.00000},
-             {-1.00, 1.00000}, {-0.75, 0.99700}, {-0.50, 0.99400}, {-0.25, 0.90625},
-             {0.00, 0.81850},  {0.25, 0.55465},  {0.50, 0.29080},  {0.75, 0.17855},
-             {1.00, 0.06630},  {1.25, 0.03875},  {1.50, 0.01120},  {1.75, 0.00635},
-             {2.00, 0.00150},  {2.25, 0.00083},  {2.50, 0.00015},  {2.75, 0.00008},
-             {3.00, 0.00001},  {3.25, 0.00000},  {3.50, 0.00000},  {3.75, 0.00000},
-             {4.00, 0.00000},  {4.25, 0.00000},  {4.50, 0.00000},  {4.75, 0.00000},
-             {5.00, 0.00000},  {5.25, 0.00000},  {5.50, 0.00000},  {5.75, 0.00000},
-             {6.00, 0.00000},  {6.25, 0.00000},  {6.50, 0.00000},  {6.75, 0.00000},
-             {7.00, 0.00000},  {7.25, 0.00000},  {7.50, 0.00000},  {7.75, 0.00000},
-             {8.00, 0.00000},  {8.25, 0.00000},  {8.50, 0.00000},  {8.75, 0.00000},
-             {9.00, 0.00000},  {9.25, 0.00000},  {9.50, 0.00000},  {9.75, 0.00000},
-             {10.00, 0.00000}, {10.25, 0.00000}, {10.50, 0.00000}, {10.75, 0.00000},
-             {11.00, 0.00000}, {11.25, 0.00000}, {11.50, 0.00000}, {11.75, 0.00000},
-             {12.00, 0.00000}, {12.25, 0.00000}, {12.50, 0.00000}, {12.75, 0.00000},
-             {13.00, 0.00000}, {13.25, 0.00000}, {13.50, 0.00000}, {13.75, 0.00000},
-             {14.00, 0.00000}, {14.25, 0.00000}, {14.50, 0.00000}, {14.75, 0.00000},
-             {15.00, 0.00000}, {15.25, 0.00000}, {15.50, 0.00000}, {15.75, 0.00000},
-             {16.00, 0.00000}, {16.25, 0.00000}, {16.50, 0.00000}, {16.75, 0.00000},
-             {17.00, 0.00000}, {17.25, 0.00000}, {17.50, 0.00000}, {17.75, 0.00000},
-             {18.00, 0.00000}, {18.25, 0.00000}, {18.50, 0.00000}, {18.75, 0.00000},
-             {19.00, 0.00000}, {19.25, 0.00000}, {19.50, 0.00000}, {19.75, 0.00000},
-             {20.00, 0.00000}, {20.25, 0.00000}, {20.50, 0.00000}, {20.75, 0.00000},
-             {21.00, 0.00000}, {21.25, 0.00000}, {21.50, 0.00000}, {21.75, 0.00000},
-             {22.00, 0.00000}, {22.25, 0.00000}, {22.50, 0.00000}, {22.75, 0.00000},
-             {23.00, 0.00000}, {23.25, 0.00000}, {23.50, 0.00000}, {23.75, 0.00000},
-             {24.00, 0.00000}, {24.25, 0.00000}, {24.50, 0.00000}, {24.75, 0.00000},
-             {25.00, 0.00000}, {25.25, 0.00000}, {25.50, 0.00000}, {25.75, 0.00000},
-             {26.00, 0.00000}, {26.25, 0.00000}, {26.50, 0.00000}, {26.75, 0.00000},
-             {27.00, 0.00000}, {27.25, 0.00000}, {27.50, 0.00000}, {27.75, 0.00000},
-             {28.00, 0.00000}, {28.25, 0.00000}, {28.50, 0.00000}, {28.75, 0.00000},
-             {29.00, 0.00000}, {29.25, 0.00000}, {29.50, 0.00000}, {29.75, 0.00000},
-             {30.00, 0.00000},
+             {dB_u{-4.00}, 1.00000}, {dB_u{-3.75}, 1.00000}, {dB_u{-3.50}, 1.00000},
+             {dB_u{-3.25}, 1.00000}, {dB_u{-3.00}, 1.00000}, {dB_u{-2.75}, 1.00000},
+             {dB_u{-2.50}, 1.00000}, {dB_u{-2.25}, 1.00000}, {dB_u{-2.00}, 1.00000},
+             {dB_u{-1.75}, 1.00000}, {dB_u{-1.50}, 1.00000}, {dB_u{-1.25}, 1.00000},
+             {dB_u{-1.00}, 1.00000}, {dB_u{-0.75}, 0.99700}, {dB_u{-0.50}, 0.99400},
+             {dB_u{-0.25}, 0.90625}, {dB_u{0.00}, 0.81850},  {dB_u{0.25}, 0.55465},
+             {dB_u{0.50}, 0.29080},  {dB_u{0.75}, 0.17855},  {dB_u{1.00}, 0.06630},
+             {dB_u{1.25}, 0.03875},  {dB_u{1.50}, 0.01120},  {dB_u{1.75}, 0.00635},
+             {dB_u{2.00}, 0.00150},  {dB_u{2.25}, 0.00083},  {dB_u{2.50}, 0.00015},
+             {dB_u{2.75}, 0.00008},  {dB_u{3.00}, 0.00001},  {dB_u{3.25}, 0.00000},
+             {dB_u{3.50}, 0.00000},  {dB_u{3.75}, 0.00000},  {dB_u{4.00}, 0.00000},
+             {dB_u{4.25}, 0.00000},  {dB_u{4.50}, 0.00000},  {dB_u{4.75}, 0.00000},
+             {dB_u{5.00}, 0.00000},  {dB_u{5.25}, 0.00000},  {dB_u{5.50}, 0.00000},
+             {dB_u{5.75}, 0.00000},  {dB_u{6.00}, 0.00000},  {dB_u{6.25}, 0.00000},
+             {dB_u{6.50}, 0.00000},  {dB_u{6.75}, 0.00000},  {dB_u{7.00}, 0.00000},
+             {dB_u{7.25}, 0.00000},  {dB_u{7.50}, 0.00000},  {dB_u{7.75}, 0.00000},
+             {dB_u{8.00}, 0.00000},  {dB_u{8.25}, 0.00000},  {dB_u{8.50}, 0.00000},
+             {dB_u{8.75}, 0.00000},  {dB_u{9.00}, 0.00000},  {dB_u{9.25}, 0.00000},
+             {dB_u{9.50}, 0.00000},  {dB_u{9.75}, 0.00000},  {dB_u{10.00}, 0.00000},
+             {dB_u{10.25}, 0.00000}, {dB_u{10.50}, 0.00000}, {dB_u{10.75}, 0.00000},
+             {dB_u{11.00}, 0.00000}, {dB_u{11.25}, 0.00000}, {dB_u{11.50}, 0.00000},
+             {dB_u{11.75}, 0.00000}, {dB_u{12.00}, 0.00000}, {dB_u{12.25}, 0.00000},
+             {dB_u{12.50}, 0.00000}, {dB_u{12.75}, 0.00000}, {dB_u{13.00}, 0.00000},
+             {dB_u{13.25}, 0.00000}, {dB_u{13.50}, 0.00000}, {dB_u{13.75}, 0.00000},
+             {dB_u{14.00}, 0.00000}, {dB_u{14.25}, 0.00000}, {dB_u{14.50}, 0.00000},
+             {dB_u{14.75}, 0.00000}, {dB_u{15.00}, 0.00000}, {dB_u{15.25}, 0.00000},
+             {dB_u{15.50}, 0.00000}, {dB_u{15.75}, 0.00000}, {dB_u{16.00}, 0.00000},
+             {dB_u{16.25}, 0.00000}, {dB_u{16.50}, 0.00000}, {dB_u{16.75}, 0.00000},
+             {dB_u{17.00}, 0.00000}, {dB_u{17.25}, 0.00000}, {dB_u{17.50}, 0.00000},
+             {dB_u{17.75}, 0.00000}, {dB_u{18.00}, 0.00000}, {dB_u{18.25}, 0.00000},
+             {dB_u{18.50}, 0.00000}, {dB_u{18.75}, 0.00000}, {dB_u{19.00}, 0.00000},
+             {dB_u{19.25}, 0.00000}, {dB_u{19.50}, 0.00000}, {dB_u{19.75}, 0.00000},
+             {dB_u{20.00}, 0.00000}, {dB_u{20.25}, 0.00000}, {dB_u{20.50}, 0.00000},
+             {dB_u{20.75}, 0.00000}, {dB_u{21.00}, 0.00000}, {dB_u{21.25}, 0.00000},
+             {dB_u{21.50}, 0.00000}, {dB_u{21.75}, 0.00000}, {dB_u{22.00}, 0.00000},
+             {dB_u{22.25}, 0.00000}, {dB_u{22.50}, 0.00000}, {dB_u{22.75}, 0.00000},
+             {dB_u{23.00}, 0.00000}, {dB_u{23.25}, 0.00000}, {dB_u{23.50}, 0.00000},
+             {dB_u{23.75}, 0.00000}, {dB_u{24.00}, 0.00000}, {dB_u{24.25}, 0.00000},
+             {dB_u{24.50}, 0.00000}, {dB_u{24.75}, 0.00000}, {dB_u{25.00}, 0.00000},
+             {dB_u{25.25}, 0.00000}, {dB_u{25.50}, 0.00000}, {dB_u{25.75}, 0.00000},
+             {dB_u{26.00}, 0.00000}, {dB_u{26.25}, 0.00000}, {dB_u{26.50}, 0.00000},
+             {dB_u{26.75}, 0.00000}, {dB_u{27.00}, 0.00000}, {dB_u{27.25}, 0.00000},
+             {dB_u{27.50}, 0.00000}, {dB_u{27.75}, 0.00000}, {dB_u{28.00}, 0.00000},
+             {dB_u{28.25}, 0.00000}, {dB_u{28.50}, 0.00000}, {dB_u{28.75}, 0.00000},
+             {dB_u{29.00}, 0.00000}, {dB_u{29.25}, 0.00000}, {dB_u{29.50}, 0.00000},
+             {dB_u{29.75}, 0.00000}, {dB_u{30.00}, 0.00000},
          }},
         /* MCS 0 - 32 bytes */
         {std::make_pair(0, 32),
          {
-             {-4.00, 1.00000}, {-3.75, 1.00000}, {-3.50, 1.00000}, {-3.25, 0.99750},
-             {-3.00, 0.99500}, {-2.75, 0.96790}, {-2.50, 0.94080}, {-2.25, 0.88335},
-             {-2.00, 0.82590}, {-1.75, 0.70770}, {-1.50, 0.58950}, {-1.25, 0.44890},
-             {-1.00, 0.30830}, {-0.75, 0.21685}, {-0.50, 0.12540}, {-0.25, 0.07990},
-             {0.00, 0.03440},  {0.25, 0.02145},  {0.50, 0.00850},  {0.75, 0.00500},
-             {1.00, 0.00150},  {1.25, 0.00087},  {1.50, 0.00024},  {1.75, 0.00017},
-             {2.00, 0.00009},  {2.25, 0.00005},  {2.50, 0.00000},  {2.75, 0.00000},
-             {3.00, 0.00000},  {3.25, 0.00000},  {3.50, 0.00000},  {3.75, 0.00000},
-             {4.00, 0.00000},  {4.25, 0.00000},  {4.50, 0.00000},  {4.75, 0.00000},
-             {5.00, 0.00000},  {5.25, 0.00000},  {5.50, 0.00000},  {5.75, 0.00000},
-             {6.00, 0.00000},  {6.25, 0.00000},  {6.50, 0.00000},  {6.75, 0.00000},
-             {7.00, 0.00000},  {7.25, 0.00000},  {7.50, 0.00000},  {7.75, 0.00000},
-             {8.00, 0.00000},  {8.25, 0.00000},  {8.50, 0.00000},  {8.75, 0.00000},
-             {9.00, 0.00000},  {9.25, 0.00000},  {9.50, 0.00000},  {9.75, 0.00000},
-             {10.00, 0.00000}, {10.25, 0.00000}, {10.50, 0.00000}, {10.75, 0.00000},
-             {11.00, 0.00000}, {11.25, 0.00000}, {11.50, 0.00000}, {11.75, 0.00000},
-             {12.00, 0.00000}, {12.25, 0.00000}, {12.50, 0.00000}, {12.75, 0.00000},
-             {13.00, 0.00000}, {13.25, 0.00000}, {13.50, 0.00000}, {13.75, 0.00000},
-             {14.00, 0.00000}, {14.25, 0.00000}, {14.50, 0.00000}, {14.75, 0.00000},
-             {15.00, 0.00000}, {15.25, 0.00000}, {15.50, 0.00000}, {15.75, 0.00000},
-             {16.00, 0.00000}, {16.25, 0.00000}, {16.50, 0.00000}, {16.75, 0.00000},
-             {17.00, 0.00000}, {17.25, 0.00000}, {17.50, 0.00000}, {17.75, 0.00000},
-             {18.00, 0.00000}, {18.25, 0.00000}, {18.50, 0.00000}, {18.75, 0.00000},
-             {19.00, 0.00000}, {19.25, 0.00000}, {19.50, 0.00000}, {19.75, 0.00000},
-             {20.00, 0.00000}, {20.25, 0.00000}, {20.50, 0.00000}, {20.75, 0.00000},
-             {21.00, 0.00000}, {21.25, 0.00000}, {21.50, 0.00000}, {21.75, 0.00000},
-             {22.00, 0.00000}, {22.25, 0.00000}, {22.50, 0.00000}, {22.75, 0.00000},
-             {23.00, 0.00000}, {23.25, 0.00000}, {23.50, 0.00000}, {23.75, 0.00000},
-             {24.00, 0.00000}, {24.25, 0.00000}, {24.50, 0.00000}, {24.75, 0.00000},
-             {25.00, 0.00000}, {25.25, 0.00000}, {25.50, 0.00000}, {25.75, 0.00000},
-             {26.00, 0.00000}, {26.25, 0.00000}, {26.50, 0.00000}, {26.75, 0.00000},
-             {27.00, 0.00000}, {27.25, 0.00000}, {27.50, 0.00000}, {27.75, 0.00000},
-             {28.00, 0.00000}, {28.25, 0.00000}, {28.50, 0.00000}, {28.75, 0.00000},
-             {29.00, 0.00000}, {29.25, 0.00000}, {29.50, 0.00000}, {29.75, 0.00000},
-             {30.00, 0.00000},
+             {dB_u{-4.00}, 1.00000}, {dB_u{-3.75}, 1.00000}, {dB_u{-3.50}, 1.00000},
+             {dB_u{-3.25}, 0.99750}, {dB_u{-3.00}, 0.99500}, {dB_u{-2.75}, 0.96790},
+             {dB_u{-2.50}, 0.94080}, {dB_u{-2.25}, 0.88335}, {dB_u{-2.00}, 0.82590},
+             {dB_u{-1.75}, 0.70770}, {dB_u{-1.50}, 0.58950}, {dB_u{-1.25}, 0.44890},
+             {dB_u{-1.00}, 0.30830}, {dB_u{-0.75}, 0.21685}, {dB_u{-0.50}, 0.12540},
+             {dB_u{-0.25}, 0.07990}, {dB_u{0.00}, 0.03440},  {dB_u{0.25}, 0.02145},
+             {dB_u{0.50}, 0.00850},  {dB_u{0.75}, 0.00500},  {dB_u{1.00}, 0.00150},
+             {dB_u{1.25}, 0.00087},  {dB_u{1.50}, 0.00024},  {dB_u{1.75}, 0.00017},
+             {dB_u{2.00}, 0.00009},  {dB_u{2.25}, 0.00005},  {dB_u{2.50}, 0.00000},
+             {dB_u{2.75}, 0.00000},  {dB_u{3.00}, 0.00000},  {dB_u{3.25}, 0.00000},
+             {dB_u{3.50}, 0.00000},  {dB_u{3.75}, 0.00000},  {dB_u{4.00}, 0.00000},
+             {dB_u{4.25}, 0.00000},  {dB_u{4.50}, 0.00000},  {dB_u{4.75}, 0.00000},
+             {dB_u{5.00}, 0.00000},  {dB_u{5.25}, 0.00000},  {dB_u{5.50}, 0.00000},
+             {dB_u{5.75}, 0.00000},  {dB_u{6.00}, 0.00000},  {dB_u{6.25}, 0.00000},
+             {dB_u{6.50}, 0.00000},  {dB_u{6.75}, 0.00000},  {dB_u{7.00}, 0.00000},
+             {dB_u{7.25}, 0.00000},  {dB_u{7.50}, 0.00000},  {dB_u{7.75}, 0.00000},
+             {dB_u{8.00}, 0.00000},  {dB_u{8.25}, 0.00000},  {dB_u{8.50}, 0.00000},
+             {dB_u{8.75}, 0.00000},  {dB_u{9.00}, 0.00000},  {dB_u{9.25}, 0.00000},
+             {dB_u{9.50}, 0.00000},  {dB_u{9.75}, 0.00000},  {dB_u{10.00}, 0.00000},
+             {dB_u{10.25}, 0.00000}, {dB_u{10.50}, 0.00000}, {dB_u{10.75}, 0.00000},
+             {dB_u{11.00}, 0.00000}, {dB_u{11.25}, 0.00000}, {dB_u{11.50}, 0.00000},
+             {dB_u{11.75}, 0.00000}, {dB_u{12.00}, 0.00000}, {dB_u{12.25}, 0.00000},
+             {dB_u{12.50}, 0.00000}, {dB_u{12.75}, 0.00000}, {dB_u{13.00}, 0.00000},
+             {dB_u{13.25}, 0.00000}, {dB_u{13.50}, 0.00000}, {dB_u{13.75}, 0.00000},
+             {dB_u{14.00}, 0.00000}, {dB_u{14.25}, 0.00000}, {dB_u{14.50}, 0.00000},
+             {dB_u{14.75}, 0.00000}, {dB_u{15.00}, 0.00000}, {dB_u{15.25}, 0.00000},
+             {dB_u{15.50}, 0.00000}, {dB_u{15.75}, 0.00000}, {dB_u{16.00}, 0.00000},
+             {dB_u{16.25}, 0.00000}, {dB_u{16.50}, 0.00000}, {dB_u{16.75}, 0.00000},
+             {dB_u{17.00}, 0.00000}, {dB_u{17.25}, 0.00000}, {dB_u{17.50}, 0.00000},
+             {dB_u{17.75}, 0.00000}, {dB_u{18.00}, 0.00000}, {dB_u{18.25}, 0.00000},
+             {dB_u{18.50}, 0.00000}, {dB_u{18.75}, 0.00000}, {dB_u{19.00}, 0.00000},
+             {dB_u{19.25}, 0.00000}, {dB_u{19.50}, 0.00000}, {dB_u{19.75}, 0.00000},
+             {dB_u{20.00}, 0.00000}, {dB_u{20.25}, 0.00000}, {dB_u{20.50}, 0.00000},
+             {dB_u{20.75}, 0.00000}, {dB_u{21.00}, 0.00000}, {dB_u{21.25}, 0.00000},
+             {dB_u{21.50}, 0.00000}, {dB_u{21.75}, 0.00000}, {dB_u{22.00}, 0.00000},
+             {dB_u{22.25}, 0.00000}, {dB_u{22.50}, 0.00000}, {dB_u{22.75}, 0.00000},
+             {dB_u{23.00}, 0.00000}, {dB_u{23.25}, 0.00000}, {dB_u{23.50}, 0.00000},
+             {dB_u{23.75}, 0.00000}, {dB_u{24.00}, 0.00000}, {dB_u{24.25}, 0.00000},
+             {dB_u{24.50}, 0.00000}, {dB_u{24.75}, 0.00000}, {dB_u{25.00}, 0.00000},
+             {dB_u{25.25}, 0.00000}, {dB_u{25.50}, 0.00000}, {dB_u{25.75}, 0.00000},
+             {dB_u{26.00}, 0.00000}, {dB_u{26.25}, 0.00000}, {dB_u{26.50}, 0.00000},
+             {dB_u{26.75}, 0.00000}, {dB_u{27.00}, 0.00000}, {dB_u{27.25}, 0.00000},
+             {dB_u{27.50}, 0.00000}, {dB_u{27.75}, 0.00000}, {dB_u{28.00}, 0.00000},
+             {dB_u{28.25}, 0.00000}, {dB_u{28.50}, 0.00000}, {dB_u{28.75}, 0.00000},
+             {dB_u{29.00}, 0.00000}, {dB_u{29.25}, 0.00000}, {dB_u{29.50}, 0.00000},
+             {dB_u{29.75}, 0.00000}, {dB_u{30.00}, 0.00000},
          }},
         /* MCS 0 - 1000 bytes */
         {std::make_pair(0, 1000),
          {
-             {-4.00, 1.00000}, {-3.75, 1.00000}, {-3.50, 1.00000}, {-3.25, 1.00000},
-             {-3.00, 1.00000}, {-2.75, 1.00000}, {-2.50, 1.00000}, {-2.25, 1.00000},
-             {-2.00, 1.00000}, {-1.75, 1.00000}, {-1.50, 1.00000}, {-1.25, 1.00000},
-             {-1.00, 1.00000}, {-0.75, 0.98140}, {-0.50, 0.97007}, {-0.25, 0.80280},
-             {0.00, 0.68977},  {0.25, 0.42581},  {0.50, 0.20997},  {0.75, 0.12620},
-             {1.00, 0.04596},  {1.25, 0.02674},  {1.50, 0.00770},  {1.75, 0.00436},
-             {2.00, 0.00103},  {2.25, 0.00057},  {2.50, 0.00010},  {2.75, 0.00005},
-             {3.00, 0.00001},  {3.25, 0.00000},  {3.50, 0.00000},  {3.75, 0.00000},
-             {4.00, 0.00000},  {4.25, 0.00000},  {4.50, 0.00000},  {4.75, 0.00000},
-             {5.00, 0.00000},  {5.25, 0.00000},  {5.50, 0.00000},  {5.75, 0.00000},
-             {6.00, 0.00000},  {6.25, 0.00000},  {6.50, 0.00000},  {6.75, 0.00000},
-             {7.00, 0.00000},  {7.25, 0.00000},  {7.50, 0.00000},  {7.75, 0.00000},
-             {8.00, 0.00000},  {8.25, 0.00000},  {8.50, 0.00000},  {8.75, 0.00000},
-             {9.00, 0.00000},  {9.25, 0.00000},  {9.50, 0.00000},  {9.75, 0.00000},
-             {10.00, 0.00000}, {10.25, 0.00000}, {10.50, 0.00000}, {10.75, 0.00000},
-             {11.00, 0.00000}, {11.25, 0.00000}, {11.50, 0.00000}, {11.75, 0.00000},
-             {12.00, 0.00000}, {12.25, 0.00000}, {12.50, 0.00000}, {12.75, 0.00000},
-             {13.00, 0.00000}, {13.25, 0.00000}, {13.50, 0.00000}, {13.75, 0.00000},
-             {14.00, 0.00000}, {14.25, 0.00000}, {14.50, 0.00000}, {14.75, 0.00000},
-             {15.00, 0.00000}, {15.25, 0.00000}, {15.50, 0.00000}, {15.75, 0.00000},
-             {16.00, 0.00000}, {16.25, 0.00000}, {16.50, 0.00000}, {16.75, 0.00000},
-             {17.00, 0.00000}, {17.25, 0.00000}, {17.50, 0.00000}, {17.75, 0.00000},
-             {18.00, 0.00000}, {18.25, 0.00000}, {18.50, 0.00000}, {18.75, 0.00000},
-             {19.00, 0.00000}, {19.25, 0.00000}, {19.50, 0.00000}, {19.75, 0.00000},
-             {20.00, 0.00000}, {20.25, 0.00000}, {20.50, 0.00000}, {20.75, 0.00000},
-             {21.00, 0.00000}, {21.25, 0.00000}, {21.50, 0.00000}, {21.75, 0.00000},
-             {22.00, 0.00000}, {22.25, 0.00000}, {22.50, 0.00000}, {22.75, 0.00000},
-             {23.00, 0.00000}, {23.25, 0.00000}, {23.50, 0.00000}, {23.75, 0.00000},
-             {24.00, 0.00000}, {24.25, 0.00000}, {24.50, 0.00000}, {24.75, 0.00000},
-             {25.00, 0.00000}, {25.25, 0.00000}, {25.50, 0.00000}, {25.75, 0.00000},
-             {26.00, 0.00000}, {26.25, 0.00000}, {26.50, 0.00000}, {26.75, 0.00000},
-             {27.00, 0.00000}, {27.25, 0.00000}, {27.50, 0.00000}, {27.75, 0.00000},
-             {28.00, 0.00000}, {28.25, 0.00000}, {28.50, 0.00000}, {28.75, 0.00000},
-             {29.00, 0.00000}, {29.25, 0.00000}, {29.50, 0.00000}, {29.75, 0.00000},
-             {30.00, 0.00000},
+             {dB_u{-4.00}, 1.00000}, {dB_u{-3.75}, 1.00000}, {dB_u{-3.50}, 1.00000},
+             {dB_u{-3.25}, 1.00000}, {dB_u{-3.00}, 1.00000}, {dB_u{-2.75}, 1.00000},
+             {dB_u{-2.50}, 1.00000}, {dB_u{-2.25}, 1.00000}, {dB_u{-2.00}, 1.00000},
+             {dB_u{-1.75}, 1.00000}, {dB_u{-1.50}, 1.00000}, {dB_u{-1.25}, 1.00000},
+             {dB_u{-1.00}, 1.00000}, {dB_u{-0.75}, 0.98140}, {dB_u{-0.50}, 0.97007},
+             {dB_u{-0.25}, 0.80280}, {dB_u{0.00}, 0.68977},  {dB_u{0.25}, 0.42581},
+             {dB_u{0.50}, 0.20997},  {dB_u{0.75}, 0.12620},  {dB_u{1.00}, 0.04596},
+             {dB_u{1.25}, 0.02674},  {dB_u{1.50}, 0.00770},  {dB_u{1.75}, 0.00436},
+             {dB_u{2.00}, 0.00103},  {dB_u{2.25}, 0.00057},  {dB_u{2.50}, 0.00010},
+             {dB_u{2.75}, 0.00005},  {dB_u{3.00}, 0.00001},  {dB_u{3.25}, 0.00000},
+             {dB_u{3.50}, 0.00000},  {dB_u{3.75}, 0.00000},  {dB_u{4.00}, 0.00000},
+             {dB_u{4.25}, 0.00000},  {dB_u{4.50}, 0.00000},  {dB_u{4.75}, 0.00000},
+             {dB_u{5.00}, 0.00000},  {dB_u{5.25}, 0.00000},  {dB_u{5.50}, 0.00000},
+             {dB_u{5.75}, 0.00000},  {dB_u{6.00}, 0.00000},  {dB_u{6.25}, 0.00000},
+             {dB_u{6.50}, 0.00000},  {dB_u{6.75}, 0.00000},  {dB_u{7.00}, 0.00000},
+             {dB_u{7.25}, 0.00000},  {dB_u{7.50}, 0.00000},  {dB_u{7.75}, 0.00000},
+             {dB_u{8.00}, 0.00000},  {dB_u{8.25}, 0.00000},  {dB_u{8.50}, 0.00000},
+             {dB_u{8.75}, 0.00000},  {dB_u{9.00}, 0.00000},  {dB_u{9.25}, 0.00000},
+             {dB_u{9.50}, 0.00000},  {dB_u{9.75}, 0.00000},  {dB_u{10.00}, 0.00000},
+             {dB_u{10.25}, 0.00000}, {dB_u{10.50}, 0.00000}, {dB_u{10.75}, 0.00000},
+             {dB_u{11.00}, 0.00000}, {dB_u{11.25}, 0.00000}, {dB_u{11.50}, 0.00000},
+             {dB_u{11.75}, 0.00000}, {dB_u{12.00}, 0.00000}, {dB_u{12.25}, 0.00000},
+             {dB_u{12.50}, 0.00000}, {dB_u{12.75}, 0.00000}, {dB_u{13.00}, 0.00000},
+             {dB_u{13.25}, 0.00000}, {dB_u{13.50}, 0.00000}, {dB_u{13.75}, 0.00000},
+             {dB_u{14.00}, 0.00000}, {dB_u{14.25}, 0.00000}, {dB_u{14.50}, 0.00000},
+             {dB_u{14.75}, 0.00000}, {dB_u{15.00}, 0.00000}, {dB_u{15.25}, 0.00000},
+             {dB_u{15.50}, 0.00000}, {dB_u{15.75}, 0.00000}, {dB_u{16.00}, 0.00000},
+             {dB_u{16.25}, 0.00000}, {dB_u{16.50}, 0.00000}, {dB_u{16.75}, 0.00000},
+             {dB_u{17.00}, 0.00000}, {dB_u{17.25}, 0.00000}, {dB_u{17.50}, 0.00000},
+             {dB_u{17.75}, 0.00000}, {dB_u{18.00}, 0.00000}, {dB_u{18.25}, 0.00000},
+             {dB_u{18.50}, 0.00000}, {dB_u{18.75}, 0.00000}, {dB_u{19.00}, 0.00000},
+             {dB_u{19.25}, 0.00000}, {dB_u{19.50}, 0.00000}, {dB_u{19.75}, 0.00000},
+             {dB_u{20.00}, 0.00000}, {dB_u{20.25}, 0.00000}, {dB_u{20.50}, 0.00000},
+             {dB_u{20.75}, 0.00000}, {dB_u{21.00}, 0.00000}, {dB_u{21.25}, 0.00000},
+             {dB_u{21.50}, 0.00000}, {dB_u{21.75}, 0.00000}, {dB_u{22.00}, 0.00000},
+             {dB_u{22.25}, 0.00000}, {dB_u{22.50}, 0.00000}, {dB_u{22.75}, 0.00000},
+             {dB_u{23.00}, 0.00000}, {dB_u{23.25}, 0.00000}, {dB_u{23.50}, 0.00000},
+             {dB_u{23.75}, 0.00000}, {dB_u{24.00}, 0.00000}, {dB_u{24.25}, 0.00000},
+             {dB_u{24.50}, 0.00000}, {dB_u{24.75}, 0.00000}, {dB_u{25.00}, 0.00000},
+             {dB_u{25.25}, 0.00000}, {dB_u{25.50}, 0.00000}, {dB_u{25.75}, 0.00000},
+             {dB_u{26.00}, 0.00000}, {dB_u{26.25}, 0.00000}, {dB_u{26.50}, 0.00000},
+             {dB_u{26.75}, 0.00000}, {dB_u{27.00}, 0.00000}, {dB_u{27.25}, 0.00000},
+             {dB_u{27.50}, 0.00000}, {dB_u{27.75}, 0.00000}, {dB_u{28.00}, 0.00000},
+             {dB_u{28.25}, 0.00000}, {dB_u{28.50}, 0.00000}, {dB_u{28.75}, 0.00000},
+             {dB_u{29.00}, 0.00000}, {dB_u{29.25}, 0.00000}, {dB_u{29.50}, 0.00000},
+             {dB_u{29.75}, 0.00000}, {dB_u{30.00}, 0.00000},
          }},
         /* MCS 0 - 1 byte */
         {std::make_pair(0, 1),
          {
-             {-4.00, 1.00000}, {-3.75, 1.00000}, {-3.50, 1.00000}, {-3.25, 0.17075},
-             {-3.00, 0.15260}, {-2.75, 0.10190}, {-2.50, 0.08455}, {-2.25, 0.06494},
-             {-2.00, 0.05316}, {-1.75, 0.03771}, {-1.50, 0.02744}, {-1.25, 0.01845},
-             {-1.00, 0.01145}, {-0.75, 0.00761}, {-0.50, 0.00418}, {-0.25, 0.00260},
-             {0.00, 0.00110},  {0.25, 0.00068},  {0.50, 0.00027},  {0.75, 0.00016},
-             {1.00, 0.00005},  {1.25, 0.00003},  {1.50, 0.00000},  {1.75, 0.00000},
-             {2.00, 0.00000},  {2.25, 0.00000},  {2.50, 0.00000},  {2.75, 0.00000},
-             {3.00, 0.00000},  {3.25, 0.00000},  {3.50, 0.00000},  {3.75, 0.00000},
-             {4.00, 0.00000},  {4.25, 0.00000},  {4.50, 0.00000},  {4.75, 0.00000},
-             {5.00, 0.00000},  {5.25, 0.00000},  {5.50, 0.00000},  {5.75, 0.00000},
-             {6.00, 0.00000},  {6.25, 0.00000},  {6.50, 0.00000},  {6.75, 0.00000},
-             {7.00, 0.00000},  {7.25, 0.00000},  {7.50, 0.00000},  {7.75, 0.00000},
-             {8.00, 0.00000},  {8.25, 0.00000},  {8.50, 0.00000},  {8.75, 0.00000},
-             {9.00, 0.00000},  {9.25, 0.00000},  {9.50, 0.00000},  {9.75, 0.00000},
-             {10.00, 0.00000}, {10.25, 0.00000}, {10.50, 0.00000}, {10.75, 0.00000},
-             {11.00, 0.00000}, {11.25, 0.00000}, {11.50, 0.00000}, {11.75, 0.00000},
-             {12.00, 0.00000}, {12.25, 0.00000}, {12.50, 0.00000}, {12.75, 0.00000},
-             {13.00, 0.00000}, {13.25, 0.00000}, {13.50, 0.00000}, {13.75, 0.00000},
-             {14.00, 0.00000}, {14.25, 0.00000}, {14.50, 0.00000}, {14.75, 0.00000},
-             {15.00, 0.00000}, {15.25, 0.00000}, {15.50, 0.00000}, {15.75, 0.00000},
-             {16.00, 0.00000}, {16.25, 0.00000}, {16.50, 0.00000}, {16.75, 0.00000},
-             {17.00, 0.00000}, {17.25, 0.00000}, {17.50, 0.00000}, {17.75, 0.00000},
-             {18.00, 0.00000}, {18.25, 0.00000}, {18.50, 0.00000}, {18.75, 0.00000},
-             {19.00, 0.00000}, {19.25, 0.00000}, {19.50, 0.00000}, {19.75, 0.00000},
-             {20.00, 0.00000}, {20.25, 0.00000}, {20.50, 0.00000}, {20.75, 0.00000},
-             {21.00, 0.00000}, {21.25, 0.00000}, {21.50, 0.00000}, {21.75, 0.00000},
-             {22.00, 0.00000}, {22.25, 0.00000}, {22.50, 0.00000}, {22.75, 0.00000},
-             {23.00, 0.00000}, {23.25, 0.00000}, {23.50, 0.00000}, {23.75, 0.00000},
-             {24.00, 0.00000}, {24.25, 0.00000}, {24.50, 0.00000}, {24.75, 0.00000},
-             {25.00, 0.00000}, {25.25, 0.00000}, {25.50, 0.00000}, {25.75, 0.00000},
-             {26.00, 0.00000}, {26.25, 0.00000}, {26.50, 0.00000}, {26.75, 0.00000},
-             {27.00, 0.00000}, {27.25, 0.00000}, {27.50, 0.00000}, {27.75, 0.00000},
-             {28.00, 0.00000}, {28.25, 0.00000}, {28.50, 0.00000}, {28.75, 0.00000},
-             {29.00, 0.00000}, {29.25, 0.00000}, {29.50, 0.00000}, {29.75, 0.00000},
-             {30.00, 0.00000},
+             {dB_u{-4.00}, 1.00000}, {dB_u{-3.75}, 1.00000}, {dB_u{-3.50}, 1.00000},
+             {dB_u{-3.25}, 0.17075}, {dB_u{-3.00}, 0.15260}, {dB_u{-2.75}, 0.10190},
+             {dB_u{-2.50}, 0.08455}, {dB_u{-2.25}, 0.06494}, {dB_u{-2.00}, 0.05316},
+             {dB_u{-1.75}, 0.03771}, {dB_u{-1.50}, 0.02744}, {dB_u{-1.25}, 0.01845},
+             {dB_u{-1.00}, 0.01145}, {dB_u{-0.75}, 0.00761}, {dB_u{-0.50}, 0.00418},
+             {dB_u{-0.25}, 0.00260}, {dB_u{0.00}, 0.00110},  {dB_u{0.25}, 0.00068},
+             {dB_u{0.50}, 0.00027},  {dB_u{0.75}, 0.00016},  {dB_u{1.00}, 0.00005},
+             {dB_u{1.25}, 0.00003},  {dB_u{1.50}, 0.00000},  {dB_u{1.75}, 0.00000},
+             {dB_u{2.00}, 0.00000},  {dB_u{2.25}, 0.00000},  {dB_u{2.50}, 0.00000},
+             {dB_u{2.75}, 0.00000},  {dB_u{3.00}, 0.00000},  {dB_u{3.25}, 0.00000},
+             {dB_u{3.50}, 0.00000},  {dB_u{3.75}, 0.00000},  {dB_u{4.00}, 0.00000},
+             {dB_u{4.25}, 0.00000},  {dB_u{4.50}, 0.00000},  {dB_u{4.75}, 0.00000},
+             {dB_u{5.00}, 0.00000},  {dB_u{5.25}, 0.00000},  {dB_u{5.50}, 0.00000},
+             {dB_u{5.75}, 0.00000},  {dB_u{6.00}, 0.00000},  {dB_u{6.25}, 0.00000},
+             {dB_u{6.50}, 0.00000},  {dB_u{6.75}, 0.00000},  {dB_u{7.00}, 0.00000},
+             {dB_u{7.25}, 0.00000},  {dB_u{7.50}, 0.00000},  {dB_u{7.75}, 0.00000},
+             {dB_u{8.00}, 0.00000},  {dB_u{8.25}, 0.00000},  {dB_u{8.50}, 0.00000},
+             {dB_u{8.75}, 0.00000},  {dB_u{9.00}, 0.00000},  {dB_u{9.25}, 0.00000},
+             {dB_u{9.50}, 0.00000},  {dB_u{9.75}, 0.00000},  {dB_u{10.00}, 0.00000},
+             {dB_u{10.25}, 0.00000}, {dB_u{10.50}, 0.00000}, {dB_u{10.75}, 0.00000},
+             {dB_u{11.00}, 0.00000}, {dB_u{11.25}, 0.00000}, {dB_u{11.50}, 0.00000},
+             {dB_u{11.75}, 0.00000}, {dB_u{12.00}, 0.00000}, {dB_u{12.25}, 0.00000},
+             {dB_u{12.50}, 0.00000}, {dB_u{12.75}, 0.00000}, {dB_u{13.00}, 0.00000},
+             {dB_u{13.25}, 0.00000}, {dB_u{13.50}, 0.00000}, {dB_u{13.75}, 0.00000},
+             {dB_u{14.00}, 0.00000}, {dB_u{14.25}, 0.00000}, {dB_u{14.50}, 0.00000},
+             {dB_u{14.75}, 0.00000}, {dB_u{15.00}, 0.00000}, {dB_u{15.25}, 0.00000},
+             {dB_u{15.50}, 0.00000}, {dB_u{15.75}, 0.00000}, {dB_u{16.00}, 0.00000},
+             {dB_u{16.25}, 0.00000}, {dB_u{16.50}, 0.00000}, {dB_u{16.75}, 0.00000},
+             {dB_u{17.00}, 0.00000}, {dB_u{17.25}, 0.00000}, {dB_u{17.50}, 0.00000},
+             {dB_u{17.75}, 0.00000}, {dB_u{18.00}, 0.00000}, {dB_u{18.25}, 0.00000},
+             {dB_u{18.50}, 0.00000}, {dB_u{18.75}, 0.00000}, {dB_u{19.00}, 0.00000},
+             {dB_u{19.25}, 0.00000}, {dB_u{19.50}, 0.00000}, {dB_u{19.75}, 0.00000},
+             {dB_u{20.00}, 0.00000}, {dB_u{20.25}, 0.00000}, {dB_u{20.50}, 0.00000},
+             {dB_u{20.75}, 0.00000}, {dB_u{21.00}, 0.00000}, {dB_u{21.25}, 0.00000},
+             {dB_u{21.50}, 0.00000}, {dB_u{21.75}, 0.00000}, {dB_u{22.00}, 0.00000},
+             {dB_u{22.25}, 0.00000}, {dB_u{22.50}, 0.00000}, {dB_u{22.75}, 0.00000},
+             {dB_u{23.00}, 0.00000}, {dB_u{23.25}, 0.00000}, {dB_u{23.50}, 0.00000},
+             {dB_u{23.75}, 0.00000}, {dB_u{24.00}, 0.00000}, {dB_u{24.25}, 0.00000},
+             {dB_u{24.50}, 0.00000}, {dB_u{24.75}, 0.00000}, {dB_u{25.00}, 0.00000},
+             {dB_u{25.25}, 0.00000}, {dB_u{25.50}, 0.00000}, {dB_u{25.75}, 0.00000},
+             {dB_u{26.00}, 0.00000}, {dB_u{26.25}, 0.00000}, {dB_u{26.50}, 0.00000},
+             {dB_u{26.75}, 0.00000}, {dB_u{27.00}, 0.00000}, {dB_u{27.25}, 0.00000},
+             {dB_u{27.50}, 0.00000}, {dB_u{27.75}, 0.00000}, {dB_u{28.00}, 0.00000},
+             {dB_u{28.25}, 0.00000}, {dB_u{28.50}, 0.00000}, {dB_u{28.75}, 0.00000},
+             {dB_u{29.00}, 0.00000}, {dB_u{29.25}, 0.00000}, {dB_u{29.50}, 0.00000},
+             {dB_u{29.75}, 0.00000}, {dB_u{30.00}, 0.00000},
          }},
         /* MCS 0 - 2000 bytes */
         {std::make_pair(0, 2000),
          {
-             {-4.00, 1.00000}, {-3.75, 1.00000}, {-3.50, 1.00000}, {-3.25, 1.00000},
-             {-3.00, 1.00000}, {-2.75, 1.00000}, {-2.50, 1.00000}, {-2.25, 1.00000},
-             {-2.00, 1.00000}, {-1.75, 1.00000}, {-1.50, 1.00000}, {-1.25, 1.00000},
-             {-1.00, 1.00000}, {-0.75, 0.99965}, {-0.50, 0.99910}, {-0.25, 0.96111},
-             {0.00, 0.90376},  {0.25, 0.67031},  {0.50, 0.37584},  {0.75, 0.23647},
-             {1.00, 0.08981},  {1.25, 0.05277},  {1.50, 0.01533},  {1.75, 0.00870},
-             {2.00, 0.00206},  {2.25, 0.00113},  {2.50, 0.00021},  {2.75, 0.00011},
-             {3.00, 0.00001},  {3.25, 0.00000},  {3.50, 0.00000},  {3.75, 0.00000},
-             {4.00, 0.00000},  {4.25, 0.00000},  {4.50, 0.00000},  {4.75, 0.00000},
-             {5.00, 0.00000},  {5.25, 0.00000},  {5.50, 0.00000},  {5.75, 0.00000},
-             {6.00, 0.00000},  {6.25, 0.00000},  {6.50, 0.00000},  {6.75, 0.00000},
-             {7.00, 0.00000},  {7.25, 0.00000},  {7.50, 0.00000},  {7.75, 0.00000},
-             {8.00, 0.00000},  {8.25, 0.00000},  {8.50, 0.00000},  {8.75, 0.00000},
-             {9.00, 0.00000},  {9.25, 0.00000},  {9.50, 0.00000},  {9.75, 0.00000},
-             {10.00, 0.00000}, {10.25, 0.00000}, {10.50, 0.00000}, {10.75, 0.00000},
-             {11.00, 0.00000}, {11.25, 0.00000}, {11.50, 0.00000}, {11.75, 0.00000},
-             {12.00, 0.00000}, {12.25, 0.00000}, {12.50, 0.00000}, {12.75, 0.00000},
-             {13.00, 0.00000}, {13.25, 0.00000}, {13.50, 0.00000}, {13.75, 0.00000},
-             {14.00, 0.00000}, {14.25, 0.00000}, {14.50, 0.00000}, {14.75, 0.00000},
-             {15.00, 0.00000}, {15.25, 0.00000}, {15.50, 0.00000}, {15.75, 0.00000},
-             {16.00, 0.00000}, {16.25, 0.00000}, {16.50, 0.00000}, {16.75, 0.00000},
-             {17.00, 0.00000}, {17.25, 0.00000}, {17.50, 0.00000}, {17.75, 0.00000},
-             {18.00, 0.00000}, {18.25, 0.00000}, {18.50, 0.00000}, {18.75, 0.00000},
-             {19.00, 0.00000}, {19.25, 0.00000}, {19.50, 0.00000}, {19.75, 0.00000},
-             {20.00, 0.00000}, {20.25, 0.00000}, {20.50, 0.00000}, {20.75, 0.00000},
-             {21.00, 0.00000}, {21.25, 0.00000}, {21.50, 0.00000}, {21.75, 0.00000},
-             {22.00, 0.00000}, {22.25, 0.00000}, {22.50, 0.00000}, {22.75, 0.00000},
-             {23.00, 0.00000}, {23.25, 0.00000}, {23.50, 0.00000}, {23.75, 0.00000},
-             {24.00, 0.00000}, {24.25, 0.00000}, {24.50, 0.00000}, {24.75, 0.00000},
-             {25.00, 0.00000}, {25.25, 0.00000}, {25.50, 0.00000}, {25.75, 0.00000},
-             {26.00, 0.00000}, {26.25, 0.00000}, {26.50, 0.00000}, {26.75, 0.00000},
-             {27.00, 0.00000}, {27.25, 0.00000}, {27.50, 0.00000}, {27.75, 0.00000},
-             {28.00, 0.00000}, {28.25, 0.00000}, {28.50, 0.00000}, {28.75, 0.00000},
-             {29.00, 0.00000}, {29.25, 0.00000}, {29.50, 0.00000}, {29.75, 0.00000},
-             {30.00, 0.00000},
+             {dB_u{-4.00}, 1.00000}, {dB_u{-3.75}, 1.00000}, {dB_u{-3.50}, 1.00000},
+             {dB_u{-3.25}, 1.00000}, {dB_u{-3.00}, 1.00000}, {dB_u{-2.75}, 1.00000},
+             {dB_u{-2.50}, 1.00000}, {dB_u{-2.25}, 1.00000}, {dB_u{-2.00}, 1.00000},
+             {dB_u{-1.75}, 1.00000}, {dB_u{-1.50}, 1.00000}, {dB_u{-1.25}, 1.00000},
+             {dB_u{-1.00}, 1.00000}, {dB_u{-0.75}, 0.99965}, {dB_u{-0.50}, 0.99910},
+             {dB_u{-0.25}, 0.96111}, {dB_u{0.00}, 0.90376},  {dB_u{0.25}, 0.67031},
+             {dB_u{0.50}, 0.37584},  {dB_u{0.75}, 0.23647},  {dB_u{1.00}, 0.08981},
+             {dB_u{1.25}, 0.05277},  {dB_u{1.50}, 0.01533},  {dB_u{1.75}, 0.00870},
+             {dB_u{2.00}, 0.00206},  {dB_u{2.25}, 0.00113},  {dB_u{2.50}, 0.00021},
+             {dB_u{2.75}, 0.00011},  {dB_u{3.00}, 0.00001},  {dB_u{3.25}, 0.00000},
+             {dB_u{3.50}, 0.00000},  {dB_u{3.75}, 0.00000},  {dB_u{4.00}, 0.00000},
+             {dB_u{4.25}, 0.00000},  {dB_u{4.50}, 0.00000},  {dB_u{4.75}, 0.00000},
+             {dB_u{5.00}, 0.00000},  {dB_u{5.25}, 0.00000},  {dB_u{5.50}, 0.00000},
+             {dB_u{5.75}, 0.00000},  {dB_u{6.00}, 0.00000},  {dB_u{6.25}, 0.00000},
+             {dB_u{6.50}, 0.00000},  {dB_u{6.75}, 0.00000},  {dB_u{7.00}, 0.00000},
+             {dB_u{7.25}, 0.00000},  {dB_u{7.50}, 0.00000},  {dB_u{7.75}, 0.00000},
+             {dB_u{8.00}, 0.00000},  {dB_u{8.25}, 0.00000},  {dB_u{8.50}, 0.00000},
+             {dB_u{8.75}, 0.00000},  {dB_u{9.00}, 0.00000},  {dB_u{9.25}, 0.00000},
+             {dB_u{9.50}, 0.00000},  {dB_u{9.75}, 0.00000},  {dB_u{10.00}, 0.00000},
+             {dB_u{10.25}, 0.00000}, {dB_u{10.50}, 0.00000}, {dB_u{10.75}, 0.00000},
+             {dB_u{11.00}, 0.00000}, {dB_u{11.25}, 0.00000}, {dB_u{11.50}, 0.00000},
+             {dB_u{11.75}, 0.00000}, {dB_u{12.00}, 0.00000}, {dB_u{12.25}, 0.00000},
+             {dB_u{12.50}, 0.00000}, {dB_u{12.75}, 0.00000}, {dB_u{13.00}, 0.00000},
+             {dB_u{13.25}, 0.00000}, {dB_u{13.50}, 0.00000}, {dB_u{13.75}, 0.00000},
+             {dB_u{14.00}, 0.00000}, {dB_u{14.25}, 0.00000}, {dB_u{14.50}, 0.00000},
+             {dB_u{14.75}, 0.00000}, {dB_u{15.00}, 0.00000}, {dB_u{15.25}, 0.00000},
+             {dB_u{15.50}, 0.00000}, {dB_u{15.75}, 0.00000}, {dB_u{16.00}, 0.00000},
+             {dB_u{16.25}, 0.00000}, {dB_u{16.50}, 0.00000}, {dB_u{16.75}, 0.00000},
+             {dB_u{17.00}, 0.00000}, {dB_u{17.25}, 0.00000}, {dB_u{17.50}, 0.00000},
+             {dB_u{17.75}, 0.00000}, {dB_u{18.00}, 0.00000}, {dB_u{18.25}, 0.00000},
+             {dB_u{18.50}, 0.00000}, {dB_u{18.75}, 0.00000}, {dB_u{19.00}, 0.00000},
+             {dB_u{19.25}, 0.00000}, {dB_u{19.50}, 0.00000}, {dB_u{19.75}, 0.00000},
+             {dB_u{20.00}, 0.00000}, {dB_u{20.25}, 0.00000}, {dB_u{20.50}, 0.00000},
+             {dB_u{20.75}, 0.00000}, {dB_u{21.00}, 0.00000}, {dB_u{21.25}, 0.00000},
+             {dB_u{21.50}, 0.00000}, {dB_u{21.75}, 0.00000}, {dB_u{22.00}, 0.00000},
+             {dB_u{22.25}, 0.00000}, {dB_u{22.50}, 0.00000}, {dB_u{22.75}, 0.00000},
+             {dB_u{23.00}, 0.00000}, {dB_u{23.25}, 0.00000}, {dB_u{23.50}, 0.00000},
+             {dB_u{23.75}, 0.00000}, {dB_u{24.00}, 0.00000}, {dB_u{24.25}, 0.00000},
+             {dB_u{24.50}, 0.00000}, {dB_u{24.75}, 0.00000}, {dB_u{25.00}, 0.00000},
+             {dB_u{25.25}, 0.00000}, {dB_u{25.50}, 0.00000}, {dB_u{25.75}, 0.00000},
+             {dB_u{26.00}, 0.00000}, {dB_u{26.25}, 0.00000}, {dB_u{26.50}, 0.00000},
+             {dB_u{26.75}, 0.00000}, {dB_u{27.00}, 0.00000}, {dB_u{27.25}, 0.00000},
+             {dB_u{27.50}, 0.00000}, {dB_u{27.75}, 0.00000}, {dB_u{28.00}, 0.00000},
+             {dB_u{28.25}, 0.00000}, {dB_u{28.50}, 0.00000}, {dB_u{28.75}, 0.00000},
+             {dB_u{29.00}, 0.00000}, {dB_u{29.25}, 0.00000}, {dB_u{29.50}, 0.00000},
+             {dB_u{29.75}, 0.00000}, {dB_u{30.00}, 0.00000},
          }},
         /* MCS 7 - 1500 bytes */
         {std::make_pair(7, 1500),
          {
-             {-4.00, 1.00000}, {-3.75, 1.00000}, {-3.50, 1.00000}, {-3.25, 1.00000},
-             {-3.00, 1.00000}, {-2.75, 1.00000}, {-2.50, 1.00000}, {-2.25, 1.00000},
-             {-2.00, 1.00000}, {-1.75, 1.00000}, {-1.50, 1.00000}, {-1.25, 1.00000},
-             {-1.00, 1.00000}, {-0.75, 1.00000}, {-0.50, 1.00000}, {-0.25, 1.00000},
-             {0.00, 1.00000},  {0.25, 1.00000},  {0.50, 1.00000},  {0.75, 1.00000},
-             {1.00, 1.00000},  {1.25, 1.00000},  {1.50, 1.00000},  {1.75, 1.00000},
-             {2.00, 1.00000},  {2.25, 1.00000},  {2.50, 1.00000},  {2.75, 1.00000},
-             {3.00, 1.00000},  {3.25, 1.00000},  {3.50, 1.00000},  {3.75, 1.00000},
-             {4.00, 1.00000},  {4.25, 1.00000},  {4.50, 1.00000},  {4.75, 1.00000},
-             {5.00, 1.00000},  {5.25, 1.00000},  {5.50, 1.00000},  {5.75, 1.00000},
-             {6.00, 1.00000},  {6.25, 1.00000},  {6.50, 1.00000},  {6.75, 1.00000},
-             {7.00, 1.00000},  {7.25, 1.00000},  {7.50, 1.00000},  {7.75, 1.00000},
-             {8.00, 1.00000},  {8.25, 1.00000},  {8.50, 1.00000},  {8.75, 1.00000},
-             {9.00, 1.00000},  {9.25, 1.00000},  {9.50, 1.00000},  {9.75, 1.00000},
-             {10.00, 1.00000}, {10.25, 1.00000}, {10.50, 1.00000}, {10.75, 1.00000},
-             {11.00, 1.00000}, {11.25, 1.00000}, {11.50, 1.00000}, {11.75, 1.00000},
-             {12.00, 1.00000}, {12.25, 1.00000}, {12.50, 1.00000}, {12.75, 1.00000},
-             {13.00, 1.00000}, {13.25, 1.00000}, {13.50, 1.00000}, {13.75, 1.00000},
-             {14.00, 1.00000}, {14.25, 1.00000}, {14.50, 1.00000}, {14.75, 1.00000},
-             {15.00, 1.00000}, {15.25, 1.00000}, {15.50, 1.00000}, {15.75, 1.00000},
-             {16.00, 1.00000}, {16.25, 1.00000}, {16.50, 1.00000}, {16.75, 1.00000},
-             {17.00, 1.00000}, {17.25, 1.00000}, {17.50, 1.00000}, {17.75, 0.99057},
-             {18.00, 0.98075}, {18.25, 0.86664}, {18.50, 0.74920}, {18.75, 0.54857},
-             {19.00, 0.34531}, {19.25, 0.23624}, {19.50, 0.12672}, {19.75, 0.08164},
-             {20.00, 0.03650}, {20.25, 0.02340}, {20.50, 0.01029}, {20.75, 0.00653},
-             {21.00, 0.00278}, {21.25, 0.00165}, {21.50, 0.00051}, {21.75, 0.00030},
-             {22.00, 0.00009}, {22.25, 0.00005}, {22.50, 0.00001}, {22.75, 0.00000},
-             {23.00, 0.00000}, {23.25, 0.00000}, {23.50, 0.00000}, {23.75, 0.00000},
-             {24.00, 0.00000}, {24.25, 0.00000}, {24.50, 0.00000}, {24.75, 0.00000},
-             {25.00, 0.00000}, {25.25, 0.00000}, {25.50, 0.00000}, {25.75, 0.00000},
-             {26.00, 0.00000}, {26.25, 0.00000}, {26.50, 0.00000}, {26.75, 0.00000},
-             {27.00, 0.00000}, {27.25, 0.00000}, {27.50, 0.00000}, {27.75, 0.00000},
-             {28.00, 0.00000}, {28.25, 0.00000}, {28.50, 0.00000}, {28.75, 0.00000},
-             {29.00, 0.00000}, {29.25, 0.00000}, {29.50, 0.00000}, {29.75, 0.00000},
-             {30.00, 0.00000},
+             {dB_u{-4.00}, 1.00000}, {dB_u{-3.75}, 1.00000}, {dB_u{-3.50}, 1.00000},
+             {dB_u{-3.25}, 1.00000}, {dB_u{-3.00}, 1.00000}, {dB_u{-2.75}, 1.00000},
+             {dB_u{-2.50}, 1.00000}, {dB_u{-2.25}, 1.00000}, {dB_u{-2.00}, 1.00000},
+             {dB_u{-1.75}, 1.00000}, {dB_u{-1.50}, 1.00000}, {dB_u{-1.25}, 1.00000},
+             {dB_u{-1.00}, 1.00000}, {dB_u{-0.75}, 1.00000}, {dB_u{-0.50}, 1.00000},
+             {dB_u{-0.25}, 1.00000}, {dB_u{0.00}, 1.00000},  {dB_u{0.25}, 1.00000},
+             {dB_u{0.50}, 1.00000},  {dB_u{0.75}, 1.00000},  {dB_u{1.00}, 1.00000},
+             {dB_u{1.25}, 1.00000},  {dB_u{1.50}, 1.00000},  {dB_u{1.75}, 1.00000},
+             {dB_u{2.00}, 1.00000},  {dB_u{2.25}, 1.00000},  {dB_u{2.50}, 1.00000},
+             {dB_u{2.75}, 1.00000},  {dB_u{3.00}, 1.00000},  {dB_u{3.25}, 1.00000},
+             {dB_u{3.50}, 1.00000},  {dB_u{3.75}, 1.00000},  {dB_u{4.00}, 1.00000},
+             {dB_u{4.25}, 1.00000},  {dB_u{4.50}, 1.00000},  {dB_u{4.75}, 1.00000},
+             {dB_u{5.00}, 1.00000},  {dB_u{5.25}, 1.00000},  {dB_u{5.50}, 1.00000},
+             {dB_u{5.75}, 1.00000},  {dB_u{6.00}, 1.00000},  {dB_u{6.25}, 1.00000},
+             {dB_u{6.50}, 1.00000},  {dB_u{6.75}, 1.00000},  {dB_u{7.00}, 1.00000},
+             {dB_u{7.25}, 1.00000},  {dB_u{7.50}, 1.00000},  {dB_u{7.75}, 1.00000},
+             {dB_u{8.00}, 1.00000},  {dB_u{8.25}, 1.00000},  {dB_u{8.50}, 1.00000},
+             {dB_u{8.75}, 1.00000},  {dB_u{9.00}, 1.00000},  {dB_u{9.25}, 1.00000},
+             {dB_u{9.50}, 1.00000},  {dB_u{9.75}, 1.00000},  {dB_u{10.00}, 1.00000},
+             {dB_u{10.25}, 1.00000}, {dB_u{10.50}, 1.00000}, {dB_u{10.75}, 1.00000},
+             {dB_u{11.00}, 1.00000}, {dB_u{11.25}, 1.00000}, {dB_u{11.50}, 1.00000},
+             {dB_u{11.75}, 1.00000}, {dB_u{12.00}, 1.00000}, {dB_u{12.25}, 1.00000},
+             {dB_u{12.50}, 1.00000}, {dB_u{12.75}, 1.00000}, {dB_u{13.00}, 1.00000},
+             {dB_u{13.25}, 1.00000}, {dB_u{13.50}, 1.00000}, {dB_u{13.75}, 1.00000},
+             {dB_u{14.00}, 1.00000}, {dB_u{14.25}, 1.00000}, {dB_u{14.50}, 1.00000},
+             {dB_u{14.75}, 1.00000}, {dB_u{15.00}, 1.00000}, {dB_u{15.25}, 1.00000},
+             {dB_u{15.50}, 1.00000}, {dB_u{15.75}, 1.00000}, {dB_u{16.00}, 1.00000},
+             {dB_u{16.25}, 1.00000}, {dB_u{16.50}, 1.00000}, {dB_u{16.75}, 1.00000},
+             {dB_u{17.00}, 1.00000}, {dB_u{17.25}, 1.00000}, {dB_u{17.50}, 1.00000},
+             {dB_u{17.75}, 0.99057}, {dB_u{18.00}, 0.98075}, {dB_u{18.25}, 0.86664},
+             {dB_u{18.50}, 0.74920}, {dB_u{18.75}, 0.54857}, {dB_u{19.00}, 0.34531},
+             {dB_u{19.25}, 0.23624}, {dB_u{19.50}, 0.12672}, {dB_u{19.75}, 0.08164},
+             {dB_u{20.00}, 0.03650}, {dB_u{20.25}, 0.02340}, {dB_u{20.50}, 0.01029},
+             {dB_u{20.75}, 0.00653}, {dB_u{21.00}, 0.00278}, {dB_u{21.25}, 0.00165},
+             {dB_u{21.50}, 0.00051}, {dB_u{21.75}, 0.00030}, {dB_u{22.00}, 0.00009},
+             {dB_u{22.25}, 0.00005}, {dB_u{22.50}, 0.00001}, {dB_u{22.75}, 0.00000},
+             {dB_u{23.00}, 0.00000}, {dB_u{23.25}, 0.00000}, {dB_u{23.50}, 0.00000},
+             {dB_u{23.75}, 0.00000}, {dB_u{24.00}, 0.00000}, {dB_u{24.25}, 0.00000},
+             {dB_u{24.50}, 0.00000}, {dB_u{24.75}, 0.00000}, {dB_u{25.00}, 0.00000},
+             {dB_u{25.25}, 0.00000}, {dB_u{25.50}, 0.00000}, {dB_u{25.75}, 0.00000},
+             {dB_u{26.00}, 0.00000}, {dB_u{26.25}, 0.00000}, {dB_u{26.50}, 0.00000},
+             {dB_u{26.75}, 0.00000}, {dB_u{27.00}, 0.00000}, {dB_u{27.25}, 0.00000},
+             {dB_u{27.50}, 0.00000}, {dB_u{27.75}, 0.00000}, {dB_u{28.00}, 0.00000},
+             {dB_u{28.25}, 0.00000}, {dB_u{28.50}, 0.00000}, {dB_u{28.75}, 0.00000},
+             {dB_u{29.00}, 0.00000}, {dB_u{29.25}, 0.00000}, {dB_u{29.50}, 0.00000},
+             {dB_u{29.75}, 0.00000}, {dB_u{30.00}, 0.00000},
          }},
         /* MCS 8 - 1500 bytes */
         {std::make_pair(8, 1500),
          {
-             {-4.00, 1.00000}, {-3.75, 1.00000}, {-3.50, 1.00000}, {-3.25, 1.00000},
-             {-3.00, 1.00000}, {-2.75, 1.00000}, {-2.50, 1.00000}, {-2.25, 1.00000},
-             {-2.00, 1.00000}, {-1.75, 1.00000}, {-1.50, 1.00000}, {-1.25, 1.00000},
-             {-1.00, 1.00000}, {-0.75, 1.00000}, {-0.50, 1.00000}, {-0.25, 1.00000},
-             {0.00, 1.00000},  {0.25, 1.00000},  {0.50, 1.00000},  {0.75, 1.00000},
-             {1.00, 1.00000},  {1.25, 1.00000},  {1.50, 1.00000},  {1.75, 1.00000},
-             {2.00, 1.00000},  {2.25, 1.00000},  {2.50, 1.00000},  {2.75, 1.00000},
-             {3.00, 1.00000},  {3.25, 1.00000},  {3.50, 1.00000},  {3.75, 1.00000},
-             {4.00, 1.00000},  {4.25, 1.00000},  {4.50, 1.00000},  {4.75, 1.00000},
-             {5.00, 1.00000},  {5.25, 1.00000},  {5.50, 1.00000},  {5.75, 1.00000},
-             {6.00, 1.00000},  {6.25, 1.00000},  {6.50, 1.00000},  {6.75, 1.00000},
-             {7.00, 1.00000},  {7.25, 1.00000},  {7.50, 1.00000},  {7.75, 1.00000},
-             {8.00, 1.00000},  {8.25, 1.00000},  {8.50, 1.00000},  {8.75, 1.00000},
-             {9.00, 1.00000},  {9.25, 1.00000},  {9.50, 1.00000},  {9.75, 1.00000},
-             {10.00, 1.00000}, {10.25, 1.00000}, {10.50, 1.00000}, {10.75, 1.00000},
-             {11.00, 1.00000}, {11.25, 1.00000}, {11.50, 1.00000}, {11.75, 1.00000},
-             {12.00, 1.00000}, {12.25, 1.00000}, {12.50, 1.00000}, {12.75, 1.00000},
-             {13.00, 1.00000}, {13.25, 1.00000}, {13.50, 1.00000}, {13.75, 1.00000},
-             {14.00, 1.00000}, {14.25, 1.00000}, {14.50, 1.00000}, {14.75, 1.00000},
-             {15.00, 1.00000}, {15.25, 1.00000}, {15.50, 1.00000}, {15.75, 1.00000},
-             {16.00, 1.00000}, {16.25, 1.00000}, {16.50, 1.00000}, {16.75, 1.00000},
-             {17.00, 1.00000}, {17.25, 1.00000}, {17.50, 1.00000}, {17.75, 1.00000},
-             {18.00, 1.00000}, {18.25, 1.00000}, {18.50, 1.00000}, {18.75, 1.00000},
-             {19.00, 1.00000}, {19.25, 1.00000}, {19.50, 1.00000}, {19.75, 1.00000},
-             {20.00, 1.00000}, {20.25, 1.00000}, {20.50, 1.00000}, {20.75, 1.00000},
-             {21.00, 1.00000}, {21.25, 0.99918}, {21.50, 0.99833}, {21.75, 0.97191},
-             {22.00, 0.94458}, {22.25, 0.81436}, {22.50, 0.68127}, {22.75, 0.52168},
-             {23.00, 0.36056}, {23.25, 0.25114}, {23.50, 0.14127}, {23.75, 0.09509},
-             {24.00, 0.04883}, {24.25, 0.03234}, {24.50, 0.01584}, {24.75, 0.01060},
-             {25.00, 0.00535}, {25.25, 0.00345}, {25.50, 0.00154}, {25.75, 0.00096},
-             {26.00, 0.00037}, {26.25, 0.00022}, {26.50, 0.00007}, {26.75, 0.00004},
-             {27.00, 0.00000}, {27.25, 0.00000}, {27.50, 0.00000}, {27.75, 0.00000},
-             {28.00, 0.00000}, {28.25, 0.00000}, {28.50, 0.00000}, {28.75, 0.00000},
-             {29.00, 0.00000}, {29.25, 0.00000}, {29.50, 0.00000}, {29.75, 0.00000},
-             {30.00, 0.00000},
+             {dB_u{-4.00}, 1.00000}, {dB_u{-3.75}, 1.00000}, {dB_u{-3.50}, 1.00000},
+             {dB_u{-3.25}, 1.00000}, {dB_u{-3.00}, 1.00000}, {dB_u{-2.75}, 1.00000},
+             {dB_u{-2.50}, 1.00000}, {dB_u{-2.25}, 1.00000}, {dB_u{-2.00}, 1.00000},
+             {dB_u{-1.75}, 1.00000}, {dB_u{-1.50}, 1.00000}, {dB_u{-1.25}, 1.00000},
+             {dB_u{-1.00}, 1.00000}, {dB_u{-0.75}, 1.00000}, {dB_u{-0.50}, 1.00000},
+             {dB_u{-0.25}, 1.00000}, {dB_u{0.00}, 1.00000},  {dB_u{0.25}, 1.00000},
+             {dB_u{0.50}, 1.00000},  {dB_u{0.75}, 1.00000},  {dB_u{1.00}, 1.00000},
+             {dB_u{1.25}, 1.00000},  {dB_u{1.50}, 1.00000},  {dB_u{1.75}, 1.00000},
+             {dB_u{2.00}, 1.00000},  {dB_u{2.25}, 1.00000},  {dB_u{2.50}, 1.00000},
+             {dB_u{2.75}, 1.00000},  {dB_u{3.00}, 1.00000},  {dB_u{3.25}, 1.00000},
+             {dB_u{3.50}, 1.00000},  {dB_u{3.75}, 1.00000},  {dB_u{4.00}, 1.00000},
+             {dB_u{4.25}, 1.00000},  {dB_u{4.50}, 1.00000},  {dB_u{4.75}, 1.00000},
+             {dB_u{5.00}, 1.00000},  {dB_u{5.25}, 1.00000},  {dB_u{5.50}, 1.00000},
+             {dB_u{5.75}, 1.00000},  {dB_u{6.00}, 1.00000},  {dB_u{6.25}, 1.00000},
+             {dB_u{6.50}, 1.00000},  {dB_u{6.75}, 1.00000},  {dB_u{7.00}, 1.00000},
+             {dB_u{7.25}, 1.00000},  {dB_u{7.50}, 1.00000},  {dB_u{7.75}, 1.00000},
+             {dB_u{8.00}, 1.00000},  {dB_u{8.25}, 1.00000},  {dB_u{8.50}, 1.00000},
+             {dB_u{8.75}, 1.00000},  {dB_u{9.00}, 1.00000},  {dB_u{9.25}, 1.00000},
+             {dB_u{9.50}, 1.00000},  {dB_u{9.75}, 1.00000},  {dB_u{10.00}, 1.00000},
+             {dB_u{10.25}, 1.00000}, {dB_u{10.50}, 1.00000}, {dB_u{10.75}, 1.00000},
+             {dB_u{11.00}, 1.00000}, {dB_u{11.25}, 1.00000}, {dB_u{11.50}, 1.00000},
+             {dB_u{11.75}, 1.00000}, {dB_u{12.00}, 1.00000}, {dB_u{12.25}, 1.00000},
+             {dB_u{12.50}, 1.00000}, {dB_u{12.75}, 1.00000}, {dB_u{13.00}, 1.00000},
+             {dB_u{13.25}, 1.00000}, {dB_u{13.50}, 1.00000}, {dB_u{13.75}, 1.00000},
+             {dB_u{14.00}, 1.00000}, {dB_u{14.25}, 1.00000}, {dB_u{14.50}, 1.00000},
+             {dB_u{14.75}, 1.00000}, {dB_u{15.00}, 1.00000}, {dB_u{15.25}, 1.00000},
+             {dB_u{15.50}, 1.00000}, {dB_u{15.75}, 1.00000}, {dB_u{16.00}, 1.00000},
+             {dB_u{16.25}, 1.00000}, {dB_u{16.50}, 1.00000}, {dB_u{16.75}, 1.00000},
+             {dB_u{17.00}, 1.00000}, {dB_u{17.25}, 1.00000}, {dB_u{17.50}, 1.00000},
+             {dB_u{17.75}, 1.00000}, {dB_u{18.00}, 1.00000}, {dB_u{18.25}, 1.00000},
+             {dB_u{18.50}, 1.00000}, {dB_u{18.75}, 1.00000}, {dB_u{19.00}, 1.00000},
+             {dB_u{19.25}, 1.00000}, {dB_u{19.50}, 1.00000}, {dB_u{19.75}, 1.00000},
+             {dB_u{20.00}, 1.00000}, {dB_u{20.25}, 1.00000}, {dB_u{20.50}, 1.00000},
+             {dB_u{20.75}, 1.00000}, {dB_u{21.00}, 1.00000}, {dB_u{21.25}, 0.99918},
+             {dB_u{21.50}, 0.99833}, {dB_u{21.75}, 0.97191}, {dB_u{22.00}, 0.94458},
+             {dB_u{22.25}, 0.81436}, {dB_u{22.50}, 0.68127}, {dB_u{22.75}, 0.52168},
+             {dB_u{23.00}, 0.36056}, {dB_u{23.25}, 0.25114}, {dB_u{23.50}, 0.14127},
+             {dB_u{23.75}, 0.09509}, {dB_u{24.00}, 0.04883}, {dB_u{24.25}, 0.03234},
+             {dB_u{24.50}, 0.01584}, {dB_u{24.75}, 0.01060}, {dB_u{25.00}, 0.00535},
+             {dB_u{25.25}, 0.00345}, {dB_u{25.50}, 0.00154}, {dB_u{25.75}, 0.00096},
+             {dB_u{26.00}, 0.00037}, {dB_u{26.25}, 0.00022}, {dB_u{26.50}, 0.00007},
+             {dB_u{26.75}, 0.00004}, {dB_u{27.00}, 0.00000}, {dB_u{27.25}, 0.00000},
+             {dB_u{27.50}, 0.00000}, {dB_u{27.75}, 0.00000}, {dB_u{28.00}, 0.00000},
+             {dB_u{28.25}, 0.00000}, {dB_u{28.50}, 0.00000}, {dB_u{28.75}, 0.00000},
+             {dB_u{29.00}, 0.00000}, {dB_u{29.25}, 0.00000}, {dB_u{29.50}, 0.00000},
+             {dB_u{29.75}, 0.00000}, {dB_u{30.00}, 0.00000},
          }},
 };
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Wifi Table-based Error Rate Models Test Case
+ * @brief Wifi Table-based Error Rate Models Test Case
  */
 class TableBasedErrorRateTestCase : public TestCase
 {
@@ -946,9 +1023,9 @@
     /**
      * Constructor
      *
-     * \param testName the test name
-     * \param mode the WifiMode to use for the test
-     * \param size the number of bytes to use for the test
+     * @param testName the test name
+     * @param mode the WifiMode to use for the test
+     * @param size the number of bytes to use for the test
      */
     TableBasedErrorRateTestCase(const std::string& testName, WifiMode mode, uint32_t size);
     ~TableBasedErrorRateTestCase() override;
@@ -1026,10 +1103,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Wifi Error Rate Models Test Suite
+ * @brief Wifi Error Rate Models Test Suite
  */
 class WifiErrorRateModelsTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/test/wifi-fils-frame-test.cc ns-3.44/src/wifi/test/wifi-fils-frame-test.cc
--- ns-3.43/src/wifi/test/wifi-fils-frame-test.cc	2024-10-09 16:41:10.136656800 -0700
+++ ns-3.44/src/wifi/test/wifi-fils-frame-test.cc	2025-03-09 16:55:49.807372600 -0700
@@ -39,9 +39,9 @@
 
 using namespace ns3;
 
-/// \ingroup wifi-test
-/// \ingroup tests
-/// \brief Fast Initial Link Setup (FILS) frame Test Suite
+/// @ingroup wifi-test
+/// @ingroup tests
+/// @brief Fast Initial Link Setup (FILS) frame Test Suite
 /// Test suite intended to test (de)serialization and timing
 /// of frames associated with FILS procedure.
 /// The test creates a BSS consisting of an AP and client and
@@ -383,14 +383,14 @@
     switch (tc)
     {
     case WifiFilsFrameTestCase::BW20MHZ_NSS1_DISC:
-        params.bw = 20;
+        params.bw = MHz_u{20};
         params.ssid = DEFAULT_SSID;
         params.nss = 1;
         params.expChWidFld = 0;
         params.expNssFld = 0;
         break;
     case WifiFilsFrameTestCase::BW20MHZ_NSS3_DISC:
-        params.bw = 20;
+        params.bw = MHz_u{20};
         params.ssid = "BW20MHZ_NSS3";
         params.nss = 3;
         params.filsIntrvl = 15 * WIFI_TU;
@@ -398,7 +398,7 @@
         params.expNssFld = 2;
         break;
     case WifiFilsFrameTestCase::BW40MHZ_NSS2_DISC:
-        params.bw = 40;
+        params.bw = MHz_u{40};
         params.ssid = "BW40MHZ_NSS2";
         params.nss = 2;
         params.filsIntrvl = 10 * WIFI_TU;
@@ -406,7 +406,7 @@
         params.expNssFld = 1;
         break;
     case WifiFilsFrameTestCase::BW80MHZ_NSS2_DISC:
-        params.bw = 80;
+        params.bw = MHz_u{80};
         params.ssid = "BW80MHZ_NSS2";
         params.nss = 2;
         params.filsIntrvl = 7 * WIFI_TU;
@@ -414,7 +414,7 @@
         params.expNssFld = 1;
         break;
     case WifiFilsFrameTestCase::BW160MHZ_NSS2_DISC:
-        params.bw = 160;
+        params.bw = MHz_u{160};
         params.ssid = "BW160MHZ_NSS2";
         params.nss = 2;
         params.filsIntrvl = 5 * WIFI_TU;
@@ -422,7 +422,7 @@
         params.expNssFld = 1;
         break;
     case WifiFilsFrameTestCase::BW160MHZ_NSS2_PROBE:
-        params.bw = 160;
+        params.bw = MHz_u{160};
         params.ssid = "BW160MHZ_NSS2";
         params.nss = 2;
         params.unsolProbeRespEn = true;
@@ -436,9 +436,9 @@
     return params;
 }
 
-/// \ingroup wifi-test
-/// \ingroup tests
-/// \brief WiFi FILS frame Test Suite
+/// @ingroup wifi-test
+/// @ingroup tests
+/// @brief WiFi FILS frame Test Suite
 class WifiFilsFrameTestSuite : public TestSuite
 {
   public:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/test/wifi-gcr-test.cc ns-3.44/src/wifi/test/wifi-gcr-test.cc
--- ns-3.43/src/wifi/test/wifi-gcr-test.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/wifi/test/wifi-gcr-test.cc	2025-03-09 16:55:49.807372600 -0700
@@ -0,0 +1,2571 @@
+/*
+ * Copyright (c) 2023 DERONNE SOFTWARE ENGINEERING
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+#include "wifi-gcr-test.h"
+
+#include "ns3/ampdu-subframe-header.h"
+#include "ns3/attribute-container.h"
+#include "ns3/boolean.h"
+#include "ns3/config.h"
+#include "ns3/ctrl-headers.h"
+#include "ns3/he-configuration.h"
+#include "ns3/ht-configuration.h"
+#include "ns3/ideal-wifi-manager.h"
+#include "ns3/log.h"
+#include "ns3/mac48-address.h"
+#include "ns3/mgt-action-headers.h"
+#include "ns3/mgt-headers.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/multi-model-spectrum-channel.h"
+#include "ns3/node-list.h"
+#include "ns3/packet-socket-client.h"
+#include "ns3/packet-socket-helper.h"
+#include "ns3/packet-socket-server.h"
+#include "ns3/pointer.h"
+#include "ns3/qos-txop.h"
+#include "ns3/rng-seed-manager.h"
+#include "ns3/rr-multi-user-scheduler.h"
+#include "ns3/simulator.h"
+#include "ns3/spectrum-wifi-helper.h"
+#include "ns3/spectrum-wifi-phy.h"
+#include "ns3/string.h"
+#include "ns3/vht-configuration.h"
+#include "ns3/wifi-net-device.h"
+#include "ns3/wifi-ppdu.h"
+#include "ns3/wifi-psdu.h"
+#include "ns3/yans-wifi-helper.h"
+#include "ns3/yans-wifi-phy.h"
+
+#include <algorithm>
+#include <functional>
+#include <iomanip>
+#include <iterator>
+#include <limits>
+#include <numeric>
+
+using namespace ns3;
+
+namespace
+{
+
+/**
+ * Get the number of GCR STAs.
+ *
+ * @param stas information about all STAs of the test
+ * @return the number of GCR STAs
+ */
+std::size_t
+GetNumGcrStas(const std::vector<GcrTestBase::StaInfo>& stas)
+{
+    return std::count_if(stas.cbegin(), stas.cend(), [](const auto& staInfo) {
+        return (staInfo.gcrCapable);
+    });
+}
+
+/**
+ * Get the number of non-GCR STAs.
+ *
+ * @param stas information about all STAs of the test
+ * @return the number of non-GCR STAs
+ */
+std::size_t
+GetNumNonGcrStas(const std::vector<GcrTestBase::StaInfo>& stas)
+{
+    return stas.size() - GetNumGcrStas(stas);
+}
+
+/**
+ * Get the number of non-HT STAs.
+ *
+ * @param stas information about all STAs of the test
+ * @return the number of non-HT STAs
+ */
+std::size_t
+GetNumNonHtStas(const std::vector<GcrTestBase::StaInfo>& stas)
+{
+    return std::count_if(stas.cbegin(), stas.cend(), [](const auto& staInfo) {
+        return staInfo.standard < WIFI_STANDARD_80211n;
+    });
+}
+
+/**
+ * Lambda to print stations information.
+ */
+auto printStasInfo = [](const std::vector<GcrTestBase::StaInfo>& v) {
+    std::stringstream ss;
+    std::size_t index = 0;
+    ss << "{";
+    for (const auto& staInfo : v)
+    {
+        ss << "STA" << ++index << ": GCRcapable=" << staInfo.gcrCapable
+           << " standard=" << staInfo.standard << " maxBw=" << staInfo.maxChannelWidth
+           << " maxNss=" << +staInfo.maxNumStreams << " minGi=" << staInfo.minGi << "; ";
+    }
+    ss << "}";
+    return ss.str();
+};
+
+/**
+ * Get the node ID from the context string.
+ *
+ * @param context the context string
+ * @return the corresponding node ID
+ */
+uint32_t
+ConvertContextToNodeId(const std::string& context)
+{
+    auto sub = context.substr(10);
+    auto pos = sub.find("/Device");
+    return std::stoi(sub.substr(0, pos));
+}
+
+/**
+ * Get the maximum number of groupcast MPDUs that can be in flight.
+ *
+ * @param maxNumMpdus the configured maximum number of MPDUs
+ * @param stas information about all STAs of the test
+ * @return the maximum number of groupcast MPDUs that can be in flight
+ */
+uint16_t
+GetGcrMaxNumMpdus(uint16_t maxNumMpdus, const std::vector<GcrTestBase::StaInfo>& stas)
+{
+    uint16_t limit = 1024;
+    for (const auto& staInfo : stas)
+    {
+        if (staInfo.standard < WIFI_STANDARD_80211ax)
+        {
+            limit = 64;
+            break;
+        }
+        if (staInfo.standard < WIFI_STANDARD_80211be)
+        {
+            limit = 256;
+        }
+    }
+    return std::min(limit, maxNumMpdus);
+}
+
+constexpr uint16_t MULTICAST_PROTOCOL{1}; ///< protocol to create socket for multicast
+constexpr uint16_t UNICAST_PROTOCOL{2};   ///< protocol to create socket for unicast
+
+constexpr uint32_t maxRtsCtsThreshold{4692480}; ///< maximum value for RTS/CTS threshold
+
+constexpr bool GCR_CAPABLE_STA{true};    ///< STA that is GCR capable
+constexpr bool GCR_INCAPABLE_STA{false}; ///< STA that is not GCR capable
+
+} // namespace
+
+/**
+ * Extended IdealWifiManager class for the purpose of the tests.
+ */
+class IdealWifiManagerForGcrTest : public IdealWifiManager
+{
+  public:
+    /**
+     * @brief Get the type ID.
+     * @return the object TypeId
+     */
+    static TypeId GetTypeId()
+    {
+        static TypeId tid = TypeId("ns3::IdealWifiManagerForGcrTest")
+                                .SetParent<IdealWifiManager>()
+                                .SetGroupName("Wifi")
+                                .AddConstructor<IdealWifiManagerForGcrTest>();
+        return tid;
+    }
+
+    void DoReportAmpduTxStatus(WifiRemoteStation* station,
+                               uint16_t nSuccessfulMpdus,
+                               uint16_t nFailedMpdus,
+                               double rxSnr,
+                               double dataSnr,
+                               MHz_u dataChannelWidth,
+                               uint8_t dataNss) override
+    {
+        m_blockAckSenders.insert(station->m_state->m_address);
+        IdealWifiManager::DoReportAmpduTxStatus(station,
+                                                nSuccessfulMpdus,
+                                                nFailedMpdus,
+                                                rxSnr,
+                                                dataSnr,
+                                                dataChannelWidth,
+                                                dataNss);
+    }
+
+    GcrManager::GcrMembers m_blockAckSenders; ///< hold set of BACK senders that have passed
+                                              ///< success/failure infos to RSM
+};
+
+NS_OBJECT_ENSURE_REGISTERED(IdealWifiManagerForGcrTest);
+
+NS_LOG_COMPONENT_DEFINE("WifiGcrTest");
+
+GcrTestBase::GcrTestBase(const std::string& testName, const GcrParameters& params)
+    : TestCase(testName),
+      m_testName{testName},
+      m_params{params},
+      m_expectGcrUsed{(GetNumGcrStas(params.stas) > 0)},
+      m_expectedMaxNumMpdusInPsdu(
+          m_expectGcrUsed ? GetGcrMaxNumMpdus(m_params.maxNumMpdusInPsdu, params.stas) : 1U),
+      m_packets{0},
+      m_nTxApRts{0},
+      m_nTxApCts{0},
+      m_totalTx{0},
+      m_nTxGroupcastInCurrentTxop{0},
+      m_nTxRtsInCurrentTxop{0},
+      m_nTxCtsInCurrentTxop{0},
+      m_nTxAddbaReq{0},
+      m_nTxAddbaResp{0},
+      m_nTxDelba{0},
+      m_nTxGcrAddbaReq{0},
+      m_nTxGcrAddbaResp{0},
+      m_nTxGcrDelba{0}
+{
+    m_params.maxNumMpdusInPsdu = m_expectGcrUsed ? params.maxNumMpdusInPsdu : 1U;
+}
+
+void
+GcrTestBase::PacketGenerated(std::string context, Ptr<const Packet> p, const Address& addr)
+{
+    m_packets++;
+    if ((m_packets % m_expectedMaxNumMpdusInPsdu) == 0)
+    {
+        m_groupcastClient->SetAttribute("Interval", TimeValue(MilliSeconds(10)));
+    }
+    else
+    {
+        m_groupcastClient->SetAttribute("Interval", TimeValue(Seconds(0)));
+    }
+}
+
+void
+GcrTestBase::Transmit(std::string context,
+                      WifiConstPsduMap psduMap,
+                      WifiTxVector txVector,
+                      double txPowerW)
+{
+    auto psdu = psduMap.cbegin()->second;
+    auto mpdu = *psdu->begin();
+    auto addr1 = mpdu->GetHeader().GetAddr1();
+    const auto nodeId = ConvertContextToNodeId(context);
+    if (addr1.IsGroup() && !addr1.IsBroadcast() && mpdu->GetHeader().IsQosData())
+    {
+        const auto expectedChannelWidth =
+            std::min_element(m_params.stas.cbegin(),
+                             m_params.stas.cend(),
+                             [](const auto& sta1, const auto& sta2) {
+                                 return sta1.maxChannelWidth < sta2.maxChannelWidth;
+                             })
+                ->maxChannelWidth;
+        NS_TEST_EXPECT_MSG_EQ(txVector.GetChannelWidth(),
+                              expectedChannelWidth,
+                              "Incorrect channel width for groupcast frame");
+        const auto expectedNss =
+            std::min_element(m_params.stas.cbegin(),
+                             m_params.stas.cend(),
+                             [](const auto& sta1, const auto& sta2) {
+                                 return sta1.maxNumStreams < sta2.maxNumStreams;
+                             })
+                ->maxNumStreams;
+        const auto expectedGi = std::max_element(m_params.stas.cbegin(),
+                                                 m_params.stas.cend(),
+                                                 [](const auto& sta1, const auto& sta2) {
+                                                     return sta1.minGi < sta2.minGi;
+                                                 })
+                                    ->minGi;
+        NS_TEST_EXPECT_MSG_EQ(+txVector.GetNss(),
+                              +expectedNss,
+                              "Incorrect number of spatial streams for groupcast frame");
+        NS_TEST_EXPECT_MSG_EQ(txVector.GetGuardInterval(),
+                              expectedGi,
+                              "Incorrect guard interval duration for groupcast frame");
+        Mac48Address expectedGroupAddress{"01:00:5e:40:64:01"};
+        Mac48Address groupConcealmentAddress{"01:0F:AC:47:43:52"};
+        const auto expectConcealmentUsed =
+            m_expectGcrUsed &&
+            (GetNumNonGcrStas(m_params.stas) == 0 || mpdu->GetHeader().IsRetry());
+        std::vector<StaInfo> addressedStas{};
+        if (!expectConcealmentUsed)
+        {
+            std::copy_if(m_params.stas.cbegin(),
+                         m_params.stas.cend(),
+                         std::back_inserter(addressedStas),
+                         [](const auto& sta) { return !sta.gcrCapable; });
+        }
+        else
+        {
+            std::copy_if(m_params.stas.cbegin(),
+                         m_params.stas.cend(),
+                         std::back_inserter(addressedStas),
+                         [](const auto& sta) { return sta.gcrCapable; });
+        }
+        NS_ASSERT(!addressedStas.empty());
+        const auto minStandard = std::min_element(addressedStas.cbegin(),
+                                                  addressedStas.cend(),
+                                                  [](const auto& sta1, const auto& sta2) {
+                                                      return sta1.standard < sta2.standard;
+                                                  })
+                                     ->standard;
+        const auto expectedModulationClass = GetModulationClassForStandard(minStandard);
+        NS_TEST_EXPECT_MSG_EQ(txVector.GetModulationClass(),
+                              expectedModulationClass,
+                              "Incorrect modulation class for groupcast frame");
+        NS_TEST_EXPECT_MSG_EQ(
+            addr1,
+            (expectConcealmentUsed ? groupConcealmentAddress : expectedGroupAddress),
+            "Unexpected address1");
+        NS_TEST_EXPECT_MSG_EQ(mpdu->GetHeader().IsQosAmsdu(),
+                              expectConcealmentUsed,
+                              "MSDU aggregation should " << (expectConcealmentUsed ? "" : "not ")
+                                                         << "be used");
+        if (mpdu->GetHeader().IsQosAmsdu())
+        {
+            const auto numAmsduSubframes = std::distance(mpdu->begin(), mpdu->end());
+            NS_TEST_EXPECT_MSG_EQ(
+                numAmsduSubframes,
+                1,
+                "Only one A-MSDU subframe should be used in concealed group addressed frames");
+            NS_TEST_EXPECT_MSG_EQ(mpdu->begin()->second.GetDestinationAddr(),
+                                  expectedGroupAddress,
+                                  "Unexpected DA field in A-MSDU subframe");
+        }
+        m_totalTx++;
+        if (const auto it = m_params.mpdusToCorruptPerPsdu.find(m_totalTx);
+            it != m_params.mpdusToCorruptPerPsdu.cend())
+        {
+            std::map<uint8_t, std::list<uint64_t>> uidListPerSta{};
+            uint8_t numStas = m_params.stas.size();
+            for (uint8_t i = 0; i < numStas; ++i)
+            {
+                uidListPerSta.insert({i, {}});
+            }
+            for (std::size_t i = 0; i < psdu->GetNMpdus(); ++i)
+            {
+                for (uint8_t staId = 0; staId < numStas; ++staId)
+                {
+                    const auto& corruptedMpdusForSta =
+                        (it->second.count(0) != 0)
+                            ? it->second.at(0)
+                            : ((it->second.count(staId + 1) != 0) ? it->second.at(staId + 1)
+                                                                  : std::set<uint8_t>{});
+                    auto corruptIndex = (m_apWifiMac->GetGcrManager()->GetRetransmissionPolicy() ==
+                                         GroupAddressRetransmissionPolicy::GCR_BLOCK_ACK)
+                                            ? psdu->GetHeader(i).GetSequenceNumber()
+                                            : i;
+                    if (std::find(corruptedMpdusForSta.cbegin(),
+                                  corruptedMpdusForSta.cend(),
+                                  corruptIndex + 1) != std::end(corruptedMpdusForSta))
+                    {
+                        NS_LOG_INFO("STA " << staId + 1 << ": corrupted MPDU #" << i + 1 << " (seq="
+                                           << psdu->GetHeader(i).GetSequenceNumber() << ")"
+                                           << " for frame #" << +m_totalTx);
+                        uidListPerSta.at(staId).push_back(psdu->GetAmpduSubframe(i)->GetUid());
+                    }
+                    else
+                    {
+                        NS_LOG_INFO("STA " << staId + 1 << ": uncorrupted MPDU #" << i + 1
+                                           << " (seq=" << psdu->GetHeader(i).GetSequenceNumber()
+                                           << ")"
+                                           << " for frame #" << +m_totalTx);
+                    }
+                }
+            }
+            for (uint8_t staId = 0; staId < numStas; ++staId)
+            {
+                m_errorModels.at(staId)->SetList(uidListPerSta.at(staId));
+            }
+        }
+        else
+        {
+            NS_LOG_INFO("Do not corrupt frame #" << +m_totalTx);
+            for (auto& errorModel : m_errorModels)
+            {
+                errorModel->SetList({});
+            }
+        }
+    }
+    else if (mpdu->GetHeader().IsRts())
+    {
+        const auto isGroupcast = (m_params.numUnicastPackets == 0) ||
+                                 ((m_params.startUnicast < m_params.startGroupcast) &&
+                                  (Simulator::Now() > m_params.startGroupcast)) ||
+                                 ((m_params.startGroupcast < m_params.startUnicast) &&
+                                  (Simulator::Now() < m_params.startUnicast));
+        if (isGroupcast)
+        {
+            NS_TEST_EXPECT_MSG_EQ(nodeId, 0, "STAs are not expected to send RTS frames");
+            NS_LOG_INFO("AP: start protection and initiate RTS-CTS");
+            NS_TEST_EXPECT_MSG_EQ(mpdu->GetHeader().GetAddr2(),
+                                  m_apWifiMac->GetAddress(),
+                                  "Incorrect Address2 set for RTS frame");
+            const auto it = std::find_if(m_stasWifiMac.cbegin(),
+                                         m_stasWifiMac.cend(),
+                                         [addr = mpdu->GetHeader().GetAddr1()](const auto& mac) {
+                                             return addr == mac->GetAddress();
+                                         });
+            NS_TEST_EXPECT_MSG_EQ((it != m_stasWifiMac.cend()),
+                                  true,
+                                  "Incorrect Address1 set for RTS frame");
+            m_nTxApRts++;
+            if (m_params.rtsFramesToCorrupt.count(m_nTxApRts))
+            {
+                NS_LOG_INFO("Corrupt RTS frame #" << +m_nTxApRts);
+                const auto uid = mpdu->GetPacket()->GetUid();
+                for (auto& errorModel : m_errorModels)
+                {
+                    errorModel->SetList({uid});
+                }
+            }
+            else
+            {
+                NS_LOG_INFO("Do not corrupt RTS frame #" << +m_nTxApRts);
+                for (auto& errorModel : m_errorModels)
+                {
+                    errorModel->SetList({});
+                }
+            }
+        }
+    }
+    else if (mpdu->GetHeader().IsCts())
+    {
+        const auto isGroupcast = (m_params.numUnicastPackets == 0) ||
+                                 ((m_params.startUnicast < m_params.startGroupcast) &&
+                                  (Simulator::Now() > m_params.startGroupcast)) ||
+                                 ((m_params.startGroupcast < m_params.startUnicast) &&
+                                  (Simulator::Now() < m_params.startUnicast));
+        if (isGroupcast)
+        {
+            if (nodeId == 0)
+            {
+                NS_LOG_INFO("AP: start protection and initiate CTS-to-self");
+                NS_TEST_EXPECT_MSG_EQ(mpdu->GetHeader().GetAddr1(),
+                                      m_apWifiMac->GetAddress(),
+                                      "Incorrect Address1 set for CTS-to-self frame");
+                m_nTxApCts++;
+            }
+            else
+            {
+                const auto staId = nodeId - 1;
+                NS_LOG_INFO("STA" << staId + 1 << ": send CTS response");
+                NS_TEST_EXPECT_MSG_EQ(mpdu->GetHeader().GetAddr1(),
+                                      m_apWifiMac->GetAddress(),
+                                      "Incorrect Address1 set for CTS frame");
+                m_txCtsPerSta.at(staId)++;
+                if (const auto it = m_params.ctsFramesToCorrupt.find(m_txCtsPerSta.at(staId));
+                    it != m_params.ctsFramesToCorrupt.cend())
+                {
+                    NS_LOG_INFO("Corrupt CTS frame #" << +m_txCtsPerSta.at(staId));
+                    const auto uid = mpdu->GetPacket()->GetUid();
+                    m_apErrorModel->SetList({uid});
+                }
+                else
+                {
+                    NS_LOG_INFO("Do not corrupt CTS frame #" << +m_txCtsPerSta.at(staId));
+                    m_apErrorModel->SetList({});
+                }
+            }
+        }
+    }
+    else if (mpdu->GetHeader().IsAction())
+    {
+        WifiActionHeader actionHdr;
+        Ptr<Packet> packet = mpdu->GetPacket()->Copy();
+        packet->RemoveHeader(actionHdr);
+        auto [category, action] = WifiActionHeader::Peek(mpdu->GetPacket());
+        if (category == WifiActionHeader::BLOCK_ACK)
+        {
+            Mac48Address expectedGroupAddress{"01:00:5e:40:64:01"};
+            if (action.blockAck == WifiActionHeader::BLOCK_ACK_ADDBA_REQUEST)
+            {
+                MgtAddBaRequestHeader reqHdr;
+                packet->RemoveHeader(reqHdr);
+                const auto isGcr = reqHdr.GetGcrGroupAddress().has_value();
+                NS_LOG_INFO("AP: send " << (isGcr ? "GCR " : "") << "ADDBA request");
+                const auto expectedGcr =
+                    m_expectGcrUsed && ((m_params.numUnicastPackets == 0) ||
+                                        ((m_params.startUnicast < m_params.startGroupcast) &&
+                                         (Simulator::Now() > m_params.startGroupcast)) ||
+                                        ((m_params.startGroupcast < m_params.startUnicast) &&
+                                         (Simulator::Now() < m_params.startUnicast)));
+                NS_TEST_EXPECT_MSG_EQ(isGcr,
+                                      expectedGcr,
+                                      "GCR address should "
+                                          << (expectedGcr ? "" : "not ")
+                                          << "be set in ADDBA request sent from AP");
+                if (isGcr)
+                {
+                    m_nTxGcrAddbaReq++;
+                    NS_TEST_EXPECT_MSG_EQ(reqHdr.GetGcrGroupAddress().value(),
+                                          expectedGroupAddress,
+                                          "Incorrect GCR address in ADDBA request sent from AP");
+                    if (m_params.addbaReqsToCorrupt.count(m_nTxGcrAddbaReq))
+                    {
+                        NS_LOG_INFO("Corrupt ADDBA request #" << +m_nTxGcrAddbaReq);
+                        const auto uid = mpdu->GetPacket()->GetUid();
+                        for (auto& errorModel : m_errorModels)
+                        {
+                            errorModel->SetList({uid});
+                        }
+                    }
+                    else
+                    {
+                        NS_LOG_INFO("Do not corrupt ADDBA request #" << +m_nTxGcrAddbaReq);
+                        for (auto& errorModel : m_errorModels)
+                        {
+                            errorModel->SetList({});
+                        }
+                    }
+                }
+                else
+                {
+                    m_nTxAddbaReq++;
+                }
+            }
+            else if (action.blockAck == WifiActionHeader::BLOCK_ACK_ADDBA_RESPONSE)
+            {
+                MgtAddBaResponseHeader respHdr;
+                packet->RemoveHeader(respHdr);
+                const auto isGcr = respHdr.GetGcrGroupAddress().has_value();
+                NS_LOG_INFO("STA" << nodeId << ": send " << (isGcr ? "GCR " : "")
+                                  << "ADDBA response");
+                const auto expectedGcr =
+                    m_expectGcrUsed && ((m_params.numUnicastPackets == 0) ||
+                                        ((m_params.startUnicast < m_params.startGroupcast) &&
+                                         (Simulator::Now() > m_params.startGroupcast)) ||
+                                        ((m_params.startGroupcast < m_params.startUnicast) &&
+                                         (Simulator::Now() < m_params.startUnicast)));
+                NS_TEST_EXPECT_MSG_EQ(isGcr,
+                                      expectedGcr,
+                                      "GCR address should "
+                                          << (expectedGcr ? "" : "not ")
+                                          << "be set in ADDBA response sent from STA " << nodeId);
+                if (isGcr)
+                {
+                    m_nTxGcrAddbaResp++;
+                    NS_TEST_EXPECT_MSG_EQ(respHdr.GetGcrGroupAddress().value(),
+                                          expectedGroupAddress,
+                                          "Incorrect GCR address in ADDBA request sent from STA "
+                                              << nodeId);
+                    if (const auto it = m_params.addbaRespsToCorrupt.find(m_nTxGcrAddbaResp);
+                        it != m_params.addbaRespsToCorrupt.cend())
+                    {
+                        NS_LOG_INFO("Corrupt ADDBA response #" << +m_nTxGcrAddbaResp);
+                        const auto uid = mpdu->GetPacket()->GetUid();
+                        m_apErrorModel->SetList({uid});
+                    }
+                    else
+                    {
+                        NS_LOG_INFO("Do not corrupt ADDBA response #" << +m_nTxGcrAddbaResp);
+                        m_apErrorModel->SetList({});
+                    }
+                }
+                else
+                {
+                    m_nTxAddbaResp++;
+                }
+            }
+            else if (action.blockAck == WifiActionHeader::BLOCK_ACK_DELBA)
+            {
+                MgtDelBaHeader delbaHdr;
+                packet->RemoveHeader(delbaHdr);
+                const auto isGcr = delbaHdr.GetGcrGroupAddress().has_value();
+                NS_LOG_INFO("AP: send " << (isGcr ? "GCR " : "") << "DELBA frame");
+                const auto expectedGcr =
+                    m_expectGcrUsed && ((m_params.numUnicastPackets == 0) ||
+                                        ((m_params.startUnicast < m_params.startGroupcast) &&
+                                         (Simulator::Now() > m_params.startGroupcast)) ||
+                                        ((m_params.startGroupcast < m_params.startUnicast) &&
+                                         (Simulator::Now() < m_params.startUnicast)));
+                NS_TEST_EXPECT_MSG_EQ(isGcr,
+                                      expectedGcr,
+                                      "GCR address should "
+                                          << (expectedGcr ? "" : "not ")
+                                          << "be set in DELBA frame sent from AP");
+                if (isGcr)
+                {
+                    m_nTxGcrDelba++;
+                }
+                else
+                {
+                    m_nTxDelba++;
+                }
+            }
+        }
+    }
+}
+
+bool
+GcrTestBase::IsUsingAmpduOrSmpdu() const
+{
+    return ((m_params.maxNumMpdusInPsdu > 1) ||
+            std::none_of(m_params.stas.cbegin(), m_params.stas.cend(), [](const auto& staInfo) {
+                return (staInfo.standard < WIFI_STANDARD_80211ac);
+            }));
+}
+
+void
+GcrTestBase::PhyRx(std::string context,
+                   Ptr<const Packet> p,
+                   double snr,
+                   WifiMode mode,
+                   WifiPreamble preamble)
+{
+    const auto packetSize = p->GetSize();
+    if (packetSize < m_params.packetSize)
+    {
+        // ignore small packets (ACKs, ...)
+        return;
+    }
+    Ptr<Packet> packet = p->Copy();
+    if (IsUsingAmpduOrSmpdu())
+    {
+        AmpduSubframeHeader ampduHdr;
+        packet->RemoveHeader(ampduHdr);
+    }
+    WifiMacHeader hdr;
+    packet->PeekHeader(hdr);
+    if (!hdr.IsData() || !hdr.GetAddr1().IsGroup())
+    {
+        // ignore non-data frames and unicast data frames
+        return;
+    }
+    const auto staId = ConvertContextToNodeId(context) - 1;
+    NS_ASSERT(staId <= m_params.stas.size());
+    m_phyRxPerSta.at(staId)++;
+}
+
+void
+GcrTestBase::NotifyTxopTerminated(Time startTime, Time duration, uint8_t linkId)
+{
+    NS_LOG_INFO("AP: terminated TXOP");
+    NS_TEST_EXPECT_MSG_EQ((m_nTxGroupcastInCurrentTxop <= 1),
+                          true,
+                          "An MPDU and a retransmission of the same MPDU shall not be transmitted "
+                          "within the same GCR TXOP");
+    NS_TEST_EXPECT_MSG_EQ((m_nTxRtsInCurrentTxop + m_nTxCtsInCurrentTxop <= 1),
+                          true,
+                          "No more than one protection frame exchange per GCR TXOP");
+    m_nTxGroupcastInCurrentTxop = 0;
+    m_nTxRtsInCurrentTxop = 0;
+    m_nTxCtsInCurrentTxop = 0;
+}
+
+void
+GcrTestBase::CheckResults()
+{
+    NS_LOG_FUNCTION(this);
+
+    const auto expectedNumRts =
+        (m_expectGcrUsed && (m_params.gcrProtectionMode == GroupcastProtectionMode::RTS_CTS) &&
+         (m_params.rtsThreshold < (m_params.packetSize * m_params.maxNumMpdusInPsdu)))
+            ? m_totalTx + m_params.rtsFramesToCorrupt.size() + m_params.ctsFramesToCorrupt.size()
+            : 0U;
+    NS_TEST_EXPECT_MSG_EQ(+m_nTxApRts, +expectedNumRts, "Unexpected number of RTS frames");
+
+    const auto expectedNumCts =
+        (m_expectGcrUsed && (m_params.gcrProtectionMode == GroupcastProtectionMode::RTS_CTS) &&
+         (m_params.rtsThreshold < (m_params.packetSize * m_params.maxNumMpdusInPsdu)))
+            ? m_totalTx + m_params.ctsFramesToCorrupt.size()
+            : 0U;
+    const auto totalNumCts = std::accumulate(m_txCtsPerSta.cbegin(), m_txCtsPerSta.cend(), 0U);
+    NS_TEST_EXPECT_MSG_EQ(totalNumCts, expectedNumCts, "Unexpected number of CTS frames");
+
+    const auto expectedNumCtsToSelf =
+        (m_expectGcrUsed && (m_params.gcrProtectionMode == GroupcastProtectionMode::CTS_TO_SELF))
+            ? m_totalTx
+            : 0U;
+    NS_TEST_EXPECT_MSG_EQ(+m_nTxApCts,
+                          +expectedNumCtsToSelf,
+                          "Unexpected number of CTS-to-self frames");
+
+    uint8_t numStas = m_params.stas.size();
+    for (uint8_t i = 0; i < numStas; ++i)
+    {
+        NS_TEST_EXPECT_MSG_EQ(m_rxUnicastPerSta.at(i),
+                              m_params.numUnicastPackets,
+                              "Unexpected number of received unicast packets for STA " << i + 1);
+    }
+
+    const auto htCapableStas =
+        std::count_if(m_params.stas.cbegin(), m_params.stas.cend(), [](const auto& staInfo) {
+            return (staInfo.standard >= WIFI_STANDARD_80211n);
+        });
+    if (m_params.numUnicastPackets > 0)
+    {
+        NS_TEST_EXPECT_MSG_EQ(+m_nTxAddbaReq,
+                              +htCapableStas,
+                              "Incorrect number of transmitted ADDBA requests");
+        NS_TEST_EXPECT_MSG_EQ(+m_nTxAddbaResp,
+                              +htCapableStas,
+                              "Incorrect number of transmitted ADDBA responses");
+        NS_TEST_EXPECT_MSG_EQ(+m_nTxDelba,
+                              ((m_params.baInactivityTimeout > 0 && m_params.numUnicastPackets > 1)
+                                   ? +htCapableStas
+                                   : 0),
+                              "Incorrect number of transmitted DELBA frames");
+    }
+
+    const auto gcrCapableStas =
+        std::count_if(m_params.stas.cbegin(), m_params.stas.cend(), [](const auto& staInfo) {
+            return staInfo.gcrCapable;
+        });
+    const auto isGcrBa = m_apWifiMac->GetGcrManager()->GetRetransmissionPolicy() ==
+                         GroupAddressRetransmissionPolicy::GCR_BLOCK_ACK;
+    if (m_params.numGroupcastPackets > 0 && (isGcrBa || (m_params.maxNumMpdusInPsdu > 1)))
+    {
+        NS_TEST_EXPECT_MSG_EQ(+m_nTxGcrAddbaReq,
+                              gcrCapableStas + m_params.addbaReqsToCorrupt.size(),
+                              "Incorrect number of transmitted GCR ADDBA requests");
+        NS_TEST_EXPECT_MSG_EQ(+m_nTxGcrAddbaResp,
+                              gcrCapableStas + m_params.addbaRespsToCorrupt.size(),
+                              "Incorrect number of transmitted GCR ADDBA responses");
+        NS_TEST_EXPECT_MSG_EQ(+m_nTxGcrDelba,
+                              ((m_params.baInactivityTimeout > 0) ? +gcrCapableStas : 0),
+                              "Incorrect number of transmitted GCR DELBA frames");
+    }
+    else
+    {
+        NS_TEST_EXPECT_MSG_EQ(+m_nTxGcrAddbaReq, 0, "Unexpected GCR ADDBA requests");
+        NS_TEST_EXPECT_MSG_EQ(+m_nTxGcrAddbaResp, 0, "Unexpected GCR ADDBA responses");
+        NS_TEST_EXPECT_MSG_EQ(+m_nTxGcrDelba, 0, "Unexpected GCR DELBA frames");
+    }
+}
+
+void
+GcrTestBase::DoSetup()
+{
+    NS_LOG_FUNCTION(this << m_testName);
+
+    // WifiHelper::EnableLogComponents();
+    // LogComponentEnable("WifiGcrTest", LOG_LEVEL_ALL);
+
+    RngSeedManager::SetSeed(1);
+    RngSeedManager::SetRun(2);
+    int64_t streamNumber = 100;
+
+    Config::SetDefault("ns3::WifiMacQueue::MaxDelay", TimeValue(m_params.maxLifetime));
+    const auto maxPacketsInQueue = std::max<uint16_t>(m_params.numGroupcastPackets + 1, 500);
+    Config::SetDefault("ns3::WifiMacQueue::MaxSize",
+                       StringValue(std::to_string(maxPacketsInQueue) + "p"));
+
+    const auto maxChannelWidth =
+        std::max_element(m_params.stas.cbegin(),
+                         m_params.stas.cend(),
+                         [](const auto& lhs, const auto& rhs) {
+                             return lhs.maxChannelWidth < rhs.maxChannelWidth;
+                         })
+            ->maxChannelWidth;
+    const auto maxNss = std::max_element(m_params.stas.cbegin(),
+                                         m_params.stas.cend(),
+                                         [](const auto& lhs, const auto& rhs) {
+                                             return lhs.maxNumStreams < rhs.maxNumStreams;
+                                         })
+                            ->maxNumStreams;
+
+    uint8_t numStas = m_params.stas.size();
+    NodeContainer wifiApNode(1);
+    NodeContainer wifiStaNodes(numStas);
+
+    WifiHelper wifi;
+    wifi.SetStandard(WIFI_STANDARD_80211be);
+    wifi.SetRemoteStationManager("ns3::IdealWifiManagerForGcrTest",
+                                 "RtsCtsThreshold",
+                                 UintegerValue(m_params.rtsThreshold),
+                                 "NonUnicastMode",
+                                 (GetNumNonHtStas(m_params.stas) == 0)
+                                     ? StringValue("HtMcs0")
+                                     : StringValue("OfdmRate6Mbps"));
+
+    wifi.ConfigHtOptions("ShortGuardIntervalSupported", BooleanValue(true));
+    wifi.ConfigHeOptions("GuardInterval", TimeValue(NanoSeconds(800)));
+
+    WifiMacHelper apMacHelper;
+    apMacHelper.SetType("ns3::ApWifiMac",
+                        "Ssid",
+                        SsidValue(Ssid("ns-3-ssid")),
+                        "BeaconGeneration",
+                        BooleanValue(true),
+                        "RobustAVStreamingSupported",
+                        BooleanValue(true));
+    ConfigureGcrManager(apMacHelper);
+
+    WifiMacHelper staMacHelper;
+    staMacHelper.SetType("ns3::StaWifiMac",
+                         "Ssid",
+                         SsidValue(Ssid("ns-3-ssid")),
+                         "ActiveProbing",
+                         BooleanValue(false),
+                         "QosSupported",
+                         BooleanValue(true));
+    ConfigureGcrManager(staMacHelper);
+
+    NetDeviceContainer apDevice;
+    NetDeviceContainer staDevices;
+
+    const auto differentChannelWidths =
+        std::any_of(m_params.stas.cbegin(),
+                    m_params.stas.cend(),
+                    [maxChannelWidth](const auto& staInfo) {
+                        return (staInfo.maxChannelWidth != maxChannelWidth);
+                    });
+    if (differentChannelWidths)
+    {
+        SpectrumWifiPhyHelper phyHelper;
+        phyHelper.SetPcapDataLinkType(WifiPhyHelper::DLT_IEEE802_11_RADIO);
+
+        auto channel = CreateObject<MultiModelSpectrumChannel>();
+        phyHelper.SetChannel(channel);
+
+        apDevice = wifi.Install(phyHelper, apMacHelper, wifiApNode);
+        auto staNodesIt = wifiStaNodes.Begin();
+        for (const auto& staInfo : m_params.stas)
+        {
+            wifi.SetStandard(staInfo.standard);
+            staDevices.Add(wifi.Install(phyHelper, staMacHelper, *staNodesIt));
+            ++staNodesIt;
+        }
+
+        // Uncomment the lines below to write PCAP files
+        // phyHelper.EnablePcap("wifi-gcr_AP", apDevice);
+        // phyHelper.EnablePcap("wifi-gcr_STA", staDevices);
+    }
+    else
+    {
+        YansWifiPhyHelper phyHelper;
+        phyHelper.SetPcapDataLinkType(WifiPhyHelper::DLT_IEEE802_11_RADIO);
+
+        auto channel = YansWifiChannelHelper::Default();
+        channel.SetPropagationDelay("ns3::ConstantSpeedPropagationDelayModel");
+        phyHelper.SetChannel(channel.Create());
+
+        apDevice = wifi.Install(phyHelper, apMacHelper, wifiApNode);
+        auto staNodesIt = wifiStaNodes.Begin();
+        for (const auto& staInfo : m_params.stas)
+        {
+            wifi.SetStandard(staInfo.standard);
+            staDevices.Add(wifi.Install(phyHelper, staMacHelper, *staNodesIt));
+            ++staNodesIt;
+        }
+
+        // Uncomment the lines below to write PCAP files
+        // phyHelper.EnablePcap("wifi-gcr_AP", apDevice);
+        // phyHelper.EnablePcap("wifi-gcr_STA", staDevices);
+    }
+
+    // Assign fixed streams to random variables in use
+    streamNumber += WifiHelper::AssignStreams(apDevice, streamNumber);
+    streamNumber += WifiHelper::AssignStreams(staDevices, streamNumber);
+
+    MobilityHelper mobility;
+    Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator>();
+
+    positionAlloc->Add(Vector(0.0, 0.0, 0.0));
+    for (uint8_t i = 0; i < numStas; ++i)
+    {
+        positionAlloc->Add(Vector(i, 0.0, 0.0));
+    }
+    mobility.SetPositionAllocator(positionAlloc);
+
+    mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
+    mobility.Install(wifiApNode);
+    mobility.Install(wifiStaNodes);
+
+    auto apNetDevice = DynamicCast<WifiNetDevice>(apDevice.Get(0));
+    m_apWifiMac = DynamicCast<ApWifiMac>(apNetDevice->GetMac());
+    m_apWifiMac->SetAttribute("BE_MaxAmsduSize", UintegerValue(0));
+    m_apWifiMac->SetAttribute(
+        "BE_MaxAmpduSize",
+        UintegerValue((m_params.maxNumMpdusInPsdu > 1)
+                          ? (m_params.maxNumMpdusInPsdu * (m_params.packetSize + 100))
+                          : 0));
+
+    m_apWifiMac->SetAttribute("BE_BlockAckInactivityTimeout",
+                              UintegerValue(m_params.baInactivityTimeout));
+    m_apWifiMac->GetQosTxop(AC_BE)->SetTxopLimit(m_params.txopLimit);
+
+    m_apWifiMac->GetWifiPhy(0)->SetOperatingChannel(
+        WifiPhy::ChannelTuple{0, maxChannelWidth, WIFI_PHY_BAND_5GHZ, 0});
+
+    m_apWifiMac->GetWifiPhy(0)->SetNumberOfAntennas(maxNss);
+    m_apWifiMac->GetWifiPhy(0)->SetMaxSupportedTxSpatialStreams(maxNss);
+    m_apWifiMac->GetWifiPhy(0)->SetMaxSupportedRxSpatialStreams(maxNss);
+
+    m_apErrorModel = CreateObject<ListErrorModel>();
+    m_apWifiMac->GetWifiPhy(0)->SetPostReceptionErrorModel(m_apErrorModel);
+
+    for (uint8_t i = 0; i < numStas; ++i)
+    {
+        auto staNetDevice = DynamicCast<WifiNetDevice>(staDevices.Get(i));
+        auto staWifiMac = DynamicCast<StaWifiMac>(staNetDevice->GetMac());
+        staWifiMac->SetRobustAVStreamingSupported(m_params.stas.at(i).gcrCapable);
+        m_stasWifiMac.emplace_back(staWifiMac);
+
+        if (m_params.stas.at(i).standard >= WIFI_STANDARD_80211n)
+        {
+            auto staHtConfiguration = CreateObject<HtConfiguration>();
+            staHtConfiguration->m_40MHzSupported =
+                (m_params.stas.at(i).standard >= WIFI_STANDARD_80211ac ||
+                 m_params.stas.at(i).maxChannelWidth >= MHz_u{40});
+            staHtConfiguration->m_sgiSupported = (m_params.stas.at(i).minGi == NanoSeconds(400));
+            staNetDevice->SetHtConfiguration(staHtConfiguration);
+        }
+        if (m_params.stas.at(i).standard >= WIFI_STANDARD_80211ac)
+        {
+            auto staVhtConfiguration = CreateObject<VhtConfiguration>();
+            staVhtConfiguration->m_160MHzSupported =
+                (m_params.stas.at(i).maxChannelWidth >= MHz_u{160});
+            staNetDevice->SetVhtConfiguration(staVhtConfiguration);
+        }
+        if (m_params.stas.at(i).standard >= WIFI_STANDARD_80211ax)
+        {
+            auto staHeConfiguration = CreateObject<HeConfiguration>();
+            staHeConfiguration->SetGuardInterval(
+                std::max(m_params.stas.at(i).minGi, NanoSeconds(800)));
+            staNetDevice->SetHeConfiguration(staHeConfiguration);
+        }
+
+        staWifiMac->GetWifiPhy(0)->SetOperatingChannel(
+            WifiPhy::ChannelTuple{0, m_params.stas.at(i).maxChannelWidth, WIFI_PHY_BAND_5GHZ, 0});
+
+        staWifiMac->GetWifiPhy(0)->SetNumberOfAntennas(m_params.stas.at(i).maxNumStreams);
+        staWifiMac->GetWifiPhy(0)->SetMaxSupportedTxSpatialStreams(
+            m_params.stas.at(i).maxNumStreams);
+        staWifiMac->GetWifiPhy(0)->SetMaxSupportedRxSpatialStreams(
+            m_params.stas.at(i).maxNumStreams);
+
+        auto errorModel = CreateObject<ListErrorModel>();
+        m_errorModels.push_back(errorModel);
+        staWifiMac->GetWifiPhy(0)->SetPostReceptionErrorModel(errorModel);
+
+        m_phyRxPerSta.push_back(0);
+        m_txCtsPerSta.push_back(0);
+        m_rxGroupcastPerSta.emplace_back();
+        m_rxUnicastPerSta.emplace_back();
+    }
+
+    // give packet socket powers to nodes.
+    PacketSocketHelper packetSocket;
+    packetSocket.Install(wifiStaNodes);
+    packetSocket.Install(wifiApNode);
+
+    if (m_params.numGroupcastPackets > 0)
+    {
+        PacketSocketAddress groupcastSocket;
+        groupcastSocket.SetSingleDevice(apDevice.Get(0)->GetIfIndex());
+        groupcastSocket.SetPhysicalAddress(
+            Mac48Address::GetMulticast(Ipv4Address("239.192.100.1")));
+        groupcastSocket.SetProtocol(MULTICAST_PROTOCOL);
+
+        m_groupcastClient = CreateObject<PacketSocketClient>();
+        m_groupcastClient->SetAttribute("MaxPackets", UintegerValue(m_params.numGroupcastPackets));
+        m_groupcastClient->SetAttribute("PacketSize", UintegerValue(m_params.packetSize));
+        m_groupcastClient->SetAttribute("Interval", TimeValue(Seconds(0)));
+        m_groupcastClient->SetRemote(groupcastSocket);
+        wifiApNode.Get(0)->AddApplication(m_groupcastClient);
+        m_groupcastClient->SetStartTime(m_params.startGroupcast);
+        m_groupcastClient->SetStopTime(m_params.duration);
+
+        for (uint8_t i = 0; i < numStas; ++i)
+        {
+            auto groupcastServer = CreateObject<PacketSocketServer>();
+            groupcastServer->SetLocal(groupcastSocket);
+            wifiStaNodes.Get(i)->AddApplication(groupcastServer);
+            groupcastServer->SetStartTime(Seconds(0.0));
+            groupcastServer->SetStopTime(m_params.duration);
+        }
+    }
+
+    if (m_params.numUnicastPackets > 0)
+    {
+        uint8_t staIndex = 0;
+        for (uint8_t i = 0; i < numStas; ++i)
+        {
+            PacketSocketAddress unicastSocket;
+            unicastSocket.SetSingleDevice(apDevice.Get(0)->GetIfIndex());
+            unicastSocket.SetPhysicalAddress(staDevices.Get(staIndex++)->GetAddress());
+            unicastSocket.SetProtocol(UNICAST_PROTOCOL);
+
+            auto unicastClient = CreateObject<PacketSocketClient>();
+            unicastClient->SetAttribute("PacketSize", UintegerValue(m_params.packetSize));
+            unicastClient->SetAttribute("MaxPackets", UintegerValue(m_params.numUnicastPackets));
+            unicastClient->SetAttribute("Interval", TimeValue(Seconds(0)));
+            unicastClient->SetRemote(unicastSocket);
+            wifiApNode.Get(0)->AddApplication(unicastClient);
+            unicastClient->SetStartTime(m_params.startUnicast);
+            unicastClient->SetStopTime(m_params.duration);
+
+            auto unicastServer = CreateObject<PacketSocketServer>();
+            unicastServer->SetLocal(unicastSocket);
+            wifiStaNodes.Get(i)->AddApplication(unicastServer);
+            unicastServer->SetStartTime(Seconds(0.0));
+            unicastServer->SetStopTime(m_params.duration);
+        }
+    }
+
+    PointerValue ptr;
+    m_apWifiMac->GetAttribute("BE_Txop", ptr);
+    ptr.Get<QosTxop>()->TraceConnectWithoutContext(
+        "TxopTrace",
+        MakeCallback(&GcrTestBase::NotifyTxopTerminated, this));
+
+    Config::Connect("/NodeList/*/$ns3::Node/ApplicationList/*/$ns3::PacketSocketClient/Tx",
+                    MakeCallback(&GcrTestBase::PacketGenerated, this));
+
+    Config::Connect("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phys/0/PhyTxPsduBegin",
+                    MakeCallback(&GcrTestBase::Transmit, this));
+
+    Config::Connect("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::WifiPhy/State/RxOk",
+                    MakeCallback(&GcrTestBase::PhyRx, this));
+
+    Config::Connect("/NodeList/*/ApplicationList/*/$ns3::PacketSocketServer/Rx",
+                    MakeCallback(&GcrTestBase::Receive, this));
+}
+
+void
+GcrTestBase::DoRun()
+{
+    NS_LOG_FUNCTION(this << m_testName);
+
+    Simulator::Stop(m_params.duration);
+    Simulator::Run();
+
+    CheckResults();
+
+    Simulator::Destroy();
+}
+
+GcrUrTest::GcrUrTest(const std::string& testName,
+                     const GcrParameters& commonParams,
+                     const GcrUrParameters& gcrUrParams)
+    : GcrTestBase(testName, commonParams),
+      m_gcrUrParams{gcrUrParams},
+      m_currentUid{0}
+{
+}
+
+void
+GcrUrTest::PacketGenerated(std::string context, Ptr<const Packet> p, const Address& addr)
+{
+    if (!m_gcrUrParams.packetsPauzeAggregation.has_value() ||
+        m_packets < m_gcrUrParams.packetsPauzeAggregation.value() ||
+        m_packets > m_gcrUrParams.packetsResumeAggregation.value())
+    {
+        GcrTestBase::PacketGenerated(context, p, addr);
+        return;
+    }
+    m_packets++;
+    if (m_packets == (m_gcrUrParams.packetsPauzeAggregation.value() + 1))
+    {
+        m_groupcastClient->SetAttribute("Interval", TimeValue(MilliSeconds(10)));
+    }
+    if (m_gcrUrParams.packetsResumeAggregation.has_value() &&
+        (m_packets == (m_gcrUrParams.packetsResumeAggregation.value() + 1)))
+    {
+        m_groupcastClient->SetAttribute("Interval", TimeValue(MilliSeconds(0)));
+    }
+}
+
+void
+GcrUrTest::Transmit(std::string context,
+                    WifiConstPsduMap psduMap,
+                    WifiTxVector txVector,
+                    double txPowerW)
+{
+    auto psdu = psduMap.cbegin()->second;
+    auto mpdu = *psdu->begin();
+    auto addr1 = mpdu->GetHeader().GetAddr1();
+    if (addr1.IsGroup() && !addr1.IsBroadcast() && mpdu->GetHeader().IsQosData())
+    {
+        if (const auto uid = mpdu->GetPacket()->GetUid(); m_currentUid != uid)
+        {
+            m_totalTxGroupcasts.push_back(0);
+            m_currentUid = uid;
+            m_currentMpdu = nullptr;
+        }
+        if (m_totalTxGroupcasts.back() == 0)
+        {
+            NS_LOG_INFO("AP: groupcast initial transmission (#MPDUs=" << psdu->GetNMpdus() << ")");
+            for (std::size_t i = 0; i < psdu->GetNMpdus(); ++i)
+            {
+                NS_TEST_EXPECT_MSG_EQ(
+                    psdu->GetHeader(i).IsRetry(),
+                    false,
+                    "retry flag should not be set for the first groupcast transmission");
+            }
+            m_currentMpdu = mpdu;
+        }
+        else
+        {
+            NS_ASSERT(m_currentMpdu);
+            NS_TEST_EXPECT_MSG_EQ(m_expectGcrUsed, true, "GCR service should not be used");
+            NS_LOG_INFO("AP: groupcast sollicited retry #"
+                        << +m_totalTxGroupcasts.back() << " (#MPDUs=" << psdu->GetNMpdus() << ")");
+            for (std::size_t i = 0; i < psdu->GetNMpdus(); ++i)
+            {
+                NS_TEST_EXPECT_MSG_EQ(psdu->GetHeader(i).IsRetry(),
+                                      true,
+                                      "retry flag should be set for unsolicited retries");
+            }
+            NS_TEST_EXPECT_MSG_EQ((mpdu->GetHeader().IsQosAmsdu() ? mpdu->begin()->first->GetSize()
+                                                                  : mpdu->GetPacket()->GetSize()),
+                                  (m_currentMpdu->GetHeader().IsQosAmsdu()
+                                       ? m_currentMpdu->begin()->first->GetSize()
+                                       : m_currentMpdu->GetPacket()->GetSize()),
+                                  "Unexpected MPDU size");
+        }
+        if (m_params.maxNumMpdusInPsdu > 1)
+        {
+            const uint16_t prevTxMpdus =
+                (m_totalTxGroupcasts.size() - 1) * m_expectedMaxNumMpdusInPsdu;
+            const uint16_t remainingMpdus = m_gcrUrParams.packetsPauzeAggregation.has_value()
+                                                ? m_params.numGroupcastPackets
+                                                : m_params.numGroupcastPackets - prevTxMpdus;
+            NS_TEST_EXPECT_MSG_EQ(
+                psdu->GetNMpdus(),
+                (IsUsingAmpduOrSmpdu() ? std::min(m_expectedMaxNumMpdusInPsdu, remainingMpdus) : 1),
+                "Incorrect number of aggregated MPDUs");
+            const auto nonAggregatedMpdus = (m_gcrUrParams.packetsResumeAggregation.value_or(0) -
+                                             m_gcrUrParams.packetsPauzeAggregation.value_or(0));
+            const uint16_t threshold =
+                (m_gcrUrParams.packetsPauzeAggregation.value_or(0) / m_params.maxNumMpdusInPsdu) +
+                nonAggregatedMpdus;
+            for (std::size_t i = 0; i < psdu->GetNMpdus(); ++i)
+            {
+                auto previousMpdusNotAggregated =
+                    (m_totalTxGroupcasts.size() > threshold) ? nonAggregatedMpdus : 0;
+                auto expectedSeqNum = IsUsingAmpduOrSmpdu()
+                                          ? ((i + prevTxMpdus) - previousMpdusNotAggregated)
+                                          : (((m_totalTxGroupcasts.size() - 1) +
+                                              (m_gcrUrParams.packetsPauzeAggregation.value_or(0) /
+                                               m_params.maxNumMpdusInPsdu)) -
+                                             previousMpdusNotAggregated);
+                NS_TEST_EXPECT_MSG_EQ(psdu->GetHeader(i).GetSequenceNumber(),
+                                      expectedSeqNum,
+                                      "unexpected sequence number");
+            }
+        }
+        else
+        {
+            NS_TEST_EXPECT_MSG_EQ(psdu->GetNMpdus(), 1, "MPDU aggregation should not be used");
+            NS_TEST_EXPECT_MSG_EQ(mpdu->GetHeader().GetSequenceNumber(),
+                                  (m_totalTxGroupcasts.size() - 1),
+                                  "unexpected sequence number");
+        }
+        m_totalTxGroupcasts.back()++;
+        m_nTxGroupcastInCurrentTxop++;
+    }
+    else if (mpdu->GetHeader().IsRts())
+    {
+        m_nTxRtsInCurrentTxop++;
+    }
+    else if (const auto nodeId = ConvertContextToNodeId(context);
+             (mpdu->GetHeader().IsCts() && (nodeId == 0)))
+    {
+        m_nTxCtsInCurrentTxop++;
+    }
+    GcrTestBase::Transmit(context, psduMap, txVector, txPowerW);
+}
+
+void
+GcrUrTest::Receive(std::string context, Ptr<const Packet> p, const Address& adr)
+{
+    const auto staId = ConvertContextToNodeId(context) - 1;
+    NS_LOG_INFO("STA" << staId + 1 << ": multicast packet forwarded up at attempt "
+                      << +m_totalTxGroupcasts.back());
+    m_rxGroupcastPerSta.at(staId).push_back(m_totalTxGroupcasts.back());
+}
+
+void
+GcrUrTest::ConfigureGcrManager(WifiMacHelper& macHelper)
+{
+    macHelper.SetGcrManager("ns3::WifiDefaultGcrManager",
+                            "RetransmissionPolicy",
+                            StringValue("GCR_UR"),
+                            "UnsolicitedRetryLimit",
+                            UintegerValue(m_gcrUrParams.nGcrRetries),
+                            "GcrProtectionMode",
+                            EnumValue(m_params.gcrProtectionMode));
+}
+
+bool
+GcrUrTest::IsUsingAmpduOrSmpdu() const
+{
+    if (!GcrTestBase::IsUsingAmpduOrSmpdu())
+    {
+        return false;
+    }
+    if (GetNumNonHtStas(m_params.stas) > 0)
+    {
+        return false;
+    }
+    const auto nonAggregatedMpdus = (m_gcrUrParams.packetsResumeAggregation.value_or(0) -
+                                     m_gcrUrParams.packetsPauzeAggregation.value_or(0));
+    const uint16_t threshold =
+        (m_gcrUrParams.packetsPauzeAggregation.value_or(0) / m_params.maxNumMpdusInPsdu) +
+        nonAggregatedMpdus;
+    const auto expectAmpdu =
+        (!m_gcrUrParams.packetsPauzeAggregation.has_value() ||
+         (m_totalTxGroupcasts.size() <=
+          (m_gcrUrParams.packetsPauzeAggregation.value() / m_params.maxNumMpdusInPsdu)) ||
+         (m_totalTxGroupcasts.size() > threshold));
+    return expectAmpdu;
+}
+
+void
+GcrUrTest::CheckResults()
+{
+    GcrTestBase::CheckResults();
+
+    const auto expectedMaxNumMpdusInPsdu =
+        (GetNumNonHtStas(m_params.stas) == 0) ? m_expectedMaxNumMpdusInPsdu : 1;
+    const std::size_t numNonRetryGroupcastFrames =
+        m_gcrUrParams.packetsPauzeAggregation.has_value()
+            ? (m_params.numGroupcastPackets -
+               std::ceil(static_cast<double>(m_gcrUrParams.packetsPauzeAggregation.value()) /
+                         expectedMaxNumMpdusInPsdu) -
+               std::ceil(static_cast<double>(m_params.numGroupcastPackets -
+                                             m_gcrUrParams.packetsResumeAggregation.value()) /
+                         expectedMaxNumMpdusInPsdu))
+            : std::ceil(static_cast<double>(m_params.numGroupcastPackets -
+                                            m_params.expectedDroppedGroupcastMpdus.size()) /
+                        expectedMaxNumMpdusInPsdu);
+    NS_TEST_EXPECT_MSG_EQ(m_totalTxGroupcasts.size(),
+                          numNonRetryGroupcastFrames,
+                          "Unexpected number of non-retransmitted groupcast frames");
+
+    NS_ASSERT(!m_totalTxGroupcasts.empty());
+    const auto totalTxGroupcastFrames =
+        std::accumulate(m_totalTxGroupcasts.cbegin(), m_totalTxGroupcasts.cend(), 0U);
+    uint8_t numRetries = m_expectGcrUsed ? m_gcrUrParams.nGcrRetries : 0;
+    // with test conditions, one more retry when A-MPDU is not used
+    const auto nonAmpduPackets = m_gcrUrParams.packetsPauzeAggregation.has_value()
+                                     ? (m_gcrUrParams.packetsResumeAggregation.value() -
+                                        m_gcrUrParams.packetsPauzeAggregation.value())
+                                     : 0;
+    ;
+    uint16_t expectedTxAttempts =
+        m_gcrUrParams.packetsPauzeAggregation.has_value() &&
+                (m_gcrUrParams.expectedSkippedRetries > 0)
+            ? (std::ceil((1 + numRetries - m_gcrUrParams.expectedSkippedRetries) *
+                         ((static_cast<double>(m_params.numGroupcastPackets - nonAmpduPackets) /
+                           expectedMaxNumMpdusInPsdu))) +
+               ((1 + numRetries - (m_gcrUrParams.expectedSkippedRetries - 1)) * nonAmpduPackets))
+            : ((1 + numRetries - m_gcrUrParams.expectedSkippedRetries) *
+               numNonRetryGroupcastFrames);
+    NS_TEST_EXPECT_MSG_EQ(totalTxGroupcastFrames,
+                          expectedTxAttempts,
+                          "Unexpected number of transmission attempts");
+
+    uint8_t numStas = m_params.stas.size();
+    for (uint8_t i = 0; i < numStas; ++i)
+    {
+        numRetries =
+            (m_params.stas.at(i).standard >= WIFI_STANDARD_80211n) ? m_gcrUrParams.nGcrRetries : 0;
+        expectedTxAttempts =
+            m_gcrUrParams.packetsPauzeAggregation.has_value() &&
+                    (m_gcrUrParams.expectedSkippedRetries > 0)
+                ? (std::ceil((1 + numRetries - m_gcrUrParams.expectedSkippedRetries) *
+                             ((static_cast<double>(m_params.numGroupcastPackets - nonAmpduPackets) /
+                               expectedMaxNumMpdusInPsdu))) +
+                   ((1 + numRetries - (m_gcrUrParams.expectedSkippedRetries - 1)) *
+                    nonAmpduPackets))
+                : ((1 + numRetries - m_gcrUrParams.expectedSkippedRetries) *
+                   numNonRetryGroupcastFrames);
+
+        // calculate the amount of corrupted PSDUs and the expected number of retransmission per
+        // MPDU
+        uint8_t corruptedPsdus = 0;
+        uint8_t prevExpectedNumAttempt = 1;
+        uint8_t prevPsduNum = 1;
+        uint8_t droppedPsdus = 0;
+        auto prevDropped = false;
+        auto maxNumMpdusInPsdu =
+            (GetNumNonHtStas(m_params.stas) == 0) ? m_params.maxNumMpdusInPsdu : 1;
+        for (uint16_t j = 0; j < m_params.numGroupcastPackets; ++j)
+        {
+            uint8_t expectedNumAttempt = 1;
+            const auto psduNum = ((j / maxNumMpdusInPsdu) + 1);
+            const auto packetInAmpdu = (maxNumMpdusInPsdu > 1) ? ((j % maxNumMpdusInPsdu) + 1) : 1;
+            if (psduNum > prevPsduNum)
+            {
+                prevExpectedNumAttempt = 1;
+                prevDropped = false;
+            }
+            prevPsduNum = psduNum;
+            for (auto& mpduToCorruptPerPsdu : m_params.mpdusToCorruptPerPsdu)
+            {
+                if (mpduToCorruptPerPsdu.first <= ((psduNum - 1) * (1 + numRetries)))
+                {
+                    continue;
+                }
+                if (mpduToCorruptPerPsdu.first > (psduNum * (1 + numRetries)))
+                {
+                    continue;
+                }
+                if (((GetNumGcrStas(m_params.stas) > 0) && GetNumNonHtStas(m_params.stas) > 0) &&
+                    (numRetries == 0) &&
+                    (mpduToCorruptPerPsdu.first % m_gcrUrParams.nGcrRetries) != 1)
+                {
+                    continue;
+                }
+                const auto& corruptedMpdusForSta =
+                    (mpduToCorruptPerPsdu.second.count(0) != 0)
+                        ? mpduToCorruptPerPsdu.second.at(0)
+                        : ((mpduToCorruptPerPsdu.second.count(i + 1) != 0)
+                               ? mpduToCorruptPerPsdu.second.at(i + 1)
+                               : std::set<uint8_t>{});
+                if (corruptedMpdusForSta.count(packetInAmpdu) == 0)
+                {
+                    break;
+                }
+                if ((maxNumMpdusInPsdu == 1) ||
+                    ((corruptedMpdusForSta.size() == 2) && (packetInAmpdu == 2)))
+                {
+                    corruptedPsdus++;
+                }
+                expectedNumAttempt++;
+            }
+            if (const auto nMaxAttempts =
+                    m_params.stas.at(i).gcrCapable ? (m_gcrUrParams.nGcrRetries + 1) : 1;
+                (expectedNumAttempt > nMaxAttempts) ||
+                (m_params.expectedDroppedGroupcastMpdus.count(j + 1) != 0))
+            {
+                droppedPsdus++;
+                prevDropped = true;
+                continue;
+            }
+            expectedNumAttempt = (prevDropped && (psduNum < 2))
+                                     ? 1
+                                     : std::max(expectedNumAttempt, prevExpectedNumAttempt);
+            prevExpectedNumAttempt = expectedNumAttempt;
+            const std::size_t rxPsdus = (j - droppedPsdus);
+            NS_ASSERT(m_rxGroupcastPerSta.at(i).size() > rxPsdus);
+            NS_TEST_EXPECT_MSG_EQ(+m_rxGroupcastPerSta.at(i).at(rxPsdus),
+                                  +expectedNumAttempt,
+                                  "Packet has not been forwarded up at the expected TX attempt");
+        }
+        const std::size_t rxPackets = (m_params.numGroupcastPackets - droppedPsdus);
+        NS_TEST_EXPECT_MSG_EQ(+m_rxGroupcastPerSta.at(i).size(),
+                              rxPackets,
+                              "STA" + std::to_string(i + 1) +
+                                  " did not receive the expected number of groupcast packets");
+        NS_TEST_EXPECT_MSG_EQ(+m_phyRxPerSta.at(i),
+                              (expectedTxAttempts - corruptedPsdus),
+                              "STA" + std::to_string(i + 1) +
+                                  " did not receive the expected number of retransmissions");
+    }
+}
+
+GcrBaTest::GcrBaTest(const std::string& testName,
+                     const GcrParameters& commonParams,
+                     const GcrBaParameters& gcrBaParams)
+    : GcrTestBase(testName, commonParams),
+      m_gcrBaParams{gcrBaParams},
+      m_nTxGcrBar{0},
+      m_nTxGcrBlockAck{0},
+      m_nTxBlockAck{0},
+      m_firstTxSeq{0},
+      m_lastTxSeq{-1},
+      m_nTxGcrBarsInCurrentTxop{0}
+{
+}
+
+void
+GcrBaTest::PacketGenerated(std::string context, Ptr<const Packet> p, const Address& addr)
+{
+    if (m_params.rtsFramesToCorrupt.empty() && m_params.ctsFramesToCorrupt.empty())
+    {
+        return;
+    }
+    GcrTestBase::PacketGenerated(context, p, addr);
+}
+
+void
+GcrBaTest::Transmit(std::string context,
+                    WifiConstPsduMap psduMap,
+                    WifiTxVector txVector,
+                    double txPowerW)
+{
+    auto psdu = psduMap.cbegin()->second;
+    auto mpdu = *psdu->begin();
+    const auto nodeId = ConvertContextToNodeId(context);
+    auto addr1 = mpdu->GetHeader().GetAddr1();
+    if (addr1.IsGroup() && !addr1.IsBroadcast() && mpdu->GetHeader().IsQosData())
+    {
+        NS_TEST_EXPECT_MSG_EQ(nodeId, 0, "Groupcast transmission from unexpected node");
+        NS_LOG_INFO("AP: groupcast transmission (#MPDUs=" << psdu->GetNMpdus() << ")");
+        const auto txopLimitAllowsAggregation =
+            (m_params.txopLimit.IsZero() || m_params.txopLimit > MicroSeconds(320));
+        const uint16_t prevTxMpdus = m_totalTx * m_expectedMaxNumMpdusInPsdu;
+        const uint16_t remainingMpdus = m_params.numGroupcastPackets - prevTxMpdus;
+        const auto expectedNumAggregates =
+            (GetNumNonHtStas(m_params.stas) == 0) && txopLimitAllowsAggregation
+                ? (((m_totalTx == 0) || m_params.mpdusToCorruptPerPsdu.empty() ||
+                    (!m_params.mpdusToCorruptPerPsdu.empty() &&
+                     m_params.mpdusToCorruptPerPsdu.cbegin()->second.size() > 1))
+                       ? ((m_params.mpdusToCorruptPerPsdu.empty() &&
+                           (GetNumNonGcrStas(m_params.stas) == 0))
+                              ? std::min(m_expectedMaxNumMpdusInPsdu, remainingMpdus)
+                              : m_expectedMaxNumMpdusInPsdu)
+                       : ((!m_params.expectedDroppedGroupcastMpdus.empty() &&
+                           m_totalTx <= m_expectedMaxNumMpdusInPsdu)
+                              ? m_expectedMaxNumMpdusInPsdu
+                              : m_params.mpdusToCorruptPerPsdu.cbegin()
+                                    ->second.cbegin()
+                                    ->second.size()))
+                : 1;
+        NS_TEST_EXPECT_MSG_EQ(psdu->GetNMpdus(),
+                              expectedNumAggregates,
+                              "Incorrect number of aggregated MPDUs");
+        const uint16_t maxLastSeqNum = (((m_totalTx + 1) * m_expectedMaxNumMpdusInPsdu) - 1);
+        const uint16_t limitLastSeqNum = (m_params.numGroupcastPackets - 1);
+        uint16_t expectedLastSeqNum =
+            (m_expectGcrUsed && (GetNumNonHtStas(m_params.stas) > 0))
+                ? (m_totalTx / 2)
+                : (((GetNumNonHtStas(m_params.stas) == 0) && txopLimitAllowsAggregation)
+                       ? std::min(maxLastSeqNum, limitLastSeqNum)
+                       : m_totalTx);
+        for (std::size_t i = 0; i < psdu->GetNMpdus(); ++i)
+        {
+            const auto isNewTx = (m_lastTxSeq < psdu->GetHeader(i).GetSequenceNumber());
+            NS_TEST_EXPECT_MSG_EQ(
+                psdu->GetHeader(i).IsRetry(),
+                !isNewTx,
+                "retry flag should not be set for the first groupcast transmission");
+        }
+        if (m_expectGcrUsed)
+        {
+            auto expectedStartSeq = std::min_element(m_rxGroupcastPerSta.cbegin(),
+                                                     m_rxGroupcastPerSta.cend(),
+                                                     [](const auto& v1, const auto& v2) {
+                                                         return v1.size() < v2.size();
+                                                     })
+                                        ->size();
+            if (psdu->GetHeader(0).IsRetry() && GetNumNonGcrStas(m_params.stas) > 0)
+            {
+                expectedStartSeq -= psdu->GetNMpdus();
+            }
+            m_firstTxSeq = psdu->GetHeader(0).GetSequenceNumber();
+            NS_TEST_EXPECT_MSG_EQ(m_firstTxSeq,
+                                  expectedStartSeq,
+                                  "Incorrect starting sequence number");
+            m_lastTxSeq = psdu->GetHeader(psdu->GetNMpdus() - 1).GetSequenceNumber();
+            if (m_totalTx > 0)
+            {
+                if (!m_params.mpdusToCorruptPerPsdu.empty())
+                {
+                    expectedLastSeqNum = 0;
+                    for (const auto& mpduNumToCorruptPerSta :
+                         m_params.mpdusToCorruptPerPsdu.cbegin()->second)
+                    {
+                        for (const auto mpduNumToCorrupt : mpduNumToCorruptPerSta.second)
+                        {
+                            const uint16_t mpduSeqNum = mpduNumToCorrupt - 1;
+                            expectedLastSeqNum = std::max(mpduSeqNum, expectedLastSeqNum);
+                        }
+                    }
+                    if (!m_params.expectedDroppedGroupcastMpdus.empty() &&
+                        m_totalTx <= m_expectedMaxNumMpdusInPsdu)
+                    {
+                        expectedLastSeqNum += m_totalTx;
+                    }
+                }
+            }
+            NS_TEST_EXPECT_MSG_EQ(m_lastTxSeq,
+                                  expectedLastSeqNum,
+                                  "Incorrect last sequence number");
+        }
+    }
+    else if (!mpdu->GetHeader().GetAddr1().IsBroadcast() && mpdu->GetHeader().IsQosData())
+    {
+        NS_TEST_EXPECT_MSG_EQ(nodeId, 0, "Unicast transmission from unexpected node");
+        NS_LOG_INFO("AP: unicast transmission (#MPDUs=" << psdu->GetNMpdus() << ")");
+    }
+    else if (mpdu->GetHeader().IsBlockAckReq())
+    {
+        CtrlBAckRequestHeader blockAckReq;
+        mpdu->GetPacket()->PeekHeader(blockAckReq);
+        NS_TEST_EXPECT_MSG_EQ(nodeId, 0, "Groupcast transmission from unexpected node");
+        uint8_t staId = 0;
+        uint8_t numStas = m_params.stas.size();
+        for (uint8_t i = 0; i < numStas; ++i)
+        {
+            if (mpdu->GetHeader().GetAddr1() == m_stasWifiMac.at(i)->GetAddress())
+            {
+                staId = i + 1;
+                break;
+            }
+        }
+        NS_ASSERT(staId != 0);
+        NS_LOG_INFO("AP: send " << (blockAckReq.IsGcr() ? "GCR " : "") << "BAR to STA " << +staId);
+        m_nTxGcrBar++;
+        m_nTxGcrBarsInCurrentTxop++;
+        const auto expectedGcr =
+            m_expectGcrUsed && ((m_params.numUnicastPackets == 0) ||
+                                ((m_params.startUnicast < m_params.startGroupcast) &&
+                                 (Simulator::Now() > m_params.startGroupcast)) ||
+                                ((m_params.startGroupcast < m_params.startUnicast) &&
+                                 (Simulator::Now() < m_params.startUnicast)));
+        NS_ASSERT(blockAckReq.IsGcr() == expectedGcr);
+        NS_TEST_EXPECT_MSG_EQ(blockAckReq.IsGcr(),
+                              expectedGcr,
+                              "Expected GCR Block Ack request type sent to STA " << +staId);
+        if (blockAckReq.IsGcr())
+        {
+            const auto expectedStartingSequence =
+                ((!m_params.mpdusToCorruptPerPsdu.empty() &&
+                  !m_params.expectedDroppedGroupcastMpdus.empty() &&
+                  m_nTxGcrBar > m_params.mpdusToCorruptPerPsdu.size())
+                     ? m_params.numGroupcastPackets
+                     : m_firstTxSeq);
+            NS_ASSERT(blockAckReq.GetStartingSequence() == expectedStartingSequence);
+            NS_TEST_EXPECT_MSG_EQ(
+                blockAckReq.GetStartingSequence(),
+                expectedStartingSequence,
+                "Incorrect starting sequence in GCR Block Ack request sent to STA " << +staId);
+            bool isBarRetry = (m_gcrBaParams.barsToCorrupt.count(m_nTxGcrBar - 1) != 0) ||
+                              (m_gcrBaParams.blockAcksToCorrupt.count(m_nTxGcrBlockAck) != 0);
+            NS_TEST_EXPECT_MSG_EQ(mpdu->GetHeader().IsRetry(),
+                                  isBarRetry,
+                                  "Incorrect retry flag set for GCR Block Ack Request");
+            if (const auto it = m_gcrBaParams.barsToCorrupt.find(m_nTxGcrBar);
+                it != m_gcrBaParams.barsToCorrupt.cend())
+            {
+                NS_LOG_INFO("Corrupt BAR #" << +m_nTxGcrBar);
+                const auto uid = mpdu->GetPacket()->GetUid();
+                for (auto& errorModel : m_errorModels)
+                {
+                    errorModel->SetList({uid});
+                }
+            }
+            else
+            {
+                NS_LOG_INFO("Do not corrupt BAR #" << +m_nTxGcrBar);
+                for (auto& errorModel : m_errorModels)
+                {
+                    errorModel->SetList({});
+                }
+            }
+        }
+    }
+    else if (mpdu->GetHeader().IsBlockAck())
+    {
+        CtrlBAckResponseHeader blockAck;
+        mpdu->GetPacket()->PeekHeader(blockAck);
+        NS_TEST_EXPECT_MSG_NE(nodeId, 0, "BlockAck transmission from unexpected node");
+        NS_LOG_INFO("STA" << nodeId << ": send " << (blockAck.IsGcr() ? "GCR " : "")
+                          << "Block ACK");
+        const auto expectedGcr = ((m_params.numUnicastPackets == 0) ||
+                                  ((m_params.startUnicast < m_params.startGroupcast) &&
+                                   (Simulator::Now() > m_params.startGroupcast)) ||
+                                  ((m_params.startGroupcast < m_params.startUnicast) &&
+                                   (Simulator::Now() < m_params.startUnicast)));
+        NS_TEST_EXPECT_MSG_EQ(blockAck.IsGcr(),
+                              expectedGcr,
+                              "Expected " << (expectedGcr ? "GCR " : "")
+                                          << "Block Ack type sent from STA " << nodeId);
+        if (expectedGcr)
+        {
+            m_nTxGcrBlockAck++;
+            const auto& corruptedMpdusForSta =
+                (m_params.mpdusToCorruptPerPsdu.empty() ||
+                 (m_params.mpdusToCorruptPerPsdu.size() < m_totalTx))
+                    ? std::set<uint8_t>{}
+                    : ((m_params.mpdusToCorruptPerPsdu.at(m_totalTx).count(0) != 0)
+                           ? m_params.mpdusToCorruptPerPsdu.at(m_totalTx).at(0)
+                           : ((m_params.mpdusToCorruptPerPsdu.at(m_totalTx).count(nodeId) != 0)
+                                  ? m_params.mpdusToCorruptPerPsdu.at(m_totalTx).at(nodeId)
+                                  : std::set<uint8_t>{}));
+            for (int seq = m_firstTxSeq; seq <= m_lastTxSeq; ++seq)
+            {
+                auto expectedReceived =
+                    (corruptedMpdusForSta.empty() || corruptedMpdusForSta.count(seq + 1) == 0);
+                NS_TEST_EXPECT_MSG_EQ(
+                    blockAck.IsPacketReceived(seq, 0),
+                    expectedReceived,
+                    "Incorrect bitmap filled in GCR Block Ack response sent from STA " << nodeId);
+            }
+        }
+        else
+        {
+            m_nTxBlockAck++;
+        }
+        if (blockAck.IsGcr())
+        {
+            if (m_gcrBaParams.blockAcksToCorrupt.count(m_nTxGcrBlockAck))
+            {
+                NS_LOG_INFO("Corrupt Block ACK #" << +m_nTxGcrBlockAck);
+                const auto uid = mpdu->GetPacket()->GetUid();
+                m_apErrorModel->SetList({uid});
+            }
+            else
+            {
+                NS_LOG_INFO("Do not corrupt Block ACK #" << +m_nTxGcrBlockAck);
+                m_apErrorModel->SetList({});
+            }
+        }
+    }
+    GcrTestBase::Transmit(context, psduMap, txVector, txPowerW);
+}
+
+void
+GcrBaTest::NotifyTxopTerminated(Time startTime, Time duration, uint8_t linkId)
+{
+    GcrTestBase::NotifyTxopTerminated(startTime, duration, linkId);
+    if (m_nTxGcrBarsInCurrentTxop > 0)
+    {
+        m_nTxGcrBarsPerTxop.push_back(m_nTxGcrBarsInCurrentTxop);
+    }
+    m_nTxGcrBarsInCurrentTxop = 0;
+}
+
+void
+GcrBaTest::Receive(std::string context, Ptr<const Packet> p, const Address& adr)
+{
+    const auto staId = ConvertContextToNodeId(context) - 1;
+    const auto socketAddress = PacketSocketAddress::ConvertFrom(adr);
+    if (socketAddress.GetProtocol() == MULTICAST_PROTOCOL)
+    {
+        NS_LOG_INFO("STA" << staId + 1 << ": multicast packet forwarded up");
+        const auto txopLimitAllowsAggregation =
+            (m_params.txopLimit.IsZero() || m_params.txopLimit > MicroSeconds(320));
+        m_rxGroupcastPerSta.at(staId).push_back(
+            (GetNumNonHtStas(m_params.stas) == 0) && txopLimitAllowsAggregation
+                ? (m_totalTx - (m_lastTxSeq / m_expectedMaxNumMpdusInPsdu))
+                : 1);
+    }
+    else if (socketAddress.GetProtocol() == UNICAST_PROTOCOL)
+    {
+        NS_LOG_INFO("STA" << staId + 1 << ": unicast packet forwarded up");
+        m_rxUnicastPerSta.at(staId)++;
+    }
+}
+
+void
+GcrBaTest::ConfigureGcrManager(WifiMacHelper& macHelper)
+{
+    macHelper.SetGcrManager("ns3::WifiDefaultGcrManager",
+                            "RetransmissionPolicy",
+                            StringValue("GCR_BA"),
+                            "GcrProtectionMode",
+                            EnumValue(m_params.gcrProtectionMode));
+}
+
+void
+GcrBaTest::CheckResults()
+{
+    GcrTestBase::CheckResults();
+
+    if (m_params.numUnicastPackets > 0)
+    {
+        NS_TEST_EXPECT_MSG_EQ(+m_nTxBlockAck,
+                              ((m_params.numUnicastPackets > 1) ? GetNumGcrStas(m_params.stas) : 0),
+                              "Incorrect number of transmitted BlockAck frames");
+    }
+
+    const auto txopLimitAllowsAggregation =
+        (m_params.txopLimit.IsZero() || m_params.txopLimit > MicroSeconds(320));
+    auto expectedTotalTx =
+        m_expectGcrUsed && txopLimitAllowsAggregation && (GetNumNonHtStas(m_params.stas) == 0)
+            ? m_params.mpdusToCorruptPerPsdu.empty()
+                  ? std::ceil(static_cast<double>(m_params.numGroupcastPackets -
+                                                  m_params.expectedDroppedGroupcastMpdus.size()) /
+                              m_expectedMaxNumMpdusInPsdu)
+                  : (std::ceil(static_cast<double>(m_params.numGroupcastPackets) /
+                               m_expectedMaxNumMpdusInPsdu) +
+                     std::ceil(static_cast<double>(m_params.mpdusToCorruptPerPsdu.size()) /
+                               m_expectedMaxNumMpdusInPsdu))
+            : m_params.numGroupcastPackets;
+
+    const uint8_t numExpectedBars =
+        m_expectGcrUsed
+            ? (m_params.mpdusToCorruptPerPsdu.empty()
+                   ? ((GetNumGcrStas(m_params.stas) * expectedTotalTx) +
+                      m_gcrBaParams.barsToCorrupt.size() + m_gcrBaParams.blockAcksToCorrupt.size())
+                   : ((GetNumGcrStas(m_params.stas) * expectedTotalTx) +
+                      m_gcrBaParams.barsToCorrupt.size() + m_gcrBaParams.blockAcksToCorrupt.size() +
+                      m_params.expectedDroppedGroupcastMpdus.size()))
+            : 0;
+    const uint8_t numExpectedBlockAcks =
+        m_expectGcrUsed ? (m_params.mpdusToCorruptPerPsdu.empty()
+                               ? ((GetNumGcrStas(m_params.stas) * expectedTotalTx) +
+                                  m_gcrBaParams.blockAcksToCorrupt.size())
+                               : ((GetNumGcrStas(m_params.stas) * expectedTotalTx) +
+                                  m_gcrBaParams.blockAcksToCorrupt.size() +
+                                  m_params.expectedDroppedGroupcastMpdus.size()))
+                        : 0;
+    uint8_t numNonConcealedTx = 0;
+    if (m_expectGcrUsed && (GetNumNonHtStas(m_params.stas) > 0))
+    {
+        numNonConcealedTx = expectedTotalTx;
+    }
+    else if (m_expectGcrUsed && (GetNumNonGcrStas(m_params.stas) > 0))
+    {
+        numNonConcealedTx = 1;
+    }
+    NS_TEST_EXPECT_MSG_EQ(+m_totalTx,
+                          expectedTotalTx + numNonConcealedTx,
+                          "Incorrect number of transmitted packets");
+    NS_TEST_EXPECT_MSG_EQ(+m_nTxGcrBar,
+                          +numExpectedBars,
+                          "Incorrect number of transmitted GCR BARs");
+    NS_TEST_EXPECT_MSG_EQ(+m_nTxGcrBlockAck,
+                          +numExpectedBlockAcks,
+                          "Incorrect number of transmitted GCR Block ACKs");
+
+    if (!m_gcrBaParams.expectedNTxBarsPerTxop.empty())
+    {
+        NS_TEST_EXPECT_MSG_EQ(m_nTxGcrBarsPerTxop.size(),
+                              m_gcrBaParams.expectedNTxBarsPerTxop.size(),
+                              "Incorrect number of TXOPs containing transmission of BAR frame(s)");
+        for (std::size_t i = 0; i < m_gcrBaParams.expectedNTxBarsPerTxop.size(); ++i)
+        {
+            NS_TEST_EXPECT_MSG_EQ(+m_nTxGcrBarsPerTxop.at(i),
+                                  +m_gcrBaParams.expectedNTxBarsPerTxop.at(i),
+                                  "Incorrect number of BAR(s) transmitted in TXOP");
+        }
+    }
+
+    uint8_t numStas = m_params.stas.size();
+    for (uint8_t i = 0; i < numStas; ++i)
+    {
+        // calculate the amount of corrupted PSDUs and the expected number of retransmission per
+        // MPDU
+        uint8_t prevExpectedNumAttempt = 1;
+        uint8_t prevPsduNum = 1;
+        uint8_t droppedPsdus = 0;
+        auto prevDropped = false;
+        for (uint16_t j = 0; j < m_params.numGroupcastPackets; ++j)
+        {
+            uint8_t expectedNumAttempt = 1;
+            const auto psduNum = ((j / m_params.maxNumMpdusInPsdu) + 1);
+            const auto packetInAmpdu =
+                (m_params.maxNumMpdusInPsdu > 1) ? ((j % m_params.maxNumMpdusInPsdu) + 1) : 1;
+            if (psduNum > prevPsduNum)
+            {
+                prevExpectedNumAttempt = 1;
+            }
+            prevPsduNum = psduNum;
+            for (auto& mpduToCorruptPerPsdu : m_params.mpdusToCorruptPerPsdu)
+            {
+                if (mpduToCorruptPerPsdu.first <= (psduNum - 1))
+                {
+                    continue;
+                }
+                const auto& corruptedMpdusForSta =
+                    (mpduToCorruptPerPsdu.second.count(0) != 0)
+                        ? mpduToCorruptPerPsdu.second.at(0)
+                        : ((mpduToCorruptPerPsdu.second.count(i + 1) != 0)
+                               ? mpduToCorruptPerPsdu.second.at(i + 1)
+                               : std::set<uint8_t>{});
+                if (corruptedMpdusForSta.count(packetInAmpdu) == 0)
+                {
+                    break;
+                }
+                expectedNumAttempt++;
+            }
+            if ((!m_expectGcrUsed && (expectedNumAttempt > 1)) ||
+                (m_params.expectedDroppedGroupcastMpdus.count(j + 1) != 0))
+            {
+                droppedPsdus++;
+                prevDropped = true;
+                continue;
+            }
+            expectedNumAttempt = (prevDropped && !m_params.mpdusToCorruptPerPsdu.empty())
+                                     ? m_params.mpdusToCorruptPerPsdu.size()
+                                     : std::max(expectedNumAttempt, prevExpectedNumAttempt);
+            prevExpectedNumAttempt = expectedNumAttempt;
+            const std::size_t rxPsdus = (j - droppedPsdus);
+            NS_TEST_EXPECT_MSG_EQ(+m_rxGroupcastPerSta.at(i).at(rxPsdus),
+                                  +expectedNumAttempt,
+                                  "Packet has not been forwarded up at the expected TX attempt");
+        }
+        const std::size_t rxPackets = (m_params.numGroupcastPackets - droppedPsdus);
+        NS_TEST_EXPECT_MSG_EQ(+m_rxGroupcastPerSta.at(i).size(),
+                              rxPackets,
+                              "STA" + std::to_string(i + 1) +
+                                  " did not receive the expected number of groupcast packets");
+    }
+
+    auto rsm = DynamicCast<IdealWifiManagerForGcrTest>(m_apWifiMac->GetWifiRemoteStationManager());
+    NS_ASSERT(rsm);
+    NS_TEST_EXPECT_MSG_EQ(rsm->m_blockAckSenders.size(),
+                          GetNumGcrStas(m_params.stas),
+                          "RSM have not received Block ACK from all members");
+}
+
+WifiGcrTestSuite::WifiGcrTestSuite()
+    : TestSuite("wifi-gcr", Type::UNIT)
+{
+    using StationsScenarios = std::vector<std::vector<GcrTestBase::StaInfo>>;
+
+    // GCR Unsolicited Retries
+    for (auto& [useAmpdu, ampduScenario] :
+         std::vector<std::pair<bool, std::string>>{{false, "A-MPDU disabled"},
+                                                   {true, "A-MPDU enabled"}})
+    {
+        for (auto& [rtsThreshold, gcrPotection, protectionName] :
+             std::vector<std::tuple<uint32_t, GroupcastProtectionMode, std::string>>{
+                 {maxRtsCtsThreshold, GroupcastProtectionMode::RTS_CTS, "no protection"},
+                 {500, GroupcastProtectionMode::RTS_CTS, "RTS-CTS"},
+                 {1500, GroupcastProtectionMode::CTS_TO_SELF, "CTS-TO-SELF"}})
+        {
+            for (const auto& stasInfo : StationsScenarios{
+                     {{{GCR_INCAPABLE_STA, WIFI_STANDARD_80211a}}},
+                     {{{GCR_CAPABLE_STA, WIFI_STANDARD_80211n, MHz_u{40}, 2, NanoSeconds(400)}}},
+                     {{{GCR_CAPABLE_STA, WIFI_STANDARD_80211ac}}},
+                     {{{GCR_CAPABLE_STA, WIFI_STANDARD_80211ax}}},
+                     {{{GCR_CAPABLE_STA, WIFI_STANDARD_80211be}}},
+                     {{{GCR_CAPABLE_STA, WIFI_STANDARD_80211ax, MHz_u{80}, 1, NanoSeconds(800)},
+                       {GCR_CAPABLE_STA, WIFI_STANDARD_80211be, MHz_u{80}, 1, NanoSeconds(3200)}}},
+                     {{{GCR_CAPABLE_STA, WIFI_STANDARD_80211n, MHz_u{20}, 1},
+                       {GCR_CAPABLE_STA, WIFI_STANDARD_80211ac, MHz_u{80}, 2},
+                       {GCR_CAPABLE_STA, WIFI_STANDARD_80211ax, MHz_u{160}, 3}}},
+                     {{{GCR_INCAPABLE_STA, WIFI_STANDARD_80211a},
+                       {GCR_CAPABLE_STA, WIFI_STANDARD_80211n}}},
+                     {{{GCR_INCAPABLE_STA, WIFI_STANDARD_80211n},
+                       {GCR_CAPABLE_STA, WIFI_STANDARD_80211n}}}})
+            {
+                const auto maxChannelWidth =
+                    std::max_element(stasInfo.cbegin(),
+                                     stasInfo.cend(),
+                                     [](const auto& lhs, const auto& rhs) {
+                                         return lhs.maxChannelWidth < rhs.maxChannelWidth;
+                                     })
+                        ->maxChannelWidth;
+                const auto useSpectrum =
+                    std::any_of(stasInfo.cbegin(),
+                                stasInfo.cend(),
+                                [maxChannelWidth](const auto& staInfo) {
+                                    return (staInfo.maxChannelWidth != maxChannelWidth);
+                                });
+                const std::string scenario = "STAs=" + printStasInfo(stasInfo) +
+                                             ", protection=" + protectionName + ", " +
+                                             ampduScenario;
+                AddTestCase(
+                    new GcrUrTest("GCR-UR without any lost frames: " + scenario,
+                                  {.stas = stasInfo,
+                                   .numGroupcastPackets = useAmpdu ? uint16_t(4) : uint16_t(2),
+                                   .maxNumMpdusInPsdu = useAmpdu ? uint16_t(2) : uint16_t(1),
+                                   .rtsThreshold = rtsThreshold,
+                                   .gcrProtectionMode = gcrPotection},
+                                  {}),
+                    useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
+                AddTestCase(
+                    new GcrUrTest("GCR-UR with first frame lost: " + scenario,
+                                  {.stas = stasInfo,
+                                   .numGroupcastPackets = useAmpdu ? uint16_t(4) : uint16_t(2),
+                                   .maxNumMpdusInPsdu = useAmpdu ? uint16_t(2) : uint16_t(1),
+                                   .rtsThreshold = rtsThreshold,
+                                   .gcrProtectionMode = gcrPotection,
+                                   // if no MPDU aggregation, MPDUs list is ignored
+                                   .mpdusToCorruptPerPsdu = {{1, {{0, {1, 2}}}}}},
+                                  {}),
+                    useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
+                AddTestCase(
+                    new GcrUrTest("GCR-UR with all but last frame lost: " + scenario,
+                                  {.stas = stasInfo,
+                                   .numGroupcastPackets = useAmpdu ? uint16_t(4) : uint16_t(2),
+                                   .maxNumMpdusInPsdu = useAmpdu ? uint16_t(2) : uint16_t(1),
+                                   .rtsThreshold = rtsThreshold,
+                                   .gcrProtectionMode = gcrPotection,
+                                   // if no MPDU aggregation, MPDUs list is ignored
+                                   .mpdusToCorruptPerPsdu = {{1, {{0, {1, 2}}}},
+                                                             {2, {{0, {1, 2}}}},
+                                                             {3, {{0, {1, 2}}}},
+                                                             {4, {{0, {1, 2}}}},
+                                                             {5, {{0, {1, 2}}}},
+                                                             {6, {{0, {1, 2}}}},
+                                                             {7, {{0, {1, 2}}}}}},
+                                  {}),
+                    useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
+                AddTestCase(
+                    new GcrUrTest("GCR-UR with all frames lost: " + scenario,
+                                  {.stas = stasInfo,
+                                   .numGroupcastPackets = useAmpdu ? uint16_t(4) : uint16_t(2),
+                                   .maxNumMpdusInPsdu = useAmpdu ? uint16_t(2) : uint16_t(1),
+                                   .rtsThreshold = rtsThreshold,
+                                   .gcrProtectionMode = gcrPotection,
+                                   // if no MPDU aggregation, MPDUs list is ignored
+                                   .mpdusToCorruptPerPsdu = {{1, {{0, {1, 2}}}},
+                                                             {2, {{0, {1, 2}}}},
+                                                             {3, {{0, {1, 2}}}},
+                                                             {4, {{0, {1, 2}}}},
+                                                             {5, {{0, {1, 2}}}},
+                                                             {6, {{0, {1, 2}}}},
+                                                             {7, {{0, {1, 2}}}},
+                                                             {8, {{0, {1, 2}}}}}},
+                                  {}),
+                    useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
+                if ((GetNumNonGcrStas(stasInfo) == 0) && useAmpdu)
+                {
+                    AddTestCase(
+                        new GcrUrTest("GCR-UR with 1 MPDU always corrupted in first A-MPDU but one "
+                                      "different MPDU alternatively, starting with second MPDU: " +
+                                          scenario,
+                                      {.stas = stasInfo,
+                                       .numGroupcastPackets = 4,
+                                       .maxNumMpdusInPsdu = 2,
+                                       .rtsThreshold = rtsThreshold,
+                                       .gcrProtectionMode = gcrPotection,
+                                       .mpdusToCorruptPerPsdu = {{1, {{0, {2}}}},
+                                                                 {2, {{0, {1}}}},
+                                                                 {3, {{0, {2}}}},
+                                                                 {4, {{0, {1}}}},
+                                                                 {5, {{0, {2}}}},
+                                                                 {6, {{0, {1}}}},
+                                                                 {7, {{0, {2}}}},
+                                                                 {8, {{0, {1}}}}}},
+                                      {}),
+                        useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
+                    AddTestCase(
+                        new GcrUrTest("GCR-UR with 1 MPDU always corrupted in first A-MPDU but one "
+                                      "different MPDU alternatively, starting with first MPDU: " +
+                                          scenario,
+                                      {.stas = stasInfo,
+                                       .numGroupcastPackets = 4,
+                                       .maxNumMpdusInPsdu = 2,
+                                       .rtsThreshold = rtsThreshold,
+                                       .gcrProtectionMode = gcrPotection,
+                                       .mpdusToCorruptPerPsdu = {{1, {{0, {1}}}},
+                                                                 {2, {{0, {2}}}},
+                                                                 {3, {{0, {1}}}},
+                                                                 {4, {{0, {2}}}},
+                                                                 {5, {{0, {1}}}},
+                                                                 {6, {{0, {2}}}},
+                                                                 {7, {{0, {1}}}},
+                                                                 {8, {{0, {2}}}}}},
+                                      {}),
+                        useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
+                    AddTestCase(
+                        new GcrUrTest("GCR-UR with all MPDUs always corrupted in first A-MPDU "
+                                      "except the first MPDU in the last retransmission: " +
+                                          scenario,
+                                      {.stas = stasInfo,
+                                       .numGroupcastPackets = 4,
+                                       .maxNumMpdusInPsdu = 2,
+                                       .rtsThreshold = rtsThreshold,
+                                       .gcrProtectionMode = gcrPotection,
+                                       .mpdusToCorruptPerPsdu = {{1, {{0, {1, 2}}}},
+                                                                 {2, {{0, {1, 2}}}},
+                                                                 {3, {{0, {1, 2}}}},
+                                                                 {4, {{0, {1, 2}}}},
+                                                                 {5, {{0, {1, 2}}}},
+                                                                 {6, {{0, {1, 2}}}},
+                                                                 {7, {{0, {1, 2}}}},
+                                                                 {8, {{0, {2}}}}}},
+                                      {}),
+                        useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
+                    AddTestCase(
+                        new GcrUrTest("GCR-UR with all MPDUs always corrupted in first A-MPDU "
+                                      "except the second MPDU in the last retransmission: " +
+                                          scenario,
+                                      {.stas = stasInfo,
+                                       .numGroupcastPackets = 4,
+                                       .maxNumMpdusInPsdu = 2,
+                                       .rtsThreshold = rtsThreshold,
+                                       .gcrProtectionMode = gcrPotection,
+                                       .mpdusToCorruptPerPsdu = {{1, {{0, {1, 2}}}},
+                                                                 {2, {{0, {1, 2}}}},
+                                                                 {3, {{0, {1, 2}}}},
+                                                                 {4, {{0, {1, 2}}}},
+                                                                 {5, {{0, {1, 2}}}},
+                                                                 {6, {{0, {1, 2}}}},
+                                                                 {7, {{0, {1, 2}}}},
+                                                                 {8, {{0, {1}}}}}},
+                                      {}),
+                        useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
+                    AddTestCase(
+                        new GcrUrTest("GCR-UR with all MPDUs always corrupted in first A-MPDU: " +
+                                          scenario,
+                                      {.stas = stasInfo,
+                                       .numGroupcastPackets = 4,
+                                       .maxNumMpdusInPsdu = 2,
+                                       .rtsThreshold = rtsThreshold,
+                                       .gcrProtectionMode = gcrPotection,
+                                       .mpdusToCorruptPerPsdu = {{1, {{0, {1, 2}}}},
+                                                                 {2, {{0, {1, 2}}}},
+                                                                 {3, {{0, {1, 2}}}},
+                                                                 {4, {{0, {1, 2}}}},
+                                                                 {5, {{0, {1, 2}}}},
+                                                                 {6, {{0, {1, 2}}}},
+                                                                 {7, {{0, {1, 2}}}},
+                                                                 {8, {{0, {1, 2}}}}}},
+                                      {}),
+                        useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
+                    AddTestCase(new GcrUrTest(
+                                    "GCR-UR with 1 MPDU always corrupted in second A-MPDU but one "
+                                    "different MPDU alternatively, starting with second MPDU: " +
+                                        scenario,
+                                    {.stas = stasInfo,
+                                     .numGroupcastPackets = 4,
+                                     .maxNumMpdusInPsdu = 2,
+                                     .rtsThreshold = rtsThreshold,
+                                     .gcrProtectionMode = gcrPotection,
+                                     .mpdusToCorruptPerPsdu = {{9, {{0, {2}}}},
+                                                               {10, {{0, {1}}}},
+                                                               {11, {{0, {2}}}},
+                                                               {12, {{0, {1}}}},
+                                                               {13, {{0, {2}}}},
+                                                               {14, {{0, {1}}}},
+                                                               {15, {{0, {2}}}},
+                                                               {16, {{0, {1}}}}}},
+                                    {}),
+                                useSpectrum ? TestCase::Duration::EXTENSIVE
+                                            : TestCase::Duration::QUICK);
+                    AddTestCase(new GcrUrTest(
+                                    "GCR-UR with 1 MPDU always corrupted in second A-MPDU but one "
+                                    "different MPDU alternatively, starting with first MPDU: " +
+                                        scenario,
+                                    {.stas = stasInfo,
+                                     .numGroupcastPackets = 4,
+                                     .maxNumMpdusInPsdu = 2,
+                                     .rtsThreshold = rtsThreshold,
+                                     .gcrProtectionMode = gcrPotection,
+                                     .mpdusToCorruptPerPsdu = {{9, {{0, {1}}}},
+                                                               {10, {{0, {2}}}},
+                                                               {11, {{0, {1}}}},
+                                                               {12, {{0, {2}}}},
+                                                               {13, {{0, {1}}}},
+                                                               {14, {{0, {2}}}},
+                                                               {15, {{0, {1}}}},
+                                                               {16, {{0, {2}}}}}},
+                                    {}),
+                                useSpectrum ? TestCase::Duration::EXTENSIVE
+                                            : TestCase::Duration::QUICK);
+                    AddTestCase(
+                        new GcrUrTest("GCR-UR with all MPDUs always corrupted in second A-MPDU "
+                                      "except the first MPDU in the last retransmission: " +
+                                          scenario,
+                                      {.stas = stasInfo,
+                                       .numGroupcastPackets = 4,
+                                       .maxNumMpdusInPsdu = 2,
+                                       .rtsThreshold = rtsThreshold,
+                                       .gcrProtectionMode = gcrPotection,
+                                       .mpdusToCorruptPerPsdu = {{9, {{0, {1, 2}}}},
+                                                                 {10, {{0, {1, 2}}}},
+                                                                 {11, {{0, {1, 2}}}},
+                                                                 {12, {{0, {1, 2}}}},
+                                                                 {13, {{0, {1, 2}}}},
+                                                                 {14, {{0, {1, 2}}}},
+                                                                 {15, {{0, {1, 2}}}},
+                                                                 {16, {{0, {2}}}}}},
+                                      {}),
+                        useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
+                    AddTestCase(
+                        new GcrUrTest("GCR-UR with all MPDUs always corrupted in second A-MPDU "
+                                      "except the second MPDU in the last retransmission: " +
+                                          scenario,
+                                      {.stas = stasInfo,
+                                       .numGroupcastPackets = 4,
+                                       .maxNumMpdusInPsdu = 2,
+                                       .rtsThreshold = rtsThreshold,
+                                       .gcrProtectionMode = gcrPotection,
+                                       .mpdusToCorruptPerPsdu = {{9, {{0, {1, 2}}}},
+                                                                 {10, {{0, {1, 2}}}},
+                                                                 {11, {{0, {1, 2}}}},
+                                                                 {12, {{0, {1, 2}}}},
+                                                                 {13, {{0, {1, 2}}}},
+                                                                 {14, {{0, {1, 2}}}},
+                                                                 {15, {{0, {1, 2}}}},
+                                                                 {16, {{0, {1}}}}}},
+                                      {}),
+                        useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
+                    AddTestCase(
+                        new GcrUrTest("GCR-UR with all MPDUs always corrupted in second A-MPDU: " +
+                                          scenario,
+                                      {.stas = stasInfo,
+                                       .numGroupcastPackets = 4,
+                                       .maxNumMpdusInPsdu = 2,
+                                       .rtsThreshold = rtsThreshold,
+                                       .gcrProtectionMode = gcrPotection,
+                                       .mpdusToCorruptPerPsdu = {{9, {{0, {1, 2}}}},
+                                                                 {10, {{0, {1, 2}}}},
+                                                                 {11, {{0, {1, 2}}}},
+                                                                 {12, {{0, {1, 2}}}},
+                                                                 {13, {{0, {1, 2}}}},
+                                                                 {14, {{0, {1, 2}}}},
+                                                                 {15, {{0, {1, 2}}}},
+                                                                 {16, {{0, {1, 2}}}}}},
+                                      {}),
+                        useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
+                }
+            }
+        }
+    }
+    AddTestCase(new GcrUrTest("GCR-UR with 4 skipped retries because of lifetime limit",
+                              {.stas = {{GCR_CAPABLE_STA, WIFI_STANDARD_80211n}},
+                               .numGroupcastPackets = 1,
+                               .maxNumMpdusInPsdu = 1,
+                               .maxLifetime = MilliSeconds(1),
+                               .rtsThreshold = maxRtsCtsThreshold},
+                              {.expectedSkippedRetries = 4}),
+                TestCase::Duration::QUICK);
+    AddTestCase(new GcrUrTest("GCR-UR with A-MPDU paused during test and number of packets larger "
+                              "than MPDU buffer size",
+                              {.stas = {{GCR_CAPABLE_STA, WIFI_STANDARD_80211n}},
+                               .numGroupcastPackets = 300,
+                               .maxNumMpdusInPsdu = 2,
+                               .startGroupcast = Seconds(1.0),
+                               .maxLifetime = MilliSeconds(500),
+                               .rtsThreshold = maxRtsCtsThreshold,
+                               .duration = Seconds(3.0)},
+                              {.packetsPauzeAggregation = 4, .packetsResumeAggregation = 100}),
+                TestCase::Duration::QUICK);
+    AddTestCase(new GcrUrTest("GCR-UR with buffer size limit to 64 MPDUs",
+                              {.stas = {{GCR_CAPABLE_STA, WIFI_STANDARD_80211n},
+                                        {GCR_CAPABLE_STA, WIFI_STANDARD_80211ac},
+                                        {GCR_CAPABLE_STA, WIFI_STANDARD_80211ax},
+                                        {GCR_CAPABLE_STA, WIFI_STANDARD_80211be}},
+                               .numGroupcastPackets = 300,
+                               .packetSize = 200,
+                               .maxNumMpdusInPsdu = 1024, // capped to 64 because not lowest is HT
+                               .rtsThreshold = maxRtsCtsThreshold},
+                              {}),
+                TestCase::Duration::QUICK);
+    AddTestCase(new GcrUrTest("GCR-UR with buffer size limit to 256 MPDUs",
+                              {.stas = {{GCR_CAPABLE_STA, WIFI_STANDARD_80211ax},
+                                        {GCR_CAPABLE_STA, WIFI_STANDARD_80211ax},
+                                        {GCR_CAPABLE_STA, WIFI_STANDARD_80211be},
+                                        {GCR_CAPABLE_STA, WIFI_STANDARD_80211be}},
+                               .numGroupcastPackets = 300,
+                               .packetSize = 200,
+                               .maxNumMpdusInPsdu = 1024, // capped to 256 because not lowest is HE
+                               .rtsThreshold = maxRtsCtsThreshold},
+                              {}),
+                TestCase::Duration::QUICK);
+    AddTestCase(new GcrUrTest("GCR-UR with buffer size limit to 1024 MPDUs",
+                              {.stas = {{GCR_CAPABLE_STA, WIFI_STANDARD_80211be, MHz_u{40}},
+                                        {GCR_CAPABLE_STA, WIFI_STANDARD_80211be, MHz_u{40}},
+                                        {GCR_CAPABLE_STA, WIFI_STANDARD_80211be, MHz_u{40}},
+                                        {GCR_CAPABLE_STA, WIFI_STANDARD_80211be, MHz_u{40}}},
+                               .numGroupcastPackets = 1200,
+                               .packetSize = 100,
+                               .maxNumMpdusInPsdu = 1024,
+                               .rtsThreshold = maxRtsCtsThreshold},
+                              {}),
+                TestCase::Duration::QUICK);
+    AddTestCase(new GcrUrTest("GCR-UR with corrupted RTS frames to verify previously assigned "
+                              "sequence numbers are properly released",
+                              {.stas = {{GCR_CAPABLE_STA, WIFI_STANDARD_80211n}},
+                               .numGroupcastPackets = 6,
+                               .packetSize = 500,
+                               .maxNumMpdusInPsdu = 2,
+                               .maxLifetime = MilliSeconds(
+                                   1), // reduce lifetime to make sure packets get dropped
+                               .rtsThreshold = 500,
+                               .rtsFramesToCorrupt = {3, 4, 5},
+                               .expectedDroppedGroupcastMpdus = {3, 4}},
+                              {.expectedSkippedRetries = 6}),
+                TestCase::Duration::QUICK);
+    AddTestCase(new GcrUrTest("GCR-UR with corrupted CTS frames to verify previously assigned "
+                              "sequence numbers are properly released",
+                              {.stas = {{GCR_CAPABLE_STA, WIFI_STANDARD_80211n}},
+                               .numGroupcastPackets = 6,
+                               .packetSize = 500,
+                               .maxNumMpdusInPsdu = 2,
+                               .maxLifetime = MilliSeconds(
+                                   1), // reduce lifetime to make sure packets get dropped
+                               .rtsThreshold = 500,
+                               .ctsFramesToCorrupt = {3, 4, 5},
+                               .expectedDroppedGroupcastMpdus = {3, 4}},
+                              {.expectedSkippedRetries = 6}),
+                TestCase::Duration::QUICK);
+    AddTestCase(new GcrUrTest("GCR-UR with reduced lifetime, A-MPDU paused during test and number "
+                              "of packets larger than MPDU buffer size",
+                              {.stas = {{GCR_CAPABLE_STA, WIFI_STANDARD_80211n}},
+                               .numGroupcastPackets = 300,
+                               .packetSize = 500,
+                               .maxNumMpdusInPsdu = 2,
+                               .maxLifetime = MilliSeconds(1),
+                               .rtsThreshold = maxRtsCtsThreshold,
+                               .duration = Seconds(4.0)},
+                              {.expectedSkippedRetries = 4,
+                               .packetsPauzeAggregation = 4,
+                               .packetsResumeAggregation = 100}),
+                TestCase::Duration::QUICK);
+
+    // GCR Block ACKs
+    for (auto& [groupcastPackets, groupcastStartTime, unicastPackets, unicastStartTime] :
+         std::vector<std::tuple<uint16_t, Time, uint16_t, Time>>{
+             {2, Seconds(1.0), 0, Seconds(0.0)},  // no unicast
+             {2, Seconds(0.5), 1, Seconds(1.0)},  // groupcast then unicast
+             {2, Seconds(1.0), 1, Seconds(0.5)}}) // unicast then groupcast
+    {
+        for (auto& [corruptedBars, corruptedBlockAcks] :
+             std::vector<std::pair<std::set<uint8_t>, std::set<uint8_t>>>{{{}, {}},
+                                                                          {{1}, {}},
+                                                                          {{}, {1}},
+                                                                          {{1}, {1}}})
+        {
+            for (auto& [rtsThreshold, gcrPotection, protectionName] :
+                 std::vector<std::tuple<uint32_t, GroupcastProtectionMode, std::string>>{
+                     {maxRtsCtsThreshold, GroupcastProtectionMode::RTS_CTS, "no protection"},
+                     {500, GroupcastProtectionMode::RTS_CTS, "RTS-CTS"},
+                     {1500, GroupcastProtectionMode::CTS_TO_SELF, "CTS-TO-SELF"}})
+            {
+                for (const auto& stasInfo : StationsScenarios{
+                         {{{GCR_INCAPABLE_STA, WIFI_STANDARD_80211a}}},
+                         {{{GCR_CAPABLE_STA,
+                            WIFI_STANDARD_80211n,
+                            MHz_u{40},
+                            2,
+                            NanoSeconds(400)}}},
+                         {{{GCR_CAPABLE_STA, WIFI_STANDARD_80211ac}}},
+                         {{{GCR_CAPABLE_STA, WIFI_STANDARD_80211ax}}},
+                         {{{GCR_CAPABLE_STA, WIFI_STANDARD_80211be}}},
+                         {{{GCR_CAPABLE_STA, WIFI_STANDARD_80211ax, MHz_u{80}, 1, NanoSeconds(800)},
+                           {GCR_CAPABLE_STA,
+                            WIFI_STANDARD_80211be,
+                            MHz_u{80},
+                            1,
+                            NanoSeconds(3200)}}},
+                         {{{GCR_CAPABLE_STA, WIFI_STANDARD_80211n, MHz_u{20}, 1},
+                           {GCR_CAPABLE_STA, WIFI_STANDARD_80211ac, MHz_u{80}, 2},
+                           {GCR_CAPABLE_STA, WIFI_STANDARD_80211ax, MHz_u{160}, 3}}},
+                         {{{GCR_INCAPABLE_STA, WIFI_STANDARD_80211a},
+                           {GCR_CAPABLE_STA, WIFI_STANDARD_80211n}}},
+                         {{{GCR_INCAPABLE_STA, WIFI_STANDARD_80211n},
+                           {GCR_CAPABLE_STA, WIFI_STANDARD_80211n}}}})
+                {
+                    const auto maxChannelWidth =
+                        std::max_element(stasInfo.cbegin(),
+                                         stasInfo.cend(),
+                                         [](const auto& lhs, const auto& rhs) {
+                                             return lhs.maxChannelWidth < rhs.maxChannelWidth;
+                                         })
+                            ->maxChannelWidth;
+                    const auto useSpectrum =
+                        std::any_of(stasInfo.cbegin(),
+                                    stasInfo.cend(),
+                                    [maxChannelWidth](const auto& staInfo) {
+                                        return (staInfo.maxChannelWidth != maxChannelWidth);
+                                    });
+                    std::string scenario =
+                        "STAs=" + printStasInfo(stasInfo) + ", protection=" + protectionName +
+                        ", corruptBARs=" + std::to_string(!corruptedBars.empty()) +
+                        ", corruptBACKs=" + std::to_string(!corruptedBlockAcks.empty());
+                    if (unicastPackets > 0)
+                    {
+                        scenario += ", mixedGroupcastUnicast";
+                        if (unicastStartTime > groupcastStartTime)
+                        {
+                            scenario += " (groupcast before unicast)";
+                        }
+                        else
+                        {
+                            scenario += " (unicast before groupcast)";
+                        }
+                    }
+                    AddTestCase(new GcrBaTest("GCR-BA without any corrupted MPDUs: " + scenario,
+                                              {.stas = stasInfo,
+                                               .numGroupcastPackets = groupcastPackets,
+                                               .numUnicastPackets = unicastPackets,
+                                               .maxNumMpdusInPsdu = 2,
+                                               .startGroupcast = groupcastStartTime,
+                                               .startUnicast = unicastStartTime,
+                                               .rtsThreshold = rtsThreshold,
+                                               .gcrProtectionMode = gcrPotection},
+                                              {corruptedBars, corruptedBlockAcks}),
+                                useSpectrum ? TestCase::Duration::EXTENSIVE
+                                            : TestCase::Duration::QUICK);
+                    if (GetNumNonGcrStas(stasInfo) == 0)
+                    {
+                        AddTestCase(new GcrBaTest("GCR-BA with second MPDU corrupted: " + scenario,
+                                                  {.stas = stasInfo,
+                                                   .numGroupcastPackets = groupcastPackets,
+                                                   .numUnicastPackets = unicastPackets,
+                                                   .maxNumMpdusInPsdu = 2,
+                                                   .startGroupcast = groupcastStartTime,
+                                                   .startUnicast = unicastStartTime,
+                                                   .rtsThreshold = rtsThreshold,
+                                                   .gcrProtectionMode = gcrPotection,
+                                                   .mpdusToCorruptPerPsdu = {{1, {{0, {2}}}}}},
+                                                  {corruptedBars, corruptedBlockAcks}),
+                                    useSpectrum ? TestCase::Duration::EXTENSIVE
+                                                : TestCase::Duration::QUICK);
+                        AddTestCase(new GcrBaTest("GCR-BA with first MPDU corrupted: " + scenario,
+                                                  {.stas = stasInfo,
+                                                   .numGroupcastPackets = groupcastPackets,
+                                                   .numUnicastPackets = unicastPackets,
+                                                   .maxNumMpdusInPsdu = 2,
+                                                   .startGroupcast = groupcastStartTime,
+                                                   .startUnicast = unicastStartTime,
+                                                   .rtsThreshold = rtsThreshold,
+                                                   .gcrProtectionMode = gcrPotection,
+                                                   .mpdusToCorruptPerPsdu = {{1, {{0, {1}}}}}},
+                                                  {corruptedBars, corruptedBlockAcks}),
+                                    useSpectrum ? TestCase::Duration::EXTENSIVE
+                                                : TestCase::Duration::QUICK);
+                        AddTestCase(new GcrBaTest("GCR-BA with both MPDUs corrupted: " + scenario,
+                                                  {.stas = stasInfo,
+                                                   .numGroupcastPackets = groupcastPackets,
+                                                   .numUnicastPackets = unicastPackets,
+                                                   .maxNumMpdusInPsdu = 2,
+                                                   .startGroupcast = groupcastStartTime,
+                                                   .startUnicast = unicastStartTime,
+                                                   .rtsThreshold = rtsThreshold,
+                                                   .gcrProtectionMode = gcrPotection,
+                                                   .mpdusToCorruptPerPsdu = {{1, {{0, {1, 2}}}}}},
+                                                  {corruptedBars, corruptedBlockAcks}),
+                                    useSpectrum ? TestCase::Duration::EXTENSIVE
+                                                : TestCase::Duration::QUICK);
+                        if (GetNumGcrStas(stasInfo) > 1)
+                        {
+                            AddTestCase(
+                                new GcrBaTest("GCR-BA with second MPDU corrupted for first STA: " +
+                                                  scenario,
+                                              {.stas = stasInfo,
+                                               .numGroupcastPackets = groupcastPackets,
+                                               .numUnicastPackets = unicastPackets,
+                                               .maxNumMpdusInPsdu = 2,
+                                               .startGroupcast = groupcastStartTime,
+                                               .startUnicast = unicastStartTime,
+                                               .rtsThreshold = rtsThreshold,
+                                               .gcrProtectionMode = gcrPotection,
+                                               .mpdusToCorruptPerPsdu = {{1, {{1, {2}}}}}},
+                                              {corruptedBars, corruptedBlockAcks}),
+                                useSpectrum ? TestCase::Duration::EXTENSIVE
+                                            : TestCase::Duration::QUICK);
+                            AddTestCase(
+                                new GcrBaTest("GCR-BA with first MPDU corrupted for first STA: " +
+                                                  scenario,
+                                              {.stas = stasInfo,
+                                               .numGroupcastPackets = groupcastPackets,
+                                               .numUnicastPackets = unicastPackets,
+                                               .maxNumMpdusInPsdu = 2,
+                                               .startGroupcast = groupcastStartTime,
+                                               .startUnicast = unicastStartTime,
+                                               .rtsThreshold = rtsThreshold,
+                                               .gcrProtectionMode = gcrPotection,
+                                               .mpdusToCorruptPerPsdu = {{1, {{1, {1}}}}}},
+                                              {corruptedBars, corruptedBlockAcks}),
+                                useSpectrum ? TestCase::Duration::EXTENSIVE
+                                            : TestCase::Duration::QUICK);
+                            AddTestCase(
+                                new GcrBaTest(
+                                    "GCR-BA with first different MPDUs corrupted for each STA: " +
+                                        scenario,
+                                    {.stas = stasInfo,
+                                     .numGroupcastPackets = groupcastPackets,
+                                     .numUnicastPackets = unicastPackets,
+                                     .maxNumMpdusInPsdu = 2,
+                                     .startGroupcast = groupcastStartTime,
+                                     .startUnicast = unicastStartTime,
+                                     .rtsThreshold = rtsThreshold,
+                                     .gcrProtectionMode = gcrPotection,
+                                     .mpdusToCorruptPerPsdu = {{1, {{1, {1}}, {2, {2}}}}}},
+                                    {corruptedBars, corruptedBlockAcks}),
+                                useSpectrum ? TestCase::Duration::EXTENSIVE
+                                            : TestCase::Duration::QUICK);
+                            AddTestCase(new GcrBaTest(
+                                            "GCR-BA with first different MPDUs corrupted for each "
+                                            "STA with different order: " +
+                                                scenario,
+                                            {.stas = stasInfo,
+                                             .numGroupcastPackets = groupcastPackets,
+                                             .numUnicastPackets = unicastPackets,
+                                             .maxNumMpdusInPsdu = 2,
+                                             .startGroupcast = groupcastStartTime,
+                                             .startUnicast = unicastStartTime,
+                                             .rtsThreshold = rtsThreshold,
+                                             .gcrProtectionMode = gcrPotection,
+                                             .mpdusToCorruptPerPsdu = {{1, {{1, {2}}, {2, {1}}}}}},
+                                            {corruptedBars, corruptedBlockAcks}),
+                                        useSpectrum ? TestCase::Duration::EXTENSIVE
+                                                    : TestCase::Duration::QUICK);
+                        }
+                    }
+                }
+            }
+        }
+        std::string scenario = "GCR-BA with dropped MPDU because of lifetime expiry";
+        if (unicastPackets > 0)
+        {
+            scenario += ", mixedGroupcastUnicast";
+            if (unicastStartTime > groupcastStartTime)
+            {
+                scenario += " (groupcast before unicast)";
+            }
+            else
+            {
+                scenario += " (unicast before groupcast)";
+            }
+        }
+        AddTestCase(
+            new GcrBaTest(scenario,
+                          {.stas = {{GCR_CAPABLE_STA, WIFI_STANDARD_80211n}},
+                           .numGroupcastPackets =
+                               uint16_t(groupcastPackets *
+                                        2), // consider more packets to verify TX window is advanced
+                           .numUnicastPackets = unicastPackets,
+                           .maxNumMpdusInPsdu = 2,
+                           .startGroupcast = groupcastStartTime,
+                           .startUnicast = unicastStartTime,
+                           .maxLifetime = MilliSeconds(2),
+                           .rtsThreshold = maxRtsCtsThreshold,
+                           .mpdusToCorruptPerPsdu =
+                               {{1, {{0, {2}}}}, {2, {{0, {2}}}}, {3, {{0, {2}}}}, {4, {{0, {2}}}}},
+                           .expectedDroppedGroupcastMpdus = {2}},
+                          {}),
+            TestCase::Duration::QUICK);
+        scenario = "";
+        if (unicastPackets > 0)
+        {
+            if (unicastStartTime > groupcastStartTime)
+            {
+                scenario += "Groupcast followed by unicast";
+            }
+            else
+            {
+                scenario += "Unicast followed by groupcast";
+            }
+        }
+        else
+        {
+            scenario += "GCR-BA";
+        }
+        scenario += " with ";
+        AddTestCase(new GcrBaTest(scenario + "ADDBA request corrupted",
+                                  {.stas = {{GCR_CAPABLE_STA, WIFI_STANDARD_80211n}},
+                                   .numGroupcastPackets = groupcastPackets,
+                                   .numUnicastPackets = unicastPackets,
+                                   .maxNumMpdusInPsdu = 2,
+                                   .startGroupcast = groupcastStartTime,
+                                   .startUnicast = unicastStartTime,
+                                   .rtsThreshold = maxRtsCtsThreshold,
+                                   .addbaReqsToCorrupt = {1}},
+                                  {}),
+                    TestCase::Duration::QUICK);
+        AddTestCase(new GcrBaTest(scenario + "ADDBA response corrupted",
+                                  {.stas = {{GCR_CAPABLE_STA, WIFI_STANDARD_80211n}},
+                                   .numGroupcastPackets = groupcastPackets,
+                                   .numUnicastPackets = unicastPackets,
+                                   .maxNumMpdusInPsdu = 2,
+                                   .startGroupcast = groupcastStartTime,
+                                   .startUnicast = unicastStartTime,
+                                   .rtsThreshold = maxRtsCtsThreshold,
+                                   .addbaRespsToCorrupt = {1}},
+                                  {}),
+                    TestCase::Duration::QUICK);
+        AddTestCase(new GcrBaTest(scenario + "ADDBA timeout",
+                                  {.stas = {{GCR_CAPABLE_STA, WIFI_STANDARD_80211n}},
+                                   .numGroupcastPackets = groupcastPackets,
+                                   .numUnicastPackets = unicastPackets,
+                                   .maxNumMpdusInPsdu = 2,
+                                   .startGroupcast = groupcastStartTime,
+                                   .startUnicast = unicastStartTime,
+                                   .rtsThreshold = maxRtsCtsThreshold,
+                                   .addbaReqsToCorrupt = {1, 2, 3, 4, 5, 6, 7, 8}},
+                                  {}),
+                    TestCase::Duration::QUICK);
+        AddTestCase(new GcrBaTest(scenario + "DELBA frames after timeout expires",
+                                  {.stas = {{GCR_CAPABLE_STA, WIFI_STANDARD_80211n}},
+                                   .numGroupcastPackets = groupcastPackets,
+                                   .numUnicastPackets = uint16_t(unicastPackets * 2),
+                                   .maxNumMpdusInPsdu = 2,
+                                   .startGroupcast = groupcastStartTime,
+                                   .startUnicast = unicastStartTime,
+                                   .rtsThreshold = maxRtsCtsThreshold,
+                                   .baInactivityTimeout = 10},
+                                  {}),
+                    TestCase::Duration::QUICK);
+    }
+    AddTestCase(new GcrBaTest(
+                    "GCR-BA with BARs sent over 2 TXOPs because of TXOP limit",
+                    {.stas = {{GCR_CAPABLE_STA, WIFI_STANDARD_80211n},
+                              {GCR_CAPABLE_STA, WIFI_STANDARD_80211ac},
+                              {GCR_CAPABLE_STA, WIFI_STANDARD_80211ax}},
+                     .numGroupcastPackets = 2,
+                     .maxNumMpdusInPsdu = 2,
+                     .maxLifetime = Seconds(1.0),
+                     .rtsThreshold = maxRtsCtsThreshold,
+                     .txopLimit = MicroSeconds(480)},
+                    {.expectedNTxBarsPerTxop = {1, 2}}), // 1 BAR in first TXOP, 2 BARs in next TXOP
+                TestCase::Duration::QUICK);
+    AddTestCase(new GcrBaTest("GCR-BA with TXOP limit not allowing aggregation",
+                              {.stas = {{GCR_CAPABLE_STA, WIFI_STANDARD_80211n},
+                                        {GCR_CAPABLE_STA, WIFI_STANDARD_80211ac},
+                                        {GCR_CAPABLE_STA, WIFI_STANDARD_80211ax}},
+                               .numGroupcastPackets = 2,
+                               .maxNumMpdusInPsdu = 2,
+                               .maxLifetime = Seconds(1.0),
+                               .rtsThreshold = maxRtsCtsThreshold,
+                               .txopLimit = MicroSeconds(320)},
+                              {.expectedNTxBarsPerTxop = {1, 2, 1, 2}}),
+                TestCase::Duration::QUICK);
+    AddTestCase(new GcrBaTest("GCR-BA with number of packets larger than MPDU buffer size",
+                              {.stas = {{GCR_CAPABLE_STA, WIFI_STANDARD_80211n}},
+                               .numGroupcastPackets = 300,
+                               .maxNumMpdusInPsdu = 2,
+                               .rtsThreshold = maxRtsCtsThreshold},
+                              {}),
+                TestCase::Duration::QUICK);
+    AddTestCase(new GcrBaTest("GCR-BA with buffer size limit to 64 MPDUs",
+                              {.stas = {{GCR_CAPABLE_STA, WIFI_STANDARD_80211n},
+                                        {GCR_CAPABLE_STA, WIFI_STANDARD_80211ac},
+                                        {GCR_CAPABLE_STA, WIFI_STANDARD_80211ax},
+                                        {GCR_CAPABLE_STA, WIFI_STANDARD_80211be}},
+                               .numGroupcastPackets = 300,
+                               .packetSize = 500,
+                               .maxNumMpdusInPsdu = 1024, // capped to 64 because not lowest is HT
+                               .rtsThreshold = maxRtsCtsThreshold},
+                              {}),
+                TestCase::Duration::QUICK);
+    AddTestCase(new GcrBaTest("GCR-BA with buffer size limit to 256 MPDUs",
+                              {.stas = {{GCR_CAPABLE_STA, WIFI_STANDARD_80211ax},
+                                        {GCR_CAPABLE_STA, WIFI_STANDARD_80211ax},
+                                        {GCR_CAPABLE_STA, WIFI_STANDARD_80211be},
+                                        {GCR_CAPABLE_STA, WIFI_STANDARD_80211be}},
+                               .numGroupcastPackets = 300,
+                               .packetSize = 150,
+                               .maxNumMpdusInPsdu = 1024, // capped to 256 because not lowest is HE
+                               .rtsThreshold = maxRtsCtsThreshold},
+                              {}),
+
+                TestCase::Duration::QUICK);
+    AddTestCase(new GcrBaTest("GCR-BA with buffer size limit to 1024 MPDUs",
+                              {.stas = {{GCR_CAPABLE_STA, WIFI_STANDARD_80211be, MHz_u{40}},
+                                        {GCR_CAPABLE_STA, WIFI_STANDARD_80211be, MHz_u{40}},
+                                        {GCR_CAPABLE_STA, WIFI_STANDARD_80211be, MHz_u{40}},
+                                        {GCR_CAPABLE_STA, WIFI_STANDARD_80211be, MHz_u{40}}},
+                               .numGroupcastPackets = 1200,
+                               .packetSize = 100,
+                               .maxNumMpdusInPsdu = 1024,
+                               .rtsThreshold = maxRtsCtsThreshold},
+                              {}),
+                TestCase::Duration::QUICK);
+    AddTestCase(new GcrBaTest("GCR-BA with corrupted RTS frames to verify previously assigned "
+                              "sequence numbers are properly released",
+                              {.stas = {{GCR_CAPABLE_STA, WIFI_STANDARD_80211n}},
+                               .numGroupcastPackets = 6,
+                               .packetSize = 500,
+                               .maxNumMpdusInPsdu = 2,
+                               .maxLifetime = MilliSeconds(
+                                   1), // reduce lifetime to make sure packets get dropped
+                               .rtsThreshold = 500,
+                               .rtsFramesToCorrupt = {2, 3, 4},
+                               .expectedDroppedGroupcastMpdus = {3, 4}},
+                              {}),
+                TestCase::Duration::QUICK);
+    AddTestCase(new GcrBaTest("GCR-BA with corrupted CTS frames to verify previously assigned "
+                              "sequence numbers are properly released",
+                              {.stas = {{GCR_CAPABLE_STA, WIFI_STANDARD_80211n}},
+                               .numGroupcastPackets = 6,
+                               .packetSize = 500,
+                               .maxNumMpdusInPsdu = 2,
+                               .maxLifetime = MilliSeconds(
+                                   1), // reduce lifetime to make sure packets get dropped
+                               .rtsThreshold = 500,
+                               .ctsFramesToCorrupt = {2, 3, 4},
+                               .expectedDroppedGroupcastMpdus = {3, 4}},
+                              {}),
+                TestCase::Duration::QUICK);
+}
+
+static WifiGcrTestSuite g_wifiGcrTestSuite; ///< the test suite
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/test/wifi-gcr-test.h ns-3.44/src/wifi/test/wifi-gcr-test.h
--- ns-3.43/src/wifi/test/wifi-gcr-test.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/wifi/test/wifi-gcr-test.h	2025-03-09 16:55:49.807372600 -0700
@@ -0,0 +1,395 @@
+/*
+ * Copyright (c) 2023 DERONNE SOFTWARE ENGINEERING
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+#ifndef WIFI_GCR_TEST_H
+#define WIFI_GCR_TEST_H
+
+#include "ns3/ap-wifi-mac.h"
+#include "ns3/error-model.h"
+#include "ns3/ht-phy.h"
+#include "ns3/packet-socket-client.h"
+#include "ns3/sta-wifi-mac.h"
+#include "ns3/test.h"
+#include "ns3/wifi-default-gcr-manager.h"
+#include "ns3/wifi-mac-helper.h"
+
+#include <map>
+#include <optional>
+#include <set>
+#include <string>
+#include <vector>
+
+using namespace ns3;
+
+/**
+ * @ingroup wifi-test
+ * @ingroup tests
+ *
+ * @brief Base class for GCR tests
+ *
+ * It considers an AP and multiple STAs (with different capabilities) using either GCR-UR or GCR-BA.
+ * The AP generates either multicast packets only or alternatively multicast and unicast packets.
+ *
+ * The test eventually corrupts some MPDUs based on a provided list of groupcast MPDUs in a given
+ * PSDU (indices are starting from 1) that should not be successfully received by a given STA or by
+ * all STA (s). It may also corrupts specific frames, such as RTS/CTS or action frames that are used
+ * to establish or teardown Block Ack agreements. The latter is needed is needed for GCR-BA or for
+ * GCR-UR when A-MPDU is used.
+ *
+ * It is checked that:
+ *
+ * - When no GCR-capable STA is present, GCR service is not used
+ * - When the GCR service is used, groupcast frames are transmitted using HT, VHT or HE modulation
+ * class, depending on the supported modulations by member STAs
+ * - When the GCR is used, groupcast MPDUs carry an A-MSDU made of a single A-MSDU subframe,
+ * regardless of the A-MSDU size settings
+ * - When the GCR service is used, the expected protection mechanism is being used prior to the
+ * transmission of the groupcast packet
+ * - When the GCR service is used and RTS/CTS protection is selected, the receiver address of RTS
+ * frames corresponds to the MAC address of one of the STA of the group
+ * - When GCR-BA or GCR-UR with agreement is used, the expected amount of ADDBA request and response
+ * frames has been received and they all contain the GCR group address
+ * - when Block Ack agreement timeout is used, the expected amount of DELBA frames has been received
+ * and they all contain the GCR group address
+ * - The expected buffer size is being selected for the GCR Block Ack agreement, depending on what
+ * is supported by each member
+ */
+class GcrTestBase : public TestCase
+{
+  public:
+    /// Information about GCR STAs
+    struct StaInfo
+    {
+        bool gcrCapable{false};                           ///< flag whether the STA is GCR capable
+        WifiStandard standard{WIFI_STANDARD_UNSPECIFIED}; ///< standard configured for the STA
+        MHz_u maxChannelWidth{20};    ///< maximum channel width supported by the STA
+        uint8_t maxNumStreams{1};     ///< maximum number of spatial streams supported by the STA
+        Time minGi{NanoSeconds(800)}; ///< minimum guard interval duration supported by the STA
+    };
+
+    /// Common parameters for GCR tests
+    struct GcrParameters
+    {
+        std::vector<StaInfo> stas{};         ///< information about STAs
+        uint16_t numGroupcastPackets{0};     ///< number of groupcast packets to generate
+        uint16_t numUnicastPackets{0};       ///< number of unicast packets to generate
+        uint32_t packetSize{1000};           ///< the size in bytes of the packets to generate
+        uint16_t maxNumMpdusInPsdu{0};       ///< maximum number of MPDUs in PSDUs
+        Time startGroupcast{Seconds(1.0)};   ///< time to start groupcast packets generation
+        Time startUnicast{};                 ///< time to start unicast packets generation
+        Time maxLifetime{MilliSeconds(500)}; ///< the maximum MSDU lifetime
+        uint32_t rtsThreshold{};             ///< the RTS threshold in bytes
+        GroupcastProtectionMode gcrProtectionMode{
+            GroupcastProtectionMode::RTS_CTS}; ///< the protection mode to use
+        std::map<uint8_t, std::map<uint8_t, std::set<uint8_t>>>
+            mpdusToCorruptPerPsdu{}; ///< list of MPDUs (starting from 1) to corrupt per PSDU
+                                     ///< (starting from 1)
+        std::set<uint8_t> rtsFramesToCorrupt{}; ///< list of RTS frames (starting from 1) to corrupt
+        std::set<uint8_t> ctsFramesToCorrupt{}; ///< list of CTS frames (starting from 1) to corrupt
+        std::set<uint8_t>
+            addbaReqsToCorrupt{}; ///< list of GCR ADDBA requests (starting from 1) to corrupt
+        std::set<uint8_t>
+            addbaRespsToCorrupt{}; ///< list of GCR ADDBA responses (starting from 1) to corrupt
+        std::set<uint8_t> expectedDroppedGroupcastMpdus{}; ///< list of groupcast MPDUs that are
+                                                           ///< expected to be dropped because of
+                                                           ///< lifetime expiry (starting from 1)
+        uint16_t baInactivityTimeout{0}; ///< max time (blocks of 1024 microseconds) allowed for
+                                         ///< block ack inactivity
+        Time txopLimit{};                ///< the TXOP limit duration
+        Time duration{
+            Seconds(2)}; ///< the duration of the simulation for the test run (2 seconds by default)
+    };
+
+    /**
+     * Constructor
+     *
+     * @param testName the name of the test
+     * @param params the common GCR parameters for the test to run
+     */
+    GcrTestBase(const std::string& testName, const GcrParameters& params);
+    ~GcrTestBase() override = default;
+
+  protected:
+    void DoSetup() override;
+    void DoRun() override;
+
+    /**
+     * Check results at the end of the test run.
+     */
+    virtual void CheckResults();
+
+    /**
+     * Configure the GCR manager for the test.
+     *
+     * @param macHelper the wifi mac helper
+     */
+    virtual void ConfigureGcrManager(WifiMacHelper& macHelper) = 0;
+
+    /**
+     * Callback invoked when a packet is generated by the packet socket client.
+     *
+     * @param context the context
+     * @param p the packet
+     * @param adr the address
+     */
+    virtual void PacketGenerated(std::string context, Ptr<const Packet> p, const Address& adr);
+
+    /**
+     * Callback invoked when a FEM passes PSDUs to the PHY.
+     *
+     * @param context the context
+     * @param psduMap the PSDU map
+     * @param txVector the TX vector
+     * @param txPowerW the tx power in Watts
+     */
+    virtual void Transmit(std::string context,
+                          WifiConstPsduMap psduMap,
+                          WifiTxVector txVector,
+                          double txPowerW);
+
+    /**
+     * Callback invoked when a packet is successfully received by the PHY.
+     *
+     * @param context the context
+     * @param p the packet
+     * @param snr the SNR (in linear scale)
+     * @param mode the WiFi mode
+     * @param preamble the preamble
+     */
+    virtual void PhyRx(std::string context,
+                       Ptr<const Packet> p,
+                       double snr,
+                       WifiMode mode,
+                       WifiPreamble preamble);
+
+    /**
+     * Callback invoked when packet is received by the packet socket server.
+     *
+     * @param context the context
+     * @param p the packet
+     * @param adr the address
+     */
+    virtual void Receive(std::string context, Ptr<const Packet> p, const Address& adr) = 0;
+
+    /**
+     * Callback invoked when a TXOP is terminated.
+     *
+     * @param startTime the time TXOP started
+     * @param duration the duration of the TXOP
+     * @param linkId the ID of the link that gained TXOP
+     */
+    virtual void NotifyTxopTerminated(Time startTime, Time duration, uint8_t linkId);
+
+    /**
+     * Function to indicate whether A-MPDU or S-MPDU is currently being used.
+     *
+     * @return true if A-MPDU or S-MPDU is currently being used, false otherwise
+     */
+    virtual bool IsUsingAmpduOrSmpdu() const;
+
+    std::string m_testName; ///< name of the test
+    GcrParameters m_params; ///< parameters for the test to run
+    bool m_expectGcrUsed;   ///< flag whether GCR is expected to be used during the test
+    uint16_t m_expectedMaxNumMpdusInPsdu; ///< expected maximum number of MPDUs in PSDUs
+
+    Ptr<ApWifiMac> m_apWifiMac;                 ///< AP wifi MAC
+    std::vector<Ptr<StaWifiMac>> m_stasWifiMac; ///< STAs wifi MAC
+    Ptr<ListErrorModel> m_apErrorModel; ///< error rate model to corrupt frames sent to the AP
+    std::vector<Ptr<ListErrorModel>>
+        m_errorModels;                         ///< error rate models to corrupt packets (per STA)
+    Ptr<PacketSocketClient> m_groupcastClient; ///< the packet socket client
+
+    uint16_t m_packets; ///< Number of generated groupcast packets by the application
+    std::vector<uint16_t>
+        m_phyRxPerSta;  ///< count number of PSDUs successfully received by PHY of each STA
+    uint8_t m_nTxApRts; ///< number of RTS frames sent by the AP
+    uint8_t m_nTxApCts; ///< number of CTS-to-self frames sent by the AP
+    std::vector<uint8_t> m_txCtsPerSta; ///< count number of CTS responses frames sent by each STA
+    uint8_t m_totalTx;                  ///< total number of groupcast frames transmitted by the AP
+    std::vector<std::vector<uint16_t>>
+        m_rxGroupcastPerSta; ///< count groupcast packets received by the packet socket server of
+                             ///< each STA and store TX attempt number for each received packet
+    std::vector<uint16_t> m_rxUnicastPerSta; ///< count unicast packets received by the packet
+                                             ///< socket server of each STA
+
+    uint8_t m_nTxGroupcastInCurrentTxop; ///< number of groupcast frames transmitted by the AP
+                                         ///< (including retries) in the current TXOP
+    uint8_t
+        m_nTxRtsInCurrentTxop; ///< number of RTS frames transmitted by the AP in the current TXOP
+    uint8_t m_nTxCtsInCurrentTxop; ///< number of CTS-to-self frames transmitted by the AP in the
+                                   ///< current TXOP
+
+    uint8_t m_nTxAddbaReq;     ///< number of transmitted ADDBA Request frames
+    uint8_t m_nTxAddbaResp;    ///< number of transmitted ADDBA Response frames
+    uint8_t m_nTxDelba;        ///< number of transmitted DELBA frames
+    uint8_t m_nTxGcrAddbaReq;  ///< number of transmitted GCR ADDBA Request frames
+    uint8_t m_nTxGcrAddbaResp; ///< number of transmitted GCR ADDBA Response frames
+    uint8_t m_nTxGcrDelba;     ///< number of transmitted GCR DELBA frames
+};
+
+/**
+ * @ingroup wifi-test
+ * @ingroup tests
+ *
+ * @brief Test the implementation of GCR-UR.
+ *
+ * GCR-UR tests consider an AP and multiple STAs (with different capabilities) using GCR-UR with up
+ * to 7 retries. Besides what is verified in the base class, it is checked that:
+ *
+ * - When the GCR-UR service is used, each groupcast packet is retransmitted 7 times, in different
+ * TXOPs
+ * - When the GCR-UR service is used, all retransmissions of an MPDU have the Retry field in their
+ * Frame Control fields set to 1
+ * - When the GCR-UR service is used, either the initial packet or one of its retransmission is
+ * successfully received, unless all packets are corrupted
+ * - When the GCR-UR service is used and MPDU aggregation is enabled, it is checked each STA
+ * receives the expected amount of MPDUs
+ * - When the GCR-UR service is used and MPDU aggregation is enabled, it is checked received MPDUs
+ * are forwarded up in the expected order and the recipient window is correctly flushed
+ */
+class GcrUrTest : public GcrTestBase
+{
+  public:
+    /// Parameters for GCR-UR tests
+    struct GcrUrParameters
+    {
+        uint8_t nGcrRetries{7}; ///< number of solicited retries to use for GCR-UR
+        uint8_t expectedSkippedRetries{
+            0}; ///< the number of skipped retries because of lifetime expiry
+        std::optional<uint16_t>
+            packetsPauzeAggregation{}; ///< the amount of generated packets after which MPDU
+                                       ///< aggregation should not be used by limiting the queue to
+                                       ///< a single packet. If not specified, MPDU aggregation is
+                                       ///< not paused
+        std::optional<uint16_t>
+            packetsResumeAggregation{}; ///< the amount of generated packets after which MPDU
+                                        ///< aggregation should be used again by refilling the queue
+                                        ///< with more packets. If not specified, MPDU aggregation
+                                        ///< is not resumed
+    };
+
+    /**
+     * Constructor
+     *
+     * @param testName the name of the test
+     * @param commonParams the common GCR parameters for the test to run
+     * @param gcrUrParams the GCR-UR parameters for the test to run
+     */
+    GcrUrTest(const std::string& testName,
+              const GcrParameters& commonParams,
+              const GcrUrParameters& gcrUrParams);
+    ~GcrUrTest() override = default;
+
+  private:
+    void ConfigureGcrManager(WifiMacHelper& macHelper) override;
+    void CheckResults() override;
+    void PacketGenerated(std::string context, Ptr<const Packet> p, const Address& adr) override;
+    void Transmit(std::string context,
+                  WifiConstPsduMap psduMap,
+                  WifiTxVector txVector,
+                  double txPowerW) override;
+    void Receive(std::string context, Ptr<const Packet> p, const Address& adr) override;
+    bool IsUsingAmpduOrSmpdu() const override;
+
+    GcrUrParameters m_gcrUrParams; ///< GCR-UR parameters for the test to run
+
+    std::vector<uint8_t>
+        m_totalTxGroupcasts; ///< total number of groupcast frames transmitted by the AP
+                             ///< (including retries) per original groupcast frame
+
+    Ptr<WifiMpdu> m_currentMpdu; ///< current MPDU
+    uint64_t m_currentUid;       ///< current UID
+};
+
+/**
+ * @ingroup wifi-test
+ * @ingroup tests
+ *
+ * @brief Test the implementation of GCR Block Ack.
+ *
+ * GCR-BA tests consider an AP and multiple STAs (with different capabilities) using GCR-BA.
+ * During tests, besides frames that can be corrupted by the base class, transmitted MPDUs
+ * can be corrupted, either for all STAs or for a particular STA. These tests eventually corrupt
+ * Block Ack Requests and Block Acks frames.
+ *
+ * Besides what is verified in the base class, it is checked that:
+ * - The expected amount of packets has been forwarded up to upper layer
+ * - When the GCR-BA service is used, the expected amount of Block Ack request and Block Acks frames
+ * have been received and they all contain the GCR group address
+ * - MPDUs are properly discarded when their lifetime expires, and TX window as well as receiver
+ * scoreboard are properly advanced if this occurs
+ * - When the GCR-BA service is used, the exchange of GCR Block Ack Request and GCR Block Acks
+ * frames might be spread over multiple TXOPs
+ * - A-MPDU is only used if TXOP limit duration permits it
+ */
+class GcrBaTest : public GcrTestBase
+{
+  public:
+    /// Parameters for GCR-BA tests
+    struct GcrBaParameters
+    {
+        std::set<uint8_t> barsToCorrupt{}; ///< list of GCR BARs (starting from 1) to corrupt
+        std::set<uint8_t>
+            blockAcksToCorrupt{}; ///< list of GCR Block ACKs (starting from 1) to corrupt
+        std::vector<uint8_t>
+            expectedNTxBarsPerTxop{}; ///< the expected number of BAR frames transmitted by the AP
+                                      ///< per TXOP (only takes into account TXOPs with BARs
+                                      ///< transmitted)
+    };
+
+    /**
+     * Constructor
+     *
+     * @param testName the name of the test
+     * @param commonParams the common GCR parameters for the test to run
+     * @param gcrBaParams the GCR-BA parameters for the test to run
+     */
+    GcrBaTest(const std::string& testName,
+              const GcrParameters& commonParams,
+              const GcrBaParameters& gcrBaParams);
+    ~GcrBaTest() override = default;
+
+  private:
+    void ConfigureGcrManager(WifiMacHelper& macHelper) override;
+    void CheckResults() override;
+    void PacketGenerated(std::string context, Ptr<const Packet> p, const Address& adr) override;
+    void Transmit(std::string context,
+                  WifiConstPsduMap psduMap,
+                  WifiTxVector txVector,
+                  double txPowerW) override;
+    void Receive(std::string context, Ptr<const Packet> p, const Address& adr) override;
+    void NotifyTxopTerminated(Time startTime, Time duration, uint8_t linkId) override;
+
+    GcrBaParameters m_gcrBaParams; ///< GCR-BA parameters for the test to run
+
+    uint8_t m_nTxGcrBar;      ///< number of GCR Block Ack Request frames sent by the AP
+    uint8_t m_nTxGcrBlockAck; ///< number of GCR Block Ack Response frames sent to the AP
+    uint8_t m_nTxBlockAck;    ///< number of Block Ack Response frames sent to the AP
+    uint16_t m_firstTxSeq;    ///< sequence number of the first in-flight groupcast MPDU
+    int m_lastTxSeq;          ///< sequence number of the last in-flight groupcast MPDU
+
+    std::vector<uint8_t>
+        m_nTxGcrBarsPerTxop; ///< number of GCR BAR frames transmitted by the AP per TXOP (only
+                             ///< takes into account TXOPs with BARs transmitted)
+    uint8_t m_nTxGcrBarsInCurrentTxop; ///< number of GCR BAR frames transmitted by the AP in the
+                                       ///< current TXOP
+};
+
+/**
+ * @ingroup wifi-test
+ * @ingroup tests
+ *
+ * @brief wifi GCR Test Suite
+ */
+class WifiGcrTestSuite : public TestSuite
+{
+  public:
+    WifiGcrTestSuite();
+};
+
+#endif /* WIFI_GCR_TEST_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/test/wifi-he-info-elems-test.cc ns-3.44/src/wifi/test/wifi-he-info-elems-test.cc
--- ns-3.43/src/wifi/test/wifi-he-info-elems-test.cc	2024-10-09 16:41:10.136656800 -0700
+++ ns-3.44/src/wifi/test/wifi-he-info-elems-test.cc	2025-03-09 16:55:49.807372600 -0700
@@ -17,10 +17,10 @@
 NS_LOG_COMPONENT_DEFINE("WifiHeInfoElemsTest");
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test HE Operation information element serialization and deserialization
+ * @brief Test HE Operation information element serialization and deserialization
  */
 class HeOperationElementTest : public HeaderSerializationTestCase
 {
@@ -71,10 +71,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test HE 6 GHz Band Capabilities information element serialization and deserialization
+ * @brief Test HE 6 GHz Band Capabilities information element serialization and deserialization
  */
 class He6GhzBandCapabilitiesTest : public HeaderSerializationTestCase
 {
@@ -108,10 +108,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief wifi HE Information Elements Test Suite
+ * @brief wifi HE Information Elements Test Suite
  */
 class WifiHeInfoElemsTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/test/wifi-ie-fragment-test.cc ns-3.44/src/wifi/test/wifi-ie-fragment-test.cc
--- ns-3.43/src/wifi/test/wifi-ie-fragment-test.cc	2024-10-09 16:41:10.136656800 -0700
+++ ns-3.44/src/wifi/test/wifi-ie-fragment-test.cc	2025-03-09 16:55:49.811372800 -0700
@@ -24,8 +24,8 @@
 static bool g_extendedIe = false;
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
  * Subelement to test fragmentation. Its content is a sequence of bytes
  * of configurable size.
@@ -39,8 +39,8 @@
      * Construct a test subelement containing a sequence of bytes of the given
      * size and with the given initial value.
      *
-     * \param count the number of bytes to append
-     * \param start the initial value for the sequence of bytes to add
+     * @param count the number of bytes to append
+     * @param start the initial value for the sequence of bytes to add
      */
     TestWifiSubElement(uint16_t count, uint8_t start);
 
@@ -96,8 +96,8 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
  * Information Element to test IE fragmentation. Its content is one or more
  * test subelements.
@@ -107,7 +107,7 @@
   public:
     /**
      * Constructor
-     * \param extended whether this IE includes an Element ID Extension field
+     * @param extended whether this IE includes an Element ID Extension field
      */
     TestWifiInformationElement(bool extended);
 
@@ -116,7 +116,7 @@
     /**
      * Append the given subelement.
      *
-     * \param subelement the subelement to append
+     * @param subelement the subelement to append
      */
     void AddSubelement(TestWifiSubElement&& subelement);
 
@@ -195,8 +195,8 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
  * Test header that can contain multiple test information elements.
  */
@@ -209,19 +209,19 @@
     ~TestHeader() override = default;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \return the TypeId for this object.
+     * @return the TypeId for this object.
      */
     TypeId GetInstanceTypeId() const override;
 
   private:
     /**
-     * \param optElem the MultiLinkElement object to initialize for deserializing the
+     * @param optElem the MultiLinkElement object to initialize for deserializing the
      *                information element into
      */
     void InitForDeserialization(std::optional<TestWifiInformationElement>& optElem);
@@ -252,17 +252,17 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test fragmentation of Information Elements
+ * @brief Test fragmentation of Information Elements
  */
 class WifiIeFragmentationTest : public HeaderSerializationTestCase
 {
   public:
     /**
      * Constructor
-     * \param extended whether this IE includes an Element ID Extension field
+     * @param extended whether this IE includes an Element ID Extension field
      */
     WifiIeFragmentationTest(bool extended);
     ~WifiIeFragmentationTest() override = default;
@@ -270,17 +270,17 @@
     /**
      * Serialize the given element in a buffer.
      *
-     * \param element the given element
-     * \return the buffer in which the given element has been serialized
+     * @param element the given element
+     * @return the buffer in which the given element has been serialized
      */
     Buffer SerializeIntoBuffer(const WifiInformationElement& element);
 
     /**
      * Check that the given buffer contains the given value at the given position.
      *
-     * \param buffer the given buffer
-     * \param position the given position (starting at 0)
-     * \param value the given value
+     * @param buffer the given buffer
+     * @param position the given position (starting at 0)
+     * @param value the given value
      */
     void CheckSerializedByte(const Buffer& buffer, uint32_t position, uint8_t value);
 
@@ -577,10 +577,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief wifi Information Element fragmentation Test Suite
+ * @brief wifi Information Element fragmentation Test Suite
  */
 class WifiIeFragmentationTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/test/wifi-mac-ofdma-test.cc ns-3.44/src/wifi/test/wifi-mac-ofdma-test.cc
--- ns-3.43/src/wifi/test/wifi-mac-ofdma-test.cc	2024-10-09 16:41:10.136656800 -0700
+++ ns-3.44/src/wifi/test/wifi-mac-ofdma-test.cc	2025-03-09 16:55:49.811372800 -0700
@@ -36,10 +36,10 @@
 NS_LOG_COMPONENT_DEFINE("WifiMacOfdmaTestSuite");
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Dummy Multi User Scheduler used to test OFDMA ack sequences
+ * @brief Dummy Multi User Scheduler used to test OFDMA ack sequences
  *
  * This Multi User Scheduler returns SU_TX until the simulation time reaches 1.5 seconds
  * (when all BA agreements have been established). Afterwards, it cycles through UL_MU_TX
@@ -51,8 +51,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TestMultiUserScheduler();
@@ -330,7 +330,7 @@
 
     for (auto& sta : staList)
     {
-        if (bw == 160 && ruIndex == 3)
+        if (bw == MHz_u{160} && ruIndex == 3)
         {
             ruIndex = 1;
             primary80 = false;
@@ -355,7 +355,7 @@
 }
 
 /**
- * \ingroup wifi-test
+ * @ingroup wifi-test
  * The scenarios
  */
 enum class WifiOfdmaScenario : uint8_t
@@ -366,10 +366,10 @@
 };
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test OFDMA acknowledgment sequences
+ * @brief Test OFDMA acknowledgment sequences
  *
  * Run this test with:
  *
@@ -396,43 +396,49 @@
     };
 
     /**
+     * Parameters for the OFDMA acknowledgment sequences test
+     */
+    struct Params
+    {
+        MHz_u channelWidth;                     ///< PHY channel bandwidth
+        WifiAcknowledgment::Method dlMuAckType; ///< DL MU ack sequence type
+        uint32_t maxAmpduSize;                  ///< maximum A-MPDU size in bytes
+        uint16_t txopLimit;                     ///< TXOP limit in microseconds
+        bool continueTxopAfterBsrp; ///< whether to continue TXOP after BSRP TF when TXOP limit is 0
+        bool skipMuRtsBeforeBsrp;   ///< whether to skip MU-RTS before BSRP TF
+        bool protectedIfResponded; ///< A STA is considered protected if responded to previous frame
+        uint16_t nPktsPerSta;      ///< number of packets to send to each station
+        MuEdcaParameterSet muEdcaParameterSet; ///< MU EDCA Parameter Set
+        WifiOfdmaScenario scenario;            ///< OFDMA scenario to test
+    };
+
+    /**
      * 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
-     * \param scenario the OFDMA scenario to test
+     *
+     * @param params parameters for the OFDMA acknowledgment sequences test
      */
-    OfdmaAckSequenceTest(MHz_u width,
-                         WifiAcknowledgment::Method dlType,
-                         uint32_t maxAmpduSize,
-                         uint16_t txopLimit,
-                         uint16_t nPktsPerSta,
-                         MuEdcaParameterSet muEdcaParameterSet,
-                         WifiOfdmaScenario scenario);
+    OfdmaAckSequenceTest(const Params& params);
     ~OfdmaAckSequenceTest() override;
 
     /**
      * Function to trace packets received by the server application
-     * \param context the context
-     * \param p the packet
-     * \param addr the address
+     * @param context the context
+     * @param p the packet
+     * @param addr the address
      */
     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 cw the current Contention Window value
+     * @param staIndex the index of the given station
+     * @param cw the current Contention Window value
      */
     void TraceCw(uint32_t staIndex, uint32_t cw, uint8_t /* linkId */);
     /**
      * Callback invoked when FrameExchangeManager passes PSDUs to the PHY
-     * \param context the context
-     * \param psduMap the PSDU map
-     * \param txVector the TX vector
-     * \param txPowerW the tx power in Watts
+     * @param context the context
+     * @param psduMap the PSDU map
+     * @param txVector the TX vector
+     * @param txPowerW the tx power in Watts
      */
     void Transmit(std::string context,
                   WifiConstPsduMap psduMap,
@@ -440,9 +446,9 @@
                   double txPowerW);
     /**
      * Check correctness of transmitted frames
-     * \param sifs the SIFS duration
-     * \param slotTime a slot duration
-     * \param aifsn the AIFSN
+     * @param sifs the SIFS duration
+     * @param slotTime a slot duration
+     * @param aifsn the AIFSN
      */
     void CheckResults(Time sifs, Time slotTime, uint8_t aifsn);
 
@@ -470,40 +476,43 @@
     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
-    WifiOfdmaScenario m_scenario;               ///< OFDMA scenario to test
-    WifiPreamble m_dlMuPreamble;                ///< expected preamble type for DL MU PPDUs
-    WifiPreamble m_tbPreamble;                  ///< expected preamble type for TB PPDUs
-    bool m_ulPktsGenerated;           ///< whether UL packets for HE TB PPDUs have been generated
-    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
+    bool
+        m_continueTxopAfterBsrp; ///< whether to continue TXOP after BSRP TF when TXOP limit is zero
+    bool m_skipMuRtsBeforeBsrp;  ///< whether to skip MU-RTS before BSRP TF
+    bool m_protectedIfResponded; ///< A STA is considered protected if responded to previous frame
+    uint16_t m_nPktsPerSta;      ///< number of packets to send to each station
+    MuEdcaParameterSet m_muEdcaParameterSet; ///< MU EDCA Parameter Set
+    WifiOfdmaScenario m_scenario;            ///< OFDMA scenario to test
+    WifiPreamble m_dlMuPreamble;             ///< expected preamble type for DL MU PPDUs
+    WifiPreamble m_tbPreamble;               ///< expected preamble type for TB PPDUs
+    bool m_ulPktsGenerated;             ///< whether UL packets for HE TB PPDUs have been generated
+    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
+    const Time m_defaultTbPpduDuration; ///< default TB PPDU duration
 };
 
-OfdmaAckSequenceTest::OfdmaAckSequenceTest(MHz_u width,
-                                           WifiAcknowledgment::Method dlType,
-                                           uint32_t maxAmpduSize,
-                                           uint16_t txopLimit,
-                                           uint16_t nPktsPerSta,
-                                           MuEdcaParameterSet muEdcaParameterSet,
-                                           WifiOfdmaScenario scenario)
+OfdmaAckSequenceTest::OfdmaAckSequenceTest(const Params& params)
     : TestCase("Check correct operation of DL OFDMA acknowledgment sequences"),
       m_nStations(4),
       m_sockets(m_nStations),
-      m_channelWidth(width),
-      m_dlMuAckType(dlType),
-      m_maxAmpduSize(maxAmpduSize),
-      m_txopLimit(txopLimit),
-      m_nPktsPerSta(nPktsPerSta),
-      m_muEdcaParameterSet(muEdcaParameterSet),
-      m_scenario(scenario),
+      m_channelWidth(params.channelWidth),
+      m_dlMuAckType(params.dlMuAckType),
+      m_maxAmpduSize(params.maxAmpduSize),
+      m_txopLimit(params.txopLimit),
+      m_continueTxopAfterBsrp(params.continueTxopAfterBsrp),
+      m_skipMuRtsBeforeBsrp(params.skipMuRtsBeforeBsrp),
+      m_protectedIfResponded(params.protectedIfResponded),
+      m_nPktsPerSta(params.nPktsPerSta),
+      m_muEdcaParameterSet(params.muEdcaParameterSet),
+      m_scenario(params.scenario),
       m_ulPktsGenerated(false),
       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
+      m_edcaDisabledStartTime(),
+      m_cwValues(std::vector<uint32_t>(m_nStations, 2)), // 2 is an invalid CW value
+      m_defaultTbPpduDuration(MilliSeconds(2))
 {
     switch (m_scenario)
     {
@@ -686,8 +695,8 @@
                 client->SetAttribute("Priority", UintegerValue(i * 2)); // 0, 2, 4 and 6
                 client->SetRemote(m_sockets[i]);
                 m_staDevices.Get(i)->GetNode()->AddApplication(client);
-                client->SetStartTime(txDuration);  // start when TX ends
-                client->SetStopTime(Seconds(1.0)); // stop in a second
+                client->SetStartTime(txDuration); // start when TX ends
+                client->SetStopTime(Seconds(1));  // stop in a second
                 client->Initialize();
             }
             m_ulPktsGenerated = true;
@@ -725,111 +734,136 @@
      * ───┴───┴────┴───┴────┴────┴────┴────┴─────┴───┴────┴───┴────┴─────┴────┴────┴────┴─────┴──
      * From: AP     all       AP        all       AP       all       AP         all       AP
      *   To: all    AP        all       AP        all      AP        all        AP        all
+     *
+     * NOTE 1:The first MU-RTS is not transmitted if SkipMuRtsBeforeBsrp is true
+     * NOTE 2: The second MU-RTS is transmitted if the Trigger Frames are transmitted in separate
+     *         TXOPs, or it is a single TXOP and an MU-RTS has not been sent earlier (to protect
+     *         the BSRP TF) and STAs are not considered protected if they responded
      */
 
-    // the first packet sent after 1.5s is an MU-RTS Trigger Frame
-    NS_TEST_ASSERT_MSG_GT_OR_EQ(m_txPsdus.size(), 5, "Expected at least 5 transmitted packet");
-    NS_TEST_EXPECT_MSG_EQ((m_txPsdus[0].psduMap.size() == 1 &&
-                           m_txPsdus[0].psduMap[SU_STA_ID]->GetHeader(0).IsTrigger() &&
-                           m_txPsdus[0].psduMap[SU_STA_ID]->GetHeader(0).GetAddr1().IsBroadcast()),
-                          true,
-                          "Expected a Trigger Frame");
-    m_txPsdus[0].psduMap[SU_STA_ID]->GetPayload(0)->PeekHeader(trigger);
-    NS_TEST_EXPECT_MSG_EQ(trigger.IsMuRts(), true, "Expected an MU-RTS Trigger Frame");
-    NS_TEST_EXPECT_MSG_EQ(trigger.GetNUserInfoFields(),
-                          4,
-                          "Expected one User Info field per station");
-    NS_TEST_EXPECT_MSG_EQ(m_txPsdus[0].txVector.GetChannelWidth(),
-                          m_channelWidth,
-                          "Expected the MU-RTS to occupy the entire channel width");
-    for (const auto& userInfo : trigger)
-    {
-        NS_TEST_EXPECT_MSG_EQ(+userInfo.GetMuRtsRuAllocation(),
-                              +m_muRtsRuAllocation,
-                              "Unexpected RU Allocation value in MU-RTS");
-    }
     tEnd = m_txPsdus[0].endTx;
     navEnd = tEnd + m_txPsdus[0].psduMap[SU_STA_ID]->GetDuration();
+    Time ctsNavEnd{0};
+
+    if (!m_skipMuRtsBeforeBsrp)
+    {
+        // the first packet sent after 1.5s is an MU-RTS Trigger Frame
+        NS_TEST_ASSERT_MSG_GT_OR_EQ(m_txPsdus.size(), 5, "Expected at least 5 transmitted packet");
+        NS_TEST_EXPECT_MSG_EQ(
+            (m_txPsdus[0].psduMap.size() == 1 &&
+             m_txPsdus[0].psduMap[SU_STA_ID]->GetHeader(0).IsTrigger() &&
+             m_txPsdus[0].psduMap[SU_STA_ID]->GetHeader(0).GetAddr1().IsBroadcast()),
+            true,
+            "Expected a Trigger Frame");
+        m_txPsdus[0].psduMap[SU_STA_ID]->GetPayload(0)->PeekHeader(trigger);
+        NS_TEST_EXPECT_MSG_EQ(trigger.IsMuRts(), true, "Expected an MU-RTS Trigger Frame");
+        NS_TEST_EXPECT_MSG_EQ(trigger.GetNUserInfoFields(),
+                              4,
+                              "Expected one User Info field per station");
+        NS_TEST_EXPECT_MSG_EQ(m_txPsdus[0].txVector.GetChannelWidth(),
+                              m_channelWidth,
+                              "Expected the MU-RTS to occupy the entire channel width");
+        for (const auto& userInfo : trigger)
+        {
+            NS_TEST_EXPECT_MSG_EQ(+userInfo.GetMuRtsRuAllocation(),
+                                  +m_muRtsRuAllocation,
+                                  "Unexpected RU Allocation value in MU-RTS");
+        }
+
+        // A first STA sends a CTS frame a SIFS after the reception of the MU-RTS TF
+        NS_TEST_EXPECT_MSG_EQ(
+            (m_txPsdus[1].txVector.GetPreambleType() != WIFI_PREAMBLE_HE_TB &&
+             m_txPsdus[1].psduMap.size() == 1 &&
+             m_txPsdus[1].psduMap.begin()->second->GetNMpdus() == 1 &&
+             m_txPsdus[1].psduMap.begin()->second->GetHeader(0).GetType() == WIFI_MAC_CTL_CTS),
+            true,
+            "Expected a CTS frame");
+        NS_TEST_EXPECT_MSG_EQ(m_txPsdus[1].txVector.GetChannelWidth(),
+                              m_channelWidth,
+                              "Expected the CTS to occupy the entire channel width");
+
+        tStart = m_txPsdus[1].startTx;
+        NS_TEST_EXPECT_MSG_LT(tEnd + sifs, tStart, "CTS frame sent too early");
+        NS_TEST_EXPECT_MSG_LT(tStart, tEnd + sifs + tolerance, "CTS frame sent too late");
+        ctsNavEnd = m_txPsdus[1].endTx + m_txPsdus[1].psduMap[SU_STA_ID]->GetDuration();
+        // navEnd <= ctsNavEnd < navEnd + tolerance
+        NS_TEST_EXPECT_MSG_LT_OR_EQ(navEnd, ctsNavEnd, "Duration/ID in CTS frame is too short");
+        NS_TEST_EXPECT_MSG_LT(ctsNavEnd,
+                              navEnd + tolerance,
+                              "Duration/ID in CTS frame is too long");
+
+        // A second STA sends a CTS frame a SIFS after the reception of the MU-RTS TF
+        NS_TEST_EXPECT_MSG_EQ(
+            (m_txPsdus[2].txVector.GetPreambleType() != WIFI_PREAMBLE_HE_TB &&
+             m_txPsdus[2].psduMap.size() == 1 &&
+             m_txPsdus[2].psduMap.begin()->second->GetNMpdus() == 1 &&
+             m_txPsdus[2].psduMap.begin()->second->GetHeader(0).GetType() == WIFI_MAC_CTL_CTS),
+            true,
+            "Expected a CTS frame");
+        NS_TEST_EXPECT_MSG_EQ(m_txPsdus[2].txVector.GetChannelWidth(),
+                              m_channelWidth,
+                              "Expected the CTS to occupy the entire channel width");
+
+        tStart = m_txPsdus[2].startTx;
+        NS_TEST_EXPECT_MSG_LT(tEnd + sifs, tStart, "CTS frame sent too early");
+        NS_TEST_EXPECT_MSG_LT(tStart, tEnd + sifs + tolerance, "CTS frame sent too late");
+        ctsNavEnd = m_txPsdus[2].endTx + m_txPsdus[2].psduMap[SU_STA_ID]->GetDuration();
+        // navEnd <= ctsNavEnd < navEnd + tolerance
+        NS_TEST_EXPECT_MSG_LT_OR_EQ(navEnd, ctsNavEnd, "Duration/ID in CTS frame is too short");
+        NS_TEST_EXPECT_MSG_LT(ctsNavEnd,
+                              navEnd + tolerance,
+                              "Duration/ID in CTS frame is too long");
+
+        // A third STA sends a CTS frame a SIFS after the reception of the MU-RTS TF
+        NS_TEST_EXPECT_MSG_EQ(
+            (m_txPsdus[3].txVector.GetPreambleType() != WIFI_PREAMBLE_HE_TB &&
+             m_txPsdus[3].psduMap.size() == 1 &&
+             m_txPsdus[3].psduMap.begin()->second->GetNMpdus() == 1 &&
+             m_txPsdus[3].psduMap.begin()->second->GetHeader(0).GetType() == WIFI_MAC_CTL_CTS),
+            true,
+            "Expected a CTS frame");
+        NS_TEST_EXPECT_MSG_EQ(m_txPsdus[3].txVector.GetChannelWidth(),
+                              m_channelWidth,
+                              "Expected the CTS to occupy the entire channel width");
+
+        tStart = m_txPsdus[3].startTx;
+        NS_TEST_EXPECT_MSG_LT(tEnd + sifs, tStart, "CTS frame sent too early");
+        NS_TEST_EXPECT_MSG_LT(tStart, tEnd + sifs + tolerance, "CTS frame sent too late");
+        ctsNavEnd = m_txPsdus[3].endTx + m_txPsdus[3].psduMap[SU_STA_ID]->GetDuration();
+        // navEnd <= ctsNavEnd < navEnd + tolerance
+        NS_TEST_EXPECT_MSG_LT_OR_EQ(navEnd, ctsNavEnd, "Duration/ID in CTS frame is too short");
+        NS_TEST_EXPECT_MSG_LT(ctsNavEnd,
+                              navEnd + tolerance,
+                              "Duration/ID in CTS frame is too long");
+
+        // A fourth STA sends a CTS frame a SIFS after the reception of the MU-RTS TF
+        NS_TEST_EXPECT_MSG_EQ(
+            (m_txPsdus[4].txVector.GetPreambleType() != WIFI_PREAMBLE_HE_TB &&
+             m_txPsdus[4].psduMap.size() == 1 &&
+             m_txPsdus[4].psduMap.begin()->second->GetNMpdus() == 1 &&
+             m_txPsdus[4].psduMap.begin()->second->GetHeader(0).GetType() == WIFI_MAC_CTL_CTS),
+            true,
+            "Expected a CTS frame");
+        NS_TEST_EXPECT_MSG_EQ(m_txPsdus[4].txVector.GetChannelWidth(),
+                              m_channelWidth,
+                              "Expected the CTS to occupy the entire channel width");
 
-    // A first STA sends a CTS frame a SIFS after the reception of the MU-RTS TF
-    NS_TEST_EXPECT_MSG_EQ(
-        (m_txPsdus[1].txVector.GetPreambleType() != WIFI_PREAMBLE_HE_TB &&
-         m_txPsdus[1].psduMap.size() == 1 &&
-         m_txPsdus[1].psduMap.begin()->second->GetNMpdus() == 1 &&
-         m_txPsdus[1].psduMap.begin()->second->GetHeader(0).GetType() == WIFI_MAC_CTL_CTS),
-        true,
-        "Expected a CTS frame");
-    NS_TEST_EXPECT_MSG_EQ(m_txPsdus[1].txVector.GetChannelWidth(),
-                          m_channelWidth,
-                          "Expected the CTS to occupy the entire channel width");
-
-    tStart = m_txPsdus[1].startTx;
-    NS_TEST_EXPECT_MSG_LT(tEnd + sifs, tStart, "CTS frame sent too early");
-    NS_TEST_EXPECT_MSG_LT(tStart, tEnd + sifs + tolerance, "CTS frame sent too late");
-    Time ctsNavEnd = m_txPsdus[1].endTx + m_txPsdus[1].psduMap[SU_STA_ID]->GetDuration();
-    // navEnd <= ctsNavEnd < navEnd + tolerance
-    NS_TEST_EXPECT_MSG_LT_OR_EQ(navEnd, ctsNavEnd, "Duration/ID in CTS frame is too short");
-    NS_TEST_EXPECT_MSG_LT(ctsNavEnd, navEnd + tolerance, "Duration/ID in CTS frame is too long");
-
-    // A second STA sends a CTS frame a SIFS after the reception of the MU-RTS TF
-    NS_TEST_EXPECT_MSG_EQ(
-        (m_txPsdus[2].txVector.GetPreambleType() != WIFI_PREAMBLE_HE_TB &&
-         m_txPsdus[2].psduMap.size() == 1 &&
-         m_txPsdus[2].psduMap.begin()->second->GetNMpdus() == 1 &&
-         m_txPsdus[2].psduMap.begin()->second->GetHeader(0).GetType() == WIFI_MAC_CTL_CTS),
-        true,
-        "Expected a CTS frame");
-    NS_TEST_EXPECT_MSG_EQ(m_txPsdus[2].txVector.GetChannelWidth(),
-                          m_channelWidth,
-                          "Expected the CTS to occupy the entire channel width");
-
-    tStart = m_txPsdus[2].startTx;
-    NS_TEST_EXPECT_MSG_LT(tEnd + sifs, tStart, "CTS frame sent too early");
-    NS_TEST_EXPECT_MSG_LT(tStart, tEnd + sifs + tolerance, "CTS frame sent too late");
-    ctsNavEnd = m_txPsdus[2].endTx + m_txPsdus[2].psduMap[SU_STA_ID]->GetDuration();
-    // navEnd <= ctsNavEnd < navEnd + tolerance
-    NS_TEST_EXPECT_MSG_LT_OR_EQ(navEnd, ctsNavEnd, "Duration/ID in CTS frame is too short");
-    NS_TEST_EXPECT_MSG_LT(ctsNavEnd, navEnd + tolerance, "Duration/ID in CTS frame is too long");
-
-    // A third STA sends a CTS frame a SIFS after the reception of the MU-RTS TF
-    NS_TEST_EXPECT_MSG_EQ(
-        (m_txPsdus[3].txVector.GetPreambleType() != WIFI_PREAMBLE_HE_TB &&
-         m_txPsdus[3].psduMap.size() == 1 &&
-         m_txPsdus[3].psduMap.begin()->second->GetNMpdus() == 1 &&
-         m_txPsdus[3].psduMap.begin()->second->GetHeader(0).GetType() == WIFI_MAC_CTL_CTS),
-        true,
-        "Expected a CTS frame");
-    NS_TEST_EXPECT_MSG_EQ(m_txPsdus[3].txVector.GetChannelWidth(),
-                          m_channelWidth,
-                          "Expected the CTS to occupy the entire channel width");
-
-    tStart = m_txPsdus[3].startTx;
-    NS_TEST_EXPECT_MSG_LT(tEnd + sifs, tStart, "CTS frame sent too early");
-    NS_TEST_EXPECT_MSG_LT(tStart, tEnd + sifs + tolerance, "CTS frame sent too late");
-    ctsNavEnd = m_txPsdus[3].endTx + m_txPsdus[3].psduMap[SU_STA_ID]->GetDuration();
-    // navEnd <= ctsNavEnd < navEnd + tolerance
-    NS_TEST_EXPECT_MSG_LT_OR_EQ(navEnd, ctsNavEnd, "Duration/ID in CTS frame is too short");
-    NS_TEST_EXPECT_MSG_LT(ctsNavEnd, navEnd + tolerance, "Duration/ID in CTS frame is too long");
-
-    // A fourth STA sends a CTS frame a SIFS after the reception of the MU-RTS TF
-    NS_TEST_EXPECT_MSG_EQ(
-        (m_txPsdus[4].txVector.GetPreambleType() != WIFI_PREAMBLE_HE_TB &&
-         m_txPsdus[4].psduMap.size() == 1 &&
-         m_txPsdus[4].psduMap.begin()->second->GetNMpdus() == 1 &&
-         m_txPsdus[4].psduMap.begin()->second->GetHeader(0).GetType() == WIFI_MAC_CTL_CTS),
-        true,
-        "Expected a CTS frame");
-    NS_TEST_EXPECT_MSG_EQ(m_txPsdus[4].txVector.GetChannelWidth(),
-                          m_channelWidth,
-                          "Expected the CTS to occupy the entire channel width");
-
-    tStart = m_txPsdus[4].startTx;
-    NS_TEST_EXPECT_MSG_LT(tEnd + sifs, tStart, "CTS frame sent too early");
-    NS_TEST_EXPECT_MSG_LT(tStart, tEnd + sifs + tolerance, "CTS frame sent too late");
-    ctsNavEnd = m_txPsdus[4].endTx + m_txPsdus[4].psduMap[SU_STA_ID]->GetDuration();
-    // navEnd <= ctsNavEnd < navEnd + tolerance
-    NS_TEST_EXPECT_MSG_LT_OR_EQ(navEnd, ctsNavEnd, "Duration/ID in CTS frame is too short");
-    NS_TEST_EXPECT_MSG_LT(ctsNavEnd, navEnd + tolerance, "Duration/ID in CTS frame is too long");
+        tStart = m_txPsdus[4].startTx;
+        NS_TEST_EXPECT_MSG_LT(tEnd + sifs, tStart, "CTS frame sent too early");
+        NS_TEST_EXPECT_MSG_LT(tStart, tEnd + sifs + tolerance, "CTS frame sent too late");
+        ctsNavEnd = m_txPsdus[4].endTx + m_txPsdus[4].psduMap[SU_STA_ID]->GetDuration();
+        // navEnd <= ctsNavEnd < navEnd + tolerance
+        NS_TEST_EXPECT_MSG_LT_OR_EQ(navEnd, ctsNavEnd, "Duration/ID in CTS frame is too short");
+        NS_TEST_EXPECT_MSG_LT(ctsNavEnd,
+                              navEnd + tolerance,
+                              "Duration/ID in CTS frame is too long");
+    }
+    else
+    {
+        // insert 5 elements in m_txPsdus to align the index of the following frames in the
+        // two cases (m_skipMuRtsBeforeBsrp true and false)
+        m_txPsdus.insert(m_txPsdus.begin(), 5, {});
+    }
 
     // the AP sends a BSRP Trigger Frame
     NS_TEST_ASSERT_MSG_GT_OR_EQ(m_txPsdus.size(), 10, "Expected at least 10 transmitted packet");
@@ -843,11 +877,19 @@
     NS_TEST_EXPECT_MSG_EQ(trigger.GetNUserInfoFields(),
                           4,
                           "Expected one User Info field per station");
-    tEnd = m_txPsdus[4].endTx;
-    tStart = m_txPsdus[5].startTx;
-    NS_TEST_EXPECT_MSG_LT(tEnd + sifs, tStart, "BSRP Trigger Frame sent too early");
-    NS_TEST_EXPECT_MSG_LT(tStart, tEnd + sifs + tolerance, "BSRP Trigger Frame sent too late");
+    if (!m_skipMuRtsBeforeBsrp)
+    {
+        tEnd = m_txPsdus[4].endTx;
+        tStart = m_txPsdus[5].startTx;
+        NS_TEST_EXPECT_MSG_LT(tEnd + sifs, tStart, "BSRP Trigger Frame sent too early");
+        NS_TEST_EXPECT_MSG_LT(tStart, tEnd + sifs + tolerance, "BSRP Trigger Frame sent too late");
+    }
     Time bsrpNavEnd = m_txPsdus[5].endTx + m_txPsdus[5].psduMap[SU_STA_ID]->GetDuration();
+    if (m_continueTxopAfterBsrp && m_txopLimit == 0)
+    {
+        // BSRP TF extends the NAV beyond the responses
+        navEnd += m_defaultTbPpduDuration;
+    }
     // navEnd <= bsrpNavEnd < navEnd + tolerance
     NS_TEST_EXPECT_MSG_LT_OR_EQ(navEnd, bsrpNavEnd, "Duration/ID in BSRP TF is too short");
     NS_TEST_EXPECT_MSG_LT(bsrpNavEnd, navEnd + tolerance, "Duration/ID in BSRP TF is too long");
@@ -883,7 +925,8 @@
     if (m_txopLimit == 0)
     {
         NS_TEST_EXPECT_MSG_EQ(qosNullNavEnd,
-                              m_txPsdus[6].endTx,
+                              m_txPsdus[6].endTx +
+                                  (m_continueTxopAfterBsrp ? m_defaultTbPpduDuration : Time{0}),
                               "Expected null Duration/ID for QoS Null frame in HE TB PPDU");
     }
     // navEnd <= qosNullNavEnd < navEnd + tolerance
@@ -920,7 +963,8 @@
     if (m_txopLimit == 0)
     {
         NS_TEST_EXPECT_MSG_EQ(qosNullNavEnd,
-                              m_txPsdus[7].endTx,
+                              m_txPsdus[7].endTx +
+                                  (m_continueTxopAfterBsrp ? m_defaultTbPpduDuration : Time{0}),
                               "Expected null Duration/ID for QoS Null frame in HE TB PPDU");
     }
     // navEnd <= qosNullNavEnd < navEnd + tolerance
@@ -957,7 +1001,8 @@
     if (m_txopLimit == 0)
     {
         NS_TEST_EXPECT_MSG_EQ(qosNullNavEnd,
-                              m_txPsdus[8].endTx,
+                              m_txPsdus[8].endTx +
+                                  (m_continueTxopAfterBsrp ? m_defaultTbPpduDuration : Time{0}),
                               "Expected null Duration/ID for QoS Null frame in HE TB PPDU");
     }
     // navEnd <= qosNullNavEnd < navEnd + tolerance
@@ -994,29 +1039,50 @@
     if (m_txopLimit == 0)
     {
         NS_TEST_EXPECT_MSG_EQ(qosNullNavEnd,
-                              m_txPsdus[9].endTx,
+                              m_txPsdus[9].endTx +
+                                  (m_continueTxopAfterBsrp ? m_defaultTbPpduDuration : Time{0}),
                               "Expected null Duration/ID for QoS Null frame in HE TB PPDU");
     }
     // navEnd <= qosNullNavEnd < navEnd + tolerance
     NS_TEST_EXPECT_MSG_LT_OR_EQ(navEnd, qosNullNavEnd, "Duration/ID in QoS Null is too short");
     NS_TEST_EXPECT_MSG_LT(qosNullNavEnd, navEnd + tolerance, "Duration/ID in QoS Null is too long");
 
+    // if the Basic TF is sent in a separate TXOP than the BSRP TF, MU-RTS protection is used for
+    // the Basic TF. Otherwise, MU-RTS is sent if an MU-RTS has not been sent earlier (to protect
+    // the BSRP TF) and STAs are not considered protected if they responded
+    const auto twoTxops = m_txopLimit == 0 && !m_continueTxopAfterBsrp;
+    const auto secondMuRts = twoTxops || (m_skipMuRtsBeforeBsrp && !m_protectedIfResponded);
+
     tEnd = m_txPsdus[9].endTx;
     tStart = m_txPsdus[10].startTx;
-    NS_TEST_EXPECT_MSG_LT(tEnd + ifs, tStart, "Basic Trigger Frame sent too early");
+    NS_TEST_EXPECT_MSG_LT(tEnd + (twoTxops ? ifs : sifs),
+                          tStart,
+                          (secondMuRts ? "MU-RTS" : "Basic Trigger Frame") << " sent too early");
+
+    if (!twoTxops)
+    {
+        NS_TEST_EXPECT_MSG_LT(tStart,
+                              tEnd + sifs + tolerance,
+                              (secondMuRts ? "MU-RTS" : "Basic Trigger Frame") << " sent too late");
+    }
+
     if (m_txopLimit > 0)
     {
-        NS_TEST_EXPECT_MSG_LT(tStart, tEnd + sifs + tolerance, "Basic Trigger Frame sent too late");
-        // Duration/ID still protects until the end of the TXOP
-        auto muRtsNavEnd = m_txPsdus[10].endTx + m_txPsdus[10].psduMap[SU_STA_ID]->GetDuration();
-        // navEnd <= muRtsNavEnd < navEnd + tolerance
-        NS_TEST_EXPECT_MSG_LT_OR_EQ(navEnd, muRtsNavEnd, "Duration/ID in MU-RTS is too short");
-        NS_TEST_EXPECT_MSG_LT(muRtsNavEnd, navEnd + tolerance, "Duration/ID in MU-RTS is too long");
+        // Duration/ID of Basic TF still protects until the end of the TXOP
+        auto basicTfNavEnd = m_txPsdus[10].endTx + m_txPsdus[10].psduMap[SU_STA_ID]->GetDuration();
+        // navEnd <= basicTfNavEnd < navEnd + tolerance
+        NS_TEST_EXPECT_MSG_LT_OR_EQ(navEnd, basicTfNavEnd, "Duration/ID in MU-RTS is too short");
+        NS_TEST_EXPECT_MSG_LT(basicTfNavEnd,
+                              navEnd + tolerance,
+                              "Duration/ID in MU-RTS is too long");
+    }
+    else if (m_continueTxopAfterBsrp)
+    {
+        // the Basic TF sets a new NAV
+        navEnd = m_txPsdus[10].endTx + m_txPsdus[10].psduMap[SU_STA_ID]->GetDuration();
     }
 
-    // if the TXOP limit is not null, MU-RTS protection is not used because the next transmission
-    // is protected by the previous MU-RTS Trigger Frame
-    if (m_txopLimit == 0)
+    if (secondMuRts)
     {
         // the AP sends another MU-RTS Trigger Frame to protect the Basic TF
         NS_TEST_ASSERT_MSG_GT_OR_EQ(m_txPsdus.size(),
@@ -2006,7 +2072,6 @@
         NS_ABORT_MSG("Invalid channel bandwidth (must be 20, 40, 80 or 160)");
     }
 
-    Config::SetDefault("ns3::WifiDefaultProtectionManager::EnableMuRts", BooleanValue(true));
     Config::SetDefault("ns3::HeConfiguration::MuBeAifsn",
                        UintegerValue(m_muEdcaParameterSet.muAifsn));
     Config::SetDefault("ns3::HeConfiguration::MuBeCwMin",
@@ -2126,10 +2191,21 @@
         "AccessReqInterval",
         TimeValue(Seconds(1.5)),
         "DelayAccessReqUponAccess",
-        BooleanValue(false));
+        BooleanValue(false),
+        "DefaultTbPpduDuration",
+        TimeValue(m_defaultTbPpduDuration));
+    mac.SetProtectionManager("ns3::WifiDefaultProtectionManager",
+                             "EnableMuRts",
+                             BooleanValue(true),
+                             "SkipMuRtsBeforeBsrp",
+                             BooleanValue(m_skipMuRtsBeforeBsrp));
     mac.SetAckManager("ns3::WifiDefaultAckManager",
                       "DlMuAckSequenceType",
                       EnumValue(m_dlMuAckType));
+    mac.SetFrameExchangeManager("ProtectedIfResponded",
+                                BooleanValue(m_protectedIfResponded),
+                                "ContinueTxopAfterBsrp",
+                                BooleanValue(m_continueTxopAfterBsrp));
 
     m_apDevice = DynamicCast<WifiNetDevice>(wifi.Install(phy, mac, wifiApNode).Get(0));
 
@@ -2189,7 +2265,7 @@
         client1->SetRemote(socket);
         wifiApNode.Get(0)->AddApplication(client1);
         client1->SetStartTime(Seconds(1) + i * MilliSeconds(1));
-        client1->SetStopTime(Seconds(2.0));
+        client1->SetStopTime(Seconds(2));
 
         // the second client application generates the selected number of packets,
         // which are sent in DL MU PPDUs.
@@ -2206,8 +2282,8 @@
         Ptr<PacketSocketServer> server = CreateObject<PacketSocketServer>();
         server->SetLocal(socket);
         wifiStaNodes.Get(i)->AddApplication(server);
-        server->SetStartTime(Seconds(0.0));
-        server->SetStopTime(Seconds(3.0));
+        server->SetStartTime(Seconds(0));
+        server->SetStopTime(Seconds(3));
     }
 
     // UL Traffic
@@ -2227,7 +2303,7 @@
         client1->SetRemote(m_sockets[i]);
         wifiStaNodes.Get(i)->AddApplication(client1);
         client1->SetStartTime(Seconds(1.005) + i * MilliSeconds(1));
-        client1->SetStopTime(Seconds(2.0));
+        client1->SetStopTime(Seconds(2));
 
         // packets to be included in HE TB PPDUs are generated (by Transmit()) when
         // the first Basic Trigger Frame is sent by the AP
@@ -2235,8 +2311,8 @@
         Ptr<PacketSocketServer> server = CreateObject<PacketSocketServer>();
         server->SetLocal(m_sockets[i]);
         wifiApNode.Get(0)->AddApplication(server);
-        server->SetStartTime(Seconds(0.0));
-        server->SetStopTime(Seconds(3.0));
+        server->SetStartTime(Seconds(0));
+        server->SetStopTime(Seconds(3));
     }
 
     Config::Connect("/NodeList/*/ApplicationList/0/$ns3::PacketSocketServer/Rx",
@@ -2260,10 +2336,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief wifi MAC OFDMA Test Suite
+ * @brief wifi MAC OFDMA Test Suite
  */
 class WifiMacOfdmaTestSuite : public TestSuite
 {
@@ -2283,54 +2359,78 @@
         for (const auto scenario :
              {WifiOfdmaScenario::HE, WifiOfdmaScenario::HE_EHT, WifiOfdmaScenario::EHT})
         {
-            AddTestCase(new OfdmaAckSequenceTest(20,
-                                                 WifiAcknowledgment::DL_MU_BAR_BA_SEQUENCE,
-                                                 10000,
-                                                 5632,
-                                                 15,
-                                                 muEdcaParameterSet,
-                                                 scenario),
-                        TestCase::Duration::QUICK);
-            AddTestCase(new OfdmaAckSequenceTest(20,
-                                                 WifiAcknowledgment::DL_MU_AGGREGATE_TF,
-                                                 10000,
-                                                 5632,
-                                                 15,
-                                                 muEdcaParameterSet,
-                                                 scenario),
-                        TestCase::Duration::QUICK);
-            AddTestCase(new OfdmaAckSequenceTest(20,
-                                                 WifiAcknowledgment::DL_MU_TF_MU_BAR,
-                                                 10000,
-                                                 5632,
-                                                 15,
-                                                 muEdcaParameterSet,
-                                                 scenario),
-                        TestCase::Duration::QUICK);
-            AddTestCase(new OfdmaAckSequenceTest(40,
-                                                 WifiAcknowledgment::DL_MU_BAR_BA_SEQUENCE,
-                                                 10000,
-                                                 0,
-                                                 15,
-                                                 muEdcaParameterSet,
-                                                 scenario),
+            AddTestCase(new OfdmaAckSequenceTest(
+                            {.channelWidth = MHz_u{20},
+                             .dlMuAckType = WifiAcknowledgment::DL_MU_BAR_BA_SEQUENCE,
+                             .maxAmpduSize = 10000,
+                             .txopLimit = 5632,
+                             .continueTxopAfterBsrp = false, // unused because non-zero TXOP limit
+                             .skipMuRtsBeforeBsrp = true,
+                             .protectedIfResponded = false,
+                             .nPktsPerSta = 15,
+                             .muEdcaParameterSet = muEdcaParameterSet,
+                             .scenario = scenario}),
                         TestCase::Duration::QUICK);
-            AddTestCase(new OfdmaAckSequenceTest(40,
-                                                 WifiAcknowledgment::DL_MU_AGGREGATE_TF,
-                                                 10000,
-                                                 0,
-                                                 15,
-                                                 muEdcaParameterSet,
-                                                 scenario),
+            AddTestCase(new OfdmaAckSequenceTest(
+                            {.channelWidth = MHz_u{20},
+                             .dlMuAckType = WifiAcknowledgment::DL_MU_AGGREGATE_TF,
+                             .maxAmpduSize = 10000,
+                             .txopLimit = 5632,
+                             .continueTxopAfterBsrp = false, // unused because non-zero TXOP limit
+                             .skipMuRtsBeforeBsrp = false,
+                             .protectedIfResponded = false,
+                             .nPktsPerSta = 15,
+                             .muEdcaParameterSet = muEdcaParameterSet,
+                             .scenario = scenario}),
                         TestCase::Duration::QUICK);
-            AddTestCase(new OfdmaAckSequenceTest(40,
-                                                 WifiAcknowledgment::DL_MU_TF_MU_BAR,
-                                                 10000,
-                                                 0,
-                                                 15,
-                                                 muEdcaParameterSet,
-                                                 scenario),
+            AddTestCase(new OfdmaAckSequenceTest(
+                            {.channelWidth = MHz_u{20},
+                             .dlMuAckType = WifiAcknowledgment::DL_MU_TF_MU_BAR,
+                             .maxAmpduSize = 10000,
+                             .txopLimit = 5632,
+                             .continueTxopAfterBsrp = false, // unused because non-zero TXOP limit
+                             .skipMuRtsBeforeBsrp = true,
+                             .protectedIfResponded = true,
+                             .nPktsPerSta = 15,
+                             .muEdcaParameterSet = muEdcaParameterSet,
+                             .scenario = scenario}),
                         TestCase::Duration::QUICK);
+            AddTestCase(
+                new OfdmaAckSequenceTest({.channelWidth = MHz_u{40},
+                                          .dlMuAckType = WifiAcknowledgment::DL_MU_BAR_BA_SEQUENCE,
+                                          .maxAmpduSize = 10000,
+                                          .txopLimit = 0,
+                                          .continueTxopAfterBsrp = true,
+                                          .skipMuRtsBeforeBsrp = false,
+                                          .protectedIfResponded = false,
+                                          .nPktsPerSta = 15,
+                                          .muEdcaParameterSet = muEdcaParameterSet,
+                                          .scenario = scenario}),
+                TestCase::Duration::QUICK);
+            AddTestCase(
+                new OfdmaAckSequenceTest({.channelWidth = MHz_u{40},
+                                          .dlMuAckType = WifiAcknowledgment::DL_MU_AGGREGATE_TF,
+                                          .maxAmpduSize = 10000,
+                                          .txopLimit = 0,
+                                          .continueTxopAfterBsrp = false,
+                                          .skipMuRtsBeforeBsrp = true,
+                                          .protectedIfResponded = false,
+                                          .nPktsPerSta = 15,
+                                          .muEdcaParameterSet = muEdcaParameterSet,
+                                          .scenario = scenario}),
+                TestCase::Duration::QUICK);
+            AddTestCase(
+                new OfdmaAckSequenceTest({.channelWidth = MHz_u{40},
+                                          .dlMuAckType = WifiAcknowledgment::DL_MU_TF_MU_BAR,
+                                          .maxAmpduSize = 10000,
+                                          .txopLimit = 0,
+                                          .continueTxopAfterBsrp = true,
+                                          .skipMuRtsBeforeBsrp = false,
+                                          .protectedIfResponded = true,
+                                          .nPktsPerSta = 15,
+                                          .muEdcaParameterSet = muEdcaParameterSet,
+                                          .scenario = scenario}),
+                TestCase::Duration::QUICK);
         }
     }
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/test/wifi-mac-queue-test.cc ns-3.44/src/wifi/test/wifi-mac-queue-test.cc
--- ns-3.43/src/wifi/test/wifi-mac-queue-test.cc	2024-10-09 16:41:10.136656800 -0700
+++ ns-3.44/src/wifi/test/wifi-mac-queue-test.cc	2025-03-09 16:55:49.811372800 -0700
@@ -16,10 +16,10 @@
 using namespace ns3;
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test DROP_OLDEST setting.
+ * @brief Test DROP_OLDEST setting.
  *
  * This test verifies the correctness of DROP_OLDEST policy when packets
  * are pushed into the front of the queue. This case is not handled
@@ -29,7 +29,7 @@
 {
   public:
     /**
-     * \brief Constructor
+     * @brief Constructor
      */
     WifiMacQueueDropOldestTest();
 
@@ -112,10 +112,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test extraction of expired MPDUs from MAC queue container
+ * @brief Test extraction of expired MPDUs from MAC queue container
  *
  * This test verifies the correctness of the WifiMacQueueContainer methods
  * (ExtractExpiredMpdus and ExtractAllExpiredMpdus) that extract MPDUs with
@@ -132,9 +132,9 @@
     /**
      * Enqueue a new MPDU into the container.
      *
-     * \param rxAddr Receiver Address of the MPDU
-     * \param inflight whether the MPDU is inflight
-     * \param expiryTime the expity time for the MPDU
+     * @param rxAddr Receiver Address of the MPDU
+     * @param inflight whether the MPDU is inflight
+     * @param expiryTime the expity time for the MPDU
      */
     void Enqueue(Mac48Address rxAddr, bool inflight, Time expiryTime);
 
@@ -418,10 +418,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Wifi MAC Queue Test Suite
+ * @brief Wifi MAC Queue Test Suite
  */
 class WifiMacQueueTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/test/wifi-mlo-test.cc ns-3.44/src/wifi/test/wifi-mlo-test.cc
--- ns-3.43/src/wifi/test/wifi-mlo-test.cc	2024-10-09 16:41:10.136656800 -0700
+++ ns-3.44/src/wifi/test/wifi-mlo-test.cc	2025-03-09 16:55:49.811372800 -0700
@@ -71,11 +71,11 @@
 
     rnr.AddTbttInformationField(nbrId);
     tbttId = rnr.GetNTbttInformationFields(nbrId) - 1;
-    rnr.SetMldParameters(nbrId, tbttId, 0, 0, 0);
+    rnr.SetMldParameters(nbrId, tbttId, {0, 0, 0, 1, 1});
 
     rnr.AddTbttInformationField(nbrId);
     tbttId = rnr.GetNTbttInformationFields(nbrId) - 1;
-    rnr.SetMldParameters(nbrId, tbttId, 5, 0, 0);
+    rnr.SetMldParameters(nbrId, tbttId, {5, 0, 0, 1, 0});
 
     // Add a third Neighbor AP Information field with MLD Parameters; none of the
     // TBTT Information fields is related to an AP affiliated to the same AP MLD
@@ -85,11 +85,11 @@
 
     rnr.AddTbttInformationField(nbrId);
     tbttId = rnr.GetNTbttInformationFields(nbrId) - 1;
-    rnr.SetMldParameters(nbrId, tbttId, 3, 0, 0);
+    rnr.SetMldParameters(nbrId, tbttId, {3, 0, 0, 0, 1});
 
     rnr.AddTbttInformationField(nbrId);
     tbttId = rnr.GetNTbttInformationFields(nbrId) - 1;
-    rnr.SetMldParameters(nbrId, tbttId, 4, 0, 0);
+    rnr.SetMldParameters(nbrId, tbttId, {4, 0, 0, 0, 0});
 
     // Add a fourth Neighbor AP Information field with MLD Parameters; the first
     // TBTT Information field is not related to an AP affiliated to the same AP MLD
@@ -99,11 +99,11 @@
 
     rnr.AddTbttInformationField(nbrId);
     tbttId = rnr.GetNTbttInformationFields(nbrId) - 1;
-    rnr.SetMldParameters(nbrId, tbttId, 6, 0, 0);
+    rnr.SetMldParameters(nbrId, tbttId, {6, 0, 0, 1, 1});
 
     rnr.AddTbttInformationField(nbrId);
     tbttId = rnr.GetNTbttInformationFields(nbrId) - 1;
-    rnr.SetMldParameters(nbrId, tbttId, 0, 0, 0);
+    rnr.SetMldParameters(nbrId, tbttId, {0, 0, 0, 0, 0});
 
     // check implementation of WifiAssocManager::GetNextAffiliatedAp()
     auto ret = WifiAssocManager::GetNextAffiliatedAp(rnr, 0);
@@ -178,6 +178,7 @@
 
     std::vector<Ptr<WifiPhy>> phys;
     std::vector<Ptr<FrameExchangeManager>> feManagers;
+    std::vector<Ptr<WifiRemoteStationManager>> rsManagers;
 
     for (std::size_t i = 0; i < nLinks; ++i)
     {
@@ -185,9 +186,11 @@
         phy->SetPhyId(i);
         phys.emplace_back(phy);
         feManagers.emplace_back(CreateObject<TestFrameExchangeManager>());
+        rsManagers.emplace_back(CreateObject<TestRemoteStationManager>());
     }
     mac->SetWifiPhys(phys); // create links containing the given PHYs
     mac->SetFrameExchangeManagers(feManagers);
+    mac->SetWifiRemoteStationManagers(rsManagers);
     mac->GetTxop()->SetWifiMac(mac);
 
     // set CWmin of each Txop LinkEntity to the link ID, so that we can check where it has moved
@@ -220,6 +223,12 @@
             +linkId,
             text << ": Link ID stored by FrameExchangeManager has not been updated");
 
+        NS_TEST_EXPECT_MSG_EQ(
+            +DynamicCast<TestRemoteStationManager>(mac->GetWifiRemoteStationManager(linkId))
+                 ->GetLinkId(),
+            +linkId,
+            text << ": Link ID stored by RemoteStationManager has not been updated");
+
         NS_TEST_EXPECT_MSG_EQ(mac->GetTxop()->GetMinCw(linkId),
                               +phyId,
                               text << ": Txop Link entity " << +phyId
@@ -634,7 +643,7 @@
 MultiLinkOperationsTestBase::DoSetup()
 {
     RngSeedManager::SetSeed(1);
-    RngSeedManager::SetRun(3);
+    RngSeedManager::SetRun(5);
     int64_t streamNumber = 30;
 
     NodeContainer wifiApNode;
@@ -668,6 +677,8 @@
 
     WifiMacHelper mac;
     mac.SetType("ns3::StaWifiMac", // default SSID
+                "MaxMissedBeacons",
+                UintegerValue(1e6), // do not deassociate
                 "ActiveProbing",
                 BooleanValue(false));
 
@@ -797,6 +808,9 @@
         m_staMacs[aid]->SetSsid(Ssid("ns-3-ssid"));
         return;
     }
+    // stop generation of beacon frames in order to avoid interference
+    m_apMac->SetAttribute("BeaconGeneration", BooleanValue(false));
+
     // wait some time (5ms) to allow the completion of association before generating traffic
     Simulator::Schedule(MilliSeconds(5), &MultiLinkOperationsTestBase::StartTraffic, this);
 }
@@ -1103,7 +1117,7 @@
         NS_TEST_EXPECT_MSG_EQ(rnr->GetNTbttInformationFields(nbrApInfoId),
                               1,
                               "Expected only one TBTT Info subfield per Neighbor AP Info");
-        uint8_t nbrLinkId = rnr->GetLinkId(nbrApInfoId, 0);
+        uint8_t nbrLinkId = rnr->GetMldParameters(nbrApInfoId, 0).linkId;
         NS_TEST_EXPECT_MSG_EQ(rnr->GetBssid(nbrApInfoId, 0),
                               m_apMac->GetFrameExchangeManager(nbrLinkId)->GetAddress(),
                               "BSSID advertised in Neighbor AP Info field "
@@ -1162,7 +1176,7 @@
         NS_TEST_EXPECT_MSG_EQ(rnr->GetNTbttInformationFields(nbrApInfoId),
                               1,
                               "Expected only one TBTT Info subfield per Neighbor AP Info");
-        uint8_t nbrLinkId = rnr->GetLinkId(nbrApInfoId, 0);
+        uint8_t nbrLinkId = rnr->GetMldParameters(nbrApInfoId, 0).linkId;
         NS_TEST_EXPECT_MSG_EQ(rnr->GetBssid(nbrApInfoId, 0),
                               m_apMac->GetFrameExchangeManager(nbrLinkId)->GetAddress(),
                               "BSSID advertised in Neighbor AP Info field "
@@ -1439,12 +1453,12 @@
         const auto& apChannel = m_apMac->GetWifiPhy(apLinkId)->GetOperatingChannel();
 
         auto width = apChannel.GetTotalWidth();
-        auto primary20 = apChannel.GetPrimaryChannelIndex(20);
+        auto primary20 = apChannel.GetPrimaryChannelIndex(MHz_u{20});
 
-        if (width > 80 && !m_support160MHzOp)
+        if (width > MHz_u{80} && !m_support160MHzOp)
         {
-            width = 80;
-            primary20 -= apChannel.GetPrimaryChannelIndex(80) * 4;
+            width = MHz_u{80};
+            primary20 -= apChannel.GetPrimaryChannelIndex(MHz_u{80}) * 4;
         }
 
         NS_TEST_EXPECT_MSG_EQ(+staChannel.GetNumber(),
@@ -1460,7 +1474,7 @@
         NS_TEST_EXPECT_MSG_EQ(+staChannel.GetPhyBand(),
                               +apChannel.GetPhyBand(),
                               "Incorrect operating PHY band for STA on link " << +staLinkId);
-        NS_TEST_EXPECT_MSG_EQ(+staChannel.GetPrimaryChannelIndex(20),
+        NS_TEST_EXPECT_MSG_EQ(+staChannel.GetPrimaryChannelIndex(MHz_u{20}),
                               +primary20,
                               "Incorrect operating primary channel index for STA on link "
                                   << +staLinkId);
@@ -1592,9 +1606,9 @@
                                                                      << hdr.IsFromDs() << ")");
     }
 
-    if (width > 80 && !m_support160MHzOp)
+    if (width > MHz_u{80} && !m_support160MHzOp)
     {
-        width = 80;
+        width = MHz_u{80};
     }
     NS_TEST_EXPECT_MSG_EQ(txvector.GetChannelWidth(), width, "Unexpected TX width");
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/test/wifi-mlo-test.h ns-3.44/src/wifi/test/wifi-mlo-test.h
--- ns-3.43/src/wifi/test/wifi-mlo-test.h	2024-10-09 16:41:10.136656800 -0700
+++ ns-3.44/src/wifi/test/wifi-mlo-test.h	2025-03-09 16:55:49.811372800 -0700
@@ -10,6 +10,7 @@
 #define WIFI_MLO_TEST_H
 
 #include "ns3/ap-wifi-mac.h"
+#include "ns3/constant-rate-wifi-manager.h"
 #include "ns3/frame-exchange-manager.h"
 #include "ns3/mgt-action-headers.h"
 #include "ns3/mgt-headers.h"
@@ -28,10 +29,10 @@
 using namespace ns3;
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test the implementation of WifiAssocManager::GetNextAffiliatedAp(), which
+ * @brief Test the implementation of WifiAssocManager::GetNextAffiliatedAp(), which
  * searches a given RNR element for APs affiliated to the same AP MLD as the
  * reporting AP that sent the frame containing the element.
  */
@@ -49,8 +50,8 @@
 };
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
  * Test the WifiMac::SwapLinks() method.
  */
@@ -64,7 +65,7 @@
       public:
         ~TestWifiMac() override = default;
 
-        /// \return the object TypeId
+        /// @return the object TypeId
         static TypeId GetTypeId();
 
         using WifiMac::GetLinks;
@@ -91,7 +92,20 @@
     class TestFrameExchangeManager : public FrameExchangeManager
     {
       public:
-        /// \return the link ID stored by this object
+        /// @return the link ID stored by this object
+        uint8_t GetLinkId() const
+        {
+            return m_linkId;
+        }
+    };
+
+    /**
+     * Test RemoteStationManager subclass to access m_linkId
+     */
+    class TestRemoteStationManager : public ConstantRateWifiManager
+    {
+      public:
+        /// @return the link ID stored by this object
         uint8_t GetLinkId() const
         {
             return m_linkId;
@@ -109,11 +123,11 @@
     /**
      * Run a single test case.
      *
-     * \param text string identifying the test case
-     * \param nLinks the number of links of the MLD
-     * \param links a set of pairs (from, to) each mapping a current link ID to the
+     * @param text string identifying the test case
+     * @param nLinks the number of links of the MLD
+     * @param links a set of pairs (from, to) each mapping a current link ID to the
      *              link ID it has to become (i.e., link 'from' becomes link 'to')
-     * \param expected maps each link ID to the id of the PHY that is expected
+     * @param expected maps each link ID to the id of the PHY that is expected
      *                 to operate on that link after the swap
      */
     void RunOne(std::string text,
@@ -123,8 +137,8 @@
 };
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
  * Test that the AIDs that an AP MLD assigns to SLDs and MLDs are all unique.
  */
@@ -134,7 +148,7 @@
     /**
      * Constructor.
      *
-     * \param linkIds A vector specifying the set of link IDs each STA will setup
+     * @param linkIds A vector specifying the set of link IDs each STA will setup
      */
     AidAssignmentTest(const std::vector<std::set<uint8_t>>& linkIds);
 
@@ -146,7 +160,7 @@
      * Set the SSID on the next station that needs to start the association procedure.
      * This method is triggered every time a STA completes its association.
      *
-     * \param staMac the MAC of the STA that completed association
+     * @param staMac the MAC of the STA that completed association
      */
     void SetSsid(Ptr<StaWifiMac> staMac, Mac48Address /* apAddr */);
 
@@ -157,10 +171,10 @@
 };
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Base class for Multi-Link Operations tests
+ * @brief Base class for Multi-Link Operations tests
  *
  * Three spectrum channels are created, one for each band (2.4 GHz, 5 GHz and 6 GHz).
  * Each PHY object is attached to the spectrum channel corresponding to the PHY band
@@ -185,9 +199,9 @@
     /**
      * Constructor
      *
-     * \param name The name of the new TestCase created
-     * \param nStations the number of stations to create
-     * \param baseParams common configuration parameters
+     * @param name The name of the new TestCase created
+     * @param nStations the number of stations to create
+     * @param baseParams common configuration parameters
      */
     MultiLinkOperationsTestBase(const std::string& name,
                                 uint8_t nStations,
@@ -198,11 +212,11 @@
     /**
      * Callback invoked when a FEM passes PSDUs to the PHY.
      *
-     * \param mac the MAC transmitting the PSDUs
-     * \param phyId the ID of the PHY transmitting the PSDUs
-     * \param psduMap the PSDU map
-     * \param txVector the TX vector
-     * \param txPowerW the tx power in Watts
+     * @param mac the MAC transmitting the PSDUs
+     * @param phyId the ID of the PHY transmitting the PSDUs
+     * @param psduMap the PSDU map
+     * @param txVector the TX vector
+     * @param txPowerW the tx power in Watts
      */
     virtual void Transmit(Ptr<WifiMac> mac,
                           uint8_t phyId,
@@ -214,28 +228,28 @@
      * Check that the expected Capabilities information elements are present in the given
      * management frame based on the band in which the given link is operating.
      *
-     * \param mpdu the given management frame
-     * \param mac the MAC transmitting the management frame
-     * \param phyId the ID of the PHY transmitting the management frame
+     * @param mpdu the given management frame
+     * @param mac the MAC transmitting the management frame
+     * @param phyId the ID of the PHY transmitting the management frame
      */
     void CheckCapabilities(Ptr<WifiMpdu> mpdu, Ptr<WifiMac> mac, uint8_t phyId);
 
     /**
      * Function to trace packets received by the server application
-     * \param nodeId the ID of the node that received the packet
-     * \param p the packet
-     * \param addr the address
+     * @param nodeId the ID of the node that received the packet
+     * @param p the packet
+     * @param addr the address
      */
     virtual void L7Receive(uint8_t nodeId, Ptr<const Packet> p, const Address& addr);
 
     /**
-     * \param sockAddr the packet socket address identifying local outgoing interface
+     * @param sockAddr the packet socket address identifying local outgoing interface
      *                 and remote address
-     * \param count the number of packets to generate
-     * \param pktSize the size of the packets to generate
-     * \param delay the delay with which traffic generation starts
-     * \param priority user priority for generated packets
-     * \return an application generating the given number packets of the given size destined
+     * @param count the number of packets to generate
+     * @param pktSize the size of the packets to generate
+     * @param delay the delay with which traffic generation starts
+     * @param priority user priority for generated packets
+     * @return an application generating the given number packets of the given size destined
      *         to the given packet socket address
      */
     Ptr<PacketSocketClient> GetApplication(const PacketSocketAddress& sockAddr,
@@ -261,8 +275,8 @@
     /**
      * Check that the Address 1 and Address 2 fields of the given PSDU contain device MAC addresses.
      *
-     * \param psdu the given PSDU
-     * \param direction indicates direction for management frames (DL or UL)
+     * @param psdu the given PSDU
+     * @param direction indicates direction for management frames (DL or UL)
      */
     void CheckAddresses(Ptr<const WifiPsdu> psdu,
                         std::optional<Direction> direction = std::nullopt);
@@ -294,9 +308,9 @@
      * attribute of the PHY objects to create, and attach them to the given spectrum
      * channels appropriately.
      *
-     * \param helper the given PHY helper
-     * \param channels the strings specifying the operating channels to configure
-     * \param channelMap the created spectrum channels
+     * @param helper the given PHY helper
+     * @param channels the strings specifying the operating channels to configure
+     * @param channelMap the created spectrum channels
      */
     void SetChannels(SpectrumWifiPhyHelper& helper,
                      const std::vector<std::string>& channels,
@@ -307,7 +321,7 @@
      * This method is connected to the ApWifiMac's AssociatedSta trace source.
      * Start generating traffic (if needed) when all stations are associated.
      *
-     * \param aid the AID assigned to the previous associated STA
+     * @param aid the AID assigned to the previous associated STA
      */
     void SetSsid(uint16_t aid, Mac48Address /* addr */);
 
@@ -321,10 +335,10 @@
 };
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Multi-Link Discovery & Setup test.
+ * @brief Multi-Link Discovery & Setup test.
  *
  * This test sets up an AP MLD and a non-AP MLD having a variable number of links.
  * The RF channels to set each link to are provided as input parameters through the test
@@ -356,14 +370,14 @@
     /**
      * Constructor
      *
-     * \param baseParams common configuration parameters
-     * \param scanType the scan type (active or passive)
-     * \param setupLinks a list of links that are expected to be setup. In case one of the two
+     * @param baseParams common configuration parameters
+     * @param scanType the scan type (active or passive)
+     * @param setupLinks a list of links that are expected to be setup. In case one of the two
      *                   devices has a single link, the ID of the link on the MLD is indicated
-     * \param apNegSupport TID-to-Link Mapping negotiation supported by the AP MLD (0, 1, or 3)
-     * \param dlTidToLinkMapping DL TID-to-Link Mapping for EHT configuration of non-AP MLD
-     * \param ulTidToLinkMapping UL TID-to-Link Mapping for EHT configuration of non-AP MLD
-     * \param support160MHzOp whether non-AP MLDs support 160 MHz operations
+     * @param apNegSupport TID-to-Link Mapping negotiation supported by the AP MLD (0, 1, or 3)
+     * @param dlTidToLinkMapping DL TID-to-Link Mapping for EHT configuration of non-AP MLD
+     * @param ulTidToLinkMapping UL TID-to-Link Mapping for EHT configuration of non-AP MLD
+     * @param support160MHzOp whether non-AP MLDs support 160 MHz operations
      */
     MultiLinkSetupTest(const BaseParams& baseParams,
                        WifiScanType scanType,
@@ -396,32 +410,32 @@
     /**
      * Check correctness of the given Beacon frame.
      *
-     * \param mpdu the given Beacon frame
-     * \param linkId the ID of the link on which the Beacon frame was transmitted
+     * @param mpdu the given Beacon frame
+     * @param linkId the ID of the link on which the Beacon frame was transmitted
      */
     void CheckBeacon(Ptr<WifiMpdu> mpdu, uint8_t linkId);
 
     /**
      * Check correctness of the given Probe Response frame.
      *
-     * \param mpdu the given Probe Response frame
-     * \param linkId the ID of the link on which the Probe Response frame was transmitted
+     * @param mpdu the given Probe Response frame
+     * @param linkId the ID of the link on which the Probe Response frame was transmitted
      */
     void CheckProbeResponse(Ptr<WifiMpdu> mpdu, uint8_t linkId);
 
     /**
      * Check correctness of the given Association Request frame.
      *
-     * \param mpdu the given Association Request frame
-     * \param linkId the ID of the link on which the Association Request frame was transmitted
+     * @param mpdu the given Association Request frame
+     * @param linkId the ID of the link on which the Association Request frame was transmitted
      */
     void CheckAssocRequest(Ptr<WifiMpdu> mpdu, uint8_t linkId);
 
     /**
      * Check correctness of the given Association Response frame.
      *
-     * \param mpdu the given Association Response frame
-     * \param linkId the ID of the link on which the Association Response frame was transmitted
+     * @param mpdu the given Association Response frame
+     * @param linkId the ID of the link on which the Association Response frame was transmitted
      */
     void CheckAssocResponse(Ptr<WifiMpdu> mpdu, uint8_t linkId);
 
@@ -429,10 +443,10 @@
      * Check that QoS data frames are sent on links their TID is mapped to and with the
      * correct TX width.
      *
-     * \param mpdu the given QoS data frame
-     * \param txvector the TXVECTOR used to send the QoS data frame
-     * \param linkId the ID of the link on which the QoS data frame was transmitted
-     * \param index index of the QoS data frame in the vector of transmitted PSDUs
+     * @param mpdu the given QoS data frame
+     * @param txvector the TXVECTOR used to send the QoS data frame
+     * @param linkId the ID of the link on which the QoS data frame was transmitted
+     * @param index index of the QoS data frame in the vector of transmitted PSDUs
      */
     void CheckQosData(Ptr<WifiMpdu> mpdu,
                       const WifiTxVector& txvector,
@@ -492,10 +506,10 @@
 };
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test data transmission between two MLDs.
+ * @brief Test data transmission between two MLDs.
  *
  * This test sets up an AP MLD and two non-AP MLDs having a variable number of links.
  * The RF channels to set each link to are provided as input parameters through the test
@@ -525,11 +539,11 @@
     /**
      * Constructor
      *
-     * \param baseParams common configuration parameters
-     * \param trafficPattern the pattern of traffic to generate
-     * \param baEnabled whether BA agreement is enabled or disabled
-     * \param useBarAfterMissedBa whether a BAR or Data frames are sent after missed BlockAck
-     * \param nMaxInflight the max number of links on which an MPDU can be simultaneously inflight
+     * @param baseParams common configuration parameters
+     * @param trafficPattern the pattern of traffic to generate
+     * @param baEnabled whether BA agreement is enabled or disabled
+     * @param useBarAfterMissedBa whether a BAR or Data frames are sent after missed BlockAck
+     * @param nMaxInflight the max number of links on which an MPDU can be simultaneously inflight
      *                     (unused if Block Ack agreements are not established)
      */
     MultiLinkTxTest(const BaseParams& baseParams,
@@ -544,9 +558,9 @@
      * Check the content of a received BlockAck frame when the max number of links on which
      * an MPDU can be inflight is one.
      *
-     * \param psdu the PSDU containing the BlockAck
-     * \param txVector the TXVECTOR used to transmit the BlockAck
-     * \param linkId the ID of the link on which the BlockAck was transmitted
+     * @param psdu the PSDU containing the BlockAck
+     * @param txVector the TXVECTOR used to transmit the BlockAck
+     * @param linkId the ID of the link on which the BlockAck was transmitted
      */
     void CheckBlockAck(Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector, uint8_t linkId);
 
@@ -591,10 +605,10 @@
 };
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test data transmission between MLDs using OFDMA MU transmissions
+ * @brief Test data transmission between MLDs using OFDMA MU transmissions
  *
  * This test sets up an AP MLD and two non-AP MLDs having a variable number of links.
  * The RF channels to set each link to are provided as input parameters through the test
@@ -619,10 +633,10 @@
     /**
      * Constructor
      *
-     * \param baseParams common configuration parameters
-     * \param muTrafficPattern the pattern of traffic to generate
-     * \param useBarAfterMissedBa whether a BAR or Data frames are sent after missed BlockAck
-     * \param nMaxInflight the max number of links on which an MPDU can be simultaneously inflight
+     * @param baseParams common configuration parameters
+     * @param muTrafficPattern the pattern of traffic to generate
+     * @param useBarAfterMissedBa whether a BAR or Data frames are sent after missed BlockAck
+     * @param nMaxInflight the max number of links on which an MPDU can be simultaneously inflight
      *                     (unused if Block Ack agreements are not established)
      */
     MultiLinkMuTxTest(const BaseParams& baseParams,
@@ -636,9 +650,9 @@
      * Check the content of a received BlockAck frame when the max number of links on which
      * an MPDU can be inflight is one.
      *
-     * \param psdu the PSDU containing the BlockAck
-     * \param txVector the TXVECTOR used to transmit the BlockAck
-     * \param linkId the ID of the link on which the BlockAck was transmitted
+     * @param psdu the PSDU containing the BlockAck
+     * @param txVector the TXVECTOR used to transmit the BlockAck
+     * @param linkId the ID of the link on which the BlockAck was transmitted
      */
     void CheckBlockAck(Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector, uint8_t linkId);
 
@@ -679,10 +693,10 @@
 };
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test release of sequence numbers upon CTS timeout in multi-link operations
+ * @brief Test release of sequence numbers upon CTS timeout in multi-link operations
  *
  * In this test, an AP MLD and a non-AP MLD setup 3 links. Usage of RTS/CTS protection is
  * enabled for frames whose length is at least 1000 bytes. The AP MLD receives a first set
@@ -721,10 +735,10 @@
 };
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test update of BA starting sequence number after ADDBA Response timeout in
+ * @brief Test update of BA starting sequence number after ADDBA Response timeout in
  *        multi-link operations
  *
  * In this test, an AP MLD and a non-AP MLD setup 2 links. The AP MLD has a QoS data frame to
@@ -762,10 +776,10 @@
 };
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief wifi 11be MLD Test Suite
+ * @brief wifi 11be MLD Test Suite
  */
 class WifiMultiLinkOperationsTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/test/wifi-non-ht-dup-test.cc ns-3.44/src/wifi/test/wifi-non-ht-dup-test.cc
--- ns-3.43/src/wifi/test/wifi-non-ht-dup-test.cc	2024-10-09 16:41:10.136656800 -0700
+++ ns-3.44/src/wifi/test/wifi-non-ht-dup-test.cc	2025-03-09 16:55:49.811372800 -0700
@@ -41,7 +41,7 @@
 
 NS_LOG_COMPONENT_DEFINE("WifiNonHtDuplicateTest");
 
-constexpr MHz_u DEFAULT_FREQUENCY = 5180;
+constexpr MHz_u DEFAULT_FREQUENCY{5180};
 
 /**
  * HE PHY used for testing MU-RTS/CTS.
@@ -55,14 +55,14 @@
     /**
      * Set the previous TX PPDU UID counter.
      *
-     * \param uid the value to which the previous TX PPDU UID counter should be set
+     * @param uid the value to which the previous TX PPDU UID counter should be set
      */
     void SetPreviousTxPpduUid(uint64_t uid);
 
     /**
      * Set the TXVECTOR of the previously transmitted MU-RTS.
      *
-     * \param muRtsTxVector the TXVECTOR used to transmit MU-RTS trigger frame
+     * @param muRtsTxVector the TXVECTOR used to transmit MU-RTS trigger frame
      */
     void SetMuRtsTxVector(const WifiTxVector& muRtsTxVector);
 }; // class MuRtsCtsHePhy
@@ -99,8 +99,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -113,14 +113,14 @@
     /**
      * Set the global PPDU UID counter.
      *
-     * \param uid the value to which the global PPDU UID counter should be set
+     * @param uid the value to which the global PPDU UID counter should be set
      */
     void SetPpduUid(uint64_t uid);
 
     /**
      * Set the TXVECTOR of the previously transmitted MU-RTS.
      *
-     * \param muRtsTxVector the TXVECTOR used to transmit MU-RTS trigger frame
+     * @param muRtsTxVector the TXVECTOR used to transmit MU-RTS trigger frame
      */
     void SetMuRtsTxVector(const WifiTxVector& muRtsTxVector);
 
@@ -180,10 +180,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief non-HT duplicate PHY reception test
+ * @brief non-HT duplicate PHY reception test
  * The test consists in an AP sending a single non-HT duplicate PPDU
  * of a given channel width (multiple of 20 MHz) over a spectrum
  * channel and it checks whether the STAs attached to the channel
@@ -198,11 +198,11 @@
 
     /**
      * Constructor
-     * \param apStandard the standard to use for the AP
-     * \param apFrequency the center frequency of the AP
-     * \param apP20Index the index of the primary 20 MHz channel of the AP
-     * \param stasParams the parameters of the STAs (\see StasParams)
-     * \param per20MhzInterference flags per 20 MHz subchannel whether an interference should be
+     * @param apStandard the standard to use for the AP
+     * @param apFrequency the center frequency of the AP
+     * @param apP20Index the index of the primary 20 MHz channel of the AP
+     * @param stasParams the parameters of the STAs (\see StasParams)
+     * @param per20MhzInterference flags per 20 MHz subchannel whether an interference should be
      * generated on that subchannel. An empty vector means that the test will not generate any
      * interference.
      */
@@ -219,30 +219,30 @@
 
     /**
      * Receive success function
-     * \param index index of the RX STA
-     * \param psdu the PSDU
-     * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
-     * \param txVector the transmit vector
-     * \param statusPerMpdu reception status per MPDU
+     * @param index index of the RX STA
+     * @param psdu the PSDU
+     * @param rxSignalInfo the info on the received signal (\see RxSignalInfo)
+     * @param txVector the transmit vector
+     * @param statusPerMpdu reception status per MPDU
      */
     void RxSuccess(std::size_t index,
                    Ptr<const WifiPsdu> psdu,
                    RxSignalInfo rxSignalInfo,
-                   WifiTxVector txVector,
-                   std::vector<bool> statusPerMpdu);
+                   const WifiTxVector& txVector,
+                   const std::vector<bool>& statusPerMpdu);
 
     /**
      * Receive failure function
-     * \param index index of the RX STA
-     * \param psdu the PSDU
+     * @param index index of the RX STA
+     * @param psdu the PSDU
      */
     void RxFailure(std::size_t index, Ptr<const WifiPsdu> psdu);
 
     /**
      * Check the results
-     * \param index index of the RX STA
-     * \param expectedRxSuccess the expected number of RX success
-     * \param expectedRxFailure the expected number of RX failures
+     * @param index index of the RX STA
+     * @param expectedRxSuccess the expected number of RX success
+     * @param expectedRxFailure the expected number of RX failures
      */
     void CheckResults(std::size_t index, uint32_t expectedRxSuccess, uint32_t expectedRxFailure);
 
@@ -253,22 +253,22 @@
 
     /**
      * Send non-HT duplicate PPDU function
-     * \param channelWidth the channel width to use to transmit the non-HT PPDU
+     * @param channelWidth the channel width to use to transmit the non-HT PPDU
      */
     void SendNonHtDuplicatePpdu(MHz_u channelWidth);
 
     /**
      * Generate interference function
-     * \param interferer the PHY of the interferer to use to generate the signal
-     * \param interferencePsd the PSD of the interference to be generated
-     * \param duration the duration of the interference
+     * @param interferer the PHY of the interferer to use to generate the signal
+     * @param interferencePsd the PSD of the interference to be generated
+     * @param duration the duration of the interference
      */
     void GenerateInterference(Ptr<WaveformGenerator> interferer,
                               Ptr<SpectrumValue> interferencePsd,
                               Time duration);
     /**
      * Stop interference function
-     * \param interferer the PHY of the interferer that was used to generate the signal
+     * @param interferer the PHY of the interferer that was used to generate the signal
      */
     void StopInterference(Ptr<WaveformGenerator> interferer);
 
@@ -343,7 +343,7 @@
 
     Ptr<WifiPsdu> psdu = Create<WifiPsdu>(pkt, hdr);
     Time txDuration =
-        m_phyAp->CalculateTxDuration(psdu->GetSize(), txVector, m_phyAp->GetPhyBand());
+        SpectrumWifiPhy::CalculateTxDuration(psdu->GetSize(), txVector, m_phyAp->GetPhyBand());
 
     m_phyAp->Send(WifiConstPsduMap({std::make_pair(SU_STA_ID, psdu)}), txVector);
 }
@@ -374,8 +374,8 @@
 TestNonHtDuplicatePhyReception::RxSuccess(std::size_t index,
                                           Ptr<const WifiPsdu> psdu,
                                           RxSignalInfo rxSignalInfo,
-                                          WifiTxVector txVector,
-                                          std::vector<bool> /*statusPerMpdu*/)
+                                          const WifiTxVector& txVector,
+                                          const std::vector<bool>& /*statusPerMpdu*/)
 {
     NS_LOG_FUNCTION(this << index << *psdu << rxSignalInfo << txVector);
     const auto expectedWidth =
@@ -414,7 +414,7 @@
 {
     auto spectrumChannel = CreateObject<MultiModelSpectrumChannel>();
     auto lossModel = CreateObject<FriisPropagationLossModel>();
-    lossModel->SetFrequency(m_apFrequency * 1e6);
+    lossModel->SetFrequency(MHzToHz(m_apFrequency));
     spectrumChannel->AddPropagationLossModel(lossModel);
     auto delayModel = CreateObject<ConstantSpeedPropagationDelayModel>();
     spectrumChannel->SetPropagationDelayModel(delayModel);
@@ -465,11 +465,10 @@
     {
         const auto& channelInfo = (*WifiPhyOperatingChannel::FindFirst(0,
                                                                        m_apFrequency,
-                                                                       0,
+                                                                       MHz_u{0},
                                                                        m_apStandard,
                                                                        WIFI_PHY_BAND_5GHZ));
-        [[maybe_unused]] const std::size_t num20MhzSubchannels = channelInfo.width / 20;
-        NS_ASSERT(m_per20MhzInterference.size() == num20MhzSubchannels);
+        NS_ASSERT(m_per20MhzInterference.size() == Count20MHzSubchannels(channelInfo.width));
         for (std::size_t i = 0; i < m_per20MhzInterference.size(); ++i)
         {
             auto interfererNode = CreateObject<Node>();
@@ -515,7 +514,7 @@
 
     const auto& apchannelInfo = (*WifiPhyOperatingChannel::FindFirst(0,
                                                                      m_apFrequency,
-                                                                     0,
+                                                                     MHz_u{0},
                                                                      m_apStandard,
                                                                      WIFI_PHY_BAND_5GHZ));
     m_phyAp->SetOperatingChannel(WifiPhy::ChannelTuple{apchannelInfo.number,
@@ -528,7 +527,7 @@
     {
         const auto& stachannelInfo = (*WifiPhyOperatingChannel::FindFirst(0,
                                                                           staFrequency,
-                                                                          0,
+                                                                          MHz_u{0},
                                                                           staStandard,
                                                                           WIFI_PHY_BAND_5GHZ));
         m_phyStas.at(index++)->SetOperatingChannel(WifiPhy::ChannelTuple{stachannelInfo.number,
@@ -539,8 +538,8 @@
 
     index = 0;
     const auto minApCenterFrequency =
-        m_phyAp->GetFrequency() - (m_phyAp->GetChannelWidth() / 2) + (20 / 2);
-    for (auto channelWidth = 20; channelWidth <= apchannelInfo.width; channelWidth *= 2, ++index)
+        m_phyAp->GetFrequency() - (m_phyAp->GetChannelWidth() / 2) + (MHz_u{20} / 2);
+    for (MHz_u channelWidth{20}; channelWidth <= apchannelInfo.width; channelWidth *= 2, ++index)
     {
         if (!m_phyInterferers.empty())
         {
@@ -551,15 +550,15 @@
                     continue;
                 }
                 BandInfo bandInfo;
-                bandInfo.fc = (minApCenterFrequency + (i * 20)) * 1e6;
-                bandInfo.fl = bandInfo.fc - (5 * 1e6);
-                bandInfo.fh = bandInfo.fc + (5 * 1e6);
+                bandInfo.fc = MHzToHz(minApCenterFrequency + (i * MHz_u{20}));
+                bandInfo.fl = bandInfo.fc - MHzToHz(5);
+                bandInfo.fh = bandInfo.fc + MHzToHz(5);
                 Bands bands;
                 bands.push_back(bandInfo);
                 auto spectrumInterference = Create<SpectrumModel>(bands);
                 auto interferencePsd = Create<SpectrumValue>(spectrumInterference);
-                Watt_u interferencePower = 0.005; // designed to make PHY headers reception
-                                                  // successful but payload reception fail
+                Watt_u interferencePower{0.005}; // designed to make PHY headers reception
+                                                 // successful but payload reception fail
                 *interferencePsd = interferencePower / 10e6;
                 Simulator::Schedule(Seconds(index),
                                     &TestNonHtDuplicatePhyReception::GenerateInterference,
@@ -579,7 +578,7 @@
                             channelWidth);
         for (std::size_t i = 0; i < m_stasParams.size(); ++i)
         {
-            const auto p20Width = 20;
+            const MHz_u p20Width{20};
             const auto staP20Freq =
                 m_phyStas.at(i)->GetOperatingChannel().GetPrimaryChannelCenterFrequency(p20Width);
             const auto staP20MinFreq = staP20Freq - (p20Width / 2);
@@ -588,7 +587,8 @@
             bool expectSuccess = true;
             if (!m_per20MhzInterference.empty())
             {
-                const auto index20MhzSubBand = ((staP20Freq - minApCenterFrequency) / 20);
+                const auto index20MhzSubBand =
+                    Count20MHzSubchannels(staP20Freq - minApCenterFrequency);
                 expectSuccess = !m_per20MhzInterference.at(index20MhzSubBand);
             }
             Simulator::Schedule(Seconds(index + 0.5),
@@ -608,10 +608,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief test PHY reception of multiple CTS frames as a response to a MU-RTS frame.
+ * @brief test PHY reception of multiple CTS frames as a response to a MU-RTS frame.
  * The test is checking whether the reception of multiple identical CTS frames as a response to a
  * MU-RTS frame is successfully received by the AP PHY and that only a single CTS frame is forwarded
  * up to the MAC. Since the test is focusing on the PHY reception of multiple CTS response, the
@@ -632,7 +632,7 @@
 
     /**
      * Constructor
-     * \param ctsTxInfosPerSta the information about CTS responses to generate
+     * @param ctsTxInfosPerSta the information about CTS responses to generate
      */
     TestMultipleCtsResponsesFromMuRts(const std::vector<CtsTxInfos>& ctsTxInfosPerSta);
 
@@ -649,28 +649,28 @@
     /**
      * Function called to trigger a CTS frame sent by a STA using non-HT duplicate.
      *
-     * \param phyIndex the index of the TX PHY
+     * @param phyIndex the index of the TX PHY
      */
     void TxNonHtDuplicateCts(std::size_t phyIndex);
 
     /**
      * CTS RX success function
-     * \param phyIndex the index of the PHY (0 for AP)
-     * \param psdu the PSDU
-     * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
-     * \param txVector the transmit vector
-     * \param statusPerMpdu reception status per MPDU
+     * @param phyIndex the index of the PHY (0 for AP)
+     * @param psdu the PSDU
+     * @param rxSignalInfo the info on the received signal (\see RxSignalInfo)
+     * @param txVector the transmit vector
+     * @param statusPerMpdu reception status per MPDU
      */
     void RxCtsSuccess(std::size_t phyIndex,
                       Ptr<const WifiPsdu> psdu,
                       RxSignalInfo rxSignalInfo,
-                      WifiTxVector txVector,
-                      std::vector<bool> statusPerMpdu);
+                      const WifiTxVector& txVector,
+                      const std::vector<bool>& statusPerMpdu);
 
     /**
      * CTS RX failure function
-     * \param phyIndex the index of the PHY (0 for AP)
-     * \param psdu the PSDU
+     * @param phyIndex the index of the PHY (0 for AP)
+     * @param psdu the PSDU
      */
     void RxCtsFailure(std::size_t phyIndex, Ptr<const WifiPsdu> psdu);
 
@@ -704,7 +704,7 @@
       m_countApRxCtsFailure{0},
       m_countStaRxCtsSuccess{0},
       m_countStaRxCtsFailure{0},
-      m_stasTxPower(10.0)
+      m_stasTxPower(dBm_u{10})
 {
 }
 
@@ -775,8 +775,8 @@
 TestMultipleCtsResponsesFromMuRts::RxCtsSuccess(std::size_t phyIndex,
                                                 Ptr<const WifiPsdu> psdu,
                                                 RxSignalInfo rxSignalInfo,
-                                                WifiTxVector txVector,
-                                                std::vector<bool> /*statusPerMpdu*/)
+                                                const WifiTxVector& txVector,
+                                                const std::vector<bool>& /*statusPerMpdu*/)
 {
     NS_LOG_FUNCTION(this << phyIndex << *psdu << rxSignalInfo << txVector);
     std::vector<CtsTxInfos> successfulCtsInfos{};
@@ -857,7 +857,7 @@
 
     auto spectrumChannel = CreateObject<MultiModelSpectrumChannel>();
     auto lossModel = CreateObject<FriisPropagationLossModel>();
-    lossModel->SetFrequency(DEFAULT_FREQUENCY * 1e6);
+    lossModel->SetFrequency(MHzToHz(DEFAULT_FREQUENCY));
     spectrumChannel->AddPropagationLossModel(lossModel);
     auto delayModel = CreateObject<ConstantSpeedPropagationDelayModel>();
     spectrumChannel->SetPropagationDelayModel(delayModel);
@@ -890,9 +890,12 @@
                          m_ctsTxInfosPerSta.cend(),
                          [](const auto& lhs, const auto& rhs) { return lhs.bw < rhs.bw; })
             ->bw;
-    auto apChannelNum =
-        WifiPhyOperatingChannel::FindFirst(0, 0, apBw, WIFI_STANDARD_80211ac, WIFI_PHY_BAND_5GHZ)
-            ->number;
+    auto apChannelNum = WifiPhyOperatingChannel::FindFirst(0,
+                                                           MHz_u{0},
+                                                           apBw,
+                                                           WIFI_STANDARD_80211ac,
+                                                           WIFI_PHY_BAND_5GHZ)
+                            ->number;
 
     m_phyAp->SetOperatingChannel(WifiPhy::ChannelTuple{apChannelNum, apBw, WIFI_PHY_BAND_5GHZ, 0});
 
@@ -922,7 +925,7 @@
         phySta->SetTxPowerEnd(m_stasTxPower);
 
         auto channelNum = WifiPhyOperatingChannel::FindFirst(0,
-                                                             0,
+                                                             MHz_u{0},
                                                              m_ctsTxInfosPerSta.at(i).bw,
                                                              WIFI_STANDARD_80211ac,
                                                              WIFI_PHY_BAND_5GHZ)
@@ -1009,13 +1012,13 @@
 TestMultipleCtsResponsesFromMuRts::DoRun()
 {
     // Fake transmission of a MU-RTS frame preceding the CTS responses
-    Simulator::Schedule(Seconds(0.0), &TestMultipleCtsResponsesFromMuRts::FakePreviousMuRts, this);
+    Simulator::Schedule(Seconds(0), &TestMultipleCtsResponsesFromMuRts::FakePreviousMuRts, this);
 
     for (std::size_t index = 0; index < m_phyStas.size(); ++index)
     {
         // Transmit CTS responses over their operating bandwidth with 1 nanosecond delay between
         // each other
-        const auto delay = (index + 1) * NanoSeconds(1.0);
+        const auto delay = (index + 1) * NanoSeconds(1);
         Simulator::Schedule(delay,
                             &TestMultipleCtsResponsesFromMuRts::TxNonHtDuplicateCts,
                             this,
@@ -1024,17 +1027,17 @@
 
     // Verify successful reception of the CTS frames: since multiple copies are sent
     // simultaneously, a single CTS frame should be forwarded up to the MAC.
-    Simulator::Schedule(Seconds(1.0), &TestMultipleCtsResponsesFromMuRts::CheckResults, this);
+    Simulator::Schedule(Seconds(1), &TestMultipleCtsResponsesFromMuRts::CheckResults, this);
 
     Simulator::Run();
     Simulator::Destroy();
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief wifi non-HT duplicate Test Suite
+ * @brief wifi non-HT duplicate Test Suite
  */
 class WifiNonHtDuplicateTestSuite : public TestSuite
 {
@@ -1080,57 +1083,63 @@
      *                └────────┘       └──────────────────────┘
      */
     AddTestCase(new TestNonHtDuplicatePhyReception(WIFI_STANDARD_80211ax,
-                                                   5210,
+                                                   MHz_u{5210},
                                                    0,
-                                                   {{WIFI_STANDARD_80211a, 5180, 0},
-                                                    {WIFI_STANDARD_80211n, 5200, 0},
-                                                    {WIFI_STANDARD_80211ac, 5230, 0}}),
+                                                   {{WIFI_STANDARD_80211a, MHz_u{5180}, 0},
+                                                    {WIFI_STANDARD_80211n, MHz_u{5200}, 0},
+                                                    {WIFI_STANDARD_80211ac, MHz_u{5230}, 0}}),
                 TestCase::Duration::QUICK);
     /* same channel map and test scenario as previously but inject interference on channel 40 */
     AddTestCase(new TestNonHtDuplicatePhyReception(WIFI_STANDARD_80211ax,
-                                                   5210,
+                                                   MHz_u{5210},
                                                    0,
-                                                   {{WIFI_STANDARD_80211a, 5180, 0},
-                                                    {WIFI_STANDARD_80211n, 5200, 0},
-                                                    {WIFI_STANDARD_80211ac, 5230, 0}},
+                                                   {{WIFI_STANDARD_80211a, MHz_u{5180}, 0},
+                                                    {WIFI_STANDARD_80211n, MHz_u{5200}, 0},
+                                                    {WIFI_STANDARD_80211ac, MHz_u{5230}, 0}},
                                                    {false, true, false, false}),
                 TestCase::Duration::QUICK);
     /* test PHY reception of multiple CTS responses following a MU-RTS */
     /* 4 STAs operating on 20 MHz */
-    AddTestCase(new TestMultipleCtsResponsesFromMuRts({{20}, {20}, {20}, {20}}),
-                TestCase::Duration::QUICK);
+    AddTestCase(
+        new TestMultipleCtsResponsesFromMuRts({{MHz_u{20}}, {MHz_u{20}}, {MHz_u{20}}, {MHz_u{20}}}),
+        TestCase::Duration::QUICK);
     /* 4 STAs operating on 40 MHz */
-    AddTestCase(new TestMultipleCtsResponsesFromMuRts({{40}, {40}, {40}, {40}}),
-                TestCase::Duration::QUICK);
+    AddTestCase(
+        new TestMultipleCtsResponsesFromMuRts({{MHz_u{40}}, {MHz_u{40}}, {MHz_u{40}}, {MHz_u{40}}}),
+        TestCase::Duration::QUICK);
     /* 4 STAs operating on 80 MHz */
-    AddTestCase(new TestMultipleCtsResponsesFromMuRts({{80}, {80}, {80}, {80}}),
-                TestCase::Duration::QUICK);
+    AddTestCase(
+        new TestMultipleCtsResponsesFromMuRts({{MHz_u{80}}, {MHz_u{80}}, {MHz_u{80}}, {MHz_u{80}}}),
+        TestCase::Duration::QUICK);
     /* 4 STAs operating on 160 MHz */
-    AddTestCase(new TestMultipleCtsResponsesFromMuRts({{160}, {160}, {160}, {160}}),
+    AddTestCase(new TestMultipleCtsResponsesFromMuRts(
+                    {{MHz_u{160}}, {MHz_u{160}}, {MHz_u{160}}, {MHz_u{160}}}),
                 TestCase::Duration::QUICK);
     /* 4 STAs operating on different bandwidths with PPDUs sent with decreasing BW: 160, 80, 40 and
      * 20 MHz */
-    AddTestCase(new TestMultipleCtsResponsesFromMuRts({{160}, {80}, {40}, {20}}),
+    AddTestCase(new TestMultipleCtsResponsesFromMuRts(
+                    {{MHz_u{160}}, {MHz_u{80}}, {MHz_u{40}}, {MHz_u{20}}}),
                 TestCase::Duration::QUICK);
     /* 4 STAs operating on different bandwidths with PPDUs sent with increasing BW: 20, 40, 80 and
      * 160 MHz */
-    AddTestCase(new TestMultipleCtsResponsesFromMuRts({{20}, {40}, {80}, {160}}),
+    AddTestCase(new TestMultipleCtsResponsesFromMuRts(
+                    {{MHz_u{20}}, {MHz_u{40}}, {MHz_u{80}}, {MHz_u{160}}}),
                 TestCase::Duration::QUICK);
     /* 2 STAs operating on different bandwidths with PPDUs sent with decreasing BW but the first STA
      * does not respond */
-    AddTestCase(new TestMultipleCtsResponsesFromMuRts({{80, true}, {40, false}}),
+    AddTestCase(new TestMultipleCtsResponsesFromMuRts({{MHz_u{80}, true}, {MHz_u{40}, false}}),
                 TestCase::Duration::QUICK);
     /* 2 STAs operating on different bandwidths with PPDUs sent with decreasing BW but the second
      * STA does not respond */
-    AddTestCase(new TestMultipleCtsResponsesFromMuRts({{80, false}, {40, true}}),
+    AddTestCase(new TestMultipleCtsResponsesFromMuRts({{MHz_u{80}, false}, {MHz_u{40}, true}}),
                 TestCase::Duration::QUICK);
     /* 2 STAs operating on different bandwidths with PPDUs sent with increasing BW but the first STA
      * does not respond */
-    AddTestCase(new TestMultipleCtsResponsesFromMuRts({{40, true}, {80, false}}),
+    AddTestCase(new TestMultipleCtsResponsesFromMuRts({{MHz_u{40}, true}, {MHz_u{80}, false}}),
                 TestCase::Duration::QUICK);
     /* 2 STAs operating on different bandwidths with PPDUs sent with increasing BW but the second
      * STA does not respond */
-    AddTestCase(new TestMultipleCtsResponsesFromMuRts({{40, false}, {80, true}}),
+    AddTestCase(new TestMultipleCtsResponsesFromMuRts({{MHz_u{40}, false}, {MHz_u{80}, true}}),
                 TestCase::Duration::QUICK);
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/test/wifi-operating-channel-test.cc ns-3.44/src/wifi/test/wifi-operating-channel-test.cc
--- ns-3.43/src/wifi/test/wifi-operating-channel-test.cc	2024-10-09 16:41:10.140657000 -0700
+++ ns-3.44/src/wifi/test/wifi-operating-channel-test.cc	2025-03-09 16:55:49.811372800 -0700
@@ -26,10 +26,10 @@
 NS_LOG_COMPONENT_DEFINE("WifiOperatingChannelTest");
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test the WifiPhyOperatingChannel::Set() method.
+ * @brief Test the WifiPhyOperatingChannel::Set() method.
  */
 class SetWifiOperatingChannelTest : public TestCase
 {
@@ -45,13 +45,13 @@
 
     /**
      * Run one function.
-     * \param runInfo the string that indicates info about the test case to run
-     * \param segments the info about each frequency segment to set for the operating channel
-     * \param standard the 802.11 standard to consider for the test
-     * \param band the PHY band to consider for the test
-     * \param expectExceptionThrown flag to indicate whether an exception is expected to be thrown
-     * \param expectedWidth the expected width type of the operating channel
-     * \param expectedSegments the info about the expected frequency segments of the operating
+     * @param runInfo the string that indicates info about the test case to run
+     * @param segments the info about each frequency segment to set for the operating channel
+     * @param standard the 802.11 standard to consider for the test
+     * @param band the PHY band to consider for the test
+     * @param expectExceptionThrown flag to indicate whether an exception is expected to be thrown
+     * @param expectedWidth the expected width type of the operating channel
+     * @param expectedSegments the info about the expected frequency segments of the operating
      * channel
      */
     void RunOne(const std::string& runInfo,
@@ -134,92 +134,99 @@
            true);
 
     RunOne("default 20 MHz OFDM channel operating on channel 36",
-           {{36, 0, 20, WIFI_PHY_BAND_5GHZ}},
+           {{36, MHz_u{0}, MHz_u{20}, WIFI_PHY_BAND_5GHZ}},
            WIFI_STANDARD_UNSPECIFIED,
            WIFI_PHY_BAND_UNSPECIFIED,
            false,
            WifiChannelWidthType::CW_20MHZ,
-           {{36, 5180, 20, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM}});
+           {{36, MHz_u{5180}, MHz_u{20}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM}});
 
     RunOne("default 40 MHz OFDM channel operating on channel 38",
-           {{38, 0, 40, WIFI_PHY_BAND_5GHZ}},
+           {{38, MHz_u{0}, MHz_u{40}, WIFI_PHY_BAND_5GHZ}},
            WIFI_STANDARD_UNSPECIFIED,
            WIFI_PHY_BAND_UNSPECIFIED,
            false,
            WifiChannelWidthType::CW_40MHZ,
-           {{38, 5190, 40, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM}});
+           {{38, MHz_u{5190}, MHz_u{40}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM}});
 
     RunOne("default 80 MHz OFDM channel operating on channel 42",
-           {{42, 0, 80, WIFI_PHY_BAND_5GHZ}},
+           {{42, MHz_u{0}, MHz_u{80}, WIFI_PHY_BAND_5GHZ}},
            WIFI_STANDARD_UNSPECIFIED,
            WIFI_PHY_BAND_UNSPECIFIED,
            false,
            WifiChannelWidthType::CW_80MHZ,
-           {{42, 5210, 80, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM}});
+           {{42, MHz_u{5210}, MHz_u{80}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM}});
 
     RunOne("default 160 MHz (contiguous) OFDM channel operating on channel 50",
-           {{50, 0, 160, WIFI_PHY_BAND_5GHZ}},
+           {{50, MHz_u{0}, MHz_u{160}, WIFI_PHY_BAND_5GHZ}},
            WIFI_STANDARD_UNSPECIFIED,
            WIFI_PHY_BAND_UNSPECIFIED,
            false,
            WifiChannelWidthType::CW_160MHZ,
-           {{50, 5250, 160, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM}});
+           {{50, MHz_u{5250}, MHz_u{160}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM}});
 
     RunOne("valid 80+80 MHz (non-contiguous) OFDM channel operating on channels 42 and 106",
-           {{42, 0, 80, WIFI_PHY_BAND_5GHZ}, {106, 0, 80, WIFI_PHY_BAND_5GHZ}},
+           {{42, MHz_u{0}, MHz_u{80}, WIFI_PHY_BAND_5GHZ},
+            {106, MHz_u{0}, MHz_u{80}, WIFI_PHY_BAND_5GHZ}},
            WIFI_STANDARD_UNSPECIFIED,
            WIFI_PHY_BAND_UNSPECIFIED,
            false,
            WifiChannelWidthType::CW_80_PLUS_80MHZ,
-           {{42, 5210, 80, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
-            {106, 5530, 80, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM}});
+           {{42, MHz_u{5210}, MHz_u{80}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM},
+            {106, MHz_u{5530}, MHz_u{80}, WIFI_PHY_BAND_5GHZ, FrequencyChannelType::OFDM}});
 
     RunOne("invalid 80+80 MHz (non-contiguous) OFDM channel higher channel not being 80 MHz",
-           {{42, 0, 80, WIFI_PHY_BAND_5GHZ}, {102, 0, 80, WIFI_PHY_BAND_5GHZ}},
+           {{42, MHz_u{0}, MHz_u{80}, WIFI_PHY_BAND_5GHZ},
+            {102, MHz_u{0}, MHz_u{80}, WIFI_PHY_BAND_5GHZ}},
            WIFI_STANDARD_UNSPECIFIED,
            WIFI_PHY_BAND_UNSPECIFIED,
            true);
 
     RunOne("invalid 80+80 MHz (non-contiguous) OFDM channel lower channel not being 80 MHz",
-           {{36, 0, 20, WIFI_PHY_BAND_5GHZ}, {106, 0, 80, WIFI_PHY_BAND_5GHZ}},
+           {{36, MHz_u{0}, MHz_u{20}, WIFI_PHY_BAND_5GHZ},
+            {106, MHz_u{0}, MHz_u{80}, WIFI_PHY_BAND_5GHZ}},
            WIFI_STANDARD_UNSPECIFIED,
            WIFI_PHY_BAND_UNSPECIFIED,
            true);
 
     RunOne("invalid 80+80 MHz (non-contiguous) OFDM channel with both segments configured on the "
            "same channel",
-           {{42, 0, 80, WIFI_PHY_BAND_5GHZ}, {42, 0, 80, WIFI_PHY_BAND_5GHZ}},
+           {{42, MHz_u{0}, MHz_u{80}, WIFI_PHY_BAND_5GHZ},
+            {42, MHz_u{0}, MHz_u{80}, WIFI_PHY_BAND_5GHZ}},
            WIFI_STANDARD_UNSPECIFIED,
            WIFI_PHY_BAND_UNSPECIFIED,
            true);
 
     RunOne("invalid 80+80 MHz (non-contiguous) OFDM channel with segments configured to be "
            "contiguous (lower before higher)",
-           {{42, 0, 80, WIFI_PHY_BAND_5GHZ}, {58, 0, 80, WIFI_PHY_BAND_5GHZ}},
+           {{42, MHz_u{0}, MHz_u{80}, WIFI_PHY_BAND_5GHZ},
+            {58, MHz_u{0}, MHz_u{80}, WIFI_PHY_BAND_5GHZ}},
            WIFI_STANDARD_UNSPECIFIED,
            WIFI_PHY_BAND_UNSPECIFIED,
            true);
 
     RunOne("invalid 80+80 MHz (non-contiguous) OFDM channel with segments configured to be "
            "contiguous (higher before lower)",
-           {{58, 0, 80, WIFI_PHY_BAND_5GHZ}, {42, 0, 80, WIFI_PHY_BAND_5GHZ}},
+           {{58, MHz_u{0}, MHz_u{80}, WIFI_PHY_BAND_5GHZ},
+            {42, MHz_u{0}, MHz_u{80}, WIFI_PHY_BAND_5GHZ}},
            WIFI_STANDARD_UNSPECIFIED,
            WIFI_PHY_BAND_UNSPECIFIED,
            true);
 
     RunOne("invalid 80+80 MHz (non-contiguous) OFDM channel with each segments configured on a "
            "different band",
-           {{42, 0, 80, WIFI_PHY_BAND_5GHZ}, {215, 0, 80, WIFI_PHY_BAND_6GHZ}},
+           {{42, MHz_u{0}, MHz_u{80}, WIFI_PHY_BAND_5GHZ},
+            {215, MHz_u{0}, MHz_u{80}, WIFI_PHY_BAND_6GHZ}},
            WIFI_STANDARD_UNSPECIFIED,
            WIFI_PHY_BAND_UNSPECIFIED,
            true);
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test the conversion from PHY ChannelSettings attribute to WifiPhyOperatingChannel.
+ * @brief Test the conversion from PHY ChannelSettings attribute to WifiPhyOperatingChannel.
  */
 class PhyChannelSettingsToOperatingChannelTest : public TestCase
 {
@@ -237,10 +244,10 @@
 
     /**
      * Run one function.
-     * \param channelSettings the string to set the ChannelSettings attribute
-     * \param expectedWidthType the expected width type of the operating channel
-     * \param expectedSegments the info about each expected segment of the operating channel
-     * \param expectedP20Index the expected index of the P20
+     * @param channelSettings the string to set the ChannelSettings attribute
+     * @param expectedWidthType the expected width type of the operating channel
+     * @param expectedSegments the info about each expected segment of the operating channel
+     * @param expectedP20Index the expected index of the P20
      */
     void RunOne(const std::string& channelSettings,
                 WifiChannelWidthType expectedWidthType,
@@ -340,7 +347,7 @@
                                   << channelSettings);
     }
 
-    NS_TEST_ASSERT_MSG_EQ(m_phy->GetOperatingChannel().GetPrimaryChannelIndex(20),
+    NS_TEST_ASSERT_MSG_EQ(m_phy->GetOperatingChannel().GetPrimaryChannelIndex(MHz_u{20}),
                           expectedP20Index,
                           "Operating channel has an incorrect P20 index for channel settings "
                               << channelSettings);
@@ -355,19 +362,21 @@
     // Test default with a single frequency segment
     RunOne("{0, 0, BAND_UNSPECIFIED, 0}",
            WifiChannelWidthType::CW_80MHZ,
-           {{42, 5210, 80, WIFI_PHY_BAND_5GHZ}},
+           {{42, MHz_u{5210}, MHz_u{80}, WIFI_PHY_BAND_5GHZ}},
            0);
 
     // Test default with two frequency segments unspecified
     RunOne("{0, 0, BAND_UNSPECIFIED, 0};{0, 0, BAND_UNSPECIFIED, 0}",
            WifiChannelWidthType::CW_80_PLUS_80MHZ,
-           {{42, 5210, 80, WIFI_PHY_BAND_5GHZ}, {106, 5530, 80, WIFI_PHY_BAND_5GHZ}},
+           {{42, MHz_u{5210}, MHz_u{80}, WIFI_PHY_BAND_5GHZ},
+            {106, MHz_u{5530}, MHz_u{80}, WIFI_PHY_BAND_5GHZ}},
            0);
 
     // Test default with two frequency segments and first is specified (but equals default)
     RunOne("{42, 0, BAND_UNSPECIFIED, 0};{0, 0, BAND_UNSPECIFIED, 0}",
            WifiChannelWidthType::CW_80_PLUS_80MHZ,
-           {{42, 5210, 80, WIFI_PHY_BAND_5GHZ}, {106, 5530, 80, WIFI_PHY_BAND_5GHZ}},
+           {{42, MHz_u{5210}, MHz_u{80}, WIFI_PHY_BAND_5GHZ},
+            {106, MHz_u{5530}, MHz_u{80}, WIFI_PHY_BAND_5GHZ}},
            0);
 
     // Test default with second segment specified to be at the first available 80 MHz segment
@@ -379,81 +388,85 @@
     // Test default with two frequency segments and first is specified (and differs from default)
     RunOne("{106, 0, BAND_UNSPECIFIED, 0};{0, 0, BAND_UNSPECIFIED, 0}",
            WifiChannelWidthType::CW_80_PLUS_80MHZ,
-           {{106, 5530, 80, WIFI_PHY_BAND_5GHZ}, {138, 5690, 80, WIFI_PHY_BAND_5GHZ}},
+           {{106, MHz_u{5530}, MHz_u{80}, WIFI_PHY_BAND_5GHZ},
+            {138, MHz_u{5690}, MHz_u{80}, WIFI_PHY_BAND_5GHZ}},
            0);
 
     // Test unique channel 36 (20 MHz)
     RunOne("{36, 0, BAND_UNSPECIFIED, 0}",
            WifiChannelWidthType::CW_20MHZ,
-           {{36, 5180, 20, WIFI_PHY_BAND_5GHZ}},
+           {{36, MHz_u{5180}, MHz_u{20}, WIFI_PHY_BAND_5GHZ}},
            0);
 
     // Test unique channel 38 (40 MHz)
     RunOne("{38, 0, BAND_UNSPECIFIED, 0}",
            WifiChannelWidthType::CW_40MHZ,
-           {{38, 5190, 40, WIFI_PHY_BAND_5GHZ}},
+           {{38, MHz_u{5190}, MHz_u{40}, WIFI_PHY_BAND_5GHZ}},
            0);
 
     // Test unique channel 42 (80 MHz)
     RunOne("{42, 0, BAND_UNSPECIFIED, 0}",
            WifiChannelWidthType::CW_80MHZ,
-           {{42, 5210, 80, WIFI_PHY_BAND_5GHZ}},
+           {{42, MHz_u{5210}, MHz_u{80}, WIFI_PHY_BAND_5GHZ}},
            0);
 
     // Test unique channel 50 (160 MHz)
     RunOne("{50, 0, BAND_UNSPECIFIED, 0}",
            WifiChannelWidthType::CW_160MHZ,
-           {{50, 5250, 160, WIFI_PHY_BAND_5GHZ}},
+           {{50, MHz_u{5250}, MHz_u{160}, WIFI_PHY_BAND_5GHZ}},
            0);
 
     // Test 80+80 MHz
     RunOne("{42, 0, BAND_UNSPECIFIED, 0};{106, 0, BAND_UNSPECIFIED, 0}",
            WifiChannelWidthType::CW_80_PLUS_80MHZ,
-           {{42, 5210, 80, WIFI_PHY_BAND_5GHZ}, {106, 5530, 80, WIFI_PHY_BAND_5GHZ}},
+           {{42, MHz_u{5210}, MHz_u{80}, WIFI_PHY_BAND_5GHZ},
+            {106, MHz_u{5530}, MHz_u{80}, WIFI_PHY_BAND_5GHZ}},
            0);
 
     // Test P20 for 80+80 MHz: second value shall be ignored
     RunOne("{42, 0, BAND_UNSPECIFIED, 1};{106, 0, BAND_UNSPECIFIED, 2}",
            WifiChannelWidthType::CW_80_PLUS_80MHZ,
-           {{42, 5210, 80, WIFI_PHY_BAND_5GHZ}, {106, 5530, 80, WIFI_PHY_BAND_5GHZ}},
+           {{42, MHz_u{5210}, MHz_u{80}, WIFI_PHY_BAND_5GHZ},
+            {106, MHz_u{5530}, MHz_u{80}, WIFI_PHY_BAND_5GHZ}},
            1);
 
     // Test default 20 MHz channel
     RunOne("{0, 20, BAND_UNSPECIFIED, 0}",
            WifiChannelWidthType::CW_20MHZ,
-           {{36, 5180, 20, WIFI_PHY_BAND_5GHZ}},
+           {{36, MHz_u{5180}, MHz_u{20}, WIFI_PHY_BAND_5GHZ}},
            0);
 
     // Test default 40 MHz channel
     RunOne("{0, 40, BAND_UNSPECIFIED, 0}",
            WifiChannelWidthType::CW_40MHZ,
-           {{38, 5190, 40, WIFI_PHY_BAND_5GHZ}},
+           {{38, MHz_u{5190}, MHz_u{40}, WIFI_PHY_BAND_5GHZ}},
            0);
 
     // Test default 80 MHz channel
     RunOne("{0, 80, BAND_UNSPECIFIED, 0}",
            WifiChannelWidthType::CW_80MHZ,
-           {{42, 5210, 80, WIFI_PHY_BAND_5GHZ}},
+           {{42, MHz_u{5210}, MHz_u{80}, WIFI_PHY_BAND_5GHZ}},
            0);
 
     // Test default 160 MHz channel
     RunOne("{0, 160, BAND_UNSPECIFIED, 0}",
            WifiChannelWidthType::CW_160MHZ,
-           {{50, 5250, 160, WIFI_PHY_BAND_5GHZ}},
+           {{50, MHz_u{5250}, MHz_u{160}, WIFI_PHY_BAND_5GHZ}},
            0);
 
     // Test default 80+80 MHz channel
     RunOne("{0, 80, BAND_UNSPECIFIED, 0};{0, 80, BAND_UNSPECIFIED, 0}",
            WifiChannelWidthType::CW_80_PLUS_80MHZ,
-           {{42, 5210, 80, WIFI_PHY_BAND_5GHZ}, {106, 5530, 80, WIFI_PHY_BAND_5GHZ}},
+           {{42, MHz_u{5210}, MHz_u{80}, WIFI_PHY_BAND_5GHZ},
+            {106, MHz_u{5530}, MHz_u{80}, WIFI_PHY_BAND_5GHZ}},
            0);
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test the operating channel functions for 80+80MHz.
+ * @brief Test the operating channel functions for 80+80MHz.
  */
 class WifiPhyChannel80Plus80Test : public TestCase
 {
@@ -469,15 +482,15 @@
 
     /**
      * Create a dummy PSDU whose payload is 1000 bytes
-     * \return a dummy PSDU whose payload is 1000 bytes
+     * @return a dummy PSDU whose payload is 1000 bytes
      */
     Ptr<WifiPsdu> CreateDummyPsdu();
 
     /**
      * Create a HE PPDU
-     * \param bandwidth the bandwidth used for the transmission the PPDU
-     * \param channel the operating channel of the PHY used for the transmission
-     * \return a HE PPDU
+     * @param bandwidth the bandwidth used for the transmission the PPDU
+     * @param channel the operating channel of the PHY used for the transmission
+     * @return a HE PPDU
      */
     Ptr<HePpdu> CreateDummyHePpdu(MHz_u bandwidth, const WifiPhyOperatingChannel& channel);
 
@@ -521,399 +534,425 @@
 {
     // P20 is in first segment and segments are provided in increasing frequency order
     {
-        m_channel.Set({{42, 0, 80, WIFI_PHY_BAND_5GHZ}, {106, 0, 80, WIFI_PHY_BAND_5GHZ}},
+        m_channel.Set({{42, MHz_u{0}, MHz_u{80}, WIFI_PHY_BAND_5GHZ},
+                       {106, MHz_u{0}, MHz_u{80}, WIFI_PHY_BAND_5GHZ}},
                       WIFI_STANDARD_UNSPECIFIED);
         m_channel.SetPrimary20Index(3);
 
-        const auto indexPrimary160Mhz = m_channel.GetPrimaryChannelIndex(160);
+        const auto indexPrimary160Mhz = m_channel.GetPrimaryChannelIndex(MHz_u{160});
         NS_TEST_ASSERT_MSG_EQ(indexPrimary160Mhz, 0, "Primary 160 MHz channel shall have index 0");
-        const auto indexPrimary80Mhz = m_channel.GetPrimaryChannelIndex(80);
+        const auto indexPrimary80Mhz = m_channel.GetPrimaryChannelIndex(MHz_u{80});
         NS_TEST_ASSERT_MSG_EQ(indexPrimary80Mhz, 0, "Primary 80 MHz channel shall have index 0");
-        const auto indexPrimary40Mhz = m_channel.GetPrimaryChannelIndex(40);
+        const auto indexPrimary40Mhz = m_channel.GetPrimaryChannelIndex(MHz_u{40});
         NS_TEST_ASSERT_MSG_EQ(indexPrimary40Mhz, 1, "Primary 40 MHz channel shall have index 1");
-        const auto indexPrimary20Mhz = m_channel.GetPrimaryChannelIndex(20);
+        const auto indexPrimary20Mhz = m_channel.GetPrimaryChannelIndex(MHz_u{20});
         NS_TEST_ASSERT_MSG_EQ(indexPrimary20Mhz, 3, "Primary 20 MHz channel shall have index 3");
 
-        const auto indexSecondary80Mhz = m_channel.GetSecondaryChannelIndex(80);
+        const auto indexSecondary80Mhz = m_channel.GetSecondaryChannelIndex(MHz_u{80});
         NS_TEST_ASSERT_MSG_EQ(indexSecondary80Mhz,
                               1,
                               "Secondary 80 MHz channel shall have index 1");
-        const auto indexSecondary40Mhz = m_channel.GetSecondaryChannelIndex(40);
+        const auto indexSecondary40Mhz = m_channel.GetSecondaryChannelIndex(MHz_u{40});
         NS_TEST_ASSERT_MSG_EQ(indexSecondary40Mhz,
                               0,
                               "Secondary 40 MHz channel shall have index 0");
-        const auto indexSecondary20Mhz = m_channel.GetSecondaryChannelIndex(20);
+        const auto indexSecondary20Mhz = m_channel.GetSecondaryChannelIndex(MHz_u{20});
         NS_TEST_ASSERT_MSG_EQ(indexSecondary20Mhz,
                               2,
                               "Secondary 20 MHz channel shall have index 2");
 
-        const auto primary80MhzCenterFrequency = m_channel.GetPrimaryChannelCenterFrequency(80);
+        const auto primary80MhzCenterFrequency =
+            m_channel.GetPrimaryChannelCenterFrequency(MHz_u{80});
         NS_TEST_ASSERT_MSG_EQ(primary80MhzCenterFrequency,
-                              5210,
+                              MHz_u{5210},
                               "Primary 80 MHz channel center frequency shall be 5210 MHz");
-        const auto primary40MhzCenterFrequency = m_channel.GetPrimaryChannelCenterFrequency(40);
+        const auto primary40MhzCenterFrequency =
+            m_channel.GetPrimaryChannelCenterFrequency(MHz_u{40});
         NS_TEST_ASSERT_MSG_EQ(primary40MhzCenterFrequency,
-                              5230,
+                              MHz_u{5230},
                               "Primary 40 MHz channel center frequency shall be 5230 MHz");
-        const auto primary20MhzCenterFrequency = m_channel.GetPrimaryChannelCenterFrequency(20);
+        const auto primary20MhzCenterFrequency =
+            m_channel.GetPrimaryChannelCenterFrequency(MHz_u{20});
         NS_TEST_ASSERT_MSG_EQ(primary20MhzCenterFrequency,
-                              5240,
+                              MHz_u{5240},
                               "Primary 20 MHz channel center frequency shall be 5240 MHz");
 
-        const auto secondary80MhzCenterFrequency = m_channel.GetSecondaryChannelCenterFrequency(80);
+        const auto secondary80MhzCenterFrequency =
+            m_channel.GetSecondaryChannelCenterFrequency(MHz_u{80});
         NS_TEST_ASSERT_MSG_EQ(secondary80MhzCenterFrequency,
-                              5530,
+                              MHz_u{5530},
                               "Secondary 80 MHz channel center frequency shall be 5530 MHz");
-        const auto secondary40MhzCenterFrequency = m_channel.GetSecondaryChannelCenterFrequency(40);
+        const auto secondary40MhzCenterFrequency =
+            m_channel.GetSecondaryChannelCenterFrequency(MHz_u{40});
         NS_TEST_ASSERT_MSG_EQ(secondary40MhzCenterFrequency,
-                              5190,
+                              MHz_u{5190},
                               "Secondary 40 MHz channel center frequency shall be 5190 MHz");
-        const auto secondary20MhzCenterFrequency = m_channel.GetSecondaryChannelCenterFrequency(20);
+        const auto secondary20MhzCenterFrequency =
+            m_channel.GetSecondaryChannelCenterFrequency(MHz_u{20});
         NS_TEST_ASSERT_MSG_EQ(secondary20MhzCenterFrequency,
-                              5220,
+                              MHz_u{5220},
                               "Secondary 20 MHz channel center frequency shall be 5220 MHz");
 
         const auto primary80MhzChannelNumber =
-            m_channel.GetPrimaryChannelNumber(80, WIFI_STANDARD_80211ax);
+            m_channel.GetPrimaryChannelNumber(MHz_u{80}, WIFI_STANDARD_80211ax);
         NS_TEST_ASSERT_MSG_EQ(primary80MhzChannelNumber,
                               42,
                               "Primary 80 MHz channel number shall be 42");
         const auto primary40MhzChannelNumber =
-            m_channel.GetPrimaryChannelNumber(40, WIFI_STANDARD_80211ax);
+            m_channel.GetPrimaryChannelNumber(MHz_u{40}, WIFI_STANDARD_80211ax);
         NS_TEST_ASSERT_MSG_EQ(primary40MhzChannelNumber,
                               46,
                               "Primary 40 MHz channel number shall be 46");
         const auto primary20MhzChannelNumber =
-            m_channel.GetPrimaryChannelNumber(20, WIFI_STANDARD_80211ax);
+            m_channel.GetPrimaryChannelNumber(MHz_u{20}, WIFI_STANDARD_80211ax);
         NS_TEST_ASSERT_MSG_EQ(primary20MhzChannelNumber,
                               48,
                               "Primary 20 MHz channel number shall be 48");
 
-        auto ppdu160MHz = CreateDummyHePpdu(160, m_channel);
+        auto ppdu160MHz = CreateDummyHePpdu(MHz_u{160}, m_channel);
         auto txCenterFreqs160MHz = ppdu160MHz->GetTxCenterFreqs();
         NS_TEST_ASSERT_MSG_EQ(txCenterFreqs160MHz.size(), 2, "2 segments are covered by 160 MHz");
         NS_TEST_ASSERT_MSG_EQ(txCenterFreqs160MHz.front(),
-                              5210,
+                              MHz_u{5210},
                               "Center frequency of first segment shall be 5210 MHz");
         NS_TEST_ASSERT_MSG_EQ(txCenterFreqs160MHz.back(),
-                              5530,
+                              MHz_u{5530},
                               "Center frequency of second segment shall be 5530 MHz");
-        auto ppdu80MHz = CreateDummyHePpdu(80, m_channel);
+        auto ppdu80MHz = CreateDummyHePpdu(MHz_u{80}, m_channel);
         auto txCenterFreqs80MHz = ppdu80MHz->GetTxCenterFreqs();
         NS_TEST_ASSERT_MSG_EQ(txCenterFreqs80MHz.size(), 1, "1 segment is covered by 80 MHz");
         NS_TEST_ASSERT_MSG_EQ(txCenterFreqs80MHz.front(),
-                              5210,
+                              MHz_u{5210},
                               "Center frequency for 80 MHz shall be 5210 MHz");
-        auto ppdu40MHz = CreateDummyHePpdu(40, m_channel);
+        auto ppdu40MHz = CreateDummyHePpdu(MHz_u{40}, m_channel);
         auto txCenterFreqs40MHz = ppdu40MHz->GetTxCenterFreqs();
         NS_TEST_ASSERT_MSG_EQ(txCenterFreqs40MHz.size(), 1, "1 segment is covered by 40 MHz");
         NS_TEST_ASSERT_MSG_EQ(txCenterFreqs40MHz.front(),
-                              5230,
+                              MHz_u{5230},
                               "Center frequency for 40 MHz shall be 5230 MHz");
-        auto ppdu20MHz = CreateDummyHePpdu(20, m_channel);
+        auto ppdu20MHz = CreateDummyHePpdu(MHz_u{20}, m_channel);
         auto txCenterFreqs20MHz = ppdu20MHz->GetTxCenterFreqs();
         NS_TEST_ASSERT_MSG_EQ(txCenterFreqs20MHz.size(), 1, "1 segment is covered by 20 MHz");
         NS_TEST_ASSERT_MSG_EQ(txCenterFreqs20MHz.front(),
-                              5240,
+                              MHz_u{5240},
                               "Center frequency for 20 MHz shall be 5240 MHz");
     }
 
     // P20 is in second segment and segments are provided in increasing frequency order
     {
-        m_channel.Set({{42, 0, 80, WIFI_PHY_BAND_5GHZ}, {106, 0, 80, WIFI_PHY_BAND_5GHZ}},
+        m_channel.Set({{42, MHz_u{0}, MHz_u{80}, WIFI_PHY_BAND_5GHZ},
+                       {106, MHz_u{0}, MHz_u{80}, WIFI_PHY_BAND_5GHZ}},
                       WIFI_STANDARD_UNSPECIFIED);
         m_channel.SetPrimary20Index(4);
 
-        const auto indexPrimary160Mhz = m_channel.GetPrimaryChannelIndex(160);
+        const auto indexPrimary160Mhz = m_channel.GetPrimaryChannelIndex(MHz_u{160});
         NS_TEST_ASSERT_MSG_EQ(indexPrimary160Mhz, 0, "Primary 160 MHz channel shall have index 0");
-        const auto indexPrimary80Mhz = m_channel.GetPrimaryChannelIndex(80);
+        const auto indexPrimary80Mhz = m_channel.GetPrimaryChannelIndex(MHz_u{80});
         NS_TEST_ASSERT_MSG_EQ(indexPrimary80Mhz, 1, "Primary 80 MHz channel shall have index 1");
-        const auto indexPrimary40Mhz = m_channel.GetPrimaryChannelIndex(40);
+        const auto indexPrimary40Mhz = m_channel.GetPrimaryChannelIndex(MHz_u{40});
         NS_TEST_ASSERT_MSG_EQ(indexPrimary40Mhz, 2, "Primary 40 MHz channel shall have index 2");
-        const auto indexPrimary20Mhz = m_channel.GetPrimaryChannelIndex(20);
+        const auto indexPrimary20Mhz = m_channel.GetPrimaryChannelIndex(MHz_u{20});
         NS_TEST_ASSERT_MSG_EQ(indexPrimary20Mhz, 4, "Primary 20 MHz channel shall have index 4");
 
-        const auto indexSecondary80Mhz = m_channel.GetSecondaryChannelIndex(80);
+        const auto indexSecondary80Mhz = m_channel.GetSecondaryChannelIndex(MHz_u{80});
         NS_TEST_ASSERT_MSG_EQ(indexSecondary80Mhz,
                               0,
                               "Secondary 80 MHz channel shall have index 0");
-        const auto indexSecondary40Mhz = m_channel.GetSecondaryChannelIndex(40);
+        const auto indexSecondary40Mhz = m_channel.GetSecondaryChannelIndex(MHz_u{40});
         NS_TEST_ASSERT_MSG_EQ(indexSecondary40Mhz,
                               3,
                               "Secondary 40 MHz channel shall have index 3");
-        const auto indexSecondary20Mhz = m_channel.GetSecondaryChannelIndex(20);
+        const auto indexSecondary20Mhz = m_channel.GetSecondaryChannelIndex(MHz_u{20});
         NS_TEST_ASSERT_MSG_EQ(indexSecondary20Mhz,
                               5,
                               "Secondary 20 MHz channel shall have index 5");
 
-        const auto primary80MhzCenterFrequency = m_channel.GetPrimaryChannelCenterFrequency(80);
+        const auto primary80MhzCenterFrequency =
+            m_channel.GetPrimaryChannelCenterFrequency(MHz_u{80});
         NS_TEST_ASSERT_MSG_EQ(primary80MhzCenterFrequency,
-                              5530,
+                              MHz_u{5530},
                               "Primary 80 MHz channel center frequency shall be 5530 MHz");
-        const auto primary40MhzCenterFrequency = m_channel.GetPrimaryChannelCenterFrequency(40);
+        const auto primary40MhzCenterFrequency =
+            m_channel.GetPrimaryChannelCenterFrequency(MHz_u{40});
         NS_TEST_ASSERT_MSG_EQ(primary40MhzCenterFrequency,
-                              5510,
+                              MHz_u{5510},
                               "Primary 40 MHz channel center frequency shall be 5510 MHz");
-        const auto primary20MhzCenterFrequency = m_channel.GetPrimaryChannelCenterFrequency(20);
+        const auto primary20MhzCenterFrequency =
+            m_channel.GetPrimaryChannelCenterFrequency(MHz_u{20});
         NS_TEST_ASSERT_MSG_EQ(primary20MhzCenterFrequency,
-                              5500,
+                              MHz_u{5500},
                               "Primary 20 MHz channel center frequency shall be 5500 MHz");
 
-        const auto secondary80MhzCenterFrequency = m_channel.GetSecondaryChannelCenterFrequency(80);
+        const auto secondary80MhzCenterFrequency =
+            m_channel.GetSecondaryChannelCenterFrequency(MHz_u{80});
         NS_TEST_ASSERT_MSG_EQ(secondary80MhzCenterFrequency,
-                              5210,
+                              MHz_u{5210},
                               "Secondary 80 MHz channel center frequency shall be 5210 MHz");
-        const auto secondary40MhzCenterFrequency = m_channel.GetSecondaryChannelCenterFrequency(40);
+        const auto secondary40MhzCenterFrequency =
+            m_channel.GetSecondaryChannelCenterFrequency(MHz_u{40});
         NS_TEST_ASSERT_MSG_EQ(secondary40MhzCenterFrequency,
-                              5550,
+                              MHz_u{5550},
                               "Secondary 40 MHz channel center frequency shall be 5550 MHz");
-        const auto secondary20MhzCenterFrequency = m_channel.GetSecondaryChannelCenterFrequency(20);
+        const auto secondary20MhzCenterFrequency =
+            m_channel.GetSecondaryChannelCenterFrequency(MHz_u{20});
         NS_TEST_ASSERT_MSG_EQ(secondary20MhzCenterFrequency,
-                              5520,
+                              MHz_u{5520},
                               "Secondary 20 MHz channel center frequency shall be 5520 MHz");
 
         const auto primary80MhzChannelNumber =
-            m_channel.GetPrimaryChannelNumber(80, WIFI_STANDARD_80211ax);
+            m_channel.GetPrimaryChannelNumber(MHz_u{80}, WIFI_STANDARD_80211ax);
         NS_TEST_ASSERT_MSG_EQ(primary80MhzChannelNumber,
                               106,
                               "Primary 80 MHz channel number shall be 106");
         const auto primary40MhzChannelNumber =
-            m_channel.GetPrimaryChannelNumber(40, WIFI_STANDARD_80211ax);
+            m_channel.GetPrimaryChannelNumber(MHz_u{40}, WIFI_STANDARD_80211ax);
         NS_TEST_ASSERT_MSG_EQ(primary40MhzChannelNumber,
                               102,
                               "Primary 40 MHz channel number shall be 102");
         const auto primary20MhzChannelNumber =
-            m_channel.GetPrimaryChannelNumber(20, WIFI_STANDARD_80211ax);
+            m_channel.GetPrimaryChannelNumber(MHz_u{20}, WIFI_STANDARD_80211ax);
         NS_TEST_ASSERT_MSG_EQ(primary20MhzChannelNumber,
                               100,
                               "Primary 20 MHz channel number shall be 100");
 
-        auto ppdu160MHz = CreateDummyHePpdu(160, m_channel);
+        auto ppdu160MHz = CreateDummyHePpdu(MHz_u{160}, m_channel);
         auto txCenterFreqs160MHz = ppdu160MHz->GetTxCenterFreqs();
         NS_TEST_ASSERT_MSG_EQ(txCenterFreqs160MHz.size(), 2, "2 segments are covered by 160 MHz");
         NS_TEST_ASSERT_MSG_EQ(txCenterFreqs160MHz.front(),
-                              5530,
+                              MHz_u{5530},
                               "Center frequency of first segment shall be 5530 MHz");
         NS_TEST_ASSERT_MSG_EQ(txCenterFreqs160MHz.back(),
-                              5210,
+                              MHz_u{5210},
                               "Center frequency of second segment shall be 5210 MHz");
-        auto ppdu80MHz = CreateDummyHePpdu(80, m_channel);
+        auto ppdu80MHz = CreateDummyHePpdu(MHz_u{80}, m_channel);
         auto txCenterFreqs80MHz = ppdu80MHz->GetTxCenterFreqs();
         NS_TEST_ASSERT_MSG_EQ(txCenterFreqs80MHz.size(), 1, "1 segment is covered by 80 MHz");
-        NS_ASSERT(txCenterFreqs80MHz.front() == 5530);
         NS_TEST_ASSERT_MSG_EQ(txCenterFreqs80MHz.front(),
-                              5530,
+                              MHz_u{5530},
                               "Center frequency for 80 MHz shall be 5530 MHz");
-        auto ppdu40MHz = CreateDummyHePpdu(40, m_channel);
+        auto ppdu40MHz = CreateDummyHePpdu(MHz_u{40}, m_channel);
         auto txCenterFreqs40MHz = ppdu40MHz->GetTxCenterFreqs();
         NS_TEST_ASSERT_MSG_EQ(txCenterFreqs40MHz.size(), 1, "1 segment is covered by 40 MHz");
         NS_TEST_ASSERT_MSG_EQ(txCenterFreqs40MHz.front(),
-                              5510,
+                              MHz_u{5510},
                               "Center frequency for 40 MHz shall be 5510 MHz");
-        auto ppdu20MHz = CreateDummyHePpdu(20, m_channel);
+        auto ppdu20MHz = CreateDummyHePpdu(MHz_u{20}, m_channel);
         auto txCenterFreqs20MHz = ppdu20MHz->GetTxCenterFreqs();
         NS_TEST_ASSERT_MSG_EQ(txCenterFreqs20MHz.size(), 1, "1 segment is covered by 20 MHz");
         NS_TEST_ASSERT_MSG_EQ(txCenterFreqs20MHz.front(),
-                              5500,
+                              MHz_u{5500},
                               "Center frequency for 20 MHz shall be 5500 MHz");
     }
 
     // P20 is in first segment and segments are provided in decreasing frequency order
     {
-        m_channel.Set({{106, 0, 80, WIFI_PHY_BAND_5GHZ}, {42, 0, 80, WIFI_PHY_BAND_5GHZ}},
+        m_channel.Set({{106, MHz_u{0}, MHz_u{80}, WIFI_PHY_BAND_5GHZ},
+                       {42, MHz_u{0}, MHz_u{80}, WIFI_PHY_BAND_5GHZ}},
                       WIFI_STANDARD_UNSPECIFIED);
         m_channel.SetPrimary20Index(3);
 
-        const auto indexPrimary160Mhz = m_channel.GetPrimaryChannelIndex(160);
+        const auto indexPrimary160Mhz = m_channel.GetPrimaryChannelIndex(MHz_u{160});
         NS_TEST_ASSERT_MSG_EQ(indexPrimary160Mhz, 0, "Primary 160 MHz channel shall have index 0");
-        const auto indexPrimary80Mhz = m_channel.GetPrimaryChannelIndex(80);
+        const auto indexPrimary80Mhz = m_channel.GetPrimaryChannelIndex(MHz_u{80});
         NS_TEST_ASSERT_MSG_EQ(indexPrimary80Mhz, 0, "Primary 80 MHz channel shall have index 0");
-        const auto indexPrimary40Mhz = m_channel.GetPrimaryChannelIndex(40);
+        const auto indexPrimary40Mhz = m_channel.GetPrimaryChannelIndex(MHz_u{40});
         NS_TEST_ASSERT_MSG_EQ(indexPrimary40Mhz, 1, "Primary 40 MHz channel shall have index 1");
-        const auto indexPrimary20Mhz = m_channel.GetPrimaryChannelIndex(20);
+        const auto indexPrimary20Mhz = m_channel.GetPrimaryChannelIndex(MHz_u{20});
         NS_TEST_ASSERT_MSG_EQ(indexPrimary20Mhz, 3, "Primary 20 MHz channel shall have index 3");
 
-        const auto indexSecondary80Mhz = m_channel.GetSecondaryChannelIndex(80);
+        const auto indexSecondary80Mhz = m_channel.GetSecondaryChannelIndex(MHz_u{80});
         NS_TEST_ASSERT_MSG_EQ(indexSecondary80Mhz,
                               1,
                               "Secondary 80 MHz channel shall have index 1");
-        const auto indexSecondary40Mhz = m_channel.GetSecondaryChannelIndex(40);
+        const auto indexSecondary40Mhz = m_channel.GetSecondaryChannelIndex(MHz_u{40});
         NS_TEST_ASSERT_MSG_EQ(indexSecondary40Mhz,
                               0,
                               "Secondary 40 MHz channel shall have index 0");
-        const auto indexSecondary20Mhz = m_channel.GetSecondaryChannelIndex(20);
+        const auto indexSecondary20Mhz = m_channel.GetSecondaryChannelIndex(MHz_u{20});
         NS_TEST_ASSERT_MSG_EQ(indexSecondary20Mhz,
                               2,
                               "Secondary 20 MHz channel shall have index 2");
 
-        const auto primary80MhzCenterFrequency = m_channel.GetPrimaryChannelCenterFrequency(80);
+        const auto primary80MhzCenterFrequency =
+            m_channel.GetPrimaryChannelCenterFrequency(MHz_u{80});
         NS_TEST_ASSERT_MSG_EQ(primary80MhzCenterFrequency,
-                              5210,
+                              MHz_u{5210},
                               "Primary 80 MHz channel center frequency shall be 5210 MHz");
-        const auto primary40MhzCenterFrequency = m_channel.GetPrimaryChannelCenterFrequency(40);
+        const auto primary40MhzCenterFrequency =
+            m_channel.GetPrimaryChannelCenterFrequency(MHz_u{40});
         NS_TEST_ASSERT_MSG_EQ(primary40MhzCenterFrequency,
-                              5230,
+                              MHz_u{5230},
                               "Primary 40 MHz channel center frequency shall be 5230 MHz");
-        const auto primary20MhzCenterFrequency = m_channel.GetPrimaryChannelCenterFrequency(20);
+        const auto primary20MhzCenterFrequency =
+            m_channel.GetPrimaryChannelCenterFrequency(MHz_u{20});
         NS_TEST_ASSERT_MSG_EQ(primary20MhzCenterFrequency,
-                              5240,
+                              MHz_u{5240},
                               "Primary 20 MHz channel center frequency shall be 5240 MHz");
 
-        const auto secondary80MhzCenterFrequency = m_channel.GetSecondaryChannelCenterFrequency(80);
+        const auto secondary80MhzCenterFrequency =
+            m_channel.GetSecondaryChannelCenterFrequency(MHz_u{80});
         NS_TEST_ASSERT_MSG_EQ(secondary80MhzCenterFrequency,
-                              5530,
+                              MHz_u{5530},
                               "Secondary 80 MHz channel center frequency shall be 5530 MHz");
-        const auto secondary40MhzCenterFrequency = m_channel.GetSecondaryChannelCenterFrequency(40);
+        const auto secondary40MhzCenterFrequency =
+            m_channel.GetSecondaryChannelCenterFrequency(MHz_u{40});
         NS_TEST_ASSERT_MSG_EQ(secondary40MhzCenterFrequency,
-                              5190,
+                              MHz_u{5190},
                               "Secondary 40 MHz channel center frequency shall be 5190 MHz");
-        const auto secondary20MhzCenterFrequency = m_channel.GetSecondaryChannelCenterFrequency(20);
+        const auto secondary20MhzCenterFrequency =
+            m_channel.GetSecondaryChannelCenterFrequency(MHz_u{20});
         NS_TEST_ASSERT_MSG_EQ(secondary20MhzCenterFrequency,
-                              5220,
+                              MHz_u{5220},
                               "Secondary 20 MHz channel center frequency shall be 5220 MHz");
 
         const auto primary80MhzChannelNumber =
-            m_channel.GetPrimaryChannelNumber(80, WIFI_STANDARD_80211ax);
+            m_channel.GetPrimaryChannelNumber(MHz_u{80}, WIFI_STANDARD_80211ax);
         NS_TEST_ASSERT_MSG_EQ(primary80MhzChannelNumber,
                               42,
                               "Primary 80 MHz channel number shall be 42");
         const auto primary40MhzChannelNumber =
-            m_channel.GetPrimaryChannelNumber(40, WIFI_STANDARD_80211ax);
+            m_channel.GetPrimaryChannelNumber(MHz_u{40}, WIFI_STANDARD_80211ax);
         NS_TEST_ASSERT_MSG_EQ(primary40MhzChannelNumber,
                               46,
                               "Primary 40 MHz channel number shall be 46");
         const auto primary20MhzChannelNumber =
-            m_channel.GetPrimaryChannelNumber(20, WIFI_STANDARD_80211ax);
+            m_channel.GetPrimaryChannelNumber(MHz_u{20}, WIFI_STANDARD_80211ax);
         NS_TEST_ASSERT_MSG_EQ(primary20MhzChannelNumber,
                               48,
                               "Primary 20 MHz channel number shall be 48");
 
-        auto ppdu160MHz = CreateDummyHePpdu(160, m_channel);
+        auto ppdu160MHz = CreateDummyHePpdu(MHz_u{160}, m_channel);
         auto txCenterFreqs160MHz = ppdu160MHz->GetTxCenterFreqs();
         NS_TEST_ASSERT_MSG_EQ(txCenterFreqs160MHz.size(), 2, "2 segments are covered by 160 MHz");
         NS_TEST_ASSERT_MSG_EQ(txCenterFreqs160MHz.front(),
-                              5210,
+                              MHz_u{5210},
                               "Center frequency of first segment shall be 5210 MHz");
         NS_TEST_ASSERT_MSG_EQ(txCenterFreqs160MHz.back(),
-                              5530,
+                              MHz_u{5530},
                               "Center frequency of second segment shall be 5530 MHz");
-        auto ppdu80MHz = CreateDummyHePpdu(80, m_channel);
+        auto ppdu80MHz = CreateDummyHePpdu(MHz_u{80}, m_channel);
         auto txCenterFreqs80MHz = ppdu80MHz->GetTxCenterFreqs();
         NS_TEST_ASSERT_MSG_EQ(txCenterFreqs80MHz.size(), 1, "1 segment is covered by 80 MHz");
         NS_TEST_ASSERT_MSG_EQ(txCenterFreqs80MHz.front(),
-                              5210,
+                              MHz_u{5210},
                               "Center frequency for 80 MHz shall be 5210 MHz");
-        auto ppdu40MHz = CreateDummyHePpdu(40, m_channel);
+        auto ppdu40MHz = CreateDummyHePpdu(MHz_u{40}, m_channel);
         auto txCenterFreqs40MHz = ppdu40MHz->GetTxCenterFreqs();
         NS_TEST_ASSERT_MSG_EQ(txCenterFreqs40MHz.size(), 1, "1 segment is covered by 40 MHz");
         NS_TEST_ASSERT_MSG_EQ(txCenterFreqs40MHz.front(),
-                              5230,
+                              MHz_u{5230},
                               "Center frequency for 40 MHz shall be 5230 MHz");
-        auto ppdu20MHz = CreateDummyHePpdu(20, m_channel);
+        auto ppdu20MHz = CreateDummyHePpdu(MHz_u{20}, m_channel);
         auto txCenterFreqs20MHz = ppdu20MHz->GetTxCenterFreqs();
         NS_TEST_ASSERT_MSG_EQ(txCenterFreqs20MHz.size(), 1, "1 segment is covered by 20 MHz");
         NS_TEST_ASSERT_MSG_EQ(txCenterFreqs20MHz.front(),
-                              5240,
+                              MHz_u{5240},
                               "Center frequency for 20 MHz shall be 5240 MHz");
     }
 
     // P20 is in second segment and segments are provided in decreasing frequency order
     {
-        m_channel.Set({{106, 0, 80, WIFI_PHY_BAND_5GHZ}, {42, 0, 80, WIFI_PHY_BAND_5GHZ}},
+        m_channel.Set({{106, MHz_u{0}, MHz_u{80}, WIFI_PHY_BAND_5GHZ},
+                       {42, MHz_u{0}, MHz_u{80}, WIFI_PHY_BAND_5GHZ}},
                       WIFI_STANDARD_UNSPECIFIED);
         m_channel.SetPrimary20Index(4);
 
-        const auto indexPrimary160Mhz = m_channel.GetPrimaryChannelIndex(160);
+        const auto indexPrimary160Mhz = m_channel.GetPrimaryChannelIndex(MHz_u{160});
         NS_TEST_ASSERT_MSG_EQ(indexPrimary160Mhz, 0, "Primary 160 MHz channel shall have index 0");
-        const auto indexPrimary80Mhz = m_channel.GetPrimaryChannelIndex(80);
+        const auto indexPrimary80Mhz = m_channel.GetPrimaryChannelIndex(MHz_u{80});
         NS_TEST_ASSERT_MSG_EQ(indexPrimary80Mhz, 1, "Primary 80 MHz channel shall have index 1");
-        const auto indexPrimary40Mhz = m_channel.GetPrimaryChannelIndex(40);
+        const auto indexPrimary40Mhz = m_channel.GetPrimaryChannelIndex(MHz_u{40});
         NS_TEST_ASSERT_MSG_EQ(indexPrimary40Mhz, 2, "Primary 40 MHz channel shall have index 2");
-        const auto indexPrimary20Mhz = m_channel.GetPrimaryChannelIndex(20);
+        const auto indexPrimary20Mhz = m_channel.GetPrimaryChannelIndex(MHz_u{20});
         NS_TEST_ASSERT_MSG_EQ(indexPrimary20Mhz, 4, "Primary 20 MHz channel shall have index 4");
 
-        const auto indexSecondary80Mhz = m_channel.GetSecondaryChannelIndex(80);
+        const auto indexSecondary80Mhz = m_channel.GetSecondaryChannelIndex(MHz_u{80});
         NS_TEST_ASSERT_MSG_EQ(indexSecondary80Mhz,
                               0,
                               "Secondary 80 MHz channel shall have index 0");
-        const auto indexSecondary40Mhz = m_channel.GetSecondaryChannelIndex(40);
+        const auto indexSecondary40Mhz = m_channel.GetSecondaryChannelIndex(MHz_u{40});
         NS_TEST_ASSERT_MSG_EQ(indexSecondary40Mhz,
                               3,
                               "Secondary 40 MHz channel shall have index 3");
-        const auto indexSecondary20Mhz = m_channel.GetSecondaryChannelIndex(20);
+        const auto indexSecondary20Mhz = m_channel.GetSecondaryChannelIndex(MHz_u{20});
         NS_TEST_ASSERT_MSG_EQ(indexSecondary20Mhz,
                               5,
                               "Secondary 20 MHz channel shall have index 5");
 
-        const auto primary80MhzCenterFrequency = m_channel.GetPrimaryChannelCenterFrequency(80);
+        const auto primary80MhzCenterFrequency =
+            m_channel.GetPrimaryChannelCenterFrequency(MHz_u{80});
         NS_TEST_ASSERT_MSG_EQ(primary80MhzCenterFrequency,
-                              5530,
+                              MHz_u{5530},
                               "Primary 80 MHz channel center frequency shall be 5530 MHz");
-        const auto primary40MhzCenterFrequency = m_channel.GetPrimaryChannelCenterFrequency(40);
+        const auto primary40MhzCenterFrequency =
+            m_channel.GetPrimaryChannelCenterFrequency(MHz_u{40});
         NS_TEST_ASSERT_MSG_EQ(primary40MhzCenterFrequency,
-                              5510,
+                              MHz_u{5510},
                               "Primary 40 MHz channel center frequency shall be 5510 MHz");
-        const auto primary20MhzCenterFrequency = m_channel.GetPrimaryChannelCenterFrequency(20);
+        const auto primary20MhzCenterFrequency =
+            m_channel.GetPrimaryChannelCenterFrequency(MHz_u{20});
         NS_TEST_ASSERT_MSG_EQ(primary20MhzCenterFrequency,
-                              5500,
+                              MHz_u{5500},
                               "Primary 20 MHz channel center frequency shall be 5500 MHz");
 
-        const auto secondary80MhzCenterFrequency = m_channel.GetSecondaryChannelCenterFrequency(80);
+        const auto secondary80MhzCenterFrequency =
+            m_channel.GetSecondaryChannelCenterFrequency(MHz_u{80});
         NS_TEST_ASSERT_MSG_EQ(secondary80MhzCenterFrequency,
-                              5210,
+                              MHz_u{5210},
                               "Secondary 80 MHz channel center frequency shall be 5210 MHz");
-        const auto secondary40MhzCenterFrequency = m_channel.GetSecondaryChannelCenterFrequency(40);
+        const auto secondary40MhzCenterFrequency =
+            m_channel.GetSecondaryChannelCenterFrequency(MHz_u{40});
         NS_TEST_ASSERT_MSG_EQ(secondary40MhzCenterFrequency,
-                              5550,
+                              MHz_u{5550},
                               "Secondary 40 MHz channel center frequency shall be 5550 MHz");
-        const auto secondary20MhzCenterFrequency = m_channel.GetSecondaryChannelCenterFrequency(20);
+        const auto secondary20MhzCenterFrequency =
+            m_channel.GetSecondaryChannelCenterFrequency(MHz_u{20});
         NS_TEST_ASSERT_MSG_EQ(secondary20MhzCenterFrequency,
-                              5520,
+                              MHz_u{5520},
                               "Secondary 20 MHz channel center frequency shall be 5520 MHz");
 
         const auto primary80MhzChannelNumber =
-            m_channel.GetPrimaryChannelNumber(80, WIFI_STANDARD_80211ax);
+            m_channel.GetPrimaryChannelNumber(MHz_u{80}, WIFI_STANDARD_80211ax);
         NS_TEST_ASSERT_MSG_EQ(primary80MhzChannelNumber,
                               106,
                               "Primary 80 MHz channel number shall be 106");
         const auto primary40MhzChannelNumber =
-            m_channel.GetPrimaryChannelNumber(40, WIFI_STANDARD_80211ax);
+            m_channel.GetPrimaryChannelNumber(MHz_u{40}, WIFI_STANDARD_80211ax);
         NS_TEST_ASSERT_MSG_EQ(primary40MhzChannelNumber,
                               102,
                               "Primary 40 MHz channel number shall be 102");
         const auto primary20MhzChannelNumber =
-            m_channel.GetPrimaryChannelNumber(20, WIFI_STANDARD_80211ax);
+            m_channel.GetPrimaryChannelNumber(MHz_u{20}, WIFI_STANDARD_80211ax);
         NS_TEST_ASSERT_MSG_EQ(primary20MhzChannelNumber,
                               100,
                               "Primary 20 MHz channel number shall be 100");
 
-        auto ppdu160MHz = CreateDummyHePpdu(160, m_channel);
+        auto ppdu160MHz = CreateDummyHePpdu(MHz_u{160}, m_channel);
         auto txCenterFreqs160MHz = ppdu160MHz->GetTxCenterFreqs();
         NS_TEST_ASSERT_MSG_EQ(txCenterFreqs160MHz.size(), 2, "2 segments are covered by 160 MHz");
         NS_TEST_ASSERT_MSG_EQ(txCenterFreqs160MHz.front(),
-                              5530,
+                              MHz_u{5530},
                               "Center frequency of first segment shall be 5530 MHz");
         NS_TEST_ASSERT_MSG_EQ(txCenterFreqs160MHz.back(),
-                              5210,
+                              MHz_u{5210},
                               "Center frequency of second segment shall be 5210 MHz");
-        auto ppdu80MHz = CreateDummyHePpdu(80, m_channel);
+        auto ppdu80MHz = CreateDummyHePpdu(MHz_u{80}, m_channel);
         auto txCenterFreqs80MHz = ppdu80MHz->GetTxCenterFreqs();
         NS_TEST_ASSERT_MSG_EQ(txCenterFreqs80MHz.size(), 1, "1 segment is covered by 80 MHz");
-        NS_ASSERT(txCenterFreqs80MHz.front() == 5530);
         NS_TEST_ASSERT_MSG_EQ(txCenterFreqs80MHz.front(),
-                              5530,
+                              MHz_u{5530},
                               "Center frequency for 80 MHz shall be 5530 MHz");
-        auto ppdu40MHz = CreateDummyHePpdu(40, m_channel);
+        auto ppdu40MHz = CreateDummyHePpdu(MHz_u{40}, m_channel);
         auto txCenterFreqs40MHz = ppdu40MHz->GetTxCenterFreqs();
         NS_TEST_ASSERT_MSG_EQ(txCenterFreqs40MHz.size(), 1, "1 segment is covered by 40 MHz");
         NS_TEST_ASSERT_MSG_EQ(txCenterFreqs40MHz.front(),
-                              5510,
+                              MHz_u{5510},
                               "Center frequency for 40 MHz shall be 5510 MHz");
-        auto ppdu20MHz = CreateDummyHePpdu(20, m_channel);
+        auto ppdu20MHz = CreateDummyHePpdu(MHz_u{20}, m_channel);
         auto txCenterFreqs20MHz = ppdu20MHz->GetTxCenterFreqs();
         NS_TEST_ASSERT_MSG_EQ(txCenterFreqs20MHz.size(), 1, "1 segment is covered by 20 MHz");
         NS_TEST_ASSERT_MSG_EQ(txCenterFreqs20MHz.front(),
-                              5500,
+                              MHz_u{5500},
                               "Center frequency for 20 MHz shall be 5500 MHz");
     }
 
@@ -921,10 +960,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief wifi operating channel test suite
+ * @brief wifi operating channel test suite
  */
 class WifiOperatingChannelTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/test/wifi-phy-cca-test.cc ns-3.44/src/wifi/test/wifi-phy-cca-test.cc
--- ns-3.43/src/wifi/test/wifi-phy-cca-test.cc	2024-10-09 16:41:10.140657000 -0700
+++ ns-3.44/src/wifi/test/wifi-phy-cca-test.cc	2025-03-09 16:55:49.811372800 -0700
@@ -39,13 +39,13 @@
 
 NS_LOG_COMPONENT_DEFINE("WifiPhyCcaTest");
 
-constexpr MHz_u P20_CENTER_FREQUENCY = 5180;
-constexpr MHz_u S20_CENTER_FREQUENCY = P20_CENTER_FREQUENCY + 20;
-constexpr MHz_u P40_CENTER_FREQUENCY = P20_CENTER_FREQUENCY + 10;
-constexpr MHz_u S40_CENTER_FREQUENCY = P40_CENTER_FREQUENCY + 40;
-constexpr MHz_u P80_CENTER_FREQUENCY = P40_CENTER_FREQUENCY + 20;
-constexpr MHz_u S80_CENTER_FREQUENCY = P80_CENTER_FREQUENCY + 80;
-constexpr MHz_u P160_CENTER_FREQUENCY = P80_CENTER_FREQUENCY + 40;
+constexpr MHz_u P20_CENTER_FREQUENCY{5180};
+constexpr MHz_u S20_CENTER_FREQUENCY = P20_CENTER_FREQUENCY + MHz_u{20};
+constexpr MHz_u P40_CENTER_FREQUENCY = P20_CENTER_FREQUENCY + MHz_u{10};
+constexpr MHz_u S40_CENTER_FREQUENCY = P40_CENTER_FREQUENCY + MHz_u{40};
+constexpr MHz_u P80_CENTER_FREQUENCY = P40_CENTER_FREQUENCY + MHz_u{20};
+constexpr MHz_u S80_CENTER_FREQUENCY = P80_CENTER_FREQUENCY + MHz_u{80};
+constexpr MHz_u P160_CENTER_FREQUENCY = P80_CENTER_FREQUENCY + MHz_u{40};
 const Time smallDelta = NanoSeconds(1);
 // add small delta to be right after aCCATime, since test checks are scheduled before wifi events
 const Time aCcaTime = MicroSeconds(4) + smallDelta;
@@ -56,10 +56,10 @@
 };
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief PHY CCA thresholds test
+ * @brief PHY CCA thresholds test
  */
 class WifiPhyCcaThresholdsTest : public TestCase
 {
@@ -78,45 +78,45 @@
 
     /**
      * Create a dummy PSDU whose payload is 1000 bytes
-     * \return a dummy PSDU whose payload is 1000 bytes
+     * @return a dummy PSDU whose payload is 1000 bytes
      */
     Ptr<WifiPsdu> CreateDummyPsdu();
     /**
      * Create a non-HT PPDU
-     * \param channel the operating channel of the PHY used for the transmission
-     * \return a non-HT PPDU
+     * @param channel the operating channel of the PHY used for the transmission
+     * @return a non-HT PPDU
      */
     Ptr<OfdmPpdu> CreateDummyNonHtPpdu(const WifiPhyOperatingChannel& channel);
     /**
      * Create a HT PPDU
-     * \param bandwidth the bandwidth used for the transmission the PPDU
-     * \param channel the operating channel of the PHY used for the transmission
-     * \return a HT PPDU
+     * @param bandwidth the bandwidth used for the transmission the PPDU
+     * @param channel the operating channel of the PHY used for the transmission
+     * @return a HT PPDU
      */
     Ptr<HtPpdu> CreateDummyHtPpdu(MHz_u bandwidth, const WifiPhyOperatingChannel& channel);
     /**
      * Create a VHT PPDU
-     * \param bandwidth the bandwidth used for the transmission the PPDU
-     * \param channel the operating channel of the PHY used for the transmission
-     * \return a VHT PPDU
+     * @param bandwidth the bandwidth used for the transmission the PPDU
+     * @param channel the operating channel of the PHY used for the transmission
+     * @return a VHT PPDU
      */
     Ptr<VhtPpdu> CreateDummyVhtPpdu(MHz_u bandwidth, const WifiPhyOperatingChannel& channel);
     /**
      * Create a HE PPDU
-     * \param bandwidth the bandwidth used for the transmission the PPDU
-     * \param channel the operating channel of the PHY used for the transmission
-     * \return a HE PPDU
+     * @param bandwidth the bandwidth used for the transmission the PPDU
+     * @param channel the operating channel of the PHY used for the transmission
+     * @return a HE PPDU
      */
     Ptr<HePpdu> CreateDummyHePpdu(MHz_u bandwidth, const WifiPhyOperatingChannel& channel);
 
     /**
      * Function to verify the CCA threshold that is being reported by a given PHY entity upon
      * reception of a signal or a PPDU
-     * \param phy the PHY entity to verify
-     * \param ppdu the incoming PPDU or signal (if nullptr)
-     * \param channelType the channel list type that indicates which channel the PPDU or the
+     * @param phy the PHY entity to verify
+     * @param ppdu the incoming PPDU or signal (if nullptr)
+     * @param channelType the channel list type that indicates which channel the PPDU or the
      * signal occupies
-     * \param expectedCcaThreshold the CCA threshold that is expected to be reported
+     * @param expectedCcaThreshold the CCA threshold that is expected to be reported
      */
     void VerifyCcaThreshold(const Ptr<PhyEntity> phy,
                             const Ptr<const WifiPpdu> ppdu,
@@ -143,7 +143,7 @@
     : TestCase("Wi-Fi PHY CCA thresholds test"),
       m_CcaEdThreshold{-62.0},
       m_CcaSensitivity{-82.0},
-      m_secondaryCcaSensitivityThresholds{-72.0, -72.0, -69.0},
+      m_secondaryCcaSensitivityThresholds{dBm_u{-72}, dBm_u{-72}, dBm_u{-69}},
       m_obssPdLevel{-82.0}
 {
 }
@@ -168,7 +168,7 @@
                                          1,
                                          1,
                                          0,
-                                         20,
+                                         MHz_u{20},
                                          false);
     Ptr<WifiPsdu> psdu = CreateDummyPsdu();
     return Create<OfdmPpdu>(psdu, txVector, channel, 0);
@@ -235,7 +235,7 @@
                 << " in " << channelType << " channel: " << actualThreshold << "dBm");
     NS_TEST_EXPECT_MSG_EQ_TOL(actualThreshold,
                               expectedCcaThreshold,
-                              1e-6,
+                              dB_u{1e-6},
                               "Actual CCA threshold for "
                                   << (ppdu == nullptr ? "any signal" : "a PPDU") << " in "
                                   << channelType << " channel " << actualThreshold
@@ -260,9 +260,12 @@
     m_phy->SetInterferenceHelper(CreateObject<InterferenceHelper>());
     m_phy->AddChannel(CreateObject<MultiModelSpectrumChannel>());
 
-    auto channelNum =
-        WifiPhyOperatingChannel::FindFirst(0, 0, 160, WIFI_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ)
-            ->number;
+    auto channelNum = WifiPhyOperatingChannel::FindFirst(0,
+                                                         MHz_u{0},
+                                                         MHz_u{160},
+                                                         WIFI_STANDARD_80211ax,
+                                                         WIFI_PHY_BAND_5GHZ)
+                          ->number;
     m_phy->SetOperatingChannel(WifiPhy::ChannelTuple{channelNum, 160, WIFI_PHY_BAND_5GHZ, 0});
     m_phy->ConfigureStandard(WIFI_STANDARD_80211ax);
 
@@ -320,14 +323,14 @@
     // HT PHY: 20 MHz HT PPDU in primary channel (20 MHz) if power in primary above CCA sensitivity
     // threshold
     VerifyCcaThreshold(m_phy->GetPhyEntity(WIFI_MOD_CLASS_HT),
-                       CreateDummyHtPpdu(20, m_phy->GetOperatingChannel()),
+                       CreateDummyHtPpdu(MHz_u{20}, m_phy->GetOperatingChannel()),
                        WIFI_CHANLIST_PRIMARY,
                        m_CcaSensitivity);
 
     // HT PHY: 40 MHz HT PPDU in primary channel (20 MHz) if power in primary above CCA sensitivity
     // threshold
     VerifyCcaThreshold(m_phy->GetPhyEntity(WIFI_MOD_CLASS_HT),
-                       CreateDummyHtPpdu(40, m_phy->GetOperatingChannel()),
+                       CreateDummyHtPpdu(MHz_u{40}, m_phy->GetOperatingChannel()),
                        WIFI_CHANLIST_PRIMARY,
                        m_CcaSensitivity);
 
@@ -349,41 +352,41 @@
     VerifyCcaThreshold(m_phy->GetPhyEntity(WIFI_MOD_CLASS_VHT),
                        nullptr,
                        WIFI_CHANLIST_SECONDARY40,
-                       m_CcaEdThreshold + static_cast<dB_u>(3.0));
+                       m_CcaEdThreshold + dB_u{3.0});
 
     // VHT PHY: any signal in secondary80 channel (80 MHz) if power above CCA-ED threshold + 6dB
     VerifyCcaThreshold(m_phy->GetPhyEntity(WIFI_MOD_CLASS_VHT),
                        nullptr,
                        WIFI_CHANLIST_SECONDARY80,
-                       m_CcaEdThreshold + static_cast<dB_u>(6.0));
+                       m_CcaEdThreshold + dB_u{6.0});
 
     //-----------------------------------------------------------------------------------------------------------------------------------
 
     // VHT PHY: 20 MHz VHT PPDU in primary channel (20 MHz) if power in primary above CCA
     // sensitivity threshold
     VerifyCcaThreshold(m_phy->GetPhyEntity(WIFI_MOD_CLASS_VHT),
-                       CreateDummyVhtPpdu(20, m_phy->GetOperatingChannel()),
+                       CreateDummyVhtPpdu(MHz_u{20}, m_phy->GetOperatingChannel()),
                        WIFI_CHANLIST_PRIMARY,
                        m_CcaSensitivity);
 
     // VHT PHY: 40 MHz VHT PPDU in primary channel (20 MHz) if power in primary above CCA
     // sensitivity threshold
     VerifyCcaThreshold(m_phy->GetPhyEntity(WIFI_MOD_CLASS_VHT),
-                       CreateDummyVhtPpdu(40, m_phy->GetOperatingChannel()),
+                       CreateDummyVhtPpdu(MHz_u{40}, m_phy->GetOperatingChannel()),
                        WIFI_CHANLIST_PRIMARY,
                        m_CcaSensitivity);
 
     // VHT PHY: 80 MHz VHT PPDU in primary channel (20 MHz) if power in primary above CCA
     // sensitivity threshold
     VerifyCcaThreshold(m_phy->GetPhyEntity(WIFI_MOD_CLASS_VHT),
-                       CreateDummyVhtPpdu(80, m_phy->GetOperatingChannel()),
+                       CreateDummyVhtPpdu(MHz_u{80}, m_phy->GetOperatingChannel()),
                        WIFI_CHANLIST_PRIMARY,
                        m_CcaSensitivity);
 
     // VHT PHY: 160 MHz VHT PPDU in primary channel (20 MHz) if power in primary above CCA
     // sensitivity threshold
     VerifyCcaThreshold(m_phy->GetPhyEntity(WIFI_MOD_CLASS_VHT),
-                       CreateDummyVhtPpdu(160, m_phy->GetOperatingChannel()),
+                       CreateDummyVhtPpdu(MHz_u{160}, m_phy->GetOperatingChannel()),
                        WIFI_CHANLIST_PRIMARY,
                        m_CcaSensitivity);
 
@@ -392,42 +395,42 @@
     // VHT PHY: 20 MHz VHT PPDU in secondary channel (20 MHz) if power above the CCA sensitivity
     // threshold corresponding to a 20 MHz PPDU that does not occupy the primary 20 MHz
     VerifyCcaThreshold(m_phy->GetPhyEntity(WIFI_MOD_CLASS_VHT),
-                       CreateDummyVhtPpdu(20, m_phy->GetOperatingChannel()),
+                       CreateDummyVhtPpdu(MHz_u{20}, m_phy->GetOperatingChannel()),
                        WIFI_CHANLIST_SECONDARY,
                        std::get<0>(m_secondaryCcaSensitivityThresholds));
 
     // VHT PHY: 20 MHz VHT PPDU in secondary40 channel (40 MHz) if power above the CCA sensitivity
     // threshold corresponding to a 20 MHz PPDU that does not occupy the primary 20 MHz
     VerifyCcaThreshold(m_phy->GetPhyEntity(WIFI_MOD_CLASS_VHT),
-                       CreateDummyVhtPpdu(20, m_phy->GetOperatingChannel()),
+                       CreateDummyVhtPpdu(MHz_u{20}, m_phy->GetOperatingChannel()),
                        WIFI_CHANLIST_SECONDARY40,
                        std::get<0>(m_secondaryCcaSensitivityThresholds));
 
     // VHT PHY: 40 MHz VHT PPDU in secondary40 channel (40 MHz) if power above the CCA sensitivity
     // threshold corresponding to a 40 MHz PPDU that does not occupy the primary 20 MHz
     VerifyCcaThreshold(m_phy->GetPhyEntity(WIFI_MOD_CLASS_VHT),
-                       CreateDummyVhtPpdu(40, m_phy->GetOperatingChannel()),
+                       CreateDummyVhtPpdu(MHz_u{40}, m_phy->GetOperatingChannel()),
                        WIFI_CHANLIST_SECONDARY40,
                        std::get<1>(m_secondaryCcaSensitivityThresholds));
 
     // VHT PHY: 20 MHz VHT PPDU in secondary80 channel (80 MHz) if power above the CCA sensitivity
     // threshold corresponding to a 20 MHz PPDU that does not occupy the primary 20 MHz
     VerifyCcaThreshold(m_phy->GetPhyEntity(WIFI_MOD_CLASS_VHT),
-                       CreateDummyVhtPpdu(20, m_phy->GetOperatingChannel()),
+                       CreateDummyVhtPpdu(MHz_u{20}, m_phy->GetOperatingChannel()),
                        WIFI_CHANLIST_SECONDARY80,
                        std::get<0>(m_secondaryCcaSensitivityThresholds));
 
     // VHT PHY: 40 MHz VHT PPDU in secondary80 channel (80 MHz) if power above the CCA sensitivity
     // threshold corresponding to a 40 MHz PPDU that does not occupy the primary 20 MHz
     VerifyCcaThreshold(m_phy->GetPhyEntity(WIFI_MOD_CLASS_VHT),
-                       CreateDummyVhtPpdu(40, m_phy->GetOperatingChannel()),
+                       CreateDummyVhtPpdu(MHz_u{40}, m_phy->GetOperatingChannel()),
                        WIFI_CHANLIST_SECONDARY80,
                        std::get<1>(m_secondaryCcaSensitivityThresholds));
 
     // VHT PHY: 80 MHz VHT PPDU in secondary80 channel (80 MHz) if power above the CCA sensitivity
     // threshold corresponding to a 80 MHz PPDU that does not occupy the primary 20 MHz
     VerifyCcaThreshold(m_phy->GetPhyEntity(WIFI_MOD_CLASS_VHT),
-                       CreateDummyVhtPpdu(80, m_phy->GetOperatingChannel()),
+                       CreateDummyVhtPpdu(MHz_u{80}, m_phy->GetOperatingChannel()),
                        WIFI_CHANLIST_SECONDARY80,
                        std::get<2>(m_secondaryCcaSensitivityThresholds));
 
@@ -449,41 +452,41 @@
     VerifyCcaThreshold(m_phy->GetPhyEntity(WIFI_MOD_CLASS_HE),
                        nullptr,
                        WIFI_CHANLIST_SECONDARY40,
-                       m_CcaEdThreshold + static_cast<dB_u>(3.0));
+                       m_CcaEdThreshold + dB_u{3.0});
 
     // HE PHY: any signal in secondary80 channel (80 MHz) if power above CCA-ED threshold + 6dB
     VerifyCcaThreshold(m_phy->GetPhyEntity(WIFI_MOD_CLASS_HE),
                        nullptr,
                        WIFI_CHANLIST_SECONDARY80,
-                       m_CcaEdThreshold + static_cast<dB_u>(6.0));
+                       m_CcaEdThreshold + dB_u{6.0});
 
     //-----------------------------------------------------------------------------------------------------------------------------------
 
     // HE PHY: 20 MHz HE PPDU in primary channel (20 MHz) if power in primary above CCA sensitivity
     // threshold
     VerifyCcaThreshold(m_phy->GetPhyEntity(WIFI_MOD_CLASS_HE),
-                       CreateDummyHePpdu(20, m_phy->GetOperatingChannel()),
+                       CreateDummyHePpdu(MHz_u{20}, m_phy->GetOperatingChannel()),
                        WIFI_CHANLIST_PRIMARY,
                        m_CcaSensitivity);
 
     // HE PHY: 40 MHz HE PPDU in primary channel (20 MHz) if power in primary above CCA sensitivity
     // threshold
     VerifyCcaThreshold(m_phy->GetPhyEntity(WIFI_MOD_CLASS_HE),
-                       CreateDummyHePpdu(40, m_phy->GetOperatingChannel()),
+                       CreateDummyHePpdu(MHz_u{40}, m_phy->GetOperatingChannel()),
                        WIFI_CHANLIST_PRIMARY,
                        m_CcaSensitivity);
 
     // HE PHY: 80 MHz HE PPDU in primary channel (20 MHz) if power in primary above CCA sensitivity
     // threshold
     VerifyCcaThreshold(m_phy->GetPhyEntity(WIFI_MOD_CLASS_HE),
-                       CreateDummyHePpdu(80, m_phy->GetOperatingChannel()),
+                       CreateDummyHePpdu(MHz_u{80}, m_phy->GetOperatingChannel()),
                        WIFI_CHANLIST_PRIMARY,
                        m_CcaSensitivity);
 
     // HE PHY: 160 MHz HE PPDU in primary channel (20 MHz) if power in primary above CCA sensitivity
     // threshold
     VerifyCcaThreshold(m_phy->GetPhyEntity(WIFI_MOD_CLASS_HE),
-                       CreateDummyHePpdu(160, m_phy->GetOperatingChannel()),
+                       CreateDummyHePpdu(MHz_u{160}, m_phy->GetOperatingChannel()),
                        WIFI_CHANLIST_PRIMARY,
                        m_CcaSensitivity);
 
@@ -493,7 +496,7 @@
     // sensitivity threshold corresponding to a 20 MHz PPDU that does not occupy the primary 20 MHz
     // and the OBSS-PD level
     VerifyCcaThreshold(m_phy->GetPhyEntity(WIFI_MOD_CLASS_HE),
-                       CreateDummyHePpdu(20, m_phy->GetOperatingChannel()),
+                       CreateDummyHePpdu(MHz_u{20}, m_phy->GetOperatingChannel()),
                        WIFI_CHANLIST_SECONDARY,
                        std::max(m_obssPdLevel, std::get<0>(m_secondaryCcaSensitivityThresholds)));
 
@@ -501,113 +504,113 @@
     // sensitivity threshold corresponding to a 20 MHz PPDU that does not occupy the primary 20 MHz
     // and the OBSS-PD level
     VerifyCcaThreshold(m_phy->GetPhyEntity(WIFI_MOD_CLASS_HE),
-                       CreateDummyHePpdu(20, m_phy->GetOperatingChannel()),
+                       CreateDummyHePpdu(MHz_u{20}, m_phy->GetOperatingChannel()),
                        WIFI_CHANLIST_SECONDARY40,
                        std::max(m_obssPdLevel, std::get<0>(m_secondaryCcaSensitivityThresholds)));
 
     // HE PHY: 40 MHz HE PPDU in secondary40 channel (40 MHz) if power above the max between the CCA
     // sensitivity threshold corresponding to a 40 MHz PPDU that does not occupy the primary 20 MHz
     // and the OBSS-PD level plus 3 dB
-    VerifyCcaThreshold(m_phy->GetPhyEntity(WIFI_MOD_CLASS_HE),
-                       CreateDummyHePpdu(40, m_phy->GetOperatingChannel()),
-                       WIFI_CHANLIST_SECONDARY40,
-                       std::max(m_obssPdLevel + static_cast<dB_u>(3.0),
-                                std::get<1>(m_secondaryCcaSensitivityThresholds)));
+    VerifyCcaThreshold(
+        m_phy->GetPhyEntity(WIFI_MOD_CLASS_HE),
+        CreateDummyHePpdu(MHz_u{40}, m_phy->GetOperatingChannel()),
+        WIFI_CHANLIST_SECONDARY40,
+        std::max(m_obssPdLevel + dB_u{3.0}, std::get<1>(m_secondaryCcaSensitivityThresholds)));
 
     // HE PHY: 20 MHz HE PPDU in secondary80 channel (80 MHz) if power above the max between the CCA
     // sensitivity threshold corresponding to a 20 MHz PPDU that does not occupy the primary 20 MHz
     // and the OBSS-PD level
     VerifyCcaThreshold(m_phy->GetPhyEntity(WIFI_MOD_CLASS_HE),
-                       CreateDummyHePpdu(20, m_phy->GetOperatingChannel()),
+                       CreateDummyHePpdu(MHz_u{20}, m_phy->GetOperatingChannel()),
                        WIFI_CHANLIST_SECONDARY80,
                        std::max(m_obssPdLevel, std::get<0>(m_secondaryCcaSensitivityThresholds)));
 
     // HE PHY: 40 MHz HE PPDU in secondary80 channel (80 MHz) if power above the max between the CCA
     // sensitivity threshold corresponding to a 40 MHz PPDU that does not occupy the primary 20 MHz
     // and the OBSS-PD level plus 3 dB
-    VerifyCcaThreshold(m_phy->GetPhyEntity(WIFI_MOD_CLASS_HE),
-                       CreateDummyHePpdu(40, m_phy->GetOperatingChannel()),
-                       WIFI_CHANLIST_SECONDARY80,
-                       std::max(m_obssPdLevel + static_cast<dB_u>(3.0),
-                                std::get<1>(m_secondaryCcaSensitivityThresholds)));
+    VerifyCcaThreshold(
+        m_phy->GetPhyEntity(WIFI_MOD_CLASS_HE),
+        CreateDummyHePpdu(MHz_u{40}, m_phy->GetOperatingChannel()),
+        WIFI_CHANLIST_SECONDARY80,
+        std::max(m_obssPdLevel + dB_u{3.0}, std::get<1>(m_secondaryCcaSensitivityThresholds)));
 
     // HE PHY: 80 MHz HE PPDU in secondary80 channel (80 MHz) if power above the max between the CCA
     // sensitivity threshold corresponding to a 80 MHz PPDU that does not occupy the primary 20 MHz
     // and the OBSS-PD level plus 6 dB
-    VerifyCcaThreshold(m_phy->GetPhyEntity(WIFI_MOD_CLASS_HE),
-                       CreateDummyHePpdu(80, m_phy->GetOperatingChannel()),
-                       WIFI_CHANLIST_SECONDARY80,
-                       std::max(m_obssPdLevel + static_cast<dB_u>(6.0),
-                                std::get<2>(m_secondaryCcaSensitivityThresholds)));
+    VerifyCcaThreshold(
+        m_phy->GetPhyEntity(WIFI_MOD_CLASS_HE),
+        CreateDummyHePpdu(MHz_u{80}, m_phy->GetOperatingChannel()),
+        WIFI_CHANLIST_SECONDARY80,
+        std::max(m_obssPdLevel + dB_u{6.0}, std::get<2>(m_secondaryCcaSensitivityThresholds)));
 }
 
 void
 WifiPhyCcaThresholdsTest::DoRun()
 {
     // default attributes
-    m_CcaEdThreshold = -62.0;
-    m_CcaSensitivity = -82.0;
-    m_secondaryCcaSensitivityThresholds = std::make_tuple(-72.0, -72.0, -69.0);
-    m_obssPdLevel = -82.0;
+    m_CcaEdThreshold = dBm_u{-62};
+    m_CcaSensitivity = dBm_u{-82};
+    m_secondaryCcaSensitivityThresholds = std::make_tuple(dBm_u{-72}, dBm_u{-72}, dBm_u{-69});
+    m_obssPdLevel = dBm_u{-82};
     RunOne();
 
     // default attributes with OBSS-PD level set to -80 dBm
-    m_CcaEdThreshold = -62.0;
-    m_CcaSensitivity = -82.0;
-    m_secondaryCcaSensitivityThresholds = std::make_tuple(-72.0, -72.0, -69.0);
-    m_obssPdLevel = -80.0;
+    m_CcaEdThreshold = dBm_u{-62};
+    m_CcaSensitivity = dBm_u{-82};
+    m_secondaryCcaSensitivityThresholds = std::make_tuple(dBm_u{-72}, dBm_u{-72}, dBm_u{-69});
+    m_obssPdLevel = dBm_u{-80};
     RunOne();
 
     // default attributes with OBSS-PD level set to -70 dBm
-    m_CcaEdThreshold = -62.0;
-    m_CcaSensitivity = -82.0;
-    m_secondaryCcaSensitivityThresholds = std::make_tuple(-72.0, -72.0, -69.0);
-    m_obssPdLevel = -70.0;
+    m_CcaEdThreshold = dBm_u{-62};
+    m_CcaSensitivity = dBm_u{-82};
+    m_secondaryCcaSensitivityThresholds = std::make_tuple(dBm_u{-72}, dBm_u{-72}, dBm_u{-69});
+    m_obssPdLevel = dBm_u{-70};
     RunOne();
 
     // CCA-ED set to -65 dBm
-    m_CcaEdThreshold = -65.0;
-    m_CcaSensitivity = -82.0;
-    m_secondaryCcaSensitivityThresholds = std::make_tuple(-72.0, -72.0, -69.0);
-    m_obssPdLevel = -82.0;
+    m_CcaEdThreshold = dBm_u{-65};
+    m_CcaSensitivity = dBm_u{-82};
+    m_secondaryCcaSensitivityThresholds = std::make_tuple(dBm_u{-72}, dBm_u{-72}, dBm_u{-69});
+    m_obssPdLevel = dBm_u{-82};
     RunOne();
 
     // CCA sensitivity for signals in primary set to -75 dBm
-    m_CcaEdThreshold = -62.0;
-    m_CcaSensitivity = -75.0;
-    m_secondaryCcaSensitivityThresholds = std::make_tuple(-72.0, -72.0, -69.0);
-    m_obssPdLevel = -82.0;
+    m_CcaEdThreshold = dBm_u{-62};
+    m_CcaSensitivity = dBm_u{-75};
+    m_secondaryCcaSensitivityThresholds = std::make_tuple(dBm_u{-72}, dBm_u{-72}, dBm_u{-69});
+    m_obssPdLevel = dBm_u{-82};
     RunOne();
 
     // custom CCA sensitivities for signals not in primary
-    m_CcaEdThreshold = -62.0;
-    m_CcaSensitivity = -72.0;
-    m_secondaryCcaSensitivityThresholds = std::make_tuple(-70.0, -70.0, -70.0);
-    m_obssPdLevel = -82.0;
+    m_CcaEdThreshold = dBm_u{-62};
+    m_CcaSensitivity = dBm_u{-72};
+    m_secondaryCcaSensitivityThresholds = std::make_tuple(dBm_u{-70}, dBm_u{-70}, dBm_u{-70});
+    m_obssPdLevel = dBm_u{-82};
     RunOne();
 
     // custom CCA sensitivities for signals not in primary with OBSS-PD level set to -80 dBm
-    m_CcaEdThreshold = -62.0;
-    m_CcaSensitivity = -72.0;
-    m_secondaryCcaSensitivityThresholds = std::make_tuple(-70.0, -70.0, -70.0);
-    m_obssPdLevel = -80.0;
+    m_CcaEdThreshold = dBm_u{-62};
+    m_CcaSensitivity = dBm_u{-72};
+    m_secondaryCcaSensitivityThresholds = std::make_tuple(dBm_u{-70}, dBm_u{-70}, dBm_u{-70});
+    m_obssPdLevel = dBm_u{-80};
     RunOne();
 
     // custom CCA sensitivities for signals not in primary with OBSS-PD level set to -70 dBm
-    m_CcaEdThreshold = -62.0;
-    m_CcaSensitivity = -72.0;
-    m_secondaryCcaSensitivityThresholds = std::make_tuple(-70.0, -70.0, -70.0);
-    m_obssPdLevel = -70.0;
+    m_CcaEdThreshold = dBm_u{-62};
+    m_CcaSensitivity = dBm_u{-72};
+    m_secondaryCcaSensitivityThresholds = std::make_tuple(dBm_u{-70}, dBm_u{-70}, dBm_u{-70});
+    m_obssPdLevel = dBm_u{-70};
     RunOne();
 
     Simulator::Destroy();
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief PHY listener for CCA tests
+ * @brief PHY listener for CCA tests
  */
 class CcaTestPhyListener : public ns3::WifiPhyListener
 {
@@ -685,10 +688,10 @@
 };
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Wifi Phy Threshold Test base class
+ * @brief Wifi Phy Threshold Test base class
  */
 class WifiPhyCcaIndicationTest : public TestCase
 {
@@ -702,19 +705,19 @@
 
     /**
      * Send an HE SU PPDU
-     * \param txPower the transmit power
-     * \param frequency the center frequency the transmitter is operating on
-     * \param bandwidth the bandwidth to use for the transmission
+     * @param txPower the transmit power
+     * @param frequency the center frequency the transmitter is operating on
+     * @param bandwidth the bandwidth to use for the transmission
      */
     void SendHeSuPpdu(dBm_u txPower, MHz_u frequency, MHz_u bandwidth);
 
     /**
      * Start to generate a signal
-     * \param signalGenerator the signal generator to use
-     * \param txPower the transmit power
-     * \param frequency the center frequency of the signal to send
-     * \param bandwidth the bandwidth of the signal to send
-     * \param duration the duration of the signal
+     * @param signalGenerator the signal generator to use
+     * @param txPower the transmit power
+     * @param frequency the center frequency of the signal to send
+     * @param bandwidth the bandwidth of the signal to send
+     * @param duration the duration of the signal
      */
     void StartSignal(Ptr<WaveformGenerator> signalGenerator,
                      dBm_u txPower,
@@ -723,23 +726,23 @@
                      Time duration);
     /**
      * Stop to generate a signal
-     * \param signalGenerator the signal generator to use
+     * @param signalGenerator the signal generator to use
      */
     void StopSignal(Ptr<WaveformGenerator> signalGenerator);
 
     /**
      * Check the PHY state
-     * \param expectedState the expected state of the PHY
+     * @param expectedState the expected state of the PHY
      */
     void CheckPhyState(WifiPhyState expectedState);
-    /// \copydoc CheckPhyState
+    /// @copydoc CheckPhyState
     void DoCheckPhyState(WifiPhyState expectedState);
 
     /**
      * Check the last CCA-BUSY notification
-     * \param expectedEndTime the expected CCA-BUSY end time
-     * \param expectedChannelType the expected channel type
-     * \param expectedPer20MhzDurations the expected per-20 MHz CCA-BUSY durations
+     * @param expectedEndTime the expected CCA-BUSY end time
+     * @param expectedChannelType the expected channel type
+     * @param expectedPer20MhzDurations the expected per-20 MHz CCA-BUSY durations
      */
     void CheckLastCcaBusyNotification(Time expectedEndTime,
                                       WifiChannelListType expectedChannelType,
@@ -748,7 +751,7 @@
     /**
      * Log scenario description
      *
-     * \param log the scenario description to add to log
+     * @param log the scenario description to add to log
      */
     void LogScenario(const std::string& log) const;
 
@@ -798,11 +801,11 @@
 
     /**
      * Schedule test to perform.
-     * \param delay the reference delay to schedule the events
-     * \param generatedSignals the vector of signals to be generated
-     * \param generatedPpdus the vector of PPDUs to be generated
-     * \param stateCheckpoints the vector of PHY state checks
-     * \param ccaCheckpoints the vector of PHY CCA checks
+     * @param delay the reference delay to schedule the events
+     * @param generatedSignals the vector of signals to be generated
+     * @param generatedPpdus the vector of PPDUs to be generated
+     * @param stateCheckpoints the vector of PHY state checks
+     * @param ccaCheckpoints the vector of PHY CCA checks
      */
     void ScheduleTest(Time delay,
                       const std::vector<TxSignalInfo>& generatedSignals,
@@ -838,7 +841,7 @@
     : TestCase("Wi-Fi PHY CCA indication test"),
       m_numSignalGenerators(2),
       m_frequency(P20_CENTER_FREQUENCY),
-      m_channelWidth(20)
+      m_channelWidth(MHz_u{20})
 {
 }
 
@@ -852,15 +855,15 @@
     NS_LOG_FUNCTION(this << signalGenerator << txPower << frequency << bandwidth << duration);
 
     BandInfo bandInfo;
-    bandInfo.fc = frequency * 1e6;
-    bandInfo.fl = bandInfo.fc - ((bandwidth / 2) * 1e6);
-    bandInfo.fh = bandInfo.fc + ((bandwidth / 2) * 1e6);
+    bandInfo.fc = MHzToHz(frequency);
+    bandInfo.fl = bandInfo.fc - MHzToHz(bandwidth / 2);
+    bandInfo.fh = bandInfo.fc + MHzToHz(bandwidth / 2);
     Bands bands;
     bands.push_back(bandInfo);
 
     Ptr<SpectrumModel> spectrumSignal = Create<SpectrumModel>(bands);
     Ptr<SpectrumValue> signalPsd = Create<SpectrumValue>(spectrumSignal);
-    *signalPsd = DbmToW(txPower) / (bandwidth * 1e6);
+    *signalPsd = DbmToW(txPower) / MHzToHz(bandwidth);
 
     signalGenerator->SetTxPowerSpectralDensity(signalPsd);
     signalGenerator->SetPeriod(duration);
@@ -1105,9 +1108,9 @@
         WifiPhy::ChannelTuple{channelNum, m_channelWidth, WIFI_PHY_BAND_5GHZ, 0});
 
     std::vector<Time> expectedPer20MhzCcaBusyDurations{};
-    Time delay = Seconds(0.0);
+    Time delay;
     Simulator::Schedule(delay, &WifiPhyCcaIndicationTest::Reset, this);
-    delay += Seconds(1.0);
+    delay += Seconds(1);
 
     //----------------------------------------------------------------------------------------------------------------------------------
     // Verify PHY state stays IDLE and no CCA-BUSY indication is reported when a signal below the
@@ -1116,18 +1119,19 @@
                         &WifiPhyCcaIndicationTest::LogScenario,
                         this,
                         "Reception of a signal that occupies P20 below ED threshold");
-    ScheduleTest(delay,
-                 {{-65.0, MicroSeconds(0), MicroSeconds(100), P20_CENTER_FREQUENCY, 20}},
-                 {},
-                 {
-                     {aCcaTime, WifiPhyState::IDLE}, // IDLE after aCCATime
-                     {MicroSeconds(100) - smallDelta,
-                      WifiPhyState::IDLE}, // IDLE just before the transmission ends
-                     {MicroSeconds(100) + smallDelta,
-                      WifiPhyState::IDLE} // IDLE just after the transmission ends
-                 },
-                 {});
-    delay += Seconds(1.0);
+    ScheduleTest(
+        delay,
+        {{dBm_u{-65}, MicroSeconds(0), MicroSeconds(100), P20_CENTER_FREQUENCY, MHz_u{20}}},
+        {},
+        {
+            {aCcaTime, WifiPhyState::IDLE}, // IDLE after aCCATime
+            {MicroSeconds(100) - smallDelta,
+             WifiPhyState::IDLE}, // IDLE just before the transmission ends
+            {MicroSeconds(100) + smallDelta,
+             WifiPhyState::IDLE} // IDLE just after the transmission ends
+        },
+        {});
+    delay += Seconds(1);
 
     //----------------------------------------------------------------------------------------------------------------------------------
     // Verify PHY state is CCA-BUSY as long as a 20 MHz signal above the energy detection threshold
@@ -1136,36 +1140,37 @@
                         &WifiPhyCcaIndicationTest::LogScenario,
                         this,
                         "Reception of signal that occupies P20 above ED threshold");
-    ScheduleTest(delay,
-                 {{-60.0, MicroSeconds(0), MicroSeconds(100), P20_CENTER_FREQUENCY, 20}},
-                 {},
-                 {
-                     {aCcaTime, WifiPhyState::CCA_BUSY}, // CCA-BUSY after aCCATime
-                     {MicroSeconds(100) - smallDelta,
-                      WifiPhyState::CCA_BUSY}, // CCA-BUSY just before the transmission ends
-                     {MicroSeconds(100) + smallDelta,
-                      WifiPhyState::IDLE} // IDLE just after the transmission ends
-                 },
-                 {{MicroSeconds(100) - smallDelta,
-                   MicroSeconds(100),
-                   WIFI_CHANLIST_PRIMARY,
-                   ((m_channelWidth > 20)
-                        ? ((m_channelWidth > 40)
-                               ? ((m_channelWidth > 80) ? std::vector<Time>{MicroSeconds(100),
-                                                                            MicroSeconds(0),
-                                                                            MicroSeconds(0),
-                                                                            MicroSeconds(0),
-                                                                            MicroSeconds(0),
-                                                                            MicroSeconds(0),
-                                                                            MicroSeconds(0),
-                                                                            MicroSeconds(0)}
-                                                        : std::vector<Time>{MicroSeconds(100),
-                                                                            MicroSeconds(0),
-                                                                            MicroSeconds(0),
-                                                                            MicroSeconds(0)})
-                               : std::vector<Time>{MicroSeconds(100), MicroSeconds(0)})
-                        : std::vector<Time>{})}});
-    delay += Seconds(1.0);
+    ScheduleTest(
+        delay,
+        {{dBm_u{-60.0}, MicroSeconds(0), MicroSeconds(100), P20_CENTER_FREQUENCY, MHz_u{20}}},
+        {},
+        {
+            {aCcaTime, WifiPhyState::CCA_BUSY}, // CCA-BUSY after aCCATime
+            {MicroSeconds(100) - smallDelta,
+             WifiPhyState::CCA_BUSY}, // CCA-BUSY just before the transmission ends
+            {MicroSeconds(100) + smallDelta,
+             WifiPhyState::IDLE} // IDLE just after the transmission ends
+        },
+        {{MicroSeconds(100) - smallDelta,
+          MicroSeconds(100),
+          WIFI_CHANLIST_PRIMARY,
+          ((m_channelWidth > MHz_u{20})
+               ? ((m_channelWidth > MHz_u{40})
+                      ? ((m_channelWidth > MHz_u{80}) ? std::vector<Time>{MicroSeconds(100),
+                                                                          MicroSeconds(0),
+                                                                          MicroSeconds(0),
+                                                                          MicroSeconds(0),
+                                                                          MicroSeconds(0),
+                                                                          MicroSeconds(0),
+                                                                          MicroSeconds(0),
+                                                                          MicroSeconds(0)}
+                                                      : std::vector<Time>{MicroSeconds(100),
+                                                                          MicroSeconds(0),
+                                                                          MicroSeconds(0),
+                                                                          MicroSeconds(0)})
+                      : std::vector<Time>{MicroSeconds(100), MicroSeconds(0)})
+               : std::vector<Time>{})}});
+    delay += Seconds(1);
 
     //----------------------------------------------------------------------------------------------------------------------------------
     // Verify PHY state is CCA-BUSY as long as the sum of 20 MHz signals occupying P20 is above the
@@ -1177,8 +1182,8 @@
                         "sum above ED threshold");
     ScheduleTest(
         delay,
-        {{-64.0, MicroSeconds(0), MicroSeconds(100), P20_CENTER_FREQUENCY, 20},
-         {-65.0, MicroSeconds(50), MicroSeconds(200), P20_CENTER_FREQUENCY, 20}},
+        {{dBm_u{-64.0}, MicroSeconds(0), MicroSeconds(100), P20_CENTER_FREQUENCY, MHz_u{20}},
+         {dBm_u{-65.0}, MicroSeconds(50), MicroSeconds(200), P20_CENTER_FREQUENCY, MHz_u{20}}},
         {},
         {
             {MicroSeconds(50) + aCcaTime, WifiPhyState::CCA_BUSY}, // CCA-BUSY after aCCATime
@@ -1190,23 +1195,23 @@
         {{MicroSeconds(100) - smallDelta,
           MicroSeconds(100),
           WIFI_CHANLIST_PRIMARY,
-          ((m_channelWidth > 20)
-               ? ((m_channelWidth > 40)
-                      ? ((m_channelWidth > 80) ? std::vector<Time>{MicroSeconds(50),
-                                                                   MicroSeconds(0),
-                                                                   MicroSeconds(0),
-                                                                   MicroSeconds(0),
-                                                                   MicroSeconds(0),
-                                                                   MicroSeconds(0),
-                                                                   MicroSeconds(0),
-                                                                   MicroSeconds(0)}
-                                               : std::vector<Time>{MicroSeconds(50),
-                                                                   MicroSeconds(0),
-                                                                   MicroSeconds(0),
-                                                                   MicroSeconds(0)})
+          ((m_channelWidth > MHz_u{20})
+               ? ((m_channelWidth > MHz_u{40})
+                      ? ((m_channelWidth > MHz_u{80}) ? std::vector<Time>{MicroSeconds(50),
+                                                                          MicroSeconds(0),
+                                                                          MicroSeconds(0),
+                                                                          MicroSeconds(0),
+                                                                          MicroSeconds(0),
+                                                                          MicroSeconds(0),
+                                                                          MicroSeconds(0),
+                                                                          MicroSeconds(0)}
+                                                      : std::vector<Time>{MicroSeconds(50),
+                                                                          MicroSeconds(0),
+                                                                          MicroSeconds(0),
+                                                                          MicroSeconds(0)})
                       : std::vector<Time>{MicroSeconds(50), MicroSeconds(0)})
                : std::vector<Time>{})}});
-    delay += Seconds(1.0);
+    delay += Seconds(1);
 
     //----------------------------------------------------------------------------------------------------------------------------------
     // Verify PHY state stays IDLE when a 20 MHz HE SU PPDU with received power below the
@@ -1218,16 +1223,16 @@
         "Reception of a 20 MHz HE PPDU that occupies P20 below CCA sensitivity threshold");
     ScheduleTest(delay,
                  {},
-                 {{-85.0, MicroSeconds(0), P20_CENTER_FREQUENCY, 20}},
+                 {{dBm_u{-85}, MicroSeconds(0), P20_CENTER_FREQUENCY, MHz_u{20}}},
                  {
                      {aCcaTime, WifiPhyState::IDLE}, // IDLE after aCCATime
-                     {PpduDurations.at(20) - smallDelta,
+                     {PpduDurations.at(MHz_u{20}) - smallDelta,
                       WifiPhyState::IDLE}, // IDLE just before the transmission ends
-                     {PpduDurations.at(20) + smallDelta,
+                     {PpduDurations.at(MHz_u{20}) + smallDelta,
                       WifiPhyState::IDLE} // IDLE just after the transmission ends
                  },
                  {});
-    delay += Seconds(1.0);
+    delay += Seconds(1);
 
     //----------------------------------------------------------------------------------------------------------------------------------
     // Verify PHY state transitions to CCA-BUSY when an HE SU PPDU with received power above the CCA
@@ -1241,12 +1246,12 @@
     ScheduleTest(
         delay,
         {},
-        {{-80.0, MicroSeconds(0), P20_CENTER_FREQUENCY, 20}},
+        {{dBm_u{-80}, MicroSeconds(0), P20_CENTER_FREQUENCY, MHz_u{20}}},
         {
             {aCcaTime, WifiPhyState::CCA_BUSY}, // CCA-BUSY after aCCATime
-            {PpduDurations.at(20) - smallDelta,
+            {PpduDurations.at(MHz_u{20}) - smallDelta,
              WifiPhyState::RX}, // RX just before the transmission ends
-            {PpduDurations.at(20) + smallDelta,
+            {PpduDurations.at(MHz_u{20}) + smallDelta,
              WifiPhyState::IDLE} // IDLE just after the transmission ends
         },
         {{aCcaTime,
@@ -1266,7 +1271,7 @@
                              : std::vector<Time>{Seconds(0), Seconds(0), Seconds(0), Seconds(0)})
                       : std::vector<Time>{Seconds(0), Seconds(0)})
                : std::vector<Time>{})}});
-    delay += Seconds(1.0);
+    delay += Seconds(1);
 
     //----------------------------------------------------------------------------------------------------------------------------------
     // Verify PHY state stays IDLE when a 40 MHz HE SU PPDU with received power below the CCA
@@ -1278,16 +1283,16 @@
         "Reception of a 40 MHz HE PPDU that occupies P20 below CCA sensitivity threshold");
     ScheduleTest(delay,
                  {},
-                 {{-80.0, MicroSeconds(0), P40_CENTER_FREQUENCY, 40}},
+                 {{dBm_u{-80}, MicroSeconds(0), P40_CENTER_FREQUENCY, MHz_u{40}}},
                  {
                      {aCcaTime, WifiPhyState::IDLE}, // IDLE after aCCATime
-                     {PpduDurations.at(40) - smallDelta,
+                     {PpduDurations.at(MHz_u{40}) - smallDelta,
                       WifiPhyState::IDLE}, // IDLE just before the transmission ends
-                     {PpduDurations.at(40) + smallDelta,
+                     {PpduDurations.at(MHz_u{40}) + smallDelta,
                       WifiPhyState::IDLE} // IDLE just after the transmission ends
                  },
                  {});
-    delay += Seconds(1.0);
+    delay += Seconds(1);
 
     //----------------------------------------------------------------------------------------------------------------------------------
     // Verify PHY state transitions to CCA-BUSY when an HE SU PPDU with received power above the CCA
@@ -1301,14 +1306,14 @@
     ScheduleTest(
         delay,
         {},
-        {{-75.0, MicroSeconds(0), P40_CENTER_FREQUENCY, 40}},
+        {{dBm_u{-75}, MicroSeconds(0), P40_CENTER_FREQUENCY, MHz_u{40}}},
         {
             {aCcaTime, WifiPhyState::CCA_BUSY}, // CCA-BUSY after aCCATime
-            {PpduDurations.at(40) - smallDelta,
-             (m_channelWidth > 20)
+            {PpduDurations.at(MHz_u{40}) - smallDelta,
+             (m_channelWidth > MHz_u{20})
                  ? WifiPhyState::RX
                  : WifiPhyState::CCA_BUSY}, // RX or IDLE just before the transmission ends
-            {PpduDurations.at(40) + smallDelta,
+            {PpduDurations.at(MHz_u{40}) + smallDelta,
              WifiPhyState::IDLE} // IDLE just after the transmission ends
         },
         {{aCcaTime,
@@ -1328,9 +1333,9 @@
                              : std::vector<Time>{Seconds(0), Seconds(0), Seconds(0), Seconds(0)})
                       : std::vector<Time>{Seconds(0), Seconds(0)})
                : std::vector<Time>{})}});
-    delay += Seconds(1.0);
+    delay += Seconds(1);
 
-    if (m_channelWidth > 20)
+    if (m_channelWidth > MHz_u{20})
     {
         //----------------------------------------------------------------------------------------------------------------------------------
         // Verify PHY state stays IDLE and no CCA-BUSY indication is reported when a 20 MHz signal
@@ -1339,18 +1344,19 @@
                             &WifiPhyCcaIndicationTest::LogScenario,
                             this,
                             "Reception of a 20 MHz signal that occupies S20 below ED threshold");
-        ScheduleTest(delay,
-                     {{-65.0, MicroSeconds(0), MicroSeconds(100), S20_CENTER_FREQUENCY, 20}},
-                     {},
-                     {
-                         {aCcaTime, WifiPhyState::IDLE}, // IDLE after aCCATime
-                         {MicroSeconds(100) - smallDelta,
-                          WifiPhyState::IDLE}, // IDLE just before the transmission ends
-                         {MicroSeconds(100) + smallDelta,
-                          WifiPhyState::IDLE} // IDLE just after the transmission ends
-                     },
-                     {});
-        delay += Seconds(1.0);
+        ScheduleTest(
+            delay,
+            {{dBm_u{-65}, MicroSeconds(0), MicroSeconds(100), S20_CENTER_FREQUENCY, MHz_u{20}}},
+            {},
+            {
+                {aCcaTime, WifiPhyState::IDLE}, // IDLE after aCCATime
+                {MicroSeconds(100) - smallDelta,
+                 WifiPhyState::IDLE}, // IDLE just before the transmission ends
+                {MicroSeconds(100) + smallDelta,
+                 WifiPhyState::IDLE} // IDLE just after the transmission ends
+            },
+            {});
+        delay += Seconds(1);
 
         //----------------------------------------------------------------------------------------------------------------------------------
         // Verify PHY state stays IDLE but CCA-BUSY indication is reported when a 20 MHz signal
@@ -1361,7 +1367,7 @@
                             "Reception of a 20 MHz signal that occupies S20 above ED threshold");
         ScheduleTest(
             delay,
-            {{-60.0, MicroSeconds(0), MicroSeconds(100), S20_CENTER_FREQUENCY, 20}},
+            {{dBm_u{-60}, MicroSeconds(0), MicroSeconds(100), S20_CENTER_FREQUENCY, MHz_u{20}}},
             {},
             {
                 {aCcaTime, WifiPhyState::IDLE}, // IDLE after aCCATime
@@ -1373,20 +1379,21 @@
             {{MicroSeconds(100) - smallDelta,
               MicroSeconds(100),
               WIFI_CHANLIST_SECONDARY,
-              ((m_channelWidth > 40) ? ((m_channelWidth > 80) ? std::vector<Time>{MicroSeconds(0),
-                                                                                  MicroSeconds(100),
-                                                                                  MicroSeconds(0),
-                                                                                  MicroSeconds(0),
-                                                                                  MicroSeconds(0),
-                                                                                  MicroSeconds(0),
-                                                                                  MicroSeconds(0),
-                                                                                  MicroSeconds(0)}
-                                                              : std::vector<Time>{MicroSeconds(0),
-                                                                                  MicroSeconds(100),
-                                                                                  MicroSeconds(0),
-                                                                                  MicroSeconds(0)})
-                                     : std::vector<Time>{MicroSeconds(0), MicroSeconds(100)})}});
-        delay += Seconds(1.0);
+              ((m_channelWidth > MHz_u{40})
+                   ? ((m_channelWidth > MHz_u{80}) ? std::vector<Time>{MicroSeconds(0),
+                                                                       MicroSeconds(100),
+                                                                       MicroSeconds(0),
+                                                                       MicroSeconds(0),
+                                                                       MicroSeconds(0),
+                                                                       MicroSeconds(0),
+                                                                       MicroSeconds(0),
+                                                                       MicroSeconds(0)}
+                                                   : std::vector<Time>{MicroSeconds(0),
+                                                                       MicroSeconds(100),
+                                                                       MicroSeconds(0),
+                                                                       MicroSeconds(0)})
+                   : std::vector<Time>{MicroSeconds(0), MicroSeconds(100)})}});
+        delay += Seconds(1);
 
         //----------------------------------------------------------------------------------------------------------------------------------
         // Verify PHY state is CCA-BUSY as long as a 40 MHz signal above the energy detection
@@ -1397,7 +1404,7 @@
                             "Reception of a 40 MHz signal that occupies P40 above ED threshold");
         ScheduleTest(
             delay,
-            {{-55.0, MicroSeconds(0), MicroSeconds(100), P40_CENTER_FREQUENCY, 40}},
+            {{dBm_u{-55}, MicroSeconds(0), MicroSeconds(100), P40_CENTER_FREQUENCY, MHz_u{40}}},
             {},
             {
                 {aCcaTime, WifiPhyState::CCA_BUSY}, // CCA-BUSY after aCCATime
@@ -1422,7 +1429,7 @@
                                                                                   MicroSeconds(0),
                                                                                   MicroSeconds(0)})
                                      : std::vector<Time>{MicroSeconds(100), MicroSeconds(100)})}});
-        delay += Seconds(1.0);
+        delay += Seconds(1);
 
         //----------------------------------------------------------------------------------------------------------------------------------
         // Verify PHY notifies CCA-BUSY for the primary channel while the secondary channel was
@@ -1434,8 +1441,8 @@
                             "another signal that occupies P20");
         ScheduleTest(
             delay,
-            {{-60.0, MicroSeconds(0), MicroSeconds(100), S20_CENTER_FREQUENCY, 20},
-             {-60.0, MicroSeconds(50), MicroSeconds(100), P20_CENTER_FREQUENCY, 20}},
+            {{dBm_u{-60}, MicroSeconds(0), MicroSeconds(100), S20_CENTER_FREQUENCY, MHz_u{20}},
+             {dBm_u{-60}, MicroSeconds(50), MicroSeconds(100), P20_CENTER_FREQUENCY, MHz_u{20}}},
             {},
             {
                 {aCcaTime, WifiPhyState::IDLE}, // state of primary stays idle after aCCATime
@@ -1479,7 +1486,7 @@
                                                                                   MicroSeconds(0),
                                                                                   MicroSeconds(0)})
                                      : std::vector<Time>{MicroSeconds(100), MicroSeconds(50)})}});
-        delay += Seconds(1.0);
+        delay += Seconds(1);
 
         //----------------------------------------------------------------------------------------------------------------------------------
         // Verify PHY updates per-20 MHz CCA durations if a signal arrives on the secondary channel
@@ -1491,8 +1498,8 @@
                             "another signal that occupies S20");
         ScheduleTest(
             delay,
-            {{-60.0, MicroSeconds(0), MicroSeconds(100), P20_CENTER_FREQUENCY, 20},
-             {-60.0, MicroSeconds(50), MicroSeconds(100), S20_CENTER_FREQUENCY, 20}},
+            {{dBm_u{-60}, MicroSeconds(0), MicroSeconds(100), P20_CENTER_FREQUENCY, MHz_u{20}},
+             {dBm_u{-60}, MicroSeconds(50), MicroSeconds(100), S20_CENTER_FREQUENCY, MHz_u{20}}},
             {},
             {
                 {aCcaTime, WifiPhyState::CCA_BUSY}, // CCA-BUSY after aCCATime
@@ -1536,7 +1543,7 @@
                                                                                   MicroSeconds(0),
                                                                                   MicroSeconds(0)})
                                      : std::vector<Time>{MicroSeconds(50), MicroSeconds(100)})}});
-        delay += Seconds(1.0);
+        delay += Seconds(1);
 
         //----------------------------------------------------------------------------------------------------------------------------------
         // Verify PHY state stays IDLE when a 20 MHz HE SU PPDU with received power below the CCA
@@ -1548,16 +1555,16 @@
             "Reception of a 20 MHz HE PPDU that occupies S20 below CCA sensitivity threshold");
         ScheduleTest(delay,
                      {},
-                     {{-75.0, MicroSeconds(0), S20_CENTER_FREQUENCY, 20}},
+                     {{dBm_u{-75}, MicroSeconds(0), S20_CENTER_FREQUENCY, MHz_u{20}}},
                      {
                          {aCcaTime, WifiPhyState::IDLE}, // IDLE after aCCATime
-                         {PpduDurations.at(20) - smallDelta,
+                         {PpduDurations.at(MHz_u{20}) - smallDelta,
                           WifiPhyState::IDLE}, // IDLE just before the transmission ends
-                         {PpduDurations.at(20) + smallDelta,
+                         {PpduDurations.at(MHz_u{20}) + smallDelta,
                           WifiPhyState::IDLE} // IDLE just after the transmission ends
                      },
                      {});
-        delay += Seconds(1.0);
+        delay += Seconds(1);
 
         //----------------------------------------------------------------------------------------------------------------------------------
         // Verify PHY state stays IDLE but CCA-BUSY indication is reported when a 20 MHz HE SU PPDU
@@ -1567,34 +1574,35 @@
             &WifiPhyCcaIndicationTest::LogScenario,
             this,
             "Reception of a 20 MHz HE PPDU that occupies S20 above CCA sensitivity threshold");
-        ScheduleTest(delay,
-                     {},
-                     {{-70.0, MicroSeconds(0), S20_CENTER_FREQUENCY, 20}},
-                     {
-                         {aCcaTime, WifiPhyState::IDLE}, // IDLE after aCCATime
-                         {PpduDurations.at(20) - smallDelta,
-                          WifiPhyState::IDLE}, // IDLE just before the transmission ends
-                         {PpduDurations.at(20) + smallDelta,
-                          WifiPhyState::IDLE} // IDLE just after the transmission ends
-                     },
-                     {{aCcaTime,
-                       PpduDurations.at(20),
-                       WIFI_CHANLIST_SECONDARY,
-                       ((m_channelWidth > 40)
-                            ? ((m_channelWidth > 80) ? std::vector<Time>{NanoSeconds(0),
-                                                                         PpduDurations.at(20),
-                                                                         NanoSeconds(0),
-                                                                         NanoSeconds(0),
-                                                                         NanoSeconds(0),
-                                                                         NanoSeconds(0),
-                                                                         NanoSeconds(0),
-                                                                         NanoSeconds(0)}
-                                                     : std::vector<Time>{NanoSeconds(0),
-                                                                         PpduDurations.at(20),
-                                                                         NanoSeconds(0),
-                                                                         NanoSeconds(0)})
-                            : std::vector<Time>{NanoSeconds(0), PpduDurations.at(20)})}});
-        delay += Seconds(1.0);
+        ScheduleTest(
+            delay,
+            {},
+            {{dBm_u{-70}, MicroSeconds(0), S20_CENTER_FREQUENCY, MHz_u{20}}},
+            {
+                {aCcaTime, WifiPhyState::IDLE}, // IDLE after aCCATime
+                {PpduDurations.at(MHz_u{20}) - smallDelta,
+                 WifiPhyState::IDLE}, // IDLE just before the transmission ends
+                {PpduDurations.at(MHz_u{20}) + smallDelta,
+                 WifiPhyState::IDLE} // IDLE just after the transmission ends
+            },
+            {{aCcaTime,
+              PpduDurations.at(MHz_u{20}),
+              WIFI_CHANLIST_SECONDARY,
+              ((m_channelWidth > MHz_u{40})
+                   ? ((m_channelWidth > MHz_u{80}) ? std::vector<Time>{NanoSeconds(0),
+                                                                       PpduDurations.at(MHz_u{20}),
+                                                                       NanoSeconds(0),
+                                                                       NanoSeconds(0),
+                                                                       NanoSeconds(0),
+                                                                       NanoSeconds(0),
+                                                                       NanoSeconds(0),
+                                                                       NanoSeconds(0)}
+                                                   : std::vector<Time>{NanoSeconds(0),
+                                                                       PpduDurations.at(MHz_u{20}),
+                                                                       NanoSeconds(0),
+                                                                       NanoSeconds(0)})
+                   : std::vector<Time>{NanoSeconds(0), PpduDurations.at(MHz_u{20})})}});
+        delay += Seconds(1);
 
         //----------------------------------------------------------------------------------------------------------------------------------
         // Verify PHY state stays IDLE but CCA-BUSY indication is still reported as long as a signal
@@ -1608,12 +1616,15 @@
             "MHz HE PPDU that occupies P40 below CCA sensitivity threshold");
         ScheduleTest(
             delay,
-            {{-60.0,
+            {{dBm_u{-60},
               MicroSeconds(0),
               MicroSeconds(100),
               S20_CENTER_FREQUENCY,
-              20}},                                                // signal on S20 above threshold
-            {{-80.0, MicroSeconds(50), P40_CENTER_FREQUENCY, 40}}, // PPDU on P40 below threshold
+              MHz_u{20}}}, // signal on S20 above threshold
+            {{dBm_u{-80},
+              MicroSeconds(50),
+              P40_CENTER_FREQUENCY,
+              MHz_u{40}}}, // PPDU on P40 below threshold
             {
                 {MicroSeconds(50) + aCcaTime, WifiPhyState::IDLE}, // PHY state stays IDLE
             },
@@ -1652,10 +1663,10 @@
                                                                                   MicroSeconds(0),
                                                                                   MicroSeconds(0)})
                                      : std::vector<Time>{MicroSeconds(0), MicroSeconds(46)})}});
-        delay += Seconds(1.0);
+        delay += Seconds(1);
     }
 
-    if (m_channelWidth > 40)
+    if (m_channelWidth > MHz_u{40})
     {
         //----------------------------------------------------------------------------------------------------------------------------------
         // Verify PHY state stays IDLE and no CCA-BUSY indication is reported when a signal below
@@ -1666,7 +1677,11 @@
                             "Reception of a 20 MHz signal that occupies the first subchannel of "
                             "S40 below ED threshold");
         ScheduleTest(delay,
-                     {{-65.0, MicroSeconds(0), MicroSeconds(100), S40_CENTER_FREQUENCY - 10, 20}},
+                     {{dBm_u{-65},
+                       MicroSeconds(0),
+                       MicroSeconds(100),
+                       S40_CENTER_FREQUENCY - MHz_u{10},
+                       MHz_u{20}}},
                      {},
                      {
                          {aCcaTime, WifiPhyState::IDLE}, // IDLE after aCCATime
@@ -1676,20 +1691,24 @@
                           WifiPhyState::IDLE} // IDLE just after the transmission ends
                      },
                      {});
-        delay += Seconds(1.0);
+        delay += Seconds(1);
 
         //----------------------------------------------------------------------------------------------------------------------------------
         // Verify PHY notifies CCA-BUSY for the S40 as long as a signal above the energy detection
         // threshold occupies the first 20 MHz subchannel of the S40: 27.3.20.6.4: Any signal within
         // the secondary 40 MHz channel at or above a threshold of –59 dBm within a period of
-        // aCCATime after the signal arrives at the receiver’s antenna(s).
+        // aCCATime after the signal arrives at the receiver's antenna(s).
         Simulator::Schedule(delay,
                             &WifiPhyCcaIndicationTest::LogScenario,
                             this,
                             "Reception of a 20 MHz signal that occupies the first subchannel of "
                             "S40 above ED threshold");
         ScheduleTest(delay,
-                     {{-55.0, MicroSeconds(0), MicroSeconds(100), S40_CENTER_FREQUENCY - 10, 20}},
+                     {{dBm_u{-55},
+                       MicroSeconds(0),
+                       MicroSeconds(100),
+                       S40_CENTER_FREQUENCY - MHz_u{10},
+                       MHz_u{20}}},
                      {},
                      {
                          {aCcaTime, WifiPhyState::IDLE}, // IDLE after aCCATime
@@ -1713,7 +1732,7 @@
                                                                   MicroSeconds(0),
                                                                   MicroSeconds(100),
                                                                   MicroSeconds(0)})}});
-        delay += Seconds(1.0);
+        delay += Seconds(1);
 
         //----------------------------------------------------------------------------------------------------------------------------------
         // Verify PHY state stays IDLE for the S40 if a signal below the energy detection threshold
@@ -1724,7 +1743,11 @@
                             "Reception of a 20 MHz signal that occupies the second subchannel of "
                             "S40 below ED threshold");
         ScheduleTest(delay,
-                     {{-65.0, MicroSeconds(0), MicroSeconds(100), S40_CENTER_FREQUENCY + 10, 20}},
+                     {{dBm_u{-65},
+                       MicroSeconds(0),
+                       MicroSeconds(100),
+                       S40_CENTER_FREQUENCY + MHz_u{10},
+                       MHz_u{20}}},
                      {},
                      {
                          {aCcaTime, WifiPhyState::IDLE}, // IDLE after aCCATime
@@ -1734,20 +1757,24 @@
                           WifiPhyState::IDLE} // IDLE just after the transmission ends
                      },
                      {});
-        delay += Seconds(1.0);
+        delay += Seconds(1);
 
         //----------------------------------------------------------------------------------------------------------------------------------
         // Verify PHY notifies CCA-BUSY for the S40 as long as a signal above the energy detection
         // threshold occupies the second 20 MHz subchannel of the S40: 27.3.20.6.4: Any signal
         // within the secondary 40 MHz channel at or above a threshold of –59 dBm within a period of
-        // aCCATime after the signal arrives at the receiver’s antenna(s).
+        // aCCATime after the signal arrives at the receiver's antenna(s).
         Simulator::Schedule(delay,
                             &WifiPhyCcaIndicationTest::LogScenario,
                             this,
                             "Reception of a 20 MHz signal that occupies the second subchannel of "
                             "S40 above ED threshold");
         ScheduleTest(delay,
-                     {{-55.0, MicroSeconds(0), MicroSeconds(100), S40_CENTER_FREQUENCY + 10, 20}},
+                     {{dBm_u{-55},
+                       MicroSeconds(0),
+                       MicroSeconds(100),
+                       S40_CENTER_FREQUENCY + MHz_u{10},
+                       MHz_u{20}}},
                      {},
                      {
                          {aCcaTime, WifiPhyState::IDLE}, // IDLE after aCCATime
@@ -1771,7 +1798,7 @@
                                                                   MicroSeconds(0),
                                                                   MicroSeconds(0),
                                                                   MicroSeconds(100)})}});
-        delay += Seconds(1.0);
+        delay += Seconds(1);
 
         //----------------------------------------------------------------------------------------------------------------------------------
         // Verify PHY state stays IDLE for the S40 if a signal below the energy detection threshold
@@ -1780,55 +1807,57 @@
                             &WifiPhyCcaIndicationTest::LogScenario,
                             this,
                             "Reception of a 40 MHz signal that occupies S40 below ED threshold");
-        ScheduleTest(delay,
-                     {{-60.0, MicroSeconds(0), MicroSeconds(100), S40_CENTER_FREQUENCY, 40}},
-                     {},
-                     {
-                         {aCcaTime, WifiPhyState::IDLE}, // IDLE after aCCATime
-                         {MicroSeconds(100) - smallDelta,
-                          WifiPhyState::IDLE}, // IDLE just before the transmission ends
-                         {MicroSeconds(100) + smallDelta,
-                          WifiPhyState::IDLE} // IDLE just after the transmission ends
-                     },
-                     {});
-        delay += Seconds(1.0);
+        ScheduleTest(
+            delay,
+            {{dBm_u{-60}, MicroSeconds(0), MicroSeconds(100), S40_CENTER_FREQUENCY, MHz_u{40}}},
+            {},
+            {
+                {aCcaTime, WifiPhyState::IDLE}, // IDLE after aCCATime
+                {MicroSeconds(100) - smallDelta,
+                 WifiPhyState::IDLE}, // IDLE just before the transmission ends
+                {MicroSeconds(100) + smallDelta,
+                 WifiPhyState::IDLE} // IDLE just after the transmission ends
+            },
+            {});
+        delay += Seconds(1);
 
         //----------------------------------------------------------------------------------------------------------------------------------
         // Verify PHY notifies CCA-BUSY for the S40 as long as a signal above the energy detection
         // threshold occupies S40: 27.3.20.6.4: Any signal within the secondary 40 MHz channel at or
         // above a threshold of –59 dBm within a period of aCCATime after the signal arrives at the
-        // receiver’s antenna(s).
+        // receiver's antenna(s).
         Simulator::Schedule(delay,
                             &WifiPhyCcaIndicationTest::LogScenario,
                             this,
                             "Reception of a 20 MHz signal that occupies the second subchannel of "
                             "S40 above ED threshold");
-        ScheduleTest(delay,
-                     {{-55.0, MicroSeconds(0), MicroSeconds(100), S40_CENTER_FREQUENCY, 40}},
-                     {},
-                     {
-                         {aCcaTime, WifiPhyState::IDLE}, // IDLE after aCCATime
-                         {MicroSeconds(100) - smallDelta,
-                          WifiPhyState::IDLE}, // IDLE just before the transmission ends
-                         {MicroSeconds(100) + smallDelta,
-                          WifiPhyState::IDLE} // IDLE just after the transmission ends
-                     },
-                     {{MicroSeconds(100) - smallDelta,
-                       MicroSeconds(100),
-                       WIFI_CHANLIST_SECONDARY40,
-                       ((m_channelWidth > 80) ? std::vector<Time>{MicroSeconds(0),
-                                                                  MicroSeconds(0),
-                                                                  MicroSeconds(100),
-                                                                  MicroSeconds(100),
-                                                                  MicroSeconds(0),
-                                                                  MicroSeconds(0),
-                                                                  MicroSeconds(0),
-                                                                  MicroSeconds(0)}
-                                              : std::vector<Time>{MicroSeconds(0),
-                                                                  MicroSeconds(0),
-                                                                  MicroSeconds(100),
-                                                                  MicroSeconds(100)})}});
-        delay += Seconds(1.0);
+        ScheduleTest(
+            delay,
+            {{dBm_u{-55}, MicroSeconds(0), MicroSeconds(100), S40_CENTER_FREQUENCY, MHz_u{40}}},
+            {},
+            {
+                {aCcaTime, WifiPhyState::IDLE}, // IDLE after aCCATime
+                {MicroSeconds(100) - smallDelta,
+                 WifiPhyState::IDLE}, // IDLE just before the transmission ends
+                {MicroSeconds(100) + smallDelta,
+                 WifiPhyState::IDLE} // IDLE just after the transmission ends
+            },
+            {{MicroSeconds(100) - smallDelta,
+              MicroSeconds(100),
+              WIFI_CHANLIST_SECONDARY40,
+              ((m_channelWidth > MHz_u{80}) ? std::vector<Time>{MicroSeconds(0),
+                                                                MicroSeconds(0),
+                                                                MicroSeconds(100),
+                                                                MicroSeconds(100),
+                                                                MicroSeconds(0),
+                                                                MicroSeconds(0),
+                                                                MicroSeconds(0),
+                                                                MicroSeconds(0)}
+                                            : std::vector<Time>{MicroSeconds(0),
+                                                                MicroSeconds(0),
+                                                                MicroSeconds(100),
+                                                                MicroSeconds(100)})}});
+        delay += Seconds(1);
 
         //----------------------------------------------------------------------------------------------------------------------------------
         // Verify PHY state is CCA-BUSY as long as a 80 MHz signal above the energy detection
@@ -1837,32 +1866,33 @@
                             &WifiPhyCcaIndicationTest::LogScenario,
                             this,
                             "Reception of a 80 MHz signal that occupies P80 above ED threshold");
-        ScheduleTest(delay,
-                     {{-55.0, MicroSeconds(0), MicroSeconds(100), P80_CENTER_FREQUENCY, 80}},
-                     {},
-                     {
-                         {aCcaTime, WifiPhyState::CCA_BUSY}, // CCA-BUSY after aCCATime
-                         {MicroSeconds(100) - smallDelta,
-                          WifiPhyState::CCA_BUSY}, // CCA-BUSY just before the transmission ends
-                         {MicroSeconds(100) + smallDelta,
-                          WifiPhyState::IDLE} // IDLE just after the transmission ends
-                     },
-                     {{MicroSeconds(100) - smallDelta,
-                       MicroSeconds(100),
-                       WIFI_CHANLIST_PRIMARY,
-                       ((m_channelWidth > 80) ? std::vector<Time>{MicroSeconds(100),
-                                                                  MicroSeconds(100),
-                                                                  MicroSeconds(100),
-                                                                  MicroSeconds(100),
-                                                                  MicroSeconds(0),
-                                                                  MicroSeconds(0),
-                                                                  MicroSeconds(0),
-                                                                  MicroSeconds(0)}
-                                              : std::vector<Time>{MicroSeconds(100),
-                                                                  MicroSeconds(100),
-                                                                  MicroSeconds(100),
-                                                                  MicroSeconds(100)})}});
-        delay += Seconds(1.0);
+        ScheduleTest(
+            delay,
+            {{dBm_u{-55}, MicroSeconds(0), MicroSeconds(100), P80_CENTER_FREQUENCY, MHz_u{80}}},
+            {},
+            {
+                {aCcaTime, WifiPhyState::CCA_BUSY}, // CCA-BUSY after aCCATime
+                {MicroSeconds(100) - smallDelta,
+                 WifiPhyState::CCA_BUSY}, // CCA-BUSY just before the transmission ends
+                {MicroSeconds(100) + smallDelta,
+                 WifiPhyState::IDLE} // IDLE just after the transmission ends
+            },
+            {{MicroSeconds(100) - smallDelta,
+              MicroSeconds(100),
+              WIFI_CHANLIST_PRIMARY,
+              ((m_channelWidth > MHz_u{80}) ? std::vector<Time>{MicroSeconds(100),
+                                                                MicroSeconds(100),
+                                                                MicroSeconds(100),
+                                                                MicroSeconds(100),
+                                                                MicroSeconds(0),
+                                                                MicroSeconds(0),
+                                                                MicroSeconds(0),
+                                                                MicroSeconds(0)}
+                                            : std::vector<Time>{MicroSeconds(100),
+                                                                MicroSeconds(100),
+                                                                MicroSeconds(100),
+                                                                MicroSeconds(100)})}});
+        delay += Seconds(1);
 
         //----------------------------------------------------------------------------------------------------------------------------------
         // Verify PHY notifies CCA-BUSY for the P20 channel while the S40 channel was already in
@@ -1874,8 +1904,12 @@
                             "reception of another 20 MHz signal that occupies P20");
         ScheduleTest(
             delay,
-            {{-55.0, MicroSeconds(0), MicroSeconds(100), S40_CENTER_FREQUENCY - 10, 20},
-             {-55.0, MicroSeconds(50), MicroSeconds(100), P20_CENTER_FREQUENCY, 20}},
+            {{dBm_u{-55},
+              MicroSeconds(0),
+              MicroSeconds(100),
+              S40_CENTER_FREQUENCY - MHz_u{10},
+              MHz_u{20}},
+             {dBm_u{-55}, MicroSeconds(50), MicroSeconds(100), P20_CENTER_FREQUENCY, MHz_u{20}}},
             {},
             {
                 {aCcaTime, WifiPhyState::IDLE}, // state of primary stays idle after aCCATime
@@ -1917,7 +1951,7 @@
                                                          MicroSeconds(0),
                                                          MicroSeconds(50),
                                                          MicroSeconds(0)})}});
-        delay += Seconds(1.0);
+        delay += Seconds(1);
 
         //----------------------------------------------------------------------------------------------------------------------------------
         // Verify PHY state stays IDLE but notifies CCA-BUSY for the S20 channel while the S40
@@ -1929,8 +1963,12 @@
                             "another signal that occupies S20");
         ScheduleTest(
             delay,
-            {{-55.0, MicroSeconds(0), MicroSeconds(100), S40_CENTER_FREQUENCY - 10, 20},
-             {-55.0, MicroSeconds(50), MicroSeconds(100), S20_CENTER_FREQUENCY, 20}},
+            {{dBm_u{-55},
+              MicroSeconds(0),
+              MicroSeconds(100),
+              S40_CENTER_FREQUENCY - MHz_u{10},
+              MHz_u{20}},
+             {dBm_u{-55}, MicroSeconds(50), MicroSeconds(100), S20_CENTER_FREQUENCY, MHz_u{20}}},
             {},
             {
                 {aCcaTime, WifiPhyState::IDLE}, // state of primary stays idle after aCCATime
@@ -1970,7 +2008,7 @@
                                                          MicroSeconds(100),
                                                          MicroSeconds(50),
                                                          MicroSeconds(0)})}});
-        delay += Seconds(1.0);
+        delay += Seconds(1);
 
         //----------------------------------------------------------------------------------------------------------------------------------
         // Verify PHY state stays IDLE when a 40 MHz HE SU PPDU with received power below the CCA
@@ -1982,16 +2020,16 @@
             "Reception of a 40 MHz HE PPDU that occupies S40 below CCA sensitivity threshold");
         ScheduleTest(delay,
                      {},
-                     {{-75.0, MicroSeconds(0), S40_CENTER_FREQUENCY, 40}},
+                     {{dBm_u{-75}, MicroSeconds(0), S40_CENTER_FREQUENCY, MHz_u{40}}},
                      {
                          {aCcaTime, WifiPhyState::IDLE}, // IDLE after aCCATime
-                         {PpduDurations.at(20) - smallDelta,
+                         {PpduDurations.at(MHz_u{20}) - smallDelta,
                           WifiPhyState::IDLE}, // IDLE just before the transmission ends
-                         {PpduDurations.at(20) + smallDelta,
+                         {PpduDurations.at(MHz_u{20}) + smallDelta,
                           WifiPhyState::IDLE} // IDLE just after the transmission ends
                      },
                      {});
-        delay += Seconds(1.0);
+        delay += Seconds(1);
 
         //----------------------------------------------------------------------------------------------------------------------------------
         // Verify PHY state stays IDLE but CCA-BUSY indication is reported when a 40 MHz HE SU PPDU
@@ -2001,32 +2039,33 @@
             &WifiPhyCcaIndicationTest::LogScenario,
             this,
             "Reception of a 40 MHz HE PPDU that occupies S40 above CCA sensitivity threshold");
-        ScheduleTest(delay,
-                     {},
-                     {{-70.0, MicroSeconds(0), S40_CENTER_FREQUENCY, 40}},
-                     {
-                         {aCcaTime, WifiPhyState::IDLE}, // IDLE after aCCATime
-                         {PpduDurations.at(40) - smallDelta,
-                          WifiPhyState::IDLE}, // IDLE just before the transmission ends
-                         {PpduDurations.at(40) + smallDelta,
-                          WifiPhyState::IDLE} // IDLE just after the transmission ends
-                     },
-                     {{aCcaTime,
-                       PpduDurations.at(40),
-                       WIFI_CHANLIST_SECONDARY40,
-                       ((m_channelWidth > 80) ? std::vector<Time>{NanoSeconds(0),
-                                                                  NanoSeconds(0),
-                                                                  PpduDurations.at(40),
-                                                                  PpduDurations.at(40),
-                                                                  NanoSeconds(0),
-                                                                  NanoSeconds(0),
-                                                                  NanoSeconds(0),
-                                                                  NanoSeconds(0)}
-                                              : std::vector<Time>{NanoSeconds(0),
-                                                                  NanoSeconds(0),
-                                                                  PpduDurations.at(40),
-                                                                  PpduDurations.at(40)})}});
-        delay += Seconds(1.0);
+        ScheduleTest(
+            delay,
+            {},
+            {{dBm_u{-70.0}, MicroSeconds(0), S40_CENTER_FREQUENCY, MHz_u{40}}},
+            {
+                {aCcaTime, WifiPhyState::IDLE}, // IDLE after aCCATime
+                {PpduDurations.at(MHz_u{40}) - smallDelta,
+                 WifiPhyState::IDLE}, // IDLE just before the transmission ends
+                {PpduDurations.at(MHz_u{40}) + smallDelta,
+                 WifiPhyState::IDLE} // IDLE just after the transmission ends
+            },
+            {{aCcaTime,
+              PpduDurations.at(MHz_u{40}),
+              WIFI_CHANLIST_SECONDARY40,
+              ((m_channelWidth > MHz_u{80}) ? std::vector<Time>{NanoSeconds(0),
+                                                                NanoSeconds(0),
+                                                                PpduDurations.at(MHz_u{40}),
+                                                                PpduDurations.at(MHz_u{40}),
+                                                                NanoSeconds(0),
+                                                                NanoSeconds(0),
+                                                                NanoSeconds(0),
+                                                                NanoSeconds(0)}
+                                            : std::vector<Time>{NanoSeconds(0),
+                                                                NanoSeconds(0),
+                                                                PpduDurations.at(MHz_u{40}),
+                                                                PpduDurations.at(MHz_u{40})})}});
+        delay += Seconds(1);
 
         //----------------------------------------------------------------------------------------------------------------------------------
         // Verify PHY state stays IDLE but CCA-BUSY indication is still reported as long as a signal
@@ -2038,48 +2077,50 @@
             this,
             "Reception of a 40 MHz signal that occupies S40 above ED threshold followed by a 80 "
             "MHz HE PPDU that occupies P80 below CCA sensitivity threshold");
-        ScheduleTest(
-            delay,
-            {{-55.0,
-              MicroSeconds(0),
-              MicroSeconds(100),
-              S40_CENTER_FREQUENCY,
-              40}},                                                // signal on S40 above threshold
-            {{-80.0, MicroSeconds(50), P80_CENTER_FREQUENCY, 80}}, // PPDU on P80 below threshold
-            {
-                {MicroSeconds(50) + aCcaTime, WifiPhyState::IDLE}, // PHY state stays IDLE
-            },
-            {{MicroSeconds(50) - smallDelta,
-              MicroSeconds(100),
-              WIFI_CHANLIST_SECONDARY40,
-              ((m_channelWidth > 80) ? std::vector<Time>{MicroSeconds(0),
-                                                         MicroSeconds(0),
-                                                         MicroSeconds(100),
-                                                         MicroSeconds(100),
-                                                         MicroSeconds(0),
-                                                         MicroSeconds(0),
-                                                         MicroSeconds(0),
-                                                         MicroSeconds(0)}
-                                     : std::vector<Time>{MicroSeconds(0),
-                                                         MicroSeconds(0),
-                                                         MicroSeconds(100),
-                                                         MicroSeconds(100)})},
-             {MicroSeconds(100) - smallDelta,
-              MicroSeconds(100),
-              WIFI_CHANLIST_SECONDARY40,
-              ((m_channelWidth > 80) ? std::vector<Time>{MicroSeconds(0),
-                                                         MicroSeconds(0),
-                                                         MicroSeconds(46),
-                                                         MicroSeconds(46),
-                                                         MicroSeconds(0),
-                                                         MicroSeconds(0),
-                                                         MicroSeconds(0),
-                                                         MicroSeconds(0)}
-                                     : std::vector<Time>{MicroSeconds(0),
-                                                         MicroSeconds(0),
-                                                         MicroSeconds(46),
-                                                         MicroSeconds(46)})}});
-        delay += Seconds(1.0);
+        ScheduleTest(delay,
+                     {{dBm_u{-55},
+                       MicroSeconds(0),
+                       MicroSeconds(100),
+                       S40_CENTER_FREQUENCY,
+                       MHz_u{40}}}, // signal on S40 above threshold
+                     {{dBm_u{-80},
+                       MicroSeconds(50),
+                       P80_CENTER_FREQUENCY,
+                       MHz_u{80}}}, // PPDU on P80 below threshold
+                     {
+                         {MicroSeconds(50) + aCcaTime, WifiPhyState::IDLE}, // PHY state stays IDLE
+                     },
+                     {{MicroSeconds(50) - smallDelta,
+                       MicroSeconds(100),
+                       WIFI_CHANLIST_SECONDARY40,
+                       ((m_channelWidth > 80) ? std::vector<Time>{MicroSeconds(0),
+                                                                  MicroSeconds(0),
+                                                                  MicroSeconds(100),
+                                                                  MicroSeconds(100),
+                                                                  MicroSeconds(0),
+                                                                  MicroSeconds(0),
+                                                                  MicroSeconds(0),
+                                                                  MicroSeconds(0)}
+                                              : std::vector<Time>{MicroSeconds(0),
+                                                                  MicroSeconds(0),
+                                                                  MicroSeconds(100),
+                                                                  MicroSeconds(100)})},
+                      {MicroSeconds(100) - smallDelta,
+                       MicroSeconds(100),
+                       WIFI_CHANLIST_SECONDARY40,
+                       ((m_channelWidth > 80) ? std::vector<Time>{MicroSeconds(0),
+                                                                  MicroSeconds(0),
+                                                                  MicroSeconds(46),
+                                                                  MicroSeconds(46),
+                                                                  MicroSeconds(0),
+                                                                  MicroSeconds(0),
+                                                                  MicroSeconds(0),
+                                                                  MicroSeconds(0)}
+                                              : std::vector<Time>{MicroSeconds(0),
+                                                                  MicroSeconds(0),
+                                                                  MicroSeconds(46),
+                                                                  MicroSeconds(46)})}});
+        delay += Seconds(1);
     }
     else // 20 or 40 MHz receiver
     {
@@ -2094,53 +2135,53 @@
                             "sensitivity threshold");
         ScheduleTest(delay,
                      {},
-                     {{-70.0, MicroSeconds(0), P80_CENTER_FREQUENCY, 80}},
+                     {{dBm_u{-70}, MicroSeconds(0), P80_CENTER_FREQUENCY, MHz_u{80}}},
                      {
                          {aCcaTime, WifiPhyState::CCA_BUSY}, // CCA_BUSY after aCCATime
-                         {PpduDurations.at(80) - smallDelta,
+                         {PpduDurations.at(MHz_u{80}) - smallDelta,
                           WifiPhyState::CCA_BUSY}, // CCA_BUSY just before the transmission ends
-                         {PpduDurations.at(80) + smallDelta,
+                         {PpduDurations.at(MHz_u{80}) + smallDelta,
                           WifiPhyState::IDLE} // IDLE just after the transmission ends
                      },
                      {{aCcaTime,
                        MicroSeconds(16),
                        WIFI_CHANLIST_PRIMARY,
-                       ((m_channelWidth > 20)
-                            ? ((m_channelWidth > 40)
-                                   ? ((m_channelWidth > 80) ? std::vector<Time>{Seconds(0),
-                                                                                Seconds(0),
-                                                                                Seconds(0),
-                                                                                Seconds(0),
-                                                                                Seconds(0),
-                                                                                Seconds(0),
-                                                                                Seconds(0),
-                                                                                Seconds(0)}
-                                                            : std::vector<Time>{Seconds(0),
-                                                                                Seconds(0),
-                                                                                Seconds(0),
-                                                                                Seconds(0)})
+                       ((m_channelWidth > MHz_u{20})
+                            ? ((m_channelWidth > MHz_u{40})
+                                   ? ((m_channelWidth > MHz_u{80}) ? std::vector<Time>{Seconds(0),
+                                                                                       Seconds(0),
+                                                                                       Seconds(0),
+                                                                                       Seconds(0),
+                                                                                       Seconds(0),
+                                                                                       Seconds(0),
+                                                                                       Seconds(0),
+                                                                                       Seconds(0)}
+                                                                   : std::vector<Time>{Seconds(0),
+                                                                                       Seconds(0),
+                                                                                       Seconds(0),
+                                                                                       Seconds(0)})
                                    : std::vector<Time>{Seconds(0), Seconds(0)})
                             : std::vector<Time>{})},
-                      {PpduDurations.at(80) - smallDelta,
-                       PpduDurations.at(80),
+                      {PpduDurations.at(MHz_u{80}) - smallDelta,
+                       PpduDurations.at(MHz_u{80}),
                        WIFI_CHANLIST_PRIMARY,
-                       ((m_channelWidth > 20)
-                            ? ((m_channelWidth > 40)
-                                   ? ((m_channelWidth > 80) ? std::vector<Time>{Seconds(0),
-                                                                                Seconds(0),
-                                                                                Seconds(0),
-                                                                                Seconds(0),
-                                                                                Seconds(0),
-                                                                                Seconds(0),
-                                                                                Seconds(0),
-                                                                                Seconds(0)}
-                                                            : std::vector<Time>{Seconds(0),
-                                                                                Seconds(0),
-                                                                                Seconds(0),
-                                                                                Seconds(0)})
+                       ((m_channelWidth > MHz_u{20})
+                            ? ((m_channelWidth > MHz_u{40})
+                                   ? ((m_channelWidth > MHz_u{80}) ? std::vector<Time>{Seconds(0),
+                                                                                       Seconds(0),
+                                                                                       Seconds(0),
+                                                                                       Seconds(0),
+                                                                                       Seconds(0),
+                                                                                       Seconds(0),
+                                                                                       Seconds(0),
+                                                                                       Seconds(0)}
+                                                                   : std::vector<Time>{Seconds(0),
+                                                                                       Seconds(0),
+                                                                                       Seconds(0),
+                                                                                       Seconds(0)})
                                    : std::vector<Time>{Seconds(0), Seconds(0)})
                             : std::vector<Time>{})}});
-        delay += Seconds(1.0);
+        delay += Seconds(1);
 
         //----------------------------------------------------------------------------------------------------------------------------------
         // Verify PHY notifies CCA-BUSY when a 80 MHz HE SU PPDU with received power above the CCA
@@ -2154,35 +2195,35 @@
         ScheduleTest(
             delay,
             {},
-            {{-55.0, MicroSeconds(0), P80_CENTER_FREQUENCY, 80}},
+            {{dBm_u{-55}, MicroSeconds(0), P80_CENTER_FREQUENCY, MHz_u{80}}},
             {
                 {aCcaTime, WifiPhyState::CCA_BUSY}, // CCA_BUSY after aCCATime
-                {PpduDurations.at(80) - smallDelta,
+                {PpduDurations.at(MHz_u{80}) - smallDelta,
                  WifiPhyState::CCA_BUSY}, // CCA_BUSY just before the transmission ends
-                {PpduDurations.at(80) + smallDelta,
+                {PpduDurations.at(MHz_u{80}) + smallDelta,
                  WifiPhyState::IDLE} // IDLE just after the transmission ends
             },
             {{aCcaTime,
               MicroSeconds(16),
               WIFI_CHANLIST_PRIMARY,
-              ((m_channelWidth > 20)
-                   ? ((m_channelWidth > 40)
-                          ? ((m_channelWidth > 80) ? std::vector<Time>{NanoSeconds(271200),
-                                                                       NanoSeconds(271200),
-                                                                       NanoSeconds(271200),
-                                                                       NanoSeconds(271200),
-                                                                       NanoSeconds(0),
-                                                                       NanoSeconds(0),
-                                                                       NanoSeconds(0),
-                                                                       NanoSeconds(0)}
-                                                   : std::vector<Time>{NanoSeconds(271200),
-                                                                       NanoSeconds(271200),
-                                                                       NanoSeconds(271200),
-                                                                       NanoSeconds(271200)})
+              ((m_channelWidth > MHz_u{20})
+                   ? ((m_channelWidth > MHz_u{40})
+                          ? ((m_channelWidth > MHz_u{80}) ? std::vector<Time>{NanoSeconds(271200),
+                                                                              NanoSeconds(271200),
+                                                                              NanoSeconds(271200),
+                                                                              NanoSeconds(271200),
+                                                                              NanoSeconds(0),
+                                                                              NanoSeconds(0),
+                                                                              NanoSeconds(0),
+                                                                              NanoSeconds(0)}
+                                                          : std::vector<Time>{NanoSeconds(271200),
+                                                                              NanoSeconds(271200),
+                                                                              NanoSeconds(271200),
+                                                                              NanoSeconds(271200)})
                           : std::vector<Time>{NanoSeconds(271200), NanoSeconds(271200)})
                    : std::vector<Time>{})},
-             {PpduDurations.at(80) - smallDelta,
-              PpduDurations.at(80),
+             {PpduDurations.at(MHz_u{80}) - smallDelta,
+              PpduDurations.at(MHz_u{80}),
               WIFI_CHANLIST_PRIMARY,
               ((m_channelWidth > 20)
                    ? ((m_channelWidth > 40)
@@ -2200,7 +2241,7 @@
                                                                        NanoSeconds(243200)})
                           : std::vector<Time>{NanoSeconds(243200), NanoSeconds(243200)})
                    : std::vector<Time>{})}});
-        delay += Seconds(1.0);
+        delay += Seconds(1);
 
         //----------------------------------------------------------------------------------------------------------------------------------
         // Verify PHY state stays IDLE and no CCA-BUSY indication is reported when a signal not
@@ -2212,19 +2253,19 @@
             "Reception of a 40 MHz HE PPDU that does not occupy the operational channel");
         ScheduleTest(delay,
                      {},
-                     {{-50.0, MicroSeconds(0), S40_CENTER_FREQUENCY, 40}},
+                     {{dBm_u{-50}, MicroSeconds(0), S40_CENTER_FREQUENCY, MHz_u{40}}},
                      {
                          {aCcaTime, WifiPhyState::IDLE}, // IDLE after aCCATime
-                         {PpduDurations.at(20) - smallDelta,
+                         {PpduDurations.at(MHz_u{20}) - smallDelta,
                           WifiPhyState::IDLE}, // IDLE just before the transmission ends
-                         {PpduDurations.at(20) + smallDelta,
+                         {PpduDurations.at(MHz_u{20}) + smallDelta,
                           WifiPhyState::IDLE} // IDLE just after the transmission ends
                      },
                      {});
-        delay += Seconds(1.0);
+        delay += Seconds(1);
     }
 
-    if (m_channelWidth > 80)
+    if (m_channelWidth > MHz_u{80})
     {
         //----------------------------------------------------------------------------------------------------------------------------------
         // Verify PHY state stays IDLE and no CCA-BUSY indication is reported if a signal below the
@@ -2235,7 +2276,11 @@
                             "Reception of a 20 MHz signal that occupies the first subchannel of "
                             "S80 below ED threshold");
         ScheduleTest(delay,
-                     {{-65.0, MicroSeconds(0), MicroSeconds(100), S80_CENTER_FREQUENCY - 30, 20}},
+                     {{dBm_u{-65},
+                       MicroSeconds(0),
+                       MicroSeconds(100),
+                       S80_CENTER_FREQUENCY - MHz_u{30},
+                       MHz_u{20}}},
                      {},
                      {
                          {aCcaTime, WifiPhyState::IDLE}, // IDLE after aCCATime
@@ -2245,7 +2290,7 @@
                           WifiPhyState::IDLE} // IDLE just after the transmission ends
                      },
                      {});
-        delay += Seconds(1.0);
+        delay += Seconds(1);
 
         //----------------------------------------------------------------------------------------------------------------------------------
         // Verify PHY state stays IDLE and CCA-BUSY indication is reported if a signal above the
@@ -2257,7 +2302,11 @@
                             "Reception of a 20 MHz signal that occupies the first subchannel of "
                             "S80 above ED threshold");
         ScheduleTest(delay,
-                     {{-55.0, MicroSeconds(0), MicroSeconds(100), S80_CENTER_FREQUENCY - 30, 20}},
+                     {{dBm_u{-55},
+                       MicroSeconds(0),
+                       MicroSeconds(100),
+                       S80_CENTER_FREQUENCY - MHz_u{30},
+                       MHz_u{20}}},
                      {},
                      {
                          {aCcaTime, WifiPhyState::IDLE}, // IDLE after aCCATime
@@ -2277,7 +2326,7 @@
                                          MicroSeconds(0),
                                          MicroSeconds(0),
                                          MicroSeconds(0)}}});
-        delay += Seconds(1.0);
+        delay += Seconds(1);
 
         //----------------------------------------------------------------------------------------------------------------------------------
         // Verify PHY state stays IDLE and no CCA-BUSY indication is reported if a signal below the
@@ -2288,7 +2337,11 @@
                             "Reception of a 20 MHz signal that occupies the second subchannel of "
                             "S80 below ED threshold");
         ScheduleTest(delay,
-                     {{-65.0, MicroSeconds(0), MicroSeconds(100), S80_CENTER_FREQUENCY - 10, 20}},
+                     {{dBm_u{-65},
+                       MicroSeconds(0),
+                       MicroSeconds(100),
+                       S80_CENTER_FREQUENCY - MHz_u{10},
+                       MHz_u{20}}},
                      {},
                      {
                          {aCcaTime, WifiPhyState::IDLE}, // IDLE after aCCATime
@@ -2298,7 +2351,7 @@
                           WifiPhyState::IDLE} // IDLE just after the transmission ends
                      },
                      {});
-        delay += Seconds(1.0);
+        delay += Seconds(1);
 
         //----------------------------------------------------------------------------------------------------------------------------------
         // Verify PHY state stays IDLE and CCA-BUSY indication is reported if a signal above the
@@ -2310,7 +2363,11 @@
                             "Reception of a 20 MHz signal that occupies the second subchannel of "
                             "S80 above ED threshold");
         ScheduleTest(delay,
-                     {{-55.0, MicroSeconds(0), MicroSeconds(100), S80_CENTER_FREQUENCY - 10, 20}},
+                     {{dBm_u{-55},
+                       MicroSeconds(0),
+                       MicroSeconds(100),
+                       S80_CENTER_FREQUENCY - MHz_u{10},
+                       MHz_u{20}}},
                      {},
                      {
                          {aCcaTime, WifiPhyState::IDLE}, // IDLE after aCCATime
@@ -2330,7 +2387,7 @@
                                          MicroSeconds(100),
                                          MicroSeconds(0),
                                          MicroSeconds(0)}}});
-        delay += Seconds(1.0);
+        delay += Seconds(1);
 
         //----------------------------------------------------------------------------------------------------------------------------------
         // Verify PHY state stays IDLE and no CCA-BUSY indication is reported if a signal below the
@@ -2341,7 +2398,11 @@
                             "Reception of a 20 MHz signal that occupies the third subchannel of "
                             "S80 below ED threshold");
         ScheduleTest(delay,
-                     {{-65.0, MicroSeconds(0), MicroSeconds(100), S80_CENTER_FREQUENCY + 10, 20}},
+                     {{dBm_u{-65},
+                       MicroSeconds(0),
+                       MicroSeconds(100),
+                       S80_CENTER_FREQUENCY + MHz_u{10},
+                       MHz_u{20}}},
                      {},
                      {
                          {aCcaTime, WifiPhyState::IDLE}, // IDLE after aCCATime
@@ -2351,7 +2412,7 @@
                           WifiPhyState::IDLE} // IDLE just after the transmission ends
                      },
                      {});
-        delay += Seconds(1.0);
+        delay += Seconds(1);
 
         //----------------------------------------------------------------------------------------------------------------------------------
         // Verify PHY state stays IDLE and CCA-BUSY indication is reported if a signal above the
@@ -2363,7 +2424,11 @@
                             "Reception of a 20 MHz signal that occupies the third subchannel of "
                             "S80 above ED threshold");
         ScheduleTest(delay,
-                     {{-55.0, MicroSeconds(0), MicroSeconds(100), S80_CENTER_FREQUENCY + 10, 20}},
+                     {{dBm_u{-55},
+                       MicroSeconds(0),
+                       MicroSeconds(100),
+                       S80_CENTER_FREQUENCY + MHz_u{10},
+                       MHz_u{20}}},
                      {},
                      {
                          {aCcaTime, WifiPhyState::IDLE}, // IDLE after aCCATime
@@ -2383,7 +2448,7 @@
                                          MicroSeconds(0),
                                          MicroSeconds(100),
                                          MicroSeconds(0)}}});
-        delay += Seconds(1.0);
+        delay += Seconds(1);
 
         //----------------------------------------------------------------------------------------------------------------------------------
         // Verify PHY state stays IDLE and no CCA-BUSY indication is reported if a signal below the
@@ -2394,7 +2459,11 @@
                             "Reception of a 20 MHz signal that occupies the fourth subchannel of "
                             "S80 below ED threshold");
         ScheduleTest(delay,
-                     {{-65.0, MicroSeconds(0), MicroSeconds(100), S80_CENTER_FREQUENCY + 30, 20}},
+                     {{dBm_u{-65},
+                       MicroSeconds(0),
+                       MicroSeconds(100),
+                       S80_CENTER_FREQUENCY + MHz_u{30},
+                       MHz_u{20}}},
                      {},
                      {
                          {aCcaTime, WifiPhyState::IDLE}, // IDLE after aCCATime
@@ -2404,7 +2473,7 @@
                           WifiPhyState::IDLE} // IDLE just after the transmission ends
                      },
                      {});
-        delay += Seconds(1.0);
+        delay += Seconds(1);
 
         //----------------------------------------------------------------------------------------------------------------------------------
         // Verify PHY state stays IDLE and CCA-BUSY indication is reported if a signal above the
@@ -2416,7 +2485,11 @@
                             "Reception of a 20 MHz signal that occupies the fourth subchannel of "
                             "S80 above ED threshold");
         ScheduleTest(delay,
-                     {{-55.0, MicroSeconds(0), MicroSeconds(100), S80_CENTER_FREQUENCY + 30, 20}},
+                     {{dBm_u{-55},
+                       MicroSeconds(0),
+                       MicroSeconds(100),
+                       S80_CENTER_FREQUENCY + MHz_u{30},
+                       MHz_u{20}}},
                      {},
                      {
                          {aCcaTime, WifiPhyState::IDLE}, // IDLE after aCCATime
@@ -2436,7 +2509,7 @@
                                          MicroSeconds(0),
                                          MicroSeconds(0),
                                          MicroSeconds(100)}}});
-        delay += Seconds(1.0);
+        delay += Seconds(1);
 
         //----------------------------------------------------------------------------------------------------------------------------------
         // Verify PHY state stays IDLE and no CCA-BUSY indication is reported if a signal below the
@@ -2447,7 +2520,11 @@
                             "Reception of a 40 MHz signal that occupies the first and second "
                             "subchannels of S80 below ED threshold");
         ScheduleTest(delay,
-                     {{-65.0, MicroSeconds(0), MicroSeconds(100), S80_CENTER_FREQUENCY - 20, 40}},
+                     {{dBm_u{-65},
+                       MicroSeconds(0),
+                       MicroSeconds(100),
+                       S80_CENTER_FREQUENCY - MHz_u{20},
+                       MHz_u{40}}},
                      {},
                      {
                          {aCcaTime, WifiPhyState::IDLE}, // IDLE after aCCATime
@@ -2457,7 +2534,7 @@
                           WifiPhyState::IDLE} // IDLE just after the transmission ends
                      },
                      {});
-        delay += Seconds(1.0);
+        delay += Seconds(1);
 
         //----------------------------------------------------------------------------------------------------------------------------------
         // Verify PHY state stays IDLE and CCA-BUSY indication is reported if a signal above the
@@ -2469,7 +2546,11 @@
                             "Reception of a 40 MHz signal that occupies the first and second "
                             "subchannels of S80 above ED threshold");
         ScheduleTest(delay,
-                     {{-55.0, MicroSeconds(0), MicroSeconds(100), S80_CENTER_FREQUENCY - 20, 40}},
+                     {{dBm_u{-55},
+                       MicroSeconds(0),
+                       MicroSeconds(100),
+                       S80_CENTER_FREQUENCY - MHz_u{20},
+                       MHz_u{40}}},
                      {},
                      {
                          {aCcaTime, WifiPhyState::IDLE}, // IDLE after aCCATime
@@ -2489,7 +2570,7 @@
                                          MicroSeconds(100),
                                          MicroSeconds(0),
                                          MicroSeconds(0)}}});
-        delay += Seconds(1.0);
+        delay += Seconds(1);
 
         //----------------------------------------------------------------------------------------------------------------------------------
         // Verify PHY state stays IDLE and no CCA-BUSY indication is reported if a signal below the
@@ -2500,7 +2581,11 @@
                             "Reception of a 40 MHz signal that occupies the third and fourth "
                             "subchannels of S80 below ED threshold");
         ScheduleTest(delay,
-                     {{-65.0, MicroSeconds(0), MicroSeconds(100), S80_CENTER_FREQUENCY + 20, 40}},
+                     {{dBm_u{-65},
+                       MicroSeconds(0),
+                       MicroSeconds(100),
+                       S80_CENTER_FREQUENCY + MHz_u{20},
+                       MHz_u{40}}},
                      {},
                      {
                          {aCcaTime, WifiPhyState::IDLE}, // IDLE after aCCATime
@@ -2510,7 +2595,7 @@
                           WifiPhyState::IDLE} // IDLE just after the transmission ends
                      },
                      {});
-        delay += Seconds(1.0);
+        delay += Seconds(1);
 
         //----------------------------------------------------------------------------------------------------------------------------------
         // Verify PHY state stays IDLE and CCA-BUSY indication is reported if a signal above the
@@ -2522,7 +2607,11 @@
                             "Reception of a 40 MHz signal that occupies the third and fourth "
                             "subchannels of S80 above ED threshold");
         ScheduleTest(delay,
-                     {{-55.0, MicroSeconds(0), MicroSeconds(100), S80_CENTER_FREQUENCY + 20, 40}},
+                     {{dBm_u{-55},
+                       MicroSeconds(0),
+                       MicroSeconds(100),
+                       S80_CENTER_FREQUENCY + MHz_u{20},
+                       MHz_u{40}}},
                      {},
                      {
                          {aCcaTime, WifiPhyState::IDLE}, // IDLE after aCCATime
@@ -2542,7 +2631,7 @@
                                          MicroSeconds(0),
                                          MicroSeconds(100),
                                          MicroSeconds(100)}}});
-        delay += Seconds(1.0);
+        delay += Seconds(1);
 
         //----------------------------------------------------------------------------------------------------------------------------------
         // Verify PHY state stays IDLE and no CCA-BUSY indication is reported if a signal below the
@@ -2551,18 +2640,19 @@
                             &WifiPhyCcaIndicationTest::LogScenario,
                             this,
                             "Reception of a 80 MHz signal that occupies S80 below ED threshold");
-        ScheduleTest(delay,
-                     {{-65.0, MicroSeconds(0), MicroSeconds(100), S80_CENTER_FREQUENCY, 80}},
-                     {},
-                     {
-                         {aCcaTime, WifiPhyState::IDLE}, // IDLE after aCCATime
-                         {MicroSeconds(100) - smallDelta,
-                          WifiPhyState::IDLE}, // IDLE just before the transmission ends
-                         {MicroSeconds(100) + smallDelta,
-                          WifiPhyState::IDLE} // IDLE just after the transmission ends
-                     },
-                     {});
-        delay += Seconds(1.0);
+        ScheduleTest(
+            delay,
+            {{dBm_u{-65}, MicroSeconds(0), MicroSeconds(100), S80_CENTER_FREQUENCY, MHz_u{80}}},
+            {},
+            {
+                {aCcaTime, WifiPhyState::IDLE}, // IDLE after aCCATime
+                {MicroSeconds(100) - smallDelta,
+                 WifiPhyState::IDLE}, // IDLE just before the transmission ends
+                {MicroSeconds(100) + smallDelta,
+                 WifiPhyState::IDLE} // IDLE just after the transmission ends
+            },
+            {});
+        delay += Seconds(1);
 
         //----------------------------------------------------------------------------------------------------------------------------------
         // Verify PHY state stays IDLE and CCA-BUSY indication is reported if a signal above the
@@ -2572,28 +2662,29 @@
                             &WifiPhyCcaIndicationTest::LogScenario,
                             this,
                             "Reception of a 80 MHz signal that occupies S80 above ED threshold");
-        ScheduleTest(delay,
-                     {{-55.0, MicroSeconds(0), MicroSeconds(100), S80_CENTER_FREQUENCY, 80}},
-                     {},
-                     {
-                         {aCcaTime, WifiPhyState::IDLE}, // IDLE after aCCATime
-                         {MicroSeconds(100) - smallDelta,
-                          WifiPhyState::IDLE}, // IDLE just before the transmission ends
-                         {MicroSeconds(100) + smallDelta,
-                          WifiPhyState::IDLE} // IDLE just after the transmission ends
-                     },
-                     {{MicroSeconds(100) - smallDelta,
-                       MicroSeconds(100),
-                       WIFI_CHANLIST_SECONDARY80,
-                       std::vector<Time>{MicroSeconds(0),
-                                         MicroSeconds(0),
-                                         MicroSeconds(0),
-                                         MicroSeconds(0),
-                                         MicroSeconds(100),
-                                         MicroSeconds(100),
-                                         MicroSeconds(100),
-                                         MicroSeconds(100)}}});
-        delay += Seconds(1.0);
+        ScheduleTest(
+            delay,
+            {{dBm_u{-55}, MicroSeconds(0), MicroSeconds(100), S80_CENTER_FREQUENCY, MHz_u{80}}},
+            {},
+            {
+                {aCcaTime, WifiPhyState::IDLE}, // IDLE after aCCATime
+                {MicroSeconds(100) - smallDelta,
+                 WifiPhyState::IDLE}, // IDLE just before the transmission ends
+                {MicroSeconds(100) + smallDelta,
+                 WifiPhyState::IDLE} // IDLE just after the transmission ends
+            },
+            {{MicroSeconds(100) - smallDelta,
+              MicroSeconds(100),
+              WIFI_CHANLIST_SECONDARY80,
+              std::vector<Time>{MicroSeconds(0),
+                                MicroSeconds(0),
+                                MicroSeconds(0),
+                                MicroSeconds(0),
+                                MicroSeconds(100),
+                                MicroSeconds(100),
+                                MicroSeconds(100),
+                                MicroSeconds(100)}}});
+        delay += Seconds(1);
 
         //----------------------------------------------------------------------------------------------------------------------------------
         // Verify PHY state stays IDLE as long as a 160 MHz signal below the energy detection
@@ -2603,19 +2694,20 @@
             &WifiPhyCcaIndicationTest::LogScenario,
             this,
             "Reception of a 160 MHz signal that occupies the whole band below ED threshold");
-        ScheduleTest(delay,
-                     {{-55.0, MicroSeconds(0), MicroSeconds(100), P160_CENTER_FREQUENCY, 160}},
-                     {},
-                     {
-                         {aCcaTime, WifiPhyState::IDLE}, // IDLE after aCCATime
-                         {MicroSeconds(100) - smallDelta,
-                          WifiPhyState::IDLE}, // IDLE just before the transmission ends
-                         {MicroSeconds(100) + smallDelta,
-                          WifiPhyState::IDLE} // IDLE just after the transmission ends
-                     },
-                     {});
+        ScheduleTest(
+            delay,
+            {{dBm_u{-55}, MicroSeconds(0), MicroSeconds(100), P160_CENTER_FREQUENCY, MHz_u{160}}},
+            {},
+            {
+                {aCcaTime, WifiPhyState::IDLE}, // IDLE after aCCATime
+                {MicroSeconds(100) - smallDelta,
+                 WifiPhyState::IDLE}, // IDLE just before the transmission ends
+                {MicroSeconds(100) + smallDelta,
+                 WifiPhyState::IDLE} // IDLE just after the transmission ends
+            },
+            {});
 
-        delay += Seconds(1.0);
+        delay += Seconds(1);
 
         //----------------------------------------------------------------------------------------------------------------------------------
         // Verify PHY state is CCA-BUSY as long as a 160 MHz signal above the energy detection
@@ -2625,28 +2717,29 @@
             &WifiPhyCcaIndicationTest::LogScenario,
             this,
             "Reception of a 160 MHz signal that occupies the whole band above ED threshold");
-        ScheduleTest(delay,
-                     {{-50.0, MicroSeconds(0), MicroSeconds(100), P160_CENTER_FREQUENCY, 160}},
-                     {},
-                     {
-                         {aCcaTime, WifiPhyState::CCA_BUSY}, // CCA-BUSY after aCCATime
-                         {MicroSeconds(100) - smallDelta,
-                          WifiPhyState::CCA_BUSY}, // CCA-BUSY just before the transmission ends
-                         {MicroSeconds(100) + smallDelta,
-                          WifiPhyState::IDLE} // IDLE just after the transmission ends
-                     },
-                     {{MicroSeconds(100) - smallDelta,
-                       MicroSeconds(100),
-                       WIFI_CHANLIST_PRIMARY,
-                       std::vector<Time>{MicroSeconds(100),
-                                         MicroSeconds(100),
-                                         MicroSeconds(100),
-                                         MicroSeconds(100),
-                                         MicroSeconds(100),
-                                         MicroSeconds(100),
-                                         MicroSeconds(100),
-                                         MicroSeconds(100)}}});
-        delay += Seconds(1.0);
+        ScheduleTest(
+            delay,
+            {{dBm_u{-50}, MicroSeconds(0), MicroSeconds(100), P160_CENTER_FREQUENCY, MHz_u{160}}},
+            {},
+            {
+                {aCcaTime, WifiPhyState::CCA_BUSY}, // CCA-BUSY after aCCATime
+                {MicroSeconds(100) - smallDelta,
+                 WifiPhyState::CCA_BUSY}, // CCA-BUSY just before the transmission ends
+                {MicroSeconds(100) + smallDelta,
+                 WifiPhyState::IDLE} // IDLE just after the transmission ends
+            },
+            {{MicroSeconds(100) - smallDelta,
+              MicroSeconds(100),
+              WIFI_CHANLIST_PRIMARY,
+              std::vector<Time>{MicroSeconds(100),
+                                MicroSeconds(100),
+                                MicroSeconds(100),
+                                MicroSeconds(100),
+                                MicroSeconds(100),
+                                MicroSeconds(100),
+                                MicroSeconds(100),
+                                MicroSeconds(100)}}});
+        delay += Seconds(1);
 
         //----------------------------------------------------------------------------------------------------------------------------------
         // Verify PHY notifies CCA-BUSY for the P20 channel while the S80 channel was already in
@@ -2658,8 +2751,12 @@
                             "reception of another 20 MHz signal that occupies P20");
         ScheduleTest(
             delay,
-            {{-55.0, MicroSeconds(0), MicroSeconds(100), S80_CENTER_FREQUENCY + 10, 20},
-             {-55.0, MicroSeconds(50), MicroSeconds(100), P20_CENTER_FREQUENCY, 20}},
+            {{dBm_u{-55},
+              MicroSeconds(0),
+              MicroSeconds(100),
+              S80_CENTER_FREQUENCY + MHz_u{10},
+              MHz_u{20}},
+             {dBm_u{-55}, MicroSeconds(50), MicroSeconds(100), P20_CENTER_FREQUENCY, MHz_u{20}}},
             {},
             {
                 {aCcaTime, WifiPhyState::IDLE}, // state of primary stays idle after aCCATime
@@ -2693,7 +2790,7 @@
                                 MicroSeconds(0),
                                 MicroSeconds(50),
                                 MicroSeconds(0)}}});
-        delay += Seconds(1.0);
+        delay += Seconds(1);
 
         //----------------------------------------------------------------------------------------------------------------------------------
         // Verify PHY state stays IDLE but notifies CCA-BUSY for the S40 channel while the S80
@@ -2705,8 +2802,16 @@
                             "another signal that occupies S40");
         ScheduleTest(
             delay,
-            {{-55.0, MicroSeconds(0), MicroSeconds(100), S80_CENTER_FREQUENCY + 30, 20},
-             {-55.0, MicroSeconds(50), MicroSeconds(100), S40_CENTER_FREQUENCY - 10, 20}},
+            {{dBm_u{-55},
+              MicroSeconds(0),
+              MicroSeconds(100),
+              S80_CENTER_FREQUENCY + MHz_u{30},
+              MHz_u{20}},
+             {dBm_u{-55},
+              MicroSeconds(50),
+              MicroSeconds(100),
+              S40_CENTER_FREQUENCY - MHz_u{10},
+              MHz_u{20}}},
             {},
             {
                 {aCcaTime, WifiPhyState::IDLE}, // state of primary stays idle after aCCATime
@@ -2738,7 +2843,7 @@
                                 MicroSeconds(0),
                                 MicroSeconds(0),
                                 MicroSeconds(50)}}});
-        delay += Seconds(1.0);
+        delay += Seconds(1);
 
         //----------------------------------------------------------------------------------------------------------------------------------
         // Verify PHY state stays IDLE but notifies CCA-BUSY for the S20 channel while the S80
@@ -2750,8 +2855,12 @@
                             "another signal that occupies S20");
         ScheduleTest(
             delay,
-            {{-55.0, MicroSeconds(0), MicroSeconds(100), S80_CENTER_FREQUENCY - 30, 20},
-             {-55.0, MicroSeconds(50), MicroSeconds(100), S20_CENTER_FREQUENCY, 20}},
+            {{dBm_u{-55},
+              MicroSeconds(0),
+              MicroSeconds(100),
+              S80_CENTER_FREQUENCY - MHz_u{30},
+              MHz_u{20}},
+             {dBm_u{-55}, MicroSeconds(50), MicroSeconds(100), S20_CENTER_FREQUENCY, MHz_u{20}}},
             {},
             {
                 {aCcaTime, WifiPhyState::IDLE}, // state of primary stays idle after aCCATime
@@ -2783,7 +2892,7 @@
                                 MicroSeconds(0),
                                 MicroSeconds(0),
                                 MicroSeconds(0)}}});
-        delay += Seconds(1.0);
+        delay += Seconds(1);
 
         //----------------------------------------------------------------------------------------------------------------------------------
         // Verify PHY state stays IDLE when a 80 MHz HE SU PPDU with received power below the CCA
@@ -2795,16 +2904,16 @@
             "Reception of a 40 MHz HE PPDU that occupies S40 below CCA sensitivity threshold");
         ScheduleTest(delay,
                      {},
-                     {{-70.0, MicroSeconds(0), S80_CENTER_FREQUENCY, 80}},
+                     {{dBm_u{-70}, MicroSeconds(0), S80_CENTER_FREQUENCY, MHz_u{80}}},
                      {
                          {aCcaTime, WifiPhyState::IDLE}, // IDLE after aCCATime
-                         {PpduDurations.at(20) - smallDelta,
+                         {PpduDurations.at(MHz_u{20}) - smallDelta,
                           WifiPhyState::IDLE}, // IDLE just before the transmission ends
-                         {PpduDurations.at(20) + smallDelta,
+                         {PpduDurations.at(MHz_u{20}) + smallDelta,
                           WifiPhyState::IDLE} // IDLE just after the transmission ends
                      },
                      {});
-        delay += Seconds(1.0);
+        delay += Seconds(1);
 
         //----------------------------------------------------------------------------------------------------------------------------------
         // Verify PHY state stays IDLE but CCA-BUSY indication is reported when a 80 MHz HE SU PPDU
@@ -2816,26 +2925,26 @@
             "Reception of a 80 MHz HE PPDU that occupies S80 above CCA sensitivity threshold");
         ScheduleTest(delay,
                      {},
-                     {{-65.0, MicroSeconds(0), S80_CENTER_FREQUENCY, 80}},
+                     {{dBm_u{-65}, MicroSeconds(0), S80_CENTER_FREQUENCY, MHz_u{80}}},
                      {
                          {aCcaTime, WifiPhyState::IDLE}, // IDLE after aCCATime
-                         {PpduDurations.at(80) - smallDelta,
+                         {PpduDurations.at(MHz_u{80}) - smallDelta,
                           WifiPhyState::IDLE}, // IDLE just before the transmission ends
-                         {PpduDurations.at(80) + smallDelta,
+                         {PpduDurations.at(MHz_u{80}) + smallDelta,
                           WifiPhyState::IDLE} // IDLE just after the transmission ends
                      },
                      {{aCcaTime,
-                       PpduDurations.at(80),
+                       PpduDurations.at(MHz_u{80}),
                        WIFI_CHANLIST_SECONDARY80,
                        std::vector<Time>{NanoSeconds(0),
                                          NanoSeconds(0),
                                          NanoSeconds(0),
                                          NanoSeconds(0),
-                                         PpduDurations.at(80),
-                                         PpduDurations.at(80),
-                                         PpduDurations.at(80),
-                                         PpduDurations.at(80)}}});
-        delay += Seconds(1.0);
+                                         PpduDurations.at(MHz_u{80}),
+                                         PpduDurations.at(MHz_u{80}),
+                                         PpduDurations.at(MHz_u{80}),
+                                         PpduDurations.at(MHz_u{80})}}});
+        delay += Seconds(1);
 
         //----------------------------------------------------------------------------------------------------------------------------------
         // Verify PHY state stays IDLE and CCA-BUSY indication is reported if only the per20bitmap
@@ -2846,7 +2955,11 @@
                             "Reception of a 20 MHz signal that generates a per20bitmap parameter "
                             "change when previous CCA indication reports IDLE");
         ScheduleTest(delay,
-                     {{-60.0, MicroSeconds(0), MicroSeconds(100), S80_CENTER_FREQUENCY + 30, 20}},
+                     {{dBm_u{-60},
+                       MicroSeconds(0),
+                       MicroSeconds(100),
+                       S80_CENTER_FREQUENCY + MHz_u{30},
+                       MHz_u{20}}},
                      {},
                      {
                          {aCcaTime, WifiPhyState::IDLE}, // IDLE after aCCATime
@@ -2866,7 +2979,7 @@
                                          MicroSeconds(0),
                                          MicroSeconds(0),
                                          MicroSeconds(100)}}});
-        delay += Seconds(1.0);
+        delay += Seconds(1);
 
         //----------------------------------------------------------------------------------------------------------------------------------
         // Verify PHY state stays CCA_BUSY and CCA-BUSY indication is reported if only the
@@ -2879,8 +2992,12 @@
             "previous CCA indication reports BUSY for the primary channel");
         ScheduleTest(
             delay,
-            {{-50.0, MicroSeconds(0), MicroSeconds(100), P80_CENTER_FREQUENCY, 80},
-             {-60.0, MicroSeconds(50), MicroSeconds(200), S80_CENTER_FREQUENCY + 30, 20}},
+            {{dBm_u{-50.0}, MicroSeconds(0), MicroSeconds(100), P80_CENTER_FREQUENCY, MHz_u{80}},
+             {dBm_u{-60.0},
+              MicroSeconds(50),
+              MicroSeconds(200),
+              S80_CENTER_FREQUENCY + MHz_u{30},
+              MHz_u{20}}},
             {},
             {
                 {aCcaTime, WifiPhyState::CCA_BUSY}, // CCA-BUSY after aCCATime
@@ -2911,7 +3028,7 @@
                                 MicroSeconds(0),
                                 MicroSeconds(0),
                                 MicroSeconds(200)}}});
-        delay += Seconds(1.0);
+        delay += Seconds(1);
     }
 
     Simulator::Run();
@@ -2920,20 +3037,20 @@
 void
 WifiPhyCcaIndicationTest::DoRun()
 {
-    m_frequency = 5180;
-    m_channelWidth = 20;
+    m_frequency = MHz_u{5180};
+    m_channelWidth = MHz_u{20};
     RunOne();
 
-    m_frequency = 5190;
-    m_channelWidth = 40;
+    m_frequency = MHz_u{5190};
+    m_channelWidth = MHz_u{40};
     RunOne();
 
-    m_frequency = 5210;
-    m_channelWidth = 80;
+    m_frequency = MHz_u{5210};
+    m_channelWidth = MHz_u{80};
     RunOne();
 
-    m_frequency = 5250;
-    m_channelWidth = 160;
+    m_frequency = MHz_u{5250};
+    m_channelWidth = MHz_u{160};
     RunOne();
 
     Simulator::Destroy();
@@ -2954,10 +3071,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Wi-Fi PHY CCA Test Suite
+ * @brief Wi-Fi PHY CCA Test Suite
  */
 class WifiPhyCcaTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/test/wifi-phy-mu-mimo-test.cc ns-3.44/src/wifi/test/wifi-phy-mu-mimo-test.cc
--- ns-3.43/src/wifi/test/wifi-phy-mu-mimo-test.cc	2024-10-09 16:41:10.140657000 -0700
+++ ns-3.44/src/wifi/test/wifi-phy-mu-mimo-test.cc	2025-03-09 16:55:49.811372800 -0700
@@ -42,10 +42,10 @@
 constexpr MHz_u DEFAULT_CHANNEL_WIDTH = 20;
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief DL MU TX-VECTOR test
+ * @brief DL MU TX-VECTOR test
  */
 class TestDlMuTxVector : public TestCase
 {
@@ -58,10 +58,10 @@
     /**
      * Build a TXVECTOR for DL MU with the given bandwidth and user information.
      *
-     * \param bw the channel width of the PPDU
-     * \param userInfos the list of HE MU specific user transmission parameters
+     * @param bw the channel width of the PPDU
+     * @param userInfos the list of HE MU specific user transmission parameters
      *
-     * \return the configured MU TXVECTOR
+     * @return the configured MU TXVECTOR
      */
     static WifiTxVector BuildTxVector(MHz_u bw, const std::list<HeMuUserInfo>& userInfos);
 };
@@ -94,7 +94,7 @@
     std::list<HeMuUserInfo> userInfos;
     userInfos.push_back({{HeRu::RU_106_TONE, 1, true}, 11, 1});
     userInfos.push_back({{HeRu::RU_106_TONE, 2, true}, 10, 2});
-    WifiTxVector txVector = BuildTxVector(20, userInfos);
+    WifiTxVector txVector = BuildTxVector(MHz_u{20}, userInfos);
     NS_TEST_EXPECT_MSG_EQ(txVector.IsDlOfdma(),
                           true,
                           "TX-VECTOR should indicate an OFDMA transmission");
@@ -112,7 +112,7 @@
     // Verify TxVector is a full BW MU-MIMO
     userInfos.push_back({{HeRu::RU_242_TONE, 1, true}, 11, 1});
     userInfos.push_back({{HeRu::RU_242_TONE, 1, true}, 10, 2});
-    txVector = BuildTxVector(20, userInfos);
+    txVector = BuildTxVector(MHz_u{20}, userInfos);
     NS_TEST_EXPECT_MSG_EQ(txVector.IsDlOfdma(),
                           false,
                           "TX-VECTOR should indicate a MU-MIMO transmission");
@@ -137,7 +137,7 @@
     userInfos.push_back({{HeRu::RU_242_TONE, 1, true}, 5, 1});
     userInfos.push_back({{HeRu::RU_242_TONE, 1, true}, 4, 1});
     userInfos.push_back({{HeRu::RU_242_TONE, 1, true}, 3, 1});
-    txVector = BuildTxVector(20, userInfos);
+    txVector = BuildTxVector(MHz_u{20}, userInfos);
     NS_TEST_EXPECT_MSG_EQ(txVector.IsDlOfdma(),
                           false,
                           "TX-VECTOR should indicate a MU-MIMO transmission");
@@ -156,7 +156,7 @@
     userInfos.push_back({{HeRu::RU_242_TONE, 1, true}, 10, 2});
     userInfos.push_back({{HeRu::RU_242_TONE, 1, true}, 9, 3});
     userInfos.push_back({{HeRu::RU_242_TONE, 1, true}, 8, 3});
-    txVector = BuildTxVector(20, userInfos);
+    txVector = BuildTxVector(MHz_u{20}, userInfos);
     NS_TEST_EXPECT_MSG_EQ(txVector.IsDlOfdma(),
                           false,
                           "TX-VECTOR should indicate a MU-MIMO transmission");
@@ -181,7 +181,7 @@
     /**
      * Constructor
      *
-     * \param staId the ID of the STA to which this PHY belongs to
+     * @param staId the ID of the STA to which this PHY belongs to
      */
     MuMimoTestHePhy(uint16_t staId);
 
@@ -189,15 +189,15 @@
      * Return the STA ID that has been assigned to the station this PHY belongs to.
      * This is typically called for MU PPDUs, in order to pick the correct PSDU.
      *
-     * \param ppdu the PPDU for which the STA ID is requested
-     * \return the STA ID
+     * @param ppdu the PPDU for which the STA ID is requested
+     * @return the STA ID
      */
     uint16_t GetStaId(const Ptr<const WifiPpdu> ppdu) const override;
 
     /**
      * Set the global PPDU UID counter.
      *
-     * \param uid the value to which the global PPDU UID counter should be set
+     * @param uid the value to which the global PPDU UID counter should be set
      */
     void SetGlobalPpduUid(uint64_t uid);
 
@@ -234,14 +234,14 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     /**
      * Constructor
      *
-     * \param staId the ID of the STA to which this PHY belongs to
+     * @param staId the ID of the STA to which this PHY belongs to
      */
     MuMimoSpectrumWifiPhy(uint16_t staId);
     ~MuMimoSpectrumWifiPhy() override;
@@ -249,19 +249,19 @@
     /**
      * Set the global PPDU UID counter.
      *
-     * \param uid the value to which the global PPDU UID counter should be set
+     * @param uid the value to which the global PPDU UID counter should be set
      */
     void SetPpduUid(uint64_t uid);
 
     /**
      * Since we assume trigger frame was previously received from AP, this is used to set its UID
      *
-     * \param uid the PPDU UID of the trigger frame
+     * @param uid the PPDU UID of the trigger frame
      */
     void SetTriggerFrameUid(uint64_t uid);
 
     /**
-     * \return the current event
+     * @return the current event
      */
     Ptr<Event> GetCurrentEvent();
 
@@ -326,10 +326,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief DL MU-MIMO PHY test
+ * @brief DL MU-MIMO PHY test
  */
 class TestDlMuMimoPhyTransmission : public TestCase
 {
@@ -343,77 +343,77 @@
 
     /**
      * Receive success function for STA 1
-     * \param psdu the PSDU
-     * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
-     * \param txVector the transmit vector
-     * \param statusPerMpdu reception status per MPDU
+     * @param psdu the PSDU
+     * @param rxSignalInfo the info on the received signal (\see RxSignalInfo)
+     * @param txVector the transmit vector
+     * @param statusPerMpdu reception status per MPDU
      */
     void RxSuccessSta1(Ptr<const WifiPsdu> psdu,
                        RxSignalInfo rxSignalInfo,
-                       WifiTxVector txVector,
-                       std::vector<bool> statusPerMpdu);
+                       const WifiTxVector& txVector,
+                       const std::vector<bool>& statusPerMpdu);
     /**
      * Receive success function for STA 2
-     * \param psdu the PSDU
-     * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
-     * \param txVector the transmit vector
-     * \param statusPerMpdu reception status per MPDU
+     * @param psdu the PSDU
+     * @param rxSignalInfo the info on the received signal (\see RxSignalInfo)
+     * @param txVector the transmit vector
+     * @param statusPerMpdu reception status per MPDU
      */
     void RxSuccessSta2(Ptr<const WifiPsdu> psdu,
                        RxSignalInfo rxSignalInfo,
-                       WifiTxVector txVector,
-                       std::vector<bool> statusPerMpdu);
+                       const WifiTxVector& txVector,
+                       const std::vector<bool>& statusPerMpdu);
     /**
      * Receive success function for STA 3
-     * \param psdu the PSDU
-     * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
-     * \param txVector the transmit vector
-     * \param statusPerMpdu reception status per MPDU
+     * @param psdu the PSDU
+     * @param rxSignalInfo the info on the received signal (\see RxSignalInfo)
+     * @param txVector the transmit vector
+     * @param statusPerMpdu reception status per MPDU
      */
     void RxSuccessSta3(Ptr<const WifiPsdu> psdu,
                        RxSignalInfo rxSignalInfo,
-                       WifiTxVector txVector,
-                       std::vector<bool> statusPerMpdu);
+                       const WifiTxVector& txVector,
+                       const std::vector<bool>& statusPerMpdu);
 
     /**
      * Receive failure function for STA 1
-     * \param psdu the PSDU
+     * @param psdu the PSDU
      */
     void RxFailureSta1(Ptr<const WifiPsdu> psdu);
     /**
      * Receive failure function for STA 2
-     * \param psdu the PSDU
+     * @param psdu the PSDU
      */
     void RxFailureSta2(Ptr<const WifiPsdu> psdu);
     /**
      * Receive failure function for STA 3
-     * \param psdu the PSDU
+     * @param psdu the PSDU
      */
     void RxFailureSta3(Ptr<const WifiPsdu> psdu);
 
     /**
      * Check the results for STA 1
-     * \param expectedRxSuccess the expected number of RX success
-     * \param expectedRxFailure the expected number of RX failures
-     * \param expectedRxBytes the expected number of RX bytes
+     * @param expectedRxSuccess the expected number of RX success
+     * @param expectedRxFailure the expected number of RX failures
+     * @param expectedRxBytes the expected number of RX bytes
      */
     void CheckResultsSta1(uint32_t expectedRxSuccess,
                           uint32_t expectedRxFailure,
                           uint32_t expectedRxBytes);
     /**
      * Check the results for STA 2
-     * \param expectedRxSuccess the expected number of RX success
-     * \param expectedRxFailure the expected number of RX failures
-     * \param expectedRxBytes the expected number of RX bytes
+     * @param expectedRxSuccess the expected number of RX success
+     * @param expectedRxFailure the expected number of RX failures
+     * @param expectedRxBytes the expected number of RX bytes
      */
     void CheckResultsSta2(uint32_t expectedRxSuccess,
                           uint32_t expectedRxFailure,
                           uint32_t expectedRxBytes);
     /**
      * Check the results for STA 3
-     * \param expectedRxSuccess the expected number of RX success
-     * \param expectedRxFailure the expected number of RX failures
-     * \param expectedRxBytes the expected number of RX bytes
+     * @param expectedRxSuccess the expected number of RX success
+     * @param expectedRxFailure the expected number of RX failures
+     * @param expectedRxBytes the expected number of RX bytes
      */
     void CheckResultsSta3(uint32_t expectedRxSuccess,
                           uint32_t expectedRxFailure,
@@ -435,14 +435,14 @@
 
     /**
      * Send DL MU-MIMO PPDU function
-     * \param staInfos the STAs infos
+     * @param staInfos the STAs infos
      */
     void SendMuPpdu(const std::vector<StaInfo>& staInfos);
 
     /**
      * Generate interference function
-     * \param interferencePsd the PSD of the interference to be generated
-     * \param duration the duration of the interference
+     * @param interferencePsd the PSD of the interference to be generated
+     * @param duration the duration of the interference
      */
     void GenerateInterference(Ptr<SpectrumValue> interferencePsd, Time duration);
     /**
@@ -457,14 +457,14 @@
 
     /**
      * Schedule now to check  the PHY state
-     * \param phy the PHY
-     * \param expectedState the expected state of the PHY
+     * @param phy the PHY
+     * @param expectedState the expected state of the PHY
      */
     void CheckPhyState(Ptr<MuMimoSpectrumWifiPhy> phy, WifiPhyState expectedState);
     /**
      * Check the PHY state now
-     * \param phy the PHY
-     * \param expectedState the expected state of the PHY
+     * @param phy the PHY
+     * @param expectedState the expected state of the PHY
      */
     void DoCheckPhyState(Ptr<MuMimoSpectrumWifiPhy> phy, WifiPhyState expectedState);
 
@@ -569,8 +569,8 @@
 void
 TestDlMuMimoPhyTransmission::RxSuccessSta1(Ptr<const WifiPsdu> psdu,
                                            RxSignalInfo rxSignalInfo,
-                                           WifiTxVector txVector,
-                                           std::vector<bool> /*statusPerMpdu*/)
+                                           const WifiTxVector& txVector,
+                                           const std::vector<bool>& /*statusPerMpdu*/)
 {
     NS_LOG_FUNCTION(this << *psdu << rxSignalInfo << txVector);
     m_countRxSuccessSta1++;
@@ -580,8 +580,8 @@
 void
 TestDlMuMimoPhyTransmission::RxSuccessSta2(Ptr<const WifiPsdu> psdu,
                                            RxSignalInfo rxSignalInfo,
-                                           WifiTxVector txVector,
-                                           std::vector<bool> /*statusPerMpdu*/)
+                                           const WifiTxVector& txVector,
+                                           const std::vector<bool>& /*statusPerMpdu*/)
 {
     NS_LOG_FUNCTION(this << *psdu << rxSignalInfo << txVector);
     m_countRxSuccessSta2++;
@@ -591,8 +591,8 @@
 void
 TestDlMuMimoPhyTransmission::RxSuccessSta3(Ptr<const WifiPsdu> psdu,
                                            RxSignalInfo rxSignalInfo,
-                                           WifiTxVector txVector,
-                                           std::vector<bool> /*statusPerMpdu*/)
+                                           const WifiTxVector& txVector,
+                                           const std::vector<bool>& /*statusPerMpdu*/)
 {
     NS_LOG_FUNCTION(this << *psdu << rxSignalInfo << txVector);
     m_countRxSuccessSta3++;
@@ -812,7 +812,7 @@
     // Send MU PPDU with two PSDUs addressed to STA 1 and STA 2:
     // STA 1 and STA 2 should receive their PSDUs, whereas STA 3 should not receive any PSDU
     // but should keep its PHY busy during all PPDU duration.
-    Simulator::Schedule(Seconds(1.0),
+    Simulator::Schedule(Seconds(1),
                         &TestDlMuMimoPhyTransmission::SendMuPpdu,
                         this,
                         std::vector<StaInfo>{{1, m_nss}, {2, m_nss}});
@@ -820,32 +820,32 @@
     // Since it takes m_expectedPpduDuration to transmit the PPDU,
     // all 3 PHYs should be back to IDLE at the same time,
     // even the PHY that has no PSDU addressed to it.
-    Simulator::Schedule(Seconds(1.0) + m_expectedPpduDuration - NanoSeconds(1),
+    Simulator::Schedule(Seconds(1) + m_expectedPpduDuration - NanoSeconds(1),
                         &TestDlMuMimoPhyTransmission::CheckPhyState,
                         this,
                         m_phySta1,
                         WifiPhyState::RX);
-    Simulator::Schedule(Seconds(1.0) + m_expectedPpduDuration - NanoSeconds(1),
+    Simulator::Schedule(Seconds(1) + m_expectedPpduDuration - NanoSeconds(1),
                         &TestDlMuMimoPhyTransmission::CheckPhyState,
                         this,
                         m_phySta2,
                         WifiPhyState::RX);
-    Simulator::Schedule(Seconds(1.0) + m_expectedPpduDuration - NanoSeconds(1),
+    Simulator::Schedule(Seconds(1) + m_expectedPpduDuration - NanoSeconds(1),
                         &TestDlMuMimoPhyTransmission::CheckPhyState,
                         this,
                         m_phySta3,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(1.0) + m_expectedPpduDuration,
+    Simulator::Schedule(Seconds(1) + m_expectedPpduDuration,
                         &TestDlMuMimoPhyTransmission::CheckPhyState,
                         this,
                         m_phySta1,
                         WifiPhyState::IDLE);
-    Simulator::Schedule(Seconds(1.0) + m_expectedPpduDuration,
+    Simulator::Schedule(Seconds(1) + m_expectedPpduDuration,
                         &TestDlMuMimoPhyTransmission::CheckPhyState,
                         this,
                         m_phySta2,
                         WifiPhyState::IDLE);
-    Simulator::Schedule(Seconds(1.0) + m_expectedPpduDuration,
+    Simulator::Schedule(Seconds(1) + m_expectedPpduDuration,
                         &TestDlMuMimoPhyTransmission::CheckPhyState,
                         this,
                         m_phySta3,
@@ -879,7 +879,7 @@
     // Send MU PPDU with two PSDUs addressed to STA 1 and STA 3:
     // STA 1 and STA 3 should receive their PSDUs, whereas STA 2 should not receive any PSDU
     // but should keep its PHY busy during all PPDU duration.
-    Simulator::Schedule(Seconds(2.0),
+    Simulator::Schedule(Seconds(2),
                         &TestDlMuMimoPhyTransmission::SendMuPpdu,
                         this,
                         std::vector<StaInfo>{{1, m_nss}, {3, m_nss}});
@@ -887,32 +887,32 @@
     // Since it takes m_expectedPpduDuration to transmit the PPDU,
     // all 3 PHYs should be back to IDLE at the same time,
     // even the PHY that has no PSDU addressed to it.
-    Simulator::Schedule(Seconds(2.0) + m_expectedPpduDuration - NanoSeconds(1),
+    Simulator::Schedule(Seconds(2) + m_expectedPpduDuration - NanoSeconds(1),
                         &TestDlMuMimoPhyTransmission::CheckPhyState,
                         this,
                         m_phySta1,
                         WifiPhyState::RX);
-    Simulator::Schedule(Seconds(2.0) + m_expectedPpduDuration - NanoSeconds(1),
+    Simulator::Schedule(Seconds(2) + m_expectedPpduDuration - NanoSeconds(1),
                         &TestDlMuMimoPhyTransmission::CheckPhyState,
                         this,
                         m_phySta2,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(2.0) + m_expectedPpduDuration - NanoSeconds(1),
+    Simulator::Schedule(Seconds(2) + m_expectedPpduDuration - NanoSeconds(1),
                         &TestDlMuMimoPhyTransmission::CheckPhyState,
                         this,
                         m_phySta3,
                         WifiPhyState::RX);
-    Simulator::Schedule(Seconds(2.0) + m_expectedPpduDuration,
+    Simulator::Schedule(Seconds(2) + m_expectedPpduDuration,
                         &TestDlMuMimoPhyTransmission::CheckPhyState,
                         this,
                         m_phySta1,
                         WifiPhyState::IDLE);
-    Simulator::Schedule(Seconds(2.0) + m_expectedPpduDuration,
+    Simulator::Schedule(Seconds(2) + m_expectedPpduDuration,
                         &TestDlMuMimoPhyTransmission::CheckPhyState,
                         this,
                         m_phySta2,
                         WifiPhyState::IDLE);
-    Simulator::Schedule(Seconds(2.0) + m_expectedPpduDuration,
+    Simulator::Schedule(Seconds(2) + m_expectedPpduDuration,
                         &TestDlMuMimoPhyTransmission::CheckPhyState,
                         this,
                         m_phySta3,
@@ -946,7 +946,7 @@
     // Send MU PPDU with two PSDUs addressed to STA 2 and STA 3:
     // STA 2 and STA 3 should receive their PSDUs, whereas STA 1 should not receive any PSDU
     // but should keep its PHY busy during all PPDU duration.
-    Simulator::Schedule(Seconds(3.0),
+    Simulator::Schedule(Seconds(3),
                         &TestDlMuMimoPhyTransmission::SendMuPpdu,
                         this,
                         std::vector<StaInfo>{{2, m_nss}, {3, m_nss}});
@@ -954,32 +954,32 @@
     // Since it takes m_expectedPpduDuration to transmit the PPDU,
     // all 3 PHYs should be back to IDLE at the same time,
     // even the PHY that has no PSDU addressed to it.
-    Simulator::Schedule(Seconds(3.0) + m_expectedPpduDuration - NanoSeconds(1),
+    Simulator::Schedule(Seconds(3) + m_expectedPpduDuration - NanoSeconds(1),
                         &TestDlMuMimoPhyTransmission::CheckPhyState,
                         this,
                         m_phySta1,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(3.0) + m_expectedPpduDuration - NanoSeconds(1),
+    Simulator::Schedule(Seconds(3) + m_expectedPpduDuration - NanoSeconds(1),
                         &TestDlMuMimoPhyTransmission::CheckPhyState,
                         this,
                         m_phySta2,
                         WifiPhyState::RX);
-    Simulator::Schedule(Seconds(3.0) + m_expectedPpduDuration - NanoSeconds(1),
+    Simulator::Schedule(Seconds(3) + m_expectedPpduDuration - NanoSeconds(1),
                         &TestDlMuMimoPhyTransmission::CheckPhyState,
                         this,
                         m_phySta3,
                         WifiPhyState::RX);
-    Simulator::Schedule(Seconds(3.0) + m_expectedPpduDuration,
+    Simulator::Schedule(Seconds(3) + m_expectedPpduDuration,
                         &TestDlMuMimoPhyTransmission::CheckPhyState,
                         this,
                         m_phySta1,
                         WifiPhyState::IDLE);
-    Simulator::Schedule(Seconds(3.0) + m_expectedPpduDuration,
+    Simulator::Schedule(Seconds(3) + m_expectedPpduDuration,
                         &TestDlMuMimoPhyTransmission::CheckPhyState,
                         this,
                         m_phySta2,
                         WifiPhyState::IDLE);
-    Simulator::Schedule(Seconds(3.0) + m_expectedPpduDuration,
+    Simulator::Schedule(Seconds(3) + m_expectedPpduDuration,
                         &TestDlMuMimoPhyTransmission::CheckPhyState,
                         this,
                         m_phySta3,
@@ -1012,39 +1012,39 @@
     //----------------------------------------------------------------------------------------------------
     // Send MU PPDU with three PSDUs addressed to STA 1, STA 2 and STA 3:
     // All STAs should receive their PSDUs.
-    Simulator::Schedule(Seconds(4.0),
+    Simulator::Schedule(Seconds(4),
                         &TestDlMuMimoPhyTransmission::SendMuPpdu,
                         this,
                         std::vector<StaInfo>{{1, m_nss}, {2, m_nss}, {3, m_nss}});
 
     // Since it takes m_expectedPpduDuration to transmit the PPDU,
     // all 3 PHYs should be back to IDLE at the same time.
-    Simulator::Schedule(Seconds(4.0) + m_expectedPpduDuration - NanoSeconds(1),
+    Simulator::Schedule(Seconds(4) + m_expectedPpduDuration - NanoSeconds(1),
                         &TestDlMuMimoPhyTransmission::CheckPhyState,
                         this,
                         m_phySta1,
                         WifiPhyState::RX);
-    Simulator::Schedule(Seconds(4.0) + m_expectedPpduDuration - NanoSeconds(1),
+    Simulator::Schedule(Seconds(4) + m_expectedPpduDuration - NanoSeconds(1),
                         &TestDlMuMimoPhyTransmission::CheckPhyState,
                         this,
                         m_phySta2,
                         WifiPhyState::RX);
-    Simulator::Schedule(Seconds(4.0) + m_expectedPpduDuration - NanoSeconds(1),
+    Simulator::Schedule(Seconds(4) + m_expectedPpduDuration - NanoSeconds(1),
                         &TestDlMuMimoPhyTransmission::CheckPhyState,
                         this,
                         m_phySta3,
                         WifiPhyState::RX);
-    Simulator::Schedule(Seconds(4.0) + m_expectedPpduDuration,
+    Simulator::Schedule(Seconds(4) + m_expectedPpduDuration,
                         &TestDlMuMimoPhyTransmission::CheckPhyState,
                         this,
                         m_phySta1,
                         WifiPhyState::IDLE);
-    Simulator::Schedule(Seconds(4.0) + m_expectedPpduDuration,
+    Simulator::Schedule(Seconds(4) + m_expectedPpduDuration,
                         &TestDlMuMimoPhyTransmission::CheckPhyState,
                         this,
                         m_phySta2,
                         WifiPhyState::IDLE);
-    Simulator::Schedule(Seconds(4.0) + m_expectedPpduDuration,
+    Simulator::Schedule(Seconds(4) + m_expectedPpduDuration,
                         &TestDlMuMimoPhyTransmission::CheckPhyState,
                         this,
                         m_phySta3,
@@ -1084,23 +1084,23 @@
     for (auto nss : nssToTest)
     {
         m_nss = nss;
-        m_frequency = 5180;
-        m_channelWidth = 20;
+        m_frequency = MHz_u{5180};
+        m_channelWidth = MHz_u{20};
         m_expectedPpduDuration = (nss > 1) ? NanoSeconds(110400) : NanoSeconds(156800);
         RunOne();
 
-        m_frequency = 5190;
-        m_channelWidth = 40;
+        m_frequency = MHz_u{5190};
+        m_channelWidth = MHz_u{40};
         m_expectedPpduDuration = (nss > 1) ? NanoSeconds(83200) : NanoSeconds(102400);
         RunOne();
 
-        m_frequency = 5210;
-        m_channelWidth = 80;
+        m_frequency = MHz_u{5210};
+        m_channelWidth = MHz_u{80};
         m_expectedPpduDuration = (nss > 1) ? NanoSeconds(69600) : NanoSeconds(75200);
         RunOne();
 
-        m_frequency = 5250;
-        m_channelWidth = 160;
+        m_frequency = MHz_u{5250};
+        m_channelWidth = MHz_u{160};
         m_expectedPpduDuration = (nss > 1) ? NanoSeconds(69600) : NanoSeconds(61600);
         RunOne();
     }
@@ -1111,10 +1111,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief UL MU-MIMO PHY test
+ * @brief UL MU-MIMO PHY test
  */
 class TestUlMuMimoPhyTransmission : public TestCase
 {
@@ -1128,26 +1128,26 @@
 
     /**
      * Get TXVECTOR for HE TB PPDU.
-     * \param txStaId the ID of the TX STA
-     * \param nss the number of spatial streams used for the transmission
-     * \param bssColor the BSS color of the TX STA
-     * \return the TXVECTOR for HE TB PPDU
+     * @param txStaId the ID of the TX STA
+     * @param nss the number of spatial streams used for the transmission
+     * @param bssColor the BSS color of the TX STA
+     * @return the TXVECTOR for HE TB PPDU
      */
     WifiTxVector GetTxVectorForHeTbPpdu(uint16_t txStaId, uint8_t nss, uint8_t bssColor) const;
     /**
      * Set TRIGVECTOR for HE TB PPDU
      *
-     * \param staIds the IDs of the STAs sollicited for the HE TB transmission
-     * \param bssColor the BSS color of the TX STA
+     * @param staIds the IDs of the STAs sollicited for the HE TB transmission
+     * @param bssColor the BSS color of the TX STA
      */
     void SetTrigVector(const std::vector<uint16_t>& staIds, uint8_t bssColor);
     /**
      * Send HE TB PPDU function
-     * \param txStaId the ID of the TX STA
-     * \param nss the number of spatial streams used for the transmission
-     * \param payloadSize the size of the payload in bytes
-     * \param uid the UID of the trigger frame that is initiating this transmission
-     * \param bssColor the BSS color of the TX STA
+     * @param txStaId the ID of the TX STA
+     * @param nss the number of spatial streams used for the transmission
+     * @param payloadSize the size of the payload in bytes
+     * @param uid the UID of the trigger frame that is initiating this transmission
+     * @param bssColor the BSS color of the TX STA
      */
     void SendHeTbPpdu(uint16_t txStaId,
                       uint8_t nss,
@@ -1157,17 +1157,17 @@
 
     /**
      * Send HE SU PPDU function
-     * \param txStaId the ID of the TX STA
-     * \param payloadSize the size of the payload in bytes
-     * \param uid the UID of the trigger frame that is initiating this transmission
-     * \param bssColor the BSS color of the TX STA
+     * @param txStaId the ID of the TX STA
+     * @param payloadSize the size of the payload in bytes
+     * @param uid the UID of the trigger frame that is initiating this transmission
+     * @param bssColor the BSS color of the TX STA
      */
     void SendHeSuPpdu(uint16_t txStaId, std::size_t payloadSize, uint64_t uid, uint8_t bssColor);
 
     /**
      * Set the BSS color
-     * \param phy the PHY
-     * \param bssColor the BSS color
+     * @param phy the PHY
+     * @param bssColor the BSS color
      */
     void SetBssColor(Ptr<WifiPhy> phy, uint8_t bssColor);
 
@@ -1178,10 +1178,10 @@
 
     /**
      * Check the received PSDUs from a given STA
-     * \param staId the ID of the STA to check
-     * \param expectedSuccess the expected number of success
-     * \param expectedFailures the expected number of failures
-     * \param expectedBytes the expected number of bytes
+     * @param staId the ID of the STA to check
+     * @param expectedSuccess the expected number of success
+     * @param expectedFailures the expected number of failures
+     * @param expectedBytes the expected number of bytes
      */
     void CheckRxFromSta(uint16_t staId,
                         uint32_t expectedSuccess,
@@ -1195,11 +1195,11 @@
 
     /**
      * Check the PHY state
-     * \param phy the PHY
-     * \param expectedState the expected state of the PHY
+     * @param phy the PHY
+     * @param expectedState the expected state of the PHY
      */
     void CheckPhyState(Ptr<MuMimoSpectrumWifiPhy> phy, WifiPhyState expectedState);
-    /// \copydoc CheckPhyState
+    /// @copydoc CheckPhyState
     void DoCheckPhyState(Ptr<MuMimoSpectrumWifiPhy> phy, WifiPhyState expectedState);
 
     /**
@@ -1209,19 +1209,19 @@
 
     /**
      * Receive success function
-     * \param psdu the PSDU
-     * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
-     * \param txVector the transmit vector
-     * \param statusPerMpdu reception status per MPDU
+     * @param psdu the PSDU
+     * @param rxSignalInfo the info on the received signal (\see RxSignalInfo)
+     * @param txVector the transmit vector
+     * @param statusPerMpdu reception status per MPDU
      */
     void RxSuccess(Ptr<const WifiPsdu> psdu,
                    RxSignalInfo rxSignalInfo,
-                   WifiTxVector txVector,
-                   std::vector<bool> statusPerMpdu);
+                   const WifiTxVector& txVector,
+                   const std::vector<bool>& statusPerMpdu);
 
     /**
      * Receive failure function
-     * \param psdu the PSDU
+     * @param psdu the PSDU
      */
     void RxFailure(Ptr<const WifiPsdu> psdu);
 
@@ -1229,10 +1229,10 @@
      * Schedule test to perform.
      * The interference generation should be scheduled apart.
      *
-     * \param delay the reference delay to schedule the events
-     * \param txStaIds the IDs of the STAs planned to transmit an HE TB PPDU
-     * \param expectedStateAtEnd the expected state of the PHY at the end of the reception
-     * \param expectedCountersPerSta the expected counters per STA
+     * @param delay the reference delay to schedule the events
+     * @param txStaIds the IDs of the STAs planned to transmit an HE TB PPDU
+     * @param expectedStateAtEnd the expected state of the PHY at the end of the reception
+     * @param expectedCountersPerSta the expected counters per STA
      */
     void ScheduleTest(
         Time delay,
@@ -1243,7 +1243,7 @@
     /**
      * Log scenario description
      *
-     * \param log the scenario description to add to log
+     * @param log the scenario description to add to log
      */
     void LogScenario(const std::string& log) const;
 
@@ -1395,8 +1395,10 @@
     psdus.insert(std::make_pair(txStaId, psdu));
 
     Ptr<MuMimoSpectrumWifiPhy> phy = m_phyStas.at(txStaId - 1);
-    Time txDuration =
-        phy->CalculateTxDuration(psdu->GetSize(), txVector, phy->GetPhyBand(), txStaId);
+    Time txDuration = MuMimoSpectrumWifiPhy::CalculateTxDuration(psdu->GetSize(),
+                                                                 txVector,
+                                                                 phy->GetPhyBand(),
+                                                                 txStaId);
     txVector.SetLength(
         HePhy::ConvertHeTbPpduDurationToLSigLength(txDuration, txVector, phy->GetPhyBand()).first);
 
@@ -1407,8 +1409,8 @@
 void
 TestUlMuMimoPhyTransmission::RxSuccess(Ptr<const WifiPsdu> psdu,
                                        RxSignalInfo rxSignalInfo,
-                                       WifiTxVector txVector,
-                                       std::vector<bool> /*statusPerMpdu*/)
+                                       const WifiTxVector& txVector,
+                                       const std::vector<bool>& /*statusPerMpdu*/)
 {
     NS_LOG_FUNCTION(this << *psdu << psdu->GetAddr2() << RatioToDb(rxSignalInfo.snr) << txVector);
     NS_TEST_ASSERT_MSG_EQ((RatioToDb(rxSignalInfo.snr) > dB_u{0.0}), true, "Incorrect SNR value");
@@ -1713,9 +1715,9 @@
             WifiPhy::ChannelTuple{channelNum, m_channelWidth, WIFI_PHY_BAND_5GHZ, 0});
     }
 
-    Time delay = Seconds(0.0);
+    Time delay;
     Simulator::Schedule(delay, &TestUlMuMimoPhyTransmission::Reset, this);
-    delay += Seconds(1.0);
+    delay += Seconds(1);
 
     //---------------------------------------------------------------------------
     // Verify that all HE TB PPDUs using full BW MU-MIMO have been corrected received
@@ -1734,7 +1736,7 @@
                      std::make_tuple(1, 0, 1002)  // One PSDU of 1002 bytes should have been
                                                   // successfully received from STA 3
                  });
-    delay += Seconds(1.0);
+    delay += Seconds(1);
 
     //---------------------------------------------------------------------------
     // Send an HE SU PPDU during 400 ns window and verify that all HE TB PPDUs using full BW MU-MIMO
@@ -1763,7 +1765,7 @@
                      std::make_tuple(0, 1, 0) // Reception of the PSDU from STA 3 should have failed
                                               // (since interference from STA 4)
                  });
-    delay += Seconds(1.0);
+    delay += Seconds(1);
 
     //---------------------------------------------------------------------------
     // Send an HE SU PPDU during HE portion reception and verify that all HE TB PPDUs have been
@@ -1792,7 +1794,7 @@
                      std::make_tuple(0, 1, 0) // Reception of the PSDU from STA 3 should have failed
                                               // (since interference from STA 4)
                  });
-    delay += Seconds(1.0);
+    delay += Seconds(1);
 
     Simulator::Run();
 }
@@ -1806,32 +1808,32 @@
     {
         m_delayStart = delayStart;
 
-        m_frequency = 5180;
-        m_channelWidth = 20;
+        m_frequency = MHz_u{5180};
+        m_channelWidth = MHz_u{20};
         m_expectedPpduDuration = NanoSeconds(163200);
         NS_LOG_DEBUG("Run UL MU-MIMO PHY transmission test for "
                      << m_channelWidth << " MHz with delay between each HE TB PPDUs of "
                      << m_delayStart);
         RunOne();
 
-        m_frequency = 5190;
-        m_channelWidth = 40;
+        m_frequency = MHz_u{5190};
+        m_channelWidth = MHz_u{40};
         m_expectedPpduDuration = NanoSeconds(105600);
         NS_LOG_DEBUG("Run UL MU-MIMO PHY transmission test for "
                      << m_channelWidth << " MHz with delay between each HE TB PPDUs of "
                      << m_delayStart);
         RunOne();
 
-        m_frequency = 5210;
-        m_channelWidth = 80;
+        m_frequency = MHz_u{5210};
+        m_channelWidth = MHz_u{80};
         m_expectedPpduDuration = NanoSeconds(76800);
         NS_LOG_DEBUG("Run UL MU-MIMO PHY transmission test for "
                      << m_channelWidth << " MHz with delay between each HE TB PPDUs of "
                      << m_delayStart);
         RunOne();
 
-        m_frequency = 5250;
-        m_channelWidth = 160;
+        m_frequency = MHz_u{5250};
+        m_channelWidth = MHz_u{160};
         m_expectedPpduDuration = NanoSeconds(62400);
         NS_LOG_DEBUG("Run UL MU-MIMO PHY transmission test for "
                      << m_channelWidth << " MHz with delay between each HE TB PPDUs of "
@@ -1843,10 +1845,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief wifi PHY MU-MIMO Test Suite
+ * @brief wifi PHY MU-MIMO Test Suite
  */
 class WifiPhyMuMimoTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/test/wifi-phy-ofdma-test.cc ns-3.44/src/wifi/test/wifi-phy-ofdma-test.cc
--- ns-3.43/src/wifi/test/wifi-phy-ofdma-test.cc	2024-10-09 16:41:10.140657000 -0700
+++ ns-3.44/src/wifi/test/wifi-phy-ofdma-test.cc	2025-03-09 16:55:49.811372800 -0700
@@ -50,9 +50,9 @@
 NS_LOG_COMPONENT_DEFINE("WifiPhyOfdmaTest");
 
 static const uint8_t DEFAULT_CHANNEL_NUMBER = 36;
-static const MHz_u DEFAULT_FREQUENCY = 5180;
+static const MHz_u DEFAULT_FREQUENCY{5180};
 static const WifiPhyBand DEFAULT_WIFI_BAND = WIFI_PHY_BAND_5GHZ;
-static const MHz_u DEFAULT_CHANNEL_WIDTH = 20;
+static const MHz_u DEFAULT_CHANNEL_WIDTH{20};
 static const MHz_u DEFAULT_GUARD_WIDTH =
     DEFAULT_CHANNEL_WIDTH; // expanded to channel width to model spectrum mask
 
@@ -66,7 +66,7 @@
     /**
      * Constructor
      *
-     * \param staId the ID of the STA to which this PHY belongs to
+     * @param staId the ID of the STA to which this PHY belongs to
      */
     OfdmaTestHePhy(uint16_t staId);
     ~OfdmaTestHePhy() override;
@@ -75,15 +75,15 @@
      * Return the STA ID that has been assigned to the station this PHY belongs to.
      * This is typically called for MU PPDUs, in order to pick the correct PSDU.
      *
-     * \param ppdu the PPDU for which the STA ID is requested
-     * \return the STA ID
+     * @param ppdu the PPDU for which the STA ID is requested
+     * @return the STA ID
      */
     uint16_t GetStaId(const Ptr<const WifiPpdu> ppdu) const override;
 
     /**
      * Set the global PPDU UID counter.
      *
-     * \param uid the value to which the global PPDU UID counter should be set
+     * @param uid the value to which the global PPDU UID counter should be set
      */
     void SetGlobalPpduUid(uint64_t uid);
 
@@ -124,14 +124,14 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     /**
      * Constructor
      *
-     * \param staId the ID of the STA to which this PHY belongs to
+     * @param staId the ID of the STA to which this PHY belongs to
      */
     OfdmaSpectrumWifiPhy(uint16_t staId);
     ~OfdmaSpectrumWifiPhy() override;
@@ -145,47 +145,47 @@
     /**
      * TracedCallback signature for UID of transmitted PPDU.
      *
-     * \param uid the UID of the transmitted PPDU
+     * @param uid the UID of the transmitted PPDU
      */
     typedef void (*TxPpduUidCallback)(uint64_t uid);
 
     /**
      * Set the global PPDU UID counter.
      *
-     * \param uid the value to which the global PPDU UID counter should be set
+     * @param uid the value to which the global PPDU UID counter should be set
      */
     void SetPpduUid(uint64_t uid);
 
     /**
      * Since we assume trigger frame was previously received from AP, this is used to set its UID
      *
-     * \param uid the PPDU UID of the trigger frame
+     * @param uid the PPDU UID of the trigger frame
      */
     void SetTriggerFrameUid(uint64_t uid);
 
     /**
-     * \return the current preamble events map
+     * @return the current preamble events map
      */
     std::map<std::pair<uint64_t, WifiPreamble>, Ptr<Event>>& GetCurrentPreambleEvents();
     /**
-     * \return the current event
+     * @return the current event
      */
     Ptr<Event> GetCurrentEvent();
 
     /**
      * Wrapper to InterferenceHelper method.
      *
-     * \param energy the minimum energy requested
-     * \param band identify the requested band
+     * @param energy the minimum energy requested
+     * @param band identify the requested band
      *
-     * \returns the expected amount of time the observed
+     * @returns the expected amount of time the observed
      *          energy on the medium for a given band will
      *          be higher than the requested threshold.
      */
     Time GetEnergyDuration(Watt_u energy, WifiSpectrumBandInfo band);
 
     /**
-     * \return a const pointer to the HE PHY instance
+     * @return a const pointer to the HE PHY instance
      */
     Ptr<const HePhy> GetHePhy() const;
 
@@ -280,10 +280,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief DL-OFDMA PHY test
+ * @brief DL-OFDMA PHY test
  */
 class TestDlOfdmaPhyTransmission : public TestCase
 {
@@ -298,77 +298,77 @@
 
     /**
      * Receive success function for STA 1
-     * \param psdu the PSDU
-     * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
-     * \param txVector the transmit vector
-     * \param statusPerMpdu reception status per MPDU
+     * @param psdu the PSDU
+     * @param rxSignalInfo the info on the received signal (\see RxSignalInfo)
+     * @param txVector the transmit vector
+     * @param statusPerMpdu reception status per MPDU
      */
     void RxSuccessSta1(Ptr<const WifiPsdu> psdu,
                        RxSignalInfo rxSignalInfo,
-                       WifiTxVector txVector,
-                       std::vector<bool> statusPerMpdu);
+                       const WifiTxVector& txVector,
+                       const std::vector<bool>& statusPerMpdu);
     /**
      * Receive success function for STA 2
-     * \param psdu the PSDU
-     * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
-     * \param txVector the transmit vector
-     * \param statusPerMpdu reception status per MPDU
+     * @param psdu the PSDU
+     * @param rxSignalInfo the info on the received signal (\see RxSignalInfo)
+     * @param txVector the transmit vector
+     * @param statusPerMpdu reception status per MPDU
      */
     void RxSuccessSta2(Ptr<const WifiPsdu> psdu,
                        RxSignalInfo rxSignalInfo,
-                       WifiTxVector txVector,
-                       std::vector<bool> statusPerMpdu);
+                       const WifiTxVector& txVector,
+                       const std::vector<bool>& statusPerMpdu);
     /**
      * Receive success function for STA 3
-     * \param psdu the PSDU
-     * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
-     * \param txVector the transmit vector
-     * \param statusPerMpdu reception status per MPDU
+     * @param psdu the PSDU
+     * @param rxSignalInfo the info on the received signal (\see RxSignalInfo)
+     * @param txVector the transmit vector
+     * @param statusPerMpdu reception status per MPDU
      */
     void RxSuccessSta3(Ptr<const WifiPsdu> psdu,
                        RxSignalInfo rxSignalInfo,
-                       WifiTxVector txVector,
-                       std::vector<bool> statusPerMpdu);
+                       const WifiTxVector& txVector,
+                       const std::vector<bool>& statusPerMpdu);
 
     /**
      * Receive failure function for STA 1
-     * \param psdu the PSDU
+     * @param psdu the PSDU
      */
     void RxFailureSta1(Ptr<const WifiPsdu> psdu);
     /**
      * Receive failure function for STA 2
-     * \param psdu the PSDU
+     * @param psdu the PSDU
      */
     void RxFailureSta2(Ptr<const WifiPsdu> psdu);
     /**
      * Receive failure function for STA 3
-     * \param psdu the PSDU
+     * @param psdu the PSDU
      */
     void RxFailureSta3(Ptr<const WifiPsdu> psdu);
 
     /**
      * Check the results for STA 1
-     * \param expectedRxSuccess the expected number of RX success
-     * \param expectedRxFailure the expected number of RX failures
-     * \param expectedRxBytes the expected number of RX bytes
+     * @param expectedRxSuccess the expected number of RX success
+     * @param expectedRxFailure the expected number of RX failures
+     * @param expectedRxBytes the expected number of RX bytes
      */
     void CheckResultsSta1(uint32_t expectedRxSuccess,
                           uint32_t expectedRxFailure,
                           uint32_t expectedRxBytes);
     /**
      * Check the results for STA 2
-     * \param expectedRxSuccess the expected number of RX success
-     * \param expectedRxFailure the expected number of RX failures
-     * \param expectedRxBytes the expected number of RX bytes
+     * @param expectedRxSuccess the expected number of RX success
+     * @param expectedRxFailure the expected number of RX failures
+     * @param expectedRxBytes the expected number of RX bytes
      */
     void CheckResultsSta2(uint32_t expectedRxSuccess,
                           uint32_t expectedRxFailure,
                           uint32_t expectedRxBytes);
     /**
      * Check the results for STA 3
-     * \param expectedRxSuccess the expected number of RX success
-     * \param expectedRxFailure the expected number of RX failures
-     * \param expectedRxBytes the expected number of RX bytes
+     * @param expectedRxSuccess the expected number of RX success
+     * @param expectedRxFailure the expected number of RX failures
+     * @param expectedRxBytes the expected number of RX bytes
      */
     void CheckResultsSta3(uint32_t expectedRxSuccess,
                           uint32_t expectedRxFailure,
@@ -381,15 +381,15 @@
 
     /**
      * Send MU-PPDU function
-     * \param rxStaId1 the ID of the recipient STA for the first PSDU
-     * \param rxStaId2 the ID of the recipient STA for the second PSDU
+     * @param rxStaId1 the ID of the recipient STA for the first PSDU
+     * @param rxStaId2 the ID of the recipient STA for the second PSDU
      */
     void SendMuPpdu(uint16_t rxStaId1, uint16_t rxStaId2);
 
     /**
      * Generate interference function
-     * \param interferencePsd the PSD of the interference to be generated
-     * \param duration the duration of the interference
+     * @param interferencePsd the PSD of the interference to be generated
+     * @param duration the duration of the interference
      */
     void GenerateInterference(Ptr<SpectrumValue> interferencePsd, Time duration);
     /**
@@ -404,14 +404,14 @@
 
     /**
      * Schedule now to check  the PHY state
-     * \param phy the PHY
-     * \param expectedState the expected state of the PHY
+     * @param phy the PHY
+     * @param expectedState the expected state of the PHY
      */
     void CheckPhyState(Ptr<OfdmaSpectrumWifiPhy> phy, WifiPhyState expectedState);
     /**
      * Check the PHY state now
-     * \param phy the PHY
-     * \param expectedState the expected state of the PHY
+     * @param phy the PHY
+     * @param expectedState the expected state of the PHY
      */
     void DoCheckPhyState(Ptr<OfdmaSpectrumWifiPhy> phy, WifiPhyState expectedState);
 
@@ -483,22 +483,22 @@
                           false,
                           false};
     HeRu::RuType ruType = HeRu::RU_106_TONE;
-    if (m_channelWidth == 20)
+    if (m_channelWidth == MHz_u{20})
     {
         ruType = HeRu::RU_106_TONE;
         txVector.SetRuAllocation({96}, 0);
     }
-    else if (m_channelWidth == 40)
+    else if (m_channelWidth == MHz_u{40})
     {
         ruType = HeRu::RU_242_TONE;
         txVector.SetRuAllocation({192, 192}, 0);
     }
-    else if (m_channelWidth == 80)
+    else if (m_channelWidth == MHz_u{80})
     {
         ruType = HeRu::RU_484_TONE;
         txVector.SetRuAllocation({200, 200, 200, 200}, 0);
     }
-    else if (m_channelWidth == 160)
+    else if (m_channelWidth == MHz_u{160})
     {
         ruType = HeRu::RU_996_TONE;
         txVector.SetRuAllocation({208, 208, 208, 208, 208, 208, 208, 208}, 0);
@@ -515,7 +515,7 @@
     txVector.SetMode(HePhy::GetHeMcs7(), rxStaId1);
     txVector.SetNss(1, rxStaId1);
 
-    HeRu::RuSpec ru2(ruType, (m_channelWidth == 160 ? 1 : 2), m_channelWidth != 160);
+    HeRu::RuSpec ru2(ruType, (m_channelWidth == MHz_u{160} ? 1 : 2), m_channelWidth != MHz_u{160});
     txVector.SetRu(ru2, rxStaId2);
     txVector.SetMode(HePhy::GetHeMcs9(), rxStaId2);
     txVector.SetNss(1, rxStaId2);
@@ -563,8 +563,8 @@
 void
 TestDlOfdmaPhyTransmission::RxSuccessSta1(Ptr<const WifiPsdu> psdu,
                                           RxSignalInfo rxSignalInfo,
-                                          WifiTxVector txVector,
-                                          std::vector<bool> /*statusPerMpdu*/)
+                                          const WifiTxVector& txVector,
+                                          const std::vector<bool>& /*statusPerMpdu*/)
 {
     NS_LOG_FUNCTION(this << *psdu << rxSignalInfo << txVector);
     m_countRxSuccessSta1++;
@@ -574,8 +574,8 @@
 void
 TestDlOfdmaPhyTransmission::RxSuccessSta2(Ptr<const WifiPsdu> psdu,
                                           RxSignalInfo rxSignalInfo,
-                                          WifiTxVector txVector,
-                                          std::vector<bool> /*statusPerMpdu*/)
+                                          const WifiTxVector& txVector,
+                                          const std::vector<bool>& /*statusPerMpdu*/)
 {
     NS_LOG_FUNCTION(this << *psdu << rxSignalInfo << txVector);
     m_countRxSuccessSta2++;
@@ -585,8 +585,8 @@
 void
 TestDlOfdmaPhyTransmission::RxSuccessSta3(Ptr<const WifiPsdu> psdu,
                                           RxSignalInfo rxSignalInfo,
-                                          WifiTxVector txVector,
-                                          std::vector<bool> /*statusPerMpdu*/)
+                                          const WifiTxVector& txVector,
+                                          const std::vector<bool>& /*statusPerMpdu*/)
 {
     NS_LOG_FUNCTION(this << *psdu << rxSignalInfo << txVector);
     m_countRxSuccessSta3++;
@@ -691,7 +691,7 @@
 {
     Ptr<MultiModelSpectrumChannel> spectrumChannel = CreateObject<MultiModelSpectrumChannel>();
     Ptr<FriisPropagationLossModel> lossModel = CreateObject<FriisPropagationLossModel>();
-    lossModel->SetFrequency(m_frequency * 1e6);
+    lossModel->SetFrequency(MHzToHz(m_frequency));
     spectrumChannel->AddPropagationLossModel(lossModel);
     Ptr<ConstantSpeedPropagationDelayModel> delayModel =
         CreateObject<ConstantSpeedPropagationDelayModel>();
@@ -825,37 +825,37 @@
 
     // Send MU PPDU with two PSDUs addressed to STA 1 and STA 2:
     // Each STA should receive its PSDU.
-    Simulator::Schedule(Seconds(1.0), &TestDlOfdmaPhyTransmission::SendMuPpdu, this, 1, 2);
+    Simulator::Schedule(Seconds(1), &TestDlOfdmaPhyTransmission::SendMuPpdu, this, 1, 2);
 
     // Since it takes m_expectedPpduDuration to transmit the PPDU,
     // all 3 PHYs should be back to IDLE at the same time,
     // even the PHY that has no PSDU addressed to it.
-    Simulator::Schedule(Seconds(1.0) + m_expectedPpduDuration - NanoSeconds(1),
+    Simulator::Schedule(Seconds(1) + m_expectedPpduDuration - NanoSeconds(1),
                         &TestDlOfdmaPhyTransmission::CheckPhyState,
                         this,
                         m_phySta1,
                         WifiPhyState::RX);
-    Simulator::Schedule(Seconds(1.0) + m_expectedPpduDuration - NanoSeconds(1),
+    Simulator::Schedule(Seconds(1) + m_expectedPpduDuration - NanoSeconds(1),
                         &TestDlOfdmaPhyTransmission::CheckPhyState,
                         this,
                         m_phySta2,
                         WifiPhyState::RX);
-    Simulator::Schedule(Seconds(1.0) + m_expectedPpduDuration - NanoSeconds(1),
+    Simulator::Schedule(Seconds(1) + m_expectedPpduDuration - NanoSeconds(1),
                         &TestDlOfdmaPhyTransmission::CheckPhyState,
                         this,
                         m_phySta3,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(1.0) + m_expectedPpduDuration,
+    Simulator::Schedule(Seconds(1) + m_expectedPpduDuration,
                         &TestDlOfdmaPhyTransmission::CheckPhyState,
                         this,
                         m_phySta1,
                         WifiPhyState::IDLE);
-    Simulator::Schedule(Seconds(1.0) + m_expectedPpduDuration,
+    Simulator::Schedule(Seconds(1) + m_expectedPpduDuration,
                         &TestDlOfdmaPhyTransmission::CheckPhyState,
                         this,
                         m_phySta2,
                         WifiPhyState::IDLE);
-    Simulator::Schedule(Seconds(1.0) + m_expectedPpduDuration,
+    Simulator::Schedule(Seconds(1) + m_expectedPpduDuration,
                         &TestDlOfdmaPhyTransmission::CheckPhyState,
                         this,
                         m_phySta3,
@@ -883,37 +883,37 @@
     // Send MU PPDU with two PSDUs addressed to STA 1 and STA 3:
     // STA 1 should receive its PSDU, whereas STA 2 should not receive any PSDU
     // but should keep its PHY busy during all PPDU duration.
-    Simulator::Schedule(Seconds(2.0), &TestDlOfdmaPhyTransmission::SendMuPpdu, this, 1, 3);
+    Simulator::Schedule(Seconds(2), &TestDlOfdmaPhyTransmission::SendMuPpdu, this, 1, 3);
 
     // Since it takes m_expectedPpduDuration to transmit the PPDU,
     // all 3 PHYs should be back to IDLE at the same time,
     // even the PHY that has no PSDU addressed to it.
-    Simulator::Schedule(Seconds(2.0) + m_expectedPpduDuration - NanoSeconds(1),
+    Simulator::Schedule(Seconds(2) + m_expectedPpduDuration - NanoSeconds(1),
                         &TestDlOfdmaPhyTransmission::CheckPhyState,
                         this,
                         m_phySta1,
                         WifiPhyState::RX);
-    Simulator::Schedule(Seconds(2.0) + m_expectedPpduDuration - NanoSeconds(1),
+    Simulator::Schedule(Seconds(2) + m_expectedPpduDuration - NanoSeconds(1),
                         &TestDlOfdmaPhyTransmission::CheckPhyState,
                         this,
                         m_phySta2,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(2.0) + m_expectedPpduDuration - NanoSeconds(1),
+    Simulator::Schedule(Seconds(2) + m_expectedPpduDuration - NanoSeconds(1),
                         &TestDlOfdmaPhyTransmission::CheckPhyState,
                         this,
                         m_phySta3,
                         WifiPhyState::RX);
-    Simulator::Schedule(Seconds(2.0) + m_expectedPpduDuration,
+    Simulator::Schedule(Seconds(2) + m_expectedPpduDuration,
                         &TestDlOfdmaPhyTransmission::CheckPhyState,
                         this,
                         m_phySta1,
                         WifiPhyState::IDLE);
-    Simulator::Schedule(Seconds(2.0) + m_expectedPpduDuration,
+    Simulator::Schedule(Seconds(2) + m_expectedPpduDuration,
                         &TestDlOfdmaPhyTransmission::CheckPhyState,
                         this,
                         m_phySta2,
                         WifiPhyState::IDLE);
-    Simulator::Schedule(Seconds(2.0) + m_expectedPpduDuration,
+    Simulator::Schedule(Seconds(2) + m_expectedPpduDuration,
                         &TestDlOfdmaPhyTransmission::CheckPhyState,
                         this,
                         m_phySta3,
@@ -939,22 +939,22 @@
     Simulator::Schedule(Seconds(2.5), &TestDlOfdmaPhyTransmission::ResetResults, this);
 
     // Send MU PPDU with two PSDUs addressed to STA 1 and STA 2:
-    Simulator::Schedule(Seconds(3.0), &TestDlOfdmaPhyTransmission::SendMuPpdu, this, 1, 2);
+    Simulator::Schedule(Seconds(3), &TestDlOfdmaPhyTransmission::SendMuPpdu, this, 1, 2);
 
     // A strong non-wifi interference is generated on RU 1 during PSDU reception
     BandInfo bandInfo;
-    bandInfo.fc = (m_frequency - (m_channelWidth / 4)) * 1e6;
-    bandInfo.fl = bandInfo.fc - ((m_channelWidth / 4) * 1e6);
-    bandInfo.fh = bandInfo.fc + ((m_channelWidth / 4) * 1e6);
+    bandInfo.fc = MHzToHz(m_frequency - (m_channelWidth / 4));
+    bandInfo.fl = bandInfo.fc - MHzToHz(m_channelWidth / 4);
+    bandInfo.fh = bandInfo.fc + MHzToHz(m_channelWidth / 4);
     Bands bands;
     bands.push_back(bandInfo);
 
     auto SpectrumInterferenceRu1 = Create<SpectrumModel>(bands);
     auto interferencePsdRu1 = Create<SpectrumValue>(SpectrumInterferenceRu1);
     Watt_u interferencePower{0.1};
-    *interferencePsdRu1 = interferencePower / ((m_channelWidth / 2) * 20e6);
+    *interferencePsdRu1 = interferencePower / (MHzToHz(m_channelWidth / 2) * 20);
 
-    Simulator::Schedule(Seconds(3.0) + MicroSeconds(50),
+    Simulator::Schedule(Seconds(3) + MicroSeconds(50),
                         &TestDlOfdmaPhyTransmission::GenerateInterference,
                         this,
                         interferencePsdRu1,
@@ -963,32 +963,32 @@
     // Since it takes m_expectedPpduDuration to transmit the PPDU,
     // both PHYs should be back to CCA_BUSY (due to the interference) at the same time,
     // even the PHY that has no PSDU addressed to it.
-    Simulator::Schedule(Seconds(3.0) + m_expectedPpduDuration - NanoSeconds(1),
+    Simulator::Schedule(Seconds(3) + m_expectedPpduDuration - NanoSeconds(1),
                         &TestDlOfdmaPhyTransmission::CheckPhyState,
                         this,
                         m_phySta1,
                         WifiPhyState::RX);
-    Simulator::Schedule(Seconds(3.0) + m_expectedPpduDuration - NanoSeconds(1),
+    Simulator::Schedule(Seconds(3) + m_expectedPpduDuration - NanoSeconds(1),
                         &TestDlOfdmaPhyTransmission::CheckPhyState,
                         this,
                         m_phySta2,
                         WifiPhyState::RX);
-    Simulator::Schedule(Seconds(3.0) + m_expectedPpduDuration - NanoSeconds(1),
+    Simulator::Schedule(Seconds(3) + m_expectedPpduDuration - NanoSeconds(1),
                         &TestDlOfdmaPhyTransmission::CheckPhyState,
                         this,
                         m_phySta3,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(3.0) + m_expectedPpduDuration,
+    Simulator::Schedule(Seconds(3) + m_expectedPpduDuration,
                         &TestDlOfdmaPhyTransmission::CheckPhyState,
                         this,
                         m_phySta1,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(3.0) + m_expectedPpduDuration,
+    Simulator::Schedule(Seconds(3) + m_expectedPpduDuration,
                         &TestDlOfdmaPhyTransmission::CheckPhyState,
                         this,
                         m_phySta2,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(3.0) + m_expectedPpduDuration,
+    Simulator::Schedule(Seconds(3) + m_expectedPpduDuration,
                         &TestDlOfdmaPhyTransmission::CheckPhyState,
                         this,
                         m_phySta3,
@@ -1010,20 +1010,20 @@
     Simulator::Schedule(Seconds(3.5), &TestDlOfdmaPhyTransmission::ResetResults, this);
 
     // Send MU PPDU with two PSDUs addressed to STA 1 and STA 2:
-    Simulator::Schedule(Seconds(4.0), &TestDlOfdmaPhyTransmission::SendMuPpdu, this, 1, 2);
+    Simulator::Schedule(Seconds(4), &TestDlOfdmaPhyTransmission::SendMuPpdu, this, 1, 2);
 
     // A strong non-wifi interference is generated on RU 2 during PSDU reception
-    bandInfo.fc = (m_frequency + (m_channelWidth / 4)) * 1e6;
-    bandInfo.fl = bandInfo.fc - ((m_channelWidth / 4) * 1e6);
-    bandInfo.fh = bandInfo.fc + ((m_channelWidth / 4) * 1e6);
+    bandInfo.fc = MHzToHz(m_frequency + (m_channelWidth / 4));
+    bandInfo.fl = bandInfo.fc - MHzToHz(m_channelWidth / 4);
+    bandInfo.fh = bandInfo.fc + MHzToHz(m_channelWidth / 4);
     bands.clear();
     bands.push_back(bandInfo);
 
     Ptr<SpectrumModel> SpectrumInterferenceRu2 = Create<SpectrumModel>(bands);
     Ptr<SpectrumValue> interferencePsdRu2 = Create<SpectrumValue>(SpectrumInterferenceRu2);
-    *interferencePsdRu2 = interferencePower / ((m_channelWidth / 2) * 20e6);
+    *interferencePsdRu2 = interferencePower / (MHzToHz(m_channelWidth / 2) * 20);
 
-    Simulator::Schedule(Seconds(4.0) + MicroSeconds(50),
+    Simulator::Schedule(Seconds(4) + MicroSeconds(50),
                         &TestDlOfdmaPhyTransmission::GenerateInterference,
                         this,
                         interferencePsdRu2,
@@ -1032,36 +1032,39 @@
     // Since it takes m_expectedPpduDuration to transmit the PPDU,
     // both PHYs should be back to IDLE (or CCA_BUSY if interference on the primary 20 MHz) at the
     // same time, even the PHY that has no PSDU addressed to it.
-    Simulator::Schedule(Seconds(4.0) + m_expectedPpduDuration - NanoSeconds(1),
+    Simulator::Schedule(Seconds(4) + m_expectedPpduDuration - NanoSeconds(1),
                         &TestDlOfdmaPhyTransmission::CheckPhyState,
                         this,
                         m_phySta1,
                         WifiPhyState::RX);
-    Simulator::Schedule(Seconds(4.0) + m_expectedPpduDuration - NanoSeconds(1),
+    Simulator::Schedule(Seconds(4) + m_expectedPpduDuration - NanoSeconds(1),
                         &TestDlOfdmaPhyTransmission::CheckPhyState,
                         this,
                         m_phySta2,
                         WifiPhyState::RX);
-    Simulator::Schedule(Seconds(4.0) + m_expectedPpduDuration - NanoSeconds(1),
+    Simulator::Schedule(Seconds(4) + m_expectedPpduDuration - NanoSeconds(1),
                         &TestDlOfdmaPhyTransmission::CheckPhyState,
                         this,
                         m_phySta3,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(4.0) + m_expectedPpduDuration,
+    Simulator::Schedule(Seconds(4) + m_expectedPpduDuration,
                         &TestDlOfdmaPhyTransmission::CheckPhyState,
                         this,
                         m_phySta1,
-                        (m_channelWidth >= 40) ? WifiPhyState::IDLE : WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(4.0) + m_expectedPpduDuration,
+                        (m_channelWidth >= MHz_u{40}) ? WifiPhyState::IDLE
+                                                      : WifiPhyState::CCA_BUSY);
+    Simulator::Schedule(Seconds(4) + m_expectedPpduDuration,
                         &TestDlOfdmaPhyTransmission::CheckPhyState,
                         this,
                         m_phySta2,
-                        (m_channelWidth >= 40) ? WifiPhyState::IDLE : WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(4.0) + m_expectedPpduDuration,
+                        (m_channelWidth >= MHz_u{40}) ? WifiPhyState::IDLE
+                                                      : WifiPhyState::CCA_BUSY);
+    Simulator::Schedule(Seconds(4) + m_expectedPpduDuration,
                         &TestDlOfdmaPhyTransmission::CheckPhyState,
                         this,
                         m_phySta3,
-                        (m_channelWidth >= 40) ? WifiPhyState::IDLE : WifiPhyState::CCA_BUSY);
+                        (m_channelWidth >= MHz_u{40}) ? WifiPhyState::IDLE
+                                                      : WifiPhyState::CCA_BUSY);
 
     // One PSDU of 1000 bytes should have been successfully received by STA 1
     Simulator::Schedule(Seconds(4.1),
@@ -1079,20 +1082,20 @@
     Simulator::Schedule(Seconds(4.5), &TestDlOfdmaPhyTransmission::ResetResults, this);
 
     // Send MU PPDU with two PSDUs addressed to STA 1 and STA 2:
-    Simulator::Schedule(Seconds(5.0), &TestDlOfdmaPhyTransmission::SendMuPpdu, this, 1, 2);
+    Simulator::Schedule(Seconds(5), &TestDlOfdmaPhyTransmission::SendMuPpdu, this, 1, 2);
 
     // A strong non-wifi interference is generated on the full band during PSDU reception
-    bandInfo.fc = m_frequency * 1e6;
-    bandInfo.fl = bandInfo.fc - ((m_channelWidth / 2) * 1e6);
-    bandInfo.fh = bandInfo.fc + ((m_channelWidth / 2) * 1e6);
+    bandInfo.fc = MHzToHz(m_frequency);
+    bandInfo.fl = bandInfo.fc - MHzToHz(m_channelWidth / 2);
+    bandInfo.fh = bandInfo.fc + MHzToHz(m_channelWidth / 2);
     bands.clear();
     bands.push_back(bandInfo);
 
     Ptr<SpectrumModel> SpectrumInterferenceAll = Create<SpectrumModel>(bands);
     Ptr<SpectrumValue> interferencePsdAll = Create<SpectrumValue>(SpectrumInterferenceAll);
-    *interferencePsdAll = interferencePower / (m_channelWidth * 20e6);
+    *interferencePsdAll = interferencePower / (MHzToHz(m_channelWidth) * 20);
 
-    Simulator::Schedule(Seconds(5.0) + MicroSeconds(50),
+    Simulator::Schedule(Seconds(5) + MicroSeconds(50),
                         &TestDlOfdmaPhyTransmission::GenerateInterference,
                         this,
                         interferencePsdAll,
@@ -1101,32 +1104,32 @@
     // Since it takes m_expectedPpduDuration to transmit the PPDU,
     // both PHYs should be back to CCA_BUSY (due to the interference) at the same time,
     // even the PHY that has no PSDU addressed to it.
-    Simulator::Schedule(Seconds(5.0) + m_expectedPpduDuration - NanoSeconds(1),
+    Simulator::Schedule(Seconds(5) + m_expectedPpduDuration - NanoSeconds(1),
                         &TestDlOfdmaPhyTransmission::CheckPhyState,
                         this,
                         m_phySta1,
                         WifiPhyState::RX);
-    Simulator::Schedule(Seconds(5.0) + m_expectedPpduDuration - NanoSeconds(1),
+    Simulator::Schedule(Seconds(5) + m_expectedPpduDuration - NanoSeconds(1),
                         &TestDlOfdmaPhyTransmission::CheckPhyState,
                         this,
                         m_phySta2,
                         WifiPhyState::RX);
-    Simulator::Schedule(Seconds(5.0) + m_expectedPpduDuration - NanoSeconds(1),
+    Simulator::Schedule(Seconds(5) + m_expectedPpduDuration - NanoSeconds(1),
                         &TestDlOfdmaPhyTransmission::CheckPhyState,
                         this,
                         m_phySta3,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(5.0) + m_expectedPpduDuration,
+    Simulator::Schedule(Seconds(5) + m_expectedPpduDuration,
                         &TestDlOfdmaPhyTransmission::CheckPhyState,
                         this,
                         m_phySta1,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(5.0) + m_expectedPpduDuration,
+    Simulator::Schedule(Seconds(5) + m_expectedPpduDuration,
                         &TestDlOfdmaPhyTransmission::CheckPhyState,
                         this,
                         m_phySta2,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(5.0) + m_expectedPpduDuration,
+    Simulator::Schedule(Seconds(5) + m_expectedPpduDuration,
                         &TestDlOfdmaPhyTransmission::CheckPhyState,
                         this,
                         m_phySta3,
@@ -1149,23 +1152,23 @@
 void
 TestDlOfdmaPhyTransmission::DoRun()
 {
-    m_frequency = 5180;
-    m_channelWidth = 20;
+    m_frequency = MHz_u{5180};
+    m_channelWidth = MHz_u{20};
     m_expectedPpduDuration = NanoSeconds(306400);
     RunOne();
 
-    m_frequency = 5190;
-    m_channelWidth = 40;
+    m_frequency = MHz_u{5190};
+    m_channelWidth = MHz_u{40};
     m_expectedPpduDuration = NanoSeconds(156800);
     RunOne();
 
-    m_frequency = 5210;
-    m_channelWidth = 80;
+    m_frequency = MHz_u{5210};
+    m_channelWidth = MHz_u{80};
     m_expectedPpduDuration = NanoSeconds(102400);
     RunOne();
 
-    m_frequency = 5250;
-    m_channelWidth = 160;
+    m_frequency = MHz_u{5250};
+    m_channelWidth = MHz_u{160};
     m_expectedPpduDuration = NanoSeconds(75200);
     RunOne();
 
@@ -1173,10 +1176,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief DL-OFDMA PHY puncturing test
+ * @brief DL-OFDMA PHY puncturing test
  */
 class TestDlOfdmaPhyPuncturing : public TestCase
 {
@@ -1190,45 +1193,45 @@
 
     /**
      * Receive success function for STA 1
-     * \param psdu the PSDU
-     * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
-     * \param txVector the transmit vector
-     * \param statusPerMpdu reception status per MPDU
+     * @param psdu the PSDU
+     * @param rxSignalInfo the info on the received signal (\see RxSignalInfo)
+     * @param txVector the transmit vector
+     * @param statusPerMpdu reception status per MPDU
      */
     void RxSuccessSta1(Ptr<const WifiPsdu> psdu,
                        RxSignalInfo rxSignalInfo,
-                       WifiTxVector txVector,
-                       const std::vector<bool> statusPerMpdu);
+                       const WifiTxVector& txVector,
+                       const std::vector<bool>& statusPerMpdu);
 
     /**
      * Receive success function for STA 2
-     * \param psdu the PSDU
-     * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
-     * \param txVector the transmit vector
-     * \param statusPerMpdu reception status per MPDU
+     * @param psdu the PSDU
+     * @param rxSignalInfo the info on the received signal (\see RxSignalInfo)
+     * @param txVector the transmit vector
+     * @param statusPerMpdu reception status per MPDU
      */
     void RxSuccessSta2(Ptr<const WifiPsdu> psdu,
                        RxSignalInfo rxSignalInfo,
-                       WifiTxVector txVector,
-                       std::vector<bool> statusPerMpdu);
+                       const WifiTxVector& txVector,
+                       const std::vector<bool>& statusPerMpdu);
 
     /**
      * Receive failure function for STA 1
-     * \param psdu the PSDU
+     * @param psdu the PSDU
      */
     void RxFailureSta1(Ptr<const WifiPsdu> psdu);
 
     /**
      * Receive failure function for STA 2
-     * \param psdu the PSDU
+     * @param psdu the PSDU
      */
     void RxFailureSta2(Ptr<const WifiPsdu> psdu);
 
     /**
      * Check the results for STA 1
-     * \param expectedRxSuccess the expected number of RX success
-     * \param expectedRxFailure the expected number of RX failures
-     * \param expectedRxBytes the expected number of RX bytes
+     * @param expectedRxSuccess the expected number of RX success
+     * @param expectedRxFailure the expected number of RX failures
+     * @param expectedRxBytes the expected number of RX bytes
      */
     void CheckResultsSta1(uint32_t expectedRxSuccess,
                           uint32_t expectedRxFailure,
@@ -1236,9 +1239,9 @@
 
     /**
      * Check the results for STA 2
-     * \param expectedRxSuccess the expected number of RX success
-     * \param expectedRxFailure the expected number of RX failures
-     * \param expectedRxBytes the expected number of RX bytes
+     * @param expectedRxSuccess the expected number of RX success
+     * @param expectedRxFailure the expected number of RX failures
+     * @param expectedRxBytes the expected number of RX bytes
      */
     void CheckResultsSta2(uint32_t expectedRxSuccess,
                           uint32_t expectedRxFailure,
@@ -1251,9 +1254,9 @@
 
     /**
      * Send MU-PPDU function
-     * \param rxStaId1 the ID of the recipient STA for the first PSDU
-     * \param rxStaId2 the ID of the recipient STA for the second PSDU
-     * \param puncturedSubchannels indicates for each subchannel whether it is punctured or not. if
+     * @param rxStaId1 the ID of the recipient STA for the first PSDU
+     * @param rxStaId2 the ID of the recipient STA for the second PSDU
+     * @param puncturedSubchannels indicates for each subchannel whether it is punctured or not. if
      * empty, preamble puncturing is not used.
      */
     void SendMuPpdu(uint16_t rxStaId1,
@@ -1262,8 +1265,8 @@
 
     /**
      * Generate interference function
-     * \param interferencePsd the PSD of the interference to be generated
-     * \param duration the duration of the interference
+     * @param interferencePsd the PSD of the interference to be generated
+     * @param duration the duration of the interference
      */
     void GenerateInterference(Ptr<SpectrumValue> interferencePsd, Time duration);
 
@@ -1279,15 +1282,15 @@
 
     /**
      * Schedule now to check  the PHY state
-     * \param phy the PHY
-     * \param expectedState the expected state of the PHY
+     * @param phy the PHY
+     * @param expectedState the expected state of the PHY
      */
     void CheckPhyState(Ptr<OfdmaSpectrumWifiPhy> phy, WifiPhyState expectedState);
 
     /**
      * Check the PHY state now
-     * \param phy the PHY
-     * \param expectedState the expected state of the PHY
+     * @param phy the PHY
+     * @param expectedState the expected state of the PHY
      */
     void DoCheckPhyState(Ptr<OfdmaSpectrumWifiPhy> phy, WifiPhyState expectedState);
 
@@ -1321,8 +1324,8 @@
       m_countRxFailureSta2(0),
       m_countRxBytesSta1(0),
       m_countRxBytesSta2(0),
-      m_frequency(5210),
-      m_channelWidth(80),
+      m_frequency(MHz_u{5210}),
+      m_channelWidth(MHz_u{80}),
       m_indexSubchannel(0),
       m_expectedPpduDuration20Mhz(NanoSeconds(156800)),
       m_expectedPpduDuration40Mhz(NanoSeconds(102400))
@@ -1377,7 +1380,7 @@
     txVector.SetMode(HePhy::GetHeMcs9(), rxStaId2);
     txVector.SetNss(1, rxStaId2);
 
-    std::vector<uint8_t> ruAlloc;
+    RuAllocation ruAlloc;
     if (puncturedSubchannels.empty())
     {
         std::fill_n(std::back_inserter(ruAlloc), 4, 200);
@@ -1441,8 +1444,8 @@
 void
 TestDlOfdmaPhyPuncturing::RxSuccessSta1(Ptr<const WifiPsdu> psdu,
                                         RxSignalInfo rxSignalInfo,
-                                        WifiTxVector txVector,
-                                        std::vector<bool> /*statusPerMpdu*/)
+                                        const WifiTxVector& txVector,
+                                        const std::vector<bool>& /*statusPerMpdu*/)
 {
     NS_LOG_FUNCTION(this << *psdu << rxSignalInfo << txVector);
     m_countRxSuccessSta1++;
@@ -1452,8 +1455,8 @@
 void
 TestDlOfdmaPhyPuncturing::RxSuccessSta2(Ptr<const WifiPsdu> psdu,
                                         RxSignalInfo rxSignalInfo,
-                                        WifiTxVector txVector,
-                                        std::vector<bool> /*statusPerMpdu*/)
+                                        const WifiTxVector& txVector,
+                                        const std::vector<bool>& /*statusPerMpdu*/)
 {
     NS_LOG_FUNCTION(this << *psdu << rxSignalInfo << txVector);
     m_countRxSuccessSta2++;
@@ -1534,7 +1537,7 @@
 {
     Ptr<MultiModelSpectrumChannel> spectrumChannel = CreateObject<MultiModelSpectrumChannel>();
     Ptr<FriisPropagationLossModel> lossModel = CreateObject<FriisPropagationLossModel>();
-    lossModel->SetFrequency(m_frequency * 1e6);
+    lossModel->SetFrequency(MHzToHz(m_frequency));
     spectrumChannel->AddPropagationLossModel(lossModel);
     Ptr<ConstantSpeedPropagationDelayModel> delayModel =
         CreateObject<ConstantSpeedPropagationDelayModel>();
@@ -1643,11 +1646,11 @@
     // A strong non-wifi interference is generated on selected 20 MHz subchannel for the whole
     // duration of the test run
     BandInfo bandInfo;
-    bandInfo.fc = (m_frequency - (m_channelWidth / 2) + 10 + (m_indexSubchannel * 20)) * 1e6;
+    bandInfo.fc = MHzToHz(m_frequency - (m_channelWidth / 2) + 10 + (m_indexSubchannel * 20));
     // Occupy half of the RU to make sure we do not have some power allocated to the subcarriers on
     // the border of another RU
-    bandInfo.fl = bandInfo.fc - (5 * 1e6);
-    bandInfo.fh = bandInfo.fc + (5 * 1e6);
+    bandInfo.fl = bandInfo.fc - MHzToHz(5);
+    bandInfo.fh = bandInfo.fc + MHzToHz(5);
     Bands bands;
     bands.push_back(bandInfo);
 
@@ -1656,7 +1659,7 @@
     Watt_u interferencePower{0.1};
     *interferencePsd = interferencePower / 10e6;
 
-    Simulator::Schedule(Seconds(0.0),
+    Simulator::Schedule(Seconds(0),
                         &TestDlOfdmaPhyPuncturing::GenerateInterference,
                         this,
                         interferencePsd,
@@ -1664,7 +1667,7 @@
 
     //---------------------------------------------------------------------------
     // Send MU PPDU with two PSDUs addressed to STA 1 and STA 2 without preamble puncturing:
-    Simulator::Schedule(Seconds(1.0),
+    Simulator::Schedule(Seconds(1),
                         &TestDlOfdmaPhyPuncturing::SendMuPpdu,
                         this,
                         1,
@@ -1673,22 +1676,22 @@
 
     // Since it takes m_expectedPpduDuration to transmit the PPDU,
     // both PHYs should be back to IDLE at the same time.
-    Simulator::Schedule(Seconds(1.0) + m_expectedPpduDuration40Mhz - NanoSeconds(1),
+    Simulator::Schedule(Seconds(1) + m_expectedPpduDuration40Mhz - NanoSeconds(1),
                         &TestDlOfdmaPhyPuncturing::CheckPhyState,
                         this,
                         m_phySta1,
                         WifiPhyState::RX);
-    Simulator::Schedule(Seconds(1.0) + m_expectedPpduDuration40Mhz - NanoSeconds(1),
+    Simulator::Schedule(Seconds(1) + m_expectedPpduDuration40Mhz - NanoSeconds(1),
                         &TestDlOfdmaPhyPuncturing::CheckPhyState,
                         this,
                         m_phySta2,
                         WifiPhyState::RX);
-    Simulator::Schedule(Seconds(1.0) + m_expectedPpduDuration40Mhz,
+    Simulator::Schedule(Seconds(1) + m_expectedPpduDuration40Mhz,
                         &TestDlOfdmaPhyPuncturing::CheckPhyState,
                         this,
                         m_phySta1,
                         WifiPhyState::IDLE);
-    Simulator::Schedule(Seconds(1.0) + m_expectedPpduDuration40Mhz,
+    Simulator::Schedule(Seconds(1) + m_expectedPpduDuration40Mhz,
                         &TestDlOfdmaPhyPuncturing::CheckPhyState,
                         this,
                         m_phySta2,
@@ -1735,7 +1738,7 @@
     // Send MU PPDU with two PSDUs addressed to STA 1 and STA 2 with preamble puncturing:
     // the punctured 20 MHz subchannel is the one that has interference
     std::vector<bool> puncturedSubchannels;
-    const std::size_t num20MhzSubchannels = m_channelWidth / 20;
+    const auto num20MhzSubchannels = Count20MHzSubchannels(m_channelWidth);
     for (std::size_t i = 0; i < num20MhzSubchannels; ++i)
     {
         if (i == m_indexSubchannel)
@@ -1747,7 +1750,7 @@
             puncturedSubchannels.push_back(false);
         }
     }
-    Simulator::Schedule(Seconds(2.0),
+    Simulator::Schedule(Seconds(2),
                         &TestDlOfdmaPhyPuncturing::SendMuPpdu,
                         this,
                         1,
@@ -1756,22 +1759,22 @@
 
     // Since it takes m_expectedPpduDuration to transmit the PPDU,
     // both PHYs should be back to IDLE at the same time.
-    Simulator::Schedule(Seconds(2.0) + m_expectedPpduDuration20Mhz - NanoSeconds(1),
+    Simulator::Schedule(Seconds(2) + m_expectedPpduDuration20Mhz - NanoSeconds(1),
                         &TestDlOfdmaPhyPuncturing::CheckPhyState,
                         this,
                         m_phySta1,
                         WifiPhyState::RX);
-    Simulator::Schedule(Seconds(2.0) + m_expectedPpduDuration20Mhz - NanoSeconds(1),
+    Simulator::Schedule(Seconds(2) + m_expectedPpduDuration20Mhz - NanoSeconds(1),
                         &TestDlOfdmaPhyPuncturing::CheckPhyState,
                         this,
                         m_phySta2,
                         WifiPhyState::RX);
-    Simulator::Schedule(Seconds(2.0) + m_expectedPpduDuration20Mhz,
+    Simulator::Schedule(Seconds(2) + m_expectedPpduDuration20Mhz,
                         &TestDlOfdmaPhyPuncturing::CheckPhyState,
                         this,
                         m_phySta1,
                         WifiPhyState::IDLE);
-    Simulator::Schedule(Seconds(2.0) + m_expectedPpduDuration20Mhz,
+    Simulator::Schedule(Seconds(2) + m_expectedPpduDuration20Mhz,
                         &TestDlOfdmaPhyPuncturing::CheckPhyState,
                         this,
                         m_phySta2,
@@ -1811,10 +1814,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief UL-OFDMA PPDU UID attribution test
+ * @brief UL-OFDMA PPDU UID attribution test
  */
 class TestUlOfdmaPpduUid : public TestCase
 {
@@ -1829,17 +1832,17 @@
 
     /**
      * Transmitted PPDU information function for AP
-     * \param uid the UID of the transmitted PPDU
+     * @param uid the UID of the transmitted PPDU
      */
     void TxPpduAp(uint64_t uid);
     /**
      * Transmitted PPDU information function for STA 1
-     * \param uid the UID of the transmitted PPDU
+     * @param uid the UID of the transmitted PPDU
      */
     void TxPpduSta1(uint64_t uid);
     /**
      * Transmitted PPDU information function for STA 2
-     * \param uid the UID of the transmitted PPDU
+     * @param uid the UID of the transmitted PPDU
      */
     void TxPpduSta2(uint64_t uid);
     /**
@@ -1857,14 +1860,14 @@
     void SendTbPpdu();
     /**
      * Send SU-PPDU function
-     * \param txStaId the ID of the sending STA
+     * @param txStaId the ID of the sending STA
      */
     void SendSuPpdu(uint16_t txStaId);
 
     /**
      * Check the UID of the transmitted PPDU
-     * \param staId the STA-ID of the PHY (0 for AP)
-     * \param expectedUid the expected UID
+     * @param staId the STA-ID of the PHY (0 for AP)
+     * @param expectedUid the expected UID
      */
     void CheckUid(uint16_t staId, uint64_t expectedUid);
 
@@ -2141,14 +2144,14 @@
     auto psdu2 = Create<WifiPsdu>(pkt2, hdr2);
     psdus2.insert(std::make_pair(rxStaId2, psdu2));
 
-    const auto txDuration1 = m_phySta1->CalculateTxDuration(psdu1->GetSize(),
-                                                            txVector1,
-                                                            m_phySta1->GetPhyBand(),
-                                                            rxStaId1);
-    const auto txDuration2 = m_phySta2->CalculateTxDuration(psdu2->GetSize(),
-                                                            txVector2,
-                                                            m_phySta1->GetPhyBand(),
-                                                            rxStaId2);
+    const auto txDuration1 = OfdmaSpectrumWifiPhy::CalculateTxDuration(psdu1->GetSize(),
+                                                                       txVector1,
+                                                                       m_phySta1->GetPhyBand(),
+                                                                       rxStaId1);
+    const auto txDuration2 = OfdmaSpectrumWifiPhy::CalculateTxDuration(psdu2->GetSize(),
+                                                                       txVector2,
+                                                                       m_phySta1->GetPhyBand(),
+                                                                       rxStaId2);
     const auto txDuration = std::max(txDuration1, txDuration2);
 
     txVector1.SetLength(
@@ -2221,8 +2224,8 @@
 
     // Send HE MU PPDU with two PSDUs addressed to STA 1 and STA 2.
     // PPDU UID should be equal to 0 (the first counter value).
-    Simulator::Schedule(Seconds(1.0), &TestUlOfdmaPpduUid::SendMuPpdu, this);
-    Simulator::Schedule(Seconds(1.0), &TestUlOfdmaPpduUid::CheckUid, this, 0, 0);
+    Simulator::Schedule(Seconds(1), &TestUlOfdmaPpduUid::SendMuPpdu, this);
+    Simulator::Schedule(Seconds(1), &TestUlOfdmaPpduUid::CheckUid, this, 0, 0);
 
     // Send HE SU PPDU from AP.
     // PPDU UID should be incremented since this is a new PPDU.
@@ -2246,10 +2249,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief UL-OFDMA multiple RX events test
+ * @brief UL-OFDMA multiple RX events test
  */
 class TestMultipleHeTbPreambles : public TestCase
 {
@@ -2265,11 +2268,11 @@
     /**
      * Receive HE TB PPDU function.
      *
-     * \param uid the UID used to identify a set of HE TB PPDUs belonging to the same UL-MU
+     * @param uid the UID used to identify a set of HE TB PPDUs belonging to the same UL-MU
      * transmission
-     * \param staId the STA ID
-     * \param txPower the TX power
-     * \param payloadSize the size of the payload in bytes
+     * @param staId the STA ID
+     * @param txPower the TX power
+     * @param payloadSize the size of the payload in bytes
      */
     void RxHeTbPpdu(uint64_t uid, uint16_t staId, Watt_u txPower, size_t payloadSize);
 
@@ -2277,21 +2280,21 @@
      * Receive OFDMA part of HE TB PPDU function.
      * Immediately schedules DoRxHeTbPpduOfdmaPart.
      *
-     * \param rxParamsOfdma the spectrum signal parameters to send for OFDMA part
+     * @param rxParamsOfdma the spectrum signal parameters to send for OFDMA part
      */
     void RxHeTbPpduOfdmaPart(Ptr<WifiSpectrumSignalParameters> rxParamsOfdma);
     /**
      * Receive OFDMA part of HE TB PPDU function.
      * Actual reception call.
      *
-     * \param rxParamsOfdma the spectrum signal parameters to send for OFDMA part
+     * @param rxParamsOfdma the spectrum signal parameters to send for OFDMA part
      */
     void DoRxHeTbPpduOfdmaPart(Ptr<WifiSpectrumSignalParameters> rxParamsOfdma);
 
     /**
      * RX dropped function
-     * \param p the packet
-     * \param reason the reason
+     * @param p the packet
+     * @param reason the reason
      */
     void RxDropped(Ptr<const Packet> p, WifiPhyRxfailureReason reason);
 
@@ -2302,14 +2305,14 @@
 
     /**
      * Check the received HE TB preambles
-     * \param nEvents the number of events created by the PHY
-     * \param uids the vector of expected UIDs
+     * @param nEvents the number of events created by the PHY
+     * @param uids the vector of expected UIDs
      */
     void CheckHeTbPreambles(size_t nEvents, std::vector<uint64_t> uids);
 
     /**
      * Check the number of bytes dropped
-     * \param expectedBytesDropped the expected number of bytes dropped
+     * @param expectedBytesDropped the expected number of bytes dropped
      */
     void CheckBytesDropped(size_t expectedBytesDropped);
 
@@ -2414,8 +2417,10 @@
     auto psdu = Create<WifiPsdu>(pkt, hdr);
     psdus.insert(std::make_pair(staId, psdu));
 
-    auto ppduDuration =
-        m_phy->CalculateTxDuration(psdu->GetSize(), txVector, m_phy->GetPhyBand(), staId);
+    auto ppduDuration = OfdmaSpectrumWifiPhy::CalculateTxDuration(psdu->GetSize(),
+                                                                  txVector,
+                                                                  m_phy->GetPhyBand(),
+                                                                  staId);
     auto ppdu = Create<HePpdu>(psdus,
                                txVector,
                                m_phy->GetOperatingChannel(),
@@ -2428,7 +2433,7 @@
     const auto centerFrequency =
         m_phy->GetHePhy()->GetCenterFrequenciesForNonHePart(ppdu, staId).front();
     MHz_u ruWidth = HeRu::GetBandwidth(txVector.GetRu(staId).GetRuType());
-    MHz_u channelWidth = ruWidth < 20 ? 20 : ruWidth;
+    MHz_u channelWidth = ruWidth < MHz_u{20} ? MHz_u{20} : ruWidth;
     Ptr<SpectrumValue> rxPsd = WifiSpectrumValueHelper::CreateHeOfdmTxPowerSpectralDensity(
         centerFrequency,
         channelWidth,
@@ -2518,7 +2523,7 @@
     preambleDetectionModel->SetAttribute("MinimumRssi", DoubleValue(-82));
     m_phy->SetPreambleDetectionModel(preambleDetectionModel);
     Ptr<HeConfiguration> heConfiguration = CreateObject<HeConfiguration>();
-    heConfiguration->SetMaxTbPpduDelay(NanoSeconds(400));
+    heConfiguration->m_maxTbPpduDelay = NanoSeconds(400);
     dev->SetHeConfiguration(heConfiguration);
     dev->SetPhy(m_phy);
     node->AddDevice(dev);
@@ -2559,7 +2564,7 @@
                             txPower,
                             1002);
         // Check that we received a single UL MU transmission with the corresponding UID
-        Simulator::Schedule(Seconds(1.0) + MicroSeconds(1),
+        Simulator::Schedule(Seconds(1) + MicroSeconds(1),
                             &TestMultipleHeTbPreambles::CheckHeTbPreambles,
                             this,
                             1,
@@ -2602,7 +2607,7 @@
                             1004);
         // Check that we received the correct reception of 2 UL MU transmissions with the
         // corresponding UIDs
-        Simulator::Schedule(Seconds(2.0) + MicroSeconds(1),
+        Simulator::Schedule(Seconds(2) + MicroSeconds(1),
                             &TestMultipleHeTbPreambles::CheckHeTbPreambles,
                             this,
                             2,
@@ -2646,7 +2651,7 @@
                             1004);
         // Check that we received the correct reception of 2 UL MU transmissions with the
         // corresponding UIDs
-        Simulator::Schedule(Seconds(3.0) + MicroSeconds(1),
+        Simulator::Schedule(Seconds(3) + MicroSeconds(1),
                             &TestMultipleHeTbPreambles::CheckHeTbPreambles,
                             this,
                             2,
@@ -2690,13 +2695,13 @@
                             1004);
         // Check that we received the correct reception of the first UL MU transmission with the
         // corresponding UID (second one dropped)
-        Simulator::Schedule(Seconds(4.0) + MicroSeconds(10),
+        Simulator::Schedule(Seconds(4) + MicroSeconds(10),
                             &TestMultipleHeTbPreambles::CheckHeTbPreambles,
                             this,
                             1,
                             std::vector<uint64_t>{uids[0]});
         // The packets of the second UL MU transmission should have been dropped
-        Simulator::Schedule(Seconds(4.0) + MicroSeconds(10),
+        Simulator::Schedule(Seconds(4) + MicroSeconds(10),
                             &TestMultipleHeTbPreambles::CheckBytesDropped,
                             this,
                             1003 + 1004);
@@ -2738,13 +2743,13 @@
                             1004);
         // Check that we received the correct reception of the first UL MU transmission with the
         // corresponding UID (second one dropped)
-        Simulator::Schedule(Seconds(5.0) + MicroSeconds(100),
+        Simulator::Schedule(Seconds(5) + MicroSeconds(100),
                             &TestMultipleHeTbPreambles::CheckHeTbPreambles,
                             this,
                             1,
                             std::vector<uint64_t>{uids[0]});
         // The packets of the second UL MU transmission should have been dropped
-        Simulator::Schedule(Seconds(5.0) + MicroSeconds(100),
+        Simulator::Schedule(Seconds(5) + MicroSeconds(100),
                             &TestMultipleHeTbPreambles::CheckBytesDropped,
                             this,
                             1003 + 1004);
@@ -2771,7 +2776,7 @@
                             txPower,
                             1002);
         // Check that we received a single UL MU transmission with the corresponding UID
-        Simulator::Schedule(Seconds(6.0) + MicroSeconds(1),
+        Simulator::Schedule(Seconds(6) + MicroSeconds(1),
                             &TestMultipleHeTbPreambles::CheckHeTbPreambles,
                             this,
                             1,
@@ -2780,7 +2785,7 @@
         // 4us (because the PPDU that arrived at 500ns is interfering): the second HE TB PPDU is
         // acting as interference since it arrived after the maximum allowed 400ns. Obviously, that
         // second packet of 1002 bytes is dropped as well.
-        Simulator::Schedule(Seconds(6.0) + MicroSeconds(5),
+        Simulator::Schedule(Seconds(6) + MicroSeconds(5),
                             &TestMultipleHeTbPreambles::CheckBytesDropped,
                             this,
                             1001 + 1002);
@@ -2792,10 +2797,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief PHY listener for OFDMA tests
+ * @brief PHY listener for OFDMA tests
  */
 class OfdmaTestPhyListener : public ns3::WifiPhyListener
 {
@@ -2872,7 +2877,7 @@
 
     /**
      * Return the number of RX start notifications that has been received since the last reset.
-     * \return the number of RX start notifications that has been received
+     * @return the number of RX start notifications that has been received
      */
     uint32_t GetNumRxStartNotifications() const
     {
@@ -2881,7 +2886,7 @@
 
     /**
      * Return the number of RX end notifications that has been received since the last reset.
-     * \return the number of RX end notifications that has been received
+     * @return the number of RX end notifications that has been received
      */
     uint32_t GetNumRxEndNotifications() const
     {
@@ -2890,7 +2895,7 @@
 
     /**
      * Return the time at which the last RX start notification has been received.
-     * \return the time at which the last RX start notification has been received
+     * @return the time at which the last RX start notification has been received
      */
     Time GetLastRxStartNotification() const
     {
@@ -2899,7 +2904,7 @@
 
     /**
      * Return the time at which the last RX end notification has been received.
-     * \return the time at which the last RX end notification has been received
+     * @return the time at which the last RX end notification has been received
      */
     Time GetLastRxEndNotification() const
     {
@@ -2908,7 +2913,7 @@
 
     /**
      * Return whether last RX has been successful.
-     * \return true if last RX has been successful, false otherwise
+     * @return true if last RX has been successful, false otherwise
      */
     bool IsLastRxSuccess() const
     {
@@ -2924,10 +2929,10 @@
 };
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief UL-OFDMA PHY test
+ * @brief UL-OFDMA PHY test
  */
 class TestUlOfdmaPhyTransmission : public TestCase
 {
@@ -2953,10 +2958,10 @@
 
     /**
      * Get TXVECTOR for HE TB PPDU.
-     * \param txStaId the ID of the TX STA
-     * \param index the RU index used for the transmission
-     * \param bssColor the BSS color of the TX STA
-     * \return the TXVECTOR for HE TB PPDU
+     * @param txStaId the ID of the TX STA
+     * @param index the RU index used for the transmission
+     * @param bssColor the BSS color of the TX STA
+     * @return the TXVECTOR for HE TB PPDU
      */
     WifiTxVector GetTxVectorForHeTbPpdu(uint16_t txStaId,
                                         std::size_t index,
@@ -2964,18 +2969,18 @@
     /**
      * Set TRIGVECTOR for HE TB PPDU
      *
-     * \param bssColor the BSS color of the TX STA
-     * \param error the erroneous info (if any) in the TRIGVECTOR to set
+     * @param bssColor the BSS color of the TX STA
+     * @param error the erroneous info (if any) in the TRIGVECTOR to set
      */
     void SetTrigVector(uint8_t bssColor, TrigVectorInfo error);
     /**
      * Send HE TB PPDU function
-     * \param txStaId the ID of the TX STA
-     * \param index the RU index used for the transmission
-     * \param payloadSize the size of the payload in bytes
-     * \param uid the UID of the trigger frame that is initiating this transmission
-     * \param bssColor the BSS color of the TX STA
-     * \param incrementUid whether UID shall be incremented
+     * @param txStaId the ID of the TX STA
+     * @param index the RU index used for the transmission
+     * @param payloadSize the size of the payload in bytes
+     * @param uid the UID of the trigger frame that is initiating this transmission
+     * @param bssColor the BSS color of the TX STA
+     * @param incrementUid whether UID shall be incremented
      */
     void SendHeTbPpdu(uint16_t txStaId,
                       std::size_t index,
@@ -2986,31 +2991,31 @@
 
     /**
      * Send HE SU PPDU function
-     * \param txStaId the ID of the TX STA
-     * \param payloadSize the size of the payload in bytes
-     * \param uid the UID of the trigger frame that is initiating this transmission
-     * \param bssColor the BSS color of the TX STA
+     * @param txStaId the ID of the TX STA
+     * @param payloadSize the size of the payload in bytes
+     * @param uid the UID of the trigger frame that is initiating this transmission
+     * @param bssColor the BSS color of the TX STA
      */
     void SendHeSuPpdu(uint16_t txStaId, std::size_t payloadSize, uint64_t uid, uint8_t bssColor);
 
     /**
      * Set the BSS color
-     * \param phy the PHY
-     * \param bssColor the BSS color
+     * @param phy the PHY
+     * @param bssColor the BSS color
      */
     void SetBssColor(Ptr<WifiPhy> phy, uint8_t bssColor);
 
     /**
      * Set the PSD limit
-     * \param phy the PHY
-     * \param psdLimit the PSD limit
+     * @param phy the PHY
+     * @param psdLimit the PSD limit
      */
     void SetPsdLimit(Ptr<WifiPhy> phy, dBm_per_MHz_u psdLimit);
 
     /**
      * Generate interference function
-     * \param interferencePsd the PSD of the interference to be generated
-     * \param duration the duration of the interference
+     * @param interferencePsd the PSD of the interference to be generated
+     * @param duration the duration of the interference
      */
     void GenerateInterference(Ptr<SpectrumValue> interferencePsd, Time duration);
     /**
@@ -3025,9 +3030,9 @@
 
     /**
      * Check the received PSDUs from STA1
-     * \param expectedSuccess the expected number of success
-     * \param expectedFailures the expected number of failures
-     * \param expectedBytes the expected number of bytes
+     * @param expectedSuccess the expected number of success
+     * @param expectedFailures the expected number of failures
+     * @param expectedBytes the expected number of bytes
      */
     void CheckRxFromSta1(uint32_t expectedSuccess,
                          uint32_t expectedFailures,
@@ -3035,9 +3040,9 @@
 
     /**
      * Check the received PSDUs from STA2
-     * \param expectedSuccess the expected number of success
-     * \param expectedFailures the expected number of failures
-     * \param expectedBytes the expected number of bytes
+     * @param expectedSuccess the expected number of success
+     * @param expectedFailures the expected number of failures
+     * @param expectedBytes the expected number of bytes
      */
     void CheckRxFromSta2(uint32_t expectedSuccess,
                          uint32_t expectedFailures,
@@ -3045,18 +3050,18 @@
 
     /**
      * Check the received power for the non-OFDMA of the HE TB PPDUs over the given band
-     * \param phy the PHY
-     * \param band the indices of the band over which the power is measured
-     * \param expectedRxPower the expected received power
+     * @param phy the PHY
+     * @param band the indices of the band over which the power is measured
+     * @param expectedRxPower the expected received power
      */
     void CheckNonOfdmaRxPower(Ptr<OfdmaSpectrumWifiPhy> phy,
                               WifiSpectrumBandInfo band,
                               Watt_u expectedRxPower);
     /**
      * Check the received power for the OFDMA part of the HE TB PPDUs over the given band
-     * \param phy the PHY
-     * \param band the indices of the band over which the power is measured
-     * \param expectedRxPower the expected received power
+     * @param phy the PHY
+     * @param band the indices of the band over which the power is measured
+     * @param expectedRxPower the expected received power
      */
     void CheckOfdmaRxPower(Ptr<OfdmaSpectrumWifiPhy> phy,
                            WifiSpectrumBandInfo band,
@@ -3069,26 +3074,26 @@
 
     /**
      * Check the PHY state
-     * \param phy the PHY
-     * \param expectedState the expected state of the PHY
+     * @param phy the PHY
+     * @param expectedState the expected state of the PHY
      */
     void CheckPhyState(Ptr<OfdmaSpectrumWifiPhy> phy, WifiPhyState expectedState);
-    /// \copydoc CheckPhyState
+    /// @copydoc CheckPhyState
     void DoCheckPhyState(Ptr<OfdmaSpectrumWifiPhy> phy, WifiPhyState expectedState);
 
     /**
      * Check the the number of RX start notifications at the AP as well as the last time a RX start
      * has been notified
-     * \param expectedNotifications the expected number of RX start notifications at the AP
-     * \param expectedLastNotification the expected time of the last RX start notification at the AP
+     * @param expectedNotifications the expected number of RX start notifications at the AP
+     * @param expectedLastNotification the expected time of the last RX start notification at the AP
      */
     void CheckApRxStart(uint32_t expectedNotifications, Time expectedLastNotification);
     /**
      * Check the the number of RX end notifications at the AP as well as the last time a RX end has
      * been notified
-     * \param expectedNotifications the expected number of RX end notifications at the AP
-     * \param expectedLastNotification the expected time of the last RX end notification at the AP
-     * \param expectedSuccess true if the last RX notification indicates a success, false otherwise
+     * @param expectedNotifications the expected number of RX end notifications at the AP
+     * @param expectedLastNotification the expected time of the last RX end notification at the AP
+     * @param expectedSuccess true if the last RX notification indicates a success, false otherwise
      */
     void CheckApRxEnd(uint32_t expectedNotifications,
                       Time expectedLastNotification,
@@ -3101,19 +3106,19 @@
 
     /**
      * Receive success function
-     * \param psdu the PSDU
-     * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
-     * \param txVector the transmit vector
-     * \param statusPerMpdu reception status per MPDU
+     * @param psdu the PSDU
+     * @param rxSignalInfo the info on the received signal (\see RxSignalInfo)
+     * @param txVector the transmit vector
+     * @param statusPerMpdu reception status per MPDU
      */
     void RxSuccess(Ptr<const WifiPsdu> psdu,
                    RxSignalInfo rxSignalInfo,
-                   WifiTxVector txVector,
-                   std::vector<bool> statusPerMpdu);
+                   const WifiTxVector& txVector,
+                   const std::vector<bool>& statusPerMpdu);
 
     /**
      * Receive failure function
-     * \param psdu the PSDU
+     * @param psdu the PSDU
      */
     void RxFailure(Ptr<const WifiPsdu> psdu);
 
@@ -3121,21 +3126,21 @@
      * Schedule test to perform.
      * The interference generation should be scheduled apart.
      *
-     * \param delay the reference delay to schedule the events
-     * \param solicited flag indicating if HE TB PPDUs were solicited by the AP
-     * \param expectedStateAtEnd the expected state of the PHY at the end of the reception
-     * \param expectedSuccessFromSta1 the expected number of success from STA 1
-     * \param expectedFailuresFromSta1 the expected number of failures from STA 1
-     * \param expectedBytesFromSta1 the expected number of bytes from STA 1
-     * \param expectedSuccessFromSta2 the expected number of success from STA 2
-     * \param expectedFailuresFromSta2 the expected number of failures from STA 2
-     * \param expectedBytesFromSta2 the expected number of bytes from STA 2
-     * \param scheduleTxSta1 flag indicating to schedule a HE TB PPDU from STA 1
-     * \param ulTimeDifference delay between HE TB PPDU from STA 1 and HE TB PPDU from STA 2
+     * @param delay the reference delay to schedule the events
+     * @param solicited flag indicating if HE TB PPDUs were solicited by the AP
+     * @param expectedStateAtEnd the expected state of the PHY at the end of the reception
+     * @param expectedSuccessFromSta1 the expected number of success from STA 1
+     * @param expectedFailuresFromSta1 the expected number of failures from STA 1
+     * @param expectedBytesFromSta1 the expected number of bytes from STA 1
+     * @param expectedSuccessFromSta2 the expected number of success from STA 2
+     * @param expectedFailuresFromSta2 the expected number of failures from STA 2
+     * @param expectedBytesFromSta2 the expected number of bytes from STA 2
+     * @param scheduleTxSta1 flag indicating to schedule a HE TB PPDU from STA 1
+     * @param ulTimeDifference delay between HE TB PPDU from STA 1 and HE TB PPDU from STA 2
      * are received
-     * \param expectedStateBeforeEnd the expected state of the PHY before the end of the
+     * @param expectedStateBeforeEnd the expected state of the PHY before the end of the
      * transmission
-     * \param error the erroneous info (if any) in the TRIGVECTOR to set
+     * @param error the erroneous info (if any) in the TRIGVECTOR to set
      */
     void ScheduleTest(Time delay,
                       bool solicited,
@@ -3154,11 +3159,11 @@
     /**
      * Schedule power measurement related checks.
      *
-     * \param delay the reference delay used to schedule the events
-     * \param rxPowerNonOfdmaRu1 the received power on the non-OFDMA part of RU1
-     * \param rxPowerNonOfdmaRu2 the received power on the non-OFDMA part of RU2
-     * \param rxPowerOfdmaRu1 the received power on RU1
-     * \param rxPowerOfdmaRu2 the received power on RU2
+     * @param delay the reference delay used to schedule the events
+     * @param rxPowerNonOfdmaRu1 the received power on the non-OFDMA part of RU1
+     * @param rxPowerNonOfdmaRu2 the received power on the non-OFDMA part of RU2
+     * @param rxPowerOfdmaRu1 the received power on RU1
+     * @param rxPowerOfdmaRu2 the received power on RU2
      */
     void SchedulePowerMeasurementChecks(Time delay,
                                         Watt_u rxPowerNonOfdmaRu1,
@@ -3168,7 +3173,7 @@
     /**
      * Log scenario description
      *
-     * \param log the scenario description to add to log
+     * @param log the scenario description to add to log
      */
     void LogScenario(std::string log) const;
 
@@ -3282,19 +3287,19 @@
                           bssColor};
 
     auto ruType = HeRu::RU_106_TONE;
-    if (m_channelWidth == 20)
+    if (m_channelWidth == MHz_u{20})
     {
         ruType = HeRu::RU_106_TONE;
     }
-    else if (m_channelWidth == 40)
+    else if (m_channelWidth == MHz_u{40})
     {
         ruType = HeRu::RU_242_TONE;
     }
-    else if (m_channelWidth == 80)
+    else if (m_channelWidth == MHz_u{80})
     {
         ruType = HeRu::RU_484_TONE;
     }
-    else if (m_channelWidth == 160)
+    else if (m_channelWidth == MHz_u{160})
     {
         ruType = HeRu::RU_996_TONE;
     }
@@ -3304,7 +3309,7 @@
     }
 
     auto primary80MHz = true;
-    if (m_channelWidth == 160 && index == 2)
+    if (m_channelWidth == MHz_u{160} && index == 2)
     {
         primary80MHz = false;
         index = 1;
@@ -3322,7 +3327,7 @@
     auto channelWidth = m_channelWidth;
     if (error == CHANNEL_WIDTH)
     {
-        channelWidth = (channelWidth == 160 ? 20 : channelWidth * 2);
+        channelWidth = (channelWidth == MHz_u{160} ? MHz_u{20} : channelWidth * 2);
     }
 
     WifiTxVector txVector(HePhy::GetHeMcs7(),
@@ -3339,19 +3344,19 @@
                           bssColor);
 
     HeRu::RuType ruType = HeRu::RU_106_TONE;
-    if (channelWidth == 20)
+    if (channelWidth == MHz_u{20})
     {
         ruType = HeRu::RU_106_TONE;
     }
-    else if (channelWidth == 40)
+    else if (channelWidth == MHz_u{40})
     {
         ruType = HeRu::RU_242_TONE;
     }
-    else if (channelWidth == 80)
+    else if (channelWidth == MHz_u{80})
     {
         ruType = HeRu::RU_484_TONE;
     }
-    else if (channelWidth == 160)
+    else if (channelWidth == MHz_u{160})
     {
         ruType = HeRu::RU_996_TONE;
     }
@@ -3368,7 +3373,7 @@
     txVector.SetMode(HePhy::GetHeMcs7(), aid1);
     txVector.SetNss(1, aid1);
 
-    HeRu::RuSpec ru2(ruType, (channelWidth == 160 ? 1 : 2), (channelWidth != 160));
+    HeRu::RuSpec ru2(ruType, (channelWidth == MHz_u{160} ? 1 : 2), (channelWidth != MHz_u{160}));
     txVector.SetRu(ru2, aid2);
     txVector.SetMode(HePhy::GetHeMcs7(), aid2);
     txVector.SetNss(1, aid2);
@@ -3430,8 +3435,10 @@
         phy = m_phySta3;
     }
 
-    Time txDuration =
-        phy->CalculateTxDuration(psdu->GetSize(), txVector, phy->GetPhyBand(), txStaId);
+    Time txDuration = OfdmaSpectrumWifiPhy::CalculateTxDuration(psdu->GetSize(),
+                                                                txVector,
+                                                                phy->GetPhyBand(),
+                                                                txStaId);
     txVector.SetLength(
         HePhy::ConvertHeTbPpduDurationToLSigLength(txDuration, txVector, phy->GetPhyBand()).first);
 
@@ -3462,8 +3469,8 @@
 void
 TestUlOfdmaPhyTransmission::RxSuccess(Ptr<const WifiPsdu> psdu,
                                       RxSignalInfo rxSignalInfo,
-                                      WifiTxVector txVector,
-                                      std::vector<bool> /*statusPerMpdu*/)
+                                      const WifiTxVector& txVector,
+                                      const std::vector<bool>& /*statusPerMpdu*/)
 {
     NS_LOG_FUNCTION(this << *psdu << psdu->GetAddr2() << rxSignalInfo << txVector);
     if (psdu->GetAddr2() == Mac48Address("00:00:00:00:00:01"))
@@ -3538,7 +3545,7 @@
     // Since there is out of band emission due to spectrum mask, the tolerance cannot be very low
     NS_TEST_ASSERT_MSG_EQ_TOL(rxPower,
                               expectedRxPower,
-                              5e-3,
+                              Watt_u{5e-3},
                               "RX power " << rxPower << " over (" << band
                                           << ") does not match expected power " << expectedRxPower
                                           << " at " << Simulator::Now());
@@ -3555,8 +3562,8 @@
      * duration when calling GetEnergyDuration.
      */
     NS_LOG_FUNCTION(this << band << expectedRxPower);
-    double step = 5e-3;
-    if (expectedRxPower > 0.0)
+    Watt_u step{5e-3};
+    if (expectedRxPower > Watt_u{0.0})
     {
         NS_TEST_ASSERT_MSG_EQ(
             phy->GetEnergyDuration(expectedRxPower - step, band).IsStrictlyPositive(),
@@ -4061,7 +4068,7 @@
                             rxPowerOfdma[i]);
     }
 
-    if (rxPowerOfdmaRu1 != 0.0)
+    if (rxPowerOfdmaRu1 != Watt_u{0.0})
     {
         /**
          * Perform checks for transmitting STA (STA 2) to ensure it has correctly logged
@@ -4069,7 +4076,7 @@
          * Cannot use CheckNonOfdmaRxPower method since current event not set.
          */
         const auto rxPowerNonOfdmaSta1Only =
-            (m_channelWidth >= 40)
+            (m_channelWidth >= MHz_u{40})
                 ? rxPowerNonOfdma[0]
                 : rxPowerNonOfdma[0] / 2; // both STAs transmit over the same 20 MHz channel
         // Check received power on non-OFDMA portion
@@ -4132,9 +4139,9 @@
     m_phySta3->SetOperatingChannel(
         WifiPhy::ChannelTuple{channelNum, m_channelWidth, WIFI_PHY_BAND_5GHZ, 0});
 
-    Time delay = Seconds(0.0);
+    Time delay;
     Simulator::Schedule(delay, &TestUlOfdmaPhyTransmission::Reset, this);
-    delay += Seconds(1.0);
+    delay += Seconds(1);
 
     /**
      * In all the following tests, 2 HE TB PPDUs of the same UL MU transmission
@@ -4159,7 +4166,7 @@
                  1,
                  0,
                  1001); // One PSDU of 1001 bytes should have been successfully received from STA 2
-    delay += Seconds(1.0);
+    delay += Seconds(1);
 
     //---------------------------------------------------------------------------
     // Verify that two solicited HE TB PPDUs with delay (< 400ns) between the two signals have been
@@ -4180,7 +4187,7 @@
                  1001, // One PSDU of 1001 bytes should have been successfully received from STA 2
                  true,
                  NanoSeconds(100));
-    delay += Seconds(1.0);
+    delay += Seconds(1);
 
     //---------------------------------------------------------------------------
     // Verify that no unsolicited HE TB PPDU is received
@@ -4200,7 +4207,7 @@
                  true,
                  Seconds(0),
                  WifiPhyState::CCA_BUSY);
-    delay += Seconds(1.0);
+    delay += Seconds(1);
 
     //---------------------------------------------------------------------------
     // Verify that HE TB PPDUs with channel width differing from TRIGVECTOR are discarded
@@ -4221,7 +4228,7 @@
                  Seconds(0),
                  WifiPhyState::CCA_BUSY,
                  CHANNEL_WIDTH);
-    delay += Seconds(1.0);
+    delay += Seconds(1);
 
     //---------------------------------------------------------------------------
     // Verify that HE TB PPDUs with UL Length differing from TRIGVECTOR are discarded
@@ -4242,7 +4249,7 @@
                  Seconds(0),
                  WifiPhyState::CCA_BUSY,
                  UL_LENGTH);
-    delay += Seconds(1.0);
+    delay += Seconds(1);
 
     //---------------------------------------------------------------------------
     // Verify that HE TB PPDUs with AIDs differing from TRIGVECTOR are discarded
@@ -4263,7 +4270,7 @@
                  Seconds(0),
                  WifiPhyState::CCA_BUSY,
                  AID);
-    delay += Seconds(1.0);
+    delay += Seconds(1);
 
     //---------------------------------------------------------------------------
     // Generate an interference on RU 1 and verify that only STA 1's solicited HE TB PPDU has been
@@ -4275,16 +4282,16 @@
         "Reception of solicited HE TB PPDUs with interference on RU 1 during PSDU reception");
     // A strong non-wifi interference is generated on RU 1 during PSDU reception
     BandInfo bandInfo;
-    bandInfo.fc = (m_frequency - (m_channelWidth / 4)) * 1e6;
-    bandInfo.fl = bandInfo.fc - ((m_channelWidth / 4) * 1e6);
-    bandInfo.fh = bandInfo.fc + ((m_channelWidth / 4) * 1e6);
+    bandInfo.fc = MHzToHz(m_frequency - (m_channelWidth / 4));
+    bandInfo.fl = bandInfo.fc - MHzToHz(m_channelWidth / 4);
+    bandInfo.fh = bandInfo.fc + MHzToHz(m_channelWidth / 4);
     Bands bands;
     bands.push_back(bandInfo);
 
     Ptr<SpectrumModel> SpectrumInterferenceRu1 = Create<SpectrumModel>(bands);
     Ptr<SpectrumValue> interferencePsdRu1 = Create<SpectrumValue>(SpectrumInterferenceRu1);
     Watt_u interferencePower{0.1};
-    *interferencePsdRu1 = interferencePower / ((m_channelWidth / 2) * 20e6);
+    *interferencePsdRu1 = interferencePower / (MHzToHz(m_channelWidth / 2) * 20);
 
     Simulator::Schedule(delay + MicroSeconds(50),
                         &TestUlOfdmaPhyTransmission::GenerateInterference,
@@ -4302,7 +4309,7 @@
         1,
         0,
         1001); // One PSDU of 1001 bytes should have been successfully received from STA 2
-    delay += Seconds(1.0);
+    delay += Seconds(1);
 
     //---------------------------------------------------------------------------
     // Generate an interference on RU 2 and verify that only STA 2's solicited HE TB PPDU has been
@@ -4313,15 +4320,15 @@
         this,
         "Reception of solicited HE TB PPDUs with interference on RU 2 during PSDU reception");
     // A strong non-wifi interference is generated on RU 2 during PSDU reception
-    bandInfo.fc = (m_frequency + (m_channelWidth / 4)) * 1e6;
-    bandInfo.fl = bandInfo.fc - ((m_channelWidth / 4) * 1e6);
-    bandInfo.fh = bandInfo.fc + ((m_channelWidth / 4) * 1e6);
+    bandInfo.fc = MHzToHz(m_frequency + (m_channelWidth / 4));
+    bandInfo.fl = bandInfo.fc - MHzToHz(m_channelWidth / 4);
+    bandInfo.fh = bandInfo.fc + MHzToHz(m_channelWidth / 4);
     bands.clear();
     bands.push_back(bandInfo);
 
     Ptr<SpectrumModel> SpectrumInterferenceRu2 = Create<SpectrumModel>(bands);
     Ptr<SpectrumValue> interferencePsdRu2 = Create<SpectrumValue>(SpectrumInterferenceRu2);
-    *interferencePsdRu2 = interferencePower / ((m_channelWidth / 2) * 20e6);
+    *interferencePsdRu2 = interferencePower / (MHzToHz(m_channelWidth / 2) * 20);
 
     Simulator::Schedule(delay + MicroSeconds(50),
                         &TestUlOfdmaPhyTransmission::GenerateInterference,
@@ -4330,7 +4337,7 @@
                         MilliSeconds(100));
     ScheduleTest(delay,
                  true,
-                 (m_channelWidth >= 40)
+                 (m_channelWidth >= MHz_u{40})
                      ? WifiPhyState::IDLE
                      : WifiPhyState::CCA_BUSY, // PHY should move to CCA_BUSY if interference is
                                                // generated in its primary channel
@@ -4341,7 +4348,7 @@
                  1,
                  0); // Reception of the PSDU from STA 2 should have failed (since interference
                      // occupies RU 2)
-    delay += Seconds(1.0);
+    delay += Seconds(1);
 
     //---------------------------------------------------------------------------
     // Generate an interference on the full band and verify that both solicited HE TB PPDUs have
@@ -4352,15 +4359,15 @@
                         "Reception of solicited HE TB PPDUs with interference on the full band "
                         "during PSDU reception");
     // A strong non-wifi interference is generated on the full band during PSDU reception
-    bandInfo.fc = m_frequency * 1e6;
-    bandInfo.fl = bandInfo.fc - ((m_channelWidth / 2) * 1e6);
-    bandInfo.fh = bandInfo.fc + ((m_channelWidth / 2) * 1e6);
+    bandInfo.fc = MHzToHz(m_frequency);
+    bandInfo.fl = bandInfo.fc - MHzToHz(m_channelWidth / 2);
+    bandInfo.fh = bandInfo.fc + MHzToHz(m_channelWidth / 2);
     bands.clear();
     bands.push_back(bandInfo);
 
     Ptr<SpectrumModel> SpectrumInterferenceAll = Create<SpectrumModel>(bands);
     Ptr<SpectrumValue> interferencePsdAll = Create<SpectrumValue>(SpectrumInterferenceAll);
-    *interferencePsdAll = interferencePower / (m_channelWidth * 20e6);
+    *interferencePsdAll = interferencePower / (MHzToHz(m_channelWidth) * 20);
 
     Simulator::Schedule(delay + MicroSeconds(50),
                         &TestUlOfdmaPhyTransmission::GenerateInterference,
@@ -4379,7 +4386,7 @@
         1,
         0); // Reception of the PSDU from STA 2 should have failed (since interference occupies RU
             // 2)
-    delay += Seconds(1.0);
+    delay += Seconds(1);
 
     //---------------------------------------------------------------------------
     // Send another HE TB PPDU (of another UL MU transmission) on RU 1 and verify that both
@@ -4404,7 +4411,7 @@
     uint32_t succ;
     uint32_t fail;
     uint32_t bytes;
-    if (m_channelWidth > 20)
+    if (m_channelWidth > MHz_u{20})
     {
         // One PSDU of 1001 bytes should have been successfully received from STA 2 (since
         // interference from STA 3 on distinct 20 MHz channel)
@@ -4431,7 +4438,7 @@
                  succ,
                  fail,
                  bytes);
-    delay += Seconds(1.0);
+    delay += Seconds(1);
 
     //---------------------------------------------------------------------------
     // Send another HE TB PPDU (of another UL MU transmission) on RU 2 and verify that both
@@ -4453,7 +4460,7 @@
                         0,
                         false);
     // Expected figures from STA 1
-    if (m_channelWidth > 20)
+    if (m_channelWidth > MHz_u{20})
     {
         // One PSDU of 1000 bytes should have been successfully received from STA 1 (since
         // interference from STA 3 on distinct 20 MHz channel)
@@ -4471,7 +4478,7 @@
     }
     ScheduleTest(delay,
                  true,
-                 (m_channelWidth >= 40)
+                 (m_channelWidth >= MHz_u{40})
                      ? WifiPhyState::IDLE
                      : WifiPhyState::CCA_BUSY, // PHY should move to CCA_BUSY instead of IDLE if HE
                                                // TB PPDU on primary channel
@@ -4482,7 +4489,7 @@
                  1,
                  0); // Reception of the PSDU from STA 2 should have failed (since interference from
                      // STA 3 on same 20 MHz channel)
-    delay += Seconds(1.0);
+    delay += Seconds(1);
 
     //---------------------------------------------------------------------------
     // Send an HE SU PPDU during 400 ns window and verify that both solicited HE TB PPDUs have been
@@ -4510,7 +4517,7 @@
         0,
         1,
         0); // Reception of the PSDU from STA 2 should have failed (since interference from STA 3)
-    delay += Seconds(1.0);
+    delay += Seconds(1);
 
     //---------------------------------------------------------------------------
     // Only send a solicited HE TB PPDU from STA 2 on RU 2 and verify that it has been correctly
@@ -4525,7 +4532,7 @@
                         &TestUlOfdmaPhyTransmission::CheckPhyState,
                         this,
                         m_phySta3,
-                        (m_channelWidth >= 40)
+                        (m_channelWidth >= MHz_u{40})
                             ? WifiPhyState::IDLE
                             : WifiPhyState::CCA_BUSY); // PHY should move to CCA_BUSY instead of
                                                        // IDLE if HE TB PPDU on primary channel
@@ -4541,7 +4548,7 @@
                  false,
                  Seconds(0),
                  WifiPhyState::RX); // Measurement channel is total channel width
-    delay += Seconds(1.0);
+    delay += Seconds(1);
 
     //---------------------------------------------------------------------------
     // Measure the power of a solicited HE TB PPDU from STA 2 on RU 2
@@ -4549,12 +4556,12 @@
                         &TestUlOfdmaPhyTransmission::LogScenario,
                         this,
                         "Measure power for reception of HE TB PPDU only on RU 2");
-    auto rxPower =
-        DbmToW(19); // 16+1 dBm at STAs and +2 at AP (no loss since all devices are colocated)
+    auto rxPower = DbmToW(
+        dBm_u{19}); // 16+1 dBm at STAs and +2 at AP (no loss since all devices are colocated)
     SchedulePowerMeasurementChecks(delay,
-                                   (m_channelWidth >= 40) ? 0.0 : rxPower,
+                                   (m_channelWidth >= MHz_u{40}) ? Watt_u{0.0} : rxPower,
                                    rxPower, // power detected on RU1 only if same 20 MHz as RU 2
-                                   0.0,
+                                   Watt_u{0.0},
                                    rxPower);
     ScheduleTest(delay,
                  true,
@@ -4568,7 +4575,7 @@
                  false,
                  Seconds(0),
                  WifiPhyState::RX); // Measurement channel is total channel width
-    delay += Seconds(1.0);
+    delay += Seconds(1);
 
     //---------------------------------------------------------------------------
     // Measure the power of a solicited HE TB PPDU from STA 2 on RU 2 with power spectrum density
@@ -4584,23 +4591,24 @@
                         &TestUlOfdmaPhyTransmission::SetPsdLimit,
                         this,
                         m_phySta2,
-                        3.0);
+                        dBm_per_MHz_u{3});
 
-    rxPower = (m_channelWidth > 40)
-                  ? DbmToW(19)
-                  : DbmToW(18.0103); // 15.0103+1 dBm at STA 2 and +2 at AP for non-OFDMA
-                                     // transmitted only on one 20 MHz channel
+    rxPower = (m_channelWidth > MHz_u{40})
+                  ? DbmToW(dBm_u{19})
+                  : DbmToW(dBm_u{18.0103}); // 15.0103+1 dBm at STA 2 and +2 at AP for non-OFDMA
+                                            // transmitted only on one 20 MHz channel
     auto rxPowerOfdma = rxPower;
-    if (m_channelWidth <= 40)
+    if (m_channelWidth <= MHz_u{40})
     {
-        rxPowerOfdma = (m_channelWidth == 20)
-                           ? DbmToW(14.0309)  // 11.0309+1 dBm at STA and +2 at AP if 106-tone RU
-                           : DbmToW(18.0103); // 15.0103+1 dBm at STA 2 and +2 at AP if 242-tone RU
+        rxPowerOfdma =
+            (m_channelWidth == MHz_u{20})
+                ? DbmToW(dBm_u{14.0309})  // 11.0309+1 dBm at STA and +2 at AP if 106-tone RU
+                : DbmToW(dBm_u{18.0103}); // 15.0103+1 dBm at STA 2 and +2 at AP if 242-tone RU
     }
     SchedulePowerMeasurementChecks(delay,
-                                   (m_channelWidth >= 40) ? 0.0 : rxPower,
+                                   (m_channelWidth >= MHz_u{40}) ? Watt_u{0.0} : rxPower,
                                    rxPower, // power detected on RU1 only if same 20 MHz as RU 2
-                                   0.0,
+                                   Watt_u{0.0},
                                    rxPowerOfdma);
 
     // Reset PSD limitation once HE TB has been sent
@@ -4608,7 +4616,7 @@
                         &TestUlOfdmaPhyTransmission::SetPsdLimit,
                         this,
                         m_phySta2,
-                        100.0);
+                        dBm_per_MHz_u{100});
     ScheduleTest(delay,
                  true,
                  WifiPhyState::IDLE,
@@ -4621,7 +4629,7 @@
                  false,
                  Seconds(0),
                  WifiPhyState::RX); // Measurement channel is total channel width
-    delay += Seconds(1.0);
+    delay += Seconds(1);
 
     //---------------------------------------------------------------------------
     // Measure the power of 2 solicited HE TB PPDU from both STAs
@@ -4629,10 +4637,12 @@
                         &TestUlOfdmaPhyTransmission::LogScenario,
                         this,
                         "Measure power for reception of HE TB PPDU on both RUs");
-    rxPower = DbmToW(19); // 16+1 dBm at STAs and +2 at AP (no loss since all devices are colocated)
+    rxPower = DbmToW(
+        dBm_u{19}); // 16+1 dBm at STAs and +2 at AP (no loss since all devices are colocated)
     const auto rxPowerNonOfdma =
-        (m_channelWidth >= 40) ? rxPower
-                               : rxPower * 2; // both STAs transmit over the same 20 MHz channel
+        (m_channelWidth >= MHz_u{40})
+            ? rxPower
+            : rxPower * 2; // both STAs transmit over the same 20 MHz channel
     SchedulePowerMeasurementChecks(delay, rxPowerNonOfdma, rxPowerNonOfdma, rxPower, rxPower);
     ScheduleTest(delay,
                  true,
@@ -4643,7 +4653,7 @@
                  1,
                  0,
                  1001); // One PSDU of 1001 bytes should have been successfully received from STA 2
-    delay += Seconds(1.0);
+    delay += Seconds(1);
 
     //---------------------------------------------------------------------------
     // Verify that an HE TB PPDU from another BSS has been correctly received (no UL MU transmission
@@ -4670,7 +4680,7 @@
                         this);
 
     Simulator::Schedule(delay + MilliSeconds(500), &TestUlOfdmaPhyTransmission::Reset, this);
-    delay += Seconds(1.0);
+    delay += Seconds(1);
 
     //---------------------------------------------------------------------------
     // Verify that two solicited HE TB PPDUs with delay (< 400ns) between the two signals have been
@@ -4702,7 +4712,7 @@
                  1001, // One PSDU of 1001 bytes should have been successfully received from STA 2
                  true,
                  NanoSeconds(200));
-    delay += Seconds(1.0);
+    delay += Seconds(1);
 
     Simulator::Run();
 }
@@ -4710,26 +4720,26 @@
 void
 TestUlOfdmaPhyTransmission::DoRun()
 {
-    m_frequency = 5180;
-    m_channelWidth = 20;
+    m_frequency = MHz_u{5180};
+    m_channelWidth = MHz_u{20};
     m_expectedPpduDuration = NanoSeconds(292800);
     NS_LOG_DEBUG("Run UL OFDMA PHY transmission test for " << m_channelWidth << " MHz");
     RunOne();
 
-    m_frequency = 5190;
-    m_channelWidth = 40;
+    m_frequency = MHz_u{5190};
+    m_channelWidth = MHz_u{40};
     m_expectedPpduDuration = NanoSeconds(163200);
     NS_LOG_DEBUG("Run UL OFDMA PHY transmission test for " << m_channelWidth << " MHz");
     RunOne();
 
-    m_frequency = 5210;
-    m_channelWidth = 80;
+    m_frequency = MHz_u{5210};
+    m_channelWidth = MHz_u{80};
     m_expectedPpduDuration = NanoSeconds(105600);
     NS_LOG_DEBUG("Run UL OFDMA PHY transmission test for " << m_channelWidth << " MHz");
     RunOne();
 
-    m_frequency = 5250;
-    m_channelWidth = 160;
+    m_frequency = MHz_u{5250};
+    m_channelWidth = MHz_u{160};
     m_expectedPpduDuration = NanoSeconds(76800);
     NS_LOG_DEBUG("Run UL OFDMA PHY transmission test for " << m_channelWidth << " MHz");
     RunOne();
@@ -4738,10 +4748,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief PHY padding exclusion test
+ * @brief PHY padding exclusion test
  */
 class TestPhyPaddingExclusion : public TestCase
 {
@@ -4756,10 +4766,10 @@
 
     /**
      * Send HE TB PPDU function
-     * \param txStaId the ID of the TX STA
-     * \param index the RU index used for the transmission
-     * \param payloadSize the size of the payload in bytes
-     * \param txDuration the duration of the PPDU
+     * @param txStaId the ID of the TX STA
+     * @param index the RU index used for the transmission
+     * @param payloadSize the size of the payload in bytes
+     * @param txDuration the duration of the PPDU
      */
     void SendHeTbPpdu(uint16_t txStaId,
                       std::size_t index,
@@ -4768,14 +4778,14 @@
     /**
      * Set TRIGVECTOR for HE TB PPDU
      *
-     * \param ppduDuration the duration of the HE TB PPDU
+     * @param ppduDuration the duration of the HE TB PPDU
      */
     void SetTrigVector(Time ppduDuration);
 
     /**
      * Generate interference function
-     * \param interferencePsd the PSD of the interference to be generated
-     * \param duration the duration of the interference
+     * @param interferencePsd the PSD of the interference to be generated
+     * @param duration the duration of the interference
      */
     void GenerateInterference(Ptr<SpectrumValue> interferencePsd, Time duration);
     /**
@@ -4790,9 +4800,9 @@
 
     /**
      * Check the received PSDUs from STA1
-     * \param expectedSuccess the expected number of success
-     * \param expectedFailures the expected number of failures
-     * \param expectedBytes the expected number of bytes
+     * @param expectedSuccess the expected number of success
+     * @param expectedFailures the expected number of failures
+     * @param expectedBytes the expected number of bytes
      */
     void CheckRxFromSta1(uint32_t expectedSuccess,
                          uint32_t expectedFailures,
@@ -4800,9 +4810,9 @@
 
     /**
      * Check the received PSDUs from STA2
-     * \param expectedSuccess the expected number of success
-     * \param expectedFailures the expected number of failures
-     * \param expectedBytes the expected number of bytes
+     * @param expectedSuccess the expected number of success
+     * @param expectedFailures the expected number of failures
+     * @param expectedBytes the expected number of bytes
      */
     void CheckRxFromSta2(uint32_t expectedSuccess,
                          uint32_t expectedFailures,
@@ -4815,11 +4825,11 @@
 
     /**
      * Check the PHY state
-     * \param phy the PHY
-     * \param expectedState the expected state of the PHY
+     * @param phy the PHY
+     * @param expectedState the expected state of the PHY
      */
     void CheckPhyState(Ptr<OfdmaSpectrumWifiPhy> phy, WifiPhyState expectedState);
-    /// \copydoc CheckPhyState
+    /// @copydoc CheckPhyState
     void DoCheckPhyState(Ptr<OfdmaSpectrumWifiPhy> phy, WifiPhyState expectedState);
 
     /**
@@ -4829,19 +4839,19 @@
 
     /**
      * Receive success function
-     * \param psdu the PSDU
-     * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
-     * \param txVector the transmit vector
-     * \param statusPerMpdu reception status per MPDU
+     * @param psdu the PSDU
+     * @param rxSignalInfo the info on the received signal (\see RxSignalInfo)
+     * @param txVector the transmit vector
+     * @param statusPerMpdu reception status per MPDU
      */
     void RxSuccess(Ptr<const WifiPsdu> psdu,
                    RxSignalInfo rxSignalInfo,
-                   WifiTxVector txVector,
-                   std::vector<bool> statusPerMpdu);
+                   const WifiTxVector& txVector,
+                   const std::vector<bool>& statusPerMpdu);
 
     /**
      * Receive failure function
-     * \param psdu the PSDU
+     * @param psdu the PSDU
      */
     void RxFailure(Ptr<const WifiPsdu> psdu);
 
@@ -4946,8 +4956,8 @@
 void
 TestPhyPaddingExclusion::RxSuccess(Ptr<const WifiPsdu> psdu,
                                    RxSignalInfo rxSignalInfo,
-                                   WifiTxVector txVector,
-                                   std::vector<bool> /*statusPerMpdu*/)
+                                   const WifiTxVector& txVector,
+                                   const std::vector<bool>& /*statusPerMpdu*/)
 {
     NS_LOG_FUNCTION(this << *psdu << psdu->GetAddr2() << rxSignalInfo << txVector);
     if (psdu->GetAddr2() == Mac48Address("00:00:00:00:00:01"))
@@ -5066,7 +5076,7 @@
 
     Ptr<MultiModelSpectrumChannel> spectrumChannel = CreateObject<MultiModelSpectrumChannel>();
     Ptr<FriisPropagationLossModel> lossModel = CreateObject<FriisPropagationLossModel>();
-    lossModel->SetFrequency(DEFAULT_FREQUENCY * 1e6);
+    lossModel->SetFrequency(MHzToHz(DEFAULT_FREQUENCY));
     spectrumChannel->AddPropagationLossModel(lossModel);
     Ptr<ConstantSpeedPropagationDelayModel> delayModel =
         CreateObject<ConstantSpeedPropagationDelayModel>();
@@ -5209,17 +5219,17 @@
     Time ppduWithPaddingDuration =
         expectedPpduDuration + 10 * NanoSeconds(12800 + 1600 /* GI */); // add 10 extra OFDM symbols
 
-    Simulator::Schedule(Seconds(0.0), &TestPhyPaddingExclusion::Reset, this);
+    Simulator::Schedule(Seconds(0), &TestPhyPaddingExclusion::Reset, this);
 
     // STA1 and STA2 send MU UL PPDUs addressed to AP:
-    Simulator::Schedule(Seconds(1.0),
+    Simulator::Schedule(Seconds(1),
                         &TestPhyPaddingExclusion::SendHeTbPpdu,
                         this,
                         1,
                         1,
                         1000,
                         ppduWithPaddingDuration);
-    Simulator::Schedule(Seconds(1.0),
+    Simulator::Schedule(Seconds(1),
                         &TestPhyPaddingExclusion::SendHeTbPpdu,
                         this,
                         2,
@@ -5228,18 +5238,18 @@
                         ppduWithPaddingDuration);
 
     // Set TRIGVECTOR on AP
-    Simulator::Schedule(Seconds(1.0),
+    Simulator::Schedule(Seconds(1),
                         &TestPhyPaddingExclusion::SetTrigVector,
                         this,
                         ppduWithPaddingDuration);
 
     // Verify it takes expectedPpduDuration + padding to transmit the PPDUs
-    Simulator::Schedule(Seconds(1.0) + ppduWithPaddingDuration - NanoSeconds(1),
+    Simulator::Schedule(Seconds(1) + ppduWithPaddingDuration - NanoSeconds(1),
                         &TestPhyPaddingExclusion::CheckPhyState,
                         this,
                         m_phyAp,
                         WifiPhyState::RX);
-    Simulator::Schedule(Seconds(1.0) + ppduWithPaddingDuration,
+    Simulator::Schedule(Seconds(1) + ppduWithPaddingDuration,
                         &TestPhyPaddingExclusion::CheckPhyState,
                         this,
                         m_phyAp,
@@ -5255,14 +5265,14 @@
     Simulator::Schedule(Seconds(1.5), &TestPhyPaddingExclusion::Reset, this);
 
     // STA1 and STA2 send MU UL PPDUs addressed to AP:
-    Simulator::Schedule(Seconds(2.0),
+    Simulator::Schedule(Seconds(2),
                         &TestPhyPaddingExclusion::SendHeTbPpdu,
                         this,
                         1,
                         1,
                         1000,
                         ppduWithPaddingDuration);
-    Simulator::Schedule(Seconds(2.0),
+    Simulator::Schedule(Seconds(2),
                         &TestPhyPaddingExclusion::SendHeTbPpdu,
                         this,
                         2,
@@ -5271,25 +5281,25 @@
                         ppduWithPaddingDuration);
 
     // Set TRIGVECTOR on AP
-    Simulator::Schedule(Seconds(2.0),
+    Simulator::Schedule(Seconds(2),
                         &TestPhyPaddingExclusion::SetTrigVector,
                         this,
                         ppduWithPaddingDuration);
 
     // A strong non-wifi interference is generated on RU 1 during padding reception
     BandInfo bandInfo;
-    bandInfo.fc = (DEFAULT_FREQUENCY - (DEFAULT_CHANNEL_WIDTH / 4)) * 1e6;
-    bandInfo.fl = bandInfo.fc - ((DEFAULT_CHANNEL_WIDTH / 4) * 1e6);
-    bandInfo.fh = bandInfo.fc + ((DEFAULT_CHANNEL_WIDTH / 4) * 1e6);
+    bandInfo.fc = MHzToHz(DEFAULT_FREQUENCY - (DEFAULT_CHANNEL_WIDTH / 4));
+    bandInfo.fl = bandInfo.fc - MHzToHz(DEFAULT_CHANNEL_WIDTH / 4);
+    bandInfo.fh = bandInfo.fc + MHzToHz(DEFAULT_CHANNEL_WIDTH / 4);
     Bands bands;
     bands.push_back(bandInfo);
 
     Ptr<SpectrumModel> SpectrumInterferenceRu1 = Create<SpectrumModel>(bands);
     Ptr<SpectrumValue> interferencePsdRu1 = Create<SpectrumValue>(SpectrumInterferenceRu1);
     Watt_u interferencePower{0.1};
-    *interferencePsdRu1 = interferencePower / ((DEFAULT_CHANNEL_WIDTH / 2) * 20e6);
+    *interferencePsdRu1 = interferencePower / (MHzToHz(DEFAULT_CHANNEL_WIDTH / 2) * 20);
 
-    Simulator::Schedule(Seconds(2.0) + MicroSeconds(50) + expectedPpduDuration,
+    Simulator::Schedule(Seconds(2) + MicroSeconds(50) + expectedPpduDuration,
                         &TestPhyPaddingExclusion::GenerateInterference,
                         this,
                         interferencePsdRu1,
@@ -5297,12 +5307,12 @@
 
     // Verify it takes  expectedPpduDuration + padding to transmit the PPDUs (PHY should move to
     // CCA_BUSY instead of IDLE due to the interference)
-    Simulator::Schedule(Seconds(2.0) + ppduWithPaddingDuration - NanoSeconds(1),
+    Simulator::Schedule(Seconds(2) + ppduWithPaddingDuration - NanoSeconds(1),
                         &TestPhyPaddingExclusion::CheckPhyState,
                         this,
                         m_phyAp,
                         WifiPhyState::RX);
-    Simulator::Schedule(Seconds(2.0) + ppduWithPaddingDuration,
+    Simulator::Schedule(Seconds(2) + ppduWithPaddingDuration,
                         &TestPhyPaddingExclusion::CheckPhyState,
                         this,
                         m_phyAp,
@@ -5324,10 +5334,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief UL-OFDMA power control test
+ * @brief UL-OFDMA power control test
  */
 class TestUlOfdmaPowerControl : public TestCase
 {
@@ -5343,7 +5353,7 @@
     /**
      * Send a MU BAR through the AP to the STAs listed in the provided vector.
      *
-     * \param staIds the vector of STA-IDs of STAs to address the MU-BAR to
+     * @param staIds the vector of STA-IDs of STAs to address the MU-BAR to
      */
     void SendMuBar(std::vector<uint16_t> staIds);
 
@@ -5351,14 +5361,14 @@
      * Send a QoS Data packet to the destination station in order
      * to set up a block Ack session (so that the MU-BAR may have a reply).
      *
-     * \param destination the address of the destination station
+     * @param destination the address of the destination station
      */
     void SetupBa(Address destination);
 
     /**
      * Run one simulation with an optional BA session set up phase.
      *
-     * \param setupBa true if BA session should be set up (i.e. upon first run),
+     * @param setupBa true if BA session should be set up (i.e. upon first run),
      *                false otherwise
      */
     void RunOne(bool setupBa);
@@ -5373,15 +5383,15 @@
      * Receive OK callback function at AP.
      * This method will be plugged into the AP PHY's ReceiveOkCallback once the
      * block Ack session has been set up. This is done in the Reset function.
-     * \param psdu the PSDU
-     * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
-     * \param txVector the TXVECTOR used for the packet
-     * \param statusPerMpdu reception status per MPDU
+     * @param psdu the PSDU
+     * @param rxSignalInfo the info on the received signal (\see RxSignalInfo)
+     * @param txVector the TXVECTOR used for the packet
+     * @param statusPerMpdu reception status per MPDU
      */
     void ReceiveOkCallbackAtAp(Ptr<const WifiPsdu> psdu,
                                RxSignalInfo rxSignalInfo,
-                               WifiTxVector txVector,
-                               std::vector<bool> statusPerMpdu);
+                               const WifiTxVector& txVector,
+                               const std::vector<bool>& statusPerMpdu);
 
     uint8_t m_bssColor; ///< BSS color
 
@@ -5408,15 +5418,15 @@
 TestUlOfdmaPowerControl::TestUlOfdmaPowerControl()
     : TestCase("UL-OFDMA power control test"),
       m_bssColor(1),
-      m_txPowerAp(0),
-      m_txPowerStart(0),
-      m_txPowerEnd(0),
+      m_txPowerAp(dBm_u{0}),
+      m_txPowerStart(dBm_u{0}),
+      m_txPowerEnd(dBm_u{0}),
       m_txPowerLevels(0),
-      m_requestedRssiSta1(0),
-      m_requestedRssiSta2(0),
-      m_rssiSta1(0),
-      m_rssiSta2(0),
-      m_tol(0.1)
+      m_requestedRssiSta1(dBm_u{0}),
+      m_requestedRssiSta2(dBm_u{0}),
+      m_rssiSta1(dBm_u{0}),
+      m_rssiSta2(dBm_u{0}),
+      m_tol(dB_u{0.1})
 {
 }
 
@@ -5538,10 +5548,10 @@
 
     auto nav = m_apDev->GetPhy()->GetSifs();
     const auto staId = staIds.front(); // either will do
-    nav += m_phyAp->CalculateTxDuration(GetBlockAckSize(BlockAckType::COMPRESSED),
-                                        tbTxVector,
-                                        DEFAULT_WIFI_BAND,
-                                        staId);
+    nav += SpectrumWifiPhy::CalculateTxDuration(GetBlockAckSize(BlockAckType::COMPRESSED),
+                                                tbTxVector,
+                                                DEFAULT_WIFI_BAND,
+                                                staId);
     psdu->SetDuration(nav);
     psdus.insert(std::make_pair(SU_STA_ID, psdu));
 
@@ -5551,8 +5561,8 @@
 void
 TestUlOfdmaPowerControl::ReceiveOkCallbackAtAp(Ptr<const WifiPsdu> psdu,
                                                RxSignalInfo rxSignalInfo,
-                                               WifiTxVector txVector,
-                                               std::vector<bool> /*statusPerMpdu*/)
+                                               const WifiTxVector& txVector,
+                                               const std::vector<bool>& /*statusPerMpdu*/)
 {
     NS_TEST_ASSERT_MSG_EQ(txVector.GetPreambleType(), WIFI_PREAMBLE_HE_TB, "HE TB PPDU expected");
     const auto rssi = rxSignalInfo.rssi;
@@ -5758,24 +5768,24 @@
 TestUlOfdmaPowerControl::DoRun()
 {
     // Power configurations
-    m_txPowerAp = 20;    // dBm, so as to have -30 and -36 dBm at STA 1 and STA 2 resp.,
-                         // since path loss = 50 dB for AP <-> STA 1 and 56 dB for AP <-> STA 2
-    m_txPowerStart = 15; // dBm
+    m_txPowerAp = dBm_u{20}; // so as to have -30 and -36 dBm at STA 1 and STA 2 resp., since path
+                             // loss = 50 dB for AP <-> STA 1 and 56 dB for AP <-> STA 2
+    m_txPowerStart = dBm_u{15};
 
     // Requested UL RSSIs: should correspond to 20 dBm transmit power at STAs
-    m_requestedRssiSta1 = -30.0;
-    m_requestedRssiSta2 = -36.0;
+    m_requestedRssiSta1 = dBm_u{-30};
+    m_requestedRssiSta2 = dBm_u{-36};
 
     // Test single power level
     {
         // STA power configurations: 15 dBm only
-        m_txPowerEnd = 15;
+        m_txPowerEnd = dBm_u{15};
         m_txPowerLevels = 1;
 
         // Expected UL RSSIs, considering that the provided power is 5 dB less than requested,
         // regardless of the estimated path loss.
-        m_rssiSta1 = -35.0; // 15 dBm - 50 dB
-        m_rssiSta2 = -41.0; // 15 dBm - 56 dB
+        m_rssiSta1 = dBm_u{-35}; // 15 dBm - 50 dB
+        m_rssiSta2 = dBm_u{-41}; // 15 dBm - 56 dB
 
         RunOne(true);
     }
@@ -5783,13 +5793,13 @@
     // Test 2 dBm granularity
     {
         // STA power configurations: [15:2:25] dBm
-        m_txPowerEnd = 25;
+        m_txPowerEnd = dBm_u{25};
         m_txPowerLevels = 6;
 
         // Expected UL RSSIs, considering that the provided power (21 dBm) is 1 dB more than
         // requested
-        m_rssiSta1 = -29.0; // 21 dBm - 50 dB
-        m_rssiSta2 = -35.0; // 21 dBm - 50 dB
+        m_rssiSta1 = dBm_u{-29}; // 21 dBm - 50 dB
+        m_rssiSta2 = dBm_u{-35}; // 21 dBm - 50 dB
 
         RunOne(false);
     }
@@ -5797,12 +5807,12 @@
     // Test 1 dBm granularity
     {
         // STA power configurations: [15:1:25] dBm
-        m_txPowerEnd = 25;
+        m_txPowerEnd = dBm_u{25};
         m_txPowerLevels = 11;
 
         // Expected UL RSSIs, considering that we can correctly tune the transmit power
-        m_rssiSta1 = -30.0; // 20 dBm - 50 dB
-        m_rssiSta2 = -36.0; // 20 dBm - 56 dB
+        m_rssiSta1 = dBm_u{-30}; // 20 dBm - 50 dB
+        m_rssiSta2 = dBm_u{-36}; // 20 dBm - 56 dB
 
         RunOne(false);
     }
@@ -5810,16 +5820,17 @@
     // Ask for different power levels (3 dB difference between HE_TB_PPDUs)
     {
         // STA power configurations: [15:1:25] dBm
-        m_txPowerEnd = 25;
+        m_txPowerEnd = dBm_u{25};
         m_txPowerLevels = 11;
 
         // Requested UL RSSIs
-        m_requestedRssiSta1 = -28.0; // 2 dB higher than previously -> Tx power = 22 dBm at STA 1
-        m_requestedRssiSta2 = -37.0; // 1 dB less than previously -> Tx power = 19 dBm at STA 2
+        m_requestedRssiSta1 =
+            dBm_u{-28}; // 2 dB higher than previously -> Tx power = 22 dBm at STA 1
+        m_requestedRssiSta2 = dBm_u{-37}; // 1 dB less than previously -> Tx power = 19 dBm at STA 2
 
         // Expected UL RSSIs, considering that we can correctly tune the transmit power
-        m_rssiSta1 = -28.0; // 22 dBm - 50 dB
-        m_rssiSta2 = -37.0; // 19 dBm - 56 dB
+        m_rssiSta1 = dBm_u{-28}; // 22 dBm - 50 dB
+        m_rssiSta2 = dBm_u{-37}; // 19 dBm - 56 dB
 
         RunOne(false);
     }
@@ -5828,10 +5839,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief wifi PHY OFDMA Test Suite
+ * @brief wifi PHY OFDMA Test Suite
  */
 class WifiPhyOfdmaTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/test/wifi-phy-reception-test.cc ns-3.44/src/wifi/test/wifi-phy-reception-test.cc
--- ns-3.43/src/wifi/test/wifi-phy-reception-test.cc	2024-10-09 16:41:10.140657000 -0700
+++ ns-3.44/src/wifi/test/wifi-phy-reception-test.cc	2025-03-09 16:55:49.811372800 -0700
@@ -48,15 +48,15 @@
 NS_LOG_COMPONENT_DEFINE("WifiPhyReceptionTest");
 
 static const uint8_t CHANNEL_NUMBER = 36;
-static const MHz_u FREQUENCY = 5180;
-static const MHz_u CHANNEL_WIDTH = 20;
+static const MHz_u FREQUENCY{5180};
+static const MHz_u CHANNEL_WIDTH{20};
 static const MHz_u GUARD_WIDTH = CHANNEL_WIDTH; // expanded to channel width to model spectrum mask
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Wifi Phy Reception Test base class
+ * @brief Wifi Phy Reception Test base class
  */
 class WifiPhyReceptionTest : public TestCase
 {
@@ -64,7 +64,7 @@
     /**
      * Constructor
      *
-     * \param test_name the test name
+     * @param test_name the test name
      */
     WifiPhyReceptionTest(std::string test_name);
     /**
@@ -78,20 +78,20 @@
 
     /**
      * Send packet function
-     * \param rxPower the transmit power
-     * \param packetSize the size of the packet in bytes
-     * \param mcs the MCS to transmit the packet
+     * @param rxPower the transmit power
+     * @param packetSize the size of the packet in bytes
+     * @param mcs the MCS to transmit the packet
      */
     void SendPacket(dBm_u rxPower, uint32_t packetSize, uint8_t mcs);
 
     /**
      * Schedule now to check  the PHY state
-     * \param expectedState the expected PHY state
+     * @param expectedState the expected PHY state
      */
     void CheckPhyState(WifiPhyState expectedState);
     /**
      * Check the PHY state now
-     * \param expectedState the expected PHY state
+     * @param expectedState the expected PHY state
      */
     void DoCheckPhyState(WifiPhyState expectedState);
 
@@ -114,7 +114,7 @@
                                          1,
                                          1,
                                          0,
-                                         20,
+                                         MHz_u{20},
                                          false);
 
     Ptr<Packet> pkt = Create<Packet>(packetSize);
@@ -124,7 +124,8 @@
     hdr.SetQosTid(0);
 
     Ptr<WifiPsdu> psdu = Create<WifiPsdu>(pkt, hdr);
-    Time txDuration = m_phy->CalculateTxDuration(psdu->GetSize(), txVector, m_phy->GetPhyBand());
+    Time txDuration =
+        SpectrumWifiPhy::CalculateTxDuration(psdu->GetSize(), txVector, m_phy->GetPhyBand());
 
     Ptr<WifiPpdu> ppdu =
         Create<HePpdu>(psdu, txVector, m_phy->GetOperatingChannel(), txDuration, m_uid++);
@@ -194,10 +195,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Preamble detection test w/o frame capture
+ * @brief Preamble detection test w/o frame capture
  */
 class TestThresholdPreambleDetectionWithoutFrameCapture : public WifiPhyReceptionTest
 {
@@ -209,18 +210,18 @@
 
     /**
      * Spectrum wifi receive success function
-     * \param psdu the PSDU
-     * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
-     * \param txVector the transmit vector
-     * \param statusPerMpdu reception status per MPDU
+     * @param psdu the PSDU
+     * @param rxSignalInfo the info on the received signal (\see RxSignalInfo)
+     * @param txVector the transmit vector
+     * @param statusPerMpdu reception status per MPDU
      */
     void RxSuccess(Ptr<const WifiPsdu> psdu,
                    RxSignalInfo rxSignalInfo,
-                   WifiTxVector txVector,
-                   std::vector<bool> statusPerMpdu);
+                   const WifiTxVector& txVector,
+                   const std::vector<bool>& statusPerMpdu);
     /**
      * Spectrum wifi receive failure function
-     * \param psdu the PSDU
+     * @param psdu the PSDU
      */
     void RxFailure(Ptr<const WifiPsdu> psdu);
     uint32_t m_countRxSuccess{0}; ///< count RX success
@@ -231,8 +232,8 @@
 
     /**
      * Check the number of received packets
-     * \param expectedSuccessCount the number of successfully received packets
-     * \param expectedFailureCount the number of unsuccessfully received packets
+     * @param expectedSuccessCount the number of successfully received packets
+     * @param expectedFailureCount the number of unsuccessfully received packets
      */
     void CheckRxPacketCount(uint32_t expectedSuccessCount, uint32_t expectedFailureCount);
 };
@@ -259,8 +260,8 @@
 void
 TestThresholdPreambleDetectionWithoutFrameCapture::RxSuccess(Ptr<const WifiPsdu> psdu,
                                                              RxSignalInfo rxSignalInfo,
-                                                             WifiTxVector txVector,
-                                                             std::vector<bool> statusPerMpdu)
+                                                             const WifiTxVector& txVector,
+                                                             const std::vector<bool>& statusPerMpdu)
 {
     NS_LOG_FUNCTION(this << *psdu << rxSignalInfo << txVector);
     m_countRxSuccess++;
@@ -299,13 +300,13 @@
     m_phy->AssignStreams(streamNumber);
 
     // RX power > CCA-ED > CCA-PD
-    dBm_u rxPower = -50;
+    dBm_u rxPower{-50};
 
     // CASE 1: send one packet and check PHY state:
     // All reception stages should succeed and PHY state should be RX for the duration of the packet
     // minus the time to detect the preamble, otherwise it should be IDLE.
 
-    Simulator::Schedule(Seconds(1.0),
+    Simulator::Schedule(Seconds(1),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::SendPacket,
                         this,
                         rxPower,
@@ -313,30 +314,30 @@
                         7);
     // At 4us, preamble should be successfully detected and STA PHY STATE should move from IDLE to
     // CCA_BUSY
-    Simulator::Schedule(Seconds(1.0) + NanoSeconds(3999),
+    Simulator::Schedule(Seconds(1) + NanoSeconds(3999),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
-    Simulator::Schedule(Seconds(1.0) + NanoSeconds(4000),
+    Simulator::Schedule(Seconds(1) + NanoSeconds(4000),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
     // At 44us, PHY header should be successfully received and STA PHY STATE should move from
     // CCA_BUSY to RX
-    Simulator::Schedule(Seconds(1.0) + NanoSeconds(43999),
+    Simulator::Schedule(Seconds(1) + NanoSeconds(43999),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(1.0) + NanoSeconds(44000),
+    Simulator::Schedule(Seconds(1) + NanoSeconds(44000),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::RX);
     // Since it takes 152.8us to transmit the packet, PHY should be back to IDLE at time 152.8us
-    Simulator::Schedule(Seconds(1.0) + NanoSeconds(152799),
+    Simulator::Schedule(Seconds(1) + NanoSeconds(152799),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::RX);
-    Simulator::Schedule(Seconds(1.0) + NanoSeconds(152800),
+    Simulator::Schedule(Seconds(1) + NanoSeconds(152800),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
@@ -353,13 +354,13 @@
     // CCA-ED (-62 dBm). CCA_BUSY state should last for the duration of the two packets minus the
     // time to detect the preamble.
 
-    Simulator::Schedule(Seconds(2.0),
+    Simulator::Schedule(Seconds(2),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::SendPacket,
                         this,
                         rxPower,
                         1000,
                         7);
-    Simulator::Schedule(Seconds(2.0) + MicroSeconds(2.0),
+    Simulator::Schedule(Seconds(2) + MicroSeconds(2),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::SendPacket,
                         this,
                         rxPower,
@@ -367,21 +368,21 @@
                         7);
     // At 4us, no preamble is successfully detected and STA PHY STATE should move from IDLE to
     // CCA_BUSY
-    Simulator::Schedule(Seconds(2.0) + NanoSeconds(3999),
+    Simulator::Schedule(Seconds(2) + NanoSeconds(3999),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
-    Simulator::Schedule(Seconds(2.0) + NanoSeconds(4000),
+    Simulator::Schedule(Seconds(2) + NanoSeconds(4000),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
     // Since it takes 152.8us to transmit each packet, PHY should be back to IDLE at time 152.8 + 2
     // = 154.8us
-    Simulator::Schedule(Seconds(2.0) + NanoSeconds(154799),
+    Simulator::Schedule(Seconds(2) + NanoSeconds(154799),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(2.0) + NanoSeconds(154800),
+    Simulator::Schedule(Seconds(2) + NanoSeconds(154800),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
@@ -399,35 +400,35 @@
     // CCA-ED (-62 dBm). CCA_BUSY state should last for the duration of the two packets minus the
     // time to detect the preamble.
 
-    Simulator::Schedule(Seconds(3.0),
+    Simulator::Schedule(Seconds(3),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::SendPacket,
                         this,
                         rxPower,
                         1000,
                         7);
-    Simulator::Schedule(Seconds(3.0) + MicroSeconds(2.0),
+    Simulator::Schedule(Seconds(3) + MicroSeconds(2),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::SendPacket,
                         this,
-                        rxPower - 3,
+                        rxPower - dB_u{3},
                         1000,
                         7);
     // At 4us, no preamble is successfully detected, hence STA PHY STATE should move from IDLE to
     // CCA_BUSY
-    Simulator::Schedule(Seconds(3.0) + NanoSeconds(3999),
+    Simulator::Schedule(Seconds(3) + NanoSeconds(3999),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
-    Simulator::Schedule(Seconds(3.0) + NanoSeconds(4000),
+    Simulator::Schedule(Seconds(3) + NanoSeconds(4000),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
     // Since it takes 152.8us to transmit each packet, PHY should be back to IDLE at time 152.8 + 2
     // = 154.8us
-    Simulator::Schedule(Seconds(3.0) + NanoSeconds(154799),
+    Simulator::Schedule(Seconds(3) + NanoSeconds(154799),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(3.0) + NanoSeconds(154800),
+    Simulator::Schedule(Seconds(3) + NanoSeconds(154800),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
@@ -444,54 +445,54 @@
     // is higher than the threshold of 4 dB), but payload reception should fail (SNR too low to
     // decode the modulation).
 
-    Simulator::Schedule(Seconds(4.0),
+    Simulator::Schedule(Seconds(4),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::SendPacket,
                         this,
                         rxPower,
                         1000,
                         7);
-    Simulator::Schedule(Seconds(4.0) + MicroSeconds(2.0),
+    Simulator::Schedule(Seconds(4) + MicroSeconds(2),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::SendPacket,
                         this,
-                        rxPower - 6,
+                        rxPower - dB_u{6},
                         1000,
                         7);
     // At 4us, preamble should be successfully detected and STA PHY STATE should move from IDLE to
     // CCA_BUSY
-    Simulator::Schedule(Seconds(4.0) + NanoSeconds(3999),
+    Simulator::Schedule(Seconds(4) + NanoSeconds(3999),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
-    Simulator::Schedule(Seconds(4.0) + NanoSeconds(4000),
+    Simulator::Schedule(Seconds(4) + NanoSeconds(4000),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
     // At 44us, PHY header should be successfully received and STA PHY STATE should move from
     // CCA_BUSY to RX
-    Simulator::Schedule(Seconds(4.0) + NanoSeconds(43999),
+    Simulator::Schedule(Seconds(4) + NanoSeconds(43999),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(4.0) + NanoSeconds(44000),
+    Simulator::Schedule(Seconds(4) + NanoSeconds(44000),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::RX);
     // Since it takes 152.8us to transmit the packet, PHY should be back to IDLE at time 152.8us.
     // However, since there is a second packet transmitted with a power above CCA-ED (-62 dBm), PHY
     // should first be seen as CCA_BUSY for 2us.
-    Simulator::Schedule(Seconds(4.0) + NanoSeconds(152799),
+    Simulator::Schedule(Seconds(4) + NanoSeconds(152799),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::RX);
-    Simulator::Schedule(Seconds(4.0) + NanoSeconds(152800),
+    Simulator::Schedule(Seconds(4) + NanoSeconds(152800),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(4.0) + NanoSeconds(154799),
+    Simulator::Schedule(Seconds(4) + NanoSeconds(154799),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(4.0) + NanoSeconds(154800),
+    Simulator::Schedule(Seconds(4) + NanoSeconds(154800),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
@@ -508,35 +509,35 @@
     // above CCA-ED (-62 dBm). CCA_BUSY state should last for the duration of the two packets minus
     // the time to detect the preamble.
 
-    Simulator::Schedule(Seconds(5.0),
+    Simulator::Schedule(Seconds(5),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::SendPacket,
                         this,
                         rxPower,
                         1000,
                         7);
-    Simulator::Schedule(Seconds(5.0) + MicroSeconds(2.0),
+    Simulator::Schedule(Seconds(5) + MicroSeconds(2),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::SendPacket,
                         this,
-                        rxPower + static_cast<dB_u>(3.0),
+                        rxPower + dB_u{3.0},
                         1000,
                         7);
     // At 6us (hence 4us after the last signal is received), no preamble is successfully detected,
     // hence STA PHY STATE should move from IDLE to CCA_BUSY
-    Simulator::Schedule(Seconds(5.0) + NanoSeconds(5999),
+    Simulator::Schedule(Seconds(5) + NanoSeconds(5999),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
-    Simulator::Schedule(Seconds(5.0) + NanoSeconds(6000),
+    Simulator::Schedule(Seconds(5) + NanoSeconds(6000),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
     // Since it takes 152.8us to transmit each packet, PHY should be back to IDLE at time 152.8 + 2
     // = 154.8us
-    Simulator::Schedule(Seconds(5.0) + NanoSeconds(154799),
+    Simulator::Schedule(Seconds(5) + NanoSeconds(154799),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(5.0) + NanoSeconds(154800),
+    Simulator::Schedule(Seconds(5) + NanoSeconds(154800),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
@@ -549,13 +550,13 @@
                         1);
 
     // CCA-PD < RX power < CCA-ED
-    rxPower = -70;
+    rxPower = dBm_u{-70};
 
     // CASE 6: send one packet and check PHY state:
     // All reception stages should succeed and PHY state should be RX for the duration of the packet
     // minus the time to detect the preamble, otherwise it should be IDLE.
 
-    Simulator::Schedule(Seconds(6.0),
+    Simulator::Schedule(Seconds(6),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::SendPacket,
                         this,
                         rxPower,
@@ -563,30 +564,30 @@
                         7);
     // At 4us, preamble should be successfully detected and STA PHY STATE should move from IDLE to
     // CCA_BUSY
-    Simulator::Schedule(Seconds(6.0) + NanoSeconds(3999),
+    Simulator::Schedule(Seconds(6) + NanoSeconds(3999),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
-    Simulator::Schedule(Seconds(6.0) + NanoSeconds(4000),
+    Simulator::Schedule(Seconds(6) + NanoSeconds(4000),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
     // At 44us, PHY header should be successfully received and STA PHY STATE should move from
     // CCA_BUSY to RX
-    Simulator::Schedule(Seconds(6.0) + NanoSeconds(43999),
+    Simulator::Schedule(Seconds(6) + NanoSeconds(43999),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(6.0) + NanoSeconds(44000),
+    Simulator::Schedule(Seconds(6) + NanoSeconds(44000),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::RX);
     // Since it takes 152.8us to transmit the packet, PHY should be back to IDLE at time 152.8us
-    Simulator::Schedule(Seconds(6.0) + NanoSeconds(152799),
+    Simulator::Schedule(Seconds(6) + NanoSeconds(152799),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::RX);
-    Simulator::Schedule(Seconds(6.0) + NanoSeconds(152800),
+    Simulator::Schedule(Seconds(6) + NanoSeconds(152800),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
@@ -603,20 +604,20 @@
     // a valid OFDM transmission at a receive level greater than or equal to the minimum modulation
     // and coding rate sensitivity (–82 dBm for 20 MHz channel spacing).
 
-    Simulator::Schedule(Seconds(7.0),
+    Simulator::Schedule(Seconds(7),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::SendPacket,
                         this,
                         rxPower,
                         1000,
                         7);
-    Simulator::Schedule(Seconds(7.0) + MicroSeconds(2.0),
+    Simulator::Schedule(Seconds(7) + MicroSeconds(2),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::SendPacket,
                         this,
                         rxPower,
                         1000,
                         7);
     // At 4us, STA PHY STATE should stay IDLE
-    Simulator::Schedule(Seconds(7.0) + MicroSeconds(4.0),
+    Simulator::Schedule(Seconds(7) + MicroSeconds(4),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
@@ -635,20 +636,20 @@
     // greater than or equal to the minimum modulation and coding rate sensitivity (–82 dBm for 20
     // MHz channel spacing).
 
-    Simulator::Schedule(Seconds(8.0),
+    Simulator::Schedule(Seconds(8),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::SendPacket,
                         this,
                         rxPower,
                         1000,
                         7);
-    Simulator::Schedule(Seconds(8.0) + MicroSeconds(2.0),
+    Simulator::Schedule(Seconds(8) + MicroSeconds(2),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::SendPacket,
                         this,
-                        rxPower - 3,
+                        rxPower - dB_u{3},
                         1000,
                         7);
     // At 4us, STA PHY STATE should stay IDLE
-    Simulator::Schedule(Seconds(8.0) + MicroSeconds(4.0),
+    Simulator::Schedule(Seconds(8) + MicroSeconds(4),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
@@ -665,45 +666,45 @@
     // is higher than the threshold of 4 dB), but payload reception should fail (SNR too low to
     // decode the modulation).
 
-    Simulator::Schedule(Seconds(9.0),
+    Simulator::Schedule(Seconds(9),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::SendPacket,
                         this,
                         rxPower,
                         1000,
                         7);
-    Simulator::Schedule(Seconds(9.0) + MicroSeconds(2.0),
+    Simulator::Schedule(Seconds(9) + MicroSeconds(2),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::SendPacket,
                         this,
-                        rxPower - 6,
+                        rxPower - dB_u{6},
                         1000,
                         7);
     // At 4us, preamble should be successfully detected and STA PHY STATE should move from IDLE to
     // CCA_BUSY
-    Simulator::Schedule(Seconds(9.0) + NanoSeconds(3999),
+    Simulator::Schedule(Seconds(9) + NanoSeconds(3999),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
-    Simulator::Schedule(Seconds(9.0) + NanoSeconds(4000),
+    Simulator::Schedule(Seconds(9) + NanoSeconds(4000),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
     // At 44us, PHY header should be successfully received and STA PHY STATE should move from
     // CCA_BUSY to RX
-    Simulator::Schedule(Seconds(9.0) + NanoSeconds(43999),
+    Simulator::Schedule(Seconds(9) + NanoSeconds(43999),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(9.0) + NanoSeconds(44000),
+    Simulator::Schedule(Seconds(9) + NanoSeconds(44000),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::RX);
     // Since it takes 152.8us to transmit the packet, PHY should be back to CCA_BUSY at time
     // 152.8us.
-    Simulator::Schedule(Seconds(9.0) + NanoSeconds(152799),
+    Simulator::Schedule(Seconds(9) + NanoSeconds(152799),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::RX);
-    Simulator::Schedule(Seconds(9.0) + NanoSeconds(152800),
+    Simulator::Schedule(Seconds(9) + NanoSeconds(152800),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
@@ -719,20 +720,20 @@
     // lower than the threshold of 4 dB), and PHY state should stay IDLE since the total energy is
     // below CCA-ED (-62 dBm).
 
-    Simulator::Schedule(Seconds(10.0),
+    Simulator::Schedule(Seconds(10),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::SendPacket,
                         this,
                         rxPower,
                         1000,
                         7);
-    Simulator::Schedule(Seconds(10.0) + MicroSeconds(2.0),
+    Simulator::Schedule(Seconds(10) + MicroSeconds(2),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::SendPacket,
                         this,
-                        rxPower + static_cast<dB_u>(3.0),
+                        rxPower + dB_u{3.0},
                         1000,
                         7);
     // At 4us, STA PHY STATE should stay IDLE
-    Simulator::Schedule(Seconds(10.0) + MicroSeconds(4.0),
+    Simulator::Schedule(Seconds(10) + MicroSeconds(4),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
@@ -748,9 +749,9 @@
     // detection (-82 dBm) and check PHY state: preamble detection should succeed and PHY state
     // should move to RX.
 
-    rxPower = -81;
+    rxPower = dBm_u{-81};
 
-    Simulator::Schedule(Seconds(11.0),
+    Simulator::Schedule(Seconds(11),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::SendPacket,
                         this,
                         rxPower,
@@ -758,49 +759,49 @@
                         7);
     // At 4us, preamble should be successfully detected and STA PHY STATE should move from IDLE to
     // CCA_BUSY
-    Simulator::Schedule(Seconds(11.0) + NanoSeconds(3999),
+    Simulator::Schedule(Seconds(11) + NanoSeconds(3999),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
-    Simulator::Schedule(Seconds(11.0) + NanoSeconds(4000),
+    Simulator::Schedule(Seconds(11) + NanoSeconds(4000),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
     // At 44us, PHY header should be successfully received and STA PHY STATE should move from
     // CCA_BUSY to RX
-    Simulator::Schedule(Seconds(11.0) + NanoSeconds(43999),
+    Simulator::Schedule(Seconds(11) + NanoSeconds(43999),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(11.0) + NanoSeconds(44000),
+    Simulator::Schedule(Seconds(11) + NanoSeconds(44000),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::RX);
     // Since it takes 152.8us to transmit the packet, PHY should be back to IDLE at time 152.8us.
-    Simulator::Schedule(Seconds(11.0) + NanoSeconds(152799),
+    Simulator::Schedule(Seconds(11) + NanoSeconds(152799),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::RX);
-    Simulator::Schedule(Seconds(11.0) + NanoSeconds(152800),
+    Simulator::Schedule(Seconds(11) + NanoSeconds(152800),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
 
     // RX power < CCA-PD < CCA-ED
-    rxPower = -83;
+    rxPower = dBm_u{-83};
 
     // CASE 12: send one packet with a power slightly below the minimum RSSI needed for the preamble
     // detection (-82 dBm) and check PHY state: preamble detection should fail and PHY should be
     // kept in IDLE state.
 
-    Simulator::Schedule(Seconds(12.0),
+    Simulator::Schedule(Seconds(12),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::SendPacket,
                         this,
                         rxPower,
                         1000,
                         7);
     // At 4us, STA PHY state should be IDLE
-    Simulator::Schedule(Seconds(12.0) + MicroSeconds(4.0),
+    Simulator::Schedule(Seconds(12) + MicroSeconds(4),
                         &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
@@ -810,10 +811,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Preamble detection test w/o frame capture
+ * @brief Preamble detection test w/o frame capture
  */
 class TestThresholdPreambleDetectionWithFrameCapture : public WifiPhyReceptionTest
 {
@@ -825,18 +826,18 @@
 
     /**
      * Spectrum wifi receive success function
-     * \param psdu the PSDU
-     * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
-     * \param txVector the transmit vector
-     * \param statusPerMpdu reception status per MPDU
+     * @param psdu the PSDU
+     * @param rxSignalInfo the info on the received signal (\see RxSignalInfo)
+     * @param txVector the transmit vector
+     * @param statusPerMpdu reception status per MPDU
      */
     void RxSuccess(Ptr<const WifiPsdu> psdu,
                    RxSignalInfo rxSignalInfo,
-                   WifiTxVector txVector,
-                   std::vector<bool> statusPerMpdu);
+                   const WifiTxVector& txVector,
+                   const std::vector<bool>& statusPerMpdu);
     /**
      * Spectrum wifi receive failure function
-     * \param psdu the PSDU
+     * @param psdu the PSDU
      */
     void RxFailure(Ptr<const WifiPsdu> psdu);
     uint32_t m_countRxSuccess{0}; ///< count RX success
@@ -847,8 +848,8 @@
 
     /**
      * Check the number of received packets
-     * \param expectedSuccessCount the number of successfully received packets
-     * \param expectedFailureCount the number of unsuccessfuly received packets
+     * @param expectedSuccessCount the number of successfully received packets
+     * @param expectedFailureCount the number of unsuccessfuly received packets
      */
     void CheckRxPacketCount(uint32_t expectedSuccessCount, uint32_t expectedFailureCount);
 };
@@ -874,8 +875,8 @@
 void
 TestThresholdPreambleDetectionWithFrameCapture::RxSuccess(Ptr<const WifiPsdu> psdu,
                                                           RxSignalInfo rxSignalInfo,
-                                                          WifiTxVector txVector,
-                                                          std::vector<bool> statusPerMpdu)
+                                                          const WifiTxVector& txVector,
+                                                          const std::vector<bool>& statusPerMpdu)
 {
     NS_LOG_FUNCTION(this << *psdu << txVector);
     m_countRxSuccess++;
@@ -919,13 +920,13 @@
     m_phy->AssignStreams(streamNumber);
 
     // RX power > CCA-ED > CCA-PD
-    dBm_u rxPower = -50;
+    dBm_u rxPower{-50};
 
     // CASE 1: send one packet and check PHY state:
     // All reception stages should succeed and PHY state should be RX for the duration of the packet
     // minus the time to detect the preamble, otherwise it should be IDLE.
 
-    Simulator::Schedule(Seconds(1.0),
+    Simulator::Schedule(Seconds(1),
                         &TestThresholdPreambleDetectionWithFrameCapture::SendPacket,
                         this,
                         rxPower,
@@ -933,30 +934,30 @@
                         7);
     // At 4us, preamble should be successfully detected and STA PHY STATE should move from IDLE to
     // CCA_BUSY
-    Simulator::Schedule(Seconds(1.0) + NanoSeconds(3999),
+    Simulator::Schedule(Seconds(1) + NanoSeconds(3999),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
-    Simulator::Schedule(Seconds(1.0) + NanoSeconds(4000),
+    Simulator::Schedule(Seconds(1) + NanoSeconds(4000),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
     // At 44us, PHY header should be successfully received and STA PHY STATE should move from
     // CCA_BUSY to RX
-    Simulator::Schedule(Seconds(1.0) + NanoSeconds(43999),
+    Simulator::Schedule(Seconds(1) + NanoSeconds(43999),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(1.0) + NanoSeconds(44000),
+    Simulator::Schedule(Seconds(1) + NanoSeconds(44000),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::RX);
     // Since it takes 152.8us to transmit the packet, PHY should be back to IDLE at time 152.8us
-    Simulator::Schedule(Seconds(1.0) + NanoSeconds(152799),
+    Simulator::Schedule(Seconds(1) + NanoSeconds(152799),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::RX);
-    Simulator::Schedule(Seconds(1.0) + NanoSeconds(152800),
+    Simulator::Schedule(Seconds(1) + NanoSeconds(152800),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
@@ -973,13 +974,13 @@
     // CCA-ED (-62 dBm). CCA_BUSY state should last for the duration of the two packets minus the
     // time to detect the preamble.
 
-    Simulator::Schedule(Seconds(2.0),
+    Simulator::Schedule(Seconds(2),
                         &TestThresholdPreambleDetectionWithFrameCapture::SendPacket,
                         this,
                         rxPower,
                         1000,
                         7);
-    Simulator::Schedule(Seconds(2.0) + MicroSeconds(2.0),
+    Simulator::Schedule(Seconds(2) + MicroSeconds(2),
                         &TestThresholdPreambleDetectionWithFrameCapture::SendPacket,
                         this,
                         rxPower,
@@ -987,21 +988,21 @@
                         7);
     // At 4us, no preamble is successfully detected, hence STA PHY STATE should move from IDLE to
     // CCA_BUSY
-    Simulator::Schedule(Seconds(2.0) + NanoSeconds(3999),
+    Simulator::Schedule(Seconds(2) + NanoSeconds(3999),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
-    Simulator::Schedule(Seconds(2.0) + NanoSeconds(4000),
+    Simulator::Schedule(Seconds(2) + NanoSeconds(4000),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
     // Since it takes 152.8us to transmit each packet, PHY should be back to IDLE at time 152.8 + 2
     // = 154.8us
-    Simulator::Schedule(Seconds(2.0) + NanoSeconds(154799),
+    Simulator::Schedule(Seconds(2) + NanoSeconds(154799),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(2.0) + NanoSeconds(154800),
+    Simulator::Schedule(Seconds(2) + NanoSeconds(154800),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
@@ -1019,35 +1020,35 @@
     // CCA-ED (-62 dBm). CCA_BUSY state should last for the duration of the two packets minus the
     // time to detect the preamble.
 
-    Simulator::Schedule(Seconds(3.0),
+    Simulator::Schedule(Seconds(3),
                         &TestThresholdPreambleDetectionWithFrameCapture::SendPacket,
                         this,
                         rxPower,
                         1000,
                         7);
-    Simulator::Schedule(Seconds(3.0) + MicroSeconds(2.0),
+    Simulator::Schedule(Seconds(3) + MicroSeconds(2),
                         &TestThresholdPreambleDetectionWithFrameCapture::SendPacket,
                         this,
-                        rxPower - 3,
+                        rxPower - dB_u{3},
                         1000,
                         7);
     // At 4us, no preamble is successfully detected, hence STA PHY STATE should move from IDLE to
     // CCA_BUSY
-    Simulator::Schedule(Seconds(3.0) + NanoSeconds(3999),
+    Simulator::Schedule(Seconds(3) + NanoSeconds(3999),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
-    Simulator::Schedule(Seconds(3.0) + NanoSeconds(4000),
+    Simulator::Schedule(Seconds(3) + NanoSeconds(4000),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
     // Since it takes 152.8us to transmit each packet, PHY should be back to IDLE at time 152.8 + 2
     // = 154.8us
-    Simulator::Schedule(Seconds(3.0) + NanoSeconds(154799),
+    Simulator::Schedule(Seconds(3) + NanoSeconds(154799),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(3.0) + NanoSeconds(154800),
+    Simulator::Schedule(Seconds(3) + NanoSeconds(154800),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
@@ -1064,54 +1065,54 @@
     // is higher than the threshold of 4 dB), but payload reception should fail (SNR too low to
     // decode the modulation).
 
-    Simulator::Schedule(Seconds(4.0),
+    Simulator::Schedule(Seconds(4),
                         &TestThresholdPreambleDetectionWithFrameCapture::SendPacket,
                         this,
                         rxPower,
                         1000,
                         7);
-    Simulator::Schedule(Seconds(4.0) + MicroSeconds(2.0),
+    Simulator::Schedule(Seconds(4) + MicroSeconds(2),
                         &TestThresholdPreambleDetectionWithFrameCapture::SendPacket,
                         this,
-                        rxPower - 6,
+                        rxPower - dB_u{6},
                         1000,
                         7);
     // At 4us, preamble should be successfully detected and STA PHY STATE should move from IDLE to
     // CCA_BUSY
-    Simulator::Schedule(Seconds(4.0) + NanoSeconds(3999),
+    Simulator::Schedule(Seconds(4) + NanoSeconds(3999),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
-    Simulator::Schedule(Seconds(4.0) + NanoSeconds(4000),
+    Simulator::Schedule(Seconds(4) + NanoSeconds(4000),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
     // At 44us, PHY header should be successfully received and STA PHY STATE should move from
     // CCA_BUSY to RX
-    Simulator::Schedule(Seconds(4.0) + NanoSeconds(43999),
+    Simulator::Schedule(Seconds(4) + NanoSeconds(43999),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(4.0) + NanoSeconds(44000),
+    Simulator::Schedule(Seconds(4) + NanoSeconds(44000),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::RX);
     // Since it takes 152.8us to transmit the packet, PHY should be back to IDLE at time 152.8us.
     // However, since there is a second packet transmitted with a power above CCA-ED (-62 dBm), PHY
     // should first be seen as CCA_BUSY for 2us.
-    Simulator::Schedule(Seconds(4.0) + NanoSeconds(152799),
+    Simulator::Schedule(Seconds(4) + NanoSeconds(152799),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::RX);
-    Simulator::Schedule(Seconds(4.0) + NanoSeconds(152800),
+    Simulator::Schedule(Seconds(4) + NanoSeconds(152800),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(4.0) + NanoSeconds(154799),
+    Simulator::Schedule(Seconds(4) + NanoSeconds(154799),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(4.0) + NanoSeconds(154800),
+    Simulator::Schedule(Seconds(4) + NanoSeconds(154800),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
@@ -1128,39 +1129,39 @@
     // lower than the threshold of 4 dB), PHY state should be CCA_BUSY since the total energy is
     // above CCA-ED (-62 dBm).
 
-    Simulator::Schedule(Seconds(5.0),
+    Simulator::Schedule(Seconds(5),
                         &TestThresholdPreambleDetectionWithFrameCapture::SendPacket,
                         this,
                         rxPower,
                         1000,
                         7);
-    Simulator::Schedule(Seconds(5.0) + MicroSeconds(2.0),
+    Simulator::Schedule(Seconds(5) + MicroSeconds(2),
                         &TestThresholdPreambleDetectionWithFrameCapture::SendPacket,
                         this,
-                        rxPower + static_cast<dB_u>(3.0),
+                        rxPower + dB_u{3.0},
                         1000,
                         7);
     // At 4us, STA PHY STATE should stay IDLE
-    Simulator::Schedule(Seconds(5.0) + MicroSeconds(4.0),
+    Simulator::Schedule(Seconds(5) + MicroSeconds(4),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
     // At 6us, STA PHY STATE should move from IDLE to CCA_BUSY
-    Simulator::Schedule(Seconds(5.0) + NanoSeconds(5999),
+    Simulator::Schedule(Seconds(5) + NanoSeconds(5999),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
-    Simulator::Schedule(Seconds(5.0) + NanoSeconds(6000),
+    Simulator::Schedule(Seconds(5) + NanoSeconds(6000),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
     // Since it takes 152.8us to transmit each packet, PHY should be back to IDLE at time 152.8 + 2
     // = 154.8us
-    Simulator::Schedule(Seconds(5.0) + NanoSeconds(154799),
+    Simulator::Schedule(Seconds(5) + NanoSeconds(154799),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(5.0) + NanoSeconds(154800),
+    Simulator::Schedule(Seconds(5) + NanoSeconds(154800),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
@@ -1178,50 +1179,50 @@
     // which is higher than the threshold of 4 dB), Payload reception should fail (SNR too low to
     // decode the modulation).
 
-    Simulator::Schedule(Seconds(6.0),
+    Simulator::Schedule(Seconds(6),
                         &TestThresholdPreambleDetectionWithFrameCapture::SendPacket,
                         this,
                         rxPower,
                         1000,
                         7);
-    Simulator::Schedule(Seconds(6.0) + MicroSeconds(2.0),
+    Simulator::Schedule(Seconds(6) + MicroSeconds(2),
                         &TestThresholdPreambleDetectionWithFrameCapture::SendPacket,
                         this,
-                        rxPower + static_cast<dB_u>(6.0),
+                        rxPower + dB_u{6.0},
                         1000,
                         7);
     // At 4us, STA PHY STATE should stay IDLE
-    Simulator::Schedule(Seconds(6.0) + MicroSeconds(4.0),
+    Simulator::Schedule(Seconds(6) + MicroSeconds(4),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
     // At 6us, preamble should be successfully detected and STA PHY STATE should move from IDLE to
     // CCA_BUSY
-    Simulator::Schedule(Seconds(6.0) + NanoSeconds(5999),
+    Simulator::Schedule(Seconds(6) + NanoSeconds(5999),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
-    Simulator::Schedule(Seconds(6.0) + NanoSeconds(6000),
+    Simulator::Schedule(Seconds(6) + NanoSeconds(6000),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
     // At 46us, PHY header should be successfully received and STA PHY STATE should move from
     // CCA_BUSY to RX
-    Simulator::Schedule(Seconds(6.0) + NanoSeconds(45999),
+    Simulator::Schedule(Seconds(6) + NanoSeconds(45999),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(6.0) + NanoSeconds(46000),
+    Simulator::Schedule(Seconds(6) + NanoSeconds(46000),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::RX);
     // Since it takes 152.8us to transmit each packet, PHY should be back to IDLE at time 152.8 + 2
     // = 154.8us
-    Simulator::Schedule(Seconds(6.0) + NanoSeconds(154799),
+    Simulator::Schedule(Seconds(6) + NanoSeconds(154799),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::RX);
-    Simulator::Schedule(Seconds(6.0) + NanoSeconds(154800),
+    Simulator::Schedule(Seconds(6) + NanoSeconds(154800),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
@@ -1238,13 +1239,13 @@
     // CCA-ED (-62 dBm). CCA_BUSY state should last for the duration of the two packets minus the
     // time to detect the preamble.
 
-    Simulator::Schedule(Seconds(7.0),
+    Simulator::Schedule(Seconds(7),
                         &TestThresholdPreambleDetectionWithFrameCapture::SendPacket,
                         this,
                         rxPower,
                         1000,
                         7);
-    Simulator::Schedule(Seconds(7.0),
+    Simulator::Schedule(Seconds(7),
                         &TestThresholdPreambleDetectionWithFrameCapture::SendPacket,
                         this,
                         rxPower,
@@ -1252,21 +1253,21 @@
                         7);
     // At 4us, no preamble is successfully detected, hence STA PHY STATE should move from IDLE to
     // CCA_BUSY
-    Simulator::Schedule(Seconds(7.0) + NanoSeconds(3999),
+    Simulator::Schedule(Seconds(7) + NanoSeconds(3999),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
-    Simulator::Schedule(Seconds(7.0) + NanoSeconds(4000),
+    Simulator::Schedule(Seconds(7) + NanoSeconds(4000),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
     // Since it takes 152.8us to transmit each packet, PHY should be back to IDLE at time 152.8 + 2
     // = 154.8us
-    Simulator::Schedule(Seconds(7.0) + NanoSeconds(152799),
+    Simulator::Schedule(Seconds(7) + NanoSeconds(152799),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(7.0) + NanoSeconds(152800),
+    Simulator::Schedule(Seconds(7) + NanoSeconds(152800),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
@@ -1284,34 +1285,34 @@
     // CCA-ED (-62 dBm). CCA_BUSY state should last for the duration of the two packets minus the
     // time to detect the preamble.
 
-    Simulator::Schedule(Seconds(8.0),
+    Simulator::Schedule(Seconds(8),
                         &TestThresholdPreambleDetectionWithFrameCapture::SendPacket,
                         this,
                         rxPower,
                         1000,
                         7);
-    Simulator::Schedule(Seconds(8.0),
+    Simulator::Schedule(Seconds(8),
                         &TestThresholdPreambleDetectionWithFrameCapture::SendPacket,
                         this,
-                        rxPower - 3,
+                        rxPower - dB_u{3},
                         1000,
                         7);
     // At 4us, no preamble is successfully detected, hence STA PHY STATE should move from IDLE to
     // CCA_BUSY
-    Simulator::Schedule(Seconds(8.0) + NanoSeconds(3999),
+    Simulator::Schedule(Seconds(8) + NanoSeconds(3999),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
-    Simulator::Schedule(Seconds(8.0) + NanoSeconds(4000),
+    Simulator::Schedule(Seconds(8) + NanoSeconds(4000),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
     // Since it takes 152.8us to transmit each packet, PHY should be back to IDLE at time 152.8 us
-    Simulator::Schedule(Seconds(8.0) + NanoSeconds(152799),
+    Simulator::Schedule(Seconds(8) + NanoSeconds(152799),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(8.0) + NanoSeconds(152800),
+    Simulator::Schedule(Seconds(8) + NanoSeconds(152800),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
@@ -1328,44 +1329,44 @@
     // is higher than the threshold of 4 dB), but payload reception should fail (SNR too low to
     // decode the modulation).
 
-    Simulator::Schedule(Seconds(9.0),
+    Simulator::Schedule(Seconds(9),
                         &TestThresholdPreambleDetectionWithFrameCapture::SendPacket,
                         this,
                         rxPower,
                         1000,
                         7);
-    Simulator::Schedule(Seconds(9.0),
+    Simulator::Schedule(Seconds(9),
                         &TestThresholdPreambleDetectionWithFrameCapture::SendPacket,
                         this,
-                        rxPower - 6,
+                        rxPower - dB_u{6},
                         1000,
                         7);
     // At 4us, preamble should be successfully detected and STA PHY STATE should move from IDLE to
     // CCA_BUSY
-    Simulator::Schedule(Seconds(9.0) + NanoSeconds(3999),
+    Simulator::Schedule(Seconds(9) + NanoSeconds(3999),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
-    Simulator::Schedule(Seconds(9.0) + NanoSeconds(4000),
+    Simulator::Schedule(Seconds(9) + NanoSeconds(4000),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
     // At 44us, PHY header should be successfully received and STA PHY STATE should move from
     // CCA_BUSY to RX
-    Simulator::Schedule(Seconds(9.0) + NanoSeconds(43999),
+    Simulator::Schedule(Seconds(9) + NanoSeconds(43999),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(9.0) + NanoSeconds(44000),
+    Simulator::Schedule(Seconds(9) + NanoSeconds(44000),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::RX);
     // Since it takes 152.8us to transmit the packets, PHY should be back to IDLE at time 152.8us.
-    Simulator::Schedule(Seconds(9.0) + NanoSeconds(152799),
+    Simulator::Schedule(Seconds(9) + NanoSeconds(152799),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::RX);
-    Simulator::Schedule(Seconds(9.0) + NanoSeconds(152800),
+    Simulator::Schedule(Seconds(9) + NanoSeconds(152800),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
@@ -1382,34 +1383,34 @@
     // lower than the threshold of 4 dB), PHY state should be CCA_BUSY since the total energy is
     // above CCA-ED (-62 dBm).
 
-    Simulator::Schedule(Seconds(10.0),
+    Simulator::Schedule(Seconds(10),
                         &TestThresholdPreambleDetectionWithFrameCapture::SendPacket,
                         this,
                         rxPower,
                         1000,
                         7);
-    Simulator::Schedule(Seconds(10.0),
+    Simulator::Schedule(Seconds(10),
                         &TestThresholdPreambleDetectionWithFrameCapture::SendPacket,
                         this,
-                        rxPower + static_cast<dB_u>(3.0),
+                        rxPower + dB_u{3.0},
                         1000,
                         7);
     // At 4us, no preamble is successfully detected, hence STA PHY STATE should move from IDLE to
     // CCA_BUSY
-    Simulator::Schedule(Seconds(10.0) + NanoSeconds(3999),
+    Simulator::Schedule(Seconds(10) + NanoSeconds(3999),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
-    Simulator::Schedule(Seconds(10.0) + NanoSeconds(4000),
+    Simulator::Schedule(Seconds(10) + NanoSeconds(4000),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
     // Since it takes 152.8us to transmit each packet, PHY should be back to IDLE at time 152.8 us
-    Simulator::Schedule(Seconds(10.0) + NanoSeconds(152799),
+    Simulator::Schedule(Seconds(10) + NanoSeconds(152799),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(10.0) + NanoSeconds(152800),
+    Simulator::Schedule(Seconds(10) + NanoSeconds(152800),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
@@ -1427,44 +1428,44 @@
     // which is higher than the threshold of 4 dB), Payload reception should fail (SNR too low to
     // decode the modulation).
 
-    Simulator::Schedule(Seconds(11.0),
+    Simulator::Schedule(Seconds(11),
                         &TestThresholdPreambleDetectionWithFrameCapture::SendPacket,
                         this,
                         rxPower,
                         1000,
                         7);
-    Simulator::Schedule(Seconds(11.0),
+    Simulator::Schedule(Seconds(11),
                         &TestThresholdPreambleDetectionWithFrameCapture::SendPacket,
                         this,
-                        rxPower + static_cast<dB_u>(6.0),
+                        rxPower + dB_u{6.0},
                         1000,
                         7);
     // At 4us, preamble should be successfully detected and STA PHY STATE should move from IDLE to
     // CCA_BUSY
-    Simulator::Schedule(Seconds(11.0) + NanoSeconds(3999),
+    Simulator::Schedule(Seconds(11) + NanoSeconds(3999),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
-    Simulator::Schedule(Seconds(11.0) + NanoSeconds(4000),
+    Simulator::Schedule(Seconds(11) + NanoSeconds(4000),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
     // At 44us, PHY header should be successfully received and STA PHY STATE should move from
     // CCA_BUSY to RX
-    Simulator::Schedule(Seconds(11.0) + NanoSeconds(43999),
+    Simulator::Schedule(Seconds(11) + NanoSeconds(43999),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(11.0) + NanoSeconds(44000),
+    Simulator::Schedule(Seconds(11) + NanoSeconds(44000),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::RX);
     // Since it takes 152.8us to transmit each packet, PHY should be back to IDLE at time 152.8 us
-    Simulator::Schedule(Seconds(11.0) + NanoSeconds(152799),
+    Simulator::Schedule(Seconds(11) + NanoSeconds(152799),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::RX);
-    Simulator::Schedule(Seconds(11.0) + NanoSeconds(152800),
+    Simulator::Schedule(Seconds(11) + NanoSeconds(152800),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
@@ -1476,13 +1477,13 @@
                         4);
 
     // CCA-PD < RX power < CCA-ED
-    rxPower = -70;
+    rxPower = dBm_u{-70};
 
     // CASE 12: send one packet and check PHY state:
     // All reception stages should succeed and PHY state should be RX for the duration of the packet
     // minus the time to detect the preamble, otherwise it should be IDLE.
 
-    Simulator::Schedule(Seconds(12.0),
+    Simulator::Schedule(Seconds(12),
                         &TestThresholdPreambleDetectionWithFrameCapture::SendPacket,
                         this,
                         rxPower,
@@ -1490,30 +1491,30 @@
                         7);
     // At 4us, preamble should be successfully detected and STA PHY STATE should move from IDLE to
     // CCA_BUSY
-    Simulator::Schedule(Seconds(12.0) + NanoSeconds(3999),
+    Simulator::Schedule(Seconds(12) + NanoSeconds(3999),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
-    Simulator::Schedule(Seconds(12.0) + NanoSeconds(4000),
+    Simulator::Schedule(Seconds(12) + NanoSeconds(4000),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
     // At 44us, PHY header should be successfully received and STA PHY STATE should move from
     // CCA_BUSY to RX
-    Simulator::Schedule(Seconds(12.0) + NanoSeconds(43999),
+    Simulator::Schedule(Seconds(12) + NanoSeconds(43999),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(12.0) + NanoSeconds(44000),
+    Simulator::Schedule(Seconds(12) + NanoSeconds(44000),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::RX);
     // Since it takes 152.8us to transmit the packet, PHY should be back to IDLE at time 152.8us
-    Simulator::Schedule(Seconds(12.0) + NanoSeconds(152799),
+    Simulator::Schedule(Seconds(12) + NanoSeconds(152799),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::RX);
-    Simulator::Schedule(Seconds(12.0) + NanoSeconds(152800),
+    Simulator::Schedule(Seconds(12) + NanoSeconds(152800),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
@@ -1530,20 +1531,20 @@
     // a valid OFDM transmission at a receive level greater than or equal to the minimum modulation
     // and coding rate sensitivity (–82 dBm for 20 MHz channel spacing).
 
-    Simulator::Schedule(Seconds(13.0),
+    Simulator::Schedule(Seconds(13),
                         &TestThresholdPreambleDetectionWithFrameCapture::SendPacket,
                         this,
                         rxPower,
                         1000,
                         7);
-    Simulator::Schedule(Seconds(13.0) + MicroSeconds(2.0),
+    Simulator::Schedule(Seconds(13) + MicroSeconds(2),
                         &TestThresholdPreambleDetectionWithFrameCapture::SendPacket,
                         this,
                         rxPower,
                         1000,
                         7);
     // At 4us, STA PHY STATE should stay IDLE
-    Simulator::Schedule(Seconds(13.0) + MicroSeconds(4.0),
+    Simulator::Schedule(Seconds(13) + MicroSeconds(4),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
@@ -1562,20 +1563,20 @@
     // greater than or equal to the minimum modulation and coding rate sensitivity (–82 dBm for 20
     // MHz channel spacing).
 
-    Simulator::Schedule(Seconds(14.0),
+    Simulator::Schedule(Seconds(14),
                         &TestThresholdPreambleDetectionWithFrameCapture::SendPacket,
                         this,
                         rxPower,
                         1000,
                         7);
-    Simulator::Schedule(Seconds(14.0) + MicroSeconds(2.0),
+    Simulator::Schedule(Seconds(14) + MicroSeconds(2),
                         &TestThresholdPreambleDetectionWithFrameCapture::SendPacket,
                         this,
-                        rxPower - 3,
+                        rxPower - dB_u{3},
                         1000,
                         7);
     // At 4us, STA PHY STATE should stay IDLE
-    Simulator::Schedule(Seconds(14.0) + MicroSeconds(4.0),
+    Simulator::Schedule(Seconds(14) + MicroSeconds(4),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
@@ -1592,45 +1593,45 @@
     // is higher than the threshold of 4 dB), but payload reception should fail (SNR too low to
     // decode the modulation).
 
-    Simulator::Schedule(Seconds(15.0),
+    Simulator::Schedule(Seconds(15),
                         &TestThresholdPreambleDetectionWithFrameCapture::SendPacket,
                         this,
                         rxPower,
                         1000,
                         7);
-    Simulator::Schedule(Seconds(15.0) + MicroSeconds(2.0),
+    Simulator::Schedule(Seconds(15) + MicroSeconds(2),
                         &TestThresholdPreambleDetectionWithFrameCapture::SendPacket,
                         this,
-                        rxPower - 6,
+                        rxPower - dB_u{6},
                         1000,
                         7);
     // At 4us, preamble should be successfully detected and STA PHY STATE should move from IDLE to
     // CCA_BUSY
-    Simulator::Schedule(Seconds(15.0) + NanoSeconds(3999),
+    Simulator::Schedule(Seconds(15) + NanoSeconds(3999),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
-    Simulator::Schedule(Seconds(15.0) + NanoSeconds(4000),
+    Simulator::Schedule(Seconds(15) + NanoSeconds(4000),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
     // At 44us, PHY header should be successfully received and STA PHY STATE should move from
     // CCA_BUSY to RX
-    Simulator::Schedule(Seconds(15.0) + NanoSeconds(43999),
+    Simulator::Schedule(Seconds(15) + NanoSeconds(43999),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(15.0) + NanoSeconds(44000),
+    Simulator::Schedule(Seconds(15) + NanoSeconds(44000),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::RX);
     // Since it takes 152.8us to transmit the packet, PHY should be back to CCA_BUSY at time
     // 152.8us.
-    Simulator::Schedule(Seconds(15.0) + NanoSeconds(152799),
+    Simulator::Schedule(Seconds(15) + NanoSeconds(152799),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::RX);
-    Simulator::Schedule(Seconds(15.0) + NanoSeconds(152800),
+    Simulator::Schedule(Seconds(15) + NanoSeconds(152800),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
@@ -1648,25 +1649,25 @@
     // the start of a valid OFDM transmission at a receive level greater than or equal to the
     // minimum modulation and coding rate sensitivity (–82 dBm for 20 MHz channel spacing).
 
-    Simulator::Schedule(Seconds(16.0),
+    Simulator::Schedule(Seconds(16),
                         &TestThresholdPreambleDetectionWithFrameCapture::SendPacket,
                         this,
                         rxPower,
                         1000,
                         7);
-    Simulator::Schedule(Seconds(16.0) + MicroSeconds(2.0),
+    Simulator::Schedule(Seconds(16) + MicroSeconds(2),
                         &TestThresholdPreambleDetectionWithFrameCapture::SendPacket,
                         this,
-                        rxPower + static_cast<dB_u>(3.0),
+                        rxPower + dB_u{3.0},
                         1000,
                         7);
     // At 4us, STA PHY STATE should stay IDLE
-    Simulator::Schedule(Seconds(16.0) + MicroSeconds(4.0),
+    Simulator::Schedule(Seconds(16) + MicroSeconds(4),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
     // At 6us, STA PHY STATE should be CCA_BUSY
-    Simulator::Schedule(Seconds(16.0) + MicroSeconds(6.0),
+    Simulator::Schedule(Seconds(16) + MicroSeconds(6),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
@@ -1684,50 +1685,50 @@
     // which is higher than the threshold of 4 dB), Payload reception should fail (SNR too low to
     // decode the modulation).
 
-    Simulator::Schedule(Seconds(17.0),
+    Simulator::Schedule(Seconds(17),
                         &TestThresholdPreambleDetectionWithFrameCapture::SendPacket,
                         this,
                         rxPower,
                         1000,
                         7);
-    Simulator::Schedule(Seconds(17.0) + MicroSeconds(2.0),
+    Simulator::Schedule(Seconds(17) + MicroSeconds(2),
                         &TestThresholdPreambleDetectionWithFrameCapture::SendPacket,
                         this,
-                        rxPower + static_cast<dB_u>(6.0),
+                        rxPower + dB_u{6.0},
                         1000,
                         7);
     // At 4us, STA PHY STATE should stay IDLE
-    Simulator::Schedule(Seconds(17.0) + MicroSeconds(4.0),
+    Simulator::Schedule(Seconds(17) + MicroSeconds(4),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
     // At 6us, preamble should be successfully detected and STA PHY STATE should move from IDLE to
     // CCA_BUSY
-    Simulator::Schedule(Seconds(17.0) + NanoSeconds(5999),
+    Simulator::Schedule(Seconds(17) + NanoSeconds(5999),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
-    Simulator::Schedule(Seconds(17.0) + NanoSeconds(6000),
+    Simulator::Schedule(Seconds(17) + NanoSeconds(6000),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
     // At 46us, PHY header should be successfully received and STA PHY STATE should move from
     // CCA_BUSY to RX
-    Simulator::Schedule(Seconds(17.0) + NanoSeconds(45999),
+    Simulator::Schedule(Seconds(17) + NanoSeconds(45999),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(17.0) + NanoSeconds(46000),
+    Simulator::Schedule(Seconds(17) + NanoSeconds(46000),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::RX);
     // Since it takes 152.8us to transmit each packet, PHY should be back to IDLE at time 152.8 + 2
     // = 154.8us
-    Simulator::Schedule(Seconds(17.0) + NanoSeconds(154799),
+    Simulator::Schedule(Seconds(17) + NanoSeconds(154799),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::RX);
-    Simulator::Schedule(Seconds(17.0) + NanoSeconds(154800),
+    Simulator::Schedule(Seconds(17) + NanoSeconds(154800),
                         &TestThresholdPreambleDetectionWithFrameCapture::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
@@ -1738,19 +1739,19 @@
                         2,
                         6);
 
-    rxPower = -50;
+    rxPower = dBm_u{-50};
     // CASE 18: send two packets with second one 50 dB higher within the 4us window
 
-    Simulator::Schedule(Seconds(18.0),
+    Simulator::Schedule(Seconds(18),
                         &TestThresholdPreambleDetectionWithFrameCapture::SendPacket,
                         this,
                         rxPower,
                         1000,
                         7);
-    Simulator::Schedule(Seconds(18.0) + MicroSeconds(2.0),
+    Simulator::Schedule(Seconds(18) + MicroSeconds(2),
                         &TestThresholdPreambleDetectionWithFrameCapture::SendPacket,
                         this,
-                        rxPower + static_cast<dB_u>(50.0),
+                        rxPower + dB_u{50.0},
                         1000,
                         7);
     // The second packet should be received successfully
@@ -1762,16 +1763,16 @@
 
     // CASE 19: send two packets with second one 10 dB higher within the 4us window
 
-    Simulator::Schedule(Seconds(19.0),
+    Simulator::Schedule(Seconds(19),
                         &TestThresholdPreambleDetectionWithFrameCapture::SendPacket,
                         this,
                         rxPower,
                         1000,
                         7);
-    Simulator::Schedule(Seconds(19.0) + MicroSeconds(2.0),
+    Simulator::Schedule(Seconds(19) + MicroSeconds(2),
                         &TestThresholdPreambleDetectionWithFrameCapture::SendPacket,
                         this,
-                        rxPower + static_cast<dB_u>(10.0),
+                        rxPower + dB_u{10.0},
                         1000,
                         7);
     // The second packet should be captured, but not decoded since SNR to low for used MCS
@@ -1783,16 +1784,16 @@
 
     // CASE 20: send two packets with second one 50 dB higher in the same time
 
-    Simulator::Schedule(Seconds(20.0),
+    Simulator::Schedule(Seconds(20),
                         &TestThresholdPreambleDetectionWithFrameCapture::SendPacket,
                         this,
                         rxPower,
                         1000,
                         7);
-    Simulator::Schedule(Seconds(20.0),
+    Simulator::Schedule(Seconds(20),
                         &TestThresholdPreambleDetectionWithFrameCapture::SendPacket,
                         this,
-                        rxPower + static_cast<dB_u>(50.0),
+                        rxPower + dB_u{50.0},
                         1000,
                         7);
     // The second packet should be received successfully, same as in CASE 13
@@ -1804,16 +1805,16 @@
 
     // CASE 21: send two packets with second one 10 dB higher in the same time
 
-    Simulator::Schedule(Seconds(21.0),
+    Simulator::Schedule(Seconds(21),
                         &TestThresholdPreambleDetectionWithFrameCapture::SendPacket,
                         this,
                         rxPower,
                         1000,
                         7);
-    Simulator::Schedule(Seconds(21.0),
+    Simulator::Schedule(Seconds(21),
                         &TestThresholdPreambleDetectionWithFrameCapture::SendPacket,
                         this,
-                        rxPower + static_cast<dB_u>(10.0),
+                        rxPower + dB_u{10.0},
                         1000,
                         7);
     // The second packet should be captured, but not decoded since SNR to low for used MCS, same as
@@ -1829,10 +1830,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Simple frame capture model test
+ * @brief Simple frame capture model test
  */
 class TestSimpleFrameCaptureModel : public WifiPhyReceptionTest
 {
@@ -1849,19 +1850,19 @@
     void Reset();
     /**
      * Spectrum wifi receive success function
-     * \param psdu the PSDU
-     * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
-     * \param txVector the transmit vector
-     * \param statusPerMpdu reception status per MPDU
+     * @param psdu the PSDU
+     * @param rxSignalInfo the info on the received signal (\see RxSignalInfo)
+     * @param txVector the transmit vector
+     * @param statusPerMpdu reception status per MPDU
      */
     void RxSuccess(Ptr<const WifiPsdu> psdu,
                    RxSignalInfo rxSignalInfo,
-                   WifiTxVector txVector,
-                   std::vector<bool> statusPerMpdu);
+                   const WifiTxVector& txVector,
+                   const std::vector<bool>& statusPerMpdu);
     /**
      * RX dropped function
-     * \param p the packet
-     * \param reason the reason
+     * @param p the packet
+     * @param reason the reason
      */
     void RxDropped(Ptr<const Packet> p, WifiPhyRxfailureReason reason);
 
@@ -1896,8 +1897,8 @@
 void
 TestSimpleFrameCaptureModel::RxSuccess(Ptr<const WifiPsdu> psdu,
                                        RxSignalInfo rxSignalInfo,
-                                       WifiTxVector txVector,
-                                       std::vector<bool> statusPerMpdu)
+                                       const WifiTxVector& txVector,
+                                       const std::vector<bool>& statusPerMpdu)
 {
     NS_LOG_FUNCTION(this << *psdu << rxSignalInfo << txVector);
     NS_ASSERT(!psdu->IsAggregate() || psdu->IsSingle());
@@ -1984,19 +1985,19 @@
     RngSeedManager::SetSeed(1);
     RngSeedManager::SetRun(1);
     int64_t streamNumber = 2;
-    dBm_u rxPower = -30;
+    dBm_u rxPower{-30};
     m_phy->AssignStreams(streamNumber);
 
     // CASE 1: send two packets with same power within the capture window:
     // PHY should not switch reception because they have same power.
 
-    Simulator::Schedule(Seconds(1.0),
+    Simulator::Schedule(Seconds(1),
                         &TestSimpleFrameCaptureModel::SendPacket,
                         this,
                         rxPower,
                         1000,
                         0);
-    Simulator::Schedule(Seconds(1.0) + MicroSeconds(10.0),
+    Simulator::Schedule(Seconds(1) + MicroSeconds(10),
                         &TestSimpleFrameCaptureModel::SendPacket,
                         this,
                         rxPower,
@@ -2008,16 +2009,16 @@
     // CASE 2: send two packets with second one 6 dB weaker within the capture window:
     // PHY should not switch reception because first one has higher power.
 
-    Simulator::Schedule(Seconds(2.0),
+    Simulator::Schedule(Seconds(2),
                         &TestSimpleFrameCaptureModel::SendPacket,
                         this,
                         rxPower,
                         1000,
                         0);
-    Simulator::Schedule(Seconds(2.0) + MicroSeconds(10.0),
+    Simulator::Schedule(Seconds(2) + MicroSeconds(10),
                         &TestSimpleFrameCaptureModel::SendPacket,
                         this,
-                        rxPower - 6,
+                        rxPower - dB_u{6},
                         1500,
                         0);
     Simulator::Schedule(Seconds(2.1),
@@ -2029,16 +2030,16 @@
     // CASE 3: send two packets with second one 6 dB higher within the capture window:
     // PHY should switch reception because the second one has a higher power.
 
-    Simulator::Schedule(Seconds(3.0),
+    Simulator::Schedule(Seconds(3),
                         &TestSimpleFrameCaptureModel::SendPacket,
                         this,
                         rxPower,
                         1000,
                         0);
-    Simulator::Schedule(Seconds(3.0) + MicroSeconds(10.0),
+    Simulator::Schedule(Seconds(3) + MicroSeconds(10),
                         &TestSimpleFrameCaptureModel::SendPacket,
                         this,
-                        rxPower + static_cast<dB_u>(6.0),
+                        rxPower + dB_u{6.0},
                         1500,
                         0);
     Simulator::Schedule(Seconds(3.1), &TestSimpleFrameCaptureModel::Expect1000BPacketDropped, this);
@@ -2051,16 +2052,16 @@
     // PHY should not switch reception because capture window duration has elapsed when the second
     // packet arrives.
 
-    Simulator::Schedule(Seconds(4.0),
+    Simulator::Schedule(Seconds(4),
                         &TestSimpleFrameCaptureModel::SendPacket,
                         this,
                         rxPower,
                         1000,
                         0);
-    Simulator::Schedule(Seconds(4.0) + MicroSeconds(25.0),
+    Simulator::Schedule(Seconds(4) + MicroSeconds(25),
                         &TestSimpleFrameCaptureModel::SendPacket,
                         this,
-                        rxPower + static_cast<dB_u>(6.0),
+                        rxPower + dB_u{6.0},
                         1500,
                         0);
     Simulator::Schedule(Seconds(4.1), &TestSimpleFrameCaptureModel::Expect1500BPacketDropped, this);
@@ -2071,10 +2072,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test PHY state upon success or failure of L-SIG and SIG-A
+ * @brief Test PHY state upon success or failure of L-SIG and SIG-A
  */
 class TestPhyHeadersReception : public WifiPhyReceptionTest
 {
@@ -2099,37 +2100,37 @@
     m_phy->AssignStreams(streamNumber);
 
     // RX power > CCA-ED
-    dBm_u rxPower = -50;
+    dBm_u rxPower{-50};
 
     // CASE 1: send one packet followed by a second one with same power between the end of the 4us
     // preamble detection window and the start of L-SIG of the first packet: reception should be
     // aborted since L-SIG cannot be decoded (SNR too low).
 
-    Simulator::Schedule(Seconds(1.0), &TestPhyHeadersReception::SendPacket, this, rxPower, 1000, 7);
-    Simulator::Schedule(Seconds(1.0) + MicroSeconds(10),
+    Simulator::Schedule(Seconds(1), &TestPhyHeadersReception::SendPacket, this, rxPower, 1000, 7);
+    Simulator::Schedule(Seconds(1) + MicroSeconds(10),
                         &TestPhyHeadersReception::SendPacket,
                         this,
                         rxPower,
                         1000,
                         7);
     // At 10 us, STA PHY STATE should be CCA_BUSY.
-    Simulator::Schedule(Seconds(1.0) + MicroSeconds(10.0),
+    Simulator::Schedule(Seconds(1) + MicroSeconds(10),
                         &TestPhyHeadersReception::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
     // At 44us (end of PHY header), STA PHY STATE should not have moved to RX and be kept to
     // CCA_BUSY.
-    Simulator::Schedule(Seconds(1.0) + NanoSeconds(44000),
+    Simulator::Schedule(Seconds(1) + NanoSeconds(44000),
                         &TestPhyHeadersReception::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
     // Since it takes 152.8us to transmit the packet, PHY should be back to IDLE at time 152.8 + 10
     // = 162.8us.
-    Simulator::Schedule(Seconds(1.0) + NanoSeconds(162799),
+    Simulator::Schedule(Seconds(1) + NanoSeconds(162799),
                         &TestPhyHeadersReception::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(1.0) + NanoSeconds(162800),
+    Simulator::Schedule(Seconds(1) + NanoSeconds(162800),
                         &TestPhyHeadersReception::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
@@ -2138,44 +2139,44 @@
     // preamble detection window and the start of L-SIG of the first packet: reception should not be
     // aborted since L-SIG can be decoded (SNR high enough).
 
-    Simulator::Schedule(Seconds(2.0), &TestPhyHeadersReception::SendPacket, this, rxPower, 1000, 7);
-    Simulator::Schedule(Seconds(2.0) + MicroSeconds(10),
+    Simulator::Schedule(Seconds(2), &TestPhyHeadersReception::SendPacket, this, rxPower, 1000, 7);
+    Simulator::Schedule(Seconds(2) + MicroSeconds(10),
                         &TestPhyHeadersReception::SendPacket,
                         this,
-                        rxPower - 3,
+                        rxPower - dB_u{3},
                         1000,
                         7);
     // At 10 us, STA PHY STATE should be CCA_BUSY.
-    Simulator::Schedule(Seconds(2.0) + MicroSeconds(10.0),
+    Simulator::Schedule(Seconds(2) + MicroSeconds(10),
                         &TestPhyHeadersReception::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
     // At 44us (end of PHY header), STA PHY STATE should have moved to RX since PHY header reception
     // should have succeeded.
-    Simulator::Schedule(Seconds(2.0) + NanoSeconds(43999),
+    Simulator::Schedule(Seconds(2) + NanoSeconds(43999),
                         &TestPhyHeadersReception::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(2.0) + NanoSeconds(44000),
+    Simulator::Schedule(Seconds(2) + NanoSeconds(44000),
                         &TestPhyHeadersReception::CheckPhyState,
                         this,
                         WifiPhyState::RX);
     // Since it takes 152.8us to transmit the packet, PHY should be back to IDLE at time 152.8us.
     // However, since there is a second packet transmitted with a power above CCA-ED (-62 dBm), PHY
     // should first be seen as CCA_BUSY for 10us.
-    Simulator::Schedule(Seconds(2.0) + NanoSeconds(152799),
+    Simulator::Schedule(Seconds(2) + NanoSeconds(152799),
                         &TestPhyHeadersReception::CheckPhyState,
                         this,
                         WifiPhyState::RX);
-    Simulator::Schedule(Seconds(2.0) + NanoSeconds(152800),
+    Simulator::Schedule(Seconds(2) + NanoSeconds(152800),
                         &TestPhyHeadersReception::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(2.0) + NanoSeconds(162799),
+    Simulator::Schedule(Seconds(2) + NanoSeconds(162799),
                         &TestPhyHeadersReception::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(2.0) + NanoSeconds(162800),
+    Simulator::Schedule(Seconds(2) + NanoSeconds(162800),
                         &TestPhyHeadersReception::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
@@ -2184,8 +2185,8 @@
     // the start of HE-SIG of the first packet: PHY header reception should not succeed but PHY
     // should stay in RX state for the duration estimated from L-SIG.
 
-    Simulator::Schedule(Seconds(3.0), &TestPhyHeadersReception::SendPacket, this, rxPower, 1000, 7);
-    Simulator::Schedule(Seconds(3.0) + MicroSeconds(25),
+    Simulator::Schedule(Seconds(3), &TestPhyHeadersReception::SendPacket, this, rxPower, 1000, 7);
+    Simulator::Schedule(Seconds(3) + MicroSeconds(25),
                         &TestPhyHeadersReception::SendPacket,
                         this,
                         rxPower,
@@ -2193,26 +2194,26 @@
                         7);
     // At 44us (end of PHY header), STA PHY STATE should not have moved to RX (HE-SIG failed) and be
     // kept to CCA_BUSY.
-    Simulator::Schedule(Seconds(3.0) + MicroSeconds(44.0),
+    Simulator::Schedule(Seconds(3) + MicroSeconds(44),
                         &TestPhyHeadersReception::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
     // STA PHY STATE should move back to IDLE once the duration estimated from L-SIG has elapsed,
     // i.e. at 152.8us. However, since there is a second packet transmitted with a power above
     // CCA-ED (-62 dBm), PHY should first be seen as CCA_BUSY for 25us.
-    Simulator::Schedule(Seconds(3.0) + NanoSeconds(152799),
+    Simulator::Schedule(Seconds(3) + NanoSeconds(152799),
                         &TestPhyHeadersReception::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(3.0) + NanoSeconds(152800),
+    Simulator::Schedule(Seconds(3) + NanoSeconds(152800),
                         &TestPhyHeadersReception::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(3.0) + NanoSeconds(177799),
+    Simulator::Schedule(Seconds(3) + NanoSeconds(177799),
                         &TestPhyHeadersReception::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(3.0) + NanoSeconds(177800),
+    Simulator::Schedule(Seconds(3) + NanoSeconds(177800),
                         &TestPhyHeadersReception::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
@@ -2220,70 +2221,70 @@
     // CASE 4: send one packet followed by a second one 3 dB weaker between the end of L-SIG and the
     // start of HE-SIG of the first packet: PHY header reception should succeed.
 
-    Simulator::Schedule(Seconds(4.0), &TestPhyHeadersReception::SendPacket, this, rxPower, 1000, 7);
-    Simulator::Schedule(Seconds(4.0) + MicroSeconds(25),
+    Simulator::Schedule(Seconds(4), &TestPhyHeadersReception::SendPacket, this, rxPower, 1000, 7);
+    Simulator::Schedule(Seconds(4) + MicroSeconds(25),
                         &TestPhyHeadersReception::SendPacket,
                         this,
-                        rxPower - 3,
+                        rxPower - dB_u{3},
                         1000,
                         7);
     // At 10 us, STA PHY STATE should be CCA_BUSY.
-    Simulator::Schedule(Seconds(4.0) + MicroSeconds(10.0),
+    Simulator::Schedule(Seconds(4) + MicroSeconds(10),
                         &TestPhyHeadersReception::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
     // At 44 us (end of HE-SIG), STA PHY STATE should move to RX since the PHY header reception
     // should have succeeded.
-    Simulator::Schedule(Seconds(4.0) + NanoSeconds(43999),
+    Simulator::Schedule(Seconds(4) + NanoSeconds(43999),
                         &TestPhyHeadersReception::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(4.0) + NanoSeconds(44000),
+    Simulator::Schedule(Seconds(4) + NanoSeconds(44000),
                         &TestPhyHeadersReception::CheckPhyState,
                         this,
                         WifiPhyState::RX);
     // STA PHY STATE should move back to IDLE once the duration estimated from L-SIG has elapsed,
     // i.e. at 152.8us. However, since there is a second packet transmitted with a power above
     // CCA-ED (-62 dBm), PHY should first be seen as CCA_BUSY for 25us.
-    Simulator::Schedule(Seconds(4.0) + NanoSeconds(152799),
+    Simulator::Schedule(Seconds(4) + NanoSeconds(152799),
                         &TestPhyHeadersReception::CheckPhyState,
                         this,
                         WifiPhyState::RX);
-    Simulator::Schedule(Seconds(4.0) + NanoSeconds(152800),
+    Simulator::Schedule(Seconds(4) + NanoSeconds(152800),
                         &TestPhyHeadersReception::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(4.0) + NanoSeconds(177799),
+    Simulator::Schedule(Seconds(4) + NanoSeconds(177799),
                         &TestPhyHeadersReception::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(4.0) + NanoSeconds(177800),
+    Simulator::Schedule(Seconds(4) + NanoSeconds(177800),
                         &TestPhyHeadersReception::CheckPhyState,
                         this,
                         WifiPhyState::IDLE);
 
     // RX power < CCA-ED
-    rxPower = -70;
+    rxPower = dBm_u{-70};
 
     // CASE 5: send one packet followed by a second one with same power between the end of the 4us
     // preamble detection window and the start of L-SIG of the first packet: reception should be
     // aborted since L-SIG cannot be decoded (SNR too low).
 
-    Simulator::Schedule(Seconds(5.0), &TestPhyHeadersReception::SendPacket, this, rxPower, 1000, 7);
-    Simulator::Schedule(Seconds(5.0) + MicroSeconds(10),
+    Simulator::Schedule(Seconds(5), &TestPhyHeadersReception::SendPacket, this, rxPower, 1000, 7);
+    Simulator::Schedule(Seconds(5) + MicroSeconds(10),
                         &TestPhyHeadersReception::SendPacket,
                         this,
                         rxPower,
                         1000,
                         7);
     // At 10 us, STA PHY STATE should be CCA_BUSY.
-    Simulator::Schedule(Seconds(5.0) + MicroSeconds(10.0),
+    Simulator::Schedule(Seconds(5) + MicroSeconds(10),
                         &TestPhyHeadersReception::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
     // At 24us (end of L-SIG), STA PHY STATE stay CCA_BUSY because L-SIG reception failed and the
     // start of a valid OFDM transmission has been detected
-    Simulator::Schedule(Seconds(5.0) + NanoSeconds(24000),
+    Simulator::Schedule(Seconds(5) + NanoSeconds(24000),
                         &TestPhyHeadersReception::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
@@ -2292,41 +2293,41 @@
     // preamble detection window and the start of L-SIG of the first packet: reception should not be
     // aborted since L-SIG can be decoded (SNR high enough).
 
-    Simulator::Schedule(Seconds(6.0), &TestPhyHeadersReception::SendPacket, this, rxPower, 1000, 7);
-    Simulator::Schedule(Seconds(6.0) + MicroSeconds(10),
+    Simulator::Schedule(Seconds(6), &TestPhyHeadersReception::SendPacket, this, rxPower, 1000, 7);
+    Simulator::Schedule(Seconds(6) + MicroSeconds(10),
                         &TestPhyHeadersReception::SendPacket,
                         this,
-                        rxPower - 3,
+                        rxPower - dB_u{3},
                         1000,
                         7);
     // At 10 us, STA PHY STATE should be CCA_BUSY.
-    Simulator::Schedule(Seconds(6.0) + MicroSeconds(10.0),
+    Simulator::Schedule(Seconds(6) + MicroSeconds(10),
                         &TestPhyHeadersReception::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
     // At 24us (end of L-SIG), STA PHY STATE should be unchanged because L-SIG reception should have
     // succeeded.
-    Simulator::Schedule(Seconds(6.0) + MicroSeconds(24.0),
+    Simulator::Schedule(Seconds(6) + MicroSeconds(24),
                         &TestPhyHeadersReception::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
     // At 44 us (end of HE-SIG), STA PHY STATE should move to RX since the PHY header reception
     // should have succeeded.
-    Simulator::Schedule(Seconds(6.0) + NanoSeconds(43999),
+    Simulator::Schedule(Seconds(6) + NanoSeconds(43999),
                         &TestPhyHeadersReception::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(6.0) + NanoSeconds(44000),
+    Simulator::Schedule(Seconds(6) + NanoSeconds(44000),
                         &TestPhyHeadersReception::CheckPhyState,
                         this,
                         WifiPhyState::RX);
     // Since it takes 152.8us to transmit the packet, PHY should be back to CCA_BUSY at time
     // 152.8us.
-    Simulator::Schedule(Seconds(6.0) + NanoSeconds(152799),
+    Simulator::Schedule(Seconds(6) + NanoSeconds(152799),
                         &TestPhyHeadersReception::CheckPhyState,
                         this,
                         WifiPhyState::RX);
-    Simulator::Schedule(Seconds(6.0) + NanoSeconds(152800),
+    Simulator::Schedule(Seconds(6) + NanoSeconds(152800),
                         &TestPhyHeadersReception::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
@@ -2335,33 +2336,33 @@
     // the start of HE-SIG of the first packet: PHY header reception should not succeed but PHY
     // should stay in RX state for the duration estimated from L-SIG.
 
-    Simulator::Schedule(Seconds(7.0), &TestPhyHeadersReception::SendPacket, this, rxPower, 1000, 7);
-    Simulator::Schedule(Seconds(7.0) + MicroSeconds(25),
+    Simulator::Schedule(Seconds(7), &TestPhyHeadersReception::SendPacket, this, rxPower, 1000, 7);
+    Simulator::Schedule(Seconds(7) + MicroSeconds(25),
                         &TestPhyHeadersReception::SendPacket,
                         this,
                         rxPower,
                         1000,
                         7);
     // At 10 us, STA PHY STATE should be CCA_BUSY.
-    Simulator::Schedule(Seconds(7.0) + MicroSeconds(10.0),
+    Simulator::Schedule(Seconds(7) + MicroSeconds(10),
                         &TestPhyHeadersReception::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
     // At 24us (end of L-SIG), STA PHY STATE should be unchanged because L-SIG reception should have
     // succeeded.
-    Simulator::Schedule(Seconds(7.0) + MicroSeconds(24.0),
+    Simulator::Schedule(Seconds(7) + MicroSeconds(24),
                         &TestPhyHeadersReception::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
     // At 44 us (end of HE-SIG), STA PHY STATE should be not have moved to RX since reception of
     // HE-SIG should have failed.
-    Simulator::Schedule(Seconds(7.0) + MicroSeconds(44.0),
+    Simulator::Schedule(Seconds(7) + MicroSeconds(44),
                         &TestPhyHeadersReception::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
     // STA PHY STATE should keep CCA_BUSY once the duration estimated from L-SIG has elapsed, i.e.
     // at 152.8us.
-    Simulator::Schedule(Seconds(7.0) + NanoSeconds(152800),
+    Simulator::Schedule(Seconds(7) + NanoSeconds(152800),
                         &TestPhyHeadersReception::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
@@ -2369,41 +2370,41 @@
     // CASE 8: send one packet followed by a second one 3 dB weaker between the end of L-SIG and the
     // start of HE-SIG of the first packet: PHY header reception should succeed.
 
-    Simulator::Schedule(Seconds(8.0), &TestPhyHeadersReception::SendPacket, this, rxPower, 1000, 7);
-    Simulator::Schedule(Seconds(8.0) + MicroSeconds(25),
+    Simulator::Schedule(Seconds(8), &TestPhyHeadersReception::SendPacket, this, rxPower, 1000, 7);
+    Simulator::Schedule(Seconds(8) + MicroSeconds(25),
                         &TestPhyHeadersReception::SendPacket,
                         this,
-                        rxPower - 3,
+                        rxPower - dB_u{3},
                         1000,
                         7);
     // At 10 us, STA PHY STATE should be CCA_BUSY.
-    Simulator::Schedule(Seconds(8.0) + MicroSeconds(10.0),
+    Simulator::Schedule(Seconds(8) + MicroSeconds(10),
                         &TestPhyHeadersReception::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
     // At 24us (end of L-SIG), STA PHY STATE should be unchanged because L-SIG reception should have
     // succeeded.
-    Simulator::Schedule(Seconds(8.0) + MicroSeconds(24.0),
+    Simulator::Schedule(Seconds(8) + MicroSeconds(24),
                         &TestPhyHeadersReception::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
     // At 44 us (end of HE-SIG), STA PHY STATE should move to RX since the PHY header reception
     // should have succeeded.
-    Simulator::Schedule(Seconds(8.0) + NanoSeconds(43999),
+    Simulator::Schedule(Seconds(8) + NanoSeconds(43999),
                         &TestPhyHeadersReception::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
-    Simulator::Schedule(Seconds(8.0) + NanoSeconds(44000),
+    Simulator::Schedule(Seconds(8) + NanoSeconds(44000),
                         &TestPhyHeadersReception::CheckPhyState,
                         this,
                         WifiPhyState::RX);
     // STA PHY STATE should move back to CCA_BUSY once the duration estimated from L-SIG has
     // elapsed, i.e. at 152.8us.
-    Simulator::Schedule(Seconds(8.0) + NanoSeconds(152799),
+    Simulator::Schedule(Seconds(8) + NanoSeconds(152799),
                         &TestPhyHeadersReception::CheckPhyState,
                         this,
                         WifiPhyState::RX);
-    Simulator::Schedule(Seconds(8.0) + NanoSeconds(152800),
+    Simulator::Schedule(Seconds(8) + NanoSeconds(152800),
                         &TestPhyHeadersReception::CheckPhyState,
                         this,
                         WifiPhyState::CCA_BUSY);
@@ -2413,10 +2414,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief A-MPDU reception test
+ * @brief A-MPDU reception test
  */
 class TestAmpduReception : public WifiPhyReceptionTest
 {
@@ -2429,34 +2430,34 @@
 
     /**
      * RX success function
-     * \param psdu the PSDU
-     * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
-     * \param txVector the transmit vector
-     * \param statusPerMpdu reception status per MPDU
+     * @param psdu the PSDU
+     * @param rxSignalInfo the info on the received signal (\see RxSignalInfo)
+     * @param txVector the transmit vector
+     * @param statusPerMpdu reception status per MPDU
      */
     void RxSuccess(Ptr<const WifiPsdu> psdu,
                    RxSignalInfo rxSignalInfo,
-                   WifiTxVector txVector,
-                   std::vector<bool> statusPerMpdu);
+                   const WifiTxVector& txVector,
+                   const std::vector<bool>& statusPerMpdu);
     /**
      * RX failure function
-     * \param psdu the PSDU
+     * @param psdu the PSDU
      */
     void RxFailure(Ptr<const WifiPsdu> psdu);
     /**
      * RX dropped function
-     * \param p the packet
-     * \param reason the reason
+     * @param p the packet
+     * @param reason the reason
      */
     void RxDropped(Ptr<const Packet> p, WifiPhyRxfailureReason reason);
     /**
      * Increment reception success bitmap.
-     * \param size the size of the received packet
+     * @param size the size of the received packet
      */
     void IncrementSuccessBitmap(uint32_t size);
     /**
      * Increment reception failure bitmap.
-     * \param size the size of the received packet
+     * @param size the size of the received packet
      */
     void IncrementFailureBitmap(uint32_t size);
 
@@ -2468,46 +2469,46 @@
     /**
      * Send A-MPDU with 3 MPDUs of different size (i-th MSDU will have 100 bytes more than
      * (i-1)-th).
-     * \param rxPower the transmit power
-     * \param referencePacketSize the reference size of the packets in bytes (i-th MSDU will have
+     * @param rxPower the transmit power
+     * @param referencePacketSize the reference size of the packets in bytes (i-th MSDU will have
      * 100 bytes more than (i-1)-th)
      */
     void SendAmpduWithThreeMpdus(dBm_u rxPower, uint32_t referencePacketSize);
 
     /**
      * Check the RX success bitmap for A-MPDU 1
-     * \param expected the expected bitmap
+     * @param expected the expected bitmap
      */
     void CheckRxSuccessBitmapAmpdu1(uint8_t expected);
     /**
      * Check the RX success bitmap for A-MPDU 2
-     * \param expected the expected bitmap
+     * @param expected the expected bitmap
      */
     void CheckRxSuccessBitmapAmpdu2(uint8_t expected);
     /**
      * Check the RX failure bitmap for A-MPDU 1
-     * \param expected the expected bitmap
+     * @param expected the expected bitmap
      */
     void CheckRxFailureBitmapAmpdu1(uint8_t expected);
     /**
      * Check the RX failure bitmap for A-MPDU 2
-     * \param expected the expected bitmap
+     * @param expected the expected bitmap
      */
     void CheckRxFailureBitmapAmpdu2(uint8_t expected);
     /**
      * Check the RX dropped bitmap for A-MPDU 1
-     * \param expected the expected bitmap
+     * @param expected the expected bitmap
      */
     void CheckRxDroppedBitmapAmpdu1(uint8_t expected);
     /**
      * Check the RX dropped bitmap for A-MPDU 2
-     * \param expected the expected bitmap
+     * @param expected the expected bitmap
      */
     void CheckRxDroppedBitmapAmpdu2(uint8_t expected);
 
     /**
      * Check the PHY state
-     * \param expectedState the expected PHY state
+     * @param expectedState the expected PHY state
      */
     void CheckPhyState(WifiPhyState expectedState);
 
@@ -2540,8 +2541,8 @@
 void
 TestAmpduReception::RxSuccess(Ptr<const WifiPsdu> psdu,
                               RxSignalInfo rxSignalInfo,
-                              WifiTxVector txVector,
-                              std::vector<bool> statusPerMpdu)
+                              const WifiTxVector& txVector,
+                              const std::vector<bool>& statusPerMpdu)
 {
     NS_LOG_FUNCTION(this << *psdu << rxSignalInfo << txVector);
     if (statusPerMpdu.empty()) // wait for the whole A-MPDU
@@ -2735,7 +2736,7 @@
                                          1,
                                          1,
                                          0,
-                                         20,
+                                         MHz_u{20},
                                          true);
 
     WifiMacHeader hdr;
@@ -2750,7 +2751,8 @@
     }
     Ptr<WifiPsdu> psdu = Create<WifiPsdu>(mpduList);
 
-    Time txDuration = m_phy->CalculateTxDuration(psdu->GetSize(), txVector, m_phy->GetPhyBand());
+    Time txDuration =
+        SpectrumWifiPhy::CalculateTxDuration(psdu->GetSize(), txVector, m_phy->GetPhyBand());
 
     Ptr<WifiPpdu> ppdu =
         Create<HePpdu>(psdu, txVector, m_phy->GetOperatingChannel(), txDuration, m_uid++);
@@ -2797,7 +2799,7 @@
     RngSeedManager::SetSeed(1);
     RngSeedManager::SetRun(2);
     int64_t streamNumber = 1;
-    dBm_u rxPower = -30;
+    dBm_u rxPower{-30};
     m_phy->AssignStreams(streamNumber);
 
     /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -2807,14 +2809,14 @@
     /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
     // A-MPDU 1
-    Simulator::Schedule(Seconds(1.0),
+    Simulator::Schedule(Seconds(1),
                         &TestAmpduReception::SendAmpduWithThreeMpdus,
                         this,
-                        rxPower - 100,
+                        rxPower - dB_u{100},
                         1000);
 
     // A-MPDU 2
-    Simulator::Schedule(Seconds(1.0) + MicroSeconds(2),
+    Simulator::Schedule(Seconds(1) + MicroSeconds(2),
                         &TestAmpduReception::SendAmpduWithThreeMpdus,
                         this,
                         rxPower,
@@ -2857,17 +2859,17 @@
     /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
     // A-MPDU 1
-    Simulator::Schedule(Seconds(2.0),
+    Simulator::Schedule(Seconds(2),
                         &TestAmpduReception::SendAmpduWithThreeMpdus,
                         this,
                         rxPower,
                         1000);
 
     // A-MPDU 2
-    Simulator::Schedule(Seconds(2.0) + MicroSeconds(2),
+    Simulator::Schedule(Seconds(2) + MicroSeconds(2),
                         &TestAmpduReception::SendAmpduWithThreeMpdus,
                         this,
-                        rxPower - 100,
+                        rxPower - dB_u{100},
                         1300);
 
     // All MPDUs of A-MPDU 1 should have been received.
@@ -2907,14 +2909,14 @@
     /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
     // A-MPDU 1
-    Simulator::Schedule(Seconds(3.0),
+    Simulator::Schedule(Seconds(3),
                         &TestAmpduReception::SendAmpduWithThreeMpdus,
                         this,
-                        rxPower - 100,
+                        rxPower - dB_u{100},
                         1000);
 
     // A-MPDU 2
-    Simulator::Schedule(Seconds(3.0) + MicroSeconds(10),
+    Simulator::Schedule(Seconds(3) + MicroSeconds(10),
                         &TestAmpduReception::SendAmpduWithThreeMpdus,
                         this,
                         rxPower,
@@ -2957,17 +2959,17 @@
     /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
     // A-MPDU 1
-    Simulator::Schedule(Seconds(4.0),
+    Simulator::Schedule(Seconds(4),
                         &TestAmpduReception::SendAmpduWithThreeMpdus,
                         this,
                         rxPower,
                         1000);
 
     // A-MPDU 2
-    Simulator::Schedule(Seconds(4.0) + MicroSeconds(10),
+    Simulator::Schedule(Seconds(4) + MicroSeconds(10),
                         &TestAmpduReception::SendAmpduWithThreeMpdus,
                         this,
-                        rxPower - 100,
+                        rxPower - dB_u{100},
                         1300);
 
     // All MPDUs of A-MPDU 1 should have been received.
@@ -3007,14 +3009,14 @@
     //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
     // A-MPDU 1
-    Simulator::Schedule(Seconds(5.0),
+    Simulator::Schedule(Seconds(5),
                         &TestAmpduReception::SendAmpduWithThreeMpdus,
                         this,
-                        rxPower - 100,
+                        rxPower - dB_u{100},
                         1000);
 
     // A-MPDU 2
-    Simulator::Schedule(Seconds(5.0) + MicroSeconds(100),
+    Simulator::Schedule(Seconds(5) + MicroSeconds(100),
                         &TestAmpduReception::SendAmpduWithThreeMpdus,
                         this,
                         rxPower,
@@ -3057,17 +3059,17 @@
     //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
     // A-MPDU 1
-    Simulator::Schedule(Seconds(6.0),
+    Simulator::Schedule(Seconds(6),
                         &TestAmpduReception::SendAmpduWithThreeMpdus,
                         this,
                         rxPower,
                         1000);
 
     // A-MPDU 2
-    Simulator::Schedule(Seconds(6.0) + MicroSeconds(100),
+    Simulator::Schedule(Seconds(6) + MicroSeconds(100),
                         &TestAmpduReception::SendAmpduWithThreeMpdus,
                         this,
-                        rxPower - 100,
+                        rxPower - dB_u{100},
                         1300);
 
     // All MPDUs of A-MPDU 1 should have been received.
@@ -3106,14 +3108,14 @@
     /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
     // A-MPDU 1
-    Simulator::Schedule(Seconds(7.0),
+    Simulator::Schedule(Seconds(7),
                         &TestAmpduReception::SendAmpduWithThreeMpdus,
                         this,
-                        rxPower - 100,
+                        rxPower - dB_u{100},
                         1000);
 
     // A-MPDU 2
-    Simulator::Schedule(Seconds(7.0) + NanoSeconds(1100000),
+    Simulator::Schedule(Seconds(7) + NanoSeconds(1100000),
                         &TestAmpduReception::SendAmpduWithThreeMpdus,
                         this,
                         rxPower,
@@ -3155,17 +3157,17 @@
     /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
     // A-MPDU 1
-    Simulator::Schedule(Seconds(8.0),
+    Simulator::Schedule(Seconds(8),
                         &TestAmpduReception::SendAmpduWithThreeMpdus,
                         this,
                         rxPower,
                         1000);
 
     // A-MPDU 2
-    Simulator::Schedule(Seconds(8.0) + NanoSeconds(1100000),
+    Simulator::Schedule(Seconds(8) + NanoSeconds(1100000),
                         &TestAmpduReception::SendAmpduWithThreeMpdus,
                         this,
-                        rxPower - 100,
+                        rxPower - dB_u{100},
                         1300);
 
     // All MPDUs of A-MPDU 1 should have been received.
@@ -3205,17 +3207,17 @@
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////
 
     // A-MPDU 1
-    Simulator::Schedule(Seconds(9.0),
+    Simulator::Schedule(Seconds(9),
                         &TestAmpduReception::SendAmpduWithThreeMpdus,
                         this,
                         rxPower,
                         1000);
 
     // A-MPDU 2
-    Simulator::Schedule(Seconds(9.0) + MicroSeconds(2),
+    Simulator::Schedule(Seconds(9) + MicroSeconds(2),
                         &TestAmpduReception::SendAmpduWithThreeMpdus,
                         this,
-                        rxPower + static_cast<dB_u>(3.0),
+                        rxPower + dB_u{3.0},
                         1300);
 
     // All MPDUs of A-MPDU 1 should have been dropped.
@@ -3255,14 +3257,14 @@
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////
 
     // A-MPDU 1
-    Simulator::Schedule(Seconds(10.0),
+    Simulator::Schedule(Seconds(10),
                         &TestAmpduReception::SendAmpduWithThreeMpdus,
                         this,
                         rxPower,
                         1000);
 
     // A-MPDU 2
-    Simulator::Schedule(Seconds(10.0) + MicroSeconds(2),
+    Simulator::Schedule(Seconds(10) + MicroSeconds(2),
                         &TestAmpduReception::SendAmpduWithThreeMpdus,
                         this,
                         rxPower,
@@ -3305,14 +3307,14 @@
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////
 
     // A-MPDU 1
-    Simulator::Schedule(Seconds(11.0),
+    Simulator::Schedule(Seconds(11),
                         &TestAmpduReception::SendAmpduWithThreeMpdus,
                         this,
-                        rxPower + static_cast<dB_u>(3.0),
+                        rxPower + dB_u{3.0},
                         1000);
 
     // A-MPDU 2
-    Simulator::Schedule(Seconds(11.0) + MicroSeconds(2),
+    Simulator::Schedule(Seconds(11) + MicroSeconds(2),
                         &TestAmpduReception::SendAmpduWithThreeMpdus,
                         this,
                         rxPower,
@@ -3355,17 +3357,17 @@
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
     // A-MPDU 1
-    Simulator::Schedule(Seconds(12.0),
+    Simulator::Schedule(Seconds(12),
                         &TestAmpduReception::SendAmpduWithThreeMpdus,
                         this,
                         rxPower,
                         1000);
 
     // A-MPDU 2
-    Simulator::Schedule(Seconds(12.0) + MicroSeconds(10),
+    Simulator::Schedule(Seconds(12) + MicroSeconds(10),
                         &TestAmpduReception::SendAmpduWithThreeMpdus,
                         this,
-                        rxPower + static_cast<dB_u>(3.0),
+                        rxPower + dB_u{3.0},
                         1300);
 
     // All MPDUs of A-MPDU 1 should have been received with errors (PHY header reception failed and
@@ -3407,14 +3409,14 @@
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
     // A-MPDU 1
-    Simulator::Schedule(Seconds(13.0),
+    Simulator::Schedule(Seconds(13),
                         &TestAmpduReception::SendAmpduWithThreeMpdus,
                         this,
                         rxPower,
                         1000);
 
     // A-MPDU 2
-    Simulator::Schedule(Seconds(13.0) + MicroSeconds(10),
+    Simulator::Schedule(Seconds(13) + MicroSeconds(10),
                         &TestAmpduReception::SendAmpduWithThreeMpdus,
                         this,
                         rxPower,
@@ -3458,14 +3460,14 @@
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
     // A-MPDU 1
-    Simulator::Schedule(Seconds(14.0),
+    Simulator::Schedule(Seconds(14),
                         &TestAmpduReception::SendAmpduWithThreeMpdus,
                         this,
-                        rxPower + static_cast<dB_u>(3.0),
+                        rxPower + dB_u{3.0},
                         1000);
 
     // A-MPDU 2
-    Simulator::Schedule(Seconds(14.0) + MicroSeconds(10),
+    Simulator::Schedule(Seconds(14) + MicroSeconds(10),
                         &TestAmpduReception::SendAmpduWithThreeMpdus,
                         this,
                         rxPower,
@@ -3508,17 +3510,17 @@
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
     // A-MPDU 1
-    Simulator::Schedule(Seconds(15.0),
+    Simulator::Schedule(Seconds(15),
                         &TestAmpduReception::SendAmpduWithThreeMpdus,
                         this,
                         rxPower,
                         1000);
 
     // A-MPDU 2
-    Simulator::Schedule(Seconds(15.0) + MicroSeconds(10),
+    Simulator::Schedule(Seconds(15) + MicroSeconds(10),
                         &TestAmpduReception::SendAmpduWithThreeMpdus,
                         this,
-                        rxPower + static_cast<dB_u>(6.0),
+                        rxPower + dB_u{6.0},
                         1300);
 
     // All MPDUs of A-MPDU 1 should have been dropped because PHY reception switched to A-MPDU 2.
@@ -3558,14 +3560,14 @@
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
     // A-MPDU 1
-    Simulator::Schedule(Seconds(16.0),
+    Simulator::Schedule(Seconds(16),
                         &TestAmpduReception::SendAmpduWithThreeMpdus,
                         this,
-                        rxPower + static_cast<dB_u>(6.0),
+                        rxPower + dB_u{6.0},
                         1000);
 
     // A-MPDU 2
-    Simulator::Schedule(Seconds(16.0) + MicroSeconds(10),
+    Simulator::Schedule(Seconds(16) + MicroSeconds(10),
                         &TestAmpduReception::SendAmpduWithThreeMpdus,
                         this,
                         rxPower,
@@ -3608,17 +3610,17 @@
     //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
     // A-MPDU 1
-    Simulator::Schedule(Seconds(17.0),
+    Simulator::Schedule(Seconds(17),
                         &TestAmpduReception::SendAmpduWithThreeMpdus,
                         this,
                         rxPower,
                         1000);
 
     // A-MPDU 2
-    Simulator::Schedule(Seconds(17.0) + MicroSeconds(25),
+    Simulator::Schedule(Seconds(17) + MicroSeconds(25),
                         &TestAmpduReception::SendAmpduWithThreeMpdus,
                         this,
-                        rxPower + static_cast<dB_u>(6.0),
+                        rxPower + dB_u{6.0},
                         1300);
 
     // All MPDUs of A-MPDU 1 should have been received with errors.
@@ -3659,14 +3661,14 @@
     //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
     // A-MPDU 1
-    Simulator::Schedule(Seconds(18.0),
+    Simulator::Schedule(Seconds(18),
                         &TestAmpduReception::SendAmpduWithThreeMpdus,
                         this,
-                        rxPower + static_cast<dB_u>(6.0),
+                        rxPower + dB_u{6.0},
                         1000);
 
     // A-MPDU 2
-    Simulator::Schedule(Seconds(18.0) + MicroSeconds(25),
+    Simulator::Schedule(Seconds(18) + MicroSeconds(25),
                         &TestAmpduReception::SendAmpduWithThreeMpdus,
                         this,
                         rxPower,
@@ -3709,14 +3711,14 @@
     //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
     // A-MPDU 1
-    Simulator::Schedule(Seconds(19.0),
+    Simulator::Schedule(Seconds(19),
                         &TestAmpduReception::SendAmpduWithThreeMpdus,
                         this,
                         rxPower,
                         1000);
 
     // A-MPDU 2
-    Simulator::Schedule(Seconds(19.0) + MicroSeconds(25),
+    Simulator::Schedule(Seconds(19) + MicroSeconds(25),
                         &TestAmpduReception::SendAmpduWithThreeMpdus,
                         this,
                         rxPower,
@@ -3759,17 +3761,17 @@
     //////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
     // A-MPDU 1
-    Simulator::Schedule(Seconds(20.0),
+    Simulator::Schedule(Seconds(20),
                         &TestAmpduReception::SendAmpduWithThreeMpdus,
                         this,
                         rxPower,
                         1000);
 
     // A-MPDU 2
-    Simulator::Schedule(Seconds(20.0) + MicroSeconds(100),
+    Simulator::Schedule(Seconds(20) + MicroSeconds(100),
                         &TestAmpduReception::SendAmpduWithThreeMpdus,
                         this,
-                        rxPower + static_cast<dB_u>(6.0),
+                        rxPower + dB_u{6.0},
                         1300);
 
     // All MPDUs of A-MPDU 1 should have been received with errors.
@@ -3810,14 +3812,14 @@
     //////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
     // A-MPDU 1
-    Simulator::Schedule(Seconds(21.0),
+    Simulator::Schedule(Seconds(21),
                         &TestAmpduReception::SendAmpduWithThreeMpdus,
                         this,
-                        rxPower + static_cast<dB_u>(6.0),
+                        rxPower + dB_u{6.0},
                         1000);
 
     // A-MPDU 2
-    Simulator::Schedule(Seconds(21.0) + MicroSeconds(100),
+    Simulator::Schedule(Seconds(21) + MicroSeconds(100),
                         &TestAmpduReception::SendAmpduWithThreeMpdus,
                         this,
                         rxPower,
@@ -3860,14 +3862,14 @@
     //////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
     // A-MPDU 1
-    Simulator::Schedule(Seconds(22.0),
+    Simulator::Schedule(Seconds(22),
                         &TestAmpduReception::SendAmpduWithThreeMpdus,
                         this,
                         rxPower,
                         1000);
 
     // A-MPDU 2
-    Simulator::Schedule(Seconds(22.0) + MicroSeconds(100),
+    Simulator::Schedule(Seconds(22) + MicroSeconds(100),
                         &TestAmpduReception::SendAmpduWithThreeMpdus,
                         this,
                         rxPower,
@@ -3909,14 +3911,14 @@
     ///////////////////////////////////////////////////////////////////////////////
 
     // A-MPDU 1
-    Simulator::Schedule(Seconds(23.0),
+    Simulator::Schedule(Seconds(23),
                         &TestAmpduReception::SendAmpduWithThreeMpdus,
                         this,
                         rxPower,
                         1000);
 
     // A-MPDU 2
-    Simulator::Schedule(Seconds(23.0) + NanoSeconds(1100000),
+    Simulator::Schedule(Seconds(23) + NanoSeconds(1100000),
                         &TestAmpduReception::SendAmpduWithThreeMpdus,
                         this,
                         rxPower,
@@ -3960,10 +3962,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Unsupported Modulation Reception Test
+ * @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
@@ -3990,9 +3992,9 @@
 
     /**
      * 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
+     * @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);
     /**
@@ -4129,7 +4131,7 @@
         client->SetRemote(socket);
         wifiStaNodes.Get(i)->AddApplication(client);
         client->SetStartTime(MicroSeconds(400000));
-        client->SetStopTime(Seconds(1.0));
+        client->SetStopTime(Seconds(1));
         Ptr<PacketSocketClient> legacyStaClient = CreateObject<PacketSocketClient>();
         legacyStaClient->SetAttribute("PacketSize", UintegerValue(1500));
         legacyStaClient->SetAttribute("MaxPackets", UintegerValue(200));
@@ -4137,12 +4139,12 @@
         legacyStaClient->SetRemote(socket);
         wifiStaNodes.Get(i)->AddApplication(legacyStaClient);
         legacyStaClient->SetStartTime(MicroSeconds(400000));
-        legacyStaClient->SetStopTime(Seconds(1.0));
+        legacyStaClient->SetStopTime(Seconds(1));
         Ptr<PacketSocketServer> server = CreateObject<PacketSocketServer>();
         server->SetLocal(socket);
         wifiApNode.Get(0)->AddApplication(server);
-        server->SetStartTime(Seconds(0.0));
-        server->SetStopTime(Seconds(1.0));
+        server->SetStartTime(Seconds(0));
+        server->SetStopTime(Seconds(1));
     }
 
     // Trace dropped packets
@@ -4164,10 +4166,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Unsupported Bandwidth Reception Test
+ * @brief Unsupported Bandwidth Reception Test
  * This test checks whether a PHY receiving a PPDU sent over a channel width
  * larger than the one supported by the PHY is getting dropped at the expected
  * time. The expected time corresponds to the moment the PHY header indicating
@@ -4187,42 +4189,42 @@
     /**
      * Function to create a PPDU
      *
-     * \param centerFreq the center frequency used for the transmission of the PPDU
-     * \param bandwidth the bandwidth used for the transmission of the PPDU
+     * @param centerFreq the center frequency used for the transmission of the PPDU
+     * @param bandwidth the bandwidth used for the transmission of the PPDU
      */
     void SendPpdu(MHz_u centerFreq, MHz_u bandwidth);
 
     /**
      * Function called upon a PSDU received successfully
-     * \param psdu the PSDU
-     * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
-     * \param txVector the transmit vector
-     * \param statusPerMpdu reception status per MPDU
+     * @param psdu the PSDU
+     * @param rxSignalInfo the info on the received signal (\see RxSignalInfo)
+     * @param txVector the transmit vector
+     * @param statusPerMpdu reception status per MPDU
      */
     void RxSuccess(Ptr<const WifiPsdu> psdu,
                    RxSignalInfo rxSignalInfo,
-                   WifiTxVector txVector,
-                   std::vector<bool> statusPerMpdu);
+                   const WifiTxVector& txVector,
+                   const std::vector<bool>& statusPerMpdu);
 
     /**
      * Function called upon a PSDU received unsuccessfuly
-     * \param psdu the PSDU
+     * @param psdu the PSDU
      */
     void RxFailure(Ptr<const WifiPsdu> psdu);
 
     /**
      * Function called upon a PSDU dropped by the PHY
-     * \param packet the packet that was dropped
-     * \param reason the reason the packet was dropped
+     * @param packet the packet that was dropped
+     * @param reason the reason the packet was dropped
      */
     void RxDropped(Ptr<const Packet> packet, WifiPhyRxfailureReason reason);
 
     /**
      * Check the reception results
-     * \param expectedCountRxSuccess the expected number of RX success
-     * \param expectedCountRxFailure the expected number of RX failure
-     * \param expectedCountRxDropped the expected number of RX drop
-     * \param expectedLastRxSucceeded the expected time the last RX success occurred or std::nullopt
+     * @param expectedCountRxSuccess the expected number of RX success
+     * @param expectedCountRxFailure the expected number of RX failure
+     * @param expectedCountRxDropped the expected number of RX drop
+     * @param expectedLastRxSucceeded the expected time the last RX success occurred or std::nullopt
      * if the expected number of RX success is not strictly positive \param expectedLastRxFailed the
      * expected time the last RX failure occurred or std::nullopt if the expected number of RX
      * failure is not strictly positive \param expectedLastRxDropped the expected time the last RX
@@ -4280,14 +4282,15 @@
 
     Ptr<WifiPsdu> psdu = Create<WifiPsdu>(pkt, hdr);
     Time txDuration =
-        m_rxPhy->CalculateTxDuration(psdu->GetSize(), txVector, m_rxPhy->GetPhyBand());
+        SpectrumWifiPhy::CalculateTxDuration(psdu->GetSize(), txVector, m_rxPhy->GetPhyBand());
 
     auto ppdu = Create<HePpdu>(psdu, txVector, m_txPhy->GetOperatingChannel(), txDuration, 0);
 
-    auto txPowerSpectrum = WifiSpectrumValueHelper::CreateHeOfdmTxPowerSpectralDensity(centerFreq,
-                                                                                       bandwidth,
-                                                                                       DbmToW(-50),
-                                                                                       bandwidth);
+    auto txPowerSpectrum =
+        WifiSpectrumValueHelper::CreateHeOfdmTxPowerSpectralDensity(centerFreq,
+                                                                    bandwidth,
+                                                                    DbmToW(dBm_u{-50}),
+                                                                    bandwidth);
 
     auto txParams = Create<WifiSpectrumSignalParameters>();
     txParams->psd = txPowerSpectrum;
@@ -4301,8 +4304,8 @@
 void
 TestUnsupportedBandwidthReception::RxSuccess(Ptr<const WifiPsdu> psdu,
                                              RxSignalInfo rxSignalInfo,
-                                             WifiTxVector txVector,
-                                             std::vector<bool> statusPerMpdu)
+                                             const WifiTxVector& txVector,
+                                             const std::vector<bool>& statusPerMpdu)
 {
     NS_LOG_FUNCTION(this << *psdu << rxSignalInfo << txVector);
     m_countRxSuccess++;
@@ -4434,9 +4437,13 @@
     m_txPhy->SetOperatingChannel(WifiPhy::ChannelTuple{38, 40, WIFI_PHY_BAND_5GHZ, 0});
     m_rxPhy->SetOperatingChannel(WifiPhy::ChannelTuple{36, 20, WIFI_PHY_BAND_5GHZ, 0});
 
-    Simulator::Schedule(Seconds(1.0), &TestUnsupportedBandwidthReception::SendPpdu, this, 5190, 40);
+    Simulator::Schedule(Seconds(1),
+                        &TestUnsupportedBandwidthReception::SendPpdu,
+                        this,
+                        MHz_u{5190},
+                        MHz_u{40});
 
-    auto heSigAExpectedRxTime = Seconds(1.0) + MicroSeconds(32);
+    auto heSigAExpectedRxTime = Seconds(1) + MicroSeconds(32);
     Simulator::Schedule(Seconds(1.5),
                         &TestUnsupportedBandwidthReception::CheckRx,
                         this,
@@ -4454,10 +4461,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Primary 20 MHz Covered By Ppdu Test
+ * @brief Primary 20 MHz Covered By Ppdu Test
  * This test checks whether the functions WifiPpdu::DoesOverlapChannel and
  * WifiPpdu::DoesCoverChannel are returning the expected results.
  */
@@ -4474,21 +4481,21 @@
     /**
      * Function to create a PPDU
      *
-     * \param ppduCenterFreq the center frequency used for the transmission of the PPDU
-     * \return the created PPDU
+     * @param ppduCenterFreq the center frequency used for the transmission of the PPDU
+     * @return the created PPDU
      */
     Ptr<HePpdu> CreatePpdu(MHz_u ppduCenterFreq);
 
     /**
      * Run one function
      *
-     * \param band the PHY band to use
-     * \param phyCenterFreq the operating center frequency of the PHY
-     * \param p20Index the primary20 index
-     * \param ppduCenterFreq the center frequency used for the transmission of the PPDU
-     * \param expectedP20Overlap flag whether the primary 20 MHz channel is expected to be fully
+     * @param band the PHY band to use
+     * @param phyCenterFreq the operating center frequency of the PHY
+     * @param p20Index the primary20 index
+     * @param ppduCenterFreq the center frequency used for the transmission of the PPDU
+     * @param expectedP20Overlap flag whether the primary 20 MHz channel is expected to be fully
      * covered by the bandwidth of the incoming PPDU
-     * \param expectedP20Covered flag whether the
+     * @param expectedP20Covered flag whether the
      * primary 20 MHz channel is expected to overlap with the bandwidth of the incoming PPDU
      */
     void RunOne(WifiPhyBand band,
@@ -4513,7 +4520,7 @@
 {
     const auto& channelInfo = (*WifiPhyOperatingChannel::FindFirst(0,
                                                                    ppduCenterFreq,
-                                                                   0,
+                                                                   MHz_u{0},
                                                                    WIFI_STANDARD_80211ax,
                                                                    m_rxPhy->GetPhyBand()));
     m_txPhy->SetOperatingChannel(
@@ -4532,7 +4539,8 @@
     WifiMacHeader hdr(WIFI_MAC_QOSDATA);
 
     auto psdu = Create<WifiPsdu>(pkt, hdr);
-    auto txDuration = m_txPhy->CalculateTxDuration(psdu->GetSize(), txVector, channelInfo.band);
+    auto txDuration =
+        SpectrumWifiPhy::CalculateTxDuration(psdu->GetSize(), txVector, channelInfo.band);
 
     return Create<HePpdu>(psdu, txVector, m_txPhy->GetOperatingChannel(), txDuration, 0);
 }
@@ -4574,14 +4582,17 @@
                                    bool expectedP20Overlap,
                                    bool expectedP20Covered)
 {
-    const auto& channelInfo =
-        (*WifiPhyOperatingChannel::FindFirst(0, phyCenterFreq, 0, WIFI_STANDARD_80211ax, band));
+    const auto& channelInfo = (*WifiPhyOperatingChannel::FindFirst(0,
+                                                                   phyCenterFreq,
+                                                                   MHz_u{0},
+                                                                   WIFI_STANDARD_80211ax,
+                                                                   band));
 
     m_rxPhy->SetOperatingChannel(
         WifiPhy::ChannelTuple{channelInfo.number, channelInfo.width, channelInfo.band, p20Index});
-    auto p20CenterFreq = m_rxPhy->GetOperatingChannel().GetPrimaryChannelCenterFrequency(20);
-    auto p20MinFreq = p20CenterFreq - 10;
-    auto p20MaxFreq = p20CenterFreq + 10;
+    auto p20CenterFreq = m_rxPhy->GetOperatingChannel().GetPrimaryChannelCenterFrequency(MHz_u{20});
+    auto p20MinFreq = p20CenterFreq - MHz_u{10};
+    auto p20MaxFreq = p20CenterFreq + MHz_u{10};
 
     auto ppdu = CreatePpdu(ppduCenterFreq);
 
@@ -4608,7 +4619,7 @@
      * Overlap with primary 20 MHz: yes
      * Primary 20 MHz fully covered: yes
      */
-    RunOne(WIFI_PHY_BAND_2_4GHZ, 2427, 0, 2427, true, true);
+    RunOne(WIFI_PHY_BAND_2_4GHZ, MHz_u{2427}, 0, MHz_u{2427}, true, true);
 
     /*
      * Receiver PHY Operating Channel: 2.4 GHz Channel 4 (2417 MHz – 2437 MHz)
@@ -4616,7 +4627,7 @@
      * Overlap with primary 20 MHz: yes
      * Primary 20 MHz fully covered: no
      */
-    RunOne(WIFI_PHY_BAND_2_4GHZ, 2427, 0, 2437, true, false);
+    RunOne(WIFI_PHY_BAND_2_4GHZ, MHz_u{2427}, 0, MHz_u{2437}, true, false);
 
     /*
      * Receiver PHY Operating Channel: 5 GHz Channel 36 (5170 MHz – 5190 MHz)
@@ -4624,7 +4635,7 @@
      * Overlap with primary 20 MHz: yes
      * Primary 20 MHz fully covered: yes
      */
-    RunOne(WIFI_PHY_BAND_5GHZ, 5180, 0, 5190, true, true);
+    RunOne(WIFI_PHY_BAND_5GHZ, MHz_u{5180}, 0, MHz_u{5190}, true, true);
 
     /*
      * Receiver PHY Operating Channel: 5 GHz Channel 36 (5170 MHz–5190 MHz)
@@ -4632,7 +4643,7 @@
      * Overlap with primary 20 MHz: no
      * Primary 20 MHz fully covered: no
      */
-    RunOne(WIFI_PHY_BAND_5GHZ, 5180, 0, 5200, false, false);
+    RunOne(WIFI_PHY_BAND_5GHZ, MHz_u{5180}, 0, MHz_u{5200}, false, false);
 
     /*
      * Receiver PHY Operating Channel: 5 GHz Channel 38 (5170 MHz – 5210 MHz) with P20 index 0
@@ -4640,7 +4651,7 @@
      * Overlap with primary 20 MHz: yes
      * Primary 20 MHz fully covered: yes
      */
-    RunOne(WIFI_PHY_BAND_5GHZ, 5190, 0, 5180, true, true);
+    RunOne(WIFI_PHY_BAND_5GHZ, MHz_u{5190}, 0, MHz_u{5180}, true, true);
 
     /*
      * Receiver PHY Operating Channel: 5 GHz Channel 38 (5170 MHz – 5210 MHz) with P20 index 1
@@ -4648,16 +4659,16 @@
      * Overlap with primary 20 MHz: no
      * Primary 20 MHz fully covered: no
      */
-    RunOne(WIFI_PHY_BAND_5GHZ, 5190, 1, 5180, false, false);
+    RunOne(WIFI_PHY_BAND_5GHZ, MHz_u{5190}, 1, MHz_u{5180}, false, false);
 
     Simulator::Destroy();
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief This test verifies the correct function of the WifiBandwidthFilter. 2 SpectrumWifiPhy are
+ * @brief This test verifies the correct function of the WifiBandwidthFilter. 2 SpectrumWifiPhy are
  * setup and connected on the same spectrum channel. The test will
  * send a packet over the channel and if the signal plus guardband overlaps the channel the
  * filter will not discard the signal but if there is no overlap the filter will filter it out.
@@ -4668,8 +4679,8 @@
     /**
      * Constructor
      *
-     * \param channel channel to be used by transmitter
-     * \param expectedValue expected number of received packets
+     * @param channel channel to be used by transmitter
+     * @param expectedValue expected number of received packets
      */
     TestSpectrumChannelWithBandwidthFilter(uint8_t channel, uint16_t expectedValue);
 
@@ -4681,10 +4692,10 @@
     /**
      * Callback invoked when the PHY model starts to process a signal
      *
-     * \param signal the arriving signal
-     * \param senderNodeId node Id of the sender of the signal
-     * \param rxPower received signal power
-     * \param duration signal duration
+     * @param signal the arriving signal
+     * @param senderNodeId node Id of the sender of the signal
+     * @param rxPower received signal power
+     * @param duration signal duration
      */
     void RxBegin(Ptr<const SpectrumSignalParameters> signal,
                  uint32_t senderNodeId,
@@ -4699,7 +4710,7 @@
     /**
      * Event scheduled at end of simulation for validation
      *
-     * \param expectedValue expected number of receive events
+     * @param expectedValue expected number of receive events
      */
     void CheckRxPacketCount(uint16_t expectedValue);
 
@@ -4731,7 +4742,7 @@
                                          1,
                                          1,
                                          0,
-                                         20,
+                                         MHz_u{20},
                                          false);
 
     Ptr<Packet> pkt = Create<Packet>(1000);
@@ -4776,8 +4787,8 @@
     Ptr<WifiNetDevice> dev = CreateObject<WifiNetDevice>();
     m_tx = CreateObject<SpectrumWifiPhy>();
     m_tx->SetDevice(dev);
-    m_tx->SetTxPowerStart(20);
-    m_tx->SetTxPowerEnd(20);
+    m_tx->SetTxPowerStart(dBm_u{20});
+    m_tx->SetTxPowerEnd(dBm_u{20});
 
     Ptr<Node> nodeRx = CreateObject<Node>();
     Ptr<WifiNetDevice> devRx = CreateObject<WifiNetDevice>();
@@ -4835,10 +4846,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief This test verifies that the WifiPhyRxfailureReason distinguishes between two cases:  1) a
+ * @brief This test verifies that the WifiPhyRxfailureReason distinguishes between two cases:  1) a
  * drop due to transmitting during the signal detection interval, and 2) a drop due to transmitting
  * after the receiver has detected a preamble but is waiting for the end of the preamble. 2
  * SpectrumWifiPhy are setup and connected on the same spectrum channel. The test will send a packet
@@ -4853,8 +4864,8 @@
     /**
      * Constructor
      *
-     * \param delay delay in microseconds to send second packet
-     * \param expectedReason expected failure reason
+     * @param delay delay in microseconds to send second packet
+     * @param expectedReason expected failure reason
      */
     TestPhyDropDueToTx(Time delay, WifiPhyRxfailureReason expectedReason);
 
@@ -4865,14 +4876,14 @@
   private:
     /**
      * RX dropped function
-     * \param p the packet
-     * \param reason the reason
+     * @param p the packet
+     * @param reason the reason
      */
     void PhyDropTraceSink(Ptr<const Packet> p, WifiPhyRxfailureReason reason);
 
     /**
      * Send function (sends a single packet)
-     * \param phy the WifiPhy object to send the packet
+     * @param phy the WifiPhy object to send the packet
      */
     void Send(Ptr<WifiPhy> phy) const;
 
@@ -4909,7 +4920,7 @@
                                        1,
                                        1,
                                        0,
-                                       20,
+                                       MHz_u{20},
                                        false);
 
     auto pkt = Create<Packet>(1000);
@@ -4947,15 +4958,15 @@
     auto devA = CreateObject<WifiNetDevice>();
     m_phyA = CreateObject<SpectrumWifiPhy>();
     m_phyA->SetDevice(devA);
-    m_phyA->SetTxPowerStart(20);
-    m_phyA->SetTxPowerEnd(20);
+    m_phyA->SetTxPowerStart(dBm_u{20});
+    m_phyA->SetTxPowerEnd(dBm_u{20});
 
     auto nodeRx = CreateObject<Node>();
     auto devB = CreateObject<WifiNetDevice>();
     m_phyB = CreateObject<SpectrumWifiPhy>();
     m_phyB->SetDevice(devB);
-    m_phyB->SetTxPowerStart(20);
-    m_phyB->SetTxPowerEnd(20);
+    m_phyB->SetTxPowerStart(dBm_u{20});
+    m_phyB->SetTxPowerEnd(dBm_u{20});
 
     auto interferenceTx = CreateObject<InterferenceHelper>();
     m_phyA->SetInterferenceHelper(interferenceTx);
@@ -5010,10 +5021,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief wifi PHY reception Test Suite
+ * @brief wifi PHY reception Test Suite
  */
 class WifiPhyReceptionTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/test/wifi-phy-rx-trace-helper-test.cc ns-3.44/src/wifi/test/wifi-phy-rx-trace-helper-test.cc
--- ns-3.43/src/wifi/test/wifi-phy-rx-trace-helper-test.cc	2024-10-09 16:41:10.140657000 -0700
+++ ns-3.44/src/wifi/test/wifi-phy-rx-trace-helper-test.cc	2025-03-09 16:55:49.811372800 -0700
@@ -24,6 +24,7 @@
 #include "ns3/packet-socket-helper.h"
 #include "ns3/packet-socket-server.h"
 #include "ns3/pointer.h"
+#include "ns3/propagation-loss-model.h"
 #include "ns3/rng-seed-manager.h"
 #include "ns3/simple-frame-capture-model.h"
 #include "ns3/single-model-spectrum-channel.h"
@@ -43,7 +44,6 @@
 #include "ns3/wifi-utils.h"
 #include "ns3/yans-wifi-channel.h"
 #include "ns3/yans-wifi-phy.h"
-#include <ns3/propagation-loss-model.h>
 
 #include <optional>
 
@@ -52,8 +52,8 @@
 NS_LOG_COMPONENT_DEFINE("WifiPhyRxTraceHelperTest");
 
 /**
- * \ingroup wifi-test
- * \brief Implements a test case to evaluate the reception process of WiFi Physical Layer (PHY)
+ * @ingroup wifi-test
+ * @brief Implements a test case to evaluate the reception process of WiFi Physical Layer (PHY)
  * frames (PPDU) with multiple MAC Protocol Data Units (MPDUs).
  *
  * This class extends the TestCase class to simulate and analyze the reception of PPDUs containing
@@ -68,7 +68,7 @@
   public:
     /**
      * Constructs a TestWifiPhyRxTraceHelper instance with a given test name.
-     * \param test_name The name of the test case.
+     * @param test_name The name of the test case.
      */
     TestWifiPhyRxTraceHelper(std::string test_name);
 
@@ -84,34 +84,32 @@
 
     /**
      * Sends a PPDU containing two MPDUs addressed to specific receivers.
-     * \param rxPowerDbm The transmit power in dBm.
-     * \param add1 The MAC address of the first receiver.
-     * \param add2 The MAC address of the second receiver.
-     * \param tx_phy The transmitting PHY object.
+     * @param rxPower The transmit power.
+     * @param add1 The MAC address of the first receiver.
+     * @param add2 The MAC address of the second receiver.
+     * @param tx_phy The transmitting PHY object.
      */
-    void SendPpduWithTwoMpdus(double rxPowerDbm,
+    void SendPpduWithTwoMpdus(dBm_u rxPower,
                               Mac48Address add1,
                               Mac48Address add2,
                               Ptr<ns3::SpectrumWifiPhy> tx_phy);
 
     /**
      * Sends a PPDU containing one MPDU addressed to a specific receiver.
-     * \param rxPowerDbm The transmit power in dBm.
-     * \param add1 The MAC address of the receiver.
-     * \param tx_phy The transmitting PHY object.
-     */
-    void SendPpduWithOneMpdu(double rxPowerDbm,
-                             Mac48Address add1,
-                             Ptr<ns3::SpectrumWifiPhy> tx_phy);
+     * @param rxPower The transmit power.
+     * @param add1 The MAC address of the receiver.
+     * @param tx_phy The transmitting PHY object.
+     */
+    void SendPpduWithOneMpdu(dBm_u rxPower, Mac48Address add1, Ptr<ns3::SpectrumWifiPhy> tx_phy);
 
     /**
      * Checks the statistics of PPDU and MPDU reception success and failure.
-     * \param expectedPpduSuccess The expected number of successful PPDU receptions.
-     * \param expectedPpduFailure The expected number of failed PPDU receptions.
-     * \param expectedMpduSuccess The expected number of successful MPDU receptions within PPDUs.
-     * \param expectedMpduFailure The expected number of failed MPDU receptions within PPDUs.
-     * \param expectedOverlaps The expected number of overlapping reception events.
-     * \param expectedNonOverlaps The expected number of non-overlapping reception events.
+     * @param expectedPpduSuccess The expected number of successful PPDU receptions.
+     * @param expectedPpduFailure The expected number of failed PPDU receptions.
+     * @param expectedMpduSuccess The expected number of successful MPDU receptions within PPDUs.
+     * @param expectedMpduFailure The expected number of failed MPDU receptions within PPDUs.
+     * @param expectedOverlaps The expected number of overlapping reception events.
+     * @param expectedNonOverlaps The expected number of non-overlapping reception events.
      */
     void CheckAllStats(uint64_t expectedPpduSuccess,
                        uint64_t expectedPpduFailure,
@@ -122,7 +120,7 @@
 
     /**
      * Checks the statistics of PPDU and MPDU reception success and failure.
-     * \param expectedStats The expected counts for PPDU and MPDU reception.
+     * @param expectedStats The expected counts for PPDU and MPDU reception.
      * @param nodeId The node ID for which to check the received stats.
      * @param deviceId The device ID for which to check the received stats.
      * @param linkId The link ID for which to check the received stats.
@@ -134,7 +132,7 @@
 
     /**
      * Checks the statistics of PPDU and MPDU reception success and failure.
-     * \param expectedRecordCount The expected number of records.
+     * @param expectedRecordCount The expected number of records.
      */
     void CheckRecords(uint64_t expectedRecordCount);
 
@@ -170,7 +168,7 @@
 void
 TestWifiPhyRxTraceHelper::DoSetup()
 {
-    double txPower = 20;
+    dBm_u txPower{20};
 
     auto spectrumChannel = CreateObject<SingleModelSpectrumChannel>();
 
@@ -249,12 +247,12 @@
 }
 
 void
-TestWifiPhyRxTraceHelper::SendPpduWithTwoMpdus(double rxPowerDbm,
+TestWifiPhyRxTraceHelper::SendPpduWithTwoMpdus(dBm_u rxPower,
                                                Mac48Address receiver1,
                                                Mac48Address receiver2,
                                                Ptr<ns3::SpectrumWifiPhy> tx_phy)
 {
-    double txPower = rxPowerDbm;
+    auto txPower = rxPower;
     tx_phy->SetTxPowerStart(txPower);
     tx_phy->SetTxPowerEnd(txPower);
 
@@ -265,7 +263,7 @@
                                          1,
                                          1,
                                          0,
-                                         20,
+                                         MHz_u{20},
                                          true);
 
     std::vector<Ptr<WifiMpdu>> mpduList;
@@ -290,11 +288,11 @@
 }
 
 void
-TestWifiPhyRxTraceHelper::SendPpduWithOneMpdu(double rxPowerDbm,
+TestWifiPhyRxTraceHelper::SendPpduWithOneMpdu(dBm_u rxPower,
                                               Mac48Address receiver1,
                                               Ptr<ns3::SpectrumWifiPhy> tx_phy)
 {
-    double txPower = rxPowerDbm;
+    auto txPower = rxPower;
     tx_phy->SetTxPowerStart(txPower);
     tx_phy->SetTxPowerEnd(txPower);
 
@@ -305,7 +303,7 @@
                                          1,
                                          1,
                                          0,
-                                         20,
+                                         MHz_u{20},
                                          true);
 
     std::vector<Ptr<WifiMpdu>> mpduList;
@@ -395,7 +393,7 @@
     RngSeedManager::SetSeed(1);
     RngSeedManager::SetRun(2);
     int64_t streamNumber = 1;
-    double rxPowerDbm = -80;
+    dBm_u rxPower{-80};
     streamNumber += m_txA->AssignStreams(streamNumber);
     streamNumber += m_txB->AssignStreams(streamNumber);
     streamNumber += m_rx->AssignStreams(streamNumber);
@@ -415,7 +413,7 @@
     Simulator::Schedule(Seconds(0.1),
                         &TestWifiPhyRxTraceHelper::SendPpduWithTwoMpdus,
                         this,
-                        rxPowerDbm,
+                        rxPower,
                         correctReceiver, // One MPDU addressed to
                         wrongReceiver,   // One MPDU addressed to
                         m_txA);
@@ -450,12 +448,12 @@
     expectedStats.m_failedMpdus = 1;
     expectedStats.m_overlappingPpdus = 0;
     expectedStats.m_nonOverlappingPpdus = 1;
-    rxPowerDbm = -83;
+    rxPower = dBm_u{-83};
     // A-MPDU 1
     Simulator::Schedule(Seconds(0.3),
                         &TestWifiPhyRxTraceHelper::SendPpduWithTwoMpdus,
                         this,
-                        rxPowerDbm,
+                        rxPower,
                         correctReceiver, // One MPDU addressed to
                         wrongReceiver,   // One MPDU addressed to
                         m_txA);
@@ -490,12 +488,12 @@
     expectedStats.m_failedMpdus = 0;
     expectedStats.m_overlappingPpdus = 0;
     expectedStats.m_nonOverlappingPpdus = 0;
-    rxPowerDbm = -80;
+    rxPower = dBm_u{-80};
     // A-MPDU 1
     Simulator::Schedule(Seconds(0.5),
                         &TestWifiPhyRxTraceHelper::SendPpduWithTwoMpdus,
                         this,
-                        rxPowerDbm,
+                        rxPower,
                         wrongReceiver, // One MPDU addressed to
                         wrongReceiver, // One MPDU addressed to
                         m_txA);
@@ -530,12 +528,12 @@
     expectedStats.m_failedMpdus = 0;
     expectedStats.m_overlappingPpdus = 0;
     expectedStats.m_nonOverlappingPpdus = 0;
-    rxPowerDbm = -83;
+    rxPower = dBm_u{-83};
     // A-MPDU 1
     Simulator::Schedule(Seconds(0.7),
                         &TestWifiPhyRxTraceHelper::SendPpduWithTwoMpdus,
                         this,
-                        rxPowerDbm,
+                        rxPower,
                         wrongReceiver, // One MPDU addressed to
                         wrongReceiver, // One MPDU addressed to
                         m_txA);
@@ -571,19 +569,19 @@
     expectedStats.m_failedMpdus = 2;
     expectedStats.m_overlappingPpdus = 2;
     expectedStats.m_nonOverlappingPpdus = 0;
-    rxPowerDbm = -80;
+    rxPower = dBm_u{-80};
     // A-MPDU 1
     Simulator::Schedule(Seconds(0.9),
                         &TestWifiPhyRxTraceHelper::SendPpduWithOneMpdu,
                         this,
-                        rxPowerDbm,
+                        rxPower,
                         correctReceiver, // One MPDU addressed to
                         m_txA);
     // A-MPDU 2
     Simulator::Schedule(Seconds(0.9),
                         &TestWifiPhyRxTraceHelper::SendPpduWithOneMpdu,
                         this,
-                        rxPowerDbm,
+                        rxPower,
                         correctReceiver, // One MPDU addressed to
                         m_txB);
 
@@ -618,19 +616,19 @@
     expectedStats.m_failedMpdus = 1;
     expectedStats.m_overlappingPpdus = 1;
     expectedStats.m_nonOverlappingPpdus = 0;
-    rxPowerDbm = -80;
+    rxPower = dBm_u{-80};
     // A-MPDU 1
     Simulator::Schedule(Seconds(1.1),
                         &TestWifiPhyRxTraceHelper::SendPpduWithOneMpdu,
                         this,
-                        rxPowerDbm,
+                        rxPower,
                         correctReceiver, // One MPDU addressed to
                         m_txA);
     // A-MPDU 2
     Simulator::Schedule(Seconds(1.1),
                         &TestWifiPhyRxTraceHelper::SendPpduWithOneMpdu,
                         this,
-                        rxPowerDbm,
+                        rxPower,
                         wrongReceiver, // One MPDU addressed to
                         m_txB);
 
@@ -668,14 +666,14 @@
     expectedStats.m_failedMpdus = 0;
     expectedStats.m_overlappingPpdus = 0;
     expectedStats.m_nonOverlappingPpdus = 1;
-    rxPowerDbm = -80;
+    rxPower = dBm_u{-80};
     m_rxTraceHelper.Start(Seconds(1.29));
 
     // A-MPDU 1
     Simulator::Schedule(Seconds(1.3),
                         &TestWifiPhyRxTraceHelper::SendPpduWithOneMpdu,
                         this,
-                        rxPowerDbm,
+                        rxPower,
                         correctReceiver, // One MPDU addressed to
                         m_txA);
 
@@ -711,7 +709,7 @@
     expectedStats.m_failedMpdus = 0;
     expectedStats.m_overlappingPpdus = 0;
     expectedStats.m_nonOverlappingPpdus = 0;
-    rxPowerDbm = -80;
+    rxPower = dBm_u{-80};
 
     m_rxTraceHelper.Start(Seconds(1.41));
 
@@ -721,7 +719,7 @@
     Simulator::Schedule(Seconds(1.45),
                         &TestWifiPhyRxTraceHelper::SendPpduWithOneMpdu,
                         this,
-                        rxPowerDbm,
+                        rxPower,
                         correctReceiver, // One MPDU addressed to
                         m_txA);
 
@@ -755,13 +753,13 @@
     expectedStats.m_failedMpdus = 0;
     expectedStats.m_overlappingPpdus = 0;
     expectedStats.m_nonOverlappingPpdus = 1;
-    rxPowerDbm = -80;
+    rxPower = dBm_u{-80};
 
     // A-MPDU 1
     Simulator::Schedule(Seconds(1.6),
                         &TestWifiPhyRxTraceHelper::SendPpduWithOneMpdu,
                         this,
-                        rxPowerDbm,
+                        rxPower,
                         correctReceiver, // One MPDU addressed to
                         m_txA);
 
@@ -799,7 +797,7 @@
     expectedStats.m_failedMpdus = 0;
     expectedStats.m_overlappingPpdus = 0;
     expectedStats.m_nonOverlappingPpdus = 0;
-    rxPowerDbm = -80;
+    rxPower = dBm_u{-80};
 
     m_rxTraceHelper.Start(Seconds(1.79));
 
@@ -807,7 +805,7 @@
     Simulator::Schedule(Seconds(1.8),
                         &TestWifiPhyRxTraceHelper::SendPpduWithOneMpdu,
                         this,
-                        rxPowerDbm,
+                        rxPower,
                         correctReceiver, // One MPDU addressed to
                         m_txA);
 
@@ -841,8 +839,8 @@
 }
 
 /**
- * \ingroup wifi-test
- * \brief Implements a test case to evaluate the reception process of WiFi Physical Layer (PHY)
+ * @ingroup wifi-test
+ * @brief Implements a test case to evaluate the reception process of WiFi Physical Layer (PHY)
  * frames (PPDU) containing multiple MAC Protocol Data Units (MPDUs) in Multi-Link Operation (MLO)
  * contexts.
  *
@@ -871,36 +869,34 @@
     /**
      * Sends a PPDU containing two MPDUs addressed to specific receivers, simulating an MLO
      * scenario.
-     * \param rxPowerDbm The transmit power in dBm.
-     * \param add1 The MAC address of the first receiver.
-     * \param add2 The MAC address of the second receiver.
-     * \param tx_phy The transmitting PHY object for MLO.
+     * @param rxPower The transmit power.
+     * @param add1 The MAC address of the first receiver.
+     * @param add2 The MAC address of the second receiver.
+     * @param tx_phy The transmitting PHY object for MLO.
      */
-    void SendPpduWithTwoMpdus(double rxPowerDbm,
+    void SendPpduWithTwoMpdus(dBm_u rxPower,
                               Mac48Address add1,
                               Mac48Address add2,
                               Ptr<ns3::SpectrumWifiPhy> tx_phy);
 
     /**
      * Sends a PPDU containing one MPDU addressed to a specific receiver, within an MLO setup.
-     * \param rxPowerDbm The transmit power in dBm.
-     * \param add1 The MAC address of the receiver.
-     * \param tx_phy The transmitting PHY object for MLO.
-     */
-    void SendPpduWithOneMpdu(double rxPowerDbm,
-                             Mac48Address add1,
-                             Ptr<ns3::SpectrumWifiPhy> tx_phy);
+     * @param rxPower The transmit power.
+     * @param add1 The MAC address of the receiver.
+     * @param tx_phy The transmitting PHY object for MLO.
+     */
+    void SendPpduWithOneMpdu(dBm_u rxPower, Mac48Address add1, Ptr<ns3::SpectrumWifiPhy> tx_phy);
 
     /**
      * Checks the statistics of PPDU and MPDU reception success and failure.
-     * \param expectedStats The expected counts for PPDU and MPDU reception.
+     * @param expectedStats The expected counts for PPDU and MPDU reception.
      * @param nodeId The node ID for which to check the received stats.
      */
     void CheckStats(WifiPhyTraceStatistics expectedStats, uint32_t nodeId);
 
     /**
      * Checks the statistics of PPDU and MPDU reception success and failure.
-     * \param expectedStats The expected counts for PPDU and MPDU reception.
+     * @param expectedStats The expected counts for PPDU and MPDU reception.
      * @param nodeId The node ID for which to check the received stats.
      * @param deviceId The device ID for which to check the received stats.
      */
@@ -908,7 +904,7 @@
 
     /**
      * Checks the statistics of PPDU and MPDU reception success and failure.
-     * \param expectedStats The expected counts for PPDU and MPDU reception.
+     * @param expectedStats The expected counts for PPDU and MPDU reception.
      * @param nodeId The node ID for which to check the received stats.
      * @param deviceId The device ID for which to check the received stats.
      * @param linkId The link ID for which to check the received stats.
@@ -920,12 +916,12 @@
 
     /**
      * Checks the statistics of PPDU and MPDU reception success and failure in MLO scenarios.
-     * \param expectedPpduSuccess The expected number of successful PPDU receptions.
-     * \param expectedPpduFailure The expected number of failed PPDU receptions.
-     * \param expectedMpduSuccess The expected number of successful MPDU receptions within PPDUs.
-     * \param expectedMpduFailure The expected number of failed MPDU receptions within PPDUs.
-     * \param expectedOverlaps The expected number of overlapping reception events.
-     * \param expectedNonOverlaps The expected number of non-overlapping reception events.
+     * @param expectedPpduSuccess The expected number of successful PPDU receptions.
+     * @param expectedPpduFailure The expected number of failed PPDU receptions.
+     * @param expectedMpduSuccess The expected number of successful MPDU receptions within PPDUs.
+     * @param expectedMpduFailure The expected number of failed MPDU receptions within PPDUs.
+     * @param expectedOverlaps The expected number of overlapping reception events.
+     * @param expectedNonOverlaps The expected number of non-overlapping reception events.
      */
     void CheckAllStats(uint64_t expectedPpduSuccess,
                        uint64_t expectedPpduFailure,
@@ -936,7 +932,7 @@
 
     /**
      * Checks the statistics of PPDU and MPDU reception success and failure.
-     * \param expectedRecordCount The expected number of records.
+     * @param expectedRecordCount The expected number of records.
      */
     void CheckRecords(uint64_t expectedRecordCount);
 
@@ -975,7 +971,7 @@
 void
 TestWifiPhyRxTraceHelperMloStr::DoSetup()
 {
-    double txPower = 20;
+    dBm_u txPower{20};
     auto ehtConfiguration = CreateObject<EhtConfiguration>();
 
     auto nodeA = CreateObject<Node>();
@@ -1123,12 +1119,12 @@
 }
 
 void
-TestWifiPhyRxTraceHelperMloStr::SendPpduWithTwoMpdus(double rxPowerDbm,
+TestWifiPhyRxTraceHelperMloStr::SendPpduWithTwoMpdus(dBm_u rxPower,
                                                      Mac48Address receiver1,
                                                      Mac48Address receiver2,
                                                      Ptr<ns3::SpectrumWifiPhy> tx_phy)
 {
-    double txPower = rxPowerDbm;
+    auto txPower = rxPower;
     tx_phy->SetTxPowerStart(txPower);
     tx_phy->SetTxPowerEnd(txPower);
 
@@ -1139,7 +1135,7 @@
                                          1,
                                          1,
                                          0,
-                                         20,
+                                         MHz_u{20},
                                          true);
 
     std::vector<Ptr<WifiMpdu>> mpduList;
@@ -1164,11 +1160,11 @@
 }
 
 void
-TestWifiPhyRxTraceHelperMloStr::SendPpduWithOneMpdu(double rxPowerDbm,
+TestWifiPhyRxTraceHelperMloStr::SendPpduWithOneMpdu(dBm_u rxPower,
                                                     Mac48Address receiver1,
                                                     Ptr<ns3::SpectrumWifiPhy> tx_phy)
 {
-    double txPower = rxPowerDbm;
+    auto txPower = rxPower;
     tx_phy->SetTxPowerStart(txPower);
     tx_phy->SetTxPowerEnd(txPower);
 
@@ -1180,7 +1176,7 @@
                      1,
                      1,
                      0,
-                     20,
+                     MHz_u{20},
                      true); // for some reason needs to be set to true even though only one MPDU
 
     std::vector<Ptr<WifiMpdu>> mpduList;
@@ -1339,7 +1335,7 @@
     RngSeedManager::SetSeed(1);
     RngSeedManager::SetRun(2);
     int64_t streamNumber = 1;
-    double rxPowerDbm = -80;
+    dBm_u rxPower{-80};
     streamNumber += m_tx0A->AssignStreams(streamNumber);
     streamNumber += m_tx0B->AssignStreams(streamNumber);
     streamNumber += m_tx1A->AssignStreams(streamNumber);
@@ -1362,7 +1358,7 @@
     Simulator::Schedule(Seconds(0.1),
                         &TestWifiPhyRxTraceHelperMloStr::SendPpduWithTwoMpdus,
                         this,
-                        rxPowerDbm,
+                        rxPower,
                         correctReceiver, // One MPDU addressed to
                         wrongReceiver,   // One MPDU addressed to
                         m_tx0A);
@@ -1370,7 +1366,7 @@
     Simulator::Schedule(Seconds(0.1),
                         &TestWifiPhyRxTraceHelperMloStr::SendPpduWithTwoMpdus,
                         this,
-                        rxPowerDbm,
+                        rxPower,
                         correctReceiver, // One MPDU addressed to
                         wrongReceiver,   // One MPDU addressed to
                         m_tx0B);
@@ -1405,12 +1401,12 @@
     expectedStats.m_failedMpdus = 2;
     expectedStats.m_overlappingPpdus = 0;
     expectedStats.m_nonOverlappingPpdus = 2;
-    rxPowerDbm = -83;
+    rxPower = dBm_u{-83};
     // A-MPDU 1
     Simulator::Schedule(Seconds(0.3),
                         &TestWifiPhyRxTraceHelperMloStr::SendPpduWithTwoMpdus,
                         this,
-                        rxPowerDbm,
+                        rxPower,
                         correctReceiver, // One MPDU addressed to
                         wrongReceiver,   // One MPDU addressed to
                         m_tx0A);
@@ -1418,7 +1414,7 @@
     Simulator::Schedule(Seconds(0.3),
                         &TestWifiPhyRxTraceHelperMloStr::SendPpduWithTwoMpdus,
                         this,
-                        rxPowerDbm,
+                        rxPower,
                         correctReceiver, // One MPDU addressed to
                         wrongReceiver,   // One MPDU addressed to
                         m_tx0B);
@@ -1453,12 +1449,12 @@
     expectedStats.m_failedMpdus = 0;
     expectedStats.m_overlappingPpdus = 0;
     expectedStats.m_nonOverlappingPpdus = 0;
-    rxPowerDbm = -80;
+    rxPower = dBm_u{-80};
     // A-MPDU 1
     Simulator::Schedule(Seconds(0.5),
                         &TestWifiPhyRxTraceHelperMloStr::SendPpduWithTwoMpdus,
                         this,
-                        rxPowerDbm,
+                        rxPower,
                         wrongReceiver, // One MPDU addressed to
                         wrongReceiver, // One MPDU addressed to
                         m_tx0A);
@@ -1467,7 +1463,7 @@
     Simulator::Schedule(Seconds(0.5),
                         &TestWifiPhyRxTraceHelperMloStr::SendPpduWithTwoMpdus,
                         this,
-                        rxPowerDbm,
+                        rxPower,
                         wrongReceiver, // One MPDU addressed to
                         wrongReceiver, // One MPDU addressed to
                         m_tx0B);
@@ -1502,12 +1498,12 @@
     expectedStats.m_failedMpdus = 0;
     expectedStats.m_overlappingPpdus = 0;
     expectedStats.m_nonOverlappingPpdus = 0;
-    rxPowerDbm = -83;
+    rxPower = dBm_u{-83};
     // A-MPDU 1
     Simulator::Schedule(Seconds(0.7),
                         &TestWifiPhyRxTraceHelperMloStr::SendPpduWithTwoMpdus,
                         this,
-                        rxPowerDbm,
+                        rxPower,
                         wrongReceiver, // One MPDU addressed to
                         wrongReceiver, // One MPDU addressed to
                         m_tx0A);
@@ -1516,7 +1512,7 @@
     Simulator::Schedule(Seconds(0.7),
                         &TestWifiPhyRxTraceHelperMloStr::SendPpduWithTwoMpdus,
                         this,
-                        rxPowerDbm,
+                        rxPower,
                         wrongReceiver, // One MPDU addressed to
                         wrongReceiver, // One MPDU addressed to
                         m_tx0B);
@@ -1552,19 +1548,19 @@
     expectedStats.m_failedMpdus = 4;
     expectedStats.m_overlappingPpdus = 4;
     expectedStats.m_nonOverlappingPpdus = 0;
-    rxPowerDbm = -80;
+    rxPower = dBm_u{-80};
     // A-MPDU 1
     Simulator::Schedule(Seconds(0.9),
                         &TestWifiPhyRxTraceHelperMloStr::SendPpduWithOneMpdu,
                         this,
-                        rxPowerDbm,
+                        rxPower,
                         correctReceiver, // One MPDU addressed to
                         m_tx0A);
     // A-MPDU 2
     Simulator::Schedule(Seconds(0.9),
                         &TestWifiPhyRxTraceHelperMloStr::SendPpduWithOneMpdu,
                         this,
-                        rxPowerDbm,
+                        rxPower,
                         correctReceiver, // One MPDU addressed to
                         m_tx1A);
 
@@ -1572,14 +1568,14 @@
     Simulator::Schedule(Seconds(0.9),
                         &TestWifiPhyRxTraceHelperMloStr::SendPpduWithOneMpdu,
                         this,
-                        rxPowerDbm,
+                        rxPower,
                         correctReceiver, // One MPDU addressed to
                         m_tx0B);
     // A-MPDU 2
     Simulator::Schedule(Seconds(0.9),
                         &TestWifiPhyRxTraceHelperMloStr::SendPpduWithOneMpdu,
                         this,
-                        rxPowerDbm,
+                        rxPower,
                         correctReceiver, // One MPDU addressed to
                         m_tx1B);
 
@@ -1614,19 +1610,19 @@
     expectedStats.m_failedMpdus = 2;
     expectedStats.m_overlappingPpdus = 2;
     expectedStats.m_nonOverlappingPpdus = 0;
-    rxPowerDbm = -80;
+    rxPower = dBm_u{-80};
     // A-MPDU 1
     Simulator::Schedule(Seconds(1.1),
                         &TestWifiPhyRxTraceHelperMloStr::SendPpduWithOneMpdu,
                         this,
-                        rxPowerDbm,
+                        rxPower,
                         correctReceiver, // One MPDU addressed to
                         m_tx0A);
     // A-MPDU 2
     Simulator::Schedule(Seconds(1.1),
                         &TestWifiPhyRxTraceHelperMloStr::SendPpduWithOneMpdu,
                         this,
-                        rxPowerDbm,
+                        rxPower,
                         wrongReceiver, // One MPDU addressed to
                         m_tx1A);
 
@@ -1634,14 +1630,14 @@
     Simulator::Schedule(Seconds(1.1),
                         &TestWifiPhyRxTraceHelperMloStr::SendPpduWithOneMpdu,
                         this,
-                        rxPowerDbm,
+                        rxPower,
                         correctReceiver, // One MPDU addressed to
                         m_tx0B);
     // A-MPDU 2
     Simulator::Schedule(Seconds(1.1),
                         &TestWifiPhyRxTraceHelperMloStr::SendPpduWithOneMpdu,
                         this,
-                        rxPowerDbm,
+                        rxPower,
                         wrongReceiver, // One MPDU addressed to
                         m_tx1B);
 
@@ -1675,8 +1671,8 @@
 }
 
 /**
- * \ingroup wifi-test
- * \brief Implements a test case to evaluate the reception process of WiFi Physical Layer (PHY)
+ * @ingroup wifi-test
+ * @brief Implements a test case to evaluate the reception process of WiFi Physical Layer (PHY)
  * frames (PPDU) with multiple MAC Protocol Data Units (MPDUs) when using YansWifiPhy.
  *
  * This class extends the TestCase class to simulate and analyze the reception of PPDUs containing
@@ -1703,32 +1699,32 @@
 
     /**
      * Sends a PPDU containing two MPDUs addressed to specific receivers.
-     * \param rxPowerDbm The transmit power in dBm.
-     * \param add1 The MAC address of the first receiver.
-     * \param add2 The MAC address of the second receiver.
-     * \param tx_phy The transmitting PHY object.
+     * @param rxPower The transmit power.
+     * @param add1 The MAC address of the first receiver.
+     * @param add2 The MAC address of the second receiver.
+     * @param tx_phy The transmitting PHY object.
      */
-    void SendPpduWithTwoMpdus(double rxPowerDbm,
+    void SendPpduWithTwoMpdus(dBm_u rxPower,
                               Mac48Address add1,
                               Mac48Address add2,
                               Ptr<ns3::YansWifiPhy> tx_phy);
 
     /**
      * Sends a PPDU containing one MPDU addressed to a specific receiver.
-     * \param rxPowerDbm The transmit power in dBm.
-     * \param add1 The MAC address of the receiver.
-     * \param tx_phy The transmitting PHY object.
+     * @param rxPower The transmit power.
+     * @param add1 The MAC address of the receiver.
+     * @param tx_phy The transmitting PHY object.
      */
-    void SendPpduWithOneMpdu(double rxPowerDbm, Mac48Address add1, Ptr<ns3::YansWifiPhy> tx_phy);
+    void SendPpduWithOneMpdu(dBm_u rxPower, Mac48Address add1, Ptr<ns3::YansWifiPhy> tx_phy);
 
     /**
      * Checks the statistics of PPDU and MPDU reception success and failure.
-     * \param expectedPpduSuccess The expected number of successful PPDU receptions.
-     * \param expectedPpduFailure The expected number of failed PPDU receptions.
-     * \param expectedMpduSuccess The expected number of successful MPDU receptions within PPDUs.
-     * \param expectedMpduFailure The expected number of failed MPDU receptions within PPDUs.
-     * \param expectedOverlaps The expected number of overlapping reception events.
-     * \param expectedNonOverlaps The expected number of non-overlapping reception events.
+     * @param expectedPpduSuccess The expected number of successful PPDU receptions.
+     * @param expectedPpduFailure The expected number of failed PPDU receptions.
+     * @param expectedMpduSuccess The expected number of successful MPDU receptions within PPDUs.
+     * @param expectedMpduFailure The expected number of failed MPDU receptions within PPDUs.
+     * @param expectedOverlaps The expected number of overlapping reception events.
+     * @param expectedNonOverlaps The expected number of non-overlapping reception events.
      */
     void CheckAllStats(uint64_t expectedPpduSuccess,
                        uint64_t expectedPpduFailure,
@@ -1739,7 +1735,7 @@
 
     /**
      * Checks the statistics of PPDU and MPDU reception success and failure.
-     * \param expectedStats The expected counts for PPDU and MPDU reception.
+     * @param expectedStats The expected counts for PPDU and MPDU reception.
      * @param nodeId The node ID for which to check the received stats.
      * @param deviceId The device ID for which to check the received stats.
      * @param linkId The link ID for which to check the received stats.
@@ -1751,7 +1747,7 @@
 
     /**
      * Checks the statistics of PPDU and MPDU reception success and failure.
-     * \param expectedRecordCount The expected number of records.
+     * @param expectedRecordCount The expected number of records.
      */
     void CheckRecords(uint64_t expectedRecordCount);
 
@@ -1791,7 +1787,7 @@
 void
 TestWifiPhyRxTraceHelperYans::DoSetup()
 {
-    double txPower = 20;
+    dBm_u txPower{20};
 
     auto yansChannel = CreateObject<YansWifiChannel>();
     auto propDelay = CreateObject<ConstantSpeedPropagationDelayModel>();
@@ -1886,12 +1882,12 @@
 }
 
 void
-TestWifiPhyRxTraceHelperYans::SendPpduWithTwoMpdus(double rxPowerDbm,
+TestWifiPhyRxTraceHelperYans::SendPpduWithTwoMpdus(dBm_u rxPower,
                                                    Mac48Address receiver1,
                                                    Mac48Address receiver2,
                                                    Ptr<ns3::YansWifiPhy> tx_phy)
 {
-    propLoss->SetRss(rxPowerDbm);
+    propLoss->SetRss(rxPower);
 
     WifiTxVector txVector = WifiTxVector(HePhy::GetHeMcs0(),
                                          0,
@@ -1900,7 +1896,7 @@
                                          1,
                                          1,
                                          0,
-                                         20,
+                                         MHz_u{20},
                                          true);
 
     std::vector<Ptr<WifiMpdu>> mpduList;
@@ -1920,12 +1916,12 @@
     mpduList.emplace_back(Create<WifiMpdu>(p2, hdr2));
 
     auto psdu = Create<WifiPsdu>(mpduList);
-    auto ppdu =
-        Create<HePpdu>(psdu,
-                       txVector,
-                       tx_phy->GetOperatingChannel(),
-                       tx_phy->CalculateTxDuration(psdu->GetSize(), txVector, tx_phy->GetPhyBand()),
-                       m_uid);
+    auto ppdu = Create<HePpdu>(
+        psdu,
+        txVector,
+        tx_phy->GetOperatingChannel(),
+        YansWifiPhy::CalculateTxDuration(psdu->GetSize(), txVector, tx_phy->GetPhyBand()),
+        m_uid);
 
     m_uid++;
 
@@ -1933,11 +1929,11 @@
 }
 
 void
-TestWifiPhyRxTraceHelperYans::SendPpduWithOneMpdu(double rxPowerDbm,
+TestWifiPhyRxTraceHelperYans::SendPpduWithOneMpdu(dBm_u rxPower,
                                                   Mac48Address receiver1,
                                                   Ptr<ns3::YansWifiPhy> tx_phy)
 {
-    propLoss->SetRss(rxPowerDbm);
+    propLoss->SetRss(rxPower);
 
     auto txVector = WifiTxVector(HePhy::GetHeMcs0(),
                                  0,
@@ -1946,7 +1942,7 @@
                                  1,
                                  1,
                                  0,
-                                 20,
+                                 MHz_u{20},
                                  true);
 
     std::vector<Ptr<WifiMpdu>> mpduList;
@@ -1959,12 +1955,12 @@
     mpduList.emplace_back(Create<WifiMpdu>(p1, hdr1));
 
     auto psdu = Create<WifiPsdu>(mpduList);
-    auto ppdu =
-        Create<HePpdu>(psdu,
-                       txVector,
-                       tx_phy->GetOperatingChannel(),
-                       tx_phy->CalculateTxDuration(psdu->GetSize(), txVector, tx_phy->GetPhyBand()),
-                       m_uid);
+    auto ppdu = Create<HePpdu>(
+        psdu,
+        txVector,
+        tx_phy->GetOperatingChannel(),
+        YansWifiPhy::CalculateTxDuration(psdu->GetSize(), txVector, tx_phy->GetPhyBand()),
+        m_uid);
 
     m_uid++;
 
@@ -2046,7 +2042,7 @@
     RngSeedManager::SetSeed(1);
     RngSeedManager::SetRun(2);
     int64_t streamNumber = 1;
-    double rxPowerDbm = -80;
+    dBm_u rxPower{-80};
     streamNumber += m_txA->AssignStreams(streamNumber);
     streamNumber += m_txB->AssignStreams(streamNumber);
     streamNumber += m_rx->AssignStreams(streamNumber);
@@ -2066,7 +2062,7 @@
     Simulator::Schedule(Seconds(0.1),
                         &TestWifiPhyRxTraceHelperYans::SendPpduWithTwoMpdus,
                         this,
-                        rxPowerDbm,
+                        rxPower,
                         correctReceiver, // One MPDU addressed to
                         wrongReceiver,   // One MPDU addressed to
                         m_txA);
@@ -2100,12 +2096,12 @@
     expectedStats.m_failedMpdus = 1;
     expectedStats.m_overlappingPpdus = 0;
     expectedStats.m_nonOverlappingPpdus = 1;
-    rxPowerDbm = -83;
+    rxPower = dBm_u{-83};
     // A-MPDU 1
     Simulator::Schedule(Seconds(0.3),
                         &TestWifiPhyRxTraceHelperYans::SendPpduWithTwoMpdus,
                         this,
-                        rxPowerDbm,
+                        rxPower,
                         correctReceiver, // One MPDU addressed to
                         wrongReceiver,   // One MPDU addressed to
                         m_txA);
@@ -2140,12 +2136,12 @@
     expectedStats.m_failedMpdus = 0;
     expectedStats.m_overlappingPpdus = 0;
     expectedStats.m_nonOverlappingPpdus = 0;
-    rxPowerDbm = -80;
+    rxPower = dBm_u{-80};
     // A-MPDU 1
     Simulator::Schedule(Seconds(0.5),
                         &TestWifiPhyRxTraceHelperYans::SendPpduWithTwoMpdus,
                         this,
-                        rxPowerDbm,
+                        rxPower,
                         wrongReceiver, // One MPDU addressed to
                         wrongReceiver, // One MPDU addressed to
                         m_txA);
@@ -2180,12 +2176,12 @@
     expectedStats.m_failedMpdus = 0;
     expectedStats.m_overlappingPpdus = 0;
     expectedStats.m_nonOverlappingPpdus = 0;
-    rxPowerDbm = -83;
+    rxPower = dBm_u{-83};
     // A-MPDU 1
     Simulator::Schedule(Seconds(0.7),
                         &TestWifiPhyRxTraceHelperYans::SendPpduWithTwoMpdus,
                         this,
-                        rxPowerDbm,
+                        rxPower,
                         wrongReceiver, // One MPDU addressed to
                         wrongReceiver, // One MPDU addressed to
                         m_txA);
@@ -2221,19 +2217,19 @@
     expectedStats.m_failedMpdus = 2;
     expectedStats.m_overlappingPpdus = 2;
     expectedStats.m_nonOverlappingPpdus = 0;
-    rxPowerDbm = -80;
+    rxPower = dBm_u{-80};
     // A-MPDU 1
     Simulator::Schedule(Seconds(0.9),
                         &TestWifiPhyRxTraceHelperYans::SendPpduWithOneMpdu,
                         this,
-                        rxPowerDbm,
+                        rxPower,
                         correctReceiver, // One MPDU addressed to
                         m_txA);
     // A-MPDU 2
     Simulator::Schedule(Seconds(0.9),
                         &TestWifiPhyRxTraceHelperYans::SendPpduWithOneMpdu,
                         this,
-                        rxPowerDbm,
+                        rxPower,
                         correctReceiver, // One MPDU addressed to
                         m_txB);
 
@@ -2268,19 +2264,19 @@
     expectedStats.m_failedMpdus = 1;
     expectedStats.m_overlappingPpdus = 1;
     expectedStats.m_nonOverlappingPpdus = 0;
-    rxPowerDbm = -80;
+    rxPower = dBm_u{-80};
     // A-MPDU 1
     Simulator::Schedule(Seconds(1.1),
                         &TestWifiPhyRxTraceHelperYans::SendPpduWithOneMpdu,
                         this,
-                        rxPowerDbm,
+                        rxPower,
                         correctReceiver, // One MPDU addressed to
                         m_txA);
     // A-MPDU 2
     Simulator::Schedule(Seconds(1.1),
                         &TestWifiPhyRxTraceHelperYans::SendPpduWithOneMpdu,
                         this,
-                        rxPowerDbm,
+                        rxPower,
                         wrongReceiver, // One MPDU addressed to
                         m_txB);
 
@@ -2318,14 +2314,14 @@
     expectedStats.m_failedMpdus = 0;
     expectedStats.m_overlappingPpdus = 0;
     expectedStats.m_nonOverlappingPpdus = 1;
-    rxPowerDbm = -80;
+    rxPower = dBm_u{-80};
     m_rxTraceHelper.Start(Seconds(1.29));
 
     // A-MPDU 1
     Simulator::Schedule(Seconds(1.3),
                         &TestWifiPhyRxTraceHelperYans::SendPpduWithOneMpdu,
                         this,
-                        rxPowerDbm,
+                        rxPower,
                         correctReceiver, // One MPDU addressed to
                         m_txA);
 
@@ -2361,7 +2357,7 @@
     expectedStats.m_failedMpdus = 0;
     expectedStats.m_overlappingPpdus = 0;
     expectedStats.m_nonOverlappingPpdus = 0;
-    rxPowerDbm = -80;
+    rxPower = dBm_u{-80};
 
     m_rxTraceHelper.Start(Seconds(1.41));
 
@@ -2371,7 +2367,7 @@
     Simulator::Schedule(Seconds(1.45),
                         &TestWifiPhyRxTraceHelperYans::SendPpduWithOneMpdu,
                         this,
-                        rxPowerDbm,
+                        rxPower,
                         correctReceiver, // One MPDU addressed to
                         m_txA);
 
@@ -2405,13 +2401,13 @@
     expectedStats.m_failedMpdus = 0;
     expectedStats.m_overlappingPpdus = 0;
     expectedStats.m_nonOverlappingPpdus = 1;
-    rxPowerDbm = -80;
+    rxPower = dBm_u{-80};
 
     // A-MPDU 1
     Simulator::Schedule(Seconds(1.6),
                         &TestWifiPhyRxTraceHelperYans::SendPpduWithOneMpdu,
                         this,
-                        rxPowerDbm,
+                        rxPower,
                         correctReceiver, // One MPDU addressed to
                         m_txA);
 
@@ -2449,7 +2445,7 @@
     expectedStats.m_failedMpdus = 0;
     expectedStats.m_overlappingPpdus = 0;
     expectedStats.m_nonOverlappingPpdus = 0;
-    rxPowerDbm = -80;
+    rxPower = dBm_u{-80};
 
     m_rxTraceHelper.Start(Seconds(1.79));
 
@@ -2457,7 +2453,7 @@
     Simulator::Schedule(Seconds(1.8),
                         &TestWifiPhyRxTraceHelperYans::SendPpduWithOneMpdu,
                         this,
-                        rxPowerDbm,
+                        rxPower,
                         correctReceiver, // One MPDU addressed to
                         m_txA);
 
@@ -2491,10 +2487,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief wifi PHY reception Test Suite
+ * @brief wifi PHY reception Test Suite
  */
 class WifiPhyRxTraceHelperTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/test/wifi-phy-thresholds-test.cc ns-3.44/src/wifi/test/wifi-phy-thresholds-test.cc
--- ns-3.43/src/wifi/test/wifi-phy-thresholds-test.cc	2024-10-09 16:41:10.140657000 -0700
+++ ns-3.44/src/wifi/test/wifi-phy-thresholds-test.cc	2025-03-09 16:55:49.811372800 -0700
@@ -29,14 +29,14 @@
 NS_LOG_COMPONENT_DEFINE("WifiPhyThresholdsTest");
 
 static const uint8_t CHANNEL_NUMBER = 36;
-static const MHz_u FREQUENCY = 5180;
-static const MHz_u CHANNEL_WIDTH = 20;
+static const MHz_u FREQUENCY{5180};
+static const MHz_u CHANNEL_WIDTH{20};
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Wifi Phy Threshold Test base class
+ * @brief Wifi Phy Threshold Test base class
  */
 class WifiPhyThresholdsTest : public TestCase
 {
@@ -44,58 +44,58 @@
     /**
      * Constructor
      *
-     * \param test_name the test name
+     * @param test_name the test name
      */
     WifiPhyThresholdsTest(std::string test_name);
 
   protected:
     /**
      * Make wifi signal function
-     * \param txPower the transmit power
-     * \param channel the operating channel of the PHY used for the transmission
-     * \returns Ptr<SpectrumSignalParameters>
+     * @param txPower the transmit power
+     * @param channel the operating channel of the PHY used for the transmission
+     * @returns Ptr<SpectrumSignalParameters>
      */
     virtual Ptr<SpectrumSignalParameters> MakeWifiSignal(Watt_u txPower,
                                                          const WifiPhyOperatingChannel& channel);
     /**
      * Make foreign signal function
-     * \param txPower the transmit power
-     * \returns Ptr<SpectrumSignalParameters>
+     * @param txPower the transmit power
+     * @returns Ptr<SpectrumSignalParameters>
      */
     virtual Ptr<SpectrumSignalParameters> MakeForeignSignal(Watt_u txPower);
     /**
      * Send signal function
-     * \param txPower the transmit power
-     * \param wifiSignal whether the signal is a wifi signal or not
+     * @param txPower the transmit power
+     * @param wifiSignal whether the signal is a wifi signal or not
      */
     virtual void SendSignal(Watt_u txPower, bool wifiSignal);
     /**
      * PHY receive success callback function
-     * \param psdu the PSDU
-     * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
-     * \param txVector the transmit vector
-     * \param statusPerMpdu reception status per MPDU
+     * @param psdu the PSDU
+     * @param rxSignalInfo the info on the received signal (\see RxSignalInfo)
+     * @param txVector the transmit vector
+     * @param statusPerMpdu reception status per MPDU
      */
     virtual void RxSuccess(Ptr<const WifiPsdu> psdu,
                            RxSignalInfo rxSignalInfo,
-                           WifiTxVector txVector,
-                           std::vector<bool> statusPerMpdu);
+                           const WifiTxVector& txVector,
+                           const std::vector<bool>& statusPerMpdu);
     /**
      * PHY receive failure callback function
-     * \param psdu the PSDU
+     * @param psdu the PSDU
      */
     virtual void RxFailure(Ptr<const WifiPsdu> psdu);
     /**
      * PHY dropped packet callback function
-     * \param p the packet
-     * \param reason the reason
+     * @param p the packet
+     * @param reason the reason
      */
     void RxDropped(Ptr<const Packet> p, WifiPhyRxfailureReason reason);
     /**
      * PHY state changed callback function
-     * \param start the start time of the new state
-     * \param duration the duration of the new state
-     * \param newState the new state
+     * @param start the start time of the new state
+     * @param duration the duration of the new state
+     * @param newState the new state
      */
     virtual void PhyStateChanged(Time start, Time duration, WifiPhyState newState);
 
@@ -146,7 +146,7 @@
 
     auto psdu = Create<WifiPsdu>(pkt, hdr);
     const auto txDuration =
-        m_phy->CalculateTxDuration(psdu->GetSize(), txVector, m_phy->GetPhyBand());
+        SpectrumWifiPhy::CalculateTxDuration(psdu->GetSize(), txVector, m_phy->GetPhyBand());
 
     auto ppdu = Create<OfdmPpdu>(psdu, txVector, channel, 0);
 
@@ -194,8 +194,8 @@
 void
 WifiPhyThresholdsTest::RxSuccess(Ptr<const WifiPsdu> psdu,
                                  RxSignalInfo rxSignalInfo,
-                                 WifiTxVector txVector,
-                                 std::vector<bool> statusPerMpdu)
+                                 const WifiTxVector& txVector,
+                                 const std::vector<bool>& statusPerMpdu)
 {
     NS_LOG_FUNCTION(this << *psdu << rxSignalInfo << txVector);
     m_rxSuccess++;
@@ -268,10 +268,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Wifi Phy Threshold Weak Wifi Signal Test
+ * @brief Wifi Phy Threshold Weak Wifi Signal Test
  *
  * This test makes sure PHY ignores a Wi-Fi signal
  * if its received power lower than RxSensitivity.
@@ -291,7 +291,7 @@
 void
 WifiPhyThresholdsWeakWifiSignalTest::DoRun()
 {
-    const auto txPower = DbmToW(-110);
+    const auto txPower = DbmToW(dBm_u{-110});
 
     Simulator::Schedule(Seconds(1),
                         &WifiPhyThresholdsWeakWifiSignalTest::SendSignal,
@@ -313,10 +313,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Wifi Phy Threshold Weak Foreign Signal Test
+ * @brief Wifi Phy Threshold Weak Foreign Signal Test
  *
  * This test makes sure PHY keeps the state as IDLE if reception involves
  * a foreign signal with a received power lower than CcaEdThreshold.
@@ -341,7 +341,7 @@
 void
 WifiPhyThresholdsWeakForeignSignalTest::DoRun()
 {
-    const auto txPower = DbmToW(-90);
+    const auto txPower = DbmToW(dBm_u{-90});
 
     Simulator::Schedule(Seconds(1),
                         &WifiPhyThresholdsWeakForeignSignalTest::SendSignal,
@@ -362,10 +362,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Wifi Phy Threshold Strong Wifi Signal Test
+ * @brief Wifi Phy Threshold Strong Wifi Signal Test
  *
  * This test makes sure PHY processes a Wi-Fi signal
  * with a received power higher than RxSensitivity.
@@ -390,7 +390,7 @@
 void
 WifiPhyThresholdsStrongWifiSignalTest::DoRun()
 {
-    const auto txPower = DbmToW(-60);
+    const auto txPower = DbmToW(dBm_u{-60});
 
     Simulator::Schedule(Seconds(1),
                         &WifiPhyThresholdsStrongWifiSignalTest::SendSignal,
@@ -415,10 +415,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Wifi Phy Threshold Strong Foreign Signal Test
+ * @brief Wifi Phy Threshold Strong Foreign Signal Test
  *
  * This test makes sure PHY declare the state as CCA_BUSY if reception involves
  * a foreign signal with a received power higher than CcaEdThreshold.
@@ -443,7 +443,7 @@
 void
 WifiPhyThresholdsStrongForeignSignalTest::DoRun()
 {
-    const auto txPower = DbmToW(-60);
+    const auto txPower = DbmToW(dBm_u{-60});
 
     Simulator::Schedule(Seconds(1),
                         &WifiPhyThresholdsStrongForeignSignalTest::SendSignal,
@@ -463,10 +463,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Wifi Phy Thresholds Test Suite
+ * @brief Wifi Phy Thresholds Test Suite
  */
 class WifiPhyThresholdsTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/test/wifi-primary-channels-test.cc ns-3.44/src/wifi/test/wifi-primary-channels-test.cc
--- ns-3.43/src/wifi/test/wifi-primary-channels-test.cc	2024-10-09 16:41:10.140657000 -0700
+++ ns-3.44/src/wifi/test/wifi-primary-channels-test.cc	2025-03-09 16:55:49.811372800 -0700
@@ -33,10 +33,10 @@
 NS_LOG_COMPONENT_DEFINE("WifiPrimaryChannelsTest");
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test transmissions under different primary channel settings
+ * @brief Test transmissions under different primary channel settings
  *
  * This test can be repeated for different widths of the operating channel. We
  * configure as many BSSes as the number of distinct 20 MHz subchannels in the
@@ -54,8 +54,8 @@
     /**
      * Constructor
      *
-     * \param channelWidth the operating channel width
-     * \param useDistinctBssColors whether to set distinct BSS colors to BSSes
+     * @param channelWidth the operating channel width
+     * @param useDistinctBssColors whether to set distinct BSS colors to BSSes
      */
     WifiPrimaryChannelsTest(MHz_u channelWidth, bool useDistinctBssColors);
     ~WifiPrimaryChannelsTest() override;
@@ -64,10 +64,10 @@
      * Callback invoked when PHY receives a PSDU to transmit. Used to print
      * transmitted PSDUs for debug purposes.
      *
-     * \param context the context
-     * \param psduMap the PSDU map
-     * \param txVector the TX vector
-     * \param txPowerW the tx power in Watts
+     * @param context the context
+     * @param psduMap the PSDU map
+     * @param txVector the TX vector
+     * @param txPowerW the tx power in Watts
      */
     void Transmit(std::string context,
                   WifiConstPsduMap psduMap,
@@ -77,18 +77,18 @@
      * Have the AP of the given BSS transmit a SU PPDU using the given
      * transmission channel width
      *
-     * \param bss the given BSS
-     * \param txChannelWidth the given transmission channel width
+     * @param bss the given BSS
+     * @param txChannelWidth the given transmission channel width
      */
     void SendDlSuPpdu(uint8_t bss, MHz_u txChannelWidth);
     /**
      * Have the AP of the given BSS transmit a MU PPDU using the given
      * transmission channel width and RU type
      *
-     * \param bss the given BSS
-     * \param txChannelWidth the given transmission channel width
-     * \param ruType the given RU type
-     * \param nRus the number of RUs
+     * @param bss the given BSS
+     * @param txChannelWidth the given transmission channel width
+     * @param ruType the given RU type
+     * @param nRus the number of RUs
      */
     void SendDlMuPpdu(uint8_t bss, MHz_u txChannelWidth, HeRu::RuType ruType, std::size_t nRus);
     /**
@@ -96,52 +96,52 @@
      * DoSendHeTbPpdu to actually have STAs transmit HE TB PPDUs using the given
      * transmission channel width and RU type
      *
-     * \param bss the given BSS
-     * \param txChannelWidth the given transmission channel width
-     * \param ruType the given RU type
-     * \param nRus the number of RUs
+     * @param bss the given BSS
+     * @param txChannelWidth the given transmission channel width
+     * @param ruType the given RU type
+     * @param nRus the number of RUs
      */
     void SendHeTbPpdu(uint8_t bss, MHz_u txChannelWidth, HeRu::RuType ruType, std::size_t nRus);
     /**
      * Have the STAs of the given BSS transmit an HE TB PPDU using the given
      * transmission channel width and RU type
      *
-     * \param bss the given BSS
-     * \param txChannelWidth the given transmission channel width
-     * \param ruType the given RU type
-     * \param nRus the number of RUs
+     * @param bss the given BSS
+     * @param txChannelWidth the given transmission channel width
+     * @param ruType the given RU type
+     * @param nRus the number of RUs
      */
     void DoSendHeTbPpdu(uint8_t bss, MHz_u txChannelWidth, HeRu::RuType ruType, std::size_t nRus);
     /**
      * Callback invoked when a station receives a DL PPDU.
      *
-     * \param bss the BSS the receiving STA belongs to
-     * \param station the receiving station
-     * \param psdu the received PSDU
-     * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
-     * \param txVector TxVector of the received PSDU
-     * \param perMpduStatus per MPDU reception status
+     * @param bss the BSS the receiving STA belongs to
+     * @param station the receiving station
+     * @param psdu the received PSDU
+     * @param rxSignalInfo the info on the received signal (\see RxSignalInfo)
+     * @param txVector TxVector of the received PSDU
+     * @param perMpduStatus per MPDU reception status
      */
     void ReceiveDl(uint8_t bss,
                    uint8_t station,
                    Ptr<const WifiPsdu> psdu,
                    RxSignalInfo rxSignalInfo,
-                   WifiTxVector txVector,
-                   std::vector<bool> perMpduStatus);
+                   const WifiTxVector& txVector,
+                   const std::vector<bool>& perMpduStatus);
     /**
      * Callback invoked when an AP receives an UL PPDU.
      *
-     * \param bss the BSS the receiving AP belongs to
-     * \param psdu the received PSDU
-     * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
-     * \param txVector TxVector of the received PSDU
-     * \param perMpduStatus per MPDU reception status
+     * @param bss the BSS the receiving AP belongs to
+     * @param psdu the received PSDU
+     * @param rxSignalInfo the info on the received signal (\see RxSignalInfo)
+     * @param txVector TxVector of the received PSDU
+     * @param perMpduStatus per MPDU reception status
      */
     void ReceiveUl(uint8_t bss,
                    Ptr<const WifiPsdu> psdu,
                    RxSignalInfo rxSignalInfo,
-                   WifiTxVector txVector,
-                   std::vector<bool> perMpduStatus);
+                   const WifiTxVector& txVector,
+                   const std::vector<bool>& perMpduStatus);
     /**
      * Check that all stations associated with an AP.
      */
@@ -153,8 +153,8 @@
      * filtering) or if no transmission was performed on a channel adjacent to the one
      * they operate on, otherwise.
      *
-     * \param txBss the set of BSSes that transmitted an SU PPDU
-     * \param txChannelWidth the given transmission channel width
+     * @param txBss the set of BSSes that transmitted an SU PPDU
+     * @param txChannelWidth the given transmission channel width
      */
     void CheckReceivedSuPpdus(std::set<uint8_t> txBss, MHz_u txChannelWidth);
     /**
@@ -164,11 +164,11 @@
      * filtering) or if no transmission addressed to/from stations with the same AID was
      * performed on a channel adjacent to the one they operate on, otherwise.
      *
-     * \param txBss the set of BSSes that transmitted an SU PPDU
-     * \param txChannelWidth the given transmission channel width
-     * \param ruType the given RU type
-     * \param nRus the number of RUs
-     * \param isDlMu true for DL MU PPDU, false for HE TB PPDU
+     * @param txBss the set of BSSes that transmitted an SU PPDU
+     * @param txChannelWidth the given transmission channel width
+     * @param ruType the given RU type
+     * @param nRus the number of RUs
+     * @param isDlMu true for DL MU PPDU, false for HE TB PPDU
      */
     void CheckReceivedMuPpdus(std::set<uint8_t> txBss,
                               MHz_u txChannelWidth,
@@ -181,8 +181,8 @@
      * any frame Trigger Frame (given that a Trigger Frame is transmitted on the primary20
      * channel and all the primary20 channels are distinct).
      *
-     * \param txBss the set of BSSes that transmitted a Trigger Frame
-     * \param txChannelWidth the given transmission channel width
+     * @param txBss the set of BSSes that transmitted a Trigger Frame
+     * @param txChannelWidth the given transmission channel width
      */
     void CheckReceivedTriggerFrames(std::set<uint8_t> txBss, MHz_u txChannelWidth);
 
@@ -244,8 +244,8 @@
                                    uint8_t station,
                                    Ptr<const WifiPsdu> psdu,
                                    RxSignalInfo rxSignalInfo,
-                                   WifiTxVector txVector,
-                                   std::vector<bool> perMpduStatus)
+                                   const WifiTxVector& txVector,
+                                   const std::vector<bool>& perMpduStatus)
 {
     if (psdu->GetNMpdus() == 1)
     {
@@ -279,8 +279,8 @@
 WifiPrimaryChannelsTest::ReceiveUl(uint8_t bss,
                                    Ptr<const WifiPsdu> psdu,
                                    RxSignalInfo rxSignalInfo,
-                                   WifiTxVector txVector,
-                                   std::vector<bool> perMpduStatus)
+                                   const WifiTxVector& txVector,
+                                   const std::vector<bool>& perMpduStatus)
 {
     // if the BSS color is zero, this AP might receive the frame sent by another AP. Given that
     // stations only send TB PPDUs, we ignore this frame if the TX vector is not UL MU.
@@ -343,7 +343,7 @@
     }
 
     // we create as many BSSes as the number of 20 MHz subchannels
-    m_nBss = m_channelWidth / 20;
+    m_nBss = Count20MHzSubchannels(m_channelWidth);
 
     NodeContainer wifiApNodes;
     wifiApNodes.Create(m_nBss);
@@ -422,7 +422,7 @@
         for (uint8_t bss = 0; bss < m_nBss; bss++)
         {
             auto dev = DynamicCast<WifiNetDevice>(m_apDevices.Get(bss));
-            dev->GetHeConfiguration()->SetBssColor(bss + 1);
+            dev->GetHeConfiguration()->m_bssColor = bss + 1;
         }
     }
 
@@ -463,7 +463,7 @@
                                      1,
                                      1,
                                      0,
-                                     20,
+                                     MHz_u{20},
                                      false,
                                      false,
                                      false);
@@ -548,7 +548,7 @@
      * |     |-----|     |-----|     |-----|     |-----|
      *
      * Then, we double the transmission channel width. We will have four rounds
-     * of transmissions. We avoid using adjacent channels to avoid interfence
+     * of transmissions. We avoid using adjacent channels to avoid interference
      * among transmissions:
      *
      *      AP0                     AP4
@@ -607,9 +607,10 @@
 
     // To have simultaneous transmissions on adjacent channels, just initialize
     // nRounds to 1 and nApsPerRound to m_channelWidth / 20. Of course, the test
-    // will fail because some stations will not receive some frames due to interfence
-    for (MHz_u txChannelWidth = 20, nRounds = 2, nApsPerRound = m_channelWidth / 20 / 2;
-         txChannelWidth <= m_channelWidth;
+    // will fail because some stations will not receive some frames due to interference
+    uint16_t nRounds = 2;
+    uint16_t nApsPerRound = Count20MHzSubchannels(m_channelWidth) / 2;
+    for (MHz_u txChannelWidth{20}; txChannelWidth <= m_channelWidth;
          txChannelWidth *= 2, nRounds *= 2, nApsPerRound /= 2)
     {
         nRounds = std::min<uint16_t>(nRounds, m_nBss);
@@ -644,8 +645,9 @@
      * channel width, every round is repeated as many times as the number of ways in
      * which we can partition the transmission channel width in equal sized RUs.
      */
-    for (MHz_u txChannelWidth = 20, nRounds = 2, nApsPerRound = m_channelWidth / 20 / 2;
-         txChannelWidth <= m_channelWidth;
+    nRounds = 2;
+    nApsPerRound = Count20MHzSubchannels(m_channelWidth) / 2;
+    for (MHz_u txChannelWidth{20}; txChannelWidth <= m_channelWidth;
          txChannelWidth *= 2, nRounds *= 2, nApsPerRound /= 2)
     {
         nRounds = std::min<uint16_t>(nRounds, m_nBss);
@@ -692,8 +694,9 @@
      * channel width, every round is repeated as many times as the number of ways in
      * which we can partition the transmission channel width in equal sized RUs.
      */
-    for (MHz_u txChannelWidth = 20, nRounds = 2, nApsPerRound = m_channelWidth / 20 / 2;
-         txChannelWidth <= m_channelWidth;
+    nRounds = 2;
+    nApsPerRound = Count20MHzSubchannels(m_channelWidth) / 2;
+    for (MHz_u txChannelWidth{20}; txChannelWidth <= m_channelWidth;
          txChannelWidth *= 2, nRounds *= 2, nApsPerRound /= 2)
     {
         nRounds = std::min<uint16_t>(nRounds, m_nBss);
@@ -759,7 +762,7 @@
     auto apDev = DynamicCast<WifiNetDevice>(m_apDevices.Get(bss));
     auto staDev = DynamicCast<WifiNetDevice>(m_staDevices[bss].Get(0));
 
-    uint8_t bssColor = apDev->GetHeConfiguration()->GetBssColor();
+    uint8_t bssColor = apDev->GetHeConfiguration()->m_bssColor;
     WifiTxVector txVector = WifiTxVector(HePhy::GetHeMcs8(),
                                          0,
                                          WIFI_PREAMBLE_HE_SU,
@@ -794,7 +797,7 @@
                            << "addressed to " << nRus << " stations (RU type: " << ruType << ")");
 
     auto apDev = DynamicCast<WifiNetDevice>(m_apDevices.Get(bss));
-    uint8_t bssColor = apDev->GetHeConfiguration()->GetBssColor();
+    uint8_t bssColor = apDev->GetHeConfiguration()->m_bssColor;
 
     WifiTxVector txVector = WifiTxVector(HePhy::GetHeMcs8(),
                                          0,
@@ -819,7 +822,7 @@
 
     for (std::size_t i = 1; i <= nRus; i++)
     {
-        bool primary80 = !(txChannelWidth == 160 && i > nRus / 2);
+        bool primary80 = !(txChannelWidth == MHz_u{160} && i > nRus / 2);
         std::size_t index = (primary80 ? i : i - nRus / 2);
 
         auto staDev = DynamicCast<WifiNetDevice>(m_staDevices[bss].Get(i - 1));
@@ -830,7 +833,7 @@
     }
     txVector.SetSigBMode(VhtPhy::GetVhtMcs5());
     RuAllocation ruAllocations;
-    const std::size_t numRuAllocs = txChannelWidth / 20;
+    const auto numRuAllocs = Count20MHzSubchannels(txChannelWidth);
     ruAllocations.resize(numRuAllocs);
     auto IsOddNum = (nRus / numRuAllocs) % 2 == 1;
     auto ruAlloc = HeRu::GetEqualizedRuAllocation(ruType, IsOddNum);
@@ -871,7 +874,7 @@
                                         std::size_t nRus)
 {
     auto apDev = DynamicCast<WifiNetDevice>(m_apDevices.Get(bss));
-    uint8_t bssColor = apDev->GetHeConfiguration()->GetBssColor();
+    uint8_t bssColor = apDev->GetHeConfiguration()->m_bssColor;
 
     WifiMacHeader hdr;
     hdr.SetType(WIFI_MAC_QOSDATA);
@@ -880,7 +883,7 @@
     hdr.SetAddr3(apDev->GetMac()->GetBssid(0));
     hdr.SetSequenceNumber(1);
 
-    Time duration = Seconds(0);
+    Time duration;
     uint16_t length = 0;
     WifiTxVector trigVector(HePhy::GetHeMcs8(),
                             0,
@@ -901,7 +904,7 @@
                                << txChannelWidth
                                << " MHz channel an HE TB PPDU (RU type: " << ruType << ")");
 
-        bool primary80 = !(txChannelWidth == 160 && i > nRus / 2);
+        bool primary80 = !(txChannelWidth == MHz_u{160} && i > nRus / 2);
         std::size_t index = (primary80 ? i : i - nRus / 2);
 
         auto staDev = DynamicCast<WifiNetDevice>(m_staDevices[bss].Get(i - 1));
@@ -1209,10 +1212,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test functions returning the indices of primary and secondary channels
+ * @brief Test functions returning the indices of primary and secondary channels
  *        of different width.
  */
 class Wifi20MHzChannelIndicesTest : public TestCase
@@ -1228,12 +1231,12 @@
      * Check that the indices of the 20 MHz channels included in all the primary
      * and secondary channels are correct when setting the given primary20 channel.
      *
-     * \param primary20 the index of the primary20 channel to configure
-     * \param secondary20 the expected index of the secondary20 channel
-     * \param primary40 the expected indices of the 20 MHz channels in the primary40 channel
-     * \param secondary40 the expected indices of the 20 MHz channels in the secondary40 channel
-     * \param primary80 the expected indices of the 20 MHz channels in the primary80 channel
-     * \param secondary80 the expected indices of the 20 MHz channels in the secondary80 channel
+     * @param primary20 the index of the primary20 channel to configure
+     * @param secondary20 the expected index of the secondary20 channel
+     * @param primary40 the expected indices of the 20 MHz channels in the primary40 channel
+     * @param secondary40 the expected indices of the 20 MHz channels in the secondary40 channel
+     * @param primary80 the expected indices of the 20 MHz channels in the primary80 channel
+     * @param secondary80 the expected indices of the 20 MHz channels in the secondary80 channel
      */
     void RunOne(uint8_t primary20,
                 const std::set<uint8_t>& secondary20,
@@ -1274,7 +1277,7 @@
 
     m_channel.SetPrimary20Index(primary20);
 
-    auto actualPrimary20 = m_channel.GetAll20MHzChannelIndicesInPrimary(20);
+    auto actualPrimary20 = m_channel.GetAll20MHzChannelIndicesInPrimary(MHz_u{20});
     NS_TEST_ASSERT_MSG_EQ((actualPrimary20 == std::set<uint8_t>{primary20}),
                           true,
                           "Expected Primary20 {" << +primary20 << "}"
@@ -1288,7 +1291,7 @@
                                                   << " differs from actual "
                                                   << printToStr(actualSecondary20));
 
-    auto actualPrimary40 = m_channel.GetAll20MHzChannelIndicesInPrimary(40);
+    auto actualPrimary40 = m_channel.GetAll20MHzChannelIndicesInPrimary(MHz_u{40});
     NS_TEST_ASSERT_MSG_EQ((actualPrimary40 == primary40),
                           true,
                           "Expected Primary40 " << printToStr(primary40) << " differs from actual "
@@ -1301,7 +1304,7 @@
                                                   << " differs from actual "
                                                   << printToStr(actualSecondary40));
 
-    auto actualPrimary80 = m_channel.GetAll20MHzChannelIndicesInPrimary(80);
+    auto actualPrimary80 = m_channel.GetAll20MHzChannelIndicesInPrimary(MHz_u{80});
     NS_TEST_ASSERT_MSG_EQ((actualPrimary80 == primary80),
                           true,
                           "Expected Primary80 " << printToStr(primary80) << " differs from actual "
@@ -1319,23 +1322,23 @@
 Wifi20MHzChannelIndicesTest::DoRun()
 {
     /* 20 MHz channel */
-    m_channel.SetDefault(20, WIFI_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
+    m_channel.SetDefault(MHz_u{20}, WIFI_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
     RunOne(0, {}, {}, {}, {}, {});
 
     /* 40 MHz channel */
-    m_channel.SetDefault(40, WIFI_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
+    m_channel.SetDefault(MHz_u{40}, WIFI_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
     RunOne(0, {1}, {0, 1}, {}, {}, {});
     RunOne(1, {0}, {0, 1}, {}, {}, {});
 
     /* 80 MHz channel */
-    m_channel.SetDefault(80, WIFI_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
+    m_channel.SetDefault(MHz_u{80}, WIFI_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
     RunOne(0, {1}, {0, 1}, {2, 3}, {0, 1, 2, 3}, {});
     RunOne(1, {0}, {0, 1}, {2, 3}, {0, 1, 2, 3}, {});
     RunOne(2, {3}, {2, 3}, {0, 1}, {0, 1, 2, 3}, {});
     RunOne(3, {2}, {2, 3}, {0, 1}, {0, 1, 2, 3}, {});
 
     /* 160 MHz channel */
-    m_channel.SetDefault(160, WIFI_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
+    m_channel.SetDefault(MHz_u{160}, WIFI_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
     RunOne(0, {1}, {0, 1}, {2, 3}, {0, 1, 2, 3}, {4, 5, 6, 7});
     RunOne(1, {0}, {0, 1}, {2, 3}, {0, 1, 2, 3}, {4, 5, 6, 7});
     RunOne(2, {3}, {2, 3}, {0, 1}, {0, 1, 2, 3}, {4, 5, 6, 7});
@@ -1347,10 +1350,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief wifi primary channels test suite
+ * @brief wifi primary channels test suite
  */
 class WifiPrimaryChannelsTestSuite : public TestSuite
 {
@@ -1362,14 +1365,14 @@
     : TestSuite("wifi-primary-channels", Type::UNIT)
 {
     // Test cases for 20 MHz can be added, but are not that useful (there would be a single BSS)
-    AddTestCase(new WifiPrimaryChannelsTest(40, true), TestCase::Duration::QUICK);
-    AddTestCase(new WifiPrimaryChannelsTest(40, false), TestCase::Duration::QUICK);
+    AddTestCase(new WifiPrimaryChannelsTest(MHz_u{40}, true), TestCase::Duration::QUICK);
+    AddTestCase(new WifiPrimaryChannelsTest(MHz_u{40}, false), TestCase::Duration::QUICK);
 #if 0
     // Tests disabled until issue #776 resolved
-    AddTestCase(new WifiPrimaryChannelsTest(80, true), TestCase::Duration::EXTENSIVE);
-    AddTestCase(new WifiPrimaryChannelsTest(80, false), TestCase::Duration::EXTENSIVE);
-    AddTestCase(new WifiPrimaryChannelsTest(160, true), TestCase::Duration::TAKES_FOREVER);
-    AddTestCase(new WifiPrimaryChannelsTest(160, false), TestCase::Duration::TAKES_FOREVER);
+    AddTestCase(new WifiPrimaryChannelsTest(MHz_u{80}, true), TestCase::Duration::EXTENSIVE);
+    AddTestCase(new WifiPrimaryChannelsTest(MHz_u{80}, false), TestCase::Duration::EXTENSIVE);
+    AddTestCase(new WifiPrimaryChannelsTest(MHz_u{160}, true), TestCase::Duration::TAKES_FOREVER);
+    AddTestCase(new WifiPrimaryChannelsTest(MHz_u{160}, false), TestCase::Duration::TAKES_FOREVER);
 #endif
     AddTestCase(new Wifi20MHzChannelIndicesTest(), TestCase::Duration::QUICK);
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/test/wifi-probe-exchange-test.cc ns-3.44/src/wifi/test/wifi-probe-exchange-test.cc
--- ns-3.43/src/wifi/test/wifi-probe-exchange-test.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/wifi/test/wifi-probe-exchange-test.cc	2025-03-09 16:55:49.811372800 -0700
@@ -0,0 +1,631 @@
+/*
+ * Copyright (c) 2024
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Author: Sharan Naribole <sharan.naribole@gmail.com>
+ */
+
+#include "ns3/ap-wifi-mac.h"
+#include "ns3/common-info-probe-req-mle.h"
+#include "ns3/config.h"
+#include "ns3/ctrl-headers.h"
+#include "ns3/eht-configuration.h"
+#include "ns3/error-model.h"
+#include "ns3/frame-exchange-manager.h"
+#include "ns3/log.h"
+#include "ns3/mac48-address.h"
+#include "ns3/mgt-headers.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/multi-link-element.h"
+#include "ns3/multi-model-spectrum-channel.h"
+#include "ns3/node-container.h"
+#include "ns3/object-factory.h"
+#include "ns3/rng-seed-manager.h"
+#include "ns3/simulator.h"
+#include "ns3/spectrum-helper.h"
+#include "ns3/spectrum-wifi-helper.h"
+#include "ns3/sta-wifi-mac.h"
+#include "ns3/string.h"
+#include "ns3/test.h"
+#include "ns3/tuple.h"
+#include "ns3/wifi-mac-header.h"
+#include "ns3/wifi-mac-helper.h"
+#include "ns3/wifi-mac-queue.h"
+#include "ns3/wifi-mode.h"
+#include "ns3/wifi-net-device.h"
+#include "ns3/wifi-phy-common.h"
+#include "ns3/wifi-psdu.h"
+#include "ns3/wifi-tx-vector.h"
+#include "ns3/wifi-utils.h"
+
+#include <algorithm>
+#include <iterator>
+#include <optional>
+#include <vector>
+
+using namespace ns3;
+
+NS_LOG_COMPONENT_DEFINE("WifiProbeExchangeTestSuite");
+
+// clang-format off
+const auto DEFAULT_SIM_STOP_TIME         = MilliSeconds(500);
+const auto DEFAULT_PROBE_REQ_TX_TIME     = MilliSeconds(10);
+const auto DEFAULT_DATA_MODE             = "EhtMcs3";
+const auto DEFAULT_CONTROL_MODE          = "OfdmRate24Mbps";
+const auto DEFAULT_SSID                  = Ssid("probe-exch-test");
+const auto DEFAULT_RNG_SEED              = 3;
+const auto DEFAULT_RNG_RUN               = 7;
+const auto DEFAULT_STREAM_INDEX          = 100;
+const uint64_t DEFAULT_STREAM_INCREMENT  = 1e4; // some large number
+const auto DEFAULT_WIFI_STANDARD         = WifiStandard::WIFI_STANDARD_80211be;
+const auto DEFAULT_PROBE_REQ_ADDR1_BCAST = false;
+const auto DEFAULT_PROBE_REQ_ADDR3_BCAST = false;
+const auto DEFAULT_MULTI_LINK_PROBE_REQ  = false;
+const uint8_t DEFAULT_PRB_EXCH_LINK_ID   = 0;
+const uint8_t DEFAULT_AP_MLD_ID          = 0;
+using LinkIds = std::vector<uint8_t>; ///< Link identifiers
+
+// clang-format on
+
+/// Parameters and expected results for a test case
+struct ProbeExchTestVector
+{
+    std::string name{};                                ///< Test case name
+    std::vector<std::string> apChs{};                  ///< AP MLD channels
+    std::vector<std::string> clientChs{};              ///< Non-AP MLD channels
+    bool isMultiLinkReq{DEFAULT_MULTI_LINK_PROBE_REQ}; ///< Send Multi-link Prpbe Req
+    uint8_t reqTxLinkId{DEFAULT_PRB_EXCH_LINK_ID};     ///< Probe Request Tx Link ID
+    LinkIds reqLinkIds{}; ///< Link IDs included in Multi-link Probe Request if any
+    bool addr1Bcast{DEFAULT_PROBE_REQ_ADDR1_BCAST}; ///< Flag for Probe Request ADDR1 broadcast
+    bool addr3Bcast{DEFAULT_PROBE_REQ_ADDR3_BCAST}; ///< Flag for Probe Request ADDR3 broadcast
+    uint8_t respTxLinkId{DEFAULT_PRB_EXCH_LINK_ID}; ///< Probe Response Tx Link ID
+    LinkIds respLinkIds{}; ///< Expected link IDs included in Multi-link Probe Response if any
+};
+
+/**
+ * @ingroup wifi-test
+ * @ingroup tests
+ * @brief Probe Request-Probe Response exchange
+ *
+ * Test suite including Probe Request and multi-link Probe Request for various cases of
+ * Probe Request frame contents and link of transmission.
+ */
+class ProbeExchTest : public TestCase
+{
+  public:
+    /// information on transmitted PSDU
+    struct TxPsdu
+    {
+        Ptr<const WifiPsdu> psdu; ///< WifiPsdu
+        WifiTxVector txVec;       ///< TXVECTOR
+        uint8_t linkId;           ///< Tx link ID
+    };
+
+    /**
+     * Constructor.
+     *
+     * @param testVec the test vector
+     * @param testCase the test case name
+     */
+    ProbeExchTest(ProbeExchTestVector testVec, std::string testCase);
+
+    /// PHY band-indexed map of spectrum channels
+    using ChannelMap = std::map<FrequencyRange, Ptr<MultiModelSpectrumChannel>>;
+
+  private:
+    /**
+     * Setup WifiNetDevices.
+     */
+    void SetupDevices();
+
+    /**
+     * Setup PSDU Tx trace.
+     *
+     * @param dev the wifi netdevice
+     * @param nodeId the node ID
+     */
+    void SetupTxTrace(Ptr<WifiNetDevice> dev, std::size_t nodeId);
+
+    /**
+     * Send Probe Request based on test vector input.
+     */
+    void SendProbeReq();
+
+    /**
+     *  Setup the PHY Helper based on input channel settings.
+     *
+     * @param helper the spectrum wifi PHY helper
+     * @param channels the list of channels
+     * @param channelMap the channel map to configure
+     */
+    void SetChannels(SpectrumWifiPhyHelper& helper,
+                     const std::vector<std::string>& channels,
+                     const ChannelMap& channelMap);
+
+    /**
+     * Traced callback when FEM passes PSDUs to the PHY.
+     *
+     * @param linkId the link ID
+     * @param context the context
+     * @param psduMap the transmitted PSDU map
+     * @param txVector the TXVECTOR used for transmission
+     * @param txPowerW the TX power in watts
+     */
+    void CollectTxTrace(uint8_t linkId,
+                        std::string context,
+                        WifiConstPsduMap psduMap,
+                        WifiTxVector txVector,
+                        double txPowerW);
+
+    /**
+     * Check Probe Request contents.
+     *
+     * @param txPsdu information about transmitted PSDU
+     */
+    void ValidateProbeReq(const TxPsdu& txPsdu);
+
+    /**
+     * Check Probe Response contents.
+     *
+     * @param txPsdu information about transmitted PSDU
+     */
+    void ValidateProbeResp(const TxPsdu& txPsdu);
+
+    /**
+     * Check expected outcome of test case run.
+     */
+    void ValidateTest();
+
+    void DoSetup() override;
+    void DoTeardown() override;
+    void DoRun() override;
+
+    /**
+     *  Get Link MAC address for input device on specified link.
+     *
+     * @param dev the input device
+     * @param linkId the ID of the specified link
+     * @return the Link MAC address for input device on specified link
+     */
+    Mac48Address GetLinkMacAddr(Ptr<WifiNetDevice> dev, uint8_t linkId);
+
+    Ptr<WifiNetDevice> m_apDev{nullptr};     ///< AP MLD WifiNetDevice
+    Ptr<WifiNetDevice> m_clientDev{nullptr}; ///< Non-AP MLD WifiNetDevice
+    ProbeExchTestVector m_testVec;           ///< Test vector
+    std::vector<TxPsdu> m_mgtPsdus{};        ///< Tx PSDUs
+};
+
+ProbeExchTest::ProbeExchTest(ProbeExchTestVector testVec, std::string testCase)
+    : TestCase(testCase),
+      m_testVec(testVec)
+{
+}
+
+void
+ProbeExchTest::SetupDevices()
+{
+    NodeContainer apNode(1);
+    NodeContainer clientNode(1);
+
+    WifiHelper wifi;
+    wifi.SetStandard(DEFAULT_WIFI_STANDARD);
+    wifi.SetRemoteStationManager("ns3::ConstantRateWifiManager",
+                                 "DataMode",
+                                 StringValue(DEFAULT_DATA_MODE),
+                                 "ControlMode",
+                                 StringValue(DEFAULT_CONTROL_MODE));
+
+    ChannelMap channelMap{{WIFI_SPECTRUM_2_4_GHZ, CreateObject<MultiModelSpectrumChannel>()},
+                          {WIFI_SPECTRUM_5_GHZ, CreateObject<MultiModelSpectrumChannel>()},
+                          {WIFI_SPECTRUM_6_GHZ, CreateObject<MultiModelSpectrumChannel>()}};
+
+    SpectrumWifiPhyHelper apPhyHelper;
+    SetChannels(apPhyHelper, m_testVec.apChs, channelMap);
+    SpectrumWifiPhyHelper clientPhyHelper;
+    SetChannels(clientPhyHelper, m_testVec.clientChs, channelMap);
+
+    WifiMacHelper mac;
+    mac.SetType("ns3::ApWifiMac",
+                "Ssid",
+                SsidValue(DEFAULT_SSID),
+                "BeaconGeneration",
+                BooleanValue(false));
+    NetDeviceContainer apDevices = wifi.Install(apPhyHelper, mac, apNode);
+    m_apDev = DynamicCast<WifiNetDevice>(apDevices.Get(0));
+    NS_ASSERT(m_apDev);
+
+    mac.SetType("ns3::StaWifiMac",
+                "Ssid",
+                SsidValue(DEFAULT_SSID),
+                "ActiveProbing",
+                BooleanValue(false));
+    auto clientDevices = wifi.Install(clientPhyHelper, mac, clientNode);
+    m_clientDev = DynamicCast<WifiNetDevice>(clientDevices.Get(0));
+    NS_ASSERT(m_clientDev);
+
+    // Assign fixed streams to random variables in use
+    auto streamNumber = DEFAULT_STREAM_INDEX;
+    auto streamsUsed = WifiHelper::AssignStreams(apDevices, streamNumber);
+    NS_ASSERT_MSG(static_cast<uint64_t>(streamsUsed) < DEFAULT_STREAM_INCREMENT,
+                  "Too many streams used (" << streamsUsed << "), increase the stream increment");
+    streamNumber += DEFAULT_STREAM_INCREMENT;
+    streamsUsed = WifiHelper::AssignStreams(clientDevices, streamNumber);
+    NS_ASSERT_MSG(static_cast<uint64_t>(streamsUsed) < DEFAULT_STREAM_INCREMENT,
+                  "Too many streams used (" << streamsUsed << "), increase the stream increment");
+
+    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));
+    mobility.SetPositionAllocator(positionAlloc);
+
+    mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
+    mobility.Install(apNode);
+    mobility.Install(clientNode);
+}
+
+void
+ProbeExchTest::SetChannels(SpectrumWifiPhyHelper& helper,
+                           const std::vector<std::string>& channels,
+                           const ChannelMap& channelMap)
+{
+    helper = SpectrumWifiPhyHelper(channels.size());
+    helper.SetPcapDataLinkType(WifiPhyHelper::DLT_IEEE802_11_RADIO);
+
+    for (std::size_t idx = 0; idx != channels.size(); ++idx)
+    {
+        helper.Set(idx, "ChannelSettings", StringValue(channels[idx]));
+    }
+
+    for (const auto& [band, channel] : channelMap)
+    {
+        helper.AddChannel(channel, band);
+    }
+}
+
+Mac48Address
+ProbeExchTest::GetLinkMacAddr(Ptr<WifiNetDevice> dev, uint8_t linkId)
+{
+    auto mac = dev->GetMac();
+    NS_ASSERT(linkId < mac->GetNLinks());
+    return mac->GetFrameExchangeManager(linkId)->GetAddress();
+}
+
+void
+ProbeExchTest::SetupTxTrace(Ptr<WifiNetDevice> dev, std::size_t nodeId)
+{
+    for (uint8_t idx = 0; idx < dev->GetNPhys(); ++idx)
+    {
+        Config::Connect("/NodeList/" + std::to_string(nodeId) +
+                            "/DeviceList/*/$ns3::WifiNetDevice/Phys/" + std::to_string(idx) +
+                            "/PhyTxPsduBegin",
+                        MakeCallback(&ProbeExchTest::CollectTxTrace, this).Bind(idx));
+    }
+}
+
+void
+ProbeExchTest::CollectTxTrace(uint8_t linkId,
+                              std::string context,
+                              WifiConstPsduMap psduMap,
+                              WifiTxVector txVector,
+                              double txPowerW)
+{
+    auto psdu = psduMap.begin()->second;
+    if (psdu->GetHeader(0).IsMgt())
+    {
+        m_mgtPsdus.push_back({psdu, txVector, linkId});
+    }
+}
+
+void
+ProbeExchTest::SendProbeReq()
+{
+    auto clientMac = DynamicCast<StaWifiMac>(m_clientDev->GetMac());
+    NS_ASSERT(clientMac);
+
+    const auto& reqTxLinkId = m_testVec.reqTxLinkId;
+    MgtProbeRequestHeader probeReq;
+    if (m_testVec.isMultiLinkReq)
+    {
+        probeReq = clientMac->GetMultiLinkProbeRequest(reqTxLinkId,
+                                                       m_testVec.reqLinkIds,
+                                                       DEFAULT_AP_MLD_ID);
+    }
+    else
+    {
+        probeReq = clientMac->GetProbeRequest(reqTxLinkId);
+    }
+
+    auto apLinkAddr = GetLinkMacAddr(m_apDev, m_testVec.respTxLinkId);
+    auto bcastAddr = Mac48Address::GetBroadcast();
+    auto addr1 = m_testVec.addr1Bcast ? bcastAddr : apLinkAddr;
+    auto addr3 = m_testVec.addr3Bcast ? bcastAddr : apLinkAddr;
+    clientMac->EnqueueProbeRequest(probeReq, reqTxLinkId, addr1, addr3);
+}
+
+void
+ProbeExchTest::DoSetup()
+{
+    RngSeedManager::SetSeed(DEFAULT_RNG_SEED);
+    RngSeedManager::SetRun(DEFAULT_RNG_RUN);
+    SetupDevices();
+    SetupTxTrace(m_apDev, 0);
+    SetupTxTrace(m_clientDev, 1);
+}
+
+void
+ProbeExchTest::ValidateProbeReq(const TxPsdu& txPsdu)
+{
+    auto psdu = txPsdu.psdu;
+    auto macHdr = psdu->GetHeader(0);
+    NS_TEST_ASSERT_MSG_EQ(macHdr.IsProbeReq(), true, "Probe Request expected, actual =" << macHdr);
+    NS_TEST_ASSERT_MSG_EQ(+txPsdu.linkId,
+                          +m_testVec.reqTxLinkId,
+                          "Probe Request transmission link mismatch");
+
+    auto packet = psdu->GetPayload(0);
+    MgtProbeRequestHeader probeReq;
+    packet->PeekHeader(probeReq);
+    auto mle = probeReq.Get<MultiLinkElement>();
+    NS_TEST_ASSERT_MSG_EQ(mle.has_value(),
+                          m_testVec.isMultiLinkReq,
+                          "Multi-link Element expectation mismatch");
+
+    if (!mle.has_value())
+    { // Further checks on Multi-link Element contents
+        return;
+    }
+
+    auto nProfiles = mle->GetNPerStaProfileSubelements();
+    auto expectedNProfiles = m_testVec.reqLinkIds.size();
+    NS_TEST_ASSERT_MSG_EQ(nProfiles, expectedNProfiles, "Number of Per-STA Profiles mismatch");
+
+    for (std::size_t i = 0; i < nProfiles; ++i)
+    {
+        auto actualLinkId = mle->GetPerStaProfile(i).GetLinkId();
+        NS_TEST_ASSERT_MSG_EQ(+actualLinkId,
+                              +m_testVec.reqLinkIds[i],
+                              "Per-STA Profile Link ID mismatch");
+    }
+}
+
+void
+ProbeExchTest::ValidateProbeResp(const TxPsdu& txPsdu)
+{
+    auto psdu = txPsdu.psdu;
+    auto macHdr = psdu->GetHeader(0);
+    NS_TEST_ASSERT_MSG_EQ(macHdr.IsProbeResp(),
+                          true,
+                          "Probe Response expected, actual =" << macHdr);
+    NS_TEST_ASSERT_MSG_EQ(+txPsdu.linkId,
+                          +m_testVec.respTxLinkId,
+                          "Probe Response transmission link mismatch");
+
+    auto packet = psdu->GetPayload(0);
+    MgtProbeResponseHeader probeResp;
+    packet->PeekHeader(probeResp);
+    auto mle = probeResp.Get<MultiLinkElement>();
+    auto isMleExpected = m_testVec.apChs.size() > 1;
+    NS_TEST_ASSERT_MSG_EQ(mle.has_value(),
+                          isMleExpected,
+                          "Multi-link Element expectation mismatch");
+
+    if (!mle.has_value())
+    { // Further checks on Multi-link Element contents
+        return;
+    }
+
+    auto nProfiles = mle->GetNPerStaProfileSubelements();
+    auto expectedNProfiles = m_testVec.respLinkIds.size();
+    NS_TEST_ASSERT_MSG_EQ(nProfiles, expectedNProfiles, "Number of Per-STA Profiles mismatch");
+
+    LinkIds respLinkIds{};
+    for (std::size_t i = 0; i < nProfiles; ++i)
+    {
+        auto actualLinkId = mle->GetPerStaProfile(i).GetLinkId();
+        NS_TEST_ASSERT_MSG_EQ(+actualLinkId,
+                              +m_testVec.respLinkIds[i],
+                              "Per-STA Profile Link ID mismatch");
+    }
+}
+
+void
+ProbeExchTest::ValidateTest()
+{
+    NS_TEST_ASSERT_MSG_GT_OR_EQ(m_mgtPsdus.size(), 2, "Expected Probe Request and Response");
+
+    // Test first Management PSDU is Probe Request
+    ValidateProbeReq(m_mgtPsdus[0]);
+
+    // Test second Management PSDU is Probe Response
+    ValidateProbeResp(m_mgtPsdus[1]);
+}
+
+void
+ProbeExchTest::DoRun()
+{
+    Simulator::Schedule(DEFAULT_PROBE_REQ_TX_TIME, &ProbeExchTest::SendProbeReq, this);
+    Simulator::Stop(DEFAULT_SIM_STOP_TIME);
+    Simulator::Run();
+    Simulator::Destroy();
+    ValidateTest();
+}
+
+void
+ProbeExchTest::DoTeardown()
+{
+    m_apDev->Dispose();
+    m_apDev = nullptr;
+    m_clientDev->Dispose();
+    m_clientDev = nullptr;
+    m_mgtPsdus.clear();
+}
+
+/**
+ * @ingroup wifi-test
+ * @ingroup tests
+ *
+ * @brief wifi probe exchange Test Suite
+ */
+class ProbeExchTestSuite : public TestSuite
+{
+  public:
+    ProbeExchTestSuite();
+};
+
+ProbeExchTestSuite::ProbeExchTestSuite()
+    : TestSuite("wifi-probe-exchange", Type::UNIT)
+{
+    using ChCfgVec = std::vector<std::string>;
+    ChCfgVec ap1Link{"{1, 0, BAND_6GHZ, 0}"};
+    ChCfgVec ap1LinkAlt{"{36, 0, BAND_5GHZ, 0}"};
+    ChCfgVec ap1LinkAlt2{"{2, 0, BAND_2_4GHZ, 0}"};
+    ChCfgVec ap2Links{"{36, 0, BAND_5GHZ, 0}", "{1, 0, BAND_6GHZ, 0}"};
+    ChCfgVec ap2LinksAlt{"{2, 0, BAND_2_4GHZ, 0}", "{1, 0, BAND_6GHZ, 0}"};
+    ChCfgVec ap3Links{"{2, 0, BAND_2_4GHZ, 0}", "{36, 0, BAND_5GHZ, 0}", "{1, 0, BAND_6GHZ, 0}"};
+    ChCfgVec clientChCfg{"{2, 0, BAND_2_4GHZ, 0}", "{36, 0, BAND_5GHZ, 0}", "{1, 0, BAND_6GHZ, 0}"};
+    std::vector<ProbeExchTestVector> vecs{
+        {.name = "Single link AP, non-AP MLD sends Probe Request on link 2",
+         .apChs = ap1Link,
+         .clientChs = clientChCfg,
+         .isMultiLinkReq = false,
+         .reqTxLinkId = 2,
+         .reqLinkIds = {},
+         .addr1Bcast = false,
+         .addr3Bcast = true,
+         .respTxLinkId = 0,
+         .respLinkIds = {}},
+        {.name = "Single link AP, non-AP MLD sends Probe Request on link 1",
+         .apChs = ap1LinkAlt,
+         .clientChs = clientChCfg,
+         .isMultiLinkReq = false,
+         .reqTxLinkId = 1,
+         .reqLinkIds = {},
+         .addr1Bcast = false,
+         .addr3Bcast = true,
+         .respTxLinkId = 0,
+         .respLinkIds = {}},
+        {.name = "Single link AP, non-AP MLD sends Probe Request on link 0",
+         .apChs = ap1LinkAlt2,
+         .clientChs = clientChCfg,
+         .isMultiLinkReq = false,
+         .reqTxLinkId = 0,
+         .reqLinkIds = {},
+         .addr1Bcast = false,
+         .addr3Bcast = true,
+         .respTxLinkId = 0,
+         .respLinkIds = {}},
+        {.name = "Non-AP MLD sends Multi-Link Probe Request on link 0 requesting a different link",
+         .apChs = ap3Links,
+         .clientChs = clientChCfg,
+         .isMultiLinkReq = true,
+         .reqTxLinkId = 0,
+         .reqLinkIds = {2},
+         .addr1Bcast = false,
+         .addr3Bcast = true,
+         .respTxLinkId = 0,
+         .respLinkIds = {2}},
+        {.name = "Non-AP MLD sends Multi-Link Probe Request with broadcast Addr1 and Addr3",
+         .apChs = ap3Links,
+         .clientChs = clientChCfg,
+         .isMultiLinkReq = true,
+         .reqTxLinkId = 1,
+         .reqLinkIds = {0, 1, 2},
+         .addr1Bcast = true,
+         .addr3Bcast = true,
+         .respTxLinkId = 1,
+         .respLinkIds = {}},
+        {.name = "Non-AP MLD sends Multi-Link Probe Request on link 2 requesting the same link",
+         .apChs = ap3Links,
+         .clientChs = clientChCfg,
+         .isMultiLinkReq = true,
+         .reqTxLinkId = 2,
+         .reqLinkIds = {2},
+         .addr1Bcast = false,
+         .addr3Bcast = true,
+         .respTxLinkId = 2,
+         .respLinkIds = {}},
+        {.name = "Non-AP MLD sends Probe Request to AP MLD",
+         .apChs = ap3Links,
+         .clientChs = clientChCfg,
+         .isMultiLinkReq = false,
+         .reqTxLinkId = 1,
+         .reqLinkIds = {},
+         .addr1Bcast = false,
+         .addr3Bcast = true,
+         .respTxLinkId = 1,
+         .respLinkIds = {}},
+        {.name = "Non-AP MLD sends Multi-Link Probe Request to AP MLD with 3 links requesting all "
+                 "links",
+         .apChs = ap3Links,
+         .clientChs = clientChCfg,
+         .isMultiLinkReq = true,
+         .reqTxLinkId = 0,
+         .reqLinkIds = {0, 1, 2},
+         .addr1Bcast = false,
+         .addr3Bcast = true,
+         .respTxLinkId = 0,
+         .respLinkIds = {1, 2}},
+        {.name = "Non-AP MLD sends Multi-Link Probe Request on link 1 to AP MLD with 2 links "
+                 "requesting all links",
+         .apChs = ap2Links,
+         .clientChs = clientChCfg,
+         .isMultiLinkReq = true,
+         .reqTxLinkId = 1,
+         .reqLinkIds = {0, 1},
+         .addr1Bcast = false,
+         .addr3Bcast = true,
+         .respTxLinkId = 0,
+         .respLinkIds = {1}},
+        {.name = "Non-AP MLD sends Multi-Link Probe Request on link 0 to AP MLD with 2 links "
+                 "requesting all links",
+         .apChs = ap2LinksAlt,
+         .clientChs = clientChCfg,
+         .isMultiLinkReq = true,
+         .reqTxLinkId = 0,
+         .reqLinkIds = {0, 1},
+         .addr1Bcast = false,
+         .addr3Bcast = true,
+         .respTxLinkId = 0,
+         .respLinkIds = {1}},
+        {.name = "Non-AP MLD sends Multi-Link Probe Request with no Per-STA-Profile",
+         .apChs = ap3Links,
+         .clientChs = clientChCfg,
+         .isMultiLinkReq = true,
+         .reqTxLinkId = 0,
+         .reqLinkIds = {},
+         .addr1Bcast = false,
+         .addr3Bcast = true,
+         .respTxLinkId = 0,
+         .respLinkIds = {1, 2}},
+        {.name = "Non-AP MLD sends Multi-Link Probe Request with broadcast Addr1",
+         .apChs = ap3Links,
+         .clientChs = clientChCfg,
+         .isMultiLinkReq = true,
+         .reqTxLinkId = 1,
+         .reqLinkIds = {1, 2},
+         .addr1Bcast = true,
+         .addr3Bcast = false,
+         .respTxLinkId = 1,
+         .respLinkIds = {2}},
+        {.name = "Duplicate requested Link IDs",
+         .apChs = ap3Links,
+         .clientChs = clientChCfg,
+         .isMultiLinkReq = true,
+         .reqTxLinkId = 0,
+         .reqLinkIds = {0, 1, 1, 2, 2},
+         .addr1Bcast = false,
+         .addr3Bcast = false,
+         .respTxLinkId = 0,
+         .respLinkIds = {1, 2}},
+    };
+
+    for (const auto& testVec : vecs)
+    {
+        AddTestCase(new ProbeExchTest(testVec, testVec.name), TestCase::Duration::QUICK);
+    }
+}
+
+static ProbeExchTestSuite g_probeExchTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/test/wifi-retransmit-test.cc ns-3.44/src/wifi/test/wifi-retransmit-test.cc
--- ns-3.43/src/wifi/test/wifi-retransmit-test.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/wifi/test/wifi-retransmit-test.cc	2025-03-09 16:55:49.811372800 -0700
@@ -0,0 +1,718 @@
+/*
+ * Copyright (c) 2024 Universita' degli Studi di Napoli Federico II
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#include "ns3/attribute-container.h"
+#include "ns3/boolean.h"
+#include "ns3/config.h"
+#include "ns3/frame-exchange-manager.h"
+#include "ns3/he-phy.h"
+#include "ns3/log.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/multi-model-spectrum-channel.h"
+#include "ns3/packet-socket-client.h"
+#include "ns3/packet-socket-helper.h"
+#include "ns3/packet-socket-server.h"
+#include "ns3/packet.h"
+#include "ns3/pointer.h"
+#include "ns3/qos-txop.h"
+#include "ns3/qos-utils.h"
+#include "ns3/rng-seed-manager.h"
+#include "ns3/spectrum-wifi-helper.h"
+#include "ns3/sta-wifi-mac.h"
+#include "ns3/string.h"
+#include "ns3/test.h"
+#include "ns3/wifi-mac-header.h"
+#include "ns3/wifi-mac-queue.h"
+#include "ns3/wifi-net-device.h"
+#include "ns3/wifi-psdu.h"
+
+using namespace ns3;
+
+NS_LOG_COMPONENT_DEFINE("WifiRetransmitTest");
+
+/**
+ * @ingroup wifi-test
+ * @ingroup tests
+ *
+ * @brief Test retransmit procedure
+ *
+ * Retransmit procedures are tested for all the combinations of the following options:
+ * - RTS/CTS is used or not
+ * - Retry count is/is not incremented for MPDUs that are part of a block ack agreement
+ * - After a BlockAck timeout, a BlockAckReq or data frames are transmitted
+ * - PIFS recovery is used or not
+ *
+ * Two data frames are generated at a non-AP STA. The first transmission attempt fails, thus retry
+ * count (if the IncrementRetryCountUnderBa attribute is set to true) and QSRC are incremented.
+ * Two more data frames are generated, thus the second attempt (performed in a second TXOP) includes
+ * four data frames. Two of the four data frames (one generated in the first round and one generated
+ * in the second round) are corrupted, but the transmission is successful, thus the retry counts are
+ * left unchanged and the QSRC is reset.
+ * Then, we keep transmitting the two remaining MPDUs until the retry count of the MPDU generated in
+ * the first round reaches the retry limit and hence it is discarded (if the
+ * IncrementRetryCountUnderBa attribute is set to true). A BlockAckReq is then transmitted to
+ * advance the recipient window. Such BlockAckReq is dropped multiple times; every time, the retry
+ * count of the remaining MPDU is unchanged and the QSRC increases. When the QSRC exceeds the frame
+ * retry limit, the QSRC is reset to 0 and the remaining data frame is not dropped.
+ *
+ * Note that the above attempts are all performed in the second TXOP because failures occur on
+ * non-initial PPDUs, hence PIFS recovery or backoff procedure is invoked. This test verifies that
+ * QSRC is unchanged in the former case and incremented in the latter case.
+ *
+ * In case of multi-link devices, the first TXOP is carried out on link 0 and the second TXOP on
+ * link 1. It is checked that QSRC and CW are updated on the link on which the TXOP is carried out.
+ */
+class WifiRetransmitTest : public TestCase
+{
+  public:
+    /// Parameters for this test
+    struct Params
+    {
+        bool isMld;                 //!< whether devices are MLDs
+        bool useRts;                //!< whether RTS is used to protect frame transmissions
+        bool incrRetryCountUnderBa; //!< whether retry count is incremented under block ack
+        bool useBarAfterBaTimeout;  //!< whether to send a BAR after a missed BlockAck
+        bool pifsRecovery; //!< whether PIFS recovery is used after failure of a non-initial
+    };
+
+    /**
+     * Constructor
+     * @param params parameters for the Wi-Fi TXOP test
+     */
+    WifiRetransmitTest(const Params& params);
+
+    /**
+     * Callback invoked when PHY receives a PSDU to transmit
+     *
+     * @param phyId the ID of the PHY transmitting the PSDUs
+     * @param psduMap the PSDU map
+     * @param txVector the TX vector
+     * @param txPowerW the tx power in Watts
+     */
+    void Transmit(uint8_t phyId, WifiConstPsduMap psduMap, WifiTxVector txVector, double txPowerW);
+
+  private:
+    void DoSetup() override;
+    void DoRun() override;
+
+    /**
+     * @param count the number of packets to generate
+     * @param pktSize the size of the packets to generate
+     * @return an application generating the given number of packets of the given size from the
+     *         non-AP STA to the AP
+     */
+    Ptr<PacketSocketClient> GetApplication(std::size_t count, std::size_t pktSize) const;
+
+    /**
+     * Check the retry count of the MPDUs stored in the STA MAC queue, the CW and the QSRC of the
+     * given link upon transmitting a PSDU.
+     *
+     * @param seqNoRetryCountMap (sequence number, retry count) pair for the MPDUs that are expected
+     *                           to be in the STA MAC queue
+     * @param qsrc the expected QSRC for the BE AC
+     * @param linkId the ID of the given link
+     * @param qsrcOther the expected QSRC for the BE AC on the other link, in case of MLDs
+     */
+    void CheckValues(const std::map<uint16_t, uint32_t>& seqNoRetryCountMap,
+                     std::size_t qsrc,
+                     uint8_t linkId,
+                     std::optional<std::size_t> qsrcOther);
+
+    /// Actions and checks to perform upon the transmission of each frame
+    struct Events
+    {
+        /**
+         * Constructor.
+         *
+         * @param type the frame MAC header type
+         * @param f function to perform actions and checks
+         */
+        Events(WifiMacType type,
+               std::function<void(Ptr<const WifiPsdu>, const WifiTxVector&)>&& f = {})
+            : hdrType(type),
+              func(f)
+        {
+        }
+
+        WifiMacType hdrType; ///< MAC header type of frame being transmitted
+        std::function<void(Ptr<const WifiPsdu>, const WifiTxVector&)>
+            func; ///< function to perform actions and checks
+    };
+
+    /// Set the list of events to expect in this test run.
+    void SetEvents();
+
+    std::size_t m_nLinks;         //!< number of links for the devices
+    bool m_useRts;                //!< whether RTS is used to protect frame transmissions
+    bool m_incrRetryCountUnderBa; //!< whether retry count is incremented under block ack
+    bool m_useBarAfterBaTimeout;  //!< whether to send a BAR after a missed BlockAck
+    bool m_pifsRecovery;          ///< whether to use PIFS recovery
+    const Time m_txopLimit{MicroSeconds(4768)};  //!< TXOP limit
+    Ptr<StaWifiMac> m_staMac;                    //!< MAC of the non-AP STA
+    NetDeviceContainer m_apDevice;               ///< container for AP's NetDevice
+    const uint32_t m_frameRetryLimit{4};         //!< frame retry limit
+    const std::size_t m_pktSize{1000};           //!< size in bytes of generated packets
+    bool m_baEstablished{false};                 //!< whether BA agreement has been established
+    std::list<Events> m_events;                  //!< list of events for a test run
+    std::list<Events>::const_iterator m_eventIt; //!< iterator over the list of events
+    Ptr<ListErrorModel> m_apErrorModel;          ///< error model to install on the AP
+    PacketSocketAddress m_ulSocket;              ///< packet socket address for UL traffic
+};
+
+WifiRetransmitTest::WifiRetransmitTest(const Params& params)
+    : TestCase(std::string("Check retransmit procedure (useRts=") + std::to_string(params.useRts) +
+               ", incrRetryCountUnderBa=" + std::to_string(params.incrRetryCountUnderBa) +
+               ", useBarAfterBaTimeout=" + std::to_string(params.useBarAfterBaTimeout) +
+               ", pifsRecovery=" + std::to_string(params.pifsRecovery) + ")"),
+      m_nLinks(params.isMld ? 2 : 1),
+      m_useRts(params.useRts),
+      m_incrRetryCountUnderBa(params.incrRetryCountUnderBa),
+      m_useBarAfterBaTimeout(params.useBarAfterBaTimeout),
+      m_pifsRecovery(params.pifsRecovery),
+      m_apErrorModel(CreateObject<ListErrorModel>())
+{
+}
+
+void
+WifiRetransmitTest::DoSetup()
+{
+    RngSeedManager::SetSeed(1);
+    RngSeedManager::SetRun(1);
+    int64_t streamNumber = 10;
+
+    NodeContainer wifiApNode(1);
+    NodeContainer wifiStaNode(1);
+
+    SpectrumWifiPhyHelper phy(m_nLinks);
+    phy.SetChannel(CreateObject<MultiModelSpectrumChannel>());
+    // use default 20 MHz channel in 5 GHz band
+    phy.Set(0, "ChannelSettings", StringValue("{0, 20, BAND_5GHZ, 0}"));
+    if (m_nLinks > 1)
+    {
+        // use default 20 MHz channel in 6 GHz band
+        phy.Set(1, "ChannelSettings", StringValue("{0, 20, BAND_6GHZ, 0}"));
+    }
+
+    Config::SetDefault("ns3::WifiRemoteStationManager::RtsCtsThreshold",
+                       UintegerValue(m_useRts ? (m_pktSize / 2) : 999999));
+    Config::SetDefault("ns3::WifiRemoteStationManager::IncrementRetryCountUnderBa",
+                       BooleanValue(m_incrRetryCountUnderBa));
+    Config::SetDefault("ns3::WifiMac::FrameRetryLimit", UintegerValue(m_frameRetryLimit));
+    Config::SetDefault("ns3::QosTxop::UseExplicitBarAfterMissedBlockAck",
+                       BooleanValue(m_useBarAfterBaTimeout));
+    Config::SetDefault("ns3::QosFrameExchangeManager::PifsRecovery", BooleanValue(m_pifsRecovery));
+
+    WifiHelper wifi;
+    wifi.SetStandard(m_nLinks == 1 ? WIFI_STANDARD_80211ax : WIFI_STANDARD_80211be);
+    wifi.SetRemoteStationManager("ns3::ConstantRateWifiManager",
+                                 "DataMode",
+                                 WifiModeValue(HePhy::GetHeMcs8()),
+                                 "ControlMode",
+                                 StringValue("OfdmRate6Mbps"));
+
+    WifiMacHelper mac;
+    mac.SetType("ns3::StaWifiMac", "Ssid", SsidValue(Ssid("retransmit-ssid")));
+
+    NetDeviceContainer staDevice = wifi.Install(phy, mac, wifiStaNode);
+    m_staMac = StaticCast<StaWifiMac>(StaticCast<WifiNetDevice>(staDevice.Get(0))->GetMac());
+
+    mac.SetType("ns3::ApWifiMac");
+    mac.SetEdca(AC_BE,
+                "TxopLimits",
+                AttributeContainerValue<TimeValue>(std::vector(m_nLinks, m_txopLimit)));
+
+    m_apDevice = wifi.Install(phy, mac, wifiApNode);
+
+    // Assign fixed streams to random variables in use
+    streamNumber += WifiHelper::AssignStreams(m_apDevice, streamNumber);
+    streamNumber += WifiHelper::AssignStreams(staDevice, 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));
+    mobility.SetPositionAllocator(positionAlloc);
+
+    mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
+    mobility.Install(wifiApNode);
+    mobility.Install(wifiStaNode);
+
+    PacketSocketHelper packetSocket;
+    packetSocket.Install(wifiApNode);
+    packetSocket.Install(wifiStaNode);
+
+    // install a packet socket server on the AP
+    PacketSocketAddress srvAddr;
+    srvAddr.SetSingleDevice(m_apDevice.Get(0)->GetIfIndex());
+    srvAddr.SetProtocol(1);
+    auto server = CreateObject<PacketSocketServer>();
+    server->SetLocal(srvAddr);
+    wifiApNode.Get(0)->AddApplication(server);
+    server->SetStartTime(Time{0}); // now
+    server->SetStopTime(Seconds(1.0));
+
+    // set UL packet socket
+    m_ulSocket.SetSingleDevice(staDevice.Get(0)->GetIfIndex());
+    m_ulSocket.SetPhysicalAddress(m_apDevice.Get(0)->GetAddress());
+    m_ulSocket.SetProtocol(1);
+
+    // install the error model on the AP
+    auto dev = DynamicCast<WifiNetDevice>(m_apDevice.Get(0));
+    for (std::size_t linkId = 0; linkId < m_nLinks; ++linkId)
+    {
+        dev->GetMac()->GetWifiPhy(linkId)->SetPostReceptionErrorModel(m_apErrorModel);
+    }
+
+    Callback<void, Mac48Address, uint8_t, std::optional<Mac48Address>> baEstablished =
+        [this](Mac48Address, uint8_t, std::optional<Mac48Address>) {
+            m_baEstablished = true;
+            // force the first TXOP to be started on link 0 in case of MLDs
+            if (m_nLinks > 1)
+            {
+                m_staMac->BlockTxOnLink(1, WifiQueueBlockedReason::TID_NOT_MAPPED);
+            }
+        };
+
+    m_staMac->GetQosTxop(AC_BE)->TraceConnectWithoutContext("BaEstablished", baEstablished);
+
+    // Trace PSDUs passed to the PHY on all devices
+    for (std::size_t phyId = 0; phyId < m_nLinks; phyId++)
+    {
+        Config::ConnectWithoutContext(
+            "/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phys/" + std::to_string(phyId) +
+                "/PhyTxPsduBegin",
+            MakeCallback(&WifiRetransmitTest::Transmit, this).Bind(phyId));
+    }
+
+    SetEvents();
+}
+
+void
+WifiRetransmitTest::CheckValues(const std::map<uint16_t, uint32_t>& seqNoRetryCountMap,
+                                std::size_t qsrc,
+                                uint8_t linkId,
+                                std::optional<std::size_t> qsrcOther)
+{
+    const auto psduNumber = std::distance(m_events.cbegin(), m_eventIt);
+    const auto apAddr = Mac48Address::ConvertFrom(m_apDevice.Get(0)->GetAddress());
+    WifiContainerQueueId queueId{WIFI_QOSDATA_QUEUE, WIFI_UNICAST, apAddr, 0};
+    const auto staQueue = m_staMac->GetTxopQueue(AC_BE);
+    NS_TEST_EXPECT_MSG_EQ(seqNoRetryCountMap.size(),
+                          staQueue->GetNPackets(queueId),
+                          "Unexpected number of queued MPDUs when transmitting frame #"
+                              << psduNumber);
+
+    Ptr<WifiMpdu> mpdu;
+    while ((mpdu = staQueue->PeekByQueueId(queueId, mpdu)))
+    {
+        const auto seqNo = mpdu->GetHeader().GetSequenceNumber();
+        const auto it = seqNoRetryCountMap.find(seqNo);
+        NS_TEST_ASSERT_MSG_EQ((it != seqNoRetryCountMap.cend()),
+                              true,
+                              "SeqNo " << seqNo << " not found in PSDU #" << psduNumber);
+        NS_TEST_EXPECT_MSG_EQ(mpdu->GetRetryCount(),
+                              it->second,
+                              "Unexpected retry count for MPDU with SeqNo=" << seqNo << " in PSDU #"
+                                                                            << psduNumber);
+    }
+
+    NS_TEST_EXPECT_MSG_EQ(qsrcOther.has_value(),
+                          (m_nLinks > 1),
+                          "QSRC for other link can be provided iff devices are multi-link");
+
+    std::map<uint8_t, std::size_t> qsrcLinkIdMap{{linkId, qsrc}};
+    // check the QSRC on the other link in case of MLDs
+    if (m_nLinks > 1)
+    {
+        qsrcLinkIdMap.emplace((linkId == 0 ? 1 : 0), qsrcOther.value());
+    }
+
+    const auto txop = m_staMac->GetQosTxop(AC_BE);
+
+    for (const auto& [id, expectedQsrc] : qsrcLinkIdMap)
+    {
+        NS_TEST_EXPECT_MSG_EQ(txop->GetStaRetryCount(id),
+                              expectedQsrc,
+                              "Unexpected QSRC value on link " << +id << " when transmitting PSDU #"
+                                                               << psduNumber);
+
+        const auto cwMin = txop->GetMinCw(id);
+        const auto cwMax = txop->GetMaxCw(id);
+        const auto expectedCw = std::min(cwMax, (1 << expectedQsrc) * (cwMin + 1) - 1);
+
+        NS_TEST_EXPECT_MSG_EQ(txop->GetCw(id),
+                              expectedCw,
+                              "Unexpected CW value on link " << +id << " when transmitting PSDU #"
+                                                             << psduNumber);
+    }
+}
+
+void
+WifiRetransmitTest::Transmit(uint8_t phyId,
+                             WifiConstPsduMap psduMap,
+                             WifiTxVector txVector,
+                             double txPowerW)
+{
+    const auto psdu = psduMap.cbegin()->second;
+    const auto& hdr = psdu->GetHeader(0);
+    const auto printAndQuit = (!m_baEstablished || hdr.IsBeacon() || hdr.IsCfEnd());
+
+    std::stringstream ss;
+    ss << " Phy ID " << +phyId;
+    if (!printAndQuit && m_eventIt != m_events.cend())
+    {
+        ss << " PSDU #" << std::distance(m_events.cbegin(), m_eventIt);
+    }
+    for (const auto& mpdu : *PeekPointer(psdu))
+    {
+        ss << "\n" << *mpdu;
+    }
+    ss << "\nTXVECTOR = " << txVector << "\n";
+    NS_LOG_INFO(ss.str());
+
+    // do nothing if block ack agreement has not been established yet or the frame being
+    // transmitted is a Beacon frame or a CF-End frame
+    if (printAndQuit)
+    {
+        return;
+    }
+
+    if (m_eventIt != m_events.cend())
+    {
+        // check that the expected frame is being transmitted
+        NS_TEST_EXPECT_MSG_EQ(m_eventIt->hdrType,
+                              hdr.GetType(),
+                              "Unexpected MAC header type for frame #"
+                                  << std::distance(m_events.cbegin(), m_eventIt));
+        // perform actions/checks, if any
+        if (m_eventIt->func)
+        {
+            m_eventIt->func(psdu, txVector);
+        }
+
+        ++m_eventIt;
+    }
+}
+
+void
+WifiRetransmitTest::SetEvents()
+{
+    // lambda to drop all MPDUs in the given PSDU
+    auto dropPsdu = [this](Ptr<const WifiPsdu> psdu, const WifiTxVector&) {
+        std::list<uint64_t> uids;
+        for (const auto& mpdu : *PeekPointer(psdu))
+        {
+            uids.push_back(mpdu->GetPacket()->GetUid());
+        }
+        m_apErrorModel->SetList(uids);
+    };
+
+    // lambda to block transmissions on link 0 and unblock transmissions on link 1 after the
+    // given amount of time past the end of the transmission of the current frame
+    auto alternateLinks =
+        [this](Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector, Time delay) {
+            m_staMac->BlockTxOnLink(0, WifiQueueBlockedReason::TID_NOT_MAPPED);
+
+            const auto txDuration =
+                WifiPhy::CalculateTxDuration(psdu, txVector, m_staMac->GetWifiPhy(0)->GetPhyBand());
+
+            Simulator::Schedule(txDuration + delay, [this]() {
+                m_staMac->UnblockTxOnLink({1}, WifiQueueBlockedReason::TID_NOT_MAPPED);
+            });
+        };
+
+    std::size_t qsrc = 0;
+    uint8_t linkId = 0; // first TXOP takes place on the link 0
+    std::optional<std::size_t> qsrcOther;
+    if (m_nLinks > 1)
+    {
+        qsrcOther = 0; // QSRC on link 1
+    }
+
+    // 1st TXOP: the first transmission (RTS or data frames) fails (no response)
+    m_events.emplace_back(
+        (m_useRts ? WIFI_MAC_CTL_RTS : WIFI_MAC_QOSDATA),
+        [=, this](Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector) {
+            // initially, QoS data 0 and QoS data 1 have retry count equal to zero
+            CheckValues({{0, 0}, {1, 0}}, 0, linkId, qsrcOther);
+            // drop the entire PSDU
+            dropPsdu(psdu, txVector);
+            // generate two more QoS data frames
+            m_staMac->GetDevice()->GetNode()->AddApplication(GetApplication(2, m_pktSize));
+            // in case of MLDs, force the second TXOP to be started on link 1 by blocking TX on
+            // link 0 and unblocking TX on link 1; this is done at block ack timeout unless a BAR
+            // is going to be sent after this transmission failure
+            if (m_nLinks > 1 && (m_useRts || !m_useBarAfterBaTimeout))
+            {
+                alternateLinks(
+                    psdu,
+                    txVector,
+                    m_staMac->GetFrameExchangeManager(0)->GetWifiTxTimer().GetDelayLeft());
+            }
+        });
+
+    if (m_nLinks > 1)
+    {
+        // 2nd TXOP occurs on link 1
+        linkId = 1;
+        qsrc = 0;
+        // last transmission on link 0 failed, unless RTS is not used and a BAR is sent after a
+        // missed BlockAck (in which case, the last transmission is a successful BAR-BA exchange)
+        qsrcOther = ((m_useRts || !m_useBarAfterBaTimeout) ? 1 : 0);
+    }
+    else
+    {
+        // QSRC is increased after the previous TX failure
+        ++qsrc;
+    }
+
+    // 2nd TXOP
+    if (m_useRts)
+    {
+        // RTS and CTS are sent before the data frames
+        m_events.emplace_back(WIFI_MAC_CTL_RTS);
+        m_events.emplace_back(WIFI_MAC_CTL_CTS);
+    }
+    else if (m_useBarAfterBaTimeout)
+    {
+        // BAR and BA are sent before the data frames
+        m_events.emplace_back(WIFI_MAC_CTL_BACKREQ);
+        m_events.emplace_back(WIFI_MAC_CTL_BACKRESP,
+                              [=, this](Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector) {
+                                  // in case of MLDs, we can block TX on link 0 and unblock TX on
+                                  // link 1 as soon as the block ack response is received
+                                  if (m_nLinks > 1)
+                                  {
+                                      alternateLinks(psdu, txVector, Time{0});
+                                  }
+                              });
+        // QSRC is reset because the BAR/BA exchange succeeded
+        qsrc = 0;
+    }
+
+    // for the second transmission, two MPDUs in the A-MPDU out of four are received correctly
+
+    // 4 QoS data frames are now sent in an A-MPDU
+    m_events.emplace_back(
+        WIFI_MAC_QOSDATA,
+        [=, this](Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector) {
+            // after previous failure, QoS data 0 and QoS data 1 have retry count
+            // equal to 1, unless incrRetryCountUnderBa is false
+            if (m_incrRetryCountUnderBa)
+            {
+                CheckValues({{0, 1}, {1, 1}, {2, 0}, {3, 0}}, qsrc, linkId, qsrcOther);
+            }
+            else
+            {
+                CheckValues({{0, 0}, {1, 0}, {2, 0}, {3, 0}}, qsrc, linkId, qsrcOther);
+            }
+            // drop QoS data 1 and 2
+            m_apErrorModel->SetList({psdu->GetPayload(1)->GetUid(), psdu->GetPayload(2)->GetUid()});
+        });
+
+    // Block Ack response after A-MPDU
+    m_events.emplace_back(WIFI_MAC_CTL_BACKRESP);
+
+    // previous transmission succeeded, reset QSRC
+    qsrc = 0;
+
+    // 2nd TXOP continues with the STA attempting to transmit the remaining two QoS data frames
+    // (always without RTS because STA is already protected); this attempt fails (no response)
+    m_events.emplace_back(WIFI_MAC_QOSDATA,
+                          [=, this](Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector) {
+                              // the previous successful TX has not modified the retry count of the
+                              // MPDUs
+                              if (m_incrRetryCountUnderBa)
+                              {
+                                  CheckValues({{1, 1}, {2, 0}}, qsrc, linkId, qsrcOther);
+                              }
+                              else
+                              {
+                                  CheckValues({{1, 0}, {2, 0}}, qsrc, linkId, qsrcOther);
+                              }
+                              // the error model already has the UIDs of the two remaining MPDUs
+                          });
+
+    // keep transmitting the A-MPDU until the retry count of QoS data 0 reaches the limit
+    for (uint32_t retryCount = 2; retryCount < m_frameRetryLimit; ++retryCount)
+    {
+        // if PIFS recovery is used, QSRC is not modified; otherwise, QSRC is incremented
+        if (!m_pifsRecovery)
+        {
+            ++qsrc;
+        }
+
+        if (m_useBarAfterBaTimeout)
+        {
+            // 2nd TXOP is resumed with BAR/BA exchange (even if RTS is enabled because the BAR size
+            // is smaller than the RTS threshold)
+            m_events.emplace_back(
+                WIFI_MAC_CTL_BACKREQ,
+                [=, this](Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector) {
+                    // the retry count of the MPDUs has increased after the previous failed
+                    // TX
+                    if (m_incrRetryCountUnderBa)
+                    {
+                        CheckValues({{1, retryCount}, {2, retryCount - 1}},
+                                    qsrc,
+                                    linkId,
+                                    qsrcOther);
+                    }
+                    else
+                    {
+                        CheckValues({{1, 0}, {2, 0}}, qsrc, linkId, qsrcOther);
+                    }
+                });
+            m_events.emplace_back(WIFI_MAC_CTL_BACKRESP);
+            // QSRC is reset because the BAR/BA exchange succeeded
+            qsrc = 0;
+        }
+
+        // 2nd TXOP continues with the STA attempting to transmit the remaining two QoS data frames
+        // (with RTS, if enabled, because STA is no longer protected after previous TX failure);
+        // this attempt fails (no response)
+        m_events.emplace_back(
+            (m_useRts && !m_useBarAfterBaTimeout ? WIFI_MAC_CTL_RTS : WIFI_MAC_QOSDATA),
+            [=, this](Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector) {
+                // the retry count of the MPDUs has increased after the previous failed TX
+                if (m_incrRetryCountUnderBa)
+                {
+                    CheckValues({{1, retryCount}, {2, retryCount - 1}}, qsrc, linkId, qsrcOther);
+                }
+                else
+                {
+                    CheckValues({{1, 0}, {2, 0}}, qsrc, linkId, qsrcOther);
+                }
+                // drop the entire PSDU
+                dropPsdu(psdu, txVector);
+            });
+    }
+
+    // if PIFS recovery is used, QSRC is not modified; otherwise, QSRC is incremented
+    if (!m_pifsRecovery)
+    {
+        ++qsrc;
+    }
+
+    // if retry count is incremented, QoS data 0 has reached the retry limit and has been dropped,
+    // hence STA sends a BAR to advance the recipient window. If PIFS recovery is not used, we
+    // drop the BAR multiple times to observe a QSRC reset while QoS data 2 is still not dropped
+    if (m_incrRetryCountUnderBa)
+    {
+        for (std::size_t count = 0; count < 4; ++count)
+        {
+            // if the QSRC has been incremented after a TX failure (i.e., PIFS recovery is not used)
+            // and has not been reset after a successful BAR/BA exchange, it is now equal to the
+            // frame retry limit minus one.
+            if (!m_pifsRecovery && !m_useBarAfterBaTimeout)
+            {
+                qsrc = (m_frameRetryLimit - 1 + count) % (m_frameRetryLimit + 1);
+            }
+
+            m_events.emplace_back(
+                WIFI_MAC_CTL_BACKREQ,
+                [=, this](Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector) {
+                    CheckValues({{2, m_frameRetryLimit - 1}}, qsrc, linkId, qsrcOther);
+                    // drop the BlockAckReq
+                    dropPsdu(psdu, txVector);
+                });
+
+            // if PIFS recovery is used, QSRC is not modified; otherwise, QSRC is incremented
+            if (!m_pifsRecovery)
+            {
+                ++qsrc;
+            }
+        }
+    }
+    else
+    {
+        m_events.emplace_back((m_useBarAfterBaTimeout
+                                   ? WIFI_MAC_CTL_BACKREQ
+                                   : (m_useRts ? WIFI_MAC_CTL_RTS : WIFI_MAC_QOSDATA)),
+                              [=, this](Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector) {
+                                  CheckValues({{1, 0}, {2, 0}}, qsrc, linkId, qsrcOther);
+                                  // QoS data frames transmission succeeds
+                                  m_apErrorModel->SetList({});
+                              });
+    }
+
+    m_eventIt = m_events.cbegin();
+}
+
+void
+WifiRetransmitTest::DoRun()
+{
+    // 500 milliseconds are more than enough to complete association
+    Simulator::Schedule(MilliSeconds(500),
+                        &Node::AddApplication,
+                        m_staMac->GetDevice()->GetNode(),
+                        GetApplication(2, m_pktSize));
+
+    Simulator::Stop(Seconds(1));
+    Simulator::Run();
+
+    NS_TEST_EXPECT_MSG_EQ((m_eventIt == m_events.cend()), true, "Not all events took place");
+
+    Simulator::Destroy();
+}
+
+Ptr<PacketSocketClient>
+WifiRetransmitTest::GetApplication(std::size_t count, std::size_t pktSize) const
+{
+    auto client = CreateObject<PacketSocketClient>();
+    client->SetAttribute("PacketSize", UintegerValue(pktSize));
+    client->SetAttribute("MaxPackets", UintegerValue(count));
+    client->SetAttribute("Interval", TimeValue(MicroSeconds(0)));
+    client->SetRemote(m_ulSocket);
+    client->SetStartTime(Time{0}); // now
+    client->SetStopTime(Seconds(1.0));
+
+    return client;
+}
+
+/**
+ * @ingroup wifi-test
+ * @ingroup tests
+ *
+ * @brief wifi retransmit procedure Test Suite
+ */
+class WifiRetransmitTestSuite : public TestSuite
+{
+  public:
+    WifiRetransmitTestSuite();
+};
+
+WifiRetransmitTestSuite::WifiRetransmitTestSuite()
+    : TestSuite("wifi-retransmit", Type::UNIT)
+{
+    for (auto isMld : {true, false})
+    {
+        for (auto useRts : {true, false})
+        {
+            for (auto incrRetryCountUnderBa : {true, false})
+            {
+                for (auto useBarAfterBaTimeout : {true, false})
+                {
+                    for (auto pifsRecovery : {true, false})
+                    {
+                        AddTestCase(
+                            new WifiRetransmitTest({.isMld = isMld,
+                                                    .useRts = useRts,
+                                                    .incrRetryCountUnderBa = incrRetryCountUnderBa,
+                                                    .useBarAfterBaTimeout = useBarAfterBaTimeout,
+                                                    .pifsRecovery = pifsRecovery}),
+                            TestCase::Duration::QUICK);
+                    }
+                }
+            }
+        }
+    }
+}
+
+static WifiRetransmitTestSuite g_wifiRetransmitTestSuite; ///< the test suite
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/test/wifi-ru-allocation-test.cc ns-3.44/src/wifi/test/wifi-ru-allocation-test.cc
--- ns-3.43/src/wifi/test/wifi-ru-allocation-test.cc	2024-10-09 16:41:10.140657000 -0700
+++ ns-3.44/src/wifi/test/wifi-ru-allocation-test.cc	2025-03-09 16:55:49.811372800 -0700
@@ -14,10 +14,10 @@
 NS_LOG_COMPONENT_DEFINE("WifiRuAllocationTest");
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test the WifiPhyOperatingChannel::Get20MHzIndicesCoveringRu() method.
+ * @brief Test the WifiPhyOperatingChannel::Get20MHzIndicesCoveringRu() method.
  */
 class Wifi20MHzIndicesCoveringRuTest : public TestCase
 {
@@ -32,9 +32,9 @@
      * Check that the indices of the 20 MHz channels covering the given RU as computed
      * by WifiPhyOperatingChannel::Get20MHzIndicesCoveringRu() are correct.
      *
-     * \param primary20 the index of the primary20 channel to configure
-     * \param ru the given RU
-     * \param width the width of the channel to which the given RU refers to; normally, it is the
+     * @param primary20 the index of the primary20 channel to configure
+     * @param ru the given RU
+     * @param width the width of the channel to which the given RU refers to; normally, it is the
      * width of the PPDU for which the RU is allocated \param indices the expected indices
      */
     void RunOne(uint8_t primary20, HeRu::RuSpec ru, MHz_u width, const std::set<uint8_t>& indices);
@@ -84,11 +84,11 @@
     /******************
      * 20 MHz channel *
      ******************/
-    m_channel.SetDefault(20, WIFI_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
+    m_channel.SetDefault(MHz_u{20}, WIFI_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
 
     /* 20 MHz PPDU */
     {
-        const MHz_u width = 20;
+        const MHz_u width{20};
         const uint8_t p20Index = 0;
 
         // All the 9 26-tone RUs are covered by the unique 20 MHz channel
@@ -113,12 +113,12 @@
     /******************
      * 40 MHz channel *
      ******************/
-    m_channel.SetDefault(40, WIFI_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
+    m_channel.SetDefault(MHz_u{40}, WIFI_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
 
     /* 20 MHz PPDU */
     for (uint8_t p20Index = 0; p20Index < 2; p20Index++)
     {
-        const MHz_u width = 20;
+        const MHz_u width{20};
 
         // All the 9 26-tone RUs are covered by the primary 20 MHz channel
         for (std::size_t idx = 1; idx <= 9; idx++)
@@ -142,7 +142,7 @@
     /* 40 MHz PPDU */
     for (uint8_t p20Index = 0; p20Index < 2; p20Index++)
     {
-        const MHz_u width = 40;
+        const MHz_u width{40};
 
         // The first 9 26-tone RUs are covered by the first 20 MHz channel
         for (std::size_t idx = 1; idx <= 9; idx++)
@@ -185,12 +185,12 @@
     /******************
      * 80 MHz channel *
      ******************/
-    m_channel.SetDefault(80, WIFI_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
+    m_channel.SetDefault(MHz_u{80}, WIFI_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
 
     /* 20 MHz PPDU */
     for (uint8_t p20Index = 0; p20Index < 4; p20Index++)
     {
-        const MHz_u width = 20;
+        const MHz_u width{20};
 
         // All the 9 26-tone RUs are covered by the primary 20 MHz channel
         for (std::size_t idx = 1; idx <= 9; idx++)
@@ -214,7 +214,7 @@
     /* 40 MHz PPDU */
     for (uint8_t p20Index = 0; p20Index < 4; p20Index++)
     {
-        const MHz_u width = 40;
+        const MHz_u width{40};
         // PPDU is transmitted on P40, which may be in the lower or higher 40 MHz
         const uint8_t p40Index = p20Index / 2;
         // RUs can be allocated in one (or both) of the two 20 MHz channels in P40
@@ -262,7 +262,7 @@
     /* 80 MHz PPDU */
     for (uint8_t p20Index = 0; p20Index < 4; p20Index++)
     {
-        const MHz_u width = 80;
+        const MHz_u width{80};
 
         // The first 9 26-tone RUs are in the first 20 MHz channel
         for (std::size_t idx = 1; idx <= 9; idx++)
@@ -345,12 +345,12 @@
     /******************
      * 160 MHz channel *
      ******************/
-    m_channel.SetDefault(160, WIFI_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
+    m_channel.SetDefault(MHz_u{160}, WIFI_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
 
     /* 20 MHz PPDU */
     for (uint8_t p20Index = 0; p20Index < 8; p20Index++)
     {
-        const MHz_u width = 20;
+        const MHz_u width{20};
 
         // All the 9 26-tone RUs are covered by the primary 20 MHz channel
         for (std::size_t idx = 1; idx <= 9; idx++)
@@ -374,7 +374,7 @@
     /* 40 MHz PPDU */
     for (uint8_t p20Index = 0; p20Index < 8; p20Index++)
     {
-        const MHz_u width = 40;
+        const MHz_u width{40};
         // PPDU is transmitted on P40, which is one of the four 40 MHz channels
         const uint8_t p40Index = p20Index / 2;
         // RUs can be allocated in one (or both) of the two 20 MHz channels in P40
@@ -422,7 +422,7 @@
     /* 80 MHz PPDU */
     for (uint8_t p20Index = 0; p20Index < 8; p20Index++)
     {
-        const MHz_u width = 80;
+        const MHz_u width{80};
         // PPDU is transmitted on P80, which is one of the two 80 MHz channels
         const uint8_t p80Index = p20Index / 4;
         // RUs can be allocated in one (or more) of the four 20 MHz channels in P80
@@ -515,7 +515,7 @@
     /* 160 MHz PPDU */
     for (uint8_t p20Index = 0; p20Index < 8; p20Index++)
     {
-        const MHz_u width = 160;
+        const MHz_u width{160};
 
         for (auto primary80MHz : {true, false})
         {
@@ -661,10 +661,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief wifi primary channels test suite
+ * @brief wifi primary channels test suite
  */
 class WifiRuAllocationTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/test/wifi-test.cc ns-3.44/src/wifi/test/wifi-test.cc
--- ns-3.43/src/wifi/test/wifi-test.cc	2024-10-09 16:41:10.140657000 -0700
+++ ns-3.44/src/wifi/test/wifi-test.cc	2025-03-09 16:55:49.811372800 -0700
@@ -86,10 +86,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Wifi Test
+ * @brief Wifi Test
  */
 class WifiTest : public TestCase
 {
@@ -103,13 +103,13 @@
     void RunOne();
     /**
      * Create one function
-     * \param pos the position
-     * \param channel the wifi channel
+     * @param pos the position
+     * @param channel the wifi channel
      */
     void CreateOne(Vector pos, Ptr<YansWifiChannel> channel);
     /**
      * Send one packet function
-     * \param dev the device
+     * @param dev the device
      */
     void SendOnePacket(Ptr<WifiNetDevice> dev);
 
@@ -175,7 +175,7 @@
     mobility->SetPosition(pos);
     node->AggregateObject(mobility);
 
-    Simulator::Schedule(Seconds(1.0), &WifiTest::SendOnePacket, this, dev);
+    Simulator::Schedule(Seconds(1), &WifiTest::SendOnePacket, this, dev);
 }
 
 void
@@ -191,7 +191,7 @@
     CreateOne(Vector(5.0, 0.0, 0.0), channel);
     CreateOne(Vector(5.0, 0.0, 0.0), channel);
 
-    Simulator::Stop(Seconds(10.0));
+    Simulator::Stop(Seconds(10));
 
     Simulator::Run();
     Simulator::Destroy();
@@ -229,10 +229,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Qos Utils Is Old Packet Test
+ * @brief Qos Utils Is Old Packet Test
  */
 class QosUtilsIsOldPacketTest : public TestCase
 {
@@ -286,19 +286,19 @@
   private:
     /**
      * Create one function
-     * \param pos the position
-     * \param channel the wifi channel
-     * \returns the node
+     * @param pos the position
+     * @param channel the wifi channel
+     * @returns the node
      */
     Ptr<Node> CreateOne(Vector pos, Ptr<YansWifiChannel> channel);
     /**
      * Send one packet function
-     * \param dev the device
+     * @param dev the device
      */
     void SendOnePacket(Ptr<WifiNetDevice> dev);
     /**
      * Switch channel function
-     * \param dev the device
+     * @param dev the device
      */
     void SwitchCh(Ptr<WifiNetDevice> dev);
 
@@ -394,7 +394,7 @@
                       true);
     propLoss->SetDefaultLoss(999);
 
-    Simulator::Schedule(Seconds(1.0),
+    Simulator::Schedule(Seconds(1),
                         &InterferenceHelperSequenceTest::SendOnePacket,
                         this,
                         DynamicCast<WifiNetDevice>(senderB->GetDevice(0)));
@@ -404,17 +404,17 @@
                         this,
                         DynamicCast<WifiNetDevice>(rxOnly->GetDevice(0)));
 
-    Simulator::Schedule(Seconds(5.0),
+    Simulator::Schedule(Seconds(5),
                         &InterferenceHelperSequenceTest::SendOnePacket,
                         this,
                         DynamicCast<WifiNetDevice>(senderA->GetDevice(0)));
 
-    Simulator::Schedule(Seconds(7.0),
+    Simulator::Schedule(Seconds(7),
                         &InterferenceHelperSequenceTest::SendOnePacket,
                         this,
                         DynamicCast<WifiNetDevice>(senderB->GetDevice(0)));
 
-    Simulator::Stop(Seconds(100.0));
+    Simulator::Stop(Seconds(100));
     Simulator::Run();
 
     Simulator::Destroy();
@@ -481,7 +481,7 @@
   private:
     /**
      * Send one packet function
-     * \param dev the device
+     * @param dev the device
      */
     void SendOnePacket(Ptr<WifiNetDevice> dev);
 
@@ -495,8 +495,8 @@
 
     /**
      * Notify Phy transmit begin
-     * \param p the packet
-     * \param txPowerW the tx power
+     * @param p the packet
+     * @param txPowerW the tx power
      */
     void NotifyPhyTxBegin(Ptr<const Packet> p, double txPowerW);
 };
@@ -593,26 +593,26 @@
     // Txop::EndTxNoAck() calls to StartBackoffNow()
     AssignWifiRandomStreams(txMac, 23);
 
-    m_firstTransmissionTime = Seconds(0.0);
-    m_secondTransmissionTime = Seconds(0.0);
+    m_firstTransmissionTime = Seconds(0);
+    m_secondTransmissionTime = Seconds(0);
     m_numSentPackets = 0;
 
-    Simulator::Schedule(Seconds(1.0),
+    Simulator::Schedule(Seconds(1),
                         &DcfImmediateAccessBroadcastTestCase::SendOnePacket,
                         this,
                         txDev);
-    Simulator::Schedule(Seconds(1.0) + MicroSeconds(1),
+    Simulator::Schedule(Seconds(1) + MicroSeconds(1),
                         &DcfImmediateAccessBroadcastTestCase::SendOnePacket,
                         this,
                         txDev);
 
-    Simulator::Stop(Seconds(2.0));
+    Simulator::Stop(Seconds(2));
     Simulator::Run();
     Simulator::Destroy();
 
     // First packet is transmitted a DIFS after the packet is queued. A DIFS
     // is 2 slots (2 * 9 = 18 us) plus a SIFS (16 us), i.e., 34 us
-    Time expectedFirstTransmissionTime = Seconds(1.0) + MicroSeconds(34);
+    Time expectedFirstTransmissionTime = Seconds(1) + MicroSeconds(34);
 
     // First packet has 1408 us of transmit time.   Slot time is 9 us.
     // Backoff is 1 slots.  SIFS is 16 us.  DIFS is 2 slots = 18 us.
@@ -656,9 +656,9 @@
 
     /**
      * Receive function
-     * \param context the context
-     * \param p the packet
-     * \param adr the address
+     * @param context the context
+     * @param p the packet
+     * @param adr the address
      */
     void Receive(std::string context, Ptr<const Packet> p, const Address& adr);
 };
@@ -746,18 +746,18 @@
     client->SetRemote(socket);
     wifiStaNode.Get(0)->AddApplication(client);
     client->SetStartTime(Seconds(1));
-    client->SetStopTime(Seconds(51.0));
+    client->SetStopTime(Seconds(51));
 
     Ptr<PacketSocketServer> server = CreateObject<PacketSocketServer>();
     server->SetLocal(socket);
     wifiApNode.Get(0)->AddApplication(server);
-    server->SetStartTime(Seconds(0.0));
-    server->SetStopTime(Seconds(52.0));
+    server->SetStartTime(Seconds(0));
+    server->SetStopTime(Seconds(52));
 
     Config::Connect("/NodeList/*/ApplicationList/0/$ns3::PacketSocketServer/Rx",
                     MakeCallback(&Bug730TestCase::Receive, this));
 
-    Simulator::Schedule(Seconds(10.0),
+    Simulator::Schedule(Seconds(10),
                         Config::Set,
                         "/NodeList/0/DeviceList/0/RemoteStationManager/FragmentationThreshold",
                         StringValue("800"));
@@ -796,17 +796,17 @@
 
     /**
      * Receive function
-     * \param context the context
-     * \param p the packet
-     * \param adr the address
+     * @param context the context
+     * @param p the packet
+     * @param adr the address
      */
     void Receive(std::string context, Ptr<const Packet> p, const Address& adr);
 
     /**
      * Callback invoked when PHY transmits a packet
-     * \param context the context
-     * \param p the packet
-     * \param power the tx power
+     * @param context the context
+     * @param p the packet
+     * @param power the tx power
      */
     void Transmit(std::string context, Ptr<const Packet> p, double power);
 };
@@ -907,13 +907,13 @@
     client->SetRemote(socket);
     wifiStaNode.Get(0)->AddApplication(client);
     client->SetStartTime(Seconds(1));
-    client->SetStopTime(Seconds(3.0));
+    client->SetStopTime(Seconds(3));
 
     Ptr<PacketSocketServer> server = CreateObject<PacketSocketServer>();
     server->SetLocal(socket);
     wifiApNode.Get(0)->AddApplication(server);
-    server->SetStartTime(Seconds(0.0));
-    server->SetStopTime(Seconds(4.0));
+    server->SetStartTime(Seconds(0));
+    server->SetStopTime(Seconds(4));
 
     Config::Connect("/NodeList/*/ApplicationList/0/$ns3::PacketSocketServer/Rx",
                     MakeCallback(&QosFragmentationTestCase::Receive, this));
@@ -933,10 +933,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Set Channel Frequency Test
+ * @brief Set Channel Frequency Test
  */
 class SetChannelFrequencyTest : public TestCase
 {
@@ -948,8 +948,8 @@
   private:
     /**
      * Get yans wifi phy function
-     * \param nc the device collection
-     * \returns the wifi phy
+     * @param nc the device collection
+     * @returns the wifi phy
      */
     Ptr<YansWifiPhy> GetYansWifiPhyPtr(const NetDeviceContainer& nc) const;
 };
@@ -1010,8 +1010,8 @@
         phySta = GetYansWifiPhyPtr(staDevice);
         // We expect channel 36, width 20, frequency 5180
         NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelNumber(), 36, "default configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(), 20, "default configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), 5180, "default configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(), MHz_u{20}, "default configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), MHz_u{5180}, "default configuration");
     }
     {
         // case 2:
@@ -1021,8 +1021,8 @@
         phySta = GetYansWifiPhyPtr(staDevice);
         // We expect channel 1, width 22, frequency 2412
         NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelNumber(), 1, "802.11b configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(), 22, "802.11b configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), 2412, "802.11b configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(), MHz_u{22}, "802.11b configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), MHz_u{2412}, "802.11b configuration");
     }
     {
         // case 3:
@@ -1032,8 +1032,8 @@
         phySta = GetYansWifiPhyPtr(staDevice);
         // We expect channel 1, width 20, frequency 2412
         NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelNumber(), 1, "802.11g configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(), 20, "802.11g configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), 2412, "802.11g configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(), MHz_u{20}, "802.11g configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), MHz_u{2412}, "802.11g configuration");
     }
     {
         // case 4:
@@ -1044,8 +1044,8 @@
         staDevice = wifi.Install(phy, macSta, wifiStaNode.Get(0));
         phySta = GetYansWifiPhyPtr(staDevice);
         NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelNumber(), 36, "802.11n-5GHz configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(), 20, "802.11n-5GHz configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), 5180, "802.11n-5GHz configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(), MHz_u{20}, "802.11n-5GHz configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), MHz_u{5180}, "802.11n-5GHz configuration");
         phy.Set("ChannelSettings", StringValue("{0, 0, BAND_UNSPECIFIED, 0}")); // restore default
     }
     {
@@ -1056,8 +1056,8 @@
         staDevice = wifi.Install(phy, macSta, wifiStaNode.Get(0));
         phySta = GetYansWifiPhyPtr(staDevice);
         NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelNumber(), 1, "802.11n-2.4GHz configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(), 20, "802.11n-2.4GHz configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), 2412, "802.11n-2.4GHz configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(), MHz_u{20}, "802.11n-2.4GHz configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), MHz_u{2412}, "802.11n-2.4GHz configuration");
     }
     {
         // case 6:
@@ -1067,8 +1067,8 @@
         staDevice = wifi.Install(phy, macSta, wifiStaNode.Get(0));
         phySta = GetYansWifiPhyPtr(staDevice);
         NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelNumber(), 42, "802.11ac configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(), 80, "802.11ac configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), 5210, "802.11ac configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(), MHz_u{80}, "802.11ac configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), MHz_u{5210}, "802.11ac configuration");
     }
     {
         // case 7:
@@ -1079,8 +1079,10 @@
         staDevice = wifi.Install(phy, macSta, wifiStaNode.Get(0));
         phySta = GetYansWifiPhyPtr(staDevice);
         NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelNumber(), 1, "802.11ax-2.4GHz configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(), 20, "802.11ax-2.4GHz configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), 2412, "802.11ax-2.4GHz configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(),
+                              MHz_u{20},
+                              "802.11ax-2.4GHz configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), MHz_u{2412}, "802.11ax-2.4GHz configuration");
         phy.Set("ChannelSettings", StringValue("{0, 0, BAND_UNSPECIFIED, 0}")); // restore default
     }
     {
@@ -1090,8 +1092,8 @@
         staDevice = wifi.Install(phy, macSta, wifiStaNode.Get(0));
         phySta = GetYansWifiPhyPtr(staDevice);
         NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelNumber(), 42, "802.11ax-5GHz configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(), 80, "802.11ax-5GHz configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), 5210, "802.11ax-5GHz configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(), MHz_u{80}, "802.11ax-5GHz configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), MHz_u{5210}, "802.11ax-5GHz configuration");
     }
     {
         // case 9:
@@ -1101,8 +1103,8 @@
         staDevice = wifi.Install(phy, macSta, wifiStaNode.Get(0));
         phySta = GetYansWifiPhyPtr(staDevice);
         NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelNumber(), 7, "802.11ax-6GHz configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(), 80, "802.11ax-6GHz configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), 5985, "802.11ax-6GHz configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(), MHz_u{80}, "802.11ax-6GHz configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), MHz_u{5985}, "802.11ax-6GHz configuration");
         phy.Set("ChannelSettings", StringValue("{0, 0, BAND_UNSPECIFIED, 0}")); // restore default
     }
     {
@@ -1114,8 +1116,8 @@
         staDevice = wifi.Install(phy, macSta, wifiStaNode.Get(0));
         phySta = GetYansWifiPhyPtr(staDevice);
         NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelNumber(), 172, "802.11p 10Mhz configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(), 10, "802.11p 10Mhz configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), 5860, "802.11p 10Mhz configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(), MHz_u{10}, "802.11p 10Mhz configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), MHz_u{5860}, "802.11p 10Mhz configuration");
         phy.Set("ChannelSettings", StringValue("{0, 0, BAND_UNSPECIFIED, 0}")); // restore default
     }
     {
@@ -1127,8 +1129,8 @@
         staDevice = wifi.Install(phy, macSta, wifiStaNode.Get(0));
         phySta = GetYansWifiPhyPtr(staDevice);
         NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelNumber(), 171, "802.11p 5Mhz configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(), 5, "802.11p 5Mhz configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), 5860, "802.11p 5Mhz configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(), MHz_u{5}, "802.11p 5Mhz configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), MHz_u{5860}, "802.11p 5Mhz configuration");
         phy.Set("ChannelSettings", StringValue("{0, 0, BAND_UNSPECIFIED, 0}")); // restore default
     }
     {
@@ -1140,8 +1142,8 @@
         staDevice = wifi.Install(phy, macSta, wifiStaNode.Get(0));
         phySta = GetYansWifiPhyPtr(staDevice);
         NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelNumber(), 44, "802.11 5GHz configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(), 20, "802.11 5GHz configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), 5220, "802.11 5GHz configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(), MHz_u{20}, "802.11 5GHz configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), MHz_u{5220}, "802.11 5GHz configuration");
         phy.Set("ChannelSettings", StringValue("{0, 0, BAND_UNSPECIFIED, 0}")); // restore default
     }
     {
@@ -1157,8 +1159,8 @@
              << "/$ns3::WifiNetDevice/Phy/$ns3::YansWifiPhy/ChannelSettings";
         Config::Set(path.str(), StringValue("{40, 0, BAND_5GHZ, 0}"));
         NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelNumber(), 40, "802.11 5GHz configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(), 20, "802.11 5GHz configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), 5200, "802.11 5GHz configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(), MHz_u{20}, "802.11 5GHz configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), MHz_u{5200}, "802.11 5GHz configuration");
         phy.Set("ChannelSettings", StringValue("{0, 0, BAND_UNSPECIFIED, 0}")); // restore default
     }
     {
@@ -1176,8 +1178,8 @@
         // Although channel 44 is configured originally for 20 MHz, we
         // allow it to be used for 40 MHz here
         NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelNumber(), 46, "802.11 5GHz configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(), 40, "802.11 5GHz configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), 5230, "802.11 5GHz configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(), MHz_u{40}, "802.11 5GHz configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), MHz_u{5230}, "802.11 5GHz configuration");
         phy.Set("ChannelSettings", StringValue("{0, 0, BAND_UNSPECIFIED, 0}")); // restore default
     }
     {
@@ -1196,8 +1198,8 @@
         // Although channel 44 is configured originally for 20 MHz, we
         // allow it to be used for 40 MHz here
         NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelNumber(), 4, "802.11 5GHz configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(), 40, "802.11 5GHz configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), 2427, "802.11 5GHz configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(), MHz_u{40}, "802.11 5GHz configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), MHz_u{2427}, "802.11 5GHz configuration");
         phy.Set("ChannelSettings", StringValue("{0, 0, BAND_UNSPECIFIED, 0}")); // restore default
     }
     {
@@ -1234,8 +1236,8 @@
         phySta->SetAttribute("ChannelSettings", StringValue("{100, 0, BAND_5GHZ, 0}"));
         // We expect frequency to be 5500 due to channel number being 100
         NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelNumber(), 100, "802.11 5GHz configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(), 20, "802.11 5GHz configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), 5500, "802.11 5GHz configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(), MHz_u{20}, "802.11 5GHz configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), MHz_u{5500}, "802.11 5GHz configuration");
     }
     {
         // case 18:
@@ -1281,8 +1283,8 @@
         phySta->SetAttribute("ChannelSettings", StringValue("{36, 0, BAND_5GHZ, 0}"));
         // We expect channel number to be 36 due to known center frequency 5180
         NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelNumber(), 36, "802.11 5GHz configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(), 20, "802.11 5GHz configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), 5180, "802.11 5GHz configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(), MHz_u{20}, "802.11 5GHz configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), MHz_u{5180}, "802.11 5GHz configuration");
         exceptionThrown = false;
         try
         {
@@ -1296,8 +1298,8 @@
         NS_TEST_ASSERT_MSG_EQ(exceptionThrown, true, "802.11 5GHz configuration");
         phySta->SetAttribute("ChannelSettings", StringValue("{36, 0, BAND_5GHZ, 0}"));
         NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelNumber(), 36, "802.11 5GHz configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(), 20, "802.11 5GHz configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), 5180, "802.11 5GHz configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(), MHz_u{20}, "802.11 5GHz configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), MHz_u{5180}, "802.11 5GHz configuration");
     }
     {
         // case 20:
@@ -1308,27 +1310,27 @@
         staDevice = wifi.Install(phy, macSta, wifiStaNode.Get(0));
         phySta = GetYansWifiPhyPtr(staDevice);
         NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelNumber(), 40, "802.11 5GHz configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(), 20, "802.11 5GHz configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), 5200, "802.11 5GHz configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(), MHz_u{20}, "802.11 5GHz configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), MHz_u{5200}, "802.11 5GHz configuration");
         // Set both channel and frequency to consistent values after initialization
         wifi.SetStandard(WIFI_STANDARD_80211n);
         staDevice = wifi.Install(phy, macSta, wifiStaNode.Get(0));
         phySta = GetYansWifiPhyPtr(staDevice);
         phySta->SetAttribute("ChannelSettings", StringValue("{40, 0, BAND_5GHZ, 0}"));
         NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelNumber(), 40, "802.11 5GHz configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(), 20, "802.11 5GHz configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), 5200, "802.11 5GHz configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(), MHz_u{20}, "802.11 5GHz configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), MHz_u{5200}, "802.11 5GHz configuration");
 
         phySta->SetAttribute("ChannelSettings", StringValue("{36, 0, BAND_5GHZ, 0}"));
         // We expect channel number to be 36
         NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelNumber(), 36, "802.11 5GHz configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(), 20, "802.11 5GHz configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), 5180, "802.11 5GHz configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(), MHz_u{20}, "802.11 5GHz configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), MHz_u{5180}, "802.11 5GHz configuration");
         phySta->SetAttribute("ChannelSettings", StringValue("{40, 0, BAND_5GHZ, 0}"));
         // We expect channel number to be 40
         NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelNumber(), 40, "802.11 5GHz configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(), 20, "802.11 5GHz configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), 5200, "802.11 5GHz configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(), MHz_u{20}, "802.11 5GHz configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), MHz_u{5200}, "802.11 5GHz configuration");
         bool exceptionThrown = false;
         try
         {
@@ -1341,8 +1343,8 @@
         phySta->SetAttribute("ChannelSettings", StringValue("{36, 0, BAND_5GHZ, 0}"));
         // We expect channel number to be 36 and an exception to be thrown
         NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelNumber(), 36, "802.11 5GHz configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(), 20, "802.11 5GHz configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), 5180, "802.11 5GHz configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(), MHz_u{20}, "802.11 5GHz configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), MHz_u{5180}, "802.11 5GHz configuration");
         NS_TEST_ASSERT_MSG_EQ(exceptionThrown, true, "802.11 5GHz configuration");
         phySta->SetAttribute("ChannelSettings", StringValue("{36, 0, BAND_5GHZ, 0}"));
         exceptionThrown = false;
@@ -1356,8 +1358,8 @@
         }
         // We expect channel number to be 36 and an exception to be thrown
         NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelNumber(), 36, "802.11 5GHz configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(), 20, "802.11 5GHz configuration");
-        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), 5180, "802.11 5GHz configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetChannelWidth(), MHz_u{20}, "802.11 5GHz configuration");
+        NS_TEST_ASSERT_MSG_EQ(phySta->GetFrequency(), MHz_u{5180}, "802.11 5GHz configuration");
         NS_TEST_ASSERT_MSG_EQ(exceptionThrown, true, "802.11 5GHz configuration");
     }
 
@@ -1385,8 +1387,8 @@
 
     /**
      * Transmit data failed function
-     * \param context the context
-     * \param adr the MAC address
+     * @param context the context
+     * @param adr the MAC address
      */
     void TxDataFailedTrace(std::string context, Mac48Address adr);
 };
@@ -1469,8 +1471,8 @@
     clientLowPriority->SetAttribute("Priority", UintegerValue(4)); // AC_VI
     clientLowPriority->SetRemote(socket);
     wifiNodes.Get(0)->AddApplication(clientLowPriority);
-    clientLowPriority->SetStartTime(Seconds(0.0));
-    clientLowPriority->SetStopTime(Seconds(1.0));
+    clientLowPriority->SetStartTime(Seconds(0));
+    clientLowPriority->SetStopTime(Seconds(1));
 
     Ptr<PacketSocketClient> clientHighPriority = CreateObject<PacketSocketClient>();
     clientHighPriority->SetAttribute("PacketSize", UintegerValue(1460));
@@ -1478,19 +1480,19 @@
     clientHighPriority->SetAttribute("Priority", UintegerValue(6)); // AC_VO
     clientHighPriority->SetRemote(socket);
     wifiNodes.Get(0)->AddApplication(clientHighPriority);
-    clientHighPriority->SetStartTime(Seconds(0.0));
-    clientHighPriority->SetStopTime(Seconds(1.0));
+    clientHighPriority->SetStartTime(Seconds(0));
+    clientHighPriority->SetStopTime(Seconds(1));
 
     Ptr<PacketSocketServer> server = CreateObject<PacketSocketServer>();
     server->SetLocal(socket);
     wifiNodes.Get(1)->AddApplication(server);
-    server->SetStartTime(Seconds(0.0));
-    server->SetStopTime(Seconds(1.0));
+    server->SetStartTime(Seconds(0));
+    server->SetStopTime(Seconds(1));
 
     Config::Connect("/NodeList/*/DeviceList/*/RemoteStationManager/MacTxDataFailed",
                     MakeCallback(&Bug2222TestCase::TxDataFailedTrace, this));
 
-    Simulator::Stop(Seconds(1.0));
+    Simulator::Stop(Seconds(1));
     Simulator::Run();
     Simulator::Destroy();
 
@@ -1532,15 +1534,15 @@
     /**
      * Stores the distinct {starting frequency, channelWidth, Number of subbands in SpectrumModel,
      * modulation type} tuples that have been used during the testcase run.
-     * \param context the context
-     * \param txParams spectrum signal parameters set by transmitter
+     * @param context the context
+     * @param txParams spectrum signal parameters set by transmitter
      */
     void StoreDistinctTuple(std::string context, Ptr<SpectrumSignalParameters> txParams);
     /**
      * Triggers the arrival of a burst of 1000 Byte-long packets in the source device
-     * \param numPackets number of packets in burst
-     * \param sourceDevice pointer to the source NetDevice
-     * \param destination address of the destination device
+     * @param numPackets number of packets in burst
+     * @param sourceDevice pointer to the source NetDevice
+     * @param destination address of the destination device
      */
     void SendPacketBurst(uint8_t numPackets,
                          Ptr<NetDevice> sourceDevice,
@@ -1551,7 +1553,7 @@
 
 Bug2843TestCase::Bug2843TestCase()
     : TestCase("Test case for Bug 2843"),
-      m_channelWidth(20)
+      m_channelWidth(MHz_u{20})
 {
 }
 
@@ -1565,7 +1567,7 @@
     // Extract starting frequency and number of subbands
     Ptr<const SpectrumModel> c = txParams->psd->GetSpectrumModel();
     std::size_t numBands = c->GetNumBands();
-    const Hz_u startingFreq = c->Begin()->fl;
+    const Hz_u startingFreq{c->Begin()->fl};
 
     // Get channel bandwidth and modulation class
     Ptr<const WifiSpectrumSignalParameters> wifiTxParams =
@@ -1608,7 +1610,7 @@
 void
 Bug2843TestCase::DoRun()
 {
-    MHz_u channelWidth = 40; // at least 40 MHz expected here
+    MHz_u channelWidth{40}; // at least 40 MHz expected here
 
     NodeContainer wifiStaNode;
     wifiStaNode.Create(1);
@@ -1687,13 +1689,13 @@
     // tuples
     std::size_t numberTuples = m_distinctTuples.size();
     NS_TEST_ASSERT_MSG_EQ(numberTuples, 2, "Only two distinct tuples expected");
-    NS_TEST_ASSERT_MSG_EQ(std::get<0>(m_distinctTuples[0]) - 20e6,
+    NS_TEST_ASSERT_MSG_EQ(std::get<0>(m_distinctTuples[0]) - Hz_u{20e6},
                           std::get<0>(m_distinctTuples[1]),
                           "The starting frequency of the first tuple should be shifted 20 MHz to "
                           "the right wrt second tuple");
     // Note that the first tuple should the one initiated by the beacon, i.e. non-HT OFDM (20 MHz)
     NS_TEST_ASSERT_MSG_EQ(std::get<1>(m_distinctTuples[0]),
-                          20,
+                          MHz_u{20},
                           "First tuple's channel width should be 20 MHz");
     NS_TEST_ASSERT_MSG_EQ(std::get<2>(m_distinctTuples[0]),
                           193,
@@ -1741,9 +1743,9 @@
     void ChangeSupportedChannelWidth();
     /**
      * Callback triggered when a packet is received by the PHYs
-     * \param context the context
-     * \param p the received packet
-     * \param rxPowersW the received power per channel band in watts
+     * @param context the context
+     * @param p the received packet
+     * @param rxPowersW the received power per channel band in watts
      */
     void RxCallback(std::string context, Ptr<const Packet> p, RxPowerWattPerChannelBand rxPowersW);
 
@@ -1923,9 +1925,9 @@
     Config::Connect("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::WifiPhy/PhyRxBegin",
                     MakeCallback(&Bug2831TestCase::RxCallback, this));
 
-    Simulator::Schedule(Seconds(1.0), &Bug2831TestCase::ChangeSupportedChannelWidth, this);
+    Simulator::Schedule(Seconds(1), &Bug2831TestCase::ChangeSupportedChannelWidth, this);
 
-    Simulator::Stop(Seconds(3.0));
+    Simulator::Stop(Seconds(3));
     Simulator::Run();
     Simulator::Destroy();
 
@@ -1952,7 +1954,7 @@
  *     still scanning. STA is expected to associate to the second best AP.
  *
  * See \bugid{2399}
- * \todo Add explicit association refusal test if ns-3 implemented it.
+ * @todo Add explicit association refusal test if ns-3 implemented it.
  */
 
 class StaWifiMacScanningTestCase : public TestCase
@@ -1965,25 +1967,25 @@
   private:
     /**
      * Callback function on STA assoc event
-     * \param context context string
-     * \param bssid the associated AP's bssid
+     * @param context context string
+     * @param bssid the associated AP's bssid
      */
     void AssocCallback(std::string context, Mac48Address bssid);
     /**
      * Turn beacon generation on the AP node
-     * \param apNode the AP node
+     * @param apNode the AP node
      */
     void TurnBeaconGenerationOn(Ptr<Node> apNode);
     /**
      * Turn the AP node off
-     * \param apNode the AP node
+     * @param apNode the AP node
      */
     void TurnApOff(Ptr<Node> apNode);
     /**
      * Setup test
-     * \param nearestApBeaconGeneration set BeaconGeneration attribute of the nearest AP
-     * \param staActiveProbe set ActiveProbing attribute of the STA
-     * \return node container containing all nodes
+     * @param nearestApBeaconGeneration set BeaconGeneration attribute of the nearest AP
+     * @param staActiveProbe set ActiveProbing attribute of the STA
+     * @return node container containing all nodes
      */
     NodeContainer Setup(bool nearestApBeaconGeneration, bool staActiveProbe);
 
@@ -2168,11 +2170,11 @@
   private:
     /**
      * Callback when ADDBA state changed
-     * \param context node context
-     * \param t the time the state changed
-     * \param recipient the MAC address of the recipient
-     * \param tid the TID
-     * \param state the state
+     * @param context node context
+     * @param t the time the state changed
+     * @param recipient the MAC address of the recipient
+     * @param tid the TID
+     * @param state the state
      */
     void AddbaStateChangedCallback(std::string context,
                                    Time t,
@@ -2181,11 +2183,11 @@
                                    OriginatorBlockAckAgreement::State state);
     /**
      * Callback when a frame is transmitted.
-     * \param rxErrorModel the post reception error model on the receiver
-     * \param context the context
-     * \param psduMap the PSDU map
-     * \param txVector the TX vector
-     * \param txPowerW the tx power in Watts
+     * @param rxErrorModel the post reception error model on the receiver
+     * @param context the context
+     * @param psduMap the PSDU map
+     * @param txVector the TX vector
+     * @param txPowerW the tx power in Watts
      */
     void TxCallback(Ptr<ListErrorModel> rxErrorModel,
                     std::string context,
@@ -2195,13 +2197,13 @@
 
     /**
      * Callback when packet is received
-     * \param context node context
-     * \param p the received packet
-     * \param channelFreqMhz the channel frequency in MHz
-     * \param txVector the TX vector
-     * \param aMpdu the A-MPDU info
-     * \param signalNoise the signal noise in dBm
-     * \param staId the STA-ID
+     * @param context node context
+     * @param p the received packet
+     * @param channelFreqMhz the channel frequency in MHz
+     * @param txVector the TX vector
+     * @param aMpdu the A-MPDU info
+     * @param signalNoise the signal noise in dBm
+     * @param staId the STA-ID
      */
     void RxCallback(std::string context,
                     Ptr<const Packet> p,
@@ -2212,23 +2214,23 @@
                     uint16_t staId);
     /**
      * Callback when packet is dropped
-     * \param context node context
-     * \param p the failed packet
-     * \param snr the SNR of the failed packet in linear scale
+     * @param context node context
+     * @param p the failed packet
+     * @param snr the SNR of the failed packet in linear scale
      */
     void RxErrorCallback(std::string context, Ptr<const Packet> p, double snr);
     /**
      * Triggers the arrival of a burst of 1000 Byte-long packets in the source device
-     * \param numPackets number of packets in burst
-     * \param sourceDevice pointer to the source NetDevice
-     * \param destination address of the destination device
+     * @param numPackets number of packets in burst
+     * @param sourceDevice pointer to the source NetDevice
+     * @param destination address of the destination device
      */
     void SendPacketBurst(uint32_t numPackets,
                          Ptr<NetDevice> sourceDevice,
                          Address& destination) const;
     /**
      * Run subtest for this test suite
-     * \param rcvErrorType type of station (STA or AP) to install the post reception error model on
+     * @param rcvErrorType type of station (STA or AP) to install the post reception error model on
      */
     void RunSubtest(TypeOfStation rcvErrorType);
 
@@ -2457,7 +2459,7 @@
                         apDevice.Get(0),
                         staDevice.Get(0)->GetAddress());
 
-    Simulator::Stop(Seconds(1.0));
+    Simulator::Stop(Seconds(1));
     Simulator::Run();
     Simulator::Destroy();
 }
@@ -2574,27 +2576,27 @@
   private:
     /**
      * Run one function
-     * \param useAmpdu flag to indicate whether the test should be run with A-MPDU
+     * @param useAmpdu flag to indicate whether the test should be run with A-MPDU
      */
     void RunOne(bool useAmpdu);
 
     /**
      * Callback when packet is successfully received
-     * \param context node context
-     * \param p the received packet
+     * @param context node context
+     * @param p the received packet
      */
     void RxSuccessCallback(std::string context, Ptr<const Packet> p);
     /**
      * Triggers the arrival of 1000 Byte-long packets in the source device
-     * \param numPackets number of packets in burst
-     * \param sourceDevice pointer to the source NetDevice
-     * \param destination address of the destination device
+     * @param numPackets number of packets in burst
+     * @param sourceDevice pointer to the source NetDevice
+     * @param destination address of the destination device
      */
     void SendPackets(uint8_t numPackets, Ptr<NetDevice> sourceDevice, Address& destination);
     /**
      * Transmit final data failed function
-     * \param context the context
-     * \param address the MAC address
+     * @param context the context
+     * @param address the MAC address
      */
     void TxFinalDataFailedCallback(std::string context, Mac48Address address);
 
@@ -2660,7 +2662,8 @@
     phy.SetChannel(channel.Create());
 
     WifiHelper wifi;
-    wifi.SetStandard(WIFI_STANDARD_80211ac);
+    // use HT standard so that BlockAck agreement is not established in the useAmpdu false case
+    wifi.SetStandard(useAmpdu ? WIFI_STANDARD_80211ac : WIFI_STANDARD_80211n);
     wifi.SetRemoteStationManager("ns3::IdealWifiManager");
 
     WifiMacHelper mac;
@@ -2695,7 +2698,7 @@
 
     Ptr<WaypointMobilityModel> staWaypointMobility =
         DynamicCast<WaypointMobilityModel>(wifiStaNode.Get(0)->GetObject<MobilityModel>());
-    staWaypointMobility->AddWaypoint(Waypoint(Seconds(1.0), Vector(10.0, 0.0, 0.0)));
+    staWaypointMobility->AddWaypoint(Waypoint(Seconds(1), Vector(10.0, 0.0, 0.0)));
     staWaypointMobility->AddWaypoint(Waypoint(Seconds(1.5), Vector(50.0, 0.0, 0.0)));
 
     if (useAmpdu)
@@ -2719,7 +2722,7 @@
 
     // Transmit a second data packet once the station is away from the access point: it should be
     // sent with the same high modulation and be unsuccessfuly received
-    Simulator::Schedule(Seconds(2.0),
+    Simulator::Schedule(Seconds(2),
                         &Issue40TestCase::SendPackets,
                         this,
                         useAmpdu ? 2 : 1,
@@ -2759,7 +2762,7 @@
                         apDevice.Get(0),
                         staDevice.Get(0)->GetAddress());
 
-    Simulator::Stop(Seconds(3.0));
+    Simulator::Stop(Seconds(3));
     Simulator::Run();
 
     NS_TEST_ASSERT_MSG_EQ(m_txCount,
@@ -2768,7 +2771,9 @@
     NS_TEST_ASSERT_MSG_EQ(m_rxCount,
                           (useAmpdu ? 12 : 6),
                           "Incorrect number of successfully received packets");
-    NS_TEST_ASSERT_MSG_EQ(m_txMacFinalDataFailedCount, 1, "Incorrect number of dropped TX packets");
+    NS_TEST_ASSERT_MSG_EQ(m_txMacFinalDataFailedCount,
+                          (useAmpdu ? 2 : 1),
+                          "Incorrect number of dropped TX packets");
 
     Simulator::Destroy();
 }
@@ -2806,10 +2811,10 @@
   private:
     /**
      * Triggers the transmission of a 1000 Byte-long data packet from the source device
-     * \param numPackets number of packets in burst
-     * \param sourceDevice pointer to the source NetDevice
-     * \param destination address of the destination device
-     * \param priority the priority of the packets to send
+     * @param numPackets number of packets in burst
+     * @param sourceDevice pointer to the source NetDevice
+     * @param destination address of the destination device
+     * @param priority the priority of the packets to send
      */
     void SendPackets(uint8_t numPackets,
                      Ptr<NetDevice> sourceDevice,
@@ -2818,10 +2823,10 @@
 
     /**
      * Callback that indicates a PSDU is being transmitted
-     * \param context the context
-     * \param psdus the PSDU map to transmit
-     * \param txVector the TX vector
-     * \param txPowerW the TX power (W)
+     * @param context the context
+     * @param psdus the PSDU map to transmit
+     * @param txVector the TX vector
+     * @param txPowerW the TX power (W)
      */
     void TxCallback(std::string context,
                     WifiConstPsduMap psdus,
@@ -2924,7 +2929,7 @@
                         0);
 
     // Send non best-effort (voice) packet (i.e. priority 6)
-    Simulator::Schedule(Seconds(1.0),
+    Simulator::Schedule(Seconds(1),
                         &Issue169TestCase::SendPackets,
                         this,
                         1,
@@ -2932,7 +2937,7 @@
                         staDevice.Get(0)->GetAddress(),
                         6);
 
-    Simulator::Stop(Seconds(2.0));
+    Simulator::Stop(Seconds(2));
     Simulator::Run();
 
     Simulator::Destroy();
@@ -2963,23 +2968,23 @@
   private:
     /**
      * Change the configured channel width for all nodes
-     * \param channelWidth the channel width
+     * @param channelWidth the channel width
      */
     void ChangeChannelWidth(MHz_u channelWidth);
 
     /**
      * Triggers the transmission of a 1000 Byte-long data packet from the source device
-     * \param sourceDevice pointer to the source NetDevice
-     * \param destination address of the destination device
+     * @param sourceDevice pointer to the source NetDevice
+     * @param destination address of the destination device
      */
     void SendPacket(Ptr<NetDevice> sourceDevice, Address& destination);
 
     /**
      * Callback that indicates a PSDU is being transmitted
-     * \param context the context
-     * \param psduMap the PSDU map to transmit
-     * \param txVector the TX vector
-     * \param txPowerW the TX power (W)
+     * @param context the context
+     * @param psduMap the PSDU map to transmit
+     * @param txVector the TX vector
+     * @param txPowerW the TX power (W)
      */
     void TxCallback(std::string context,
                     WifiConstPsduMap psduMap,
@@ -2988,7 +2993,7 @@
 
     /**
      * Check if the selected WifiMode is correct
-     * \param expectedMode the expected WifiMode
+     * @param expectedMode the expected WifiMode
      */
     void CheckLastSelectedMode(WifiMode expectedMode);
 
@@ -3090,8 +3095,8 @@
     Simulator::Schedule(Seconds(0.5),
                         &IdealRateManagerChannelWidthTest::ChangeChannelWidth,
                         this,
-                        80);
-    Simulator::Schedule(Seconds(1.0),
+                        MHz_u{80});
+    Simulator::Schedule(Seconds(1),
                         &IdealRateManagerChannelWidthTest::SendPacket,
                         this,
                         apDevice.Get(0),
@@ -3106,8 +3111,8 @@
     Simulator::Schedule(Seconds(1.5),
                         &IdealRateManagerChannelWidthTest::ChangeChannelWidth,
                         this,
-                        20);
-    Simulator::Schedule(Seconds(2.0),
+                        MHz_u{20});
+    Simulator::Schedule(Seconds(2),
                         &IdealRateManagerChannelWidthTest::SendPacket,
                         this,
                         apDevice.Get(0),
@@ -3122,8 +3127,8 @@
     Simulator::Schedule(Seconds(2.5),
                         &IdealRateManagerChannelWidthTest::ChangeChannelWidth,
                         this,
-                        40);
-    Simulator::Schedule(Seconds(3.0),
+                        MHz_u{40});
+    Simulator::Schedule(Seconds(3),
                         &IdealRateManagerChannelWidthTest::SendPacket,
                         this,
                         apDevice.Get(0),
@@ -3159,29 +3164,29 @@
   private:
     /**
      * Change the configured MIMO  settings  for AP node
-     * \param antennas the number of active antennas
-     * \param maxStreams the maximum number of allowed spatial streams
+     * @param antennas the number of active antennas
+     * @param maxStreams the maximum number of allowed spatial streams
      */
     void SetApMimoSettings(uint8_t antennas, uint8_t maxStreams);
     /**
      * Change the configured MIMO  settings  for STA node
-     * \param antennas the number of active antennas
-     * \param maxStreams the maximum number of allowed spatial streams
+     * @param antennas the number of active antennas
+     * @param maxStreams the maximum number of allowed spatial streams
      */
     void SetStaMimoSettings(uint8_t antennas, uint8_t maxStreams);
     /**
      * Triggers the transmission of a 1000 Byte-long data packet from the source device
-     * \param sourceDevice pointer to the source NetDevice
-     * \param destination address of the destination device
+     * @param sourceDevice pointer to the source NetDevice
+     * @param destination address of the destination device
      */
     void SendPacket(Ptr<NetDevice> sourceDevice, Address& destination);
 
     /**
      * Callback that indicates a PSDU is being transmitted
-     * \param context the context
-     * \param psdus the PSDU map to transmit
-     * \param txVector the TX vector
-     * \param txPowerW the TX power (W)
+     * @param context the context
+     * @param psdus the PSDU map to transmit
+     * @param txVector the TX vector
+     * @param txPowerW the TX power (W)
      */
     void TxCallback(std::string context,
                     WifiConstPsduMap psdus,
@@ -3190,12 +3195,12 @@
 
     /**
      * Check if the selected WifiMode is correct
-     * \param expectedMode the expected WifiMode
+     * @param expectedMode the expected WifiMode
      */
     void CheckLastSelectedMode(WifiMode expectedMode);
     /**
      * Check if the selected Nss is correct
-     * \param expectedNss the expected Nss
+     * @param expectedNss the expected Nss
      */
     void CheckLastSelectedNss(uint8_t expectedNss);
 
@@ -3322,7 +3327,7 @@
     // RX: 1 antenna
     Simulator::Schedule(Seconds(0.9), &IdealRateManagerMimoTest::SetStaMimoSettings, this, 1, 1);
     // Send packets (2 times to get one feedback)
-    Simulator::Schedule(Seconds(1.0),
+    Simulator::Schedule(Seconds(1),
                         &IdealRateManagerMimoTest::SendPacket,
                         this,
                         apDevice.Get(0),
@@ -3345,7 +3350,7 @@
     // RX: 2 antennas, but only supports 1 spatial stream
     Simulator::Schedule(Seconds(1.9), &IdealRateManagerMimoTest::SetStaMimoSettings, this, 2, 1);
     // Send packets (2 times to get one feedback)
-    Simulator::Schedule(Seconds(2.0),
+    Simulator::Schedule(Seconds(2),
                         &IdealRateManagerMimoTest::SendPacket,
                         this,
                         apDevice.Get(0),
@@ -3369,7 +3374,7 @@
     // RX: 2 antennas, and supports 2 spatial streams
     Simulator::Schedule(Seconds(2.9), &IdealRateManagerMimoTest::SetStaMimoSettings, this, 2, 2);
     // Send packets (2 times to get one feedback)
-    Simulator::Schedule(Seconds(3.0),
+    Simulator::Schedule(Seconds(3),
                         &IdealRateManagerMimoTest::SendPacket,
                         this,
                         apDevice.Get(0),
@@ -3392,7 +3397,7 @@
     // RX: 1 antenna
     Simulator::Schedule(Seconds(3.9), &IdealRateManagerMimoTest::SetStaMimoSettings, this, 1, 1);
     // Send packets (2 times to get one feedback)
-    Simulator::Schedule(Seconds(4.0),
+    Simulator::Schedule(Seconds(4),
                         &IdealRateManagerMimoTest::SendPacket,
                         this,
                         apDevice.Get(0),
@@ -3416,7 +3421,7 @@
     // RX: 2 antennas, but only supports 1 spatial stream
     Simulator::Schedule(Seconds(4.9), &IdealRateManagerMimoTest::SetStaMimoSettings, this, 2, 1);
     // Send packets (2 times to get one feedback)
-    Simulator::Schedule(Seconds(5.0),
+    Simulator::Schedule(Seconds(5),
                         &IdealRateManagerMimoTest::SendPacket,
                         this,
                         apDevice.Get(0),
@@ -3441,7 +3446,7 @@
     // RX: 2 antennas, and supports 2 spatial streams
     Simulator::Schedule(Seconds(5.9), &IdealRateManagerMimoTest::SetStaMimoSettings, this, 2, 2);
     // Send packets (2 times to get one feedback)
-    Simulator::Schedule(Seconds(6.0),
+    Simulator::Schedule(Seconds(6),
                         &IdealRateManagerMimoTest::SendPacket,
                         this,
                         apDevice.Get(0),
@@ -3464,7 +3469,7 @@
     // RX: 1 antenna
     Simulator::Schedule(Seconds(6.9), &IdealRateManagerMimoTest::SetStaMimoSettings, this, 1, 1);
     // Send packets (2 times to get one feedback)
-    Simulator::Schedule(Seconds(7.0),
+    Simulator::Schedule(Seconds(7),
                         &IdealRateManagerMimoTest::SendPacket,
                         this,
                         apDevice.Get(0),
@@ -3488,7 +3493,7 @@
     // RX: 2 antennas, but only supports 1 spatial stream
     Simulator::Schedule(Seconds(7.9), &IdealRateManagerMimoTest::SetStaMimoSettings, this, 2, 1);
     // Send packets (2 times to get one feedback)
-    Simulator::Schedule(Seconds(8.0),
+    Simulator::Schedule(Seconds(8),
                         &IdealRateManagerMimoTest::SendPacket,
                         this,
                         apDevice.Get(0),
@@ -3513,7 +3518,7 @@
     // RX: 2 antennas, and supports 2 spatial streams
     Simulator::Schedule(Seconds(8.9), &IdealRateManagerMimoTest::SetStaMimoSettings, this, 2, 2);
     // Send packets (2 times to get one feedback)
-    Simulator::Schedule(Seconds(9.0),
+    Simulator::Schedule(Seconds(9),
                         &IdealRateManagerMimoTest::SendPacket,
                         this,
                         apDevice.Get(0),
@@ -3535,7 +3540,7 @@
     // Verify we can go back to initial situation
     Simulator::Schedule(Seconds(9.9), &IdealRateManagerMimoTest::SetApMimoSettings, this, 1, 1);
     Simulator::Schedule(Seconds(9.9), &IdealRateManagerMimoTest::SetStaMimoSettings, this, 1, 1);
-    Simulator::Schedule(Seconds(10.0),
+    Simulator::Schedule(Seconds(10),
                         &IdealRateManagerMimoTest::SendPacket,
                         this,
                         apDevice.Get(0),
@@ -3553,10 +3558,10 @@
 
 //-----------------------------------------------------------------------------
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Data rate verification test for MCSs of different RU sizes
+ * @brief Data rate verification test for MCSs of different RU sizes
  */
 class HeRuMcsDataRateTestCase : public TestCase
 {
@@ -3566,13 +3571,13 @@
   private:
     /**
      * Compare the data rate computed for the provided combination with standard defined one.
-     * \param ruType the RU type
-     * \param mcs the modulation and coding scheme (as a string, e.g. HeMcs0)
-     * \param nss the number of spatial streams
-     * \param guardInterval the guard interval to use
-     * \param expectedDataRate the expected data rate in 100 kbps units (minimum granularity in
+     * @param ruType the RU type
+     * @param mcs the modulation and coding scheme (as a string, e.g. HeMcs0)
+     * @param nss the number of spatial streams
+     * @param guardInterval the guard interval to use
+     * @param expectedDataRate the expected data rate in 100 kbps units (minimum granularity in
      * standard tables)
-     * \returns true if data rates are the same, false otherwise
+     * @returns true if data rates are the same, false otherwise
      */
     bool CheckDataRate(HeRu::RuType ruType,
                        std::string mcs,
@@ -3602,7 +3607,7 @@
                                  1,
                                  1,
                                  0,
-                                 160,
+                                 MHz_u{160},
                                  false,
                                  false);
     WifiMode mode(mcs);
@@ -3665,10 +3670,10 @@
     std::tuple<SupportedRates, std::optional<ExtendedSupportedRatesIE>, std::vector<Ssid>>;
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test management header
+ * @brief Test management header
  */
 class MgtTestHeader : public WifiMgtHeader<MgtTestHeader, MgtTestElems>
 {
@@ -3677,12 +3682,12 @@
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
     /**
-     * \return the TypeId for this object.
+     * @return the TypeId for this object.
      */
     TypeId GetInstanceTypeId() const override;
 
@@ -3708,10 +3713,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Mgt header (de)serialization Test Suite
+ * @brief Mgt header (de)serialization Test Suite
  */
 class WifiMgtHeaderTest : public HeaderSerializationTestCase
 {
@@ -3831,8 +3836,8 @@
 
     /**
      * Trace sink to receive from the PacketSocket; the address parameter is unused
-     * \param context the context
-     * \param p the received packet
+     * @param context the context
+     * @param p the received packet
      */
     void Receive(std::string context, Ptr<const Packet> p, const Address&);
 };
@@ -3957,10 +3962,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Wifi Test Suite
+ * @brief Wifi Test Suite
  */
 class WifiTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/test/wifi-transmit-mask-test.cc ns-3.44/src/wifi/test/wifi-transmit-mask-test.cc
--- ns-3.43/src/wifi/test/wifi-transmit-mask-test.cc	2024-10-09 16:41:10.140657000 -0700
+++ ns-3.44/src/wifi/test/wifi-transmit-mask-test.cc	2025-03-09 16:55:49.815372700 -0700
@@ -22,10 +22,10 @@
 NS_LOG_COMPONENT_DEFINE("WifiTransmitMaskTest");
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test checks if Wifi spectrum values for OFDM are generated properly.
+ * @brief Test checks if Wifi spectrum values for OFDM are generated properly.
  * Different test cases are configured by defining different standards and bandwidth.
  */
 class WifiOfdmMaskSlopesTestCase : public TestCase
@@ -44,16 +44,16 @@
     /**
      * Constructor
      *
-     * \param name test reference name
-     * \param standard selected standard
-     * \param band selected PHY band
-     * \param channelWidth total channel width
-     * \param centerFrequencies the center frequency per contiguous segment
-     * \param maskRefs vector of expected power values and corresponding indexes of generated PSD
+     * @param name test reference name
+     * @param standard selected standard
+     * @param band selected PHY band
+     * @param channelWidth total channel width
+     * @param centerFrequencies the center frequency per contiguous segment
+     * @param maskRefs vector of expected power values and corresponding indexes of generated PSD
      *                     (only start and stop indexes/values given)
-     * \param tolerance tolerance
-     * \param precision precision (in decimals)
-     * \param puncturedSubchannels bitmap indicating whether a 20 MHz subchannel is punctured or not
+     * @param tolerance tolerance
+     * @param precision precision (in decimals)
+     * @param puncturedSubchannels bitmap indicating whether a 20 MHz subchannel is punctured or not
      * (only for 802.11ax and later)
      */
     WifiOfdmMaskSlopesTestCase(const std::string& name,
@@ -75,10 +75,10 @@
      * Interpolate PSD values for indexes between provided start and stop and append to provided
      * vector.
      *
-     * \param vect vector of sub-band index and relative power value pairs to which interpolated
+     * @param vect vector of sub-band index and relative power value pairs to which interpolated
      values should be appended
-     * \param start pair of sub-band index and relative power value for interval start
-     * \param stop pair of sub-band index and relative power value for interval stop
+     * @param start pair of sub-band index and relative power value for interval start
+     * @param stop pair of sub-band index and relative power value for interval stop
     */
     void InterpolateAndAppendValues(IndexPowerVect& vect,
                                     IndexPowerPair start,
@@ -129,18 +129,18 @@
     NS_ASSERT(!m_centerFreqs.empty());
     NS_ASSERT(m_expectedPsd.size() % 2 == 0); // start/stop pairs expected
 
-    dBr_u outerBandMaximumRejection = 0.0;
+    dBr_u outerBandMaximumRejection{0.0};
     switch (m_band)
     {
     default:
     case WIFI_PHY_BAND_5GHZ:
-        outerBandMaximumRejection = -40;
+        outerBandMaximumRejection = dBr_u{-40};
         break;
     case WIFI_PHY_BAND_2_4GHZ:
-        outerBandMaximumRejection = (m_standard >= WIFI_STANDARD_80211n) ? -45 : -40;
+        outerBandMaximumRejection = (m_standard >= WIFI_STANDARD_80211n) ? dBr_u{-45} : dBr_u{-40};
         break;
     case WIFI_PHY_BAND_6GHZ:
-        outerBandMaximumRejection = -40;
+        outerBandMaximumRejection = dBr_u{-40};
         break;
     }
 
@@ -149,81 +149,81 @@
     {
     case WIFI_STANDARD_80211p:
         NS_ASSERT(m_band == WIFI_PHY_BAND_5GHZ);
-        NS_ASSERT((m_channelWidth == 5) || (m_channelWidth == 10));
+        NS_ASSERT((m_channelWidth == MHz_u{5}) || (m_channelWidth == MHz_u{10}));
         m_actualSpectrum =
             WifiSpectrumValueHelper::CreateOfdmTxPowerSpectralDensity(m_centerFreqs.front(),
                                                                       m_channelWidth,
                                                                       refTxPower,
                                                                       m_channelWidth,
-                                                                      -20.0,
-                                                                      -28.0,
+                                                                      dBr_u{-20.0},
+                                                                      dBr_u{-28.0},
                                                                       outerBandMaximumRejection);
         break;
 
     case WIFI_STANDARD_80211g:
         NS_ASSERT(m_band == WIFI_PHY_BAND_2_4GHZ);
-        NS_ASSERT(m_channelWidth == 20);
+        NS_ASSERT(m_channelWidth == MHz_u{20});
         m_actualSpectrum =
             WifiSpectrumValueHelper::CreateOfdmTxPowerSpectralDensity(m_centerFreqs.front(),
                                                                       m_channelWidth,
                                                                       refTxPower,
                                                                       m_channelWidth,
-                                                                      -20.0,
-                                                                      -28.0,
+                                                                      dBr_u{-20.0},
+                                                                      dBr_u{-28.0},
                                                                       outerBandMaximumRejection);
         break;
 
     case WIFI_STANDARD_80211a:
         NS_ASSERT(m_band == WIFI_PHY_BAND_5GHZ);
-        NS_ASSERT(m_channelWidth == 20);
+        NS_ASSERT(m_channelWidth == MHz_u{20});
         m_actualSpectrum =
             WifiSpectrumValueHelper::CreateOfdmTxPowerSpectralDensity(m_centerFreqs.front(),
                                                                       m_channelWidth,
                                                                       refTxPower,
                                                                       m_channelWidth,
-                                                                      -20.0,
-                                                                      -28.0,
+                                                                      dBr_u{-20.0},
+                                                                      dBr_u{-28.0},
                                                                       outerBandMaximumRejection);
         break;
 
     case WIFI_STANDARD_80211n:
-        NS_ASSERT(m_channelWidth == 20 || m_channelWidth == 40);
+        NS_ASSERT(m_channelWidth == MHz_u{20} || m_channelWidth == MHz_u{40});
         m_actualSpectrum =
             WifiSpectrumValueHelper::CreateHtOfdmTxPowerSpectralDensity(m_centerFreqs,
                                                                         m_channelWidth,
                                                                         refTxPower,
                                                                         m_channelWidth,
-                                                                        -20.0,
-                                                                        -28.0,
+                                                                        dBr_u{-20.0},
+                                                                        dBr_u{-28.0},
                                                                         outerBandMaximumRejection);
         break;
 
     case WIFI_STANDARD_80211ac:
         NS_ASSERT(m_band == WIFI_PHY_BAND_5GHZ);
-        NS_ASSERT(m_channelWidth == 20 || m_channelWidth == 40 || m_channelWidth == 80 ||
-                  m_channelWidth == 160);
+        NS_ASSERT(m_channelWidth == MHz_u{20} || m_channelWidth == MHz_u{40} ||
+                  m_channelWidth == MHz_u{80} || m_channelWidth == MHz_u{160});
         m_actualSpectrum =
             WifiSpectrumValueHelper::CreateHtOfdmTxPowerSpectralDensity(m_centerFreqs,
                                                                         m_channelWidth,
                                                                         refTxPower,
                                                                         m_channelWidth,
-                                                                        -20.0,
-                                                                        -28.0,
+                                                                        dBr_u{-20.0},
+                                                                        dBr_u{-28.0},
                                                                         outerBandMaximumRejection);
         break;
 
     case WIFI_STANDARD_80211ax:
         NS_ASSERT((m_band != WIFI_PHY_BAND_2_4GHZ) ||
-                  (m_channelWidth < 80)); // not enough space in 2.4 GHz bands
-        NS_ASSERT(m_channelWidth == 20 || m_channelWidth == 40 || m_channelWidth == 80 ||
-                  m_channelWidth == 160);
+                  (m_channelWidth < MHz_u{80})); // not enough space in 2.4 GHz bands
+        NS_ASSERT(m_channelWidth == MHz_u{20} || m_channelWidth == MHz_u{40} ||
+                  m_channelWidth == MHz_u{80} || m_channelWidth == MHz_u{160});
         m_actualSpectrum =
             WifiSpectrumValueHelper::CreateHeOfdmTxPowerSpectralDensity(m_centerFreqs,
                                                                         m_channelWidth,
                                                                         refTxPower,
                                                                         m_channelWidth,
-                                                                        -20.0,
-                                                                        -28.0,
+                                                                        dBr_u{-20.0},
+                                                                        dBr_u{-28.0},
                                                                         outerBandMaximumRejection,
                                                                         m_puncturedSubchannels);
         break;
@@ -258,12 +258,13 @@
         return;
     }
 
-    double slope = (stop.second - start.second) / (stop.first - start.first);
+    const auto slope = (stop.second - start.second) / (stop.first - start.first);
     for (uint32_t i = start.first; i <= stop.first; i++)
     {
-        double val = start.second + slope * (i - start.first);
-        double multiplier = std::round(std::pow(10.0, static_cast<double>(m_precision)));
-        val = std::floor(val * multiplier + 0.5) / multiplier;
+        const auto delta{i - start.first};
+        dB_u val{start.second + slope * delta};
+        const auto multiplier = std::round(std::pow(10.0, static_cast<double>(m_precision)));
+        val = dB_u{std::floor(val * multiplier + 0.5) / multiplier};
         vect.emplace_back(i, val);
         NS_LOG_LOGIC("Append (" << i << ", " << val << ")");
     }
@@ -276,19 +277,19 @@
 WifiOfdmMaskSlopesTestCase::DoRun()
 {
     NS_LOG_FUNCTION(this);
-    dBr_u currentPower = 0.0; // have to work in dBr so as to compare with expected slopes
-    Watt_u maxPower = (*m_actualSpectrum)[0];
+    dBr_u currentPower{0.0}; // have to work in dBr so as to compare with expected slopes
+    Watt_u maxPower{(*m_actualSpectrum)[0]};
     for (auto&& vit = m_actualSpectrum->ConstValuesBegin();
          vit != m_actualSpectrum->ConstValuesEnd();
          ++vit)
     {
-        maxPower = std::max(maxPower, *vit);
+        maxPower = std::max(maxPower, Watt_u{*vit});
     }
 
     NS_LOG_INFO("Compare expected PSD");
     for (const auto& [subcarrier, expectedValue] : m_expectedPsd)
     {
-        currentPower = 10.0 * std::log10((*m_actualSpectrum)[subcarrier] / maxPower);
+        currentPower = dBr_u{10.0 * std::log10((*m_actualSpectrum)[subcarrier] / maxPower)};
         NS_LOG_LOGIC("For " << subcarrier << ", expected: " << expectedValue
                             << " vs obtained: " << currentPower);
         NS_TEST_EXPECT_MSG_EQ_TOL(currentPower,
@@ -299,10 +300,10 @@
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test suite for checking the consistency of different OFDM-based transmit masks.
+ * @brief Test suite for checking the consistency of different OFDM-based transmit masks.
  */
 class WifiTransmitMaskTestSuite : public TestSuite
 {
@@ -322,36 +323,36 @@
     NS_LOG_INFO("Creating WifiTransmitMaskTestSuite");
 
     WifiOfdmMaskSlopesTestCase::IndexPowerVect maskSlopes;
-    dB_u tol = 10e-2;
+    dB_u tol{10e-2};
     double prec = 10; // in decimals
 
     // ============================================================================================
     // 11p 5MHz
     NS_LOG_FUNCTION("Check slopes for 11p 5MHz");
     maskSlopes = {
-        std::make_pair(0, -40.0),     // Outer band left (start)
-        std::make_pair(31, -28.375),  // Outer band left (stop)
-        std::make_pair(32, -28.000),  // Middle band left (start)
-        std::make_pair(60, -20.276),  // Middle band left (stop)
-        std::make_pair(61, -20.0),    // Flat junction band left (start)
-        std::make_pair(63, -20.0),    // Flat junction band left (stop)
-        std::make_pair(64, -20.0),    // Inner band left (start)
-        std::make_pair(69, -3.333),   // Inner band left (stop)
-        std::make_pair(123, -3.333),  // Inner band right (start)
-        std::make_pair(128, -20.0),   // Inner band right (stop)
-        std::make_pair(129, -20.0),   // Flat junction band right (start)
-        std::make_pair(131, -20.0),   // Flat junction band right (stop)
-        std::make_pair(132, -20.276), // Middle band right (start)
-        std::make_pair(160, -28.000), // Middle band right (stop)
-        std::make_pair(161, -28.375), // Outer band right (start)
-        std::make_pair(192, -40.0),   // Outer band right (stop)
+        std::make_pair(0, dBr_u{-40.0}),     // Outer band left (start)
+        std::make_pair(31, dBr_u{-28.375}),  // Outer band left (stop)
+        std::make_pair(32, dBr_u{-28.000}),  // Middle band left (start)
+        std::make_pair(60, dBr_u{-20.276}),  // Middle band left (stop)
+        std::make_pair(61, dBr_u{-20.0}),    // Flat junction band left (start)
+        std::make_pair(63, dBr_u{-20.0}),    // Flat junction band left (stop)
+        std::make_pair(64, dBr_u{-20.0}),    // Inner band left (start)
+        std::make_pair(69, dBr_u{-3.333}),   // Inner band left (stop)
+        std::make_pair(123, dBr_u{-3.333}),  // Inner band right (start)
+        std::make_pair(128, dBr_u{-20.0}),   // Inner band right (stop)
+        std::make_pair(129, dBr_u{-20.0}),   // Flat junction band right (start)
+        std::make_pair(131, dBr_u{-20.0}),   // Flat junction band right (stop)
+        std::make_pair(132, dBr_u{-20.276}), // Middle band right (start)
+        std::make_pair(160, dBr_u{-28.000}), // Middle band right (stop)
+        std::make_pair(161, dBr_u{-28.375}), // Outer band right (start)
+        std::make_pair(192, dBr_u{-40.0}),   // Outer band right (stop)
     };
 
     AddTestCase(new WifiOfdmMaskSlopesTestCase("11p 5MHz",
                                                WIFI_STANDARD_80211p,
                                                WIFI_PHY_BAND_5GHZ,
-                                               5,
-                                               {5860},
+                                               MHz_u{5},
+                                               {MHz_u{5860}},
                                                maskSlopes,
                                                tol,
                                                prec),
@@ -361,29 +362,29 @@
     // 11p 10MHz
     NS_LOG_FUNCTION("Check slopes for 11p 10MHz");
     maskSlopes = {
-        std::make_pair(0, -40.0),     // Outer band left (start)
-        std::make_pair(31, -28.375),  // Outer band left (stop)
-        std::make_pair(32, -28.000),  // Middle band left (start)
-        std::make_pair(60, -20.276),  // Middle band left (stop)
-        std::make_pair(61, -20.0),    // Flat junction band left (start)
-        std::make_pair(63, -20.0),    // Flat junction band left (stop)
-        std::make_pair(64, -20.0),    // Inner band left (start)
-        std::make_pair(69, -3.333),   // Inner band left (stop)
-        std::make_pair(123, -3.333),  // Inner band right (start)
-        std::make_pair(128, -20.0),   // Inner band right (stop)
-        std::make_pair(129, -20.0),   // Flat junction band right (start)
-        std::make_pair(131, -20.0),   // Flat junction band right (stop)
-        std::make_pair(132, -20.276), // Middle band right (start)
-        std::make_pair(160, -28.000), // Middle band right (stop)
-        std::make_pair(161, -28.375), // Outer band right (start)
-        std::make_pair(192, -40.0),   // Outer band right (stop)
+        std::make_pair(0, dBr_u{-40.0}),     // Outer band left (start)
+        std::make_pair(31, dBr_u{-28.375}),  // Outer band left (stop)
+        std::make_pair(32, dBr_u{-28.000}),  // Middle band left (start)
+        std::make_pair(60, dBr_u{-20.276}),  // Middle band left (stop)
+        std::make_pair(61, dBr_u{-20.0}),    // Flat junction band left (start)
+        std::make_pair(63, dBr_u{-20.0}),    // Flat junction band left (stop)
+        std::make_pair(64, dBr_u{-20.0}),    // Inner band left (start)
+        std::make_pair(69, dBr_u{-3.333}),   // Inner band left (stop)
+        std::make_pair(123, dBr_u{-3.333}),  // Inner band right (start)
+        std::make_pair(128, dBr_u{-20.0}),   // Inner band right (stop)
+        std::make_pair(129, dBr_u{-20.0}),   // Flat junction band right (start)
+        std::make_pair(131, dBr_u{-20.0}),   // Flat junction band right (stop)
+        std::make_pair(132, dBr_u{-20.276}), // Middle band right (start)
+        std::make_pair(160, dBr_u{-28.000}), // Middle band right (stop)
+        std::make_pair(161, dBr_u{-28.375}), // Outer band right (start)
+        std::make_pair(192, dBr_u{-40.0}),   // Outer band right (stop)
     };
 
     AddTestCase(new WifiOfdmMaskSlopesTestCase("11p 10MHz",
                                                WIFI_STANDARD_80211p,
                                                WIFI_PHY_BAND_5GHZ,
-                                               10,
-                                               {5860},
+                                               MHz_u{10},
+                                               {MHz_u{5860}},
                                                maskSlopes,
                                                tol,
                                                prec),
@@ -393,29 +394,29 @@
     // 11a
     NS_LOG_FUNCTION("Check slopes for 11a");
     maskSlopes = {
-        std::make_pair(0, -40.0),     // Outer band left (start)
-        std::make_pair(31, -28.375),  // Outer band left (stop)
-        std::make_pair(32, -28.000),  // Middle band left (start)
-        std::make_pair(60, -20.276),  // Middle band left (stop)
-        std::make_pair(61, -20.0),    // Flat junction band left (start)
-        std::make_pair(63, -20.0),    // Flat junction band left (stop)
-        std::make_pair(64, -20.0),    // Inner band left (start)
-        std::make_pair(69, -3.333),   // Inner band left (stop)
-        std::make_pair(123, -3.333),  // Inner band right (start)
-        std::make_pair(128, -20.0),   // Inner band right (stop)
-        std::make_pair(129, -20.0),   // Flat junction band right (start)
-        std::make_pair(131, -20.0),   // Flat junction band right (stop)
-        std::make_pair(132, -20.276), // Middle band right (start)
-        std::make_pair(160, -28.000), // Middle band right (stop)
-        std::make_pair(161, -28.375), // Outer band right (start)
-        std::make_pair(192, -40.0),   // Outer band right (stop)
+        std::make_pair(0, dBr_u{-40.0}),     // Outer band left (start)
+        std::make_pair(31, dBr_u{-28.375}),  // Outer band left (stop)
+        std::make_pair(32, dBr_u{-28.000}),  // Middle band left (start)
+        std::make_pair(60, dBr_u{-20.276}),  // Middle band left (stop)
+        std::make_pair(61, dBr_u{-20.0}),    // Flat junction band left (start)
+        std::make_pair(63, dBr_u{-20.0}),    // Flat junction band left (stop)
+        std::make_pair(64, dBr_u{-20.0}),    // Inner band left (start)
+        std::make_pair(69, dBr_u{-3.333}),   // Inner band left (stop)
+        std::make_pair(123, dBr_u{-3.333}),  // Inner band right (start)
+        std::make_pair(128, dBr_u{-20.0}),   // Inner band right (stop)
+        std::make_pair(129, dBr_u{-20.0}),   // Flat junction band right (start)
+        std::make_pair(131, dBr_u{-20.0}),   // Flat junction band right (stop)
+        std::make_pair(132, dBr_u{-20.276}), // Middle band right (start)
+        std::make_pair(160, dBr_u{-28.000}), // Middle band right (stop)
+        std::make_pair(161, dBr_u{-28.375}), // Outer band right (start)
+        std::make_pair(192, dBr_u{-40.0}),   // Outer band right (stop)
     };
 
     AddTestCase(new WifiOfdmMaskSlopesTestCase("11a",
                                                WIFI_STANDARD_80211a,
                                                WIFI_PHY_BAND_5GHZ,
-                                               20,
-                                               {5180},
+                                               MHz_u{20},
+                                               {MHz_u{5180}},
                                                maskSlopes,
                                                tol,
                                                prec),
@@ -428,8 +429,8 @@
     AddTestCase(new WifiOfdmMaskSlopesTestCase("11g",
                                                WIFI_STANDARD_80211g,
                                                WIFI_PHY_BAND_2_4GHZ,
-                                               20,
-                                               {2412},
+                                               MHz_u{20},
+                                               {MHz_u{2412}},
                                                maskSlopes,
                                                tol,
                                                prec),
@@ -439,29 +440,29 @@
     // 11n 20MHz @ 2.4GHz
     NS_LOG_FUNCTION("Check slopes for 11n 20MHz @ 2.4GHz");
     maskSlopes = {
-        std::make_pair(0, -45.000),   // Outer band left (start)
-        std::make_pair(31, -28.531),  // Outer band left (stop)
-        std::make_pair(32, -28.000),  // Middle band left (start)
-        std::make_pair(60, -20.276),  // Middle band left (stop)
-        std::make_pair(61, -20.0),    // Flat junction band left (start)
-        std::make_pair(61, -20.0),    // Flat junction band left (stop)
-        std::make_pair(62, -20.0),    // Inner band left (start)
-        std::make_pair(67, -3.333),   // Inner band left (stop)
-        std::make_pair(125, -3.333),  // Inner band right (start)
-        std::make_pair(130, -20.0),   // Inner band right (stop)
-        std::make_pair(131, -20.0),   // Flat junction band right (start)
-        std::make_pair(131, -20.0),   // Flat junction band right (stop)
-        std::make_pair(132, -20.276), // Middle band right (start)
-        std::make_pair(160, -28.000), // Middle band right (stop)
-        std::make_pair(161, -28.531), // Outer band right (start)
-        std::make_pair(192, -45.000), // Outer band right (stop)
+        std::make_pair(0, dBr_u{-45.000}),   // Outer band left (start)
+        std::make_pair(31, dBr_u{-28.531}),  // Outer band left (stop)
+        std::make_pair(32, dBr_u{-28.000}),  // Middle band left (start)
+        std::make_pair(60, dBr_u{-20.276}),  // Middle band left (stop)
+        std::make_pair(61, dBr_u{-20.0}),    // Flat junction band left (start)
+        std::make_pair(61, dBr_u{-20.0}),    // Flat junction band left (stop)
+        std::make_pair(62, dBr_u{-20.0}),    // Inner band left (start)
+        std::make_pair(67, dBr_u{-3.333}),   // Inner band left (stop)
+        std::make_pair(125, dBr_u{-3.333}),  // Inner band right (start)
+        std::make_pair(130, dBr_u{-20.0}),   // Inner band right (stop)
+        std::make_pair(131, dBr_u{-20.0}),   // Flat junction band right (start)
+        std::make_pair(131, dBr_u{-20.0}),   // Flat junction band right (stop)
+        std::make_pair(132, dBr_u{-20.276}), // Middle band right (start)
+        std::make_pair(160, dBr_u{-28.000}), // Middle band right (stop)
+        std::make_pair(161, dBr_u{-28.531}), // Outer band right (start)
+        std::make_pair(192, dBr_u{-45.000}), // Outer band right (stop)
     };
 
     AddTestCase(new WifiOfdmMaskSlopesTestCase("11n_2.4GHz 20MHz",
                                                WIFI_STANDARD_80211n,
                                                WIFI_PHY_BAND_2_4GHZ,
-                                               20,
-                                               {2412},
+                                               MHz_u{20},
+                                               {MHz_u{2412}},
                                                maskSlopes,
                                                tol,
                                                prec),
@@ -471,29 +472,29 @@
     // 11n 20MHz @ 5GHz
     NS_LOG_FUNCTION("Check slopes for 11n 20MHz @ 5GHz");
     maskSlopes = {
-        std::make_pair(0, -40.0),     // Outer band left (start)
-        std::make_pair(31, -28.375),  // Outer band left (stop)
-        std::make_pair(32, -28.000),  // Middle band left (start)
-        std::make_pair(60, -20.276),  // Middle band left (stop)
-        std::make_pair(61, -20.0),    // Flat junction band left (start)
-        std::make_pair(61, -20.0),    // Flat junction band left (stop)
-        std::make_pair(62, -20.0),    // Inner band left (start)
-        std::make_pair(67, -3.333),   // Inner band left (stop)
-        std::make_pair(125, -3.333),  // Inner band right (start)
-        std::make_pair(130, -20.0),   // Inner band right (stop)
-        std::make_pair(131, -20.0),   // Flat junction band right (start)
-        std::make_pair(131, -20.0),   // Flat junction band right (stop)
-        std::make_pair(132, -20.276), // Middle band right (start)
-        std::make_pair(160, -28.000), // Middle band right (stop)
-        std::make_pair(161, -28.375), // Outer band right (start)
-        std::make_pair(192, -40.0),   // Outer band right (stop)
+        std::make_pair(0, dBr_u{-40.0}),     // Outer band left (start)
+        std::make_pair(31, dBr_u{-28.375}),  // Outer band left (stop)
+        std::make_pair(32, dBr_u{-28.000}),  // Middle band left (start)
+        std::make_pair(60, dBr_u{-20.276}),  // Middle band left (stop)
+        std::make_pair(61, dBr_u{-20.0}),    // Flat junction band left (start)
+        std::make_pair(61, dBr_u{-20.0}),    // Flat junction band left (stop)
+        std::make_pair(62, dBr_u{-20.0}),    // Inner band left (start)
+        std::make_pair(67, dBr_u{-3.333}),   // Inner band left (stop)
+        std::make_pair(125, dBr_u{-3.333}),  // Inner band right (start)
+        std::make_pair(130, dBr_u{-20.0}),   // Inner band right (stop)
+        std::make_pair(131, dBr_u{-20.0}),   // Flat junction band right (start)
+        std::make_pair(131, dBr_u{-20.0}),   // Flat junction band right (stop)
+        std::make_pair(132, dBr_u{-20.276}), // Middle band right (start)
+        std::make_pair(160, dBr_u{-28.000}), // Middle band right (stop)
+        std::make_pair(161, dBr_u{-28.375}), // Outer band right (start)
+        std::make_pair(192, dBr_u{-40.0}),   // Outer band right (stop)
     };
 
     AddTestCase(new WifiOfdmMaskSlopesTestCase("11n_5GHz 20MHz",
                                                WIFI_STANDARD_80211n,
                                                WIFI_PHY_BAND_5GHZ,
-                                               20,
-                                               {5180},
+                                               MHz_u{20},
+                                               {MHz_u{5180}},
                                                maskSlopes,
                                                tol,
                                                prec),
@@ -503,29 +504,29 @@
     // 11n 40MHz @ 2.4GHz
     NS_LOG_FUNCTION("Check slopes for 11n 40MHz @ 2.4GHz");
     maskSlopes = {
-        std::make_pair(0, -45.000),   // Outer band left (start)
-        std::make_pair(63, -28.266),  // Outer band left (stop)
-        std::make_pair(64, -28.000),  // Middle band left (start)
-        std::make_pair(124, -20.131), // Middle band left (stop)
-        std::make_pair(125, -20.0),   // Flat junction band left (start)
-        std::make_pair(125, -20.0),   // Flat junction band left (stop)
-        std::make_pair(126, -20.0),   // Inner band left (start)
-        std::make_pair(131, -3.333),  // Inner band left (stop)
-        std::make_pair(253, -3.333),  // Inner band right (start)
-        std::make_pair(258, -20.0),   // Inner band right (stop)
-        std::make_pair(259, -20.0),   // Flat junction band right (start)
-        std::make_pair(259, -20.0),   // Flat junction band right (stop)
-        std::make_pair(260, -20.131), // Middle band right (start)
-        std::make_pair(320, -28.000), // Middle band right (stop)
-        std::make_pair(321, -28.266), // Outer band right (start)
-        std::make_pair(384, -45.000), // Outer band right (stop)
+        std::make_pair(0, dBr_u{-45.000}),   // Outer band left (start)
+        std::make_pair(63, dBr_u{-28.266}),  // Outer band left (stop)
+        std::make_pair(64, dBr_u{-28.000}),  // Middle band left (start)
+        std::make_pair(124, dBr_u{-20.131}), // Middle band left (stop)
+        std::make_pair(125, dBr_u{-20.0}),   // Flat junction band left (start)
+        std::make_pair(125, dBr_u{-20.0}),   // Flat junction band left (stop)
+        std::make_pair(126, dBr_u{-20.0}),   // Inner band left (start)
+        std::make_pair(131, dBr_u{-3.333}),  // Inner band left (stop)
+        std::make_pair(253, dBr_u{-3.333}),  // Inner band right (start)
+        std::make_pair(258, dBr_u{-20.0}),   // Inner band right (stop)
+        std::make_pair(259, dBr_u{-20.0}),   // Flat junction band right (start)
+        std::make_pair(259, dBr_u{-20.0}),   // Flat junction band right (stop)
+        std::make_pair(260, dBr_u{-20.131}), // Middle band right (start)
+        std::make_pair(320, dBr_u{-28.000}), // Middle band right (stop)
+        std::make_pair(321, dBr_u{-28.266}), // Outer band right (start)
+        std::make_pair(384, dBr_u{-45.000}), // Outer band right (stop)
     };
 
     AddTestCase(new WifiOfdmMaskSlopesTestCase("11n_2.4GHz 40MHz",
                                                WIFI_STANDARD_80211n,
                                                WIFI_PHY_BAND_2_4GHZ,
-                                               40,
-                                               {2422},
+                                               MHz_u{40},
+                                               {MHz_u{2422}},
                                                maskSlopes,
                                                tol,
                                                prec),
@@ -535,29 +536,29 @@
     // 11n 20MHz @ 5GHz
     NS_LOG_FUNCTION("Check slopes for 11n 40MHz @ 5GHz");
     maskSlopes = {
-        std::make_pair(0, -40.0),     // Outer band left (start)
-        std::make_pair(63, -28.188),  // Outer band left (stop)
-        std::make_pair(64, -28.000),  // Middle band left (start)
-        std::make_pair(124, -20.131), // Middle band left (stop)
-        std::make_pair(125, -20.0),   // Flat junction band left (start)
-        std::make_pair(125, -20.0),   // Flat junction band left (stop)
-        std::make_pair(126, -20.0),   // Inner band left (start)
-        std::make_pair(131, -3.333),  // Inner band left (stop)
-        std::make_pair(253, -3.333),  // Inner band right (start)
-        std::make_pair(258, -20.0),   // Inner band right (stop)
-        std::make_pair(259, -20.0),   // Flat junction band right (start)
-        std::make_pair(259, -20.0),   // Flat junction band right (stop)
-        std::make_pair(260, -20.131), // Middle band right (start)
-        std::make_pair(320, -28.000), // Middle band right (stop)
-        std::make_pair(321, -28.188), // Outer band right (start)
-        std::make_pair(384, -40.0),   // Outer band right (stop)
+        std::make_pair(0, dBr_u{-40.0}),     // Outer band left (start)
+        std::make_pair(63, dBr_u{-28.188}),  // Outer band left (stop)
+        std::make_pair(64, dBr_u{-28.000}),  // Middle band left (start)
+        std::make_pair(124, dBr_u{-20.131}), // Middle band left (stop)
+        std::make_pair(125, dBr_u{-20.0}),   // Flat junction band left (start)
+        std::make_pair(125, dBr_u{-20.0}),   // Flat junction band left (stop)
+        std::make_pair(126, dBr_u{-20.0}),   // Inner band left (start)
+        std::make_pair(131, dBr_u{-3.333}),  // Inner band left (stop)
+        std::make_pair(253, dBr_u{-3.333}),  // Inner band right (start)
+        std::make_pair(258, dBr_u{-20.0}),   // Inner band right (stop)
+        std::make_pair(259, dBr_u{-20.0}),   // Flat junction band right (start)
+        std::make_pair(259, dBr_u{-20.0}),   // Flat junction band right (stop)
+        std::make_pair(260, dBr_u{-20.131}), // Middle band right (start)
+        std::make_pair(320, dBr_u{-28.000}), // Middle band right (stop)
+        std::make_pair(321, dBr_u{-28.188}), // Outer band right (start)
+        std::make_pair(384, dBr_u{-40.0}),   // Outer band right (stop)
     };
 
     AddTestCase(new WifiOfdmMaskSlopesTestCase("11n_5GHz 40MHz",
                                                WIFI_STANDARD_80211n,
                                                WIFI_PHY_BAND_5GHZ,
-                                               40,
-                                               {5190},
+                                               MHz_u{40},
+                                               {MHz_u{5190}},
                                                maskSlopes,
                                                tol,
                                                prec),
@@ -567,29 +568,29 @@
     // 11ac 20MHz
     NS_LOG_FUNCTION("Check slopes for 11ac 20MHz");
     maskSlopes = {
-        std::make_pair(0, -40.0),     // Outer band left (start)
-        std::make_pair(31, -28.375),  // Outer band left (stop)
-        std::make_pair(32, -28.000),  // Middle band left (start)
-        std::make_pair(60, -20.276),  // Middle band left (stop)
-        std::make_pair(61, -20.0),    // Flat junction band left (start)
-        std::make_pair(61, -20.0),    // Flat junction band left (stop)
-        std::make_pair(62, -20.0),    // Inner band left (start)
-        std::make_pair(67, -3.333),   // Inner band left (stop)
-        std::make_pair(125, -3.333),  // Inner band right (start)
-        std::make_pair(130, -20.0),   // Inner band right (stop)
-        std::make_pair(131, -20.0),   // Flat junction band right (start)
-        std::make_pair(131, -20.0),   // Flat junction band right (stop)
-        std::make_pair(132, -20.276), // Middle band right (start)
-        std::make_pair(160, -28.000), // Middle band right (stop)
-        std::make_pair(161, -28.375), // Outer band right (start)
-        std::make_pair(192, -40.0),   // Outer band right (stop)
+        std::make_pair(0, dBr_u{-40.0}),     // Outer band left (start)
+        std::make_pair(31, dBr_u{-28.375}),  // Outer band left (stop)
+        std::make_pair(32, dBr_u{-28.000}),  // Middle band left (start)
+        std::make_pair(60, dBr_u{-20.276}),  // Middle band left (stop)
+        std::make_pair(61, dBr_u{-20.0}),    // Flat junction band left (start)
+        std::make_pair(61, dBr_u{-20.0}),    // Flat junction band left (stop)
+        std::make_pair(62, dBr_u{-20.0}),    // Inner band left (start)
+        std::make_pair(67, dBr_u{-3.333}),   // Inner band left (stop)
+        std::make_pair(125, dBr_u{-3.333}),  // Inner band right (start)
+        std::make_pair(130, dBr_u{-20.0}),   // Inner band right (stop)
+        std::make_pair(131, dBr_u{-20.0}),   // Flat junction band right (start)
+        std::make_pair(131, dBr_u{-20.0}),   // Flat junction band right (stop)
+        std::make_pair(132, dBr_u{-20.276}), // Middle band right (start)
+        std::make_pair(160, dBr_u{-28.000}), // Middle band right (stop)
+        std::make_pair(161, dBr_u{-28.375}), // Outer band right (start)
+        std::make_pair(192, dBr_u{-40.0}),   // Outer band right (stop)
     };
 
     AddTestCase(new WifiOfdmMaskSlopesTestCase("11ac 20MHz",
                                                WIFI_STANDARD_80211ac,
                                                WIFI_PHY_BAND_5GHZ,
-                                               20,
-                                               {5180},
+                                               MHz_u{20},
+                                               {MHz_u{5180}},
                                                maskSlopes,
                                                tol,
                                                prec),
@@ -599,29 +600,29 @@
     // 11ac 20MHz
     NS_LOG_FUNCTION("Check slopes for 11ac 40MHz");
     maskSlopes = {
-        std::make_pair(0, -40.0),     // Outer band left (start)
-        std::make_pair(63, -28.188),  // Outer band left (stop)
-        std::make_pair(64, -28.000),  // Middle band left (start)
-        std::make_pair(124, -20.131), // Middle band left (stop)
-        std::make_pair(125, -20.0),   // Flat junction band left (start)
-        std::make_pair(125, -20.0),   // Flat junction band left (stop)
-        std::make_pair(126, -20.0),   // Inner band left (start)
-        std::make_pair(131, -3.333),  // Inner band left (stop)
-        std::make_pair(253, -3.333),  // Inner band right (start)
-        std::make_pair(258, -20.0),   // Inner band right (stop)
-        std::make_pair(259, -20.0),   // Flat junction band right (start)
-        std::make_pair(259, -20.0),   // Flat junction band right (stop)
-        std::make_pair(260, -20.131), // Middle band right (start)
-        std::make_pair(320, -28.000), // Middle band right (stop)
-        std::make_pair(321, -28.188), // Outer band right (start)
-        std::make_pair(384, -40.0),   // Outer band right (stop)
+        std::make_pair(0, dBr_u{-40.0}),     // Outer band left (start)
+        std::make_pair(63, dBr_u{-28.188}),  // Outer band left (stop)
+        std::make_pair(64, dBr_u{-28.000}),  // Middle band left (start)
+        std::make_pair(124, dBr_u{-20.131}), // Middle band left (stop)
+        std::make_pair(125, dBr_u{-20.0}),   // Flat junction band left (start)
+        std::make_pair(125, dBr_u{-20.0}),   // Flat junction band left (stop)
+        std::make_pair(126, dBr_u{-20.0}),   // Inner band left (start)
+        std::make_pair(131, dBr_u{-3.333}),  // Inner band left (stop)
+        std::make_pair(253, dBr_u{-3.333}),  // Inner band right (start)
+        std::make_pair(258, dBr_u{-20.0}),   // Inner band right (stop)
+        std::make_pair(259, dBr_u{-20.0}),   // Flat junction band right (start)
+        std::make_pair(259, dBr_u{-20.0}),   // Flat junction band right (stop)
+        std::make_pair(260, dBr_u{-20.131}), // Middle band right (start)
+        std::make_pair(320, dBr_u{-28.000}), // Middle band right (stop)
+        std::make_pair(321, dBr_u{-28.188}), // Outer band right (start)
+        std::make_pair(384, dBr_u{-40.0}),   // Outer band right (stop)
     };
 
     AddTestCase(new WifiOfdmMaskSlopesTestCase("11ac 40MHz",
                                                WIFI_STANDARD_80211ac,
                                                WIFI_PHY_BAND_5GHZ,
-                                               40,
-                                               {5190},
+                                               MHz_u{40},
+                                               {MHz_u{5190}},
                                                maskSlopes,
                                                tol,
                                                prec),
@@ -631,29 +632,29 @@
     // 11ac 80MHz
     NS_LOG_FUNCTION("Check slopes for 11ac 80MHz");
     maskSlopes = {
-        std::make_pair(0, -40.0),     // Outer band left (start)
-        std::make_pair(127, -28.094), // Outer band left (stop)
-        std::make_pair(128, -28.000), // Middle band left (start)
-        std::make_pair(252, -20.064), // Middle band left (stop)
-        std::make_pair(253, -20.0),   // Flat junction band left (start)
-        std::make_pair(253, -20.0),   // Flat junction band left (stop)
-        std::make_pair(254, -20.0),   // Inner band left (start)
-        std::make_pair(259, -3.333),  // Inner band left (stop)
-        std::make_pair(509, -3.333),  // Inner band right (start)
-        std::make_pair(514, -20.0),   // Inner band right (stop)
-        std::make_pair(515, -20.0),   // Flat junction band right (start)
-        std::make_pair(515, -20.0),   // Flat junction band right (stop)
-        std::make_pair(516, -20.064), // Middle band right (start)
-        std::make_pair(640, -28.000), // Middle band right (stop)
-        std::make_pair(641, -28.094), // Outer band right (start)
-        std::make_pair(768, -40.0),   // Outer band right (stop)
+        std::make_pair(0, dBr_u{-40.0}),     // Outer band left (start)
+        std::make_pair(127, dBr_u{-28.094}), // Outer band left (stop)
+        std::make_pair(128, dBr_u{-28.000}), // Middle band left (start)
+        std::make_pair(252, dBr_u{-20.064}), // Middle band left (stop)
+        std::make_pair(253, dBr_u{-20.0}),   // Flat junction band left (start)
+        std::make_pair(253, dBr_u{-20.0}),   // Flat junction band left (stop)
+        std::make_pair(254, dBr_u{-20.0}),   // Inner band left (start)
+        std::make_pair(259, dBr_u{-3.333}),  // Inner band left (stop)
+        std::make_pair(509, dBr_u{-3.333}),  // Inner band right (start)
+        std::make_pair(514, dBr_u{-20.0}),   // Inner band right (stop)
+        std::make_pair(515, dBr_u{-20.0}),   // Flat junction band right (start)
+        std::make_pair(515, dBr_u{-20.0}),   // Flat junction band right (stop)
+        std::make_pair(516, dBr_u{-20.064}), // Middle band right (start)
+        std::make_pair(640, dBr_u{-28.000}), // Middle band right (stop)
+        std::make_pair(641, dBr_u{-28.094}), // Outer band right (start)
+        std::make_pair(768, dBr_u{-40.0}),   // Outer band right (stop)
     };
 
     AddTestCase(new WifiOfdmMaskSlopesTestCase("11ac 80MHz",
                                                WIFI_STANDARD_80211ac,
                                                WIFI_PHY_BAND_5GHZ,
-                                               80,
-                                               {5210},
+                                               MHz_u{80},
+                                               {MHz_u{5210}},
                                                maskSlopes,
                                                tol,
                                                prec),
@@ -663,29 +664,29 @@
     // 11ac 20MHz
     NS_LOG_FUNCTION("Check slopes for 11ac 160MHz");
     maskSlopes = {
-        std::make_pair(0, -40.0),      // Outer band left (start)
-        std::make_pair(255, -28.047),  // Outer band left (stop)
-        std::make_pair(256, -28.000),  // Middle band left (start)
-        std::make_pair(508, -20.032),  // Middle band left (stop)
-        std::make_pair(509, -20.0),    // Flat junction band left (start)
-        std::make_pair(509, -20.0),    // Flat junction band left (stop)
-        std::make_pair(510, -20.0),    // Inner band left (start)
-        std::make_pair(515, -3.333),   // Inner band left (stop)
-        std::make_pair(1021, -3.333),  // Inner band right (start)
-        std::make_pair(1026, -20.0),   // Inner band right (stop)
-        std::make_pair(1027, -20.0),   // Flat junction band right (start)
-        std::make_pair(1027, -20.0),   // Flat junction band right (stop)
-        std::make_pair(1028, -20.032), // Middle band right (start)
-        std::make_pair(1280, -28.000), // Middle band right (stop)
-        std::make_pair(1281, -28.047), // Outer band right (start)
-        std::make_pair(1536, -40.0),   // Outer band right (stop)
+        std::make_pair(0, dBr_u{-40.0}),      // Outer band left (start)
+        std::make_pair(255, dBr_u{-28.047}),  // Outer band left (stop)
+        std::make_pair(256, dBr_u{-28.000}),  // Middle band left (start)
+        std::make_pair(508, dBr_u{-20.032}),  // Middle band left (stop)
+        std::make_pair(509, dBr_u{-20.0}),    // Flat junction band left (start)
+        std::make_pair(509, dBr_u{-20.0}),    // Flat junction band left (stop)
+        std::make_pair(510, dBr_u{-20.0}),    // Inner band left (start)
+        std::make_pair(515, dBr_u{-3.333}),   // Inner band left (stop)
+        std::make_pair(1021, dBr_u{-3.333}),  // Inner band right (start)
+        std::make_pair(1026, dBr_u{-20.0}),   // Inner band right (stop)
+        std::make_pair(1027, dBr_u{-20.0}),   // Flat junction band right (start)
+        std::make_pair(1027, dBr_u{-20.0}),   // Flat junction band right (stop)
+        std::make_pair(1028, dBr_u{-20.032}), // Middle band right (start)
+        std::make_pair(1280, dBr_u{-28.000}), // Middle band right (stop)
+        std::make_pair(1281, dBr_u{-28.047}), // Outer band right (start)
+        std::make_pair(1536, dBr_u{-40.0}),   // Outer band right (stop)
     };
 
     AddTestCase(new WifiOfdmMaskSlopesTestCase("11ac 160MHz",
                                                WIFI_STANDARD_80211ac,
                                                WIFI_PHY_BAND_5GHZ,
-                                               160,
-                                               {5250},
+                                               MHz_u{160},
+                                               {MHz_u{5250}},
                                                maskSlopes,
                                                tol,
                                                prec),
@@ -695,57 +696,57 @@
     // 11ac 80+80MHz
     NS_LOG_FUNCTION("Check slopes for 11ac 80+80MHz");
     maskSlopes = {
-        std::make_pair(0, -40.0),     // Outer band left (start)
-        std::make_pair(127, -28.094), // Outer band left (stop)
-        std::make_pair(128, -28.000), // Middle band left (start)
-        std::make_pair(252, -20.064), // Middle band left (stop)
-        std::make_pair(253, -20.0),   // Flat junction band left (start)
-        std::make_pair(253, -20.0),   // Flat junction band left (stop)
-        std::make_pair(254, -20.0),   // Inner band left for first segment (start)
-        std::make_pair(259, -3.333),  // Inner band left for first segment (stop)
-        std::make_pair(509, -3.333),  // Inner band right for first segment (start)
-        std::make_pair(514, -20.0),   // Inner band right for first segment (stop)
-        std::make_pair(515, -20.0),   // Flat junction band right for first segment (start)
-        std::make_pair(515, -20.0),   // Flat junction band right for first segment (stop)
-        std::make_pair(516, -20.01),  // start linear sum region left (no interpolation possible, so
-                                      // provide 2 times the same point)
-        std::make_pair(516, -20.01),  // start linear sum region left (no interpolation possible, so
-                                      // provide 2 times the same point)
-        std::make_pair(639, -24.99),  // stop linear sum region left (no interpolation possible, so
-                                      // provide 2 times the same point)
-        std::make_pair(639, -24.99),  // stop linear sum region left (no interpolation possible, so
-                                      // provide 2 times the same point)
-        std::make_pair(640, -25.0),   // middle linear sum region (no interpolation possible, so
-                                      // provide 2 times the same point)
-        std::make_pair(640, -25.0),   // middle linear sum region (no interpolation possible, so
-                                      // provide 2 times the same point)
-        std::make_pair(641, -24.99), // start linear sum region right (no interpolation possible, so
-                                     // provide 2 times the same point)
-        std::make_pair(641, -24.99), // start linear sum region right (no interpolation possible, so
-                                     // provide 2 times the same point)
-        std::make_pair(764, -20.01), // stop linear sum region right (no interpolation possible, so
-                                     // provide 2 times the same point)
-        std::make_pair(764, -20.01), // stop linear sum region right (no interpolation possible, so
-                                     // provide 2 times the same point)
-        std::make_pair(765, -20.0),  // Flat junction band left (start)
-        std::make_pair(765, -20.0),  // Flat junction band left (stop)
-        std::make_pair(766, -20.0),  // Inner band left for second segment (start)
-        std::make_pair(771, -3.333), // Inner band left for second segment (stop)
-        std::make_pair(1021, -3.333),  // Inner band right for second segment (start)
-        std::make_pair(1026, -20.0),   // Inner band right for second segment (stop)
-        std::make_pair(1027, -20.0),   // Flat junction band right (start)
-        std::make_pair(1027, -20.0),   // Flat junction band right (stop)
-        std::make_pair(1028, -20.016), // Middle band right (start)
-        std::make_pair(1152, -28.000), // Middle band right (stop)
-        std::make_pair(1153, -28.023), // Outer band right (start)
-        std::make_pair(1280, -40.0),   // Outer band right (stop)
+        std::make_pair(0, dBr_u{-40.0}),     // Outer band left (start)
+        std::make_pair(127, dBr_u{-28.094}), // Outer band left (stop)
+        std::make_pair(128, dBr_u{-28.000}), // Middle band left (start)
+        std::make_pair(252, dBr_u{-20.064}), // Middle band left (stop)
+        std::make_pair(253, dBr_u{-20.0}),   // Flat junction band left (start)
+        std::make_pair(253, dBr_u{-20.0}),   // Flat junction band left (stop)
+        std::make_pair(254, dBr_u{-20.0}),   // Inner band left for first segment (start)
+        std::make_pair(259, dBr_u{-3.333}),  // Inner band left for first segment (stop)
+        std::make_pair(509, dBr_u{-3.333}),  // Inner band right for first segment (start)
+        std::make_pair(514, dBr_u{-20.0}),   // Inner band right for first segment (stop)
+        std::make_pair(515, dBr_u{-20.0}),   // Flat junction band right for first segment (start)
+        std::make_pair(515, dBr_u{-20.0}),   // Flat junction band right for first segment (stop)
+        std::make_pair(516, dBr_u{-20.01}),  // start linear sum region left (no interpolation
+                                             // possible, so provide 2 times the same point)
+        std::make_pair(516, dBr_u{-20.01}),  // start linear sum region left (no interpolation
+                                             // possible, so provide 2 times the same point)
+        std::make_pair(639, dBr_u{-24.99}),  // stop linear sum region left (no interpolation
+                                             // possible, so provide 2 times the same point)
+        std::make_pair(639, dBr_u{-24.99}),  // stop linear sum region left (no interpolation
+                                             // possible, so provide 2 times the same point)
+        std::make_pair(640, dBr_u{-25.0}),   // middle linear sum region (no interpolation possible,
+                                             // so provide 2 times the same point)
+        std::make_pair(640, dBr_u{-25.0}),   // middle linear sum region (no interpolation possible,
+                                             // so provide 2 times the same point)
+        std::make_pair(641, dBr_u{-24.99}),  // start linear sum region right (no interpolation
+                                             // possible, so provide 2 times the same point)
+        std::make_pair(641, dBr_u{-24.99}),  // start linear sum region right (no interpolation
+                                             // possible, so provide 2 times the same point)
+        std::make_pair(764, dBr_u{-20.01}),  // stop linear sum region right (no interpolation
+                                             // possible, so provide 2 times the same point)
+        std::make_pair(764, dBr_u{-20.01}),  // stop linear sum region right (no interpolation
+                                             // possible, so provide 2 times the same point)
+        std::make_pair(765, dBr_u{-20.0}),   // Flat junction band left (start)
+        std::make_pair(765, dBr_u{-20.0}),   // Flat junction band left (stop)
+        std::make_pair(766, dBr_u{-20.0}),   // Inner band left for second segment (start)
+        std::make_pair(771, dBr_u{-3.333}),  // Inner band left for second segment (stop)
+        std::make_pair(1021, dBr_u{-3.333}), // Inner band right for second segment (start)
+        std::make_pair(1026, dBr_u{-20.0}),  // Inner band right for second segment (stop)
+        std::make_pair(1027, dBr_u{-20.0}),  // Flat junction band right (start)
+        std::make_pair(1027, dBr_u{-20.0}),  // Flat junction band right (stop)
+        std::make_pair(1028, dBr_u{-20.016}), // Middle band right (start)
+        std::make_pair(1152, dBr_u{-28.000}), // Middle band right (stop)
+        std::make_pair(1153, dBr_u{-28.023}), // Outer band right (start)
+        std::make_pair(1280, dBr_u{-40.0}),   // Outer band right (stop)
     };
 
     AddTestCase(new WifiOfdmMaskSlopesTestCase("11ac 80+80MHz",
                                                WIFI_STANDARD_80211ac,
                                                WIFI_PHY_BAND_5GHZ,
-                                               160,
-                                               {5530, 5690},
+                                               MHz_u{160},
+                                               {MHz_u{5530}, MHz_u{5690}},
                                                maskSlopes,
                                                tol,
                                                prec),
@@ -755,35 +756,35 @@
     // 11ax 20MHz @ 2.4GHz
     NS_LOG_FUNCTION("Check slopes for 11ax 20MHz @ 2.4GHz");
     maskSlopes = {
-        std::make_pair(0, -45.000),   // Outer band left (start)
-        std::make_pair(127, -28.133), // Outer band left (stop)
-        std::make_pair(128, -28.000), // Middle band left (start)
-        std::make_pair(252, -20.064), // Middle band left (stop)
-        std::make_pair(253, -20.0),   // Flat junction band left (start)
-        std::make_pair(255, -20.0),   // Flat junction band left (stop)
-        std::make_pair(256, -20.0),   // Inner band left (start)
-        std::make_pair(261, -3.333),  // Inner band left (stop)
-        std::make_pair(262, 0.0),     // allocated band left (start)
-        std::make_pair(382, 0.0),     // allocated band left (stop)
-        std::make_pair(383, -20.0),   // DC band (start)
-        std::make_pair(385, -20.0),   // DC band (stop)
-        std::make_pair(386, 0.0),     // allocated band right (start)
-        std::make_pair(506, 0.0),     // allocated band right (stop)
-        std::make_pair(507, -3.333),  // Inner band right (start)
-        std::make_pair(512, -20.0),   // Inner band right (stop)
-        std::make_pair(513, -20.0),   // Flat junction band right (start)
-        std::make_pair(515, -20.0),   // Flat junction band right (stop)
-        std::make_pair(516, -20.064), // Middle band right (start)
-        std::make_pair(640, -28.000), // Middle band right (stop)
-        std::make_pair(641, -28.133), // Outer band right (start)
-        std::make_pair(768, -45.000), // Outer band right (stop)
+        std::make_pair(0, dBr_u{-45.000}),   // Outer band left (start)
+        std::make_pair(127, dBr_u{-28.133}), // Outer band left (stop)
+        std::make_pair(128, dBr_u{-28.000}), // Middle band left (start)
+        std::make_pair(252, dBr_u{-20.064}), // Middle band left (stop)
+        std::make_pair(253, dBr_u{-20.0}),   // Flat junction band left (start)
+        std::make_pair(255, dBr_u{-20.0}),   // Flat junction band left (stop)
+        std::make_pair(256, dBr_u{-20.0}),   // Inner band left (start)
+        std::make_pair(261, dBr_u{-3.333}),  // Inner band left (stop)
+        std::make_pair(262, dBr_u{0.0}),     // allocated band left (start)
+        std::make_pair(382, dBr_u{0.0}),     // allocated band left (stop)
+        std::make_pair(383, dBr_u{-20.0}),   // DC band (start)
+        std::make_pair(385, dBr_u{-20.0}),   // DC band (stop)
+        std::make_pair(386, dBr_u{0.0}),     // allocated band right (start)
+        std::make_pair(506, dBr_u{0.0}),     // allocated band right (stop)
+        std::make_pair(507, dBr_u{-3.333}),  // Inner band right (start)
+        std::make_pair(512, dBr_u{-20.0}),   // Inner band right (stop)
+        std::make_pair(513, dBr_u{-20.0}),   // Flat junction band right (start)
+        std::make_pair(515, dBr_u{-20.0}),   // Flat junction band right (stop)
+        std::make_pair(516, dBr_u{-20.064}), // Middle band right (start)
+        std::make_pair(640, dBr_u{-28.000}), // Middle band right (stop)
+        std::make_pair(641, dBr_u{-28.133}), // Outer band right (start)
+        std::make_pair(768, dBr_u{-45.000}), // Outer band right (stop)
     };
 
     AddTestCase(new WifiOfdmMaskSlopesTestCase("11ax_2.4GHz 20MHz",
                                                WIFI_STANDARD_80211ax,
                                                WIFI_PHY_BAND_2_4GHZ,
-                                               20,
-                                               {2412},
+                                               MHz_u{20},
+                                               {MHz_u{2412}},
                                                maskSlopes,
                                                tol,
                                                prec),
@@ -793,35 +794,35 @@
     // 11ax 20MHz @ 5GHz
     NS_LOG_FUNCTION("Check slopes for 11ax 20MHz @ 5GHz");
     maskSlopes = {
-        std::make_pair(0, -40.0),     // Outer band left (start)
-        std::make_pair(127, -28.094), // Outer band left (stop)
-        std::make_pair(128, -28.000), // Middle band left (start)
-        std::make_pair(252, -20.064), // Middle band left (stop)
-        std::make_pair(253, -20.0),   // Flat junction band left (start)
-        std::make_pair(255, -20.0),   // Flat junction band left (stop)
-        std::make_pair(256, -20.0),   // Inner band left (start)
-        std::make_pair(261, -3.333),  // Inner band left (stop)
-        std::make_pair(262, 0.0),     // allocated band left (start)
-        std::make_pair(382, 0.0),     // allocated band left (stop)
-        std::make_pair(383, -20.0),   // DC band (start)
-        std::make_pair(385, -20.0),   // DC band (stop)
-        std::make_pair(386, 0.0),     // allocated band right (start)
-        std::make_pair(506, 0.0),     // allocated band right (stop)
-        std::make_pair(507, -3.333),  // Inner band right (start)
-        std::make_pair(512, -20.0),   // Inner band right (stop)
-        std::make_pair(513, -20.0),   // Flat junction band right (start)
-        std::make_pair(515, -20.0),   // Flat junction band right (stop)
-        std::make_pair(516, -20.064), // Middle band right (start)
-        std::make_pair(640, -28.000), // Middle band right (stop)
-        std::make_pair(641, -28.094), // Outer band right (start)
-        std::make_pair(768, -40.0),   // Outer band right (stop)
+        std::make_pair(0, dBr_u{-40.0}),     // Outer band left (start)
+        std::make_pair(127, dBr_u{-28.094}), // Outer band left (stop)
+        std::make_pair(128, dBr_u{-28.000}), // Middle band left (start)
+        std::make_pair(252, dBr_u{-20.064}), // Middle band left (stop)
+        std::make_pair(253, dBr_u{-20.0}),   // Flat junction band left (start)
+        std::make_pair(255, dBr_u{-20.0}),   // Flat junction band left (stop)
+        std::make_pair(256, dBr_u{-20.0}),   // Inner band left (start)
+        std::make_pair(261, dBr_u{-3.333}),  // Inner band left (stop)
+        std::make_pair(262, dBr_u{0.0}),     // allocated band left (start)
+        std::make_pair(382, dBr_u{0.0}),     // allocated band left (stop)
+        std::make_pair(383, dBr_u{-20.0}),   // DC band (start)
+        std::make_pair(385, dBr_u{-20.0}),   // DC band (stop)
+        std::make_pair(386, dBr_u{0.0}),     // allocated band right (start)
+        std::make_pair(506, dBr_u{0.0}),     // allocated band right (stop)
+        std::make_pair(507, dBr_u{-3.333}),  // Inner band right (start)
+        std::make_pair(512, dBr_u{-20.0}),   // Inner band right (stop)
+        std::make_pair(513, dBr_u{-20.0}),   // Flat junction band right (start)
+        std::make_pair(515, dBr_u{-20.0}),   // Flat junction band right (stop)
+        std::make_pair(516, dBr_u{-20.064}), // Middle band right (start)
+        std::make_pair(640, dBr_u{-28.000}), // Middle band right (stop)
+        std::make_pair(641, dBr_u{-28.094}), // Outer band right (start)
+        std::make_pair(768, dBr_u{-40.0}),   // Outer band right (stop)
     };
 
     AddTestCase(new WifiOfdmMaskSlopesTestCase("11ax_5GHz 20MHz",
                                                WIFI_STANDARD_80211ax,
                                                WIFI_PHY_BAND_5GHZ,
-                                               20,
-                                               {5180},
+                                               MHz_u{20},
+                                               {MHz_u{5180}},
                                                maskSlopes,
                                                tol,
                                                prec),
@@ -831,35 +832,35 @@
     // 11ax 40MHz @ 2.4GHz
     NS_LOG_FUNCTION("Check slopes for 11ax 40MHz @ 2.4GHz");
     maskSlopes = {
-        std::make_pair(0, -45.000),    // Outer band left (start)
-        std::make_pair(255, -28.066),  // Outer band left (stop)
-        std::make_pair(256, -28.000),  // Middle band left (start)
-        std::make_pair(505, -20.032),  // Middle band left (stop)
-        std::make_pair(506, -20.0),    // Flat junction band left (start)
-        std::make_pair(510, -20.0),    // Flat junction band left (stop)
-        std::make_pair(511, -20.0),    // Inner band left (start)
-        std::make_pair(523, -1.538),   // Inner band left (stop)
-        std::make_pair(524, 0.0),      // allocated band left (start)
-        std::make_pair(765, 0.0),      // allocated band left (stop)
-        std::make_pair(766, -20.0),    // DC band (start)
-        std::make_pair(770, -20.0),    // DC band (stop)
-        std::make_pair(771, 0.0),      // allocated band right (start)
-        std::make_pair(1012, 0.0),     // allocated band right (stop)
-        std::make_pair(1013, -1.538),  // Inner band right (start)
-        std::make_pair(1025, -20.0),   // Inner band right (stop)
-        std::make_pair(1026, -20.0),   // Flat junction band right (start)
-        std::make_pair(1030, -20.0),   // Flat junction band right (stop)
-        std::make_pair(1031, -20.032), // Middle band right (start)
-        std::make_pair(1280, -28.000), // Middle band right (stop)
-        std::make_pair(1281, -28.066), // Outer band right (start)
-        std::make_pair(1536, -45.000), // Outer band right (stop)
+        std::make_pair(0, dBr_u{-45.000}),    // Outer band left (start)
+        std::make_pair(255, dBr_u{-28.066}),  // Outer band left (stop)
+        std::make_pair(256, dBr_u{-28.000}),  // Middle band left (start)
+        std::make_pair(505, dBr_u{-20.032}),  // Middle band left (stop)
+        std::make_pair(506, dBr_u{-20.0}),    // Flat junction band left (start)
+        std::make_pair(510, dBr_u{-20.0}),    // Flat junction band left (stop)
+        std::make_pair(511, dBr_u{-20.0}),    // Inner band left (start)
+        std::make_pair(523, dBr_u{-1.538}),   // Inner band left (stop)
+        std::make_pair(524, dBr_u{0.0}),      // allocated band left (start)
+        std::make_pair(765, dBr_u{0.0}),      // allocated band left (stop)
+        std::make_pair(766, dBr_u{-20.0}),    // DC band (start)
+        std::make_pair(770, dBr_u{-20.0}),    // DC band (stop)
+        std::make_pair(771, dBr_u{0.0}),      // allocated band right (start)
+        std::make_pair(1012, dBr_u{0.0}),     // allocated band right (stop)
+        std::make_pair(1013, dBr_u{-1.538}),  // Inner band right (start)
+        std::make_pair(1025, dBr_u{-20.0}),   // Inner band right (stop)
+        std::make_pair(1026, dBr_u{-20.0}),   // Flat junction band right (start)
+        std::make_pair(1030, dBr_u{-20.0}),   // Flat junction band right (stop)
+        std::make_pair(1031, dBr_u{-20.032}), // Middle band right (start)
+        std::make_pair(1280, dBr_u{-28.000}), // Middle band right (stop)
+        std::make_pair(1281, dBr_u{-28.066}), // Outer band right (start)
+        std::make_pair(1536, dBr_u{-45.000}), // Outer band right (stop)
     };
 
     AddTestCase(new WifiOfdmMaskSlopesTestCase("11ax_2.4GHz 40MHz",
                                                WIFI_STANDARD_80211ax,
                                                WIFI_PHY_BAND_2_4GHZ,
-                                               40,
-                                               {2422},
+                                               MHz_u{40},
+                                               {MHz_u{2422}},
                                                maskSlopes,
                                                tol,
                                                prec),
@@ -869,35 +870,35 @@
     // 11ax 40MHz @ 5GHz
     NS_LOG_FUNCTION("Check slopes for 11ax 40MHz @ 5GHz");
     maskSlopes = {
-        std::make_pair(0, -40.0),      // Outer band left (start)
-        std::make_pair(255, -28.047),  // Outer band left (stop)
-        std::make_pair(256, -28.000),  // Middle band left (start)
-        std::make_pair(505, -20.032),  // Middle band left (stop)
-        std::make_pair(506, -20.0),    // Flat junction band left (start)
-        std::make_pair(510, -20.0),    // Flat junction band left (stop)
-        std::make_pair(511, -20.0),    // Inner band left (start)
-        std::make_pair(523, -1.538),   // Inner band left (stop)
-        std::make_pair(524, 0.0),      // allocated band left (start)
-        std::make_pair(765, 0.0),      // allocated band left (stop)
-        std::make_pair(766, -20.0),    // DC band (start)
-        std::make_pair(770, -20.0),    // DC band (stop)
-        std::make_pair(771, 0.0),      // allocated band right (start)
-        std::make_pair(1012, 0.0),     // allocated band right (stop)
-        std::make_pair(1013, -1.538),  // Inner band right (start)
-        std::make_pair(1025, -20.0),   // Inner band right (stop)
-        std::make_pair(1026, -20.0),   // Flat junction band right (start)
-        std::make_pair(1030, -20.0),   // Flat junction band right (stop)
-        std::make_pair(1031, -20.032), // Middle band right (start)
-        std::make_pair(1280, -28.000), // Middle band right (stop)
-        std::make_pair(1281, -28.047), // Outer band right (start)
-        std::make_pair(1536, -40.0),   // Outer band right (stop)
+        std::make_pair(0, dBr_u{-40.0}),      // Outer band left (start)
+        std::make_pair(255, dBr_u{-28.047}),  // Outer band left (stop)
+        std::make_pair(256, dBr_u{-28.000}),  // Middle band left (start)
+        std::make_pair(505, dBr_u{-20.032}),  // Middle band left (stop)
+        std::make_pair(506, dBr_u{-20.0}),    // Flat junction band left (start)
+        std::make_pair(510, dBr_u{-20.0}),    // Flat junction band left (stop)
+        std::make_pair(511, dBr_u{-20.0}),    // Inner band left (start)
+        std::make_pair(523, dBr_u{-1.538}),   // Inner band left (stop)
+        std::make_pair(524, dBr_u{0.0}),      // allocated band left (start)
+        std::make_pair(765, dBr_u{0.0}),      // allocated band left (stop)
+        std::make_pair(766, dBr_u{-20.0}),    // DC band (start)
+        std::make_pair(770, dBr_u{-20.0}),    // DC band (stop)
+        std::make_pair(771, dBr_u{0.0}),      // allocated band right (start)
+        std::make_pair(1012, dBr_u{0.0}),     // allocated band right (stop)
+        std::make_pair(1013, dBr_u{-1.538}),  // Inner band right (start)
+        std::make_pair(1025, dBr_u{-20.0}),   // Inner band right (stop)
+        std::make_pair(1026, dBr_u{-20.0}),   // Flat junction band right (start)
+        std::make_pair(1030, dBr_u{-20.0}),   // Flat junction band right (stop)
+        std::make_pair(1031, dBr_u{-20.032}), // Middle band right (start)
+        std::make_pair(1280, dBr_u{-28.000}), // Middle band right (stop)
+        std::make_pair(1281, dBr_u{-28.047}), // Outer band right (start)
+        std::make_pair(1536, dBr_u{-40.0}),   // Outer band right (stop)
     };
 
     AddTestCase(new WifiOfdmMaskSlopesTestCase("11ax_5GHz 40MHz",
                                                WIFI_STANDARD_80211ax,
                                                WIFI_PHY_BAND_5GHZ,
-                                               40,
-                                               {5190},
+                                               MHz_u{40},
+                                               {MHz_u{5190}},
                                                maskSlopes,
                                                tol,
                                                prec),
@@ -907,35 +908,35 @@
     // 11ax 80MHz @ 5GHz
     NS_LOG_FUNCTION("Check slopes for 11ax 80MHz @ 5GHz");
     maskSlopes = {
-        std::make_pair(0, -40.0),      // Outer band left (start)
-        std::make_pair(511, -28.023),  // Outer band left (stop)
-        std::make_pair(512, -28.000),  // Middle band left (start)
-        std::make_pair(1017, -20.016), // Middle band left (stop)
-        std::make_pair(1018, -20.0),   // Flat junction band left (start)
-        std::make_pair(1022, -20.0),   // Flat junction band left (stop)
-        std::make_pair(1023, -20.0),   // Inner band left (start)
-        std::make_pair(1035, -1.538),  // Inner band left (stop)
-        std::make_pair(1036, 0.0),     // allocated band left (start)
-        std::make_pair(1533, 0.0),     // allocated band left (stop)
-        std::make_pair(1534, -20.0),   // DC band (start)
-        std::make_pair(1538, -20.0),   // DC band (stop)
-        std::make_pair(1539, 0.0),     // allocated band right (start)
-        std::make_pair(2036, 0.0),     // allocated band right (stop)
-        std::make_pair(2037, -1.538),  // Inner band right (start)
-        std::make_pair(2049, -20.0),   // Inner band right (stop)
-        std::make_pair(2050, -20.0),   // Flat junction band right (start)
-        std::make_pair(2054, -20.0),   // Flat junction band right (stop)
-        std::make_pair(2055, -20.016), // Middle band right (start)
-        std::make_pair(2560, -28.000), // Middle band right (stop)
-        std::make_pair(2561, -28.023), // Outer band right (start)
-        std::make_pair(3072, -40.0),   // Outer band right (stop)
+        std::make_pair(0, dBr_u{-40.0}),      // Outer band left (start)
+        std::make_pair(511, dBr_u{-28.023}),  // Outer band left (stop)
+        std::make_pair(512, dBr_u{-28.000}),  // Middle band left (start)
+        std::make_pair(1017, dBr_u{-20.016}), // Middle band left (stop)
+        std::make_pair(1018, dBr_u{-20.0}),   // Flat junction band left (start)
+        std::make_pair(1022, dBr_u{-20.0}),   // Flat junction band left (stop)
+        std::make_pair(1023, dBr_u{-20.0}),   // Inner band left (start)
+        std::make_pair(1035, dBr_u{-1.538}),  // Inner band left (stop)
+        std::make_pair(1036, dBr_u{0.0}),     // allocated band left (start)
+        std::make_pair(1533, dBr_u{0.0}),     // allocated band left (stop)
+        std::make_pair(1534, dBr_u{-20.0}),   // DC band (start)
+        std::make_pair(1538, dBr_u{-20.0}),   // DC band (stop)
+        std::make_pair(1539, dBr_u{0.0}),     // allocated band right (start)
+        std::make_pair(2036, dBr_u{0.0}),     // allocated band right (stop)
+        std::make_pair(2037, dBr_u{-1.538}),  // Inner band right (start)
+        std::make_pair(2049, dBr_u{-20.0}),   // Inner band right (stop)
+        std::make_pair(2050, dBr_u{-20.0}),   // Flat junction band right (start)
+        std::make_pair(2054, dBr_u{-20.0}),   // Flat junction band right (stop)
+        std::make_pair(2055, dBr_u{-20.016}), // Middle band right (start)
+        std::make_pair(2560, dBr_u{-28.000}), // Middle band right (stop)
+        std::make_pair(2561, dBr_u{-28.023}), // Outer band right (start)
+        std::make_pair(3072, dBr_u{-40.0}),   // Outer band right (stop)
     };
 
     AddTestCase(new WifiOfdmMaskSlopesTestCase("11ax_5GHz 80MHz",
                                                WIFI_STANDARD_80211ax,
                                                WIFI_PHY_BAND_5GHZ,
-                                               80,
-                                               {5210},
+                                               MHz_u{80},
+                                               {MHz_u{5210}},
                                                maskSlopes,
                                                tol,
                                                prec),
@@ -945,43 +946,43 @@
     // 11ax 160MHz @ 5GHz
     NS_LOG_FUNCTION("Check slopes for 11ax 160MHz @ 5GHz");
     maskSlopes = {
-        std::make_pair(0, -40.0),      // Outer band left (start)
-        std::make_pair(1023, -28.012), // Outer band left (stop)
-        std::make_pair(1024, -28.000), // Middle band left (start)
-        std::make_pair(2041, -20.008), // Middle band left (stop)
-        std::make_pair(2042, -20.0),   // Flat junction band left (start)
-        std::make_pair(2046, -20.0),   // Flat junction band left (stop)
-        std::make_pair(2047, -20.0),   // Inner band left (start)
-        std::make_pair(2059, -1.538),  // Inner band left (stop)
-        std::make_pair(2060, 0.0),     // first 80 MHz allocated band left (start)
-        std::make_pair(2557, 0.0),     // first 80 MHz allocated band left (stop)
-        std::make_pair(2558, -20.0),   // first 80 MHz DC band (start)
-        std::make_pair(2562, -20.0),   // first 80 MHz DC band (stop)
-        std::make_pair(2563, 0.0),     // first 80 MHz allocated band right (start)
-        std::make_pair(3060, 0.0),     // first 80 MHz allocated band right (stop)
-        std::make_pair(3061, -20.0),   // gap between 80 MHz bands (start)
-        std::make_pair(3083, -20.0),   // gap between 80 MHz bands (start)
-        std::make_pair(3084, 0.0),     // second 80 MHz allocated band left (start)
-        std::make_pair(3581, 0.0),     // second 80 MHz allocated band left (stop)
-        std::make_pair(3582, -20.0),   // second 80 MHz DC band (start)
-        std::make_pair(3586, -20.0),   // second 80 MHz DC band (stop)
-        std::make_pair(3587, 0.0),     // second 80 MHz allocated band right (start)
-        std::make_pair(4084, 0.0),     // second 80 MHz allocated band right (stop)
-        std::make_pair(4085, -1.538),  // Inner band right (start)
-        std::make_pair(4097, -20.0),   // Inner band right (stop)
-        std::make_pair(4098, -20.0),   // Flat junction band right (start)
-        std::make_pair(4102, -20.0),   // Flat junction band right (stop)
-        std::make_pair(4103, -20.008), // Middle band right (start)
-        std::make_pair(5120, -28.000), // Middle band right (stop)
-        std::make_pair(5121, -28.012), // Outer band right (start)
-        std::make_pair(6144, -40.0),   // Outer band right (stop)
+        std::make_pair(0, dBr_u{-40.0}),      // Outer band left (start)
+        std::make_pair(1023, dBr_u{-28.012}), // Outer band left (stop)
+        std::make_pair(1024, dBr_u{-28.000}), // Middle band left (start)
+        std::make_pair(2041, dBr_u{-20.008}), // Middle band left (stop)
+        std::make_pair(2042, dBr_u{-20.0}),   // Flat junction band left (start)
+        std::make_pair(2046, dBr_u{-20.0}),   // Flat junction band left (stop)
+        std::make_pair(2047, dBr_u{-20.0}),   // Inner band left (start)
+        std::make_pair(2059, dBr_u{-1.538}),  // Inner band left (stop)
+        std::make_pair(2060, dBr_u{0.0}),     // first 80 MHz allocated band left (start)
+        std::make_pair(2557, dBr_u{0.0}),     // first 80 MHz allocated band left (stop)
+        std::make_pair(2558, dBr_u{-20.0}),   // first 80 MHz DC band (start)
+        std::make_pair(2562, dBr_u{-20.0}),   // first 80 MHz DC band (stop)
+        std::make_pair(2563, dBr_u{0.0}),     // first 80 MHz allocated band right (start)
+        std::make_pair(3060, dBr_u{0.0}),     // first 80 MHz allocated band right (stop)
+        std::make_pair(3061, dBr_u{-20.0}),   // gap between 80 MHz bands (start)
+        std::make_pair(3083, dBr_u{-20.0}),   // gap between 80 MHz bands (start)
+        std::make_pair(3084, dBr_u{0.0}),     // second 80 MHz allocated band left (start)
+        std::make_pair(3581, dBr_u{0.0}),     // second 80 MHz allocated band left (stop)
+        std::make_pair(3582, dBr_u{-20.0}),   // second 80 MHz DC band (start)
+        std::make_pair(3586, dBr_u{-20.0}),   // second 80 MHz DC band (stop)
+        std::make_pair(3587, dBr_u{0.0}),     // second 80 MHz allocated band right (start)
+        std::make_pair(4084, dBr_u{0.0}),     // second 80 MHz allocated band right (stop)
+        std::make_pair(4085, dBr_u{-1.538}),  // Inner band right (start)
+        std::make_pair(4097, dBr_u{-20.0}),   // Inner band right (stop)
+        std::make_pair(4098, dBr_u{-20.0}),   // Flat junction band right (start)
+        std::make_pair(4102, dBr_u{-20.0}),   // Flat junction band right (stop)
+        std::make_pair(4103, dBr_u{-20.008}), // Middle band right (start)
+        std::make_pair(5120, dBr_u{-28.000}), // Middle band right (stop)
+        std::make_pair(5121, dBr_u{-28.012}), // Outer band right (start)
+        std::make_pair(6144, dBr_u{-40.0}),   // Outer band right (stop)
     };
 
     AddTestCase(new WifiOfdmMaskSlopesTestCase("11ax_5GHz 160MHz",
                                                WIFI_STANDARD_80211ax,
                                                WIFI_PHY_BAND_5GHZ,
-                                               160,
-                                               {5250},
+                                               MHz_u{160},
+                                               {MHz_u{5250}},
                                                maskSlopes,
                                                tol,
                                                prec),
@@ -991,69 +992,69 @@
     // 11ax 80+80MHz @ 5GHz
     NS_LOG_FUNCTION("Check slopes for 11ax 80+80MHz @ 5GHz");
     maskSlopes = {
-        std::make_pair(0, -40.0),      // Outer band left (start)
-        std::make_pair(511, -28.023),  // Outer band left (stop)
-        std::make_pair(512, -28.000),  // Middle band left (start)
-        std::make_pair(1017, -20.016), // Middle band left (stop)
-        std::make_pair(1018, -20.0),   // Flat junction band left (start)
-        std::make_pair(1022, -20.0),   // Flat junction band left (stop)
-        std::make_pair(1023, -20.0),   // Inner band left for first segment (start)
-        std::make_pair(1035, -1.538),  // Inner band left for first segment (stop)
-        std::make_pair(1036, 0.0),     // allocated band left for first segment (start)
-        std::make_pair(1533, 0.0),     // allocated band left for first segment (stop)
-        std::make_pair(1534, -20.0),   // DC band for first segment (start)
-        std::make_pair(1538, -20.0),   // DC band for first segment (stop)
-        std::make_pair(1539, 0.0),     // allocated band right for first segment (start)
-        std::make_pair(2036, 0.0),     // allocated band right for first segment (stop)
-        std::make_pair(2037, -1.538),  // Inner band right for first segment (start)
-        std::make_pair(2049, -20.0),   // Inner band right for first segment (stop)
-        std::make_pair(2050, -20.0),   // Flat junction band right for first segment (start)
-        std::make_pair(2054, -20.0),   // Flat junction band right for first segment (stop)
-        std::make_pair(2055, -20.01), // start linear sum region left (no interpolation possible, so
-                                      // provide 2 times the same point)
-        std::make_pair(2055, -20.01), // start linear sum region left (no interpolation possible, so
-                                      // provide 2 times the same point)
-        std::make_pair(2559, -24.99), // stop linear sum region left (no interpolation possible, so
-                                      // provide 2 times the same point)
-        std::make_pair(2559, -24.99), // stop linear sum region left (no interpolation possible, so
-                                      // provide 2 times the same point)
-        std::make_pair(2560, -25.0),  // middle linear sum region (no interpolation possible, so
-                                      // provide 2 times the same point)
-        std::make_pair(2560, -25.0),  // middle linear sum region (no interpolation possible, so
-                                      // provide 2 times the same point)
-        std::make_pair(2561, -24.99), // start linear sum region right (no interpolation possible,
-                                      // so provide 2 times the same point)
-        std::make_pair(2561, -24.99), // start linear sum region right (no interpolation possible,
-                                      // so provide 2 times the same point)
-        std::make_pair(3065, -20.01), // stop linear sum region right (no interpolation possible, so
-                                      // provide 2 times the same point)
-        std::make_pair(3065, -20.01), // stop linear sum region right (no interpolation possible, so
-                                      // provide 2 times the same point)
-        std::make_pair(3066, -20.0),  // Flat junction band left (start)
-        std::make_pair(3070, -20.0),  // Flat junction band left (stop)
-        std::make_pair(3071, -20.0),  // Inner band left for second segment (start)
-        std::make_pair(3083, -1.538), // Inner band left for second segment (stop)
-        std::make_pair(3084, 0.0),    // allocated band left for second segment (start)
-        std::make_pair(3581, 0.0),    // allocated band left for second segment (stop)
-        std::make_pair(3582, -20.0),  // DC band for second segment (start)
-        std::make_pair(3586, -20.0),  // DC band for second segment (stop)
-        std::make_pair(3587, 0.0),    // allocated band right for second segment (start)
-        std::make_pair(4084, 0.0),    // allocated band right for second segment (stop)
-        std::make_pair(4085, -1.538), // Inner band right for second segment (start)
-        std::make_pair(4097, -20.0),  // Inner band right for second segment (stop)
-        std::make_pair(4098, -20.0),  // Flat junction band right (start)
-        std::make_pair(4102, -20.0),  // Flat junction band right (stop)
-        std::make_pair(4103, -20.016), // Middle band right (start)
-        std::make_pair(4608, -28.000), // Middle band right (stop)
-        std::make_pair(4609, -28.023), // Outer band right (start)
-        std::make_pair(5120, -40.0),   // Outer band right (stop)
+        std::make_pair(0, dBr_u{-40.0}),      // Outer band left (start)
+        std::make_pair(511, dBr_u{-28.023}),  // Outer band left (stop)
+        std::make_pair(512, dBr_u{-28.000}),  // Middle band left (start)
+        std::make_pair(1017, dBr_u{-20.016}), // Middle band left (stop)
+        std::make_pair(1018, dBr_u{-20.0}),   // Flat junction band left (start)
+        std::make_pair(1022, dBr_u{-20.0}),   // Flat junction band left (stop)
+        std::make_pair(1023, dBr_u{-20.0}),   // Inner band left for first segment (start)
+        std::make_pair(1035, dBr_u{-1.538}),  // Inner band left for first segment (stop)
+        std::make_pair(1036, dBr_u{0.0}),     // allocated band left for first segment (start)
+        std::make_pair(1533, dBr_u{0.0}),     // allocated band left for first segment (stop)
+        std::make_pair(1534, dBr_u{-20.0}),   // DC band for first segment (start)
+        std::make_pair(1538, dBr_u{-20.0}),   // DC band for first segment (stop)
+        std::make_pair(1539, dBr_u{0.0}),     // allocated band right for first segment (start)
+        std::make_pair(2036, dBr_u{0.0}),     // allocated band right for first segment (stop)
+        std::make_pair(2037, dBr_u{-1.538}),  // Inner band right for first segment (start)
+        std::make_pair(2049, dBr_u{-20.0}),   // Inner band right for first segment (stop)
+        std::make_pair(2050, dBr_u{-20.0}),   // Flat junction band right for first segment (start)
+        std::make_pair(2054, dBr_u{-20.0}),   // Flat junction band right for first segment (stop)
+        std::make_pair(2055, dBr_u{-20.01}),  // start linear sum region left (no interpolation
+                                              // possible, so provide 2 times the same point)
+        std::make_pair(2055, dBr_u{-20.01}),  // start linear sum region left (no interpolation
+                                              // possible, so provide 2 times the same point)
+        std::make_pair(2559, dBr_u{-24.99}),  // stop linear sum region left (no interpolation
+                                              // possible, so provide 2 times the same point)
+        std::make_pair(2559, dBr_u{-24.99}),  // stop linear sum region left (no interpolation
+                                              // possible, so provide 2 times the same point)
+        std::make_pair(2560, dBr_u{-25.0}),  // middle linear sum region (no interpolation possible,
+                                             // so provide 2 times the same point)
+        std::make_pair(2560, dBr_u{-25.0}),  // middle linear sum region (no interpolation possible,
+                                             // so provide 2 times the same point)
+        std::make_pair(2561, dBr_u{-24.99}), // start linear sum region right (no interpolation
+                                             // possible, so provide 2 times the same point)
+        std::make_pair(2561, dBr_u{-24.99}), // start linear sum region right (no interpolation
+                                             // possible, so provide 2 times the same point)
+        std::make_pair(3065, dBr_u{-20.01}), // stop linear sum region right (no interpolation
+                                             // possible, so provide 2 times the same point)
+        std::make_pair(3065, dBr_u{-20.01}), // stop linear sum region right (no interpolation
+                                             // possible, so provide 2 times the same point)
+        std::make_pair(3066, dBr_u{-20.0}),  // Flat junction band left (start)
+        std::make_pair(3070, dBr_u{-20.0}),  // Flat junction band left (stop)
+        std::make_pair(3071, dBr_u{-20.0}),  // Inner band left for second segment (start)
+        std::make_pair(3083, dBr_u{-1.538}), // Inner band left for second segment (stop)
+        std::make_pair(3084, dBr_u{0.0}),    // allocated band left for second segment (start)
+        std::make_pair(3581, dBr_u{0.0}),    // allocated band left for second segment (stop)
+        std::make_pair(3582, dBr_u{-20.0}),  // DC band for second segment (start)
+        std::make_pair(3586, dBr_u{-20.0}),  // DC band for second segment (stop)
+        std::make_pair(3587, dBr_u{0.0}),    // allocated band right for second segment (start)
+        std::make_pair(4084, dBr_u{0.0}),    // allocated band right for second segment (stop)
+        std::make_pair(4085, dBr_u{-1.538}), // Inner band right for second segment (start)
+        std::make_pair(4097, dBr_u{-20.0}),  // Inner band right for second segment (stop)
+        std::make_pair(4098, dBr_u{-20.0}),  // Flat junction band right (start)
+        std::make_pair(4102, dBr_u{-20.0}),  // Flat junction band right (stop)
+        std::make_pair(4103, dBr_u{-20.016}), // Middle band right (start)
+        std::make_pair(4608, dBr_u{-28.000}), // Middle band right (stop)
+        std::make_pair(4609, dBr_u{-28.023}), // Outer band right (start)
+        std::make_pair(5120, dBr_u{-40.0}),   // Outer band right (stop)
     };
 
     AddTestCase(new WifiOfdmMaskSlopesTestCase("11ax_5GHz 80+80MHz",
                                                WIFI_STANDARD_80211ax,
                                                WIFI_PHY_BAND_5GHZ,
-                                               160,
-                                               {5530, 5690},
+                                               MHz_u{160},
+                                               {MHz_u{5530}, MHz_u{5690}},
                                                maskSlopes,
                                                tol,
                                                prec),
@@ -1064,69 +1065,69 @@
     NS_LOG_FUNCTION("Check slopes for 11ax 80+80MHz @ 5GHz with larger frequency separation "
                     "between the two PSDs");
     maskSlopes = {
-        std::make_pair(0, -40.0),      // Outer band left (start)
-        std::make_pair(511, -28.023),  // Outer band left (stop)
-        std::make_pair(512, -28.000),  // Middle band left (start)
-        std::make_pair(1017, -20.016), // Middle band left (stop)
-        std::make_pair(1018, -20.0),   // Flat junction band left (start)
-        std::make_pair(1022, -20.0),   // Flat junction band left (stop)
-        std::make_pair(1023, -20.0),   // Inner band left for first segment (start)
-        std::make_pair(1035, -1.538),  // Inner band left for first segment (stop)
-        std::make_pair(1036, 0.0),     // allocated band left for first segment (start)
-        std::make_pair(1533, 0.0),     // allocated band left for first segment (stop)
-        std::make_pair(1534, -20.0),   // DC band for first segment (start)
-        std::make_pair(1538, -20.0),   // DC band for first segment (stop)
-        std::make_pair(1539, 0.0),     // allocated band right for first segment (start)
-        std::make_pair(2036, 0.0),     // allocated band right for first segment (stop)
-        std::make_pair(2037, -1.538),  // Inner band right for first segment (start)
-        std::make_pair(2049, -20.0),   // Inner band right for first segment (stop)
-        std::make_pair(2050, -20.0),   // Flat junction band right for first segment (start)
-        std::make_pair(2054, -20.0),   // Flat junction band right for first segment (stop)
-        std::make_pair(2055, -20.01), // start linear sum region left (no interpolation possible, so
-                                      // provide 2 times the same point)
-        std::make_pair(2055, -20.01), // start linear sum region left (no interpolation possible, so
-                                      // provide 2 times the same point)
-        std::make_pair(3583, -24.99), // stop linear sum region left (no interpolation possible, so
-                                      // provide 2 times the same point)
-        std::make_pair(3583, -24.99), // stop linear sum region left (no interpolation possible, so
-                                      // provide 2 times the same point)
-        std::make_pair(3584, -25.0),  // middle linear sum region (no interpolation possible, so
-                                      // provide 2 times the same point)
-        std::make_pair(3584, -25.0),  // middle linear sum region (no interpolation possible, so
-                                      // provide 2 times the same point)
-        std::make_pair(3585, -24.99), // start linear sum region right (no interpolation possible,
-                                      // so provide 2 times the same point)
-        std::make_pair(3585, -24.99), // start linear sum region right (no interpolation possible,
-                                      // so provide 2 times the same point)
-        std::make_pair(5113, -20.01), // stop linear sum region right (no interpolation possible, so
-                                      // provide 2 times the same point)
-        std::make_pair(5113, -20.01), // stop linear sum region right (no interpolation possible, so
-                                      // provide 2 times the same point)
-        std::make_pair(5114, -20.0),  // Flat junction band left (start)
-        std::make_pair(5118, -20.0),  // Flat junction band left (stop)
-        std::make_pair(5119, -20.0),  // Inner band left for second segment (start)
-        std::make_pair(5131, -1.538), // Inner band left for second segment (stop)
-        std::make_pair(5132, 0.0),    // allocated band left for second segment (start)
-        std::make_pair(5629, 0.0),    // allocated band left for second segment (stop)
-        std::make_pair(5630, -20.0),  // DC band for second segment (start)
-        std::make_pair(5634, -20.0),  // DC band for second segment (stop)
-        std::make_pair(5635, 0.0),    // allocated band right for second segment (start)
-        std::make_pair(6132, 0.0),    // allocated band right for second segment (stop)
-        std::make_pair(6133, -1.538), // Inner band right for second segment (start)
-        std::make_pair(6145, -20.0),  // Inner band right for second segment (stop)
-        std::make_pair(6146, -20.0),  // Flat junction band right (start)
-        std::make_pair(6150, -20.0),  // Flat junction band right (stop)
-        std::make_pair(6151, -20.016), // Middle band right (start)
-        std::make_pair(6656, -28.000), // Middle band right (stop)
-        std::make_pair(6657, -28.023), // Outer band right (start)
-        std::make_pair(7168, -40.0),   // Outer band right (stop)
+        std::make_pair(0, dBr_u{-40.0}),      // Outer band left (start)
+        std::make_pair(511, dBr_u{-28.023}),  // Outer band left (stop)
+        std::make_pair(512, dBr_u{-28.000}),  // Middle band left (start)
+        std::make_pair(1017, dBr_u{-20.016}), // Middle band left (stop)
+        std::make_pair(1018, dBr_u{-20.0}),   // Flat junction band left (start)
+        std::make_pair(1022, dBr_u{-20.0}),   // Flat junction band left (stop)
+        std::make_pair(1023, dBr_u{-20.0}),   // Inner band left for first segment (start)
+        std::make_pair(1035, dBr_u{-1.538}),  // Inner band left for first segment (stop)
+        std::make_pair(1036, dBr_u{0.0}),     // allocated band left for first segment (start)
+        std::make_pair(1533, dBr_u{0.0}),     // allocated band left for first segment (stop)
+        std::make_pair(1534, dBr_u{-20.0}),   // DC band for first segment (start)
+        std::make_pair(1538, dBr_u{-20.0}),   // DC band for first segment (stop)
+        std::make_pair(1539, dBr_u{0.0}),     // allocated band right for first segment (start)
+        std::make_pair(2036, dBr_u{0.0}),     // allocated band right for first segment (stop)
+        std::make_pair(2037, dBr_u{-1.538}),  // Inner band right for first segment (start)
+        std::make_pair(2049, dBr_u{-20.0}),   // Inner band right for first segment (stop)
+        std::make_pair(2050, dBr_u{-20.0}),   // Flat junction band right for first segment (start)
+        std::make_pair(2054, dBr_u{-20.0}),   // Flat junction band right for first segment (stop)
+        std::make_pair(2055, dBr_u{-20.01}),  // start linear sum region left (no interpolation
+                                              // possible, so provide 2 times the same point)
+        std::make_pair(2055, dBr_u{-20.01}),  // start linear sum region left (no interpolation
+                                              // possible, so provide 2 times the same point)
+        std::make_pair(3583, dBr_u{-24.99}),  // stop linear sum region left (no interpolation
+                                              // possible, so provide 2 times the same point)
+        std::make_pair(3583, dBr_u{-24.99}),  // stop linear sum region left (no interpolation
+                                              // possible, so provide 2 times the same point)
+        std::make_pair(3584, dBr_u{-25.0}),  // middle linear sum region (no interpolation possible,
+                                             // so provide 2 times the same point)
+        std::make_pair(3584, dBr_u{-25.0}),  // middle linear sum region (no interpolation possible,
+                                             // so provide 2 times the same point)
+        std::make_pair(3585, dBr_u{-24.99}), // start linear sum region right (no interpolation
+                                             // possible, so provide 2 times the same point)
+        std::make_pair(3585, dBr_u{-24.99}), // start linear sum region right (no interpolation
+                                             // possible, so provide 2 times the same point)
+        std::make_pair(5113, dBr_u{-20.01}), // stop linear sum region right (no interpolation
+                                             // possible, so provide 2 times the same point)
+        std::make_pair(5113, dBr_u{-20.01}), // stop linear sum region right (no interpolation
+                                             // possible, so provide 2 times the same point)
+        std::make_pair(5114, dBr_u{-20.0}),  // Flat junction band left (start)
+        std::make_pair(5118, dBr_u{-20.0}),  // Flat junction band left (stop)
+        std::make_pair(5119, dBr_u{-20.0}),  // Inner band left for second segment (start)
+        std::make_pair(5131, dBr_u{-1.538}), // Inner band left for second segment (stop)
+        std::make_pair(5132, dBr_u{0.0}),    // allocated band left for second segment (start)
+        std::make_pair(5629, dBr_u{0.0}),    // allocated band left for second segment (stop)
+        std::make_pair(5630, dBr_u{-20.0}),  // DC band for second segment (start)
+        std::make_pair(5634, dBr_u{-20.0}),  // DC band for second segment (stop)
+        std::make_pair(5635, dBr_u{0.0}),    // allocated band right for second segment (start)
+        std::make_pair(6132, dBr_u{0.0}),    // allocated band right for second segment (stop)
+        std::make_pair(6133, dBr_u{-1.538}), // Inner band right for second segment (start)
+        std::make_pair(6145, dBr_u{-20.0}),  // Inner band right for second segment (stop)
+        std::make_pair(6146, dBr_u{-20.0}),  // Flat junction band right (start)
+        std::make_pair(6150, dBr_u{-20.0}),  // Flat junction band right (stop)
+        std::make_pair(6151, dBr_u{-20.016}), // Middle band right (start)
+        std::make_pair(6656, dBr_u{-28.000}), // Middle band right (stop)
+        std::make_pair(6657, dBr_u{-28.023}), // Outer band right (start)
+        std::make_pair(7168, dBr_u{-40.0}),   // Outer band right (stop)
     };
 
     AddTestCase(new WifiOfdmMaskSlopesTestCase("11ax_5GHz 80+80MHz large separation",
                                                WIFI_STANDARD_80211ax,
                                                WIFI_PHY_BAND_5GHZ,
-                                               160,
-                                               {5210, 5530},
+                                               MHz_u{160},
+                                               {MHz_u{5210}, MHz_u{5530}},
                                                maskSlopes,
                                                tol,
                                                prec),
@@ -1136,37 +1137,37 @@
     // 11ax 80MHz @ 5GHz - first 20 MHz subchannel punctured
     NS_LOG_FUNCTION("Check slopes for 11ax 80MHz @ 5GHz with first 20 MHz subchannel punctured");
     maskSlopes = {
-        std::make_pair(0, -40.0),      // Outer band left (start)
-        std::make_pair(511, -28.023),  // Outer band left (stop)
-        std::make_pair(512, -28.000),  // Middle band left (start)
-        std::make_pair(1017, -20.016), // Middle band left (stop)
-        std::make_pair(1018, -20.0),   // Flat junction band left (start)
-        std::make_pair(1022, -20.0),   // Flat junction band left (stop)
-        std::make_pair(1023, -20.0),   // punctured band (start)
-        std::make_pair(1272, -20.0),   // punctured band (stop)
-        std::make_pair(1273, -20.0),   // punctured band increasing slope (start)
-        std::make_pair(1279, 0.0),     // punctured band increasing slope (stop)
-        std::make_pair(1280, 0.0),     // allocated band left (start)
-        std::make_pair(1533, 0.0),     // allocated band left (stop)
-        std::make_pair(1534, -20.0),   // DC band (start)
-        std::make_pair(1538, -20.0),   // DC band (stop)
-        std::make_pair(1539, 0.0),     // allocated band right (start)
-        std::make_pair(2036, 0.0),     // allocated band right (stop)
-        std::make_pair(2037, -1.538),  // Inner band right (start)
-        std::make_pair(2049, -20.0),   // Inner band right (stop)
-        std::make_pair(2050, -20.0),   // Flat junction band right (start)
-        std::make_pair(2054, -20.0),   // Flat junction band right (stop)
-        std::make_pair(2055, -20.016), // Middle band right (start)
-        std::make_pair(2560, -28.000), // Middle band right (stop)
-        std::make_pair(2561, -28.023), // Outer band right (start)
-        std::make_pair(3072, -40.0),   // Outer band right (stop)
+        std::make_pair(0, dBr_u{-40.0}),      // Outer band left (start)
+        std::make_pair(511, dBr_u{-28.023}),  // Outer band left (stop)
+        std::make_pair(512, dBr_u{-28.000}),  // Middle band left (start)
+        std::make_pair(1017, dBr_u{-20.016}), // Middle band left (stop)
+        std::make_pair(1018, dBr_u{-20.0}),   // Flat junction band left (start)
+        std::make_pair(1022, dBr_u{-20.0}),   // Flat junction band left (stop)
+        std::make_pair(1023, dBr_u{-20.0}),   // punctured band (start)
+        std::make_pair(1272, dBr_u{-20.0}),   // punctured band (stop)
+        std::make_pair(1273, dBr_u{-20.0}),   // punctured band increasing slope (start)
+        std::make_pair(1279, dBr_u{0.0}),     // punctured band increasing slope (stop)
+        std::make_pair(1280, dBr_u{0.0}),     // allocated band left (start)
+        std::make_pair(1533, dBr_u{0.0}),     // allocated band left (stop)
+        std::make_pair(1534, dBr_u{-20.0}),   // DC band (start)
+        std::make_pair(1538, dBr_u{-20.0}),   // DC band (stop)
+        std::make_pair(1539, dBr_u{0.0}),     // allocated band right (start)
+        std::make_pair(2036, dBr_u{0.0}),     // allocated band right (stop)
+        std::make_pair(2037, dBr_u{-1.538}),  // Inner band right (start)
+        std::make_pair(2049, dBr_u{-20.0}),   // Inner band right (stop)
+        std::make_pair(2050, dBr_u{-20.0}),   // Flat junction band right (start)
+        std::make_pair(2054, dBr_u{-20.0}),   // Flat junction band right (stop)
+        std::make_pair(2055, dBr_u{-20.016}), // Middle band right (start)
+        std::make_pair(2560, dBr_u{-28.000}), // Middle band right (stop)
+        std::make_pair(2561, dBr_u{-28.023}), // Outer band right (start)
+        std::make_pair(3072, dBr_u{-40.0}),   // Outer band right (stop)
     };
 
     AddTestCase(new WifiOfdmMaskSlopesTestCase("11ax_5GHz 80MHz first subchannel punctured",
                                                WIFI_STANDARD_80211ax,
                                                WIFI_PHY_BAND_5GHZ,
-                                               80,
-                                               {5210},
+                                               MHz_u{80},
+                                               {MHz_u{5210}},
                                                maskSlopes,
                                                tol,
                                                prec,
@@ -1177,41 +1178,41 @@
     // 11ax 80MHz @ 5GHz - second 20 MHz subchannel punctured
     NS_LOG_FUNCTION("Check slopes for 11ax 80MHz @ 5GHz with second 20 MHz subchannel punctured");
     maskSlopes = {
-        std::make_pair(0, -40.0),      // Outer band left (start)
-        std::make_pair(511, -28.023),  // Outer band left (stop)
-        std::make_pair(512, -28.000),  // Middle band left (start)
-        std::make_pair(1017, -20.016), // Middle band left (stop)
-        std::make_pair(1018, -20.0),   // Flat junction band left (start)
-        std::make_pair(1022, -20.0),   // Flat junction band left (stop)
-        std::make_pair(1023, -20.0),   // Inner band left (start)
-        std::make_pair(1035, -1.538),  // Inner band left (stop)
-        std::make_pair(1036, 0.0),     // allocated band left (start)
-        std::make_pair(1279, 0.0),     // allocated band left (stop)
-        std::make_pair(1280, 0.0),     // punctured band decreasing slope (start)
-        std::make_pair(1286, -20.0),   // punctured band decreasing slope (stop)
-        std::make_pair(1287, -20.0),   // punctured band (start)
-        std::make_pair(1528, -20.0),   // punctured band (stop)
-        std::make_pair(1529, -20.0),   // punctured band increasing slope (start)
-        std::make_pair(1533, -6.667),  // punctured band increasing slope (stop)
-        std::make_pair(1534, -20.0),   // DC band (start)
-        std::make_pair(1538, -20.0),   // DC band (stop)
-        std::make_pair(1539, 0.0),     // allocated band right (start)
-        std::make_pair(2036, 0.0),     // allocated band right (stop)
-        std::make_pair(2037, -1.538),  // Inner band right (start)
-        std::make_pair(2049, -20.0),   // Inner band right (stop)
-        std::make_pair(2050, -20.0),   // Flat junction band right (start)
-        std::make_pair(2054, -20.0),   // Flat junction band right (stop)
-        std::make_pair(2055, -20.016), // Middle band right (start)
-        std::make_pair(2560, -28.000), // Middle band right (stop)
-        std::make_pair(2561, -28.023), // Outer band right (start)
-        std::make_pair(3072, -40.0),   // Outer band right (stop)
+        std::make_pair(0, dBr_u{-40.0}),      // Outer band left (start)
+        std::make_pair(511, dBr_u{-28.023}),  // Outer band left (stop)
+        std::make_pair(512, dBr_u{-28.000}),  // Middle band left (start)
+        std::make_pair(1017, dBr_u{-20.016}), // Middle band left (stop)
+        std::make_pair(1018, dBr_u{-20.0}),   // Flat junction band left (start)
+        std::make_pair(1022, dBr_u{-20.0}),   // Flat junction band left (stop)
+        std::make_pair(1023, dBr_u{-20.0}),   // Inner band left (start)
+        std::make_pair(1035, dBr_u{-1.538}),  // Inner band left (stop)
+        std::make_pair(1036, dBr_u{0.0}),     // allocated band left (start)
+        std::make_pair(1279, dBr_u{0.0}),     // allocated band left (stop)
+        std::make_pair(1280, dBr_u{0.0}),     // punctured band decreasing slope (start)
+        std::make_pair(1286, dBr_u{-20.0}),   // punctured band decreasing slope (stop)
+        std::make_pair(1287, dBr_u{-20.0}),   // punctured band (start)
+        std::make_pair(1528, dBr_u{-20.0}),   // punctured band (stop)
+        std::make_pair(1529, dBr_u{-20.0}),   // punctured band increasing slope (start)
+        std::make_pair(1533, dBr_u{-6.667}),  // punctured band increasing slope (stop)
+        std::make_pair(1534, dBr_u{-20.0}),   // DC band (start)
+        std::make_pair(1538, dBr_u{-20.0}),   // DC band (stop)
+        std::make_pair(1539, dBr_u{0.0}),     // allocated band right (start)
+        std::make_pair(2036, dBr_u{0.0}),     // allocated band right (stop)
+        std::make_pair(2037, dBr_u{-1.538}),  // Inner band right (start)
+        std::make_pair(2049, dBr_u{-20.0}),   // Inner band right (stop)
+        std::make_pair(2050, dBr_u{-20.0}),   // Flat junction band right (start)
+        std::make_pair(2054, dBr_u{-20.0}),   // Flat junction band right (stop)
+        std::make_pair(2055, dBr_u{-20.016}), // Middle band right (start)
+        std::make_pair(2560, dBr_u{-28.000}), // Middle band right (stop)
+        std::make_pair(2561, dBr_u{-28.023}), // Outer band right (start)
+        std::make_pair(3072, dBr_u{-40.0}),   // Outer band right (stop)
     };
 
     AddTestCase(new WifiOfdmMaskSlopesTestCase("11ax_5GHz 80MHz second subchannel punctured",
                                                WIFI_STANDARD_80211ax,
                                                WIFI_PHY_BAND_5GHZ,
-                                               80,
-                                               {5210},
+                                               MHz_u{80},
+                                               {MHz_u{5210}},
                                                maskSlopes,
                                                tol,
                                                prec,
@@ -1222,41 +1223,41 @@
     // 11ax 80MHz @ 5GHz - third 20 MHz subchannel punctured
     NS_LOG_FUNCTION("Check slopes for 11ax 80MHz @ 5GHz with third 20 MHz subchannel punctured");
     maskSlopes = {
-        std::make_pair(0, -40.0),      // Outer band left (start)
-        std::make_pair(511, -28.023),  // Outer band left (stop)
-        std::make_pair(512, -28.000),  // Middle band left (start)
-        std::make_pair(1017, -20.016), // Middle band left (stop)
-        std::make_pair(1018, -20.0),   // Flat junction band left (start)
-        std::make_pair(1022, -20.0),   // Flat junction band left (stop)
-        std::make_pair(1023, -20.0),   // Inner band left (start)
-        std::make_pair(1035, -1.538),  // Inner band left (stop)
-        std::make_pair(1036, 0.0),     // allocated band left (start)
-        std::make_pair(1533, 0.0),     // allocated band left (stop)
-        std::make_pair(1534, -20.0),   // DC band (start)
-        std::make_pair(1535, -20.0),   // DC band (stop)
-        std::make_pair(1539, -10.0),   // punctured band decreasing slope (start)
-        std::make_pair(1542, -20.0),   // punctured band decreasing slope (stop)
-        std::make_pair(1543, -20.0),   // punctured band (start)
-        std::make_pair(1784, -20.0),   // punctured band (stop)
-        std::make_pair(1785, -20.0),   // punctured band increasing slope (start)
-        std::make_pair(1791, 0.0),     // punctured band increasing slope (stop)
-        std::make_pair(1792, 0.0),     // allocated band right (start)
-        std::make_pair(2036, 0.0),     // allocated band right (stop)
-        std::make_pair(2037, -1.538),  // Inner band right (start)
-        std::make_pair(2049, -20.0),   // Inner band right (stop)
-        std::make_pair(2050, -20.0),   // Flat junction band right (start)
-        std::make_pair(2054, -20.0),   // Flat junction band right (stop)
-        std::make_pair(2055, -20.016), // Middle band right (start)
-        std::make_pair(2560, -28.000), // Middle band right (stop)
-        std::make_pair(2561, -28.023), // Outer band right (start)
-        std::make_pair(3072, -40.0),   // Outer band right (stop)
+        std::make_pair(0, dBr_u{-40.0}),      // Outer band left (start)
+        std::make_pair(511, dBr_u{-28.023}),  // Outer band left (stop)
+        std::make_pair(512, dBr_u{-28.000}),  // Middle band left (start)
+        std::make_pair(1017, dBr_u{-20.016}), // Middle band left (stop)
+        std::make_pair(1018, dBr_u{-20.0}),   // Flat junction band left (start)
+        std::make_pair(1022, dBr_u{-20.0}),   // Flat junction band left (stop)
+        std::make_pair(1023, dBr_u{-20.0}),   // Inner band left (start)
+        std::make_pair(1035, dBr_u{-1.538}),  // Inner band left (stop)
+        std::make_pair(1036, dBr_u{0.0}),     // allocated band left (start)
+        std::make_pair(1533, dBr_u{0.0}),     // allocated band left (stop)
+        std::make_pair(1534, dBr_u{-20.0}),   // DC band (start)
+        std::make_pair(1535, dBr_u{-20.0}),   // DC band (stop)
+        std::make_pair(1539, dBr_u{-10.0}),   // punctured band decreasing slope (start)
+        std::make_pair(1542, dBr_u{-20.0}),   // punctured band decreasing slope (stop)
+        std::make_pair(1543, dBr_u{-20.0}),   // punctured band (start)
+        std::make_pair(1784, dBr_u{-20.0}),   // punctured band (stop)
+        std::make_pair(1785, dBr_u{-20.0}),   // punctured band increasing slope (start)
+        std::make_pair(1791, dBr_u{0.0}),     // punctured band increasing slope (stop)
+        std::make_pair(1792, dBr_u{0.0}),     // allocated band right (start)
+        std::make_pair(2036, dBr_u{0.0}),     // allocated band right (stop)
+        std::make_pair(2037, dBr_u{-1.538}),  // Inner band right (start)
+        std::make_pair(2049, dBr_u{-20.0}),   // Inner band right (stop)
+        std::make_pair(2050, dBr_u{-20.0}),   // Flat junction band right (start)
+        std::make_pair(2054, dBr_u{-20.0}),   // Flat junction band right (stop)
+        std::make_pair(2055, dBr_u{-20.016}), // Middle band right (start)
+        std::make_pair(2560, dBr_u{-28.000}), // Middle band right (stop)
+        std::make_pair(2561, dBr_u{-28.023}), // Outer band right (start)
+        std::make_pair(3072, dBr_u{-40.0}),   // Outer band right (stop)
     };
 
     AddTestCase(new WifiOfdmMaskSlopesTestCase("11ax_5GHz 80MHz third subchannel punctured",
                                                WIFI_STANDARD_80211ax,
                                                WIFI_PHY_BAND_5GHZ,
-                                               80,
-                                               {5210},
+                                               MHz_u{80},
+                                               {MHz_u{5210}},
                                                maskSlopes,
                                                tol,
                                                prec,
@@ -1267,37 +1268,37 @@
     // 11ax 80MHz @ 5GHz - last 20 MHz subchannel punctured
     NS_LOG_FUNCTION("Check slopes for 11ax 80MHz @ 5GHz with last 20 MHz subchannel punctured");
     maskSlopes = {
-        std::make_pair(0, -40.0),      // Outer band left (start)
-        std::make_pair(511, -28.023),  // Outer band left (stop)
-        std::make_pair(512, -28.000),  // Middle band left (start)
-        std::make_pair(1017, -20.016), // Middle band left (stop)
-        std::make_pair(1018, -20.0),   // Flat junction band left (start)
-        std::make_pair(1022, -20.0),   // Flat junction band left (stop)
-        std::make_pair(1023, -20.0),   // Inner band left (start)
-        std::make_pair(1035, -1.538),  // Inner band left (stop)
-        std::make_pair(1036, 0.0),     // allocated band left (start)
-        std::make_pair(1533, 0.0),     // allocated band left (stop)
-        std::make_pair(1534, -20.0),   // DC band (start)
-        std::make_pair(1538, -20.0),   // DC band (stop)
-        std::make_pair(1539, 0.0),     // allocated band right (start)
-        std::make_pair(1791, 0.0),     // allocated band right (stop)
-        std::make_pair(1792, 0.0),     // punctured band decreasing slope (start)
-        std::make_pair(1798, -20.0),   // punctured band decreasing slope (stop)
-        std::make_pair(1799, -20.0),   // punctured band (start)
-        std::make_pair(2049, -20.0),   // punctured band (stop)
-        std::make_pair(2050, -20.0),   // Flat junction band right (start)
-        std::make_pair(2054, -20.0),   // Flat junction band right (stop)
-        std::make_pair(2055, -20.016), // Middle band right (start)
-        std::make_pair(2560, -28.000), // Middle band right (stop)
-        std::make_pair(2561, -28.023), // Outer band right (start)
-        std::make_pair(3072, -40.0),   // Outer band right (stop)
+        std::make_pair(0, dBr_u{-40.0}),      // Outer band left (start)
+        std::make_pair(511, dBr_u{-28.023}),  // Outer band left (stop)
+        std::make_pair(512, dBr_u{-28.000}),  // Middle band left (start)
+        std::make_pair(1017, dBr_u{-20.016}), // Middle band left (stop)
+        std::make_pair(1018, dBr_u{-20.0}),   // Flat junction band left (start)
+        std::make_pair(1022, dBr_u{-20.0}),   // Flat junction band left (stop)
+        std::make_pair(1023, dBr_u{-20.0}),   // Inner band left (start)
+        std::make_pair(1035, dBr_u{-1.538}),  // Inner band left (stop)
+        std::make_pair(1036, dBr_u{0.0}),     // allocated band left (start)
+        std::make_pair(1533, dBr_u{0.0}),     // allocated band left (stop)
+        std::make_pair(1534, dBr_u{-20.0}),   // DC band (start)
+        std::make_pair(1538, dBr_u{-20.0}),   // DC band (stop)
+        std::make_pair(1539, dBr_u{0.0}),     // allocated band right (start)
+        std::make_pair(1791, dBr_u{0.0}),     // allocated band right (stop)
+        std::make_pair(1792, dBr_u{0.0}),     // punctured band decreasing slope (start)
+        std::make_pair(1798, dBr_u{-20.0}),   // punctured band decreasing slope (stop)
+        std::make_pair(1799, dBr_u{-20.0}),   // punctured band (start)
+        std::make_pair(2049, dBr_u{-20.0}),   // punctured band (stop)
+        std::make_pair(2050, dBr_u{-20.0}),   // Flat junction band right (start)
+        std::make_pair(2054, dBr_u{-20.0}),   // Flat junction band right (stop)
+        std::make_pair(2055, dBr_u{-20.016}), // Middle band right (start)
+        std::make_pair(2560, dBr_u{-28.000}), // Middle band right (stop)
+        std::make_pair(2561, dBr_u{-28.023}), // Outer band right (start)
+        std::make_pair(3072, dBr_u{-40.0}),   // Outer band right (stop)
     };
 
     AddTestCase(new WifiOfdmMaskSlopesTestCase("11ax_5GHz 80MHz last subchannel punctured",
                                                WIFI_STANDARD_80211ax,
                                                WIFI_PHY_BAND_5GHZ,
-                                               80,
-                                               {5210},
+                                               MHz_u{80},
+                                               {MHz_u{5210}},
                                                maskSlopes,
                                                tol,
                                                prec,
@@ -1309,44 +1310,44 @@
     NS_LOG_FUNCTION(
         "Check slopes for 11ax 160MHz @ 5GHz with two first 20 MHz subchannels punctured");
     maskSlopes = {
-        std::make_pair(0, -40.0),       // Outer band left (start)
-        std::make_pair(1023, -28.012),  // Outer band left (stop)
-        std::make_pair(1024, -28.000),  // Middle band left (start)
-        std::make_pair(2041, -20.008),  // Middle band left (stop)
-        std::make_pair(2042, -20.0),    // Flat junction band left (start)
-        std::make_pair(2046, -20.0),    // Flat junction band left (stop)
-        std::make_pair(2047, -20.0),    // punctured band (start)
-        std::make_pair(2552, -20.0),    // punctured band (stop)
-        std::make_pair(2553, -20.0),    // punctured band increasing slope (start)
-        std::make_pair(2557, -6.66667), // punctured band increasing slope (stop)
-        std::make_pair(2558, -20.0),    // first 80 MHz DC band (start)
-        std::make_pair(2562, -20.0),    // first 80 MHz DC band (stop)
-        std::make_pair(2563, 0.0),      // first 80 MHz allocated band right (start)
-        std::make_pair(3060, 0.0),      // first 80 MHz allocated band right (stop)
-        std::make_pair(3061, -20.0),    // gap between 80 MHz bands (start)
-        std::make_pair(3083, -20.0),    // gap between 80 MHz bands (start)
-        std::make_pair(3084, 0.0),      // second 80 MHz allocated band left (start)
-        std::make_pair(3581, 0.0),      // second 80 MHz allocated band left (stop)
-        std::make_pair(3582, -20.0),    // second 80 MHz DC band (start)
-        std::make_pair(3586, -20.0),    // second 80 MHz DC band (stop)
-        std::make_pair(3587, 0.0),      // second 80 MHz allocated band right (start)
-        std::make_pair(4084, 0.0),      // second 80 MHz allocated band right (stop)
-        std::make_pair(4085, -1.538),   // Inner band right (start)
-        std::make_pair(4097, -20.0),    // Inner band right (stop)
-        std::make_pair(4098, -20.0),    // Flat junction band right (start)
-        std::make_pair(4102, -20.0),    // Flat junction band right (stop)
-        std::make_pair(4103, -20.008),  // Middle band right (start)
-        std::make_pair(5120, -28.000),  // Middle band right (stop)
-        std::make_pair(5121, -28.012),  // Outer band right (start)
-        std::make_pair(6144, -40.0),    // Outer band right (stop)
+        std::make_pair(0, dBr_u{-40.0}),       // Outer band left (start)
+        std::make_pair(1023, dBr_u{-28.012}),  // Outer band left (stop)
+        std::make_pair(1024, dBr_u{-28.000}),  // Middle band left (start)
+        std::make_pair(2041, dBr_u{-20.008}),  // Middle band left (stop)
+        std::make_pair(2042, dBr_u{-20.0}),    // Flat junction band left (start)
+        std::make_pair(2046, dBr_u{-20.0}),    // Flat junction band left (stop)
+        std::make_pair(2047, dBr_u{-20.0}),    // punctured band (start)
+        std::make_pair(2552, dBr_u{-20.0}),    // punctured band (stop)
+        std::make_pair(2553, dBr_u{-20.0}),    // punctured band increasing slope (start)
+        std::make_pair(2557, dBr_u{-6.66667}), // punctured band increasing slope (stop)
+        std::make_pair(2558, dBr_u{-20.0}),    // first 80 MHz DC band (start)
+        std::make_pair(2562, dBr_u{-20.0}),    // first 80 MHz DC band (stop)
+        std::make_pair(2563, dBr_u{0.0}),      // first 80 MHz allocated band right (start)
+        std::make_pair(3060, dBr_u{0.0}),      // first 80 MHz allocated band right (stop)
+        std::make_pair(3061, dBr_u{-20.0}),    // gap between 80 MHz bands (start)
+        std::make_pair(3083, dBr_u{-20.0}),    // gap between 80 MHz bands (start)
+        std::make_pair(3084, dBr_u{0.0}),      // second 80 MHz allocated band left (start)
+        std::make_pair(3581, dBr_u{0.0}),      // second 80 MHz allocated band left (stop)
+        std::make_pair(3582, dBr_u{-20.0}),    // second 80 MHz DC band (start)
+        std::make_pair(3586, dBr_u{-20.0}),    // second 80 MHz DC band (stop)
+        std::make_pair(3587, dBr_u{0.0}),      // second 80 MHz allocated band right (start)
+        std::make_pair(4084, dBr_u{0.0}),      // second 80 MHz allocated band right (stop)
+        std::make_pair(4085, dBr_u{-1.538}),   // Inner band right (start)
+        std::make_pair(4097, dBr_u{-20.0}),    // Inner band right (stop)
+        std::make_pair(4098, dBr_u{-20.0}),    // Flat junction band right (start)
+        std::make_pair(4102, dBr_u{-20.0}),    // Flat junction band right (stop)
+        std::make_pair(4103, dBr_u{-20.008}),  // Middle band right (start)
+        std::make_pair(5120, dBr_u{-28.000}),  // Middle band right (stop)
+        std::make_pair(5121, dBr_u{-28.012}),  // Outer band right (start)
+        std::make_pair(6144, dBr_u{-40.0}),    // Outer band right (stop)
     };
 
     AddTestCase(
         new WifiOfdmMaskSlopesTestCase("11ax_5GHz 160MHz first subchannels punctured",
                                        WIFI_STANDARD_80211ax,
                                        WIFI_PHY_BAND_5GHZ,
-                                       160,
-                                       {5250},
+                                       MHz_u{160},
+                                       {MHz_u{5250}},
                                        maskSlopes,
                                        tol,
                                        prec,
@@ -1358,46 +1359,46 @@
     NS_LOG_FUNCTION(
         "Check slopes for 11ax 160MHz @ 5GHz with third and fourth 20 MHz subchannels punctured");
     maskSlopes = {
-        std::make_pair(0, -40.0),      // Outer band left (start)
-        std::make_pair(1023, -28.012), // Outer band left (stop)
-        std::make_pair(1024, -28.000), // Middle band left (start)
-        std::make_pair(2041, -20.008), // Middle band left (stop)
-        std::make_pair(2042, -20.0),   // Flat junction band left (start)
-        std::make_pair(2046, -20.0),   // Flat junction band left (stop)
-        std::make_pair(2047, -20.0),   // Inner band left (start)
-        std::make_pair(2059, -1.538),  // Inner band left (stop)
-        std::make_pair(2060, 0.0),     // first 80 MHz allocated band left (start)
-        std::make_pair(2557, 0.0),     // first 80 MHz allocated band left (stop)
-        std::make_pair(2558, -20.0),   // first 80 MHz DC band (start)
-        std::make_pair(2562, -20.0),   // first 80 MHz DC band (stop)
-        std::make_pair(2563, -10.0),   // punctured band decreasing slope (start)
-        std::make_pair(2566, -20.0),   // punctured band decreasing slope (stop)
-        std::make_pair(2567, -20.0),   // punctured band (start)
-        std::make_pair(3060, -20.0),   // punctured band (stop)
-        std::make_pair(3061, -20.0),   // gap between 80 MHz bands (start)
-        std::make_pair(3083, -20.0),   // gap between 80 MHz bands (start)
-        std::make_pair(3084, 0.0),     // second 80 MHz allocated band left (start)
-        std::make_pair(3581, 0.0),     // second 80 MHz allocated band left (stop)
-        std::make_pair(3582, -20.0),   // second 80 MHz DC band (start)
-        std::make_pair(3586, -20.0),   // second 80 MHz DC band (stop)
-        std::make_pair(3587, 0.0),     // second 80 MHz allocated band right (start)
-        std::make_pair(4084, 0.0),     // second 80 MHz allocated band right (stop)
-        std::make_pair(4085, -1.538),  // Inner band right (start)
-        std::make_pair(4097, -20.0),   // Inner band right (stop)
-        std::make_pair(4098, -20.0),   // Flat junction band right (start)
-        std::make_pair(4102, -20.0),   // Flat junction band right (stop)
-        std::make_pair(4103, -20.008), // Middle band right (start)
-        std::make_pair(5120, -28.000), // Middle band right (stop)
-        std::make_pair(5121, -28.012), // Outer band right (start)
-        std::make_pair(6144, -40.0),   // Outer band right (stop)
+        std::make_pair(0, dBr_u{-40.0}),      // Outer band left (start)
+        std::make_pair(1023, dBr_u{-28.012}), // Outer band left (stop)
+        std::make_pair(1024, dBr_u{-28.000}), // Middle band left (start)
+        std::make_pair(2041, dBr_u{-20.008}), // Middle band left (stop)
+        std::make_pair(2042, dBr_u{-20.0}),   // Flat junction band left (start)
+        std::make_pair(2046, dBr_u{-20.0}),   // Flat junction band left (stop)
+        std::make_pair(2047, dBr_u{-20.0}),   // Inner band left (start)
+        std::make_pair(2059, dBr_u{-1.538}),  // Inner band left (stop)
+        std::make_pair(2060, dBr_u{0.0}),     // first 80 MHz allocated band left (start)
+        std::make_pair(2557, dBr_u{0.0}),     // first 80 MHz allocated band left (stop)
+        std::make_pair(2558, dBr_u{-20.0}),   // first 80 MHz DC band (start)
+        std::make_pair(2562, dBr_u{-20.0}),   // first 80 MHz DC band (stop)
+        std::make_pair(2563, dBr_u{-10.0}),   // punctured band decreasing slope (start)
+        std::make_pair(2566, dBr_u{-20.0}),   // punctured band decreasing slope (stop)
+        std::make_pair(2567, dBr_u{-20.0}),   // punctured band (start)
+        std::make_pair(3060, dBr_u{-20.0}),   // punctured band (stop)
+        std::make_pair(3061, dBr_u{-20.0}),   // gap between 80 MHz bands (start)
+        std::make_pair(3083, dBr_u{-20.0}),   // gap between 80 MHz bands (start)
+        std::make_pair(3084, dBr_u{0.0}),     // second 80 MHz allocated band left (start)
+        std::make_pair(3581, dBr_u{0.0}),     // second 80 MHz allocated band left (stop)
+        std::make_pair(3582, dBr_u{-20.0}),   // second 80 MHz DC band (start)
+        std::make_pair(3586, dBr_u{-20.0}),   // second 80 MHz DC band (stop)
+        std::make_pair(3587, dBr_u{0.0}),     // second 80 MHz allocated band right (start)
+        std::make_pair(4084, dBr_u{0.0}),     // second 80 MHz allocated band right (stop)
+        std::make_pair(4085, dBr_u{-1.538}),  // Inner band right (start)
+        std::make_pair(4097, dBr_u{-20.0}),   // Inner band right (stop)
+        std::make_pair(4098, dBr_u{-20.0}),   // Flat junction band right (start)
+        std::make_pair(4102, dBr_u{-20.0}),   // Flat junction band right (stop)
+        std::make_pair(4103, dBr_u{-20.008}), // Middle band right (start)
+        std::make_pair(5120, dBr_u{-28.000}), // Middle band right (stop)
+        std::make_pair(5121, dBr_u{-28.012}), // Outer band right (start)
+        std::make_pair(6144, dBr_u{-40.0}),   // Outer band right (stop)
     };
 
     AddTestCase(
         new WifiOfdmMaskSlopesTestCase("11ax_5GHz 160MHz third and fourth subchannels punctured",
                                        WIFI_STANDARD_80211ax,
                                        WIFI_PHY_BAND_5GHZ,
-                                       160,
-                                       {5250},
+                                       MHz_u{160},
+                                       {MHz_u{5250}},
                                        maskSlopes,
                                        tol,
                                        prec,
@@ -1409,46 +1410,46 @@
     NS_LOG_FUNCTION(
         "Check slopes for 11ax 160MHz @ 5GHz with fifth and sixth 20 MHz subchannels punctured");
     maskSlopes = {
-        std::make_pair(0, -40.0),      // Outer band left (start)
-        std::make_pair(1023, -28.012), // Outer band left (stop)
-        std::make_pair(1024, -28.000), // Middle band left (start)
-        std::make_pair(2041, -20.008), // Middle band left (stop)
-        std::make_pair(2042, -20.0),   // Flat junction band left (start)
-        std::make_pair(2046, -20.0),   // Flat junction band left (stop)
-        std::make_pair(2047, -20.0),   // Inner band left (start)
-        std::make_pair(2059, -1.538),  // Inner band left (stop)
-        std::make_pair(2060, 0.0),     // first 80 MHz allocated band left (start)
-        std::make_pair(2557, 0.0),     // first 80 MHz allocated band left (stop)
-        std::make_pair(2558, -20.0),   // first 80 MHz DC band (start)
-        std::make_pair(2562, -20.0),   // first 80 MHz DC band (stop)
-        std::make_pair(2563, 0.0),     // first 80 MHz allocated band right (start)
-        std::make_pair(3060, 0.0),     // first 80 MHz allocated band right (stop)
-        std::make_pair(3061, -20.0),   // gap between 80 MHz bands (start)
-        std::make_pair(3083, -20.0),   // gap between 80 MHz bands (start)
-        std::make_pair(3084, -20.0),   // punctured band (start)
-        std::make_pair(3576, -20.0),   // punctured band (stop)
-        std::make_pair(3577, -20.0),   // punctured band increasing slope (start)
-        std::make_pair(3581, -6.667),  // punctured band increasing slope (stop)
-        std::make_pair(3582, -20.0),   // second 80 MHz DC band (start)
-        std::make_pair(3586, -20.0),   // second 80 MHz DC band (stop)
-        std::make_pair(3587, 0.0),     // second 80 MHz allocated band right (start)
-        std::make_pair(4084, 0.0),     // second 80 MHz allocated band right (stop)
-        std::make_pair(4085, -1.538),  // Inner band right (start)
-        std::make_pair(4097, -20.0),   // Inner band right (stop)
-        std::make_pair(4098, -20.0),   // Flat junction band right (start)
-        std::make_pair(4102, -20.0),   // Flat junction band right (stop)
-        std::make_pair(4103, -20.008), // Middle band right (start)
-        std::make_pair(5120, -28.000), // Middle band right (stop)
-        std::make_pair(5121, -28.012), // Outer band right (start)
-        std::make_pair(6144, -40.0),   // Outer band right (stop)
+        std::make_pair(0, dBr_u{-40.0}),      // Outer band left (start)
+        std::make_pair(1023, dBr_u{-28.012}), // Outer band left (stop)
+        std::make_pair(1024, dBr_u{-28.000}), // Middle band left (start)
+        std::make_pair(2041, dBr_u{-20.008}), // Middle band left (stop)
+        std::make_pair(2042, dBr_u{-20.0}),   // Flat junction band left (start)
+        std::make_pair(2046, dBr_u{-20.0}),   // Flat junction band left (stop)
+        std::make_pair(2047, dBr_u{-20.0}),   // Inner band left (start)
+        std::make_pair(2059, dBr_u{-1.538}),  // Inner band left (stop)
+        std::make_pair(2060, dBr_u{0.0}),     // first 80 MHz allocated band left (start)
+        std::make_pair(2557, dBr_u{0.0}),     // first 80 MHz allocated band left (stop)
+        std::make_pair(2558, dBr_u{-20.0}),   // first 80 MHz DC band (start)
+        std::make_pair(2562, dBr_u{-20.0}),   // first 80 MHz DC band (stop)
+        std::make_pair(2563, dBr_u{0.0}),     // first 80 MHz allocated band right (start)
+        std::make_pair(3060, dBr_u{0.0}),     // first 80 MHz allocated band right (stop)
+        std::make_pair(3061, dBr_u{-20.0}),   // gap between 80 MHz bands (start)
+        std::make_pair(3083, dBr_u{-20.0}),   // gap between 80 MHz bands (start)
+        std::make_pair(3084, dBr_u{-20.0}),   // punctured band (start)
+        std::make_pair(3576, dBr_u{-20.0}),   // punctured band (stop)
+        std::make_pair(3577, dBr_u{-20.0}),   // punctured band increasing slope (start)
+        std::make_pair(3581, dBr_u{-6.667}),  // punctured band increasing slope (stop)
+        std::make_pair(3582, dBr_u{-20.0}),   // second 80 MHz DC band (start)
+        std::make_pair(3586, dBr_u{-20.0}),   // second 80 MHz DC band (stop)
+        std::make_pair(3587, dBr_u{0.0}),     // second 80 MHz allocated band right (start)
+        std::make_pair(4084, dBr_u{0.0}),     // second 80 MHz allocated band right (stop)
+        std::make_pair(4085, dBr_u{-1.538}),  // Inner band right (start)
+        std::make_pair(4097, dBr_u{-20.0}),   // Inner band right (stop)
+        std::make_pair(4098, dBr_u{-20.0}),   // Flat junction band right (start)
+        std::make_pair(4102, dBr_u{-20.0}),   // Flat junction band right (stop)
+        std::make_pair(4103, dBr_u{-20.008}), // Middle band right (start)
+        std::make_pair(5120, dBr_u{-28.000}), // Middle band right (stop)
+        std::make_pair(5121, dBr_u{-28.012}), // Outer band right (start)
+        std::make_pair(6144, dBr_u{-40.0}),   // Outer band right (stop)
     };
 
     AddTestCase(
         new WifiOfdmMaskSlopesTestCase("11ax_5GHz 160MHz fifth and sixth subchannels punctured",
                                        WIFI_STANDARD_80211ax,
                                        WIFI_PHY_BAND_5GHZ,
-                                       160,
-                                       {5250},
+                                       MHz_u{160},
+                                       {MHz_u{5250}},
                                        maskSlopes,
                                        tol,
                                        prec,
@@ -1460,44 +1461,44 @@
     NS_LOG_FUNCTION(
         "Check slopes for 11ax 160MHz @ 5GHz with two last 20 MHz subchannels punctured");
     maskSlopes = {
-        std::make_pair(0, -40.0),      // Outer band left (start)
-        std::make_pair(1023, -28.012), // Outer band left (stop)
-        std::make_pair(1024, -28.000), // Middle band left (start)
-        std::make_pair(2041, -20.008), // Middle band left (stop)
-        std::make_pair(2042, -20.0),   // Flat junction band left (start)
-        std::make_pair(2046, -20.0),   // Flat junction band left (stop)
-        std::make_pair(2047, -20.0),   // Inner band left (start)
-        std::make_pair(2059, -1.538),  // Inner band left (stop)
-        std::make_pair(2060, 0.0),     // first 80 MHz allocated band left (start)
-        std::make_pair(2557, 0.0),     // first 80 MHz allocated band left (stop)
-        std::make_pair(2558, -20.0),   // first 80 MHz DC band (start)
-        std::make_pair(2562, -20.0),   // first 80 MHz DC band (stop)
-        std::make_pair(2563, 0.0),     // first 80 MHz allocated band right (start)
-        std::make_pair(3060, 0.0),     // first 80 MHz allocated band right (stop)
-        std::make_pair(3061, -20.0),   // gap between 80 MHz bands (start)
-        std::make_pair(3083, -20.0),   // gap between 80 MHz bands (start)
-        std::make_pair(3084, 0.0),     // second 80 MHz allocated band left (start)
-        std::make_pair(3581, 0.0),     // second 80 MHz allocated band left (stop)
-        std::make_pair(3582, -20.0),   // second 80 MHz DC band (start)
-        std::make_pair(3586, -20.0),   // second 80 MHz DC band (stop)
-        std::make_pair(3587, -10.0),   // punctured band decreasing slope (start)
-        std::make_pair(3590, -20.0),   // punctured band decreasing slope (stop)
-        std::make_pair(3591, -20.0),   // punctured band (start)
-        std::make_pair(4097, -20.0),   // punctured band (stop)
-        std::make_pair(4098, -20.0),   // Flat junction band right (start)
-        std::make_pair(4102, -20.0),   // Flat junction band right (stop)
-        std::make_pair(4103, -20.008), // Middle band right (start)
-        std::make_pair(5120, -28.000), // Middle band right (stop)
-        std::make_pair(5121, -28.012), // Outer band right (start)
-        std::make_pair(6144, -40.0),   // Outer band right (stop)
+        std::make_pair(0, dBr_u{-40.0}),      // Outer band left (start)
+        std::make_pair(1023, dBr_u{-28.012}), // Outer band left (stop)
+        std::make_pair(1024, dBr_u{-28.000}), // Middle band left (start)
+        std::make_pair(2041, dBr_u{-20.008}), // Middle band left (stop)
+        std::make_pair(2042, dBr_u{-20.0}),   // Flat junction band left (start)
+        std::make_pair(2046, dBr_u{-20.0}),   // Flat junction band left (stop)
+        std::make_pair(2047, dBr_u{-20.0}),   // Inner band left (start)
+        std::make_pair(2059, dBr_u{-1.538}),  // Inner band left (stop)
+        std::make_pair(2060, dBr_u{0.0}),     // first 80 MHz allocated band left (start)
+        std::make_pair(2557, dBr_u{0.0}),     // first 80 MHz allocated band left (stop)
+        std::make_pair(2558, dBr_u{-20.0}),   // first 80 MHz DC band (start)
+        std::make_pair(2562, dBr_u{-20.0}),   // first 80 MHz DC band (stop)
+        std::make_pair(2563, dBr_u{0.0}),     // first 80 MHz allocated band right (start)
+        std::make_pair(3060, dBr_u{0.0}),     // first 80 MHz allocated band right (stop)
+        std::make_pair(3061, dBr_u{-20.0}),   // gap between 80 MHz bands (start)
+        std::make_pair(3083, dBr_u{-20.0}),   // gap between 80 MHz bands (start)
+        std::make_pair(3084, dBr_u{0.0}),     // second 80 MHz allocated band left (start)
+        std::make_pair(3581, dBr_u{0.0}),     // second 80 MHz allocated band left (stop)
+        std::make_pair(3582, dBr_u{-20.0}),   // second 80 MHz DC band (start)
+        std::make_pair(3586, dBr_u{-20.0}),   // second 80 MHz DC band (stop)
+        std::make_pair(3587, dBr_u{-10.0}),   // punctured band decreasing slope (start)
+        std::make_pair(3590, dBr_u{-20.0}),   // punctured band decreasing slope (stop)
+        std::make_pair(3591, dBr_u{-20.0}),   // punctured band (start)
+        std::make_pair(4097, dBr_u{-20.0}),   // punctured band (stop)
+        std::make_pair(4098, dBr_u{-20.0}),   // Flat junction band right (start)
+        std::make_pair(4102, dBr_u{-20.0}),   // Flat junction band right (stop)
+        std::make_pair(4103, dBr_u{-20.008}), // Middle band right (start)
+        std::make_pair(5120, dBr_u{-28.000}), // Middle band right (stop)
+        std::make_pair(5121, dBr_u{-28.012}), // Outer band right (start)
+        std::make_pair(6144, dBr_u{-40.0}),   // Outer band right (stop)
     };
 
     AddTestCase(
         new WifiOfdmMaskSlopesTestCase("11ax_5GHz 160MHz last subchannels punctured",
                                        WIFI_STANDARD_80211ax,
                                        WIFI_PHY_BAND_5GHZ,
-                                       160,
-                                       {5250},
+                                       MHz_u{160},
+                                       {MHz_u{5250}},
                                        maskSlopes,
                                        tol,
                                        prec,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/test/wifi-txop-test.cc ns-3.44/src/wifi/test/wifi-txop-test.cc
--- ns-3.43/src/wifi/test/wifi-txop-test.cc	2024-10-09 16:41:10.140657000 -0700
+++ ns-3.44/src/wifi/test/wifi-txop-test.cc	2025-03-09 16:55:49.815372700 -0700
@@ -13,6 +13,7 @@
 #include "ns3/log.h"
 #include "ns3/mobility-helper.h"
 #include "ns3/multi-model-spectrum-channel.h"
+#include "ns3/node-list.h"
 #include "ns3/packet-socket-client.h"
 #include "ns3/packet-socket-helper.h"
 #include "ns3/packet-socket-server.h"
@@ -34,10 +35,10 @@
 NS_LOG_COMPONENT_DEFINE("WifiTxopTest");
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief Test TXOP rules
+ * @brief Test TXOP rules
  *
  * A BSS consisting of an AP and 3 non-AP STAs is considered in this test. Both non-HT (802.11a)
  * and HE devices are tested. Two TXOPs are simulated in this test:
@@ -47,7 +48,10 @@
  *   received, while the second frame to STA 2 is corrupted. It is checked that the AP performs
  *   PIFS recovery or invokes backoff depending on the value of the PifsRecovery attribute. All
  *   QoS data frames transmitted have a length/duration that does not exceed the length/duration
- *   based RTS/CTS threshold, hence RTS/CTS is never used.
+ *   based RTS/CTS threshold, hence RTS/CTS is never used. After that a QoS data frame has been
+ *   sent to every STA, the AP sends another QoS data frame to one of them; the size/duration of
+ *   this frame exceeds the threshold, but, given that the STA has already sent a response to the
+ *   AP in this TXOP, RTS/CTS is only used if the ProtectedIfResponded is false.
  * - In the second TXOP, the AP sends a QoS data frame, in case of non-HT devices, or an A-MPDU
  *   consisting of 2 MPDUs, in case of HE devices, to each of the three STAs. All PSDUs transmitted
  *   have a length/duration that exceeds the length/duration based RTS/CTS threshold, hence RTS/CTS
@@ -65,32 +69,36 @@
         bool singleRtsPerTxop; //!< whether protection mechanism is used no more than once per TXOP
         bool lengthBasedRtsCtsThresh; //!< if true, use length based RTS/CTS threshold; if false,
                                       //!< use TX duration based RTS/CTS threshold
+        bool protectedIfResponded; //!< whether a station is assumed to be protected if replied to
+                                   //!< a frame requiring acknowledgment
     };
 
     /**
      * Constructor
-     * \param params parameters for the Wi-Fi TXOP test
+     * @param params parameters for the Wi-Fi TXOP test
      */
     WifiTxopTest(const Params& params);
 
     /**
      * Function to trace packets received by the server application
-     * \param context the context
-     * \param p the packet
-     * \param addr the address
+     * @param context the context
+     * @param p the packet
+     * @param addr the address
      */
     void L7Receive(std::string context, Ptr<const Packet> p, const Address& addr);
+
     /**
      * Callback invoked when PHY receives a PSDU to transmit
-     * \param context the context
-     * \param psduMap the PSDU map
-     * \param txVector the TX vector
-     * \param txPowerW the tx power in Watts
+     * @param context the context
+     * @param psduMap the PSDU map
+     * @param txVector the TX vector
+     * @param txPowerW the tx power in Watts
      */
     void Transmit(std::string context,
                   WifiConstPsduMap psduMap,
                   WifiTxVector txVector,
                   double txPowerW);
+
     /**
      * Check correctness of transmitted frames
      */
@@ -99,6 +107,26 @@
   private:
     void DoRun() override;
 
+    /// Enumeration for traffic directions
+    enum TrafficDirection : uint8_t
+    {
+        DOWNLINK = 0,
+        UPLINK
+    };
+
+    /**
+     * @param dir the traffic direction (downlink/uplink)
+     * @param staId the index (starting at 0) of the non-AP STA generating/receiving packets
+     * @param count the number of packets to generate
+     * @param pktSize the size of the packets to generate
+     * @return an application generating the given number packets of the given size from/to the
+     *         AP to/from the given non-AP STA
+     */
+    Ptr<PacketSocketClient> GetApplication(TrafficDirection dir,
+                                           std::size_t staId,
+                                           std::size_t count,
+                                           std::size_t pktSize) const;
+
     /// Information about transmitted frames
     struct FrameInfo
     {
@@ -127,10 +155,13 @@
     bool m_pifsRecovery;                 ///< whether to use PIFS recovery
     bool m_singleRtsPerTxop;             ///< whether to use single RTS per TXOP
     bool m_lengthBasedRtsCtsThresh;      ///< whether to use length based RTS/CTS threshold
+    bool m_protectedIfResponded;         ///< whether a STA is protected if it responds to the AP
     Ptr<ListErrorModel> m_apErrorModel;  ///< error model to install on the AP
     Ptr<ListErrorModel> m_staErrorModel; ///< error model to install on a STA
     bool m_apCorrupted;  ///< whether the frame to be corrupted by the AP has been corrupted
     bool m_staCorrupted; ///< whether the frame to be corrupted by the STA has been corrupted
+    std::vector<PacketSocketAddress> m_dlSockets; ///< packet socket address for DL traffic
+    std::vector<PacketSocketAddress> m_ulSockets; ///< packet socket address for UL traffic
 };
 
 WifiTxopTest::WifiTxopTest(const Params& params)
@@ -150,6 +181,7 @@
       m_pifsRecovery(params.pifsRecovery),
       m_singleRtsPerTxop(params.singleRtsPerTxop),
       m_lengthBasedRtsCtsThresh(params.lengthBasedRtsCtsThresh),
+      m_protectedIfResponded(params.protectedIfResponded),
       m_apErrorModel(CreateObject<ListErrorModel>()),
       m_staErrorModel(CreateObject<ListErrorModel>()),
       m_apCorrupted(false),
@@ -204,6 +236,18 @@
         }
     }
 
+    // When the AP sends the first frame to the third station (which is not protected by RTS/CTS),
+    // we generate another frame addressed to the second station whose size/duration exceeds the
+    // threshold; however, RTS is not used because the second station has already responded to
+    // another frame in the same TXOP
+    if (const auto& hdr = psduMap.begin()->second->GetHeader(0);
+        hdr.IsQosData() && hdr.GetAddr1() == m_staDevices.Get(2)->GetAddress() &&
+        hdr.GetSequenceNumber() == (m_nonHt ? 0 : 1))
+    {
+        m_apDevices.Get(0)->GetNode()->AddApplication(
+            GetApplication(DOWNLINK, 1, m_nonHt ? 1 : 2, m_payloadSizeRtsOn));
+    }
+
     // Log all transmitted frames that are not beacon frames and have been transmitted
     // after the start time (so as to skip association requests/responses)
     if (!psduMap.begin()->second->GetHeader(0).IsBeacon() && Simulator::Now() >= m_startTime)
@@ -260,8 +304,10 @@
     {
         Config::SetDefault("ns3::WifiRemoteStationManager::RtsCtsTxDurationThresh",
                            TimeValue(Seconds(m_payloadSizeRtsOn * (m_nonHt ? 1 : 2) * 8.0 /
-                                             m_mode.GetDataRate(20))));
+                                             m_mode.GetDataRate(MHz_u{20}))));
     }
+    Config::SetDefault("ns3::FrameExchangeManager::ProtectedIfResponded",
+                       BooleanValue(m_protectedIfResponded));
 
     WifiHelper wifi;
     wifi.SetStandard(m_nonHt ? WIFI_STANDARD_80211a : WIFI_STANDARD_80211ax);
@@ -339,53 +385,60 @@
     packetSocket.Install(wifiApNode);
     packetSocket.Install(wifiStaNodes);
 
+    // install a packet socket server on all nodes
+    for (auto nodeIt = NodeList::Begin(); nodeIt != NodeList::End(); ++nodeIt)
+    {
+        PacketSocketAddress srvAddr;
+        auto device = DynamicCast<WifiNetDevice>((*nodeIt)->GetDevice(0));
+        NS_TEST_ASSERT_MSG_NE(device, nullptr, "Expected a WifiNetDevice");
+        srvAddr.SetSingleDevice(device->GetIfIndex());
+        srvAddr.SetProtocol(1);
+
+        auto server = CreateObject<PacketSocketServer>();
+        server->SetLocal(srvAddr);
+        (*nodeIt)->AddApplication(server);
+        server->SetStartTime(Time{0}); // now
+        server->SetStopTime(Seconds(1));
+    }
+
+    // set DL and UL packet sockets
+    for (uint16_t i = 0; i < m_nStations; ++i)
+    {
+        m_dlSockets.emplace_back();
+        m_dlSockets.back().SetSingleDevice(m_apDevices.Get(0)->GetIfIndex());
+        m_dlSockets.back().SetPhysicalAddress(m_staDevices.Get(i)->GetAddress());
+        m_dlSockets.back().SetProtocol(1);
+
+        m_ulSockets.emplace_back();
+        m_ulSockets.back().SetSingleDevice(m_staDevices.Get(i)->GetIfIndex());
+        m_ulSockets.back().SetPhysicalAddress(m_apDevices.Get(0)->GetAddress());
+        m_ulSockets.back().SetProtocol(1);
+    }
+
     // DL frames
     for (uint16_t i = 0; i < m_nStations; i++)
     {
-        PacketSocketAddress socket;
-        socket.SetSingleDevice(m_apDevices.Get(0)->GetIfIndex());
-        socket.SetPhysicalAddress(m_staDevices.Get(i)->GetAddress());
-        socket.SetProtocol(1);
-
         if (!m_nonHt)
         {
             // Send one QoS data frame to establish Block Ack agreement (packet size is such that
             // this packet is not counted as a received packet)
-            auto client = CreateObject<PacketSocketClient>();
-            client->SetAttribute("PacketSize", UintegerValue(m_payloadSizeRtsOff - 1));
-            client->SetAttribute("MaxPackets", UintegerValue(1));
-            client->SetAttribute("Interval", TimeValue(MicroSeconds(1)));
-            client->SetRemote(socket);
-            wifiApNode.Get(0)->AddApplication(client);
-            client->SetStartTime(m_startTime - MilliSeconds(110 - i * 25));
-            client->SetStopTime(Seconds(1.0));
+            Simulator::Schedule(m_startTime - MilliSeconds(110 - i * 25),
+                                &Node::AddApplication,
+                                wifiApNode.Get(0),
+                                GetApplication(DOWNLINK, i, 1, m_payloadSizeRtsOff - 1));
         }
 
         // Send one QoS data frame (not protected by RTS/CTS) to each station
-        auto client1 = CreateObject<PacketSocketClient>();
-        client1->SetAttribute("PacketSize", UintegerValue(m_payloadSizeRtsOff));
-        client1->SetAttribute("MaxPackets", UintegerValue(1));
-        client1->SetAttribute("Interval", TimeValue(MicroSeconds(1)));
-        client1->SetRemote(socket);
-        wifiApNode.Get(0)->AddApplication(client1);
-        client1->SetStartTime(m_startTime);
-        client1->SetStopTime(Seconds(1.0));
+        Simulator::Schedule(m_startTime,
+                            &Node::AddApplication,
+                            wifiApNode.Get(0),
+                            GetApplication(DOWNLINK, i, 1, m_payloadSizeRtsOff));
 
         // Send one QoS data frame (protected by RTS/CTS) to each station
-        auto client2 = CreateObject<PacketSocketClient>();
-        client2->SetAttribute("PacketSize", UintegerValue(m_payloadSizeRtsOn));
-        client2->SetAttribute("MaxPackets", UintegerValue(m_nonHt ? 1 : 2));
-        client2->SetAttribute("Interval", TimeValue(Time{0}));
-        client2->SetRemote(socket);
-        wifiApNode.Get(0)->AddApplication(client2);
-        client2->SetStartTime(m_startTime + MilliSeconds(110));
-        client2->SetStopTime(Seconds(1.0));
-
-        auto server = CreateObject<PacketSocketServer>();
-        server->SetLocal(socket);
-        wifiStaNodes.Get(i)->AddApplication(server);
-        server->SetStartTime(Seconds(0.0));
-        server->SetStopTime(Seconds(1.0));
+        Simulator::Schedule(m_startTime + MilliSeconds(110),
+                            &Node::AddApplication,
+                            wifiApNode.Get(0),
+                            GetApplication(DOWNLINK, i, m_nonHt ? 1 : 2, m_payloadSizeRtsOn));
     }
 
     // install the error model on the AP
@@ -398,39 +451,20 @@
 
     // UL Traffic (the first station sends one frame to the AP)
     {
-        PacketSocketAddress socket;
-        socket.SetSingleDevice(m_staDevices.Get(0)->GetIfIndex());
-        socket.SetPhysicalAddress(m_apDevices.Get(0)->GetAddress());
-        socket.SetProtocol(1);
-
         if (!m_nonHt)
         {
             // Send one QoS data frame to establish Block Ack agreement (packet size is such that
             // this packet is not counted as a received packet)
-            auto client = CreateObject<PacketSocketClient>();
-            client->SetAttribute("PacketSize", UintegerValue(m_payloadSizeRtsOff - 1));
-            client->SetAttribute("MaxPackets", UintegerValue(1));
-            client->SetAttribute("Interval", TimeValue(MicroSeconds(0)));
-            client->SetRemote(socket);
-            wifiStaNodes.Get(0)->AddApplication(client);
-            client->SetStartTime(m_startTime - MilliSeconds(35));
-            client->SetStopTime(Seconds(1.0));
+            Simulator::Schedule(m_startTime - MilliSeconds(35),
+                                &Node::AddApplication,
+                                wifiStaNodes.Get(0),
+                                GetApplication(UPLINK, 0, 1, m_payloadSizeRtsOff - 1));
         }
 
-        auto client = CreateObject<PacketSocketClient>();
-        client->SetAttribute("PacketSize", UintegerValue(m_payloadSizeRtsOff));
-        client->SetAttribute("MaxPackets", UintegerValue(1));
-        client->SetAttribute("Interval", TimeValue(MicroSeconds(0)));
-        client->SetRemote(socket);
-        wifiStaNodes.Get(0)->AddApplication(client);
-        client->SetStartTime(m_startTime + MilliSeconds(2));
-        client->SetStopTime(Seconds(1.0));
-
-        auto server = CreateObject<PacketSocketServer>();
-        server->SetLocal(socket);
-        wifiApNode.Get(0)->AddApplication(server);
-        server->SetStartTime(Seconds(0.0));
-        server->SetStopTime(Seconds(1.0));
+        Simulator::Schedule(m_startTime + MilliSeconds(2),
+                            &Node::AddApplication,
+                            wifiStaNodes.Get(0),
+                            GetApplication(UPLINK, 0, 1, m_payloadSizeRtsOff));
     }
 
     Config::Connect("/NodeList/*/ApplicationList/*/$ns3::PacketSocketServer/Rx",
@@ -447,6 +481,23 @@
     Simulator::Destroy();
 }
 
+Ptr<PacketSocketClient>
+WifiTxopTest::GetApplication(TrafficDirection dir,
+                             std::size_t staId,
+                             std::size_t count,
+                             std::size_t pktSize) const
+{
+    auto client = CreateObject<PacketSocketClient>();
+    client->SetAttribute("PacketSize", UintegerValue(pktSize));
+    client->SetAttribute("MaxPackets", UintegerValue(count));
+    client->SetAttribute("Interval", TimeValue(MicroSeconds(0)));
+    client->SetRemote(dir == DOWNLINK ? m_dlSockets.at(staId) : m_ulSockets.at(staId));
+    client->SetStartTime(Time{0}); // now
+    client->SetStopTime(Seconds(1));
+
+    return client;
+}
+
 void
 WifiTxopTest::CheckResults()
 {
@@ -499,26 +550,32 @@
      * fails. Also, verify that a CF-end frame is sent if enough time remains in the TXOP.
      * The destination of failed frames is put in square brackets below.
      *
-     *          |--NAV----till end TXOP-------->|
-     *          |     |---NAV--till end TXOP--->|
-     *          |     |              |-------------------------NAV------------------------------>|
-     *          |     |              |     |------------------------NAV------------------------->|
-     *          |     |              |     |     |-----------------------NAV-------------------->|
-     *          |     |              |     |     |                  |-----------NAV------------->|
-     *     Start|     |         Start|     |     |                  |     |--------NAV---------->|
-     *     TXOP |     |         TXOP |     |     |   Ack            |     |     |------NAV------>|
-     *      |   |     |          |   |     |     | Timeout          |     |     |     |---NAV--->|
-     *      |---| |---|-backoff->|---| |---| |---|   |-PIFS or->|---| |---| |---| |---| |-----|
-     *      |QoS| |Ack|          |QoS| |Ack| |QoS|   |-backoff->|QoS| |Ack| |QoS| |Ack| |CFend|
-     * --------------------------------------------------------------------------------------------
-     * From:  AP   STA1            AP   STA1   AP                 AP   STA2   AP   STA3   AP
-     *   To: STA1  [AP]           STA1   AP  [STA2]              STA2   AP   STA3   AP    all
+     *        |--NAV----till end TXOP-------->|
+     *        |     |---NAV--till end TXOP--->|
+     *        |     |          |-----------------------------NAV--------------------------------->|
+     *        |     |          |     |----------------------------NAV---------------------------->|
+     *        |     |          |     |     |---------------------------NAV----------------------->|
+     *        |     |          |     |     |               |----------------NAV------------------>|
+     *        |     |          |     |     |               |     |-------------NAV--------------->|
+     *        |     |          |     |     |   Ack         |     |     |-----------NAV----------->|
+     *   Start|     |     Start|     |     | Timeout       |     |     |     |--------NAV-------->|
+     *   TXOP |     |     TXOP |     |     |   |-PIFS->    |     |     |     |     |-----NAV----->|
+     *    |   |     | back |   |     |     |   |- or ->    |     |     |     |     |     |--NAV-->|
+     *    ┌───┐ ┌───┐-off->┌───┐ ┌───┐ ┌───┐   |-back->┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌─────┐
+     *    │QoS│ │Ack│      │QoS│ │Ack│ │QoS│   |-off ->│QoS│ │Ack│ │QoS│ │Ack│ │QoS│ │Ack│ │CFend│
+     * ───┴───┴─┴───┴──────┴───┴─┴───┴─┴───┴───────────┴───┴─┴───┴─┴───┴─┴───┴─┴───┴─┴───┴─┴─────┴─
+     * TA:  AP   STA1        AP   STA1   AP              AP   STA2   AP   STA3   AP   STA2    AP
+     * RA: STA1  [AP]       STA1   AP  [STA2]           STA2   AP   STA3   AP   STA2   AP    all
+     *
+     * NOTE: If ProtectedIfResponded is false, the last QoS data frame is protected by RTS/CTS
      */
 
     // We expect 25 frames to be transmitted if SingleRtsPerTxop is false and 22 frames (2 RTS
-    // less, 2 CTS less, 1 more CF-End)
+    // less, 2 CTS less, 1 more CF-End). If ProtectedIfResponded is false, there are 2 frames
+    // (an RTS and a CTS) more.
     NS_TEST_ASSERT_MSG_EQ(m_txPsdus.size(),
-                          (m_singleRtsPerTxop ? 22 : 25),
+                          (m_singleRtsPerTxop ? 24 + (m_protectedIfResponded ? 0 : 2)
+                                              : 27 + (m_protectedIfResponded ? 0 : 2)),
                           "Unexpected number of transmitted frames");
 
     // the first frame sent after 400ms is a QoS data frame sent by the AP to STA1 without RTS/CTS
@@ -762,20 +819,123 @@
         RoundDurationId(m_txPsdus[7].header.GetDuration() - sifs - m_txPsdus[8].txDuration),
         "Duration/ID of the Ack must be derived from that of the previous frame");
 
+    // the AP sends another frame to STA2, which is only protected if ProtectedIfResponded is true,
+    // because its size/duration exceeds the threshold but STA2 has already responded to the AP in
+    // this TXOP
+    if (!m_protectedIfResponded)
+    {
+        tEnd = m_txPsdus[8].txStart + m_txPsdus[8].txDuration;
+        tStart = m_txPsdus[9].txStart;
+
+        NS_TEST_EXPECT_MSG_LT(tEnd + sifs, tStart, "RTS before fourth frame sent too early");
+        NS_TEST_EXPECT_MSG_LT(tStart,
+                              tEnd + sifs + tolerance,
+                              "RTS before fourth frame sent too late");
+        NS_TEST_EXPECT_MSG_EQ(m_txPsdus[9].header.IsRts(), true, "Expected an RTS frame");
+        NS_TEST_EXPECT_MSG_EQ(
+            m_txPsdus[9].header.GetAddr1(),
+            DynamicCast<WifiNetDevice>(m_staDevices.Get(1))->GetMac()->GetAddress(),
+            "Expected an RTS frame sent by the AP to the second station");
+        NS_TEST_EXPECT_MSG_EQ(
+            m_txPsdus[9].header.GetDuration(),
+            RoundDurationId(m_apTxopLimit - (m_txPsdus[9].txStart - txopStart) -
+                            m_txPsdus[9].txDuration),
+            "Duration/ID of the RTS before the fourth frame does not cover the remaining TXOP");
+
+        // a CTS is sent by STA2
+        tEnd = m_txPsdus[9].txStart + m_txPsdus[9].txDuration;
+        tStart = m_txPsdus[10].txStart;
+
+        NS_TEST_EXPECT_MSG_LT(tEnd + sifs,
+                              tStart,
+                              "CTS in response to RTS before the fourth frame sent too early");
+        NS_TEST_EXPECT_MSG_LT(tStart,
+                              tEnd + sifs + tolerance,
+                              "CTS in response to RTS before the fourth frame sent too late");
+        NS_TEST_EXPECT_MSG_EQ(m_txPsdus[10].header.IsCts(), true, "Expected a CTS");
+        NS_TEST_EXPECT_MSG_EQ(m_txPsdus[10].header.GetAddr1(),
+                              apDev->GetMac()->GetAddress(),
+                              "Expected a CTS frame sent to the AP");
+        NS_TEST_EXPECT_MSG_EQ(
+            m_txPsdus[10].header.GetDuration(),
+            RoundDurationId(m_txPsdus[9].header.GetDuration() - sifs - m_txPsdus[10].txDuration),
+            "Duration/ID of the CTS frame must be derived from that of the RTS frame");
+
+        // the AP sends another frame to STA2
+        tEnd = m_txPsdus[10].txStart + m_txPsdus[10].txDuration;
+        tStart = m_txPsdus[11].txStart;
+
+        // remove RTS and CTS so that indices are aligned with the ProtectedIfResponded true case
+        m_txPsdus.erase(std::next(m_txPsdus.cbegin(), 9), std::next(m_txPsdus.cbegin(), 11));
+    }
+    else
+    {
+        // the AP sends another frame to STA2
+        tEnd = m_txPsdus[8].txStart + m_txPsdus[8].txDuration;
+        tStart = m_txPsdus[9].txStart;
+    }
+
+    NS_TEST_EXPECT_MSG_LT(tEnd + sifs, tStart, "Fourth frame sent too early");
+    NS_TEST_EXPECT_MSG_LT(tStart, tEnd + sifs + tolerance, "Fourth frame sent too late");
+    NS_TEST_EXPECT_MSG_EQ(m_txPsdus[9].header.IsQosData(), true, "Expected a QoS data frame");
+    NS_TEST_EXPECT_MSG_EQ(m_txPsdus[9].header.GetAddr1(),
+                          DynamicCast<WifiNetDevice>(m_staDevices.Get(1))->GetMac()->GetAddress(),
+                          "Expected a frame sent by the AP to the second station");
+    if (m_lengthBasedRtsCtsThresh)
+    {
+        NS_TEST_EXPECT_MSG_GT(m_txPsdus[9].size,
+                              rtsCtsThreshold,
+                              "PSDU size expected to exceed length based RTS/CTS threshold");
+    }
+    else
+    {
+        NS_TEST_EXPECT_MSG_GT(m_txPsdus[9].txDuration,
+                              rtsCtsTxDurationThresh,
+                              "PSDU duration expected to exceed duration based RTS/CTS threshold");
+    }
+    NS_TEST_EXPECT_MSG_EQ(m_txPsdus[9].header.GetDuration(),
+                          RoundDurationId(m_apTxopLimit - (m_txPsdus[9].txStart - txopStart) -
+                                          m_txPsdus[9].txDuration),
+                          "Duration/ID of the fourth frame does not cover the remaining TXOP");
+
+    std::string ack(m_nonHt ? "Normal Ack" : "Block Ack");
+
+    // a Normal/Block Ack is then sent by STA1
+    tEnd = m_txPsdus[9].txStart + m_txPsdus[9].txDuration;
+    tStart = m_txPsdus[10].txStart;
+
+    NS_TEST_EXPECT_MSG_LT(tEnd + sifs,
+                          tStart,
+                          ack << " in response to the fourth QoS data frame sent too early");
+    NS_TEST_EXPECT_MSG_LT(tStart,
+                          tEnd + sifs + tolerance,
+                          ack << " in response to the fourth QoS data frame sent too late");
+    NS_TEST_EXPECT_MSG_EQ(
+        (m_nonHt ? m_txPsdus[10].header.IsAck() : m_txPsdus[10].header.IsBlockAck()),
+        true,
+        "Expected a " << ack);
+    NS_TEST_EXPECT_MSG_EQ(m_txPsdus[10].header.GetAddr1(),
+                          apDev->GetMac()->GetAddress(),
+                          "Expected a " << ack << " sent to the AP");
+    NS_TEST_EXPECT_MSG_EQ(
+        m_txPsdus[10].header.GetDuration(),
+        RoundDurationId(m_txPsdus[9].header.GetDuration() - sifs - m_txPsdus[10].txDuration),
+        "Duration/ID of the " << ack << " must be derived from that of the previous frame");
+
     // the TXOP limit is such that enough time for sending a CF-End frame remains
-    tEnd = m_txPsdus[8].txStart + m_txPsdus[8].txDuration;
-    tStart = m_txPsdus[9].txStart;
+    tEnd = m_txPsdus[10].txStart + m_txPsdus[10].txDuration;
+    tStart = m_txPsdus[11].txStart;
 
     NS_TEST_EXPECT_MSG_LT(tEnd + sifs, tStart, "CF-End sent too early");
     NS_TEST_EXPECT_MSG_LT(tStart, tEnd + sifs + tolerance, "CF-End sent too late");
-    NS_TEST_EXPECT_MSG_EQ(m_txPsdus[9].header.IsCfEnd(), true, "Expected a CF-End frame");
-    NS_TEST_EXPECT_MSG_EQ(m_txPsdus[9].header.GetDuration(),
+    NS_TEST_EXPECT_MSG_EQ(m_txPsdus[11].header.IsCfEnd(), true, "Expected a CF-End frame");
+    NS_TEST_EXPECT_MSG_EQ(m_txPsdus[11].header.GetDuration(),
                           Seconds(0),
                           "Duration/ID must be set to 0 for CF-End frames");
 
     // the CF-End frame resets the NAV on STA1, which can now transmit
-    tEnd = m_txPsdus[9].txStart + m_txPsdus[9].txDuration;
-    tStart = m_txPsdus[10].txStart;
+    tEnd = m_txPsdus[11].txStart + m_txPsdus[11].txDuration;
+    tStart = m_txPsdus[12].txStart;
 
     NS_TEST_EXPECT_MSG_GT_OR_EQ(tStart - tEnd,
                                 sifs + m_staAifsn * slot,
@@ -783,51 +943,51 @@
     NS_TEST_EXPECT_MSG_LT_OR_EQ(tStart - tEnd,
                                 sifs + m_staAifsn * slot + m_staCwMin * slot + tolerance,
                                 "More than AIFS+BO elapsed between two TXOPs");
-    NS_TEST_EXPECT_MSG_EQ(m_txPsdus[10].header.IsQosData(), true, "Expected a QoS data frame");
-    NS_TEST_EXPECT_MSG_EQ(m_txPsdus[10].header.GetAddr1(),
+    NS_TEST_EXPECT_MSG_EQ(m_txPsdus[12].header.IsQosData(), true, "Expected a QoS data frame");
+    NS_TEST_EXPECT_MSG_EQ(m_txPsdus[12].header.GetAddr1(),
                           apDev->GetMac()->GetAddress(),
                           "Expected a frame sent by the first station to the AP");
     if (m_lengthBasedRtsCtsThresh)
     {
-        NS_TEST_EXPECT_MSG_LT(m_txPsdus[10].size,
+        NS_TEST_EXPECT_MSG_LT(m_txPsdus[12].size,
                               rtsCtsThreshold,
                               "PSDU size expected not to exceed length based RTS/CTS threshold");
     }
     else
     {
         NS_TEST_EXPECT_MSG_LT(
-            m_txPsdus[10].txDuration,
+            m_txPsdus[12].txDuration,
             rtsCtsTxDurationThresh,
             "PSDU duration expected not to exceed duration based RTS/CTS threshold");
     }
     NS_TEST_EXPECT_MSG_EQ(
-        m_txPsdus[10].header.GetDuration(),
-        RoundDurationId(m_staTxopLimit - m_txPsdus[10].txDuration),
+        m_txPsdus[12].header.GetDuration(),
+        RoundDurationId(m_staTxopLimit - m_txPsdus[12].txDuration),
         "Duration/ID of the frame sent by the first station does not cover the remaining TXOP");
 
     // a Normal Ack is then sent by the AP
-    tEnd = m_txPsdus[10].txStart + m_txPsdus[10].txDuration;
-    tStart = m_txPsdus[11].txStart;
+    tEnd = m_txPsdus[12].txStart + m_txPsdus[12].txDuration;
+    tStart = m_txPsdus[13].txStart;
 
     NS_TEST_EXPECT_MSG_LT(tEnd + sifs, tStart, "Ack sent too early");
     NS_TEST_EXPECT_MSG_LT(tStart, tEnd + sifs + tolerance, "Ack sent too late");
-    NS_TEST_EXPECT_MSG_EQ(m_txPsdus[11].header.IsAck(), true, "Expected a Normal Ack");
-    NS_TEST_EXPECT_MSG_EQ(m_txPsdus[11].header.GetAddr1(),
+    NS_TEST_EXPECT_MSG_EQ(m_txPsdus[13].header.IsAck(), true, "Expected a Normal Ack");
+    NS_TEST_EXPECT_MSG_EQ(m_txPsdus[13].header.GetAddr1(),
                           DynamicCast<WifiNetDevice>(m_staDevices.Get(0))->GetMac()->GetAddress(),
                           "Expected a Normal Ack sent to the first station");
     NS_TEST_EXPECT_MSG_EQ(
-        m_txPsdus[11].header.GetDuration(),
-        RoundDurationId(m_txPsdus[10].header.GetDuration() - sifs - m_txPsdus[11].txDuration),
+        m_txPsdus[13].header.GetDuration(),
+        RoundDurationId(m_txPsdus[12].header.GetDuration() - sifs - m_txPsdus[13].txDuration),
         "Duration/ID of the Ack must be derived from that of the previous frame");
 
     // the TXOP limit is such that enough time for sending a CF-End frame remains
-    tEnd = m_txPsdus[11].txStart + m_txPsdus[11].txDuration;
-    tStart = m_txPsdus[12].txStart;
+    tEnd = m_txPsdus[13].txStart + m_txPsdus[13].txDuration;
+    tStart = m_txPsdus[14].txStart;
 
     NS_TEST_EXPECT_MSG_LT(tEnd + sifs, tStart, "CF-End sent too early");
     NS_TEST_EXPECT_MSG_LT(tStart, tEnd + sifs + tolerance, "CF-End sent too late");
-    NS_TEST_EXPECT_MSG_EQ(m_txPsdus[12].header.IsCfEnd(), true, "Expected a CF-End frame");
-    NS_TEST_EXPECT_MSG_EQ(m_txPsdus[12].header.GetDuration(),
+    NS_TEST_EXPECT_MSG_EQ(m_txPsdus[14].header.IsCfEnd(), true, "Expected a CF-End frame");
+    NS_TEST_EXPECT_MSG_EQ(m_txPsdus[14].header.GetDuration(),
                           Seconds(0),
                           "Duration/ID must be set to 0 for CF-End frames");
 
@@ -856,20 +1016,19 @@
      */
 
     // the first frame is an RTS frame sent by the AP to STA1
-    txopStart = m_txPsdus[13].txStart;
-    std::string ack(m_nonHt ? "Normal Ack" : "Block Ack");
+    txopStart = m_txPsdus[15].txStart;
 
-    NS_TEST_EXPECT_MSG_EQ(m_txPsdus[13].header.IsRts(), true, "Expected an RTS frame");
-    NS_TEST_EXPECT_MSG_EQ(m_txPsdus[13].header.GetAddr1(),
+    NS_TEST_EXPECT_MSG_EQ(m_txPsdus[15].header.IsRts(), true, "Expected an RTS frame");
+    NS_TEST_EXPECT_MSG_EQ(m_txPsdus[15].header.GetAddr1(),
                           DynamicCast<WifiNetDevice>(m_staDevices.Get(0))->GetMac()->GetAddress(),
                           "Expected an RTS frame sent by the AP to the first station");
-    NS_TEST_EXPECT_MSG_EQ(m_txPsdus[13].header.GetDuration(),
-                          RoundDurationId(m_apTxopLimit - m_txPsdus[13].txDuration),
+    NS_TEST_EXPECT_MSG_EQ(m_txPsdus[15].header.GetDuration(),
+                          RoundDurationId(m_apTxopLimit - m_txPsdus[15].txDuration),
                           "Duration/ID of the first RTS frame must cover the whole TXOP");
 
     // a CTS is sent by STA1
-    tEnd = m_txPsdus[13].txStart + m_txPsdus[13].txDuration;
-    tStart = m_txPsdus[14].txStart;
+    tEnd = m_txPsdus[15].txStart + m_txPsdus[15].txDuration;
+    tStart = m_txPsdus[16].txStart;
 
     NS_TEST_EXPECT_MSG_LT(tEnd + sifs,
                           tStart,
@@ -877,46 +1036,46 @@
     NS_TEST_EXPECT_MSG_LT(tStart,
                           tEnd + sifs + tolerance,
                           "CTS in response to the first RTS frame sent too late");
-    NS_TEST_EXPECT_MSG_EQ(m_txPsdus[14].header.IsCts(), true, "Expected a CTS");
-    NS_TEST_EXPECT_MSG_EQ(m_txPsdus[14].header.GetAddr1(),
+    NS_TEST_EXPECT_MSG_EQ(m_txPsdus[16].header.IsCts(), true, "Expected a CTS");
+    NS_TEST_EXPECT_MSG_EQ(m_txPsdus[16].header.GetAddr1(),
                           apDev->GetMac()->GetAddress(),
                           "Expected a CTS frame sent to the AP");
     NS_TEST_EXPECT_MSG_EQ(
-        m_txPsdus[14].header.GetDuration(),
-        RoundDurationId(m_txPsdus[13].header.GetDuration() - sifs - m_txPsdus[14].txDuration),
+        m_txPsdus[16].header.GetDuration(),
+        RoundDurationId(m_txPsdus[15].header.GetDuration() - sifs - m_txPsdus[16].txDuration),
         "Duration/ID of the CTS frame must be derived from that of the RTS frame");
 
     // the AP sends a frame to STA1
-    tEnd = m_txPsdus[14].txStart + m_txPsdus[14].txDuration;
-    tStart = m_txPsdus[15].txStart;
+    tEnd = m_txPsdus[16].txStart + m_txPsdus[16].txDuration;
+    tStart = m_txPsdus[17].txStart;
 
     NS_TEST_EXPECT_MSG_LT(tEnd + sifs, tStart, "First QoS data frame sent too early");
     NS_TEST_EXPECT_MSG_LT(tStart, tEnd + sifs + tolerance, "First QoS data frame sent too late");
-    NS_TEST_EXPECT_MSG_EQ(m_txPsdus[15].header.IsQosData(), true, "Expected a QoS data frame");
-    NS_TEST_EXPECT_MSG_EQ(m_txPsdus[15].header.GetAddr1(),
+    NS_TEST_EXPECT_MSG_EQ(m_txPsdus[17].header.IsQosData(), true, "Expected a QoS data frame");
+    NS_TEST_EXPECT_MSG_EQ(m_txPsdus[17].header.GetAddr1(),
                           DynamicCast<WifiNetDevice>(m_staDevices.Get(0))->GetMac()->GetAddress(),
                           "Expected a frame sent by the AP to the first station");
     if (m_lengthBasedRtsCtsThresh)
     {
-        NS_TEST_EXPECT_MSG_GT(m_txPsdus[15].size,
+        NS_TEST_EXPECT_MSG_GT(m_txPsdus[17].size,
                               rtsCtsThreshold,
                               "PSDU size expected to exceed length based RTS/CTS threshold");
     }
     else
     {
-        NS_TEST_EXPECT_MSG_GT(m_txPsdus[15].txDuration,
+        NS_TEST_EXPECT_MSG_GT(m_txPsdus[17].txDuration,
                               rtsCtsTxDurationThresh,
                               "PSDU duration expected to exceed duration based RTS/CTS threshold");
     }
     NS_TEST_EXPECT_MSG_EQ(
-        m_txPsdus[15].header.GetDuration(),
-        RoundDurationId(m_apTxopLimit - (m_txPsdus[15].txStart - txopStart) -
-                        m_txPsdus[15].txDuration),
+        m_txPsdus[17].header.GetDuration(),
+        RoundDurationId(m_apTxopLimit - (m_txPsdus[17].txStart - txopStart) -
+                        m_txPsdus[17].txDuration),
         "Duration/ID of the first QoS data frame does not cover the remaining TXOP");
 
     // a Normal/Block Ack is then sent by STA1
-    tEnd = m_txPsdus[15].txStart + m_txPsdus[15].txDuration;
-    tStart = m_txPsdus[16].txStart;
+    tEnd = m_txPsdus[17].txStart + m_txPsdus[17].txDuration;
+    tStart = m_txPsdus[18].txStart;
 
     NS_TEST_EXPECT_MSG_LT(tEnd + sifs,
                           tStart,
@@ -925,18 +1084,18 @@
                           tEnd + sifs + tolerance,
                           ack << " in response to the first QoS data frame sent too late");
     NS_TEST_EXPECT_MSG_EQ(
-        (m_nonHt ? m_txPsdus[16].header.IsAck() : m_txPsdus[16].header.IsBlockAck()),
+        (m_nonHt ? m_txPsdus[18].header.IsAck() : m_txPsdus[18].header.IsBlockAck()),
         true,
         "Expected a " << ack);
-    NS_TEST_EXPECT_MSG_EQ(m_txPsdus[16].header.GetAddr1(),
+    NS_TEST_EXPECT_MSG_EQ(m_txPsdus[18].header.GetAddr1(),
                           apDev->GetMac()->GetAddress(),
                           "Expected a " << ack << " sent to the AP");
     NS_TEST_EXPECT_MSG_EQ(
-        m_txPsdus[16].header.GetDuration(),
-        RoundDurationId(m_txPsdus[15].header.GetDuration() - sifs - m_txPsdus[16].txDuration),
+        m_txPsdus[18].header.GetDuration(),
+        RoundDurationId(m_txPsdus[17].header.GetDuration() - sifs - m_txPsdus[18].txDuration),
         "Duration/ID of the " << ack << " must be derived from that of the previous frame");
 
-    std::size_t idx = 16;
+    std::size_t idx = 18;
 
     if (!m_singleRtsPerTxop)
     {
@@ -1142,17 +1301,17 @@
     }
 
     // Expected received packets:
-    // - 3 DL packets (without RTS/CTS)
+    // - 4 DL packets (without RTS/CTS) if non-HT, 5 DL packets (without RTS/CTS) if HE
     // - 1 UL packet
     // - 3 DL packets (with RTS/CTS) if non-HT, 6 DL packets (with RTS/CTS) if HE
-    NS_TEST_EXPECT_MSG_EQ(m_received, (m_nonHt ? 7 : 10), "Unexpected number of packets received");
+    NS_TEST_EXPECT_MSG_EQ(m_received, (m_nonHt ? 8 : 12), "Unexpected number of packets received");
 }
 
 /**
- * \ingroup wifi-test
- * \ingroup tests
+ * @ingroup wifi-test
+ * @ingroup tests
  *
- * \brief wifi TXOP Test Suite
+ * @brief wifi TXOP Test Suite
  */
 class WifiTxopTestSuite : public TestSuite
 {
@@ -1168,17 +1327,20 @@
         AddTestCase(new WifiTxopTest({.nonHt = nonHt,
                                       .pifsRecovery = true,
                                       .singleRtsPerTxop = false,
-                                      .lengthBasedRtsCtsThresh = false}),
+                                      .lengthBasedRtsCtsThresh = false,
+                                      .protectedIfResponded = true}),
                     TestCase::Duration::QUICK);
         AddTestCase(new WifiTxopTest({.nonHt = nonHt,
                                       .pifsRecovery = false,
                                       .singleRtsPerTxop = true,
-                                      .lengthBasedRtsCtsThresh = false}),
+                                      .lengthBasedRtsCtsThresh = false,
+                                      .protectedIfResponded = false}),
                     TestCase::Duration::QUICK);
         AddTestCase(new WifiTxopTest({.nonHt = nonHt,
                                       .pifsRecovery = true,
                                       .singleRtsPerTxop = true,
-                                      .lengthBasedRtsCtsThresh = true}),
+                                      .lengthBasedRtsCtsThresh = true,
+                                      .protectedIfResponded = true}),
                     TestCase::Duration::QUICK);
     }
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wifi/test/wifi-tx-stats-helper-test.cc ns-3.44/src/wifi/test/wifi-tx-stats-helper-test.cc
--- ns-3.43/src/wifi/test/wifi-tx-stats-helper-test.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/wifi/test/wifi-tx-stats-helper-test.cc	2025-03-09 16:55:49.815372700 -0700
@@ -0,0 +1,1185 @@
+/*
+ * Copyright (c) 2024 Huazhong University of Science and Technology
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Author: Muyuan Shen <muyuan@uw.edu>
+ */
+
+#include "ns3/ap-wifi-mac.h"
+#include "ns3/boolean.h"
+#include "ns3/config.h"
+#include "ns3/eht-configuration.h"
+#include "ns3/log.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/multi-model-spectrum-channel.h"
+#include "ns3/packet-socket-client.h"
+#include "ns3/packet-socket-helper.h"
+#include "ns3/packet-socket-server.h"
+#include "ns3/packet.h"
+#include "ns3/pointer.h"
+#include "ns3/qos-txop.h"
+#include "ns3/qos-utils.h"
+#include "ns3/rng-seed-manager.h"
+#include "ns3/single-model-spectrum-channel.h"
+#include "ns3/spectrum-wifi-helper.h"
+#include "ns3/string.h"
+#include "ns3/test.h"
+#include "ns3/wifi-mac-header.h"
+#include "ns3/wifi-mac.h"
+#include "ns3/wifi-net-device.h"
+#include "ns3/wifi-ppdu.h"
+#include "ns3/wifi-psdu.h"
+#include "ns3/wifi-tx-stats-helper.h"
+
+#include <vector>
+
+using namespace ns3;
+
+NS_LOG_COMPONENT_DEFINE("WifiTxStatsHelperTest");
+
+/**
+ * @ingroup wifi-test
+ * @brief Implements a test case to evaluate the transmission process of multiple Wi-Fi
+ * MAC Layer MPDUs. The testcase has two options.
+ * 1) SINGLE_LINK_NON_QOS: test the handling of regular ACKs.
+ * 2) MULTI_LINK_QOS: test the handling of MPDU aggregation, Block ACKs, and Multi-Link Operation.
+ *
+ * To observe the operation of WifiTxStatsHelper, the test can be run from the command line as
+ * follows:
+ * @code
+ *   NS_LOG="WifiTxStatsHelper=level_info|prefix_all" ./ns3 run 'test-runner
+ * --suite=wifi-tx-stats-helper'
+ * @endcode
+ */
+class WifiTxStatsHelperTest : public TestCase
+{
+  public:
+    /**
+     * Option for the test
+     */
+    enum TestOption : uint8_t
+    {
+        SINGLE_LINK_NON_QOS,
+        MULTI_LINK_QOS
+    };
+
+    /**
+     * Constructor
+     * @param testName Test name
+     * @param option Test option
+     */
+    WifiTxStatsHelperTest(const std::string& testName, TestOption option);
+
+    /**
+     * Callback invoked when PHY starts transmission of a PSDU, used to record TX start
+     * time and TX duration.
+     *
+     * @param context the context
+     * @param psduMap the PSDU map
+     * @param txVector the TX vector
+     * @param txPower the tx power in Watts
+     */
+    void Transmit(std::string context,
+                  WifiConstPsduMap psduMap,
+                  WifiTxVector txVector,
+                  Watt_u txPower);
+
+  private:
+    TestOption m_option;          //!< Test option
+    NodeContainer m_wifiApNode;   //!< NodeContainer for AP
+    NodeContainer m_wifiStaNodes; //!< NodeContainer for STAs
+    int64_t m_streamNumber;       //!< Random variable stream number
+    Time m_sifs;                  //!< SIFS time
+    Time m_slot;                  //!< slot time
+
+    Time m_difs; //!< DIFS time (for SINGLE_LINK_NON_QOS case only)
+    std::map<uint8_t, std::vector<Time>> m_txStartTimes; //!< Map of independently obtain vector of
+                                                         //!< PhyTxBegin trace, indexed per link
+    std::map<uint8_t, std::vector<Time>>
+        m_durations;                      //!< Map of vector of MPDU durations, indexed per link
+    std::map<uint8_t, uint32_t> m_cwMins; //!< Map of CW Mins, indexed per link
+    std::map<uint8_t, uint32_t>
+        m_aifsns; //!< Map of AIFSNs, indexed per link (for MULTI_LINK_QOS case only)
+    std::map<uint8_t, Time>
+        m_aifss; //!< Map of AIFSs, indexed per link (for MULTI_LINK_QOS case only)
+
+    void DoSetup() override;
+    void DoRun() override;
+    /**
+     * Check correctness of test
+     * @param wifiTxStats Reference to the helper
+     */
+    void CheckResults(const WifiTxStatsHelper& wifiTxStats);
+};
+
+WifiTxStatsHelperTest::WifiTxStatsHelperTest(const std::string& testName, TestOption option)
+    : TestCase(testName),
+      m_option(option),
+      m_streamNumber(100)
+{
+}
+
+void
+WifiTxStatsHelperTest::Transmit(std::string context,
+                                WifiConstPsduMap psduMap,
+                                WifiTxVector txVector,
+                                Watt_u txPower)
+{
+    const auto linkId = atoi(context.c_str());
+    if (linkId == 0)
+    {
+        m_txStartTimes[0].push_back(Simulator::Now());
+        m_durations[0].push_back(
+            WifiPhy::CalculateTxDuration(psduMap, txVector, WIFI_PHY_BAND_5GHZ));
+    }
+    else if (linkId == 1)
+    {
+        m_txStartTimes[1].push_back(Simulator::Now());
+        m_durations[1].push_back(
+            WifiPhy::CalculateTxDuration(psduMap, txVector, WIFI_PHY_BAND_6GHZ));
+    }
+}
+
+void
+WifiTxStatsHelperTest::DoSetup()
+{
+    RngSeedManager::SetSeed(1);
+    RngSeedManager::SetRun(40);
+
+    m_wifiApNode.Create(1);
+    m_wifiStaNodes.Create(1);
+
+    MobilityHelper mobility;
+    auto positionAlloc = CreateObject<ListPositionAllocator>();
+    positionAlloc->Add(Vector(0.0, 0.0, 0.0));
+    positionAlloc->Add(Vector(1.0, 0.0, 0.0));
+    mobility.SetPositionAllocator(positionAlloc);
+    mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
+    mobility.Install(m_wifiApNode);
+    mobility.Install(m_wifiStaNodes);
+
+    PacketSocketHelper packetSocket;
+    packetSocket.Install(m_wifiApNode);
+    packetSocket.Install(m_wifiStaNodes);
+}
+
+void
+WifiTxStatsHelperTest::DoRun()
+{
+    std::string dataMode;
+    std::string ackMode;
+    if (m_option == SINGLE_LINK_NON_QOS)
+    {
+        dataMode = "OfdmRate12Mbps";
+        ackMode = "OfdmRate6Mbps";
+    }
+    else
+    {
+        dataMode = "EhtMcs6";
+        ackMode = "OfdmRate54Mbps";
+    }
+
+    WifiHelper wifi;
+    NetDeviceContainer staDevices;
+    NetDeviceContainer apDevices;
+    if (m_option == SINGLE_LINK_NON_QOS)
+    {
+        wifi.SetStandard(WIFI_STANDARD_80211a);
+        wifi.SetRemoteStationManager("ns3::ConstantRateWifiManager",
+                                     "DataMode",
+                                     StringValue(dataMode),
+                                     "ControlMode",
+                                     StringValue(ackMode));
+        auto spectrumChannel = CreateObject<SingleModelSpectrumChannel>();
+        auto lossModel = CreateObject<FriisPropagationLossModel>();
+        spectrumChannel->AddPropagationLossModel(lossModel);
+        auto delayModel = CreateObject<ConstantSpeedPropagationDelayModel>();
+        spectrumChannel->SetPropagationDelayModel(delayModel);
+
+        SpectrumWifiPhyHelper phy;
+        phy.SetChannel(spectrumChannel);
+
+        WifiMacHelper mac;
+        mac.SetType("ns3::StaWifiMac",
+                    "QosSupported",
+                    BooleanValue(false),
+                    "Ssid",
+                    SsidValue(Ssid("test-ssid")));
+        staDevices = wifi.Install(phy, mac, m_wifiStaNodes);
+
+        mac.SetType("ns3::ApWifiMac",
+                    "QosSupported",
+                    BooleanValue(false),
+                    "Ssid",
+                    SsidValue(Ssid("test-ssid")),
+                    "BeaconInterval",
+                    TimeValue(MicroSeconds(102400)),
+                    "EnableBeaconJitter",
+                    BooleanValue(false));
+        apDevices = wifi.Install(phy, mac, m_wifiApNode);
+    }
+    else
+    {
+        wifi.SetStandard(WIFI_STANDARD_80211be);
+        // Get channel string for MLD STA
+        std::array<std::string, 2> mldChannelStr;
+        uint32_t frequency = 5;
+        uint32_t frequency2 = 6;
+        for (auto freq : {frequency, frequency2})
+        {
+            NS_TEST_ASSERT_MSG_EQ((freq == 5 || freq == 6), true, "Unsupported frequency for BSS");
+            if (freq == 6)
+            {
+                mldChannelStr[1] = "{0, 20, BAND_6GHZ, 0}";
+                wifi.SetRemoteStationManager(static_cast<uint8_t>(1),
+                                             "ns3::ConstantRateWifiManager",
+                                             "DataMode",
+                                             StringValue(dataMode),
+                                             "ControlMode",
+                                             StringValue(ackMode));
+            }
+            else
+            {
+                mldChannelStr[0] = "{0, 20, BAND_5GHZ, 0}";
+                wifi.SetRemoteStationManager(static_cast<uint8_t>(0),
+                                             "ns3::ConstantRateWifiManager",
+                                             "DataMode",
+                                             StringValue(dataMode),
+                                             "ControlMode",
+                                             StringValue(ackMode));
+            }
+        }
+
+        SpectrumWifiPhyHelper phy(2);
+
+        auto lossModel = CreateObject<LogDistancePropagationLossModel>();
+        auto spectrumChannel1 = CreateObject<MultiModelSpectrumChannel>();
+        spectrumChannel1->AddPropagationLossModel(lossModel);
+        auto spectrumChannel2 = CreateObject<MultiModelSpectrumChannel>();
+        spectrumChannel2->AddPropagationLossModel(lossModel);
+
+        phy.AddChannel(spectrumChannel1, WIFI_SPECTRUM_5_GHZ);
+        phy.AddChannel(spectrumChannel2, WIFI_SPECTRUM_6_GHZ);
+
+        for (uint8_t linkId = 0; linkId < 2; ++linkId)
+        {
+            phy.Set(linkId, "ChannelSettings", StringValue(mldChannelStr[linkId]));
+        }
+
+        WifiMacHelper mac;
+        mac.SetType("ns3::StaWifiMac",
+                    "QosSupported",
+                    BooleanValue(true),
+                    "Ssid",
+                    SsidValue(Ssid("test-ssid")));
+        staDevices = wifi.Install(phy, mac, m_wifiStaNodes);
+
+        mac.SetType("ns3::ApWifiMac",
+                    "QosSupported",
+                    BooleanValue(true),
+                    "Ssid",
+                    SsidValue(Ssid("test-ssid")),
+                    "BeaconInterval",
+                    TimeValue(MicroSeconds(102400)),
+                    "EnableBeaconJitter",
+                    BooleanValue(false));
+        apDevices = wifi.Install(phy, mac, m_wifiApNode);
+    }
+
+    m_sifs = DynamicCast<WifiNetDevice>(apDevices.Get(0))->GetPhy()->GetSifs();
+    m_slot = DynamicCast<WifiNetDevice>(apDevices.Get(0))->GetPhy()->GetSlot();
+    if (m_option == SINGLE_LINK_NON_QOS)
+    {
+        m_difs = m_sifs + 2 * m_slot;
+        m_cwMins[SINGLE_LINK_OP_ID] =
+            DynamicCast<WifiNetDevice>(apDevices.Get(0))->GetMac()->GetTxop()->GetMinCw();
+    }
+    else
+    {
+        // Use TID-to-link Mapping to tx TID=3 pkts (BE) only on link 0,
+        // TID=4 pkts (VI) only on link 1
+        m_cwMins[0] = 15;
+        m_cwMins[1] = 7;
+        m_aifsns[0] = 3;
+        m_aifsns[1] = 2;
+        m_aifss[0] = m_aifsns[0] * m_slot + m_sifs;
+        m_aifss[1] = m_aifsns[1] * m_slot + m_sifs;
+        std::string mldMappingStr = "3 0; 4 1";
+        DynamicCast<WifiNetDevice>(staDevices.Get(0))
+            ->GetMac()
+            ->GetEhtConfiguration()
+            ->SetAttribute("TidToLinkMappingUl", StringValue(mldMappingStr));
+    }
+
+    auto streamsUsed = WifiHelper::AssignStreams(apDevices, m_streamNumber);
+    NS_ASSERT_MSG(streamsUsed < 100, "Need to increment by larger quantity");
+    WifiHelper::AssignStreams(staDevices, m_streamNumber + 100);
+
+    // UL traffic (TX statistics will be installed at STA side)
+    PacketSocketAddress socket;
+    socket.SetSingleDevice(staDevices.Get(0)->GetIfIndex());
+    socket.SetPhysicalAddress(apDevices.Get(0)->GetAddress());
+    auto server = CreateObject<PacketSocketServer>();
+    server->SetLocal(socket);
+    m_wifiApNode.Get(0)->AddApplication(server);
+    server->SetStartTime(Seconds(0.0));
+    server->SetStopTime(Seconds(1.0));
+    if (m_option == SINGLE_LINK_NON_QOS)
+    {
+        auto client = CreateObject<PacketSocketClient>();
+        client->SetAttribute("PacketSize", UintegerValue(1500));
+        client->SetAttribute("MaxPackets", UintegerValue(3));
+        client->SetAttribute("Interval", TimeValue(MicroSeconds(0)));
+        client->SetRemote(socket);
+        m_wifiStaNodes.Get(0)->AddApplication(client);
+        client->SetStartTime(MicroSeconds(210000));
+        client->SetStopTime(Seconds(1.0));
+    }
+    else
+    {
+        auto clientBe = CreateObject<PacketSocketClient>();
+        clientBe->SetAttribute("Priority", UintegerValue(3));
+        clientBe->SetAttribute("PacketSize", UintegerValue(1500));
+        clientBe->SetAttribute("MaxPackets", UintegerValue(3));
+        clientBe->SetAttribute("Interval", TimeValue(MicroSeconds(0)));
+        clientBe->SetRemote(socket);
+        m_wifiStaNodes.Get(0)->AddApplication(clientBe);
+        clientBe->SetStartTime(MicroSeconds(200000));
+        clientBe->SetStopTime(Seconds(1.0));
+
+        auto clientVi = CreateObject<PacketSocketClient>();
+        clientVi->SetAttribute("Priority", UintegerValue(4));
+        clientVi->SetAttribute("PacketSize", UintegerValue(1500));
+        clientVi->SetAttribute("MaxPackets", UintegerValue(3));
+        clientVi->SetAttribute("Interval", TimeValue(MicroSeconds(0)));
+        clientVi->SetRemote(socket);
+        m_wifiStaNodes.Get(0)->AddApplication(clientVi);
+        clientVi->SetStartTime(MicroSeconds(300000));
+        clientVi->SetStopTime(Seconds(1.0));
+    }
+
+    // Add AP side receiver corruption
+    if (m_option == SINGLE_LINK_NON_QOS)
+    {
+        // We corrupt AP side reception so that:
+        // 1) the 2nd data frame is retransmitted and succeeds (1 failure, 1 success)
+        // 2) the 3rd data frame is transmitted 7 times (=FrameRetryLimit) and finally fails (7
+        // failures, 0 success)
+        //
+        // No. of pkt       |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7   |   8 |
+        // No. recvd by AP  |       |       |   0   |       |       |   1   |       |   2   | | AP's
+        // pkts        |  Bea  |  Bea  |       |  Ack  | AsRes |       |  Bea  |       | Ack1  |
+        // STA's pkts       |       |       | AsReq |       |       |  Ack  |       | Data1 | |
+        //
+        // No. of pkt       |   9   |  10   |  11   |  12   |  13   |  ...  |  18   |  19   |  ...
+        // No. recvd by AP  | 3 (x) |   4   |       | 5 (x) | 6 (x) |  ...  |11 (x) |       |  ...
+        // AP's pkts        |       |       | Ack2  |       |       |  ...  |       |  Bea  |  ...
+        // STA's pkts       | Data2 | Data2 |       | Data3 | Data3 |  ...  | Data3 |       |  ...
+        //
+        // Legend:
+        // Bea = Beacon, AsReq = Association Request, AsRes = Association Response
+        // AP side corruption is indicated with (x)
+
+        auto apPem = CreateObject<ReceiveListErrorModel>();
+        apPem->SetList({3, 5, 6, 7, 8, 9, 10, 11});
+        DynamicCast<WifiNetDevice>(apDevices.Get(0))
+            ->GetMac()
+            ->GetWifiPhy()
+            ->SetPostReceptionErrorModel(apPem);
+    }
+    else
+    {
+        // We corrupt AP side reception so that:
+        // On Link 0 (contains uplink data with TID = 3):
+        // 1) the 2nd data frame is retransmitted once and succeeds (retransmission = 1)
+        // 2) the 3rd data frame is transmitted 2 times within A-MPDU and 7 times alone
+        // (WifiMac::FrameRetryLimit) and finally fails (retransmission = 8)
+        //
+        // No. of PSDU      |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7   |   8 |
+        // No. recvd by AP  |       |       |   0   |       |   1   |       |   2   |       |   3 |
+        // AP's pkts        |  Bea  |  Bea  |       |  Ack  |       | AsRes |       | CfEnd | |
+        // STA's pkts       |       |       | AsReq |       | CfEnd |       |  Ack  |       | ABReq
+        // |
+        //
+        // No. of PSDU      |   9   |  10   |  11   |  12   |  12   |  12   |  13   |  14   |  14 |
+        // No. recvd by AP  |       |       |   4   |   5   | 6(x)  | 7(x)  |       |   8   | 9(x) |
+        // AP's pkts        |  Ack  | ABRes |       |       |       |       | BAck  |       | |
+        // STA's pkts       |       |       |  Ack  | Data1 | Data2 | Data3 |       | Data2 | Data3
+        // |
+        //
+        // No. of PSDU      |  15   |  16   |  ...  |       |  ...  |  23   |  24   |  25   |  ...
+        // No. recvd by AP  |       | 10(x) |  ...  |       |  ...  | 16(x) |  17   |       |  ...
+        // AP's pkts        | BAck  |       |  ...  |  Bea  |  ...  |       |       | BAck  |  ...
+        // STA's pkts       |       | Data3 |  ...  |       |  ...  | Data3 |  Bar  |       |  ...
+        //
+        // On Link 1 (contains uplink data with TID = 4):
+        // 1) the 2nd data frame is transmitted 2 times within A-MPDU and 7 times alone
+        // (=WifiMac::FrameRetryLimit) and finally fails (retransmission = 8)
+        // 2) the 3rd data frame is
+        // retransmitted once and succeeds (retransmission = 1)
+        //
+        // No. of PSDU      |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7   |   8 |
+        // No. recvd by AP  |       |       |   0   |       |       |   1   |       |   2   | | AP's
+        // pkts        |  Bea  |  Bea  |       |  Ack  |  Bea  |       |  Ack  |       | ABRes |
+        // STA's pkts       |       |       | Null  |       |       | ABReq |       | CfEnd | |
+        //
+        // No. of PSDU      |   9   |  10   |  11   |  11   |  11   |  12   |  13   |  13   |  14 |
+        // No. recvd by AP  |   3   |       |   4   | 5(x)  | 6(x)  |       | 7(x)  |   8   | | AP's
+        // pkts        |       | CfEnd |       |       |       | BAck  |       |       | BAck  |
+        // STA's pkts       |  Ack  |       | Data1 | Data2 | Data3 |       | Data2 | Data3 | |
+        //
+        // No. of PSDU      |  15   |  ...  |  21   |  22   |  23   |  24   |  ...
+        // No. recvd by AP  | 9(x)  |  ...  | 15(x) |  16   |       |  17   |  ...
+        // AP's pkts        |       |  ...  |       |       | BAck  |       |  ...
+        // STA's pkts       | Data2 |  ...  | Data2 |  Bar  |       | CfEnd |  ...
+        //
+        // Legend:
+        // Bea = Beacon, AsReq = Association Request, AsRes = Association Response
+        // ABReq = Add Block ACK Request, ABRes = Add Block ACK Response
+        // Bar = Block ACK Request (used to notify the discarded MPDU)
+        // CfEnd = CF-End, BAck = Block ACK (Response), Null = Null function
+        // AP side corruption is indicated with (x)
+
+        // Force drops on link 0 at AP
+        auto apPem0 = CreateObject<ReceiveListErrorModel>();
+        apPem0->SetList({6, 7, 9, 10, 11, 12, 13, 14, 15, 16});
+        DynamicCast<WifiNetDevice>(apDevices.Get(0))
+            ->GetMac()
+            ->GetWifiPhy(0)
+            ->SetPostReceptionErrorModel(apPem0);
+
+        // Force drops on link 1 at AP
+        auto apPem1 = CreateObject<ReceiveListErrorModel>();
+        apPem1->SetList({5, 6, 7, 9, 10, 11, 12, 13, 14, 15});
+        DynamicCast<WifiNetDevice>(apDevices.Get(0))
+            ->GetMac()
+            ->GetWifiPhy(1)
+            ->SetPostReceptionErrorModel(apPem1);
+    }
+
+    NetDeviceContainer allNetDev;
+    allNetDev.Add(apDevices);
+    allNetDev.Add(staDevices);
+    WifiTxStatsHelper wifiTxStats;
+    wifiTxStats.Enable(allNetDev);
+    wifiTxStats.Start(Seconds(0));
+    wifiTxStats.Stop(Seconds(1));
+
+    // Trace PSDU TX at both AP and STA to get start times and durations, including acks
+    if (m_option == SINGLE_LINK_NON_QOS)
+    {
+        for (auto it = allNetDev.Begin(); it != allNetDev.End(); ++it)
+        {
+            auto dev = DynamicCast<WifiNetDevice>(*it);
+            dev->GetPhy()->TraceConnect("PhyTxPsduBegin",
+                                        std::to_string(SINGLE_LINK_OP_ID),
+                                        // "0"
+                                        MakeCallback(&WifiTxStatsHelperTest::Transmit, this));
+        }
+    }
+    else
+    {
+        for (auto it = allNetDev.Begin(); it != allNetDev.End(); ++it)
+        {
+            auto dev = DynamicCast<WifiNetDevice>(*it);
+            dev->GetPhy(0)->TraceConnect("PhyTxPsduBegin",
+                                         "0",
+                                         MakeCallback(&WifiTxStatsHelperTest::Transmit, this));
+            dev->GetPhy(1)->TraceConnect("PhyTxPsduBegin",
+                                         "1",
+                                         MakeCallback(&WifiTxStatsHelperTest::Transmit, this));
+        }
+    }
+
+    Simulator::Stop(Seconds(1));
+    Simulator::Run();
+    CheckResults(wifiTxStats);
+    Simulator::Destroy();
+}
+
+void
+WifiTxStatsHelperTest::CheckResults(const WifiTxStatsHelper& wifiTxStats)
+{
+    const auto tolerance = NanoSeconds(50); // due to propagation delay
+    // Check both variants of GetSuccesses...()
+    const auto successMap = wifiTxStats.GetSuccessesByNodeDevice();
+    const auto successMapPerNodeDeviceLink = wifiTxStats.GetSuccessesByNodeDeviceLink();
+    const auto failureMap = wifiTxStats.GetFailuresByNodeDevice();
+    const auto retransmissionMap = wifiTxStats.GetRetransmissionsByNodeDevice();
+    const auto totalSuccesses = wifiTxStats.GetSuccesses();
+    const auto totalFailures = wifiTxStats.GetFailures();
+    const auto totalRetransmissions = wifiTxStats.GetRetransmissions();
+    const auto& successRecords = wifiTxStats.GetSuccessRecords();
+    const auto& failureRecords = wifiTxStats.GetFailureRecords();
+
+    uint32_t nodeId = 1;
+    uint32_t deviceId = 0;
+    auto nodeDeviceTuple = std::make_tuple(nodeId, deviceId);
+    auto nodeDeviceLink0Tuple = std::make_tuple(nodeId, deviceId, 0);
+    auto nodeDeviceLink1Tuple = std::make_tuple(nodeId, deviceId, 1);
+
+    if (m_option == SINGLE_LINK_NON_QOS)
+    {
+        const auto totalFailuresDrop =
+            wifiTxStats.GetFailures(WifiMacDropReason::WIFI_MAC_DROP_REACHED_RETRY_LIMIT);
+        const auto totalFailuresDropMap = wifiTxStats.GetFailuresByNodeDevice(
+            WifiMacDropReason::WIFI_MAC_DROP_REACHED_RETRY_LIMIT);
+
+        NS_TEST_ASSERT_MSG_EQ(successMapPerNodeDeviceLink.at(nodeDeviceLink0Tuple),
+                              2,
+                              "Number of success packets should be 2");
+        NS_TEST_ASSERT_MSG_EQ(successMap.at(nodeDeviceTuple),
+                              2,
+                              "Number of success packets should be 2");
+        NS_TEST_ASSERT_MSG_EQ(totalSuccesses, 2, "Number of success packets should be 2");
+
+        NS_TEST_ASSERT_MSG_EQ(retransmissionMap.at(nodeDeviceTuple),
+                              1,
+                              "Number of retransmitted successful packets should be 1");
+        NS_TEST_ASSERT_MSG_EQ(totalRetransmissions,
+                              1,
+                              "Number of retransmitted successful packets should be 1");
+
+        NS_TEST_ASSERT_MSG_EQ(failureMap.at(nodeDeviceTuple),
+                              1,
+                              "Number of failed packets should be 1");
+        NS_TEST_ASSERT_MSG_EQ(totalFailures, 1, "Number of failed packets (aggregate) should be 1");
+        NS_TEST_ASSERT_MSG_EQ(
+            totalFailuresDrop,
+            1,
+            "Number of dropped packets (aggregate) due to retry limit reached should be 1");
+        NS_TEST_ASSERT_MSG_EQ(
+            totalFailuresDropMap.at(nodeDeviceTuple),
+            1,
+            "Number of dropped packets (aggregate) due to retry limit reached should be 1");
+
+        auto successRecordIt = successRecords.at(nodeDeviceLink0Tuple).begin();
+        NS_TEST_ASSERT_MSG_EQ(successRecordIt->m_nodeId,
+                              1,
+                              "Source node ID of the 1st successful data packet should be 1");
+        std::advance(successRecordIt, 1);
+        NS_TEST_ASSERT_MSG_EQ(successRecordIt->m_nodeId,
+                              1,
+                              "Source node ID of the 2nd successful data packet should be 1");
+        auto failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
+        NS_TEST_ASSERT_MSG_EQ(failureRecordIt->m_nodeId,
+                              1,
+                              "Source node ID of the failed data packet should be 1");
+
+        successRecordIt = successRecords.at(nodeDeviceLink0Tuple).begin();
+        NS_TEST_ASSERT_MSG_EQ(
+            successRecordIt->m_retransmissions,
+            0,
+            "The retransmission count of the 1st successful data packet should be 0");
+        std::advance(successRecordIt, 1);
+        NS_TEST_ASSERT_MSG_EQ(
+            successRecordIt->m_retransmissions,
+            1,
+            "The retransmission count of the 2nd successful data packet should be 1");
+        NS_TEST_ASSERT_MSG_EQ(failureRecordIt->m_retransmissions,
+                              6,
+                              "The retransmission count of the failed data packet should be 6");
+
+        successRecordIt = successRecords.at(nodeDeviceLink0Tuple).begin();
+        NS_TEST_ASSERT_MSG_EQ(successRecordIt->m_txStartTime.IsStrictlyPositive(),
+                              true,
+                              "The 1st successful data packet should have been TXed");
+        std::advance(successRecordIt, 1);
+        NS_TEST_ASSERT_MSG_EQ(successRecordIt->m_txStartTime.IsStrictlyPositive(),
+                              true,
+                              "The 2nd successful data packet should have been TXed");
+        NS_TEST_ASSERT_MSG_EQ(failureRecordIt->m_txStartTime.IsStrictlyPositive(),
+                              true,
+                              "The failed data packet should have been TXed");
+
+        successRecordIt = successRecords.at(nodeDeviceLink0Tuple).begin();
+        NS_TEST_ASSERT_MSG_EQ(successRecordIt->m_ackTime.IsStrictlyPositive(),
+                              true,
+                              "The 1st successful data packet should have been acked");
+        std::advance(successRecordIt, 1);
+        NS_TEST_ASSERT_MSG_EQ(successRecordIt->m_ackTime.IsStrictlyPositive(),
+                              true,
+                              "The 2nd successful data packet should have been acked");
+        NS_TEST_ASSERT_MSG_EQ(failureRecordIt->m_ackTime.IsStrictlyPositive(),
+                              false,
+                              "The failed data packet should not have been acked");
+
+        successRecordIt = successRecords.at(nodeDeviceLink0Tuple).begin();
+        NS_TEST_ASSERT_MSG_EQ(successRecordIt->m_ackTime.IsStrictlyPositive(),
+                              true,
+                              "The 1st successful data packet should have been dequeued");
+        std::advance(successRecordIt, 1);
+        NS_TEST_ASSERT_MSG_EQ(successRecordIt->m_ackTime.IsStrictlyPositive(),
+                              true,
+                              "The 2nd successful data packet should have been dequeued");
+        NS_TEST_ASSERT_MSG_EQ(failureRecordIt->m_dropTime.has_value() &&
+                                  failureRecordIt->m_dropTime.value().IsStrictlyPositive(),
+                              true,
+                              "The failed data packet should have been dequeued");
+
+        successRecordIt = successRecords.at(nodeDeviceLink0Tuple).begin();
+        auto successRecordItNext = successRecordIt;
+        std::advance(successRecordItNext, 1);
+        NS_TEST_ASSERT_MSG_EQ(successRecordIt->m_enqueueTime,
+                              successRecordItNext->m_enqueueTime,
+                              "Three packets should be enqueued at the same time");
+        NS_TEST_ASSERT_MSG_EQ(successRecordIt->m_enqueueTime,
+                              failureRecordIt->m_enqueueTime,
+                              "Three packets should be enqueued at the same time");
+
+        successRecordIt = successRecords.at(nodeDeviceLink0Tuple).begin();
+        NS_TEST_ASSERT_MSG_GT_OR_EQ(successRecordIt->m_txStartTime,
+                                    successRecordIt->m_enqueueTime,
+                                    "Packets should be TXed after enqueued");
+        NS_TEST_ASSERT_MSG_LT_OR_EQ(successRecordIt->m_txStartTime,
+                                    successRecordIt->m_enqueueTime + tolerance +
+                                        m_cwMins[SINGLE_LINK_OP_ID] * m_slot,
+                                    "Packet backoff slots should not exceed cwMin");
+        // Packet start time 7 corresponds to first data packet (prior to this, beacons and assoc)
+        NS_TEST_ASSERT_MSG_EQ(successRecordIt->m_txStartTime,
+                              m_txStartTimes[SINGLE_LINK_OP_ID][7],
+                              "Wrong TX start time");
+        NS_TEST_ASSERT_MSG_GT_OR_EQ(successRecordIt->m_ackTime,
+                                    m_txStartTimes[SINGLE_LINK_OP_ID][7] +
+                                        m_durations[SINGLE_LINK_OP_ID][7] + m_sifs +
+                                        m_durations[SINGLE_LINK_OP_ID][8],
+                                    "Wrong Ack reception time");
+        NS_TEST_ASSERT_MSG_LT_OR_EQ(successRecordIt->m_ackTime,
+                                    m_txStartTimes[SINGLE_LINK_OP_ID][7] +
+                                        m_durations[SINGLE_LINK_OP_ID][7] + m_sifs +
+                                        m_durations[SINGLE_LINK_OP_ID][8] + 2 * tolerance,
+                                    "Wrong Ack reception time");
+        std::advance(successRecordIt, 1);
+        NS_TEST_ASSERT_MSG_GT_OR_EQ(successRecordIt->m_txStartTime,
+                                    m_txStartTimes[SINGLE_LINK_OP_ID][8] +
+                                        m_durations[SINGLE_LINK_OP_ID][8] + m_difs,
+                                    "Packets should be TXed after enqueued");
+        NS_TEST_ASSERT_MSG_LT_OR_EQ(successRecordIt->m_txStartTime,
+                                    m_txStartTimes[SINGLE_LINK_OP_ID][8] +
+                                        m_durations[SINGLE_LINK_OP_ID][8] + m_difs + tolerance +
+                                        m_cwMins[SINGLE_LINK_OP_ID] * m_slot,
+                                    "Packet backoff slots should not exceed cwMin");
+        NS_TEST_ASSERT_MSG_EQ(successRecordIt->m_txStartTime,
+                              m_txStartTimes[SINGLE_LINK_OP_ID][9],
+                              "Wrong TX start time");
+        NS_TEST_ASSERT_MSG_GT_OR_EQ(successRecordIt->m_ackTime,
+                                    m_txStartTimes[SINGLE_LINK_OP_ID][10] +
+                                        m_durations[SINGLE_LINK_OP_ID][10] + m_sifs +
+                                        m_durations[SINGLE_LINK_OP_ID][11],
+                                    "Wrong Ack reception time");
+        NS_TEST_ASSERT_MSG_LT_OR_EQ(
+            successRecordIt->m_ackTime,
+            m_txStartTimes[SINGLE_LINK_OP_ID][10] + m_durations[SINGLE_LINK_OP_ID][10] + m_sifs +
+                m_durations[SINGLE_LINK_OP_ID][11] +
+                ((m_cwMins[SINGLE_LINK_OP_ID] + 1) * 2 - 1) * m_slot + 2 * tolerance,
+            "Wrong Ack reception time");
+
+        NS_TEST_ASSERT_MSG_GT_OR_EQ(failureRecordIt->m_txStartTime,
+                                    m_txStartTimes[SINGLE_LINK_OP_ID][11] +
+                                        m_durations[SINGLE_LINK_OP_ID][11] + m_difs,
+                                    "Packets should be TXed after enqueued");
+        NS_TEST_ASSERT_MSG_LT_OR_EQ(failureRecordIt->m_txStartTime,
+                                    m_txStartTimes[SINGLE_LINK_OP_ID][11] +
+                                        m_durations[SINGLE_LINK_OP_ID][11] + m_difs + tolerance +
+                                        m_cwMins[SINGLE_LINK_OP_ID] * m_slot,
+                                    "Packet backoff slots should not exceed cwMin");
+        NS_TEST_ASSERT_MSG_EQ(failureRecordIt->m_txStartTime,
+                              m_txStartTimes[SINGLE_LINK_OP_ID][12],
+                              "Wrong TX start time");
+        NS_TEST_ASSERT_MSG_EQ(failureRecordIt->m_dropTime.has_value() &&
+                                  failureRecordIt->m_dropReason.has_value(),
+                              true,
+                              "Missing drop time or reason");
+        NS_TEST_ASSERT_MSG_GT_OR_EQ(failureRecordIt->m_dropTime.value(),
+                                    m_txStartTimes[SINGLE_LINK_OP_ID][18] +
+                                        m_durations[SINGLE_LINK_OP_ID][18],
+                                    "Wrong Dequeue time for failed packet");
+        NS_TEST_ASSERT_MSG_LT_OR_EQ(failureRecordIt->m_dropTime.value(),
+                                    m_txStartTimes[SINGLE_LINK_OP_ID][18] +
+                                        m_durations[SINGLE_LINK_OP_ID][18] + m_sifs + m_slot +
+                                        m_durations[SINGLE_LINK_OP_ID][11],
+                                    "Wrong Dequeue time for failed packet");
+        NS_TEST_ASSERT_MSG_EQ(failureRecordIt->m_dropReason.value(),
+                              WifiMacDropReason::WIFI_MAC_DROP_REACHED_RETRY_LIMIT,
+                              "Wrong drop reason");
+    }
+    else
+    {
+        const auto totalFailuresQos =
+            wifiTxStats.GetFailures(WifiMacDropReason::WIFI_MAC_DROP_QOS_OLD_PACKET);
+        const auto totalFailuresQosMap =
+            wifiTxStats.GetFailuresByNodeDevice(WifiMacDropReason::WIFI_MAC_DROP_QOS_OLD_PACKET);
+
+        for (std::vector<Time>::size_type i = 0; i < m_txStartTimes[0].size(); ++i)
+        {
+            NS_LOG_INFO("link 0 pkt " << i << " start tx at " << m_txStartTimes[0][i].As(Time::US));
+        }
+        for (std::vector<Time>::size_type i = 0; i < m_txStartTimes[1].size(); ++i)
+        {
+            NS_LOG_INFO("link 1 pkt " << i << " start tx at " << m_txStartTimes[1][i].As(Time::US));
+        }
+
+        NS_TEST_ASSERT_MSG_EQ(successMapPerNodeDeviceLink.at(nodeDeviceLink0Tuple),
+                              2,
+                              "Number of success packets on link 0 should be 2");
+        NS_TEST_ASSERT_MSG_EQ(successMapPerNodeDeviceLink.at(nodeDeviceLink1Tuple),
+                              2,
+                              "Number of success packets on link 1 should be 2");
+        NS_TEST_ASSERT_MSG_EQ(successMap.at(nodeDeviceTuple),
+                              4,
+                              "Number of success packets should be 4");
+        NS_TEST_ASSERT_MSG_EQ(totalSuccesses, 4, "Number of success packets should be 4");
+
+        NS_TEST_ASSERT_MSG_EQ(retransmissionMap.at(nodeDeviceTuple),
+                              2,
+                              "Number of retransmitted successful packets should be 2");
+        NS_TEST_ASSERT_MSG_EQ(totalRetransmissions,
+                              2,
+                              "Number of retransmitted successful packets (aggregate) should be 2");
+        NS_TEST_ASSERT_MSG_EQ(failureMap.at(nodeDeviceTuple),
+                              2,
+                              "Number of failed packets should be 2");
+        NS_TEST_ASSERT_MSG_EQ(totalFailures, 2, "Number of failed packets (aggregate) should be 2");
+        NS_TEST_ASSERT_MSG_EQ(totalFailuresQos,
+                              2,
+                              "Number of dropped packets (aggregate) by QosTxop should be 2");
+        NS_TEST_ASSERT_MSG_EQ(totalFailuresQosMap.at(nodeDeviceTuple),
+                              2,
+                              "Number of dropped packets (aggregate) by QosTxop should be 2");
+
+        auto successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
+        NS_TEST_ASSERT_MSG_EQ(
+            successRecordLink0It->m_nodeId,
+            1,
+            "Source node ID of the 1st successful data packet on link 0 should be 1");
+        std::advance(successRecordLink0It, 1);
+        NS_TEST_ASSERT_MSG_EQ(
+            successRecordLink0It->m_nodeId,
+            1,
+            "Source node ID of the 2nd successful data packet on link 0 should be 1");
+        auto successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
+        NS_TEST_ASSERT_MSG_EQ(
+            successRecordLink1It->m_nodeId,
+            1,
+            "Source node ID of the 1st successful data packet on link 0 should be 1");
+        std::advance(successRecordLink1It, 1);
+        NS_TEST_ASSERT_MSG_EQ(
+            successRecordLink1It->m_nodeId,
+            1,
+            "Source node ID of the 2nd successful data packet on link 0 should be 1");
+        auto failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
+        NS_TEST_ASSERT_MSG_EQ(failureRecordIt->m_nodeId,
+                              1,
+                              "Source node ID of the failed data packet on link 0 should be 1");
+        std::advance(failureRecordIt, 1);
+        NS_TEST_ASSERT_MSG_EQ(failureRecordIt->m_nodeId,
+                              1,
+                              "Source node ID of the failed data packet on link 1 should be 1");
+
+        successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
+        NS_TEST_ASSERT_MSG_EQ(successRecordLink0It->m_deviceId,
+                              0,
+                              "Device ID of the 1st successful data packet on link 0 should be 0");
+        std::advance(successRecordLink0It, 1);
+        NS_TEST_ASSERT_MSG_EQ(successRecordLink0It->m_deviceId,
+                              0,
+                              "Device ID of the 2nd successful data packet on link 0 should be 0");
+        successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
+        NS_TEST_ASSERT_MSG_EQ(successRecordLink1It->m_deviceId,
+                              0,
+                              "Device ID of the 1st successful data packet on link 0 should be 0");
+        std::advance(successRecordLink1It, 1);
+        NS_TEST_ASSERT_MSG_EQ(successRecordLink1It->m_deviceId,
+                              0,
+                              "Device ID of the 2nd successful data packet on link 1 should be 0");
+        failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
+        NS_TEST_ASSERT_MSG_EQ(failureRecordIt->m_deviceId,
+                              0,
+                              "Device ID of the failed data packet on link 1 should be 0");
+        std::advance(failureRecordIt, 1);
+        NS_TEST_ASSERT_MSG_EQ(failureRecordIt->m_deviceId,
+                              0,
+                              "Device ID of the failed data packet on link 1 should be 0");
+
+        successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
+        NS_TEST_ASSERT_MSG_EQ(
+            *successRecordLink0It->m_successLinkIdSet.begin(),
+            0,
+            "Successful link ID of the 1st successful data packet on link 0 should be 0");
+        std::advance(successRecordLink0It, 1);
+        NS_TEST_ASSERT_MSG_EQ(
+            *successRecordLink0It->m_successLinkIdSet.begin(),
+            0,
+            "Successful link ID of the 2nd successful data packet on link 0 should be 0");
+        successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
+        NS_TEST_ASSERT_MSG_EQ(
+            *successRecordLink1It->m_successLinkIdSet.begin(),
+            1,
+            "Successful link ID of the 1st successful data packet on link 1 should be 1");
+        std::advance(successRecordLink1It, 1);
+        NS_TEST_ASSERT_MSG_EQ(
+            *successRecordLink1It->m_successLinkIdSet.begin(),
+            1,
+            "Successful link ID of the 2nd successful data packet on link 1 should be 1");
+        failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
+        NS_TEST_ASSERT_MSG_EQ(
+            failureRecordIt->m_successLinkIdSet.empty(),
+            true,
+            "Successful link ID set of the failed data packet on link 0 should be empty");
+        std::advance(failureRecordIt, 1);
+        NS_TEST_ASSERT_MSG_EQ(
+            failureRecordIt->m_successLinkIdSet.empty(),
+            true,
+            "Successful link ID set of the failed data packet on link 1 should be empty");
+
+        successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
+        NS_TEST_ASSERT_MSG_EQ(
+            successRecordLink0It->m_retransmissions,
+            0,
+            "The 1st successful data packet on link 0 should have no retransmissions");
+        std::advance(successRecordLink0It, 1);
+        NS_TEST_ASSERT_MSG_EQ(
+            successRecordLink0It->m_retransmissions,
+            1,
+            "The 2nd successful data packet on link 0 should have 1 retransmission");
+        successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
+        NS_TEST_ASSERT_MSG_EQ(
+            successRecordLink1It->m_retransmissions,
+            0,
+            "The 1st successful data packet on link 1 should have no retransmissions");
+        std::advance(successRecordLink1It, 1);
+        NS_TEST_ASSERT_MSG_EQ(
+            successRecordLink1It->m_retransmissions,
+            1,
+            "The 2nd successful data packet on link 1 should have 1 retransmission");
+        failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
+        NS_TEST_ASSERT_MSG_EQ(failureRecordIt->m_retransmissions,
+                              8,
+                              "The failed data packet on link 0 should have 8 retransmissions");
+        std::advance(failureRecordIt, 1);
+        NS_TEST_ASSERT_MSG_EQ(failureRecordIt->m_retransmissions,
+                              8,
+                              "The failed data packet on link 1 should have 8 retransmissions");
+
+        successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
+        NS_TEST_ASSERT_MSG_EQ(successRecordLink0It->m_tid,
+                              3,
+                              "The 1st successful data packet on link 0 should have a TID of 3");
+        std::advance(successRecordLink0It, 1);
+        NS_TEST_ASSERT_MSG_EQ(successRecordLink0It->m_tid,
+                              3,
+                              "The 2nd successful data packet on link 0 should have a TID of 3");
+        successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
+        NS_TEST_ASSERT_MSG_EQ(successRecordLink1It->m_tid,
+                              4,
+                              "The 1st successful data packet on link 1 should have a TID of 4");
+        std::advance(successRecordLink1It, 1);
+        NS_TEST_ASSERT_MSG_EQ(successRecordLink1It->m_tid,
+                              4,
+                              "The 2nd successful data packet on link 1 should have a TID of 4");
+        failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
+        NS_TEST_ASSERT_MSG_EQ(failureRecordIt->m_tid,
+                              3,
+                              "The failed data packet on link 0 should have a TID of 3");
+        std::advance(failureRecordIt, 1);
+        NS_TEST_ASSERT_MSG_EQ(failureRecordIt->m_tid,
+                              4,
+                              "The failed data packet on link 1 should have a TID of 4");
+
+        successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
+        NS_TEST_ASSERT_MSG_EQ(
+            successRecordLink0It->m_mpduSeqNum,
+            0,
+            "The 1st successful data packet on link 0 should have a Seq Num of 0");
+        std::advance(successRecordLink0It, 1);
+        NS_TEST_ASSERT_MSG_EQ(
+            successRecordLink0It->m_mpduSeqNum,
+            1,
+            "The 2nd successful data packet on link 0 should have a Seq Num of 1");
+        successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
+        NS_TEST_ASSERT_MSG_EQ(
+            successRecordLink1It->m_mpduSeqNum,
+            0,
+            "The 1st successful data packet on link 1 should have a Seq Num of 0");
+        std::advance(successRecordLink1It, 1);
+        NS_TEST_ASSERT_MSG_EQ(
+            successRecordLink1It->m_mpduSeqNum,
+            2,
+            "The 2nd successful data packet on link 1 should have a Seq Num of 2");
+        failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
+        NS_TEST_ASSERT_MSG_EQ(failureRecordIt->m_mpduSeqNum,
+                              2,
+                              "The failed data packet on link 0 should have a Seq Num of 2");
+        std::advance(failureRecordIt, 1);
+        NS_TEST_ASSERT_MSG_EQ(failureRecordIt->m_mpduSeqNum,
+                              1,
+                              "The failed data packet on link 1 should have a Seq Num of 1");
+
+        successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
+        NS_TEST_ASSERT_MSG_EQ(successRecordLink0It->m_txStartTime.IsStrictlyPositive(),
+                              true,
+                              "The 1st successful data packet on link 0 should have been TXed");
+        std::advance(successRecordLink0It, 1);
+        NS_TEST_ASSERT_MSG_EQ(successRecordLink0It->m_txStartTime.IsStrictlyPositive(),
+                              true,
+                              "The 2nd successful data packet on link 0 should have been TXed");
+        successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
+        NS_TEST_ASSERT_MSG_EQ(successRecordLink1It->m_txStartTime.IsStrictlyPositive(),
+                              true,
+                              "The 1st successful data packet on link 1 should have been TXed");
+        std::advance(successRecordLink1It, 1);
+        NS_TEST_ASSERT_MSG_EQ(successRecordLink1It->m_txStartTime.IsStrictlyPositive(),
+                              true,
+                              "The 2nd successful data packet on link 1 should have been TXed");
+        failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
+        NS_TEST_ASSERT_MSG_EQ(failureRecordIt->m_txStartTime.IsStrictlyPositive(),
+                              true,
+                              "The failed data packet on link 0 should have been TXed");
+        std::advance(failureRecordIt, 1);
+        NS_TEST_ASSERT_MSG_EQ(failureRecordIt->m_txStartTime.IsStrictlyPositive(),
+                              true,
+                              "The failed data packet on link 1 should have been TXed");
+
+        successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
+        NS_TEST_ASSERT_MSG_EQ(successRecordLink0It->m_ackTime.IsStrictlyPositive(),
+                              true,
+                              "The 1st successful data packet on link 0 should have been acked");
+        std::advance(successRecordLink0It, 1);
+        NS_TEST_ASSERT_MSG_EQ(successRecordLink0It->m_ackTime.IsStrictlyPositive(),
+                              true,
+                              "The 2nd successful data packet on link 0 should have been acked");
+        successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
+        NS_TEST_ASSERT_MSG_EQ(successRecordLink1It->m_ackTime.IsStrictlyPositive(),
+                              true,
+                              "The 1st successful data packet on link 1 should have been acked");
+        std::advance(successRecordLink1It, 1);
+        NS_TEST_ASSERT_MSG_EQ(successRecordLink1It->m_ackTime.IsStrictlyPositive(),
+                              true,
+                              "The 2nd successful data packet on link 1 should have been acked");
+        failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
+        NS_TEST_ASSERT_MSG_EQ(failureRecordIt->m_ackTime.IsStrictlyPositive(),
+                              false,
+                              "The failed data packet on link 0 should not have been acked");
+        std::advance(failureRecordIt, 1);
+        NS_TEST_ASSERT_MSG_EQ(failureRecordIt->m_ackTime.IsStrictlyPositive(),
+                              false,
+                              "The failed data packet on link 1 should not have been acked");
+
+        successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
+        NS_TEST_ASSERT_MSG_EQ(successRecordLink0It->m_ackTime.IsStrictlyPositive(),
+                              true,
+                              "The 1st successful data packet on link 0 should have been dequeued");
+        std::advance(successRecordLink0It, 1);
+        NS_TEST_ASSERT_MSG_EQ(successRecordLink0It->m_ackTime.IsStrictlyPositive(),
+                              true,
+                              "The 2nd successful data packet on link 0 should have been dequeued");
+        successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
+        NS_TEST_ASSERT_MSG_EQ(successRecordLink1It->m_ackTime.IsStrictlyPositive(),
+                              true,
+                              "The 1st successful data packet on link 1 should have been dequeued");
+        std::advance(successRecordLink1It, 1);
+        NS_TEST_ASSERT_MSG_EQ(successRecordLink1It->m_ackTime.IsStrictlyPositive(),
+                              true,
+                              "The 2nd successful data packet on link 1 should have been dequeued");
+        failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
+        NS_TEST_ASSERT_MSG_EQ(failureRecordIt->m_dropTime.has_value() &&
+                                  failureRecordIt->m_dropReason.has_value(),
+                              true,
+                              "Missing drop time or reason");
+        NS_TEST_ASSERT_MSG_EQ(failureRecordIt->m_dropTime.value().IsStrictlyPositive(),
+                              true,
+                              "The failed data packet on link 0 should have been dequeued");
+        NS_TEST_ASSERT_MSG_EQ(failureRecordIt->m_dropReason.value(),
+                              WifiMacDropReason::WIFI_MAC_DROP_QOS_OLD_PACKET,
+                              "Wrong drop reason");
+        std::advance(failureRecordIt, 1);
+        NS_TEST_ASSERT_MSG_EQ(failureRecordIt->m_dropTime.has_value() &&
+                                  failureRecordIt->m_dropReason.has_value(),
+                              true,
+                              "Missing drop time or reason");
+        NS_TEST_ASSERT_MSG_EQ(failureRecordIt->m_dropTime.value().IsStrictlyPositive(),
+                              true,
+                              "The failed data packet on link 1 should have been dequeued");
+        NS_TEST_ASSERT_MSG_EQ(failureRecordIt->m_dropReason.value(),
+                              WifiMacDropReason::WIFI_MAC_DROP_QOS_OLD_PACKET,
+                              "Wrong drop reason");
+
+        successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
+        auto successRecordLink0ItNext = successRecordLink0It;
+        std::advance(successRecordLink0ItNext, 1);
+        failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
+        NS_TEST_ASSERT_MSG_EQ(successRecordLink0It->m_enqueueTime,
+                              successRecordLink0ItNext->m_enqueueTime,
+                              "Packets on link 0 should be enqueued at the same time");
+        NS_TEST_ASSERT_MSG_EQ(successRecordLink0It->m_enqueueTime,
+                              failureRecordIt->m_enqueueTime,
+                              "Packets on link 0 should be enqueued at the same time");
+        successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
+        auto successRecordLink1ItNext = successRecordLink1It;
+        std::advance(successRecordLink1ItNext, 1);
+        std::advance(failureRecordIt, 1);
+        NS_TEST_ASSERT_MSG_EQ(successRecordLink1It->m_enqueueTime,
+                              successRecordLink1ItNext->m_enqueueTime,
+                              "Packets on link 1 should be enqueued at the same time");
+        NS_TEST_ASSERT_MSG_EQ(successRecordLink1It->m_enqueueTime,
+                              failureRecordIt->m_enqueueTime,
+                              "Packets on link 1 should be enqueued at the same time");
+
+        successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
+        NS_TEST_ASSERT_MSG_GT_OR_EQ(successRecordLink0It->m_txStartTime,
+                                    successRecordLink0It->m_enqueueTime,
+                                    "The 1st data packet on link 0 should be TXed after enqueued");
+        std::advance(successRecordLink0It, 1);
+        NS_TEST_ASSERT_MSG_GT_OR_EQ(successRecordLink0It->m_txStartTime,
+                                    successRecordLink0It->m_enqueueTime,
+                                    "The 2nd data packet on link 0 should be TXed after enqueued");
+        successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
+        NS_TEST_ASSERT_MSG_GT_OR_EQ(successRecordLink1It->m_txStartTime,
+                                    successRecordLink1It->m_enqueueTime,
+                                    "The 1st data packet on link 1 should be TXed after enqueued");
+        std::advance(successRecordLink1It, 1);
+        NS_TEST_ASSERT_MSG_GT_OR_EQ(successRecordLink1It->m_txStartTime,
+                                    successRecordLink1It->m_enqueueTime,
+                                    "The 2nd data packet on link 1 should be TXed after enqueued");
+        failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
+        NS_TEST_ASSERT_MSG_GT_OR_EQ(failureRecordIt->m_txStartTime,
+                                    failureRecordIt->m_enqueueTime,
+                                    "The 3rd data packet on link 0 should be TXed after enqueued");
+        std::advance(failureRecordIt, 1);
+        NS_TEST_ASSERT_MSG_GT_OR_EQ(failureRecordIt->m_txStartTime,
+                                    failureRecordIt->m_enqueueTime,
+                                    "The 3rd data packet on link 1 should be TXed after enqueued");
+
+        successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
+        NS_TEST_ASSERT_MSG_GT_OR_EQ(successRecordLink0It->m_txStartTime,
+                                    m_txStartTimes[0][11] + m_durations[0][11] + m_aifss[0],
+                                    "link 0 pkt first tx should be after the 11th packet on link");
+        NS_TEST_ASSERT_MSG_LT_OR_EQ(successRecordLink0It->m_txStartTime,
+                                    m_txStartTimes[0][11] + m_durations[0][11] + m_aifss[0] +
+                                        tolerance + m_cwMins[0] * m_slot,
+                                    "link 0 pkt first backoff should not exceed cwMin");
+        successRecordLink0ItNext = successRecordLink0It;
+        std::advance(successRecordLink0ItNext, 1);
+        failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
+        NS_TEST_ASSERT_MSG_EQ(successRecordLink0It->m_txStartTime,
+                              successRecordLink0ItNext->m_txStartTime,
+                              "3 pkts of link 0 should tx at the same time");
+        NS_TEST_ASSERT_MSG_EQ(successRecordLink0It->m_txStartTime,
+                              failureRecordIt->m_txStartTime,
+                              "3 pkts of link 0 should tx at the same time");
+
+        successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
+        NS_TEST_ASSERT_MSG_GT_OR_EQ(successRecordLink1It->m_txStartTime,
+                                    m_txStartTimes[1][10] + m_durations[1][10] + m_aifss[1],
+                                    "link 1 pkt first tx should be after the 10th packet on link");
+        NS_TEST_ASSERT_MSG_LT_OR_EQ(successRecordLink1It->m_txStartTime,
+                                    m_txStartTimes[1][10] + m_durations[1][10] + m_aifss[1] +
+                                        tolerance + m_cwMins[1] * m_slot,
+                                    "link 1 pkt first backoff should not exceed cwMin");
+        successRecordLink1ItNext = successRecordLink1It;
+        std::advance(successRecordLink1ItNext, 1);
+        failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
+        std::advance(failureRecordIt, 1);
+        NS_TEST_ASSERT_MSG_EQ(successRecordLink1It->m_txStartTime,
+                              successRecordLink1ItNext->m_txStartTime,
+                              "3 pkts of link 1 should tx at the same time");
+        NS_TEST_ASSERT_MSG_EQ(successRecordLink1It->m_txStartTime,
+                              failureRecordIt->m_txStartTime,
+                              "3 pkts of link 1 should tx at the same time");
+
+        successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
+        NS_TEST_ASSERT_MSG_GT_OR_EQ(successRecordLink0It->m_ackTime,
+                                    m_txStartTimes[0][12] + m_durations[0][12] + m_sifs +
+                                        m_durations[0][13],
+                                    "Wrong first Block Ack reception time on link 0");
+        NS_TEST_ASSERT_MSG_LT_OR_EQ(successRecordLink0It->m_ackTime,
+                                    m_txStartTimes[0][12] + m_durations[0][12] + m_sifs +
+                                        m_durations[0][13] + 2 * tolerance,
+                                    "Wrong first Block Ack reception time on link 0");
+        successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
+        NS_TEST_ASSERT_MSG_GT_OR_EQ(successRecordLink1It->m_ackTime,
+                                    m_txStartTimes[1][11] + m_durations[1][11] + m_sifs +
+                                        m_durations[1][12],
+                                    "Wrong first Block Ack reception time on link 1");
+        NS_TEST_ASSERT_MSG_LT_OR_EQ(successRecordLink1It->m_ackTime,
+                                    m_txStartTimes[1][11] + m_durations[1][11] + m_sifs +
+                                        m_durations[1][12] + 2 * tolerance,
+                                    "Wrong first Block Ack reception time on link 1");
+
+        successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
+        std::advance(successRecordLink0It, 1);
+        NS_TEST_ASSERT_MSG_GT_OR_EQ(successRecordLink0It->m_ackTime,
+                                    m_txStartTimes[0][14] + m_durations[0][14] + m_sifs +
+                                        m_durations[0][15],
+                                    "Wrong second Block Ack reception time on link 0");
+        NS_TEST_ASSERT_MSG_LT_OR_EQ(successRecordLink0It->m_ackTime,
+                                    m_txStartTimes[0][14] + m_durations[0][14] + m_sifs +
+                                        m_durations[0][15] + 2 * tolerance,
+                                    "Wrong second Block Ack reception time on link 0");
+        successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
+        std::advance(successRecordLink1It, 1);
+        NS_TEST_ASSERT_MSG_GT_OR_EQ(successRecordLink1It->m_ackTime,
+                                    m_txStartTimes[1][13] + m_durations[1][13] + m_sifs +
+                                        m_durations[1][14],
+                                    "Wrong second Block Ack reception time on link 1");
+        NS_TEST_ASSERT_MSG_LT_OR_EQ(successRecordLink1It->m_ackTime,
+                                    m_txStartTimes[1][13] + m_durations[1][13] + m_sifs +
+                                        m_durations[1][14] + 2 * tolerance,
+                                    "Wrong second Block Ack reception time on link 1");
+    }
+}
+
+/**
+ * @ingroup wifi-test
+ * @ingroup tests
+ *
+ * @brief WifiTxStatsHelper Test Suite
+ */
+class WifiTxStatsHelperTestSuite : public TestSuite
+{
+  public:
+    WifiTxStatsHelperTestSuite();
+};
+
+WifiTxStatsHelperTestSuite::WifiTxStatsHelperTestSuite()
+    : TestSuite("wifi-tx-stats-helper", Type::UNIT)
+{
+    // A test case to evaluate the transmission process of multiple Wi-Fi MAC Layer MPDUs in
+    // a single link device. This testcase uses .11a to test the handling of regular ACKs.
+    //
+    // This class tests the WifiTxStatsHelper output by creating three transmission cases:
+    // 1) packet is sent successfully on the first try
+    // 2) packet is lost on the first try but successfully transmitted on the second try
+    // 3) packet is lost on all seven tries and a failure is logged
+    // The MPDU losses are forced by the use of WifiPhy post-reception error model.
+    //
+    // This test also connects to the PHY trace PhyTxPsduBegin and records the sequence of
+    // transmission times and packet durations observed at the PHY layer, to cross-check against
+    // the times recorded in the WifiTxStatsHelper record (traced at the MAC layer).
+    // The testcase also checks the various fields in this helper's output records for correctness.
+    AddTestCase(new WifiTxStatsHelperTest("Check single link non-QoS configuration",
+                                          WifiTxStatsHelperTest::SINGLE_LINK_NON_QOS),
+                TestCase::Duration::QUICK);
+
+    // A test case to evaluate the transmission process of multiple Wi-Fi MAC Layer MPDUs in
+    // a multi link device. This testcase, unlike the previous, uses .11be to test the
+    // handling of MPDU aggregation, Block ACKs, and Multi-Link Operation.
+    //
+    // This class tests the WifiTxStatsHelper output by creating three transmission cases:
+    // 1) packet is sent successfully on the first try
+    // 2) packet is lost on the first try (in an A-MPDU) but successfully transmitted on the
+    // second try (also in an A-MPDU)
+    // 3) packet is lost on all 9 tries (first 2 in A-MPDU, other 7 alone) and a failure is logged
+    // The MPDU losses are forced by the use of WifiPhy post-reception error model.
+    //
+    // This test also connects to the PHY trace PhyTxPsduBegin and records the sequence of
+    // transmission times and packet durations observed at the PHY layer, to cross-check against
+    // the times recorded in the WifiTxStatsHelper record (traced at the MAC layer).
+    // The testcase also checks the various fields in this helper's output records for correctness.
+    AddTestCase(new WifiTxStatsHelperTest("Check multi-link QoS configuration",
+                                          WifiTxStatsHelperTest::MULTI_LINK_QOS),
+                TestCase::Duration::QUICK);
+}
+
+static WifiTxStatsHelperTestSuite g_wifiTxStatsHelperTestSuite; //!< the test suite
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/helper/wimax-helper.cc ns-3.44/src/wimax/helper/wimax-helper.cc
--- ns-3.43/src/wimax/helper/wimax-helper.cc	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/helper/wimax-helper.cc	2025-03-09 16:55:49.815372700 -0700
@@ -618,9 +618,9 @@
 }
 
 /**
- * \brief print pcap record
- * \param file pcap file
- * \param burst packet burst to print
+ * @brief print pcap record
+ * @param file pcap file
+ * @param burst packet burst to print
  */
 static void
 PcapSniffTxRxEvent(Ptr<PcapFileWrapper> file, Ptr<const PacketBurst> burst)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/helper/wimax-helper.h ns-3.44/src/wimax/helper/wimax-helper.h
--- ns-3.43/src/wimax/helper/wimax-helper.h	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/helper/wimax-helper.h	2025-03-09 16:55:49.815372700 -0700
@@ -37,7 +37,7 @@
 class UplinkScheduler;
 
 /**
- * \brief helps to manage and create WimaxNetDevice objects
+ * @brief helps to manage and create WimaxNetDevice objects
  *
  * This class can help to create a large set of similar
  * WimaxNetDevice objects and to configure their attributes
@@ -80,18 +80,18 @@
     };
 
     /**
-     * \brief Create a Wimax helper in an empty state.
+     * @brief Create a Wimax helper in an empty state.
      */
     WimaxHelper();
     ~WimaxHelper() override;
     /**
-     * \brief Enable ascii trace output on the indicated net device for a given connection
-     * \param oss The output stream object to use when logging ascii traces.
-     * \param nodeid the id of the node for which you want to enable tracing.
-     * \param deviceid the id of the net device for which you want to enable tracing.
-     * \param netdevice the type of net device for which you want to enable tracing
+     * @brief Enable ascii trace output on the indicated net device for a given connection
+     * @param oss The output stream object to use when logging ascii traces.
+     * @param nodeid the id of the node for which you want to enable tracing.
+     * @param deviceid the id of the net device for which you want to enable tracing.
+     * @param netdevice the type of net device for which you want to enable tracing
      * (SubscriberStationNetDevice, BaseStationNetDevice or WimaxNetDevice)
-     * \param connection the connection for which you want to enable tracing
+     * @param connection the connection for which you want to enable tracing
      * (InitialRangingConnection, BroadcastConnection, BasicConnection, PrimaryConnection).
      */
     static void EnableAsciiForConnection(Ptr<OutputStreamWrapper> oss,
@@ -101,16 +101,16 @@
                                          char* connection);
 
     /**
-     * \param phyType WiMAX Physical layer type
-     * \return WiMAX Phy object
+     * @param phyType WiMAX Physical layer type
+     * @return WiMAX Phy object
      *
      * Creates a physical layer object to be used in simulation.
      */
     Ptr<WimaxPhy> CreatePhy(PhyType phyType);
 
     /**
-     * \param schedulerType Scheduling mechanism
-     * \return Uplink scheduler
+     * @param schedulerType Scheduling mechanism
+     * @return Uplink scheduler
      *
      * Creates a uplink scheduler to be used by base station
      * according to selected scheduling mechanism.
@@ -118,8 +118,8 @@
     Ptr<UplinkScheduler> CreateUplinkScheduler(SchedulerType schedulerType);
 
     /**
-     * \param schedulerType Scheduling mechanism
-     * \return Downlink scheduler
+     * @param schedulerType Scheduling mechanism
+     * @return Downlink scheduler
      *
      * Creates a downlink scheduler to be used by base station
      * according to selected scheduling mechanism.
@@ -127,11 +127,11 @@
     Ptr<BSScheduler> CreateBSScheduler(SchedulerType schedulerType);
 
     /**
-     * \param c a set of nodes
-     * \param type device type to create
-     * \param phyType a phy to use
-     * \param schedulerType the type of the scheduling algorithm to install
-     * \return NetDeviceContainer
+     * @param c a set of nodes
+     * @param type device type to create
+     * @param phyType a phy to use
+     * @param schedulerType the type of the scheduling algorithm to install
+     * @return NetDeviceContainer
      *
      * For each of the input nodes, a new WiMAX net device (either
      * ns3::SubscriberStationNetDevice or ns3::BaseStationNetDevice
@@ -143,12 +143,12 @@
                                SchedulerType schedulerType);
 
     /**
-     * \param c A set of nodes.
-     * \param deviceType Device type to create.
-     * \param phyType PHY type to create.
-     * \param channel A channel to use.
-     * \param schedulerType The scheduling mechanism.
-     * \return NetDeviceContainer
+     * @param c A set of nodes.
+     * @param deviceType Device type to create.
+     * @param phyType PHY type to create.
+     * @param channel A channel to use.
+     * @param schedulerType The scheduling mechanism.
+     * @return NetDeviceContainer
      *
      * For each of the input nodes, a new WiMAX net device (either
      * ns3::SubscriberStationNetDevice or ns3::BaseStationNetDevice
@@ -160,12 +160,12 @@
                                Ptr<WimaxChannel> channel,
                                SchedulerType schedulerType);
     /**
-     * \param c A set of nodes.
-     * \param deviceType Device type to create.
-     * \param phyType PHY type to create.
-     * \param schedulerType The scheduling mechanism.
-     * \param frameDuration the farme duration in seconds
-     * \return NetDeviceContainer
+     * @param c A set of nodes.
+     * @param deviceType Device type to create.
+     * @param phyType PHY type to create.
+     * @param schedulerType The scheduling mechanism.
+     * @param frameDuration the farme duration in seconds
+     * @return NetDeviceContainer
      *
      * For each of the input nodes, a new WiMAX net device (either
      * ns3::SubscriberStationNetDevice or ns3::BaseStationNetDevice
@@ -178,25 +178,25 @@
                                double frameDuration);
 
     /**
-     * \brief Set the propagation and loss model of the channel. By default the channel
+     * @brief Set the propagation and loss model of the channel. By default the channel
      *  uses a COST231 propagation and loss model.
-     * \param propagationModel The propagation and loss model to set
+     * @param propagationModel The propagation and loss model to set
      */
     void SetPropagationLossModel(SimpleOfdmWimaxChannel::PropModel propagationModel);
 
     /**
-     * \param phyType WiMAX Physical layer type
-     * \return WiMAX Phy object
+     * @param phyType WiMAX Physical layer type
+     * @return WiMAX Phy object
      *
      * Creates a physical layer without a channel
      */
     Ptr<WimaxPhy> CreatePhyWithoutChannel(PhyType phyType);
 
     /**
-     * \param phyType WiMAX Physical layer type
-     * \param SNRTraceFilePath of the repository containing the SNR traces files
-     * \param activateLoss set to 1 to activate losses 0 otherwise
-     * \return WiMAX Phy object
+     * @param phyType WiMAX Physical layer type
+     * @param SNRTraceFilePath of the repository containing the SNR traces files
+     * @param activateLoss set to 1 to activate losses 0 otherwise
+     * @return WiMAX Phy object
      *
      * Creates a physical layer without creating a channel
      */
@@ -205,21 +205,21 @@
                                           bool activateLoss);
 
     /**
-     * \param phyType WiMAX Physical layer type
-     * \param SNRTraceFilePath the path to the repository containing the SNR traces files
-     * \param activateLoss set to 1 if you want ton activate losses 0 otherwise
-     * \return WiMAX Phy object
+     * @param phyType WiMAX Physical layer type
+     * @param SNRTraceFilePath the path to the repository containing the SNR traces files
+     * @param activateLoss set to 1 if you want ton activate losses 0 otherwise
+     * @return WiMAX Phy object
      *
      * Creates a physical layer
      */
     Ptr<WimaxPhy> CreatePhy(PhyType phyType, char* SNRTraceFilePath, bool activateLoss);
     /**
-     * \param node Node to be installed.
-     * \param deviceType Device type to create.
-     * \param phyType PHY type to create.
-     * \param channel A channel to use.
-     * \param schedulerType The scheduling mechanism to install on the device.
-     * \return Ptr<WimaxNetDevice>
+     * @param node Node to be installed.
+     * @param deviceType Device type to create.
+     * @param phyType PHY type to create.
+     * @param channel A channel to use.
+     * @param schedulerType The scheduling mechanism to install on the device.
+     * @return Ptr<WimaxNetDevice>
      *
      * For each of the input nodes, a new WiMAX net device (either
      * ns3::SubscriberStationNetDevice or ns3::BaseStationNetDevice
@@ -232,11 +232,11 @@
                                 SchedulerType schedulerType);
 
     /**
-     * \brief Creates a transport service flow.
-     * \param direction the direction of the service flow: UP or DOWN.
-     * \param schedulingType The service scheduling type to be used: UGS, RTPS, NRTPS, BE
-     * \param classifier The classifier to be used for this service flow
-     * \return ServiceFlow
+     * @brief Creates a transport service flow.
+     * @param direction the direction of the service flow: UP or DOWN.
+     * @param schedulingType The service scheduling type to be used: UGS, RTPS, NRTPS, BE
+     * @param classifier The classifier to be used for this service flow
+     * @return ServiceFlow
      *
      */
     ServiceFlow CreateServiceFlow(ServiceFlow::Direction direction,
@@ -253,8 +253,8 @@
      * used by this model.  Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream);
 
@@ -264,20 +264,20 @@
      * have been assigned. The Install() method should have previously been
      * called by the user.
      *
-     * \param c NetDeviceContainer of the set of net devices for which the
+     * @param c NetDeviceContainer of the set of net devices for which the
      *          WimaxNetDevice 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
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this helper
      */
     int64_t AssignStreams(NetDeviceContainer c, int64_t stream);
 
   private:
     /**
      * ASCII trace receive event
-     * \param stream the output stream
-     * \param path the path name
-     * \param packet the packet
-     * \param source the source MAC address
+     * @param stream the output stream
+     * @param path the path name
+     * @param packet the packet
+     * @param source the source MAC address
      */
     static void AsciiRxEvent(Ptr<OutputStreamWrapper> stream,
                              std::string path,
@@ -285,25 +285,25 @@
                              const Mac48Address& source);
     /**
      * ASCII trace transmit event
-     * \param stream the output stream
-     * \param path the path
-     * \param packet the packet
-     * \param dest the destination MAC address
+     * @param stream the output stream
+     * @param path the path
+     * @param packet the packet
+     * @param dest the destination MAC address
      */
     static void AsciiTxEvent(Ptr<OutputStreamWrapper> stream,
                              std::string path,
                              Ptr<const Packet> packet,
                              const Mac48Address& dest);
     /**
-     * \brief Enable pcap output on the indicated net device.
+     * @brief Enable pcap output on the indicated net device.
      *
      * NetDevice-specific implementation mechanism for hooking the trace and
      * writing to the trace file.
      *
-     * \param prefix Filename prefix to use for pcap files.
-     * \param nd Net device for which you want to enable tracing.
-     * \param explicitFilename Treat the prefix as an explicit filename if true
-     * \param promiscuous If true capture all possible packets available at the device.
+     * @param prefix Filename prefix to use for pcap files.
+     * @param nd Net device for which you want to enable tracing.
+     * @param explicitFilename Treat the prefix as an explicit filename if true
+     * @param promiscuous If true capture all possible packets available at the device.
      */
     void EnablePcapInternal(std::string prefix,
                             Ptr<NetDevice> nd,
@@ -311,15 +311,15 @@
                             bool promiscuous) override;
 
     /**
-     * \brief Enable ascii trace output on the indicated net device.
+     * @brief Enable ascii trace output on the indicated net device.
      *
      * NetDevice-specific implementation mechanism for hooking the trace and
      * writing to the trace file.
      *
-     * \param stream The output stream object to use when logging ascii traces.
-     * \param prefix Filename prefix to use for ascii trace files.
-     * \param nd Net device for which you want to enable tracing.
-     * \param explicitFilename Treat the prefix as an explicit filename if true
+     * @param stream The output stream object to use when logging ascii traces.
+     * @param prefix Filename prefix to use for ascii trace files.
+     * @param nd Net device for which you want to enable tracing.
+     * @param explicitFilename Treat the prefix as an explicit filename if true
      */
     void EnableAsciiInternal(Ptr<OutputStreamWrapper> stream,
                              std::string prefix,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/bandwidth-manager.h ns-3.44/src/wimax/model/bandwidth-manager.h
--- ns-3.43/src/wimax/model/bandwidth-manager.h	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/bandwidth-manager.h	2025-03-09 16:55:49.815372700 -0700
@@ -32,8 +32,8 @@
 class UplinkScheduler;
 
 /**
- * \ingroup wimax
- * \brief This class manage the bandwidth request and grant mechanism.
+ * @ingroup wimax
+ * @brief This class manage the bandwidth request and grant mechanism.
  * The bandwidth request and grant mechanism is supported by the Bandwidth
  * Manager. Both BS and SS maintain a bandwidth manager. Furthermore BS's
  * bandwidth manager works together with the uplink scheduler to determine
@@ -46,14 +46,14 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     /**
      * Constructor
      *
-     * \param device WIMAX device
+     * @param device WIMAX device
      */
     BandwidthManager(Ptr<WimaxNetDevice> device);
     ~BandwidthManager() override;
@@ -66,33 +66,33 @@
 
     /**
      * Calculate allocation size function
-     * \param ssRecord the SS record
-     * \param serviceFlow the service flow
-     * \returns the allocation size
+     * @param ssRecord the SS record
+     * @param serviceFlow the service flow
+     * @returns the allocation size
      */
     uint32_t CalculateAllocationSize(const SSRecord* ssRecord, const ServiceFlow* serviceFlow);
     /**
      * Select flow for request function
-     * \param bytesToRequest bytes to request
-     * \returns a service flow
+     * @param bytesToRequest bytes to request
+     * @returns a service flow
      */
     ServiceFlow* SelectFlowForRequest(uint32_t& bytesToRequest);
     /**
      * Send bandwidth request
-     * \param uiuc the UIUC
-     * \param allocationSize the allocation size
+     * @param uiuc the UIUC
+     * @param allocationSize the allocation size
      */
     void SendBandwidthRequest(uint8_t uiuc, uint16_t allocationSize);
     /**
      * Process bandwidth request
-     * \param bwRequestHdr the bandwidth request
+     * @param bwRequestHdr the bandwidth request
      */
     void ProcessBandwidthRequest(const BandwidthRequestHeader& bwRequestHdr);
     /// Set subframe ratio
     void SetSubframeRatio();
     /**
      * Get symbols per frame allocated
-     * \returns the symbols per the frame allocated
+     * @returns the symbols per the frame allocated
      */
     uint32_t GetSymbolsPerFrameAllocated();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/bs-link-manager.cc ns-3.44/src/wimax/model/bs-link-manager.cc
--- ns-3.43/src/wimax/model/bs-link-manager.cc	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/bs-link-manager.cc	2025-03-09 16:55:49.815372700 -0700
@@ -66,7 +66,7 @@
     NS_ASSERT_MSG(m_bs->GetState() == BaseStationNetDevice::BS_STATE_UL_SUB_FRAME,
                   "Base station: Error while processing ranging request: !BS_STATE_UL_SUB_FRAME");
 
-    Time irIntervalBoundary = Seconds(0);
+    Time irIntervalBoundary;
 
     if (m_bs->GetUplinkScheduler()->GetIsInvIrIntrvlAllocated())
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/bs-link-manager.h ns-3.44/src/wimax/model/bs-link-manager.h
--- ns-3.43/src/wimax/model/bs-link-manager.h	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/bs-link-manager.h	2025-03-09 16:55:49.815372700 -0700
@@ -24,7 +24,7 @@
 {
 
 /**
- * \ingroup wimax
+ * @ingroup wimax
  *
  * BaseStation Link Manager
  */
@@ -32,14 +32,14 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     /**
      * Constructor
      *
-     * \param bs base station device
+     * @param bs base station device
      */
     BSLinkManager(Ptr<BaseStationNetDevice> bs);
     ~BSLinkManager() override;
@@ -49,106 +49,106 @@
     BSLinkManager& operator=(const BSLinkManager&) = delete;
 
     /**
-     * \return the ranging opportunities to allocate
+     * @return the ranging opportunities to allocate
      */
     uint8_t CalculateRangingOppsToAllocate();
     /**
-     * \return an available downlink channel
+     * @return an available downlink channel
      */
     uint64_t SelectDlChannel();
     /**
-     * \brief process a ranging request message
-     * \param cid the connection identifier in which the ranging message was received
-     * \param rngreq the ranging request message
+     * @brief process a ranging request message
+     * @param cid the connection identifier in which the ranging message was received
+     * @param rngreq the ranging request message
      */
 
     void ProcessRangingRequest(Cid cid, RngReq rngreq);
     /**
-     * \brief Verifies at the end of an invited ranging interval if SS sent ranging message in it or
+     * @brief Verifies at the end of an invited ranging interval if SS sent ranging message in it or
      * not
-     * \param cid the connection identifier in which the ranging message was received
-     * \param uiuc the ranging
+     * @param cid the connection identifier in which the ranging message was received
+     * @param uiuc the ranging
      */
     void VerifyInvitedRanging(Cid cid, uint8_t uiuc);
 
   private:
     /**
      * Perform ranging function
-     * \param cid the CID
-     * \param rngreq the ranging request
+     * @param cid the CID
+     * @param rngreq the ranging request
      */
     void PerformRanging(Cid cid, RngReq rngreq);
     /**
      * Perform initial ranging function
-     * \param cid the CID
-     * \param rngreq the ranging request
-     * \param rngrsp the ranging response
+     * @param cid the CID
+     * @param rngreq the ranging request
+     * @param rngrsp the ranging response
      */
     void PerformInitialRanging(Cid cid, RngReq* rngreq, RngRsp* rngrsp);
     /**
      * Perform inivted ranging function
-     * \param cid the CID
-     * \param rngrsp the ranging response
+     * @param cid the CID
+     * @param rngrsp the ranging response
      */
     void PerformInvitedRanging(Cid cid, RngRsp* rngrsp);
 
     /**
      * Set parameters to adjust function
-     * \param rngrsp the ranging response
+     * @param rngrsp the ranging response
      */
     void SetParametersToAdjust(RngRsp* rngrsp);
     /**
      * Abort ranging function
-     * \param cid the CID
-     * \param rngrsp the ranging response
-     * \param ssRecord the SS record
-     * \param isNewSS true if a new SS
+     * @param cid the CID
+     * @param rngrsp the ranging response
+     * @param ssRecord the SS record
+     * @param isNewSS true if a new SS
      */
     void AbortRanging(Cid cid, RngRsp* rngrsp, SSRecord* ssRecord, bool isNewSS);
     /**
      * Accept ranging function
-     * \param cid the CID
-     * \param rngrsp the ranging response
-     * \param ssRecord the SS record
+     * @param cid the CID
+     * @param rngrsp the ranging response
+     * @param ssRecord the SS record
      */
     void AcceptRanging(Cid cid, RngRsp* rngrsp, SSRecord* ssRecord);
     /**
      * Continue ranging function
-     * \param cid the CID
-     * \param rngrsp the ranging response
-     * \param ssRecord the SS record
+     * @param cid the CID
+     * @param rngrsp the ranging response
+     * @param ssRecord the SS record
      */
     void ContinueRanging(Cid cid, RngRsp* rngrsp, SSRecord* ssRecord);
     /**
      * Schedule range response message function
-     * \param cid the CID
-     * \param rngrsp the ranging response
+     * @param cid the CID
+     * @param rngrsp the ranging response
      */
     void ScheduleRngRspMessage(Cid cid, RngRsp* rngrsp);
     /**
      * Deallocate CIDs function
-     * \param cid the CID
+     * @param cid the CID
      */
     void DeallocateCids(Cid cid);
 
     /**
      * Change DL channel function
-     * \returns true if the DL channel changed
+     * @returns true if the DL channel changed
      */
     bool ChangeDlChannel();
     /**
      * Get new DL channel function
-     * \returns the new DL channel
+     * @returns the new DL channel
      */
     uint32_t GetNewDlChannel();
     /**
      * Get signal quality function
-     * \returns the signal quality
+     * @returns the signal quality
      */
     uint8_t GetSignalQuality();
     /**
      * Is ranging acceptable function
-     * \returns true if ranging is acceptable
+     * @returns true if ranging is acceptable
      */
     bool IsRangingAcceptable();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/bs-net-device.cc ns-3.44/src/wimax/model/bs-net-device.cc
--- ns-3.43/src/wimax/model/bs-net-device.cc	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/bs-net-device.cc	2025-03-09 16:55:49.815372700 -0700
@@ -967,7 +967,7 @@
 void
 BaseStationNetDevice::SendBursts()
 {
-    Time txTime = Seconds(0);
+    Time txTime;
     std::pair<OfdmDlMapIe*, Ptr<PacketBurst>> pair;
     WimaxPhy::ModulationType modulationType = WimaxPhy::MODULATION_TYPE_BPSK_12;
     std::list<std::pair<OfdmDlMapIe*, Ptr<PacketBurst>>>* downlinkBursts =
@@ -1177,11 +1177,9 @@
 BaseStationNetDevice::MarkUplinkAllocations()
 {
     uint16_t symbolsToAllocation = 0;
-    std::list<OfdmUlMapIe> uplinkAllocations = m_uplinkScheduler->GetUplinkAllocations();
-    for (auto iter = uplinkAllocations.begin(); iter != uplinkAllocations.end(); ++iter)
+    const auto& uplinkAllocations = m_uplinkScheduler->GetUplinkAllocations();
+    for (const auto& uplinkAllocation : uplinkAllocations)
     {
-        OfdmUlMapIe uplinkAllocation = *iter;
-
         if (uplinkAllocation.GetUiuc() == OfdmUlBurstProfile::UIUC_END_OF_MAP)
         {
             break;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/bs-net-device.h ns-3.44/src/wimax/model/bs-net-device.h
--- ns-3.43/src/wimax/model/bs-net-device.h	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/bs-net-device.h	2025-03-09 16:55:49.815372700 -0700
@@ -35,7 +35,7 @@
 class BsServiceFlowManager;
 
 /**
- * \ingroup wimax
+ * @ingroup wimax
  *
  * BaseStation NetDevice
  */
@@ -59,25 +59,25 @@
     };
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     BaseStationNetDevice();
     /**
      * Constructor
      *
-     * \param node the node
-     * \param phy the wimax phy
+     * @param node the node
+     * @param phy the wimax phy
      */
     BaseStationNetDevice(Ptr<Node> node, Ptr<WimaxPhy> phy);
     /**
      * Constructor
      *
-     * \param node the node
-     * \param phy the wimax phy
-     * \param uplinkScheduler uplink scheduler
-     * \param bsScheduler bs scheduler
+     * @param node the node
+     * @param phy the wimax phy
+     * @param uplinkScheduler uplink scheduler
+     * @param bsScheduler bs scheduler
      */
     BaseStationNetDevice(Ptr<Node> node,
                          Ptr<WimaxPhy> phy,
@@ -85,314 +85,314 @@
                          Ptr<BSScheduler> bsScheduler);
     ~BaseStationNetDevice() override;
     /**
-     * \param initialRangInterval Time between initial ranging regions assigned by the BS
+     * @param initialRangInterval Time between initial ranging regions assigned by the BS
      */
     void SetInitialRangingInterval(Time initialRangInterval);
     /**
-     * \brief initializes the BS net device and sets its parameters to the default values
+     * @brief initializes the BS net device and sets its parameters to the default values
      */
     void InitBaseStationNetDevice();
     /**
-     * \returns Time between initial ranging regions assigned by the BS
+     * @returns Time between initial ranging regions assigned by the BS
      */
     Time GetInitialRangingInterval() const;
     /**
-     * \param dcdInterval Time between transmission of DCD messages
+     * @param dcdInterval Time between transmission of DCD messages
      */
     void SetDcdInterval(Time dcdInterval);
     /**
-     * \returns the Time between transmission of DCD messages
+     * @returns the Time between transmission of DCD messages
      */
     Time GetDcdInterval() const;
     /**
-     * \param ucdInterval the Time between transmission of UCD messages
+     * @param ucdInterval the Time between transmission of UCD messages
      */
     void SetUcdInterval(Time ucdInterval);
     /**
-     * \returns Time between transmission of UCD messages
+     * @returns Time between transmission of UCD messages
      */
     Time GetUcdInterval() const;
     /**
-     * \param interval the Wait for DSA/DSC Acknowledge timeout
+     * @param interval the Wait for DSA/DSC Acknowledge timeout
      */
     void SetIntervalT8(Time interval);
     /**
-     * \returns the Wait for DSA/DSC Acknowledge timeout
+     * @returns the Wait for DSA/DSC Acknowledge timeout
      */
     Time GetIntervalT8() const;
     /**
-     * \param maxRangCorrectionRetries the number of retries on contention Ranging Requests
+     * @param maxRangCorrectionRetries the number of retries on contention Ranging Requests
      */
     void SetMaxRangingCorrectionRetries(uint8_t maxRangCorrectionRetries);
     /**
-     * \returns the number of retries on contention Ranging Requests
+     * @returns the number of retries on contention Ranging Requests
      */
     uint8_t GetMaxRangingCorrectionRetries() const;
     /**
-     * \param maxInvitedRangRetries the number of retries on contention Ranging
+     * @param maxInvitedRangRetries the number of retries on contention Ranging
      */
     void SetMaxInvitedRangRetries(uint8_t maxInvitedRangRetries);
     /**
-     * \returns the number of retries on contention Ranging
+     * @returns the number of retries on contention Ranging
      */
     uint8_t GetMaxInvitedRangRetries() const;
     /**
-     * \param rangReqOppSize The ranging opportunity size in symbols
+     * @param rangReqOppSize The ranging opportunity size in symbols
      */
     void SetRangReqOppSize(uint8_t rangReqOppSize);
     /**
-     * \returns The ranging opportunity size in symbols
+     * @returns The ranging opportunity size in symbols
      */
     uint8_t GetRangReqOppSize() const;
     /**
-     * \param bwReqOppSize The bandwidth request opportunity size in symbols
+     * @param bwReqOppSize The bandwidth request opportunity size in symbols
      */
     void SetBwReqOppSize(uint8_t bwReqOppSize);
     /**
-     * \returns The bandwidth request opportunity size in symbols
+     * @returns The bandwidth request opportunity size in symbols
      */
     uint8_t GetBwReqOppSize() const;
     /**
-     * \param dlSymbols the number of symbols in the downlink sub-frame
+     * @param dlSymbols the number of symbols in the downlink sub-frame
      */
     void SetNrDlSymbols(uint32_t dlSymbols);
     /**
-     * \returns the number of symbols in the downlink sub-frame
+     * @returns the number of symbols in the downlink sub-frame
      */
     uint32_t GetNrDlSymbols() const;
     /**
-     * \param ulSymbols the number of symbols in the uplink sub-frame
+     * @param ulSymbols the number of symbols in the uplink sub-frame
      */
     void SetNrUlSymbols(uint32_t ulSymbols);
     /**
-     * \returns the number of symbols in the uplink sub-frame
+     * @returns the number of symbols in the uplink sub-frame
      */
     uint32_t GetNrUlSymbols() const;
     /**
-     * \returns the number dcd messages already sent
+     * @returns the number dcd messages already sent
      */
     uint32_t GetNrDcdSent() const;
     /**
-     * \returns the number ucd messages already sent
+     * @returns the number ucd messages already sent
      */
     uint32_t GetNrUcdSent() const;
     /**
-     * \returns the DL subframe start time
+     * @returns the DL subframe start time
      */
     Time GetDlSubframeStartTime() const;
     /**
-     * \returns the UL subframe start time
+     * @returns the UL subframe start time
      */
     Time GetUlSubframeStartTime() const;
     /**
-     * \returns the ranging opp number
+     * @returns the ranging opp number
      */
     uint8_t GetRangingOppNumber() const;
     /**
-     * \returns a pointer to the SS manager
+     * @returns a pointer to the SS manager
      */
     Ptr<SSManager> GetSSManager() const;
     /**
-     * \param ssManager the SS manager to be installed on the BS
+     * @param ssManager the SS manager to be installed on the BS
      */
     void SetSSManager(Ptr<SSManager> ssManager);
     /**
-     * \returns a pointer to the uplink scheduler installed on the device
+     * @returns a pointer to the uplink scheduler installed on the device
      */
     Ptr<UplinkScheduler> GetUplinkScheduler() const;
     /**
-     * \param ulScheduler the ulScheduler to be isnstalled on the BS
+     * @param ulScheduler the ulScheduler to be isnstalled on the BS
      */
     void SetUplinkScheduler(Ptr<UplinkScheduler> ulScheduler);
     /**
-     * \returns a pointer to the link manager installed on the BS
+     * @returns a pointer to the link manager installed on the BS
      */
     Ptr<BSLinkManager> GetLinkManager() const;
     /**
-     * \param bsSchedule the downlink scheduler to be installed on the BS
+     * @param bsSchedule the downlink scheduler to be installed on the BS
      */
     void SetBSScheduler(Ptr<BSScheduler> bsSchedule);
     /**
-     * \returns The BS scheduler installed on the BS
+     * @returns The BS scheduler installed on the BS
      */
     Ptr<BSScheduler> GetBSScheduler() const;
     /**
-     * \param linkManager The link manager installed on the BS
+     * @param linkManager The link manager installed on the BS
      */
     void SetLinkManager(Ptr<BSLinkManager> linkManager);
     /**
-     * \returns a pointer to the classifier installed on the BS
+     * @returns a pointer to the classifier installed on the BS
      */
     Ptr<IpcsClassifier> GetBsClassifier() const;
     /**
-     * \param classifier a classifier to be installed on the BS
+     * @param classifier a classifier to be installed on the BS
      */
     void SetBsClassifier(Ptr<IpcsClassifier> classifier);
 
     /**
-     * \returns PS duration
+     * @returns PS duration
      */
     Time GetPsDuration() const;
     /**
-     * \returns symbol duration
+     * @returns symbol duration
      */
     Time GetSymbolDuration() const;
     /**
-     * \brief Start device
+     * @brief Start device
      */
     void Start() override;
     /**
-     * \brief Stop device
+     * @brief Stop device
      */
     void Stop() override;
     /**
-     * \brief Enqueue a packet into a connection queue
-     * \param packet the packet to be enqueued
-     * \param hdrType the mac header type to be appended to the packet
-     * \param connection the connection to be used
-     * \return true if successful
+     * @brief Enqueue a packet into a connection queue
+     * @param packet the packet to be enqueued
+     * @param hdrType the mac header type to be appended to the packet
+     * @param connection the connection to be used
+     * @return true if successful
      */
     bool Enqueue(Ptr<Packet> packet,
                  const MacHeaderType& hdrType,
                  Ptr<WimaxConnection> connection) override;
     /**
-     * \param cid connection ID
-     * \returns a pointer to the connection
+     * @param cid connection ID
+     * @returns a pointer to the connection
      */
     Ptr<WimaxConnection> GetConnection(Cid cid);
 
     /**
-     * \brief Mark uplink allocations
+     * @brief Mark uplink allocations
      */
     void MarkUplinkAllocations();
     /**
-     * \brief Mark ranging opp start
-     * \param rangingOppStartTime start time
+     * @brief Mark ranging opp start
+     * @param rangingOppStartTime start time
      */
     void MarkRangingOppStart(Time rangingOppStartTime);
     /**
-     * \returns service flow manager
+     * @returns service flow manager
      */
     Ptr<BsServiceFlowManager> GetServiceFlowManager() const;
     /**
-     * \brief Set service flow manager
-     * \param sfm the service flow manager
+     * @brief Set service flow manager
+     * @param sfm the service flow manager
      */
     void SetServiceFlowManager(Ptr<BsServiceFlowManager> sfm);
 
   private:
     void DoDispose() override;
     /**
-     * \brief Start frame function
+     * @brief Start frame function
      */
     void StartFrame();
     /**
-     * \brief Start DL subframe function
+     * @brief Start DL subframe function
      */
     void StartDlSubFrame();
     /**
-     * \brief End DL subframe function
+     * @brief End DL subframe function
      */
     void EndDlSubFrame();
     /**
-     * \brief Start UL subframe function
+     * @brief Start UL subframe function
      */
     void StartUlSubFrame();
     /**
-     * \brief End UL subframe function
+     * @brief End UL subframe function
      */
     void EndUlSubFrame();
     /**
-     * \brief End frame function
+     * @brief End frame function
      */
     void EndFrame();
     /**
-     * \brief Send packet
-     * \param packet to send
-     * \param source MAC address
-     * \param dest destination MAC address
-     * \param protocolNumber protocol number
-     * \returns true if successful
+     * @brief Send packet
+     * @param packet to send
+     * @param source MAC address
+     * @param dest destination MAC address
+     * @param protocolNumber protocol number
+     * @returns true if successful
      */
     bool DoSend(Ptr<Packet> packet,
                 const Mac48Address& source,
                 const Mac48Address& dest,
                 uint16_t protocolNumber) override;
     /**
-     * \brief Receive packet
-     * \param packet to send
+     * @brief Receive packet
+     * @param packet to send
      */
     void DoReceive(Ptr<Packet> packet) override;
     /**
-     * \brief creates the MAC management messages DL-MAP and UL-MAP
+     * @brief creates the MAC management messages DL-MAP and UL-MAP
      */
     void CreateMapMessages();
     /**
-     * \brief creates the channel descriptor MAC management messages DCD and UCD
-     * \param sendDcd true if send DCD
-     * \param sendUcd true if send UCD
+     * @brief creates the channel descriptor MAC management messages DCD and UCD
+     * @param sendDcd true if send DCD
+     * @param sendUcd true if send UCD
      */
     void CreateDescriptorMessages(bool sendDcd, bool sendUcd);
     /**
-     * \brief Send burst function
+     * @brief Send burst function
      */
     void SendBursts();
 
     /**
-     * \brief Create DL map
-     * \returns packet
+     * @brief Create DL map
+     * @returns packet
      */
     Ptr<Packet> CreateDlMap();
     /**
-     * \brief Create DCD
-     * \returns packet
+     * @brief Create DCD
+     * @returns packet
      */
     Ptr<Packet> CreateDcd();
     /**
-     * \brief Create UL map
-     * \returns packet
+     * @brief Create UL map
+     * @returns packet
      */
     Ptr<Packet> CreateUlMap();
     /**
-     * \brief Create UCD
-     * \returns packet
+     * @brief Create UCD
+     * @returns packet
      */
     Ptr<Packet> CreateUcd();
     /**
-     * \brief Send DL burst profiles
-     * \param dcd burst profile
+     * @brief Send DL burst profiles
+     * @param dcd burst profile
      */
     void SetDlBurstProfiles(Dcd* dcd);
     /**
-     * \brief Send UL burst profiles
-     * \param ucd burst profile
+     * @brief Send UL burst profiles
+     * @param ucd burst profile
      */
     void SetUlBurstProfiles(Ucd* ucd);
 
     /**
-     * \brief Mark uplink allocation start
-     * \param allocationStartTime allocation start time
+     * @brief Mark uplink allocation start
+     * @param allocationStartTime allocation start time
      */
     void MarkUplinkAllocationStart(Time allocationStartTime);
     /**
-     * \brief Mark uplink allocation end
-     * \param allocationEndTime allocation end time
-     * \param cid connection ID
-     * \param uiuc
+     * @brief Mark uplink allocation end
+     * @param allocationEndTime allocation end time
+     * @param cid connection ID
+     * @param uiuc
      */
     void MarkUplinkAllocationEnd(Time allocationEndTime, Cid cid, uint8_t uiuc);
     /**
-     * \brief Uplink allocation start
+     * @brief Uplink allocation start
      */
     void UplinkAllocationStart();
     /**
-     * \brief Uplink allocation end
-     * \param cid connection ID
-     * \param uiuc
+     * @brief Uplink allocation end
+     * @param cid connection ID
+     * @param uiuc
      */
     void UplinkAllocationEnd(Cid cid, uint8_t uiuc);
     /**
-     * \brief Ranging opp start
+     * @brief Ranging opp start
      */
     void RangingOppStart();
 
@@ -460,7 +460,7 @@
      * The trace source fired when packets come into the "top" of the device
      * at the L3/L2 transition, before being queued for transmission.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_bsTxTrace; ///< the base station transmit trace callback
 
@@ -468,7 +468,7 @@
      * The trace source fired when packets coming into the "top" of the device
      * are dropped at the MAC layer during transmission.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>>
         m_bsTxDropTrace; ///< base station transmit drop trace callback
@@ -478,7 +478,7 @@
      * immediately before being forwarded up to higher layers (at the L2/L3
      * transition).  This is a promiscuous trace.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>>
         m_bsPromiscRxTrace; ///< base station promiscuous receive trace callback
@@ -488,7 +488,7 @@
      * immediately before being forwarded up to higher layers (at the L2/L3
      * transition).  This is a non- promiscuous trace.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_bsRxTrace; ///< base station receive trace callback
 
@@ -496,7 +496,7 @@
      * The trace source fired when packets coming into the "top" of the device
      * are dropped at the MAC layer during reception.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_bsRxDropTrace; ///< base station receive drop trace callback
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/bs-scheduler.h ns-3.44/src/wimax/model/bs-scheduler.h
--- ns-3.43/src/wimax/model/bs-scheduler.h	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/bs-scheduler.h	2025-03-09 16:55:49.815372700 -0700
@@ -29,7 +29,7 @@
 class Cid;
 
 /**
- * \ingroup wimax
+ * @ingroup wimax
  *
  * BaseStation Scheduler
  */
@@ -40,30 +40,30 @@
     /**
      * Constructor
      *
-     * \param bs base station device
+     * @param bs base station device
      */
     BSScheduler(Ptr<BaseStationNetDevice> bs);
     ~BSScheduler() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief This function returns all the downlink bursts scheduled for the next
+     * @brief This function returns all the downlink bursts scheduled for the next
      * downlink sub-frame
-     * \returns  all the downlink bursts scheduled for the next downlink sub-frame
+     * @returns  all the downlink bursts scheduled for the next downlink sub-frame
      */
     virtual std::list<std::pair<OfdmDlMapIe*, Ptr<PacketBurst>>>* GetDownlinkBursts() const = 0;
     /**
-     * \brief This function adds a downlink burst to the list of downlink bursts
+     * @brief This function adds a downlink burst to the list of downlink bursts
      * scheduled for the next downlink sub-frame
-     * \param connection a pointer to connection in which the burst will be sent
-     * \param diuc downlink iuc
-     * \param modulationType the modulation type of the burst
-     * \param burst the downlink burst to add to the downlink sub frame
+     * @param connection a pointer to connection in which the burst will be sent
+     * @param diuc downlink iuc
+     * @param modulationType the modulation type of the burst
+     * @param burst the downlink burst to add to the downlink sub frame
      */
     virtual void AddDownlinkBurst(Ptr<const WimaxConnection> connection,
                                   uint8_t diuc,
@@ -71,44 +71,44 @@
                                   Ptr<PacketBurst> burst) = 0;
 
     /**
-     * \brief the scheduling function for the downlink subframe.
+     * @brief the scheduling function for the downlink subframe.
      */
     virtual void Schedule() = 0;
     /**
-     * \brief Selects a connection from the list of connections having packets to be sent .
-     * \param connection will point to a connection that have packets to be sent
-     * \returns false if no connection has packets to be sent, true otherwise
+     * @brief Selects a connection from the list of connections having packets to be sent .
+     * @param connection will point to a connection that have packets to be sent
+     * @returns false if no connection has packets to be sent, true otherwise
      */
     virtual bool SelectConnection(Ptr<WimaxConnection>& connection) = 0;
 
     /**
-     * \brief Creates a downlink UGS burst
-     * \param serviceFlow the service flow of the burst
-     * \param modulationType the modulation type to be used for the burst
-     * \param availableSymbols maximum number of OFDM symbols to be used by the burst
-     * \returns a Burst (list of packets)
+     * @brief Creates a downlink UGS burst
+     * @param serviceFlow the service flow of the burst
+     * @param modulationType the modulation type to be used for the burst
+     * @param availableSymbols maximum number of OFDM symbols to be used by the burst
+     * @returns a Burst (list of packets)
      */
     virtual Ptr<PacketBurst> CreateUgsBurst(ServiceFlow* serviceFlow,
                                             WimaxPhy::ModulationType modulationType,
                                             uint32_t availableSymbols) = 0;
 
     /**
-     * \brief Get the base station.
-     * \returns the base station net device
+     * @brief Get the base station.
+     * @returns the base station net device
      */
     virtual Ptr<BaseStationNetDevice> GetBs();
     /**
-     * \brief Set the base station.
-     * \param bs the base station net device
+     * @brief Set the base station.
+     * @param bs the base station net device
      */
     virtual void SetBs(Ptr<BaseStationNetDevice> bs);
 
     /**
-     * \brief Check if the packet fragmentation is possible for transport connection.
-     * \param connection the downlink connection
-     * \param availableSymbols maximum number of OFDM symbols to be used by the burst
-     * \param modulationType the modulation type to be used for the burst
-     * \returns false if packet fragmentation is not possible, true otherwise
+     * @brief Check if the packet fragmentation is possible for transport connection.
+     * @param connection the downlink connection
+     * @param availableSymbols maximum number of OFDM symbols to be used by the burst
+     * @param modulationType the modulation type to be used for the burst
+     * @returns false if packet fragmentation is not possible, true otherwise
      */
     bool CheckForFragmentation(Ptr<WimaxConnection> connection,
                                int availableSymbols,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/bs-scheduler-rtps.cc ns-3.44/src/wimax/model/bs-scheduler-rtps.cc
--- ns-3.43/src/wimax/model/bs-scheduler-rtps.cc	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/bs-scheduler-rtps.cc	2025-03-09 16:55:49.815372700 -0700
@@ -104,7 +104,7 @@
 }
 
 /**
- * \brief A DownLink Scheduler for rtPS Flows
+ * @brief A DownLink Scheduler for rtPS Flows
  *
  * The DL Scheduler assigns the available bandwidth in the following order:
  * - IR Connections
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/bs-scheduler-rtps.h ns-3.44/src/wimax/model/bs-scheduler-rtps.h
--- ns-3.43/src/wimax/model/bs-scheduler-rtps.h	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/bs-scheduler-rtps.h	2025-03-09 16:55:49.815372700 -0700
@@ -30,8 +30,8 @@
 class Cid;
 
 /**
- * \ingroup wimax
- * \brief This class implements a simple downlink scheduler for rtPS flows.
+ * @ingroup wimax
+ * @brief This class implements a simple downlink scheduler for rtPS flows.
  *
  * The DL-rtPS-Scheduler assigns the available bandwidth the service flows
  * in the following order: IR Connections, Broadcast Connections, Basic and
@@ -53,123 +53,123 @@
     /**
      * Constructor
      *
-     * \param bs base station device
+     * @param bs base station device
      */
     BSSchedulerRtps(Ptr<BaseStationNetDevice> bs);
     ~BSSchedulerRtps() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief This function returns all the downlink bursts scheduled for the next
+     * @brief This function returns all the downlink bursts scheduled for the next
      * downlink sub-frame
-     * \returns  all the downlink bursts scheduled for the next downlink sub-frame
+     * @returns  all the downlink bursts scheduled for the next downlink sub-frame
      */
     std::list<std::pair<OfdmDlMapIe*, Ptr<PacketBurst>>>* GetDownlinkBursts() const override;
 
     /**
-     * \brief This function adds a downlink burst to the list of downlink bursts
+     * @brief This function adds a downlink burst to the list of downlink bursts
      * scheduled for the next downlink sub-frame
-     * \param connection a pointer to connection in which the burst will be sent
-     * \param diuc downlink iuc
-     * \param modulationType the modulation type of the burst
-     * \param burst the downlink burst to add to the downlink sub frame
+     * @param connection a pointer to connection in which the burst will be sent
+     * @param diuc downlink iuc
+     * @param modulationType the modulation type of the burst
+     * @param burst the downlink burst to add to the downlink sub frame
      */
     void AddDownlinkBurst(Ptr<const WimaxConnection> connection,
                           uint8_t diuc,
                           WimaxPhy::ModulationType modulationType,
                           Ptr<PacketBurst> burst) override;
     /**
-     * \brief Schedule function.
+     * @brief Schedule function.
      */
     void Schedule() override;
     /**
-     * \brief Check for IR and Broadcast connections that have packets to transmit.
-     * \param connection will point to a initial ranging or broadcast connection
+     * @brief Check for IR and Broadcast connections that have packets to transmit.
+     * @param connection will point to a initial ranging or broadcast connection
      * which have packets to transmit
-     * \returns false if no initial ranging or broadcast connection has packets
+     * @returns false if no initial ranging or broadcast connection has packets
      * to transmit, true otherwise
      */
     bool SelectIRandBCConnection(Ptr<WimaxConnection>& connection);
     /**
-     * \brief Check for Basic and Primary connections that have packets to transmit.
-     * \param connection will point to a basic or primary connection
+     * @brief Check for Basic and Primary connections that have packets to transmit.
+     * @param connection will point to a basic or primary connection
      * which have packets to transmit
-     * \returns false if no basic or primary connection has packets
+     * @returns false if no basic or primary connection has packets
      * to transmit, true otherwise
      */
     bool SelectMenagementConnection(Ptr<WimaxConnection>& connection);
     /**
-     * \brief Check for UGS connections that have packets to transmit.
+     * @brief Check for UGS connections that have packets to transmit.
      *
      * The method return the UGS connection that have packets to transmits,
      * according to the MaxLatency specifications.
-     * \param connection will point to a connection that has packets to be sent
-     * \return true if successful
+     * @param connection will point to a connection that has packets to be sent
+     * @return true if successful
      */
     bool SelectUGSConnection(Ptr<WimaxConnection>& connection);
     /**
-     * \brief Check for rtPS connections that have packets to transmit.
-     * \param connection will point to a connection that has packets to be sent
-     * \returns false if no connection has packets to be sent, true otherwise
+     * @brief Check for rtPS connections that have packets to transmit.
+     * @param connection will point to a connection that has packets to be sent
+     * @returns false if no connection has packets to be sent, true otherwise
      */
     bool SelectRTPSConnection(Ptr<WimaxConnection>& connection);
     /**
-     * \brief Check for nrtPS connections that have packets to transmit.
-     * \param connection will point to a connection that has packets to be sent
-     * \returns false if no connection has packets to be sent, true otherwise
+     * @brief Check for nrtPS connections that have packets to transmit.
+     * @param connection will point to a connection that has packets to be sent
+     * @returns false if no connection has packets to be sent, true otherwise
      */
     bool SelectNRTPSConnection(Ptr<WimaxConnection>& connection);
     /**
-     * \brief Check for BE connections that have packets to transmit.
-     * \param connection will point to a connection that has packets to be sent
-     * \returns false if no connection has packets to be sent, true otherwise
+     * @brief Check for BE connections that have packets to transmit.
+     * @param connection will point to a connection that has packets to be sent
+     * @returns false if no connection has packets to be sent, true otherwise
      */
     bool SelectBEConnection(Ptr<WimaxConnection>& connection);
 
     /**
-     * \brief Selects a connection from the list of connections having packets to be sent .
-     * \param connection will point to a connection that has packets to be sent
-     * \returns false if no connection has packets to be sent, true otherwise
+     * @brief Selects a connection from the list of connections having packets to be sent .
+     * @param connection will point to a connection that has packets to be sent
+     * @returns false if no connection has packets to be sent, true otherwise
      */
     bool SelectConnection(Ptr<WimaxConnection>& connection) override;
 
     /**
-     * \brief schedules the broadcast connections
-     * \param availableSymbols the remaining free OFDM symbols in the current subframe
+     * @brief schedules the broadcast connections
+     * @param availableSymbols the remaining free OFDM symbols in the current subframe
      */
     void BSSchedulerBroadcastConnection(uint32_t& availableSymbols);
 
     /**
-     * \brief schedules the IR connections
-     * \param availableSymbols the remaining free OFDM symbols in the current subframe
+     * @brief schedules the IR connections
+     * @param availableSymbols the remaining free OFDM symbols in the current subframe
      */
     void BSSchedulerInitialRangingConnection(uint32_t& availableSymbols);
 
     /**
-     * \brief schedules the basic connections
-     * \param availableSymbols the remaining free OFDM symbols in the current subframe
+     * @brief schedules the basic connections
+     * @param availableSymbols the remaining free OFDM symbols in the current subframe
      */
     void BSSchedulerBasicConnection(uint32_t& availableSymbols);
 
     /**
-     * \brief schedules the primary connection
-     * \param availableSymbols the remaining free OFDM symbols in the current subframe
+     * @brief schedules the primary connection
+     * @param availableSymbols the remaining free OFDM symbols in the current subframe
      */
     void BSSchedulerPrimaryConnection(uint32_t& availableSymbols);
     /**
-     * \brief schedules the UGS connection
-     * \param availableSymbols the remaining free OFDM symbols in the current subframe
+     * @brief schedules the UGS connection
+     * @param availableSymbols the remaining free OFDM symbols in the current subframe
      */
     void BSSchedulerUGSConnection(uint32_t& availableSymbols);
     /**
-     * \brief Downlink Scheduler for rtPS connections.
+     * @brief Downlink Scheduler for rtPS connections.
      *
-     * \param availableSymbols available symbols for rtPS flows
+     * @param availableSymbols available symbols for rtPS flows
      *
      * This method represent the DL Scheduler for rtPS  connections.
      * The scheduler is designed to serve all rtPS connections that
@@ -184,23 +184,23 @@
     void BSSchedulerRTPSConnection(uint32_t& availableSymbols);
 
     /**
-     * \brief schedules the NRTPS connections
-     * \param availableSymbols the remaining free OFDM symbols in the current subframe
+     * @brief schedules the NRTPS connections
+     * @param availableSymbols the remaining free OFDM symbols in the current subframe
      */
     void BSSchedulerNRTPSConnection(uint32_t& availableSymbols);
 
     /**
-     * \brief schedules the BE connection
-     * \param availableSymbols the remaining free OFDM symbols in the current subframe
+     * @brief schedules the BE connection
+     * @param availableSymbols the remaining free OFDM symbols in the current subframe
      */
     void BSSchedulerBEConnection(uint32_t& availableSymbols);
 
     /**
-     * \brief Creates a downlink UGS burst
-     * \param serviceFlow the service flow of the burst
-     * \param modulationType the modulation type to be used for the burst
-     * \param availableSymbols maximum number of OFDM symbols to be used by the burst
-     * \returns a Burst (list of packets)
+     * @brief Creates a downlink UGS burst
+     * @param serviceFlow the service flow of the burst
+     * @param modulationType the modulation type to be used for the burst
+     * @param availableSymbols maximum number of OFDM symbols to be used by the burst
+     * @returns a Burst (list of packets)
      */
     Ptr<PacketBurst> CreateUgsBurst(ServiceFlow* serviceFlow,
                                     WimaxPhy::ModulationType modulationType,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/bs-scheduler-simple.h ns-3.44/src/wimax/model/bs-scheduler-simple.h
--- ns-3.43/src/wimax/model/bs-scheduler-simple.h	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/bs-scheduler-simple.h	2025-03-09 16:55:49.815372700 -0700
@@ -29,7 +29,7 @@
 class Cid;
 
 /**
- * \ingroup wimax
+ * @ingroup wimax
  *
  * BaseStation Scheduler - simplified
  */
@@ -40,30 +40,30 @@
     /**
      * Constructor
      *
-     * \param bs base station device
+     * @param bs base station device
      */
     BSSchedulerSimple(Ptr<BaseStationNetDevice> bs);
     ~BSSchedulerSimple() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief This function returns all the downlink bursts scheduled for the next
+     * @brief This function returns all the downlink bursts scheduled for the next
      * downlink sub-frame
-     * \returns  all the downlink bursts scheduled for the next downlink sub-frame
+     * @returns  all the downlink bursts scheduled for the next downlink sub-frame
      */
     std::list<std::pair<OfdmDlMapIe*, Ptr<PacketBurst>>>* GetDownlinkBursts() const override;
     /**
-     * \brief This function adds a downlink burst to the list of downlink bursts
+     * @brief This function adds a downlink burst to the list of downlink bursts
      * scheduled for the next downlink sub-frame
-     * \param connection a pointer to connection in which the burst will be sent
-     * \param diuc downlink iuc
-     * \param modulationType the modulation type of the burst
-     * \param burst the downlink burst to add to the downlink sub frame
+     * @param connection a pointer to connection in which the burst will be sent
+     * @param diuc downlink iuc
+     * @param modulationType the modulation type of the burst
+     * @param burst the downlink burst to add to the downlink sub frame
      */
     void AddDownlinkBurst(Ptr<const WimaxConnection> connection,
                           uint8_t diuc,
@@ -71,21 +71,21 @@
                           Ptr<PacketBurst> burst) override;
 
     /**
-     * \brief the scheduling function for the downlink subframe.
+     * @brief the scheduling function for the downlink subframe.
      */
     void Schedule() override;
     /**
-     * \brief Selects a connection from the list of connections having packets to be sent .
-     * \param connection will point to a connection that have packets to be sent
-     * \returns false if no connection has packets to be sent, true otherwise
+     * @brief Selects a connection from the list of connections having packets to be sent .
+     * @param connection will point to a connection that have packets to be sent
+     * @returns false if no connection has packets to be sent, true otherwise
      */
     bool SelectConnection(Ptr<WimaxConnection>& connection) override;
     /**
-     * \brief Creates a downlink UGS burst
-     * \param serviceFlow the service flow of the burst
-     * \param modulationType the modulation type to be used for the burst
-     * \param availableSymbols maximum number of OFDM symbols to be used by the burst
-     * \returns a Burst (list of packets)
+     * @brief Creates a downlink UGS burst
+     * @param serviceFlow the service flow of the burst
+     * @param modulationType the modulation type to be used for the burst
+     * @param availableSymbols maximum number of OFDM symbols to be used by the burst
+     * @returns a Burst (list of packets)
      */
     Ptr<PacketBurst> CreateUgsBurst(ServiceFlow* serviceFlow,
                                     WimaxPhy::ModulationType modulationType,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/bs-service-flow-manager.h ns-3.44/src/wimax/model/bs-service-flow-manager.h
--- ns-3.43/src/wimax/model/bs-service-flow-manager.h	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/bs-service-flow-manager.h	2025-03-09 16:55:49.815372700 -0700
@@ -29,8 +29,8 @@
 class BaseStationNetDevice;
 
 /**
- * \ingroup wimax
- * \brief BsServiceFlowManager
+ * @ingroup wimax
+ * @brief BsServiceFlowManager
  */
 class BsServiceFlowManager : public ServiceFlowManager
 {
@@ -45,90 +45,90 @@
     /**
      * Constructor
      *
-     * \param device base station device
+     * @param device base station device
      */
     BsServiceFlowManager(Ptr<BaseStationNetDevice> device);
     ~BsServiceFlowManager() override;
     void DoDispose() override;
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Add a new service flow
-     * \param serviceFlow the service flow to add
+     * @brief Add a new service flow
+     * @param serviceFlow the service flow to add
      */
     void AddServiceFlow(ServiceFlow* serviceFlow);
     /**
-     * \param sfid the service flow identifier
-     * \return the service flow which has as identifier sfid
+     * @param sfid the service flow identifier
+     * @return the service flow which has as identifier sfid
      */
     ServiceFlow* GetServiceFlow(uint32_t sfid) const;
     /**
-     * \param cid the connection identifier
-     * \return the service flow which has as connection identifier cid
+     * @param cid the connection identifier
+     * @return the service flow which has as connection identifier cid
      */
     ServiceFlow* GetServiceFlow(Cid cid) const;
     /**
-     * \param schedulingType the scheduling type
-     * \return the list of service flows configured with schedulingType as a QoS class
+     * @param schedulingType the scheduling type
+     * @return the list of service flows configured with schedulingType as a QoS class
      */
     std::vector<ServiceFlow*> GetServiceFlows(ServiceFlow::SchedulingType schedulingType) const;
     /**
-     * \brief set the maximum Dynamic ServiceFlow Add (DSA) retries
-     * \param maxDsaRspRetries the maximum DSA response retries
+     * @brief set the maximum Dynamic ServiceFlow Add (DSA) retries
+     * @param maxDsaRspRetries the maximum DSA response retries
      */
     void SetMaxDsaRspRetries(uint8_t maxDsaRspRetries);
 
     /**
-     * \return the DSA ack timeout event
+     * @return the DSA ack timeout event
      */
     EventId GetDsaAckTimeoutEvent() const;
     /**
-     * \brief allocate service flows
-     * \param dsaReq the DSA request
-     * \param cid the connection identifier
+     * @brief allocate service flows
+     * @param dsaReq the DSA request
+     * @param cid the connection identifier
      */
     void AllocateServiceFlows(const DsaReq& dsaReq, Cid cid);
     /**
-     * \brief add a multicast service flow
-     * \param sf the service flow
-     * \param modulation the wimax phy modulation type
+     * @brief add a multicast service flow
+     * @param sf the service flow
+     * @param modulation the wimax phy modulation type
      */
     void AddMulticastServiceFlow(ServiceFlow sf, WimaxPhy::ModulationType modulation);
     /**
-     * \brief process a DSA-ACK message
-     * \param dsaAck the message to process
-     * \param cid the identifier of the connection on which the message was received
+     * @brief process a DSA-ACK message
+     * @param dsaAck the message to process
+     * @param cid the identifier of the connection on which the message was received
      */
     void ProcessDsaAck(const DsaAck& dsaAck, Cid cid);
 
     /**
-     * \brief process a DSA-Req message
-     * \param dsaReq the message to process
-     * \param cid the identifier of the connection on which the message was received
-     * \return a pointer to the service flow
+     * @brief process a DSA-Req message
+     * @param dsaReq the message to process
+     * @param cid the identifier of the connection on which the message was received
+     * @return a pointer to the service flow
      */
     ServiceFlow* ProcessDsaReq(const DsaReq& dsaReq, Cid cid);
 
   private:
     /**
      * Create DSA response function
-     * \param serviceFlow service flow
-     * \param transactionId transaction ID
-     * \return the DSA response
+     * @param serviceFlow service flow
+     * @param transactionId transaction ID
+     * @return the DSA response
      */
     DsaRsp CreateDsaRsp(const ServiceFlow* serviceFlow, uint16_t transactionId);
     /**
-     * \return the maximum DSA response retries
+     * @return the maximum DSA response retries
      */
     uint8_t GetMaxDsaRspRetries() const;
     /**
      * Create DSA response function
-     * \param serviceFlow service flow
-     * \param cid the identifier of the connection on which the message was received
+     * @param serviceFlow service flow
+     * @param cid the identifier of the connection on which the message was received
      */
     void ScheduleDsaRsp(ServiceFlow* serviceFlow, Cid cid);
     Ptr<WimaxNetDevice> m_device; ///< the device
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/bs-uplink-scheduler.cc ns-3.44/src/wimax/model/bs-uplink-scheduler.cc
--- ns-3.43/src/wimax/model/bs-uplink-scheduler.cc	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/bs-uplink-scheduler.cc	2025-03-09 16:55:49.815372700 -0700
@@ -31,7 +31,7 @@
 
 UplinkScheduler::UplinkScheduler()
     : m_bs(nullptr),
-      m_timeStampIrInterval(Seconds(0)),
+      m_timeStampIrInterval(),
       m_nrIrOppsAllocated(0),
       m_isIrIntrvlAllocated(false),
       m_isInvIrIntrvlAllocated(false),
@@ -42,7 +42,7 @@
 
 UplinkScheduler::UplinkScheduler(Ptr<BaseStationNetDevice> bs)
     : m_bs(bs),
-      m_timeStampIrInterval(Seconds(0)),
+      m_timeStampIrInterval(),
       m_nrIrOppsAllocated(0),
       m_isIrIntrvlAllocated(false),
       m_isInvIrIntrvlAllocated(false),
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/bs-uplink-scheduler.h ns-3.44/src/wimax/model/bs-uplink-scheduler.h
--- ns-3.43/src/wimax/model/bs-uplink-scheduler.h	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/bs-uplink-scheduler.h	2025-03-09 16:55:49.815372700 -0700
@@ -27,8 +27,8 @@
 class ServiceFlowRecord;
 
 /**
- * \ingroup wimax
- * \brief Virtual class for uplink scheduler.
+ * @ingroup wimax
+ * @brief Virtual class for uplink scheduler.
  */
 class UplinkScheduler : public Object
 {
@@ -37,89 +37,89 @@
     /**
      * Constructor
      *
-     * \param bs base station device
+     * @param bs base station device
      */
     UplinkScheduler(Ptr<BaseStationNetDevice> bs);
     ~UplinkScheduler() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \return the number of IR opps allocated
+     * @return the number of IR opps allocated
      */
     virtual uint8_t GetNrIrOppsAllocated() const;
     /**
-     * \brief Set the number of IR opps allocated
-     * \param nrIrOppsAllocated number of IR opps allocated
+     * @brief Set the number of IR opps allocated
+     * @param nrIrOppsAllocated number of IR opps allocated
      */
     virtual void SetNrIrOppsAllocated(uint8_t nrIrOppsAllocated);
 
     /**
-     * \return true if the IR interval is allocated
+     * @return true if the IR interval is allocated
      */
     virtual bool GetIsIrIntrvlAllocated() const;
     /**
-     * \brief Set if the IR interval is allocated
-     * \param isIrIntrvlAllocated
+     * @brief Set if the IR interval is allocated
+     * @param isIrIntrvlAllocated
      */
     virtual void SetIsIrIntrvlAllocated(bool isIrIntrvlAllocated);
 
     /**
-     * \return true if the Inv IR interval is allocated
+     * @return true if the Inv IR interval is allocated
      */
     virtual bool GetIsInvIrIntrvlAllocated() const;
     /**
-     * \brief Set if the Inv IR interval is allocated
-     * \param isInvIrIntrvlAllocated
+     * @brief Set if the Inv IR interval is allocated
+     * @param isInvIrIntrvlAllocated
      */
     virtual void SetIsInvIrIntrvlAllocated(bool isInvIrIntrvlAllocated);
 
     /**
-     * \return uplink allocations
+     * @return uplink allocations
      */
     virtual std::list<OfdmUlMapIe> GetUplinkAllocations() const;
 
     /**
-     * \return the timestamp of the IR interval
+     * @return the timestamp of the IR interval
      */
     virtual Time GetTimeStampIrInterval();
     /**
-     * \brief Set timestamp IR interval
-     * \param timeStampIrInterval
+     * @brief Set timestamp IR interval
+     * @param timeStampIrInterval
      */
     virtual void SetTimeStampIrInterval(Time timeStampIrInterval);
 
     /**
-     * \return the DCD timestamp
+     * @return the DCD timestamp
      */
     virtual Time GetDcdTimeStamp() const;
     /**
-     * \brief Set DCD timestamp
-     * \param dcdTimeStamp
+     * @brief Set DCD timestamp
+     * @param dcdTimeStamp
      */
     virtual void SetDcdTimeStamp(Time dcdTimeStamp);
 
     /**
-     * \return the UCD timestamp
+     * @return the UCD timestamp
      */
     virtual Time GetUcdTimeStamp() const;
     /**
-     * \brief Set UCD timestamp
-     * \param ucdTimeStamp
+     * @brief Set UCD timestamp
+     * @param ucdTimeStamp
      */
     virtual void SetUcdTimeStamp(Time ucdTimeStamp);
 
     /**
-     * \return the base station device
+     * @return the base station device
      */
     virtual Ptr<BaseStationNetDevice> GetBs();
     /**
-     * \brief Set base station device
-     * \param bs
+     * @brief Set base station device
+     * @param bs
      */
     virtual void SetBs(Ptr<BaseStationNetDevice> bs);
     /**
@@ -128,15 +128,15 @@
      */
     virtual void GetChannelDescriptorsToUpdate(bool&, bool&, bool&, bool&) = 0;
     /**
-     * \return the calculated allocation start time
+     * @return the calculated allocation start time
      */
     virtual uint32_t CalculateAllocationStartTime() = 0;
     /**
      * Add uplink allocation
-     * \param ulMapIe the UL map IE
-     * \param allocationSize the allocation size
-     * \param symbolsToAllocation the symbols to allocation
-     * \param availableSymbols the available symbols
+     * @param ulMapIe the UL map IE
+     * @param allocationSize the allocation size
+     * @param symbolsToAllocation the symbols to allocation
+     * @param availableSymbols the available symbols
      */
     virtual void AddUplinkAllocation(OfdmUlMapIe& ulMapIe,
                                      const uint32_t& allocationSize,
@@ -148,12 +148,12 @@
     virtual void Schedule() = 0;
     /**
      * Service unsolicited grants function
-     * \param ssRecord the SS record
-     * \param schedulingType the scheduling type
-     * \param ulMapIe the UL map IE
-     * \param modulationType the modulation type
-     * \param symbolsToAllocation the symbols to allocation
-     * \param availableSymbols the available symbols
+     * @param ssRecord the SS record
+     * @param schedulingType the scheduling type
+     * @param ulMapIe the UL map IE
+     * @param modulationType the modulation type
+     * @param symbolsToAllocation the symbols to allocation
+     * @param availableSymbols the available symbols
      */
     virtual void ServiceUnsolicitedGrants(const SSRecord* ssRecord,
                                           ServiceFlow::SchedulingType schedulingType,
@@ -163,12 +163,12 @@
                                           uint32_t& availableSymbols) = 0;
     /**
      * Service bandwidth request function
-     * \param ssRecord the SS record
-     * \param schedulingType the scheduling type
-     * \param ulMapIe the UL map IE
-     * \param modulationType the modulation type
-     * \param symbolsToAllocation the symbols to allocation
-     * \param availableSymbols the available symbols
+     * @param ssRecord the SS record
+     * @param schedulingType the scheduling type
+     * @param ulMapIe the UL map IE
+     * @param modulationType the modulation type
+     * @param symbolsToAllocation the symbols to allocation
+     * @param availableSymbols the available symbols
      */
     virtual void ServiceBandwidthRequests(const SSRecord* ssRecord,
                                           ServiceFlow::SchedulingType schedulingType,
@@ -178,13 +178,13 @@
                                           uint32_t& availableSymbols) = 0;
     /**
      * Service bandwidth request function
-     * \param serviceFlow the service flow
-     * \param schedulingType the scheduling type
-     * \param ulMapIe the UL map IE
-     * \param modulationType the modulation type
-     * \param symbolsToAllocation the symbols to allocation
-     * \param availableSymbols the available symbols
-     * \returns true if successful
+     * @param serviceFlow the service flow
+     * @param schedulingType the scheduling type
+     * @param ulMapIe the UL map IE
+     * @param modulationType the modulation type
+     * @param symbolsToAllocation the symbols to allocation
+     * @param availableSymbols the available symbols
+     * @returns true if successful
      */
     virtual bool ServiceBandwidthRequests(ServiceFlow* serviceFlow,
                                           ServiceFlow::SchedulingType schedulingType,
@@ -194,20 +194,20 @@
                                           uint32_t& availableSymbols) = 0;
     /**
      * Allocate initial ranging interval function
-     * \param symbolsToAllocation the symbols to allocation
-     * \param availableSymbols the available symbols
+     * @param symbolsToAllocation the symbols to allocation
+     * @param availableSymbols the available symbols
      */
     virtual void AllocateInitialRangingInterval(uint32_t& symbolsToAllocation,
                                                 uint32_t& availableSymbols) = 0;
     /**
      * Setp service flow function
-     * \param ssRecord the SS record
-     * \param serviceFlow the service flow
+     * @param ssRecord the SS record
+     * @param serviceFlow the service flow
      */
     virtual void SetupServiceFlow(SSRecord* ssRecord, ServiceFlow* serviceFlow) = 0;
     /**
      * Process bandwidth request function
-     * \param bwRequestHdr
+     * @param bwRequestHdr
      */
     virtual void ProcessBandwidthRequest(const BandwidthRequestHeader& bwRequestHdr) = 0;
 
@@ -217,8 +217,8 @@
     virtual void InitOnce() = 0;
 
     /**
-     * \brief Set requested bandwidth
-     * \param sfr service flow record
+     * @brief Set requested bandwidth
+     * @param sfr service flow record
      */
     virtual void OnSetRequestedBandwidth(ServiceFlowRecord* sfr) = 0;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/bs-uplink-scheduler-mbqos.cc ns-3.44/src/wimax/model/bs-uplink-scheduler-mbqos.cc
--- ns-3.43/src/wimax/model/bs-uplink-scheduler-mbqos.cc	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/bs-uplink-scheduler-mbqos.cc	2025-03-09 16:55:49.815372700 -0700
@@ -52,7 +52,7 @@
 
                             .AddAttribute("WindowInterval",
                                           "The time to wait to reset window",
-                                          TimeValue(Seconds(1.0)),
+                                          TimeValue(Seconds(1)),
                                           MakeTimeAccessor(&UplinkSchedulerMBQoS::m_windowInterval),
                                           MakeTimeChecker());
     return tid;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/bs-uplink-scheduler-mbqos.h ns-3.44/src/wimax/model/bs-uplink-scheduler-mbqos.h
--- ns-3.43/src/wimax/model/bs-uplink-scheduler-mbqos.h	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/bs-uplink-scheduler-mbqos.h	2025-03-09 16:55:49.815372700 -0700
@@ -33,8 +33,8 @@
 class UlJob;
 
 /**
- * \ingroup wimax
- * \brief This class implements a Migration-based Quality of Service uplink scheduler(MBQoS).
+ * @ingroup wimax
+ * @brief This class implements a Migration-based Quality of Service uplink scheduler(MBQoS).
  *
  * This uplink scheduler uses three queues, the low priority
  * queue, the intermediate queue and the high priority queue.
@@ -65,30 +65,30 @@
     /**
      * Constructor
      *
-     * \param time the time
+     * @param time the time
      */
     UplinkSchedulerMBQoS(Time time);
     ~UplinkSchedulerMBQoS() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
      * Get uplink allocations
-     * \returns std::list<OfdmUlMapIe>
+     * @returns std::list<OfdmUlMapIe>
      */
     std::list<OfdmUlMapIe> GetUplinkAllocations() const override;
 
     /**
      * Determines if channel descriptors sent in the current frame are
      * required to be updated
-     * \param updateDcd update DCD if true
-     * \param updateUcd update UCD if true
-     * \param sendDcd send DCD if true
-     * \param sendUcd send UCD if true
+     * @param updateDcd update DCD if true
+     * @param updateUcd update UCD if true
+     * @param sendDcd send DCD if true
+     * @param sendUcd send UCD if true
      */
     void GetChannelDescriptorsToUpdate(bool& updateDcd,
                                        bool& updateUcd,
@@ -96,15 +96,15 @@
                                        bool& sendUcd) override;
     /**
      * Calculate allocation start time
-     * \returns the allocation start time
+     * @returns the allocation start time
      */
     uint32_t CalculateAllocationStartTime() override;
     /**
      * Add uplink allocation
-     * \param ulMapIe the UL map IE
-     * \param allocationSize the allocation size
-     * \param symbolsToAllocation the symbols to allocation
-     * \param availableSymbols the available symbols
+     * @param ulMapIe the UL map IE
+     * @param allocationSize the allocation size
+     * @param symbolsToAllocation the symbols to allocation
+     * @param availableSymbols the available symbols
      */
     void AddUplinkAllocation(OfdmUlMapIe& ulMapIe,
                              const uint32_t& allocationSize,
@@ -117,12 +117,12 @@
     void Schedule() override;
     /**
      * Service unsolicited grants
-     * \param ssRecord the SS record
-     * \param schedulingType the scheduling type
-     * \param ulMapIe the UL map IE
-     * \param modulationType the modulation type
-     * \param symbolsToAllocation the symbols to allocation
-     * \param availableSymbols the available symbols
+     * @param ssRecord the SS record
+     * @param schedulingType the scheduling type
+     * @param ulMapIe the UL map IE
+     * @param modulationType the modulation type
+     * @param symbolsToAllocation the symbols to allocation
+     * @param availableSymbols the available symbols
      */
     void ServiceUnsolicitedGrants(const SSRecord* ssRecord,
                                   ServiceFlow::SchedulingType schedulingType,
@@ -132,12 +132,12 @@
                                   uint32_t& availableSymbols) override;
     /**
      * Service bandwidth requests
-     * \param ssRecord the SS record
-     * \param schedulingType the scheduling type
-     * \param ulMapIe the UL map IE
-     * \param modulationType the modulation type
-     * \param symbolsToAllocation the symbols to allocation
-     * \param availableSymbols the available symbols
+     * @param ssRecord the SS record
+     * @param schedulingType the scheduling type
+     * @param ulMapIe the UL map IE
+     * @param modulationType the modulation type
+     * @param symbolsToAllocation the symbols to allocation
+     * @param availableSymbols the available symbols
      */
     void ServiceBandwidthRequests(const SSRecord* ssRecord,
                                   ServiceFlow::SchedulingType schedulingType,
@@ -147,13 +147,13 @@
                                   uint32_t& availableSymbols) override;
     /**
      * Service bandwidth requests
-     * \param serviceFlow the service flow
-     * \param schedulingType the scheduling type
-     * \param ulMapIe the UL map IE
-     * \param modulationType the modulation type
-     * \param symbolsToAllocation the symbols to allocation
-     * \param availableSymbols the available symbols
-     * \returns true if successful
+     * @param serviceFlow the service flow
+     * @param schedulingType the scheduling type
+     * @param ulMapIe the UL map IE
+     * @param modulationType the modulation type
+     * @param symbolsToAllocation the symbols to allocation
+     * @param availableSymbols the available symbols
+     * @returns true if successful
      */
     bool ServiceBandwidthRequests(ServiceFlow* serviceFlow,
                                   ServiceFlow::SchedulingType schedulingType,
@@ -163,21 +163,21 @@
                                   uint32_t& availableSymbols) override;
     /**
      * Allocate initial ranging interval
-     * \param symbolsToAllocation the symbols to allocation
-     * \param availableSymbols the available symbols
+     * @param symbolsToAllocation the symbols to allocation
+     * @param availableSymbols the available symbols
      */
     void AllocateInitialRangingInterval(uint32_t& symbolsToAllocation,
                                         uint32_t& availableSymbols) override;
     /**
      * Setup service flow
-     * \param ssRecord the SS record
-     * \param serviceFlow the service flow
+     * @param ssRecord the SS record
+     * @param serviceFlow the service flow
      */
     void SetupServiceFlow(SSRecord* ssRecord, ServiceFlow* serviceFlow) override;
 
     /**
-     * \param availableSymbols available symbols in the uplink frame
-     * \brief Check deadline from jobs. Migrate requests if necessary.
+     * @param availableSymbols available symbols in the uplink frame
+     * @brief Check deadline from jobs. Migrate requests if necessary.
      *
      * This method verifies for each rtPS request whether it should be
      * migrated to the high priority queue or not. The conditions for
@@ -188,8 +188,8 @@
     void CheckDeadline(uint32_t& availableSymbols);
 
     /**
-     * \param availableSymbols available symbols in the uplink frame.
-     * \brief Check if Minimum bandwidth is guarantee. Migrate requests if necessary.
+     * @param availableSymbols available symbols in the uplink frame.
+     * @brief Check if Minimum bandwidth is guarantee. Migrate requests if necessary.
      *
      * This method first calculate a priority value for each request
      * in the intermediate queue. Then, sorts the intermediate queue
@@ -199,34 +199,34 @@
     void CheckMinimumBandwidth(uint32_t& availableSymbols);
 
     /**
-     * \brief Reset the current window.
+     * @brief Reset the current window.
      * According to a configured time, reset the window.
      */
     void UplinkSchedWindowTimer();
 
     /**
-     * \param priority Priority of queue
-     * \param job job information
+     * @param priority Priority of queue
+     * @param job job information
      *
-     * \brief Enqueue a job in a priority queue.
+     * @brief Enqueue a job in a priority queue.
      */
     void EnqueueJob(UlJob::JobPriority priority, Ptr<UlJob> job);
 
     /**
-     * \param priority Priority of queue
-     * \return Ptr<UlJob>
+     * @param priority Priority of queue
+     * @return Ptr<UlJob>
      *
-     * \brief Dequeue a job from a priority queue.
+     * @brief Dequeue a job from a priority queue.
      */
     Ptr<UlJob> DequeueJob(UlJob::JobPriority priority);
 
     void ProcessBandwidthRequest(const BandwidthRequestHeader& bwRequestHdr) override;
 
     /**
-     * \param serviceFlow Service flow of connection
-     * \return Time
+     * @param serviceFlow Service flow of connection
+     * @return Time
      *
-     * \brief Calculates deadline of a request.
+     * @brief Calculates deadline of a request.
      */
     Time DetermineDeadline(ServiceFlow* serviceFlow);
 
@@ -236,16 +236,16 @@
     void InitOnce() override;
 
     /**
-     * \param jobs List of jobs
-     * \returns the symbols count
+     * @param jobs List of jobs
+     * @returns the symbols count
      *
      * Sum the amount of symbols of each job of a queue
      */
     uint32_t CountSymbolsQueue(std::list<Ptr<UlJob>> jobs);
 
     /**
-     * \param job job
-     * \returns the symbols count
+     * @param job job
+     * @returns the symbols count
      *
      * Count the amount of symbols of a job.
      */
@@ -253,15 +253,15 @@
 
     /**
      * Set requested bandwidth
-     * \param sfr the service flow record
+     * @param sfr the service flow record
      */
     void OnSetRequestedBandwidth(ServiceFlowRecord* sfr) override;
 
     /**
-     * \param ssRecord Subscriber station record
-     * \param schedType Service flow type
-     * \param reqType Type of packet
-     * \return Ptr<UlJob>
+     * @param ssRecord Subscriber station record
+     * @param schedType Service flow type
+     * @param reqType Type of packet
+     * @return Ptr<UlJob>
      *
      * Create and fill information of a job.
      */
@@ -270,8 +270,8 @@
                            ReqType reqType);
 
     /**
-     * \param serviceFlow ServiceFlow
-     * \return Ptr<UlJob>
+     * @param serviceFlow ServiceFlow
+     * @return Ptr<UlJob>
      *
      * Get pending size.
      */
@@ -279,14 +279,14 @@
 
     /**
      * Service bandwidth requests bytes.
-     * \param serviceFlow the service flow
-     * \param schedulingType the scheduling type
-     * \param ulMapIe the UL map IE
-     * \param modulationType the modulation type
-     * \param symbolsToAllocation the symbols to allocation
-     * \param availableSymbols the available symbols
-     * \param allocationSizeBytes the allocation size in bytes
-     * \returns true if successful
+     * @param serviceFlow the service flow
+     * @param schedulingType the scheduling type
+     * @param ulMapIe the UL map IE
+     * @param modulationType the modulation type
+     * @param symbolsToAllocation the symbols to allocation
+     * @param availableSymbols the available symbols
+     * @param allocationSizeBytes the allocation size in bytes
+     * @returns true if successful
      */
     bool ServiceBandwidthRequestsBytes(ServiceFlow* serviceFlow,
                                        ServiceFlow::SchedulingType schedulingType,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/bs-uplink-scheduler-rtps.h ns-3.44/src/wimax/model/bs-uplink-scheduler-rtps.h
--- ns-3.43/src/wimax/model/bs-uplink-scheduler-rtps.h	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/bs-uplink-scheduler-rtps.h	2025-03-09 16:55:49.815372700 -0700
@@ -25,8 +25,8 @@
 class ServiceFlow;
 
 /**
- * \ingroup wimax
- * \brief This class implements a simple uplink scheduler for rtPS flows.
+ * @ingroup wimax
+ * @brief This class implements a simple uplink scheduler for rtPS flows.
  *
  * The UL-rtPS-Scheduler work in this way:
  * At the beginning of the UL sub-frame some symbols are allocated
@@ -48,30 +48,30 @@
     /**
      * Constructor
      *
-     * \param bs base station device
+     * @param bs base station device
      */
     UplinkSchedulerRtps(Ptr<BaseStationNetDevice> bs);
     ~UplinkSchedulerRtps() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Get uplink allocations.
-     * \returns std::list<OfdmUlMapIe>
+     * @brief Get uplink allocations.
+     * @returns std::list<OfdmUlMapIe>
      */
     std::list<OfdmUlMapIe> GetUplinkAllocations() const override;
 
     /**
      * Determines if channel descriptors sent in the current frame are
      * required to be updated
-     * \param updateDcd if true update DCD
-     * \param updateUcd if true update UCD
-     * \param sendDcd if true send DCD
-     * \param sendUcd if true send UCD
+     * @param updateDcd if true update DCD
+     * @param updateUcd if true update UCD
+     * @param sendDcd if true send DCD
+     * @param sendUcd if true send UCD
      */
     void GetChannelDescriptorsToUpdate(bool& updateDcd,
                                        bool& updateUcd,
@@ -79,32 +79,32 @@
                                        bool& sendUcd) override;
     /**
      * Calculate allocation start time function
-     * \returns the allocation start time value
+     * @returns the allocation start time value
      */
     uint32_t CalculateAllocationStartTime() override;
     /**
      * Add Uplink Allocation function
-     * \param ulMapIe the UL map IE
-     * \param allocationSize the allocation size
-     * \param symbolsToAllocation the symbols to allocation
-     * \param availableSymbols the available symbols
+     * @param ulMapIe the UL map IE
+     * @param allocationSize the allocation size
+     * @param symbolsToAllocation the symbols to allocation
+     * @param availableSymbols the available symbols
      */
     void AddUplinkAllocation(OfdmUlMapIe& ulMapIe,
                              const uint32_t& allocationSize,
                              uint32_t& symbolsToAllocation,
                              uint32_t& availableSymbols) override;
     /**
-     * \brief Schedule function.
+     * @brief Schedule function.
      */
     void Schedule() override;
     /**
      * Service Unsolicited Grants function
-     * \param ssRecord Subscriber station record
-     * \param schedulingType the scheduling type
-     * \param ulMapIe the UL map IE
-     * \param modulationType the modulation type
-     * \param symbolsToAllocation the symbols to allocation
-     * \param availableSymbols the available symbols
+     * @param ssRecord Subscriber station record
+     * @param schedulingType the scheduling type
+     * @param ulMapIe the UL map IE
+     * @param modulationType the modulation type
+     * @param symbolsToAllocation the symbols to allocation
+     * @param availableSymbols the available symbols
      */
     void ServiceUnsolicitedGrants(const SSRecord* ssRecord,
                                   ServiceFlow::SchedulingType schedulingType,
@@ -114,12 +114,12 @@
                                   uint32_t& availableSymbols) override;
     /**
      * Service Bandwidth Requests function
-     * \param ssRecord Subscriber station record
-     * \param schedulingType the scheduling type
-     * \param ulMapIe the UL map IE
-     * \param modulationType the modulation type
-     * \param symbolsToAllocation the symbols to allocation
-     * \param availableSymbols the available symbols
+     * @param ssRecord Subscriber station record
+     * @param schedulingType the scheduling type
+     * @param ulMapIe the UL map IE
+     * @param modulationType the modulation type
+     * @param symbolsToAllocation the symbols to allocation
+     * @param availableSymbols the available symbols
      */
     void ServiceBandwidthRequests(const SSRecord* ssRecord,
                                   ServiceFlow::SchedulingType schedulingType,
@@ -129,13 +129,13 @@
                                   uint32_t& availableSymbols) override;
     /**
      * Service bandwidth requests function
-     * \param serviceFlow the service flow
-     * \param schedulingType the scheduling type
-     * \param ulMapIe the UL map IE
-     * \param modulationType the modulation type
-     * \param symbolsToAllocation the symbols to allocation
-     * \param availableSymbols the available symbols
-     * \returns true if successful
+     * @param serviceFlow the service flow
+     * @param schedulingType the scheduling type
+     * @param ulMapIe the UL map IE
+     * @param modulationType the modulation type
+     * @param symbolsToAllocation the symbols to allocation
+     * @param availableSymbols the available symbols
+     * @returns true if successful
      */
     bool ServiceBandwidthRequests(ServiceFlow* serviceFlow,
                                   ServiceFlow::SchedulingType schedulingType,
@@ -144,10 +144,10 @@
                                   uint32_t& symbolsToAllocation,
                                   uint32_t& availableSymbols) override;
     /**
-     * \brief Uplink Scheduler for rtPS connections.
+     * @brief Uplink Scheduler for rtPS connections.
      *
-     * \param symbolsToAllocation symbols to allocation for UpLink Subframe
-     * \param availableSymbols available symbols for rtPS flows
+     * @param symbolsToAllocation symbols to allocation for UpLink Subframe
+     * @param availableSymbols available symbols for rtPS flows
      *
      * This method represent the UL Scheduler for rtPS  connections.
      * The scheduler is designed to serve all rtPS connections that
@@ -164,21 +164,21 @@
     /**
      * Allocate Initial Ranging Interval function
      *
-     * \param symbolsToAllocation symbols to allocation for UpLink Subframe
-     * \param availableSymbols available symbols for rtPS flows
+     * @param symbolsToAllocation symbols to allocation for UpLink Subframe
+     * @param availableSymbols available symbols for rtPS flows
      */
     void AllocateInitialRangingInterval(uint32_t& symbolsToAllocation,
                                         uint32_t& availableSymbols) override;
     /**
      * Setup service flow function
-     * \param ssRecord Subscriber station record
-     * \param serviceFlow the service flow
+     * @param ssRecord Subscriber station record
+     * @param serviceFlow the service flow
      */
     void SetupServiceFlow(SSRecord* ssRecord, ServiceFlow* serviceFlow) override;
 
     /**
      * Process bandwidth request function
-     * \param bwRequestHdr the bandwidth request header
+     * @param bwRequestHdr the bandwidth request header
      */
     void ProcessBandwidthRequest(const BandwidthRequestHeader& bwRequestHdr) override;
 
@@ -187,7 +187,7 @@
 
     /**
      * Set requested bandwidth function
-     * \param sfr the service flow record
+     * @param sfr the service flow record
      */
     void OnSetRequestedBandwidth(ServiceFlowRecord* sfr) override;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/bs-uplink-scheduler-simple.h ns-3.44/src/wimax/model/bs-uplink-scheduler-simple.h
--- ns-3.43/src/wimax/model/bs-uplink-scheduler-simple.h	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/bs-uplink-scheduler-simple.h	2025-03-09 16:55:49.815372700 -0700
@@ -26,7 +26,7 @@
 class ServiceFlow;
 
 /**
- * \ingroup wimax
+ * @ingroup wimax
  *
  * Uplink Scheduler - simplified
  */
@@ -37,27 +37,27 @@
     /**
      * Constructor
      *
-     * \param bs base station device
+     * @param bs base station device
      */
     UplinkSchedulerSimple(Ptr<BaseStationNetDevice> bs);
     ~UplinkSchedulerSimple() override;
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     std::list<OfdmUlMapIe> GetUplinkAllocations() const override;
 
     /**
-     * \brief Determines if channel descriptors sent in the current frame are
+     * @brief Determines if channel descriptors sent in the current frame are
      * required to be updated
      *
-     * \param updateDcd currently unused (assume true)
-     * \param updateUcd currently unused (assume true)
-     * \param [out] sendDcd DCD must be updated
-     * \param [out] sendUcd UCD must be updated
+     * @param updateDcd currently unused (assume true)
+     * @param updateUcd currently unused (assume true)
+     * @param [out] sendDcd DCD must be updated
+     * @param [out] sendUcd UCD must be updated
      *
      */
     void GetChannelDescriptorsToUpdate(bool& updateDcd,
@@ -72,12 +72,12 @@
     void Schedule() override;
     /**
      * Service Unsolicited Grants function
-     * \param ssRecord Subscriber station record
-     * \param schedulingType the scheduling type
-     * \param ulMapIe the UL map IE
-     * \param modulationType the modulation type
-     * \param symbolsToAllocation the symbols to allocation
-     * \param availableSymbols the available symbols
+     * @param ssRecord Subscriber station record
+     * @param schedulingType the scheduling type
+     * @param ulMapIe the UL map IE
+     * @param modulationType the modulation type
+     * @param symbolsToAllocation the symbols to allocation
+     * @param availableSymbols the available symbols
      */
     void ServiceUnsolicitedGrants(const SSRecord* ssRecord,
                                   ServiceFlow::SchedulingType schedulingType,
@@ -87,12 +87,12 @@
                                   uint32_t& availableSymbols) override;
     /**
      * Service Bandwidth Requests function
-     * \param ssRecord Subscriber station record
-     * \param schedulingType the scheduling type
-     * \param ulMapIe the UL map IE
-     * \param modulationType the modulation type
-     * \param symbolsToAllocation the symbols to allocation
-     * \param availableSymbols the available symbols
+     * @param ssRecord Subscriber station record
+     * @param schedulingType the scheduling type
+     * @param ulMapIe the UL map IE
+     * @param modulationType the modulation type
+     * @param symbolsToAllocation the symbols to allocation
+     * @param availableSymbols the available symbols
      */
     void ServiceBandwidthRequests(const SSRecord* ssRecord,
                                   ServiceFlow::SchedulingType schedulingType,
@@ -102,13 +102,13 @@
                                   uint32_t& availableSymbols) override;
     /**
      * Service bandwidth requests function
-     * \param serviceFlow the service flow
-     * \param schedulingType the scheduling type
-     * \param ulMapIe the UL map IE
-     * \param modulationType the modulation type
-     * \param symbolsToAllocation the symbols to allocation
-     * \param availableSymbols the available symbols
-     * \returns true if successful
+     * @param serviceFlow the service flow
+     * @param schedulingType the scheduling type
+     * @param ulMapIe the UL map IE
+     * @param modulationType the modulation type
+     * @param symbolsToAllocation the symbols to allocation
+     * @param availableSymbols the available symbols
+     * @returns true if successful
      */
     bool ServiceBandwidthRequests(ServiceFlow* serviceFlow,
                                   ServiceFlow::SchedulingType schedulingType,
@@ -119,21 +119,21 @@
     /**
      * Allocate Initial Ranging Interval function
      *
-     * \param symbolsToAllocation symbols to allocation for UpLink Subframe
-     * \param availableSymbols available symbols for rtPS flows
+     * @param symbolsToAllocation symbols to allocation for UpLink Subframe
+     * @param availableSymbols available symbols for rtPS flows
      */
     void AllocateInitialRangingInterval(uint32_t& symbolsToAllocation,
                                         uint32_t& availableSymbols) override;
     /**
      * Setup service flow function
-     * \param ssRecord Subscriber station record
-     * \param serviceFlow the service flow
+     * @param ssRecord Subscriber station record
+     * @param serviceFlow the service flow
      */
     void SetupServiceFlow(SSRecord* ssRecord, ServiceFlow* serviceFlow) override;
 
     /**
      * Process bandwidth request function
-     * \param bwRequestHdr the bandwidth request header
+     * @param bwRequestHdr the bandwidth request header
      */
     void ProcessBandwidthRequest(const BandwidthRequestHeader& bwRequestHdr) override;
 
@@ -142,7 +142,7 @@
 
     /**
      * Set requested bandwidth function
-     * \param sfr the service flow record
+     * @param sfr the service flow record
      */
     void OnSetRequestedBandwidth(ServiceFlowRecord* sfr) override;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/burst-profile-manager.h ns-3.44/src/wimax/model/burst-profile-manager.h
--- ns-3.43/src/wimax/model/burst-profile-manager.h	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/burst-profile-manager.h	2025-03-09 16:55:49.815372700 -0700
@@ -22,7 +22,7 @@
 class RngReq;
 
 /**
- * \ingroup wimax
+ * @ingroup wimax
  *
  * Profile manager for burst communications
  */
@@ -30,14 +30,14 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     /**
      * Constructor
      *
-     * \param device WIMAX device
+     * @param device WIMAX device
      */
     BurstProfileManager(Ptr<WimaxNetDevice> device);
     ~BurstProfileManager() override;
@@ -48,49 +48,49 @@
 
     void DoDispose() override;
     /**
-     * \returns the number of available burst profile
+     * @returns the number of available burst profile
      */
     uint16_t GetNrBurstProfilesToDefine();
 
     /**
-     * \brief returns the modulation type of a given iuc
-     * \param direction should be uplink or downlink
-     * \param iuc the iuc
-     * \returns the modulation type of the selected iuc
+     * @brief returns the modulation type of a given iuc
+     * @param direction should be uplink or downlink
+     * @param iuc the iuc
+     * @returns the modulation type of the selected iuc
      */
     WimaxPhy::ModulationType GetModulationType(uint8_t iuc,
                                                WimaxNetDevice::Direction direction) const;
 
     /**
-     * \brief returns the burst profile
-     * \param modulationType
-     * \param direction should be uplink or downlink
-     * \returns the modulation type of the selected iuc
+     * @brief returns the burst profile
+     * @param modulationType
+     * @param direction should be uplink or downlink
+     * @returns the modulation type of the selected iuc
      */
     uint8_t GetBurstProfile(WimaxPhy::ModulationType modulationType,
                             WimaxNetDevice::Direction direction) const;
 
     /**
-     * \brief Get burst profile for SS
-     * \param modulationType
-     * \param ssRecord
-     * \param rngreq
-     * \returns the burst profile for SS
+     * @brief Get burst profile for SS
+     * @param modulationType
+     * @param ssRecord
+     * @param rngreq
+     * @returns the burst profile for SS
      */
     uint8_t GetBurstProfileForSS(const SSRecord* ssRecord,
                                  const RngReq* rngreq,
                                  WimaxPhy::ModulationType& modulationType) const;
     /**
-     * \brief Get module ation type for SS
-     * \param ssRecord
-     * \param rngreq
-     * \returns the burst profile for SS
+     * @brief Get module ation type for SS
+     * @param ssRecord
+     * @param rngreq
+     * @returns the burst profile for SS
      */
     WimaxPhy::ModulationType GetModulationTypeForSS(const SSRecord* ssRecord,
                                                     const RngReq* rngreq) const;
     /**
-     * \brief Get burst profile to request
-     * \returns the burst profile for SS
+     * @brief Get burst profile to request
+     * @returns the burst profile for SS
      */
     uint8_t GetBurstProfileToRequest();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/cid.cc ns-3.44/src/wimax/model/cid.cc
--- ns-3.43/src/wimax/model/cid.cc	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/cid.cc	2025-03-09 16:55:49.815372700 -0700
@@ -79,10 +79,10 @@
 }
 
 /**
- * \brief equality operator
- * \param lhs left hand side
- * \param rhs right hand side
- * \returns true if equal
+ * @brief equality operator
+ * @param lhs left hand side
+ * @param rhs right hand side
+ * @returns true if equal
  */
 bool
 operator==(const Cid& lhs, const Cid& rhs)
@@ -91,10 +91,10 @@
 }
 
 /**
- * \brief inequality operator
- * \param lhs left hand side
- * \param rhs right hand side
- * \returns true if not equal
+ * @brief inequality operator
+ * @param lhs left hand side
+ * @param rhs right hand side
+ * @returns true if not equal
  */
 bool
 operator!=(const Cid& lhs, const Cid& rhs)
@@ -103,10 +103,10 @@
 }
 
 /**
- * \brief output stream output operator
- * \param os output stream
- * \param cid CID
- * \returns output stream
+ * @brief output stream output operator
+ * @param os output stream
+ * @param cid CID
+ * @returns output stream
  */
 std::ostream&
 operator<<(std::ostream& os, const Cid& cid)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/cid-factory.cc ns-3.44/src/wimax/model/cid-factory.cc
--- ns-3.43/src/wimax/model/cid-factory.cc	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/cid-factory.cc	2025-03-09 16:55:49.815372700 -0700
@@ -108,7 +108,7 @@
 void
 CidFactory::FreeCid(Cid cid)
 {
-    /// \todo We need to update the cid bitmap properly here.
+    /// @todo We need to update the cid bitmap properly here.
     NS_FATAL_ERROR(
         "TODO: Update the cid bitmap properly here-- please implement and contribute a patch");
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/cid-factory.h ns-3.44/src/wimax/model/cid-factory.h
--- ns-3.43/src/wimax/model/cid-factory.h	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/cid-factory.h	2025-03-09 16:55:49.815372700 -0700
@@ -19,7 +19,7 @@
 {
 
 /**
- * \ingroup wimax
+ * @ingroup wimax
  * This class is used exclusively by the BS to allocate CIDs to new connections.
  * This class uses the definitions from Table 345 in ieee-802.16-2004 to
  * allocate cids in different integer ranges according to their type.
@@ -39,55 +39,55 @@
      */
     CidFactory();
     /**
-     * \brief This function returns the next basic CID.
-     * \returns the next basic CID.
+     * @brief This function returns the next basic CID.
+     * @returns the next basic CID.
      */
     Cid AllocateBasic();
     /**
-     * \brief This function returns the next primary basic CID.
-     * \returns the next primary CID.
+     * @brief This function returns the next primary basic CID.
+     * @returns the next primary CID.
      */
     Cid AllocatePrimary();
     /**
-     * \brief This function returns the next Transport (or Secondary) CID.
-     * \returns the next Transport (or Secondary) CID.
+     * @brief This function returns the next Transport (or Secondary) CID.
+     * @returns the next Transport (or Secondary) CID.
      */
     Cid AllocateTransportOrSecondary();
     /**
-     * \brief This function returns the next Multicast CID.
-     * \returns the next Multicast CID.
+     * @brief This function returns the next Multicast CID.
+     * @returns the next Multicast CID.
      */
     Cid AllocateMulticast();
     /**
-     * \brief This function returns the next CID for the specified type.
-     * \param type CID type
-     * \returns the next CID.
+     * @brief This function returns the next CID for the specified type.
+     * @param type CID type
+     * @returns the next CID.
      */
     Cid Allocate(Cid::Type type);
 
     /**
-     * \brief This function determines if the CID is a transport.
-     * \param cid CID type
-     * \returns true if the CID is a transport.
+     * @brief This function determines if the CID is a transport.
+     * @param cid CID type
+     * @returns true if the CID is a transport.
      */
     bool IsTransport(Cid cid) const;
     /**
-     * \brief This function determines if the CID is primary.
-     * \param cid CID type
-     * \returns true if the CID is primary.
+     * @brief This function determines if the CID is primary.
+     * @param cid CID type
+     * @returns true if the CID is primary.
      */
     bool IsPrimary(Cid cid) const;
     /**
-     * \brief This function determines if the CID is basic.
-     * \param cid CID type
-     * \returns true if the CID is basic.
+     * @brief This function determines if the CID is basic.
+     * @param cid CID type
+     * @returns true if the CID is basic.
      */
     bool IsBasic(Cid cid) const;
 
     /**
      * Notify the factory that the connection associated to this
      * cid has been killed and that this cid can be reused.
-     * \param cid CID type
+     * @param cid CID type
      */
     void FreeCid(Cid cid);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/cid.h ns-3.44/src/wimax/model/cid.h
--- ns-3.43/src/wimax/model/cid.h	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/cid.h	2025-03-09 16:55:49.815372700 -0700
@@ -18,9 +18,9 @@
 {
 
 /**
- * \ingroup wimax
- * \class Cid
- * \brief Cid class
+ * @ingroup wimax
+ * @class Cid
+ * @brief Cid class
  */
 class Cid
 {
@@ -42,40 +42,40 @@
     /**
      * Constructor
      *
-     * \param cid
+     * @param cid
      */
     Cid(uint16_t cid);
     ~Cid();
     /**
-     * \return the identifier of the cid
+     * @return the identifier of the cid
      */
     uint16_t GetIdentifier() const;
     /**
-     * \return true if the cid is a multicast cid, false otherwise
+     * @return true if the cid is a multicast cid, false otherwise
      */
     bool IsMulticast() const;
     /**
-     * \return true if the cid is a broadcast cid, false otherwise
+     * @return true if the cid is a broadcast cid, false otherwise
      */
     bool IsBroadcast() const;
     /**
-     * \return true if the cid is a padding cid, false otherwise
+     * @return true if the cid is a padding cid, false otherwise
      */
     bool IsPadding() const;
     /**
-     * \return true if the cid is an initial ranging cid, false otherwise
+     * @return true if the cid is an initial ranging cid, false otherwise
      */
     bool IsInitialRanging() const;
     /**
-     * \return the broadcast cid
+     * @return the broadcast cid
      */
     static Cid Broadcast();
     /**
-     * \return the padding cid
+     * @return the padding cid
      */
     static Cid Padding();
     /**
-     * \return the initial ranging cid
+     * @return the initial ranging cid
      */
     static Cid InitialRanging();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/connection-manager.h ns-3.44/src/wimax/model/connection-manager.h
--- ns-3.43/src/wimax/model/connection-manager.h	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/connection-manager.h	2025-03-09 16:55:49.815372700 -0700
@@ -28,7 +28,7 @@
 class SubscriberStationNetDevice;
 
 /**
- * \ingroup wimax
+ * @ingroup wimax
  * The same connection manager class serves both for BS and SS though some functions are exclusive
  * to only one of them.
  */
@@ -37,8 +37,8 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     ConnectionManager();
@@ -46,46 +46,46 @@
     void DoDispose() override;
     /**
      * Set CID factory
-     * \param cidFactory the CID factory
+     * @param cidFactory the CID factory
      */
     void SetCidFactory(CidFactory* cidFactory);
     /**
-     * \brief allocates the management connection for an ss record. This method is only used by BS
-     * \param ssRecord the ss record to which the management connection will be allocated
-     * \param rngrsp the ranging response message
+     * @brief allocates the management connection for an ss record. This method is only used by BS
+     * @param ssRecord the ss record to which the management connection will be allocated
+     * @param rngrsp the ranging response message
      */
     void AllocateManagementConnections(SSRecord* ssRecord, RngRsp* rngrsp);
     /**
-     * \brief create a connection of type type
-     * \param type type of the connection to create
-     * \return a smart pointer to the created WimaxConnection
+     * @brief create a connection of type type
+     * @param type type of the connection to create
+     * @return a smart pointer to the created WimaxConnection
      */
     Ptr<WimaxConnection> CreateConnection(Cid::Type type);
     /**
-     * \brief add a connection to the list of managed connections
-     * \param connection the connection to add
-     * \param type the type of connection to add
+     * @brief add a connection to the list of managed connections
+     * @param connection the connection to add
+     * @param type the type of connection to add
      */
     void AddConnection(Ptr<WimaxConnection> connection, Cid::Type type);
     /**
-     * \param cid the connection identifier
-     * \return the connection corresponding to cid
+     * @param cid the connection identifier
+     * @return the connection corresponding to cid
      */
     Ptr<WimaxConnection> GetConnection(Cid cid);
     /**
-     * \param type the type of connection to add
-     * \return a vector of all connections matching the input type
+     * @param type the type of connection to add
+     * @return a vector of all connections matching the input type
      */
     std::vector<Ptr<WimaxConnection>> GetConnections(Cid::Type type) const;
     /**
-     * \brief get number of packets
-     * \param type the type of connection to add
-     * \param schedulingType the scheduling type
-     * \returns number of packets
+     * @brief get number of packets
+     * @param type the type of connection to add
+     * @param schedulingType the scheduling type
+     * @returns number of packets
      */
     uint32_t GetNPackets(Cid::Type type, ServiceFlow::SchedulingType schedulingType) const;
     /**
-     * \return true if one of the managed connection has at least one packet to send, false
+     * @return true if one of the managed connection has at least one packet to send, false
      * otherwise
      */
     bool HasPackets() const;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/crc8.h ns-3.44/src/wimax/model/crc8.h
--- ns-3.43/src/wimax/model/crc8.h	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/crc8.h	2025-03-09 16:55:49.815372700 -0700
@@ -14,9 +14,9 @@
 {
 
 /**
- * \param data buffer to calculate the checksum for
- * \param length the length of the buffer (bytes)
- * \returns the computed crc.
+ * @param data buffer to calculate the checksum for
+ * @param length the length of the buffer (bytes)
+ * @returns the computed crc.
  *
  */
 uint8_t CRC8Calculate(const uint8_t* data, int length);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/cs-parameters.h ns-3.44/src/wimax/model/cs-parameters.h
--- ns-3.43/src/wimax/model/cs-parameters.h	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/cs-parameters.h	2025-03-09 16:55:49.815372700 -0700
@@ -18,8 +18,8 @@
 {
 
 /**
- * \ingroup wimax
- * \brief CsParameters class
+ * @ingroup wimax
+ * @brief CsParameters class
  */
 class CsParameters
 {
@@ -35,38 +35,38 @@
     CsParameters();
     ~CsParameters();
     /**
-     * \brief creates a convergence sub-layer parameters from a tlv
-     * \param tlv the TLV
+     * @brief creates a convergence sub-layer parameters from a tlv
+     * @param tlv the TLV
      */
     CsParameters(Tlv tlv);
     /**
-     * \brief creates a convergence sub-layer parameters from an ipcs classifier record
-     * \param classifierDscAction the DCS action type
-     * \param classifier the IPCS classifier record
+     * @brief creates a convergence sub-layer parameters from an ipcs classifier record
+     * @param classifierDscAction the DCS action type
+     * @param classifier the IPCS classifier record
      */
     CsParameters(Action classifierDscAction, IpcsClassifierRecord classifier);
     /**
-     * \brief sets the dynamic service classifier action to ADD, Change or delete. Only ADD is
+     * @brief sets the dynamic service classifier action to ADD, Change or delete. Only ADD is
      * supported
-     * \param action the action enumeration
+     * @param action the action enumeration
      */
     void SetClassifierDscAction(Action action);
     /**
-     * \brief sets the packet classifier rules
-     * \param packetClassifierRule the IPCS classifier record
+     * @brief sets the packet classifier rules
+     * @param packetClassifierRule the IPCS classifier record
      */
     void SetPacketClassifierRule(IpcsClassifierRecord packetClassifierRule);
     /**
-     * \return the  dynamic service classifier action
+     * @return the  dynamic service classifier action
      */
     Action GetClassifierDscAction() const;
     /**
-     * \return the  the packet classifier rules
+     * @return the  the packet classifier rules
      */
     IpcsClassifierRecord GetPacketClassifierRule() const;
     /**
-     * \brief creates a tlv from the classifier record
-     * \return the created tlv
+     * @brief creates a tlv from the classifier record
+     * @return the created tlv
      */
     Tlv ToTlv() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/default-traces.h ns-3.44/src/wimax/model/default-traces.h
--- ns-3.43/src/wimax/model/default-traces.h	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/default-traces.h	2025-03-09 16:55:49.815372700 -0700
@@ -14,7 +14,7 @@
 {
 
 /**
- * \brief These represent default traces, providing a number of
+ * @brief These represent default traces, providing a number of
  * parameters for each SNR value.
  *
  * The parameters provided are (in order):
@@ -60,8 +60,8 @@
  * simple IT++ program simulating the theoretical model of a AWGN channel given
  * BER=3/2*erfc(sqrt(k*0.1*(Eb_N0_dB)));
  *
- * \relates ns3::SNRToBlockErrorRateManager
- * \hideinitializer
+ * @relates ns3::SNRToBlockErrorRateManager
+ * @hideinitializer
  * @{
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/dl-mac-messages.h ns-3.44/src/wimax/model/dl-mac-messages.h
--- ns-3.43/src/wimax/model/dl-mac-messages.h	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/dl-mac-messages.h	2025-03-09 16:55:49.815372700 -0700
@@ -20,7 +20,7 @@
 {
 
 /**
- * \ingroup wimax
+ * @ingroup wimax
  * This class implements the DCD channel encodings as described by "IEEE Standard for
  * Local and metropolitan area networks Part 16: Air Interface for Fixed Broadband Wireless Access
  * Systems" 11.4.1 DCD channel encodings, page 659
@@ -33,66 +33,66 @@
 
     /**
      * Set BS EIRP field
-     * \param bs_eirp the BS EIRP
+     * @param bs_eirp the BS EIRP
      */
     void SetBsEirp(uint16_t bs_eirp);
     /**
      * Set EIRX IR MAX field
-     * \param rss_ir_max the EIRRX IR MAX
+     * @param rss_ir_max the EIRRX IR MAX
      */
     void SetEirxPIrMax(uint16_t rss_ir_max);
     /**
      * Set frequency field
-     * \param frequency the frequency
+     * @param frequency the frequency
      */
     void SetFrequency(uint32_t frequency);
 
     /**
      * Get BS EIRP field
-     * \returns the BS EIRP
+     * @returns the BS EIRP
      */
     uint16_t GetBsEirp() const;
     /**
      * Get EIRX IR MAX field
-     * \returns the EIRX IR MAX
+     * @returns the EIRX IR MAX
      */
     uint16_t GetEirxPIrMax() const;
     /**
      * Get frequency function
-     * \returns the frequency
+     * @returns the frequency
      */
     uint32_t GetFrequency() const;
 
     /**
      * Get size field
-     * \returns the size
+     * @returns the size
      */
     uint16_t GetSize() const;
 
     /**
      * Write item
-     * \param start the iterator
-     * \returns the updated iterator
+     * @param start the iterator
+     * @returns the updated iterator
      */
     Buffer::Iterator Write(Buffer::Iterator start) const;
     /**
      * Read item
-     * \param start the iterator
-     * \returns the updated iterator
+     * @param start the iterator
+     * @returns the updated iterator
      */
     Buffer::Iterator Read(Buffer::Iterator start);
 
   private:
     /**
      * Write item
-     * \param start iterator
-     * \returns the updated iterator
+     * @param start iterator
+     * @returns the updated iterator
      */
     virtual Buffer::Iterator DoWrite(Buffer::Iterator start) const = 0;
     /**
      * Read item
-     * \param start the iterator
-     * \returns the updated iterator
+     * @param start the iterator
+     * @returns the updated iterator
      */
     virtual Buffer::Iterator DoRead(Buffer::Iterator start) = 0;
 
@@ -130,85 +130,85 @@
 
     /**
      * Set channel number field
-     * \param channelNr the channel number
+     * @param channelNr the channel number
      */
     void SetChannelNr(uint8_t channelNr);
     /**
      * Set TTG field
-     * \param ttg the TTG
+     * @param ttg the TTG
      */
     void SetTtg(uint8_t ttg);
     /**
      * Set RTG field
-     * \param rtg the RTG
+     * @param rtg the RTG
      */
     void SetRtg(uint8_t rtg);
 
     /**
      * Set base station ID field
-     * \param baseStationId the base station ID
+     * @param baseStationId the base station ID
      */
     void SetBaseStationId(Mac48Address baseStationId);
     /**
      * Set frame duration code field
-     * \param frameDurationCode the frame duration code
+     * @param frameDurationCode the frame duration code
      */
     void SetFrameDurationCode(uint8_t frameDurationCode);
     /**
      * Set frame number field
-     * \param frameNumber the frame number
+     * @param frameNumber the frame number
      */
     void SetFrameNumber(uint32_t frameNumber);
 
     /**
      * Get channel number field
-     * \returns the channel number
+     * @returns the channel number
      */
     uint8_t GetChannelNr() const;
     /**
      * Get TTG field
-     * \returns the TTG
+     * @returns the TTG
      */
     uint8_t GetTtg() const;
     /**
      * Get RTG field
-     * \returns the RTG
+     * @returns the RTG
      */
     uint8_t GetRtg() const;
 
     /**
      * Get base station ID field
-     * \returns the base station MAC address
+     * @returns the base station MAC address
      */
     Mac48Address GetBaseStationId() const;
     /**
      * Get frame duration code field
-     * \returns the frame duration code
+     * @returns the frame duration code
      */
     uint8_t GetFrameDurationCode() const;
     /**
      * Get frame number field
-     * \returns the frame number
+     * @returns the frame number
      */
     uint32_t GetFrameNumber() const;
 
     /**
      * Get size field
-     * \returns the size
+     * @returns the size
      */
     uint16_t GetSize() const;
 
   private:
     /**
      * Write item
-     * \param start the iterator
-     * \returns the updated iterator
+     * @param start the iterator
+     * @returns the updated iterator
      */
     Buffer::Iterator DoWrite(Buffer::Iterator start) const override;
     /**
      * Read item
-     * \param start the iterator
-     * \returns the updated iterator
+     * @param start the iterator
+     * @returns the updated iterator
      */
     Buffer::Iterator DoRead(Buffer::Iterator start) override;
 
@@ -271,52 +271,52 @@
 
     /**
      * Set type field
-     * \param type the type to set
+     * @param type the type to set
      */
     void SetType(uint8_t type);
     /**
      * Set length field
-     * \param length the length to set
+     * @param length the length to set
      */
     void SetLength(uint8_t length);
     /**
      * Set DIUC field
-     * \param diuc the DIUC
+     * @param diuc the DIUC
      */
     void SetDiuc(uint8_t diuc);
 
     /**
      * Set FEC code type
-     * \param fecCodeType the FEC code type
+     * @param fecCodeType the FEC code type
      */
     void SetFecCodeType(uint8_t fecCodeType);
 
     /**
      * Get type function
-     * \returns the type
+     * @returns the type
      */
     uint8_t GetType() const;
-    /** \returns the length field */
+    /** @returns the length field */
     uint8_t GetLength() const;
-    /** \returns the DIUC field */
+    /** @returns the DIUC field */
     uint8_t GetDiuc() const;
 
-    /** \returns the FEC code type */
+    /** @returns the FEC code type */
     uint8_t GetFecCodeType() const;
 
-    /** \returns the size */
+    /** @returns the size */
     uint16_t GetSize() const;
 
     /**
      * Write item
-     * \param start the starting item iterator
-     * \returns the iterator
+     * @param start the starting item iterator
+     * @returns the iterator
      */
     Buffer::Iterator Write(Buffer::Iterator start) const;
     /**
      * Read item
-     * \param start the starting item iterator
-     * \returns the iterator
+     * @param start the starting item iterator
+     * @returns the iterator
      */
     Buffer::Iterator Read(Buffer::Iterator start);
 
@@ -359,54 +359,54 @@
 
     /**
      * Set configuration change count field
-     * \param configurationChangeCount the configuration change count
+     * @param configurationChangeCount the configuration change count
      */
     void SetConfigurationChangeCount(uint8_t configurationChangeCount);
     /**
      * Set channel encodings field
-     * \param channelEncodings the channel encodings
+     * @param channelEncodings the channel encodings
      */
     void SetChannelEncodings(OfdmDcdChannelEncodings channelEncodings);
     /**
      * Add DL burst profile field
-     * \param dlBurstProfile the DL burst profile
+     * @param dlBurstProfile the DL burst profile
      */
     void AddDlBurstProfile(OfdmDlBurstProfile dlBurstProfile);
     /**
      * Set number DL burst profile field
-     * \param nrDlBurstProfiles the number of DL burst profiles
+     * @param nrDlBurstProfiles the number of DL burst profiles
      */
     void SetNrDlBurstProfiles(uint8_t nrDlBurstProfiles);
 
     /**
      * Get configuration change count field
-     * \returns the configuration change count
+     * @returns the configuration change count
      */
     uint8_t GetConfigurationChangeCount() const;
     /**
      * Get channel encodings field
-     * \returns the channel encodings
+     * @returns the channel encodings
      */
     OfdmDcdChannelEncodings GetChannelEncodings() const;
     /**
      * Get DL burst profile field
-     * \returns the DL burst profiles
+     * @returns the DL burst profiles
      */
     std::vector<OfdmDlBurstProfile> GetDlBurstProfiles() const;
     /**
      * Get number DL burst profiles field
-     * \returns the number of DL burst profiles
+     * @returns the number of DL burst profiles
      */
     uint8_t GetNrDlBurstProfiles() const;
 
     /**
      * Get name field
-     * \returns the name string
+     * @returns the name string
      */
     std::string GetName() const;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -453,62 +453,62 @@
 
     /**
      * Set CID function
-     * \param cid the CID
+     * @param cid the CID
      */
     void SetCid(Cid cid);
     /**
      * Set DIUC field
-     * \param diuc the DIUC
+     * @param diuc the DIUC
      */
     void SetDiuc(uint8_t diuc);
     /**
      * Set preamble present field
-     * \param preamblePresent the preamble present
+     * @param preamblePresent the preamble present
      */
     void SetPreamblePresent(uint8_t preamblePresent);
     /**
      * Set start time field
-     * \param startTime the start time value
+     * @param startTime the start time value
      */
     void SetStartTime(uint16_t startTime);
 
     /**
      * Set CID field
-     * \returns the CID
+     * @returns the CID
      */
     Cid GetCid() const;
     /**
      * Get DIUC field
-     * \returns the DIUC
+     * @returns the DIUC
      */
     uint8_t GetDiuc() const;
     /**
      * Get preamble present field
-     * \returns the preamble present indicator
+     * @returns the preamble present indicator
      */
     uint8_t GetPreamblePresent() const;
     /**
      * Get start time field
-     * \returns the start time
+     * @returns the start time
      */
     uint16_t GetStartTime() const;
 
     /**
      * Get size
-     * \returns the size
+     * @returns the size
      */
     uint16_t GetSize() const;
 
     /**
      * Write item
-     * \param start the iterator
-     * \returns the updated iterator
+     * @param start the iterator
+     * @returns the updated iterator
      */
     Buffer::Iterator Write(Buffer::Iterator start) const;
     /**
      * Read item
-     * \param start the iterator
-     * \returns the updated iterator
+     * @param start the iterator
+     * @returns the updated iterator
      */
     Buffer::Iterator Read(Buffer::Iterator start);
 
@@ -550,44 +550,44 @@
 
     /**
      * Set DCD count field
-     * \param dcdCount the DCD count
+     * @param dcdCount the DCD count
      */
     void SetDcdCount(uint8_t dcdCount);
     /**
      * Set base station ID field
-     * \param baseStationID the base station ID
+     * @param baseStationID the base station ID
      */
     void SetBaseStationId(Mac48Address baseStationID);
     /**
      * Add DL Map element field
-     * \param dlMapElement the DL map element
+     * @param dlMapElement the DL map element
      */
     void AddDlMapElement(OfdmDlMapIe dlMapElement);
 
     /**
      * Get DCD count field
-     * \returns the DCD count
+     * @returns the DCD count
      */
     uint8_t GetDcdCount() const;
     /**
      * Get base station ID field
-     * \returns the MAC address
+     * @returns the MAC address
      */
     Mac48Address GetBaseStationId() const;
     /**
      * Get DL Map elements field
-     * \returns the DL map elements
+     * @returns the DL map elements
      */
     std::list<OfdmDlMapIe> GetDlMapElements() const;
 
     /**
      * Get name field
-     * \returns the name string
+     * @returns the name string
      */
     std::string GetName() const;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/ipcs-classifier.h ns-3.44/src/wimax/model/ipcs-classifier.h
--- ns-3.43/src/wimax/model/ipcs-classifier.h	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/ipcs-classifier.h	2025-03-09 16:55:49.815372700 -0700
@@ -23,7 +23,7 @@
 class SsServiceFlowManager;
 
 /**
- * \ingroup wimax
+ * @ingroup wimax
  *
  * IPCS classifier
  */
@@ -31,18 +31,18 @@
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     IpcsClassifier();
     ~IpcsClassifier() override;
     /**
-     * \brief classify a packet in a service flow
-     * \param packet the packet to classify
-     * \param sfm the service flow manager to be used to classify packets
-     * \param dir The direction on which the packet should be sent (UP or DOWN)
-     * \return The service flow that should be used to send this packet
+     * @brief classify a packet in a service flow
+     * @param packet the packet to classify
+     * @param sfm the service flow manager to be used to classify packets
+     * @param dir The direction on which the packet should be sent (UP or DOWN)
+     * @return The service flow that should be used to send this packet
      */
     ServiceFlow* Classify(Ptr<const Packet> packet,
                           Ptr<ServiceFlowManager> sfm,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/ipcs-classifier-record.h ns-3.44/src/wimax/model/ipcs-classifier-record.h
--- ns-3.43/src/wimax/model/ipcs-classifier-record.h	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/ipcs-classifier-record.h	2025-03-09 16:55:49.815372700 -0700
@@ -20,8 +20,8 @@
 {
 
 /**
- * \ingroup wimax
- * \brief IpcsClassifierRecord class
+ * @ingroup wimax
+ * @brief IpcsClassifierRecord class
  */
 class IpcsClassifierRecord
 {
@@ -29,17 +29,17 @@
     IpcsClassifierRecord();
     ~IpcsClassifierRecord();
     /**
-     * \brief creates a classifier records and sets all its parameters
-     * \param srcAddress the source ip address
-     * \param srcMask the mask to apply on the source ip address
-     * \param dstAddress the destination ip address
-     * \param dstMask the mask to apply on the destination ip address
-     * \param srcPortLow the lower boundary of the source port range
-     * \param srcPortHigh the higher boundary of the source port range
-     * \param dstPortLow the lower boundary of the destination port range
-     * \param dstPortHigh the higher boundary of the destination port range
-     * \param protocol the L4 protocol
-     * \param priority the priority of this classifier
+     * @brief creates a classifier records and sets all its parameters
+     * @param srcAddress the source ip address
+     * @param srcMask the mask to apply on the source ip address
+     * @param dstAddress the destination ip address
+     * @param dstMask the mask to apply on the destination ip address
+     * @param srcPortLow the lower boundary of the source port range
+     * @param srcPortHigh the higher boundary of the source port range
+     * @param dstPortLow the lower boundary of the destination port range
+     * @param dstPortHigh the higher boundary of the destination port range
+     * @param protocol the L4 protocol
+     * @param priority the priority of this classifier
      *
      */
     IpcsClassifierRecord(Ipv4Address srcAddress,
@@ -53,62 +53,62 @@
                          uint8_t protocol,
                          uint8_t priority);
     /**
-     * \brief Decodes a TLV and creates a classifier
-     * \param tlv the TLV to decode and from which the classifier parameters will be extracted
+     * @brief Decodes a TLV and creates a classifier
+     * @param tlv the TLV to decode and from which the classifier parameters will be extracted
      */
     IpcsClassifierRecord(Tlv tlv);
     /**
-     * \brief Creates a TLV from this classifier
-     * \return the created TLV
+     * @brief Creates a TLV from this classifier
+     * @return the created TLV
      */
     Tlv ToTlv() const;
     /**
-     * \brief add a new source ip address to the classifier
-     * \param srcAddress the source ip address
-     * \param srcMask the mask to apply on the source ip address
+     * @brief add a new source ip address to the classifier
+     * @param srcAddress the source ip address
+     * @param srcMask the mask to apply on the source ip address
      */
     void AddSrcAddr(Ipv4Address srcAddress, Ipv4Mask srcMask);
     /**
-     * \brief add a new destination ip address to the classifier
-     * \param dstAddress the destination ip address
-     * \param dstMask the mask to apply on the destination ip address
+     * @brief add a new destination ip address to the classifier
+     * @param dstAddress the destination ip address
+     * @param dstMask the mask to apply on the destination ip address
      */
     void AddDstAddr(Ipv4Address dstAddress, Ipv4Mask dstMask);
     /**
-     * \brief add a range of source port to the classifier
-     * \param srcPortLow the lower boundary of the source port range
-     * \param srcPortHigh the higher boundary of the source port range
+     * @brief add a range of source port to the classifier
+     * @param srcPortLow the lower boundary of the source port range
+     * @param srcPortHigh the higher boundary of the source port range
      */
     void AddSrcPortRange(uint16_t srcPortLow, uint16_t srcPortHigh);
     /**
-     * \brief add a range of destination port to the classifier
-     * \param dstPortLow the lower boundary of the destination port range
-     * \param dstPortHigh the higher boundary of the destination port range
+     * @brief add a range of destination port to the classifier
+     * @param dstPortLow the lower boundary of the destination port range
+     * @param dstPortHigh the higher boundary of the destination port range
      */
     void AddDstPortRange(uint16_t dstPortLow, uint16_t dstPortHigh);
     /**
-     * \brief add a protocol to the classifier
-     * \param proto the L4 protocol to add
+     * @brief add a protocol to the classifier
+     * @param proto the L4 protocol to add
      */
     void AddProtocol(uint8_t proto);
     /**
-     * \brief Set the priority of this classifier
-     * \param prio the priority of the classifier
+     * @brief Set the priority of this classifier
+     * @param prio the priority of the classifier
      */
     void SetPriority(uint8_t prio);
     /**
-     * \brief Set the index of the classifier
-     * \param index the index of the classifier
+     * @brief Set the index of the classifier
+     * @param index the index of the classifier
      */
     void SetIndex(uint16_t index);
     /**
-     * \brief check if a packets can be used with this classifier
-     * \param srcAddress the source ip address of the packet
-     * \param dstAddress the destination ip address of the packet
-     * \param srcPort the source port of the packet
-     * \param dstPort the destination port of the packet
-     * \param proto The L4 protocol of the packet
-     * \return true if there is a match
+     * @brief check if a packets can be used with this classifier
+     * @param srcAddress the source ip address of the packet
+     * @param dstAddress the destination ip address of the packet
+     * @param srcPort the source port of the packet
+     * @param dstPort the destination port of the packet
+     * @param proto The L4 protocol of the packet
+     * @return true if there is a match
      */
     bool CheckMatch(Ipv4Address srcAddress,
                     Ipv4Address dstAddress,
@@ -116,52 +116,52 @@
                     uint16_t dstPort,
                     uint8_t proto) const;
     /**
-     * \return the cid associated with this classifier
+     * @return the cid associated with this classifier
      */
     uint16_t GetCid() const;
     /**
-     * \return the priority of this classifier
+     * @return the priority of this classifier
      */
     uint8_t GetPriority() const;
     /**
-     * \return the index of this classifier
+     * @return the index of this classifier
      */
     uint16_t GetIndex() const;
     /**
-     * \brief Set the cid associated to this classifier
-     * \param cid the connection identifier
+     * @brief Set the cid associated to this classifier
+     * @param cid the connection identifier
      */
     void SetCid(uint16_t cid);
 
   private:
     /**
      * Check match source address function
-     * \param srcAddress source IP address to check
-     * \returns true if a match
+     * @param srcAddress source IP address to check
+     * @returns true if a match
      */
     bool CheckMatchSrcAddr(Ipv4Address srcAddress) const;
     /**
      * Check match destination address function
-     * \param dstAddress destination IP address to check
-     * \returns true if a match
+     * @param dstAddress destination IP address to check
+     * @returns true if a match
      */
     bool CheckMatchDstAddr(Ipv4Address dstAddress) const;
     /**
      * Check match source port function
-     * \param srcPort source port to check
-     * \returns true if a match
+     * @param srcPort source port to check
+     * @returns true if a match
      */
     bool CheckMatchSrcPort(uint16_t srcPort) const;
     /**
      * Check match destination port function
-     * \param dstPort destination port to check
-     * \returns true if a match
+     * @param dstPort destination port to check
+     * @returns true if a match
      */
     bool CheckMatchDstPort(uint16_t dstPort) const;
     /**
      * Check match protocol function
-     * \param proto protocol number to check
-     * \returns true if a match
+     * @param proto protocol number to check
+     * @returns true if a match
      */
     bool CheckMatchProtocol(uint8_t proto) const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/mac-messages.h ns-3.44/src/wimax/model/mac-messages.h
--- ns-3.43/src/wimax/model/mac-messages.h	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/mac-messages.h	2025-03-09 16:55:49.815372700 -0700
@@ -25,7 +25,7 @@
 {
 
 /**
- * \ingroup wimax
+ * @ingroup wimax
  * Mac Management messages
  * Section 6.3.2.3 MAC Management messages page 42, Table 14 page 43
  */
@@ -52,26 +52,26 @@
     /**
      * Constructor
      *
-     * \param type message type
+     * @param type message type
      */
     ManagementMessageType(uint8_t type);
     ~ManagementMessageType() override;
     /**
      * Set type field
-     * \param type the type
+     * @param type the type
      */
     void SetType(uint8_t type);
     /**
      * Get type field
-     * \returns the type value
+     * @returns the type value
      */
     uint8_t GetType() const;
 
-    /** \returns the name field */
+    /** @returns the name field */
     std::string GetName() const;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -105,7 +105,7 @@
 {
 
 /**
- * \ingroup wimax
+ * @ingroup wimax
  * This class implements the ranging response message described by "IEEE Standard for
  * Local and metropolitan area networks Part 16: Air Interface for Fixed Broadband Wireless Access
  * Systems" 6.3.2.3.6 Ranging response (RNG-RSP) message, page 50
@@ -116,156 +116,156 @@
     RngRsp();
     ~RngRsp() override;
     /**
-     * \brief set the  Tx timing offset adjustment (signed 32-bit).
-     * \param timingAdjust The time required to advance SS transmission so frames
+     * @brief set the  Tx timing offset adjustment (signed 32-bit).
+     * @param timingAdjust The time required to advance SS transmission so frames
      * arrive at the expected time instance at the BS.
      */
     void SetTimingAdjust(uint32_t timingAdjust);
     /**
-     * \brief set the relative change in transmission power level that the SS should make in order
+     * @brief set the relative change in transmission power level that the SS should make in order
      * that transmissions arrive at the BS at the desired power. When subchannelization is employed,
      * the subscriber shall interpret the power offset adjustment as a required change to the
      * transmitted power density.
-     * \param powerLevelAdjust the relative change in transmission power level
+     * @param powerLevelAdjust the relative change in transmission power level
      */
     void SetPowerLevelAdjust(uint8_t powerLevelAdjust);
     /**
-     * \brief set the relative change in transmission frequency that the SS should take in order to
+     * @brief set the relative change in transmission frequency that the SS should take in order to
      * better match the BS. This is fine-frequency adjustment within a channel, not reassignment to
      * a different channel
-     * \param offsetFreqAdjust Offset frequency adjustment
+     * @param offsetFreqAdjust Offset frequency adjustment
      */
     void SetOffsetFreqAdjust(uint32_t offsetFreqAdjust);
     /**
-     * \brief set the range status.
-     * \param rangStatus Range status
+     * @brief set the range status.
+     * @param rangStatus Range status
      */
     void SetRangStatus(uint8_t rangStatus);
     /**
-     * \brief set the Center frequency, in kHz, of new downlink channel where the SS should redo
+     * @brief set the Center frequency, in kHz, of new downlink channel where the SS should redo
      * initial ranging.
-     * \param dlFreqOverride the Center frequency in kHz
+     * @param dlFreqOverride the Center frequency in kHz
      */
     void SetDlFreqOverride(uint32_t dlFreqOverride);
     /**
-     * \brief set the identifier of the uplink channel with which the SS is to redo initial ranging
-     * \param ulChnlIdOverride the uplink channel index
+     * @brief set the identifier of the uplink channel with which the SS is to redo initial ranging
+     * @param ulChnlIdOverride the uplink channel index
      */
     void SetUlChnlIdOverride(uint8_t ulChnlIdOverride);
     /**
-     * \brief set the DL oper burst profile
-     * \param dlOperBurstProfile the oper burt profile
+     * @brief set the DL oper burst profile
+     * @param dlOperBurstProfile the oper burt profile
      */
     void SetDlOperBurstProfile(uint16_t dlOperBurstProfile);
     /**
-     * \brief set the MAC address
-     * \param macAddress the MAC address
+     * @brief set the MAC address
+     * @param macAddress the MAC address
      */
     void SetMacAddress(Mac48Address macAddress);
 
     /**
-     * \brief set basic CID.
-     * \param basicCid Basic CID
+     * @brief set basic CID.
+     * @param basicCid Basic CID
      */
     void SetBasicCid(Cid basicCid);
     /**
-     * \brief set primary CID.
-     * \param primaryCid Primary CID
+     * @brief set primary CID.
+     * @param primaryCid Primary CID
      */
     void SetPrimaryCid(Cid primaryCid);
 
     /**
-     * \brief set AAS broadcast permission.
-     * \param aasBdcastPermission AAS broadcast permission
+     * @brief set AAS broadcast permission.
+     * @param aasBdcastPermission AAS broadcast permission
      */
     void SetAasBdcastPermission(uint8_t aasBdcastPermission);
     /**
-     * \brief set frame number.
-     * \param frameNumber Frame number
+     * @brief set frame number.
+     * @param frameNumber Frame number
      */
     void SetFrameNumber(uint32_t frameNumber);
     /**
-     * \brief set initial range opp number.
-     * \param initRangOppNumber Initial range opp number
+     * @brief set initial range opp number.
+     * @param initRangOppNumber Initial range opp number
      */
     void SetInitRangOppNumber(uint8_t initRangOppNumber);
     /**
-     * \brief set range sub channel.
-     * \param rangSubchnl Range subchannel
+     * @brief set range sub channel.
+     * @param rangSubchnl Range subchannel
      */
     void SetRangSubchnl(uint8_t rangSubchnl);
     /**
-     * \return Tx timing offset adjustment (signed 32-bit). The time required to advance SS
+     * @return Tx timing offset adjustment (signed 32-bit). The time required to advance SS
      * transmission so frames arrive at the expected time instance at the BS.
      */
     uint32_t GetTimingAdjust() const;
     /**
-     * \return the relative change in transmission power level that the SS should take in order
+     * @return the relative change in transmission power level that the SS should take in order
      * that transmissions arrive at the BS at the desired power. When subchannelization is employed,
      * the subscriber shall interpret the power offset adjustment as a required change to the
      * transmitted power density.
      */
     uint8_t GetPowerLevelAdjust() const;
     /**
-     * \return the relative change in transmission frequency that the SS should take in order to
+     * @return the relative change in transmission frequency that the SS should take in order to
      * better match the BS. This is fine-frequency adjustment within a channel, not reassignment to
      * a different channel.
      */
     uint32_t GetOffsetFreqAdjust() const;
     /**
-     * \return the range status.
+     * @return the range status.
      */
     uint8_t GetRangStatus() const;
     /**
-     * \return Center frequency, in kHz, of new downlink channel where the SS should redo initial
+     * @return Center frequency, in kHz, of new downlink channel where the SS should redo initial
      * ranging.
      */
     uint32_t GetDlFreqOverride() const;
     /**
-     * \return The identifier of the uplink channel with which the SS is to redo initial ranging
+     * @return The identifier of the uplink channel with which the SS is to redo initial ranging
      */
     uint8_t GetUlChnlIdOverride() const;
     /**
-     * \return DlOperBurstProfile: This parameter is sent in response to the RNG-REQ Requested
+     * @return DlOperBurstProfile: This parameter is sent in response to the RNG-REQ Requested
      * Downlink Burst Profile parameter
      */
     uint16_t GetDlOperBurstProfile() const;
     /**
-     * \return MAC address
+     * @return MAC address
      */
     Mac48Address GetMacAddress() const;
     /**
-     * \return basic CID
+     * @return basic CID
      */
     Cid GetBasicCid() const;
     /**
-     * \return primary CID
+     * @return primary CID
      */
     Cid GetPrimaryCid() const;
     /**
-     * \return AAS broadcast permission
+     * @return AAS broadcast permission
      */
     uint8_t GetAasBdcastPermission() const;
     /**
-     * \return frame number
+     * @return frame number
      */
     uint32_t GetFrameNumber() const;
     /**
-     * \return initial range opp number
+     * @return initial range opp number
      */
     uint8_t GetInitRangOppNumber() const;
     /**
-     * \return range sub channel
+     * @return range sub channel
      */
     uint8_t GetRangSubchnl() const;
 
     /**
-     * \return name string
+     * @return name string
      */
     std::string GetName() const;
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -366,7 +366,7 @@
 namespace ns3
 {
 /**
- * \ingroup wimax
+ * @ingroup wimax
  * This class implements the DSA-REQ message described by "IEEE Standard for
  * Local and metropolitan area networks Part 16: Air Interface for Fixed Broadband Wireless Access
  * Systems" 6.3.2.3.10 DSA-REQ message, page 62
@@ -379,52 +379,52 @@
     /**
      * Constructor
      *
-     * \param sf service flow
+     * @param sf service flow
      */
     DsaReq(ServiceFlow sf);
     /**
-     * \brief set the transaction ID
-     * \param transactionId
+     * @brief set the transaction ID
+     * @param transactionId
      */
     void SetTransactionId(uint16_t transactionId);
     /**
-     * \brief set the service flow identifier
-     * \param sfid the service flow identifier
+     * @brief set the service flow identifier
+     * @param sfid the service flow identifier
      */
     void SetSfid(uint32_t sfid);
     /**
-     * \brief set the connection identifier
-     * \param cid the connection identifier
+     * @brief set the connection identifier
+     * @param cid the connection identifier
      */
     void SetCid(Cid cid);
     /**
-     * \brief specify a service flow to be requested by this message
-     * \param sf the service flow
+     * @brief specify a service flow to be requested by this message
+     * @param sf the service flow
      */
     void SetServiceFlow(ServiceFlow sf);
     /**
-     * \return the service flow requested by this message
+     * @return the service flow requested by this message
      */
     ServiceFlow GetServiceFlow() const;
     /**
-     * \return the transaction ID
+     * @return the transaction ID
      */
     uint16_t GetTransactionId() const;
     /**
-     * \return the service flow identifier
+     * @return the service flow identifier
      */
     uint32_t GetSfid() const;
     /**
-     * \return the connection identifier
+     * @return the connection identifier
      */
     Cid GetCid() const;
     /**
-     * \return the service name
+     * @return the service name
      */
     std::string GetName() const;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -461,11 +461,11 @@
 {
 
 /**
- * \ingroup wimax
+ * @ingroup wimax
  * This class implements the DSA-RSP message described by "IEEE Standard for
  * Local and metropolitan area networks Part 16: Air Interface for Fixed Broadband Wireless Access
  * Systems" 6.3.2.3.11 DSA-RSP message, page 63
- * \verbatim
+ * @verbatim
    0             7             15            23
    +-------------+-------------+-------------+
    |Mngt msg type|       Transaction ID      |
@@ -481,59 +481,59 @@
     ~DsaRsp() override;
 
     /**
-     * \brief set the transaction ID
-     * \param transactionId
+     * @brief set the transaction ID
+     * @param transactionId
      */
     void SetTransactionId(uint16_t transactionId);
     /**
-     * \return the transaction ID
+     * @return the transaction ID
      */
     uint16_t GetTransactionId() const;
 
     /**
-     * \brief set the confirmation code
-     * \param confirmationCode
+     * @brief set the confirmation code
+     * @param confirmationCode
      */
     void SetConfirmationCode(uint16_t confirmationCode);
     /**
-     * \return the confirmation code
+     * @return the confirmation code
      */
     uint16_t GetConfirmationCode() const;
     /**
-     * \brief set the service flow identifier
-     * \param sfid the service flow identifier
+     * @brief set the service flow identifier
+     * @param sfid the service flow identifier
      */
     void SetSfid(uint32_t sfid);
     /**
-     * \return the service flow identifier
+     * @return the service flow identifier
      */
     uint32_t GetSfid() const;
     /**
-     * \brief set the connection identifier
-     * \param cid the connection identifier
+     * @brief set the connection identifier
+     * @param cid the connection identifier
      */
     void SetCid(Cid cid);
     /**
-     * \return the connection identifier
+     * @return the connection identifier
      */
     Cid GetCid() const;
     /**
-     * \brief specify a service flow to be requested by this message
-     * \param sf the service flow
+     * @brief specify a service flow to be requested by this message
+     * @param sf the service flow
      */
     void SetServiceFlow(ServiceFlow sf);
     /**
-     * \return the service flow requested by this message
+     * @return the service flow requested by this message
      */
     ServiceFlow GetServiceFlow() const;
 
     /**
-     * \return the service name
+     * @return the service name
      */
     std::string GetName() const;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -569,7 +569,7 @@
 {
 
 /**
- * \ingroup wimax
+ * @ingroup wimax
  * This class implements the DSA-ACK message described by "IEEE Standard for
  * Local and metropolitan area networks Part 16: Air Interface for Fixed Broadband Wireless Access
  * Systems" 6.3.2.3.12 DSA-ACK message, page 64
@@ -582,34 +582,34 @@
 
     /**
      * Set transaction ID field
-     * \param transactionId the transaction ID
+     * @param transactionId the transaction ID
      */
     void SetTransactionId(uint16_t transactionId);
     /**
      * Get transaction ID field
-     * \returns the transaction ID
+     * @returns the transaction ID
      */
     uint16_t GetTransactionId() const;
 
     /**
      * Set confirmation code field
-     * \param confirmationCode the confirmation code
+     * @param confirmationCode the confirmation code
      */
     void SetConfirmationCode(uint16_t confirmationCode);
     /**
      * Get confirmation code field
-     * \returns the confirmation code
+     * @returns the confirmation code
      */
     uint16_t GetConfirmationCode() const;
 
     /**
      * Get name field
-     * \return the name string
+     * @return the name string
      */
     std::string GetName() const;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -643,7 +643,7 @@
 {
 
 /**
- * \ingroup wimax
+ * @ingroup wimax
  * This class implements the ranging request message described by "IEEE Standard for
  * Local and metropolitan area networks Part 16: Air Interface for Fixed Broadband Wireless Access
  * Systems"
@@ -656,44 +656,44 @@
 
     /**
      * Set request DL burst profile field
-     * \param reqDlBurstProfile the request DL burst profile
+     * @param reqDlBurstProfile the request DL burst profile
      */
     void SetReqDlBurstProfile(uint8_t reqDlBurstProfile);
     /**
      * Set MAC address field
-     * \param macAddress the MAC address
+     * @param macAddress the MAC address
      */
     void SetMacAddress(Mac48Address macAddress);
     /**
      * Set ranging anomalies field
-     * \param rangingAnomalies the rnaging anomalies
+     * @param rangingAnomalies the rnaging anomalies
      */
     void SetRangingAnomalies(uint8_t rangingAnomalies);
 
     /**
      * Get request DL burst profile field
-     * \returns the request DL burst profile
+     * @returns the request DL burst profile
      */
     uint8_t GetReqDlBurstProfile() const;
     /**
      * Get MAC address field
-     * \returns the MAC address
+     * @returns the MAC address
      */
     Mac48Address GetMacAddress() const;
     /**
      * Get ranging anomalies field
-     * \returns the ranging anomalies
+     * @returns the ranging anomalies
      */
     uint8_t GetRangingAnomalies() const;
 
     /**
-     * \brief Get name field
-     * \returns the name string
+     * @brief Get name field
+     * @returns the name string
      */
     std::string GetName() const;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/ofdm-downlink-frame-prefix.h ns-3.44/src/wimax/model/ofdm-downlink-frame-prefix.h
--- ns-3.43/src/wimax/model/ofdm-downlink-frame-prefix.h	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/ofdm-downlink-frame-prefix.h	2025-03-09 16:55:49.815372700 -0700
@@ -17,9 +17,9 @@
 {
 
 /**
- * \ingroup wimax
- * \brief This class implements  the DL Frame Prefix IE as described by IEEE-802.16 standard
- * \brief The DL Frame Prefix IE is contained in DLFP (Downlink Frame Prefix) in OFDM PHY
+ * @ingroup wimax
+ * @brief This class implements  the DL Frame Prefix IE as described by IEEE-802.16 standard
+ * @brief The DL Frame Prefix IE is contained in DLFP (Downlink Frame Prefix) in OFDM PHY
  */
 class DlFramePrefixIe
 {
@@ -29,72 +29,72 @@
 
     /**
      * Set rate ID field
-     * \param rateId the rate ID
+     * @param rateId the rate ID
      */
     void SetRateId(uint8_t rateId);
     /**
      * Set DIUC field
-     * \param diuc the DIUC
+     * @param diuc the DIUC
      */
     void SetDiuc(uint8_t diuc);
     /**
      * Set preamble present field
-     * \param preamblePresent the preambel present
+     * @param preamblePresent the preambel present
      */
     void SetPreamblePresent(uint8_t preamblePresent);
     /**
      * Set length field
-     * \param length the length
+     * @param length the length
      */
     void SetLength(uint16_t length);
     /**
      * Set start time field
-     * \param startTime the start time
+     * @param startTime the start time
      */
     void SetStartTime(uint16_t startTime);
 
     /**
      * Get rate ID field
-     * \returns the rate ID
+     * @returns the rate ID
      */
     uint8_t GetRateId() const;
     /**
      * Get DIUC field
-     * \returns the DIUC
+     * @returns the DIUC
      */
     uint8_t GetDiuc() const;
     /**
      * Get preamble present field
-     * \returns the preamble present
+     * @returns the preamble present
      */
     uint8_t GetPreamblePresent() const;
     /**
      * Get length field
-     * \returns the length
+     * @returns the length
      */
     uint16_t GetLength() const;
     /**
      * Get start time field
-     * \returns the start time
+     * @returns the start time
      */
     uint16_t GetStartTime() const;
 
     /**
      * Get size field
-     * \returns the size
+     * @returns the size
      */
     uint16_t GetSize() const;
 
     /**
      * Write item function
-     * \param start the iterator
-     * \returns the updated iterator
+     * @param start the iterator
+     * @returns the updated iterator
      */
     Buffer::Iterator Write(Buffer::Iterator start) const;
     /**
      * Read item function
-     * \param start the iterator
-     * \returns the updated iterator
+     * @param start the iterator
+     * @returns the updated iterator
      */
     Buffer::Iterator Read(Buffer::Iterator start);
 
@@ -134,65 +134,65 @@
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
     /**
      * Set base station ID field
-     * \param baseStationId the base station ID
+     * @param baseStationId the base station ID
      */
     void SetBaseStationId(Mac48Address baseStationId);
     /**
      * Set frame number field
-     * \param frameNumber the frame number
+     * @param frameNumber the frame number
      */
     void SetFrameNumber(uint32_t frameNumber);
     /**
      * Set configuration change count field
-     * \param configurationChangeCount the configuration change count
+     * @param configurationChangeCount the configuration change count
      */
     void SetConfigurationChangeCount(uint8_t configurationChangeCount);
     /**
      * Add DL frame prefix element field
-     * \param dlFramePrefixElement the DL frame prefix element
+     * @param dlFramePrefixElement the DL frame prefix element
      */
     void AddDlFramePrefixElement(DlFramePrefixIe dlFramePrefixElement);
     /**
      * Set HCS field
-     * \param hcs the HCS
+     * @param hcs the HCS
      */
     void SetHcs(uint8_t hcs);
 
     /**
      * Get base station ID field
-     * \returns the base station ID
+     * @returns the base station ID
      */
     Mac48Address GetBaseStationId() const;
     /**
      * Get frame number field
-     * \returns the frame number
+     * @returns the frame number
      */
     uint32_t GetFrameNumber() const;
     /**
      * Get configuration change count field
-     * \returns the configuration change count
+     * @returns the configuration change count
      */
     uint8_t GetConfigurationChangeCount() const;
     /**
      * Get DL frame prefix elements
-     * \returns the DL frame prefix elements
+     * @returns the DL frame prefix elements
      */
     std::vector<DlFramePrefixIe> GetDlFramePrefixElements() const;
     /**
      * Get HCS field
-     * \returns the HCS
+     * @returns the HCS
      */
     uint8_t GetHcs() const;
 
     /**
      * Get name field
-     * \returns the name
+     * @returns the name
      */
     std::string GetName() const;
     void Print(std::ostream& os) const override;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/send-params.h ns-3.44/src/wimax/model/send-params.h
--- ns-3.43/src/wimax/model/send-params.h	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/send-params.h	2025-03-09 16:55:49.815372700 -0700
@@ -17,8 +17,8 @@
 class WimaxPhy;
 
 /**
- * \ingroup wimax
- * \brief The SendParams class defines the parameters with which Send() function of
+ * @ingroup wimax
+ * @brief The SendParams class defines the parameters with which Send() function of
  *  a particular PHY is called. The sole purpose of this class is to allow
  *  defining the pure virtual Send() function in the PHY base-class (WimaxPhy).
  *  This class shall be sub-classed every time a new PHY is integrated (i.e.,
@@ -59,15 +59,15 @@
     /**
      * Constructor
      *
-     * \param burst packet burst object
-     * \param modulationType modulation type
-     * \param direction the direction
+     * @param burst packet burst object
+     * @param modulationType modulation type
+     * @param direction the direction
      */
     OfdmSendParams(Ptr<PacketBurst> burst, uint8_t modulationType, uint8_t direction);
     ~OfdmSendParams() override;
 
     /**
-     * \return the packet burst
+     * @return the packet burst
      */
     Ptr<PacketBurst> GetBurst() const
     {
@@ -75,7 +75,7 @@
     }
 
     /**
-     * \return the modulation type
+     * @return the modulation type
      */
     uint8_t GetModulationType() const
     {
@@ -83,7 +83,7 @@
     }
 
     /**
-     * \return the direction
+     * @return the direction
      */
     uint8_t GetDirection() const
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/service-flow.h ns-3.44/src/wimax/model/service-flow.h
--- ns-3.43/src/wimax/model/service-flow.h	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/service-flow.h	2025-03-09 16:55:49.815372700 -0700
@@ -25,7 +25,7 @@
 class WimaxMacQueue;
 
 /**
- * \ingroup wimax
+ * @ingroup wimax
  * This class implements service flows as described by the IEEE-802.16 standard
  */
 class ServiceFlow
@@ -85,23 +85,23 @@
     };
 
     /**
-     * \brief creates a TLV from this service flow
-     * \return the created tlv
+     * @brief creates a TLV from this service flow
+     * @return the created tlv
      */
     Tlv ToTlv() const;
     /**
-     * \brief creates a service flow from a TLV
-     * \param tlv the tlv from which the service flow will be created
+     * @brief creates a service flow from a TLV
+     * @param tlv the tlv from which the service flow will be created
      */
     ServiceFlow(Tlv tlv);
     /**
-     * \brief check classifier match.
-     * \param srcAddress the source ip address
-     * \param dstAddress the destination ip address
-     * \param srcPort the source port
-     * \param dstPort the destination port
-     * \param proto the layer 4 protocol
-     * \return true if the passed parameters match the classifier of the service flow, false
+     * @brief check classifier match.
+     * @param srcAddress the source ip address
+     * @param dstAddress the destination ip address
+     * @param srcPort the source port
+     * @param dstPort the destination port
+     * @param proto the layer 4 protocol
+     * @return true if the passed parameters match the classifier of the service flow, false
      * otherwise
      */
     bool CheckClassifierMatch(Ipv4Address srcAddress,
@@ -116,21 +116,21 @@
     /**
      * Constructor
      *
-     * \param direction the direction
+     * @param direction the direction
      */
     ServiceFlow(Direction direction);
     /**
      * Constructor
      *
-     * \param sf service flow
+     * @param sf service flow
      */
     ServiceFlow(const ServiceFlow& sf);
     /**
      * Constructor
      *
-     * \param sfid the SFID
-     * \param direction the direction
-     * \param connection the connection object
+     * @param sfid the SFID
+     * @param direction the direction
+     * @param connection the connection object
      */
     ServiceFlow(uint32_t sfid, Direction direction, Ptr<WimaxConnection> connection);
     /**
@@ -139,8 +139,8 @@
     ~ServiceFlow();
     /**
      * assignment operator
-     * \param o the service flow to assign
-     * \returns the service flow
+     * @param o the service flow to assign
+     * @returns the service flow
      */
     ServiceFlow& operator=(const ServiceFlow& o);
 
@@ -150,84 +150,84 @@
     void InitValues();
     /**
      * Set direction
-     * \param direction the direction value
+     * @param direction the direction value
      */
     void SetDirection(Direction direction);
     /**
      * Get direction
-     * \returns the direction
+     * @returns the direction
      */
     Direction GetDirection() const;
     /**
      * Copy parameters from another service flow
-     * \param sf the service flow
+     * @param sf the service flow
      */
     void CopyParametersFrom(ServiceFlow sf);
 
     /**
      * Set type of service flow
-     * \param type the type value
+     * @param type the type value
      */
     void SetType(Type type);
     /**
      * Get type of service flow
-     * \returns the type
+     * @returns the type
      */
     Type GetType() const;
     /**
      * Set connection
-     * \param connection the connection
+     * @param connection the connection
      */
     void SetConnection(Ptr<WimaxConnection> connection);
     /**
      * Can return a null connection is this service flow has not
      * been associated yet to a connection.
-     * \returns pointer to the WimaxConnection
+     * @returns pointer to the WimaxConnection
      */
     Ptr<WimaxConnection> GetConnection() const;
 
     /**
      * Set is enabled flag
-     * \param isEnabled is enabled flag
+     * @param isEnabled is enabled flag
      */
     void SetIsEnabled(bool isEnabled);
     /**
      * Get is enabled flag
-     * \returns is enabled
+     * @returns is enabled
      */
     bool GetIsEnabled() const;
 
     /**
      * Set service flow record
-     * \param record pointer to the service flow record
+     * @param record pointer to the service flow record
      */
     void SetRecord(ServiceFlowRecord* record);
     /**
      * Get service flow record
-     * \returns pointer to the service flow record
+     * @returns pointer to the service flow record
      */
     ServiceFlowRecord* GetRecord() const;
 
     // wrapper functions
     /**
      * Get pointer to queue
-     * \returns pointer to the wimax mac queue
+     * @returns pointer to the wimax mac queue
      */
     Ptr<WimaxMacQueue> GetQueue() const;
     /**
      * Get scheduling type
-     * \returns the scheduling type
+     * @returns the scheduling type
      */
     ServiceFlow::SchedulingType GetSchedulingType() const;
     /**
      * Check if packets are present
-     * \returns true if there are packets
+     * @returns true if there are packets
      */
     bool HasPackets() const;
     /**
      * Check if packets of particular type are present
-     * \param packetType the packet type to select
-     * \returns true if there are packets of the packet type
+     * @param packetType the packet type to select
+     * @returns true if there are packets of the packet type
      */
     bool HasPackets(MacHeaderType::HeaderType packetType) const;
 
@@ -243,315 +243,315 @@
 
     /**
      * Get scheduling type string
-     * \returns the name of the scheduling type
+     * @returns the name of the scheduling type
      */
     char* GetSchedulingTypeStr() const;
 
     /**
      * Get SFID
-     * \returns the SFID
+     * @returns the SFID
      */
     uint32_t GetSfid() const;
     /**
      * Get CID
-     * \returns the CID
+     * @returns the CID
      */
     uint16_t GetCid() const;
     /**
      * Get service class name
-     * \returns the service class name
+     * @returns the service class name
      */
     std::string GetServiceClassName() const;
     /**
      * Get QOS parameter set type
-     * \returns the QOS parameter set type
+     * @returns the QOS parameter set type
      */
     uint8_t GetQosParamSetType() const;
     /**
      * Get traffic priority
-     * \returns the traffic priority
+     * @returns the traffic priority
      */
     uint8_t GetTrafficPriority() const;
     /**
      * Get max sustained traffic rate
-     * \returns the maximum sustained traffic rate
+     * @returns the maximum sustained traffic rate
      */
     uint32_t GetMaxSustainedTrafficRate() const;
     /**
      * Get max traffic burst
-     * \returns the maximum traffic burst
+     * @returns the maximum traffic burst
      */
     uint32_t GetMaxTrafficBurst() const;
     /**
      * Get minimum reserved traffic rate
-     * \returns the minimum reserved traffic rate
+     * @returns the minimum reserved traffic rate
      */
     uint32_t GetMinReservedTrafficRate() const;
     /**
      * Get minimum tolerable traffic rate
-     * \returns the minimum tolerable traffic rate
+     * @returns the minimum tolerable traffic rate
      */
     uint32_t GetMinTolerableTrafficRate() const;
     /**
      * Get service scheduling type
-     * \returns the scheduling type
+     * @returns the scheduling type
      */
     ServiceFlow::SchedulingType GetServiceSchedulingType() const;
     /**
      * Get request transmission policy
-     * \returns the request transmission policy
+     * @returns the request transmission policy
      */
     uint32_t GetRequestTransmissionPolicy() const;
     /**
      * Get tolerated jitter
-     * \returns the tolerated jitter
+     * @returns the tolerated jitter
      */
     uint32_t GetToleratedJitter() const;
     /**
      * Get maximum latency
-     * \returns the maximum latency
+     * @returns the maximum latency
      */
     uint32_t GetMaximumLatency() const;
     /**
      * Get fixed versus variable SDU indicator
-     * \returns the fixed vs variable SDU indicator
+     * @returns the fixed vs variable SDU indicator
      */
     uint8_t GetFixedversusVariableSduIndicator() const;
     /**
      * Get SDU size
-     * \returns the SDU size
+     * @returns the SDU size
      */
     uint8_t GetSduSize() const;
     /**
      * Get target SAID
-     * \returns the target SAID
+     * @returns the target SAID
      */
     uint16_t GetTargetSAID() const;
     /**
      * Get ARQ enable
-     * \returns the ARQ enable
+     * @returns the ARQ enable
      */
     uint8_t GetArqEnable() const;
     /**
      * Get ARQ retry timeout transmit
-     * \returns the ARQ retry timeout
+     * @returns the ARQ retry timeout
      */
     uint16_t GetArqWindowSize() const;
     /**
      * Get ARQ retry timeout transmit
-     * \returns the ARQ retry timeout transmit
+     * @returns the ARQ retry timeout transmit
      */
     uint16_t GetArqRetryTimeoutTx() const;
     /**
      * Get ARQ retry timeout receive
-     * \returns the ARQ retry timeout receive
+     * @returns the ARQ retry timeout receive
      */
     uint16_t GetArqRetryTimeoutRx() const;
     /**
      * Get ARQ block lifetime
-     * \returns the ARQ block lifetime
+     * @returns the ARQ block lifetime
      */
     uint16_t GetArqBlockLifeTime() const;
     /**
      * Get ARQ sync loss
-     * \returns the ARQ sync loss value
+     * @returns the ARQ sync loss value
      */
     uint16_t GetArqSyncLoss() const;
     /**
      * Get ARQ deliver in order
-     * \returns the ARQ deliver in order
+     * @returns the ARQ deliver in order
      */
     uint8_t GetArqDeliverInOrder() const;
     /**
      * Get ARQ purge timeout
-     * \returns the ARQ purge timeout value
+     * @returns the ARQ purge timeout value
      */
     uint16_t GetArqPurgeTimeout() const;
     /**
      * Get ARQ block size
-     * \returns the ARQ block size
+     * @returns the ARQ block size
      */
     uint16_t GetArqBlockSize() const;
     /**
      * Get CS specification
-     * \returns the CS specification
+     * @returns the CS specification
      */
     CsSpecification GetCsSpecification() const;
     /**
      * Get convergence sublayer
-     * \returns the convergence sublayer
+     * @returns the convergence sublayer
      */
     CsParameters GetConvergenceSublayerParam() const;
     /**
      * Get unsolicited grant interval
-     * \returns the unsolicited grant interval
+     * @returns the unsolicited grant interval
      */
     uint16_t GetUnsolicitedGrantInterval() const;
     /**
      * Get unsolicited polling interval
-     * \returns the unsolicited polling interval
+     * @returns the unsolicited polling interval
      */
     uint16_t GetUnsolicitedPollingInterval() const;
     /**
      * Get is multicast
-     * \returns the is multicast flag
+     * @returns the is multicast flag
      */
     bool GetIsMulticast() const;
     /**
      * Get modulation
-     * \returns the modulation
+     * @returns the modulation
      */
     WimaxPhy::ModulationType GetModulation() const;
 
     /**
      * Set SFID
-     * \param sfid the SFID
+     * @param sfid the SFID
      */
     void SetSfid(uint32_t sfid);
     /**
      * Set service class name
-     * \param name the service class name
+     * @param name the service class name
      */
     void SetServiceClassName(std::string name);
     /**
      * Set QOS parameter set type
-     * \param type the QOS parameter set type
+     * @param type the QOS parameter set type
      */
     void SetQosParamSetType(uint8_t type);
     /**
      * Set traffic priority
-     * \param priority the traffic priority
+     * @param priority the traffic priority
      */
     void SetTrafficPriority(uint8_t priority);
     /**
      * Set max sustained traffic rate
-     * \param maxSustainedRate the maximum sustained traffic rate
+     * @param maxSustainedRate the maximum sustained traffic rate
      */
     void SetMaxSustainedTrafficRate(uint32_t maxSustainedRate);
     /**
      * Set maximum traffic burst
-     * \param maxTrafficBurst the maximum traffic burst
+     * @param maxTrafficBurst the maximum traffic burst
      */
     void SetMaxTrafficBurst(uint32_t maxTrafficBurst);
     /**
      * Set minimum reserved traffic rate
-     * \param minResvRate the minimum reserved traffic rate
+     * @param minResvRate the minimum reserved traffic rate
      */
     void SetMinReservedTrafficRate(uint32_t minResvRate);
     /**
      * Set minimum tolerable traffic rate
-     * \param minJitter the minimum tolerable traffic rate
+     * @param minJitter the minimum tolerable traffic rate
      */
     void SetMinTolerableTrafficRate(uint32_t minJitter);
     /**
      * Set service scheduling type
-     * \param schedType the service scheduling type
+     * @param schedType the service scheduling type
      */
     void SetServiceSchedulingType(ServiceFlow::SchedulingType schedType);
     /**
      * Set request transmission policy
-     * \param policy the request transmission policy
+     * @param policy the request transmission policy
      */
     void SetRequestTransmissionPolicy(uint32_t policy);
     /**
      * Set tolerated jitter
-     * \param jitter the tolerated jitter
+     * @param jitter the tolerated jitter
      */
     void SetToleratedJitter(uint32_t jitter);
     /**
      * Set maximum latency
-     * \param MaximumLatency the maximum latency
+     * @param MaximumLatency the maximum latency
      */
     void SetMaximumLatency(uint32_t MaximumLatency);
     /**
      * Set fixed versus variable SDU indicator
-     * \param sduIndicator fixed vs variable SDU indicator
+     * @param sduIndicator fixed vs variable SDU indicator
      */
     void SetFixedversusVariableSduIndicator(uint8_t sduIndicator);
     /**
      * Set SDU size
-     * \param sduSize the SDU size
+     * @param sduSize the SDU size
      */
     void SetSduSize(uint8_t sduSize);
     /**
      * Set target SAID
-     * \param targetSaid the target SAID value
+     * @param targetSaid the target SAID value
      */
     void SetTargetSAID(uint16_t targetSaid);
     /**
      * Set ARQ enable
-     * \param arqEnable the ARQ enable setting
+     * @param arqEnable the ARQ enable setting
      */
     void SetArqEnable(uint8_t arqEnable);
     /**
      * Set ARQ retry timeout transmit
-     * \param arqWindowSize the ARQ retry timeout transmit
+     * @param arqWindowSize the ARQ retry timeout transmit
      */
     void SetArqWindowSize(uint16_t arqWindowSize);
     /**
      * Set ARQ retry timeout transmit
-     * \param timeout the ARQ retry timeout transmit
+     * @param timeout the ARQ retry timeout transmit
      */
     void SetArqRetryTimeoutTx(uint16_t timeout);
     /**
      * Set ARQ retry timeout receive
-     * \param timeout the timeout
+     * @param timeout the timeout
      */
     void SetArqRetryTimeoutRx(uint16_t timeout);
     /**
      * Set ARQ block lifetime
-     * \param lifeTime the ARQ block life time
+     * @param lifeTime the ARQ block life time
      */
     void SetArqBlockLifeTime(uint16_t lifeTime);
     /**
      * Set ARQ sync loss
-     * \param syncLoss the ARQ sync loss
+     * @param syncLoss the ARQ sync loss
      */
     void SetArqSyncLoss(uint16_t syncLoss);
     /**
      * Set ARQ deliver in order
-     * \param inOrder the deliver in order setting
+     * @param inOrder the deliver in order setting
      */
     void SetArqDeliverInOrder(uint8_t inOrder);
     /**
      * Set ARQ purge timeout
-     * \param timeout the timeout value
+     * @param timeout the timeout value
      */
     void SetArqPurgeTimeout(uint16_t timeout);
     /**
      * Set ARQ block size
-     * \param size the size
+     * @param size the size
      */
     void SetArqBlockSize(uint16_t size);
     /**
      * Set CS specification
-     * \param spec the CS specification
+     * @param spec the CS specification
      */
     void SetCsSpecification(CsSpecification spec);
     /**
      * Set convergence sublayer parameters
-     * \param csparam the convergence sublayer parameters
+     * @param csparam the convergence sublayer parameters
      */
     void SetConvergenceSublayerParam(CsParameters csparam);
 
     /**
      * Set unsolicited grant interval
-     * \param unsolicitedGrantInterval the unsolicited grant interval
+     * @param unsolicitedGrantInterval the unsolicited grant interval
      */
     void SetUnsolicitedGrantInterval(uint16_t unsolicitedGrantInterval);
     /**
      * Set unsolicited polling interval
-     * \param unsolicitedPollingInterval the unsolicited polling interval
+     * @param unsolicitedPollingInterval the unsolicited polling interval
      */
     void SetUnsolicitedPollingInterval(uint16_t unsolicitedPollingInterval);
     /**
      * Set is multicast
-     * \param isMulticast the is multicast flag
+     * @param isMulticast the is multicast flag
      */
     void SetIsMulticast(bool isMulticast);
     /**
      * Set modulation
-     * \param modulationType the modulation type
+     * @param modulationType the modulation type
      */
     void SetModulation(WimaxPhy::ModulationType modulationType);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/service-flow-manager.h ns-3.44/src/wimax/model/service-flow-manager.h
--- ns-3.43/src/wimax/model/service-flow-manager.h	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/service-flow-manager.h	2025-03-09 16:55:49.815372700 -0700
@@ -27,7 +27,7 @@
 class WimaxConnection;
 
 /**
- * \ingroup wimax
+ * @ingroup wimax
  * The same service flow manager class serves both for BS and SS though some functions are exclusive
  * to only one of them.
  */
@@ -42,8 +42,8 @@
     };
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
@@ -53,60 +53,60 @@
 
     /**
      * Add service flow function
-     * \param serviceFlow the service flow
+     * @param serviceFlow the service flow
      */
     void AddServiceFlow(ServiceFlow* serviceFlow);
     /**
      * Get service flow by flow id
-     * \param sfid the service flow id
-     * \returns pointer to the service flow object corresponding to the flow id
+     * @param sfid the service flow id
+     * @returns pointer to the service flow object corresponding to the flow id
      */
     ServiceFlow* GetServiceFlow(uint32_t sfid) const;
     /**
      * Get service flow by CID
-     * \param cid the CID
-     * \returns pointer to the service flow object corresponding to the CID
+     * @param cid the CID
+     * @returns pointer to the service flow object corresponding to the CID
      */
     ServiceFlow* GetServiceFlow(Cid cid) const;
     /**
      * Get service flows function
-     * \param schedulingType the scheduling type
-     * \returns vector of pointers to service flows corresponding to the scheduling type
+     * @param schedulingType the scheduling type
+     * @returns vector of pointers to service flows corresponding to the scheduling type
      */
     std::vector<ServiceFlow*> GetServiceFlows(ServiceFlow::SchedulingType schedulingType) const;
 
     /**
-     * \return true if all service flows are allocated, false otherwise
+     * @return true if all service flows are allocated, false otherwise
      */
     bool AreServiceFlowsAllocated();
     /**
-     * \param  serviceFlows vector of pointers to service flows to be checked
-     * \return true if all service flows are allocated, false otherwise
+     * @param  serviceFlows vector of pointers to service flows to be checked
+     * @return true if all service flows are allocated, false otherwise
      */
     bool AreServiceFlowsAllocated(std::vector<ServiceFlow*>* serviceFlows);
     /**
-     * \param  serviceFlows vector of pointers to service flows to be checked
-     * \return true if all service flows are allocated, false otherwise
+     * @param  serviceFlows vector of pointers to service flows to be checked
+     * @return true if all service flows are allocated, false otherwise
      */
     bool AreServiceFlowsAllocated(std::vector<ServiceFlow*> serviceFlows);
     /**
-     * \return pointer to the next service flow to be allocated
+     * @return pointer to the next service flow to be allocated
      */
     ServiceFlow* GetNextServiceFlowToAllocate();
 
     /**
-     * \return the number of all service flows
+     * @return the number of all service flows
      */
     uint32_t GetNrServiceFlows() const;
 
     /**
-     * \param SrcAddress the source ip address
-     * \param DstAddress the destination ip address
-     * \param SrcPort the source port
-     * \param DstPort the destination port
-     * \param Proto the protocol
-     * \param dir the direction of the service flow
-     * \return the service flow to which this ip flow is associated
+     * @param SrcAddress the source ip address
+     * @param DstAddress the destination ip address
+     * @param SrcPort the source port
+     * @param DstPort the destination port
+     * @param Proto the protocol
+     * @param dir the direction of the service flow
+     * @return the service flow to which this ip flow is associated
      */
     ServiceFlow* DoClassify(Ipv4Address SrcAddress,
                             Ipv4Address DstAddress,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/service-flow-record.cc ns-3.44/src/wimax/model/service-flow-record.cc
--- ns-3.43/src/wimax/model/service-flow-record.cc	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/service-flow-record.cc	2025-03-09 16:55:49.815372700 -0700
@@ -13,8 +13,8 @@
 
 ServiceFlowRecord::ServiceFlowRecord()
     : m_grantSize(0),
-      m_grantTimeStamp(Seconds(0)),
-      m_dlTimeStamp(Seconds(0)),
+      m_grantTimeStamp(),
+      m_dlTimeStamp(),
       m_pktsSent(0),
       m_pktsRcvd(0),
       m_bytesSent(0),
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/service-flow-record.h ns-3.44/src/wimax/model/service-flow-record.h
--- ns-3.43/src/wimax/model/service-flow-record.h	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/service-flow-record.h	2025-03-09 16:55:49.815372700 -0700
@@ -21,8 +21,8 @@
 {
 
 /**
- * \ingroup wimax
- * \brief this class implements a structure to manage some parameters and statistics related to a
+ * @ingroup wimax
+ * @brief this class implements a structure to manage some parameters and statistics related to a
  * service flow
  */
 class ServiceFlowRecord
@@ -32,188 +32,188 @@
     ~ServiceFlowRecord();
 
     /**
-     * \brief Set the grant size (only for UGS service flows)
-     * \param grantSize the grant size to set
+     * @brief Set the grant size (only for UGS service flows)
+     * @param grantSize the grant size to set
      */
     void SetGrantSize(uint32_t grantSize);
     /**
-     * \return the grant size (only for ugs service flows)
+     * @return the grant size (only for ugs service flows)
      */
     uint32_t GetGrantSize() const;
     /**
-     * \brief Set the grant time stamp. Used for data allocation for ugs flows, and unicast poll
+     * @brief Set the grant time stamp. Used for data allocation for ugs flows, and unicast poll
      * (bw request) for non-UGS flows
-     * \param grantTimeStamp the grant time stamp to set
+     * @param grantTimeStamp the grant time stamp to set
      */
     void SetGrantTimeStamp(Time grantTimeStamp);
     /**
-     * \return the grant time stamp. Used for data allocation for ugs flows, and unicast poll (bw
+     * @return the grant time stamp. Used for data allocation for ugs flows, and unicast poll (bw
      * request) for non-UGS flows
      */
     Time GetGrantTimeStamp() const;
     /**
-     * \brief Set the DlTimeStamp.
-     * \param dlTimeStamp time when this service flow's traffic was last sent.
+     * @brief Set the DlTimeStamp.
+     * @param dlTimeStamp time when this service flow's traffic was last sent.
      */
     void SetDlTimeStamp(Time dlTimeStamp);
     /**
-     * \return the DlTimeStamp: time when this service flow's traffic was last sent
+     * @return the DlTimeStamp: time when this service flow's traffic was last sent
      */
     Time GetDlTimeStamp() const;
     /**
-     * \brief set the number of sent packets in this service flow
-     * \param pktsSent the number of sent packets
+     * @brief set the number of sent packets in this service flow
+     * @param pktsSent the number of sent packets
      */
     void SetPktsSent(uint32_t pktsSent);
     /**
-     * \brief update the number of sent packets by adding pktsSent
-     * \param pktsSent the number of sent packets to add
+     * @brief update the number of sent packets by adding pktsSent
+     * @param pktsSent the number of sent packets to add
      */
     void UpdatePktsSent(uint32_t pktsSent);
     /**
-     * \return the number of sent packet in this service flow
+     * @return the number of sent packet in this service flow
      */
     uint32_t GetPktsSent() const;
     /**
-     * \brief Set the number of received packets
-     * \param pktsRcvd The number of received packets
+     * @brief Set the number of received packets
+     * @param pktsRcvd The number of received packets
      */
     void SetPktsRcvd(uint32_t pktsRcvd);
     /**
-     * \brief update the number of received packets by adding pktsRcvd
-     * \param pktsRcvd the number of received packets to add
+     * @brief update the number of received packets by adding pktsRcvd
+     * @param pktsRcvd the number of received packets to add
      */
     void UpdatePktsRcvd(uint32_t pktsRcvd);
     /**
-     * \return the number of received packet
+     * @return the number of received packet
      */
     uint32_t GetPktsRcvd() const;
     /**
-     * \brief Set the number of sent bytes
-     * \param bytesSent the number of sent bytes
+     * @brief Set the number of sent bytes
+     * @param bytesSent the number of sent bytes
      */
     void SetBytesSent(uint32_t bytesSent);
     /**
-     * \brief update the number of sent bytes by adding bytesSent
-     * \param bytesSent the number of bytes to add
+     * @brief update the number of sent bytes by adding bytesSent
+     * @param bytesSent the number of bytes to add
      */
     void UpdateBytesSent(uint32_t bytesSent);
     /**
-     * \return The number of sent bytes
+     * @return The number of sent bytes
      */
     uint32_t GetBytesSent() const;
     /**
-     * \brief Set the number of received bytes
-     * \param bytesRcvd the number of received bytes
+     * @brief Set the number of received bytes
+     * @param bytesRcvd the number of received bytes
      */
     void SetBytesRcvd(uint32_t bytesRcvd);
     /**
-     * \brief update the number of received bytes by adding bytesRcvd
-     * \param bytesRcvd the number of bytes to add
+     * @brief update the number of received bytes by adding bytesRcvd
+     * @param bytesRcvd the number of bytes to add
      */
     void UpdateBytesRcvd(uint32_t bytesRcvd);
     /**
-     * \return The number of received bytes
+     * @return The number of received bytes
      */
     uint32_t GetBytesRcvd() const;
 
     /**
-     * \brief set the requested bandwidth
-     * \param requestedBandwidth the requested bandwidth
+     * @brief set the requested bandwidth
+     * @param requestedBandwidth the requested bandwidth
      */
     void SetRequestedBandwidth(uint32_t requestedBandwidth);
     /**
-     * \brief update the requested bandwidth
-     * \param requestedBandwidth the requested bandwidth update
+     * @brief update the requested bandwidth
+     * @param requestedBandwidth the requested bandwidth update
      */
     void UpdateRequestedBandwidth(uint32_t requestedBandwidth);
     /**
-     * \return The requested bandwidth
+     * @return The requested bandwidth
      */
     uint32_t GetRequestedBandwidth() const;
 
     /**
-     * \brief set the granted bandwidth
-     * \param grantedBandwidth the granted bandwidth
+     * @brief set the granted bandwidth
+     * @param grantedBandwidth the granted bandwidth
      */
     void SetGrantedBandwidth(uint32_t grantedBandwidth);
     /**
-     * \brief update the granted bandwidth
-     * \param grantedBandwidth the granted bandwidth update
+     * @brief update the granted bandwidth
+     * @param grantedBandwidth the granted bandwidth update
      */
     void UpdateGrantedBandwidth(uint32_t grantedBandwidth);
     /**
-     * \return The granted bandwidth
+     * @return The granted bandwidth
      */
     uint32_t GetGrantedBandwidth() const;
 
     /**
-     * \brief set the temporary granted bandwidth
-     * \param grantedBandwidthTemp the temporary granted bandwidth
+     * @brief set the temporary granted bandwidth
+     * @param grantedBandwidthTemp the temporary granted bandwidth
      */
     void SetGrantedBandwidthTemp(uint32_t grantedBandwidthTemp);
     /**
-     * \brief update the temporary granted bandwidth
-     * \param grantedBandwidthTemp the temporary granted bandwidth
+     * @brief update the temporary granted bandwidth
+     * @param grantedBandwidthTemp the temporary granted bandwidth
      */
     void UpdateGrantedBandwidthTemp(uint32_t grantedBandwidthTemp);
     /**
-     * \return The temporary granted bandwidth
+     * @return The temporary granted bandwidth
      */
     uint32_t GetGrantedBandwidthTemp() const;
 
     /**
-     * \brief set BW since last expiry
-     * \param bwSinceLastExpiry bandwidth since last expiry
+     * @brief set BW since last expiry
+     * @param bwSinceLastExpiry bandwidth since last expiry
      */
     void SetBwSinceLastExpiry(uint32_t bwSinceLastExpiry);
     /**
-     * \brief update BW since last expiry
-     * \param bwSinceLastExpiry bandwidth since last expiry
+     * @brief update BW since last expiry
+     * @param bwSinceLastExpiry bandwidth since last expiry
      */
     void UpdateBwSinceLastExpiry(uint32_t bwSinceLastExpiry);
     /**
-     * \return The bandwidth since last expiry
+     * @return The bandwidth since last expiry
      */
     uint32_t GetBwSinceLastExpiry() const;
 
     /**
-     * \brief set last grant time
-     * \param grantTime  grant time to set
+     * @brief set last grant time
+     * @param grantTime  grant time to set
      */
     void SetLastGrantTime(Time grantTime);
     /**
-     * \return The last grant time
+     * @return The last grant time
      */
     Time GetLastGrantTime() const;
 
     /**
-     * \brief set backlogged
-     * \param backlogged number of backlogged
+     * @brief set backlogged
+     * @param backlogged number of backlogged
      */
     void SetBacklogged(uint32_t backlogged);
     /**
-     * \brief increase backlogged
-     * \param backlogged the number of backlogged to update
+     * @brief increase backlogged
+     * @param backlogged the number of backlogged to update
      */
     void IncreaseBacklogged(uint32_t backlogged);
     /**
-     * \return The number of backlogged
+     * @return The number of backlogged
      */
     uint32_t GetBacklogged() const;
 
     /**
-     * \brief set temporary back logged
-     * \param backloggedTemp the temporary backlogged value
+     * @brief set temporary back logged
+     * @param backloggedTemp the temporary backlogged value
      */
     void SetBackloggedTemp(uint32_t backloggedTemp);
     /**
-     * \brief increase temporary back logged
-     * \param backloggedTemp the temporary backlogged value
+     * @brief increase temporary back logged
+     * @param backloggedTemp the temporary backlogged value
      */
     void IncreaseBackloggedTemp(uint32_t backloggedTemp);
     /**
-     * \return The value of temporary backlogged
+     * @return The value of temporary backlogged
      */
     uint32_t GetBackloggedTemp() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/simple-ofdm-send-param.h ns-3.44/src/wimax/model/simple-ofdm-send-param.h
--- ns-3.43/src/wimax/model/simple-ofdm-send-param.h	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/simple-ofdm-send-param.h	2025-03-09 16:55:49.815372700 -0700
@@ -22,7 +22,7 @@
 {
 
 /**
- * \ingroup wimax
+ * @ingroup wimax
  * SimpleOfdmSendParam class
  */
 class SimpleOfdmSendParam
@@ -32,13 +32,13 @@
     /**
      * Constructor
      *
-     * \param fecBlock FEC block
-     * \param burstSize burst size
-     * \param isFirstBlock is the first block
-     * \param Frequency frequency
-     * \param modulationType modulation type
-     * \param direction the direction
-     * \param rxPowerDbm receive power
+     * @param fecBlock FEC block
+     * @param burstSize burst size
+     * @param isFirstBlock is the first block
+     * @param Frequency frequency
+     * @param modulationType modulation type
+     * @param direction the direction
+     * @param rxPowerDbm receive power
      */
     SimpleOfdmSendParam(const Bvec& fecBlock,
                         uint32_t burstSize,
@@ -50,13 +50,13 @@
     /**
      * Constructor
      *
-     * \param burstSize burst size
-     * \param isFirstBlock is the first block
-     * \param Frequency frequency
-     * \param modulationType modulation type
-     * \param direction the direction
-     * \param rxPowerDbm receive power
-     * \param burst packet burst object
+     * @param burstSize burst size
+     * @param isFirstBlock is the first block
+     * @param Frequency frequency
+     * @param modulationType modulation type
+     * @param direction the direction
+     * @param rxPowerDbm receive power
+     * @param burst packet burst object
      */
     SimpleOfdmSendParam(uint32_t burstSize,
                         bool isFirstBlock,
@@ -67,66 +67,66 @@
                         Ptr<PacketBurst> burst);
     ~SimpleOfdmSendParam();
     /**
-     * \brief sent the fec block to send
-     * \param fecBlock the fec block to send
+     * @brief sent the fec block to send
+     * @param fecBlock the fec block to send
      */
     void SetFecBlock(const Bvec& fecBlock);
     /**
-     * \brief set the burst size
-     * \param burstSize the burst size in bytes
+     * @brief set the burst size
+     * @param burstSize the burst size in bytes
      */
     void SetBurstSize(uint32_t burstSize);
     /**
-     * \param isFirstBlock Set to true if this fec block is the first one in the burst, set to false
+     * @param isFirstBlock Set to true if this fec block is the first one in the burst, set to false
      * otherwise
      */
     void SetIsFirstBlock(bool isFirstBlock);
     /**
-     * \param Frequency set the frequency of the channel in which this fec block will be sent
+     * @param Frequency set the frequency of the channel in which this fec block will be sent
      */
     void SetFrequency(uint64_t Frequency);
     /**
-     * \param modulationType the modulation type used to send this fec block
+     * @param modulationType the modulation type used to send this fec block
      */
     void SetModulationType(WimaxPhy::ModulationType modulationType);
     /**
-     * \param direction the direction on which this fec block will be sent
+     * @param direction the direction on which this fec block will be sent
      */
     void SetDirection(uint8_t direction);
     /**
-     * \param rxPowerDbm the received power
+     * @param rxPowerDbm the received power
      */
     void SetRxPowerDbm(double rxPowerDbm);
     /**
-     * \return the fec block
+     * @return the fec block
      */
     Bvec GetFecBlock();
     /**
-     * \return the burst size
+     * @return the burst size
      */
     uint32_t GetBurstSize() const;
     /**
-     * \return true if this fec block is the first one in the burst, false otherwise
+     * @return true if this fec block is the first one in the burst, false otherwise
      */
     bool GetIsFirstBlock() const;
     /**
-     * \return the frequency on which the fec block is sent/received
+     * @return the frequency on which the fec block is sent/received
      */
     uint64_t GetFrequency() const;
     /**
-     * \return the modulation type used to send this fec block
+     * @return the modulation type used to send this fec block
      */
     WimaxPhy::ModulationType GetModulationType();
     /**
-     * \return the direction on which this fec block was sent. UP or DOWN
+     * @return the direction on which this fec block was sent. UP or DOWN
      */
     uint8_t GetDirection() const;
     /**
-     * \return the Received power
+     * @return the Received power
      */
     double GetRxPowerDbm() const;
     /**
-     * \return the received burst
+     * @return the received burst
      */
     Ptr<PacketBurst> GetBurst();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/simple-ofdm-wimax-channel.cc ns-3.44/src/wimax/model/simple-ofdm-wimax-channel.cc
--- ns-3.43/src/wimax/model/simple-ofdm-wimax-channel.cc	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/simple-ofdm-wimax-channel.cc	2025-03-09 16:55:49.819372700 -0700
@@ -149,7 +149,7 @@
     SimpleOfdmSendParam* param;
     for (auto iter = m_phyList.begin(); iter != m_phyList.end(); ++iter)
     {
-        Time delay = Seconds(0);
+        Time delay;
         if (phy != *iter)
         {
             double distance = 0;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/simple-ofdm-wimax-channel.h ns-3.44/src/wimax/model/simple-ofdm-wimax-channel.h
--- ns-3.43/src/wimax/model/simple-ofdm-wimax-channel.h	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/simple-ofdm-wimax-channel.h	2025-03-09 16:55:49.819372700 -0700
@@ -27,8 +27,8 @@
 class SimpleOfdmWimaxPhy;
 
 /**
- * \ingroup wimax
- * \brief SimpleOfdmWimaxChannel class
+ * @ingroup wimax
+ * @brief SimpleOfdmWimaxChannel class
  */
 class SimpleOfdmWimaxChannel : public WimaxChannel
 {
@@ -47,28 +47,28 @@
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief Creates a channel and sets the propagation model
-     * \param propModel the propagation model to use
+     * @brief Creates a channel and sets the propagation model
+     * @param propModel the propagation model to use
      */
     SimpleOfdmWimaxChannel(PropModel propModel);
 
     /**
-     * \brief Sends a dummy fec block to all connected physical devices
-     * \param BlockTime the time needed to send the block
-     * \param burstSize the size of the burst
-     * \param phy the sender device
-     * \param isFirstBlock true if this block is the first one, false otherwise
-     * \param isLastBlock true if this block is the last one, false otherwise
-     * \param frequency the frequency on which the block is sent
-     * \param modulationType the modulation used to send the fec block
-     * \param direction uplink or downlink
-     * \param txPowerDbm the transmission power
-     * \param burst the packet burst to send
+     * @brief Sends a dummy fec block to all connected physical devices
+     * @param BlockTime the time needed to send the block
+     * @param burstSize the size of the burst
+     * @param phy the sender device
+     * @param isFirstBlock true if this block is the first one, false otherwise
+     * @param isLastBlock true if this block is the last one, false otherwise
+     * @param frequency the frequency on which the block is sent
+     * @param modulationType the modulation used to send the fec block
+     * @param direction uplink or downlink
+     * @param txPowerDbm the transmission power
+     * @param burst the packet burst to send
      */
     void Send(Time BlockTime,
               uint32_t burstSize,
@@ -81,8 +81,8 @@
               double txPowerDbm,
               Ptr<PacketBurst> burst);
     /**
-     * \brief sets the propagation model
-     * \param propModel the propagation model to used
+     * @brief sets the propagation model
+     * @param propModel the propagation model to used
      */
     void SetPropagationModel(PropModel propModel);
 
@@ -91,33 +91,33 @@
      * used by this model.  Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream) override;
 
   private:
     /**
      * Attach function
-     * \param phy the phy layer
+     * @param phy the phy layer
      */
     void DoAttach(Ptr<WimaxPhy> phy) override;
     std::list<Ptr<SimpleOfdmWimaxPhy>> m_phyList; ///< phy list
     /**
      * Get number of devices function
-     * \returns the number of devices
+     * @returns the number of devices
      */
     std::size_t DoGetNDevices() const override;
     /**
      * End send dummy block function
-     * \param rxphy the Ptr<SimpleOfdmWimaxPhy>
-     * \param param the SimpleOfdmSendParam *
+     * @param rxphy the Ptr<SimpleOfdmWimaxPhy>
+     * @param param the SimpleOfdmSendParam *
      */
     void EndSendDummyBlock(Ptr<SimpleOfdmWimaxPhy> rxphy, SimpleOfdmSendParam* param);
     /**
      * Get device function
-     * \param i the device index
-     * \returns the device
+     * @param i the device index
+     * @returns the device
      */
     Ptr<NetDevice> DoGetDevice(std::size_t i) const override;
     Ptr<PropagationLossModel> m_loss; ///< loss
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/simple-ofdm-wimax-phy.h ns-3.44/src/wimax/model/simple-ofdm-wimax-phy.h
--- ns-3.43/src/wimax/model/simple-ofdm-wimax-phy.h	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/simple-ofdm-wimax-phy.h	2025-03-09 16:55:49.819372700 -0700
@@ -33,8 +33,8 @@
 class SimpleOfdmWimaxChannel;
 
 /**
- * \ingroup wimax
- * \brief SimpleOfdmWimaxPhy class
+ * @ingroup wimax
+ * @brief SimpleOfdmWimaxPhy class
  */
 class SimpleOfdmWimaxPhy : public WimaxPhy
 {
@@ -52,66 +52,66 @@
     };
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     SimpleOfdmWimaxPhy();
     /**
      * Constructor
      *
-     * \param tracesPath trace path
+     * @param tracesPath trace path
      */
     SimpleOfdmWimaxPhy(char* tracesPath);
     ~SimpleOfdmWimaxPhy() override;
     /**
-     * \brief if called with true it will enable the loss model
-     * \param loss set to true to enable the loss model
+     * @brief if called with true it will enable the loss model
+     * @param loss set to true to enable the loss model
      */
     void ActivateLoss(bool loss);
     /**
-     * \brief Set the path of the repository containing the traces
-     * \param tracesPath the path to the repository.
+     * @brief Set the path of the repository containing the traces
+     * @param tracesPath the path to the repository.
      *  see snr-to-block-error-rate-manager.h for more details.
      */
     void SetSNRToBlockErrorRateTracesPath(char* tracesPath);
     /**
      * Attach the physical layer to a channel.
-     * \param channel the channel to which the physical layer will be attached
+     * @param channel the channel to which the physical layer will be attached
      */
     void DoAttach(Ptr<WimaxChannel> channel) override;
     /**
-     * \brief set the callback function to call when a burst is received
-     * \param callback the receive callback function
+     * @brief set the callback function to call when a burst is received
+     * @param callback the receive callback function
      */
     void SetReceiveCallback(Callback<void, Ptr<PacketBurst>, Ptr<WimaxConnection>> callback);
     /**
-     * \brief Sends a burst on the channel
-     * \param burst the burst to send
-     * \param modulationType the modulation that will be used to send this burst
-     * \param direction set to uplink or downlink
+     * @brief Sends a burst on the channel
+     * @param burst the burst to send
+     * @param modulationType the modulation that will be used to send this burst
+     * @param direction set to uplink or downlink
      */
     void Send(Ptr<PacketBurst> burst, WimaxPhy::ModulationType modulationType, uint8_t direction);
     /**
-     * \brief Sends a burst on the channel
-     * \param params parameters
-     * \see SendParams
+     * @brief Sends a burst on the channel
+     * @param params parameters
+     * @see SendParams
      */
     void Send(SendParams* params) override;
     /**
-     * \brief returns the type this physical layer
-     * \return always  WimaxPhy::simpleOfdmWimaxPhy;
+     * @brief returns the type this physical layer
+     * @return always  WimaxPhy::simpleOfdmWimaxPhy;
      */
     WimaxPhy::PhyType GetPhyType() const override;
     /**
-     * \brief start the reception of a fec block
-     * \param burstSize the burst size
-     * \param isFirstBlock true if this block is the first one, false otherwise
-     * \param frequency the frequency in which the fec block is being received
-     * \param modulationType the modulation used to transmit this fec Block
-     * \param direction set to uplink and downlink
-     * \param rxPower the received power.
-     * \param burst the burst to be sent
+     * @brief start the reception of a fec block
+     * @param burstSize the burst size
+     * @param isFirstBlock true if this block is the first one, false otherwise
+     * @param frequency the frequency in which the fec block is being received
+     * @param modulationType the modulation used to transmit this fec Block
+     * @param direction set to uplink and downlink
+     * @param rxPower the received power.
+     * @param burst the burst to be sent
      */
 
     void StartReceive(uint32_t burstSize,
@@ -123,72 +123,72 @@
                       Ptr<PacketBurst> burst);
 
     /**
-     * \return the bandwidth
+     * @return the bandwidth
      */
     uint32_t GetBandwidth() const;
     /**
-     * \brief Set the bandwidth
-     * \param BW the bandwidth
+     * @brief Set the bandwidth
+     * @param BW the bandwidth
      */
     void SetBandwidth(uint32_t BW);
     /**
-     * \return the transmission power
+     * @return the transmission power
      */
     double GetTxPower() const;
     /**
-     * \brief set the transmission power
-     * \param txPower the transmission power
+     * @brief set the transmission power
+     * @param txPower the transmission power
      */
     void SetTxPower(double txPower);
     /**
-     * \return the noise figure
+     * @return the noise figure
      */
     double GetNoiseFigure() const;
     /**
-     * \brief set the noise figure of the device
-     * \param nf the noise figure
+     * @brief set the noise figure of the device
+     * @param nf the noise figure
      */
     void SetNoiseFigure(double nf);
 
     /**
      * Public method used to fire a PhyTxBegin trace.  Implemented for encapsulation
      * purposes.
-     * \param burst the packet burst
+     * @param burst the packet burst
      */
     void NotifyTxBegin(Ptr<PacketBurst> burst);
 
     /**
      * Public method used to fire a PhyTxEnd trace.  Implemented for encapsulation
      * purposes.
-     * \param burst the packet burst
+     * @param burst the packet burst
      */
     void NotifyTxEnd(Ptr<PacketBurst> burst);
 
     /**
      * Public method used to fire a PhyTxDrop trace.  Implemented for encapsulation
      * purposes.
-     * \param burst the packet burst
+     * @param burst the packet burst
      */
     void NotifyTxDrop(Ptr<PacketBurst> burst);
 
     /**
      * Public method used to fire a PhyRxBegin trace.  Implemented for encapsulation
      * purposes.
-     * \param burst the packet burst
+     * @param burst the packet burst
      */
     void NotifyRxBegin(Ptr<PacketBurst> burst);
 
     /**
      * Public method used to fire a PhyRxEnd trace.  Implemented for encapsulation
      * purposes.
-     * \param burst the packet burst
+     * @param burst the packet burst
      */
     void NotifyRxEnd(Ptr<PacketBurst> burst);
 
     /**
      * Public method used to fire a PhyRxDrop trace.  Implemented for encapsulation
      * purposes.
-     * \param burst the packet burst
+     * @param burst the packet burst
      */
     void NotifyRxDrop(Ptr<PacketBurst> burst);
 
@@ -197,80 +197,80 @@
      * used by this model.  Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     int64_t AssignStreams(int64_t stream) override;
 
   private:
     /**
      * Get transmission time
-     * \param size the size
-     * \param modulationType the modulation type
-     * \returns the transmission time
+     * @param size the size
+     * @param modulationType the modulation type
+     * @returns the transmission time
      */
     Time DoGetTransmissionTime(uint32_t size,
                                WimaxPhy::ModulationType modulationType) const override;
     /**
      * Get number of symbols
-     * \param size the size
-     * \param modulationType the modulation type
-     * \returns the number of symbols
+     * @param size the size
+     * @param modulationType the modulation type
+     * @returns the number of symbols
      */
     uint64_t DoGetNrSymbols(uint32_t size, WimaxPhy::ModulationType modulationType) const override;
     /**
      * Get number of bytes
-     * \param symbols the symbols
-     * \param modulationType the modulation type
-     * \returns the number of bytes
+     * @param symbols the symbols
+     * @param modulationType the modulation type
+     * @returns the number of bytes
      */
     uint64_t DoGetNrBytes(uint32_t symbols, WimaxPhy::ModulationType modulationType) const override;
     /**
      * Convert burst to bits
-     * \param burst the packet burst
-     * \returns the BVEC
+     * @param burst the packet burst
+     * @returns the BVEC
      */
     Bvec ConvertBurstToBits(Ptr<const PacketBurst> burst);
     /**
      * Convert bits to burst
-     * \param buffer the BVEC
-     * \returns the packet burst
+     * @param buffer the BVEC
+     * @returns the packet burst
      */
     Ptr<PacketBurst> ConvertBitsToBurst(Bvec buffer);
     /**
      * Create FEC blocks
-     * \param buffer the BVEC
-     * \param modulationType the modulation type
+     * @param buffer the BVEC
+     * @param modulationType the modulation type
      */
     void CreateFecBlocks(const Bvec& buffer, WimaxPhy::ModulationType modulationType);
     /**
      * Recreate buffer
-     * \returns BVEC
+     * @returns BVEC
      */
     Bvec RecreateBuffer();
     /**
      * Get FEC block size
-     * \param type the modulation type
-     * \returns the FEC block size
+     * @param type the modulation type
+     * @returns the FEC block size
      */
     uint32_t GetFecBlockSize(WimaxPhy::ModulationType type) const;
     /**
      * Get coded FEC block size
-     * \param modulationType the modulation type
-     * \returns the coded FEC block size
+     * @param modulationType the modulation type
+     * @returns the coded FEC block size
      */
     uint32_t GetCodedFecBlockSize(WimaxPhy::ModulationType modulationType) const;
     /**
      * Set block parameters
-     * \param burstSize the burst size
-     * \param modulationType the modulation type
+     * @param burstSize the burst size
+     * @param modulationType the modulation type
      */
     void SetBlockParameters(uint32_t burstSize, WimaxPhy::ModulationType modulationType);
     /**
      * Get number of blocks
-     * \param burstSize the burst size
-     * \param modulationType the modulation type
-     * \returns the number of blocks
+     * @param burstSize the burst size
+     * @param modulationType the modulation type
+     * @returns the number of blocks
      */
     uint16_t GetNrBlocks(uint32_t burstSize, WimaxPhy::ModulationType modulationType) const;
     void DoDispose() override;
@@ -278,22 +278,22 @@
     void EndSend();
     /**
      * End send FEC block
-     * \param modulationType the modulation type
-     * \param direction the direction
+     * @param modulationType the modulation type
+     * @param direction the direction
      */
     void EndSendFecBlock(WimaxPhy::ModulationType modulationType, uint8_t direction);
     /**
      * End receive
-     * \param burst
+     * @param burst
      */
     void EndReceive(Ptr<const PacketBurst> burst);
     /**
      * End receive FEC block
-     * \param burstSize the burst size
-     * \param modulationType the modulation type
-     * \param direction the direction
-     * \param drop whether to drop
-     * \param burst the burst
+     * @param burstSize the burst size
+     * @param modulationType the modulation type
+     * @param direction the direction
+     * @param drop whether to drop
+     * @param burst the burst
      */
     void EndReceiveFecBlock(uint32_t burstSize,
                             WimaxPhy::ModulationType modulationType,
@@ -302,17 +302,17 @@
                             Ptr<PacketBurst> burst);
     /**
      * Start end dummy FEC block
-     * \param isFirstBlock is the first block?
-     * \param modulationType the modulation type
-     * \param direction the direction
+     * @param isFirstBlock is the first block?
+     * @param modulationType the modulation type
+     * @param direction the direction
      */
     void StartSendDummyFecBlock(bool isFirstBlock,
                                 WimaxPhy::ModulationType modulationType,
                                 uint8_t direction);
     /**
      * Get block transmission time
-     * \param modulationType the modulation type
-     * \returns the block transmission time
+     * @param modulationType the modulation type
+     * @returns the block transmission time
      */
     Time GetBlockTransmissionTime(WimaxPhy::ModulationType modulationType) const;
     /// Set data rates
@@ -322,109 +322,109 @@
 
     /**
      * Get moduleation FEC parameters
-     * \param modulationType the modulation type
-     * \param bitsPerSymbol the number of bits per symbol
-     * \param fecCode the FEC code
+     * @param modulationType the modulation type
+     * @param bitsPerSymbol the number of bits per symbol
+     * @param fecCode the FEC code
      */
     void GetModulationFecParams(WimaxPhy::ModulationType modulationType,
                                 uint8_t& bitsPerSymbol,
                                 double& fecCode) const;
     /**
      * Calculate data rate
-     * \param modulationType the modulation type
-     * \returns the data rate
+     * @param modulationType the modulation type
+     * @returns the data rate
      */
     uint32_t CalculateDataRate(WimaxPhy::ModulationType modulationType) const;
     /**
      * Get data rate
-     * \param modulationType the modulation type
-     * \returns the data rate
+     * @param modulationType the modulation type
+     * @returns the data rate
      */
     uint32_t DoGetDataRate(WimaxPhy::ModulationType modulationType) const override;
     /**
      * Get TTG
-     * \returns the TTG
+     * @returns the TTG
      */
     uint16_t DoGetTtg() const override;
     /**
      * Get RTG
-     * \returns the RTG
+     * @returns the RTG
      */
     uint16_t DoGetRtg() const override;
     /**
      * Get frame duration code
-     * \returns the frame duration code
+     * @returns the frame duration code
      */
     uint8_t DoGetFrameDurationCode() const override;
     /**
      * Get frame duration
-     * \param frameDurationCode the frame duration code
-     * \returns the frame duration
+     * @param frameDurationCode the frame duration code
+     * @returns the frame duration
      */
     Time DoGetFrameDuration(uint8_t frameDurationCode) const override;
     /// Set Phy parameters
     void DoSetPhyParameters() override;
     /**
      * Get NFFT
-     * \returns the NFFT
+     * @returns the NFFT
      */
     uint16_t DoGetNfft() const override;
     /**
      * Set NFFT
-     * \param nfft the NFFT
+     * @param nfft the NFFT
      */
     void DoSetNfft(uint16_t nfft);
     /**
      * Get sampling factor
-     * \returns the sampling factor
+     * @returns the sampling factor
      */
     double DoGetSamplingFactor() const override;
     /**
      * Get sampling frequency
-     * \returns the sampling frequency
+     * @returns the sampling frequency
      */
     double DoGetSamplingFrequency() const override;
     /**
      * Get G value
-     * \returns the G value
+     * @returns the G value
      */
     double DoGetGValue() const override;
     /**
      * Set G value
-     * \param g the G value
+     * @param g the G value
      */
     void DoSetGValue(double g);
 
     /**
      * Get receive gain
-     * \returns the receive gain
+     * @returns the receive gain
      */
     double GetRxGain() const;
     /**
      * Set receive gsain
-     * \param rxgain the receive gain
+     * @param rxgain the receive gain
      */
     void SetRxGain(double rxgain);
 
     /**
      * Get transmit gain
-     * \returns the transmit gain
+     * @returns the transmit gain
      */
     double GetTxGain() const;
     /**
      * Set transmit gain
-     * \param txgain the transmit gain
+     * @param txgain the transmit gain
      */
     void SetTxGain(double txgain);
 
     /**
      * Get trace file path
-     * \returns the trace file path name
+     * @returns the trace file path name
      */
     std::string GetTraceFilePath() const;
     /**
      * Set trace file path
-     * \param path the trace file path
+     * @param path the trace file path
      */
     void SetTraceFilePath(std::string path);
 
@@ -468,8 +468,8 @@
      * The trace source fired when a packet begins the transmission process on
      * the medium.
      *
-     * \see class CallBackTraceSource
-     * \deprecated The non-const \c Ptr<PacketBurst> argument is deprecated
+     * @see class CallBackTraceSource
+     * @deprecated The non-const \c Ptr<PacketBurst> argument is deprecated
      * and will be changed to \c Ptrc<PacketBurst> in a future release.
      */
     // NS_DEPRECATED() - tag for future removal
@@ -479,8 +479,8 @@
      * The trace source fired when a packet ends the transmission process on
      * the medium.
      *
-     * \see class CallBackTraceSource
-     * \deprecated The non-const \c Ptr<PacketBurst> argument is deprecated
+     * @see class CallBackTraceSource
+     * @deprecated The non-const \c Ptr<PacketBurst> argument is deprecated
      * and will be changed to \c Ptrc<PacketBurst> in a future release.
      */
     // NS_DEPRECATED() - tag for future removal
@@ -490,8 +490,8 @@
      * The trace source fired when the phy layer drops a packet as it tries
      * to transmit it.
      *
-     * \see class CallBackTraceSource
-     * \deprecated The non-const \c Ptr<PacketBurst> argument is deprecated
+     * @see class CallBackTraceSource
+     * @deprecated The non-const \c Ptr<PacketBurst> argument is deprecated
      * and will be changed to \c Ptrc<PacketBurst> in a future release.
      */
     // NS_DEPRECATED() - tag for future removal
@@ -501,8 +501,8 @@
      * The trace source fired when a packet begins the reception process from
      * the medium.
      *
-     * \see class CallBackTraceSource
-     * \deprecated The non-const \c Ptr<PacketBurst> argument is deprecated
+     * @see class CallBackTraceSource
+     * @deprecated The non-const \c Ptr<PacketBurst> argument is deprecated
      * and will be changed to \c Ptrc<PacketBurst> in a future release.
      */
     // NS_DEPRECATED() - tag for future removal
@@ -512,8 +512,8 @@
      * The trace source fired when a packet ends the reception process from
      * the medium.
      *
-     * \see class CallBackTraceSource
-     * \deprecated The non-const \c Ptr<PacketBurst> argument is deprecated
+     * @see class CallBackTraceSource
+     * @deprecated The non-const \c Ptr<PacketBurst> argument is deprecated
      * and will be changed to \c Ptrc<PacketBurst> in a future release.
      */
     // NS_DEPRECATED() - tag for future removal
@@ -522,8 +522,8 @@
     /**
      * The trace source fired when the phy layer drops a packet it has received.
      *
-     * \see class CallBackTraceSource
-     * \deprecated The non-const \c Ptr<PacketBurst> argument is deprecated
+     * @see class CallBackTraceSource
+     * @deprecated The non-const \c Ptr<PacketBurst> argument is deprecated
      * and will be changed to \c Ptrc<PacketBurst> in a future release.
      */
     // NS_DEPRECATED() - tag for future removal
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/snr-to-block-error-rate-manager.h ns-3.44/src/wimax/model/snr-to-block-error-rate-manager.h
--- ns-3.43/src/wimax/model/snr-to-block-error-rate-manager.h	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/snr-to-block-error-rate-manager.h	2025-03-09 16:55:49.819372700 -0700
@@ -20,8 +20,8 @@
 {
 
 /**
- * \ingroup wimax
- * \brief This class handles the  SNR to BlcER traces.
+ * @ingroup wimax
+ * @brief This class handles the  SNR to BlcER traces.
  *
  * A path to a repository containing trace files should be provided.
  * If no repository is provided the traces from default-traces.h will be loaded.
@@ -48,48 +48,48 @@
     SNRToBlockErrorRateManager();
     ~SNRToBlockErrorRateManager();
     /**
-     * \brief Set the path of the repository containing the traces
-     * \param traceFilePath the path to the repository.
+     * @brief Set the path of the repository containing the traces
+     * @param traceFilePath the path to the repository.
      */
     void SetTraceFilePath(char* traceFilePath);
     /**
-     * \return the path to the repository containing the traces.
+     * @return the path to the repository containing the traces.
      */
     std::string GetTraceFilePath();
     /**
-     * \brief returns the Block Error Rate for a given modulation and SNR value
-     * \param SNR the SNR value
-     * \param modulation one of the seven MCS
-     * \return the Block Error Rate
+     * @brief returns the Block Error Rate for a given modulation and SNR value
+     * @param SNR the SNR value
+     * @param modulation one of the seven MCS
+     * @return the Block Error Rate
      */
     double GetBlockErrorRate(double SNR, uint8_t modulation);
     SNRToBlockErrorRateRecord*
     /**
-     * \brief returns a record of type SNRToBlockErrorRateRecord corresponding to a given modulation
+     * @brief returns a record of type SNRToBlockErrorRateRecord corresponding to a given modulation
      * and SNR value
-     * \param SNR the SNR value
-     * \param modulation one of the seven MCS
-     * \return the Block Error Rate
+     * @param SNR the SNR value
+     * @param modulation one of the seven MCS
+     * @return the Block Error Rate
      */
     GetSNRToBlockErrorRateRecord(double SNR, uint8_t modulation);
     /**
-     * \brief Loads the traces form the repository specified in the constructor or set by
+     * @brief Loads the traces form the repository specified in the constructor or set by
      * SetTraceFilePath function. If no repository is provided, default traces will be loaded from
      * default-traces.h file
      */
 
     void LoadTraces();
     /**
-     * \brief Loads the default traces from default-traces.h file
+     * @brief Loads the default traces from default-traces.h file
      */
     void LoadDefaultTraces();
     /**
-     * \brief Reloads the trace
+     * @brief Reloads the trace
      */
     void ReLoadTraces();
     /**
-     * \brief If activate loss is called with false, all the returned BlcER will be 0 (no losses)
-     * \param loss true to activates losses
+     * @brief If activate loss is called with false, all the returned BlcER will be 0 (no losses)
+     * @param loss true to activates losses
      */
     void ActivateLoss(bool loss);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/snr-to-block-error-rate-record.h ns-3.44/src/wimax/model/snr-to-block-error-rate-record.h
--- ns-3.43/src/wimax/model/snr-to-block-error-rate-record.h	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/snr-to-block-error-rate-record.h	2025-03-09 16:55:49.819372700 -0700
@@ -14,8 +14,8 @@
 {
 
 /**
- * \ingroup wimax
- * \brief This class represents a record (handled by SnrToBlockErrorRate manager) that keeps a
+ * @ingroup wimax
+ * @brief This class represents a record (handled by SnrToBlockErrorRate manager) that keeps a
  * mapping between an SNR value and its corresponding (1) Bit Error Rate, (2) Block Error Rate, (3)
  * Standard deviation, (4 and 5) confidence interval.
  *
@@ -24,13 +24,13 @@
 {
   public:
     /**
-     * \brief creates a record and sets its values
-     * \param snrValue The SNR value
-     * \param bitErrorRate the BER
-     * \param BlockErrorRate the BlcER
-     * \param sigma2 the standard deviation
-     * \param I1 the lower boundary of the confidence interval
-     * \param I2 the upper boundary of the confidence interval
+     * @brief creates a record and sets its values
+     * @param snrValue The SNR value
+     * @param bitErrorRate the BER
+     * @param BlockErrorRate the BlcER
+     * @param sigma2 the standard deviation
+     * @param I1 the lower boundary of the confidence interval
+     * @param I2 the upper boundary of the confidence interval
      */
     SNRToBlockErrorRateRecord(double snrValue,
                               double bitErrorRate,
@@ -41,58 +41,58 @@
     ~SNRToBlockErrorRateRecord();
 
     /**
-     * \return the SNR value
+     * @return the SNR value
      */
     double GetSNRValue() const;
     /**
-     * \return the BER value
+     * @return the BER value
      */
     double GetBitErrorRate() const;
     /**
-     * \return the BlcER value
+     * @return the BlcER value
      */
     double GetBlockErrorRate() const;
     /**
-     * \return the standard deviation
+     * @return the standard deviation
      */
     double GetSigma2() const;
     /**
-     * \return the lower boundary of the confidence interval
+     * @return the lower boundary of the confidence interval
      */
     double GetI1() const;
     /**
-     * \return the upper boundary of the confidence interval
+     * @return the upper boundary of the confidence interval
      */
     double GetI2() const;
     /**
-     * \brief copy a record
-     * \return a copy of this record
+     * @brief copy a record
+     * @return a copy of this record
      */
     SNRToBlockErrorRateRecord* Copy() const;
 
     /**
-     * \brief set the snr value
-     * \param snrValue the SNR value
+     * @brief set the snr value
+     * @param snrValue the SNR value
      */
     void SetSNRValue(double snrValue);
     /**
-     * \brief set the BER value
-     * \param bitErrorRate the bit error rate value
+     * @brief set the BER value
+     * @param bitErrorRate the bit error rate value
      */
     void SetBitErrorRate(double bitErrorRate);
     /**
-     * \brief set the BlcER value
-     * \param blockErrorRate the block error rate value
+     * @brief set the BlcER value
+     * @param blockErrorRate the block error rate value
      */
     void SetBlockErrorRate(double blockErrorRate);
     /**
-     * \brief set the lower boundary of the confidence interval
-     * \param i1 the lower boundary of the confidence interval
+     * @brief set the lower boundary of the confidence interval
+     * @param i1 the lower boundary of the confidence interval
      */
     void SetI1(double i1);
     /**
-     * \brief set the upper boundary of the confidence interval
-     * \param i2 the upper boundary of the confidence interval
+     * @brief set the upper boundary of the confidence interval
+     * @param i2 the upper boundary of the confidence interval
      */
     void SetI2(double i2);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/ss-link-manager.cc ns-3.44/src/wimax/model/ss-link-manager.cc
--- ns-3.43/src/wimax/model/ss-link-manager.cc	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/ss-link-manager.cc	2025-03-09 16:55:49.819372700 -0700
@@ -273,8 +273,8 @@
 void
 SSLinkManager::PerformBackoff()
 {
-    Time deferTime = Seconds(0);
-    Time timeToAllocation = Seconds(0);
+    Time deferTime;
+    Time timeToAllocation;
     uint16_t nrPsPerRangOpp = m_ss->GetCurrentUcd().GetChannelEncodings().GetRangReqOppSize();
     uint16_t oppSize = m_ss->GetCurrentUcd().GetChannelEncodings().GetRangReqOppSize() /
                        m_ss->GetPhy()->GetPsPerSymbol();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/ss-link-manager.h ns-3.44/src/wimax/model/ss-link-manager.h
--- ns-3.43/src/wimax/model/ss-link-manager.h	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/ss-link-manager.h	2025-03-09 16:55:49.819372700 -0700
@@ -25,22 +25,22 @@
 {
 
 /**
- * \ingroup wimax
- * \brief this class implements the link manager of subscriber station net device. An ss link
+ * @ingroup wimax
+ * @brief this class implements the link manager of subscriber station net device. An ss link
  * manager is responsible for link scanning and ranging
  */
 class SSLinkManager : public Object
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     /**
      * Constructor
      *
-     * \param ss subscriber station device
+     * @param ss subscriber station device
      */
     SSLinkManager(Ptr<SubscriberStationNetDevice> ss);
     ~SSLinkManager() override;
@@ -48,58 +48,58 @@
 
     /**
      * Set BS EIRP
-     * \param bs_eirp the BS EIRP
+     * @param bs_eirp the BS EIRP
      */
     void SetBsEirp(uint16_t bs_eirp);
     /**
      * Set EIRX IR maximum
-     * \param eir_x_p_ir_max the EIRX IR maximum
+     * @param eir_x_p_ir_max the EIRX IR maximum
      */
     void SetEirXPIrMax(uint16_t eir_x_p_ir_max);
     /**
      * Set ranging interval found
-     * \param rangingIntervalFound the ranging interval found
+     * @param rangingIntervalFound the ranging interval found
      */
     void SetRangingIntervalFound(bool rangingIntervalFound);
     /**
      * Get ranging interval found
-     * \returns the ranging interval found
+     * @returns the ranging interval found
      */
     bool GetRangingIntervalFound() const;
     /**
      * Set NR ranging trans opps
-     * \param nrRangingTransOpps the NR ranging trans opps
+     * @param nrRangingTransOpps the NR ranging trans opps
      */
     void SetNrRangingTransOpps(uint8_t nrRangingTransOpps);
     /**
      * Set ranging CW
-     * \param rangingCW the ranging CW
+     * @param rangingCW the ranging CW
      */
     void SetRangingCW(uint8_t rangingCW);
     /// Increment NR invited polls received
     void IncrementNrInvitedPollsRecvd();
     /**
      * Get DL map sync timeout event
-     * \returns the event ID
+     * @returns the event ID
      */
     EventId GetDlMapSyncTimeoutEvent();
 
     /**
      * Perform ranging
-     * \param cid the CID
-     * \param rngrsp the ranging response
+     * @param cid the CID
+     * @param rngrsp the ranging response
      */
     void PerformRanging(Cid cid, RngRsp rngrsp);
     /**
      * Start scanning
-     * \param type the event type
-     * \param deleteParameters the delete parameters
+     * @param type the event type
+     * @param deleteParameters the delete parameters
      */
     void StartScanning(SubscriberStationNetDevice::EventType type, bool deleteParameters);
     /**
      * Send ranging request
-     * \param uiuc the UIUC
-     * \param allocationSize the allocation size
+     * @param uiuc the UIUC
+     * @param allocationSize the allocation size
      */
     void SendRangingRequest(uint8_t uiuc, uint16_t allocationSize);
     /// Start contention resolution
@@ -108,15 +108,15 @@
     void PerformBackoff();
     /**
      * Is UL channel usable
-     * \returns the UL channel usable flag
+     * @returns the UL channel usable flag
      */
     bool IsUlChannelUsable();
     /**
      * Schedule scanning request
-     * \param interval the scanning request interval
-     * \param eventType event type
-     * \param deleteUlParameters the delete UL parameters
-     * \param eventId the event ID
+     * @param interval the scanning request interval
+     * @param eventType event type
+     * @param deleteUlParameters the delete UL parameters
+     * @param eventId the event ID
      */
     void ScheduleScanningRestart(Time interval,
                                  SubscriberStationNetDevice::EventType eventType,
@@ -128,22 +128,22 @@
     SSLinkManager(const SSLinkManager&);
     /**
      * assignment operator
-     * \returns SS link manager
+     * @returns SS link manager
      */
     SSLinkManager& operator=(const SSLinkManager&);
 
     /**
      * End scanning
-     * \param status the end status
-     * \param frequency the frequency
+     * @param status the end status
+     * @param frequency the frequency
      */
     void EndScanning(bool status, uint64_t frequency);
     /// Start synchronizing
     void StartSynchronizing();
     /**
      * Search for DL channel
-     * \param channel the DL channel
-     * \returns true if found
+     * @param channel the DL channel
+     * @returns true if found
      */
     bool SearchForDlChannel(uint8_t channel);
     /// Select random backoff
@@ -156,19 +156,19 @@
     void DeleteUplinkParameters();
     /**
      * Adjust ranging parameters
-     * \param rngrsp the ranging response
+     * @param rngrsp the ranging response
      */
     void AdjustRangingParameters(const RngRsp& rngrsp);
     /// Negotiate basic capabilities
     void NegotiateBasicCapabilities();
     /**
      * Calculate maximum IR signal strength
-     * \returns the maximum IR signal strength
+     * @returns the maximum IR signal strength
      */
     uint16_t CalculateMaxIRSignalStrength();
     /**
      * Get minimum transmit power level
-     * \returns the minimum transmit power level
+     * @returns the minimum transmit power level
      */
     uint16_t GetMinTransmitPowerLevel();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/ss-manager.h ns-3.44/src/wimax/model/ss-manager.h
--- ns-3.43/src/wimax/model/ss-manager.h	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/ss-manager.h	2025-03-09 16:55:49.819372700 -0700
@@ -20,77 +20,77 @@
 {
 
 /**
- * \ingroup wimax
- * \brief this class manages a list of SSrecords
- * \see SSrecord
+ * @ingroup wimax
+ * @brief this class manages a list of SSrecords
+ * @see SSrecord
  */
 class SSManager : public Object
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     SSManager();
     ~SSManager() override;
     /**
      * Create SS record
-     * \param macAddress the MAC address
-     * \returns pointer to the SS record
+     * @param macAddress the MAC address
+     * @returns pointer to the SS record
      */
     SSRecord* CreateSSRecord(const Mac48Address& macAddress);
     /**
      * Get SS record
-     * \param macAddress the MAC address
-     * \returns pointer to the SS record
+     * @param macAddress the MAC address
+     * @returns pointer to the SS record
      */
     SSRecord* GetSSRecord(const Mac48Address& macAddress) const;
     /**
-     * \brief returns the ssrecord which has been assigned this cid. Since
+     * @brief returns the ssrecord which has been assigned this cid. Since
      *        different types of cids (basic, primary, transport) are assigned
      *        different values, all cids (basic, primary and transport) of the
      *        ssrecord are matched.
-     * \param cid the cid to be matched
-     * \return pointer to the ss record matching the cid
+     * @param cid the cid to be matched
+     * @return pointer to the ss record matching the cid
      */
     SSRecord* GetSSRecord(Cid cid) const;
     /**
      * Get SS records
-     * \returns a vector of pointers to the SS records
+     * @returns a vector of pointers to the SS records
      */
     std::vector<SSRecord*>* GetSSRecords() const;
     /**
      * Check if address is in record
-     * \param macAddress the MAC address
-     * \returns whether the address is in the record
+     * @param macAddress the MAC address
+     * @returns whether the address is in the record
      */
     bool IsInRecord(const Mac48Address& macAddress) const;
     /**
      * Check if address is registered
-     * \param macAddress the MAC address
-     * \returns whether the address is registered
+     * @param macAddress the MAC address
+     * @returns whether the address is registered
      */
     bool IsRegistered(const Mac48Address& macAddress) const;
     /**
      * Delete SS record
-     * \param cid the CID
+     * @param cid the CID
      */
     void DeleteSSRecord(Cid cid);
     /**
      * Get MAC address by CID
-     * \param cid the CID
-     * \returns the MAC address
+     * @param cid the CID
+     * @returns the MAC address
      */
     Mac48Address GetMacAddress(Cid cid) const;
     /**
      * Get number of SSs
-     * \returns the number of SSs
+     * @returns the number of SSs
      */
     uint32_t GetNSSs() const;
     /**
      * Get number of registered SSs
-     * \returns the number of registered SSs
+     * @returns the number of registered SSs
      */
     uint32_t GetNRegisteredSSs() const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/ss-net-device.cc ns-3.44/src/wimax/model/ss-net-device.cc
--- ns-3.43/src/wimax/model/ss-net-device.cc	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/ss-net-device.cc	2025-03-09 16:55:49.819372700 -0700
@@ -1161,13 +1161,11 @@
     m_nrUlMapRecvd++;
     m_ucdCount = ulmap.GetUcdCount();
     m_allocationStartTime = ulmap.GetAllocationStartTime();
-    std::list<OfdmUlMapIe> ulMapElements = ulmap.GetUlMapElements();
+    const auto& ulMapElements = ulmap.GetUlMapElements();
     m_linkManager->SetRangingIntervalFound(false);
 
-    for (auto iter = ulMapElements.begin(); iter != ulMapElements.end(); ++iter)
+    for (const auto& ulMapIe : ulMapElements)
     {
-        OfdmUlMapIe ulMapIe = *iter;
-
         if (ulMapIe.GetUiuc() == OfdmUlBurstProfile::UIUC_END_OF_MAP)
         {
             break;
@@ -1263,12 +1261,10 @@
 
     GetPhy()->GetFrameDuration(dcdChnlEncodings.GetFrameDurationCode());
 
-    std::vector<OfdmDlBurstProfile> dlBurstProfiles = dcd.GetDlBurstProfiles();
+    const auto& dlBurstProfiles = dcd.GetDlBurstProfiles();
 
-    for (auto iter = dlBurstProfiles.begin(); iter != dlBurstProfiles.end(); ++iter)
+    for (const auto& brstProfile : dlBurstProfiles)
     {
-        OfdmDlBurstProfile brstProfile = *iter;
-
         /*NS-2 does this, may be not correct, assumes DIUC/UIUC to
          modulation type mapping in DCD/UCD may change over time*/
         if (brstProfile.GetFecCodeType() == m_modulationType)
@@ -1298,12 +1294,9 @@
                                 1); // initializing ranging CW
     OfdmUcdChannelEncodings ucdChnlEncodings = ucd.GetChannelEncodings();
 
-    std::vector<OfdmUlBurstProfile> ulBurstProfiles = ucd.GetUlBurstProfiles();
-
-    for (auto iter = ulBurstProfiles.begin(); iter != ulBurstProfiles.end(); ++iter)
+    const auto& ulBurstProfiles = ucd.GetUlBurstProfiles();
+    for (const auto& brstProfile : ulBurstProfiles)
     {
-        OfdmUlBurstProfile brstProfile = *iter;
-
         /*NS-2 does this, may be not correct, assumes DIUC/UIUC to
          modulation type mapping in DCD/UCD may change over time*/
         if (brstProfile.GetFecCodeType() == m_modulationType)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/ss-net-device.h ns-3.44/src/wimax/model/ss-net-device.h
--- ns-3.43/src/wimax/model/ss-net-device.h	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/ss-net-device.h	2025-03-09 16:55:49.819372700 -0700
@@ -32,7 +32,7 @@
 class IpcsClassifier;
 
 /**
- * \ingroup wimax
+ * @ingroup wimax
  * SubscriberStationNetDevice subclass of WimaxNetDevice
  */
 class SubscriberStationNetDevice : public WimaxNetDevice
@@ -68,205 +68,205 @@
     };
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     SubscriberStationNetDevice();
     /**
      * Constructor
      *
-     * \param node the node
-     * \param phy the wimax phy
+     * @param node the node
+     * @param phy the wimax phy
      */
     SubscriberStationNetDevice(Ptr<Node> node, Ptr<WimaxPhy> phy);
     ~SubscriberStationNetDevice() override;
 
     /**
-     * \brief initializes the net device and sets the parameters to the default values
+     * @brief initializes the net device and sets the parameters to the default values
      */
     void InitSubscriberStationNetDevice();
     /**
-     * \param lostDlMapInterval time since last received DL-MAP message before downlink
+     * @param lostDlMapInterval time since last received DL-MAP message before downlink
      * synchronization is considered lost
      */
     void SetLostDlMapInterval(Time lostDlMapInterval);
     /**
-     * \returns the time since last received DL-MAP message before downlink synchronization is
+     * @returns the time since last received DL-MAP message before downlink synchronization is
      * considered lost
      */
     Time GetLostDlMapInterval() const;
     /**
-     * \param lostUlMapInterval Time since last received UL-MAP before uplink synchronization is
+     * @param lostUlMapInterval Time since last received UL-MAP before uplink synchronization is
      * considered lost
      */
     void SetLostUlMapInterval(Time lostUlMapInterval);
     /**
-     * \returns the time since last received UL-MAP before uplink synchronization is considered lost
+     * @returns the time since last received UL-MAP before uplink synchronization is considered lost
      */
     Time GetLostUlMapInterval() const;
     /**
-     * \param maxDcdInterval Maximum time between transmission of DCD messages
+     * @param maxDcdInterval Maximum time between transmission of DCD messages
      */
     void SetMaxDcdInterval(Time maxDcdInterval);
     /**
-     * \returns the maximum time between transmission of DCD messages
+     * @returns the maximum time between transmission of DCD messages
      */
     Time GetMaxDcdInterval() const;
     /**
-     * \param maxUcdInterval Maximum time between transmission of UCD messages
+     * @param maxUcdInterval Maximum time between transmission of UCD messages
      */
     void SetMaxUcdInterval(Time maxUcdInterval);
     /**
-     * \returns the maximum time between transmission of UCD messages
+     * @returns the maximum time between transmission of UCD messages
      */
     Time GetMaxUcdInterval() const;
     /**
-     * \param interval1 Wait for DCD timeout value
+     * @param interval1 Wait for DCD timeout value
      */
     void SetIntervalT1(Time interval1);
     /**
-     * \returns the wait for DCD timeout
+     * @returns the wait for DCD timeout
      */
     Time GetIntervalT1() const;
     /**
-     * \param interval2 the wait for broadcast ranging timeout, i.e., wait for initial ranging
+     * @param interval2 the wait for broadcast ranging timeout, i.e., wait for initial ranging
      * opportunity
      */
     void SetIntervalT2(Time interval2);
     /**
-     * \returns the wait for broadcast ranging timeout, i.e., wait for initial ranging opportunity
+     * @returns the wait for broadcast ranging timeout, i.e., wait for initial ranging opportunity
      */
     Time GetIntervalT2() const;
     /**
-     * \param interval3 the ranging Response reception timeout following the transmission of a
+     * @param interval3 the ranging Response reception timeout following the transmission of a
      * ranging request
      */
     void SetIntervalT3(Time interval3);
     /**
-     * \returns the ranging Response reception timeout following the transmission of a ranging
+     * @returns the ranging Response reception timeout following the transmission of a ranging
      * request
      */
     Time GetIntervalT3() const;
     /**
-     * \param interval7 the wait for DSA/DSC/DSD Response timeout
+     * @param interval7 the wait for DSA/DSC/DSD Response timeout
      */
     void SetIntervalT7(Time interval7);
     /**
-     * \returns the wait for DSA/DSC/DSD Response timeout
+     * @returns the wait for DSA/DSC/DSD Response timeout
      */
     Time GetIntervalT7() const;
     /**
-     * \param interval12 the Wait for UCD descriptor timeout
+     * @param interval12 the Wait for UCD descriptor timeout
      */
     void SetIntervalT12(Time interval12);
     /**
-     * \returns the wait for UCD descriptor timeout
+     * @returns the wait for UCD descriptor timeout
      */
     Time GetIntervalT12() const;
     /**
-     * \param interval20 the Time the SS searches for preambles on a given channel
+     * @param interval20 the Time the SS searches for preambles on a given channel
      */
     void SetIntervalT20(Time interval20);
     /**
-     * \returns the Time the SS searches for preambles on a given channel
+     * @returns the Time the SS searches for preambles on a given channel
      */
     Time GetIntervalT20() const;
     /**
-     * \param interval21 the time the SS searches for (decodable) DL-MAP on a given channel
+     * @param interval21 the time the SS searches for (decodable) DL-MAP on a given channel
      */
     void SetIntervalT21(Time interval21);
     /**
-     * \returns the time the SS searches for (decodable) DL-MAP on a given channel
+     * @returns the time the SS searches for (decodable) DL-MAP on a given channel
      */
     Time GetIntervalT21() const;
     /**
-     * \param maxContentionRangingRetries the Number of retries on contention Ranging Requests
+     * @param maxContentionRangingRetries the Number of retries on contention Ranging Requests
      */
     void SetMaxContentionRangingRetries(uint8_t maxContentionRangingRetries);
     /**
-     * \returns the Number of retries on contention Ranging Requests
+     * @returns the Number of retries on contention Ranging Requests
      */
     uint8_t GetMaxContentionRangingRetries() const;
     /**
-     * \param basicConnection the basic connection to be used
+     * @param basicConnection the basic connection to be used
      */
     void SetBasicConnection(Ptr<WimaxConnection> basicConnection);
     /**
-     * \return the basic connection currently in use
+     * @return the basic connection currently in use
      */
     Ptr<WimaxConnection> GetBasicConnection() const;
     /**
-     * \param primaryConnection the primary connection to be used
+     * @param primaryConnection the primary connection to be used
      */
     void SetPrimaryConnection(Ptr<WimaxConnection> primaryConnection);
     /**
-     * \returns the primary connection currently used
+     * @returns the primary connection currently used
      */
     Ptr<WimaxConnection> GetPrimaryConnection() const;
     /**
-     * \returns the basic CID
+     * @returns the basic CID
      */
     Cid GetBasicCid() const;
     /**
-     * \returns the primary CID
+     * @returns the primary CID
      */
     Cid GetPrimaryCid() const;
 
     /**
-     * \brief Set the most efficient modulation and coding scheme (MCS) supported by the device
-     * \param modulationType the most robust MCS supported
+     * @brief Set the most efficient modulation and coding scheme (MCS) supported by the device
+     * @param modulationType the most robust MCS supported
      */
     void SetModulationType(WimaxPhy::ModulationType modulationType);
     /**
-     * \returns the most efficient modulation and coding scheme (MCS) supported by the device
+     * @returns the most efficient modulation and coding scheme (MCS) supported by the device
      */
     WimaxPhy::ModulationType GetModulationType() const;
     /**
-     * \param areManagementConnectionsAllocated true if the management connections are allocated,
+     * @param areManagementConnectionsAllocated true if the management connections are allocated,
      * false otherwise
      */
     void SetAreManagementConnectionsAllocated(bool areManagementConnectionsAllocated);
     /**
-     * \returns true if the management connections are allocated, false otherwise
+     * @returns true if the management connections are allocated, false otherwise
      */
     bool GetAreManagementConnectionsAllocated() const;
     /**
-     * \param areServiceFlowsAllocated true if the service flows are allocated, false otherwise
+     * @param areServiceFlowsAllocated true if the service flows are allocated, false otherwise
      */
     void SetAreServiceFlowsAllocated(bool areServiceFlowsAllocated);
     /**
-     * \returns true if the service flows are allocated, false otherwise
+     * @returns true if the service flows are allocated, false otherwise
      */
     bool GetAreServiceFlowsAllocated() const;
     /**
-     * \return the scheduler installed on the device
+     * @return the scheduler installed on the device
      */
     Ptr<SSScheduler> GetScheduler() const;
     /**
-     * \param ssScheduler the scheduler to be installed on the device
+     * @param ssScheduler the scheduler to be installed on the device
      */
     void SetScheduler(Ptr<SSScheduler> ssScheduler);
     /**
-     * \returns true if the device has at least one active service flow, false otherwise
+     * @returns true if the device has at least one active service flow, false otherwise
      */
     bool HasServiceFlows() const;
     /**
-     * \brief Enqueue a packet into a connection queue
-     * \param packet the packet to be enqueued
-     * \param hdrType the mac header type to be appended to the packet
-     * \param connection the connection to be used
-     * \returns true if successful
+     * @brief Enqueue a packet into a connection queue
+     * @param packet the packet to be enqueued
+     * @param hdrType the mac header type to be appended to the packet
+     * @param connection the connection to be used
+     * @returns true if successful
      */
     bool Enqueue(Ptr<Packet> packet,
                  const MacHeaderType& hdrType,
                  Ptr<WimaxConnection> connection) override;
     /**
-     * \brief Sends a burst on the uplink frame
-     * \param uiuc theOfdmUlBurstProfile
-     * \param nrSymbols number of symbols
-     * \param connection connection to use
-     * \param packetType optional HeaderType (default HEADER_TYPE_GENERIC)
+     * @brief Sends a burst on the uplink frame
+     * @param uiuc theOfdmUlBurstProfile
+     * @param nrSymbols number of symbols
+     * @param connection connection to use
+     * @param packetType optional HeaderType (default HEADER_TYPE_GENERIC)
      */
     void SendBurst(uint8_t uiuc,
                    uint16_t nrSymbols,
@@ -274,70 +274,70 @@
                    MacHeaderType::HeaderType packetType = MacHeaderType::HEADER_TYPE_GENERIC);
 
     /**
-     * \brief Start the device
+     * @brief Start the device
      */
     void Start() override;
     /**
-     * \brief Stop the device
+     * @brief Stop the device
      */
     void Stop() override;
 
     /**
-     * \brief adds a new service flow
-     * \param sf pointer to service flow to add
+     * @brief adds a new service flow
+     * @param sf pointer to service flow to add
      */
     void AddServiceFlow(ServiceFlow* sf) const;
     /**
-     * \brief adds a new service flow
-     * \param sf service flow to add
+     * @brief adds a new service flow
+     * @param sf service flow to add
      */
     void AddServiceFlow(ServiceFlow sf) const;
     /**
-     * \brief Set timer.  If in stopped state, the EventId passed in the first
+     * @brief Set timer.  If in stopped state, the EventId passed in the first
      * argument will be cancelled.  If not, the second parameter will be set
      * to the value of the first parameter.
      *
-     * \param eventId EventId to cancel or to map to the second argument
-     * \param event EventId is set to first argument if not in stopped state
+     * @param eventId EventId to cancel or to map to the second argument
+     * @param event EventId is set to first argument if not in stopped state
      */
     void SetTimer(EventId eventId, EventId& event);
     /**
-     * \returns true if the SS is registered to a BS, false otherwise
+     * @returns true if the SS is registered to a BS, false otherwise
      */
     bool IsRegistered() const;
     /**
-     * \brief Get time to allocation
-     * \param deferTime defer time
-     * \returns the time to allocation
+     * @brief Get time to allocation
+     * @param deferTime defer time
+     * @returns the time to allocation
      */
     Time GetTimeToAllocation(Time deferTime);
 
     Ptr<SSLinkManager> m_linkManager; ///< link manager
     /**
-     * \returns a pointer to the CS packet classifier
+     * @returns a pointer to the CS packet classifier
      */
     Ptr<IpcsClassifier> GetIpcsClassifier() const;
     /**
-     * \brief Sets the packet classifier to be used
-     * \param classifier the classifier to use
+     * @brief Sets the packet classifier to be used
+     * @param classifier the classifier to use
      */
     void SetIpcsPacketClassifier(Ptr<IpcsClassifier> classifier);
     /**
-     * \returns a pointer to the link manager currently used
+     * @returns a pointer to the link manager currently used
      */
     Ptr<SSLinkManager> GetLinkManager() const;
     /**
-     * \brief sets the link manager to be used
-     * \param linkManager link manager to use
+     * @brief sets the link manager to be used
+     * @param linkManager link manager to use
      */
     void SetLinkManager(Ptr<SSLinkManager> linkManager);
     /**
-     * \returns a pointer to the service flow manager installed on the device
+     * @returns a pointer to the service flow manager installed on the device
      */
     Ptr<SsServiceFlowManager> GetServiceFlowManager() const;
     /**
-     * \brief Sets the service flow manager to be installed on the device
-     * \param sfm service flow manager to be used
+     * @brief Sets the service flow manager to be installed on the device
+     * @param sfm service flow manager to be used
      */
     void SetServiceFlowManager(Ptr<SsServiceFlowManager> sfm);
 
@@ -346,37 +346,37 @@
 
     /**
      * Set the Enqueue callback for ASCII tracing
-     * \param cb callback for ASCII tracing
+     * @param cb callback for ASCII tracing
      */
     void SetAsciiTxQueueEnqueueCallback(AsciiTraceCallback cb);
 
     /**
      * Set the Dequeue callback for ASCII tracing
-     * \param cb callback for ASCII tracing
+     * @param cb callback for ASCII tracing
      */
     void SetAsciiTxQueueDequeueCallback(AsciiTraceCallback cb);
 
     /**
      * Set the Drop callback for ASCII tracing
-     * \param cb callback for ASCII tracing
+     * @param cb callback for ASCII tracing
      */
     void SetAsciiTxQueueDropCallback(AsciiTraceCallback cb);
 
   private:
     /**
      * Get default lost DL map interval
-     * \returns the default lost DL map interval
+     * @returns the default lost DL map interval
      */
     static Time GetDefaultLostDlMapInterval();
 
     void DoDispose() override;
     /**
      * Send a packet
-     * \param packet the packet to send
-     * \param source the source MAC address
-     * \param dest the destination MAC address
-     * \param protocolNumber the protocol number
-     * \returns true if successful
+     * @param packet the packet to send
+     * @param source the source MAC address
+     * @param dest the destination MAC address
+     * @param protocolNumber the protocol number
+     * @returns true if successful
      */
     bool DoSend(Ptr<Packet> packet,
                 const Mac48Address& source,
@@ -384,28 +384,28 @@
                 uint16_t protocolNumber) override;
     /**
      * Receive a packet
-     * \param packet the packet received
+     * @param packet the packet received
      */
     void DoReceive(Ptr<Packet> packet) override;
 
     /**
      * Process DL map
-     * \param dlmap the DL map
+     * @param dlmap the DL map
      */
     void ProcessDlMap(const DlMap& dlmap);
     /**
      * Process UL map
-     * \param ulmap the UL map
+     * @param ulmap the UL map
      */
     void ProcessUlMap(const UlMap& ulmap);
     /**
      * Process DCD
-     * \param dcd the DCD
+     * @param dcd the DCD
      */
     void ProcessDcd(const Dcd& dcd);
     /**
      * Process UCD
-     * \param ucd the UCD
+     * @param ucd the UCD
      */
     void ProcessUcd(const Ucd& ucd);
 
@@ -476,7 +476,7 @@
      * The trace source fired when packets come into the "top" of the device
      * at the L3/L2 transition, before being queued for transmission.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_ssTxTrace;
 
@@ -484,7 +484,7 @@
      * The trace source fired when packets coming into the "top" of the device
      * are dropped at the MAC layer during transmission.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_ssTxDropTrace;
 
@@ -493,7 +493,7 @@
      * immediately before being forwarded up to higher layers (at the L2/L3
      * transition).  This is a promiscuous trace.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_ssPromiscRxTrace;
 
@@ -502,7 +502,7 @@
      * immediately before being forwarded up to higher layers (at the L2/L3
      * transition).  This is a non- promiscuous trace.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_ssRxTrace;
 
@@ -510,7 +510,7 @@
      * The trace source fired when packets coming into the "top" of the device
      * are dropped at the MAC layer during reception.
      *
-     * \see class CallBackTraceSource
+     * @see class CallBackTraceSource
      */
     TracedCallback<Ptr<const Packet>> m_ssRxDropTrace;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/ss-record.h ns-3.44/src/wimax/model/ss-record.h
--- ns-3.43/src/wimax/model/ss-record.h	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/ss-record.h	2025-03-09 16:55:49.819372700 -0700
@@ -27,8 +27,8 @@
 class ServiceFlow;
 
 /**
- * \ingroup wimax
- * \brief This class is used by the base station to store some information related to subscriber
+ * @ingroup wimax
+ * @brief This class is used by the base station to store some information related to subscriber
  * station in the cell.
  */
 class SSRecord
@@ -38,54 +38,54 @@
     /**
      * Constructor
      *
-     * \param macAddress MAC address
+     * @param macAddress MAC address
      */
     SSRecord(Mac48Address macAddress);
     /**
      * Constructor
      *
-     * \param macAddress MAC address
-     * \param IPaddress IP address
+     * @param macAddress MAC address
+     * @param IPaddress IP address
      */
     SSRecord(Mac48Address macAddress, Ipv4Address IPaddress);
     ~SSRecord();
 
     /**
      * Set basic CID
-     * \param basicCid the basic CID
+     * @param basicCid the basic CID
      */
     void SetBasicCid(Cid basicCid);
     /**
      * Get basic CID
-     * \returns the basic CID
+     * @returns the basic CID
      */
     Cid GetBasicCid() const;
 
     /**
      * Set primary CID
-     * \param primaryCid priamry CID
+     * @param primaryCid priamry CID
      */
     void SetPrimaryCid(Cid primaryCid);
     /**
      * Get primary CID
-     * \returns the CID
+     * @returns the CID
      */
     Cid GetPrimaryCid() const;
 
     /**
      * Set MAC address
-     * \param macAddress the MAC address
+     * @param macAddress the MAC address
      */
     void SetMacAddress(Mac48Address macAddress);
     /**
      * Get MAC address
-     * \returns the MAC address
+     * @returns the MAC address
      */
     Mac48Address GetMacAddress() const;
 
     /**
      * Get ranging correction retries
-     * \returns the ranging correction retries
+     * @returns the ranging correction retries
      */
     uint8_t GetRangingCorrectionRetries() const;
     /// Reset ranging correction retries
@@ -94,7 +94,7 @@
     void IncrementRangingCorrectionRetries();
     /**
      * Get invited range retries
-     * \returns the invited range retries
+     * @returns the invited range retries
      */
     uint8_t GetInvitedRangRetries() const;
     /// Reset invited ranging retries
@@ -103,23 +103,23 @@
     void IncrementInvitedRangingRetries();
     /**
      * Set modulation type
-     * \param modulationType the modulation type
+     * @param modulationType the modulation type
      */
     void SetModulationType(WimaxPhy::ModulationType modulationType);
     /**
      * Get modulation type
-     * \returns the modulation type
+     * @returns the modulation type
      */
     WimaxPhy::ModulationType GetModulationType() const;
 
     /**
      * Set ranging status
-     * \param rangingStatus the ranging status
+     * @param rangingStatus the ranging status
      */
     void SetRangingStatus(WimaxNetDevice::RangingStatus rangingStatus);
     /**
      * Get ranging status
-     * \returns the ranging status
+     * @returns the ranging status
      */
     WimaxNetDevice::RangingStatus GetRangingStatus() const;
 
@@ -129,117 +129,117 @@
     void DisablePollForRanging();
     /**
      * Get poll for ranging
-     * \returns the poll for ranging flag
+     * @returns the poll for ranging flag
      */
     bool GetPollForRanging() const;
 
     /**
      * Check if service flows are allocated
-     * \returns true if service flows are allocated
+     * @returns true if service flows are allocated
      */
     bool GetAreServiceFlowsAllocated() const;
 
     /**
      * Set poll ME bit
-     * \param pollMeBit the poll me bit
+     * @param pollMeBit the poll me bit
      */
     void SetPollMeBit(bool pollMeBit);
     /**
      * Get poll ME bit
-     * \returns the poll me bit
+     * @returns the poll me bit
      */
     bool GetPollMeBit() const;
 
     /**
      * Add service flow
-     * \param serviceFlow the service flow
+     * @param serviceFlow the service flow
      */
     void AddServiceFlow(ServiceFlow* serviceFlow);
     /**
      * Get service flows
-     * \param schedulingType the scheduling type
-     * \returns the service flow
+     * @param schedulingType the scheduling type
+     * @returns the service flow
      */
     std::vector<ServiceFlow*> GetServiceFlows(ServiceFlow::SchedulingType schedulingType) const;
     /**
      * Check if at least one flow has scheduling type SF_TYPE_UGS
-     * \return true if at least one flow has scheduling type SF_TYPE_UGS
+     * @return true if at least one flow has scheduling type SF_TYPE_UGS
      */
     bool GetHasServiceFlowUgs() const;
     /**
      * Check if at least one flow has scheduling type SF_TYPE_RTPS
-     * \return true if at least one flow has scheduling type SF_TYPE_RTPS
+     * @return true if at least one flow has scheduling type SF_TYPE_RTPS
      */
     bool GetHasServiceFlowRtps() const;
     /**
      * Check if at least one flow has scheduling type SF_TYPE_NRTPS
-     * \return true if at least one flow has scheduling type SF_TYPE_NRTPS
+     * @return true if at least one flow has scheduling type SF_TYPE_NRTPS
      */
     bool GetHasServiceFlowNrtps() const;
     /**
      * Check if at least one flow has scheduling type SF_TYPE_BE
-     * \return true if at least one flow has scheduling type SF_TYPE_BE
+     * @return true if at least one flow has scheduling type SF_TYPE_BE
      */
     bool GetHasServiceFlowBe() const;
 
     /**
      * Set SF transaction ID
-     * \param sfTransactionId the SF transaction ID
+     * @param sfTransactionId the SF transaction ID
      */
     void SetSfTransactionId(uint16_t sfTransactionId);
     /**
      * Get SF transaction ID
-     * \returns the SF transaction ID
+     * @returns the SF transaction ID
      */
     uint16_t GetSfTransactionId() const;
 
     /**
      * Set DSA response retries
-     * \param dsaRspRetries the DSA response retries
+     * @param dsaRspRetries the DSA response retries
      */
     void SetDsaRspRetries(uint8_t dsaRspRetries);
     /// Increment DAS response retries
     void IncrementDsaRspRetries();
     /**
      * Get DSA response retries
-     * \returns the DSA response retries
+     * @returns the DSA response retries
      */
     uint8_t GetDsaRspRetries() const;
 
     /**
      * Set DSA response
-     * \param dsaRsp the DSA response
+     * @param dsaRsp the DSA response
      */
     void SetDsaRsp(DsaRsp dsaRsp);
     /**
      * Get DSA response
-     * \returns the DSA response
+     * @returns the DSA response
      */
     DsaRsp GetDsaRsp() const;
     /**
      * Set is broadcast SS
-     * \param broadcast_enable the broadcast enable flag
+     * @param broadcast_enable the broadcast enable flag
      */
     void SetIsBroadcastSS(bool broadcast_enable);
     /**
      * Get is broadcast SS
-     * \returns the is broadcast SS flag
+     * @returns the is broadcast SS flag
      */
     bool GetIsBroadcastSS() const;
 
     /**
      * Get IP address
-     * \returns the IP address
+     * @returns the IP address
      */
     Ipv4Address GetIPAddress();
     /**
      * Set IP address
-     * \param IPaddress the IP address
+     * @param IPaddress the IP address
      */
     void SetIPAddress(Ipv4Address IPaddress);
     /**
      * Set are service flows allocated
-     * \param val the service flows allocated flag
+     * @param val the service flows allocated flag
      */
     void SetAreServiceFlowsAllocated(bool val);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/ss-scheduler.h ns-3.44/src/wimax/model/ss-scheduler.h
--- ns-3.43/src/wimax/model/ss-scheduler.h	2024-10-09 16:41:10.144657000 -0700
+++ ns-3.44/src/wimax/model/ss-scheduler.h	2025-03-09 16:55:49.819372700 -0700
@@ -26,21 +26,21 @@
 class WimaxConnection;
 
 /**
- * \ingroup wimax
- * \param SSScheduler class
+ * @ingroup wimax
+ * @param SSScheduler class
  */
 class SSScheduler : public Object
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     /**
      * Constructor
      *
-     * \param ss subscriber station device
+     * @param ss subscriber station device
      */
     SSScheduler(Ptr<SubscriberStationNetDevice> ss);
     ~SSScheduler() override;
@@ -51,20 +51,20 @@
 
     /**
      * Set poll me value
-     * \param pollMe the poll me flag
+     * @param pollMe the poll me flag
      */
     void SetPollMe(bool pollMe);
     /**
      * Get the poll me value
-     * \returns the poll me flag
+     * @returns the poll me flag
      */
     bool GetPollMe() const;
     /**
-     * \return a list of packet to be sent in the next opportunity
-     * \param availableSymbols the available resources in symbols
-     * \param modulationType the used modulation
-     * \param packetType the type of packets to select from
-     * \param connection the connection from which packets will be selected
+     * @return a list of packet to be sent in the next opportunity
+     * @param availableSymbols the available resources in symbols
+     * @param modulationType the used modulation
+     * @param packetType the type of packets to select from
+     * @param connection the connection from which packets will be selected
      */
     Ptr<PacketBurst> Schedule(uint16_t availableSymbols,
                               WimaxPhy::ModulationType modulationType,
@@ -76,7 +76,7 @@
   private:
     /**
      * Select connection
-     * \returns pointer to the wimax connection
+     * @returns pointer to the wimax connection
      */
     Ptr<WimaxConnection> SelectConnection();
     Ptr<SubscriberStationNetDevice> m_ss; ///< the subscriber station
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/ss-service-flow-manager.h ns-3.44/src/wimax/model/ss-service-flow-manager.h
--- ns-3.43/src/wimax/model/ss-service-flow-manager.h	2024-10-09 16:41:10.148656800 -0700
+++ ns-3.44/src/wimax/model/ss-service-flow-manager.h	2025-03-09 16:55:49.819372700 -0700
@@ -28,8 +28,8 @@
 class SubscriberStationNetDevice;
 
 /**
- * \ingroup wimax
- * \brief SsServiceFlowManager class
+ * @ingroup wimax
+ * @brief SsServiceFlowManager class
  */
 class SsServiceFlowManager : public ServiceFlowManager
 {
@@ -46,7 +46,7 @@
      *
      * Creates a service flow manager and attaches it to a device
      *
-     * \param device the device to which the service flow manager will be attached
+     * @param device the device to which the service flow manager will be attached
      */
     SsServiceFlowManager(Ptr<SubscriberStationNetDevice> device);
     ~SsServiceFlowManager() override;
@@ -54,38 +54,38 @@
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
 
     /**
-     * \brief add a service flow to the list
-     * \param serviceFlow the service flow to add
+     * @brief add a service flow to the list
+     * @param serviceFlow the service flow to add
      */
     void AddServiceFlow(ServiceFlow* serviceFlow);
     /**
-     * \brief add a service flow to the list
-     * \param serviceFlow the service flow to add
+     * @brief add a service flow to the list
+     * @param serviceFlow the service flow to add
      */
     void AddServiceFlow(ServiceFlow serviceFlow);
     /**
-     * \brief sets the maximum retries on DSA request message
-     * \param maxDsaReqRetries the maximum retries on DSA request message
+     * @brief sets the maximum retries on DSA request message
+     * @param maxDsaReqRetries the maximum retries on DSA request message
      */
     void SetMaxDsaReqRetries(uint8_t maxDsaReqRetries);
     /**
-     * \return the maximum retries on DSA request message
+     * @return the maximum retries on DSA request message
      */
     uint8_t GetMaxDsaReqRetries() const;
 
     /**
      * Get DSA response timeout event
-     * \returns the DSA response timeout event
+     * @returns the DSA response timeout event
      */
     EventId GetDsaRspTimeoutEvent() const;
     /**
      * Get DSA ack timeout event
-     * \returns the DSA ack timeout event
+     * @returns the DSA ack timeout event
      */
     EventId GetDsaAckTimeoutEvent() const;
 
@@ -94,26 +94,26 @@
 
     /**
      * Create DSA request
-     * \param serviceFlow the service flow
-     * \returns the DSA request
+     * @param serviceFlow the service flow
+     * @returns the DSA request
      */
     DsaReq CreateDsaReq(const ServiceFlow* serviceFlow);
 
     /**
      * Create DSA ack
-     * \returns the packet
+     * @returns the packet
      */
     Ptr<Packet> CreateDsaAck();
 
     /**
      * Schedule DSA response
-     * \param serviceFlow the service flow
+     * @param serviceFlow the service flow
      */
     void ScheduleDsaReq(const ServiceFlow* serviceFlow);
 
     /**
      * Process DSA response
-     * \param dsaRsp the DSA response
+     * @param dsaRsp the DSA response
      */
     void ProcessDsaRsp(const DsaRsp& dsaRsp);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/ul-job.cc ns-3.44/src/wimax/model/ul-job.cc
--- ns-3.43/src/wimax/model/ul-job.cc	2024-10-09 16:41:10.148656800 -0700
+++ ns-3.44/src/wimax/model/ul-job.cc	2025-03-09 16:55:49.819372700 -0700
@@ -15,7 +15,7 @@
 {
 
 UlJob::UlJob()
-    : m_deadline(Seconds(0)),
+    : m_deadline(),
       m_size(0)
 {
 }
@@ -121,10 +121,10 @@
 }
 
 /**
- * \brief equality operator
- * \param a first ULJob
- * \param b second ULJob
- * \returns true if equal
+ * @brief equality operator
+ * @param a first ULJob
+ * @param b second ULJob
+ * @returns true if equal
  */
 bool
 operator==(const UlJob& a, const UlJob& b)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/ul-job.h ns-3.44/src/wimax/model/ul-job.h
--- ns-3.43/src/wimax/model/ul-job.h	2024-10-09 16:41:10.148656800 -0700
+++ ns-3.44/src/wimax/model/ul-job.h	2025-03-09 16:55:49.819372700 -0700
@@ -32,8 +32,8 @@
 };
 
 /**
- * \ingroup wimax
- * \brief this class implements a structure to compute the priority of service flows
+ * @ingroup wimax
+ * @brief this class implements a structure to compute the priority of service flows
  */
 class UlJob : public Object
 {
@@ -50,87 +50,87 @@
     ~UlJob() override;
     /**
      * Get SS record
-     * \returns the SS record
+     * @returns the SS record
      */
     SSRecord* GetSsRecord() const;
     /**
      * Set SS record
-     * \param ssRecord the SS record
+     * @param ssRecord the SS record
      */
     void SetSsRecord(SSRecord* ssRecord);
     /**
      * Get scheduling type
-     * \returns the scheduling type
+     * @returns the scheduling type
      */
     ServiceFlow::SchedulingType GetSchedulingType() const;
     /**
      * Set scheduling type
-     * \param schedulingType the scheduling type
+     * @param schedulingType the scheduling type
      */
     void SetSchedulingType(ServiceFlow::SchedulingType schedulingType);
     /**
      * Get service flow
-     * \returns the service flow
+     * @returns the service flow
      */
     ServiceFlow* GetServiceFlow() const;
     /**
      * Set service flow
-     * \param serviceFlow
+     * @param serviceFlow
      */
     void SetServiceFlow(ServiceFlow* serviceFlow);
 
     /**
      * Get type
-     * \returns the request type
+     * @returns the request type
      */
     ReqType GetType() const;
     /**
      * Set type
-     * \param type the type
+     * @param type the type
      */
     void SetType(ReqType type);
 
     /**
      * Get release time
-     * \returns the release time
+     * @returns the release time
      */
     Time GetReleaseTime() const;
     /**
      * Set release time
-     * \param releaseTime the release time
+     * @param releaseTime the release time
      */
     void SetReleaseTime(Time releaseTime);
 
     /**
      * Get period
-     * \returns the period time
+     * @returns the period time
      */
     Time GetPeriod() const;
     /**
      * Set period
-     * \param period the period
+     * @param period the period
      */
     void SetPeriod(Time period);
 
     /**
      * Get deadline
-     * \returns the deadline time
+     * @returns the deadline time
      */
     Time GetDeadline() const;
     /**
      * Set deadline
-     * \param deadline the dead line
+     * @param deadline the dead line
      */
     void SetDeadline(Time deadline);
 
     /**
      * Get size
-     * \returns the size
+     * @returns the size
      */
     uint32_t GetSize() const;
     /**
      * Set size
-     * \param size the size
+     * @param size the size
      */
     void SetSize(uint32_t size);
 
@@ -156,30 +156,30 @@
 class PriorityUlJob : public Object
 {
     /**
-     * \brief this class implements an auxiliary struct to compute the priority of the rtPS and
+     * @brief this class implements an auxiliary struct to compute the priority of the rtPS and
      * nrtPS in the intermediate queue
      */
   public:
     PriorityUlJob();
     /**
      * Get priority
-     * \returns the priority
+     * @returns the priority
      */
     int GetPriority() const;
     /**
      * Set priority
-     * \param priority the priority
+     * @param priority the priority
      */
     void SetPriority(int priority);
 
     /**
      * Get UL job function
-     * \returns the UL job
+     * @returns the UL job
      */
     Ptr<UlJob> GetUlJob() const;
     /**
      * Set UL job
-     * \param job the UL job
+     * @param job the UL job
      */
     void SetUlJob(Ptr<UlJob> job);
 
@@ -192,10 +192,10 @@
 struct SortProcess
 {
     /**
-     * \brief comparison operator
-     * \param left left side input
-     * \param right right side input
-     * \returns true if left is logically less then right for given comparison
+     * @brief comparison operator
+     * @param left left side input
+     * @param right right side input
+     * @returns true if left is logically less then right for given comparison
      */
     bool operator()(PriorityUlJob& left, PriorityUlJob& right) const
     {
@@ -222,10 +222,10 @@
 struct SortProcessPtr
 {
     /**
-     * \brief comparison operator
-     * \param left left side input
-     * \param right right side input
-     * \returns true if left is logically less then right for given comparison
+     * @brief comparison operator
+     * @param left left side input
+     * @param right right side input
+     * @returns true if left is logically less then right for given comparison
      */
     bool operator()(Ptr<PriorityUlJob>& left, Ptr<PriorityUlJob>& right) const
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/ul-mac-messages.h ns-3.44/src/wimax/model/ul-mac-messages.h
--- ns-3.43/src/wimax/model/ul-mac-messages.h	2024-10-09 16:41:10.148656800 -0700
+++ ns-3.44/src/wimax/model/ul-mac-messages.h	2025-03-09 16:55:49.819372700 -0700
@@ -20,7 +20,7 @@
 {
 
 /**
- * \ingroup wimax
+ * @ingroup wimax
  * This class implements the UCD channel encodings as described by "IEEE Standard for
  * Local and metropolitan area networks Part 16: Air Interface for Fixed Broadband Wireless Access
  * Systems" 11.3.1 UCD channel encodings, page 651
@@ -33,66 +33,66 @@
 
     /**
      * Set BW request opp size
-     * \param bwReqOppSize the bandwidth request opp size
+     * @param bwReqOppSize the bandwidth request opp size
      */
     void SetBwReqOppSize(uint16_t bwReqOppSize);
     /**
      * Set range request opp size
-     * \param rangReqOppSize the ranging request opp size
+     * @param rangReqOppSize the ranging request opp size
      */
     void SetRangReqOppSize(uint16_t rangReqOppSize);
     /**
      * Set frequency
-     * \param frequency the frequency
+     * @param frequency the frequency
      */
     void SetFrequency(uint32_t frequency);
 
     /**
      * Get BW request opp size
-     * \returns the bandwidth request opp size
+     * @returns the bandwidth request opp size
      */
     uint16_t GetBwReqOppSize() const;
     /**
      * Get range request opp size
-     * \returns the ragning request opp size
+     * @returns the ragning request opp size
      */
     uint16_t GetRangReqOppSize() const;
     /**
      * Get frequency
-     * \returns the frequency
+     * @returns the frequency
      */
     uint32_t GetFrequency() const;
 
     /**
      * Get size
-     * \returns the size
+     * @returns the size
      */
     uint16_t GetSize() const;
 
     /**
      * Write item
-     * \param start the iterator
-     * \returns the updated iterator
+     * @param start the iterator
+     * @returns the updated iterator
      */
     Buffer::Iterator Write(Buffer::Iterator start) const;
     /**
      * Read item
-     * \param start the iterator
-     * \returns the updated iterator
+     * @param start the iterator
+     * @returns the updated iterator
      */
     Buffer::Iterator Read(Buffer::Iterator start);
 
   private:
     /**
      * Write item
-     * \param start the iterator
-     * \returns the updated iterator
+     * @param start the iterator
+     * @returns the updated iterator
      */
     virtual Buffer::Iterator DoWrite(Buffer::Iterator start) const = 0;
     /**
      * Read item
-     * \param start the iterator
-     * \returns the updated iterator
+     * @param start the iterator
+     * @returns the updated iterator
      */
     virtual Buffer::Iterator DoRead(Buffer::Iterator start) = 0;
 
@@ -128,43 +128,43 @@
 
     /**
      * Set SB channel reguest region full parameters
-     * \param sbchnlReqRegionFullParams the channel request region full parameters
+     * @param sbchnlReqRegionFullParams the channel request region full parameters
      */
     void SetSbchnlReqRegionFullParams(uint8_t sbchnlReqRegionFullParams);
     /**
      * Set SB channel for control codes
-     * \param sbchnlFocContCodes the channel control codes
+     * @param sbchnlFocContCodes the channel control codes
      */
     void SetSbchnlFocContCodes(uint8_t sbchnlFocContCodes);
 
     /**
      * Get SB channel request region full parameters
-     * \returns the channel request region full parameters
+     * @returns the channel request region full parameters
      */
     uint8_t GetSbchnlReqRegionFullParams() const;
     /**
      * Get SB channel for control codes
-     * \returns the channel for control codes
+     * @returns the channel for control codes
      */
     uint8_t GetSbchnlFocContCodes() const;
 
     /**
      * Get size
-     * \returns the size
+     * @returns the size
      */
     uint16_t GetSize() const;
 
   private:
     /**
      * Write item
-     * \param start the iterator
-     * \returns the updated iterator
+     * @param start the iterator
+     * @returns the updated iterator
      */
     Buffer::Iterator DoWrite(Buffer::Iterator start) const override;
     /**
      * Read item
-     * \param start the iterator
-     * \returns the updated iterator
+     * @param start the iterator
+     * @returns the updated iterator
      */
     Buffer::Iterator DoRead(Buffer::Iterator start) override;
 
@@ -220,62 +220,62 @@
 
     /**
      * Set type
-     * \param type the type
+     * @param type the type
      */
     void SetType(uint8_t type);
     /**
      * Set length
-     * \param length the length
+     * @param length the length
      */
     void SetLength(uint8_t length);
     /**
      * Set UIUC
-     * \param uiuc the UIUC
+     * @param uiuc the UIUC
      */
     void SetUiuc(uint8_t uiuc);
     /**
      * Set FEC code type
-     * \param fecCodeType the FEC code type
+     * @param fecCodeType the FEC code type
      */
     void SetFecCodeType(uint8_t fecCodeType);
 
     /**
      * Get type
-     * \returns the type
+     * @returns the type
      */
     uint8_t GetType() const;
     /**
      * Get length
-     * \returns the length
+     * @returns the length
      */
     uint8_t GetLength() const;
     /**
      * Get UIUC
-     * \returns the UIUC
+     * @returns the UIUC
      */
     uint8_t GetUiuc() const;
     /**
      * Get FEC code type
-     * \returns the FEC code type
+     * @returns the FEC code type
      */
     uint8_t GetFecCodeType() const;
 
     /**
      * Get size
-     * \returns the size
+     * @returns the size
      */
     uint16_t GetSize() const;
 
     /**
      * Write item
-     * \param start the iterator
-     * \returns the updated iterator
+     * @param start the iterator
+     * @returns the updated iterator
      */
     Buffer::Iterator Write(Buffer::Iterator start) const;
     /**
      * Read item
-     * \param start the iterator
-     * \returns the updated iterator
+     * @param start the iterator
+     * @returns the updated iterator
      */
     Buffer::Iterator Read(Buffer::Iterator start);
 
@@ -318,94 +318,94 @@
 
     /**
      * Set configuration change count
-     * \param ucdCount the UCD count
+     * @param ucdCount the UCD count
      */
     void SetConfigurationChangeCount(uint8_t ucdCount);
     /**
      * Set ranging backoff start
-     * \param rangingBackoffStart ranging backoff start
+     * @param rangingBackoffStart ranging backoff start
      */
     void SetRangingBackoffStart(uint8_t rangingBackoffStart);
     /**
      * Set ranging backoff end
-     * \param rangingBackoffEnd the ranging backoff end
+     * @param rangingBackoffEnd the ranging backoff end
      */
     void SetRangingBackoffEnd(uint8_t rangingBackoffEnd);
     /**
      * Set request backoff start
-     * \param requestBackoffStart the request backoff start
+     * @param requestBackoffStart the request backoff start
      */
     void SetRequestBackoffStart(uint8_t requestBackoffStart);
     /**
      * Set request backoff end
-     * \param requestBackoffEnd the request backoff end
+     * @param requestBackoffEnd the request backoff end
      */
     void SetRequestBackoffEnd(uint8_t requestBackoffEnd);
     /**
      * Set channel encodings
-     * \param channelEncodings the channel encodings
+     * @param channelEncodings the channel encodings
      */
     void SetChannelEncodings(OfdmUcdChannelEncodings channelEncodings);
     /**
      * Add UL burst profile
-     * \param ulBurstProfile the UL burst profile
+     * @param ulBurstProfile the UL burst profile
      */
     void AddUlBurstProfile(OfdmUlBurstProfile ulBurstProfile);
     /**
      * Set NR UL burst profiles
-     * \param nrUlBurstProfiles the NR UL burst profiles
+     * @param nrUlBurstProfiles the NR UL burst profiles
      */
     void SetNrUlBurstProfiles(uint8_t nrUlBurstProfiles);
 
     /**
      * Get configuration change count
-     * \returns the configuration change count
+     * @returns the configuration change count
      */
     uint8_t GetConfigurationChangeCount() const;
     /**
      * Get ranging backoff start
-     * \returns the ranging backoff start
+     * @returns the ranging backoff start
      */
     uint8_t GetRangingBackoffStart() const;
     /**
      * Get ranging backoff end
-     * \returns the ranging backoff end value
+     * @returns the ranging backoff end value
      */
     uint8_t GetRangingBackoffEnd() const;
     /**
      * Get request backoff start
-     * \returns the request backoff start value
+     * @returns the request backoff start value
      */
     uint8_t GetRequestBackoffStart() const;
     /**
      * Get request backoff end
-     * \returns the request backoff end value
+     * @returns the request backoff end value
      */
     uint8_t GetRequestBackoffEnd() const;
     /**
      * Get channel encodings
-     * \returns the OFDM UCD channel encodings
+     * @returns the OFDM UCD channel encodings
      */
     OfdmUcdChannelEncodings GetChannelEncodings() const;
     /**
      * Get UL burst profiles
-     * \returns the UL burst profile
+     * @returns the UL burst profile
      */
     std::vector<OfdmUlBurstProfile> GetUlBurstProfiles() const;
     /**
      * Get number UL burst profiles
-     * \returns the number of UL burst profiles
+     * @returns the number of UL burst profiles
      */
     uint8_t GetNrUlBurstProfiles() const;
 
     /**
      * Get name
-     * \returns the name string
+     * @returns the name string
      */
     std::string GetName() const;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -457,82 +457,82 @@
 
     /**
      * Set CID
-     * \param cid the CID
+     * @param cid the CID
      */
     void SetCid(const Cid& cid);
     /**
      * Set start time
-     * \param startTime the start time
+     * @param startTime the start time
      */
     void SetStartTime(uint16_t startTime);
     /**
      * Set subchannel index
-     * \param subchannelIndex
+     * @param subchannelIndex
      */
     void SetSubchannelIndex(uint8_t subchannelIndex);
     /**
      * Set UIUC
-     * \param uiuc the UIUC
+     * @param uiuc the UIUC
      */
     void SetUiuc(uint8_t uiuc);
     /**
      * Set duration
-     * \param duration the duration
+     * @param duration the duration
      */
     void SetDuration(uint16_t duration);
     /**
      * Set midambe repetition interval
-     * \param midambleRepetitionInterval the midambe repetition interval
+     * @param midambleRepetitionInterval the midambe repetition interval
      */
     void SetMidambleRepetitionInterval(uint8_t midambleRepetitionInterval);
 
     /**
      * Get CID
-     * \returns the CID
+     * @returns the CID
      */
     Cid GetCid() const;
     /**
      * Get start time
-     * \returns the start time
+     * @returns the start time
      */
     uint16_t GetStartTime() const;
     /**
      * Get subchannel index
-     * \returns the subchannel index
+     * @returns the subchannel index
      */
     uint8_t GetSubchannelIndex() const;
     /**
      * Get UIUC
-     * \returns the UIUC
+     * @returns the UIUC
      */
     uint8_t GetUiuc() const;
     /**
      * Get duration
-     * \returns the duration
+     * @returns the duration
      */
     uint16_t GetDuration() const;
     /**
      * Get Midamble repetition interval
-     * \returns the midamble repetition interval
+     * @returns the midamble repetition interval
      */
     uint8_t GetMidambleRepetitionInterval() const;
 
     /**
      * Get size
-     * \returns the size
+     * @returns the size
      */
     uint16_t GetSize() const;
 
     /**
      * Write item
-     * \param start the iterator
-     * \returns the updated iterator
+     * @param start the iterator
+     * @returns the updated iterator
      */
     Buffer::Iterator Write(Buffer::Iterator start) const;
     /**
      * Read item
-     * \param start the iterator
-     * \returns the updated iterator
+     * @param start the iterator
+     * @returns the updated iterator
      */
     Buffer::Iterator Read(Buffer::Iterator start);
 
@@ -581,44 +581,44 @@
 
     /**
      * Set UCD count
-     * \param ucdCount the UCD count
+     * @param ucdCount the UCD count
      */
     void SetUcdCount(uint8_t ucdCount);
     /**
      * Set allocation start time
-     * \param allocationStartTime the allocation start time
+     * @param allocationStartTime the allocation start time
      */
     void SetAllocationStartTime(uint32_t allocationStartTime);
     /**
      * Add UL map element
-     * \param ulMapElement the UL map element
+     * @param ulMapElement the UL map element
      */
     void AddUlMapElement(OfdmUlMapIe ulMapElement);
 
     /**
      * Get UCD count
-     * \returns the UCD count
+     * @returns the UCD count
      */
     uint8_t GetUcdCount() const;
     /**
      * Get allocation start time
-     * \returns the allocation start time
+     * @returns the allocation start time
      */
     uint32_t GetAllocationStartTime() const;
     /**
      * Get UL map elements
-     * \returns the UL map elements
+     * @returns the UL map elements
      */
     std::list<OfdmUlMapIe> GetUlMapElements() const;
 
     /**
      * Get name
-     * \returns the name
+     * @returns the name
      */
     std::string GetName() const;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/wimax-channel.h ns-3.44/src/wimax/model/wimax-channel.h
--- ns-3.43/src/wimax/model/wimax-channel.h	2024-10-09 16:41:10.148656800 -0700
+++ ns-3.44/src/wimax/model/wimax-channel.h	2025-03-09 16:55:49.819372700 -0700
@@ -25,31 +25,31 @@
 class PacketBurst;
 
 /**
- * \ingroup wimax
+ * @ingroup wimax
  * The channel object to attach Wimax NetDevices
  */
 class WimaxChannel : public Channel
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     WimaxChannel();
     ~WimaxChannel() override;
     /**
-     * \brief attach the channel to a physical layer of a device
-     * \param phy the physical layer to which the channel will be attached
+     * @brief attach the channel to a physical layer of a device
+     * @param phy the physical layer to which the channel will be attached
      */
     void Attach(Ptr<WimaxPhy> phy);
     /**
-     * \return the number of attached devices
+     * @return the number of attached devices
      */
     std::size_t GetNDevices() const override;
     /**
-     * \param i the ith device
-     * \return the ith attached device
+     * @param i the ith device
+     * @return the ith attached device
      */
     Ptr<NetDevice> GetDevice(std::size_t i) const override;
 
@@ -58,27 +58,27 @@
      * used by this model.  Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     virtual int64_t AssignStreams(int64_t stream) = 0;
 
   private:
     /**
      * Attach a phy to the channel
-     * \param phy the phy object to attach
+     * @param phy the phy object to attach
      */
     virtual void DoAttach(Ptr<WimaxPhy> phy) = 0;
 
     /**
      * Get number of devices on the channel
-     * \returns the number of devices
+     * @returns the number of devices
      */
     virtual std::size_t DoGetNDevices() const = 0;
     /**
      * Get device corresponding to index
-     * \param i the device index
-     * \returns the device
+     * @param i the device index
+     * @returns the device
      */
     virtual Ptr<NetDevice> DoGetDevice(std::size_t i) const = 0;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/wimax-connection.h ns-3.44/src/wimax/model/wimax-connection.h
--- ns-3.43/src/wimax/model/wimax-connection.h	2024-10-09 16:41:10.148656800 -0700
+++ ns-3.44/src/wimax/model/wimax-connection.h	2025-03-09 16:55:49.819372700 -0700
@@ -27,113 +27,113 @@
 class Cid;
 
 /**
- * \ingroup wimax
+ * @ingroup wimax
  * Class to represent WiMAX connections
  */
 class WimaxConnection : public Object
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
 
     /**
      * Constructor
      *
-     * \param cid connection ID
-     * \param type CID type
+     * @param cid connection ID
+     * @param type CID type
      */
     WimaxConnection(Cid cid, Cid::Type type);
     ~WimaxConnection() override;
 
     /**
      * Get CID function
-     * \returns the CID
+     * @returns the CID
      */
     Cid GetCid() const;
 
     /**
      * Get type function
-     * \returns the type
+     * @returns the type
      */
     Cid::Type GetType() const;
     /**
-     * \return the queue of the connection
+     * @return the queue of the connection
      */
     Ptr<WimaxMacQueue> GetQueue() const;
     /**
-     * \brief set the service flow associated to this connection
-     * \param serviceFlow The service flow to be associated to this connection
+     * @brief set the service flow associated to this connection
+     * @param serviceFlow The service flow to be associated to this connection
      */
     void SetServiceFlow(ServiceFlow* serviceFlow);
     /**
-     * \return the service flow associated to this connection
+     * @return the service flow associated to this connection
      */
     ServiceFlow* GetServiceFlow() const;
 
     // wrapper functions
     /**
-     * \return the scheduling type of this connection
+     * @return the scheduling type of this connection
      */
     uint8_t GetSchedulingType() const;
     /**
-     * \brief enqueue a packet in the queue of the connection
-     * \param packet the packet to be enqueued
-     * \param hdrType the header type of the packet
-     * \param hdr the header of the packet
-     * \return true if successful
+     * @brief enqueue a packet in the queue of the connection
+     * @param packet the packet to be enqueued
+     * @param hdrType the header type of the packet
+     * @param hdr the header of the packet
+     * @return true if successful
      */
     bool Enqueue(Ptr<Packet> packet, const MacHeaderType& hdrType, const GenericMacHeader& hdr);
     /**
-     * \brief dequeue a packet from the queue of the connection
-     * \param packetType the type of the packet to dequeue
-     * \return packet dequeued
+     * @brief dequeue a packet from the queue of the connection
+     * @param packetType the type of the packet to dequeue
+     * @return packet dequeued
      */
     Ptr<Packet> Dequeue(MacHeaderType::HeaderType packetType = MacHeaderType::HEADER_TYPE_GENERIC);
     /**
-     * \brief dequeue a packet from the queue of the connection
+     * @brief dequeue a packet from the queue of the connection
      * Dequeue the first packet in the queue if its size is lower than
      * availableByte, the first availableByte of the first packet otherwise
      *
-     * \param packetType the type of the packet to dequeue
-     * \param availableByte the number of available bytes
-     * \return packet dequeued
+     * @param packetType the type of the packet to dequeue
+     * @param availableByte the number of available bytes
+     * @return packet dequeued
      */
     Ptr<Packet> Dequeue(MacHeaderType::HeaderType packetType, uint32_t availableByte);
     /**
-     * \return true if the connection has at least one packet in its queue, false otherwise
+     * @return true if the connection has at least one packet in its queue, false otherwise
      */
     bool HasPackets() const;
     /**
-     * \return true if the connection has at least one packet of type packetType in its queue, false
+     * @return true if the connection has at least one packet of type packetType in its queue, false
      * otherwise
-     * \param packetType type of packet to check in the queue
-     * \return true if packets available
+     * @param packetType type of packet to check in the queue
+     * @return true if packets available
      */
     bool HasPackets(MacHeaderType::HeaderType packetType) const;
 
     /**
      * Get type string
-     * \returns the type string
+     * @returns the type string
      */
     std::string GetTypeStr() const;
 
     /// Definition of Fragments Queue data type
     typedef std::list<Ptr<const Packet>> FragmentsQueue;
     /**
-     * \brief get a queue of received fragments
-     * \returns the fragments queue
+     * @brief get a queue of received fragments
+     * @returns the fragments queue
      */
     const FragmentsQueue GetFragmentsQueue() const;
     /**
-     * \brief enqueue a received packet (that is a fragment) into the fragments queue
-     * \param fragment received fragment
+     * @brief enqueue a received packet (that is a fragment) into the fragments queue
+     * @param fragment received fragment
      */
     void FragmentEnqueue(Ptr<const Packet> fragment);
     /**
-     * \brief delete all enqueued fragments
+     * @brief delete all enqueued fragments
      */
     void ClearFragmentsQueue();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/wimax-mac-header.h ns-3.44/src/wimax/model/wimax-mac-header.h
--- ns-3.43/src/wimax/model/wimax-mac-header.h	2024-10-09 16:41:10.148656800 -0700
+++ ns-3.44/src/wimax/model/wimax-mac-header.h	2025-03-09 16:55:49.819372700 -0700
@@ -18,10 +18,10 @@
 {
 
 /**
- * \ingroup wimax
+ * @ingroup wimax
  * This class Represents the HT (Header Type) field of generic MAC and bandwidth request headers
- * \see GenericMacHeader
- * \see BandwidthRequestHeader
+ * @see GenericMacHeader
+ * @see BandwidthRequestHeader
  */
 class MacHeaderType : public Header
 {
@@ -40,29 +40,29 @@
     /**
      * Constructor
      *
-     * \param type MAC header type
+     * @param type MAC header type
      */
     MacHeaderType(uint8_t type);
     ~MacHeaderType() override;
     /**
      * Set type field
-     * \param type the type
+     * @param type the type
      */
     void SetType(uint8_t type);
     /**
      * Get type field
-     * \returns the type
+     * @returns the type
      */
     uint8_t GetType() const;
 
     /**
      * Get name field
-     * \returns the name
+     * @returns the name
      */
     std::string GetName() const;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -94,7 +94,7 @@
 {
 
 /**
- * \ingroup wimax
+ * @ingroup wimax
  * This class implements the Generic mac Header as described by IEEE Standard for
  * Local and metropolitan area networks Part 16: Air Interface for Fixed Broadband Wireless Access
  * Systems 6.3.2.1.1 Generic MAC header, page 36
@@ -107,93 +107,93 @@
 
     /**
      * Set EC field
-     * \param ec the EC
+     * @param ec the EC
      */
     void SetEc(uint8_t ec);
     /**
      * Set type field
-     * \param type the type
+     * @param type the type
      */
     void SetType(uint8_t type);
     /**
      * Set CI field
-     * \param ci the CI
+     * @param ci the CI
      */
     void SetCi(uint8_t ci);
     /**
      * Set EKS field
-     * \param eks the EKS
+     * @param eks the EKS
      */
     void SetEks(uint8_t eks);
     /**
      * Set length field
-     * \param len the length
+     * @param len the length
      */
     void SetLen(uint16_t len);
     /**
      * Set CID field
-     * \param cid the CID
+     * @param cid the CID
      */
     void SetCid(Cid cid);
     /**
      * Set HCS field
-     * \param hcs the HCS
+     * @param hcs the HCS
      */
     void SetHcs(uint8_t hcs);
     /**
      * Set HT field
-     * \param ht the HT
+     * @param ht the HT
      */
     void SetHt(uint8_t ht);
 
     /**
      * Get EC field
-     * \returns the EC
+     * @returns the EC
      */
     uint8_t GetEc() const;
     /**
      * Get type field
-     * \returns the type
+     * @returns the type
      */
     uint8_t GetType() const;
     /**
      * Get CI field
-     * \returns the CI
+     * @returns the CI
      */
     uint8_t GetCi() const;
     /**
      * Get EKS field
-     * \returns the EKS
+     * @returns the EKS
      */
     uint8_t GetEks() const;
     /**
      * Get length field
-     * \returns the length
+     * @returns the length
      */
     uint16_t GetLen() const;
     /**
      * Get CID field
-     * \returns the CID
+     * @returns the CID
      */
     Cid GetCid() const;
     /**
      * Get HCS field
-     * \returns the HCS
+     * @returns the HCS
      */
     uint8_t GetHcs() const;
     /**
      * Get HT field
-     * \returns the HT
+     * @returns the HT
      */
     uint8_t GetHt() const;
     /**
      * Get name field
-     * \returns the name
+     * @returns the name
      */
     std::string GetName() const;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -203,7 +203,7 @@
     uint32_t Deserialize(Buffer::Iterator start) override;
     /**
      * Check HCS
-     * \returns true if HCS is validated
+     * @returns true if HCS is validated
      */
     bool check_hcs() const;
 
@@ -240,7 +240,7 @@
 namespace ns3
 {
 /**
- * \ingroup wimax
+ * @ingroup wimax
  * This class implements the bandwidth-request mac Header as described by IEEE Standard for
  * Local and metropolitan area networks Part 16: Air Interface for Fixed Broadband Wireless Access
  * Systems 6.3.2.1.2 Bandwidth request header, page 38
@@ -260,74 +260,74 @@
 
     /**
      * Set HT field
-     * \param ht the HT
+     * @param ht the HT
      */
     void SetHt(uint8_t ht);
     /**
      * Set EC field
-     * \param ec the EC
+     * @param ec the EC
      */
     void SetEc(uint8_t ec);
     /**
      * Set type field
-     * \param type the type
+     * @param type the type
      */
     void SetType(uint8_t type);
     /**
      * Set BR field
-     * \param br the BR
+     * @param br the BR
      */
     void SetBr(uint32_t br);
     /**
      * Set CID field
-     * \param cid the CID
+     * @param cid the CID
      */
     void SetCid(Cid cid);
     /**
      * Set HCS field
-     * \param hcs the HCS
+     * @param hcs the HCS
      */
     void SetHcs(uint8_t hcs);
 
     /**
      * Get HT field
-     * \returns the HT
+     * @returns the HT
      */
     uint8_t GetHt() const;
     /**
      * Get EC field
-     * \returns the EC
+     * @returns the EC
      */
     uint8_t GetEc() const;
     /**
      * Get type field
-     * \returns the type
+     * @returns the type
      */
     uint8_t GetType() const;
     /**
      * Get BR field
-     * \returns the BR
+     * @returns the BR
      */
     uint32_t GetBr() const;
     /**
      * Get CID field
-     * \returns the CID
+     * @returns the CID
      */
     Cid GetCid() const;
     /**
      * Get HCS field
-     * \returns the HCS
+     * @returns the HCS
      */
     uint8_t GetHcs() const;
 
     /**
      * Get name field
-     * \returns the name
+     * @returns the name
      */
     std::string GetName() const;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -337,7 +337,7 @@
     uint32_t Deserialize(Buffer::Iterator start) override;
     /**
      * Check HCS
-     * \returns true if HCS is validated
+     * @returns true if HCS is validated
      */
     bool check_hcs() const;
 
@@ -369,7 +369,7 @@
 {
 
 /**
- * \ingroup wimax
+ * @ingroup wimax
  * This class implements the grant management sub-header as described by IEEE Standard for
  * Local and metropolitan area networks Part 16: Air Interface for Fixed Broadband Wireless Access
  * Systems 6.3.2.2.2 Grant Management subheader, page 40
@@ -382,44 +382,44 @@
 
     /**
      * Set SI field
-     * \param si the SI
+     * @param si the SI
      */
     void SetSi(uint8_t si);
     /**
      * Set PM field
-     * \param pm the PM
+     * @param pm the PM
      */
     void SetPm(uint8_t pm);
     /**
      * Set PRR field
-     * \param pbr the PBR
+     * @param pbr the PBR
      */
     void SetPbr(uint16_t pbr);
 
     /**
      * Get SI field
-     * \returns the SI
+     * @returns the SI
      */
     uint8_t GetSi() const;
     /**
      * Get PM field
-     * \returns the PM
+     * @returns the PM
      */
     uint8_t GetPm() const;
     /**
      * Get PBR field
-     * \returns the PBR
+     * @returns the PBR
      */
     uint16_t GetPbr() const;
 
     /**
      * Get name field
-     * \returns the name
+     * @returns the name
      */
     std::string GetName() const;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -452,7 +452,7 @@
 namespace ns3
 {
 /**
- * \ingroup wimax
+ * @ingroup wimax
  * This class implements the fragmentation sub-header as described by IEEE Standard for
  * Local and metropolitan area networks Part 16: Air Interface for Fixed Broadband Wireless Access
  * Systems 6.3.2.2.1 Fragmentation subheader, page 39
@@ -465,34 +465,34 @@
 
     /**
      * Set FC field
-     * \param fc the FC
+     * @param fc the FC
      */
     void SetFc(uint8_t fc);
     /**
      * Set FSN field
-     * \param fsn the FSN
+     * @param fsn the FSN
      */
     void SetFsn(uint8_t fsn);
 
     /**
      * Get FC field
-     * \returns the FC
+     * @returns the FC
      */
     uint8_t GetFc() const;
     /**
      * Get FSN field
-     * \returns the FSN
+     * @returns the FSN
      */
     uint8_t GetFsn() const;
 
     /**
      * Get name field
-     * \returns the name
+     * @returns the name
      */
     std::string GetName() const;
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/wimax-mac-queue.cc ns-3.44/src/wimax/model/wimax-mac-queue.cc
--- ns-3.43/src/wimax/model/wimax-mac-queue.cc	2024-10-09 16:41:10.148656800 -0700
+++ ns-3.44/src/wimax/model/wimax-mac-queue.cc	2025-03-09 16:55:49.819372700 -0700
@@ -27,7 +27,7 @@
     : m_packet(Create<Packet>()),
       m_hdrType(MacHeaderType()),
       m_hdr(GenericMacHeader()),
-      m_timeStamp(Seconds(0)),
+      m_timeStamp(),
       m_fragmentation(false),
       m_fragmentNumber(0),
       m_fragmentOffset(0)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/wimax-mac-queue.h ns-3.44/src/wimax/model/wimax-mac-queue.h
--- ns-3.43/src/wimax/model/wimax-mac-queue.h	2024-10-09 16:41:10.148656800 -0700
+++ ns-3.44/src/wimax/model/wimax-mac-queue.h	2025-03-09 16:55:49.819372700 -0700
@@ -23,159 +23,159 @@
 {
 
 /**
- * \ingroup wimax
+ * @ingroup wimax
  * Class implementing the device packet queue
  */
 class WimaxMacQueue : public Object
 {
   public:
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     WimaxMacQueue();
     /**
      * Constructor
      *
-     * \param maxSize maximum size of queue
+     * @param maxSize maximum size of queue
      */
     WimaxMacQueue(uint32_t maxSize);
     ~WimaxMacQueue() override;
     /**
-     * \brief set the maximum queue size
-     * \param maxSize the max queue size
+     * @brief set the maximum queue size
+     * @param maxSize the max queue size
      */
     void SetMaxSize(uint32_t maxSize);
     /**
-     * \return the maximum queue size
+     * @return the maximum queue size
      */
     uint32_t GetMaxSize() const;
     /**
-     * \brief Enqueue a packet
-     * \param packet the packet to enqueue
-     * \param hdrType the mac header type of the packet
-     * \param hdr the header of the packet
-     * \return true if successful
+     * @brief Enqueue a packet
+     * @param packet the packet to enqueue
+     * @param hdrType the mac header type of the packet
+     * @param hdr the header of the packet
+     * @return true if successful
      */
     bool Enqueue(Ptr<Packet> packet, const MacHeaderType& hdrType, const GenericMacHeader& hdr);
     /**
-     * \brief Dequeue a packet of type packetType from the queue
-     * \param packetType the type of the packet
-     * \return the first packet in the queue
+     * @brief Dequeue a packet of type packetType from the queue
+     * @param packetType the type of the packet
+     * @return the first packet in the queue
      */
     Ptr<Packet> Dequeue(MacHeaderType::HeaderType packetType);
     /**
-     * \brief Dequeue a fragment of size availableByte from the queue
-     * \param packetType the type of the packet
-     * \param availableByte the size of the fragment
-     * \return the first packet in the queue if its size is lower than availableByte, the first
+     * @brief Dequeue a fragment of size availableByte from the queue
+     * @param packetType the type of the packet
+     * @param availableByte the size of the fragment
+     * @return the first packet in the queue if its size is lower than availableByte, the first
      * availableByte of the first packet otherwise
      */
     Ptr<Packet> Dequeue(MacHeaderType::HeaderType packetType, uint32_t availableByte);
 
     /**
-     * \brief Exclusively for BS.
+     * @brief Exclusively for BS.
      *  Two versions of Peek function (with Generic MAC Header as parameter) only
      *  for BS, as BS's scheduler needs to know the CID in Generic MAC Header.
-     * \param hdr the header of the packet
-     * \return the first packet in the queue
+     * @param hdr the header of the packet
+     * @return the first packet in the queue
      */
     Ptr<Packet> Peek(GenericMacHeader& hdr) const;
     /**
-     * \brief Exclusively for BS.
+     * @brief Exclusively for BS.
      *  Two versions of Peek function (with Generic MAC Header as parameter) only
      *  for BS, as BS's scheduler needs to know the CID in Generic MAC Header.
-     * \param hdr the header of the packet
-     * \param timeStamp the timestamp of the packet
-     * \return the first packet in the queue
+     * @param hdr the header of the packet
+     * @param timeStamp the timestamp of the packet
+     * @return the first packet in the queue
      */
     Ptr<Packet> Peek(GenericMacHeader& hdr, Time& timeStamp) const;
 
     /**
-     * \brief Two versions for SS without Generic MAC Header parameter, as SS's
+     * @brief Two versions for SS without Generic MAC Header parameter, as SS's
      *  scheduler does not require to know the CID in Generic MAC Header.
-     * \param packetType the type of the packet
-     * \return the first packet in the queue
+     * @param packetType the type of the packet
+     * @return the first packet in the queue
      */
     Ptr<Packet> Peek(MacHeaderType::HeaderType packetType) const;
     /**
-     * \brief Two versions for SS without Generic MAC Header parameter, as SS's
+     * @brief Two versions for SS without Generic MAC Header parameter, as SS's
      *  scheduler does not require to know the CID in Generic MAC Header.
-     * \param packetType the type of the packet
-     * \param timeStamp the timestamp of the packet
-     * \return the first packet in the queue
+     * @param packetType the type of the packet
+     * @param timeStamp the timestamp of the packet
+     * @return the first packet in the queue
      */
     Ptr<Packet> Peek(MacHeaderType::HeaderType packetType, Time& timeStamp) const;
 
     /**
      * Check if queue is empty
-     * \returns true if empty
+     * @returns true if empty
      */
     bool IsEmpty() const;
 
     /**
      * Exclusively for SS.
-     * \return true if queue is empty of type packetType
-     * \param packetType packet type to check
+     * @return true if queue is empty of type packetType
+     * @param packetType packet type to check
      */
     bool IsEmpty(MacHeaderType::HeaderType packetType) const;
 
     /**
      * Get size of queue
-     * \returns the size
+     * @returns the size
      */
     uint32_t GetSize() const;
     /**
      * Get number of bytes in queue
-     * \returns the number of bytes
+     * @returns the number of bytes
      */
     uint32_t GetNBytes() const;
 
     /**
      * Check for fragmentation of the first packet of the specified type
-     * \param packetType the packet type
-     * \returns true if fragmented
+     * @param packetType the packet type
+     * @returns true if fragmented
      */
     bool CheckForFragmentation(MacHeaderType::HeaderType packetType);
     /**
      * Get first packet header size of the specified type
-     * \param packetType the packet type
-     * \returns the first packet header size
+     * @param packetType the packet type
+     * @returns the first packet header size
      */
     uint32_t GetFirstPacketHdrSize(MacHeaderType::HeaderType packetType);
     /**
      * Get first packet payload size of the specified type
-     * \param packetType the packet type
-     * \returns the first packet payload size
+     * @param packetType the packet type
+     * @returns the first packet payload size
      */
     uint32_t GetFirstPacketPayloadSize(MacHeaderType::HeaderType packetType);
     /**
      * Get required number of bytes to hold first packet of packetType
-     * \param packetType the packet type
-     * \returns the sum of the first packet header and payload (of specified type)
+     * @param packetType the packet type
+     * @returns the sum of the first packet header and payload (of specified type)
      */
     uint32_t GetFirstPacketRequiredByte(MacHeaderType::HeaderType packetType);
     /**
      * Get queue length considering also the MAC overhead
-     * \return queue length
+     * @return queue length
      */
     uint32_t GetQueueLengthWithMACOverhead();
     /// Set fragmentation function
     /**
      * Set fragmentation state for first packet of type packetType
-     * \param packetType packetType to check
+     * @param packetType packetType to check
      */
     void SetFragmentation(MacHeaderType::HeaderType packetType);
     /**
      * Set fragment number for first packet of type packetType
-     * \param packetType packetType to check
+     * @param packetType packetType to check
      */
     void SetFragmentNumber(MacHeaderType::HeaderType packetType);
     /**
      * Set fragment offset for first packet of type packetType
-     * \param packetType packetType to check
-     * \param offset offset value to set
+     * @param packetType packetType to check
+     * @param offset offset value to set
      */
     void SetFragmentOffset(MacHeaderType::HeaderType packetType, uint32_t offset);
 
@@ -186,10 +186,10 @@
         /**
          * Constructor
          *
-         * \param packet the packet
-         * \param hdrType MAC header type
-         * \param hdr MAC header
-         * \param timeStamp time stamp
+         * @param packet the packet
+         * @param hdrType MAC header type
+         * @param hdr MAC header
+         * @param timeStamp time stamp
          */
         QueueElement(Ptr<Packet> packet,
                      const MacHeaderType& hdrType,
@@ -197,7 +197,7 @@
                      Time timeStamp);
         /**
          * Get size function
-         * \returns the size
+         * @returns the size
          */
         uint32_t GetSize() const;
         Ptr<Packet> m_packet;    ///< packet
@@ -221,7 +221,7 @@
         void SetFragmentNumber();
         /**
          * Set fragment offset
-         * \param offset the offset
+         * @param offset the offset
          */
         void SetFragmentOffset(uint32_t offset);
     };
@@ -233,13 +233,13 @@
      functions are for this purpose exclusively. The Front function returns the first packet of a
      specific packet type from the queue (which may not necessarily be at the front of the queue),
      and the Pop function pops that elements.
-     * \param packetType the type of the packet
-     * \returns the first packet in the queue of the specified type
+     * @param packetType the type of the packet
+     * @returns the first packet in the queue of the specified type
      */
     WimaxMacQueue::QueueElement Front(MacHeaderType::HeaderType packetType) const;
     /**
      * Pop function
-     * \param packetType the packet type
+     * @param packetType the packet type
      */
     void Pop(MacHeaderType::HeaderType packetType);
 
@@ -257,7 +257,7 @@
   public:
     /**
      * Get packet queue function
-     * \returns the packet queue
+     * @returns the packet queue
      */
     const WimaxMacQueue::PacketQueue& GetPacketQueue() const;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/wimax-mac-to-mac-header.h ns-3.44/src/wimax/model/wimax-mac-to-mac-header.h
--- ns-3.43/src/wimax/model/wimax-mac-to-mac-header.h	2024-10-09 16:41:10.148656800 -0700
+++ ns-3.44/src/wimax/model/wimax-mac-to-mac-header.h	2025-03-09 16:55:49.819372700 -0700
@@ -17,8 +17,8 @@
 {
 
 /**
- * \ingroup wimax
- * \brief this class implements the mac to mac header needed to dump a wimax pcap file
+ * @ingroup wimax
+ * @brief this class implements the mac to mac header needed to dump a wimax pcap file
  * The header format was reverse-engineered by looking  at existing live pcap traces which
  * could be opened with wireshark  i.e., we have no idea where this is coming from.
  */
@@ -30,13 +30,13 @@
     /**
      * Constructor
      *
-     * \param len length
+     * @param len length
      */
     WimaxMacToMacHeader(uint32_t len);
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -45,7 +45,7 @@
     uint32_t Deserialize(Buffer::Iterator start) override;
     /**
      * Get size of length field
-     * \returns the size of length field
+     * @returns the size of length field
      */
     uint8_t GetSizeOfLen() const;
     void Print(std::ostream& os) const override;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/wimax-net-device.h ns-3.44/src/wimax/model/wimax-net-device.h
--- ns-3.43/src/wimax/model/wimax-net-device.h	2024-10-09 16:41:10.148656800 -0700
+++ ns-3.44/src/wimax/model/wimax-net-device.h	2025-03-09 16:55:49.819372700 -0700
@@ -43,14 +43,14 @@
 class UplinkScheduler;
 
 /**
- * \defgroup wimax WiMAX Models
+ * @defgroup wimax WiMAX Models
  * This section documents the API of the ns-3 wimax module. For a generic functional description,
  * please refer to the ns-3 manual.
  */
 
 /**
- * \brief Hold together all WiMAX-related objects in a NetDevice.
- * \ingroup wimax
+ * @brief Hold together all WiMAX-related objects in a NetDevice.
+ * @ingroup wimax
  *
  * This class holds together ns3::WimaxPhy, ns3::WimaxConnection,
  * ns3::ConnectionManager, ns3::BurstProfileManager, and
@@ -76,160 +76,160 @@
     };
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     WimaxNetDevice();
     ~WimaxNetDevice() override;
     /**
      * Set transmission/receive transition gap
-     * \param ttg transmit/receive transition gap
+     * @param ttg transmit/receive transition gap
      */
     void SetTtg(uint16_t ttg);
     /**
      * Get transmission/receive transition gap
-     * \returns transmit/receive transition gap
+     * @returns transmit/receive transition gap
      */
     uint16_t GetTtg() const;
     /**
      * Set receive/transmit transition gap
-     * \param rtg receive/transmit transition gap
+     * @param rtg receive/transmit transition gap
      */
     void SetRtg(uint16_t rtg);
     /**
      * Get receive/transmit transition gap
-     * \returns receive/transmit transition gap
+     * @returns receive/transmit transition gap
      */
     uint16_t GetRtg() const;
     /**
      * Attach device to channel
-     * \param channel channel to attach
+     * @param channel channel to attach
      */
     void Attach(Ptr<WimaxChannel> channel);
     /**
      * Set the physical layer object
-     * \param phy the phy layer object to use
+     * @param phy the phy layer object to use
      */
     void SetPhy(Ptr<WimaxPhy> phy);
     /**
      * Get the physical layer object
-     * \returns a pointer to the physical layer object
+     * @returns a pointer to the physical layer object
      */
     Ptr<WimaxPhy> GetPhy() const;
 
     /**
      * Set the channel object
-     * \param wimaxChannel the channel to be used
+     * @param wimaxChannel the channel to be used
      */
     void SetChannel(Ptr<WimaxChannel> wimaxChannel);
 
     /**
      * Get the channel object by index
-     * \param index the channel index
-     * \returns the channel being used.
+     * @param index the channel index
+     * @returns the channel being used.
      */
     uint64_t GetChannel(uint8_t index) const;
 
     /**
      * Set the number of frames
-     * \param nrFrames the number of frames
+     * @param nrFrames the number of frames
      */
     void SetNrFrames(uint32_t nrFrames);
     /**
      * Get the number of frames
-     * \returns the number of frames.
+     * @returns the number of frames.
      */
     uint32_t GetNrFrames() const;
     /**
      * Set the MAC address
-     * \param address the mac address of the net device
+     * @param address the mac address of the net device
      */
     void SetMacAddress(Mac48Address address);
     /**
      * Get the MAC address
-     * \returns the mac address of the net device
+     * @returns the mac address of the net device
      */
     Mac48Address GetMacAddress() const;
     /**
      * Set the device state
-     * \param state the state
+     * @param state the state
      */
     void SetState(uint8_t state);
     /**
      * Get the device state
-     * \returns the state
+     * @returns the state
      */
     uint8_t GetState() const;
     /**
      * Get the initial ranging connection
-     * \returns the initial ranging connection
+     * @returns the initial ranging connection
      */
     Ptr<WimaxConnection> GetInitialRangingConnection() const;
     /**
      * Get the broadcast connection
-     * \returns the broadcast connection
+     * @returns the broadcast connection
      */
     Ptr<WimaxConnection> GetBroadcastConnection() const;
 
     /**
      * Set the current DCD
-     * \param dcd the DCD
+     * @param dcd the DCD
      */
     void SetCurrentDcd(Dcd dcd);
     /**
      * Get the current DCD
-     * \returns the DCD
+     * @returns the DCD
      */
     Dcd GetCurrentDcd() const;
     /**
      * Set the current UCD
-     * \param ucd the UCD
+     * @param ucd the UCD
      */
     void SetCurrentUcd(Ucd ucd);
     /**
      * Get the current UCD
-     * \returns the UCD
+     * @returns the UCD
      */
     Ucd GetCurrentUcd() const;
     /**
      * Get the connection manager of the device
-     * \returns the connection manager of the device
+     * @returns the connection manager of the device
      */
     Ptr<ConnectionManager> GetConnectionManager() const;
 
     /**
      * Set the connection manager of the device
-     * \param  connectionManager the connection manager to be installed in the device
+     * @param  connectionManager the connection manager to be installed in the device
      */
     virtual void SetConnectionManager(Ptr<ConnectionManager> connectionManager);
 
     /**
      * Get the burst profile manager
-     * \returns the burst profile manager currently installed in the device
+     * @returns the burst profile manager currently installed in the device
      */
     Ptr<BurstProfileManager> GetBurstProfileManager() const;
 
     /**
      * Set the burst profile manager
-     * \param burstProfileManager the burst profile manager to be installed on the device
+     * @param burstProfileManager the burst profile manager to be installed on the device
      */
     void SetBurstProfileManager(Ptr<BurstProfileManager> burstProfileManager);
 
     /**
      * Get the bandwidth manager on the device
-     * \returns the bandwidth manager installed on the device
+     * @returns the bandwidth manager installed on the device
      */
     Ptr<BandwidthManager> GetBandwidthManager() const;
 
     /**
      * Set the bandwidth manager on the device
-     * \param bandwidthManager the bandwidth manager to be installed on the device
+     * @param bandwidthManager the bandwidth manager to be installed on the device
      */
     void SetBandwidthManager(Ptr<BandwidthManager> bandwidthManager);
 
     /**
-     * \brief Creates the initial ranging and broadcast connections
+     * @brief Creates the initial ranging and broadcast connections
      */
     void CreateDefaultConnections();
 
@@ -243,26 +243,26 @@
 
     /**
      * Forward a packet to the next layer above the device
-     * \param packet the packet
-     * \param source the source MAC address
-     * \param dest the destination MAC address
+     * @param packet the packet
+     * @param source the source MAC address
+     * @param dest the destination MAC address
      */
     void ForwardUp(Ptr<Packet> packet, const Mac48Address& source, const Mac48Address& dest);
 
     /**
      * Enqueue a packet
-     * \param packet the packet
-     * \param hdrType the header type
-     * \param connection the wimax connection
-     * \returns true if successful
+     * @param packet the packet
+     * @param hdrType the header type
+     * @param connection the wimax connection
+     * @returns true if successful
      */
     virtual bool Enqueue(Ptr<Packet> packet,
                          const MacHeaderType& hdrType,
                          Ptr<WimaxConnection> connection) = 0;
     /**
      * Forward a packet down the stack
-     * \param burst the packet burst
-     * \param modulationType the modulation type
+     * @param burst the packet burst
+     * @param modulationType the modulation type
      */
     void ForwardDown(Ptr<PacketBurst> burst, WimaxPhy::ModulationType modulationType);
 
@@ -274,136 +274,136 @@
 
     /**
      * Set device name
-     * \param name the device name
+     * @param name the device name
      */
     virtual void SetName(const std::string name);
     /**
      * Get device name
-     * \returns the device name
+     * @returns the device name
      */
     virtual std::string GetName() const;
     /**
      * Set interface index
-     * \param index the index
+     * @param index the index
      */
     void SetIfIndex(const uint32_t index) override;
     /**
      * Get interface index
-     * \returns the interface index
+     * @returns the interface index
      */
     uint32_t GetIfIndex() const override;
     /**
      * Get the channel (this method is redundant with GetChannel())
-     * \returns the channel used by the phy layer
+     * @returns the channel used by the phy layer
      */
     virtual Ptr<Channel> GetPhyChannel() const;
     /**
      * Get the channel
-     * \returns the channel
+     * @returns the channel
      */
     Ptr<Channel> GetChannel() const override;
     /**
      * Set address of the device
-     * \param address the address
+     * @param address the address
      */
     void SetAddress(Address address) override;
     /**
      * Get address of the device
-     * \returns the address
+     * @returns the address
      */
     Address GetAddress() const override;
     /**
      * Set MTU value for the device
-     * \param mtu the MTU
-     * \returns true if successful
+     * @param mtu the MTU
+     * @returns true if successful
      */
     bool SetMtu(const uint16_t mtu) override;
     /**
      * Get MTU of the device
-     * \returns the MTU
+     * @returns the MTU
      */
     uint16_t GetMtu() const override;
     /**
      * Check if link is up
-     * \return true if the link is up
+     * @return true if the link is up
      */
     bool IsLinkUp() const override;
     /**
      * Set link change callback function
-     * \param callback the callback function
+     * @param callback the callback function
      */
     virtual void SetLinkChangeCallback(Callback<void> callback);
     /**
      * Check if broadcast enabled
-     * \returns true if broadcast
+     * @returns true if broadcast
      */
     bool IsBroadcast() const override;
     /**
      * Get broadcast address
-     * \returns the address
+     * @returns the address
      */
     Address GetBroadcast() const override;
     /**
      * Check if multicast enabled
-     * \returns true if multicast
+     * @returns true if multicast
      */
     bool IsMulticast() const override;
     /**
      * Get multicast address
-     * \returns the multicast address
+     * @returns the multicast address
      */
     virtual Address GetMulticast() const;
     /**
      * Make multicast address
-     * \param multicastGroup the IPv4 address
-     * \returns the multicast address
+     * @param multicastGroup the IPv4 address
+     * @returns the multicast address
      */
     virtual Address MakeMulticastAddress(Ipv4Address multicastGroup) const;
     /**
      * Check if device is a point-to-point device
-     * \returns true if point to point
+     * @returns true if point to point
      */
     bool IsPointToPoint() const override;
     /**
      * Send function
-     * \param packet the packet
-     * \param dest the destination address
-     * \param protocolNumber the protocol number
-     * \returns true if successful
+     * @param packet the packet
+     * @param dest the destination address
+     * @param protocolNumber the protocol number
+     * @returns true if successful
      */
     bool Send(Ptr<Packet> packet, const Address& dest, uint16_t protocolNumber) override;
     /**
      * Set node pointer
-     * \param node the node pointer
+     * @param node the node pointer
      */
     void SetNode(Ptr<Node> node) override;
     /**
      * Get node pointer
-     * \returns the node pointer
+     * @returns the node pointer
      */
     Ptr<Node> GetNode() const override;
     /**
      * Check if device needs ARP
-     * \returns true if ARP required
+     * @returns true if ARP required
      */
     bool NeedsArp() const override;
     /**
      * Set receive callback function
-     * \param cb the receive callback function
+     * @param cb the receive callback function
      */
     void SetReceiveCallback(NetDevice::ReceiveCallback cb) override;
     /**
      * Add link change callback function
-     * \param callback the link change callback function
+     * @param callback the link change callback function
      */
     void AddLinkChangeCallback(Callback<void> callback) override;
     /**
      * Send a packet
-     * \param packet the packet
-     * \param source the source address
-     * \param dest the destination address
-     * \param protocolNumber the protocol number
-     * \returns true if successful
+     * @param packet the packet
+     * @param source the source address
+     * @param dest the destination address
+     * @param protocolNumber the protocol number
+     * @returns true if successful
      */
     bool SendFrom(Ptr<Packet> packet,
                   const Address& source,
@@ -411,26 +411,26 @@
                   uint16_t protocolNumber) override;
     /**
      * Set promiscuous receive callback function
-     * \param cb the promiscuous mode callback
+     * @param cb the promiscuous mode callback
      */
     void SetPromiscReceiveCallback(PromiscReceiveCallback cb) override;
     /**
      * Get promiscuous receive callback function
-     * \returns the promiscuous mode callback
+     * @returns the promiscuous mode callback
      */
     NetDevice::PromiscReceiveCallback GetPromiscReceiveCallback();
     /**
      * Check if device supports the SendFrom method
-     * \returns true if SendFrom is supported
+     * @returns true if SendFrom is supported
      */
     bool SupportsSendFrom() const override;
 
     /**
      * TracedCallback signature for packet and Mac48Address.
      *
-     * \param [in] packet The packet.
-     * \param [in] mac The Mac48Address.
-     * \deprecated The `const Mac48Address &` argument is deprecated
+     * @param [in] packet The packet.
+     * @param [in] mac The Mac48Address.
+     * @deprecated The `const Mac48Address &` argument is deprecated
      * and will be changed to \c Mac48Address in a future release.
      * The TracedCallback signature will then match \c Packet::Mac48Address
      * and this typedef can be removed.
@@ -438,20 +438,20 @@
     // NS_DEPRECATED() - tag for future removal
     typedef void (*TxRxTracedCallback)(Ptr<const Packet> packet, const Mac48Address& mac);
     /**
-     * \deprecated The `const Mac48Address &` argument is deprecated
+     * @deprecated The `const Mac48Address &` argument is deprecated
      * and will be changed to \c Mac48Address in a future release.
      * The TracedCallback signature will then match \c Packet::Mac48Address
      * and this typedef can be removed.
-     * \todo This member variable should be private.
+     * @todo This member variable should be private.
      */
     // NS_DEPRECATED() - tag for future removal
     TracedCallback<Ptr<const Packet>, const Mac48Address&> m_traceRx;
     /**
-     * \deprecated The `const Mac48Address &` argument is deprecated
+     * @deprecated The `const Mac48Address &` argument is deprecated
      * and will be changed to \c Mac48Address in a future release.
      * The TracedCallback signature will then match \c Packet::Mac48Address
      * and this typedef can be removed.
-     * \todo This member variable should be private.
+     * @todo This member variable should be private.
      */
     // NS_DEPRECATED() - tag for future removal
     TracedCallback<Ptr<const Packet>, const Mac48Address&> m_traceTx;
@@ -463,12 +463,12 @@
 
     /**
      * Check if device is promiscuous
-     * \returns true if promiscuous
+     * @returns true if promiscuous
      */
     bool IsPromisc();
     /**
      * Notify promiscuous trace of a packet arrival
-     * \param p the packet
+     * @param p the packet
      */
     void NotifyPromiscTrace(Ptr<Packet> p);
 
@@ -477,7 +477,7 @@
     WimaxNetDevice(const WimaxNetDevice&);
     /**
      * assignment operator (disabled)
-     * \returns the wimax net device
+     * @returns the wimax net device
      */
     WimaxNetDevice& operator=(const WimaxNetDevice&);
 
@@ -488,11 +488,11 @@
 
     /**
      * Send a packet
-     * \param packet the packet
-     * \param source the source MAC address
-     * \param dest the destination MAC address
-     * \param protocolNumber the protocol number
-     * \returns true if successful
+     * @param packet the packet
+     * @param source the source MAC address
+     * @param dest the destination MAC address
+     * @param protocolNumber the protocol number
+     * @returns true if successful
      */
     virtual bool DoSend(Ptr<Packet> packet,
                         const Mac48Address& source,
@@ -500,17 +500,17 @@
                         uint16_t protocolNumber) = 0;
     /**
      * Receive a packet
-     * \param packet the packet received
+     * @param packet the packet received
      */
     virtual void DoReceive(Ptr<Packet> packet) = 0;
     /**
      * Get the channel
-     * \returns the wimax channel
+     * @returns the wimax channel
      */
     virtual Ptr<WimaxChannel> DoGetChannel() const;
     /**
      * Receive a packet burst
-     * \param burst the packet burst
+     * @param burst the packet burst
      */
     void Receive(Ptr<const PacketBurst> burst);
     /// Initialize channels function
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/wimax-phy.cc ns-3.44/src/wimax/model/wimax-phy.cc
--- ns-3.43/src/wimax/model/wimax-phy.cc	2024-10-09 16:41:10.148656800 -0700
+++ ns-3.44/src/wimax/model/wimax-phy.cc	2025-03-09 16:55:49.819372700 -0700
@@ -73,8 +73,8 @@
       m_frameDuration(Seconds(0.01)),
       m_frequency(5000000),
       m_channelBandwidth(10000000),
-      m_psDuration(Seconds(0)),
-      m_symbolDuration(Seconds(0)),
+      m_psDuration(),
+      m_symbolDuration(),
       m_psPerSymbol(0),
       m_psPerFrame(0),
       m_symbolsPerFrame(0)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/wimax-phy.h ns-3.44/src/wimax/model/wimax-phy.h
--- ns-3.43/src/wimax/model/wimax-phy.h	2024-10-09 16:41:10.148656800 -0700
+++ ns-3.44/src/wimax/model/wimax-phy.h	2025-03-09 16:55:49.819372700 -0700
@@ -31,7 +31,7 @@
 class Packet;
 
 /**
- * \ingroup wimax
+ * @ingroup wimax
  *
  * WiMAX PHY entity
  */
@@ -67,283 +67,283 @@
     };
 
     /**
-     * \brief Get the type ID.
-     * \return the object TypeId
+     * @brief Get the type ID.
+     * @return the object TypeId
      */
     static TypeId GetTypeId();
     WimaxPhy();
     ~WimaxPhy() override;
     /**
      * Attach the physical layer to a channel.
-     * \param channel the channel to which the physical layer will be attached
+     * @param channel the channel to which the physical layer will be attached
      */
     void Attach(Ptr<WimaxChannel> channel);
     /**
-     * \return the channel to which this physical layer is attached
+     * @return the channel to which this physical layer is attached
      */
     Ptr<WimaxChannel> GetChannel() const;
     /**
-     * \brief Set the device in which this physical layer is installed
-     * \param device the device in which this physical layer is installed
+     * @brief Set the device in which this physical layer is installed
+     * @param device the device in which this physical layer is installed
      */
     void SetDevice(Ptr<WimaxNetDevice> device);
     /**
-     * \return the the device in which this physical layer is installed
+     * @return the the device in which this physical layer is installed
      */
     Ptr<NetDevice> GetDevice() const;
     /**
-     * \brief set the callback function to call when a burst is received
-     * \param callback the callback function to call when a burst is received
+     * @brief set the callback function to call when a burst is received
+     * @param callback the callback function to call when a burst is received
      */
     void SetReceiveCallback(Callback<void, Ptr<const PacketBurst>> callback);
     /**
-     * \return the receive callback
+     * @return the receive callback
      */
     Callback<void, Ptr<const PacketBurst>> GetReceiveCallback() const;
     /**
-     * \brief send a packet on the channel
-     * \param params the parameters used to send the packet
+     * @brief send a packet on the channel
+     * @param params the parameters used to send the packet
      */
     virtual void Send(SendParams* params) = 0;
     /**
-     * \brief Get the type of the physical layer
-     * \returns the phy type
+     * @brief Get the type of the physical layer
+     * @returns the phy type
      */
     virtual PhyType GetPhyType() const = 0;
     /**
-     * \brief configure the physical layer in duplex mode
-     * \param rxFrequency the reception frequency
-     * \param txFrequency the transmission frequency
+     * @brief configure the physical layer in duplex mode
+     * @param rxFrequency the reception frequency
+     * @param txFrequency the transmission frequency
      */
     void SetDuplex(uint64_t rxFrequency, uint64_t txFrequency);
     /**
-     * \brief configure the physical layer in simplex mode
-     * \param frequency  the frequency to be used for reception and transmission process
+     * @brief configure the physical layer in simplex mode
+     * @param frequency  the frequency to be used for reception and transmission process
      */
     void SetSimplex(uint64_t frequency);
     /**
      * Get the reception frequency
-     * \return the reception frequency
+     * @return the reception frequency
      */
     uint64_t GetRxFrequency() const;
     /**
      * Get the transmission frequency
-     * \return the transmission frequency
+     * @return the transmission frequency
      */
     uint64_t GetTxFrequency() const;
     /**
      * Get the scanning frequency
-     * \return the scanning frequency
+     * @return the scanning frequency
      */
     uint64_t GetScanningFrequency() const;
     /**
      * Set the number of carriers in the physical frame
-     * \brief Set the number of carriers in the physical frame
-     * \param  nrCarriers the number of carriers in the frame
+     * @brief Set the number of carriers in the physical frame
+     * @param  nrCarriers the number of carriers in the frame
      */
     void SetNrCarriers(uint8_t nrCarriers);
     /**
      * Get the number of carriers in the physical frame
-     * \return the number of carriers in the physical frame
+     * @return the number of carriers in the physical frame
      */
     uint8_t GetNrCarriers() const;
     /**
-     * \brief Set the frame duration
-     * \param frameDuration the frame duration
+     * @brief Set the frame duration
+     * @param frameDuration the frame duration
      */
     void SetFrameDuration(Time frameDuration);
     /**
-     * \brief Get the frame duration
+     * @brief Get the frame duration
      * This method is redundant with GetFrameDuration ()
-     * \return the frame duration
+     * @return the frame duration
      */
     Time GetFrameDurationSec() const;
     /**
-     * \brief Get the frame duration
-     * \return the frame duration
+     * @brief Get the frame duration
+     * @return the frame duration
      */
     Time GetFrameDuration() const;
     /**
-     * \brief set the frequency on which the device should lock
-     * \param frequency the frequency to configure
+     * @brief set the frequency on which the device should lock
+     * @param frequency the frequency to configure
      */
     void SetFrequency(uint32_t frequency);
     /**
      * Get the frequency on which the device is locked
-     * \return the frequency on which the device is locked
+     * @return the frequency on which the device is locked
      */
     uint32_t GetFrequency() const;
     /**
-     * \brief Set the channel bandwidth
-     * \param channelBandwidth The channel bandwidth
+     * @brief Set the channel bandwidth
+     * @param channelBandwidth The channel bandwidth
      */
     void SetChannelBandwidth(uint32_t channelBandwidth);
     /**
      * Get the channel bandwidth
-     * \return the channel bandwidth
+     * @return the channel bandwidth
      */
     uint32_t GetChannelBandwidth() const;
     /**
      * Get the size of the FFT
-     * \return the size of the FFT
+     * @return the size of the FFT
      */
     uint16_t GetNfft() const;
     /**
      * Get the sampling factor
-     * \return the sampling factor
+     * @return the sampling factor
      */
     double GetSamplingFactor() const;
     /**
      * Get the sampling frequency
-     * \return the sampling frequency
+     * @return the sampling frequency
      */
     double GetSamplingFrequency() const;
     /**
-     * \brief set the physical slot duration
-     * \param psDuration the physical slot duration
+     * @brief set the physical slot duration
+     * @param psDuration the physical slot duration
      */
     void SetPsDuration(Time psDuration);
     /**
      * Get the physical slot duration
-     * \return the physical slot duration
+     * @return the physical slot duration
      */
     Time GetPsDuration() const;
     /**
-     * \brief set the OFDM symbol duration
-     * \param symbolDuration the symbol duration
+     * @brief set the OFDM symbol duration
+     * @param symbolDuration the symbol duration
      */
     void SetSymbolDuration(Time symbolDuration);
     /**
      * Get the OFDM symbol duration
-     * \return the symbol duration in second
+     * @return the symbol duration in second
      */
     Time GetSymbolDuration() const;
     /**
      * Get the guard interval factor (the ratio TG/Td)
-     * \return the guard interval factor
+     * @return the guard interval factor
      */
     double GetGValue() const;
     /**
-     * \brief set the number of physical slots per symbol
-     * \param psPerSymbol the number of physical slots per symbol
+     * @brief set the number of physical slots per symbol
+     * @param psPerSymbol the number of physical slots per symbol
      */
     void SetPsPerSymbol(uint16_t psPerSymbol);
     /**
      * Get the number of physical slots per symbol
-     * \return the number of physical slots per symbol
+     * @return the number of physical slots per symbol
      */
     uint16_t GetPsPerSymbol() const;
 
     /**
-     * \brief set the number of physical slots per frame
-     * \param psPerFrame the number of physical slots per frame
+     * @brief set the number of physical slots per frame
+     * @param psPerFrame the number of physical slots per frame
      */
     void SetPsPerFrame(uint16_t psPerFrame);
     /**
      * Get the number of physical slots per frame
-     * \return the number of physical slot per frame
+     * @return the number of physical slot per frame
      */
     uint16_t GetPsPerFrame() const;
     /**
-     * \brief set the number of symbols per frame
-     * \param symbolsPerFrame the number of symbols per frame
+     * @brief set the number of symbols per frame
+     * @param symbolsPerFrame the number of symbols per frame
      */
     void SetSymbolsPerFrame(uint32_t symbolsPerFrame);
     /**
      * Get the number of symbols per frame
-     * \return the number of symbols per frame
+     * @return the number of symbols per frame
      */
     uint32_t GetSymbolsPerFrame() const;
     /**
      * Check if configured in duplex mode
-     * \return true if the device is configured in duplex mode
+     * @return true if the device is configured in duplex mode
      */
     bool IsDuplex() const;
     /**
-     * \brief set the state of the device
-     * \param state the state to be set (PHY_STATE_IDLE, PHY_STATE_SCANNING, PHY_STATE_TX,
+     * @brief set the state of the device
+     * @param state the state to be set (PHY_STATE_IDLE, PHY_STATE_SCANNING, PHY_STATE_TX,
      * PHY_STATE_RX)
      */
     void SetState(PhyState state);
     /**
      * Get the state of the device
-     * \return the state of the device (PHY_STATE_IDLE, PHY_STATE_SCANNING, PHY_STATE_TX,
+     * @return the state of the device (PHY_STATE_IDLE, PHY_STATE_SCANNING, PHY_STATE_TX,
      * PHY_STATE_RX)
      */
     PhyState GetState() const;
     /**
-     * \brief scan a frequency for maximum timeout seconds and call the callback if the frequency
+     * @brief scan a frequency for maximum timeout seconds and call the callback if the frequency
      * can be used
-     * \param frequency the frequency to scan
-     * \param timeout the timeout before considering the channel as unusable
-     * \param callback the function to call if the channel could be used
+     * @param frequency the frequency to scan
+     * @param timeout the timeout before considering the channel as unusable
+     * @param callback the function to call if the channel could be used
      */
     void StartScanning(uint64_t frequency, Time timeout, Callback<void, bool, uint64_t> callback);
 
     /**
-     * \brief calls the scanning call back function
+     * @brief calls the scanning call back function
      */
     void SetScanningCallback() const;
     /**
-     * \brief Get channel search timeout event
-     * \return event ID
+     * @brief Get channel search timeout event
+     * @return event ID
      */
     EventId GetChnlSrchTimeoutEvent() const;
     /**
-     * \brief calculates the data rate of each modulation and save them for future use
+     * @brief calculates the data rate of each modulation and save them for future use
      */
     void SetDataRates();
     /**
      * Get the data rate corresponding to a modulation type
-     * \return the data rate
-     * \param modulationType the modulation that you want to get its data rate
+     * @return the data rate
+     * @param modulationType the modulation that you want to get its data rate
      */
     uint32_t GetDataRate(ModulationType modulationType) const;
     /**
      * Get transmission time needed to send bytes at a given modulation
-     * \return the time needed
-     * \param size the number of byte to transmit
-     * \param modulationType the modulation that will be used to transmit the bytes
+     * @return the time needed
+     * @param size the number of byte to transmit
+     * @param modulationType the modulation that will be used to transmit the bytes
      */
     Time GetTransmissionTime(uint32_t size, ModulationType modulationType) const;
     /**
      * Get the number of symbols needed to transmit size bytes using the modulation modulationType
-     * \return the number of symbols needed
-     * \param size the number of byte to transmit
-     * \param modulationType the modulation that will be used to transmit the bytes
+     * @return the number of symbols needed
+     * @param size the number of byte to transmit
+     * @param modulationType the modulation that will be used to transmit the bytes
      */
     uint64_t GetNrSymbols(uint32_t size, ModulationType modulationType) const;
     /**
      * Get the maximum number of bytes that could be carried by symbols symbols using the modulation
      * modulationType
-     * \param symbols the number of symbols to use
-     * \param modulationType the modulation that will be used
-     * \return the maximum number of bytes
+     * @param symbols the number of symbols to use
+     * @param modulationType the modulation that will be used
+     * @return the maximum number of bytes
      */
     uint64_t GetNrBytes(uint32_t symbols, ModulationType modulationType) const;
     /**
      * Get the transmit/receive transition gap
-     * \return the transmit/receive transition gap
+     * @return the transmit/receive transition gap
      */
     uint16_t GetTtg() const;
     /**
      * Get the receive/transmit transition gap
-     * \return the receive/transmit transition gap
+     * @return the receive/transmit transition gap
      */
     uint16_t GetRtg() const;
     /**
      * Get the frame duration code
-     * \return the frame duration code
+     * @return the frame duration code
      */
     uint8_t GetFrameDurationCode() const;
     /**
      * Get the frame duration corresponding to a given code
-     * \param frameDurationCode the frame duration code to use
-     * \return the frame duration
+     * @param frameDurationCode the frame duration code to use
+     * @return the frame duration
      */
     Time GetFrameDuration(uint8_t frameDurationCode) const;
     /**
-     * \brief computes the Physical parameters and store them
+     * @brief computes the Physical parameters and store them
      */
     void SetPhyParameters();
     void DoDispose() override;
@@ -353,17 +353,17 @@
      * used by this model.  Return the number of streams (possibly zero) that
      * have been assigned.
      *
-     * \param stream first stream index to use
-     * \return the number of stream indices assigned by this model
+     * @param stream first stream index to use
+     * @return the number of stream indices assigned by this model
      */
     virtual int64_t AssignStreams(int64_t stream) = 0;
 
   private:
     /**
      * Get modulation FEC parameters
-     * \param modulationType the modultion type
-     * \param bitsPerSymbol the number of bits per symbol page
-     * \param fecCode the FEC code
+     * @param modulationType the modultion type
+     * @param bitsPerSymbol the number of bits per symbol page
+     * @param fecCode the FEC code
      */
     void GetModulationFecParams(ModulationType modulationType,
                                 uint8_t& bitsPerSymbol,
@@ -372,58 +372,58 @@
     void EndScanning();
     /**
      * Get transmission time
-     * \param size the transmission size
-     * \param modulationType the modulation type
-     * \returns the transmission time
+     * @param size the transmission size
+     * @param modulationType the modulation type
+     * @returns the transmission time
      */
     virtual Time DoGetTransmissionTime(uint32_t size, ModulationType modulationType) const = 0;
     /**
      * Attach channel
-     * \param channel the wimax channel
+     * @param channel the wimax channel
      */
     virtual void DoAttach(Ptr<WimaxChannel> channel) = 0;
     /// Set data rates
     virtual void DoSetDataRates() = 0;
     /**
      * Get data rate
-     * \param modulationType the modulation type
-     * \returns the data rate
+     * @param modulationType the modulation type
+     * @returns the data rate
      */
     virtual uint32_t DoGetDataRate(ModulationType modulationType) const = 0;
     /**
      * Get number of symbols
-     * \param size the transmission size
-     * \param modulationType the modulation type
-     * \returns the number of symbols
+     * @param size the transmission size
+     * @param modulationType the modulation type
+     * @returns the number of symbols
      */
     virtual uint64_t DoGetNrSymbols(uint32_t size, ModulationType modulationType) const = 0;
     /**
      * Get number of bytes
-     * \param symbols the number of symbols
-     * \param modulationType the modulation type
-     * \returns the number of bytes
+     * @param symbols the number of symbols
+     * @param modulationType the modulation type
+     * @returns the number of bytes
      */
     virtual uint64_t DoGetNrBytes(uint32_t symbols, ModulationType modulationType) const = 0;
     /**
      * Get TTG
-     * \returns the TTG
+     * @returns the TTG
      */
     virtual uint16_t DoGetTtg() const = 0;
     /**
      * Get RTG
-     * \returns the RTG
+     * @returns the RTG
      */
     virtual uint16_t DoGetRtg() const = 0;
 
     /**
      * Get frame duration code
-     * \returns the frame duration code
+     * @returns the frame duration code
      */
     virtual uint8_t DoGetFrameDurationCode() const = 0;
     /**
      * Get frame duration
-     * \param frameDurationCode the frame duration code
-     * \returns the frame duration time
+     * @param frameDurationCode the frame duration code
+     * @returns the frame duration time
      */
     virtual Time DoGetFrameDuration(uint8_t frameDurationCode) const = 0;
     /**
@@ -432,22 +432,22 @@
     virtual void DoSetPhyParameters() = 0;
     /**
      * Get sampling factor
-     * \return the sampling factor
+     * @return the sampling factor
      */
     virtual double DoGetSamplingFactor() const = 0;
     /**
      * Get NFFT
-     * \returns the NFFT
+     * @returns the NFFT
      */
     virtual uint16_t DoGetNfft() const = 0;
     /**
      * Get sampling frequency
-     * \returns the sampling frequency
+     * @returns the sampling frequency
      */
     virtual double DoGetSamplingFrequency() const = 0;
     /**
      * Get G value
-     * \returns he G value
+     * @returns he G value
      */
     virtual double DoGetGValue() const = 0;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/wimax-tlv.cc ns-3.44/src/wimax/model/wimax-tlv.cc
--- ns-3.43/src/wimax/model/wimax-tlv.cc	2024-10-09 16:41:10.148656800 -0700
+++ ns-3.44/src/wimax/model/wimax-tlv.cc	2025-03-09 16:55:49.819372700 -0700
@@ -157,15 +157,15 @@
     switch (m_type)
     {
     case HMAC_TUPLE:
-        /// \todo implement Deserialize HMAC_TUPLE
+        /// @todo implement Deserialize HMAC_TUPLE
         NS_FATAL_ERROR("Not implemented-- please implement and contribute a patch");
         break;
     case MAC_VERSION_ENCODING:
-        /// \todo implement Deserialize MAC_VERSION_ENCODING
+        /// @todo implement Deserialize MAC_VERSION_ENCODING
         NS_FATAL_ERROR("Not implemented-- please implement and contribute a patch");
         break;
     case CURRENT_TRANSMIT_POWER:
-        /// \todo implement Deserialize CURRENT_TRANSMIT_POWER
+        /// @todo implement Deserialize CURRENT_TRANSMIT_POWER
         NS_FATAL_ERROR("Not implemented-- please implement and contribute a patch");
         break;
     case DOWNLINK_SERVICE_FLOW: {
@@ -181,11 +181,11 @@
         break;
     }
     case VENDOR_ID_EMCODING:
-        /// \todo implement Deserialize VENDOR_ID_EMCODING
+        /// @todo implement Deserialize VENDOR_ID_EMCODING
         NS_FATAL_ERROR("Not implemented-- please implement and contribute a patch");
         break;
     case VENDOR_SPECIFIC_INFORMATION:
-        /// \todo implement Deserialize  VENDOR_SPECIFIC_INFORMATION
+        /// @todo implement Deserialize  VENDOR_SPECIFIC_INFORMATION
         NS_FATAL_ERROR("Not implemented-- please implement and contribute a patch");
         break;
     default:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/model/wimax-tlv.h ns-3.44/src/wimax/model/wimax-tlv.h
--- ns-3.43/src/wimax/model/wimax-tlv.h	2024-10-09 16:41:10.148656800 -0700
+++ ns-3.44/src/wimax/model/wimax-tlv.h	2025-03-09 16:55:49.819372700 -0700
@@ -25,7 +25,7 @@
 {
 
 /**
- * \ingroup wimax
+ * @ingroup wimax
  * The value field of a tlv can take different values (uint8_t, uint16,
  * vector, ...). This class is a virtual interface
  * from which all the types of tlv values should derive
@@ -39,24 +39,24 @@
 
     /**
      * Get serialized size in bytes
-     * \returns the serialized size
+     * @returns the serialized size
      */
     virtual uint32_t GetSerializedSize() const = 0;
     /**
      * Serialize to a buffer
-     * \param start the iterator
+     * @param start the iterator
      */
     virtual void Serialize(Buffer::Iterator start) const = 0;
     /**
      * Deserialize from a buffer
-     * \param start the iterator
-     * \param valueLen the maximum length of the value
-     * \returns the
+     * @param start the iterator
+     * @param valueLen the maximum length of the value
+     * @returns the
      */
     virtual uint32_t Deserialize(Buffer::Iterator start, uint64_t valueLen) = 0;
     /**
      * Copy function
-     * \returns the TLV value
+     * @returns the TLV value
      */
     virtual TlvValue* Copy() const = 0;
 
@@ -65,8 +65,8 @@
 
 // =============================================================================
 /**
- * \ingroup wimax
- * \brief This class implements the Type-Len-Value structure channel encodings as described by "IEEE
+ * @ingroup wimax
+ * @brief This class implements the Type-Len-Value structure channel encodings as described by "IEEE
  * Standard for Local and metropolitan area networks Part 16: Air Interface for Fixed Broadband
  * Wireless Access Systems"
  * 11. TLV encodings, page 645
@@ -90,16 +90,16 @@
     /**
      * Constructor
      *
-     * \param type type
-     * \param length the length
-     * \param value TLV value
+     * @param type type
+     * @param length the length
+     * @param value TLV value
      */
     Tlv(uint8_t type, uint64_t length, const TlvValue& value);
     Tlv();
     ~Tlv() override;
     /**
      * Register this type.
-     * \return the TypeId.
+     * @return the TypeId.
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -109,43 +109,43 @@
     uint32_t Deserialize(Buffer::Iterator start) override;
     /**
      * Get size of length field
-     * \returns the size of length field
+     * @returns the size of length field
      */
     uint8_t GetSizeOfLen() const;
     /**
      * Get type value
-     * \returns the type
+     * @returns the type
      */
     uint8_t GetType() const;
     /**
      * Get length value
-     * \returns the length
+     * @returns the length
      */
     uint64_t GetLength() const;
     /**
      * Peek value
-     * \returns the TLV value
+     * @returns the TLV value
      */
     TlvValue* PeekValue();
     /**
      * Copy TLV
-     * \returns a pointer to a TLV copy
+     * @returns a pointer to a TLV copy
      */
     Tlv* Copy() const;
     /**
      * Copy TlvValue
-     * \returns the TLV value
+     * @returns the TLV value
      */
     TlvValue* CopyValue() const;
     /**
      * assignment operator
-     * \param o the TLV to assign
-     * \returns the TLV
+     * @param o the TLV to assign
+     * @returns the TLV
      */
     Tlv& operator=(const Tlv& o);
     /**
      * type conversion operator
-     * \param tlv the TLV
+     * @param tlv the TLV
      */
     Tlv(const Tlv& tlv);
 
@@ -157,8 +157,8 @@
 
 // ==============================================================================
 /**
- * \ingroup wimax
- * \brief U8TlvValue class
+ * @ingroup wimax
+ * @brief U8TlvValue class
  */
 class U8TlvValue : public TlvValue
 {
@@ -166,7 +166,7 @@
     /**
      * Constructor
      *
-     * \param value value to encode
+     * @param value value to encode
      */
     U8TlvValue(uint8_t value);
     U8TlvValue();
@@ -176,18 +176,18 @@
     uint32_t Deserialize(Buffer::Iterator start, uint64_t valueLen) override;
     /**
      * Deserialize from a buffer
-     * \param start the iterator
-     * \returns the size of the item
+     * @param start the iterator
+     * @returns the size of the item
      */
     uint32_t Deserialize(Buffer::Iterator start);
     /**
      * Get value
-     * \returns the value
+     * @returns the value
      */
     uint8_t GetValue() const;
     /**
      * Copy
-     * \returns a U8 TLV value
+     * @returns a U8 TLV value
      */
     U8TlvValue* Copy() const override;
 
@@ -197,8 +197,8 @@
 
 // ==============================================================================
 /**
- * \ingroup wimax
- * \brief U16TlvValue class
+ * @ingroup wimax
+ * @brief U16TlvValue class
  */
 class U16TlvValue : public TlvValue
 {
@@ -206,7 +206,7 @@
     /**
      * Constructor
      *
-     * \param value value to encode
+     * @param value value to encode
      */
     U16TlvValue(uint16_t value);
     U16TlvValue();
@@ -216,18 +216,18 @@
     uint32_t Deserialize(Buffer::Iterator start, uint64_t valueLen) override;
     /**
      * Deserialize from a buffer
-     * \param start the iterator
-     * \returns the size
+     * @param start the iterator
+     * @returns the size
      */
     uint32_t Deserialize(Buffer::Iterator start);
     /**
      * Get value
-     * \returns the value
+     * @returns the value
      */
     uint16_t GetValue() const;
     /**
      * Copy
-     * \returns the U16 TLV value
+     * @returns the U16 TLV value
      */
     U16TlvValue* Copy() const override;
 
@@ -237,8 +237,8 @@
 
 // ==============================================================================
 /**
- * \ingroup wimax
- * \brief U32TlvValue class
+ * @ingroup wimax
+ * @brief U32TlvValue class
  */
 class U32TlvValue : public TlvValue
 {
@@ -246,7 +246,7 @@
     /**
      * Constructor
      *
-     * \param value to encode
+     * @param value to encode
      */
     U32TlvValue(uint32_t value);
     U32TlvValue();
@@ -257,18 +257,18 @@
     uint32_t Deserialize(Buffer::Iterator start, uint64_t valueLen) override;
     /**
      * Deserialize from a buffer
-     * \param start the iterator
-     * \returns the size
+     * @param start the iterator
+     * @returns the size
      */
     uint32_t Deserialize(Buffer::Iterator start);
     /**
      * Get value
-     * \returns the value
+     * @returns the value
      */
     uint32_t GetValue() const;
     /**
      * Copy
-     * \returns the U32 TLV Value
+     * @returns the U32 TLV Value
      */
     U32TlvValue* Copy() const override;
 
@@ -279,8 +279,8 @@
 // ==============================================================================
 
 /**
- * \ingroup wimax
- * \brief this class is used to implement a vector of values in one tlv value field
+ * @ingroup wimax
+ * @brief this class is used to implement a vector of values in one tlv value field
  */
 class VectorTlvValue : public TlvValue
 {
@@ -294,22 +294,22 @@
     uint32_t Deserialize(Buffer::Iterator start, uint64_t valueLength) override = 0;
     /**
      * Begin iterator
-     * \returns the beginning element
+     * @returns the beginning element
      */
     Iterator Begin() const;
     /**
      * End iterator
-     * \returns the ending element
+     * @returns the ending element
      */
     Iterator End() const;
     /**
      * Add a TLV
-     * \param val the TLV value
+     * @param val the TLV value
      */
     void Add(const Tlv& val);
     /**
      * Copy
-     * \returns the vector TLV value
+     * @returns the vector TLV value
      */
     VectorTlvValue* Copy() const override = 0;
 
@@ -319,8 +319,8 @@
 
 // ==============================================================================
 /**
- * \ingroup wimax
- * \brief SfVectorTlvValue class
+ * @ingroup wimax
+ * @brief SfVectorTlvValue class
  */
 class SfVectorTlvValue : public VectorTlvValue
 {
@@ -367,8 +367,8 @@
 // ==============================================================================
 
 /**
- * \ingroup wimax
- * \brief this class implements the convergence sub-layer descriptor as a tlv vector
+ * @ingroup wimax
+ * @brief this class implements the convergence sub-layer descriptor as a tlv vector
  */
 class CsParamVectorTlvValue : public VectorTlvValue
 {
@@ -390,8 +390,8 @@
 // ==============================================================================
 
 /**
- * \ingroup wimax
- * \brief this class implements the classifier descriptor as a tlv vector
+ * @ingroup wimax
+ * @brief this class implements the classifier descriptor as a tlv vector
  */
 class ClassificationRuleVectorTlvValue : public VectorTlvValue
 {
@@ -418,8 +418,8 @@
 
 // ==============================================================================
 /**
- * \ingroup wimax
- * \brief TosTlvValue class
+ * @ingroup wimax
+ * @brief TosTlvValue class
  */
 class TosTlvValue : public TlvValue
 {
@@ -428,9 +428,9 @@
     /**
      * Constructor
      *
-     * \param low low value
-     * \param high high value
-     * \param mask the mask
+     * @param low low value
+     * @param high high value
+     * @param mask the mask
      */
     TosTlvValue(uint8_t low, uint8_t high, uint8_t mask);
     ~TosTlvValue() override;
@@ -439,22 +439,22 @@
     uint32_t Deserialize(Buffer::Iterator start, uint64_t valueLength) override;
     /**
      * Get low part
-     * \returns the low part
+     * @returns the low part
      */
     uint8_t GetLow() const;
     /**
      * Get high part
-     * \returns the high part
+     * @returns the high part
      */
     uint8_t GetHigh() const;
     /**
      * Get the mask
-     * \returns the mask
+     * @returns the mask
      */
     uint8_t GetMask() const;
     /**
      * Copy
-     * \returns the TOS TLV value
+     * @returns the TOS TLV value
      */
     TosTlvValue* Copy() const override;
 
@@ -466,8 +466,8 @@
 
 // ==============================================================================
 /**
- * \ingroup wimax
- * \brief PortRangeTlvValue class
+ * @ingroup wimax
+ * @brief PortRangeTlvValue class
  */
 class PortRangeTlvValue : public TlvValue
 {
@@ -488,23 +488,23 @@
     uint32_t Deserialize(Buffer::Iterator start, uint64_t valueLength) override;
     /**
      * Add a range
-     * \param portLow the low port of the range
-     * \param portHigh the high port of the range
+     * @param portLow the low port of the range
+     * @param portHigh the high port of the range
      */
     void Add(uint16_t portLow, uint16_t portHigh);
     /**
      * Begin iterator
-     * \returns the beginning element
+     * @returns the beginning element
      */
     Iterator Begin() const;
     /**
      * End iterator
-     * \returns the ending element
+     * @returns the ending element
      */
     Iterator End() const;
     /**
      * Copy
-     * \returns the port range tlv value
+     * @returns the port range tlv value
      */
     PortRangeTlvValue* Copy() const override;
 
@@ -514,8 +514,8 @@
 
 // ==============================================================================
 /**
- * \ingroup wimax
- * \brief ProtocolTlvValue class
+ * @ingroup wimax
+ * @brief ProtocolTlvValue class
  */
 class ProtocolTlvValue : public TlvValue
 {
@@ -529,22 +529,22 @@
     uint32_t Deserialize(Buffer::Iterator start, uint64_t valueLength) override;
     /**
      * Add protocol number
-     * \param protocol the protocol number
+     * @param protocol the protocol number
      */
     void Add(uint8_t protocol);
     /**
      * Begin iterator
-     * \returns the beginning element
+     * @returns the beginning element
      */
     Iterator Begin() const;
     /**
      * End iterator
-     * \return the ending element
+     * @return the ending element
      */
     Iterator End() const;
     /**
      * Copy
-     * \returns the protocol tlv value
+     * @returns the protocol tlv value
      */
     ProtocolTlvValue* Copy() const override;
 
@@ -555,8 +555,8 @@
 // ==============================================================================
 
 /**
- * \ingroup wimax
- * \brief Ipv4AddressTlvValue class
+ * @ingroup wimax
+ * @brief Ipv4AddressTlvValue class
  */
 class Ipv4AddressTlvValue : public TlvValue
 {
@@ -577,18 +577,18 @@
     uint32_t Deserialize(Buffer::Iterator start, uint64_t valueLength) override;
     /**
      * Add IPv4 address and mask
-     * \param address the IPv4 address
-     * \param mask the IPv4 mask
+     * @param address the IPv4 address
+     * @param mask the IPv4 mask
      */
     void Add(Ipv4Address address, Ipv4Mask mask);
     /**
      * Begin iterator
-     * \returns the beginning element
+     * @returns the beginning element
      */
     Iterator Begin() const;
     /**
      * End iterator
-     * \returns the ending element
+     * @returns the ending element
      */
     Iterator End() const;
     Ipv4AddressTlvValue* Copy() const override;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/test/mac-messages-test.cc ns-3.44/src/wimax/test/mac-messages-test.cc
--- ns-3.43/src/wimax/test/mac-messages-test.cc	2024-10-09 16:41:10.148656800 -0700
+++ ns-3.44/src/wimax/test/mac-messages-test.cc	2025-03-09 16:55:49.819372700 -0700
@@ -13,15 +13,15 @@
 using namespace ns3;
 
 /**
- * \ingroup wimax
- * \defgroup wimax-test wimax module tests
+ * @ingroup wimax
+ * @defgroup wimax-test wimax module tests
  */
 
 /**
- * \ingroup wimax-test
- * \ingroup tests
+ * @ingroup wimax-test
+ * @ingroup tests
  *
- * \brief Test the DSA request message.
+ * @brief Test the DSA request message.
  */
 class DsaRequestTestCase : public TestCase
 {
@@ -100,10 +100,10 @@
 }
 
 /**
- * \ingroup wimax-test
- * \ingroup tests
+ * @ingroup wimax-test
+ * @ingroup tests
  *
- * \brief Ns3 Wimax Mac Messages Test Suite
+ * @brief Ns3 Wimax Mac Messages Test Suite
  */
 class Ns3WimaxMacMessagesTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/test/phy-test.cc ns-3.44/src/wimax/test/phy-test.cc
--- ns-3.43/src/wimax/test/phy-test.cc	2024-10-09 16:41:10.148656800 -0700
+++ ns-3.44/src/wimax/test/phy-test.cc	2025-03-09 16:55:49.819372700 -0700
@@ -26,10 +26,10 @@
  */
 
 /**
- * \ingroup wimax-test
- * \ingroup tests
+ * @ingroup wimax-test
+ * @ingroup tests
  *
- * \brief Ns3 Wimax Simple OFDM Test Case
+ * @brief Ns3 Wimax Simple OFDM Test Case
  */
 class Ns3WimaxSimpleOFDMTestCase : public TestCase
 {
@@ -41,8 +41,8 @@
     void DoRun() override;
     /**
      * Run once function
-     * \param FrameDuration the frame duration
-     * \returns true if successful
+     * @param FrameDuration the frame duration
+     * @returns true if successful
      */
     bool DoRunOnce(double FrameDuration);
 };
@@ -110,10 +110,10 @@
 }
 
 /**
- * \ingroup wimax-test
- * \ingroup tests
+ * @ingroup wimax-test
+ * @ingroup tests
  *
- * \brief Test the SNr tom block error rate module
+ * @brief Test the SNr tom block error rate module
  */
 class Ns3WimaxSNRtoBLERTestCase : public TestCase
 {
@@ -125,8 +125,8 @@
     void DoRun() override;
     /**
      * Run once function
-     * \param modulationType the modulation type
-     * \returns true if successful
+     * @param modulationType the modulation type
+     * @returns true if successful
      */
     bool DoRunOnce(uint8_t modulationType);
 };
@@ -165,10 +165,10 @@
 }
 
 /**
- * \ingroup wimax-test
- * \ingroup tests
+ * @ingroup wimax-test
+ * @ingroup tests
  *
- * \brief The test suite
+ * @brief The test suite
  */
 class Ns3WimaxPhyTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/test/qos-test.cc ns-3.44/src/wimax/test/qos-test.cc
--- ns-3.43/src/wimax/test/qos-test.cc	2024-10-09 16:41:10.148656800 -0700
+++ ns-3.44/src/wimax/test/qos-test.cc	2025-03-09 16:55:49.819372700 -0700
@@ -22,10 +22,10 @@
 using namespace ns3;
 
 /**
- * \ingroup wimax-test
- * \ingroup tests
+ * @ingroup wimax-test
+ * @ingroup tests
  *
- * \brief Ns3 Wimax Scheduling Test Case
+ * @brief Ns3 Wimax Scheduling Test Case
  */
 class Ns3WimaxSchedulingTestCase : public TestCase
 {
@@ -37,8 +37,8 @@
     void DoRun() override;
     /**
      * Run once function
-     * \param scheduler the wimax scheduler type
-     * \returns true if successful
+     * @param scheduler the wimax scheduler type
+     * @returns true if successful
      */
     bool DoRunOnce(WimaxHelper::SchedulerType scheduler);
 };
@@ -154,10 +154,10 @@
 }
 
 /**
- * \ingroup wimax-test
- * \ingroup tests
+ * @ingroup wimax-test
+ * @ingroup tests
  *
- * \brief Ns3 Wimax SF Type Test Case
+ * @brief Ns3 Wimax SF Type Test Case
  */
 class Ns3WimaxSFTypeTestCase : public TestCase
 {
@@ -169,8 +169,8 @@
     void DoRun() override;
     /**
      * Run once function
-     * \param schedulingType the scheduling type
-     * \returns true if successful
+     * @param schedulingType the scheduling type
+     * @returns true if successful
      */
     bool DoRunOnce(ServiceFlow::SchedulingType schedulingType);
 };
@@ -288,10 +288,10 @@
 }
 
 /**
- * \ingroup wimax-test
- * \ingroup tests
+ * @ingroup wimax-test
+ * @ingroup tests
  *
- * \brief Ns3 Wimax QoS Test Suite
+ * @brief Ns3 Wimax QoS Test Suite
  */
 class Ns3WimaxQoSTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/test/ss-mac-test.cc ns-3.44/src/wimax/test/ss-mac-test.cc
--- ns-3.43/src/wimax/test/ss-mac-test.cc	2024-10-09 16:41:10.148656800 -0700
+++ ns-3.44/src/wimax/test/ss-mac-test.cc	2025-03-09 16:55:49.819372700 -0700
@@ -16,10 +16,10 @@
 using namespace ns3;
 
 /**
- * \ingroup wimax-test
- * \ingroup tests
+ * @ingroup wimax-test
+ * @ingroup tests
  *
- * \brief Test the network entry procedure.
+ * @brief Test the network entry procedure.
  * Create a network with a BS and 10 SS and check that all the SS perform the
  * network entry correctly
  *
@@ -79,10 +79,10 @@
 }
 
 /**
- * \ingroup wimax-test
- * \ingroup tests
+ * @ingroup wimax-test
+ * @ingroup tests
  *
- * \brief Test if the management connections are correctly setup.
+ * @brief Test if the management connections are correctly setup.
  * Create a network with a BS and 10 SS and check that the management
  * connections are correctly setup for all SS
  *
@@ -143,10 +143,10 @@
 }
 
 /**
- * \ingroup wimax-test
- * \ingroup tests
+ * @ingroup wimax-test
+ * @ingroup tests
  *
- * \brief Ns3 Wimax SS Mac Test Suite
+ * @brief Ns3 Wimax SS Mac Test Suite
  */
 class Ns3WimaxSSMacTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/test/wimax-fragmentation-test.cc ns-3.44/src/wimax/test/wimax-fragmentation-test.cc
--- ns-3.43/src/wimax/test/wimax-fragmentation-test.cc	2024-10-09 16:41:10.148656800 -0700
+++ ns-3.44/src/wimax/test/wimax-fragmentation-test.cc	2025-03-09 16:55:49.819372700 -0700
@@ -19,10 +19,10 @@
 using namespace ns3;
 
 /**
- * \ingroup wimax-test
- * \ingroup tests
+ * @ingroup wimax-test
+ * @ingroup tests
  *
- * \brief Test the wimax packet fragmentation.
+ * @brief Test the wimax packet fragmentation.
  */
 class Ns3WimaxFragmentationTestCase : public TestCase
 {
@@ -132,10 +132,10 @@
 }
 
 /**
- * \ingroup wimax-test
- * \ingroup tests
+ * @ingroup wimax-test
+ * @ingroup tests
  *
- * \brief Ns3 Wimax Fragmentation Test Suite
+ * @brief Ns3 Wimax Fragmentation Test Suite
  */
 class Ns3WimaxFragmentationTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/test/wimax-service-flow-test.cc ns-3.44/src/wimax/test/wimax-service-flow-test.cc
--- ns-3.43/src/wimax/test/wimax-service-flow-test.cc	2024-10-09 16:41:10.148656800 -0700
+++ ns-3.44/src/wimax/test/wimax-service-flow-test.cc	2025-03-09 16:55:49.819372700 -0700
@@ -21,10 +21,10 @@
 using namespace ns3;
 
 /**
- * \ingroup wimax-test
- * \ingroup tests
+ * @ingroup wimax-test
+ * @ingroup tests
  *
- * \brief Test the service flow creation.
+ * @brief Test the service flow creation.
  */
 class Ns3WimaxSfCreationTestCase : public TestCase
 {
@@ -140,10 +140,10 @@
 }
 
 /**
- * \ingroup wimax-test
- * \ingroup tests
+ * @ingroup wimax-test
+ * @ingroup tests
  *
- * \brief Ns3 Wimax Service Flow Test Suite
+ * @brief Ns3 Wimax Service Flow Test Suite
  */
 class Ns3WimaxServiceFlowTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/wimax/test/wimax-tlv-test.cc ns-3.44/src/wimax/test/wimax-tlv-test.cc
--- ns-3.43/src/wimax/test/wimax-tlv-test.cc	2024-10-09 16:41:10.148656800 -0700
+++ ns-3.44/src/wimax/test/wimax-tlv-test.cc	2025-03-09 16:55:49.819372700 -0700
@@ -20,10 +20,10 @@
 using namespace ns3;
 
 /**
- * \ingroup wimax-test
- * \ingroup tests
+ * @ingroup wimax-test
+ * @ingroup tests
  *
- * \brief Test the wimax tlv implementation.
+ * @brief Test the wimax tlv implementation.
  */
 class Ns3WimaxCsParamTlvTestCase : public TestCase
 {
@@ -120,10 +120,10 @@
 }
 
 /**
- * \ingroup wimax-test
- * \ingroup tests
+ * @ingroup wimax-test
+ * @ingroup tests
  *
- * \brief Test the service flow tlv implementation.
+ * @brief Test the service flow tlv implementation.
  */
 class Ns3WimaxSfTlvTestCase : public TestCase
 {
@@ -201,10 +201,10 @@
 }
 
 /**
- * \ingroup wimax-test
- * \ingroup tests
+ * @ingroup wimax-test
+ * @ingroup tests
  *
- * \brief Ns3 Wimax Tlv Test Suite
+ * @brief Ns3 Wimax Tlv Test Suite
  */
 class Ns3WimaxTlvTestSuite : public TestSuite
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/zigbee/CMakeLists.txt ns-3.44/src/zigbee/CMakeLists.txt
--- ns-3.43/src/zigbee/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/zigbee/CMakeLists.txt	2025-03-09 16:55:49.819372700 -0700
@@ -0,0 +1,23 @@
+build_lib(
+  LIBNAME zigbee
+  SOURCE_FILES
+    helper/zigbee-helper.cc
+    helper/zigbee-stack-container.cc
+    model/zigbee-nwk-fields.cc
+    model/zigbee-nwk.cc
+    model/zigbee-stack.cc
+    model/zigbee-nwk-header.cc
+    model/zigbee-nwk-payload-header.cc
+    model/zigbee-nwk-tables.cc
+  HEADER_FILES
+    helper/zigbee-helper.h
+    helper/zigbee-stack-container.h
+    model/zigbee-nwk-fields.h
+    model/zigbee-nwk.h
+    model/zigbee-stack.h
+    model/zigbee-nwk-header.h
+    model/zigbee-nwk-payload-header.h
+    model/zigbee-nwk-tables.h
+  LIBRARIES_TO_LINK ${liblr-wpan}
+  TEST_SOURCES test/zigbee-rreq-test.cc
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/zigbee/doc/zigbee.rst ns-3.44/src/zigbee/doc/zigbee.rst
--- ns-3.43/src/zigbee/doc/zigbee.rst	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/zigbee/doc/zigbee.rst	2025-03-09 16:55:49.819372700 -0700
@@ -0,0 +1,401 @@
+Zigbee
+======
+
+.. include:: replace.txt
+.. highlight:: cpp
+
+.. heading hierarchy:
+   ============= Chapter
+   ------------- Section (#.#)
+   ~~~~~~~~~~~~~ Subsection (#.#.#)
+
+This chapter describes the implementation of |ns3| models for Zigbee
+Pro stack (also known as Zigbee 3.x) as specified by
+the Connectivity Standards Alliance (CSA), Zigbee Specification Revision 22 1.0 (2017).
+
+
+The model described in the present document, represents the uncertified simulated models of Zigbee (TM)
+technology to be used in |ns3| for research and educational purposes. The objective is to provide
+|ns3| with a non-IP dependent routing alternative to be used with the  |ns3| ``lr-wpan`` (IEEE 802.15.4-2011) module.
+This module is presented here with no guarantees of any kind and it has no association whatsoever with the
+CSA or Zigbee (TM) products.
+
+
+The source code for the new module lives in the directory ``src/zigbee``.
+
+.. _fig-ZigbeeStackArch:
+
+.. figure:: figures/zigbeeStackArch.*
+
+    Zigbee Stack Architecture in ns-3
+
+The Zigbee stack implementation is designed to operate on top of an existing |ns3| ``NetDevice`` that aggregates an object derived from ``LrWpanMacBase`` (which is compliant with IEEE 802.15.4-2011 MAC standards).
+This is the case of ``NetDevices`` such as the ``LrWpanNetDevice``.
+
+While other technologies like 6loWPAN can interact with the underlying MAC layer through general-purpose ``NetDevice`` interfaces, Zigbee has specific requirements that necessitate certain features from a lr-wpan MAC.
+Consequently, the |ns3| Zigbee implementation directly accesses the aggregated ``LrWpanMacBase`` and interfaces with it accordingly.
+
+The current scope of the project includes **only the NWK layer in the Zigbee stack**. However, the project can be later extended
+to support higher layers like the Application Sublayer (APS) and the Zigbee Cluster Library (ZCL).
+
+
+Scope and Limitations
+---------------------
+
+- MacInterfaceTable is not supported (Multiple interface support).
+- Security handling is not supported.
+- Source routing and Tree routing are not implemented.
+- Zigbee Stack profile 0x01 (used for tree routing and distributed address assignment) is not supported.
+- A few NIB attributes setting and NWK constants are not supported by the |ns3| attribute system.
+- Traces are not implemented yet.
+- Data broadcast do not support retries or passive acknowledgment.
+- Data broadcast to low power routers is not supported as the underlying lr-wpan netdevice has no concept of energy consumption.
+- Address duplication detection is not supported.
+- Beacon mode is not througly tested.
+- The following Zigbee layers are not supported yet:
+   - Zigbee Application Support Sub-Layer (APS)
+   - Zigbee Cluster Library (ZCL)
+   - Zigbee Device Object (ZDO)
+   - Application Framework (AF)
+
+To see a list of |ns3| Zigbee undergoing development efforts check issue `#1165 <https://gitlab.com/nsnam/ns-3-dev/-/issues/1165>`_
+
+The network layer (NWK)
+-----------------------
+
+Similar to the implementation of IEEE 802.15.4 (lr-wpan) layers, communication between layers is done via "primitives".
+These primitives are implemented in |ns3| with a combination of functions and callbacks.
+
+The following is a list of NWK primitives supported:
+
+- NLME-NETWORK-DISCOVERY (Request, Confirm)
+- NLME-ROUTE-DISCOVERY (Request, Confirm)
+- NLME-NETWORK-FORMATION (Request, Confirm)
+- NLME-JOIN (Request, Confirm, Indication)
+- NLME-DIRECT-JOIN (Request, Confirm)
+- NLME-START-ROUTER (Request, Confirm)
+- NLDE-DATA (Request, Confirm, Indication)
+
+For details on how to use these primitives, please consult the Zigbee Pro specification.
+
+Typically, users do not have to interact with the Zigbee network layer (NWK) directly. Most commonly, the NWK is used by the Application Support Sub-Layer (APS) instead.
+In the current implementation of Zigbee in |ns3| we only support the NWK, for this reason, users wishing to use the routing, network joining and scanning capabilities of Zigbee
+must interact directly with the NWK.
+
+The following is a brief explanation of how users can interact with the NWK and what are the supported capabilities.
+
+Network joining
+~~~~~~~~~~~~~~~
+
+In a Zigbee network, before devices attempt to exchange data with one another, they must first be organized and related to one another based on their specific roles.
+There are three primary roles in a Zigbee network:
+
+- **Coordinator (ZC):** This is the initiating device in the network, and there can only be one coordinator at a time.
+- **Router (ZR):** This device is capable of relaying data and commands on behalf of other devices.
+- **End Device (ZE):** These are devices with limited capabilities (for example, they cannot route messages) that serve as endpoints within the network.
+
+Devices must first join a Zigbee network before they can upgrade their roles to either routers or remain as end devices.
+There are two ways for devices to join a Zigbee network: they can either go through the MAC association process or directly join the network.
+
+**MAC Association Join**
+
+This method is the default approach used by Zigbee. As the name suggests, it utilizes the underlying MAC layer association mechanism to connect to the Zigbee network.
+For a comprehensive explanation of the association mechanism occurring in the MAC, please refer to the lr-wpan model documentation.
+
+When employing the association mechanism, devices communicate with each other to join an existing network via the network coordinator or a designated router within the network.
+As a result of this joining process, devices are assigned a short address (16-bit address) that they use for routing and data exchange operations. Below is a summary of the MAC association join process:
+
+1. At least one coordinator must be operational and capable of receiving join requests (i.e. A device successfully completed a `NLME-NETWORK-FORMATION.request` primitive).
+2. Devices must issue a `NLME-NETWORK-DISCOVERY.request` to look for candidate coordinators/routers to join. The parameters channel numbers (represented by a bitmap for channels 11-26) and scan duration (ranging from 0 to 14) must also be specified to define the channel in which the device will search for a coordinator or router and the duration of that search.
+3. If a coordinator (or a capable router) is found on the designated channel and within communication range, it will respond to the device's request with a beacon that contains both a PAN descriptor and a beacon payload describing the capabilities of the coordinator or router.
+4. Upon receiving these beacons, the device will select "the most ideal coordinator or router candidate" to join.
+5. After selecting the candidate, devices must issue a `NLME-JOIN.request` primitive with the network parameter set to `ASSOCIATION`. This will initiate the join process.
+6. If the association is successful, the device will receive a confirmation from the coordinator or router, along with a short address that the device will use for its operations within the Zigbee network.
+7. Short addresses are assigned by the coordinator randomly, which means there could be instances of address duplication. Although the Zigbee specification includes a mechanism for detecting address duplication, this feature is not currently supported in this implementation.
+8. If the association request fails, the device will receive a confirmation with a status indicating failure, rather than `SUCCESSFUL`, and the short address FF:FF will be received (indicating that the device is not associated).
+
+Note: The process described above outlines the steps for joining the network using a MAC association join.
+However, devices that are required to act as routers must also issue an additional `NLME-START-ROUTER.request` primitive after joining the network in order to begin functioning as routers.
+
+In |ns3|, Zigbee NWK, coordinators or routers can be found using the following primitive::
+
+    // zstack is an instance of a ZigbeeStack object installed in the node looking
+    // for coordinator or routers
+    NlmeNetworkDiscoveryRequestParams netDiscParams;
+    netDiscParams.m_scanChannelList.channelPageCount = 1; // only one page structure is supported
+    netDiscParams.m_scanChannelList.channelsField[0] = 0x7800; // Bitmap representing channels 11-14
+    netDiscParams.m_scanDuration = 14; // (Ranging 0-14) See lr-wpan documentation for time equivalency
+    zstack->GetNwk()->NlmeNetworkDiscoveryRequest(netDiscParams);
+
+In |ns3| a Zigbee NWK join request (using MAC association) is used as follows::
+
+        // zstack is an instance of a ZigbeeStack object installed in the node sending
+        // the join request. The extendedPANId value is typically obtained from the network descriptor
+        // received from a previous network discovery request step.
+        zigbee::CapabilityInformation capaInfo; // define the capabilities and
+        capaInfo.SetDeviceType(ROUTER);         // requirements of the current device
+        capaInfo.SetAllocateAddrOn(true);
+
+        NlmeJoinRequestParams joinParams;
+        joinParams.m_rejoinNetwork = zigbee::JoiningMethod::ASSOCIATION; // Must be set to ASSOCIATION
+        joinParams.m_capabilityInfo = capaInfo.GetCapability(); // Set the capabilities (bitmap)
+        joinParams.m_extendedPanId = 0xCAFE0000BEEF0000; // The 64 bits representing the extended PAN ID
+        zstack->GetNwk()->NlmeJoinRequest(joinParams);
+
+See zigbee/examples for detailed examples using network joining.
+
+**Direct Join (a.k.a. Orphaning process)**
+
+Direct Join is employed when the number of nodes in the network and their relationships are known in advance.
+As the name suggests, this method involves registering devices directly with a coordinator or router.
+Subsequently, these devices confirm their registration with the coordinator to receive a network address.
+
+This process is simpler than the association method of joining a network, but it is less flexible since it requires manual intervention.
+Below is a summary of the direct join process:
+
+1. If a coordinator device or router is already operational, devices that can communicate with this coordinator must be manually registered using the primitive `NLME-DIRECT-JOIN.request`.
+2. After this registration, the devices registered in step 1 will send a `NLME-JOIN.request` with the rejoin network parameter set to `DIRECT_OR_REJOIN`. This action triggers a MAC orphaning request message, which is used to confirm the device's existence with the coordinator.
+3. The coordinator or router will respond to the orphaning message by providing an assigned short address.
+4. The device accepts this short address and successfully joins the network.
+
+Similar to the MAC association mechanism, devices that want to function as routers must issue an additional `NLME-START-ROUTER.request` once the joining process is completed.
+
+In |ns3|, a direct join primitive is used as follows::
+
+    CapabilityInformation capaInfo;
+    capaInfo.SetDeviceType(zigbee::MacDeviceType::ROUTER); // The joining device capability is defined here
+    capaInfo.SetAllocateAddrOn(true); // If false, an extended address mode will be used instead
+    // zstack is an instance of a ZigbeeStack object installed in node that is the
+    // coordinator or router where the joining device is being registered
+    NlmeDirectJoinRequestParams directParams;
+    directParams.m_capabilityInfo = capaInfo.GetCapability();
+    directParams.m_deviceAddr = Mac64Address("00:00:00:00:00:00:00:01"); // The device IEEE address (Ext address)
+    zstack->GetNwk()->NlmeDirectJoinRequest(directParams);
+
+The device joining the network must issue a primitive similar to this one::
+
+    // zstack is an instance of a ZigbeeStack object installed in the node joining the network
+    // The orphaning message will be sent to every channel and interface specified.
+    // The rejoin network parameter must be DIRECT_OR_REJOIN
+    NlmeJoinRequestParams joinParams;
+    joinParams.m_rejoinNetwork = zigbee::JoiningMethod::DIRECT_OR_REJOIN;
+    joinParams.m_scanChannelList.channelPageCount = 1;
+    joinParams.m_scanChannelList.channelsField[0] = zigbee::ALL_CHANNELS; // Bitmap representing Ch. 11~26
+    joinParams.m_capabilityInfo = capaInfo.GetCapability();
+    joinParams.m_extendedPanId = Mac64Address("00:00:00:00:00:00:CA:FE").ConvertToInt();
+    zstack->GetNwk()->NlmeJoinRequest(joinParams);
+
+
+See zigbee/examples for detailed examples using network joining.
+
+Routing
+~~~~~~~
+
+Despite the common belief that the routing protocol contained in Zigbee is AODV, Zigbee only borrows a few basic ideas from this protocol.
+In fact, Zigbee supports not one but 4 different methods of routing: Mesh routing, Many-To-One routing, Source routing, and Tree routing.
+From these routing protocols, the current |ns3| implementation only supports the first two.
+
+**Many-To-One Routing**
+
+In Zigbee networks, it's common for multiple nodes to need to communicate with a single node, often referred to as a concentrator.
+If all nodes perform a Mesh route discovery for this single point in the network, it can lead to an overwhelming number of route request messages, which may degrade network performance.
+Under these circumstances, Many-to-One routing is typically more efficient than Mesh routing.
+
+In Many-to-One routing, one route discovery operation is used to establish a route from all devices to the single concentrator (or collector) node.
+The general procedure for Many-to-One routing is as follows:
+
+1. The concentrator node broadcast a Many-to-One route request (RREQ) with the concentrator node address set as the target.
+2. Devices receiving this broadcast store a reverse route into their routing table pointing to the path towards the concentrator.
+3. If we are receiving the RREQ for the first time or the accumulated pathcost is better to the route stored in the routing table, the RREQ is re-broadcasted.
+
+.. _fig-manyToOne:
+
+.. figure:: figures/manyToOne.*
+
+    Zigbee Many-To-One routing
+
+There can be multiple concentrator nodes in the network and it is possible to run Many-To-One routing along Mesh routing.
+In |ns3|, Many-To-One routing is achieved by using the ``NLME-ROUTE-DISCOVERY.request`` primitive::
+
+   // zstack is an instance of a ZigbeeStack object installed in node that will
+   // become the concentrator node.
+   // The destination address mode must be set to NO_ADDRESS to automatically
+   // trigger a Many-To-One route discovery.
+
+   NlmeRouteDiscoveryRequestParams routeDiscParams;
+   routeDiscParams.m_dstAddrMode = NO_ADDRESS;
+   zstack->GetNwk()->NlmeRouteDiscoveryRequest(routeDiscParams);
+
+.. note::
+    Important: The process described above assumes that devices have already joined the network.
+    A route discovery request issued before a device is part of the network (join process) will result in failure.
+
+**Mesh Routing**
+
+Mesh routing in Zigbee is often attributed to the mechanisms used by the AODV routing protocol (`RFC 3561 <https://datatracker.ietf.org/doc/html/rfc3561>`_).
+Although Zigbee mesh routing and the AODV protocol share some similarities, there are significant differences between them that directly influence performance.
+
+Firstly, AODV was designed for IP-based networks, whereas Zigbee operates without the concept of IP addresses, thus eliminating their associated overhead.
+Additionally, unlike AODV, Zigbee employs several distinct tables (such as the RREQ table, routing table, neighbor table, and discovery table) to manage route discovery and storage.
+The use of these tables allows Zigbee to implement various storage and update policies based on the type of information they hold.
+For instance, entries for neighboring nodes are typically updated frequently and have a short lifespan.
+In contrast, entries in routing tables are usually long-lived or do not expire but may be replaced by new entries when space is limited.
+The RREQ and discovery tables, on the other hand, are used exclusively during the route discovery process to optimize this process and facilitate the early detection of errors and loops.
+
+In addition to these differences, Zigbee incorporates detailed policies, such as packet retransmissions, which come with defined default values to enhance consistency across various Zigbee implementations.
+For more information on the implementation details and policies that govern Zigbee, please refer to the Zigbee specification.
+
+The primary goal of mesh routing is to establish the shortest path to a specific destination within the network.
+While hop count is the most commonly used metric for calculating path cost, Zigbee can also utilize the link quality indicator (LQI) to determine the shortest route to the destination (the default option).
+The general procedure for mesh routing is as follows:
+
+1. The source node broadcasts a route request (RREQ) to its neighboring nodes, specifying the desired destination.
+2. Upon receiving the RREQ, the device calculates the link cost and adds it to the path cost already present in the RREQ.
+3. The device then searches for a valid route to the destination, first in its neighbor table, followed by its discovery table and routing table.
+4. If the destination is found, the device issues a route reply (RREP). If not, the RREQ is re-broadcasted only if it is the first time that a RREQ for that destination is sent from this location, or if a better path cost has been obtained.
+5. When the RREQ reaches the destination or a neighboring node that knows the destination, an RREP is sent back to the source, using the information contained in the discovery table.
+6. If there is no existing entry in the routing table, a new entry is created with the details of the most optimal path.
+
+.. _fig-mesh:
+
+.. figure:: figures/mesh.*
+
+    Zigbee Mesh routing
+
+Routing table entries are created only when an RREP is received, and only for the destination specified in the route discovery request.
+A separate route discovery request must be issued for each destination that needs to be recorded in the source device.
+
+In |ns3|, Mesh routing is achieved by using the ``NLME-ROUTE-DISCOVERY.request`` primitive::
+
+   // zstack is an instance of a ZigbeeStack object installed in node that is the
+   // source of the route discovery request.
+   // Only a destination address parameter is necessary to be specified.
+   // Parameters destination address mode = UCST_BCST and radius = 0 are the default values and
+   // do not need be explicitly written.
+   // Note: As specified by Zigbee, when a radius is set to 0, the radius used is equal to
+   // nwkMaxDepth(5) * 2.
+   NlmeRouteDiscoveryRequestParams routeDiscParams;
+   routeDiscParams.m_dstAddr = Mac16Address("BE:EF");
+   routeDiscParams.m_dstAddrMode = UCST_BCST;
+   routeDiscParams.m_radius = 0;
+   zstack->GetNwk()->NlmeRouteDiscoveryRequest(routeDiscParams);
+
+Alternatively, a Mesh route discovery can be performed along a data transmission request by using the
+``NLDE-DATA.request`` primitive with the ``ENABLE_ROUTE_DISCOVERY`` option::
+
+    // zstack is an instance of a ZigbeeStack object installed in node that is the
+    // source of the data transmission request.
+    // The data transmission can be sent with either the ENABLE_ROUTE_DISCOVERY option (default) or the
+    // SUPPRESS_ROUTE_DISCOVERY option.
+    NldeDataRequestParams dataReqParams;
+    Ptr<Packet> p = Create<Packet>(5);
+    dataReqParams.m_dstAddrMode = UCST_BCST;
+    dataReqParams.m_dstAddr = Mac16Address("BE:EF");
+    dataReqParams.m_discoverRoute = ENABLE_ROUTE_DISCOVERY;
+    zstack->GetNwk()->NldeDataRequest(dataReqParams, p);
+
+.. note::
+    Important: The process described above assumes that devices have already joined the network.
+    A route discovery request issued before a device is part of the network (join process) will result in failure.
+
+Usage
+-----
+
+Helpers
+~~~~~~~
+
+The model includes a ``ZigbeeHelper`` used to quickly configure and install the NWK layer
+on top of an existing Lr-wpan MAC layer. In essence, ``ZigbeeHelper`` creates a  ``ZigbeeNwk`` object
+wraps it in a ``ZigbeeStack`` and connects this stack to another existing
+``LrwpanNetDevice``. All the necessary callback hooks are taken care of to ensure communication between
+the Zigbee NWK layer and the Lr-wpan MAC layer is possible.
+The following demonstrates a simple scenario in which a ``LrwpanNetDevice`` devices are set and a ``ZigbeeHelper``
+is used to establish a Zigbee stack on top of these devices::
+
+    NodeContainer nodes;
+    nodes.Create(2);
+
+    // Create the Lr-wpan (IEEE 802.15.4) Netdevices and install them in each node
+    LrWpanHelper lrWpanHelper;
+    NetDeviceContainer lrwpanDevices = lrWpanHelper.Install(nodes);
+
+    // Important: NetDevices MAC extended addresses (EUI-64) must always be set
+    // either manually or using other methods. Short address assignation is not
+    // required as this is later done by the Zigbee join mechanisms.
+    Ptr<LrWpanNetDevice> dev0 = lrwpanDevices.Get(0)->GetObject<LrWpanNetDevice>();
+    Ptr<LrWpanNetDevice> dev1 = lrwpanDevices.Get(1)->GetObject<LrWpanNetDevice>();
+    dev0->GetMac()->SetExtendedAddress("00:00:00:00:00:00:CA:FE");
+    dev1->GetMac()->SetExtendedAddress("00:00:00:00:00:00:00:01");
+
+    // Install a zigbee stack on a set of devices using the helper
+    ZigbeeHelper zigbee;
+    ZigbeeStackContainer zigbeeStackContainer = zigbee.Install(lrwpanDevices);
+
+Attributes
+~~~~~~~~~~
+
+It is possible to adjust the behavior of the Zigbee module by modifying the values of the available attributes.
+Some of these attributes are constants and NIB (Network Information Base) attributes as defined in the Zigbee network layer (NWK) specification.
+
+For easy reference, the attributes are named the same as those found in the specification.
+Constants are values that remain unchanged during the execution of the protocol but can be specified in the configuration files of actual Zigbee devices.
+In ns-3, both Zigbee constants and NIB attributes are represented as simple attributes.
+
+Below is a list of the currently supported attributes:
+
+- ``NwkcCoordinatorCapable``: [Constant] Indicates whether the device is capable of becoming a Zigbee coordinator.
+- ``NwkcProtocolVersion``: [Constant] The version of the Zigbee NWK protocol in the device (placeholder).
+- ``NwkcRouteDiscoveryTime``: [Constant] The duration until a route discovery expires.
+- ``NwkcInitialRREQRetries``: [Constant] The number of times the first broadcast transmission of a RREQ command frame is retried.
+- ``NwkcRREQRetries``: [Constant] The number of times the broadcast transmission of a RREQ command frame is retried on relay by intermediate router or coordinator.
+- ``NwkcRREQRetryInterval``: [Constant] The duration between retries of a broadcast RREQ command frame.
+- ``NwkcMinRREQJitter``: [Constant] The minimum jitter for broadcast retransmission of a RREQ (msec).
+- ``NwkcMaxRREQJitter``: [Constant] The duration between retries of a broadcast RREQ (msec).
+- ``MaxPendingTxQueueSize``: The maximum size of the table storing pending packets awaiting to be transmitted after discovering a route to the destination.
+
+
+
+Traces
+~~~~~~
+
+The following trace sources have been implemented:
+
+- ``RreqRetriesExhausted``: Trace source indicating when a node has reached the maximum allowed number of RREQ retries during a route discovery request.
+
+Examples and Tests
+------------------
+
+The prent capabilities of the Zigbee module implements only the NWK layer. Generally, Zigbee users are not required (or in some situations even allowed) to access the NWK layer API directly.
+This is because the NWK API is essentially created to provide services to higher Zigbee layers instead (typically the Zigbee APS layer). Nevertheless, direct usage is possible and described by the Zigbee specification.
+The following examples were created to highlight how a Zigbee NWK layer should be used to achieve network joining, discovery, routing, and data transmission capabilities.
+
+All the examples listed here shows scenarios in which a quasi-layer implementation is used to handle incoming or outcoming events from the NWK layer.
+
+* ``zigbee-direct-join.cc``:  An example showing the NWK layer join process of devices using the orphaning procedure (Direct join).
+* ``zigbee-association-join.cc``:  An example showing the NWK layer join process of 3 devices in a zigbee network (MAC association).
+* ``zigbee-nwk-routing.cc``: Shows a simple topology of 5 router devices sequentially joining a network. Data transmission and route discovery (MESH routing) are also shown in this example
+* ``zigbee-nwk-routing-grid.cc``: Shows a complex grid topology of 50 router devices sequentially joining a network. Route discovery (MANY-TO-ONE routing) is also shown in this example.
+
+The following unit test have been developed to ensure the correct behavior of the module:
+
+* ``zigbee-rreq-test``: Test some situations in which RREQ messages should be retried during a route discovery process.
+
+
+Validation
+----------
+
+No formal validation has been done.
+
+
+References
+----------
+
+[`1 <https://csa-iot.org/developer-resource/specifications-download-request/>`_] Zigbee Pro Specification 2017 (R22 1.0)
+
+[`2 <https://dsr-iot.com/downloads/open-source-zigbee/>`_] DSR Z-boss stack 1.0
+
+[`3 <https://www.digi.com/resources/documentation/Digidocs/90002002/Default.htm#Containers/cont_xbee_pro_zigbee_networks.htm?TocPath=Zigbee%2520networks%257C_____0>`_] XBee/XBee-PRO® S2C Zigbee® RF Module User Guide
+
+[4] Farahani, Shahin. ZigBee wireless networks and transceivers. Newnes, 2011.
+
+[5] Gislason, Drew. Zigbee wireless networking. Newnes, 2008.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/zigbee/examples/CMakeLists.txt ns-3.44/src/zigbee/examples/CMakeLists.txt
--- ns-3.43/src/zigbee/examples/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/zigbee/examples/CMakeLists.txt	2025-03-09 16:55:49.819372700 -0700
@@ -0,0 +1,18 @@
+set(base_examples
+    zigbee-nwk-direct-join
+    zigbee-nwk-association-join
+    zigbee-nwk-routing
+    zigbee-nwk-routing-grid
+)
+
+foreach(
+  example
+  ${base_examples}
+)
+  build_lib_example(
+    NAME ${example}
+    SOURCE_FILES ${example}.cc
+    LIBRARIES_TO_LINK ${libzigbee}
+                      ${liblr-wpan}
+  )
+endforeach()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/zigbee/examples/zigbee-nwk-association-join.cc ns-3.44/src/zigbee/examples/zigbee-nwk-association-join.cc
--- ns-3.43/src/zigbee/examples/zigbee-nwk-association-join.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/zigbee/examples/zigbee-nwk-association-join.cc	2025-03-09 16:55:49.819372700 -0700
@@ -0,0 +1,255 @@
+/*
+ * Copyright (c) 2024 Tokushima University, Japan
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Author:
+ *
+ *  Alberto Gallegos Ramonet <alramonet@is.tokushima-u.ac.jp>
+ */
+
+/**
+ * This example shows the procedure to form a multi-hop network using an association-based join.
+ * The procedure requires a sequence of primitive calls on a specific order in the indicated
+ * devices.
+ *
+ *
+ *  Network Extended PAN id: 0X000000000000CA:FE (based on the PAN coordinator address)
+ *
+ *  1-Network-Formation(dev0)                2-Network Discovery(dev1)      4-Network
+ * Discovery(dev2) 3-Router Start(dev1)
+ *
+ *  Zigbee Coordinator(ZC)                      Router(ZR1)                         Router(ZR2)
+ *  (dev 0) ------------------------------------ (dev 1) ---------------------------- (dev 2)
+ *  [00:00:00:00:00:00:CA:FE]          [00:00:00:00:00:00:00:01]         [00:00:00:00:00:00:00:02]
+ *  [00:00]                            [short addr assigned by ZC]       [short addr assigned by
+ * ZR1]
+ *
+ *  1- Channel scanning, pan id selection, start network (initiation of zigbee coordinator)
+ *  2-
+ */
+
+#include "ns3/constant-position-mobility-model.h"
+#include "ns3/core-module.h"
+#include "ns3/log.h"
+#include "ns3/lr-wpan-module.h"
+#include "ns3/packet.h"
+#include "ns3/propagation-delay-model.h"
+#include "ns3/propagation-loss-model.h"
+#include "ns3/simulator.h"
+#include "ns3/single-model-spectrum-channel.h"
+#include "ns3/zigbee-module.h"
+
+#include <iostream>
+
+using namespace ns3;
+using namespace ns3::lrwpan;
+using namespace ns3::zigbee;
+
+NS_LOG_COMPONENT_DEFINE("ZigbeeAssociationJoin");
+
+static void
+NwkDataIndication(Ptr<ZigbeeStack> stack, NldeDataIndicationParams params, Ptr<Packet> p)
+{
+    std::cout << "Received packet of size " << p->GetSize() << "\n";
+}
+
+static void
+NwkNetworkFormationConfirm(Ptr<ZigbeeStack> stack, NlmeNetworkFormationConfirmParams params)
+{
+    std::cout << "NlmeNetworkFormationConfirmStatus = " << params.m_status << "\n";
+}
+
+static void
+NwkNetworkDiscoveryConfirm(Ptr<ZigbeeStack> stack, NlmeNetworkDiscoveryConfirmParams params)
+{
+    // See Zigbee Specification r22.1.0, 3.6.1.4.1
+    // This method implements a simplistic version of the method implemented
+    // in a zigbee APL layer. In this layer a candidate Extended PAN Id must
+    // be selected and a NLME-JOIN.request must be issued.
+
+    if (params.m_status == NwkStatus::SUCCESS)
+    {
+        std::cout << " Network discovery confirm Received. Networks found:\n";
+
+        for (const auto& netDescriptor : params.m_netDescList)
+        {
+            std::cout << " ExtPanID: 0x" << std::hex << netDescriptor.m_extPanId << std::dec
+                      << " CH:  " << static_cast<uint32_t>(netDescriptor.m_logCh) << std::hex
+                      << " Pan Id: 0x" << netDescriptor.m_panId << " stackprofile " << std::dec
+                      << static_cast<uint32_t>(netDescriptor.m_stackProfile) << "\n";
+        }
+
+        NlmeJoinRequestParams joinParams;
+
+        zigbee::CapabilityInformation capaInfo;
+        capaInfo.SetDeviceType(ROUTER);
+        capaInfo.SetAllocateAddrOn(true);
+
+        joinParams.m_rejoinNetwork = zigbee::JoiningMethod::ASSOCIATION;
+        joinParams.m_capabilityInfo = capaInfo.GetCapability();
+        joinParams.m_extendedPanId = params.m_netDescList[0].m_extPanId;
+
+        Simulator::ScheduleNow(&ZigbeeNwk::NlmeJoinRequest, stack->GetNwk(), joinParams);
+    }
+    else
+    {
+        NS_ABORT_MSG("Unable to discover networks | status: " << params.m_status);
+    }
+}
+
+static void
+NwkJoinConfirm(Ptr<ZigbeeStack> stack, NlmeJoinConfirmParams params)
+{
+    if (params.m_status == NwkStatus::SUCCESS)
+    {
+        std::cout << Simulator::Now().As(Time::S)
+                  << " The device joined the network SUCCESSFULLY with short address " << std::hex
+                  << params.m_networkAddress << " on the Extended PAN Id: " << std::hex
+                  << params.m_extendedPanId << "\n"
+                  << std::dec;
+
+        // 3 - After dev 1 is associated, it should be started as a router
+        //     (i.e. it becomes able to accept request from other devices to join the network)
+        NlmeStartRouterRequestParams startRouterParams;
+        Simulator::ScheduleNow(&ZigbeeNwk::NlmeStartRouterRequest,
+                               stack->GetNwk(),
+                               startRouterParams);
+    }
+    else
+    {
+        std::cout << " The device FAILED to join the network with status " << params.m_status
+                  << "\n";
+    }
+}
+
+int
+main(int argc, char* argv[])
+{
+    LogComponentEnableAll(LogLevel(LOG_PREFIX_TIME | LOG_PREFIX_FUNC | LOG_PREFIX_NODE));
+    LogComponentEnable("ZigbeeNwk", LOG_LEVEL_DEBUG);
+    // LogComponentEnable("LrWpanMac", LOG_LEVEL_DEBUG);
+    // LogComponentEnable("LrWpanPhy", LOG_LEVEL_DEBUG);
+
+    NodeContainer nodes;
+    nodes.Create(3);
+
+    //// Configure MAC
+
+    LrWpanHelper lrWpanHelper;
+    NetDeviceContainer lrwpanDevices = lrWpanHelper.Install(nodes);
+    Ptr<LrWpanNetDevice> dev0 = lrwpanDevices.Get(0)->GetObject<LrWpanNetDevice>();
+    Ptr<LrWpanNetDevice> dev1 = lrwpanDevices.Get(1)->GetObject<LrWpanNetDevice>();
+    Ptr<LrWpanNetDevice> dev2 = lrwpanDevices.Get(2)->GetObject<LrWpanNetDevice>();
+
+    dev0->GetMac()->SetExtendedAddress("00:00:00:00:00:00:CA:FE");
+    dev1->GetMac()->SetExtendedAddress("00:00:00:00:00:00:00:01");
+    dev2->GetMac()->SetExtendedAddress("00:00:00:00:00:00:00:02");
+
+    Ptr<SingleModelSpectrumChannel> channel = CreateObject<SingleModelSpectrumChannel>();
+    Ptr<LogDistancePropagationLossModel> propModel =
+        CreateObject<LogDistancePropagationLossModel>();
+
+    Ptr<ConstantSpeedPropagationDelayModel> delayModel =
+        CreateObject<ConstantSpeedPropagationDelayModel>();
+
+    channel->AddPropagationLossModel(propModel);
+    channel->SetPropagationDelayModel(delayModel);
+
+    dev0->SetChannel(channel);
+    dev1->SetChannel(channel);
+    dev2->SetChannel(channel);
+
+    //// Configure NWK
+
+    ZigbeeHelper zigbee;
+    ZigbeeStackContainer zigbeeStackContainer = zigbee.Install(lrwpanDevices);
+
+    Ptr<ZigbeeStack> zstack0 = zigbeeStackContainer.Get(0)->GetObject<ZigbeeStack>();
+    Ptr<ZigbeeStack> zstack1 = zigbeeStackContainer.Get(1)->GetObject<ZigbeeStack>();
+    Ptr<ZigbeeStack> zstack2 = zigbeeStackContainer.Get(2)->GetObject<ZigbeeStack>();
+
+    //// Configure Nodes Mobility
+
+    Ptr<ConstantPositionMobilityModel> dev0Mobility = CreateObject<ConstantPositionMobilityModel>();
+    dev0Mobility->SetPosition(Vector(0, 0, 0));
+    dev0->GetPhy()->SetMobility(dev0Mobility);
+
+    Ptr<ConstantPositionMobilityModel> dev1Mobility = CreateObject<ConstantPositionMobilityModel>();
+    dev1Mobility->SetPosition(Vector(0, 10, 0));
+    dev1->GetPhy()->SetMobility(dev1Mobility);
+
+    Ptr<ConstantPositionMobilityModel> dev2Mobility = CreateObject<ConstantPositionMobilityModel>();
+    dev2Mobility->SetPosition(Vector(0, 20, 0)); // try with distance of 95
+    dev2->GetPhy()->SetMobility(dev2Mobility);
+
+    // NWK callbacks hooks
+
+    zstack0->GetNwk()->SetNlmeNetworkFormationConfirmCallback(
+        MakeBoundCallback(&NwkNetworkFormationConfirm, zstack0));
+
+    zstack0->GetNwk()->SetNldeDataIndicationCallback(
+        MakeBoundCallback(&NwkDataIndication, zstack0));
+
+    zstack1->GetNwk()->SetNldeDataIndicationCallback(
+        MakeBoundCallback(&NwkDataIndication, zstack1));
+
+    zstack2->GetNwk()->SetNldeDataIndicationCallback(
+        MakeBoundCallback(&NwkDataIndication, zstack2));
+
+    zstack1->GetNwk()->SetNlmeNetworkDiscoveryConfirmCallback(
+        MakeBoundCallback(&NwkNetworkDiscoveryConfirm, zstack1));
+
+    zstack2->GetNwk()->SetNlmeNetworkDiscoveryConfirmCallback(
+        MakeBoundCallback(&NwkNetworkDiscoveryConfirm, zstack2));
+
+    zstack2->GetNwk()->SetNlmeJoinConfirmCallback(MakeBoundCallback(&NwkJoinConfirm, zstack2));
+
+    zstack1->GetNwk()->SetNlmeJoinConfirmCallback(MakeBoundCallback(&NwkJoinConfirm, zstack1));
+
+    zstack2->GetNwk()->SetNlmeJoinConfirmCallback(MakeBoundCallback(&NwkJoinConfirm, zstack2));
+
+    // 1 - Initiate the Zigbee coordinator, start the network
+    NlmeNetworkFormationRequestParams netFormParams;
+    netFormParams.m_scanChannelList.channelPageCount = 1;
+    netFormParams.m_scanChannelList.channelsField[0] = ALL_CHANNELS;
+    netFormParams.m_scanDuration = 0;
+    netFormParams.m_superFrameOrder = 15;
+    netFormParams.m_beaconOrder = 15;
+
+    Simulator::ScheduleWithContext(zstack0->GetNode()->GetId(),
+                                   Seconds(1),
+                                   &ZigbeeNwk::NlmeNetworkFormationRequest,
+                                   zstack0->GetNwk(),
+                                   netFormParams);
+
+    // 2- Let the dev1 (Router) discovery the coordinator and join the network, after
+    //    this, it will become router itself(call to NLME-START-ROUTER.request).
+    NlmeNetworkDiscoveryRequestParams netDiscParams;
+    netDiscParams.m_scanChannelList.channelPageCount = 1;
+    netDiscParams.m_scanChannelList.channelsField[0] = 0x7800;
+    netDiscParams.m_scanDuration = 14;
+    Simulator::ScheduleWithContext(zstack1->GetNode()->GetId(),
+                                   Seconds(3),
+                                   &ZigbeeNwk::NlmeNetworkDiscoveryRequest,
+                                   zstack1->GetNwk(),
+                                   netDiscParams);
+
+    // 4- (Note: Look for step 3 in NetworkDiscoveryRequestConfirm)
+    // Let the dev2 discover the PAN coordinator or a router and join the network,
+    // after this, it will become a router itself
+
+    NlmeNetworkDiscoveryRequestParams netDiscParams2;
+    netDiscParams2.m_scanChannelList.channelPageCount = 1;
+    netDiscParams2.m_scanChannelList.channelsField[0] = 0x7800;
+    netDiscParams2.m_scanDuration = 14;
+    Simulator::ScheduleWithContext(zstack2->GetNode()->GetId(),
+                                   Seconds(1020),
+                                   &ZigbeeNwk::NlmeNetworkDiscoveryRequest,
+                                   zstack2->GetNwk(),
+                                   netDiscParams2);
+
+    Simulator::Run();
+    Simulator::Destroy();
+    return 0;
+}
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/zigbee/examples/zigbee-nwk-direct-join.cc ns-3.44/src/zigbee/examples/zigbee-nwk-direct-join.cc
--- ns-3.43/src/zigbee/examples/zigbee-nwk-direct-join.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/zigbee/examples/zigbee-nwk-direct-join.cc	2025-03-09 16:55:49.819372700 -0700
@@ -0,0 +1,258 @@
+/*
+ * Copyright (c) 2024 Tokushima University, Japan
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Authors:
+ *
+ *  Alberto Gallegos Ramonet <alramonet@is.tokushima-u.ac.jp>
+ */
+
+/**
+ * This example shows the procedure to form a multi-hop network using a direct-join
+ * procedure (a.k.a. orphaning procedure). The procedure requires a sequence of primitive
+ * calls on a specific order in the indicated devices
+ *
+ *
+ *  1-Network-Formation                       3-Join(dev1)                       6-Join(dev2)
+ *  2-Direct-Join (dev1)                     4-Router-Start(dev1)
+ *                                           5-Direct-Join (dev2)
+ *
+ *  Zigbee Coordinator(ZC)                           Router(ZR)                         End Device
+ *  (dev 0) ------------------------------------ (dev 1) ---------------------------- (dev 2)
+ *  [00:00:00:00:00:00:CA:FE]          [00:00:00:00:00:00:00:01]         [00:00:00:00:00:00:00:02]
+ *  [00:00]                            [short addr assigned by ZC]       [short addr assigned by ZR]
+ *
+ *  1- Channel scanning, pan id selection, start network (initiation of zigbee coordinator)
+ *  2- Manual registration of the joined device 1 into the zigbee coordinator
+ *  3- Confirmation of the joined device 1 with the coordinator
+ *  4- Initiate device 1 as a router
+ *  5- Manual registration of device 2 into the zigbee router (device 1)
+ *  6- Confirmation of the joined device 2 with the router.
+ */
+
+#include "ns3/constant-position-mobility-model.h"
+#include "ns3/core-module.h"
+#include "ns3/log.h"
+#include "ns3/lr-wpan-module.h"
+#include "ns3/packet.h"
+#include "ns3/propagation-delay-model.h"
+#include "ns3/propagation-loss-model.h"
+#include "ns3/simulator.h"
+#include "ns3/single-model-spectrum-channel.h"
+#include "ns3/zigbee-module.h"
+
+#include <iostream>
+
+using namespace ns3;
+using namespace ns3::lrwpan;
+using namespace ns3::zigbee;
+
+NS_LOG_COMPONENT_DEFINE("ZigbeeDirectJoin");
+
+static void
+NwkDataIndication(Ptr<ZigbeeStack> stack, NldeDataIndicationParams params, Ptr<Packet> p)
+{
+    std::cout << "Received packet of size " << p->GetSize() << "\n";
+}
+
+static void
+NwkNetworkFormationConfirm(Ptr<ZigbeeStack> stack, NlmeNetworkFormationConfirmParams params)
+{
+    std::cout << "NlmeNetworkFormationConfirmStatus = " << params.m_status << "\n";
+}
+
+static void
+NwkDirectJoinConfirm(Ptr<ZigbeeStack> stack, NlmeDirectJoinConfirmParams params)
+{
+    std::cout << "NlmeDirectJoinConfirmStatus = " << params.m_status << "\n";
+}
+
+static void
+NwkJoinConfirm(Ptr<ZigbeeStack> stack, NlmeJoinConfirmParams params)
+{
+    if (params.m_status == NwkStatus::SUCCESS)
+    {
+        std::cout << " The device join the network SUCCESSFULLY with short address "
+                  << params.m_networkAddress << "\n";
+    }
+    else
+    {
+        std::cout << " The device FAILED to join the network with status " << params.m_status
+                  << "\n";
+    }
+}
+
+int
+main(int argc, char* argv[])
+{
+    LogComponentEnableAll(LogLevel(LOG_PREFIX_TIME | LOG_PREFIX_FUNC | LOG_PREFIX_NODE));
+    LogComponentEnable("ZigbeeNwk", LOG_LEVEL_DEBUG);
+
+    NodeContainer nodes;
+    nodes.Create(3);
+
+    //// Configure MAC
+
+    LrWpanHelper lrWpanHelper;
+    NetDeviceContainer lrwpanDevices = lrWpanHelper.Install(nodes);
+    Ptr<LrWpanNetDevice> dev0 = lrwpanDevices.Get(0)->GetObject<LrWpanNetDevice>();
+    Ptr<LrWpanNetDevice> dev1 = lrwpanDevices.Get(1)->GetObject<LrWpanNetDevice>();
+    Ptr<LrWpanNetDevice> dev2 = lrwpanDevices.Get(2)->GetObject<LrWpanNetDevice>();
+
+    dev0->GetMac()->SetExtendedAddress("00:00:00:00:00:00:CA:FE");
+    // dev0->GetMac()->SetShortAddress("00:00");
+
+    dev1->GetMac()->SetExtendedAddress("00:00:00:00:00:00:00:01");
+    dev2->GetMac()->SetExtendedAddress("00:00:00:00:00:00:00:02");
+
+    Ptr<SingleModelSpectrumChannel> channel = CreateObject<SingleModelSpectrumChannel>();
+    Ptr<LogDistancePropagationLossModel> propModel =
+        CreateObject<LogDistancePropagationLossModel>();
+
+    Ptr<ConstantSpeedPropagationDelayModel> delayModel =
+        CreateObject<ConstantSpeedPropagationDelayModel>();
+
+    channel->AddPropagationLossModel(propModel);
+    channel->SetPropagationDelayModel(delayModel);
+
+    dev0->SetChannel(channel);
+    dev1->SetChannel(channel);
+    dev2->SetChannel(channel);
+
+    //// Configure NWK
+
+    ZigbeeHelper zigbee;
+    ZigbeeStackContainer zigbeeStackContainer = zigbee.Install(lrwpanDevices);
+
+    Ptr<ZigbeeStack> zstack0 = zigbeeStackContainer.Get(0)->GetObject<ZigbeeStack>();
+    Ptr<ZigbeeStack> zstack1 = zigbeeStackContainer.Get(1)->GetObject<ZigbeeStack>();
+    Ptr<ZigbeeStack> zstack2 = zigbeeStackContainer.Get(2)->GetObject<ZigbeeStack>();
+
+    //// Configure Nodes Mobility
+
+    Ptr<ConstantPositionMobilityModel> sender0Mobility =
+        CreateObject<ConstantPositionMobilityModel>();
+    sender0Mobility->SetPosition(Vector(0, 0, 0));
+    dev0->GetPhy()->SetMobility(sender0Mobility);
+
+    Ptr<ConstantPositionMobilityModel> sender1Mobility =
+        CreateObject<ConstantPositionMobilityModel>();
+    sender1Mobility->SetPosition(Vector(0, 10, 0));
+    dev1->GetPhy()->SetMobility(sender1Mobility);
+
+    Ptr<ConstantPositionMobilityModel> sender2Mobility =
+        CreateObject<ConstantPositionMobilityModel>();
+    sender2Mobility->SetPosition(Vector(0, 20, 0));
+    dev2->GetPhy()->SetMobility(sender2Mobility);
+
+    // NWK callbacks hooks
+
+    zstack0->GetNwk()->SetNlmeNetworkFormationConfirmCallback(
+        MakeBoundCallback(&NwkNetworkFormationConfirm, zstack0));
+
+    zstack0->GetNwk()->SetNlmeDirectJoinConfirmCallback(
+        MakeBoundCallback(&NwkDirectJoinConfirm, zstack0));
+
+    zstack0->GetNwk()->SetNldeDataIndicationCallback(
+        MakeBoundCallback(&NwkDataIndication, zstack0));
+
+    zstack1->GetNwk()->SetNldeDataIndicationCallback(
+        MakeBoundCallback(&NwkDataIndication, zstack1));
+
+    zstack2->GetNwk()->SetNldeDataIndicationCallback(
+        MakeBoundCallback(&NwkDataIndication, zstack2));
+
+    zstack1->GetNwk()->SetNlmeJoinConfirmCallback(MakeBoundCallback(&NwkJoinConfirm, zstack1));
+
+    zstack2->GetNwk()->SetNlmeJoinConfirmCallback(MakeBoundCallback(&NwkJoinConfirm, zstack2));
+
+    // 1 - Initiate the Zigbee coordinator, start the network
+    NlmeNetworkFormationRequestParams netFormParams;
+    netFormParams.m_scanChannelList.channelPageCount = 1;
+    netFormParams.m_scanChannelList.channelsField[0] = ALL_CHANNELS;
+    netFormParams.m_scanDuration = 0;
+    netFormParams.m_superFrameOrder = 15;
+    netFormParams.m_beaconOrder = 15;
+
+    Simulator::ScheduleWithContext(0,
+                                   Seconds(0),
+                                   &ZigbeeNwk::NlmeNetworkFormationRequest,
+                                   zstack0->GetNwk(),
+                                   netFormParams);
+
+    // Configure the capability information used in the joining devices.
+    CapabilityInformation capaInfo;
+    capaInfo.SetDeviceType(zigbee::MacDeviceType::ROUTER);
+    capaInfo.SetAllocateAddrOn(true);
+
+    // 2- Register dev 1 (Mac64Addr .....00:01) to Zigbee coordinator (dev 0) directly
+    NlmeDirectJoinRequestParams directParams;
+    directParams.m_capabilityInfo = capaInfo.GetCapability();
+    directParams.m_deviceAddr = Mac64Address("00:00:00:00:00:00:00:01");
+
+    Simulator::ScheduleWithContext(0,
+                                   Seconds(5),
+                                   &ZigbeeNwk::NlmeDirectJoinRequest,
+                                   zstack0->GetNwk(),
+                                   directParams);
+
+    // 3- Use join request(type= DIRECT_OR_REJOIN) to initiate an orphaning procedure and request
+    //    the information registered in the coordinator in the previous step.
+    // Notes :
+    // - ScanDuration is fixed for DIRECT_OR_REJOIN type (macResponseWaitTime)
+    //   and therefore, the scanDuration parameter is ignored.
+    // - Future communications can fail if extendendPanId is set incorrectly,
+    //   this value is the value of the PAN coordinator extended address (IEEEAddress).
+    //   This value cannot be verified during a DIRECT_OR_REJOIN join type.
+    NlmeJoinRequestParams joinParams;
+    joinParams.m_rejoinNetwork = zigbee::JoiningMethod::DIRECT_OR_REJOIN;
+    joinParams.m_scanChannelList.channelPageCount = 1;
+    joinParams.m_scanChannelList.channelsField[0] = ALL_CHANNELS;
+    joinParams.m_capabilityInfo = capaInfo.GetCapability();
+    joinParams.m_extendedPanId = Mac64Address("00:00:00:00:00:00:CA:FE").ConvertToInt();
+
+    Simulator::ScheduleWithContext(1,
+                                   MilliSeconds(5500),
+                                   &ZigbeeNwk::NlmeJoinRequest,
+                                   zstack1->GetNwk(),
+                                   joinParams);
+
+    // 4 - Use start-router on device 1, to initiate it as router
+    //     (i.e. it becomes able to accept request from other devices to join the network)
+    NlmeStartRouterRequestParams startRouterParams;
+    Simulator::ScheduleWithContext(1,
+                                   MilliSeconds(5600),
+                                   &ZigbeeNwk::NlmeStartRouterRequest,
+                                   zstack1->GetNwk(),
+                                   startRouterParams);
+
+    NlmeDirectJoinRequestParams directParams2;
+    directParams2.m_capabilityInfo = capaInfo.GetCapability();
+    directParams2.m_deviceAddr = Mac64Address("00:00:00:00:00:00:00:02");
+
+    Simulator::ScheduleWithContext(1,
+                                   MilliSeconds(6000),
+                                   &ZigbeeNwk::NlmeDirectJoinRequest,
+                                   zstack1->GetNwk(),
+                                   directParams2);
+
+    NlmeJoinRequestParams joinParams2;
+    joinParams2.m_rejoinNetwork = zigbee::JoiningMethod::DIRECT_OR_REJOIN;
+    joinParams2.m_scanChannelList.channelPageCount = 1;
+    joinParams2.m_scanChannelList.channelsField[0] = ALL_CHANNELS;
+    joinParams2.m_capabilityInfo = capaInfo.GetCapability();
+    joinParams2.m_extendedPanId = Mac64Address("00:00:00:00:00:00:CA:FE").ConvertToInt();
+
+    Simulator::ScheduleWithContext(2,
+                                   MilliSeconds(6100),
+                                   &ZigbeeNwk::NlmeJoinRequest,
+                                   zstack2->GetNwk(),
+                                   joinParams2);
+
+    Simulator::Stop(Seconds(10));
+    Simulator::Run();
+
+    Simulator::Destroy();
+    return 0;
+}
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/zigbee/examples/zigbee-nwk-routing.cc ns-3.44/src/zigbee/examples/zigbee-nwk-routing.cc
--- ns-3.43/src/zigbee/examples/zigbee-nwk-routing.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/zigbee/examples/zigbee-nwk-routing.cc	2025-03-09 16:55:49.819372700 -0700
@@ -0,0 +1,427 @@
+/*
+ * Copyright (c) 2024 Tokushima University, Japan
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Authors:
+ *
+ *  Alberto Gallegos Ramonet <alramonet@is.tokushima-u.ac.jp>
+ */
+
+/**
+ * Mesh routing example with data transmission using a simple topology.
+ *
+ * This example shows the NWK layer procedure to perform a route request.
+ * Prior the route discovery and data transmission, an association-based join is performed.
+ * The procedure requires a sequence of primitive calls on a specific order in the indicated
+ * devices.
+ *
+ *
+ *  Network Extended PAN id: 0X000000000000CA:FE (based on the PAN coordinator address)
+ *
+ *  Devices Addresses:
+ *
+ *  [Coordinator] ZC  (dev0 | Node 0): [00:00:00:00:00:00:CA:FE]  [00:00]
+ *  [Router 1]    ZR1 (dev1 | Node 1): [00:00:00:00:00:00:00:01]  [short addr assigned by ZC]
+ *  [Router 2]    ZR2 (dev2 | Node 2): [00:00:00:00:00:00:00:02]  [short addr assigned by ZR1]
+ *  [Router 3]    ZR3 (dev3 | Node 3): [00:00:00:00:00:00:00:03]  [short addr assigned by ZR2]
+ *  [Router 4]    ZR4 (dev4 | Node 4): [00:00:00:00:00:00:00:04]  [short addr assigned by ZR1]
+ *
+ *  Topology:
+ *
+ *  ZC--------ZR1------------ZR2----------ZR3
+ *             |
+ *             |
+ *            ZR4
+ */
+
+#include "ns3/constant-position-mobility-model.h"
+#include "ns3/core-module.h"
+#include "ns3/log.h"
+#include "ns3/lr-wpan-module.h"
+#include "ns3/packet.h"
+#include "ns3/propagation-delay-model.h"
+#include "ns3/propagation-loss-model.h"
+#include "ns3/simulator.h"
+#include "ns3/single-model-spectrum-channel.h"
+#include "ns3/zigbee-module.h"
+
+#include <iostream>
+
+using namespace ns3;
+using namespace ns3::lrwpan;
+using namespace ns3::zigbee;
+
+NS_LOG_COMPONENT_DEFINE("ZigbeeRouting");
+
+ZigbeeStackContainer zigbeeStacks;
+
+static void
+TraceRoute(Mac16Address src, Mac16Address dst)
+{
+    std::cout << "\nTime " << Simulator::Now().As(Time::S) << " | "
+              << "Traceroute to destination [" << dst << "]:\n";
+    Mac16Address target = src;
+    uint32_t count = 1;
+    while (target != Mac16Address("FF:FF") && target != dst)
+    {
+        Ptr<ZigbeeStack> zstack;
+
+        for (auto i = zigbeeStacks.Begin(); i != zigbeeStacks.End(); i++)
+        {
+            zstack = *i;
+            if (zstack->GetNwk()->GetNetworkAddress() == target)
+            {
+                break;
+            }
+        }
+
+        bool neighbor = false;
+        target = zstack->GetNwk()->FindRoute(dst, neighbor);
+        if (target == Mac16Address("FF:FF"))
+        {
+            std::cout << count << ". Node " << zstack->GetNode()->GetId() << " ["
+                      << zstack->GetNwk()->GetNetworkAddress() << " | "
+                      << zstack->GetNwk()->GetIeeeAddress() << "]: "
+                      << " Destination Unreachable\n";
+        }
+        else
+        {
+            std::cout << count << ". Node " << zstack->GetNode()->GetId() << " ["
+                      << zstack->GetNwk()->GetNetworkAddress() << " | "
+                      << zstack->GetNwk()->GetIeeeAddress() << "]: "
+                      << "NextHop [" << target << "] ";
+            if (neighbor)
+            {
+                std::cout << "(*Neighbor)\n";
+            }
+            else
+            {
+                std::cout << "\n";
+            }
+            count++;
+        }
+    }
+    std::cout << "\n";
+}
+
+static void
+NwkDataIndication(Ptr<ZigbeeStack> stack, NldeDataIndicationParams params, Ptr<Packet> p)
+{
+    std::cout << Simulator::Now().As(Time::S) << " Node " << stack->GetNode()->GetId() << " | "
+              << "NsdeDataIndication:  Received packet of size " << p->GetSize() << "\n";
+}
+
+static void
+NwkNetworkFormationConfirm(Ptr<ZigbeeStack> stack, NlmeNetworkFormationConfirmParams params)
+{
+    std::cout << "NlmeNetworkFormationConfirmStatus = " << params.m_status << "\n";
+}
+
+static void
+NwkNetworkDiscoveryConfirm(Ptr<ZigbeeStack> stack, NlmeNetworkDiscoveryConfirmParams params)
+{
+    // See Zigbee Specification r22.1.0, 3.6.1.4.1
+    // This method implements a simplistic version of the method implemented
+    // in a zigbee APL layer. In this layer a candidate Extended PAN Id must
+    // be selected and a NLME-JOIN.request must be issued.
+
+    if (params.m_status == NwkStatus::SUCCESS)
+    {
+        std::cout << " Network discovery confirm Received. Networks found ("
+                  << params.m_netDescList.size() << "):\n";
+
+        for (const auto& netDescriptor : params.m_netDescList)
+        {
+            std::cout << " ExtPanID: 0x" << std::hex << netDescriptor.m_extPanId << "\n"
+                      << std::dec << " CH:  " << static_cast<uint32_t>(netDescriptor.m_logCh)
+                      << "\n"
+                      << std::hex << " Pan ID: 0x" << netDescriptor.m_panId << "\n"
+                      << " Stack profile: " << std::dec
+                      << static_cast<uint32_t>(netDescriptor.m_stackProfile) << "\n"
+                      << "--------------------\n";
+        }
+
+        NlmeJoinRequestParams joinParams;
+
+        zigbee::CapabilityInformation capaInfo;
+        capaInfo.SetDeviceType(ROUTER);
+        capaInfo.SetAllocateAddrOn(true);
+
+        joinParams.m_rejoinNetwork = zigbee::JoiningMethod::ASSOCIATION;
+        joinParams.m_capabilityInfo = capaInfo.GetCapability();
+        joinParams.m_extendedPanId = params.m_netDescList[0].m_extPanId;
+
+        Simulator::ScheduleNow(&ZigbeeNwk::NlmeJoinRequest, stack->GetNwk(), joinParams);
+    }
+    else
+    {
+        NS_ABORT_MSG("Unable to discover networks | status: " << params.m_status);
+    }
+}
+
+static void
+NwkJoinConfirm(Ptr<ZigbeeStack> stack, NlmeJoinConfirmParams params)
+{
+    if (params.m_status == NwkStatus::SUCCESS)
+    {
+        std::cout << Simulator::Now().As(Time::S) << " Node " << stack->GetNode()->GetId() << " | "
+                  << " The device joined the network SUCCESSFULLY with short address " << std::hex
+                  << params.m_networkAddress << " on the Extended PAN Id: " << std::hex
+                  << params.m_extendedPanId << "\n"
+                  << std::dec;
+
+        // 3 - After dev 1 is associated, it should be started as a router
+        //     (i.e. it becomes able to accept request from other devices to join the network)
+        NlmeStartRouterRequestParams startRouterParams;
+        Simulator::ScheduleNow(&ZigbeeNwk::NlmeStartRouterRequest,
+                               stack->GetNwk(),
+                               startRouterParams);
+    }
+    else
+    {
+        std::cout << " The device FAILED to join the network with status " << params.m_status
+                  << "\n";
+    }
+}
+
+static void
+NwkRouteDiscoveryConfirm(Ptr<ZigbeeStack> stack, NlmeRouteDiscoveryConfirmParams params)
+{
+    std::cout << "NlmeRouteDiscoveryConfirmStatus = " << params.m_status << "\n";
+}
+
+static void
+SendData(Ptr<ZigbeeStack> stackSrc, Ptr<ZigbeeStack> stackDst)
+{
+    // Send data from a device with stackSrc to device with stackDst.
+
+    // We do not know what network address will be assigned after the JOIN procedure
+    // but we can request the network address from stackDst (the destination device) when
+    // we intend to send data. If a route do not exist, we will search for a route
+    // before transmitting data (Mesh routing).
+
+    Ptr<Packet> p = Create<Packet>(5);
+    NldeDataRequestParams dataReqParams;
+    dataReqParams.m_dstAddrMode = UCST_BCST;
+    dataReqParams.m_dstAddr = stackDst->GetNwk()->GetNetworkAddress();
+    dataReqParams.m_nsduHandle = 1;
+    dataReqParams.m_discoverRoute = ENABLE_ROUTE_DISCOVERY;
+
+    Simulator::ScheduleNow(&ZigbeeNwk::NldeDataRequest, stackSrc->GetNwk(), dataReqParams, p);
+
+    // Give a few seconds to allow the creation of the route and
+    // then print the route trace and tables from the source
+    Simulator::Schedule(Seconds(3),
+                        &TraceRoute,
+                        stackSrc->GetNwk()->GetNetworkAddress(),
+                        stackDst->GetNwk()->GetNetworkAddress());
+
+    Ptr<OutputStreamWrapper> stream = Create<OutputStreamWrapper>(&std::cout);
+    Simulator::Schedule(Seconds(4), &ZigbeeNwk::PrintNeighborTable, stackSrc->GetNwk(), stream);
+
+    Simulator::Schedule(Seconds(4), &ZigbeeNwk::PrintRoutingTable, stackSrc->GetNwk(), stream);
+
+    Simulator::Schedule(Seconds(4),
+                        &ZigbeeNwk::PrintRouteDiscoveryTable,
+                        stackSrc->GetNwk(),
+                        stream);
+}
+
+int
+main(int argc, char* argv[])
+{
+    LogComponentEnableAll(LogLevel(LOG_PREFIX_TIME | LOG_PREFIX_FUNC | LOG_PREFIX_NODE));
+    // Enable logs for further details
+    // LogComponentEnable("ZigbeeNwk", LOG_LEVEL_DEBUG);
+
+    RngSeedManager::SetSeed(3);
+    RngSeedManager::SetRun(4);
+
+    NodeContainer nodes;
+    nodes.Create(5);
+
+    //// Configure MAC
+
+    LrWpanHelper lrWpanHelper;
+    NetDeviceContainer lrwpanDevices = lrWpanHelper.Install(nodes);
+    Ptr<LrWpanNetDevice> dev0 = lrwpanDevices.Get(0)->GetObject<LrWpanNetDevice>();
+    Ptr<LrWpanNetDevice> dev1 = lrwpanDevices.Get(1)->GetObject<LrWpanNetDevice>();
+    Ptr<LrWpanNetDevice> dev2 = lrwpanDevices.Get(2)->GetObject<LrWpanNetDevice>();
+    Ptr<LrWpanNetDevice> dev3 = lrwpanDevices.Get(3)->GetObject<LrWpanNetDevice>();
+    Ptr<LrWpanNetDevice> dev4 = lrwpanDevices.Get(4)->GetObject<LrWpanNetDevice>();
+
+    // Device must ALWAYS have IEEE Address (Extended address) assigned.
+    // Network address (short address) are assigned by the the JOIN mechanism
+    dev0->GetMac()->SetExtendedAddress("00:00:00:00:00:00:CA:FE");
+    dev1->GetMac()->SetExtendedAddress("00:00:00:00:00:00:00:01");
+    dev2->GetMac()->SetExtendedAddress("00:00:00:00:00:00:00:02");
+    dev3->GetMac()->SetExtendedAddress("00:00:00:00:00:00:00:03");
+    dev4->GetMac()->SetExtendedAddress("00:00:00:00:00:00:00:04");
+
+    Ptr<SingleModelSpectrumChannel> channel = CreateObject<SingleModelSpectrumChannel>();
+    Ptr<LogDistancePropagationLossModel> propModel =
+        CreateObject<LogDistancePropagationLossModel>();
+
+    Ptr<ConstantSpeedPropagationDelayModel> delayModel =
+        CreateObject<ConstantSpeedPropagationDelayModel>();
+
+    channel->AddPropagationLossModel(propModel);
+    channel->SetPropagationDelayModel(delayModel);
+
+    dev0->SetChannel(channel);
+    dev1->SetChannel(channel);
+    dev2->SetChannel(channel);
+    dev3->SetChannel(channel);
+    dev4->SetChannel(channel);
+
+    //// Configure NWK
+
+    ZigbeeHelper zigbee;
+    ZigbeeStackContainer zigbeeStackContainer = zigbee.Install(lrwpanDevices);
+
+    Ptr<ZigbeeStack> zstack0 = zigbeeStackContainer.Get(0)->GetObject<ZigbeeStack>();
+    Ptr<ZigbeeStack> zstack1 = zigbeeStackContainer.Get(1)->GetObject<ZigbeeStack>();
+    Ptr<ZigbeeStack> zstack2 = zigbeeStackContainer.Get(2)->GetObject<ZigbeeStack>();
+    Ptr<ZigbeeStack> zstack3 = zigbeeStackContainer.Get(3)->GetObject<ZigbeeStack>();
+    Ptr<ZigbeeStack> zstack4 = zigbeeStackContainer.Get(4)->GetObject<ZigbeeStack>();
+
+    // Add the stacks to a container to later on print routes.
+    zigbeeStacks.Add(zstack0);
+    zigbeeStacks.Add(zstack1);
+    zigbeeStacks.Add(zstack2);
+    zigbeeStacks.Add(zstack3);
+    zigbeeStacks.Add(zstack4);
+
+    // Assign streams to the zigbee stacks to obtain
+    // reprodusable results from random events occurring inside the stack.
+    zstack0->GetNwk()->AssignStreams(0);
+    zstack1->GetNwk()->AssignStreams(10);
+    zstack2->GetNwk()->AssignStreams(20);
+    zstack3->GetNwk()->AssignStreams(30);
+    zstack4->GetNwk()->AssignStreams(40);
+
+    //// Configure Nodes Mobility
+
+    Ptr<ConstantPositionMobilityModel> dev0Mobility = CreateObject<ConstantPositionMobilityModel>();
+    dev0Mobility->SetPosition(Vector(0, 0, 0));
+    dev0->GetPhy()->SetMobility(dev0Mobility);
+
+    Ptr<ConstantPositionMobilityModel> dev1Mobility = CreateObject<ConstantPositionMobilityModel>();
+    dev1Mobility->SetPosition(Vector(90, 0, 0));
+    dev1->GetPhy()->SetMobility(dev1Mobility);
+
+    Ptr<ConstantPositionMobilityModel> dev2Mobility = CreateObject<ConstantPositionMobilityModel>();
+    dev2Mobility->SetPosition(Vector(170, 0, 0));
+    dev2->GetPhy()->SetMobility(dev2Mobility);
+
+    Ptr<ConstantPositionMobilityModel> dev3Mobility = CreateObject<ConstantPositionMobilityModel>();
+    dev3Mobility->SetPosition(Vector(250, 0, 0));
+    dev3->GetPhy()->SetMobility(dev3Mobility);
+
+    Ptr<ConstantPositionMobilityModel> dev4Mobility = CreateObject<ConstantPositionMobilityModel>();
+    dev4Mobility->SetPosition(Vector(90, 50, 0));
+    dev4->GetPhy()->SetMobility(dev4Mobility);
+
+    // NWK callbacks hooks
+    // These hooks are usually directly connected to the APS layer
+    // In this case, there is no APS layer, therefore, we connect the event outputs
+    // of all devices directly to our static functions in this example.
+
+    zstack0->GetNwk()->SetNlmeNetworkFormationConfirmCallback(
+        MakeBoundCallback(&NwkNetworkFormationConfirm, zstack0));
+    zstack0->GetNwk()->SetNlmeRouteDiscoveryConfirmCallback(
+        MakeBoundCallback(&NwkRouteDiscoveryConfirm, zstack0));
+
+    zstack0->GetNwk()->SetNldeDataIndicationCallback(
+        MakeBoundCallback(&NwkDataIndication, zstack0));
+    zstack1->GetNwk()->SetNldeDataIndicationCallback(
+        MakeBoundCallback(&NwkDataIndication, zstack1));
+    zstack2->GetNwk()->SetNldeDataIndicationCallback(
+        MakeBoundCallback(&NwkDataIndication, zstack2));
+    zstack3->GetNwk()->SetNldeDataIndicationCallback(
+        MakeBoundCallback(&NwkDataIndication, zstack3));
+    zstack4->GetNwk()->SetNldeDataIndicationCallback(
+        MakeBoundCallback(&NwkDataIndication, zstack4));
+
+    zstack1->GetNwk()->SetNlmeNetworkDiscoveryConfirmCallback(
+        MakeBoundCallback(&NwkNetworkDiscoveryConfirm, zstack1));
+    zstack2->GetNwk()->SetNlmeNetworkDiscoveryConfirmCallback(
+        MakeBoundCallback(&NwkNetworkDiscoveryConfirm, zstack2));
+    zstack3->GetNwk()->SetNlmeNetworkDiscoveryConfirmCallback(
+        MakeBoundCallback(&NwkNetworkDiscoveryConfirm, zstack3));
+    zstack4->GetNwk()->SetNlmeNetworkDiscoveryConfirmCallback(
+        MakeBoundCallback(&NwkNetworkDiscoveryConfirm, zstack4));
+
+    zstack1->GetNwk()->SetNlmeJoinConfirmCallback(MakeBoundCallback(&NwkJoinConfirm, zstack1));
+    zstack2->GetNwk()->SetNlmeJoinConfirmCallback(MakeBoundCallback(&NwkJoinConfirm, zstack2));
+    zstack3->GetNwk()->SetNlmeJoinConfirmCallback(MakeBoundCallback(&NwkJoinConfirm, zstack3));
+    zstack4->GetNwk()->SetNlmeJoinConfirmCallback(MakeBoundCallback(&NwkJoinConfirm, zstack4));
+
+    // 1 - Initiate the Zigbee coordinator, start the network
+    // ALL_CHANNELS = 0x07FFF800 (Channels 11~26)
+    NlmeNetworkFormationRequestParams netFormParams;
+    netFormParams.m_scanChannelList.channelPageCount = 1;
+    netFormParams.m_scanChannelList.channelsField[0] = ALL_CHANNELS;
+    netFormParams.m_scanDuration = 0;
+    netFormParams.m_superFrameOrder = 15;
+    netFormParams.m_beaconOrder = 15;
+
+    Simulator::ScheduleWithContext(zstack0->GetNode()->GetId(),
+                                   Seconds(1),
+                                   &ZigbeeNwk::NlmeNetworkFormationRequest,
+                                   zstack0->GetNwk(),
+                                   netFormParams);
+
+    // 2- Schedule devices sequentially find and join the network.
+    //    After this procedure, each device make a NLME-START-ROUTER.request to become a router
+
+    NlmeNetworkDiscoveryRequestParams netDiscParams;
+    netDiscParams.m_scanChannelList.channelPageCount = 1;
+    netDiscParams.m_scanChannelList.channelsField[0] = 0x00007800; // BitMap: Channels 11~14
+    netDiscParams.m_scanDuration = 2;
+    Simulator::ScheduleWithContext(zstack1->GetNode()->GetId(),
+                                   Seconds(3),
+                                   &ZigbeeNwk::NlmeNetworkDiscoveryRequest,
+                                   zstack1->GetNwk(),
+                                   netDiscParams);
+
+    NlmeNetworkDiscoveryRequestParams netDiscParams2;
+    netDiscParams2.m_scanChannelList.channelPageCount = 1;
+    netDiscParams2.m_scanChannelList.channelsField[0] = 0x00007800; // BitMap: Channels 11~14
+    netDiscParams2.m_scanDuration = 2;
+    Simulator::ScheduleWithContext(zstack2->GetNode()->GetId(),
+                                   Seconds(4),
+                                   &ZigbeeNwk::NlmeNetworkDiscoveryRequest,
+                                   zstack2->GetNwk(),
+                                   netDiscParams2);
+
+    NlmeNetworkDiscoveryRequestParams netDiscParams3;
+    netDiscParams2.m_scanChannelList.channelPageCount = 1;
+    netDiscParams2.m_scanChannelList.channelsField[0] = 0x00007800; // BitMap: Channels 11~14
+    netDiscParams2.m_scanDuration = 2;
+    Simulator::ScheduleWithContext(zstack3->GetNode()->GetId(),
+                                   Seconds(5),
+                                   &ZigbeeNwk::NlmeNetworkDiscoveryRequest,
+                                   zstack3->GetNwk(),
+                                   netDiscParams3);
+
+    NlmeNetworkDiscoveryRequestParams netDiscParams4;
+    netDiscParams4.m_scanChannelList.channelPageCount = 1;
+    netDiscParams4.m_scanChannelList.channelsField[0] = 0x00007800; // BitMap: Channels 11~14
+    netDiscParams4.m_scanDuration = 2;
+    Simulator::ScheduleWithContext(zstack4->GetNode()->GetId(),
+                                   Seconds(6),
+                                   &ZigbeeNwk::NlmeNetworkDiscoveryRequest,
+                                   zstack4->GetNwk(),
+                                   netDiscParams4);
+
+    // 5- Find Route and Send data
+
+    Simulator::Schedule(Seconds(8), &SendData, zstack0, zstack3);
+
+    Simulator::Stop(Seconds(20));
+    Simulator::Run();
+    Simulator::Destroy();
+    return 0;
+}
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/zigbee/examples/zigbee-nwk-routing-grid.cc ns-3.44/src/zigbee/examples/zigbee-nwk-routing-grid.cc
--- ns-3.43/src/zigbee/examples/zigbee-nwk-routing-grid.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/zigbee/examples/zigbee-nwk-routing-grid.cc	2025-03-09 16:55:49.819372700 -0700
@@ -0,0 +1,365 @@
+/*
+ * Copyright (c) 2024 Tokushima University, Japan
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Author:
+ *
+ *  Alberto Gallegos Ramonet <alramonet@is.tokushima-u.ac.jp>
+ */
+
+/**
+ *  Many to one routing example in a grid topology.
+ *
+ *  Topology:
+ *
+ *  Grid Topology: 50 nodes separated by 30 m around them, 20 nodes per row for
+ *  the first two rows
+ *
+ *      (Node 0)
+ *         |
+ *         v
+ *         * * * * * * * * * * * * * * * * * * * *
+ *         * * * * * * * * * * * * * * * * * * * *
+ *         * * * * * * * * * *  <--- (Node 49)
+ *
+ *  This example is a more complex version of zigbee-nwk-routing.cc.
+ *  The top left node is the coordinator while the rest of the nodes join
+ *  the network sequentially and they initiate as routers.
+ *
+ *  After all devices join the network a MANY-TO-ONE route discovery is issued
+ *  to create the routes from all the nodes towards the concentrator (Node 0).
+ *
+ *  At the end of the example, the contents of all the tables (Neighbor, Discovery, routing)
+ *  in the source node (Node 49) are displayed.
+ *
+ *  Also the trace route from Node 49 to Node 0 is displayed.
+ *  No data is transmitted in this example.
+ *  All devices are routers excepting the first node which is the coordinator.
+ *
+ */
+
+#include "ns3/core-module.h"
+#include "ns3/log.h"
+#include "ns3/lr-wpan-module.h"
+#include "ns3/mobility-module.h"
+#include "ns3/packet.h"
+#include "ns3/propagation-delay-model.h"
+#include "ns3/propagation-loss-model.h"
+#include "ns3/simulator.h"
+#include "ns3/single-model-spectrum-channel.h"
+#include "ns3/zigbee-module.h"
+
+#include <iostream>
+
+using namespace ns3;
+using namespace ns3::lrwpan;
+using namespace ns3::zigbee;
+
+ZigbeeStackContainer zigbeeStacks;
+
+static void
+TraceRoute(Mac16Address src, Mac16Address dst)
+{
+    std::cout << "\n";
+    std::cout << "Traceroute to destination [" << dst << "] (Time: " << Simulator::Now().As(Time::S)
+              << "):\n";
+    Mac16Address target = src;
+    uint32_t count = 1;
+    while (target != Mac16Address("FF:FF") && target != dst)
+    {
+        Ptr<ZigbeeStack> zstack;
+
+        for (auto i = zigbeeStacks.Begin(); i != zigbeeStacks.End(); i++)
+        {
+            zstack = *i;
+            if (zstack->GetNwk()->GetNetworkAddress() == target)
+            {
+                break;
+            }
+        }
+
+        bool neighbor = false;
+        target = zstack->GetNwk()->FindRoute(dst, neighbor);
+        if (target == Mac16Address("FF:FF"))
+        {
+            std::cout << count << ". Node " << zstack->GetNode()->GetId() << " ["
+                      << zstack->GetNwk()->GetNetworkAddress() << " | "
+                      << zstack->GetNwk()->GetIeeeAddress() << "]: "
+                      << " Destination Unreachable\n";
+        }
+        else
+        {
+            std::cout << count << ". Node " << zstack->GetNode()->GetId() << " ["
+                      << zstack->GetNwk()->GetNetworkAddress() << " | "
+                      << zstack->GetNwk()->GetIeeeAddress() << "]: "
+                      << "NextHop [" << target << "] ";
+            if (neighbor)
+            {
+                std::cout << "(*Neighbor)\n";
+            }
+            else
+            {
+                std::cout << "\n";
+            }
+            count++;
+        }
+    }
+    std::cout << "\n";
+}
+
+static void
+CreateManyToOneRoutes(Ptr<ZigbeeStack> zigbeeStackConcentrator, Ptr<ZigbeeStack> zigbeeStackSrc)
+{
+    // Generate all the routes to the concentrator device
+    NlmeRouteDiscoveryRequestParams routeDiscParams;
+    routeDiscParams.m_dstAddrMode = NO_ADDRESS;
+    Simulator::ScheduleNow(&ZigbeeNwk::NlmeRouteDiscoveryRequest,
+                           zigbeeStackConcentrator->GetNwk(),
+                           routeDiscParams);
+
+    // Give a few seconds to allow the creation of the route and
+    // then print the route trace and tables from the source
+    Simulator::Schedule(Seconds(3),
+                        &TraceRoute,
+                        zigbeeStackSrc->GetNwk()->GetNetworkAddress(),
+                        zigbeeStackConcentrator->GetNwk()->GetNetworkAddress());
+
+    // Print the content of the source device tables (Neighbor, Discovery, Routing)
+    Ptr<OutputStreamWrapper> stream = Create<OutputStreamWrapper>(&std::cout);
+    Simulator::Schedule(Seconds(4),
+                        &ZigbeeNwk::PrintNeighborTable,
+                        zigbeeStackSrc->GetNwk(),
+                        stream);
+
+    Simulator::Schedule(Seconds(4),
+                        &ZigbeeNwk::PrintRoutingTable,
+                        zigbeeStackSrc->GetNwk(),
+                        stream);
+
+    Simulator::Schedule(Seconds(4),
+                        &ZigbeeNwk::PrintRouteDiscoveryTable,
+                        zigbeeStackSrc->GetNwk(),
+                        stream);
+}
+
+static void
+NwkDataIndication(Ptr<ZigbeeStack> stack, NldeDataIndicationParams params, Ptr<Packet> p)
+{
+    std::cout << "Received packet of size " << p->GetSize() << "\n";
+}
+
+static void
+NwkNetworkFormationConfirm(Ptr<ZigbeeStack> stack, NlmeNetworkFormationConfirmParams params)
+{
+    std::cout << "NlmeNetworkFormationConfirmStatus = " << params.m_status << "\n";
+}
+
+static void
+NwkNetworkDiscoveryConfirm(Ptr<ZigbeeStack> stack, NlmeNetworkDiscoveryConfirmParams params)
+{
+    // See Zigbee Specification r22.1.0, 3.6.1.4.1
+    // This method implements a simplistic version of the method implemented
+    // in a zigbee APL layer. In this layer a candidate Extended PAN Id must
+    // be selected and a NLME-JOIN.request must be issued.
+
+    if (params.m_status == NwkStatus::SUCCESS)
+    {
+        std::cout << "    Network discovery confirm Received. Networks found "
+                  << "(" << params.m_netDescList.size() << ")\n";
+
+        for (const auto& netDescriptor : params.m_netDescList)
+        {
+            std::cout << "      ExtPanID: 0x" << std::hex << netDescriptor.m_extPanId << std::dec
+                      << "\n"
+                      << "      CH:  " << static_cast<uint32_t>(netDescriptor.m_logCh) << std::hex
+                      << "\n"
+                      << "      Pan Id: 0x" << netDescriptor.m_panId << std::hex << "\n"
+                      << "      stackprofile: " << std::dec
+                      << static_cast<uint32_t>(netDescriptor.m_stackProfile) << "\n"
+                      << "      ----------------\n ";
+        }
+
+        NlmeJoinRequestParams joinParams;
+
+        zigbee::CapabilityInformation capaInfo;
+        capaInfo.SetDeviceType(ROUTER);
+        capaInfo.SetAllocateAddrOn(true);
+
+        joinParams.m_rejoinNetwork = zigbee::JoiningMethod::ASSOCIATION;
+        joinParams.m_capabilityInfo = capaInfo.GetCapability();
+        joinParams.m_extendedPanId = params.m_netDescList[0].m_extPanId;
+
+        Simulator::ScheduleNow(&ZigbeeNwk::NlmeJoinRequest, stack->GetNwk(), joinParams);
+    }
+    else
+    {
+        std::cout << " WARNING: Unable to discover networks | status: " << params.m_status << "\n";
+    }
+}
+
+static void
+NwkJoinConfirm(Ptr<ZigbeeStack> stack, NlmeJoinConfirmParams params)
+{
+    if (params.m_status == NwkStatus::SUCCESS)
+    {
+        std::cout << Simulator::Now().As(Time::S)
+                  << " The device joined the network SUCCESSFULLY with short address [" << std::hex
+                  << params.m_networkAddress << "] on the Extended PAN Id: " << std::hex
+                  << params.m_extendedPanId << "\n"
+                  << std::dec;
+
+        // 3 - After dev  is associated, it should be started as a router
+        //     (i.e. it becomes able to accept request from other devices to join the network)
+        NlmeStartRouterRequestParams startRouterParams;
+        Simulator::ScheduleNow(&ZigbeeNwk::NlmeStartRouterRequest,
+                               stack->GetNwk(),
+                               startRouterParams);
+    }
+    else
+    {
+        std::cout << Simulator::Now().As(Time::S)
+                  << " The device FAILED to join the network with status " << params.m_status
+                  << "\n";
+    }
+}
+
+static void
+NwkRouteDiscoveryConfirm(Ptr<ZigbeeStack> stack, NlmeRouteDiscoveryConfirmParams params)
+{
+    std::cout << "NlmeRouteDiscoveryConfirmStatus = " << params.m_status << "\n";
+}
+
+int
+main(int argc, char* argv[])
+{
+    LogComponentEnableAll(LogLevel(LOG_PREFIX_TIME | LOG_PREFIX_FUNC | LOG_PREFIX_NODE));
+    // Enable logs for further details
+    // LogComponentEnable("ZigbeeNwk", LOG_LEVEL_DEBUG);
+
+    NodeContainer nodes;
+    nodes.Create(50);
+
+    MobilityHelper mobility;
+    mobility.SetPositionAllocator("ns3::GridPositionAllocator",
+                                  "MinX",
+                                  DoubleValue(0.0),
+                                  "MinY",
+                                  DoubleValue(0.0),
+                                  "DeltaX",
+                                  DoubleValue(30.0),
+                                  "DeltaY",
+                                  DoubleValue(30.0),
+                                  "GridWidth",
+                                  UintegerValue(20),
+                                  "LayoutType",
+                                  StringValue("RowFirst"));
+
+    mobility.Install(nodes);
+
+    Ptr<SingleModelSpectrumChannel> channel = CreateObject<SingleModelSpectrumChannel>();
+    Ptr<LogDistancePropagationLossModel> propModel =
+        CreateObject<LogDistancePropagationLossModel>();
+    Ptr<ConstantSpeedPropagationDelayModel> delayModel =
+        CreateObject<ConstantSpeedPropagationDelayModel>();
+
+    channel->AddPropagationLossModel(propModel);
+    channel->SetPropagationDelayModel(delayModel);
+
+    LrWpanHelper lrWpanHelper;
+    lrWpanHelper.SetChannel(channel);
+
+    NetDeviceContainer lrwpanDevices = lrWpanHelper.Install(nodes);
+
+    // Set the extended address to all devices (EUI-64)
+    // Device must ALWAYS have IEEE Address (Extended address) assigned.
+    // Network address (short address) are assigned by the the JOIN mechanism
+    // In this case we use the helper to assign a sequential extended addresses
+    // to all nodes in the simulation.
+    lrWpanHelper.SetExtendedAddresses(lrwpanDevices);
+
+    ZigbeeHelper zigbeeHelper;
+    zigbeeStacks = zigbeeHelper.Install(lrwpanDevices);
+
+    // NWK callbacks hooks
+    // These hooks are usually directly connected to the APS layer
+    // In this case, there is no APS layer, therefore, we connect the event outputs
+    // of all devices directly to our static functions in this example.
+    for (auto i = zigbeeStacks.Begin(); i != zigbeeStacks.End(); i++)
+    {
+        Ptr<ZigbeeStack> zstack = *i;
+        // NLME-NETWORK-FORMATION.Confirm
+        zstack->GetNwk()->SetNlmeNetworkFormationConfirmCallback(
+            MakeBoundCallback(&NwkNetworkFormationConfirm, zstack));
+        // NLDE-DATA.Indication
+        zstack->GetNwk()->SetNldeDataIndicationCallback(
+            MakeBoundCallback(&NwkDataIndication, zstack));
+        // NLDE-NETWORK-DISCOVERY.Confirm
+        zstack->GetNwk()->SetNlmeNetworkDiscoveryConfirmCallback(
+            MakeBoundCallback(&NwkNetworkDiscoveryConfirm, zstack));
+        // NLME-JOIN.Confirm
+        zstack->GetNwk()->SetNlmeJoinConfirmCallback(MakeBoundCallback(&NwkJoinConfirm, zstack));
+        // NLME-ROUTE-DISCOVERY.Confirm
+        zstack->GetNwk()->SetNlmeRouteDiscoveryConfirmCallback(
+            MakeBoundCallback(&NwkRouteDiscoveryConfirm, zstack));
+    }
+
+    for (auto i = zigbeeStacks.Begin(); i != zigbeeStacks.End(); i++)
+    {
+        int index = std::distance(zigbeeStacks.Begin(), i);
+        Ptr<ZigbeeStack> zstack = *i;
+
+        // Assign streams to the zigbee stacks based on the index to obtain
+        // reprodusable results from random events occurring inside the stack.
+        // For example, to obtain the same assigned short address in each device.
+        zstack->GetNwk()->AssignStreams(index);
+
+        if (index == 0)
+        {
+            // 1 - Initiate the Zigbee coordinator, start the network
+            // ALL_CHANNELS = 0x07FFF800 (Channels 11~26)
+            NlmeNetworkFormationRequestParams netFormParams;
+            netFormParams.m_scanChannelList.channelPageCount = 1;
+            netFormParams.m_scanChannelList.channelsField[0] = ALL_CHANNELS;
+            netFormParams.m_scanDuration = 0;
+            netFormParams.m_superFrameOrder = 15;
+            netFormParams.m_beaconOrder = 15;
+
+            Simulator::ScheduleWithContext(zstack->GetNode()->GetId(),
+                                           MilliSeconds(index * 500),
+                                           &ZigbeeNwk::NlmeNetworkFormationRequest,
+                                           zstack->GetNwk(),
+                                           netFormParams);
+        }
+        else
+        {
+            // 2- Let devices discovery the coordinator or routers and join the network, after
+            //    this, it will become router itself(call to NLME-START-ROUTER.request). We
+            //    continue doing the same with the rest of the devices which will discover the
+            //    previously added routers and join the network
+            NlmeNetworkDiscoveryRequestParams netDiscParams;
+            netDiscParams.m_scanChannelList.channelPageCount = 1;
+            netDiscParams.m_scanChannelList.channelsField[0] = 0x00007800; // BitMap: Channels 11~14
+            netDiscParams.m_scanDuration = 0;
+
+            Simulator::ScheduleWithContext(zstack->GetNode()->GetId(),
+                                           Seconds(2 + index * 10),
+                                           &ZigbeeNwk::NlmeNetworkDiscoveryRequest,
+                                           zstack->GetNwk(),
+                                           netDiscParams);
+        }
+    }
+
+    // 3- Create the routes towards the concentrator (Node 0)
+    // Print the trace route from Node 49 to the concentrator (Node 0)
+    // Print the contents of tables in the source of trace (Node 49)
+    Simulator::Schedule(Seconds(500),
+                        &CreateManyToOneRoutes,
+                        zigbeeStacks.Get(0),
+                        zigbeeStacks.Get(49));
+
+    Simulator::Stop(Seconds(1500));
+    Simulator::Run();
+    Simulator::Destroy();
+    return 0;
+}
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/zigbee/helper/zigbee-helper.cc ns-3.44/src/zigbee/helper/zigbee-helper.cc
--- ns-3.43/src/zigbee/helper/zigbee-helper.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/zigbee/helper/zigbee-helper.cc	2025-03-09 16:55:49.819372700 -0700
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2023 Tokushima University, Japan
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Author:
+ *  Alberto Gallegos Ramonet <alramonet@is.tokushima-u.ac.jp>
+ */
+
+#include "zigbee-helper.h"
+
+#include "ns3/log.h"
+#include "ns3/names.h"
+#include "ns3/net-device.h"
+#include "ns3/node.h"
+#include "ns3/zigbee-stack.h"
+
+namespace ns3
+{
+
+NS_LOG_COMPONENT_DEFINE("ZigbeeHelper");
+
+ZigbeeHelper::ZigbeeHelper()
+{
+    NS_LOG_FUNCTION(this);
+    m_stackFactory.SetTypeId("ns3::zigbee::ZigbeeStack");
+}
+
+void
+ZigbeeHelper::SetDeviceAttribute(std::string n1, const AttributeValue& v1)
+{
+    NS_LOG_FUNCTION(this);
+    m_stackFactory.Set(n1, v1);
+}
+
+zigbee::ZigbeeStackContainer
+ZigbeeHelper::Install(const NetDeviceContainer c)
+{
+    NS_LOG_FUNCTION(this);
+
+    zigbee::ZigbeeStackContainer zigbeeStackContainer;
+
+    for (uint32_t i = 0; i < c.GetN(); ++i)
+    {
+        Ptr<NetDevice> device = c.Get(i);
+
+        NS_ASSERT_MSG(device, "NetDevice not found in the node " << i);
+
+        NS_LOG_LOGIC("Installing Zigbee on node " << device->GetNode()->GetId());
+
+        Ptr<zigbee::ZigbeeStack> zigbeeStack = m_stackFactory.Create<zigbee::ZigbeeStack>();
+        zigbeeStackContainer.Add(zigbeeStack);
+        device->GetNode()->AggregateObject(zigbeeStack);
+        zigbeeStack->SetNetDevice(device);
+    }
+    return zigbeeStackContainer;
+}
+
+} // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/zigbee/helper/zigbee-helper.h ns-3.44/src/zigbee/helper/zigbee-helper.h
--- ns-3.43/src/zigbee/helper/zigbee-helper.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/zigbee/helper/zigbee-helper.h	2025-03-09 16:55:49.819372700 -0700
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2023 Tokushima University, Japan
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Author:
+ *  Alberto Gallegos Ramonet <alramonet@is.tokushima-u.ac.jp>
+ */
+
+#ifndef ZIGBEE_HELPER_H
+#define ZIGBEE_HELPER_H
+
+#include "zigbee-stack-container.h"
+
+#include "ns3/net-device-container.h"
+#include "ns3/object-factory.h"
+
+#include <string>
+
+namespace ns3
+{
+
+class Node;
+class AttributeValue;
+class Time;
+
+/**
+ * @ingroup zigbee
+ *
+ *  Setup a Zigbee stack to be used with LrWpanNetDevice.
+ */
+class ZigbeeHelper
+{
+  public:
+    /*
+     * Construct a ZigbeeHelper
+     */
+    ZigbeeHelper();
+    /**
+     * Set an attribute on each ns3::ZigbeeStack created by
+     * ZigbeeHelper::Install.
+     *
+     * @param n1 [in] The name of the attribute to set.
+     * @param v1 [in] The value of the attribute to set.
+     */
+    void SetDeviceAttribute(std::string n1, const AttributeValue& v1);
+
+    /**
+     * Install the Zigbee stack on top of an existing LrWpanNetDevice.
+     *
+     * This function requires a set of properly configured LrWpanNetDevices
+     * passed in as the parameter "c". After the installation,
+     * the set Zigbee stack contains the upper layers that communicate
+     * directly with the application.
+     *
+     * Note that Zigbee is specific designed to be used on top of
+     * LrWpanDevice (IEEE 802.15.4).
+     * Any other protocol will be discarded by Zigbee.
+     *
+     *
+     * @param [in] c The NetDevice container with LrWpanNetDevices.
+     * @return A container with the newly created ZigbeeStacks.
+     */
+    zigbee::ZigbeeStackContainer Install(NetDeviceContainer c);
+
+    /**
+     * Assign a fixed random variable stream number to the random variables
+     * used by this model. Return the number of streams (possibly zero) that
+     * have been assigned. The Install() method should have previously been
+     * called by the user.
+     *
+     * @param [in] c NetDeviceContainer of the set of net devices for which the
+     *          ZigbeeStack should be modified to use a fixed stream.
+     * @param [in] stream First stream index to use.
+     * @return The number of stream indices assigned by this helper.
+     */
+    int64_t AssignStreams(NetDeviceContainer c, int64_t stream);
+
+  private:
+    ObjectFactory m_stackFactory; //!< Zigbee stack object factory.
+};
+
+} // namespace ns3
+
+#endif /* ZIGBEE_HELPER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/zigbee/helper/zigbee-stack-container.cc ns-3.44/src/zigbee/helper/zigbee-stack-container.cc
--- ns-3.43/src/zigbee/helper/zigbee-stack-container.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/zigbee/helper/zigbee-stack-container.cc	2025-03-09 16:55:49.819372700 -0700
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2024 Tokushima University, Japan
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Author:
+ *  Alberto Gallegos Ramonet <alramonet@is.tokushima-u.ac.jp>
+ */
+
+#include "zigbee-stack-container.h"
+
+#include "ns3/names.h"
+
+namespace ns3
+{
+namespace zigbee
+{
+
+ZigbeeStackContainer::ZigbeeStackContainer()
+{
+}
+
+ZigbeeStackContainer::ZigbeeStackContainer(Ptr<ZigbeeStack> stack)
+{
+    m_stacks.emplace_back(stack);
+}
+
+ZigbeeStackContainer::ZigbeeStackContainer(std::string stackName)
+{
+    Ptr<ZigbeeStack> stack = Names::Find<ZigbeeStack>(stackName);
+    m_stacks.emplace_back(stack);
+}
+
+ZigbeeStackContainer::Iterator
+ZigbeeStackContainer::Begin() const
+{
+    return m_stacks.begin();
+}
+
+ZigbeeStackContainer::Iterator
+ZigbeeStackContainer::End() const
+{
+    return m_stacks.end();
+}
+
+uint32_t
+ZigbeeStackContainer::GetN() const
+{
+    return m_stacks.size();
+}
+
+Ptr<ZigbeeStack>
+ZigbeeStackContainer::Get(uint32_t i) const
+{
+    return m_stacks[i];
+}
+
+void
+ZigbeeStackContainer::Add(ZigbeeStackContainer other)
+{
+    for (auto i = other.Begin(); i != other.End(); i++)
+    {
+        m_stacks.emplace_back(*i);
+    }
+}
+
+void
+ZigbeeStackContainer::Add(Ptr<ZigbeeStack> stack)
+{
+    m_stacks.emplace_back(stack);
+}
+
+void
+ZigbeeStackContainer::Add(std::string stackName)
+{
+    Ptr<ZigbeeStack> stack = Names::Find<ZigbeeStack>(stackName);
+    m_stacks.emplace_back(stack);
+}
+
+} // namespace zigbee
+} // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/zigbee/helper/zigbee-stack-container.h ns-3.44/src/zigbee/helper/zigbee-stack-container.h
--- ns-3.43/src/zigbee/helper/zigbee-stack-container.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/zigbee/helper/zigbee-stack-container.h	2025-03-09 16:55:49.819372700 -0700
@@ -0,0 +1,112 @@
+/*
+ * Copyright (c) 2024 Tokushima University, Japan
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Author:
+ *  Alberto Gallegos Ramonet <alramonet@is.tokushima-u.ac.jp>
+ */
+
+#ifndef ZIGBEE_STACK_CONTAINER_H
+#define ZIGBEE_STACK_CONTAINER_H
+
+#include "ns3/zigbee-stack.h"
+
+#include <stdint.h>
+#include <vector>
+
+namespace ns3
+{
+namespace zigbee
+{
+
+/**
+ * Holds a vector of ns3::ZigbeeStack pointers
+ *
+ * Typically ZigbeeStacks are installed on top of a pre-existing NetDevice
+ * (an LrWpanNetDevice) which on itself has already being aggregated to a node.
+ * A ZigbeeHelper Install method takes a LrWpanNetDeviceContainer.
+ * For each of the LrWpanNetDevice in the LrWpanNetDeviceContainer
+ * the helper will instantiate a ZigbeeStack, connect the necessary hooks between
+ * the MAC (LrWpanMac) and the NWK (ZigbeeNwk) and install it to the node.
+ * For each of these ZigbeeStacks, the helper also adds the ZigbeeStack into a Container
+ * for later use by the caller. This is that container used to hold the Ptr<ZigbeeStack> which are
+ * instantiated by the ZigbeeHelper.
+ */
+class ZigbeeStackContainer
+{
+  public:
+    typedef std::vector<Ptr<ZigbeeStack>>::const_iterator
+        Iterator; //!< The iterator used in this Container
+
+    /**
+     * The default constructor, create an empty ZigbeeStackContainer
+     */
+    ZigbeeStackContainer();
+    /**
+     * Create a ZigbeeStackContainer with exactly one ZigbeeStack that has previously
+     * been instantiated
+     *
+     * @param stack A ZigbeeStack to add to the container
+     */
+    ZigbeeStackContainer(Ptr<ZigbeeStack> stack);
+    /**
+     * Create a ZigbeeStackContainer with exactly one device which has been
+     * previously instantiated and assigned a name using the Object name
+     * service.  This ZigbeeStack is specified by its assigned name.
+     *
+     * @param stackName The name of the ZigbeeStack to add to the container
+     *
+     * Create a ZigbeeStackContainer with exactly one device
+     */
+    ZigbeeStackContainer(std::string stackName);
+    /**
+     * Get and iterator which refers to the first ZigbeeStack in the container.
+     * @return An iterator referring to the first ZigbeeStack in the container.
+     */
+    Iterator Begin() const;
+    /**
+     * Get an iterator which indicates past the last ZigbeeStack in the container.
+     * @return An iterator referring to the past the last ZigbeeStack in the container.
+     */
+    Iterator End() const;
+    /**
+     * Get the number of stacks present in the stack container.
+     * @return The number of stacks in the container.
+     */
+    uint32_t GetN() const;
+    /**
+     * Get a stack element from the container.
+     * @param i The element number in the container
+     * @return The zigbee stack element matching the i index in the container.
+     */
+    Ptr<ZigbeeStack> Get(uint32_t i) const;
+    /**
+     * Append the contents of another ZigbeeStackContainer to the end of
+     * this container.
+     *
+     * @param other The ZigbeeStackContainer to append.
+     */
+    void Add(ZigbeeStackContainer other);
+    /**
+     * Append a single Ptr<ZigbeeStack> to this container.
+     *
+     * @param stack The Ptr<ZigbeeStack> to append.
+     */
+    void Add(Ptr<ZigbeeStack> stack);
+    /**
+     * Append to this container the single Ptr<ZigbeeStack> referred to
+     * via its object name service registered name.
+     *
+     * @param stackName The name of the ZigbeeStack object to add to the container.
+     */
+    void Add(std::string stackName);
+
+  private:
+    std::vector<Ptr<ZigbeeStack>> m_stacks; //!< ZigbeeStack smart pointers
+};
+
+} // namespace zigbee
+} // namespace ns3
+
+#endif /* ZIGBEE_STACK_CONTAINER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/zigbee/model/zigbee-nwk.cc ns-3.44/src/zigbee/model/zigbee-nwk.cc
--- ns-3.43/src/zigbee/model/zigbee-nwk.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/zigbee/model/zigbee-nwk.cc	2025-03-09 16:55:49.823372800 -0700
@@ -0,0 +1,3271 @@
+/*
+ * Copyright (c) 2024 Tokushima University, Japan
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Authors:
+ *
+ *  Alberto Gallegos Ramonet <alramonet@is.tokushima-u.ac.jp>
+ *  Ryo Okuda <c611901200@tokushima-u.ac.jp>
+ */
+
+#include "zigbee-nwk.h"
+
+#include "zigbee-nwk-tables.h"
+
+#include "ns3/log.h"
+#include "ns3/packet.h"
+#include "ns3/simulator.h"
+
+using namespace ns3::lrwpan;
+
+#undef NS_LOG_APPEND_CONTEXT
+#define NS_LOG_APPEND_CONTEXT                                                                      \
+    std::clog << "[" << m_nwkNetworkAddress << " | " << m_nwkIeeeAddress << "] ";
+
+namespace ns3
+{
+namespace zigbee
+{
+
+NS_LOG_COMPONENT_DEFINE("ZigbeeNwk");
+NS_OBJECT_ENSURE_REGISTERED(ZigbeeNwk);
+
+TypeId
+ZigbeeNwk::GetTypeId()
+{
+    static TypeId tid =
+        TypeId("ns3::zigbee::ZigbeeNwk")
+            .SetParent<Object>()
+            .SetGroupName("Zigbee")
+            .AddConstructor<ZigbeeNwk>()
+            .AddAttribute("NwkcCoordinatorCapable",
+                          "[Constant] Indicates whether the device is capable of becoming a"
+                          "Zigbee coordinator.",
+                          BooleanValue(true),
+                          MakeBooleanAccessor(&ZigbeeNwk::m_nwkcCoordinatorCapable),
+                          MakeBooleanChecker())
+            .AddAttribute("NwkcProtocolVersion",
+                          "[Constant] The version of the Zigbee NWK protocol in"
+                          "the device (placeholder)",
+                          UintegerValue(0x02),
+                          MakeUintegerAccessor(&ZigbeeNwk::m_nwkcProtocolVersion),
+                          MakeUintegerChecker<uint8_t>())
+            .AddAttribute("NwkcRouteDiscoveryTime",
+                          "[Constant] The duration until a route discovery expires",
+                          TimeValue(MilliSeconds(0x2710)),
+                          MakeTimeAccessor(&ZigbeeNwk::m_nwkcRouteDiscoveryTime),
+                          MakeTimeChecker())
+
+            .AddAttribute("NwkcInitialRREQRetries",
+                          "[Constant] The number of times the first broadcast transmission"
+                          "of a RREQ cmd frame is retried.",
+                          UintegerValue(0x03),
+                          MakeUintegerAccessor(&ZigbeeNwk::m_nwkcInitialRREQRetries),
+                          MakeUintegerChecker<uint8_t>())
+            .AddAttribute("NwkcRREQRetries",
+                          "[Constant] The number of times the broadcast transmission of a"
+                          "RREQ cmd frame is retried on relay by intermediate router or"
+                          "coordinator.",
+                          UintegerValue(0x02),
+                          MakeUintegerAccessor(&ZigbeeNwk::m_nwkcRREQRetries),
+                          MakeUintegerChecker<uint8_t>())
+            .AddAttribute("NwkcRREQRetryInterval",
+                          "[Constant] The duration between retries of a broadcast RREQ "
+                          "cmd frame.",
+                          TimeValue(MilliSeconds(0xFE)),
+                          MakeTimeAccessor(&ZigbeeNwk::m_nwkcRREQRetryInterval),
+                          MakeTimeChecker())
+            .AddAttribute("NwkcMinRREQJitter",
+                          "[Constant] The minimum jitter for broadcast retransmission "
+                          "of a RREQ (msec)",
+                          DoubleValue(2),
+                          MakeDoubleAccessor(&ZigbeeNwk::m_nwkcMinRREQJitter),
+                          MakeDoubleChecker<double>())
+            .AddAttribute("NwkcMaxRREQJitter",
+                          "[Constant] The duration between retries of a broadcast RREQ (msec)",
+                          DoubleValue(128),
+                          MakeDoubleAccessor(&ZigbeeNwk::m_nwkcMaxRREQJitter),
+                          MakeDoubleChecker<double>())
+            .AddAttribute("MaxPendingTxQueueSize",
+                          "The maximum size of the table storing pending packets awaiting "
+                          "to be transmitted after discovering a route to the destination.",
+                          UintegerValue(10),
+                          MakeUintegerAccessor(&ZigbeeNwk::m_maxPendingTxQueueSize),
+                          MakeUintegerChecker<uint32_t>())
+            .AddTraceSource("RreqRetriesExhausted",
+                            "Trace source indicating when a node has "
+                            "reached the maximum allowed number of RREQ retries during a "
+                            "route discovery request",
+                            MakeTraceSourceAccessor(&ZigbeeNwk::m_rreqRetriesExhaustedTrace),
+                            "ns3::zigbee::ZigbeeNwk::RreqRetriesExhaustedTracedCallback");
+    return tid;
+}
+
+ZigbeeNwk::ZigbeeNwk()
+{
+    NS_LOG_FUNCTION(this);
+}
+
+void
+ZigbeeNwk::NotifyConstructionCompleted()
+{
+    NS_LOG_FUNCTION(this);
+
+    m_pendPrimitiveNwk = PendingPrimitiveNwk::NLDE_NLME_NONE;
+    m_uniformRandomVariable = CreateObject<UniformRandomVariable>();
+    m_uniformRandomVariable->SetAttribute("Min", DoubleValue(0.0));
+    m_uniformRandomVariable->SetAttribute("Max", DoubleValue(255.0));
+
+    m_scanEnergyThreshold = 127;
+
+    m_netFormParams = {};
+    m_netFormParamsGen = nullptr;
+    m_beaconPayload = nullptr;
+    m_nwkNetworkAddress = Mac16Address("ff:ff");
+    m_nwkPanId = 0xffff;
+    m_nwkExtendedPanId = 0xffffffffffffffff;
+    m_nwkCapabilityInformation = 0;
+
+    m_nwkStackProfile = ZIGBEE_PRO;
+    m_nwkAddrAlloc = STOCHASTIC_ALLOC;
+    m_nwkMaxDepth = 5;
+    m_nwkMaxChildren = 20;
+    m_nwkMaxRouters = 6;
+    m_nwkEndDeviceTimeoutDefault = 8;
+    m_nwkUseTreeRouting = false;
+
+    m_nwkReportConstantCost = false;
+    m_nwkSymLink = false;
+
+    m_nwkMaxBroadcastRetries = 0x03;
+    m_countRREQRetries = 0;
+
+    m_nwkIsConcentrator = false;
+    m_nwkConcentratorRadius = 5;
+    m_nwkConcentratorDiscoveryTime = 0x00;
+
+    // TODO, set according to equation 3.5.2.1?
+    m_nwkNetworkBroadcastDeliveryTime = Seconds(9);
+
+    m_nwkSequenceNumber = SequenceNumber8(m_uniformRandomVariable->GetValue());
+    m_routeRequestId = SequenceNumber8(m_uniformRandomVariable->GetValue());
+    m_macHandle = SequenceNumber8(m_uniformRandomVariable->GetValue());
+    m_txBufferMaxSize = 10;
+
+    m_rreqJitter = CreateObject<UniformRandomVariable>();
+    m_rreqJitter->SetAttribute("Min", DoubleValue(m_nwkcMinRREQJitter));
+    m_rreqJitter->SetAttribute("Max", DoubleValue(m_nwkcMaxRREQJitter));
+
+    m_routeExpiryTime = Seconds(255);
+}
+
+ZigbeeNwk::~ZigbeeNwk()
+{
+    NS_LOG_FUNCTION(this);
+}
+
+void
+ZigbeeNwk::DoInitialize()
+{
+    NS_LOG_FUNCTION(this);
+    Object::DoInitialize();
+}
+
+void
+ZigbeeNwk::DoDispose()
+{
+    NS_LOG_FUNCTION(this);
+    m_panIdTable.Dispose();
+    m_nwkNeighborTable.Dispose();
+    m_nwkRoutingTable.Dispose();
+    m_nwkRouteDiscoveryTable.Dispose();
+    m_rreqRetryTable.Dispose();
+    m_panIdTable.Dispose();
+    m_btt.Dispose();
+
+    DisposeTxPktBuffer();
+    DisposePendingTx();
+
+    m_nlmeDirectJoinConfirmCallback = MakeNullCallback<void, NlmeDirectJoinConfirmParams>();
+    m_nlmeJoinConfirmCallback = MakeNullCallback<void, NlmeJoinConfirmParams>();
+    m_nlmeJoinIndicationCallback = MakeNullCallback<void, NlmeJoinIndicationParams>();
+    m_nlmeNetworkDiscoveryConfirmCallback =
+        MakeNullCallback<void, NlmeNetworkDiscoveryConfirmParams>();
+    m_nlmeNetworkFormationConfirmCallback =
+        MakeNullCallback<void, NlmeNetworkFormationConfirmParams>();
+    m_nlmeRouteDiscoveryConfirmCallback = MakeNullCallback<void, NlmeRouteDiscoveryConfirmParams>();
+    m_nlmeStartRouterConfirmCallback = MakeNullCallback<void, NlmeStartRouterConfirmParams>();
+
+    m_nldeDataConfirmCallback = MakeNullCallback<void, NldeDataConfirmParams>();
+    m_nldeDataIndicationCallback = MakeNullCallback<void, NldeDataIndicationParams, Ptr<Packet>>();
+
+    m_mac = nullptr;
+
+    Object::DoDispose();
+}
+
+void
+ZigbeeNwk::SetMac(Ptr<LrWpanMacBase> mac)
+{
+    m_mac = mac;
+}
+
+Ptr<LrWpanMacBase>
+ZigbeeNwk::GetMac() const
+{
+    return m_mac;
+}
+
+void
+ZigbeeNwk::PrintRoutingTable(Ptr<OutputStreamWrapper> stream) const
+{
+    std::ostream* os = stream->GetStream();
+    std::ios oldState(nullptr);
+    oldState.copyfmt(*os);
+
+    std::ostringstream nwkAddr;
+    std::ostringstream ieeeAddr;
+
+    nwkAddr << m_nwkNetworkAddress;
+    ieeeAddr << m_nwkIeeeAddress;
+
+    *os << std::resetiosflags(std::ios::adjustfield) << std::setiosflags(std::ios::left);
+    *os << "[" << ieeeAddr.str() << " | " << nwkAddr.str() << "] | ";
+    *os << "Time: " << Simulator::Now().As(Time::S) << " | ";
+    m_nwkRoutingTable.Print(stream);
+}
+
+void
+ZigbeeNwk::PrintRouteDiscoveryTable(Ptr<OutputStreamWrapper> stream)
+{
+    std::ostream* os = stream->GetStream();
+    std::ios oldState(nullptr);
+    oldState.copyfmt(*os);
+
+    std::ostringstream nwkAddr;
+    std::ostringstream ieeeAddr;
+
+    nwkAddr << m_nwkNetworkAddress;
+    ieeeAddr << m_nwkIeeeAddress;
+
+    *os << std::resetiosflags(std::ios::adjustfield) << std::setiosflags(std::ios::left);
+    *os << "[" << ieeeAddr.str() << " | " << nwkAddr.str() << "] | ";
+    *os << "Time: " << Simulator::Now().As(Time::S) << " | ";
+    m_nwkRouteDiscoveryTable.Print(stream);
+}
+
+void
+ZigbeeNwk::PrintNeighborTable(Ptr<OutputStreamWrapper> stream) const
+{
+    std::ostream* os = stream->GetStream();
+    std::ios oldState(nullptr);
+    oldState.copyfmt(*os);
+
+    std::ostringstream nwkAddr;
+    std::ostringstream ieeeAddr;
+
+    nwkAddr << m_nwkNetworkAddress;
+    ieeeAddr << m_nwkIeeeAddress;
+
+    *os << std::resetiosflags(std::ios::adjustfield) << std::setiosflags(std::ios::left);
+    *os << "[" << ieeeAddr.str() << " | " << nwkAddr.str() << "] | ";
+    *os << "Time: " << Simulator::Now().As(Time::S) << " | ";
+    m_nwkNeighborTable.Print(stream);
+}
+
+void
+ZigbeeNwk::PrintRREQRetryTable(Ptr<OutputStreamWrapper> stream) const
+{
+    std::ostream* os = stream->GetStream();
+    std::ios oldState(nullptr);
+    oldState.copyfmt(*os);
+
+    std::ostringstream nwkAddr;
+    std::ostringstream ieeeAddr;
+
+    nwkAddr << m_nwkNetworkAddress;
+    ieeeAddr << m_nwkIeeeAddress;
+
+    *os << std::resetiosflags(std::ios::adjustfield) << std::setiosflags(std::ios::left);
+    *os << "[" << ieeeAddr.str() << " | " << nwkAddr.str() << "] | ";
+    *os << "Time: " << Simulator::Now().As(Time::S) << " | ";
+    m_rreqRetryTable.Print(stream);
+}
+
+Mac16Address
+ZigbeeNwk::FindRoute(Mac16Address dst, bool& neighbor)
+{
+    Ptr<NeighborTableEntry> neighborEntry;
+    if (m_nwkNeighborTable.LookUpEntry(dst, neighborEntry))
+    {
+        neighbor = true;
+        return dst;
+    }
+
+    Ptr<RoutingTableEntry> entry;
+    if (m_nwkRoutingTable.LookUpEntry(dst, entry))
+    {
+        if (entry->GetStatus() == ROUTE_ACTIVE)
+        {
+            neighbor = false;
+            return entry->GetNextHopAddr();
+        }
+    }
+
+    neighbor = false;
+    return Mac16Address("FF:FF"); // route not found
+}
+
+Mac16Address
+ZigbeeNwk::GetNetworkAddress() const
+{
+    return m_nwkNetworkAddress;
+}
+
+Mac64Address
+ZigbeeNwk::GetIeeeAddress() const
+{
+    return m_nwkIeeeAddress;
+}
+
+void
+ZigbeeNwk::McpsDataIndication(McpsDataIndicationParams params, Ptr<Packet> msdu)
+{
+    NS_LOG_FUNCTION(this);
+
+    ZigbeeNwkHeader nwkHeader;
+    msdu->RemoveHeader(nwkHeader);
+
+    // Decrease the radius in the network header as it might be retransmitted
+    // to a next hop.
+    uint8_t radius = nwkHeader.GetRadius();
+    nwkHeader.SetRadius(radius - 1);
+
+    // Check if the received frame is from a neighbor and update LQI if necessary
+    Ptr<NeighborTableEntry> neighborEntry;
+    if (m_nwkNeighborTable.LookUpEntry(nwkHeader.GetSrcAddr(), neighborEntry))
+    {
+        neighborEntry->SetLqi(params.m_mpduLinkQuality);
+        neighborEntry->SetOutgoingCost(GetLQINonLinearValue(params.m_mpduLinkQuality));
+    }
+
+    switch (nwkHeader.GetFrameType())
+    {
+    case DATA:
+        if (nwkHeader.IsMulticast())
+        {
+            // DATA MULTICAST
+            NS_FATAL_ERROR("Multicast DATA transmission not supported");
+        }
+        else if (IsBroadcastAddress(nwkHeader.GetDstAddr()))
+        {
+            // DATA BROADCAST
+
+            Ptr<BroadcastTransactionRecord> btr;
+            if (m_btt.LookUpEntry(nwkHeader.GetSeqNum(), btr))
+            {
+                return;
+            }
+
+            // Check the capabilities of the current device
+            CapabilityInformation capability;
+            capability.SetCapability(m_nwkCapabilityInformation);
+
+            bool rebroadcastFlag = false;
+
+            if (nwkHeader.GetDstAddr() == 0xFFFF ||
+                (nwkHeader.GetDstAddr() == 0xFFFD && capability.IsReceiverOnWhenIdle()) ||
+                (nwkHeader.GetDstAddr() == 0xFFFC && capability.GetDeviceType() != ENDDEVICE))
+            {
+                rebroadcastFlag = true;
+            }
+            else if (nwkHeader.GetDstAddr() == 0xFFFB)
+            {
+                NS_FATAL_ERROR("Broadcast to low power routers not supported");
+                return;
+            }
+
+            if (rebroadcastFlag && nwkHeader.GetRadius() > 0)
+            {
+                Ptr<Packet> rebroadcastPkt = msdu->Copy();
+                rebroadcastPkt->AddHeader(nwkHeader);
+                SendDataBcst(rebroadcastPkt, 0);
+            }
+
+            // Add a new broadcast transaction record to the
+            // broadcasst transaction table
+            btr = Create<BroadcastTransactionRecord>(nwkHeader.GetSrcAddr(),
+                                                     nwkHeader.GetSeqNum(),
+                                                     Simulator::Now() +
+                                                         m_nwkNetworkBroadcastDeliveryTime);
+            m_btt.AddEntry(btr);
+
+            if (!m_nldeDataIndicationCallback.IsNull())
+            {
+                NldeDataIndicationParams dataParams;
+                dataParams.m_srcAddr = nwkHeader.GetSrcAddr();
+                dataParams.m_dstAddr = nwkHeader.GetDstAddr();
+                dataParams.m_dstAddrMode = UCST_BCST;
+                dataParams.m_linkQuality = params.m_mpduLinkQuality;
+                dataParams.m_nsduLength = msdu->GetSize();
+                dataParams.m_rxTime = Simulator::Now();
+                dataParams.m_securityUse = false;
+                m_nldeDataIndicationCallback(dataParams, msdu);
+            }
+        }
+        else
+        {
+            // DATA UNICAST
+            if (nwkHeader.GetDstAddr() == m_nwkNetworkAddress)
+            {
+                // Zigbee specification r22.1.0 Sections 3.6.2.2 and 3.6.3.3
+                if (!m_nldeDataIndicationCallback.IsNull())
+                {
+                    NldeDataIndicationParams dataParams;
+                    dataParams.m_srcAddr = nwkHeader.GetSrcAddr();
+                    dataParams.m_dstAddr = nwkHeader.GetDstAddr();
+                    dataParams.m_dstAddrMode = UCST_BCST;
+                    dataParams.m_linkQuality = params.m_mpduLinkQuality;
+                    dataParams.m_nsduLength = msdu->GetSize();
+                    dataParams.m_rxTime = Simulator::Now();
+                    dataParams.m_securityUse = false;
+                    m_nldeDataIndicationCallback(dataParams, msdu);
+                }
+            }
+            else
+            {
+                // This is not the packet destination,
+                // Add again the network header to the DATA packet and
+                // route the packet to the next hop
+                msdu->AddHeader(nwkHeader);
+                SendDataUcst(msdu, 0);
+            }
+        }
+        break;
+    case NWK_COMMAND: {
+        ZigbeePayloadType payloadType;
+        msdu->RemoveHeader(payloadType);
+
+        if (payloadType.GetCmdType() == ROUTE_REQ_CMD || payloadType.GetCmdType() == ROUTE_REP_CMD)
+        {
+            CapabilityInformation capability;
+            capability.SetCapability(m_nwkCapabilityInformation);
+            if (capability.GetDeviceType() != ROUTER)
+            {
+                // Received RREQ  or RREP but the device
+                // has no routing capabilities
+                return;
+            }
+        }
+        // NOTE: this cover the cases for MESH routing
+        // TREE routing is not supported
+        uint8_t linkCost = GetLinkCost(params.m_mpduLinkQuality);
+
+        if (payloadType.GetCmdType() == ROUTE_REQ_CMD)
+        {
+            ZigbeePayloadRouteRequestCommand payload;
+            msdu->RemoveHeader(payload);
+            // Zigbee specification r22.1.0 Section 3.6.3.5.2
+            ReceiveRREQ(params.m_srcAddr, linkCost, nwkHeader, payload);
+        }
+        else if (payloadType.GetCmdType() == ROUTE_REP_CMD)
+        {
+            ZigbeePayloadRouteReplyCommand payload;
+            msdu->RemoveHeader(payload);
+            // Zigbee specification r22.1.0 Section 3.6.3.5.3
+            ReceiveRREP(params.m_srcAddr, linkCost, nwkHeader, payload);
+        }
+        break;
+    }
+    case INTER_PAN:
+        NS_LOG_ERROR("Inter PAN frame received but not supported");
+        break;
+    default:
+        NS_LOG_ERROR("Unknown frame received in NWK layer");
+    }
+}
+
+void
+ZigbeeNwk::ReceiveRREQ(Mac16Address macSrcAddr,
+                       uint8_t linkCost,
+                       ZigbeeNwkHeader nwkHeader,
+                       ZigbeePayloadRouteRequestCommand payload)
+{
+    NS_LOG_FUNCTION(this);
+
+    if (nwkHeader.GetSrcAddr() == m_nwkNetworkAddress)
+    {
+        // I am the original initiator of the RREQ, ignore request
+        return;
+    }
+
+    // Calculate the pathcost on the RREQ receiving device
+    uint8_t pathCost = linkCost + payload.GetPathCost();
+
+    // Many-to-one routing
+
+    if (payload.GetCmdOptManyToOneField() != ManyToOne::NO_MANY_TO_ONE)
+    {
+        RouteDiscoveryStatus routeStatus =
+            ProcessManyToOneRoute(macSrcAddr, pathCost, nwkHeader, payload);
+
+        // Update the path cost of the RREQ
+        payload.SetPathCost(pathCost);
+
+        // Note: At this point we already have the updated radius, which was updated as soon
+        // as the frame was received (i.e. In the MCPS-DATA.indication).
+
+        if (routeStatus == MANY_TO_ONE_ROUTE || routeStatus == ROUTE_UPDATED)
+        {
+            Simulator::Schedule(MilliSeconds(m_rreqJitter->GetValue()),
+                                &ZigbeeNwk::SendRREQ,
+                                this,
+                                nwkHeader,
+                                payload,
+                                0);
+            m_nwkSequenceNumber++;
+            m_routeRequestId++;
+        }
+        return;
+    }
+
+    // Mesh Routing
+
+    Mac16Address nextHop;
+    RouteDiscoveryStatus nextHopStatus =
+        FindNextHop(macSrcAddr, pathCost, nwkHeader, payload, nextHop);
+
+    if (payload.GetDstAddr() == m_nwkNetworkAddress || nextHopStatus == ROUTE_FOUND)
+    {
+        // RREQ is for this device or its children
+        NS_LOG_DEBUG("RREQ is for me or my children, sending a RREP to [" << macSrcAddr << "]");
+
+        SendRREP(macSrcAddr,
+                 nwkHeader.GetSrcAddr(),
+                 payload.GetDstAddr(),
+                 payload.GetRouteReqId(),
+                 pathCost);
+    }
+    else if (nextHopStatus == ROUTE_NOT_FOUND || nextHopStatus == ROUTE_UPDATED)
+    {
+        NS_LOG_DEBUG("Route for device [" << payload.GetDstAddr()
+                                          << "] not found, forwarding RREQ");
+
+        // Update path cost and resend the RREQ
+        payload.SetPathCost(pathCost);
+        Simulator::Schedule(MilliSeconds(m_rreqJitter->GetValue()),
+                            &ZigbeeNwk::SendRREQ,
+                            this,
+                            nwkHeader,
+                            payload,
+                            m_nwkcRREQRetries);
+    }
+}
+
+void
+ZigbeeNwk::ReceiveRREP(Mac16Address macSrcAddr,
+                       uint8_t linkCost,
+                       ZigbeeNwkHeader nwkHeader,
+                       ZigbeePayloadRouteReplyCommand payload)
+{
+    NS_LOG_FUNCTION(this);
+
+    // RREP received, cancel any ongoing RREQ retry events for that
+    // RREQ ID and remove entry from RREQ retry table.
+    Ptr<RreqRetryTableEntry> rreqRetryTableEntry;
+    if (m_rreqRetryTable.LookUpEntry(payload.GetRouteReqId(), rreqRetryTableEntry))
+    {
+        rreqRetryTableEntry->GetRreqEventId().Cancel();
+        m_rreqRetryTable.Delete(payload.GetRouteReqId());
+    }
+
+    uint8_t pathCost = linkCost + payload.GetPathCost();
+
+    if (payload.GetOrigAddr() == m_nwkNetworkAddress)
+    {
+        // The RREP is destined for this device
+        Ptr<RouteDiscoveryTableEntry> discEntry;
+        if (m_nwkRouteDiscoveryTable.LookUpEntry(payload.GetRouteReqId(),
+                                                 payload.GetOrigAddr(),
+                                                 discEntry))
+        {
+            Ptr<RoutingTableEntry> routeEntry;
+            if (m_nwkRoutingTable.LookUpEntry(payload.GetRespAddr(), routeEntry))
+            {
+                if (routeEntry->GetStatus() == ROUTE_DISCOVERY_UNDERWAY)
+                {
+                    if (routeEntry->IsGroupIdPresent())
+                    {
+                        routeEntry->SetStatus(ROUTE_VALIDATION_UNDERWAY);
+                    }
+                    else
+                    {
+                        routeEntry->SetStatus(ROUTE_ACTIVE);
+                    }
+                    routeEntry->SetNextHopAddr(macSrcAddr);
+                    discEntry->SetResidualCost(pathCost);
+                }
+                else if (routeEntry->GetStatus() == ROUTE_VALIDATION_UNDERWAY ||
+                         routeEntry->GetStatus() == ROUTE_ACTIVE)
+                {
+                    if (pathCost < discEntry->GetResidualCost())
+                    {
+                        routeEntry->SetNextHopAddr(macSrcAddr);
+                        discEntry->SetResidualCost(pathCost);
+                    }
+                }
+
+                NS_LOG_DEBUG("RREP from source [" << payload.GetRespAddr()
+                                                  << "] is for me; received from last hop ["
+                                                  << macSrcAddr << "]");
+
+                if (m_pendPrimitiveNwk == NLME_ROUTE_DISCOVERY)
+                {
+                    // We only report the result of the route discovery request
+                    // with the first RREP received.
+                    m_pendPrimitiveNwk = NLDE_NLME_NONE;
+                    if (!m_nlmeRouteDiscoveryConfirmCallback.IsNull())
+                    {
+                        NlmeRouteDiscoveryConfirmParams routeDiscConfirmParams;
+                        routeDiscConfirmParams.m_status = NwkStatus::SUCCESS;
+                        m_nlmeRouteDiscoveryConfirmCallback(routeDiscConfirmParams);
+                    }
+                }
+
+                Ptr<PendingTxPkt> pendingTxPkt = Create<PendingTxPkt>();
+                if (!m_pendingTxQueue.empty() &&
+                    DequeuePendingTx(payload.GetRespAddr(), pendingTxPkt))
+                {
+                    // Buffer a copy of the DATA packet that will be transmitted
+                    // for handling after transmission (i.e. NSDE-DATA.confirm)
+                    BufferTxPkt(pendingTxPkt->txPkt->Copy(),
+                                m_macHandle.GetValue(),
+                                pendingTxPkt->nsduHandle);
+
+                    // There is a pending packet awaiting to be transmitted
+                    // to the next hop, send it.
+                    McpsDataRequestParams mcpsDataparams;
+                    mcpsDataparams.m_txOptions = 0x01; // Acknowledment on.
+                    mcpsDataparams.m_dstPanId = m_nwkPanId;
+                    mcpsDataparams.m_msduHandle = m_macHandle.GetValue();
+                    mcpsDataparams.m_srcAddrMode = SHORT_ADDR;
+                    mcpsDataparams.m_dstAddrMode = SHORT_ADDR;
+                    mcpsDataparams.m_dstAddr = routeEntry->GetNextHopAddr();
+                    m_macHandle++;
+
+                    Simulator::ScheduleNow(&LrWpanMacBase::McpsDataRequest,
+                                           m_mac,
+                                           mcpsDataparams,
+                                           pendingTxPkt->txPkt);
+                }
+            }
+            else
+            {
+                m_nwkRouteDiscoveryTable.Delete(payload.GetRouteReqId(), payload.GetOrigAddr());
+            }
+        }
+    }
+    else
+    {
+        // The RREP is NOT destined for this device
+        Ptr<RouteDiscoveryTableEntry> discEntry;
+        if (m_nwkRouteDiscoveryTable.LookUpEntry(payload.GetRouteReqId(),
+                                                 payload.GetOrigAddr(),
+                                                 discEntry))
+        {
+            if (payload.GetPathCost() < discEntry->GetResidualCost())
+            {
+                Ptr<RoutingTableEntry> routeEntry;
+                if (m_nwkRoutingTable.LookUpEntry(payload.GetRespAddr(), routeEntry))
+                {
+                    routeEntry->SetNextHopAddr(macSrcAddr);
+                    routeEntry->SetStatus(ROUTE_ACTIVE);
+                    discEntry->SetResidualCost(pathCost);
+                    // Forward route reply to the next hop back to the original route requester
+                    SendRREP(discEntry->GetSenderAddr(),
+                             payload.GetOrigAddr(),
+                             payload.GetRespAddr(),
+                             payload.GetRouteReqId(),
+                             pathCost);
+                }
+                else
+                {
+                    NS_LOG_ERROR("Route discovery entry detected but no corresponding routing "
+                                 "table entry found");
+                }
+            }
+        }
+    }
+}
+
+bool
+ZigbeeNwk::IsBroadcastAddress(Mac16Address address)
+{
+    return address == "FF:FF" || address == "FF:FD" || address == "FF:FC" || address == "FF:FB";
+}
+
+RouteDiscoveryStatus
+ZigbeeNwk::FindNextHop(Mac16Address macSrcAddr,
+                       uint8_t pathCost,
+                       ZigbeeNwkHeader nwkHeader,
+                       ZigbeePayloadRouteRequestCommand payload,
+                       Mac16Address& nextHop)
+{
+    NS_LOG_FUNCTION(this);
+
+    // Mesh routing
+
+    // Check if the destination is our neighbor
+    Ptr<NeighborTableEntry> neighborEntry;
+    if (m_nwkNeighborTable.LookUpEntry(payload.GetDstAddr(), neighborEntry))
+    {
+        nextHop = payload.GetDstAddr();
+        return ROUTE_FOUND;
+    }
+
+    Ptr<RoutingTableEntry> entry;
+    if (m_nwkRoutingTable.LookUpEntry(payload.GetDstAddr(), entry))
+    {
+        if (!(entry->GetStatus() == ROUTE_ACTIVE) &&
+            !(entry->GetStatus() == ROUTE_VALIDATION_UNDERWAY))
+        {
+            // Entry found but is not valid
+            entry->SetStatus(ROUTE_DISCOVERY_UNDERWAY);
+        }
+        else
+        {
+            // Entry found
+            nextHop = entry->GetNextHopAddr();
+            return ROUTE_FOUND;
+        }
+    }
+    else if (nwkHeader.GetDiscoverRoute() == DiscoverRouteType::ENABLE_ROUTE_DISCOVERY)
+    {
+        // Check that the max routing capacity has not been reached. If the capacity was reached,
+        // attempt to delete the first found expired entry, if the table persist to be full
+        // then send a route error.
+        if (m_nwkRoutingTable.GetSize() >= m_nwkRoutingTable.GetMaxTableSize())
+        {
+            m_nwkRoutingTable.DeleteExpiredEntry();
+
+            if (m_nwkRoutingTable.GetSize() >= m_nwkRoutingTable.GetMaxTableSize())
+            {
+                if (!m_nlmeRouteDiscoveryConfirmCallback.IsNull())
+                {
+                    NlmeRouteDiscoveryConfirmParams confirmParams;
+                    confirmParams.m_status = ROUTE_ERROR;
+                    confirmParams.m_networkStatusCode = NO_ROUTING_CAPACITY;
+                    m_nlmeRouteDiscoveryConfirmCallback(confirmParams);
+                }
+                return TABLE_FULL;
+            }
+        }
+
+        // Entry not found
+        Ptr<RoutingTableEntry> newRoutingEntry =
+            Create<RoutingTableEntry>(payload.GetDstAddr(),
+                                      ROUTE_DISCOVERY_UNDERWAY,
+                                      true,  // TODO no route cache
+                                      false, // TODO: Many to one
+                                      false, // TODO: Route record
+                                      false, // TODO: Group id
+                                      Mac16Address("FF:FF"));
+        newRoutingEntry->SetLifeTime(Simulator::Now() + m_routeExpiryTime);
+
+        m_nwkRoutingTable.AddEntry(newRoutingEntry);
+    }
+    else
+    {
+        if (!m_nlmeRouteDiscoveryConfirmCallback.IsNull())
+        {
+            NlmeRouteDiscoveryConfirmParams confirmParams;
+            confirmParams.m_status = ROUTE_ERROR;
+            confirmParams.m_networkStatusCode = NO_ROUTE_AVAILABLE;
+            m_nlmeRouteDiscoveryConfirmCallback(confirmParams);
+        }
+        return NO_DISCOVER_ROUTE;
+    }
+
+    // 2- Find entry in DISCOVERY TABLE
+    Ptr<RouteDiscoveryTableEntry> discEntry;
+    if (m_nwkRouteDiscoveryTable.LookUpEntry(payload.GetRouteReqId(),
+                                             nwkHeader.GetSrcAddr(),
+                                             discEntry))
+    {
+        // Entry Found
+        if (pathCost < discEntry->GetForwardCost())
+        {
+            // More optimal route found, update route discovery values.
+            discEntry->SetSenderAddr(macSrcAddr);
+            discEntry->SetForwardCost(pathCost);
+            discEntry->SetExpTime(Simulator::Now() + m_nwkcRouteDiscoveryTime);
+            return ROUTE_UPDATED;
+        }
+        else
+        {
+            return DISCOVER_UNDERWAY;
+        }
+    }
+    else
+    {
+        // Entry NOT found, add NEW entry to route discovery table.
+        Ptr<RouteDiscoveryTableEntry> newDiscEntry =
+            Create<RouteDiscoveryTableEntry>(payload.GetRouteReqId(),
+                                             nwkHeader.GetSrcAddr(),
+                                             macSrcAddr, // macSrcAddr,
+                                             pathCost,   // payload.GetPathCost(), // Forward cost
+                                             0xff,       // Residual cost
+                                             (Simulator::Now() + m_nwkcRouteDiscoveryTime));
+
+        if (!m_nwkRouteDiscoveryTable.AddEntry(newDiscEntry))
+        {
+            return TABLE_FULL;
+        }
+    }
+    return ROUTE_NOT_FOUND;
+}
+
+RouteDiscoveryStatus
+ZigbeeNwk::ProcessManyToOneRoute(Mac16Address macSrcAddr,
+                                 uint8_t pathCost,
+                                 ZigbeeNwkHeader nwkHeader,
+                                 ZigbeePayloadRouteRequestCommand payload)
+{
+    Ptr<RouteDiscoveryTableEntry> discEntry;
+    if (m_nwkRouteDiscoveryTable.LookUpEntry(payload.GetRouteReqId(),
+                                             nwkHeader.GetSrcAddr(),
+                                             discEntry))
+    {
+        Ptr<RoutingTableEntry> routeEntry;
+        if (m_nwkRoutingTable.LookUpEntry(nwkHeader.GetSrcAddr(), routeEntry))
+        {
+            if (routeEntry->GetStatus() == ROUTE_VALIDATION_UNDERWAY ||
+                routeEntry->GetStatus() == ROUTE_ACTIVE)
+            {
+                if (pathCost < discEntry->GetForwardCost())
+                {
+                    // Update with a better route.
+                    routeEntry->SetNextHopAddr(macSrcAddr);
+                    discEntry->SetForwardCost(pathCost);
+                    discEntry->SetExpTime(Simulator::Now() + m_nwkcRouteDiscoveryTime);
+                    return ROUTE_UPDATED;
+                }
+                return NO_ROUTE_CHANGE;
+            }
+        }
+        else
+        {
+            NS_LOG_ERROR("Entry found in the discovery table but not the routing table");
+            return NO_ROUTE_CHANGE;
+        }
+    }
+    else
+    {
+        // Entry NOT found, add NEW entry to route discovery table.
+        Ptr<RouteDiscoveryTableEntry> newDiscEntry =
+            Create<RouteDiscoveryTableEntry>(payload.GetRouteReqId(),
+                                             nwkHeader.GetSrcAddr(),
+                                             macSrcAddr, // previous hop address
+                                             pathCost,   // Forward cost
+                                             0xff,       // Residual cost (not used by Many-to-One)
+                                             (Simulator::Now() + m_nwkcRouteDiscoveryTime));
+
+        // TODO: what to do if route discovery table is full?
+        m_nwkRouteDiscoveryTable.AddEntry(newDiscEntry);
+
+        // Define the type of Many-To-One routing (with or without route record)
+        bool routeRecord = false;
+        if (payload.GetCmdOptManyToOneField() == ManyToOne::ROUTE_RECORD)
+        {
+            routeRecord = true;
+        }
+
+        Ptr<RoutingTableEntry> routeEntry;
+        if (m_nwkRoutingTable.LookUpEntry(nwkHeader.GetSrcAddr(), routeEntry))
+        {
+            if (routeEntry->GetStatus() == ROUTE_VALIDATION_UNDERWAY ||
+                routeEntry->GetStatus() == ROUTE_ACTIVE)
+            {
+                // The entry exist in routing table but it was not in discovery table
+                // Refresh the Route
+                routeEntry->SetNextHopAddr(macSrcAddr);
+                // TODO: other parameters
+                return ROUTE_UPDATED;
+            }
+            return NO_ROUTE_CHANGE;
+        }
+        else
+        {
+            // New routing table entry
+            // Check that the max routing capacity has not been reached. If the capacity was
+            // reached, attempt to delete the first found expired entry, if the table persist to be
+            // full then send a route error.
+            if (m_nwkRoutingTable.GetSize() >= m_nwkRoutingTable.GetMaxTableSize())
+            {
+                m_nwkRoutingTable.DeleteExpiredEntry();
+
+                if (m_nwkRoutingTable.GetSize() >= m_nwkRoutingTable.GetMaxTableSize())
+                {
+                    if (!m_nlmeRouteDiscoveryConfirmCallback.IsNull())
+                    {
+                        NlmeRouteDiscoveryConfirmParams confirmParams;
+                        confirmParams.m_status = ROUTE_ERROR;
+                        confirmParams.m_networkStatusCode = NO_ROUTING_CAPACITY;
+                        m_nlmeRouteDiscoveryConfirmCallback(confirmParams);
+                    }
+                    return TABLE_FULL;
+                }
+            }
+
+            Ptr<RoutingTableEntry> newRoutingEntry =
+                Create<RoutingTableEntry>(nwkHeader.GetSrcAddr(),
+                                          ROUTE_ACTIVE,
+                                          true,        // TODO no route cache
+                                          true,        // TODO: Many to one
+                                          routeRecord, // TODO: Route record
+                                          false,       // TODO: Group id
+                                          macSrcAddr);
+
+            newRoutingEntry->SetLifeTime(Simulator::Now() + m_routeExpiryTime);
+
+            m_nwkRoutingTable.AddEntry(newRoutingEntry);
+            return MANY_TO_ONE_ROUTE;
+        }
+    }
+    return NO_ROUTE_CHANGE;
+}
+
+void
+ZigbeeNwk::SendDataUcst(Ptr<Packet> packet, uint8_t nwkHandle)
+{
+    NS_LOG_FUNCTION(this);
+
+    // Obtain information from the DATA packet
+    ZigbeeNwkHeader nwkHeaderData;
+    packet->PeekHeader(nwkHeaderData);
+
+    // Construct a RREQ network header and payload for possible
+    // route discovery request
+
+    ZigbeeNwkHeader nwkHeaderRreq;
+    nwkHeaderRreq.SetFrameType(NWK_COMMAND);
+    nwkHeaderRreq.SetProtocolVer(m_nwkcProtocolVersion);
+    nwkHeaderRreq.SetDiscoverRoute(nwkHeaderData.GetDiscoverRoute());
+    // See r22.1.0, Table 3-69
+    // Set destination to broadcast (all routers and coordinator)
+    nwkHeaderRreq.SetDstAddr(Mac16Address("FF:FC"));
+    nwkHeaderRreq.SetSrcAddr(m_nwkNetworkAddress);
+    nwkHeaderRreq.SetSeqNum(m_nwkSequenceNumber.GetValue());
+    // see Zigbee specification 3.2.2.33.3
+    if (nwkHeaderData.GetRadius() == 0)
+    {
+        nwkHeaderRreq.SetRadius(m_nwkMaxDepth * 2);
+    }
+    else
+    {
+        nwkHeaderRreq.SetRadius(nwkHeaderData.GetRadius());
+    }
+
+    ZigbeePayloadRouteRequestCommand payloadRreq;
+    payloadRreq.SetRouteReqId(m_routeRequestId.GetValue());
+    payloadRreq.SetDstAddr(nwkHeaderData.GetDstAddr());
+    payloadRreq.SetPathCost(0);
+
+    Mac16Address nextHop;
+    RouteDiscoveryStatus nextHopStatus =
+        FindNextHop(m_nwkNetworkAddress, 0, nwkHeaderRreq, payloadRreq, nextHop);
+
+    if (nextHopStatus == ROUTE_FOUND)
+    {
+        // Buffer a copy of the DATA packet that will be transmitted
+        // for handling after transmission (i.e. NSDE-DATA.confirm)
+        BufferTxPkt(packet->Copy(), m_macHandle.GetValue(), nwkHandle);
+
+        // Parameters as described in Section 3.6.3.3
+        McpsDataRequestParams mcpsDataparams;
+        mcpsDataparams.m_dstPanId = m_nwkPanId;
+        mcpsDataparams.m_msduHandle = m_macHandle.GetValue();
+        mcpsDataparams.m_txOptions = 0x01; // Acknowledment on.
+        mcpsDataparams.m_srcAddrMode = SHORT_ADDR;
+        mcpsDataparams.m_dstAddrMode = SHORT_ADDR;
+        mcpsDataparams.m_dstAddr = nextHop;
+        m_macHandle++;
+        Simulator::ScheduleNow(&LrWpanMacBase::McpsDataRequest, m_mac, mcpsDataparams, packet);
+    }
+    else if (nextHopStatus == ROUTE_NOT_FOUND)
+    {
+        // Route not found. Route marked as DISCOVER UNDERWAY,
+        // packet added to pending Tx Queue and we initiate route
+        // discovery
+
+        EnqueuePendingTx(packet, nwkHandle);
+
+        Simulator::Schedule(MilliSeconds(m_rreqJitter->GetValue()),
+                            &ZigbeeNwk::SendRREQ,
+                            this,
+                            nwkHeaderRreq,
+                            payloadRreq,
+                            m_nwkcInitialRREQRetries);
+
+        m_nwkSequenceNumber++;
+        m_routeRequestId++;
+    }
+}
+
+void
+ZigbeeNwk::SendDataBcst(Ptr<Packet> packet, uint8_t nwkHandle)
+{
+    // Buffer a copy of the DATA packet that will be transmitted
+    // for handling after transmission (i.e. NSDE-DATA.confirm)
+    BufferTxPkt(packet->Copy(), m_macHandle.GetValue(), nwkHandle);
+
+    // Parameters as described in Section 3.6.5
+    McpsDataRequestParams mcpsDataparams;
+    mcpsDataparams.m_dstPanId = m_nwkPanId;
+    mcpsDataparams.m_msduHandle = m_macHandle.GetValue();
+    mcpsDataparams.m_srcAddrMode = SHORT_ADDR;
+    mcpsDataparams.m_dstAddrMode = SHORT_ADDR;
+    mcpsDataparams.m_dstAddr = Mac16Address("FF:FF");
+    m_macHandle++;
+    Simulator::ScheduleNow(&LrWpanMacBase::McpsDataRequest, m_mac, mcpsDataparams, packet);
+}
+
+void
+ZigbeeNwk::McpsDataConfirm(McpsDataConfirmParams params)
+{
+    Ptr<TxPkt> bufferedElement;
+    if (RetrieveTxPkt(params.m_msduHandle, bufferedElement))
+    {
+        ZigbeeNwkHeader nwkHeader;
+        bufferedElement->txPkt->PeekHeader(nwkHeader);
+
+        if (nwkHeader.GetFrameType() == DATA)
+        {
+            if (IsBroadcastAddress(nwkHeader.GetDstAddr()))
+            {
+            }
+            else if (nwkHeader.GetSrcAddr() == m_nwkNetworkAddress)
+            {
+                // Send the confirmation to next layer after the packet transmission,
+                // only if packet transmitted was in the initiator of the NLDE-DATA.request
+
+                if (!m_nldeDataConfirmCallback.IsNull())
+                {
+                    // Zigbee Specification r22.1.0, End of Section 3.2.1.1.3
+                    // Report the the results of a request to a transmission of a packet
+                    NldeDataConfirmParams nldeDataConfirmParams;
+                    // nldeDataConfirmParams.m_status =
+                    // static_cast<ZigbeeNwkStatus>(params.m_status);
+                    nldeDataConfirmParams.m_nsduHandle = bufferedElement->nwkHandle;
+                    m_nldeDataConfirmCallback(nldeDataConfirmParams);
+                }
+            }
+        }
+    }
+}
+
+void
+ZigbeeNwk::MlmeScanConfirm(MlmeScanConfirmParams params)
+{
+    NS_LOG_FUNCTION(this);
+
+    if (m_pendPrimitiveNwk == NLME_NETWORK_FORMATION && params.m_scanType == MLMESCAN_ED)
+    {
+        if (params.m_status != MacStatus::SUCCESS)
+        {
+            m_pendPrimitiveNwk = NLDE_NLME_NONE;
+            m_netFormParams = {};
+            m_netFormParamsGen = nullptr;
+
+            // See Zigbee specification r22.1.0, Section 3.2.2.5.3, (6.b.i)
+            if (!m_nlmeNetworkFormationConfirmCallback.IsNull())
+            {
+                NlmeNetworkFormationConfirmParams confirmParams;
+                confirmParams.m_status = GetNwkStatus(params.m_status);
+                m_nlmeNetworkFormationConfirmCallback(confirmParams);
+            }
+        }
+        else
+        {
+            // TODO: Continue energy detection (ED) scan in other interfaces if supported.
+
+            // See Zigbee specification r22.1.0, Section 3.2.2.5.3, (6.b.ii)
+            // Pick the list of acceptable channels on which to continue doing an ACTIVE scan
+            std::vector<uint8_t> energyList = params.m_energyDetList;
+            uint32_t channelMask = m_netFormParams.m_scanChannelList.channelsField[0];
+
+            NS_LOG_DEBUG("[NLME-NETWORK-FORMATION.request]: \n              "
+                         << "EnergyThreshold: " << m_scanEnergyThreshold << " | ChannelMask: 0x"
+                         << std::hex << channelMask << std::dec << " | EnergyList: " << energyList);
+
+            m_filteredChannelMask = 0;
+            uint32_t countAcceptableChannels = 0;
+            uint8_t energyListPos = 0;
+            for (uint32_t i = 0; i < 32; i++)
+            {
+                // check if the i position exist in the ChannelMask
+                if (channelMask & (1 << i))
+                {
+                    if (energyList[energyListPos] <= m_scanEnergyThreshold)
+                    {
+                        m_filteredChannelMask |= (1 << i);
+                        countAcceptableChannels++;
+                    }
+                    energyListPos++;
+                }
+            }
+
+            NS_LOG_DEBUG("[NLME-NETWORK-FORMATION.request]:\n              "
+                         << "Energy scan complete, " << countAcceptableChannels
+                         << " acceptable channels found : 0x" << std::hex << m_filteredChannelMask
+                         << std::dec);
+
+            if (countAcceptableChannels == 0)
+            {
+                m_pendPrimitiveNwk = NLDE_NLME_NONE;
+                m_netFormParams = {};
+                m_netFormParamsGen = nullptr;
+
+                if (!m_nlmeNetworkFormationConfirmCallback.IsNull())
+                {
+                    NlmeNetworkFormationConfirmParams confirmParams;
+                    confirmParams.m_status = NwkStatus::STARTUP_FAILURE;
+                    m_nlmeNetworkFormationConfirmCallback(confirmParams);
+                }
+            }
+            else
+            {
+                // See Zigbee specification r22.1.0, Section 3.2.2.5.3, (6.c)
+                MlmeScanRequestParams mlmeParams;
+                mlmeParams.m_chPage = (m_filteredChannelMask >> 27) & (0x01F);
+                mlmeParams.m_scanChannels = m_filteredChannelMask;
+                mlmeParams.m_scanDuration = m_netFormParams.m_scanDuration;
+                mlmeParams.m_scanType = MLMESCAN_ACTIVE;
+                Simulator::ScheduleNow(&LrWpanMacBase::MlmeScanRequest, m_mac, mlmeParams);
+            }
+        }
+    }
+    else if (m_pendPrimitiveNwk == NLME_NETWORK_FORMATION && params.m_scanType == MLMESCAN_ACTIVE)
+    {
+        if (params.m_status == MacStatus::NO_BEACON || params.m_status == MacStatus::SUCCESS)
+        {
+            // TODO: We should ACTIVE scan channels on each interface
+            // (only possible when more interfaces (nwkMacInterfaceTable) are supported)
+            // for now, only a single interface is considered.
+
+            // See Zigbee specification r22.1.0, (3.2.2.5.3, 6.d.ii)
+            // Check results of an ACTIVE scan an select a different PAN ID and channel:
+            // Choose a random PAN ID
+            // Page is always 0 until more interfaces supported
+            uint8_t channel = 0;
+            uint8_t page = 0;
+            uint16_t panId = m_uniformRandomVariable->GetInteger(1, 0xFFF7);
+
+            std::vector<uint8_t> pansPerChannel(27);
+            uint32_t secondFilteredChannelMask = m_filteredChannelMask;
+            for (const auto& panDescriptor : params.m_panDescList)
+            {
+                // Clear all the bit positions of channels with active PAN networks
+                // (The channels with PAN descriptors received)
+                secondFilteredChannelMask &= ~(1 << panDescriptor.m_logCh);
+                // Add to the number of PAN detected in this channel
+                pansPerChannel[panDescriptor.m_logCh] += 1;
+            }
+
+            for (uint32_t i = 0; i < 32; i++)
+            {
+                // Pick the first channel in the list that does not contain
+                // any PAN network
+                if (secondFilteredChannelMask & (1 << i))
+                {
+                    channel = i;
+                    break;
+                }
+            }
+
+            if (channel < 11 || channel > 26)
+            {
+                // Extreme case: All the channels in the previous step contained PAN networks
+                // therefore choose the channel with the least PAN networks.
+                uint8_t channelIndex = 0;
+                uint8_t lowestPanNum = 99;
+                for (const auto& numPans : pansPerChannel)
+                {
+                    if (numPans != 0 && numPans <= lowestPanNum)
+                    {
+                        channel = channelIndex;
+                        lowestPanNum = numPans;
+                    }
+                    channelIndex++;
+                }
+
+                NS_ASSERT_MSG(channel < 11 || channel > 26,
+                              "Invalid channel in PAN descriptor list during ACTIVE scan");
+            }
+
+            // store the chosen page, channel and pan Id.
+            m_netFormParamsGen = Create<NetFormPendingParamsGen>();
+            m_netFormParamsGen->page = page;
+            m_netFormParamsGen->channel = channel;
+            m_netFormParamsGen->panId = panId;
+
+            NS_LOG_DEBUG("[NLME-NETWORK-FORMATION.request]:\n              "
+                         << "Active scan complete, page " << std::dec << page << ", channel "
+                         << std::dec << channel << " and PAN ID 0x" << std::hex << panId << std::dec
+                         << " chosen.");
+
+            // Set the device short address (3.2.2.5.3 , 6.f)
+            Ptr<MacPibAttributes> pibAttr = Create<MacPibAttributes>();
+            if (m_netFormParams.m_distributedNetwork)
+            {
+                pibAttr->macShortAddress = m_netFormParams.m_distributedNetworkAddress;
+                m_nwkNetworkAddress = m_netFormParams.m_distributedNetworkAddress;
+            }
+            else
+            {
+                pibAttr->macShortAddress = Mac16Address("00:00");
+                m_nwkNetworkAddress = Mac16Address("00:00");
+            }
+            // Set Short Address and continue with beacon payload afterwards.
+            Simulator::ScheduleNow(&LrWpanMacBase::MlmeSetRequest,
+                                   m_mac,
+                                   MacPibAttributeIdentifier::macShortAddress,
+                                   pibAttr);
+        }
+        else
+        {
+            // Error occurred during network formation active scan
+            // report to higher layer (Section 3.2.2.5.3, 6.d)
+
+            m_pendPrimitiveNwk = NLDE_NLME_NONE;
+            m_netFormParams = {};
+            m_netFormParamsGen = nullptr;
+
+            if (!m_nlmeNetworkFormationConfirmCallback.IsNull())
+            {
+                NlmeNetworkFormationConfirmParams confirmParams;
+                confirmParams.m_status = GetNwkStatus(params.m_status);
+                m_nlmeNetworkFormationConfirmCallback(confirmParams);
+            }
+        }
+    }
+    else if (m_pendPrimitiveNwk == NLME_NET_DISCV && params.m_scanType == MLMESCAN_ACTIVE)
+    {
+        NlmeNetworkDiscoveryConfirmParams netDiscConfirmParams;
+        m_pendPrimitiveNwk = NLDE_NLME_NONE;
+
+        if (params.m_status == MacStatus::SUCCESS)
+        {
+            NS_LOG_DEBUG("[NLME-NETWORK-DISCOVERY.request]:\n              "
+                         << "Active scan, " << m_networkDescriptorList.size()
+                         << " PARENT capable device(s) found");
+
+            netDiscConfirmParams.m_netDescList = m_networkDescriptorList;
+            netDiscConfirmParams.m_networkCount = m_networkDescriptorList.size();
+            netDiscConfirmParams.m_status = NwkStatus::SUCCESS;
+            m_networkDescriptorList = {};
+        }
+        else
+        {
+            NS_LOG_DEBUG("[NLME-NETWORK-DISCOVERY.request]: Active scan failed with"
+                         " status: "
+                         << GetNwkStatus(params.m_status));
+            netDiscConfirmParams.m_status = GetNwkStatus(params.m_status);
+        }
+
+        if (!m_nlmeNetworkDiscoveryConfirmCallback.IsNull())
+        {
+            m_nlmeNetworkDiscoveryConfirmCallback(netDiscConfirmParams);
+        }
+    }
+    else if (m_pendPrimitiveNwk == NLME_JOIN && params.m_scanType == MLMESCAN_ORPHAN)
+    {
+        // TODO: Add macInterfaceIndex and channelListStructure params when supported
+        if (params.m_status == MacStatus::SUCCESS)
+        {
+            // Orphan scan was successful (Join success), first update the extended
+            // PAN id and the capability information, then the
+            // the nwkNetworkAddress with the macShortAddress, this
+            // will be followed by an update of the m_nwkPanId with macPanId
+            // and finally the join confirmation
+            m_nwkExtendedPanId = m_joinParams.m_extendedPanId;
+            m_nwkCapabilityInformation = m_joinParams.m_capabilityInfo;
+            Simulator::ScheduleNow(&LrWpanMacBase::MlmeGetRequest,
+                                   m_mac,
+                                   MacPibAttributeIdentifier::macShortAddress);
+        }
+        else
+        {
+            m_pendPrimitiveNwk = NLDE_NLME_NONE;
+            m_joinParams = {};
+            NS_LOG_DEBUG("[NLME-JOIN.request]: Orphan scan completed but no networks found");
+
+            if (!m_nlmeJoinConfirmCallback.IsNull())
+            {
+                NlmeJoinConfirmParams joinConfirmParams;
+                joinConfirmParams.m_status = NwkStatus::NO_NETWORKS;
+                m_nlmeJoinConfirmCallback(joinConfirmParams);
+            }
+        }
+    }
+}
+
+void
+ZigbeeNwk::MlmeAssociateConfirm(MlmeAssociateConfirmParams params)
+{
+    NS_LOG_FUNCTION(this);
+
+    if (m_pendPrimitiveNwk == NLME_JOIN)
+    {
+        NlmeJoinConfirmParams joinConfirmParams;
+        joinConfirmParams.m_extendedPanId = m_joinParams.m_extendedPanId;
+        joinConfirmParams.m_enhancedBeacon = false; // hardcoded, no support
+        joinConfirmParams.m_macInterfaceIndex = 0;  // hardcoded, no support
+        joinConfirmParams.m_networkAddress = params.m_assocShortAddr;
+
+        Ptr<NeighborTableEntry> entry;
+
+        if (params.m_status == MacStatus::SUCCESS)
+        {
+            joinConfirmParams.m_status = NwkStatus::SUCCESS;
+            joinConfirmParams.m_networkAddress = params.m_assocShortAddr;
+
+            // Update NWK NIB values
+            m_nwkNetworkAddress = params.m_assocShortAddr;
+            m_nwkExtendedPanId = m_joinParams.m_extendedPanId;
+            m_nwkPanId = m_associateParams.m_coordPanId;
+
+            // Update relationship
+            if (m_associateParams.m_coordAddrMode == lrwpan::AddressMode::EXT_ADDR)
+            {
+                if (m_nwkNeighborTable.LookUpEntry(m_associateParams.m_coordExtAddr, entry))
+                {
+                    entry->SetRelationship(NBR_PARENT);
+
+                    NS_LOG_DEBUG("[NLME-JOIN.request]:\n              "
+                                 << "Status: " << joinConfirmParams.m_status << " | PAN ID: 0x"
+                                 << std::hex << m_nwkPanId << " | Extended PAN ID: 0x"
+                                 << m_nwkExtendedPanId << std::dec);
+                }
+                else
+                {
+                    NS_LOG_ERROR("Entry not found while updating relationship");
+                }
+            }
+            else
+            {
+                if (m_nwkNeighborTable.LookUpEntry(m_associateParams.m_coordShortAddr, entry))
+                {
+                    entry->SetRelationship(NBR_PARENT);
+
+                    NS_LOG_DEBUG("[NLME-JOIN.request]:\n              "
+                                 << "Status: " << joinConfirmParams.m_status << " | PAN ID: 0x"
+                                 << std::hex << m_nwkPanId << " | Extended PAN ID: 0x"
+                                 << m_nwkExtendedPanId << std::dec);
+                }
+                else
+                {
+                    NS_LOG_ERROR("Entry not found while updating relationship");
+                }
+            }
+
+            // TODO:m_nwkUpdateId
+        }
+        else
+        {
+            if (params.m_status == MacStatus::FULL_CAPACITY)
+            {
+                // Discard neighbor as potential parent
+                if (m_associateParams.m_coordAddrMode == lrwpan::AddressMode::EXT_ADDR)
+                {
+                    if (m_nwkNeighborTable.LookUpEntry(m_associateParams.m_coordExtAddr, entry))
+                    {
+                        entry->SetPotentialParent(false);
+                    }
+                    else
+                    {
+                        NS_LOG_ERROR("Neighbor not found when discarding as potential parent");
+                    }
+                }
+                else
+                {
+                    if (m_nwkNeighborTable.LookUpEntry(m_associateParams.m_coordShortAddr, entry))
+                    {
+                        entry->SetPotentialParent(false);
+                    }
+                    else
+                    {
+                        NS_LOG_ERROR("Neighbor not found when discarding as potential parent");
+                    }
+                }
+
+                joinConfirmParams.m_status = NwkStatus::NEIGHBOR_TABLE_FULL;
+            }
+            else
+            {
+                joinConfirmParams.m_status = GetNwkStatus(params.m_status);
+            }
+        }
+
+        m_pendPrimitiveNwk = NLDE_NLME_NONE;
+        m_joinParams = {};
+        m_associateParams = {};
+
+        if (!m_nlmeJoinConfirmCallback.IsNull())
+        {
+            m_nlmeJoinConfirmCallback(joinConfirmParams);
+        }
+    }
+}
+
+void
+ZigbeeNwk::MlmeStartConfirm(MlmeStartConfirmParams params)
+{
+    NS_LOG_FUNCTION(this);
+
+    NwkStatus nwkConfirmStatus;
+    nwkConfirmStatus = GetNwkStatus(params.m_status);
+
+    if (nwkConfirmStatus != NwkStatus::SUCCESS)
+    {
+        m_nwkExtendedPanId = 0xffffffffffffffed;
+        m_nwkNetworkAddress = Mac16Address("ff:ff");
+        m_nwkPanId = 0xffff;
+    }
+
+    if (m_pendPrimitiveNwk == NLME_NETWORK_FORMATION)
+    {
+        NS_LOG_DEBUG("[NLME-NETWORK-FORMATION.request]:\n              "
+                     << "Status: " << nwkConfirmStatus << " | PAN ID:" << std::hex << m_nwkPanId
+                     << " | Extended PAN ID: 0x" << m_nwkExtendedPanId << std::dec);
+
+        m_pendPrimitiveNwk = NLDE_NLME_NONE;
+        m_netFormParams = {};
+        m_netFormParamsGen = nullptr;
+
+        if (!m_nlmeNetworkFormationConfirmCallback.IsNull())
+        {
+            NlmeNetworkFormationConfirmParams confirmParams;
+            confirmParams.m_status = nwkConfirmStatus;
+            m_nlmeNetworkFormationConfirmCallback(confirmParams);
+        }
+    }
+    else if (m_pendPrimitiveNwk == NLME_START_ROUTER)
+    {
+        NS_LOG_DEBUG("[NLME-START-ROUTER.request]:\n              "
+                     << "Status: " << nwkConfirmStatus << " | PAN ID: 0x" << std::hex << m_nwkPanId
+                     << " | Extended PAN ID: 0x" << m_nwkExtendedPanId << std::dec);
+
+        if (nwkConfirmStatus != NwkStatus::SUCCESS)
+        {
+            m_pendPrimitiveNwk = NLDE_NLME_NONE;
+            m_startRouterParams = {};
+            if (!m_nlmeStartRouterConfirmCallback.IsNull())
+            {
+                NlmeStartRouterConfirmParams confirmParams;
+                confirmParams.m_status = nwkConfirmStatus;
+                m_nlmeStartRouterConfirmCallback(confirmParams);
+            }
+        }
+        else
+        {
+            UpdateBeaconPayloadLength();
+        }
+    }
+}
+
+void
+ZigbeeNwk::MlmeSetConfirm(MlmeSetConfirmParams params)
+{
+    NS_LOG_FUNCTION(this << params.id);
+
+    if (m_pendPrimitiveNwk == NLME_NETWORK_FORMATION)
+    {
+        if (params.m_status == MacStatus::SUCCESS &&
+            params.id == MacPibAttributeIdentifier::macShortAddress)
+        {
+            // Section (3.2.2.5.3 , 6.g)
+            // Getting this device MAC extended address using MLME-GET
+            Simulator::ScheduleNow(&LrWpanMacBase::MlmeGetRequest,
+                                   m_mac,
+                                   MacPibAttributeIdentifier::macExtendedAddress);
+        }
+        else if (params.m_status == MacStatus::SUCCESS &&
+                 params.id == MacPibAttributeIdentifier::macBeaconPayload)
+        {
+            // Finalize Network Formation (Start network)
+            MlmeStartRequestParams startParams;
+            startParams.m_logCh = m_netFormParamsGen->channel;
+            startParams.m_logChPage = m_netFormParamsGen->page;
+            startParams.m_PanId = m_netFormParamsGen->panId;
+            startParams.m_bcnOrd = m_netFormParams.m_beaconOrder;
+            startParams.m_sfrmOrd = m_netFormParams.m_superFrameOrder;
+            startParams.m_battLifeExt = m_netFormParams.m_batteryLifeExtension;
+            startParams.m_coorRealgn = false;
+            startParams.m_panCoor = true;
+            Simulator::ScheduleNow(&LrWpanMacBase::MlmeStartRequest, m_mac, startParams);
+        }
+        else if (params.m_status == MacStatus::SUCCESS &&
+                 params.id == MacPibAttributeIdentifier::macBeaconPayloadLength)
+        {
+            UpdateBeaconPayload();
+        }
+        else
+        {
+            m_pendPrimitiveNwk = NLDE_NLME_NONE;
+            m_netFormParams = {};
+            m_netFormParamsGen = nullptr;
+
+            if (!m_nlmeNetworkFormationConfirmCallback.IsNull())
+            {
+                NlmeNetworkFormationConfirmParams confirmParams;
+                confirmParams.m_status = NwkStatus::STARTUP_FAILURE;
+                m_nlmeNetworkFormationConfirmCallback(confirmParams);
+            }
+        }
+    }
+    else if (m_pendPrimitiveNwk == NLME_JOIN_INDICATION)
+    {
+        if (params.m_status == MacStatus::SUCCESS &&
+            params.id == MacPibAttributeIdentifier::macBeaconPayloadLength)
+        {
+            UpdateBeaconPayload();
+        }
+        else
+        {
+            NlmeJoinIndicationParams joinIndParams = m_joinIndParams;
+
+            m_pendPrimitiveNwk = NLDE_NLME_NONE;
+            m_joinIndParams = {};
+
+            if (!m_nlmeJoinIndicationCallback.IsNull())
+            {
+                m_nlmeJoinIndicationCallback(joinIndParams);
+            }
+        }
+    }
+    else if (m_pendPrimitiveNwk == NLME_START_ROUTER)
+    {
+        if (params.m_status == MacStatus::SUCCESS &&
+            params.id == MacPibAttributeIdentifier::macBeaconPayloadLength)
+        {
+            UpdateBeaconPayload();
+        }
+        else if (params.m_status == MacStatus::SUCCESS &&
+                 params.id == MacPibAttributeIdentifier::macBeaconPayload)
+        {
+            m_pendPrimitiveNwk = NLDE_NLME_NONE;
+            m_startRouterParams = {};
+            if (!m_nlmeStartRouterConfirmCallback.IsNull())
+            {
+                NlmeStartRouterConfirmParams confirmParams;
+                confirmParams.m_status = NwkStatus::SUCCESS;
+                m_nlmeStartRouterConfirmCallback(confirmParams);
+            }
+        }
+        else
+        {
+            NS_LOG_ERROR("Beacon payload update failed during a NLME-START-ROUTER.request");
+        }
+    }
+}
+
+void
+ZigbeeNwk::MlmeGetConfirm(MacStatus status,
+                          MacPibAttributeIdentifier id,
+                          Ptr<MacPibAttributes> attribute)
+{
+    NS_LOG_FUNCTION(this);
+
+    // Update the values of attributes in the network layer
+    if (status == MacStatus::SUCCESS)
+    {
+        if (id == MacPibAttributeIdentifier::macExtendedAddress)
+        {
+            m_nwkIeeeAddress = attribute->macExtendedAddress;
+        }
+        else if (id == MacPibAttributeIdentifier::macShortAddress)
+        {
+            m_nwkNetworkAddress = attribute->macShortAddress;
+        }
+        else if (id == MacPibAttributeIdentifier::macPanId)
+        {
+            m_nwkPanId = attribute->macPanId;
+        }
+        else if (id == MacPibAttributeIdentifier::pCurrentChannel)
+        {
+            m_currentChannel = attribute->pCurrentChannel;
+        }
+    }
+
+    if (m_pendPrimitiveNwk == PendingPrimitiveNwk::NLME_NETWORK_FORMATION)
+    {
+        if (id == MacPibAttributeIdentifier::macExtendedAddress && status == MacStatus::SUCCESS)
+        {
+            // Section (3.2.2.5.3 , 6.g)
+            // Set nwkExtendedPanId and m_nwkIeeeAddress and nwkPanId
+            m_nwkExtendedPanId = m_nwkIeeeAddress.ConvertToInt();
+            m_nwkPanId = m_netFormParamsGen->panId;
+
+            // Configure the capability information of the PAN coordinator
+            CapabilityInformation capaInfo;
+            capaInfo.SetDeviceType(zigbee::MacDeviceType::ROUTER);
+            m_nwkCapabilityInformation = capaInfo.GetCapability();
+
+            // Set Beacon payload size followed by the beacon payload content
+            // before starting a network
+            // See Figure 3-37 Establishing a Network
+            // See also 3.6.7.
+            UpdateBeaconPayloadLength();
+        }
+        else
+        {
+            m_pendPrimitiveNwk = NLDE_NLME_NONE;
+            m_netFormParams = {};
+            m_netFormParamsGen = nullptr;
+
+            if (!m_nlmeNetworkFormationConfirmCallback.IsNull())
+            {
+                NlmeNetworkFormationConfirmParams confirmParams;
+                confirmParams.m_status = NwkStatus::STARTUP_FAILURE;
+                m_nlmeNetworkFormationConfirmCallback(confirmParams);
+            }
+        }
+    }
+    else if (m_pendPrimitiveNwk == PendingPrimitiveNwk::NLME_JOIN && status == MacStatus::SUCCESS)
+    {
+        if (id == MacPibAttributeIdentifier::macShortAddress)
+        {
+            Simulator::ScheduleNow(&LrWpanMacBase::MlmeGetRequest,
+                                   m_mac,
+                                   MacPibAttributeIdentifier::macPanId);
+        }
+        else if (id == MacPibAttributeIdentifier::macPanId)
+        {
+            NlmeJoinConfirmParams joinConfirmParams;
+            joinConfirmParams.m_channelList = m_joinParams.m_scanChannelList;
+            joinConfirmParams.m_status = NwkStatus::SUCCESS;
+            joinConfirmParams.m_networkAddress = m_nwkNetworkAddress;
+            joinConfirmParams.m_extendedPanId = m_nwkExtendedPanId;
+            joinConfirmParams.m_enhancedBeacon = false;
+
+            m_pendPrimitiveNwk = NLDE_NLME_NONE;
+            m_joinParams = {};
+
+            if (!m_nlmeJoinConfirmCallback.IsNull())
+            {
+                m_nlmeJoinConfirmCallback(joinConfirmParams);
+            }
+        }
+    }
+    else if (m_pendPrimitiveNwk == PendingPrimitiveNwk::NLME_START_ROUTER &&
+             status == MacStatus::SUCCESS)
+    {
+        if (id == MacPibAttributeIdentifier::pCurrentChannel)
+        {
+            // TODO: MLME-START.request should be issue sequentially to all the interfaces in the
+            // nwkMacInterfaceTable (currently not supported), for the moment only a single
+            // interface is supported.
+            MlmeStartRequestParams startParams;
+            startParams.m_logCh = m_currentChannel;
+            startParams.m_logChPage = 0; // In zigbee, only page 0 is supported.
+            startParams.m_PanId = m_nwkPanId;
+            startParams.m_bcnOrd = m_startRouterParams.m_beaconOrder;
+            startParams.m_sfrmOrd = m_startRouterParams.m_superframeOrder;
+            startParams.m_battLifeExt = m_startRouterParams.m_batteryLifeExt;
+            startParams.m_coorRealgn = false;
+            startParams.m_panCoor = false;
+
+            Simulator::ScheduleNow(&LrWpanMacBase::MlmeStartRequest, m_mac, startParams);
+        }
+    }
+}
+
+void
+ZigbeeNwk::MlmeOrphanIndication(MlmeOrphanIndicationParams params)
+{
+    NS_LOG_FUNCTION(this);
+
+    Ptr<NeighborTableEntry> entry;
+    MlmeOrphanResponseParams respParams;
+
+    if (m_nwkNeighborTable.LookUpEntry(params.m_orphanAddr, entry))
+    {
+        respParams.m_assocMember = true;
+        respParams.m_orphanAddr = params.m_orphanAddr;
+        respParams.m_shortAddr = entry->GetNwkAddr();
+
+        // Temporarily store the NLME-JOIN.indications parameters that will be
+        // returned after the DIRECT_JOIN process concludes.
+        // (after MLME-COMM-STATUS.indication is received)
+        CapabilityInformation capability;
+        capability.SetReceiverOnWhenIdle(entry->IsRxOnWhenIdle());
+
+        if (entry->GetDeviceType() == NwkDeviceType::ZIGBEE_ROUTER)
+        {
+            capability.SetDeviceType(MacDeviceType::ROUTER);
+        }
+        else if (entry->GetDeviceType() == NwkDeviceType::ZIGBEE_ENDDEVICE)
+        {
+            capability.SetDeviceType(MacDeviceType::ENDDEVICE);
+        }
+        m_joinIndParams.m_capabilityInfo = capability.GetCapability();
+        m_joinIndParams.m_extendedAddress = params.m_orphanAddr;
+        m_joinIndParams.m_networkAddress = entry->GetNwkAddr();
+        m_joinIndParams.m_rejoinNetwork = DIRECT_OR_REJOIN;
+
+        NS_LOG_DEBUG("[NLME-JOIN.request]: ["
+                     << params.m_orphanAddr << " | " << entry->GetNwkAddr()
+                     << "] found in neighbor table, responding to orphaned device");
+
+        Simulator::ScheduleNow(&LrWpanMacBase::MlmeOrphanResponse, m_mac, respParams);
+    }
+}
+
+void
+ZigbeeNwk::MlmeCommStatusIndication(MlmeCommStatusIndicationParams params)
+{
+    NS_LOG_FUNCTION(this);
+
+    // Return the results to the next layer of the router or coordinator
+    // only after a SUCCESSFUL join to the network.
+    if (params.m_status == MacStatus::SUCCESS)
+    {
+        if (params.m_dstExtAddr == m_joinIndParams.m_extendedAddress &&
+            m_joinIndParams.m_rejoinNetwork == DIRECT_OR_REJOIN)
+        {
+            NlmeJoinIndicationParams joinIndParams = m_joinIndParams;
+            m_joinIndParams = {};
+
+            if (!m_nlmeJoinIndicationCallback.IsNull())
+            {
+                m_nlmeJoinIndicationCallback(joinIndParams);
+            }
+        }
+        else if (params.m_dstExtAddr == m_joinIndParams.m_extendedAddress &&
+                 m_joinIndParams.m_rejoinNetwork == ASSOCIATION)
+        {
+            m_pendPrimitiveNwk = NLME_JOIN_INDICATION;
+            UpdateBeaconPayloadLength();
+        }
+    }
+
+    // TODO: Handle other situations for MlmeCommStatusIndication according
+    // to the status and primitive in use.
+}
+
+void
+ZigbeeNwk::MlmeBeaconNotifyIndication(MlmeBeaconNotifyIndicationParams params)
+{
+    NS_LOG_FUNCTION(this);
+
+    // Zigbee specification  Section 3.6.1.3
+    // Update Neighbor Table with information of the beacon payload
+    // during a network-discovery
+
+    if ((params.m_sdu->GetSize() == 0) ||
+        (params.m_panDescriptor.m_coorAddrMode != lrwpan::AddressMode::SHORT_ADDR))
+    {
+        // The beacon do not contain beacon payload or is for a different network
+        // stop any further process.
+        return;
+    }
+
+    ZigbeeBeaconPayload beaconPayload;
+    params.m_sdu->RemoveHeader(beaconPayload);
+
+    if (beaconPayload.GetProtocolId() != 0)
+    {
+        return;
+    }
+
+    // TODO: Add a Permit to join, stack profile , update id and capability  check
+
+    if (m_pendPrimitiveNwk == NLME_NET_DISCV)
+    {
+        // Keep a network descriptor list from the information in the beacon
+        // to later on pass to the next higher layer when the network-discovery
+        // process is over (NLME-NETWORK-DISCOVERY.confirm)
+        NetworkDescriptor descriptor;
+        descriptor.m_extPanId = beaconPayload.GetExtPanId();
+        descriptor.m_panId = params.m_panDescriptor.m_coorPanId;
+        descriptor.m_updateId = 0; // TODO: unknown
+        descriptor.m_logCh = params.m_panDescriptor.m_logCh;
+        descriptor.m_stackProfile = static_cast<StackProfile>(beaconPayload.GetStackProfile());
+        descriptor.m_zigbeeVersion = beaconPayload.GetProtocolId();
+
+        SuperframeInformation superframe(params.m_panDescriptor.m_superframeSpec);
+        descriptor.m_beaconOrder = superframe.GetBeaconOrder();
+        descriptor.m_superframeOrder = superframe.GetFrameOrder();
+        descriptor.m_permitJoining = superframe.IsAssocPermit();
+
+        descriptor.m_routerCapacity = beaconPayload.GetRouterCapacity();
+        descriptor.m_endDeviceCapacity = beaconPayload.GetEndDevCapacity();
+        m_networkDescriptorList.emplace_back(descriptor);
+
+        // Keep track of the pan id (16 bits) and the extended PAN id for
+        // future join (association) procedures.
+        m_panIdTable.AddEntry(descriptor.m_extPanId, descriptor.m_panId);
+        // NOTE:  In Zigbee all PAN coordinators or routers work with a
+        //        SOURCE short address addressing mode, therefore the PAN descriptors only
+        //        contain the short address.
+        NS_LOG_DEBUG("Received beacon frame from [" << params.m_panDescriptor.m_coorShortAddr
+                                                    << "]");
+    }
+
+    Ptr<NeighborTableEntry> entry;
+    if (m_nwkNeighborTable.LookUpEntry(params.m_panDescriptor.m_coorShortAddr, entry))
+    {
+        // Update Neighbor table with the info of the received beacon
+
+        entry->SetNwkAddr(params.m_panDescriptor.m_coorShortAddr);
+        entry->SetTimeoutCounter(Seconds(15728640));
+        entry->SetDevTimeout(Minutes(RequestedTimeoutField[m_nwkEndDeviceTimeoutDefault]));
+        entry->SetLqi(params.m_panDescriptor.m_linkQuality);
+        entry->SetOutgoingCost(GetLQINonLinearValue(params.m_panDescriptor.m_linkQuality));
+        // m_nwkNeighborTable.Update(params.m_panDescriptor.m_coorShortAddr, entry);
+        //  TODO: Update other fields if necessary and
+        //        Additional and optional fields.
+    }
+    else
+    {
+        // Add a new entry to the neighbor table, information comes from
+        // the MAC PAN descriptor and the beacon payload received.
+        NwkDeviceType devType;
+        if (params.m_panDescriptor.m_coorShortAddr == Mac16Address("00:00"))
+        {
+            devType = NwkDeviceType::ZIGBEE_COORDINATOR;
+        }
+        else
+        {
+            devType = NwkDeviceType::ZIGBEE_ROUTER;
+        }
+
+        // Create neighbor table entry with the basic fields
+        Ptr<NeighborTableEntry> newEntry =
+            Create<NeighborTableEntry>(Mac64Address("FF:FF:FF:FF:FF:FF:FF:FF"),
+                                       params.m_panDescriptor.m_coorShortAddr,
+                                       devType,
+                                       true,
+                                       0,
+                                       Seconds(15728640),
+                                       Minutes(RequestedTimeoutField[m_nwkEndDeviceTimeoutDefault]),
+                                       NBR_NONE,
+                                       0,
+                                       params.m_panDescriptor.m_linkQuality,
+                                       GetLQINonLinearValue(params.m_panDescriptor.m_linkQuality),
+                                       0,
+                                       false,
+                                       0);
+
+        // If necessary add information to the
+        // additional and optional fields. Currently only 2 additional fields are added:
+        newEntry->SetExtPanId(beaconPayload.GetExtPanId());
+        newEntry->SetLogicalCh(params.m_panDescriptor.m_logCh);
+
+        m_nwkNeighborTable.AddEntry(newEntry);
+    }
+}
+
+void
+ZigbeeNwk::MlmeAssociateIndication(MlmeAssociateIndicationParams params)
+{
+    NS_LOG_FUNCTION(this);
+
+    // Joining Procedure through Association (Parent procedure)
+    // Zigbee Specification 3.6.1.4.1
+
+    CapabilityInformation receivedCapability(params.capabilityInfo);
+    auto devType = static_cast<NwkDeviceType>(receivedCapability.GetDeviceType());
+
+    Ptr<NeighborTableEntry> entry;
+    if (m_nwkNeighborTable.LookUpEntry(params.m_extDevAddr, entry))
+    {
+        if (entry->GetDeviceType() == devType)
+        {
+            MlmeAssociateResponseParams responseParams;
+            responseParams.m_status = MacStatus::SUCCESS;
+            responseParams.m_assocShortAddr = entry->GetNwkAddr();
+            responseParams.m_extDevAddr = entry->GetExtAddr();
+            Simulator::ScheduleNow(&LrWpanMacBase::MlmeAssociateResponse, m_mac, responseParams);
+        }
+        else
+        {
+            m_nwkNeighborTable.Delete(params.m_extDevAddr);
+            MlmeAssociateIndication(params);
+        }
+    }
+    else
+    {
+        // Device currently do not exist in coordinator,
+        // allocate an address and add to neighbor table.
+
+        Mac16Address allocatedAddr;
+        if (receivedCapability.IsAllocateAddrOn())
+        {
+            allocatedAddr = AllocateNetworkAddress();
+        }
+        else
+        {
+            // The device is associated but it will only use its
+            // extended address (EUI-64 also known as IEEE Address)
+            allocatedAddr = Mac16Address("FF:FE");
+        }
+
+        CapabilityInformation capability(params.capabilityInfo);
+
+        Ptr<NeighborTableEntry> newEntry =
+            Create<NeighborTableEntry>(params.m_extDevAddr,
+                                       allocatedAddr,
+                                       devType,
+                                       capability.IsReceiverOnWhenIdle(),
+                                       0,
+                                       Seconds(15728640),
+                                       Minutes(RequestedTimeoutField[m_nwkEndDeviceTimeoutDefault]),
+                                       NBR_CHILD,
+                                       0,
+                                       params.lqi,
+                                       0,
+                                       0,
+                                       true,
+                                       0);
+        // Optional parameters
+        newEntry->SetExtPanId(m_nwkExtendedPanId);
+
+        MlmeAssociateResponseParams responseParams;
+        responseParams.m_extDevAddr = params.m_extDevAddr;
+
+        if (m_nwkNeighborTable.AddEntry(newEntry))
+        {
+            responseParams.m_status = MacStatus::SUCCESS;
+            responseParams.m_assocShortAddr = allocatedAddr;
+
+            // Temporarily store the NLME-JOIN.indications parameters that will be
+            // returned after the association process concludes.
+            // (after MLME-COMM-STATUS.indication received and beacon payload updated)
+            m_joinIndParams.m_capabilityInfo = receivedCapability.GetCapability();
+            m_joinIndParams.m_extendedAddress = params.m_extDevAddr;
+            m_joinIndParams.m_networkAddress = allocatedAddr;
+            m_joinIndParams.m_rejoinNetwork = ASSOCIATION;
+        }
+        else
+        {
+            responseParams.m_status = MacStatus::FULL_CAPACITY;
+            responseParams.m_assocShortAddr = Mac16Address("FF:FF");
+        }
+
+        NS_LOG_DEBUG("\n              "
+                     << "Storing an Associate response command with the allocated address "
+                     << "[" << responseParams.m_assocShortAddr << "]");
+
+        Simulator::ScheduleNow(&LrWpanMacBase::MlmeAssociateResponse, m_mac, responseParams);
+    }
+}
+
+void
+ZigbeeNwk::NldeDataRequest(NldeDataRequestParams params, Ptr<Packet> packet)
+{
+    NS_LOG_FUNCTION(this << packet);
+
+    if (params.m_dstAddr == m_nwkNetworkAddress)
+    {
+        NS_LOG_DEBUG("The source and the destination of the route request are the same!");
+        return;
+    }
+
+    // Zigbee specification r22.1.0, Section 3.2.1.1.3 and Section 3.6.2.1
+    // check that we are associated
+    if (m_nwkNetworkAddress == "FF:FF")
+    {
+        NS_LOG_DEBUG("Cannot send data, the device is not currently associated");
+
+        if (!m_nldeDataConfirmCallback.IsNull())
+        {
+            NldeDataConfirmParams confirmParams;
+            confirmParams.m_status = NwkStatus::INVALID_REQUEST;
+            confirmParams.m_txTime = Simulator::Now();
+            confirmParams.m_nsduHandle = params.m_nsduHandle;
+            m_nldeDataConfirmCallback(confirmParams);
+        }
+        return;
+    }
+
+    // Constructing the NPDU (Zigbee specification r22.1.0, Section 3.2.1.1.3 and Section 3.6.2.1)
+    ZigbeeNwkHeader nwkHeader;
+    nwkHeader.SetFrameType(DATA);
+    nwkHeader.SetProtocolVer(3);
+    nwkHeader.SetDiscoverRoute(static_cast<DiscoverRouteType>(params.m_discoverRoute));
+    nwkHeader.SetDstAddr(params.m_dstAddr);
+
+    if (params.m_useAlias)
+    {
+        nwkHeader.SetSrcAddr(params.m_aliasSrcAddr);
+        nwkHeader.SetSeqNum(params.m_aliasSeqNumber.GetValue());
+    }
+    else
+    {
+        nwkHeader.SetSrcAddr(m_nwkNetworkAddress);
+        nwkHeader.SetSeqNum(m_nwkSequenceNumber.GetValue());
+    }
+
+    if (params.m_radius == 0)
+    {
+        nwkHeader.SetRadius(m_nwkMaxDepth * 2);
+    }
+    else
+    {
+        nwkHeader.SetRadius(params.m_radius);
+    }
+
+    if (params.m_securityEnable)
+    {
+        // TODO: Secure processing (Section 3.6.2.1)
+        NS_ABORT_MSG("Security processing is currently not supported");
+    }
+
+    // Check the current device capabilities
+    CapabilityInformation capability;
+    capability.SetCapability(m_nwkCapabilityInformation);
+
+    if (capability.GetDeviceType() == ENDDEVICE)
+    {
+        nwkHeader.SetEndDeviceInitiator();
+    }
+
+    if (params.m_dstAddrMode == MCST)
+    {
+        nwkHeader.SetMulticast();
+        // TODO:
+        // set the nwkHeader multicast control according to
+        // the values of the non-member radios parameter
+        // See 3.2.1.1.3
+    }
+
+    packet->AddHeader(nwkHeader);
+
+    if (capability.GetDeviceType() == ROUTER)
+    {
+        if (params.m_dstAddrMode == MCST)
+        {
+            // The destination is MULTICAST (See 3.6.2)
+            NS_ABORT_MSG("Multicast is currently not supported");
+            // TODO
+            return;
+        }
+        else if (IsBroadcastAddress(params.m_dstAddr))
+        {
+            // The destination is BROADCAST (See 3.6.5)
+            SendDataBcst(packet, params.m_nsduHandle);
+        }
+        else
+        {
+            // The destination is UNICAST (See 3.6.3.3)
+            SendDataUcst(packet, params.m_nsduHandle);
+        }
+    }
+    else
+    {
+        // The device is an END DEVICE
+        // direct message to its Parent device (Coordinator)
+        Ptr<NeighborTableEntry> entry;
+        if (m_nwkNeighborTable.GetParent(entry))
+        {
+            // Buffer a copy of the DATA packet that will be transmitted
+            // for handling after transmission (i.e. NSDE-DATA.confirm)
+            BufferTxPkt(packet->Copy(), m_macHandle.GetValue(), params.m_nsduHandle);
+
+            McpsDataRequestParams mcpsDataparams;
+            mcpsDataparams.m_txOptions = 0x01; // Acknowledment on.
+            mcpsDataparams.m_dstPanId = m_nwkPanId;
+            mcpsDataparams.m_msduHandle = m_macHandle.GetValue();
+            mcpsDataparams.m_srcAddrMode = SHORT_ADDR;
+            mcpsDataparams.m_dstAddrMode = SHORT_ADDR;
+            mcpsDataparams.m_dstAddr = entry->GetNwkAddr();
+            m_macHandle++;
+            Simulator::ScheduleNow(&LrWpanMacBase::McpsDataRequest, m_mac, mcpsDataparams, packet);
+        }
+        else
+        {
+            // Section 3.6.3.7.1
+            // Link failure with Parent device
+            // TODO
+            /*
+            if (!m_nlmeNwkStatusIndicationCallback.IsNull())
+            {
+                NlmeNetworkStatusIndication indicationParams;
+
+                 m_networkStatusCode = PARENT_LINK_FAILURE;
+                m_nlmeNwkStatusIndicationCallback(confirmParams);
+            }
+            */
+        }
+    }
+    m_pendPrimitiveNwk = NLDE_NLME_NONE;
+}
+
+void
+ZigbeeNwk::NlmeNetworkFormationRequest(NlmeNetworkFormationRequestParams params)
+{
+    NS_LOG_FUNCTION(this);
+
+    NS_ASSERT_MSG(m_netFormParams.m_scanChannelList.channelPageCount ==
+                      m_netFormParams.m_scanChannelList.channelsField.size(),
+                  "channelsField and its channelPageCount size do not match "
+                  "in networkFormationParams");
+
+    if (!m_nwkcCoordinatorCapable)
+    {
+        m_pendPrimitiveNwk = NLDE_NLME_NONE;
+        m_netFormParams = {};
+        m_netFormParamsGen = nullptr;
+
+        if (!m_nlmeNetworkFormationConfirmCallback.IsNull())
+        {
+            NlmeNetworkFormationConfirmParams confirmParams;
+            confirmParams.m_status = NwkStatus::INVALID_REQUEST;
+            m_nlmeNetworkFormationConfirmCallback(confirmParams);
+        }
+        return;
+    }
+
+    if (params.m_distributedNetwork)
+    {
+        // Zigbee Specification r22.1.0, 3.2.2.5 , 3)
+        // Verify Distributed Network Address is in a valid range.
+        // TODO: Verify the address is not > 0xFFF7
+        if (params.m_distributedNetwork == Mac16Address("00:00"))
+        {
+            m_pendPrimitiveNwk = NLDE_NLME_NONE;
+            m_netFormParams = {};
+            m_netFormParamsGen = nullptr;
+
+            if (!m_nlmeNetworkFormationConfirmCallback.IsNull())
+            {
+                NlmeNetworkFormationConfirmParams confirmParams;
+                confirmParams.m_status = NwkStatus::INVALID_REQUEST;
+                m_nlmeNetworkFormationConfirmCallback(confirmParams);
+            }
+            return;
+        }
+    }
+
+    // 4. On receipt of this primitive the NLME shall first validate the
+    //  ChannelListStructure parameter according to section 3.2.2.2.2.
+    // (if nwkMacInterfaceTable support is added)
+    // If validation fails the NLME-NETWORK-FORMATION.confirm
+    // primitive shall be issued with a Status parameter set to INVALID_PARAMETER.
+
+    if (params.m_scanChannelList.channelPageCount != 1)
+    {
+        NS_FATAL_ERROR("Multi page scanning not supported");
+    }
+
+    // Only page 0 is supported (O-QPSK 250 kbps)
+    // Take 5 MSB bits: b27-b31 to check the page
+    uint32_t page = (params.m_scanChannelList.channelsField[0] >> 27) & (0x01F);
+
+    if (page != 0)
+    {
+        NS_FATAL_ERROR("PHY band not supported (Only page 0 is supported)");
+    }
+
+    uint8_t channelsCount = 0;
+    for (int i = 11; i <= 26; i++)
+    {
+        channelsCount += (params.m_scanChannelList.channelsField[0] >> i) & 1;
+    }
+
+    m_pendPrimitiveNwk = NLME_NETWORK_FORMATION;
+    m_netFormParams = params;
+
+    if (channelsCount == 1)
+    {
+        // There is only 1 channel, skip energy scan and go directly to
+        // active scan instead
+        MlmeScanRequestParams mlmeParams;
+        mlmeParams.m_chPage = page;
+        mlmeParams.m_scanChannels = params.m_scanChannelList.channelsField[0];
+        mlmeParams.m_scanDuration = params.m_scanDuration;
+        mlmeParams.m_scanType = MLMESCAN_ACTIVE;
+        Simulator::ScheduleNow(&LrWpanMacBase::MlmeScanRequest, m_mac, mlmeParams);
+    }
+    else if (channelsCount > 1)
+    {
+        MlmeScanRequestParams mlmeParams;
+        mlmeParams.m_chPage = page;
+        mlmeParams.m_scanChannels = params.m_scanChannelList.channelsField[0];
+        mlmeParams.m_scanDuration = params.m_scanDuration;
+        mlmeParams.m_scanType = MLMESCAN_ED;
+        Simulator::ScheduleNow(&LrWpanMacBase::MlmeScanRequest, m_mac, mlmeParams);
+    }
+}
+
+void
+ZigbeeNwk::NlmeRouteDiscoveryRequest(NlmeRouteDiscoveryRequestParams params)
+{
+    NS_LOG_FUNCTION(this);
+
+    if (params.m_dstAddr == m_nwkNetworkAddress && params.m_dstAddrMode == UCST_BCST)
+    {
+        NS_FATAL_ERROR("The source and the destination of the route request are the same!");
+        return;
+    }
+
+    // (See 3.2.2.33.3)
+    // - Check the device has routing capacity
+    // - Check the device dstAddrMode != NO_ADDRESS &&  dst != Broadcast address
+    if (params.m_dstAddrMode != NO_ADDRESS && IsBroadcastAddress(params.m_dstAddr))
+    {
+        if (!m_nlmeRouteDiscoveryConfirmCallback.IsNull())
+        {
+            NlmeRouteDiscoveryConfirmParams confirmParams;
+            confirmParams.m_status = NwkStatus::INVALID_REQUEST;
+            m_nlmeRouteDiscoveryConfirmCallback(confirmParams);
+        }
+        return;
+    }
+
+    CapabilityInformation capability;
+    capability.SetCapability(m_nwkCapabilityInformation);
+    if (capability.GetDeviceType() != ROUTER && params.m_dstAddrMode != NO_ADDRESS)
+    {
+        if (!m_nlmeRouteDiscoveryConfirmCallback.IsNull())
+        {
+            NlmeRouteDiscoveryConfirmParams confirmParams;
+            confirmParams.m_status = NwkStatus::ROUTE_ERROR;
+            m_nlmeRouteDiscoveryConfirmCallback(confirmParams);
+        }
+        return;
+    }
+
+    m_pendPrimitiveNwk = NLME_ROUTE_DISCOVERY;
+
+    ZigbeeNwkHeader nwkHeader;
+    nwkHeader.SetFrameType(NWK_COMMAND);
+    nwkHeader.SetProtocolVer(m_nwkcProtocolVersion);
+    nwkHeader.SetDiscoverRoute(DiscoverRouteType::ENABLE_ROUTE_DISCOVERY);
+    // See r22.1.0, Table 3-69
+    // Set destination to broadcast (all routers and coordinator)
+    nwkHeader.SetDstAddr(Mac16Address("FF:FC"));
+    nwkHeader.SetSrcAddr(m_nwkNetworkAddress);
+    nwkHeader.SetSeqNum(m_nwkSequenceNumber.GetValue());
+
+    ZigbeePayloadRouteRequestCommand payload;
+    payload.SetRouteReqId(m_routeRequestId.GetValue());
+    payload.SetPathCost(0);
+
+    if (params.m_dstAddrMode == UCST_BCST)
+    {
+        // Set the rest of the nwkHeader and command payload parameters
+        // as described in Zigbee specification, Section 3.2.2.33.3
+        if (params.m_radius == 0)
+        {
+            nwkHeader.SetRadius(m_nwkMaxDepth * 2);
+        }
+        else
+        {
+            nwkHeader.SetRadius(params.m_radius);
+        }
+
+        payload.SetDstAddr(params.m_dstAddr);
+
+        Mac16Address nextHop;
+        RouteDiscoveryStatus routeStatus =
+            FindNextHop(m_nwkNetworkAddress, 0, nwkHeader, payload, nextHop);
+
+        if (routeStatus == ROUTE_FOUND)
+        {
+            if (!m_nlmeRouteDiscoveryConfirmCallback.IsNull())
+            {
+                NlmeRouteDiscoveryConfirmParams confirmParams;
+                confirmParams.m_status = NwkStatus::SUCCESS;
+                m_nlmeRouteDiscoveryConfirmCallback(confirmParams);
+            }
+        }
+        else if (routeStatus == ROUTE_NOT_FOUND)
+        {
+            // Route not found. Route marked as DISCOVER UNDERWAY,
+            // we initiate route discovery.
+            Simulator::Schedule(MilliSeconds(m_rreqJitter->GetValue()),
+                                &ZigbeeNwk::SendRREQ,
+                                this,
+                                nwkHeader,
+                                payload,
+                                m_nwkcInitialRREQRetries);
+
+            m_nwkSequenceNumber++;
+            m_routeRequestId++;
+        }
+    }
+    else if (params.m_dstAddrMode == MCST)
+    {
+        NS_ABORT_MSG("Multicast Route discovery not supported");
+    }
+    else if (params.m_dstAddrMode == NO_ADDRESS)
+    {
+        // Many-to-one route discovery.
+        // (See Last paragraph of Zigbee Specification, Section 3.6.3.5.1)
+        m_nwkIsConcentrator = true;
+
+        nwkHeader.SetRadius(m_nwkConcentratorRadius);
+
+        payload.SetDstAddr(Mac16Address("FF:FF"));
+        if (params.m_noRouteCache)
+        {
+            payload.SetCmdOptManyToOneField(ManyToOne::NO_ROUTE_RECORD);
+        }
+        else
+        {
+            payload.SetCmdOptManyToOneField(ManyToOne::ROUTE_RECORD);
+        }
+
+        RouteDiscoveryStatus routeStatus =
+            ProcessManyToOneRoute(m_nwkNetworkAddress, 0, nwkHeader, payload);
+
+        if (routeStatus == MANY_TO_ONE_ROUTE || routeStatus == ROUTE_UPDATED)
+        {
+            // TODO if nwkConcentratorDiscoveryTime != 0,  schedule
+            // RREQ every nwkConcentratorDiscovery time.
+
+            Simulator::Schedule(MilliSeconds(m_rreqJitter->GetValue()),
+                                &ZigbeeNwk::SendRREQ,
+                                this,
+                                nwkHeader,
+                                payload,
+                                0);
+            m_nwkSequenceNumber++;
+            m_routeRequestId++;
+        }
+    }
+}
+
+void
+ZigbeeNwk::NlmeNetworkDiscoveryRequest(NlmeNetworkDiscoveryRequestParams params)
+{
+    NS_LOG_FUNCTION(this);
+
+    if (params.m_scanDuration > 14)
+    {
+        NS_FATAL_ERROR("Scan duration must be an int between 0 and 14");
+    }
+
+    if (params.m_scanChannelList.channelPageCount != params.m_scanChannelList.channelsField.size())
+    {
+        NS_FATAL_ERROR("In scanChannelList parameter, channelPageCount "
+                       "and the channelsField structure size does not match");
+    }
+
+    // TODO: Add support to scan other MAC interfaces, for the moment
+    // only a single interface and only Page 0 is supported (PHY O-QPSK 250 kbps)
+
+    if (params.m_scanChannelList.channelsField.size() != 1)
+    {
+        NS_FATAL_ERROR("Only a single MAC interface supported");
+    }
+
+    uint8_t page = (params.m_scanChannelList.channelsField[0] >> 27) & (0x01F);
+    if (page != 0)
+    {
+        NS_FATAL_ERROR("Only Page 0 (O-QPSK 250 kbps) is supported.");
+    }
+
+    m_pendPrimitiveNwk = NLME_NET_DISCV;
+
+    MlmeScanRequestParams scanParams;
+    scanParams.m_chPage = 0; // Only page 0 is supported.
+    scanParams.m_scanChannels = params.m_scanChannelList.channelsField[0];
+    scanParams.m_scanDuration = params.m_scanDuration;
+    scanParams.m_scanType = MLMESCAN_ACTIVE;
+
+    NS_LOG_DEBUG("Active scanning started, "
+                 << " on page " << page << " and channels 0x" << std::hex
+                 << params.m_scanChannelList.channelsField[0] << std::dec);
+
+    Simulator::ScheduleNow(&LrWpanMacBase::MlmeScanRequest, m_mac, scanParams);
+}
+
+void
+ZigbeeNwk::NlmeDirectJoinRequest(NlmeDirectJoinRequestParams params)
+{
+    NS_LOG_FUNCTION(this);
+
+    // TODO: Check the device is router or coordinator, send invalid_request
+    //       status otherwise. See 3.6.1.4.3.
+
+    Ptr<NeighborTableEntry> entry;
+    if (m_nwkNeighborTable.LookUpEntry(params.m_deviceAddr, entry))
+    {
+        NS_LOG_WARN("[NLME-DIRECT-JOIN.request]: "
+                    "Device already present in neighbor table. ");
+
+        if (!m_nlmeDirectJoinConfirmCallback.IsNull())
+        {
+            NlmeDirectJoinConfirmParams confirmParams;
+            confirmParams.m_status = NwkStatus::ALREADY_PRESENT;
+            confirmParams.m_deviceAddr = params.m_deviceAddr;
+            m_nlmeDirectJoinConfirmCallback(confirmParams);
+        }
+    }
+    else
+    {
+        CapabilityInformation capaInfo;
+        capaInfo.SetCapability(params.m_capabilityInfo);
+
+        Mac16Address allocatedAddr;
+        if (capaInfo.IsAllocateAddrOn())
+        {
+            allocatedAddr = AllocateNetworkAddress();
+        }
+        else
+        {
+            // The device is associated but it will only use its
+            // extended address (EUI-64 also known as IEEE Address)
+            allocatedAddr = Mac16Address("FF:FE");
+        }
+
+        NwkDeviceType devType;
+        if (capaInfo.GetDeviceType() == MacDeviceType::ROUTER)
+        {
+            devType = NwkDeviceType::ZIGBEE_ROUTER;
+        }
+        else
+        {
+            devType = NwkDeviceType::ZIGBEE_ENDDEVICE;
+        }
+
+        Ptr<NeighborTableEntry> newEntry =
+            Create<NeighborTableEntry>(params.m_deviceAddr,
+                                       allocatedAddr,
+                                       devType,
+                                       capaInfo.IsReceiverOnWhenIdle(),
+                                       0,
+                                       Seconds(15728640),
+                                       Minutes(RequestedTimeoutField[m_nwkEndDeviceTimeoutDefault]),
+                                       NBR_CHILD,
+                                       0,
+                                       255,
+                                       0,
+                                       0,
+                                       true,
+                                       0);
+
+        NlmeDirectJoinConfirmParams confirmParams;
+
+        if (m_nwkNeighborTable.AddEntry(newEntry))
+        {
+            NS_LOG_DEBUG("Device added to neighbor table (" << m_nwkNeighborTable.GetSize()
+                                                            << ") with address [" << allocatedAddr
+                                                            << " | " << params.m_deviceAddr << "]");
+            if (!m_nlmeDirectJoinConfirmCallback.IsNull())
+            {
+                confirmParams.m_status = NwkStatus::SUCCESS;
+                confirmParams.m_deviceAddr = params.m_deviceAddr;
+                m_nlmeDirectJoinConfirmCallback(confirmParams);
+            }
+        }
+        else
+        {
+            NS_LOG_WARN("Error, neighbor table is full");
+            if (!m_nlmeDirectJoinConfirmCallback.IsNull())
+            {
+                confirmParams.m_status = NwkStatus::NEIGHBOR_TABLE_FULL;
+                confirmParams.m_deviceAddr = params.m_deviceAddr;
+                m_nlmeDirectJoinConfirmCallback(confirmParams);
+            }
+        }
+    }
+}
+
+void
+ZigbeeNwk::NlmeJoinRequest(NlmeJoinRequestParams params)
+{
+    NS_LOG_FUNCTION(this);
+
+    if (params.m_scanDuration > 14)
+    {
+        NS_FATAL_ERROR("Scan duration must be an int between 0 and 14");
+    }
+
+    if (params.m_scanChannelList.channelPageCount != params.m_scanChannelList.channelsField.size())
+    {
+        NS_FATAL_ERROR("In scanChannelList parameter, channelPageCount "
+                       "and the channelsField structure size does not match");
+    }
+
+    // TODO: Add support to scan other MAC interfaces, for the moment
+    // only a single interface and only Page 0 is supported (PHY O-QPSK 250 kbps)
+
+    // TODO: Only devices who have not join another network can call JOIN.
+
+    if (params.m_scanChannelList.channelsField.size() != 1)
+    {
+        NS_FATAL_ERROR("Only a single MAC interface supported");
+    }
+
+    uint8_t page = (params.m_scanChannelList.channelsField[0] >> 27) & (0x01F);
+    if (page != 0)
+    {
+        NS_FATAL_ERROR("Only Page 0 (O-QPSK 250 kbps) is supported.");
+    }
+
+    m_pendPrimitiveNwk = NLME_JOIN;
+    m_joinParams = params;
+
+    if (params.m_rejoinNetwork == DIRECT_OR_REJOIN)
+    {
+        // Zigbee specification r22.1.0 Section 3.6.1.4.3.1,
+        // Child procedure for joining or re-joining a network through
+        // orphaning (DIRECT JOIN procedure).
+
+        MlmeScanRequestParams scanParams;
+        scanParams.m_chPage = page;
+        scanParams.m_scanChannels = params.m_scanChannelList.channelsField[0];
+
+        // Note: Scan duration is fixed to a macResponseWaitTime in an Orphan scan
+        //       (i.e. It does not use the scanDuration parameter)
+        scanParams.m_scanType = MLMESCAN_ORPHAN;
+        NS_LOG_DEBUG("Orphan scanning started, "
+                     << "sending orphan notifications on page " << page << " and channels "
+                     << std::hex << params.m_scanChannelList.channelsField[0]);
+
+        Simulator::ScheduleNow(&LrWpanMacBase::MlmeScanRequest, m_mac, scanParams);
+    }
+    else if (params.m_rejoinNetwork == ASSOCIATION)
+    {
+        // Check if we have the MAC pan id info recorded during the discovery process
+        uint16_t panId;
+        if (!m_panIdTable.GetEntry(params.m_extendedPanId, panId))
+        {
+            NS_LOG_ERROR("Error PAN id of neighbor device not found");
+        }
+
+        // Zigbee specification r22.1.0 Section 3.6.1.4.1
+        // Child procedure for joining a network through ASSOCIATION.
+
+        NlmeJoinConfirmParams joinConfirmParams;
+        Ptr<NeighborTableEntry> bestParentEntry;
+
+        if (m_nwkNeighborTable.LookUpForBestParent(params.m_extendedPanId, bestParentEntry))
+        {
+            MlmeAssociateRequestParams assocParams;
+            m_nwkCapabilityInformation = params.m_capabilityInfo;
+
+            assocParams.m_chNum = bestParentEntry->GetLogicalCh();
+            assocParams.m_chPage = 0; // Zigbee assumes Page is always 0
+            assocParams.m_capabilityInfo = params.m_capabilityInfo;
+            assocParams.m_coordPanId = panId;
+
+            if (bestParentEntry->GetNwkAddr() != Mac16Address("FF:FE"))
+            {
+                assocParams.m_coordAddrMode = lrwpan::AddressMode::SHORT_ADDR;
+                assocParams.m_coordShortAddr = bestParentEntry->GetNwkAddr();
+                NS_LOG_DEBUG("\n              "
+                             << "Send Association Request [" << bestParentEntry->GetNwkAddr()
+                             << "] | PAN ID: " << std::hex << "0x" << panId
+                             << " | Extended PAN ID: 0x" << params.m_extendedPanId << std::dec);
+            }
+            else
+            {
+                assocParams.m_coordAddrMode = lrwpan::AddressMode::EXT_ADDR;
+                assocParams.m_coordExtAddr = bestParentEntry->GetExtAddr();
+                NS_LOG_DEBUG("Send Assoc. Req. to [" << bestParentEntry->GetNwkAddr()
+                                                     << "] in \nPAN id and Ext PAN id: " << std::hex
+                                                     << "(0x" << panId << " | 0x"
+                                                     << params.m_extendedPanId << ")" << std::dec);
+            }
+
+            m_nwkParentInformation = 0;
+            m_nwkCapabilityInformation = params.m_capabilityInfo;
+
+            // Temporarily store MLME-ASSOCIATE.request parameters until the JOIN process concludes
+            m_associateParams = assocParams;
+
+            Simulator::ScheduleNow(&LrWpanMacBase::MlmeAssociateRequest, m_mac, assocParams);
+        }
+        else
+        {
+            m_pendPrimitiveNwk = NLDE_NLME_NONE;
+            m_joinParams = {};
+
+            if (!m_nlmeJoinConfirmCallback.IsNull())
+            {
+                joinConfirmParams.m_extendedPanId = params.m_extendedPanId;
+                joinConfirmParams.m_networkAddress = Mac16Address("FF:FF");
+                joinConfirmParams.m_enhancedBeacon = false;
+                joinConfirmParams.m_macInterfaceIndex = 0;
+                joinConfirmParams.m_status = NwkStatus::NOT_PERMITED;
+                m_nlmeJoinConfirmCallback(joinConfirmParams);
+            }
+        }
+    }
+    else
+    {
+        NS_FATAL_ERROR("Joining method not supported");
+    }
+}
+
+void
+ZigbeeNwk::NlmeStartRouterRequest(NlmeStartRouterRequestParams params)
+{
+    NS_LOG_FUNCTION(this);
+
+    NS_ASSERT_MSG(params.m_beaconOrder == 15, "Beacon mode not supported for zigbee");
+    NS_ASSERT_MSG(params.m_superframeOrder == 15, "Beacon mode not supported for zigbee");
+
+    CapabilityInformation capability;
+    capability.SetCapability(m_nwkCapabilityInformation);
+
+    if (capability.GetDeviceType() != MacDeviceType::ROUTER)
+    {
+        m_pendPrimitiveNwk = NLDE_NLME_NONE;
+        m_startRouterParams = {};
+        if (!m_nlmeStartRouterConfirmCallback.IsNull())
+        {
+            NlmeStartRouterConfirmParams confirmParams;
+            confirmParams.m_status = NwkStatus::INVALID_REQUEST;
+            m_nlmeStartRouterConfirmCallback(confirmParams);
+        }
+        NS_LOG_ERROR("This device is not a Zigbee Router or is not joined to this network");
+    }
+    else
+    {
+        m_pendPrimitiveNwk = NLME_START_ROUTER;
+        // store the NLME-START-ROUTER.request params while request the current channel
+        m_startRouterParams = params;
+        // request an update of the current channel in use in the PHY
+        Simulator::ScheduleNow(&LrWpanMacBase::MlmeGetRequest,
+                               m_mac,
+                               MacPibAttributeIdentifier::pCurrentChannel);
+    }
+}
+
+void
+ZigbeeNwk::SetNldeDataIndicationCallback(NldeDataIndicationCallback c)
+{
+    m_nldeDataIndicationCallback = c;
+}
+
+void
+ZigbeeNwk::SetNldeDataConfirmCallback(NldeDataConfirmCallback c)
+{
+    m_nldeDataConfirmCallback = c;
+}
+
+void
+ZigbeeNwk::SetNlmeNetworkFormationConfirmCallback(NlmeNetworkFormationConfirmCallback c)
+{
+    m_nlmeNetworkFormationConfirmCallback = c;
+}
+
+void
+ZigbeeNwk::SetNlmeNetworkDiscoveryConfirmCallback(NlmeNetworkDiscoveryConfirmCallback c)
+{
+    m_nlmeNetworkDiscoveryConfirmCallback = c;
+}
+
+void
+ZigbeeNwk::SetNlmeRouteDiscoveryConfirmCallback(NlmeRouteDiscoveryConfirmCallback c)
+{
+    m_nlmeRouteDiscoveryConfirmCallback = c;
+}
+
+void
+ZigbeeNwk::SetNlmeDirectJoinConfirmCallback(NlmeDirectJoinConfirmCallback c)
+{
+    m_nlmeDirectJoinConfirmCallback = c;
+}
+
+void
+ZigbeeNwk::SetNlmeJoinConfirmCallback(NlmeJoinConfirmCallback c)
+{
+    m_nlmeJoinConfirmCallback = c;
+}
+
+void
+ZigbeeNwk::SetNlmeJoinIndicationCallback(NlmeJoinIndicationCallback c)
+{
+    m_nlmeJoinIndicationCallback = c;
+}
+
+void
+ZigbeeNwk::SetNlmeStartRouterConfirmCallback(NlmeStartRouterConfirmCallback c)
+{
+    m_nlmeStartRouterConfirmCallback = c;
+}
+
+void
+ZigbeeNwk::EnqueuePendingTx(Ptr<Packet> p, uint8_t nsduHandle)
+{
+    // TODO : PurgeTxQueue();
+    if (m_pendingTxQueue.size() < m_maxPendingTxQueueSize)
+    {
+        ZigbeeNwkHeader peekedNwkHeader;
+        p->PeekHeader(peekedNwkHeader);
+
+        Ptr<PendingTxPkt> pendingTxPkt = Create<PendingTxPkt>();
+        pendingTxPkt->dstAddr = peekedNwkHeader.GetDstAddr();
+        pendingTxPkt->nsduHandle = nsduHandle;
+        pendingTxPkt->txPkt = p;
+        // TODO: expiration time here
+        m_pendingTxQueue.emplace_back(pendingTxPkt);
+        // TODO: pending trace here
+    }
+    else
+    {
+        // TODO: Drop trace here
+    }
+}
+
+bool
+ZigbeeNwk::DequeuePendingTx(Mac16Address dst, Ptr<PendingTxPkt> entry)
+{
+    // TODO : PurgeTxQueue();
+
+    /* std::erase_if(m_pendingTxQueue, [&dst](Ptr<PendingTxPkt> pkt) {
+         return pkt->dstAddr == dst;
+     });*/
+
+    for (auto iter = m_pendingTxQueue.begin(); iter != m_pendingTxQueue.end(); iter++)
+    {
+        if ((*iter)->dstAddr == dst)
+        {
+            *entry = **iter;
+            // TODO: Dequeue trace if needed here.
+            m_pendingTxQueue.erase(iter);
+            return true;
+        }
+    }
+    return false;
+}
+
+void
+ZigbeeNwk::DisposePendingTx()
+{
+    for (auto element : m_pendingTxQueue)
+    {
+        element = nullptr;
+    }
+    m_pendingTxQueue.clear();
+}
+
+void
+ZigbeeNwk::BufferTxPkt(Ptr<Packet> p, uint8_t macHandle, uint8_t nwkHandle)
+{
+    if (m_txBuffer.size() < m_txBufferMaxSize)
+    {
+        Ptr<TxPkt> txPkt = Create<TxPkt>();
+        txPkt->macHandle = macHandle;
+        txPkt->nwkHandle = nwkHandle;
+        txPkt->txPkt = p;
+        m_txBuffer.emplace_back(txPkt);
+    }
+    else
+    {
+        NS_LOG_DEBUG("Zigbee Tx Buffer is full, packet dropped.");
+        // TODO : Drop trace for TX buffer
+    }
+}
+
+bool
+ZigbeeNwk::RetrieveTxPkt(uint8_t macHandle, Ptr<TxPkt>& txPkt)
+{
+    for (auto bufferedPkt : m_txBuffer)
+    {
+        if (bufferedPkt->macHandle == macHandle)
+        {
+            txPkt = bufferedPkt;
+
+            std::erase_if(m_txBuffer,
+                          [&macHandle](Ptr<TxPkt> pkt) { return pkt->macHandle == macHandle; });
+
+            return true;
+        }
+    }
+    return false;
+}
+
+void
+ZigbeeNwk::DisposeTxPktBuffer()
+{
+    for (auto element : m_txBuffer)
+    {
+        element = nullptr;
+    }
+    m_txBuffer.clear();
+}
+
+NwkStatus
+ZigbeeNwk::GetNwkStatus(MacStatus macStatus) const
+{
+    return static_cast<NwkStatus>(macStatus);
+}
+
+Mac16Address
+ZigbeeNwk::AllocateNetworkAddress()
+{
+    NS_LOG_FUNCTION(this);
+
+    if (m_nwkAddrAlloc == DISTRIBUTED_ALLOC)
+    {
+        NS_FATAL_ERROR("Distributed allocation not supported");
+        return Mac16Address("FF:FF");
+    }
+    else if (m_nwkAddrAlloc == STOCHASTIC_ALLOC)
+    {
+        // See nwkNetworkAddress valid range Zigbee specification r22.1.0, 3.5.2
+        // Valid values in the Zigbee specification goes from 1 to 0xFFF7,
+        // However, the range 0x8000 to 0x9FFF is used for multicast in other networks
+        // (i.e. IPV6 over IEEE 802.15.4) for this reason, we avoid this range as well.
+        // See RFC 4944, Section 9
+        uint16_t rndValue = m_uniformRandomVariable->GetInteger(1, 0x7FFF);
+        uint16_t rndValue2 = m_uniformRandomVariable->GetInteger(0xA000, 0xFFF7);
+        uint16_t rndValue3 = m_uniformRandomVariable->GetInteger(1, 2);
+
+        Mac16Address allocAddr;
+        if (rndValue3 == 1)
+        {
+            allocAddr = Mac16Address(rndValue);
+        }
+        else
+        {
+            allocAddr = Mac16Address(rndValue2);
+        }
+        return allocAddr;
+    }
+    else
+    {
+        NS_FATAL_ERROR("Address allocation method not supported");
+        return Mac16Address("FF:FF");
+    }
+}
+
+uint8_t
+ZigbeeNwk::GetLQINonLinearValue(uint8_t lqi) const
+{
+    uint8_t mappedValue;
+
+    if (lqi > 50)
+    {
+        mappedValue = 1;
+    }
+    else if ((lqi <= 50) && (lqi > 45))
+    {
+        mappedValue = 2;
+    }
+    else if ((lqi <= 45) && (lqi > 40))
+    {
+        mappedValue = 3;
+    }
+    else if ((lqi <= 40) && (lqi > 38))
+    {
+        mappedValue = 4;
+    }
+    else if ((lqi <= 38) && (lqi > 35))
+    {
+        mappedValue = 5;
+    }
+    else if ((lqi <= 35) && (lqi > 24))
+    {
+        mappedValue = 6;
+    }
+    else
+    {
+        mappedValue = 7;
+    }
+
+    return mappedValue;
+}
+
+uint8_t
+ZigbeeNwk::GetLinkCost(uint8_t lqi) const
+{
+    NS_LOG_FUNCTION(this);
+
+    if (m_nwkReportConstantCost)
+    {
+        // Hop count based. Report constant value
+        return 7;
+    }
+    else
+    {
+        // Based on non-linear mapping of LQI
+        return GetLQINonLinearValue(lqi);
+    }
+}
+
+void
+ZigbeeNwk::SendRREQ(ZigbeeNwkHeader nwkHeader,
+                    ZigbeePayloadRouteRequestCommand payload,
+                    uint8_t rreqRetries)
+{
+    NS_LOG_FUNCTION(this);
+
+    ZigbeePayloadType payloadType(ROUTE_REQ_CMD);
+
+    Ptr<Packet> nsdu = Create<Packet>();
+    nsdu->AddHeader(payload);
+    nsdu->AddHeader(payloadType);
+    nsdu->AddHeader(nwkHeader);
+
+    if (payload.GetCmdOptManyToOneField() == ManyToOne::NO_MANY_TO_ONE &&
+        nwkHeader.GetRadius() != 0)
+    {
+        // Set RREQ RETRIES
+        Time rreqRetryTime = m_nwkcRREQRetryInterval + MilliSeconds(m_rreqJitter->GetValue());
+
+        Ptr<RreqRetryTableEntry> rreqRetryTableEntry;
+        if (m_rreqRetryTable.LookUpEntry(payload.GetRouteReqId(), rreqRetryTableEntry))
+        {
+            if (rreqRetryTableEntry->GetRreqRetryCount() >= rreqRetries)
+            {
+                NS_LOG_DEBUG("Maximum RREQ retries reached for dst [" << payload.GetDstAddr()
+                                                                      << "] and rreq ID "
+                                                                      << payload.GetRouteReqId());
+                // Note: The value of the maximum number of retries (rreqRetries) is either
+                // nwkcInitialRREQRetries or nwkcRREQRetries depending on where the RREQ is
+                // transmitted. See Zigbee specification r22.1.0, Section 3.6.3.5.1 This trace here
+                // is used to keep track when the maximum RREQ retries is reached.
+                m_rreqRetriesExhaustedTrace(payload.GetRouteReqId(),
+                                            payload.GetDstAddr(),
+                                            rreqRetries);
+            }
+            else
+            {
+                // Schedule the next RREQ RETRY event and update entry.
+                EventId rreqRetryEvent = Simulator::Schedule(rreqRetryTime,
+                                                             &ZigbeeNwk::SendRREQ,
+                                                             this,
+                                                             nwkHeader,
+                                                             payload,
+                                                             rreqRetries);
+
+                rreqRetryTableEntry->SetRreqRetryCount(rreqRetryTableEntry->GetRreqRetryCount() +
+                                                       1);
+                rreqRetryTableEntry->SetRreqEventId(rreqRetryEvent);
+            }
+        }
+        else
+        {
+            // Schedule the next RREQ RETRY and add a new record of the event.
+            EventId rreqRetryEvent = Simulator::Schedule(rreqRetryTime,
+                                                         &ZigbeeNwk::SendRREQ,
+                                                         this,
+                                                         nwkHeader,
+                                                         payload,
+                                                         rreqRetries);
+
+            Ptr<RreqRetryTableEntry> newEntry =
+                Create<RreqRetryTableEntry>(payload.GetRouteReqId(), rreqRetryEvent, 0);
+
+            m_rreqRetryTable.AddEntry(newEntry);
+        }
+    }
+
+    // Send the RREQ
+    // See Section 3.4.1.1 Mac Data Service Requirements for RREQ
+    if (nwkHeader.GetRadius() != 0)
+    {
+        McpsDataRequestParams params;
+        params.m_dstPanId = m_nwkPanId;
+        params.m_srcAddrMode = SHORT_ADDR;
+        params.m_dstAddrMode = SHORT_ADDR;
+        params.m_dstAddr = Mac16Address::GetBroadcast();
+        params.m_msduHandle = m_macHandle.GetValue();
+        m_macHandle++;
+        Simulator::ScheduleNow(&LrWpanMacBase::McpsDataRequest, m_mac, params, nsdu);
+    }
+    else
+    {
+        NS_LOG_DEBUG("Maximum radius reached, dropping RREQ");
+    }
+}
+
+void
+ZigbeeNwk::SendRREP(Mac16Address nextHop,
+                    Mac16Address originator,
+                    Mac16Address responder,
+                    uint8_t rreqId,
+                    uint8_t pathcost)
+{
+    NS_LOG_FUNCTION(this);
+
+    ZigbeeNwkHeader nwkHeader;
+    nwkHeader.SetFrameType(NWK_COMMAND);
+    nwkHeader.SetProtocolVer(m_nwkcProtocolVersion);
+    nwkHeader.SetDiscoverRoute(DiscoverRouteType::ENABLE_ROUTE_DISCOVERY);
+
+    nwkHeader.SetDstAddr(nextHop);
+    nwkHeader.SetSrcAddr(m_nwkNetworkAddress);
+    m_nwkSequenceNumber++;
+    nwkHeader.SetSeqNum(m_nwkSequenceNumber.GetValue());
+    // see Zigbee specification 3.4.2.2
+    // Use the maximum possible radius
+    nwkHeader.SetRadius(m_nwkMaxDepth * 2);
+
+    ZigbeePayloadType payloadType(ROUTE_REP_CMD);
+
+    ZigbeePayloadRouteReplyCommand payload;
+    payload.SetRouteReqId(rreqId);
+    payload.SetOrigAddr(originator);
+    payload.SetRespAddr(responder);
+    payload.SetPathCost(pathcost);
+
+    // See Section 3.4.2 Mac Data Service Requirements for RREP
+    McpsDataRequestParams params;
+    params.m_dstPanId = m_nwkPanId;
+    params.m_srcAddrMode = SHORT_ADDR;
+    params.m_dstAddrMode = SHORT_ADDR;
+    params.m_dstAddr = nextHop;
+    params.m_msduHandle = m_macHandle.GetValue();
+    m_macHandle++;
+
+    Ptr<Packet> nsdu = Create<Packet>();
+    nsdu->AddHeader(payload);
+    nsdu->AddHeader(payloadType);
+    nsdu->AddHeader(nwkHeader);
+
+    Simulator::ScheduleNow(&LrWpanMacBase::McpsDataRequest, m_mac, params, nsdu);
+}
+
+int64_t
+ZigbeeNwk::AssignStreams(int64_t stream)
+{
+    NS_LOG_FUNCTION(this << stream);
+    m_uniformRandomVariable->SetStream(stream);
+    return 1;
+}
+
+void
+ZigbeeNwk::UpdateBeaconPayloadLength()
+{
+    NS_LOG_FUNCTION(this);
+
+    ZigbeeBeaconPayload beaconPayloadHeader;
+    beaconPayloadHeader.SetStackProfile(static_cast<uint8_t>(m_nwkStackProfile));
+    beaconPayloadHeader.SetRouterCapacity(m_nwkcCoordinatorCapable);
+    beaconPayloadHeader.SetDeviceDepth(0); // Not used by stack profile (0x02 =ZIGBEE pro)
+    beaconPayloadHeader.SetEndDevCapacity(true);
+    beaconPayloadHeader.SetExtPanId(m_nwkExtendedPanId);
+    beaconPayloadHeader.SetTxOffset(0xFFFFFF);
+    // TODO: beaconPayload.SetNwkUpdateId(m_nwkUpdateId);
+
+    // Set the beacon payload length in the MAC PIBs and then proceed to
+    // update the beacon payload
+    m_beaconPayload = Create<Packet>();
+    m_beaconPayload->AddHeader(beaconPayloadHeader);
+    Ptr<MacPibAttributes> pibAttr = Create<MacPibAttributes>();
+    pibAttr->macBeaconPayloadLength = m_beaconPayload->GetSize();
+    Simulator::ScheduleNow(&LrWpanMacBase::MlmeSetRequest,
+                           m_mac,
+                           MacPibAttributeIdentifier::macBeaconPayloadLength,
+                           pibAttr);
+}
+
+void
+ZigbeeNwk::UpdateBeaconPayload()
+{
+    NS_LOG_FUNCTION(this);
+
+    // Extract octets from m_beaconPayload and copy them into the
+    // macBeaconPayload attribute
+    Ptr<MacPibAttributes> pibAttr = Create<MacPibAttributes>();
+    pibAttr->macBeaconPayload.resize(m_beaconPayload->GetSize());
+    m_beaconPayload->CopyData(pibAttr->macBeaconPayload.data(), m_beaconPayload->GetSize());
+    m_beaconPayload = nullptr;
+    Simulator::ScheduleNow(&LrWpanMacBase::MlmeSetRequest,
+                           m_mac,
+                           MacPibAttributeIdentifier::macBeaconPayload,
+                           pibAttr);
+}
+
+std::ostream&
+operator<<(std::ostream& os, const NwkStatus& state)
+{
+    switch (state)
+    {
+    case NwkStatus::SUCCESS:
+        os << "SUCCESS";
+        break;
+    case NwkStatus::FULL_CAPACITY:
+        os << "FULL CAPACITY";
+        break;
+    case NwkStatus::ACCESS_DENIED:
+        os << "ACCESS DENIED";
+        break;
+    case NwkStatus::COUNTER_ERROR:
+        os << "COUNTER ERROR";
+        break;
+    case NwkStatus::IMPROPER_KEY_TYPE:
+        os << "IMPROPER KEY TYPE";
+        break;
+    case NwkStatus::IMPROPER_SECURITY_LEVEL:
+        os << "IMPROPER SECURITY LEVEL";
+        break;
+    case NwkStatus::UNSUPPORTED_LEGACY:
+        os << "UNSUPPORTED LEGACY";
+        break;
+    case NwkStatus::UNSUPPORTED_SECURITY:
+        os << "UNSUPPORTED SECURITY";
+        break;
+    case NwkStatus::BEACON_LOSS:
+        os << "BEACON LOSS";
+        break;
+    case NwkStatus::CHANNEL_ACCESS_FAILURE:
+        os << "CHANNEL ACCESS FAILURE";
+        break;
+    case NwkStatus::DENIED:
+        os << "DENIED";
+        break;
+    case NwkStatus::DISABLE_TRX_FAILURE:
+        os << "DISABLE TRX FAILURE";
+        break;
+    case NwkStatus::SECURITY_ERROR:
+        os << "SECURITY ERROR";
+        break;
+    case NwkStatus::FRAME_TOO_LONG:
+        os << "FRAME TOO LONG";
+        break;
+    case NwkStatus::INVALID_GTS:
+        os << "INVALID GTS";
+        break;
+    case NwkStatus::INVALID_HANDLE:
+        os << "INVALID HANDLE";
+        break;
+    case NwkStatus::INVALID_PARAMETER_MAC:
+        os << "INVALID PARAMETER MAC";
+        break;
+    case NwkStatus::NO_ACK:
+        os << "NO ACKNOLEDGMENT";
+        break;
+    case NwkStatus::NO_BEACON:
+        os << "NO BEACON";
+        break;
+    case NwkStatus::NO_DATA:
+        os << "NO DATA";
+        break;
+    case NwkStatus::NO_SHORT_ADDRESS:
+        os << "NO SHORT ADDRESS";
+        break;
+    case NwkStatus::OUT_OF_CAP:
+        os << "OUT OF CAP";
+        break;
+    case NwkStatus::PAN_ID_CONFLICT:
+        os << "PAN ID CONFLICT";
+        break;
+    case NwkStatus::REALIGMENT:
+        os << "REALIGMENT";
+        break;
+    case NwkStatus::TRANSACTION_EXPIRED:
+        os << "TRANSACTION EXPIRED";
+        break;
+    case NwkStatus::TRANSACTION_OVERFLOW:
+        os << "TRANSACTION OVERFLOW";
+        break;
+    case NwkStatus::TX_ACTIVE:
+        os << "TX ACTIVE";
+        break;
+    case NwkStatus::UNAVAILABLE_KEY:
+        os << "UNAVAILABLE KEY";
+        break;
+    case NwkStatus::INVALID_ADDRESS:
+        os << "INVALID ADDRESS";
+        break;
+    case NwkStatus::ON_TIME_TOO_LONG:
+        os << "ON TIME TOO LONG";
+        break;
+    case NwkStatus::PAST_TIME:
+        os << "PAST TIME";
+        break;
+    case NwkStatus::TRACKING_OFF:
+        os << "TRACKING OFF";
+        break;
+    case NwkStatus::INVALID_INDEX:
+        os << "INVALID INDEX";
+        break;
+    case NwkStatus::READ_ONLY:
+        os << "READ ONLY";
+        break;
+    case NwkStatus::SUPERFRAME_OVERLAP:
+        os << "SUPERFRAME OVERLAP";
+        break;
+    case NwkStatus::INVALID_PARAMETER:
+        os << "INVALID PARAMETER";
+        break;
+    case NwkStatus::INVALID_REQUEST:
+        os << "INVALID REQUEST";
+        break;
+    case NwkStatus::NOT_PERMITED:
+        os << "NO PERMITED";
+        break;
+    case NwkStatus::STARTUP_FAILURE:
+        os << "STARTUP FAILURE";
+        break;
+    case NwkStatus::ALREADY_PRESENT:
+        os << "ALREADY PRESENT";
+        break;
+    case NwkStatus::SYNC_FAILURE:
+        os << "SYNC FAILURE";
+        break;
+    case NwkStatus::NEIGHBOR_TABLE_FULL:
+        os << "NEIGHBOR TABLE FULL";
+        break;
+    case NwkStatus::UNKNOWN_DEVICE:
+        os << "UNKNOWN DEVICE";
+        break;
+    case NwkStatus::UNSUPPORTED_ATTRIBUTE:
+        os << "UNSUPPORTED ATTRIBUTE";
+        break;
+    case NwkStatus::NO_NETWORKS:
+        os << "NO NETWORKS";
+        break;
+    case NwkStatus::MAX_FRM_COUNTER:
+        os << "MAX FRAME COUNTER";
+        break;
+    case NwkStatus::NO_KEY:
+        os << "NO KEY";
+        break;
+    case NwkStatus::BAD_CCM_OUTPUT:
+        os << "BAD CCM OUTPUT";
+        break;
+    case NwkStatus::ROUTE_DISCOVERY_FAILED:
+        os << "ROUTE DISCOVERY FAILED";
+        break;
+    case NwkStatus::ROUTE_ERROR:
+        os << "ROUTE ERROR";
+        break;
+    case NwkStatus::BT_TABLE_FULL:
+        os << "BT TABLE FULL";
+        break;
+    case NwkStatus::FRAME_NOT_BUFFERED:
+        os << "FRAME NOT BUFFERED";
+        break;
+    case NwkStatus::INVALID_INTERFACE:
+        os << "INVALID INTERFACE";
+        break;
+    case NwkStatus::LIMIT_REACHED:
+        os << "LIMIT REACHED";
+        break;
+    case NwkStatus::SCAN_IN_PROGRESS:
+        os << "SCAN IN PROGRESS";
+        break;
+    }
+    return os;
+}
+
+std::ostream&
+operator<<(std::ostream& os, const std::vector<uint8_t>& vec)
+{
+    std::copy(vec.begin(), vec.end(), std::ostream_iterator<uint16_t>(os, " "));
+    return os;
+}
+
+std::ostream&
+operator<<(std::ostream& os, const uint8_t& num)
+{
+    os << static_cast<uint16_t>(num);
+    return os;
+}
+
+} // namespace zigbee
+} // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/zigbee/model/zigbee-nwk-fields.cc ns-3.44/src/zigbee/model/zigbee-nwk-fields.cc
--- ns-3.43/src/zigbee/model/zigbee-nwk-fields.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/zigbee/model/zigbee-nwk-fields.cc	2025-03-09 16:55:49.819372700 -0700
@@ -0,0 +1,162 @@
+/*
+ * Copyright (c) 2024 Tokushima University, Japan
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Author: Alberto Gallegos Ramonet <alramonet@is.tokushima-u.ac.jp>
+ *
+ */
+
+#include "zigbee-nwk-fields.h"
+
+#include "ns3/log.h"
+
+namespace ns3
+{
+namespace zigbee
+{
+
+NS_LOG_COMPONENT_DEFINE("ZigbeeNwkFields");
+
+CapabilityInformation::CapabilityInformation()
+{
+    m_allocateAddr = false;
+    m_deviceType = ROUTER;
+    m_powerSource = OTHER_POWER_SOURCE;
+    m_receiverOnWhenIdle = true;
+    m_securityCapability = false;
+    m_allocateAddr = true;
+}
+
+CapabilityInformation::CapabilityInformation(uint8_t bitmap)
+{
+    SetCapability(bitmap);
+}
+
+uint8_t
+CapabilityInformation::GetCapability() const
+{
+    uint8_t capability;
+
+    capability = m_alternatePanCoord & (0x01);          // Bits 0
+    capability |= ((m_deviceType & 0x01) << 1);         // Bit 1
+    capability |= ((m_powerSource & 0x01) << 2);        // Bit 2
+    capability |= ((m_receiverOnWhenIdle & 0x01) << 3); // Bit 3
+                                                        // Bit 4-5 (Reserved)
+    capability |= ((m_securityCapability & 0x01) << 6); // Bit 6
+    capability |= ((m_allocateAddr & 0x01) << 7);       // Bit 7
+
+    return capability;
+}
+
+bool
+CapabilityInformation::IsAlternatePanCoord() const
+{
+    return m_alternatePanCoord;
+}
+
+MacDeviceType
+CapabilityInformation::GetDeviceType() const
+{
+    return m_deviceType;
+}
+
+PowerSource
+CapabilityInformation::GetPowerSource() const
+{
+    return m_powerSource;
+}
+
+bool
+CapabilityInformation::IsReceiverOnWhenIdle() const
+{
+    return m_receiverOnWhenIdle;
+}
+
+bool
+CapabilityInformation::IsAllocateAddrOn() const
+{
+    return m_allocateAddr;
+}
+
+void
+CapabilityInformation::SetCapability(uint8_t capability)
+{
+    m_alternatePanCoord = (capability) & (0x01);                           // Bit 0
+    m_deviceType = static_cast<MacDeviceType>((capability >> 1) & (0x01)); // Bit 1
+    m_powerSource = static_cast<PowerSource>((capability >> 2) & (0x01));  // Bit 2
+    m_receiverOnWhenIdle = (capability >> 3) & (0x01);                     // Bit 3
+                                                                           // Bit 4-5 (Reserved)
+    m_securityCapability = (capability >> 6) & (0x01);                     // Bit 6
+    m_allocateAddr = (capability >> 7) & (0x01);                           // Bit 7
+}
+
+void
+CapabilityInformation::SetDeviceType(MacDeviceType devType)
+{
+    m_deviceType = devType;
+}
+
+void
+CapabilityInformation::SetPowerSource(PowerSource powerSource)
+{
+    m_powerSource = powerSource;
+}
+
+void
+CapabilityInformation::SetReceiverOnWhenIdle(bool value)
+{
+    m_receiverOnWhenIdle = value;
+}
+
+void
+CapabilityInformation::SetAllocateAddrOn(bool value)
+{
+    m_allocateAddr = value;
+}
+
+SuperframeInformation::SuperframeInformation()
+{
+}
+
+SuperframeInformation::SuperframeInformation(uint16_t bitmap)
+{
+    SetSuperframe(bitmap);
+}
+
+void
+SuperframeInformation::SetSuperframe(uint16_t superFrmSpec)
+{
+    m_sspecBcnOrder = (superFrmSpec) & (0x0F);         // Bits 0-3
+    m_sspecSprFrmOrder = (superFrmSpec >> 4) & (0x0F); // Bits 4-7
+
+    m_sspecPanCoor = (superFrmSpec >> 14) & (0x01);     // Bit 14
+    m_sspecAssocPermit = (superFrmSpec >> 15) & (0x01); // Bit 15
+}
+
+uint8_t
+SuperframeInformation::GetBeaconOrder() const
+{
+    return m_sspecBcnOrder;
+}
+
+uint8_t
+SuperframeInformation::GetFrameOrder() const
+{
+    return m_sspecSprFrmOrder;
+}
+
+bool
+SuperframeInformation::IsPanCoor() const
+{
+    return m_sspecPanCoor;
+}
+
+bool
+SuperframeInformation::IsAssocPermit() const
+{
+    return m_sspecAssocPermit;
+}
+
+} // namespace zigbee
+} // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/zigbee/model/zigbee-nwk-fields.h ns-3.44/src/zigbee/model/zigbee-nwk-fields.h
--- ns-3.43/src/zigbee/model/zigbee-nwk-fields.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/zigbee/model/zigbee-nwk-fields.h	2025-03-09 16:55:49.819372700 -0700
@@ -0,0 +1,229 @@
+/*
+ * Copyright (c) 2024 Tokushima University, Japan
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Author: Alberto Gallegos Ramonet <alramonet@is.tokushima-u.ac.jp>
+ *
+ */
+
+#ifndef ZIGBEE_NWK_FIELDS_H
+#define ZIGBEE_NWK_FIELDS_H
+
+#include "ns3/buffer.h"
+
+#include <array>
+
+namespace ns3
+{
+namespace zigbee
+{
+
+/**
+ * @ingroup zigbee
+ * The device Type
+ * Zigbee Specification r22.1.0 (Table 3-62 or Table 3-63)
+ */
+enum MacDeviceType
+{
+    ENDDEVICE = 0, //!< End device or router treated as an end device.
+    ROUTER = 1     //!< Router device.
+};
+
+/**
+ * @ingroup zigbee
+ * The power source capabilities.
+ * Zigbee Specification r22.1.0 (Table 3-62)
+ */
+enum PowerSource
+{
+    OTHER_POWER_SOURCE = 0, //!< Other power source.
+    MAINPOWER = 1           //!< Mains-powered device.
+};
+
+/**
+ * @ingroup zigbee
+ * Requested Timeout Field
+ * See Zigbee Specification r22.1.0, 3.4.11.3.1
+ *
+ * List the requested timeout values in minutes
+ */
+static const double RequestedTimeoutField
+    [15]{0.166667, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384};
+
+/**
+ * @ingroup zigbee
+ * Represent the the Capability Information Bit fields
+ * See zigbe Specification r22.1.0, Table 3-62
+ */
+class CapabilityInformation
+{
+  public:
+    CapabilityInformation();
+
+    /**
+     * Constructor using the capability in a bitmap form.
+     *
+     * @param bitmap The bitmap representing the capability.
+     */
+    CapabilityInformation(uint8_t bitmap);
+
+    /**
+     * Used to obtain the complete capability information bit map.
+     *
+     * @return The bit map with the capability information
+     */
+    uint8_t GetCapability() const;
+
+    /**
+     * This field will always have a value of false in implementations of
+     * this specification.
+     *
+     * @return false for implementations of this specification.
+     */
+    bool IsAlternatePanCoord() const;
+
+    /**
+     * This field will have a value of ROUTER if the joining device is a
+     * Zigbee router. It will have a value of ENDDEVICE if the devices is a
+     * Zigbee end device or else a router-capable device that is joining  as
+     * an end device.
+     *
+     * @return The device type used
+     */
+    MacDeviceType GetDeviceType() const;
+
+    /**
+     * This field will be set to the value of lowest-order bit of the
+     * PowerSource parameter passed to the NLME-JOIN.request primitive.
+     *
+     * @return MAINPOWER or OTHER_POWER_SOURCE
+     */
+    PowerSource GetPowerSource() const;
+
+    /**
+     * This field will be set to the value of the lowest-order bit of the
+     * RxOnWhenIdle parameter passed  to the NLME-JOIN.request primitive
+     *
+     * @return True Rx enabled when the device is idle | False = the receiver is disabled when idle.
+     *
+     */
+    bool IsReceiverOnWhenIdle() const;
+
+    /**
+     * This field will have a value of true in implementations of this specification,
+     * indicating that the joining device must be issued a 16 bit network address,
+     * except in the case where a device has self-selected its address while using the
+     * NWK rejoin command to join a network for the first time in a secure manner.
+     * In this case, it shall have a value of false.
+     *
+     * @return True = The device require a 16 bit address allocation, False = otherwise.
+     */
+    bool IsAllocateAddrOn() const;
+
+    /**
+     * Set the Capability Information bit map
+     *
+     * @param capability The 8 bit map representing the full capability
+     */
+    void SetCapability(uint8_t capability);
+
+    /**
+     * Set the device type bit for the capability information field.
+     *
+     * @param devType The device type field to set in the capability information.
+     */
+    void SetDeviceType(MacDeviceType devType);
+
+    /**
+     * Set the power source bit for the capability information field.
+     *
+     * @param powerSource The power source field to set in the capability information.
+     */
+    void SetPowerSource(PowerSource powerSource);
+
+    /**
+     * Set the Receiver On When Idle bit for the capability information field.
+     *
+     * @param value True if the receiver should remain on when idle.
+     */
+    void SetReceiverOnWhenIdle(bool value);
+
+    /**
+     * Set the Allocate Addr On for the capability information field.
+     *
+     * @param value True if the device requires to have its 16 bit network address allocated.
+     */
+    void SetAllocateAddrOn(bool value);
+
+  private:
+    bool m_alternatePanCoord{false};      //!< (Bit 0) The alternate PAN coordinator bit field.
+    MacDeviceType m_deviceType{ROUTER};   //!< (Bit 1) The device type bit field.
+    PowerSource m_powerSource{MAINPOWER}; //!< (Bit 2) The power source  bits field.
+    bool m_receiverOnWhenIdle{true};      //!< (Bit 3) The receiver on when idle bit field.
+    bool m_securityCapability{false};     //!< (Bit 6) The security capability bit field.
+    bool m_allocateAddr{true};            //!< (Bit 7) The allocate address bit field.
+};
+
+/**
+ * @ingroup lr-wpan
+ * Represent the Superframe Specification information field.
+ * See IEEE 802.15.4-2011   Section 5.2.2.1.2 Figure 41
+ */
+class SuperframeInformation
+{
+  public:
+    SuperframeInformation();
+
+    /**
+     * Create a superframe Specification Information field with
+     * the information specified in the bitmap.
+     *
+     * @param bitmap The superframe in bitmap form
+     */
+    SuperframeInformation(uint16_t bitmap);
+
+    /**
+     * Set the whole Superframe Specification Information field.
+     * @param superFrm The Superframe Specification information field.
+     */
+    void SetSuperframe(uint16_t superFrm);
+
+    /**
+     * Get the Superframe Specification Beacon Order field.
+     * @return the Superframe Specification Beacon Order field.
+     */
+    uint8_t GetBeaconOrder() const;
+
+    /**
+     * Get the Superframe Specification Frame Order field.
+     * @return The Superframe Specification Frame Order field.
+     */
+    uint8_t GetFrameOrder() const;
+
+    /**
+     * Check if the PAN Coordinator bit is enabled.
+     * @returns true if the PAN Coordinator bit is enabled
+     */
+    bool IsPanCoor() const;
+
+    /**
+     * Check if the Association Permit bit is enabled.
+     * @returns true if the Association Permit bit is enabled
+     */
+    bool IsAssocPermit() const;
+
+  private:
+    // Superframe Specification field
+    // See IEEE 802.14.15-2011 5.2.2.1.2
+    uint8_t m_sspecBcnOrder;    //!< Superframe Specification field Beacon Order (Bit 0-3)
+    uint8_t m_sspecSprFrmOrder; //!< Superframe Specification field Superframe Order (Bit 4-7)
+
+    bool m_sspecPanCoor;     //!< Superframe Specification field PAN Coordinator (Bit 14)
+    bool m_sspecAssocPermit; //!< Superframe Specification field Association Permit (Bit 15)
+};
+
+} // namespace zigbee
+} // namespace ns3
+
+#endif /* ZIGBEE_NWK_FIELDS_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/zigbee/model/zigbee-nwk.h ns-3.44/src/zigbee/model/zigbee-nwk.h
--- ns-3.43/src/zigbee/model/zigbee-nwk.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/zigbee/model/zigbee-nwk.h	2025-03-09 16:55:49.823372800 -0700
@@ -0,0 +1,1803 @@
+/*
+ * Copyright (c) 2024 Tokushima University, Japan
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Authors:
+ *
+ *  Alberto Gallegos Ramonet <alramonet@is.tokushima-u.ac.jp>
+ *  Ryo Okuda <c611901200@tokushima-u.ac.jp>
+ */
+
+#ifndef ZIGBEE_NWK_H
+#define ZIGBEE_NWK_H
+
+#include "zigbee-nwk-fields.h"
+#include "zigbee-nwk-header.h"
+#include "zigbee-nwk-payload-header.h"
+#include "zigbee-nwk-tables.h"
+
+#include "ns3/event-id.h"
+#include "ns3/lr-wpan-mac-base.h"
+#include "ns3/mac16-address.h"
+#include "ns3/mac64-address.h"
+#include "ns3/object.h"
+#include "ns3/random-variable-stream.h"
+#include "ns3/sequence-number.h"
+#include "ns3/traced-callback.h"
+#include "ns3/traced-value.h"
+
+#include <cstdint>
+#include <iomanip>
+#include <iterator>
+
+namespace ns3
+{
+
+namespace zigbee
+{
+
+/**
+ * @defgroup zigbee ZIGBEE models
+ *
+ * This section documents the API of the Zigbee Specification related models. For a generic
+ * functional description, please refer to the ns-3 manual.
+ */
+
+static constexpr uint32_t ALL_CHANNELS = 0x07FFF800; //!< Bitmap representing all channels (11~26)
+                                                     //!< LSB b0-b26, b27-b31 MSB
+                                                     //!< Page 0 in Zigbee (250kbps O-QPSK)
+
+/**
+ * @ingroup zigbee
+ *
+ * Indicates a pending NWK primitive
+ */
+enum PendingPrimitiveNwk : std::uint8_t
+{
+    NLDE_NLME_NONE = 0,         //!< No pending primitive
+    NLME_NETWORK_FORMATION = 1, //!< Pending NLME-NETWORK-FORMATION.request primitive
+    NLME_DIRECT_JOIN = 2,       //!< Pending NLME-DIRECT-JOIN.request primitive
+    NLME_JOIN = 3,              //!< Pending NLME-JOIN.request primitive
+    NLME_START_ROUTER = 4,      //!< Pending NLME-START-ROUTER.request primitive
+    NLME_NET_DISCV = 5,         //!< Pending NLME-NETWORK-DISCOVERY.request primitive
+    NLME_JOIN_INDICATION = 6,   //!< Pending NLME-JOIN.indication primitive
+    NLME_ROUTE_DISCOVERY = 7,   //!< Pending NLME-ROUTE-DISCOVERY.request primitive
+    NLDE_DATA = 8               //!< Pending NLDE-DATA.request primitive
+};
+
+/**
+ * @ingroup zigbee
+ *
+ * Table 3.2 (Address Mode) NLDE-DATA-Request parameters
+ */
+enum AddressMode
+{
+    NO_ADDRESS = 0x00, //!< No destination address
+    MCST = 0x01,       //!< Multicast Address mode
+    UCST_BCST = 0x02   //!< Unicast or Broadcast address mode
+};
+
+/**
+ * Use to describe the method used to assign addresses in the NWK layer.
+ * See Zigbee specification r22.1.0, Table 3-58
+ */
+enum AddrAllocMethod
+{
+    DISTRIBUTED_ALLOC = 0x00, //!< Distributed address allocation
+                              //!< (Zigbee Specification r22.1.0 Section 3.6.1.6)
+    STOCHASTIC_ALLOC = 0x02   //!< Stochastic address allocation
+                              //!< (Zigbee Specification r22.1.0 Section 3.6.1.7)
+};
+
+/**
+ * Use to describe the identifier of the zigbee stack profile.
+ */
+enum StackProfile
+{
+    ZIGBEE = 0x01,    //!< Zigbee stack profile 0x01 (a.k.a. Zigbee 2006, Zigbee 2007, Zigbee)
+    ZIGBEE_PRO = 0x02 //!< Zigbee stack profile 0x02 (Zigbee Pro, also known as r22.1.0, 3.0)
+};
+
+/**
+ * Use to describe the parameter that controls the method of joining  the network.
+ * See Zigbee specification r22.1.0, Table 3-21
+ */
+enum JoiningMethod
+{
+    ASSOCIATION = 0x00,      //!< The device is requesting to join a network through association.
+    DIRECT_OR_REJOIN = 0x01, //!< The device is joining directly or rejoining using the
+                             //!< orphaning procedure.
+    REJOINING = 0x02,        //!< The device is joining the network using the rejoining procedure.
+    CHANGE_CHANNEL = 0x03    //!< The device is to change the operational network channel to
+                             //!< that identified in the ScanChannel parameter.
+};
+
+/**
+ * The status returned while attempting to find the next hop in route towards a specific
+ * destination or a many-to-one route request attempt.
+ */
+enum RouteDiscoveryStatus : std::uint8_t
+{
+    ROUTE_FOUND = 0x01,       //!< The next hop toward the destination was found in our
+                              //!< routing table or neighbor table (Mesh route).
+    ROUTE_NOT_FOUND = 0x02,   //!< The next hop was not found. A new entry is is registered
+                              //!<  in the routing table with DISCOVER_UNDERWAY status(Mesh route).
+    TABLE_FULL = 0x03,        //!< Either the routing or neighbor table are full.
+    ROUTE_UPDATED = 0x04,     //!< A route was found and updated with a better route
+                              //!< (Mesh route or Many-To-One route)
+    NO_DISCOVER_ROUTE = 0x05, //!< We are currently not allowed to perform a route discovery
+                              //!< for this route (RouteDiscover flag in network header is false).
+    DISCOVER_UNDERWAY = 0x06, //!< The route was found in the tables but currently has no next hop.
+                              //!< i.e. A previous attempt was already made is currently awaiting
+                              //!< for a response (hence the route discover is underway).
+    MANY_TO_ONE_ROUTE = 0x07, //!< A new Many-To-One route was created
+    NO_ROUTE_CHANGE = 0x08    //!< No route entry was created or updated during
+                              //!< a Many-To-One process
+};
+
+/**
+ * @ingroup zigbee
+ *
+ *  Network layer status values
+ *  Combines Zigbee Specification r22.1.0 Table 3-73 and
+ *  and IEEE 802.15.4-2006 Table 78
+ *
+ *  Used to report the resulting status of various NWK operations.
+ *
+ *  Note: UNSUPPORTED_ATTRIBUTE, LIMIT_REACHED, SCAN_IN_PROGRESS
+ */
+enum NwkStatus : std::uint8_t
+{
+    // MAC defined status:
+    SUCCESS = 0,          //!< The operation was completed successfully.
+    FULL_CAPACITY = 0x01, //!< PAN at capacity. Association Status field (std. 2006, Table 83).
+    ACCESS_DENIED = 0x02, //!< PAN access denied. Association Status field (std. 2006, Table 83).
+    COUNTER_ERROR = 0xdb, //!< The frame counter of the received frame is invalid.
+    IMPROPER_KEY_TYPE = 0xdc,       //!< The key is not allowed to be used with that frame type.
+    IMPROPER_SECURITY_LEVEL = 0xdd, //!< Insufficient security level expected by the recipient.
+    UNSUPPORTED_LEGACY = 0xde,      //!< Deprecated security used in IEEE 802.15.4-2003
+    UNSUPPORTED_SECURITY = 0xdf,    //!< The security applied is not supported.
+    BEACON_LOSS = 0xe0,             //!< The beacon was lost following a synchronization request.
+    CHANNEL_ACCESS_FAILURE = 0xe1,  //!< A Tx could not take place due to activity in the CH.
+    DENIED = 0xe2,                  //!< The GTS request has been denied by the PAN coordinator.
+    DISABLE_TRX_FAILURE = 0xe3,     //!< The attempt to disable the transceier has failed.
+    SECURITY_ERROR = 0xe4, //!< Cryptographic process of the frame failed(FAILED_SECURITY_CHECK).
+    FRAME_TOO_LONG = 0xe5, //!< Frame more than aMaxPHYPacketSize or too large for CAP or GTS.
+    INVALID_GTS = 0xe6,    //!< Missing GTS transmit or undefined direction.
+    INVALID_HANDLE = 0xe7, //!< When purging from TX queue handle was not found.
+    INVALID_PARAMETER_MAC = 0xe8, //!< Invalid parameter in response to a request passed to the MAC.
+    NO_ACK = 0xe9,                //!< No acknowledgment was received after macMaxFrameRetries.
+    NO_BEACON = 0xea,             //!< A scan operation failed to find any network beacons.
+    NO_DATA = 0xeb,               //!<  No response data were available following a request.
+    NO_SHORT_ADDRESS = 0xec,      //!< Failure due to unallocated 16-bit short address.
+    OUT_OF_CAP = 0xed,            //!< (Deprecated) See IEEE 802.15.4-2003
+    PAN_ID_CONFLICT = 0xee,       //!<  PAN id conflict detected and informed to the coordinator.
+    REALIGMENT = 0xef,            //!< A coordinator realigment command has been received.
+    TRANSACTION_EXPIRED = 0xf0,   //!< The transaction expired and its information discarded.
+    TRANSACTION_OVERFLOW = 0xf1,  //!< There is no capacity to store the transaction.
+    TX_ACTIVE = 0xf2,             //!< The transceiver was already enabled.
+    UNAVAILABLE_KEY = 0xf3,       //!< Unavailable key, unknown or blacklisted.
+    INVALID_ADDRESS = 0xf5,       //!< Invalid source or destination address.
+    ON_TIME_TOO_LONG = 0xf6,      //!< RX enable request fail due to syms. longer than Bcn. interval
+    PAST_TIME = 0xf7,             //!< Rx enable request fail due to lack of time in superframe.
+    TRACKING_OFF = 0xf8,          //!< This device is currently not tracking beacons.
+    INVALID_INDEX = 0xf9,      //!< A MAC PIB write failed because specified index is out of range.
+    READ_ONLY = 0xfb,          //!< SET/GET request issued for a read only attribute.
+    SUPERFRAME_OVERLAP = 0xfd, //!< Coordinator sperframe and this device superframe tx overlap.
+    // Zigbee Specification defined status:
+    INVALID_PARAMETER = 0xc1,     //!< Invalid Parameter (Zigbee specification r22.1.0)
+    INVALID_REQUEST = 0xc2,       //!< Invalid request (Zigbee specification r22.1.0)
+    NOT_PERMITED = 0xc3,          //!< Not permitted (Zigbee specification r22.1.0)
+    STARTUP_FAILURE = 0xc4,       //!< Startup failure (Zigbee specification r22.1.0)
+    ALREADY_PRESENT = 0xc5,       //!< Already present (Zigbee specification r22.1.0)
+    SYNC_FAILURE = 0xc6,          //!< Sync Failure (Zigbee specification r22.1.0)
+    NEIGHBOR_TABLE_FULL = 0xc7,   //!< Neighbor table full (Zigbee specification r22.1.0)
+    UNKNOWN_DEVICE = 0xc8,        //!< Unknown device (Zigbee specification r22.1.0)
+    UNSUPPORTED_ATTRIBUTE = 0xc9, //!< Unsupported attribute (Zigbee specification r22.1.0)
+    NO_NETWORKS = 0xca,           //!< No network (Zigbee specification r22.1.0)
+    MAX_FRM_COUNTER = 0xcc, //!< Max Frame counter (IEEE 802.15.4, Zigbee specification r22.1.0)
+    NO_KEY = 0xcd,          //!< No Key (Zigbee specification r22.1.0)
+    BAD_CCM_OUTPUT = 0xce,  //!< Bad ccm output (IEEE 802.15.4, Zigbee specification r22.1.0)
+    ROUTE_DISCOVERY_FAILED = 0xd0, //!< Route discovery failed (Zigbee specification r22.1.0)
+    ROUTE_ERROR = 0xd1,            //!< Route error (Zigbee specification r22.1.0)
+    BT_TABLE_FULL = 0xd2,          //!< Bt table full (Zigbee specification r22.1.0)
+    FRAME_NOT_BUFFERED = 0xd3,     //!< Frame not buffered (Zigbee specification r22.1.0)
+    INVALID_INTERFACE = 0xd5,      //!< Invalid interface (Zigbee specification r22.1.0)
+    LIMIT_REACHED = 0xd6,          //!< Limit reached during network scan (IEEE 802.15.4-2011)
+    SCAN_IN_PROGRESS = 0xd7        //!< The dev was scanning during this call (IEEE 802.5.4)
+};
+
+/**
+ *  Overloaded operator to print the value of a NwkStatus.
+ *
+ *  @param os The output stream
+ *  @param state The text value of the NWK state
+ *  @return The output stream with text value of the NWK state
+ */
+std::ostream& operator<<(std::ostream& os, const NwkStatus& state);
+
+/**
+ * Overloaded operator to print uint8_t vectors
+ *
+ * @param os The output stream
+ * @param vec The uint8_t vector to print
+ * @return The output stream with the text value of the uint8_t vector members
+ */
+std::ostream& operator<<(std::ostream& os, const std::vector<uint8_t>& vec);
+
+/**
+ *
+ * @param os The output stream
+ * @param num The uint8_t number to print
+ * @return The output stream with the text value of the uint8_t number
+ */
+std::ostream& operator<<(std::ostream& os, const uint8_t& num);
+
+/**
+ * @ingroup zigbee
+ *
+ *  Status codes for network status command frame and route discovery failures.
+ *
+ */
+enum NetworkStatusCode : std::uint8_t
+{
+    NO_ROUTE_AVAILABLE = 0x00,          //!< No route available
+    TREE_LINK_FAILURE = 0x01,           //!< Tree link failure
+    NON_TREE_LINK_FAILURE = 0x02,       //!< Non tree link failure
+    LOW_BATTERY = 0x03,                 //!< Low battery
+    NO_ROUTING_CAPACITY = 0x04,         //!< No routing capacity
+    NO_INDIRECT_CAPACITY = 0x05,        //!< No indirect capacity
+    INDIRECT_TRANSACTION_EXPIRY = 0x06, //!< Indirect transaction expiry
+    TARGET_DEVICE_UNAVAILABLE = 0x07,   //!< Target device unavailable
+    TARGET_ADDRESS_UNALLOCATED = 0x08,  //!< Target address unallocated
+    PARENT_LINK_FAILURE = 0x09,         //!< Parent link failure
+    VALIDATE_ROUTE = 0x0a,              //!< Validate route
+    SOURCE_ROUTE_FAILURE = 0x0b,        //!< Source route failure
+    MANY_TO_ONE_ROUTE_FAILURE = 0x0c,   //!< Many to one route failure
+    ADDRESS_CONFLICT = 0x0d,            //!< Address conflict
+    VERIFY_ADDRESS = 0x0e,              //!< Verify address
+    PAN_IDENTIFIER_UPDATE = 0x0f,       //!< PAN identifier update
+    NETWORK_ADDRESS_UPDATE = 0x10,      //!< Network address update
+    BAD_FRAME_COUNTER = 0x11,           //!< Bad frame counter
+    BAD_KEY_SEQUENCE_NUMBER = 0x12,     //!< Bad key sequence number
+    UNKNOWN_COMMAND = 0x13              //!< Unknown command
+};
+
+/**
+ *  @ingroup zigbee
+ *
+ *  Channel List Structure. See Zigbee Specification 3.2.2.2.1
+ */
+struct ChannelList
+{
+    uint8_t channelPageCount;            //!< The number of the channel page structures contained in
+                                         //!< the channel list structure.
+    std::vector<uint32_t> channelsField; //!< The set of channels for a given page.
+
+    ChannelList()
+        : channelPageCount(1),
+          channelsField{ALL_CHANNELS}
+    {
+    }
+};
+
+/**
+ * @ingroup zigbee
+ *
+ * NLDE-DATA.confirm params. See Zigbee Specification 3.2.1.2
+ */
+struct NldeDataConfirmParams
+{
+    NwkStatus m_status{NwkStatus::INVALID_PARAMETER}; //!< The status of
+                                                      //!< the corresponding request.
+    uint8_t m_nsduHandle{0};   //!< The handle associated with the NSDU being confirmed.
+    Time m_txTime{Seconds(0)}; //!< The time indication for the transmitted packet
+                               //!< based on the local clock.
+};
+
+/**
+ * @ingroup lr-wpan
+ *
+ * NLDE-DATA.indication params. See Zigbee Specification 3.2.1.3.1
+ */
+struct NldeDataIndicationParams
+{
+    AddressMode m_dstAddrMode{UCST_BCST}; //!< Destination address mode.
+                                          //!< 0x01=MCST, 0x02=BCST or UCST
+    Mac16Address m_dstAddr;               //!< The destination address to which the NSDU was sent
+    Mac16Address m_srcAddr;    //!< The individual device address from which the NSDU originated
+    uint32_t m_nsduLength{0};  //!< The number of octets comprising the NSDU being indicated
+    uint8_t m_linkQuality{0};  //!< LQI value delivered by the MAC on receipt of this frame
+    Time m_rxTime{Seconds(0)}; //!< A time indication for the received packet
+                               //!< based on the local clock
+    bool m_securityUse{false}; //!< An indication of whether the received data is using security
+};
+
+/**
+ * @ingroup zigbee
+ *
+ * NLDE-DATA.request params. See Zigbee Specification 3.2.1.1
+ */
+struct NldeDataRequestParams
+{
+    AddressMode m_dstAddrMode{UCST_BCST}; //!< Destination address mode.
+                                          //!< 0x01=MCST, 0x02=BCST or UCST
+    Mac16Address m_dstAddr;               //!< The destination address.
+    uint32_t m_nsduLength{0}; //!< The number of octets comprising the NSDU to be transferred.
+    uint8_t m_nsduHandle{0};  //!< The NSDU handle
+    bool m_useAlias{false}; //!< Indicates if next higher layer use an alias for the current frame.
+    Mac16Address m_aliasSrcAddr;      //!< The source address to be used by this NSDU
+                                      //!< (ignored ifuseAlias = false).
+    SequenceNumber8 m_aliasSeqNumber; //!< The sequence number used by this NSDU
+                                      //!< (ignored if useAlias = false).
+    uint8_t m_radius{0};              //!< Distance in hops that the frame is allowed to
+                                      //!< travel through the network.
+    uint8_t m_nonMemberRadius{0}; //!< Distance in hops that a multicast frame will be relayed by
+                                  //!< nodes not a member of the group. 0x07 = Infinity.
+    uint8_t m_discoverRoute{0};   //!< 0x01 Enable Route Discovery | 0x00: Suppress Route discovery
+    bool m_securityEnable{false}; //!< Enable NWK layer security for the current frame.
+};
+
+/**
+ *  @ingroup zigbee
+ *
+ *  NLME-NETWORK-FORMATION.request params. See Zigbee Specification 3.2.2.5.1
+ */
+struct NlmeNetworkFormationRequestParams
+{
+    ChannelList m_scanChannelList; //!< A structure
+                                   //!< that contain a description on the pages and
+                                   //!< their channels to be scanned.
+    uint8_t m_scanDuration;        //!< The time spent of each channel in symbols:
+                                   //!< aBaseSuperframeDuriantion * (2n+1). n=0-14
+    uint8_t m_beaconOrder;         //!< The beacon order
+    uint8_t m_superFrameOrder;     //!< The superframe order
+    bool m_batteryLifeExtension;   //!< True: The zigbee coordinator is started supporting
+                                   //!< battery extension mode.
+    bool m_distributedNetwork;     //!< Indicates that distributed security will be used.
+    Mac16Address m_distributedNetworkAddress; //!< The address of the device in a
+                                              //!< distributed network.
+
+    NlmeNetworkFormationRequestParams()
+        : m_scanChannelList{},
+          m_scanDuration(14),
+          m_beaconOrder(15),
+          m_superFrameOrder(15),
+          m_batteryLifeExtension(false),
+          m_distributedNetwork(false),
+          m_distributedNetworkAddress("FF:F7")
+    {
+    }
+};
+
+/**
+ * @ingroup zigbee
+ *
+ * A group of pending parameters arranged into a structure during the execution of
+ * a NLME-NETWORK-FORMATION.request primitive.
+ */
+struct NetFormPendingParamsGen : public SimpleRefCount<NetFormPendingParamsGen>
+{
+    uint8_t channel{0}; //!< The channel selected during the initial steps of a network formation
+    uint8_t page{0};    //!< The page selected during the initial steps of a network formation.
+    uint16_t panId{0};  //!< The PAN id selected during the initial steps of a network formation.
+};
+
+/**
+ *  @ingroup zigbee
+ *
+ *  NLME-NETWORK-FORMATION.confirm params. See Zigbee Specification 3.2.2.6.1
+ */
+struct NlmeNetworkFormationConfirmParams
+{
+    NwkStatus m_status{NwkStatus::INVALID_PARAMETER}; //!< The status as a result of
+                                                      //!< this request
+};
+
+/**
+ *  @ingroup zigbee
+ *
+ *  NLME-ROUTE-DISCOVERY.request params. See Zigbee Specification 3.2.2.33
+ */
+struct NlmeRouteDiscoveryRequestParams
+{
+    AddressMode m_dstAddrMode{UCST_BCST}; //!< Specifies the kind of destination address.
+    Mac16Address m_dstAddr;               //!< The destination of the route discovery.
+    uint16_t m_radius{0};      //!< Optional parameter that describes the number of hops that the
+                               //!< route request will travel through the network.
+    bool m_noRouteCache{true}; //!< This flag determines whether the NWK should establish a
+                               //!< route record table.
+};
+
+/**
+ *  @ingroup zigbee
+ *
+ *  NLME-ROUTE-DISCOVERY.confirm params. See Zigbee Specification r22.1.0, 3.2.2.34
+ */
+struct NlmeRouteDiscoveryConfirmParams
+{
+    NwkStatus m_status{NwkStatus::INVALID_PARAMETER}; //!< The status as a result of
+                                                      //!< this request.
+    NetworkStatusCode m_networkStatusCode{NetworkStatusCode::UNKNOWN_COMMAND}; //!< In case where
+    //!< the status parameter has a value of ROUTE_ERROR, this code gives further information about
+    //!< the error occurred. Otherwise, it should be ignored.
+};
+
+/**
+ *  @ingroup zigbee
+ *
+ *  NLME-DIRECT-JOIN.request params.
+ *  See Zigbee Specification r22.1.0, 3.2.2.16
+ */
+struct NlmeDirectJoinRequestParams
+{
+    Mac64Address m_deviceAddr; //!< The EUI-64 bit address of the device directly joined.
+    uint8_t m_capabilityInfo;  //!< The operating capabilities of the device
+                               //!< being directly joined
+};
+
+/**
+ *  @ingroup zigbee
+ *
+ *  NLME-DIRECT-JOIN.confirm params.
+ *  See Zigbee Specification r22.1.0, 3.2.2.17
+ */
+struct NlmeDirectJoinConfirmParams
+{
+    NwkStatus m_status{NwkStatus::INVALID_PARAMETER}; //!< The status
+                                                      //!< the corresponding request.
+    Mac64Address m_deviceAddr;                        //!< The IEEE EUI-64 address in the request to
+                                                      //!< which this is a confirmation.
+};
+
+/**
+ *  @ingroup zigbee
+ *
+ *  NLME-NETWORK-DISCOVERY.request params.
+ *  See Zigbee Specification r22.1.0, 3.2.2.3
+ */
+struct NlmeNetworkDiscoveryRequestParams
+{
+    ChannelList m_scanChannelList; //!< The list of all channel pages and the associated
+                                   //!< channels that shall be scanned.
+    uint8_t m_scanDuration{0};     //!< A value used to calculate the length of time to spend
+};
+
+/**
+ * @ingroup lr-wpan
+ *
+ * Network Descriptor, Zigbee Specification  r22.1.0, 3.2.2.4, Table 3-12
+ */
+struct NetworkDescriptor
+{
+    uint64_t m_extPanId{0xFFFFFFFFFFFFFFFE}; //!< The 64-bit PAN identifier of the network.
+    uint16_t m_panId{0xFFFF};                //!< The 16-bit PAN identifier of the network.
+    uint8_t m_updateId{0};                   //!< The value of the UpdateID from the NIB.
+    uint8_t m_logCh{11}; //!< The current channel number occupied by the network.
+    StackProfile m_stackProfile{ZIGBEE_PRO}; //!< The Zigbee stack profile identifier in use in
+                                             //!< the discovered network.
+    uint8_t m_zigbeeVersion;                 //!< The version of the zigbee protocol in use in
+                                             //!< the discovered network.
+    uint8_t m_beaconOrder{15};               //!< The beacon order value of the underlying MAC
+                               //!< (Determinates the beacon frequency, 15 = No beacon)
+    uint8_t m_superframeOrder{15};  //!< The superframe order value of the underlying MAC
+                                    //!< (Determinates the value of the active period)
+    bool m_permitJoining{true};     //!< TRUE = Indicates that at least one zigbee router on the
+                                    //!< network currently permits joining.
+    bool m_routerCapacity{true};    //!< TRUE = The device is able to accept join requests from
+                                    //!< router-capable devices.
+    bool m_endDeviceCapacity{true}; //!< TRUE= The device is able to accept join request from
+                                    //!< end devices.
+};
+
+/**
+ *  @ingroup zigbee
+ *
+ *  NLME-NETWORK-DISCOVERY.confirm params. See Zigbee Specification r22.1.0, 3.2.2.4
+ */
+struct NlmeNetworkDiscoveryConfirmParams
+{
+    NwkStatus m_status{NwkStatus::INVALID_PARAMETER}; //!< The status of
+                                                      //!< the corresponding request.
+    uint8_t m_networkCount{0}; //!< Gives the number of networks discovered by the search
+    std::vector<NetworkDescriptor> m_netDescList; //!< A list of descriptors,
+                                                  //!< one for each of the networks discovered.
+};
+
+/**
+ * @ingroup zigbee
+ *
+ * NLME-JOIN.request params.
+ * See Zigbee Specification r22.1.0, 3.2.2.13
+ */
+struct NlmeJoinRequestParams
+{
+    uint64_t m_extendedPanId{1};   //!< The 64 bit PAN identifier of the
+                                   //!< the network to join.
+    JoiningMethod m_rejoinNetwork; //!< This parameter controls the method of joining the
+                                   //!< network.
+    ChannelList m_scanChannelList; //!< The list of all channel pages and the associated
+                                   //!< channels that shall be scanned.
+    uint8_t m_scanDuration{0};     //!< A value used to calculate the length of time to spend
+                                   //!< scanning each channel.
+    uint8_t m_capabilityInfo;      //!< The operating capabilities of the device
+                                   //!< being directly joined (Bit map).
+    bool m_securityEnable{false};  //!< If the value of RejoinNetwork is REJOINING and this
+                                   //!< value is true, the device will rejoin securely.
+};
+
+/**
+ *  @ingroup zigbee
+ *
+ *  NLME-JOIN.confirm params.
+ *  See Zigbee Specification r22.1.0, 3.2.2.15
+ */
+struct NlmeJoinConfirmParams
+{
+    NwkStatus m_status;            //!< The status of
+                                   //!< the corresponding request.
+    Mac16Address m_networkAddress; //!< The 16 bit network address that was allocated
+                                   //!< to this device. Equal to 0xFFFF if association
+                                   //!< was unsuccessful.
+    uint64_t m_extendedPanId;      //!< The extended 64 bit PAN ID for the network of which the
+                                   //!< device is now a member.
+    ChannelList m_channelList;     //!< The structure indicating the current channel of the
+                                   //!< network that has been joined.
+    bool m_enhancedBeacon;         //!< True if using enhanced beacons (placeholder, not supported)
+    uint8_t m_macInterfaceIndex;   //!< The value of the MAC index from nwkMacInterfaceTable.
+                                   //!< (placeholder, not supported)
+
+    NlmeJoinConfirmParams()
+        : m_status(NwkStatus::INVALID_REQUEST),
+          m_networkAddress("FF:FF"),
+          m_extendedPanId(1),
+          m_channelList{},
+          m_enhancedBeacon(false),
+          m_macInterfaceIndex(0)
+    {
+    }
+};
+
+/**
+ *  @ingroup zigbee
+ *
+ *  NLME-JOIN.indication params.
+ *  See Zigbee Specification r22.1.0, 3.2.2.14
+ */
+struct NlmeJoinIndicationParams
+{
+    Mac16Address m_networkAddress{0xFFFF}; //!< The 16 bit network address of an entity that
+                                           //!< has been added to the network.
+    Mac64Address m_extendedAddress; //!< The EUI-64 bit address of an entity that has been added
+                                    //!< to the network.
+    uint8_t m_capabilityInfo;       //!< Specifies the operational capabilities of the
+                                    //!< joining device.
+    JoiningMethod m_rejoinNetwork;  //!< This parameter indicates the method used to
+                                    //!< join the network.
+    bool m_secureRejoin{false};     //!< True if the rejoin was performed in a secure manner.
+};
+
+/**
+ * @ingroup zigbee
+ *
+ * NLME-START-ROUTER.request params.
+ * See Zigbee Specification r22.1.0, 3.2.2.13
+ */
+struct NlmeStartRouterRequestParams
+{
+    uint8_t m_beaconOrder{15};     //!< The beacon order of the network
+    uint8_t m_superframeOrder{15}; //!< The superframe order of the network
+    bool m_batteryLifeExt{false};  //!< True if the router supports battery life extension mode.
+};
+
+/**
+ * @ingroup zigbee
+ *
+ * NLME-START-ROUTER.confirm params.
+ * See Zigbee Specification r22.1.0, 3.2.2.10
+ */
+struct NlmeStartRouterConfirmParams
+{
+    NwkStatus m_status{NwkStatus::INVALID_REQUEST}; //!< The status of
+                                                    //!< the corresponding request.
+};
+
+//////////////////////
+//     Callbacks    //
+//////////////////////
+
+/**
+ * @ingroup zigbee
+ *
+ * This callback is called after a NSDU has successfully received and
+ *  NWK push it to deliver it to the next higher layer.
+ *
+ */
+typedef Callback<void, NldeDataIndicationParams, Ptr<Packet>> NldeDataIndicationCallback;
+
+/**
+ * @ingroup zigbee
+ *
+ * This callback is used to notify the next higher layer with a confirmation in response to
+ * a previously issued NLDE-DATA.request.
+ *
+ */
+typedef Callback<void, NldeDataConfirmParams> NldeDataConfirmCallback;
+
+/**
+ *  @ingroup zigbee
+ *
+ *  This callback is used to notify the next higher layer with a confirmation in response to
+ *  a previously issued NLME-NETWORK-FORMATION.request.
+ */
+typedef Callback<void, NlmeNetworkFormationConfirmParams> NlmeNetworkFormationConfirmCallback;
+
+/**
+ *  @ingroup zigbee
+ *
+ *  This callback is used to notify the next higher layer with a confirmation in response to
+ *  a previously issued NLME-NETWORK-DISCOVERY.request.
+ */
+typedef Callback<void, NlmeNetworkDiscoveryConfirmParams> NlmeNetworkDiscoveryConfirmCallback;
+
+/**
+ *  @ingroup zigbee
+ *
+ *  This callback is used to notify the next higher layer with a confirmation in response to
+ *  a previously issued NLME-ROUTE-DISCOVERY.request.
+ */
+typedef Callback<void, NlmeRouteDiscoveryConfirmParams> NlmeRouteDiscoveryConfirmCallback;
+
+/**
+ *  @ingroup zigbee
+ *
+ *  This callback is used to notify the next higher layer with a confirmation in response to
+ *  a previously issued NLME-DIRECT-JOIN.request.
+ */
+typedef Callback<void, NlmeDirectJoinConfirmParams> NlmeDirectJoinConfirmCallback;
+
+/**
+ *  @ingroup zigbee
+ *
+ *  This callback is used to notify the next higher layer with a confirmation in response to
+ *  a previously issued NLME-JOIN.request.
+ */
+typedef Callback<void, NlmeJoinConfirmParams> NlmeJoinConfirmCallback;
+
+/**
+ *  @ingroup zigbee
+ *
+ *  This callback is used to notify the next higher layer with an indication that a new
+ *  device has successfully joined its network by association or rejoining.
+ */
+typedef Callback<void, NlmeJoinIndicationParams> NlmeJoinIndicationCallback;
+
+/**
+ *  @ingroup zigbee
+ *
+ *  This callback is used to notify the next higher layer with a confirmation in response to
+ *  a previously issued NLME-START-ROUTER.request.
+ */
+typedef Callback<void, NlmeStartRouterConfirmParams> NlmeStartRouterConfirmCallback;
+
+/**
+ * @ingroup zigbee
+ *
+ * Class that implements the Zigbee Specification Network Layer
+ */
+class ZigbeeNwk : public Object
+{
+  public:
+    /**
+     * Get the type ID.
+     *
+     * @return the object TypeId
+     */
+    static TypeId GetTypeId();
+
+    /**
+     * Default constructor.
+     */
+    ZigbeeNwk();
+    ~ZigbeeNwk() override;
+
+    /**
+     * Set the underlying MAC to use in this Zigbee NWK
+     *
+     * @param mac The pointer to the underlying LrWpan MAC to set to this Zigbee NWK
+     */
+    void SetMac(Ptr<lrwpan::LrWpanMacBase> mac);
+
+    /**
+     * Get the underlying MAC used by the current Zigbee NWK.
+     *
+     * @return The pointer to the underlying MAC object currently connected to the Zigbee NWK.
+     */
+    Ptr<lrwpan::LrWpanMacBase> GetMac() const;
+
+    /**
+     * Print the entries in the routing table.
+     *
+     * @param stream The stream object used to print.
+     */
+    void PrintRoutingTable(Ptr<OutputStreamWrapper> stream) const;
+
+    /**
+     * Print the entries in the route discovery table.
+     *
+     * @param stream The stream object used to print.
+     */
+    void PrintRouteDiscoveryTable(Ptr<OutputStreamWrapper> stream);
+
+    /**
+     * Print the entries in the neighbor table.
+     *
+     * @param stream The stream object used to print.
+     */
+    void PrintNeighborTable(Ptr<OutputStreamWrapper> stream) const;
+
+    /**
+     * Print the entries in the RREQ retry table.
+     *
+     * @param stream The stream object used to print.
+     */
+    void PrintRREQRetryTable(Ptr<OutputStreamWrapper> stream) const;
+
+    /**
+     *  Search for a specific destination in this device
+     *  neighbor and routing tables.
+     *  This function is only a quick reference used for debugging
+     *  purposes.
+     *
+     *  @param dst The destination to search in our tables
+     *  @param neighbor A flag indicating whether or not the returned
+     *  next hop was found in our neighbor table.
+     *  @return The nexthop address to the destination.
+     */
+    Mac16Address FindRoute(Mac16Address dst, bool& neighbor);
+
+    /**
+     * Obtain this device 16 bit network address (A.K.A. short address).
+     *
+     * This function should only be used for debugging purposes and it
+     * should not be use by higher layers. Higher layers should use
+     * NLME-GET.request instead to obtain this attribute.
+     *
+     * @return Returns this device's 16 bit network address.
+     */
+    Mac16Address GetNetworkAddress() const;
+
+    /**
+     * Obtain this device 64 bit IEEE address (A.K.A. extended address).
+     *
+     * This function should only be used for debugging purposes and it
+     * should not be use by higher layers. Higher layers should use
+     * NLME-GET.request instead to obtain this attribute.
+     *
+     * @return Returns this device's 16 bit network address.
+     */
+    Mac64Address GetIeeeAddress() const;
+
+    /**
+     *  IEEE 802.15.4-2011 section 6.3.3
+     *  MCPS-DATA.indication
+     *  Indicates the reception of an MSDU from MAC to NWK (receiving)
+     *
+     *  @param params The MCPS-DATA.indication parameters.
+     *  @param msdu The set of octets forming the MSDU.
+     */
+    void McpsDataIndication(lrwpan::McpsDataIndicationParams params, Ptr<Packet> msdu);
+
+    /**
+     *  IEEE 802.15.4-2011 section 6.3.2
+     *  MCPS-DATA.confirm
+     *  Reports the results of a request to a transfer data to another device.
+     *
+     *  @param params The MCPS-DATA.confirm parameters.
+     */
+    void McpsDataConfirm(lrwpan::McpsDataConfirmParams params);
+
+    /**
+     *  IEEE 802.15.4-2011 section 6.2.10.2
+     *  MLME-SCAN.confirm
+     *  Reports the results of a scan request.
+     *
+     *  @param params The MLME-SCAN.confirm parameters.
+     */
+    void MlmeScanConfirm(lrwpan::MlmeScanConfirmParams params);
+
+    /**
+     * IEEE 802.15.4-2011 section
+     * MlME-ASSOCIATE.confirm
+     * Report the results of an associate request attempt.
+     *
+     *  @param params The MLME-ASSOCIATE.confirm parameters.
+     */
+    void MlmeAssociateConfirm(lrwpan::MlmeAssociateConfirmParams params);
+
+    /**
+     *  IEEE 802.15.4-2011 section 7.1.14.2
+     *  MLME-START.confirm
+     *  Reports the results of a network start request.
+     *
+     *  @param params The MLME-START.confirm parameters.
+     */
+    void MlmeStartConfirm(lrwpan::MlmeStartConfirmParams params);
+
+    /**
+     * IEEE 802.15.4-2011 section 6.2.11.2
+     * MLME-SET.confirm
+     * Reports the result of an attempt to change a MAC PIB attribute.
+     *
+     * @param params The MLME-SET.confirm params
+     */
+    void MlmeSetConfirm(lrwpan::MlmeSetConfirmParams params);
+
+    /**
+     * IEEE 802.15.4-2011 section 6.2.5.1
+     * MLME-GET.confirm
+     * Reports the result of an attempt to obtain a MAC PIB attribute.
+     *
+     * @param status The status as a result of a MLME-GET.request operation
+     * @param id The identififier of the attribute requested
+     * @param attribute The value of of the attribute requested
+     */
+    void MlmeGetConfirm(lrwpan::MacStatus status,
+                        lrwpan::MacPibAttributeIdentifier id,
+                        Ptr<lrwpan::MacPibAttributes> attribute);
+
+    /**
+     *  IEEE 802.15.4-2011 sections 6.2.7.1,
+     *  Zigbee Specification r22.1.0 Section 3.6.1.4.3 (parent procedure)
+     *  MLME-ORPHAN.indication
+     *  Generated by the coordinator and issued to its next higher
+     *  layer on receipt of an orphan notification command, as defined
+     *  in 5.3.6.
+     *
+     *  @param params The MLME-ORPHAN.indication parameters
+     */
+    void MlmeOrphanIndication(lrwpan::MlmeOrphanIndicationParams params);
+
+    /**
+     *  IEEE 802.15.4-2011 section 6.2.4.2
+     *  MLME-COMM-STATUS.indication
+     *  Allows the MAC MLME to indicate a communication status.
+     *
+     *  @param params The MLME-COMM-STATUS.indication parameters
+     */
+    void MlmeCommStatusIndication(lrwpan::MlmeCommStatusIndicationParams params);
+
+    /**
+     *  IEEE 802.15.4-2011, Section 6.2.4.1
+     *  MLME-BEACON-NOTIFY.indication
+     *  Allows the MAC MLME to indicate the reception of a beacon with payload.
+     *
+     *  @param params The MLME-BEACON-NOTIFY.indication parameters
+     */
+    void MlmeBeaconNotifyIndication(lrwpan::MlmeBeaconNotifyIndicationParams params);
+
+    /**
+     *  IEEE 802.15.4-2011, Section 6.2.2.2.
+     *  MLME-ASSOCIATE.indication
+     *  Allows the MAC MLME to indicate the reception of an associate request
+     *  on a PAN coordinator or router. In the Zigbee specification this implements
+     *  the parent procedure when a device join a network through association
+     *  (See Zigbee specification r22.1.0, Section 3.6.1.4.1)
+     *
+     *  @param params The MLME-ASSOCIATE.indication parameters
+     */
+    void MlmeAssociateIndication(lrwpan::MlmeAssociateIndicationParams params);
+
+    /**
+     *  Zigbee Specification r22.1.0, Section 3.2.1.1
+     *  NLDE-DATA.request
+     *  Request to transfer a NSDU.
+     *
+     *  @param params the request parameters
+     *  @param packet the NSDU to be transmitted
+     */
+    void NldeDataRequest(NldeDataRequestParams params, Ptr<Packet> packet);
+
+    /**
+     *  Zigbee Specification r22.1.0, Section 3.2.2.5 and 3.6.1.1
+     *  NLME-NETWORK-FORMATION.request
+     *  Request the formation of a network in a capable device.
+     *
+     *  @param params the network formation request params
+     */
+    void NlmeNetworkFormationRequest(NlmeNetworkFormationRequestParams params);
+
+    /**
+     *  Zigbee Specification r22.1.0, section 3.2.2.33.3 and 3.6.3.5
+     *  NLME-ROUTE-DISCOVERY.request
+     *  Allows the next higher layer to initiate route discovery.
+     *
+     *  @param params the route discovery request params
+     */
+    void NlmeRouteDiscoveryRequest(NlmeRouteDiscoveryRequestParams params);
+
+    /**
+     *  Zigbee Specification r22.1.0, section 3.2.2.3
+     *  NLME-NETWORK-DISCOVERY.request
+     *  Allows the next higher layer to request that the NWK layer discover
+     *  networks currently operating within the personal operating space (POS).
+     *
+     *  @param params the network discovery request params
+     */
+    void NlmeNetworkDiscoveryRequest(NlmeNetworkDiscoveryRequestParams params);
+
+    /**
+     *  Zigbee Specification r22.1.0, section 3.2.2.16 and 3.6.1.4.3
+     *  NLME-DIRECT-JOIN.request
+     *  Allows the next layer of a Zigbee coordinator or router to request to
+     *  directly join another device to its network
+     *
+     *  @param params the direct join request params
+     */
+    void NlmeDirectJoinRequest(NlmeDirectJoinRequestParams params);
+
+    /**
+     *  Zigbee Specification r22.1.0, section 3.2.2.13
+     *  NLME-JOIN.request
+     *  This primitive allows the next higher layer to request to join or rejoin a
+     *  network, or to change the operating channel for the device while within an
+     *  operating network.
+     *
+     *  @param params the join request params
+     */
+    void NlmeJoinRequest(NlmeJoinRequestParams params);
+
+    /**
+     *  Zigbee Specification r22.1.0, section 3.2.2.9
+     *  NLME-START-ROUTER.request
+     *  This primitive allows the next higher layer of a Zigbee router to initiate
+     *  the activities expected of a Zigbee router including the routing of data
+     *  framaes, route discovery, and the accepting of request to join the network
+     *  from other devices.
+     *
+     *  @param params the join request params
+     */
+    void NlmeStartRouterRequest(NlmeStartRouterRequestParams params);
+
+    /**
+     *  Set the callback for the end of a RX, as part of the
+     *  interconnections between the NWK and the APS sublayer. The callback
+     *  implements the callback used in a NLDE-DATA.indication.
+     *  @param c the NldeDataIndication callback
+     */
+    void SetNldeDataIndicationCallback(NldeDataIndicationCallback c);
+
+    /**
+     *  Set the callback as part of the interconnections between the NWK and
+     *  the APS sublayer (or any other higher layer). The callback
+     *  implements the callback used in a NLDE-DATA.confirm
+     *
+     *  @param c the NldeDataConfirm callback
+     */
+    void SetNldeDataConfirmCallback(NldeDataConfirmCallback c);
+
+    /**
+     *  Set the callback as part of the interconnections between the NWK and the
+     *  APS sublayer (or any other higher layer). The callback implements the callback
+     *  used in a NLME-NETWORK-FORMATION.confirm
+     *  @param c the NlmeNetworkFormationConfirm callback
+     */
+    void SetNlmeNetworkFormationConfirmCallback(NlmeNetworkFormationConfirmCallback c);
+
+    /**
+     *  Set the callback as part of the interconnections between the NWK and the
+     *  APS sublayer (or any other higher layer). The callback implements the callback
+     *  used in a NLME-NETWORK-DISCOVERY.confirm
+     *  @param c the NlmeNetworkDiscoveryConfirm callback
+     */
+    void SetNlmeNetworkDiscoveryConfirmCallback(NlmeNetworkDiscoveryConfirmCallback c);
+
+    /**
+     *  Set the callback as part of the interconnections between the NWK and the
+     *  APS sublayer (or any other higher layer). The callback implements the callback
+     *  used in a NLME-ROUTE-DISCOVERY.confirm
+     *
+     *  @param c the NlmeRouteDiscoveryConfirm callback
+     */
+    void SetNlmeRouteDiscoveryConfirmCallback(NlmeRouteDiscoveryConfirmCallback c);
+
+    /**
+     *  Set the callback as part of the interconnections between the NWK and the
+     *  APS sublayer (or any other higher layer). The callback implements the callback
+     *  used in a NLME-DIRECT-JOIN.confirm
+     *
+     *  @param c the NlmeDirectJoinConfirm callback
+     */
+    void SetNlmeDirectJoinConfirmCallback(NlmeDirectJoinConfirmCallback c);
+
+    /**
+     *  Set the callback as part of the interconnections between the NWK and the
+     *  APS sublayer (or any other higher layer). The callback implements the callback
+     *  used in a NLME-JOIN.confirm
+     *
+     *  @param c the NlmeJoinConfirm callback
+     */
+    void SetNlmeJoinConfirmCallback(NlmeJoinConfirmCallback c);
+
+    /**
+     *  Set the callback as part of the interconnections between the NWK and the
+     *  APS sublayer (or any other higher layer). The callback implements the callback
+     *  used in a NLME-JOIN.indication
+     *
+     *  @param c the NlmeJoinIndication callback
+     */
+    void SetNlmeJoinIndicationCallback(NlmeJoinIndicationCallback c);
+
+    /**
+     *  Set the callback as part of the interconnections between the NWK and the
+     *  APS sublayer (or any other higher layer). The callback implements the callback
+     *  used in a NLME-START-ROUTER.confirm
+     *
+     *  @param c the NlmeStartRouterConfirm callback
+     */
+    void SetNlmeStartRouterConfirmCallback(NlmeStartRouterConfirmCallback c);
+
+    /**
+     *  Assign a fixed random variable stream number to the random variables
+     *  used by this model.  Return the number of streams (possibly zero) that
+     *  have been assigned.
+     *
+     *  @param stream first stream index to use
+     *  @return the number of stream indices assigned by this model
+     */
+    int64_t AssignStreams(int64_t stream);
+
+    /**
+     * TracedCallback signature for RreqRetriesExhaustedTrace events.
+     *
+     * @param rreqId The RREQ id used in the retries
+     * @param dst The destination address of the RREQ retries
+     * @param rreqRetriesNum The number of rreq retries attempted
+     *
+     */
+    typedef void (*RreqRetriesExhaustedTracedCallback)(uint8_t rreqId,
+                                                       Mac16Address dst,
+                                                       uint8_t rreqRetriesNum);
+
+  protected:
+    void DoInitialize() override;
+    void DoDispose() override;
+    void NotifyConstructionCompleted() override;
+
+  private:
+    Ptr<lrwpan::LrWpanMacBase> m_mac; //!< Pointer to the underlying MAC
+                                      //!< connected to this Zigbee NWK.
+
+    /**
+     * Structure representing an element in the pending transaction queue.
+     */
+    struct PendingTxPkt : public SimpleRefCount<PendingTxPkt>
+    {
+        uint8_t nsduHandle;   //!< The NSDU handle
+        Mac16Address dstAddr; //!< The destination network Address
+        Ptr<Packet> txPkt;    //!< The pending packet.
+        Time expireTime;      //!< The expiration time of the packet
+    };
+
+    /**
+     * The pending transaction queue of data packets awaiting to be transmitted
+     * until a route to the destination becomes available.
+     */
+    std::deque<Ptr<PendingTxPkt>> m_pendingTxQueue;
+
+    /**
+     * The maximum size of the pending transaction queue.
+     */
+    uint32_t m_maxPendingTxQueueSize;
+
+    /**
+     * Structure representing an element in the Tx Buffer.
+     */
+    struct TxPkt : public SimpleRefCount<TxPkt>
+    {
+        uint8_t macHandle; //!< The mac handle (msdu handle).
+        uint8_t nwkHandle; //!< The nwk handle (nsdu handle).
+        Ptr<Packet> txPkt; //!< The buffered packet.
+    };
+
+    /**
+     * The transmission buffer. Copies of DATA packets are stored here
+     * for post transmission handling.
+     */
+    std::deque<Ptr<TxPkt>> m_txBuffer;
+
+    /**
+     * The maximum size of the transmission buffer
+     */
+    uint8_t m_txBufferMaxSize;
+
+    ///////////////
+    // Callbacks //
+    ///////////////
+
+    /**
+     *  A trace source that fires when a node has reached the maximum number
+     *  of RREQ retries allowed. The trace provides the RREQ Id, the destination
+     *  address of the RREQ and the number of the maximum allowed retries from
+     *  this node.
+     *
+     */
+    TracedCallback<uint8_t, Mac16Address, uint8_t> m_rreqRetriesExhaustedTrace;
+
+    /**
+     *  This callback is used to notify incoming packets to the APS sublayer.
+     *  See Zigbee Specification r22.1.0, section 6.2.1.3.
+     */
+    NldeDataIndicationCallback m_nldeDataIndicationCallback;
+
+    /**
+     *  This callback is used to respond to data PDU (NSDU) transfer
+     *  request issued by APS sublayer to the NWK (or a layer higher to NWK).
+     *  See Zigbee specification r22.1.0, section 3.2.1.2.
+     */
+    NldeDataConfirmCallback m_nldeDataConfirmCallback;
+
+    /**
+     *  This callback is used to to notify the results of a network
+     *  formation to the APS sublayer making the request.
+     *  See Zigbee specification r22.1.0, section 3.2.2.5
+     */
+    NlmeNetworkFormationConfirmCallback m_nlmeNetworkFormationConfirmCallback;
+
+    /**
+     *  This callback is used to to notify the results of a network
+     *  formation to the APS sublayer making the request.
+     *  See Zigbee specification r22.1.0, section 3.2.2.4
+     */
+    NlmeNetworkDiscoveryConfirmCallback m_nlmeNetworkDiscoveryConfirmCallback;
+
+    /**
+     *  This callback is used to to notify the results of a network
+     *  formation to the APS sublayer making the request.
+     *  See Zigbee specification r22.1.0, section 3.2.2.34
+     */
+    NlmeRouteDiscoveryConfirmCallback m_nlmeRouteDiscoveryConfirmCallback;
+
+    /**
+     *  This callback is used by the next layer of a zigbee coordinator or
+     *  router to be notified of the result of its request to directly join
+     *  another device to its network
+     *  See Zigbee specification r22.1.0, section 3.2.2.17
+     */
+    NlmeDirectJoinConfirmCallback m_nlmeDirectJoinConfirmCallback;
+
+    /**
+     *  This callback is used by the next layer of a zigbee router or device
+     *  to be notified of the result of its request to join
+     *  another device network.
+     *  See Zigbee specification r22.1.0, section 3.2.2.15
+     */
+    NlmeJoinConfirmCallback m_nlmeJoinConfirmCallback;
+
+    /**
+     *  This callback is used by the next layer of a zigbee coordinator or
+     *  router to be notified when a new device has successfully joined its
+     *  network by association or rejoined procedures.
+     *  See Zigbee specification r22.1.0, section 3.2.2.14
+     */
+    NlmeJoinIndicationCallback m_nlmeJoinIndicationCallback;
+
+    /**
+     *  This callback is used by the next layer of a zigbee router or device
+     *  to be notified of the result of its request to initiate activities
+     *  as a zigbee router
+     *  See Zigbee specification r22.1.0, section 3.2.2.10
+     */
+    NlmeStartRouterConfirmCallback m_nlmeStartRouterConfirmCallback;
+
+    /**
+     *  The parameters used during a NLME-NETWORK-FORMATION.request. These parameters
+     *  are stored here while the scanning operations and network initialization
+     *  procedures take place.
+     */
+    NlmeNetworkFormationRequestParams m_netFormParams;
+
+    /**
+     *  The values temporarily stored as a result of  the initial steps of a
+     *  NLME-NETWORK-FORMATION.request (i.e. after the first energy scan)
+     *  Page, Channel, PanId.
+     */
+    Ptr<NetFormPendingParamsGen> m_netFormParamsGen;
+
+    /**
+     *  The parameters used during a NLME-JOIN.request. These parameters
+     *  are stored here while the scanning operations and network joining
+     *  procedures take place.
+     */
+    NlmeJoinRequestParams m_joinParams;
+
+    /**
+     * Temporarily store the NLME-JOIN.indication parameters while the
+     * join operations (asocciation) conclude in the coordinator or router.
+     */
+    NlmeJoinIndicationParams m_joinIndParams;
+
+    /**
+     * Temporarily store the NLME-START-ROUTER.request parameters during
+     * the router initialization process.
+     */
+    NlmeStartRouterRequestParams m_startRouterParams;
+
+    /**
+     * Temporarily store MLME-ASSOCIATE.request parameters
+     * during a NLME-JOIN.request.
+     */
+    lrwpan::MlmeAssociateRequestParams m_associateParams;
+
+    /**
+     *  The maximum acceptable energy level used in an energy scan taking place
+     *  during a NLME-NETWORK-FORMATION.request.
+     */
+    uint8_t m_scanEnergyThreshold;
+
+    /**
+     *  Contains the list of channels with acceptable energy levels in a bitmap form.
+     *  This is the result of an Energy Detection (ED) scan during
+     *  a NLME-NETWORK-FORMATION.request
+     */
+    uint32_t m_filteredChannelMask;
+
+    /**
+     *  Indicates the current primitive in use in the NWK layer.
+     */
+    PendingPrimitiveNwk m_pendPrimitiveNwk;
+
+    /**
+     *  The network layer neighbor table
+     *  See Zigbee specification r22.1.0, 3.6.1.5
+     */
+    NeighborTable m_nwkNeighborTable;
+
+    /**
+     * Use to keep track of neighboring 16 bit PAN id.
+     * This information is used during the Join process (Association).
+     */
+    PanIdTable m_panIdTable;
+
+    /**
+     *  The network layer routing table
+     *  See Zigbee specification r22.1.0, 3.6.3.2
+     */
+    RoutingTable m_nwkRoutingTable;
+
+    /**
+     *  The network route discovery table
+     *  See Zigbee specification r22.1.0, 3.6.3.2
+     */
+    RouteDiscoveryTable m_nwkRouteDiscoveryTable;
+
+    /**
+     *  Keep track of all the route request retries.
+     */
+    RreqRetryTable m_rreqRetryTable;
+
+    /**
+     *  The broadcast transaction table.
+     *  See Zigbee specification r22.1.0, 3.6.5
+     */
+    BroadcastTransactionTable m_btt;
+
+    /**
+     * Enqueue a packet in the pending transmission queue until
+     * a route is discovered for its destination.
+     *
+     * @param p The packet to enqueue.
+     * @param nsduHandle The handle associated to this packet
+     */
+    void EnqueuePendingTx(Ptr<Packet> p, uint8_t nsduHandle);
+
+    /**
+     * Dequeue a packet previously enqueued in the pending transmission queue.
+     * This is called after a route has successfully be found and the DATA
+     * packet is ready to be transmitted.
+     *
+     * @param dst The destination of the packet
+     * @param entry The pending packet element
+     *
+     * @return True if successfully dequeued
+     */
+    bool DequeuePendingTx(Mac16Address dst, Ptr<PendingTxPkt> entry);
+
+    /**
+     * Dispose of all PendingTxPkt accumulated in the pending transmission queue.
+     */
+    void DisposePendingTx();
+
+    /**
+     * Buffer a copy of a DATA frame for post transmission handling
+     * (Transmission failure counts, retransmission of DATA broadcasts,
+     * push of confirm notifications to the next layer)
+     *
+     * @param p The DATA packet to be buffered in the TxPkt buffer.
+     * @param macHandle The mac layer handle (msdu handle) associated to this frame.
+     * @param nwkHandle The nwk layer handle (nsdu handle) associated to this frame.
+     */
+    void BufferTxPkt(Ptr<Packet> p, uint8_t macHandle, uint8_t nwkHandle);
+
+    /**
+     * Retrieves a previously DATA frame buffered in the TxPkt buffer.
+     * If the frame is successfully retrieved, the entry is removed from the
+     * TxPkt buffer.
+     *
+     * @param macHandle The mac layer handle (msdu handle) associated to this frame.
+     * @param txPkt The packet buffered in the TxPkt buffer.
+     * @return True if the txPkt is successfully retrieved.
+     */
+    bool RetrieveTxPkt(uint8_t macHandle, Ptr<TxPkt>& txPkt);
+
+    /**
+     * Dispose of all the entries in the TxPkt Buffer.
+     */
+    void DisposeTxPktBuffer();
+
+    /**
+     * Cast a Mac layer status to a NWK layer status.
+     *
+     * @param macStatus The Mac layer status to be casted.
+     * @return The ZigbeeNwkStatus resulting from the cast.
+     */
+    NwkStatus GetNwkStatus(lrwpan::MacStatus macStatus) const;
+
+    /**
+     *  Used by a Zigbee coordinator or router to allocate a
+     *  16 bit address (A.K.A short address or network address)
+     *  to its associated device upon request.
+     *
+     *  @return The allocated 16 bit address by this router or Zigbee coordinator.
+     */
+    Mac16Address AllocateNetworkAddress();
+
+    /**
+     * Create and store a MAC beacon payload, then updates its registered size in the MAC.
+     * This is typically followed by updating the content of the beacon payload.
+     */
+    void UpdateBeaconPayloadLength();
+
+    /**
+     * Updates the content of the beacon payload with the most recent information in the NWK.
+     */
+    void UpdateBeaconPayload();
+
+    /**
+     *  Get a non linear representation of a Link Quality Indicator (LQI).
+     *  This is used to obtain LQI representations used in the link cost/Path cost
+     *  of a route discovery and the Outgoing cost in the neighbors table.
+     *
+     * @param lqi The LQI value (1-255) mapped
+     * @return The LQI value mapped to a non linear representation (1-7)
+     */
+    uint8_t GetLQINonLinearValue(uint8_t lqi) const;
+
+    /**
+     * Obtain the link cost based on the value of the nwkReportConstantCost.
+     * If nwkReportConstantCost is True, the link will use a constant value of 7,
+     * if false, it will use the LQI to obtain the link cost.
+     * When the LQI option is used, the link cost is based on a non linear mapping
+     * of LQI values.
+     * See Zigbee specification r22.1.0, 3.6.3.1
+     * See NXP Zigbee 3.0 Stack User Guide (JN-UG-3113, revision 1.5), page 108.
+     *
+     * @param lqi The lqi value (1-255) used to calculate the link cost.
+     * @return The link cost (1-7).
+     */
+    uint8_t GetLinkCost(uint8_t lqi) const;
+
+    /**
+     *  Send a route request command.
+     *  See Zigbee specification r22.1.0, Section 3.4.1
+     *
+     *  @param nwkHeader The network header of the RREQ packet to send
+     *  @param payload The payload header of the RREQ packet to send
+     *  @param rreqRetries The maximum number of retries the broadcast transmission of a route
+     * request command frame is retried. Only valid for non Many-To-One RREQs.
+     */
+    void SendRREQ(ZigbeeNwkHeader nwkHeader,
+                  ZigbeePayloadRouteRequestCommand payload,
+                  uint8_t rreqRetries);
+
+    /**
+     * Handles the reception of a route request command.
+     * See Zigbee specification r22.1.0, Section 3.6.3.5.2
+     *
+     * @param macSrcAddr The MAC header source address
+     * @param nwkHeader The received network Header
+     * @param payload The received route request command payload
+     * @param linkCost The link cost associated to the received RREQ
+     */
+    void ReceiveRREQ(Mac16Address macSrcAddr,
+                     uint8_t linkCost,
+                     ZigbeeNwkHeader nwkHeader,
+                     ZigbeePayloadRouteRequestCommand payload);
+
+    /**
+     *  Construct and send a route reply command.
+     *  See Zigbee specification r22.1.0, Section 3.4.2
+     *
+     *  @param nextHop The address of the next hop in the path back to the RREQ originator.
+     *  @param originator The address of the originator device of the first RREQ.
+     *  @param responder The address of the first device responding to the RREQ with a RREP.
+     *  @param rreqId The RREQ identifier of the originator RREQ.
+     *  @param pathcost The sum value of link costs along the way.
+     */
+    void SendRREP(Mac16Address nextHop,
+                  Mac16Address originator,
+                  Mac16Address responder,
+                  uint8_t rreqId,
+                  uint8_t pathcost);
+
+    /**
+     * Handles the reception of a route reply command.
+     * See Zigbee specification r22.1.0, Section 3.6.3.5.3
+     *
+     * @param macSrcAddr The MAC source address of this reply (a.k.a. previous hop)
+     * @param nwkHeader The received network Header
+     * @param payload The received route reply command payload
+     * @param linkCost The link cost associated to the received RREP
+     */
+    void ReceiveRREP(Mac16Address macSrcAddr,
+                     uint8_t linkCost,
+                     ZigbeeNwkHeader nwkHeader,
+                     ZigbeePayloadRouteReplyCommand payload);
+
+    /**
+     *  Returns true if the address is a broadcast address according to
+     *  Zigbee specification r22.1.0, Section 3.6.5, Table 3-69
+     *
+     *  @param address The address to compare to a broadcast address
+     *  @return True if the address in a broadcast address
+     */
+    bool IsBroadcastAddress(Mac16Address address);
+
+    /**
+     * Send a data unicast packet, and if necessary look for the next hop route
+     * and store the pending data transmission until a route is found.
+     *
+     * @param packet The NPDU (nwkHeader + data payload) to transmit.
+     * @param nwkHandle The NWK handle associated to this packet (nsdu handle).
+     *                  A handle of 0 implies that the unicast transmission is a
+     *                  retransmission and do not requires a handle which is
+     *                  used to identify a packet in confirmations to
+     *                  requests (NLDE-DATA.confirm).
+     */
+    void SendDataUcst(Ptr<Packet> packet, uint8_t nwkHandle);
+
+    /**
+     * Send a data broadcast packet, and add a record to the broadcast transaction
+     * table (BTT).
+     *
+     * @param packet The NPDU (nwkHeader + data payload) to transmit.
+     * @param nwkHandle The NWK handle associated to this packet (nsdu handle).
+     *                  A handle of 0 implies that the unicast transmission is a
+     *                  retransmission and do not requires a handle which is
+     *                  used to identify a packet in confirmations to
+     *                  requests (NLDE-DATA.confirm).
+     */
+    void SendDataBcst(Ptr<Packet> packet, uint8_t nwkHandle);
+
+    /**
+     * Find the next hop in route to a destination.
+     *
+     * See RouteDiscoveryStatus enumeration for full information on the returned status.
+     *
+     * @param macSrcAddr The MAC address received from the previous hop.
+     * @param pathCost The path cost accumulated in the route discovery so far.
+     * @param nwkHeader The network header created at the initiator or the received RREQ.
+     * @param payload The payload header of the initiator or the received RREQ.
+     * @param nextHop If the destination is found in the routing or neighbor tables
+     * it contains the address of the next hop towards the destination.
+     *
+     * @return The RouteDiscoveryStatus of the route search attempt
+     */
+    RouteDiscoveryStatus FindNextHop(Mac16Address macSrcAddr,
+                                     uint8_t pathCost,
+                                     ZigbeeNwkHeader nwkHeader,
+                                     ZigbeePayloadRouteRequestCommand payload,
+                                     Mac16Address& nextHop);
+
+    /**
+     * Process Many-To-One routes. In essence, creating new routes or updating
+     * existing ones from information contained in the received RREQs.
+     *
+     * @param macSrcAddr The MAC address received from the previous hop
+     * @param pathCost The path cost accumulated in the route discovery so far.
+     * @param nwkHeader The network header created at the initiator or the received RREQ.
+     * @param payload The payload header created at the initiator or the received RREQ.
+     *
+     * @return The resulting RouteDiscoveryStatus of the Many-To-One process request.
+     */
+    RouteDiscoveryStatus ProcessManyToOneRoute(Mac16Address macSrcAddr,
+                                               uint8_t pathCost,
+                                               ZigbeeNwkHeader nwkHeader,
+                                               ZigbeePayloadRouteRequestCommand payload);
+
+    /**
+     *  Provides uniform random values
+     */
+    Ptr<UniformRandomVariable> m_uniformRandomVariable;
+
+    /**
+     *  Provides uniform random values for the route request jitter
+     */
+    Ptr<UniformRandomVariable> m_rreqJitter;
+
+    /**
+     * Temporarily store beacons information from POS routers and PAN coordinators
+     * during a network-discovery process.
+     */
+    std::vector<NetworkDescriptor> m_networkDescriptorList;
+
+    /**
+     * Points to the beacon payload used during the network formation process.
+     */
+    Ptr<Packet> m_beaconPayload;
+
+    /**
+     * Used to store the value of the PHY current channel.
+     */
+    uint8_t m_currentChannel;
+
+    /////////////////////////////
+    // Network layer constants //
+    /////////////////////////////
+
+    /**
+     *  Indicates whether the device is capable of becoming the ZigBee coordinator
+     *  Zigbee Specification r22.1.0, Table 3-57. Defined as a constant in the specification
+     *  but here is defined as variable to be able to change the devices capabilities.
+     */
+    bool m_nwkcCoordinatorCapable;
+
+    /**
+     *  Indicates the version of the ZigBee NWK protocol in the device.
+     *  Zigbee Specification r22.1.0, Table 3-57. Defined as a constant in the specification
+     *  but here is defined as variable to be able to change the devices capabilities.
+     */
+    uint8_t m_nwkcProtocolVersion;
+
+    /**
+     *  Indicates the duration until a route discovery expires.
+     *  Zigbee Specification r22.1.0, Table 3-57. Defined as a constant in the specification
+     *  but here is defined as variable to be able to change the devices capabilities.
+     */
+    Time m_nwkcRouteDiscoveryTime;
+
+    /**
+     * The number of times the first broadcast transmission of a route request command
+     * frame is retried. Zigbee Specification r22.1.0, Table 3-57. Defined as a constant
+     * in the specification but here is defined as variable to allow the selection of values
+     * per device.
+     */
+    uint8_t m_nwkcInitialRREQRetries;
+
+    /**
+     * The number of times the broadcast transmission of a route request command frame is
+     * retried on relay by an intermediate Zigbee router or coordinator.
+     * Zigbee Specification r22.1.0, Table 3-57. Defined as a constant
+     * in the specification but here is defined as variable to allow the selection of values
+     * per device.
+     */
+    uint8_t m_nwkcRREQRetries;
+
+    /**
+     *  Count the number of retries this device has transmitted an RREQ
+     */
+    uint8_t m_countRREQRetries;
+
+    /**
+     * Duration between retries of a broadcast route request command frame.
+     * Zigbee Specification r22.1.0, Table 3-57. Defined as a constant
+     * in the specification but here is defined as variable to allow the selection of values
+     * per device.
+     */
+    Time m_nwkcRREQRetryInterval;
+
+    /**
+     * Minimum Route request broadcast jitter time (msec).
+     * Zigbee Specification r22.1.0, Table 3-57. Defined as a constant
+     * in the specification but here is defined as variable to allow the selection of values
+     * per device.
+     */
+    double m_nwkcMinRREQJitter;
+
+    /**
+     * Maximum Route request broadcast jitter time (msec).
+     * Zigbee Specification r22.1.0, Table 3-57. Defined as a constant
+     * in the specification but here is defined as variable to allow the selection of values
+     * per device.
+     */
+    double m_nwkcMaxRREQJitter;
+
+    //////////////////////////////
+    // Network layer attributes //
+    //////////////////////////////
+
+    /**
+     * A value that determines the method used to assign addresses.
+     * See Zigbee specification r22.1.0, Table 3-58
+     */
+    AddrAllocMethod m_nwkAddrAlloc;
+
+    /**
+     * The depth a device can have.
+     * Default value defined in the stack profile.
+     * See Zigbee specification r22.1.0 Layer protocol implementation conformance statement (PICS)
+     * and stack profiles (Section 10.4.2.1)
+     */
+    uint8_t m_nwkMaxDepth;
+
+    /**
+     * The number of children a device is allowed to have on its current network.
+     * Default value defined in the stack profile.
+     * See Zigbee PRO/2007 Layer protocol implementation conformance statement (PICS)
+     * and stack profiles (Section 10.4.2.1)
+     */
+    uint16_t m_nwkMaxChildren;
+
+    /**
+     * The number of routers any one device is allowed to have as children. This is
+     * determined by the zigbee coordinator for all devices in the network.
+     * This value is not used if stochastic address allocation is used.
+     * Default value defined in the stack profile.
+     * See Zigbee PRO/2007 Layer protocol implementation conformance statement (PICS)
+     * and stack profiles (Section 10.4.2.1)
+     */
+    uint16_t m_nwkMaxRouters;
+
+    /**
+     * Describes the current stack profile used in this NWK layer
+     */
+    StackProfile m_nwkStackProfile;
+
+    /**
+     * Indicates the index of the requested timeout field that contains the timeout
+     * in minutes for any end device that does not negotiate a different timeout
+     * value.
+     * See Zigbee specification r22.1.0, Table 3-58 (NIB attributes)
+     */
+    uint16_t m_nwkEndDeviceTimeoutDefault;
+
+    /**
+     * The extended PAN identifier for the PAN of which the device is a member.
+     * A value of 0 means that the extended PAN identifier is unknown.
+     * See Zigbee specification r22.1.0, Table 3-58 (NIB attributes)
+     */
+    uint64_t m_nwkExtendedPanId;
+
+    /**
+     * The 16-bit address that the device uses to communicate with the PAN.
+     * This attribute reflects the value of the MAC PIB attribute macShortAddress
+     * See Zigbee specification r22.1.0, Table 3-58 (NIB attributes)
+     */
+    Mac16Address m_nwkNetworkAddress;
+
+    /**
+     * The EUI 64 bit IEEE address of the local device.
+     * See Zigbee specification r22.1.0, Table 3-58 (NIB attributes)
+     */
+    Mac64Address m_nwkIeeeAddress;
+
+    /**
+     * This NIB attribute should, at all times, have the same value as macPANId .
+     * See Zigbee specification r22.1.0, Table 3-58 (NIB attributes)
+     */
+    uint16_t m_nwkPanId;
+
+    /**
+     *
+     * The behavior depends upon whether the device is a FFD or RFD.
+     * For RFD, this records the information received in an End device timeout
+     * response command indicating the parent information (Table 3-55).
+     * For FFD, this records the device's local capabilities.
+     * See Zigbee specification r22.1.0, Table 3-58 (NIB attributes)
+     */
+    uint8_t m_nwkParentInformation;
+
+    /**
+     * This NIB attribute contains the device capability information established
+     * at network joining time.
+     * See Zigbee specification r22.1.0, Table 3-58 (NIB attributes)
+     */
+    uint8_t m_nwkCapabilityInformation;
+
+    /**
+     * This NIB attribute is a flag determining if this device is a concentrator
+     * (Use in Many-To-One routing).
+     * See Zigbee specification r22.1.0, Table 3-58 (NIB attributes)
+     */
+    bool m_nwkIsConcentrator;
+
+    /**
+     * This NIB attribute indicates the hop count radius for concentrator
+     * route discoveries (Used by Many-To-One routing).
+     * See Zigbee specification r22.1.0, Table 3-58 (NIB attributes)
+     */
+    uint8_t m_nwkConcentratorRadius;
+
+    /**
+     * The time in seconds between concentrator route discoveries.
+     * If set to 0x0000, the discoveries are done at the start up
+     * and by the next higher layer only.
+     * See Zigbee specification r22.1.0, Table 3-58 (NIB attributes)
+     */
+    uint8_t m_nwkConcentratorDiscoveryTime;
+
+    /**
+     * This NIB attribute indicates whether the NWK layer should assume the ability to
+     * use hierarchical routing.
+     * True = Hierarchical routing  False = Never use hierarchical routing
+     * See Zigbee specification r22.1.0, Table 3-58 (NIB attributes)
+     */
+    bool m_nwkUseTreeRouting;
+
+    /**
+     * If false, the NWK layer shall calculate the link cost from all neighbor nodes
+     * using the LQI values reported by the MAC layer, otherwise it shall report a
+     * constant value (7).
+     * See Zigbe Specification r22.1.0, Table 3-58 (NIB attributes)
+     */
+    bool m_nwkReportConstantCost;
+
+    /**
+     * Describes the current route symmetry:
+     * True: Routes are considered to be symmetric links. Backward and forward routes
+     * are created during one-route discovery and they are identical.
+     * False: Routes are not consider to be comprised of symmetric links. Only the forward
+     * route is stored during route discovery.
+     * See Zigbe Specification r22.1.0, Table 3-58 (NIB attributes)
+     */
+    bool m_nwkSymLink;
+
+    /**
+     * The maximum number of retries allowed after a broadcast transmission failure
+     * See Zigbe Specification r22.1.0, Table 3-58 (NIB attributes)
+     */
+    uint8_t m_nwkMaxBroadcastRetries;
+
+    /**
+     * The maximum time duration in milliseconds allowed for the parent all the child devices to
+     * retransmit a broadcast message.
+     * See Zigbe Specification r22.1.0, Table 3-58 (NIB attributes)
+     */
+    Time m_nwkPassiveAckTimeout;
+
+    /**
+     * Time duration that a broadcast message needs to encompass the entire network.
+     * Its default value is calculated based on other NIB attributes.
+     * See Zigbe Specification r22.1.0, Table 3-58 (NIB attributes)
+     */
+    Time m_nwkNetworkBroadcastDeliveryTime;
+
+    /**
+     * The sequence number used to identify outgoing frames
+     * See Zigbee specification r22.1.0, Table 3-58 (NIB attributes)
+     */
+    SequenceNumber8 m_nwkSequenceNumber;
+
+    /**
+     * The counter used to identify route request commands
+     */
+    SequenceNumber8 m_routeRequestId;
+
+    /**
+     * The handle assigned when doing a transmission request
+     * to the MAC layer
+     */
+    SequenceNumber8 m_macHandle;
+
+    /**
+     * The expiration time of routing table entry.
+     * This value is not standardized and it is implementation dependent.
+     */
+    Time m_routeExpiryTime;
+};
+
+} // namespace zigbee
+} // namespace ns3
+
+#endif /* ZIGBEE_NWK_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/zigbee/model/zigbee-nwk-header.cc ns-3.44/src/zigbee/model/zigbee-nwk-header.cc
--- ns-3.43/src/zigbee/model/zigbee-nwk-header.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/zigbee/model/zigbee-nwk-header.cc	2025-03-09 16:55:49.819372700 -0700
@@ -0,0 +1,413 @@
+/*
+ * Copyright (c) 2024 Tokushima University, Japan
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Authors:
+ *  Ryo Okuda  <c611901200@tokushima-u.ac.jp>
+ *  Alberto Gallegos Ramonet <alramonet@is.tokushima-u.ac.jp>
+ */
+
+#include "zigbee-nwk-header.h"
+
+#include "ns3/address-utils.h"
+
+namespace ns3
+{
+namespace zigbee
+{
+
+ZigbeeNwkHeader::ZigbeeNwkHeader()
+{
+    SetFrameType(DATA);
+    SetProtocolVer(3);
+    SetDiscoverRoute(DiscoverRouteType::SUPPRESS_ROUTE_DISCOVERY);
+    m_fctrlMcst = false;
+    m_fctrlSecurity = false;
+    m_fctrlSrcRoute = false;
+    m_fctrlDstIEEEAddr = false;
+    m_fctrlSrcIEEEAddr = false;
+    m_fctrlEndDevIni = false;
+}
+
+ZigbeeNwkHeader::~ZigbeeNwkHeader()
+{
+}
+
+void
+ZigbeeNwkHeader::SetFrameType(enum NwkType nwkType)
+{
+    m_fctrlFrmType = nwkType;
+}
+
+NwkType
+ZigbeeNwkHeader::GetFrameType() const
+{
+    return m_fctrlFrmType;
+}
+
+void
+ZigbeeNwkHeader::SetProtocolVer(uint8_t ver)
+{
+    m_fctrlPrtVer = ver;
+}
+
+uint8_t
+ZigbeeNwkHeader::GetProtocolVer() const
+{
+    return (m_fctrlPrtVer);
+}
+
+void
+ZigbeeNwkHeader::SetDiscoverRoute(enum DiscoverRouteType discoverRoute)
+{
+    m_fctrlDscvRoute = discoverRoute;
+}
+
+DiscoverRouteType
+ZigbeeNwkHeader::GetDiscoverRoute() const
+{
+    return m_fctrlDscvRoute;
+}
+
+void
+ZigbeeNwkHeader::SetMulticast()
+{
+    m_fctrlMcst = true;
+}
+
+bool
+ZigbeeNwkHeader::IsMulticast() const
+{
+    return m_fctrlMcst;
+}
+
+bool
+ZigbeeNwkHeader::IsSecurityEnabled() const
+{
+    return m_fctrlSecurity;
+}
+
+void
+ZigbeeNwkHeader::SetEndDeviceInitiator()
+{
+    m_fctrlEndDevIni = true;
+}
+
+bool
+ZigbeeNwkHeader::GetEndDeviceInitiator() const
+{
+    return m_fctrlEndDevIni;
+}
+
+void
+ZigbeeNwkHeader::SetDstAddr(Mac16Address addr)
+{
+    m_dstAddr = addr;
+}
+
+Mac16Address
+ZigbeeNwkHeader::GetDstAddr() const
+{
+    return (m_dstAddr);
+}
+
+void
+ZigbeeNwkHeader::SetSrcAddr(Mac16Address addr)
+{
+    m_srcAddr = addr;
+}
+
+Mac16Address
+ZigbeeNwkHeader::GetSrcAddr() const
+{
+    return (m_srcAddr);
+}
+
+void
+ZigbeeNwkHeader::SetRadius(uint8_t radius)
+{
+    m_radius = radius;
+}
+
+uint8_t
+ZigbeeNwkHeader::GetRadius() const
+{
+    return (m_radius);
+}
+
+void
+ZigbeeNwkHeader::SetSeqNum(uint8_t seqNum)
+{
+    m_seqNum = seqNum;
+}
+
+uint8_t
+ZigbeeNwkHeader::GetSeqNum() const
+{
+    return (m_seqNum);
+}
+
+void
+ZigbeeNwkHeader::SetDstIeeeAddr(Mac64Address dst)
+{
+    m_fctrlDstIEEEAddr = true;
+    m_dstIeeeAddr = dst;
+}
+
+Mac64Address
+ZigbeeNwkHeader::GetDstIeeeAddr() const
+{
+    return (m_dstIeeeAddr);
+}
+
+void
+ZigbeeNwkHeader::SetSrcIeeeAddr(Mac64Address src)
+{
+    m_fctrlSrcIEEEAddr = true;
+    m_srcIeeeAddr = src;
+}
+
+Mac64Address
+ZigbeeNwkHeader::GetSrcIeeeAddr() const
+{
+    return (m_srcIeeeAddr);
+}
+
+void
+ZigbeeNwkHeader::SetFrameControl(uint16_t frameControl)
+{
+    m_fctrlFrmType = static_cast<NwkType>((frameControl) & (0x03));                  // Bit 0-1
+    m_fctrlPrtVer = (frameControl >> 2) & (0x0F);                                    // Bit 2-5
+    m_fctrlDscvRoute = static_cast<DiscoverRouteType>((frameControl >> 6) & (0x03)); // Bit 6-7
+    m_fctrlMcst = (frameControl >> 8) & (0x01);                                      // Bit 8
+    m_fctrlSecurity = (frameControl >> 9) & (0x01);                                  // Bit 9
+    m_fctrlSrcRoute = (frameControl >> 10) & (0x01);                                 // Bit 10
+    m_fctrlDstIEEEAddr = (frameControl >> 11) & (0x01);                              // Bit 11
+    m_fctrlSrcIEEEAddr = (frameControl >> 12) & (0x01);                              // Bit 12
+    m_fctrlEndDevIni = (frameControl >> 13) & (0x01);                                // Bit 13
+}
+
+uint16_t
+ZigbeeNwkHeader::GetFrameControl() const
+{
+    uint16_t val = 0;
+
+    val = m_fctrlFrmType & (0x03);                    // Bit 0-1
+    val |= (m_fctrlPrtVer << 2) & (0x0F << 2);        // Bit 2-5
+    val |= (m_fctrlDscvRoute << 6) & (0x03 << 6);     // Bit 6-7
+    val |= (m_fctrlMcst << 8) & (0x01 << 8);          // Bit 8
+    val |= (m_fctrlSecurity << 9) & (0x01 << 9);      // Bit 9
+    val |= (m_fctrlSrcRoute << 10) & (0x01 << 10);    // Bit 10
+    val |= (m_fctrlDstIEEEAddr << 11) & (0x01 << 11); // Bit 11
+    val |= (m_fctrlSrcIEEEAddr << 12) & (0x01 << 12); // Bit 12
+    val |= (m_fctrlEndDevIni << 13) & (0x01 << 13);   // Bit 13
+
+    return val;
+}
+
+void
+ZigbeeNwkHeader::SetMulticastControl(uint8_t multicastControl)
+{
+    m_mcstMode = static_cast<MulticastMode>((multicastControl) & (0x03)); // Bit 0-1
+    m_nonMemberRadius = (multicastControl >> 2) & (0x07);                 // Bit 2-4
+    m_maxNonMemberRadius = (multicastControl >> 5) & (0x07);              // Bit 5-7
+}
+
+uint8_t
+ZigbeeNwkHeader::GetMulticastControl() const
+{
+    uint8_t val = 0;
+
+    val = m_mcstMode & (0x03);                        // Bit 0-1
+    val |= (m_nonMemberRadius << 2) & (0x07 << 2);    // Bit 2-4
+    val |= (m_maxNonMemberRadius << 5) & (0x07 << 5); // Bit 5-7
+
+    return val;
+}
+
+void
+ZigbeeNwkHeader::Serialize(Buffer::Iterator start) const
+{
+    Buffer::Iterator i = start;
+
+    uint16_t frameControl = GetFrameControl();
+    i.WriteHtolsbU16(frameControl);
+
+    WriteTo(i, m_dstAddr);
+    WriteTo(i, m_srcAddr);
+    i.WriteU8(m_radius);
+    i.WriteU8(m_seqNum);
+
+    if (m_fctrlDstIEEEAddr)
+    {
+        WriteTo(i, m_dstIeeeAddr);
+    }
+
+    if (m_fctrlSrcIEEEAddr)
+    {
+        WriteTo(i, m_srcIeeeAddr);
+    }
+
+    if (m_fctrlMcst)
+    {
+        i.WriteU8(GetMulticastControl());
+    }
+
+    // TODO: Add Source route subframe when supported
+}
+
+uint32_t
+ZigbeeNwkHeader::Deserialize(Buffer::Iterator start)
+{
+    Buffer::Iterator i = start;
+    uint16_t frameControl = i.ReadLsbtohU16();
+    SetFrameControl(frameControl);
+    ReadFrom(i, m_dstAddr);
+    ReadFrom(i, m_srcAddr);
+    SetRadius(i.ReadU8());
+    SetSeqNum(i.ReadU8());
+
+    if (m_fctrlDstIEEEAddr)
+    {
+        ReadFrom(i, m_dstIeeeAddr);
+    }
+
+    if (m_fctrlSrcIEEEAddr)
+    {
+        ReadFrom(i, m_srcIeeeAddr);
+    }
+
+    if (m_fctrlMcst)
+    {
+        uint8_t multicastControl = i.ReadU8();
+        SetMulticastControl(multicastControl);
+    }
+
+    // TODO: Add Source route subframe when supported
+
+    return i.GetDistanceFrom(start);
+}
+
+uint32_t
+ZigbeeNwkHeader::GetSerializedSize() const
+{
+    /*
+     * Each NWK header will have:
+     *
+     * Frame Control      : 2 octet
+     *
+     * Routing Fields:
+     * Destination address      : 2 octet
+     * Source address           : 2 octet
+     * Radius                   : 1 octet
+     * Sequence number          : 1 octet
+     * Destination IEEE address : 0/8 octet
+     * Source IEEE address      : 0/8 octet
+     * Multicast control        : 0/1 octet
+     * Source route subframe    : variable
+     */
+
+    uint32_t size = 8;
+
+    if (m_fctrlDstIEEEAddr)
+    {
+        size += 8;
+    }
+
+    if (m_fctrlSrcIEEEAddr)
+    {
+        size += 8;
+    }
+
+    if (m_fctrlMcst)
+    {
+        size += 1;
+    }
+
+    // TODO: Add Source route subframe when supported.
+
+    return (size);
+}
+
+TypeId
+ZigbeeNwkHeader::GetTypeId()
+{
+    static TypeId tid = TypeId("ns3::zigbee::ZigbeeNwkHeader")
+                            .SetParent<Header>()
+                            .SetGroupName("Zigbee")
+                            .AddConstructor<ZigbeeNwkHeader>();
+    return tid;
+}
+
+TypeId
+ZigbeeNwkHeader::GetInstanceTypeId() const
+{
+    return GetTypeId();
+}
+
+void
+ZigbeeNwkHeader::Print(std::ostream& os) const
+{
+    os << "\n";
+    switch (m_fctrlFrmType)
+    {
+    case DATA:
+        os << "Frame Type = DATA ";
+        break;
+    case NWK_COMMAND:
+        os << "Frame Type = NWK_COMMAND ";
+        break;
+    case INTER_PAN:
+        os << "Frame Type = INTER_PAN  ";
+        break;
+    }
+    os << " | Protocol Version = " << static_cast<uint32_t>(m_fctrlPrtVer)
+       << " | Security Enabled = " << static_cast<uint32_t>(m_fctrlSecurity)
+       << " | Source Route = " << static_cast<uint32_t>(m_fctrlSrcRoute);
+
+    switch (m_fctrlDscvRoute)
+    {
+    case DiscoverRouteType::SUPPRESS_ROUTE_DISCOVERY:
+        os << " | Enable Route Discovery = SUPPRESS ";
+        break;
+    case DiscoverRouteType::ENABLE_ROUTE_DISCOVERY:
+        os << " | Enable Route Discovery = ENABLED ";
+        break;
+    }
+
+    os << "\nDst Addr = " << m_dstAddr << " | Src Addr  = " << m_srcAddr
+       << " | Sequence Num = " << static_cast<uint32_t>(m_seqNum)
+       << " | Radius = " << static_cast<uint32_t>(m_radius);
+
+    if (m_fctrlDstIEEEAddr)
+    {
+        os << "\nDst IEEE Addr = " << m_dstIeeeAddr;
+    }
+
+    if (m_fctrlSrcIEEEAddr)
+    {
+        os << " | Src IEEE Addr  = " << m_srcIeeeAddr;
+    }
+
+    if (m_fctrlMcst)
+    {
+        switch (m_mcstMode)
+        {
+        case MEMBER:
+            os << " | Mcst mode: MEMBER ";
+            break;
+        case NONMEMBER:
+            os << " | Mcst mode: NONMEMBER ";
+            break;
+        }
+
+        os << " | Non Member radius = " << static_cast<uint32_t>(m_nonMemberRadius)
+           << " | Max Non Member radius = " << static_cast<uint32_t>(m_maxNonMemberRadius);
+    }
+    os << "\n";
+
+    // TODO: Add Source route subframe when supported.
+}
+} // namespace zigbee
+} // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/zigbee/model/zigbee-nwk-header.h ns-3.44/src/zigbee/model/zigbee-nwk-header.h
--- ns-3.43/src/zigbee/model/zigbee-nwk-header.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/zigbee/model/zigbee-nwk-header.h	2025-03-09 16:55:49.819372700 -0700
@@ -0,0 +1,270 @@
+/*
+ * Copyright (c) 2024 Tokushima University, Japan
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Authors:
+ *  Ryo Okuda  <c611901200@tokushima-u.ac.jp>
+ *  Alberto Gallegos Ramonet <alramonet@is.tokushima-u.ac.jp>
+ */
+
+#ifndef ZIGBEE_NWK_HEADER_H
+#define ZIGBEE_NWK_HEADER_H
+
+#include "ns3/header.h"
+#include "ns3/mac16-address.h"
+#include "ns3/mac64-address.h"
+
+namespace ns3
+{
+
+namespace zigbee
+{
+
+/**
+ * Zigbee Specification r22.1.0, Values of the frame Type Sub-field (Table 3-46)
+ */
+enum NwkType
+{
+    DATA = 0,        //!< Data frame type
+    NWK_COMMAND = 1, //!< Network command frame type
+    INTER_PAN = 3    //!< Inter-Pan frame type
+};
+
+/**
+ * Zigbee Specification r22.1.0, Values of the discover route sub-field (Table 3-47)
+ */
+enum DiscoverRouteType
+{
+    SUPPRESS_ROUTE_DISCOVERY = 0x00, //!< Suppress route discovery
+    ENABLE_ROUTE_DISCOVERY = 0x01    //!< Enable route discovery
+};
+
+/**
+ * Zigbee Specification r22.1.0, Multicast Mode Sub-Field (Table 3-7)
+ */
+enum MulticastMode
+{
+    NONMEMBER = 0, //!< Non member multicast mode
+    MEMBER = 1,    //!< Member multicast mode
+};
+
+/**
+ * @ingroup zigbee
+ * Represent the NWK Header with the Frame Control and Routing fields
+ * Zigbee Specification r22.1.0, General NPDU Frame Format (Section 3.3.1)
+ */
+class ZigbeeNwkHeader : public Header
+{
+  public:
+    ZigbeeNwkHeader();
+
+    ~ZigbeeNwkHeader() override;
+
+    /**
+     * Set the Frame type used (Data or Command)
+     * @param nwkType The frame type
+     */
+    void SetFrameType(enum NwkType nwkType);
+
+    /**
+     * Set the Frame Control field "Frame Type" bits
+     * @return The frame type
+     */
+    NwkType GetFrameType() const;
+
+    /**
+     * Set the Protocol version
+     * @param ver The protocol version
+     */
+    void SetProtocolVer(uint8_t ver);
+
+    /**
+     * Get Frame protocol version
+     * @return The protocol version used by the frame
+     */
+    uint8_t GetProtocolVer() const;
+
+    /**
+     *  Suppress or enable route discovery for this frame
+     * @param discoverRoute Suppress or enable route discovery
+     */
+    void SetDiscoverRoute(enum DiscoverRouteType discoverRoute);
+
+    /**
+     * Get the status of frame discovery route (suppress or enabled)
+     * @return The discovery route status
+     */
+    DiscoverRouteType GetDiscoverRoute() const;
+
+    /**
+     * Set to true the value of the multicast flag in the frame control field.
+     */
+    void SetMulticast();
+
+    /**
+     * Inform whether or not the current frame is used in multicast.
+     * @return  True = MCST false = UCST or BCST
+     */
+    bool IsMulticast() const;
+
+    /**
+     * Inform whether or not security is enabled.
+     * @return True security enabled.
+     */
+    bool IsSecurityEnabled() const;
+
+    /**
+     * This flag is used by the NWK to indicate if the the initiator device of the
+     * message is an end device and the nwkParentInformation field of the NIB has other value than
+     * 0.
+     */
+    void SetEndDeviceInitiator();
+
+    /**
+     * Get whether or not the source of this message was an end device.
+     * @return True of the source of the message was an end device.
+     */
+    bool GetEndDeviceInitiator() const;
+
+    /**
+     * Set Destination address
+     * @param addr The destination address (16 bit)
+     */
+    void SetDstAddr(Mac16Address addr);
+
+    /**
+     * Get the Destination address
+     * @return the Destination address (16bits)
+     */
+    Mac16Address GetDstAddr() const;
+
+    /**
+     * Set Source address
+     * @param addr The source address (16 bit)
+     */
+    void SetSrcAddr(Mac16Address addr);
+
+    /**
+     * Get the Source address
+     * @return the Source address (16bits)
+     */
+    Mac16Address GetSrcAddr() const;
+
+    /**
+     * Set the Radius
+     * @param radius radius
+     */
+    void SetRadius(uint8_t radius);
+
+    /**
+     * Get the Radius
+     * @return the Radius
+     */
+    uint8_t GetRadius() const;
+
+    /**
+     * Set the Sequence number
+     * @param seqNum sequence number
+     */
+    void SetSeqNum(uint8_t seqNum);
+
+    /**
+     * Get the frame Sequence number
+     * @return the sequence number
+     */
+    uint8_t GetSeqNum() const;
+
+    /**
+     *  Set the destination IEEE address
+     *  @param dst The destination IEEE address (64 bits)
+     */
+    void SetDstIeeeAddr(Mac64Address dst);
+
+    /**
+     * Get the destination IEEE address
+     * @return The destination IEEE address (64bits)
+     */
+    Mac64Address GetDstIeeeAddr() const;
+
+    /**
+     * Set the source IEEE address
+     * @param src The source IEEE address
+     */
+    void SetSrcIeeeAddr(Mac64Address src);
+
+    /**
+     * Get the source IEEE address
+     * @return The source IEEE address (64bits)
+     */
+    Mac64Address GetSrcIeeeAddr() const;
+
+    void Serialize(Buffer::Iterator start) const override;
+    uint32_t Deserialize(Buffer::Iterator start) override;
+    uint32_t GetSerializedSize() const override;
+    /**
+     * Get the type ID.
+     *
+     * @return the object TypeId
+     */
+    static TypeId GetTypeId();
+    TypeId GetInstanceTypeId() const override;
+    void Print(std::ostream& os) const override;
+
+  private:
+    /**
+     * Set the Frame control field
+     * @param frameControl 16 bits representing the frame control
+     */
+    void SetFrameControl(uint16_t frameControl);
+    /**
+     * Get the Frame control field
+     * @return The 16 bits of the Frame control field
+     */
+    uint16_t GetFrameControl() const;
+    /**
+     * Set the Multicast control field
+     * @param multicastControl 8 bits representing the multicast control field
+     */
+    void SetMulticastControl(uint8_t multicastControl);
+    /**
+     * Get The Multicast control field
+     * @return The 8 bits representing the multicast control field
+     */
+    uint8_t GetMulticastControl() const;
+
+    /* Frame Control (2 Octets) */
+
+    NwkType m_fctrlFrmType;             //!< Frame type (Bit 0-1)
+    uint8_t m_fctrlPrtVer;              //!< Protocol version (Bit 2-5)
+    DiscoverRouteType m_fctrlDscvRoute; //!< Discover route (Bit 6-7)
+    bool m_fctrlMcst;                   //!< Multicast flag (Bit 8)
+    bool m_fctrlSecurity;               //!< Security flag (Bit 9)
+    bool m_fctrlSrcRoute;               //!< Source route flag (Bit 10)
+    bool m_fctrlDstIEEEAddr;            //!< Destination IEEE address flag (Bit 11)
+    bool m_fctrlSrcIEEEAddr;            //!< Source IEEE address flag (Bit 12)
+    bool m_fctrlEndDevIni;              //!< End device initiator flag (Bit 13)
+                                        // Reserved (Bits 14-15)
+
+    /* Routing Fields (variable) */
+
+    Mac16Address m_dstAddr;     //!< Destination address (2 Octets)
+    Mac16Address m_srcAddr;     //!< Source address (2 Octets)
+    uint8_t m_radius;           //!< Radius (1 Octet)
+    uint8_t m_seqNum;           //!< Sequence number (1 Octet)
+    Mac64Address m_dstIeeeAddr; //!< Destination IEEE address (0 or 8 Octets)
+    Mac64Address m_srcIeeeAddr; //!< Source IEEE address (0 or 8 Octets)
+    // Multicast Control (1 Octet)
+    MulticastMode m_mcstMode{NONMEMBER}; //!< Multicast mode sub-field (Bits 0-1)
+    uint8_t m_nonMemberRadius;           //!< Non member radius sub-field (Bits 2-4)
+    uint8_t m_maxNonMemberRadius;        //!< Max non member radius sub-field (Bit 5-7)
+
+    // TODO: Add source route subframe
+    // uint8_t m_relayCount; //!< Relay Count Sub-Field
+    // uint8_t m_relayIndex; //!< Relay Index
+    // TODO: Add Relay List when supported
+};
+} // namespace zigbee
+} // namespace ns3
+
+#endif /* ZIGBEE_NWK_HEADER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/zigbee/model/zigbee-nwk-payload-header.cc ns-3.44/src/zigbee/model/zigbee-nwk-payload-header.cc
--- ns-3.43/src/zigbee/model/zigbee-nwk-payload-header.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/zigbee/model/zigbee-nwk-payload-header.cc	2025-03-09 16:55:49.819372700 -0700
@@ -0,0 +1,699 @@
+/*
+ * Copyright (c) 2024 Tokushima University, Tokushima, Japan.
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ *  Authors: Ryo Okuda <c611901200@tokushima-u.ac.jp>
+ *           Alberto Gallegos Ramonet <alramonet@is.tokushima-u.ac.jp>
+ */
+
+#include "zigbee-nwk-payload-header.h"
+
+#include "ns3/address-utils.h"
+#include "ns3/simulator.h"
+
+namespace ns3
+{
+namespace zigbee
+{
+
+/***********************************************************
+ *                NWK Command Identifier
+ ***********************************************************/
+
+ZigbeePayloadType::ZigbeePayloadType()
+{
+    m_nwkCmdType = LEAVE_CMD;
+}
+
+ZigbeePayloadType::ZigbeePayloadType(enum NwkCommandType nwkCmdType)
+{
+    m_nwkCmdType = nwkCmdType;
+}
+
+TypeId
+ZigbeePayloadType::GetTypeId()
+{
+    static TypeId tid = TypeId("ns3::zigbee::ZigbeePayloadType")
+                            .SetParent<Header>()
+                            .SetGroupName("Zigbee")
+                            .AddConstructor<ZigbeePayloadType>();
+    return tid;
+}
+
+TypeId
+ZigbeePayloadType::GetInstanceTypeId() const
+{
+    return GetTypeId();
+}
+
+void
+ZigbeePayloadType::SetCmdType(enum NwkCommandType nwkCmdType)
+{
+    m_nwkCmdType = nwkCmdType;
+}
+
+NwkCommandType
+ZigbeePayloadType::GetCmdType() const
+{
+    return m_nwkCmdType;
+}
+
+uint32_t
+ZigbeePayloadType::GetSerializedSize() const
+{
+    return 1;
+}
+
+void
+ZigbeePayloadType::Serialize(Buffer::Iterator start) const
+{
+    Buffer::Iterator i = start;
+    i.WriteU8(m_nwkCmdType);
+}
+
+uint32_t
+ZigbeePayloadType::Deserialize(Buffer::Iterator start)
+{
+    Buffer::Iterator i = start;
+    m_nwkCmdType = static_cast<NwkCommandType>(i.ReadU8());
+
+    return i.GetDistanceFrom(start);
+}
+
+void
+ZigbeePayloadType::Print(std::ostream& os) const
+{
+    os << "\nPayloadType  = ";
+    switch (m_nwkCmdType)
+    {
+    case ROUTE_REQ_CMD:
+        os << "ROUTE_REQ\n";
+        break;
+    case ROUTE_REP_CMD:
+        os << "ROUTE_REP\n";
+        break;
+    case NWK_STATUS_CMD:
+        os << "NWK_STATUS\n";
+        break;
+    case LEAVE_CMD:
+        os << "LEAVE\n";
+        break;
+    case ROUTE_RECORD_CMD:
+        os << "ROUTE_RECORD\n";
+        break;
+    case REJOIN_REQ_CMD:
+        os << "REJOIN_REQ\n";
+        break;
+    case REJOIN_RESP_CMD:
+        os << "REJOIN_RESP\n";
+        break;
+    case LINK_STATUS_CMD:
+        os << "LINK_STATUS\n";
+        break;
+    case NWK_REPORT_CMD:
+        os << "NWK_REPORT \n";
+        break;
+    case NWK_UPDATE_CMD:
+        os << "NWK_UPDATE\n";
+        break;
+    case TIMEOUT_REQ_CMD:
+        os << "TIMEOUT_REQ\n";
+        break;
+    case TIMEOUT_RESP_CMD:
+        os << "TIMEOUT_RESP\n";
+        break;
+    case LINK_POWER_DELTA_CMD:
+        os << "LINK_POWER_DELTA\n";
+        break;
+    default:
+        os << "UNKNOWN\n";
+    }
+}
+
+/***********************************************************
+ *                Route Request Command
+ ***********************************************************/
+
+ZigbeePayloadRouteRequestCommand::ZigbeePayloadRouteRequestCommand()
+{
+    m_cmdOptManyToOne = NO_MANY_TO_ONE;
+    m_cmdOptDstIeeeAddr = false;
+    m_cmdOptMcst = false;
+    m_routeReqId = 0;
+    m_pathCost = 0;
+}
+
+TypeId
+ZigbeePayloadRouteRequestCommand::GetTypeId()
+{
+    static TypeId tid = TypeId("ns3::zigbee::ZigbeePayloadRouteRequestCommand")
+                            .SetParent<Header>()
+                            .SetGroupName("Zigbee")
+                            .AddConstructor<ZigbeePayloadRouteRequestCommand>();
+    return tid;
+}
+
+TypeId
+ZigbeePayloadRouteRequestCommand::GetInstanceTypeId() const
+{
+    return GetTypeId();
+}
+
+uint32_t
+ZigbeePayloadRouteRequestCommand::GetSerializedSize() const
+{
+    uint32_t size = 0;
+    size += 5; // (Command Option + Route request identifier + Destination address + Path cost)
+    if (m_cmdOptDstIeeeAddr)
+    {
+        size += 8;
+    }
+
+    return size;
+}
+
+void
+ZigbeePayloadRouteRequestCommand::Serialize(Buffer::Iterator start) const
+{
+    Buffer::Iterator i = start;
+    i.WriteU8(GetCmdOptionField());
+    i.WriteU8(m_routeReqId);
+    WriteTo(i, m_dstAddr);
+    i.WriteU8(m_pathCost);
+    if (m_cmdOptDstIeeeAddr)
+    {
+        WriteTo(i, m_dstIeeeAddr);
+    }
+}
+
+uint32_t
+ZigbeePayloadRouteRequestCommand::Deserialize(Buffer::Iterator start)
+{
+    Buffer::Iterator i = start;
+    uint8_t cmdOptField = i.ReadU8();
+    SetCmdOptionField(cmdOptField);
+    m_routeReqId = (i.ReadU8());
+    m_dstAddr = (i.ReadU16());
+    m_pathCost = (i.ReadU8());
+
+    if (m_cmdOptDstIeeeAddr)
+    {
+        ReadFrom(i, m_dstIeeeAddr);
+    }
+
+    return i.GetDistanceFrom(start);
+}
+
+void
+ZigbeePayloadRouteRequestCommand::Print(std::ostream& os) const
+{
+    os << "Multicast = " << static_cast<uint32_t>(m_cmdOptMcst)
+       << "| Route request identifier = " << static_cast<uint32_t>(m_routeReqId)
+       << "| Destination address = " << m_dstAddr
+       << "| Path cost = " << static_cast<uint32_t>(m_pathCost) << "| CmdOptFieldManyToOne = ";
+    switch (m_cmdOptManyToOne)
+    {
+    case NO_MANY_TO_ONE:
+        os << "NO_MANY_TO_ONE";
+        break;
+    case ROUTE_RECORD:
+        os << "ROUTE_RECORD";
+        break;
+    case NO_ROUTE_RECORD:
+        os << "NO_ROUTE_RECORD";
+        break;
+    }
+
+    if (m_cmdOptDstIeeeAddr)
+    {
+        os << "| Destination IEEE address = " << m_dstIeeeAddr;
+    }
+
+    os << "\n";
+}
+
+void
+ZigbeePayloadRouteRequestCommand::SetCmdOptManyToOneField(enum ManyToOne manyToOneField)
+{
+    m_cmdOptManyToOne = manyToOneField;
+}
+
+uint8_t
+ZigbeePayloadRouteRequestCommand::GetCmdOptManyToOneField() const
+{
+    return m_cmdOptManyToOne;
+}
+
+void
+ZigbeePayloadRouteRequestCommand::SetRouteReqId(uint8_t id)
+{
+    m_routeReqId = id;
+}
+
+uint8_t
+ZigbeePayloadRouteRequestCommand::GetRouteReqId() const
+{
+    return (m_routeReqId);
+}
+
+void
+ZigbeePayloadRouteRequestCommand::SetDstAddr(Mac16Address addr)
+{
+    m_dstAddr = addr;
+}
+
+Mac16Address
+ZigbeePayloadRouteRequestCommand::GetDstAddr() const
+{
+    return (m_dstAddr);
+}
+
+void
+ZigbeePayloadRouteRequestCommand::SetPathCost(uint8_t cost)
+{
+    m_pathCost = cost;
+}
+
+uint8_t
+ZigbeePayloadRouteRequestCommand::GetPathCost() const
+{
+    return (m_pathCost);
+}
+
+bool
+ZigbeePayloadRouteRequestCommand::IsDstIeeeAddressPresent() const
+{
+    return m_cmdOptDstIeeeAddr;
+}
+
+void
+ZigbeePayloadRouteRequestCommand::SetDstIeeeAddr(Mac64Address dst)
+{
+    m_cmdOptDstIeeeAddr = true;
+    m_dstIeeeAddr = dst;
+}
+
+Mac64Address
+ZigbeePayloadRouteRequestCommand::GetDstIeeeAddr() const
+{
+    return (m_dstIeeeAddr);
+}
+
+void
+ZigbeePayloadRouteRequestCommand::SetCmdOptionField(uint8_t cmdOptionField)
+{
+    m_cmdOptManyToOne = static_cast<ManyToOne>((cmdOptionField >> 3) & (0x03)); // Bit 3-4
+    m_cmdOptDstIeeeAddr = (cmdOptionField >> 5) & (0x01);                       // Bit 5
+    m_cmdOptMcst = (cmdOptionField >> 6) & (0x01);                              // Bit 6
+}
+
+uint8_t
+ZigbeePayloadRouteRequestCommand::GetCmdOptionField() const
+{
+    uint8_t val = 0;
+
+    val |= (m_cmdOptManyToOne << 3) & (0x03 << 3);   // Bit 3-4
+    val |= (m_cmdOptDstIeeeAddr << 5) & (0x01 << 5); // Bit 5
+    val |= (m_cmdOptMcst << 6) & (0x01 << 6);        // Bit 6
+
+    return val;
+}
+
+/***********************************************************
+ *                Route Reply Command
+ ***********************************************************/
+
+ZigbeePayloadRouteReplyCommand::ZigbeePayloadRouteReplyCommand()
+{
+    m_cmdOptOrigIeeeAddr = false;
+    m_cmdOptRespIeeeAddr = false;
+    m_cmdOptMcst = false;
+    m_routeReqId = 0;
+    m_pathCost = 0;
+}
+
+TypeId
+ZigbeePayloadRouteReplyCommand::GetTypeId()
+{
+    static TypeId tid = TypeId("ns3::zigbee::ZigbeePayloadRouteReplyCommand")
+                            .SetParent<Header>()
+                            .SetGroupName("Zigbee")
+                            .AddConstructor<ZigbeePayloadRouteReplyCommand>();
+    return tid;
+}
+
+TypeId
+ZigbeePayloadRouteReplyCommand::GetInstanceTypeId() const
+{
+    return GetTypeId();
+}
+
+uint32_t
+ZigbeePayloadRouteReplyCommand::GetSerializedSize() const
+{
+    uint32_t size = 0;
+    size += 7; // (Command Option + Route request identifier + Originator address + Responder
+               // address + Path cost)
+    if (m_cmdOptOrigIeeeAddr)
+    {
+        size += 8;
+    }
+
+    if (m_cmdOptRespIeeeAddr)
+    {
+        size += 8;
+    }
+
+    return size;
+}
+
+void
+ZigbeePayloadRouteReplyCommand::Serialize(Buffer::Iterator start) const
+{
+    Buffer::Iterator i = start;
+    i.WriteU8(m_routeReqId);
+    WriteTo(i, m_origAddr);
+    WriteTo(i, m_respAddr);
+    i.WriteU8(m_pathCost);
+    if (m_cmdOptOrigIeeeAddr)
+    {
+        WriteTo(i, m_origIeeeAddr);
+    }
+
+    if (m_cmdOptRespIeeeAddr)
+    {
+        WriteTo(i, m_respIeeeAddr);
+    }
+}
+
+uint32_t
+ZigbeePayloadRouteReplyCommand::Deserialize(Buffer::Iterator start)
+{
+    Buffer::Iterator i = start;
+    m_routeReqId = (i.ReadU8());
+    ReadFrom(i, m_origAddr);
+    ReadFrom(i, m_respAddr);
+    m_pathCost = (i.ReadU8());
+    if (m_cmdOptOrigIeeeAddr)
+    {
+        ReadFrom(i, m_origIeeeAddr);
+    }
+
+    if (m_cmdOptRespIeeeAddr)
+    {
+        ReadFrom(i, m_respIeeeAddr);
+    }
+
+    return i.GetDistanceFrom(start);
+}
+
+void
+ZigbeePayloadRouteReplyCommand::Print(std::ostream& os) const
+{
+    os << "| Command name = ROUTE_REP"
+       << "| Route request identifier = " << static_cast<uint32_t>(m_routeReqId)
+       << "| m_cmdOptOrigIeeeAddr = " << static_cast<uint32_t>(m_cmdOptOrigIeeeAddr)
+       << "| Originator address = " << m_origAddr << "| Responder address = " << m_respAddr
+       << "| Path cost = " << static_cast<uint32_t>(m_pathCost);
+    if (m_cmdOptOrigIeeeAddr)
+    {
+        os << "| Originator IEEE address = " << m_origIeeeAddr;
+    }
+
+    if (m_cmdOptRespIeeeAddr)
+    {
+        os << "| Responder IEEE address = " << m_respIeeeAddr;
+    }
+
+    os << "\n";
+}
+
+void
+ZigbeePayloadRouteReplyCommand::SetRouteReqId(uint8_t id)
+{
+    m_routeReqId = id;
+}
+
+uint8_t
+ZigbeePayloadRouteReplyCommand::GetRouteReqId() const
+{
+    return (m_routeReqId);
+}
+
+void
+ZigbeePayloadRouteReplyCommand::SetOrigAddr(Mac16Address addr)
+{
+    m_origAddr = addr;
+}
+
+Mac16Address
+ZigbeePayloadRouteReplyCommand::GetOrigAddr() const
+{
+    return (m_origAddr);
+}
+
+void
+ZigbeePayloadRouteReplyCommand::SetRespAddr(Mac16Address addr)
+{
+    m_respAddr = addr;
+}
+
+Mac16Address
+ZigbeePayloadRouteReplyCommand::GetRespAddr() const
+{
+    return (m_respAddr);
+}
+
+void
+ZigbeePayloadRouteReplyCommand::SetPathCost(uint8_t cost)
+{
+    m_pathCost = cost;
+}
+
+uint8_t
+ZigbeePayloadRouteReplyCommand::GetPathCost() const
+{
+    return (m_pathCost);
+}
+
+void
+ZigbeePayloadRouteReplyCommand::SetOrigIeeeAddr(Mac64Address orig)
+{
+    m_cmdOptOrigIeeeAddr = true;
+    m_origIeeeAddr = orig;
+}
+
+Mac64Address
+ZigbeePayloadRouteReplyCommand::GetOrigIeeeAddr() const
+{
+    return (m_origIeeeAddr);
+}
+
+void
+ZigbeePayloadRouteReplyCommand::SetRespIeeeAddr(Mac64Address resp)
+{
+    m_cmdOptRespIeeeAddr = true;
+    m_respIeeeAddr = resp;
+}
+
+Mac64Address
+ZigbeePayloadRouteReplyCommand::GetRespIeeeAddr() const
+{
+    return (m_respIeeeAddr);
+}
+
+/***********************************************************
+ *                Beacon Payload
+ ***********************************************************/
+
+ZigbeeBeaconPayload::ZigbeeBeaconPayload()
+{
+    m_protocolId = 0x00;
+    m_stackProfile = 0x00;
+    m_protocolVer = 0x00;
+    m_routerCapacity = false;
+    m_deviceDepth = 0x00;
+    m_endDevCapacity = false;
+    m_extPanId = 0x00;
+    m_txOffset = 0x00;
+    m_nwkUpdateId = 0x00;
+}
+
+TypeId
+ZigbeeBeaconPayload::GetTypeId()
+{
+    static TypeId tid = TypeId("ns3::zigbee::ZigbeeBeaconPayload")
+                            .SetParent<Header>()
+                            .SetGroupName("Zigbee")
+                            .AddConstructor<ZigbeeBeaconPayload>();
+    return tid;
+}
+
+TypeId
+ZigbeeBeaconPayload::GetInstanceTypeId() const
+{
+    return GetTypeId();
+}
+
+uint32_t
+ZigbeeBeaconPayload::GetSerializedSize() const
+{
+    return 16;
+}
+
+void
+ZigbeeBeaconPayload::Serialize(Buffer::Iterator start) const
+{
+    Buffer::Iterator i = start;
+    uint16_t dataBundle1 = 0;
+    uint32_t dataBundle2 = 0;
+
+    dataBundle1 = m_stackProfile & (0x0F);                  // Bit 0-3
+    dataBundle1 |= (m_protocolVer << 4) & (0x0F << 4);      // Bit 4-7
+    dataBundle1 |= (m_routerCapacity << 10) & (0x01 << 10); // Bit 10
+    dataBundle1 |= (m_deviceDepth << 11) & (0x0F << 11);    // Bit 11-14
+    dataBundle1 |= (m_endDevCapacity << 15) & (0x01 << 15); // Bit 15
+
+    dataBundle2 = m_txOffset & (0xFFFFFF);               // Bit 0-23
+    dataBundle2 |= (m_nwkUpdateId << 24) & (0xFF << 24); // Bit 24-31
+
+    i.WriteU8(m_protocolId);
+    i.WriteHtolsbU16(dataBundle1);
+    i.WriteU64(m_extPanId);
+    i.WriteHtolsbU32(dataBundle2);
+}
+
+uint32_t
+ZigbeeBeaconPayload::Deserialize(Buffer::Iterator start)
+{
+    Buffer::Iterator i = start;
+    uint16_t dataBundle1 = 0;
+    uint32_t dataBundle2 = 0;
+
+    m_protocolId = i.ReadU8();
+    dataBundle1 = i.ReadLsbtohU16();
+    m_extPanId = i.ReadU64();
+    dataBundle2 = i.ReadLsbtohU32();
+
+    m_stackProfile = (dataBundle1) & (0x0F);         // Bit 0-3
+    m_protocolVer = (dataBundle1 >> 4) & (0x0F);     // Bit 4-7
+    m_routerCapacity = (dataBundle1 >> 10) & (0x01); // Bit 10
+    m_deviceDepth = (dataBundle1 >> 11) & (0x0F);    // Bit 11-14
+    m_endDevCapacity = (dataBundle1 >> 15) & (0x01); // Bit 15
+
+    m_txOffset = (dataBundle2) & (0xFFFFFF);      // Bit 0-23
+    m_nwkUpdateId = (dataBundle2 >> 24) & (0xFF); // Bit 24-31
+
+    return i.GetDistanceFrom(start);
+}
+
+void
+ZigbeeBeaconPayload::Print(std::ostream& os) const
+{
+    os << "\n";
+    os << " | Protocol Id = " << static_cast<uint32_t>(m_protocolId)
+       << " | Stack Profile = " << static_cast<uint32_t>(m_stackProfile)
+       << " | Nwk Protocol Version = " << static_cast<uint32_t>(m_protocolVer)
+       << " | Router Capacity = " << static_cast<uint32_t>(m_routerCapacity)
+       << " | Device Depth = " << static_cast<uint32_t>(m_deviceDepth)
+       << " | End Device Capacity = " << static_cast<uint32_t>(m_endDevCapacity)
+       << " | nwk Pan Id = " << static_cast<uint32_t>(m_extPanId)
+       << " | TxOffset = " << static_cast<uint32_t>(m_txOffset)
+       << " | Nwk Update Id = " << static_cast<uint32_t>(m_nwkUpdateId);
+
+    os << "\n";
+}
+
+void
+ZigbeeBeaconPayload::SetStackProfile(uint8_t stackProfile)
+{
+    m_stackProfile = stackProfile;
+}
+
+uint8_t
+ZigbeeBeaconPayload::GetProtocolId() const
+{
+    return m_protocolId;
+}
+
+uint8_t
+ZigbeeBeaconPayload::GetStackProfile() const
+{
+    return m_stackProfile;
+}
+
+void
+ZigbeeBeaconPayload::SetRouterCapacity(bool routerCapacity)
+{
+    m_routerCapacity = routerCapacity;
+}
+
+bool
+ZigbeeBeaconPayload::GetRouterCapacity() const
+{
+    return m_routerCapacity;
+}
+
+void
+ZigbeeBeaconPayload::SetDeviceDepth(uint8_t deviceDepth)
+{
+    m_deviceDepth = deviceDepth;
+}
+
+uint8_t
+ZigbeeBeaconPayload::GetDeviceDepth() const
+{
+    return m_deviceDepth;
+}
+
+void
+ZigbeeBeaconPayload::SetEndDevCapacity(bool endDevCapacity)
+{
+    m_endDevCapacity = endDevCapacity;
+}
+
+bool
+ZigbeeBeaconPayload::GetEndDevCapacity() const
+{
+    return m_endDevCapacity;
+}
+
+void
+ZigbeeBeaconPayload::SetExtPanId(uint64_t extPanId)
+{
+    m_extPanId = extPanId;
+}
+
+uint64_t
+ZigbeeBeaconPayload::GetExtPanId() const
+{
+    return m_extPanId;
+}
+
+void
+ZigbeeBeaconPayload::SetTxOffset(uint32_t txOffset)
+{
+    m_txOffset = txOffset;
+}
+
+uint32_t
+ZigbeeBeaconPayload::GetTxOffset() const
+{
+    return m_txOffset;
+}
+
+void
+ZigbeeBeaconPayload::SetNwkUpdateId(uint8_t nwkUpdateId)
+{
+    m_nwkUpdateId = nwkUpdateId;
+}
+
+uint8_t
+ZigbeeBeaconPayload::GetNwkUpdateId() const
+{
+    return m_nwkUpdateId;
+}
+
+} // namespace zigbee
+} // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/zigbee/model/zigbee-nwk-payload-header.h ns-3.44/src/zigbee/model/zigbee-nwk-payload-header.h
--- ns-3.43/src/zigbee/model/zigbee-nwk-payload-header.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/zigbee/model/zigbee-nwk-payload-header.h	2025-03-09 16:55:49.819372700 -0700
@@ -0,0 +1,471 @@
+/*
+ * Copyright (c) 2024 Tokushima University, Tokushima, Japan.
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ *  Authors: Ryo Okuda <c611901200@tokushima-u.ac.jp>
+ *           Alberto Gallegos Ramonet <alramonet@is.tokushima-u.ac.jp>
+ */
+
+#ifndef ZIGBEE_PAYLOAD_HEADERS_H
+#define ZIGBEE_PAYLOAD_HEADERS_H
+
+#include "ns3/header.h"
+#include "ns3/mac16-address.h"
+#include "ns3/mac64-address.h"
+
+namespace ns3
+{
+namespace zigbee
+{
+
+/**
+ * Zigbee Specification, Payload command types
+ */
+enum NwkCommandType
+{
+    ROUTE_REQ_CMD = 0x01,        //!< Route request command
+    ROUTE_REP_CMD = 0x02,        //!< Route response command
+    NWK_STATUS_CMD = 0X03,       //!< Network status command
+    LEAVE_CMD = 0x04,            //!< Leave network command
+    ROUTE_RECORD_CMD = 0x05,     //!< Route record command
+    REJOIN_REQ_CMD = 0x06,       //!< Rejoin request command
+    REJOIN_RESP_CMD = 0x07,      //!< Rejoin response command
+    LINK_STATUS_CMD = 0x08,      //!< Link status command
+    NWK_REPORT_CMD = 0x09,       //!< Network report command
+    NWK_UPDATE_CMD = 0x0a,       //!< Network update command
+    TIMEOUT_REQ_CMD = 0x0b,      //!< Time out request command
+    TIMEOUT_RESP_CMD = 0x0c,     //!< Time out response command
+    LINK_POWER_DELTA_CMD = 0x0d, //!< Link power delta command
+};
+
+/**
+ * Zigbee Specification 3.4.1.3.1 , Table 3-50
+ * Values of the many to one command option field.
+ */
+enum ManyToOne
+{
+    NO_MANY_TO_ONE = 0,
+    ROUTE_RECORD = 1,
+    NO_ROUTE_RECORD = 2
+};
+
+/**
+ * @ingroup zigbee
+ * Represent the static portion of the zigbee payload header that describes
+ * the payload command type.
+ */
+class ZigbeePayloadType : public Header
+{
+  public:
+    ZigbeePayloadType();
+    /**
+     * Constructor
+     * @param nwkCmd the command type of this command header
+     */
+    ZigbeePayloadType(enum NwkCommandType nwkCmd);
+    /**
+     * @brief Get the type ID.
+     * @return the object TypeId
+     */
+    static TypeId GetTypeId();
+    TypeId GetInstanceTypeId() const override;
+    uint32_t GetSerializedSize() const override;
+    void Serialize(Buffer::Iterator start) const override;
+    uint32_t Deserialize(Buffer::Iterator start) override;
+    void Print(std::ostream& os) const override;
+
+    /**
+     * Set the command frame type
+     * @param nwkCmd the command frame type
+     */
+    void SetCmdType(enum NwkCommandType nwkCmd);
+    /**
+     * Get the command frame type
+     * @return The command type from the command payload header
+     */
+    NwkCommandType GetCmdType() const;
+
+  private:
+    NwkCommandType m_nwkCmdType; //!< The network command Type
+};
+
+/**
+ * @ingroup zigbee
+ * Represent a variable portion of the zigbee payload header that includes
+ * the route request command
+ */
+class ZigbeePayloadRouteRequestCommand : public Header
+{
+  public:
+    ZigbeePayloadRouteRequestCommand();
+    /**
+     * @brief Get the type ID.
+     * @return the object TypeId
+     */
+    static TypeId GetTypeId();
+    TypeId GetInstanceTypeId() const override;
+    uint32_t GetSerializedSize() const override;
+    void Serialize(Buffer::Iterator start) const override;
+    uint32_t Deserialize(Buffer::Iterator start) override;
+    void Print(std::ostream& os) const override;
+
+    /**
+     * Set the command option field Many To One
+     *
+     * @param manyToOne  The Many To One field ()
+     */
+    void SetCmdOptManyToOneField(enum ManyToOne manyToOne);
+
+    /**
+     * Get the command option field Many To One
+     *
+     * @return The command option field
+     */
+    uint8_t GetCmdOptManyToOneField() const;
+
+    /**
+     * Set the Route request identifier
+     * @param id the route request identifier
+     */
+    void SetRouteReqId(uint8_t id);
+
+    /**
+     * Get the Route request identifier
+     * @return the route request identifier
+     */
+    uint8_t GetRouteReqId() const;
+
+    /**
+     * Set Destination address
+     * @param addr The destination address (16 bit)
+     */
+    void SetDstAddr(Mac16Address addr);
+
+    /**
+     * Get the Destination address
+     * @return the Destination address (16bits)
+     */
+    Mac16Address GetDstAddr() const;
+
+    /**
+     * Set the path cost
+     * @param cost the path cost
+     */
+    void SetPathCost(uint8_t cost);
+
+    /**
+     * Set the path cost
+     * @return the path cost
+     */
+    uint8_t GetPathCost() const;
+
+    /**
+     * Describe whether or not the destination IEEE Address field is present in the Route Request
+     *
+     * @return True if the command option destination IEEE Address field is active
+     */
+    bool IsDstIeeeAddressPresent() const;
+
+    /**
+     *  Set the destination IEEE address
+     *  @param dst The destination IEEE address (64 bits)
+     */
+    void SetDstIeeeAddr(Mac64Address dst);
+
+    /**
+     * Get the destination IEEE address
+     * @return The destination IEEE address (64bits)
+     */
+    Mac64Address GetDstIeeeAddr() const;
+
+  private:
+    /**
+     * Set the complete command option field of the route request command.
+     * @param cmdOptionField The 8 bits representing the complete command option field.
+     */
+    void SetCmdOptionField(uint8_t cmdOptionField);
+
+    /**
+     * Get the 8bits representing the complete command option field of the route request command.
+     * @return The command option field (8 bits)
+     */
+    uint8_t GetCmdOptionField() const;
+
+    /* Command options field (1 Octet) */
+    ManyToOne m_cmdOptManyToOne; //!< Many to One Subfield (Bits 3-4)
+    bool m_cmdOptDstIeeeAddr;    //!< Destination IEEE Address Flag (Bit 5)
+    bool m_cmdOptMcst;           //!< Multicast Flag (Bit 6)
+                                 // Bits 0-2,7 reserved
+
+    /* Route Request command fields */
+    uint8_t m_routeReqId;       //!< Route request identifier (1 Octet)
+    Mac16Address m_dstAddr;     //!< Destination address (2 Octets)
+    uint8_t m_pathCost;         //!< Path Cost (1 Octet)
+    Mac64Address m_dstIeeeAddr; //!< Destination IEEE address (0-8 Octets)
+};
+
+/**
+ * @ingroup zigbee
+ * Represent a variable portion of the zigbee payload header that includes
+ * the route reply command
+ */
+class ZigbeePayloadRouteReplyCommand : public Header
+{
+  public:
+    ZigbeePayloadRouteReplyCommand();
+
+    /**
+     * @brief Get the type ID.
+     * @return the object TypeId
+     */
+    static TypeId GetTypeId();
+    TypeId GetInstanceTypeId() const override;
+    uint32_t GetSerializedSize() const override;
+    void Serialize(Buffer::Iterator start) const override;
+    uint32_t Deserialize(Buffer::Iterator start) override;
+    void Print(std::ostream& os) const override;
+
+    /**
+     * Set the command option
+     * @param option the command option
+     */
+    void SetCmdOption(uint8_t option);
+    /**
+     * Get the command option
+     * @return the command option
+     */
+    uint8_t GetCmdOption() const;
+    /**
+     * Set the Route request identifier
+     * @param rid the route request identifier
+     */
+    void SetRouteReqId(uint8_t rid);
+    /**
+     * Get the Route request identifier
+     * @return the Radius
+     */
+    uint8_t GetRouteReqId() const;
+    /**
+     * Set Originator address
+     * @param addr The originator address (16 bit)
+     */
+    void SetOrigAddr(Mac16Address addr);
+    /**
+     * Get the Originator address
+     * @return the originator address (16bits)
+     */
+    Mac16Address GetOrigAddr() const;
+    /**
+     * Set Responder address
+     * @param addr the responder address (16 bit)
+     */
+    void SetRespAddr(Mac16Address addr);
+    /**
+     * Get the Responder address
+     * @return the responder address (16bits)
+     */
+    Mac16Address GetRespAddr() const;
+    /**
+     * Set the path cost
+     * @param cost the path cost
+     */
+    void SetPathCost(uint8_t cost);
+    /**
+     * Get the path cost
+     * @return the path cost
+     */
+    uint8_t GetPathCost() const;
+    /**
+     *  Set the Originator IEEE address
+     *  @param orig The originator IEEE address (64 bits)
+     */
+    void SetOrigIeeeAddr(Mac64Address orig);
+    /**
+     * Get the Originator IEEE address
+     * @return The originator IEEE address (64bits)
+     */
+    Mac64Address GetOrigIeeeAddr() const;
+    /**
+     *  Set the Responder IEEE address
+     *  @param resp The responder IEEE address (64 bits)
+     */
+    void SetRespIeeeAddr(Mac64Address resp);
+    /**
+     * Get the Responder IEEE address
+     * @return The responder IEEE address (64bits)
+     */
+    Mac64Address GetRespIeeeAddr() const;
+
+  private:
+    /* Command options field (1 Octet) */
+    bool m_cmdOptOrigIeeeAddr; //!< Originator IEEE address flag (Bit 4)
+    bool m_cmdOptRespIeeeAddr; //!< Responder IEEE address flag (Bit 5)
+    bool m_cmdOptMcst;         //!< Multicast flag (Bit 6)
+                               // Bits 0-3,7 reserved
+
+    /* Route Reply command fields */
+    uint8_t m_routeReqId;        //!< Route request identifier (1 Octet)
+    Mac16Address m_origAddr;     //!< Originator address (2 Octets)
+    Mac16Address m_respAddr;     //!< Responder address (2 Octets)
+    uint8_t m_pathCost;          //!< Path cost (1 Octet)
+    Mac64Address m_origIeeeAddr; //!< Originator IEEE address (0-8 Octets)
+    Mac64Address m_respIeeeAddr; //!< Responder IEEE address (0-8 Octets)
+};
+
+/**
+ * @ingroup zigbee
+ * Represents the payload portion of a beacon frame.
+ * See Zigbee specification r22.1.0, Table 3-71 (NWK layer Information fields)
+ */
+class ZigbeeBeaconPayload : public Header
+{
+  public:
+    ZigbeeBeaconPayload();
+
+    /**
+     * @brief Get the type ID.
+     * @return the object TypeId
+     */
+    static TypeId GetTypeId();
+    TypeId GetInstanceTypeId() const override;
+    uint32_t GetSerializedSize() const override;
+    void Serialize(Buffer::Iterator start) const override;
+    uint32_t Deserialize(Buffer::Iterator start) override;
+    void Print(std::ostream& os) const override;
+
+    /**
+     * Set the network profile identifier.
+     *
+     * @param stackProfile the stack Profile in use
+     */
+    void SetStackProfile(uint8_t stackProfile);
+
+    /**
+     * Get the Protocol Id used.
+     * In this standard this value is always 0.
+     *
+     * @return The protocol id used in this standard.
+     */
+    uint8_t GetProtocolId() const;
+
+    /**
+     * Get the Stack Profile used.
+     *
+     * @return The stack profile identifier used.
+     */
+    uint8_t GetStackProfile() const;
+
+    /**
+     * Set the Router Capacity capability
+     * True = The device is able to accept join.request
+     * from router-capable devices
+     *
+     * @param routerCapacity The router capacity capability
+     */
+    void SetRouterCapacity(bool routerCapacity);
+
+    /**
+     * Get the router capacity capability.
+     *
+     * @return Whether or not is capable of accepting join request
+     *         from router-capable devices.
+     */
+    bool GetRouterCapacity() const;
+
+    /**
+     * Set the cevice depth object
+     *
+     * @param deviceDepth The current device depth.
+     */
+    void SetDeviceDepth(uint8_t deviceDepth);
+
+    /**
+     * Get the device depth.
+     *
+     * @return The device depth
+     */
+    uint8_t GetDeviceDepth() const;
+
+    /**
+     * Set the end device Capacity
+     *
+     * @param endDevCapacity  The end device capacity
+     */
+    void SetEndDevCapacity(bool endDevCapacity);
+
+    /**
+     * Get the end dev capacity
+     *
+     * @return Whether or not the device is capable of accepting
+     *         join requests from end devices.
+     */
+    bool GetEndDevCapacity() const;
+
+    /**
+     * Set the extended PAN id. This should be the value of the
+     * zigbee coordinator EUI-64 address (IEEE address).
+     *
+     * @param extPanId The extended PAN id
+     */
+    void SetExtPanId(uint64_t extPanId);
+
+    /**
+     * Get the extended PAN identifier
+     *
+     * @return The extended PAN identifier
+     */
+    uint64_t GetExtPanId() const;
+
+    /**
+     * Set the Tx Offset time in symbols
+     *
+     * @param txOffset The Tx offset time in symbols
+     */
+    void SetTxOffset(uint32_t txOffset);
+
+    /**
+     * Get the Tx Offset time in symbols
+     *
+     * @return uint32_t The Tx offset time in symbols
+     */
+    uint32_t GetTxOffset() const;
+
+    /**
+     * Set the value of the nwkUpdateId to this beacon payload
+     *
+     * @param nwkUpdateId The nwkUpdateId to set to the beacon payload.
+     */
+    void SetNwkUpdateId(uint8_t nwkUpdateId);
+
+    /**
+     * Get the value of the nwkUpdateId set to this beacon payload
+     *
+     * @return The value of the nwkUpdateId in the beacon payload.
+     */
+    uint8_t GetNwkUpdateId() const;
+
+  private:
+    uint8_t m_protocolId{0}; //!< Identifies the network layer in use, in this specification this
+                             //!< value is always 0.
+    uint8_t m_stackProfile;  //!< The zigbee stack profile identifier.
+    uint8_t m_protocolVer;   //!< The version of the zigbee protocol.
+    bool m_routerCapacity{false}; //!< True if this device is capable of accepting
+                                  //!< join requests from router capable devices.
+                                  //!< This value should match the value of RoutersAllowed for the
+                                  //!< MAC interface this beacon is being sent from.
+    uint8_t m_deviceDepth;        //!< The network depth of this device.
+                                  //!< 0x00 indicates this device is the ZC.
+    bool m_endDevCapacity{false}; //!< True if the device is capable of accepting join request from
+                                  //!< end devices seeking to join the network.
+    uint64_t m_extPanId; //!< The globally unique id for the PAN. By default this is the EUI-64 bit
+                         //!< (IEEE address) of the Zigbee coordinator that formed the network.
+    uint32_t m_txOffset; //!< This indicates the difference in time, measured in symbols, between
+                         //!< the beacon transmission time of its parent
+    uint8_t m_nwkUpdateId; //!< The value of nwkUpdateId from the NIB.
+};
+
+} // namespace zigbee
+} // namespace ns3
+
+#endif /* ZIGBEE_PAYLOAD_HEADER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/zigbee/model/zigbee-nwk-tables.cc ns-3.44/src/zigbee/model/zigbee-nwk-tables.cc
--- ns-3.43/src/zigbee/model/zigbee-nwk-tables.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/zigbee/model/zigbee-nwk-tables.cc	2025-03-09 16:55:49.819372700 -0700
@@ -0,0 +1,1450 @@
+/*
+ * Copyright (c) 2023 Tokushima University, Japan
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Authors:
+ *  Ryo Okuda <c611901200@tokushima-u.ac.jp>
+ *  Alberto Gallegos Ramonet <alramonet@is.tokushima-u.ac.jp>
+ */
+
+#include "zigbee-nwk-tables.h"
+
+#include "ns3/log.h"
+#include "ns3/pointer.h"
+#include "ns3/simulator.h"
+
+#include <algorithm>
+#include <iomanip>
+
+namespace ns3
+{
+namespace zigbee
+{
+
+NS_LOG_COMPONENT_DEFINE("ZigbeeNwkTables");
+
+/***********************************************************
+ *                RREQ Retry Table Entry
+ ***********************************************************/
+
+RreqRetryTableEntry::RreqRetryTableEntry(uint8_t rreqId,
+                                         EventId rreqRetryEvent,
+                                         uint8_t rreqRetryCount)
+{
+    m_rreqId = rreqId;
+    m_rreqRetryEventId = rreqRetryEvent;
+    m_rreqRetryCount = rreqRetryCount;
+}
+
+uint8_t
+RreqRetryTableEntry::GetRreqId() const
+{
+    return m_rreqId;
+}
+
+void
+RreqRetryTableEntry::SetRreqRetryCount(uint8_t rreqRetryCount)
+{
+    m_rreqRetryCount = rreqRetryCount;
+}
+
+uint8_t
+RreqRetryTableEntry::GetRreqRetryCount() const
+{
+    return m_rreqRetryCount;
+}
+
+void
+RreqRetryTableEntry::SetRreqEventId(EventId eventId)
+{
+    m_rreqRetryEventId = eventId;
+}
+
+EventId
+RreqRetryTableEntry::GetRreqEventId()
+{
+    return m_rreqRetryEventId;
+}
+
+void
+RreqRetryTableEntry::Print(Ptr<OutputStreamWrapper> stream) const
+{
+    std::ostream* os = stream->GetStream();
+    std::ios oldState(nullptr);
+    oldState.copyfmt(*os);
+
+    *os << std::resetiosflags(std::ios::adjustfield) << std::setiosflags(std::ios::left);
+    *os << std::setw(9) << static_cast<uint32_t>(m_rreqId);
+    *os << std::setw(12) << static_cast<uint32_t>(m_rreqRetryCount);
+    *os << std::setw(9) << (m_rreqRetryEventId.IsPending() ? "TRUE" : "FALSE");
+    *os << std::endl;
+    (*os).copyfmt(oldState);
+}
+
+/***********************************************************
+ *                RREQ Retry Table
+ ***********************************************************/
+bool
+RreqRetryTable::AddEntry(Ptr<RreqRetryTableEntry> entry)
+{
+    m_rreqRetryTable.emplace_back(entry);
+    return true;
+}
+
+bool
+RreqRetryTable::LookUpEntry(uint8_t rreqId, Ptr<RreqRetryTableEntry>& entryFound)
+{
+    NS_LOG_FUNCTION(this << rreqId);
+
+    for (const auto& entry : m_rreqRetryTable)
+    {
+        if (entry->GetRreqId() == rreqId)
+        {
+            entryFound = entry;
+            return true;
+        }
+    }
+    return false;
+}
+
+void
+RreqRetryTable::Delete(uint8_t rreqId)
+{
+    std::erase_if(m_rreqRetryTable, [&rreqId](Ptr<RreqRetryTableEntry> entry) {
+        return entry->GetRreqId() == rreqId;
+    });
+}
+
+void
+RreqRetryTable::Dispose()
+{
+    for (auto element : m_rreqRetryTable)
+    {
+        element = nullptr;
+    }
+    m_rreqRetryTable.clear();
+}
+
+void
+RreqRetryTable::Print(Ptr<OutputStreamWrapper> stream) const
+{
+    std::ostream* os = stream->GetStream();
+    std::ios oldState(nullptr);
+    oldState.copyfmt(*os);
+
+    *os << std::resetiosflags(std::ios::adjustfield) << std::setiosflags(std::ios::left);
+    *os << "ZigBee RREQ retry table\n";
+    *os << std::setw(9) << "RREQ ID";
+    *os << std::setw(12) << "RREQ Count";
+    *os << std::setw(9) << "Pending" << std::endl;
+
+    for (const auto& entry : m_rreqRetryTable)
+    {
+        entry->Print(stream);
+    }
+    *stream->GetStream() << std::endl;
+}
+
+/***********************************************************
+ *                Routing Table Entry
+ ***********************************************************/
+
+RoutingTableEntry::RoutingTableEntry(Mac16Address dst,
+                                     RouteStatus status,
+                                     bool noRouteCache,
+                                     bool manyToOne,
+                                     bool routeRecordReq,
+                                     bool groupID,
+                                     Mac16Address nextHopAddr)
+{
+    m_destination = dst;
+    m_nextHopAddr = nextHopAddr;
+    m_status = status;
+    m_noRouteCache = noRouteCache;
+    m_manyToOne = manyToOne;
+    m_routeRecordReq = routeRecordReq;
+    m_groupId = groupID;
+}
+
+RoutingTableEntry::RoutingTableEntry()
+{
+}
+
+RoutingTableEntry::~RoutingTableEntry()
+{
+}
+
+void
+RoutingTableEntry::SetDestination(Mac16Address dst)
+{
+    m_destination = dst;
+}
+
+Mac16Address
+RoutingTableEntry::GetDestination() const
+{
+    return m_destination;
+}
+
+void
+RoutingTableEntry::SetStatus(RouteStatus status)
+{
+    m_status = status;
+}
+
+RouteStatus
+RoutingTableEntry::GetStatus() const
+{
+    return m_status;
+}
+
+bool
+RoutingTableEntry::IsNoRouteCache() const
+{
+    return m_noRouteCache;
+}
+
+bool
+RoutingTableEntry::IsManyToOne() const
+{
+    return m_manyToOne;
+}
+
+bool
+RoutingTableEntry::IsRouteRecordReq() const
+{
+    return m_routeRecordReq;
+}
+
+bool
+RoutingTableEntry::IsGroupIdPresent() const
+{
+    return m_groupId;
+}
+
+void
+RoutingTableEntry::SetNextHopAddr(Mac16Address nextHopAddr)
+{
+    m_nextHopAddr = nextHopAddr;
+}
+
+Mac16Address
+RoutingTableEntry::GetNextHopAddr() const
+{
+    return m_nextHopAddr;
+}
+
+void
+RoutingTableEntry::SetLifeTime(Time lt)
+{
+    m_lifeTime = lt + Simulator::Now();
+}
+
+Time
+RoutingTableEntry::GetLifeTime() const
+{
+    return m_lifeTime - Simulator::Now();
+}
+
+void
+RoutingTableEntry::Print(Ptr<OutputStreamWrapper> stream) const
+{
+    std::ostream* os = stream->GetStream();
+    std::ios oldState(nullptr);
+    oldState.copyfmt(*os);
+
+    std::ostringstream dst;
+    std::ostringstream nextHop;
+
+    dst << m_destination;
+    nextHop << m_nextHopAddr;
+
+    *os << std::resetiosflags(std::ios::adjustfield) << std::setiosflags(std::ios::left);
+    *os << std::setw(16) << dst.str();
+    *os << std::setw(10) << nextHop.str();
+
+    switch (m_status)
+    {
+    case ROUTE_ACTIVE:
+        *os << std::setw(21) << "ACTIVE";
+        break;
+    case ROUTE_DISCOVERY_UNDERWAY:
+        *os << std::setw(21) << "DISCOVERY_UNDERWAY";
+        break;
+    case ROUTE_DISCOVER_FAILED:
+        *os << std::setw(21) << "DISCOVERY_FAILED";
+        break;
+    case ROUTE_INACTIVE:
+        *os << std::setw(21) << "INACTIVE";
+        break;
+    case ROUTE_VALIDATION_UNDERWAY:
+        *os << std::setw(21) << "VALIDATION_UNDERWAY";
+        break;
+    }
+
+    *os << std::setw(16) << (m_noRouteCache ? "TRUE" : "FALSE");
+    *os << std::setw(16) << (m_manyToOne ? "TRUE" : "FALSE");
+    *os << std::setw(16) << (m_routeRecordReq ? "TRUE" : "FALSE");
+    *os << std::setw(16) << (m_groupId ? "TRUE" : "FALSE");
+    *os << std::endl;
+    (*os).copyfmt(oldState);
+}
+
+/***********************************************************
+ *                Routing Table
+ ***********************************************************/
+
+RoutingTable::RoutingTable()
+{
+    m_maxTableSize = 32;
+}
+
+bool
+RoutingTable::AddEntry(Ptr<RoutingTableEntry> rt)
+{
+    if (m_routingTable.size() < m_maxTableSize)
+    {
+        m_routingTable.emplace_back(rt);
+        return true;
+    }
+    else
+    {
+        return false;
+    }
+}
+
+void
+RoutingTable::Purge()
+{
+    std::erase_if(m_routingTable, [](Ptr<RoutingTableEntry> entry) {
+        return Simulator::Now() >= entry->GetLifeTime();
+    });
+}
+
+void
+RoutingTable::IdentifyExpiredEntries()
+{
+    for (const auto& entry : m_routingTable)
+    {
+        if (Simulator::Now() >= entry->GetLifeTime())
+        {
+            entry->SetStatus(ROUTE_INACTIVE);
+        }
+    }
+}
+
+void
+RoutingTable::Delete(Mac16Address dst)
+{
+    std::erase_if(m_routingTable,
+                  [&dst](Ptr<RoutingTableEntry> entry) { return entry->GetDestination() == dst; });
+}
+
+void
+RoutingTable::DeleteExpiredEntry()
+{
+    auto it = std::find_if(
+        m_routingTable.begin(),
+        m_routingTable.end(),
+        [](Ptr<RoutingTableEntry> entry) { return entry->GetStatus() == ROUTE_INACTIVE; });
+
+    if (it != m_routingTable.end())
+    {
+        m_routingTable.erase(it);
+    }
+}
+
+bool
+RoutingTable::LookUpEntry(Mac16Address dstAddr, Ptr<RoutingTableEntry>& entryFound)
+{
+    NS_LOG_FUNCTION(this << dstAddr);
+
+    IdentifyExpiredEntries();
+
+    for (const auto& entry : m_routingTable)
+    {
+        if (entry->GetDestination() == dstAddr)
+        {
+            entryFound = entry;
+            return true;
+        }
+    }
+    return false;
+}
+
+void
+RoutingTable::Print(Ptr<OutputStreamWrapper> stream) const
+{
+    std::ostream* os = stream->GetStream();
+    std::ios oldState(nullptr);
+    oldState.copyfmt(*os);
+
+    *os << std::resetiosflags(std::ios::adjustfield) << std::setiosflags(std::ios::left);
+    *os << "ZigBee Routing table\n";
+    *os << std::setw(16) << "Destination";
+    *os << std::setw(10) << "Next hop";
+    *os << std::setw(21) << "Status";
+    *os << std::setw(16) << "No route cache";
+    *os << std::setw(16) << "Many-to-one";
+    *os << std::setw(16) << "Route record";
+    *os << std::setw(16) << "Group Id flag" << std::endl;
+
+    for (const auto& entry : m_routingTable)
+    {
+        entry->Print(stream);
+    }
+    *stream->GetStream() << std::endl;
+}
+
+void
+RoutingTable::Dispose()
+{
+    for (auto element : m_routingTable)
+    {
+        element = nullptr;
+    }
+    m_routingTable.clear();
+}
+
+uint32_t
+RoutingTable::GetSize()
+{
+    return m_routingTable.size();
+}
+
+void
+RoutingTable::SetMaxTableSize(uint32_t size)
+{
+    m_maxTableSize = size;
+}
+
+uint32_t
+RoutingTable::GetMaxTableSize() const
+{
+    return m_maxTableSize;
+}
+
+/***********************************************************
+ *                Routing Discovery Table Entry
+ ***********************************************************/
+
+RouteDiscoveryTableEntry::RouteDiscoveryTableEntry(uint8_t rreqId,
+                                                   Mac16Address src,
+                                                   Mac16Address snd,
+                                                   uint8_t forwardCost,
+                                                   uint8_t residualCost,
+                                                   Time expTime)
+{
+    m_routeRequestId = rreqId;
+    m_sourceAddr = src;
+    m_senderAddr = snd;
+    m_forwardCost = forwardCost;
+    m_residualCost = residualCost;
+    m_expirationTime = expTime;
+}
+
+RouteDiscoveryTableEntry::RouteDiscoveryTableEntry()
+{
+}
+
+RouteDiscoveryTableEntry::~RouteDiscoveryTableEntry()
+{
+}
+
+uint8_t
+RouteDiscoveryTableEntry::GetRreqId() const
+{
+    return m_routeRequestId;
+}
+
+Mac16Address
+RouteDiscoveryTableEntry::GetSourceAddr() const
+{
+    return m_sourceAddr;
+}
+
+Mac16Address
+RouteDiscoveryTableEntry::GetSenderAddr() const
+{
+    return m_senderAddr;
+}
+
+uint8_t
+RouteDiscoveryTableEntry::GetForwardCost() const
+{
+    return m_forwardCost;
+}
+
+uint8_t
+RouteDiscoveryTableEntry::GetResidualCost() const
+{
+    return m_residualCost;
+}
+
+void
+RouteDiscoveryTableEntry::SetForwardCost(uint8_t pathCost)
+{
+    m_forwardCost = pathCost;
+}
+
+void
+RouteDiscoveryTableEntry::SetSenderAddr(Mac16Address sender)
+{
+    m_senderAddr = sender;
+}
+
+void
+RouteDiscoveryTableEntry::SetResidualCost(uint8_t pathcost)
+{
+    m_residualCost = pathcost;
+}
+
+Time
+RouteDiscoveryTableEntry::GetExpTime() const
+{
+    return m_expirationTime;
+}
+
+void
+RouteDiscoveryTableEntry::SetExpTime(Time exp)
+{
+    m_expirationTime = exp;
+}
+
+void
+RouteDiscoveryTableEntry::Print(Ptr<OutputStreamWrapper> stream) const
+{
+    std::ostream* os = stream->GetStream();
+    std::ios oldState(nullptr);
+    oldState.copyfmt(*os);
+
+    std::ostringstream sourceAddr;
+    std::ostringstream senderAddr;
+    std::ostringstream expTime;
+
+    sourceAddr << m_sourceAddr;
+    senderAddr << m_senderAddr;
+    expTime << m_expirationTime.As(Time::S);
+
+    *os << std::resetiosflags(std::ios::adjustfield) << std::setiosflags(std::ios::left);
+    *os << std::setw(10) << static_cast<uint32_t>(m_routeRequestId);
+    *os << std::setw(16) << sourceAddr.str();
+    *os << std::setw(16) << senderAddr.str();
+    *os << std::setw(16) << static_cast<uint32_t>(m_forwardCost);
+    *os << std::setw(16) << static_cast<uint32_t>(m_residualCost);
+    *os << std::setw(16) << expTime.str();
+    *os << std::endl;
+
+    (*os).copyfmt(oldState);
+}
+
+/***********************************************************
+ *                Route Discovery Table
+ ***********************************************************/
+
+RouteDiscoveryTable::RouteDiscoveryTable()
+{
+    m_maxTableSize = 32;
+}
+
+bool
+RouteDiscoveryTable::AddEntry(Ptr<RouteDiscoveryTableEntry> rt)
+{
+    Purge();
+
+    if (m_routeDscTable.size() < m_maxTableSize)
+    {
+        m_routeDscTable.emplace_back(rt);
+        return true;
+    }
+    else
+    {
+        return false;
+    }
+}
+
+bool
+RouteDiscoveryTable::LookUpEntry(uint8_t id,
+                                 Mac16Address src,
+                                 Ptr<RouteDiscoveryTableEntry>& entryFound)
+{
+    NS_LOG_FUNCTION(this << id);
+    Purge();
+    for (const auto& entry : m_routeDscTable)
+    {
+        if (entry->GetRreqId() == id && entry->GetSourceAddr() == src)
+        {
+            entryFound = entry;
+            return true;
+        }
+    }
+    return false;
+}
+
+void
+RouteDiscoveryTable::Purge()
+{
+    std::erase_if(m_routeDscTable, [](Ptr<RouteDiscoveryTableEntry> entry) {
+        return entry->GetExpTime() < Simulator::Now();
+    });
+}
+
+void
+RouteDiscoveryTable::Delete(uint8_t id, Mac16Address src)
+{
+    std::erase_if(m_routeDscTable, [&id, &src](Ptr<RouteDiscoveryTableEntry> entry) {
+        return (entry->GetRreqId() == id && entry->GetSourceAddr() == src);
+    });
+}
+
+void
+RouteDiscoveryTable::Print(Ptr<OutputStreamWrapper> stream)
+{
+    Purge();
+
+    std::ostream* os = stream->GetStream();
+    std::ios oldState(nullptr);
+    oldState.copyfmt(*os);
+
+    *os << std::resetiosflags(std::ios::adjustfield) << std::setiosflags(std::ios::left);
+    *os << "ZigBee Route Discovery table\n";
+    *os << std::setw(10) << "RREQ ID";
+    *os << std::setw(16) << "Source Address";
+    *os << std::setw(16) << "Sender Address";
+    *os << std::setw(16) << "Forward Cost";
+    *os << std::setw(16) << "Residual Cost";
+    *os << "Expiration time" << std::endl;
+
+    for (const auto& entry : m_routeDscTable)
+    {
+        entry->Print(stream);
+    }
+    *stream->GetStream() << std::endl;
+}
+
+void
+RouteDiscoveryTable::Dispose()
+{
+    for (auto element : m_routeDscTable)
+    {
+        element = nullptr;
+    }
+    m_routeDscTable.clear();
+}
+
+/***********************************************************
+ *                Neighbor Table Entry
+ ***********************************************************/
+
+NeighborTableEntry::NeighborTableEntry(Mac64Address extAddr,
+                                       Mac16Address nwkAddr,
+                                       NwkDeviceType deviceType,
+                                       bool rxOnWhenIdle,
+                                       uint16_t endDevConfig,
+                                       Time timeoutCounter,
+                                       Time devTimeout,
+                                       Relationship relationship,
+                                       uint8_t txFailure,
+                                       uint8_t lqi,
+                                       uint8_t outgoingCost,
+                                       uint8_t age,
+                                       bool keepaliveRx,
+                                       uint8_t macInterfaceIndex)
+{
+    m_extAddr = extAddr;
+    m_nwkAddr = nwkAddr;
+    m_deviceType = deviceType;
+    m_rxOnWhenIdle = rxOnWhenIdle;
+    m_endDevConfig = endDevConfig;
+    m_timeoutCounter = timeoutCounter;
+    m_devTimeout = devTimeout;
+    m_relationship = relationship;
+    m_txFailure = txFailure;
+    m_lqi = lqi;
+    m_outgoingCost = outgoingCost;
+    m_age = age;
+    m_keepaliveRx = keepaliveRx;
+    m_macInterfaceIndex = macInterfaceIndex;
+}
+
+NeighborTableEntry::NeighborTableEntry()
+{
+}
+
+NeighborTableEntry::~NeighborTableEntry()
+{
+}
+
+Mac64Address
+NeighborTableEntry::GetExtAddr() const
+{
+    return m_extAddr;
+}
+
+Mac16Address
+NeighborTableEntry::GetNwkAddr() const
+{
+    return m_nwkAddr;
+}
+
+NwkDeviceType
+NeighborTableEntry::GetDeviceType() const
+{
+    return m_deviceType;
+}
+
+bool
+NeighborTableEntry::IsRxOnWhenIdle() const
+{
+    return m_rxOnWhenIdle;
+}
+
+uint16_t
+NeighborTableEntry::GetEndDevConfig() const
+{
+    return m_endDevConfig;
+}
+
+Time
+NeighborTableEntry::GetTimeoutCounter() const
+{
+    return m_timeoutCounter;
+}
+
+Time
+NeighborTableEntry::GetDevTimeout() const
+{
+    return m_devTimeout - Simulator::Now();
+}
+
+uint8_t
+NeighborTableEntry::GetRelationship() const
+{
+    return m_relationship;
+}
+
+uint8_t
+NeighborTableEntry::GetTxFailure() const
+{
+    return m_txFailure;
+}
+
+uint8_t
+NeighborTableEntry::GetLqi() const
+{
+    return m_lqi;
+}
+
+uint8_t
+NeighborTableEntry::GetOutgoingCost() const
+{
+    return m_outgoingCost;
+}
+
+uint8_t
+NeighborTableEntry::GetAge() const
+{
+    return m_age;
+}
+
+uint64_t
+NeighborTableEntry::GetIncBeaconTimestamp() const
+{
+    return m_incBeaconTimestamp;
+}
+
+uint64_t
+NeighborTableEntry::GetBeaconTxTimeOffset() const
+{
+    return m_beaconTxTimeOffset;
+}
+
+uint8_t
+NeighborTableEntry::GetMacInterfaceIndex() const
+{
+    return m_macInterfaceIndex;
+}
+
+uint32_t
+NeighborTableEntry::GetMacUcstBytesTx() const
+{
+    return m_macUcstBytesTx;
+}
+
+uint32_t
+NeighborTableEntry::GetMacUcstBytesRx() const
+{
+    return m_macUcstBytesRx;
+}
+
+uint64_t
+NeighborTableEntry::GetExtPanId() const
+{
+    return m_extPanId;
+}
+
+uint8_t
+NeighborTableEntry::GetLogicalCh() const
+{
+    return m_logicalCh;
+}
+
+uint8_t
+NeighborTableEntry::GetDepth() const
+{
+    return m_depth;
+}
+
+uint8_t
+NeighborTableEntry::GetBeaconOrder() const
+{
+    return m_bo;
+}
+
+uint8_t
+NeighborTableEntry::IsPotentialParent() const
+{
+    return m_potentialParent;
+}
+
+void
+NeighborTableEntry::SetNwkAddr(Mac16Address nwkAddr)
+{
+    m_nwkAddr = nwkAddr;
+}
+
+void
+NeighborTableEntry::SetDeviceType(NwkDeviceType devType)
+{
+    m_deviceType = devType;
+}
+
+void
+NeighborTableEntry::SetRxOnWhenIdle(bool onWhenIdle)
+{
+    m_rxOnWhenIdle = onWhenIdle;
+}
+
+void
+NeighborTableEntry::SetEndDevConfig(uint16_t conf)
+{
+    m_endDevConfig = conf;
+}
+
+void
+NeighborTableEntry::SetTimeoutCounter(Time counter)
+{
+    m_timeoutCounter = counter;
+}
+
+void
+NeighborTableEntry::SetDevTimeout(Time timeout)
+{
+    m_devTimeout = timeout;
+}
+
+void
+NeighborTableEntry::SetRelationship(Relationship relationship)
+{
+    m_relationship = relationship;
+}
+
+void
+NeighborTableEntry::SetTxFailure(uint8_t failure)
+{
+    m_txFailure = failure;
+}
+
+void
+NeighborTableEntry::SetLqi(uint8_t lqi)
+{
+    m_lqi = lqi;
+}
+
+void
+NeighborTableEntry::SetOutgoingCost(uint8_t cost)
+{
+    m_outgoingCost = cost;
+}
+
+void
+NeighborTableEntry::SetAge(uint8_t age)
+{
+    m_age = age;
+}
+
+void
+NeighborTableEntry::SetIncBeaconTimestamp(uint64_t timestamp)
+{
+    m_incBeaconTimestamp = timestamp;
+}
+
+void
+NeighborTableEntry::SetBeaconTxTimeOffset(uint64_t offset)
+{
+    m_beaconTxTimeOffset = offset;
+}
+
+void
+NeighborTableEntry::SetMacUcstBytesTx(uint32_t txBytes)
+{
+    m_macUcstBytesTx = txBytes;
+}
+
+void
+NeighborTableEntry::SetMacUcstBytesRx(uint32_t rxBytes)
+{
+    m_macUcstBytesRx = rxBytes;
+}
+
+void
+NeighborTableEntry::SetExtPanId(uint64_t extPanId)
+{
+    m_extPanId = extPanId;
+}
+
+void
+NeighborTableEntry::SetLogicalCh(uint8_t channel)
+{
+    m_logicalCh = channel;
+}
+
+void
+NeighborTableEntry::SetDepth(uint8_t depth)
+{
+    m_depth = depth;
+}
+
+void
+NeighborTableEntry::SetBeaconOrder(uint8_t bo)
+{
+    m_bo = bo;
+}
+
+void
+NeighborTableEntry::SetPotentialParent(bool confirm)
+{
+    m_potentialParent = confirm;
+}
+
+void
+NeighborTableEntry::Print(Ptr<OutputStreamWrapper> stream) const
+{
+    std::ostream* os = stream->GetStream();
+    std::ios oldState(nullptr);
+    oldState.copyfmt(*os);
+
+    std::ostringstream extAddr;
+    std::ostringstream nwkAddr;
+    std::ostringstream devTimeout;
+
+    extAddr << m_extAddr;
+    nwkAddr << m_nwkAddr;
+    devTimeout << m_devTimeout;
+
+    *os << std::resetiosflags(std::ios::adjustfield) << std::setiosflags(std::ios::left);
+    *os << std::setw(25) << extAddr.str();
+    *os << std::setw(13) << nwkAddr.str();
+    *os << std::setw(16) << devTimeout.str();
+    switch (m_relationship)
+    {
+    case NBR_PARENT:
+        *os << std::setw(16) << "PARENT";
+        break;
+    case NBR_CHILD:
+        *os << std::setw(16) << "CHILD";
+        break;
+    case NBR_SIBLING:
+        *os << std::setw(16) << "SIBLING";
+        break;
+    case NBR_NONE:
+        *os << std::setw(16) << "NONE";
+        break;
+    case NBR_PREV_CHILD:
+        *os << std::setw(16) << "PREVIOUS CHILD";
+        break;
+    case NBR_UNAUTH_CHILD:
+        *os << std::setw(16) << "UNAUTH CHILD";
+        break;
+    }
+
+    switch (m_deviceType)
+    {
+    case ZIGBEE_COORDINATOR:
+        *os << std::setw(16) << "COORDINATOR";
+        break;
+    case ZIGBEE_ROUTER:
+        *os << std::setw(16) << "ROUTER";
+        break;
+    case ZIGBEE_ENDDEVICE:
+        *os << std::setw(16) << "END DEVICE";
+        break;
+    }
+
+    *os << std::setw(14) << static_cast<uint16_t>(m_txFailure);
+    *os << std::setw(5) << static_cast<uint16_t>(m_lqi);
+    *os << std::setw(16) << static_cast<uint16_t>(m_outgoingCost);
+    *os << std::setw(8) << static_cast<uint16_t>(m_age);
+    *os << std::setw(19) << std::hex << m_extPanId << std::dec;
+    *os << std::setw(11) << (m_potentialParent ? "TRUE" : "FALSE");
+    *os << std::endl;
+    (*os).copyfmt(oldState);
+}
+
+/***********************************************************
+ *                Neighbor Table
+ ***********************************************************/
+
+NeighborTable::NeighborTable()
+{
+    m_maxTableSize = 32;
+}
+
+bool
+NeighborTable::AddEntry(Ptr<NeighborTableEntry> entry)
+{
+    if (m_neighborTable.size() < m_maxTableSize)
+    {
+        m_neighborTable.emplace_back(entry);
+        return true;
+    }
+    else
+    {
+        return false;
+    }
+}
+
+void
+NeighborTable::Purge()
+{
+    std::erase_if(m_neighborTable, [](Ptr<NeighborTableEntry> entry) {
+        return Simulator::Now() >= entry->GetTimeoutCounter();
+    });
+}
+
+void
+NeighborTable::Delete(Mac64Address extAddr)
+{
+    std::erase_if(m_neighborTable, [&extAddr](Ptr<NeighborTableEntry> entry) {
+        return entry->GetExtAddr() == extAddr;
+    });
+}
+
+bool
+NeighborTable::LookUpEntry(Mac16Address nwkAddr, Ptr<NeighborTableEntry>& entryFound)
+{
+    NS_LOG_FUNCTION(this << nwkAddr);
+    // Purge();
+
+    for (const auto& entry : m_neighborTable)
+    {
+        if (entry->GetNwkAddr() == nwkAddr)
+        {
+            entryFound = entry;
+            return true;
+        }
+    }
+
+    return false;
+}
+
+bool
+NeighborTable::LookUpEntry(Mac64Address extAddr, Ptr<NeighborTableEntry>& entryFound)
+{
+    NS_LOG_FUNCTION(this << extAddr);
+    // Purge();
+
+    for (const auto& entry : m_neighborTable)
+    {
+        if (entry->GetExtAddr() == extAddr)
+        {
+            entryFound = entry;
+            return true;
+        }
+    }
+
+    return false;
+}
+
+bool
+NeighborTable::GetParent(Ptr<NeighborTableEntry>& entryFound)
+{
+    NS_LOG_FUNCTION(this);
+
+    for (const auto& entry : m_neighborTable)
+    {
+        if (entry->GetRelationship() == NBR_PARENT)
+        {
+            entryFound = entry;
+            return true;
+        }
+    }
+
+    return false;
+}
+
+bool
+NeighborTable::LookUpForBestParent(uint64_t epid, Ptr<NeighborTableEntry>& entryFound)
+{
+    bool flag = false;
+    uint8_t currentLinkCost = 7;
+    uint8_t prevLinkCost = 8;
+
+    for (const auto& entry : m_neighborTable)
+    {
+        // Note: Permit to join, stack profile , update id and capability are checked when
+        //       the beacon is received (beacon notify indication)
+        currentLinkCost = GetLinkCost(entry->GetLqi());
+
+        if ((epid == entry->GetExtPanId()) &&
+            (entry->GetDeviceType() == ZIGBEE_COORDINATOR ||
+             entry->GetDeviceType() == ZIGBEE_ROUTER) &&
+            (entry->IsPotentialParent()) && (currentLinkCost <= 3))
+        {
+            if (currentLinkCost < prevLinkCost)
+            {
+                entryFound = entry;
+                prevLinkCost = currentLinkCost;
+            }
+            entryFound = entry;
+            flag = true;
+        }
+    }
+
+    return flag;
+}
+
+void
+NeighborTable::Print(Ptr<OutputStreamWrapper> stream) const
+{
+    std::ostream* os = stream->GetStream();
+    std::ios oldState(nullptr);
+    oldState.copyfmt(*os);
+
+    *os << std::resetiosflags(std::ios::adjustfield) << std::setiosflags(std::ios::left);
+    *os << "ZigBee Neighbor Table\n";
+    *os << std::setw(25) << "IEEE Address";
+    *os << std::setw(13) << "Nwk Address";
+    *os << std::setw(16) << "Device Timeout";
+    *os << std::setw(16) << "Relationship";
+    *os << std::setw(16) << "Device type";
+    *os << std::setw(14) << "Tx Failure";
+    *os << std::setw(5) << "LQI";
+    *os << std::setw(16) << "Outgoing Cost";
+    *os << std::setw(8) << "Age";
+    *os << std::setw(19) << "Ext PAN ID";
+    *os << std::setw(11) << "Pot. Parent";
+    *os << std::endl;
+
+    for (const auto& entry : m_neighborTable)
+    {
+        entry->Print(stream);
+    }
+    *stream->GetStream() << std::endl;
+}
+
+uint32_t
+NeighborTable::GetSize()
+{
+    return m_neighborTable.size();
+}
+
+void
+NeighborTable::SetMaxTableSize(uint32_t size)
+{
+    m_maxTableSize = size;
+}
+
+uint32_t
+NeighborTable::GetMaxTableSize() const
+{
+    return m_maxTableSize;
+}
+
+uint8_t
+NeighborTable::GetLinkCost(uint8_t lqi) const
+{
+    NS_ASSERT_MSG(lqi <= 255, "LQI does not have a valid range");
+
+    uint8_t linkCost;
+
+    if (lqi >= 240)
+    {
+        linkCost = 1;
+    }
+    else if (lqi >= 202)
+    {
+        linkCost = 2;
+    }
+    else if (lqi >= 154)
+    {
+        linkCost = 3;
+    }
+    else if (lqi >= 106)
+    {
+        linkCost = 4;
+    }
+    else if (lqi >= 58)
+    {
+        linkCost = 5;
+    }
+    else if (lqi >= 11)
+    {
+        linkCost = 6;
+    }
+    else
+    {
+        linkCost = 7;
+    }
+
+    return linkCost;
+}
+
+void
+NeighborTable::Dispose()
+{
+    for (auto element : m_neighborTable)
+    {
+        element = nullptr;
+    }
+    m_neighborTable.clear();
+}
+
+/***********************************************************
+ *                    PAN Id Table
+ ***********************************************************/
+
+PanIdTable::PanIdTable()
+{
+}
+
+void
+PanIdTable::AddEntry(uint64_t extPanId, uint16_t panId)
+{
+    auto i = m_panIdTable.find(extPanId);
+    if (i == m_panIdTable.end())
+    {
+        // New entry
+        m_panIdTable.emplace(extPanId, panId);
+
+        NS_LOG_DEBUG("[New entry, Pan ID Table]"
+                     " | ExtPANId: "
+                     << extPanId << " | PAN Id: " << panId);
+    }
+    else
+    {
+        // Update entry
+        if (panId != i->second)
+        {
+            m_panIdTable[extPanId] = panId;
+        }
+    }
+}
+
+bool
+PanIdTable::GetEntry(uint64_t extPanId, uint16_t& panId)
+{
+    auto i = m_panIdTable.find(extPanId);
+
+    if (i == m_panIdTable.end())
+    {
+        return false;
+    }
+
+    panId = i->second;
+    return true;
+}
+
+void
+PanIdTable::Dispose()
+{
+    m_panIdTable.clear();
+}
+
+/***********************************************************
+ *                Broadcast Transaction Table (BTT)
+ ***********************************************************/
+
+BroadcastTransactionTable::BroadcastTransactionTable()
+{
+}
+
+bool
+BroadcastTransactionTable::AddEntry(Ptr<BroadcastTransactionRecord> entry)
+{
+    Purge();
+    m_broadcastTransactionTable.emplace_back(entry);
+    return true;
+}
+
+uint32_t
+BroadcastTransactionTable::GetSize()
+{
+    return m_broadcastTransactionTable.size();
+}
+
+void
+BroadcastTransactionTable::SetMaxTableSize(uint32_t size)
+{
+    m_maxTableSize = size;
+}
+
+uint32_t
+BroadcastTransactionTable::GetMaxTableSize() const
+{
+    return m_maxTableSize;
+}
+
+bool
+BroadcastTransactionTable::LookUpEntry(uint8_t seq, Ptr<BroadcastTransactionRecord>& entryFound)
+{
+    NS_LOG_FUNCTION(this << seq);
+    Purge();
+
+    for (const auto& entry : m_broadcastTransactionTable)
+    {
+        if (entry->GetSeqNum() == seq)
+        {
+            entryFound = entry;
+            return true;
+        }
+    }
+    return false;
+}
+
+void
+BroadcastTransactionTable::Purge()
+{
+    std::erase_if(m_broadcastTransactionTable, [](Ptr<BroadcastTransactionRecord> btr) {
+        return Simulator::Now() >= btr->GetExpirationTime();
+    });
+}
+
+void
+BroadcastTransactionTable::Dispose()
+{
+    for (auto element : m_broadcastTransactionTable)
+    {
+        element = nullptr;
+    }
+    m_broadcastTransactionTable.clear();
+}
+
+void
+BroadcastTransactionTable::Print(Ptr<OutputStreamWrapper> stream)
+{
+    std::ostream* os = stream->GetStream();
+    std::ios oldState(nullptr);
+    oldState.copyfmt(*os);
+
+    *os << std::resetiosflags(std::ios::adjustfield) << std::setiosflags(std::ios::left);
+    *os << "ZigBee Routing table\n";
+    *os << std::setw(16) << "SrcAddress";
+    *os << std::setw(16) << "Seq. Num";
+    *os << std::setw(16) << "Expiration";
+    *os << std::setw(16) << "Count" << std::endl;
+
+    for (const auto& entry : m_broadcastTransactionTable)
+    {
+        entry->Print(stream);
+    }
+    *stream->GetStream() << std::endl;
+}
+
+/***********************************************************
+ *                Broadcast Transaction Record (BTR)
+ ***********************************************************/
+
+BroadcastTransactionRecord::BroadcastTransactionRecord(Mac16Address srcAddr, uint8_t seq, Time exp)
+{
+    m_srcAddr = srcAddr;
+    m_sequenceNumber = seq;
+    m_expirationTime = exp;
+    m_broadcastRetryCount = 0;
+}
+
+BroadcastTransactionRecord::BroadcastTransactionRecord()
+{
+}
+
+BroadcastTransactionRecord::~BroadcastTransactionRecord()
+{
+}
+
+Mac16Address
+BroadcastTransactionRecord::GetSrcAddr() const
+{
+    return m_srcAddr;
+}
+
+void
+BroadcastTransactionRecord::SetSrcAddr(Mac16Address src)
+{
+    m_srcAddr = src;
+}
+
+uint8_t
+BroadcastTransactionRecord::GetSeqNum() const
+{
+    return m_sequenceNumber;
+}
+
+void
+BroadcastTransactionRecord::SetSeqNum(uint8_t seq)
+{
+    m_sequenceNumber = seq;
+}
+
+Time
+BroadcastTransactionRecord::GetExpirationTime() const
+{
+    return m_expirationTime;
+}
+
+void
+BroadcastTransactionRecord::SetExpirationTime(Time exp)
+{
+    m_expirationTime = exp;
+}
+
+uint8_t
+BroadcastTransactionRecord::GetBcstRetryCount() const
+{
+    return m_broadcastRetryCount;
+}
+
+void
+BroadcastTransactionRecord::SetBcstRetryCount(uint8_t count)
+{
+    m_broadcastRetryCount = count;
+}
+
+void
+BroadcastTransactionRecord::Print(Ptr<OutputStreamWrapper> stream) const
+{
+    std::ostream* os = stream->GetStream();
+    std::ios oldState(nullptr);
+    oldState.copyfmt(*os);
+
+    std::ostringstream sourceAddr;
+    std::ostringstream seq;
+    std::ostringstream expTime;
+    std::ostringstream count;
+
+    sourceAddr << m_srcAddr;
+    seq << m_sequenceNumber;
+    expTime << (m_expirationTime - Simulator::Now()).As(Time::S);
+    count << m_broadcastRetryCount;
+
+    *os << std::resetiosflags(std::ios::adjustfield) << std::setiosflags(std::ios::left);
+    *os << std::setw(16) << sourceAddr.str();
+    *os << std::setw(16) << static_cast<uint32_t>(m_sequenceNumber);
+    *os << std::setw(16) << expTime.str();
+    *os << std::setw(16) << static_cast<uint32_t>(m_broadcastRetryCount);
+    *os << std::endl;
+    (*os).copyfmt(oldState);
+}
+
+} // namespace zigbee
+} // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/zigbee/model/zigbee-nwk-tables.h ns-3.44/src/zigbee/model/zigbee-nwk-tables.h
--- ns-3.43/src/zigbee/model/zigbee-nwk-tables.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/zigbee/model/zigbee-nwk-tables.h	2025-03-09 16:55:49.819372700 -0700
@@ -0,0 +1,1327 @@
+/*
+ * Copyright (c) 2024 Tokushima University, Japan
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Authors:
+ *  Ryo Okuda <c611901200@tokushima-u.ac.jp>
+ *  Alberto Gallegos Ramonet <alramonet@is.tokushima-u.ac.jp>
+ */
+
+#ifndef ZIGBEE_TABLES_H
+#define ZIGBEE_TABLES_H
+
+#include "zigbee-nwk-fields.h"
+
+#include "ns3/mac16-address.h"
+#include "ns3/mac64-address.h"
+#include "ns3/output-stream-wrapper.h"
+#include "ns3/timer.h"
+
+#include <cassert>
+#include <deque>
+#include <map>
+#include <stdint.h>
+#include <sys/types.h>
+
+namespace ns3
+{
+namespace zigbee
+{
+
+/**
+ * @ingroup zigbee
+ *  Route record states
+ */
+enum RouteStatus
+{
+    ROUTE_ACTIVE = 0x0,              //!< Route active
+    ROUTE_DISCOVERY_UNDERWAY = 0x1,  //!< Route discovery underway
+    ROUTE_DISCOVER_FAILED = 0x2,     //!< Route discovery failed
+    ROUTE_INACTIVE = 0x3,            //!< Route inactive
+    ROUTE_VALIDATION_UNDERWAY = 0x4, //!< Route discovery validation underway
+};
+
+/**
+ * @ingroup zigbee
+ * The relationship between the neighbor and the current device
+ */
+enum Relationship
+{
+    NBR_PARENT = 0x0,        //!< Neighbor is the parent
+    NBR_CHILD = 0x01,        //!< Neighbor is the child
+    NBR_SIBLING = 0x02,      //!< Neighbor is the sibling
+    NBR_NONE = 0x03,         //!< No relationship
+    NBR_PREV_CHILD = 0x04,   //!< Neighbor was a previous child
+    NBR_UNAUTH_CHILD = 0x05, //!< Neighbor is an unauthenticated child
+};
+
+/**
+ * @ingroup zigbee
+ * The network layer device type
+ */
+enum NwkDeviceType
+{
+    ZIGBEE_COORDINATOR = 0x0, //!< Zigbee coordinator
+    ZIGBEE_ROUTER = 0x01,     //!< Zigbee router
+    ZIGBEE_ENDDEVICE = 0x02   //!< Zigbee end device
+};
+
+/**
+ * @ingroup zigbee
+ * Routing table entry
+ * Zigbee Specification r22.1.0, Table 3-66
+ */
+class RoutingTableEntry : public SimpleRefCount<RoutingTableEntry>
+{
+  public:
+    /**
+     * The constructor the routing table entry.
+     *
+     * @param dst The destination nwkAddress (MAC 16-bit Address).
+     * @param status The status of the current entry.
+     * @param noRouteCache The value of the route cache flag.
+     * @param manyToOne The value of the manyToOne flag.
+     * @param routeRecordReq The value of the Route record required flag.
+     * @param groupId The value of the group id flag.
+     * @param nextHopAddr The value of the 16 bit next hop address.
+     */
+    RoutingTableEntry(Mac16Address dst,
+                      RouteStatus status,
+                      bool noRouteCache,
+                      bool manyToOne,
+                      bool routeRecordReq,
+                      bool groupId,
+                      Mac16Address nextHopAddr);
+
+    RoutingTableEntry();
+    ~RoutingTableEntry();
+
+    /**
+     * Set the entry destination nwkAddress (MAC 16-bit address)
+     *
+     * @param dst The value of the destination nwkAddress
+     */
+    void SetDestination(Mac16Address dst);
+
+    /**
+     * Get the entry destination nwkAddress(MAC 16-bit address)
+     *
+     * @return The value of the nwkAddress stored in this entry.
+     */
+    Mac16Address GetDestination() const;
+
+    /**
+     * Indicates if the No Route Cache flag is active.
+     *
+     * @return The value of the no route cache flag.
+     */
+    bool IsNoRouteCache() const;
+
+    /**
+     * Indicates if the Many-to-One flag is active.
+     *
+     * @return The value of the Many-to-one flag.
+     */
+    bool IsManyToOne() const;
+
+    /**
+     * Indicate if the route record request is active.
+     *
+     * @return The value of the route record request flag.
+     */
+    bool IsRouteRecordReq() const;
+
+    /**
+     * Indicates if the Group Id flag is active.
+     *
+     * @return The value of the Group id flag.
+     */
+    bool IsGroupIdPresent() const;
+
+    /**
+     * Set the value of the next hop address.
+     *
+     * @param nextHopAddr The next hop 16-bit nwkAddress
+     */
+    void SetNextHopAddr(Mac16Address nextHopAddr);
+
+    /**
+     * Get the value of the next hop address.
+     *
+     * @return Mac16Address The 16 bit next hop address.
+     */
+    Mac16Address GetNextHopAddr() const;
+
+    /**
+     * Set the lifetime of the entry
+     * @param lt The time used in the entry lifetime
+     */
+    void SetLifeTime(Time lt);
+
+    /**
+     * Get the value of the entry lifetime.
+     * @return the lifetime
+     */
+    Time GetLifeTime() const;
+
+    /**
+     * Set the status of the routing table entry.
+     * @param status the status of the routing table entry.
+     */
+    void SetStatus(RouteStatus status);
+
+    /**
+     * Get the status of the routing table entry.
+     * @return The status of the routing table entry.
+     */
+    RouteStatus GetStatus() const;
+
+    /**
+     * Print the values of the routing table entry.
+     *
+     * @param stream The stream object used to print.
+     */
+    void Print(Ptr<OutputStreamWrapper> stream) const;
+
+  private:
+    Mac16Address m_destination;   //!< The 16 bit network address or group id of this route.
+                                  //!< If the dst device is a router, coordinator or end device, and
+                                  //!< nwkAddrAlloc has a value of STOCHASTIC_ALLOC this field shall
+                                  //!< contain the actual 16 bit addr of that device. If the dst
+                                  //!< device is an end device and nwkAddrAlloc has a value of
+                                  //!< DISTRIBUTED_ALLOC, this field shall contain the 16 bit
+                                  //!< nwk address of the device's parent.
+    RouteStatus m_status;         //!< The status of the route.
+                                  //!< Also see Zigbee specification r22.1.0, Table 3-67
+    bool m_noRouteCache{true};    //!< A flag indicating that the destination indicated by
+                                  //!< this address does not store source routes.
+    bool m_manyToOne{false};      //!< A flag indicating  that the destination is a concentrator
+                                  //!< that issued a  many-to-one route request
+    bool m_routeRecordReq{false}; //!< A flag indicating that the route record command frame should
+                                  //!< be sent to the destination prior to the next data packet.
+    bool m_groupId{false};        //!< A flag indicating that the destination address is a group id.
+    Mac16Address m_nextHopAddr;   //!< The 16 bit network address of the next hop on the way to the
+                                  //!< destination.
+    Time m_lifeTime;              //!< Indicates the lifetime of the entry
+};
+
+/**
+ *  The Network layer Route Discovery Table Entry
+ *  See Zigbee specification r22.1.0, Table 3-68
+ */
+class RouteDiscoveryTableEntry : public SimpleRefCount<RouteDiscoveryTableEntry>
+{
+  public:
+    /**
+     * The constructor of the route discovery entry
+     *
+     * @param rreqId The sequence number used by the RREQ command frame
+     * @param src The source address of the RREQ initiator.
+     * @param snd The address of the device that has sent most recent lowest cost RREQ.
+     * @param forwardCost The accumulated path cost from the RREQ src to this device.
+     * @param residualCost The accumulated path cost from this device to the destination.
+     * @param expTime The expiration time of this entry.
+     */
+    RouteDiscoveryTableEntry(uint8_t rreqId,
+                             Mac16Address src,
+                             Mac16Address snd,
+                             uint8_t forwardCost,
+                             uint8_t residualCost,
+                             Time expTime);
+
+    RouteDiscoveryTableEntry();
+    ~RouteDiscoveryTableEntry();
+
+    /**
+     * Get the route request id (The sequence number used by the RREQ command frame).
+     *
+     * @return The route request id (RREQ command frame sequence number).
+     */
+    uint8_t GetRreqId() const;
+
+    /**
+     * Get the source address of the entry's RREQ initiator.
+     *
+     * @return The address of the RREQ initiator.
+     */
+    Mac16Address GetSourceAddr() const;
+
+    /**
+     * Get the sender address of the entry.
+     *
+     * @return The sender address
+     */
+    Mac16Address GetSenderAddr() const;
+
+    /**
+     * Get the forward cost of this entry.
+     *
+     * @return The forward cost
+     */
+    uint8_t GetForwardCost() const;
+
+    /**
+     * Get the value of a residual cost (pathcost) updated by a RREP
+     * in this entry.
+     *
+     * @return The residual cost.
+     */
+    uint8_t GetResidualCost() const;
+
+    /**
+     * Set the forward cost of this entry
+     *
+     * @param pathCost The pathCost of the most optimal route found.
+     */
+    void SetForwardCost(uint8_t pathCost);
+
+    /**
+     * Set the sender address of this entry
+     * @param sender The last hop sender of the last optimal route found.
+     */
+    void SetSenderAddr(Mac16Address sender);
+
+    /**
+     * Set the resulting pathcost on a reception of a RREP previously requested.
+     *
+     * @param pathcost The pathcost contained in the RREP
+     */
+    void SetResidualCost(uint8_t pathcost);
+
+    /**
+     * Get the expiration time of this entry
+     *
+     * @return The expiration time of this entry.
+     */
+    Time GetExpTime() const;
+
+    /**
+     * Set the expiration time of the route discovery entry.
+     *
+     * @param exp The expiration time.
+     */
+    void SetExpTime(Time exp);
+
+    /**
+     * Print the values of the route discovery table entry
+     *
+     * @param stream The stream object used to print.
+     */
+    void Print(Ptr<OutputStreamWrapper> stream) const;
+
+  private:
+    uint8_t m_routeRequestId;  //!< The sequence number for a RREQ command frame that is incremented
+                               //!< each time a device initiates a RREQ.
+    Mac16Address m_sourceAddr; //!< The 16-bit network address of the RREQ initiator.
+    Mac16Address m_senderAddr; //!< The 16-bit network address of the device that has sent
+                               //!< the most recent lowest cost RREQ command frame corresponding to
+                               //!< this entry's RREQ id and source addr. This field is used to
+                               //!< determine the path that an eventual RREP command should follow.
+    uint8_t m_forwardCost;     //!< The accumulated path cost from the source of the RREQ to the
+                               //!< current device.
+    uint8_t m_residualCost;    //!< The accumulated path cost from the current device to the
+                               //!< destination device.
+    Time m_expirationTime;     //!< A time stamp indicating the expiration time. The default value
+                               //!< of the entry is equals to current time + nwkcRouteDiscoveryTime.
+};
+
+/**
+ *  The Network layer Neighbor Table Entry
+ *  See Zigbee specification r22.1.0, Table 3-63
+ */
+class NeighborTableEntry : public SimpleRefCount<NeighborTableEntry>
+{
+  public:
+    NeighborTableEntry();
+    ~NeighborTableEntry();
+
+    /**
+     * Construct a new Neighbor Table Entry object. This constructor do not include
+     * the optional or additional fields.
+     *
+     * @param extAddr The EUI-64 address of the device to register (IEEEaddress)
+     * @param nwkAddr The short address of the device to register (The MAC 16 address)
+     * @param deviceType The type of neighbor device
+     * @param rxOnWhenIdle Indication of whether the neighbor enabled during idle periods.
+     * @param endDevConfig The end device configuration
+     * @param timeoutCounter The remaining current time in seconds.
+     * @param devTimeout The timeout in seconds of the end device
+     * @param relationship The relationship between the neighbor and the current device
+     * @param txFailure Indicates whether or not a previous Tx to the device was successful.
+     * @param lqi The link quality indicator (LQI) value
+     * @param outgoingCost Cost of the link measured by the neighbor
+     * @param age Num of nwkLinkStatusPeriods since the link status cmd was received.
+     * @param keepaliveRx Indicates if at least one keep alive was received since the router was
+     * rebooted.
+     * @param macInterfaceIndex The MAC interface index
+     */
+    NeighborTableEntry(Mac64Address extAddr,
+                       Mac16Address nwkAddr,
+                       NwkDeviceType deviceType,
+                       bool rxOnWhenIdle,
+                       uint16_t endDevConfig,
+                       Time timeoutCounter,
+                       Time devTimeout,
+                       Relationship relationship,
+                       uint8_t txFailure,
+                       uint8_t lqi,
+                       uint8_t outgoingCost,
+                       uint8_t age,
+                       bool keepaliveRx,
+                       uint8_t macInterfaceIndex);
+
+    /**
+     * Get the entry registered IEEE address (EUI-64 address).
+     *
+     * @return The entry EUI-64 address.
+     */
+    Mac64Address GetExtAddr() const;
+
+    /**
+     * Get the entry registered Network address (MAC short address).
+     *
+     * @return The 16 bit address registered in this entry.
+     */
+    Mac16Address GetNwkAddr() const;
+
+    /**
+     * Get the device type of this neighbor device.
+     *
+     * @return The type of device registered for this neighbor.
+     */
+    NwkDeviceType GetDeviceType() const;
+
+    /**
+     * Return true is neighboring device is on when idle.
+     *
+     * @return True if device is on when idle.
+     */
+    bool IsRxOnWhenIdle() const;
+
+    /**
+     * Get the end device configuration object.
+     *
+     * @return The end device configuration in this entry.
+     */
+    uint16_t GetEndDevConfig() const;
+
+    /**
+     * Get the timeout counter object.
+     *
+     * @return The extended PAN Id registered to this entry.
+     */
+    Time GetTimeoutCounter() const;
+
+    /**
+     * Get the device timeout object.
+     *
+     * @return The device timeout time
+     */
+    Time GetDevTimeout() const;
+
+    /**
+     * Get the relationship object.
+     *
+     * @return The relationship between the neighbor and current device.
+     */
+    uint8_t GetRelationship() const;
+
+    /**
+     * Get the Tx Failure object
+     *
+     * @return A value indicating if a prev Tx to the device was successful.
+     */
+    uint8_t GetTxFailure() const;
+
+    /**
+     * Get the LQI value from this device to an entry neighbor
+     *
+     * @return The LQI value
+     */
+    uint8_t GetLqi() const;
+
+    /**
+     * Get the outgoing cost object.
+     *
+     * @return The cost of the outgoing link as measured by a neighbor.
+     */
+    uint8_t GetOutgoingCost() const;
+
+    /**
+     * Get the number of nwkLinkStatusPeriod intervals since the
+     * link status command was received.
+     *
+     * @return The number of nwkLinkStatusPeriod intervals
+     */
+    uint8_t GetAge() const;
+
+    /**
+     * Get the time in symbols at which the last beacon frame
+     * was received from the neighbor.
+     *
+     * @return time in symbols since last beacon frame.
+     */
+    uint64_t GetIncBeaconTimestamp() const;
+
+    /**
+     * Get the transmission time difference in symbols, between the
+     * neighbor's beacon and its parent beacon.
+     *
+     * @return Time difference (symbols) between beacon and parent beacon.
+     */
+    uint64_t GetBeaconTxTimeOffset() const;
+
+    /**
+     * Get the MAC Interface Index object
+     *
+     * @return The MAC interface index registered for this entry
+     */
+    uint8_t GetMacInterfaceIndex() const;
+
+    /**
+     * Get the number of unicast bytes transmitted to the neighbor
+     * registered in this entry.
+     *
+     * @return Unicast transmitted bytes.
+     */
+    uint32_t GetMacUcstBytesTx() const;
+
+    /**
+     * Get the number of unicast bytes received to the neighbor
+     * registered in this entry.
+     *
+     * @return Unicast transmitted bytes.
+     */
+    uint32_t GetMacUcstBytesRx() const;
+
+    /**
+     * Get the extended PAN identifier
+     *
+     * @return The extended PAN identifier.
+     */
+    uint64_t GetExtPanId() const;
+
+    /**
+     * Get the logical channel used by the the neighbor in this entry.
+     *
+     * @return The channel number used by this neighbor.
+     */
+    uint8_t GetLogicalCh() const;
+
+    /**
+     * The depth of the neighbor device.
+     *
+     * @return The depth of the neighbor device in this entryj
+     */
+    uint8_t GetDepth() const;
+
+    /**
+     * Get the value of the beacon order set in this neighbor.
+     * See IEEE 802.15.4-2011.
+     *
+     * @return The value of the beacon order registered for this neighbor entry.
+     */
+    uint8_t GetBeaconOrder() const;
+
+    /**
+     * Get the the value of the potential parent field.
+     *
+     * @return A confirmation of whether of not the device has been discarded a potential parent.
+     */
+    uint8_t IsPotentialParent() const;
+
+    /**
+     * Set the entry registered Network address (MAC short address).
+     *
+     * @param nwkAddr The 16 bit address to set in this entry.
+     */
+    void SetNwkAddr(Mac16Address nwkAddr);
+
+    /**
+     * Set the device type of this neighbor device.
+     *
+     * @param devType The device to set for this entry.
+     */
+    void SetDeviceType(NwkDeviceType devType);
+
+    /**
+     * Set the device is on when idle flag.
+     *
+     * @param onWhenIdle Set if device is on when idle.
+     */
+    void SetRxOnWhenIdle(bool onWhenIdle);
+
+    /**
+     * Set the end device configuration.
+     *
+     * @param conf The end device configuration to set in this entry.
+     */
+    void SetEndDevConfig(uint16_t conf);
+
+    /**
+     * Set the timeout counter object.
+     *
+     * @param counter The timeout counter used by this entry.
+     */
+    void SetTimeoutCounter(Time counter);
+
+    /**
+     * Set the device timeout object.
+     *
+     * @param timeout The device timeout time
+     */
+    void SetDevTimeout(Time timeout);
+
+    /**
+     * Set the relationship object.
+     *
+     * @param relationship The relationship between the neighbor and current device.
+     */
+    void SetRelationship(Relationship relationship);
+
+    /**
+     * Set the Tx Failure object
+     *
+     * @param failure A value indicating if a prev Tx to the device was successful.
+     */
+    void SetTxFailure(uint8_t failure);
+
+    /**
+     * Set the Link quality indicator value from this device to an entry neighbor
+     *
+     * @param lqi The LQI value
+     */
+    void SetLqi(uint8_t lqi);
+
+    /**
+     * Set the outgoing cost object.
+     *
+     * @param cost The cost of the outgoing link as measured by a neighbor.
+     */
+    void SetOutgoingCost(uint8_t cost);
+
+    /**
+     * Set the number of nwkLinkStatusPeriod intervals since the
+     * link status command was received.
+     *
+     * @param age The number of nwkLinkStatusPeriod intervals
+     */
+    void SetAge(uint8_t age);
+
+    /**
+     * Set the time in symbols at which the last beacon frame
+     * was received from the neighbor.
+     *
+     * @param timestamp time in symbols since last beacon frame.
+     */
+    void SetIncBeaconTimestamp(uint64_t timestamp);
+
+    /**
+     * Set the transmission time difference in symbols, between the
+     * neighbor's beacon and its parent beacon.
+     *
+     * @param offset Time difference (symbols) between beacon and parent beacon.
+     */
+    void SetBeaconTxTimeOffset(uint64_t offset);
+
+    /**
+     * Set the MAC Interface Index object
+     *
+     * @param index The MAC interface index registered for this entry
+     */
+    void SetMacInterfaceIndex(uint8_t index);
+
+    /**
+     * Set the number of unicast bytes transmitted to the neighbor
+     * registered in this entry.
+     *
+     * @param txBytes Unicast transmitted bytes.
+     */
+    void SetMacUcstBytesTx(uint32_t txBytes);
+
+    /**
+     * Set the number of unicast bytes received to the neighbor
+     * registered in this entry.
+     *
+     * @param rxBytes Unicast transmitted bytes.
+     */
+    void SetMacUcstBytesRx(uint32_t rxBytes);
+
+    /**
+     * Set the extended PAN identifier
+     *
+     * @param extPanId The extended PAN identifier.
+     */
+    void SetExtPanId(uint64_t extPanId);
+
+    /**
+     * Set the logical channel used by the the neighbor in this entry.
+     *
+     * @param channel The channel number used by this neighbor.
+     */
+    void SetLogicalCh(uint8_t channel);
+
+    /**
+     * Set the depth of the neighbor device.
+     *
+     * @param depth The depth of the neighbor device in this entryj
+     */
+    void SetDepth(uint8_t depth);
+
+    /**
+     * Set the value of the beacon order set in this neighbor.
+     * See IEEE 802.15.4-2011.
+     *
+     * @param bo The value of the beacon order registered for this neighbor entry.
+     */
+    void SetBeaconOrder(uint8_t bo);
+
+    /**
+     * Set the the value of the potential parent field.
+     *
+     * @param confirm A confirm of whether or not the device has been discarded a potential parent.
+     */
+    void SetPotentialParent(bool confirm);
+
+    /**
+     * Print the values of the neighbor table entry.
+     *
+     * @param stream The stream object used to print.
+     */
+    void Print(Ptr<OutputStreamWrapper> stream) const;
+
+  private:
+    Mac64Address m_extAddr;     //!< The IEEE EUI-64 bit address that is unique to every device.
+    Mac16Address m_nwkAddr;     //!< The 16 bit network address of the neighboring device.
+    NwkDeviceType m_deviceType; //!< The type of neighbor device
+    bool m_rxOnWhenIdle;     //!< Indicates if the neighbor receiver is enabled during idle periods.
+    uint16_t m_endDevConfig; //!< The end device configuration.
+                             //!< See Zigbee Specification r22.1.0, 3.4.11.3.2
+    Time m_timeoutCounter; //!< Indicates the current time remaining in seconds, for the end device.
+    Time m_devTimeout; //!< This field indicates the timeout, in seconds, for the end device child.
+    Relationship m_relationship; //!< Relationship between the neighbor and the current device.
+    uint8_t m_txFailure;         //!< A value indicating if previous transmissions to the device
+                                 //!< were successful or not. Higher values indicate more failures.
+    uint8_t m_lqi;          //!< The estimated link quality for RF transmissions from this device
+                            //!< See Zigbee specification r22.1.0, 3.6.3.1
+    uint8_t m_outgoingCost; //!< The cost of the outgoing link as measured by the neighbor.
+                            //!< A value of 0 indicates no outgoing cost available.
+    uint8_t m_age; //!< The number of nwkLinkStatusPeriod intervals  since link status command
+                   //!< was received. Mandatory if m_nwkSymLink = true
+    uint64_t m_incBeaconTimestamp; //!< The time in symbols at which the last beacon frame
+                                   //!< was received from the neighbor. This is equal to the
+                                   //!< timestamp taken when the beacon frame was received
+                                   //!< (Optional Field) See IEEE 802.15.4-2015[B1]
+    uint64_t m_beaconTxTimeOffset; //!< The transmission time difference in symbols, between the
+                                   //!< neighbor's beacon and its parent beacon (Optional field).
+    bool m_keepaliveRx;          //!< This value indicates at least one keepalive has been received
+                                 //!< from the end device since the router has rebooted.
+    uint8_t m_macInterfaceIndex; //!< This is an index into the MAC Interface Table indicating
+                                 //! what interface the neighbor or child is bound to.
+    uint32_t m_macUcstBytesTx;   //!< The number of bytes transmitted via MAC unicast to the
+                                 //!< neighbor (Optional field).
+    uint32_t m_macUcstBytesRx;   //!< The number of bytes received via MAC unicasts from this
+                                 //!< neighbor (Optional field).
+
+    // Additional Neighbor Table Fields (Optional fields)
+    // See Zigbee specification r22.1.0, Table 3-64
+
+    uint64_t m_extPanId; //!< The extendend PAN id (based on the Zigbee coordinator EUI-64 address)
+    uint8_t m_logicalCh; //!< The logical channel on which the network is operating.
+    uint8_t m_depth;     //!< The tree depth of the neighbor device
+    uint8_t m_bo{15};    //!< The beacon order of the device (See IEEE 802.15.4-2011)
+    bool m_potentialParent{true}; //!< An indication of whether the device has been
+                                  //!< ruled out as a potential parent.
+};
+
+/**
+ *  A table that keeps record of neighbors devices NWK extended PAN ids (64 bits)
+ *  and their related 16 bit MAC pan id. This is not explicitly mentioned
+ *  in the Zigbee specification but it is required to keep record of this to
+ *  enable the join process through association. This approach is also used by
+ *  other stacks like Zboss stack 1.0.
+ */
+class PanIdTable
+{
+  public:
+    /**
+     * The constructor of the PanIdTable.
+     */
+    PanIdTable();
+
+    /**
+     * Add an entry to the PAN Id table.
+     *
+     * @param extPanId The extended PAN identifier (64 bits).
+     * @param panId The 16 bit PAN id used by the MAC layer .
+     */
+    void AddEntry(uint64_t extPanId, uint16_t panId);
+
+    /**
+     *  Get the 16 bit MAC PAN id based on the reference extended PAN id.
+     *
+     * @param extPanId The NWK extended PAN identifier (64 bits).
+     * @param panId The returned 16 bit PAN Id.
+     * @return True if the entry was found
+     */
+    bool GetEntry(uint64_t extPanId, uint16_t& panId);
+
+    /**
+     * Dispose of the table and all its elements
+     */
+    void Dispose();
+
+  private:
+    std::map<uint64_t, uint16_t> m_panIdTable; //!< The Map object that represents
+                                               //!< the table of PAN ids.
+};
+
+/**
+ * The route request retry table entry.
+ * It represents information stored about future route requests retries.
+ */
+class RreqRetryTableEntry : public SimpleRefCount<RreqRetryTableEntry>
+{
+  public:
+    /**
+     * The constructor of the RREQ retry table entry
+     *
+     * @param rreqId The RREQ ID
+     * @param rreqRetryEvent The EventId of the next RREQ retry callback
+     * @param rreqRetryCount The current number of RREQ retries for this RREQ ID
+     */
+    RreqRetryTableEntry(uint8_t rreqId, EventId rreqRetryEvent, uint8_t rreqRetryCount);
+
+    /**
+     * Get the RREQ Id from the entry
+     *
+     * @return The RREQ ID from the entry
+     */
+    uint8_t GetRreqId() const;
+
+    /**
+     * Set the RREQ retry count from the entry
+     *
+     * @param rreqRetryCount The value of the RREQ retry count
+     */
+    void SetRreqRetryCount(uint8_t rreqRetryCount);
+
+    /**
+     * Get the RREQ retry count from the entry
+     *
+     * @return The RREQ retry count
+     */
+    uint8_t GetRreqRetryCount() const;
+
+    /**
+     *  Set the event id of the RREQ retry
+     *
+     * @param eventId The event id corresponding to the next RREQ retry callback
+     */
+    void SetRreqEventId(EventId eventId);
+
+    /**
+     * Get the RREQ id of the RREQ retry
+     *
+     * @return The event id
+     */
+    EventId GetRreqEventId();
+
+    /**
+     * Print the values of the RREQ retry table entry.
+     *
+     * @param stream The stream object used to print.
+     */
+    void Print(Ptr<OutputStreamWrapper> stream) const;
+
+  private:
+    uint8_t m_rreqId;           //!< The RREQ ID
+    EventId m_rreqRetryEventId; //!< The event id of the next RREQ retry callback
+    uint8_t m_rreqRetryCount;   //!< The number of RREQ retries
+};
+
+/**
+ * A broadcast Transaction Record (BTR)
+ * As described in Table 3-70
+ */
+class BroadcastTransactionRecord : public SimpleRefCount<BroadcastTransactionRecord>
+{
+  public:
+    BroadcastTransactionRecord();
+    ~BroadcastTransactionRecord();
+
+    /**
+     * Construct a new Broadcast Transaction Record (BTR) entry.
+     *
+     * @param srcAddr The source address of the BTR.
+     * @param seq The sequence number of the BTR.
+     * @param exp The expiration time of the BTR.
+     */
+    BroadcastTransactionRecord(Mac16Address srcAddr, uint8_t seq, Time exp);
+
+    /**
+     * Get the source address of the BTR.
+     *
+     * @return The source address.
+     */
+    Mac16Address GetSrcAddr() const;
+
+    /**
+     * Get the sequence number of the BTR.
+     *
+     * @return The sequence number.
+     */
+    uint8_t GetSeqNum() const;
+
+    /**
+     * Get the value of the expiration time in the BTR.
+     *
+     * @return The expiration time
+     */
+    Time GetExpirationTime() const;
+
+    /**
+     * Get the broadcast retry count value
+     *
+     * @return The broadcast retry count value
+     */
+    uint8_t GetBcstRetryCount() const;
+
+    /**
+     * Set the source address of the BTR
+     *
+     * @param srcAddr The source address of the BTR
+     */
+    void SetSrcAddr(Mac16Address srcAddr);
+
+    /**
+     * Set the sequence number of the BTR
+     *
+     * @param seq The sequence number of the BTR
+     */
+    void SetSeqNum(uint8_t seq);
+
+    /**
+     * Set the expiration time object
+     *
+     * @param exp The expiration time of the BTR
+     */
+    void SetExpirationTime(Time exp);
+
+    /**
+     * Set the Broadcast retry count object
+     *
+     * @param count  The value of the counter
+     */
+    void SetBcstRetryCount(uint8_t count);
+
+    /**
+     * Print the values of the BTR.
+     *
+     * @param stream The stream object used to print.
+     */
+    void Print(Ptr<OutputStreamWrapper> stream) const;
+
+  private:
+    Mac16Address m_srcAddr;        //!< The 16-bit network address of the broadcast initiator.
+    uint8_t m_sequenceNumber;      //!< The RREQ sequence number of the initiator's broadcast.
+    Time m_expirationTime;         //!< An indicator of when the entry expires
+    uint8_t m_broadcastRetryCount; //!< The number of times this BCST has been retried.
+};
+
+/**
+ *  The network layer Routing Table.
+ *  See Zigbee specification r22.1.0, 3.6.3.2
+ */
+class RoutingTable
+{
+  public:
+    /**
+     * The constructuctor of a Routing Table object
+     */
+    RoutingTable();
+
+    /**
+     * Adds an entry to the routing table.
+     *
+     * @param rt The routing table entry
+     * @return True if the entry was added to the table.
+     */
+    bool AddEntry(Ptr<RoutingTableEntry> rt);
+
+    /**
+     * Look for an specific entry in the routing table.
+     *
+     * @param dstAddr The value of the destination address used to look for an entry.
+     * @param entryFound The returned entry if found
+     * @return True if the entry was found in the routing table.
+     */
+    bool LookUpEntry(Mac16Address dstAddr, Ptr<RoutingTableEntry>& entryFound);
+
+    /**
+     * Purge old entries from the routing table.
+     */
+    void Purge();
+
+    /**
+     * Identify and mark entries as ROUTE_INACTIVE status for entries who
+     * have exceeded their lifetimes.
+     */
+    void IdentifyExpiredEntries();
+
+    /**
+     * Remove an entry from the routing table.
+     *
+     * @param dst The MAC 16 bit destination address of the entry to remove.
+     */
+    void Delete(Mac16Address dst);
+
+    /**
+     * Delete the first occrurance of an expired entry (ROUTE_INACTIVE status)
+     */
+    void DeleteExpiredEntry();
+
+    /**
+     * Print the Routing table.
+     *
+     * @param stream The stream object used to print the routing table.
+     */
+    void Print(Ptr<OutputStreamWrapper> stream) const;
+
+    /**
+     * Dispose of the table and all its elements
+     */
+    void Dispose();
+
+    /**
+     * Get the size of the routing table.
+     *
+     * @return The current size of the routing table
+     */
+    uint32_t GetSize();
+
+    /**
+     * Set the maximum size of the routing table
+     *
+     * @param size The size of the routing table.
+     */
+    void SetMaxTableSize(uint32_t size);
+
+    /**
+     *  Get the maximum size of the routing table.
+     *
+     *  @return The maximum size of the routing table.
+     */
+    uint32_t GetMaxTableSize() const;
+
+  private:
+    uint32_t m_maxTableSize;                           //!< The maximum size of the routing table;
+    std::deque<Ptr<RoutingTableEntry>> m_routingTable; //!< The object that
+                                                       //!< represents the routing table.
+};
+
+/**
+ *  The network layer Route Discovery Table
+ *  See Zigbee specification r22.1.0, 3.6.3.2
+ */
+class RouteDiscoveryTable
+{
+  public:
+    /**
+     * Constructor of route discovery table
+     */
+    RouteDiscoveryTable();
+
+    /**
+     * Add an entry to the route discovery table, in essence the contents of a RREQ command.
+     *
+     * @param rt The route discovery table entry.
+     * @return True if the entry was added successfully
+     */
+    bool AddEntry(Ptr<RouteDiscoveryTableEntry> rt);
+
+    /**
+     * Look up for a route discovery table entry, the seareched entry must match the id
+     * and the src address of the initiator.
+     *
+     * @param id The RREQ id (RREQ command sequence number)
+     * @param src The 16 bit address of the initiator device.
+     * @param entryFound The returned entry if found
+     * @return True if element found
+     */
+    bool LookUpEntry(uint8_t id, Mac16Address src, Ptr<RouteDiscoveryTableEntry>& entryFound);
+
+    /**
+     * Purge old entries from the route discovery table.
+     */
+    void Purge();
+
+    /**
+     * Delete an entry from the route discovery table.
+     *
+     * @param id The RREQ id of the entry to delete.
+     * @param src The src address of the initiator of the entry to delete.
+     */
+    void Delete(uint8_t id, Mac16Address src);
+
+    /**
+     * Print the contents of the route discovery table
+     *
+     * @param stream The stream object used to print the table.
+     */
+    void Print(Ptr<OutputStreamWrapper> stream);
+
+    /**
+     * Dispose of the table and all its elements
+     */
+    void Dispose();
+
+  private:
+    uint32_t m_maxTableSize; //!< The maximum size of the route discovery table
+    std::deque<Ptr<RouteDiscoveryTableEntry>> m_routeDscTable; //!< The route discovery table object
+};
+
+/**
+ *  The network layer Network Table
+ *  See Zigbee specification r22.1.0, 3.6.1.5
+ */
+class NeighborTable
+{
+  public:
+    /**
+     * The neighbor table constructor
+     */
+    NeighborTable();
+
+    /**
+     * Add an entry to the neighbor table.
+     *
+     * @param entry The entry to be added to the neighbor table.
+     * @return True if the entry was added to the table.
+     */
+    bool AddEntry(Ptr<NeighborTableEntry> entry);
+
+    /**
+     *  Look and return and entry if exists in the neighbor table.
+     *
+     * @param nwkAddr The network address used to look for an element in the table.
+     * @param entryFound The returned entry if found in the neighbor table.
+     * @return True if the entry was found false otherwise.
+     */
+    bool LookUpEntry(Mac16Address nwkAddr, Ptr<NeighborTableEntry>& entryFound);
+
+    /**
+     *  Look and return and entry if exists in the neighbor table.
+     *
+     * @param extAddr The extended address (EUI-64) used to look for an element in the table.
+     * @param entryFound The returned entry if found in the neighbor table.
+     * @return True if the entry was found false otherwise.
+     */
+    bool LookUpEntry(Mac64Address extAddr, Ptr<NeighborTableEntry>& entryFound);
+
+    /**
+     *  Look for this device Parent neighbor (A.K.A coordinator).
+     *
+     * @param entryFound The returned entry if found in the neighbor table.
+     * @return True if the parent was found in the neighbor table.
+     */
+    bool GetParent(Ptr<NeighborTableEntry>& entryFound);
+
+    /**
+     * Perform a search for the best candidate parent based on some attributes.
+     * See Association Join process , Zigbee specification R21, Section 3.6.1.4.1
+     *
+     * @param epid The extended PAN id of the network in which we look for parent candidates.
+     * @param entryFound The returned entry if found
+     * @return True if element found
+     */
+    bool LookUpForBestParent(uint64_t epid, Ptr<NeighborTableEntry>& entryFound);
+
+    /**
+     * Remove old entries from the neighbor table.
+     */
+    void Purge();
+
+    /**
+     * Delete the specified entry from the neighbor table.
+     *
+     * @param extAddr The EUI-64 of the entry to be removed from the neighbor table
+     */
+    void Delete(Mac64Address extAddr);
+
+    /**
+     * Print the neighbor table
+     *
+     * @param stream The output stream where the table is printed
+     */
+    void Print(Ptr<OutputStreamWrapper> stream) const;
+
+    /**
+     * Get the size of the neighbor table.
+     *
+     * @return The current size of the neighbor table
+     */
+    uint32_t GetSize();
+
+    /**
+     * Set the maximum size of the neighbor table
+     *
+     * @param size The size of the neighbor table.
+     */
+    void SetMaxTableSize(uint32_t size);
+
+    /**
+     *  Get the maximum size of the neighbor table.
+     *
+     *  @return The maximum size of the neighbor table.
+     */
+    uint32_t GetMaxTableSize() const;
+
+    /**
+     * Dispose of the table and all its elements
+     */
+    void Dispose();
+
+  private:
+    /**
+     *  Get the link cost based on the link quality indicator (LQI) value.
+     *  The calculation of the link cost is based on a non-linear mapping of
+     *  the lqi. A link cost of 1 is the best possible value (equivalent to 255 LQI).
+     *
+     *  @param lqi The link quality indicator value (0-255)
+     *  @return The link cost value (1-7)
+     */
+    uint8_t GetLinkCost(uint8_t lqi) const;
+
+    std::deque<Ptr<NeighborTableEntry>> m_neighborTable; //!< The neighbor table object
+    uint32_t m_maxTableSize;                             //!< The maximum size of the neighbor table
+};
+
+/**
+ *  A table storing information about upcoming route request retries. This table is use to keep
+ *  track of all RREQ retry attempts from a given device.
+ */
+class RreqRetryTable
+{
+  public:
+    /**
+     * Adds an entry to the table
+     *
+     * @param entry The RREQ retry table entry
+     * @return True if the entry was added to the table.
+     */
+    bool AddEntry(Ptr<RreqRetryTableEntry> entry);
+
+    /**
+     *  Look up for an entry in the table
+     *
+     *  @param rreqId The RREQ ID used to look up for an entry in the table
+     *  @param entryFound The returned entry if found in the table
+     *  @return True if a searched entry is found
+     */
+    bool LookUpEntry(uint8_t rreqId, Ptr<RreqRetryTableEntry>& entryFound);
+
+    /**
+     *  Delete an entry from the table using the RREQ ID
+     *
+     *  @param rreqId The RREQ ID use to delete an entry from the table
+     */
+    void Delete(uint8_t rreqId);
+
+    /**
+     * Print the neighbor table
+     *
+     * @param stream The output stream where the table is printed
+     */
+    void Print(Ptr<OutputStreamWrapper> stream) const;
+
+    /**
+     * Dispose of the table and all its elements
+     */
+    void Dispose();
+
+  private:
+    std::deque<Ptr<RreqRetryTableEntry>>
+        m_rreqRetryTable; //!< The Table containing  RREQ Table entries.
+};
+
+/**
+ * The Broadcast Transaction Table (BTT)
+ * The BTT is used to keep track of data broadcast transactions.
+ * The broadcast of link status request and route requests (RREQ) commands
+ * are handled differently and not recorded by this table.
+ * See Zigbee specification r22.1.0, Section 3.6.5
+ */
+class BroadcastTransactionTable
+{
+  public:
+    BroadcastTransactionTable();
+
+    /**
+     * Add a broadcast transaction record (BTR) to the broadcast transaction table(BTT).
+     *
+     * @param entry The object representing the BTR
+     * @return True if the object was added.
+     */
+    bool AddEntry(Ptr<BroadcastTransactionRecord> entry);
+
+    /**
+     * Get the current Size of the broadcast transaction table (BTT).
+     *
+     * @return uint32_t
+     */
+    uint32_t GetSize();
+
+    /**
+     * Set the maximum size of the broadcast transaction table (BTT)
+     *
+     * @param size The size of the broadcast transaction table (BTT).
+     */
+    void SetMaxTableSize(uint32_t size);
+
+    /**
+     *  Get the maximum size of the broadcast transaction table (BTT)
+     *
+     *  @return The maximum size of the broadcast transaction table (BTT).
+     */
+    uint32_t GetMaxTableSize() const;
+
+    /**
+     * Look up for broadcast transaction record in the broadcast transaction table (BTT).
+     *
+     * @param seq The sequence number of the broadcasted frame.
+     * @param entryFound The returned entry if found in the table
+     *
+     * @return True if a searched entry is found
+     */
+    bool LookUpEntry(uint8_t seq, Ptr<BroadcastTransactionRecord>& entryFound);
+
+    /**
+     * Purge expired entries from the broadcast transaction table (BTT).
+     */
+    void Purge();
+
+    /**
+     * Dispose of all broadcast transaction records (BTR) in the broadcast transaction table(BTT).
+     */
+    void Dispose();
+
+    /**
+     * Print the broadcast transaction table (BTT)
+     *
+     * @param stream The output stream where the table is printed
+     */
+    void Print(Ptr<OutputStreamWrapper> stream);
+
+  private:
+    uint32_t m_maxTableSize; //!< The maximum size of the Broadcast Transaction table
+    std::deque<Ptr<BroadcastTransactionRecord>>
+        m_broadcastTransactionTable; //!< The list object representing the broadcast transaction
+                                     //!< table (BTT)
+};
+
+} // namespace zigbee
+} // namespace ns3
+
+#endif /* ZIGBEE_TABLES_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/zigbee/model/zigbee-stack.cc ns-3.44/src/zigbee/model/zigbee-stack.cc
--- ns-3.43/src/zigbee/model/zigbee-stack.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/zigbee/model/zigbee-stack.cc	2025-03-09 16:55:49.823372800 -0700
@@ -0,0 +1,152 @@
+/*
+ * Copyright (c) 2024 Tokushima University, Japan
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Author:
+ *  Alberto Gallegos Ramonet <alramonet@is.tokushima-u.ac.jp>
+ */
+
+#include "zigbee-stack.h"
+
+#include "ns3/channel.h"
+#include "ns3/log.h"
+#include "ns3/node.h"
+#include "ns3/packet.h"
+#include "ns3/pointer.h"
+#include "ns3/simulator.h"
+
+using namespace ns3::lrwpan;
+
+namespace ns3
+{
+namespace zigbee
+{
+NS_LOG_COMPONENT_DEFINE("ZigbeeStack");
+NS_OBJECT_ENSURE_REGISTERED(ZigbeeStack);
+
+TypeId
+ZigbeeStack::GetTypeId()
+{
+    static TypeId tid = TypeId("ns3::zigbee::ZigbeeStack")
+                            .SetParent<Object>()
+                            .SetGroupName("Zigbee")
+                            .AddConstructor<ZigbeeStack>();
+    return tid;
+}
+
+ZigbeeStack::ZigbeeStack()
+{
+    NS_LOG_FUNCTION(this);
+
+    m_nwk = CreateObject<zigbee::ZigbeeNwk>();
+    // TODO: Create  APS layer here.
+    //  m_aps = CreateObject<zigbee::ZigbeeAps> ();
+}
+
+ZigbeeStack::~ZigbeeStack()
+{
+    NS_LOG_FUNCTION(this);
+}
+
+void
+ZigbeeStack::DoDispose()
+{
+    NS_LOG_FUNCTION(this);
+
+    m_netDevice = nullptr;
+    m_node = nullptr;
+    m_nwk = nullptr;
+    m_mac = nullptr;
+    Object::DoDispose();
+}
+
+void
+ZigbeeStack::DoInitialize()
+{
+    NS_LOG_FUNCTION(this);
+
+    AggregateObject(m_nwk);
+
+    NS_ABORT_MSG_UNLESS(m_netDevice,
+                        "Invalid NetDevice found when attempting to install ZigbeeStack");
+
+    // Make sure the NetDevice is previously initialized
+    // before using ZigbeeStack
+    m_netDevice->Initialize();
+
+    m_mac = m_netDevice->GetObject<lrwpan::LrWpanMacBase>();
+    NS_ABORT_MSG_UNLESS(m_mac,
+                        "No valid LrWpanMacBase found in this NetDevice, cannot use ZigbeeStack");
+
+    // Set NWK callback hooks with the MAC
+    m_nwk->SetMac(m_mac);
+    m_mac->SetMcpsDataIndicationCallback(MakeCallback(&ZigbeeNwk::McpsDataIndication, m_nwk));
+    m_mac->SetMlmeOrphanIndicationCallback(MakeCallback(&ZigbeeNwk::MlmeOrphanIndication, m_nwk));
+    m_mac->SetMlmeCommStatusIndicationCallback(
+        MakeCallback(&ZigbeeNwk::MlmeCommStatusIndication, m_nwk));
+    m_mac->SetMlmeBeaconNotifyIndicationCallback(
+        MakeCallback(&ZigbeeNwk::MlmeBeaconNotifyIndication, m_nwk));
+    m_mac->SetMlmeAssociateIndicationCallback(
+        MakeCallback(&ZigbeeNwk::MlmeAssociateIndication, m_nwk));
+    m_mac->SetMcpsDataConfirmCallback(MakeCallback(&ZigbeeNwk::McpsDataConfirm, m_nwk));
+    m_mac->SetMlmeScanConfirmCallback(MakeCallback(&ZigbeeNwk::MlmeScanConfirm, m_nwk));
+    m_mac->SetMlmeStartConfirmCallback(MakeCallback(&ZigbeeNwk::MlmeStartConfirm, m_nwk));
+    m_mac->SetMlmeSetConfirmCallback(MakeCallback(&ZigbeeNwk::MlmeSetConfirm, m_nwk));
+    m_mac->SetMlmeGetConfirmCallback(MakeCallback(&ZigbeeNwk::MlmeGetConfirm, m_nwk));
+    m_mac->SetMlmeAssociateConfirmCallback(MakeCallback(&ZigbeeNwk::MlmeAssociateConfirm, m_nwk));
+    // TODO: complete other callback hooks with the MAC
+
+    // Obtain Extended address as soon as NWK is set to begin operations
+    m_mac->MlmeGetRequest(MacPibAttributeIdentifier::macExtendedAddress);
+
+    // TODO: Set APS callback hooks with NWK when support for APS layer is added.
+    //       For example:
+    // m_aps->SetNwk (m_nwk);
+    // m_nwk->SetNldeDataIndicationCallback (MakeCallback (&ZigbeeAps::NldeDataIndication, m_aps));
+
+    Object::DoInitialize();
+}
+
+Ptr<Channel>
+ZigbeeStack::GetChannel() const
+{
+    return m_netDevice->GetChannel();
+}
+
+Ptr<Node>
+ZigbeeStack::GetNode() const
+{
+    return m_node;
+}
+
+Ptr<NetDevice>
+ZigbeeStack::GetNetDevice() const
+{
+    return m_netDevice;
+}
+
+void
+ZigbeeStack::SetNetDevice(Ptr<NetDevice> netDevice)
+{
+    NS_LOG_FUNCTION(this << netDevice);
+    m_netDevice = netDevice;
+    m_node = m_netDevice->GetNode();
+}
+
+Ptr<zigbee::ZigbeeNwk>
+ZigbeeStack::GetNwk() const
+{
+    return m_nwk;
+}
+
+void
+ZigbeeStack::SetNwk(Ptr<zigbee::ZigbeeNwk> nwk)
+{
+    NS_LOG_FUNCTION(this);
+    NS_ABORT_MSG_IF(ZigbeeStack::IsInitialized(), "NWK layer cannot be set after initialization");
+    m_nwk = nwk;
+}
+
+} // namespace zigbee
+} // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/zigbee/model/zigbee-stack.h ns-3.44/src/zigbee/model/zigbee-stack.h
--- ns-3.43/src/zigbee/model/zigbee-stack.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/zigbee/model/zigbee-stack.h	2025-03-09 16:55:49.823372800 -0700
@@ -0,0 +1,124 @@
+/*
+ * Copyright (c) 2024 Tokushima University, Japan
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Author:
+ *  Alberto Gallegos Ramonet <alramonet@is.tokushima-u.ac.jp>
+ */
+
+#ifndef ZIGBEE_STACK_H
+#define ZIGBEE_STACK_H
+
+#include "zigbee-nwk.h"
+
+#include "ns3/lr-wpan-mac-base.h"
+#include "ns3/lr-wpan-net-device.h"
+#include "ns3/traced-callback.h"
+
+#include <stdint.h>
+#include <string>
+
+namespace ns3
+{
+
+class Node;
+
+namespace zigbee
+{
+
+class ZigbeeNwk;
+
+/**
+ * @ingroup zigbee
+ *
+ *  Zigbee protocol stack to device interface.
+ *
+ * This class is an encapsulating class representing the protocol stack as described
+ * by the Zigbee Specification. In the current implementation only the Zigbee
+ * network layer (NWK) is included. However, this class is meant be later
+ * be extended to include other layer and sublayers part of the Zigbee Specification.
+ * The implementation is analogous to a NetDevice which encapsulates PHY and
+ * MAC layers and provide the necessary hooks. Zigbee Stack is meant to encapsulate
+ * NWK, APS, ZLC layers (and others if applicable).
+ */
+class ZigbeeStack : public Object
+{
+  public:
+    /**
+     * Get the type ID.
+     *
+     * @return the object TypeId
+     */
+    static TypeId GetTypeId();
+
+    /**
+     * Default constructor
+     */
+    ZigbeeStack();
+    ~ZigbeeStack() override;
+
+    /**
+     * Get the Channel object of the underlying LrWpanNetDevice
+     * @return The LrWpanNetDevice Channel Object
+     */
+    Ptr<Channel> GetChannel() const;
+
+    /**
+     * Get the node currently using this ZigbeeStack.
+     * @return The reference to the node object using this ZigbeeStack.
+     */
+    Ptr<Node> GetNode() const;
+
+    /**
+     * Get the NWK layer used by this ZigbeeStack.
+     *
+     * @return the NWK object
+     */
+    Ptr<ZigbeeNwk> GetNwk() const;
+
+    /**
+     * Set the NWK layer used by this ZigbeeStack.
+     *
+     * @param nwk The NWK layer object
+     */
+    void SetNwk(Ptr<ZigbeeNwk> nwk);
+
+    /**
+     *  Returns a smart pointer to the underlying NetDevice.
+     *
+     * @return A smart pointer to the underlying NetDevice.
+     */
+    Ptr<NetDevice> GetNetDevice() const;
+
+    /**
+     * Setup Zigbee to be the next set of higher layers for the specified NetDevice.
+     * All the packets incoming and outgoing from the NetDevice will be
+     * processed by ZigbeeStack.
+     *
+     * @param netDevice A smart pointer to the NetDevice used by Zigbee.
+     */
+    void SetNetDevice(Ptr<NetDevice> netDevice);
+
+  protected:
+    /**
+     * Dispose of the Objects used by the ZigbeeStack
+     */
+    void DoDispose() override;
+
+    /**
+     * Initialize of the Objects used by the ZigbeeStack
+     */
+    void DoInitialize() override;
+
+  private:
+    Ptr<lrwpan::LrWpanMacBase> m_mac; //!< The underlying LrWpan MAC connected to this Zigbee Stack.
+    Ptr<ZigbeeNwk> m_nwk;             //!< The Zigbee Network layer.
+    Ptr<Node> m_node;                 //!< The node associated with this NetDevice.
+    Ptr<NetDevice> m_netDevice;       //!< Smart pointer to the underlying NetDevice.
+};
+
+} // namespace zigbee
+} // namespace ns3
+
+#endif /* ZIGBEE_STACK_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/src/zigbee/test/zigbee-rreq-test.cc ns-3.44/src/zigbee/test/zigbee-rreq-test.cc
--- ns-3.43/src/zigbee/test/zigbee-rreq-test.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.44/src/zigbee/test/zigbee-rreq-test.cc	2025-03-09 16:55:49.823372800 -0700
@@ -0,0 +1,376 @@
+/*
+ * Copyright (c) 2024 Tokushima University, Tokushima, Japan
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Author:
+ *  Alberto Gallegos Ramonet <alramonet@is.tokushima-u.ac.jp>
+ */
+
+#include "ns3/constant-position-mobility-model.h"
+#include "ns3/core-module.h"
+#include "ns3/log.h"
+#include "ns3/lr-wpan-module.h"
+#include "ns3/packet.h"
+#include "ns3/propagation-delay-model.h"
+#include "ns3/propagation-loss-model.h"
+#include "ns3/rng-seed-manager.h"
+#include "ns3/simulator.h"
+#include "ns3/single-model-spectrum-channel.h"
+#include "ns3/zigbee-module.h"
+
+#include <iomanip>
+#include <iostream>
+
+using namespace ns3;
+using namespace ns3::lrwpan;
+using namespace ns3::zigbee;
+
+NS_LOG_COMPONENT_DEFINE("zigbee-rreq-test");
+
+/**
+ * @ingroup zigbee-test
+ * @ingroup tests
+ *
+ * Zigbee RREQ transmission retries test case
+ */
+class ZigbeeRreqRetryTestCase : public TestCase
+{
+  public:
+    ZigbeeRreqRetryTestCase();
+    ~ZigbeeRreqRetryTestCase() override;
+
+  private:
+    /**
+     * Called in response to a NLME-NETWORK-DISCOVERY.request
+     *
+     * @param testcase The pointer to the testcase
+     * @param stack The zigbee stack of the device originating the callback
+     * @param params The NLME-NETWORK-DISCOVERY.confirm parameters
+     */
+    static void NwkNetworkDiscoveryConfirm(ZigbeeRreqRetryTestCase* testcase,
+                                           Ptr<ZigbeeStack> stack,
+                                           NlmeNetworkDiscoveryConfirmParams params);
+
+    /**
+     * Called in response to a NLME-JOIN.request
+     *
+     * @param testcase The pointer to the testcase
+     * @param stack The zigbee stack of the device originating the callback
+     * @param params The NLME-JOIN.confirm parameters
+     */
+    static void NwkJoinConfirm(ZigbeeRreqRetryTestCase* testcase,
+                               Ptr<ZigbeeStack> stack,
+                               NlmeJoinConfirmParams params);
+
+    /**
+     * Called when a maximum RREQ retries are reached
+     *
+     * @param testcase The pointer to the testcase
+     * @param stack The zigbee stack of the device originating the callback
+     * @param rreqid The RREQ ID
+     * @param dst The destination Mac16Address of the RREQ
+     * @param rreqRetriesNum Maximum number of retries reached
+     */
+    static void RreqRetriesExhausted(ZigbeeRreqRetryTestCase* testcase,
+                                     Ptr<ZigbeeStack> stack,
+                                     uint8_t rreqid,
+                                     Mac16Address dst,
+                                     uint8_t rreqRetriesNum);
+    void DoRun() override;
+
+    std::vector<std::pair<uint32_t, uint32_t>>
+        m_rreqRetriesExhaustedList; //!< A list containing
+                                    //!< the RREQ ID and the allowed max retries every time the
+                                    //!< maximum RREQ retries are reached
+};
+
+ZigbeeRreqRetryTestCase::ZigbeeRreqRetryTestCase()
+    : TestCase("Zigbee: RREQ retries test")
+{
+}
+
+ZigbeeRreqRetryTestCase::~ZigbeeRreqRetryTestCase()
+{
+}
+
+void
+ZigbeeRreqRetryTestCase::NwkNetworkDiscoveryConfirm(ZigbeeRreqRetryTestCase* testcase,
+                                                    Ptr<ZigbeeStack> stack,
+                                                    NlmeNetworkDiscoveryConfirmParams params)
+{
+    // See Zigbee Specification r22.1.0, 3.6.1.4.1
+    // This method implements a simplistic version of the method implemented
+    // in a zigbee APL layer. In this layer a candidate Extended PAN Id must
+    // be selected and a NLME-JOIN.request must be issued.
+
+    if (params.m_status == NwkStatus::SUCCESS)
+    {
+        std::cout << " Network discovery confirm Received. Networks found ("
+                  << params.m_netDescList.size() << "):\n";
+
+        for (const auto& netDescriptor : params.m_netDescList)
+        {
+            std::cout << " ExtPanID: 0x" << std::hex << netDescriptor.m_extPanId << "\n"
+                      << std::dec << " CH:  " << static_cast<uint32_t>(netDescriptor.m_logCh)
+                      << "\n"
+                      << std::hex << " Pan ID: 0x" << netDescriptor.m_panId << "\n"
+                      << " Stack profile: " << std::dec
+                      << static_cast<uint32_t>(netDescriptor.m_stackProfile) << "\n"
+                      << "--------------------\n";
+        }
+
+        NlmeJoinRequestParams joinParams;
+
+        zigbee::CapabilityInformation capaInfo;
+        capaInfo.SetDeviceType(ROUTER);
+        capaInfo.SetAllocateAddrOn(true);
+
+        joinParams.m_rejoinNetwork = zigbee::JoiningMethod::ASSOCIATION;
+        joinParams.m_capabilityInfo = capaInfo.GetCapability();
+        joinParams.m_extendedPanId = params.m_netDescList[0].m_extPanId;
+
+        Simulator::ScheduleNow(&ZigbeeNwk::NlmeJoinRequest, stack->GetNwk(), joinParams);
+    }
+    else
+    {
+        NS_ABORT_MSG("Unable to discover networks | status: " << params.m_status);
+    }
+}
+
+void
+ZigbeeRreqRetryTestCase::NwkJoinConfirm(ZigbeeRreqRetryTestCase* testcase,
+                                        Ptr<ZigbeeStack> stack,
+                                        NlmeJoinConfirmParams params)
+{
+    if (params.m_status == NwkStatus::SUCCESS)
+    {
+        std::cout << Simulator::Now().As(Time::S)
+                  << " The device joined the network SUCCESSFULLY with short address " << std::hex
+                  << params.m_networkAddress << " on the Extended PAN Id: " << std::hex
+                  << params.m_extendedPanId << "\n"
+                  << std::dec;
+
+        // 3 - After dev 1 is associated, it should be started as a router
+        //     (i.e. it becomes able to accept request from other devices to join the network)
+        NlmeStartRouterRequestParams startRouterParams;
+        Simulator::ScheduleNow(&ZigbeeNwk::NlmeStartRouterRequest,
+                               stack->GetNwk(),
+                               startRouterParams);
+    }
+    else
+    {
+        std::cout << " The device FAILED to join the network with status " << params.m_status
+                  << "\n";
+    }
+}
+
+void
+ZigbeeRreqRetryTestCase::RreqRetriesExhausted(ZigbeeRreqRetryTestCase* testcase,
+                                              Ptr<ZigbeeStack> stack,
+                                              uint8_t rreqid,
+                                              Mac16Address dst,
+                                              uint8_t rreqRetriesNum)
+{
+    NS_LOG_DEBUG("RREQ retries (" << static_cast<uint32_t>(rreqRetriesNum)
+                                  << ") exhausted for destination [" << dst << "] and RREQ ID "
+                                  << static_cast<uint32_t>(rreqid));
+
+    testcase->m_rreqRetriesExhaustedList.emplace_back(
+        std::pair(stack->GetNode()->GetId(), rreqRetriesNum));
+}
+
+void
+ZigbeeRreqRetryTestCase::DoRun()
+{
+    // RREQ retries exhaustion test
+    // This test verifies that the necessary number of Route Requests are issued during
+    // zigbee's route discovery process in which a Route Reply (RREP) is not received.
+    // In this test, a coordinator and 2 routers are set in a line.
+    // The coordinator issues a route discovery primitive (NLME-ROUTE-DISCOVERY.request)
+    // to a non-existent destination (0d:10). Route request are retried a number of times
+    // depending on the origin of the request (initial request or relayed request)
+    //   Topology:
+    //
+    //     ========= RREQ(x3) =====>    ======== RREQ(x2) ===>     ==== RREQ(x2) ====>
+    //  ZC--------------------------ZR1-------------------------ZR2
+    // (Node 0)                   (Node 1)                    (Node 2)
+    //
+    // The number of retries depend on the NWK layer constants:
+    // nwkcInitialRREQRetries (Default: 3)
+    // nwkcRREQRetries (Default: 2)
+
+    LogComponentEnableAll(LogLevel(LOG_PREFIX_TIME | LOG_PREFIX_FUNC | LOG_PREFIX_NODE));
+    LogComponentEnable("zigbee-rreq-test", LOG_LEVEL_DEBUG);
+
+    RngSeedManager::SetSeed(3);
+    RngSeedManager::SetRun(4);
+
+    NodeContainer nodes;
+    nodes.Create(3);
+
+    //// Configure MAC
+
+    LrWpanHelper lrWpanHelper;
+    NetDeviceContainer lrwpanDevices = lrWpanHelper.Install(nodes);
+    Ptr<LrWpanNetDevice> dev0 = lrwpanDevices.Get(0)->GetObject<LrWpanNetDevice>();
+    Ptr<LrWpanNetDevice> dev1 = lrwpanDevices.Get(1)->GetObject<LrWpanNetDevice>();
+    Ptr<LrWpanNetDevice> dev2 = lrwpanDevices.Get(2)->GetObject<LrWpanNetDevice>();
+
+    dev0->GetMac()->SetExtendedAddress("00:00:00:00:00:00:CA:FE");
+    dev1->GetMac()->SetExtendedAddress("00:00:00:00:00:00:00:01");
+    dev2->GetMac()->SetExtendedAddress("00:00:00:00:00:00:00:02");
+
+    Ptr<SingleModelSpectrumChannel> channel = CreateObject<SingleModelSpectrumChannel>();
+    Ptr<LogDistancePropagationLossModel> propModel =
+        CreateObject<LogDistancePropagationLossModel>();
+
+    Ptr<ConstantSpeedPropagationDelayModel> delayModel =
+        CreateObject<ConstantSpeedPropagationDelayModel>();
+
+    channel->AddPropagationLossModel(propModel);
+    channel->SetPropagationDelayModel(delayModel);
+
+    dev0->SetChannel(channel);
+    dev1->SetChannel(channel);
+    dev2->SetChannel(channel);
+
+    //// Configure NWK
+
+    ZigbeeHelper zigbee;
+    ZigbeeStackContainer zigbeeStackContainer = zigbee.Install(lrwpanDevices);
+
+    Ptr<ZigbeeStack> zstack0 = zigbeeStackContainer.Get(0)->GetObject<ZigbeeStack>();
+    Ptr<ZigbeeStack> zstack1 = zigbeeStackContainer.Get(1)->GetObject<ZigbeeStack>();
+    Ptr<ZigbeeStack> zstack2 = zigbeeStackContainer.Get(2)->GetObject<ZigbeeStack>();
+
+    //// Configure Nodes Mobility
+
+    Ptr<ConstantPositionMobilityModel> dev0Mobility = CreateObject<ConstantPositionMobilityModel>();
+    dev0Mobility->SetPosition(Vector(0, 0, 0));
+    dev0->GetPhy()->SetMobility(dev0Mobility);
+
+    Ptr<ConstantPositionMobilityModel> dev1Mobility = CreateObject<ConstantPositionMobilityModel>();
+    dev1Mobility->SetPosition(Vector(90, 0, 0)); // 110 ,0,0
+    dev1->GetPhy()->SetMobility(dev1Mobility);
+
+    Ptr<ConstantPositionMobilityModel> dev2Mobility = CreateObject<ConstantPositionMobilityModel>();
+    dev2Mobility->SetPosition(Vector(170, 0, 0)); // 190,0,0
+    dev2->GetPhy()->SetMobility(dev2Mobility);
+
+    // NWK callbacks hooks, these hooks are usually directly connected to the APS layer
+    // where all these calls inform the result of a request originated the APS layer.
+    // In this test these are used to complete the Join process and router initialization
+    zstack1->GetNwk()->SetNlmeNetworkDiscoveryConfirmCallback(
+        MakeBoundCallback(&ZigbeeRreqRetryTestCase::NwkNetworkDiscoveryConfirm, this, zstack1));
+    zstack2->GetNwk()->SetNlmeNetworkDiscoveryConfirmCallback(
+        MakeBoundCallback(&ZigbeeRreqRetryTestCase::NwkNetworkDiscoveryConfirm, this, zstack2));
+
+    zstack1->GetNwk()->SetNlmeJoinConfirmCallback(
+        MakeBoundCallback(&ZigbeeRreqRetryTestCase::NwkJoinConfirm, this, zstack1));
+    zstack2->GetNwk()->SetNlmeJoinConfirmCallback(
+        MakeBoundCallback(&ZigbeeRreqRetryTestCase::NwkJoinConfirm, this, zstack2));
+
+    // Connect to traces in the NWK layer
+    zstack0->GetNwk()->TraceConnectWithoutContext(
+        "rreqRetriesExhausted",
+        MakeBoundCallback(&ZigbeeRreqRetryTestCase::RreqRetriesExhausted, this, zstack0));
+
+    zstack1->GetNwk()->TraceConnectWithoutContext(
+        "rreqRetriesExhausted",
+        MakeBoundCallback(&ZigbeeRreqRetryTestCase::RreqRetriesExhausted, this, zstack1));
+
+    zstack2->GetNwk()->TraceConnectWithoutContext(
+        "rreqRetriesExhausted",
+        MakeBoundCallback(&ZigbeeRreqRetryTestCase::RreqRetriesExhausted, this, zstack2));
+
+    // 1 - Initiate the Zigbee coordinator, start the network
+    NlmeNetworkFormationRequestParams netFormParams;
+    netFormParams.m_scanChannelList.channelPageCount = 1;
+    netFormParams.m_scanChannelList.channelsField[0] = ALL_CHANNELS;
+    netFormParams.m_scanDuration = 0;
+    netFormParams.m_superFrameOrder = 15;
+    netFormParams.m_beaconOrder = 15;
+
+    Simulator::ScheduleWithContext(zstack0->GetNode()->GetId(),
+                                   Seconds(1),
+                                   &ZigbeeNwk::NlmeNetworkFormationRequest,
+                                   zstack0->GetNwk(),
+                                   netFormParams);
+
+    // 2- Let the dev1 (Router) discovery the coordinator and join the network, after
+    //    this, it will become router itself(call to NLME-START-ROUTER.request). We
+    //    continue doing the same with the rest of the devices which will discover the
+    //    previously added routers and join the network
+    NlmeNetworkDiscoveryRequestParams netDiscParams;
+    netDiscParams.m_scanChannelList.channelPageCount = 1;
+    netDiscParams.m_scanChannelList.channelsField[0] = 0x00007800; // 0x00000800;
+    netDiscParams.m_scanDuration = 2;
+    Simulator::ScheduleWithContext(zstack1->GetNode()->GetId(),
+                                   Seconds(3),
+                                   &ZigbeeNwk::NlmeNetworkDiscoveryRequest,
+                                   zstack1->GetNwk(),
+                                   netDiscParams);
+
+    NlmeNetworkDiscoveryRequestParams netDiscParams2;
+    netDiscParams2.m_scanChannelList.channelPageCount = 1;
+    netDiscParams2.m_scanChannelList.channelsField[0] = 0x00007800; // 0x00000800;
+    netDiscParams2.m_scanDuration = 2;
+    Simulator::ScheduleWithContext(zstack2->GetNode()->GetId(),
+                                   Seconds(4),
+                                   &ZigbeeNwk::NlmeNetworkDiscoveryRequest,
+                                   zstack2->GetNwk(),
+                                   netDiscParams2);
+
+    // 5- Find a route to the given device short address
+    NlmeRouteDiscoveryRequestParams routeDiscParams;
+    routeDiscParams.m_dstAddr = Mac16Address("0d:10");
+    Simulator::ScheduleWithContext(zstack0->GetNode()->GetId(),
+                                   Seconds(8),
+                                   &ZigbeeNwk::NlmeRouteDiscoveryRequest,
+                                   zstack0->GetNwk(),
+                                   routeDiscParams);
+    Simulator::Run();
+
+    for (auto rreqRetriesExhaustedElement : m_rreqRetriesExhaustedList)
+    {
+        if (rreqRetriesExhaustedElement.first == 0)
+        {
+            // For Node with id 0 (Coordinator/RREQ originator) the number of retries is
+            // nwkcInitialRREQRetries (Default: 3)
+            NS_TEST_EXPECT_MSG_EQ(rreqRetriesExhaustedElement.second,
+                                  3,
+                                  "The number of RREQ retries from an originator should be 3");
+        }
+        else
+        {
+            // For other node other that the RREQ originator the number of retries is
+            // nwkcRREQRetries (Default: 2)
+            NS_TEST_EXPECT_MSG_EQ(rreqRetriesExhaustedElement.second,
+                                  2,
+                                  "The number of RREQ retries from a relaying node should be 2");
+        }
+    }
+
+    Simulator::Destroy();
+}
+
+/**
+ * @ingroup zigbee-test
+ * @ingroup tests
+ *
+ * Zigbee RREQ TestSuite
+ */
+class ZigbeeRreqTestSuite : public TestSuite
+{
+  public:
+    ZigbeeRreqTestSuite();
+};
+
+ZigbeeRreqTestSuite::ZigbeeRreqTestSuite()
+    : TestSuite("zigbee-rreq-test", Type::UNIT)
+{
+    AddTestCase(new ZigbeeRreqRetryTestCase, TestCase::Duration::QUICK);
+}
+
+static ZigbeeRreqTestSuite zigbeeRreqTestSuite; //!< Static variable for test initialization
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/test.py ns-3.44/test.py
--- ns-3.43/test.py	2024-10-09 16:41:10.148656800 -0700
+++ ns-3.44/test.py	2025-03-09 16:55:49.823372800 -0700
@@ -142,7 +142,14 @@
 ):
     # Look for the examples-to-run file exists.
     if not os.path.exists(examples_to_run_path):
-        return
+        # Also tests for contribs OUTSIDE the ns-3-dev directory
+        possible_external_contrib_path = examples_to_run_path.replace(
+            "contrib", f"{os.path.dirname(os.path.dirname(__file__))}/ns-3-external-contrib"
+        )
+        if os.path.exists(possible_external_contrib_path):
+            examples_to_run_path = possible_external_contrib_path
+        else:
+            return
 
     # Each tuple in the C++ list of examples to run contains
     #
@@ -1246,7 +1253,7 @@
             build_cmd = "./ns3"
 
         if sys.platform == "win32":
-            build_cmd = sys.executable + " " + build_cmd
+            build_cmd = f'"{sys.executable}" {build_cmd}'
 
         if args.verbose:
             print("Building: %s" % build_cmd)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/utils/bench-packets.cc ns-3.44/utils/bench-packets.cc
--- ns-3.43/utils/bench-packets.cc	2024-10-09 16:41:10.148656800 -0700
+++ ns-3.44/utils/bench-packets.cc	2025-03-09 16:55:49.823372800 -0700
@@ -35,13 +35,13 @@
      * deserialization was correct.  If Deserialize() has not yet been
      * called on the header, will return false.
      *
-     * \returns true if success, false if failed or if deserialization not tried
+     * @returns true if success, false if failed or if deserialization not tried
      */
     bool IsOk() const;
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId();
     TypeId GetInstanceTypeId() const override;
@@ -53,7 +53,7 @@
   private:
     /**
      * Get type name function
-     * \returns the type name string
+     * @returns the type name string
      */
     static std::string GetTypeName();
     bool m_ok; ///< variable to track whether deserialization succeeded
@@ -143,7 +143,7 @@
   public:
     /**
      * Get the bench tag name.
-     * \return the name.
+     * @return the name.
      */
     static std::string GetName()
     {
@@ -154,7 +154,7 @@
 
     /**
      * Register this type.
-     * \return The TypeId.
+     * @return The TypeId.
      */
     static TypeId GetTypeId()
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/utils/bench-scheduler.cc ns-3.44/utils/bench-scheduler.cc
--- ns-3.43/utils/bench-scheduler.cc	2024-10-09 16:41:10.148656800 -0700
+++ ns-3.44/utils/bench-scheduler.cc	2025-03-09 16:55:49.823372800 -0700
@@ -49,8 +49,8 @@
   public:
     /**
      * Constructor
-     * \param [in] population The number of events to keep in the scheduler.
-     * \param [in] total The total number of events to execute.
+     * @param [in] population The number of events to keep in the scheduler.
+     * @param [in] total The total number of events to execute.
      */
     Bench(const uint64_t population, const uint64_t total)
         : m_population(population),
@@ -62,7 +62,7 @@
     /**
      * Set the event delay interval random stream.
      *
-     * \param [in] stream The random variable stream to be used to generate
+     * @param [in] stream The random variable stream to be used to generate
      *              delays for future events.
      */
     void SetRandomStream(Ptr<RandomVariableStream> stream)
@@ -73,7 +73,7 @@
     /**
      * Set the number of events to populate the scheduler with.
      * Each event executed schedules a new event, maintaining the population.
-     * \param [in] population The number of events to keep in the scheduler.
+     * @param [in] population The number of events to keep in the scheduler.
      */
     void SetPopulation(const uint64_t population)
     {
@@ -82,7 +82,7 @@
 
     /**
      * Set the total number of events to execute.
-     * \param [in] total The total number of events to execute.
+     * @param [in] total The total number of events to execute.
      */
     void SetTotal(const uint64_t total)
     {
@@ -101,7 +101,7 @@
     /**
      *  Run the benchmark as configured.
      *
-     * \returns The Result.
+     * @returns The Result.
      */
     Result Run();
 
@@ -176,12 +176,12 @@
      *
      * Output will be in the form of a table showing performance for each run.
      *
-     * \param [in] factory Factory pre-configured to create the desired Scheduler.
-     * \param [in] pop The event population size.
-     * \param [in] total The total number of events to execute.
-     * \param [in] runs The number of replications.
-     * \param [in] eventStream The random stream of event delays.
-     * \param [in] calRev For the CalendarScheduler, whether the Reverse attribute was set.
+     * @param [in] factory Factory pre-configured to create the desired Scheduler.
+     * @param [in] pop The event population size.
+     * @param [in] total The total number of events to execute.
+     * @param [in] runs The number of replications.
+     * @param [in] eventStream The random stream of event delays.
+     * @param [in] calRev For the CalendarScheduler, whether the Reverse attribute was set.
      */
     BenchSuite(ObjectFactory& factory,
                uint64_t pop,
@@ -213,16 +213,16 @@
         /**
          * Construct from the individual run result.
          *
-         * \param [in] r The result from a single run.
-         * \returns The run result.
+         * @param [in] r The result from a single run.
+         * @returns The run result.
          */
         static Result Bench(Bench::Result r);
 
         /**
          * Log this result.
          *
-         * \tparam T The type of the label.
-         * \param label The label for the line.
+         * @tparam T The type of the label.
+         * @param label The label for the line.
          */
         template <typename T>
         void Log(T label) const;
@@ -384,8 +384,8 @@
  *
  *  If the \p filename is `-` standard input will be used.
  *
- *  \param [in] filename The delay interval source file name.
- *  \returns The RandomVariableStream.
+ *  @param [in] filename The delay interval source file name.
+ *  @returns The RandomVariableStream.
  */
 Ptr<RandomVariableStream>
 GetRandomStream(std::string filename)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/utils/check-style-clang-format.py ns-3.44/utils/check-style-clang-format.py
--- ns-3.43/utils/check-style-clang-format.py	2024-10-09 16:41:10.148656800 -0700
+++ ns-3.44/utils/check-style-clang-format.py	2025-03-09 16:55:49.823372800 -0700
@@ -13,13 +13,17 @@
 the ".clang-format" file. This script performs the following checks / fixes:
 - Check / apply clang-format. Respects clang-format guards.
 - Check / fix local #include headers with "ns3/" prefix. Respects clang-format guards.
+- Check / fix ns-3 #include headers using angle brackets <> rather than quotes "". Respects clang-format guards.
+- Check / fix Doxygen tags using @ rather than \\. Respects clang-format guards.
+- Check / fix SPDX licenses rather than GPL text. Respects clang-format guards.
+- Check / fix emacs file style comments. Respects clang-format guards.
 - Check / trim trailing whitespace. Always checked.
 - Check / replace tabs with spaces. Respects clang-format guards.
-- Check / fix SPDX licenses rather than GPL text. Respects clang-format guards.
+- Check file encoding. Always checked.
 
 This script can be applied to all text files in a given path or to individual files.
 
-NOTE: The formatting check requires clang-format (version >= 14) to be found on the path.
+NOTE: The formatting check requires clang-format to be found on the path (see the supported versions below).
 The remaining checks do not depend on clang-format and can be executed by disabling clang-format
 checking with the "--no-formatting" option.
 """
@@ -37,12 +41,8 @@
 ###########################################################
 # PARAMETERS
 ###########################################################
-CLANG_FORMAT_VERSIONS = [
-    17,
-    16,
-    15,
-    14,
-]
+CLANG_FORMAT_MAX_VERSION = 17
+CLANG_FORMAT_MIN_VERSION = 15
 
 FORMAT_GUARD_ON = [
     "// clang-format on",
@@ -76,10 +76,14 @@
 # List of checks
 CHECKS = [
     "include_prefixes",
+    "include_quotes",
+    "doxygen_tags",
+    "license",
+    "emacs",
     "whitespace",
     "tabs",
-    "license",
     "formatting",
+    "encoding",
 ]
 
 # Files to check
@@ -109,6 +113,25 @@
 ]
 
 FILE_EXTENSIONS_TO_CHECK["include_prefixes"] = FILE_EXTENSIONS_TO_CHECK["formatting"]
+FILE_EXTENSIONS_TO_CHECK["include_quotes"] = FILE_EXTENSIONS_TO_CHECK["formatting"]
+FILE_EXTENSIONS_TO_CHECK["doxygen_tags"] = FILE_EXTENSIONS_TO_CHECK["formatting"]
+FILE_EXTENSIONS_TO_CHECK["encoding"] = FILE_EXTENSIONS_TO_CHECK["formatting"]
+
+FILE_EXTENSIONS_TO_CHECK["license"] = [
+    ".c",
+    ".cc",
+    ".cmake",
+    ".h",
+    ".py",
+]
+
+FILE_EXTENSIONS_TO_CHECK["emacs"] = [
+    ".c",
+    ".cc",
+    ".h",
+    ".py",
+    ".rst",
+]
 
 FILE_EXTENSIONS_TO_CHECK["tabs"] = [
     ".c",
@@ -145,16 +168,9 @@
     ".txt",
 ]
 
-FILE_EXTENSIONS_TO_CHECK["license"] = [
-    ".c",
-    ".cc",
-    ".cmake",
-    ".h",
-    ".py",
-]
-
 # Other check parameters
 TAB_SIZE = 4
+FILE_ENCODING = "UTF-8"
 
 
 ###########################################################
@@ -253,8 +269,8 @@
     @return Path to clang-format.
     """
 
-    # Find exact version
-    for version in CLANG_FORMAT_VERSIONS:
+    # Find exact version, starting from the most recent one
+    for version in range(CLANG_FORMAT_MAX_VERSION, CLANG_FORMAT_MIN_VERSION - 1, -1):
         clang_format_path = shutil.which(f"clang-format-{version}")
 
         if clang_format_path:
@@ -262,6 +278,7 @@
 
     # Find default version and check if it is supported
     clang_format_path = shutil.which("clang-format")
+    major_version = None
 
     if clang_format_path:
         process = subprocess.run(
@@ -277,14 +294,14 @@
         if version_regex:
             major_version = int(version_regex[0][0])
 
-            if major_version in CLANG_FORMAT_VERSIONS:
+            if CLANG_FORMAT_MIN_VERSION <= major_version <= CLANG_FORMAT_MAX_VERSION:
                 return clang_format_path
 
     # No supported version of clang-format found
     raise RuntimeError(
         f"Could not find any supported version of clang-format installed on this system. "
-        f"List of supported versions: {CLANG_FORMAT_VERSIONS}. "
-        + (f"Found clang-format {major_version}." if version_regex else "")
+        f"List of supported versions: [{CLANG_FORMAT_MAX_VERSION}-{CLANG_FORMAT_MIN_VERSION}]. "
+        + (f"Found clang-format {major_version}." if major_version else "")
     )
 
 
@@ -314,10 +331,14 @@
 
     style_check_strs = {
         "include_prefixes": '#include headers from the same module with the "ns3/" prefix',
+        "include_quotes": 'ns-3 #include headers using angle brackets <> rather than quotes ""',
+        "doxygen_tags": "Doxygen tags using \\ rather than @",
+        "license": "GPL license text instead of SPDX license",
+        "emacs": "emacs file style comments",
         "whitespace": "trailing whitespace",
         "tabs": "tabs",
-        "license": "GPL license text instead of SPDX license",
         "formatting": "bad code formatting",
+        "encoding": f"bad file encoding ({FILE_ENCODING})",
     }
 
     check_style_file_functions_kwargs = {
@@ -328,18 +349,18 @@
                 "check_style_line_function": check_include_prefixes_line,
             },
         },
-        "whitespace": {
+        "include_quotes": {
             "function": check_manually_file,
             "kwargs": {
-                "respect_clang_format_guards": False,
-                "check_style_line_function": check_whitespace_line,
+                "respect_clang_format_guards": True,
+                "check_style_line_function": check_include_quotes_line,
             },
         },
-        "tabs": {
+        "doxygen_tags": {
             "function": check_manually_file,
             "kwargs": {
                 "respect_clang_format_guards": True,
-                "check_style_line_function": check_tabs_line,
+                "check_style_line_function": check_doxygen_tags_line,
             },
         },
         "license": {
@@ -349,10 +370,35 @@
                 "check_style_line_function": check_licenses_line,
             },
         },
+        "emacs": {
+            "function": check_manually_file,
+            "kwargs": {
+                "respect_clang_format_guards": True,
+                "check_style_line_function": check_emacs_line,
+            },
+        },
+        "whitespace": {
+            "function": check_manually_file,
+            "kwargs": {
+                "respect_clang_format_guards": False,
+                "check_style_line_function": check_whitespace_line,
+            },
+        },
+        "tabs": {
+            "function": check_manually_file,
+            "kwargs": {
+                "respect_clang_format_guards": True,
+                "check_style_line_function": check_tabs_line,
+            },
+        },
         "formatting": {
             "function": check_formatting_file,
             "kwargs": {},  # The formatting keywords are added below
         },
+        "encoding": {
+            "function": check_encoding_file,
+            "kwargs": {},
+        },
     }
 
     if checks_enabled["formatting"]:
@@ -509,6 +555,67 @@
     return (filename, is_file_compliant, verbose_infos)
 
 
+def check_encoding_file(
+    filename: str,
+    fix: bool,
+    verbose: bool,
+) -> Tuple[str, bool, List[str]]:
+    """
+    Check / fix the encoding of a file.
+
+    @param filename Name of the file to be checked.
+    @param fix Whether to fix (True) or just check (False) the encoding of the file.
+    @param verbose Show the lines that are not compliant with the style.
+    @return Tuple [Filename,
+                   Whether the file is compliant with the style (before the check),
+                   Verbose information].
+    """
+
+    verbose_infos: List[str] = []
+    is_file_compliant = True
+
+    with open(filename, "rb") as f:
+        file_data = f.read()
+        file_lines = file_data.decode(FILE_ENCODING, errors="replace").splitlines(keepends=True)
+
+        # Check if file has correct encoding
+        try:
+            file_data.decode(FILE_ENCODING)
+
+        except UnicodeDecodeError as e:
+            is_file_compliant = False
+
+            if verbose:
+                # Find line and column with bad encoding
+                bad_char_start_index = e.start
+                n_chars_file_read = 0
+
+                for line_number, line in enumerate(file_lines):
+                    n_chars_line = len(line)
+
+                    if bad_char_start_index < n_chars_file_read + n_chars_line:
+                        bad_char_column = bad_char_start_index - n_chars_file_read
+
+                        verbose_infos.extend(
+                            [
+                                f"{filename}:{line_number + 1}:{bad_char_column + 1}: error: bad {FILE_ENCODING} encoding",
+                                f"    {line.rstrip()}",
+                                f"    {'':>{bad_char_column}}^",
+                            ]
+                        )
+
+                        break
+
+                    n_chars_file_read += n_chars_line
+
+    # Fix file encoding
+    if fix and not is_file_compliant:
+        with open(filename, "w", encoding=FILE_ENCODING) as f:
+            f.writelines(file_lines)
+
+    return (filename, is_file_compliant, verbose_infos)
+
+
 def check_manually_file(
     filename: str,
     fix: bool,
@@ -533,7 +640,7 @@
     verbose_infos: List[str] = []
     clang_format_enabled = True
 
-    with open(filename, "r", encoding="utf-8") as f:
+    with open(filename, "r", encoding=FILE_ENCODING) as f:
         file_lines = f.readlines()
 
     for i, line in enumerate(file_lines):
@@ -567,7 +674,7 @@
 
     # Update file with the fixed lines
     if fix and not is_file_compliant:
-        with open(filename, "w", encoding="utf-8") as f:
+        with open(filename, "w", encoding=FILE_ENCODING) as f:
             f.writelines(file_lines)
 
     return (filename, is_file_compliant, verbose_infos)
@@ -617,20 +724,20 @@
                 [
                     f'{filename}:{line_number + 1}:{header_index + 1}: error: #include headers from the same module with the "ns3/" prefix detected',
                     f"    {line_stripped}",
-                    f'    {"":{header_index}}^',
+                    f"    {'':>{header_index}}^",
                 ]
             )
 
     return (is_line_compliant, line_fixed, verbose_infos)
 
 
-def check_whitespace_line(
+def check_include_quotes_line(
     line: str,
     filename: str,
     line_number: int,
 ) -> Tuple[bool, str, List[str]]:
     """
-    Check / fix whitespace in a line.
+    Check / fix ns-3 #include headers using angle brackets <> rather than quotes "" in a line.
 
     @param line The line to check.
     @param filename Name of the file to be checked.
@@ -641,29 +748,34 @@
     """
 
     is_line_compliant = True
-    line_fixed = line.rstrip() + "\n"
+    line_fixed = line
     verbose_infos: List[str] = []
 
-    if line_fixed != line:
+    # Check if the line is an #include <ns3/...>
+    header_file = re.findall(r"^#include <ns3/.*\.h>", line)
+
+    if header_file:
         is_line_compliant = False
-        line_fixed_stripped_expanded = line_fixed.rstrip().expandtabs(TAB_SIZE)
+        line_fixed = line.replace("<", '"').replace(">", '"')
+
+        header_index = len("#include ")
 
         verbose_infos = [
-            f"{filename}:{line_number + 1}:{len(line_fixed_stripped_expanded) + 1}: error: Trailing whitespace detected",
-            f"    {line_fixed_stripped_expanded}",
-            f'    {"":{len(line_fixed_stripped_expanded)}}^',
+            f"{filename}:{line_number + 1}:{header_index + 1}: error: ns-3 #include headers with angle brackets detected",
+            f"    {line}",
+            f"    {'':{header_index}}^",
         ]
 
     return (is_line_compliant, line_fixed, verbose_infos)
 
 
-def check_tabs_line(
+def check_doxygen_tags_line(
     line: str,
     filename: str,
     line_number: int,
 ) -> Tuple[bool, str, List[str]]:
     """
-    Check / fix tabs in a line.
+    Check / fix Doxygen tags using \\ rather than @ in a line.
 
     @param line The line to check.
     @param filename Name of the file to be checked.
@@ -673,21 +785,36 @@
                    Verbose information].
     """
 
+    IGNORED_WORDS = [
+        "\\dots",
+        "\\langle",
+        "\\quad",
+    ]
+
     is_line_compliant = True
     line_fixed = line
     verbose_infos: List[str] = []
 
-    tab_index = line.find("\t")
+    # Match Doxygen tags at the start of the line (e.g., "* \param arg Description")
+    line_stripped = line.rstrip()
+    regex_findings = re.findall(r"^\s*(?:\*|\/\*\*|\/\/\/)\s*(\\\w{3,})(?=(?:\s|$))", line_stripped)
 
-    if tab_index != -1:
-        is_line_compliant = False
-        line_fixed = line.expandtabs(TAB_SIZE)
+    if regex_findings:
+        doxygen_tag = regex_findings[0]
 
-        verbose_infos = [
-            f"{filename}:{line_number + 1}:{tab_index + 1}: error: Tab detected",
-            f"    {line.rstrip()}",
-            f'    {"":{tab_index}}^',
-        ]
+        if doxygen_tag not in IGNORED_WORDS:
+            is_line_compliant = False
+
+            doxygen_tag_index = line_fixed.find(doxygen_tag)
+            line_fixed = line.replace(doxygen_tag, f"@{doxygen_tag[1:]}")
+
+            verbose_infos.extend(
+                [
+                    f"{filename}:{line_number + 1}:{doxygen_tag_index + 1}: error: detected Doxygen tags using \\ rather than @",
+                    f"    {line_stripped}",
+                    f"    {'':{doxygen_tag_index}}^",
+                ]
+            )
 
     return (is_line_compliant, line_fixed, verbose_infos)
 
@@ -749,13 +876,121 @@
             [
                 f"{filename}:{line_number + 1}:{col_index}: error: GPL license text detected instead of SPDX license",
                 f"    {line_stripped}",
-                f'    {"":{col_index}}^',
+                f"    {'':>{col_index}}^",
             ]
         )
 
     return (is_line_compliant, line_fixed, verbose_infos)
 
 
+def check_emacs_line(
+    line: str,
+    filename: str,
+    line_number: int,
+) -> Tuple[bool, str, List[str]]:
+    """
+    Check / fix emacs file style comment in a line.
+
+    @param line The line to check.
+    @param filename Name of the file to be checked.
+    @param line_number The number of the line checked.
+    @return Tuple [Whether the line is compliant with the style (before the check),
+                   Fixed line,
+                   Verbose information].
+    """
+
+    is_line_compliant = True
+    line_fixed = line
+    verbose_infos: List[str] = []
+
+    # Check if line is an emacs file style comment
+    line_stripped = line.strip()
+    # fmt: off
+    emacs_line = re.search(r"c-file-style:|py-indent-offset:", line_stripped)
+    # fmt: on
+
+    if emacs_line:
+        is_line_compliant = False
+        line_fixed = ""
+        col_index = emacs_line.start()
+
+        verbose_infos = [
+            f"{filename}:{line_number + 1}:{col_index}: error: emacs file style comment detected",
+            f"    {line_stripped}",
+            f"    {'':{col_index}}^",
+        ]
+
+    return (is_line_compliant, line_fixed, verbose_infos)
+
+
+def check_whitespace_line(
+    line: str,
+    filename: str,
+    line_number: int,
+) -> Tuple[bool, str, List[str]]:
+    """
+    Check / fix whitespace in a line.
+
+    @param line The line to check.
+    @param filename Name of the file to be checked.
+    @param line_number The number of the line checked.
+    @return Tuple [Whether the line is compliant with the style (before the check),
+                   Fixed line,
+                   Verbose information].
+    """
+
+    is_line_compliant = True
+    line_fixed = line.rstrip() + "\n"
+    verbose_infos: List[str] = []
+
+    if line_fixed != line:
+        is_line_compliant = False
+        line_fixed_stripped_expanded = line_fixed.rstrip().expandtabs(TAB_SIZE)
+
+        verbose_infos = [
+            f"{filename}:{line_number + 1}:{len(line_fixed_stripped_expanded) + 1}: error: Trailing whitespace detected",
+            f"    {line_fixed_stripped_expanded}",
+            f"    {'':>{len(line_fixed_stripped_expanded)}}^",
+        ]
+
+    return (is_line_compliant, line_fixed, verbose_infos)
+
+
+def check_tabs_line(
+    line: str,
+    filename: str,
+    line_number: int,
+) -> Tuple[bool, str, List[str]]:
+    """
+    Check / fix tabs in a line.
+
+    @param line The line to check.
+    @param filename Name of the file to be checked.
+    @param line_number The number of the line checked.
+    @return Tuple [Whether the line is compliant with the style (before the check),
+                   Fixed line,
+                   Verbose information].
+    """
+
+    is_line_compliant = True
+    line_fixed = line
+    verbose_infos: List[str] = []
+
+    tab_index = line.find("\t")
+
+    if tab_index != -1:
+        is_line_compliant = False
+        line_fixed = line.expandtabs(TAB_SIZE)
+
+        verbose_infos = [
+            f"{filename}:{line_number + 1}:{tab_index + 1}: error: Tab detected",
+            f"    {line.rstrip()}",
+            f"    {'':>{tab_index}}^",
+        ]
+
+    return (is_line_compliant, line_fixed, verbose_infos)
+
+
 ###########################################################
 # MAIN
 ###########################################################
@@ -764,7 +999,8 @@
         description="Check and apply the ns-3 coding style recursively to all files in the given PATHs. "
         "The script checks the formatting of the files using clang-format and"
         " other coding style rules manually (see script arguments). "
-        "All checks respect clang-format guards, except trailing whitespace, which is always checked. "
+        "All checks respect clang-format guards, except trailing whitespace and file encoding,"
+        " which are always checked. "
         'When used in "check mode" (default), the script runs all checks in all files. '
         "If it detects non-formatted files, they will be printed and this process exits with a non-zero code. "
         'When used in "fix mode", this script automatically fixes the files and exits with 0 code.'
@@ -785,15 +1021,15 @@
     )
 
     parser.add_argument(
-        "--no-whitespace",
+        "--no-include-quotes",
         action="store_true",
-        help="Do not check / fix trailing whitespace",
+        help='Do not check / fix ns-3 #include headers using angle brackets <> rather than quotes "" (respects clang-format guards)',
     )
 
     parser.add_argument(
-        "--no-tabs",
+        "--no-doxygen-tags",
         action="store_true",
-        help="Do not check / fix tabs (respects clang-format guards)",
+        help="Do not check / fix Doxygen tags using @ rather than \\ (respects clang-format guards)",
     )
 
     parser.add_argument(
@@ -803,12 +1039,36 @@
     )
 
     parser.add_argument(
+        "--no-emacs",
+        action="store_true",
+        help="Do not check / fix emacs file style comments (respects clang-format guards)",
+    )
+
+    parser.add_argument(
+        "--no-whitespace",
+        action="store_true",
+        help="Do not check / fix trailing whitespace",
+    )
+
+    parser.add_argument(
+        "--no-tabs",
+        action="store_true",
+        help="Do not check / fix tabs (respects clang-format guards)",
+    )
+
+    parser.add_argument(
         "--no-formatting",
         action="store_true",
         help="Do not check / fix code formatting (respects clang-format guards)",
     )
 
     parser.add_argument(
+        "--no-encoding",
+        action="store_true",
+        help=f"Do not check / fix file encoding ({FILE_ENCODING})",
+    )
+
+    parser.add_argument(
         "--fix",
         action="store_true",
         help="Fix coding style issues detected in the files",
@@ -836,18 +1096,22 @@
             paths=args.paths,
             checks_enabled={
                 "include_prefixes": not args.no_include_prefixes,
+                "include_quotes": not args.no_include_quotes,
+                "doxygen_tags": not args.no_doxygen_tags,
+                "license": not args.no_licenses,
+                "emacs": not args.no_emacs,
                 "whitespace": not args.no_whitespace,
                 "tabs": not args.no_tabs,
-                "license": not args.no_licenses,
                 "formatting": not args.no_formatting,
+                "encoding": not args.no_encoding,
             },
             fix=args.fix,
             verbose=args.verbose,
             n_jobs=args.jobs,
         )
 
-    except Exception as e:
-        print("ERROR:", e)
+    except Exception as ex:
+        print("ERROR:", ex)
         sys.exit(1)
 
     if not all_checks_successful:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/utils/codespell-ignored-lines ns-3.44/utils/codespell-ignored-lines
--- ns-3.43/utils/codespell-ignored-lines	2024-10-09 16:41:10.148656800 -0700
+++ ns-3.44/utils/codespell-ignored-lines	2025-03-09 16:55:49.823372800 -0700
@@ -159,3 +159,17 @@
 
 ./doc/manual/source/working-with-docker.rst
     067a8b748816715d93ede9099132d943c04b13fcc23b3b8a7e21d23c1096cc2a
+
+./src/lte/model/cqa-ff-mac-scheduler.cc
+    std::map<LteFlowId_t, int> UEtoHOL;
+        UEtoHOL.insert(std::pair<LteFlowId_t, int>(itLogicalChannels->first, delay));
+                int hol = UEtoHOL.find(flowId)->second;
+
+./src/mesh/doc/source/mesh-design.rst
+contribution in [Hep15]_.
+when forwarding a frame (e.g., [Hep16]_), but current wifi module maintainers
+value was chosen based on the measurement results reported in [Hep16]_ which
+
+./src/mesh/doc/source/mesh-references.rst
+.. [Hep15] \C. Hepner and \A. Witt and \R. Muenzner, `Validation of the ns-3 802.11s model and proposed changes compliant to IEEE 802.11-2012 <https://www.nsnam.org/wp-content/uploads/2015/05/WNS3_2015_submission_33.pdf>`_, Poster at 2015 Workshop on ns-3, May 2015.
+.. [Hep16] \C. Hepner and \S. Moll and \R. Muenzner, `Influence of Processing Delays on the VoIP Performance for IEEE 802.11s Multihop Wireless Mesh Networks:  Comparison of ns-3 Network Simulations with Hardware Measurements <http://dl.acm.org/citation.cfm?id=3021439>`_, Proceedings of SIMUTOOLS 16, August, 2016.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/utils/codespell-ignored-words ns-3.44/utils/codespell-ignored-words
--- ns-3.43/utils/codespell-ignored-words	2024-10-09 16:41:10.148656800 -0700
+++ ns-3.44/utils/codespell-ignored-words	2025-03-09 16:55:49.823372800 -0700
@@ -1,6 +1,9 @@
 #LaTeX
 te
 
+#C++
+countr
+
 #Core
 bu
 mone
@@ -27,6 +30,7 @@
 #Wi-Fi
 aci
 fils
+usig
 
 #Wimax
 aas
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/utils/create-module.py ns-3.44/utils/create-module.py
--- ns-3.43/utils/create-module.py	2024-10-09 16:41:10.148656800 -0700
+++ ns-3.44/utils/create-module.py	2025-03-09 16:55:49.823372800 -0700
@@ -40,7 +40,7 @@
 
 /* ... */
 
-}}
+}} // namespace ns3
 """
 
 
@@ -51,20 +51,20 @@
 // Add a doxygen group for this module.
 // If you have more than one file, this should be in only one of them.
 /**
- * \defgroup {MODULE} Description of the {MODULE}
+ * @defgroup {MODULE} Description of the {MODULE}
  */
 
 namespace ns3
 {{
 
 // Each class should be documented using Doxygen,
-// and have an \ingroup {MODULE} directive
+// and have an @ingroup {MODULE} directive
 
 /* ... */
 
-}}
+}} // namespace ns3
 
-#endif /* {INCLUDE_GUARD} */
+#endif // {INCLUDE_GUARD}
 """
 
 
@@ -76,7 +76,7 @@
 
 /* ... */
 
-}}
+}} // namespace ns3
 """
 
 
@@ -90,13 +90,13 @@
 {{
 
 // Each class should be documented using Doxygen,
-// and have an \ingroup {MODULE} directive
+// and have an @ingroup {MODULE} directive
 
 /* ... */
 
-}}
+}} // namespace ns3
 
-#endif /* {INCLUDE_GUARD} */
+#endif // {INCLUDE_GUARD}
 """
 
 
@@ -113,7 +113,7 @@
 #include "ns3/{MODULE}-helper.h"
 
 /**
- * \\file
+ * @file
  *
  * Explain here what the example does.
  */
@@ -140,7 +140,6 @@
 
 
 TEST_CC_TEMPLATE = """\
-
 // Include a header file from your module to test.
 #include "ns3/{MODULE}.h"
 
@@ -154,21 +153,21 @@
 // Add a doxygen group for tests.
 // If you have more than one test, this should be in only one of them.
 /**
- * \defgroup {MODULE}-tests Tests for {MODULE}
- * \ingroup {MODULE}
- * \ingroup tests
+ * @defgroup {MODULE}-tests Tests for {MODULE}
+ * @ingroup {MODULE}
+ * @ingroup tests
  */
 
 // This is an example TestCase.
 /**
- * \ingroup {MODULE}-tests
+ * @ingroup {MODULE}-tests
  * Test case for feature 1
  */
 class {CAPITALIZED}TestCase1 : public TestCase
 {{
   public:
     {CAPITALIZED}TestCase1();
-    virtual ~{CAPITALIZED}TestCase1();
+    ~{CAPITALIZED}TestCase1() override;
 
   private:
     void DoRun() override;
@@ -194,7 +193,7 @@
 {CAPITALIZED}TestCase1::DoRun()
 {{
     // A wide variety of test macros are available in src/core/test.h
-    NS_TEST_ASSERT_MSG_EQ(true, true, "true doesn\'t equal true for some reason");
+    NS_TEST_ASSERT_MSG_EQ(true, true, "true doesn't equal true for some reason");
     // Use this one for floating point comparisons
     NS_TEST_ASSERT_MSG_EQ_TOL(0.01, 0.01, 0.001, "Numbers are not equal within tolerance");
 }}
@@ -204,7 +203,7 @@
 // this class must be defined
 
 /**
- * \ingroup {MODULE}-tests
+ * @ingroup {MODULE}-tests
  * TestSuite for module {MODULE}
  */
 class {CAPITALIZED}TestSuite : public TestSuite
@@ -213,6 +212,7 @@
     {CAPITALIZED}TestSuite();
 }};
 
+// Type for TestSuite can be UNIT, SYSTEM, EXAMPLE, or PERFORMANCE
 {CAPITALIZED}TestSuite::{CAPITALIZED}TestSuite()
     : TestSuite("{MODULE}", Type::UNIT)
 {{
@@ -222,7 +222,7 @@
 
 // Do not forget to allocate an instance of this TestSuite
 /**
- * \ingroup {MODULE}-tests
+ * @ingroup {MODULE}-tests
  * Static variable for test initialization
  */
 static {CAPITALIZED}TestSuite s{COMPOUND}TestSuite;
@@ -584,7 +584,7 @@
     #
 
     # Alphanumeric and '-' only
-    allowedRE = re.compile("^(\w|-)+$")
+    allowedRE = re.compile(r"^(\w|-)+$")
 
     project_path = None
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/utils/grid.py ns-3.44/utils/grid.py
--- ns-3.43/utils/grid.py	2024-10-09 16:41:10.148656800 -0700
+++ ns-3.44/utils/grid.py	1969-12-31 16:00:00.000000000 -0800
@@ -1,1819 +0,0 @@
-#!/usr/bin/env python3
-
-import re
-import sys
-
-import cairo
-import gtk
-
-
-## DataRange class
-class DataRange:
-    ## @var start
-    #  start
-    ## @var end
-    #  end
-    ## @var value
-    #  value
-    def __init__(self, start=0, end=0, value=""):
-        """! Initializer
-        @param self this object
-        @param start start
-        @param end end
-        @param value value
-        """
-        self.start = start
-        self.end = end
-        self.value = value
-
-
-## EventString class
-class EventString:
-    ## @var at
-    #  at
-    ## @var value
-    #  value
-    def __init__(self, at=0, value=""):
-        """! Initializer
-        @param self this object
-        @param at you
-        @param value value
-        """
-        self.at = at
-        self.value = value
-
-
-## EventFloat class
-class EventFloat:
-    ## @var at
-    #  at
-    ## @var value
-    #  value
-    def __init__(self, at=0, value=0.0):
-        """! Initializer
-        @param self this object
-        @param at you
-        @param value value
-        """
-        self.at = at
-        self.value = value
-
-
-## EventInt class
-class EventInt:
-    ## @var at
-    #  at
-    ## @var value
-    #  value
-    def __init__(self, at=0, value=0.0):
-        """! Initializer
-        @param self this object
-        @param at you
-        @param value value
-        """
-        self.at = at
-        self.value = value
-
-
-def ranges_cmp(a, b):
-    diff = a.start - b.start
-    if diff < 0:
-        return -1
-    elif diff > 0:
-        return +1
-    else:
-        return 0
-
-
-def events_cmp(a, b):
-    diff = a.at - b.at
-    if diff < 0:
-        return -1
-    elif diff > 0:
-        return +1
-    else:
-        return 0
-
-
-## TimelineDataRange
-class TimelineDataRange:
-    ## @var name
-    #  name
-    ## @var ranges
-    #  ranges
-    def __init__(self, name=""):
-        """! Initializer
-        @param self this object
-        @param name name
-        """
-        self.name = name
-        self.ranges = []
-        return
-
-    def __search(self, key):
-        """! Search
-        @param self this object
-        @param key key
-        @return index if found or -1 if not found
-        """
-        l = 0
-        u = len(self.ranges) - 1
-        while l <= u:
-            i = int((l + u) / 2)
-            if key >= self.ranges[i].start and key <= self.ranges[i].end:
-                return i
-            elif key < self.ranges[i].start:
-                u = i - 1
-            else:
-                # key > self.ranges[i].end
-                l = i + 1
-        return -1
-
-    def add_range(self, range):
-        """! Add range
-        @param self this object
-        @param range range
-        @return none
-        """
-        self.ranges.append(range)
-
-    def get_all(self):
-        """! Get all ranges
-        @param self this object
-        @return the ranges
-        """
-        return self.ranges
-
-    def get_ranges(self, start, end):
-        """! Get selected ranges
-        @param self this object
-        @param start range start
-        @param end range end
-        @return the range or and empty list
-        """
-        s = self.__search(start)
-        e = self.__search(end)
-        if s == -1 and e == -1:
-            return []
-        elif s == -1:
-            return self.ranges[0 : e + 1]
-        elif e == -1:
-            return self.ranges[s : len(self.ranges)]
-        else:
-            return self.ranges[s : e + 1]
-
-    def get_ranges_bounds(self, start, end):
-        """! Get ranges bounds
-        @param self this object
-        @param start range start
-        @param end range end
-        @return range
-        """
-        s = self.__search(start)
-        e = self.__search(end)
-        if s == -1 and e == -1:
-            return (0, 0)
-        elif s == -1:
-            return (0, e + 1)
-        elif e == -1:
-            return (s, len(self.ranges))
-        else:
-            return (s, e + 1)
-
-    def sort(self):
-        """! Sort ranges
-        @param self this object
-        @return none
-        """
-        self.ranges.sort(ranges_cmp)
-
-    def get_bounds(self):
-        """! Get bounds
-        @param self this object
-        @return the bounds
-        """
-        if len(self.ranges) > 0:
-            lo = self.ranges[0].start
-            hi = self.ranges[len(self.ranges) - 1].end
-            return (lo, hi)
-        else:
-            return (0, 0)
-
-
-## TimelineEvent class
-class TimelineEvent:
-    ## @var name
-    #  name
-    ## @var events
-    #  events
-    def __init__(self, name=""):
-        """! Get ranges bounds
-        @param self this object
-        @param name name
-        """
-        self.name = name
-        self.events = []
-
-    def __search(self, key):
-        """! Search function
-        @param self this object
-        @param key the key
-        @return event index
-        """
-        l = 0
-        u = len(self.events) - 1
-        while l <= u:
-            i = int((l + u) / 2)
-            if key == self.events[i].at:
-                return i
-            elif key < self.events[i].at:
-                u = i - 1
-            else:
-                # key > self.events[i].at
-                l = i + 1
-        return l
-
-    def add_event(self, event):
-        """! Add Event
-        @param self this object
-        @param event event to add
-        @return none
-        """
-        self.events.append(event)
-
-    def get_events(self, start, end):
-        """! Get Events
-        @param self this object
-        @param start starting event
-        @param end ending event
-        @return the events
-        """
-        s = self.__search(start)
-        e = self.__search(end)
-        return self.events[s : e + 1]
-
-    def get_events_bounds(self, start, end):
-        """! Get Events Bounds
-        @param self this object
-        @param start starting event
-        @param end ending event
-        @return event bounds
-        """
-        s = self.__search(start)
-        e = self.__search(end)
-        return (s, e + 1)
-
-    def sort(self):
-        """! Sort function
-        @param self this object
-        @return none
-        """
-        self.events.sort(events_cmp)
-
-    def get_bounds(self):
-        """! Get Bounds
-        @param self this object
-        @return the bounds
-        """
-        if len(self.events) > 0:
-            lo = self.events[0].at
-            hi = self.events[-1].at
-            return (lo, hi)
-        else:
-            return (0, 0)
-
-
-## Timeline class
-class Timeline:
-    ## @var name
-    #  name
-    ## @var ranges
-    #  ranges
-    ## @var event_str
-    #  event string
-    ## @var event_int
-    #  event int
-    def __init__(self, name=""):
-        """! Initializer
-        @param self this object
-        @param name name
-        """
-        self.ranges = []
-        self.event_str = []
-        self.event_int = []
-        self.name = name
-
-    def get_range(self, name):
-        """! Get range
-        @param self this object
-        @param name name
-        @return the range
-        """
-        for range in self.ranges:
-            if range.name == name:
-                return range
-        timeline = TimelineDataRange(name)
-        self.ranges.append(timeline)
-        return timeline
-
-    def get_event_str(self, name):
-        """! Get Event String
-        @param self this object
-        @param name name
-        @return the event string
-        """
-        for event_str in self.event_str:
-            if event_str.name == name:
-                return event_str
-        timeline = TimelineEvent(name)
-        self.event_str.append(timeline)
-        return timeline
-
-    def get_event_int(self, name):
-        """! Get Event Int
-        @param self this object
-        @param name name
-        @return eevent int
-        """
-        for event_int in self.event_int:
-            if event_int.name == name:
-                return event_int
-        timeline = TimelineEvent(name)
-        self.event_int.append(timeline)
-        return timeline
-
-    def get_ranges(self):
-        """! Get Ranges
-        @param self this object
-        @return the ranges
-        """
-        return self.ranges
-
-    def get_events_str(self):
-        """! Get Events string
-        @param self this object
-        @return event string
-        """
-        return self.event_str
-
-    def get_events_int(self):
-        """! Get Events int
-        @param self this object
-        @return evrnt int
-        """
-        return self.event_int
-
-    def sort(self):
-        """! Sort the ranges and events
-        @param self this object
-        @return none
-        """
-        for range in self.ranges:
-            range.sort()
-        for event in self.event_int:
-            event.sort()
-        for event in self.event_str:
-            event.sort()
-
-    def get_bounds(self):
-        """! Get Bounds
-        @param self this object
-        @return the bounds
-        """
-        lo = 0
-        hi = 0
-        for range in self.ranges:
-            (range_lo, range_hi) = range.get_bounds()
-            if range_lo < lo:
-                lo = range_lo
-            if range_hi > hi:
-                hi = range_hi
-        for event_str in self.event_str:
-            (ev_lo, ev_hi) = event_str.get_bounds()
-            if ev_lo < lo:
-                lo = ev_lo
-            if ev_hi > hi:
-                hi = ev_hi
-        for event_int in self.event_int:
-            (ev_lo, ev_hi) = event_int.get_bounds()
-            if ev_lo < lo:
-                lo = ev_lo
-            if ev_hi > hi:
-                hi = ev_hi
-        return (lo, hi)
-
-
-## Timelines class
-class Timelines:
-    ## @var timelines
-    #  timelines
-    def __init__(self):
-        """Initializer
-        @param self: this object
-        """
-        self.timelines = []
-
-    def get(self, name):
-        """! Get Timeline
-        @param self this object
-        @param name name
-        @return the timeline for the name
-        """
-        for timeline in self.timelines:
-            if timeline.name == name:
-                return timeline
-        timeline = Timeline(name)
-        self.timelines.append(timeline)
-        return timeline
-
-    def get_all(self):
-        """! Get All Timeline
-        @param self this object
-        @return all timelines
-        """
-        return self.timelines
-
-    def sort(self):
-        """! Sort the timelines
-        @param self this object
-        @return none
-        """
-        for timeline in self.timelines:
-            timeline.sort()
-
-    def get_bounds(self):
-        """! Get Bounds
-        @param self this object
-        @return the bounds for all timelines
-        """
-        lo = 0
-        hi = 0
-        for timeline in self.timelines:
-            (t_lo, t_hi) = timeline.get_bounds()
-            if t_lo < lo:
-                lo = t_lo
-            if t_hi > hi:
-                hi = t_hi
-        return (lo, hi)
-
-    def get_all_range_values(self):
-        """! Get All Ranges
-        @param self this object
-        @return the keys for all ranges
-        """
-        range_values = {}
-        for timeline in self.timelines:
-            for ranges in timeline.get_ranges():
-                for ran in ranges.get_all():
-                    range_values[ran.value] = 1
-        return range_values.keys()
-
-
-## Color class
-class Color:
-    ## @var r
-    #  red
-    ## @var g
-    #  green
-    ## @var b
-    #  blue
-    def __init__(self, r=0.0, g=0.0, b=0.0):
-        """! Initializer
-        @param self: this object
-        @param r: red
-        @param g: green
-        @param b: blue
-        """
-        self.r = r
-        self.g = g
-        self.b = b
-
-    def set(self, r, g, b):
-        """! Set color
-        @param self: this object
-        @param r: red
-        @param g: green
-        @param b: blue
-        @return none
-        """
-        self.r = r
-        self.g = g
-        self.b = b
-
-
-## Colors class
-class Colors:
-    ## @var __colors
-    #  colors
-    ## @var default_colors
-    #  default colors
-    ## XXX add more
-    default_colors = [
-        Color(1, 0, 0),
-        Color(0, 1, 0),
-        Color(0, 0, 1),
-        Color(1, 1, 0),
-        Color(1, 0, 1),
-        Color(0, 1, 1),
-    ]
-
-    def __init__(self):
-        """! Initializer
-        @param self this object
-        """
-        self.__colors = {}
-
-    def add(self, name, color):
-        """! Add
-        @param self this object
-        @param name name of the color
-        @param color color value
-        @return none
-        """
-        self.__colors[name] = color
-
-    def lookup(self, name):
-        """! Lookup name
-        @param self this object
-        @param name name
-        @return named color
-        """
-        if not self.__colors.has_key(name):
-            self.add(name, self.default_colors.pop())
-        return self.__colors.get(name)
-
-
-## TopLegendRenderer class
-class TopLegendRenderer:
-    ## @var __padding
-    #  padding
-    ## @var __legends
-    #  legends
-    ## @var __colors
-    #  colors
-    ## @var __width
-    #  width
-    ## @var __height
-    #  height
-    def __init__(self):
-        """! Initializer
-        @param self this object
-        """
-        self.__padding = 10
-
-    def set_padding(self, padding):
-        """! Set padding
-        @param self this object
-        @param padding padding
-        @return none
-        """
-        self.__padding = padding
-
-    def set_legends(self, legends, colors):
-        """! Set padding
-        @param self this object
-        @param legends legends
-        @param colors colors
-        @return none
-        """
-        self.__legends = legends
-        self.__colors = colors
-
-    def layout(self, width):
-        """! Set padding
-        @param self this object
-        @param width width
-        @return none
-        """
-        self.__width = width
-        surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 1, 1)
-        ctx = cairo.Context(surface)
-        line_height = 0
-        total_height = self.__padding
-        line_used = self.__padding
-        for legend in self.__legends:
-            (t_width, t_height) = ctx.text_extents(legend)[2:4]
-            item_width = self.__padding + self.__padding + t_width + self.__padding
-            item_height = t_height + self.__padding
-            if item_height > line_height:
-                line_height = item_height
-            if line_used + item_width > self.__width:
-                line_used = self.__padding + item_width
-                total_height += line_height
-            else:
-                line_used += item_width
-            x = line_used - item_width
-        total_height += line_height
-        self.__height = total_height
-
-    def get_height(self):
-        """! Set padding
-        @param self this object
-        @return height
-        """
-        return self.__height
-
-    def draw(self, ctx):
-        """! Set padding
-        @param self this object
-        @param ctx ctx
-        @return none
-        """
-        i = 0
-        line_height = 0
-        total_height = self.__padding
-        line_used = self.__padding
-        for legend in self.__legends:
-            (t_width, t_height) = ctx.text_extents(legend)[2:4]
-            item_width = self.__padding + self.__padding + t_width + self.__padding
-            item_height = t_height + self.__padding
-            if item_height > line_height:
-                line_height = item_height
-            if line_used + item_width > self.__width:
-                line_used = self.__padding + item_width
-                total_height += line_height
-            else:
-                line_used += item_width
-            x = line_used - item_width
-            ctx.rectangle(x, total_height, self.__padding, self.__padding)
-            ctx.set_source_rgb(0, 0, 0)
-            ctx.set_line_width(2)
-            ctx.stroke_preserve()
-            ctx.set_source_rgb(self.__colors[i].r, self.__colors[i].g, self.__colors[i].b)
-            ctx.fill()
-            ctx.move_to(x + self.__padding * 2, total_height + t_height)
-            ctx.set_source_rgb(0, 0, 0)
-            ctx.show_text(legend)
-            i += 1
-
-
-## TimelinesRenderer class
-class TimelinesRenderer:
-    ## @var padding
-    #  padding
-    ## @var timelines
-    #  timelines
-    ## @var colors
-    #  colors
-    ## @var start
-    #  start
-    ## @var end
-    #  end
-    ## @var left_width
-    #  left width
-    ## @var right_width
-    #  right width
-    ## @var max_text_height
-    #  maximum text height
-    ## @var width
-    #  width
-    ## @var height
-    #  height
-    ## @var grey_background
-    #  grey background
-    def __init__(self):
-        """! Initializer
-        @param self this object
-        """
-        self.padding = 10
-        return
-
-    def get_height(self):
-        """! Get Height
-        @param self this object
-        @return height
-        """
-        return self.height
-
-    def set_timelines(self, timelines, colors):
-        """! Set Timelines
-        @param self this object
-        @param timelines timelines
-        @param colors colors
-        @return none
-        """
-        self.timelines = timelines
-        self.colors = colors
-
-    def set_render_range(self, start, end):
-        """! Set Render Range
-        @param self this object
-        @param start start
-        @param end end
-        @return none
-        """
-        self.start = start
-        self.end = end
-
-    def get_data_x_start(self):
-        """! Get Data X Start
-        @param self: this object
-        @return X start
-        """
-        return (
-            self.padding / 2 + self.left_width + self.padding + self.right_width + self.padding / 2
-        )
-
-    def layout(self, width):
-        """! Get Data X Start
-        @param self this object
-        @param width width
-        @return none
-        """
-        surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 1, 1)
-        ctx = cairo.Context(surface)
-        max_text_height = ctx.text_extents(
-            "ABCDEFGHIJKLMNOPQRSTUVWXYZabcedefghijklmnopqrstuvwxyz0123456789"
-        )[3]
-
-        left_width = 0
-        right_width = 0
-        left_n_lines = 0
-        range_n = 0
-        eventint_n = 0
-        eventstr_n = 0
-        for timeline in self.timelines.get_all():
-            left_n_lines += 1
-            t_width = ctx.text_extents(timeline.name)[2]
-            left_width = max(left_width, t_width)
-            for rang in timeline.get_ranges():
-                t_width = ctx.text_extents(rang.name)[2]
-                right_width = max(right_width, t_width)
-                range_n += 1
-            for events_int in timeline.get_events_int():
-                t_width = ctx.text_extents(events_int.name)[2]
-                right_width = max(right_width, t_width)
-                eventint_n += 1
-            for events_str in timeline.get_events_str():
-                t_width = ctx.text_extents(events_str.name)[2]
-                right_width = max(right_width, t_width)
-                eventstr_n += 1
-
-        left_height = left_n_lines * max_text_height + (left_n_lines - 1) * self.padding
-        right_n_lines = range_n + eventint_n + eventstr_n
-        right_height = (right_n_lines - 1) * self.padding + right_n_lines * max_text_height
-        right_data_height = (eventint_n + eventstr_n) * (max_text_height + 5) + range_n * 10
-        right_data_height += (right_n_lines - 1) * self.padding
-
-        height = max(left_height, right_height)
-        height = max(height, right_data_height)
-
-        self.left_width = left_width
-        self.right_width = right_width
-        self.max_text_height = max_text_height
-        self.width = width
-        self.height = height + self.padding
-
-    def draw_line(self, ctx, x, y, width, height):
-        """! Draw Line
-        @param self this object
-        @param ctx ctx
-        @param x x
-        @param y y
-        @param width width
-        @param height height
-        @return none
-        """
-        ctx.move_to(x, y)
-        ctx.rel_line_to(width, height)
-        ctx.close_path()
-        ctx.set_operator(cairo.OPERATOR_SOURCE)
-        ctx.set_line_width(1.0)
-        ctx.set_source_rgb(0, 0, 0)
-        ctx.stroke()
-
-    def draw_events(self, ctx, events, x, y, width, height):
-        """! Draw Event
-        @param self this object
-        @param ctx ctx
-        @param events events
-        @param x x
-        @param y y
-        @param width width
-        @param height height
-        @return none
-        """
-        if (self.grey_background % 2) == 0:
-            ctx.rectangle(x, y - self.padding / 2, width, height + self.padding)
-            ctx.set_source_rgb(0.9, 0.9, 0.9)
-            ctx.fill()
-        last_x_drawn = int(x)
-        (lo, hi) = events.get_events_bounds(self.start, self.end)
-        for event in events.events[lo:hi]:
-            real_x = int(x + (event.at - self.start) * width / (self.end - self.start))
-            if real_x > last_x_drawn + 2:
-                ctx.rectangle(real_x, y, 1, 1)
-                ctx.set_source_rgb(1, 0, 0)
-                ctx.stroke()
-                ctx.move_to(real_x, y + self.max_text_height)
-                ctx.set_source_rgb(0, 0, 0)
-                ctx.show_text(str(event.value))
-                last_x_drawn = real_x
-        self.grey_background += 1
-
-    def draw_ranges(self, ctx, ranges, x, y, width, height):
-        """! Draw Ranges
-        @param self this object
-        @param ctx ctx
-        @param ranges ranges
-        @param x x
-        @param y y
-        @param width width
-        @param height height
-        @return none
-        """
-        if (self.grey_background % 2) == 0:
-            ctx.rectangle(x, y - self.padding / 2, width, height + self.padding)
-            ctx.set_source_rgb(0.9, 0.9, 0.9)
-            ctx.fill()
-        last_x_drawn = int(x - 1)
-        (lo, hi) = ranges.get_ranges_bounds(self.start, self.end)
-        for data_range in ranges.ranges[lo:hi]:
-            s = max(data_range.start, self.start)
-            e = min(data_range.end, self.end)
-            x_start = int(x + (s - self.start) * width / (self.end - self.start))
-            x_end = int(x + (e - self.start) * width / (self.end - self.start))
-            if x_end > last_x_drawn:
-                ctx.rectangle(x_start, y, x_end - x_start, 10)
-                ctx.set_source_rgb(0, 0, 0)
-                ctx.stroke_preserve()
-                color = self.colors.lookup(data_range.value)
-                ctx.set_source_rgb(color.r, color.g, color.b)
-                ctx.fill()
-                last_x_drawn = x_end
-
-        self.grey_background += 1
-
-    def draw(self, ctx):
-        """! Draw
-        @param self this object
-        @param ctx ctx
-        @return none
-        """
-        timeline_top = 0
-        top_y = self.padding / 2
-        left_x_start = self.padding / 2
-        left_x_end = left_x_start + self.left_width
-        right_x_start = left_x_end + self.padding
-        right_x_end = right_x_start + self.right_width
-        data_x_start = right_x_end + self.padding / 2
-        data_x_end = self.width
-        data_width = data_x_end - data_x_start
-        cur_y = top_y
-        self.draw_line(ctx, 0, 0, self.width, 0)
-        self.grey_background = 1
-        for timeline in self.timelines.get_all():
-            (y_bearing, t_width, t_height) = ctx.text_extents(timeline.name)[1:4]
-            ctx.move_to(left_x_start, cur_y + self.max_text_height - (t_height + y_bearing))
-            ctx.show_text(timeline.name)
-            for events_int in timeline.get_events_int():
-                (y_bearing, t_width, t_height) = ctx.text_extents(events_int.name)[1:4]
-                ctx.move_to(right_x_start, cur_y + self.max_text_height - (t_height + y_bearing))
-                ctx.show_text(events_int.name)
-                self.draw_events(
-                    ctx, events_int, data_x_start, cur_y, data_width, self.max_text_height + 5
-                )
-                cur_y += self.max_text_height + 5 + self.padding
-                self.draw_line(
-                    ctx,
-                    right_x_start - self.padding / 2,
-                    cur_y - self.padding / 2,
-                    self.right_width + self.padding,
-                    0,
-                )
-
-            for events_str in timeline.get_events_str():
-                (y_bearing, t_width, t_height) = ctx.text_extents(events_str.name)[1:4]
-                ctx.move_to(right_x_start, cur_y + self.max_text_height - (t_height + y_bearing))
-                ctx.show_text(events_str.name)
-                self.draw_events(
-                    ctx, events_str, data_x_start, cur_y, data_width, self.max_text_height + 5
-                )
-                cur_y += self.max_text_height + 5 + self.padding
-                self.draw_line(
-                    ctx,
-                    right_x_start - self.padding / 2,
-                    cur_y - self.padding / 2,
-                    self.right_width + self.padding,
-                    0,
-                )
-            for ranges in timeline.get_ranges():
-                (y_bearing, t_width, t_height) = ctx.text_extents(ranges.name)[1:4]
-                ctx.move_to(right_x_start, cur_y + self.max_text_height - (t_height + y_bearing))
-                ctx.show_text(ranges.name)
-                self.draw_ranges(ctx, ranges, data_x_start, cur_y, data_width, 10)
-                cur_y += self.max_text_height + self.padding
-                self.draw_line(
-                    ctx,
-                    right_x_start - self.padding / 2,
-                    cur_y - self.padding / 2,
-                    self.right_width + self.padding,
-                    0,
-                )
-            self.draw_line(ctx, 0, cur_y - self.padding / 2, self.width, 0)
-        bot_y = cur_y - self.padding / 2
-        self.draw_line(ctx, left_x_end + self.padding / 2, 0, 0, bot_y)
-        self.draw_line(ctx, right_x_end + self.padding / 2, 0, 0, bot_y)
-
-
-## ScaleRenderer class
-class ScaleRenderer:
-    ## @var __top
-    #  top
-    ## @var __lo
-    #  lo
-    ## @var __hi
-    #  hi
-    ## @var __delta
-    #  delta
-    ## @var __width
-    #  width
-    ## @var __height
-    #  height
-    ## @var max_text_height
-    #  maximum text height
-    def __init__(self):
-        """! Initializer
-        @param self this object
-        """
-        self.__top = 0
-        return
-
-    def set_bounds(self, lo, hi):
-        """! Set Bounds
-        @param self this object
-        @param lo lo
-        @param hi hi
-        @return none
-        """
-        self.__lo = lo
-        self.__hi = hi
-
-    def get_position(self, x):
-        """! Get Position
-        @param self this object
-        @param x x
-        @return real x
-        """
-        real_x = (x - self.__lo) * self.__width / (self.__hi - self.__lo)
-        return real_x
-
-    def set_top(self):
-        """! Set Top
-        @param self this object
-        @return none
-        """
-        self.__top = 1
-
-    def set_bot(self):
-        """! Set Bottom
-        @param self this object
-        @return none
-        """
-        self.__top = 0
-
-    def layout(self, width):
-        """! Layout
-        @param self this object
-        @param width width
-        @return none
-        """
-        surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 1, 1)
-        ctx = cairo.Context(surface)
-
-        # calculate scale delta
-        data_delta = self.__hi - self.__lo
-        closest = 1
-        while (closest * 10) < data_delta:
-            closest *= 10
-        if (data_delta / closest) == 0:
-            delta = closest
-        elif (data_delta / closest) == 1:
-            delta = closest / 10
-        else:
-            delta = closest
-        start = self.__lo - (self.__lo % delta) + delta
-        end = self.__hi - (self.__hi % delta)
-
-        self.__delta = delta
-        self.__width = width
-
-        # calculate text height
-        max_text_height = ctx.text_extents(
-            "ABCDEFGHIJKLMNOPQRSTUVWXYZabcedefghijklmnopqrstuvwxyz0123456789"
-        )[3]
-        self.max_text_height = max_text_height
-        height = max_text_height + 10
-        self.__height = height
-
-    def get_height(self):
-        """! Get Height
-        @param self: this object
-        @return height
-        """
-        return self.__height
-
-    def draw(self, ctx):
-        """! Draw
-        @param self this object
-        @param ctx ctx
-        @return none
-        """
-        delta = self.__delta
-        start = self.__lo - (self.__lo % delta) + delta
-        end = self.__hi - (self.__hi % delta)
-
-        if self.__top == 1:
-            s = -1
-        else:
-            s = 1
-        # print scale points
-        ctx.set_source_rgb(0, 0, 0)
-        ctx.set_line_width(1.0)
-        ticks = range(int(start), int(end + delta), int(delta))
-        for x in ticks:
-            real_x = (x - self.__lo) * self.__width / (self.__hi - self.__lo)
-            ctx.move_to(real_x, 0)
-            ctx.line_to(real_x, 5 * s)
-            ctx.close_path()
-            ctx.stroke()
-            (t_y_bearing, t_width, t_height) = ctx.text_extents(str(x))[1:4]
-            if self.__top:
-                text_delta = t_height + t_y_bearing
-            else:
-                text_delta = -t_y_bearing
-            ctx.move_to(real_x - t_width / 2, (5 + 5 + text_delta) * s)
-            ctx.show_text(str(x))
-        # draw subticks
-        delta /= 10
-        if delta > 0:
-            start = self.__lo - (self.__lo % delta) + delta
-            end = self.__hi - (self.__hi % delta)
-            for x in range(int(start), int(end + delta), int(delta)):
-                real_x = (x - self.__lo) * self.__width / (self.__hi - self.__lo)
-                ctx.move_to(real_x, 0)
-                ctx.line_to(real_x, 3 * s)
-                ctx.close_path()
-                ctx.stroke()
-
-
-## GraphicRenderer class
-class GraphicRenderer:
-    ## @var __start
-    #  start
-    ## @var __end
-    #  end
-    ## @var __mid_scale
-    #  mid scale
-    ## @var __bot_scale
-    #  bottom scale
-    ## @var __width
-    #  width
-    ## @var __height
-    #  height
-    ## @var __r_start
-    #  start
-    ## @var __r_end
-    #  end
-    ## @var __data
-    #  data
-    ## @var __mid_scale
-    #  mid scale
-    ## @var __top_legend
-    #  top legend
-    def __init__(self, start, end):
-        """! Initializer
-        @param self this object
-        @param start start
-        @param end end
-        """
-        self.__start = float(start)
-        self.__end = float(end)
-        self.__mid_scale = ScaleRenderer()
-        self.__mid_scale.set_top()
-        self.__bot_scale = ScaleRenderer()
-        self.__bot_scale.set_bounds(start, end)
-        self.__bot_scale.set_bot()
-        self.__width = 1
-        self.__height = 1
-
-    def get_width(self):
-        """! Get Width
-        @param self: this object
-        @return width
-        """
-        return self.__width
-
-    def get_height(self):
-        """! Get Height
-        @param self this object
-        @return height
-        """
-        return self.__height
-
-    # return x, y, width, height
-    def get_data_rectangle(self):
-        """! Get Data Rectangle
-        @param self this object
-        @return rectangle
-        """
-        y_start = self.__top_legend.get_height()
-        x_start = self.__data.get_data_x_start()
-        return (x_start, y_start, self.__width - x_start, self.__data.get_height())
-
-    def scale_data(self, x):
-        """! Get Data Rectangle
-        @param self this object
-        @param x x
-        @return scaled x
-        """
-        x_start = self.__data.get_data_x_start()
-        x_scaled = x / (self.__width - x_start) * (self.__r_end - self.__r_start)
-        return x_scaled
-
-    # return x, y, width, height
-    def get_selection_rectangle(self):
-        """! Get Selection Rectangle
-        @param self this object
-        @return rectangle
-        """
-        y_start = (
-            self.__top_legend.get_height()
-            + self.__data.get_height()
-            + self.__mid_scale.get_height()
-            + 20
-        )
-        y_height = self.__bot_scale.get_height() + 20
-        x_start = self.__bot_scale.get_position(self.__r_start)
-        x_end = self.__bot_scale.get_position(self.__r_end)
-        return (x_start, y_start, x_end - x_start, y_height)
-
-    def scale_selection(self, x):
-        """! Scale Selection
-        @param self this object
-        @param x the X
-        @return scaled X
-        """
-        x_scaled = x / self.__width * (self.__end - self.__start)
-        return x_scaled
-
-    def set_range(self, start, end):
-        """! Set Range
-        @param self this object
-        @param start start
-        @param end end
-        @return none
-        """
-        s = min(start, end)
-        e = max(start, end)
-        start = max(self.__start, s)
-        end = min(self.__end, e)
-        self.__r_start = start
-        self.__r_end = end
-        self.__data.set_render_range(start, end)
-        self.__mid_scale.set_bounds(start, end)
-        self.layout(self.__width, self.__height)
-
-    def get_range(self):
-        """! Get Range
-        @param self this object
-        @return range
-        """
-        return (self.__r_start, self.__r_end)
-
-    def set_data(self, data):
-        """! Set Date
-        @param self this object
-        @param data data
-        @return none
-        """
-        self.__data = data
-
-    def set_top_legend(self, top_legend):
-        """! Set Top Legend
-        @param self this object
-        @param top_legend The legend
-        @return none
-        """
-        self.__top_legend = top_legend
-
-    def layout(self, width, height):
-        """! Set Layout
-        @param self this object
-        @param width width
-        @param height height
-        @return none
-        """
-        self.__width = width
-        self.__height = height
-        self.__top_legend.layout(width)
-        top_legend_height = self.__top_legend.get_height()
-        self.__data.layout(width)
-        self.__mid_scale.layout(width - self.__data.get_data_x_start())
-        self.__bot_scale.layout(width)
-        return
-
-    def __x_pixel(self, x, width):
-        """! X Pixel
-        @param self this object
-        @param x x
-        @param width width
-        @return x pixel
-        """
-        new_x = (x - self.__start) * width / (self.__end - self.__start)
-        return new_x
-
-    def draw(self, ctx):
-        """! Draw
-        @param self this object
-        @param ctx ctx
-        @return none
-        """
-        # default background is white
-        ctx.save()
-        ctx.set_source_rgb(1, 1, 1)
-        ctx.set_operator(cairo.OPERATOR_SOURCE)
-        ctx.rectangle(0, 0, self.__width, self.__height)
-        ctx.fill()
-
-        # top legend
-        ctx.save()
-        self.__top_legend.draw(ctx)
-        top_legend_height = self.__top_legend.get_height()
-        ctx.restore()
-
-        # separation line
-        ctx.move_to(0, top_legend_height)
-        ctx.line_to(self.__width, top_legend_height)
-        ctx.close_path()
-        ctx.set_line_width(2)
-        ctx.set_source_rgb(0, 0, 0)
-        ctx.stroke()
-
-        # data
-        ctx.save()
-        ctx.translate(0, top_legend_height)
-        self.__data.draw(ctx)
-        ctx.restore()
-
-        # scale below data
-        ctx.save()
-        ctx.translate(
-            self.__data.get_data_x_start(),
-            top_legend_height + self.__data.get_height() + self.__mid_scale.get_height(),
-        )
-        self.__mid_scale.draw(ctx)
-        ctx.restore()
-
-        height_used = top_legend_height + self.__data.get_height() + self.__mid_scale.get_height()
-
-        # separation between scale and left pane
-        ctx.move_to(self.__data.get_data_x_start(), height_used)
-        ctx.rel_line_to(0, -self.__mid_scale.get_height())
-        ctx.close_path()
-        ctx.set_source_rgb(0, 0, 0)
-        ctx.set_line_width(2)
-        ctx.stroke()
-
-        # separation below scale
-        ctx.move_to(0, height_used)
-        ctx.line_to(self.__width, height_used)
-        ctx.close_path()
-        ctx.set_line_width(2)
-        ctx.set_source_rgb(0, 0, 0)
-        ctx.stroke()
-
-        select_start = self.__bot_scale.get_position(self.__r_start)
-        select_end = self.__bot_scale.get_position(self.__r_end)
-
-        # left connection between top scale and bottom scale
-        ctx.move_to(0, height_used)
-        ctx.line_to(self.__data.get_data_x_start(), height_used)
-        ctx.line_to(select_start, height_used + 20)
-        ctx.line_to(0, height_used + 20)
-        ctx.line_to(0, height_used)
-        ctx.set_source_rgb(0, 0, 0)
-        ctx.set_line_width(1)
-        ctx.stroke_preserve()
-        ctx.set_source_rgb(0.9, 0.9, 0.9)
-        ctx.fill()
-
-        # right connection between top scale and bottom scale
-        ctx.move_to(self.__width, height_used)
-        ctx.line_to(self.__width, height_used + 20)
-        ctx.line_to(select_end, height_used + 20)
-        ctx.line_to(self.__width, height_used)
-        ctx.set_source_rgb(0, 0, 0)
-        ctx.set_line_width(1)
-        ctx.stroke_preserve()
-        ctx.set_source_rgb(0.9, 0.9, 0.9)
-        ctx.fill()
-
-        height_used += 20
-
-        # unused area background
-        unused_start = self.__bot_scale.get_position(self.__r_start)
-        unused_end = self.__bot_scale.get_position(self.__r_end)
-        unused_height = self.__bot_scale.get_height() + 20
-        ctx.rectangle(0, height_used, unused_start, unused_height)
-        ctx.rectangle(unused_end, height_used, self.__width - unused_end, unused_height)
-        ctx.set_source_rgb(0.9, 0.9, 0.9)
-        ctx.fill()
-
-        # border line around bottom scale
-        ctx.move_to(unused_end, height_used)
-        ctx.line_to(self.__width, height_used)
-        ctx.line_to(self.__width, height_used + unused_height)
-        ctx.line_to(0, height_used + unused_height)
-        ctx.line_to(0, height_used)
-        ctx.line_to(unused_start, height_used)
-        ctx.close_path()
-        ctx.set_line_width(2)
-        ctx.set_source_rgb(0, 0, 0)
-        ctx.stroke()
-        ctx.move_to(unused_start, height_used)
-        ctx.line_to(unused_end, height_used)
-        ctx.close_path()
-        ctx.set_line_width(1)
-        ctx.set_source_rgb(0.9, 0.9, 0.9)
-        ctx.stroke()
-
-        # unused area dot borders
-        ctx.save()
-        ctx.move_to(max(unused_start, 2), height_used)
-        ctx.rel_line_to(0, unused_height)
-        ctx.move_to(min(unused_end, self.__width - 2), height_used)
-        ctx.rel_line_to(0, unused_height)
-        ctx.set_dash([5], 0)
-        ctx.set_source_rgb(0, 0, 0)
-        ctx.set_line_width(1)
-        ctx.stroke()
-        ctx.restore()
-
-        # bottom scale
-        ctx.save()
-        ctx.translate(0, height_used)
-        self.__bot_scale.draw(ctx)
-        ctx.restore()
-
-
-## GtkGraphicRenderer class
-class GtkGraphicRenderer(gtk.DrawingArea):
-    ## @var __data
-    #  data
-    ## @var __moving_left
-    #  moving left
-    ## @var __moving_right
-    #  moving right
-    ## @var __moving_both
-    #  moving both
-    ## @var __moving_top
-    #  moving top
-    ## @var __force_full_redraw
-    #  full redraw
-    ## @var __moving_left_cur
-    #  moving left cur
-    ## @var __moving_right_cur
-    #  moving right cur
-    ## @var __moving_both_start
-    #  moving both start
-    ## @var __moving_both_cur
-    #  moving both cur
-    ## @var __moving_top_cur
-    #  moving top cur
-    ## @var __moving_top_start
-    #  moving top start
-    ## @var __width
-    #  width
-    ## @var __height
-    #  height
-    ## @var __buffer_surface
-    # __buffer_surface
-    ## @var expose
-    #  expose function
-    ## @var size_allocate
-    #  size_allocate function
-    ## @var motion_notify
-    #  motion_notify function
-    ## @var button_press
-    #  button_press function
-    ## @var button_release
-    #  button_release function
-    def __init__(self, data):
-        """! Initializer
-        @param self this object
-        @param data data
-        """
-        super(GtkGraphicRenderer, self).__init__()
-        self.__data = data
-        self.__moving_left = False
-        self.__moving_right = False
-        self.__moving_both = False
-        self.__moving_top = False
-        self.__force_full_redraw = True
-        self.add_events(gtk.gdk.POINTER_MOTION_MASK)
-        self.add_events(gtk.gdk.BUTTON_PRESS_MASK)
-        self.add_events(gtk.gdk.BUTTON_RELEASE_MASK)
-        self.connect("expose_event", self.expose)
-        self.connect("size-allocate", self.size_allocate)
-        self.connect("motion-notify-event", self.motion_notify)
-        self.connect("button-press-event", self.button_press)
-        self.connect("button-release-event", self.button_release)
-
-    def set_smaller_zoom(self):
-        """! Set Smaller Zoom
-        @param self this object
-        @return none
-        """
-        (start, end) = self.__data.get_range()
-        self.__data.set_range(start, start + (end - start) * 2)
-        self.__force_full_redraw = True
-        self.queue_draw()
-
-    def set_bigger_zoom(self):
-        """! Set Bigger Zoom
-        @param self this object
-        @return none
-        """
-        (start, end) = self.__data.get_range()
-        self.__data.set_range(start, start + (end - start) / 2)
-        self.__force_full_redraw = True
-        self.queue_draw()
-
-    def output_png(self, filename):
-        """! Output PNG
-        @param self this object
-        @param filename file name
-        @return none
-        """
-        surface = cairo.ImageSurface(
-            cairo.FORMAT_ARGB32, self.__data.get_width(), self.__data.get_height()
-        )
-        ctx = cairo.Context(self.__buffer_surface)
-        self.__data.draw(ctx)
-        surface.write_to_png(filename)
-
-    def button_press(self, widget, event):
-        """! Button Press
-        @param self this object
-        @param widget widget
-        @param event event
-        @return true if button has been pressed otherwise false
-        """
-        (x, y, width, height) = self.__data.get_selection_rectangle()
-        (d_x, d_y, d_width, d_height) = self.__data.get_data_rectangle()
-        if event.y > y and event.y < y + height:
-            if abs(event.x - x) < 5:
-                self.__moving_left = True
-                return True
-            if abs(event.x - (x + width)) < 5:
-                self.__moving_right = True
-                return True
-            if event.x > x and event.x < x + width:
-                self.__moving_both = True
-                self.__moving_both_start = event.x
-                self.__moving_both_cur = event.x
-                return True
-        if event.y > d_y and event.y < (d_y + d_height):
-            if event.x > d_x and event.x < (d_x + d_width):
-                self.__moving_top = True
-                self.__moving_top_start = event.x
-                self.__moving_top_cur = event.x
-                return True
-        return False
-
-    def button_release(self, widget, event):
-        """! Button Release
-        @param self this object
-        @param widget widget
-        @param event event
-        @return true if button was released otherwise false
-        """
-        if self.__moving_left:
-            self.__moving_left = False
-            left = self.__data.scale_selection(self.__moving_left_cur)
-            right = self.__data.get_range()[1]
-            self.__data.set_range(left, right)
-            self.__force_full_redraw = True
-            self.queue_draw()
-            return True
-        if self.__moving_right:
-            self.__moving_right = False
-            right = self.__data.scale_selection(self.__moving_right_cur)
-            left = self.__data.get_range()[0]
-            self.__data.set_range(left, right)
-            self.__force_full_redraw = True
-            self.queue_draw()
-            return True
-        if self.__moving_both:
-            self.__moving_both = False
-            delta = self.__data.scale_selection(self.__moving_both_cur - self.__moving_both_start)
-            (left, right) = self.__data.get_range()
-            self.__data.set_range(left + delta, right + delta)
-            self.__force_full_redraw = True
-            self.queue_draw()
-            return True
-        if self.__moving_top:
-            self.__moving_top = False
-        return False
-
-    def motion_notify(self, widget, event):
-        """! Motion Notify
-        @param self this object
-        @param widget widget
-        @param event event
-        @return true if moving otherwise false
-        """
-        (x, y, width, height) = self.__data.get_selection_rectangle()
-        if self.__moving_left:
-            if event.x <= 0:
-                self.__moving_left_cur = 0
-            elif event.x >= x + width:
-                self.__moving_left_cur = x + width
-            else:
-                self.__moving_left_cur = event.x
-            self.queue_draw_area(0, int(y), int(self.__width), int(height))
-            return True
-        if self.__moving_right:
-            if event.x >= self.__width:
-                self.__moving_right = self.__width
-            elif event.x < x:
-                self.__moving_right_cur = x
-            else:
-                self.__moving_right_cur = event.x
-            self.queue_draw_area(0, int(y), int(self.__width), int(height))
-            return True
-        if self.__moving_both:
-            cur_e = self.__width - (x + width - self.__moving_both_start)
-            cur_s = self.__moving_both_start - x
-            if event.x < cur_s:
-                self.__moving_both_cur = cur_s
-            elif event.x > cur_e:
-                self.__moving_both_cur = cur_e
-            else:
-                self.__moving_both_cur = event.x
-            self.queue_draw_area(0, int(y), int(self.__width), int(height))
-            return True
-        if self.__moving_top:
-            self.__moving_top_cur = event.x
-            delta = self.__data.scale_data(self.__moving_top_start - self.__moving_top_cur)
-            (left, right) = self.__data.get_range()
-            self.__data.set_range(left + delta, right + delta)
-            self.__force_full_redraw = True
-            self.__moving_top_start = event.x
-            self.queue_draw()
-            return True
-        (d_x, d_y, d_width, d_height) = self.__data.get_data_rectangle()
-        if event.y > y and event.y < y + height:
-            if abs(event.x - x) < 5 or abs(event.x - (x + width)) < 5:
-                widget.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.SB_H_DOUBLE_ARROW))
-                return True
-            if event.x > x and event.x < x + width:
-                widget.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.FLEUR))
-                return True
-        if event.y > d_y and event.y < (d_y + d_height):
-            if event.x > d_x and event.x < (d_x + d_width):
-                widget.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.FLEUR))
-                return True
-        widget.window.set_cursor(None)
-        return False
-
-    def size_allocate(self, widget, allocation):
-        """! Size Allocate
-        @param self this object
-        @param widget widget
-        @param allocation allocation
-        @return none
-        """
-        self.__width = allocation.width
-        self.__height = allocation.height
-        self.__data.layout(allocation.width, allocation.height)
-        self.__force_full_redraw = True
-        self.queue_draw()
-
-    def expose(self, widget, event):
-        """! Expose
-        @param self this object
-        @param widget widget
-        @param event event
-        @return false
-        """
-        if self.__force_full_redraw:
-            self.__buffer_surface = cairo.ImageSurface(
-                cairo.FORMAT_ARGB32, self.__data.get_width(), self.__data.get_height()
-            )
-            ctx = cairo.Context(self.__buffer_surface)
-            self.__data.draw(ctx)
-            self.__force_full_redraw = False
-        ctx = widget.window.cairo_create()
-        ctx.rectangle(event.area.x, event.area.y, event.area.width, event.area.height)
-        ctx.clip()
-        ctx.set_source_surface(self.__buffer_surface)
-        ctx.paint()
-        (x, y, width, height) = self.__data.get_selection_rectangle()
-        if self.__moving_left:
-            ctx.move_to(max(self.__moving_left_cur, 2), y)
-            ctx.rel_line_to(0, height)
-            ctx.close_path()
-            ctx.set_line_width(1)
-            ctx.set_source_rgb(0, 0, 0)
-            ctx.stroke()
-        if self.__moving_right:
-            ctx.move_to(min(self.__moving_right_cur, self.__width - 2), y)
-            ctx.rel_line_to(0, height)
-            ctx.close_path()
-            ctx.set_line_width(1)
-            ctx.set_source_rgb(0, 0, 0)
-            ctx.stroke()
-        if self.__moving_both:
-            delta_x = self.__moving_both_cur - self.__moving_both_start
-            left_x = x + delta_x
-            ctx.move_to(x + delta_x, y)
-            ctx.rel_line_to(0, height)
-            ctx.close_path()
-            ctx.move_to(x + width + delta_x, y)
-            ctx.rel_line_to(0, height)
-            ctx.close_path()
-            ctx.set_source_rgb(0, 0, 0)
-            ctx.set_line_width(1)
-            ctx.stroke()
-        return False
-
-
-## MainWindow class
-class MainWindow:
-    ## @var __window
-    #  window
-    ## @var __render
-    #  render
-    ## @var __dialog
-    #  dialog
-    ## @var __set_smaller_cb
-    #  __set_smaller_cb function
-    ## @var __set_bigger_cb
-    #  __set_bigger_cb function
-    ## @var __output_png_cb
-    #  __output_png_cb function
-    ## @var __dialog_response_cb
-    #  __dialog_response_cb function
-    def __init__(self):
-        """! Initializer
-        @param self this object
-        """
-        return
-
-    def run(self, graphic):
-        """! Run function
-        @param self this object
-        @param graphic graphic
-        @return none
-        """
-        window = gtk.Window()
-        self.__window = window
-        window.set_default_size(200, 200)
-        vbox = gtk.VBox()
-        window.add(vbox)
-        render = GtkGraphicRenderer(graphic)
-        self.__render = render
-        vbox.pack_end(render, True, True, 0)
-        hbox = gtk.HBox()
-        vbox.pack_start(hbox, False, False, 0)
-        smaller_zoom = gtk.Button("Zoom Out")
-        smaller_zoom.connect("clicked", self.__set_smaller_cb)
-        hbox.pack_start(smaller_zoom)
-        bigger_zoom = gtk.Button("Zoom In")
-        bigger_zoom.connect("clicked", self.__set_bigger_cb)
-        hbox.pack_start(bigger_zoom)
-        output_png = gtk.Button("Output Png")
-        output_png.connect("clicked", self.__output_png_cb)
-        hbox.pack_start(output_png)
-        window.connect("destroy", gtk.main_quit)
-        window.show_all()
-        # gtk.bindings_activate(gtk.main_quit, 'q', 0)
-        gtk.main()
-
-    def __set_smaller_cb(self, widget):
-        """! Set Smaller Callback
-        @param self this object
-        @param widget widget
-        @return none
-        """
-        self.__render.set_smaller_zoom()
-
-    def __set_bigger_cb(self, widget):
-        """! Set Bigger Callback
-        @param self this object
-        @param widget widget
-        @return none
-        """
-        self.__render.set_bigger_zoom()
-
-    def __output_png_cb(self, widget):
-        """! Output PNG Callback
-        @param self this object
-        @param widget widget
-        @return none
-        """
-        dialog = gtk.FileChooserDialog(
-            "Output Png", self.__window, gtk.FILE_CHOOSER_ACTION_SAVE, ("Save", 1)
-        )
-        self.__dialog = dialog
-        dialog.set_default_response(1)
-        dialog.connect("response", self.__dialog_response_cb)
-        dialog.show()
-
-    def __dialog_response_cb(self, widget, response):
-        """! Dialog Response Callback
-        @param self this object
-        @param widget widget
-        @param response response
-        @return none
-        """
-        if response == 1:
-            filename = self.__dialog.get_filename()
-            self.__render.output_png(filename)
-            widget.hide()
-
-
-## read_data function
-def read_data(filename):
-    timelines = Timelines()
-    colors = Colors()
-    m1 = re.compile("range ([^ ]+) ([^ ]+) ([^ ]+) ([0-9]+) ([0-9]+)")
-    m2 = re.compile("event-str ([^ ]+) ([^ ]+) ([^ ]+) ([0-9]+)")
-    m3 = re.compile("event-int ([^ ]+) ([^ ]+) ([0-9]+) ([0-9]+)")
-    m4 = re.compile("color ([^ ]+) #([a-fA-F0-9]{2,2})([a-fA-F0-9]{2,2})([a-fA-F0-9]{2,2})")
-
-    with open(filename, encoding="utf-8") as fh:
-        for line in fh.readlines():
-            m = m1.match(line)
-            if m:
-                line_name = m.group(1)
-                timeline = timelines.get(m.group(1))
-                rang = timeline.get_range(m.group(2))
-                data_range = DataRange()
-                data_range.value = m.group(3)
-                data_range.start = int(m.group(4))
-                data_range.end = int(m.group(5))
-                rang.add_range(data_range)
-                continue
-            m = m2.match(line)
-            if m:
-                line_name = m.group(1)
-                timeline = timelines.get(m.group(1))
-                ev = timeline.get_event_str(m.group(2))
-                event = EventString()
-                event.value = m.group(3)
-                event.at = int(m.group(4))
-                ev.add_event(event)
-                continue
-            m = m3.match(line)
-            if m:
-                line_name = m.group(1)
-                timeline = timelines.get(m.group(1))
-                ev = timeline.get_event_int(m.group(2))
-                event = EventInt()
-                event.value = int(m.group(3))
-                event.at = int(m.group(4))
-                ev.add_event(event)
-                continue
-
-            m = m4.match(line)
-            if m:
-                r = int(m.group(2), 16)
-                g = int(m.group(3), 16)
-                b = int(m.group(4), 16)
-                color = Color(r / 255, g / 255, b / 255)
-                colors.add(m.group(1), color)
-                continue
-    timelines.sort()
-    return (colors, timelines)
-
-
-def main():
-    (colors, timelines) = read_data(sys.argv[1])
-    (lower_bound, upper_bound) = timelines.get_bounds()
-    graphic = GraphicRenderer(lower_bound, upper_bound)
-    top_legend = TopLegendRenderer()
-    range_values = timelines.get_all_range_values()
-    range_colors = []
-    for range_value in range_values:
-        range_colors.append(colors.lookup(range_value))
-    top_legend.set_legends(range_values, range_colors)
-    graphic.set_top_legend(top_legend)
-    data = TimelinesRenderer()
-    data.set_timelines(timelines, colors)
-    graphic.set_data(data)
-
-    # default range
-    range_mid = (upper_bound - lower_bound) / 2
-    range_width = (upper_bound - lower_bound) / 10
-    range_lo = range_mid - range_width / 2
-    range_hi = range_mid + range_width / 2
-    graphic.set_range(range_lo, range_hi)
-
-    main_window = MainWindow()
-    main_window.run(graphic)
-
-
-main()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/utils/perf/perf-io.cc ns-3.44/utils/perf/perf-io.cc
--- ns-3.43/utils/perf/perf-io.cc	2024-10-09 16:41:10.148656800 -0700
+++ ns-3.44/utils/perf/perf-io.cc	2025-03-09 16:55:49.823372800 -0700
@@ -13,14 +13,14 @@
 using namespace ns3;
 
 /**
- * \ingroup system-tests-perf
+ * @ingroup system-tests-perf
  *
  * Check the performance of writing to file.
  *
- * \param file The file to write to.
- * \param n The number of writes to perform.
- * \param buffer The buffer to write.
- * \param size The buffer size.
+ * @param file The file to write to.
+ * @param n The number of writes to perform.
+ * @param buffer The buffer to write.
+ * @param size The buffer size.
  */
 void
 PerfFile(FILE* file, uint32_t n, const char* buffer, uint32_t size)
@@ -35,14 +35,14 @@
 }
 
 /**
- * \ingroup system-tests-perf
+ * @ingroup system-tests-perf
  *
  * Check the performance of writing to an output stream.
  *
- * \param stream The output stream to write to.
- * \param n The number of writes to perform.
- * \param buffer The buffer to write.
- * \param size The buffer size.
+ * @param stream The output stream to write to.
+ * @param n The number of writes to perform.
+ * @param buffer The buffer to write.
+ * @param size The buffer size.
  */
 void
 PerfStream(std::ostream& stream, uint32_t n, const char* buffer, uint32_t size)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/utils/print-introspected-doxygen.cc ns-3.44/utils/print-introspected-doxygen.cc
--- ns-3.43/utils/print-introspected-doxygen.cc	2024-10-09 16:41:10.148656800 -0700
+++ ns-3.44/utils/print-introspected-doxygen.cc	2025-03-09 16:55:49.823372800 -0700
@@ -7,8 +7,8 @@
  */
 
 /**
- * \file
- * \ingroup utils
+ * @file
+ * @ingroup utils
  * Generate documentation from the TypeId database.
  */
 
@@ -91,8 +91,8 @@
 
 /**
  * Alphabetize the AttributeInformation for a TypeId by the Attribute name
- * \param tid The TypeId to process.
- * \return The ordered list of Attributes.
+ * @param tid The TypeId to process.
+ * @return The ordered list of Attributes.
  */
 std::map<std::string, ns3::TypeId::AttributeInformation>
 SortedAttributeInfo(const TypeId tid)
@@ -109,8 +109,8 @@
 /**
  * Alphabetize the TraceSourceInformation for a TypeId by the
  * TraceSource name.
- * \param tid The TypeId to process.
- * \return The ordered list of TraceSourceInformation
+ * @param tid The TypeId to process.
+ * @return The ordered list of TraceSourceInformation
  */
 std::map<std::string, ns3::TypeId::TraceSourceInformation>
 SortedTraceSourceInfo(const TypeId tid)
@@ -238,55 +238,55 @@
     /**
      * Record the a -> b aggregation relation.
      *
-     * \param a [in] the source(?) TypeId name
-     * \param b [in] the destination(?) TypeId name
+     * @param a [in] the source(?) TypeId name
+     * @param b [in] the destination(?) TypeId name
      */
     void RecordAggregationInfo(std::string a, std::string b);
     /**
      * Gather aggregation and configuration path information for tid
      *
-     * \param tid [in] the TypeId to gather information from
+     * @param tid [in] the TypeId to gather information from
      */
     void Gather(TypeId tid);
     /**
      * Print output in "a -> b" form on the stream.
-     * \param [in,out] os The output stream.
+     * @param [in,out] os The output stream.
      */
     void Print(std::ostream& os) const;
 
     /**
-     * \return the configuration paths for tid
+     * @return the configuration paths for tid
      *
-     * \param tid [in] the TypeId to return information for
+     * @param tid [in] the TypeId to return information for
      */
     std::vector<std::string> Get(TypeId tid) const;
 
     /**
-     * \return the type names we couldn't aggregate.
+     * @return the type names we couldn't aggregate.
      */
     std::vector<std::string> GetNoTypeIds() const;
 
   private:
     /**
-     * \return the current configuration path
+     * @return the current configuration path
      */
     std::string GetCurrentPath() const;
     /**
      * Gather attribute, configuration path information for tid
      *
-     * \param tid [in] the TypeId to gather information from
+     * @param tid [in] the TypeId to gather information from
      */
     void DoGather(TypeId tid);
     /**
      *  Record the current config path for tid.
      *
-     * \param tid [in] the TypeId to record.
+     * @param tid [in] the TypeId to record.
      */
     void RecordOutput(TypeId tid);
     /**
-     * \return whether the tid has already been processed
+     * @return whether the tid has already been processed
      *
-     * \param tid [in] the TypeId to check.
+     * @param tid [in] the TypeId to check.
      */
     bool HasAlreadyBeenProcessed(TypeId tid) const;
     /**
@@ -407,8 +407,8 @@
  * The container elements must support \c operator< (for \c std::sort)
  * and \c operator== (for \c std::unique).
  *
- * \tparam T \deduced The container type.
- * \param t The container.
+ * @tparam T \deduced The container type.
+ * @param t The container.
  */
 template <typename T>
 void
@@ -453,7 +453,7 @@
 
             // See if this is a pointer to an Object.
             Ptr<Object> object = CreateObject<Object>();
-            TypeId objectTypeId = object->GetTypeId();
+            TypeId objectTypeId = Object::GetTypeId();
             if (objectTypeId == pointee)
             {
                 // Stop the recursion at this attribute if it is a
@@ -523,7 +523,7 @@
 /// Register aggregation relationships that are not automatically
 /// detected by this introspection program.  Statements added here
 /// result in more configuration paths being added to the doxygen.
-/// \return instance of StaticInformation with the registered information
+/// @return instance of StaticInformation with the registered information
 StaticInformation
 GetTypicalAggregations()
 {
@@ -565,8 +565,8 @@
     info.RecordAggregationInfo("ns3::Node", "ns3::dsdv::RoutingProtocol");
     info.RecordAggregationInfo("ns3::Node", "ns3::dsr::DsrRouting");
     info.RecordAggregationInfo("ns3::Node", "ns3::olsr::RoutingProtocol");
-    info.RecordAggregationInfo("ns3::Node", "ns3::EnergyHarvesterContainer");
-    info.RecordAggregationInfo("ns3::Node", "ns3::EnergySourceContainer");
+    info.RecordAggregationInfo("ns3::Node", "ns3::energy::EnergyHarvesterContainer");
+    info.RecordAggregationInfo("ns3::Node", "ns3::energy::EnergySourceContainer");
 
     // Create a channel object so that channels appear in the namespace
     // paths that will be generated here.
@@ -591,7 +591,7 @@
  * Create a map from the class names to their index in the vector of
  * TypeId's so that the names will end up in alphabetical order.
  *
- * \returns NameMap
+ * @returns NameMap
  */
 NameMap
 GetNameMap()
@@ -647,7 +647,7 @@
 
 /**
  * Get a sorted list of TypeId groups
- * \returns a map of group name and associated TypeIds
+ * @returns a map of group name and associated TypeIds
  */
 GroupsList_t
 GetGroupsList()
@@ -686,30 +686,16 @@
 
 /**
  * Print the support level for an Attribute or TraceSource
- * \param os the output stream
- * \param supportLevel the SupportLevel
- * \param supportMsg optional support message
+ * @param os the output stream
+ * @param supportLevel the SupportLevel
+ * @param supportMsg optional support message
  */
 void
 PrintSupportLevel(std::ostream& os, TypeId::SupportLevel supportLevel, std::string supportMsg)
 {
     os << "    " << listLineStart << "Support level: ";
-    os << flagSpanStart;
-    switch (supportLevel)
-    {
-    case TypeId::SUPPORTED:
-        os << "SUPPORTED";
-        break;
-    case TypeId::DEPRECATED:
-        os << "DEPRECATED";
-        break;
-    case TypeId::OBSOLETE:
-        os << "OBSOLETE";
-        break;
-    default:
-        os << "UNKNOWN";
-    }
-    os << flagSpanStop;
+    os << flagSpanStart << supportLevel << flagSpanStop;
+
     if (!supportMsg.empty())
     {
         os << ": " << supportMsg;
@@ -719,8 +705,8 @@
 
 /**
  * Print config paths
- * \param os the output stream
- * \param tid the type ID
+ * @param os the output stream
+ * @param tid the type ID
  */
 void
 PrintConfigPaths(std::ostream& os, const TypeId tid)
@@ -754,8 +740,8 @@
  *
  * Only attributes defined directly by this TypeId will be printed.
  *
- * \param [in,out] os The output stream.
- * \param [in] tid The TypeId to print.
+ * @param [in,out] os The output stream.
+ * @param [in] tid The TypeId to print.
  */
 void
 PrintAttributesTid(std::ostream& os, const TypeId tid)
@@ -867,8 +853,8 @@
  * All Attributes of this TypeId will be printed,
  * including those defined in parent classes.
  *
- * \param [in,out] os The output stream.
- * \param [in] tid The TypeId to print.
+ * @param [in,out] os The output stream.
+ * @param [in] tid The TypeId to print.
  */
 void
 PrintAttributes(std::ostream& os, const TypeId tid)
@@ -904,8 +890,8 @@
  *
  * Only Trace sources defined directly by this TypeId will be printed.
  *
- * \param [in,out] os The output stream.
- * \param [in] tid The TypeId to print.
+ * @param [in,out] os The output stream.
+ * @param [in] tid The TypeId to print.
  */
 void
 PrintTraceSourcesTid(std::ostream& os, const TypeId tid)
@@ -941,8 +927,8 @@
  * All Trace sources of this TypeId will be printed,
  * including those defined in parent classes.
  *
- * \param [in,out] os The output stream.
- * \param [in] tid The TypeId to print.
+ * @param [in,out] os The output stream.
+ * @param [in] tid The TypeId to print.
  */
 void
 PrintTraceSources(std::ostream& os, const TypeId tid)
@@ -976,8 +962,8 @@
 /**
  * Print the size of the type represented by this tid.
  *
- * \param [in,out] os The output stream.
- * \param [in] tid The TypeId to print.
+ * @param [in,out] os The output stream.
+ * @param [in] tid The TypeId to print.
  */
 void
 PrintSize(std::ostream& os, const TypeId tid)
@@ -994,8 +980,8 @@
 /**
  * Print the doxy block for a single TypeId
  *
- * \param [in,out] os The output stream.
- * \param [in] tid the TypeId
+ * @param [in,out] os The output stream.
+ * @param [in] tid the TypeId
  */
 void
 PrintTypeIdBlock(std::ostream& os, const TypeId tid)
@@ -1027,7 +1013,7 @@
 /**
  * Print the doxy block for each TypeId
  *
- * \param [in,out] os The output stream.
+ * @param [in,out] os The output stream.
  */
 void
 PrintTypeIdBlocks(std::ostream& os)
@@ -1059,7 +1045,7 @@
 /**
  * Print the list of all TypeIds
  *
- * \param [in,out] os The output stream.
+ * @param [in,out] os The output stream.
  */
 void
 PrintAllTypeIds(std::ostream& os)
@@ -1098,9 +1084,9 @@
 /**
  * Print the list of all Attributes.
  *
- * \param [in,out] os The output stream.
+ * @param [in,out] os The output stream.
  *
- * \todo Print this sorted by class (the current version)
+ * @todo Print this sorted by class (the current version)
  * as well as by Attribute name.
  */
 void
@@ -1150,7 +1136,7 @@
 /**
  * Print the list of all global variables.
  *
- * \param [in,out] os The output stream.
+ * @param [in,out] os The output stream.
  */
 void
 PrintAllGlobals(std::ostream& os)
@@ -1178,7 +1164,7 @@
 /**
  * Print the list of all groups
  *
- * \param [in,out] os The output stream.
+ * @param [in,out] os The output stream.
  */
 void
 PrintAllGroups(std::ostream& os)
@@ -1210,7 +1196,7 @@
 /**
  * Print the list of all LogComponents.
  *
- * \param [in,out] os The output stream.
+ * @param [in,out] os The output stream.
  */
 void
 PrintAllLogComponents(std::ostream& os)
@@ -1220,7 +1206,7 @@
     os << "This is a list of all" << reference << "ns3::LogComponent instances.\n" << std::endl;
 
     /**
-     * \todo Switch to a border-less table, so the file links align
+     * @todo Switch to a border-less table, so the file links align
      * See https://www.doxygen.nl/manual/htmlcmds.html
      */
     LogComponent::ComponentList* logs = LogComponent::GetComponentList();
@@ -1269,9 +1255,9 @@
 /**
  * Print the list of all Trace sources.
  *
- * \param [in,out] os The output stream.
+ * @param [in,out] os The output stream.
  *
- * \todo Print this sorted by class (the current version)
+ * @todo Print this sorted by class (the current version)
  * as well as by TraceSource name.
  */
 void
@@ -1328,14 +1314,14 @@
  * Print the section definition for an AttributeValue.
  *
  * In doxygen form this will print a comment block with
- * \verbatim
- *   \ingroup attributes
- *   \defgroup attribute_<name>Value <name>Value
- * \endverbatim
- *
- * \param [in,out] os The output stream.
- * \param [in] name The base name of the resulting AttributeValue type.
- * \param [in] seeBase Print a "see also" pointing to the base class.
+ * @verbatim
+ *   @ingroup attributes
+ *   @defgroup attribute_<name>Value <name>Value
+ * @endverbatim
+ *
+ * @param [in,out] os The output stream.
+ * @param [in] name The base name of the resulting AttributeValue type.
+ * @param [in] seeBase Print a "see also" pointing to the base class.
  */
 void
 PrintAttributeValueSection(std::ostream& os, const std::string& name, const bool seeBase = true)
@@ -1361,10 +1347,10 @@
  *
  * This will print documentation for the \pname{AttributeValue} class and methods.
  *
- * \param [in,out] os The output stream.
- * \param [in] name The token to use in defining the accessor name.
- * \param [in] type The underlying type name.
- * \param [in] header The header file which contains this declaration.
+ * @param [in,out] os The output stream.
+ * @param [in] name The token to use in defining the accessor name.
+ * @param [in] type The underlying type name.
+ * @param [in] header The header file which contains this declaration.
  */
 void
 PrintAttributeValueWithName(std::ostream& os,
@@ -1429,8 +1415,8 @@
  *
  * This will print documentation for the \pname{Make<name>Accessor} functions.
  *
- * \param [in,out] os The output stream.
- * \param [in] name The token to use in defining the accessor name.
+ * @param [in,out] os The output stream.
+ * @param [in] name The token to use in defining the accessor name.
  */
 void
 PrintMakeAccessors(std::ostream& os, const std::string& name)
@@ -1461,9 +1447,9 @@
  *
  * This will print documentation for the \pname{Make<name>Checker} function.
  *
- * \param [in,out] os The output stream.
- * \param [in] name The token to use in defining the accessor name.
- * \param [in] header The header file which contains this declaration.
+ * @param [in,out] os The output stream.
+ * @param [in] name The token to use in defining the accessor name.
+ * @param [in] header The header file which contains this declaration.
  */
 void
 PrintMakeChecker(std::ostream& os, const std::string& name, const std::string& header)
@@ -1504,8 +1490,8 @@
  * ATTRIBUTE_HELPER_HEADER macro or
  * ATTRIBUTE_VALUE_DEFINE_WITH_NAME macro.
  *
- * \param [in,out] os The output stream.
- * \param [in] attr The AttributeDescriptor.
+ * @param [in,out] os The output stream.
+ * @param [in] attr The AttributeDescriptor.
  */
 void
 PrintAttributeHelper(std::ostream& os, const AttributeDescriptor& attr)
@@ -1519,7 +1505,7 @@
 
 /**
  * Print documentation for Attribute implementations.
- * \param os The stream to print on.
+ * @param os The stream to print on.
  */
 void
 PrintAttributeImplementations(std::ostream& os)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/utils/python-unit-tests.py ns-3.44/utils/python-unit-tests.py
--- ns-3.43/utils/python-unit-tests.py	2024-10-09 16:41:10.148656800 -0700
+++ ns-3.44/utils/python-unit-tests.py	2025-03-09 16:55:49.823372800 -0700
@@ -489,18 +489,18 @@
 
         serverApps = ns.ApplicationContainer()
         serverApps.Add(echoServer)
-        serverApps.Start(ns.Seconds(1.0))
-        serverApps.Stop(ns.Seconds(10.0))
+        serverApps.Start(ns.Seconds(1))
+        serverApps.Stop(ns.Seconds(10))
 
         address = interfaces.GetAddress(1).ConvertTo()
         echoClient = ns.UdpEchoClientHelper(address, EchoServer.ECHO_PORT)
         echoClient.SetAttribute("MaxPackets", ns.UintegerValue(10))
-        echoClient.SetAttribute("Interval", ns.TimeValue(ns.Seconds(1.0)))
+        echoClient.SetAttribute("Interval", ns.TimeValue(ns.Seconds(1)))
         echoClient.SetAttribute("PacketSize", ns.UintegerValue(101))
 
         clientApps = echoClient.Install(nodes.Get(0))
-        clientApps.Start(ns.Seconds(2.0))
-        clientApps.Stop(ns.Seconds(10.0))
+        clientApps.Start(ns.Seconds(2))
+        clientApps.Stop(ns.Seconds(10))
 
         ns.Simulator.Run()
         ns.Simulator.Destroy()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/utils/tests/gitlab-ci-code-linting.yml ns-3.44/utils/tests/gitlab-ci-code-linting.yml
--- ns-3.43/utils/tests/gitlab-ci-code-linting.yml	2024-10-09 16:41:10.148656800 -0700
+++ ns-3.44/utils/tests/gitlab-ci-code-linting.yml	2025-03-09 16:55:49.823372800 -0700
@@ -21,13 +21,13 @@
   variables:
     CLANG_FORMAT_VERSION: 17
 
-check-style-clang-format-14:
+check-style-clang-format-15:
   extends: .check-style-clang-format
   variables:
-    CLANG_FORMAT_VERSION: 14
+    CLANG_FORMAT_VERSION: 15
 
 # Clang-tidy
-clang-tidy-18:
+clang-tidy-19:
   stage: code-linting
   image: ubuntu:rolling
   variables:
@@ -38,9 +38,9 @@
     - apt update
     - DEBIAN_FRONTEND=noninteractive apt install -y
       clang cmake
-      clang-tidy clang-tidy-18
+      clang-tidy clang-tidy-19
       libboost-all-dev libeigen3-dev libgtk-3-dev libopenmpi-dev libsqlite3-dev
-      gsl-bin libgsl-dev libgsl27
+      gsl-bin libgsl-dev libgsl28
       git ssh
     - ./ns3 configure -d debug
       --enable-clang-tidy
@@ -58,13 +58,13 @@
     # File paths generated by git diff are relative to the working tree. Therefore, iregex should only contain paths relative to the working tree.
     - if [[ $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH ]] || (grep -q ".clang-tidy" $FILES_CHANGED) ; then
       echo "Running full clang-tidy" ;
-      run-clang-tidy-18 -p cmake-cache/ -quiet
+      run-clang-tidy-19 -p cmake-cache/ -quiet
       1> $CLANG_TIDY_OUTPUT
       2> /dev/null ;
       else
       echo "Running clang-tidy-diff" ;
       git diff -U0 upstream/$CI_DEFAULT_BRANCH |
-      clang-tidy-diff-18.py -path cmake-cache/ -p1 -quiet -use-color
+      clang-tidy-diff-19.py -path cmake-cache/ -p1 -quiet -use-color
       -iregex "(contrib|examples|src|scratch|utils)\/.+\.(cpp|cc|cxx|h|hpp)"
       1> $CLANG_TIDY_OUTPUT
       2> /dev/null || true ;
@@ -84,21 +84,6 @@
   interruptible: true
   timeout: 3h
 
-# Emacs line
-emacs-line:
-  stage: .pre
-  image: ubuntu:latest
-  script:
-    - if ( egrep -rn --include="*.h" --include="*.cc" --include="*.c" --include="*.py" --include="*.rst" "c-file-style:|py-indent-offset:" ) ; then
-      echo "Found Emacs lines on the above C/C++, Python and RST files" ;
-      exit 1 ;
-      else
-      echo "No Emacs lines found on C/C++, Python and RST files" ;
-      exit 0 ;
-      fi
-  timeout: 1h
-  interruptible: true
-
 # Spell checking
 spell-check:
   stage: .pre
@@ -126,7 +111,15 @@
     - pip install pyyaml cmake cmake-format ninja
   script:
     - ./ns3 configure --enable-modules=core
-    - ./ns3 build cmake-format-check
+    - |
+      if (! ./ns3 build cmake-format-check) ; then
+        echo "Bad formatting detected in CMake files.";
+        echo "To fix the formatting issues, run the following command:";
+        echo "   $ ./ns3 build cmake-format";
+        echo "Note that it requires having cmake-format installed in your system.";
+        echo "You might need to run \"./ns3 configure\" after installing it.";
+        exit 1;
+      fi
   timeout: 1h
   interruptible: true
 
@@ -148,3 +141,12 @@
 python-format-3.8:
   extends: .python-format
   image: python:3.8
+
+# Markdown lint
+markdown-lint:
+  stage: .pre
+  image: ruby:slim
+  before_script:
+    - gem install mdl
+  script:
+    - mdl -s .mdl_style.rb .
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/utils/tests/gitlab-ci-cppyy.yml ns-3.44/utils/tests/gitlab-ci-cppyy.yml
--- ns-3.43/utils/tests/gitlab-ci-cppyy.yml	2024-10-09 16:41:10.148656800 -0700
+++ ns-3.44/utils/tests/gitlab-ci-cppyy.yml	2025-03-09 16:55:49.823372800 -0700
@@ -124,16 +124,6 @@
       - wheelhouse/*.whl
     when: on_success
 
-manylinux-pip-wheel-py3.6:
-  extends: .manylinux-pip-wheel
-  variables:
-    PYTHON: "python3.6"
-
-manylinux-pip-wheel-py3.7:
-  extends: .manylinux-pip-wheel
-  variables:
-    PYTHON: "python3.7"
-
 manylinux-pip-wheel-py3.8:
   extends: .manylinux-pip-wheel
   variables:
@@ -153,3 +143,13 @@
   extends: .manylinux-pip-wheel
   variables:
     PYTHON: "python3.11"
+
+manylinux-pip-wheel-py3.12:
+  extends: .manylinux-pip-wheel
+  variables:
+    PYTHON: "python3.12"
+
+manylinux-pip-wheel-py3.13:
+  extends: .manylinux-pip-wheel
+  variables:
+    PYTHON: "python3.13"
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/utils/tests/gitlab-ci-doc.yml ns-3.44/utils/tests/gitlab-ci-doc.yml
--- ns-3.43/utils/tests/gitlab-ci-doc.yml	2024-10-09 16:41:10.148656800 -0700
+++ ns-3.44/utils/tests/gitlab-ci-doc.yml	2025-03-09 16:55:49.823372800 -0700
@@ -13,8 +13,10 @@
     # dia is archived
     - pacman --noconfirm -U https://archive.archlinux.org/packages/d/dia/dia-0.97.3-9-x86_64.pkg.tar.zst
     # temporary revert to Doxygen 1.11.0. The package has been recompiled
-    # without spdlog and wizard support to fix a library dependency.
-    - wget http://www.nsnam.org/packages/doxygen-1.11.0-4-x86_64.pkg.tar.zst
+    # without spdlog and wizard support to fix a library dependency.
+    # Clang-18 is needed by doxygen
+    - pacman -S --noconfirm clang18
+    - wget -nv http://www.nsnam.org/packages/doxygen-1.11.0-4-x86_64.pkg.tar.zst
     - pacman --noconfirm -U doxygen-1.11.0-4-x86_64.pkg.tar.zst
     # no policy is a good policy.
     - mv /etc/ImageMagick-7/policy.xml /etc/ImageMagick-7/policy.xml.bak
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/utils/tests/gitlab-ci-gcc.yml ns-3.44/utils/tests/gitlab-ci-gcc.yml
--- ns-3.43/utils/tests/gitlab-ci-gcc.yml	2024-10-09 16:41:10.148656800 -0700
+++ ns-3.44/utils/tests/gitlab-ci-gcc.yml	2025-03-09 16:55:49.823372800 -0700
@@ -6,7 +6,7 @@
 
 # We support from 10 to the latest version. Check if everything builds fine
 # under debug, default, and optimized, on Linux.
-# The distro used is Ubuntu - the logic is:
+# The distro used is Ubuntu - the logic is:
 # - Test minimum and maximum GCC version
 # - Do not test if it's the default version installed (already tested as Ubuntu test)
 # Note: the following is the list of default gcc versions on Ubuntu:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/utils/tests/gitlab-ci-ubuntu.yml ns-3.44/utils/tests/gitlab-ci-ubuntu.yml
--- ns-3.43/utils/tests/gitlab-ci-ubuntu.yml	2024-10-09 16:41:10.148656800 -0700
+++ ns-3.44/utils/tests/gitlab-ci-ubuntu.yml	2025-03-09 16:55:49.823372800 -0700
@@ -158,7 +158,7 @@
   stage: build
   variables:
     MODE: debug
-    LIBGSL: libgsl27
+    LIBGSL: libgsl28
     COMPILER: g++
 
 weekly-build-ubuntu-rolling-default:
@@ -168,7 +168,7 @@
   stage: build
   variables:
     MODE: default
-    LIBGSL: libgsl27
+    LIBGSL: libgsl28
     COMPILER: g++
 
 # Aug. 26, 2023: --disable-eigen is needed to prevent a -Werror=unused-variable
@@ -179,7 +179,7 @@
   stage: build
   variables:
     MODE: optimized
-    LIBGSL: libgsl27
+    LIBGSL: libgsl28
     COMPILER: g++
     EXTRA_OPTIONS: --disable-eigen
 
@@ -192,7 +192,7 @@
     - weekly-build-ubuntu-rolling-default
   variables:
     MODE: default
-    LIBGSL: libgsl27
+    LIBGSL: libgsl28
     COMPILER: g++
 
 # Aug. 26, 2023: --disable-eigen is needed to prevent a -Werror=unused-variable
@@ -205,6 +205,6 @@
     - weekly-build-ubuntu-rolling-optimized
   variables:
     MODE: optimized
-    LIBGSL: libgsl27
+    LIBGSL: libgsl28
     COMPILER: g++
     EXTRA_OPTIONS: --disable-eigen
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/utils/tests/README.md ns-3.44/utils/tests/README.md
--- ns-3.43/utils/tests/README.md	2024-10-09 16:41:10.148656800 -0700
+++ ns-3.44/utils/tests/README.md	2025-03-09 16:55:49.823372800 -0700
@@ -67,10 +67,10 @@
 
 To customize the path:
 
-1. Go to the project’s **Settings > CI / CD**.
-2. Expand the **General pipelines** section.
-3. Provide `utils/tests/gitlab-ci.yml` as a value in the **Custom CI configuration path** field.
-4. Click **Save changes**.
+1. Go to the project's **Settings > CI / CD**.
+1. Expand the **General pipelines** section.
+1. Provide `utils/tests/gitlab-ci.yml` as a value in the **Custom CI configuration path** field.
+1. Click **Save changes**.
 
 To perform a deeper test, you can manually run the daily or the weekly test. Go to the Gitlab interface, then enter in the CI/CD menu and select Pipelines. On the top, you can manually run a pipeline: select the branch, and add a variable `RELEASE` set to `daily` or `weekly` following your need, and then run it.
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.43/VERSION ns-3.44/VERSION
--- ns-3.43/VERSION	2024-10-09 16:41:36.356755000 -0700
+++ ns-3.44/VERSION	2025-03-09 16:56:09.315445400 -0700
@@ -1 +1 @@
-3.43
+3.44
